LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICogQGZpbGUgICAgIHN5c3RlbV9YTUM0MjAwLmMNCiAqIEBicmllZiAgICBDTVNJUyBDb3J0ZXgtTTQgRGV2aWNlIFBlcmlwaGVyYWwgQWNjZXNzIExheWVyIEhlYWRlciBGaWxlDQogKiAgICAgICAgICAgZm9yIHRoZSBJbmZpbmVvbiBYTUM0MDAwIERldmljZSBTZXJpZXMNCiAqIEB2ZXJzaW9uICBWMy4wLjEgQWxwaGENCiAqIEBkYXRlICAgICAyNi4gU2VwdGVtYmVyIDIwMTINCiAqDQogKiBAbm90ZQ0KICogQ29weXJpZ2h0IChDKSAyMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIEBwYXINCiAqIEFSTSBMaW1pdGVkIChBUk0pIGlzIHN1cHBseWluZyB0aGlzIHNvZnR3YXJlIGZvciB1c2Ugd2l0aCBDb3J0ZXgtTSANCiAqIHByb2Nlc3NvciBiYXNlZCBtaWNyb2NvbnRyb2xsZXJzLiAgVGhpcyBmaWxlIGNhbiBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgDQogKiB3aXRoaW4gZGV2ZWxvcG1lbnQgdG9vbHMgdGhhdCBhcmUgc3VwcG9ydGluZyBzdWNoIEFSTSBiYXNlZCBwcm9jZXNzb3JzLiANCiAqDQogKiBAcGFyDQogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIuICBOTyBXQVJSQU5USUVTLCBXSEVUSEVSIEVYUFJFU1MsIElNUExJRUQNCiAqIE9SIFNUQVRVVE9SWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUFBMWSBUTyBUSElTIFNPRlRXQVJFLg0KICogQVJNIFNIQUxMIE5PVCwgSU4gQU5ZIENJUkNVTVNUQU5DRVMsIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1INCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUywgRk9SIEFOWSBSRUFTT04gV0hBVFNPRVZFUi4NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSA8c3lzdGVtX1hNQzQyMDAuaD4NCiNpbmNsdWRlIDxYTUM0MjAwLmg+DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykqLw0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrOw0KDQovKiBjbG9jayBkZWZpbml0aW9ucywgZG8gbm90IG1vZGlmeSEgKi8NCiNkZWZpbmUgU0NVX0NMT0NLX0NSWVNUQUwgICAgICAgICAgICAgIAkxDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkJCSAgIAkyDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQwkgICAJMw0KDQoNCiNkZWZpbmUgSElCX0NMT0NLX0ZPU0kJCQkJCTEJCQkJIA0KI2RlZmluZSBISUJfQ0xPQ0tfT1NDVUxQCQkJCTINCg0KDQoNCg0KLyoNCi8vLS0tLS0tLS0gPDw8IFVzZSBDb25maWd1cmF0aW9uIFdpemFyZCBpbiBDb250ZXh0IE1lbnUgPj4+IC0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCg0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhdGNoZG9nIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBXYXRjaGRvZyBDb25maWd1cmF0aW9uDQovLyAgICAgPG8xLjA+IERpc2FibGUgV2F0Y2hkb2cNCi8vDQovLyA8L2U+DQoqLw0KI2RlZmluZSBXRFRfU0VUVVAgICAgICAgICAgICAgICAxDQojZGVmaW5lIFdEVEVOQl9uVmFsICAgICAgICAgICAgIDB4MDAwMDAwMDENCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0xPQ0sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gPGU+IE1haW4gQ2xvY2sgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4xPiBDUFUgY2xvY2sgZGl2aWRlcg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IGZDUFUgPSBmU1lTIA0KLy8gICAgICAgICAgICAgICAgICAgICA8MT0+IGZDUFUgPSBmU1lTIC8gMg0KLy8gICAgIDxvMi4wLi4xPiAgUGVyaXBoZXJhbCBCdXMgY2xvY2sgZGl2aWRlcg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IGZQQgk9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmUEIJPSBmQ1BVIC8gMg0KLy8gICAgIDxvMy4wLi4xPiAgQ0NVIEJ1cyBjbG9jayBkaXZpZGVyDQovLyAgICAgICAgICAgICAgICAgICAgIDwwPT4gZkNDVSA9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmQ0NVID0gZkNQVSAvIDINCi8vDQovLyA8L2U+DQovLyANCiovDQoNCiNkZWZpbmUgU0NVX0NMT0NLX1NFVFVQICAgICAgICAgICAgICAgMQ0KI2RlZmluZQlTQ1VfQ1BVQ0xLQ1JfRElWCQkweDAwMDAwMDAwDQojZGVmaW5lCVNDVV9QQkNMS0NSX0RJVgkJICAgIDB4MDAwMDAwMDANCiNkZWZpbmUJU0NVX0NDVUNMS0NSX0RJVgkJMHgwMDAwMDAwMA0KLyogbm90IGF2YWxpYmxlIGluIGNvbmZpZyB3aXp6YXJkKi8NCi8qCQkJCQ0KKiBtYW5kYXRvcnkgY2xvY2sgcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgkJCQkNCioJCQkJDQoqIHNvdXJjZSBmb3IgY2xvY2sgZ2VuZXJhdGlvbgkJCQkNCiogcmFuZ2U6IFNDVV9DTE9DS19DUllTVEFMIChjcnlzdGFsIG9yIGV4dGVybmFsIGNsb2NrIGF0IGNyeXN0YWwgaW5wdXQpCQkJCQ0KKgkJCQkNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkJCQkNCi8vIFNlbGVjdGlvbiBvZiBpbXB1dCBsb2NrIGZvciBQTEwJDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUJU0NVX1BMTF9DTE9DS19JTlBVVAlTQ1VfQ0xPQ0tfQ1JZU1RBTA0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWQ0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8gU3RhbmRieSBjbG9jayBzZWxlY3Rpb24gZm9yIEJhY2t1cCBjbG9jayBzb3VyY2UgdHJpbW1pbmcNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZQlTQ1VfU1RBTkRCWV9DTE9DSyAgSElCX0NMT0NLX09TQ1VMUA0KLy8jZGVmaW5lCVNDVV9TVEFOREJZX0NMT0NLICBISUJfQ0xPQ0tfRk9TSQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vIEdsb2JhbCBjbG9jayBwYXJhbWV0ZXJzDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgQ0xPQ0tfRlNZUwkJCQkJCQk4MDAwMDAwMA0KI2RlZmluZQlDTE9DS19DUllTVEFMX0ZSRVFVRU5DWQkxMjAwMDAwMAkJDQojZGVmaW5lCUNMT0NLX0JBQ0tfVVAJCQkJCQkyNDAwMDAwMAkJDQoJCQkJDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIE9TQ19IUCBzZXR1cCBwYXJhbWV0ZXJzICovCQkJCQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojZGVmaW5lCVNDVV9PU0NfSFBfTU9ERQkweEYwDQojZGVmaW5lCVNDVV9PU0NIUFdER0RJVgkyCQkNCgkJCQkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogTUFJTiBQTEwgc2V0dXAgcGFyYW1ldGVycyAqLwkJCQkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy9EaXZpZGVyIHNldHRpbmdzIGZvciBleHRlcm5hbCBjcnlzdGFsIEAgMTIgTUh6IA0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojZGVmaW5lIAlTQ1VfUExMX0sxRElWCTENCiNkZWZpbmUgCVNDVV9QTExfSzFESVYJMQkJDQojZGVmaW5lIAlTQ1VfUExMX0syRElWCTUJCQ0KI2RlZmluZSAJU0NVX1BMTF9QRElWCTEJCQ0KI2RlZmluZSAJU0NVX1BMTF9ORElWCTc5CQkNCgkJCQkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy9EaXZpZGVyIHNldHRpbmdzIGZvciB1c2Ugb2YgYmFja3VwIGNsb2NrIHNvdXJjZSB0cmltbWVkDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vI2RlZmluZSAJU0NVX1BMTF9LMURJVgkxCQkNCi8vI2RlZmluZSAJU0NVX1BMTF9LMkRJVgk1CQkNCi8vI2RlZmluZSAJU0NVX1BMTF9QRElWCTMJCQ0KLy8jZGVmaW5lIAlTQ1VfUExMX05ESVYJNzkJCQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQiBDTE9DSyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBVU0IgQ2xvY2sgQ29uZmlndXJhdGlvbg0KLy8NCi8vIDwvZT4NCi8vIA0KKi8NCg0KI2RlZmluZSBTQ1VfVVNCX0NMT0NLX1NFVFVQICAgICAgICAgICAgICAwDQovKiBub3QgYXZhbGlibGUgaW4gY29uZmlnIHdpenphcmQqLw0KI2RlZmluZSAJU0NVX1VTQlBMTF9QRElWCTAJCQ0KI2RlZmluZSAJU0NVX1VTQlBMTF9ORElWCTMxCQkNCiNkZWZpbmUgCVNDVV9VU0JESVYJMwkJDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gPGU+IEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4zPiAgIEZsYXNoIFdhaXQgU3RhdGUNCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiAzIFdTDQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gNCBXUw0KLy8gICAgICAgICAgICAgICAgICAgICA8Mj0+IDUgV1MgICAgIA0KLy8JCQkJCQkJCQkJIDwzPT4gNiBXUw0KLy8gPC9lPg0KLy8gDQoqLw0KDQojZGVmaW5lIFBNVV9GTEFTSCAgICAgICAgICAgICAxDQojZGVmaW5lCVBNVV9GTEFTSF9XUwkJCQkJMHgwMDAwMDAwMA0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENMT0NLT1VUIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBDbG9jayBPVVQgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4xPiAgIENsb2Nrb3V0IFNvdXJjZSBTZWxlY3Rpb24NCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiBTeXN0ZW0gQ2xvY2sNCi8vICAgICAgICAgICAgICAgICAgICAgPDI9PiBEaXZpZGVkIHZhbHVlIG9mIFVTQiBQTEwgb3V0cHV0DQovLyAgICAgICAgICAgICAgICAgICAgIDwzPT4gRGl2aWRlZCB2YWx1ZSBvZiBQTEwgQ2xvY2sNCi8vICAgICA8bzIuMC4uND4gICBDbG9ja291dCBkaXZpZGVyIDwxLTEwPjwjLTE+DQovLyAgICAgPG8zLjAuLjE+ICAgQ2xvY2tvdXQgUGluIFNlbGVjdGlvbg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IFAxLjE1DQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gUDAuOA0KLy8gICAgICAgICAgICAgICAgICAgICANCi8vDQovLyA8L2U+DQovLyANCiovDQoNCiNkZWZpbmUgU0NVX0NMT0NLT1VUX1NFVFVQICAgICAgICAgICAgICAgMA0KI2RlZmluZQlTQ1VfQ0xPQ0tPVVRfU09VUkNFCQkweDAwMDAwMDAwDQojZGVmaW5lCVNDVV9DTE9DS09VVF9ESVYJCTB4MDAwMDAwMDkNCiNkZWZpbmUJU0NVX0NMT0NLT1VUX1BJTgkJMHgwMDAwMDAwMQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQ2xvY2sgVmFyaWFibGUgZGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiE8IFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgKENvcmUgQ2xvY2spKi8NCiNpZiBTQ1VfQ0xPQ0tfU0VUVVANCnVpbnQzMl90IFN5c3RlbUNvcmVDbG9jayA9IENMT0NLX0ZTWVM7DQojZWxzZQ0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrID0gQ0xPQ0tfQkFDS19VUDsNCiNlbmRpZg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgc3RhdGljIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaWYgKFNDVV9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBTeXN0ZW1DbG9ja1NldHVwKHZvaWQpOw0KI2VuZGlmDQoNCiNpZiAoU0NVX1VTQl9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBVU0JDbG9ja1NldHVwKHZvaWQpOw0KI2VuZGlmDQoNCg0KLyoqDQogICogQGJyaWVmICBTZXR1cCB0aGUgbWljcm9jb250cm9sbGVyIHN5c3RlbS4NCiAgKiAgICAgICAgIEluaXRpYWxpemUgdGhlIFBMTCBhbmQgdXBkYXRlIHRoZSANCiAgKiAgICAgICAgIFN5c3RlbUNvcmVDbG9jayB2YXJpYWJsZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU3lzdGVtSW5pdCh2b2lkKQ0Kew0KaW50IHRlbXA7DQoJDQojaWYgKF9fRlBVX1BSRVNFTlQgPT0gMSkgJiYgKF9fRlBVX1VTRUQgPT0gMSkNClNDQi0+Q1BBQ1IgfD0gKCgzVUwgPDwgMTAqMikgfCAgICAgICAgICAgICAgICAgLyogc2V0IENQMTAgRnVsbCBBY2Nlc3MgKi8NCiAgICAgICAgICAgICAgICgzVUwgPDwgMTEqMikgICk7ICAgICAgICAgICAgICAgLyogc2V0IENQMTEgRnVsbCBBY2Nlc3MgKi8NCiNlbmRpZg0KCQ0KLyogRW5hYmxlIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIC0gU0NCX0NDUi5VTkFMSUdOX1RSUCA9IDAgKi8NClNDQi0+Q0NSICY9IH4oU0NCX0NDUl9VTkFMSUdOX1RSUF9Nc2spOw0KCQ0KLyogU2V0dXAgdGhlIFdEVCAqLw0KI2lmIFdEVF9TRVRVUA0KDQpXRFQtPkNUUiAmPSB+V0RURU5CX25WYWw7IA0KDQojZW5kaWYNCg0KDQovKiBTZXR1cCB0aGUgRmxhc2ggV2FpdCBTdGF0ZSAqLw0KI2lmIFBNVV9GTEFTSA0KdGVtcCA9IEZMQVNIMC0+RkNPTjsgDQp0ZW1wICY9IH5GTEFTSF9GQ09OX1dTUEZMQVNIX01zazsNCnRlbXAgfD0gUE1VX0ZMQVNIX1dTKzM7DQpGTEFTSDAtPkZDT04gPSB0ZW1wOw0KI2VuZGlmDQoNCgkNCi8qIFNldHVwIHRoZSBjbG9ja291dCAqLw0KI2lmIFNDVV9DTE9DS09VVF9TRVRVUA0KDQpTQ1VfQ0xLLT5FWFRDTEtDUgl8PSBTQ1VfQ0xPQ0tPVVRfU09VUkNFOw0KLypzZXQgUExMIGRpdiBmb3IgY2xrb3V0ICovDQpTQ1VfQ0xLLT5FWFRDTEtDUgl8PSBTQ1VfQ0xPQ0tPVVRfRElWPDwxNjsNCg0KaWYgKFNDVV9DTE9DS09VVF9QSU4pIHsNCgkJCQkJCVBPUlQwLT5JT0NSOCA9IDB4MDAwMDAwODg7ICAgLypQMC44IC0tPiBBTFQxIHNlbGVjdCArICBIV1NFTCAqLw0KCQkJCQkgICAgUE9SVDAtPkhXU0VMICY9ICh+UE9SVDBfSFdTRUxfSFc4X01zayk7DQoJCQkJCSAgICBQT1JUMC0+UERSMSAmPSAoflBPUlQwX1BEUjFfUEQ4X01zayk7ICAvKnNldCB0byBzdHJvbmcgZHJpdmVyICovDQoJCQkJCQl9DQplbHNlIHsNCgkJUE9SVDEtPklPQ1IxMiA9IDB4ODgwMDAwMDA7ICAgICAgICAgICAgICAgICAgICAvKlAxLjE1LS0+IEFMVDEgc2VsZWN0ICovDQoJICAgIFBPUlQxLT5QRFIxICY9ICh+UE9SVDFfUERSMV9QRDE1X01zayk7ICAvKnNldCB0byBzdHJvbmcgZHJpdmVyICovDQoJCX0NCg0KI2VuZGlmDQoNCg0KLyogU2V0dXAgdGhlIFN5c3RlbSBjbG9jayAqLyANCiNpZiBTQ1VfQ0xPQ0tfU0VUVVANClN5c3RlbUNsb2NrU2V0dXAoKTsNCiNlbmRpZg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQ2xvY2sgVmFyaWFibGUgZGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpTeXN0ZW1Db3JlQ2xvY2tVcGRhdGUoKTsvKiE8IFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgKENvcmUgQ2xvY2spKi8NCg0KDQovKiBTZXR1cCB0aGUgVVNCIFBMICovIA0KI2lmIFNDVV9VU0JfQ0xPQ0tfU0VUVVANClVTQkNsb2NrU2V0dXAoKTsNCiNlbmRpZg0KDQoNCg0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgVXBkYXRlIFN5c3RlbUNvcmVDbG9jayBhY2NvcmRpbmcgdG8gQ2xvY2sgUmVnaXN0ZXIgVmFsdWVzDQogICogQG5vdGUgICAtICANCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU3lzdGVtQ29yZUNsb2NrVXBkYXRlKHZvaWQpDQp7DQp1bnNpZ25lZCBpbnQgUERJVjsNCnVuc2lnbmVkIGludCBORElWOw0KdW5zaWduZWQgaW50IEsyRElWOw0KdW5zaWduZWQgaW50IGxvbmcgVkNPOw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmlmIChTQ1VfQ0xLLT5TWVNDTEtDUiA9PSAgMHgwMDAxMDAwMCkNCnsNCglpZiAoU0NVX1BMTC0+UExMU1RBVCAmIFNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zayl7DQoJCS8qIGNoZWNrIGlmIFBMTCBpcyBsb2NrZWQgKi8NCgkJLyogcmVhZCBiYWNrIGRpdmlkZXIgc2V0dGluZ3MgKi8NCgkJIFBESVYgPSAoKFNDVV9QTEwtPlBMTENPTjEgJiBTQ1VfUExMX1BMTENPTjFfUERJVl9Nc2spPj4yNCkrMTsNCgkJIE5ESVYgPSAoKFNDVV9QTEwtPlBMTENPTjEgJiBTQ1VfUExMX1BMTENPTjFfTkRJVl9Nc2spPj44KSsxOw0KCQkgSzJESVYgID0gKChTQ1VfUExMLT5QTExDT04xICYgU0NVX1BMTF9QTExDT04xX0syRElWX01zayk+PjE2KSsxOw0KDQoJCWlmKFNDVV9QTEwtPlBMTENPTjIgJiBTQ1VfUExMX1BMTENPTjJfUElOU0VMX01zayl7DQoJCS8qIHRoZSBzZWxlY3RlZCBjbG9jayBpcyB0aGUgQmFja3VwIGNsb2NrIGZvZmkgKi8NCgkJVkNPID0gKENMT0NLX0JBQ0tfVVAvUERJVikqTkRJVjsNCgkJU3lzdGVtQ29yZUNsb2NrID0gVkNPL0syRElWOw0KCQkvKiBpbiBjYXNlIHRoZSBzeXNjbG9jayBkaXYgaXMgdXNlZCAqLw0KCQlTeXN0ZW1Db3JlQ2xvY2sgPSBTeXN0ZW1Db3JlQ2xvY2svKChTQ1VfQ0xLLT5TWVNDTEtDUiAmIFNDVV9DTEtfU1lTQ0xLQ1JfU1lTRElWX01zaykrMSk7DQoJCQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkvKiB0aGUgc2VsZWN0ZWQgY2xvY2sgaXMgdGhlIFBMTCBleHRlcm5hbCBvc2NpbGxhdG9yICovCQkNCgkJVkNPID0gKENMT0NLX0NSWVNUQUxfRlJFUVVFTkNZL1BESVYpKk5ESVY7DQoJCVN5c3RlbUNvcmVDbG9jayA9IFZDTy9LMkRJVjsNCgkJLyogaW4gY2FzZSB0aGUgc3lzY2xvY2sgZGl2IGlzIHVzZWQgKi8NCgkJU3lzdGVtQ29yZUNsb2NrID0gU3lzdGVtQ29yZUNsb2NrLygoU0NVX0NMSy0+U1lTQ0xLQ1IgJiBTQ1VfQ0xLX1NZU0NMS0NSX1NZU0RJVl9Nc2spKzEpOw0KCQl9IA0KCQ0KCQ0KCX0NCn0NCmVsc2UNCnsNClN5c3RlbUNvcmVDbG9jayA9IENMT0NLX0JBQ0tfVVA7DQp9DQoNCg0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgLQ0KICAqIEBub3RlICAgLSAgDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQojaWYgKFNDVV9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBTeXN0ZW1DbG9ja1NldHVwKHZvaWQpDQp7DQppbnQgdGVtcDsNCnVuc2lnbmVkIGludCBsb25nIFZDTzsNCmludCBzdGVwcGluZ19LMkRJVjsJDQoNCi8qIHRoaXMgd2VhayBmdW5jdGlvbiBlbmFibGVzIERBVkUzIGNsb2NrIEFwcCB1c2FnZSAqLwkNCmlmKEFsbG93UExMSW5pdEJ5U3RhcnR1cCgpKXsNCgkgDQovKiBjaGVjayBpZiBQTEwgaXMgc3dpdGNoZWQgb24gKi8NCmlmICgoU0NVX1BMTC0+UExMQ09OMCAmKFNDVV9QTExfUExMQ09OMF9WQ09QV0RfTXNrIHwgU0NVX1BMTF9QTExDT04wX1BMTFBXRF9Nc2spKSAhPSAwKXsNCi8qIGVuYWJsZSBQTEwgZmlyc3QgKi8NCiAgU0NVX1BMTC0+UExMQ09OMCAmPSB+KFNDVV9QTExfUExMQ09OMF9WQ09QV0RfTXNrIHwgU0NVX1BMTF9QTExDT04wX1BMTFBXRF9Nc2spOw0KDQp9IA0KDQovKiBFbmFibGUgT1NDX0hQIGlmIG5vdCBhbHJlYWR5IG9uKi8NCiAgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0NSWVNUQUwpDQogIHsNCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogICBVc2UgZXh0ZXJuYWwgY3J5c3RhbCBmb3IgUExMIGNsb2NrIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQogICBpZiAoU0NVX09TQy0+T1NDSFBDVFJMICYgU0NVX09TQ19PU0NIUENUUkxfTU9ERV9Nc2spew0KCSAgIFNDVV9PU0MtPk9TQ0hQQ1RSTCAmPSB+KFNDVV9PU0NfSFBfTU9ERSk7CSAvKmVuYWJsZSB0aGUgT1NDX0hQKi8NCgkgICAvKiBzZXR1cCBPU0MgV0RHIGRldmlkZXIgKi8NCgkgICBTQ1VfT1NDLT5PU0NIUENUUkwgfD0gKFNDVV9PU0NIUFdER0RJVjw8MTYpOyAgICAgICAgIA0KCSAgIC8qIHNlbGVjdCBleHRlcm5hbCBPU0MgYXMgUExMIGlucHV0ICovDQoJICAgU0NVX1BMTC0+UExMQ09OMiAmPSB+U0NVX1BMTF9QTExDT04yX1BJTlNFTF9Nc2s7DQoJICAgLyogcmVzdGFydCBPU0MgV2F0Y2hkb2cgKi8NCgkgICBTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfT1NDUkVTX01zazsgIA0KDQogICAgICAgLyogVGltZW91dCBmb3Igd2FpdCBsb29wIH4xNTBtcyAqLw0KCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkgICBTeXNUaWNrLT5MT0FEICA9ICgoNTAwMDAwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsvKiBzZXQgcmVsb2FkIHJlZ2lzdGVyICovDQoJICAgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJICAgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovCQkgIA0KCSAgIGRvIA0KCSAgIHsNCiAgICAgICA7Lyogd2FpdCBmb3IgfjE1MG1zICAqLw0KCSAgIH13aGlsZSgoKChTQ1VfUExMLT5QTExTVEFUKSAmIChTQ1VfUExMX1BMTFNUQVRfUExMSFZfTXNrIHwgU0NVX1BMTF9QTExTVEFUX1BMTExWX01zayB8U0NVX1BMTF9QTExTVEFUX1BMTFNQX01zaykpICE9IDB4MzgwKSYmKFN5c1RpY2stPlZBTCA+PSA1MDApKTsgDQoNCgkgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkgICBpZiAoKChTQ1VfUExMLT5QTExTVEFUKSAmIChTQ1VfUExMX1BMTFNUQVRfUExMSFZfTXNrIHwgU0NVX1BMTF9QTExTVEFUX1BMTExWX01zayB8U0NVX1BMTF9QTExTVEFUX1BMTFNQX01zaykpICE9IDB4MzgwKQ0KCSAgIHJldHVybigwKTsvKiBSZXR1cm4gRXJyb3IgKi8NCg0KICAgIH0NCiAgfQ0KICBlbHNlIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkpDQoJew0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkvKiAgIFVzZSBmYWN0b3J5IHRyaW1taW5nIEJhY2stdXAgY2xvY2sgZm9yIFBMTCBjbG9jayBpbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJLyogUExMIEJhY2sgdXAgY2xvY2sgc2VsZWN0ZWQgKi8NCgkJU0NVX1BMTC0+UExMQ09OMiB8PSBTQ1VfUExMX1BMTENPTjJfUElOU0VMX01zazsNCgkJCQ0KCX0NCiAgZWxzZSBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9BVVRPTUFUSUMpDQogIHsNCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJLyogICBVc2UgYXV0b21hdGljIHRyaW1taW5nIEJhY2stdXAgY2xvY2sgZm9yIFBMTCBjbG9jayBpbnB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkvKiBjaGVjayBmb3IgSElCIERvbWFpbiBlbmFibGVkICAqLw0KCWlmKChTQ1VfUE9XRVItPlBXUlNUQVQgJiBTQ1VfUE9XRVJfUFdSU1RBVF9ISUJFTl9Nc2spID09IDApDQoJCVNDVV9QT1dFUi0+UFdSU0VUIHw9IFNDVV9QT1dFUl9QV1JTRVRfSElCX01zazsgLyplbmFibGUgSGliZXJuYXRlIGRvbWFpbiovDQoNCiAgIC8qIGNoZWNrIGZvciBISUIgRG9tYWluIGlzIG5vdCBpbiByZXNldCBzdGF0ZSAgKi8NCglpZiAoKFNDVV9SRVNFVC0+UlNUU1RBVCAmIFNDVV9SRVNFVF9SU1RTVEFUX0hJQlJTX01zayk9PSAxKQ0KCSAgICBTQ1VfUkVTRVQtPlJTVENMUiB8PSBTQ1VfUkVTRVRfUlNUQ0xSX0hJQlJTX01zazsgLypkZS1hc3NlcnQgaGliZXJuYXRlIHJlc2V0Ki8NCg0KCQkJLyogUExMIEJhY2sgdXAgY2xvY2sgc2VsZWN0ZWQgKi8NCgkJU0NVX1BMTC0+UExMQ09OMiB8PSBTQ1VfUExMX1BMTENPTjJfUElOU0VMX01zazsNCgkNCgkJaWYgKFNDVV9TVEFOREJZX0NMT0NLID09IEhJQl9DTE9DS19GT1NJKQ0KCQkJew0KCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCQkvKiAgIFVzZSBmT1NJIGFzIHNvdXJjZSBvZiB0aGUgc3RhbmRieSBjbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJU0NVX0hJQkVSTkFURS0+SERDUiAmPSB+U0NVX0hJQkVSTkFURV9IRENSX1NUREJZU0VMX01zazsNCgkJCQ0KCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX0ZPVFJfTXNrOw0KCQkJZm9yKHRlbXA9MDt0ZW1wPD0weEZGRkY7dGVtcCsrKTsNCg0KCQkJU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfQU9UUkVOX01zazsNCgkJCX0NCgkJZWxzZSBpZiAoU0NVX1NUQU5EQllfQ0xPQ0sgPT0gSElCX0NMT0NLX09TQ1VMUCkNCgkJCXsNCgkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJLyogICBVc2UgZlVMUCBhcyBzb3VyY2Ugb2YgdGhlIHN0YW5kYnkgY2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkJCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkJLypjaGVjayBPU0NVTCBpZiBydW5uaW5nIGNvcnJlY3QqLw0KCQkJaWYgKChTQ1VfSElCRVJOQVRFLT5PU0NVTENUUkwgJiBTQ1VfSElCRVJOQVRFX09TQ1VMQ1RSTF9NT0RFX01zaykhPSAwKQ0KCQkJCXsNCgkJCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19PU0NVTENUUkxfTXNrKTsNCg0KCQkJCQlTQ1VfSElCRVJOQVRFLT5PU0NVTENUUkwgJj0gflNDVV9ISUJFUk5BVEVfT1NDVUxDVFJMX01PREVfTXNrOyAvKmVuYWJsZSBPU0NVTCovDQoJCQkJCS8qbm93IGNlY2sgaWYgdGhlIGNsb2NrIGlzIE9LIHVzaW5nIE9TQ1VMUCBPc2NpbGxhdG9yIFdhdGNoZG9nIChVTFBXREcpKi8NCgkJCQkJLyogc2VsZWN0IE9TQ1VMIGNsb2NrIGZvciBSVEMqLw0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENSIHw9IFNDVV9ISUJFUk5BVEVfSERDUl9SQ1NfTXNrOw0KCQkJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ1JfTXNrKTsNCgkJCQkJLyplbmFibGUgT1NDVUxQIFdERyBBbGFybSBFbmFibGUqLw0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENSIHw9IFNDVV9ISUJFUk5BVEVfSERDUl9VTFBXREdFTl9Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDUl9Nc2spOw0KCQkJCQkvKndhaXQgbm93IGZvciBjbG9jayBpcyBzdGFibGUgKi8NCgkJCQkJZG8NCgkJCQkJew0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENMUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ0xSX1VMUFdER19Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDTFJfTXNrKTsNCgkJCQkJZm9yKHRlbXA9MDt0ZW1wPD0weEZGRkY7dGVtcCsrKTsNCgkJCQkJfQ0KCQkJCQl3aGlsZSAoKFNDVV9ISUJFUk5BVEUtPkhEU1RBVCAmIFNDVV9ISUJFUk5BVEVfSERTVEFUX1VMUFdER19Nc2spPT1TQ1VfSElCRVJOQVRFX0hEU1RBVF9VTFBXREdfTXNrKTsgDQoNCgkJCQkJU0NVX0hJQkVSTkFURS0+SERDTFIgfD0gU0NVX0hJQkVSTkFURV9IRENMUl9VTFBXREdfTXNrOw0KCQkJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ0xSX01zayk7DQoJCQkJfQkNCgkJCS8vIG5vdyBPU0NVTFAgaXMgcnVubmluZyBhbmQgY2FuIGJlIHVzZWQJIAkgDQoJCQlTQ1VfSElCRVJOQVRFLT5IRENSIHw9IFNDVV9ISUJFUk5BVEVfSERDUl9TVERCWVNFTF9Nc2s7DQoJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX0hEQ1JfTXNrKTsNCgkJCQ0KCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX0ZPVFJfTXNrOw0KCQkJLypUUklBTCBmb3IgZGVsYXkgbG9vcCovDQoJCQlmb3IodGVtcD0wO3RlbXA8PTB4RkZGRjt0ZW1wKyspOw0KCQkJDQoJCQlTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9BT1RSRU5fTXNrOw0KCQkJLypUUklBTCBmb3IgZGVsYXkgbG9vcCovDQoJCQlmb3IodGVtcD0wO3RlbXA8PTB4RkZGRjt0ZW1wKyspOw0KCQkJDQoJCQl9DQogIH0NCg0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkvKiAgIFNldHVwIGFuZCBsb29rIHRoZSBtYWluIFBMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQppZiAoIShTQ1VfUExMLT5QTExTVEFUICYgU0NVX1BMTF9QTExTVEFUX1ZDT0xPQ0tfTXNrKSl7DQoJLyogU3lzdGVuIGlzIHN0aWxsIHJ1bm5pbmcgZnJvbSBpbnRlcm5hbCBjbG9jayAqLw0KCQkgICAvKiBzZWxlY3QgRk9GSSBhcyBzeXN0ZW0gY2xvY2sgKi8NCgkJICAgaWYoKFNDVV9DTEstPlNZU0NMS0NSICYgU0NVX0NMS19TWVNDTEtDUl9TWVNTRUxfTXNrKSAhPSAweDApU0NVX0NMSy0+U1lTQ0xLQ1IgJj0gflNDVV9DTEtfU1lTQ0xLQ1JfU1lTU0VMX01zazsgLypTZWxlY3QgRk9GSSovDQoNCg0KCQkJIC8qY2FsdWxhdGlvbiBmb3Igc3RlcHBpbmcqLw0KCQkJIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19DUllTVEFMKVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KCQkJIGlmICgoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9BVVRPTUFUSUMpIHx8KFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWSkpDQoJCQkJCVZDTyA9IChDTE9DS19CQUNLX1VQLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoJIA0KCQkJIHN0ZXBwaW5nX0syRElWID0gKFZDTy8yNDAwMDAwMCktMTsJDQoJCQkgLyogR28gdG8gYnlwYXNzIHRoZSBNYWluIFBMTCAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9WQ09CWVBfTXNrOw0KCQkgICAvKiBkaXNjb25uZWN0IE9TQ19IUCB0byBQTEwgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfRklORElTX01zazsNCgkJICAgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChzdGVwcGluZ19LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkJICAgLyogd2UgbWF5IGhhdmUgdG8gc2V0IE9TQ0RJU0NESVMgKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfT1NDRElTQ0RJU19Nc2s7DQoJCSAgIC8qIGNvbm5lY3QgT1NDX0hQIHRvIFBMTCAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfRklORElTX01zazsNCgkJICAgLyogcmVzdGFydCBQTEwgTG9jayBkZXRlY3Rpb24gKi8NCgkJICAgU0NVX1BMTC0+UExMQ09OMCB8PSBTQ1VfUExMX1BMTENPTjBfUkVTTERfTXNrOw0KCQkgICAvKiB3YWl0IGZvciBQTEwgTG9jayAqLw0KCQkgICAvKiBzZXR1cCB0aW1lIG91dCBsb29wICovDQoJICAgICAgIC8qIFRpbWVvdXQgZm9yIHdhaXQgbG9vIH4xNTBtcyAqLw0KCQkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSAgIFN5c1RpY2stPkxPQUQgID0gKCg1MDAwMDAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOy8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCgkJICAgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJCSAgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCQkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8JCSAgDQoJCSAgIA0KCQkgICB3aGlsZSAoKCEoU0NVX1BMTC0+UExMU1RBVCAmIFNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zaykpJiYoU3lzVGljay0+VkFMID49IDUwMCkpOw0KCSAgICAgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCg0KCQkgICBpZiAoKFNDVV9QTEwtPlBMTFNUQVQgJiBTQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spPT1TQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spDQoJCSAgIAkJew0KCQkJCS8qIEdvIGJhY2sgdG8gdGhlIE1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX1ZDT0JZUF9Nc2s7DQoJCQkJfQ0KCQkJCWVsc2UgcmV0dXJuKDApOw0KCQkgDQoJDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KCSAgIGhlcmUgd2UgbmVlZCB0byBzZXR1cCB0aGUgc3lzdGVtIGNsb2NrIGRpdmlkZXINCgkgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJDQoJCVNDVV9DTEstPkNQVUNMS0NSID0gU0NVX0NQVUNMS0NSX0RJVjsNCgkJU0NVX0NMSy0+UEJDTEtDUiA9IFNDVV9QQkNMS0NSX0RJVjsJDQoJCVNDVV9DTEstPkNDVUNMS0NSID0gU0NVX0NDVUNMS0NSX0RJVjsNCgkNCg0KICAJCS8qIFN3aXRjaCBzeXN0ZW0gY2xvY2sgdG8gUExMICovDQoJICAgU0NVX0NMSy0+U1lTQ0xLQ1IgfD0gIDB4MDAwMTAwMDA7IA0KCQkJCQ0KCSAgIC8qIHdlIG1heSBoYXZlIHRvIHJlc2V0IE9TQ0RJU0NESVMgKi8NCgkgICBTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfT1NDRElTQ0RJU19Nc2s7DQoJCQkJDQoJCQkJCQkJCQkJCQkJCQkJICANCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSAvKiBEZWxheSBmb3IgbmV4dCBLMiBzdGVwIH41MLVzICovDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgU3lzVGljay0+TE9BRCAgPSAoKDEyNTArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7Lyogc2V0IHJlbG9hZCByZWdpc3RlciAqLw0KCQkgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJCSBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkJCQkJCQkJCQkgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCgkNCgkJIHdoaWxlIChTeXNUaWNrLT5WQUwgPj0gMTAwKTsJCQkJCQkJCSAgIC8qIHdhaXQgZm9yIH41MLVzICAqLw0KCQkgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KCSAgIGhlcmUgdGhlIHJhbXAgdXAgb2YgdGhlIHN5c3RlbSBjbG9jayBzdGFydHMgRlN5cyA8IDYwTUh6DQoJICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQlpZiAoQ0xPQ0tfRlNZUyA+IDYwMDAwMDAwKXsNCgkJCSAvKmNhbHVsYXRpb24gZm9yIHN0ZXBwaW5nKi8NCgkJCSBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQ1JZU1RBTClWQ08gPSAoQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCgkJCSBpZiAoKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDKSB8fChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkpKQ0KCQkJCQlWQ08gPSAoQ0xPQ0tfQkFDS19VUC8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KCSANCgkJCSBzdGVwcGluZ19LMkRJViA9IChWQ08vNjAwMDAwMDApLTE7CQ0KDQoJCQkgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKHN0ZXBwaW5nX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCQkgfQ0KCQkgZWxzZQ0KCQkgew0KCQkJCS8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChTQ1VfUExMX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCQkgICAgU0NVX1RSQVAtPlRSQVBDTFIgPSBTQ1VfVFJBUF9UUkFQQ0xSX1NPU0NXREdUX01zayB8IFNDVV9UUkFQX1RSQVBDTFJfU1ZDT0xDS1RfTXNrOyAgLyogY2xlYXIgcmVxdWVzdCBmb3IgU3lzdGVtIE9DUyBXYXRjaGRvZyBUcmFwIGFuZCBTeXN0ZW0gVkNPIExvY2sgVHJhcCAgKi8NCgkJCSAgcmV0dXJuKDEpOw0KCQkgfQ0KDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgLyogRGVsYXkgZm9yIG5leHQgSzIgc3RlcCB+NTC1cyAqLw0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkgICBTeXNUaWNrLT5MT0FEICA9ICgoMzAwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsNCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCgkNCgkgICB3aGlsZSAoU3lzVGljay0+VkFMID49IDEwMCk7CQkJCQkJCQkgICAvKiB3YWl0IGZvciB+NTC1cyAgKi8NCgkgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJDQogICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJICAgaGVyZSB0aGUgcmFtcCB1cCBvZiB0aGUgc3lzdGVtIGNsb2NrIHN0YXJ0cyBGU3lzIDwgOTBNSHoNCgkgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCWlmIChDTE9DS19GU1lTID4gOTAwMDAwMDApew0KCQkJIC8qY2FsdWxhdGlvbiBmb3Igc3RlcHBpbmcqLw0KCQkJIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19DUllTVEFMKVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KCQkJIGlmICgoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9BVVRPTUFUSUMpIHx8KFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWSkpDQoJCQkJCVZDTyA9IChDTE9DS19CQUNLX1VQLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoNCgkJCSBzdGVwcGluZ19LMkRJViA9IChWQ08vOTAwMDAwMDApLTE7CQkJDQoNCgkJCSAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCQkJCVNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoc3RlcHBpbmdfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJCSB9DQoJCSBlbHNlDQoJCSB7DQoJCQkJLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKFNDVV9QTExfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJICAgICAgU0NVX1RSQVAtPlRSQVBDTFIgPSBTQ1VfVFJBUF9UUkFQQ0xSX1NPU0NXREdUX01zayB8IFNDVV9UUkFQX1RSQVBDTFJfU1ZDT0xDS1RfTXNrOyAgLyogY2xlYXIgcmVxdWVzdCBmb3IgU3lzdGVtIE9DUyBXYXRjaGRvZyBUcmFwIGFuZCBTeXN0ZW0gVkNPIExvY2sgVHJhcCAgKi8NCgkJCQlyZXR1cm4oMSk7DQoJCSB9DQoJDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgLyogRGVsYXkgZm9yIG5leHQgSzIgc3RlcCB+NTC1cyAqLw0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkgICBTeXNUaWNrLT5MT0FEICA9ICgoNDgwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsNCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8NCgkNCgkgICB3aGlsZSAoU3lzVGljay0+VkFMID49IDEwMCk7CQkJCQkJCQkgICAvKiB3YWl0IGZvciB+NTC1cyAgKi8NCgkgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJDQoJICAgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkgICBTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKFNDVV9QTExfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJDQoJICAgU0NVX1RSQVAtPlRSQVBDTFIgPSBTQ1VfVFJBUF9UUkFQQ0xSX1NPU0NXREdUX01zayB8IFNDVV9UUkFQX1RSQVBDTFJfU1ZDT0xDS1RfTXNrOyAgLyogY2xlYXIgcmVxdWVzdCBmb3IgU3lzdGVtIE9DUyBXYXRjaGRvZyBUcmFwIGFuZCBTeXN0ZW0gVkNPIExvY2sgVHJhcCAgKi8NCgl9DQogfS8qIGVuZCB0aGlzIHdlYWsgZnVuY3Rpb24gZW5hYmxlcyBEQVZFMyBjbG9jayBBcHAgdXNhZ2UgKi8JDQogICByZXR1cm4oMSk7DQoNCn0NCiNlbmRpZg0KDQovKioNCiAgKiBAYnJpZWYgIC0NCiAgKiBAbm90ZSAgIC0gIA0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KI2lmIChTQ1VfVVNCX0NMT0NLX1NFVFVQID09IDEpDQpzdGF0aWMgaW50IFVTQkNsb2NrU2V0dXAodm9pZCkNCnsNCi8qIHRoaXMgd2VhayBmdW5jdGlvbiBlbmFibGVzIERBVkUzIGNsb2NrIEFwcCB1c2FnZSAqLwkNCmlmKEFsbG93UExMSW5pdEJ5U3RhcnR1cCgpKXsNCgkNCi8qIGNoZWNrIGlmIFBMTCBpcyBzd2l0Y2hlZCBvbiAqLw0KaWYgKChTQ1VfUExMLT5VU0JQTExDT04gJihTQ1VfUExMX1VTQlBMTENPTl9WQ09QV0RfTXNrIHwgU0NVX1BMTF9VU0JQTExDT05fUExMUFdEX01zaykpICE9IDApew0KCS8qIGVuYWJsZSBQTEwgZmlyc3QgKi8NCiAgU0NVX1BMTC0+VVNCUExMQ09OICY9IH4oU0NVX1BMTF9VU0JQTExDT05fVkNPUFdEX01zayB8IFNDVV9QTExfVVNCUExMQ09OX1BMTFBXRF9Nc2spOw0KfQ0KDQovKiBjaGVjayBhbmQgaWYgbm90IGFscmVhZHkgcnVubmluZyBlbmFibGUgT1NDX0hQICovDQogICBpZiAoU0NVX09TQy0+T1NDSFBDVFJMICYgU0NVX09TQ19PU0NIUENUUkxfTU9ERV9Nc2spew0KCQkgLyogY2hlY2sgaWYgTWFpbiBQTEwgaXMgc3dpdGNoZWQgb24gZm9yIE9TQyBXRCovDQoJCSBpZiAoKFNDVV9QTEwtPlBMTENPTjAgJihTQ1VfUExMX1BMTENPTjBfVkNPUFdEX01zayB8IFNDVV9QTExfUExMQ09OMF9QTExQV0RfTXNrKSkgIT0gMCl7DQoJCQkvKiBlbmFibGUgUExMIGZpcnN0ICovDQogIAkJCVNDVV9QTEwtPlBMTENPTjAgJj0gfihTQ1VfUExMX1BMTENPTjBfVkNPUFdEX01zayB8IFNDVV9QTExfUExMQ09OMF9QTExQV0RfTXNrKTsNCgkJIH0NCgkgICBTQ1VfT1NDLT5PU0NIUENUUkwgJj0gfihTQ1VfT1NDX0hQX01PREUpOwkgLyplbmFibGUgdGhlIE9TQ19IUCovDQoJICAgLyogc2V0dXAgT1NDIFdERyBkZXZpZGVyICovDQoJICAgU0NVX09TQy0+T1NDSFBDVFJMIHw9IChTQ1VfT1NDSFBXREdESVY8PDE2KTsgICAgICAgICANCgkgICAvKiByZXN0YXJ0IE9TQyBXYXRjaGRvZyAqLw0KCSAgIFNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9PU0NSRVNfTXNrOyAgDQoJDQogICAgICAgLyogVGltZW91dCBmb3Igd2FpdCBsb29wIH4xNTBtcyAqLw0KCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkgICBTeXNUaWNrLT5MT0FEICA9ICgoNTAwMDAwMCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsvKiBzZXQgcmVsb2FkIHJlZ2lzdGVyICovDQoJICAgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJICAgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovCQkgIA0KCSAgIGRvIA0KCSAgIHsNCiAgICAgICA7Lyogd2FpdCBmb3IgfjE1MG1zICAqLw0KCSAgIH13aGlsZSgoKChTQ1VfUExMLT5QTExTVEFUKSAmIChTQ1VfUExMX1BMTFNUQVRfUExMSFZfTXNrIHwgU0NVX1BMTF9QTExTVEFUX1BMTExWX01zayB8U0NVX1BMTF9QTExTVEFUX1BMTFNQX01zaykpICE9IDB4MzgwKSYmKFN5c1RpY2stPlZBTCA+PSA1MDApKTsgDQoNCgkgICBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkgICBpZiAoKChTQ1VfUExMLT5QTExTVEFUKSAmIChTQ1VfUExMX1BMTFNUQVRfUExMSFZfTXNrIHwgU0NVX1BMTF9QTExTVEFUX1BMTExWX01zayB8U0NVX1BMTF9QTExTVEFUX1BMTFNQX01zaykpICE9IDB4MzgwKQ0KCSAgIHJldHVybigwKTsvKiBSZXR1cm4gRXJyb3IgKi8NCgkNCiAgfQ0KDQoNCi8qIFNldHVwIFVTQiBQTEwgKi8NCiAgIC8qIEdvIHRvIGJ5cGFzcyB0aGUgTWFpbiBQTEwgKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiB8PSBTQ1VfUExMX1VTQlBMTENPTl9WQ09CWVBfTXNrOw0KICAgLyogZGlzY29ubmVjdCBPU0NfRkkgdG8gUExMICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gfD0gU0NVX1BMTF9VU0JQTExDT05fRklORElTX01zazsNCiAgIC8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gPSAoKFNDVV9VU0JQTExfTkRJVjw8OCkgfCAoU0NVX1VTQlBMTF9QRElWPDwyNCkpOw0KICAgLyogU2V0dXAgVVNCRElWIHNldHRpbmdzIFVTQiBjbG9jayAqLw0KICAgU0NVX0NMSy0+VVNCQ0xLQ1IgPSBTQ1VfVVNCRElWOw0KICAgLyogd2UgbWF5IGhhdmUgdG8gc2V0IE9TQ0RJU0NESVMgKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiB8PSBTQ1VfUExMX1VTQlBMTENPTl9PU0NESVNDRElTX01zazsNCiAgIC8qIGNvbm5lY3QgT1NDX0ZJIHRvIFBMTCAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OICY9IH5TQ1VfUExMX1VTQlBMTENPTl9GSU5ESVNfTXNrOw0KICAgLyogcmVzdGFydCBQTEwgTG9jayBkZXRlY3Rpb24gKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiB8PSBTQ1VfUExMX1VTQlBMTENPTl9SRVNMRF9Nc2s7DQogICAvKiB3YWl0IGZvciBQTEwgTG9jayAqLw0KICAgd2hpbGUgKCEoU0NVX1BMTC0+VVNCUExMU1RBVCAmIFNDVV9QTExfVVNCUExMU1RBVF9WQ09MT0NLX01zaykpOw0KICAgDQogfS8qIGVuZCB0aGlzIHdlYWsgZnVuY3Rpb24gZW5hYmxlcyBEQVZFMyBjbG9jayBBcHAgdXNhZ2UgKi8JDQogICByZXR1cm4oMSk7DQoNCn0NCiNlbmRpZg0KDQo=