LyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0ICAtICBST1VTU0VUICAtICovDQovKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIERJU0NMQUlNRVI6ICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SICovDQovKiogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAqLw0KLyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFICovDQovKiogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgKi8NCi8qKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UICovDQovKiogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsICovDQovKiogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAqLw0KLyoqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HICovDQovKiogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCAqLw0KLyoqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovDQovKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIEZpbGUgTmFtZSAgICAgICAgICAgOiBsaWJfQVQ5MVNBTTdYMTI4LmggKi8NCi8qKiBPYmplY3QgICAgICAgICAgICAgIDogQVQ5MVNBTTdYMTI4IGlubGluZWQgZnVuY3Rpb25zICovDQovKiogR2VuZXJhdGVkICAgICAgICAgICA6IEFUOTEgU1cgQXBwbGljYXRpb24gR3JvdXAgIDA1LzIwLzIwMDUgKDE2OjIyOjIzKSAqLw0KLyoqICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGJndS5oLzEuMS9GcmkgSmFuIDMxIDEyOjE4OjQwIDIwMDMvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3BtY19TQU03WC5oLzEuMS9UdWUgRmViICAxIDA4OjMyOjEwIDIwMDUvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX1ZSRUdfNjA4NUIuaC8xLjEvVHVlIEZlYiAgMSAxNjoyMDo0NyAyMDA1Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9yc3RjXzYwOThBLmgvMS4xL1dlZCBPY3QgIDYgMTA6Mzk6MjAgMjAwNC8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfc3NjLmgvMS40L0ZyaSBKYW4gMzEgMTI6MTk6MjAgMjAwMy8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfd2R0Y182MDgwQS5oLzEuMS9XZWQgT2N0ICA2IDEwOjM4OjMwIDIwMDQvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3VzYXJ0LmgvMS41L1RodSBOb3YgMjEgMTY6MDE6NTQgMjAwMi8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfc3BpMi5oLzEuMS9Nb24gQXVnIDI1IDE0OjIzOjUyIDIwMDMvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3BpdGNfNjA3OUEuaC8xLjIvVHVlIE5vdiAgOSAxNDo0Mzo1NiAyMDA0Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9haWNfNjA3NWIuaC8xLjEvRnJpIE1heSAyMCAxNDowMToxOSAyMDA1Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9hZXNfNjE0OWEuaC8xLjEvTW9uIEphbiAxNyAwNzo0MzowOSAyMDA1Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl90d2kuaC8xLjMvTW9uIEp1bCAxOSAxNDoyNzo1OCAyMDA0Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9hZGMuaC8xLjYvRnJpIE9jdCAxNyAwOToxMjozOCAyMDAzLy8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9ydHRjXzYwODFBLmgvMS4xL1dlZCBPY3QgIDYgMTA6Mzk6MzggMjAwNC8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfdWRwLmgvMS40L1dlZCBGZWIgMTYgMDg6Mzk6MzQgMjAwNS8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGVzM182MTUwYS5oLzEuMS9Nb24gSmFuIDE3IDA5OjE5OjE5IDIwMDUvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3RjXzE3NTNiLmgvMS4xL0ZyaSBKYW4gMzEgMTI6MjA6MDIgMjAwMy8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfTUNfU0FNN1guaC8xLjEvVGh1IE1hciAyNSAxNToxOToxNCAyMDA0Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9waW8uaC8xLjMvRnJpIEphbiAzMSAxMjoxODo1NiAyMDAzLy8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9jYW5fQVQ5MS5oLzEuNC9GcmkgT2N0IDE3IDA5OjEyOjUwIDIwMDMvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX1BXTV9TQU0uaC8xLjMvVGh1IEphbiAyMiAxMDoxMDo1MCAyMDA0Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9wZGMuaC8xLjIvVHVlIEp1bCAgMiAxMzoyOTo0MCAyMDAyLy8gKi8NCi8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCiNpZm5kZWYgbGliX0FUOTFTQU03WDEyOF9IDQojZGVmaW5lIGxpYl9BVDkxU0FNN1gxMjhfSA0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgQUlDDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KI2RlZmluZSBBVDkxQ19BSUNfQlJBTkNIX09QQ09ERSAgICAoICggdm9pZCAoICogKSgpICkgMHhFNTFGRkYyMCApIC8qIGxkciwgcGMsIFtwYywgIy0mRjIwXSAqLw0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FJQ19Db25maWd1cmVJdCAqLw0KLyoqIFxicmllZiBJbnRlcnJ1cHQgSGFuZGxlciBJbml0aWFsaXphdGlvbiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FJQ19Db25maWd1cmVJdCggQVQ5MVBTX0FJQyBwQWljLCAgICAgICAgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpcnFfaWQsICAgICAgICAgICAgLyogXGFyZyBpbnRlcnJ1cHQgbnVtYmVyIHRvIGluaXRpYWxpemUgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwcmlvcml0eSwgICAgICAgICAgLyogXGFyZyBwcmlvcml0eSB0byBnaXZlIHRvIHRoZSBpbnRlcnJ1cHQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcmNfdHlwZSwgICAgICAgICAgLyogXGFyZyBhY3RpdmF0aW9uIGFuZCBzZW5zZSBvZiBhY3RpdmF0aW9uICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICggKiBuZXdIYW5kbGVyICkoIHZvaWQgKSApIC8qIFxhcmcgYWRkcmVzcyBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8NCnsNCiAgICB1bnNpZ25lZCBpbnQgb2xkSGFuZGxlcjsNCiAgICB1bnNpZ25lZCBpbnQgbWFzazsNCg0KICAgIG9sZEhhbmRsZXIgICAgICAgICAgICAgID0gcEFpYy0+QUlDX1NWUlsgaXJxX2lkIF07DQoNCiAgICBtYXNrICAgICAgICAgICAgICAgICAgICA9IDB4MSA8PCBpcnFfaWQ7DQogICAgLyoqIERpc2FibGUgdGhlIGludGVycnVwdCBvbiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIgKi8NCiAgICBwQWljLT5BSUNfSURDUiAgICAgICAgICA9IG1hc2s7DQogICAgLyoqIFNhdmUgdGhlIGludGVycnVwdCBoYW5kbGVyIHJvdXRpbmUgcG9pbnRlciBhbmQgdGhlIGludGVycnVwdCBwcmlvcml0eSAqLw0KICAgIHBBaWMtPkFJQ19TVlJbIGlycV9pZCBdID0gKCB1bnNpZ25lZCBpbnQgKSBuZXdIYW5kbGVyOw0KICAgIC8qKiBTdG9yZSB0aGUgU291cmNlIE1vZGUgUmVnaXN0ZXIgKi8NCiAgICBwQWljLT5BSUNfU01SWyBpcnFfaWQgXSA9IHNyY190eXBlIHwgcHJpb3JpdHk7DQogICAgLyoqIENsZWFyIHRoZSBpbnRlcnJ1cHQgb24gdGhlIGludGVycnVwdCBjb250cm9sbGVyICovDQogICAgcEFpYy0+QUlDX0lDQ1IgICAgICAgICAgPSBtYXNrOw0KDQogICAgcmV0dXJuIG9sZEhhbmRsZXI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUlDX0VuYWJsZUl0ICovDQovKiogXGJyaWVmIEVuYWJsZSBjb3JyZXNwb25kaW5nIElUIG51bWJlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfRW5hYmxlSXQoIEFUOTFQU19BSUMgcEFpYywgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXJxX2lkICkgLyogXGFyZyBpbnRlcnJ1cHQgbnVtYmVyIHRvIGluaXRpYWxpemUgKi8NCnsNCiAgICAvKiogRW5hYmxlIHRoZSBpbnRlcnJ1cHQgb24gdGhlIGludGVycnVwdCBjb250cm9sbGVyICovDQogICAgcEFpYy0+QUlDX0lFQ1IgPSAweDEgPDwgaXJxX2lkOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FJQ19EaXNhYmxlSXQgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBjb3JyZXNwb25kaW5nIElUIG51bWJlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfRGlzYWJsZUl0KCBBVDkxUFNfQUlDIHBBaWMsICAgICAgLyogXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpcnFfaWQgKSAvKiBcYXJnIGludGVycnVwdCBudW1iZXIgdG8gaW5pdGlhbGl6ZSAqLw0Kew0KICAgIHVuc2lnbmVkIGludCBtYXNrID0gMHgxIDw8IGlycV9pZDsNCg0KICAgIC8qKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgb24gdGhlIGludGVycnVwdCBjb250cm9sbGVyICovDQogICAgcEFpYy0+QUlDX0lEQ1IgPSBtYXNrOw0KICAgIC8qKiBDbGVhciB0aGUgaW50ZXJydXB0IG9uIHRoZSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoIGlmIG9uZSBpcyBwZW5kaW5nICkgKi8NCiAgICBwQWljLT5BSUNfSUNDUiA9IG1hc2s7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUlDX0NsZWFySXQgKi8NCi8qKiBcYnJpZWYgQ2xlYXIgY29ycmVzcG9uZGluZyBJVCBudW1iZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0NsZWFySXQoIEFUOTFQU19BSUMgcEFpYywgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpcnFfaWQgKSAvKiBcYXJnIGludGVycnVwdCBudW1iZXIgdG8gaW5pdGlhbGl6ZSAqLw0Kew0KICAgIC8qKiBDbGVhciB0aGUgaW50ZXJydXB0IG9uIHRoZSBJbnRlcnJ1cHQgQ29udHJvbGxlciAoIGlmIG9uZSBpcyBwZW5kaW5nICkgKi8NCiAgICBwQWljLT5BSUNfSUNDUiA9ICggMHgxIDw8IGlycV9pZCApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FJQ19BY2tub3dsZWRnZUl0ICovDQovKiogXGJyaWVmIEFja25vd2xlZGdlIGNvcnJlc3BvbmRpbmcgSVQgbnVtYmVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FJQ19BY2tub3dsZWRnZUl0KCBBVDkxUFNfQUlDIHBBaWMgKSAvKiBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMgKi8NCnsNCiAgICBwQWljLT5BSUNfRU9JQ1IgPSBwQWljLT5BSUNfRU9JQ1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUlDX1NldEV4Y2VwdGlvblZlY3RvciAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgdmVjdG9yIGhhbmRsZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yKCB1bnNpZ25lZCBpbnQgKiBwVmVjdG9yLCAvKiBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICggKiBIYW5kbGVyICkoKSApICAvKiBcYXJnIEludGVycnVwdCBIYW5kbGVyICovDQp7DQogICAgdW5zaWduZWQgaW50IG9sZFZlY3RvciA9ICpwVmVjdG9yOw0KDQogICAgaWYoICggdW5zaWduZWQgaW50ICkgSGFuZGxlciA9PSAoIHVuc2lnbmVkIGludCApIEFUOTFDX0FJQ19CUkFOQ0hfT1BDT0RFICkNCiAgICB7DQogICAgICAgICpwVmVjdG9yID0gKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19BSUNfQlJBTkNIX09QQ09ERTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgKnBWZWN0b3IgPSAoICggKCAoICggdW5zaWduZWQgaW50ICkgSGFuZGxlciApIC0gKCAoIHVuc2lnbmVkIGludCApIHBWZWN0b3IgKSAtIDB4OCApID4+IDIgKSAmIDB4MDBGRkZGRkYgKSB8IDB4RUEwMDAwMDA7DQogICAgfQ0KDQogICAgcmV0dXJuIG9sZFZlY3RvcjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BSUNfVHJpZyAqLw0KLyoqIFxicmllZiBUcmlnIGFuIElUICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FJQ19UcmlnKCBBVDkxUFNfQUlDIHBBaWMsICAgICAgLyogXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXJxX2lkICkgLyogXGFyZyBpbnRlcnJ1cHQgbnVtYmVyICovDQp7DQogICAgcEFpYy0+QUlDX0lTQ1IgPSAoIDB4MSA8PCBpcnFfaWQgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BSUNfSXNBY3RpdmUgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBhbiBJVCBpcyBhY3RpdmUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BSUNfSXNBY3RpdmUoIEFUOTFQU19BSUMgcEFpYywgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpcnFfaWQgKSAvKiBcYXJnIEludGVycnVwdCBOdW1iZXIgKi8NCnsNCiAgICByZXR1cm4oIHBBaWMtPkFJQ19JU1IgJiAoIDB4MSA8PCBpcnFfaWQgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FJQ19Jc1BlbmRpbmcgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBhbiBJVCBpcyBwZW5kaW5nICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUlDX0lzUGVuZGluZyggQVQ5MVBTX0FJQyBwQWljLCAgICAgIC8qIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpcnFfaWQgKSAvKiBcYXJnIEludGVycnVwdCBOdW1iZXIgKi8NCnsNCiAgICByZXR1cm4oIHBBaWMtPkFJQ19JUFIgJiAoIDB4MSA8PCBpcnFfaWQgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FJQ19PcGVuICovDQovKiogXGJyaWVmIFNldCBleGNlcHRpb24gdmVjdG9ycyBhbmQgQUlDIHJlZ2lzdGVycyB0byBkZWZhdWx0IHZhbHVlcyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfT3BlbiggQVQ5MVBTX0FJQyBwQWljLCAgICAgICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICggKiBJcnFIYW5kbGVyICkoKSwgICAgICAvKiBcYXJnIERlZmF1bHQgSVJRIHZlY3RvciBleGNlcHRpb24gKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCAqIEZpcUhhbmRsZXIgKSgpLCAgICAgIC8qIFxhcmcgRGVmYXVsdCBGSVEgdmVjdG9yIGV4Y2VwdGlvbiAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoICogRGVmYXVsdEhhbmRsZXIgKSgpLCAgLyogXGFyZyBEZWZhdWx0IEhhbmRsZXIgc2V0IGluIElTUiAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoICogU3B1cmlvdXNIYW5kbGVyICkoKSwgLyogXGFyZyBEZWZhdWx0IFNwdXJpb3VzIEhhbmRsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwcm90ZWN0TW9kZSApICAgIC8qIFxhcmcgRGVidWcgQ29udHJvbCBSZWdpc3RlciAqLw0Kew0KICAgIGludCBpOw0KDQogICAgLyogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyBhbmQgc2V0IElWUiB0byB0aGUgZGVmYXVsdCBoYW5kbGVyICovDQogICAgZm9yKCBpID0gMDsgaSA8IDMyOyArK2kgKQ0KICAgIHsNCiAgICAgICAgQVQ5MUZfQUlDX0Rpc2FibGVJdCggcEFpYywgaSApOw0KICAgICAgICBBVDkxRl9BSUNfQ29uZmlndXJlSXQoIHBBaWMsIGksIEFUOTFDX0FJQ19QUklPUl9MT1dFU1QsIEFUOTFDX0FJQ19TUkNUWVBFX0hJR0hfTEVWRUwsIERlZmF1bHRIYW5kbGVyICk7DQogICAgfQ0KDQogICAgLyogU2V0IHRoZSBJUlEgZXhjZXB0aW9uIHZlY3RvciAqLw0KICAgIEFUOTFGX0FJQ19TZXRFeGNlcHRpb25WZWN0b3IoICggdW5zaWduZWQgaW50ICogKSAweDE4LCBJcnFIYW5kbGVyICk7DQogICAgLyogU2V0IHRoZSBGYXN0IEludGVycnVwdCBleGNlcHRpb24gdmVjdG9yICovDQogICAgQVQ5MUZfQUlDX1NldEV4Y2VwdGlvblZlY3RvciggKCB1bnNpZ25lZCBpbnQgKiApIDB4MUMsIEZpcUhhbmRsZXIgKTsNCg0KICAgIHBBaWMtPkFJQ19TUFUgPSAoIHVuc2lnbmVkIGludCApIFNwdXJpb3VzSGFuZGxlcjsNCiAgICBwQWljLT5BSUNfRENSID0gcHJvdGVjdE1vZGU7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQREMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19TZXROZXh0UnggKi8NCi8qKiBcYnJpZWYgU2V0IHRoZSBuZXh0IHJlY2VpdmUgdHJhbnNmZXIgZGVzY3JpcHRvciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfU2V0TmV4dFJ4KCBBVDkxUFNfUERDIHBQREMsICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogYWRkcmVzcywgICAgICAvKiBcYXJnIGFkZHJlc3MgdG8gdGhlIG5leHQgYmxvYyB0byBiZSByZWNlaXZlZCAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMgKSAvKiBcYXJnIG51bWJlciBvZiBieXRlcyB0byBiZSByZWNlaXZlZCAqLw0Kew0KICAgIHBQREMtPlBEQ19STlBSID0gKCB1bnNpZ25lZCBpbnQgKSBhZGRyZXNzOw0KICAgIHBQREMtPlBEQ19STkNSID0gYnl0ZXM7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUERDX1NldE5leHRUeCAqLw0KLyoqIFxicmllZiBTZXQgdGhlIG5leHQgdHJhbnNtaXQgdHJhbnNmZXIgZGVzY3JpcHRvciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfU2V0TmV4dFR4KCBBVDkxUFNfUERDIHBQREMsICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogYWRkcmVzcywgICAgICAvKiBcYXJnIGFkZHJlc3MgdG8gdGhlIG5leHQgYmxvYyB0byBiZSB0cmFuc21pdHRlZCAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMgKSAvKiBcYXJnIG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc21pdHRlZCAqLw0Kew0KICAgIHBQREMtPlBEQ19UTlBSID0gKCB1bnNpZ25lZCBpbnQgKSBhZGRyZXNzOw0KICAgIHBQREMtPlBEQ19UTkNSID0gYnl0ZXM7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUERDX1NldFJ4ICovDQovKiogXGJyaWVmIFNldCB0aGUgcmVjZWl2ZSB0cmFuc2ZlciBkZXNjcmlwdG9yICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19TZXRSeCggQVQ5MVBTX1BEQyBwUERDLCAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogYWRkcmVzcywgICAgICAvKiBcYXJnIGFkZHJlc3MgdG8gdGhlIG5leHQgYmxvYyB0byBiZSByZWNlaXZlZCAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBieXRlcyApIC8qIFxhcmcgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlY2VpdmVkICovDQp7DQogICAgcFBEQy0+UERDX1JQUiA9ICggdW5zaWduZWQgaW50ICkgYWRkcmVzczsNCiAgICBwUERDLT5QRENfUkNSID0gYnl0ZXM7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUERDX1NldFR4ICovDQovKiogXGJyaWVmIFNldCB0aGUgdHJhbnNtaXQgdHJhbnNmZXIgZGVzY3JpcHRvciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfU2V0VHgoIEFUOTFQU19QREMgcFBEQywgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIGFkZHJlc3MsICAgICAgLyogXGFyZyBhZGRyZXNzIHRvIHRoZSBuZXh0IGJsb2MgdG8gYmUgdHJhbnNtaXR0ZWQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMgKSAvKiBcYXJnIG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc21pdHRlZCAqLw0Kew0KICAgIHBQREMtPlBEQ19UUFIgPSAoIHVuc2lnbmVkIGludCApIGFkZHJlc3M7DQogICAgcFBEQy0+UERDX1RDUiA9IGJ5dGVzOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19FbmFibGVUeCAqLw0KLyoqIFxicmllZiBFbmFibGUgdHJhbnNtaXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX0VuYWJsZVR4KCBBVDkxUFNfUERDIHBQREMgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlciAqLw0Kew0KICAgIHBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1RYVEVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19FbmFibGVSeCAqLw0KLyoqIFxicmllZiBFbmFibGUgcmVjZWl2ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfRW5hYmxlUngoIEFUOTFQU19QREMgcFBEQyApIC8qIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyICovDQp7DQogICAgcFBEQy0+UERDX1BUQ1IgPSBBVDkxQ19QRENfUlhURU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUERDX0Rpc2FibGVUeCAqLw0KLyoqIFxicmllZiBEaXNhYmxlIHRyYW5zbWl0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19EaXNhYmxlVHgoIEFUOTFQU19QREMgcFBEQyApIC8qIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyICovDQp7DQogICAgcFBEQy0+UERDX1BUQ1IgPSBBVDkxQ19QRENfVFhURElTOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19EaXNhYmxlUnggKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSByZWNlaXZlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19EaXNhYmxlUngoIEFUOTFQU19QREMgcFBEQyApIC8qIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyICovDQp7DQogICAgcFBEQy0+UERDX1BUQ1IgPSBBVDkxQ19QRENfUlhURElTOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19Jc1R4RW1wdHkgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiB0aGUgY3VycmVudCB0cmFuc2ZlciBkZXNjcmlwdG9yIGhhcyBiZWVuIHNlbnQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9QRENfSXNUeEVtcHR5KCAvKiBccmV0dXJuIHJldHVybiAxIGlmIHRyYW5zZmVyIGlzIGNvbXBsZXRlICovDQogICAgQVQ5MVBTX1BEQyBwUERDICkgICAgICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gISggcFBEQy0+UERDX1RDUiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19Jc05leHRUeEVtcHR5ICovDQovKiogXGJyaWVmIFRlc3QgaWYgdGhlIG5leHQgdHJhbnNmZXIgZGVzY3JpcHRvciBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgY3VycmVudCB0ZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1BEQ19Jc05leHRUeEVtcHR5KCAvKiBccmV0dXJuIHJldHVybiAxIGlmIHRyYW5zZmVyIGlzIGNvbXBsZXRlICovDQogICAgQVQ5MVBTX1BEQyBwUERDICkgICAgICAgICAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuICEoIHBQREMtPlBEQ19UTkNSICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUERDX0lzUnhFbXB0eSAqLw0KLyoqIFxicmllZiBUZXN0IGlmIHRoZSBjdXJyZW50IHRyYW5zZmVyIGRlc2NyaXB0b3IgaGFzIGJlZW4gZmlsbGVkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfUERDX0lzUnhFbXB0eSggLyogXHJldHVybiByZXR1cm4gMSBpZiB0cmFuc2ZlciBpcyBjb21wbGV0ZSAqLw0KICAgIEFUOTFQU19QREMgcFBEQyApICAgICAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuICEoIHBQREMtPlBEQ19SQ1IgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QRENfSXNOZXh0UnhFbXB0eSAqLw0KLyoqIFxicmllZiBUZXN0IGlmIHRoZSBuZXh0IHRyYW5zZmVyIGRlc2NyaXB0b3IgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIGN1cnJlbnQgdGQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9QRENfSXNOZXh0UnhFbXB0eSggLyogXHJldHVybiByZXR1cm4gMSBpZiB0cmFuc2ZlciBpcyBjb21wbGV0ZSAqLw0KICAgIEFUOTFQU19QREMgcFBEQyApICAgICAgICAgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiAhKCBwUERDLT5QRENfUk5DUiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19PcGVuICovDQovKiogXGJyaWVmIE9wZW4gUERDOiBkaXNhYmxlIFRYIGFuZCBSWCByZXNldCB0cmFuc2ZlciBkZXNjcmlwdG9ycywgcmUtZW5hYmxlIFJYIGFuZCBUWCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfT3BlbiggQVQ5MVBTX1BEQyBwUERDICkgLyogXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIgKi8NCnsNCiAgICAvKiogRGlzYWJsZSB0aGUgUlggYW5kIFRYIFBEQyB0cmFuc2ZlciByZXF1ZXN0cyAqLw0KICAgIEFUOTFGX1BEQ19EaXNhYmxlUngoIHBQREMgKTsNCiAgICBBVDkxRl9QRENfRGlzYWJsZVR4KCBwUERDICk7DQoNCiAgICAvKiogUmVzZXQgYWxsIENvdW50ZXIgcmVnaXN0ZXIgTmV4dCBidWZmZXIgZmlyc3QgKi8NCiAgICBBVDkxRl9QRENfU2V0TmV4dFR4KCBwUERDLCAoIGNoYXIgKiApIDAsIDAgKTsNCiAgICBBVDkxRl9QRENfU2V0TmV4dFJ4KCBwUERDLCAoIGNoYXIgKiApIDAsIDAgKTsNCiAgICBBVDkxRl9QRENfU2V0VHgoIHBQREMsICggY2hhciAqICkgMCwgMCApOw0KICAgIEFUOTFGX1BEQ19TZXRSeCggcFBEQywgKCBjaGFyICogKSAwLCAwICk7DQoNCiAgICAvKiogRW5hYmxlIHRoZSBSWCBhbmQgVFggUERDIHRyYW5zZmVyIHJlcXVlc3RzICovDQogICAgQVQ5MUZfUERDX0VuYWJsZVJ4KCBwUERDICk7DQogICAgQVQ5MUZfUERDX0VuYWJsZVR4KCBwUERDICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUERDX0Nsb3NlICovDQovKiogXGJyaWVmIENsb3NlIFBEQzogZGlzYWJsZSBUWCBhbmQgUlggcmVzZXQgdHJhbnNmZXIgZGVzY3JpcHRvcnMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX0Nsb3NlKCBBVDkxUFNfUERDIHBQREMgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlciAqLw0Kew0KICAgIC8qKiBEaXNhYmxlIHRoZSBSWCBhbmQgVFggUERDIHRyYW5zZmVyIHJlcXVlc3RzICovDQogICAgQVQ5MUZfUERDX0Rpc2FibGVSeCggcFBEQyApOw0KICAgIEFUOTFGX1BEQ19EaXNhYmxlVHgoIHBQREMgKTsNCg0KICAgIC8qKiBSZXNldCBhbGwgQ291bnRlciByZWdpc3RlciBOZXh0IGJ1ZmZlciBmaXJzdCAqLw0KICAgIEFUOTFGX1BEQ19TZXROZXh0VHgoIHBQREMsICggY2hhciAqICkgMCwgMCApOw0KICAgIEFUOTFGX1BEQ19TZXROZXh0UngoIHBQREMsICggY2hhciAqICkgMCwgMCApOw0KICAgIEFUOTFGX1BEQ19TZXRUeCggcFBEQywgKCBjaGFyICogKSAwLCAwICk7DQogICAgQVQ5MUZfUERDX1NldFJ4KCBwUERDLCAoIGNoYXIgKiApIDAsIDAgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QRENfU2VuZEZyYW1lICovDQovKiogXGJyaWVmIENsb3NlIFBEQzogZGlzYWJsZSBUWCBhbmQgUlggcmVzZXQgdHJhbnNmZXIgZGVzY3JpcHRvcnMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QRENfU2VuZEZyYW1lKCBBVDkxUFNfUERDIHBQREMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwTmV4dEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCiAgICBpZiggQVQ5MUZfUERDX0lzVHhFbXB0eSggcFBEQyApICkNCiAgICB7DQogICAgICAgIC8qKiBCdWZmZXIgYW5kIG5leHQgYnVmZmVyIGNhbiBiZSBpbml0aWFsaXplZCAqLw0KICAgICAgICBBVDkxRl9QRENfU2V0VHgoIHBQREMsIHBCdWZmZXIsIHN6QnVmZmVyICk7DQogICAgICAgIEFUOTFGX1BEQ19TZXROZXh0VHgoIHBQREMsIHBOZXh0QnVmZmVyLCBzek5leHRCdWZmZXIgKTsNCiAgICAgICAgcmV0dXJuIDI7DQogICAgfQ0KICAgIGVsc2UgaWYoIEFUOTFGX1BEQ19Jc05leHRUeEVtcHR5KCBwUERDICkgKQ0KICAgIHsNCiAgICAgICAgLyoqIE9ubHkgb25lIGJ1ZmZlciBjYW4gYmUgaW5pdGlhbGl6ZWQgKi8NCiAgICAgICAgQVQ5MUZfUERDX1NldE5leHRUeCggcFBEQywgcEJ1ZmZlciwgc3pCdWZmZXIgKTsNCiAgICAgICAgcmV0dXJuIDE7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIC8qKiBBbGwgYnVmZmVyIGFyZSBpbiB1c2UuLi4gKi8NCiAgICAgICAgcmV0dXJuIDA7DQogICAgfQ0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19SZWNlaXZlRnJhbWUgKi8NCi8qKiBcYnJpZWYgQ2xvc2UgUERDOiBkaXNhYmxlIFRYIGFuZCBSWCByZXNldCB0cmFuc2ZlciBkZXNjcmlwdG9ycyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BEQ19SZWNlaXZlRnJhbWUoIEFUOTFQU19QREMgcFBEQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBOZXh0QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KICAgIGlmKCBBVDkxRl9QRENfSXNSeEVtcHR5KCBwUERDICkgKQ0KICAgIHsNCiAgICAgICAgLyoqIEJ1ZmZlciBhbmQgbmV4dCBidWZmZXIgY2FuIGJlIGluaXRpYWxpemVkICovDQogICAgICAgIEFUOTFGX1BEQ19TZXRSeCggcFBEQywgcEJ1ZmZlciwgc3pCdWZmZXIgKTsNCiAgICAgICAgQVQ5MUZfUERDX1NldE5leHRSeCggcFBEQywgcE5leHRCdWZmZXIsIHN6TmV4dEJ1ZmZlciApOw0KICAgICAgICByZXR1cm4gMjsNCiAgICB9DQogICAgZWxzZSBpZiggQVQ5MUZfUERDX0lzTmV4dFJ4RW1wdHkoIHBQREMgKSApDQogICAgew0KICAgICAgICAvKiogT25seSBvbmUgYnVmZmVyIGNhbiBiZSBpbml0aWFsaXplZCAqLw0KICAgICAgICBBVDkxRl9QRENfU2V0TmV4dFJ4KCBwUERDLCBwQnVmZmVyLCBzekJ1ZmZlciApOw0KICAgICAgICByZXR1cm4gMTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgLyoqIEFsbCBidWZmZXIgYXJlIGluIHVzZS4uLiAqLw0KICAgICAgICByZXR1cm4gMDsNCiAgICB9DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBEQkdVDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9EQkdVX0ludGVycnVwdEVuYWJsZSAqLw0KLyoqIFxicmllZiBFbmFibGUgREJHVSBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9JbnRlcnJ1cHRFbmFibGUoIEFUOTFQU19EQkdVIHBEYmd1LCAgLyogXGFyZyAgcG9pbnRlciB0byBhIERCR1UgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBkYmd1IGludGVycnVwdCB0byBiZSBlbmFibGVkICovDQp7DQogICAgcERiZ3UtPkRCR1VfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9EQkdVX0ludGVycnVwdERpc2FibGUgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBEQkdVIEludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9EQkdVX0ludGVycnVwdERpc2FibGUoIEFUOTFQU19EQkdVIHBEYmd1LCAgLyogXGFyZyAgcG9pbnRlciB0byBhIERCR1UgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZGJndSBpbnRlcnJ1cHQgdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICBwRGJndS0+REJHVV9JRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0RCR1VfR2V0SW50ZXJydXB0TWFza1N0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gREJHVSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9EQkdVX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8qIFxyZXR1cm4gREJHVSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCiAgICBBVDkxUFNfREJHVSBwRGJndSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBEQkdVIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcERiZ3UtPkRCR1VfSU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0RCR1VfSXNJbnRlcnJ1cHRNYXNrZWQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBEQkdVIEludGVycnVwdCBpcyBNYXNrZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9EQkdVX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfREJHVSBwRGJndSwgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBEQkdVIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9EQkdVX0dldEludGVycnVwdE1hc2tTdGF0dXMoIHBEYmd1ICkgJiBmbGFnICk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQSU8NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19DZmdQZXJpcGggKi8NCi8qKiBcYnJpZWYgRW5hYmxlIHBpbnMgdG8gYmUgZHJpdmVkIGJ5IHBlcmlwaGVyYWwgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ1BlcmlwaCggQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGVyaXBoQUVuYWJsZSwgIC8qIFxhcmcgUEVSSVBIIEEgdG8gZW5hYmxlICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwZXJpcGhCRW5hYmxlICkgLyogXGFyZyBQRVJJUEggQiB0byBlbmFibGUgKi8NCg0Kew0KICAgIHBQaW8tPlBJT19BU1IgPSBwZXJpcGhBRW5hYmxlOw0KICAgIHBQaW8tPlBJT19CU1IgPSBwZXJpcGhCRW5hYmxlOw0KICAgIHBQaW8tPlBJT19QRFIgPSAoIHBlcmlwaEFFbmFibGUgfCBwZXJpcGhCRW5hYmxlICk7IC8qIFNldCBpbiBQZXJpcGggbW9kZSAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19DZmdPdXRwdXQgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBJTyBpbiBvdXRwdXQgbW9kZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2ZnT3V0cHV0KCBBVDkxUFNfUElPIHBQaW8sICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBpb0VuYWJsZSApIC8qIFxhcmcgUElPIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICBwUGlvLT5QSU9fUEVSID0gcGlvRW5hYmxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCBpbiBQSU8gbW9kZSAqLw0KICAgIHBQaW8tPlBJT19PRVIgPSBwaW9FbmFibGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29uZmlndXJlIGluIE91dHB1dCAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19DZmdJbnB1dCAqLw0KLyoqIFxicmllZiBFbmFibGUgUElPIGluIGlucHV0IG1vZGUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ0lucHV0KCBBVDkxUFNfUElPIHBQaW8sICAgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbnB1dEVuYWJsZSApIC8qIFxhcmcgUElPIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICAvKiBEaXNhYmxlIG91dHB1dCAqLw0KICAgIHBQaW8tPlBJT19PRFIgPSBpbnB1dEVuYWJsZTsNCiAgICBwUGlvLT5QSU9fUEVSID0gaW5wdXRFbmFibGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0NmZ09wZW5kcmFpbiAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGluIG9wZW4gZHJhaW4gKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ09wZW5kcmFpbiggQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG11bHRpRHJ2RW5hYmxlICkgLyogXGFyZyBwaW8gdG8gYmUgY29uZmlndXJlZCBpbiBvcGVuIGRyYWluICovDQp7DQogICAgLyogQ29uZmlndXJlIHRoZSBtdWx0aS1kcml2ZSBvcHRpb24gKi8NCiAgICBwUGlvLT5QSU9fTUREUiA9IH5tdWx0aURydkVuYWJsZTsNCiAgICBwUGlvLT5QSU9fTURFUiA9IG11bHRpRHJ2RW5hYmxlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19DZmdQdWxsdXAgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIHB1bGx1cCBvbiBQSU8gKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ1B1bGx1cCggQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwdWxsdXBFbmFibGUgKSAvKiBcYXJnIGVuYWJsZSBwdWxsdXAgb24gUElPICovDQp7DQogICAgLyogQ29ubmVjdCBvciBub3QgUHVsbHVwICovDQogICAgcFBpby0+UElPX1BQVURSID0gfnB1bGx1cEVuYWJsZTsNCiAgICBwUGlvLT5QSU9fUFBVRVIgPSBwdWxsdXBFbmFibGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0NmZ0RpcmVjdERyaXZlICovDQovKiogXGJyaWVmIEVuYWJsZSBkaXJlY3QgZHJpdmUgb24gUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdEaXJlY3REcml2ZSggQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGlyZWN0RHJpdmUgKSAvKiBcYXJnIFBJTyB0byBiZSBjb25maWd1cmVkIHdpdGggZGlyZWN0IGRyaXZlICovDQoNCnsNCiAgICAvKiBDb25maWd1cmUgdGhlIERpcmVjdCBEcml2ZSAqLw0KICAgIHBQaW8tPlBJT19PV0RSID0gfmRpcmVjdERyaXZlOw0KICAgIHBQaW8tPlBJT19PV0VSID0gZGlyZWN0RHJpdmU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0NmZ0lucHV0RmlsdGVyICovDQovKiogXGJyaWVmIEVuYWJsZSBpbnB1dCBmaWx0ZXIgb24gaW5wdXQgUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdJbnB1dEZpbHRlciggQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5wdXRGaWx0ZXIgKSAvKiBcYXJnIFBJTyB0byBiZSBjb25maWd1cmVkIHdpdGggaW5wdXQgZmlsdGVyICovDQoNCnsNCiAgICAvKiBDb25maWd1cmUgdGhlIERpcmVjdCBEcml2ZSAqLw0KICAgIHBQaW8tPlBJT19JRkRSID0gfmlucHV0RmlsdGVyOw0KICAgIHBQaW8tPlBJT19JRkVSID0gaW5wdXRGaWx0ZXI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0dldElucHV0ICovDQovKiogXGJyaWVmIFJldHVybiBQSU8gaW5wdXQgdmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0SW5wdXQoIC8qIFxyZXR1cm4gUElPIGlucHV0ICovDQogICAgQVQ5MVBTX1BJTyBwUGlvICkgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFBpby0+UElPX1BEU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0lzSW5wdXRTZXQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBQSU8gaXMgaW5wdXQgZmxhZyBpcyBhY3RpdmUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNJbnB1dFNldCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfUElPX0dldElucHV0KCBwUGlvICkgJiBmbGFnICk7DQp9DQoNCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fU2V0T3V0cHV0ICovDQovKiogXGJyaWVmIFNldCB0byAxIG91dHB1dCBQSU8gKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX1NldE91dHB1dCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBvdXRwdXQgdG8gYmUgc2V0ICovDQp7DQogICAgcFBpby0+UElPX1NPRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19DbGVhck91dHB1dCAqLw0KLyoqIFxicmllZiBTZXQgdG8gMCBvdXRwdXQgUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DbGVhck91dHB1dCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIG91dHB1dCB0byBiZSBjbGVhcmVkICovDQp7DQogICAgcFBpby0+UElPX0NPRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19Gb3JjZU91dHB1dCAqLw0KLyoqIFxicmllZiBGb3JjZSBvdXRwdXQgd2hlbiBEaXJlY3QgZHJpdmUgb3B0aW9uIGlzIGVuYWJsZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0ZvcmNlT3V0cHV0KCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgb3V0cHV0IHRvIGJlIGZvcmNlZCAqLw0Kew0KICAgIHBQaW8tPlBJT19PRFNSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fRW5hYmxlICovDQovKiogXGJyaWVmIEVuYWJsZSBQSU8gKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0VuYWJsZSggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBwaW8gdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIHBQaW8tPlBJT19QRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19EaXNhYmxlICovDQovKiogXGJyaWVmIERpc2FibGUgUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19EaXNhYmxlKCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBwaW8gdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICBwUGlvLT5QSU9fUERSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fR2V0U3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBQSU8gU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldFN0YXR1cyggLyogXHJldHVybiBQSU8gU3RhdHVzICovDQogICAgQVQ5MVBTX1BJTyBwUGlvICkgICAgICAgICAgICAgICAgICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBQaW8tPlBJT19QU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0lzU2V0ICovDQovKiogXGJyaWVmIFRlc3QgaWYgUElPIGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc1NldCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1BJT19HZXRTdGF0dXMoIHBQaW8gKSAmIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fT3V0cHV0RW5hYmxlICovDQovKiogXGJyaWVmIE91dHB1dCBFbmFibGUgUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19PdXRwdXRFbmFibGUoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgcGlvIG91dHB1dCB0byBiZSBlbmFibGVkICovDQp7DQogICAgcFBpby0+UElPX09FUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX091dHB1dERpc2FibGUgKi8NCi8qKiBcYnJpZWYgT3V0cHV0IEVuYWJsZSBQSU8gKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX091dHB1dERpc2FibGUoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIHBpbyBvdXRwdXQgdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICBwUGlvLT5QSU9fT0RSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fR2V0T3V0cHV0U3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBQSU8gT3V0cHV0IFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRPdXRwdXRTdGF0dXMoIC8qIFxyZXR1cm4gUElPIE91dHB1dCBTdGF0dXMgKi8NCiAgICBBVDkxUFNfUElPIHBQaW8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFBpby0+UElPX09TUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fSXNPdXB1dFNldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFBJTyBPdXRwdXQgaXMgU2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzT3V0cHV0U2V0KCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfUElPX0dldE91dHB1dFN0YXR1cyggcFBpbyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19JbnB1dEZpbHRlckVuYWJsZSAqLw0KLyoqIFxicmllZiBJbnB1dCBGaWx0ZXIgRW5hYmxlIFBJTyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fSW5wdXRGaWx0ZXJFbmFibGUoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBwaW8gaW5wdXQgZmlsdGVyIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICBwUGlvLT5QSU9fSUZFUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0lucHV0RmlsdGVyRGlzYWJsZSAqLw0KLyoqIFxicmllZiBJbnB1dCBGaWx0ZXIgRGlzYWJsZSBQSU8gKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0lucHV0RmlsdGVyRGlzYWJsZSggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBwaW8gaW5wdXQgZmlsdGVyIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgcFBpby0+UElPX0lGRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19HZXRJbnB1dEZpbHRlclN0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gUElPIElucHV0IEZpbHRlciBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0SW5wdXRGaWx0ZXJTdGF0dXMoIC8qIFxyZXR1cm4gUElPIElucHV0IEZpbHRlciBTdGF0dXMgKi8NCiAgICBBVDkxUFNfUElPIHBQaW8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUGlvLT5QSU9fSUZTUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fSXNJbnB1dEZpbHRlclNldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFBJTyBJbnB1dCBmaWx0ZXIgaXMgU2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzSW5wdXRGaWx0ZXJTZXQoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1BJT19HZXRJbnB1dEZpbHRlclN0YXR1cyggcFBpbyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXREYXRhU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBQSU8gT3V0cHV0IERhdGEgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldE91dHB1dERhdGFTdGF0dXMoIC8qIFxyZXR1cm4gUElPIE91dHB1dCBEYXRhIFN0YXR1cyAqLw0KICAgIEFUOTFQU19QSU8gcFBpbyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFBpby0+UElPX09EU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0ludGVycnVwdEVuYWJsZSAqLw0KLyoqIFxicmllZiBFbmFibGUgUElPIEludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fSW50ZXJydXB0RW5hYmxlKCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIHBpbyBpbnRlcnJ1cHQgdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIHBQaW8tPlBJT19JRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19JbnRlcnJ1cHREaXNhYmxlICovDQovKiogXGJyaWVmIERpc2FibGUgUElPIEludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fSW50ZXJydXB0RGlzYWJsZSggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgcGlvIGludGVycnVwdCB0byBiZSBkaXNhYmxlZCAqLw0Kew0KICAgIHBQaW8tPlBJT19JRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBQSU8gSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8qIFxyZXR1cm4gUElPIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KICAgIEFUOTFQU19QSU8gcFBpbyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFBpby0+UElPX0lNUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fR2V0SW50ZXJydXB0U3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBQSU8gSW50ZXJydXB0IFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRJbnRlcnJ1cHRTdGF0dXMoIC8qIFxyZXR1cm4gUElPIEludGVycnVwdCBTdGF0dXMgKi8NCiAgICBBVDkxUFNfUElPIHBQaW8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFBpby0+UElPX0lTUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fSXNJbnRlcnJ1cHRNYXNrZWQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBQSU8gSW50ZXJydXB0IGlzIE1hc2tlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0ludGVycnVwdE1hc2tlZCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1BJT19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCBwUGlvICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0lzSW50ZXJydXB0U2V0ICovDQovKiogXGJyaWVmIFRlc3QgaWYgUElPIEludGVycnVwdCBpcyBTZXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNJbnRlcnJ1cHRTZXQoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9QSU9fR2V0SW50ZXJydXB0U3RhdHVzKCBwUGlvICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX011bHRpRHJpdmVyRW5hYmxlICovDQovKiogXGJyaWVmIE11bHRpIERyaXZlciBFbmFibGUgUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19NdWx0aURyaXZlckVuYWJsZSggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIHBpbyB0byBiZSBlbmFibGVkICovDQp7DQogICAgcFBpby0+UElPX01ERVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19NdWx0aURyaXZlckRpc2FibGUgKi8NCi8qKiBcYnJpZWYgTXVsdGkgRHJpdmVyIERpc2FibGUgUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19NdWx0aURyaXZlckRpc2FibGUoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgcGlvIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgcFBpby0+UElPX01ERFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19HZXRNdWx0aURyaXZlclN0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gUElPIE11bHRpIERyaXZlciBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0TXVsdGlEcml2ZXJTdGF0dXMoIC8qIFxyZXR1cm4gUElPIE11bHRpIERyaXZlciBTdGF0dXMgKi8NCiAgICBBVDkxUFNfUElPIHBQaW8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUGlvLT5QSU9fTURTUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fSXNNdWx0aURyaXZlclNldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFBJTyBNdWx0aURyaXZlciBpcyBTZXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNNdWx0aURyaXZlclNldCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfUElPX0dldE11bHRpRHJpdmVyU3RhdHVzKCBwUGlvICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0FfUmVnaXN0ZXJTZWxlY3Rpb24gKi8NCi8qKiBcYnJpZWYgUElPIEEgUmVnaXN0ZXIgU2VsZWN0aW9uICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19BX1JlZ2lzdGVyU2VsZWN0aW9uKCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBwaW8gQSByZWdpc3RlciBzZWxlY3Rpb24gKi8NCnsNCiAgICBwUGlvLT5QSU9fQVNSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fQl9SZWdpc3RlclNlbGVjdGlvbiAqLw0KLyoqIFxicmllZiBQSU8gQiBSZWdpc3RlciBTZWxlY3Rpb24gKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0JfUmVnaXN0ZXJTZWxlY3Rpb24oIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIHBpbyBCIHJlZ2lzdGVyIHNlbGVjdGlvbiAqLw0Kew0KICAgIHBQaW8tPlBJT19CU1IgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19HZXRfQUJfUmVnaXN0ZXJTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIFBJTyBJbnRlcnJ1cHQgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldF9BQl9SZWdpc3RlclN0YXR1cyggLyogXHJldHVybiBQSU8gQUIgUmVnaXN0ZXIgU3RhdHVzICovDQogICAgQVQ5MVBTX1BJTyBwUGlvICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBQaW8tPlBJT19BQlNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19Jc0FCX1JlZ2lzdGVyU2V0ICovDQovKiogXGJyaWVmIFRlc3QgaWYgUElPIEFCIFJlZ2lzdGVyIGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0FCX1JlZ2lzdGVyU2V0KCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9QSU9fR2V0X0FCX1JlZ2lzdGVyU3RhdHVzKCBwUGlvICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX091dHB1dFdyaXRlRW5hYmxlICovDQovKiogXGJyaWVmIE91dHB1dCBXcml0ZSBFbmFibGUgUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19PdXRwdXRXcml0ZUVuYWJsZSggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIHBpbyBvdXRwdXQgd3JpdGUgdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIHBQaW8tPlBJT19PV0VSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fT3V0cHV0V3JpdGVEaXNhYmxlICovDQovKiogXGJyaWVmIE91dHB1dCBXcml0ZSBEaXNhYmxlIFBJTyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fT3V0cHV0V3JpdGVEaXNhYmxlKCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIHBpbyBvdXRwdXQgd3JpdGUgdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICBwUGlvLT5QSU9fT1dEUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0dldE91dHB1dFdyaXRlU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBQSU8gT3V0cHV0IFdyaXRlIFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRPdXRwdXRXcml0ZVN0YXR1cyggLyogXHJldHVybiBQSU8gT3V0cHV0IFdyaXRlIFN0YXR1cyAqLw0KICAgIEFUOTFQU19QSU8gcFBpbyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBQaW8tPlBJT19PV1NSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19Jc091dHB1dFdyaXRlU2V0ICovDQovKiogXGJyaWVmIFRlc3QgaWYgUElPIE91dHB1dFdyaXRlIGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc091dHB1dFdyaXRlU2V0KCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9QSU9fR2V0T3V0cHV0V3JpdGVTdGF0dXMoIHBQaW8gKSAmIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fR2V0Q2ZnUHVsbHVwICovDQovKiogXGJyaWVmIFJldHVybiBQSU8gQ29uZmlndXJhdGlvbiBQdWxsdXAgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0Q2ZnUHVsbHVwKCAvKiBccmV0dXJuIFBJTyBDb25maWd1cmF0aW9uIFB1bGx1cCAqLw0KICAgIEFUOTFQU19QSU8gcFBpbyApICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUGlvLT5QSU9fUFBVU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0lzT3V0cHV0RGF0YVN0YXR1c1NldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFBJTyBPdXRwdXQgRGF0YSBTdGF0dXMgaXMgU2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzT3V0cHV0RGF0YVN0YXR1c1NldCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9QSU9fR2V0T3V0cHV0RGF0YVN0YXR1cyggcFBpbyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19Jc0NmZ1B1bGx1cFN0YXR1c1NldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFBJTyBDb25maWd1cmF0aW9uIFB1bGx1cCBTdGF0dXMgaXMgU2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzQ2ZnUHVsbHVwU3RhdHVzU2V0KCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggfkFUOTFGX1BJT19HZXRDZmdQdWxsdXAoIHBQaW8gKSAmIGZsYWcgKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFBNQw0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUE1DX0NmZ1N5c0Nsa0VuYWJsZVJlZyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgdGhlIFN5c3RlbSBDbG9jayBFbmFibGUgUmVnaXN0ZXIgb2YgdGhlIFBNQyBjb250cm9sbGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19DZmdTeXNDbGtFbmFibGVSZWcoIEFUOTFQU19QTUMgcFBNQywgLyogXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlICkNCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIFNDRVIgcmVnaXN0ZXIgKi8NCiAgICBwUE1DLT5QTUNfU0NFUiA9IG1vZGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUE1DX0NmZ1N5c0Nsa0Rpc2FibGVSZWcgKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBTeXN0ZW0gQ2xvY2sgRGlzYWJsZSBSZWdpc3RlciBvZiB0aGUgUE1DIGNvbnRyb2xsZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0NmZ1N5c0Nsa0Rpc2FibGVSZWcoIEFUOTFQU19QTUMgcFBNQywgLyogXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSApDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBTQ0RSIHJlZ2lzdGVyICovDQogICAgcFBNQy0+UE1DX1NDRFIgPSBtb2RlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19HZXRTeXNDbGtTdGF0dXNSZWcgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBTeXN0ZW0gQ2xvY2sgU3RhdHVzIFJlZ2lzdGVyIG9mIHRoZSBQTUMgY29udHJvbGxlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRTeXNDbGtTdGF0dXNSZWcoIEFUOTFQU19QTUMgcFBNQyAvKiBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBQTUMtPlBNQ19TQ1NSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jayAqLw0KLyoqIFxicmllZiBFbmFibGUgcGVyaXBoZXJhbCBjbG9jayAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soIEFUOTFQU19QTUMgcFBNQywgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGVyaXBoSWRzICkgLyogXGFyZyBJRHMgb2YgcGVyaXBoZXJhbHMgdG8gZW5hYmxlICovDQp7DQogICAgcFBNQy0+UE1DX1BDRVIgPSBwZXJpcGhJZHM7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUE1DX0Rpc2FibGVQZXJpcGhDbG9jayAqLw0KLyoqIFxicmllZiBEaXNhYmxlIHBlcmlwaGVyYWwgY2xvY2sgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0Rpc2FibGVQZXJpcGhDbG9jayggQVQ5MVBTX1BNQyBwUE1DLCAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGVyaXBoSWRzICkgLyogXGFyZyBJRHMgb2YgcGVyaXBoZXJhbHMgdG8gZW5hYmxlICovDQp7DQogICAgcFBNQy0+UE1DX1BDRFIgPSBwZXJpcGhJZHM7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUE1DX0dldFBlcmlwaENsb2NrICovDQovKiogXGJyaWVmIEdldCBwZXJpcGhlcmFsIGNsb2NrIHN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRQZXJpcGhDbG9jayggQVQ5MVBTX1BNQyBwUE1DICkgLyogXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBQTUMtPlBNQ19QQ1NSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NLR1JfQ2ZnTWFpbk9zY2lsbGF0b3JSZWcgKi8NCi8qKiBcYnJpZWYgQ2ZnIHRoZSBtYWluIG9zY2lsbGF0b3IgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0tHUl9DZmdNYWluT3NjaWxsYXRvclJlZyggQVQ5MVBTX0NLR1IgcENLR1IsIC8qIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGUgKQ0Kew0KICAgIHBDS0dSLT5DS0dSX01PUiA9IG1vZGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0tHUl9HZXRNYWluT3NjaWxsYXRvclJlZyAqLw0KLyoqIFxicmllZiBDZmcgdGhlIG1haW4gb3NjaWxsYXRvciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NLR1JfR2V0TWFpbk9zY2lsbGF0b3JSZWcoIEFUOTFQU19DS0dSIHBDS0dSICkgLyogXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwQ0tHUi0+Q0tHUl9NT1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0tHUl9FbmFibGVNYWluT3NjaWxsYXRvciAqLw0KLyoqIFxicmllZiBFbmFibGUgdGhlIG1haW4gb3NjaWxsYXRvciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9DS0dSX0VuYWJsZU1haW5Pc2NpbGxhdG9yKCBBVDkxUFNfQ0tHUiBwQ0tHUiApIC8qIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIgKi8NCnsNCiAgICBwQ0tHUi0+Q0tHUl9NT1IgfD0gQVQ5MUNfQ0tHUl9NT1NDRU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0tHUl9EaXNhYmxlTWFpbk9zY2lsbGF0b3IgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSB0aGUgbWFpbiBvc2NpbGxhdG9yICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NLR1JfRGlzYWJsZU1haW5Pc2NpbGxhdG9yKCBBVDkxUFNfQ0tHUiBwQ0tHUiApIC8qIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIgKi8NCnsNCiAgICBwQ0tHUi0+Q0tHUl9NT1IgJj0gfkFUOTFDX0NLR1JfTU9TQ0VOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NLR1JfQ2ZnTWFpbk9zY1N0YXJ0VXBUaW1lICovDQovKiogXGJyaWVmIENmZyBNT1IgUmVnaXN0ZXIgYWNjb3JkaW5nIHRvIHRoZSBtYWluIG9zYyBzdGFydHVwIHRpbWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0tHUl9DZmdNYWluT3NjU3RhcnRVcFRpbWUoIEFUOTFQU19DS0dSIHBDS0dSLCAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdGFydHVwX3RpbWUsIC8qIFxhcmcgbWFpbiBvc2Mgc3RhcnR1cCB0aW1lIGluIG1pY3Jvc2Vjb25kICh1cykgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzbG93Q2xvY2sgKSAgIC8qIFxhcmcgc2xvd0Nsb2NrIGluIEh6ICovDQp7DQogICAgcENLR1ItPkNLR1JfTU9SICY9IH5BVDkxQ19DS0dSX09TQ09VTlQ7DQogICAgcENLR1ItPkNLR1JfTU9SIHw9ICggKCBzbG93Q2xvY2sgKiBzdGFydHVwX3RpbWUgKSAvICggOCAqIDEwMDAwMDAgKSApIDw8IDg7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2tGcmVxUmVnICovDQovKiogXGJyaWVmIENmZyB0aGUgbWFpbiBvc2NpbGxhdG9yICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2tGcmVxUmVnKCBBVDkxUFNfQ0tHUiBwQ0tHUiApIC8qIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcENLR1ItPkNLR1JfTUNGUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DS0dSX0dldE1haW5DbG9jayAqLw0KLyoqIFxicmllZiBSZXR1cm4gTWFpbiBjbG9jayBpbiBIeiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NLR1JfR2V0TWFpbkNsb2NrKCBBVDkxUFNfQ0tHUiBwQ0tHUiwgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2xvd0Nsb2NrICkgLyogXGFyZyBzbG93Q2xvY2sgaW4gSHogKi8NCnsNCiAgICByZXR1cm4gKCAoIHBDS0dSLT5DS0dSX01DRlIgJiBBVDkxQ19DS0dSX01BSU5GICkgKiBzbG93Q2xvY2sgKSA+PiA0Ow0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19DZmdNQ0tSZWcgKi8NCi8qKiBcYnJpZWYgQ2ZnIE1hc3RlciBDbG9jayBSZWdpc3RlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnTUNLUmVnKCBBVDkxUFNfUE1DIHBQTUMsIC8qIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSApDQp7DQogICAgcFBNQy0+UE1DX01DS1IgPSBtb2RlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19HZXRNQ0tSZWcgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIE1hc3RlciBDbG9jayBSZWdpc3RlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRNQ0tSZWcoIEFUOTFQU19QTUMgcFBNQyApIC8qIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUE1DLT5QTUNfTUNLUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19HZXRNYXN0ZXJDbG9jayAqLw0KLyoqIFxicmllZiBSZXR1cm4gbWFzdGVyIGNsb2NrIGluIEh6IHdoaWNoIGNvcnJlcG9uZHMgdG8gcHJvY2Vzc29yIGNsb2NrIGZvciBBUk03ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0TWFzdGVyQ2xvY2soIEFUOTFQU19QTUMgcFBNQywgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFQU19DS0dSIHBDS0dSLCAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2xvd0Nsb2NrICkgLyogXGFyZyBzbG93Q2xvY2sgaW4gSHogKi8NCnsNCiAgICB1bnNpZ25lZCBpbnQgcmVnID0gcFBNQy0+UE1DX01DS1I7DQogICAgdW5zaWduZWQgaW50IHByZXNjYWxlciA9ICggMSA8PCAoICggcmVnICYgQVQ5MUNfUE1DX1BSRVMgKSA+PiAyICkgKTsNCiAgICB1bnNpZ25lZCBpbnQgcGxsRGl2aWRlciwgcGxsTXVsdGlwbGllcjsNCg0KICAgIHN3aXRjaCggcmVnICYgQVQ5MUNfUE1DX0NTUyApDQogICAgew0KICAgICAgICBjYXNlIEFUOTFDX1BNQ19DU1NfU0xPV19DTEs6IC8qIFNsb3cgY2xvY2sgc2VsZWN0ZWQgKi8NCiAgICAgICAgICAgIHJldHVybiBzbG93Q2xvY2sgLyBwcmVzY2FsZXI7DQoNCiAgICAgICAgY2FzZSBBVDkxQ19QTUNfQ1NTX01BSU5fQ0xLOiAvKiBNYWluIGNsb2NrIGlzIHNlbGVjdGVkICovDQogICAgICAgICAgICByZXR1cm4gQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2soIHBDS0dSLCBzbG93Q2xvY2sgKSAvIHByZXNjYWxlcjsNCg0KICAgICAgICBjYXNlIEFUOTFDX1BNQ19DU1NfUExMX0NMSzogLyogUExMQiBjbG9jayBpcyBzZWxlY3RlZCAqLw0KICAgICAgICAgICAgcmVnICAgICAgICAgICA9IHBDS0dSLT5DS0dSX1BMTFI7DQogICAgICAgICAgICBwbGxEaXZpZGVyICAgID0gKCByZWcgJiBBVDkxQ19DS0dSX0RJViApOw0KICAgICAgICAgICAgcGxsTXVsdGlwbGllciA9ICggKCByZWcgJiBBVDkxQ19DS0dSX01VTCApID4+IDE2ICkgKyAxOw0KICAgICAgICAgICAgcmV0dXJuIEFUOTFGX0NLR1JfR2V0TWFpbkNsb2NrKCBwQ0tHUiwgc2xvd0Nsb2NrICkgLyBwbGxEaXZpZGVyICogcGxsTXVsdGlwbGllciAvIHByZXNjYWxlcjsNCiAgICB9DQoNCiAgICByZXR1cm4gMDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfRW5hYmxlUENLICovDQovKiogXGJyaWVmIEVuYWJsZSBwZXJpcGhlcmFsIGNsb2NrICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19FbmFibGVQQ0soIEFUOTFQU19QTUMgcFBNQywgIC8qIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGNrLCAvKiBcYXJnIFBlcmlwaGVyYWwgY2xvY2sgaWRlbnRpZmllciAwIC4uIDcgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGUgKQ0Kew0KICAgIHBQTUMtPlBNQ19QQ0tSWyBwY2sgXSA9IG1vZGU7DQogICAgcFBNQy0+UE1DX1NDRVIgICAgICAgID0gKCAxIDw8IHBjayApIDw8IDg7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUE1DX0Rpc2FibGVQQ0sgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIHBlcmlwaGVyYWwgY2xvY2sgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0Rpc2FibGVQQ0soIEFUOTFQU19QTUMgcFBNQywgICAvKiBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwY2sgKSAvKiBcYXJnIFBlcmlwaGVyYWwgY2xvY2sgaWRlbnRpZmllciAwIC4uIDcgKi8NCnsNCiAgICBwUE1DLT5QTUNfU0NEUiA9ICggMSA8PCBwY2sgKSA8PCA4Ow0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19FbmFibGVJdCAqLw0KLyoqIFxicmllZiBFbmFibGUgUE1DIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRW5hYmxlSXQoIEFUOTFQU19QTUMgcFBNQywgICAgLyogcG9pbnRlciB0byBhIFBNQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBJVCB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwUE1DLT5QTUNfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgUE1DIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRGlzYWJsZUl0KCBBVDkxUFNfUE1DIHBQTUMsICAgIC8qIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIElUIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIgKi8NCiAgICBwUE1DLT5QTUNfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfR2V0U3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBQTUMgSW50ZXJydXB0IFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRTdGF0dXMoIC8qIFxyZXR1cm4gUE1DIEludGVycnVwdCBTdGF0dXMgKi8NCiAgICBBVDkxUFNfUE1DIHBQTUMgKSAgICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFBNQy0+UE1DX1NSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBQTUMgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8qIFxyZXR1cm4gUE1DIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KICAgIEFUOTFQU19QTUMgcFBNQyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFBNQy0+UE1DX0lNUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfSXNJbnRlcnJ1cHRNYXNrZWQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBQTUMgSW50ZXJydXB0IGlzIE1hc2tlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19Jc0ludGVycnVwdE1hc2tlZCggQVQ5MVBTX1BNQyBwUE1DLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1BNQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCBwUE1DICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUE1DX0lzU3RhdHVzU2V0ICovDQovKiogXGJyaWVmIFRlc3QgaWYgUE1DIFN0YXR1cyBpcyBTZXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfSXNTdGF0dXNTZXQoIEFUOTFQU19QTUMgcFBNQywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBNQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9QTUNfR2V0U3RhdHVzKCBwUE1DICkgJiBmbGFnICk7DQp9IC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICogICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUlNUQw0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9SU1RTb2Z0UmVzZXQgKi8NCi8qKiBcYnJpZWYgU3RhcnQgU29mdHdhcmUgUmVzZXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUlNUU29mdFJlc2V0KCBBVDkxUFNfUlNUQyBwUlNUQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcmVzZXQgKQ0Kew0KICAgIHBSU1RDLT5SU1RDX1JDUiA9ICggMHhBNTAwMDAwMCB8IHJlc2V0ICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUlNUU2V0TW9kZSAqLw0KLyoqIFxicmllZiBTZXQgUmVzZXQgTW9kZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9SU1RTZXRNb2RlKCBBVDkxUFNfUlNUQyBwUlNUQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGUgKQ0Kew0KICAgIHBSU1RDLT5SU1RDX1JNUiA9ICggMHhBNTAwMDAwMCB8IG1vZGUgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9SU1RHZXRNb2RlICovDQovKiogXGJyaWVmIEdldCBSZXNldCBNb2RlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlNUR2V0TW9kZSggQVQ5MVBTX1JTVEMgcFJTVEMgKQ0Kew0KICAgIHJldHVybiggcFJTVEMtPlJTVENfUk1SICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUlNUR2V0U3RhdHVzICovDQovKiogXGJyaWVmIEdldCBSZXNldCBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SU1RHZXRTdGF0dXMoIEFUOTFQU19SU1RDIHBSU1RDICkNCnsNCiAgICByZXR1cm4oIHBSU1RDLT5SU1RDX1JTUiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1JTVElzU29mdFJzdEFjdGl2ZSAqLw0KLyoqIFxicmllZiBSZXR1cm4gIT0wIGlmIHNvZnR3YXJlIHJlc2V0IGlzIHN0aWxsIG5vdCBjb21wbGV0ZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SU1RJc1NvZnRSc3RBY3RpdmUoIEFUOTFQU19SU1RDIHBSU1RDICkNCnsNCiAgICByZXR1cm4oICggcFJTVEMtPlJTVENfUlNSICkgJiBBVDkxQ19SU1RDX1NSQ01QICk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBSVFRDDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgIEFUOTFGX1NldFJUVF9UaW1lQmFzZSgpICovDQovKiogXGJyaWVmICBTZXQgdGhlIFJUVCBwcmVzY2FsZXIgYWNjb3JkaW5nIHRvIHRoZSBUaW1lQmFzZSBpbiBtcyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SVFRTZXRUaW1lQmFzZSggQVQ5MVBTX1JUVEMgcFJUVEMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtcyApDQp7DQogICAgaWYoIG1zID4gMjAwMCApDQogICAgew0KICAgICAgICByZXR1cm4gMTsgLyogQVQ5MUNfVElNRV9PVVRfT0ZfUkFOR0UgKi8NCiAgICB9DQoNCiAgICBwUlRUQy0+UlRUQ19SVE1SICY9IH4weEZGRkY7DQogICAgcFJUVEMtPlJUVENfUlRNUiB8PSAoICggKCBtcyA8PCAxNSApIC8gMTAwMCApICYgMHhGRkZGICk7DQogICAgcmV0dXJuIDA7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgICBBVDkxRl9SVFRTZXRQcmVzY2FsZXIoKSAqLw0KLyoqIFxicmllZiAgU2V0IHRoZSBuZXcgcHJlc2NhbGVyIHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JUVFNldFByZXNjYWxlciggQVQ5MVBTX1JUVEMgcFJUVEMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcnRwcmVzICkNCnsNCiAgICBwUlRUQy0+UlRUQ19SVE1SICY9IH4weEZGRkY7DQogICAgcFJUVEMtPlJUVENfUlRNUiB8PSAoIHJ0cHJlcyAmIDB4RkZGRiApOw0KICAgIHJldHVybiggcFJUVEMtPlJUVENfUlRNUiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICAgQVQ5MUZfUlRUUmVzdGFydCgpICovDQovKiogXGJyaWVmICBSZXN0YXJ0IHRoZSBSVFQgcHJlc2NhbGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRSZXN0YXJ0KCBBVDkxUFNfUlRUQyBwUlRUQyApDQp7DQogICAgcFJUVEMtPlJUVENfUlRNUiB8PSBBVDkxQ19SVFRDX1JUVFJTVDsNCn0NCg0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICAgQVQ5MUZfUlRUX1NldEFsYXJtSU5UKCkgKi8NCi8qKiBcYnJpZWYgIEVuYWJsZSBSVFQgQWxhcm0gSW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRTZXRBbGFybUlOVCggQVQ5MVBTX1JUVEMgcFJUVEMgKQ0Kew0KICAgIHBSVFRDLT5SVFRDX1JUTVIgfD0gQVQ5MUNfUlRUQ19BTE1JRU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgICBBVDkxRl9SVFRfQ2xlYXJBbGFybUlOVCgpICovDQovKiogXGJyaWVmICBEaXNhYmxlIFJUVCBBbGFybSBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVENsZWFyQWxhcm1JTlQoIEFUOTFQU19SVFRDIHBSVFRDICkNCnsNCiAgICBwUlRUQy0+UlRUQ19SVE1SICY9IH5BVDkxQ19SVFRDX0FMTUlFTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgIEFUOTFGX1JUVF9TZXRSdHRJbmNJTlQoKSAqLw0KLyoqIFxicmllZiAgRW5hYmxlIFJUVCBJTkMgSW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRTZXRSdHRJbmNJTlQoIEFUOTFQU19SVFRDIHBSVFRDICkNCnsNCiAgICBwUlRUQy0+UlRUQ19SVE1SIHw9IEFUOTFDX1JUVENfUlRUSU5DSUVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICAgQVQ5MUZfUlRUX0NsZWFyUnR0SW5jSU5UKCkgKi8NCi8qKiBcYnJpZWYgIERpc2FibGUgUlRUIElOQyBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVENsZWFyUnR0SW5jSU5UKCBBVDkxUFNfUlRUQyBwUlRUQyApDQp7DQogICAgcFJUVEMtPlJUVENfUlRNUiAmPSB+QVQ5MUNfUlRUQ19SVFRJTkNJRU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgICBBVDkxRl9SVFRfU2V0QWxhcm1WYWx1ZSgpICovDQovKiogXGJyaWVmICBTZXQgUlRUIEFsYXJtIFZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRTZXRBbGFybVZhbHVlKCBBVDkxUFNfUlRUQyBwUlRUQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGFsYXJtICkNCnsNCiAgICBwUlRUQy0+UlRUQ19SVEFSID0gYWxhcm07DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgICBBVDkxRl9SVFRfR2V0QWxhcm1WYWx1ZSgpICovDQovKiogXGJyaWVmICBHZXQgUlRUIEFsYXJtIFZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JUVEdldEFsYXJtVmFsdWUoIEFUOTFQU19SVFRDIHBSVFRDICkNCnsNCiAgICByZXR1cm4oIHBSVFRDLT5SVFRDX1JUQVIgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgIEFUOTFGX1JUVEdldFN0YXR1cygpICovDQovKiogXGJyaWVmICBSZWFkIHRoZSBSVFQgc3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JUVEdldFN0YXR1cyggQVQ5MVBTX1JUVEMgcFJUVEMgKQ0Kew0KICAgIHJldHVybiggcFJUVEMtPlJUVENfUlRTUiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICAgQVQ5MUZfUlRUX1JlYWRWYWx1ZSgpICovDQovKiogXGJyaWVmICBSZWFkIHRoZSBSVFQgdmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlRUUmVhZFZhbHVlKCBBVDkxUFNfUlRUQyBwUlRUQyApDQp7DQogICAgcmVnaXN0ZXIgdm9sYXRpbGUgdW5zaWduZWQgaW50IHZhbDEsIHZhbDI7DQoNCiAgICBkbw0KICAgIHsNCiAgICAgICAgdmFsMSA9IHBSVFRDLT5SVFRDX1JUVlI7DQogICAgICAgIHZhbDIgPSBwUlRUQy0+UlRUQ19SVFZSOw0KICAgIH0NCiAgICB3aGlsZSggdmFsMSAhPSB2YWwyICk7DQoNCiAgICByZXR1cm4oIHZhbDEgKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFBJVEMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJVEluaXQgKi8NCi8qKiBcYnJpZWYgU3lzdGVtIHRpbWVyIGluaXQgOiBwZXJpb2QgaW4gtXNlY29uZCwgc3lzdGVtIGNsb2NrIGZyZXEgaW4gTUh6ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVEluaXQoIEFUOTFQU19QSVRDIHBQSVRDLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGVyaW9kLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGl0X2ZyZXF1ZW5jeSApDQp7DQogICAgcFBJVEMtPlBJVENfUElNUiAgPSBwZXJpb2QgPyAoIHBlcmlvZCAqIHBpdF9mcmVxdWVuY3kgKyA4ICkgPj4gNCA6IDA7IC8qICs4IHRvIGF2b2lkICUxMCBhbmQgLzEwICovDQogICAgcFBJVEMtPlBJVENfUElNUiB8PSBBVDkxQ19QSVRDX1BJVEVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJVFNldFBJViAqLw0KLyoqIFxicmllZiBTZXQgdGhlIFBJVCBQZXJpb2RpYyBJbnRlcnZhbCBWYWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSVRTZXRQSVYoIEFUOTFQU19QSVRDIHBQSVRDLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaXYgKQ0Kew0KICAgIHBQSVRDLT5QSVRDX1BJTVIgPSBwaXYgfCAoIHBQSVRDLT5QSVRDX1BJTVIgJiAoIEFUOTFDX1BJVENfUElURU4gfCBBVDkxQ19QSVRDX1BJVElFTiApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElURW5hYmxlSW50ICovDQovKiogXGJyaWVmIEVuYWJsZSBQSVQgcGVyaW9kaWMgaW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVEVuYWJsZUludCggQVQ5MVBTX1BJVEMgcFBJVEMgKQ0Kew0KICAgIHBQSVRDLT5QSVRDX1BJTVIgfD0gQVQ5MUNfUElUQ19QSVRJRU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElURGlzYWJsZUludCAqLw0KLyoqIFxicmllZiBEaXNhYmxlIFBJVCBwZXJpb2RpYyBpbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElURGlzYWJsZUludCggQVQ5MVBTX1BJVEMgcFBJVEMgKQ0Kew0KICAgIHBQSVRDLT5QSVRDX1BJTVIgJj0gfkFUOTFDX1BJVENfUElUSUVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJVEdldE1vZGUgKi8NCi8qKiBcYnJpZWYgUmVhZCBQSVQgbW9kZSByZWdpc3RlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJVEdldE1vZGUoIEFUOTFQU19QSVRDIHBQSVRDICkNCnsNCiAgICByZXR1cm4oIHBQSVRDLT5QSVRDX1BJTVIgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSVRHZXRTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmVhZCBQSVQgc3RhdHVzIHJlZ2lzdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElUR2V0U3RhdHVzKCBBVDkxUFNfUElUQyBwUElUQyApDQp7DQogICAgcmV0dXJuKCBwUElUQy0+UElUQ19QSVNSICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElUR2V0UElJUiAqLw0KLyoqIFxicmllZiBSZWFkIFBJVCBDUElWIGFuZCBQSUNOVCB3aXRob3V0IHJlc3NldHRpbmcgdGhlIGNvdW50ZXJzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElUR2V0UElJUiggQVQ5MVBTX1BJVEMgcFBJVEMgKQ0Kew0KICAgIHJldHVybiggcFBJVEMtPlBJVENfUElJUiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJVEdldFBJVlIgKi8NCi8qKiBcYnJpZWYgUmVhZCBTeXN0ZW0gdGltZXIgQ1BJViBhbmQgUElDTlQgd2l0aG91dCByZXNzZXR0aW5nIHRoZSBjb3VudGVycyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJVEdldFBJVlIoIEFUOTFQU19QSVRDIHBQSVRDICkNCnsNCiAgICByZXR1cm4oIHBQSVRDLT5QSVRDX1BJVlIgKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFdEVEMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1dEVFNldE1vZGUgKi8NCi8qKiBcYnJpZWYgU2V0IFdhdGNoZG9nIE1vZGUgUmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfV0RUU2V0TW9kZSggQVQ5MVBTX1dEVEMgcFdEVEMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBNb2RlICkNCnsNCiAgICBwV0RUQy0+V0RUQ19XRE1SID0gTW9kZTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9XRFRSZXN0YXJ0ICovDQovKiogXGJyaWVmIFJlc3RhcnQgV2F0Y2hkb2cgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfV0RUUmVzdGFydCggQVQ5MVBTX1dEVEMgcFdEVEMgKQ0Kew0KICAgIHBXRFRDLT5XRFRDX1dEQ1IgPSAweEE1MDAwMDAxOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1dEVFNHZXR0YXR1cyAqLw0KLyoqIFxicmllZiBHZXQgV2F0Y2hkb2cgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfV0RUU0dldHRhdHVzKCBBVDkxUFNfV0RUQyBwV0RUQyApDQp7DQogICAgcmV0dXJuKCBwV0RUQy0+V0RUQ19XRFNSICYgMHgzICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfV0RUR2V0UGVyaW9kICovDQovKiogXGJyaWVmIFRyYW5zbGF0ZSBtcyBpbnRvIFdhdGNoZG9nIENvbXBhdGlibGUgdmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9XRFRHZXRQZXJpb2QoIHVuc2lnbmVkIGludCBtcyApDQp7DQogICAgaWYoICggbXMgPCA0ICkgfHwgKCBtcyA+IDE2MDAwICkgKQ0KICAgIHsNCiAgICAgICAgcmV0dXJuIDA7DQogICAgfQ0KDQogICAgcmV0dXJuKCAoIG1zIDw8IDggKSAvIDEwMDAgKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFZSRUcNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1ZSRUdfRW5hYmxlX0xvd1Bvd2VyTW9kZSAqLw0KLyoqIFxicmllZiBFbmFibGUgVlJFRyBMb3cgUG93ZXIgTW9kZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9WUkVHX0VuYWJsZV9Mb3dQb3dlck1vZGUoIEFUOTFQU19WUkVHIHBWUkVHICkNCnsNCiAgICBwVlJFRy0+VlJFR19NUiB8PSBBVDkxQ19WUkVHX1BTVERCWTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9WUkVHX0Rpc2FibGVfTG93UG93ZXJNb2RlICovDQovKiogXGJyaWVmIERpc2FibGUgVlJFRyBMb3cgUG93ZXIgTW9kZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9WUkVHX0Rpc2FibGVfTG93UG93ZXJNb2RlKCBBVDkxUFNfVlJFRyBwVlJFRyApDQp7DQogICAgcFZSRUctPlZSRUdfTVIgJj0gfkFUOTFDX1ZSRUdfUFNUREJZOw0KfSAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIE1DDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiNkZWZpbmUgQVQ5MUNfTUNfQ09SUkVDVF9LRVkgICAgKCAoIHVuc2lnbmVkIGludCApIDB4NUEgPDwgMjQgKSAvKiAoTUMpIENvcnJlY3QgUHJvdGVjdCBLZXkgKi8NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9NQ19SZW1hcCAqLw0KLyoqIFxicmllZiBNYWtlIFJlbWFwICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX01DX1JlbWFwKCB2b2lkICkgLyogKi8NCnsNCiAgICBBVDkxUFNfTUMgcE1DID0gKCBBVDkxUFNfTUMgKSBBVDkxQ19CQVNFX01DOw0KDQogICAgcE1DLT5NQ19SQ1IgPSBBVDkxQ19NQ19SQ0I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfTUNfRUZDX0NmZ01vZGVSZWcgKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBFRkMgTW9kZSBSZWdpc3RlciBvZiB0aGUgTUMgY29udHJvbGxlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9NQ19FRkNfQ2ZnTW9kZVJlZyggQVQ5MVBTX01DIHBNQywgICAgICAvKiBwb2ludGVyIHRvIGEgTUMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGUgKSAvKiBtb2RlIHJlZ2lzdGVyICovDQp7DQogICAgLyogV3JpdGUgdG8gdGhlIEZNUiByZWdpc3RlciAqLw0KICAgIHBNQy0+TUNfRk1SID0gbW9kZTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9NQ19FRkNfR2V0TW9kZVJlZyAqLw0KLyoqIFxicmllZiBSZXR1cm4gTUMgRUZDIE1vZGUgUmVnc2l0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfR2V0TW9kZVJlZyggQVQ5MVBTX01DIHBNQyApIC8qIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBNQy0+TUNfRk1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX01DX0VGQ19Db21wdXRlRk1DTiAqLw0KLyoqIFxicmllZiBSZXR1cm4gTUMgRUZDIE1vZGUgUmVnc2l0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfQ29tcHV0ZUZNQ04oIGludCBtYXN0ZXJfY2xvY2sgKSAvKiBtYXN0ZXIgY2xvY2sgaW4gSHogKi8NCnsNCiAgICByZXR1cm4oIG1hc3Rlcl9jbG9jayAvIDEwMDAwMDAgKyAyICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfTUNfRUZDX1BlcmZvcm1DbWQgKi8NCi8qKiBcYnJpZWYgUGVyZm9ybSBFRkMgQ29tbWFuZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9NQ19FRkNfUGVyZm9ybUNtZCggQVQ5MVBTX01DIHBNQywgLyogcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9jbWQgKQ0Kew0KICAgIHBNQy0+TUNfRkNSID0gdHJhbnNmZXJfY21kOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX01DX0VGQ19HZXRTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIE1DIEVGQyBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfR2V0U3RhdHVzKCBBVDkxUFNfTUMgcE1DICkgLyogcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcE1DLT5NQ19GU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfTUNfRUZDX0lzSW50ZXJydXB0TWFza2VkICovDQovKiogXGJyaWVmIFRlc3QgaWYgRUZDIE1DIEludGVycnVwdCBpcyBNYXNrZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfSXNJbnRlcnJ1cHRNYXNrZWQoIEFUOTFQU19NQyBwTUMsICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX01DX0VGQ19HZXRNb2RlUmVnKCBwTUMgKSAmIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9NQ19FRkNfSXNJbnRlcnJ1cHRTZXQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBFRkMgTUMgSW50ZXJydXB0IGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX01DX0VGQ19Jc0ludGVycnVwdFNldCggQVQ5MVBTX01DIHBNQywgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgTUMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfTUNfRUZDX0dldFN0YXR1cyggcE1DICkgJiBmbGFnICk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBTUEkNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9PcGVuICovDQovKiogXGJyaWVmIE9wZW4gYSBTUEkgUG9ydCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NQSV9PcGVuKCBjb25zdCB1bnNpZ25lZCBpbnQgbnVsbCApIC8qIFxhcmcgKi8NCnsNCiAgICAvKiBOT1QgREVGSU5FRCBBVCBUSElTIE1PTUVOVCAqLw0KICAgIHJldHVybiggMCApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9DZmdDcyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgU1BJIGNoaXAgc2VsZWN0IHJlZ2lzdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9DZmdDcyggQVQ5MVBTX1NQSSBwU1BJLCAvKiBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY3MsICAgICAgICAgIC8qIFNQSSBjcyBudW1iZXIgKDAgdG8gMykgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsICkgICAgICAgIC8qICBjaGlwIHNlbGVjdCByZWdpc3RlciAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgQ1NSIHJlZ2lzdGVyICovDQogICAgKiggcFNQSS0+U1BJX0NTUiArIGNzICkgPSB2YWw7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1BJX0VuYWJsZUl0ICovDQovKiogXGJyaWVmIEVuYWJsZSBTUEkgaW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9FbmFibGVJdCggQVQ5MVBTX1NQSSBwU1BJLCAgICAvKiBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIElUIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlciAqLw0KICAgIHBTUEktPlNQSV9JRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9EaXNhYmxlSXQgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBTUEkgaW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9EaXNhYmxlSXQoIEFUOTFQU19TUEkgcFNQSSwgICAgLyogcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogSVQgdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlciAqLw0KICAgIHBTUEktPlNQSV9JRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9SZXNldCAqLw0KLyoqIFxicmllZiBSZXNldCB0aGUgU1BJIGNvbnRyb2xsZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX1Jlc2V0KCBBVDkxUFNfU1BJIHBTUEkgLyogcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgQ1IgcmVnaXN0ZXIgKi8NCiAgICBwU1BJLT5TUElfQ1IgPSBBVDkxQ19TUElfU1dSU1Q7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1BJX0VuYWJsZSAqLw0KLyoqIFxicmllZiBFbmFibGUgdGhlIFNQSSBjb250cm9sbGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9FbmFibGUoIEFUOTFQU19TUEkgcFNQSSAvKiBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgQ1IgcmVnaXN0ZXIgKi8NCiAgICBwU1BJLT5TUElfQ1IgPSBBVDkxQ19TUElfU1BJRU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1BJX0Rpc2FibGUgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSB0aGUgU1BJIGNvbnRyb2xsZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX0Rpc2FibGUoIEFUOTFQU19TUEkgcFNQSSAvKiBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIENSIHJlZ2lzdGVyICovDQogICAgcFNQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NQSURJUzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUElfQ2ZnTW9kZSAqLw0KLyoqIFxicmllZiBFbmFibGUgdGhlIFNQSSBjb250cm9sbGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9DZmdNb2RlKCBBVDkxUFNfU1BJIHBTUEksIC8qIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGUgKSAgICAgICAvKiBtb2RlIHJlZ2lzdGVyICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBNUiByZWdpc3RlciAqLw0KICAgIHBTUEktPlNQSV9NUiA9IG1vZGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1BJX0NmZ1BDUyAqLw0KLyoqIFxicmllZiBTd2l0Y2ggdG8gdGhlIGNvcnJlY3QgUENTIG9mIFNQSSBNb2RlIFJlZ2lzdGVyIDogRml4ZWQgUGVyaXBoZXJhbCBTZWxlY3RlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2ZnUENTKCBBVDkxUFNfU1BJIHBTUEksICAvKiBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBQQ1NfRGV2aWNlICkgLyogUENTIG9mIHRoZSBEZXZpY2UgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyICovDQogICAgcFNQSS0+U1BJX01SICY9IDB4RkZGMEZGRkY7DQogICAgcFNQSS0+U1BJX01SIHw9ICggKCBQQ1NfRGV2aWNlIDw8IDE2ICkgJiBBVDkxQ19TUElfUENTICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1BJX1JlY2VpdmVGcmFtZSAqLw0KLyoqIFxicmllZiBSZXR1cm4gMiBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBCdWZmZXIgYW5kIE5leHQgQnVmZmVyLCAxIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXphZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYnVzeSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NQSV9SZWNlaXZlRnJhbWUoIEFUOTFQU19TUEkgcFNQSSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBOZXh0QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KICAgIHJldHVybiBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lKA0KICAgICAgICAoIEFUOTFQU19QREMgKSAmKCBwU1BJLT5TUElfUlBSICksDQogICAgICAgIHBCdWZmZXIsDQogICAgICAgIHN6QnVmZmVyLA0KICAgICAgICBwTmV4dEJ1ZmZlciwNCiAgICAgICAgc3pOZXh0QnVmZmVyICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1BJX1NlbmRGcmFtZSAqLw0KLyoqIFxicmllZiBSZXR1cm4gMiBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBCdWZmZXIgYW5kIE5leHQgQnVmZmVyLCAxIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXphZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYlNQSXkgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TUElfU2VuZEZyYW1lKCBBVDkxUFNfU1BJIHBTUEksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwTmV4dEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCiAgICByZXR1cm4gQVQ5MUZfUERDX1NlbmRGcmFtZSgNCiAgICAgICAgKCBBVDkxUFNfUERDICkgJiggcFNQSS0+U1BJX1JQUiApLA0KICAgICAgICBwQnVmZmVyLA0KICAgICAgICBzekJ1ZmZlciwNCiAgICAgICAgcE5leHRCdWZmZXIsDQogICAgICAgIHN6TmV4dEJ1ZmZlciApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9DbG9zZSAqLw0KLyoqIFxicmllZiBDbG9zZSBTUEk6IGRpc2FibGUgSVQgZGlzYWJsZSB0cmFuc2ZlcnQsIGNsb3NlIFBEQyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2xvc2UoIEFUOTFQU19TUEkgcFNQSSApIC8qIFxhcmcgcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyICovDQp7DQogICAgLyoqIFJlc2V0IGFsbCB0aGUgQ2hpcCBTZWxlY3QgcmVnaXN0ZXIgKi8NCiAgICBwU1BJLT5TUElfQ1NSWyAwIF0gPSAwOw0KICAgIHBTUEktPlNQSV9DU1JbIDEgXSA9IDA7DQogICAgcFNQSS0+U1BJX0NTUlsgMiBdID0gMDsNCiAgICBwU1BJLT5TUElfQ1NSWyAzIF0gPSAwOw0KDQogICAgLyoqIFJlc2V0IHRoZSBTUEkgbW9kZSAqLw0KICAgIHBTUEktPlNQSV9NUiAgICAgICA9IDA7DQoNCiAgICAvKiogRGlzYWJsZSBhbGwgaW50ZXJydXB0cyAqLw0KICAgIHBTUEktPlNQSV9JRFIgICAgICA9IDB4RkZGRkZGRkY7DQoNCiAgICAvKiogQWJvcnQgdGhlIFBlcmlwaGVyYWwgRGF0YSBUcmFuc2ZlcnMgKi8NCiAgICBBVDkxRl9QRENfQ2xvc2UoICggQVQ5MVBTX1BEQyApICYoIHBTUEktPlNQSV9SUFIgKSApOw0KDQogICAgLyoqIERpc2FibGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyIGFuZCBzdG9wIGFueSBhY3Rpdml0eSBpbW1lZGlhdGVseSAqLw0KICAgIHBTUEktPlNQSV9DUiAgICAgICA9IEFUOTFDX1NQSV9TUElESVM7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1BJX1B1dENoYXIgKi8NCi8qKiBcYnJpZWYgU2VuZCBhIGNoYXJhY3Rlcixkb2VzIG5vdCBjaGVjayBpZiByZWFkeSB0byBzZW5kICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9QdXRDaGFyKCBBVDkxUFNfU1BJIHBTUEksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hhcmFjdGVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNzX251bWJlciApDQp7DQogICAgdW5zaWduZWQgaW50IHZhbHVlX2Zvcl9jczsNCg0KICAgIHZhbHVlX2Zvcl9jcyAgPSAoIH4oIDEgPDwgY3NfbnVtYmVyICkgKSAmIDB4RjsgLypQbGFjZSBhIHplcm8gYW1vbmcgYSA0IE9ORXMgbnVtYmVyICovDQogICAgcFNQSS0+U1BJX1REUiA9ICggY2hhcmFjdGVyICYgMHhGRkZGICkgfCAoIHZhbHVlX2Zvcl9jcyA8PCAxNiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9HZXRDaGFyICovDQovKiogXGJyaWVmIFJlY2VpdmUgYSBjaGFyYWN0ZXIsZG9lcyBub3QgY2hlY2sgaWYgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfU1BJX0dldENoYXIoIGNvbnN0IEFUOTFQU19TUEkgcFNQSSApDQp7DQogICAgcmV0dXJuKCAoIHBTUEktPlNQSV9SRFIgKSAmIDB4RkZGRiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBTUEkgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1BJX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8qIFxyZXR1cm4gU1BJIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KICAgIEFUOTFQU19TUEkgcFNwaSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFNwaS0+U1BJX0lNUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUElfSXNJbnRlcnJ1cHRNYXNrZWQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBTUEkgSW50ZXJydXB0IGlzIE1hc2tlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1NQSV9Jc0ludGVycnVwdE1hc2tlZCggQVQ5MVBTX1NQSSBwU3BpLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1NQSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCBwU3BpICkgJiBmbGFnICk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBVU0FSVA0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfQmF1ZHJhdGUgKi8NCi8qKiBcYnJpZWYgQ2FsY3VsYXRlIHRoZSBiYXVkcmF0ZSAqLw0KLyoqIFN0YW5kYXJkIEFzeW5jaHJvbm91cyBNb2RlIDogOCBiaXRzICwgMSBzdG9wICwgbm8gcGFyaXR5ICovDQojZGVmaW5lIEFUOTFDX1VTX0FTWU5DX01PREUgICAgXA0KICAgICggQVQ5MUNfVVNfVVNNT0RFX05PUk1BTCArIFwNCiAgICAgIEFUOTFDX1VTX05CU1RPUF8xX0JJVCArICBcDQogICAgICBBVDkxQ19VU19QQVJfTk9ORSArICAgICAgXA0KICAgICAgQVQ5MUNfVVNfQ0hSTF84X0JJVFMgKyAgIFwNCiAgICAgIEFUOTFDX1VTX0NMS1NfQ0xPQ0sgKQ0KDQovKiogU3RhbmRhcmQgRXh0ZXJuYWwgQXN5bmNocm9ub3VzIE1vZGUgOiA4IGJpdHMgLCAxIHN0b3AgLCBubyBwYXJpdHkgKi8NCiNkZWZpbmUgQVQ5MUNfVVNfQVNZTkNfU0NLX01PREUgXA0KICAgICggQVQ5MUNfVVNfVVNNT0RFX05PUk1BTCArICBcDQogICAgICBBVDkxQ19VU19OQlNUT1BfMV9CSVQgKyAgIFwNCiAgICAgIEFUOTFDX1VTX1BBUl9OT05FICsgICAgICAgXA0KICAgICAgQVQ5MUNfVVNfQ0hSTF84X0JJVFMgKyAgICBcDQogICAgICBBVDkxQ19VU19DTEtTX0VYVCApDQoNCi8qKiBTdGFuZGFyZCBTeW5jaHJvbm91cyBNb2RlIDogOCBiaXRzICwgMSBzdG9wICwgbm8gcGFyaXR5ICovDQojZGVmaW5lIEFUOTFDX1VTX1NZTkNfTU9ERSAgICAgXA0KICAgICggQVQ5MUNfVVNfU1lOQyArICAgICAgICAgIFwNCiAgICAgIEFUOTFDX1VTX1VTTU9ERV9OT1JNQUwgKyBcDQogICAgICBBVDkxQ19VU19OQlNUT1BfMV9CSVQgKyAgXA0KICAgICAgQVQ5MUNfVVNfUEFSX05PTkUgKyAgICAgIFwNCiAgICAgIEFUOTFDX1VTX0NIUkxfOF9CSVRTICsgICBcDQogICAgICBBVDkxQ19VU19DTEtTX0NMT0NLICkNCg0KLyoqIFNDSyB1c2VkIExhYmVsICovDQojZGVmaW5lIEFUOTFDX1VTX1NDS19VU0VEICAgICggQVQ5MUNfVVNfQ0tMTyB8IEFUOTFDX1VTX0NMS1NfRVhUICkNCg0KLyoqIFN0YW5kYXJkIElTTyBUPTAgTW9kZSA6IDggYml0cyAsIDEgc3RvcCAsIHBhcml0eSAqLw0KI2RlZmluZSBBVDkxQ19VU19JU09fUkVBREVSX01PREUgIFwNCiAgICAoIEFUOTFDX1VTX1VTTU9ERV9JU083ODE2XzAgKyBcDQogICAgICBBVDkxQ19VU19DTEtTX0NMT0NLICsgICAgICAgXA0KICAgICAgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgICAgIFwNCiAgICAgIEFUOTFDX1VTX1BBUl9FVkVOICsgICAgICAgICBcDQogICAgICBBVDkxQ19VU19DSFJMXzhfQklUUyArICAgICAgXA0KICAgICAgQVQ5MUNfVVNfQ0tMTyArICAgICAgICAgICAgIFwNCiAgICAgIEFUOTFDX1VTX09WRVIgKQ0KDQovKiogU3RhbmRhcmQgSVJEQSBtb2RlICovDQojZGVmaW5lIEFUOTFDX1VTX0FTWU5DX0lSREFfTU9ERSBcDQogICAgKCBBVDkxQ19VU19VU01PREVfSVJEQSArICAgICBcDQogICAgICBBVDkxQ19VU19OQlNUT1BfMV9CSVQgKyAgICBcDQogICAgICBBVDkxQ19VU19QQVJfTk9ORSArICAgICAgICBcDQogICAgICBBVDkxQ19VU19DSFJMXzhfQklUUyArICAgICBcDQogICAgICBBVDkxQ19VU19DTEtTX0NMT0NLICkNCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19CYXVkcmF0ZSAqLw0KLyoqIFxicmllZiBDYWx1Y3VsYXRlIGJhdWRfdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBtYWluIGNsb2NrIGFuZCB0aGUgYmF1ZCByYXRlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfQmF1ZHJhdGUoIGNvbnN0IHVuc2lnbmVkIGludCBtYWluX2Nsb2NrLCAvKiBcYXJnIHBlcmlwaGVyYWwgY2xvY2sgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGJhdWRfcmF0ZSApIC8qIFxhcmcgVUFSVCBiYXVkcmF0ZSAqLw0Kew0KICAgIHVuc2lnbmVkIGludCBiYXVkX3ZhbHVlID0gKCAoIG1haW5fY2xvY2sgKiAxMCApIC8gKCBiYXVkX3JhdGUgKiAxNiApICk7DQoNCiAgICBpZiggKCBiYXVkX3ZhbHVlICUgMTAgKSA+PSA1ICkNCiAgICB7DQogICAgICAgIGJhdWRfdmFsdWUgPSAoIGJhdWRfdmFsdWUgLyAxMCApICsgMTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgICAgYmF1ZF92YWx1ZSAvPSAxMDsNCiAgICB9DQoNCiAgICByZXR1cm4gYmF1ZF92YWx1ZTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19TZXRCYXVkcmF0ZSAqLw0KLyoqIFxicmllZiBTZXQgdGhlIGJhdWRyYXRlIGFjY29yZGluZyB0byB0aGUgQ1BVIGNsb2NrICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX1NldEJhdWRyYXRlKCBBVDkxUFNfVVNBUlQgcFVTQVJULCAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWFpbkNsb2NrLCAvKiBcYXJnIHBlcmlwaGVyYWwgY2xvY2sgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcGVlZCApICAgIC8qIFxhcmcgVUFSVCBiYXVkcmF0ZSAqLw0Kew0KICAgIC8qKiBEZWZpbmUgdGhlIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVyICovDQogICAgcFVTQVJULT5VU19CUkdSID0gQVQ5MUZfVVNfQmF1ZHJhdGUoIG1haW5DbG9jaywgc3BlZWQgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19TZXRUaW1lZ3VhcmQgKi8NCi8qKiBcYnJpZWYgU2V0IFVTQVJUIHRpbWVndWFyZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19TZXRUaW1lZ3VhcmQoIEFUOTFQU19VU0FSVCBwVVNBUlQsICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRpbWVndWFyZCApIC8qIFxhcmcgdGltZWd1YXJkIHZhbHVlICovDQp7DQogICAgLyoqIFdyaXRlIHRoZSBUaW1lZ3VhcmQgUmVnaXN0ZXIgKi8NCiAgICBwVVNBUlQtPlVTX1RUR1IgPSB0aW1lZ3VhcmQ7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfRW5hYmxlSXQgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFVTQVJUIElUICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0VuYWJsZUl0KCBBVDkxUFNfVVNBUlQgcFVTQVJULCAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApICAvKiBcYXJnIElUIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlciAqLw0KICAgIHBVU0FSVC0+VVNfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19EaXNhYmxlSXQgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBVU0FSVCBJVCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19EaXNhYmxlSXQoIEFUOTFQU19VU0FSVCBwVVNBUlQsIC8qIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApICAvKiBcYXJnIElUIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwVVNBUlQtPlVTX0lEUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfQ29uZmlndXJlICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSBVU0FSVCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19Db25maWd1cmUoIEFUOTFQU19VU0FSVCBwVVNBUlQsICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1haW5DbG9jaywgIC8qIFxhcmcgcGVyaXBoZXJhbCBjbG9jayAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlLCAgICAgICAvKiBcYXJnIG1vZGUgUmVnaXN0ZXIgdG8gYmUgcHJvZ3JhbW1lZCAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYXVkUmF0ZSwgICAvKiBcYXJnIGJhdWRyYXRlIHRvIGJlIHByb2dyYW1tZWQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdGltZWd1YXJkICkgLyogXGFyZyB0aW1lZ3VhcmQgdG8gYmUgcHJvZ3JhbW1lZCAqLw0Kew0KICAgIC8qKiBEaXNhYmxlIGludGVycnVwdHMgKi8NCiAgICBwVVNBUlQtPlVTX0lEUiA9ICggdW5zaWduZWQgaW50ICkgLTE7DQoNCiAgICAvKiogUmVzZXQgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyICovDQogICAgcFVTQVJULT5VU19DUiAgPSBBVDkxQ19VU19SU1RSWCB8IEFUOTFDX1VTX1JTVFRYIHwgQVQ5MUNfVVNfUlhESVMgfCBBVDkxQ19VU19UWERJUzsNCg0KICAgIC8qKiBEZWZpbmUgdGhlIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVyICovDQogICAgQVQ5MUZfVVNfU2V0QmF1ZHJhdGUoIHBVU0FSVCwgbWFpbkNsb2NrLCBiYXVkUmF0ZSApOw0KDQogICAgLyoqIFdyaXRlIHRoZSBUaW1lZ3VhcmQgUmVnaXN0ZXIgKi8NCiAgICBBVDkxRl9VU19TZXRUaW1lZ3VhcmQoIHBVU0FSVCwgdGltZWd1YXJkICk7DQoNCiAgICAvKiogQ2xlYXIgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQ291bnRlcnMgKi8NCiAgICBBVDkxRl9QRENfT3BlbiggKCBBVDkxUFNfUERDICkgJiggcFVTQVJULT5VU19SUFIgKSApOw0KDQogICAgLyoqIERlZmluZSB0aGUgVVNBUlQgbW9kZSAqLw0KICAgIHBVU0FSVC0+VVNfTVIgID0gbW9kZTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19FbmFibGVSeCAqLw0KLyoqIFxicmllZiBFbmFibGUgcmVjZWl2aW5nIGNoYXJhY3RlcnMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRW5hYmxlUngoIEFUOTFQU19VU0FSVCBwVVNBUlQgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQp7DQogICAgLyoqIEVuYWJsZSByZWNlaXZlciAqLw0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SWEVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX0VuYWJsZVR4ICovDQovKiogXGJyaWVmIEVuYWJsZSBzZW5kaW5nIGNoYXJhY3RlcnMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRW5hYmxlVHgoIEFUOTFQU19VU0FSVCBwVVNBUlQgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQp7DQogICAgLyoqIEVuYWJsZSAgdHJhbnNtaXR0ZXIgKi8NCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfVFhFTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19SZXNldFJ4ICovDQovKiogXGJyaWVmIFJlc2V0IFJlY2VpdmVyIGFuZCByZS1lbmFibGUgaXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfUmVzZXRSeCggQVQ5MVBTX1VTQVJUIHBVU0FSVCApIC8qIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIgKi8NCnsNCiAgICAvKiogUmVzZXQgcmVjZWl2ZXIgKi8NCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlNUUlg7DQogICAgLyoqIFJlLUVuYWJsZSByZWNlaXZlciAqLw0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SWEVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX1Jlc2V0VHggKi8NCi8qKiBcYnJpZWYgUmVzZXQgVHJhbnNtaXR0ZXIgYW5kIHJlLWVuYWJsZSBpdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19SZXNldFR4KCBBVDkxUFNfVVNBUlQgcFVTQVJUICkgLyogXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlciAqLw0Kew0KICAgIC8qKiBSZXNldCB0cmFuc21pdHRlciAqLw0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SU1RUWDsNCiAgICAvKiogRW5hYmxlIHRyYW5zbWl0dGVyICovDQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1RYRU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfRGlzYWJsZVJ4ICovDQovKiogXGJyaWVmIERpc2FibGUgUmVjZWl2ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRGlzYWJsZVJ4KCBBVDkxUFNfVVNBUlQgcFVTQVJUICkgLyogXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlciAqLw0Kew0KICAgIC8qKiBEaXNhYmxlIHJlY2VpdmVyICovDQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1JYRElTOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX0Rpc2FibGVUeCAqLw0KLyoqIFxicmllZiBEaXNhYmxlIFRyYW5zbWl0dGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0Rpc2FibGVUeCggQVQ5MVBTX1VTQVJUIHBVU0FSVCApIC8qIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIgKi8NCnsNCiAgICAvKiogRGlzYWJsZSB0cmFuc21pdHRlciAqLw0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19UWERJUzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19DbG9zZSAqLw0KLyoqIFxicmllZiBDbG9zZSBVU0FSVDogZGlzYWJsZSBJVCBkaXNhYmxlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciwgY2xvc2UgUERDICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0Nsb3NlKCBBVDkxUFNfVVNBUlQgcFVTQVJUICkgLyogXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlciAqLw0Kew0KICAgIC8qKiBSZXNldCB0aGUgYmF1ZCByYXRlIGRpdmlzb3IgcmVnaXN0ZXIgKi8NCiAgICBwVVNBUlQtPlVTX0JSR1IgPSAwOw0KDQogICAgLyoqIFJlc2V0IHRoZSBVU0FSVCBtb2RlICovDQogICAgcFVTQVJULT5VU19NUiAgID0gMDsNCg0KICAgIC8qKiBSZXNldCB0aGUgVGltZWd1YXJkIFJlZ2lzdGVyICovDQogICAgcFVTQVJULT5VU19UVEdSID0gMDsNCg0KICAgIC8qKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovDQogICAgcFVTQVJULT5VU19JRFIgID0gMHhGRkZGRkZGRjsNCg0KICAgIC8qKiBBYm9ydCB0aGUgUGVyaXBoZXJhbCBEYXRhIFRyYW5zZmVycyAqLw0KICAgIEFUOTFGX1BEQ19DbG9zZSggKCBBVDkxUFNfUERDICkgJiggcFVTQVJULT5VU19SUFIgKSApOw0KDQogICAgLyoqIERpc2FibGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyIGFuZCBzdG9wIGFueSBhY3Rpdml0eSBpbW1lZGlhdGVseSAqLw0KICAgIHBVU0FSVC0+VVNfQ1IgICA9IEFUOTFDX1VTX1RYRElTIHwgQVQ5MUNfVVNfUlhESVMgfCBBVDkxQ19VU19SU1RUWCB8IEFUOTFDX1VTX1JTVFJYOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX1R4UmVhZHkgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIDEgaWYgYSBjaGFyYWN0ZXIgY2FuIGJlIHdyaXR0ZW4gaW4gVVNfVEhSICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfVHhSZWFkeSggQVQ5MVBTX1VTQVJUIHBVU0FSVCApIC8qIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4oIHBVU0FSVC0+VVNfQ1NSICYgQVQ5MUNfVVNfVFhSRFkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19SeFJlYWR5ICovDQovKiogXGJyaWVmIFJldHVybiAxIGlmIGEgY2hhcmFjdGVyIGNhbiBiZSByZWFkIGluIFVTX1JIUiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX1J4UmVhZHkoIEFUOTFQU19VU0FSVCBwVVNBUlQgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuKCBwVVNBUlQtPlVTX0NTUiAmIEFUOTFDX1VTX1JYUkRZICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfRXJyb3IgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBlcnJvciBmbGFnICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfRXJyb3IoIEFUOTFQU19VU0FSVCBwVVNBUlQgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuKCBwVVNBUlQtPlVTX0NTUiAmDQogICAgICAgICAgICAoIEFUOTFDX1VTX09WUkUgfCAgICAvKiBPdmVycnVuIGVycm9yICovDQogICAgICAgICAgICAgIEFUOTFDX1VTX0ZSQU1FIHwgICAvKiBGcmFtaW5nIGVycm9yICovDQogICAgICAgICAgICAgIEFUOTFDX1VTX1BBUkUgKSApOyAvKiBQYXJpdHkgZXJyb3IgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19QdXRDaGFyICovDQovKiogXGJyaWVmIFNlbmQgYSBjaGFyYWN0ZXIsZG9lcyBub3QgY2hlY2sgaWYgcmVhZHkgdG8gc2VuZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19QdXRDaGFyKCBBVDkxUFNfVVNBUlQgcFVTQVJULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcmFjdGVyICkNCnsNCiAgICBwVVNBUlQtPlVTX1RIUiA9ICggY2hhcmFjdGVyICYgMHgxRkYgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19HZXRDaGFyICovDQovKiogXGJyaWVmIFJlY2VpdmUgYSBjaGFyYWN0ZXIsZG9lcyBub3QgY2hlY2sgaWYgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfVVNfR2V0Q2hhciggY29uc3QgQVQ5MVBTX1VTQVJUIHBVU0FSVCApDQp7DQogICAgcmV0dXJuKCAoIHBVU0FSVC0+VVNfUkhSICkgJiAweDFGRiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX1NlbmRGcmFtZSAqLw0KLyoqIFxicmllZiBSZXR1cm4gMiBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBCdWZmZXIgYW5kIE5leHQgQnVmZmVyLCAxIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXphZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYnVzeSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX1NlbmRGcmFtZSggQVQ5MVBTX1VTQVJUIHBVU0FSVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwQnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBOZXh0QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6TmV4dEJ1ZmZlciApDQp7DQogICAgcmV0dXJuIEFUOTFGX1BEQ19TZW5kRnJhbWUoDQogICAgICAgICggQVQ5MVBTX1BEQyApICYoIHBVU0FSVC0+VVNfUlBSICksDQogICAgICAgIHBCdWZmZXIsDQogICAgICAgIHN6QnVmZmVyLA0KICAgICAgICBwTmV4dEJ1ZmZlciwNCiAgICAgICAgc3pOZXh0QnVmZmVyICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfUmVjZWl2ZUZyYW1lICovDQovKiogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemFlZCB3aXRoIE5leHQgQnVmZmVyLCAwIGlmIFBEQyBpcyBidXN5ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfUmVjZWl2ZUZyYW1lKCBBVDkxUFNfVVNBUlQgcFVTQVJULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcE5leHRCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCiAgICByZXR1cm4gQVQ5MUZfUERDX1JlY2VpdmVGcmFtZSgNCiAgICAgICAgKCBBVDkxUFNfUERDICkgJiggcFVTQVJULT5VU19SUFIgKSwNCiAgICAgICAgcEJ1ZmZlciwNCiAgICAgICAgc3pCdWZmZXIsDQogICAgICAgIHBOZXh0QnVmZmVyLA0KICAgICAgICBzek5leHRCdWZmZXIgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19TZXRJcmRhRmlsdGVyICovDQovKiogXGJyaWVmIFNldCB0aGUgdmFsdWUgb2YgSXJEYSBmaWx0ZXIgdHJlZ2lzdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX1NldElyZGFGaWx0ZXIoIEFUOTFQU19VU0FSVCBwVVNBUlQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdmFsdWUgKQ0Kew0KICAgIHBVU0FSVC0+VVNfSUYgPSB2YWx1ZTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFNTQw0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8qKiBEZWZpbmUgdGhlIHN0YW5kYXJkIEkyUyBtb2RlIGNvbmZpZ3VyYXRpb24gKi8NCg0KLyoqIENvbmZpZ3VyYXRpb24gdG8gc2V0IGluIHRoZSBTU0MgVHJhbnNtaXQgQ2xvY2sgTW9kZSBSZWdpc3RlciAqLw0KLyoqIFBhcmFtZXRlcnMgOiAgbmJfYml0X2J5X3Nsb3QgOiA4LCAxNiBvciAzMiBiaXRzICovDQovKiogICAgICAgICAgICAgICBuYl9zbG90X2J5X2ZyYW1lIDogbnVtYmVyIG9mIGNoYW5uZWxzICovDQojZGVmaW5lIEFUOTFDX0kyU19BU1lfTUFTVEVSX1RYX1NFVFRJTkcoIG5iX2JpdF9ieV9zbG90LCBuYl9zbG90X2J5X2ZyYW1lICkgXA0KICAgICggKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCiAgICAgIEFUOTFDX1NTQ19DS1NfRElWICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQogICAgICBBVDkxQ19TU0NfQ0tPX0NPTlRJTk9VUyArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICAgQVQ5MUNfU1NDX0NLR19OT05FICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCiAgICAgIEFUOTFDX1NTQ19TVEFSVF9GQUxMX1JGICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQogICAgICBBVDkxQ19TU0NfU1RUT1VUICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICAgKCAoIDEgPDwgMTYgKSAmIEFUOTFDX1NTQ19TVFRETFkgKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCiAgICAgICggKCAoICggbmJfYml0X2J5X3Nsb3QgKiBuYl9zbG90X2J5X2ZyYW1lICkgLyAyICkgLSAxICkgPDwgMjQgKSApDQoNCg0KLyoqIENvbmZpZ3VyYXRpb24gdG8gc2V0IGluIHRoZSBTU0MgVHJhbnNtaXQgRnJhbWUgTW9kZSBSZWdpc3RlciAqLw0KLyoqIFBhcmFtZXRlcnMgOiBuYl9iaXRfYnlfc2xvdCA6IDgsIDE2IG9yIDMyIGJpdHMgKi8NCi8qKiAgICAgICAgICAgICAgbmJfc2xvdF9ieV9mcmFtZSA6IG51bWJlciBvZiBjaGFubmVscyAqLw0KI2RlZmluZSBBVDkxQ19JMlNfQVNZX1RYX0ZSQU1FX1NFVFRJTkcoIG5iX2JpdF9ieV9zbG90LCBuYl9zbG90X2J5X2ZyYW1lICkgXA0KICAgICggKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICAgKCBuYl9iaXRfYnlfc2xvdCAtIDEgKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICAgQVQ5MUNfU1NDX01TQkYgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICAgKCAoICggbmJfc2xvdF9ieV9mcmFtZSAtIDEgKSA8PCA4ICkgJiBBVDkxQ19TU0NfREFUTkIgKSArICAgICAgICAgICAgXA0KICAgICAgKCAoICggbmJfYml0X2J5X3Nsb3QgLSAxICkgPDwgMTYgKSAmIEFUOTFDX1NTQ19GU0xFTiApICsgICAgICAgICAgICAgXA0KICAgICAgQVQ5MUNfU1NDX0ZTT1NfTkVHQVRJVkUgKQ0KDQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1NDX1NldEJhdWRyYXRlICovDQovKiogXGJyaWVmIFNldCB0aGUgYmF1ZHJhdGUgYWNjb3JkaW5nIHRvIHRoZSBDUFUgY2xvY2sgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX1NldEJhdWRyYXRlKCBBVDkxUFNfU1NDIHBTU0MsICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYWluQ2xvY2ssIC8qIFxhcmcgcGVyaXBoZXJhbCBjbG9jayAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcGVlZCApICAgIC8qIFxhcmcgU1NDIGJhdWRyYXRlICovDQp7DQogICAgdW5zaWduZWQgaW50IGJhdWRfdmFsdWU7DQoNCiAgICAvKiogRGVmaW5lIHRoZSBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3RlciAqLw0KICAgIGlmKCBzcGVlZCA9PSAwICkNCiAgICB7DQogICAgICAgIGJhdWRfdmFsdWUgPSAwOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBiYXVkX3ZhbHVlID0gKCB1bnNpZ25lZCBpbnQgKSAoIG1haW5DbG9jayAqIDEwICkgLyAoIDIgKiBzcGVlZCApOw0KDQogICAgICAgIGlmKCAoIGJhdWRfdmFsdWUgJSAxMCApID49IDUgKQ0KICAgICAgICB7DQogICAgICAgICAgICBiYXVkX3ZhbHVlID0gKCBiYXVkX3ZhbHVlIC8gMTAgKSArIDE7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBiYXVkX3ZhbHVlIC89IDEwOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcFNTQy0+U1NDX0NNUiA9IGJhdWRfdmFsdWU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1NDX0NvbmZpZ3VyZSAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgU1NDICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19Db25maWd1cmUoIEFUOTFQU19TU0MgcFNTQywgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3lzdF9jbG9jaywgLyogXGFyZyBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5ICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYXVkX3JhdGUsICAvKiBcYXJnIEV4cGVjdGVkIEJhdWQgUmF0ZSBGcmVxdWVuY3kgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNsb2NrX3J4LCAgIC8qIFxhcmcgUmVjZWl2ZXIgQ2xvY2sgUGFyYW1ldGVycyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZV9yeCwgICAgLyogXGFyZyBtb2RlIFJlZ2lzdGVyIHRvIGJlIHByb2dyYW1tZWQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNsb2NrX3R4LCAgIC8qIFxhcmcgVHJhbnNtaXR0ZXIgQ2xvY2sgUGFyYW1ldGVycyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZV90eCApICAgLyogXGFyZyBtb2RlIFJlZ2lzdGVyIHRvIGJlIHByb2dyYW1tZWQgKi8NCnsNCiAgICAvKiogRGlzYWJsZSBpbnRlcnJ1cHRzICovDQogICAgcFNTQy0+U1NDX0lEUiAgPSAoIHVuc2lnbmVkIGludCApIC0xOw0KDQogICAgLyoqIFJlc2V0IHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciAqLw0KICAgIHBTU0MtPlNTQ19DUiAgID0gQVQ5MUNfU1NDX1NXUlNUIHwgQVQ5MUNfU1NDX1JYRElTIHwgQVQ5MUNfU1NDX1RYRElTOw0KDQogICAgLyoqIERlZmluZSB0aGUgQ2xvY2sgTW9kZSBSZWdpc3RlciAqLw0KICAgIEFUOTFGX1NTQ19TZXRCYXVkcmF0ZSggcFNTQywgc3lzdF9jbG9jaywgYmF1ZF9yYXRlICk7DQoNCiAgICAvKiogV3JpdGUgdGhlIFJlY2VpdmUgQ2xvY2sgTW9kZSBSZWdpc3RlciAqLw0KICAgIHBTU0MtPlNTQ19SQ01SID0gY2xvY2tfcng7DQoNCiAgICAvKiogV3JpdGUgdGhlIFRyYW5zbWl0IENsb2NrIE1vZGUgUmVnaXN0ZXIgKi8NCiAgICBwU1NDLT5TU0NfVENNUiA9IGNsb2NrX3R4Ow0KDQogICAgLyoqIFdyaXRlIHRoZSBSZWNlaXZlIEZyYW1lIE1vZGUgUmVnaXN0ZXIgKi8NCiAgICBwU1NDLT5TU0NfUkZNUiA9IG1vZGVfcng7DQoNCiAgICAvKiogV3JpdGUgdGhlIFRyYW5zbWl0IEZyYW1lIE1vZGUgUmVnaXN0ZXIgKi8NCiAgICBwU1NDLT5TU0NfVEZNUiA9IG1vZGVfdHg7DQoNCiAgICAvKiogQ2xlYXIgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQ291bnRlcnMgKi8NCiAgICBBVDkxRl9QRENfT3BlbiggKCBBVDkxUFNfUERDICkgJiggcFNTQy0+U1NDX1JQUiApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1NDX0VuYWJsZVJ4ICovDQovKiogXGJyaWVmIEVuYWJsZSByZWNlaXZpbmcgZGF0YXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0VuYWJsZVJ4KCBBVDkxUFNfU1NDIHBTU0MgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0Kew0KICAgIC8qKiBFbmFibGUgcmVjZWl2ZXIgKi8NCiAgICBwU1NDLT5TU0NfQ1IgPSBBVDkxQ19TU0NfUlhFTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TU0NfRGlzYWJsZVJ4ICovDQovKiogXGJyaWVmIERpc2FibGUgcmVjZWl2aW5nIGRhdGFzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19EaXNhYmxlUngoIEFUOTFQU19TU0MgcFNTQyApIC8qIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyICovDQp7DQogICAgLyoqIERpc2FibGUgcmVjZWl2ZXIgKi8NCiAgICBwU1NDLT5TU0NfQ1IgPSBBVDkxQ19TU0NfUlhESVM7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1NDX0VuYWJsZVR4ICovDQovKiogXGJyaWVmIEVuYWJsZSBzZW5kaW5nIGRhdGFzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19FbmFibGVUeCggQVQ5MVBTX1NTQyBwU1NDICkgLyogXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXIgKi8NCnsNCiAgICAvKiogRW5hYmxlICB0cmFuc21pdHRlciAqLw0KICAgIHBTU0MtPlNTQ19DUiA9IEFUOTFDX1NTQ19UWEVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NTQ19EaXNhYmxlVHggKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBzZW5kaW5nIGRhdGFzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19EaXNhYmxlVHgoIEFUOTFQU19TU0MgcFNTQyApIC8qIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyICovDQp7DQogICAgLyoqIERpc2FibGUgIHRyYW5zbWl0dGVyICovDQogICAgcFNTQy0+U1NDX0NSID0gQVQ5MUNfU1NDX1RYRElTOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NTQ19FbmFibGVJdCAqLw0KLyoqIFxicmllZiBFbmFibGUgU1NDIElUICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19FbmFibGVJdCggQVQ5MVBTX1NTQyBwU1NDLCAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyBJVCB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwU1NDLT5TU0NfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TU0NfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgU1NDIElUICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19EaXNhYmxlSXQoIEFUOTFQU19TU0MgcFNTQywgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnIElUIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIgKi8NCiAgICBwU1NDLT5TU0NfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TU0NfUmVjZWl2ZUZyYW1lICovDQovKiogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TU0NfUmVjZWl2ZUZyYW1lKCBBVDkxUFNfU1NDIHBTU0MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwTmV4dEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCiAgICByZXR1cm4gQVQ5MUZfUERDX1JlY2VpdmVGcmFtZSgNCiAgICAgICAgKCBBVDkxUFNfUERDICkgJiggcFNTQy0+U1NDX1JQUiApLA0KICAgICAgICBwQnVmZmVyLA0KICAgICAgICBzekJ1ZmZlciwNCiAgICAgICAgcE5leHRCdWZmZXIsDQogICAgICAgIHN6TmV4dEJ1ZmZlciApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NTQ19TZW5kRnJhbWUgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYnVzeSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NTQ19TZW5kRnJhbWUoIEFUOTFQU19TU0MgcFNTQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBOZXh0QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KICAgIHJldHVybiBBVDkxRl9QRENfU2VuZEZyYW1lKA0KICAgICAgICAoIEFUOTFQU19QREMgKSAmKCBwU1NDLT5TU0NfUlBSICksDQogICAgICAgIHBCdWZmZXIsDQogICAgICAgIHN6QnVmZmVyLA0KICAgICAgICBwTmV4dEJ1ZmZlciwNCiAgICAgICAgc3pOZXh0QnVmZmVyICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1NDX0dldEludGVycnVwdE1hc2tTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIFNTQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TU0NfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLyogXHJldHVybiBTU0MgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQogICAgQVQ5MVBTX1NTQyBwU3NjICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwU3NjLT5TU0NfSU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NTQ19Jc0ludGVycnVwdE1hc2tlZCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFNTQyBJbnRlcnJ1cHQgaXMgTWFza2VkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfU1NDX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfU1NDIHBTc2MsICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfU1NDX0dldEludGVycnVwdE1hc2tTdGF0dXMoIHBTc2MgKSAmIGZsYWcgKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFRXSQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVFdJX0VuYWJsZUl0ICovDQovKiogXGJyaWVmIEVuYWJsZSBUV0kgSVQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0VuYWJsZUl0KCBBVDkxUFNfVFdJIHBUV0ksICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnIElUIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlciAqLw0KICAgIHBUV0ktPlRXSV9JRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RXSV9EaXNhYmxlSXQgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBUV0kgSVQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0Rpc2FibGVJdCggQVQ5MVBTX1RXSSBwVFdJLCAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgSVQgdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlciAqLw0KICAgIHBUV0ktPlRXSV9JRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RXSV9Db25maWd1cmUgKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFRXSSBpbiBtYXN0ZXIgbW9kZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UV0lfQ29uZmlndXJlKCBBVDkxUFNfVFdJIHBUV0kgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlciAqLw0Kew0KICAgIC8qKiBEaXNhYmxlIGludGVycnVwdHMgKi8NCiAgICBwVFdJLT5UV0lfSURSID0gKCB1bnNpZ25lZCBpbnQgKSAtMTsNCg0KICAgIC8qKiBSZXNldCBwZXJpcGhlcmFsICovDQogICAgcFRXSS0+VFdJX0NSICA9IEFUOTFDX1RXSV9TV1JTVDsNCg0KICAgIC8qKiBTZXQgTWFzdGVyIG1vZGUgKi8NCiAgICBwVFdJLT5UV0lfQ1IgID0gQVQ5MUNfVFdJX01TRU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVFdJX0dldEludGVycnVwdE1hc2tTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIFRXSSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UV0lfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLyogXHJldHVybiBUV0kgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQogICAgQVQ5MVBTX1RXSSBwVHdpICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwVHdpLT5UV0lfSU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RXSV9Jc0ludGVycnVwdE1hc2tlZCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFRXSSBJbnRlcnJ1cHQgaXMgTWFza2VkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfVFdJX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfVFdJIHBUd2ksICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfVFdJX0dldEludGVycnVwdE1hc2tTdGF0dXMoIHBUd2kgKSAmIGZsYWcgKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFBXTUMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BXTV9HZXRTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIFBXTSBJbnRlcnJ1cHQgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUFdNQ19HZXRTdGF0dXMoIC8qIFxyZXR1cm4gUFdNIEludGVycnVwdCBTdGF0dXMgKi8NCiAgICBBVDkxUFNfUFdNQyBwUFdNICkgICAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBQV00tPlBXTUNfU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUFdNX0ludGVycnVwdEVuYWJsZSAqLw0KLyoqIFxicmllZiBFbmFibGUgUFdNIEludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0ludGVycnVwdEVuYWJsZSggQVQ5MVBTX1BXTUMgcFB3bSwgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgUFdNIGludGVycnVwdCB0byBiZSBlbmFibGVkICovDQp7DQogICAgcFB3bS0+UFdNQ19JRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BXTV9JbnRlcnJ1cHREaXNhYmxlICovDQovKiogXGJyaWVmIERpc2FibGUgUFdNIEludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0ludGVycnVwdERpc2FibGUoIEFUOTFQU19QV01DIHBQd20sICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBQV00gaW50ZXJydXB0IHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgcFB3bS0+UFdNQ19JRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BXTV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBQV00gSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUFdNQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvKiBccmV0dXJuIFBXTSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCiAgICBBVDkxUFNfUFdNQyBwUHdtICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUHdtLT5QV01DX0lNUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QV01fSXNJbnRlcnJ1cHRNYXNrZWQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBQV00gSW50ZXJydXB0IGlzIE1hc2tlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BXTUNfSXNJbnRlcnJ1cHRNYXNrZWQoIEFUOTFQU19QV01DIHBQV00sICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfUFdNQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCBwUFdNICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUFdNX0lzU3RhdHVzU2V0ICovDQovKiogXGJyaWVmIFRlc3QgaWYgUFdNIEludGVycnVwdCBpcyBTZXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QV01DX0lzU3RhdHVzU2V0KCBBVDkxUFNfUFdNQyBwUFdNLCAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1BXTUNfR2V0U3RhdHVzKCBwUFdNICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUFdNX0NmZ0NoYW5uZWwgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBQV00gSW50ZXJydXB0IGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NmZ0NoYW5uZWwoIEFUOTFQU19QV01DIHBQV00sICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsSWQsIC8qIFxhcmcgUFdNIGNoYW5uZWwgSUQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSwgICAgICAvKiBcYXJnICBQV00gbW9kZSAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwZXJpb2QsICAgIC8qIFxhcmcgUFdNIHBlcmlvZCAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkdXR5ICkgICAgIC8qIFxhcmcgUFdNIGR1dHkgY3ljbGUgKi8NCnsNCiAgICBwUFdNLT5QV01DX0NIWyBjaGFubmVsSWQgXS5QV01DX0NNUiAgID0gbW9kZTsNCiAgICBwUFdNLT5QV01DX0NIWyBjaGFubmVsSWQgXS5QV01DX0NEVFlSID0gZHV0eTsNCiAgICBwUFdNLT5QV01DX0NIWyBjaGFubmVsSWQgXS5QV01DX0NQUkRSID0gcGVyaW9kOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BXTV9TdGFydENoYW5uZWwgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIGNoYW5uZWwgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19TdGFydENoYW5uZWwoIEFUOTFQU19QV01DIHBQV00sICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIENoYW5uZWxzIElEcyB0byBiZSBlbmFibGVkICovDQp7DQogICAgcFBXTS0+UFdNQ19FTkEgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BXTV9TdG9wQ2hhbm5lbCAqLw0KLyoqIFxicmllZiBEaXNhYmxlIGNoYW5uZWwgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19TdG9wQ2hhbm5lbCggQVQ5MVBTX1BXTUMgcFBXTSwgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBDaGFubmVscyBJRHMgdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIHBQV00tPlBXTUNfRElTID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QV01fVXBkYXRlQ2hhbm5lbCAqLw0KLyoqIFxicmllZiBVcGRhdGUgUGVyaW9kIG9yIER1dHkgQ3ljbGUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19VcGRhdGVDaGFubmVsKCBBVDkxUFNfUFdNQyBwUFdNLCAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbElkLCAvKiBcYXJnIFBXTSBjaGFubmVsIElEICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHVwZGF0ZSApICAgLyogXGFyZyAgQ2hhbm5lbHMgSURzIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICBwUFdNLT5QV01DX0NIWyBjaGFubmVsSWQgXS5QV01DX0NVUERSID0gdXBkYXRlOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgVURQDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfRW5hYmxlSXQgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFVEUCBJVCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRW5hYmxlSXQoIEFUOTFQU19VRFAgcFVEUCwgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgSVQgdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyICovDQogICAgcFVEUC0+VURQX0lFUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVURQX0Rpc2FibGVJdCAqLw0KLyoqIFxicmllZiBEaXNhYmxlIFVEUCBJVCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRGlzYWJsZUl0KCBBVDkxUFNfVURQIHBVRFAsICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyBJVCB0byBiZSBkaXNhYmxlZCAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyICovDQogICAgcFVEUC0+VURQX0lEUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVURQX1NldEFkZHJlc3MgKi8NCi8qKiBcYnJpZWYgU2V0IFVEUCBmdW5jdGlvbmFsIGFkZHJlc3MgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX1NldEFkZHJlc3MoIEFUOTFQU19VRFAgcFVEUCwgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGFkZHJlc3MgKSAvKiBcYXJnIG5ldyBVRFAgYWRkcmVzcyAqLw0Kew0KICAgIHBVRFAtPlVEUF9GQUREUiA9ICggQVQ5MUNfVURQX0ZFTiB8IGFkZHJlc3MgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfRW5hYmxlRXAgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIEVuZHBvaW50ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FbmFibGVFcCggQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBlbmRwb2ludCApIC8qIFxhcmcgZW5kcG9pbnQgbnVtYmVyICovDQp7DQogICAgcFVEUC0+VURQX0NTUlsgZW5kcG9pbnQgXSB8PSBBVDkxQ19VRFBfRVBFRFM7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVURQX0Rpc2FibGVFcCAqLw0KLyoqIFxicmllZiBFbmFibGUgRW5kcG9pbnQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0Rpc2FibGVFcCggQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZW5kcG9pbnQgKSAvKiBcYXJnIGVuZHBvaW50IG51bWJlciAqLw0Kew0KICAgIHBVRFAtPlVEUF9DU1JbIGVuZHBvaW50IF0gJj0gfkFUOTFDX1VEUF9FUEVEUzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfU2V0U3RhdGUgKi8NCi8qKiBcYnJpZWYgU2V0IFVEUCBEZXZpY2Ugc3RhdGUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX1NldFN0YXRlKCBBVDkxUFNfVURQIHBVRFAsICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnIG5ldyBVRFAgYWRkcmVzcyAqLw0Kew0KICAgIHBVRFAtPlVEUF9HTEJTVEFURSAmPSB+KCBBVDkxQ19VRFBfRkFEREVOIHwgQVQ5MUNfVURQX0NPTkZHICk7DQogICAgcFVEUC0+VURQX0dMQlNUQVRFIHw9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVURQX0dldFN0YXRlICovDQovKiogXGJyaWVmIHJldHVybiBVRFAgRGV2aWNlIHN0YXRlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVURQX0dldFN0YXRlKCAvKiBccmV0dXJuIHRoZSBVRFAgZGV2aWNlIHN0YXRlICovDQogICAgQVQ5MVBTX1VEUCBwVURQICkgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiggcFVEUC0+VURQX0dMQlNUQVRFICYgKCBBVDkxQ19VRFBfRkFEREVOIHwgQVQ5MUNfVURQX0NPTkZHICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfUmVzZXRFcCAqLw0KLyoqIFxicmllZiBSZXNldCBVRFAgZW5kcG9pbnQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX1Jlc2V0RXAoIC8qIFxyZXR1cm4gdGhlIFVEUCBkZXZpY2Ugc3RhdGUgKi8NCiAgICBBVDkxUFNfVURQIHBVRFAsICAgICAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyICovDQogICAgdW5zaWduZWQgaW50IGZsYWcgKSAgICAgICAgICAvKiBcYXJnIEVuZHBvaW50cyB0byBiZSByZXNldCAqLw0Kew0KICAgIHBVRFAtPlVEUF9SU1RFUCA9IGZsYWc7DQogICAgcFVEUC0+VURQX1JTVEVQID0gMDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfRXBTdGFsbCAqLw0KLyoqIFxicmllZiBFbmRwb2ludCB3aWxsIFNUQUxMIHJlcXVlc3RzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FcFN0YWxsKCBBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZW5kcG9pbnQgKSAvKiBcYXJnIGVuZHBvaW50IG51bWJlciAqLw0Kew0KICAgIHBVRFAtPlVEUF9DU1JbIGVuZHBvaW50IF0gfD0gQVQ5MUNfVURQX0ZPUkNFU1RBTEw7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVURQX0VwV3JpdGUgKi8NCi8qKiBcYnJpZWYgV3JpdGUgdmFsdWUgaW4gdGhlIERQUiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRXBXcml0ZSggQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZW5kcG9pbnQsIC8qIFxhcmcgZW5kcG9pbnQgbnVtYmVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHZhbHVlICkgICAvKiBcYXJnIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIERQUiAqLw0Kew0KICAgIHBVRFAtPlVEUF9GRFJbIGVuZHBvaW50IF0gPSB2YWx1ZTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfRXBSZWFkICovDQovKiogXGJyaWVmIFJldHVybiB2YWx1ZSBmcm9tIHRoZSBEUFIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VRFBfRXBSZWFkKCBBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGVuZHBvaW50ICkgLyogXGFyZyBlbmRwb2ludCBudW1iZXIgKi8NCnsNCiAgICByZXR1cm4gcFVEUC0+VURQX0ZEUlsgZW5kcG9pbnQgXTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfRXBFbmRPZldyICovDQovKiogXGJyaWVmIE5vdGlmeSB0aGUgVURQIHRoYXQgdmFsdWVzIGluIERQUiBhcmUgcmVhZHkgdG8gYmUgc2VudCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRXBFbmRPZldyKCBBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBlbmRwb2ludCApIC8qIFxhcmcgZW5kcG9pbnQgbnVtYmVyICovDQp7DQogICAgcFVEUC0+VURQX0NTUlsgZW5kcG9pbnQgXSB8PSBBVDkxQ19VRFBfVFhQS1RSRFk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVURQX0VwQ2xlYXIgKi8NCi8qKiBcYnJpZWYgQ2xlYXIgZmxhZyBpbiB0aGUgZW5kcG9pbnQgQ1NSIHJlZ2lzdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FcENsZWFyKCBBVDkxUFNfVURQIHBVRFAsICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBlbmRwb2ludCwgLyogXGFyZyBlbmRwb2ludCBudW1iZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgICAgIC8qIFxhcmcgZmxhZyB0byBiZSBjbGVhcmVkICovDQp7DQogICAgcFVEUC0+VURQX0NTUlsgZW5kcG9pbnQgXSAmPSB+KCBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVURQX0VwU2V0ICovDQovKiogXGJyaWVmIFNldCBmbGFnIGluIHRoZSBlbmRwb2ludCBDU1IgcmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VwU2V0KCBBVDkxUFNfVURQIHBVRFAsICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZW5kcG9pbnQsIC8qIFxhcmcgZW5kcG9pbnQgbnVtYmVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAgICAgLyogXGFyZyBmbGFnIHRvIGJlIGNsZWFyZWQgKi8NCnsNCiAgICBwVURQLT5VRFBfQ1NSWyBlbmRwb2ludCBdIHw9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVURQX0VwU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgZW5kcG9pbnQgQ1NSIHJlZ2lzdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVURQX0VwU3RhdHVzKCBBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZW5kcG9pbnQgKSAvKiBcYXJnIGVuZHBvaW50IG51bWJlciAqLw0Kew0KICAgIHJldHVybiBwVURQLT5VRFBfQ1NSWyBlbmRwb2ludCBdOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VEUF9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBVRFAgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVURQX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8qIFxyZXR1cm4gVURQIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KICAgIEFUOTFQU19VRFAgcFVkcCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFVkcC0+VURQX0lNUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfSXNJbnRlcnJ1cHRNYXNrZWQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBVRFAgSW50ZXJydXB0IGlzIE1hc2tlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1VEUF9Jc0ludGVycnVwdE1hc2tlZCggQVQ5MVBTX1VEUCBwVWRwLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1VEUF9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCBwVWRwICkgJiBmbGFnICk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBUQw0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVENfSW50ZXJydXB0RW5hYmxlICovDQovKiogXGJyaWVmIEVuYWJsZSBUQyBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVENfSW50ZXJydXB0RW5hYmxlKCBBVDkxUFNfVEMgcFRjLCAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBUQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBUQyBpbnRlcnJ1cHQgdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIHBUYy0+VENfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UQ19JbnRlcnJ1cHREaXNhYmxlICovDQovKiogXGJyaWVmIERpc2FibGUgVEMgSW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1RDX0ludGVycnVwdERpc2FibGUoIEFUOTFQU19UQyBwVGMsICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFRDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBUQyBpbnRlcnJ1cHQgdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICBwVGMtPlRDX0lEUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVENfR2V0SW50ZXJydXB0TWFza1N0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gVEMgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVENfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLyogXHJldHVybiBUQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCiAgICBBVDkxUFNfVEMgcFRjICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgVEMgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwVGMtPlRDX0lNUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UQ19Jc0ludGVycnVwdE1hc2tlZCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFRDIEludGVycnVwdCBpcyBNYXNrZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9UQ19Jc0ludGVycnVwdE1hc2tlZCggQVQ5MVBTX1RDIHBUYywgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgVEMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9UQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCBwVGMgKSAmIGZsYWcgKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIENBTg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCiNkZWZpbmUgU1RBTkRBUkRfRk9STUFUICAgIDANCiNkZWZpbmUgRVhURU5ERURfRk9STUFUICAgIDENCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9Jbml0TWFpbGJveFJlZ2lzdGVycygpICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0luaXRNYWlsYm94UmVnaXN0ZXJzKCBBVDkxUFNfQ0FOX01CIENBTl9NYWlsYm94LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1vZGVfcmVnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjY2VwdGFuY2VfbWFza19yZWcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWRfcmVnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFfbG93X3JlZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhX2hpZ2hfcmVnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvbnRyb2xfcmVnICkNCnsNCiAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01DUiA9IDB4MDsNCiAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01NUiA9IG1vZGVfcmVnOw0KICAgIENBTl9NYWlsYm94LT5DQU5fTUJfTUFNID0gYWNjZXB0YW5jZV9tYXNrX3JlZzsNCiAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01JRCA9IGlkX3JlZzsNCiAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01ETCA9IGRhdGFfbG93X3JlZzsNCiAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01ESCA9IGRhdGFfaGlnaF9yZWc7DQogICAgQ0FOX01haWxib3gtPkNBTl9NQl9NQ1IgPSBjb250cm9sX3JlZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9FbmFibGVDQU4oKSAqLw0KLyoqIFxicmllZiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9FbmFibGVDQU4oIEFUOTFQU19DQU4gcENBTiApIC8qIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0Kew0KICAgIHBDQU4tPkNBTl9NUiB8PSBBVDkxQ19DQU5fQ0FORU47DQoNCiAgICAvKiBXYWl0IGZvciBXQUtFVVAgZmxhZyByYWlzaW5nIDw9PiAxMS1yZWNlc3NpdmUtYml0IHdlcmUgc2Nhbm5lZCBieSB0aGUgdHJhbnNjZWl2ZXIgKi8NCiAgICB3aGlsZSggKCBwQ0FOLT5DQU5fU1IgJiBBVDkxQ19DQU5fV0FLRVVQICkgIT0gQVQ5MUNfQ0FOX1dBS0VVUCApDQogICAgew0KICAgIH0NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9EaXNhYmxlQ0FOKCkgKi8NCi8qKiBcYnJpZWYgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfRGlzYWJsZUNBTiggQVQ5MVBTX0NBTiBwQ0FOICkgLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQp7DQogICAgcENBTi0+Q0FOX01SICY9IH5BVDkxQ19DQU5fQ0FORU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0VuYWJsZUl0ICovDQovKiogXGJyaWVmIEVuYWJsZSBDQU4gaW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9FbmFibGVJdCggQVQ5MVBTX0NBTiBwQ0FOLCAgICAvKiBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIElUIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlciAqLw0KICAgIHBDQU4tPkNBTl9JRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9EaXNhYmxlSXQgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBDQU4gaW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9EaXNhYmxlSXQoIEFUOTFQU19DQU4gcENBTiwgICAgLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogSVQgdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlciAqLw0KICAgIHBDQU4tPkNBTl9JRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9HZXRTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIENBTiBJbnRlcnJ1cHQgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldFN0YXR1cyggLyogXHJldHVybiBDQU4gSW50ZXJydXB0IFN0YXR1cyAqLw0KICAgIEFUOTFQU19DQU4gcENBTiApICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwQ0FOLT5DQU5fU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldEludGVycnVwdE1hc2tTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIENBTiBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLyogXHJldHVybiBDQU4gSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQogICAgQVQ5MVBTX0NBTiBwQ0FOICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwQ0FOLT5DQU5fSU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9Jc0ludGVycnVwdE1hc2tlZCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIENBTiBJbnRlcnJ1cHQgaXMgTWFza2VkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfQ0FOIHBDQU4sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfQ0FOX0dldEludGVycnVwdE1hc2tTdGF0dXMoIHBDQU4gKSAmIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fSXNTdGF0dXNTZXQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBDQU4gSW50ZXJydXB0IGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9Jc1N0YXR1c1NldCggQVQ5MVBTX0NBTiBwQ0FOLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX0NBTl9HZXRTdGF0dXMoIHBDQU4gKSAmIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fQ2ZnTW9kZVJlZyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIENBTiBjb250cm9sbGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNb2RlUmVnKCBBVDkxUFNfQ0FOIHBDQU4sICAgIC8qIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGUgKSAvKiBtb2RlIHJlZ2lzdGVyICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBNUiByZWdpc3RlciAqLw0KICAgIHBDQU4tPkNBTl9NUiA9IG1vZGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1vZGVSZWcgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBDQU4gY29udHJvbGxlciB2YWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNb2RlUmVnKCBBVDkxUFNfQ0FOIHBDQU4gLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICByZXR1cm4gcENBTi0+Q0FOX01SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdCYXVkcmF0ZVJlZyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgdGhlIEJhdWRyYXRlIG9mIHRoZSBDQU4gY29udHJvbGxlciBmb3IgdGhlIG5ldHdvcmsgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ0JhdWRyYXRlUmVnKCBBVDkxUFNfQ0FOIHBDQU4sIC8qIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYXVkcmF0ZV9jZmcgKQ0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgQlIgcmVnaXN0ZXIgKi8NCiAgICBwQ0FOLT5DQU5fQlIgPSBiYXVkcmF0ZV9jZmc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldEJhdWRyYXRlICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgQmF1ZHJhdGUgb2YgdGhlIENBTiBjb250cm9sbGVyIGZvciB0aGUgbmV0d29yayB2YWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRCYXVkcmF0ZSggQVQ5MVBTX0NBTiBwQ0FOIC8qIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQ0FOLT5DQU5fQlI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldEludGVybmFsQ291bnRlciAqLw0KLyoqIFxicmllZiBSZXR1cm4gQ0FOIFRpbWVyIFJlZ3NpdGVyIFZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldEludGVybmFsQ291bnRlciggQVQ5MVBTX0NBTiBwQ0FOIC8qIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICByZXR1cm4gcENBTi0+Q0FOX1RJTTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fR2V0VGltZXN0YW1wICovDQovKiogXGJyaWVmIFJldHVybiBDQU4gVGltZXN0YW1wIFJlZ2lzdGVyIFZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldFRpbWVzdGFtcCggQVQ5MVBTX0NBTiBwQ0FOIC8qIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICByZXR1cm4gcENBTi0+Q0FOX1RJTUVTVFA7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldEVycm9yQ291bnRlciAqLw0KLyoqIFxicmllZiBSZXR1cm4gQ0FOIEVycm9yIENvdW50ZXIgUmVnaXN0ZXIgVmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0RXJyb3JDb3VudGVyKCBBVDkxUFNfQ0FOIHBDQU4gLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQ0FOLT5DQU5fRUNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9Jbml0VHJhbnNmZXJSZXF1ZXN0ICovDQovKiogXGJyaWVmIFJlcXVlc3QgZm9yIGEgdHJhbnNmZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgbWFpbGJveGVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9Jbml0VHJhbnNmZXJSZXF1ZXN0KCBBVDkxUFNfQ0FOIHBDQU4sIC8qIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRyYW5zZmVyX2NtZCApDQp7DQogICAgcENBTi0+Q0FOX1RDUiA9IHRyYW5zZmVyX2NtZDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fSW5pdEFib3J0UmVxdWVzdCAqLw0KLyoqIFxicmllZiBBYm9ydCB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94ZXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0luaXRBYm9ydFJlcXVlc3QoIEFUOTFQU19DQU4gcENBTiwgLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWJvcnRfY21kICkNCnsNCiAgICBwQ0FOLT5DQU5fQUNSID0gYWJvcnRfY21kOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdNZXNzYWdlTW9kZVJlZyAqLw0KLyoqIFxicmllZiBQcm9ncmFtIHRoZSBNZXNzYWdlIE1vZGUgUmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VNb2RlUmVnKCBBVDkxUFNfQ0FOX01CIENBTl9NYWlsYm94LCAvKiBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3ggKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSApDQp7DQogICAgQ0FOX01haWxib3gtPkNBTl9NQl9NTVIgPSBtb2RlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlTW9kZVJlZyAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIE1lc3NhZ2UgTW9kZSBSZWdpc3RlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlTW9kZVJlZyggQVQ5MVBTX0NBTl9NQiBDQU5fTWFpbGJveCApIC8qIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveCAqLw0Kew0KICAgIHJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01NUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fQ2ZnTWVzc2FnZUlEUmVnICovDQovKiogXGJyaWVmIFByb2dyYW0gdGhlIE1lc3NhZ2UgSUQgUmVnaXN0ZXIgKi8NCi8qKiBcYnJpZWYgVmVyc2lvbiA9PSAwIGZvciBTdGFuZGFyZCBtZXNzc2FnZSwgVmVyc2lvbiA9PSAxIGZvciBFeHRlbmRlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZUlEUmVnKCBBVDkxUFNfQ0FOX01CIENBTl9NYWlsYm94LCAvKiBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3ggKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlkLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIHZlcnNpb24gKQ0Kew0KICAgIGlmKCB2ZXJzaW9uID09IDAgKSAvKiBJRHZBIFN0YW5kYXJkIEZvcm1hdCAqLw0KICAgIHsNCiAgICAgICAgQ0FOX01haWxib3gtPkNBTl9NQl9NSUQgPSBpZCA8PCAxODsNCiAgICB9DQogICAgZWxzZSAvKiBJRHZCIEV4dGVuZGVkIEZvcm1hdCAqLw0KICAgIHsNCiAgICAgICAgQ0FOX01haWxib3gtPkNBTl9NQl9NSUQgPSBpZCB8ICggMSA8PCAyOSApOyAvKiBzZXQgTUlERSBiaXQgKi8NCiAgICB9DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VJRFJlZyAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIE1lc3NhZ2UgSUQgUmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0TWVzc2FnZUlEUmVnKCBBVDkxUFNfQ0FOX01CIENBTl9NYWlsYm94ICkgLyogcG9pbnRlciB0byBhIENBTiBNYWlsYm94ICovDQp7DQogICAgcmV0dXJuIENBTl9NYWlsYm94LT5DQU5fTUJfTUlEOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdNZXNzYWdlQWNjZXB0YW5jZU1hc2tSZWcgKi8NCi8qKiBcYnJpZWYgUHJvZ3JhbSB0aGUgTWVzc2FnZSBBY2NlcHRhbmNlIE1hc2sgUmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VBY2NlcHRhbmNlTWFza1JlZyggQVQ5MVBTX0NBTl9NQiBDQU5fTWFpbGJveCwgLyogcG9pbnRlciB0byBhIENBTiBNYWlsYm94ICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXNrICkNCnsNCiAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01BTSA9IG1hc2s7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VBY2NlcHRhbmNlTWFza1JlZyAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIE1lc3NhZ2UgQWNjZXB0YW5jZSBNYXNrIFJlZ2lzdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VBY2NlcHRhbmNlTWFza1JlZyggQVQ5MVBTX0NBTl9NQiBDQU5fTWFpbGJveCApIC8qIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveCAqLw0Kew0KICAgIHJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01BTTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fR2V0RmFtaWx5SUQgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBNZXNzYWdlIElEIFJlZ2lzdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldEZhbWlseUlEKCBBVDkxUFNfQ0FOX01CIENBTl9NYWlsYm94ICkgLyogcG9pbnRlciB0byBhIENBTiBNYWlsYm94ICovDQp7DQogICAgcmV0dXJuIENBTl9NYWlsYm94LT5DQU5fTUJfTUZJRDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fQ2ZnTWVzc2FnZUN0cmwgKi8NCi8qKiBcYnJpZWYgUmVxdWVzdCBhbmQgY29uZmlnIGZvciBhIHRyYW5zZmVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIG1haWxib3ggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VDdHJsUmVnKCBBVDkxUFNfQ0FOX01CIENBTl9NYWlsYm94LCAvKiBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3ggKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWVzc2FnZV9jdHJsX2NtZCApDQp7DQogICAgQ0FOX01haWxib3gtPkNBTl9NQl9NQ1IgPSBtZXNzYWdlX2N0cmxfY21kOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBDQU4gTWFpbGJveCBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0TWVzc2FnZVN0YXR1cyggQVQ5MVBTX0NBTl9NQiBDQU5fTWFpbGJveCApIC8qIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveCAqLw0Kew0KICAgIHJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01TUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fQ2ZnTWVzc2FnZURhdGFMb3cgKi8NCi8qKiBcYnJpZWYgUHJvZ3JhbSBkYXRhIGxvdyB2YWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZURhdGFMb3coIEFUOTFQU19DQU5fTUIgQ0FOX01haWxib3gsIC8qIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveCAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhICkNCnsNCiAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01ETCA9IGRhdGE7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VEYXRhTG93ICovDQovKiogXGJyaWVmIFJldHVybiBkYXRhIGxvdyB2YWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlRGF0YUxvdyggQVQ5MVBTX0NBTl9NQiBDQU5fTWFpbGJveCApIC8qIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveCAqLw0Kew0KICAgIHJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01ETDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fQ2ZnTWVzc2FnZURhdGFIaWdoICovDQovKiogXGJyaWVmIFByb2dyYW0gZGF0YSBoaWdoIHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNZXNzYWdlRGF0YUhpZ2goIEFUOTFQU19DQU5fTUIgQ0FOX01haWxib3gsIC8qIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveCAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZGF0YSApDQp7DQogICAgQ0FOX01haWxib3gtPkNBTl9NQl9NREggPSBkYXRhOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlRGF0YUhpZ2ggKi8NCi8qKiBcYnJpZWYgUmV0dXJuIGRhdGEgaGlnaCB2YWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlRGF0YUhpZ2goIEFUOTFQU19DQU5fTUIgQ0FOX01haWxib3ggKSAvKiBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3ggKi8NCnsNCiAgICByZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NREg7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX09wZW4gKi8NCi8qKiBcYnJpZWYgT3BlbiBhIENBTiBQb3J0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX09wZW4oIGNvbnN0IHVuc2lnbmVkIGludCBudWxsICkgLyogXGFyZyAqLw0Kew0KICAgIC8qIE5PVCBERUZJTkVEIEFUIFRISVMgTU9NRU5UICovDQogICAgcmV0dXJuKCAwICk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBBREMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19FbmFibGVJdCAqLw0KLyoqIFxicmllZiBFbmFibGUgQURDIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfRW5hYmxlSXQoIEFUOTFQU19BREMgcEFEQywgICAgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBJVCB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwQURDLT5BRENfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgQURDIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfRGlzYWJsZUl0KCBBVDkxUFNfQURDIHBBREMsICAgIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIElUIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIgKi8NCiAgICBwQURDLT5BRENfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfR2V0U3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBBREMgSW50ZXJydXB0IFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRTdGF0dXMoIC8qIFxyZXR1cm4gQURDIEludGVycnVwdCBTdGF0dXMgKi8NCiAgICBBVDkxUFNfQURDIHBBREMgKSAgICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcEFEQy0+QURDX1NSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBBREMgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8qIFxyZXR1cm4gQURDIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KICAgIEFUOTFQU19BREMgcEFEQyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcEFEQy0+QURDX0lNUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfSXNJbnRlcnJ1cHRNYXNrZWQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBBREMgSW50ZXJydXB0IGlzIE1hc2tlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19Jc0ludGVycnVwdE1hc2tlZCggQVQ5MVBTX0FEQyBwQURDLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX0FEQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCBwQURDICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQURDX0lzU3RhdHVzU2V0ICovDQovKiogXGJyaWVmIFRlc3QgaWYgQURDIFN0YXR1cyBpcyBTZXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfSXNTdGF0dXNTZXQoIEFUOTFQU19BREMgcEFEQywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9BRENfR2V0U3RhdHVzKCBwQURDICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQURDX0NmZ01vZGVSZWcgKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBBREMgY29udHJvbGxlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfQ2ZnTW9kZVJlZyggQVQ5MVBTX0FEQyBwQURDLCAgICAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlICkgLyogbW9kZSByZWdpc3RlciAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXIgKi8NCiAgICBwQURDLT5BRENfTVIgPSBtb2RlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19HZXRNb2RlUmVnICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQURDIGNvbnRyb2xsZXIgdmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0TW9kZVJlZyggQVQ5MVBTX0FEQyBwQURDIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBBREMtPkFEQ19NUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfQ2ZnVGltaW5ncyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgdGhlIGRpZmZlcmVudCBuZWNlc3NhcnkgdGltaW5ncyBvZiB0aGUgQURDIGNvbnRyb2xsZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0NmZ1RpbWluZ3MoIEFUOTFQU19BREMgcEFEQywgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1ja19jbG9jaywgICAgICAgICAgICAgLyogaW4gTUh6ICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWRjX2Nsb2NrLCAgICAgICAgICAgICAvKiBpbiBNSHogKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzdGFydHVwX3RpbWUsICAgICAgICAgIC8qIGluIHVzICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2FtcGxlX2FuZF9ob2xkX3RpbWUgKSAvKiBpbiBucyAqLw0Kew0KICAgIHVuc2lnbmVkIGludCBwcmVzY2FsLCBzdGFydHVwLCBzaHRpbTsNCg0KICAgIHByZXNjYWwgICAgICA9IG1ja19jbG9jayAvICggMiAqIGFkY19jbG9jayApIC0gMTsNCiAgICBzdGFydHVwICAgICAgPSBhZGNfY2xvY2sgKiBzdGFydHVwX3RpbWUgLyA4IC0gMTsNCiAgICBzaHRpbSAgICAgICAgPSBhZGNfY2xvY2sgKiBzYW1wbGVfYW5kX2hvbGRfdGltZSAvIDEwMDAgLSAxOw0KDQogICAgLyoqIFdyaXRlIHRvIHRoZSBNUiByZWdpc3RlciAqLw0KICAgIHBBREMtPkFEQ19NUiA9ICggKCBwcmVzY2FsIDw8IDggKSAmIEFUOTFDX0FEQ19QUkVTQ0FMICkgfCAoICggc3RhcnR1cCA8PCAxNiApICYgQVQ5MUNfQURDX1NUQVJUVVAgKSB8ICggKCBzaHRpbSA8PCAyNCApICYgQVQ5MUNfQURDX1NIVElNICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQURDX0VuYWJsZUNoYW5uZWwgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIEFEQyBUaW1lciBSZWdpc3RlciBWYWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfRW5hYmxlQ2hhbm5lbCggQVQ5MVBTX0FEQyBwQURDLCAgICAgICAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsICkgLyogbW9kZSByZWdpc3RlciAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgQ0hFUiByZWdpc3RlciAqLw0KICAgIHBBREMtPkFEQ19DSEVSID0gY2hhbm5lbDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfRGlzYWJsZUNoYW5uZWwgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIEFEQyBUaW1lciBSZWdpc3RlciBWYWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfRGlzYWJsZUNoYW5uZWwoIEFUOTFQU19BREMgcEFEQywgICAgICAgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwgKSAvKiBtb2RlIHJlZ2lzdGVyICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBDSERSIHJlZ2lzdGVyICovDQogICAgcEFEQy0+QURDX0NIRFIgPSBjaGFubmVsOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19HZXRDaGFubmVsU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBBREMgVGltZXIgUmVnaXN0ZXIgVmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q2hhbm5lbFN0YXR1cyggQVQ5MVBTX0FEQyBwQURDIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBBREMtPkFEQ19DSFNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19TdGFydENvbnZlcnNpb24gKi8NCi8qKiBcYnJpZWYgU29mdHdhcmUgcmVxdWVzdCBmb3IgYSBhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJzaW9uICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19TdGFydENvbnZlcnNpb24oIEFUOTFQU19BREMgcEFEQyAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHBBREMtPkFEQ19DUiA9IEFUOTFDX0FEQ19TVEFSVDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfU29mdFJlc2V0ICovDQovKiogXGJyaWVmIFNvZnR3YXJlIHJlc2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19Tb2Z0UmVzZXQoIEFUOTFQU19BREMgcEFEQyAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHBBREMtPkFEQ19DUiA9IEFUOTFDX0FEQ19TV1JTVDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfR2V0TGFzdENvbnZlcnRlZERhdGEgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBMYXN0IENvbnZlcnRlZCBEYXRhICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldExhc3RDb252ZXJ0ZWREYXRhKCBBVDkxUFNfQURDIHBBREMgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBBREMtPkFEQ19MQ0RSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gwICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCAwIENvbnZlcnRlZCBEYXRhICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDAoIEFUOTFQU19BREMgcEFEQyAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQURDLT5BRENfQ0RSMDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMSAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgMSBDb252ZXJ0ZWQgRGF0YSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gxKCBBVDkxUFNfQURDIHBBREMgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICByZXR1cm4gcEFEQy0+QURDX0NEUjE7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDIgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDIgQ29udmVydGVkIERhdGEgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMiggQVQ5MVBTX0FEQyBwQURDIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBBREMtPkFEQ19DRFIyOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gzICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCAzIENvbnZlcnRlZCBEYXRhICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDMoIEFUOTFQU19BREMgcEFEQyAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQURDLT5BRENfQ0RSMzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINCAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgNCBDb252ZXJ0ZWQgRGF0YSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g0KCBBVDkxUFNfQURDIHBBREMgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICByZXR1cm4gcEFEQy0+QURDX0NEUjQ7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDUgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDUgQ29udmVydGVkIERhdGEgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINSggQVQ5MVBTX0FEQyBwQURDIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBBREMtPkFEQ19DRFI1Ow0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g2ICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCA2IENvbnZlcnRlZCBEYXRhICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDYoIEFUOTFQU19BREMgcEFEQyAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQURDLT5BRENfQ0RSNjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINyAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgNyBDb252ZXJ0ZWQgRGF0YSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g3KCBBVDkxUFNfQURDIHBBREMgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICByZXR1cm4gcEFEQy0+QURDX0NEUjc7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBBRVMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FFU19FbmFibGVJdCAqLw0KLyoqIFxicmllZiBFbmFibGUgQUVTIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfRW5hYmxlSXQoIEFUOTFQU19BRVMgcEFFUywgICAgLyogcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBJVCB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwQUVTLT5BRVNfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgQUVTIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfRGlzYWJsZUl0KCBBVDkxUFNfQUVTIHBBRVMsICAgIC8qIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIElUIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIgKi8NCiAgICBwQUVTLT5BRVNfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfR2V0U3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBBRVMgSW50ZXJydXB0IFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FFU19HZXRTdGF0dXMoIC8qIFxyZXR1cm4gQUVTIEludGVycnVwdCBTdGF0dXMgKi8NCiAgICBBVDkxUFNfQUVTIHBBRVMgKSAgICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcEFFUy0+QUVTX0lTUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gQUVTIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FFU19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvKiBccmV0dXJuIEFFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCiAgICBBVDkxUFNfQUVTIHBBRVMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBBRVMtPkFFU19JTVI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUVTX0lzSW50ZXJydXB0TWFza2VkICovDQovKiogXGJyaWVmIFRlc3QgaWYgQUVTIEludGVycnVwdCBpcyBNYXNrZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfSXNJbnRlcnJ1cHRNYXNrZWQoIEFUOTFQU19BRVMgcEFFUywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9BRVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggcEFFUyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FFU19Jc1N0YXR1c1NldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIEFFUyBTdGF0dXMgaXMgU2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0lzU3RhdHVzU2V0KCBBVDkxUFNfQUVTIHBBRVMsICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfQUVTX0dldFN0YXR1cyggcEFFUyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FFU19DZmdNb2RlUmVnICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQUVTIGNvbnRyb2xsZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0NmZ01vZGVSZWcoIEFUOTFQU19BRVMgcEFFUywgICAgLyogcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSApIC8qIG1vZGUgcmVnaXN0ZXIgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyICovDQogICAgcEFFUy0+QUVTX01SID0gbW9kZTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfR2V0TW9kZVJlZyAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIEFFUyBjb250cm9sbGVyIHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0dldE1vZGVSZWcoIEFUOTFQU19BRVMgcEFFUyAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQUVTLT5BRVNfTVI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUVTX1N0YXJ0UHJvY2Vzc2luZyAqLw0KLyoqIFxicmllZiBTdGFydCBFbmNyeXB0aW9uIG9yIERlY3J5cHRpb24gKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX1N0YXJ0UHJvY2Vzc2luZyggQVQ5MVBTX0FFUyBwQUVTIC8qIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcEFFUy0+QUVTX0NSID0gQVQ5MUNfQUVTX1NUQVJUOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FFU19Tb2Z0UmVzZXQgKi8NCi8qKiBcYnJpZWYgUmVzZXQgQUVTICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19Tb2Z0UmVzZXQoIEFUOTFQU19BRVMgcEFFUyAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHBBRVMtPkFFU19DUiA9IEFUOTFDX0FFU19TV1JTVDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfTG9hZE5ld1NlZWQgKi8NCi8qKiBcYnJpZWYgTG9hZCBOZXcgU2VlZCBpbiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0xvYWROZXdTZWVkKCBBVDkxUFNfQUVTIHBBRVMgLyogcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHBBRVMtPkFFU19DUiA9IEFUOTFDX0FFU19MT0FEU0VFRDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfU2V0Q3J5cHRvS2V5ICovDQovKiogXGJyaWVmIFNldCBDcnlwdG9ncmFwaGljIEtleSB4ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19TZXRDcnlwdG9LZXkoIEFUOTFQU19BRVMgcEFFUywgLyogcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5kZXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXl3b3JkICkNCnsNCiAgICBwQUVTLT5BRVNfS0VZV3hSWyBpbmRleCBdID0ga2V5d29yZDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfSW5wdXREYXRhICovDQovKiogXGJyaWVmIFNldCBJbnB1dCBEYXRhIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0lucHV0RGF0YSggQVQ5MVBTX0FFUyBwQUVTLCAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpbmRleCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGF0YSApDQp7DQogICAgcEFFUy0+QUVTX0lEQVRBeFJbIGluZGV4IF0gPSBpbmRhdGE7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUVTX0dldE91dHB1dERhdGEgKi8NCi8qKiBcYnJpZWYgR2V0IE91dHB1dCBEYXRhIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfR2V0T3V0cHV0RGF0YSggQVQ5MVBTX0FFUyBwQUVTLCAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpbmRleCApDQp7DQogICAgcmV0dXJuIHBBRVMtPkFFU19PREFUQXhSWyBpbmRleCBdOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FFU19TZXRJbml0aWFsaXphdGlvblZlY3RvciAqLw0KLyoqIFxicmllZiBTZXQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIChvciBDb3VudGVyKSB4ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19TZXRJbml0aWFsaXphdGlvblZlY3RvciggQVQ5MVBTX0FFUyBwQUVTLCAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGluZGV4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbml0dmVjdG9yICkNCnsNCiAgICBwQUVTLT5BRVNfSVZ4UlsgaW5kZXggXSA9IGluaXR2ZWN0b3I7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBUREVTDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UREVTX0VuYWJsZUl0ICovDQovKiogXGJyaWVmIEVuYWJsZSBUREVTIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0VuYWJsZUl0KCBBVDkxUFNfVERFUyBwVERFUywgIC8qIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBJVCB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwVERFUy0+VERFU19JRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgVERFUyBpbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19EaXNhYmxlSXQoIEFUOTFQU19UREVTIHBUREVTLCAgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBJVCB0byBiZSBkaXNhYmxlZCAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyICovDQogICAgcFRERVMtPlRERVNfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UREVTX0dldFN0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gVERFUyBJbnRlcnJ1cHQgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19HZXRTdGF0dXMoIC8qIFxyZXR1cm4gVERFUyBJbnRlcnJ1cHQgU3RhdHVzICovDQogICAgQVQ5MVBTX1RERVMgcFRERVMgKSAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFRERVMtPlRERVNfSVNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gVERFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8qIFxyZXR1cm4gVERFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCiAgICBBVDkxUFNfVERFUyBwVERFUyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFRERVMtPlRERVNfSU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfSXNJbnRlcnJ1cHRNYXNrZWQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBUREVTIEludGVycnVwdCBpcyBNYXNrZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfVERFUyBwVERFUywgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9UREVTX0dldEludGVycnVwdE1hc2tTdGF0dXMoIHBUREVTICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVERFU19Jc1N0YXR1c1NldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFRERVMgU3RhdHVzIGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1RERVNfSXNTdGF0dXNTZXQoIEFUOTFQU19UREVTIHBUREVTLCAgLyogXGFyZyAgcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1RERVNfR2V0U3RhdHVzKCBwVERFUyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfQ2ZnTW9kZVJlZyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIFRERVMgY29udHJvbGxlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0NmZ01vZGVSZWcoIEFUOTFQU19UREVTIHBUREVTLCAgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlICkgLyogbW9kZSByZWdpc3RlciAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXIgKi8NCiAgICBwVERFUy0+VERFU19NUiA9IG1vZGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVERFU19HZXRNb2RlUmVnICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgVERFUyBjb250cm9sbGVyIHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19HZXRNb2RlUmVnKCBBVDkxUFNfVERFUyBwVERFUyAvKiBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBUREVTLT5UREVTX01SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfU3RhcnRQcm9jZXNzaW5nICovDQovKiogXGJyaWVmIFN0YXJ0IEVuY3J5cHRpb24gb3IgRGVjcnlwdGlvbiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1N0YXJ0UHJvY2Vzc2luZyggQVQ5MVBTX1RERVMgcFRERVMgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHBUREVTLT5UREVTX0NSID0gQVQ5MUNfVERFU19TVEFSVDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UREVTX1NvZnRSZXNldCAqLw0KLyoqIFxicmllZiBSZXNldCBUREVTICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfU29mdFJlc2V0KCBBVDkxUFNfVERFUyBwVERFUyAvKiBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcFRERVMtPlRERVNfQ1IgPSBBVDkxQ19UREVTX1NXUlNUOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MSAqLw0KLyoqIFxicmllZiBTZXQgQ3J5cHRvZ3JhcGhpYyBLZXkgMSBXb3JkIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkxKCBBVDkxUFNfVERFUyBwVERFUywgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5kZXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleXdvcmQgKQ0Kew0KICAgIHBUREVTLT5UREVTX0tFWTFXeFJbIGluZGV4IF0gPSBrZXl3b3JkOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MiAqLw0KLyoqIFxicmllZiBTZXQgQ3J5cHRvZ3JhcGhpYyBLZXkgMiBXb3JkIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkyKCBBVDkxUFNfVERFUyBwVERFUywgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5kZXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleXdvcmQgKQ0Kew0KICAgIHBUREVTLT5UREVTX0tFWTJXeFJbIGluZGV4IF0gPSBrZXl3b3JkOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MyAqLw0KLyoqIFxicmllZiBTZXQgQ3J5cHRvZ3JhcGhpYyBLZXkgMyBXb3JkIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkzKCBBVDkxUFNfVERFUyBwVERFUywgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5kZXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleXdvcmQgKQ0Kew0KICAgIHBUREVTLT5UREVTX0tFWTNXeFJbIGluZGV4IF0gPSBrZXl3b3JkOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfSW5wdXREYXRhICovDQovKiogXGJyaWVmIFNldCBJbnB1dCBEYXRhIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19JbnB1dERhdGEoIEFUOTFQU19UREVTIHBUREVTLCAvKiBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGluZGV4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGF0YSApDQp7DQogICAgcFRERVMtPlRERVNfSURBVEF4UlsgaW5kZXggXSA9IGluZGF0YTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UREVTX0dldE91dHB1dERhdGEgKi8NCi8qKiBcYnJpZWYgR2V0IE91dHB1dCBEYXRhIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0dldE91dHB1dERhdGEoIEFUOTFQU19UREVTIHBUREVTLCAvKiBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGluZGV4ICkNCnsNCiAgICByZXR1cm4gcFRERVMtPlRERVNfT0RBVEF4UlsgaW5kZXggXTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UREVTX1NldEluaXRpYWxpemF0aW9uVmVjdG9yICovDQovKiogXGJyaWVmIFNldCBJbml0aWFsaXphdGlvbiBWZWN0b3IgeCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1NldEluaXRpYWxpemF0aW9uVmVjdG9yKCBBVDkxUFNfVERFUyBwVERFUywgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGluZGV4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5pdHZlY3RvciApDQp7DQogICAgcFRERVMtPlRERVNfSVZ4UlsgaW5kZXggXSA9IGluaXR2ZWN0b3I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfREJHVV9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgREJHVSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9EQkdVX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1NZUyApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfREJHVV9DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBEQkdVIHNpZ25hbHMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9DZmdQSU8oIHZvaWQgKQ0Kew0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0EsICAgICAgICAgICAgICAgICAgICAgIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyN19EUlhEICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyOF9EVFhEICksIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUE1DICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9TWVMgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQTUMgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMzBfUENLMiApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjlfUENLMSApLCAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjBfUENLMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMF9QQ0swICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyMl9QQ0syICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyMV9QQ0sxICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQSwgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTMwX1BDSzIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTEzX1BDSzEgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTI3X1BDSzMgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9WUkVHX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBWUkVHICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1ZSRUdfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfU1lTICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9SU1RDX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBSU1RDICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1JTVENfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfU1lTICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TU0NfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFNTQyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfU1NDICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TU0NfQ2ZnUElPICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgU1NDIHNpZ25hbHMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQSwgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTI1X1JLICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyMl9USyApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjFfVEYgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTI0X1JEICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyNl9SRiApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjNfVEQgKSwgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1dEVENfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFdEVEMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfV0RUQ19DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9TWVMgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTMV9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVVMxICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTMV9DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9VUzEgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTMV9DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBVUzEgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VUzFfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjZfUkkxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyNF9EU1IxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyM19EQ0QxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyNV9EVFIxICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQSwgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTdfU0NLMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBOF9SVFMxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEE2X1RYRDEgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTVfUlhEMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBOV9DVFMxICksIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVMwX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBVUzAgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVMwX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1VTMCApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVMwX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFVTMCBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTMF9DZmdQSU8oIHZvaWQgKQ0Kew0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0EsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEwX1JYRDAgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTRfQ1RTMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBM19SVFMwICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyX1NDSzAgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTFfVFhEMCApLCAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSTFfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFNQSTEgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJMV9DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9TUEkxICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUEkxX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFNQSTEgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUEkxX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQiwgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjE2X05QQ1MxMyApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTBfTlBDUzExICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIxMV9OUENTMTIgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9BLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBNF9OUENTMTMgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTI5X05QQ1MxMyApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjFfTlBDUzEwICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyMl9TUENLMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjVfTlBDUzExICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyX05QQ1MxMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjRfTUlTTzEgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTNfTlBDUzEyICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyNl9OUENTMTIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTIzX01PU0kxICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1BJMF9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgU1BJMCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUEkwX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1NQSTAgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSTBfQ2ZnUElPICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgU1BJMCBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSTBfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTNfTlBDUzAxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIxN19OUENTMDMgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjE0X05QQ1MwMiApICk7IC8qIFBlcmlwaGVyYWwgQiAqLw0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0EsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExNl9NSVNPMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMTNfTlBDUzAxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExNV9OUENTMDMgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTE3X01PU0kwICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExOF9TUENLMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMTRfTlBDUzAyICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExMl9OUENTMDAgKSwgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTdfTlBDUzAxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEE5X05QQ1MwMyApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBOF9OUENTMDIgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSVRDX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBQSVRDICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVENfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfU1lTICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BSUNfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIEFJQyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfRklRICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9JUlEwICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9JUlExICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BSUNfQ2ZnUElPICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgQUlDIHNpZ25hbHMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMzBfSVJRMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjlfRklRICksICAgIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExNF9JUlExICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUVTX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBBRVMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX0FFUyApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVFdJX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBUV0kgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1RXSSApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVFdJX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFRXSSBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1RXSV9DZmdQSU8oIHZvaWQgKQ0Kew0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0EsICAgICAgICAgICAgICAgICAgICAgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTExX1RXQ0sgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTEwX1RXRCApLCAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgQURDICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9BREMgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBBREMgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMThfQURUUkcgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QV01DX0NIM19DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQV01DX0NIMyBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ0gzX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjJfUFdNMyApLCAgIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIzMF9QV00zICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUFdNQ19DSDJfQ2ZnUElPICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgUFdNQ19DSDIgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NIMl9DZmdQSU8oIHZvaWQgKQ0Kew0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0IsICAgICAgICAgICAgICAgICAgICAgICAgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjIxX1BXTTIgKSwgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjlfUFdNMiApICk7IC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BXTUNfQ0gxX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFBXTUNfQ0gxIHNpZ25hbHMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19DSDFfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyMF9QV00xICksICAgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjI4X1BXTTEgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QV01DX0NIMF9DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQV01DX0NIMCBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ0gwX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTlfUFdNMCApLCAgIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyN19QV00wICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUlRUQ19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUlRUQyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRDX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1NZUyApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVURQX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBVRFAgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1VEUCApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVERFU19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVERFUyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1RERVMgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0VNQUNfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIEVNQUMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfRU1BQ19DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9FTUFDICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9FTUFDX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIEVNQUMgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9FTUFDX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQiwgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjJfRVRYMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTJfRVRYRVIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjE2X0VDT0wgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjExX0VUWDMgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjZfRVJYMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTVfRVJYRFYgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjEzX0VSWDIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjNfRVRYMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCOF9FTURDICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEI1X0VSWDAgKSB8DQogICAgICAgIC8qKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMThfRUYxMDAgICApIHwgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTRfRVJYMyApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCNF9FQ1JTX0VDUlNEViApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMV9FVFhFTiApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTBfRVRYMiApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMF9FVFhDS19FUkVGQ0sgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjlfRU1ESU8gKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjdfRVJYRVIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjE3X0VSWENLICksIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UQzBfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFRDMCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzBfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfVEMwICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UQzBfQ2ZnUElPICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgVEMwIHNpZ25hbHMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVEMwX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjIzX1RJT0EwICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyNF9USU9CMCApLCAgIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIxMl9UQ0xLMCApICk7IC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RDMV9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVEMxICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1RDMV9DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9UQzEgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RDMV9DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBUQzEgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzFfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjVfVElPQTEgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjI2X1RJT0IxICksICAgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjE5X1RDTEsxICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVEMyX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBUQzIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVEMyX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1RDMiApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVEMyX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFRDMiBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1RDMl9DZmdQSU8oIHZvaWQgKQ0Kew0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0IsICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjhfVElPQjIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjI3X1RJT0EyICksIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEIgKi8NCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9BLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMTVfVENMSzIgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9NQ19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgTUMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfTUNfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfU1lTICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9BX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBQSU9BICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT0FfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfUElPQSApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPQl9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUElPQiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9CX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1BJT0IgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgQ0FOICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9DQU4gKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBDQU4gc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9BLCAgICAgICAgICAgICAgICAgICAgICAgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTIwX0NBTlRYICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExOV9DQU5SWCApLCAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUFdNQ19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUFdNQyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1BXTUMgKSApOw0KfQ0KDQojZW5kaWYgLy8gbGliX0FUOTFTQU03WDEyOF9IDQo=