LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIChjKSBDb3B5cmlnaHQgMjAxMS0yMDEzIE1pY3Jvc2VtaSBTb0MgUHJvZHVjdHMgR3JvdXAuICBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIFNtYXJ0RnVzaW9uMiBNaWNyb2NvbnRyb2xsZXIgU3Vic3lzdGVtIE1NVUFSVCBiYXJlIG1ldGFsIHNvZnR3YXJlIGRyaXZlcg0KICogcHVibGljIEFQSS4NCiAqDQogKiBTVk4gJFJldmlzaW9uOiA1NjEwICQNCiAqIFNWTiAkRGF0ZTogMjAxMy0wNC0wNSAxNDoxOTozMCArMDEwMCAoRnJpLCAwNSBBcHIgMjAxMykgJA0KICovDQovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLy8qKg0KICBAbWFpbnBhZ2UgU21hcnRGdXNpb24yIE1TUyBVQVJUIEJhcmUgTWV0YWwgRHJpdmVyLg0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgQHNlY3Rpb24gaW50cm9fc2VjIEludHJvZHVjdGlvbg0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgVGhlIFNtYXJ0RnVzaW9uMiBtaWNyb2NvbnRyb2xsZXIgc3Vic3lzdGVtIChNU1MpIGluY2x1ZGVzIHR3byBtdWx0aS1tb2RlIFVBUlQNCiAgKE1NVUFSVCkgcGVyaXBoZXJhbHMgZm9yIHNlcmlhbCBjb21tdW5pY2F0aW9uLiBUaGlzIGRyaXZlciBwcm92aWRlcyBhIHNldCBvZg0KICBmdW5jdGlvbnMgZm9yIGNvbnRyb2xsaW5nIHRoZSBNU1MgTU1VQVJUcyAgYXMgcGFydCBvZiBhIGJhcmUgbWV0YWwgc3lzdGVtDQogIHdoZXJlIG5vIG9wZXJhdGluZyBzeXN0ZW0gaXMgYXZhaWxhYmxlLiBUaGVzZSBkcml2ZXJzIGNhbiBiZSBhZGFwdGVkIGZvciB1c2UNCiAgYXMgcGFydCBvZiBhbiBvcGVyYXRpbmcgc3lzdGVtLCBidXQgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhZGFwdGF0aW9uIGxheWVyDQogIGJldHdlZW4gdGhpcyBkcml2ZXIgYW5kIHRoZSBvcGVyYXRpbmcgc3lzdGVtJ3MgZHJpdmVyIG1vZGVsIGlzIG91dHNpZGUgdGhlDQogIHNjb3BlIG9mIHRoaXMgZHJpdmVyLg0KICBOb3RlOiBNU1MgVUFSVCBpcyBzeW5vbnltb3VzIHdpdGggTVNTIE1NVUFSVCBpbiB0aGlzIGRvY3VtZW50Lg0KICANCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogIEBzZWN0aW9uIGh3X2RlcGVuZGVuY2llcyBIYXJkd2FyZSBGbG93IERlcGVuZGVuY2llcw0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgVGhlIGNvbmZpZ3VyYXRpb24gb2YgYWxsIGZlYXR1cmVzIG9mIHRoZSBNU1MgTU1VQVJUIHBlcmlwaGVyYWxzIGlzIGNvdmVyZWQgYnkNCiAgdGhpcyBkcml2ZXIgd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSBTbWFydEZ1c2lvbjIgSU9NVVggY29uZmlndXJhdGlvbi4NCiAgU21hcnRGdXNpb24yIGFsbG93cyBtdWx0aXBsZSBub24tY29uY3VycmVudCB1c2VzIG9mIHNvbWUgZXh0ZXJuYWwgcGlucyB0aHJvdWdoDQogIElPTVVYIGNvbmZpZ3VyYXRpb24uIFRoaXMgZmVhdHVyZSBhbGxvd3Mgb3B0aW1pemF0aW9uIG9mIGV4dGVybmFsIHBpbiB1c2FnZSBieQ0KICBhc3NpZ25pbmcgZXh0ZXJuYWwgcGlucyBmb3IgdXNlIGJ5IGVpdGhlciB0aGUgbWljcm9jb250cm9sbGVyIHN1YnN5c3RlbSBvciB0aGUNCiAgRlBHQSBmYWJyaWMuIFRoZSBNU1MgTU1VQVJUIHNlcmlhbCBzaWduYWxzIGFyZSByb3V0ZWQgdGhyb3VnaCBJT01VWHMgdG8gdGhlDQogIFNtYXJ0RnVzaW9uMiBkZXZpY2UgZXh0ZXJuYWwgcGlucy4gVGhlIE1TUyBNTVVBUlQgc2VyaWFsIHNpZ25hbHMgbWF5IGFsc28gYmUNCiAgcm91dGVkIHRocm91Z2ggSU9NVVhzIHRvIHRoZSBTbWFydEZ1c2lvbjIgRlBHQSBmYWJyaWMuIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uDQogIElPTVVYLCByZWZlciB0byB0aGUgSU9NVVggc2VjdGlvbiBvZiB0aGUgU21hcnRGdXNpb24yIE1pY3JvY29udHJvbGxlcg0KICBTdWJzeXN0ZW0gKE1TUykgVXNlcpJzIEd1aWRlLg0KICBUaGUgSU9NVVhzIGFyZSBjb25maWd1cmVkIHVzaW5nIHRoZSBTbWFydEZ1c2lvbjIgTVNTIGNvbmZpZ3VyYXRvciB0b29sLiBZb3UNCiAgbXVzdCBlbnN1cmUgdGhhdCB0aGUgTVNTIE1NVUFSVCBwZXJpcGhlcmFscyBhcmUgZW5hYmxlZCBhbmQgY29uZmlndXJlZCBpbiB0aGUNCiAgU21hcnRGdXNpb24yIE1TUyBjb25maWd1cmF0b3IgaWYgeW91IHdpc2ggdG8gdXNlIHRoZW0uIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uDQogIElPTVVYcywgcmVmZXIgdG8gdGhlIElPTVVYIHNlY3Rpb24gb2YgdGhlIFNtYXJ0RnVzaW9uMiBNaWNyb2NvbnRyb2xsZXINCiAgU3Vic3lzdGVtIChNU1MpIFVzZXKScyBHdWlkZS4NCiAgVGhlIGJhc2UgYWRkcmVzcywgcmVnaXN0ZXIgYWRkcmVzc2VzIGFuZCBpbnRlcnJ1cHQgbnVtYmVyIGFzc2lnbm1lbnQgZm9yIHRoZQ0KICBNU1MgTU1VQVJUIHBlcmlwaGVyYWxzIGFyZSBkZWZpbmVkIGFzIGNvbnN0YW50cyBpbiB0aGUgU21hcnRGdXNpb24yIENNU0lTIEhBTC4NCiAgWW91IG11c3QgZW5zdXJlIHRoYXQgdGhlIGxhdGVzdCBTbWFydEZ1c2lvbjIgQ01TSVMgSEFMIGlzIGluY2x1ZGVkIGluIHRoZQ0KICBwcm9qZWN0IHNldHRpbmdzIG9mIHRoZSBzb2Z0d2FyZSB0b29sIGNoYWluIHVzZWQgdG8gYnVpbGQgeW91ciBwcm9qZWN0IGFuZA0KICB0aGF0IGl0IGlzIGdlbmVyYXRlZCBpbnRvIHlvdXIgcHJvamVjdC4NCiAgDQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICBAc2VjdGlvbiB0aGVvcnlfb3AgVGhlb3J5IG9mIE9wZXJhdGlvbg0KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgVGhlIE1TUyBNTVVBUlQgZHJpdmVyIGZ1bmN0aW9ucyBhcmUgZ3JvdXBlZCBpbnRvIHRoZSBmb2xsb3dpbmcgY2F0ZWdvcmllczoNCiAgICAtIEluaXRpYWxpemF0aW9uIGFuZCBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucw0KICAgIC0gUG9sbGVkIHRyYW5zbWl0IGFuZCByZWNlaXZlIGZ1bmN0aW9ucw0KICAgIC0gSW50ZXJydXB0IGRyaXZlbiB0cmFuc21pdCBhbmQgcmVjZWl2ZSBmdW5jdGlvbnMNCiAgICANCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgSW5pdGlhbGl6YXRpb24gYW5kIENvbmZpZ3VyYXRpb24NCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgVGhlIE1TUyBNTVVBUlQgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBmb3VyIGJyb2FkIG1vZGVzIG9mIG9wZXJhdGlvbjoNCiAgICAtIFVBUlQgb3IgVVNBUlQgbW9kZQ0KICAgIC0gTElOIG1vZGUNCiAgICAtIElyREEgbW9kZQ0KICAgIC0gU21hcnRjYXJkIG9yIElTTyA3ODE2IG1vZGUNCiAgVGhlIE1TUyBNTVVBUlQgZHJpdmVyIHByb3ZpZGVzIHRoZSBNU1NfVUFSVF9pbml0KCksIE1TU19VQVJUX2xpbl9pbml0KCksDQogIE1TU19VQVJUX2lyZGFfaW5pdCgpIGFuZCBNU1NfVUFSVF9zbWFydGNhcmRfaW5pdCgpIGZ1bmN0aW9ucyB0byBpbml0aWFsaXplIHRoZQ0KICBNU1MgTU1VQVJUcyBmb3Igb3BlcmF0aW9uIGluIG9uZSBvZiB0aGVzZSBtb2Rlcy4gT25lIG9mIHRoZXNlIGluaXRpYWxpemF0aW9uDQogIGZ1bmN0aW9ucyBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIE1TUyBNTVVBUlQgZHJpdmVyIGZ1bmN0aW9ucyBjYW4gYmUNCiAgY2FsbGVkLiBUaGUgTVNTIE1NVUFSVCBvcGVyYXRpbmcgbW9kZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZTsgdGhlcmVmb3JlIG9ubHkNCiAgb25lIG9mIHRoZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMgbXVzdCBiZSBjYWxsZWQuIFRoZSBmaXJzdCBwYXJhbWV0ZXIgb2YgdGhlDQogIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucyBpcyBhIHBvaW50ZXIgdG8gb25lIG9mIHR3byBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmVzDQogIHVzZWQgdG8gc3RvcmUgc3RhdGUgaW5mb3JtYXRpb24gZm9yIGVhY2ggTVNTIE1NVUFSVC4gQSBwb2ludGVyIHRvIHRoZXNlIGRhdGENCiAgc3RydWN0dXJlcyBpcyBhbHNvIHVzZWQgYXMgdGhlIGZpcnN0IHBhcmFtZXRlciB0byBtYW55IG9mIHRoZSBkcml2ZXIgZnVuY3Rpb25zDQogIHRvIGlkZW50aWZ5IHdoaWNoIE1TUyBNTVVBUlQgd2lsbCBiZSB1c2VkIGJ5IHRoZSBjYWxsZWQgZnVuY3Rpb24uIFRoZSBuYW1lcyBvZg0KICB0aGVzZSB0d28gZGF0YSBzdHJ1Y3R1cmVzIGFyZSBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEuIFRoZXJlZm9yZSwgYW55IGNhbGwNCiAgdG8gYW4gTVNTIE1NVUFSVCBmdW5jdGlvbiBzaG91bGQgYmUgb2YgdGhlIGZvcm0gDQogIE1TU19VQVJUX2Z1bmN0aW9uX25hbWUoICZnX21zc191YXJ0MCwgLi4uICkgb3INCiAgTVNTX1VBUlRfZnVuY3Rpb25fbmFtZSggJmdfbXNzX3VhcnQxLCAuLi4gKS4NCiAgDQogIFVBUlQgb3IgVVNBUlQgTW9kZQ0KICBGb3IgdGhlIFVBUlQgb3IgVVNBUlQgbW9kZXMgb2Ygb3BlcmF0aW9uLCB0aGUgTVNTIE1NVUFSVCBkcml2ZXIgaXMgaW5pdGlhbGl6ZWQNCiAgdGhyb3VnaCBhIGNhbGwgdG8gdGhlIE1TU19VQVJUX2luaXQoKSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgVUFSVJJzDQogIGNvbmZpZ3VyYXRpb24gYXMgaXRzIHBhcmFtZXRlcnMuIFRoZSBNU1NfVUFSVF9pbml0KCkgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQNCiAgYmVmb3JlIGFueSBvdGhlciBNU1MgTU1VQVJUIGRyaXZlciBmdW5jdGlvbnMgY2FuIGJlIGNhbGxlZC4NCiAgVGhlIE1TU19VQVJUX2luaXQoKSBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBiYXVkIHJhdGUgYmFzZWQgb24gdGhlIGlucHV0IGJhdWQNCiAgcmF0ZSBwYXJhbWV0ZXIgYW5kIGlmIHBvc3NpYmxlIHVzZXMgYSBmcmFjdGlvbmFsIGJhdWQgcmF0ZSBmb3IgZ3JlYXRlcg0KICBwcmVjaXNpb24uIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIExJTiwgSXJEQSBhbmQgU21hcnRDYXJkIG1vZGVzLg0KICANCiAgTElOIG1vZGUNCiAgRm9yIHRoZSBMSU4gbW9kZSBvZiBvcGVyYXRpb24sIHRoZSBNU1MgTU1VQVJUIGRyaXZlciBpcyBpbml0aWFsaXplZCB0aHJvdWdoIGENCiAgY2FsbCB0byB0aGUgTVNTX1VBUlRfbGluX2luaXQoKSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0aGUgTElOIG5vZGWScw0KICBjb25maWd1cmF0aW9uIGFzIGl0cyBwYXJhbWV0ZXJzLiBUaGUgTVNTX1VBUlRfbGluX2luaXQoKSBmdW5jdGlvbiBtdXN0IGJlDQogIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIE1TUyBNTVVBUlQgZHJpdmVyIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLiBUaGUNCiAgTVNTX1VBUlRfbGluX2luaXQoKSBmdW5jdGlvbiBjb25maWd1cmVzIHRoZSBiYXVkIHJhdGUgYmFzZWQgb24gdGhlIGlucHV0IGJhdWQNCiAgcmF0ZSBwYXJhbWV0ZXIgYW5kIGlmIHBvc3NpYmxlIHVzZXMgYSBmcmFjdGlvbmFsIGJhdWQgcmF0ZSBmb3IgZ3JlYXRlcg0KICBwcmVjaXNpb24uIFRoaXMgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIElyREEgYW5kIFNtYXJ0Q2FyZCBtb2Rlcy4NCiAgVGhlIGRyaXZlciBhbHNvIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgTElOIG1vZGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbnM6DQogICAgLSBNU1NfVUFSVF9zZXRfYnJlYWsoKQ0KICAgIC0gTVNTX1VBUlRfY2xlYXJfYnJlYWsoKQ0KICAgIC0gTVNTX1VBUlRfc2V0X3BpZHBlaV9oYW5kbGVyKCkNCiAgICAtIE1TU19VQVJUX3NldF9saW5icmVha19oYW5kbGVyKCkNCiAgICAtIE1TU19VQVJUX3NldF9saW5zeW5jX2hhbmRsZXIoKQ0KICBOb3RlOiBUaGVzZSBMSU4gbW9kZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgdGhlDQogIE1TU19VQVJUX2xpbl9pbml0KCkgZnVuY3Rpb24gaXMgY2FsbGVkLg0KICANCiAgSXJEQSBtb2RlDQogIEZvciB0aGUgSXJEQSBtb2RlIG9mIG9wZXJhdGlvbiwgdGhlIGRyaXZlciBpcyBpbml0aWFsaXplZCB0aHJvdWdoIGEgY2FsbCB0bw0KICB0aGUgTVNTX1VBUlRfaXJkYV9pbml0KCkgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIElyREEgbm9kZZJzDQogIGNvbmZpZ3VyYXRpb24gYXMgaXRzIHBhcmFtZXRlcnMuIFRoZSBNU1NfVUFSVF9pcmRhX2luaXQoKSBmdW5jdGlvbiBtdXN0IGJlDQogIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIE1TUyBNTVVBUlQgZHJpdmVyIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkLiBUaGUNCiAgTVNTX1VBUlRfaXJkYV9pbml0KCkgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgYmF1ZCByYXRlIGJhc2VkIG9uIHRoZSBpbnB1dCBiYXVkDQogIHJhdGUgcGFyYW1ldGVyIGFuZCBpZiBwb3NzaWJsZSB1c2VzIGEgZnJhY3Rpb25hbCBiYXVkIHJhdGUgZm9yIGdyZWF0ZXINCiAgcHJlY2lzaW9uLiBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIHRoZSBMSU4gYW5kIFNtYXJ0Q2FyZCBtb2Rlcy4NCiAgDQogIFNtYXJ0Y2FyZCBvciBJU08gNzgxNiBtb2RlDQogIEZvciB0aGUgU21hcnRjYXJkIG9yIElTTyA3ODE2IG1vZGUgb2Ygb3BlcmF0aW9uLCB0aGUgZHJpdmVyIGlzIGluaXRpYWxpemVkDQogIHRocm91Z2ggYSBjYWxsIHRvIHRoZSBNU1NfVUFSVF9zbWFydGNhcmRfaW5pdCgpIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHRha2VzDQogIHRoZSBzbWFydGNhcmQgY29uZmlndXJhdGlvbiBhcyBpdHMgcGFyYW1ldGVycy4gVGhlIE1TU19VQVJUX3NtYXJ0Y2FyZF9pbml0KCkNCiAgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBNU1MgTU1VQVJUIGRyaXZlciBmdW5jdGlvbnMgY2FuIGJlDQogIGNhbGxlZC4gVGhlIE1TU19VQVJUX3NtYXJ0Y2FyZF9pbml0KCkgZnVuY3Rpb24gY29uZmlndXJlcyB0aGUgYmF1ZCByYXRlIGJhc2VkDQogIG9uIHRoZSBpbnB1dCBiYXVkIHJhdGUgcGFyYW1ldGVyIGFuZCBpZiBwb3NzaWJsZSB1c2VzIGEgZnJhY3Rpb25hbCBiYXVkIHJhdGUNCiAgZm9yIGdyZWF0ZXIgcHJlY2lzaW9uLiBUaGlzIGZ1bmN0aW9uIGRpc2FibGVzIHRoZSBMSU4gYW5kIElyREEgbW9kZXMuDQogIFRoZSBkcml2ZXIgYWxzbyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIFNtYXJ0Y2FyZCBtb2RlIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zOg0KICAgIC0gTVNTX1VBUlRfZW5hYmxlX2hhbGZkdXBsZXgoKQ0KICAgIC0gTVNTX1VBUlRfZGlzYWJsZV9oYWxmZHVwbGV4KCkNCiAgICAtIE1TU19VQVJUX3NldF9uYWNrX2hhbmRsZXIoKQ0KICBOb3RlOiBUaGVzZSBTbWFydGNhcmQgbW9kZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXINCiAgdGhlIE1TU19VQVJUX3NtYXJ0Y2FyZF9pbml0KCkgZnVuY3Rpb24gaXMgY2FsbGVkLg0KICANCiAgQ29tbW9uIENvbmZpZ3VyYXRpb24gRnVuY3Rpb25zDQogIFRoZSBkcml2ZXIgYWxzbyBwcm92aWRlcyB0aGUgY29uZmlndXJhdGlvbiBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCB3aXRoIGFsbA0KICBNU1MgTU1VQVJUIG9wZXJhdGluZyBtb2Rlcy4gVGhlc2UgY29tbW9uIGNvbmZpZ3VyYXRpb24gZnVuY3Rpb25zIGFyZSBhcw0KICBmb2xsb3dzOg0KICAgIC0gTVNTX1VBUlRfc2V0X3J4X2VuZGlhbigpDQogICAgLSBNU1NfVUFSVF9zZXRfdHhfZW5kaWFuKCkNCiAgICAtIE1TU19VQVJUX2VuYWJsZV9hZmNsZWFyKCkNCiAgICAtIE1TU19VQVJUX2Rpc2FibGVfYWZjbGVhcigpDQogICAgLSBNU1NfVUFSVF9lbmFibGVfcnhfdGltZW91dCgpDQogICAgLSBNU1NfVUFSVF9kaXNhYmxlX3J4X3RpbWVvdXQoKQ0KICAgIC0gTVNTX1VBUlRfZW5hYmxlX3R4X3RpbWVfZ3VhcmQoKQ0KICAgIC0gTVNTX1VBUlRfZGlzYWJsZV90eF90aW1lX2d1YXJkKCkNCiAgICAtIE1TU19VQVJUX3NldF9hZGRyZXNzKCkNCiAgICAtIE1TU19VQVJUX3NldF9yZWFkeV9tb2RlKCkNCiAgICAtIE1TU19VQVJUX3NldF91c2FydF9tb2RlKCkNCiAgICAtIE1TU19VQVJUX3NldF9maWx0ZXJfbGVuZ3RoKCkNCiAgICAtIE1TU19VQVJUX2VuYWJsZV9hZm0oKQ0KICAgIC0gTVNTX1VBUlRfZGlzYWJsZV9hZm0oKQ0KICBOb3RlOiBUaGVzZSBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucyBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgb25lIG9mIHRoZQ0KICAgICAgICBNU1NfVUFSVF9pbml0KCksIE1TU19VQVJUX2xpbl9pbml0KCksIE1TU19VQVJUX2lyZGFfaW5pdCgpIG9yDQogICAgICAgIE1TU19VQVJUX3NtYXJ0Y2FyZF9pbml0KCkgZnVuY3Rpb25zIGlzIGNhbGxlZC4NCiAgDQogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICANCiAgUG9sbGVkIFRyYW5zbWl0IGFuZCBSZWNlaXZlIE9wZXJhdGlvbnMNCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgVGhlIGRyaXZlciBjYW4gYmUgdXNlZCB0byB0cmFuc21pdCBhbmQgcmVjZWl2ZSBkYXRhIG9uY2UgaW5pdGlhbGl6ZWQuIA0KICBEYXRhIGlzIHRyYW5zbWl0dGVkIHVzaW5nIHRoZSBNU1NfVUFSVF9wb2xsZWRfdHgoKSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcw0KICBibG9ja2luZywgbWVhbmluZyB0aGF0IGl0IHdpbGwgb25seSByZXR1cm4gb25jZSB0aGUgZGF0YSBwYXNzZWQgdG8gdGhlDQogIGZ1bmN0aW9uIGhhcyBiZWVuIHNlbnQgdG8gdGhlIE1TUyBNTVVBUlQgaGFyZHdhcmUgdHJhbnNtaXR0ZXIuIERhdGEgcmVjZWl2ZWQNCiAgYnkgdGhlIE1TUyBNTVVBUlQgaGFyZHdhcmUgcmVjZWl2ZXIgY2FuIGJlIHJlYWQgYnkgdGhlIE1TU19VQVJUX2dldF9yeCgpDQogIGZ1bmN0aW9uLg0KICBUaGUgTVNTX1VBUlRfcG9sbGVkX3R4X3N0cmluZygpIGZ1bmN0aW9uIGlzIHByb3ZpZGVkIHRvIHRyYW5zbWl0IGEgTlVMTCAokVwwkikNCiAgdGVybWluYXRlZCBzdHJpbmcgaW4gcG9sbGVkIG1vZGUuIFRoaXMgZnVuY3Rpb24gaXMgYmxvY2tpbmcsIG1lYW5pbmcgdGhhdCBpdA0KICB3aWxsIG9ubHkgcmV0dXJuIG9uY2UgdGhlIGRhdGEgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbiBoYXMgYmVlbiBzZW50IHRvIHRoZSBNU1MNCiAgTU1VQVJUIGhhcmR3YXJlIHRyYW5zbWl0dGVyLg0KICBUaGUgTVNTX1VBUlRfZmlsbF90eF9maWZvKCkgZnVuY3Rpb24gZmlsbHMgdGhlIE1TUyBNTVVBUlQgaGFyZHdhcmUgdHJhbnNtaXQNCiAgRklGTyB3aXRoIGRhdGEgZnJvbSBhIGJ1ZmZlciBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgYW5kIHJldHVybnMgdGhlIG51bWJlciBvZg0KICBieXRlcyB0cmFuc2ZlcnJlZCB0byB0aGUgRklGTy4gSWYgdGhlIHRyYW5zbWl0IEZJRk8gaXMgbm90IGVtcHR5IHdoZW4gdGhlDQogIE1TU19VQVJUX2ZpbGxfdHhfZmlmbygpIGZ1bmN0aW9uIGlzIGNhbGxlZCBpdCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGhvdXQNCiAgdHJhbnNmZXJyaW5nIGFueSBkYXRhIHRvIHRoZSBGSUZPLg0KICANCiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIEludGVycnVwdCBEcml2ZW4gT3BlcmF0aW9ucw0KICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgVGhlIGRyaXZlciBjYW4gYWxzbyB0cmFuc21pdCBvciByZWNlaXZlIGRhdGEgdW5kZXIgaW50ZXJydXB0IGNvbnRyb2wsIGZyZWVpbmcNCiAgeW91ciBhcHBsaWNhdGlvbiB0byBwZXJmb3JtIG90aGVyIHRhc2tzIHVudGlsIGFuIGludGVycnVwdCBvY2N1cnMgaW5kaWNhdGluZw0KICB0aGF0IHRoZSBkcml2ZXKScyBhdHRlbnRpb24gaXMgcmVxdWlyZWQuDQogIA0KICBJbnRlcnJ1cHQgSGFuZGxlcnMNCiAgVGhlIE1TUyBNTVVBUlQgZHJpdmVyIHN1cHBvcnRzIGFsbCB0eXBlcyBvZiBpbnRlcnJ1cHQgdHJpZ2dlcmVkIGJ5IHRoZSBNU1MNCiAgTU1VQVJULiBUaGUgZHJpdmVyknMgaW50ZXJuYWwgdG9wIGxldmVsIGludGVycnVwdCBoYW5kbGVyIGlkZW50aWZpZXMgdGhlDQogIHNvdXJjZSBvZiB0aGUgTVNTIE1NVUFSVCBpbnRlcnJ1cHQgYW5kIGNhbGxzIHRoZSBjb3JyZXNwb25kaW5nIGxvd2VyIGxldmVsDQogIGhhbmRsZXIgZnVuY3Rpb24gdGhhdCB5b3UgcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggdGhlIGRyaXZlciB0aHJvdWdoIGNhbGxzDQogIHRvIHRoZSBNU1NfVUFSVF9zZXRfcnhfaGFuZGxlcigpLCBNU1NfVUFSVF9zZXRfdHhfaGFuZGxlcigpLA0KICBNU1NfVUFSVF9zZXRfcnhzdGF0dXNfaGFuZGxlcigpLCBhbmQgTVNTX1VBUlRfc2V0X21vZGVtc3RhdHVzX2hhbmRsZXIoKQ0KICBmdW5jdGlvbnMuIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRoZXNlIGxvd2VyIGxldmVsIGludGVycnVwdA0KICBoYW5kbGVycyBhcyBwYXJ0IG9mIHlvdXIgYXBwbGljYXRpb24gcHJvZ3JhbSBhbmQgcmVnaXN0ZXJpbmcgdGhlbSB3aXRoIHRoZQ0KICBkcml2ZXIuDQogIE5vdGU6IFRoZSBTbWFydEZ1c2lvbjIgQ01TSVMtUEFMIGRlZmluZXMgdGhlIFVBUlQwX0lSUUhhbmRsZXIoKSBhbmQNCiAgICAgICAgVUFSVDFfSVJRSGFuZGxlcigpIGZ1bmN0aW9ucyAod2l0aCB3ZWFrIGxpbmthZ2UpIGFuZCBhc3NpZ25zIHRoZW0gYXMgdGhlDQogICAgICAgIGludGVycnVwdCBzZXJ2aWNlIHJvdXRpbmVzIChJU1IpIGZvciB0aGUgTVNTIE1NVUFSVCBpbnRlcnJ1cHQgaW5wdXRzIHRvDQogICAgICAgIHRoZSBDb3J0ZXgtTTMgTlZJQy4gVGhlIE1TUyBNTVVBUlQgZHJpdmVyIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbg0KICAgICAgICBmdW5jdGlvbnMgZm9yIGJvdGggb2YgdGhlc2UgSVNScyBmcm9tIHdoaWNoIGl0IGNhbGxzIGl0cyBvd24gaW50ZXJuYWwNCiAgICAgICAgdG9wIGxldmVsLCBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbi4NCiAgVGhlIE1TU19VQVJUX2VuYWJsZV9pcnEoKSBhbmQgTVNTX1VBUlRfZGlzYWJsZV9pcnEoKSBmdW5jdGlvbnMgYXJlIHVzZWQgdG8NCiAgZW5hYmxlIG9yIGRpc2FibGUgdGhlIHJlY2VpdmVkIGxpbmUgc3RhdHVzLCByZWNlaXZlZCBkYXRhIGF2YWlsYWJsZS9jaGFyYWN0ZXINCiAgdGltZW91dCwgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBlbXB0eSBhbmQgbW9kZW0gc3RhdHVzIGludGVycnVwdHMgYXQgdGhlDQogIE1TUyBNTVVBUlQgbGV2ZWwuIFRoZSBNU1NfVUFSVF9lbmFibGVfaXJxKCkgZnVuY3Rpb24gYWxzbyBlbmFibGVzIHRoZSBNU1MNCiAgTU1VQVJUIGluc3RhbmNlIGludGVycnVwdCBhdCB0aGUgQ29ydGV4LU0zIGxldmVsLg0KICANCiAgVHJhbnNtaXR0aW5nIERhdGENCiAgSW50ZXJydXB0LWRyaXZlbiB0cmFuc21pdCBpcyBpbml0aWF0ZWQgYnkgYSBjYWxsIHRvIE1TU19VQVJUX2lycV90eCgpLA0KICBzcGVjaWZ5aW5nIHRoZSBibG9jayBvZiBkYXRhIHRvIHRyYW5zbWl0LiBZb3VyIGFwcGxpY2F0aW9uIGlzIHRoZW4gZnJlZSB0bw0KICBwZXJmb3JtIG90aGVyIHRhc2tzIGFuZCBpbnF1aXJlIGxhdGVyIHdoZXRoZXIgdHJhbnNtaXQgaGFzIGNvbXBsZXRlZCBieQ0KICBjYWxsaW5nIHRoZSBNU1NfVUFSVF90eF9jb21wbGV0ZSgpIGZ1bmN0aW9uLiBUaGUgTVNTX1VBUlRfaXJxX3R4KCkgZnVuY3Rpb24NCiAgZW5hYmxlcyB0aGUgVUFSVJJzIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgKFRIUkUpIGludGVycnVwdCBhbmQgdGhlbiwNCiAgd2hlbiB0aGUgaW50ZXJydXB0IGdvZXMgYWN0aXZlLCB0aGUgZHJpdmVyknMgZGVmYXVsdCBUSFJFIGludGVycnVwdCBoYW5kbGVyDQogIHRyYW5zZmVycyB0aGUgZGF0YSBibG9jayB0byB0aGUgVUFSVCB1bnRpbCB0aGUgZW50aXJlIGJsb2NrIGlzIHRyYW5zbWl0dGVkLg0KICBOb3RlOiBZb3UgY2FuIHVzZSB0aGUgTVNTX1VBUlRfc2V0X3R4X2hhbmRsZXIoKSBmdW5jdGlvbiB0byBhc3NpZ24gYW4NCiAgICAgICAgYWx0ZXJuYXRpdmUgaGFuZGxlciB0byB0aGUgVEhSRSBpbnRlcnJ1cHQuIEluIHRoaXMgY2FzZSwgeW91IG11c3Qgbm90DQogICAgICAgIHVzZSB0aGUgTVNTX1VBUlRfaXJxX3R4KCkgZnVuY3Rpb24gdG8gaW5pdGlhdGUgdGhlIHRyYW5zbWl0LCBhcyB0aGlzDQogICAgICAgIHdpbGwgcmUtYXNzaWduIHRoZSBkcml2ZXKScyBkZWZhdWx0IFRIUkUgaW50ZXJydXB0IGhhbmRsZXIgdG8gdGhlIFRIUkUNCiAgICAgICAgaW50ZXJydXB0LiBJbnN0ZWFkLCB5b3VyIGFsdGVybmF0aXZlIFRIUkUgaW50ZXJydXB0IGhhbmRsZXIgbXVzdCBpbmNsdWRlDQogICAgICAgIGEgY2FsbCB0byB0aGUgTVNTX1VBUlRfZmlsbF90eF9maWZvKCkgZnVuY3Rpb24gdG8gdHJhbnNmZXIgdGhlIGRhdGEgdG8NCiAgICAgICAgdGhlIFVBUlQuDQogIA0KICBSZWNlaXZpbmcgRGF0YQ0KICBJbnRlcnJ1cHQtZHJpdmVuIHJlY2VpdmUgaXMgcGVyZm9ybWVkIGJ5IGZpcnN0IGNhbGxpbmcNCiAgTVNTX1VBUlRfc2V0X3J4X2hhbmRsZXIoKSB0byByZWdpc3RlciBhIHJlY2VpdmUgaGFuZGxlciBmdW5jdGlvbiB0aGF0IHdpbGwgYmUNCiAgY2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbmV2ZXIgcmVjZWl2ZSBkYXRhIGlzIGF2YWlsYWJsZS4gWW91IG11c3QgcHJvdmlkZSB0aGlzDQogIHJlY2VpdmUgaGFuZGxlciBmdW5jdGlvbiB3aGljaCBtdXN0IGluY2x1ZGUgYSBjYWxsIHRvIHRoZSBNU1NfVUFSVF9nZXRfcngoKQ0KICBmdW5jdGlvbiB0byBhY3R1YWxseSByZWFkIHRoZSByZWNlaXZlZCBkYXRhLg0KICANCiAgLS0tLS0tLS0tLS0NCiAgVUFSVCBTdGF0dXMNCiAgLS0tLS0tLS0tLS0NCiAgVGhlIGZ1bmN0aW9uIE1TU19VQVJUX2dldF9yeF9zdGF0dXMoKSBpcyB1c2VkIHRvIHJlYWQgdGhlIHJlY2VpdmVyIGVycm9yDQogIHN0YXR1cy4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBvdmVycnVuLCBwYXJpdHksIGZyYW1pbmcsIGJyZWFrLCBhbmQgRklGTw0KICBlcnJvciBzdGF0dXMgb2YgdGhlIHJlY2VpdmVyLg0KICBUaGUgZnVuY3Rpb24gTVNTX1VBUlRfZ2V0X3R4X3N0YXR1cygpIGlzIHVzZWQgdG8gcmVhZCB0aGUgdHJhbnNtaXR0ZXIgc3RhdHVzLg0KICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHRyYW5zbWl0IGVtcHR5IChURU1UKSBhbmQgdHJhbnNtaXQgaG9sZGluZyByZWdpc3Rlcg0KICBlbXB0eSAoVEhSRSkgc3RhdHVzIG9mIHRoZSB0cmFuc21pdHRlci4NCiAgVGhlIGZ1bmN0aW9uIE1TU19VQVJUX2dldF9tb2RlbV9zdGF0dXMoKSBpcyB1c2VkIHRvIHJlYWQgdGhlIG1vZGVtIHN0YXR1cw0KICBmbGFncy4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBtb2RlbSBzdGF0dXMgcmVnaXN0ZXIuDQogIA0KICAtLS0tLS0tLQ0KICBMb29wYmFjaw0KICAtLS0tLS0tLQ0KICBUaGUgTVNTX1VBUlRfc2V0X2xvb3BiYWNrKCkgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gbG9jYWxseSBsb29wYmFjayB0aGUgVHgNCiAgYW5kIFJ4IGxpbmVzIG9mIGEgVUFSVC4gVGhpcyBpcyBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCB0aGUgbG9vcGJhY2sgb2YgVUFSVDANCiAgdG8gVUFSVDEsIHdoaWNoIGNhbiBiZSBhY2hpZXZlZCB0aHJvdWdoIHRoZSBtaWNyb2NvbnRyb2xsZXIgc3Vic3lzdGVtknMgc3lzdGVtDQogIHJlZ2lzdGVycy4NCiAgDQogKi8vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLw0KI2lmbmRlZiBfX01TU19VQVJUX0hfDQojZGVmaW5lIF9fTVNTX1VBUlRfSF8gMQ0KDQojaW5jbHVkZSAiLi4vLi4vQ01TSVMvbTJzeHh4LmgiDQojaW5jbHVkZSA8c3RkZGVmLmg+DQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KZXh0ZXJuICJDIiB7DQojZW5kaWYNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgQmF1ZCByYXRlcw0KICBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSB1c2VkIHRvIHNwZWNpZnkgc3RhbmRhcmQgYmF1ZCByYXRlcyBhcyBhDQogIHBhcmFtZXRlciB0byB0aGUgTVNTX1VBUlRfaW5pdCgpIGZ1bmN0aW9uLg0KICovDQojZGVmaW5lIE1TU19VQVJUXzExMF9CQVVEICAgICAgIDExMA0KI2RlZmluZSBNU1NfVUFSVF8zMDBfQkFVRCAgICAgICAzMDANCiNkZWZpbmUgTVNTX1VBUlRfMTIwMF9CQVVEICAgICAgMTIwMA0KI2RlZmluZSBNU1NfVUFSVF8yNDAwX0JBVUQgICAgICAyNDAwDQojZGVmaW5lIE1TU19VQVJUXzQ4MDBfQkFVRCAgICAgIDQ4MDANCiNkZWZpbmUgTVNTX1VBUlRfOTYwMF9CQVVEICAgICAgOTYwMA0KI2RlZmluZSBNU1NfVUFSVF8xOTIwMF9CQVVEICAgICAxOTIwMA0KI2RlZmluZSBNU1NfVUFSVF8zODQwMF9CQVVEICAgICAzODQwMA0KI2RlZmluZSBNU1NfVUFSVF81NzYwMF9CQVVEICAgICA1NzYwMA0KI2RlZmluZSBNU1NfVUFSVF8xMTUyMDBfQkFVRCAgICAxMTUyMDANCiNkZWZpbmUgTVNTX1VBUlRfMjMwNDAwX0JBVUQgICAgMjMwNDAwDQojZGVmaW5lIE1TU19VQVJUXzQ2MDgwMF9CQVVEICAgIDQ2MDgwMA0KI2RlZmluZSBNU1NfVUFSVF85MjE2MDBfQkFVRCAgICA5MjE2MDANCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgRGF0YSBCaXRzIExlbmd0aA0KICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIHVzZWQgdG8gYnVpbGQgdGhlIHZhbHVlIG9mIHRoZSBNU1NfVUFSVF9pbml0KCkNCiAgZnVuY3Rpb24gbGluZV9jb25maWcgcGFyYW1ldGVyLg0KICovDQojZGVmaW5lIE1TU19VQVJUX0RBVEFfNV9CSVRTICAgICAoICh1aW50OF90KSAweDAwICkNCiNkZWZpbmUgTVNTX1VBUlRfREFUQV82X0JJVFMgICAgICggKHVpbnQ4X3QpIDB4MDEgKQ0KI2RlZmluZSBNU1NfVUFSVF9EQVRBXzdfQklUUyAgICAgKCAodWludDhfdCkgMHgwMiApDQojZGVmaW5lIE1TU19VQVJUX0RBVEFfOF9CSVRTICAgICAoICh1aW50OF90KSAweDAzICkNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgUGFyaXR5DQogIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyBhcmUgdXNlZCB0byBidWlsZCB0aGUgdmFsdWUgb2YgdGhlIE1TU19VQVJUX2luaXQoKQ0KICBmdW5jdGlvbiBsaW5lX2NvbmZpZyBwYXJhbWV0ZXIuDQogKi8NCiNkZWZpbmUgTVNTX1VBUlRfTk9fUEFSSVRZICAgICAgICAgICAoICh1aW50OF90KSAweDAwICkNCiNkZWZpbmUgTVNTX1VBUlRfT0REX1BBUklUWSAgICAgICAgICAoICh1aW50OF90KSAweDA4ICkNCiNkZWZpbmUgTVNTX1VBUlRfRVZFTl9QQVJJVFkgICAgICAgICAoICh1aW50OF90KSAweDE4ICkNCiNkZWZpbmUgTVNTX1VBUlRfU1RJQ0tfUEFSSVRZXzAgICAgICAoICh1aW50OF90KSAweDM4ICkNCiNkZWZpbmUgTVNTX1VBUlRfU1RJQ0tfUEFSSVRZXzEgICAgICAoICh1aW50OF90KSAweDI4ICkNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgTnVtYmVyIG9mIFN0b3AgQml0cw0KICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIHVzZWQgdG8gYnVpbGQgdGhlIHZhbHVlIG9mIHRoZSBNU1NfVUFSVF9pbml0KCkNCiAgZnVuY3Rpb24gbGluZV9jb25maWcgcGFyYW1ldGVyLg0KICovDQojZGVmaW5lIE1TU19VQVJUX09ORV9TVE9QX0JJVCAgICAgICAgKCAodWludDhfdCkgMHgwMCApDQojZGVmaW5lIE1TU19VQVJUX09ORUhBTEZfU1RPUF9CSVQgICAgKCAodWludDhfdCkgMHgwNCApDQojZGVmaW5lIE1TU19VQVJUX1RXT19TVE9QX0JJVFMgICAgICAgKCAodWludDhfdCkgMHgwNCApDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFJlY2VpdmVyIEVycm9yIFN0YXR1cw0KICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBVQVJUIHJlY2VpdmVyIGVycm9yIHR5cGUuDQogIFRoZXNlIGJpdCBtYXNrIGNvbnN0YW50cyBhcmUgdXNlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlDQogIE1TU19VQVJUX2dldF9yeF9zdGF0dXMoKSBmdW5jdGlvbiB0byBmaW5kIG91dCBpZiBhbnkgZXJyb3JzIG9jY3VycmVkIHdoaWxlDQogIHJlY2VpdmluZyBkYXRhLg0KICovDQojZGVmaW5lIE1TU19VQVJUX0lOVkFMSURfUEFSQU0gICAgKCAodWludDhfdCkweEZGICkNCiNkZWZpbmUgTVNTX1VBUlRfTk9fRVJST1IgICAgICAgICAoICh1aW50OF90KTB4MDAgKQ0KI2RlZmluZSBNU1NfVUFSVF9PVkVSVU5fRVJST1IgICAgICggKHVpbnQ4X3QpMHgwMiApDQojZGVmaW5lIE1TU19VQVJUX1BBUklUWV9FUlJPUiAgICAgKCAodWludDhfdCkweDA0ICkNCiNkZWZpbmUgTVNTX1VBUlRfRlJBTUlOR19FUlJPUiAgICAoICh1aW50OF90KTB4MDggKQ0KI2RlZmluZSBNU1NfVUFSVF9CUkVBS19FUlJPUiAgICAgICggKHVpbnQ4X3QpMHgxMCApDQojZGVmaW5lIE1TU19VQVJUX0ZJRk9fRVJST1IgICAgICAgKCAodWludDhfdCkweDgwICkNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVHJhbnNtaXR0ZXIgU3RhdHVzDQogIFRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBVQVJUIHRyYW5zbWl0dGVyIHN0YXR1cy4NCiAgVGhlc2UgYml0IG1hc2sgY29uc3RhbnRzIGFyZSB1c2VkIHdpdGggdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUNCiAgTVNTX1VBUlRfZ2V0X3R4X3N0YXR1cygpIGZ1bmN0aW9uIHRvIGZpbmQgb3V0IHRoZSBzdGF0dXMgb2YgdGhlIHRyYW5zbWl0dGVyLg0KICovDQojZGVmaW5lIE1TU19VQVJUX1RYX0JVU1kgICAgICAgICAgKCAodWludDhfdCkgMHgwMCApDQojZGVmaW5lIE1TU19VQVJUX1RIUkUgICAgICAgICAgICAgKCAodWludDhfdCkgMHgyMCApDQojZGVmaW5lIE1TU19VQVJUX1RFTVQgICAgICAgICAgICAgKCAodWludDhfdCkgMHg0MCApDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIE1vZGVtIFN0YXR1cw0KICBUaGUgZm9sbG93aW5nIGRlZmluZXMgYXJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBtb2RlbSBzdGF0dXMuIFRoZXNlIGJpdA0KICBtYXNrIGNvbnN0YW50cyBhcmUgdXNlZCB3aXRoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlDQogIE1TU19VQVJUX2dldF9tb2RlbV9zdGF0dXMoKSBmdW5jdGlvbiB0byBmaW5kIG91dCB0aGUgbW9kZW0gc3RhdHVzIG9mDQogIHRoZSBVQVJULg0KICovDQojZGVmaW5lIE1TU19VQVJUX0RDVFMgICAgICAgICAgICAgKCAodWludDhfdCkgMHgwMSApDQojZGVmaW5lIE1TU19VQVJUX0REU1IgICAgICAgICAgICAgKCAodWludDhfdCkgMHgwMiApDQojZGVmaW5lIE1TU19VQVJUX1RFUkkgICAgICAgICAgICAgKCAodWludDhfdCkgMHgwNCApDQojZGVmaW5lIE1TU19VQVJUX0REQ0QgICAgICAgICAgICAgKCAodWludDhfdCkgMHgwOCApDQojZGVmaW5lIE1TU19VQVJUX0NUUyAgICAgICAgICAgICAgKCAodWludDhfdCkgMHgxMCApDQojZGVmaW5lIE1TU19VQVJUX0RTUiAgICAgICAgICAgICAgKCAodWludDhfdCkgMHgyMCApDQojZGVmaW5lIE1TU19VQVJUX1JJICAgICAgICAgICAgICAgKCAodWludDhfdCkgMHg0MCApDQojZGVmaW5lIE1TU19VQVJUX0RDRCAgICAgICAgICAgICAgKCAodWludDhfdCkgMHg4MCApDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoaXMgdHlwZWRlZiBzcGVjaWZpZXMgdGhlIGlycV9tYXNrIHBhcmFtZXRlciBmb3IgdGhlIE1TU19VQVJUX2VuYWJsZV9pcnEoKQ0KICBhbmQgTVNTX1VBUlRfZGlzYWJsZV9pcnEoKSBmdW5jdGlvbnMuIFRoZSBkcml2ZXIgZGVmaW5lcyBhIHNldCBvZiBiaXQgbWFza3MNCiAgdGhhdCBhcmUgdXNlZCB0byBidWlsZCB0aGUgdmFsdWUgb2YgdGhlIGlycV9tYXNrIHBhcmFtZXRlci4gQSBiaXR3aXNlIE9SIG9mDQogIHRoZXNlIGJpdCBtYXNrcyBpcyB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIG11bHRpcGxlIE1TUyBNTVVBUlQgaW50ZXJydXB0cy4NCiAqLw0KdHlwZWRlZiB1aW50MTZfdCBtc3NfdWFydF9pcnFfdDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIGZvbGxvd2luZyBkZWZpbmVzIHNwZWNpZnkgdGhlIGludGVycnVwdCBtYXNrcyB0byBlbmFibGUgYW5kIGRpc2FibGUgTVNTDQogIE1NVUFSVCBpbnRlcnJ1cHRzLiBUaGV5IGFyZSB1c2VkIHRvIGJ1aWxkIHRoZSB2YWx1ZSBvZiB0aGUgaXJxX21hc2sgcGFyYW1ldGVyDQogIGZvciB0aGUgTVNTX1VBUlRfZW5hYmxlX2lycSgpIGFuZCBNU1NfVUFSVF9kaXNhYmxlX2lycSgpIGZ1bmN0aW9ucy4gQSBiaXR3aXNlDQogIE9SIG9mIHRoZXNlIGNvbnN0YW50cyBpcyB1c2VkIHRvIGVuYWJsZSBvciBkaXNhYmxlIG11bHRpcGxlIGludGVycnVwdHMuDQogKi8NCiNkZWZpbmUgTVNTX1VBUlRfUkJGX0lSUSAgICAgICAgMHgwMDENCiNkZWZpbmUgTVNTX1VBUlRfVEJFX0lSUSAgICAgICAgMHgwMDINCiNkZWZpbmUgTVNTX1VBUlRfTFNfSVJRICAgICAgICAgMHgwMDQNCiNkZWZpbmUgTVNTX1VBUlRfTVNfSVJRICAgICAgICAgMHgwMDgNCiNkZWZpbmUgTVNTX1VBUlRfUlRPX0lSUSAgICAgICAgMHgwMTANCiNkZWZpbmUgTVNTX1VBUlRfTkFDS19JUlEgICAgICAgMHgwMjANCiNkZWZpbmUgTVNTX1VBUlRfUElEUEVfSVJRICAgICAgMHgwNDANCiNkZWZpbmUgTVNTX1VBUlRfTElOQl9JUlEgICAgICAgMHgwODANCiNkZWZpbmUgTVNTX1VBUlRfTElOU19JUlEgICAgICAgMHgxMDANCiNkZWZpbmUgTVNTX1VBUlRfSU5WQUxJRF9JUlEgICAgVUlOVDE2X01BWA0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGlzIGVudW1lcmF0aW9uIHNwZWNpZmllcyB0aGUgcmVjZWl2ZXIgRklGTyB0cmlnZ2VyIGxldmVsLiBUaGlzIGlzIHRoZSBudW1iZXINCiAgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIHJlY2VpdmVkIGJlZm9yZSB0aGUgVUFSVCBnZW5lcmF0ZXMgYSByZWNlaXZlIGRhdGENCiAgYXZhaWxhYmxlIGludGVycnVwdC4gSXQgcHJvdmlkZXMgdGhlIGFsbG93ZWQgdmFsdWVzIGZvciB0aGUNCiAgTVNTX1VBUlRfc2V0X3J4X2hhbmRsZXIoKSBmdW5jdGlvbiB0cmlnZ2VyX2xldmVsIHBhcmFtZXRlci4NCiAqLw0KdHlwZWRlZiBlbnVtIHsNCiAgICBNU1NfVUFSVF9GSUZPX1NJTkdMRV9CWVRFICAgID0gMHgwMCwNCiAgICBNU1NfVUFSVF9GSUZPX0ZPVVJfQllURVMgICAgID0gMHg0MCwNCiAgICBNU1NfVUFSVF9GSUZPX0VJR0hUX0JZVEVTICAgID0gMHg4MCwNCiAgICBNU1NfVUFSVF9GSUZPX0ZPVVJURUVOX0JZVEVTID0gMHhDMCwNCiAgICBNU1NfVUFSVF9GSUZPX0lOVkFMSURfVFJJR19MRVZFTA0KfSBtc3NfdWFydF9yeF90cmlnX2xldmVsX3Q7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoaXMgZW51bWVyYXRpb24gc3BlY2lmaWVzIHRoZSBsb29wYmFjayBjb25maWd1cmF0aW9uIG9mIHRoZSBVQVJULiBJdCBwcm92aWRlcw0KICB0aGUgYWxsb3dlZCB2YWx1ZXMgZm9yIHRoZSBNU1NfVUFSVF9zZXRfbG9vcGJhY2soKSBmdW5jdGlvbpJzIGxvb3BiYWNrDQogIHBhcmFtZXRlci4gVXNlIE1TU19VQVJUX0xPQ0FMX0xPT1BCQUNLX09OIHRvIHNldCB1cCB0aGUgVUFSVCB0byBsb2NhbGx5DQogIGxvb3BiYWNrIGl0cyBUeCBhbmQgUnggbGluZXMuIFVzZSBNU1NfVUFSVF9SRU1PVEVfTE9PUEJBQ0tfT04gdG8gc2V0IHVwIHRoZQ0KICBVQVJUIGluIHJlbW90ZSBsb29wYmFjayBtb2RlLg0KICovDQp0eXBlZGVmIGVudW0gew0KICAgIE1TU19VQVJUX0xPQ0FMX0xPT1BCQUNLX09GRiwNCiAgICBNU1NfVUFSVF9MT0NBTF9MT09QQkFDS19PTiwNCiAgICBNU1NfVUFSVF9SRU1PVEVfTE9PUEJBQ0tfT0ZGLA0KICAgIE1TU19VQVJUX1JFTU9URV9MT09QQkFDS19PTiwNCiAgICBNU1NfVUFSVF9BVVRPX0VDSE9fT0ZGLA0KICAgIE1TU19VQVJUX0FVVE9fRUNIT19PTiwNCiAgICBNU1NfVUFSVF9JTlZBTElEX0xPT1BCQUNLDQp9IG1zc191YXJ0X2xvb3BiYWNrX3Q7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIElyREEgaW5wdXQgLyBvdXRwdXQgcG9sYXJpdHkuDQogIFRoaXMgZW51bWVyYXRpb24gc3BlY2lmaWVzIHRoZSBSWkkgbW9kZW0gcG9sYXJpdHkgZm9yIGlucHV0IGFuZCBvdXRwdXQgc2lnbmFscy4gDQogIFRoaXMgaXMgcGFzc2VkIGFzIHBhcmFtZXRlcnMgaW4gTVNTX1VBUlRfaXJkYV9pbml0KCkgZnVuY3Rpb24uDQogKi8NCnR5cGVkZWYgZW51bSB7DQogICAgTVNTX1VBUlRfQUNUSVZFX0xPVyA9IDB1LA0KICAgIE1TU19VQVJUX0FDVElWRV9ISUdIID0gMXUsDQogICAgTVNTX1VBUlRfSU5WQUxJRF9QT0xBUklUWQ0KfSBtc3NfdWFydF9yemlfcG9sYXJpdHlfdDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgSXJEQSBpbnB1dCAvIG91dHB1dCBwdWxzZSB3aWR0aC4NCiAgVGhpcyBlbnVtZXJhdGlvbiBzcGVjaWZpZXMgdGhlIFJaSSBtb2RlbSBwdWxzZSB3aWR0aCBmb3IgaW5wdXQgYW5kIG91dHB1dCBzaWduYWxzLiANCiAgVGhpcyBpcyBwYXNzZWQgYXMgcGFyYW1ldGVycyBpbiBNU1NfVUFSVF9pcmRhX2luaXQoKSBmdW5jdGlvbi4NCiAqLw0KdHlwZWRlZiBlbnVtIHsNCiAgICBNU1NfVUFSVF8zX0JZXzE2ID0gMHUsDQogICAgTVNTX1VBUlRfMV9CWV80ID0gMXUsDQogICAgTVNTX1VBUlRfSU5WQUxJRF9QVw0KfSBtc3NfdWFydF9yemlfcHVsc2V3aWR0aF90Ow0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUeCAvIFJ4IGVuZGlhbmVzcy4NCiAgVGhpcyBlbnVtZXJhdGlvbiBzcGVjaWZpZXMgdGhlIE1TQiBmaXJzdCBvciBMU0IgZmlyc3QgZm9yIE1TUyBVQVJUIHRyYW5zbWl0dGVyIA0KICBhbmQgcmVjZWl2ZXIuIFRoZSBwYXJhbWV0ZXIgb2YgdGhpcyB0eXBlIHNoYWxsIGJlIHBhc3NlZCBpbiANCiAgTVNTX1VBUlRfc2V0X3J4X2VuZGlhbigpYW5kIE1TU19VQVJUX3NldF90eF9lbmRpYW4oKSBmdW5jdGlvbnMuDQogKi8NCnR5cGVkZWYgZW51bSB7DQogICAgTVNTX1VBUlRfTElUVExFRU5ELA0KICAgIE1TU19VQVJUX0JJR0VORCwNCiAgICBNU1NfVUFSVF9JTlZBTElEX0VORElBTg0KfSBtc3NfdWFydF9lbmRpYW5fdDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgR2xpdGNoIGZpbHRlciBsZW5ndGguDQogIFRoaXMgZW51bWVyYXRpb24gc3BlY2lmaWVzIHRoZSBnbGl0Y2ggZmlsdGVyIGxlbmd0aC4gVGhlIGZ1bmN0aW9uIA0KICBNU1NfVUFSVF9zZXRfZmlsdGVyX2xlbmd0aCgpIGFjY2VwdHMgdGhlIHBhcmFtZXRlciBvZiB0aGlzIHR5cGUuDQogKi8NCnR5cGVkZWYgZW51bSB7DQogICAgTVNTX1VBUlRfTEVOMCA9IDAsDQogICAgTVNTX1VBUlRfTEVOMSA9IDEsDQogICAgTVNTX1VBUlRfTEVOMiA9IDIsDQogICAgTVNTX1VBUlRfTEVOMyA9IDMsDQogICAgTVNTX1VBUlRfTEVONCA9IDQsDQogICAgTVNTX1VBUlRfTEVONSA9IDUsDQogICAgTVNTX1VBUlRfTEVONiA9IDYsDQogICAgTVNTX1VBUlRfTEVONyA9IDcsDQogICAgTVNTX1VBUlRfSU5WQUxJRF9GSUxURVJfTEVOR1RIID0gOA0KfSBtc3NfdWFydF9maWx0ZXJfbGVuZ3RoX3Q7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRYUkRZIGFuZCBSWFJEWSBtb2RlLg0KICBUaGlzIGVudW1lcmF0aW9uIHNwZWNpZmllcyB0aGUgVFhSRFkgYW5kIFJYUkRZIHNpZ25hbCBtb2Rlcy4gVGhlIGZ1bmN0aW9uIA0KICBNU1NfVUFSVF9zZXRfcmVhZHlfbW9kZSgpIGFjY2VwdHMgdGhlIHBhcmFtZXRlciBvZiB0aGlzIHR5cGUuDQogKi8NCnR5cGVkZWYgZW51bSB7DQogICAgTVNTX1VBUlRfUkVBRFlfTU9ERTAsDQogICAgTVNTX1VBUlRfUkVBRFlfTU9ERTEsDQogICAgTVNTX1VBUlRfSU5WQUxJRF9SRUFEWV9NT0RFDQp9IG1zc191YXJ0X3JlYWR5X21vZGVfdDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVVNBUlQgbW9kZSBvZiBvcGVyYXRpb24uDQogIFRoaXMgZW51bWVyYXRpb24gc3BlY2lmaWVzIHRoZSBtb2RlIG9mIG9wZXJhdGlvbiBvZiBNU1MgVUFSVCB3aGVuIG9wZXJhdGluZyANCiAgYXMgVVNBUlQuIFRoZSBmdW5jdGlvbiBNU1NfVUFSVF9zZXRfdXNhcnRfbW9kZSgpIGFjY2VwdHMgdGhlIHBhcmFtZXRlciBvZiB0aGlzIHR5cGUuDQogKi8NCnR5cGVkZWYgZW51bSB7DQogICAgTVNTX1VBUlRfQVNZTkNfTU9ERSAgICAgICAgICAgICAgID0gMCwNCiAgICBNU1NfVUFSVF9TWU5DX1NMQVZFX1BPU19FREdFX0NMSyAgPSAxLA0KICAgIE1TU19VQVJUX1NZTkNfU0xBVkVfTkVHX0VER0VfQ0xLICA9IDIsDQogICAgTVNTX1VBUlRfU1lOQ19NQVNURVJfUE9TX0VER0VfQ0xLID0gMywNCiAgICBNU1NfVUFSVF9TWU5DX01BU1RFUl9ORUdfRURHRV9DTEsgPSA0LA0KICAgIE1TU19VQVJUX0lOVkFMSURfU1lOQ19NT0RFICAgICAgICA9IDUNCn0gbXNzX3VhcnRfdXNhcnRfbW9kZV90Ow0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIE1TUyBVQVJUIGluc3RhbmNlIHR5cGUuDQogIFRoaXMgaXMgdHlwZSBkZWZpbml0aW9uIGZvciBNU1MgVUFSVCBpbnN0YW5jZS4gWW91IG5lZWQgdG8gY3JlYXRlIGFuZA0KICBtYWludGFpbiBhIHJlY29yZCBvZiB0aGlzIHR5cGUuIFRoaXMgaG9sZHMgYWxsIGRhdGEgcmVnYXJkaW5nIHRoZSBNU1MgVUFSVA0KICBpbnN0YW5jZQ0KICovDQp0eXBlZGVmIHN0cnVjdCAgbXNzX3VhcnRfaW5zdGFuY2UgbXNzX3VhcnRfaW5zdGFuY2VfdDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgSW50ZXJydXB0IGhhbmRsZXIgcHJvdG90eXBlLg0KICBUaGlzIHR5cGVkZWYgc3BlY2lmaWVzIHRoZSBmdW5jdGlvbiBwcm90b3R5cGUgZm9yIE1TUyBVQVJUIGludGVycnVwdCBoYW5kbGVycy4NCiAgQWxsIGludGVycnVwdCBoYW5kbGVycyByZWdpc3RlcmVkIHdpdGggdGhlIE1TUyBVQVJUIGRyaXZlciBtdXN0IGJlIG9mIHRoaXMgdHlwZS4NCiAgVGhlIGludGVycnVwdCBoYW5kbGVycyBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBkcml2ZXIgdGhyb3VnaCB0aGUNCiAgTVNTX1VBUlRfc2V0X3J4X2hhbmRsZXIoKSwgTVNTX1VBUlRfc2V0X3R4X2hhbmRsZXIoKSwNCiAgTVNTX1VBUlRfc2V0X3J4c3RhdHVzX2hhbmRsZXIoKSwgYW5kIE1TU19VQVJUX3NldF9tb2RlbXN0YXR1c19oYW5kbGVyKCkNCiAgZnVuY3Rpb25zLg0KICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gZWl0aGVyIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxIHRvDQogIGlkZW50aWZ5IHRoZSBNU1MgVUFSVCB0byBhc3NvY2lhdGUgd2l0aCB0aGUgaGFuZGxlciBmdW5jdGlvbi4NCiAqLw0KdHlwZWRlZiB2b2lkICgqbXNzX3VhcnRfaXJxX2hhbmRsZXJfdCkoIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQgKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgbXNzX3VhcnRfaW5zdGFuY2UuDQogIFRoZXJlIGlzIG9uZSBpbnN0YW5jZSBvZiB0aGlzIHN0cnVjdHVyZSBmb3IgZWFjaCBpbnN0YW5jZSBvZiB0aGUNCiAgbWljcm9jb250cm9sbGVyIHN1YnN5c3RlbZJzIFVBUlRzLiBJbnN0YW5jZXMgb2YgdGhpcyBzdHJ1Y3R1cmUgYXJlIHVzZWQgdG8NCiAgaWRlbnRpZnkgYSBzcGVjaWZpYyBVQVJULiBBIHBvaW50ZXIgdG8gYW4gaW5pdGlhbGl6ZWQgaW5zdGFuY2Ugb2YgdGhlDQogIG1zc191YXJ0X2luc3RhbmNlX3Qgc3RydWN0dXJlIGlzIHBhc3NlZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyIHRvDQogIE1TUyBVQVJUIGRyaXZlciBmdW5jdGlvbnMgdG8gaWRlbnRpZnkgd2hpY2ggVUFSVCBzaG91bGQgcGVyZm9ybSB0aGUNCiAgcmVxdWVzdGVkIG9wZXJhdGlvbi4NCiAqLw0Kc3RydWN0IG1zc191YXJ0X2luc3RhbmNlew0KICAgIC8qIENNU0lTIHJlbGF0ZWQgZGVmaW5lcyBpZGVudGlmeWluZyB0aGUgVUFSVCBoYXJkd2FyZS4gKi8NCiAgICBVQVJUX1R5cGVEZWYgKiAgICAgICAgICBod19yZWc7ICAgICAvKiE8IFBvaW50ZXIgdG8gVUFSVCByZWdpc3RlcnMuICovDQogICAgSVJRbl9UeXBlICAgICAgICAgICAgICAgaXJxbjsgICAgICAgLyohPCBVQVJUJ3MgQ29ydGV4LU0zIE5WSUMgaW50ZXJydXB0IG51bWJlci4gKi8NCiAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBiYXVkcmF0ZTsgICAvKiE8IE9wZXJhdGluZyBiYXVkIHJhdGUuICovDQogICAgdWludDhfdCAgICAgICAgICAgICAgICAgbGluZWNvbmZpZzsgLyohPCBMaW5lIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gKi8NCiAgICB1aW50OF90ICAgICAgICAgICAgICAgICBzdGF0dXM7ICAgICAvKiE8IFN0aWNreSBsaW5lIHN0YXR1cy4gKi8NCg0KICAgIC8qIHRyYW5zbWl0IHJlbGF0ZWQgaW5mbyAodXNlZCB3aXRoIGludGVycnVwdCBkcml2ZW4gdHJhbnNtaXQpOiAqLw0KICAgIGNvbnN0IHVpbnQ4X3QgKiB0eF9idWZmZXI7ICAgICAgICAgIC8qITwgUG9pbnRlciB0byB0cmFuc21pdCBidWZmZXIuICovDQogICAgdWludDMyX3QgICAgICAgIHR4X2J1ZmZfc2l6ZTsgICAgICAgLyohPCBUcmFuc21pdCBidWZmZXIgc2l6ZS4gKi8NCiAgICB1aW50MzJfdCAgICAgICAgdHhfaWR4OyAgICAgICAgICAgICAvKiE8IEluZGV4IHdpdGhpbiB0cmFuc21pdCBidWZmZXIgb2YgbmV4dCBieXRlIHRvIHRyYW5zbWl0LiovDQoNCiAgICAvKiBsaW5lIHN0YXR1cyBpbnRlcnJ1cHQgaGFuZGxlcjoqLw0KICAgIG1zc191YXJ0X2lycV9oYW5kbGVyX3QgbGluZXN0c19oYW5kbGVyOyAgIC8qITwgUG9pbnRlciB0byB1c2VyIHJlZ2lzdGVyZWQgbGluZSBzdGF0dXMgaGFuZGxlci4gKi8NCiAgICAvKiByZWNlaXZlIGludGVycnVwdCBoYW5kbGVyOiovDQogICAgbXNzX3VhcnRfaXJxX2hhbmRsZXJfdCByeF9oYW5kbGVyOyAgICAgICAgLyohPCBQb2ludGVyIHRvIHVzZXIgcmVnaXN0ZXJlZCByZWNlaXZlciBoYW5kbGVyLiAqLw0KICAgIC8qIHRyYW5zbWl0IGludGVycnVwdCBoYW5kbGVyOiovDQogICAgbXNzX3VhcnRfaXJxX2hhbmRsZXJfdCB0eF9oYW5kbGVyOyAgICAgICAgLyohPCBQb2ludGVyIHRvIHVzZXIgcmVnaXN0ZXJlZCB0cmFuc21pdCBoYW5kbGVyLiAqLw0KICAgIC8qIG1vZGVtIHN0YXR1cyBpbnRlcnJ1cHQgaGFuZGxlcjoqLw0KICAgIG1zc191YXJ0X2lycV9oYW5kbGVyX3QgbW9kZW1zdHNfaGFuZGxlcjsgIC8qITwgUG9pbnRlciB0byB1c2VyIHJlZ2lzdGVyZWQgbW9kZW0gc3RhdHVzIGhhbmRsZXIuICovDQogICAgLyogcmVjZWl2ZXIgdGltZW91dCBpbnRlcnJ1cHQgaGFuZGxlciAqLw0KICAgIG1zc191YXJ0X2lycV9oYW5kbGVyX3QgcnRvX2hhbmRsZXI7ICAgICAgIC8qITwgUG9pbnRlciB0byB1c2VyIHJlZ2lzdGVyZWQgcmVjZWl2ZXIgdGltZW91dCBoYW5kbGVyLiAqLw0KICAgIC8qIE5BQ0sgaW50ZXJydXB0IGhhbmRsZXIgKi8NCiAgICBtc3NfdWFydF9pcnFfaGFuZGxlcl90IG5hY2tfaGFuZGxlcjsgICAgICAvKiE8IFBvaW50ZXIgdG8gdXNlciByZWdpc3RlcmVkIE5BQ0sgaGFuZGxlci4gKi8NCiAgICAvKiBQSUQgcGFyaXR5IHBycm9yIGludGVycnVwIGhhbmRsZXIgKi8NCiAgICBtc3NfdWFydF9pcnFfaGFuZGxlcl90IHBpZF9wZWlfaGFuZGxlcjsgICAvKiE8IFBvaW50ZXIgdG8gdXNlciByZWdpc3RlcmVkIFBJRCBwYXJpdHkgZXJyb3IgaGFuZGxlci4gKi8NCiAgICAvKiBMSU4gYnJlYWsgaW50ZXJydXB0IGhhbmRsZXIgKi8NCiAgICBtc3NfdWFydF9pcnFfaGFuZGxlcl90IGJyZWFrX2hhbmRsZXI7ICAgICAvKiE8IFBvaW50ZXIgdG8gdXNlciByZWdpc3RlcmVkIExJTiBicmVhayBoYW5kbGVyLiAqLw0KICAgIC8qIExJTiBzeW5jIGRldGVjdGlvbiBpbnRlcnJ1cHQgaGFuZGxlciAqLw0KICAgIG1zc191YXJ0X2lycV9oYW5kbGVyX3Qgc3luY19oYW5kbGVyOyAgICAgIC8qITwgUG9pbnRlciB0byB1c2VyIHJlZ2lzdGVyZWQgTElOIHN5bmMgZGVjdGVjdGlvbiBoYW5kbGVyLiAqLw0KfTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhpcyBpbnN0YW5jZSBvZiBtc3NfdWFydF9pbnN0YW5jZV90IGhvbGRzIGFsbCBkYXRhIHJlbGF0ZWQgdG8gdGhlIG9wZXJhdGlvbnMNCiAgcGVyZm9ybWVkIGJ5IFVBUlQwLiBUaGUgZnVuY3Rpb24gTVNTX1VBUlRfaW5pdCgpIGluaXRpYWxpemVzIHRoaXMgc3RydWN0dXJlLg0KICBBIHBvaW50ZXIgdG8gZ19tc3NfdWFydDAgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gTVNTIFVBUlQgZHJpdmVyDQogIGZ1bmN0aW9ucyB0byBpbmRpY2F0ZSB0aGF0IFVBUlQwIHNob3VsZCBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLg0KICovDQpleHRlcm4gbXNzX3VhcnRfaW5zdGFuY2VfdCBnX21zc191YXJ0MDsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhpcyBpbnN0YW5jZSBvZiBtc3NfdWFydF9pbnN0YW5jZV90IGhvbGRzIGFsbCBkYXRhIHJlbGF0ZWQgdG8gdGhlIG9wZXJhdGlvbnMNCiAgcGVyZm9ybWVkIGJ5IFVBUlQxLiBUaGUgZnVuY3Rpb24gTVNTX1VBUlRfaW5pdCgpIGluaXRpYWxpemVzIHRoaXMgc3RydWN0dXJlLg0KICBBIHBvaW50ZXIgdG8gZ19tc3NfdWFydDEgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBwYXJhbWV0ZXIgdG8gTVNTIFVBUlQgZHJpdmVyDQogIGZ1bmN0aW9ucyB0byBpbmRpY2F0ZSB0aGF0IFVBUlQxIHNob3VsZCBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgb3BlcmF0aW9uLg0KICovDQpleHRlcm4gbXNzX3VhcnRfaW5zdGFuY2VfdCBnX21zc191YXJ0MTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX2luaXQoKSBmdW5jdGlvbiBpbml0aWFsaXplcyBhbmQgY29uZmlndXJlcyBvbmUgb2YgdGhlIFNtYXJ0RnVzaW9uMg0KICBNU1MgVUFSVHMgd2l0aCB0aGUgY29uZmlndXJhdGlvbiBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIuIFRoZSBjb25maWd1cmF0aW9uDQogIHBhcmFtZXRlcnMgYXJlIHRoZSBiYXVkX3JhdGUgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYmF1ZCB2YWx1ZSBhbmQgdGhlDQogIGxpbmVfY29uZmlnIHdoaWNoIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGluZSBjb25maWd1cmF0aW9uIChiaXQgbGVuZ3RoLA0KICBzdG9wIGJpdHMgYW5kIHBhcml0eSkuDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90IHN0cnVjdHVyZQ0KICAgIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0byBiZSBpbml0aWFsaXplZC4gVGhlcmUgYXJlIHR3bw0KICAgIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLCBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MNCiAgICBVQVJUMCBhbmQgTVNTIFVBUlQxIHJlc3BlY3RpdmVseS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXINCiAgICB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDEgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluDQogICAgdGhlIFVBUlQgZHJpdmVyLi4NCg0KICBAcGFyYW0gYmF1ZF9yYXRlDQogICAgVGhlIGJhdWRfcmF0ZSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBiYXVkIHJhdGUuIEl0IGNhbiBiZSBzcGVjaWZpZWQgZm9yDQogICAgY29tbW9uIGJhdWQgcmF0ZXOSIHVzaW5nIHRoZSBmb2xsb3dpbmcgZGVmaW5lczoNCiAgICCVICAgTVNTX1VBUlRfMTEwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMzAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMTIwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzI0MDBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF80ODAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfOTYwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzE5MjAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMzg0MDBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF81NzYwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzExNTIwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzIzMDQwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzQ2MDgwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzkyMTYwMF9CQVVEDQogICAgQWx0ZXJuYXRpdmVseSwgYW55IG5vbnN0YW5kYXJkIGJhdWQgcmF0ZSBjYW4gYmUgc3BlY2lmaWVkIGJ5IHNpbXBseSBwYXNzaW5nDQogICAgdGhlIGFjdHVhbCByZXF1aXJlZCBiYXVkIHJhdGUgYXMgdGhlIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlci4NCg0KICBAcGFyYW0gbGluZV9jb25maWcNCiAgICBUaGUgbGluZV9jb25maWcgcGFyYW1ldGVyIGlzIHRoZSBsaW5lIGNvbmZpZ3VyYXRpb24gc3BlY2lmeWluZyB0aGUgYml0IGxlbmd0aCwNCiAgICBudW1iZXIgb2Ygc3RvcCBiaXRzIGFuZCBwYXJpdHkgc2V0dGluZ3MuIFRoaXMgaXMgYSBiaXR3aXNlIE9SIG9mIG9uZSB2YWx1ZQ0KICAgIGZyb20gZWFjaCBvZiB0aGUgZm9sbG93aW5nIGdyb3VwcyBvZiBhbGxvd2VkIHZhbHVlczoNCiAgICCVICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgdG8gc3BlY2lmeSB0aGUgdHJhbnNtaXQvcmVjZWl2ZSBkYXRhIGJpdCBsZW5ndGg6DQogICAgICAgIE1TU19VQVJUX0RBVEFfNV9CSVRTDQogICAgICAgIE1TU19VQVJUX0RBVEFfNl9CSVRTLA0KICAgICAgICBNU1NfVUFSVF9EQVRBXzdfQklUUw0KICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUw0KICAgIJUgICBPbmUgb2YgdGhlIGZvbGxvd2luZyB0byBzcGVjaWZ5IHRoZSBwYXJpdHkgc2V0dGluZzoNCiAgICAgICAgTVNTX1VBUlRfTk9fUEFSSVRZDQogICAgICAgIE1TU19VQVJUX0VWRU5fUEFSSVRZDQogICAgICAgIE1TU19VQVJUX09ERF9QQVJJVFkNCiAgICAgICAgTVNTX1VBUlRfU1RJQ0tfUEFSSVRZXzANCiAgICAgICAgTVNTX1VBUlRfU1RJQ0tfUEFSSVRZXzENCiAgICCVICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHN0b3AgYml0czoNCiAgICAgICAgTVNTX1VBUlRfT05FX1NUT1BfQklUDQogICAgICAgIE1TU19VQVJUX09ORUhBTEZfU1RPUF9CSVQNCiAgICAgICAgTVNTX1VBUlRfVFdPX1NUT1BfQklUUw0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICNpbmNsdWRlICJtc3NfdWFydC5oIg0KDQogIGludCBtYWluKHZvaWQpDQogIHsNCiAgICAgTVNTX1VBUlRfaW5pdCgmZ19tc3NfdWFydDAsDQogICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUyB8IE1TU19VQVJUX05PX1BBUklUWSB8IE1TU19VQVJUX09ORV9TVE9QX0JJVCk7DQogICAgICAgICAgICAgICAgICAgDQogICAgIHJldHVybigwKTsNCiAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkDQpNU1NfVUFSVF9pbml0DQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCogdGhpc191YXJ0LA0KICAgIHVpbnQzMl90IGJhdWRfcmF0ZSwNCiAgICB1aW50OF90IGxpbmVfY29uZmlnDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KIFRoZSBNU1NfVUFSVF9saW5faW5pdCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgTVNTIFVBUlQgZm9yIA0KIExJTiBtb2RlIG9mIG9wZXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgdGhlIGJhdWRfcmF0ZSB3aGljaCBpcyANCiB1c2VkIHRvIGdlbmVyYXRlIHRoZSBiYXVkIHZhbHVlIGFuZCB0aGUgbGluZV9jb25maWcgd2hpY2ggaXMgdXNlZCB0byBzcGVjaWZ5IA0KIHRoZSBsaW5lIGNvbmZpZ3VyYXRpb24gKGJpdCBsZW5ndGgsIHN0b3AgYml0cyBhbmQgcGFyaXR5KS4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEBwYXJhbSBiYXVkX3JhdGUNCiAgICBUaGUgYmF1ZF9yYXRlIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGJhdWQgcmF0ZS4gSXQgY2FuIGJlIHNwZWNpZmllZCBmb3INCiAgICBjb21tb24gYmF1ZCByYXRlc5IgdXNpbmcgdGhlIGZvbGxvd2luZyBkZWZpbmVzOg0KICAgIJUgICBNU1NfVUFSVF8xMTBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF8zMDBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF8xMjAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMjQwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzQ4MDBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF85NjAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMTkyMDBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF8zODQwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzU3NjAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMTE1MjAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMjMwNDAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfNDYwODAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfOTIxNjAwX0JBVUQNCiAgICBBbHRlcm5hdGl2ZWx5LCBhbnkgbm9uc3RhbmRhcmQgYmF1ZCByYXRlIGNhbiBiZSBzcGVjaWZpZWQgYnkgc2ltcGx5IHBhc3NpbmcNCiAgICB0aGUgYWN0dWFsIHJlcXVpcmVkIGJhdWQgcmF0ZSBhcyB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLg0KDQogIEBwYXJhbSBsaW5lX2NvbmZpZw0KICAgIFRoZSBsaW5lX2NvbmZpZyBwYXJhbWV0ZXIgaXMgdGhlIGxpbmUgY29uZmlndXJhdGlvbiBzcGVjaWZ5aW5nIHRoZSBiaXQgbGVuZ3RoLA0KICAgIG51bWJlciBvZiBzdG9wIGJpdHMgYW5kIHBhcml0eSBzZXR0aW5ncy4gVGhpcyBpcyBhIGJpdHdpc2UgT1Igb2Ygb25lIHZhbHVlDQogICAgZnJvbSBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZ3JvdXBzIG9mIGFsbG93ZWQgdmFsdWVzOg0KICAgIJUgICBPbmUgb2YgdGhlIGZvbGxvd2luZyB0byBzcGVjaWZ5IHRoZSB0cmFuc21pdC9yZWNlaXZlIGRhdGEgYml0IGxlbmd0aDoNCiAgICAgICAgTVNTX1VBUlRfREFUQV81X0JJVFMNCiAgICAgICAgTVNTX1VBUlRfREFUQV82X0JJVFMsDQogICAgICAgIE1TU19VQVJUX0RBVEFfN19CSVRTDQogICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTDQogICAglSAgIE9uZSBvZiB0aGUgZm9sbG93aW5nIHRvIHNwZWNpZnkgdGhlIHBhcml0eSBzZXR0aW5nOg0KICAgICAgICBNU1NfVUFSVF9OT19QQVJJVFkNCiAgICAgICAgTVNTX1VBUlRfRVZFTl9QQVJJVFkNCiAgICAgICAgTVNTX1VBUlRfT0REX1BBUklUWQ0KICAgICAgICBNU1NfVUFSVF9TVElDS19QQVJJVFlfMA0KICAgICAgICBNU1NfVUFSVF9TVElDS19QQVJJVFlfMQ0KICAgIJUgICBPbmUgb2YgdGhlIGZvbGxvd2luZyB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzOg0KICAgICAgICBNU1NfVUFSVF9PTkVfU1RPUF9CSVQNCiAgICAgICAgTVNTX1VBUlRfT05FSEFMRl9TVE9QX0JJVA0KICAgICAgICBNU1NfVUFSVF9UV09fU1RPUF9CSVRTDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgI2luY2x1ZGUgIm1zc191YXJ0LmgiDQoNCiAgaW50IG1haW4odm9pZCkNCiAgew0KICAgICBNU1NfVUFSVF9saW5faW5pdCgmZ19tc3NfdWFydDAsDQogICAgICAgICAgICAgICAgICAgICAgIE1TU19VQVJUXzU3NjAwX0JBVUQsDQogICAgICAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsNCiAgICAgICAgICAgICAgICAgICAgICAgDQogICAgIHJldHVybigwKTsNCiAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkIA0KTVNTX1VBUlRfbGluX2luaXQNCigNCiAgICBtc3NfdWFydF9pbnN0YW5jZV90KiB0aGlzX3VhcnQsIA0KICAgIHVpbnQzMl90IGJhdWRfcmF0ZSwNCiAgICB1aW50OF90IGxpbmVfY29uZmlnDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfaXJkYV9pbml0KCkgZnVuY3Rpb24gaXMgdXNlZCB0byBpbml0aWFsaXplIHRoZSBNU1MgVUFSVCBpbnN0YW5jZSANCiAgcmVmZXJlbmNlZCBieSB0aGUgcGFyYW1ldGVyIHRoaXNfdWFydCAgZm9yIElyREEgbW9kZSBvZiBvcGVyYXRpb24uIFRoaXMgDQogIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIGFueSBvdGhlciBJckRBIGZ1bmN0aW9uYWxpdHkgc3BlY2lmaWMgDQogIGZ1bmN0aW9ucy4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEBwYXJhbSBiYXVkX3JhdGUNCiAgICBUaGUgYmF1ZF9yYXRlIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIGJhdWQgcmF0ZS4gSXQgY2FuIGJlIHNwZWNpZmllZCBmb3INCiAgICBjb21tb24gYmF1ZCByYXRlc5IgdXNpbmcgdGhlIGZvbGxvd2luZyBkZWZpbmVzOg0KICAgIJUgICBNU1NfVUFSVF8xMTBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF8zMDBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF8xMjAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMjQwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzQ4MDBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF85NjAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMTkyMDBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF8zODQwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzU3NjAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMTE1MjAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMjMwNDAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfNDYwODAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfOTIxNjAwX0JBVUQNCiAgICBBbHRlcm5hdGl2ZWx5LCBhbnkgbm9uc3RhbmRhcmQgYmF1ZCByYXRlIGNhbiBiZSBzcGVjaWZpZWQgYnkgc2ltcGx5IHBhc3NpbmcNCiAgICB0aGUgYWN0dWFsIHJlcXVpcmVkIGJhdWQgcmF0ZSBhcyB0aGUgdmFsdWUgZm9yIHRoaXMgcGFyYW1ldGVyLg0KDQogIEBwYXJhbSBsaW5lX2NvbmZpZw0KICAgIFRoZSBsaW5lX2NvbmZpZyBwYXJhbWV0ZXIgaXMgdGhlIGxpbmUgY29uZmlndXJhdGlvbiBzcGVjaWZ5aW5nIHRoZSBiaXQgbGVuZ3RoLA0KICAgIG51bWJlciBvZiBzdG9wIGJpdHMgYW5kIHBhcml0eSBzZXR0aW5ncy4gVGhpcyBpcyBhIGJpdHdpc2UgT1Igb2Ygb25lIHZhbHVlDQogICAgZnJvbSBlYWNoIG9mIHRoZSBmb2xsb3dpbmcgZ3JvdXBzIG9mIGFsbG93ZWQgdmFsdWVzOg0KICAgIJUgICBPbmUgb2YgdGhlIGZvbGxvd2luZyB0byBzcGVjaWZ5IHRoZSB0cmFuc21pdC9yZWNlaXZlIGRhdGEgYml0IGxlbmd0aDoNCiAgICAgICAgTVNTX1VBUlRfREFUQV81X0JJVFMNCiAgICAgICAgTVNTX1VBUlRfREFUQV82X0JJVFMsDQogICAgICAgIE1TU19VQVJUX0RBVEFfN19CSVRTDQogICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTDQogICAglSAgIE9uZSBvZiB0aGUgZm9sbG93aW5nIHRvIHNwZWNpZnkgdGhlIHBhcml0eSBzZXR0aW5nOg0KICAgICAgICBNU1NfVUFSVF9OT19QQVJJVFkNCiAgICAgICAgTVNTX1VBUlRfRVZFTl9QQVJJVFkNCiAgICAgICAgTVNTX1VBUlRfT0REX1BBUklUWQ0KICAgICAgICBNU1NfVUFSVF9TVElDS19QQVJJVFlfMA0KICAgICAgICBNU1NfVUFSVF9TVElDS19QQVJJVFlfMQ0KICAgIJUgICBPbmUgb2YgdGhlIGZvbGxvd2luZyB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2Ygc3RvcCBiaXRzOg0KICAgICAgICBNU1NfVUFSVF9PTkVfU1RPUF9CSVQNCiAgICAgICAgTVNTX1VBUlRfT05FSEFMRl9TVE9QX0JJVA0KICAgICAgICBNU1NfVUFSVF9UV09fU1RPUF9CSVRTDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBNU1NfVUFSVF9pcmRhX2luaXQoJmdfbXNzX3VhcnQwLA0KICAgICAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF81NzYwMF9CQVVELA0KICAgICAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUyB8IE1TU19VQVJUX05PX1BBUklUWSB8IE1TU19VQVJUX09ORV9TVE9QX0JJVCwNCiAgICAgICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfQUNUSVZFX0xPVywNCiAgICAgICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfQUNUSVZFX0xPVywNCiAgICAgICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfM19CWV8xNik7DQogIEBlbmRjb2RlDQogKi8NCnZvaWQgDQpNU1NfVUFSVF9pcmRhX2luaXQNCigNCiAgICBtc3NfdWFydF9pbnN0YW5jZV90KiB0aGlzX3VhcnQsIA0KICAgIHVpbnQzMl90IGJhdWRfcmF0ZSwNCiAgICB1aW50OF90IGxpbmVfY29uZmlnLA0KICAgIG1zc191YXJ0X3J6aV9wb2xhcml0eV90IHJ4cG9sLA0KICAgIG1zc191YXJ0X3J6aV9wb2xhcml0eV90IHR4cG9sLA0KICAgIG1zc191YXJ0X3J6aV9wdWxzZXdpZHRoX3QgcHcNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9zbWFydGNhcmRfaW5pdCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgTVNTIFVBUlQgDQogIGZvciBJU08gNzgxNiAoc21hcnRjYXJkKSBtb2RlIG9mIG9wZXJhdGlvbi4gVGhlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhcmUgDQogIHRoZSBiYXVkX3JhdGUgd2hpY2ggaXMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYmF1ZCB2YWx1ZSBhbmQgdGhlIGxpbmVfY29uZmlnIA0KICB3aGljaCBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxpbmUgY29uZmlndXJhdGlvbiAoYml0IGxlbmd0aCwgc3RvcCBiaXRzIGFuZCBwYXJpdHkpLiANCiAgVGhpcyBmdW5jdGlvbiBkaXNhYmxlcyBhbGwgb3RoZXIgbW9kZXMgb2YgdGhlIE1TUyBVQVJUIGluc3RhbmNlIHBvaW50ZWQgYnkgDQogIHRoZSBwYXJhbWV0ZXIgdGhpc191YXJ0Lg0KICANCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcGFyYW0gYmF1ZF9yYXRlDQogICAgVGhlIGJhdWRfcmF0ZSBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSBiYXVkIHJhdGUuIEl0IGNhbiBiZSBzcGVjaWZpZWQgZm9yDQogICAgY29tbW9uIGJhdWQgcmF0ZXOSIHVzaW5nIHRoZSBmb2xsb3dpbmcgZGVmaW5lczoNCiAgICCVICAgTVNTX1VBUlRfMTEwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMzAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMTIwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzI0MDBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF80ODAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfOTYwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzE5MjAwX0JBVUQNCiAgICCVICAgTVNTX1VBUlRfMzg0MDBfQkFVRA0KICAgIJUgICBNU1NfVUFSVF81NzYwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzExNTIwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzIzMDQwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzQ2MDgwMF9CQVVEDQogICAglSAgIE1TU19VQVJUXzkyMTYwMF9CQVVEDQogICAgQWx0ZXJuYXRpdmVseSwgYW55IG5vbnN0YW5kYXJkIGJhdWQgcmF0ZSBjYW4gYmUgc3BlY2lmaWVkIGJ5IHNpbXBseSBwYXNzaW5nDQogICAgdGhlIGFjdHVhbCByZXF1aXJlZCBiYXVkIHJhdGUgYXMgdGhlIHZhbHVlIGZvciB0aGlzIHBhcmFtZXRlci4NCg0KICBAcGFyYW0gbGluZV9jb25maWcNCiAgICBUaGUgbGluZV9jb25maWcgcGFyYW1ldGVyIGlzIHRoZSBsaW5lIGNvbmZpZ3VyYXRpb24gc3BlY2lmeWluZyB0aGUgYml0IGxlbmd0aCwNCiAgICBudW1iZXIgb2Ygc3RvcCBiaXRzIGFuZCBwYXJpdHkgc2V0dGluZ3MuIFRoaXMgaXMgYSBiaXR3aXNlIE9SIG9mIG9uZSB2YWx1ZQ0KICAgIGZyb20gZWFjaCBvZiB0aGUgZm9sbG93aW5nIGdyb3VwcyBvZiBhbGxvd2VkIHZhbHVlczoNCiAgICCVICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgdG8gc3BlY2lmeSB0aGUgdHJhbnNtaXQvcmVjZWl2ZSBkYXRhIGJpdCBsZW5ndGg6DQogICAgICAgIE1TU19VQVJUX0RBVEFfNV9CSVRTDQogICAgICAgIE1TU19VQVJUX0RBVEFfNl9CSVRTLA0KICAgICAgICBNU1NfVUFSVF9EQVRBXzdfQklUUw0KICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUw0KICAgIJUgICBPbmUgb2YgdGhlIGZvbGxvd2luZyB0byBzcGVjaWZ5IHRoZSBwYXJpdHkgc2V0dGluZzoNCiAgICAgICAgTVNTX1VBUlRfTk9fUEFSSVRZDQogICAgICAgIE1TU19VQVJUX0VWRU5fUEFSSVRZDQogICAgICAgIE1TU19VQVJUX09ERF9QQVJJVFkNCiAgICAgICAgTVNTX1VBUlRfU1RJQ0tfUEFSSVRZXzANCiAgICAgICAgTVNTX1VBUlRfU1RJQ0tfUEFSSVRZXzENCiAgICCVICAgT25lIG9mIHRoZSBmb2xsb3dpbmcgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIHN0b3AgYml0czoNCiAgICAgICAgTVNTX1VBUlRfT05FX1NUT1BfQklUDQogICAgICAgIE1TU19VQVJUX09ORUhBTEZfU1RPUF9CSVQNCiAgICAgICAgTVNTX1VBUlRfVFdPX1NUT1BfQklUUw0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgI2luY2x1ZGUgIm1zc191YXJ0LmgiDQoNCiAgICAgIGludCBtYWluKHZvaWQpDQogICAgICB7DQogICAgICAgICBNU1NfVUFSVF9zbWFydGNhcmRfaW5pdCgmZ19tc3NfdWFydDAsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF81NzYwMF9CQVVELA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfREFUQV84X0JJVFMgfCBNU1NfVUFSVF9OT19QQVJJVFkgfCBNU1NfVUFSVF9PTkVfU1RPUF9CSVQpOw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICByZXR1cm4oMCk7DQogICAgICB9DQogIEBlbmRjb2RlDQogKi8NCnZvaWQgDQpNU1NfVUFSVF9zbWFydGNhcmRfaW5pdA0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QqIHRoaXNfdWFydCwgDQogICAgdWludDMyX3QgYmF1ZF9yYXRlLA0KICAgIHVpbnQ4X3QgbGluZV9jb25maWcNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBmdW5jdGlvbiBNU1NfVUFSVF9wb2xsZWRfdHgoKSBpcyB1c2VkIHRvIHRyYW5zbWl0IGRhdGEuIEl0IHRyYW5zZmVycyB0aGUNCiAgY29udGVudHMgb2YgdGhlIHRyYW5zbWl0dGVyIGRhdGEgYnVmZmVyLCBwYXNzZWQgYXMgYSBmdW5jdGlvbiBwYXJhbWV0ZXIsIGludG8NCiAgdGhlIFVBUlSScyBoYXJkd2FyZSB0cmFuc21pdHRlciBGSUZPLiBJdCByZXR1cm5zIHdoZW4gdGhlIGZ1bGwgY29udGVudCBvZiB0aGUNCiAgdHJhbnNtaXQgZGF0YSBidWZmZXIgaGFzIGJlZW4gdHJhbnNmZXJyZWQgdG8gdGhlIFVBUlSScyB0cmFuc21pdCBGSUZPLiBJdCBpcw0KICBzYWZlIHRvIHJlbGVhc2Ugb3IgcmV1c2UgdGhlIG1lbW9yeSB1c2VkIGFzIHRoZSB0cmFuc21pdHRlciBkYXRhIGJ1ZmZlciBvbmNlDQogIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4NCg0KICBOb3RlOiAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgVUFSVJJzIGxpbmUgc3RhdHVzIHJlZ2lzdGVyIChMU1IpIHRvIHBvbGwNCiAgZm9yIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIHRyYW5zbWl0dGVyIGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgKFRIUkUpIGJpdA0KICBiZWZvcmUgdHJhbnNmZXJyaW5nIGRhdGEgZnJvbSB0aGUgZGF0YSBidWZmZXIgdG8gdGhlIHRyYW5zbWl0dGVyIEZJRk8uIEl0DQogIHRyYW5zZmVycyBkYXRhIHRvIHRoZSB0cmFuc21pdHRlciBGSUZPIGluIGJsb2NrcyBvZiAxNiBieXRlcyBvciBsZXNzIGFuZA0KICBhbGxvd3MgdGhlIEZJRk8gdG8gZW1wdHkgYmVmb3JlIHRyYW5zZmVycmluZyB0aGUgbmV4dCBibG9jayBvZiBkYXRhLg0KDQogIE5vdGU6ICAgICBUaGUgYWN0dWFsIHRyYW5zbWlzc2lvbiBvdmVyIHRoZSBzZXJpYWwgY29ubmVjdGlvbiB3aWxsIHN0aWxsIGJlDQogIGluIHByb2dyZXNzIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zLiBVc2UgdGhlIE1TU19VQVJUX2dldF90eF9zdGF0dXMoKQ0KICBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBrbm93IHdoZW4gdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5Lg0KDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQoNCiAgQHBhcmFtIHBidWZmDQogICAgVGhlIHBidWZmIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YSB0bw0KICAgIGJlIHRyYW5zbWl0dGVkLg0KDQogIEBwYXJhbSB0eF9zaXplDQogICAgVGhlIHR4X3NpemUgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBkYXRhIHRvDQogICAgYmUgdHJhbnNtaXR0ZWQuDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgI2luY2x1ZGUgIm1zc191YXJ0LmgiDQoNCiAgaW50IG1haW4odm9pZCkNCiAgew0KICAgICB1aW50OF90IG1lc3NhZ2VbMTJdID0gIkhlbGxvIFdvcmxkIjsNCg0KICAgICBNU1NfVUFSVF9pbml0KCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF81NzYwMF9CQVVELA0KICAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsNCiAgICAgICAgICAgICAgICAgICANCiAgICAgTVNTX1VBUlRfcG9sbGVkX3R4KCZnX21zc191YXJ0MCwgbWVzc2FnZSwgc2l6ZW9mKG1lc3NhZ2UpKTsNCiAgICAgDQogICAgIHJldHVybigwKTsNCiAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkDQpNU1NfVUFSVF9wb2xsZWRfdHgNCigNCiAgICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIGNvbnN0IHVpbnQ4X3QgKiBwYnVmZiwNCiAgICB1aW50MzJfdCB0eF9zaXplDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgZnVuY3Rpb24gTVNTX1VBUlRfcG9sbGVkX3R4X3N0cmluZygpIGlzIHVzZWQgdG8gdHJhbnNtaXQgYSBOVUxMICgnXDAnKQ0KICB0ZXJtaW5hdGVkIHN0cmluZy4gSXQgdHJhbnNmZXJzIHRoZSB0ZXh0IHN0cmluZywgZnJvbSB0aGUgYnVmZmVyIHN0YXJ0aW5nIGF0DQogIHRoZSBhZGRyZXNzIHBvaW50ZWQgdG8gYnkgcF9zel9zdHJpbmcgaW50byB0aGUgVUFSVJJzIGhhcmR3YXJlIHRyYW5zbWl0dGVyDQogIEZJRk8uIEl0IHJldHVybnMgd2hlbiB0aGUgY29tcGxldGUgc3RyaW5nIGhhcyBiZWVuIHRyYW5zZmVycmVkIHRvIHRoZSBVQVJUJ3MNCiAgdHJhbnNtaXQgRklGTy4gSXQgaXMgc2FmZSB0byByZWxlYXNlIG9yIHJldXNlIHRoZSBtZW1vcnkgdXNlZCBhcyB0aGUgc3RyaW5nDQogIGJ1ZmZlciBvbmNlIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4NCg0KICBOb3RlOiAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgVUFSVJJzIGxpbmUgc3RhdHVzIHJlZ2lzdGVyIChMU1IpIHRvIHBvbGwNCiAgZm9yIHRoZSBhY3RpdmUgc3RhdGUgb2YgdGhlIHRyYW5zbWl0dGVyIGhvbGRpbmcgcmVnaXN0ZXIgZW1wdHkgKFRIUkUpIGJpdA0KICBiZWZvcmUgdHJhbnNmZXJyaW5nIGRhdGEgZnJvbSB0aGUgZGF0YSBidWZmZXIgdG8gdGhlIHRyYW5zbWl0dGVyIEZJRk8uIEl0DQogIHRyYW5zZmVycyBkYXRhIHRvIHRoZSB0cmFuc21pdHRlciBGSUZPIGluIGJsb2NrcyBvZiAxNiBieXRlcyBvciBsZXNzIGFuZA0KICBhbGxvd3MgdGhlIEZJRk8gdG8gZW1wdHkgYmVmb3JlIHRyYW5zZmVycmluZyB0aGUgbmV4dCBibG9jayBvZiBkYXRhLg0KDQogIE5vdGU6ICAgICBUaGUgYWN0dWFsIHRyYW5zbWlzc2lvbiBvdmVyIHRoZSBzZXJpYWwgY29ubmVjdGlvbiB3aWxsIHN0aWxsIGJlDQogIGluIHByb2dyZXNzIHdoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zLiBVc2UgdGhlIE1TU19VQVJUX2dldF90eF9zdGF0dXMoKQ0KICBmdW5jdGlvbiBpZiB5b3UgbmVlZCB0byBrbm93IHdoZW4gdGhlIHRyYW5zbWl0dGVyIGlzIGVtcHR5Lg0KDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQoNCiAgQHBhcmFtIHBfc3pfc3RyaW5nDQogICAgVGhlIHBfc3pfc3RyaW5nIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgTlVMTA0KICAgICgnXDAnKSB0ZXJtaW5hdGVkIHN0cmluZyB0byBiZSB0cmFuc21pdHRlZC4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAjaW5jbHVkZSAibXNzX3VhcnQuaCINCg0KICBpbnQgbWFpbih2b2lkKQ0KICB7DQogICAgIHVpbnQ4X3QgbWVzc2FnZVsxMl0gPSAiSGVsbG8gV29ybGQiOw0KDQogICAgIE1TU19VQVJUX2luaXQoJmdfbXNzX3VhcnQwLA0KICAgICAgICAgICAgICAgICAgIE1TU19VQVJUXzU3NjAwX0JBVUQsDQogICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfREFUQV84X0JJVFMgfCBNU1NfVUFSVF9OT19QQVJJVFkgfCBNU1NfVUFSVF9PTkVfU1RPUF9CSVQpOw0KICAgICAgICAgICAgICAgICAgIA0KICAgICBNU1NfVUFSVF9wb2xsZWRfdHhfc3RyaW5nKCZnX21zc191YXJ0MCwgbWVzc2FnZSk7DQogICAgIA0KICAgICByZXR1cm4oMCk7DQogIH0NCiAgQGVuZGNvZGUNCg0KICovDQp2b2lkDQpNU1NfVUFSVF9wb2xsZWRfdHhfc3RyaW5nDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICBjb25zdCB1aW50OF90ICogcF9zel9zdHJpbmcNCik7DQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIGZ1bmN0aW9uIE1TU19VQVJUX2lycV90eCgpIGlzIHVzZWQgdG8gaW5pdGlhdGUgYW4gaW50ZXJydXB0LWRyaXZlbg0KICB0cmFuc21pdC4gSXQgcmV0dXJucyBpbW1lZGlhdGVseSBhZnRlciBtYWtpbmcgYSBub3RlIG9mIHRoZSB0cmFuc21pdCBidWZmZXINCiAgbG9jYXRpb24gYW5kIGVuYWJsaW5nIHRyYW5zbWl0IGludGVycnVwdHMgYm90aCBhdCB0aGUgVUFSVCBhbmQgQ29ydGV4LU0zIE5WSUMNCiAgbGV2ZWwuIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBwb2ludGVyIHZpYSB0aGUgcGJ1ZmYgcGFyYW1ldGVyIHRvIGEgbWVtb3J5DQogIGJ1ZmZlciBjb250YWluaW5nIHRoZSBkYXRhIHRvIHRyYW5zbWl0LiBUaGUgbWVtb3J5IGJ1ZmZlciBzcGVjaWZpZWQgdGhyb3VnaA0KICB0aGlzIHBvaW50ZXIgbXVzdCByZW1haW4gYWxsb2NhdGVkIGFuZCBjb250YWluIHRoZSBkYXRhIHRvIHRyYW5zbWl0IHVudGlsDQogIHRoZSB0cmFuc21pdCBjb21wbGV0aW9uIGhhcyBiZWVuIGRldGVjdGVkIHRocm91Z2ggY2FsbHMgdG8gZnVuY3Rpb24NCiAgTVNTX1VBUlRfdHhfY29tcGxldGUoKS4gVGhlIGFjdHVhbCB0cmFuc21pc3Npb24gb3ZlciB0aGUgc2VyaWFsIGNvbm5lY3Rpb24NCiAgaXMgc3RpbGwgaW4gcHJvZ3Jlc3MgdW50aWwgY2FsbHMgdG8gdGhlIE1TU19VQVJUX3R4X2NvbXBsZXRlKCkgZnVuY3Rpb24NCiAgaW5kaWNhdGUgdHJhbnNtaXQgY29tcGxldGlvbi4NCg0KICBOb3RlOiAgICAgVGhlIE1TU19VQVJUX2lycV90eCgpIGZ1bmN0aW9uIGVuYWJsZXMgYm90aCB0aGUgdHJhbnNtaXQgaG9sZGluZw0KICByZWdpc3RlciBlbXB0eSAoVEhSRSkgaW50ZXJydXB0IGluIHRoZSBVQVJUIGFuZCB0aGUgTVNTIFVBUlQgaW5zdGFuY2UNCiAgaW50ZXJydXB0IGluIHRoZSBDb3J0ZXgtTTMgTlZJQyBhcyBwYXJ0IG9mIGl0cyBpbXBsZW1lbnRhdGlvbi4NCg0KICBOb3RlOiAgICAgVGhlIE1TU19VQVJUX2lycV90eCgpIGZ1bmN0aW9uIGFzc2lnbnMgYW4gaW50ZXJuYWwgZGVmYXVsdCB0cmFuc21pdA0KICBpbnRlcnJ1cHQgaGFuZGxlciBmdW5jdGlvbiB0byB0aGUgVUFSVJJzIFRIUkUgaW50ZXJydXB0LiBUaGlzIGludGVycnVwdA0KICBoYW5kbGVyIG92ZXJyaWRlcyBhbnkgY3VzdG9tIGludGVycnVwdCBoYW5kbGVyIHRoYXQgeW91IG1heSBoYXZlIHByZXZpb3VzbHkNCiAgcmVnaXN0ZXJlZCB1c2luZyB0aGUgTVNTX1VBUlRfc2V0X3R4X2hhbmRsZXIoKSBmdW5jdGlvbi4NCg0KICBOb3RlOiAgICAgVGhlIE1TU19VQVJUX2lycV90eCgpIGZ1bmN0aW9uknMgZGVmYXVsdCB0cmFuc21pdCBpbnRlcnJ1cHQNCiAgaGFuZGxlciBkaXNhYmxlcyB0aGUgVUFSVJJzIFRIUkUgaW50ZXJydXB0IHdoZW4gYWxsIG9mIHRoZSBkYXRhIGhhcw0KICBiZWVuIHRyYW5zZmVycmVkIHRvIHRoZSBVQVJUJ3MgdHJhbnNtaXQgRklGTy4NCg0KDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQoNCiAgQHBhcmFtIHBidWZmDQogICAgVGhlIHBidWZmIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YQ0KICAgIHRvIGJlIHRyYW5zbWl0dGVkLg0KDQogIEBwYXJhbSB0eF9zaXplDQogICAgVGhlIHR4X3NpemUgcGFyYW1ldGVyIHNwZWNpZmllcyB0aGUgc2l6ZSwgaW4gYnl0ZXMsIG9mIHRoZSBkYXRhDQogICAgdG8gYmUgdHJhbnNtaXR0ZWQuDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgI2luY2x1ZGUgIm1zc191YXJ0LmgiDQoNCiAgaW50IG1haW4odm9pZCkNCiAgew0KICAgICB1aW50OF90IHR4X2J1ZmZbMTBdID0gImFiY2RlZmdoaSI7DQogICAgIA0KICAgICBNU1NfVUFSVF9pbml0KCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF81NzYwMF9CQVVELA0KICAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsNCiAgICAgICAgICAgICAgICAgICANCiAgICAgTVNTX1VBUlRfaXJxX3R4KCZnX21zc191YXJ0MCwgdHhfYnVmZiwgc2l6ZW9mKHR4X2J1ZmYpKTsNCiAgICAgDQogICAgIHdoaWxlKDAgPT0gTVNTX1VBUlRfdHhfY29tcGxldGUoJmdfbXNzX3VhcnQwKSkNCiAgICAgew0KICAgICAgICAgOw0KICAgICB9DQogICAgIHJldHVybigwKTsNCiAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkDQpNU1NfVUFSVF9pcnFfdHgNCigNCiAgICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIGNvbnN0IHVpbnQ4X3QgKiBwYnVmZiwNCiAgICB1aW50MzJfdCB0eF9zaXplDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfdHhfY29tcGxldGUoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGZpbmQgb3V0IGlmIHRoZSBpbnRlcnJ1cHQtZHJpdmVuDQogIHRyYW5zbWl0IHByZXZpb3VzbHkgaW5pdGlhdGVkIHRocm91Z2ggYSBjYWxsIHRvIE1TU19VQVJUX2lycV90eCgpIGlzIGNvbXBsZXRlLg0KICBUaGlzIGlzIHR5cGljYWxseSB1c2VkIHRvIGZpbmQgb3V0IHdoZW4gaXQgaXMgc2FmZSB0byByZXVzZSBvciByZWxlYXNlIHRoZQ0KICBtZW1vcnkgYnVmZmVyIGhvbGRpbmcgdHJhbnNtaXQgZGF0YS4NCg0KICBOb3RlOiAgICAgVGhlIHRyYW5zZmVyIG9mIGFsbCBvZiB0aGUgZGF0YSBmcm9tIHRoZSBtZW1vcnkgYnVmZmVyIHRvIHRoZSBVQVJUknMNCiAgdHJhbnNtaXQgRklGTyBhbmQgdGhlIGFjdHVhbCB0cmFuc21pc3Npb24gb3ZlciB0aGUgc2VyaWFsIGNvbm5lY3Rpb24gYXJlIGJvdGgNCiAgY29tcGxldGUgd2hlbiBhIGNhbGwgdG8gdGhlIE1TU19VQVJUX3R4X2NvbXBsZXRlKCkgZnVuY3Rpb24gaW5kaWNhdGVzIHRyYW5zbWl0DQogIGNvbXBsZXRpb24uDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiByZXR1cm4gYSBub24temVybyB2YWx1ZSBpZiB0cmFuc21pdCBoYXMgY29tcGxldGVkLCBvdGhlcndpc2UNCiAgICBpdCByZXR1cm5zIHplcm8uDQoNCiAgRXhhbXBsZToNCiAgICBTZWUgdGhlIE1TU19VQVJUX2lycV90eCgpIGZ1bmN0aW9uIGZvciBhbiBleGFtcGxlIHRoYXQgdXNlcyB0aGUNCiAgICBNU1NfVUFSVF90eF9jb21wbGV0ZSgpIGZ1bmN0aW9uLg0KICovDQppbnQ4X3QNCk1TU19VQVJUX3R4X2NvbXBsZXRlDQooDQogICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0DQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfZ2V0X3J4KCkgZnVuY3Rpb24gcmVhZHMgdGhlIGNvbnRlbnQgb2YgdGhlIFVBUlQgcmVjZWl2ZXKScyBGSUZPDQogIGFuZCBzdG9yZXMgaXQgaW4gdGhlIHJlY2VpdmUgYnVmZmVyIHRoYXQgaXMgcGFzc2VkIHZpYSB0aGUgcnhfYnVmZiBmdW5jdGlvbg0KICBwYXJhbWV0ZXIuIEl0IGNvcGllcyBlaXRoZXIgdGhlIGZ1bGwgY29udGVudHMgb2YgdGhlIEZJRk8gaW50byB0aGUgcmVjZWl2ZQ0KICBidWZmZXIsIG9yIGp1c3QgZW5vdWdoIGRhdGEgZnJvbSB0aGUgRklGTyB0byBmaWxsIHRoZSByZWNlaXZlIGJ1ZmZlciwNCiAgZGVwZW5kZW50IHVwb24gdGhlIHNpemUgb2YgdGhlIHJlY2VpdmUgYnVmZmVyIHBhc3NlZCBieSB0aGUgYnVmZl9zaXplDQogIHBhcmFtZXRlci4gVGhlIE1TU19VQVJUX2dldF9yeCgpIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBjb3BpZWQNCiAgaW50byB0aGUgcmVjZWl2ZSBidWZmZXIgLlRoaXMgZnVuY3Rpb24gaXMgbm9uLWJsb2NraW5nIGFuZCB3aWxsIHJldHVybiAwDQogIGltbWVkaWF0ZWx5IGlmIG5vIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQuDQoNCiAgTm90ZTogICAgIFRoZSBNU1NfVUFSVF9nZXRfcngoKSBmdW5jdGlvbiByZWFkcyBhbmQgYWNjdW11bGF0ZXMgdGhlIHJlY2VpdmVyDQogIHN0YXR1cyBvZiB0aGUgTVNTIFVBUlQgaW5zdGFuY2UgYmVmb3JlIHJlYWRpbmcgZWFjaCBieXRlIGZyb20gdGhlIHJlY2VpdmVyJ3MNCiAgZGF0YSByZWdpc3Rlci9GSUZPLiBUaGlzIGFsbG93cyB0aGUgZHJpdmVyIHRvIG1haW50YWluIGEgc3RpY2t5IHJlY29yZCBvZiBhbnkNCiAgcmVjZWl2ZXIgZXJyb3JzIHRoYXQgb2NjdXIgYXMgdGhlIFVBUlQgcmVjZWl2ZXMgZWFjaCBkYXRhIGJ5dGU7IHJlY2VpdmVyDQogIGVycm9ycyB3b3VsZCBvdGhlcndpc2UgYmUgbG9zdCBhZnRlciBlYWNoIHJlYWQgZnJvbSB0aGUgcmVjZWl2ZXIncyBkYXRhIHJlZ2lzdGVyLg0KICBBIGNhbGwgdG8gdGhlIE1TU19VQVJUX2dldF9yeF9zdGF0dXMoKSBmdW5jdGlvbiByZXR1cm5zIGFueSByZWNlaXZlciBlcnJvcnMNCiAgYWNjdW11bGF0ZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgdGhlIE1TU19VQVJUX2dldF9yeCgpIGZ1bmN0aW9uLg0KDQogIE5vdGU6ICAgICBJZiB5b3UgbmVlZCB0byByZWFkIHRoZSBlcnJvciBzdGF0dXMgZm9yIGVhY2ggYnl0ZSByZWNlaXZlZCwgc2V0DQogIHRoZSBidWZmX3NpemUgdG8gMSBhbmQgcmVhZCB0aGUgcmVjZWl2ZSBsaW5lIGVycm9yIHN0YXR1cyBmb3IgZWFjaCBieXRlDQogIHVzaW5nIHRoZSBNU1NfVUFSVF9nZXRfcnhfc3RhdHVzKCkgZnVuY3Rpb24uDQogIFRoZSBNU1NfVUFSVF9nZXRfcngoKSBmdW5jdGlvbiBjYW4gYmUgdXNlZCBpbiBwb2xsZWQgbW9kZSwgd2hlcmUgaXQgaXMgY2FsbGVkDQogIGF0IHJlZ3VsYXIgaW50ZXJ2YWxzIHRvIGZpbmQgb3V0IGlmIGFueSBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLCBvciBpbiBpbnRlcnJ1cHQNCiAgZHJpdmVuLW1vZGUsIHdoZXJlIGl0IGlzIGNhbGxlZCBhcyBwYXJ0IG9mIGEgcmVjZWl2ZSBoYW5kbGVyIHRoYXQgaXMgY2FsbGVkDQogIGJ5IHRoZSBkcml2ZXIgYXMgYSByZXN1bHQgb2YgZGF0YSBiZWluZyByZWNlaXZlZC4NCg0KICBOb3RlOiAgICAgSW4gaW50ZXJydXB0IGRyaXZlbiBtb2RlIHlvdSBzaG91bGQgY2FsbCB0aGUgTVNTX1VBUlRfZ2V0X3J4KCkNCiAgZnVuY3Rpb24gYXMgcGFydCBvZiB0aGUgcmVjZWl2ZSBoYW5kbGVyIGZ1bmN0aW9uIHRoYXQgeW91IHJlZ2lzdGVyIHdpdGgNCiAgdGhlIE1TUyBVQVJUIGRyaXZlciB0aHJvdWdoIGEgY2FsbCB0byBNU1NfVUFSVF9zZXRfcnhfaGFuZGxlcigpLg0KDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQoNCiAgQHBhcmFtIHJ4X2J1ZmYNCiAgICBUaGUgcnhfYnVmZiBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGEgYnVmZmVyIHdoZXJlIHRoZSByZWNlaXZlZA0KICAgIGRhdGEgaXMgY29waWVkLg0KDQogIEBwYXJhbSBidWZmX3NpemUNCiAgICBUaGUgYnVmZl9zaXplIHBhcmFtZXRlciBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIHJlY2VpdmUgYnVmZmVyIGluIGJ5dGVzLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgY29waWVkIGludG8gdGhlDQogICAgcnhfYnVmZiBidWZmZXIuIEl0IHJldHVybnMgMCBpZiBubyBkYXRhIGhhcyBiZWVuIHJlY2VpdmVkLg0KDQogIFBvbGxlZCBtb2RlIGV4YW1wbGU6DQogIEBjb2RlDQogICBpbnQgbWFpbiggdm9pZCApDQogICB7DQogICAgICB1aW50OF90IHJ4X2J1ZmZbUlhfQlVGRl9TSVpFXTsNCiAgICAgIHVpbnQzMl90IHJ4X2lkeCAgPSAwOw0KDQogICAgICBNU1NfVUFSVF9pbml0KCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfREFUQV84X0JJVFMgfCBNU1NfVUFSVF9OT19QQVJJVFkgfCBNU1NfVUFSVF9PTkVfU1RPUF9CSVQpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgIHdoaWxlKDEpDQogICAgICB7DQogICAgICAgICAgcnhfc2l6ZSA9IE1TU19VQVJUX2dldF9yeCgmZ19tc3NfdWFydDAsIHJ4X2J1ZmYsIHNpemVvZihyeF9idWZmKSk7DQogICAgICAgICAgaWYocnhfc2l6ZSA+IDApDQogICAgICAgICAgew0KICAgICAgICAgICAgICBwcm9jZXNzX3J4X2RhdGEocnhfYnVmZiwgcnhfc2l6ZSk7DQogICAgICAgICAgfQ0KICAgICAgICAgIHRhc2tfYSgpOw0KICAgICAgICAgIHRhc2tfYigpOw0KICAgICAgfQ0KICAgICAgcmV0dXJuIDA7DQogICB9DQogIEBlbmRjb2RlDQoNCiAgSW50ZXJydXB0IGRyaXZlbiBleGFtcGxlOg0KICBAY29kZQ0KICAgaW50IG1haW4oIHZvaWQgKQ0KICAgew0KICAgICAgTVNTX1VBUlRfaW5pdCgmZ19tc3NfdWFydDEsDQogICAgICAgICAgICAgICAgICAgIE1TU19VQVJUXzU3NjAwX0JBVUQsDQogICAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsNCiAgICAgICAgICAgICAgICAgICAgDQogICAgICBNU1NfVUFSVF9zZXRfcnhfaGFuZGxlcigmZ19tc3NfdWFydDEsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1YXJ0MV9yeF9oYW5kbGVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfRklGT19TSU5HTEVfQllURSk7DQogICAgICANCiAgICAgIHdoaWxlKDEpDQogICAgICB7DQogICAgICAgICAgdGFza19hKCk7DQogICAgICAgICAgdGFza19iKCk7DQogICAgICB9DQogICAgICByZXR1cm4gMDsNCiAgIH0NCg0KICAgdm9pZCB1YXJ0MV9yeF9oYW5kbGVyKG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQpDQogICB7DQogICAgICB1aW50OF90IHJ4X2J1ZmZbUlhfQlVGRl9TSVpFXTsNCiAgICAgIHVpbnQzMl90IHJ4X2lkeCAgPSAwOw0KICAgICAgcnhfc2l6ZSA9IE1TU19VQVJUX2dldF9yeCh0aGlzX3VhcnQsIHJ4X2J1ZmYsIHNpemVvZihyeF9idWZmKSk7DQogICAgICBwcm9jZXNzX3J4X2RhdGEocnhfYnVmZiwgcnhfc2l6ZSk7DQogICB9DQogIEBlbmRjb2RlDQogKi8NCnNpemVfdA0KTVNTX1VBUlRfZ2V0X3J4DQooDQogICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgdWludDhfdCAqIHJ4X2J1ZmYsDQogICBzaXplX3QgYnVmZl9zaXplDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfc2V0X3J4X2hhbmRsZXIoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgcmVjZWl2ZSBoYW5kbGVyDQogIGZ1bmN0aW9uIHRoYXQgaXMgY2FsbGVkIGJ5IHRoZSBkcml2ZXIgd2hlbiBhIFVBUlQgcmVjZWl2ZSBkYXRhIGF2YWlsYWJsZSAoUkRBKQ0KICBpbnRlcnJ1cHQgb2NjdXJzLiBZb3UgbXVzdCBjcmVhdGUgYW5kIHJlZ2lzdGVyIHRoZSByZWNlaXZlIGhhbmRsZXIgZnVuY3Rpb24NCiAgdG8gc3VpdCB5b3VyIGFwcGxpY2F0aW9uIGFuZCBpdCBtdXN0IGluY2x1ZGUgYSBjYWxsIHRvIHRoZSBNU1NfVUFSVF9nZXRfcngoKQ0KICBmdW5jdGlvbiB0byBhY3R1YWxseSByZWFkIHRoZSByZWNlaXZlZCBkYXRhLg0KDQogIE5vdGU6ICAgICBUaGUgTVNTX1VBUlRfc2V0X3J4X2hhbmRsZXIoKSBmdW5jdGlvbiBlbmFibGVzIGJvdGggdGhlIFJEQQ0KICBpbnRlcnJ1cHQgaW4gdGhlIFVBUlQgYW5kIHRoZSBNU1MgVUFSVCBpbnN0YW5jZSBpbnRlcnJ1cHQgaW4gdGhlIENvcnRleC1NMw0KICBOVklDIGFzIHBhcnQNCiAgb2YgaXRzIGltcGxlbWVudGF0aW9uLg0KDQogIE5vdGU6ICAgICBZb3UgY2FuIGRpc2FibGUgdGhlIFJEQSBpbnRlcnJ1cHQgb25jZSB0aGUgZGF0YSBpcyByZWNlaXZlZCBieQ0KICBjYWxsaW5nIHRoZSBNU1NfVUFSVF9kaXNhYmxlX2lycSgpIGZ1bmN0aW9uLiBUaGlzIGlzIHlvdXIgY2hvaWNlIGFuZCBpcw0KICBkZXBlbmRlbnQgdXBvbiB5b3VyIGFwcGxpY2F0aW9uLg0KDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcGFyYW0gaGFuZGxlcg0KICAgIFRoZSBoYW5kbGVyIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSByZWNlaXZlIGludGVycnVwdCBoYW5kbGVyIGZ1bmN0aW9uDQogICAgcHJvdmlkZWQgYnkgeW91ciBhcHBsaWNhdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGFzIGEgcmVzdWx0IG9mIGEgVUFSVCBSREENCiAgICBpbnRlcnJ1cHQuIFRoaXMgaGFuZGxlciBmdW5jdGlvbiBtdXN0IGJlIG9mIHR5cGUgbXNzX3VhcnRfaXJxX2hhbmRsZXJfdC4NCg0KICBAcGFyYW0gdHJpZ2dlcl9sZXZlbA0KICAgIFRoZSB0cmlnZ2VyX2xldmVsIHBhcmFtZXRlciBpcyB0aGUgcmVjZWl2ZSBGSUZPIHRyaWdnZXIgbGV2ZWwuIFRoaXMNCiAgICBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG11c3QgYmUgcmVjZWl2ZWQgYmVmb3JlIHRoZSBVQVJUDQogICAgdHJpZ2dlcnMgYW4gUkRBIGludGVycnVwdC4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAjaW5jbHVkZSAibXNzX3VhcnQuaCINCg0KICAjZGVmaW5lIFJYX0JVRkZfU0laRSAgICA2NA0KDQogIHVpbnQ4X3QgZ19yeF9idWZmW1JYX0JVRkZfU0laRV07DQoNCiAgdm9pZCB1YXJ0MF9yeF9oYW5kbGVyKG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQpDQogIHsNCiAgICAgIE1TU19VQVJUX2dldF9yeCh0aGlzX3VhcnQsICZnX3J4X2J1ZmZbZ19yeF9pZHhdLCBzaXplb2YoZ19yeF9idWZmKSk7DQogIH0NCg0KICBpbnQgbWFpbih2b2lkKQ0KICB7DQogICAgICBNU1NfVUFSVF9pbml0KCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfREFUQV84X0JJVFMgfCBNU1NfVUFSVF9OT19QQVJJVFkgfCBNU1NfVUFSVF9PTkVfU1RPUF9CSVQpOw0KICAgICAgICAgICAgICAgICAgICANCiAgICAgIE1TU19VQVJUX3NldF9yeF9oYW5kbGVyKCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVhcnQwX3J4X2hhbmRsZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF9GSUZPX1NJTkdMRV9CWVRFKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgd2hpbGUoMSkNCiAgICAgIHsNCiAgICAgICAgIDsNCiAgICAgIH0NCiAgICAgIHJldHVybigwKTsNCiAgIH0NCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfc2V0X3J4X2hhbmRsZXINCigNCiAgICBtc3NfdWFydF9pbnN0YW5jZV90ICogICAgICAgdGhpc191YXJ0LA0KICAgIG1zc191YXJ0X2lycV9oYW5kbGVyX3QgICAgICAgICAgaGFuZGxlciwNCiAgICBtc3NfdWFydF9yeF90cmlnX2xldmVsX3QgICAgdHJpZ2dlcl9sZXZlbA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX3NldF9sb29wYmFjaygpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gbG9jYWxseSBsb29wYmFjayB0aGUgVHggYW5kDQogIFJ4IGxpbmVzIG9mIGEgVUFSVC4gVGhpcyBpcyBub3QgdG8gYmUgY29uZnVzZWQgd2l0aCB0aGUgbG9vcGJhY2sgb2YgVUFSVDANCiAgdG8gVUFSVDEsIHdoaWNoIGNhbiBiZSBhY2hpZXZlZCB0aHJvdWdoIHRoZSBtaWNyb2NvbnRyb2xsZXIgc3Vic3lzdGVtknMNCiAgc3lzdGVtIHJlZ2lzdGVycy4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEBwYXJhbSBsb29wYmFjaw0KICAgIFRoZSBsb29wYmFjayBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBVQVJUknMgdHJhbnNtaXQNCiAgICBhbmQgcmVjZWl2ZSBsaW5lcyBzaG91bGQgYmUgbG9vcGVkIGJhY2suIEFsbG93ZWQgdmFsdWVzIGFyZSBhcyBmb2xsb3dzOg0KICAgICAgLSBNU1NfVUFSVF9MT0NBTF9MT09QQkFDS19PTg0KICAgICAgLSBNU1NfVUFSVF9MT0NBTF9MT09QQkFDS19PRkYgDQogICAgICAtIE1TU19VQVJUX1JFTU9URV9MT09QQkFDS19PTg0KICAgICAgLSBNU1NfVUFSVF9SRU1PVEVfTE9PUEJBQ0tfT0ZGIA0KICAgICAgLSBNU1NfVUFSVF9BVVRPX0VDSE9fT04NCiAgICAgIC0gTVNTX1VBUlRfQVVUT19FQ0hPX09GRg0KICAgICAgDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgTVNTX1VBUlRfaW5pdCgmZ19tc3NfdWFydDAsDQogICAgICAgICAgICAgICAgICBNU1NfVUFSVF81NzYwMF9CQVVELA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfREFUQV84X0JJVFMgfCBNU1NfVUFSVF9OT19QQVJJVFkgfCBNU1NfVUFSVF9PTkVfU1RPUF9CSVQpOyANCg0KICAgICAgTVNTX1VBUlRfc2V0X2xvb3BiYWNrKCZnX21zc191YXJ0MCwgTVNTX1VBUlRfTE9DQUxfTE9PUEJBQ0tfT0ZGKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfc2V0X2xvb3BiYWNrDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqICAgdGhpc191YXJ0LA0KICAgIG1zc191YXJ0X2xvb3BiYWNrX3QgICAgIGxvb3BiYWNrDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfZW5hYmxlX2lycSgpIGZ1bmN0aW9uIGVuYWJsZXMgdGhlIE1TUyBVQVJUIGludGVycnVwdHMgc3BlY2lmaWVkDQogIGJ5IHRoZSBpcnFfbWFzayBwYXJhbWV0ZXIuIFRoZSBpcnFfbWFzayBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgTVNTIFVBUlQNCiAgaW50ZXJydXB0cyBieSBiaXQgcG9zaXRpb24sIGFzIGRlZmluZWQgaW4gdGhlIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKElFUikNCiAgb2YgTVNTIFVBUlQuIFRoZSBNU1MgVUFSVCBpbnRlcnJ1cHRzIGFuZCB0aGVpciBpZGVudGlmeWluZyBpcnFfbWFzayBiaXQNCiAgcG9zaXRpb25zIGFyZSBhcyBmb2xsb3dzOg0KICBXaGVuIGFuIGlycV9tYXNrIGJpdCBwb3NpdGlvbiBpcyBzZXQgdG8gMSwgdGhpcyBmdW5jdGlvbiBlbmFibGVzIHRoZQ0KICBjb3JyZXNwb25kaW5nIE1TUyBVQVJUIGludGVycnVwdCBpbiB0aGUgSUVSIHJlZ2lzdGVyLiBXaGVuIGFuIGlycV9tYXNrIGJpdA0KICBwb3NpdGlvbiBpcyBzZXQgdG8gMCwgdGhlIGNvcnJlc3BvbmRpbmcgaW50ZXJydXB0knMgc3RhdGUgcmVtYWlucyB1bmNoYW5nZWQgaW4NCiAgdGhlIElFUiByZWdpc3Rlci4NCiAgTm90ZTogVGhlIE1TU19VQVJUX2VuYWJsZV9pcnEoKSBmdW5jdGlvbiBhbHNvIGVuYWJsZXMgdGhlIE1TUyBVQVJUIGluc3RhbmNlDQogICAgICAgIGludGVycnVwdCBpbiB0aGUgQ29ydGV4LU0zIE5WSUMuDQogICAgICAgIA0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3Qgc3RydWN0dXJlDQogICAgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQNCiAgICBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLA0KICAgIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXINCiAgICB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDEgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUDQogICAgZHJpdmVyLg0KDQogIEBwYXJhbSBpcnFfbWFzaw0KICAgIFRoZSBpcnFfbWFzayBwYXJhbWV0ZXIgaXMgdXNlZCB0byBzZWxlY3Qgd2hpY2ggb2YgdGhlIE1TUyBVQVJUknMgaW50ZXJydXB0cw0KICAgIHlvdSB3YW50IHRvIGVuYWJsZS4gVGhlIGFsbG93ZWQgdmFsdWUgZm9yIHRoZSBpcnFfbWFzayBwYXJhbWV0ZXIgaXMgb25lIG9mDQogICAgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgb3IgYSBiaXR3aXNlIE9SIG9mIG1vcmUgdGhhbiBvbmU6DQogICAgICAtIE1TU19VQVJUX1JCRl9JUlEJCShiaXQgbWFzayA9IDB4MDAxKQ0KICAgICAgLSBNU1NfVUFSVF9UQkVfSVJRCQkoYml0IG1hc2sgPSAweDAwMikNCiAgICAgIC0gTVNTX1VBUlRfTFNfSVJRCQkoYml0IG1hc2sgPSAweDAwNCkNCiAgICAgIC0gTVNTX1VBUlRfTVNfSVJRCQkoYml0IG1hc2sgPSAweDAwOCkNCiAgICAgIC0gTVNTX1VBUlRfUlRPX0lSUQkJKGJpdCBtYXNrID0gMHgwMTApDQogICAgICAtIE1TU19VQVJUX05BQ0tfSVJRCShiaXQgbWFzayA9IDB4MDIwKQ0KICAgICAgLSBNU1NfVUFSVF9QSURQRV9JUlEJKGJpdCBtYXNrID0gMHgwNDApDQogICAgICAtIE1TU19VQVJUX0xJTkJfSVJRCQkoYml0IG1hc2sgPSAweDA4MCkNCiAgICAgIC0gTVNTX1VBUlRfTElOU19JUlEJCShiaXQgbWFzayA9IDB4MTAwKQ0KICAgICAgDQogIEByZXR1cm4NCiAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIE1TU19VQVJUX2VuYWJsZV9pcnEoJmdfbXNzX3VhcnQwLChNU1NfVUFSVF9SQkZfSVJRIHwgTVNTX1VBUlRfVEJFX0lSUSkpOw0KICBAZW5kY29kZQ0KICovDQp2b2lkDQpNU1NfVUFSVF9lbmFibGVfaXJxDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICBtc3NfdWFydF9pcnFfdCBpcnFfbWFzaw0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX2Rpc2FibGVfaXJxKCkgZnVuY3Rpb24gZGlzYWJsZXMgdGhlIE1TUyBVQVJUIGludGVycnVwdHMgc3BlY2lmaWVkDQogIGJ5IHRoZSBpcnFfbWFzayBwYXJhbWV0ZXIuIFRoZSBpcnFfbWFzayBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgTVNTIFVBUlQNCiAgaW50ZXJydXB0cyBieSBiaXQgcG9zaXRpb24sIGFzIGRlZmluZWQgaW4gdGhlIGludGVycnVwdCBlbmFibGUgcmVnaXN0ZXIgKElFUikNCiAgb2YgTVNTIFVBUlQuIFRoZSBNU1MgVUFSVCBpbnRlcnJ1cHRzIGFuZCB0aGVpciBpZGVudGlmeWluZyBiaXQgcG9zaXRpb25zIGFyZQ0KICBhcyBmb2xsb3dzOg0KICBXaGVuIGFuIGlycV9tYXNrIGJpdCBwb3NpdGlvbiBpcyBzZXQgdG8gMSwgdGhpcyBmdW5jdGlvbiBkaXNhYmxlcyB0aGUNCiAgY29ycmVzcG9uZGluZyBNU1MgVUFSVCBpbnRlcnJ1cHQgaW4gdGhlIElFUiByZWdpc3Rlci4gV2hlbiBhbiBpcnFfbWFzayBiaXQNCiAgcG9zaXRpb24gaXMgc2V0IHRvIDAsIHRoZSBjb3JyZXNwb25kaW5nIGludGVycnVwdJJzIHN0YXRlIHJlbWFpbnMgdW5jaGFuZ2VkIGluDQogIHRoZSBJRVIgcmVnaXN0ZXIuDQogIE5vdGU6IElmIHlvdSBkaXNhYmxlIGFsbCBmb3VyIG9mIHRoZSBVQVJUknMgaW50ZXJydXB0cywgdGhlDQogICAgICAgIE1TU19VQVJUX2Rpc2FibGVfaXJxKCkgZnVuY3Rpb24gYWxzbyBkaXNhYmxlcyB0aGUgTVNTIFVBUlQgaW5zdGFuY2UNCiAgICAgICAgaW50ZXJydXB0IGluIHRoZSBDb3J0ZXgtTTMgTlZJQy4NCiAgICAgICAgDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQoNCiAgQHBhcmFtIGlycV9tYXNrDQogICAgVGhlIGlycV9tYXNrIHBhcmFtZXRlciBpcyB1c2VkIHRvIHNlbGVjdCB3aGljaCBvZiB0aGUgTVNTIFVBUlSScyBpbnRlcnJ1cHRzDQogICAgeW91IHdhbnQgdG8gZGlzYWJsZS4gVGhlIGFsbG93ZWQgdmFsdWUgZm9yIHRoZSBpcnFfbWFzayBwYXJhbWV0ZXIgaXMgb25lIG9mDQogICAgdGhlIGZvbGxvd2luZyBjb25zdGFudHMgb3IgYSBiaXR3aXNlIE9SIG9mIG1vcmUgdGhhbiBvbmU6DQogICAgICAtIE1TU19VQVJUX1JCRl9JUlEgICAgKGJpdCBtYXNrID0gMHgwMDEpDQogICAgICAtIE1TU19VQVJUX1RCRV9JUlEgICAgKGJpdCBtYXNrID0gMHgwMDIpDQogICAgICAtIE1TU19VQVJUX0xTX0lSUSAgICAgKGJpdCBtYXNrID0gMHgwMDQpDQogICAgICAtIE1TU19VQVJUX01TX0lSUSAgICAgKGJpdCBtYXNrID0gMHgwMDgpDQogICAgICAtIE1TU19VQVJUX1JUT19JUlEgICAgKGJpdCBtYXNrID0gMHgwMTApDQogICAgICAtIE1TU19VQVJUX05BQ0tfSVJRICAgKGJpdCBtYXNrID0gMHgwMjApDQogICAgICAtIE1TU19VQVJUX1BJRFBFX0lSUSAgKGJpdCBtYXNrID0gMHgwNDApDQogICAgICAtIE1TU19VQVJUX0xJTkJfSVJRICAgKGJpdCBtYXNrID0gMHgwODApDQogICAgICAtIE1TU19VQVJUX0xJTlNfSVJRICAgKGJpdCBtYXNrID0gMHgxMDApDQogICAgICANCiAgQHJldHVybg0KICAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgTVNTX1VBUlRfZGlzYWJsZV9pcnEoJmdfbXNzX3VhcnQwLCAoTVNTX1VBUlRfUkJGX0lSUSB8IE1TU19VQVJUX1RCRV9JUlEpKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfZGlzYWJsZV9pcnENCigNCiAgICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIG1zc191YXJ0X2lycV90IGlycV9tYXNrDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfc2V0X3BpZHBlaV9oYW5kbGVyKCkgZnVuY3Rpb24gaXMgdXNlZCBhc3NpZ24gYSBjdXN0b20gaW50ZXJydXB0IA0KICBoYW5kbGVyIGZvciB0aGUgUElEUEVJIChQSUQgcGFyaXR5IGVycm9yIGludGVycnVwdCkgd2hlbiB0aGUgTVNTIFVBUlQgaXMgDQogIG9wZXJhdGluZyBpbiBMSU4gbW9kZS4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEBwYXJhbSBoYW5kbGVyDQogICAgVGhlIGhhbmRsZXIgcGFyYW1ldGVyIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBjdXN0b20gaGFuZGxlciBmdW5jdGlvbi4gDQogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBtc3NfdWFydF9pcnFfaGFuZGxlcl90Lg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgTVNTX1VBUlRfIHNldF9waWRwZWlfaGFuZGxlcigmZ19tc3NfdWFydDAsIG15X3BpZHBlaV9oYW5kbGVyKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfc2V0X3BpZHBlaV9oYW5kbGVyDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICBtc3NfdWFydF9pcnFfaGFuZGxlcl90IGhhbmRsZXINCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9zZXRfbGluYnJlYWtfaGFuZGxlciAoKSBmdW5jdGlvbiBpcyB1c2VkIGFzc2lnbiBhIGN1c3RvbSANCiAgaW50ZXJydXB0IGhhbmRsZXIgZm9yIHRoZSBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdCAgd2hlbiB0aGUgTVNTIFVBUlQgDQogIGlzIG9wZXJhdGluZyBpbiBMSU4gbW9kZS4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEBwYXJhbSBoYW5kbGVyDQogICAgVGhlIGhhbmRsZXIgcGFyYW1ldGVyIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBjdXN0b20gaGFuZGxlciBmdW5jdGlvbi4gDQogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBtc3NfdWFydF9pcnFfaGFuZGxlcl90Lg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIE1TU19VQVJUX3NldF9saW5icmVha19oYW5kbGVyKCZnX21zc191YXJ0MCwgbXlfYnJlYWtfaGFuZGxlcik7DQogIEBlbmRjb2RlDQogKi8NCnZvaWQNCk1TU19VQVJUX3NldF9saW5icmVha19oYW5kbGVyDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICBtc3NfdWFydF9pcnFfaGFuZGxlcl90IGhhbmRsZXINCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9zZXRfbGluc3luY19oYW5kbGVyKCkgZnVuY3Rpb24gaXMgdXNlZCBhc3NpZ24gYSBjdXN0b20gaW50ZXJydXB0IA0KICBoYW5kbGVyIGZvciB0aGUgTElOIFN5bmMgY2hhcmFjdGVyIGRldGVjdGlvbiBpbnRlcnJ1cHQgIHdoZW4gdGhlIE1TUyBVQVJUIA0KICBpcyBvcGVyYXRpbmcgaW4gTElOIG1vZGUuDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcGFyYW0gaGFuZGxlcg0KICAgIFRoZSBoYW5kbGVyIHBhcmFtZXRlciBpcyB0aGUgcG9pbnRlciB0byB0aGUgY3VzdG9tIGhhbmRsZXIgZnVuY3Rpb24uIA0KICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9mIHR5cGUgbXNzX3VhcnRfaXJxX2hhbmRsZXJfdC4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBNU1NfVUFSVF9zZXRfbGluc3luY19oYW5kbGVyKCZnX21zc191YXJ0MCwgbXlfbGluc3luY19oYW5kbGVyKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfc2V0X2xpbnN5bmNfaGFuZGxlcg0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQsDQogICAgbXNzX3VhcnRfaXJxX2hhbmRsZXJfdCBoYW5kbGVyDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfc2V0X25hY2tfaGFuZGxlcigpIGZ1bmN0aW9uIGlzIHVzZWQgYXNzaWduIGEgY3VzdG9tIGludGVycnVwdCANCiAgaGFuZGxlciBmb3IgdGhlIE5BQ0sgY2hhcmFjdGVyIGRldGVjdGlvbiBpbnRlcnJ1cHQgIHdoZW4gdGhlIE1TUyBVQVJUIA0KICBpcyBvcGVyYXRpbmcgaW4gU21hcnRjYXJkIG1vZGUuDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcGFyYW0gaGFuZGxlcg0KICAgIFRoZSBoYW5kbGVyIHBhcmFtZXRlciBpcyB0aGUgcG9pbnRlciB0byB0aGUgY3VzdG9tIGhhbmRsZXIgZnVuY3Rpb24uIA0KICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9mIHR5cGUgbXNzX3VhcnRfaXJxX2hhbmRsZXJfdC4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBNU1NfVUFSVF9zZXRfbmFja19oYW5kbGVyKCZnX21zc191YXJ0MCwgbXlfbmFja19oYW5kbGVyKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfc2V0X25hY2tfaGFuZGxlcg0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQsDQogICAgbXNzX3VhcnRfaXJxX2hhbmRsZXJfdCBoYW5kbGVyDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfc2V0X3J4X3RpbWVvdXRfaGFuZGxlcigpIGZ1bmN0aW9uIGlzIHVzZWQgYXNzaWduIGEgY3VzdG9tIA0KICBpbnRlcnJ1cHQgaGFuZGxlciBmb3IgdGhlIHJlY2VpdmVyIHRpbWVvdXQgaW50ZXJydXB0ICB3aGVuIHRoZSBNU1MgVUFSVCBpcyANCiAgb3BlcmF0aW5nIGluIG1vZGUuIEl0IGZpbmRzIGFwcGxpY2F0aW9uIGluIElyREEgbW9kZSBvZiBvcGVyYXRpb24uDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcGFyYW0gaGFuZGxlcg0KICAgIFRoZSBoYW5kbGVyIHBhcmFtZXRlciBpcyB0aGUgcG9pbnRlciB0byB0aGUgY3VzdG9tIGhhbmRsZXIgZnVuY3Rpb24uIA0KICAgIFRoaXMgcGFyYW1ldGVyIGlzIG9mIHR5cGUgbXNzX3VhcnRfaXJxX2hhbmRsZXJfdC4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBNU1NfVUFSVF9zZXRfcnhfdGltZW91dF9oYW5kbGVyKCZnX21zc191YXJ0MCwgbXlfcnh0aW1lb3V0X2hhbmRsZXIpOw0KICBAZW5kY29kZQ0KICovDQp2b2lkDQpNU1NfVUFSVF9zZXRfcnhfdGltZW91dF9oYW5kbGVyDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICBtc3NfdWFydF9pcnFfaGFuZGxlcl90IGhhbmRsZXINCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9zZXRfcnhzdGF0dXNfaGFuZGxlcigpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSByZWNlaXZlcg0KICBzdGF0dXMgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gYSBVQVJUIHJlY2VpdmVyDQogIGxpbmUgc3RhdHVzIChSTFMpIGludGVycnVwdCBvY2N1cnMuIFlvdSBtdXN0IGNyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIGhhbmRsZXINCiAgZnVuY3Rpb24gdG8gc3VpdCB5b3VyIGFwcGxpY2F0aW9uLg0KDQogIE5vdGU6ICAgICBUaGUgTVNTX1VBUlRfc2V0X3J4c3RhdHVzX2hhbmRsZXIoKSBmdW5jdGlvbiBlbmFibGVzIGJvdGggdGhlIFJMUw0KICBpbnRlcnJ1cHQgaW4gdGhlIFVBUlQgYW5kIHRoZSBNU1MgVUFSVCBpbnN0YW5jZSBpbnRlcnJ1cHQgaW4gdGhlIENvcnRleC1NMw0KICBOVklDIGFzIHBhcnQgb2YgaXRzIGltcGxlbWVudGF0aW9uLg0KDQogIE5vdGU6ICAgICBZb3UgY2FuIGRpc2FibGUgdGhlIFJMUyBpbnRlcnJ1cHQgd2hlbiByZXF1aXJlZCBieSBjYWxsaW5nIHRoZQ0KICBNU1NfVUFSVF9kaXNhYmxlX2lycSgpIGZ1bmN0aW9uLiBUaGlzIGlzIHlvdXIgY2hvaWNlIGFuZCBpcyBkZXBlbmRlbnQgdXBvbg0KICB5b3VyIGFwcGxpY2F0aW9uLg0KDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQoNCiAgQHBhcmFtIGhhbmRsZXINCiAgICAgVGhlIGhhbmRsZXIgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhIHJlY2VpdmVyIGxpbmUgc3RhdHVzIGludGVycnVwdA0KICAgICBoYW5kbGVyIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHlvdXIgYXBwbGljYXRpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBhcyBhDQogICAgIHJlc3VsdCBvZiBhIFVBUlQgUkxTIGludGVycnVwdC4gVGhpcyBoYW5kbGVyIGZ1bmN0aW9uIG11c3QgYmUgb2YgdHlwZQ0KICAgICBtc3NfdWFydF9pcnFfaGFuZGxlcl90Lg0KDQogIEByZXR1cm4NCiAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAjaW5jbHVkZSAibXNzX3VhcnQuaCINCg0KICB2b2lkIHVhcnRfcnhzdHNfaGFuZGxlcihtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0KQ0KICB7DQogICAgdWludDhfdCBzdGF0dXM7DQogICAgc3RhdHVzID0gTVNTX1VBUlRfZ2V0X3J4X3N0YXR1cyh0aGlzX3VhcnQpOw0KICAgIGlmKHN0YXR1cyAmIE1TU19VQVJUX09WRVJVTl9FUlJPUikNCiAgICB7DQogICAgICAgIGRpc2NhcmRfcnhfZGF0YSgpOw0KICAgIH0NCiAgfQ0KDQogIGludCBtYWluKHZvaWQpDQogIHsNCiAgICBNU1NfVUFSVF9pbml0KCAmZ19tc3NfdWFydDAsDQogICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUyB8IE1TU19VQVJUX05PX1BBUklUWSB8DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF9PTkVfU1RPUF9CSVQgKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIE1TU19VQVJUX3NldF9yeHN0YXR1c19oYW5kbGVyKCZnX21zc191YXJ0MCwgdWFydF9yeHN0c19oYW5kbGVyKTsNCg0KICAgIHdoaWxlKDEpDQogICAgew0KICAgICAgICA7DQogICAgfQ0KICAgIHJldHVybigwKTsNCiAgfQ0KICBAZW5kY29kZQ0KICovDQp2b2lkDQpNU1NfVUFSVF9zZXRfcnhzdGF0dXNfaGFuZGxlcg0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQsDQogICAgbXNzX3VhcnRfaXJxX2hhbmRsZXJfdCBoYW5kbGVyDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfc2V0X3R4X2hhbmRsZXIoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlZ2lzdGVyIGEgdHJhbnNtaXQgaGFuZGxlcg0KICBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gYSBVQVJUIHRyYW5zbWl0IGhvbGRpbmcgcmVnaXN0ZXINCiAgZW1wdHkgKFRIUkUpIGludGVycnVwdCBvY2N1cnMuIFlvdSBtdXN0IGNyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIHRyYW5zbWl0DQogIGhhbmRsZXIgZnVuY3Rpb24gdG8gc3VpdCB5b3VyIGFwcGxpY2F0aW9uLiBZb3UgY2FuIHVzZSB0aGUNCiAgTVNTX1VBUlRfZmlsbF90eF9maWZvKCkgZnVuY3Rpb24gaW4geW91ciB0cmFuc21pdCBoYW5kbGVyIGZ1bmN0aW9uIHRvDQogIHdyaXRlIGRhdGEgdG8gdGhlIHRyYW5zbWl0dGVyLg0KDQogIE5vdGU6ICAgICBUaGUgTVNTX1VBUlRfc2V0X3R4X2hhbmRsZXIoKSBmdW5jdGlvbiBlbmFibGVzIGJvdGggdGhlIFRIUkUNCiAgaW50ZXJydXB0IGluIHRoZSBVQVJUIGFuZCB0aGUgTVNTIFVBUlQgaW5zdGFuY2UgaW50ZXJydXB0IGluIHRoZSBDb3J0ZXgtTTMNCiAgTlZJQyBhcyBwYXJ0IG9mIGl0cyBpbXBsZW1lbnRhdGlvbi4NCg0KICBOb3RlOiAgICAgWW91IGNhbiBkaXNhYmxlIHRoZSBUSFJFIGludGVycnVwdCB3aGVuIHJlcXVpcmVkIGJ5IGNhbGxpbmcgdGhlDQogIE1TU19VQVJUX2Rpc2FibGVfaXJxKCkgZnVuY3Rpb24uIFRoaXMgaXMgeW91ciBjaG9pY2UgYW5kIGlzIGRlcGVuZGVudCB1cG9uDQogIHlvdXIgYXBwbGljYXRpb24uDQoNCiAgTm90ZTogICAgIFRoZSBNU1NfVUFSVF9pcnFfdHgoKSBmdW5jdGlvbiBkb2VzIG5vdCB1c2UgdGhlIHRyYW5zbWl0IGhhbmRsZXINCiAgZnVuY3Rpb24gdGhhdCB5b3UgcmVnaXN0ZXIgd2l0aCB0aGUgTVNTX1VBUlRfc2V0X3R4X2hhbmRsZXIoKSBmdW5jdGlvbi4NCiAgSXQgdXNlcyBpdHMgb3duIGludGVybmFsIFRIUkUgaW50ZXJydXB0IGhhbmRsZXIgZnVuY3Rpb24gdGhhdCBvdmVycmlkZXMNCiAgYW55IGN1c3RvbSBpbnRlcnJ1cHQgaGFuZGxlciB0aGF0IHlvdSByZWdpc3RlciB1c2luZyB0aGUNCiAgTVNTX1VBUlRfc2V0X3R4X2hhbmRsZXIoKSBmdW5jdGlvbi4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogICBAcGFyYW0gaGFuZGxlcg0KICAgICBUaGUgaGFuZGxlciBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGEgdHJhbnNtaXQgaW50ZXJydXB0IGhhbmRsZXINCiAgICAgZnVuY3Rpb24gcHJvdmlkZWQgYnkgeW91ciBhcHBsaWNhdGlvbiB0aGF0IHdpbGwgYmUgY2FsbGVkIGFzIGEgcmVzdWx0DQogICAgIG9mIGEgVUFSVCBUSFJFIGludGVycnVwdC4gVGhpcyBoYW5kbGVyIGZ1bmN0aW9uIG11c3QgYmUgb2YgdHlwZQ0KICAgICBtc3NfdWFydF9pcnFfaGFuZGxlcl90Lg0KDQogICBAcmV0dXJuDQogICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQoNCiAgIEV4YW1wbGU6DQogICBAY29kZQ0KICAgICNpbmNsdWRlICJtc3NfdWFydC5oIg0KDQogICAgdWludDhfdCAqIGdfdHhfYnVmZmVyOw0KICAgIHNpemVfdCBnX3R4X3NpemUgPSAwOw0KDQogICAgdm9pZCB1YXJ0X3R4X2hhbmRsZXIobXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCkNCiAgICB7DQogICAgICAgIHNpemVfdCBzaXplX2luX2ZpZm87DQogICAgICAgIHNpemVfaW5fZmlmbyA9IE1TU19VQVJUX2ZpbGxfdHhfZmlmbyh0aGlzX3VhcnQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKWdfdHhfYnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ190eF9zaXplKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICBpZihzaXplX2luX2ZpZm8gID09ICBnX3R4X3NpemUpDQogICAgICAgIHsNCiAgICAgICAgICAgIGdfdHhfc2l6ZSA9IDA7DQogICAgICAgICAgICBNU1NfVUFSVF9kaXNhYmxlX2lycSh0aGlzX3VhcnQsIE1TU19VQVJUX1RCRV9JUlEpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgICAgZ190eF9idWZmZXIgPSAmZ190eF9idWZmZXJbc2l6ZV9pbl9maWZvXTsNCiAgICAgICAgICAgIGdfdHhfc2l6ZSA9IGdfdHhfc2l6ZSAtIHNpemVfaW5fZmlmbzsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIGludCBtYWluKHZvaWQpDQogICAgew0KICAgICAgICB1aW50OF90IG1lc3NhZ2VbMTJdID0gIkhlbGxvIHdvcmxkIjsNCg0KICAgICAgICBNU1NfVUFSVF9pbml0KCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF81NzYwMF9CQVVELA0KICAgICAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU1NfVUFSVF9PTkVfU1RPUF9CSVQpOw0KDQogICAgICAgIGdfdHhfYnVmZmVyID0gbWVzc2FnZTsNCiAgICAgICAgZ190eF9zaXplID0gc2l6ZW9mKG1lc3NhZ2UpOw0KDQogICAgICAgIE1TU19VQVJUX3NldF90eF9oYW5kbGVyKCZnX21zc191YXJ0MCwgdWFydF90eF9oYW5kbGVyKTsNCg0KICAgICAgICB3aGlsZSgxKQ0KICAgICAgICB7DQogICAgICAgICAgICA7DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuKDApOw0KICAgIH0NCiAgIEBlbmRjb2RlDQogKi8NCnZvaWQNCk1TU19VQVJUX3NldF90eF9oYW5kbGVyDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICBtc3NfdWFydF9pcnFfaGFuZGxlcl90IGhhbmRsZXINCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9zZXRfbW9kZW1zdGF0dXNfaGFuZGxlcigpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmVnaXN0ZXIgYSBtb2RlbQ0KICBzdGF0dXMgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCBieSB0aGUgZHJpdmVyIHdoZW4gYSBVQVJUIG1vZGVtIHN0YXR1cw0KICAoTVMpIGludGVycnVwdCBvY2N1cnMuIFlvdSBtdXN0IGNyZWF0ZSBhbmQgcmVnaXN0ZXIgdGhlIGhhbmRsZXIgZnVuY3Rpb24gdG8NCiAgc3VpdCB5b3VyIGFwcGxpY2F0aW9uLg0KDQogIE5vdGU6ICAgICBUaGUgTVNTX1VBUlRfc2V0X21vZGVtc3RhdHVzX2hhbmRsZXIoKSBmdW5jdGlvbiBlbmFibGVzIGJvdGggdGhlIE1TDQogIGludGVycnVwdCBpbiB0aGUgVUFSVCBhbmQgdGhlIE1TUyBVQVJUIGluc3RhbmNlIGludGVycnVwdCBpbiB0aGUgQ29ydGV4LU0zIE5WSUMNCiAgYXMgcGFydCBvZiBpdHMgaW1wbGVtZW50YXRpb24uDQoNCiAgTm90ZTogICAgIFlvdSBjYW4gZGlzYWJsZSB0aGUgTVMgaW50ZXJydXB0IHdoZW4gcmVxdWlyZWQgYnkgY2FsbGluZyB0aGUNCiAgTVNTX1VBUlRfZGlzYWJsZV9pcnEoKSBmdW5jdGlvbi4gVGhpcyBpcyB5b3VyIGNob2ljZSBhbmQgaXMgZGVwZW5kZW50DQogIHVwb24geW91ciBhcHBsaWNhdGlvbi4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogICBAcGFyYW0gaGFuZGxlcg0KICAgICBUaGUgaGFuZGxlciBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGEgbW9kZW0gc3RhdHVzIGludGVycnVwdCBoYW5kbGVyDQogICAgIGZ1bmN0aW9uIHByb3ZpZGVkIGJ5IHlvdXIgYXBwbGljYXRpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBhcyBhIHJlc3VsdA0KICAgICBvZiBhIFVBUlQgTVMgaW50ZXJydXB0LiBUaGlzIGhhbmRsZXIgZnVuY3Rpb24gbXVzdCBiZSBvZiB0eXBlDQogICAgIG1zc191YXJ0X2lycV9oYW5kbGVyX3QuDQoNCiAgIEByZXR1cm4NCiAgICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICAgRXhhbXBsZToNCiAgIEBjb2RlDQogICAjaW5jbHVkZSAibXNzX3VhcnQuaCINCg0KICAgdm9pZCB1YXJ0X21vZGVtX2hhbmRsZXIobXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCkNCiAgIHsNCiAgICAgdWludDhfdCBzdGF0dXM7DQogICAgIHN0YXR1cyA9IE1TU19VQVJUX2dldF9tb2RlbV9zdGF0dXModGhpc191YXJ0KTsNCiAgICAgaWYoc3RhdHVzICYgTVNTX1VBUlRfQ1RTKQ0KICAgICB7DQogICAgICAgIHVhcnRfY3RzX2hhbmRsZXIoKTsNCiAgICAgfQ0KICAgfQ0KDQogICBpbnQgbWFpbih2b2lkKQ0KICAgew0KICAgICAgTVNTX1VBUlRfaW5pdCgmZ19tc3NfdWFydDAsDQogICAgICAgICAgICAgICAgICAgIE1TU19VQVJUXzU3NjAwX0JBVUQsDQogICAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1TU19VQVJUX09ORV9TVE9QX0JJVCk7DQogICAgICBNU1NfVUFSVF9zZXRfbW9kZW1zdGF0dXNfaGFuZGxlcigmZ19tc3NfdWFydDAsIHVhcnRfbW9kZW1faGFuZGxlcik7DQoNCiAgICAgIHdoaWxlKDEpDQogICAgICB7DQogICAgICAgIDsNCiAgICAgIH0NCiAgICAgIHJldHVybigwKTsNCiAgIH0NCiAgIEBlbmRjb2RlDQogKi8NCg0Kdm9pZA0KTVNTX1VBUlRfc2V0X21vZGVtc3RhdHVzX2hhbmRsZXINCigNCiAgICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIG1zc191YXJ0X2lycV9oYW5kbGVyX3QgaGFuZGxlcg0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX2ZpbGxfdHhfZmlmbygpIGZ1bmN0aW9uIGZpbGxzIHRoZSBVQVJUJ3MgaGFyZHdhcmUgdHJhbnNtaXR0ZXINCiAgRklGTyB3aXRoIHRoZSBkYXRhIGZvdW5kIGluIHRoZSB0cmFuc21pdHRlciBidWZmZXIgdGhhdCBpcyBwYXNzZWQgdmlhIHRoZQ0KICB0eF9idWZmZXIgZnVuY3Rpb24gcGFyYW1ldGVyLiBJZiB0aGUgdHJhbnNtaXR0ZXIgRklGTyBpcyBub3QgZW1wdHkgd2hlbg0KICB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseSB3aXRob3V0IHRyYW5zZmVycmluZw0KICBhbnkgZGF0YSB0byB0aGUgRklGTzsgb3RoZXJ3aXNlLCB0aGUgZnVuY3Rpb24gdHJhbnNmZXJzIGRhdGEgZnJvbSB0aGUNCiAgdHJhbnNtaXR0ZXIgYnVmZmVyIHRvIHRoZSBGSUZPIHVudGlsIGl0IGlzIGZ1bGwgb3IgdW50aWwgdGhlIGNvbXBsZXRlDQogIGNvbnRlbnRzIG9mIHRoZSB0cmFuc21pdHRlciBidWZmZXIgaGF2ZSBiZWVuIGNvcGllZCBpbnRvIHRoZSBGSUZPLiBUaGUNCiAgZnVuY3Rpb24gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvcGllZCBpbnRvIHRoZSBVQVJUJ3MgdHJhbnNtaXR0ZXIgRklGTy4NCg0KICBOb3RlOiAgICAgVGhpcyBmdW5jdGlvbiByZWFkcyB0aGUgVUFSVJJzIGxpbmUgc3RhdHVzIHJlZ2lzdGVyIChMU1IpIHRvIGNoZWNrDQogIGZvciB0aGUgYWN0aXZlIHN0YXRlIG9mIHRoZSB0cmFuc21pdHRlciBob2xkaW5nIHJlZ2lzdGVyIGVtcHR5IChUSFJFKSBiaXQNCiAgYmVmb3JlIHRyYW5zZmVycmluZyBkYXRhIGZyb20gdGhlIGRhdGEgYnVmZmVyIHRvIHRoZSB0cmFuc21pdHRlciBGSUZPLiBJZg0KICBUSFJFIGlzIDAsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5LCB3aXRob3V0IHRyYW5zZmVycmluZyBhbnkgZGF0YQ0KICB0byB0aGUgRklGTy4gSWYgVEhSRSBpcyAxLCB0aGUgZnVuY3Rpb24gdHJhbnNmZXJzIHVwIHRvIDE2IGJ5dGVzIG9mIGRhdGENCiAgdG8gdGhlIEZJRk8gYW5kIHRoZW4gcmV0dXJucy4NCg0KICBOb3RlOiAgICAgVGhlIGFjdHVhbCB0cmFuc21pc3Npb24gb3ZlciB0aGUgc2VyaWFsIGNvbm5lY3Rpb24gd2lsbCBzdGlsbCBiZQ0KICBpbiBwcm9ncmVzcyB3aGVuIHRoaXMgZnVuY3Rpb24gcmV0dXJucy4gVXNlIHRoZSBNU1NfVUFSVF9nZXRfdHhfc3RhdHVzKCkNCiAgZnVuY3Rpb24gaWYgeW91IG5lZWQgdG8ga25vdyB3aGVuIHRoZSB0cmFuc21pdHRlciBpcyBlbXB0eS4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEBwYXJhbSB0eF9idWZmZXINCiAgICBUaGUgdHhfYnVmZmVyIHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYSBidWZmZXIgY29udGFpbmluZyB0aGUgZGF0YQ0KICAgIHRvIGJlIHRyYW5zbWl0dGVkLg0KDQogIEBwYXJhbSB0eF9zaXplDQogICAgVGhlIHR4X3NpemUgcGFyYW1ldGVyIGlzIHRoZSBzaXplIGluIGJ5dGVzLCBvZiB0aGUgZGF0YSB0byBiZSB0cmFuc21pdHRlZC4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgY29waWVkIGludG8gdGhlIFVBUlQncw0KICAgIHRyYW5zbWl0dGVyIEZJRk8uDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICAgdm9pZCBzZW5kX3VzaW5nX2ludGVycnVwdCh1aW50OF90ICogcGJ1ZmYsIHNpemVfdCB0eF9zaXplKQ0KICAgICB7DQogICAgICAgIHNpemVfdCBzaXplX2luX2ZpZm87DQogICAgICAgIHNpemVfaW5fZmlmbyA9IE1TU19VQVJUX2ZpbGxfdHhfZmlmbygmZ19tc3NfdWFydDAsIHBidWZmLCB0eF9zaXplKTsNCiAgICAgfQ0KICBAZW5kY29kZQ0KICovDQpzaXplX3QNCk1TU19VQVJUX2ZpbGxfdHhfZmlmbw0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQsDQogICAgY29uc3QgdWludDhfdCAqIHR4X2J1ZmZlciwNCiAgICBzaXplX3QgdHhfc2l6ZQ0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX2dldF9yeF9zdGF0dXMoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSByZWNlaXZlciBlcnJvciBzdGF0dXMgb2YgdGhlDQogIE1TUyBVQVJUIGluc3RhbmNlLiBJdCByZWFkcyBib3RoIHRoZSBjdXJyZW50IGVycm9yIHN0YXR1cyBvZiB0aGUgcmVjZWl2ZXIgZnJvbQ0KICB0aGUgVUFSVJJzIGxpbmUgc3RhdHVzIHJlZ2lzdGVyIChMU1IpIGFuZCB0aGUgYWNjdW11bGF0ZWQgZXJyb3Igc3RhdHVzIGZyb20NCiAgcHJlY2VkaW5nIGNhbGxzIHRvIHRoZSBNU1NfVUFSVF9nZXRfcngoKSBmdW5jdGlvbiwgYW5kIGl0IGNvbWJpbmVzIHRoZW0gdXNpbmcNCiAgYSBiaXR3aXNlIE9SLiBJdCByZXR1cm5zIHRoZSBjdW11bGF0aXZlIG92ZXJydW4sIHBhcml0eSwgZnJhbWluZywgYnJlYWsgYW5kDQogIEZJRk8gZXJyb3Igc3RhdHVzIG9mIHRoZSByZWNlaXZlciwgc2luY2UgdGhlIHByZXZpb3VzIGNhbGwgdG8NCiAgTVNTX1VBUlRfZ2V0X3J4X3N0YXR1cygpLCBhcyBhbiA4LWJpdCBlbmNvZGVkIHZhbHVlLg0KDQogIE5vdGU6ICAgICBUaGUgTVNTX1VBUlRfZ2V0X3J4KCkgZnVuY3Rpb24gcmVhZHMgYW5kIGFjY3VtdWxhdGVzIHRoZSByZWNlaXZlcg0KICBzdGF0dXMgb2YgdGhlIE1TUyBVQVJUIGluc3RhbmNlIGJlZm9yZSByZWFkaW5nIGVhY2ggYnl0ZSBmcm9tIHRoZSByZWNlaXZlcpJzDQogIGRhdGEgcmVnaXN0ZXIvRklGTy4gVGhlIGRyaXZlciBtYWludGFpbnMgYSBzdGlja3kgcmVjb3JkIG9mIHRoZSBjdW11bGF0aXZlDQogIHJlY2VpdmVyIGVycm9yIHN0YXR1cywgd2hpY2ggcGVyc2lzdHMgYWZ0ZXIgdGhlIE1TU19VQVJUX2dldF9yeCgpIGZ1bmN0aW9uDQogIHJldHVybnMuIFRoZSBNU1NfVUFSVF9nZXRfcnhfc3RhdHVzKCkgZnVuY3Rpb24gY2xlYXJzIHRoZSBkcml2ZXKScyBzdGlja3kNCiAgcmVjZWl2ZXIgZXJyb3IgcmVjb3JkIGJlZm9yZSByZXR1cm5pbmcuDQoNCiAgTm90ZTogICAgIFRoZSBkcml2ZXKScyB0cmFuc21pdCBmdW5jdGlvbnMgYWxzbyByZWFkIHRoZSBsaW5lIHN0YXR1cw0KICByZWdpc3RlciAoTFNSKSBhcyBwYXJ0IG9mIHRoZWlyIGltcGxlbWVudGF0aW9uLiBXaGVuIHRoZSBkcml2ZXIgcmVhZHMgdGhlDQogIExTUiwgdGhlIFVBUlQgY2xlYXJzIGFueSBhY3RpdmUgcmVjZWl2ZXIgZXJyb3IgYml0cyBpbiB0aGUgTFNSLiBUaGlzIGNvdWxkDQogIHJlc3VsdCBpbiB0aGUgZHJpdmVyIGxvc2luZyByZWNlaXZlciBlcnJvcnMuIFRvIGF2b2lkIGFueSBsb3NzIG9mIHJlY2VpdmVyDQogIGVycm9ycywgdGhlIHRyYW5zbWl0IGZ1bmN0aW9ucyBhbHNvIHVwZGF0ZSB0aGUgZHJpdmVyknMgc3RpY2t5IHJlY29yZCBvZiB0aGUNCiAgY3VtdWxhdGl2ZSByZWNlaXZlciBlcnJvciBzdGF0dXMgd2hlbmV2ZXIgdGhleSByZWFkIHRoZSBMU1IuDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBVQVJUknMgcmVjZWl2ZXIgZXJyb3Igc3RhdHVzIGFzIGFuIDgtYml0IHVuc2lnbmVkDQogICAgaW50ZWdlci4gVGhlIHJldHVybmVkIHZhbHVlIGlzIDAgaWYgbm8gcmVjZWl2ZXIgZXJyb3JzIG9jY3VycmVkLiBUaGUgZHJpdmVyDQogICAgcHJvdmlkZXMgYSBzZXQgb2YgYml0IG1hc2sgY29uc3RhbnRzIHRoYXQgc2hvdWxkIGJlIGNvbXBhcmVkIHdpdGggYW5kL29yDQogICAgdXNlZCB0byBtYXNrIHRoZSByZXR1cm5lZCB2YWx1ZSB0byBkZXRlcm1pbmUgdGhlIHJlY2VpdmVyIGVycm9yIHN0YXR1cy4NCiAgICBXaGVuIHRoZSByZXR1cm4gdmFsdWUgaXMgY29tcGFyZWQgdG8gdGhlIGZvbGxvd2luZyBiaXQgbWFza3MsIGEgbm9uLXplcm8NCiAgICByZXN1bHQgaW5kaWNhdGVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgZXJyb3Igb2NjdXJyZWQ6DQogICAgICAgIJUgICBNU1NfVUFSVF9PVkVSUlVOX0VSUk9SICAgICAgKGJpdCBtYXNrID0gMHgwMikNCiAgICAgICAglSAgIE1TU19VQVJUX1BBUklUWV9FUlJPUiAgICAgICAoYml0IG1hc2sgPSAweDA0KQ0KICAgICAgICCVICAgTVNTX1VBUlRfRlJBTUlOR19FUlJPUiAgICAgIChiaXQgbWFzayA9IDB4MDgpDQogICAgICAgIJUgICBNU1NfVUFSVF9CUkVBS19FUlJPUiAgICAgICAgKGJpdCBtYXNrID0gMHgxMCkNCiAgICAgICAglSAgIE1TU19VQVJUX0ZJRk9fRVJST1IgICAgIChiaXQgbWFzayA9IDB4ODApDQogICAgV2hlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGNvbXBhcmVkIHRvIHRoZSBmb2xsb3dpbmcgYml0IG1hc2ssIGEgbm9uLXplcm8NCiAgICByZXN1bHQgaW5kaWNhdGVzIHRoYXQgbm8gZXJyb3Igb2NjdXJyZWQ6DQogICAgICAgIJUgICBNU1NfVUFSVF9OT19FUlJPUiAgICAgICAoYml0IG1hc2sgPSAweDAwKQ0KICAgIFVwb24gdW5zdWNjZXNzZnVsIGV4ZWN1dGlvbiwgdGhpcyBmdW5jdGlvbiByZXR1cm5zOg0KICAgICAgICCVICAgTVNTX1VBUlRfSU5WQUxJRF9QQVJBTSAgICAgIChiaXQgbWFzayA9IDB4RkYpDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICB1aW50OF90IHJ4X2RhdGFbTUFYX1JYX0RBVEFfU0laRV07DQogICAgdWludDhfdCBlcnJfc3RhdHVzOw0KICAgIGVycl9zdGF0dXMgPSBNU1NfVUFSVF9nZXRfcnhfc3RhdHVzKCZnX21zc191YXJ0MCk7DQoNCiAgICBpZihNU1NfVUFSVF9OT19FUlJPUiA9PSBlcnJfc3RhdHVzKQ0KICAgIHsNCiAgICAgICByeF9zaXplID0gTVNTX1VBUlRfZ2V0X3J4KCZnX21zc191YXJ0MCwgcnhfZGF0YSwgTUFYX1JYX0RBVEFfU0laRSk7DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp1aW50OF90DQpNU1NfVUFSVF9nZXRfcnhfc3RhdHVzDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX2dldF9tb2RlbV9zdGF0dXMoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSBtb2RlbSBzdGF0dXMgb2YgdGhlDQogIE1TUyBVQVJUIGluc3RhbmNlLiBJdCByZWFkcyB0aGUgbW9kZW0gc3RhdHVzIHJlZ2lzdGVyIChNU1IpIGFuZCByZXR1cm5zDQogIHRoZSA4IGJpdCB2YWx1ZS4gVGhlIGJpdCBlbmNvZGluZyBvZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgZXhhY3RseSB0aGUNCiAgc2FtZSBhcyB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYml0cyBpbiB0aGUgTVNSLg0KDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBjdXJyZW50IHN0YXRlIG9mIHRoZSBVQVJUJ3MgTVNSIGFzIGFuIDggYml0DQogICAgdW5zaWduZWQgaW50ZWdlci4gVGhlIGRyaXZlciBwcm92aWRlcyB0aGUgZm9sbG93aW5nIHNldCBvZiBiaXQgbWFzaw0KICAgIGNvbnN0YW50cyB0aGF0IHNob3VsZCBiZSBjb21wYXJlZCB3aXRoIGFuZC9vciB1c2VkIHRvIG1hc2sgdGhlDQogICAgcmV0dXJuZWQgdmFsdWUgdG8gZGV0ZXJtaW5lIHRoZSBtb2RlbSBzdGF0dXM6DQogICAgICAgIJUgICBNU1NfVUFSVF9EQ1RTICAgKGJpdCBtYXNrID0gMHgwMSkNCiAgICAgICAglSAgIE1TU19VQVJUX0REU1IgICAoYml0IG1hc2sgPSAweDAyKQ0KICAgICAgICCVICAgTVNTX1VBUlRfVEVSSSAgIChiaXQgbWFzayA9IDB4MDQpDQogICAgICAgIJUgICBNU1NfVUFSVF9ERENEICAgKGJpdCBtYXNrID0gMHgwOCkNCiAgICAgICAglSAgIE1TU19VQVJUX0NUUyAgICAoYml0IG1hc2sgPSAweDEwKQ0KICAgICAgICCVICAgTVNTX1VBUlRfRFNSICAgIChiaXQgbWFzayA9IDB4MjApDQogICAgICAgIJUgICBNU1NfVUFSVF9SSSAgICAgKGJpdCBtYXNrID0gMHg0MCkNCiAgICAgICAglSAgIE1TU19VQVJUX0RDRCAgICAoYml0IG1hc2sgPSAweDgwKQ0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgdm9pZCB1YXJ0X21vZGVtX3N0YXR1c19pc3IobXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCkNCiAgICB7DQogICAgICAgIHVpbnQ4X3Qgc3RhdHVzOw0KICAgICAgICBzdGF0dXMgPSBNU1NfVUFSVF9nZXRfbW9kZW1fc3RhdHVzKHRoaXNfdWFydCk7DQogICAgICAgIGlmKCBzdGF0dXMgJiBNU1NfVUFSVF9EQ1RTICkNCiAgICAgICAgew0KICAgICAgICAgICAgdWFydF9kY3RzX2hhbmRsZXIoKTsNCiAgICAgICAgfQ0KICAgICAgICBpZiggc3RhdHVzICYgTVNTX1VBUlRfQ1RTICkNCiAgICAgICAgew0KICAgICAgICAgICAgdWFydF9jdHNfaGFuZGxlcigpOw0KICAgICAgICB9DQogICAgfQ0KICBAZW5kY29kZQ0KICovDQp1aW50OF90DQpNU1NfVUFSVF9nZXRfbW9kZW1fc3RhdHVzDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX2dldF90eF9zdGF0dXMoKSBmdW5jdGlvbiByZXR1cm5zIHRoZSB0cmFuc21pdHRlciBzdGF0dXMgb2YgdGhlDQogIE1TUyBVQVJUIGluc3RhbmNlLiBJdCByZWFkcyBib3RoIHRoZSBVQVJUknMgbGluZSBzdGF0dXMgcmVnaXN0ZXIgKExTUikgYW5kDQogIHJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgdHJhbnNtaXQgaG9sZGluZyByZWdpc3RlciBlbXB0eSAoVEhSRSkgYW5kDQogIHRyYW5zbWl0dGVyIGVtcHR5IChURU1UKSBiaXRzLioNCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIFVBUlSScyB0cmFuc21pdHRlciBzdGF0dXMgYXMgYW4gOC1iaXQgdW5zaWduZWQNCiAgICBpbnRlZ2VyLiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgMCBpZiB0aGUgdHJhbnNtaXR0ZXIgc3RhdHVzIGJpdHMgYXJlIG5vdA0KICAgIHNldCBvciB0aGUgZnVuY3Rpb24gZXhlY3V0aW9uIGZhaWxlZC4gVGhlIGRyaXZlciBwcm92aWRlcyBhIHNldCBvZiBiaXQNCiAgICBtYXNrIGNvbnN0YW50cyB0aGF0IHNob3VsZCBiZSBjb21wYXJlZCB3aXRoIGFuZC9vciB1c2VkIHRvIG1hc2sgdGhlDQogICAgcmV0dXJuZWQgdmFsdWUgdG8gZGV0ZXJtaW5lIHRoZSB0cmFuc21pdHRlciBzdGF0dXMuDQogICAgV2hlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGNvbXBhcmVkIHRvIHRoZSBmb2xsb3dpbmcgYml0IG1hc2ssIGEgbm9uLXplcm8NCiAgICByZXN1bHQgaW5kaWNhdGVzIHRoYXQgdGhlIGNvcnJlc3BvbmRpbmcgdHJhbnNtaXR0ZXIgc3RhdHVzIGJpdCBpcyBzZXQ6DQogICAgICAgIJUgICBNU1NfVUFSVF9USFJFICAgICAgIChiaXQgbWFzayA9IDB4MjApDQogICAgICAgIJUgICBNU1NfVUFSVF9URU1UICAgICAgIChiaXQgbWFzayA9IDB4NDApDQogICAgV2hlbiB0aGUgcmV0dXJuIHZhbHVlIGlzIGNvbXBhcmVkIHRvIHRoZSBmb2xsb3dpbmcgYml0IG1hc2ssIGEgbm9uLXplcm8NCiAgICByZXN1bHQgaW5kaWNhdGVzIHRoYXQgdGhlIHRyYW5zbWl0dGVyIGlzIGJ1c3kgb3IgdGhlIGZ1bmN0aW9uIGV4ZWN1dGlvbg0KICAgIGZhaWxlZC4NCiAgICAgICAglSAgIE1TU19VQVJUX1RYX0JVU1kgICAgICAgIChiaXQgbWFzayA9IDB4MDApDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICB1aW50OF90IHR4X2J1ZmZbMTBdID0gImFiY2RlZmdoaSI7DQogICAgTVNTX1VBUlRfaW5pdCgmZ19tc3NfdWFydDAsDQogICAgICAgICAgICAgICAgICBNU1NfVUFSVF81NzYwMF9CQVVELA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfREFUQV84X0JJVFMgfCBNU1NfVUFSVF9OT19QQVJJVFkgfCBNU1NfVUFSVF9PTkVfU1RPUF9CSVQpOyANCg0KICAgIE1TU19VQVJUX3BvbGxlZF90eCgmZ19tc3NfdWFydDAsIHR4X2J1ZmYsIHNpemVvZih0eF9idWZmKSk7DQoNCiAgICB3aGlsZSghKE1TU19VQVJUX1RFTVQgJiBNU1NfVUFSVF9nZXRfdHhfc3RhdHVzKCZnX21zc191YXJ0MCkpKQ0KICAgIHsNCiAgICAgICAgOw0KICAgIH0NCiAgQGVuZGNvZGUNCiAqLw0KdWludDhfdA0KTVNTX1VBUlRfZ2V0X3R4X3N0YXR1cw0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9zZXRfYnJlYWsoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIHNlbmQgdGhlIGJyZWFrIA0KICAoOSB6ZXJvcyBhZnRlciBzdG9wIGJpdCkgc2lnbmFsIG9uIHRoZSBUWCBsaW5lLiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIA0KICBvbmx5IHdoZW4gdGhlIE1TUyBVQVJUIGlzIGluaXRpYWxpemVkIGluIExJTiBtb2RlIGJ5IHVzaW5nIE1TU19VQVJUX2xpbl9pbml0KCkuDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4gDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBNU1NfVUFSVF9pbml0KCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUXzU3NjAwX0JBVUQsDQogICAgICAgICAgICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUyB8IE1TU19VQVJUX05PX1BBUklUWSB8IE1TU19VQVJUX09ORV9TVE9QX0JJVCk7IA0KICANCiAgICBNU1NfVUFSVF9zZXRfYnJlYWsoJmdfbXNzX3VhcnQwKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfc2V0X2JyZWFrDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX2NsZWFyX2JyZWFrKCkgZnVuY3Rpb24gaXMgdXNlZCB0byByZW1vdmUgdGhlIGJyZWFrIHNpZ25hbCBvbiB0aGUgDQogIFRYIGxpbmUuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgb25seSB3aGVuIHRoZSBNU1MgVUFSVCBpcyBpbml0aWFsaXplZCBpbiANCiAgTElOIG1vZGUgYnkgdXNpbmcgTVNTX1VBUlRfbGluX2luaXQoKS4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLiANCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIE1TU19VQVJUX2luaXQoJmdfbXNzX3VhcnQwLA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsgDQoNCiAgICBNU1NfVUFSVF9jbGVhcl9icmVhaygmZ19tc3NfdWFydDApOw0KICBAZW5kY29kZQ0KICovDQp2b2lkDQpNU1NfVUFSVF9jbGVhcl9icmVhaw0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9lbmFibGVfaGFsZl9kdXBsZXgoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGVuYWJsZSB0aGUgaGFsZi1kdXBsZXggDQogIChzaW5nbGUgd2lyZSkgbW9kZSBmb3IgdGhlIE1TUyBVQVJULiBUaG91Z2ggaXQgZmluZHMgYXBwbGljYXRpb24gaW4gU21hcnRjYXJkIA0KICBtb2RlLCBoYWxmLWR1cGxleCBtb2RlIGNhbiBiZSB1c2VkIGluIG90aGVyIG1vZGVzIGFzIHdlbGwuDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIE1TU19VQVJUX2luaXQoJmdfbXNzX3VhcnQwLA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsgDQoNCiAgICBNU1NfVUFSVF9lbmFibGVfaGFsZl9kdXBsZXgoJmdfbXNzX3VhcnQwKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCANCk1TU19VQVJUX2VuYWJsZV9oYWxmX2R1cGxleA0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9kaXNhYmxlX2hhbGZfZHVwbGV4KCkgZnVuY3Rpb24gaXMgdXNlZCB0byBkaXNhYmxlIHRoZSBoYWxmLWR1cGxleCANCiAgKHNpbmdsZSB3aXJlKSBtb2RlIGZvciB0aGUgTVNTIFVBUlQuIFRob3VnaCBpdCBmaW5kcyBhcHBsaWNhdGlvbiBpbiBTbWFydGNhcmQgDQogIG1vZGUsIGhhbGYtZHVwbGV4IG1vZGUgY2FuIGJlIHVzZWQgaW4gb3RoZXIgbW9kZXMgYXMgd2VsbC4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgTVNTX1VBUlRfaW5pdCgmZ19tc3NfdWFydDAsDQogICAgICAgICAgICAgICAgICBNU1NfVUFSVF81NzYwMF9CQVVELA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfREFUQV84X0JJVFMgfCBNU1NfVUFSVF9OT19QQVJJVFkgfCBNU1NfVUFSVF9PTkVfU1RPUF9CSVQpOyANCg0KICAgIE1TU19VQVJUX2Rpc2FibGVfaGFsZl9kdXBsZXgoJmdfbXNzX3VhcnQwKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCANCk1TU19VQVJUX2Rpc2FibGVfaGFsZl9kdXBsZXgNCigNCiAgICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0DQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfc2V0X3J4X2VuZGlhbigpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBMU0IgZmlyc3Qgb3IgDQogIE1TQiBmaXJzdCBzZXR0aW5nIGZvciBNU1MgVUFSVCByZWNlaXZlcg0KDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQogIA0KICBAcGFyYW0gZW5kaWFuDQogICAgVGhlIGVuZGlhbiBwYXJhbWV0ZXIgdGVsbHMgdGhlIExTQiBmaXJzdCBvciBNU0IgZmlyc3QgY29uZmlndXJhdGlvbi4gDQogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBtc3NfdWFydF9lbmRpYW5fdC4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIE1TU19VQVJUX2luaXQoJmdfbXNzX3VhcnQwLA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsgDQoNCiAgICBNU1NfVUFSVF9zZXRfcnhfZW5kaWFuKCZnX21zc191YXJ0MCwgTVNTX1VBUlRfTElUVExFRU5EKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfc2V0X3J4X2VuZGlhbg0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQsDQogICAgbXNzX3VhcnRfZW5kaWFuX3QgZW5kaWFuICAgIA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX3NldF90eF9lbmRpYW4oKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgTFNCIGZpcnN0IG9yIA0KICBNU0IgZmlyc3Qgc2V0dGluZyBmb3IgTVNTIFVBUlQgdHJhbnNtaXR0ZXIuDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcGFyYW0gZW5kaWFuDQogICAgVGhlIGVuZGlhbiBwYXJhbWV0ZXIgdGVsbHMgdGhlIExTQiBmaXJzdCBvciBNU0IgZmlyc3QgY29uZmlndXJhdGlvbi4gDQogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBtc3NfdWFydF9lbmRpYW5fdC4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIE1TU19VQVJUX2luaXQoJmdfbXNzX3VhcnQwLA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsgDQoNCiAgICBNU1NfVUFSVF9zZXRfdHhfZW5kaWFuKCZnX21zc191YXJ0MCwgTVNTX1VBUlRfTElUVExFRU5EKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfc2V0X3R4X2VuZGlhbg0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQsDQogICAgbXNzX3VhcnRfZW5kaWFuX3QgZW5kaWFuICAgIA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX3NldF9maWx0ZXJfbGVuZ3RoICgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBnbGl0Y2ggDQogIGZpbHRlciBsZW5ndGggb2YgdGhlIE1TUyBVQVJULiBUaGlzIHNob3VsZCBiZSBjb25maWd1cmVkIGluIGFjY29yZGFuY2Ugd2l0aCANCiAgdGhlIGNob3NlbiBiYXVkIHJhdGUuDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcGFyYW0gbGVuZ3RoDQogICAgVGhlIGxlbmd0aCBwYXJhbWV0ZXIgaXMgb2YgbXNzX3VhcnRfZmlsdGVyX2xlbmd0aF90IHR5cGUgdGhhdCBkZXRlcm1pbmVzIA0KICAgIHRoZSBsZW5ndGggb2YgdGhlIGdsaXRjaCBmaWx0ZXIuDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBNU1NfVUFSVF9pbml0KCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUXzU3NjAwX0JBVUQsDQogICAgICAgICAgICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUyB8IE1TU19VQVJUX05PX1BBUklUWSB8IE1TU19VQVJUX09ORV9TVE9QX0JJVCk7IA0KDQogICAgTVNTX1VBUlRfc2V0X2ZpbHRlcl9sZW5ndGgoJmdfbXNzX3VhcnQwLCBNU1NfVUFSVF9MRU4yKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfc2V0X2ZpbHRlcl9sZW5ndGgNCigNCiAgICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIG1zc191YXJ0X2ZpbHRlcl9sZW5ndGhfdCBsZW5ndGgNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9lbmFibGVfYWZtKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBlbmFibGUgYWRkcmVzcyBmbGFnIGRldGVjdGlvbiANCiAgbW9kZSBvZiB0aGUgTVNTIFVBUlQNCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgTVNTX1VBUlRfaW5pdCgmZ19tc3NfdWFydDAsDQogICAgICAgICAgICAgICAgICBNU1NfVUFSVF81NzYwMF9CQVVELA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfREFUQV84X0JJVFMgfCBNU1NfVUFSVF9OT19QQVJJVFkgfCBNU1NfVUFSVF9PTkVfU1RPUF9CSVQpOyANCg0KICAgIE1TU19VQVJUX2VuYWJsZV9hZm0oJmdfbXNzX3VhcnQwKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfZW5hYmxlX2FmbQ0KKA0KICAgICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0DQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfZGlzYWJsZV9hZm0oKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGRpc2FibGUgYWRkcmVzcyBmbGFnIGRldGVjdGlvbiANCiAgbW9kZSBvZiB0aGUgTVNTIFVBUlQuDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIE1TU19VQVJUX2luaXQoJmdfbXNzX3VhcnQwLA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsgDQoNCiAgICBNU1NfVUFSVF9kaXNhYmxlX2FmbSgmZ19tc3NfdWFydDApOw0KICBAZW5kY29kZQ0KICovDQp2b2lkDQpNU1NfVUFSVF9kaXNhYmxlX2FmbQ0KKA0KICAgICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0DQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfZW5hYmxlX2FmY2xlYXIgKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBlbmFibGUgYWRkcmVzcyBmbGFnIGNsZWFyIA0KICBvZiB0aGUgTVNTIFVBUlQuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhZGRyZXNzIGZsYWcgDQogIGRldGVjdGlvbiBtb2RlIChBRk0pLg0KDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBNU1NfVUFSVF9pbml0KCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUXzU3NjAwX0JBVUQsDQogICAgICAgICAgICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUyB8IE1TU19VQVJUX05PX1BBUklUWSB8IE1TU19VQVJUX09ORV9TVE9QX0JJVCk7IA0KDQogICAgTVNTX1VBUlRfZW5hYmxlX2FmY2xlYXIoJmdfbXNzX3VhcnQwKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfZW5hYmxlX2FmY2xlYXINCigNCiAgICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX2Rpc2FibGVfYWZjbGVhciAoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGRpc2FibGUgYWRkcmVzcyBmbGFnIA0KICBjbGVhciBvZiB0aGUgTVNTIFVBUlQuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhZGRyZXNzIGZsYWcgDQogIGRldGVjdGlvbiBtb2RlIChBRk0pLg0KDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQogIA0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIE1TU19VQVJUX2luaXQoJmdfbXNzX3VhcnQwLA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsgDQoNCiAgICBNU1NfVUFSVF9kaXNhYmxlX2FmY2xlYXIoJmdfbXNzX3VhcnQwKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfZGlzYWJsZV9hZmNsZWFyDQooDQogICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9lbmFibGVfcnhfdGltZW91dCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW5hYmxlIGFuZCBjb25maWd1cmUgDQogIHRoZSByZWNlaXZlciB0aW1lb3V0IGZ1bmN0aW9uYWxpdHkgb2YgTVNTIFVBUlQuIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyB0aGUgDQogIHRpbWVvdXQgcGFyYW1ldGVyIGFuZCBhcHBsaWVzIHRoZSB0aW1lb3V0IGJhc2VkIHVwIG9uIHRoZSBiYXVkIHJhdGUgYXMgcGVyIA0KICB0aGUgZm9ybXVsYSA0IHggdGltZW91dCB4IGJpdCB0aW1lLg0KDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQoNCiAgQHBhcmFtIHRpbWVvdXQNCiAgICBUaGUgdGltZW91dCBwYXJhbWV0ZXIgc3BlY2lmaWVzIHRoZSByZWNlaXZlciB0aW1lb3V0IG11bHRpcGxlLiANCiAgICBJdCBzaG91bGQgYmUgY29uZmlndXJlZCBhY2NvcmRpbmcgdG8gdGhlIGJhdWQgcmF0ZSBpbiB1c2UuDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBNU1NfVUFSVF9pbml0KCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUXzU3NjAwX0JBVUQsDQogICAgICAgICAgICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUyB8IE1TU19VQVJUX05PX1BBUklUWSB8IE1TU19VQVJUX09ORV9TVE9QX0JJVCk7IA0KDQogICAgTVNTX1VBUlRfZW5hYmxlX3J4X3RpbWVvdXQoJmdfbXNzX3VhcnQwICwgMjQpOw0KICBAZW5kY29kZQ0KICovDQp2b2lkIA0KTVNTX1VBUlRfZW5hYmxlX3J4X3RpbWVvdXQNCigNCiAgICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIHVpbnQ4X3QgdGltZW91dA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX2Rpc2FibGVfcnhfdGltZW91dCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGlzYWJsZSB0aGUgcmVjZWl2ZXIgDQogIHRpbWVvdXQgZnVuY3Rpb25hbGl0eSBvZiBNU1MgVUFSVC4gDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIE1TU19VQVJUX2luaXQoJmdfbXNzX3VhcnQwLA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsgDQoNCiAgICBNU1NfVUFSVF9kaXNhYmxlX3J4X3RpbWVvdXQoJmdfbXNzX3VhcnQwKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCANCk1TU19VQVJUX2Rpc2FibGVfcnhfdGltZW91dA0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9lbmFibGVfdHhfdGltZV9ndWFyZCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZW5hYmxlIGFuZCBjb25maWd1cmUgDQogIHRoZSB0cmFuc21pdHRlciB0aW1lIGd1YXJkIGZ1bmN0aW9uYWxpdHkgb2YgTVNTIFVBUlQuIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyANCiAgdGhlIHRpbWVndWFyZCBwYXJhbWV0ZXIgYW5kIGFwcGxpZXMgdGhlIHRpbWVndWFyZCBiYXNlZCB1cCBvbiB0aGUgYmF1ZCByYXRlDQogIGFzIHBlciB0aGUgZm9ybXVsYSB0aW1lZ3VhcmQgeCBiaXQgdGltZS4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEByZXR1cm4NCiAgICBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlLg0KDQogIEV4YW1wbGU6DQogIEBjb2RlDQogICAgTVNTX1VBUlRfaW5pdCgmZ19tc3NfdWFydDAsDQogICAgICAgICAgICAgICAgICBNU1NfVUFSVF81NzYwMF9CQVVELA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfREFUQV84X0JJVFMgfCBNU1NfVUFSVF9OT19QQVJJVFkgfCBNU1NfVUFSVF9PTkVfU1RPUF9CSVQpOyANCg0KICAgIE1TU19VQVJUX2VuYWJsZV90eF90aW1lX2d1YXJkKCZnX21zc191YXJ0MCAsIDI0KTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCANCk1TU19VQVJUX2VuYWJsZV90eF90aW1lX2d1YXJkDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICB1aW50OF90IHRpbWVndWFyZA0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX2Rpc2FibGVfdHhfdGltZV9ndWFyZCgpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGlzYWJsZSB0aGUgDQogIHRyYW5zbWl0dGVyIHRpbWUgZ3VhcmQgZnVuY3Rpb25hbGl0eSBvZiBNU1MgVUFSVC4gDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIE1TU19VQVJUX2luaXQoJmdfbXNzX3VhcnQwLA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsgDQogICAgICAgICAgICAgICAgICANCiAgICBNU1NfVUFSVF9kaXNhYmxlX3R4X3RpbWVfZ3VhcmQoJmdfbXNzX3VhcnQwKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCANCk1TU19VQVJUX2Rpc2FibGVfdHhfdGltZV9ndWFyZA0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQNCik7DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqDQogIFRoZSBNU1NfVUFSVF9zZXRfYWRkcmVzcygpIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSA4LWJpdCBhZGRyZXNzIGZvciANCiAgdGhlIE1TUyBVQVJUIHJlZmVyZW5jZWQgYnkgdGhpc191YXJ0IHBhcmFtZXRlci4gDQoNCiAgQHBhcmFtIHRoaXNfdWFydA0KICAgIFRoZSB0aGlzX3VhcnQgcGFyYW1ldGVyIGlzIGEgcG9pbnRlciB0byBhbiBtc3NfdWFydF9pbnN0YW5jZV90DQogICAgc3RydWN0dXJlIGlkZW50aWZ5aW5nIHRoZSBNU1MgVUFSVCBoYXJkd2FyZSBibG9jayB0aGF0IHdpbGwgcGVyZm9ybQ0KICAgIHRoZSByZXF1ZXN0ZWQgZnVuY3Rpb24uIFRoZXJlIGFyZSB0d28gc3VjaCBkYXRhIHN0cnVjdHVyZXMsDQogICAgZ19tc3NfdWFydDAgYW5kIGdfbXNzX3VhcnQxLCBhc3NvY2lhdGVkIHdpdGggTVNTIFVBUlQwIGFuZCBNU1MgVUFSVDEuDQogICAgVGhpcyBwYXJhbWV0ZXIgbXVzdCBwb2ludCB0byBlaXRoZXIgdGhlIGdfbXNzX3VhcnQwIG9yIGdfbXNzX3VhcnQxDQogICAgZ2xvYmFsIGRhdGEgc3RydWN0dXJlIGRlZmluZWQgd2l0aGluIHRoZSBVQVJUIGRyaXZlci4NCg0KICBAcGFyYW0gYWRkcmVzcw0KICAgIFRoZSBhZGRyZXNzIHBhcmFtZXRlciBpcyB0aGUgOC1iaXQgYWRkcmVzcyB3aGljaCBpcyB0byBiZSBjb25maWd1cmVkIA0KICAgIHRvIHRoZSBNU1MgVUFSVCByZWZlcmVuY2VkIGJ5IHRoaXNfdWFydCBwYXJhbWV0ZXIuDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBNU1NfVUFSVF9pbml0KCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUXzU3NjAwX0JBVUQsDQogICAgICAgICAgICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUyB8IE1TU19VQVJUX05PX1BBUklUWSB8IE1TU19VQVJUX09ORV9TVE9QX0JJVCk7IA0KICAgICAgICAgICAgICAgICAgDQogICAgTVNTX1VBUlRfc2V0X2FkZHJlc3MoJmdfbXNzX3VhcnQwLCAweEFBKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZA0KTVNTX1VBUlRfc2V0X2FkZHJlc3MNCigNCiAgICBtc3NfdWFydF9pbnN0YW5jZV90ICogdGhpc191YXJ0LA0KICAgIHVpbnQ4X3QgYWRkcmVzcw0KKTsNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioNCiAgVGhlIE1TU19VQVJUX3NldF9yZWFkeV9tb2RlKCkgZnVuY3Rpb24gaXMgdXNlZCB0byBjb25maWd1cmUgdGhlIE1PREUwIG9yIE1PREUxIA0KICB0byB0aGUgVFhSRFkgYW5kIFJYUkRZIHNpZ25hbHMgb2YgdGhlIE1TUyBVQVJUIHJlZmVyZW5jZWQgYnkgdGhpc191YXJ0IA0KICBwYXJhbWV0ZXIuIFRoZSBtb2RlIHBhcmFtZXRlciBpcyB1c2VkIHRvIHByb3ZpZGUgdGhlIG1vZGUgdG8gYmUgY29uZmlndXJlZC4NCg0KICBAcGFyYW0gdGhpc191YXJ0DQogICAgVGhlIHRoaXNfdWFydCBwYXJhbWV0ZXIgaXMgYSBwb2ludGVyIHRvIGFuIG1zc191YXJ0X2luc3RhbmNlX3QNCiAgICBzdHJ1Y3R1cmUgaWRlbnRpZnlpbmcgdGhlIE1TUyBVQVJUIGhhcmR3YXJlIGJsb2NrIHRoYXQgd2lsbCBwZXJmb3JtDQogICAgdGhlIHJlcXVlc3RlZCBmdW5jdGlvbi4gVGhlcmUgYXJlIHR3byBzdWNoIGRhdGEgc3RydWN0dXJlcywNCiAgICBnX21zc191YXJ0MCBhbmQgZ19tc3NfdWFydDEsIGFzc29jaWF0ZWQgd2l0aCBNU1MgVUFSVDAgYW5kIE1TUyBVQVJUMS4NCiAgICBUaGlzIHBhcmFtZXRlciBtdXN0IHBvaW50IHRvIGVpdGhlciB0aGUgZ19tc3NfdWFydDAgb3IgZ19tc3NfdWFydDENCiAgICBnbG9iYWwgZGF0YSBzdHJ1Y3R1cmUgZGVmaW5lZCB3aXRoaW4gdGhlIFVBUlQgZHJpdmVyLg0KDQogIEBwYXJhbSBtb2RlDQogICAgVGhlIG1vZGUgcGFyYW1ldGVyIGlzIHRoZSBtc3NfdWFydF9yZWFkeV9tb2RlX3QgdHlwZSB3aGljaCBpcyB1c2VkIHRvIA0KICAgIGNvbmZpZ3VyZSB0aGUgVFhSRFkgYW5kIFJYUkRZIHNpZ25hbCBtb2Rlcy4NCg0KICBAcmV0dXJuDQogICAgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4gYSB2YWx1ZS4NCg0KICBFeGFtcGxlOg0KICBAY29kZQ0KICAgIE1TU19VQVJUX2luaXQoJmdfbXNzX3VhcnQwLA0KICAgICAgICAgICAgICAgICAgTVNTX1VBUlRfNTc2MDBfQkFVRCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUX0RBVEFfOF9CSVRTIHwgTVNTX1VBUlRfTk9fUEFSSVRZIHwgTVNTX1VBUlRfT05FX1NUT1BfQklUKTsgDQoNCiAgICBNU1NfVUFSVF9zZXRfcmVhZHlfbW9kZSgmZ19tc3NfdWFydDAsIE1TU19VQVJUX1JFQURZX01PREUwKTsgICAgDQogIEBlbmRjb2RlDQogKi8NCnZvaWQgDQpNU1NfVUFSVF9zZXRfcmVhZHlfbW9kZQ0KKA0KICAgIG1zc191YXJ0X2luc3RhbmNlX3QgKiB0aGlzX3VhcnQsDQogICAgbXNzX3VhcnRfcmVhZHlfbW9kZV90IG1vZGUgICAgDQopOw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICBUaGUgTVNTX1VBUlRfc2V0X3VzYXJ0X21vZGUoKSBmdW5jdGlvbiBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgTVNTIFVBUlQgDQogIHJlZmVyZW5jZWQgYnkgdGhlIHBhcmFtZXRlciB0aGlzX3VhcnQgaW4gVVNBUlQgbW9kZS4gVmFyaW91cyBVU0FSVCBtb2RlcyANCiAgYXJlIHN1cHBvcnRlZCB3aGljaCBjYW4gYmUgY29uZmlndXJlZCBieSB0aGUgcGFyYW1ldGVyIG1vZGUgb2YgdHlwZSANCiAgbXNzX3VhcnRfdXNhcnRfbW9kZV90Lg0KDQogIEBwYXJhbSB0aGlzX3VhcnQNCiAgICBUaGUgdGhpc191YXJ0IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gYW4gbXNzX3VhcnRfaW5zdGFuY2VfdA0KICAgIHN0cnVjdHVyZSBpZGVudGlmeWluZyB0aGUgTVNTIFVBUlQgaGFyZHdhcmUgYmxvY2sgdGhhdCB3aWxsIHBlcmZvcm0NCiAgICB0aGUgcmVxdWVzdGVkIGZ1bmN0aW9uLiBUaGVyZSBhcmUgdHdvIHN1Y2ggZGF0YSBzdHJ1Y3R1cmVzLA0KICAgIGdfbXNzX3VhcnQwIGFuZCBnX21zc191YXJ0MSwgYXNzb2NpYXRlZCB3aXRoIE1TUyBVQVJUMCBhbmQgTVNTIFVBUlQxLg0KICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgcG9pbnQgdG8gZWl0aGVyIHRoZSBnX21zc191YXJ0MCBvciBnX21zc191YXJ0MQ0KICAgIGdsb2JhbCBkYXRhIHN0cnVjdHVyZSBkZWZpbmVkIHdpdGhpbiB0aGUgVUFSVCBkcml2ZXIuDQoNCiAgQHBhcmFtIG1vZGUNCiAgICBUaGUgbW9kZSBwYXJhbWV0ZXIgaXMgdGhlIFVTQVJUIG1vZGUgdG8gYmUgY29uZmlndXJlZC4gDQogICAgVGhpcyBwYXJhbWV0ZXIgaXMgb2YgdHlwZSBtc3NfdWFydF91c2FydF9tb2RlX3QuDQoNCiAgQHJldHVybg0KICAgIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcmV0dXJuIGEgdmFsdWUuDQoNCiAgRXhhbXBsZToNCiAgQGNvZGUNCiAgICBNU1NfVUFSVF9pbml0KCZnX21zc191YXJ0MCwNCiAgICAgICAgICAgICAgICAgIE1TU19VQVJUXzU3NjAwX0JBVUQsDQogICAgICAgICAgICAgICAgICBNU1NfVUFSVF9EQVRBXzhfQklUUyB8IE1TU19VQVJUX05PX1BBUklUWSB8IE1TU19VQVJUX09ORV9TVE9QX0JJVCk7ICANCg0KICAgIE1TU19VQVJUX3NldF91c2FydF9tb2RlKCZnX21zc191YXJ0MCwgTVNTX1VBUlRfU1lOQ19NQVNURVJfUE9TX0VER0VfQ0xLKTsNCiAgQGVuZGNvZGUNCiAqLw0Kdm9pZCANCk1TU19VQVJUX3NldF91c2FydF9tb2RlDQooDQogICAgbXNzX3VhcnRfaW5zdGFuY2VfdCAqIHRoaXNfdWFydCwNCiAgICBtc3NfdWFydF91c2FydF9tb2RlX3QgbW9kZQ0KKTsNCg0KI2lmZGVmIF9fY3BsdXNwbHVzDQp9DQojZW5kaWYNCg0KI2VuZGlmIC8qIF9fTVNTX1VBUlRfSF8gKi8NCg==