LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIEZJWE1FOiB3ZSB1c2UgcmVhZHx3cml0ZSBhY2Nlc3MgaW4gYWxsIGNhc2VzLiBTaG91bGRuJ3Qgd2UgZGVwZW5kIHRoYXQKICogb24gdGhlIGFjY2VzcyBvZiB0aGUgY3VycmVudCBoYW5kbGU/CiAqLwoKI2luY2x1ZGUgImNvbmZpZy5oIgoKI2luY2x1ZGUgPGFzc2VydC5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2lmZGVmIEhBVkVfU1lTX0VSUk5PX0gKIyBpbmNsdWRlIDxzeXMvZXJybm8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2lmZGVmIEhBVkVfU1lTX0ZJTElPX0gKIyBpbmNsdWRlIDxzeXMvZmlsaW8uaD4KI2VuZGlmCiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KCiNpbmNsdWRlICJ3aW5lcnJvci5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAid2luc29jazIuaCIKI2luY2x1ZGUgInByb2Nlc3MuaCIKI2luY2x1ZGUgImhhbmRsZS5oIgojaW5jbHVkZSAidGhyZWFkLmgiCiNpbmNsdWRlICJyZXF1ZXN0LmgiCgpzdHJ1Y3Qgc29jawp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICAgICAgIG9iajsgICAgICAgICAvKiBvYmplY3QgaGVhZGVyICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHN0YXRlOyAgICAgICAvKiBzdGF0dXMgYml0cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBtYXNrOyAgICAgICAgLyogZXZlbnQgbWFzayAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBobWFzazsgICAgICAgLyogaGVsZCAoYmxvY2tlZCkgZXZlbnRzICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHBtYXNrOyAgICAgICAvKiBwZW5kaW5nIGV2ZW50cyAqLwogICAgc3RydWN0IGV2ZW50ICAgICAgICpldmVudDsgICAgICAgLyogZXZlbnQgb2JqZWN0ICovCiAgICBpbnQgICAgICAgICAgICAgICAgIGVycm9yc1tGRF9NQVhfRVZFTlRTXTsgLyogZXZlbnQgZXJyb3JzICovCn07CgpzdGF0aWMgdm9pZCBzb2NrX2R1bXAoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKTsKc3RhdGljIGludCBzb2NrX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApOwpzdGF0aWMgaW50IHNvY2tfZ2V0X3BvbGxfZXZlbnRzKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKc3RhdGljIHZvaWQgc29ja19wb2xsX2V2ZW50KCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCBldmVudCApOwpzdGF0aWMgaW50IHNvY2tfZ2V0X2ZkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKc3RhdGljIHZvaWQgc29ja19kZXN0cm95KCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApOwpzdGF0aWMgdm9pZCBzb2NrX3NldF9lcnJvcih2b2lkKTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2JqZWN0X29wcyBzb2NrX29wcyA9CnsKICAgIHNpemVvZihzdHJ1Y3Qgc29jayksICAgICAgICAgIC8qIHNpemUgKi8KICAgIHNvY2tfZHVtcCwgICAgICAgICAgICAgICAgICAgIC8qIGR1bXAgKi8KICAgIGFkZF9xdWV1ZSwgICAgICAgICAgICAgICAgICAgIC8qIGFkZF9xdWV1ZSAqLwogICAgcmVtb3ZlX3F1ZXVlLCAgICAgICAgICAgICAgICAgLyogcmVtb3ZlX3F1ZXVlICovCiAgICBzb2NrX3NpZ25hbGVkLCAgICAgICAgICAgICAgICAvKiBzaWduYWxlZCAqLwogICAgbm9fc2F0aXNmaWVkLCAgICAgICAgICAgICAgICAgLyogc2F0aXNmaWVkICovCiAgICBzb2NrX2dldF9wb2xsX2V2ZW50cywgICAgICAgICAvKiBnZXRfcG9sbF9ldmVudHMgKi8KICAgIHNvY2tfcG9sbF9ldmVudCwgICAgICAgICAgICAgIC8qIHBvbGxfZXZlbnQgKi8KICAgIHNvY2tfZ2V0X2ZkLCAgICAgICAgICAgICAgICAgIC8qIGdldF9mZCAqLwogICAgbm9fZmx1c2gsICAgICAgICAgICAgICAgICAgICAgLyogZmx1c2ggKi8KICAgIG5vX2dldF9maWxlX2luZm8sICAgICAgICAgICAgIC8qIGdldF9maWxlX2luZm8gKi8KICAgIHNvY2tfZGVzdHJveSAgICAgICAgICAgICAgICAgIC8qIGRlc3Ryb3kgKi8KfTsKCnN0YXRpYyB2b2lkIHNvY2tfcmVzZWxlY3QoIHN0cnVjdCBzb2NrICpzb2NrICkKewogICAgaW50IGV2ID0gc29ja19nZXRfcG9sbF9ldmVudHMoICZzb2NrLT5vYmogKTsKICAgIHN0cnVjdCBwb2xsZmQgcGZkOwoKICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICBmcHJpbnRmKHN0ZGVyciwic29ja19yZXNlbGVjdCglZCk6IG5ldyBtYXNrICV4XG4iLCBzb2NrLT5vYmouZmQsIGV2KTsKCiAgICBpZiAoc29jay0+b2JqLnNlbGVjdCA9PSAtMSkgewogICAgICAgIC8qIHByZXZpb3VzbHkgdW5jb25uZWN0ZWQgc29ja2V0LCBpcyB0aGlzIHJlc2VsZWN0IHN1cHBvc2VkIHRvIGNvbm5lY3QgaXQ/ICovCiAgICAgICAgaWYgKCFzb2NrLT5zdGF0ZSkgcmV0dXJuOwogICAgICAgIC8qIG9rLCBpdCBpcywgYXR0YWNoIGl0IHRvIHRoZSB3aW5lc2VydmVyJ3MgbWFpbiBwb2xsIGxvb3AgKi8KICAgICAgICBhZGRfc2VsZWN0X3VzZXIoICZzb2NrLT5vYmogKTsKICAgIH0KICAgIC8qIHVwZGF0ZSBjb25kaXRpb24gbWFzayAqLwogICAgc2V0X3NlbGVjdF9ldmVudHMoICZzb2NrLT5vYmosIGV2ICk7CgogICAgLyogY2hlY2sgd2hldGhlciBjb25kaXRpb24gaXMgc2F0aXNmaWVkIGFscmVhZHkgKi8KICAgIHBmZC5mZCA9IHNvY2stPm9iai5mZDsKICAgIHBmZC5ldmVudHMgPSBldjsKICAgIHBmZC5yZXZlbnRzID0gMDsKICAgIHBvbGwoICZwZmQsIDEsIDAgKTsKICAgIGlmIChwZmQucmV2ZW50cykKICAgICAgICBzb2NrX3BvbGxfZXZlbnQoICZzb2NrLT5vYmosIHBmZC5yZXZlbnRzKTsKfQoKaW5saW5lIHN0YXRpYyBpbnQgc29ja19lcnJvcihpbnQgcykKewogICAgdW5zaWduZWQgaW50IG9wdHZhbCA9IDAsIG9wdGxlbjsKICAgIAogICAgb3B0bGVuID0gc2l6ZW9mKG9wdHZhbCk7CiAgICBnZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAodm9pZCAqKSAmb3B0dmFsLCAmb3B0bGVuKTsKICAgIHJldHVybiBvcHR2YWwgPyBzb2NrX2dldF9lcnJvcihvcHR2YWwpIDogMDsKfQoKc3RhdGljIHZvaWQgc29ja19wb2xsX2V2ZW50KCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCBldmVudCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgdW5zaWduZWQgaW50IGVtYXNrOwogICAgYXNzZXJ0KCBzb2NrLT5vYmoub3BzID09ICZzb2NrX29wcyApOwogICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIHNlbGVjdCBldmVudDogJXhcbiIsIHNvY2stPm9iai5mZCwgZXZlbnQpOwogICAgaWYgKHNvY2stPnN0YXRlICYgV1NfRkRfQ09OTkVDVCkKICAgIHsKICAgICAgICAvKiBjb25uZWN0aW5nICovCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTE9VVCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIGdvdCBjb25uZWN0ZWQgKi8KICAgICAgICAgICAgc29jay0+c3RhdGUgfD0gV1NfRkRfQ09OTkVDVEVEfFdTX0ZEX1JFQUR8V1NfRkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5XU19GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgY29ubmVjdGlvbiBzdWNjZXNzXG4iLCBzb2NrLT5vYmouZmQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChldmVudCAmIChQT0xMRVJSfFBPTExIVVApKQogICAgICAgIHsKICAgICAgICAgICAgLyogd2UgZGlkbid0IGdldCBjb25uZWN0ZWQ/ICovCiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5XU19GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gc29ja19lcnJvciggc29jay0+b2JqLmZkICk7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGNvbm5lY3Rpb24gZmFpbHVyZVxuIiwgc29jay0+b2JqLmZkKTsKICAgICAgICB9CiAgICB9IGVsc2UKICAgIGlmIChzb2NrLT5zdGF0ZSAmIFdTX0ZEX0xJU1RFTklORykKICAgIHsKICAgICAgICAvKiBsaXN0ZW5pbmcgKi8KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMSU4pCiAgICAgICAgewogICAgICAgICAgICAvKiBpbmNvbWluZyBjb25uZWN0aW9uICovCiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0FDQ0VQVF9CSVRdID0gMDsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChldmVudCAmIChQT0xMRVJSfFBPTExIVVApKQogICAgICAgIHsKICAgICAgICAgICAgLyogZmFpbGVkIGluY29taW5nIGNvbm5lY3Rpb24/ICovCiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0FDQ0VQVF9CSVRdID0gc29ja19lcnJvciggc29jay0+b2JqLmZkICk7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX0FDQ0VQVDsKICAgICAgICB9CiAgICB9IGVsc2UKICAgIHsKICAgICAgICAvKiBub3JtYWwgZGF0YSBmbG93ICovCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTElOKQogICAgICAgIHsKICAgICAgICAgICAgLyogaW5jb21pbmcgZGF0YSAqLwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9SRUFEOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9SRUFEOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfUkVBRF9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgaXMgcmVhZGFibGVcbiIsIHNvY2stPm9iai5mZCApOwogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMT1VUKQogICAgICAgIHsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX1dSSVRFOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfV1JJVEVfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGlzIHdyaXRhYmxlXG4iLCBzb2NrLT5vYmouZmQpOwogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMUFJJKQogICAgICAgIHsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfT09COwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9PT0I7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9PT0JfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGdvdCBPT0IgZGF0YVxuIiwgc29jay0+b2JqLmZkKTsKICAgICAgICB9CiAgICAgICAgaWYgKCgoZXZlbnQgJiBQT0xMRVJSKSB8fCAoKGV2ZW50ICYgKFBPTExJTnxQT0xMSFVQKSkgPT0gUE9MTEhVUCkpCiAgICAgICAgICAgICYmIChzb2NrLT5zdGF0ZSAmIChXU19GRF9SRUFEfFdTX0ZEX1dSSVRFKSkpIHsKICAgICAgICAgICAgLyogc29ja2V0IGNsb3NpbmcgKi8KICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0NMT1NFX0JJVF0gPSBzb2NrX2Vycm9yKCBzb2NrLT5vYmouZmQgKTsKICAgICAgICAgICAgc29jay0+c3RhdGUgJj0gfihXU19GRF9DT05ORUNURUR8V1NfRkRfUkVBRHxXU19GRF9XUklURSk7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NMT1NFOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlZCBhYm9ydGVkIGJ5IGVycm9yICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBzb2NrLT5vYmouZmQsIHNvY2stPmVycm9yc1tGRF9DTE9TRV9CSVRdKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGV2ZW50ICYgKFBPTExFUlJ8UE9MTEhVUCkpCiAgICAgICAgc2V0X3NlbGVjdF9ldmVudHMoICZzb2NrLT5vYmosIC0xICk7CiAgICBlbHNlCiAgICAgICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgLyogd2FrZSB1cCBhbnlvbmUgd2FpdGluZyBmb3Igd2hhdGV2ZXIganVzdCBoYXBwZW5lZCAqLwogICAgZW1hc2sgPSBzb2NrLT5wbWFzayAmIHNvY2stPm1hc2s7CiAgICBpZiAoZGVidWdfbGV2ZWwgJiYgZW1hc2spCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgcGVuZGluZyBldmVudHM6ICV4XG4iLCBzb2NrLT5vYmouZmQsIGVtYXNrKTsKICAgIGlmIChlbWFzayAmJiBzb2NrLT5ldmVudCkgewogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50ZihzdGRlcnIsICJzaWduYWxsaW5nIGV2ZW50IHB0ciAlcFxuIiwgc29jay0+ZXZlbnQpOwogICAgICAgIHNldF9ldmVudChzb2NrLT5ldmVudCk7CiAgICB9CgogICAgLyogaWYgYW55b25lIGlzIHN0dXBpZCBlbm91Z2ggdG8gd2FpdCBvbiB0aGUgc29ja2V0IG9iamVjdCBpdHNlbGYsCiAgICAgKiBtYXliZSB3ZSBzaG91bGQgd2FrZSB0aGVtIHVwIHRvbywganVzdCBpbiBjYXNlPyAqLwogICAgd2FrZV91cCggJnNvY2stPm9iaiwgMCApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2R1bXAoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICBwcmludGYoICJTb2NrZXQgZmQ9JWQsIHN0YXRlPSV4LCBtYXNrPSV4LCBwZW5kaW5nPSV4LCBoZWxkPSV4XG4iLAogICAgICAgICAgICBzb2NrLT5vYmouZmQsIHNvY2stPnN0YXRlLAogICAgICAgICAgICBzb2NrLT5tYXNrLCBzb2NrLT5wbWFzaywgc29jay0+aG1hc2sgKTsKfQoKc3RhdGljIGludCBzb2NrX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICByZXR1cm4gY2hlY2tfc2VsZWN0X2V2ZW50cyggc29jay0+b2JqLmZkLCBzb2NrX2dldF9wb2xsX2V2ZW50cyggJnNvY2stPm9iaiApICk7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfcG9sbF9ldmVudHMoIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgdW5zaWduZWQgaW50IG1hc2sgPSBzb2NrLT5tYXNrICYgc29jay0+c3RhdGUgJiB+c29jay0+aG1hc2s7CiAgICBpbnQgZXYgPSAwOwoKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgaWYgKHNvY2stPnN0YXRlICYgV1NfRkRfQ09OTkVDVCkKICAgICAgICAvKiBjb25uZWN0aW5nLCB3YWl0IGZvciB3cml0YWJsZSAqLwogICAgICAgIHJldHVybiBQT0xMT1VUOwogICAgaWYgKHNvY2stPnN0YXRlICYgV1NfRkRfTElTVEVOSU5HKQogICAgICAgIC8qIGxpc3RlbmluZywgd2FpdCBmb3IgcmVhZGFibGUgKi8KICAgICAgICByZXR1cm4gKHNvY2stPmhtYXNrICYgRkRfQUNDRVBUKSA/IDAgOiBQT0xMSU47CgogICAgaWYgKG1hc2sgJiBGRF9SRUFEKSAgZXYgfD0gUE9MTElOIHwgUE9MTFBSSTsKICAgIGlmIChtYXNrICYgRkRfV1JJVEUpIGV2IHw9IFBPTExPVVQ7CiAgICByZXR1cm4gZXY7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfZmQoIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKICAgIHJldHVybiBzb2NrLT5vYmouZmQ7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfZGVzdHJveSggc3RydWN0IG9iamVjdCAqb2JqICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIC8qIEZJWE1FOiBzcGVjaWFsIHNvY2tldCBzaHV0ZG93biBzdHVmZj8gKi8KICAgIGlmIChzb2NrLT5ldmVudCkKICAgIHsKICAgICAgICAvKiBpZiB0aGUgc2VydmljZSB0aHJlYWQgd2FzIHdhaXRpbmcgZm9yIHRoZSBldmVudCBvYmplY3QsCiAgICAgICAgICogd2Ugc2hvdWxkIG5vdyBzaWduYWwgaXQsIHRvIGxldCB0aGUgc2VydmljZSB0aHJlYWQKICAgICAgICAgKiBvYmplY3QgZGV0ZWN0IHRoYXQgaXQgaXMgbm93IG9ycGhhbmVkLi4uICovCiAgICAgICAgaWYgKHNvY2stPm1hc2sgJiBXU19GRF9TRVJWRVZFTlQpCiAgICAgICAgICAgIHNldF9ldmVudCggc29jay0+ZXZlbnQgKTsKICAgICAgICAvKiB3ZSdyZSB0aHJvdWdoIHdpdGggaXQgKi8KICAgICAgICByZWxlYXNlX29iamVjdCggc29jay0+ZXZlbnQgKTsKICAgIH0KfQoKLyogY3JlYXRlIGEgbmV3IGFuZCB1bmNvbm5lY3RlZCBzb2NrZXQgKi8Kc3RhdGljIHN0cnVjdCBvYmplY3QgKmNyZWF0ZV9zb2NrZXQoIGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludCBzb2NrZmQ7CgogICAgc29ja2ZkID0gc29ja2V0KCBmYW1pbHksIHR5cGUsIHByb3RvY29sICk7CiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsInNvY2tldCglZCwlZCwlZCk9JWRcbiIsZmFtaWx5LHR5cGUscHJvdG9jb2wsc29ja2ZkKTsKICAgIGlmIChzb2NrZmQgPT0gLTEpIHsKICAgICAgICBzb2NrX3NldF9lcnJvcigpOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgZmNudGwoc29ja2ZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsgLyogbWFrZSBzb2NrZXQgbm9uYmxvY2tpbmcgKi8KICAgIGlmICghKHNvY2sgPSBhbGxvY19vYmplY3QoICZzb2NrX29wcywgLTEgKSkpIHJldHVybiBOVUxMOwogICAgc29jay0+b2JqLmZkID0gc29ja2ZkOwogICAgc29jay0+c3RhdGUgPSAodHlwZSAhPSBTT0NLX1NUUkVBTSkgPyAoV1NfRkRfUkVBRHxXU19GRF9XUklURSkgOiAwOwogICAgc29jay0+bWFzayAgPSAwOwogICAgc29jay0+aG1hc2sgPSAwOwogICAgc29jay0+cG1hc2sgPSAwOwogICAgc29jay0+ZXZlbnQgPSBOVUxMOwogICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgY2xlYXJfZXJyb3IoKTsKICAgIHJldHVybiAmc29jay0+b2JqOwp9CgovKiBhY2NlcHQgYSBzb2NrZXQgKGNyZWF0ZXMgYSBuZXcgZmQpICovCnN0YXRpYyBzdHJ1Y3Qgb2JqZWN0ICphY2NlcHRfc29ja2V0KCBoYW5kbGVfdCBoYW5kbGUgKQp7CiAgICBzdHJ1Y3Qgc29jayAqYWNjZXB0c29jazsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgaW50CWFjY2VwdGZkOwogICAgc3RydWN0IHNvY2thZGRyCXNhZGRyOwogICAgaW50CQkJc2xlbjsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooY3VycmVudC0+cHJvY2VzcyxoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsJnNvY2tfb3BzKTsKICAgIGlmICghc29jaykKICAgIAlyZXR1cm4gTlVMTDsKICAgIC8qIFRyeSB0byBhY2NlcHQoMikuIFdlIGNhbid0IGJlIHNhZmUgdGhhdCB0aGlzIGFuIGFscmVhZHkgY29ubmVjdGVkIHNvY2tldCAKICAgICAqIG9yIHRoYXQgYWNjZXB0KCkgaXMgYWxsb3dlZCBvbiBpdC4gSW4gdGhvc2UgY2FzZXMgd2Ugd2lsbCBnZXQgLTEvZXJybm8KICAgICAqIHJldHVybi4KICAgICAqLwogICAgc2xlbiA9IHNpemVvZihzYWRkcik7CiAgICBhY2NlcHRmZCA9IGFjY2VwdChzb2NrLT5vYmouZmQsJnNhZGRyLCZzbGVuKTsKICAgIGlmIChhY2NlcHRmZD09LTEpIHsKICAgIAlzb2NrX3NldF9lcnJvcigpOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CglyZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmICghKGFjY2VwdHNvY2sgPSBhbGxvY19vYmplY3QoICZzb2NrX29wcywgLTEgKSkpCiAgICB7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICAvKiBuZXdseSBjcmVhdGVkIHNvY2tldCBnZXRzIHRoZSBzYW1lIHByb3BlcnRpZXMgb2YgdGhlIGxpc3RlbmluZyBzb2NrZXQgKi8KICAgIGZjbnRsKGFjY2VwdGZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsgLyogbWFrZSBzb2NrZXQgbm9uYmxvY2tpbmcgKi8KICAgIGFjY2VwdHNvY2stPm9iai5mZCA9IGFjY2VwdGZkOwogICAgYWNjZXB0c29jay0+c3RhdGUgID0gV1NfRkRfQ09OTkVDVEVEfFdTX0ZEX1JFQUR8V1NfRkRfV1JJVEU7CiAgICBpZiAoc29jay0+c3RhdGUgJiBXU19GRF9OT05CTE9DS0lORykKICAgICAgICBhY2NlcHRzb2NrLT5zdGF0ZSB8PSBXU19GRF9OT05CTE9DS0lORzsgCiAgICBhY2NlcHRzb2NrLT5tYXNrICAgPSBzb2NrLT5tYXNrOwogICAgYWNjZXB0c29jay0+aG1hc2sgID0gMDsKICAgIGFjY2VwdHNvY2stPnBtYXNrICA9IDA7CiAgICBhY2NlcHRzb2NrLT5ldmVudCAgPSBOVUxMOwogICAgaWYgKHNvY2stPmV2ZW50ICYmICEoc29jay0+bWFzayAmIFdTX0ZEX1NFUlZFVkVOVCkpCiAgICAgICAgYWNjZXB0c29jay0+ZXZlbnQgPSAoc3RydWN0IGV2ZW50ICopZ3JhYl9vYmplY3QoIHNvY2stPmV2ZW50ICk7CgogICAgc29ja19yZXNlbGVjdCggYWNjZXB0c29jayApOwogICAgY2xlYXJfZXJyb3IoKTsKICAgIHNvY2stPnBtYXNrICY9IH5GRF9BQ0NFUFQ7CiAgICBzb2NrLT5obWFzayAmPSB+RkRfQUNDRVBUOwogICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgIHJldHVybiAmYWNjZXB0c29jay0+b2JqOwp9CgovKiBzZXQgdGhlIGxhc3QgZXJyb3IgZGVwZW5kaW5nIG9uIGVycm5vICovCnN0YXRpYyBpbnQgc29ja19nZXRfZXJyb3IoIGludCBlcnIgKQp7CiAgICBzd2l0Y2ggKGVycikKICAgIHsKICAgICAgICBjYXNlIEVJTlRSOiAgICAgICAgICAgICByZXR1cm4gV1NBRUlOVFI7IGJyZWFrOwogICAgICAgIGNhc2UgRUJBREY6ICAgICAgICAgICAgIHJldHVybiBXU0FFQkFERjsgYnJlYWs7CiAgICAgICAgY2FzZSBFUEVSTToKICAgICAgICBjYXNlIEVBQ0NFUzogICAgICAgICAgICByZXR1cm4gV1NBRUFDQ0VTOyBicmVhazsKICAgICAgICBjYXNlIEVGQVVMVDogICAgICAgICAgICByZXR1cm4gV1NBRUZBVUxUOyBicmVhazsKICAgICAgICBjYXNlIEVJTlZBTDogICAgICAgICAgICByZXR1cm4gV1NBRUlOVkFMOyBicmVhazsKICAgICAgICBjYXNlIEVNRklMRTogICAgICAgICAgICByZXR1cm4gV1NBRU1GSUxFOyBicmVhazsKICAgICAgICBjYXNlIEVXT1VMREJMT0NLOiAgICAgICByZXR1cm4gV1NBRVdPVUxEQkxPQ0s7IGJyZWFrOwogICAgICAgIGNhc2UgRUlOUFJPR1JFU1M6ICAgICAgIHJldHVybiBXU0FFSU5QUk9HUkVTUzsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUxSRUFEWTogICAgICAgICAgcmV0dXJuIFdTQUVBTFJFQURZOyBicmVhazsKICAgICAgICBjYXNlIEVOT1RTT0NLOiAgICAgICAgICByZXR1cm4gV1NBRU5PVFNPQ0s7IGJyZWFrOwogICAgICAgIGNhc2UgRURFU1RBRERSUkVROiAgICAgIHJldHVybiBXU0FFREVTVEFERFJSRVE7IGJyZWFrOwogICAgICAgIGNhc2UgRU1TR1NJWkU6ICAgICAgICAgIHJldHVybiBXU0FFTVNHU0laRTsgYnJlYWs7CiAgICAgICAgY2FzZSBFUFJPVE9UWVBFOiAgICAgICAgcmV0dXJuIFdTQUVQUk9UT1RZUEU7IGJyZWFrOwogICAgICAgIGNhc2UgRU5PUFJPVE9PUFQ6ICAgICAgIHJldHVybiBXU0FFTk9QUk9UT09QVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFUFJPVE9OT1NVUFBPUlQ6ICAgcmV0dXJuIFdTQUVQUk9UT05PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFU09DS1ROT1NVUFBPUlQ6ICAgcmV0dXJuIFdTQUVTT0NLVE5PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFT1BOT1RTVVBQOiAgICAgICAgcmV0dXJuIFdTQUVPUE5PVFNVUFA7IGJyZWFrOwogICAgICAgIGNhc2UgRVBGTk9TVVBQT1JUOiAgICAgIHJldHVybiBXU0FFUEZOT1NVUFBPUlQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUFGTk9TVVBQT1JUOiAgICAgIHJldHVybiBXU0FFQUZOT1NVUFBPUlQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUFERFJJTlVTRTogICAgICAgIHJldHVybiBXU0FFQUREUklOVVNFOyBicmVhazsKICAgICAgICBjYXNlIEVBRERSTk9UQVZBSUw6ICAgICByZXR1cm4gV1NBRUFERFJOT1RBVkFJTDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkVURE9XTjogICAgICAgICAgcmV0dXJuIFdTQUVORVRET1dOOyBicmVhazsKICAgICAgICBjYXNlIEVORVRVTlJFQUNIOiAgICAgICByZXR1cm4gV1NBRU5FVFVOUkVBQ0g7IGJyZWFrOwogICAgICAgIGNhc2UgRU5FVFJFU0VUOiAgICAgICAgIHJldHVybiBXU0FFTkVUUkVTRVQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUNPTk5BQk9SVEVEOiAgICAgIHJldHVybiBXU0FFQ09OTkFCT1JURUQ7IGJyZWFrOwogICAgICAgIGNhc2UgRVBJUEU6CiAgICAgICAgY2FzZSBFQ09OTlJFU0VUOiAgICAgICAgcmV0dXJuIFdTQUVDT05OUkVTRVQ7IGJyZWFrOwogICAgICAgIGNhc2UgRU5PQlVGUzogICAgICAgICAgIHJldHVybiBXU0FFTk9CVUZTOyBicmVhazsKICAgICAgICBjYXNlIEVJU0NPTk46ICAgICAgICAgICByZXR1cm4gV1NBRUlTQ09OTjsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9UQ09OTjogICAgICAgICAgcmV0dXJuIFdTQUVOT1RDT05OOyBicmVhazsKICAgICAgICBjYXNlIEVTSFVURE9XTjogICAgICAgICByZXR1cm4gV1NBRVNIVVRET1dOOyBicmVhazsKICAgICAgICBjYXNlIEVUT09NQU5ZUkVGUzogICAgICByZXR1cm4gV1NBRVRPT01BTllSRUZTOyBicmVhazsKICAgICAgICBjYXNlIEVUSU1FRE9VVDogICAgICAgICByZXR1cm4gV1NBRVRJTUVET1VUOyBicmVhazsKICAgICAgICBjYXNlIEVDT05OUkVGVVNFRDogICAgICByZXR1cm4gV1NBRUNPTk5SRUZVU0VEOyBicmVhazsKICAgICAgICBjYXNlIEVMT09QOiAgICAgICAgICAgICByZXR1cm4gV1NBRUxPT1A7IGJyZWFrOwogICAgICAgIGNhc2UgRU5BTUVUT09MT05HOiAgICAgIHJldHVybiBXU0FFTkFNRVRPT0xPTkc7IGJyZWFrOwogICAgICAgIGNhc2UgRUhPU1RET1dOOiAgICAgICAgIHJldHVybiBXU0FFSE9TVERPV047IGJyZWFrOwogICAgICAgIGNhc2UgRUhPU1RVTlJFQUNIOiAgICAgIHJldHVybiBXU0FFSE9TVFVOUkVBQ0g7IGJyZWFrOwogICAgICAgIGNhc2UgRU5PVEVNUFRZOiAgICAgICAgIHJldHVybiBXU0FFTk9URU1QVFk7IGJyZWFrOwojaWZkZWYgRVBST0NMSU0KICAgICAgICBjYXNlIEVQUk9DTElNOiAgICAgICAgICByZXR1cm4gV1NBRVBST0NMSU07IGJyZWFrOwojZW5kaWYKI2lmZGVmIEVVU0VSUwogICAgICAgIGNhc2UgRVVTRVJTOiAgICAgICAgICAgIHJldHVybiBXU0FFVVNFUlM7IGJyZWFrOwojZW5kaWYKI2lmZGVmIEVEUVVPVAogICAgICAgIGNhc2UgRURRVU9UOiAgICAgICAgICAgIHJldHVybiBXU0FFRFFVT1Q7IGJyZWFrOwojZW5kaWYKI2lmZGVmIEVTVEFMRQogICAgICAgIGNhc2UgRVNUQUxFOiAgICAgICAgICAgIHJldHVybiBXU0FFU1RBTEU7IGJyZWFrOwojZW5kaWYKI2lmZGVmIEVSRU1PVEUKICAgICAgICBjYXNlIEVSRU1PVEU6ICAgICAgICAgICByZXR1cm4gV1NBRVJFTU9URTsgYnJlYWs7CiNlbmRpZgogICAgZGVmYXVsdDogZXJybm89ZXJyOyBwZXJyb3IoInNvY2tfc2V0X2Vycm9yIik7IHJldHVybiBFUlJPUl9VTktOT1dOOyBicmVhazsKICAgIH0KfQoKLyogc2V0IHRoZSBsYXN0IGVycm9yIGRlcGVuZGluZyBvbiBlcnJubyAqLwpzdGF0aWMgdm9pZCBzb2NrX3NldF9lcnJvcih2b2lkKQp7CiAgICBzZXRfZXJyb3IoIHNvY2tfZ2V0X2Vycm9yKCBlcnJubyApICk7Cn0KCi8qIGNyZWF0ZSBhIHNvY2tldCAqLwpERUNMX0hBTkRMRVIoY3JlYXRlX3NvY2tldCkKewogICAgc3RydWN0IG9iamVjdCAqb2JqOwoKICAgIHJlcS0+aGFuZGxlID0gMDsKICAgIGlmICgob2JqID0gY3JlYXRlX3NvY2tldCggcmVxLT5mYW1pbHksIHJlcS0+dHlwZSwgcmVxLT5wcm90b2NvbCApKSAhPSBOVUxMKQogICAgewogICAgICAgIHJlcS0+aGFuZGxlID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCBvYmosIHJlcS0+YWNjZXNzLCByZXEtPmluaGVyaXQgKTsKICAgICAgICByZWxlYXNlX29iamVjdCggb2JqICk7CiAgICB9Cn0KCi8qIGFjY2VwdCBhIHNvY2tldCAqLwpERUNMX0hBTkRMRVIoYWNjZXB0X3NvY2tldCkKewogICAgc3RydWN0IG9iamVjdCAqb2JqOwoKICAgIHJlcS0+aGFuZGxlID0gMDsKICAgIGlmICgob2JqID0gYWNjZXB0X3NvY2tldCggcmVxLT5saGFuZGxlICkpICE9IE5VTEwpCiAgICB7CiAgICAgICAgcmVxLT5oYW5kbGUgPSBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsIG9iaiwgcmVxLT5hY2Nlc3MsIHJlcS0+aW5oZXJpdCApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBvYmogKTsKICAgIH0KfQoKLyogc2V0IHNvY2tldCBldmVudCBwYXJhbWV0ZXJzICovCkRFQ0xfSEFORExFUihzZXRfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIHN0cnVjdCBldmVudCAqb2V2ZW50OwogICAgdW5zaWduZWQgaW50IG9tYXNrOwoKICAgIHNvY2s9KHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaihjdXJyZW50LT5wcm9jZXNzLHJlcS0+aGFuZGxlLEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCZzb2NrX29wcyk7CiAgICBpZiAoIXNvY2spCglyZXR1cm47CiAgICBvZXZlbnQgPSBzb2NrLT5ldmVudDsKICAgIG9tYXNrICA9IHNvY2stPm1hc2s7CiAgICBzb2NrLT5tYXNrICAgID0gcmVxLT5tYXNrOwogICAgc29jay0+ZXZlbnQgICA9IGdldF9ldmVudF9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+ZXZlbnQsIEVWRU5UX01PRElGWV9TVEFURSApOwogICAgaWYgKGRlYnVnX2xldmVsICYmIHNvY2stPmV2ZW50KSBmcHJpbnRmKHN0ZGVyciwgImV2ZW50IHB0cjogJXBcbiIsIHNvY2stPmV2ZW50KTsKICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIGlmIChzb2NrLT5tYXNrKQogICAgICAgIHNvY2stPnN0YXRlIHw9IFdTX0ZEX05PTkJMT0NLSU5HOwoKICAgIC8qIGlmIGEgbmV0d29yayBldmVudCBpcyBwZW5kaW5nLCBzaWduYWwgdGhlIGV2ZW50IG9iamVjdCAKICAgICAgIGl0IGlzIHBvc3NpYmxlIHRoYXQgRkRfQ09OTkVDVCBvciBGRF9BQ0NFUFQgbmV0d29yayBldmVudHMgaGFzIGhhcHBlbmVkCiAgICAgICBiZWZvcmUgYSBXU0FFdmVudFNlbGVjdCgpIHdhcyBkb25lIG9uIGl0LiAKICAgICAgICh3aGVuIGRlYWxpbmcgd2l0aCBBc3luY2hyb25vdXMgc29ja2V0KSAgKi8KICAgIGlmIChzb2NrLT5wbWFzayAmIHNvY2stPm1hc2spCiAgICAgICAgc2V0X2V2ZW50KHNvY2stPmV2ZW50KTsKICAgIAogICAgaWYgKG9ldmVudCkKICAgIHsKICAgIAlpZiAoKG9ldmVudCAhPSBzb2NrLT5ldmVudCkgJiYgKG9tYXNrICYgV1NfRkRfU0VSVkVWRU5UKSkKICAgICAgICAgICAgLyogaWYgdGhlIHNlcnZpY2UgdGhyZWFkIHdhcyB3YWl0aW5nIGZvciB0aGUgb2xkIGV2ZW50IG9iamVjdCwKICAgICAgICAgICAgICogd2Ugc2hvdWxkIG5vdyBzaWduYWwgaXQsIHRvIGxldCB0aGUgc2VydmljZSB0aHJlYWQKICAgICAgICAgICAgICogb2JqZWN0IGRldGVjdCB0aGF0IGl0IGlzIG5vdyBvcnBoYW5lZC4uLiAqLwogICAgICAgICAgICBzZXRfZXZlbnQoIG9ldmVudCApOwogICAgICAgIC8qIHdlJ3JlIHRocm91Z2ggd2l0aCBpdCAqLwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBvZXZlbnQgKTsKICAgIH0KICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7Cn0KCi8qIGdldCBzb2NrZXQgZXZlbnQgcGFyYW1ldGVycyAqLwpERUNMX0hBTkRMRVIoZ2V0X3NvY2tldF9ldmVudCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBzaXplX3Qgc2l6ZTsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooY3VycmVudC0+cHJvY2VzcyxyZXEtPmhhbmRsZSxHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQogICAgewoJcmVxLT5tYXNrICA9IDA7CglyZXEtPnBtYXNrID0gMDsKCXJlcS0+c3RhdGUgPSAwOwoJc2V0X2Vycm9yKFdTQUVOT1RTT0NLKTsKCXJldHVybjsKICAgIH0KICAgIHJlcS0+bWFzayAgICA9IHNvY2stPm1hc2s7CiAgICByZXEtPnBtYXNrICAgPSBzb2NrLT5wbWFzazsKICAgIHJlcS0+c3RhdGUgICA9IHNvY2stPnN0YXRlOwogICAgc2l6ZSA9IG1pbiggZ2V0X3JlcV9kYXRhX3NpemUocmVxKSwgc2l6ZW9mKHNvY2stPmVycm9ycykgKTsKICAgIG1lbWNweSggZ2V0X3JlcV9kYXRhKHJlcSksIHNvY2stPmVycm9ycywgc2l6ZSApOwogICAgc2V0X3JlcV9kYXRhX3NpemUoIHJlcSwgc2l6ZSApOwoKICAgIGlmIChyZXEtPnNlcnZpY2UpCiAgICB7CiAgICAgICAgaWYgKHJlcS0+c19ldmVudCkKICAgICAgICB7CiAgICAgICAgICAgIHN0cnVjdCBldmVudCAqc2V2ZW50ID0gZ2V0X2V2ZW50X29iaihjdXJyZW50LT5wcm9jZXNzLCByZXEtPnNfZXZlbnQsIDApOwogICAgICAgICAgICBpZiAoc2V2ZW50ID09IHNvY2stPmV2ZW50KQogICAgICAgICAgICAgICAgcmVxLT5zX2V2ZW50ID0gMDsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNldmVudCApOwogICAgICAgIH0KICAgICAgICBpZiAoIXJlcS0+c19ldmVudCkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChyZXEtPmNfZXZlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBldmVudCAqY2V2ZW50ID0gZ2V0X2V2ZW50X29iaihjdXJyZW50LT5wcm9jZXNzLCByZXEtPmNfZXZlbnQsIEVWRU5UX01PRElGWV9TVEFURSk7CiAgICAgICAgICAgICAgICByZXNldF9ldmVudCggY2V2ZW50ICk7CiAgICAgICAgICAgICAgICByZWxlYXNlX29iamVjdCggY2V2ZW50ICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc29jay0+cG1hc2sgPSAwOwogICAgICAgICAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICAgICAgfQogICAgICAgIGVsc2Ugc2V0X2Vycm9yKFdTQUVJTlZBTCk7CiAgICB9CiAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwp9CgovKiByZS1lbmFibGUgcGVuZGluZyBzb2NrZXQgZXZlbnRzICovCkRFQ0xfSEFORExFUihlbmFibGVfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooY3VycmVudC0+cHJvY2VzcyxyZXEtPmhhbmRsZSxHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQogICAgCXJldHVybjsKICAgIHNvY2stPnBtYXNrICY9IH5yZXEtPm1hc2s7IC8qIGlzIHRoaXMgc2FmZT8gKi8KICAgIHNvY2stPmhtYXNrICY9IH5yZXEtPm1hc2s7CiAgICBzb2NrLT5zdGF0ZSB8PSByZXEtPnNzdGF0ZTsKICAgIHNvY2stPnN0YXRlICY9IH5yZXEtPmNzdGF0ZTsKICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKCiAgICAvKiBzZXJ2aWNlIHRyaWdnZXIgKi8KICAgIGlmIChyZXEtPm1hc2sgJiBXU19GRF9TRVJWRVZFTlQpCiAgICB7CiAgICAgICAgc29jay0+cG1hc2sgfD0gV1NfRkRfU0VSVkVWRU5UOwogICAgICAgIGlmIChzb2NrLT5ldmVudCkgewogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYoc3RkZXJyLCAic2lnbmFsbGluZyBzZXJ2aWNlIGV2ZW50IHB0ciAlcFxuIiwgc29jay0+ZXZlbnQpOwogICAgICAgICAgICBzZXRfZXZlbnQoc29jay0+ZXZlbnQpOwogICAgICAgIH0KICAgIH0KCiAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwp9Cg==