LyoqDQogKiBAZmlsZSByZWdpc3QuYw0KICogQGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIHJlZ2lzdC5jLg0KICoNCiAqIENvcHlyaWdodCAoQykgMjAyMiBTYW5lY2hpcHMgVGVjaG5vbG9neSBDby4sIEx0ZC4NCiAqIEBhdXRob3IgDQogKiANCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5DQogKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcw0KICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uIKOosdjRoaO6R1BMdjIgTGljZW5jZaOpDQogKg0KICovDQogDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiAJCQkJICAgIAkJICBJbmNsdWRlIGhlYWRlciBmaWxlcwkJCQkJCQkgICAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNpbmNsdWRlIDxzdGRpby5oPg0KI2luY2x1ZGUgPHN0cmluZy5oPg0KI2luY2x1ZGUgPHN0ZGxpYi5oPg0KI2luY2x1ZGUgPHB0aHJlYWQuaD4NCiNpbmNsdWRlIDxhc3NlcnQuaD4NCiNpbmNsdWRlIDxzeXMvaXBjLmg+DQoNCiNpbmNsdWRlICJhdHJlZ19jb21tb24uaCINCiNpbmNsdWRlICJtZXNzYWdlLmgiDQojaW5jbHVkZSAic29mdGFwX2xvZy5oIg0KI2luY2x1ZGUgImF0cmVnX21zZy5oIg0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjcm8gZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIAkJCQkJCSAgICAgICBUeXBlIGRlZmluaXRpb25zCQkJCQkgICAgICAgICAgIAkgICAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogCQkJCQkgICAgICBMb2NhbCB2YXJpYWJsZSBkZWZpbml0aW9ucwkJCQkJCSAgICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyoqIEFUyc/Pws7Es/XKvLuvserWviAqLw0KaW50IGF0cmVnX3Nlcl9jeHRfaXNfaW5pdCA9IDA7DQppbnQgYXRyZWdfaW5mb19jeHRfaXNfaW5pdCA9IDA7DQoNCi8qKiBsb2dsZXZlbLP1yry7r7Hq1r4gKi8NCnN0YXRpYyBpbnQgbG9nbGV2ZWxfaXNfaW5pdCA9IDA7DQoNCi8qKiC5q7mysr+31rP1yry7r7Hq1r4gKi8NCnN0YXRpYyBpbnQgY29tbW9uX2lzX2luaXQgPSAwOw0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKgkJCQkJCSAgR2xvYmFsIHZhcmlhYmxlIGRlZmluaXRpb25zCQkJCQkJICAgKg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIAkJCQkJICAgICBMb2NhbCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgCQkgICAgIAkJCSAgICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiAJCQkJICAgICAgICBMb2NhbCBmdW5jdGlvbiBpbXBsZW1lbnRhdGlvbnMJCSAgIAkJCQkgICAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qKg0KICogQGJyaWVmICAgICAgILP1yry7r3NlciBBVMnPz8LOxDogYXRyZWdfc2VyX2N0eA0KICogQHBhcmFtICAgICAgIM7eDQogKiBAcmV0dXJuICAgICAgzt4NCiAqIEBub3RlICAgICAgICDO3g0KICogQHdhcm5pbmcgICAgIM7eDQogKi8NCnN0YXRpYyB2b2lkIGF0cmVnX3Nlcl9pbml0X3Byb2MoKQ0Kew0KCWlmKDAgPT0gYXRyZWdfc2VyX2N4dF9pc19pbml0KSB7CQ0KCQltZW1zZXQoJmF0cmVnX3Nlcl9jdHgsIDAsIHNpemVvZihhdHJlZ19zZXJfY3R4KSk7DQoJICAgIG1lbXNldChhdHJlZ19zZXJfZHluYW1pY19pZHBvb2wsIDAsIHNpemVvZihhdHJlZ19zZXJfZHluYW1pY19pZHBvb2wpKTsNCgkJDQoJCUlOSVRfTElTVF9IRUFEKCZhdHJlZ19zZXJfY3R4LmF0X3Nlcl9saXN0KTsNCgkJSU5JVF9MSVNUX0hFQUQoJmF0cmVnX3Nlcl9jdHguYXRfc2VyX2xpc3RfdG1wKTsNCgkJDQoJCXB0aHJlYWRfbXV0ZXhfaW5pdCgmYXRyZWdfc2VyX2N0eC5hdF9zZXJfbG9jaywgTlVMTCk7DQoJCXB0aHJlYWRfbXV0ZXhfaW5pdCgmYXRyZWdfc2VyX2N0eC5hdF9zZXJfbG9ja190bXAsIE5VTEwpOw0KCQlwdGhyZWFkX211dGV4X2luaXQoJmF0cmVnX3Nlcl9jdHguYXRfc2VyX2lkcG9vbF9sb2NrLCBOVUxMKTsNCgkJDQoJCWF0cmVnX3Nlcl9jeHRfaXNfaW5pdCsrOwkNCgkJc2xvZyhBVFJFR19QUklOVCwgU0xPR19OT1JNQUwsICJhdHJlZ19zZXJfaW5pdF9wcm9jIGluaXQgU1VDQ0VTU1xuIik7DQoJfQ0KDQoJcmV0dXJuOw0KfQ0KDQoNCi8qKg0KICogQGJyaWVmICAgICAgILP1yry7r2luZm8gQVTJz8/CzsQ6IGF0cmVnX2luZm9fY3R4DQogKiBAcGFyYW0gICAgICAgzt4NCiAqIEByZXR1cm4gICAgICDO3g0KICogQG5vdGUgICAgICAgIM7eDQogKiBAd2FybmluZyAgICAgzt4NCiAqLw0Kc3RhdGljIHZvaWQgYXRyZWdfaW5mb19pbml0X3Byb2MoKQ0Kew0KCWlmKDAgPT0gYXRyZWdfaW5mb19jeHRfaXNfaW5pdCkgewkJCQ0KCQltZW1zZXQoJmF0cmVnX2luZm9fY3R4LCAwLCBzaXplb2YoYXRyZWdfaW5mb19jdHgpKTsNCgkJbWVtc2V0KGF0cmVnX2luZm9fZHluYW1pY19pZHBvb2wsIDAsIHNpemVvZihhdHJlZ19pbmZvX2R5bmFtaWNfaWRwb29sKSk7DQoJCQ0KCQlJTklUX0xJU1RfSEVBRCgmYXRyZWdfaW5mb19jdHguYXRfaW5mb19saXN0KTsNCgkJSU5JVF9MSVNUX0hFQUQoJmF0cmVnX2luZm9fY3R4LmF0X2luZm9fbGlzdF90bXApOw0KCQkNCgkJcHRocmVhZF9tdXRleF9pbml0KCZhdHJlZ19pbmZvX2N0eC5hdF9pbmZvX2xvY2ssIE5VTEwpOw0KCQlwdGhyZWFkX211dGV4X2luaXQoJmF0cmVnX2luZm9fY3R4LmF0X2luZm9fbG9ja190bXAsIE5VTEwpOw0KCQlwdGhyZWFkX211dGV4X2luaXQoJmF0cmVnX2luZm9fY3R4LmF0X2luZm9faWRwb29sX2xvY2ssIE5VTEwpOw0KCQkNCgkJYXRyZWdfaW5mb19jeHRfaXNfaW5pdCsrOwkNCgkJc2xvZyhBVFJFR19QUklOVCwgU0xPR19OT1JNQUwsICJhdHJlZ19pbmZvX2luaXRfcHJvYyBpbml0IFNVQ0NFU1NcbiIpOw0KICAgIH0NCg0KCXJldHVybjsNCn0NCg0KDQovKioNCiAqIEBicmllZiAgICAgICC0tL2oz/vPorSmwO3X08/fs8wNCiAqIEBwYXJhbSAoaW4pICBBVMnPz8LOxCAtIGNvbW1vbg0KICogQHJldHVybiAgICAgIDAgLSCzybmmDQogKgkJCSAgICDG5Mv7IC0gyqew3A0KICogQG5vdGUgICAgICAgIM7eDQogKiBAd2FybmluZyAgICAgzt4NCiAqLw0Kc3RhdGljIGludCBhdHJlZ19jcmVhdGVfbXNnX3RocmVhZChzdHJ1Y3QgYXRyZWdfY29tbW9uX2NvbnRleHRfdCAqcGF0cmVnX2NvbW1vbl9jdHgpDQp7DQogICAgcmV0dXJuIHB0aHJlYWRfY3JlYXRlKCYocGF0cmVnX2NvbW1vbl9jdHgtPnRocmVhZGlkKSwgTlVMTCwgKHZvaWQgKilhdHJlZ19tc2dfdGhyZWFkX2VudHJ5LCAodm9pZCAqKXBhdHJlZ19jb21tb25fY3R4KTsNCn0NCg0KDQovKioNCiAqIEBicmllZiAgICAgICCz9cq8u6/Iq77WQVTJz8/CzsQ6IGF0cmVnX3Nlcl9jdHgsIGF0cmVnX2luZm9fY3R4LCBhdHJlZ19jb21tb25fY3R4DQogKiBAcGFyYW0gKGluKSAgYXRyZWdfdHlwZSDXorLhtcRBVMDg0M06IDAtc2VyLCAxLWluZm8NCiAqIEByZXR1cm4gICAgICAwIC0gs8m5pg0KICoJCQkgICAgxuTL+yAtIMqnsNwNCiAqIEBub3RlICAgICAgICDO3g0KICogQHdhcm5pbmcgICAgIM7eDQogKi8NCnN0YXRpYyBpbnQgYXRyZWdfY29udGV4dF9pbml0KGludCBhdHJlZ190eXBlKQ0Kew0KICAgIGlmICgwID09IGxvZ2xldmVsX2lzX2luaXQpIHsNCgkJbG9nbGV2ZWxfaW5pdCgpOw0KCQlsb2dsZXZlbF9pc19pbml0Kys7DQogICAgfQ0KDQoJc3dpdGNoIChhdHJlZ190eXBlKSB7DQoJCWNhc2UgQVRfUkVHX1NFUjoNCgkJCWF0cmVnX3Nlcl9pbml0X3Byb2MoKTsNCgkJCWJyZWFrOw0KDQoJCWNhc2UgQVRfUkVHX0lORk86DQoJCQlhdHJlZ19pbmZvX2luaXRfcHJvYygpOw0KCQkJYnJlYWs7DQoNCgkJZGVmYXVsdDoNCgkJCWJyZWFrOw0KCX0NCg0KCWlmICgwID09IGNvbW1vbl9pc19pbml0KSB7DQoJICAgIHNlbV9pbml0KCZhdHJlZ19jb21tb25fY3R4LnNlbV9pZCwgMCwgMCk7CQ0KCSAgICBtZW1zZXQoJmF0cmVnX2NvbW1vbl9jdHgudHMsIDAsIHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpKTsNCgkNCgkJLyogxNqyv7avzKy78cih1LTEo7/pSUSjrLP1yrzWtc6qTU9EVUxFX0lEX0FURFlOQU1JQ19CQVNFICovDQoJCWF0cmVnX2NvbW1vbl9jdHgubW9kaWQgPSBNT0RVTEVfSURfQVREWU5BTUlDX0JBU0U7DQoJCQkJCQ0KCQl3aGlsZSAoKG1zZ2dldChhdHJlZ19jb21tb25fY3R4Lm1vZGlkLCBJUENfQ1JFQVR8SVBDX0VYQ0x8MDYwMCkpID09IC0xKSB7DQoJICAgICAgICBhdHJlZ19jb21tb25fY3R4Lm1vZGlkKys7DQoJCQkNCgkJCWlmIChhdHJlZ19jb21tb25fY3R4Lm1vZGlkID4gTU9EVUxFX0lEX0FURFlOQU1JQ19FTkQpIA0KCQkJCS8qILWxYXRfY3R4Lm1vZGlktPPT2k1PRFVMRV9JRF9BVERZTkFNSUNfRU5E1rXKsaOs1ve2r7bP0dQgKi8NCgkJCQlzb2Z0YXBfYXNzZXJ0KCJhdHJlZyBkeW5hbWljIG1zZyBwaXBpIG5vdCBmcmVlIHRpbWVseSEhISEhISEhISEhIik7DQoJCX0NCgkJDQoJCXNsb2coQVRSRUdfUFJJTlQsIFNMT0dfTk9STUFMLCAiYXRyZWdfY29udGV4dF9pbml0IG1vZGlkIDB4JXhcbiIsIGF0cmVnX2NvbW1vbl9jdHgubW9kaWQpOw0KDQoJCS8qILS0vajP+8+itKbA7dfTz9+zzCAqLw0KCQlpZiAoMCAhPSBhdHJlZ19jcmVhdGVfbXNnX3RocmVhZCgmYXRyZWdfY29tbW9uX2N0eCkpCQ0KCQkJcmV0dXJuIC0xOw0KDQoJCWNvbW1vbl9pc19pbml0Kys7DQoJfQ0KDQoJcmV0dXJuIDA7DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgICAgICAgzqrDv7j216Ky4bXEc2VyIEFUubm9qMq1wP0NCiAqIEBwYXJhbSAoaW4pICBhdF9jbWRfcHJlZml4INeisuG1xHNlciBBVMew17oNCiAqIEBwYXJhbSAoaW4pICBjYiDXorLhtcS72LX3uq/K/Q0KICogQHJldHVybiAgICAgIHNlciBBVMq1wP0NCiAqIEBub3RlICAgICAgICDO3g0KICogQHdhcm5pbmcgICAgIM7eDQogKi8NCnN0YXRpYyB2b2lkICphdHJlZ19zZXJfY29uc3RydWN0X3Byb2MoY2hhciAqYXRfY21kX3ByZWZpeCwgc2VyX2NiX3Byb2MgY2IpDQp7DQoJc3RydWN0IGF0cmVnX3Nlcl9pbnN0YW5jZV90ICpwYXRyZWdfc2VyX2luc3RhbmNlID0gTlVMTDsNCgkNCglwYXRyZWdfc2VyX2luc3RhbmNlID0gKHN0cnVjdCBhdHJlZ19zZXJfaW5zdGFuY2VfdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGF0cmVnX3Nlcl9pbnN0YW5jZV90KSk7DQoJaWYoTlVMTCA9PSBwYXRyZWdfc2VyX2luc3RhbmNlKSB7CQkNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KCW1lbXNldChwYXRyZWdfc2VyX2luc3RhbmNlLCAwLCBzaXplb2Yoc3RydWN0IGF0cmVnX3Nlcl9pbnN0YW5jZV90KSk7DQoNCglzdHJuY3B5KHBhdHJlZ19zZXJfaW5zdGFuY2UtPmF0X2NtZF9wcmVmaXgsIGF0X2NtZF9wcmVmaXgsIEFUX0NNRF9QUkVGSVgtMSk7DQoJcGF0cmVnX3Nlcl9pbnN0YW5jZS0+cmVxX21zZ19pZCA9IC0xOw0KCXBhdHJlZ19zZXJfaW5zdGFuY2UtPnJzcF9tc2dfaWQgPSAtMTsNCglwYXRyZWdfc2VyX2luc3RhbmNlLT5jYiA9IGNiOw0KCQ0KCXJldHVybiAodm9pZCAqKXBhdHJlZ19zZXJfaW5zdGFuY2U7DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgICAgICAgzqrDv7j216Ky4bXEaW5mbyBBVLm5vajKtcD9DQogKiBAcGFyYW0gKGluKSAgYXRfY21kX3ByZWZpeCDXorLhtcRpbmZvIEFUx7DXug0KICogQHBhcmFtIChpbikgIGNiINeisuG1xLvYtfe6r8r9DQogKiBAcmV0dXJuICAgICAgaW5mbyBBVMq1wP0NCiAqIEBub3RlICAgICAgICDO3g0KICogQHdhcm5pbmcgICAgIM7eDQogKi8NCnN0YXRpYyB2b2lkICphdHJlZ19pbmZvX2NvbnN0cnVjdF9wcm9jKGNoYXIgKmF0X2NtZF9wcmVmaXgsIHNlcl9jYl9wcm9jIGNiKQ0Kew0KCXN0cnVjdCBhdHJlZ19pbmZvX2luc3RhbmNlX3QgKnBhdHJlZ19pbmZvX2luc3RhbmNlID0gTlVMTDsNCgkNCglwYXRyZWdfaW5mb19pbnN0YW5jZSA9IChzdHJ1Y3QgYXRyZWdfaW5mb19pbnN0YW5jZV90ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRyZWdfaW5mb19pbnN0YW5jZV90KSk7DQoJaWYoTlVMTCA9PSBwYXRyZWdfaW5mb19pbnN0YW5jZSkgewkJDQoJCXJldHVybiBOVUxMOw0KCX0NCgltZW1zZXQocGF0cmVnX2luZm9faW5zdGFuY2UsIDAsIHNpemVvZihzdHJ1Y3QgYXRyZWdfaW5mb19pbnN0YW5jZV90KSk7DQoNCglzdHJuY3B5KHBhdHJlZ19pbmZvX2luc3RhbmNlLT5hdF9jbWRfcHJlZml4LCBhdF9jbWRfcHJlZml4LCBBVF9DTURfUFJFRklYLTEpOw0KCXBhdHJlZ19pbmZvX2luc3RhbmNlLT5yZXFfbXNnX2lkID0gLTE7DQoJcGF0cmVnX2luZm9faW5zdGFuY2UtPmNiID0gY2I7DQoJDQoJcmV0dXJuICh2b2lkICopcGF0cmVnX2luZm9faW5zdGFuY2U7DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgICAgICAgzqrDv7j216Ky4bXEQVS5ub2oyrXA/Q0KICogQHBhcmFtIChpbikgIGF0X2NtZF9wcmVmaXgg16Ky4bXEQVTHsNe6DQogKiBAcGFyYW0gKGluKSAgY2Ig16Ky4bXEu9i197qvyv0NCiAqIEBwYXJhbSAoaW4pICBhdHJlZ190eXBlINeisuG1xEFUwODQzTogMC1zZXIsIDEtaW5mbw0KICogQHJldHVybiAgICAgIEFUyrXA/Q0KICogQG5vdGUgICAgICAgIM7eDQogKiBAd2FybmluZyAgICAgzt4NCiAqLw0Kc3RhdGljIHZvaWQgKmF0cmVnX2NvbnN0cnVjdChjaGFyICphdF9jbWRfcHJlZml4LCBzZXJfY2JfcHJvYyBjYiwgaW50IGF0cmVnX3R5cGUpDQp7DQoJdm9pZCogcGF0cmVnID0gTlVMTDsNCg0KCXN3aXRjaCAoYXRyZWdfdHlwZSkgew0KCQljYXNlIEFUX1JFR19TRVI6DQoJCQlwYXRyZWcgPSBhdHJlZ19zZXJfY29uc3RydWN0X3Byb2MoYXRfY21kX3ByZWZpeCwgY2IpOw0KCQkJYnJlYWs7DQoNCgkJY2FzZSBBVF9SRUdfSU5GTzoNCgkJCXBhdHJlZyA9IGF0cmVnX2luZm9fY29uc3RydWN0X3Byb2MoYXRfY21kX3ByZWZpeCwgY2IpOw0KCQkJYnJlYWs7DQoNCgkJZGVmYXVsdDoNCgkJCWJyZWFrOw0KCX0NCg0KCXJldHVybiBwYXRyZWc7DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgICAgICAgIM6qw7+49teisuG1xHNlciBBVLavzKy31sXkcmVxX21zZ19pZNPrcnNwX21zZ19pZA0KICogQHBhcmFtIChvdXQpICBwYXRyZWdfc2VyX2luc3RhbmNlINeisuG1xHNlciBBVMq1wP0NCiAqIEByZXR1cm4gICAgICAgzt4NCiAqIEBub3RlICAgICAgICAgzt4NCiAqIEB3YXJuaW5nICAgICAgzt4NCiAqLw0Kc3RhdGljIGludCBhdHJlZ19zZXJfYWxsb2NhdGlvbl9wcm9jKHZvaWQqIHBhdHJlZ19zZXJfaW5zdGFuY2UpDQp7DQoJaW50IGksajsNCiAgICBwdGhyZWFkX211dGV4X2xvY2soJmF0cmVnX3Nlcl9jdHguYXRfc2VyX2lkcG9vbF9sb2NrKTsNCglmb3IgKGkgPSAwOyBpIDwgQVRSRUdfU0VSX0lEX01BWDsgaSsrKSB7DQoJCWZvciAoaiA9IDc7IGogPj0gMDsgai0tKSB7DQoJCQlpZiAoMCA9PSAoaW50KShhdHJlZ19zZXJfZHluYW1pY19pZHBvb2xbaV0gJiAoMSA8PCBqKSkpIHsNCgkJCQkoKHN0cnVjdCBhdHJlZ19zZXJfaW5zdGFuY2VfdCAqKXBhdHJlZ19zZXJfaW5zdGFuY2UpLT5yZXFfbXNnX2lkID0gOCAqIChpICsgMSkgLSAoaiArIDEpOw0KCQkJCSgoc3RydWN0IGF0cmVnX3Nlcl9pbnN0YW5jZV90ICopcGF0cmVnX3Nlcl9pbnN0YW5jZSktPnJzcF9tc2dfaWQgPSA4ICogKGkgKyAxKSAtIChqICsgMSkgKyAxOw0KCQkJCWF0cmVnX3Nlcl9keW5hbWljX2lkcG9vbFtpXSA9IGF0cmVnX3Nlcl9keW5hbWljX2lkcG9vbFtpXSB8ICgxIDw8IGopOw0KCQkJCWF0cmVnX3Nlcl9keW5hbWljX2lkcG9vbFtpXSA9IGF0cmVnX3Nlcl9keW5hbWljX2lkcG9vbFtpXSB8ICgxIDw8IChqIC0gMSkpOw0KCQkJCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhdHJlZ19zZXJfY3R4LmF0X3Nlcl9pZHBvb2xfbG9jayk7DQoNCgkJCQlyZXR1cm4gMDsNCgkJCX0NCgkJfQ0KCX0NCiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYXRyZWdfc2VyX2N0eC5hdF9zZXJfaWRwb29sX2xvY2spOw0KDQoJc2xvZyhBVFJFR19QUklOVCwgU0xPR19FUlIsICJFcnI6IGF0cmVnX3Nlcl9hbGxvY2F0aW9uX3Byb2MgaWQgcG9vbCBpcyBGVUxMXG4iKTsNCgkNCglyZXR1cm4gLTE7DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgICAgICAgIM6qw7+49teisuG1xGluZm8gQVS2r8yst9bF5HJlcV9tc2dfaWQNCiAqIEBwYXJhbSAob3V0KSAgcGF0cmVnX2luZm9faW5zdGFuY2Ug16Ky4bXEaW5mbyBBVMq1wP0NCiAqIEByZXR1cm4gICAgICAgzt4NCiAqIEBub3RlICAgICAgICAgzt4NCiAqIEB3YXJuaW5nICAgICAgzt4NCiAqLw0Kc3RhdGljIGludCBhdHJlZ19pbmZvX2FsbG9jYXRpb25fcHJvYyh2b2lkKiBwYXRyZWdfaW5mb19pbnN0YW5jZSkNCnsNCglpbnQgaSxqOw0KICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYXRyZWdfaW5mb19jdHguYXRfaW5mb19pZHBvb2xfbG9jayk7DQoJZm9yIChpID0gMDsgaSA8IEFUUkVHX0lORk9fSURfTUFYOyBpKyspIHsNCgkJZm9yIChqID0gNzsgaiA+PSAwOyBqLS0pIHsNCgkJCWlmICgwID09IChpbnQpKGF0cmVnX2luZm9fZHluYW1pY19pZHBvb2xbaV0gJiAoMSA8PCBqKSkpIHsNCgkJCQkoKHN0cnVjdCBhdHJlZ19pbmZvX2luc3RhbmNlX3QgKilwYXRyZWdfaW5mb19pbnN0YW5jZSktPnJlcV9tc2dfaWQgPSA4ICogKGkgKyAxKSAtIChqICsgMSkgKyA1MTI7DQoJCQkJYXRyZWdfaW5mb19keW5hbWljX2lkcG9vbFtpXSA9IGF0cmVnX2luZm9fZHluYW1pY19pZHBvb2xbaV0gfCAoMSA8PCBqKTsNCgkJCQlwdGhyZWFkX211dGV4X3VubG9jaygmYXRyZWdfaW5mb19jdHguYXRfaW5mb19pZHBvb2xfbG9jayk7DQoNCgkJCQlyZXR1cm4gMDsNCgkJCX0NCgkJfQ0KCX0NCiAgICBwdGhyZWFkX211dGV4X3VubG9jaygmYXRyZWdfaW5mb19jdHguYXRfaW5mb19pZHBvb2xfbG9jayk7DQoNCglzbG9nKEFUUkVHX1BSSU5ULCBTTE9HX0VSUiwgIkVycjogYXRyZWdfaW5mb19hbGxvY2F0aW9uX3Byb2MgaWQgcG9vbCBpcyBGVUxMXG4iKTsNCgkNCglyZXR1cm4gLTE7DQp9DQoNCg0KLyoqDQogKiBAYnJpZWYgICAgICAgIM6qw7+49teisuG1xEFUtq/MrLfWxeRyZXFfbXNnX2lk0+tyc3BfbXNnX2lkDQogKiBAcGFyYW0gKGluKSAgIGF0cmVnX3R5cGUg16Ky4bXEQVTA4NDNOiAwLXNlciwgMS1pbmZvDQogKiBAcGFyYW0gKG91dCkgIHBhdHJlZ19pbnN0YW5jZSDXorLhtcRBVMq1wP0NCiAqIEByZXR1cm4gICAgICAgzt4NCiAqIEBub3RlICAgICAgICAgzt4NCiAqIEB3YXJuaW5nICAgICAgzt4NCiAqLw0Kc3RhdGljIGludCBhdHJlZ19keW5hbWljX2lkX2FsbG9jYXRpb24odm9pZCogcGF0cmVnX2luc3RhbmNlLCBpbnQgYXRyZWdfdHlwZSkNCnsNCglpbnQgcmV0ID0gLTE7DQoNCglzd2l0Y2ggKGF0cmVnX3R5cGUpIHsNCgkJY2FzZSBBVF9SRUdfU0VSOg0KCQkJcmV0ID0gYXRyZWdfc2VyX2FsbG9jYXRpb25fcHJvYyhwYXRyZWdfaW5zdGFuY2UpOw0KCQkJYnJlYWs7DQoNCgkJY2FzZSBBVF9SRUdfSU5GTzoNCgkJCXJldCA9IGF0cmVnX2luZm9fYWxsb2NhdGlvbl9wcm9jKHBhdHJlZ19pbnN0YW5jZSk7DQoJCQlicmVhazsNCg0KCQlkZWZhdWx0Og0KCQkJc2xvZyhBVFJFR19QUklOVCwgU0xPR19FUlIsICJFcnI6IGF0cmVnX2R5bmFtaWNfaWRfYWxsb2NhdGlvbiB0eXBlIGludmFsaWRcbiIpOw0KCQkJYnJlYWs7DQoJfQ0KDQoJcmV0dXJuIHJldDsNCn0NCg0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogCQkJCQkgICAgR2xvYmFsIGZ1bmN0aW9uIGltcGxlbWVudGF0aW9ucwkJCQkJCSAgICoNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KaW50IHJlZ19hdF9zZXJ2X2Z1bmMoY2hhciAqYXRfY21kX3ByZWZpeCwgc2VyX2NiX3Byb2MgY2IpDQp7DQoJaW50IHNlbmRfcmV0ID0gLTE7DQogICAgc3RydWN0IGF0cmVnX3Nlcl9pbnN0YW5jZV90ICpwYXRyZWdfc2VyX2luc3RhbmNlID0gTlVMTDsNCglzdHJ1Y3QgYXRyZWdfbXNnX3QgKnBhdHJlZ19tc2dkYXRhID0gTlVMTDsNCg0KCWlmIChOVUxMID09IGF0X2NtZF9wcmVmaXggfHwgTlVMTCA9PSBjYikgew0KCSAgICBzbG9nKEFUUkVHX1BSSU5ULCBTTE9HX0VSUiwgIkVycjogcmVnaXN0ZXJfc2Vydl9mdW5jIHBhcmEgd3JvbmcsIGF0X2NtZF9wcmVmaXggb3IgY2IgaXMgTlVMTFxuIik7DQoJCXJldHVybiAtMTsNCiAgICB9DQoJDQoJLyogYXRfY29udGV4dLP1yry7ryAqLw0KICAgIGlmICgtMSA9PSBhdHJlZ19jb250ZXh0X2luaXQoQVRfUkVHX1NFUikpDQoJCXJldHVybiAtMTsNCgkNCiAgICAvKiC5ub2oYXTKtcD9ICovCQ0KCXBhdHJlZ19zZXJfaW5zdGFuY2UgPSAoc3RydWN0IGF0cmVnX3Nlcl9pbnN0YW5jZV90ICopYXRyZWdfY29uc3RydWN0KGF0X2NtZF9wcmVmaXgsIGNiLCBBVF9SRUdfU0VSKTsNCglpZiAoTlVMTCA9PSBwYXRyZWdfc2VyX2luc3RhbmNlKSB7DQoJICAgIHNsb2coQVRSRUdfUFJJTlQsIFNMT0dfRVJSLCAiRXJyOiBhdHJlZ19jb25zdHJ1Y3QgQVQgJXMgZmFpbCFcbiIsIGF0X2NtZF9wcmVmaXgpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KDQoJLyogtq/MrLfWxeRyZXFfbXNnX2lk0+tyc3BfbXNnX2lkICovDQoJaWYgKDAgIT0gYXRyZWdfZHluYW1pY19pZF9hbGxvY2F0aW9uKCh2b2lkICopcGF0cmVnX3Nlcl9pbnN0YW5jZSwgQVRfUkVHX1NFUikpDQoJew0KCQlzbG9nKEFUUkVHX1BSSU5ULCBTTE9HX0VSUiwgIkVycjogc2VydiBhdHJlZ19keW5hbWljX2lkX2FsbG9jYXRpb24gZmFpbFxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoJCQ0KICAgIC8qILu6tOZhdMq1wP0gKi8NCiAgICBwdGhyZWFkX211dGV4X2xvY2soJmF0cmVnX3Nlcl9jdHguYXRfc2VyX2xvY2tfdG1wKTsNCiAgICBsaXN0X2FkZF90YWlsKChzdHJ1Y3QgbGlzdF9oZWFkICopcGF0cmVnX3Nlcl9pbnN0YW5jZSwgJmF0cmVnX3Nlcl9jdHguYXRfc2VyX2xpc3RfdG1wKTsNCglwdGhyZWFkX211dGV4X3VubG9jaygmYXRyZWdfc2VyX2N0eC5hdF9zZXJfbG9ja190bXApOw0KDQoJLyog16Ky4WF01sFhdF9jdGwgKi8NCglwYXRyZWdfbXNnZGF0YSA9IChzdHJ1Y3QgYXRyZWdfbXNnX3QgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdHJlZ19tc2dfdCkpOw0KCW1lbXNldChwYXRyZWdfbXNnZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBhdHJlZ19tc2dfdCkpOw0KCXN0cm5jcHkocGF0cmVnX21zZ2RhdGEtPmF0X2NtZF9wcmVmaXgsIHBhdHJlZ19zZXJfaW5zdGFuY2UtPmF0X2NtZF9wcmVmaXgsIEFUX0NNRF9QUkVGSVgtMSk7DQoJcGF0cmVnX21zZ2RhdGEtPnJlcV9tc2dfaWQgPSBwYXRyZWdfc2VyX2luc3RhbmNlLT5yZXFfbXNnX2lkOw0KCXBhdHJlZ19tc2dkYXRhLT5yc3BfbXNnX2lkID0gcGF0cmVnX3Nlcl9pbnN0YW5jZS0+cnNwX21zZ19pZDsNCglwYXRyZWdfbXNnZGF0YS0+dHlwZSA9IEFUX1JFR19TRVI7DQoJcGF0cmVnX21zZ2RhdGEtPnJlcyA9IC0xOw0KCQ0KCXNlbmRfcmV0ID0gaXBjX3NlbmRfbWVzc2FnZTIoYXRyZWdfY29tbW9uX2N0eC5tb2RpZCwgTU9EVUxFX0lEX0FUX0NUTCwgTVNHX0NNRF9BVF9SRUdfUkVRLCBzaXplb2Yoc3RydWN0IGF0cmVnX21zZ190KSwgKHVuc2lnbmVkIGNoYXIgKilwYXRyZWdfbXNnZGF0YSwgMCk7DQogICAgaWYgKDAgIT0gc2VuZF9yZXQpIHsJDQoJICAgIHNsb2coQVRSRUdfUFJJTlQsIFNMT0dfRVJSLCAiRXJyOiByZWdpc3Rlcl9zZXJ2X2Z1bmMgaXBjIGZhaWwhXG4iKTsNCgkJcmV0dXJuIC0xOw0KICAgIH0NCg0KCWZyZWUocGF0cmVnX21zZ2RhdGEpOw0KCQ0KCWF0cmVnX3dhaXRfcnNwKE1TR19DTURfQVRfUkVHX1JFUSk7DQoJCQ0KCXJldHVybiAwOw0KfQ0KDQoNCmludCB1bnJlZ19hdF9zZXJ2X2Z1bmMoY2hhciAqYXRfY21kX3ByZWZpeCkNCnsNCglpbnQgc2VuZF9yZXQgPSAtMTsNCiAgICBzdHJ1Y3QgYXRyZWdfc2VyX2luc3RhbmNlX3QgKnBhdHJlZ19zZXJfaW5zdGFuY2UgPSBOVUxMOw0KCXN0cnVjdCBhdHJlZ19tc2dfdCAqcGF0cmVnX21zZ2RhdGEgPSBOVUxMOw0KDQoJaWYgKE5VTEwgPT0gYXRfY21kX3ByZWZpeCkgew0KCSAgICBzbG9nKEFUUkVHX1BSSU5ULCBTTE9HX0VSUiwgIkVycjogdW5yZWdpc3Rlcl9zZXJ2X2Z1bmMgcGFyYSB3cm9uZywgYXRfY21kX3ByZWZpeD1OVUxMIVxuIik7DQoJCXJldHVybiAtMTsNCiAgICB9DQoNCgkNCglwYXRyZWdfc2VyX2luc3RhbmNlID0gKHN0cnVjdCBhdHJlZ19zZXJfaW5zdGFuY2VfdCAqKWF0cmVnX3NlYXJjaF9pbnN0YW5jZV9ieV9wcmVmaXgoYXRfY21kX3ByZWZpeCwgQVRfUkVHX1NFUik7DQoJaWYgKE5VTEwgPT0gcGF0cmVnX3Nlcl9pbnN0YW5jZSkgew0KCSAgICBzbG9nKEFUUkVHX1BSSU5ULCBTTE9HX0VSUiwgIkVycjogdW5yZWdfYXRfc2Vydl9mdW5jIEFUICVzIG5vdCByZWdpc3QgeWV0XG4iLCBhdF9jbWRfcHJlZml4KTsNCgkJcmV0dXJuIC0xOw0KCX0NCgkNCglwYXRyZWdfbXNnZGF0YSA9IChzdHJ1Y3QgYXRyZWdfbXNnX3QgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdHJlZ19tc2dfdCkpOw0KCW1lbXNldChwYXRyZWdfbXNnZGF0YSwgMCwgc2l6ZW9mKHN0cnVjdCBhdHJlZ19tc2dfdCkpOw0KCXN0cm5jcHkocGF0cmVnX21zZ2RhdGEtPmF0X2NtZF9wcmVmaXgsIHBhdHJlZ19zZXJfaW5zdGFuY2UtPmF0X2NtZF9wcmVmaXgsIEFUX0NNRF9QUkVGSVgtMSk7DQoJcGF0cmVnX21zZ2RhdGEtPnJlcV9tc2dfaWQgPSBwYXRyZWdfc2VyX2luc3RhbmNlLT5yZXFfbXNnX2lkOw0KCXBhdHJlZ19tc2dkYXRhLT5yc3BfbXNnX2lkID0gcGF0cmVnX3Nlcl9pbnN0YW5jZS0+cnNwX21zZ19pZDsNCglwYXRyZWdfbXNnZGF0YS0+dHlwZSA9IEFUX1JFR19TRVI7DQoJcGF0cmVnX21zZ2RhdGEtPnJlcyA9IC0xOw0KDQoJc2VuZF9yZXQgPSBpcGNfc2VuZF9tZXNzYWdlMihhdHJlZ19jb21tb25fY3R4Lm1vZGlkLCBNT0RVTEVfSURfQVRfQ1RMLCBNU0dfQ01EX0FUX1VOUkVHX1JFUSwgc2l6ZW9mKHN0cnVjdCBhdHJlZ19tc2dfdCksICh1bnNpZ25lZCBjaGFyICopcGF0cmVnX21zZ2RhdGEsIDApOw0KICAgIGlmICgwICE9IHNlbmRfcmV0KSB7CQ0KCSAgICBzbG9nKEFUUkVHX1BSSU5ULCBTTE9HX0VSUiwgIkVycjogdW5yZWdpc3Rlcl9zZXJ2X2Z1bmMgaXBjIGZhaWwhXG4iKTsNCgkJcmV0dXJuIC0xOw0KICAgIH0NCgkNCglmcmVlKHBhdHJlZ19tc2dkYXRhKTsNCgkNCglhdHJlZ193YWl0X3JzcChNU0dfQ01EX0FUX1VOUkVHX1JFUSk7DQoNCglyZXR1cm4gMDsNCn0NCg0KDQppbnQgcmVnX2F0X2luZm9fZnVuYyhjaGFyICphdF9jbWRfcHJlZml4LCBpbmZvX2NiX3Byb2MgY2IpDQp7DQoJaW50IHNlbmRfcmV0ID0gLTE7DQogICAgc3RydWN0IGF0cmVnX2luZm9faW5zdGFuY2VfdCAqcGF0cmVnX2luZm9faW5zdGFuY2UgPSBOVUxMOw0KCXN0cnVjdCBhdHJlZ19tc2dfdCAqcGF0cmVnX21zZ2RhdGEgPSBOVUxMOw0KDQoJaWYgKE5VTEwgPT0gYXRfY21kX3ByZWZpeCB8fCBOVUxMID09IGNiKSB7DQoJICAgIHNsb2coQVRSRUdfUFJJTlQsIFNMT0dfRVJSLCAiRXJyOiByZWdpc3Rlcl9pbmZvX2Z1bmMgcGFyYSB3cm9uZywgYXRfY21kX3ByZWZpeCBvciBjYiBpcyBOVUxMXG4iKTsNCgkJcmV0dXJuIC0xOw0KICAgIH0NCgkNCgkvKiBhdF9jb250ZXh0s/XKvLuvICovDQogICAgaWYgKC0xID09IGF0cmVnX2NvbnRleHRfaW5pdChBVF9SRUdfSU5GTykpDQoJCXJldHVybiAtMTsNCgkNCiAgICAvKiC5ub2oYXTKtcD9ICovCQ0KCXBhdHJlZ19pbmZvX2luc3RhbmNlID0gKHN0cnVjdCBhdHJlZ19pbmZvX2luc3RhbmNlX3QgKilhdHJlZ19jb25zdHJ1Y3QoYXRfY21kX3ByZWZpeCwgY2IsIEFUX1JFR19JTkZPKTsNCglpZiAoTlVMTCA9PSBwYXRyZWdfaW5mb19pbnN0YW5jZSkgew0KCSAgICBzbG9nKEFUUkVHX1BSSU5ULCBTTE9HX0VSUiwgIkVycjogYXRyZWdfY29uc3RydWN0IEFUICVzIGZhaWwhXG4iLCBhdF9jbWRfcHJlZml4KTsNCgkJcmV0dXJuIC0xOw0KCX0NCg0KCS8qILavzKy31sXkcmVxX21zZ19pZCAqLw0KCWlmICgwICE9IGF0cmVnX2R5bmFtaWNfaWRfYWxsb2NhdGlvbigodm9pZCAqKXBhdHJlZ19pbmZvX2luc3RhbmNlLCBBVF9SRUdfSU5GTykpDQoJew0KCQlzbG9nKEFUUkVHX1BSSU5ULCBTTE9HX0VSUiwgIkVycjogaW5mbyBhdHJlZ19keW5hbWljX2lkX2FsbG9jYXRpb24gZmFpbFxuIik7DQoJCXJldHVybiAtMTsNCgl9DQoJDQogICAgLyogu7q05mF0yrXA/SAqLw0KICAgIHB0aHJlYWRfbXV0ZXhfbG9jaygmYXRyZWdfaW5mb19jdHguYXRfaW5mb19sb2NrX3RtcCk7DQogICAgbGlzdF9hZGRfdGFpbCgoc3RydWN0IGxpc3RfaGVhZCAqKXBhdHJlZ19pbmZvX2luc3RhbmNlLCAmYXRyZWdfaW5mb19jdHguYXRfaW5mb19saXN0X3RtcCk7DQoJcHRocmVhZF9tdXRleF91bmxvY2soJmF0cmVnX2luZm9fY3R4LmF0X2luZm9fbG9ja190bXApOw0KCQ0KCS8qINeisuFhdNbBYXRfY3RsICovDQoJcGF0cmVnX21zZ2RhdGEgPSAoc3RydWN0IGF0cmVnX21zZ190ICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgYXRyZWdfbXNnX3QpKTsNCgltZW1zZXQocGF0cmVnX21zZ2RhdGEsIDAsIHNpemVvZihzdHJ1Y3QgYXRyZWdfbXNnX3QpKTsNCglzdHJuY3B5KHBhdHJlZ19tc2dkYXRhLT5hdF9jbWRfcHJlZml4LCBwYXRyZWdfaW5mb19pbnN0YW5jZS0+YXRfY21kX3ByZWZpeCwgQVRfQ01EX1BSRUZJWC0xKTsNCglwYXRyZWdfbXNnZGF0YS0+cmVxX21zZ19pZCA9IHBhdHJlZ19pbmZvX2luc3RhbmNlLT5yZXFfbXNnX2lkOw0KCXBhdHJlZ19tc2dkYXRhLT5yc3BfbXNnX2lkID0gLTE7DQoJcGF0cmVnX21zZ2RhdGEtPnR5cGUgPSBBVF9SRUdfSU5GTzsNCglwYXRyZWdfbXNnZGF0YS0+cmVzID0gLTE7DQoJDQoJc2VuZF9yZXQgPSBpcGNfc2VuZF9tZXNzYWdlMihhdHJlZ19jb21tb25fY3R4Lm1vZGlkLCBNT0RVTEVfSURfQVRfQ1RMLCBNU0dfQ01EX0FUX1JFR19SRVEsIHNpemVvZihzdHJ1Y3QgYXRyZWdfbXNnX3QpLCAodW5zaWduZWQgY2hhciAqKXBhdHJlZ19tc2dkYXRhLCAwKTsNCiAgICBpZiAoMCAhPSBzZW5kX3JldCkgewkNCgkgICAgc2xvZyhBVFJFR19QUklOVCwgU0xPR19FUlIsICJFcnI6IHJlZ2lzdGVyX2luZm9fZnVuYyBpcGMgZmFpbCFcbiIpOw0KCQlyZXR1cm4gLTE7DQogICAgfQ0KCQ0KCWZyZWUocGF0cmVnX21zZ2RhdGEpOw0KCQ0KCWF0cmVnX3dhaXRfcnNwKE1TR19DTURfQVRfUkVHX1JFUSk7DQoJDQoJcmV0dXJuIDA7DQp9DQoNCg0KaW50IHVucmVnX2F0X2luZm9fZnVuYyhjaGFyICphdF9jbWRfcHJlZml4KQ0Kew0KCWludCBzZW5kX3JldCA9IC0xOw0KICAgIHN0cnVjdCBhdHJlZ19pbmZvX2luc3RhbmNlX3QgKnBhdHJlZ19pbmZvX2luc3RhbmNlID0gTlVMTDsNCglzdHJ1Y3QgYXRyZWdfbXNnX3QgKnBhdHJlZ19tc2dkYXRhID0gTlVMTDsNCg0KCWlmIChOVUxMID09IGF0X2NtZF9wcmVmaXgpIHsNCgkgICAgc2xvZyhBVFJFR19QUklOVCwgU0xPR19FUlIsICJFcnI6IHVucmVnaXN0ZXJfaW5mb19mdW5jIHBhcmEgd3JvbmcsIGF0X2NtZF9wcmVmaXg9TlVMTCFcbiIpOw0KCQlyZXR1cm4gLTE7DQogICAgfQ0KDQoJcGF0cmVnX2luZm9faW5zdGFuY2UgPSAoc3RydWN0IGF0cmVnX2luZm9faW5zdGFuY2VfdCAqKWF0cmVnX3NlYXJjaF9pbnN0YW5jZV9ieV9wcmVmaXgoYXRfY21kX3ByZWZpeCwgQVRfUkVHX0lORk8pOw0KCWlmIChOVUxMID09IHBhdHJlZ19pbmZvX2luc3RhbmNlKSB7DQoJICAgIHNsb2coQVRSRUdfUFJJTlQsIFNMT0dfRVJSLCAiRXJyOiB1bnJlZ19hdF9pbmZvX2Z1bmMgQVQgJXMgbm90IHJlZ2lzdCB5ZXRcbiIsIGF0X2NtZF9wcmVmaXgpOw0KCQlyZXR1cm4gLTE7DQoJfQ0KCQ0KCXBhdHJlZ19tc2dkYXRhID0gKHN0cnVjdCBhdHJlZ19tc2dfdCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IGF0cmVnX21zZ190KSk7DQoJbWVtc2V0KHBhdHJlZ19tc2dkYXRhLCAwLCBzaXplb2Yoc3RydWN0IGF0cmVnX21zZ190KSk7DQoJc3RybmNweShwYXRyZWdfbXNnZGF0YS0+YXRfY21kX3ByZWZpeCwgcGF0cmVnX2luZm9faW5zdGFuY2UtPmF0X2NtZF9wcmVmaXgsIEFUX0NNRF9QUkVGSVgtMSk7DQoJcGF0cmVnX21zZ2RhdGEtPnJlcV9tc2dfaWQgPSBwYXRyZWdfaW5mb19pbnN0YW5jZS0+cmVxX21zZ19pZDsNCglwYXRyZWdfbXNnZGF0YS0+cnNwX21zZ19pZCA9IC0xOw0KCXBhdHJlZ19tc2dkYXRhLT50eXBlID0gQVRfUkVHX0lORk87DQoJcGF0cmVnX21zZ2RhdGEtPnJlcyA9IC0xOw0KDQoJc2VuZF9yZXQgPSBpcGNfc2VuZF9tZXNzYWdlMihhdHJlZ19jb21tb25fY3R4Lm1vZGlkLCBNT0RVTEVfSURfQVRfQ1RMLCBNU0dfQ01EX0FUX1VOUkVHX1JFUSwgc2l6ZW9mKHN0cnVjdCBhdHJlZ19tc2dfdCksICh1bnNpZ25lZCBjaGFyICopcGF0cmVnX21zZ2RhdGEsIDApOw0KICAgIGlmICgwICE9IHNlbmRfcmV0KSB7CQ0KCSAgICBzbG9nKEFUUkVHX1BSSU5ULCBTTE9HX0VSUiwgIkVycjogdW5yZWdpc3Rlcl9pbmZvX2Z1bmMgaXBjIGZhaWwhXG4iKTsNCgkJcmV0dXJuIC0xOw0KICAgIH0NCgkNCglmcmVlKHBhdHJlZ19tc2dkYXRhKTsNCgkNCglhdHJlZ193YWl0X3JzcChNU0dfQ01EX0FUX1VOUkVHX1JFUSk7DQoNCglyZXR1cm4gMDsNCn0NCg0K