LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQogKgogKiBGSVhNRTogd2UgdXNlIHJlYWR8d3JpdGUgYWNjZXNzIGluIGFsbCBjYXNlcy4gU2hvdWxkbid0IHdlIGRlcGVuZCB0aGF0CiAqIG9uIHRoZSBhY2Nlc3Mgb2YgdGhlIGN1cnJlbnQgaGFuZGxlPwogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZmRlZiBIQVZFX1NZU19FUlJOT19ICiMgaW5jbHVkZSA8c3lzL2Vycm5vLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWZkZWYgSEFWRV9TWVNfU09DS0VUX0gKIyBpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNpZmRlZiBIQVZFX1NZU19GSUxJT19ICiMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgInByb2Nlc3MuaCIKI2luY2x1ZGUgImhhbmRsZS5oIgojaW5jbHVkZSAidGhyZWFkLmgiCiNpbmNsdWRlICJyZXF1ZXN0LmgiCiNpbmNsdWRlICJ1c2VyLmgiCiNpbmNsdWRlICJhc3luYy5oIgoKLyogVG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIFVuaXggc29ja2V0IGhlYWRlcnMuIFBsdXMgd2Ugb25seSBuZWVkIGEgZmV3CiAqIG1hY3JvcyBhbnl3YXkuCiAqLwojZGVmaW5lIFVTRV9XU19QUkVGSVgKI2luY2x1ZGUgIndpbnNvY2syLmgiCgpzdHJ1Y3Qgc29jawp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICAgICAgIG9iajsgICAgICAgICAvKiBvYmplY3QgaGVhZGVyICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHN0YXRlOyAgICAgICAvKiBzdGF0dXMgYml0cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBtYXNrOyAgICAgICAgLyogZXZlbnQgbWFzayAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBobWFzazsgICAgICAgLyogaGVsZCAoYmxvY2tlZCkgZXZlbnRzICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHBtYXNrOyAgICAgICAvKiBwZW5kaW5nIGV2ZW50cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBmbGFnczsgICAgICAgLyogc29ja2V0IGZsYWdzICovCiAgICBzdHJ1Y3QgZXZlbnQgICAgICAgKmV2ZW50OyAgICAgICAvKiBldmVudCBvYmplY3QgKi8KICAgIHVzZXJfaGFuZGxlX3QgICAgICAgd2luZG93OyAgICAgIC8qIHdpbmRvdyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIG1lc3NhZ2U7ICAgICAvKiBtZXNzYWdlIHRvIHNlbmQgKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgd3BhcmFtOyAgICAgIC8qIG1lc3NhZ2Ugd3BhcmFtIChzb2NrZXQgaGFuZGxlKSAqLwogICAgaW50ICAgICAgICAgICAgICAgICBlcnJvcnNbRkRfTUFYX0VWRU5UU107IC8qIGV2ZW50IGVycm9ycyAqLwogICAgc3RydWN0IHNvY2sqICAgICAgICBkZWZlcnJlZDsgICAgLyogc29ja2V0IHRoYXQgd2FpdHMgZm9yIGEgZGVmZXJyZWQgYWNjZXB0ICovCiAgICBzdHJ1Y3QgYXN5bmNfcXVldWUgIHJlYWRfcTsgICAgICAvKiBRdWV1ZSBmb3IgYXN5bmNocm9ub3VzIHJlYWRzICovCiAgICBzdHJ1Y3QgYXN5bmNfcXVldWUgIHdyaXRlX3E7ICAgICAvKiBRdWV1ZSBmb3IgYXN5bmNocm9ub3VzIHdyaXRlcyAqLwp9OwoKc3RhdGljIHZvaWQgc29ja19kdW1wKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCB2ZXJib3NlICk7CnN0YXRpYyBpbnQgc29ja19zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKTsKc3RhdGljIGludCBzb2NrX2dldF9wb2xsX2V2ZW50cyggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyB2b2lkIHNvY2tfcG9sbF9ldmVudCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgZXZlbnQgKTsKc3RhdGljIGludCBzb2NrX2dldF9mZCggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyBpbnQgc29ja19nZXRfaW5mbyggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgZ2V0X2ZpbGVfaW5mb19yZXBseSAqcmVwbHksIGludCAqZmxhZ3MgKTsKc3RhdGljIHZvaWQgc29ja19kZXN0cm95KCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApOwpzdGF0aWMgdm9pZCBzb2NrX3NldF9lcnJvcih2b2lkKTsKc3RhdGljIHZvaWQgc29ja19xdWV1ZV9hc3luYyhzdHJ1Y3Qgb2JqZWN0ICpvYmosIHZvaWQgKnB0ciwgdW5zaWduZWQgaW50IHN0YXR1cywgaW50IHR5cGUsIGludCBjb3VudCk7CgpzdGF0aWMgY29uc3Qgc3RydWN0IG9iamVjdF9vcHMgc29ja19vcHMgPQp7CiAgICBzaXplb2Yoc3RydWN0IHNvY2spLCAgICAgICAgICAvKiBzaXplICovCiAgICBzb2NrX2R1bXAsICAgICAgICAgICAgICAgICAgICAvKiBkdW1wICovCiAgICBhZGRfcXVldWUsICAgICAgICAgICAgICAgICAgICAvKiBhZGRfcXVldWUgKi8KICAgIHJlbW92ZV9xdWV1ZSwgICAgICAgICAgICAgICAgIC8qIHJlbW92ZV9xdWV1ZSAqLwogICAgc29ja19zaWduYWxlZCwgICAgICAgICAgICAgICAgLyogc2lnbmFsZWQgKi8KICAgIG5vX3NhdGlzZmllZCwgICAgICAgICAgICAgICAgIC8qIHNhdGlzZmllZCAqLwogICAgc29ja19nZXRfcG9sbF9ldmVudHMsICAgICAgICAgLyogZ2V0X3BvbGxfZXZlbnRzICovCiAgICBzb2NrX3BvbGxfZXZlbnQsICAgICAgICAgICAgICAvKiBwb2xsX2V2ZW50ICovCiAgICBzb2NrX2dldF9mZCwgICAgICAgICAgICAgICAgICAvKiBnZXRfZmQgKi8KICAgIG5vX2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgIC8qIGZsdXNoICovCiAgICBzb2NrX2dldF9pbmZvLCAgICAgICAgICAgICAgICAvKiBnZXRfZmlsZV9pbmZvICovCiAgICBzb2NrX3F1ZXVlX2FzeW5jLCAgICAgICAgICAgICAvKiBxdWV1ZV9hc3luYyAqLwogICAgc29ja19kZXN0cm95ICAgICAgICAgICAgICAgICAgLyogZGVzdHJveSAqLwp9OwoKCi8qIFBlcm11dGF0aW9uIG9mIDAuLkZEX01BWF9FVkVOVFMgLSAxIHJlcHJlc2VudGluZyB0aGUgb3JkZXIgaW4gd2hpY2gKICogd2UgcG9zdCBtZXNzYWdlcyBpZiB0aGVyZSBhcmUgbXVsdGlwbGUgZXZlbnRzLiAgVXNlZCB0byBzZW5kCiAqIG1lc3NhZ2VzLiAgVGhlIHByb2JsZW0gaXMgaWYgdGhlcmUgaXMgYm90aCBhIEZEX0NPTk5FQ1QgZXZlbnQgYW5kLAogKiBzYXksIGFuIEZEX1JFQUQgZXZlbnQgYXZhaWxhYmxlIG9uIHRoZSBzYW1lIHNvY2tldCwgd2Ugd2FudCB0bwogKiBub3RpZnkgdGhlIGFwcCBvZiB0aGUgY29ubmVjdCBldmVudCBmaXJzdC4gIE90aGVyd2lzZSBpdCBtYXkKICogZGlzY2FyZCB0aGUgcmVhZCBldmVudCBiZWNhdXNlIGl0IHRoaW5rcyBpdCBoYXNuJ3QgY29ubmVjdGVkIHlldC4KICovCnN0YXRpYyBjb25zdCBpbnQgZXZlbnRfYml0b3JkZXJbRkRfTUFYX0VWRU5UU10gPQp7CiAgICBGRF9DT05ORUNUX0JJVCwKICAgIEZEX0FDQ0VQVF9CSVQsCiAgICBGRF9PT0JfQklULAogICAgRkRfV1JJVEVfQklULAogICAgRkRfUkVBRF9CSVQsCiAgICBGRF9DTE9TRV9CSVQsCiAgICA2LCA3LCA4LCA5ICAvKiBsZWZ0b3ZlcnMgKi8KfTsKCgpzdGF0aWMgaW50IHNvY2tfcmVzZWxlY3QoIHN0cnVjdCBzb2NrICpzb2NrICkKewogICAgaW50IGV2ID0gc29ja19nZXRfcG9sbF9ldmVudHMoICZzb2NrLT5vYmogKTsKCiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsInNvY2tfcmVzZWxlY3QoJWQpOiBuZXcgbWFzayAleFxuIiwgc29jay0+b2JqLmZkLCBldik7CgogICAgaWYgKHNvY2stPm9iai5zZWxlY3QgPT0gLTEpIHsKICAgICAgICAvKiBwcmV2aW91c2x5IHVuY29ubmVjdGVkIHNvY2tldCwgaXMgdGhpcyByZXNlbGVjdCBzdXBwb3NlZCB0byBjb25uZWN0IGl0PyAqLwogICAgICAgIGlmICghKHNvY2stPnN0YXRlICYgfkZEX1dJTkVfTk9OQkxPQ0tJTkcpKSByZXR1cm4gMDsKICAgICAgICAvKiBvaywgaXQgaXMsIGF0dGFjaCBpdCB0byB0aGUgd2luZXNlcnZlcidzIG1haW4gcG9sbCBsb29wICovCiAgICAgICAgYWRkX3NlbGVjdF91c2VyKCAmc29jay0+b2JqICk7CiAgICB9CiAgICAvKiB1cGRhdGUgY29uZGl0aW9uIG1hc2sgKi8KICAgIHNldF9zZWxlY3RfZXZlbnRzKCAmc29jay0+b2JqLCBldiApOwogICAgcmV0dXJuIGV2Owp9CgovKiBBZnRlciBQT0xMSFVQIGlzIHJlY2VpdmVkLCB0aGUgc29ja2V0IHdpbGwgbm8gbG9uZ2VyIGJlIGluIHRoZSBtYWluIHNlbGVjdCBsb29wLgogICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2lnbmFsIHBlbmRpbmcgZXZlbnRzIG5ldmVydGhlbGVzcyAqLwpzdGF0aWMgdm9pZCBzb2NrX3RyeV9ldmVudCAoIHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgZXZlbnQgKQp7CiAgICBzdHJ1Y3QgcG9sbGZkIHBmZDsKCiAgICBwZmQuZmQgPSBzb2NrLT5vYmouZmQ7CiAgICBwZmQuZXZlbnRzID0gZXZlbnQ7CiAgICBwZmQucmV2ZW50cyA9IDA7CiAgICBwb2xsICgmcGZkLCAxLCAwKTsKCiAgICBpZiAoIHBmZC5yZXZlbnRzICkKICAgIHsKICAgICAgICBpZiAoIGRlYnVnX2xldmVsICkgZnByaW50ZiAoIHN0ZGVyciwgInNvY2tfdHJ5X2V2ZW50OiAleFxuIiwgcGZkLnJldmVudHMgKTsKICAgICAgICBzb2NrX3BvbGxfZXZlbnQgKCAmc29jay0+b2JqLCBwZmQucmV2ZW50cyApOwogICAgfQp9CgovKiB3YWtlIGFueWJvZHkgd2FpdGluZyBvbiB0aGUgc29ja2V0IGV2ZW50IG9yIHNlbmQgdGhlIGFzc29jaWF0ZWQgbWVzc2FnZSAqLwpzdGF0aWMgdm9pZCBzb2NrX3dha2VfdXAoIHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgcG9sbGV2ICkKewogICAgdW5zaWduZWQgaW50IGV2ZW50cyA9IHNvY2stPnBtYXNrICYgc29jay0+bWFzazsKICAgIGludCBpOwogICAgaW50IGFzeW5jX2FjdGl2ZSA9IDA7CgogICAgaWYgKCBzb2NrLT5mbGFncyAmIEZEX0ZMQUdfT1ZFUkxBUFBFRCApCiAgICB7CiAgICAgICAgaWYoIHBvbGxldiAmIChQT0xMSU58UE9MTFBSSSkgJiYgSVNfUkVBRFkoIHNvY2stPnJlYWRfcSApICkKICAgICAgICB7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50ZiAoIHN0ZGVyciwgImFjdGl2YXRpbmcgcmVhZCBxdWV1ZSBmb3Igc29ja2V0ICVwXG4iLCBzb2NrICk7CiAgICAgICAgICAgIGFzeW5jX25vdGlmeSggc29jay0+cmVhZF9xLmhlYWQsIFNUQVRVU19BTEVSVEVEICk7CiAgICAgICAgICAgIGFzeW5jX2FjdGl2ZSA9IDE7CiAgICAgICAgfQogICAgICAgIGlmKCBwb2xsZXYgJiBQT0xMT1VUICYmIElTX1JFQURZKCBzb2NrLT53cml0ZV9xICkgKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmICggc3RkZXJyLCAiYWN0aXZhdGluZyB3cml0ZSBxdWV1ZSBmb3Igc29ja2V0ICVwXG4iLCBzb2NrICk7CiAgICAgICAgICAgIGFzeW5jX25vdGlmeSggc29jay0+d3JpdGVfcS5oZWFkLCBTVEFUVVNfQUxFUlRFRCApOwogICAgICAgICAgICBhc3luY19hY3RpdmUgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBEbyBub3Qgc2lnbmFsIGV2ZW50cyBpZiB0aGVyZSBhcmUgc3RpbGwgcGVuZGluZyBhc3luY2hyb25vdXMgSU8gcmVxdWVzdHMgKi8KICAgIC8qIFdlIG5lZWQgdGhpcyB0byBkZWxheSBGRF9DTE9TRSBldmVudHMgdW50aWwgYWxsIHBlbmRpbmcgb3ZlcmxhcHBlZCByZXF1ZXN0cyBhcmUgcHJvY2Vzc2VkICovCiAgICBpZiAoICFldmVudHMgfHwgYXN5bmNfYWN0aXZlICkgcmV0dXJuOwoKICAgIGlmIChzb2NrLT5ldmVudCkKICAgIHsKICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYoc3RkZXJyLCAic2lnbmFsbGluZyBldmVudHMgJXggcHRyICVwXG4iLCBldmVudHMsIHNvY2stPmV2ZW50ICk7CiAgICAgICAgc2V0X2V2ZW50KCBzb2NrLT5ldmVudCApOwogICAgfQogICAgaWYgKHNvY2stPndpbmRvdykKICAgIHsKICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYoc3RkZXJyLCAic2lnbmFsbGluZyBldmVudHMgJXggd2luICV4XG4iLCBldmVudHMsIHNvY2stPndpbmRvdyApOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRF9NQVhfRVZFTlRTOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpbnQgZXZlbnQgPSBldmVudF9iaXRvcmRlcltpXTsKICAgICAgICAgICAgaWYgKHNvY2stPnBtYXNrICYgKDEgPDwgZXZlbnQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbHBhcmFtID0gKDEgPDwgZXZlbnQpIHwgKHNvY2stPmVycm9yc1tldmVudF0gPDwgMTYpOwogICAgICAgICAgICAgICAgcG9zdF9tZXNzYWdlKCBzb2NrLT53aW5kb3csIHNvY2stPm1lc3NhZ2UsIHNvY2stPndwYXJhbSwgbHBhcmFtICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc29jay0+cG1hc2sgPSAwOwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIH0KfQoKaW5saW5lIHN0YXRpYyBpbnQgc29ja19lcnJvcihpbnQgcykKewogICAgdW5zaWduZWQgaW50IG9wdHZhbCA9IDAsIG9wdGxlbjsKICAgIAogICAgb3B0bGVuID0gc2l6ZW9mKG9wdHZhbCk7CiAgICBnZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAodm9pZCAqKSAmb3B0dmFsLCAmb3B0bGVuKTsKICAgIHJldHVybiBvcHR2YWwgPyBzb2NrX2dldF9lcnJvcihvcHR2YWwpIDogMDsKfQoKc3RhdGljIHZvaWQgc29ja19wb2xsX2V2ZW50KCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIGludCBldmVudCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgaW50IGVtcHR5X3JlY3YgPSAwOwoKICAgIGFzc2VydCggc29jay0+b2JqLm9wcyA9PSAmc29ja19vcHMgKTsKICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlZCBzZWxlY3QgZXZlbnQ6ICV4XG4iLCBzb2NrLT5vYmouZmQsIGV2ZW50KTsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX0NPTk5FQ1QpCiAgICB7CiAgICAgICAgLyogY29ubmVjdGluZyAqLwogICAgICAgIGlmIChldmVudCAmIFBPTExPVVQpCiAgICAgICAgewogICAgICAgICAgICAvKiB3ZSBnb3QgY29ubmVjdGVkICovCiAgICAgICAgICAgIHNvY2stPnN0YXRlIHw9IEZEX1dJTkVfQ09OTkVDVEVEfEZEX1JFQUR8RkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJWQgY29ubmVjdGlvbiBzdWNjZXNzXG4iLCBzb2NrLT5vYmouZmQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChldmVudCAmIChQT0xMRVJSfFBPTExIVVApKQogICAgICAgIHsKICAgICAgICAgICAgLyogd2UgZGlkbid0IGdldCBjb25uZWN0ZWQ/ICovCiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gc29ja19lcnJvciggc29jay0+b2JqLmZkICk7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGNvbm5lY3Rpb24gZmFpbHVyZVxuIiwgc29jay0+b2JqLmZkKTsKICAgICAgICB9CiAgICB9IGVsc2UKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfTElTVEVOSU5HKQogICAgewogICAgICAgIC8qIGxpc3RlbmluZyAqLwogICAgICAgIGlmIChldmVudCAmIFBPTExJTikKICAgICAgICB7CiAgICAgICAgICAgIC8qIGluY29taW5nIGNvbm5lY3Rpb24gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSAwOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGV2ZW50ICYgKFBPTExFUlJ8UE9MTEhVUCkpCiAgICAgICAgewogICAgICAgICAgICAvKiBmYWlsZWQgaW5jb21pbmcgY29ubmVjdGlvbj8gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSBzb2NrX2Vycm9yKCBzb2NrLT5vYmouZmQgKTsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgIH0KICAgIH0gZWxzZQogICAgewogICAgICAgIC8qIG5vcm1hbCBkYXRhIGZsb3cgKi8KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMSU4pCiAgICAgICAgewogICAgICAgICAgICBjaGFyIGR1bW15OwogICAgICAgICAgICBpbnQgbnI7CgogICAgICAgICAgICAvKiBMaW51eCAyLjQgZG9lc24ndCByZXBvcnQgUE9MTEhVUCBpZiBvbmx5IG9uZSBzaWRlIG9mIHRoZSBzb2NrZXQKICAgICAgICAgICAgICogaGFzIGJlZW4gY2xvc2VkLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvciBpdCBleHBsaWNpdGx5IGhlcmUgKi8KICAgICAgICAgICAgbnIgID0gcmVjdiggc29jay0+b2JqLmZkLCAmZHVtbXksIDEsIE1TR19QRUVLICk7CiAgICAgICAgICAgIGlmICggbnIgPiAwICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgLyogaW5jb21pbmcgZGF0YSAqLwogICAgICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfUkVBRDsKICAgICAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IChGRF9SRUFEfEZEX0NMT1NFKTsKICAgICAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9SRUFEX0JJVF0gPSAwOwogICAgICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGlzIHJlYWRhYmxlXG4iLCBzb2NrLT5vYmouZmQgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICggbnIgPT0gMCApCiAgICAgICAgICAgICAgICBlbXB0eV9yZWN2ID0gMTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBFQUdBSU4gY2FuIGhhcHBlbiBpZiBhbiBhc3luYyByZWN2KCkgZmFsbHMgYmV0d2VlbiB0aGUgc2VydmVyJ3MgcG9sbCgpCiAgICAgICAgICAgICAgICAgICBjYWxsIGFuZCB0aGUgaW52b2NhdGlvbiBvZiB0aGlzIHJvdXRpbmUgKi8KICAgICAgICAgICAgICAgIGlmICggZXJybm8gPT0gRUFHQUlOICkKICAgICAgICAgICAgICAgICAgICBldmVudCAmPSB+UE9MTElOOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggZGVidWdfbGV2ZWwgKQogICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAicmVjdiBlcnJvciBvbiBzb2NrZXQgJWQ6ICVkXG4iLCBzb2NrLT5vYmouZmQsIGVycm5vICk7CiAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBQT0xMRVJSOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMT1VUKQogICAgICAgIHsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfV1JJVEU7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX1dSSVRFOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfV1JJVEVfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGlzIHdyaXRhYmxlXG4iLCBzb2NrLT5vYmouZmQpOwogICAgICAgIH0KICAgICAgICBpZiAoZXZlbnQgJiBQT0xMUFJJKQogICAgICAgIHsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfT09COwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9PT0I7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9PT0JfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGdvdCBPT0IgZGF0YVxuIiwgc29jay0+b2JqLmZkKTsKICAgICAgICB9CiAgICAgICAgLyogQWNjb3JkaW5nIHRvIFdTMiBzcGVjcywgRkRfQ0xPU0UgaXMgb25seSBkZWxpdmVyZWQgd2hlbiB0aGVyZSBpcwogICAgICAgICAgIG5vIG1vcmUgZGF0YSB0byBiZSByZWFkIChpLmUuIGVtcHR5X3JlY3YgPSAxKSAqLwogICAgICAgIGVsc2UgaWYgKCBlbXB0eV9yZWN2ICYmIChzb2NrLT5zdGF0ZSAmIChGRF9SRUFEfEZEX1dSSVRFKSApKQogICAgICAgIHsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX0NMT1NFX0JJVF0gPSBzb2NrX2Vycm9yKCBzb2NrLT5vYmouZmQgKTsKICAgICAgICAgICAgaWYgKCBldmVudCAmICggUE9MTEVSUnxQT0xMSFVQICkgKQogICAgICAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH4oRkRfV0lORV9DT05ORUNURUR8RkRfV1JJVEUpOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DTE9TRTsKICAgICAgICAgICAgc29jay0+aG1hc2sgfD0gRkRfQ0xPU0U7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVkIGFib3J0ZWQgYnkgZXJyb3IgJWQsIGV2ZW50OiAleCAtIHJlbW92aW5nIGZyb20gc2VsZWN0IGxvb3BcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHNvY2stPm9iai5mZCwgc29jay0+ZXJyb3JzW0ZEX0NMT1NFX0JJVF0sIGV2ZW50KTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCBzb2NrLT5wbWFzayAmIEZEX0NMT1NFIHx8IGV2ZW50ICYgKFBPTExFUlJ8UE9MTEhVUCkgKQogICAgewogICAgICAgIGlmICggZGVidWdfbGV2ZWwgKQogICAgICAgICAgICBmcHJpbnRmICggc3RkZXJyLCAicmVtb3Zpbmcgc29ja2V0ICVkIGZyb20gc2VsZWN0IGxvb3BcbiIsIHNvY2stPm9iai5mZCApOwogICAgICAgIHNldF9zZWxlY3RfZXZlbnRzKCAmc29jay0+b2JqLCAtMSApOwogICAgfQogICAgZWxzZQogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKCiAgICAvKiB3YWtlIHVwIGFueW9uZSB3YWl0aW5nIGZvciB3aGF0ZXZlciBqdXN0IGhhcHBlbmVkICovCiAgICBpZiAoIHNvY2stPnBtYXNrICYgc29jay0+bWFzayB8fCBzb2NrLT5mbGFncyAmIEZEX0ZMQUdfT1ZFUkxBUFBFRCApIHNvY2tfd2FrZV91cCggc29jaywgZXZlbnQgKTsKCiAgICAvKiBpZiBhbnlvbmUgaXMgc3R1cGlkIGVub3VnaCB0byB3YWl0IG9uIHRoZSBzb2NrZXQgb2JqZWN0IGl0c2VsZiwKICAgICAqIG1heWJlIHdlIHNob3VsZCB3YWtlIHRoZW0gdXAgdG9vLCBqdXN0IGluIGNhc2U/ICovCiAgICB3YWtlX3VwKCAmc29jay0+b2JqLCAwICk7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfZHVtcCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgdmVyYm9zZSApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKICAgIHByaW50ZiggIlNvY2tldCBmZD0lZCwgc3RhdGU9JXgsIG1hc2s9JXgsIHBlbmRpbmc9JXgsIGhlbGQ9JXhcbiIsCiAgICAgICAgICAgIHNvY2stPm9iai5mZCwgc29jay0+c3RhdGUsCiAgICAgICAgICAgIHNvY2stPm1hc2ssIHNvY2stPnBtYXNrLCBzb2NrLT5obWFzayApOwp9CgpzdGF0aWMgaW50IHNvY2tfc2lnbmFsZWQoIHN0cnVjdCBvYmplY3QgKm9iaiwgc3RydWN0IHRocmVhZCAqdGhyZWFkICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIHJldHVybiBjaGVja19zZWxlY3RfZXZlbnRzKCBzb2NrLT5vYmouZmQsIHNvY2tfZ2V0X3BvbGxfZXZlbnRzKCAmc29jay0+b2JqICkgKTsKfQoKc3RhdGljIGludCBzb2NrX2dldF9wb2xsX2V2ZW50cyggc3RydWN0IG9iamVjdCAqb2JqICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICB1bnNpZ25lZCBpbnQgbWFzayA9IHNvY2stPm1hc2sgJiBzb2NrLT5zdGF0ZSAmIH5zb2NrLT5obWFzazsKICAgIGludCBldiA9IDA7CgogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICBpZiAoc29jay0+c3RhdGUgJiBGRF9DT05ORUNUKQogICAgICAgIC8qIGNvbm5lY3RpbmcsIHdhaXQgZm9yIHdyaXRhYmxlICovCiAgICAgICAgcmV0dXJuIFBPTExPVVQ7CiAgICBpZiAoc29jay0+c3RhdGUgJiBGRF9XSU5FX0xJU1RFTklORykKICAgICAgICAvKiBsaXN0ZW5pbmcsIHdhaXQgZm9yIHJlYWRhYmxlICovCiAgICAgICAgcmV0dXJuIChzb2NrLT5obWFzayAmIEZEX0FDQ0VQVCkgPyAwIDogUE9MTElOOwoKICAgIGlmIChtYXNrICYgKEZEX1JFQUQpIHx8IChzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQgJiYgSVNfUkVBRFkgKHNvY2stPnJlYWRfcSkpKQogICAgICAgIGV2IHw9IFBPTExJTiB8IFBPTExQUkk7CiAgICBpZiAobWFzayAmIEZEX1dSSVRFIHx8IChzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQgJiYgSVNfUkVBRFkgKHNvY2stPndyaXRlX3EpKSkKICAgICAgICBldiB8PSBQT0xMT1VUOwogICAgLyogV2UgdXNlIFBPTExJTiB3aXRoIDAgYnl0ZXMgcmVjdigpIGFzIEZEX0NMT1NFIGluZGljYXRpb24uICovCiAgICBpZiAoc29jay0+bWFzayAmIH5zb2NrLT5obWFzayAmIEZEX0NMT1NFKQogICAgICAgIGV2IHw9IFBPTExJTjsKCiAgICByZXR1cm4gZXY7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfZmQoIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKICAgIHJldHVybiBzb2NrLT5vYmouZmQ7Cn0KCnN0YXRpYyBpbnQgc29ja19nZXRfaW5mbyggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgZ2V0X2ZpbGVfaW5mb19yZXBseSAqcmVwbHksIGludCAqZmxhZ3MgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayopIG9iajsKICAgIGFzc2VydCAoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIGlmIChyZXBseSkKICAgIHsKICAgICAgICByZXBseS0+dHlwZSAgICAgICAgPSBGSUxFX1RZUEVfUElQRTsKICAgICAgICByZXBseS0+YXR0ciAgICAgICAgPSAwOwogICAgICAgIHJlcGx5LT5hY2Nlc3NfdGltZSA9IDA7CiAgICAgICAgcmVwbHktPndyaXRlX3RpbWUgID0gMDsKICAgICAgICByZXBseS0+c2l6ZV9oaWdoICAgPSAwOwogICAgICAgIHJlcGx5LT5zaXplX2xvdyAgICA9IDA7CiAgICAgICAgcmVwbHktPmxpbmtzICAgICAgID0gMDsKICAgICAgICByZXBseS0+aW5kZXhfaGlnaCAgPSAwOwogICAgICAgIHJlcGx5LT5pbmRleF9sb3cgICA9IDA7CiAgICAgICAgcmVwbHktPnNlcmlhbCAgICAgID0gMDsKICAgIH0KICAgICpmbGFncyA9IDA7CiAgICBpZiAoc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEKSAqZmxhZ3MgfD0gRkRfRkxBR19PVkVSTEFQUEVEOwogICAgaWYgKCAhKHNvY2stPnN0YXRlICYgRkRfUkVBRCApICkgICpmbGFncyB8PSBGRF9GTEFHX1JFQ1ZfU0hVVERPV047CiAgICBpZiAoICEoc29jay0+c3RhdGUgJiBGRF9XUklURSApICkgKmZsYWdzIHw9IEZEX0ZMQUdfU0VORF9TSFVURE9XTjsKICAgIHJldHVybiBGRF9UWVBFX1NPQ0tFVDsKfQoKc3RhdGljIHZvaWQgc29ja19xdWV1ZV9hc3luYyhzdHJ1Y3Qgb2JqZWN0ICpvYmosIHZvaWQgKnB0ciwgdW5zaWduZWQgaW50IHN0YXR1cywgaW50IHR5cGUsIGludCBjb3VudCkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICBzdHJ1Y3QgYXN5bmNfcXVldWUgKnE7CiAgICBzdHJ1Y3QgYXN5bmMgKmFzeW5jOwogICAgaW50IHBvbGxldjsKCiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIGlmICggIShzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQpICkKICAgIHsKICAgICAgICBzZXRfZXJyb3IgKCBTVEFUVVNfSU5WQUxJRF9IQU5ETEUgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgc3dpdGNoKCB0eXBlICkKICAgIHsKICAgIGNhc2UgQVNZTkNfVFlQRV9SRUFEOgogICAgICAgIHEgPSAmc29jay0+cmVhZF9xOwogICAgICAgIHNvY2stPmhtYXNrICY9IH5GRF9DTE9TRTsKICAgICAgICBicmVhazsKICAgIGNhc2UgQVNZTkNfVFlQRV9XUklURToKICAgICAgICBxID0gJnNvY2stPndyaXRlX3E7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIHNldF9lcnJvciggU1RBVFVTX0lOVkFMSURfUEFSQU1FVEVSICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGFzeW5jID0gZmluZF9hc3luYyAoIHEsIGN1cnJlbnQsIHB0ciApOwoKICAgIGlmICggc3RhdHVzID09IFNUQVRVU19QRU5ESU5HICkKICAgIHsKICAgICAgICBpZiAoICggISggc29jay0+c3RhdGUgJiBGRF9SRUFEICkgJiYgdHlwZSA9PSBBU1lOQ19UWVBFX1JFQUQgICkgfHwKICAgICAgICAgICAgICggISggc29jay0+c3RhdGUgJiBGRF9XUklURSApICYmIHR5cGUgPT0gQVNZTkNfVFlQRV9XUklURSApICkKICAgICAgICB7CiAgICAgICAgICAgIHNldF9lcnJvciAoIFNUQVRVU19QSVBFX0RJU0NPTk5FQ1RFRCApOwogICAgICAgICAgICBpZiAoIGFzeW5jICkgZGVzdHJveV9hc3luYyAoIGFzeW5jICk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmICggIWFzeW5jICkKICAgICAgICAgICAgICAgIGFzeW5jID0gY3JlYXRlX2FzeW5jICggb2JqLCBjdXJyZW50LCBwdHIgKTsKICAgICAgICAgICAgaWYgKCAhYXN5bmMgKQogICAgICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICAgICAgYXN5bmMtPnN0YXR1cyA9IFNUQVRVU19QRU5ESU5HOwogICAgICAgICAgICBpZiAoICFhc3luYy0+cSApCiAgICAgICAgICAgICAgICBhc3luY19pbnNlcnQgKCBxLCBhc3luYyApOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKCBhc3luYyApIGRlc3Ryb3lfYXN5bmMgKCBhc3luYyApOwogICAgZWxzZSBzZXRfZXJyb3IgKCBTVEFUVVNfSU5WQUxJRF9QQVJBTUVURVIgKTsKCiAgICBwb2xsZXYgPSBzb2NrX3Jlc2VsZWN0ICggc29jayApOwogICAgaWYgKCBwb2xsZXYgKSBzb2NrX3RyeV9ldmVudCAoIHNvY2ssIHBvbGxldiApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2Rlc3Ryb3koIHN0cnVjdCBvYmplY3QgKm9iaiApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICAvKiBGSVhNRTogc3BlY2lhbCBzb2NrZXQgc2h1dGRvd24gc3R1ZmY/ICovCgogICAgaWYgKCBzb2NrLT5kZWZlcnJlZCApCiAgICAgICAgcmVsZWFzZV9vYmplY3QgKCBzb2NrLT5kZWZlcnJlZCApOwoKICAgIGlmICggc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEICkKICAgIHsKICAgICAgICBkZXN0cm95X2FzeW5jX3F1ZXVlICggJnNvY2stPnJlYWRfcSApOwogICAgICAgIGRlc3Ryb3lfYXN5bmNfcXVldWUgKCAmc29jay0+d3JpdGVfcSApOwogICAgfQogICAgaWYgKHNvY2stPmV2ZW50KSByZWxlYXNlX29iamVjdCggc29jay0+ZXZlbnQgKTsKfQoKLyogY3JlYXRlIGEgbmV3IGFuZCB1bmNvbm5lY3RlZCBzb2NrZXQgKi8Kc3RhdGljIHN0cnVjdCBvYmplY3QgKmNyZWF0ZV9zb2NrZXQoIGludCBmYW1pbHksIGludCB0eXBlLCBpbnQgcHJvdG9jb2wsIHVuc2lnbmVkIGludCBmbGFncyApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgaW50IHNvY2tmZDsKCiAgICBzb2NrZmQgPSBzb2NrZXQoIGZhbWlseSwgdHlwZSwgcHJvdG9jb2wgKTsKICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICBmcHJpbnRmKHN0ZGVyciwic29ja2V0KCVkLCVkLCVkKT0lZFxuIixmYW1pbHksdHlwZSxwcm90b2NvbCxzb2NrZmQpOwogICAgaWYgKHNvY2tmZCA9PSAtMSkgewogICAgICAgIHNvY2tfc2V0X2Vycm9yKCk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBmY250bChzb2NrZmQsIEZfU0VURkwsIE9fTk9OQkxPQ0spOyAvKiBtYWtlIHNvY2tldCBub25ibG9ja2luZyAqLwogICAgaWYgKCEoc29jayA9IGFsbG9jX29iamVjdCggJnNvY2tfb3BzLCAtMSApKSkgcmV0dXJuIE5VTEw7CiAgICBzb2NrLT5vYmouZmQgPSBzb2NrZmQ7CiAgICBzb2NrLT5zdGF0ZSA9ICh0eXBlICE9IFNPQ0tfU1RSRUFNKSA/IChGRF9SRUFEfEZEX1dSSVRFKSA6IDA7CiAgICBzb2NrLT5tYXNrICAgID0gMDsKICAgIHNvY2stPmhtYXNrICAgPSAwOwogICAgc29jay0+cG1hc2sgICA9IDA7CiAgICBzb2NrLT5mbGFncyAgID0gZmxhZ3M7CiAgICBzb2NrLT5ldmVudCAgID0gTlVMTDsKICAgIHNvY2stPndpbmRvdyAgPSAwOwogICAgc29jay0+bWVzc2FnZSA9IDA7CiAgICBzb2NrLT53cGFyYW0gID0gMDsKICAgIHNvY2stPmRlZmVycmVkID0gTlVMTDsKICAgIGlmIChzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQpCiAgICB7CiAgICAgICAgaW5pdF9hc3luY19xdWV1ZSAoJnNvY2stPnJlYWRfcSk7CiAgICAgICAgaW5pdF9hc3luY19xdWV1ZSAoJnNvY2stPndyaXRlX3EpOwogICAgfQogICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgY2xlYXJfZXJyb3IoKTsKICAgIHJldHVybiAmc29jay0+b2JqOwp9CgovKiBhY2NlcHQgYSBzb2NrZXQgKGNyZWF0ZXMgYSBuZXcgZmQpICovCnN0YXRpYyBzdHJ1Y3Qgc29jayAqYWNjZXB0X3NvY2tldCggaGFuZGxlX3QgaGFuZGxlICkKewogICAgc3RydWN0IHNvY2sgKmFjY2VwdHNvY2s7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludAlhY2NlcHRmZDsKICAgIHN0cnVjdCBzb2NrYWRkcglzYWRkcjsKICAgIGludAkJCXNsZW47CgogICAgc29jaz0oc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKGN1cnJlbnQtPnByb2Nlc3MsaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCZzb2NrX29wcyk7CiAgICBpZiAoIXNvY2spCiAgICAJcmV0dXJuIE5VTEw7CgogICAgaWYgKCBzb2NrLT5kZWZlcnJlZCApIHsKICAgICAgICBhY2NlcHRzb2NrID0gc29jay0+ZGVmZXJyZWQ7CiAgICAgICAgc29jay0+ZGVmZXJyZWQgPSBOVUxMOwogICAgfSBlbHNlIHsKCiAgICAgICAgLyogVHJ5IHRvIGFjY2VwdCgyKS4gV2UgY2FuJ3QgYmUgc2FmZSB0aGF0IHRoaXMgYW4gYWxyZWFkeSBjb25uZWN0ZWQgc29ja2V0CiAgICAgICAgICogb3IgdGhhdCBhY2NlcHQoKSBpcyBhbGxvd2VkIG9uIGl0LiBJbiB0aG9zZSBjYXNlcyB3ZSB3aWxsIGdldCAtMS9lcnJubwogICAgICAgICAqIHJldHVybi4KICAgICAgICAgKi8KICAgICAgICBzbGVuID0gc2l6ZW9mKHNhZGRyKTsKICAgICAgICBhY2NlcHRmZCA9IGFjY2VwdChzb2NrLT5vYmouZmQsJnNhZGRyLCZzbGVuKTsKICAgICAgICBpZiAoYWNjZXB0ZmQ9PS0xKSB7CiAgICAgICAgICAgIHNvY2tfc2V0X2Vycm9yKCk7CiAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgIH0KICAgICAgICBpZiAoIShhY2NlcHRzb2NrID0gYWxsb2Nfb2JqZWN0KCAmc29ja19vcHMsIC0xICkpKQogICAgICAgIHsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQoKICAgICAgICAvKiBuZXdseSBjcmVhdGVkIHNvY2tldCBnZXRzIHRoZSBzYW1lIHByb3BlcnRpZXMgb2YgdGhlIGxpc3RlbmluZyBzb2NrZXQgKi8KICAgICAgICBmY250bChhY2NlcHRmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7IC8qIG1ha2Ugc29ja2V0IG5vbmJsb2NraW5nICovCiAgICAgICAgYWNjZXB0c29jay0+b2JqLmZkID0gYWNjZXB0ZmQ7CiAgICAgICAgYWNjZXB0c29jay0+c3RhdGUgID0gRkRfV0lORV9DT05ORUNURUR8RkRfUkVBRHxGRF9XUklURTsKICAgICAgICBpZiAoc29jay0+c3RhdGUgJiBGRF9XSU5FX05PTkJMT0NLSU5HKQogICAgICAgICAgICBhY2NlcHRzb2NrLT5zdGF0ZSB8PSBGRF9XSU5FX05PTkJMT0NLSU5HOwogICAgICAgIGFjY2VwdHNvY2stPm1hc2sgICAgPSBzb2NrLT5tYXNrOwogICAgICAgIGFjY2VwdHNvY2stPmhtYXNrICAgPSAwOwogICAgICAgIGFjY2VwdHNvY2stPnBtYXNrICAgPSAwOwogICAgICAgIGFjY2VwdHNvY2stPmV2ZW50ICAgPSBOVUxMOwogICAgICAgIGFjY2VwdHNvY2stPndpbmRvdyAgPSBzb2NrLT53aW5kb3c7CiAgICAgICAgYWNjZXB0c29jay0+bWVzc2FnZSA9IHNvY2stPm1lc3NhZ2U7CiAgICAgICAgYWNjZXB0c29jay0+d3BhcmFtICA9IDA7CiAgICAgICAgaWYgKHNvY2stPmV2ZW50KSBhY2NlcHRzb2NrLT5ldmVudCA9IChzdHJ1Y3QgZXZlbnQgKilncmFiX29iamVjdCggc29jay0+ZXZlbnQgKTsKICAgICAgICBhY2NlcHRzb2NrLT5mbGFncyA9IHNvY2stPmZsYWdzOwogICAgICAgIGFjY2VwdHNvY2stPmRlZmVycmVkID0gMDsKICAgICAgICBpZiAoIGFjY2VwdHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCApCiAgICAgICAgewogICAgICAgICAgICBpbml0X2FzeW5jX3F1ZXVlICggJmFjY2VwdHNvY2stPnJlYWRfcSApOwogICAgICAgICAgICBpbml0X2FzeW5jX3F1ZXVlICggJmFjY2VwdHNvY2stPndyaXRlX3EgKTsKICAgICAgICB9CiAgICB9CiAgICBjbGVhcl9lcnJvcigpOwogICAgc29jay0+cG1hc2sgJj0gfkZEX0FDQ0VQVDsKICAgIHNvY2stPmhtYXNrICY9IH5GRF9BQ0NFUFQ7CiAgICBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgcmV0dXJuIGFjY2VwdHNvY2s7Cn0KCi8qIHNldCB0aGUgbGFzdCBlcnJvciBkZXBlbmRpbmcgb24gZXJybm8gKi8Kc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApCnsKICAgIHN3aXRjaCAoZXJyKQogICAgewogICAgICAgIGNhc2UgRUlOVFI6ICAgICAgICAgICAgIHJldHVybiBXU0FFSU5UUjsgYnJlYWs7CiAgICAgICAgY2FzZSBFQkFERjogICAgICAgICAgICAgcmV0dXJuIFdTQUVCQURGOyBicmVhazsKICAgICAgICBjYXNlIEVQRVJNOgogICAgICAgIGNhc2UgRUFDQ0VTOiAgICAgICAgICAgIHJldHVybiBXU0FFQUNDRVM7IGJyZWFrOwogICAgICAgIGNhc2UgRUZBVUxUOiAgICAgICAgICAgIHJldHVybiBXU0FFRkFVTFQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUlOVkFMOiAgICAgICAgICAgIHJldHVybiBXU0FFSU5WQUw7IGJyZWFrOwogICAgICAgIGNhc2UgRU1GSUxFOiAgICAgICAgICAgIHJldHVybiBXU0FFTUZJTEU7IGJyZWFrOwogICAgICAgIGNhc2UgRVdPVUxEQkxPQ0s6ICAgICAgIHJldHVybiBXU0FFV09VTERCTE9DSzsgYnJlYWs7CiAgICAgICAgY2FzZSBFSU5QUk9HUkVTUzogICAgICAgcmV0dXJuIFdTQUVJTlBST0dSRVNTOyBicmVhazsKICAgICAgICBjYXNlIEVBTFJFQURZOiAgICAgICAgICByZXR1cm4gV1NBRUFMUkVBRFk7IGJyZWFrOwogICAgICAgIGNhc2UgRU5PVFNPQ0s6ICAgICAgICAgIHJldHVybiBXU0FFTk9UU09DSzsgYnJlYWs7CiAgICAgICAgY2FzZSBFREVTVEFERFJSRVE6ICAgICAgcmV0dXJuIFdTQUVERVNUQUREUlJFUTsgYnJlYWs7CiAgICAgICAgY2FzZSBFTVNHU0laRTogICAgICAgICAgcmV0dXJuIFdTQUVNU0dTSVpFOyBicmVhazsKICAgICAgICBjYXNlIEVQUk9UT1RZUEU6ICAgICAgICByZXR1cm4gV1NBRVBST1RPVFlQRTsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9QUk9UT09QVDogICAgICAgcmV0dXJuIFdTQUVOT1BST1RPT1BUOyBicmVhazsKICAgICAgICBjYXNlIEVQUk9UT05PU1VQUE9SVDogICByZXR1cm4gV1NBRVBST1RPTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVTT0NLVE5PU1VQUE9SVDogICByZXR1cm4gV1NBRVNPQ0tUTk9TVVBQT1JUOyBicmVhazsKICAgICAgICBjYXNlIEVPUE5PVFNVUFA6ICAgICAgICByZXR1cm4gV1NBRU9QTk9UU1VQUDsgYnJlYWs7CiAgICAgICAgY2FzZSBFUEZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVQRk5PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVBRk5PU1VQUE9SVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQUREUklOVVNFOiAgICAgICAgcmV0dXJuIFdTQUVBRERSSU5VU0U7IGJyZWFrOwogICAgICAgIGNhc2UgRUFERFJOT1RBVkFJTDogICAgIHJldHVybiBXU0FFQUREUk5PVEFWQUlMOyBicmVhazsKICAgICAgICBjYXNlIEVORVRET1dOOiAgICAgICAgICByZXR1cm4gV1NBRU5FVERPV047IGJyZWFrOwogICAgICAgIGNhc2UgRU5FVFVOUkVBQ0g6ICAgICAgIHJldHVybiBXU0FFTkVUVU5SRUFDSDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkVUUkVTRVQ6ICAgICAgICAgcmV0dXJuIFdTQUVORVRSRVNFVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFQ09OTkFCT1JURUQ6ICAgICAgcmV0dXJuIFdTQUVDT05OQUJPUlRFRDsgYnJlYWs7CiAgICAgICAgY2FzZSBFUElQRToKICAgICAgICBjYXNlIEVDT05OUkVTRVQ6ICAgICAgICByZXR1cm4gV1NBRUNPTk5SRVNFVDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9CVUZTOiAgICAgICAgICAgcmV0dXJuIFdTQUVOT0JVRlM7IGJyZWFrOwogICAgICAgIGNhc2UgRUlTQ09OTjogICAgICAgICAgIHJldHVybiBXU0FFSVNDT05OOyBicmVhazsKICAgICAgICBjYXNlIEVOT1RDT05OOiAgICAgICAgICByZXR1cm4gV1NBRU5PVENPTk47IGJyZWFrOwogICAgICAgIGNhc2UgRVNIVVRET1dOOiAgICAgICAgIHJldHVybiBXU0FFU0hVVERPV047IGJyZWFrOwogICAgICAgIGNhc2UgRVRPT01BTllSRUZTOiAgICAgIHJldHVybiBXU0FFVE9PTUFOWVJFRlM7IGJyZWFrOwogICAgICAgIGNhc2UgRVRJTUVET1VUOiAgICAgICAgIHJldHVybiBXU0FFVElNRURPVVQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUNPTk5SRUZVU0VEOiAgICAgIHJldHVybiBXU0FFQ09OTlJFRlVTRUQ7IGJyZWFrOwogICAgICAgIGNhc2UgRUxPT1A6ICAgICAgICAgICAgIHJldHVybiBXU0FFTE9PUDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTkFNRVRPT0xPTkc6ICAgICAgcmV0dXJuIFdTQUVOQU1FVE9PTE9ORzsgYnJlYWs7CiAgICAgICAgY2FzZSBFSE9TVERPV046ICAgICAgICAgcmV0dXJuIFdTQUVIT1NURE9XTjsgYnJlYWs7CiAgICAgICAgY2FzZSBFSE9TVFVOUkVBQ0g6ICAgICAgcmV0dXJuIFdTQUVIT1NUVU5SRUFDSDsgYnJlYWs7CiAgICAgICAgY2FzZSBFTk9URU1QVFk6ICAgICAgICAgcmV0dXJuIFdTQUVOT1RFTVBUWTsgYnJlYWs7CiNpZmRlZiBFUFJPQ0xJTQogICAgICAgIGNhc2UgRVBST0NMSU06ICAgICAgICAgIHJldHVybiBXU0FFUFJPQ0xJTTsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVVTRVJTCiAgICAgICAgY2FzZSBFVVNFUlM6ICAgICAgICAgICAgcmV0dXJuIFdTQUVVU0VSUzsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRURRVU9UCiAgICAgICAgY2FzZSBFRFFVT1Q6ICAgICAgICAgICAgcmV0dXJuIFdTQUVEUVVPVDsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVNUQUxFCiAgICAgICAgY2FzZSBFU1RBTEU6ICAgICAgICAgICAgcmV0dXJuIFdTQUVTVEFMRTsgYnJlYWs7CiNlbmRpZgojaWZkZWYgRVJFTU9URQogICAgICAgIGNhc2UgRVJFTU9URTogICAgICAgICAgIHJldHVybiBXU0FFUkVNT1RFOyBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OiBlcnJubz1lcnI7IHBlcnJvcigic29ja19zZXRfZXJyb3IiKTsgcmV0dXJuIEVSUk9SX1VOS05PV047IGJyZWFrOwogICAgfQp9CgovKiBzZXQgdGhlIGxhc3QgZXJyb3IgZGVwZW5kaW5nIG9uIGVycm5vICovCnN0YXRpYyB2b2lkIHNvY2tfc2V0X2Vycm9yKHZvaWQpCnsKICAgIHNldF9lcnJvciggc29ja19nZXRfZXJyb3IoIGVycm5vICkgKTsKfQoKLyogY3JlYXRlIGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihjcmVhdGVfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICpvYmo7CgogICAgcmVwbHktPmhhbmRsZSA9IDA7CiAgICBpZiAoKG9iaiA9IGNyZWF0ZV9zb2NrZXQoIHJlcS0+ZmFtaWx5LCByZXEtPnR5cGUsIHJlcS0+cHJvdG9jb2wsIHJlcS0+ZmxhZ3MgKSkgIT0gTlVMTCkKICAgIHsKICAgICAgICByZXBseS0+aGFuZGxlID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCBvYmosIHJlcS0+YWNjZXNzLCByZXEtPmluaGVyaXQgKTsKICAgICAgICByZWxlYXNlX29iamVjdCggb2JqICk7CiAgICB9Cn0KCi8qIGFjY2VwdCBhIHNvY2tldCAqLwpERUNMX0hBTkRMRVIoYWNjZXB0X3NvY2tldCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CgogICAgcmVwbHktPmhhbmRsZSA9IDA7CiAgICBpZiAoKHNvY2sgPSBhY2NlcHRfc29ja2V0KCByZXEtPmxoYW5kbGUgKSkgIT0gTlVMTCkKICAgIHsKICAgICAgICByZXBseS0+aGFuZGxlID0gYWxsb2NfaGFuZGxlKCBjdXJyZW50LT5wcm9jZXNzLCAmc29jay0+b2JqLCByZXEtPmFjY2VzcywgcmVxLT5pbmhlcml0ICk7CiAgICAgICAgc29jay0+d3BhcmFtID0gcmVwbHktPmhhbmRsZTsgIC8qIHdwYXJhbSBmb3IgbWVzc2FnZSBpcyB0aGUgc29ja2V0IGhhbmRsZSAqLwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgICAgICByZWxlYXNlX29iamVjdCggJnNvY2stPm9iaiApOwogICAgfQp9CgovKiBzZXQgc29ja2V0IGV2ZW50IHBhcmFtZXRlcnMgKi8KREVDTF9IQU5ETEVSKHNldF9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgc3RydWN0IGV2ZW50ICpvbGRfZXZlbnQ7CiAgICBpbnQgcG9sbGV2OwoKICAgIGlmICghKHNvY2sgPSAoc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCByZXEtPmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwgJnNvY2tfb3BzKSkpCiAgICAgICAgcmV0dXJuOwogICAgb2xkX2V2ZW50ID0gc29jay0+ZXZlbnQ7CiAgICBzb2NrLT5tYXNrICAgID0gcmVxLT5tYXNrOwogICAgc29jay0+ZXZlbnQgICA9IE5VTEw7CiAgICBzb2NrLT53aW5kb3cgID0gcmVxLT53aW5kb3c7CiAgICBzb2NrLT5tZXNzYWdlID0gcmVxLT5tc2c7CiAgICBzb2NrLT53cGFyYW0gID0gcmVxLT5oYW5kbGU7ICAvKiB3cGFyYW0gaXMgdGhlIHNvY2tldCBoYW5kbGUgKi8KICAgIGlmIChyZXEtPmV2ZW50KSBzb2NrLT5ldmVudCA9IGdldF9ldmVudF9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+ZXZlbnQsIEVWRU5UX01PRElGWV9TVEFURSApOwoKICAgIGlmIChkZWJ1Z19sZXZlbCAmJiBzb2NrLT5ldmVudCkgZnByaW50ZihzdGRlcnIsICJldmVudCBwdHI6ICVwXG4iLCBzb2NrLT5ldmVudCk7CgogICAgcG9sbGV2ID0gc29ja19yZXNlbGVjdCggc29jayApOwogICAgaWYgKCBwb2xsZXYgKSBzb2NrX3RyeV9ldmVudCAoIHNvY2ssIHBvbGxldiApOwoKICAgIGlmIChzb2NrLT5tYXNrKQogICAgICAgIHNvY2stPnN0YXRlIHw9IEZEX1dJTkVfTk9OQkxPQ0tJTkc7CgogICAgLyogaWYgYSBuZXR3b3JrIGV2ZW50IGlzIHBlbmRpbmcsIHNpZ25hbCB0aGUgZXZlbnQgb2JqZWN0IAogICAgICAgaXQgaXMgcG9zc2libGUgdGhhdCBGRF9DT05ORUNUIG9yIEZEX0FDQ0VQVCBuZXR3b3JrIGV2ZW50cyBoYXMgaGFwcGVuZWQKICAgICAgIGJlZm9yZSBhIFdTQUV2ZW50U2VsZWN0KCkgd2FzIGRvbmUgb24gaXQuIAogICAgICAgKHdoZW4gZGVhbGluZyB3aXRoIEFzeW5jaHJvbm91cyBzb2NrZXQpICAqLwogICAgaWYgKHNvY2stPnBtYXNrICYgc29jay0+bWFzaykgc29ja193YWtlX3VwKCBzb2NrLCBwb2xsZXYgKTsKCiAgICBpZiAob2xkX2V2ZW50KSByZWxlYXNlX29iamVjdCggb2xkX2V2ZW50ICk7IC8qIHdlJ3JlIHRocm91Z2ggd2l0aCBpdCAqLwogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKLyogZ2V0IHNvY2tldCBldmVudCBwYXJhbWV0ZXJzICovCkRFQ0xfSEFORExFUihnZXRfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooY3VycmVudC0+cHJvY2VzcyxyZXEtPmhhbmRsZSxHRU5FUklDX1JFQUR8R0VORVJJQ19XUklURXxTWU5DSFJPTklaRSwmc29ja19vcHMpOwogICAgaWYgKCFzb2NrKQogICAgewogICAgICAgIHJlcGx5LT5tYXNrICA9IDA7CiAgICAgICAgcmVwbHktPnBtYXNrID0gMDsKICAgICAgICByZXBseS0+c3RhdGUgPSAwOwogICAgICAgIHNldF9lcnJvciggV1NBRU5PVFNPQ0sgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICByZXBseS0+bWFzayAgPSBzb2NrLT5tYXNrOwogICAgcmVwbHktPnBtYXNrID0gc29jay0+cG1hc2s7CiAgICByZXBseS0+c3RhdGUgPSBzb2NrLT5zdGF0ZTsKICAgIHNldF9yZXBseV9kYXRhKCBzb2NrLT5lcnJvcnMsIG1pbiggZ2V0X3JlcGx5X21heF9zaXplKCksIHNpemVvZihzb2NrLT5lcnJvcnMpICkpOwoKICAgIGlmIChyZXEtPnNlcnZpY2UpCiAgICB7CiAgICAgICAgaWYgKHJlcS0+Y19ldmVudCkKICAgICAgICB7CiAgICAgICAgICAgIHN0cnVjdCBldmVudCAqY2V2ZW50ID0gZ2V0X2V2ZW50X29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5jX2V2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWRU5UX01PRElGWV9TVEFURSApOwogICAgICAgICAgICBpZiAoY2V2ZW50KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICByZXNldF9ldmVudCggY2V2ZW50ICk7CiAgICAgICAgICAgICAgICByZWxlYXNlX29iamVjdCggY2V2ZW50ICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc29jay0+cG1hc2sgPSAwOwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIH0KICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7Cn0KCi8qIHJlLWVuYWJsZSBwZW5kaW5nIHNvY2tldCBldmVudHMgKi8KREVDTF9IQU5ETEVSKGVuYWJsZV9zb2NrZXRfZXZlbnQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrOwogICAgaW50IHBvbGxldjsKCiAgICBpZiAoIShzb2NrID0gKHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VORVJJQ19SRUFEfEdFTkVSSUNfV1JJVEV8U1lOQ0hST05JWkUsICZzb2NrX29wcykpKQogICAgICAgIHJldHVybjsKCiAgICBzb2NrLT5wbWFzayAmPSB+cmVxLT5tYXNrOyAvKiBpcyB0aGlzIHNhZmU/ICovCiAgICBzb2NrLT5obWFzayAmPSB+cmVxLT5tYXNrOwogICAgaWYgKCByZXEtPm1hc2sgJiBGRF9SRUFEICkKICAgICAgICBzb2NrLT5obWFzayAmPSB+RkRfQ0xPU0U7CiAgICBzb2NrLT5zdGF0ZSB8PSByZXEtPnNzdGF0ZTsKICAgIHNvY2stPnN0YXRlICY9IH5yZXEtPmNzdGF0ZTsKCiAgICBwb2xsZXYgPSBzb2NrX3Jlc2VsZWN0KCBzb2NrICk7CiAgICBpZiAoIHBvbGxldiApIHNvY2tfdHJ5X2V2ZW50ICggc29jaywgcG9sbGV2ICk7CgogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKREVDTF9IQU5ETEVSKHNldF9zb2NrZXRfZGVmZXJyZWQpCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrLCAqYWNjZXB0c29jazsKCiAgICBzb2NrPShzdHJ1Y3Qgc29jayopZ2V0X2hhbmRsZV9vYmooIGN1cnJlbnQtPnByb2Nlc3MscmVxLT5oYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCZzb2NrX29wcyApOwogICAgaWYgKCAhc29jayApCiAgICB7CiAgICAgICAgc2V0X2Vycm9yICggV1NBRU5PVFNPQ0sgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBhY2NlcHRzb2NrID0gKHN0cnVjdCBzb2NrKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcyxyZXEtPmRlZmVycmVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFTkVSSUNfUkVBRHxHRU5FUklDX1dSSVRFfFNZTkNIUk9OSVpFLCZzb2NrX29wcyApOwogICAgaWYgKCAhYWNjZXB0c29jayApCiAgICB7CiAgICAgICAgcmVsZWFzZV9vYmplY3QgKCBzb2NrICk7CiAgICAgICAgc2V0X2Vycm9yICggV1NBRU5PVFNPQ0sgKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBzb2NrLT5kZWZlcnJlZCA9IGFjY2VwdHNvY2s7CiAgICByZWxlYXNlX29iamVjdCAoIHNvY2sgKTsKfQo=