LyoKICogU2VydmVyLXNpZGUgc29ja2V0IG1hbmFnZW1lbnQKICoKICogQ29weXJpZ2h0IChDKSAxOTk5IE1hcmN1cyBNZWlzc25lciwgT3ZlIEvldmVuCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKgogKiBGSVhNRTogd2UgdXNlIHJlYWR8d3JpdGUgYWNjZXNzIGluIGFsbCBjYXNlcy4gU2hvdWxkbid0IHdlIGRlcGVuZCB0aGF0CiAqIG9uIHRoZSBhY2Nlc3Mgb2YgdGhlIGN1cnJlbnQgaGFuZGxlPwogKi8KCiNpbmNsdWRlICJjb25maWcuaCIKCiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2lmZGVmIEhBVkVfU1lTX0VSUk5PX0gKIyBpbmNsdWRlIDxzeXMvZXJybm8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdGltZS5oPgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZmRlZiBIQVZFX1NZU19TT0NLRVRfSAojIGluY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX1NZU19GSUxJT19ICiMgaW5jbHVkZSA8c3lzL2ZpbGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8dW5pc3RkLmg+CgojaW5jbHVkZSAibnRzdGF0dXMuaCIKI2RlZmluZSBXSU4zMl9OT19TVEFUVVMKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2ludGVybmwuaCIKCiNpbmNsdWRlICJwcm9jZXNzLmgiCiNpbmNsdWRlICJmaWxlLmgiCiNpbmNsdWRlICJoYW5kbGUuaCIKI2luY2x1ZGUgInRocmVhZC5oIgojaW5jbHVkZSAicmVxdWVzdC5oIgojaW5jbHVkZSAidXNlci5oIgoKLyogVG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIFVuaXggc29ja2V0IGhlYWRlcnMuIFBsdXMgd2Ugb25seSBuZWVkIGEgZmV3CiAqIG1hY3JvcyBhbnl3YXkuCiAqLwojZGVmaW5lIFVTRV9XU19QUkVGSVgKI2luY2x1ZGUgIndpbnNvY2syLmgiCgpzdHJ1Y3Qgc29jawp7CiAgICBzdHJ1Y3Qgb2JqZWN0ICAgICAgIG9iajsgICAgICAgICAvKiBvYmplY3QgaGVhZGVyICovCiAgICBzdHJ1Y3QgZmQgICAgICAgICAgKmZkOyAgICAgICAgICAvKiBzb2NrZXQgZmlsZSBkZXNjcmlwdG9yICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHN0YXRlOyAgICAgICAvKiBzdGF0dXMgYml0cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBtYXNrOyAgICAgICAgLyogZXZlbnQgbWFzayAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBobWFzazsgICAgICAgLyogaGVsZCAoYmxvY2tlZCkgZXZlbnRzICovCiAgICB1bnNpZ25lZCBpbnQgICAgICAgIHBtYXNrOyAgICAgICAvKiBwZW5kaW5nIGV2ZW50cyAqLwogICAgdW5zaWduZWQgaW50ICAgICAgICBmbGFnczsgICAgICAgLyogc29ja2V0IGZsYWdzICovCiAgICBpbnQgICAgICAgICAgICAgICAgIHBvbGxpbmc7ICAgICAvKiBpcyBzb2NrZXQgYmVpbmcgcG9sbGVkPyAqLwogICAgdW5zaWduZWQgc2hvcnQgICAgICB0eXBlOyAgICAgICAgLyogc29ja2V0IHR5cGUgKi8KICAgIHVuc2lnbmVkIHNob3J0ICAgICAgZmFtaWx5OyAgICAgIC8qIHNvY2tldCBmYW1pbHkgKi8KICAgIHN0cnVjdCBldmVudCAgICAgICAqZXZlbnQ7ICAgICAgIC8qIGV2ZW50IG9iamVjdCAqLwogICAgdXNlcl9oYW5kbGVfdCAgICAgICB3aW5kb3c7ICAgICAgLyogd2luZG93IHRvIHNlbmQgdGhlIG1lc3NhZ2UgdG8gKi8KICAgIHVuc2lnbmVkIGludCAgICAgICAgbWVzc2FnZTsgICAgIC8qIG1lc3NhZ2UgdG8gc2VuZCAqLwogICAgb2JqX2hhbmRsZV90ICAgICAgICB3cGFyYW07ICAgICAgLyogbWVzc2FnZSB3cGFyYW0gKHNvY2tldCBoYW5kbGUpICovCiAgICBpbnQgICAgICAgICAgICAgICAgIGVycm9yc1tGRF9NQVhfRVZFTlRTXTsgLyogZXZlbnQgZXJyb3JzICovCiAgICBzdHJ1Y3Qgc29jayAgICAgICAgKmRlZmVycmVkOyAgICAvKiBzb2NrZXQgdGhhdCB3YWl0cyBmb3IgYSBkZWZlcnJlZCBhY2NlcHQgKi8KICAgIHN0cnVjdCBsaXN0ICAgICAgICAgcmVhZF9xOyAgICAgIC8qIHF1ZXVlIGZvciBhc3luY2hyb25vdXMgcmVhZHMgKi8KICAgIHN0cnVjdCBsaXN0ICAgICAgICAgd3JpdGVfcTsgICAgIC8qIHF1ZXVlIGZvciBhc3luY2hyb25vdXMgd3JpdGVzICovCn07CgpzdGF0aWMgdm9pZCBzb2NrX2R1bXAoIHN0cnVjdCBvYmplY3QgKm9iaiwgaW50IHZlcmJvc2UgKTsKc3RhdGljIGludCBzb2NrX3NpZ25hbGVkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHN0cnVjdCB0aHJlYWQgKnRocmVhZCApOwpzdGF0aWMgc3RydWN0IGZkICpzb2NrX2dldF9mZCggc3RydWN0IG9iamVjdCAqb2JqICk7CnN0YXRpYyB1bnNpZ25lZCBpbnQgc29ja19tYXBfYWNjZXNzKCBzdHJ1Y3Qgb2JqZWN0ICpvYmosIHVuc2lnbmVkIGludCBhY2Nlc3MgKTsKc3RhdGljIHZvaWQgc29ja19kZXN0cm95KCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKTsKCnN0YXRpYyBpbnQgc29ja19nZXRfcG9sbF9ldmVudHMoIHN0cnVjdCBmZCAqZmQgKTsKc3RhdGljIHZvaWQgc29ja19wb2xsX2V2ZW50KCBzdHJ1Y3QgZmQgKmZkLCBpbnQgZXZlbnQgKTsKc3RhdGljIGludCBzb2NrX2dldF9pbmZvKCBzdHJ1Y3QgZmQgKmZkICk7CnN0YXRpYyB2b2lkIHNvY2tfcXVldWVfYXN5bmMoIHN0cnVjdCBmZCAqZmQsIHZvaWQgKmFwYywgdm9pZCAqdXNlciwgdm9pZCAqaW9zYiwgaW50IHR5cGUsIGludCBjb3VudCApOwpzdGF0aWMgdm9pZCBzb2NrX2NhbmNlbF9hc3luYyggc3RydWN0IGZkICpmZCApOwoKc3RhdGljIGludCBzb2NrX2dldF9lcnJvciggaW50IGVyciApOwpzdGF0aWMgdm9pZCBzb2NrX3NldF9lcnJvcih2b2lkKTsKCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgb2JqZWN0X29wcyBzb2NrX29wcyA9CnsKICAgIHNpemVvZihzdHJ1Y3Qgc29jayksICAgICAgICAgIC8qIHNpemUgKi8KICAgIHNvY2tfZHVtcCwgICAgICAgICAgICAgICAgICAgIC8qIGR1bXAgKi8KICAgIGFkZF9xdWV1ZSwgICAgICAgICAgICAgICAgICAgIC8qIGFkZF9xdWV1ZSAqLwogICAgcmVtb3ZlX3F1ZXVlLCAgICAgICAgICAgICAgICAgLyogcmVtb3ZlX3F1ZXVlICovCiAgICBzb2NrX3NpZ25hbGVkLCAgICAgICAgICAgICAgICAvKiBzaWduYWxlZCAqLwogICAgbm9fc2F0aXNmaWVkLCAgICAgICAgICAgICAgICAgLyogc2F0aXNmaWVkICovCiAgICBub19zaWduYWwsICAgICAgICAgICAgICAgICAgICAvKiBzaWduYWwgKi8KICAgIHNvY2tfZ2V0X2ZkLCAgICAgICAgICAgICAgICAgIC8qIGdldF9mZCAqLwogICAgc29ja19tYXBfYWNjZXNzLCAgICAgICAgICAgICAgLyogbWFwX2FjY2VzcyAqLwogICAgbm9fbG9va3VwX25hbWUsICAgICAgICAgICAgICAgLyogbG9va3VwX25hbWUgKi8KICAgIG5vX2Nsb3NlX2hhbmRsZSwgICAgICAgICAgICAgIC8qIGNsb3NlX2hhbmRsZSAqLwogICAgc29ja19kZXN0cm95ICAgICAgICAgICAgICAgICAgLyogZGVzdHJveSAqLwp9OwoKc3RhdGljIGNvbnN0IHN0cnVjdCBmZF9vcHMgc29ja19mZF9vcHMgPQp7CiAgICBzb2NrX2dldF9wb2xsX2V2ZW50cywgICAgICAgICAvKiBnZXRfcG9sbF9ldmVudHMgKi8KICAgIHNvY2tfcG9sbF9ldmVudCwgICAgICAgICAgICAgIC8qIHBvbGxfZXZlbnQgKi8KICAgIG5vX2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgIC8qIGZsdXNoICovCiAgICBzb2NrX2dldF9pbmZvLCAgICAgICAgICAgICAgICAvKiBnZXRfZmlsZV9pbmZvICovCiAgICBzb2NrX3F1ZXVlX2FzeW5jLCAgICAgICAgICAgICAvKiBxdWV1ZV9hc3luYyAqLwogICAgc29ja19jYW5jZWxfYXN5bmMgICAgICAgICAgICAgLyogY2FuY2VsX2FzeW5jICovCn07CgoKLyogUGVybXV0YXRpb24gb2YgMC4uRkRfTUFYX0VWRU5UUyAtIDEgcmVwcmVzZW50aW5nIHRoZSBvcmRlciBpbiB3aGljaAogKiB3ZSBwb3N0IG1lc3NhZ2VzIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBldmVudHMuICBVc2VkIHRvIHNlbmQKICogbWVzc2FnZXMuICBUaGUgcHJvYmxlbSBpcyBpZiB0aGVyZSBpcyBib3RoIGEgRkRfQ09OTkVDVCBldmVudCBhbmQsCiAqIHNheSwgYW4gRkRfUkVBRCBldmVudCBhdmFpbGFibGUgb24gdGhlIHNhbWUgc29ja2V0LCB3ZSB3YW50IHRvCiAqIG5vdGlmeSB0aGUgYXBwIG9mIHRoZSBjb25uZWN0IGV2ZW50IGZpcnN0LiAgT3RoZXJ3aXNlIGl0IG1heQogKiBkaXNjYXJkIHRoZSByZWFkIGV2ZW50IGJlY2F1c2UgaXQgdGhpbmtzIGl0IGhhc24ndCBjb25uZWN0ZWQgeWV0LgogKi8Kc3RhdGljIGNvbnN0IGludCBldmVudF9iaXRvcmRlcltGRF9NQVhfRVZFTlRTXSA9CnsKICAgIEZEX0NPTk5FQ1RfQklULAogICAgRkRfQUNDRVBUX0JJVCwKICAgIEZEX09PQl9CSVQsCiAgICBGRF9XUklURV9CSVQsCiAgICBGRF9SRUFEX0JJVCwKICAgIEZEX0NMT1NFX0JJVCwKICAgIDYsIDcsIDgsIDkgIC8qIGxlZnRvdmVycyAqLwp9OwoKLyogRmxhZ3MgdGhhdCBtYWtlIHNlbnNlIG9ubHkgZm9yIFNPQ0tfU1RSRUFNIHNvY2tldHMgKi8KI2RlZmluZSBTVFJFQU1fRkxBR19NQVNLICgodW5zaWduZWQgaW50KSAoRkRfQ09OTkVDVCB8IEZEX0FDQ0VQVCB8IEZEX1dJTkVfTElTVEVOSU5HIHwgRkRfV0lORV9DT05ORUNURUQpKQoKdHlwZWRlZiBlbnVtIHsKICAgIFNPQ0tfU0hVVERPV05fRVJST1IgPSAtMSwKICAgIFNPQ0tfU0hVVERPV05fRU9GID0gMCwKICAgIFNPQ0tfU0hVVERPV05fUE9MTEhVUCA9IDEKfSBzb2NrX3NodXRkb3duX3Q7CgpzdGF0aWMgc29ja19zaHV0ZG93bl90IHNvY2tfc2h1dGRvd25fdHlwZSA9IFNPQ0tfU0hVVERPV05fRVJST1I7CgpzdGF0aWMgc29ja19zaHV0ZG93bl90IHNvY2tfY2hlY2tfcG9sbGh1cCh2b2lkKQp7CiAgICBzb2NrX3NodXRkb3duX3QgcmV0ID0gU09DS19TSFVURE9XTl9FUlJPUjsKICAgIGludCBmZFsyXSwgbjsKICAgIHN0cnVjdCBwb2xsZmQgcGZkOwogICAgY2hhciBkdW1teTsKCiAgICBpZiAoIHNvY2tldHBhaXIoIEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwLCBmZCApICkgZ290byBvdXQ7CiAgICBpZiAoIHNodXRkb3duKCBmZFswXSwgMSApICkgZ290byBvdXQ7CgogICAgcGZkLmZkID0gZmRbMV07CiAgICBwZmQuZXZlbnRzID0gUE9MTElOOwogICAgcGZkLnJldmVudHMgPSAwOwoKICAgIG4gPSBwb2xsKCAmcGZkLCAxLCAwICk7CiAgICBpZiAoIG4gIT0gMSApIGdvdG8gb3V0OyAvKiBlcnJvciBvciB0aW1lb3V0ICovCiAgICBpZiAoIHBmZC5yZXZlbnRzICYgUE9MTEhVUCApCiAgICAgICAgcmV0ID0gU09DS19TSFVURE9XTl9QT0xMSFVQOwogICAgZWxzZSBpZiAoIHBmZC5yZXZlbnRzICYgUE9MTElOICYmCiAgICAgICAgICAgICAgcmVhZCggZmRbMV0sICZkdW1teSwgMSApID09IDAgKQogICAgICAgIHJldCA9IFNPQ0tfU0hVVERPV05fRU9GOwoKb3V0OgogICAgY2xvc2UoIGZkWzBdICk7CiAgICBjbG9zZSggZmRbMV0gKTsKICAgIHJldHVybiByZXQ7Cn0KCnZvaWQgc29ja19pbml0KHZvaWQpCnsKICAgIHNvY2tfc2h1dGRvd25fdHlwZSA9IHNvY2tfY2hlY2tfcG9sbGh1cCgpOwoKICAgIHN3aXRjaCAoIHNvY2tfc2h1dGRvd25fdHlwZSApCiAgICB7CiAgICBjYXNlIFNPQ0tfU0hVVERPV05fRU9GOgogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50Ziggc3RkZXJyLCAic29ja19pbml0OiBzaHV0ZG93bigpIGNhdXNlcyBFT0ZcbiIgKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgU09DS19TSFVURE9XTl9QT0xMSFVQOgogICAgICAgIGlmIChkZWJ1Z19sZXZlbCkgZnByaW50Ziggc3RkZXJyLCAic29ja19pbml0OiBzaHV0ZG93bigpIGNhdXNlcyBQT0xMSFVQXG4iICk7CiAgICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAgIGZwcmludGYoIHN0ZGVyciwgInNvY2tfaW5pdDogRVJST1IgaW4gc29ja19jaGVja19wb2xsaHVwKClcbiIgKTsKICAgICAgICBzb2NrX3NodXRkb3duX3R5cGUgPSBTT0NLX1NIVVRET1dOX0VPRjsKICAgIH0KfQoKc3RhdGljIGludCBzb2NrX3Jlc2VsZWN0KCBzdHJ1Y3Qgc29jayAqc29jayApCnsKICAgIGludCBldiA9IHNvY2tfZ2V0X3BvbGxfZXZlbnRzKCBzb2NrLT5mZCApOwoKICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICBmcHJpbnRmKHN0ZGVyciwic29ja19yZXNlbGVjdCglcCk6IG5ldyBtYXNrICV4XG4iLCBzb2NrLCBldik7CgogICAgaWYgKCFzb2NrLT5wb2xsaW5nKSAgLyogRklYTUU6IHNob3VsZCBmaW5kIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzICovCiAgICB7CiAgICAgICAgLyogcHJldmlvdXNseSB1bmNvbm5lY3RlZCBzb2NrZXQsIGlzIHRoaXMgcmVzZWxlY3Qgc3VwcG9zZWQgdG8gY29ubmVjdCBpdD8gKi8KICAgICAgICBpZiAoIShzb2NrLT5zdGF0ZSAmIH5GRF9XSU5FX05PTkJMT0NLSU5HKSkgcmV0dXJuIDA7CiAgICAgICAgLyogb2ssIGl0IGlzLCBhdHRhY2ggaXQgdG8gdGhlIHdpbmVzZXJ2ZXIncyBtYWluIHBvbGwgbG9vcCAqLwogICAgICAgIHNvY2stPnBvbGxpbmcgPSAxOwogICAgfQogICAgLyogdXBkYXRlIGNvbmRpdGlvbiBtYXNrICovCiAgICBzZXRfZmRfZXZlbnRzKCBzb2NrLT5mZCwgZXYgKTsKICAgIHJldHVybiBldjsKfQoKLyogQWZ0ZXIgUE9MTEhVUCBpcyByZWNlaXZlZCwgdGhlIHNvY2tldCB3aWxsIG5vIGxvbmdlciBiZSBpbiB0aGUgbWFpbiBzZWxlY3QgbG9vcC4KICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHNpZ25hbCBwZW5kaW5nIGV2ZW50cyBuZXZlcnRoZWxlc3MgKi8Kc3RhdGljIHZvaWQgc29ja190cnlfZXZlbnQoIHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgZXZlbnQgKQp7CiAgICBldmVudCA9IGNoZWNrX2ZkX2V2ZW50cyggc29jay0+ZmQsIGV2ZW50ICk7CiAgICBpZiAoZXZlbnQpCiAgICB7CiAgICAgICAgaWYgKCBkZWJ1Z19sZXZlbCApIGZwcmludGYoIHN0ZGVyciwgInNvY2tfdHJ5X2V2ZW50OiAleFxuIiwgZXZlbnQgKTsKICAgICAgICBzb2NrX3BvbGxfZXZlbnQoIHNvY2stPmZkLCBldmVudCApOwogICAgfQp9CgovKiB3YWtlIGFueWJvZHkgd2FpdGluZyBvbiB0aGUgc29ja2V0IGV2ZW50IG9yIHNlbmQgdGhlIGFzc29jaWF0ZWQgbWVzc2FnZSAqLwpzdGF0aWMgdm9pZCBzb2NrX3dha2VfdXAoIHN0cnVjdCBzb2NrICpzb2NrLCBpbnQgcG9sbGV2ICkKewogICAgdW5zaWduZWQgaW50IGV2ZW50cyA9IHNvY2stPnBtYXNrICYgc29jay0+bWFzazsKICAgIGludCBpOwogICAgaW50IGFzeW5jX2FjdGl2ZSA9IDA7CgogICAgaWYgKCBzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQgKQogICAgewogICAgICAgIGlmICggcG9sbGV2ICYgKFBPTExJTnxQT0xMUFJJKSAmJiAhbGlzdF9lbXB0eSggJnNvY2stPnJlYWRfcSApKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmKCBzdGRlcnIsICJhY3RpdmF0aW5nIHJlYWQgcXVldWUgZm9yIHNvY2tldCAlcFxuIiwgc29jayApOwogICAgICAgICAgICBhc3luY190ZXJtaW5hdGVfaGVhZCggJnNvY2stPnJlYWRfcSwgU1RBVFVTX0FMRVJURUQgKTsKICAgICAgICAgICAgYXN5bmNfYWN0aXZlID0gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCBwb2xsZXYgJiBQT0xMT1VUICYmICFsaXN0X2VtcHR5KCAmc29jay0+d3JpdGVfcSApKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKSBmcHJpbnRmKCBzdGRlcnIsICJhY3RpdmF0aW5nIHdyaXRlIHF1ZXVlIGZvciBzb2NrZXQgJXBcbiIsIHNvY2sgKTsKICAgICAgICAgICAgYXN5bmNfdGVybWluYXRlX2hlYWQoICZzb2NrLT53cml0ZV9xLCBTVEFUVVNfQUxFUlRFRCApOwogICAgICAgICAgICBhc3luY19hY3RpdmUgPSAxOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBEbyBub3Qgc2lnbmFsIGV2ZW50cyBpZiB0aGVyZSBhcmUgc3RpbGwgcGVuZGluZyBhc3luY2hyb25vdXMgSU8gcmVxdWVzdHMgKi8KICAgIC8qIFdlIG5lZWQgdGhpcyB0byBkZWxheSBGRF9DTE9TRSBldmVudHMgdW50aWwgYWxsIHBlbmRpbmcgb3ZlcmxhcHBlZCByZXF1ZXN0cyBhcmUgcHJvY2Vzc2VkICovCiAgICBpZiAoICFldmVudHMgfHwgYXN5bmNfYWN0aXZlICkgcmV0dXJuOwoKICAgIGlmIChzb2NrLT5ldmVudCkKICAgIHsKICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYoc3RkZXJyLCAic2lnbmFsbGluZyBldmVudHMgJXggcHRyICVwXG4iLCBldmVudHMsIHNvY2stPmV2ZW50ICk7CiAgICAgICAgc2V0X2V2ZW50KCBzb2NrLT5ldmVudCApOwogICAgfQogICAgaWYgKHNvY2stPndpbmRvdykKICAgIHsKICAgICAgICBpZiAoZGVidWdfbGV2ZWwpIGZwcmludGYoc3RkZXJyLCAic2lnbmFsbGluZyBldmVudHMgJXggd2luICVwXG4iLCBldmVudHMsIHNvY2stPndpbmRvdyApOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBGRF9NQVhfRVZFTlRTOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBpbnQgZXZlbnQgPSBldmVudF9iaXRvcmRlcltpXTsKICAgICAgICAgICAgaWYgKHNvY2stPnBtYXNrICYgKDEgPDwgZXZlbnQpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbHBhcmFtID0gKDEgPDwgZXZlbnQpIHwgKHNvY2stPmVycm9yc1tldmVudF0gPDwgMTYpOwogICAgICAgICAgICAgICAgcG9zdF9tZXNzYWdlKCBzb2NrLT53aW5kb3csIHNvY2stPm1lc3NhZ2UsICh1bnNpZ25lZCBsb25nKXNvY2stPndwYXJhbSwgbHBhcmFtICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc29jay0+cG1hc2sgPSAwOwogICAgICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIH0KfQoKaW5saW5lIHN0YXRpYyBpbnQgc29ja19lcnJvciggc3RydWN0IGZkICpmZCApCnsKICAgIHVuc2lnbmVkIGludCBvcHR2YWwgPSAwLCBvcHRsZW47CgogICAgb3B0bGVuID0gc2l6ZW9mKG9wdHZhbCk7CiAgICBnZXRzb2Nrb3B0KCBnZXRfdW5peF9mZChmZCksIFNPTF9TT0NLRVQsIFNPX0VSUk9SLCAodm9pZCAqKSAmb3B0dmFsLCAmb3B0bGVuKTsKICAgIHJldHVybiBvcHR2YWwgPyBzb2NrX2dldF9lcnJvcihvcHR2YWwpIDogMDsKfQoKc3RhdGljIHZvaWQgc29ja19wb2xsX2V2ZW50KCBzdHJ1Y3QgZmQgKmZkLCBpbnQgZXZlbnQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IGdldF9mZF91c2VyKCBmZCApOwogICAgaW50IGhhbmd1cF9zZWVuID0gMDsKCiAgICBhc3NlcnQoIHNvY2stPm9iai5vcHMgPT0gJnNvY2tfb3BzICk7CiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgc2VsZWN0IGV2ZW50OiAleFxuIiwgc29jaywgZXZlbnQpOwogICAgaWYgKHNvY2stPnN0YXRlICYgRkRfQ09OTkVDVCkKICAgIHsKICAgICAgICAvKiBjb25uZWN0aW5nICovCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTE9VVCkKICAgICAgICB7CiAgICAgICAgICAgIC8qIHdlIGdvdCBjb25uZWN0ZWQgKi8KICAgICAgICAgICAgc29jay0+c3RhdGUgfD0gRkRfV0lORV9DT05ORUNURUR8RkRfUkVBRHxGRF9XUklURTsKICAgICAgICAgICAgc29jay0+c3RhdGUgJj0gfkZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX0NPTk5FQ1Q7CiAgICAgICAgICAgIHNvY2stPmVycm9yc1tGRF9DT05ORUNUX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBjb25uZWN0aW9uIHN1Y2Nlc3NcbiIsIHNvY2spOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChldmVudCAmIChQT0xMRVJSfFBPTExIVVApKQogICAgICAgIHsKICAgICAgICAgICAgLyogd2UgZGlkbid0IGdldCBjb25uZWN0ZWQ/ICovCiAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5GRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9DT05ORUNUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ09OTkVDVF9CSVRdID0gc29ja19lcnJvciggZmQgKTsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgY29ubmVjdGlvbiBmYWlsdXJlXG4iLCBzb2NrKTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIGlmIChzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfTElTVEVOSU5HKQogICAgewogICAgICAgIC8qIGxpc3RlbmluZyAqLwogICAgICAgIGlmIChldmVudCAmIFBPTExJTikKICAgICAgICB7CiAgICAgICAgICAgIC8qIGluY29taW5nIGNvbm5lY3Rpb24gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSAwOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGV2ZW50ICYgKFBPTExFUlJ8UE9MTEhVUCkpCiAgICAgICAgewogICAgICAgICAgICAvKiBmYWlsZWQgaW5jb21pbmcgY29ubmVjdGlvbj8gKi8KICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQUNDRVBUOwogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQUNDRVBUX0JJVF0gPSBzb2NrX2Vycm9yKCBmZCApOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9BQ0NFUFQ7CiAgICAgICAgfQogICAgfQogICAgZWxzZQogICAgewogICAgICAgIC8qIG5vcm1hbCBkYXRhIGZsb3cgKi8KICAgICAgICBpZiAoIHNvY2stPnR5cGUgPT0gU09DS19TVFJFQU0gJiYgKCBldmVudCAmIFBPTExJTiApICkKICAgICAgICB7CiAgICAgICAgICAgIGNoYXIgZHVtbXk7CiAgICAgICAgICAgIGludCBucjsKCiAgICAgICAgICAgIC8qIExpbnV4IDIuNCBkb2Vzbid0IHJlcG9ydCBQT0xMSFVQIGlmIG9ubHkgb25lIHNpZGUgb2YgdGhlIHNvY2tldAogICAgICAgICAgICAgKiBoYXMgYmVlbiBjbG9zZWQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgZm9yIGl0IGV4cGxpY2l0bHkgaGVyZSAqLwogICAgICAgICAgICBuciAgPSByZWN2KCBnZXRfdW5peF9mZCggZmQgKSwgJmR1bW15LCAxLCBNU0dfUEVFSyApOwogICAgICAgICAgICBpZiAoIG5yID4gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIC8qIGluY29taW5nIGRhdGEgKi8KICAgICAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1JFQUQ7CiAgICAgICAgICAgICAgICBzb2NrLT5obWFzayB8PSAoRkRfUkVBRHxGRF9DTE9TRSk7CiAgICAgICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfUkVBRF9CSVRdID0gMDsKICAgICAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBpcyByZWFkYWJsZVxuIiwgc29jayApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCBuciA9PSAwICkKICAgICAgICAgICAgICAgIGhhbmd1cF9zZWVuID0gMTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAvKiBFQUdBSU4gY2FuIGhhcHBlbiBpZiBhbiBhc3luYyByZWN2KCkgZmFsbHMgYmV0d2VlbiB0aGUgc2VydmVyJ3MgcG9sbCgpCiAgICAgICAgICAgICAgICAgICBjYWxsIGFuZCB0aGUgaW52b2NhdGlvbiBvZiB0aGlzIHJvdXRpbmUgKi8KICAgICAgICAgICAgICAgIGlmICggZXJybm8gPT0gRUFHQUlOICkKICAgICAgICAgICAgICAgICAgICBldmVudCAmPSB+UE9MTElOOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGlmICggZGVidWdfbGV2ZWwgKQogICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBzdGRlcnIsICJyZWN2IGVycm9yIG9uIHNvY2tldCAlcDogJWRcbiIsIHNvY2ssIGVycm5vICk7CiAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSBQT0xMRVJSOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICBlbHNlIGlmICggc29ja19zaHV0ZG93bl90eXBlID09IFNPQ0tfU0hVVERPV05fUE9MTEhVUCAmJiAoZXZlbnQgJiBQT0xMSFVQKSApCiAgICAgICAgewogICAgICAgICAgICBoYW5ndXBfc2VlbiA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCBldmVudCAmIFBPTExJTiApIC8qIFBPTExJTiBmb3Igbm9uLXN0cmVhbSBzb2NrZXQgKi8KICAgICAgICB7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1JFQUQ7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IChGRF9SRUFEfEZEX0NMT1NFKTsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1JFQURfQklUXSA9IDA7CiAgICAgICAgICAgIGlmIChkZWJ1Z19sZXZlbCkKICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAic29ja2V0ICVwIGlzIHJlYWRhYmxlXG4iLCBzb2NrICk7CgogICAgICAgIH0KCiAgICAgICAgaWYgKGV2ZW50ICYgUE9MTE9VVCkKICAgICAgICB7CiAgICAgICAgICAgIHNvY2stPnBtYXNrIHw9IEZEX1dSSVRFOwogICAgICAgICAgICBzb2NrLT5obWFzayB8PSBGRF9XUklURTsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX1dSSVRFX0JJVF0gPSAwOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBpcyB3cml0YWJsZVxuIiwgc29jayk7CiAgICAgICAgfQogICAgICAgIGlmIChldmVudCAmIFBPTExQUkkpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5wbWFzayB8PSBGRF9PT0I7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX09PQjsKICAgICAgICAgICAgc29jay0+ZXJyb3JzW0ZEX09PQl9CSVRdID0gMDsKICAgICAgICAgICAgaWYgKGRlYnVnX2xldmVsKQogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJzb2NrZXQgJXAgZ290IE9PQiBkYXRhXG4iLCBzb2NrKTsKICAgICAgICB9CiAgICAgICAgLyogQWNjb3JkaW5nIHRvIFdTMiBzcGVjcywgRkRfQ0xPU0UgaXMgb25seSBkZWxpdmVyZWQgd2hlbiB0aGVyZSBpcwogICAgICAgICAgIG5vIG1vcmUgZGF0YSB0byBiZSByZWFkIChpLmUuIGhhbmd1cF9zZWVuID0gMSkgKi8KICAgICAgICBlbHNlIGlmICggaGFuZ3VwX3NlZW4gJiYgKHNvY2stPnN0YXRlICYgKEZEX1JFQUR8RkRfV1JJVEUpICkpCiAgICAgICAgewogICAgICAgICAgICBzb2NrLT5lcnJvcnNbRkRfQ0xPU0VfQklUXSA9IHNvY2tfZXJyb3IoIGZkICk7CiAgICAgICAgICAgIGlmICggKGV2ZW50ICYgUE9MTEVSUikgfHwgKCBzb2NrX3NodXRkb3duX3R5cGUgPT0gU09DS19TSFVURE9XTl9FT0YgJiYgKGV2ZW50ICYgUE9MTEhVUCkgKSkKICAgICAgICAgICAgICAgIHNvY2stPnN0YXRlICY9IH5GRF9XUklURTsKICAgICAgICAgICAgc29jay0+cG1hc2sgfD0gRkRfQ0xPU0U7CiAgICAgICAgICAgIHNvY2stPmhtYXNrIHw9IEZEX0NMT1NFOwogICAgICAgICAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNvY2tldCAlcCBhYm9ydGVkIGJ5IGVycm9yICVkLCBldmVudDogJXggLSByZW1vdmluZyBmcm9tIHNlbGVjdCBsb29wXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBzb2NrLCBzb2NrLT5lcnJvcnNbRkRfQ0xPU0VfQklUXSwgZXZlbnQpOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHNvY2stPnBtYXNrICYgRkRfQ0xPU0UgfHwgZXZlbnQgJiAoUE9MTEVSUnxQT0xMSFVQKSApCiAgICB7CiAgICAgICAgaWYgKCBkZWJ1Z19sZXZlbCApCiAgICAgICAgICAgIGZwcmludGYoIHN0ZGVyciwgInJlbW92aW5nIHNvY2tldCAlcCBmcm9tIHNlbGVjdCBsb29wXG4iLCBzb2NrICk7CiAgICAgICAgc2V0X2ZkX2V2ZW50cyggc29jay0+ZmQsIC0xICk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgc29ja19yZXNlbGVjdCggc29jayApOwoKICAgIC8qIHdha2UgdXAgYW55b25lIHdhaXRpbmcgZm9yIHdoYXRldmVyIGp1c3QgaGFwcGVuZWQgKi8KICAgIGlmICggc29jay0+cG1hc2sgJiBzb2NrLT5tYXNrIHx8IHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCApIHNvY2tfd2FrZV91cCggc29jaywgZXZlbnQgKTsKCiAgICAvKiBpZiBhbnlvbmUgaXMgc3R1cGlkIGVub3VnaCB0byB3YWl0IG9uIHRoZSBzb2NrZXQgb2JqZWN0IGl0c2VsZiwKICAgICAqIG1heWJlIHdlIHNob3VsZCB3YWtlIHRoZW0gdXAgdG9vLCBqdXN0IGluIGNhc2U/ICovCiAgICB3YWtlX3VwKCAmc29jay0+b2JqLCAwICk7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfZHVtcCggc3RydWN0IG9iamVjdCAqb2JqLCBpbnQgdmVyYm9zZSApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gKHN0cnVjdCBzb2NrICopb2JqOwogICAgYXNzZXJ0KCBvYmotPm9wcyA9PSAmc29ja19vcHMgKTsKICAgIHByaW50ZiggIlNvY2tldCBmZD0lcCwgc3RhdGU9JXgsIG1hc2s9JXgsIHBlbmRpbmc9JXgsIGhlbGQ9JXhcbiIsCiAgICAgICAgICAgIHNvY2stPmZkLCBzb2NrLT5zdGF0ZSwKICAgICAgICAgICAgc29jay0+bWFzaywgc29jay0+cG1hc2ssIHNvY2stPmhtYXNrICk7Cn0KCnN0YXRpYyBpbnQgc29ja19zaWduYWxlZCggc3RydWN0IG9iamVjdCAqb2JqLCBzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIGFzc2VydCggb2JqLT5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgcmV0dXJuIGNoZWNrX2ZkX2V2ZW50cyggc29jay0+ZmQsIHNvY2tfZ2V0X3BvbGxfZXZlbnRzKCBzb2NrLT5mZCApICkgIT0gMDsKfQoKc3RhdGljIHVuc2lnbmVkIGludCBzb2NrX21hcF9hY2Nlc3MoIHN0cnVjdCBvYmplY3QgKm9iaiwgdW5zaWduZWQgaW50IGFjY2VzcyApCnsKICAgIGlmIChhY2Nlc3MgJiBHRU5FUklDX1JFQUQpICAgIGFjY2VzcyB8PSBGSUxFX0dFTkVSSUNfUkVBRDsKICAgIGlmIChhY2Nlc3MgJiBHRU5FUklDX1dSSVRFKSAgIGFjY2VzcyB8PSBGSUxFX0dFTkVSSUNfV1JJVEU7CiAgICBpZiAoYWNjZXNzICYgR0VORVJJQ19FWEVDVVRFKSBhY2Nlc3MgfD0gRklMRV9HRU5FUklDX0VYRUNVVEU7CiAgICBpZiAoYWNjZXNzICYgR0VORVJJQ19BTEwpICAgICBhY2Nlc3MgfD0gRklMRV9BTExfQUNDRVNTOwogICAgcmV0dXJuIGFjY2VzcyAmIH4oR0VORVJJQ19SRUFEIHwgR0VORVJJQ19XUklURSB8IEdFTkVSSUNfRVhFQ1VURSB8IEdFTkVSSUNfQUxMKTsKfQoKc3RhdGljIGludCBzb2NrX2dldF9wb2xsX2V2ZW50cyggc3RydWN0IGZkICpmZCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gZ2V0X2ZkX3VzZXIoIGZkICk7CiAgICB1bnNpZ25lZCBpbnQgbWFzayA9IHNvY2stPm1hc2sgJiBzb2NrLT5zdGF0ZSAmIH5zb2NrLT5obWFzazsKICAgIGludCBldiA9IDA7CgogICAgYXNzZXJ0KCBzb2NrLT5vYmoub3BzID09ICZzb2NrX29wcyApOwoKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX0NPTk5FQ1QpCiAgICAgICAgLyogY29ubmVjdGluZywgd2FpdCBmb3Igd3JpdGFibGUgKi8KICAgICAgICByZXR1cm4gUE9MTE9VVDsKICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfTElTVEVOSU5HKQogICAgICAgIC8qIGxpc3RlbmluZywgd2FpdCBmb3IgcmVhZGFibGUgKi8KICAgICAgICByZXR1cm4gKHNvY2stPmhtYXNrICYgRkRfQUNDRVBUKSA/IDAgOiBQT0xMSU47CgogICAgaWYgKG1hc2sgJiAoRkRfUkVBRCkgfHwgKHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCAmJiAhbGlzdF9lbXB0eSggJnNvY2stPnJlYWRfcSApKSkKICAgICAgICBldiB8PSBQT0xMSU4gfCBQT0xMUFJJOwogICAgaWYgKG1hc2sgJiBGRF9XUklURSB8fCAoc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEICYmICFsaXN0X2VtcHR5KCAmc29jay0+d3JpdGVfcSApKSkKICAgICAgICBldiB8PSBQT0xMT1VUOwogICAgLyogV2UgdXNlIFBPTExJTiB3aXRoIDAgYnl0ZXMgcmVjdigpIGFzIEZEX0NMT1NFIGluZGljYXRpb24gZm9yIHN0cmVhbSBzb2NrZXRzLiAqLwogICAgaWYgKCBzb2NrLT50eXBlID09IFNPQ0tfU1RSRUFNICYmICggc29jay0+bWFzayAmIH5zb2NrLT5obWFzayAmIEZEX0NMT1NFKSApCiAgICAgICAgZXYgfD0gUE9MTElOOwoKICAgIHJldHVybiBldjsKfQoKc3RhdGljIGludCBzb2NrX2dldF9pbmZvKCBzdHJ1Y3QgZmQgKmZkICkKewogICAgaW50IGZsYWdzID0gRkRfRkxBR19BVkFJTEFCTEU7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IGdldF9mZF91c2VyKCBmZCApOwogICAgYXNzZXJ0KCBzb2NrLT5vYmoub3BzID09ICZzb2NrX29wcyApOwoKICAgIGlmIChzb2NrLT5mbGFncyAmIFdTQV9GTEFHX09WRVJMQVBQRUQpIGZsYWdzIHw9IEZEX0ZMQUdfT1ZFUkxBUFBFRDsKICAgIGlmICggc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSB8fCBzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfQ09OTkVDVEVEICkKICAgIHsKICAgICAgICBpZiAoICEoc29jay0+c3RhdGUgJiBGRF9SRUFEICApICkgZmxhZ3MgfD0gRkRfRkxBR19SRUNWX1NIVVRET1dOOwogICAgICAgIGlmICggIShzb2NrLT5zdGF0ZSAmIEZEX1dSSVRFICkgKSBmbGFncyB8PSBGRF9GTEFHX1NFTkRfU0hVVERPV047CiAgICB9CiAgICByZXR1cm4gZmxhZ3M7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfcXVldWVfYXN5bmMoIHN0cnVjdCBmZCAqZmQsIHZvaWQgKmFwYywgdm9pZCAqdXNlciwgdm9pZCAqaW9zYiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGludCBjb3VudCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gZ2V0X2ZkX3VzZXIoIGZkICk7CiAgICBzdHJ1Y3QgbGlzdCAqcXVldWU7CiAgICBpbnQgcG9sbGV2OwoKICAgIGFzc2VydCggc29jay0+b2JqLm9wcyA9PSAmc29ja19vcHMgKTsKCiAgICBpZiAoICEoc29jay0+ZmxhZ3MgJiBXU0FfRkxBR19PVkVSTEFQUEVEKSApCiAgICB7CiAgICAgICAgc2V0X2Vycm9yKCBTVEFUVVNfSU5WQUxJRF9IQU5ETEUgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgc3dpdGNoICh0eXBlKQogICAgewogICAgY2FzZSBBU1lOQ19UWVBFX1JFQUQ6CiAgICAgICAgcXVldWUgPSAmc29jay0+cmVhZF9xOwogICAgICAgIHNvY2stPmhtYXNrICY9IH5GRF9DTE9TRTsKICAgICAgICBicmVhazsKICAgIGNhc2UgQVNZTkNfVFlQRV9XUklURToKICAgICAgICBxdWV1ZSA9ICZzb2NrLT53cml0ZV9xOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBzZXRfZXJyb3IoIFNUQVRVU19JTlZBTElEX1BBUkFNRVRFUiApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICggISggc29jay0+c3RhdGUgJiBGRF9SRUFEICkgJiYgdHlwZSA9PSBBU1lOQ19UWVBFX1JFQUQgICkgfHwKICAgICAgICAgKCAhKCBzb2NrLT5zdGF0ZSAmIEZEX1dSSVRFICkgJiYgdHlwZSA9PSBBU1lOQ19UWVBFX1dSSVRFICkgKQogICAgewogICAgICAgIHNldF9lcnJvciggU1RBVFVTX1BJUEVfRElTQ09OTkVDVEVEICk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgaWYgKCFjcmVhdGVfYXN5bmMoIGN1cnJlbnQsIE5VTEwsIHF1ZXVlLCBhcGMsIHVzZXIsIGlvc2IgKSkKICAgICAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHBvbGxldiA9IHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIGlmICggcG9sbGV2ICkgc29ja190cnlfZXZlbnQoIHNvY2ssIHBvbGxldiApOwp9CgpzdGF0aWMgdm9pZCBzb2NrX2NhbmNlbF9hc3luYyggc3RydWN0IGZkICpmZCApCnsKICAgIHN0cnVjdCBzb2NrICpzb2NrID0gZ2V0X2ZkX3VzZXIoIGZkICk7CiAgICBhc3NlcnQoIHNvY2stPm9iai5vcHMgPT0gJnNvY2tfb3BzICk7CgogICAgYXN5bmNfdGVybWluYXRlX3F1ZXVlKCAmc29jay0+cmVhZF9xLCBTVEFUVVNfQ0FOQ0VMTEVEICk7CiAgICBhc3luY190ZXJtaW5hdGVfcXVldWUoICZzb2NrLT53cml0ZV9xLCBTVEFUVVNfQ0FOQ0VMTEVEICk7Cn0KCnN0YXRpYyBzdHJ1Y3QgZmQgKnNvY2tfZ2V0X2ZkKCBzdHJ1Y3Qgb2JqZWN0ICpvYmogKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jayA9IChzdHJ1Y3Qgc29jayAqKW9iajsKICAgIHJldHVybiAoc3RydWN0IGZkICopZ3JhYl9vYmplY3QoIHNvY2stPmZkICk7Cn0KCnN0YXRpYyB2b2lkIHNvY2tfZGVzdHJveSggc3RydWN0IG9iamVjdCAqb2JqICkKewogICAgc3RydWN0IHNvY2sgKnNvY2sgPSAoc3RydWN0IHNvY2sgKilvYmo7CiAgICBhc3NlcnQoIG9iai0+b3BzID09ICZzb2NrX29wcyApOwoKICAgIC8qIEZJWE1FOiBzcGVjaWFsIHNvY2tldCBzaHV0ZG93biBzdHVmZj8gKi8KCiAgICBpZiAoIHNvY2stPmRlZmVycmVkICkKICAgICAgICByZWxlYXNlX29iamVjdCggc29jay0+ZGVmZXJyZWQgKTsKCiAgICBpZiAoIHNvY2stPmZsYWdzICYgV1NBX0ZMQUdfT1ZFUkxBUFBFRCApCiAgICB7CiAgICAgICAgYXN5bmNfdGVybWluYXRlX3F1ZXVlKCAmc29jay0+cmVhZF9xLCBTVEFUVVNfQ0FOQ0VMTEVEICk7CiAgICAgICAgYXN5bmNfdGVybWluYXRlX3F1ZXVlKCAmc29jay0+d3JpdGVfcSwgU1RBVFVTX0NBTkNFTExFRCApOwogICAgfQogICAgaWYgKHNvY2stPmV2ZW50KSByZWxlYXNlX29iamVjdCggc29jay0+ZXZlbnQgKTsKICAgIGlmIChzb2NrLT5mZCkgcmVsZWFzZV9vYmplY3QoIHNvY2stPmZkICk7Cn0KCi8qIGNyZWF0ZSBhIG5ldyBhbmQgdW5jb25uZWN0ZWQgc29ja2V0ICovCnN0YXRpYyBzdHJ1Y3Qgb2JqZWN0ICpjcmVhdGVfc29ja2V0KCBpbnQgZmFtaWx5LCBpbnQgdHlwZSwgaW50IHByb3RvY29sLCB1bnNpZ25lZCBpbnQgZmxhZ3MgKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKICAgIGludCBzb2NrZmQ7CgogICAgc29ja2ZkID0gc29ja2V0KCBmYW1pbHksIHR5cGUsIHByb3RvY29sICk7CiAgICBpZiAoZGVidWdfbGV2ZWwpCiAgICAgICAgZnByaW50ZihzdGRlcnIsInNvY2tldCglZCwlZCwlZCk9JWRcbiIsZmFtaWx5LHR5cGUscHJvdG9jb2wsc29ja2ZkKTsKICAgIGlmIChzb2NrZmQgPT0gLTEpCiAgICB7CiAgICAgICAgc29ja19zZXRfZXJyb3IoKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGZjbnRsKHNvY2tmZCwgRl9TRVRGTCwgT19OT05CTE9DSyk7IC8qIG1ha2Ugc29ja2V0IG5vbmJsb2NraW5nICovCiAgICBpZiAoIShzb2NrID0gYWxsb2Nfb2JqZWN0KCAmc29ja19vcHMgKSkpCiAgICB7CiAgICAgICAgY2xvc2UoIHNvY2tmZCApOwogICAgICAgIHJldHVybiBOVUxMOwogICAgfQogICAgc29jay0+c3RhdGUgPSAodHlwZSAhPSBTT0NLX1NUUkVBTSkgPyAoRkRfUkVBRHxGRF9XUklURSkgOiAwOwogICAgc29jay0+bWFzayAgICA9IDA7CiAgICBzb2NrLT5obWFzayAgID0gMDsKICAgIHNvY2stPnBtYXNrICAgPSAwOwogICAgc29jay0+cG9sbGluZyA9IDA7CiAgICBzb2NrLT5mbGFncyAgID0gZmxhZ3M7CiAgICBzb2NrLT50eXBlICAgID0gdHlwZTsKICAgIHNvY2stPmZhbWlseSAgPSBmYW1pbHk7CiAgICBzb2NrLT5ldmVudCAgID0gTlVMTDsKICAgIHNvY2stPndpbmRvdyAgPSAwOwogICAgc29jay0+bWVzc2FnZSA9IDA7CiAgICBzb2NrLT53cGFyYW0gID0gMDsKICAgIHNvY2stPmRlZmVycmVkID0gTlVMTDsKICAgIGlmICghKHNvY2stPmZkID0gY3JlYXRlX2Fub255bW91c19mZCggJnNvY2tfZmRfb3BzLCBzb2NrZmQsICZzb2NrLT5vYmogKSkpCiAgICB7CiAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGxpc3RfaW5pdCggJnNvY2stPnJlYWRfcSApOwogICAgbGlzdF9pbml0KCAmc29jay0+d3JpdGVfcSApOwogICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgY2xlYXJfZXJyb3IoKTsKICAgIHJldHVybiAmc29jay0+b2JqOwp9CgovKiBhY2NlcHQgYSBzb2NrZXQgKGNyZWF0ZXMgYSBuZXcgZmQpICovCnN0YXRpYyBzdHJ1Y3Qgc29jayAqYWNjZXB0X3NvY2tldCggb2JqX2hhbmRsZV90IGhhbmRsZSApCnsKICAgIHN0cnVjdCBzb2NrICphY2NlcHRzb2NrOwogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBpbnQJYWNjZXB0ZmQ7CiAgICBzdHJ1Y3Qgc29ja2FkZHIJc2FkZHI7CgogICAgc29jayA9IChzdHJ1Y3Qgc29jayAqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCBoYW5kbGUsIEZJTEVfUkVBRF9EQVRBLCAmc29ja19vcHMgKTsKICAgIGlmICghc29jaykKICAgIAlyZXR1cm4gTlVMTDsKCiAgICBpZiAoIHNvY2stPmRlZmVycmVkICkKICAgIHsKICAgICAgICBhY2NlcHRzb2NrID0gc29jay0+ZGVmZXJyZWQ7CiAgICAgICAgc29jay0+ZGVmZXJyZWQgPSBOVUxMOwogICAgfQogICAgZWxzZQogICAgewoKICAgICAgICAvKiBUcnkgdG8gYWNjZXB0KDIpLiBXZSBjYW4ndCBiZSBzYWZlIHRoYXQgdGhpcyBhbiBhbHJlYWR5IGNvbm5lY3RlZCBzb2NrZXQKICAgICAgICAgKiBvciB0aGF0IGFjY2VwdCgpIGlzIGFsbG93ZWQgb24gaXQuIEluIHRob3NlIGNhc2VzIHdlIHdpbGwgZ2V0IC0xL2Vycm5vCiAgICAgICAgICogcmV0dXJuLgogICAgICAgICAqLwogICAgICAgIHVuc2lnbmVkIGludCBzbGVuID0gc2l6ZW9mKHNhZGRyKTsKICAgICAgICBhY2NlcHRmZCA9IGFjY2VwdCggZ2V0X3VuaXhfZmQoc29jay0+ZmQpLCAmc2FkZHIsICZzbGVuKTsKICAgICAgICBpZiAoYWNjZXB0ZmQ9PS0xKQogICAgICAgIHsKICAgICAgICAgICAgc29ja19zZXRfZXJyb3IoKTsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGlmICghKGFjY2VwdHNvY2sgPSBhbGxvY19vYmplY3QoICZzb2NrX29wcyApKSkKICAgICAgICB7CiAgICAgICAgICAgIGNsb3NlKCBhY2NlcHRmZCApOwogICAgICAgICAgICByZWxlYXNlX29iamVjdCggc29jayApOwogICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICB9CgogICAgICAgIC8qIG5ld2x5IGNyZWF0ZWQgc29ja2V0IGdldHMgdGhlIHNhbWUgcHJvcGVydGllcyBvZiB0aGUgbGlzdGVuaW5nIHNvY2tldCAqLwogICAgICAgIGZjbnRsKGFjY2VwdGZkLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsgLyogbWFrZSBzb2NrZXQgbm9uYmxvY2tpbmcgKi8KICAgICAgICBhY2NlcHRzb2NrLT5zdGF0ZSAgPSBGRF9XSU5FX0NPTk5FQ1RFRHxGRF9SRUFEfEZEX1dSSVRFOwogICAgICAgIGlmIChzb2NrLT5zdGF0ZSAmIEZEX1dJTkVfTk9OQkxPQ0tJTkcpCiAgICAgICAgICAgIGFjY2VwdHNvY2stPnN0YXRlIHw9IEZEX1dJTkVfTk9OQkxPQ0tJTkc7CiAgICAgICAgYWNjZXB0c29jay0+bWFzayAgICA9IHNvY2stPm1hc2s7CiAgICAgICAgYWNjZXB0c29jay0+aG1hc2sgICA9IDA7CiAgICAgICAgYWNjZXB0c29jay0+cG1hc2sgICA9IDA7CiAgICAgICAgYWNjZXB0c29jay0+cG9sbGluZyA9IDA7CiAgICAgICAgYWNjZXB0c29jay0+dHlwZSAgICA9IHNvY2stPnR5cGU7CiAgICAgICAgYWNjZXB0c29jay0+ZmFtaWx5ICA9IHNvY2stPmZhbWlseTsKICAgICAgICBhY2NlcHRzb2NrLT5ldmVudCAgID0gTlVMTDsKICAgICAgICBhY2NlcHRzb2NrLT53aW5kb3cgID0gc29jay0+d2luZG93OwogICAgICAgIGFjY2VwdHNvY2stPm1lc3NhZ2UgPSBzb2NrLT5tZXNzYWdlOwogICAgICAgIGFjY2VwdHNvY2stPndwYXJhbSAgPSAwOwogICAgICAgIGlmIChzb2NrLT5ldmVudCkgYWNjZXB0c29jay0+ZXZlbnQgPSAoc3RydWN0IGV2ZW50ICopZ3JhYl9vYmplY3QoIHNvY2stPmV2ZW50ICk7CiAgICAgICAgYWNjZXB0c29jay0+ZmxhZ3MgPSBzb2NrLT5mbGFnczsKICAgICAgICBhY2NlcHRzb2NrLT5kZWZlcnJlZCA9IE5VTEw7CiAgICAgICAgaWYgKCEoYWNjZXB0c29jay0+ZmQgPSBjcmVhdGVfYW5vbnltb3VzX2ZkKCAmc29ja19mZF9vcHMsIGFjY2VwdGZkLCAmYWNjZXB0c29jay0+b2JqICkpKQogICAgICAgIHsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIGFjY2VwdHNvY2sgKTsKICAgICAgICAgICAgcmVsZWFzZV9vYmplY3QoIHNvY2sgKTsKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgfQogICAgICAgIGxpc3RfaW5pdCggJmFjY2VwdHNvY2stPnJlYWRfcSApOwogICAgICAgIGxpc3RfaW5pdCggJmFjY2VwdHNvY2stPndyaXRlX3EgKTsKICAgIH0KICAgIGNsZWFyX2Vycm9yKCk7CiAgICBzb2NrLT5wbWFzayAmPSB+RkRfQUNDRVBUOwogICAgc29jay0+aG1hc2sgJj0gfkZEX0FDQ0VQVDsKICAgIHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICByZXR1cm4gYWNjZXB0c29jazsKfQoKLyogc2V0IHRoZSBsYXN0IGVycm9yIGRlcGVuZGluZyBvbiBlcnJubyAqLwpzdGF0aWMgaW50IHNvY2tfZ2V0X2Vycm9yKCBpbnQgZXJyICkKewogICAgc3dpdGNoIChlcnIpCiAgICB7CiAgICAgICAgY2FzZSBFSU5UUjogICAgICAgICAgICAgcmV0dXJuIFdTQUVJTlRSOwogICAgICAgIGNhc2UgRUJBREY6ICAgICAgICAgICAgIHJldHVybiBXU0FFQkFERjsKICAgICAgICBjYXNlIEVQRVJNOgogICAgICAgIGNhc2UgRUFDQ0VTOiAgICAgICAgICAgIHJldHVybiBXU0FFQUNDRVM7CiAgICAgICAgY2FzZSBFRkFVTFQ6ICAgICAgICAgICAgcmV0dXJuIFdTQUVGQVVMVDsKICAgICAgICBjYXNlIEVJTlZBTDogICAgICAgICAgICByZXR1cm4gV1NBRUlOVkFMOwogICAgICAgIGNhc2UgRU1GSUxFOiAgICAgICAgICAgIHJldHVybiBXU0FFTUZJTEU7CiAgICAgICAgY2FzZSBFV09VTERCTE9DSzogICAgICAgcmV0dXJuIFdTQUVXT1VMREJMT0NLOwogICAgICAgIGNhc2UgRUlOUFJPR1JFU1M6ICAgICAgIHJldHVybiBXU0FFSU5QUk9HUkVTUzsKICAgICAgICBjYXNlIEVBTFJFQURZOiAgICAgICAgICByZXR1cm4gV1NBRUFMUkVBRFk7CiAgICAgICAgY2FzZSBFTk9UU09DSzogICAgICAgICAgcmV0dXJuIFdTQUVOT1RTT0NLOwogICAgICAgIGNhc2UgRURFU1RBRERSUkVROiAgICAgIHJldHVybiBXU0FFREVTVEFERFJSRVE7CiAgICAgICAgY2FzZSBFTVNHU0laRTogICAgICAgICAgcmV0dXJuIFdTQUVNU0dTSVpFOwogICAgICAgIGNhc2UgRVBST1RPVFlQRTogICAgICAgIHJldHVybiBXU0FFUFJPVE9UWVBFOwogICAgICAgIGNhc2UgRU5PUFJPVE9PUFQ6ICAgICAgIHJldHVybiBXU0FFTk9QUk9UT09QVDsKICAgICAgICBjYXNlIEVQUk9UT05PU1VQUE9SVDogICByZXR1cm4gV1NBRVBST1RPTk9TVVBQT1JUOwogICAgICAgIGNhc2UgRVNPQ0tUTk9TVVBQT1JUOiAgIHJldHVybiBXU0FFU09DS1ROT1NVUFBPUlQ7CiAgICAgICAgY2FzZSBFT1BOT1RTVVBQOiAgICAgICAgcmV0dXJuIFdTQUVPUE5PVFNVUFA7CiAgICAgICAgY2FzZSBFUEZOT1NVUFBPUlQ6ICAgICAgcmV0dXJuIFdTQUVQRk5PU1VQUE9SVDsKICAgICAgICBjYXNlIEVBRk5PU1VQUE9SVDogICAgICByZXR1cm4gV1NBRUFGTk9TVVBQT1JUOwogICAgICAgIGNhc2UgRUFERFJJTlVTRTogICAgICAgIHJldHVybiBXU0FFQUREUklOVVNFOwogICAgICAgIGNhc2UgRUFERFJOT1RBVkFJTDogICAgIHJldHVybiBXU0FFQUREUk5PVEFWQUlMOwogICAgICAgIGNhc2UgRU5FVERPV046ICAgICAgICAgIHJldHVybiBXU0FFTkVURE9XTjsKICAgICAgICBjYXNlIEVORVRVTlJFQUNIOiAgICAgICByZXR1cm4gV1NBRU5FVFVOUkVBQ0g7CiAgICAgICAgY2FzZSBFTkVUUkVTRVQ6ICAgICAgICAgcmV0dXJuIFdTQUVORVRSRVNFVDsKICAgICAgICBjYXNlIEVDT05OQUJPUlRFRDogICAgICByZXR1cm4gV1NBRUNPTk5BQk9SVEVEOwogICAgICAgIGNhc2UgRVBJUEU6CiAgICAgICAgY2FzZSBFQ09OTlJFU0VUOiAgICAgICAgcmV0dXJuIFdTQUVDT05OUkVTRVQ7CiAgICAgICAgY2FzZSBFTk9CVUZTOiAgICAgICAgICAgcmV0dXJuIFdTQUVOT0JVRlM7CiAgICAgICAgY2FzZSBFSVNDT05OOiAgICAgICAgICAgcmV0dXJuIFdTQUVJU0NPTk47CiAgICAgICAgY2FzZSBFTk9UQ09OTjogICAgICAgICAgcmV0dXJuIFdTQUVOT1RDT05OOwogICAgICAgIGNhc2UgRVNIVVRET1dOOiAgICAgICAgIHJldHVybiBXU0FFU0hVVERPV047CiAgICAgICAgY2FzZSBFVE9PTUFOWVJFRlM6ICAgICAgcmV0dXJuIFdTQUVUT09NQU5ZUkVGUzsKICAgICAgICBjYXNlIEVUSU1FRE9VVDogICAgICAgICByZXR1cm4gV1NBRVRJTUVET1VUOwogICAgICAgIGNhc2UgRUNPTk5SRUZVU0VEOiAgICAgIHJldHVybiBXU0FFQ09OTlJFRlVTRUQ7CiAgICAgICAgY2FzZSBFTE9PUDogICAgICAgICAgICAgcmV0dXJuIFdTQUVMT09QOwogICAgICAgIGNhc2UgRU5BTUVUT09MT05HOiAgICAgIHJldHVybiBXU0FFTkFNRVRPT0xPTkc7CiAgICAgICAgY2FzZSBFSE9TVERPV046ICAgICAgICAgcmV0dXJuIFdTQUVIT1NURE9XTjsKICAgICAgICBjYXNlIEVIT1NUVU5SRUFDSDogICAgICByZXR1cm4gV1NBRUhPU1RVTlJFQUNIOwogICAgICAgIGNhc2UgRU5PVEVNUFRZOiAgICAgICAgIHJldHVybiBXU0FFTk9URU1QVFk7CiNpZmRlZiBFUFJPQ0xJTQogICAgICAgIGNhc2UgRVBST0NMSU06ICAgICAgICAgIHJldHVybiBXU0FFUFJPQ0xJTTsKI2VuZGlmCiNpZmRlZiBFVVNFUlMKICAgICAgICBjYXNlIEVVU0VSUzogICAgICAgICAgICByZXR1cm4gV1NBRVVTRVJTOwojZW5kaWYKI2lmZGVmIEVEUVVPVAogICAgICAgIGNhc2UgRURRVU9UOiAgICAgICAgICAgIHJldHVybiBXU0FFRFFVT1Q7CiNlbmRpZgojaWZkZWYgRVNUQUxFCiAgICAgICAgY2FzZSBFU1RBTEU6ICAgICAgICAgICAgcmV0dXJuIFdTQUVTVEFMRTsKI2VuZGlmCiNpZmRlZiBFUkVNT1RFCiAgICAgICAgY2FzZSBFUkVNT1RFOiAgICAgICAgICAgcmV0dXJuIFdTQUVSRU1PVEU7CiNlbmRpZgogICAgZGVmYXVsdDogZXJybm89ZXJyOyBwZXJyb3IoInNvY2tfc2V0X2Vycm9yIik7IHJldHVybiBXU0FFRkFVTFQ7CiAgICB9Cn0KCi8qIHNldCB0aGUgbGFzdCBlcnJvciBkZXBlbmRpbmcgb24gZXJybm8gKi8Kc3RhdGljIHZvaWQgc29ja19zZXRfZXJyb3Iodm9pZCkKewogICAgc2V0X2Vycm9yKCBzb2NrX2dldF9lcnJvciggZXJybm8gKSApOwp9CgovKiBjcmVhdGUgYSBzb2NrZXQgKi8KREVDTF9IQU5ETEVSKGNyZWF0ZV9zb2NrZXQpCnsKICAgIHN0cnVjdCBvYmplY3QgKm9iajsKCiAgICByZXBseS0+aGFuZGxlID0gMDsKICAgIGlmICgob2JqID0gY3JlYXRlX3NvY2tldCggcmVxLT5mYW1pbHksIHJlcS0+dHlwZSwgcmVxLT5wcm90b2NvbCwgcmVxLT5mbGFncyApKSAhPSBOVUxMKQogICAgewogICAgICAgIHJlcGx5LT5oYW5kbGUgPSBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsIG9iaiwgcmVxLT5hY2Nlc3MsIHJlcS0+YXR0cmlidXRlcyApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBvYmogKTsKICAgIH0KfQoKLyogYWNjZXB0IGEgc29ja2V0ICovCkRFQ0xfSEFORExFUihhY2NlcHRfc29ja2V0KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKCiAgICByZXBseS0+aGFuZGxlID0gMDsKICAgIGlmICgoc29jayA9IGFjY2VwdF9zb2NrZXQoIHJlcS0+bGhhbmRsZSApKSAhPSBOVUxMKQogICAgewogICAgICAgIHJlcGx5LT5oYW5kbGUgPSBhbGxvY19oYW5kbGUoIGN1cnJlbnQtPnByb2Nlc3MsICZzb2NrLT5vYmosIHJlcS0+YWNjZXNzLCByZXEtPmF0dHJpYnV0ZXMgKTsKICAgICAgICBzb2NrLT53cGFyYW0gPSByZXBseS0+aGFuZGxlOyAgLyogd3BhcmFtIGZvciBtZXNzYWdlIGlzIHRoZSBzb2NrZXQgaGFuZGxlICovCiAgICAgICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7CiAgICB9Cn0KCi8qIHNldCBzb2NrZXQgZXZlbnQgcGFyYW1ldGVycyAqLwpERUNMX0hBTkRMRVIoc2V0X3NvY2tldF9ldmVudCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBzdHJ1Y3QgZXZlbnQgKm9sZF9ldmVudDsKICAgIGludCBwb2xsZXY7CgogICAgaWYgKCEoc29jayA9IChzdHJ1Y3Qgc29jayAqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCByZXEtPmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRklMRV9XUklURV9BVFRSSUJVVEVTLCAmc29ja19vcHMpKSkgcmV0dXJuOwogICAgb2xkX2V2ZW50ID0gc29jay0+ZXZlbnQ7CiAgICBzb2NrLT5tYXNrICAgID0gcmVxLT5tYXNrOwogICAgc29jay0+ZXZlbnQgICA9IE5VTEw7CiAgICBzb2NrLT53aW5kb3cgID0gcmVxLT53aW5kb3c7CiAgICBzb2NrLT5tZXNzYWdlID0gcmVxLT5tc2c7CiAgICBzb2NrLT53cGFyYW0gID0gcmVxLT5oYW5kbGU7ICAvKiB3cGFyYW0gaXMgdGhlIHNvY2tldCBoYW5kbGUgKi8KICAgIGlmIChyZXEtPmV2ZW50KSBzb2NrLT5ldmVudCA9IGdldF9ldmVudF9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+ZXZlbnQsIEVWRU5UX01PRElGWV9TVEFURSApOwoKICAgIGlmIChkZWJ1Z19sZXZlbCAmJiBzb2NrLT5ldmVudCkgZnByaW50ZihzdGRlcnIsICJldmVudCBwdHI6ICVwXG4iLCBzb2NrLT5ldmVudCk7CgogICAgcG9sbGV2ID0gc29ja19yZXNlbGVjdCggc29jayApOwogICAgaWYgKCBwb2xsZXYgKSBzb2NrX3RyeV9ldmVudCggc29jaywgcG9sbGV2ICk7CgogICAgaWYgKHNvY2stPm1hc2spCiAgICAgICAgc29jay0+c3RhdGUgfD0gRkRfV0lORV9OT05CTE9DS0lORzsKCiAgICAvKiBpZiBhIG5ldHdvcmsgZXZlbnQgaXMgcGVuZGluZywgc2lnbmFsIHRoZSBldmVudCBvYmplY3QKICAgICAgIGl0IGlzIHBvc3NpYmxlIHRoYXQgRkRfQ09OTkVDVCBvciBGRF9BQ0NFUFQgbmV0d29yayBldmVudHMgaGFzIGhhcHBlbmVkCiAgICAgICBiZWZvcmUgYSBXU0FFdmVudFNlbGVjdCgpIHdhcyBkb25lIG9uIGl0LgogICAgICAgKHdoZW4gZGVhbGluZyB3aXRoIEFzeW5jaHJvbm91cyBzb2NrZXQpICAqLwogICAgaWYgKHNvY2stPnBtYXNrICYgc29jay0+bWFzaykgc29ja193YWtlX3VwKCBzb2NrLCBwb2xsZXYgKTsKCiAgICBpZiAob2xkX2V2ZW50KSByZWxlYXNlX29iamVjdCggb2xkX2V2ZW50ICk7IC8qIHdlJ3JlIHRocm91Z2ggd2l0aCBpdCAqLwogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKLyogZ2V0IHNvY2tldCBldmVudCBwYXJhbWV0ZXJzICovCkRFQ0xfSEFORExFUihnZXRfc29ja2V0X2V2ZW50KQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jazsKCiAgICBzb2NrID0gKHN0cnVjdCBzb2NrICopZ2V0X2hhbmRsZV9vYmooIGN1cnJlbnQtPnByb2Nlc3MsIHJlcS0+aGFuZGxlLCBGSUxFX1JFQURfQVRUUklCVVRFUywgJnNvY2tfb3BzICk7CiAgICBpZiAoIXNvY2spCiAgICB7CiAgICAgICAgcmVwbHktPm1hc2sgID0gMDsKICAgICAgICByZXBseS0+cG1hc2sgPSAwOwogICAgICAgIHJlcGx5LT5zdGF0ZSA9IDA7CiAgICAgICAgc2V0X2Vycm9yKCBXU0FFTk9UU09DSyApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHJlcGx5LT5tYXNrICA9IHNvY2stPm1hc2s7CiAgICByZXBseS0+cG1hc2sgPSBzb2NrLT5wbWFzazsKICAgIHJlcGx5LT5zdGF0ZSA9IHNvY2stPnN0YXRlOwogICAgc2V0X3JlcGx5X2RhdGEoIHNvY2stPmVycm9ycywgbWluKCBnZXRfcmVwbHlfbWF4X3NpemUoKSwgc2l6ZW9mKHNvY2stPmVycm9ycykgKSk7CgogICAgaWYgKHJlcS0+c2VydmljZSkKICAgIHsKICAgICAgICBpZiAocmVxLT5jX2V2ZW50KQogICAgICAgIHsKICAgICAgICAgICAgc3RydWN0IGV2ZW50ICpjZXZlbnQgPSBnZXRfZXZlbnRfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCByZXEtPmNfZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZFTlRfTU9ESUZZX1NUQVRFICk7CiAgICAgICAgICAgIGlmIChjZXZlbnQpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJlc2V0X2V2ZW50KCBjZXZlbnQgKTsKICAgICAgICAgICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBjZXZlbnQgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzb2NrLT5wbWFzayA9IDA7CiAgICAgICAgc29ja19yZXNlbGVjdCggc29jayApOwogICAgfQogICAgcmVsZWFzZV9vYmplY3QoICZzb2NrLT5vYmogKTsKfQoKLyogcmUtZW5hYmxlIHBlbmRpbmcgc29ja2V0IGV2ZW50cyAqLwpERUNMX0hBTkRMRVIoZW5hYmxlX3NvY2tldF9ldmVudCkKewogICAgc3RydWN0IHNvY2sgKnNvY2s7CiAgICBpbnQgcG9sbGV2OwoKICAgIGlmICghKHNvY2sgPSAoc3RydWN0IHNvY2sqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCByZXEtPmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFX1dSSVRFX0FUVFJJQlVURVMsICZzb2NrX29wcykpKQogICAgICAgIHJldHVybjsKCiAgICBzb2NrLT5wbWFzayAmPSB+cmVxLT5tYXNrOyAvKiBpcyB0aGlzIHNhZmU/ICovCiAgICBzb2NrLT5obWFzayAmPSB+cmVxLT5tYXNrOwogICAgaWYgKCByZXEtPm1hc2sgJiBGRF9SRUFEICkKICAgICAgICBzb2NrLT5obWFzayAmPSB+RkRfQ0xPU0U7CiAgICBzb2NrLT5zdGF0ZSB8PSByZXEtPnNzdGF0ZTsKICAgIHNvY2stPnN0YXRlICY9IH5yZXEtPmNzdGF0ZTsKICAgIGlmICggc29jay0+dHlwZSAhPSBTT0NLX1NUUkVBTSApIHNvY2stPnN0YXRlICY9IH5TVFJFQU1fRkxBR19NQVNLOwoKICAgIHBvbGxldiA9IHNvY2tfcmVzZWxlY3QoIHNvY2sgKTsKICAgIGlmICggcG9sbGV2ICkgc29ja190cnlfZXZlbnQoIHNvY2ssIHBvbGxldiApOwoKICAgIHJlbGVhc2Vfb2JqZWN0KCAmc29jay0+b2JqICk7Cn0KCkRFQ0xfSEFORExFUihzZXRfc29ja2V0X2RlZmVycmVkKQp7CiAgICBzdHJ1Y3Qgc29jayAqc29jaywgKmFjY2VwdHNvY2s7CgogICAgc29jaz0oc3RydWN0IHNvY2sgKilnZXRfaGFuZGxlX29iaiggY3VycmVudC0+cHJvY2VzcywgcmVxLT5oYW5kbGUsIEZJTEVfV1JJVEVfQVRUUklCVVRFUywgJnNvY2tfb3BzICk7CiAgICBpZiAoICFzb2NrICkKICAgIHsKICAgICAgICBzZXRfZXJyb3IoIFdTQUVOT1RTT0NLICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgYWNjZXB0c29jayA9IChzdHJ1Y3Qgc29jayAqKWdldF9oYW5kbGVfb2JqKCBjdXJyZW50LT5wcm9jZXNzLCByZXEtPmRlZmVycmVkLCAwLCAmc29ja19vcHMgKTsKICAgIGlmICggIWFjY2VwdHNvY2sgKQogICAgewogICAgICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7CiAgICAgICAgc2V0X2Vycm9yKCBXU0FFTk9UU09DSyApOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIHNvY2stPmRlZmVycmVkID0gYWNjZXB0c29jazsKICAgIHJlbGVhc2Vfb2JqZWN0KCBzb2NrICk7Cn0K