Ly8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiAgICAgICAgIEFUTUVMIE1pY3JvY29udHJvbGxlciBTb2Z0d2FyZSBTdXBwb3J0ICAtICBST1VTU0VUICAtDQovLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIERJU0NMQUlNRVI6ICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SDQovLyogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRg0KLy8qIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQgQVJFDQovLyogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwNCi8vKiBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UDQovLyogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsDQovLyogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KLy8qIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HDQovLyogTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLA0KLy8qIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQovLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIEZpbGUgTmFtZSAgICAgICAgICAgOiBsaWJfQVQ5MVNBTTdYMjU2LmgNCi8vKiBPYmplY3QgICAgICAgICAgICAgIDogQVQ5MVNBTTdYMjU2IGlubGluZWQgZnVuY3Rpb25zDQovLyogR2VuZXJhdGVkICAgICAgICAgICA6IEFUOTEgU1cgQXBwbGljYXRpb24gR3JvdXAgIDA1LzIwLzIwMDUgKDE2OjIyOjI5KQ0KLy8qDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGJndS5oLzEuMS9GcmkgSmFuIDMxIDEyOjE4OjQwIDIwMDMvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3BtY19TQU03WC5oLzEuMS9UdWUgRmViICAxIDA4OjMyOjEwIDIwMDUvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX1ZSRUdfNjA4NUIuaC8xLjEvVHVlIEZlYiAgMSAxNjoyMDo0NyAyMDA1Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9yc3RjXzYwOThBLmgvMS4xL1dlZCBPY3QgIDYgMTA6Mzk6MjAgMjAwNC8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfc3NjLmgvMS40L0ZyaSBKYW4gMzEgMTI6MTk6MjAgMjAwMy8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfd2R0Y182MDgwQS5oLzEuMS9XZWQgT2N0ICA2IDEwOjM4OjMwIDIwMDQvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3VzYXJ0LmgvMS41L1RodSBOb3YgMjEgMTY6MDE6NTQgMjAwMi8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfc3BpMi5oLzEuMS9Nb24gQXVnIDI1IDE0OjIzOjUyIDIwMDMvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3BpdGNfNjA3OUEuaC8xLjIvVHVlIE5vdiAgOSAxNDo0Mzo1NiAyMDA0Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9haWNfNjA3NWIuaC8xLjEvRnJpIE1heSAyMCAxNDowMToxOSAyMDA1Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9hZXNfNjE0OWEuaC8xLjEvTW9uIEphbiAxNyAwNzo0MzowOSAyMDA1Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl90d2kuaC8xLjMvTW9uIEp1bCAxOSAxNDoyNzo1OCAyMDA0Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9hZGMuaC8xLjYvRnJpIE9jdCAxNyAwOToxMjozOCAyMDAzLy8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9ydHRjXzYwODFBLmgvMS4xL1dlZCBPY3QgIDYgMTA6Mzk6MzggMjAwNC8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfdWRwLmgvMS40L1dlZCBGZWIgMTYgMDg6Mzk6MzQgMjAwNS8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGVzM182MTUwYS5oLzEuMS9Nb24gSmFuIDE3IDA5OjE5OjE5IDIwMDUvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3RjXzE3NTNiLmgvMS4xL0ZyaSBKYW4gMzEgMTI6MjA6MDIgMjAwMy8vDQovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfTUNfU0FNN1guaC8xLjEvVGh1IE1hciAyNSAxNToxOToxNCAyMDA0Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9waW8uaC8xLjMvRnJpIEphbiAzMSAxMjoxODo1NiAyMDAzLy8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9jYW5fQVQ5MS5oLzEuNC9GcmkgT2N0IDE3IDA5OjEyOjUwIDIwMDMvLw0KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX1BXTV9TQU0uaC8xLjMvVGh1IEphbiAyMiAxMDoxMDo1MCAyMDA0Ly8NCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9wZGMuaC8xLjIvVHVlIEp1bCAgMiAxMzoyOTo0MCAyMDAyLy8NCi8vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCiNpZm5kZWYgbGliX0FUOTFTQU03WDI1Nl9IDQojZGVmaW5lIGxpYl9BVDkxU0FNN1gyNTZfSA0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgQUlDDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KI2RlZmluZSBBVDkxQ19BSUNfQlJBTkNIX09QQ09ERSAoKHZvaWQgKCopICgpKSAweEU1MUZGRjIwKSAvLyBsZHIsIHBjLCBbcGMsICMtJkYyMF0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfQ29uZmlndXJlSXQNCi8vKiBcYnJpZWYgSW50ZXJydXB0IEhhbmRsZXIgSW5pdGlhbGl6YXRpb24NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BSUNfQ29uZmlndXJlSXQgKA0KCUFUOTFQU19BSUMgcEFpYywgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycw0KCXVuc2lnbmVkIGludCBpcnFfaWQsICAgICAvLyBcYXJnIGludGVycnVwdCBudW1iZXIgdG8gaW5pdGlhbGl6ZQ0KCXVuc2lnbmVkIGludCBwcmlvcml0eSwgICAvLyBcYXJnIHByaW9yaXR5IHRvIGdpdmUgdG8gdGhlIGludGVycnVwdA0KCXVuc2lnbmVkIGludCBzcmNfdHlwZSwgICAvLyBcYXJnIGFjdGl2YXRpb24gYW5kIHNlbnNlIG9mIGFjdGl2YXRpb24NCgl2b2lkICgqbmV3SGFuZGxlcikgKHZvaWQpICkgLy8gXGFyZyBhZGRyZXNzIG9mIHRoZSBpbnRlcnJ1cHQgaGFuZGxlcg0Kew0KCXVuc2lnbmVkIGludCBvbGRIYW5kbGVyOw0KICAgIHVuc2lnbmVkIGludCBtYXNrIDsNCg0KICAgIG9sZEhhbmRsZXIgPSBwQWljLT5BSUNfU1ZSW2lycV9pZF07DQoNCiAgICBtYXNrID0gMHgxIDw8IGlycV9pZCA7DQogICAgLy8qIERpc2FibGUgdGhlIGludGVycnVwdCBvbiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXINCiAgICBwQWljLT5BSUNfSURDUiA9IG1hc2sgOw0KICAgIC8vKiBTYXZlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lIHBvaW50ZXIgYW5kIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkNCiAgICBwQWljLT5BSUNfU1ZSW2lycV9pZF0gPSAodW5zaWduZWQgaW50KSBuZXdIYW5kbGVyIDsNCiAgICAvLyogU3RvcmUgdGhlIFNvdXJjZSBNb2RlIFJlZ2lzdGVyDQogICAgcEFpYy0+QUlDX1NNUltpcnFfaWRdID0gc3JjX3R5cGUgfCBwcmlvcml0eSAgOw0KICAgIC8vKiBDbGVhciB0aGUgaW50ZXJydXB0IG9uIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcg0KICAgIHBBaWMtPkFJQ19JQ0NSID0gbWFzayA7DQoNCglyZXR1cm4gb2xkSGFuZGxlcjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfRW5hYmxlSXQNCi8vKiBcYnJpZWYgRW5hYmxlIGNvcnJlc3BvbmRpbmcgSVQgbnVtYmVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FJQ19FbmFibGVJdCAoDQoJQVQ5MVBTX0FJQyBwQWljLCAgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycw0KCXVuc2lnbmVkIGludCBpcnFfaWQgKSAvLyBcYXJnIGludGVycnVwdCBudW1iZXIgdG8gaW5pdGlhbGl6ZQ0Kew0KICAgIC8vKiBFbmFibGUgdGhlIGludGVycnVwdCBvbiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXINCiAgICBwQWljLT5BSUNfSUVDUiA9IDB4MSA8PCBpcnFfaWQgOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FJQ19EaXNhYmxlSXQNCi8vKiBcYnJpZWYgRGlzYWJsZSBjb3JyZXNwb25kaW5nIElUIG51bWJlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfRGlzYWJsZUl0ICgNCglBVDkxUFNfQUlDIHBBaWMsICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzDQoJdW5zaWduZWQgaW50IGlycV9pZCApIC8vIFxhcmcgaW50ZXJydXB0IG51bWJlciB0byBpbml0aWFsaXplDQp7DQogICAgdW5zaWduZWQgaW50IG1hc2sgPSAweDEgPDwgaXJxX2lkOw0KICAgIC8vKiBEaXNhYmxlIHRoZSBpbnRlcnJ1cHQgb24gdGhlIGludGVycnVwdCBjb250cm9sbGVyDQogICAgcEFpYy0+QUlDX0lEQ1IgPSBtYXNrIDsNCiAgICAvLyogQ2xlYXIgdGhlIGludGVycnVwdCBvbiB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKCBpZiBvbmUgaXMgcGVuZGluZyApDQogICAgcEFpYy0+QUlDX0lDQ1IgPSBtYXNrIDsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfQ2xlYXJJdA0KLy8qIFxicmllZiBDbGVhciBjb3JyZXNwb25kaW5nIElUIG51bWJlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfQ2xlYXJJdCAoDQoJQVQ5MVBTX0FJQyBwQWljLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzDQoJdW5zaWduZWQgaW50IGlycV9pZCkgLy8gXGFyZyBpbnRlcnJ1cHQgbnVtYmVyIHRvIGluaXRpYWxpemUNCnsNCiAgICAvLyogQ2xlYXIgdGhlIGludGVycnVwdCBvbiB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKCBpZiBvbmUgaXMgcGVuZGluZyApDQogICAgcEFpYy0+QUlDX0lDQ1IgPSAoMHgxIDw8IGlycV9pZCk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUlDX0Fja25vd2xlZGdlSXQNCi8vKiBcYnJpZWYgQWNrbm93bGVkZ2UgY29ycmVzcG9uZGluZyBJVCBudW1iZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0Fja25vd2xlZGdlSXQgKA0KCUFUOTFQU19BSUMgcEFpYykgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycw0Kew0KICAgIHBBaWMtPkFJQ19FT0lDUiA9IHBBaWMtPkFJQ19FT0lDUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yDQovLyogXGJyaWVmIENvbmZpZ3VyZSB2ZWN0b3IgaGFuZGxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50ICBBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yICgNCgl1bnNpZ25lZCBpbnQgKnBWZWN0b3IsIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycw0KCXZvaWQgKCpIYW5kbGVyKSAoKSApICAgLy8gXGFyZyBJbnRlcnJ1cHQgSGFuZGxlcg0Kew0KCXVuc2lnbmVkIGludCBvbGRWZWN0b3IgPSAqcFZlY3RvcjsNCg0KCWlmICgodW5zaWduZWQgaW50KSBIYW5kbGVyID09ICh1bnNpZ25lZCBpbnQpIEFUOTFDX0FJQ19CUkFOQ0hfT1BDT0RFKQ0KCQkqcFZlY3RvciA9ICh1bnNpZ25lZCBpbnQpIEFUOTFDX0FJQ19CUkFOQ0hfT1BDT0RFOw0KCWVsc2UNCgkJKnBWZWN0b3IgPSAoKCgoKHVuc2lnbmVkIGludCkgSGFuZGxlcikgLSAoKHVuc2lnbmVkIGludCkgcFZlY3RvcikgLSAweDgpID4+IDIpICYgMHgwMEZGRkZGRikgfCAweEVBMDAwMDAwOw0KDQoJcmV0dXJuIG9sZFZlY3RvcjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfVHJpZw0KLy8qIFxicmllZiBUcmlnIGFuIElUDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkICBBVDkxRl9BSUNfVHJpZyAoDQoJQVQ5MVBTX0FJQyBwQWljLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzDQoJdW5zaWduZWQgaW50IGlycV9pZCkgLy8gXGFyZyBpbnRlcnJ1cHQgbnVtYmVyDQp7DQoJcEFpYy0+QUlDX0lTQ1IgPSAoMHgxIDw8IGlycV9pZCkgOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FJQ19Jc0FjdGl2ZQ0KLy8qIFxicmllZiBUZXN0IGlmIGFuIElUIGlzIGFjdGl2ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50ICBBVDkxRl9BSUNfSXNBY3RpdmUgKA0KCUFUOTFQU19BSUMgcEFpYywgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycw0KCXVuc2lnbmVkIGludCBpcnFfaWQpIC8vIFxhcmcgSW50ZXJydXB0IE51bWJlcg0Kew0KCXJldHVybiAocEFpYy0+QUlDX0lTUiAmICgweDEgPDwgaXJxX2lkKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUlDX0lzUGVuZGluZw0KLy8qIFxicmllZiBUZXN0IGlmIGFuIElUIGlzIHBlbmRpbmcNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCAgQVQ5MUZfQUlDX0lzUGVuZGluZyAoDQoJQVQ5MVBTX0FJQyBwQWljLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzDQoJdW5zaWduZWQgaW50IGlycV9pZCkgLy8gXGFyZyBJbnRlcnJ1cHQgTnVtYmVyDQp7DQoJcmV0dXJuIChwQWljLT5BSUNfSVBSICYgKDB4MSA8PCBpcnFfaWQpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfT3Blbg0KLy8qIFxicmllZiBTZXQgZXhjZXB0aW9uIHZlY3RvcnMgYW5kIEFJQyByZWdpc3RlcnMgdG8gZGVmYXVsdCB2YWx1ZXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX09wZW4oDQoJQVQ5MVBTX0FJQyBwQWljLCAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzDQoJdm9pZCAoKklycUhhbmRsZXIpICgpLCAgLy8gXGFyZyBEZWZhdWx0IElSUSB2ZWN0b3IgZXhjZXB0aW9uDQoJdm9pZCAoKkZpcUhhbmRsZXIpICgpLCAgLy8gXGFyZyBEZWZhdWx0IEZJUSB2ZWN0b3IgZXhjZXB0aW9uDQoJdm9pZCAoKkRlZmF1bHRIYW5kbGVyKSAgKCksIC8vIFxhcmcgRGVmYXVsdCBIYW5kbGVyIHNldCBpbiBJU1INCgl2b2lkICgqU3B1cmlvdXNIYW5kbGVyKSAoKSwgLy8gXGFyZyBEZWZhdWx0IFNwdXJpb3VzIEhhbmRsZXINCgl1bnNpZ25lZCBpbnQgcHJvdGVjdE1vZGUpICAgLy8gXGFyZyBEZWJ1ZyBDb250cm9sIFJlZ2lzdGVyDQp7DQoJaW50IGk7DQoNCgkvLyBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzIGFuZCBzZXQgSVZSIHRvIHRoZSBkZWZhdWx0IGhhbmRsZXINCglmb3IgKGkgPSAwOyBpIDwgMzI7ICsraSkgew0KCQlBVDkxRl9BSUNfRGlzYWJsZUl0KHBBaWMsIGkpOw0KCQlBVDkxRl9BSUNfQ29uZmlndXJlSXQocEFpYywgaSwgQVQ5MUNfQUlDX1BSSU9SX0xPV0VTVCwgQVQ5MUNfQUlDX1NSQ1RZUEVfSElHSF9MRVZFTCwgRGVmYXVsdEhhbmRsZXIpOw0KCX0NCg0KCS8vIFNldCB0aGUgSVJRIGV4Y2VwdGlvbiB2ZWN0b3INCglBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yKCh1bnNpZ25lZCBpbnQgKikgMHgxOCwgSXJxSGFuZGxlcik7DQoJLy8gU2V0IHRoZSBGYXN0IEludGVycnVwdCBleGNlcHRpb24gdmVjdG9yDQoJQVQ5MUZfQUlDX1NldEV4Y2VwdGlvblZlY3RvcigodW5zaWduZWQgaW50ICopIDB4MUMsIEZpcUhhbmRsZXIpOw0KDQoJcEFpYy0+QUlDX1NQVSA9ICh1bnNpZ25lZCBpbnQpIFNwdXJpb3VzSGFuZGxlcjsNCglwQWljLT5BSUNfRENSID0gcHJvdGVjdE1vZGU7DQp9DQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUERDDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfU2V0TmV4dFJ4DQovLyogXGJyaWVmIFNldCB0aGUgbmV4dCByZWNlaXZlIHRyYW5zZmVyIGRlc2NyaXB0b3INCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX1NldE5leHRSeCAoDQoJQVQ5MVBTX1BEQyBwUERDLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXINCgljaGFyICphZGRyZXNzLCAgICAgICAvLyBcYXJnIGFkZHJlc3MgdG8gdGhlIG5leHQgYmxvYyB0byBiZSByZWNlaXZlZA0KCXVuc2lnbmVkIGludCBieXRlcykgIC8vIFxhcmcgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHJlY2VpdmVkDQp7DQoJcFBEQy0+UERDX1JOUFIgPSAodW5zaWduZWQgaW50KSBhZGRyZXNzOw0KCXBQREMtPlBEQ19STkNSID0gYnl0ZXM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUERDX1NldE5leHRUeA0KLy8qIFxicmllZiBTZXQgdGhlIG5leHQgdHJhbnNtaXQgdHJhbnNmZXIgZGVzY3JpcHRvcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfU2V0TmV4dFR4ICgNCglBVDkxUFNfUERDIHBQREMsICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyDQoJY2hhciAqYWRkcmVzcywgICAgICAgICAvLyBcYXJnIGFkZHJlc3MgdG8gdGhlIG5leHQgYmxvYyB0byBiZSB0cmFuc21pdHRlZA0KCXVuc2lnbmVkIGludCBieXRlcykgICAgLy8gXGFyZyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgdHJhbnNtaXR0ZWQNCnsNCglwUERDLT5QRENfVE5QUiA9ICh1bnNpZ25lZCBpbnQpIGFkZHJlc3M7DQoJcFBEQy0+UERDX1ROQ1IgPSBieXRlczsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfU2V0UngNCi8vKiBcYnJpZWYgU2V0IHRoZSByZWNlaXZlIHRyYW5zZmVyIGRlc2NyaXB0b3INCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX1NldFJ4ICgNCglBVDkxUFNfUERDIHBQREMsICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyDQoJY2hhciAqYWRkcmVzcywgICAgICAgICAvLyBcYXJnIGFkZHJlc3MgdG8gdGhlIG5leHQgYmxvYyB0byBiZSByZWNlaXZlZA0KCXVuc2lnbmVkIGludCBieXRlcykgICAgLy8gXGFyZyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVjZWl2ZWQNCnsNCglwUERDLT5QRENfUlBSID0gKHVuc2lnbmVkIGludCkgYWRkcmVzczsNCglwUERDLT5QRENfUkNSID0gYnl0ZXM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUERDX1NldFR4DQovLyogXGJyaWVmIFNldCB0aGUgdHJhbnNtaXQgdHJhbnNmZXIgZGVzY3JpcHRvcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfU2V0VHggKA0KCUFUOTFQU19QREMgcFBEQywgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXINCgljaGFyICphZGRyZXNzLCAgICAgICAgIC8vIFxhcmcgYWRkcmVzcyB0byB0aGUgbmV4dCBibG9jIHRvIGJlIHRyYW5zbWl0dGVkDQoJdW5zaWduZWQgaW50IGJ5dGVzKSAgICAvLyBcYXJnIG51bWJlciBvZiBieXRlcyB0byBiZSB0cmFuc21pdHRlZA0Kew0KCXBQREMtPlBEQ19UUFIgPSAodW5zaWduZWQgaW50KSBhZGRyZXNzOw0KCXBQREMtPlBEQ19UQ1IgPSBieXRlczsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfRW5hYmxlVHgNCi8vKiBcYnJpZWYgRW5hYmxlIHRyYW5zbWl0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19FbmFibGVUeCAoDQoJQVQ5MVBTX1BEQyBwUERDICkgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXINCnsNCglwUERDLT5QRENfUFRDUiA9IEFUOTFDX1BEQ19UWFRFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfRW5hYmxlUngNCi8vKiBcYnJpZWYgRW5hYmxlIHJlY2VpdmUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX0VuYWJsZVJ4ICgNCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcg0Kew0KCXBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1JYVEVOOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BEQ19EaXNhYmxlVHgNCi8vKiBcYnJpZWYgRGlzYWJsZSB0cmFuc21pdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfRGlzYWJsZVR4ICgNCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcg0Kew0KCXBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1RYVERJUzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfRGlzYWJsZVJ4DQovLyogXGJyaWVmIERpc2FibGUgcmVjZWl2ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfRGlzYWJsZVJ4ICgNCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcg0Kew0KCXBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1JYVERJUzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfSXNUeEVtcHR5DQovLyogXGJyaWVmIFRlc3QgaWYgdGhlIGN1cnJlbnQgdHJhbnNmZXIgZGVzY3JpcHRvciBoYXMgYmVlbiBzZW50DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfUERDX0lzVHhFbXB0eSAoIC8vIFxyZXR1cm4gcmV0dXJuIDEgaWYgdHJhbnNmZXIgaXMgY29tcGxldGUNCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcg0Kew0KCXJldHVybiAhKHBQREMtPlBEQ19UQ1IpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BEQ19Jc05leHRUeEVtcHR5DQovLyogXGJyaWVmIFRlc3QgaWYgdGhlIG5leHQgdHJhbnNmZXIgZGVzY3JpcHRvciBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgY3VycmVudCB0ZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1BEQ19Jc05leHRUeEVtcHR5ICggLy8gXHJldHVybiByZXR1cm4gMSBpZiB0cmFuc2ZlciBpcyBjb21wbGV0ZQ0KCUFUOTFQU19QREMgcFBEQyApICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyDQp7DQoJcmV0dXJuICEocFBEQy0+UERDX1ROQ1IpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BEQ19Jc1J4RW1wdHkNCi8vKiBcYnJpZWYgVGVzdCBpZiB0aGUgY3VycmVudCB0cmFuc2ZlciBkZXNjcmlwdG9yIGhhcyBiZWVuIGZpbGxlZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1BEQ19Jc1J4RW1wdHkgKCAvLyBccmV0dXJuIHJldHVybiAxIGlmIHRyYW5zZmVyIGlzIGNvbXBsZXRlDQoJQVQ5MVBTX1BEQyBwUERDICkgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gIShwUERDLT5QRENfUkNSKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfSXNOZXh0UnhFbXB0eQ0KLy8qIFxicmllZiBUZXN0IGlmIHRoZSBuZXh0IHRyYW5zZmVyIGRlc2NyaXB0b3IgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIGN1cnJlbnQgdGQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9QRENfSXNOZXh0UnhFbXB0eSAoIC8vIFxyZXR1cm4gcmV0dXJuIDEgaWYgdHJhbnNmZXIgaXMgY29tcGxldGUNCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcg0Kew0KCXJldHVybiAhKHBQREMtPlBEQ19STkNSKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QRENfT3Blbg0KLy8qIFxicmllZiBPcGVuIFBEQzogZGlzYWJsZSBUWCBhbmQgUlggcmVzZXQgdHJhbnNmZXIgZGVzY3JpcHRvcnMsIHJlLWVuYWJsZSBSWCBhbmQgVFgNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX09wZW4gKA0KCUFUOTFQU19QREMgcFBEQykgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXINCnsNCiAgICAvLyogRGlzYWJsZSB0aGUgUlggYW5kIFRYIFBEQyB0cmFuc2ZlciByZXF1ZXN0cw0KCUFUOTFGX1BEQ19EaXNhYmxlUngocFBEQyk7DQoJQVQ5MUZfUERDX0Rpc2FibGVUeChwUERDKTsNCg0KCS8vKiBSZXNldCBhbGwgQ291bnRlciByZWdpc3RlciBOZXh0IGJ1ZmZlciBmaXJzdA0KCUFUOTFGX1BEQ19TZXROZXh0VHgocFBEQywgKGNoYXIgKikgMCwgMCk7DQoJQVQ5MUZfUERDX1NldE5leHRSeChwUERDLCAoY2hhciAqKSAwLCAwKTsNCglBVDkxRl9QRENfU2V0VHgocFBEQywgKGNoYXIgKikgMCwgMCk7DQoJQVQ5MUZfUERDX1NldFJ4KHBQREMsIChjaGFyICopIDAsIDApOw0KDQogICAgLy8qIEVuYWJsZSB0aGUgUlggYW5kIFRYIFBEQyB0cmFuc2ZlciByZXF1ZXN0cw0KCUFUOTFGX1BEQ19FbmFibGVSeChwUERDKTsNCglBVDkxRl9QRENfRW5hYmxlVHgocFBEQyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUERDX0Nsb3NlDQovLyogXGJyaWVmIENsb3NlIFBEQzogZGlzYWJsZSBUWCBhbmQgUlggcmVzZXQgdHJhbnNmZXIgZGVzY3JpcHRvcnMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX0Nsb3NlICgNCglBVDkxUFNfUERDIHBQREMpICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyDQp7DQogICAgLy8qIERpc2FibGUgdGhlIFJYIGFuZCBUWCBQREMgdHJhbnNmZXIgcmVxdWVzdHMNCglBVDkxRl9QRENfRGlzYWJsZVJ4KHBQREMpOw0KCUFUOTFGX1BEQ19EaXNhYmxlVHgocFBEQyk7DQoNCgkvLyogUmVzZXQgYWxsIENvdW50ZXIgcmVnaXN0ZXIgTmV4dCBidWZmZXIgZmlyc3QNCglBVDkxRl9QRENfU2V0TmV4dFR4KHBQREMsIChjaGFyICopIDAsIDApOw0KCUFUOTFGX1BEQ19TZXROZXh0UngocFBEQywgKGNoYXIgKikgMCwgMCk7DQoJQVQ5MUZfUERDX1NldFR4KHBQREMsIChjaGFyICopIDAsIDApOw0KCUFUOTFGX1BEQ19TZXRSeChwUERDLCAoY2hhciAqKSAwLCAwKTsNCg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BEQ19TZW5kRnJhbWUNCi8vKiBcYnJpZWYgQ2xvc2UgUERDOiBkaXNhYmxlIFRYIGFuZCBSWCByZXNldCB0cmFuc2ZlciBkZXNjcmlwdG9ycw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BEQ19TZW5kRnJhbWUoDQoJQVQ5MVBTX1BEQyBwUERDLA0KCWNoYXIgKnBCdWZmZXIsDQoJdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KCWNoYXIgKnBOZXh0QnVmZmVyLA0KCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KCWlmIChBVDkxRl9QRENfSXNUeEVtcHR5KHBQREMpKSB7DQoJCS8vKiBCdWZmZXIgYW5kIG5leHQgYnVmZmVyIGNhbiBiZSBpbml0aWFsaXplZA0KCQlBVDkxRl9QRENfU2V0VHgocFBEQywgcEJ1ZmZlciwgc3pCdWZmZXIpOw0KCQlBVDkxRl9QRENfU2V0TmV4dFR4KHBQREMsIHBOZXh0QnVmZmVyLCBzek5leHRCdWZmZXIpOw0KCQlyZXR1cm4gMjsNCgl9DQoJZWxzZSBpZiAoQVQ5MUZfUERDX0lzTmV4dFR4RW1wdHkocFBEQykpIHsNCgkJLy8qIE9ubHkgb25lIGJ1ZmZlciBjYW4gYmUgaW5pdGlhbGl6ZWQNCgkJQVQ5MUZfUERDX1NldE5leHRUeChwUERDLCBwQnVmZmVyLCBzekJ1ZmZlcik7DQoJCXJldHVybiAxOw0KCX0NCgllbHNlIHsNCgkJLy8qIEFsbCBidWZmZXIgYXJlIGluIHVzZS4uLg0KCQlyZXR1cm4gMDsNCgl9DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUERDX1JlY2VpdmVGcmFtZQ0KLy8qIFxicmllZiBDbG9zZSBQREM6IGRpc2FibGUgVFggYW5kIFJYIHJlc2V0IHRyYW5zZmVyIGRlc2NyaXB0b3JzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUERDX1JlY2VpdmVGcmFtZSAoDQoJQVQ5MVBTX1BEQyBwUERDLA0KCWNoYXIgKnBCdWZmZXIsDQoJdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KCWNoYXIgKnBOZXh0QnVmZmVyLA0KCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KCWlmIChBVDkxRl9QRENfSXNSeEVtcHR5KHBQREMpKSB7DQoJCS8vKiBCdWZmZXIgYW5kIG5leHQgYnVmZmVyIGNhbiBiZSBpbml0aWFsaXplZA0KCQlBVDkxRl9QRENfU2V0UngocFBEQywgcEJ1ZmZlciwgc3pCdWZmZXIpOw0KCQlBVDkxRl9QRENfU2V0TmV4dFJ4KHBQREMsIHBOZXh0QnVmZmVyLCBzek5leHRCdWZmZXIpOw0KCQlyZXR1cm4gMjsNCgl9DQoJZWxzZSBpZiAoQVQ5MUZfUERDX0lzTmV4dFJ4RW1wdHkocFBEQykpIHsNCgkJLy8qIE9ubHkgb25lIGJ1ZmZlciBjYW4gYmUgaW5pdGlhbGl6ZWQNCgkJQVQ5MUZfUERDX1NldE5leHRSeChwUERDLCBwQnVmZmVyLCBzekJ1ZmZlcik7DQoJCXJldHVybiAxOw0KCX0NCgllbHNlIHsNCgkJLy8qIEFsbCBidWZmZXIgYXJlIGluIHVzZS4uLg0KCQlyZXR1cm4gMDsNCgl9DQp9DQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgREJHVQ0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfREJHVV9JbnRlcnJ1cHRFbmFibGUNCi8vKiBcYnJpZWYgRW5hYmxlIERCR1UgSW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0RCR1VfSW50ZXJydXB0RW5hYmxlKA0KICAgICAgICBBVDkxUFNfREJHVSBwRGJndSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgREJHVSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBkYmd1IGludGVycnVwdCB0byBiZSBlbmFibGVkDQp7DQogICAgICAgIHBEYmd1LT5EQkdVX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfREJHVV9JbnRlcnJ1cHREaXNhYmxlDQovLyogXGJyaWVmIERpc2FibGUgREJHVSBJbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9JbnRlcnJ1cHREaXNhYmxlKA0KICAgICAgICBBVDkxUFNfREJHVSBwRGJndSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgREJHVSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBkYmd1IGludGVycnVwdCB0byBiZSBkaXNhYmxlZA0Kew0KICAgICAgICBwRGJndS0+REJHVV9JRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0RCR1VfR2V0SW50ZXJydXB0TWFza1N0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gREJHVSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9EQkdVX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gREJHVSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX0RCR1UgcERiZ3UpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBEQkdVIGNvbnRyb2xsZXINCnsNCiAgICAgICAgcmV0dXJuIHBEYmd1LT5EQkdVX0lNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9EQkdVX0lzSW50ZXJydXB0TWFza2VkDQovLyogXGJyaWVmIFRlc3QgaWYgREJHVSBJbnRlcnJ1cHQgaXMgTWFza2VkDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfREJHVV9Jc0ludGVycnVwdE1hc2tlZCgNCiAgICAgICAgQVQ5MVBTX0RCR1UgcERiZ3UsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIERCR1UgY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCiAgICAgICAgcmV0dXJuIChBVDkxRl9EQkdVX0dldEludGVycnVwdE1hc2tTdGF0dXMocERiZ3UpICYgZmxhZyk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQSU8NCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19DZmdQZXJpcGgNCi8vKiBcYnJpZWYgRW5hYmxlIHBpbnMgdG8gYmUgZHJpdmVkIGJ5IHBlcmlwaGVyYWwNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCglBVDkxUFNfUElPIHBQaW8sICAgICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IHBlcmlwaEFFbmFibGUsICAvLyBcYXJnIFBFUklQSCBBIHRvIGVuYWJsZQ0KCXVuc2lnbmVkIGludCBwZXJpcGhCRW5hYmxlKSAgLy8gXGFyZyBQRVJJUEggQiB0byBlbmFibGUNCg0Kew0KCXBQaW8tPlBJT19BU1IgPSBwZXJpcGhBRW5hYmxlOw0KCXBQaW8tPlBJT19CU1IgPSBwZXJpcGhCRW5hYmxlOw0KCXBQaW8tPlBJT19QRFIgPSAocGVyaXBoQUVuYWJsZSB8IHBlcmlwaEJFbmFibGUpOyAvLyBTZXQgaW4gUGVyaXBoIG1vZGUNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2ZnT3V0cHV0DQovLyogXGJyaWVmIEVuYWJsZSBQSU8gaW4gb3V0cHV0IG1vZGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ091dHB1dCgNCglBVDkxUFNfUElPIHBQaW8sICAgICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IHBpb0VuYWJsZSkgICAgICAvLyBcYXJnIFBJTyB0byBiZSBlbmFibGVkDQp7DQoJcFBpby0+UElPX1BFUiA9IHBpb0VuYWJsZTsgLy8gU2V0IGluIFBJTyBtb2RlDQoJcFBpby0+UElPX09FUiA9IHBpb0VuYWJsZTsgLy8gQ29uZmlndXJlIGluIE91dHB1dA0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19DZmdJbnB1dA0KLy8qIFxicmllZiBFbmFibGUgUElPIGluIGlucHV0IG1vZGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ0lucHV0KA0KCUFUOTFQU19QSU8gcFBpbywgICAgICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgaW5wdXRFbmFibGUpICAgICAgLy8gXGFyZyBQSU8gdG8gYmUgZW5hYmxlZA0Kew0KCS8vIERpc2FibGUgb3V0cHV0DQoJcFBpby0+UElPX09EUiAgPSBpbnB1dEVuYWJsZTsNCglwUGlvLT5QSU9fUEVSICA9IGlucHV0RW5hYmxlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19DZmdPcGVuZHJhaW4NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBpbiBvcGVuIGRyYWluDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdPcGVuZHJhaW4oDQoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBtdWx0aURydkVuYWJsZSkgLy8gXGFyZyBwaW8gdG8gYmUgY29uZmlndXJlZCBpbiBvcGVuIGRyYWluDQp7DQoJLy8gQ29uZmlndXJlIHRoZSBtdWx0aS1kcml2ZSBvcHRpb24NCglwUGlvLT5QSU9fTUREUiA9IH5tdWx0aURydkVuYWJsZTsNCglwUGlvLT5QSU9fTURFUiA9IG11bHRpRHJ2RW5hYmxlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19DZmdQdWxsdXANCi8vKiBcYnJpZWYgRW5hYmxlIHB1bGx1cCBvbiBQSU8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ1B1bGx1cCgNCglBVDkxUFNfUElPIHBQaW8sICAgICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IHB1bGx1cEVuYWJsZSkgICAvLyBcYXJnIGVuYWJsZSBwdWxsdXAgb24gUElPDQp7DQoJCS8vIENvbm5lY3Qgb3Igbm90IFB1bGx1cA0KCXBQaW8tPlBJT19QUFVEUiA9IH5wdWxsdXBFbmFibGU7DQoJcFBpby0+UElPX1BQVUVSID0gcHVsbHVwRW5hYmxlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19DZmdEaXJlY3REcml2ZQ0KLy8qIFxicmllZiBFbmFibGUgZGlyZWN0IGRyaXZlIG9uIFBJTw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2ZnRGlyZWN0RHJpdmUoDQoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBkaXJlY3REcml2ZSkgICAgLy8gXGFyZyBQSU8gdG8gYmUgY29uZmlndXJlZCB3aXRoIGRpcmVjdCBkcml2ZQ0KDQp7DQoJLy8gQ29uZmlndXJlIHRoZSBEaXJlY3QgRHJpdmUNCglwUGlvLT5QSU9fT1dEUiAgPSB+ZGlyZWN0RHJpdmU7DQoJcFBpby0+UElPX09XRVIgID0gZGlyZWN0RHJpdmU7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0NmZ0lucHV0RmlsdGVyDQovLyogXGJyaWVmIEVuYWJsZSBpbnB1dCBmaWx0ZXIgb24gaW5wdXQgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdJbnB1dEZpbHRlcigNCglBVDkxUFNfUElPIHBQaW8sICAgICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGlucHV0RmlsdGVyKSAgICAvLyBcYXJnIFBJTyB0byBiZSBjb25maWd1cmVkIHdpdGggaW5wdXQgZmlsdGVyDQoNCnsNCgkvLyBDb25maWd1cmUgdGhlIERpcmVjdCBEcml2ZQ0KCXBQaW8tPlBJT19JRkRSICA9IH5pbnB1dEZpbHRlcjsNCglwUGlvLT5QSU9fSUZFUiAgPSBpbnB1dEZpbHRlcjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fR2V0SW5wdXQNCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBpbnB1dCB2YWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRJbnB1dCggLy8gXHJldHVybiBQSU8gaW5wdXQNCglBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0Kew0KCXJldHVybiBwUGlvLT5QSU9fUERTUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSXNJbnB1dFNldA0KLy8qIFxicmllZiBUZXN0IGlmIFBJTyBpcyBpbnB1dCBmbGFnIGlzIGFjdGl2ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0lucHV0U2V0KA0KCUFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCglyZXR1cm4gKEFUOTFGX1BJT19HZXRJbnB1dChwUGlvKSAmIGZsYWcpOw0KfQ0KDQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX1NldE91dHB1dA0KLy8qIFxicmllZiBTZXQgdG8gMSBvdXRwdXQgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19TZXRPdXRwdXQoDQoJQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBvdXRwdXQgdG8gYmUgc2V0DQp7DQoJcFBpby0+UElPX1NPRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19DbGVhck91dHB1dA0KLy8qIFxicmllZiBTZXQgdG8gMCBvdXRwdXQgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DbGVhck91dHB1dCgNCglBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIG91dHB1dCB0byBiZSBjbGVhcmVkDQp7DQoJcFBpby0+UElPX0NPRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19Gb3JjZU91dHB1dA0KLy8qIFxicmllZiBGb3JjZSBvdXRwdXQgd2hlbiBEaXJlY3QgZHJpdmUgb3B0aW9uIGlzIGVuYWJsZWQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0ZvcmNlT3V0cHV0KA0KCUFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgb3V0cHV0IHRvIGJlIGZvcmNlZA0Kew0KCXBQaW8tPlBJT19PRFNSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fRW5hYmxlDQovLyogXGJyaWVmIEVuYWJsZSBQSU8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0VuYWJsZSgNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIHRvIGJlIGVuYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX1BFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0Rpc2FibGUNCi8vKiBcYnJpZWYgRGlzYWJsZSBQSU8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0Rpc2FibGUoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyB0byBiZSBkaXNhYmxlZA0Kew0KICAgICAgICBwUGlvLT5QSU9fUERSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fR2V0U3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBQSU8gU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldFN0YXR1cyggLy8gXHJldHVybiBQSU8gU3RhdHVzDQogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQp7DQogICAgICAgIHJldHVybiBwUGlvLT5QSU9fUFNSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19Jc1NldA0KLy8qIFxicmllZiBUZXN0IGlmIFBJTyBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNTZXQoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldFN0YXR1cyhwUGlvKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19PdXRwdXRFbmFibGUNCi8vKiBcYnJpZWYgT3V0cHV0IEVuYWJsZSBQSU8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX091dHB1dEVuYWJsZSgNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIG91dHB1dCB0byBiZSBlbmFibGVkDQp7DQogICAgICAgIHBQaW8tPlBJT19PRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19PdXRwdXREaXNhYmxlDQovLyogXGJyaWVmIE91dHB1dCBFbmFibGUgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19PdXRwdXREaXNhYmxlKA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gb3V0cHV0IHRvIGJlIGRpc2FibGVkDQp7DQogICAgICAgIHBQaW8tPlBJT19PRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXRTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBPdXRwdXQgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldE91dHB1dFN0YXR1cyggLy8gXHJldHVybiBQSU8gT3V0cHV0IFN0YXR1cw0KICAgICAgICBBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFBpby0+UElPX09TUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSXNPdXB1dFNldA0KLy8qIFxicmllZiBUZXN0IGlmIFBJTyBPdXRwdXQgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzT3V0cHV0U2V0KA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KICAgICAgICByZXR1cm4gKEFUOTFGX1BJT19HZXRPdXRwdXRTdGF0dXMocFBpbykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSW5wdXRGaWx0ZXJFbmFibGUNCi8vKiBcYnJpZWYgSW5wdXQgRmlsdGVyIEVuYWJsZSBQSU8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0lucHV0RmlsdGVyRW5hYmxlKA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gaW5wdXQgZmlsdGVyIHRvIGJlIGVuYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX0lGRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19JbnB1dEZpbHRlckRpc2FibGUNCi8vKiBcYnJpZWYgSW5wdXQgRmlsdGVyIERpc2FibGUgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19JbnB1dEZpbHRlckRpc2FibGUoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBpbnB1dCBmaWx0ZXIgdG8gYmUgZGlzYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX0lGRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRJbnB1dEZpbHRlclN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gUElPIElucHV0IEZpbHRlciBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0SW5wdXRGaWx0ZXJTdGF0dXMoIC8vIFxyZXR1cm4gUElPIElucHV0IEZpbHRlciBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCnsNCiAgICAgICAgcmV0dXJuIHBQaW8tPlBJT19JRlNSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0lucHV0RmlsdGVyU2V0DQovLyogXGJyaWVmIFRlc3QgaWYgUElPIElucHV0IGZpbHRlciBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNJbnB1dEZpbHRlclNldCgNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0SW5wdXRGaWx0ZXJTdGF0dXMocFBpbykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fR2V0T3V0cHV0RGF0YVN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gUElPIE91dHB1dCBEYXRhIFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRPdXRwdXREYXRhU3RhdHVzKCAvLyBccmV0dXJuIFBJTyBPdXRwdXQgRGF0YSBTdGF0dXMNCglBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFBpby0+UElPX09EU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0ludGVycnVwdEVuYWJsZQ0KLy8qIFxicmllZiBFbmFibGUgUElPIEludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fSW50ZXJydXB0RW5hYmxlKA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gaW50ZXJydXB0IHRvIGJlIGVuYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0ludGVycnVwdERpc2FibGUNCi8vKiBcYnJpZWYgRGlzYWJsZSBQSU8gSW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19JbnRlcnJ1cHREaXNhYmxlKA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gaW50ZXJydXB0IHRvIGJlIGRpc2FibGVkDQp7DQogICAgICAgIHBQaW8tPlBJT19JRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBQSU8gSW50ZXJydXB0IE1hc2sgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gUElPIEludGVycnVwdCBNYXNrIFN0YXR1cw0KICAgICAgICBBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFBpby0+UElPX0lNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fR2V0SW50ZXJydXB0U3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBQSU8gSW50ZXJydXB0IFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRJbnRlcnJ1cHRTdGF0dXMoIC8vIFxyZXR1cm4gUElPIEludGVycnVwdCBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCnsNCiAgICAgICAgcmV0dXJuIHBQaW8tPlBJT19JU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0lzSW50ZXJydXB0TWFza2VkDQovLyogXGJyaWVmIFRlc3QgaWYgUElPIEludGVycnVwdCBpcyBNYXNrZWQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldEludGVycnVwdE1hc2tTdGF0dXMocFBpbykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSXNJbnRlcnJ1cHRTZXQNCi8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gSW50ZXJydXB0IGlzIFNldA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0ludGVycnVwdFNldCgNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0SW50ZXJydXB0U3RhdHVzKHBQaW8pICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX011bHRpRHJpdmVyRW5hYmxlDQovLyogXGJyaWVmIE11bHRpIERyaXZlciBFbmFibGUgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19NdWx0aURyaXZlckVuYWJsZSgNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIHRvIGJlIGVuYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX01ERVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19NdWx0aURyaXZlckRpc2FibGUNCi8vKiBcYnJpZWYgTXVsdGkgRHJpdmVyIERpc2FibGUgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19NdWx0aURyaXZlckRpc2FibGUoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyB0byBiZSBkaXNhYmxlZA0Kew0KICAgICAgICBwUGlvLT5QSU9fTUREUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldE11bHRpRHJpdmVyU3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBQSU8gTXVsdGkgRHJpdmVyIFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRNdWx0aURyaXZlclN0YXR1cyggLy8gXHJldHVybiBQSU8gTXVsdGkgRHJpdmVyIFN0YXR1cw0KICAgICAgICBBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0Kew0KICAgICAgICByZXR1cm4gcFBpby0+UElPX01EU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0lzTXVsdGlEcml2ZXJTZXQNCi8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gTXVsdGlEcml2ZXIgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzTXVsdGlEcml2ZXJTZXQoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldE11bHRpRHJpdmVyU3RhdHVzKHBQaW8pICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0FfUmVnaXN0ZXJTZWxlY3Rpb24NCi8vKiBcYnJpZWYgUElPIEEgUmVnaXN0ZXIgU2VsZWN0aW9uDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19BX1JlZ2lzdGVyU2VsZWN0aW9uKA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gQSByZWdpc3RlciBzZWxlY3Rpb24NCnsNCiAgICAgICAgcFBpby0+UElPX0FTUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0JfUmVnaXN0ZXJTZWxlY3Rpb24NCi8vKiBcYnJpZWYgUElPIEIgUmVnaXN0ZXIgU2VsZWN0aW9uDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19CX1JlZ2lzdGVyU2VsZWN0aW9uKA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gQiByZWdpc3RlciBzZWxlY3Rpb24NCnsNCiAgICAgICAgcFBpby0+UElPX0JTUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldF9BQl9SZWdpc3RlclN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gUElPIEludGVycnVwdCBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0X0FCX1JlZ2lzdGVyU3RhdHVzKCAvLyBccmV0dXJuIFBJTyBBQiBSZWdpc3RlciBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCnsNCiAgICAgICAgcmV0dXJuIHBQaW8tPlBJT19BQlNSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0FCX1JlZ2lzdGVyU2V0DQovLyogXGJyaWVmIFRlc3QgaWYgUElPIEFCIFJlZ2lzdGVyIGlzIFNldA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0FCX1JlZ2lzdGVyU2V0KA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KICAgICAgICByZXR1cm4gKEFUOTFGX1BJT19HZXRfQUJfUmVnaXN0ZXJTdGF0dXMocFBpbykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9fT3V0cHV0V3JpdGVFbmFibGUNCi8vKiBcYnJpZWYgT3V0cHV0IFdyaXRlIEVuYWJsZSBQSU8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX091dHB1dFdyaXRlRW5hYmxlKA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gb3V0cHV0IHdyaXRlIHRvIGJlIGVuYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX09XRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19PdXRwdXRXcml0ZURpc2FibGUNCi8vKiBcYnJpZWYgT3V0cHV0IFdyaXRlIERpc2FibGUgUElPDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19PdXRwdXRXcml0ZURpc2FibGUoDQogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBvdXRwdXQgd3JpdGUgdG8gYmUgZGlzYWJsZWQNCnsNCiAgICAgICAgcFBpby0+UElPX09XRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXRXcml0ZVN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gUElPIE91dHB1dCBXcml0ZSBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0T3V0cHV0V3JpdGVTdGF0dXMoIC8vIFxyZXR1cm4gUElPIE91dHB1dCBXcml0ZSBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXINCnsNCiAgICAgICAgcmV0dXJuIHBQaW8tPlBJT19PV1NSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19Jc091dHB1dFdyaXRlU2V0DQovLyogXGJyaWVmIFRlc3QgaWYgUElPIE91dHB1dFdyaXRlIGlzIFNldA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc091dHB1dFdyaXRlU2V0KA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KICAgICAgICByZXR1cm4gKEFUOTFGX1BJT19HZXRPdXRwdXRXcml0ZVN0YXR1cyhwUGlvKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRDZmdQdWxsdXANCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBDb25maWd1cmF0aW9uIFB1bGx1cA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRDZmdQdWxsdXAoIC8vIFxyZXR1cm4gUElPIENvbmZpZ3VyYXRpb24gUHVsbHVwDQogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQp7DQogICAgICAgIHJldHVybiBwUGlvLT5QSU9fUFBVU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPX0lzT3V0cHV0RGF0YVN0YXR1c1NldA0KLy8qIFxicmllZiBUZXN0IGlmIFBJTyBPdXRwdXQgRGF0YSBTdGF0dXMgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzT3V0cHV0RGF0YVN0YXR1c1NldCgNCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0T3V0cHV0RGF0YVN0YXR1cyhwUGlvKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0NmZ1B1bGx1cFN0YXR1c1NldA0KLy8qIFxicmllZiBUZXN0IGlmIFBJTyBDb25maWd1cmF0aW9uIFB1bGx1cCBTdGF0dXMgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzQ2ZnUHVsbHVwU3RhdHVzU2V0KA0KICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KICAgICAgICByZXR1cm4gKH5BVDkxRl9QSU9fR2V0Q2ZnUHVsbHVwKHBQaW8pICYgZmxhZyk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQTUMNCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19DZmdTeXNDbGtFbmFibGVSZWcNCi8vKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBTeXN0ZW0gQ2xvY2sgRW5hYmxlIFJlZ2lzdGVyIG9mIHRoZSBQTUMgY29udHJvbGxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnU3lzQ2xrRW5hYmxlUmVnICgNCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBtb2RlKQ0Kew0KCS8vKiBXcml0ZSB0byB0aGUgU0NFUiByZWdpc3Rlcg0KCXBQTUMtPlBNQ19TQ0VSID0gbW9kZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfQ2ZnU3lzQ2xrRGlzYWJsZVJlZw0KLy8qIFxicmllZiBDb25maWd1cmUgdGhlIFN5c3RlbSBDbG9jayBEaXNhYmxlIFJlZ2lzdGVyIG9mIHRoZSBQTUMgY29udHJvbGxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnU3lzQ2xrRGlzYWJsZVJlZyAoDQoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgbW9kZSkNCnsNCgkvLyogV3JpdGUgdG8gdGhlIFNDRFIgcmVnaXN0ZXINCglwUE1DLT5QTUNfU0NEUiA9IG1vZGU7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldFN5c0Nsa1N0YXR1c1JlZw0KLy8qIFxicmllZiBSZXR1cm4gdGhlIFN5c3RlbSBDbG9jayBTdGF0dXMgUmVnaXN0ZXIgb2YgdGhlIFBNQyBjb250cm9sbGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0dldFN5c0Nsa1N0YXR1c1JlZyAoDQoJQVQ5MVBTX1BNQyBwUE1DIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcFBNQy0+UE1DX1NDU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrDQovLyogXGJyaWVmIEVuYWJsZSBwZXJpcGhlcmFsIGNsb2NrDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jayAoDQoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgcGVyaXBoSWRzKSAgLy8gXGFyZyBJRHMgb2YgcGVyaXBoZXJhbHMgdG8gZW5hYmxlDQp7DQoJcFBNQy0+UE1DX1BDRVIgPSBwZXJpcGhJZHM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0Rpc2FibGVQZXJpcGhDbG9jaw0KLy8qIFxicmllZiBEaXNhYmxlIHBlcmlwaGVyYWwgY2xvY2sNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0Rpc2FibGVQZXJpcGhDbG9jayAoDQoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgcGVyaXBoSWRzKSAgLy8gXGFyZyBJRHMgb2YgcGVyaXBoZXJhbHMgdG8gZW5hYmxlDQp7DQoJcFBNQy0+UE1DX1BDRFIgPSBwZXJpcGhJZHM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldFBlcmlwaENsb2NrDQovLyogXGJyaWVmIEdldCBwZXJpcGhlcmFsIGNsb2NrIHN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRQZXJpcGhDbG9jayAoDQoJQVQ5MVBTX1BNQyBwUE1DKSAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcFBNQy0+UE1DX1BDU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0tHUl9DZmdNYWluT3NjaWxsYXRvclJlZw0KLy8qIFxicmllZiBDZmcgdGhlIG1haW4gb3NjaWxsYXRvcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9DS0dSX0NmZ01haW5Pc2NpbGxhdG9yUmVnICgNCglBVDkxUFNfQ0tHUiBwQ0tHUiwgLy8gXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBtb2RlKQ0Kew0KCXBDS0dSLT5DS0dSX01PUiA9IG1vZGU7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0tHUl9HZXRNYWluT3NjaWxsYXRvclJlZw0KLy8qIFxicmllZiBDZmcgdGhlIG1haW4gb3NjaWxsYXRvcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NLR1JfR2V0TWFpbk9zY2lsbGF0b3JSZWcgKA0KCUFUOTFQU19DS0dSIHBDS0dSKSAvLyBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBDS0dSLT5DS0dSX01PUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DS0dSX0VuYWJsZU1haW5Pc2NpbGxhdG9yDQovLyogXGJyaWVmIEVuYWJsZSB0aGUgbWFpbiBvc2NpbGxhdG9yDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NLR1JfRW5hYmxlTWFpbk9zY2lsbGF0b3IoDQoJQVQ5MVBTX0NLR1IgcENLR1IpIC8vIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXINCnsNCglwQ0tHUi0+Q0tHUl9NT1IgfD0gQVQ5MUNfQ0tHUl9NT1NDRU47DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0tHUl9EaXNhYmxlTWFpbk9zY2lsbGF0b3INCi8vKiBcYnJpZWYgRGlzYWJsZSB0aGUgbWFpbiBvc2NpbGxhdG9yDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NLR1JfRGlzYWJsZU1haW5Pc2NpbGxhdG9yICgNCglBVDkxUFNfQ0tHUiBwQ0tHUikgLy8gXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlcg0Kew0KCXBDS0dSLT5DS0dSX01PUiAmPSB+QVQ5MUNfQ0tHUl9NT1NDRU47DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0tHUl9DZmdNYWluT3NjU3RhcnRVcFRpbWUNCi8vKiBcYnJpZWYgQ2ZnIE1PUiBSZWdpc3RlciBhY2NvcmRpbmcgdG8gdGhlIG1haW4gb3NjIHN0YXJ0dXAgdGltZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9DS0dSX0NmZ01haW5Pc2NTdGFydFVwVGltZSAoDQoJQVQ5MVBTX0NLR1IgcENLR1IsIC8vIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgc3RhcnR1cF90aW1lLCAgLy8gXGFyZyBtYWluIG9zYyBzdGFydHVwIHRpbWUgaW4gbWljcm9zZWNvbmQgKHVzKQ0KCXVuc2lnbmVkIGludCBzbG93Q2xvY2spICAvLyBcYXJnIHNsb3dDbG9jayBpbiBIeg0Kew0KCXBDS0dSLT5DS0dSX01PUiAmPSB+QVQ5MUNfQ0tHUl9PU0NPVU5UOw0KCXBDS0dSLT5DS0dSX01PUiB8PSAoKHNsb3dDbG9jayAqIHN0YXJ0dXBfdGltZSkvKDgqMTAwMDAwMCkpIDw8IDg7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2tGcmVxUmVnDQovLyogXGJyaWVmIENmZyB0aGUgbWFpbiBvc2NpbGxhdG9yDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2tGcmVxUmVnICgNCglBVDkxUFNfQ0tHUiBwQ0tHUikgLy8gXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlcg0Kew0KCXJldHVybiBwQ0tHUi0+Q0tHUl9NQ0ZSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NLR1JfR2V0TWFpbkNsb2NrDQovLyogXGJyaWVmIFJldHVybiBNYWluIGNsb2NrIGluIEh6DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0tHUl9HZXRNYWluQ2xvY2sgKA0KCUFUOTFQU19DS0dSIHBDS0dSLCAvLyBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IHNsb3dDbG9jaykgIC8vIFxhcmcgc2xvd0Nsb2NrIGluIEh6DQp7DQoJcmV0dXJuICgocENLR1ItPkNLR1JfTUNGUiAgJiBBVDkxQ19DS0dSX01BSU5GKSAqIHNsb3dDbG9jaykgPj4gNDsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfQ2ZnTUNLUmVnDQovLyogXGJyaWVmIENmZyBNYXN0ZXIgQ2xvY2sgUmVnaXN0ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0NmZ01DS1JlZyAoDQoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgbW9kZSkNCnsNCglwUE1DLT5QTUNfTUNLUiA9IG1vZGU7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldE1DS1JlZw0KLy8qIFxicmllZiBSZXR1cm4gTWFzdGVyIENsb2NrIFJlZ2lzdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0dldE1DS1JlZygNCglBVDkxUFNfUE1DIHBQTUMpIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcg0Kew0KCXJldHVybiBwUE1DLT5QTUNfTUNLUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19HZXRNYXN0ZXJDbG9jaw0KLy8qIFxicmllZiBSZXR1cm4gbWFzdGVyIGNsb2NrIGluIEh6IHdoaWNoIGNvcnJlcG9uZHMgdG8gcHJvY2Vzc29yIGNsb2NrIGZvciBBUk03DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0TWFzdGVyQ2xvY2sgKA0KCUFUOTFQU19QTUMgcFBNQywgLy8gXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyDQoJQVQ5MVBTX0NLR1IgcENLR1IsIC8vIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgc2xvd0Nsb2NrKSAgLy8gXGFyZyBzbG93Q2xvY2sgaW4gSHoNCnsNCgl1bnNpZ25lZCBpbnQgcmVnID0gcFBNQy0+UE1DX01DS1I7DQoJdW5zaWduZWQgaW50IHByZXNjYWxlciA9ICgxIDw8ICgocmVnICYgQVQ5MUNfUE1DX1BSRVMpID4+IDIpKTsNCgl1bnNpZ25lZCBpbnQgcGxsRGl2aWRlciwgcGxsTXVsdGlwbGllcjsNCg0KCXN3aXRjaCAocmVnICYgQVQ5MUNfUE1DX0NTUykgew0KCQljYXNlIEFUOTFDX1BNQ19DU1NfU0xPV19DTEs6IC8vIFNsb3cgY2xvY2sgc2VsZWN0ZWQNCgkJCXJldHVybiBzbG93Q2xvY2sgLyBwcmVzY2FsZXI7DQoJCWNhc2UgQVQ5MUNfUE1DX0NTU19NQUlOX0NMSzogLy8gTWFpbiBjbG9jayBpcyBzZWxlY3RlZA0KCQkJcmV0dXJuIEFUOTFGX0NLR1JfR2V0TWFpbkNsb2NrKHBDS0dSLCBzbG93Q2xvY2spIC8gcHJlc2NhbGVyOw0KCQljYXNlIEFUOTFDX1BNQ19DU1NfUExMX0NMSzogLy8gUExMQiBjbG9jayBpcyBzZWxlY3RlZA0KCQkJcmVnID0gcENLR1ItPkNLR1JfUExMUjsNCgkJCXBsbERpdmlkZXIgICAgPSAocmVnICAmIEFUOTFDX0NLR1JfRElWKTsNCgkJCXBsbE11bHRpcGxpZXIgPSAoKHJlZyAgJiBBVDkxQ19DS0dSX01VTCkgPj4gMTYpICsgMTsNCgkJCXJldHVybiBBVDkxRl9DS0dSX0dldE1haW5DbG9jayhwQ0tHUiwgc2xvd0Nsb2NrKSAvIHBsbERpdmlkZXIgKiBwbGxNdWx0aXBsaWVyIC8gcHJlc2NhbGVyOw0KCX0NCglyZXR1cm4gMDsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfRW5hYmxlUENLDQovLyogXGJyaWVmIEVuYWJsZSBwZXJpcGhlcmFsIGNsb2NrDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19FbmFibGVQQ0sgKA0KCUFUOTFQU19QTUMgcFBNQywgLy8gXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IHBjaywgIC8vIFxhcmcgUGVyaXBoZXJhbCBjbG9jayBpZGVudGlmaWVyIDAgLi4gNw0KCXVuc2lnbmVkIGludCBtb2RlKQ0Kew0KCXBQTUMtPlBNQ19QQ0tSW3Bja10gPSBtb2RlOw0KCXBQTUMtPlBNQ19TQ0VSID0gKDEgPDwgcGNrKSA8PCA4Ow0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19EaXNhYmxlUENLDQovLyogXGJyaWVmIEVuYWJsZSBwZXJpcGhlcmFsIGNsb2NrDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19EaXNhYmxlUENLICgNCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBwY2spICAvLyBcYXJnIFBlcmlwaGVyYWwgY2xvY2sgaWRlbnRpZmllciAwIC4uIDcNCnsNCglwUE1DLT5QTUNfU0NEUiA9ICgxIDw8IHBjaykgPDwgODsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfRW5hYmxlSXQNCi8vKiBcYnJpZWYgRW5hYmxlIFBNQyBpbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0VuYWJsZUl0ICgNCglBVDkxUFNfUE1DIHBQTUMsICAgICAvLyBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBJVCB0byBiZSBlbmFibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXINCglwUE1DLT5QTUNfSUVSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QTUNfRGlzYWJsZUl0DQovLyogXGJyaWVmIERpc2FibGUgUE1DIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRGlzYWJsZUl0ICgNCglBVDkxUFNfUE1DIHBQTUMsIC8vIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAvLyBJVCB0byBiZSBkaXNhYmxlZA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyDQoJcFBNQy0+UE1DX0lEUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldFN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gUE1DIEludGVycnVwdCBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfR2V0U3RhdHVzKCAvLyBccmV0dXJuIFBNQyBJbnRlcnJ1cHQgU3RhdHVzDQoJQVQ5MVBTX1BNQyBwUE1DKSAvLyBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcFBNQy0+UE1DX1NSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBQTUMgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gUE1DIEludGVycnVwdCBNYXNrIFN0YXR1cw0KCUFUOTFQU19QTUMgcFBNQykgLy8gcG9pbnRlciB0byBhIFBNQyBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBQTUMtPlBNQ19JTVI7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0lzSW50ZXJydXB0TWFza2VkDQovLyogXGJyaWVmIFRlc3QgaWYgUE1DIEludGVycnVwdCBpcyBNYXNrZWQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19QTUMgcFBNQywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9QTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwUE1DKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19Jc1N0YXR1c1NldA0KLy8qIFxicmllZiBUZXN0IGlmIFBNQyBTdGF0dXMgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0lzU3RhdHVzU2V0KA0KICAgICAgICBBVDkxUFNfUE1DIHBQTUMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBNQyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KCXJldHVybiAoQVQ5MUZfUE1DX0dldFN0YXR1cyhwUE1DKSAmIGZsYWcpOw0KfS8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBSU1RDDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9SU1RTb2Z0UmVzZXQNCi8vKiBcYnJpZWYgU3RhcnQgU29mdHdhcmUgUmVzZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUlNUU29mdFJlc2V0KA0KICAgICAgICBBVDkxUFNfUlNUQyBwUlNUQywNCiAgICAgICAgdW5zaWduZWQgaW50IHJlc2V0KQ0Kew0KCXBSU1RDLT5SU1RDX1JDUiA9ICgweEE1MDAwMDAwIHwgcmVzZXQpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1JTVFNldE1vZGUNCi8vKiBcYnJpZWYgU2V0IFJlc2V0IE1vZGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUlNUU2V0TW9kZSgNCiAgICAgICAgQVQ5MVBTX1JTVEMgcFJTVEMsDQogICAgICAgIHVuc2lnbmVkIGludCBtb2RlKQ0Kew0KCXBSU1RDLT5SU1RDX1JNUiA9ICgweEE1MDAwMDAwIHwgbW9kZSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUlNUR2V0TW9kZQ0KLy8qIFxicmllZiBHZXQgUmVzZXQgTW9kZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JTVEdldE1vZGUoDQogICAgICAgIEFUOTFQU19SU1RDIHBSU1RDKQ0Kew0KCXJldHVybiAocFJTVEMtPlJTVENfUk1SKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9SU1RHZXRTdGF0dXMNCi8vKiBcYnJpZWYgR2V0IFJlc2V0IFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JTVEdldFN0YXR1cygNCiAgICAgICAgQVQ5MVBTX1JTVEMgcFJTVEMpDQp7DQoJcmV0dXJuIChwUlNUQy0+UlNUQ19SU1IpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1JTVElzU29mdFJzdEFjdGl2ZQ0KLy8qIFxicmllZiBSZXR1cm4gIT0wIGlmIHNvZnR3YXJlIHJlc2V0IGlzIHN0aWxsIG5vdCBjb21wbGV0ZWQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SU1RJc1NvZnRSc3RBY3RpdmUoDQogICAgICAgIEFUOTFQU19SU1RDIHBSU1RDKQ0Kew0KCXJldHVybiAoKHBSU1RDLT5SU1RDX1JTUikgJiBBVDkxQ19SU1RDX1NSQ01QKTsNCn0NCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBSVFRDDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgIEFUOTFGX1NldFJUVF9UaW1lQmFzZSgpDQovLyogXGJyaWVmICBTZXQgdGhlIFJUVCBwcmVzY2FsZXIgYWNjb3JkaW5nIHRvIHRoZSBUaW1lQmFzZSBpbiBtcw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SVFRTZXRUaW1lQmFzZSgNCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMsDQogICAgICAgIHVuc2lnbmVkIGludCBtcykNCnsNCglpZiAobXMgPiAyMDAwKQ0KCQlyZXR1cm4gMTsgICAvLyBBVDkxQ19USU1FX09VVF9PRl9SQU5HRQ0KCXBSVFRDLT5SVFRDX1JUTVIgJj0gfjB4RkZGRjsJDQoJcFJUVEMtPlJUVENfUlRNUiB8PSAoKChtcyA8PCAxNSkgLzEwMDApICYgMHhGRkZGKTsJDQoJcmV0dXJuIDA7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgICBBVDkxRl9SVFRTZXRQcmVzY2FsZXIoKQ0KLy8qIFxicmllZiAgU2V0IHRoZSBuZXcgcHJlc2NhbGVyIHZhbHVlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JUVFNldFByZXNjYWxlcigNCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMsDQogICAgICAgIHVuc2lnbmVkIGludCBydHByZXMpDQp7DQoJcFJUVEMtPlJUVENfUlRNUiAmPSB+MHhGRkZGOwkNCglwUlRUQy0+UlRUQ19SVE1SIHw9IChydHByZXMgJiAweEZGRkYpOwkNCglyZXR1cm4gKHBSVFRDLT5SVFRDX1JUTVIpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUUmVzdGFydCgpDQovLyogXGJyaWVmICBSZXN0YXJ0IHRoZSBSVFQgcHJlc2NhbGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRSZXN0YXJ0KA0KICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQykNCnsNCglwUlRUQy0+UlRUQ19SVE1SIHw9IEFUOTFDX1JUVENfUlRUUlNUOwkNCn0NCg0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUX1NldEFsYXJtSU5UKCkNCi8vKiBcYnJpZWYgIEVuYWJsZSBSVFQgQWxhcm0gSW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRTZXRBbGFybUlOVCgNCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpDQp7DQoJcFJUVEMtPlJUVENfUlRNUiB8PSBBVDkxQ19SVFRDX0FMTUlFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgIEFUOTFGX1JUVF9DbGVhckFsYXJtSU5UKCkNCi8vKiBcYnJpZWYgIERpc2FibGUgUlRUIEFsYXJtIEludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUlRUQ2xlYXJBbGFybUlOVCgNCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpDQp7DQoJcFJUVEMtPlJUVENfUlRNUiAmPSB+QVQ5MUNfUlRUQ19BTE1JRU47DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgICBBVDkxRl9SVFRfU2V0UnR0SW5jSU5UKCkNCi8vKiBcYnJpZWYgIEVuYWJsZSBSVFQgSU5DIEludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUlRUU2V0UnR0SW5jSU5UKA0KICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQykNCnsNCglwUlRUQy0+UlRUQ19SVE1SIHw9IEFUOTFDX1JUVENfUlRUSU5DSUVOOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUX0NsZWFyUnR0SW5jSU5UKCkNCi8vKiBcYnJpZWYgIERpc2FibGUgUlRUIElOQyBJbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVENsZWFyUnR0SW5jSU5UKA0KICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQykNCnsNCglwUlRUQy0+UlRUQ19SVE1SICY9IH5BVDkxQ19SVFRDX1JUVElOQ0lFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgIEFUOTFGX1JUVF9TZXRBbGFybVZhbHVlKCkNCi8vKiBcYnJpZWYgIFNldCBSVFQgQWxhcm0gVmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVFNldEFsYXJtVmFsdWUoDQogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDLCB1bnNpZ25lZCBpbnQgYWxhcm0pDQp7DQoJcFJUVEMtPlJUVENfUlRBUiA9IGFsYXJtOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUX0dldEFsYXJtVmFsdWUoKQ0KLy8qIFxicmllZiAgR2V0IFJUVCBBbGFybSBWYWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SVFRHZXRBbGFybVZhbHVlKA0KICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQykNCnsNCglyZXR1cm4ocFJUVEMtPlJUVENfUlRBUik7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgICBBVDkxRl9SVFRHZXRTdGF0dXMoKQ0KLy8qIFxicmllZiAgUmVhZCB0aGUgUlRUIHN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SVFRHZXRTdGF0dXMoDQogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDKQ0Kew0KCXJldHVybihwUlRUQy0+UlRUQ19SVFNSKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgIEFUOTFGX1JUVF9SZWFkVmFsdWUoKQ0KLy8qIFxicmllZiAgUmVhZCB0aGUgUlRUIHZhbHVlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JUVFJlYWRWYWx1ZSgNCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpDQp7DQogICAgICAgIHJlZ2lzdGVyIHZvbGF0aWxlIHVuc2lnbmVkIGludCB2YWwxLHZhbDI7DQoJZG8NCgl7DQoJCXZhbDEgPSBwUlRUQy0+UlRUQ19SVFZSOw0KCQl2YWwyID0gcFJUVEMtPlJUVENfUlRWUjsNCgl9CQ0KCXdoaWxlKHZhbDEgIT0gdmFsMik7DQoJcmV0dXJuKHZhbDEpOw0KfQ0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFBJVEMNCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJVEluaXQNCi8vKiBcYnJpZWYgU3lzdGVtIHRpbWVyIGluaXQgOiBwZXJpb2QgaW4gtXNlY29uZCwgc3lzdGVtIGNsb2NrIGZyZXEgaW4gTUh6DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVEluaXQoDQogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDLA0KICAgICAgICB1bnNpZ25lZCBpbnQgcGVyaW9kLA0KICAgICAgICB1bnNpZ25lZCBpbnQgcGl0X2ZyZXF1ZW5jeSkNCnsNCglwUElUQy0+UElUQ19QSU1SID0gcGVyaW9kPyAocGVyaW9kICogcGl0X2ZyZXF1ZW5jeSArIDgpID4+IDQgOiAwOyAvLyArOCB0byBhdm9pZCAlMTAgYW5kIC8xMA0KCXBQSVRDLT5QSVRDX1BJTVIgfD0gQVQ5MUNfUElUQ19QSVRFTjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElUU2V0UElWDQovLyogXGJyaWVmIFNldCB0aGUgUElUIFBlcmlvZGljIEludGVydmFsIFZhbHVlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVFNldFBJVigNCiAgICAgICAgQVQ5MVBTX1BJVEMgcFBJVEMsDQogICAgICAgIHVuc2lnbmVkIGludCBwaXYpDQp7DQoJcFBJVEMtPlBJVENfUElNUiA9IHBpdiB8IChwUElUQy0+UElUQ19QSU1SICYgKEFUOTFDX1BJVENfUElURU4gfCBBVDkxQ19QSVRDX1BJVElFTikpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJVEVuYWJsZUludA0KLy8qIFxicmllZiBFbmFibGUgUElUIHBlcmlvZGljIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSVRFbmFibGVJbnQoDQogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDKQ0Kew0KCXBQSVRDLT5QSVRDX1BJTVIgfD0gQVQ5MUNfUElUQ19QSVRJRU47CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJVERpc2FibGVJbnQNCi8vKiBcYnJpZWYgRGlzYWJsZSBQSVQgcGVyaW9kaWMgaW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVERpc2FibGVJbnQoDQogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDKQ0Kew0KCXBQSVRDLT5QSVRDX1BJTVIgJj0gfkFUOTFDX1BJVENfUElUSUVOOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSVRHZXRNb2RlDQovLyogXGJyaWVmIFJlYWQgUElUIG1vZGUgcmVnaXN0ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSVRHZXRNb2RlKA0KICAgICAgICBBVDkxUFNfUElUQyBwUElUQykNCnsNCglyZXR1cm4ocFBJVEMtPlBJVENfUElNUik7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElUR2V0U3RhdHVzDQovLyogXGJyaWVmIFJlYWQgUElUIHN0YXR1cyByZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJVEdldFN0YXR1cygNCiAgICAgICAgQVQ5MVBTX1BJVEMgcFBJVEMpDQp7DQoJcmV0dXJuKHBQSVRDLT5QSVRDX1BJU1IpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJVEdldFBJSVINCi8vKiBcYnJpZWYgUmVhZCBQSVQgQ1BJViBhbmQgUElDTlQgd2l0aG91dCByZXNzZXR0aW5nIHRoZSBjb3VudGVycw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJVEdldFBJSVIoDQogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDKQ0Kew0KCXJldHVybihwUElUQy0+UElUQ19QSUlSKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSVRHZXRQSVZSDQovLyogXGJyaWVmIFJlYWQgU3lzdGVtIHRpbWVyIENQSVYgYW5kIFBJQ05UIHdpdGhvdXQgcmVzc2V0dGluZyB0aGUgY291bnRlcnMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSVRHZXRQSVZSKA0KICAgICAgICBBVDkxUFNfUElUQyBwUElUQykNCnsNCglyZXR1cm4ocFBJVEMtPlBJVENfUElWUik7DQp9DQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgV0RUQw0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfV0RUU2V0TW9kZQ0KLy8qIFxicmllZiBTZXQgV2F0Y2hkb2cgTW9kZSBSZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9XRFRTZXRNb2RlKA0KICAgICAgICBBVDkxUFNfV0RUQyBwV0RUQywNCiAgICAgICAgdW5zaWduZWQgaW50IE1vZGUpDQp7DQoJcFdEVEMtPldEVENfV0RNUiA9IE1vZGU7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfV0RUUmVzdGFydA0KLy8qIFxicmllZiBSZXN0YXJ0IFdhdGNoZG9nDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1dEVFJlc3RhcnQoDQogICAgICAgIEFUOTFQU19XRFRDIHBXRFRDKQ0Kew0KCXBXRFRDLT5XRFRDX1dEQ1IgPSAweEE1MDAwMDAxOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1dEVFNHZXR0YXR1cw0KLy8qIFxicmllZiBHZXQgV2F0Y2hkb2cgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfV0RUU0dldHRhdHVzKA0KICAgICAgICBBVDkxUFNfV0RUQyBwV0RUQykNCnsNCglyZXR1cm4ocFdEVEMtPldEVENfV0RTUiAmIDB4Myk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfV0RUR2V0UGVyaW9kDQovLyogXGJyaWVmIFRyYW5zbGF0ZSBtcyBpbnRvIFdhdGNoZG9nIENvbXBhdGlibGUgdmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9XRFRHZXRQZXJpb2QodW5zaWduZWQgaW50IG1zKQ0Kew0KCWlmICgobXMgPCA0KSB8fCAobXMgPiAxNjAwMCkpDQoJCXJldHVybiAwOw0KCXJldHVybigobXMgPDwgOCkgLyAxMDAwKTsNCn0NCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBWUkVHDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9WUkVHX0VuYWJsZV9Mb3dQb3dlck1vZGUNCi8vKiBcYnJpZWYgRW5hYmxlIFZSRUcgTG93IFBvd2VyIE1vZGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVlJFR19FbmFibGVfTG93UG93ZXJNb2RlKA0KICAgICAgICBBVDkxUFNfVlJFRyBwVlJFRykNCnsNCglwVlJFRy0+VlJFR19NUiB8PSBBVDkxQ19WUkVHX1BTVERCWTsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVlJFR19EaXNhYmxlX0xvd1Bvd2VyTW9kZQ0KLy8qIFxicmllZiBEaXNhYmxlIFZSRUcgTG93IFBvd2VyIE1vZGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVlJFR19EaXNhYmxlX0xvd1Bvd2VyTW9kZSgNCiAgICAgICAgQVQ5MVBTX1ZSRUcgcFZSRUcpDQp7DQoJcFZSRUctPlZSRUdfTVIgJj0gfkFUOTFDX1ZSRUdfUFNUREJZOwkNCn0vKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgTUMNCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQoNCiNkZWZpbmUgQVQ5MUNfTUNfQ09SUkVDVF9LRVkgICgodW5zaWduZWQgaW50KSAweDVBIDw8IDI0KSAvLyAoTUMpIENvcnJlY3QgUHJvdGVjdCBLZXkNCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9NQ19SZW1hcA0KLy8qIFxicmllZiBNYWtlIFJlbWFwDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX01DX1JlbWFwICh2b2lkKSAgICAgLy8NCnsNCiAgICBBVDkxUFNfTUMgcE1DID0gKEFUOTFQU19NQykgQVQ5MUNfQkFTRV9NQzsNCg0KICAgIHBNQy0+TUNfUkNSID0gQVQ5MUNfTUNfUkNCOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX01DX0VGQ19DZmdNb2RlUmVnDQovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgRUZDIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIE1DIGNvbnRyb2xsZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfTUNfRUZDX0NmZ01vZGVSZWcgKA0KCUFUOTFQU19NQyBwTUMsIC8vIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IG1vZGUpICAgICAgICAvLyBtb2RlIHJlZ2lzdGVyDQp7DQoJLy8gV3JpdGUgdG8gdGhlIEZNUiByZWdpc3Rlcg0KCXBNQy0+TUNfRk1SID0gbW9kZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9NQ19FRkNfR2V0TW9kZVJlZw0KLy8qIFxicmllZiBSZXR1cm4gTUMgRUZDIE1vZGUgUmVnc2l0ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfR2V0TW9kZVJlZygNCglBVDkxUFNfTUMgcE1DKSAvLyBwb2ludGVyIHRvIGEgTUMgY29udHJvbGxlcg0Kew0KCXJldHVybiBwTUMtPk1DX0ZNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9NQ19FRkNfQ29tcHV0ZUZNQ04NCi8vKiBcYnJpZWYgUmV0dXJuIE1DIEVGQyBNb2RlIFJlZ3NpdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfTUNfRUZDX0NvbXB1dGVGTUNOKA0KCWludCBtYXN0ZXJfY2xvY2spIC8vIG1hc3RlciBjbG9jayBpbiBIeg0Kew0KCXJldHVybiAobWFzdGVyX2Nsb2NrLzEwMDAwMDAgKzIpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX01DX0VGQ19QZXJmb3JtQ21kDQovLyogXGJyaWVmIFBlcmZvcm0gRUZDIENvbW1hbmQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfTUNfRUZDX1BlcmZvcm1DbWQgKA0KCUFUOTFQU19NQyBwTUMsIC8vIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyDQogICAgdW5zaWduZWQgaW50IHRyYW5zZmVyX2NtZCkNCnsNCglwTUMtPk1DX0ZDUiA9IHRyYW5zZmVyX2NtZDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfTUNfRUZDX0dldFN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gTUMgRUZDIFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX01DX0VGQ19HZXRTdGF0dXMoDQoJQVQ5MVBTX01DIHBNQykgLy8gcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcE1DLT5NQ19GU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfTUNfRUZDX0lzSW50ZXJydXB0TWFza2VkDQovLyogXGJyaWVmIFRlc3QgaWYgRUZDIE1DIEludGVycnVwdCBpcyBNYXNrZWQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19NQyBwTUMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9NQ19FRkNfR2V0TW9kZVJlZyhwTUMpICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfTUNfRUZDX0lzSW50ZXJydXB0U2V0DQovLyogXGJyaWVmIFRlc3QgaWYgRUZDIE1DIEludGVycnVwdCBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfSXNJbnRlcnJ1cHRTZXQoDQogICAgICAgIEFUOTFQU19NQyBwTUMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9NQ19FRkNfR2V0U3RhdHVzKHBNQykgJiBmbGFnKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFNQSQ0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX09wZW4NCi8vKiBcYnJpZWYgT3BlbiBhIFNQSSBQb3J0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1BJX09wZW4gKA0KICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbnVsbCkgIC8vIFxhcmcNCnsNCiAgICAgICAgLyogTk9UIERFRklORUQgQVQgVEhJUyBNT01FTlQgKi8NCiAgICAgICAgcmV0dXJuICggMCApOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9DZmdDcw0KLy8qIFxicmllZiBDb25maWd1cmUgU1BJIGNoaXAgc2VsZWN0IHJlZ2lzdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9DZmdDcyAoDQoJQVQ5MVBTX1NQSSBwU1BJLCAgICAgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyDQoJaW50IGNzLCAgICAgLy8gU1BJIGNzIG51bWJlciAoMCB0byAzKQ0KIAlpbnQgdmFsKSAgIC8vICBjaGlwIHNlbGVjdCByZWdpc3Rlcg0Kew0KCS8vKiBXcml0ZSB0byB0aGUgQ1NSIHJlZ2lzdGVyDQoJKihwU1BJLT5TUElfQ1NSICsgY3MpID0gdmFsOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9FbmFibGVJdA0KLy8qIFxicmllZiBFbmFibGUgU1BJIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfRW5hYmxlSXQgKA0KCUFUOTFQU19TUEkgcFNQSSwgICAgIC8vIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIElUIHRvIGJlIGVuYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3Rlcg0KCXBTUEktPlNQSV9JRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9EaXNhYmxlSXQNCi8vKiBcYnJpZWYgRGlzYWJsZSBTUEkgaW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9EaXNhYmxlSXQgKA0KCUFUOTFQU19TUEkgcFNQSSwgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpIC8vIElUIHRvIGJlIGRpc2FibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXINCglwU1BJLT5TUElfSURSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TUElfUmVzZXQNCi8vKiBcYnJpZWYgUmVzZXQgdGhlIFNQSSBjb250cm9sbGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9SZXNldCAoDQoJQVQ5MVBTX1NQSSBwU1BJIC8vIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcg0KCSkNCnsNCgkvLyogV3JpdGUgdG8gdGhlIENSIHJlZ2lzdGVyDQoJcFNQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NXUlNUOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9FbmFibGUNCi8vKiBcYnJpZWYgRW5hYmxlIHRoZSBTUEkgY29udHJvbGxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfRW5hYmxlICgNCglBVDkxUFNfU1BJIHBTUEkgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyDQoJKQ0Kew0KCS8vKiBXcml0ZSB0byB0aGUgQ1IgcmVnaXN0ZXINCglwU1BJLT5TUElfQ1IgPSBBVDkxQ19TUElfU1BJRU47DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0Rpc2FibGUNCi8vKiBcYnJpZWYgRGlzYWJsZSB0aGUgU1BJIGNvbnRyb2xsZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX0Rpc2FibGUgKA0KCUFUOTFQU19TUEkgcFNQSSAvLyBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXINCgkpDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBDUiByZWdpc3Rlcg0KCXBTUEktPlNQSV9DUiA9IEFUOTFDX1NQSV9TUElESVM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0NmZ01vZGUNCi8vKiBcYnJpZWYgRW5hYmxlIHRoZSBTUEkgY29udHJvbGxlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2ZnTW9kZSAoDQoJQVQ5MVBTX1NQSSBwU1BJLCAvLyBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXINCglpbnQgbW9kZSkgICAgICAgIC8vIG1vZGUgcmVnaXN0ZXINCnsNCgkvLyogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyDQoJcFNQSS0+U1BJX01SID0gbW9kZTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TUElfQ2ZnUENTDQovLyogXGJyaWVmIFN3aXRjaCB0byB0aGUgY29ycmVjdCBQQ1Mgb2YgU1BJIE1vZGUgUmVnaXN0ZXIgOiBGaXhlZCBQZXJpcGhlcmFsIFNlbGVjdGVkDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9DZmdQQ1MgKA0KCUFUOTFQU19TUEkgcFNQSSwgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyDQoJY2hhciBQQ1NfRGV2aWNlKSAvLyBQQ1Mgb2YgdGhlIERldmljZQ0KewkNCiAJLy8qIFdyaXRlIHRvIHRoZSBNUiByZWdpc3Rlcg0KCXBTUEktPlNQSV9NUiAmPSAweEZGRjBGRkZGOw0KCXBTUEktPlNQSV9NUiB8PSAoIChQQ1NfRGV2aWNlPDwxNikgJiBBVDkxQ19TUElfUENTICk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX1JlY2VpdmVGcmFtZQ0KLy8qIFxicmllZiBSZXR1cm4gMiBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBCdWZmZXIgYW5kIE5leHQgQnVmZmVyLCAxIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXphZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYnVzeQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NQSV9SZWNlaXZlRnJhbWUgKA0KCUFUOTFQU19TUEkgcFNQSSwNCgljaGFyICpwQnVmZmVyLA0KCXVuc2lnbmVkIGludCBzekJ1ZmZlciwNCgljaGFyICpwTmV4dEJ1ZmZlciwNCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCglyZXR1cm4gQVQ5MUZfUERDX1JlY2VpdmVGcmFtZSgNCgkJKEFUOTFQU19QREMpICYocFNQSS0+U1BJX1JQUiksDQoJCXBCdWZmZXIsDQoJCXN6QnVmZmVyLA0KCQlwTmV4dEJ1ZmZlciwNCgkJc3pOZXh0QnVmZmVyKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TUElfU2VuZEZyYW1lDQovLyogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemFlZCB3aXRoIE5leHQgQnVmZmVyLCAwIGlmIFBEQyBpcyBiU1BJeQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NQSV9TZW5kRnJhbWUoDQoJQVQ5MVBTX1NQSSBwU1BJLA0KCWNoYXIgKnBCdWZmZXIsDQoJdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KCWNoYXIgKnBOZXh0QnVmZmVyLA0KCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KCXJldHVybiBBVDkxRl9QRENfU2VuZEZyYW1lKA0KCQkoQVQ5MVBTX1BEQykgJihwU1BJLT5TUElfUlBSKSwNCgkJcEJ1ZmZlciwNCgkJc3pCdWZmZXIsDQoJCXBOZXh0QnVmZmVyLA0KCQlzek5leHRCdWZmZXIpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9DbG9zZQ0KLy8qIFxicmllZiBDbG9zZSBTUEk6IGRpc2FibGUgSVQgZGlzYWJsZSB0cmFuc2ZlcnQsIGNsb3NlIFBEQw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2xvc2UgKA0KCUFUOTFQU19TUEkgcFNQSSkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyDQp7DQogICAgLy8qIFJlc2V0IGFsbCB0aGUgQ2hpcCBTZWxlY3QgcmVnaXN0ZXINCiAgICBwU1BJLT5TUElfQ1NSWzBdID0gMCA7DQogICAgcFNQSS0+U1BJX0NTUlsxXSA9IDAgOw0KICAgIHBTUEktPlNQSV9DU1JbMl0gPSAwIDsNCiAgICBwU1BJLT5TUElfQ1NSWzNdID0gMCA7DQoNCiAgICAvLyogUmVzZXQgdGhlIFNQSSBtb2RlDQogICAgcFNQSS0+U1BJX01SID0gMCAgOw0KDQogICAgLy8qIERpc2FibGUgYWxsIGludGVycnVwdHMNCiAgICBwU1BJLT5TUElfSURSID0gMHhGRkZGRkZGRiA7DQoNCiAgICAvLyogQWJvcnQgdGhlIFBlcmlwaGVyYWwgRGF0YSBUcmFuc2ZlcnMNCiAgICBBVDkxRl9QRENfQ2xvc2UoKEFUOTFQU19QREMpICYocFNQSS0+U1BJX1JQUikpOw0KDQogICAgLy8qIERpc2FibGUgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyIGFuZCBzdG9wIGFueSBhY3Rpdml0eSBpbW1lZGlhdGVseQ0KICAgIHBTUEktPlNQSV9DUiA9IEFUOTFDX1NQSV9TUElESVM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX1B1dENoYXINCi8vKiBcYnJpZWYgU2VuZCBhIGNoYXJhY3Rlcixkb2VzIG5vdCBjaGVjayBpZiByZWFkeSB0byBzZW5kDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9QdXRDaGFyICgNCglBVDkxUFNfU1BJIHBTUEksDQoJdW5zaWduZWQgaW50IGNoYXJhY3RlciwNCiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY3NfbnVtYmVyICkNCnsNCiAgICB1bnNpZ25lZCBpbnQgdmFsdWVfZm9yX2NzOw0KICAgIHZhbHVlX2Zvcl9jcyA9ICh+KDEgPDwgY3NfbnVtYmVyKSkgJiAweEY7ICAvL1BsYWNlIGEgemVybyBhbW9uZyBhIDQgT05FcyBudW1iZXINCiAgICBwU1BJLT5TUElfVERSID0gKGNoYXJhY3RlciAmIDB4RkZGRikgfCAodmFsdWVfZm9yX2NzIDw8IDE2KTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TUElfR2V0Q2hhcg0KLy8qIFxicmllZiBSZWNlaXZlIGEgY2hhcmFjdGVyLGRvZXMgbm90IGNoZWNrIGlmIGEgY2hhcmFjdGVyIGlzIGF2YWlsYWJsZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgaW50IEFUOTFGX1NQSV9HZXRDaGFyICgNCgljb25zdCBBVDkxUFNfU1BJIHBTUEkpDQp7DQogICAgcmV0dXJuKChwU1BJLT5TUElfUkRSKSAmIDB4RkZGRik7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0dldEludGVycnVwdE1hc2tTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFNQSSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TUElfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBTUEkgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQogICAgICAgIEFUOTFQU19TUEkgcFNwaSkgLy8gXGFyZyAgcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyDQp7DQogICAgICAgIHJldHVybiBwU3BpLT5TUElfSU1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSV9Jc0ludGVycnVwdE1hc2tlZA0KLy8qIFxicmllZiBUZXN0IGlmIFNQSSBJbnRlcnJ1cHQgaXMgTWFza2VkDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfU1BJX0lzSW50ZXJydXB0TWFza2VkKA0KICAgICAgICBBVDkxUFNfU1BJIHBTcGksICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KICAgICAgICByZXR1cm4gKEFUOTFGX1NQSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBTcGkpICYgZmxhZyk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBVU0FSVA0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfQmF1ZHJhdGUNCi8vKiBcYnJpZWYgQ2FsY3VsYXRlIHRoZSBiYXVkcmF0ZQ0KLy8qIFN0YW5kYXJkIEFzeW5jaHJvbm91cyBNb2RlIDogOCBiaXRzICwgMSBzdG9wICwgbm8gcGFyaXR5DQojZGVmaW5lIEFUOTFDX1VTX0FTWU5DX01PREUgKCBBVDkxQ19VU19VU01PREVfTk9STUFMICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfUEFSX05PTkUgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DSFJMXzhfQklUUyArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NMS1NfQ0xPQ0sgKQ0KDQovLyogU3RhbmRhcmQgRXh0ZXJuYWwgQXN5bmNocm9ub3VzIE1vZGUgOiA4IGJpdHMgLCAxIHN0b3AgLCBubyBwYXJpdHkNCiNkZWZpbmUgQVQ5MUNfVVNfQVNZTkNfU0NLX01PREUgKCBBVDkxQ19VU19VU01PREVfTk9STUFMICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX05CU1RPUF8xX0JJVCArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19QQVJfTk9ORSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DSFJMXzhfQklUUyArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DTEtTX0VYVCApDQoNCi8vKiBTdGFuZGFyZCBTeW5jaHJvbm91cyBNb2RlIDogOCBiaXRzICwgMSBzdG9wICwgbm8gcGFyaXR5DQojZGVmaW5lIEFUOTFDX1VTX1NZTkNfTU9ERSAoIEFUOTFDX1VTX1NZTkMgKyBcDQogICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX1VTTU9ERV9OT1JNQUwgKyBcDQogICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX05CU1RPUF8xX0JJVCArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfUEFSX05PTkUgKyBcDQogICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NIUkxfOF9CSVRTICsgXA0KICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DTEtTX0NMT0NLICkNCg0KLy8qIFNDSyB1c2VkIExhYmVsDQojZGVmaW5lIEFUOTFDX1VTX1NDS19VU0VEIChBVDkxQ19VU19DS0xPIHwgQVQ5MUNfVVNfQ0xLU19FWFQpDQoNCi8vKiBTdGFuZGFyZCBJU08gVD0wIE1vZGUgOiA4IGJpdHMgLCAxIHN0b3AgLCBwYXJpdHkNCiNkZWZpbmUgQVQ5MUNfVVNfSVNPX1JFQURFUl9NT0RFICggQVQ5MUNfVVNfVVNNT0RFX0lTTzc4MTZfMCArIFwNCgkJCQkJICAgCQkgQVQ5MUNfVVNfQ0xLU19DTE9DSyArXA0KICAgICAgICAgICAgICAgICAgICAgICAJCSBBVDkxQ19VU19OQlNUT1BfMV9CSVQgKyBcDQogICAgICAgICAgICAgICAgICAgICAgIAkJIEFUOTFDX1VTX1BBUl9FVkVOICsgXA0KICAgICAgICAgICAgICAgICAgICAgICAJCSBBVDkxQ19VU19DSFJMXzhfQklUUyArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgCQkgQVQ5MUNfVVNfQ0tMTyArXA0KICAgICAgICAgICAgICAgICAgICAgICAJCSBBVDkxQ19VU19PVkVSKQ0KDQovLyogU3RhbmRhcmQgSVJEQSBtb2RlDQojZGVmaW5lIEFUOTFDX1VTX0FTWU5DX0lSREFfTU9ERSAoICBBVDkxQ19VU19VU01PREVfSVJEQSArIFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19OQlNUT1BfMV9CSVQgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfUEFSX05PTkUgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfQ0hSTF84X0JJVFMgKyBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfQ0xLU19DTE9DSyApDQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfQmF1ZHJhdGUNCi8vKiBcYnJpZWYgQ2FsdWN1bGF0ZSBiYXVkX3ZhbHVlIGFjY29yZGluZyB0byB0aGUgbWFpbiBjbG9jayBhbmQgdGhlIGJhdWQgcmF0ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX0JhdWRyYXRlICgNCgljb25zdCB1bnNpZ25lZCBpbnQgbWFpbl9jbG9jaywgLy8gXGFyZyBwZXJpcGhlcmFsIGNsb2NrDQoJY29uc3QgdW5zaWduZWQgaW50IGJhdWRfcmF0ZSkgIC8vIFxhcmcgVUFSVCBiYXVkcmF0ZQ0Kew0KCXVuc2lnbmVkIGludCBiYXVkX3ZhbHVlID0gKChtYWluX2Nsb2NrKjEwKS8oYmF1ZF9yYXRlICogMTYpKTsNCglpZiAoKGJhdWRfdmFsdWUgJSAxMCkgPj0gNSkNCgkJYmF1ZF92YWx1ZSA9IChiYXVkX3ZhbHVlIC8gMTApICsgMTsNCgllbHNlDQoJCWJhdWRfdmFsdWUgLz0gMTA7DQoJcmV0dXJuIGJhdWRfdmFsdWU7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfU2V0QmF1ZHJhdGUNCi8vKiBcYnJpZWYgU2V0IHRoZSBiYXVkcmF0ZSBhY2NvcmRpbmcgdG8gdGhlIENQVSBjbG9jaw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19TZXRCYXVkcmF0ZSAoDQoJQVQ5MVBTX1VTQVJUIHBVU0FSVCwgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBtYWluQ2xvY2ssIC8vIFxhcmcgcGVyaXBoZXJhbCBjbG9jaw0KCXVuc2lnbmVkIGludCBzcGVlZCkgICAgIC8vIFxhcmcgVUFSVCBiYXVkcmF0ZQ0Kew0KCS8vKiBEZWZpbmUgdGhlIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVyDQoJcFVTQVJULT5VU19CUkdSID0gQVQ5MUZfVVNfQmF1ZHJhdGUobWFpbkNsb2NrLCBzcGVlZCk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfU2V0VGltZWd1YXJkDQovLyogXGJyaWVmIFNldCBVU0FSVCB0aW1lZ3VhcmQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfU2V0VGltZWd1YXJkICgNCglBVDkxUFNfVVNBUlQgcFVTQVJULCAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IHRpbWVndWFyZCkgLy8gXGFyZyB0aW1lZ3VhcmQgdmFsdWUNCnsNCgkvLyogV3JpdGUgdGhlIFRpbWVndWFyZCBSZWdpc3Rlcg0KCXBVU0FSVC0+VVNfVFRHUiA9IHRpbWVndWFyZCA7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfRW5hYmxlSXQNCi8vKiBcYnJpZWYgRW5hYmxlIFVTQVJUIElUDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0VuYWJsZUl0ICgNCglBVDkxUFNfVVNBUlQgcFVTQVJULCAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBlbmFibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXINCglwVVNBUlQtPlVTX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfRGlzYWJsZUl0DQovLyogXGJyaWVmIERpc2FibGUgVVNBUlQgSVQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRGlzYWJsZUl0ICgNCglBVDkxUFNfVVNBUlQgcFVTQVJULCAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBkaXNhYmxlZA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyDQoJcFVTQVJULT5VU19JRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTX0NvbmZpZ3VyZQ0KLy8qIFxicmllZiBDb25maWd1cmUgVVNBUlQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfQ29uZmlndXJlICgNCglBVDkxUFNfVVNBUlQgcFVTQVJULCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBtYWluQ2xvY2ssICAvLyBcYXJnIHBlcmlwaGVyYWwgY2xvY2sNCgl1bnNpZ25lZCBpbnQgbW9kZSAsICAgICAgLy8gXGFyZyBtb2RlIFJlZ2lzdGVyIHRvIGJlIHByb2dyYW1tZWQNCgl1bnNpZ25lZCBpbnQgYmF1ZFJhdGUgLCAgLy8gXGFyZyBiYXVkcmF0ZSB0byBiZSBwcm9ncmFtbWVkDQoJdW5zaWduZWQgaW50IHRpbWVndWFyZCApIC8vIFxhcmcgdGltZWd1YXJkIHRvIGJlIHByb2dyYW1tZWQNCnsNCiAgICAvLyogRGlzYWJsZSBpbnRlcnJ1cHRzDQogICAgcFVTQVJULT5VU19JRFIgPSAodW5zaWduZWQgaW50KSAtMTsNCg0KICAgIC8vKiBSZXNldCByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXINCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlNUUlggfCBBVDkxQ19VU19SU1RUWCB8IEFUOTFDX1VTX1JYRElTIHwgQVQ5MUNfVVNfVFhESVMgOw0KDQoJLy8qIERlZmluZSB0aGUgYmF1ZCByYXRlIGRpdmlzb3IgcmVnaXN0ZXINCglBVDkxRl9VU19TZXRCYXVkcmF0ZShwVVNBUlQsIG1haW5DbG9jaywgYmF1ZFJhdGUpOw0KDQoJLy8qIFdyaXRlIHRoZSBUaW1lZ3VhcmQgUmVnaXN0ZXINCglBVDkxRl9VU19TZXRUaW1lZ3VhcmQocFVTQVJULCB0aW1lZ3VhcmQpOw0KDQogICAgLy8qIENsZWFyIFRyYW5zbWl0IGFuZCBSZWNlaXZlIENvdW50ZXJzDQogICAgQVQ5MUZfUERDX09wZW4oKEFUOTFQU19QREMpICYocFVTQVJULT5VU19SUFIpKTsNCg0KICAgIC8vKiBEZWZpbmUgdGhlIFVTQVJUIG1vZGUNCiAgICBwVVNBUlQtPlVTX01SID0gbW9kZSAgOw0KDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfRW5hYmxlUngNCi8vKiBcYnJpZWYgRW5hYmxlIHJlY2VpdmluZyBjaGFyYWN0ZXJzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0VuYWJsZVJ4ICgNCglBVDkxUFNfVVNBUlQgcFVTQVJUKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcg0Kew0KICAgIC8vKiBFbmFibGUgcmVjZWl2ZXINCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlhFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19FbmFibGVUeA0KLy8qIFxicmllZiBFbmFibGUgc2VuZGluZyBjaGFyYWN0ZXJzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0VuYWJsZVR4ICgNCglBVDkxUFNfVVNBUlQgcFVTQVJUKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcg0Kew0KICAgIC8vKiBFbmFibGUgIHRyYW5zbWl0dGVyDQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1RYRU47DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfUmVzZXRSeA0KLy8qIFxicmllZiBSZXNldCBSZWNlaXZlciBhbmQgcmUtZW5hYmxlIGl0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX1Jlc2V0UnggKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyDQp7DQoJLy8qIFJlc2V0IHJlY2VpdmVyDQoJcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1JTVFJYOw0KICAgIC8vKiBSZS1FbmFibGUgcmVjZWl2ZXINCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlhFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19SZXNldFR4DQovLyogXGJyaWVmIFJlc2V0IFRyYW5zbWl0dGVyIGFuZCByZS1lbmFibGUgaXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfUmVzZXRUeCAoDQoJQVQ5MVBTX1VTQVJUIHBVU0FSVCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXINCnsNCgkvLyogUmVzZXQgdHJhbnNtaXR0ZXINCglwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlNUVFg7DQogICAgLy8qIEVuYWJsZSB0cmFuc21pdHRlcg0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19UWEVOOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTX0Rpc2FibGVSeA0KLy8qIFxicmllZiBEaXNhYmxlIFJlY2VpdmVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0Rpc2FibGVSeCAoDQoJQVQ5MVBTX1VTQVJUIHBVU0FSVCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXINCnsNCiAgICAvLyogRGlzYWJsZSByZWNlaXZlcg0KICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SWERJUzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19EaXNhYmxlVHgNCi8vKiBcYnJpZWYgRGlzYWJsZSBUcmFuc21pdHRlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19EaXNhYmxlVHggKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyDQp7DQogICAgLy8qIERpc2FibGUgdHJhbnNtaXR0ZXINCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfVFhESVM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfQ2xvc2UNCi8vKiBcYnJpZWYgQ2xvc2UgVVNBUlQ6IGRpc2FibGUgSVQgZGlzYWJsZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIsIGNsb3NlIFBEQw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19DbG9zZSAoDQoJQVQ5MVBTX1VTQVJUIHBVU0FSVCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXINCnsNCiAgICAvLyogUmVzZXQgdGhlIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVyDQogICAgcFVTQVJULT5VU19CUkdSID0gMCA7DQoNCiAgICAvLyogUmVzZXQgdGhlIFVTQVJUIG1vZGUNCiAgICBwVVNBUlQtPlVTX01SID0gMCAgOw0KDQogICAgLy8qIFJlc2V0IHRoZSBUaW1lZ3VhcmQgUmVnaXN0ZXINCiAgICBwVVNBUlQtPlVTX1RUR1IgPSAwOw0KDQogICAgLy8qIERpc2FibGUgYWxsIGludGVycnVwdHMNCiAgICBwVVNBUlQtPlVTX0lEUiA9IDB4RkZGRkZGRkYgOw0KDQogICAgLy8qIEFib3J0IHRoZSBQZXJpcGhlcmFsIERhdGEgVHJhbnNmZXJzDQogICAgQVQ5MUZfUERDX0Nsb3NlKChBVDkxUFNfUERDKSAmKHBVU0FSVC0+VVNfUlBSKSk7DQoNCiAgICAvLyogRGlzYWJsZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIgYW5kIHN0b3AgYW55IGFjdGl2aXR5IGltbWVkaWF0ZWx5DQogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1RYRElTIHwgQVQ5MUNfVVNfUlhESVMgfCBBVDkxQ19VU19SU1RUWCB8IEFUOTFDX1VTX1JTVFJYIDsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19UeFJlYWR5DQovLyogXGJyaWVmIFJldHVybiAxIGlmIGEgY2hhcmFjdGVyIGNhbiBiZSB3cml0dGVuIGluIFVTX1RIUg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX1R4UmVhZHkgKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQgKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcg0Kew0KICAgIHJldHVybiAocFVTQVJULT5VU19DU1IgJiBBVDkxQ19VU19UWFJEWSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfUnhSZWFkeQ0KLy8qIFxicmllZiBSZXR1cm4gMSBpZiBhIGNoYXJhY3RlciBjYW4gYmUgcmVhZCBpbiBVU19SSFINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VU19SeFJlYWR5ICgNCglBVDkxUFNfVVNBUlQgcFVTQVJUICkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXINCnsNCiAgICByZXR1cm4gKHBVU0FSVC0+VVNfQ1NSICYgQVQ5MUNfVVNfUlhSRFkpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTX0Vycm9yDQovLyogXGJyaWVmIFJldHVybiB0aGUgZXJyb3IgZmxhZw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VTX0Vycm9yICgNCglBVDkxUFNfVVNBUlQgcFVTQVJUICkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXINCnsNCiAgICByZXR1cm4gKHBVU0FSVC0+VVNfQ1NSICYNCiAgICAJKEFUOTFDX1VTX09WUkUgfCAgLy8gT3ZlcnJ1biBlcnJvcg0KICAgIAkgQVQ5MUNfVVNfRlJBTUUgfCAvLyBGcmFtaW5nIGVycm9yDQogICAgCSBBVDkxQ19VU19QQVJFKSk7ICAvLyBQYXJpdHkgZXJyb3INCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19QdXRDaGFyDQovLyogXGJyaWVmIFNlbmQgYSBjaGFyYWN0ZXIsZG9lcyBub3QgY2hlY2sgaWYgcmVhZHkgdG8gc2VuZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19QdXRDaGFyICgNCglBVDkxUFNfVVNBUlQgcFVTQVJULA0KCWludCBjaGFyYWN0ZXIgKQ0Kew0KICAgIHBVU0FSVC0+VVNfVEhSID0gKGNoYXJhY3RlciAmIDB4MUZGKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19HZXRDaGFyDQovLyogXGJyaWVmIFJlY2VpdmUgYSBjaGFyYWN0ZXIsZG9lcyBub3QgY2hlY2sgaWYgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfVVNfR2V0Q2hhciAoDQoJY29uc3QgQVQ5MVBTX1VTQVJUIHBVU0FSVCkNCnsNCiAgICByZXR1cm4oKHBVU0FSVC0+VVNfUkhSKSAmIDB4MUZGKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19TZW5kRnJhbWUNCi8vKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6YWVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VU19TZW5kRnJhbWUoDQoJQVQ5MVBTX1VTQVJUIHBVU0FSVCwNCgljaGFyICpwQnVmZmVyLA0KCXVuc2lnbmVkIGludCBzekJ1ZmZlciwNCgljaGFyICpwTmV4dEJ1ZmZlciwNCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCglyZXR1cm4gQVQ5MUZfUERDX1NlbmRGcmFtZSgNCgkJKEFUOTFQU19QREMpICYocFVTQVJULT5VU19SUFIpLA0KCQlwQnVmZmVyLA0KCQlzekJ1ZmZlciwNCgkJcE5leHRCdWZmZXIsDQoJCXN6TmV4dEJ1ZmZlcik7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVVNfUmVjZWl2ZUZyYW1lDQovLyogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemFlZCB3aXRoIE5leHQgQnVmZmVyLCAwIGlmIFBEQyBpcyBidXN5DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfUmVjZWl2ZUZyYW1lICgNCglBVDkxUFNfVVNBUlQgcFVTQVJULA0KCWNoYXIgKnBCdWZmZXIsDQoJdW5zaWduZWQgaW50IHN6QnVmZmVyLA0KCWNoYXIgKnBOZXh0QnVmZmVyLA0KCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQ0Kew0KCXJldHVybiBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lKA0KCQkoQVQ5MVBTX1BEQykgJihwVVNBUlQtPlVTX1JQUiksDQoJCXBCdWZmZXIsDQoJCXN6QnVmZmVyLA0KCQlwTmV4dEJ1ZmZlciwNCgkJc3pOZXh0QnVmZmVyKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VU19TZXRJcmRhRmlsdGVyDQovLyogXGJyaWVmIFNldCB0aGUgdmFsdWUgb2YgSXJEYSBmaWx0ZXIgdHJlZ2lzdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX1NldElyZGFGaWx0ZXIgKA0KCUFUOTFQU19VU0FSVCBwVVNBUlQsDQoJdW5zaWduZWQgY2hhciB2YWx1ZQ0KKQ0Kew0KCXBVU0FSVC0+VVNfSUYgPSB2YWx1ZTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFNTQw0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKiBEZWZpbmUgdGhlIHN0YW5kYXJkIEkyUyBtb2RlIGNvbmZpZ3VyYXRpb24NCg0KLy8qIENvbmZpZ3VyYXRpb24gdG8gc2V0IGluIHRoZSBTU0MgVHJhbnNtaXQgQ2xvY2sgTW9kZSBSZWdpc3Rlcg0KLy8qIFBhcmFtZXRlcnMgOiAgbmJfYml0X2J5X3Nsb3QgOiA4LCAxNiBvciAzMiBiaXRzDQovLyogCQkJICBuYl9zbG90X2J5X2ZyYW1lIDogbnVtYmVyIG9mIGNoYW5uZWxzDQojZGVmaW5lIEFUOTFDX0kyU19BU1lfTUFTVEVSX1RYX1NFVFRJTkcobmJfYml0X2J5X3Nsb3QsIG5iX3Nsb3RfYnlfZnJhbWUpKCArXA0KCQkJCQkJCQkJICAgQVQ5MUNfU1NDX0NLU19ESVYgICArXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgQVQ5MUNfU1NDX0NLT19DT05USU5PVVMgICAgICArXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJICAgQVQ5MUNfU1NDX0NLR19OT05FICAgICtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19TU0NfU1RBUlRfRkFMTF9SRiArXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkJICAgQVQ5MUNfU1NDX1NUVE9VVCAgK1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgICgoMTw8MTYpICYgQVQ5MUNfU1NDX1NUVERMWSkgK1wNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgICgoKChuYl9iaXRfYnlfc2xvdCpuYl9zbG90X2J5X2ZyYW1lKS8yKS0xKSA8PDI0KSkNCg0KDQovLyogQ29uZmlndXJhdGlvbiB0byBzZXQgaW4gdGhlIFNTQyBUcmFuc21pdCBGcmFtZSBNb2RlIFJlZ2lzdGVyDQovLyogUGFyYW1ldGVycyA6IG5iX2JpdF9ieV9zbG90IDogOCwgMTYgb3IgMzIgYml0cw0KLy8qIAkJCSBuYl9zbG90X2J5X2ZyYW1lIDogbnVtYmVyIG9mIGNoYW5uZWxzDQojZGVmaW5lIEFUOTFDX0kyU19BU1lfVFhfRlJBTUVfU0VUVElORyhuYl9iaXRfYnlfc2xvdCwgbmJfc2xvdF9ieV9mcmFtZSkoICtcDQoJCQkJCQkJCQkobmJfYml0X2J5X3Nsb3QtMSkgICtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQlBVDkxQ19TU0NfTVNCRiAgICtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkoKChuYl9zbG90X2J5X2ZyYW1lLTEpPDw4KSAmIEFUOTFDX1NTQ19EQVROQikgICtcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkoKChuYl9iaXRfYnlfc2xvdC0xKTw8MTYpICYgQVQ5MUNfU1NDX0ZTTEVOKSArXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJQVQ5MUNfU1NDX0ZTT1NfTkVHQVRJVkUpDQoNCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TU0NfU2V0QmF1ZHJhdGUNCi8vKiBcYnJpZWYgU2V0IHRoZSBiYXVkcmF0ZSBhY2NvcmRpbmcgdG8gdGhlIENQVSBjbG9jaw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfU2V0QmF1ZHJhdGUgKA0KICAgICAgICBBVDkxUFNfU1NDIHBTU0MsICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgbWFpbkNsb2NrLCAvLyBcYXJnIHBlcmlwaGVyYWwgY2xvY2sNCiAgICAgICAgdW5zaWduZWQgaW50IHNwZWVkKSAgICAgLy8gXGFyZyBTU0MgYmF1ZHJhdGUNCnsNCiAgICAgICAgdW5zaWduZWQgaW50IGJhdWRfdmFsdWU7DQogICAgICAgIC8vKiBEZWZpbmUgdGhlIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVyDQogICAgICAgIGlmIChzcGVlZCA9PSAwKQ0KICAgICAgICAgICBiYXVkX3ZhbHVlID0gMDsNCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgIGJhdWRfdmFsdWUgPSAodW5zaWduZWQgaW50KSAobWFpbkNsb2NrICogMTApLygyKnNwZWVkKTsNCiAgICAgICAgICAgaWYgKChiYXVkX3ZhbHVlICUgMTApID49IDUpDQogICAgICAgICAgICAgICAgICBiYXVkX3ZhbHVlID0gKGJhdWRfdmFsdWUgLyAxMCkgKyAxOw0KICAgICAgICAgICBlbHNlDQogICAgICAgICAgICAgICAgICBiYXVkX3ZhbHVlIC89IDEwOw0KICAgICAgICB9DQoNCiAgICAgICAgcFNTQy0+U1NDX0NNUiA9IGJhdWRfdmFsdWU7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0NvbmZpZ3VyZQ0KLy8qIFxicmllZiBDb25maWd1cmUgU1NDDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19Db25maWd1cmUgKA0KICAgICAgICAgICAgIEFUOTFQU19TU0MgcFNTQywgICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXINCiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3lzdF9jbG9jaywgIC8vIFxhcmcgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeQ0KICAgICAgICAgICAgIHVuc2lnbmVkIGludCBiYXVkX3JhdGUsICAgLy8gXGFyZyBFeHBlY3RlZCBCYXVkIFJhdGUgRnJlcXVlbmN5DQogICAgICAgICAgICAgdW5zaWduZWQgaW50IGNsb2NrX3J4LCAgICAvLyBcYXJnIFJlY2VpdmVyIENsb2NrIFBhcmFtZXRlcnMNCiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZV9yeCwgICAgIC8vIFxhcmcgbW9kZSBSZWdpc3RlciB0byBiZSBwcm9ncmFtbWVkDQogICAgICAgICAgICAgdW5zaWduZWQgaW50IGNsb2NrX3R4LCAgICAvLyBcYXJnIFRyYW5zbWl0dGVyIENsb2NrIFBhcmFtZXRlcnMNCiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZV90eCkgICAgIC8vIFxhcmcgbW9kZSBSZWdpc3RlciB0byBiZSBwcm9ncmFtbWVkDQp7DQogICAgLy8qIERpc2FibGUgaW50ZXJydXB0cw0KCXBTU0MtPlNTQ19JRFIgPSAodW5zaWduZWQgaW50KSAtMTsNCg0KICAgIC8vKiBSZXNldCByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXINCglwU1NDLT5TU0NfQ1IgPSBBVDkxQ19TU0NfU1dSU1QgfCBBVDkxQ19TU0NfUlhESVMgfCBBVDkxQ19TU0NfVFhESVMgOw0KDQogICAgLy8qIERlZmluZSB0aGUgQ2xvY2sgTW9kZSBSZWdpc3Rlcg0KCUFUOTFGX1NTQ19TZXRCYXVkcmF0ZShwU1NDLCBzeXN0X2Nsb2NrLCBiYXVkX3JhdGUpOw0KDQogICAgIC8vKiBXcml0ZSB0aGUgUmVjZWl2ZSBDbG9jayBNb2RlIFJlZ2lzdGVyDQoJcFNTQy0+U1NDX1JDTVIgPSAgY2xvY2tfcng7DQoNCiAgICAgLy8qIFdyaXRlIHRoZSBUcmFuc21pdCBDbG9jayBNb2RlIFJlZ2lzdGVyDQoJcFNTQy0+U1NDX1RDTVIgPSAgY2xvY2tfdHg7DQoNCiAgICAgLy8qIFdyaXRlIHRoZSBSZWNlaXZlIEZyYW1lIE1vZGUgUmVnaXN0ZXINCglwU1NDLT5TU0NfUkZNUiA9ICBtb2RlX3J4Ow0KDQogICAgIC8vKiBXcml0ZSB0aGUgVHJhbnNtaXQgRnJhbWUgTW9kZSBSZWdpc3Rlcg0KCXBTU0MtPlNTQ19URk1SID0gIG1vZGVfdHg7DQoNCiAgICAvLyogQ2xlYXIgVHJhbnNtaXQgYW5kIFJlY2VpdmUgQ291bnRlcnMNCglBVDkxRl9QRENfT3BlbigoQVQ5MVBTX1BEQykgJihwU1NDLT5TU0NfUlBSKSk7DQoNCg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NTQ19FbmFibGVSeA0KLy8qIFxicmllZiBFbmFibGUgcmVjZWl2aW5nIGRhdGFzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19FbmFibGVSeCAoDQoJQVQ5MVBTX1NTQyBwU1NDKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXINCnsNCiAgICAvLyogRW5hYmxlIHJlY2VpdmVyDQogICAgcFNTQy0+U1NDX0NSID0gQVQ5MUNfU1NDX1JYRU47DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0Rpc2FibGVSeA0KLy8qIFxicmllZiBEaXNhYmxlIHJlY2VpdmluZyBkYXRhcw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfRGlzYWJsZVJ4ICgNCglBVDkxUFNfU1NDIHBTU0MpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcg0Kew0KICAgIC8vKiBEaXNhYmxlIHJlY2VpdmVyDQogICAgcFNTQy0+U1NDX0NSID0gQVQ5MUNfU1NDX1JYRElTOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NTQ19FbmFibGVUeA0KLy8qIFxicmllZiBFbmFibGUgc2VuZGluZyBkYXRhcw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfRW5hYmxlVHggKA0KCUFUOTFQU19TU0MgcFNTQykgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyDQp7DQogICAgLy8qIEVuYWJsZSAgdHJhbnNtaXR0ZXINCiAgICBwU1NDLT5TU0NfQ1IgPSBBVDkxQ19TU0NfVFhFTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TU0NfRGlzYWJsZVR4DQovLyogXGJyaWVmIERpc2FibGUgc2VuZGluZyBkYXRhcw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfRGlzYWJsZVR4ICgNCglBVDkxUFNfU1NDIHBTU0MpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcg0Kew0KICAgIC8vKiBEaXNhYmxlICB0cmFuc21pdHRlcg0KICAgIHBTU0MtPlNTQ19DUiA9IEFUOTFDX1NTQ19UWERJUzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TU0NfRW5hYmxlSXQNCi8vKiBcYnJpZWYgRW5hYmxlIFNTQyBJVA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfRW5hYmxlSXQgKA0KCUFUOTFQU19TU0MgcFNTQywgLy8gXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGVuYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3Rlcg0KCXBTU0MtPlNTQ19JRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NTQ19EaXNhYmxlSXQNCi8vKiBcYnJpZWYgRGlzYWJsZSBTU0MgSVQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0Rpc2FibGVJdCAoDQoJQVQ5MVBTX1NTQyBwU1NDLCAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIFxhcmcgSVQgdG8gYmUgZGlzYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3Rlcg0KCXBTU0MtPlNTQ19JRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NTQ19SZWNlaXZlRnJhbWUNCi8vKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYnVzeQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NTQ19SZWNlaXZlRnJhbWUgKA0KCUFUOTFQU19TU0MgcFNTQywNCgljaGFyICpwQnVmZmVyLA0KCXVuc2lnbmVkIGludCBzekJ1ZmZlciwNCgljaGFyICpwTmV4dEJ1ZmZlciwNCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCglyZXR1cm4gQVQ5MUZfUERDX1JlY2VpdmVGcmFtZSgNCgkJKEFUOTFQU19QREMpICYocFNTQy0+U1NDX1JQUiksDQoJCXBCdWZmZXIsDQoJCXN6QnVmZmVyLA0KCQlwTmV4dEJ1ZmZlciwNCgkJc3pOZXh0QnVmZmVyKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TU0NfU2VuZEZyYW1lDQovLyogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9TU0NfU2VuZEZyYW1lKA0KCUFUOTFQU19TU0MgcFNTQywNCgljaGFyICpwQnVmZmVyLA0KCXVuc2lnbmVkIGludCBzekJ1ZmZlciwNCgljaGFyICpwTmV4dEJ1ZmZlciwNCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkNCnsNCglyZXR1cm4gQVQ5MUZfUERDX1NlbmRGcmFtZSgNCgkJKEFUOTFQU19QREMpICYocFNTQy0+U1NDX1JQUiksDQoJCXBCdWZmZXIsDQoJCXN6QnVmZmVyLA0KCQlwTmV4dEJ1ZmZlciwNCgkJc3pOZXh0QnVmZmVyKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TU0NfR2V0SW50ZXJydXB0TWFza1N0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gU1NDIEludGVycnVwdCBNYXNrIFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NTQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFNTQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX1NTQyBwU3NjKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXINCnsNCiAgICAgICAgcmV0dXJuIHBTc2MtPlNTQ19JTVI7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0lzSW50ZXJydXB0TWFza2VkDQovLyogXGJyaWVmIFRlc3QgaWYgU1NDIEludGVycnVwdCBpcyBNYXNrZWQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9TU0NfSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19TU0MgcFNzYywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQogICAgICAgIHJldHVybiAoQVQ5MUZfU1NDX0dldEludGVycnVwdE1hc2tTdGF0dXMocFNzYykgJiBmbGFnKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFRXSQ0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0VuYWJsZUl0DQovLyogXGJyaWVmIEVuYWJsZSBUV0kgSVQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0VuYWJsZUl0ICgNCglBVDkxUFNfVFdJIHBUV0ksIC8vIFxhcmcgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBlbmFibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXINCglwVFdJLT5UV0lfSUVSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UV0lfRGlzYWJsZUl0DQovLyogXGJyaWVmIERpc2FibGUgVFdJIElUDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RXSV9EaXNhYmxlSXQgKA0KCUFUOTFQU19UV0kgcFRXSSwgLy8gXGFyZyBwb2ludGVyIHRvIGEgVFdJIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGRpc2FibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXINCglwVFdJLT5UV0lfSURSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UV0lfQ29uZmlndXJlDQovLyogXGJyaWVmIENvbmZpZ3VyZSBUV0kgaW4gbWFzdGVyIG1vZGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0NvbmZpZ3VyZSAoIEFUOTFQU19UV0kgcFRXSSApICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyDQp7DQogICAgLy8qIERpc2FibGUgaW50ZXJydXB0cw0KCXBUV0ktPlRXSV9JRFIgPSAodW5zaWduZWQgaW50KSAtMTsNCg0KICAgIC8vKiBSZXNldCBwZXJpcGhlcmFsDQoJcFRXSS0+VFdJX0NSID0gQVQ5MUNfVFdJX1NXUlNUOw0KDQoJLy8qIFNldCBNYXN0ZXIgbW9kZQ0KCXBUV0ktPlRXSV9DUiA9IEFUOTFDX1RXSV9NU0VOOw0KDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0dldEludGVycnVwdE1hc2tTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFRXSSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UV0lfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBUV0kgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQogICAgICAgIEFUOTFQU19UV0kgcFR3aSkgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyDQp7DQogICAgICAgIHJldHVybiBwVHdpLT5UV0lfSU1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RXSV9Jc0ludGVycnVwdE1hc2tlZA0KLy8qIFxicmllZiBUZXN0IGlmIFRXSSBJbnRlcnJ1cHQgaXMgTWFza2VkDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfVFdJX0lzSW50ZXJydXB0TWFza2VkKA0KICAgICAgICBBVDkxUFNfVFdJIHBUd2ksICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KICAgICAgICByZXR1cm4gKEFUOTFGX1RXSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBUd2kpICYgZmxhZyk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQV01DDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QV01fR2V0U3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBQV00gSW50ZXJydXB0IFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BXTUNfR2V0U3RhdHVzKCAvLyBccmV0dXJuIFBXTSBJbnRlcnJ1cHQgU3RhdHVzDQoJQVQ5MVBTX1BXTUMgcFBXTSkgLy8gcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBQV00tPlBXTUNfU1I7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNX0ludGVycnVwdEVuYWJsZQ0KLy8qIFxicmllZiBFbmFibGUgUFdNIEludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0ludGVycnVwdEVuYWJsZSgNCiAgICAgICAgQVQ5MVBTX1BXTUMgcFB3bSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIFBXTSBpbnRlcnJ1cHQgdG8gYmUgZW5hYmxlZA0Kew0KICAgICAgICBwUHdtLT5QV01DX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNX0ludGVycnVwdERpc2FibGUNCi8vKiBcYnJpZWYgRGlzYWJsZSBQV00gSW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfSW50ZXJydXB0RGlzYWJsZSgNCiAgICAgICAgQVQ5MVBTX1BXTUMgcFB3bSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIFBXTSBpbnRlcnJ1cHQgdG8gYmUgZGlzYWJsZWQNCnsNCiAgICAgICAgcFB3bS0+UFdNQ19JRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BXTV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBQV00gSW50ZXJydXB0IE1hc2sgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUFdNQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFBXTSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCiAgICAgICAgQVQ5MVBTX1BXTUMgcFB3bSkgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyDQp7DQogICAgICAgIHJldHVybiBwUHdtLT5QV01DX0lNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QV01fSXNJbnRlcnJ1cHRNYXNrZWQNCi8vKiBcYnJpZWYgVGVzdCBpZiBQV00gSW50ZXJydXB0IGlzIE1hc2tlZA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BXTUNfSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19QV01DIHBQV00sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KCXJldHVybiAoQVQ5MUZfUFdNQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBQV00pICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNX0lzU3RhdHVzU2V0DQovLyogXGJyaWVmIFRlc3QgaWYgUFdNIEludGVycnVwdCBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QV01DX0lzU3RhdHVzU2V0KA0KICAgICAgICBBVDkxUFNfUFdNQyBwUFdNLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCglyZXR1cm4gKEFUOTFGX1BXTUNfR2V0U3RhdHVzKHBQV00pICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNX0NmZ0NoYW5uZWwNCi8vKiBcYnJpZWYgVGVzdCBpZiBQV00gSW50ZXJydXB0IGlzIFNldA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NmZ0NoYW5uZWwoDQogICAgICAgIEFUOTFQU19QV01DIHBQV00sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsSWQsIC8vIFxhcmcgUFdNIGNoYW5uZWwgSUQNCiAgICAgICAgdW5zaWduZWQgaW50IG1vZGUsIC8vIFxhcmcgIFBXTSBtb2RlDQogICAgICAgIHVuc2lnbmVkIGludCBwZXJpb2QsIC8vIFxhcmcgUFdNIHBlcmlvZA0KICAgICAgICB1bnNpZ25lZCBpbnQgZHV0eSkgLy8gXGFyZyBQV00gZHV0eSBjeWNsZQ0Kew0KCXBQV00tPlBXTUNfQ0hbY2hhbm5lbElkXS5QV01DX0NNUiA9IG1vZGU7DQoJcFBXTS0+UFdNQ19DSFtjaGFubmVsSWRdLlBXTUNfQ0RUWVIgPSBkdXR5Ow0KCXBQV00tPlBXTUNfQ0hbY2hhbm5lbElkXS5QV01DX0NQUkRSID0gcGVyaW9kOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BXTV9TdGFydENoYW5uZWwNCi8vKiBcYnJpZWYgRW5hYmxlIGNoYW5uZWwNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19TdGFydENoYW5uZWwoDQogICAgICAgIEFUOTFQU19QV01DIHBQV00sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBDaGFubmVscyBJRHMgdG8gYmUgZW5hYmxlZA0Kew0KCXBQV00tPlBXTUNfRU5BID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QV01fU3RvcENoYW5uZWwNCi8vKiBcYnJpZWYgRGlzYWJsZSBjaGFubmVsDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfU3RvcENoYW5uZWwoDQogICAgICAgIEFUOTFQU19QV01DIHBQV00sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBDaGFubmVscyBJRHMgdG8gYmUgZW5hYmxlZA0Kew0KCXBQV00tPlBXTUNfRElTID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QV01fVXBkYXRlQ2hhbm5lbA0KLy8qIFxicmllZiBVcGRhdGUgUGVyaW9kIG9yIER1dHkgQ3ljbGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19VcGRhdGVDaGFubmVsKA0KICAgICAgICBBVDkxUFNfUFdNQyBwUFdNLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgY2hhbm5lbElkLCAvLyBcYXJnIFBXTSBjaGFubmVsIElEDQogICAgICAgIHVuc2lnbmVkIGludCB1cGRhdGUpIC8vIFxhcmcgIENoYW5uZWxzIElEcyB0byBiZSBlbmFibGVkDQp7DQoJcFBXTS0+UFdNQ19DSFtjaGFubmVsSWRdLlBXTUNfQ1VQRFIgPSB1cGRhdGU7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBVRFANCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9FbmFibGVJdA0KLy8qIFxicmllZiBFbmFibGUgVURQIElUDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FbmFibGVJdCAoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGVuYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3Rlcg0KCXBVRFAtPlVEUF9JRVIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9EaXNhYmxlSXQNCi8vKiBcYnJpZWYgRGlzYWJsZSBVRFAgSVQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0Rpc2FibGVJdCAoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGRpc2FibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXINCglwVURQLT5VRFBfSURSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfU2V0QWRkcmVzcw0KLy8qIFxicmllZiBTZXQgVURQIGZ1bmN0aW9uYWwgYWRkcmVzcw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfU2V0QWRkcmVzcyAoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBjaGFyIGFkZHJlc3MpICAgLy8gXGFyZyBuZXcgVURQIGFkZHJlc3MNCnsNCglwVURQLT5VRFBfRkFERFIgPSAoQVQ5MUNfVURQX0ZFTiB8IGFkZHJlc3MpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9FbmFibGVFcA0KLy8qIFxicmllZiBFbmFibGUgRW5kcG9pbnQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VuYWJsZUVwICgNCglBVDkxUFNfVURQIHBVRFAsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcg0KCXVuc2lnbmVkIGNoYXIgZW5kcG9pbnQpICAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXINCnsNCglwVURQLT5VRFBfQ1NSW2VuZHBvaW50XSB8PSBBVDkxQ19VRFBfRVBFRFM7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVURQX0Rpc2FibGVFcA0KLy8qIFxicmllZiBFbmFibGUgRW5kcG9pbnQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0Rpc2FibGVFcCAoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50KSAgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyDQp7DQoJcFVEUC0+VURQX0NTUltlbmRwb2ludF0gJj0gfkFUOTFDX1VEUF9FUEVEUzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfU2V0U3RhdGUNCi8vKiBcYnJpZWYgU2V0IFVEUCBEZXZpY2Ugc3RhdGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX1NldFN0YXRlICgNCglBVDkxUFNfVURQIHBVRFAsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIFxhcmcgbmV3IFVEUCBhZGRyZXNzDQp7DQoJcFVEUC0+VURQX0dMQlNUQVRFICAmPSB+KEFUOTFDX1VEUF9GQURERU4gfCBBVDkxQ19VRFBfQ09ORkcpOw0KCXBVRFAtPlVEUF9HTEJTVEFURSAgfD0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfR2V0U3RhdGUNCi8vKiBcYnJpZWYgcmV0dXJuIFVEUCBEZXZpY2Ugc3RhdGUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VRFBfR2V0U3RhdGUgKCAvLyBccmV0dXJuIHRoZSBVRFAgZGV2aWNlIHN0YXRlDQoJQVQ5MVBTX1VEUCBwVURQKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gKHBVRFAtPlVEUF9HTEJTVEFURSAgJiAoQVQ5MUNfVURQX0ZBRERFTiB8IEFUOTFDX1VEUF9DT05GRykpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9SZXNldEVwDQovLyogXGJyaWVmIFJlc2V0IFVEUCBlbmRwb2ludA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfUmVzZXRFcCAoIC8vIFxyZXR1cm4gdGhlIFVEUCBkZXZpY2Ugc3RhdGUNCglBVDkxUFNfVURQIHBVRFAsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIFxhcmcgRW5kcG9pbnRzIHRvIGJlIHJlc2V0DQp7DQoJcFVEUC0+VURQX1JTVEVQID0gZmxhZzsNCglwVURQLT5VRFBfUlNURVAgPSAwOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9FcFN0YWxsDQovLyogXGJyaWVmIEVuZHBvaW50IHdpbGwgU1RBTEwgcmVxdWVzdHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VwU3RhbGwoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50KSAgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyDQp7DQoJcFVEUC0+VURQX0NTUltlbmRwb2ludF0gfD0gQVQ5MUNfVURQX0ZPUkNFU1RBTEw7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVURQX0VwV3JpdGUNCi8vKiBcYnJpZWYgV3JpdGUgdmFsdWUgaW4gdGhlIERQUg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRXBXcml0ZSgNCglBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50LCAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXINCgl1bnNpZ25lZCBjaGFyIHZhbHVlKSAgICAgLy8gXGFyZyB2YWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSBEUFINCnsNCglwVURQLT5VRFBfRkRSW2VuZHBvaW50XSA9IHZhbHVlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9FcFJlYWQNCi8vKiBcYnJpZWYgUmV0dXJuIHZhbHVlIGZyb20gdGhlIERQUg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VEUF9FcFJlYWQoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBlbmRwb2ludCkgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyDQp7DQoJcmV0dXJuIHBVRFAtPlVEUF9GRFJbZW5kcG9pbnRdOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9FcEVuZE9mV3INCi8vKiBcYnJpZWYgTm90aWZ5IHRoZSBVRFAgdGhhdCB2YWx1ZXMgaW4gRFBSIGFyZSByZWFkeSB0byBiZSBzZW50DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FcEVuZE9mV3IoDQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBlbmRwb2ludCkgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyDQp7DQoJcFVEUC0+VURQX0NTUltlbmRwb2ludF0gfD0gQVQ5MUNfVURQX1RYUEtUUkRZOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9FcENsZWFyDQovLyogXGJyaWVmIENsZWFyIGZsYWcgaW4gdGhlIGVuZHBvaW50IENTUiByZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRXBDbGVhcigNCglBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50LCAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAgICAgLy8gXGFyZyBmbGFnIHRvIGJlIGNsZWFyZWQNCnsNCglwVURQLT5VRFBfQ1NSW2VuZHBvaW50XSAmPSB+KGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9FcFNldA0KLy8qIFxicmllZiBTZXQgZmxhZyBpbiB0aGUgZW5kcG9pbnQgQ1NSIHJlZ2lzdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FcFNldCgNCglBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50LCAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAgICAgLy8gXGFyZyBmbGFnIHRvIGJlIGNsZWFyZWQNCnsNCglwVURQLT5VRFBfQ1NSW2VuZHBvaW50XSB8PSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9FcFN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gdGhlIGVuZHBvaW50IENTUiByZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VEUF9FcFN0YXR1cygNCglBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50KSAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXINCnsNCglyZXR1cm4gcFVEUC0+VURQX0NTUltlbmRwb2ludF07DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVURQX0dldEludGVycnVwdE1hc2tTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFVEUCBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VRFBfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBVRFAgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQogICAgICAgIEFUOTFQU19VRFAgcFVkcCkgLy8gXGFyZyAgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQp7DQogICAgICAgIHJldHVybiBwVWRwLT5VRFBfSU1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VEUF9Jc0ludGVycnVwdE1hc2tlZA0KLy8qIFxicmllZiBUZXN0IGlmIFVEUCBJbnRlcnJ1cHQgaXMgTWFza2VkDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSBpbnQgQVQ5MUZfVURQX0lzSW50ZXJydXB0TWFza2VkKA0KICAgICAgICBBVDkxUFNfVURQIHBVZHAsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KICAgICAgICByZXR1cm4gKEFUOTFGX1VEUF9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBVZHApICYgZmxhZyk7DQp9DQoNCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBUQw0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVENfSW50ZXJydXB0RW5hYmxlDQovLyogXGJyaWVmIEVuYWJsZSBUQyBJbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVENfSW50ZXJydXB0RW5hYmxlKA0KICAgICAgICBBVDkxUFNfVEMgcFRjLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUQyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBUQyBpbnRlcnJ1cHQgdG8gYmUgZW5hYmxlZA0Kew0KICAgICAgICBwVGMtPlRDX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVENfSW50ZXJydXB0RGlzYWJsZQ0KLy8qIFxicmllZiBEaXNhYmxlIFRDIEludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQ19JbnRlcnJ1cHREaXNhYmxlKA0KICAgICAgICBBVDkxUFNfVEMgcFRjLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUQyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBUQyBpbnRlcnJ1cHQgdG8gYmUgZGlzYWJsZWQNCnsNCiAgICAgICAgcFRjLT5UQ19JRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RDX0dldEludGVycnVwdE1hc2tTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFRDIEludGVycnVwdCBNYXNrIFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1RDX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gVEMgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQogICAgICAgIEFUOTFQU19UQyBwVGMpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUQyBjb250cm9sbGVyDQp7DQogICAgICAgIHJldHVybiBwVGMtPlRDX0lNUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UQ19Jc0ludGVycnVwdE1hc2tlZA0KLy8qIFxicmllZiBUZXN0IGlmIFRDIEludGVycnVwdCBpcyBNYXNrZWQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIGludCBBVDkxRl9UQ19Jc0ludGVycnVwdE1hc2tlZCgNCiAgICAgICAgQVQ5MVBTX1RDIHBUYywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgVEMgY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCiAgICAgICAgcmV0dXJuIChBVDkxRl9UQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBUYykgJiBmbGFnKTsNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIENBTg0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCiNkZWZpbmUJU1RBTkRBUkRfRk9STUFUIDANCiNkZWZpbmUJRVhURU5ERURfRk9STUFUIDENCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9Jbml0TWFpbGJveFJlZ2lzdGVycygpDQovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0luaXRNYWlsYm94UmVnaXN0ZXJzKEFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsDQoJCQkJCQkJCWludCAgCQkJbW9kZV9yZWcsDQoJCQkJCQkJCWludCAJCQlhY2NlcHRhbmNlX21hc2tfcmVnLA0KCQkJCQkJCQlpbnQgIAkJCWlkX3JlZywNCgkJCQkJCQkJaW50ICAJCQlkYXRhX2xvd19yZWcsDQoJCQkJCQkJCWludCAgCQkJZGF0YV9oaWdoX3JlZywNCgkJCQkJCQkJaW50ICAJCQljb250cm9sX3JlZykNCnsNCglDQU5fTWFpbGJveC0+Q0FOX01CX01DUiAJPSAweDA7DQoJQ0FOX01haWxib3gtPkNBTl9NQl9NTVIgCT0gbW9kZV9yZWc7DQoJQ0FOX01haWxib3gtPkNBTl9NQl9NQU0gCT0gYWNjZXB0YW5jZV9tYXNrX3JlZzsNCglDQU5fTWFpbGJveC0+Q0FOX01CX01JRCAJPSBpZF9yZWc7DQoJQ0FOX01haWxib3gtPkNBTl9NQl9NREwgCT0gZGF0YV9sb3dfcmVnOyAJCQ0KCUNBTl9NYWlsYm94LT5DQU5fTUJfTURIIAk9IGRhdGFfaGlnaF9yZWc7DQoJQ0FOX01haWxib3gtPkNBTl9NQl9NQ1IgCT0gY29udHJvbF9yZWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfRW5hYmxlQ0FOKCkNCi8vKiBcYnJpZWYNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfRW5hYmxlQ0FOKA0KCUFUOTFQU19DQU4gcENBTikgICAgIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0Kew0KCXBDQU4tPkNBTl9NUiB8PSBBVDkxQ19DQU5fQ0FORU47DQoNCgkvLyBXYWl0IGZvciBXQUtFVVAgZmxhZyByYWlzaW5nIDw9PiAxMS1yZWNlc3NpdmUtYml0IHdlcmUgc2Nhbm5lZCBieSB0aGUgdHJhbnNjZWl2ZXINCgl3aGlsZSggKHBDQU4tPkNBTl9TUiAmIEFUOTFDX0NBTl9XQUtFVVApICE9IEFUOTFDX0NBTl9XQUtFVVAgKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9EaXNhYmxlQ0FOKCkNCi8vKiBcYnJpZWYNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfRGlzYWJsZUNBTigNCglBVDkxUFNfQ0FOIHBDQU4pICAgICAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXINCnsNCglwQ0FOLT5DQU5fTVIgJj0gfkFUOTFDX0NBTl9DQU5FTjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fRW5hYmxlSXQNCi8vKiBcYnJpZWYgRW5hYmxlIENBTiBpbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0VuYWJsZUl0ICgNCglBVDkxUFNfQ0FOIHBDQU4sICAgICAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBJVCB0byBiZSBlbmFibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXINCglwQ0FOLT5DQU5fSUVSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fRGlzYWJsZUl0DQovLyogXGJyaWVmIERpc2FibGUgQ0FOIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fRGlzYWJsZUl0ICgNCglBVDkxUFNfQ0FOIHBDQU4sIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAvLyBJVCB0byBiZSBkaXNhYmxlZA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyDQoJcENBTi0+Q0FOX0lEUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldFN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gQ0FOIEludGVycnVwdCBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0U3RhdHVzKCAvLyBccmV0dXJuIENBTiBJbnRlcnJ1cHQgU3RhdHVzDQoJQVQ5MVBTX0NBTiBwQ0FOKSAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcENBTi0+Q0FOX1NSOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzDQovLyogXGJyaWVmIFJldHVybiBDQU4gSW50ZXJydXB0IE1hc2sgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gQ0FOIEludGVycnVwdCBNYXNrIFN0YXR1cw0KCUFUOTFQU19DQU4gcENBTikgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBDQU4tPkNBTl9JTVI7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0lzSW50ZXJydXB0TWFza2VkDQovLyogXGJyaWVmIFRlc3QgaWYgQ0FOIEludGVycnVwdCBpcyBNYXNrZWQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fSXNJbnRlcnJ1cHRNYXNrZWQoDQogICAgICAgIEFUOTFQU19DQU4gcENBTiwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXINCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkDQp7DQoJcmV0dXJuIChBVDkxRl9DQU5fR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwQ0FOKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9Jc1N0YXR1c1NldA0KLy8qIFxicmllZiBUZXN0IGlmIENBTiBJbnRlcnJ1cHQgaXMgU2V0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0lzU3RhdHVzU2V0KA0KICAgICAgICBBVDkxUFNfQ0FOIHBDQU4sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KCXJldHVybiAoQVQ5MUZfQ0FOX0dldFN0YXR1cyhwQ0FOKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9DZmdNb2RlUmVnDQovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQ0FOIGNvbnRyb2xsZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01vZGVSZWcgKA0KCUFUOTFQU19DQU4gcENBTiwgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IG1vZGUpICAgICAgICAvLyBtb2RlIHJlZ2lzdGVyDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBNUiByZWdpc3Rlcg0KCXBDQU4tPkNBTl9NUiA9IG1vZGU7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1vZGVSZWcNCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBDQU4gY29udHJvbGxlciB2YWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNb2RlUmVnICgNCglBVDkxUFNfQ0FOIHBDQU4gLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwQ0FOLT5DQU5fTVI7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9DZmdCYXVkcmF0ZVJlZw0KLy8qIFxicmllZiBDb25maWd1cmUgdGhlIEJhdWRyYXRlIG9mIHRoZSBDQU4gY29udHJvbGxlciBmb3IgdGhlIG5ldHdvcmsNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ0JhdWRyYXRlUmVnICgNCglBVDkxUFNfQ0FOIHBDQU4sIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBiYXVkcmF0ZV9jZmcpDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBCUiByZWdpc3Rlcg0KCXBDQU4tPkNBTl9CUiA9IGJhdWRyYXRlX2NmZzsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldEJhdWRyYXRlDQovLyogXGJyaWVmIFJldHVybiB0aGUgQmF1ZHJhdGUgb2YgdGhlIENBTiBjb250cm9sbGVyIGZvciB0aGUgbmV0d29yayB2YWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRCYXVkcmF0ZSAoDQoJQVQ5MVBTX0NBTiBwQ0FOIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcENBTi0+Q0FOX0JSOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0SW50ZXJuYWxDb3VudGVyDQovLyogXGJyaWVmIFJldHVybiBDQU4gVGltZXIgUmVnc2l0ZXIgVmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0SW50ZXJuYWxDb3VudGVyICgNCglBVDkxUFNfQ0FOIHBDQU4gLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwQ0FOLT5DQU5fVElNOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0VGltZXN0YW1wDQovLyogXGJyaWVmIFJldHVybiBDQU4gVGltZXN0YW1wIFJlZ2lzdGVyIFZhbHVlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldFRpbWVzdGFtcCAoDQoJQVQ5MVBTX0NBTiBwQ0FOIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcENBTi0+Q0FOX1RJTUVTVFA7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRFcnJvckNvdW50ZXINCi8vKiBcYnJpZWYgUmV0dXJuIENBTiBFcnJvciBDb3VudGVyIFJlZ2lzdGVyIFZhbHVlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldEVycm9yQ291bnRlciAoDQoJQVQ5MVBTX0NBTiBwQ0FOIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcENBTi0+Q0FOX0VDUjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0luaXRUcmFuc2ZlclJlcXVlc3QNCi8vKiBcYnJpZWYgUmVxdWVzdCBmb3IgYSB0cmFuc2ZlciBvbiB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94ZXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0luaXRUcmFuc2ZlclJlcXVlc3QgKA0KCUFUOTFQU19DQU4gcENBTiwgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyDQogICAgdW5zaWduZWQgaW50IHRyYW5zZmVyX2NtZCkNCnsNCglwQ0FOLT5DQU5fVENSID0gdHJhbnNmZXJfY21kOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fSW5pdEFib3J0UmVxdWVzdA0KLy8qIFxicmllZiBBYm9ydCB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94ZXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0luaXRBYm9ydFJlcXVlc3QgKA0KCUFUOTFQU19DQU4gcENBTiwgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyDQogICAgdW5zaWduZWQgaW50IGFib3J0X2NtZCkNCnsNCglwQ0FOLT5DQU5fQUNSID0gYWJvcnRfY21kOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fQ2ZnTWVzc2FnZU1vZGVSZWcNCi8vKiBcYnJpZWYgUHJvZ3JhbSB0aGUgTWVzc2FnZSBNb2RlIFJlZ2lzdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNZXNzYWdlTW9kZVJlZyAoDQoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCwgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94DQogICAgdW5zaWduZWQgaW50IG1vZGUpDQp7DQoJQ0FOX01haWxib3gtPkNBTl9NQl9NTVIgPSBtb2RlOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZU1vZGVSZWcNCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBNZXNzYWdlIE1vZGUgUmVnaXN0ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0TWVzc2FnZU1vZGVSZWcgKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0Kew0KCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01NUjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VJRFJlZw0KLy8qIFxicmllZiBQcm9ncmFtIHRoZSBNZXNzYWdlIElEIFJlZ2lzdGVyDQovLyogXGJyaWVmIFZlcnNpb24gPT0gMCBmb3IgU3RhbmRhcmQgbWVzc3NhZ2UsIFZlcnNpb24gPT0gMSBmb3IgRXh0ZW5kZWQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VJRFJlZyAoDQoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCwgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94DQogICAgdW5zaWduZWQgaW50IGlkLA0KICAgIHVuc2lnbmVkIGNoYXIgdmVyc2lvbikNCnsNCglpZih2ZXJzaW9uPT0wKQkvLyBJRHZBIFN0YW5kYXJkIEZvcm1hdA0KCQlDQU5fTWFpbGJveC0+Q0FOX01CX01JRCA9IGlkPDwxODsNCgllbHNlCS8vIElEdkIgRXh0ZW5kZWQgRm9ybWF0DQoJCUNBTl9NYWlsYm94LT5DQU5fTUJfTUlEID0gaWQgfCAoMTw8MjkpOwkvLyBzZXQgTUlERSBiaXQNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZUlEUmVnDQovLyogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBJRCBSZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlSURSZWcgKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0Kew0KCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01JRDsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fQ2ZnTWVzc2FnZUFjY2VwdGFuY2VNYXNrUmVnDQovLyogXGJyaWVmIFByb2dyYW0gdGhlIE1lc3NhZ2UgQWNjZXB0YW5jZSBNYXNrIFJlZ2lzdGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNZXNzYWdlQWNjZXB0YW5jZU1hc2tSZWcgKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0KICAgIHVuc2lnbmVkIGludCBtYXNrKQ0Kew0KCUNBTl9NYWlsYm94LT5DQU5fTUJfTUFNID0gbWFzazsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZUFjY2VwdGFuY2VNYXNrUmVnDQovLyogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBBY2NlcHRhbmNlIE1hc2sgUmVnaXN0ZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0TWVzc2FnZUFjY2VwdGFuY2VNYXNrUmVnICgNCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94KSAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gNCnsNCglyZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NQU07DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldEZhbWlseUlEDQovLyogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBJRCBSZWdpc3Rlcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRGYW1pbHlJRCAoDQoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCkgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94DQp7DQoJcmV0dXJuIENBTl9NYWlsYm94LT5DQU5fTUJfTUZJRDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VDdHJsDQovLyogXGJyaWVmIFJlcXVlc3QgYW5kIGNvbmZpZyBmb3IgYSB0cmFuc2ZlciBvbiB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNZXNzYWdlQ3RybFJlZyAoDQoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCwgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94DQogICAgdW5zaWduZWQgaW50IG1lc3NhZ2VfY3RybF9jbWQpDQp7DQoJQ0FOX01haWxib3gtPkNBTl9NQl9NQ1IgPSBtZXNzYWdlX2N0cmxfY21kOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZVN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gQ0FOIE1haWxib3ggU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VTdGF0dXMgKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0Kew0KCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01TUjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhTG93DQovLyogXGJyaWVmIFByb2dyYW0gZGF0YSBsb3cgdmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhTG93ICgNCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94LCAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gNCiAgICB1bnNpZ25lZCBpbnQgZGF0YSkNCnsNCglDQU5fTWFpbGJveC0+Q0FOX01CX01ETCA9IGRhdGE7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlRGF0YUxvdw0KLy8qIFxicmllZiBSZXR1cm4gZGF0YSBsb3cgdmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0TWVzc2FnZURhdGFMb3cgKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0Kew0KCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01ETDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhSGlnaA0KLy8qIFxicmllZiBQcm9ncmFtIGRhdGEgaGlnaCB2YWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZURhdGFIaWdoICgNCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94LCAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gNCiAgICB1bnNpZ25lZCBpbnQgZGF0YSkNCnsNCglDQU5fTWFpbGJveC0+Q0FOX01CX01ESCA9IGRhdGE7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlRGF0YUhpZ2gNCi8vKiBcYnJpZWYgUmV0dXJuIGRhdGEgaGlnaCB2YWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlRGF0YUhpZ2ggKA0KCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveA0Kew0KCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01ESDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX09wZW4NCi8vKiBcYnJpZWYgT3BlbiBhIENBTiBQb3J0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX09wZW4gKA0KICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgbnVsbCkgIC8vIFxhcmcNCnsNCiAgICAgICAgLyogTk9UIERFRklORUQgQVQgVEhJUyBNT01FTlQgKi8NCiAgICAgICAgcmV0dXJuICggMCApOw0KfQ0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIEFEQw0KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0VuYWJsZUl0DQovLyogXGJyaWVmIEVuYWJsZSBBREMgaW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19FbmFibGVJdCAoDQoJQVQ5MVBTX0FEQyBwQURDLCAgICAgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gSVQgdG8gYmUgZW5hYmxlZA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyDQoJcEFEQy0+QURDX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0Rpc2FibGVJdA0KLy8qIFxicmllZiBEaXNhYmxlIEFEQyBpbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0Rpc2FibGVJdCAoDQoJQVQ5MVBTX0FEQyBwQURDLCAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gSVQgdG8gYmUgZGlzYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3Rlcg0KCXBBREMtPkFEQ19JRFIgPSBmbGFnOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIEFEQyBJbnRlcnJ1cHQgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldFN0YXR1cyggLy8gXHJldHVybiBBREMgSW50ZXJydXB0IFN0YXR1cw0KCUFUOTFQU19BREMgcEFEQykgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBBREMtPkFEQ19TUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0SW50ZXJydXB0TWFza1N0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gQURDIEludGVycnVwdCBNYXNrIFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIEFEQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCglBVDkxUFNfQURDIHBBREMpIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0Kew0KCXJldHVybiBwQURDLT5BRENfSU1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19Jc0ludGVycnVwdE1hc2tlZA0KLy8qIFxicmllZiBUZXN0IGlmIEFEQyBJbnRlcnJ1cHQgaXMgTWFza2VkDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0lzSW50ZXJydXB0TWFza2VkKA0KICAgICAgICBBVDkxUFNfQURDIHBBREMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KCXJldHVybiAoQVQ5MUZfQURDX0dldEludGVycnVwdE1hc2tTdGF0dXMocEFEQykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfSXNTdGF0dXNTZXQNCi8vKiBcYnJpZWYgVGVzdCBpZiBBREMgU3RhdHVzIGlzIFNldA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19Jc1N0YXR1c1NldCgNCiAgICAgICAgQVQ5MVBTX0FEQyBwQURDLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCglyZXR1cm4gKEFUOTFGX0FEQ19HZXRTdGF0dXMocEFEQykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfQ2ZnTW9kZVJlZw0KLy8qIFxicmllZiBDb25maWd1cmUgdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIEFEQyBjb250cm9sbGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19DZmdNb2RlUmVnICgNCglBVDkxUFNfQURDIHBBREMsIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBtb2RlKSAgICAgICAgLy8gbW9kZSByZWdpc3Rlcg0Kew0KCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXINCglwQURDLT5BRENfTVIgPSBtb2RlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRNb2RlUmVnDQovLyogXGJyaWVmIFJldHVybiB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQURDIGNvbnRyb2xsZXIgdmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0TW9kZVJlZyAoDQoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcEFEQy0+QURDX01SOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfQ2ZnVGltaW5ncw0KLy8qIFxicmllZiBDb25maWd1cmUgdGhlIGRpZmZlcmVudCBuZWNlc3NhcnkgdGltaW5ncyBvZiB0aGUgQURDIGNvbnRyb2xsZXINCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0NmZ1RpbWluZ3MgKA0KCUFUOTFQU19BREMgcEFEQywgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IG1ja19jbG9jaywgLy8gaW4gTUh6DQoJdW5zaWduZWQgaW50IGFkY19jbG9jaywgLy8gaW4gTUh6DQoJdW5zaWduZWQgaW50IHN0YXJ0dXBfdGltZSwgLy8gaW4gdXMNCgl1bnNpZ25lZCBpbnQgc2FtcGxlX2FuZF9ob2xkX3RpbWUpCS8vIGluIG5zDQp7DQoJdW5zaWduZWQgaW50IHByZXNjYWwsc3RhcnR1cCxzaHRpbTsNCgkNCglwcmVzY2FsID0gbWNrX2Nsb2NrLygyKmFkY19jbG9jaykgLSAxOw0KCXN0YXJ0dXAgPSBhZGNfY2xvY2sqc3RhcnR1cF90aW1lLzggLSAxOw0KCXNodGltID0gYWRjX2Nsb2NrKnNhbXBsZV9hbmRfaG9sZF90aW1lLzEwMDAgLSAxOw0KCQ0KCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXINCglwQURDLT5BRENfTVIgPSAoIChwcmVzY2FsPDw4KSAmIEFUOTFDX0FEQ19QUkVTQ0FMKSB8ICggKHN0YXJ0dXA8PDE2KSAmIEFUOTFDX0FEQ19TVEFSVFVQKSB8ICggKHNodGltPDwyNCkgJiBBVDkxQ19BRENfU0hUSU0pOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19FbmFibGVDaGFubmVsDQovLyogXGJyaWVmIFJldHVybiBBREMgVGltZXIgUmVnaXN0ZXIgVmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0VuYWJsZUNoYW5uZWwgKA0KCUFUOTFQU19BREMgcEFEQywgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJdW5zaWduZWQgaW50IGNoYW5uZWwpICAgICAgICAvLyBtb2RlIHJlZ2lzdGVyDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBDSEVSIHJlZ2lzdGVyDQoJcEFEQy0+QURDX0NIRVIgPSBjaGFubmVsOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19EaXNhYmxlQ2hhbm5lbA0KLy8qIFxicmllZiBSZXR1cm4gQURDIFRpbWVyIFJlZ2lzdGVyIFZhbHVlDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19EaXNhYmxlQ2hhbm5lbCAoDQoJQVQ5MVBTX0FEQyBwQURDLCAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgY2hhbm5lbCkgICAgICAgIC8vIG1vZGUgcmVnaXN0ZXINCnsNCgkvLyogV3JpdGUgdG8gdGhlIENIRFIgcmVnaXN0ZXINCglwQURDLT5BRENfQ0hEUiA9IGNoYW5uZWw7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENoYW5uZWxTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIEFEQyBUaW1lciBSZWdpc3RlciBWYWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDaGFubmVsU3RhdHVzICgNCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwQURDLT5BRENfQ0hTUjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX1N0YXJ0Q29udmVyc2lvbg0KLy8qIFxicmllZiBTb2Z0d2FyZSByZXF1ZXN0IGZvciBhIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnNpb24NCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX1N0YXJ0Q29udmVyc2lvbiAoDQoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCSkNCnsNCglwQURDLT5BRENfQ1IgPSBBVDkxQ19BRENfU1RBUlQ7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19Tb2Z0UmVzZXQNCi8vKiBcYnJpZWYgU29mdHdhcmUgcmVzZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX1NvZnRSZXNldCAoDQoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCSkNCnsNCglwQURDLT5BRENfQ1IgPSBBVDkxQ19BRENfU1dSU1Q7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRMYXN0Q29udmVydGVkRGF0YQ0KLy8qIFxicmllZiBSZXR1cm4gdGhlIExhc3QgQ29udmVydGVkIERhdGENCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0TGFzdENvbnZlcnRlZERhdGEgKA0KCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgkpDQp7DQoJcmV0dXJuIHBBREMtPkFEQ19MQ0RSOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMA0KLy8qIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgMCBDb252ZXJ0ZWQgRGF0YQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gwICgNCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwQURDLT5BRENfQ0RSMDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDENCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDEgQ29udmVydGVkIERhdGENCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMSAoDQoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcEFEQy0+QURDX0NEUjE7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gyDQovLyogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCAyIENvbnZlcnRlZCBEYXRhDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDIgKA0KCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgkpDQp7DQoJcmV0dXJuIHBBREMtPkFEQ19DRFIyOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMw0KLy8qIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgMyBDb252ZXJ0ZWQgRGF0YQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gzICgNCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwQURDLT5BRENfQ0RSMzsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDQNCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDQgQ29udmVydGVkIERhdGENCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINCAoDQoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcEFEQy0+QURDX0NEUjQ7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g1DQovLyogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCA1IENvbnZlcnRlZCBEYXRhDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDUgKA0KCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXINCgkpDQp7DQoJcmV0dXJuIHBBREMtPkFEQ19DRFI1OwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINg0KLy8qIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgNiBDb252ZXJ0ZWQgRGF0YQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g2ICgNCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyDQoJKQ0Kew0KCXJldHVybiBwQURDLT5BRENfQ0RSNjsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDcNCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDcgQ29udmVydGVkIERhdGENCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINyAoDQoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcEFEQy0+QURDX0NEUjc7CQ0KfQ0KDQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgQUVTDQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfRW5hYmxlSXQNCi8vKiBcYnJpZWYgRW5hYmxlIEFFUyBpbnRlcnJ1cHQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0VuYWJsZUl0ICgNCglBVDkxUFNfQUVTIHBBRVMsICAgICAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBJVCB0byBiZSBlbmFibGVkDQp7DQoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXINCglwQUVTLT5BRVNfSUVSID0gZmxhZzsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfRGlzYWJsZUl0DQovLyogXGJyaWVmIERpc2FibGUgQUVTIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfRGlzYWJsZUl0ICgNCglBVDkxUFNfQUVTIHBBRVMsIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAvLyBJVCB0byBiZSBkaXNhYmxlZA0Kew0KCS8vKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyDQoJcEFFUy0+QUVTX0lEUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0dldFN0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gQUVTIEludGVycnVwdCBTdGF0dXMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfR2V0U3RhdHVzKCAvLyBccmV0dXJuIEFFUyBJbnRlcnJ1cHQgU3RhdHVzDQoJQVQ5MVBTX0FFUyBwQUVTKSAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcEFFUy0+QUVTX0lTUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cw0KLy8qIFxicmllZiBSZXR1cm4gQUVTIEludGVycnVwdCBNYXNrIFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FFU19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIEFFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMNCglBVDkxUFNfQUVTIHBBRVMpIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcg0Kew0KCXJldHVybiBwQUVTLT5BRVNfSU1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19Jc0ludGVycnVwdE1hc2tlZA0KLy8qIFxicmllZiBUZXN0IGlmIEFFUyBJbnRlcnJ1cHQgaXMgTWFza2VkDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0lzSW50ZXJydXB0TWFza2VkKA0KICAgICAgICBBVDkxUFNfQUVTIHBBRVMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KCXJldHVybiAoQVQ5MUZfQUVTX0dldEludGVycnVwdE1hc2tTdGF0dXMocEFFUykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfSXNTdGF0dXNTZXQNCi8vKiBcYnJpZWYgVGVzdCBpZiBBRVMgU3RhdHVzIGlzIFNldA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FFU19Jc1N0YXR1c1NldCgNCiAgICAgICAgQVQ5MVBTX0FFUyBwQUVTLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcg0KICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQNCnsNCglyZXR1cm4gKEFUOTFGX0FFU19HZXRTdGF0dXMocEFFUykgJiBmbGFnKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfQ2ZnTW9kZVJlZw0KLy8qIFxicmllZiBDb25maWd1cmUgdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIEFFUyBjb250cm9sbGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19DZmdNb2RlUmVnICgNCglBVDkxUFNfQUVTIHBBRVMsIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBtb2RlKSAgICAgICAgLy8gbW9kZSByZWdpc3Rlcg0Kew0KCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXINCglwQUVTLT5BRVNfTVIgPSBtb2RlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19HZXRNb2RlUmVnDQovLyogXGJyaWVmIFJldHVybiB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQUVTIGNvbnRyb2xsZXIgdmFsdWUNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfR2V0TW9kZVJlZyAoDQoJQVQ5MVBTX0FFUyBwQUVTIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcEFFUy0+QUVTX01SOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfU3RhcnRQcm9jZXNzaW5nDQovLyogXGJyaWVmIFN0YXJ0IEVuY3J5cHRpb24gb3IgRGVjcnlwdGlvbg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfU3RhcnRQcm9jZXNzaW5nICgNCglBVDkxUFNfQUVTIHBBRVMgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQoJKQ0Kew0KCXBBRVMtPkFFU19DUiA9IEFUOTFDX0FFU19TVEFSVDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUVTX1NvZnRSZXNldA0KLy8qIFxicmllZiBSZXNldCBBRVMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX1NvZnRSZXNldCAoDQoJQVQ5MVBTX0FFUyBwQUVTIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcg0KCSkNCnsNCglwQUVTLT5BRVNfQ1IgPSBBVDkxQ19BRVNfU1dSU1Q7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19Mb2FkTmV3U2VlZA0KLy8qIFxicmllZiBMb2FkIE5ldyBTZWVkIGluIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfTG9hZE5ld1NlZWQgKA0KCUFUOTFQU19BRVMgcEFFUyAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXINCgkpDQp7DQoJcEFFUy0+QUVTX0NSID0gQVQ5MUNfQUVTX0xPQURTRUVEOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfU2V0Q3J5cHRvS2V5DQovLyogXGJyaWVmIFNldCBDcnlwdG9ncmFwaGljIEtleSB4DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19TZXRDcnlwdG9LZXkgKA0KCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBpbmRleCwNCgl1bnNpZ25lZCBpbnQga2V5d29yZA0KCSkNCnsNCglwQUVTLT5BRVNfS0VZV3hSW2luZGV4XSA9IGtleXdvcmQ7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19JbnB1dERhdGENCi8vKiBcYnJpZWYgU2V0IElucHV0IERhdGEgeA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfSW5wdXREYXRhICgNCglBVDkxUFNfQUVTIHBBRVMsIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGNoYXIgaW5kZXgsDQoJdW5zaWduZWQgaW50IGluZGF0YQ0KCSkNCnsNCglwQUVTLT5BRVNfSURBVEF4UltpbmRleF0gPSBpbmRhdGE7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FFU19HZXRPdXRwdXREYXRhDQovLyogXGJyaWVmIEdldCBPdXRwdXQgRGF0YSB4DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0dldE91dHB1dERhdGEgKA0KCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBpbmRleA0KCSkNCnsNCglyZXR1cm4gcEFFUy0+QUVTX09EQVRBeFJbaW5kZXhdOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRVNfU2V0SW5pdGlhbGl6YXRpb25WZWN0b3INCi8vKiBcYnJpZWYgU2V0IEluaXRpYWxpemF0aW9uIFZlY3RvciAob3IgQ291bnRlcikgeA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfU2V0SW5pdGlhbGl6YXRpb25WZWN0b3IgKA0KCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBpbmRleCwNCgl1bnNpZ25lZCBpbnQgaW5pdHZlY3Rvcg0KCSkNCnsNCglwQUVTLT5BRVNfSVZ4UltpbmRleF0gPSBpbml0dmVjdG9yOwkNCn0NCg0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFRERVMNCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfRW5hYmxlSXQNCi8vKiBcYnJpZWYgRW5hYmxlIFRERVMgaW50ZXJydXB0DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfRW5hYmxlSXQgKA0KCUFUOTFQU19UREVTIHBUREVTLCAgICAgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIElUIHRvIGJlIGVuYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3Rlcg0KCXBUREVTLT5UREVTX0lFUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVERFU19EaXNhYmxlSXQNCi8vKiBcYnJpZWYgRGlzYWJsZSBUREVTIGludGVycnVwdA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0Rpc2FibGVJdCAoDQoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gSVQgdG8gYmUgZGlzYWJsZWQNCnsNCgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3Rlcg0KCXBUREVTLT5UREVTX0lEUiA9IGZsYWc7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVERFU19HZXRTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFRERVMgSW50ZXJydXB0IFN0YXR1cw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1RERVNfR2V0U3RhdHVzKCAvLyBccmV0dXJuIFRERVMgSW50ZXJydXB0IFN0YXR1cw0KCUFUOTFQU19UREVTIHBUREVTKSAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQp7DQoJcmV0dXJuIHBUREVTLT5UREVTX0lTUjsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0dldEludGVycnVwdE1hc2tTdGF0dXMNCi8vKiBcYnJpZWYgUmV0dXJuIFRERVMgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFRERVMgSW50ZXJydXB0IE1hc2sgU3RhdHVzDQoJQVQ5MVBTX1RERVMgcFRERVMpIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXINCnsNCglyZXR1cm4gcFRERVMtPlRERVNfSU1SOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfSXNJbnRlcnJ1cHRNYXNrZWQNCi8vKiBcYnJpZWYgVGVzdCBpZiBUREVTIEludGVycnVwdCBpcyBNYXNrZWQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0lzSW50ZXJydXB0TWFza2VkKA0KICAgICAgICBBVDkxUFNfVERFUyBwVERFUywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KCXJldHVybiAoQVQ5MUZfVERFU19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBUREVTKSAmIGZsYWcpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfSXNTdGF0dXNTZXQNCi8vKiBcYnJpZWYgVGVzdCBpZiBUREVTIFN0YXR1cyBpcyBTZXQNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0lzU3RhdHVzU2V0KA0KICAgICAgICBBVDkxUFNfVERFUyBwVERFUywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZA0Kew0KCXJldHVybiAoQVQ5MUZfVERFU19HZXRTdGF0dXMocFRERVMpICYgZmxhZyk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVERFU19DZmdNb2RlUmVnDQovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgVERFUyBjb250cm9sbGVyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfQ2ZnTW9kZVJlZyAoDQoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBpbnQgbW9kZSkgICAgICAgIC8vIG1vZGUgcmVnaXN0ZXINCnsNCgkvLyogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyDQoJcFRERVMtPlRERVNfTVIgPSBtb2RlOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfR2V0TW9kZVJlZw0KLy8qIFxicmllZiBSZXR1cm4gdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIFRERVMgY29udHJvbGxlciB2YWx1ZQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1RERVNfR2V0TW9kZVJlZyAoDQoJQVQ5MVBTX1RERVMgcFRERVMgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KCSkNCnsNCglyZXR1cm4gcFRERVMtPlRERVNfTVI7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfU3RhcnRQcm9jZXNzaW5nDQovLyogXGJyaWVmIFN0YXJ0IEVuY3J5cHRpb24gb3IgRGVjcnlwdGlvbg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1N0YXJ0UHJvY2Vzc2luZyAoDQoJQVQ5MVBTX1RERVMgcFRERVMgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KCSkNCnsNCglwVERFUy0+VERFU19DUiA9IEFUOTFDX1RERVNfU1RBUlQ7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfU29mdFJlc2V0DQovLyogXGJyaWVmIFJlc2V0IFRERVMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19Tb2Z0UmVzZXQgKA0KCUFUOTFQU19UREVTIHBUREVTIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXINCgkpDQp7DQoJcFRERVMtPlRERVNfQ1IgPSBBVDkxQ19UREVTX1NXUlNUOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UREVTX1NldENyeXB0b0tleTENCi8vKiBcYnJpZWYgU2V0IENyeXB0b2dyYXBoaWMgS2V5IDEgV29yZCB4DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MSAoDQoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXINCgl1bnNpZ25lZCBjaGFyIGluZGV4LA0KCXVuc2lnbmVkIGludCBrZXl3b3JkDQoJKQ0Kew0KCXBUREVTLT5UREVTX0tFWTFXeFJbaW5kZXhdID0ga2V5d29yZDsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkyDQovLyogXGJyaWVmIFNldCBDcnlwdG9ncmFwaGljIEtleSAyIFdvcmQgeA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1NldENyeXB0b0tleTIgKA0KCUFUOTFQU19UREVTIHBUREVTLCAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyDQoJdW5zaWduZWQgY2hhciBpbmRleCwNCgl1bnNpZ25lZCBpbnQga2V5d29yZA0KCSkNCnsNCglwVERFUy0+VERFU19LRVkyV3hSW2luZGV4XSA9IGtleXdvcmQ7CQ0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5Mw0KLy8qIFxicmllZiBTZXQgQ3J5cHRvZ3JhcGhpYyBLZXkgMyBXb3JkIHgNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19TZXRDcnlwdG9LZXkzICgNCglBVDkxUFNfVERFUyBwVERFUywgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGNoYXIgaW5kZXgsDQoJdW5zaWduZWQgaW50IGtleXdvcmQNCgkpDQp7DQoJcFRERVMtPlRERVNfS0VZM1d4UltpbmRleF0gPSBrZXl3b3JkOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0lucHV0RGF0YQ0KLy8qIFxicmllZiBTZXQgSW5wdXQgRGF0YSB4DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfSW5wdXREYXRhICgNCglBVDkxUFNfVERFUyBwVERFUywgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGNoYXIgaW5kZXgsDQoJdW5zaWduZWQgaW50IGluZGF0YQ0KCSkNCnsNCglwVERFUy0+VERFU19JREFUQXhSW2luZGV4XSA9IGluZGF0YTsJDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVERFU19HZXRPdXRwdXREYXRhDQovLyogXGJyaWVmIEdldCBPdXRwdXQgRGF0YSB4DQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19HZXRPdXRwdXREYXRhICgNCglBVDkxUFNfVERFUyBwVERFUywgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGNoYXIgaW5kZXgNCgkpDQp7DQoJcmV0dXJuIHBUREVTLT5UREVTX09EQVRBeFJbaW5kZXhdOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UREVTX1NldEluaXRpYWxpemF0aW9uVmVjdG9yDQovLyogXGJyaWVmIFNldCBJbml0aWFsaXphdGlvbiBWZWN0b3IgeA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1NldEluaXRpYWxpemF0aW9uVmVjdG9yICgNCglBVDkxUFNfVERFUyBwVERFUywgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcg0KCXVuc2lnbmVkIGNoYXIgaW5kZXgsDQoJdW5zaWduZWQgaW50IGluaXR2ZWN0b3INCgkpDQp7DQoJcFRERVMtPlRERVNfSVZ4UltpbmRleF0gPSBpbml0dmVjdG9yOwkNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9EQkdVX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBEQkdVDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0RCR1VfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TWVMpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9EQkdVX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIERCR1Ugc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9EQkdVX0NmZ1BJTyAodm9pZCkNCnsNCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjdfRFJYRCAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjhfRFRYRCAgICApLCAvLyBQZXJpcGhlcmFsIEENCgkJMCk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUE1DDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NZUykpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BNQ19DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQTUMgc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIzMF9QQ0syICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyOV9QQ0sxICAgICksIC8vIFBlcmlwaGVyYWwgQQ0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyMF9QQ0swICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIwX1BDSzAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjIyX1BDSzIgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjIxX1BDSzEgICAgKSk7IC8vIFBlcmlwaGVyYWwgQg0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkwLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMzBfUENLMiAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTNfUENLMSAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjdfUENLMyAgICApKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVlJFR19DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVlJFRw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9WUkVHX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1lTKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUlNUQ19DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUlNUQw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9SU1RDX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1lTKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBTU0MNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1NDKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFNTQyBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTI1X1JLICAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTIyX1RLICAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTIxX1RGICAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTI0X1JEICAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTI2X1JGICAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTIzX1REICAgICAgKSwgLy8gUGVyaXBoZXJhbCBBDQoJCTApOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9XRFRDX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBXRFRDDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1dEVENfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TWVMpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VUzFfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFVTMQ0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VUzFfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9VUzEpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VUzFfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgVVMxIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVVMxX0NmZ1BJTyAodm9pZCkNCnsNCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJMCwgLy8gUGVyaXBoZXJhbCBBDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI2X1JJMSAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI0X0RTUjEgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjIzX0RDRDEgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI1X0RUUjEgICAgKSk7IC8vIFBlcmlwaGVyYWwgQg0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE3X1NDSzEgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQThfUlRTMSAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBNl9UWEQxICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE1X1JYRDEgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTlfQ1RTMSAgICApLCAvLyBQZXJpcGhlcmFsIEENCgkJMCk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTMF9DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVVMwDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1VTMF9DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1VTMCkpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1VTMF9DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBVUzAgc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VUzBfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEwX1JYRDAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTRfQ1RTMCAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBM19SVFMwICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyX1NDSzAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTFfVFhEMCAgICApLCAvLyBQZXJpcGhlcmFsIEENCgkJMCk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSTFfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFNQSTENCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJMV9DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NQSTEpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9TUEkxX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFNQSTEgc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUEkxX0NmZ1BJTyAodm9pZCkNCnsNCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJMCwgLy8gUGVyaXBoZXJhbCBBDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE2X05QQ1MxMyAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjEwX05QQ1MxMSAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjExX05QQ1MxMiAgKSk7IC8vIFBlcmlwaGVyYWwgQg0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkwLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBNF9OUENTMTMgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyOV9OUENTMTMgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyMV9OUENTMTAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyMl9TUENLMSAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyNV9OUENTMTEgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyX05QQ1MxMSAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTI0X01JU08xICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTNfTlBDUzEyICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjZfTlBDUzEyICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjNfTU9TSTEgICApKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfU1BJMF9DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgU1BJMA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUEkwX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1BJMCkpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1NQSTBfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgU1BJMCBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSTBfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkwLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTNfTlBDUzAxICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTdfTlBDUzAzICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTRfTlBDUzAyICApKTsgLy8gUGVyaXBoZXJhbCBCDQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE2X01JU08wICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTEzX05QQ1MwMSAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE1X05QQ1MwMyAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE3X01PU0kwICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE4X1NQQ0swICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE0X05QQ1MwMiAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTEyX05QQ1MwMCAgKSwgLy8gUGVyaXBoZXJhbCBBDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTdfTlBDUzAxICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBOV9OUENTMDMgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE4X05QQ1MwMiAgKSk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BJVENfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFBJVEMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUElUQ19DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NZUykpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0FJQ19DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgQUlDDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0FJQ19DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX0ZJUSkgfA0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9JUlEwKSB8DQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX0lSUTEpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BSUNfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgQUlDIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0NmZ1BJTyAodm9pZCkNCnsNCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMzBfSVJRMCAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjlfRklRICAgICApLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTRfSVJRMSAgICApKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBBRVMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfQUVTKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBUV0kNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVFdJX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfVFdJKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFRXSSBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RXSV9DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTExX1RXQ0sgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTEwX1RXRCAgICAgKSwgLy8gUGVyaXBoZXJhbCBBDQoJCTApOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIEFEQw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9BREMpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9BRENfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgQURDIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0NmZ1BJTyAodm9pZCkNCnsNCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJMCwgLy8gUGVyaXBoZXJhbCBBDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE4X0FEVFJHICAgKSk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BXTUNfQ0gzX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFBXTUNfQ0gzIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19DSDNfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyMl9QV00zICAgICksIC8vIFBlcmlwaGVyYWwgQQ0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIzMF9QV00zICAgICkpOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QV01DX0NIMl9DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQV01DX0NIMiBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ0gyX0NmZ1BJTyAodm9pZCkNCnsNCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjFfUFdNMiAgICApLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjlfUFdNMiAgICApKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNQ19DSDFfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgUFdNQ19DSDEgc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NIMV9DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjIwX1BXTTEgICAgKSwgLy8gUGVyaXBoZXJhbCBBDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI4X1BXTTEgICAgKSk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1BXTUNfQ0gwX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFBXTUNfQ0gwIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19DSDBfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxOV9QV00wICAgICksIC8vIFBlcmlwaGVyYWwgQQ0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyN19QV00wICAgICkpOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9SVFRDX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBSVFRDDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVENfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TWVMpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9VRFBfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFVEUA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9VRFApKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBUREVTDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9UREVTKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfRU1BQ19DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgRU1BQw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9FTUFDX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfRU1BQykpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0VNQUNfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgRU1BQyBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0VNQUNfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyX0VUWDAgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjEyX0VUWEVSICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE2X0VDT0wgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjExX0VUWDMgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjZfRVJYMSAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTVfRVJYRFYgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTNfRVJYMiAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCM19FVFgxICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEI4X0VNREMgICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjVfRVJYMCAgICApIHwNCgkJLy8oKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxOF9FRjEwMCAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxNF9FUlgzICAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEI0X0VDUlNfRUNSU0RWKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjFfRVRYRU4gICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTBfRVRYMiAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMF9FVFhDS19FUkVGQ0spIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCOV9FTURJTyAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEI3X0VSWEVSICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE3X0VSWENLICAgKSwgLy8gUGVyaXBoZXJhbCBBDQoJCTApOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UQzBfQ2ZnUE1DDQovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFRDMA0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzBfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9UQzApKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9UQzBfQ2ZnUElPDQovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgVEMwIHNpZ25hbHMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVEMwX0NmZ1BJTyAodm9pZCkNCnsNCgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlDQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgNCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjNfVElPQTAgICApIHwNCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjRfVElPQjAgICApLCAvLyBQZXJpcGhlcmFsIEENCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTJfVENMSzAgICApKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVEMxX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBUQzENCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfVEMxX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfVEMxKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfVEMxX0NmZ1BJTw0KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFRDMSBzaWduYWxzDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RDMV9DZmdQSU8gKHZvaWQpDQp7DQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI1X1RJT0ExICAgKSB8DQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI2X1RJT0IxICAgKSwgLy8gUGVyaXBoZXJhbCBBDQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE5X1RDTEsxICAgKSk7IC8vIFBlcmlwaGVyYWwgQg0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RDMl9DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVEMyDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1RDMl9DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1RDMikpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX1RDMl9DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBUQzIgc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzJfQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyOF9USU9CMiAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyN19USU9BMiAgICksIC8vIFBlcmlwaGVyYWwgQQ0KCQkwKTsgLy8gUGVyaXBoZXJhbCBCDQoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQ0KCUFUOTFGX1BJT19DZmdQZXJpcGgoDQoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCTAsIC8vIFBlcmlwaGVyYWwgQQ0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExNV9UQ0xLMiAgICkpOyAvLyBQZXJpcGhlcmFsIEINCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9NQ19DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgTUMNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCl9faW5saW5lIHZvaWQgQVQ5MUZfTUNfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TWVMpKTsNCn0NCg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8qIFxmbiAgICBBVDkxRl9QSU9BX0NmZ1BNQw0KLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBQSU9BDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT0FfQ2ZnUE1DICh2b2lkKQ0Kew0KCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygNCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9QSU9BKSk7DQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUElPQl9DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUElPQg0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9CX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfUElPQikpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgQ0FODQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdQTUMgKHZvaWQpDQp7DQoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKA0KCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzDQoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX0NBTikpOw0KfQ0KDQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLyogXGZuICAgIEFUOTFGX0NBTl9DZmdQSU8NCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBDQU4gc2lnbmFscw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnUElPICh2b2lkKQ0Kew0KCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUNCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKA0KCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcw0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyMF9DQU5UWCAgICkgfA0KCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExOV9DQU5SWCAgICksIC8vIFBlcmlwaGVyYWwgQQ0KCQkwKTsgLy8gUGVyaXBoZXJhbCBCDQp9DQoNCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi8vKiBcZm4gICAgQVQ5MUZfUFdNQ19DZmdQTUMNCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUFdNQw0KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NmZ1BNQyAodm9pZCkNCnsNCglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soDQoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MNCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfUFdNQykpOw0KfQ0KDQojZW5kaWYgLy8gbGliX0FUOTFTQU03WDI1Nl9IDQo=