LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIEZJWE1FOiB3ZSB1c2UgcmVhZHx3cml0ZSBhY2Nlc3MgaW4gYWxsIGNhc2VzLiBTaG91bGRuJ3Qgd2UgZGVwZW5kIHRoYXQKICogb24gdGhlIGFjY2VzcyBvZiB0aGUgY3VycmVudCBoYW5kbGU/CiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2lmZGVmIEhBVkVfU1lTX0VSUk5PX0gKIyBpbmNsdWRlIDxzeXMvZXJybm8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpZmRlZiBIQVZFX1NZU19GSUxJT19ICiMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbnNvY2syLmgiCiNpbmNsdWRlICJwcm9jZXNzLmgiCiNpbmNsdWRlICJoYW5kbGUuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAicmVxdWVzdC5oIgoKc3RydWN0IHNvY2sKewogICAgc3RydWN0IG9iamVjdCAgICAgICBvYmo7ICAgICAgICAgLyogb2JqZWN0IGhlYWRlciAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBzdGF0ZTsgICAgICAgLyogc3RhdHVzIGJpdHMgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgbWFzazsgICAgICAgIC8qIGV2ZW50IG1hc2sgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgaG1hc2s7ICAgICAgIC8qIGhlbGQgKGJsb2NrZWQpIGV2ZW50cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBwbWFzazsgICAgICAgLyogcGVuZGluZyBldmVudHMgKi8KICAgIHN0cnVjdCBldmVudCAgICAgICAqZXZlbnQ7ICAgICAgIC8qIGV2ZW50IG9iamVjdCAqLwogICAgaW50ICAgICAgICAgICAgICAgICBlcnJvcnNbRkRfTUFYX0VWRU5UU107IC8qIGV2ZW50IGVycm9ycyAqLwp9OwoKc3RhdGljIHZvaWQgc29ja19kdW1wKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB2ZXJib3NlICk7CnN0YXRpYyBpbnQgc29ja19zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKc3RhdGljIGludCBzb2NrX2dldF9wb2xsX2V2ZW50cyggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyB2b2lkIHNvY2tfcG9sbF9ldmVudCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgZXZlbnQgKTsKc3RhdGljIGludCBzb2NrX2dldF9mZCggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyB2b2lkIHNvY2tfZGVzdHJveSggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyBpbnQgc29ja19nZXRfZXJyb3IoIGludCBlcnIgKTsKc3RhdGljIHZvaWQgc29ja19zZXRfZXJyb3Iodm9pZCk7CgpzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgc29ja19vcHMgPQp7CiAgICBzaXplb2Yoc3RydWN0IHNvY2spLCAgICAgICAgICAvKiBzaXplICovCiAgICBzb2NrX2R1bXAsICAgICAgICAgICAgICAgICAgICAvKiBkdW1wICovCiAgICBhZGRfcXVldWUsICAgICAgICAgICAgICAgICAgICAvKiBhZGRfcXVldWUgKi8KICAgIHJlbW92ZV9xdWV1ZSwgICAgICAgICAgICAgICAgIC8qIHJlbW92ZV9xdWV1ZSAqLwogICAgc29ja19zaWduYWxlZCwgICAgICAgICAgICAgICAgLyogc2lnbmFsZWQgKi8KICAgIG5vX3NhdGlzZmllZCwgICAgICAgICAgICAgICAgIC8qIHNhdGlzZmllZCAqLwogICAgc29ja19nZXRfcG9sbF9ldmVudHMsICAgICAgICAgLyogZ2V0X3BvbGxfZXZlbnRzICovCiAgICBzb2NrX3BvbGxfZXZlbnQsICAgICAgICAgICAgICAvKiBwb2xsX2V2ZW50ICovCiAgICBzb2NrX2dldF9mZCwgICAgICAgICAgICAgICAgICAvKiBnZXRfcmVhZF9mZCAqLwogICAgc29ja19nZXRfZmQsICAgICAgICAgICAgICAgICAgLyogZ2V0X3dyaXRlX2ZkICovCiAgICBub19mbHVzaCwgICAgICAgICAgICAgICAgICAgICAvKiBmbHVzaCAqLwogICAgbm9fZ2V0X2ZpbGVfaW5mbywgICAgICAgICAgICAgLyogZ2V0X2ZpbGVfaW5mbyAqLwogICAgc29ja19kZXN0cm95ICAgICAgICAgICAgICAgICAgLyogZGVzdHJveSAqLwp9OwoKc3RhdGljIHZvaWQgc29ja19yZXNlbGVjdCggc3RydWN0IHNvY2sgKnNvY2sgKQp7CiAgICBpbnQgZXYgPSBzb2NrX2dldF9wb2xsX2V2ZW50cyggJnNvY2stPm9iaiApOwogICAgc3RydWN0IHBvbGxmZCBwZmQ7CgogICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgIGZwcmludGYoc3RkZXJyLCJzb2NrX3Jlc2VsZWN0KCVkKTogbmV3IG1hc2sgJXhcbiIsIHNvY2stPm9iai5mZCwgZXYpOwogICAgc2V0X3NlbGVjdF9ldmVudHMoICZzb2NrLT5vYmosIGV2ICk7CgogICAgLyogY2hlY2sgd2hldGhlciBjb25kaXRpb24gaXMgc2F0aXNmaWVkIGFscmVhZHkgKi8KICAgIHBmZC5mZCA9IHNvY2stPm9iai5mZDsKICAgIHBmZC5ldmVudHMgPSBldjsKICAgIHBmZC5yZXZlbnRzID0gMDsKICAgIHBvbGwoICZwZmQsIDEsIDAgKTsKICAgIGlmIChwZmQucmV2ZW50cykKICAgICAgICBzb2NrX3BvbGxfZXZlbnQoICZzb2NrLT5vYmosIHBmZC5yZXZlbnRzKTsKfQoKaW5saW5lIHN0YXRpYyBpbnQgc29ja19lcnJvcihpbnQgcykKewogICAgdW5zaWduZWQgaW50IG9wdHZhbCA9IDAsIG9wdGxlbjsKICAgIAogICAgb3B0bGVuID0gc2l6ZW9mKG9wdHZhbCk7CiAgICBnZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAodm9pZCAqKSAmb3B0dmFsLCAmb3B0bGVuKTsKICAgIHJldHVybiBvcHR2YWwgPyBzb2NrX2dldF9lcnJvcihvcHR2YWwpIDogMDsKfQoKc3RhdGljIHZvaWQgc29ja19wb2xsX2V2ZW50KCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCBldmVudCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgdW5zaWduZWQgaW50IGVtYXNrOwogICAgYXNzZXJ0KCBzb2NrLT5vYmoub3BzID09ICZzb2NrX29wcyApOwogICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIHNlbGVjdCBldmVudDogJXhcbiIsIHNvY2stPm9iai5mZCwgZXZlbnQpOwogICAgaWYgKHNvY2stPnN0YXRlICYgV1NfRkRfQ09OTkVDVCkKICAgIHsKICAgICAgICAvKiBjb25uZWN0aW5nICovCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTE9VVCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIGdvdCBjb25uZWN0ZWQgKi8KICAgICAgICAgICAgc29jay0+c3RhdGUgfD0gV1NfRkRfQ09OTkVDVEVEfFdTX0ZEX1JFQUR8V1NfRkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5XU19GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgY29ubmVjdGlvbiBzdWNjZXNzXG4iLCBzb2NrLT5vYmouZmQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChldmVudCAmIChQT0xMRVJSfFBPTExIVVApKQogICAgICAgIHsKICAgICAgICAgICAgLyogd2UgZGlkbid0IGdldCBjb25uZWN0ZWQ/ICovCiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5XU19GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gc29ja19lcnJvciggc29jay0+b2JqLmZkICk7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGNvbm5lY3Rpb24gZmFpbHVyZVxuIiwgc29jay0+b2JqLmZkKTsKICAgICAgICB9CiAgICB9IGVsc2UKICAgIGlmIChzb2NrLT5zdGF0ZSAmIFdTX0ZEX0xJU1RFTklORykKICAgIHsKICAgICAgICAvKiBsaXN0ZW5pbmcgKi8KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMSU4pCiAgICAgICAgewogICAgICAgICAgICAvKiBpbmNvbWluZyBjb25uZWN0aW9uICovCiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0FDQ0VQVF9CSVRdID0gMDsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChldmVudCAmIChQT0xMRVJSfFBPTExIVVApKQogICAgICAgIHsKICAgICAgICAgICAgLyogZmFpbGVkIGluY29taW5nIGNvbm5lY3Rpb24/ICovCiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0FDQ0VQVF9CSVRdID0gc29ja19lcnJvciggc29jay0+b2JqLmZkICk7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICB9CiAgICB9IGVsc2UKICAgIHsKICAgICAgICAvKiBub3JtYWwgZGF0YSBmbG93ICovCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTElOKQogICAgICAgIHsKICAgICAgICAgICAgLyogaW5jb21pbmcgZGF0YSAqLwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9SRUFEOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9SRUFEOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfUkVBRF9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgaXMgcmVhZGFibGVcbiIsIHNvY2stPm9iai5mZCApOwogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMT1VUKQogICAgICAgIHsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX1dSSVRFOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfV1JJVEVfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGlzIHdyaXRhYmxlXG4iLCBzb2NrLT5vYmouZmQpOwogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMUFJJKQogICAgICAgIHsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfT09COwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9PT0I7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9PT0JfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGdvdCBPT0IgZGF0YVxuIiwgc29jay0+b2JqLmZkKTsKICAgICAgICB9CiAgICAgICAgaWYgKCgoZXZlbnQgJiBQT0xMRVJSKSB8fCAoKGV2ZW50ICYgKFBPTExJTnxQT0xMSFVQKSkgPT0gUE9MTEhVUCkpCiAgICAgICAgICAgICYmIChzb2NrLT5zdGF0ZSAmIChXU19GRF9SRUFEfFdTX0ZEX1dSSVRFKSkpIHsKICAgICAgICAgICAgLyogc29ja2V0IGNsb3NpbmcgKi8KICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0NMT1NFX0JJVF0gPSBzb2NrX2Vycm9yKCBzb2NrLT5vYmouZmQgKTsKICAgICAgICAgICAgc29jay0+c3RhdGUgJj0gfihXU19GRF9DT05ORUNURUR8V1NfRkRfUkVBRHxXU19GRF9XUklURSk7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NMT1NFOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlZCBhYm9ydGVkIGJ5IGVycm9yICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBzb2NrLT5vYmouZmQsIHNvY2stPmVycm9yc1tGRF9DTE9TRV9CSVRdKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGV2ZW50ICYgKFBPTExFUlJ8UE9MTEhVUCkpCiAgICAgICAgc2V0X3NlbGVjdF9ldmVudHMoICZzb2NrLT5vYmosIC0xICk7CiAgICBlbHNlCiAgICAgICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgLyogd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBmb3Igd2hhdGV2ZXIganVzdCBoYXBwZW5lZCAqLwogICAgZW1hc2sgPSBzb2NrLT5wbWFzayAmIHNvY2stPm1hc2s7CiAgICBpZiAoZGVidWdfbGV2ZWwgJiYgZW1hc2spCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgcGVuZGluZyBldmVudHM6ICV4XG4iLCBzb2NrLT5vYmouZmQsIGVtYXNrKTsKICAgIGlmIChlbWFzayAmJiBzb2NrLT5ldmVudCkgewogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50ZihzdGRlcnIsICJzaWduYWxsaW5nIGV2ZW50IHB0ciAlcFxuIiwgc29jay0+ZXZlbnQpOwogICAgICAgIHNldF9ldmVudChzb2NrLT5ldmVudCk7CiAgICB9CgogICAgLyogaWYgYW55b25lIGlzIHN0dXBpZCBlbm91Z2ggdG8gd2FpdCBvbiB0aGUgc29ja2V0IG9iamVjdCBpdHNlbGYsCiAgICAgKiBtYXliZSB3ZSBzaG91bGQgd2FrZSB0aGVtIHVwIHRvbywganVzdCBpbiBjYXNlPyAqLwogICAgd2FrZV91cCggJnNvY2stPm9iaiwgMCApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2R1bXAoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICBwcmludGYoICJTb2NrZXQgZmQ9JWQsIHN0YXRlPSV4LCBtYXNrPSV4LCBwZW5kaW5nPSV4LCBoZWxkPSV4XG4iLAogICAgICAgICAgICBzb2NrLT5vYmouZmQsIHNvY2stPnN0YXRlLAogICAgICAgICAgICBzb2NrLT5tYXNrLCBzb2NrLT5wbWFzaywgc29jay0+aG1hc2sgKTsKfQoKc3RhdGljIGludCBzb2NrX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICByZXR1cm4gY2hlY2tfc2VsZWN0X2V2ZW50cyggc29jay0+b2JqLmZkLCBzb2NrX2dldF9wb2xsX2V2ZW50cyggJnNvY2stPm9iaiApICk7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfcG9sbF9ldmVudHMoIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgdW5zaWduZWQgaW50IG1hc2sgPSBzb2NrLT5tYXNrICYgc29jay0+c3RhdGUgJiB+c29jay0+aG1hc2s7CiAgICBpbnQgZXYgPSAwOwoKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgaWYgKHNvY2stPnN0YXRlICYgV1NfRkRfQ09OTkVDVCkKICAgICAgICAvKiBjb25uZWN0aW5nLCB3YWl0IGZvciB3cml0YWJsZSAqLwogICAgICAgIHJldHVybiBQT0xMT1VUOwogICAgaWYgKHNvY2stPnN0YXRlICYgV1NfRkRfTElTVEVOSU5HKQogICAgICAgIC8qIGxpc3RlbmluZywgd2FpdCBmb3IgcmVhZGFibGUgKi8KICAgICAgICByZXR1cm4gKHNvY2stPmhtYXNrICYgRkRfQUNDRVBUKSA/IDAgOiBQT0xMSU47CgogICAgaWYgKG1hc2sgJiBGRF9SRUFEKSAgZXYgfD0gUE9MTElOIHwgUE9MTFBSSTsKICAgIGlmIChtYXNrICYgRkRfV1JJVEUpIGV2IHw9IFBPTExPVVQ7CiAgICByZXR1cm4gZXY7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfZmQoIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgaW50IGZkOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKICAgIGZkID0gZHVwKCBzb2NrLT5vYmouZmQgKTsKICAgIGlmIChmZD09LTEpCiAgICAJc29ja19zZXRfZXJyb3IoKTsKICAgIHJldHVybiBmZDsKfQoKc3RhdGljIHZvaWQgc29ja19kZXN0cm95KCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgLyogRklYTUU6IHNwZWNpYWwgc29ja2V0IHNodXRkb3duIHN0dWZmPyAqLwogICAgaWYgKHNvY2stPmV2ZW50KQogICAgewogICAgICAgIC8qIGlmIHRoZSBzZXJ2aWNlIHRocmVhZCB3YXMgd2FpdGluZyBmb3IgdGhlIGV2ZW50IG9iamVjdCwKICAgICAgICAgKiB3ZSBzaG91bGQgbm93IHNpZ25hbCBpdCwgdG8gbGV0IHRoZSBzZXJ2aWNlIHRocmVhZAogICAgICAgICAqIG9iamVjdCBkZXRlY3QgdGhhdCBpdCBpcyBub3cgb3JwaGFuZWQuLi4gKi8KICAgICAgICBpZiAoc29jay0+bWFzayAmIFdTX0ZEX1NFUlZFVkVOVCkKICAgICAgICAgICAgc2V0X2V2ZW50KCBzb2NrLT5ldmVudCApOwogICAgICAgIC8qIHdlJ3JlIHRocm91Z2ggd2l0aCBpdCAqLwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrLT5ldmVudCApOwogICAgfQp9CgovKiBjcmVhdGUgYSBuZXcgYW5kIHVuY29ubmVjdGVkIHNvY2tldCAqLwpzdGF0aWMgc3RydWN0IG9iamVjdCAqY3JlYXRlX3NvY2tldCggaW50IGZhbWlseSwgaW50IHR5cGUsIGludCBwcm90b2NvbCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgaW50IHNvY2tmZDsKCiAgICBzb2NrZmQgPSBzb2NrZXQoIGZhbWlseSwgdHlwZSwgcHJvdG9jb2wgKTsKICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICBmcHJpbnRmKHN0ZGVyciwic29ja2V0KCVkLCVkLCVkKT0lZFxuIixmYW1pbHksdHlwZSxwcm90b2NvbCxzb2NrZmQpOwogICAgaWYgKHNvY2tmZCA9PSAtMSkgewogICAgICAgIHNvY2tfc2V0X2Vycm9yKCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBmY250bChzb2NrZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOyAvKiBtYWtlIHNvY2tldCBub25ibG9ja2luZyAqLwogICAgaWYgKCEoc29jayA9IGFsbG9jX29iamVjdCggJnNvY2tfb3BzLCBzb2NrZmQgKSkpIHJldHVybiBOVUxMOwogICAgc29jay0+c3RhdGUgPSAodHlwZSE9U09DS19TVFJFQU0pID8gV1NfRkRfUkVBRHxXU19GRF9XUklURSA6IDA7CiAgICBzb2NrLT5tYXNrICA9IDA7CiAgICBzb2NrLT5obWFzayA9IDA7CiAgICBzb2NrLT5wbWFzayA9IDA7CiAgICBzb2NrLT5ldmVudCA9IE5VTEw7CiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICBjbGVhcl9lcnJvcigpOwogICAgcmV0dXJuICZzb2NrLT5vYmo7Cn0KCi8qIGFjY2VwdCBhIHNvY2tldCAoY3JlYXRlcyBhIG5ldyBmZCkgKi8Kc3RhdGljIHN0cnVjdCBvYmplY3QgKmFjY2VwdF9zb2NrZXQoIGludCBoYW5kbGUgKQp7CiAgICBzdHJ1Y3Qgc29jayAqYWNjZXB0c29jazsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgaW50CWFjY2VwdGZkOwogICAgc3RydWN0IHNvY2thZGRyCXNhZGRyOwogICAgaW50CQkJc2xlbjsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooY3VycmVudC0+cHJvY2VzcyxoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzKTsKICAgIGlmICghc29jaykKICAgIAlyZXR1cm4gTlVMTDsKICAgIC8qIFRyeSB0byBhY2NlcHQoMikuIFdlIGNhbid0IGJlIHNhZmUgdGhhdCB0aGlzIGFuIGFscmVhZHkgY29ubmVjdGVkIHNvY2tldCAKICAgICAqIG9yIHRoYXQgYWNjZXB0KCkgaXMgYWxsb3dlZCBvbiBpdC4gSW4gdGhvc2UgY2FzZXMgd2Ugd2lsbCBnZXQgLTEvZXJybm8KICAgICAqIHJldHVybi4KICAgICAqLwogICAgc2xlbiA9IHNpemVvZihzYWRkcik7CiAgICBhY2NlcHRmZCA9IGFjY2VwdChzb2NrLT5vYmouZmQsJnNhZGRyLCZzbGVuKTsKICAgIGlmIChhY2NlcHRmZD09LTEpIHsKICAgIAlzb2NrX3NldF9lcnJvcigpOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CglyZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmICghKGFjY2VwdHNvY2sgPSBhbGxvY19vYmplY3QoICZzb2NrX29wcywgYWNjZXB0ZmQgKSkpCiAgICB7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBhY2NlcHRzb2NrLT5zdGF0ZSAgPSBXU19GRF9DT05ORUNURUR8V1NfRkRfUkVBRHxXU19GRF9XUklURTsKICAgIGFjY2VwdHNvY2stPm1hc2sgICA9IHNvY2stPm1hc2s7CiAgICBhY2NlcHRzb2NrLT5obWFzayAgPSAwOwogICAgYWNjZXB0c29jay0+cG1hc2sgID0gMDsKICAgIGFjY2VwdHNvY2stPmV2ZW50ICA9IE5VTEw7CiAgICBpZiAoc29jay0+ZXZlbnQgJiYgIShzb2NrLT5tYXNrICYgV1NfRkRfU0VSVkVWRU5UKSkKICAgICAgICBhY2NlcHRzb2NrLT5ldmVudCA9IChzdHJ1Y3QgZXZlbnQgKilncmFiX29iamVjdCggc29jay0+ZXZlbnQgKTsKCiAgICBzb2NrX3Jlc2VsZWN0KCBhY2NlcHRzb2NrICk7CiAgICBjbGVhcl9lcnJvcigpOwogICAgc29jay0+cG1hc2sgJj0gfkZEX0FDQ0VQVDsKICAgIHNvY2stPmhtYXNrICY9IH5GRF9BQ0NFUFQ7CiAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgcmV0dXJuICZhY2NlcHRzb2NrLT5vYmo7Cn0KCi8qIHNldCB0aGUgbGFzdCBlcnJvciBkZXBlbmRpbmcgb24gZXJybm8gKi8Kc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApCnsKICAgIHN3aXRjaCAoZXJyKQogICAgewogICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAgICAgIHJldHVybiBXU0FFSU5UUjsgYnJlYWs7CiAgICAgICAgY2FzZSBFQkFERjogICAgICAgICAgICAgcmV0dXJuIFdTQUVCQURGOyBicmVhazsKICAgICAgICBjYXNlIEVQRVJNOgogICAgICAgIGNhc2UgRUFDQ0VTOiAgICAgICAgICAgIHJldHVybiBXU0FFQUNDRVM7IGJyZWFrOwogICAgICAgIGNhc2UgRUZBVUxUOiAgICAgICAgICAgIHJldHVybiBXU0FFRkFVTFQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUlOVkFMOiAgICAgICAgICAgIHJldHVybiBXU0FFSU5WQUw7IGJyZWFrOwogICAgICAgIGNhc2UgRU1GSUxFOiAgICAgICAgICAgIHJldHVybiBXU0FFTUZJTEU7IGJyZWFrOwogICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAgICAgIHJldHVybiBXU0FFV09VTERCTE9DSzsgYnJlYWs7CiAgICAgICAgY2FzZSBFSU5QUk9HUkVTUzogICAgICAgcmV0dXJuIFdTQUVJTlBST0dSRVNTOyBicmVhazsKICAgICAgICBjYXNlIEVBTFJFQURZOiAgICAgICAgICByZXR1cm4gV1NBRUFMUkVBRFk7IGJyZWFrOwogICAgICAgIGNhc2UgRU5PVFNPQ0s6ICAgICAgICAgIHJldHVybiBXU0FFTk9UU09DSzsgYnJlYWs7CiAgICAgICAgY2FzZSBFREVTVEFERFJSRVE6ICAgICAgcmV0dXJuIFdTQUVERVNUQUREUlJFUTsgYnJlYWs7CiAgICAgICAgY2FzZSBFTVNHU0laRTogICAgICAgICAgcmV0dXJuIFdTQUVNU0dTSVpFOyBicmVhazsKICAgICAgICBjYXNlIEVQUk9UT1RZUEU6ICAgICAgICByZXR1cm4gV1NBRVBST1RPVFlQRTsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9QUk9UT09QVDogICAgICAgcmV0dXJuIFdTQUVOT1BST1RPT1BUOyBicmVhazsKICAgICAgICBjYXNlIEVQUk9UT05PU1VQUE9SVDogICByZXR1cm4gV1NBRVBST1RPTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVTT0NLVE5PU1VQUE9SVDogICByZXR1cm4gV1NBRVNPQ0tUTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVPUE5PVFNVUFA6ICAgICAgICByZXR1cm4gV1NBRU9QTk9UU1VQUDsgYnJlYWs7CiAgICAgICAgY2FzZSBFUEZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVQRk5PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVBRk5PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUREUklOVVNFOiAgICAgICAgcmV0dXJuIFdTQUVBRERSSU5VU0U7IGJyZWFrOwogICAgICAgIGNhc2UgRUFERFJOT1RBVkFJTDogICAgIHJldHVybiBXU0FFQUREUk5PVEFWQUlMOyBicmVhazsKICAgICAgICBjYXNlIEVORVRET1dOOiAgICAgICAgICByZXR1cm4gV1NBRU5FVERPV047IGJyZWFrOwogICAgICAgIGNhc2UgRU5FVFVOUkVBQ0g6ICAgICAgIHJldHVybiBXU0FFTkVUVU5SRUFDSDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkVUUkVTRVQ6ICAgICAgICAgcmV0dXJuIFdTQUVORVRSRVNFVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQ09OTkFCT1JURUQ6ICAgICAgcmV0dXJuIFdTQUVDT05OQUJPUlRFRDsgYnJlYWs7CiAgICAgICAgY2FzZSBFUElQRToKICAgICAgICBjYXNlIEVDT05OUkVTRVQ6ICAgICAgICByZXR1cm4gV1NBRUNPTk5SRVNFVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9CVUZTOiAgICAgICAgICAgcmV0dXJuIFdTQUVOT0JVRlM7IGJyZWFrOwogICAgICAgIGNhc2UgRUlTQ09OTjogICAgICAgICAgIHJldHVybiBXU0FFSVNDT05OOyBicmVhazsKICAgICAgICBjYXNlIEVOT1RDT05OOiAgICAgICAgICByZXR1cm4gV1NBRU5PVENPTk47IGJyZWFrOwogICAgICAgIGNhc2UgRVNIVVRET1dOOiAgICAgICAgIHJldHVybiBXU0FFU0hVVERPV047IGJyZWFrOwogICAgICAgIGNhc2UgRVRPT01BTllSRUZTOiAgICAgIHJldHVybiBXU0FFVE9PTUFOWVJFRlM7IGJyZWFrOwogICAgICAgIGNhc2UgRVRJTUVET1VUOiAgICAgICAgIHJldHVybiBXU0FFVElNRURPVVQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUNPTk5SRUZVU0VEOiAgICAgIHJldHVybiBXU0FFQ09OTlJFRlVTRUQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUxPT1A6ICAgICAgICAgICAgIHJldHVybiBXU0FFTE9PUDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkFNRVRPT0xPTkc6ICAgICAgcmV0dXJuIFdTQUVOQU1FVE9PTE9ORzsgYnJlYWs7CiAgICAgICAgY2FzZSBFSE9TVERPV046ICAgICAgICAgcmV0dXJuIFdTQUVIT1NURE9XTjsgYnJlYWs7CiAgICAgICAgY2FzZSBFSE9TVFVOUkVBQ0g6ICAgICAgcmV0dXJuIFdTQUVIT1NUVU5SRUFDSDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9URU1QVFk6ICAgICAgICAgcmV0dXJuIFdTQUVOT1RFTVBUWTsgYnJlYWs7CiNpZmRlZiBFUFJPQ0xJTQogICAgICAgIGNhc2UgRVBST0NMSU06ICAgICAgICAgIHJldHVybiBXU0FFUFJPQ0xJTTsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVVTRVJTCiAgICAgICAgY2FzZSBFVVNFUlM6ICAgICAgICAgICAgcmV0dXJuIFdTQUVVU0VSUzsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRURRVU9UCiAgICAgICAgY2FzZSBFRFFVT1Q6ICAgICAgICAgICAgcmV0dXJuIFdTQUVEUVVPVDsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVNUQUxFCiAgICAgICAgY2FzZSBFU1RBTEU6ICAgICAgICAgICAgcmV0dXJuIFdTQUVTVEFMRTsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVJFTU9URQogICAgICAgIGNhc2UgRVJFTU9URTogICAgICAgICAgIHJldHVybiBXU0FFUkVNT1RFOyBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OiBlcnJubz1lcnI7IHBlcnJvcigic29ja19zZXRfZXJyb3IiKTsgcmV0dXJuIEVSUk9SX1VOS05PV047IGJyZWFrOwogICAgfQp9CgovKiBzZXQgdGhlIGxhc3QgZXJyb3IgZGVwZW5kaW5nIG9uIGVycm5vICovCnN0YXRpYyB2b2lkIHNvY2tfc2V0X2Vycm9yKHZvaWQpCnsKICAgIHNldF9lcnJvciggc29ja19nZXRfZXJyb3IoIGVycm5vICkgKTsKfQoKLyogY3JlYXRlIGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihjcmVhdGVfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmo7CiAgICBpbnQgcyA9IC0xOwoKICAgIGlmICgob2JqID0gY3JlYXRlX3NvY2tldCggcmVxLT5mYW1pbHksIHJlcS0+dHlwZSwgcmVxLT5wcm90b2NvbCApKSAhPSBOVUxMKQogICAgewogICAgICAgIHMgPSBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsIG9iaiwgcmVxLT5hY2Nlc3MsIHJlcS0+aW5oZXJpdCApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBvYmogKTsKICAgIH0KICAgIHJlcS0+aGFuZGxlID0gczsKfQoKLyogYWNjZXB0IGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihhY2NlcHRfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmo7CiAgICBpbnQgcyA9IC0xOwoKICAgIGlmICgob2JqID0gYWNjZXB0X3NvY2tldCggcmVxLT5saGFuZGxlICkpICE9IE5VTEwpCiAgICB7CiAgICAgICAgcyA9IGFsbG9jX2hhbmRsZSggY3VycmVudC0+cHJvY2Vzcywgb2JqLCByZXEtPmFjY2VzcywgcmVxLT5pbmhlcml0ICk7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIG9iaiApOwogICAgfQogICAgcmVxLT5oYW5kbGUgPSBzOwp9CgovKiBzZXQgc29ja2V0IGV2ZW50IHBhcmFtZXRlcnMgKi8KREVDTF9IQU5ETEVSKHNldF9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgc3RydWN0IGV2ZW50ICpvZXZlbnQ7CiAgICB1bnNpZ25lZCBpbnQgb21hc2s7CgogICAgc29jaz0oc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKGN1cnJlbnQtPnByb2Nlc3MscmVxLT5oYW5kbGUsR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzKTsKICAgIGlmICghc29jaykKCXJldHVybjsKICAgIG9ldmVudCA9IHNvY2stPmV2ZW50OwogICAgb21hc2sgID0gc29jay0+bWFzazsKICAgIHNvY2stPm1hc2sgICAgPSByZXEtPm1hc2s7CiAgICBzb2NrLT5ldmVudCAgID0gZ2V0X2V2ZW50X29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5ldmVudCwgRVZFTlRfTU9ESUZZX1NUQVRFICk7CiAgICBpZiAoZGVidWdfbGV2ZWwgJiYgc29jay0+ZXZlbnQpIGZwcmludGYoc3RkZXJyLCAiZXZlbnQgcHRyOiAlcFxuIiwgc29jay0+ZXZlbnQpOwogICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgaWYgKHNvY2stPm1hc2spCiAgICAgICAgc29jay0+c3RhdGUgfD0gV1NfRkRfTk9OQkxPQ0tJTkc7CiAgICBpZiAob2V2ZW50KQogICAgewogICAgCWlmICgob2V2ZW50ICE9IHNvY2stPmV2ZW50KSAmJiAob21hc2sgJiBXU19GRF9TRVJWRVZFTlQpKQogICAgICAgICAgICAvKiBpZiB0aGUgc2VydmljZSB0aHJlYWQgd2FzIHdhaXRpbmcgZm9yIHRoZSBvbGQgZXZlbnQgb2JqZWN0LAogICAgICAgICAgICAgKiB3ZSBzaG91bGQgbm93IHNpZ25hbCBpdCwgdG8gbGV0IHRoZSBzZXJ2aWNlIHRocmVhZAogICAgICAgICAgICAgKiBvYmplY3QgZGV0ZWN0IHRoYXQgaXQgaXMgbm93IG9ycGhhbmVkLi4uICovCiAgICAgICAgICAgIHNldF9ldmVudCggb2V2ZW50ICk7CiAgICAgICAgLyogd2UncmUgdGhyb3VnaCB3aXRoIGl0ICovCiAgICAgICAgcmVsZWFzZV9vYmplY3QoIG9ldmVudCApOwogICAgfQogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKLyogZ2V0IHNvY2tldCBldmVudCBwYXJhbWV0ZXJzICovCkRFQ0xfSEFORExFUihnZXRfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooY3VycmVudC0+cHJvY2VzcyxyZXEtPmhhbmRsZSxHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQogICAgewoJcmVxLT5tYXNrICA9IDA7CglyZXEtPnBtYXNrID0gMDsKCXJlcS0+c3RhdGUgPSAwOwoJc2V0X2Vycm9yKFdTQUVOT1RTT0NLKTsKCXJldHVybjsKICAgIH0KICAgIHJlcS0+bWFzayAgICA9IHNvY2stPm1hc2s7CiAgICByZXEtPnBtYXNrICAgPSBzb2NrLT5wbWFzazsKICAgIHJlcS0+c3RhdGUgICA9IHNvY2stPnN0YXRlOwogICAgbWVtY3B5KHJlcS0+ZXJyb3JzLCBzb2NrLT5lcnJvcnMsIHNpemVvZihzb2NrLT5lcnJvcnMpKTsKICAgIGNsZWFyX2Vycm9yKCk7CiAgICBpZiAocmVxLT5zZXJ2aWNlKQogICAgewogICAgICAgIGlmIChyZXEtPnNfZXZlbnQpCiAgICAgICAgewogICAgICAgICAgICBzdHJ1Y3QgZXZlbnQgKnNldmVudCA9IGdldF9ldmVudF9vYmooY3VycmVudC0+cHJvY2VzcywgcmVxLT5zX2V2ZW50LCAwKTsKICAgICAgICAgICAgaWYgKHNldmVudCA9PSBzb2NrLT5ldmVudCkKICAgICAgICAgICAgICAgIHJlcS0+c19ldmVudCA9IDA7CiAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzZXZlbnQgKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFyZXEtPnNfZXZlbnQpCiAgICAgICAgewogICAgICAgICAgICBpZiAocmVxLT5jX2V2ZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzdHJ1Y3QgZXZlbnQgKmNldmVudCA9IGdldF9ldmVudF9vYmooY3VycmVudC0+cHJvY2VzcywgcmVxLT5jX2V2ZW50LCBFVkVOVF9NT0RJRllfU1RBVEUpOwogICAgICAgICAgICAgICAgcmVzZXRfZXZlbnQoIGNldmVudCApOwogICAgICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIGNldmVudCApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNvY2stPnBtYXNrID0gMDsKICAgICAgICAgICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgICAgIH0KICAgICAgICBlbHNlIHNldF9lcnJvcihXU0FFSU5WQUwpOwogICAgfQogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKLyogcmUtZW5hYmxlIHBlbmRpbmcgc29ja2V0IGV2ZW50cyAqLwpERUNMX0hBTkRMRVIoZW5hYmxlX3NvY2tldF9ldmVudCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CgogICAgc29jaz0oc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKGN1cnJlbnQtPnByb2Nlc3MscmVxLT5oYW5kbGUsR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzKTsKICAgIGlmICghc29jaykKICAgIAlyZXR1cm47CiAgICBzb2NrLT5wbWFzayAmPSB+cmVxLT5tYXNrOyAvKiBpcyB0aGlzIHNhZmU/ICovCiAgICBzb2NrLT5obWFzayAmPSB+cmVxLT5tYXNrOwogICAgc29jay0+c3RhdGUgfD0gcmVxLT5zc3RhdGU7CiAgICBzb2NrLT5zdGF0ZSAmPSB+cmVxLT5jc3RhdGU7CiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CgogICAgLyogc2VydmljZSB0cmlnZ2VyICovCiAgICBpZiAocmVxLT5tYXNrICYgV1NfRkRfU0VSVkVWRU5UKQogICAgewogICAgICAgIHNvY2stPnBtYXNrIHw9IFdTX0ZEX1NFUlZFVkVOVDsKICAgICAgICBpZiAoc29jay0+ZXZlbnQpIHsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmKHN0ZGVyciwgInNpZ25hbGxpbmcgc2VydmljZSBldmVudCBwdHIgJXBcbiIsIHNvY2stPmV2ZW50KTsKICAgICAgICAgICAgc2V0X2V2ZW50KHNvY2stPmV2ZW50KTsKICAgICAgICB9CiAgICB9CgogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQo=