LyoqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0ICAtICBST1VTU0VUICAtICovDQovKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIERJU0NMQUlNRVI6ICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SICovDQovKiogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiAqLw0KLyoqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFICovDQovKiogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgKi8NCi8qKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UICovDQovKiogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsICovDQovKiogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiAqLw0KLyoqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HICovDQovKiogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCAqLw0KLyoqIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuICovDQovKiogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIEZpbGUgTmFtZSAgICAgICAgICAgOiBsaWJfQVQ5MVNBTTdYMjU2LmggKi8NCi8qKiBPYmplY3QgICAgICAgICAgICAgIDogQVQ5MVNBTTdYMjU2IGlubGluZWQgZnVuY3Rpb25zICovDQovKiogR2VuZXJhdGVkICAgICAgICAgICA6IEFUOTEgU1cgQXBwbGljYXRpb24gR3JvdXAgIDA1LzIwLzIwMDUgKDE2OjIyOjI5KSAqLw0KLyoqICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGJndS5oLzEuMS9GcmkgSmFuIDMxIDEyOjE4OjQwIDIwMDMvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3BtY19TQU03WC5oLzEuMS9UdWUgRmViICAxIDA4OjMyOjEwIDIwMDUvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX1ZSRUdfNjA4NUIuaC8xLjEvVHVlIEZlYiAgMSAxNjoyMDo0NyAyMDA1Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9yc3RjXzYwOThBLmgvMS4xL1dlZCBPY3QgIDYgMTA6Mzk6MjAgMjAwNC8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfc3NjLmgvMS40L0ZyaSBKYW4gMzEgMTI6MTk6MjAgMjAwMy8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfd2R0Y182MDgwQS5oLzEuMS9XZWQgT2N0ICA2IDEwOjM4OjMwIDIwMDQvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3VzYXJ0LmgvMS41L1RodSBOb3YgMjEgMTY6MDE6NTQgMjAwMi8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfc3BpMi5oLzEuMS9Nb24gQXVnIDI1IDE0OjIzOjUyIDIwMDMvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3BpdGNfNjA3OUEuaC8xLjIvVHVlIE5vdiAgOSAxNDo0Mzo1NiAyMDA0Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9haWNfNjA3NWIuaC8xLjEvRnJpIE1heSAyMCAxNDowMToxOSAyMDA1Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9hZXNfNjE0OWEuaC8xLjEvTW9uIEphbiAxNyAwNzo0MzowOSAyMDA1Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl90d2kuaC8xLjMvTW9uIEp1bCAxOSAxNDoyNzo1OCAyMDA0Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9hZGMuaC8xLjYvRnJpIE9jdCAxNyAwOToxMjozOCAyMDAzLy8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9ydHRjXzYwODFBLmgvMS4xL1dlZCBPY3QgIDYgMTA6Mzk6MzggMjAwNC8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfdWRwLmgvMS40L1dlZCBGZWIgMTYgMDg6Mzk6MzQgMjAwNS8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGVzM182MTUwYS5oLzEuMS9Nb24gSmFuIDE3IDA5OjE5OjE5IDIwMDUvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3RjXzE3NTNiLmgvMS4xL0ZyaSBKYW4gMzEgMTI6MjA6MDIgMjAwMy8vICovDQovKiogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfTUNfU0FNN1guaC8xLjEvVGh1IE1hciAyNSAxNToxOToxNCAyMDA0Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9waW8uaC8xLjMvRnJpIEphbiAzMSAxMjoxODo1NiAyMDAzLy8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9jYW5fQVQ5MS5oLzEuNC9GcmkgT2N0IDE3IDA5OjEyOjUwIDIwMDMvLyAqLw0KLyoqIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX1BXTV9TQU0uaC8xLjMvVGh1IEphbiAyMiAxMDoxMDo1MCAyMDA0Ly8gKi8NCi8qKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9wZGMuaC8xLjIvVHVlIEp1bCAgMiAxMzoyOTo0MCAyMDAyLy8gKi8NCi8qKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQoNCiNpZm5kZWYgbGliX0FUOTFTQU03WDI1Nl9IDQojZGVmaW5lIGxpYl9BVDkxU0FNN1gyNTZfSA0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgQUlDDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KI2RlZmluZSBBVDkxQ19BSUNfQlJBTkNIX09QQ09ERSAgICAoICggdm9pZCAoICogKSgpICkgMHhFNTFGRkYyMCApIC8qIGxkciwgcGMsIFtwYywgIy0mRjIwXSAqLw0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FJQ19Db25maWd1cmVJdCAqLw0KLyoqIFxicmllZiBJbnRlcnJ1cHQgSGFuZGxlciBJbml0aWFsaXphdGlvbiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FJQ19Db25maWd1cmVJdCggQVQ5MVBTX0FJQyBwQWljLCAgICAgICAgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpcnFfaWQsICAgICAgICAgICAgLyogXGFyZyBpbnRlcnJ1cHQgbnVtYmVyIHRvIGluaXRpYWxpemUgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwcmlvcml0eSwgICAgICAgICAgLyogXGFyZyBwcmlvcml0eSB0byBnaXZlIHRvIHRoZSBpbnRlcnJ1cHQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcmNfdHlwZSwgICAgICAgICAgLyogXGFyZyBhY3RpdmF0aW9uIGFuZCBzZW5zZSBvZiBhY3RpdmF0aW9uICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICggKiBuZXdIYW5kbGVyICkoIHZvaWQgKSApIC8qIFxhcmcgYWRkcmVzcyBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgKi8NCnsNCiAgICB1bnNpZ25lZCBpbnQgb2xkSGFuZGxlcjsNCiAgICB1bnNpZ25lZCBpbnQgbWFzazsNCg0KICAgIG9sZEhhbmRsZXIgPSBwQWljLT5BSUNfU1ZSWyBpcnFfaWQgXTsNCg0KICAgIG1hc2sgPSAweDEgPDwgaXJxX2lkOw0KICAgIC8qKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgb24gdGhlIGludGVycnVwdCBjb250cm9sbGVyICovDQogICAgcEFpYy0+QUlDX0lEQ1IgPSBtYXNrOw0KICAgIC8qKiBTYXZlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lIHBvaW50ZXIgYW5kIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkgKi8NCiAgICBwQWljLT5BSUNfU1ZSWyBpcnFfaWQgXSA9ICggdW5zaWduZWQgaW50ICkgbmV3SGFuZGxlcjsNCiAgICAvKiogU3RvcmUgdGhlIFNvdXJjZSBNb2RlIFJlZ2lzdGVyICovDQogICAgcEFpYy0+QUlDX1NNUlsgaXJxX2lkIF0gPSBzcmNfdHlwZSB8IHByaW9yaXR5Ow0KICAgIC8qKiBDbGVhciB0aGUgaW50ZXJydXB0IG9uIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciAqLw0KICAgIHBBaWMtPkFJQ19JQ0NSID0gbWFzazsNCg0KICAgIHJldHVybiBvbGRIYW5kbGVyOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FJQ19FbmFibGVJdCAqLw0KLyoqIFxicmllZiBFbmFibGUgY29ycmVzcG9uZGluZyBJVCBudW1iZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0VuYWJsZUl0KCBBVDkxUFNfQUlDIHBBaWMsICAgICAgLyogXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlycV9pZCApIC8qIFxhcmcgaW50ZXJydXB0IG51bWJlciB0byBpbml0aWFsaXplICovDQp7DQogICAgLyoqIEVuYWJsZSB0aGUgaW50ZXJydXB0IG9uIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciAqLw0KICAgIHBBaWMtPkFJQ19JRUNSID0gMHgxIDw8IGlycV9pZDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BSUNfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgY29ycmVzcG9uZGluZyBJVCBudW1iZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0Rpc2FibGVJdCggQVQ5MVBTX0FJQyBwQWljLCAgICAgIC8qIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXJxX2lkICkgLyogXGFyZyBpbnRlcnJ1cHQgbnVtYmVyIHRvIGluaXRpYWxpemUgKi8NCnsNCiAgICB1bnNpZ25lZCBpbnQgbWFzayA9IDB4MSA8PCBpcnFfaWQ7DQoNCiAgICAvKiogRGlzYWJsZSB0aGUgaW50ZXJydXB0IG9uIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlciAqLw0KICAgIHBBaWMtPkFJQ19JRENSID0gbWFzazsNCiAgICAvKiogQ2xlYXIgdGhlIGludGVycnVwdCBvbiB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKCBpZiBvbmUgaXMgcGVuZGluZyApICovDQogICAgcEFpYy0+QUlDX0lDQ1IgPSBtYXNrOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FJQ19DbGVhckl0ICovDQovKiogXGJyaWVmIENsZWFyIGNvcnJlc3BvbmRpbmcgSVQgbnVtYmVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FJQ19DbGVhckl0KCBBVDkxUFNfQUlDIHBBaWMsICAgICAgLyogXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXJxX2lkICkgLyogXGFyZyBpbnRlcnJ1cHQgbnVtYmVyIHRvIGluaXRpYWxpemUgKi8NCnsNCiAgICAvKiogQ2xlYXIgdGhlIGludGVycnVwdCBvbiB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKCBpZiBvbmUgaXMgcGVuZGluZyApICovDQogICAgcEFpYy0+QUlDX0lDQ1IgPSAoIDB4MSA8PCBpcnFfaWQgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BSUNfQWNrbm93bGVkZ2VJdCAqLw0KLyoqIFxicmllZiBBY2tub3dsZWRnZSBjb3JyZXNwb25kaW5nIElUIG51bWJlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfQWNrbm93bGVkZ2VJdCggQVQ5MVBTX0FJQyBwQWljICkgLyogXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzICovDQp7DQogICAgcEFpYy0+QUlDX0VPSUNSID0gcEFpYy0+QUlDX0VPSUNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FJQ19TZXRFeGNlcHRpb25WZWN0b3IgKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIHZlY3RvciBoYW5kbGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUlDX1NldEV4Y2VwdGlvblZlY3RvciggdW5zaWduZWQgaW50ICogcFZlY3RvciwgLyogXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoICogSGFuZGxlciApKCkgKSAgLyogXGFyZyBJbnRlcnJ1cHQgSGFuZGxlciAqLw0Kew0KICAgIHVuc2lnbmVkIGludCBvbGRWZWN0b3IgPSAqcFZlY3RvcjsNCg0KICAgIGlmKCAoIHVuc2lnbmVkIGludCApIEhhbmRsZXIgPT0gKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19BSUNfQlJBTkNIX09QQ09ERSApDQogICAgew0KICAgICAgICAqcFZlY3RvciA9ICggdW5zaWduZWQgaW50ICkgQVQ5MUNfQUlDX0JSQU5DSF9PUENPREU7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgICpwVmVjdG9yID0gKCAoICggKCAoIHVuc2lnbmVkIGludCApIEhhbmRsZXIgKSAtICggKCB1bnNpZ25lZCBpbnQgKSBwVmVjdG9yICkgLSAweDggKSA+PiAyICkgJiAweDAwRkZGRkZGICkgfCAweEVBMDAwMDAwOw0KICAgIH0NCg0KICAgIHJldHVybiBvbGRWZWN0b3I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUlDX1RyaWcgKi8NCi8qKiBcYnJpZWYgVHJpZyBhbiBJVCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfVHJpZyggQVQ5MVBTX0FJQyBwQWljLCAgICAgIC8qIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlycV9pZCApIC8qIFxhcmcgaW50ZXJydXB0IG51bWJlciAqLw0Kew0KICAgIHBBaWMtPkFJQ19JU0NSID0gKCAweDEgPDwgaXJxX2lkICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUlDX0lzQWN0aXZlICovDQovKiogXGJyaWVmIFRlc3QgaWYgYW4gSVQgaXMgYWN0aXZlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUlDX0lzQWN0aXZlKCBBVDkxUFNfQUlDIHBBaWMsICAgICAgLyogXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXJxX2lkICkgLyogXGFyZyBJbnRlcnJ1cHQgTnVtYmVyICovDQp7DQogICAgcmV0dXJuKCBwQWljLT5BSUNfSVNSICYgKCAweDEgPDwgaXJxX2lkICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BSUNfSXNQZW5kaW5nICovDQovKiogXGJyaWVmIFRlc3QgaWYgYW4gSVQgaXMgcGVuZGluZyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FJQ19Jc1BlbmRpbmcoIEFUOTFQU19BSUMgcEFpYywgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaXJxX2lkICkgLyogXGFyZyBJbnRlcnJ1cHQgTnVtYmVyICovDQp7DQogICAgcmV0dXJuKCBwQWljLT5BSUNfSVBSICYgKCAweDEgPDwgaXJxX2lkICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BSUNfT3BlbiAqLw0KLyoqIFxicmllZiBTZXQgZXhjZXB0aW9uIHZlY3RvcnMgYW5kIEFJQyByZWdpc3RlcnMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX09wZW4oIEFUOTFQU19BSUMgcEFpYywgICAgICAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoICogSXJxSGFuZGxlciApKCksICAgICAgLyogXGFyZyBEZWZhdWx0IElSUSB2ZWN0b3IgZXhjZXB0aW9uICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICggKiBGaXFIYW5kbGVyICkoKSwgICAgICAvKiBcYXJnIERlZmF1bHQgRklRIHZlY3RvciBleGNlcHRpb24gKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCAqIERlZmF1bHRIYW5kbGVyICkoKSwgIC8qIFxhcmcgRGVmYXVsdCBIYW5kbGVyIHNldCBpbiBJU1IgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCAqIFNwdXJpb3VzSGFuZGxlciApKCksIC8qIFxhcmcgRGVmYXVsdCBTcHVyaW91cyBIYW5kbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcHJvdGVjdE1vZGUgKSAgICAvKiBcYXJnIERlYnVnIENvbnRyb2wgUmVnaXN0ZXIgKi8NCnsNCiAgICBpbnQgaTsNCg0KICAgIC8qIERpc2FibGUgYWxsIGludGVycnVwdHMgYW5kIHNldCBJVlIgdG8gdGhlIGRlZmF1bHQgaGFuZGxlciAqLw0KICAgIGZvciggaSA9IDA7IGkgPCAzMjsgKytpICkNCiAgICB7DQogICAgICAgIEFUOTFGX0FJQ19EaXNhYmxlSXQoIHBBaWMsIGkgKTsNCiAgICAgICAgQVQ5MUZfQUlDX0NvbmZpZ3VyZUl0KCBwQWljLCBpLCBBVDkxQ19BSUNfUFJJT1JfTE9XRVNULCBBVDkxQ19BSUNfU1JDVFlQRV9ISUdIX0xFVkVMLCBEZWZhdWx0SGFuZGxlciApOw0KICAgIH0NCg0KICAgIC8qIFNldCB0aGUgSVJRIGV4Y2VwdGlvbiB2ZWN0b3IgKi8NCiAgICBBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yKCAoIHVuc2lnbmVkIGludCAqICkgMHgxOCwgSXJxSGFuZGxlciApOw0KICAgIC8qIFNldCB0aGUgRmFzdCBJbnRlcnJ1cHQgZXhjZXB0aW9uIHZlY3RvciAqLw0KICAgIEFUOTFGX0FJQ19TZXRFeGNlcHRpb25WZWN0b3IoICggdW5zaWduZWQgaW50ICogKSAweDFDLCBGaXFIYW5kbGVyICk7DQoNCiAgICBwQWljLT5BSUNfU1BVID0gKCB1bnNpZ25lZCBpbnQgKSBTcHVyaW91c0hhbmRsZXI7DQogICAgcEFpYy0+QUlDX0RDUiA9IHByb3RlY3RNb2RlOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUERDDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QRENfU2V0TmV4dFJ4ICovDQovKiogXGJyaWVmIFNldCB0aGUgbmV4dCByZWNlaXZlIHRyYW5zZmVyIGRlc2NyaXB0b3IgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX1NldE5leHRSeCggQVQ5MVBTX1BEQyBwUERDLCAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIGFkZHJlc3MsICAgICAgLyogXGFyZyBhZGRyZXNzIHRvIHRoZSBuZXh0IGJsb2MgdG8gYmUgcmVjZWl2ZWQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVzICkgLyogXGFyZyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVjZWl2ZWQgKi8NCnsNCiAgICBwUERDLT5QRENfUk5QUiA9ICggdW5zaWduZWQgaW50ICkgYWRkcmVzczsNCiAgICBwUERDLT5QRENfUk5DUiA9IGJ5dGVzOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19TZXROZXh0VHggKi8NCi8qKiBcYnJpZWYgU2V0IHRoZSBuZXh0IHRyYW5zbWl0IHRyYW5zZmVyIGRlc2NyaXB0b3IgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX1NldE5leHRUeCggQVQ5MVBTX1BEQyBwUERDLCAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIGFkZHJlc3MsICAgICAgLyogXGFyZyBhZGRyZXNzIHRvIHRoZSBuZXh0IGJsb2MgdG8gYmUgdHJhbnNtaXR0ZWQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVzICkgLyogXGFyZyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8NCnsNCiAgICBwUERDLT5QRENfVE5QUiA9ICggdW5zaWduZWQgaW50ICkgYWRkcmVzczsNCiAgICBwUERDLT5QRENfVE5DUiA9IGJ5dGVzOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19TZXRSeCAqLw0KLyoqIFxicmllZiBTZXQgdGhlIHJlY2VpdmUgdHJhbnNmZXIgZGVzY3JpcHRvciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfU2V0UngoIEFUOTFQU19QREMgcFBEQywgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIGFkZHJlc3MsICAgICAgLyogXGFyZyBhZGRyZXNzIHRvIHRoZSBuZXh0IGJsb2MgdG8gYmUgcmVjZWl2ZWQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYnl0ZXMgKSAvKiBcYXJnIG51bWJlciBvZiBieXRlcyB0byBiZSByZWNlaXZlZCAqLw0Kew0KICAgIHBQREMtPlBEQ19SUFIgPSAoIHVuc2lnbmVkIGludCApIGFkZHJlc3M7DQogICAgcFBEQy0+UERDX1JDUiA9IGJ5dGVzOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19TZXRUeCAqLw0KLyoqIFxicmllZiBTZXQgdGhlIHRyYW5zbWl0IHRyYW5zZmVyIGRlc2NyaXB0b3IgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX1NldFR4KCBBVDkxUFNfUERDIHBQREMsICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBhZGRyZXNzLCAgICAgIC8qIFxhcmcgYWRkcmVzcyB0byB0aGUgbmV4dCBibG9jIHRvIGJlIHRyYW5zbWl0dGVkICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJ5dGVzICkgLyogXGFyZyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQgKi8NCnsNCiAgICBwUERDLT5QRENfVFBSID0gKCB1bnNpZ25lZCBpbnQgKSBhZGRyZXNzOw0KICAgIHBQREMtPlBEQ19UQ1IgPSBieXRlczsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QRENfRW5hYmxlVHggKi8NCi8qKiBcYnJpZWYgRW5hYmxlIHRyYW5zbWl0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19FbmFibGVUeCggQVQ5MVBTX1BEQyBwUERDICkgLyogXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIgKi8NCnsNCiAgICBwUERDLT5QRENfUFRDUiA9IEFUOTFDX1BEQ19UWFRFTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QRENfRW5hYmxlUnggKi8NCi8qKiBcYnJpZWYgRW5hYmxlIHJlY2VpdmUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX0VuYWJsZVJ4KCBBVDkxUFNfUERDIHBQREMgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlciAqLw0Kew0KICAgIHBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1JYVEVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19EaXNhYmxlVHggKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSB0cmFuc21pdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfRGlzYWJsZVR4KCBBVDkxUFNfUERDIHBQREMgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlciAqLw0Kew0KICAgIHBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1RYVERJUzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QRENfRGlzYWJsZVJ4ICovDQovKiogXGJyaWVmIERpc2FibGUgcmVjZWl2ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfRGlzYWJsZVJ4KCBBVDkxUFNfUERDIHBQREMgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlciAqLw0Kew0KICAgIHBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1JYVERJUzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QRENfSXNUeEVtcHR5ICovDQovKiogXGJyaWVmIFRlc3QgaWYgdGhlIGN1cnJlbnQgdHJhbnNmZXIgZGVzY3JpcHRvciBoYXMgYmVlbiBzZW50ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfUERDX0lzVHhFbXB0eSggLyogXHJldHVybiByZXR1cm4gMSBpZiB0cmFuc2ZlciBpcyBjb21wbGV0ZSAqLw0KICAgIEFUOTFQU19QREMgcFBEQyApICAgICAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuICEoIHBQREMtPlBEQ19UQ1IgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QRENfSXNOZXh0VHhFbXB0eSAqLw0KLyoqIFxicmllZiBUZXN0IGlmIHRoZSBuZXh0IHRyYW5zZmVyIGRlc2NyaXB0b3IgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIGN1cnJlbnQgdGQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9QRENfSXNOZXh0VHhFbXB0eSggLyogXHJldHVybiByZXR1cm4gMSBpZiB0cmFuc2ZlciBpcyBjb21wbGV0ZSAqLw0KICAgIEFUOTFQU19QREMgcFBEQyApICAgICAgICAgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiAhKCBwUERDLT5QRENfVE5DUiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19Jc1J4RW1wdHkgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiB0aGUgY3VycmVudCB0cmFuc2ZlciBkZXNjcmlwdG9yIGhhcyBiZWVuIGZpbGxlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1BEQ19Jc1J4RW1wdHkoIC8qIFxyZXR1cm4gcmV0dXJuIDEgaWYgdHJhbnNmZXIgaXMgY29tcGxldGUgKi8NCiAgICBBVDkxUFNfUERDIHBQREMgKSAgICAgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiAhKCBwUERDLT5QRENfUkNSICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUERDX0lzTmV4dFJ4RW1wdHkgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiB0aGUgbmV4dCB0cmFuc2ZlciBkZXNjcmlwdG9yIGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBjdXJyZW50IHRkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfUERDX0lzTmV4dFJ4RW1wdHkoIC8qIFxyZXR1cm4gcmV0dXJuIDEgaWYgdHJhbnNmZXIgaXMgY29tcGxldGUgKi8NCiAgICBBVDkxUFNfUERDIHBQREMgKSAgICAgICAgICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gISggcFBEQy0+UERDX1JOQ1IgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QRENfT3BlbiAqLw0KLyoqIFxicmllZiBPcGVuIFBEQzogZGlzYWJsZSBUWCBhbmQgUlggcmVzZXQgdHJhbnNmZXIgZGVzY3JpcHRvcnMsIHJlLWVuYWJsZSBSWCBhbmQgVFggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX09wZW4oIEFUOTFQU19QREMgcFBEQyApIC8qIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyICovDQp7DQogICAgLyoqIERpc2FibGUgdGhlIFJYIGFuZCBUWCBQREMgdHJhbnNmZXIgcmVxdWVzdHMgKi8NCiAgICBBVDkxRl9QRENfRGlzYWJsZVJ4KCBwUERDICk7DQogICAgQVQ5MUZfUERDX0Rpc2FibGVUeCggcFBEQyApOw0KDQogICAgLyoqIFJlc2V0IGFsbCBDb3VudGVyIHJlZ2lzdGVyIE5leHQgYnVmZmVyIGZpcnN0ICovDQogICAgQVQ5MUZfUERDX1NldE5leHRUeCggcFBEQywgKCBjaGFyICogKSAwLCAwICk7DQogICAgQVQ5MUZfUERDX1NldE5leHRSeCggcFBEQywgKCBjaGFyICogKSAwLCAwICk7DQogICAgQVQ5MUZfUERDX1NldFR4KCBwUERDLCAoIGNoYXIgKiApIDAsIDAgKTsNCiAgICBBVDkxRl9QRENfU2V0UngoIHBQREMsICggY2hhciAqICkgMCwgMCApOw0KDQogICAgLyoqIEVuYWJsZSB0aGUgUlggYW5kIFRYIFBEQyB0cmFuc2ZlciByZXF1ZXN0cyAqLw0KICAgIEFUOTFGX1BEQ19FbmFibGVSeCggcFBEQyApOw0KICAgIEFUOTFGX1BEQ19FbmFibGVUeCggcFBEQyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BEQ19DbG9zZSAqLw0KLyoqIFxicmllZiBDbG9zZSBQREM6IGRpc2FibGUgVFggYW5kIFJYIHJlc2V0IHRyYW5zZmVyIGRlc2NyaXB0b3JzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19DbG9zZSggQVQ5MVBTX1BEQyBwUERDICkgLyogXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIgKi8NCnsNCiAgICAvKiogRGlzYWJsZSB0aGUgUlggYW5kIFRYIFBEQyB0cmFuc2ZlciByZXF1ZXN0cyAqLw0KICAgIEFUOTFGX1BEQ19EaXNhYmxlUngoIHBQREMgKTsNCiAgICBBVDkxRl9QRENfRGlzYWJsZVR4KCBwUERDICk7DQoNCiAgICAvKiogUmVzZXQgYWxsIENvdW50ZXIgcmVnaXN0ZXIgTmV4dCBidWZmZXIgZmlyc3QgKi8NCiAgICBBVDkxRl9QRENfU2V0TmV4dFR4KCBwUERDLCAoIGNoYXIgKiApIDAsIDAgKTsNCiAgICBBVDkxRl9QRENfU2V0TmV4dFJ4KCBwUERDLCAoIGNoYXIgKiApIDAsIDAgKTsNCiAgICBBVDkxRl9QRENfU2V0VHgoIHBQREMsICggY2hhciAqICkgMCwgMCApOw0KICAgIEFUOTFGX1BEQ19TZXRSeCggcFBEQywgKCBjaGFyICogKSAwLCAwICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUERDX1NlbmRGcmFtZSAqLw0KLyoqIFxicmllZiBDbG9zZSBQREM6IGRpc2FibGUgVFggYW5kIFJYIHJlc2V0IHRyYW5zZmVyIGRlc2NyaXB0b3JzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUERDX1NlbmRGcmFtZSggQVQ5MVBTX1BEQyBwUERDLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwQnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzekJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcE5leHRCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6TmV4dEJ1ZmZlciApDQp7DQogICAgaWYoIEFUOTFGX1BEQ19Jc1R4RW1wdHkoIHBQREMgKSApDQogICAgew0KICAgICAgICAvKiogQnVmZmVyIGFuZCBuZXh0IGJ1ZmZlciBjYW4gYmUgaW5pdGlhbGl6ZWQgKi8NCiAgICAgICAgQVQ5MUZfUERDX1NldFR4KCBwUERDLCBwQnVmZmVyLCBzekJ1ZmZlciApOw0KICAgICAgICBBVDkxRl9QRENfU2V0TmV4dFR4KCBwUERDLCBwTmV4dEJ1ZmZlciwgc3pOZXh0QnVmZmVyICk7DQogICAgICAgIHJldHVybiAyOw0KICAgIH0NCiAgICBlbHNlIGlmKCBBVDkxRl9QRENfSXNOZXh0VHhFbXB0eSggcFBEQyApICkNCiAgICB7DQogICAgICAgIC8qKiBPbmx5IG9uZSBidWZmZXIgY2FuIGJlIGluaXRpYWxpemVkICovDQogICAgICAgIEFUOTFGX1BEQ19TZXROZXh0VHgoIHBQREMsIHBCdWZmZXIsIHN6QnVmZmVyICk7DQogICAgICAgIHJldHVybiAxOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICAvKiogQWxsIGJ1ZmZlciBhcmUgaW4gdXNlLi4uICovDQogICAgICAgIHJldHVybiAwOw0KICAgIH0NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lICovDQovKiogXGJyaWVmIENsb3NlIFBEQzogZGlzYWJsZSBUWCBhbmQgUlggcmVzZXQgdHJhbnNmZXIgZGVzY3JpcHRvcnMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lKCBBVDkxUFNfUERDIHBQREMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwTmV4dEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCiAgICBpZiggQVQ5MUZfUERDX0lzUnhFbXB0eSggcFBEQyApICkNCiAgICB7DQogICAgICAgIC8qKiBCdWZmZXIgYW5kIG5leHQgYnVmZmVyIGNhbiBiZSBpbml0aWFsaXplZCAqLw0KICAgICAgICBBVDkxRl9QRENfU2V0UngoIHBQREMsIHBCdWZmZXIsIHN6QnVmZmVyICk7DQogICAgICAgIEFUOTFGX1BEQ19TZXROZXh0UngoIHBQREMsIHBOZXh0QnVmZmVyLCBzek5leHRCdWZmZXIgKTsNCiAgICAgICAgcmV0dXJuIDI7DQogICAgfQ0KICAgIGVsc2UgaWYoIEFUOTFGX1BEQ19Jc05leHRSeEVtcHR5KCBwUERDICkgKQ0KICAgIHsNCiAgICAgICAgLyoqIE9ubHkgb25lIGJ1ZmZlciBjYW4gYmUgaW5pdGlhbGl6ZWQgKi8NCiAgICAgICAgQVQ5MUZfUERDX1NldE5leHRSeCggcFBEQywgcEJ1ZmZlciwgc3pCdWZmZXIgKTsNCiAgICAgICAgcmV0dXJuIDE7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIC8qKiBBbGwgYnVmZmVyIGFyZSBpbiB1c2UuLi4gKi8NCiAgICAgICAgcmV0dXJuIDA7DQogICAgfQ0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgREJHVQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfREJHVV9JbnRlcnJ1cHRFbmFibGUgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIERCR1UgSW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0RCR1VfSW50ZXJydXB0RW5hYmxlKCBBVDkxUFNfREJHVSBwRGJndSwgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBEQkdVIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZGJndSBpbnRlcnJ1cHQgdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIHBEYmd1LT5EQkdVX0lFUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfREJHVV9JbnRlcnJ1cHREaXNhYmxlICovDQovKiogXGJyaWVmIERpc2FibGUgREJHVSBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9JbnRlcnJ1cHREaXNhYmxlKCBBVDkxUFNfREJHVSBwRGJndSwgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBEQkdVIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGRiZ3UgaW50ZXJydXB0IHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgcERiZ3UtPkRCR1VfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9EQkdVX0dldEludGVycnVwdE1hc2tTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIERCR1UgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfREJHVV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvKiBccmV0dXJuIERCR1UgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQogICAgQVQ5MVBTX0RCR1UgcERiZ3UgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgREJHVSBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBEYmd1LT5EQkdVX0lNUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9EQkdVX0lzSW50ZXJydXB0TWFza2VkICovDQovKiogXGJyaWVmIFRlc3QgaWYgREJHVSBJbnRlcnJ1cHQgaXMgTWFza2VkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfREJHVV9Jc0ludGVycnVwdE1hc2tlZCggQVQ5MVBTX0RCR1UgcERiZ3UsICAvKiBcYXJnICBwb2ludGVyIHRvIGEgREJHVSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfREJHVV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCBwRGJndSApICYgZmxhZyApOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUElPDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoICovDQovKiogXGJyaWVmIEVuYWJsZSBwaW5zIHRvIGJlIGRyaXZlZCBieSBwZXJpcGhlcmFsICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdQZXJpcGgoIEFUOTFQU19QSU8gcFBpbywgICAgICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBlcmlwaEFFbmFibGUsICAvKiBcYXJnIFBFUklQSCBBIHRvIGVuYWJsZSAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGVyaXBoQkVuYWJsZSApIC8qIFxhcmcgUEVSSVBIIEIgdG8gZW5hYmxlICovDQoNCnsNCiAgICBwUGlvLT5QSU9fQVNSID0gcGVyaXBoQUVuYWJsZTsNCiAgICBwUGlvLT5QSU9fQlNSID0gcGVyaXBoQkVuYWJsZTsNCiAgICBwUGlvLT5QSU9fUERSID0gKCBwZXJpcGhBRW5hYmxlIHwgcGVyaXBoQkVuYWJsZSApOyAvKiBTZXQgaW4gUGVyaXBoIG1vZGUgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fQ2ZnT3V0cHV0ICovDQovKiogXGJyaWVmIEVuYWJsZSBQSU8gaW4gb3V0cHV0IG1vZGUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ091dHB1dCggQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaW9FbmFibGUgKSAvKiBcYXJnIFBJTyB0byBiZSBlbmFibGVkICovDQp7DQogICAgcFBpby0+UElPX1BFUiA9IHBpb0VuYWJsZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgaW4gUElPIG1vZGUgKi8NCiAgICBwUGlvLT5QSU9fT0VSID0gcGlvRW5hYmxlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbmZpZ3VyZSBpbiBPdXRwdXQgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fQ2ZnSW5wdXQgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBJTyBpbiBpbnB1dCBtb2RlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdJbnB1dCggQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5wdXRFbmFibGUgKSAvKiBcYXJnIFBJTyB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyogRGlzYWJsZSBvdXRwdXQgKi8NCiAgICBwUGlvLT5QSU9fT0RSID0gaW5wdXRFbmFibGU7DQogICAgcFBpby0+UElPX1BFUiA9IGlucHV0RW5hYmxlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19DZmdPcGVuZHJhaW4gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBpbiBvcGVuIGRyYWluICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdPcGVuZHJhaW4oIEFUOTFQU19QSU8gcFBpbywgICAgICAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtdWx0aURydkVuYWJsZSApIC8qIFxhcmcgcGlvIHRvIGJlIGNvbmZpZ3VyZWQgaW4gb3BlbiBkcmFpbiAqLw0Kew0KICAgIC8qIENvbmZpZ3VyZSB0aGUgbXVsdGktZHJpdmUgb3B0aW9uICovDQogICAgcFBpby0+UElPX01ERFIgPSB+bXVsdGlEcnZFbmFibGU7DQogICAgcFBpby0+UElPX01ERVIgPSBtdWx0aURydkVuYWJsZTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fQ2ZnUHVsbHVwICovDQovKiogXGJyaWVmIEVuYWJsZSBwdWxsdXAgb24gUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdQdWxsdXAoIEFUOTFQU19QSU8gcFBpbywgICAgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcHVsbHVwRW5hYmxlICkgLyogXGFyZyBlbmFibGUgcHVsbHVwIG9uIFBJTyAqLw0Kew0KICAgIC8qIENvbm5lY3Qgb3Igbm90IFB1bGx1cCAqLw0KICAgIHBQaW8tPlBJT19QUFVEUiA9IH5wdWxsdXBFbmFibGU7DQogICAgcFBpby0+UElPX1BQVUVSID0gcHVsbHVwRW5hYmxlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19DZmdEaXJlY3REcml2ZSAqLw0KLyoqIFxicmllZiBFbmFibGUgZGlyZWN0IGRyaXZlIG9uIFBJTyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2ZnRGlyZWN0RHJpdmUoIEFUOTFQU19QSU8gcFBpbywgICAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRpcmVjdERyaXZlICkgLyogXGFyZyBQSU8gdG8gYmUgY29uZmlndXJlZCB3aXRoIGRpcmVjdCBkcml2ZSAqLw0KDQp7DQogICAgLyogQ29uZmlndXJlIHRoZSBEaXJlY3QgRHJpdmUgKi8NCiAgICBwUGlvLT5QSU9fT1dEUiA9IH5kaXJlY3REcml2ZTsNCiAgICBwUGlvLT5QSU9fT1dFUiA9IGRpcmVjdERyaXZlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19DZmdJbnB1dEZpbHRlciAqLw0KLyoqIFxicmllZiBFbmFibGUgaW5wdXQgZmlsdGVyIG9uIGlucHV0IFBJTyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2ZnSW5wdXRGaWx0ZXIoIEFUOTFQU19QSU8gcFBpbywgICAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGlucHV0RmlsdGVyICkgLyogXGFyZyBQSU8gdG8gYmUgY29uZmlndXJlZCB3aXRoIGlucHV0IGZpbHRlciAqLw0KDQp7DQogICAgLyogQ29uZmlndXJlIHRoZSBEaXJlY3QgRHJpdmUgKi8NCiAgICBwUGlvLT5QSU9fSUZEUiA9IH5pbnB1dEZpbHRlcjsNCiAgICBwUGlvLT5QSU9fSUZFUiA9IGlucHV0RmlsdGVyOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19HZXRJbnB1dCAqLw0KLyoqIFxicmllZiBSZXR1cm4gUElPIGlucHV0IHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldElucHV0KCAvKiBccmV0dXJuIFBJTyBpbnB1dCAqLw0KICAgIEFUOTFQU19QSU8gcFBpbyApICAgICAgICAgICAgICAgICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBQaW8tPlBJT19QRFNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19Jc0lucHV0U2V0ICovDQovKiogXGJyaWVmIFRlc3QgaWYgUElPIGlzIGlucHV0IGZsYWcgaXMgYWN0aXZlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzSW5wdXRTZXQoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1BJT19HZXRJbnB1dCggcFBpbyApICYgZmxhZyApOw0KfQ0KDQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX1NldE91dHB1dCAqLw0KLyoqIFxicmllZiBTZXQgdG8gMSBvdXRwdXQgUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19TZXRPdXRwdXQoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgb3V0cHV0IHRvIGJlIHNldCAqLw0Kew0KICAgIHBQaW8tPlBJT19TT0RSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fQ2xlYXJPdXRwdXQgKi8NCi8qKiBcYnJpZWYgU2V0IHRvIDAgb3V0cHV0IFBJTyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2xlYXJPdXRwdXQoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBvdXRwdXQgdG8gYmUgY2xlYXJlZCAqLw0Kew0KICAgIHBQaW8tPlBJT19DT0RSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fRm9yY2VPdXRwdXQgKi8NCi8qKiBcYnJpZWYgRm9yY2Ugb3V0cHV0IHdoZW4gRGlyZWN0IGRyaXZlIG9wdGlvbiBpcyBlbmFibGVkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19Gb3JjZU91dHB1dCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIG91dHB1dCB0byBiZSBmb3JjZWQgKi8NCnsNCiAgICBwUGlvLT5QSU9fT0RTUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0VuYWJsZSAqLw0KLyoqIFxicmllZiBFbmFibGUgUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19FbmFibGUoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgcGlvIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICBwUGlvLT5QSU9fUEVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fRGlzYWJsZSAqLw0KLyoqIFxicmllZiBEaXNhYmxlIFBJTyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fRGlzYWJsZSggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgcGlvIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgcFBpby0+UElPX1BEUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0dldFN0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gUElPIFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRTdGF0dXMoIC8qIFxyZXR1cm4gUElPIFN0YXR1cyAqLw0KICAgIEFUOTFQU19QSU8gcFBpbyApICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUGlvLT5QSU9fUFNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19Jc1NldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFBJTyBpcyBTZXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNTZXQoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9QSU9fR2V0U3RhdHVzKCBwUGlvICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX091dHB1dEVuYWJsZSAqLw0KLyoqIFxicmllZiBPdXRwdXQgRW5hYmxlIFBJTyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fT3V0cHV0RW5hYmxlKCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIHBpbyBvdXRwdXQgdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIHBQaW8tPlBJT19PRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19PdXRwdXREaXNhYmxlICovDQovKiogXGJyaWVmIE91dHB1dCBFbmFibGUgUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19PdXRwdXREaXNhYmxlKCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBwaW8gb3V0cHV0IHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgcFBpby0+UElPX09EUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0dldE91dHB1dFN0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gUElPIE91dHB1dCBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0T3V0cHV0U3RhdHVzKCAvKiBccmV0dXJuIFBJTyBPdXRwdXQgU3RhdHVzICovDQogICAgQVQ5MVBTX1BJTyBwUGlvICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBQaW8tPlBJT19PU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0lzT3VwdXRTZXQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBQSU8gT3V0cHV0IGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc091dHB1dFNldCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1BJT19HZXRPdXRwdXRTdGF0dXMoIHBQaW8gKSAmIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fSW5wdXRGaWx0ZXJFbmFibGUgKi8NCi8qKiBcYnJpZWYgSW5wdXQgRmlsdGVyIEVuYWJsZSBQSU8gKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0lucHV0RmlsdGVyRW5hYmxlKCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgcGlvIGlucHV0IGZpbHRlciB0byBiZSBlbmFibGVkICovDQp7DQogICAgcFBpby0+UElPX0lGRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19JbnB1dEZpbHRlckRpc2FibGUgKi8NCi8qKiBcYnJpZWYgSW5wdXQgRmlsdGVyIERpc2FibGUgUElPICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19JbnB1dEZpbHRlckRpc2FibGUoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgcGlvIGlucHV0IGZpbHRlciB0byBiZSBkaXNhYmxlZCAqLw0Kew0KICAgIHBQaW8tPlBJT19JRkRSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fR2V0SW5wdXRGaWx0ZXJTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIFBJTyBJbnB1dCBGaWx0ZXIgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldElucHV0RmlsdGVyU3RhdHVzKCAvKiBccmV0dXJuIFBJTyBJbnB1dCBGaWx0ZXIgU3RhdHVzICovDQogICAgQVQ5MVBTX1BJTyBwUGlvICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFBpby0+UElPX0lGU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0lzSW5wdXRGaWx0ZXJTZXQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBQSU8gSW5wdXQgZmlsdGVyIGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0lucHV0RmlsdGVyU2V0KCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9QSU9fR2V0SW5wdXRGaWx0ZXJTdGF0dXMoIHBQaW8gKSAmIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fR2V0T3V0cHV0RGF0YVN0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gUElPIE91dHB1dCBEYXRhIFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRPdXRwdXREYXRhU3RhdHVzKCAvKiBccmV0dXJuIFBJTyBPdXRwdXQgRGF0YSBTdGF0dXMgKi8NCiAgICBBVDkxUFNfUElPIHBQaW8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBQaW8tPlBJT19PRFNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19JbnRlcnJ1cHRFbmFibGUgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBJTyBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0ludGVycnVwdEVuYWJsZSggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBwaW8gaW50ZXJydXB0IHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICBwUGlvLT5QSU9fSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fSW50ZXJydXB0RGlzYWJsZSAqLw0KLyoqIFxicmllZiBEaXNhYmxlIFBJTyBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0ludGVycnVwdERpc2FibGUoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIHBpbyBpbnRlcnJ1cHQgdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICBwUGlvLT5QSU9fSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fR2V0SW50ZXJydXB0TWFza1N0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gUElPIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvKiBccmV0dXJuIFBJTyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCiAgICBBVDkxUFNfUElPIHBQaW8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBQaW8tPlBJT19JTVI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0dldEludGVycnVwdFN0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gUElPIEludGVycnVwdCBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0SW50ZXJydXB0U3RhdHVzKCAvKiBccmV0dXJuIFBJTyBJbnRlcnJ1cHQgU3RhdHVzICovDQogICAgQVQ5MVBTX1BJTyBwUGlvICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBQaW8tPlBJT19JU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0lzSW50ZXJydXB0TWFza2VkICovDQovKiogXGJyaWVmIFRlc3QgaWYgUElPIEludGVycnVwdCBpcyBNYXNrZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNJbnRlcnJ1cHRNYXNrZWQoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9QSU9fR2V0SW50ZXJydXB0TWFza1N0YXR1cyggcFBpbyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19Jc0ludGVycnVwdFNldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFBJTyBJbnRlcnJ1cHQgaXMgU2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzSW50ZXJydXB0U2V0KCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfUElPX0dldEludGVycnVwdFN0YXR1cyggcFBpbyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19NdWx0aURyaXZlckVuYWJsZSAqLw0KLyoqIFxicmllZiBNdWx0aSBEcml2ZXIgRW5hYmxlIFBJTyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fTXVsdGlEcml2ZXJFbmFibGUoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBwaW8gdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIHBQaW8tPlBJT19NREVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fTXVsdGlEcml2ZXJEaXNhYmxlICovDQovKiogXGJyaWVmIE11bHRpIERyaXZlciBEaXNhYmxlIFBJTyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fTXVsdGlEcml2ZXJEaXNhYmxlKCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIHBpbyB0byBiZSBkaXNhYmxlZCAqLw0Kew0KICAgIHBQaW8tPlBJT19NRERSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fR2V0TXVsdGlEcml2ZXJTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIFBJTyBNdWx0aSBEcml2ZXIgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldE11bHRpRHJpdmVyU3RhdHVzKCAvKiBccmV0dXJuIFBJTyBNdWx0aSBEcml2ZXIgU3RhdHVzICovDQogICAgQVQ5MVBTX1BJTyBwUGlvICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFBpby0+UElPX01EU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0lzTXVsdGlEcml2ZXJTZXQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBQSU8gTXVsdGlEcml2ZXIgaXMgU2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzTXVsdGlEcml2ZXJTZXQoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1BJT19HZXRNdWx0aURyaXZlclN0YXR1cyggcFBpbyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19BX1JlZ2lzdGVyU2VsZWN0aW9uICovDQovKiogXGJyaWVmIFBJTyBBIFJlZ2lzdGVyIFNlbGVjdGlvbiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQV9SZWdpc3RlclNlbGVjdGlvbiggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgcGlvIEEgcmVnaXN0ZXIgc2VsZWN0aW9uICovDQp7DQogICAgcFBpby0+UElPX0FTUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0JfUmVnaXN0ZXJTZWxlY3Rpb24gKi8NCi8qKiBcYnJpZWYgUElPIEIgUmVnaXN0ZXIgU2VsZWN0aW9uICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19CX1JlZ2lzdGVyU2VsZWN0aW9uKCBBVDkxUFNfUElPIHBQaW8sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBwaW8gQiByZWdpc3RlciBzZWxlY3Rpb24gKi8NCnsNCiAgICBwUGlvLT5QSU9fQlNSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fR2V0X0FCX1JlZ2lzdGVyU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBQSU8gSW50ZXJydXB0IFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRfQUJfUmVnaXN0ZXJTdGF0dXMoIC8qIFxyZXR1cm4gUElPIEFCIFJlZ2lzdGVyIFN0YXR1cyAqLw0KICAgIEFUOTFQU19QSU8gcFBpbyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUGlvLT5QSU9fQUJTUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fSXNBQl9SZWdpc3RlclNldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFBJTyBBQiBSZWdpc3RlciBpcyBTZXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNBQl9SZWdpc3RlclNldCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfUElPX0dldF9BQl9SZWdpc3RlclN0YXR1cyggcFBpbyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19PdXRwdXRXcml0ZUVuYWJsZSAqLw0KLyoqIFxicmllZiBPdXRwdXQgV3JpdGUgRW5hYmxlIFBJTyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fT3V0cHV0V3JpdGVFbmFibGUoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBwaW8gb3V0cHV0IHdyaXRlIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICBwUGlvLT5QSU9fT1dFUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX091dHB1dFdyaXRlRGlzYWJsZSAqLw0KLyoqIFxicmllZiBPdXRwdXQgV3JpdGUgRGlzYWJsZSBQSU8gKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX091dHB1dFdyaXRlRGlzYWJsZSggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBwaW8gb3V0cHV0IHdyaXRlIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgcFBpby0+UElPX09XRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXRXcml0ZVN0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gUElPIE91dHB1dCBXcml0ZSBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0T3V0cHV0V3JpdGVTdGF0dXMoIC8qIFxyZXR1cm4gUElPIE91dHB1dCBXcml0ZSBTdGF0dXMgKi8NCiAgICBBVDkxUFNfUElPIHBQaW8gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUGlvLT5QSU9fT1dTUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fSXNPdXRwdXRXcml0ZVNldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFBJTyBPdXRwdXRXcml0ZSBpcyBTZXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNPdXRwdXRXcml0ZVNldCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfUElPX0dldE91dHB1dFdyaXRlU3RhdHVzKCBwUGlvICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPX0dldENmZ1B1bGx1cCAqLw0KLyoqIFxicmllZiBSZXR1cm4gUElPIENvbmZpZ3VyYXRpb24gUHVsbHVwICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldENmZ1B1bGx1cCggLyogXHJldHVybiBQSU8gQ29uZmlndXJhdGlvbiBQdWxsdXAgKi8NCiAgICBBVDkxUFNfUElPIHBQaW8gKSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFBpby0+UElPX1BQVVNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJT19Jc091dHB1dERhdGFTdGF0dXNTZXQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBQSU8gT3V0cHV0IERhdGEgU3RhdHVzIGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc091dHB1dERhdGFTdGF0dXNTZXQoIEFUOTFQU19QSU8gcFBpbywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfUElPX0dldE91dHB1dERhdGFTdGF0dXMoIHBQaW8gKSAmIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9fSXNDZmdQdWxsdXBTdGF0dXNTZXQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBQSU8gQ29uZmlndXJhdGlvbiBQdWxsdXAgU3RhdHVzIGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0NmZ1B1bGx1cFN0YXR1c1NldCggQVQ5MVBTX1BJTyBwUGlvLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIH5BVDkxRl9QSU9fR2V0Q2ZnUHVsbHVwKCBwUGlvICkgJiBmbGFnICk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQTUMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19DZmdTeXNDbGtFbmFibGVSZWcgKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBTeXN0ZW0gQ2xvY2sgRW5hYmxlIFJlZ2lzdGVyIG9mIHRoZSBQTUMgY29udHJvbGxlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnU3lzQ2xrRW5hYmxlUmVnKCBBVDkxUFNfUE1DIHBQTUMsIC8qIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSApDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBTQ0VSIHJlZ2lzdGVyICovDQogICAgcFBNQy0+UE1DX1NDRVIgPSBtb2RlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19DZmdTeXNDbGtEaXNhYmxlUmVnICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSB0aGUgU3lzdGVtIENsb2NrIERpc2FibGUgUmVnaXN0ZXIgb2YgdGhlIFBNQyBjb250cm9sbGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19DZmdTeXNDbGtEaXNhYmxlUmVnKCBBVDkxUFNfUE1DIHBQTUMsIC8qIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGUgKQ0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgU0NEUiByZWdpc3RlciAqLw0KICAgIHBQTUMtPlBNQ19TQ0RSID0gbW9kZTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfR2V0U3lzQ2xrU3RhdHVzUmVnICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgU3lzdGVtIENsb2NrIFN0YXR1cyBSZWdpc3RlciBvZiB0aGUgUE1DIGNvbnRyb2xsZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0U3lzQ2xrU3RhdHVzUmVnKCBBVDkxUFNfUE1DIHBQTUMgLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwUE1DLT5QTUNfU0NTUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2sgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIHBlcmlwaGVyYWwgY2xvY2sgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKCBBVDkxUFNfUE1DIHBQTUMsICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBlcmlwaElkcyApIC8qIFxhcmcgSURzIG9mIHBlcmlwaGVyYWxzIHRvIGVuYWJsZSAqLw0Kew0KICAgIHBQTUMtPlBNQ19QQ0VSID0gcGVyaXBoSWRzOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19EaXNhYmxlUGVyaXBoQ2xvY2sgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBwZXJpcGhlcmFsIGNsb2NrICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19EaXNhYmxlUGVyaXBoQ2xvY2soIEFUOTFQU19QTUMgcFBNQywgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBlcmlwaElkcyApIC8qIFxhcmcgSURzIG9mIHBlcmlwaGVyYWxzIHRvIGVuYWJsZSAqLw0Kew0KICAgIHBQTUMtPlBNQ19QQ0RSID0gcGVyaXBoSWRzOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19HZXRQZXJpcGhDbG9jayAqLw0KLyoqIFxicmllZiBHZXQgcGVyaXBoZXJhbCBjbG9jayBzdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0UGVyaXBoQ2xvY2soIEFUOTFQU19QTUMgcFBNQyApIC8qIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUE1DLT5QTUNfUENTUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DS0dSX0NmZ01haW5Pc2NpbGxhdG9yUmVnICovDQovKiogXGJyaWVmIENmZyB0aGUgbWFpbiBvc2NpbGxhdG9yICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NLR1JfQ2ZnTWFpbk9zY2lsbGF0b3JSZWcoIEFUOTFQU19DS0dSIHBDS0dSLCAvKiBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlICkNCnsNCiAgICBwQ0tHUi0+Q0tHUl9NT1IgPSBtb2RlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NLR1JfR2V0TWFpbk9zY2lsbGF0b3JSZWcgKi8NCi8qKiBcYnJpZWYgQ2ZnIHRoZSBtYWluIG9zY2lsbGF0b3IgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DS0dSX0dldE1haW5Pc2NpbGxhdG9yUmVnKCBBVDkxUFNfQ0tHUiBwQ0tHUiApIC8qIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcENLR1ItPkNLR1JfTU9SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NLR1JfRW5hYmxlTWFpbk9zY2lsbGF0b3IgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIHRoZSBtYWluIG9zY2lsbGF0b3IgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0tHUl9FbmFibGVNYWluT3NjaWxsYXRvciggQVQ5MVBTX0NLR1IgcENLR1IgKSAvKiBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyICovDQp7DQogICAgcENLR1ItPkNLR1JfTU9SIHw9IEFUOTFDX0NLR1JfTU9TQ0VOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NLR1JfRGlzYWJsZU1haW5Pc2NpbGxhdG9yICovDQovKiogXGJyaWVmIERpc2FibGUgdGhlIG1haW4gb3NjaWxsYXRvciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9DS0dSX0Rpc2FibGVNYWluT3NjaWxsYXRvciggQVQ5MVBTX0NLR1IgcENLR1IgKSAvKiBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyICovDQp7DQogICAgcENLR1ItPkNLR1JfTU9SICY9IH5BVDkxQ19DS0dSX01PU0NFTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DS0dSX0NmZ01haW5Pc2NTdGFydFVwVGltZSAqLw0KLyoqIFxicmllZiBDZmcgTU9SIFJlZ2lzdGVyIGFjY29yZGluZyB0byB0aGUgbWFpbiBvc2Mgc3RhcnR1cCB0aW1lICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NLR1JfQ2ZnTWFpbk9zY1N0YXJ0VXBUaW1lKCBBVDkxUFNfQ0tHUiBwQ0tHUiwgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3RhcnR1cF90aW1lLCAvKiBcYXJnIG1haW4gb3NjIHN0YXJ0dXAgdGltZSBpbiBtaWNyb3NlY29uZCAodXMpICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc2xvd0Nsb2NrICkgICAvKiBcYXJnIHNsb3dDbG9jayBpbiBIeiAqLw0Kew0KICAgIHBDS0dSLT5DS0dSX01PUiAmPSB+QVQ5MUNfQ0tHUl9PU0NPVU5UOw0KICAgIHBDS0dSLT5DS0dSX01PUiB8PSAoICggc2xvd0Nsb2NrICogc3RhcnR1cF90aW1lICkgLyAoIDggKiAxMDAwMDAwICkgKSA8PCA4Ow0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NLR1JfR2V0TWFpbkNsb2NrRnJlcVJlZyAqLw0KLyoqIFxicmllZiBDZmcgdGhlIG1haW4gb3NjaWxsYXRvciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NLR1JfR2V0TWFpbkNsb2NrRnJlcVJlZyggQVQ5MVBTX0NLR1IgcENLR1IgKSAvKiBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBDS0dSLT5DS0dSX01DRlI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2sgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIE1haW4gY2xvY2sgaW4gSHogKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DS0dSX0dldE1haW5DbG9jayggQVQ5MVBTX0NLR1IgcENLR1IsICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNsb3dDbG9jayApIC8qIFxhcmcgc2xvd0Nsb2NrIGluIEh6ICovDQp7DQogICAgcmV0dXJuICggKCBwQ0tHUi0+Q0tHUl9NQ0ZSICYgQVQ5MUNfQ0tHUl9NQUlORiApICogc2xvd0Nsb2NrICkgPj4gNDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfQ2ZnTUNLUmVnICovDQovKiogXGJyaWVmIENmZyBNYXN0ZXIgQ2xvY2sgUmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0NmZ01DS1JlZyggQVQ5MVBTX1BNQyBwUE1DLCAvKiBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGUgKQ0Kew0KICAgIHBQTUMtPlBNQ19NQ0tSID0gbW9kZTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfR2V0TUNLUmVnICovDQovKiogXGJyaWVmIFJldHVybiBNYXN0ZXIgQ2xvY2sgUmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0TUNLUmVnKCBBVDkxUFNfUE1DIHBQTUMgKSAvKiBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFBNQy0+UE1DX01DS1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfR2V0TWFzdGVyQ2xvY2sgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIG1hc3RlciBjbG9jayBpbiBIeiB3aGljaCBjb3JyZXBvbmRzIHRvIHByb2Nlc3NvciBjbG9jayBmb3IgQVJNNyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0dldE1hc3RlckNsb2NrKCBBVDkxUFNfUE1DIHBQTUMsICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxUFNfQ0tHUiBwQ0tHUiwgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHNsb3dDbG9jayApIC8qIFxhcmcgc2xvd0Nsb2NrIGluIEh6ICovDQp7DQogICAgdW5zaWduZWQgaW50IHJlZyA9IHBQTUMtPlBNQ19NQ0tSOw0KICAgIHVuc2lnbmVkIGludCBwcmVzY2FsZXIgPSAoIDEgPDwgKCAoIHJlZyAmIEFUOTFDX1BNQ19QUkVTICkgPj4gMiApICk7DQogICAgdW5zaWduZWQgaW50IHBsbERpdmlkZXIsIHBsbE11bHRpcGxpZXI7DQoNCiAgICBzd2l0Y2goIHJlZyAmIEFUOTFDX1BNQ19DU1MgKQ0KICAgIHsNCiAgICAgICAgY2FzZSBBVDkxQ19QTUNfQ1NTX1NMT1dfQ0xLOiAvKiBTbG93IGNsb2NrIHNlbGVjdGVkICovDQogICAgICAgICAgICByZXR1cm4gc2xvd0Nsb2NrIC8gcHJlc2NhbGVyOw0KDQogICAgICAgIGNhc2UgQVQ5MUNfUE1DX0NTU19NQUlOX0NMSzogLyogTWFpbiBjbG9jayBpcyBzZWxlY3RlZCAqLw0KICAgICAgICAgICAgcmV0dXJuIEFUOTFGX0NLR1JfR2V0TWFpbkNsb2NrKCBwQ0tHUiwgc2xvd0Nsb2NrICkgLyBwcmVzY2FsZXI7DQoNCiAgICAgICAgY2FzZSBBVDkxQ19QTUNfQ1NTX1BMTF9DTEs6IC8qIFBMTEIgY2xvY2sgaXMgc2VsZWN0ZWQgKi8NCiAgICAgICAgICAgIHJlZyA9IHBDS0dSLT5DS0dSX1BMTFI7DQogICAgICAgICAgICBwbGxEaXZpZGVyID0gKCByZWcgJiBBVDkxQ19DS0dSX0RJViApOw0KICAgICAgICAgICAgcGxsTXVsdGlwbGllciA9ICggKCByZWcgJiBBVDkxQ19DS0dSX01VTCApID4+IDE2ICkgKyAxOw0KICAgICAgICAgICAgcmV0dXJuIEFUOTFGX0NLR1JfR2V0TWFpbkNsb2NrKCBwQ0tHUiwgc2xvd0Nsb2NrICkgLyBwbGxEaXZpZGVyICogcGxsTXVsdGlwbGllciAvIHByZXNjYWxlcjsNCiAgICB9DQoNCiAgICByZXR1cm4gMDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfRW5hYmxlUENLICovDQovKiogXGJyaWVmIEVuYWJsZSBwZXJpcGhlcmFsIGNsb2NrICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19FbmFibGVQQ0soIEFUOTFQU19QTUMgcFBNQywgIC8qIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGNrLCAvKiBcYXJnIFBlcmlwaGVyYWwgY2xvY2sgaWRlbnRpZmllciAwIC4uIDcgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGUgKQ0Kew0KICAgIHBQTUMtPlBNQ19QQ0tSWyBwY2sgXSA9IG1vZGU7DQogICAgcFBNQy0+UE1DX1NDRVIgPSAoIDEgPDwgcGNrICkgPDwgODsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfRGlzYWJsZVBDSyAqLw0KLyoqIFxicmllZiBFbmFibGUgcGVyaXBoZXJhbCBjbG9jayAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRGlzYWJsZVBDSyggQVQ5MVBTX1BNQyBwUE1DLCAgIC8qIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHBjayApIC8qIFxhcmcgUGVyaXBoZXJhbCBjbG9jayBpZGVudGlmaWVyIDAgLi4gNyAqLw0Kew0KICAgIHBQTUMtPlBNQ19TQ0RSID0gKCAxIDw8IHBjayApIDw8IDg7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUE1DX0VuYWJsZUl0ICovDQovKiogXGJyaWVmIEVuYWJsZSBQTUMgaW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19FbmFibGVJdCggQVQ5MVBTX1BNQyBwUE1DLCAgICAvKiBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIElUIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlciAqLw0KICAgIHBQTUMtPlBNQ19JRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19EaXNhYmxlSXQgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBQTUMgaW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19EaXNhYmxlSXQoIEFUOTFQU19QTUMgcFBNQywgICAgLyogcG9pbnRlciB0byBhIFBNQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogSVQgdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlciAqLw0KICAgIHBQTUMtPlBNQ19JRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19HZXRTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIFBNQyBJbnRlcnJ1cHQgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0dldFN0YXR1cyggLyogXHJldHVybiBQTUMgSW50ZXJydXB0IFN0YXR1cyAqLw0KICAgIEFUOTFQU19QTUMgcFBNQyApICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUE1DLT5QTUNfU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUE1DX0dldEludGVycnVwdE1hc2tTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIFBNQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLyogXHJldHVybiBQTUMgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQogICAgQVQ5MVBTX1BNQyBwUE1DICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUE1DLT5QTUNfSU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19Jc0ludGVycnVwdE1hc2tlZCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFBNQyBJbnRlcnJ1cHQgaXMgTWFza2VkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfUE1DIHBQTUMsICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfUE1DX0dldEludGVycnVwdE1hc2tTdGF0dXMoIHBQTUMgKSAmIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QTUNfSXNTdGF0dXNTZXQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBQTUMgU3RhdHVzIGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19Jc1N0YXR1c1NldCggQVQ5MVBTX1BNQyBwUE1DLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1BNQ19HZXRTdGF0dXMoIHBQTUMgKSAmIGZsYWcgKTsNCn0gLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBSU1RDDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1JTVFNvZnRSZXNldCAqLw0KLyoqIFxicmllZiBTdGFydCBTb2Z0d2FyZSBSZXNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9SU1RTb2Z0UmVzZXQoIEFUOTFQU19SU1RDIHBSU1RDLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCByZXNldCApDQp7DQogICAgcFJTVEMtPlJTVENfUkNSID0gKCAweEE1MDAwMDAwIHwgcmVzZXQgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9SU1RTZXRNb2RlICovDQovKiogXGJyaWVmIFNldCBSZXNldCBNb2RlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1JTVFNldE1vZGUoIEFUOTFQU19SU1RDIHBSU1RDLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSApDQp7DQogICAgcFJTVEMtPlJTVENfUk1SID0gKCAweEE1MDAwMDAwIHwgbW9kZSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1JTVEdldE1vZGUgKi8NCi8qKiBcYnJpZWYgR2V0IFJlc2V0IE1vZGUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SU1RHZXRNb2RlKCBBVDkxUFNfUlNUQyBwUlNUQyApDQp7DQogICAgcmV0dXJuKCBwUlNUQy0+UlNUQ19STVIgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9SU1RHZXRTdGF0dXMgKi8NCi8qKiBcYnJpZWYgR2V0IFJlc2V0IFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JTVEdldFN0YXR1cyggQVQ5MVBTX1JTVEMgcFJTVEMgKQ0Kew0KICAgIHJldHVybiggcFJTVEMtPlJTVENfUlNSICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUlNUSXNTb2Z0UnN0QWN0aXZlICovDQovKiogXGJyaWVmIFJldHVybiAhPTAgaWYgc29mdHdhcmUgcmVzZXQgaXMgc3RpbGwgbm90IGNvbXBsZXRlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JTVElzU29mdFJzdEFjdGl2ZSggQVQ5MVBTX1JTVEMgcFJTVEMgKQ0Kew0KICAgIHJldHVybiggKCBwUlNUQy0+UlNUQ19SU1IgKSAmIEFUOTFDX1JTVENfU1JDTVAgKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFJUVEMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICAgQVQ5MUZfU2V0UlRUX1RpbWVCYXNlKCkgKi8NCi8qKiBcYnJpZWYgIFNldCB0aGUgUlRUIHByZXNjYWxlciBhY2NvcmRpbmcgdG8gdGhlIFRpbWVCYXNlIGluIG1zICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JUVFNldFRpbWVCYXNlKCBBVDkxUFNfUlRUQyBwUlRUQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1zICkNCnsNCiAgICBpZiggbXMgPiAyMDAwICkNCiAgICB7DQogICAgICAgIHJldHVybiAxOyAvKiBBVDkxQ19USU1FX09VVF9PRl9SQU5HRSAqLw0KICAgIH0NCg0KICAgIHBSVFRDLT5SVFRDX1JUTVIgJj0gfjB4RkZGRjsNCiAgICBwUlRUQy0+UlRUQ19SVE1SIHw9ICggKCAoIG1zIDw8IDE1ICkgLyAxMDAwICkgJiAweEZGRkYgKTsNCiAgICByZXR1cm4gMDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgIEFUOTFGX1JUVFNldFByZXNjYWxlcigpICovDQovKiogXGJyaWVmICBTZXQgdGhlIG5ldyBwcmVzY2FsZXIgdmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlRUU2V0UHJlc2NhbGVyKCBBVDkxUFNfUlRUQyBwUlRUQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBydHByZXMgKQ0Kew0KICAgIHBSVFRDLT5SVFRDX1JUTVIgJj0gfjB4RkZGRjsNCiAgICBwUlRUQy0+UlRUQ19SVE1SIHw9ICggcnRwcmVzICYgMHhGRkZGICk7DQogICAgcmV0dXJuKCBwUlRUQy0+UlRUQ19SVE1SICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgICBBVDkxRl9SVFRSZXN0YXJ0KCkgKi8NCi8qKiBcYnJpZWYgIFJlc3RhcnQgdGhlIFJUVCBwcmVzY2FsZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVFJlc3RhcnQoIEFUOTFQU19SVFRDIHBSVFRDICkNCnsNCiAgICBwUlRUQy0+UlRUQ19SVE1SIHw9IEFUOTFDX1JUVENfUlRUUlNUOw0KfQ0KDQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgICBBVDkxRl9SVFRfU2V0QWxhcm1JTlQoKSAqLw0KLyoqIFxicmllZiAgRW5hYmxlIFJUVCBBbGFybSBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVFNldEFsYXJtSU5UKCBBVDkxUFNfUlRUQyBwUlRUQyApDQp7DQogICAgcFJUVEMtPlJUVENfUlRNUiB8PSBBVDkxQ19SVFRDX0FMTUlFTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgIEFUOTFGX1JUVF9DbGVhckFsYXJtSU5UKCkgKi8NCi8qKiBcYnJpZWYgIERpc2FibGUgUlRUIEFsYXJtIEludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUlRUQ2xlYXJBbGFybUlOVCggQVQ5MVBTX1JUVEMgcFJUVEMgKQ0Kew0KICAgIHBSVFRDLT5SVFRDX1JUTVIgJj0gfkFUOTFDX1JUVENfQUxNSUVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICAgQVQ5MUZfUlRUX1NldFJ0dEluY0lOVCgpICovDQovKiogXGJyaWVmICBFbmFibGUgUlRUIElOQyBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVFNldFJ0dEluY0lOVCggQVQ5MVBTX1JUVEMgcFJUVEMgKQ0Kew0KICAgIHBSVFRDLT5SVFRDX1JUTVIgfD0gQVQ5MUNfUlRUQ19SVFRJTkNJRU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgICBBVDkxRl9SVFRfQ2xlYXJSdHRJbmNJTlQoKSAqLw0KLyoqIFxicmllZiAgRGlzYWJsZSBSVFQgSU5DIEludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUlRUQ2xlYXJSdHRJbmNJTlQoIEFUOTFQU19SVFRDIHBSVFRDICkNCnsNCiAgICBwUlRUQy0+UlRUQ19SVE1SICY9IH5BVDkxQ19SVFRDX1JUVElOQ0lFTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgIEFUOTFGX1JUVF9TZXRBbGFybVZhbHVlKCkgKi8NCi8qKiBcYnJpZWYgIFNldCBSVFQgQWxhcm0gVmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVFNldEFsYXJtVmFsdWUoIEFUOTFQU19SVFRDIHBSVFRDLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYWxhcm0gKQ0Kew0KICAgIHBSVFRDLT5SVFRDX1JUQVIgPSBhbGFybTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgIEFUOTFGX1JUVF9HZXRBbGFybVZhbHVlKCkgKi8NCi8qKiBcYnJpZWYgIEdldCBSVFQgQWxhcm0gVmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlRUR2V0QWxhcm1WYWx1ZSggQVQ5MVBTX1JUVEMgcFJUVEMgKQ0Kew0KICAgIHJldHVybiggcFJUVEMtPlJUVENfUlRBUiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICAgQVQ5MUZfUlRUR2V0U3RhdHVzKCkgKi8NCi8qKiBcYnJpZWYgIFJlYWQgdGhlIFJUVCBzdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlRUR2V0U3RhdHVzKCBBVDkxUFNfUlRUQyBwUlRUQyApDQp7DQogICAgcmV0dXJuKCBwUlRUQy0+UlRUQ19SVFNSICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgICBBVDkxRl9SVFRfUmVhZFZhbHVlKCkgKi8NCi8qKiBcYnJpZWYgIFJlYWQgdGhlIFJUVCB2YWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SVFRSZWFkVmFsdWUoIEFUOTFQU19SVFRDIHBSVFRDICkNCnsNCiAgICByZWdpc3RlciB2b2xhdGlsZSB1bnNpZ25lZCBpbnQgdmFsMSwgdmFsMjsNCg0KICAgIGRvDQogICAgew0KICAgICAgICB2YWwxID0gcFJUVEMtPlJUVENfUlRWUjsNCiAgICAgICAgdmFsMiA9IHBSVFRDLT5SVFRDX1JUVlI7DQogICAgfQ0KICAgIHdoaWxlKCB2YWwxICE9IHZhbDIgKTsNCg0KICAgIHJldHVybiggdmFsMSApOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUElUQw0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElUSW5pdCAqLw0KLyoqIFxicmllZiBTeXN0ZW0gdGltZXIgaW5pdCA6IHBlcmlvZCBpbiC1c2Vjb25kLCBzeXN0ZW0gY2xvY2sgZnJlcSBpbiBNSHogKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElUSW5pdCggQVQ5MVBTX1BJVEMgcFBJVEMsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwZXJpb2QsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBwaXRfZnJlcXVlbmN5ICkNCnsNCiAgICBwUElUQy0+UElUQ19QSU1SID0gcGVyaW9kID8gKCBwZXJpb2QgKiBwaXRfZnJlcXVlbmN5ICsgOCApID4+IDQgOiAwOyAvKiArOCB0byBhdm9pZCAlMTAgYW5kIC8xMCAqLw0KICAgIHBQSVRDLT5QSVRDX1BJTVIgfD0gQVQ5MUNfUElUQ19QSVRFTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSVRTZXRQSVYgKi8NCi8qKiBcYnJpZWYgU2V0IHRoZSBQSVQgUGVyaW9kaWMgSW50ZXJ2YWwgVmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElUU2V0UElWKCBBVDkxUFNfUElUQyBwUElUQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGl2ICkNCnsNCiAgICBwUElUQy0+UElUQ19QSU1SID0gcGl2IHwgKCBwUElUQy0+UElUQ19QSU1SICYgKCBBVDkxQ19QSVRDX1BJVEVOIHwgQVQ5MUNfUElUQ19QSVRJRU4gKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJVEVuYWJsZUludCAqLw0KLyoqIFxicmllZiBFbmFibGUgUElUIHBlcmlvZGljIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSVRFbmFibGVJbnQoIEFUOTFQU19QSVRDIHBQSVRDICkNCnsNCiAgICBwUElUQy0+UElUQ19QSU1SIHw9IEFUOTFDX1BJVENfUElUSUVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJVERpc2FibGVJbnQgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBQSVQgcGVyaW9kaWMgaW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVERpc2FibGVJbnQoIEFUOTFQU19QSVRDIHBQSVRDICkNCnsNCiAgICBwUElUQy0+UElUQ19QSU1SICY9IH5BVDkxQ19QSVRDX1BJVElFTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSVRHZXRNb2RlICovDQovKiogXGJyaWVmIFJlYWQgUElUIG1vZGUgcmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSVRHZXRNb2RlKCBBVDkxUFNfUElUQyBwUElUQyApDQp7DQogICAgcmV0dXJuKCBwUElUQy0+UElUQ19QSU1SICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElUR2V0U3RhdHVzICovDQovKiogXGJyaWVmIFJlYWQgUElUIHN0YXR1cyByZWdpc3RlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJVEdldFN0YXR1cyggQVQ5MVBTX1BJVEMgcFBJVEMgKQ0Kew0KICAgIHJldHVybiggcFBJVEMtPlBJVENfUElTUiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BJVEdldFBJSVIgKi8NCi8qKiBcYnJpZWYgUmVhZCBQSVQgQ1BJViBhbmQgUElDTlQgd2l0aG91dCByZXNzZXR0aW5nIHRoZSBjb3VudGVycyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJVEdldFBJSVIoIEFUOTFQU19QSVRDIHBQSVRDICkNCnsNCiAgICByZXR1cm4oIHBQSVRDLT5QSVRDX1BJSVIgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSVRHZXRQSVZSICovDQovKiogXGJyaWVmIFJlYWQgU3lzdGVtIHRpbWVyIENQSVYgYW5kIFBJQ05UIHdpdGhvdXQgcmVzc2V0dGluZyB0aGUgY291bnRlcnMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSVRHZXRQSVZSKCBBVDkxUFNfUElUQyBwUElUQyApDQp7DQogICAgcmV0dXJuKCBwUElUQy0+UElUQ19QSVZSICk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBXRFRDDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9XRFRTZXRNb2RlICovDQovKiogXGJyaWVmIFNldCBXYXRjaGRvZyBNb2RlIFJlZ2lzdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1dEVFNldE1vZGUoIEFUOTFQU19XRFRDIHBXRFRDLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgTW9kZSApDQp7DQogICAgcFdEVEMtPldEVENfV0RNUiA9IE1vZGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfV0RUUmVzdGFydCAqLw0KLyoqIFxicmllZiBSZXN0YXJ0IFdhdGNoZG9nICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1dEVFJlc3RhcnQoIEFUOTFQU19XRFRDIHBXRFRDICkNCnsNCiAgICBwV0RUQy0+V0RUQ19XRENSID0gMHhBNTAwMDAwMTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9XRFRTR2V0dGF0dXMgKi8NCi8qKiBcYnJpZWYgR2V0IFdhdGNoZG9nIFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1dEVFNHZXR0YXR1cyggQVQ5MVBTX1dEVEMgcFdEVEMgKQ0Kew0KICAgIHJldHVybiggcFdEVEMtPldEVENfV0RTUiAmIDB4MyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1dEVEdldFBlcmlvZCAqLw0KLyoqIFxicmllZiBUcmFuc2xhdGUgbXMgaW50byBXYXRjaGRvZyBDb21wYXRpYmxlIHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfV0RUR2V0UGVyaW9kKCB1bnNpZ25lZCBpbnQgbXMgKQ0Kew0KICAgIGlmKCAoIG1zIDwgNCApIHx8ICggbXMgPiAxNjAwMCApICkNCiAgICB7DQogICAgICAgIHJldHVybiAwOw0KICAgIH0NCg0KICAgIHJldHVybiggKCBtcyA8PCA4ICkgLyAxMDAwICk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBWUkVHDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9WUkVHX0VuYWJsZV9Mb3dQb3dlck1vZGUgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFZSRUcgTG93IFBvd2VyIE1vZGUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVlJFR19FbmFibGVfTG93UG93ZXJNb2RlKCBBVDkxUFNfVlJFRyBwVlJFRyApDQp7DQogICAgcFZSRUctPlZSRUdfTVIgfD0gQVQ5MUNfVlJFR19QU1REQlk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVlJFR19EaXNhYmxlX0xvd1Bvd2VyTW9kZSAqLw0KLyoqIFxicmllZiBEaXNhYmxlIFZSRUcgTG93IFBvd2VyIE1vZGUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVlJFR19EaXNhYmxlX0xvd1Bvd2VyTW9kZSggQVQ5MVBTX1ZSRUcgcFZSRUcgKQ0Kew0KICAgIHBWUkVHLT5WUkVHX01SICY9IH5BVDkxQ19WUkVHX1BTVERCWTsNCn0gLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBNQw0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KDQojZGVmaW5lIEFUOTFDX01DX0NPUlJFQ1RfS0VZICAgICggKCB1bnNpZ25lZCBpbnQgKSAweDVBIDw8IDI0ICkgLyogKE1DKSBDb3JyZWN0IFByb3RlY3QgS2V5ICovDQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfTUNfUmVtYXAgKi8NCi8qKiBcYnJpZWYgTWFrZSBSZW1hcCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9NQ19SZW1hcCggdm9pZCApIC8qICovDQp7DQogICAgQVQ5MVBTX01DIHBNQyA9ICggQVQ5MVBTX01DICkgQVQ5MUNfQkFTRV9NQzsNCg0KICAgIHBNQy0+TUNfUkNSID0gQVQ5MUNfTUNfUkNCOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX01DX0VGQ19DZmdNb2RlUmVnICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSB0aGUgRUZDIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIE1DIGNvbnRyb2xsZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfTUNfRUZDX0NmZ01vZGVSZWcoIEFUOTFQU19NQyBwTUMsICAgICAgLyogcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlICkgLyogbW9kZSByZWdpc3RlciAqLw0Kew0KICAgIC8qIFdyaXRlIHRvIHRoZSBGTVIgcmVnaXN0ZXIgKi8NCiAgICBwTUMtPk1DX0ZNUiA9IG1vZGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfTUNfRUZDX0dldE1vZGVSZWcgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIE1DIEVGQyBNb2RlIFJlZ3NpdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfTUNfRUZDX0dldE1vZGVSZWcoIEFUOTFQU19NQyBwTUMgKSAvKiBwb2ludGVyIHRvIGEgTUMgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwTUMtPk1DX0ZNUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9NQ19FRkNfQ29tcHV0ZUZNQ04gKi8NCi8qKiBcYnJpZWYgUmV0dXJuIE1DIEVGQyBNb2RlIFJlZ3NpdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfTUNfRUZDX0NvbXB1dGVGTUNOKCBpbnQgbWFzdGVyX2Nsb2NrICkgLyogbWFzdGVyIGNsb2NrIGluIEh6ICovDQp7DQogICAgcmV0dXJuKCBtYXN0ZXJfY2xvY2sgLyAxMDAwMDAwICsgMiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX01DX0VGQ19QZXJmb3JtQ21kICovDQovKiogXGJyaWVmIFBlcmZvcm0gRUZDIENvbW1hbmQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfTUNfRUZDX1BlcmZvcm1DbWQoIEFUOTFQU19NQyBwTUMsIC8qIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdHJhbnNmZXJfY21kICkNCnsNCiAgICBwTUMtPk1DX0ZDUiA9IHRyYW5zZmVyX2NtZDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9NQ19FRkNfR2V0U3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBNQyBFRkMgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfTUNfRUZDX0dldFN0YXR1cyggQVQ5MVBTX01DIHBNQyApIC8qIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBNQy0+TUNfRlNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX01DX0VGQ19Jc0ludGVycnVwdE1hc2tlZCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIEVGQyBNQyBJbnRlcnJ1cHQgaXMgTWFza2VkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfTUNfRUZDX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfTUMgcE1DLCAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9NQ19FRkNfR2V0TW9kZVJlZyggcE1DICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfTUNfRUZDX0lzSW50ZXJydXB0U2V0ICovDQovKiogXGJyaWVmIFRlc3QgaWYgRUZDIE1DIEludGVycnVwdCBpcyBTZXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfSXNJbnRlcnJ1cHRTZXQoIEFUOTFQU19NQyBwTUMsICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX01DX0VGQ19HZXRTdGF0dXMoIHBNQyApICYgZmxhZyApOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgU1BJDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUElfT3BlbiAqLw0KLyoqIFxicmllZiBPcGVuIGEgU1BJIFBvcnQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TUElfT3BlbiggY29uc3QgdW5zaWduZWQgaW50IG51bGwgKSAvKiBcYXJnICovDQp7DQogICAgLyogTk9UIERFRklORUQgQVQgVEhJUyBNT01FTlQgKi8NCiAgICByZXR1cm4oIDAgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUElfQ2ZnQ3MgKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFNQSSBjaGlwIHNlbGVjdCByZWdpc3RlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2ZnQ3MoIEFUOTFQU19TUEkgcFNQSSwgLyogcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNzLCAgICAgICAgICAvKiBTUEkgY3MgbnVtYmVyICgwIHRvIDMpICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbCApICAgICAgICAvKiAgY2hpcCBzZWxlY3QgcmVnaXN0ZXIgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIENTUiByZWdpc3RlciAqLw0KICAgICooIHBTUEktPlNQSV9DU1IgKyBjcyApID0gdmFsOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9FbmFibGVJdCAqLw0KLyoqIFxicmllZiBFbmFibGUgU1BJIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfRW5hYmxlSXQoIEFUOTFQU19TUEkgcFNQSSwgICAgLyogcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBJVCB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwU1BJLT5TUElfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUElfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgU1BJIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfRGlzYWJsZUl0KCBBVDkxUFNfU1BJIHBTUEksICAgIC8qIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIElUIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIgKi8NCiAgICBwU1BJLT5TUElfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUElfUmVzZXQgKi8NCi8qKiBcYnJpZWYgUmVzZXQgdGhlIFNQSSBjb250cm9sbGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9SZXNldCggQVQ5MVBTX1NQSSBwU1BJIC8qIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIENSIHJlZ2lzdGVyICovDQogICAgcFNQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NXUlNUOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9FbmFibGUgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIHRoZSBTUEkgY29udHJvbGxlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfRW5hYmxlKCBBVDkxUFNfU1BJIHBTUEkgLyogcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIENSIHJlZ2lzdGVyICovDQogICAgcFNQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NQSUVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9EaXNhYmxlICovDQovKiogXGJyaWVmIERpc2FibGUgdGhlIFNQSSBjb250cm9sbGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9EaXNhYmxlKCBBVDkxUFNfU1BJIHBTUEkgLyogcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBDUiByZWdpc3RlciAqLw0KICAgIHBTUEktPlNQSV9DUiA9IEFUOTFDX1NQSV9TUElESVM7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1BJX0NmZ01vZGUgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIHRoZSBTUEkgY29udHJvbGxlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2ZnTW9kZSggQVQ5MVBTX1NQSSBwU1BJLCAvKiBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtb2RlICkgICAgICAgLyogbW9kZSByZWdpc3RlciAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXIgKi8NCiAgICBwU1BJLT5TUElfTVIgPSBtb2RlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9DZmdQQ1MgKi8NCi8qKiBcYnJpZWYgU3dpdGNoIHRvIHRoZSBjb3JyZWN0IFBDUyBvZiBTUEkgTW9kZSBSZWdpc3RlciA6IEZpeGVkIFBlcmlwaGVyYWwgU2VsZWN0ZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX0NmZ1BDUyggQVQ5MVBTX1NQSSBwU1BJLCAgLyogcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgUENTX0RldmljZSApIC8qIFBDUyBvZiB0aGUgRGV2aWNlICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBNUiByZWdpc3RlciAqLw0KICAgIHBTUEktPlNQSV9NUiAmPSAweEZGRjBGRkZGOw0KICAgIHBTUEktPlNQSV9NUiB8PSAoICggUENTX0RldmljZSA8PCAxNiApICYgQVQ5MUNfU1BJX1BDUyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9SZWNlaXZlRnJhbWUgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6YWVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TUElfUmVjZWl2ZUZyYW1lKCBBVDkxUFNfU1BJIHBTUEksDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwTmV4dEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCiAgICByZXR1cm4gQVQ5MUZfUERDX1JlY2VpdmVGcmFtZSgNCiAgICAgICAgKCBBVDkxUFNfUERDICkgJiggcFNQSS0+U1BJX1JQUiApLA0KICAgICAgICBwQnVmZmVyLA0KICAgICAgICBzekJ1ZmZlciwNCiAgICAgICAgcE5leHRCdWZmZXIsDQogICAgICAgIHN6TmV4dEJ1ZmZlciApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSV9TZW5kRnJhbWUgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6YWVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJTUEl5ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1BJX1NlbmRGcmFtZSggQVQ5MVBTX1NQSSBwU1BJLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwQnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzekJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcE5leHRCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6TmV4dEJ1ZmZlciApDQp7DQogICAgcmV0dXJuIEFUOTFGX1BEQ19TZW5kRnJhbWUoDQogICAgICAgICggQVQ5MVBTX1BEQyApICYoIHBTUEktPlNQSV9SUFIgKSwNCiAgICAgICAgcEJ1ZmZlciwNCiAgICAgICAgc3pCdWZmZXIsDQogICAgICAgIHBOZXh0QnVmZmVyLA0KICAgICAgICBzek5leHRCdWZmZXIgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUElfQ2xvc2UgKi8NCi8qKiBcYnJpZWYgQ2xvc2UgU1BJOiBkaXNhYmxlIElUIGRpc2FibGUgdHJhbnNmZXJ0LCBjbG9zZSBQREMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX0Nsb3NlKCBBVDkxUFNfU1BJIHBTUEkgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlciAqLw0Kew0KICAgIC8qKiBSZXNldCBhbGwgdGhlIENoaXAgU2VsZWN0IHJlZ2lzdGVyICovDQogICAgcFNQSS0+U1BJX0NTUlsgMCBdID0gMDsNCiAgICBwU1BJLT5TUElfQ1NSWyAxIF0gPSAwOw0KICAgIHBTUEktPlNQSV9DU1JbIDIgXSA9IDA7DQogICAgcFNQSS0+U1BJX0NTUlsgMyBdID0gMDsNCg0KICAgIC8qKiBSZXNldCB0aGUgU1BJIG1vZGUgKi8NCiAgICBwU1BJLT5TUElfTVIgPSAwOw0KDQogICAgLyoqIERpc2FibGUgYWxsIGludGVycnVwdHMgKi8NCiAgICBwU1BJLT5TUElfSURSID0gMHhGRkZGRkZGRjsNCg0KICAgIC8qKiBBYm9ydCB0aGUgUGVyaXBoZXJhbCBEYXRhIFRyYW5zZmVycyAqLw0KICAgIEFUOTFGX1BEQ19DbG9zZSggKCBBVDkxUFNfUERDICkgJiggcFNQSS0+U1BJX1JQUiApICk7DQoNCiAgICAvKiogRGlzYWJsZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIgYW5kIHN0b3AgYW55IGFjdGl2aXR5IGltbWVkaWF0ZWx5ICovDQogICAgcFNQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NQSURJUzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUElfUHV0Q2hhciAqLw0KLyoqIFxicmllZiBTZW5kIGEgY2hhcmFjdGVyLGRvZXMgbm90IGNoZWNrIGlmIHJlYWR5IHRvIHNlbmQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX1B1dENoYXIoIEFUOTFQU19TUEkgcFNQSSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFyYWN0ZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY3NfbnVtYmVyICkNCnsNCiAgICB1bnNpZ25lZCBpbnQgdmFsdWVfZm9yX2NzOw0KDQogICAgdmFsdWVfZm9yX2NzID0gKCB+KCAxIDw8IGNzX251bWJlciApICkgJiAweEY7IC8qUGxhY2UgYSB6ZXJvIGFtb25nIGEgNCBPTkVzIG51bWJlciAqLw0KICAgIHBTUEktPlNQSV9URFIgPSAoIGNoYXJhY3RlciAmIDB4RkZGRiApIHwgKCB2YWx1ZV9mb3JfY3MgPDwgMTYgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUElfR2V0Q2hhciAqLw0KLyoqIFxicmllZiBSZWNlaXZlIGEgY2hhcmFjdGVyLGRvZXMgbm90IGNoZWNrIGlmIGEgY2hhcmFjdGVyIGlzIGF2YWlsYWJsZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1NQSV9HZXRDaGFyKCBjb25zdCBBVDkxUFNfU1BJIHBTUEkgKQ0Kew0KICAgIHJldHVybiggKCBwU1BJLT5TUElfUkRSICkgJiAweEZGRkYgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUElfR2V0SW50ZXJydXB0TWFza1N0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gU1BJIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NQSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvKiBccmV0dXJuIFNQSSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCiAgICBBVDkxUFNfU1BJIHBTcGkgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBTcGktPlNQSV9JTVI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1BJX0lzSW50ZXJydXB0TWFza2VkICovDQovKiogXGJyaWVmIFRlc3QgaWYgU1BJIEludGVycnVwdCBpcyBNYXNrZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIGludCBBVDkxRl9TUElfSXNJbnRlcnJ1cHRNYXNrZWQoIEFUOTFQU19TUEkgcFNwaSwgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9TUElfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggcFNwaSApICYgZmxhZyApOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgVVNBUlQNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX0JhdWRyYXRlICovDQovKiogXGJyaWVmIENhbGN1bGF0ZSB0aGUgYmF1ZHJhdGUgKi8NCi8qKiBTdGFuZGFyZCBBc3luY2hyb25vdXMgTW9kZSA6IDggYml0cyAsIDEgc3RvcCAsIG5vIHBhcml0eSAqLw0KI2RlZmluZSBBVDkxQ19VU19BU1lOQ19NT0RFICAgIFwNCiAgICAoIEFUOTFDX1VTX1VTTU9ERV9OT1JNQUwgKyBcDQogICAgICBBVDkxQ19VU19OQlNUT1BfMV9CSVQgKyAgXA0KICAgICAgQVQ5MUNfVVNfUEFSX05PTkUgKyAgICAgIFwNCiAgICAgIEFUOTFDX1VTX0NIUkxfOF9CSVRTICsgICBcDQogICAgICBBVDkxQ19VU19DTEtTX0NMT0NLICkNCg0KLyoqIFN0YW5kYXJkIEV4dGVybmFsIEFzeW5jaHJvbm91cyBNb2RlIDogOCBiaXRzICwgMSBzdG9wICwgbm8gcGFyaXR5ICovDQojZGVmaW5lIEFUOTFDX1VTX0FTWU5DX1NDS19NT0RFIFwNCiAgICAoIEFUOTFDX1VTX1VTTU9ERV9OT1JNQUwgKyAgXA0KICAgICAgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgICBcDQogICAgICBBVDkxQ19VU19QQVJfTk9ORSArICAgICAgIFwNCiAgICAgIEFUOTFDX1VTX0NIUkxfOF9CSVRTICsgICAgXA0KICAgICAgQVQ5MUNfVVNfQ0xLU19FWFQgKQ0KDQovKiogU3RhbmRhcmQgU3luY2hyb25vdXMgTW9kZSA6IDggYml0cyAsIDEgc3RvcCAsIG5vIHBhcml0eSAqLw0KI2RlZmluZSBBVDkxQ19VU19TWU5DX01PREUgICAgIFwNCiAgICAoIEFUOTFDX1VTX1NZTkMgKyAgICAgICAgICBcDQogICAgICBBVDkxQ19VU19VU01PREVfTk9STUFMICsgXA0KICAgICAgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgIFwNCiAgICAgIEFUOTFDX1VTX1BBUl9OT05FICsgICAgICBcDQogICAgICBBVDkxQ19VU19DSFJMXzhfQklUUyArICAgXA0KICAgICAgQVQ5MUNfVVNfQ0xLU19DTE9DSyApDQoNCi8qKiBTQ0sgdXNlZCBMYWJlbCAqLw0KI2RlZmluZSBBVDkxQ19VU19TQ0tfVVNFRCAgICAoIEFUOTFDX1VTX0NLTE8gfCBBVDkxQ19VU19DTEtTX0VYVCApDQoNCi8qKiBTdGFuZGFyZCBJU08gVD0wIE1vZGUgOiA4IGJpdHMgLCAxIHN0b3AgLCBwYXJpdHkgKi8NCiNkZWZpbmUgQVQ5MUNfVVNfSVNPX1JFQURFUl9NT0RFICBcDQogICAgKCBBVDkxQ19VU19VU01PREVfSVNPNzgxNl8wICsgXA0KICAgICAgQVQ5MUNfVVNfQ0xLU19DTE9DSyArICAgICAgIFwNCiAgICAgIEFUOTFDX1VTX05CU1RPUF8xX0JJVCArICAgICBcDQogICAgICBBVDkxQ19VU19QQVJfRVZFTiArICAgICAgICAgXA0KICAgICAgQVQ5MUNfVVNfQ0hSTF84X0JJVFMgKyAgICAgIFwNCiAgICAgIEFUOTFDX1VTX0NLTE8gKyAgICAgICAgICAgICBcDQogICAgICBBVDkxQ19VU19PVkVSICkNCg0KLyoqIFN0YW5kYXJkIElSREEgbW9kZSAqLw0KI2RlZmluZSBBVDkxQ19VU19BU1lOQ19JUkRBX01PREUgXA0KICAgICggQVQ5MUNfVVNfVVNNT0RFX0lSREEgKyAgICAgXA0KICAgICAgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgICAgXA0KICAgICAgQVQ5MUNfVVNfUEFSX05PTkUgKyAgICAgICAgXA0KICAgICAgQVQ5MUNfVVNfQ0hSTF84X0JJVFMgKyAgICAgXA0KICAgICAgQVQ5MUNfVVNfQ0xLU19DTE9DSyApDQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfQmF1ZHJhdGUgKi8NCi8qKiBcYnJpZWYgQ2FsdWN1bGF0ZSBiYXVkX3ZhbHVlIGFjY29yZGluZyB0byB0aGUgbWFpbiBjbG9jayBhbmQgdGhlIGJhdWQgcmF0ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX0JhdWRyYXRlKCBjb25zdCB1bnNpZ25lZCBpbnQgbWFpbl9jbG9jaywgLyogXGFyZyBwZXJpcGhlcmFsIGNsb2NrICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBiYXVkX3JhdGUgKSAvKiBcYXJnIFVBUlQgYmF1ZHJhdGUgKi8NCnsNCiAgICB1bnNpZ25lZCBpbnQgYmF1ZF92YWx1ZSA9ICggKCBtYWluX2Nsb2NrICogMTAgKSAvICggYmF1ZF9yYXRlICogMTYgKSApOw0KDQogICAgaWYoICggYmF1ZF92YWx1ZSAlIDEwICkgPj0gNSApDQogICAgew0KICAgICAgICBiYXVkX3ZhbHVlID0gKCBiYXVkX3ZhbHVlIC8gMTAgKSArIDE7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICAgIGJhdWRfdmFsdWUgLz0gMTA7DQogICAgfQ0KDQogICAgcmV0dXJuIGJhdWRfdmFsdWU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfU2V0QmF1ZHJhdGUgKi8NCi8qKiBcYnJpZWYgU2V0IHRoZSBiYXVkcmF0ZSBhY2NvcmRpbmcgdG8gdGhlIENQVSBjbG9jayAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19TZXRCYXVkcmF0ZSggQVQ5MVBTX1VTQVJUIHBVU0FSVCwgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1haW5DbG9jaywgLyogXGFyZyBwZXJpcGhlcmFsIGNsb2NrICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3BlZWQgKSAgICAvKiBcYXJnIFVBUlQgYmF1ZHJhdGUgKi8NCnsNCiAgICAvKiogRGVmaW5lIHRoZSBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3RlciAqLw0KICAgIHBVU0FSVC0+VVNfQlJHUiA9IEFUOTFGX1VTX0JhdWRyYXRlKCBtYWluQ2xvY2ssIHNwZWVkICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfU2V0VGltZWd1YXJkICovDQovKiogXGJyaWVmIFNldCBVU0FSVCB0aW1lZ3VhcmQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfU2V0VGltZWd1YXJkKCBBVDkxUFNfVVNBUlQgcFVTQVJULCAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0aW1lZ3VhcmQgKSAvKiBcYXJnIHRpbWVndWFyZCB2YWx1ZSAqLw0Kew0KICAgIC8qKiBXcml0ZSB0aGUgVGltZWd1YXJkIFJlZ2lzdGVyICovDQogICAgcFVTQVJULT5VU19UVEdSID0gdGltZWd1YXJkOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX0VuYWJsZUl0ICovDQovKiogXGJyaWVmIEVuYWJsZSBVU0FSVCBJVCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19FbmFibGVJdCggQVQ5MVBTX1VTQVJUIHBVU0FSVCwgLyogXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAgLyogXGFyZyBJVCB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwVVNBUlQtPlVTX0lFUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgVVNBUlQgSVQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRGlzYWJsZUl0KCBBVDkxUFNfVVNBUlQgcFVTQVJULCAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAgLyogXGFyZyBJVCB0byBiZSBkaXNhYmxlZCAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyICovDQogICAgcFVTQVJULT5VU19JRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX0NvbmZpZ3VyZSAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgVVNBUlQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfQ29uZmlndXJlKCBBVDkxUFNfVVNBUlQgcFVTQVJULCAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYWluQ2xvY2ssICAvKiBcYXJnIHBlcmlwaGVyYWwgY2xvY2sgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSwgICAgICAgLyogXGFyZyBtb2RlIFJlZ2lzdGVyIHRvIGJlIHByb2dyYW1tZWQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgYmF1ZFJhdGUsICAgLyogXGFyZyBiYXVkcmF0ZSB0byBiZSBwcm9ncmFtbWVkICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHRpbWVndWFyZCApIC8qIFxhcmcgdGltZWd1YXJkIHRvIGJlIHByb2dyYW1tZWQgKi8NCnsNCiAgICAvKiogRGlzYWJsZSBpbnRlcnJ1cHRzICovDQogICAgcFVTQVJULT5VU19JRFIgPSAoIHVuc2lnbmVkIGludCApIC0xOw0KDQogICAgLyoqIFJlc2V0IHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciAqLw0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SU1RSWCB8IEFUOTFDX1VTX1JTVFRYIHwgQVQ5MUNfVVNfUlhESVMgfCBBVDkxQ19VU19UWERJUzsNCg0KICAgIC8qKiBEZWZpbmUgdGhlIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVyICovDQogICAgQVQ5MUZfVVNfU2V0QmF1ZHJhdGUoIHBVU0FSVCwgbWFpbkNsb2NrLCBiYXVkUmF0ZSApOw0KDQogICAgLyoqIFdyaXRlIHRoZSBUaW1lZ3VhcmQgUmVnaXN0ZXIgKi8NCiAgICBBVDkxRl9VU19TZXRUaW1lZ3VhcmQoIHBVU0FSVCwgdGltZWd1YXJkICk7DQoNCiAgICAvKiogQ2xlYXIgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQ291bnRlcnMgKi8NCiAgICBBVDkxRl9QRENfT3BlbiggKCBBVDkxUFNfUERDICkgJiggcFVTQVJULT5VU19SUFIgKSApOw0KDQogICAgLyoqIERlZmluZSB0aGUgVVNBUlQgbW9kZSAqLw0KICAgIHBVU0FSVC0+VVNfTVIgPSBtb2RlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX0VuYWJsZVJ4ICovDQovKiogXGJyaWVmIEVuYWJsZSByZWNlaXZpbmcgY2hhcmFjdGVycyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19FbmFibGVSeCggQVQ5MVBTX1VTQVJUIHBVU0FSVCApIC8qIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIgKi8NCnsNCiAgICAvKiogRW5hYmxlIHJlY2VpdmVyICovDQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1JYRU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfRW5hYmxlVHggKi8NCi8qKiBcYnJpZWYgRW5hYmxlIHNlbmRpbmcgY2hhcmFjdGVycyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19FbmFibGVUeCggQVQ5MVBTX1VTQVJUIHBVU0FSVCApIC8qIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIgKi8NCnsNCiAgICAvKiogRW5hYmxlICB0cmFuc21pdHRlciAqLw0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19UWEVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX1Jlc2V0UnggKi8NCi8qKiBcYnJpZWYgUmVzZXQgUmVjZWl2ZXIgYW5kIHJlLWVuYWJsZSBpdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19SZXNldFJ4KCBBVDkxUFNfVVNBUlQgcFVTQVJUICkgLyogXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlciAqLw0Kew0KICAgIC8qKiBSZXNldCByZWNlaXZlciAqLw0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SU1RSWDsNCiAgICAvKiogUmUtRW5hYmxlIHJlY2VpdmVyICovDQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1JYRU47DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfUmVzZXRUeCAqLw0KLyoqIFxicmllZiBSZXNldCBUcmFuc21pdHRlciBhbmQgcmUtZW5hYmxlIGl0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX1Jlc2V0VHgoIEFUOTFQU19VU0FSVCBwVVNBUlQgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQp7DQogICAgLyoqIFJlc2V0IHRyYW5zbWl0dGVyICovDQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1JTVFRYOw0KICAgIC8qKiBFbmFibGUgdHJhbnNtaXR0ZXIgKi8NCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfVFhFTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19EaXNhYmxlUnggKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBSZWNlaXZlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19EaXNhYmxlUngoIEFUOTFQU19VU0FSVCBwVVNBUlQgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQp7DQogICAgLyoqIERpc2FibGUgcmVjZWl2ZXIgKi8NCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlhESVM7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfRGlzYWJsZVR4ICovDQovKiogXGJyaWVmIERpc2FibGUgVHJhbnNtaXR0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRGlzYWJsZVR4KCBBVDkxUFNfVVNBUlQgcFVTQVJUICkgLyogXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlciAqLw0Kew0KICAgIC8qKiBEaXNhYmxlIHRyYW5zbWl0dGVyICovDQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1RYRElTOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX0Nsb3NlICovDQovKiogXGJyaWVmIENsb3NlIFVTQVJUOiBkaXNhYmxlIElUIGRpc2FibGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyLCBjbG9zZSBQREMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfQ2xvc2UoIEFUOTFQU19VU0FSVCBwVVNBUlQgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQp7DQogICAgLyoqIFJlc2V0IHRoZSBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3RlciAqLw0KICAgIHBVU0FSVC0+VVNfQlJHUiA9IDA7DQoNCiAgICAvKiogUmVzZXQgdGhlIFVTQVJUIG1vZGUgKi8NCiAgICBwVVNBUlQtPlVTX01SID0gMDsNCg0KICAgIC8qKiBSZXNldCB0aGUgVGltZWd1YXJkIFJlZ2lzdGVyICovDQogICAgcFVTQVJULT5VU19UVEdSID0gMDsNCg0KICAgIC8qKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzICovDQogICAgcFVTQVJULT5VU19JRFIgPSAweEZGRkZGRkZGOw0KDQogICAgLyoqIEFib3J0IHRoZSBQZXJpcGhlcmFsIERhdGEgVHJhbnNmZXJzICovDQogICAgQVQ5MUZfUERDX0Nsb3NlKCAoIEFUOTFQU19QREMgKSAmKCBwVVNBUlQtPlVTX1JQUiApICk7DQoNCiAgICAvKiogRGlzYWJsZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIgYW5kIHN0b3AgYW55IGFjdGl2aXR5IGltbWVkaWF0ZWx5ICovDQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1RYRElTIHwgQVQ5MUNfVVNfUlhESVMgfCBBVDkxQ19VU19SU1RUWCB8IEFUOTFDX1VTX1JTVFJYOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX1R4UmVhZHkgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIDEgaWYgYSBjaGFyYWN0ZXIgY2FuIGJlIHdyaXR0ZW4gaW4gVVNfVEhSICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfVHhSZWFkeSggQVQ5MVBTX1VTQVJUIHBVU0FSVCApIC8qIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4oIHBVU0FSVC0+VVNfQ1NSICYgQVQ5MUNfVVNfVFhSRFkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19SeFJlYWR5ICovDQovKiogXGJyaWVmIFJldHVybiAxIGlmIGEgY2hhcmFjdGVyIGNhbiBiZSByZWFkIGluIFVTX1JIUiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX1J4UmVhZHkoIEFUOTFQU19VU0FSVCBwVVNBUlQgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuKCBwVVNBUlQtPlVTX0NTUiAmIEFUOTFDX1VTX1JYUkRZICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfRXJyb3IgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBlcnJvciBmbGFnICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfRXJyb3IoIEFUOTFQU19VU0FSVCBwVVNBUlQgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuKCBwVVNBUlQtPlVTX0NTUiAmDQogICAgICAgICAgICAoIEFUOTFDX1VTX09WUkUgfCAgICAvKiBPdmVycnVuIGVycm9yICovDQogICAgICAgICAgICAgIEFUOTFDX1VTX0ZSQU1FIHwgICAvKiBGcmFtaW5nIGVycm9yICovDQogICAgICAgICAgICAgIEFUOTFDX1VTX1BBUkUgKSApOyAvKiBQYXJpdHkgZXJyb3IgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19QdXRDaGFyICovDQovKiogXGJyaWVmIFNlbmQgYSBjaGFyYWN0ZXIsZG9lcyBub3QgY2hlY2sgaWYgcmVhZHkgdG8gc2VuZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19QdXRDaGFyKCBBVDkxUFNfVVNBUlQgcFVTQVJULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2hhcmFjdGVyICkNCnsNCiAgICBwVVNBUlQtPlVTX1RIUiA9ICggY2hhcmFjdGVyICYgMHgxRkYgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19HZXRDaGFyICovDQovKiogXGJyaWVmIFJlY2VpdmUgYSBjaGFyYWN0ZXIsZG9lcyBub3QgY2hlY2sgaWYgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfVVNfR2V0Q2hhciggY29uc3QgQVQ5MVBTX1VTQVJUIHBVU0FSVCApDQp7DQogICAgcmV0dXJuKCAoIHBVU0FSVC0+VVNfUkhSICkgJiAweDFGRiApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTX1NlbmRGcmFtZSAqLw0KLyoqIFxicmllZiBSZXR1cm4gMiBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBCdWZmZXIgYW5kIE5leHQgQnVmZmVyLCAxIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXphZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYnVzeSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX1NlbmRGcmFtZSggQVQ5MVBTX1VTQVJUIHBVU0FSVCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwQnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBOZXh0QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6TmV4dEJ1ZmZlciApDQp7DQogICAgcmV0dXJuIEFUOTFGX1BEQ19TZW5kRnJhbWUoDQogICAgICAgICggQVQ5MVBTX1BEQyApICYoIHBVU0FSVC0+VVNfUlBSICksDQogICAgICAgIHBCdWZmZXIsDQogICAgICAgIHN6QnVmZmVyLA0KICAgICAgICBwTmV4dEJ1ZmZlciwNCiAgICAgICAgc3pOZXh0QnVmZmVyICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVNfUmVjZWl2ZUZyYW1lICovDQovKiogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemFlZCB3aXRoIE5leHQgQnVmZmVyLCAwIGlmIFBEQyBpcyBidXN5ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfUmVjZWl2ZUZyYW1lKCBBVDkxUFNfVVNBUlQgcFVTQVJULA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcE5leHRCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCiAgICByZXR1cm4gQVQ5MUZfUERDX1JlY2VpdmVGcmFtZSgNCiAgICAgICAgKCBBVDkxUFNfUERDICkgJiggcFVTQVJULT5VU19SUFIgKSwNCiAgICAgICAgcEJ1ZmZlciwNCiAgICAgICAgc3pCdWZmZXIsDQogICAgICAgIHBOZXh0QnVmZmVyLA0KICAgICAgICBzek5leHRCdWZmZXIgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VU19TZXRJcmRhRmlsdGVyICovDQovKiogXGJyaWVmIFNldCB0aGUgdmFsdWUgb2YgSXJEYSBmaWx0ZXIgdHJlZ2lzdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX1NldElyZGFGaWx0ZXIoIEFUOTFQU19VU0FSVCBwVVNBUlQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdmFsdWUgKQ0Kew0KICAgIHBVU0FSVC0+VVNfSUYgPSB2YWx1ZTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFNTQw0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8qKiBEZWZpbmUgdGhlIHN0YW5kYXJkIEkyUyBtb2RlIGNvbmZpZ3VyYXRpb24gKi8NCg0KLyoqIENvbmZpZ3VyYXRpb24gdG8gc2V0IGluIHRoZSBTU0MgVHJhbnNtaXQgQ2xvY2sgTW9kZSBSZWdpc3RlciAqLw0KLyoqIFBhcmFtZXRlcnMgOiAgbmJfYml0X2J5X3Nsb3QgOiA4LCAxNiBvciAzMiBiaXRzICovDQovKiogICAgICAgICAgICAgICBuYl9zbG90X2J5X2ZyYW1lIDogbnVtYmVyIG9mIGNoYW5uZWxzICovDQojZGVmaW5lIEFUOTFDX0kyU19BU1lfTUFTVEVSX1RYX1NFVFRJTkcoIG5iX2JpdF9ieV9zbG90LCBuYl9zbG90X2J5X2ZyYW1lICkgXA0KICAgICggKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCiAgICAgIEFUOTFDX1NTQ19DS1NfRElWICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQogICAgICBBVDkxQ19TU0NfQ0tPX0NPTlRJTk9VUyArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICAgQVQ5MUNfU1NDX0NLR19OT05FICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCiAgICAgIEFUOTFDX1NTQ19TVEFSVF9GQUxMX1JGICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcDQogICAgICBBVDkxQ19TU0NfU1RUT1VUICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICAgKCAoIDEgPDwgMTYgKSAmIEFUOTFDX1NTQ19TVFRETFkgKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCiAgICAgICggKCAoICggbmJfYml0X2J5X3Nsb3QgKiBuYl9zbG90X2J5X2ZyYW1lICkgLyAyICkgLSAxICkgPDwgMjQgKSApDQoNCg0KLyoqIENvbmZpZ3VyYXRpb24gdG8gc2V0IGluIHRoZSBTU0MgVHJhbnNtaXQgRnJhbWUgTW9kZSBSZWdpc3RlciAqLw0KLyoqIFBhcmFtZXRlcnMgOiBuYl9iaXRfYnlfc2xvdCA6IDgsIDE2IG9yIDMyIGJpdHMgKi8NCi8qKiAgICAgICAgICAgICAgbmJfc2xvdF9ieV9mcmFtZSA6IG51bWJlciBvZiBjaGFubmVscyAqLw0KI2RlZmluZSBBVDkxQ19JMlNfQVNZX1RYX0ZSQU1FX1NFVFRJTkcoIG5iX2JpdF9ieV9zbG90LCBuYl9zbG90X2J5X2ZyYW1lICkgXA0KICAgICggKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICAgKCBuYl9iaXRfYnlfc2xvdCAtIDEgKSArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICAgQVQ5MUNfU1NDX01TQkYgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXA0KICAgICAgKCAoICggbmJfc2xvdF9ieV9mcmFtZSAtIDEgKSA8PCA4ICkgJiBBVDkxQ19TU0NfREFUTkIgKSArICAgICAgICAgICAgXA0KICAgICAgKCAoICggbmJfYml0X2J5X3Nsb3QgLSAxICkgPDwgMTYgKSAmIEFUOTFDX1NTQ19GU0xFTiApICsgICAgICAgICAgICAgXA0KICAgICAgQVQ5MUNfU1NDX0ZTT1NfTkVHQVRJVkUgKQ0KDQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1NDX1NldEJhdWRyYXRlICovDQovKiogXGJyaWVmIFNldCB0aGUgYmF1ZHJhdGUgYWNjb3JkaW5nIHRvIHRoZSBDUFUgY2xvY2sgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX1NldEJhdWRyYXRlKCBBVDkxUFNfU1NDIHBTU0MsICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYWluQ2xvY2ssIC8qIFxhcmcgcGVyaXBoZXJhbCBjbG9jayAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzcGVlZCApICAgIC8qIFxhcmcgU1NDIGJhdWRyYXRlICovDQp7DQogICAgdW5zaWduZWQgaW50IGJhdWRfdmFsdWU7DQoNCiAgICAvKiogRGVmaW5lIHRoZSBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3RlciAqLw0KICAgIGlmKCBzcGVlZCA9PSAwICkNCiAgICB7DQogICAgICAgIGJhdWRfdmFsdWUgPSAwOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgICBiYXVkX3ZhbHVlID0gKCB1bnNpZ25lZCBpbnQgKSAoIG1haW5DbG9jayAqIDEwICkgLyAoIDIgKiBzcGVlZCApOw0KDQogICAgICAgIGlmKCAoIGJhdWRfdmFsdWUgJSAxMCApID49IDUgKQ0KICAgICAgICB7DQogICAgICAgICAgICBiYXVkX3ZhbHVlID0gKCBiYXVkX3ZhbHVlIC8gMTAgKSArIDE7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgICBiYXVkX3ZhbHVlIC89IDEwOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcFNTQy0+U1NDX0NNUiA9IGJhdWRfdmFsdWU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1NDX0NvbmZpZ3VyZSAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgU1NDICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19Db25maWd1cmUoIEFUOTFQU19TU0MgcFNTQywgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3lzdF9jbG9jaywgLyogXGFyZyBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5ICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYXVkX3JhdGUsICAvKiBcYXJnIEV4cGVjdGVkIEJhdWQgUmF0ZSBGcmVxdWVuY3kgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNsb2NrX3J4LCAgIC8qIFxhcmcgUmVjZWl2ZXIgQ2xvY2sgUGFyYW1ldGVycyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZV9yeCwgICAgLyogXGFyZyBtb2RlIFJlZ2lzdGVyIHRvIGJlIHByb2dyYW1tZWQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNsb2NrX3R4LCAgIC8qIFxhcmcgVHJhbnNtaXR0ZXIgQ2xvY2sgUGFyYW1ldGVycyAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZV90eCApICAgLyogXGFyZyBtb2RlIFJlZ2lzdGVyIHRvIGJlIHByb2dyYW1tZWQgKi8NCnsNCiAgICAvKiogRGlzYWJsZSBpbnRlcnJ1cHRzICovDQogICAgcFNTQy0+U1NDX0lEUiA9ICggdW5zaWduZWQgaW50ICkgLTE7DQoNCiAgICAvKiogUmVzZXQgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyICovDQogICAgcFNTQy0+U1NDX0NSID0gQVQ5MUNfU1NDX1NXUlNUIHwgQVQ5MUNfU1NDX1JYRElTIHwgQVQ5MUNfU1NDX1RYRElTOw0KDQogICAgLyoqIERlZmluZSB0aGUgQ2xvY2sgTW9kZSBSZWdpc3RlciAqLw0KICAgIEFUOTFGX1NTQ19TZXRCYXVkcmF0ZSggcFNTQywgc3lzdF9jbG9jaywgYmF1ZF9yYXRlICk7DQoNCiAgICAvKiogV3JpdGUgdGhlIFJlY2VpdmUgQ2xvY2sgTW9kZSBSZWdpc3RlciAqLw0KICAgIHBTU0MtPlNTQ19SQ01SID0gY2xvY2tfcng7DQoNCiAgICAvKiogV3JpdGUgdGhlIFRyYW5zbWl0IENsb2NrIE1vZGUgUmVnaXN0ZXIgKi8NCiAgICBwU1NDLT5TU0NfVENNUiA9IGNsb2NrX3R4Ow0KDQogICAgLyoqIFdyaXRlIHRoZSBSZWNlaXZlIEZyYW1lIE1vZGUgUmVnaXN0ZXIgKi8NCiAgICBwU1NDLT5TU0NfUkZNUiA9IG1vZGVfcng7DQoNCiAgICAvKiogV3JpdGUgdGhlIFRyYW5zbWl0IEZyYW1lIE1vZGUgUmVnaXN0ZXIgKi8NCiAgICBwU1NDLT5TU0NfVEZNUiA9IG1vZGVfdHg7DQoNCiAgICAvKiogQ2xlYXIgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQ291bnRlcnMgKi8NCiAgICBBVDkxRl9QRENfT3BlbiggKCBBVDkxUFNfUERDICkgJiggcFNTQy0+U1NDX1JQUiApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1NDX0VuYWJsZVJ4ICovDQovKiogXGJyaWVmIEVuYWJsZSByZWNlaXZpbmcgZGF0YXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0VuYWJsZVJ4KCBBVDkxUFNfU1NDIHBTU0MgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0Kew0KICAgIC8qKiBFbmFibGUgcmVjZWl2ZXIgKi8NCiAgICBwU1NDLT5TU0NfQ1IgPSBBVDkxQ19TU0NfUlhFTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TU0NfRGlzYWJsZVJ4ICovDQovKiogXGJyaWVmIERpc2FibGUgcmVjZWl2aW5nIGRhdGFzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19EaXNhYmxlUngoIEFUOTFQU19TU0MgcFNTQyApIC8qIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyICovDQp7DQogICAgLyoqIERpc2FibGUgcmVjZWl2ZXIgKi8NCiAgICBwU1NDLT5TU0NfQ1IgPSBBVDkxQ19TU0NfUlhESVM7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1NDX0VuYWJsZVR4ICovDQovKiogXGJyaWVmIEVuYWJsZSBzZW5kaW5nIGRhdGFzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19FbmFibGVUeCggQVQ5MVBTX1NTQyBwU1NDICkgLyogXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXIgKi8NCnsNCiAgICAvKiogRW5hYmxlICB0cmFuc21pdHRlciAqLw0KICAgIHBTU0MtPlNTQ19DUiA9IEFUOTFDX1NTQ19UWEVOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NTQ19EaXNhYmxlVHggKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBzZW5kaW5nIGRhdGFzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19EaXNhYmxlVHgoIEFUOTFQU19TU0MgcFNTQyApIC8qIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyICovDQp7DQogICAgLyoqIERpc2FibGUgIHRyYW5zbWl0dGVyICovDQogICAgcFNTQy0+U1NDX0NSID0gQVQ5MUNfU1NDX1RYRElTOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NTQ19FbmFibGVJdCAqLw0KLyoqIFxicmllZiBFbmFibGUgU1NDIElUICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19FbmFibGVJdCggQVQ5MVBTX1NTQyBwU1NDLCAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyBJVCB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwU1NDLT5TU0NfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TU0NfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgU1NDIElUICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19EaXNhYmxlSXQoIEFUOTFQU19TU0MgcFNTQywgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnIElUIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIgKi8NCiAgICBwU1NDLT5TU0NfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TU0NfUmVjZWl2ZUZyYW1lICovDQovKiogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TU0NfUmVjZWl2ZUZyYW1lKCBBVDkxUFNfU1NDIHBTU0MsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBwTmV4dEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCiAgICByZXR1cm4gQVQ5MUZfUERDX1JlY2VpdmVGcmFtZSgNCiAgICAgICAgKCBBVDkxUFNfUERDICkgJiggcFNTQy0+U1NDX1JQUiApLA0KICAgICAgICBwQnVmZmVyLA0KICAgICAgICBzekJ1ZmZlciwNCiAgICAgICAgcE5leHRCdWZmZXIsDQogICAgICAgIHN6TmV4dEJ1ZmZlciApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NTQ19TZW5kRnJhbWUgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYnVzeSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NTQ19TZW5kRnJhbWUoIEFUOTFQU19TU0MgcFNTQywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICogcEJ1ZmZlciwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3pCdWZmZXIsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqIHBOZXh0QnVmZmVyLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KICAgIHJldHVybiBBVDkxRl9QRENfU2VuZEZyYW1lKA0KICAgICAgICAoIEFUOTFQU19QREMgKSAmKCBwU1NDLT5TU0NfUlBSICksDQogICAgICAgIHBCdWZmZXIsDQogICAgICAgIHN6QnVmZmVyLA0KICAgICAgICBwTmV4dEJ1ZmZlciwNCiAgICAgICAgc3pOZXh0QnVmZmVyICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1NDX0dldEludGVycnVwdE1hc2tTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIFNTQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TU0NfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLyogXHJldHVybiBTU0MgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQogICAgQVQ5MVBTX1NTQyBwU3NjICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwU3NjLT5TU0NfSU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NTQ19Jc0ludGVycnVwdE1hc2tlZCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFNTQyBJbnRlcnJ1cHQgaXMgTWFza2VkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfU1NDX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfU1NDIHBTc2MsICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfU1NDX0dldEludGVycnVwdE1hc2tTdGF0dXMoIHBTc2MgKSAmIGZsYWcgKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFRXSQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVFdJX0VuYWJsZUl0ICovDQovKiogXGJyaWVmIEVuYWJsZSBUV0kgSVQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0VuYWJsZUl0KCBBVDkxUFNfVFdJIHBUV0ksICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnIElUIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlciAqLw0KICAgIHBUV0ktPlRXSV9JRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RXSV9EaXNhYmxlSXQgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBUV0kgSVQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0Rpc2FibGVJdCggQVQ5MVBTX1RXSSBwVFdJLCAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgSVQgdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlciAqLw0KICAgIHBUV0ktPlRXSV9JRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RXSV9Db25maWd1cmUgKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFRXSSBpbiBtYXN0ZXIgbW9kZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UV0lfQ29uZmlndXJlKCBBVDkxUFNfVFdJIHBUV0kgKSAvKiBcYXJnIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlciAqLw0Kew0KICAgIC8qKiBEaXNhYmxlIGludGVycnVwdHMgKi8NCiAgICBwVFdJLT5UV0lfSURSID0gKCB1bnNpZ25lZCBpbnQgKSAtMTsNCg0KICAgIC8qKiBSZXNldCBwZXJpcGhlcmFsICovDQogICAgcFRXSS0+VFdJX0NSID0gQVQ5MUNfVFdJX1NXUlNUOw0KDQogICAgLyoqIFNldCBNYXN0ZXIgbW9kZSAqLw0KICAgIHBUV0ktPlRXSV9DUiA9IEFUOTFDX1RXSV9NU0VOOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RXSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBUV0kgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVFdJX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8qIFxyZXR1cm4gVFdJIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KICAgIEFUOTFQU19UV0kgcFR3aSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgVFdJIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFR3aS0+VFdJX0lNUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UV0lfSXNJbnRlcnJ1cHRNYXNrZWQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBUV0kgSW50ZXJydXB0IGlzIE1hc2tlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1RXSV9Jc0ludGVycnVwdE1hc2tlZCggQVQ5MVBTX1RXSSBwVHdpLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgVFdJIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1RXSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCBwVHdpICkgJiBmbGFnICk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQV01DDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QV01fR2V0U3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBQV00gSW50ZXJydXB0IFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BXTUNfR2V0U3RhdHVzKCAvKiBccmV0dXJuIFBXTSBJbnRlcnJ1cHQgU3RhdHVzICovDQogICAgQVQ5MVBTX1BXTUMgcFBXTSApICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwUFdNLT5QV01DX1NSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BXTV9JbnRlcnJ1cHRFbmFibGUgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBXTSBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19JbnRlcnJ1cHRFbmFibGUoIEFUOTFQU19QV01DIHBQd20sICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIFBXTSBpbnRlcnJ1cHQgdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIHBQd20tPlBXTUNfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QV01fSW50ZXJydXB0RGlzYWJsZSAqLw0KLyoqIFxicmllZiBEaXNhYmxlIFBXTSBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19JbnRlcnJ1cHREaXNhYmxlKCBBVDkxUFNfUFdNQyBwUHdtLCAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgUFdNIGludGVycnVwdCB0byBiZSBkaXNhYmxlZCAqLw0Kew0KICAgIHBQd20tPlBXTUNfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QV01fR2V0SW50ZXJydXB0TWFza1N0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gUFdNIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BXTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLyogXHJldHVybiBQV00gSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQogICAgQVQ5MVBTX1BXTUMgcFB3bSApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFB3bS0+UFdNQ19JTVI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUFdNX0lzSW50ZXJydXB0TWFza2VkICovDQovKiogXGJyaWVmIFRlc3QgaWYgUFdNIEludGVycnVwdCBpcyBNYXNrZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QV01DX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfUFdNQyBwUFdNLCAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1BXTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggcFBXTSApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BXTV9Jc1N0YXR1c1NldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFBXTSBJbnRlcnJ1cHQgaXMgU2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUFdNQ19Jc1N0YXR1c1NldCggQVQ5MVBTX1BXTUMgcFBXTSwgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9QV01DX0dldFN0YXR1cyggcFBXTSApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BXTV9DZmdDaGFubmVsICovDQovKiogXGJyaWVmIFRlc3QgaWYgUFdNIEludGVycnVwdCBpcyBTZXQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19DZmdDaGFubmVsKCBBVDkxUFNfUFdNQyBwUFdNLCAgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbElkLCAvKiBcYXJnIFBXTSBjaGFubmVsIElEICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGUsICAgICAgLyogXGFyZyAgUFdNIG1vZGUgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgcGVyaW9kLCAgICAvKiBcYXJnIFBXTSBwZXJpb2QgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZHV0eSApICAgICAvKiBcYXJnIFBXTSBkdXR5IGN5Y2xlICovDQp7DQogICAgcFBXTS0+UFdNQ19DSFsgY2hhbm5lbElkIF0uUFdNQ19DTVIgPSBtb2RlOw0KICAgIHBQV00tPlBXTUNfQ0hbIGNoYW5uZWxJZCBdLlBXTUNfQ0RUWVIgPSBkdXR5Ow0KICAgIHBQV00tPlBXTUNfQ0hbIGNoYW5uZWxJZCBdLlBXTUNfQ1BSRFIgPSBwZXJpb2Q7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUFdNX1N0YXJ0Q2hhbm5lbCAqLw0KLyoqIFxicmllZiBFbmFibGUgY2hhbm5lbCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX1N0YXJ0Q2hhbm5lbCggQVQ5MVBTX1BXTUMgcFBXTSwgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgQ2hhbm5lbHMgSURzIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICBwUFdNLT5QV01DX0VOQSA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUFdNX1N0b3BDaGFubmVsICovDQovKiogXGJyaWVmIERpc2FibGUgY2hhbm5lbCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX1N0b3BDaGFubmVsKCBBVDkxUFNfUFdNQyBwUFdNLCAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIENoYW5uZWxzIElEcyB0byBiZSBlbmFibGVkICovDQp7DQogICAgcFBXTS0+UFdNQ19ESVMgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BXTV9VcGRhdGVDaGFubmVsICovDQovKiogXGJyaWVmIFVwZGF0ZSBQZXJpb2Qgb3IgRHV0eSBDeWNsZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX1VwZGF0ZUNoYW5uZWwoIEFUOTFQU19QV01DIHBQV00sICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsSWQsIC8qIFxhcmcgUFdNIGNoYW5uZWwgSUQgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdXBkYXRlICkgICAvKiBcYXJnICBDaGFubmVscyBJRHMgdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIHBQV00tPlBXTUNfQ0hbIGNoYW5uZWxJZCBdLlBXTUNfQ1VQRFIgPSB1cGRhdGU7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBVRFANCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VEUF9FbmFibGVJdCAqLw0KLyoqIFxicmllZiBFbmFibGUgVURQIElUICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FbmFibGVJdCggQVQ5MVBTX1VEUCBwVURQLCAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyBJVCB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwVURQLT5VRFBfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgVURQIElUICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9EaXNhYmxlSXQoIEFUOTFQU19VRFAgcFVEUCwgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnIElUIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIgKi8NCiAgICBwVURQLT5VRFBfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfU2V0QWRkcmVzcyAqLw0KLyoqIFxicmllZiBTZXQgVURQIGZ1bmN0aW9uYWwgYWRkcmVzcyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfU2V0QWRkcmVzcyggQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgYWRkcmVzcyApIC8qIFxhcmcgbmV3IFVEUCBhZGRyZXNzICovDQp7DQogICAgcFVEUC0+VURQX0ZBRERSID0gKCBBVDkxQ19VRFBfRkVOIHwgYWRkcmVzcyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VEUF9FbmFibGVFcCAqLw0KLyoqIFxicmllZiBFbmFibGUgRW5kcG9pbnQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VuYWJsZUVwKCBBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGVuZHBvaW50ICkgLyogXGFyZyBlbmRwb2ludCBudW1iZXIgKi8NCnsNCiAgICBwVURQLT5VRFBfQ1NSWyBlbmRwb2ludCBdIHw9IEFUOTFDX1VEUF9FUEVEUzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfRGlzYWJsZUVwICovDQovKiogXGJyaWVmIEVuYWJsZSBFbmRwb2ludCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRGlzYWJsZUVwKCBBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBlbmRwb2ludCApIC8qIFxhcmcgZW5kcG9pbnQgbnVtYmVyICovDQp7DQogICAgcFVEUC0+VURQX0NTUlsgZW5kcG9pbnQgXSAmPSB+QVQ5MUNfVURQX0VQRURTOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VEUF9TZXRTdGF0ZSAqLw0KLyoqIFxicmllZiBTZXQgVURQIERldmljZSBzdGF0ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfU2V0U3RhdGUoIEFUOTFQU19VRFAgcFVEUCwgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgbmV3IFVEUCBhZGRyZXNzICovDQp7DQogICAgcFVEUC0+VURQX0dMQlNUQVRFICY9IH4oIEFUOTFDX1VEUF9GQURERU4gfCBBVDkxQ19VRFBfQ09ORkcgKTsNCiAgICBwVURQLT5VRFBfR0xCU1RBVEUgfD0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfR2V0U3RhdGUgKi8NCi8qKiBcYnJpZWYgcmV0dXJuIFVEUCBEZXZpY2Ugc3RhdGUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VRFBfR2V0U3RhdGUoIC8qIFxyZXR1cm4gdGhlIFVEUCBkZXZpY2Ugc3RhdGUgKi8NCiAgICBBVDkxUFNfVURQIHBVRFAgKSAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuKCBwVURQLT5VRFBfR0xCU1RBVEUgJiAoIEFUOTFDX1VEUF9GQURERU4gfCBBVDkxQ19VRFBfQ09ORkcgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VEUF9SZXNldEVwICovDQovKiogXGJyaWVmIFJlc2V0IFVEUCBlbmRwb2ludCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfUmVzZXRFcCggLyogXHJldHVybiB0aGUgVURQIGRldmljZSBzdGF0ZSAqLw0KICAgIEFUOTFQU19VRFAgcFVEUCwgICAgICAgICAgICAgLyogXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIgKi8NCiAgICB1bnNpZ25lZCBpbnQgZmxhZyApICAgICAgICAgIC8qIFxhcmcgRW5kcG9pbnRzIHRvIGJlIHJlc2V0ICovDQp7DQogICAgcFVEUC0+VURQX1JTVEVQID0gZmxhZzsNCiAgICBwVURQLT5VRFBfUlNURVAgPSAwOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VEUF9FcFN0YWxsICovDQovKiogXGJyaWVmIEVuZHBvaW50IHdpbGwgU1RBTEwgcmVxdWVzdHMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VwU3RhbGwoIEFUOTFQU19VRFAgcFVEUCwgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBlbmRwb2ludCApIC8qIFxhcmcgZW5kcG9pbnQgbnVtYmVyICovDQp7DQogICAgcFVEUC0+VURQX0NTUlsgZW5kcG9pbnQgXSB8PSBBVDkxQ19VRFBfRk9SQ0VTVEFMTDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfRXBXcml0ZSAqLw0KLyoqIFxicmllZiBXcml0ZSB2YWx1ZSBpbiB0aGUgRFBSICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FcFdyaXRlKCBBVDkxUFNfVURQIHBVRFAsICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBlbmRwb2ludCwgLyogXGFyZyBlbmRwb2ludCBudW1iZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdmFsdWUgKSAgIC8qIFxhcmcgdmFsdWUgdG8gYmUgd3JpdHRlbiBpbiB0aGUgRFBSICovDQp7DQogICAgcFVEUC0+VURQX0ZEUlsgZW5kcG9pbnQgXSA9IHZhbHVlOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VEUF9FcFJlYWQgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHZhbHVlIGZyb20gdGhlIERQUiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VEUF9FcFJlYWQoIEFUOTFQU19VRFAgcFVEUCwgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgZW5kcG9pbnQgKSAvKiBcYXJnIGVuZHBvaW50IG51bWJlciAqLw0Kew0KICAgIHJldHVybiBwVURQLT5VRFBfRkRSWyBlbmRwb2ludCBdOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VEUF9FcEVuZE9mV3IgKi8NCi8qKiBcYnJpZWYgTm90aWZ5IHRoZSBVRFAgdGhhdCB2YWx1ZXMgaW4gRFBSIGFyZSByZWFkeSB0byBiZSBzZW50ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FcEVuZE9mV3IoIEFUOTFQU19VRFAgcFVEUCwgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGVuZHBvaW50ICkgLyogXGFyZyBlbmRwb2ludCBudW1iZXIgKi8NCnsNCiAgICBwVURQLT5VRFBfQ1NSWyBlbmRwb2ludCBdIHw9IEFUOTFDX1VEUF9UWFBLVFJEWTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfRXBDbGVhciAqLw0KLyoqIFxicmllZiBDbGVhciBmbGFnIGluIHRoZSBlbmRwb2ludCBDU1IgcmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VwQ2xlYXIoIEFUOTFQU19VRFAgcFVEUCwgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGVuZHBvaW50LCAvKiBcYXJnIGVuZHBvaW50IG51bWJlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAgICAgLyogXGFyZyBmbGFnIHRvIGJlIGNsZWFyZWQgKi8NCnsNCiAgICBwVURQLT5VRFBfQ1NSWyBlbmRwb2ludCBdICY9IH4oIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfRXBTZXQgKi8NCi8qKiBcYnJpZWYgU2V0IGZsYWcgaW4gdGhlIGVuZHBvaW50IENTUiByZWdpc3RlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRXBTZXQoIEFUOTFQU19VRFAgcFVEUCwgICAgICAgIC8qIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBlbmRwb2ludCwgLyogXGFyZyBlbmRwb2ludCBudW1iZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApICAgICAvKiBcYXJnIGZsYWcgdG8gYmUgY2xlYXJlZCAqLw0Kew0KICAgIHBVRFAtPlVEUF9DU1JbIGVuZHBvaW50IF0gfD0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9VRFBfRXBTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBlbmRwb2ludCBDU1IgcmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VRFBfRXBTdGF0dXMoIEFUOTFQU19VRFAgcFVEUCwgICAgICAgICAvKiBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBlbmRwb2ludCApIC8qIFxhcmcgZW5kcG9pbnQgbnVtYmVyICovDQp7DQogICAgcmV0dXJuIHBVRFAtPlVEUF9DU1JbIGVuZHBvaW50IF07DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVURQX0dldEludGVycnVwdE1hc2tTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIFVEUCBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VRFBfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLyogXHJldHVybiBVRFAgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQogICAgQVQ5MVBTX1VEUCBwVWRwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwVWRwLT5VRFBfSU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VEUF9Jc0ludGVycnVwdE1hc2tlZCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFVEUCBJbnRlcnJ1cHQgaXMgTWFza2VkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSBpbnQgQVQ5MUZfVURQX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfVURQIHBVZHAsICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfVURQX0dldEludGVycnVwdE1hc2tTdGF0dXMoIHBVZHAgKSAmIGZsYWcgKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFRDDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UQ19JbnRlcnJ1cHRFbmFibGUgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFRDIEludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQ19JbnRlcnJ1cHRFbmFibGUoIEFUOTFQU19UQyBwVGMsICAgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIFRDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIFRDIGludGVycnVwdCB0byBiZSBlbmFibGVkICovDQp7DQogICAgcFRjLT5UQ19JRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RDX0ludGVycnVwdERpc2FibGUgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBUQyBJbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVENfSW50ZXJydXB0RGlzYWJsZSggQVQ5MVBTX1RDIHBUYywgICAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgVEMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIFRDIGludGVycnVwdCB0byBiZSBkaXNhYmxlZCAqLw0Kew0KICAgIHBUYy0+VENfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBUQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvKiBccmV0dXJuIFRDIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KICAgIEFUOTFQU19UQyBwVGMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBUQyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBUYy0+VENfSU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RDX0lzSW50ZXJydXB0TWFza2VkICovDQovKiogXGJyaWVmIFRlc3QgaWYgVEMgSW50ZXJydXB0IGlzIE1hc2tlZCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgaW50IEFUOTFGX1RDX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfVEMgcFRjLCAgICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBUQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1RDX0dldEludGVycnVwdE1hc2tTdGF0dXMoIHBUYyApICYgZmxhZyApOw0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgQ0FODQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KI2RlZmluZSBTVEFOREFSRF9GT1JNQVQgICAgMA0KI2RlZmluZSBFWFRFTkRFRF9GT1JNQVQgICAgMQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0luaXRNYWlsYm94UmVnaXN0ZXJzKCkgKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBjb3JyZXNwb25kaW5nIG1haWxib3ggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfSW5pdE1haWxib3hSZWdpc3RlcnMoIEFUOTFQU19DQU5fTUIgQ0FOX01haWxib3gsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kZV9yZWcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWNjZXB0YW5jZV9tYXNrX3JlZywNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZF9yZWcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YV9sb3dfcmVnLA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFfaGlnaF9yZWcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udHJvbF9yZWcgKQ0Kew0KICAgIENBTl9NYWlsYm94LT5DQU5fTUJfTUNSID0gMHgwOw0KICAgIENBTl9NYWlsYm94LT5DQU5fTUJfTU1SID0gbW9kZV9yZWc7DQogICAgQ0FOX01haWxib3gtPkNBTl9NQl9NQU0gPSBhY2NlcHRhbmNlX21hc2tfcmVnOw0KICAgIENBTl9NYWlsYm94LT5DQU5fTUJfTUlEID0gaWRfcmVnOw0KICAgIENBTl9NYWlsYm94LT5DQU5fTUJfTURMID0gZGF0YV9sb3dfcmVnOw0KICAgIENBTl9NYWlsYm94LT5DQU5fTUJfTURIID0gZGF0YV9oaWdoX3JlZzsNCiAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01DUiA9IGNvbnRyb2xfcmVnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0VuYWJsZUNBTigpICovDQovKiogXGJyaWVmICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0VuYWJsZUNBTiggQVQ5MVBTX0NBTiBwQ0FOICkgLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQp7DQogICAgcENBTi0+Q0FOX01SIHw9IEFUOTFDX0NBTl9DQU5FTjsNCg0KICAgIC8qIFdhaXQgZm9yIFdBS0VVUCBmbGFnIHJhaXNpbmcgPD0+IDExLXJlY2Vzc2l2ZS1iaXQgd2VyZSBzY2FubmVkIGJ5IHRoZSB0cmFuc2NlaXZlciAqLw0KICAgIHdoaWxlKCAoIHBDQU4tPkNBTl9TUiAmIEFUOTFDX0NBTl9XQUtFVVAgKSAhPSBBVDkxQ19DQU5fV0FLRVVQICkNCiAgICB7DQogICAgfQ0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0Rpc2FibGVDQU4oKSAqLw0KLyoqIFxicmllZiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9EaXNhYmxlQ0FOKCBBVDkxUFNfQ0FOIHBDQU4gKSAvKiBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIgKi8NCnsNCiAgICBwQ0FOLT5DQU5fTVIgJj0gfkFUOTFDX0NBTl9DQU5FTjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fRW5hYmxlSXQgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIENBTiBpbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0VuYWJsZUl0KCBBVDkxUFNfQ0FOIHBDQU4sICAgIC8qIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogSVQgdG8gYmUgZW5hYmxlZCAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyICovDQogICAgcENBTi0+Q0FOX0lFUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0Rpc2FibGVJdCAqLw0KLyoqIFxicmllZiBEaXNhYmxlIENBTiBpbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0Rpc2FibGVJdCggQVQ5MVBTX0NBTiBwQ0FOLCAgICAvKiBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBJVCB0byBiZSBkaXNhYmxlZCAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyICovDQogICAgcENBTi0+Q0FOX0lEUiA9IGZsYWc7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldFN0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gQ0FOIEludGVycnVwdCBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0U3RhdHVzKCAvKiBccmV0dXJuIENBTiBJbnRlcnJ1cHQgU3RhdHVzICovDQogICAgQVQ5MVBTX0NBTiBwQ0FOICkgICAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBDQU4tPkNBTl9TUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fR2V0SW50ZXJydXB0TWFza1N0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gQ0FOIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvKiBccmV0dXJuIENBTiBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCiAgICBBVDkxUFNfQ0FOIHBDQU4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBDQU4tPkNBTl9JTVI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0lzSW50ZXJydXB0TWFza2VkICovDQovKiogXGJyaWVmIFRlc3QgaWYgQ0FOIEludGVycnVwdCBpcyBNYXNrZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fSXNJbnRlcnJ1cHRNYXNrZWQoIEFUOTFQU19DQU4gcENBTiwgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9DQU5fR2V0SW50ZXJydXB0TWFza1N0YXR1cyggcENBTiApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9Jc1N0YXR1c1NldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIENBTiBJbnRlcnJ1cHQgaXMgU2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0lzU3RhdHVzU2V0KCBBVDkxUFNfQ0FOIHBDQU4sICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfQ0FOX0dldFN0YXR1cyggcENBTiApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdNb2RlUmVnICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQ0FOIGNvbnRyb2xsZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01vZGVSZWcoIEFUOTFQU19DQU4gcENBTiwgICAgLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSApIC8qIG1vZGUgcmVnaXN0ZXIgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyICovDQogICAgcENBTi0+Q0FOX01SID0gbW9kZTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fR2V0TW9kZVJlZyAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIENBTiBjb250cm9sbGVyIHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1vZGVSZWcoIEFUOTFQU19DQU4gcENBTiAvKiBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQ0FOLT5DQU5fTVI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ0JhdWRyYXRlUmVnICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSB0aGUgQmF1ZHJhdGUgb2YgdGhlIENBTiBjb250cm9sbGVyIGZvciB0aGUgbmV0d29yayAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnQmF1ZHJhdGVSZWcoIEFUOTFQU19DQU4gcENBTiwgLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGJhdWRyYXRlX2NmZyApDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBCUiByZWdpc3RlciAqLw0KICAgIHBDQU4tPkNBTl9CUiA9IGJhdWRyYXRlX2NmZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fR2V0QmF1ZHJhdGUgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBCYXVkcmF0ZSBvZiB0aGUgQ0FOIGNvbnRyb2xsZXIgZm9yIHRoZSBuZXR3b3JrIHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldEJhdWRyYXRlKCBBVDkxUFNfQ0FOIHBDQU4gLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBDQU4tPkNBTl9CUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fR2V0SW50ZXJuYWxDb3VudGVyICovDQovKiogXGJyaWVmIFJldHVybiBDQU4gVGltZXIgUmVnc2l0ZXIgVmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0SW50ZXJuYWxDb3VudGVyKCBBVDkxUFNfQ0FOIHBDQU4gLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQ0FOLT5DQU5fVElNOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9HZXRUaW1lc3RhbXAgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIENBTiBUaW1lc3RhbXAgUmVnaXN0ZXIgVmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0VGltZXN0YW1wKCBBVDkxUFNfQ0FOIHBDQU4gLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQ0FOLT5DQU5fVElNRVNUUDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fR2V0RXJyb3JDb3VudGVyICovDQovKiogXGJyaWVmIFJldHVybiBDQU4gRXJyb3IgQ291bnRlciBSZWdpc3RlciBWYWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRFcnJvckNvdW50ZXIoIEFUOTFQU19DQU4gcENBTiAvKiBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBDQU4tPkNBTl9FQ1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0luaXRUcmFuc2ZlclJlcXVlc3QgKi8NCi8qKiBcYnJpZWYgUmVxdWVzdCBmb3IgYSB0cmFuc2ZlciBvbiB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94ZXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0luaXRUcmFuc2ZlclJlcXVlc3QoIEFUOTFQU19DQU4gcENBTiwgLyogcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgdHJhbnNmZXJfY21kICkNCnsNCiAgICBwQ0FOLT5DQU5fVENSID0gdHJhbnNmZXJfY21kOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9Jbml0QWJvcnRSZXF1ZXN0ICovDQovKiogXGJyaWVmIEFib3J0IHRoZSBjb3JyZXNwb25kaW5nIG1haWxib3hlcyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fSW5pdEFib3J0UmVxdWVzdCggQVQ5MVBTX0NBTiBwQ0FOLCAvKiBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhYm9ydF9jbWQgKQ0Kew0KICAgIHBDQU4tPkNBTl9BQ1IgPSBhYm9ydF9jbWQ7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VNb2RlUmVnICovDQovKiogXGJyaWVmIFByb2dyYW0gdGhlIE1lc3NhZ2UgTW9kZSBSZWdpc3RlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZU1vZGVSZWcoIEFUOTFQU19DQU5fTUIgQ0FOX01haWxib3gsIC8qIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveCAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlICkNCnsNCiAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01NUiA9IG1vZGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VNb2RlUmVnICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBNb2RlIFJlZ2lzdGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VNb2RlUmVnKCBBVDkxUFNfQ0FOX01CIENBTl9NYWlsYm94ICkgLyogcG9pbnRlciB0byBhIENBTiBNYWlsYm94ICovDQp7DQogICAgcmV0dXJuIENBTl9NYWlsYm94LT5DQU5fTUJfTU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdNZXNzYWdlSURSZWcgKi8NCi8qKiBcYnJpZWYgUHJvZ3JhbSB0aGUgTWVzc2FnZSBJRCBSZWdpc3RlciAqLw0KLyoqIFxicmllZiBWZXJzaW9uID09IDAgZm9yIFN0YW5kYXJkIG1lc3NzYWdlLCBWZXJzaW9uID09IDEgZm9yIEV4dGVuZGVkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNZXNzYWdlSURSZWcoIEFUOTFQU19DQU5fTUIgQ0FOX01haWxib3gsIC8qIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveCAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaWQsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgdmVyc2lvbiApDQp7DQogICAgaWYoIHZlcnNpb24gPT0gMCApIC8qIElEdkEgU3RhbmRhcmQgRm9ybWF0ICovDQogICAgew0KICAgICAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01JRCA9IGlkIDw8IDE4Ow0KICAgIH0NCiAgICBlbHNlIC8qIElEdkIgRXh0ZW5kZWQgRm9ybWF0ICovDQogICAgew0KICAgICAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01JRCA9IGlkIHwgKCAxIDw8IDI5ICk7IC8qIHNldCBNSURFIGJpdCAqLw0KICAgIH0NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZUlEUmVnICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBJRCBSZWdpc3RlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlSURSZWcoIEFUOTFQU19DQU5fTUIgQ0FOX01haWxib3ggKSAvKiBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3ggKi8NCnsNCiAgICByZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NSUQ7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VBY2NlcHRhbmNlTWFza1JlZyAqLw0KLyoqIFxicmllZiBQcm9ncmFtIHRoZSBNZXNzYWdlIEFjY2VwdGFuY2UgTWFzayBSZWdpc3RlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZUFjY2VwdGFuY2VNYXNrUmVnKCBBVDkxUFNfQ0FOX01CIENBTl9NYWlsYm94LCAvKiBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3ggKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1hc2sgKQ0Kew0KICAgIENBTl9NYWlsYm94LT5DQU5fTUJfTUFNID0gbWFzazsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZUFjY2VwdGFuY2VNYXNrUmVnICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBBY2NlcHRhbmNlIE1hc2sgUmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0TWVzc2FnZUFjY2VwdGFuY2VNYXNrUmVnKCBBVDkxUFNfQ0FOX01CIENBTl9NYWlsYm94ICkgLyogcG9pbnRlciB0byBhIENBTiBNYWlsYm94ICovDQp7DQogICAgcmV0dXJuIENBTl9NYWlsYm94LT5DQU5fTUJfTUFNOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9HZXRGYW1pbHlJRCAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIE1lc3NhZ2UgSUQgUmVnaXN0ZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0RmFtaWx5SUQoIEFUOTFQU19DQU5fTUIgQ0FOX01haWxib3ggKSAvKiBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3ggKi8NCnsNCiAgICByZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NRklEOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdNZXNzYWdlQ3RybCAqLw0KLyoqIFxicmllZiBSZXF1ZXN0IGFuZCBjb25maWcgZm9yIGEgdHJhbnNmZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgbWFpbGJveCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZUN0cmxSZWcoIEFUOTFQU19DQU5fTUIgQ0FOX01haWxib3gsIC8qIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveCAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtZXNzYWdlX2N0cmxfY21kICkNCnsNCiAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01DUiA9IG1lc3NhZ2VfY3RybF9jbWQ7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIENBTiBNYWlsYm94IFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlU3RhdHVzKCBBVDkxUFNfQ0FOX01CIENBTl9NYWlsYm94ICkgLyogcG9pbnRlciB0byBhIENBTiBNYWlsYm94ICovDQp7DQogICAgcmV0dXJuIENBTl9NYWlsYm94LT5DQU5fTUJfTVNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdNZXNzYWdlRGF0YUxvdyAqLw0KLyoqIFxicmllZiBQcm9ncmFtIGRhdGEgbG93IHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNZXNzYWdlRGF0YUxvdyggQVQ5MVBTX0NBTl9NQiBDQU5fTWFpbGJveCwgLyogcG9pbnRlciB0byBhIENBTiBNYWlsYm94ICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGRhdGEgKQ0Kew0KICAgIENBTl9NYWlsYm94LT5DQU5fTUJfTURMID0gZGF0YTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZURhdGFMb3cgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIGRhdGEgbG93IHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VEYXRhTG93KCBBVDkxUFNfQ0FOX01CIENBTl9NYWlsYm94ICkgLyogcG9pbnRlciB0byBhIENBTiBNYWlsYm94ICovDQp7DQogICAgcmV0dXJuIENBTl9NYWlsYm94LT5DQU5fTUJfTURMOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdNZXNzYWdlRGF0YUhpZ2ggKi8NCi8qKiBcYnJpZWYgUHJvZ3JhbSBkYXRhIGhpZ2ggdmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhSGlnaCggQVQ5MVBTX0NBTl9NQiBDQU5fTWFpbGJveCwgLyogcG9pbnRlciB0byBhIENBTiBNYWlsYm94ICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBkYXRhICkNCnsNCiAgICBDQU5fTWFpbGJveC0+Q0FOX01CX01ESCA9IGRhdGE7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VEYXRhSGlnaCAqLw0KLyoqIFxicmllZiBSZXR1cm4gZGF0YSBoaWdoIHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VEYXRhSGlnaCggQVQ5MVBTX0NBTl9NQiBDQU5fTWFpbGJveCApIC8qIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveCAqLw0Kew0KICAgIHJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01ESDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9DQU5fT3BlbiAqLw0KLyoqIFxicmllZiBPcGVuIGEgQ0FOIFBvcnQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fT3BlbiggY29uc3QgdW5zaWduZWQgaW50IG51bGwgKSAvKiBcYXJnICovDQp7DQogICAgLyogTk9UIERFRklORUQgQVQgVEhJUyBNT01FTlQgKi8NCiAgICByZXR1cm4oIDAgKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIEFEQw0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQURDX0VuYWJsZUl0ICovDQovKiogXGJyaWVmIEVuYWJsZSBBREMgaW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19FbmFibGVJdCggQVQ5MVBTX0FEQyBwQURDLCAgICAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIElUIHRvIGJlIGVuYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlciAqLw0KICAgIHBBREMtPkFEQ19JRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19EaXNhYmxlSXQgKi8NCi8qKiBcYnJpZWYgRGlzYWJsZSBBREMgaW50ZXJydXB0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19EaXNhYmxlSXQoIEFUOTFQU19BREMgcEFEQywgICAgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogSVQgdG8gYmUgZGlzYWJsZWQgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlciAqLw0KICAgIHBBREMtPkFEQ19JRFIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19HZXRTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIEFEQyBJbnRlcnJ1cHQgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldFN0YXR1cyggLyogXHJldHVybiBBREMgSW50ZXJydXB0IFN0YXR1cyAqLw0KICAgIEFUOTFQU19BREMgcEFEQyApICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwQURDLT5BRENfU1I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQURDX0dldEludGVycnVwdE1hc2tTdGF0dXMgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIEFEQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLyogXHJldHVybiBBREMgSW50ZXJydXB0IE1hc2sgU3RhdHVzICovDQogICAgQVQ5MVBTX0FEQyBwQURDICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0Kew0KICAgIHJldHVybiBwQURDLT5BRENfSU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19Jc0ludGVycnVwdE1hc2tlZCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIEFEQyBJbnRlcnJ1cHQgaXMgTWFza2VkICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfQURDIHBBREMsICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfQURDX0dldEludGVycnVwdE1hc2tTdGF0dXMoIHBBREMgKSAmIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfSXNTdGF0dXNTZXQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBBREMgU3RhdHVzIGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19Jc1N0YXR1c1NldCggQVQ5MVBTX0FEQyBwQURDLCAgICAvKiBcYXJnICBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX0FEQ19HZXRTdGF0dXMoIHBBREMgKSAmIGZsYWcgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfQ2ZnTW9kZVJlZyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIEFEQyBjb250cm9sbGVyICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19DZmdNb2RlUmVnKCBBVDkxUFNfQURDIHBBREMsICAgIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGUgKSAvKiBtb2RlIHJlZ2lzdGVyICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBNUiByZWdpc3RlciAqLw0KICAgIHBBREMtPkFEQ19NUiA9IG1vZGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQURDX0dldE1vZGVSZWcgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBBREMgY29udHJvbGxlciB2YWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRNb2RlUmVnKCBBVDkxUFNfQURDIHBBREMgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICByZXR1cm4gcEFEQy0+QURDX01SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19DZmdUaW1pbmdzICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSB0aGUgZGlmZmVyZW50IG5lY2Vzc2FyeSB0aW1pbmdzIG9mIHRoZSBBREMgY29udHJvbGxlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfQ2ZnVGltaW5ncyggQVQ5MVBTX0FEQyBwQURDLCAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbWNrX2Nsb2NrLCAgICAgICAgICAgICAvKiBpbiBNSHogKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBhZGNfY2xvY2ssICAgICAgICAgICAgIC8qIGluIE1IeiAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IHN0YXJ0dXBfdGltZSwgICAgICAgICAgLyogaW4gdXMgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBzYW1wbGVfYW5kX2hvbGRfdGltZSApIC8qIGluIG5zICovDQp7DQogICAgdW5zaWduZWQgaW50IHByZXNjYWwsIHN0YXJ0dXAsIHNodGltOw0KDQogICAgcHJlc2NhbCA9IG1ja19jbG9jayAvICggMiAqIGFkY19jbG9jayApIC0gMTsNCiAgICBzdGFydHVwID0gYWRjX2Nsb2NrICogc3RhcnR1cF90aW1lIC8gOCAtIDE7DQogICAgc2h0aW0gPSBhZGNfY2xvY2sgKiBzYW1wbGVfYW5kX2hvbGRfdGltZSAvIDEwMDAgLSAxOw0KDQogICAgLyoqIFdyaXRlIHRvIHRoZSBNUiByZWdpc3RlciAqLw0KICAgIHBBREMtPkFEQ19NUiA9ICggKCBwcmVzY2FsIDw8IDggKSAmIEFUOTFDX0FEQ19QUkVTQ0FMICkgfCAoICggc3RhcnR1cCA8PCAxNiApICYgQVQ5MUNfQURDX1NUQVJUVVAgKSB8ICggKCBzaHRpbSA8PCAyNCApICYgQVQ5MUNfQURDX1NIVElNICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQURDX0VuYWJsZUNoYW5uZWwgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIEFEQyBUaW1lciBSZWdpc3RlciBWYWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfRW5hYmxlQ2hhbm5lbCggQVQ5MVBTX0FEQyBwQURDLCAgICAgICAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsICkgLyogbW9kZSByZWdpc3RlciAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgQ0hFUiByZWdpc3RlciAqLw0KICAgIHBBREMtPkFEQ19DSEVSID0gY2hhbm5lbDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfRGlzYWJsZUNoYW5uZWwgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIEFEQyBUaW1lciBSZWdpc3RlciBWYWx1ZSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfRGlzYWJsZUNoYW5uZWwoIEFUOTFQU19BREMgcEFEQywgICAgICAgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWwgKSAvKiBtb2RlIHJlZ2lzdGVyICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBDSERSIHJlZ2lzdGVyICovDQogICAgcEFEQy0+QURDX0NIRFIgPSBjaGFubmVsOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19HZXRDaGFubmVsU3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBBREMgVGltZXIgUmVnaXN0ZXIgVmFsdWUgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q2hhbm5lbFN0YXR1cyggQVQ5MVBTX0FEQyBwQURDIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBBREMtPkFEQ19DSFNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19TdGFydENvbnZlcnNpb24gKi8NCi8qKiBcYnJpZWYgU29mdHdhcmUgcmVxdWVzdCBmb3IgYSBhbmFsb2cgdG8gZGlnaXRhbCBjb252ZXJzaW9uICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19TdGFydENvbnZlcnNpb24oIEFUOTFQU19BREMgcEFEQyAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHBBREMtPkFEQ19DUiA9IEFUOTFDX0FEQ19TVEFSVDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfU29mdFJlc2V0ICovDQovKiogXGJyaWVmIFNvZnR3YXJlIHJlc2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19Tb2Z0UmVzZXQoIEFUOTFQU19BREMgcEFEQyAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHBBREMtPkFEQ19DUiA9IEFUOTFDX0FEQ19TV1JTVDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfR2V0TGFzdENvbnZlcnRlZERhdGEgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBMYXN0IENvbnZlcnRlZCBEYXRhICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldExhc3RDb252ZXJ0ZWREYXRhKCBBVDkxUFNfQURDIHBBREMgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBBREMtPkFEQ19MQ0RSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gwICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCAwIENvbnZlcnRlZCBEYXRhICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDAoIEFUOTFQU19BREMgcEFEQyAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQURDLT5BRENfQ0RSMDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMSAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgMSBDb252ZXJ0ZWQgRGF0YSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gxKCBBVDkxUFNfQURDIHBBREMgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICByZXR1cm4gcEFEQy0+QURDX0NEUjE7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDIgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDIgQ29udmVydGVkIERhdGEgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMiggQVQ5MVBTX0FEQyBwQURDIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBBREMtPkFEQ19DRFIyOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gzICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCAzIENvbnZlcnRlZCBEYXRhICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDMoIEFUOTFQU19BREMgcEFEQyAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQURDLT5BRENfQ0RSMzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINCAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgNCBDb252ZXJ0ZWQgRGF0YSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g0KCBBVDkxUFNfQURDIHBBREMgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICByZXR1cm4gcEFEQy0+QURDX0NEUjQ7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDUgKi8NCi8qKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDUgQ29udmVydGVkIERhdGEgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINSggQVQ5MVBTX0FEQyBwQURDIC8qIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBBREMtPkFEQ19DRFI1Ow0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g2ICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCA2IENvbnZlcnRlZCBEYXRhICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDYoIEFUOTFQU19BREMgcEFEQyAvKiBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQURDLT5BRENfQ0RSNjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINyAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgNyBDb252ZXJ0ZWQgRGF0YSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g3KCBBVDkxUFNfQURDIHBBREMgLyogcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkNCnsNCiAgICByZXR1cm4gcEFEQy0+QURDX0NEUjc7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBBRVMNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FFU19FbmFibGVJdCAqLw0KLyoqIFxicmllZiBFbmFibGUgQUVTIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfRW5hYmxlSXQoIEFUOTFQU19BRVMgcEFFUywgICAgLyogcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBJVCB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwQUVTLT5BRVNfSUVSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgQUVTIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfRGlzYWJsZUl0KCBBVDkxUFNfQUVTIHBBRVMsICAgIC8qIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIElUIHRvIGJlIGRpc2FibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIgKi8NCiAgICBwQUVTLT5BRVNfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfR2V0U3RhdHVzICovDQovKiogXGJyaWVmIFJldHVybiBBRVMgSW50ZXJydXB0IFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FFU19HZXRTdGF0dXMoIC8qIFxyZXR1cm4gQUVTIEludGVycnVwdCBTdGF0dXMgKi8NCiAgICBBVDkxUFNfQUVTIHBBRVMgKSAgICAgICAgICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcEFFUy0+QUVTX0lTUjsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gQUVTIEludGVycnVwdCBNYXNrIFN0YXR1cyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FFU19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvKiBccmV0dXJuIEFFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCiAgICBBVDkxUFNfQUVTIHBBRVMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQp7DQogICAgcmV0dXJuIHBBRVMtPkFFU19JTVI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUVTX0lzSW50ZXJydXB0TWFza2VkICovDQovKiogXGJyaWVmIFRlc3QgaWYgQUVTIEludGVycnVwdCBpcyBNYXNrZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfSXNJbnRlcnJ1cHRNYXNrZWQoIEFUOTFQU19BRVMgcEFFUywgICAgLyogXGFyZyAgcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9BRVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggcEFFUyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FFU19Jc1N0YXR1c1NldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIEFFUyBTdGF0dXMgaXMgU2V0ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0lzU3RhdHVzU2V0KCBBVDkxUFNfQUVTIHBBRVMsICAgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZCAqLw0Kew0KICAgIHJldHVybiggQVQ5MUZfQUVTX0dldFN0YXR1cyggcEFFUyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FFU19DZmdNb2RlUmVnICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQUVTIGNvbnRyb2xsZXIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0NmZ01vZGVSZWcoIEFUOTFQU19BRVMgcEFFUywgICAgLyogcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSApIC8qIG1vZGUgcmVnaXN0ZXIgKi8NCnsNCiAgICAvKiogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyICovDQogICAgcEFFUy0+QUVTX01SID0gbW9kZTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfR2V0TW9kZVJlZyAqLw0KLyoqIFxicmllZiBSZXR1cm4gdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIEFFUyBjb250cm9sbGVyIHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0dldE1vZGVSZWcoIEFUOTFQU19BRVMgcEFFUyAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHJldHVybiBwQUVTLT5BRVNfTVI7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUVTX1N0YXJ0UHJvY2Vzc2luZyAqLw0KLyoqIFxicmllZiBTdGFydCBFbmNyeXB0aW9uIG9yIERlY3J5cHRpb24gKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX1N0YXJ0UHJvY2Vzc2luZyggQVQ5MVBTX0FFUyBwQUVTIC8qIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcEFFUy0+QUVTX0NSID0gQVQ5MUNfQUVTX1NUQVJUOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FFU19Tb2Z0UmVzZXQgKi8NCi8qKiBcYnJpZWYgUmVzZXQgQUVTICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19Tb2Z0UmVzZXQoIEFUOTFQU19BRVMgcEFFUyAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHBBRVMtPkFFU19DUiA9IEFUOTFDX0FFU19TV1JTVDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfTG9hZE5ld1NlZWQgKi8NCi8qKiBcYnJpZWYgTG9hZCBOZXcgU2VlZCBpbiB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0xvYWROZXdTZWVkKCBBVDkxUFNfQUVTIHBBRVMgLyogcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHBBRVMtPkFFU19DUiA9IEFUOTFDX0FFU19MT0FEU0VFRDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfU2V0Q3J5cHRvS2V5ICovDQovKiogXGJyaWVmIFNldCBDcnlwdG9ncmFwaGljIEtleSB4ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19TZXRDcnlwdG9LZXkoIEFUOTFQU19BRVMgcEFFUywgLyogcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5kZXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBrZXl3b3JkICkNCnsNCiAgICBwQUVTLT5BRVNfS0VZV3hSWyBpbmRleCBdID0ga2V5d29yZDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BRVNfSW5wdXREYXRhICovDQovKiogXGJyaWVmIFNldCBJbnB1dCBEYXRhIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0lucHV0RGF0YSggQVQ5MVBTX0FFUyBwQUVTLCAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpbmRleCwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGF0YSApDQp7DQogICAgcEFFUy0+QUVTX0lEQVRBeFJbIGluZGV4IF0gPSBpbmRhdGE7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUVTX0dldE91dHB1dERhdGEgKi8NCi8qKiBcYnJpZWYgR2V0IE91dHB1dCBEYXRhIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfR2V0T3V0cHV0RGF0YSggQVQ5MVBTX0FFUyBwQUVTLCAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBpbmRleCApDQp7DQogICAgcmV0dXJuIHBBRVMtPkFFU19PREFUQXhSWyBpbmRleCBdOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FFU19TZXRJbml0aWFsaXphdGlvblZlY3RvciAqLw0KLyoqIFxicmllZiBTZXQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIChvciBDb3VudGVyKSB4ICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19TZXRJbml0aWFsaXphdGlvblZlY3RvciggQVQ5MVBTX0FFUyBwQUVTLCAvKiBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGluZGV4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBpbml0dmVjdG9yICkNCnsNCiAgICBwQUVTLT5BRVNfSVZ4UlsgaW5kZXggXSA9IGluaXR2ZWN0b3I7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBUREVTDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UREVTX0VuYWJsZUl0ICovDQovKiogXGJyaWVmIEVuYWJsZSBUREVTIGludGVycnVwdCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0VuYWJsZUl0KCBBVDkxUFNfVERFUyBwVERFUywgIC8qIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBJVCB0byBiZSBlbmFibGVkICovDQp7DQogICAgLyoqIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIgKi8NCiAgICBwVERFUy0+VERFU19JRVIgPSBmbGFnOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfRGlzYWJsZUl0ICovDQovKiogXGJyaWVmIERpc2FibGUgVERFUyBpbnRlcnJ1cHQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19EaXNhYmxlSXQoIEFUOTFQU19UREVTIHBUREVTLCAgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGZsYWcgKSAvKiBJVCB0byBiZSBkaXNhYmxlZCAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyICovDQogICAgcFRERVMtPlRERVNfSURSID0gZmxhZzsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UREVTX0dldFN0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gVERFUyBJbnRlcnJ1cHQgU3RhdHVzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19HZXRTdGF0dXMoIC8qIFxyZXR1cm4gVERFUyBJbnRlcnJ1cHQgU3RhdHVzICovDQogICAgQVQ5MVBTX1RERVMgcFRERVMgKSAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFRERVMtPlRERVNfSVNSOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyAqLw0KLyoqIFxicmllZiBSZXR1cm4gVERFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8qIFxyZXR1cm4gVERFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMgKi8NCiAgICBBVDkxUFNfVERFUyBwVERFUyApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIgKi8NCnsNCiAgICByZXR1cm4gcFRERVMtPlRERVNfSU1SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfSXNJbnRlcnJ1cHRNYXNrZWQgKi8NCi8qKiBcYnJpZWYgVGVzdCBpZiBUREVTIEludGVycnVwdCBpcyBNYXNrZWQgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0lzSW50ZXJydXB0TWFza2VkKCBBVDkxUFNfVERFUyBwVERFUywgIC8qIFxhcmcgIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIgKi8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZyApIC8qIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkICovDQp7DQogICAgcmV0dXJuKCBBVDkxRl9UREVTX0dldEludGVycnVwdE1hc2tTdGF0dXMoIHBUREVTICkgJiBmbGFnICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVERFU19Jc1N0YXR1c1NldCAqLw0KLyoqIFxicmllZiBUZXN0IGlmIFRERVMgU3RhdHVzIGlzIFNldCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1RERVNfSXNTdGF0dXNTZXQoIEFUOTFQU19UREVTIHBUREVTLCAgLyogXGFyZyAgcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmbGFnICkgLyogXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQgKi8NCnsNCiAgICByZXR1cm4oIEFUOTFGX1RERVNfR2V0U3RhdHVzKCBwVERFUyApICYgZmxhZyApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfQ2ZnTW9kZVJlZyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIFRERVMgY29udHJvbGxlciAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0NmZ01vZGVSZWcoIEFUOTFQU19UREVTIHBUREVTLCAgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtb2RlICkgLyogbW9kZSByZWdpc3RlciAqLw0Kew0KICAgIC8qKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXIgKi8NCiAgICBwVERFUy0+VERFU19NUiA9IG1vZGU7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVERFU19HZXRNb2RlUmVnICovDQovKiogXGJyaWVmIFJldHVybiB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgVERFUyBjb250cm9sbGVyIHZhbHVlICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19HZXRNb2RlUmVnKCBBVDkxUFNfVERFUyBwVERFUyAvKiBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcmV0dXJuIHBUREVTLT5UREVTX01SOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfU3RhcnRQcm9jZXNzaW5nICovDQovKiogXGJyaWVmIFN0YXJ0IEVuY3J5cHRpb24gb3IgRGVjcnlwdGlvbiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1N0YXJ0UHJvY2Vzc2luZyggQVQ5MVBTX1RERVMgcFRERVMgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0Kew0KICAgIHBUREVTLT5UREVTX0NSID0gQVQ5MUNfVERFU19TVEFSVDsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UREVTX1NvZnRSZXNldCAqLw0KLyoqIFxicmllZiBSZXNldCBUREVTICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfU29mdFJlc2V0KCBBVDkxUFNfVERFUyBwVERFUyAvKiBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApDQp7DQogICAgcFRERVMtPlRERVNfQ1IgPSBBVDkxQ19UREVTX1NXUlNUOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MSAqLw0KLyoqIFxicmllZiBTZXQgQ3J5cHRvZ3JhcGhpYyBLZXkgMSBXb3JkIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkxKCBBVDkxUFNfVERFUyBwVERFUywgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5kZXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleXdvcmQgKQ0Kew0KICAgIHBUREVTLT5UREVTX0tFWTFXeFJbIGluZGV4IF0gPSBrZXl3b3JkOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MiAqLw0KLyoqIFxicmllZiBTZXQgQ3J5cHRvZ3JhcGhpYyBLZXkgMiBXb3JkIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkyKCBBVDkxUFNfVERFUyBwVERFUywgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5kZXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleXdvcmQgKQ0Kew0KICAgIHBUREVTLT5UREVTX0tFWTJXeFJbIGluZGV4IF0gPSBrZXl3b3JkOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MyAqLw0KLyoqIFxicmllZiBTZXQgQ3J5cHRvZ3JhcGhpYyBLZXkgMyBXb3JkIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkzKCBBVDkxUFNfVERFUyBwVERFUywgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgaW5kZXgsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGtleXdvcmQgKQ0Kew0KICAgIHBUREVTLT5UREVTX0tFWTNXeFJbIGluZGV4IF0gPSBrZXl3b3JkOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RERVNfSW5wdXREYXRhICovDQovKiogXGJyaWVmIFNldCBJbnB1dCBEYXRhIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19JbnB1dERhdGEoIEFUOTFQU19UREVTIHBUREVTLCAvKiBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGluZGV4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluZGF0YSApDQp7DQogICAgcFRERVMtPlRERVNfSURBVEF4UlsgaW5kZXggXSA9IGluZGF0YTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UREVTX0dldE91dHB1dERhdGEgKi8NCi8qKiBcYnJpZWYgR2V0IE91dHB1dCBEYXRhIHggKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0dldE91dHB1dERhdGEoIEFUOTFQU19UREVTIHBUREVTLCAvKiBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyICovDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGluZGV4ICkNCnsNCiAgICByZXR1cm4gcFRERVMtPlRERVNfT0RBVEF4UlsgaW5kZXggXTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UREVTX1NldEluaXRpYWxpemF0aW9uVmVjdG9yICovDQovKiogXGJyaWVmIFNldCBJbml0aWFsaXphdGlvbiBWZWN0b3IgeCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1NldEluaXRpYWxpemF0aW9uVmVjdG9yKCBBVDkxUFNfVERFUyBwVERFUywgLyogcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlciAqLw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIGluZGV4LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgaW5pdHZlY3RvciApDQp7DQogICAgcFRERVMtPlRERVNfSVZ4UlsgaW5kZXggXSA9IGluaXR2ZWN0b3I7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfREJHVV9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgREJHVSAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9EQkdVX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1NZUyApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfREJHVV9DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBEQkdVIHNpZ25hbHMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9DZmdQSU8oIHZvaWQgKQ0Kew0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0EsICAgICAgICAgICAgICAgICAgICAgIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyN19EUlhEICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyOF9EVFhEICksIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUE1DICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9TWVMgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BNQ19DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQTUMgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMzBfUENLMiApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjlfUENLMSApLCAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjBfUENLMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMF9QQ0swICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyMl9QQ0syICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyMV9QQ0sxICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQSwgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTMwX1BDSzIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTEzX1BDSzEgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTI3X1BDSzMgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9WUkVHX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBWUkVHICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1ZSRUdfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfU1lTICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9SU1RDX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBSU1RDICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1JTVENfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfU1lTICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TU0NfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFNTQyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfU1NDICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TU0NfQ2ZnUElPICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgU1NDIHNpZ25hbHMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQSwgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTI1X1JLICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyMl9USyApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjFfVEYgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTI0X1JEICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyNl9SRiApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjNfVEQgKSwgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1dEVENfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFdEVEMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfV0RUQ19DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9TWVMgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTMV9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVVMxICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTMV9DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9VUzEgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1VTMV9DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBVUzEgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9VUzFfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjZfUkkxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyNF9EU1IxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyM19EQ0QxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyNV9EVFIxICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQSwgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTdfU0NLMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBOF9SVFMxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEE2X1RYRDEgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTVfUlhEMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBOV9DVFMxICksIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVMwX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBVUzAgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVMwX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1VTMCApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVVMwX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFVTMCBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTMF9DZmdQSU8oIHZvaWQgKQ0Kew0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0EsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEwX1JYRDAgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTRfQ1RTMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBM19SVFMwICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyX1NDSzAgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTFfVFhEMCApLCAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSTFfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFNQSTEgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJMV9DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9TUEkxICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9TUEkxX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFNQSTEgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUEkxX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQiwgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgIDAsICAgICAgICAgICAgICAgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjE2X05QQ1MxMyApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTBfTlBDUzExICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIxMV9OUENTMTIgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9BLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBNF9OUENTMTMgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTI5X05QQ1MxMyApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjFfTlBDUzEwICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyMl9TUENLMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjVfTlBDUzExICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyX05QQ1MxMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjRfTUlTTzEgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTNfTlBDUzEyICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEEyNl9OUENTMTIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTIzX01PU0kxICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfU1BJMF9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgU1BJMCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUEkwX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1NQSTAgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1NQSTBfQ2ZnUElPICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgU1BJMCBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSTBfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTNfTlBDUzAxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIxN19OUENTMDMgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjE0X05QQ1MwMiApICk7IC8qIFBlcmlwaGVyYWwgQiAqLw0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0EsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExNl9NSVNPMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMTNfTlBDUzAxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExNV9OUENTMDMgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTE3X01PU0kwICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExOF9TUENLMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMTRfTlBDUzAyICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExMl9OUENTMDAgKSwgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTdfTlBDUzAxICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEE5X05QQ1MwMyApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBOF9OUENTMDIgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSVRDX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBQSVRDICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVENfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfU1lTICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BSUNfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIEFJQyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfRklRICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9JUlEwICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9JUlExICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9BSUNfQ2ZnUElPICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgQUlDIHNpZ25hbHMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMzBfSVJRMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMjlfRklRICksICAgIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExNF9JUlExICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfQUVTX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBBRVMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX0FFUyApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVFdJX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBUV0kgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1RXSSApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVFdJX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFRXSSBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1RXSV9DZmdQSU8oIHZvaWQgKQ0Kew0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0EsICAgICAgICAgICAgICAgICAgICAgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTExX1RXQ0sgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTEwX1RXRCApLCAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgQURDICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9BREMgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0FEQ19DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBBREMgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMThfQURUUkcgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QV01DX0NIM19DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQV01DX0NIMyBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ0gzX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjJfUFdNMyApLCAgIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIzMF9QV00zICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUFdNQ19DSDJfQ2ZnUElPICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgUFdNQ19DSDIgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NIMl9DZmdQSU8oIHZvaWQgKQ0Kew0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0IsICAgICAgICAgICAgICAgICAgICAgICAgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjIxX1BXTTIgKSwgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjlfUFdNMiApICk7IC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1BXTUNfQ0gxX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFBXTUNfQ0gxIHNpZ25hbHMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19DSDFfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyMF9QV00xICksICAgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjI4X1BXTTEgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QV01DX0NIMF9DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQV01DX0NIMCBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ0gwX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTlfUFdNMCApLCAgIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyN19QV00wICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUlRUQ19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUlRUQyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRDX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1NZUyApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVURQX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBVRFAgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1VEUCApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVERFU19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVERFUyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1RERVMgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0VNQUNfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIEVNQUMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfRU1BQ19DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9FTUFDICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9FTUFDX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIEVNQUMgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9FTUFDX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQiwgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjJfRVRYMCApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTJfRVRYRVIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjE2X0VDT0wgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjExX0VUWDMgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjZfRVJYMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTVfRVJYRFYgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjEzX0VSWDIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjNfRVRYMSApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCOF9FTURDICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEI1X0VSWDAgKSB8DQogICAgICAgIC8qKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMThfRUYxMDAgICApIHwgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTRfRVJYMyApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCNF9FQ1JTX0VDUlNEViApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMV9FVFhFTiApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMTBfRVRYMiApIHwNCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMF9FVFhDS19FUkVGQ0sgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjlfRU1ESU8gKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjdfRVJYRVIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjE3X0VSWENLICksIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UQzBfQ2ZnUE1DICovDQovKiogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFRDMCAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzBfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfVEMwICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9UQzBfQ2ZnUElPICovDQovKiogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgVEMwIHNpZ25hbHMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVEMwX0NmZ1BJTyggdm9pZCApDQp7DQogICAgLyogQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZSAqLw0KICAgIEFUOTFGX1BJT19DZmdQZXJpcGgoDQogICAgICAgIEFUOTFDX0JBU0VfUElPQiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjIzX1RJT0EwICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIyNF9USU9CMCApLCAgIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEIxMl9UQ0xLMCApICk7IC8qIFBlcmlwaGVyYWwgQiAqLw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RDMV9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVEMxICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1RDMV9DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9UQzEgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX1RDMV9DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBUQzEgc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzFfQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9CLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjVfVElPQTEgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjI2X1RJT0IxICksICAgLyogUGVyaXBoZXJhbCBBICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjE5X1RDTEsxICkgKTsgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVEMyX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBUQzIgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfVEMyX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1RDMiApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfVEMyX0NmZ1BJTyAqLw0KLyoqIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFRDMiBzaWduYWxzICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1RDMl9DZmdQSU8oIHZvaWQgKQ0Kew0KICAgIC8qIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUgKi8NCiAgICBBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KICAgICAgICBBVDkxQ19CQVNFX1BJT0IsICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BCMjhfVElPQjIgKSB8DQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQjI3X1RJT0EyICksIC8qIFBlcmlwaGVyYWwgQSAqLw0KICAgICAgICAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEIgKi8NCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9BLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIEFUOTFDX1BBMTVfVENMSzIgKSApOyAvKiBQZXJpcGhlcmFsIEIgKi8NCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9NQ19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgTUMgKi8NCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCl9faW5saW5lIHZvaWQgQVQ5MUZfTUNfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfU1lTICkgKTsNCn0NCg0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KLyoqIFxmbiAgICBBVDkxRl9QSU9BX0NmZ1BNQyAqLw0KLyoqIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBQSU9BICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT0FfQ2ZnUE1DKCB2b2lkICkNCnsNCiAgICBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQogICAgICAgIEFUOTFDX0JBU0VfUE1DLCAvKiBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MgKi8NCiAgICAgICAgKCAoIHVuc2lnbmVkIGludCApIDEgPDwgQVQ5MUNfSURfUElPQSApICk7DQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUElPQl9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUElPQiAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9CX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1BJT0IgKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgQ0FOICovDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdQTUMoIHZvaWQgKQ0Kew0KICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCiAgICAgICAgQVQ5MUNfQkFTRV9QTUMsIC8qIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcyAqLw0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgMSA8PCBBVDkxQ19JRF9DQU4gKSApOw0KfQ0KDQovKiotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovDQovKiogXGZuICAgIEFUOTFGX0NBTl9DZmdQSU8gKi8NCi8qKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBDQU4gc2lnbmFscyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnUElPKCB2b2lkICkNCnsNCiAgICAvKiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlICovDQogICAgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCiAgICAgICAgQVQ5MUNfQkFTRV9QSU9BLCAgICAgICAgICAgICAgICAgICAgICAgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSBBVDkxQ19QQTIwX0NBTlRYICkgfA0KICAgICAgICAoICggdW5zaWduZWQgaW50ICkgQVQ5MUNfUEExOV9DQU5SWCApLCAvKiBQZXJpcGhlcmFsIEEgKi8NCiAgICAgICAgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUGVyaXBoZXJhbCBCICovDQp9DQoNCi8qKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCi8qKiBcZm4gICAgQVQ5MUZfUFdNQ19DZmdQTUMgKi8NCi8qKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUFdNQyAqLw0KLyoqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NmZ1BNQyggdm9pZCApDQp7DQogICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KICAgICAgICBBVDkxQ19CQVNFX1BNQywgLyogUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzICovDQogICAgICAgICggKCB1bnNpZ25lZCBpbnQgKSAxIDw8IEFUOTFDX0lEX1BXTUMgKSApOw0KfQ0KDQojZW5kaWYgLy8gbGliX0FUOTFTQU03WDI1Nl9IDQo=