LyoKICogIEFUSSBGcmFtZSBCdWZmZXIgRGV2aWNlIERyaXZlciBDb3JlCiAqCiAqCUNvcHlyaWdodCAoQykgMjAwNCAgQWxleCBLZXJuIDxhbGV4Lmtlcm5AZ214LmRlPgogKglDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSAgR2VlcnQgVXl0dGVyaG9ldmVuCiAqCUNvcHlyaWdodCAoQykgMTk5OCAgQmVybmQgSGFycmllcwogKglDb3B5cmlnaHQgKEMpIDE5OTggIEVkZGllIEMuIERvc3QgIChlY2RAc2t5bmV0LmJlKQogKgogKiAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBVEkgZ3JhcGhpY3MgY2hpcHM6CiAqICAgIC0gQVRJIE1hY2g2NAogKgogKiAgVG8gZG86IGFkZCBzdXBwb3J0IGZvcgogKiAgICAtIEFUSSBSYWdlMTI4IChmcm9tIGF0eTEyOGZiLmMpCiAqICAgIC0gQVRJIFJhZGVvbiAoZnJvbSByYWRlb25mYi5jKQogKgogKiAgVGhpcyBkcml2ZXIgaXMgcGFydGx5IGJhc2VkIG9uIHRoZSBQb3dlck1hYyBjb25zb2xlIGRyaXZlcjoKICoKICoJQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCiAqCiAqICBhbmQgb24gdGhlIFBvd2VyTWFjIEFUSS9tYWNoNjQgZGlzcGxheSBkcml2ZXI6CiAqCiAqCUNvcHlyaWdodCAoQykgMTk5NyBNaWNoYWVsIEFLIFRlc2NoCiAqCiAqCSAgICAgIHdpdGggd29yayBieSBKb24gSG93ZWxsCiAqCQkJICAgSGFycnkgQUMgRWF0b24KICoJCQkgICBBbnRob255IFRvbmcgPGF0b25nQHVpdWMuZWR1PgogKgogKiAgR2VuZXJpYyBMQ0Qgc3VwcG9ydCB3cml0dGVuIGJ5IERhbmllbCBNYW50aW9uZSwgcG9ydGVkIGZyb20gMi40LjIwIGJ5IEFsZXggS2VybgogKiAgTWFueSBUaGFua3MgdG8gVmlsbGUgU3lyauRs5CBmb3IgcGF0Y2hlcyBhbmQgZml4aW5nIG5hc3RpbmcgMTYgYml0IGNvbG9yIGJ1Zy4KICoKICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqICBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgogKiAgbW9yZSBkZXRhaWxzLgogKgogKiAgTWFueSB0aGFua3MgdG8gTml0eWEgZnJvbSBBVEkgZGV2cmVsIGZvciBzdXBwb3J0IGFuZCBwYXRpZW5jZSAhCiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICBUT0RPOgoKICAgIC0gY3Vyc29yIHN1cHBvcnQgb24gYWxsIGNhcmRzIGFuZCBhbGwgcmFtZGFjcy4KICAgIC0gY3Vyc29yIHBhcmFtZXRlcnMgY29udHJvbGFibGUgdmlhIGlvY3RsKClzLgogICAgLSBndWVzcyBQTEwgYW5kIE1DTEsgYmFzZWQgb24gdGhlIG9yaWdpbmFsIFBMTCByZWdpc3RlciB2YWx1ZXMgaW5pdGlhbGl6ZWQKICAgICAgYnkgT3BlbiBGaXJtd2FyZSAoaWYgdGhleSBhcmUgaW5pdGlhbGl6ZWQpLiBCSU9TIGlzIGRvbmUKCiAgICAoQW55b25lIHdpdGggTWFjIHRvIGhlbHAgd2l0aCB0aGlzPykKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9tbS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KCiNpbmNsdWRlIDx2aWRlby9tYWNoNjQuaD4KI2luY2x1ZGUgImF0eWZiLmgiCiNpbmNsdWRlICJhdGlfaWRzLmgiCgojaWZkZWYgX19wb3dlcnBjX18KI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiNpbmNsdWRlIDxhc20vcHJvbS5oPgojaW5jbHVkZSAiLi4vbWFjbW9kZXMuaCIKI2VuZGlmCiNpZmRlZiBfX3NwYXJjX18KI2luY2x1ZGUgPGFzbS9wYm0uaD4KI2luY2x1ZGUgPGFzbS9mYmlvLmg+CiNlbmRpZgoKI2lmZGVmIENPTkZJR19BREJfUE1VCiNpbmNsdWRlIDxsaW51eC9hZGIuaD4KI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgojZW5kaWYKI2lmZGVmIENPTkZJR19CT09UWF9URVhUCiNpbmNsdWRlIDxhc20vYnRleHQuaD4KI2VuZGlmCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KI2VuZGlmCiNpZmRlZiBDT05GSUdfTVRSUgojaW5jbHVkZSA8YXNtL210cnIuaD4KI2VuZGlmCgovKgogKiBEZWJ1ZyBmbGFncy4KICovCiN1bmRlZiBERUJVRwovKiNkZWZpbmUgREVCVUcqLwoKLyogTWFrZSBzdXJlIG4gKiBQQUdFX1NJWkUgaXMgcHJvdGVjdGVkIGF0IGVuZCBvZiBBcGVydHVyZSBmb3IgR1VJLXJlZ3MgKi8KLyogIC0gbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gY2F0Y2ggYWxsIEdVSS1SZWdzICAgKi8KLyogIC0gbXVzdCBiZSBhbGlnbmVkIHRvIGEgUEFHRSBib3VuZGFyeSAgICAgICAgICAgKi8KI2RlZmluZSBHVUlfUkVTRVJWRQkoMSAqIFBBR0VfU0laRSkKCi8qIEZJWE1FOiByZW1vdmUgdGhlIEZBSUwgZGVmaW5pdGlvbiAqLwojZGVmaW5lIEZBSUwobXNnKSBkbyB7IFwKCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAoJCXByaW50ayhLRVJOX0NSSVQgImF0eWZiOiAiIG1zZyAiXG4iKTsgXAoJcmV0dXJuIC1FSU5WQUw7IFwKfSB3aGlsZSAoMCkKI2RlZmluZSBGQUlMX01BWChtc2csIHgsIF9tYXhfKSBkbyB7IFwKCWlmICh4ID4gX21heF8pIHsgXAoJCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAoJCQlwcmludGsoS0VSTl9DUklUICJhdHlmYjogIiBtc2cgIiAleCgleClcbiIsIHgsIF9tYXhfKTsgXAoJCXJldHVybiAtRUlOVkFMOyBcCgl9IFwKfSB3aGlsZSAoMCkKI2lmZGVmIERFQlVHCiNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHICJhdHlmYjogIiBmbXQsICMjIGFyZ3MpCiNlbHNlCiNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCiNlbmRpZgoKI2RlZmluZSBQUklOVEtJKGZtdCwgYXJncy4uLikJcHJpbnRrKEtFUk5fSU5GTyAiYXR5ZmI6ICIgZm10LCAjIyBhcmdzKQojZGVmaW5lIFBSSU5US0UoZm10LCBhcmdzLi4uKQkgcHJpbnRrKEtFUk5fRVJSICJhdHlmYjogIiBmbXQsICMjIGFyZ3MpCgojaWYgZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX1BNQUNfQkFDS0xJR0hUKSB8fCBkZWZpbmVkIChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQpzdGF0aWMgY29uc3QgdTMyIGx0X2xjZF9yZWdzW10gPSB7CglDT05GSUdfUEFORUxfTEcsCglMQ0RfR0VOX0NOVExfTEcsCglEU1ROX0NPTlRST0xfTEcsCglIRkJfUElUQ0hfQUREUl9MRywKCUhPUlpfU1RSRVRDSElOR19MRywKCVZFUlRfU1RSRVRDSElOR19MRywKCTAsIC8qIEVYVF9WRVJUX1NUUkVUQ0ggKi8KCUxUX0dJT19MRywKCVBPV0VSX01BTkFHRU1FTlRfTEcKfTsKCnZvaWQgYXR5X3N0X2xjZChpbnQgaW5kZXgsIHUzMiB2YWwsIGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJaWYgKE02NF9IQVMoTFRfTENEX1JFR1MpKSB7CgkJYXR5X3N0X2xlMzIobHRfbGNkX3JlZ3NbaW5kZXhdLCB2YWwsIHBhcik7Cgl9IGVsc2UgewoJCXVuc2lnbmVkIGxvbmcgdGVtcDsKCgkJLyogd3JpdGUgYWRkciBieXRlICovCgkJdGVtcCA9IGF0eV9sZF9sZTMyKExDRF9JTkRFWCwgcGFyKTsKCQlhdHlfc3RfbGUzMihMQ0RfSU5ERVgsICh0ZW1wICYgfkxDRF9JTkRFWF9NQVNLKSB8IGluZGV4LCBwYXIpOwoJCS8qIHdyaXRlIHRoZSByZWdpc3RlciB2YWx1ZSAqLwoJCWF0eV9zdF9sZTMyKExDRF9EQVRBLCB2YWwsIHBhcik7Cgl9Cn0KCnUzMiBhdHlfbGRfbGNkKGludCBpbmRleCwgY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglpZiAoTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQlyZXR1cm4gYXR5X2xkX2xlMzIobHRfbGNkX3JlZ3NbaW5kZXhdLCBwYXIpOwoJfSBlbHNlIHsKCQl1bnNpZ25lZCBsb25nIHRlbXA7CgoJCS8qIHdyaXRlIGFkZHIgYnl0ZSAqLwoJCXRlbXAgPSBhdHlfbGRfbGUzMihMQ0RfSU5ERVgsIHBhcik7CgkJYXR5X3N0X2xlMzIoTENEX0lOREVYLCAodGVtcCAmIH5MQ0RfSU5ERVhfTUFTSykgfCBpbmRleCwgcGFyKTsKCQkvKiByZWFkIHRoZSByZWdpc3RlciB2YWx1ZSAqLwoJCXJldHVybiBhdHlfbGRfbGUzMihMQ0RfREFUQSwgcGFyKTsKCX0KfQojZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX1BNQUNfQkFDS0xJR0hUKSB8fCBkZWZpbmVkIChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKSAqLwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKLyoKICogQVRJUmVkdWNlUmF0aW8gLS0KICoKICogUmVkdWNlIGEgZnJhY3Rpb24gYnkgZmFjdG9yaW5nIG91dCB0aGUgbGFyZ2VzdCBjb21tb24gZGl2aWRlciBvZiB0aGUKICogZnJhY3Rpb24ncyBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yLgogKi8Kc3RhdGljIHZvaWQgQVRJUmVkdWNlUmF0aW8oaW50ICpOdW1lcmF0b3IsIGludCAqRGVub21pbmF0b3IpCnsKICAgIGludCBNdWx0aXBsaWVyLCBEaXZpZGVyLCBSZW1haW5kZXI7CgogICAgTXVsdGlwbGllciA9ICpOdW1lcmF0b3I7CiAgICBEaXZpZGVyID0gKkRlbm9taW5hdG9yOwoKICAgIHdoaWxlICgoUmVtYWluZGVyID0gTXVsdGlwbGllciAlIERpdmlkZXIpKQogICAgewogICAgICAgIE11bHRpcGxpZXIgPSBEaXZpZGVyOwogICAgICAgIERpdmlkZXIgPSBSZW1haW5kZXI7CiAgICB9CgogICAgKk51bWVyYXRvciAvPSBEaXZpZGVyOwogICAgKkRlbm9taW5hdG9yIC89IERpdmlkZXI7Cn0KI2VuZGlmCiAgICAvKgogICAgICogIFRoZSBIYXJkd2FyZSBwYXJhbWV0ZXJzIGZvciBlYWNoIGNhcmQKICAgICAqLwoKc3RydWN0IGF0eV9jbWFwX3JlZ3MgewoJdTggd2luZGV4OwoJdTggbHV0OwoJdTggbWFzazsKCXU4IHJpbmRleDsKCXU4IGNudGw7Cn07CgpzdHJ1Y3QgcGNpX21tYXBfbWFwIHsKCXVuc2lnbmVkIGxvbmcgdm9mZjsKCXVuc2lnbmVkIGxvbmcgcG9mZjsKCXVuc2lnbmVkIGxvbmcgc2l6ZTsKCXVuc2lnbmVkIGxvbmcgcHJvdF9mbGFnOwoJdW5zaWduZWQgbG9uZyBwcm90X21hc2s7Cn07CgpzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGF0eWZiX2ZpeCBfX2RldmluaXRkYXRhID0gewoJLmlkCQk9ICJBVFkgTWFjaDY0IiwKCS50eXBlCQk9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUywKCS52aXN1YWwJCT0gRkJfVklTVUFMX1BTRVVET0NPTE9SLAoJLnhwYW5zdGVwCT0gOCwKCS55cGFuc3RlcAk9IDEsCn07CgogICAgLyoKICAgICAqICBGcmFtZSBidWZmZXIgZGV2aWNlIEFQSQogICAgICovCgpzdGF0aWMgaW50IGF0eWZiX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKTsKc3RhdGljIGludCBhdHlmYl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcik7CnN0YXRpYyBpbnQgYXR5ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAoJdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIGludCBhdHlmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIGludCBhdHlmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKTsKI2lmZGVmIF9fc3BhcmNfXwpzdGF0aWMgaW50IGF0eWZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKI2VuZGlmCnN0YXRpYyBpbnQgYXR5ZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CgogICAgLyoKICAgICAqICBJbnRlcm5hbCByb3V0aW5lcwogICAgICovCgpzdGF0aWMgaW50IGF0eV9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBjaGFyICpuYW1lKTsKI2lmZGVmIENPTkZJR19BVEFSSQpzdGF0aWMgaW50IHN0b3JlX3ZpZGVvX3BhcihjaGFyICp2aWRlb3BhciwgdW5zaWduZWQgY2hhciBtNjRfbnVtKTsKI2VuZGlmCgpzdGF0aWMgc3RydWN0IGNydGMgc2F2ZWRfY3J0YzsKc3RhdGljIHVuaW9uIGF0eV9wbGwgc2F2ZWRfcGxsOwpzdGF0aWMgdm9pZCBhdHlfZ2V0X2NydGMoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyLCBzdHJ1Y3QgY3J0YyAqY3J0Yyk7CgpzdGF0aWMgdm9pZCBhdHlfc2V0X2NydGMoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyLCBjb25zdCBzdHJ1Y3QgY3J0YyAqY3J0Yyk7CnN0YXRpYyBpbnQgYXR5X3Zhcl90b19jcnRjKGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGNydGMgKmNydGMpOwpzdGF0aWMgaW50IGF0eV9jcnRjX3RvX3Zhcihjb25zdCBzdHJ1Y3QgY3J0YyAqY3J0Yywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpOwpzdGF0aWMgdm9pZCBzZXRfb2ZmX3BpdGNoKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8pOwojaWZkZWYgQ09ORklHX1BQQwpzdGF0aWMgaW50IHJlYWRfYXR5X3NlbnNlKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcik7CiNlbmRpZgoKCiAgICAvKgogICAgICogIEludGVyZmFjZSB1c2VkIGJ5IHRoZSB3b3JsZAogICAgICovCgpzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGRlZmF1bHRfdmFyID0gewoJLyogNjQweDQ4MCwgNjAgSHosIE5vbi1JbnRlcmxhY2VkICgyNS4xNzUgTUh6IGRvdGNsb2NrKSAqLwoJNjQwLCA0ODAsIDY0MCwgNDgwLCAwLCAwLCA4LCAwLAoJezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDAsIDB9LAoJMCwgMCwgLTEsIC0xLCAwLCAzOTcyMiwgNDgsIDE2LCAzMywgMTAsIDk2LCAyLAoJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAp9OwoKc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgZGVmbW9kZSA9IHsKCS8qIDY0MHg0ODAgQCA2MCBIeiwgMzEuNSBrSHogaHN5bmMgKi8KCU5VTEwsIDYwLCA2NDAsIDQ4MCwgMzk3MjEsIDQwLCAyNCwgMzIsIDExLCA5NiwgMiwKCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKfTsKCnN0YXRpYyBzdHJ1Y3QgZmJfb3BzIGF0eWZiX29wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5mYl9vcGVuCT0gYXR5ZmJfb3BlbiwKCS5mYl9yZWxlYXNlCT0gYXR5ZmJfcmVsZWFzZSwKCS5mYl9jaGVja192YXIJPSBhdHlmYl9jaGVja192YXIsCgkuZmJfc2V0X3Bhcgk9IGF0eWZiX3NldF9wYXIsCgkuZmJfc2V0Y29scmVnCT0gYXR5ZmJfc2V0Y29scmVnLAoJLmZiX3Bhbl9kaXNwbGF5CT0gYXR5ZmJfcGFuX2Rpc3BsYXksCgkuZmJfYmxhbmsJPSBhdHlmYl9ibGFuaywKCS5mYl9pb2N0bAk9IGF0eWZiX2lvY3RsLAoJLmZiX2ZpbGxyZWN0CT0gYXR5ZmJfZmlsbHJlY3QsCgkuZmJfY29weWFyZWEJPSBhdHlmYl9jb3B5YXJlYSwKCS5mYl9pbWFnZWJsaXQJPSBhdHlmYl9pbWFnZWJsaXQsCiNpZmRlZiBfX3NwYXJjX18KCS5mYl9tbWFwCT0gYXR5ZmJfbW1hcCwKI2VuZGlmCgkuZmJfc3luYwk9IGF0eWZiX3N5bmMsCn07CgpzdGF0aWMgaW50IG5vYWNjZWw7CiNpZmRlZiBDT05GSUdfTVRSUgpzdGF0aWMgaW50IG5vbXRycjsKI2VuZGlmCnN0YXRpYyBpbnQgdnJhbTsKc3RhdGljIGludCBwbGw7CnN0YXRpYyBpbnQgbWNsazsKc3RhdGljIGludCB4Y2xrOwpzdGF0aWMgaW50IGNvbXBfc3luYyBfX2RldmluaXRkYXRhID0gLTE7CnN0YXRpYyBjaGFyICptb2RlOwoKI2lmZGVmIENPTkZJR19QUEMKc3RhdGljIGludCBkZWZhdWx0X3Ztb2RlIF9fZGV2aW5pdGRhdGEgPSBWTU9ERV9DSE9PU0U7CnN0YXRpYyBpbnQgZGVmYXVsdF9jbW9kZSBfX2RldmluaXRkYXRhID0gQ01PREVfQ0hPT1NFOwoKbW9kdWxlX3BhcmFtX25hbWVkKHZtb2RlLCBkZWZhdWx0X3Ztb2RlLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHZtb2RlLCAiaW50OiB2aWRlbyBtb2RlIGZvciBtYWMiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGNtb2RlLCBkZWZhdWx0X2Ntb2RlLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGNtb2RlLCAiaW50OiBjb2xvciBtb2RlIGZvciBtYWMiKTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX0FUQVJJCnN0YXRpYyB1bnNpZ25lZCBpbnQgbWFjaDY0X2NvdW50IF9fZGV2aW5pdGRhdGEgPSAwOwpzdGF0aWMgdW5zaWduZWQgbG9uZyBwaHlzX3ZtZW1iYXNlW0ZCX01BWF0gX19kZXZpbml0ZGF0YSA9IHsgMCwgfTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgcGh5c19zaXplW0ZCX01BWF0gX19kZXZpbml0ZGF0YSA9IHsgMCwgfTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgcGh5c19ndWlyZWdiYXNlW0ZCX01BWF0gX19kZXZpbml0ZGF0YSA9IHsgMCwgfTsKI2VuZGlmCgovKiB0b3AgLT4gZG93biBpcyBhbiBldm9sdXRpb24gb2YgbWFjaDY0IGNoaXBzZXQsIGFueSBjb3JyZWN0aW9ucz8gKi8KI2RlZmluZSBBVElfQ0hJUF84ODgwMEdYICAgKE02NEZfR1gpCiNkZWZpbmUgQVRJX0NISVBfODg4MDBDWCAgIChNNjRGX0dYKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRDVCAgICAgKE02NEZfQ1QgfCBNNjRGX0lOVEVHUkFURUQgfCBNNjRGX0NUX0JVUyB8IE02NEZfTUFHSUNfRklGTykKI2RlZmluZSBBVElfQ0hJUF8yNjRFVCAgICAgKE02NEZfQ1QgfCBNNjRGX0lOVEVHUkFURUQgfCBNNjRGX0NUX0JVUyB8IE02NEZfTUFHSUNfRklGTykKCiNkZWZpbmUgQVRJX0NISVBfMjY0VlQgICAgIChNNjRGX1ZUIHwgTTY0Rl9JTlRFR1JBVEVEIHwgTTY0Rl9WVF9CVVMgfCBNNjRGX01BR0lDX0ZJRk8pCiNkZWZpbmUgQVRJX0NISVBfMjY0R1QgICAgIChNNjRGX0dUIHwgTTY0Rl9JTlRFR1JBVEVEICAgICAgICAgICAgICAgfCBNNjRGX01BR0lDX0ZJRk8gfCBNNjRGX0VYVFJBX0JSSUdIVCkKCiNkZWZpbmUgQVRJX0NISVBfMjY0VlRCICAgIChNNjRGX1ZUIHwgTTY0Rl9JTlRFR1JBVEVEIHwgTTY0Rl9WVF9CVVMgfCBNNjRGX0dUQl9EU1ApCiNkZWZpbmUgQVRJX0NISVBfMjY0VlQzICAgIChNNjRGX1ZUIHwgTTY0Rl9JTlRFR1JBVEVEIHwgTTY0Rl9WVF9CVVMgfCBNNjRGX0dUQl9EU1AgfCBNNjRGX1NEUkFNX01BR0lDX1BMTCkKI2RlZmluZSBBVElfQ0hJUF8yNjRWVDQgICAgKE02NEZfVlQgfCBNNjRGX0lOVEVHUkFURUQgICAgICAgICAgICAgICB8IE02NEZfR1RCX0RTUCkKCi8qIEZJWE1FIHdoYXQgaXMgdGhpcyBjaGlwPyAqLwojZGVmaW5lIEFUSV9DSElQXzI2NExUICAgICAoTTY0Rl9HVCB8IE02NEZfSU5URUdSQVRFRCAgICAgICAgICAgICAgIHwgTTY0Rl9HVEJfRFNQKQoKLyogbWFrZSBzZXRzIHNob3J0ZXIgKi8KI2RlZmluZSBBVElfTU9ERVJOX1NFVCAgICAgKE02NEZfR1QgfCBNNjRGX0lOVEVHUkFURUQgICAgICAgICAgICAgICB8IE02NEZfR1RCX0RTUCB8IE02NEZfRVhUUkFfQlJJR0hUKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRHVEIgICAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwpCi8qI2RlZmluZSBBVElfQ0hJUF8yNjRHVERWRCAgPyovCiNkZWZpbmUgQVRJX0NISVBfMjY0TFRHICAgIChBVElfTU9ERVJOX1NFVCB8IE02NEZfU0RSQU1fTUFHSUNfUExMKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRHVDJDICAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwgfCBNNjRGX0hXX1RSSVBMRSkKI2RlZmluZSBBVElfQ0hJUF8yNjRHVFBSTyAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwgfCBNNjRGX0hXX1RSSVBMRSB8IE02NEZfRklGT18zMiB8IE02NEZfUkVTRVRfM0QpCiNkZWZpbmUgQVRJX0NISVBfMjY0TFRQUk8gIChBVElfTU9ERVJOX1NFVCB8IE02NEZfSFdfVFJJUExFIHwgTTY0Rl9GSUZPXzMyIHwgTTY0Rl9SRVNFVF8zRCkKCiNkZWZpbmUgQVRJX0NISVBfMjY0WEwgICAgIChBVElfTU9ERVJOX1NFVCB8IE02NEZfSFdfVFJJUExFIHwgTTY0Rl9GSUZPXzMyIHwgTTY0Rl9SRVNFVF8zRCB8IE02NEZfWExfRExMIHwgTTY0Rl9NRkJfRk9SQ0VfNCkKI2RlZmluZSBBVElfQ0hJUF9NT0JJTElUWSAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9IV19UUklQTEUgfCBNNjRGX0ZJRk9fMzIgfCBNNjRGX1JFU0VUXzNEIHwgTTY0Rl9YTF9ETEwgfCBNNjRGX01GQl9GT1JDRV80IHwgTTY0Rl9NT0JJTF9CVVMpCgpzdGF0aWMgc3RydWN0IHsKCXUxNiBwY2lfaWQ7Cgljb25zdCBjaGFyICpuYW1lOwoJaW50IHBsbCwgbWNsaywgeGNsaywgZWNwX21heDsKCXUzMiBmZWF0dXJlczsKfSBhdHlfY2hpcHNbXSBfX2RldmluaXRkYXRhID0gewojaWZkZWYgQ09ORklHX0ZCX0FUWV9HWAoJLyogTWFjaDY0IEdYICovCgl7IFBDSV9DSElQX01BQ0g2NEdYLCAiQVRJODg4R1gwMCAoTWFjaDY0IEdYKSIsIDEzNSwgNTAsIDUwLCAwLCBBVElfQ0hJUF84ODgwMEdYIH0sCgl7IFBDSV9DSElQX01BQ0g2NENYLCAiQVRJODg4Q1gwMCAoTWFjaDY0IENYKSIsIDEzNSwgNTAsIDUwLCAwLCBBVElfQ0hJUF84ODgwMENYIH0sCiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0dYICovCgojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVAoJeyBQQ0lfQ0hJUF9NQUNINjRDVCwgIkFUSTI2NENUIChNYWNoNjQgQ1QpIiwgMTM1LCA2MCwgNjAsIDAsIEFUSV9DSElQXzI2NENUIH0sCgl7IFBDSV9DSElQX01BQ0g2NEVULCAiQVRJMjY0RVQgKE1hY2g2NCBFVCkiLCAxMzUsIDYwLCA2MCwgMCwgQVRJX0NISVBfMjY0RVQgfSwKCgkvKiBGSVhNRSB3aGF0IGlzIHRoaXMgY2hpcD8gKi8KCXsgUENJX0NISVBfTUFDSDY0TFQsICJBVEkyNjRMVCAoTWFjaDY0IExUKSIsIDEzNSwgNjMsIDYzLCAwLCBBVElfQ0hJUF8yNjRMVCB9LAoKCXsgUENJX0NISVBfTUFDSDY0VlQsICJBVEkyNjRWVCAoTWFjaDY0IFZUKSIsIDE3MCwgNjcsIDY3LCA4MCwgQVRJX0NISVBfMjY0VlQgfSwKCXsgUENJX0NISVBfTUFDSDY0R1QsICIzRCBSQUdFIChNYWNoNjQgR1QpIiwgMTM1LCA2MywgNjMsIDgwLCBBVElfQ0hJUF8yNjRHVCB9LAoKCXsgUENJX0NISVBfTUFDSDY0VlUsICJBVEkyNjRWVDMgKE1hY2g2NCBWVSkiLCAyMDAsIDY3LCA2NywgODAsIEFUSV9DSElQXzI2NFZUMyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHVSwgIjNEIFJBR0UgSUkrIChNYWNoNjQgR1UpIiwgMjAwLCA2NywgNjcsIDEwMCwgQVRJX0NISVBfMjY0R1RCIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRMRywgIjNEIFJBR0UgTFQgKE1hY2g2NCBMRykiLCAyMzAsIDYzLCA2MywgMTAwLCBBVElfQ0hJUF8yNjRMVEcgfCBNNjRGX0xUX0xDRF9SRUdTIHwgTTY0Rl9HM19QQl8xMDI0eDc2OCB9LAoKCXsgUENJX0NISVBfTUFDSDY0VlYsICJBVEkyNjRWVDQgKE1hY2g2NCBWVikiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRWVDQgfSwKCgl7IFBDSV9DSElQX01BQ0g2NEdWLCAiM0QgUkFHRSBJSUMgKE1hY2g2NCBHViwgUENJKSIsIDIzMCwgODMsIDgzLCAxMDAsIEFUSV9DSElQXzI2NEdUMkMgfSwKCXsgUENJX0NISVBfTUFDSDY0R1csICIzRCBSQUdFIElJQyAoTWFjaDY0IEdXLCBBR1ApIiwgMjMwLCA4MywgODMsIDEwMCwgQVRJX0NISVBfMjY0R1QyQyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHWSwgIjNEIFJBR0UgSUlDIChNYWNoNjQgR1ksIFBDSSkiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRHVDJDIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdaLCAiM0QgUkFHRSBJSUMgKE1hY2g2NCBHWiwgQUdQKSIsIDIzMCwgODMsIDgzLCAxMDAsIEFUSV9DSElQXzI2NEdUMkMgfSwKCgl7IFBDSV9DSElQX01BQ0g2NEdCLCAiM0QgUkFHRSBQUk8gKE1hY2g2NCBHQiwgQkdBLCBBR1ApIiwgMjMwLCAxMDAsIDEwMCwgMTI1LCBBVElfQ0hJUF8yNjRHVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHRCwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR0QsIEJHQSwgQUdQIDF4KSIsIDIzMCwgMTAwLCAxMDAsIDEyNSwgQVRJX0NISVBfMjY0R1RQUk8gfSwKCXsgUENJX0NISVBfTUFDSDY0R0ksICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdJLCBCR0EsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIHwgTTY0Rl9NQUdJQ19WUkFNX1NJWkUgfSwKCXsgUENJX0NISVBfTUFDSDY0R1AsICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdQLCBQUUZQLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTI1LCBBVElfQ0hJUF8yNjRHVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHUSwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR1EsIFBRRlAsIFBDSSwgbGltaXRlZCAzRCkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRMQiwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTEIsIEFHUCkiLCAyMzYsIDc1LCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfSwKCXsgUENJX0NISVBfTUFDSDY0TEQsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExELCBBR1ApIiwgMjMwLCAxMDAsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMSSwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTEksIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIHwgTTY0Rl9HM19QQl8xXzEgfCBNNjRGX0czX1BCXzEwMjR4NzY4IH0sCgl7IFBDSV9DSElQX01BQ0g2NExQLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMUCwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfSwKCXsgUENJX0NISVBfTUFDSDY0TFEsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExRLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB9LAoKCXsgUENJX0NISVBfTUFDSDY0R00sICIzRCBSQUdFIFhMIChNYWNoNjQgR00sIEFHUCAyeCkiLCAyMzAsIDgzLCA2MywgMTM1LCBBVElfQ0hJUF8yNjRYTCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHTiwgIjNEIFJBR0UgWEMgKE1hY2g2NCBHTiwgQUdQIDJ4KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdPLCAiM0QgUkFHRSBYTCAoTWFjaDY0IEdPLCBQQ0ktNjYpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfSwKCXsgUENJX0NISVBfTUFDSDY0R0wsICIzRCBSQUdFIFhDIChNYWNoNjQgR0wsIFBDSS02NikiLCAyMzAsIDgzLCA2MywgMTM1LCBBVElfQ0hJUF8yNjRYTCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHUiwgIjNEIFJBR0UgWEwgKE1hY2g2NCBHUiwgUENJLTMzKSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwgfSwKCXsgUENJX0NISVBfTUFDSDY0R1MsICIzRCBSQUdFIFhDIChNYWNoNjQgR1MsIFBDSS0zMykiLCAyMzAsIDgzLCA2MywgMTM1LCBBVElfQ0hJUF8yNjRYTCB9LAoKCXsgUENJX0NISVBfTUFDSDY0TE0sICIzRCBSQUdFIE1vYmlsaXR5IFAvTSAoTWFjaDY0IExNLCBBR1AgMngpIiwgMjMwLCA4MywgMTI1LCAxMzUsIEFUSV9DSElQX01PQklMSVRZIH0sCgl7IFBDSV9DSElQX01BQ0g2NExOLCAiM0QgUkFHRSBNb2JpbGl0eSBMIChNYWNoNjQgTE4sIEFHUCAyeCkiLCAyMzAsIDgzLCAxMjUsIDEzNSwgQVRJX0NISVBfTU9CSUxJVFkgfSwKCXsgUENJX0NISVBfTUFDSDY0TFIsICIzRCBSQUdFIE1vYmlsaXR5IFAvTSAoTWFjaDY0IExSLCBQQ0kpIiwgMjMwLCA4MywgMTI1LCAxMzUsIEFUSV9DSElQX01PQklMSVRZIH0sCgl7IFBDSV9DSElQX01BQ0g2NExTLCAiM0QgUkFHRSBNb2JpbGl0eSBMIChNYWNoNjQgTFMsIFBDSSkiLCAyMzAsIDgzLCAxMjUsIDEzNSwgQVRJX0NISVBfTU9CSUxJVFkgfSwKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQ1QgKi8KfTsKCi8qIGNhbiBub3QgZmFpbCAqLwpzdGF0aWMgaW50IF9fZGV2aW5pdCBjb3JyZWN0X2NoaXBzZXQoc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7Cgl1OCByZXY7Cgl1MTYgdHlwZTsKCXUzMiBjaGlwX2lkOwoJY29uc3QgY2hhciAqbmFtZTsKCWludCBpOwoKCWZvciAoaSA9IEFSUkFZX1NJWkUoYXR5X2NoaXBzKSAtIDE7IGkgPj0gMDsgaS0tKQoJCWlmIChwYXItPnBjaV9pZCA9PSBhdHlfY2hpcHNbaV0ucGNpX2lkKQoJCQlicmVhazsKCgluYW1lID0gYXR5X2NoaXBzW2ldLm5hbWU7CglwYXItPnBsbF9saW1pdHMucGxsX21heCA9IGF0eV9jaGlwc1tpXS5wbGw7CglwYXItPnBsbF9saW1pdHMubWNsayA9IGF0eV9jaGlwc1tpXS5tY2xrOwoJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSBhdHlfY2hpcHNbaV0ueGNsazsKCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gYXR5X2NoaXBzW2ldLmVjcF9tYXg7CglwYXItPmZlYXR1cmVzID0gYXR5X2NoaXBzW2ldLmZlYXR1cmVzOwoKCWNoaXBfaWQgPSBhdHlfbGRfbGUzMihDT05GSUdfQ0hJUF9JRCwgcGFyKTsKCXR5cGUgPSBjaGlwX2lkICYgQ0ZHX0NISVBfVFlQRTsKCXJldiA9IChjaGlwX2lkICYgQ0ZHX0NISVBfUkVWKSA+PiAyNDsKCglzd2l0Y2gocGFyLT5wY2lfaWQpIHsKI2lmZGVmIENPTkZJR19GQl9BVFlfR1gKCWNhc2UgUENJX0NISVBfTUFDSDY0R1g6CgkJaWYodHlwZSAhPSAweDAwZDcpCgkJCXJldHVybiAtRU5PREVWOwoJCWJyZWFrOwoJY2FzZSBQQ0lfQ0hJUF9NQUNINjRDWDoKCQlpZih0eXBlICE9IDB4MDA1NykKCQkJcmV0dXJuIC1FTk9ERVY7CgkJYnJlYWs7CiNlbmRpZgojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVAoJY2FzZSBQQ0lfQ0hJUF9NQUNINjRWVDoKCQlzd2l0Y2ggKHJldiAmIDB4MDcpIHsKCQljYXNlIDB4MDA6CgkJCXN3aXRjaCAocmV2ICYgMHhjMCkgewoJCQljYXNlIDB4MDA6CgkJCQluYW1lID0gIkFUSTI2NFZUIChBMykgKE1hY2g2NCBWVCkiOwoJCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAxNzA7CgkJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDY3OwoJCQkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA2NzsKCQkJCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gODA7CgkJCQlwYXItPmZlYXR1cmVzID0gQVRJX0NISVBfMjY0VlQ7CgkJCQlicmVhazsKCQkJY2FzZSAweDQwOgoJCQkJbmFtZSA9ICJBVEkyNjRWVDIgKEE0KSAoTWFjaDY0IFZUKSI7CgkJCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IDIwMDsKCQkJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gNjc7CgkJCQlwYXItPnBsbF9saW1pdHMueGNsayA9IDY3OwoJCQkJcGFyLT5wbGxfbGltaXRzLmVjcF9tYXggPSA4MDsKCQkJCXBhci0+ZmVhdHVyZXMgPSBBVElfQ0hJUF8yNjRWVCB8IE02NEZfTUFHSUNfUE9TVERJVjsKCQkJCWJyZWFrOwoJCQl9CgkJCWJyZWFrOwoJCWNhc2UgMHgwMToKCQkJbmFtZSA9ICJBVEkyNjRWVDMgKEIxKSAoTWFjaDY0IFZUKSI7CgkJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gMjAwOwoJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDY3OwoJCQlwYXItPnBsbF9saW1pdHMueGNsayA9IDY3OwoJCQlwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IDgwOwoJCQlwYXItPmZlYXR1cmVzID0gQVRJX0NISVBfMjY0VlRCOwoJCQlicmVhazsKCQljYXNlIDB4MDI6CgkJCW5hbWUgPSAiQVRJMjY0VlQzIChCMikgKE1hY2g2NCBWVCkiOwoJCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IDIwMDsKCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLmVjcF9tYXggPSA4MDsKCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NFZUMzsKCQkJYnJlYWs7CgkJfQoJCWJyZWFrOwoJY2FzZSBQQ0lfQ0hJUF9NQUNINjRHVDoKCQlzd2l0Y2ggKHJldiAmIDB4MDcpIHsKCQljYXNlIDB4MDE6CgkJCW5hbWUgPSAiM0QgUkFHRSBJSSAoTWFjaDY0IEdUKSI7CgkJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gMTcwOwoJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDY3OwoJCQlwYXItPnBsbF9saW1pdHMueGNsayA9IDY3OwoJCQlwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IDgwOwoJCQlwYXItPmZlYXR1cmVzID0gQVRJX0NISVBfMjY0R1RCOwoJCQlicmVhazsKCQljYXNlIDB4MDI6CgkJCW5hbWUgPSAiM0QgUkFHRSBJSSsgKE1hY2g2NCBHVCkiOwoJCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IDIwMDsKCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLmVjcF9tYXggPSAxMDA7CgkJCXBhci0+ZmVhdHVyZXMgPSBBVElfQ0hJUF8yNjRHVEI7CgkJCWJyZWFrOwoJCX0KCQlicmVhazsKI2VuZGlmCgl9CgoJUFJJTlRLSSgiJXMgWzB4JTA0eCByZXYgMHglMDJ4XVxuIiwgbmFtZSwgdHlwZSwgcmV2KTsKCXJldHVybiAwOwp9CgpzdGF0aWMgY2hhciByYW1fZHJhbVtdIF9fZGV2aW5pdGRhdGEgPSAiRFJBTSI7CnN0YXRpYyBjaGFyIHJhbV9yZXN2W10gX19kZXZpbml0ZGF0YSA9ICJSRVNWIjsKI2lmZGVmIENPTkZJR19GQl9BVFlfR1gKc3RhdGljIGNoYXIgcmFtX3ZyYW1bXSBfX2RldmluaXRkYXRhID0gIlZSQU0iOwojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HWCAqLwojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVApzdGF0aWMgY2hhciByYW1fZWRvW10gX19kZXZpbml0ZGF0YSA9ICJFRE8iOwpzdGF0aWMgY2hhciByYW1fc2RyYW1bXSBfX2RldmluaXRkYXRhID0gIlNEUkFNICgxOjEpIjsKc3RhdGljIGNoYXIgcmFtX3NncmFtW10gX19kZXZpbml0ZGF0YSA9ICJTR1JBTSAoMToxKSI7CnN0YXRpYyBjaGFyIHJhbV9zZHJhbTMyW10gX19kZXZpbml0ZGF0YSA9ICJTRFJBTSAoMjoxKSAoMzItYml0KSI7CnN0YXRpYyBjaGFyIHJhbV9vZmZbXSBfX2RldmluaXRkYXRhID0gIk9GRiI7CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0NUICovCgoKc3RhdGljIHUzMiBwc2V1ZG9fcGFsZXR0ZVsxN107CgojaWZkZWYgQ09ORklHX0ZCX0FUWV9HWApzdGF0aWMgY2hhciAqYXR5X2d4X3JhbVs4XSBfX2RldmluaXRkYXRhID0gewoJcmFtX2RyYW0sIHJhbV92cmFtLCByYW1fdnJhbSwgcmFtX2RyYW0sCglyYW1fZHJhbSwgcmFtX3ZyYW0sIHJhbV92cmFtLCByYW1fcmVzdgp9OwojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HWCAqLwoKI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKc3RhdGljIGNoYXIgKmF0eV9jdF9yYW1bOF0gX19kZXZpbml0ZGF0YSA9IHsKCXJhbV9vZmYsIHJhbV9kcmFtLCByYW1fZWRvLCByYW1fZWRvLAoJcmFtX3NkcmFtLCByYW1fc2dyYW0sIHJhbV9zZHJhbTMyLCByYW1fcmVzdgp9OwojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9DVCAqLwoKc3RhdGljIHUzMiBhdHlmYl9nZXRfcGl4Y2xvY2soc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJdTMyIHBpeGNsb2NrID0gdmFyLT5waXhjbG9jazsKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCXUzMiBsY2Rfb25fb2ZmOwoJcGFyLT5wbGwuY3QueHJlcyA9IDA7CglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCWxjZF9vbl9vZmYgPSBhdHlfbGRfbGNkKExDRF9HRU5fQ05UTCwgcGFyKTsKCQlpZihsY2Rfb25fb2ZmICYgTENEX09OKSB7CgkJCXBhci0+cGxsLmN0LnhyZXMgPSB2YXItPnhyZXM7CgkJCXBpeGNsb2NrID0gcGFyLT5sY2RfcGl4Y2xvY2s7CgkJfQoJfQojZW5kaWYKCXJldHVybiBwaXhjbG9jazsKfQoKI2lmIGRlZmluZWQoQ09ORklHX1BQQykKCi8qCiAqICBBcHBsZSBtb25pdG9yIHNlbnNlCiAqLwoKc3RhdGljIGludCBfX2RldmluaXQgcmVhZF9hdHlfc2Vuc2UoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglpbnQgc2Vuc2UsIGk7CgoJYXR5X3N0X2xlMzIoR1BfSU8sIDB4MzEwMDMxMDAsIHBhcik7IC8qIGRyaXZlIG91dHB1dHMgaGlnaCAqLwoJX19kZWxheSgyMDApOwoJYXR5X3N0X2xlMzIoR1BfSU8sIDAsIHBhcik7IC8qIHR1cm4gb2ZmIG91dHB1dHMgKi8KCV9fZGVsYXkoMjAwMCk7CglpID0gYXR5X2xkX2xlMzIoR1BfSU8sIHBhcik7IC8qIGdldCBwcmltYXJ5IHNlbnNlIHZhbHVlICovCglzZW5zZSA9ICgoaSAmIDB4MzAwMCkgPj4gMykgfCAoaSAmIDB4MTAwKTsKCgkvKiBkcml2ZSBlYWNoIHNlbnNlIGxpbmUgbG93IGluIHR1cm4gYW5kIGNvbGxlY3QgdGhlIG90aGVyIDIgKi8KCWF0eV9zdF9sZTMyKEdQX0lPLCAweDIwMDAwMDAwLCBwYXIpOyAvKiBkcml2ZSBBIGxvdyAqLwoJX19kZWxheSgyMDAwKTsKCWkgPSBhdHlfbGRfbGUzMihHUF9JTywgcGFyKTsKCXNlbnNlIHw9ICgoaSAmIDB4MTAwMCkgPj4gNykgfCAoKGkgJiAweDEwMCkgPj4gNCk7CglhdHlfc3RfbGUzMihHUF9JTywgMHgyMDAwMjAwMCwgcGFyKTsgLyogZHJpdmUgQSBoaWdoIGFnYWluICovCglfX2RlbGF5KDIwMCk7CgoJYXR5X3N0X2xlMzIoR1BfSU8sIDB4MTAwMDAwMDAsIHBhcik7IC8qIGRyaXZlIEIgbG93ICovCglfX2RlbGF5KDIwMDApOwoJaSA9IGF0eV9sZF9sZTMyKEdQX0lPLCBwYXIpOwoJc2Vuc2UgfD0gKChpICYgMHgyMDAwKSA+PiAxMCkgfCAoKGkgJiAweDEwMCkgPj4gNik7CglhdHlfc3RfbGUzMihHUF9JTywgMHgxMDAwMTAwMCwgcGFyKTsgLyogZHJpdmUgQiBoaWdoIGFnYWluICovCglfX2RlbGF5KDIwMCk7CgoJYXR5X3N0X2xlMzIoR1BfSU8sIDB4MDEwMDAwMDAsIHBhcik7IC8qIGRyaXZlIEMgbG93ICovCglfX2RlbGF5KDIwMDApOwoJc2Vuc2UgfD0gKGF0eV9sZF9sZTMyKEdQX0lPLCBwYXIpICYgMHgzMDAwKSA+PiAxMjsKCWF0eV9zdF9sZTMyKEdQX0lPLCAwLCBwYXIpOyAvKiB0dXJuIG9mZiBvdXRwdXRzICovCglyZXR1cm4gc2Vuc2U7Cn0KCiNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QUEMpICovCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKgogKiAgQ1JUQyBwcm9ncmFtbWluZwogKi8KCnN0YXRpYyB2b2lkIGF0eV9nZXRfY3J0Yyhjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIHN0cnVjdCBjcnRjICpjcnRjKQp7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCWlmKCFNNjRfSEFTKExUX0xDRF9SRUdTKSkgewoJCSAgICBjcnRjLT5sY2RfaW5kZXggPSBhdHlfbGRfbGUzMihMQ0RfSU5ERVgsIHBhcik7CgkJICAgIGF0eV9zdF9sZTMyKExDRF9JTkRFWCwgY3J0Yy0+bGNkX2luZGV4LCBwYXIpOwoJCX0KCQljcnRjLT5sY2RfY29uZmlnX3BhbmVsID0gYXR5X2xkX2xjZChDT05GSUdfUEFORUwsIHBhcik7CgkJY3J0Yy0+bGNkX2dlbl9jbnRsID0gYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcik7CgoKCQkvKiBzd2l0Y2ggdG8gbm9uIHNoYWRvdyByZWdpc3RlcnMgKi8KCQlhdHlfc3RfbGNkKExDRF9HRU5fQ05UTCwgY3J0Yy0+bGNkX2dlbl9jbnRsICYKICAgICAgICAgICAgICAgICAgICB+KENSVENfUldfU0VMRUNUIHwgU0hBRE9XX0VOIHwgU0hBRE9XX1JXX0VOKSwgcGFyKTsKCgkJLyogc2F2ZSBzdHJldGNoaW5nICovCgkJY3J0Yy0+aG9yel9zdHJldGNoaW5nID0gYXR5X2xkX2xjZChIT1JaX1NUUkVUQ0hJTkcsIHBhcik7CgkJY3J0Yy0+dmVydF9zdHJldGNoaW5nID0gYXR5X2xkX2xjZChWRVJUX1NUUkVUQ0hJTkcsIHBhcik7CgkJaWYgKCFNNjRfSEFTKExUX0xDRF9SRUdTKSkKCQkJY3J0Yy0+ZXh0X3ZlcnRfc3RyZXRjaCA9IGF0eV9sZF9sY2QoRVhUX1ZFUlRfU1RSRVRDSCwgcGFyKTsKCX0KI2VuZGlmCgljcnRjLT5oX3RvdF9kaXNwID0gYXR5X2xkX2xlMzIoQ1JUQ19IX1RPVEFMX0RJU1AsIHBhcik7CgljcnRjLT5oX3N5bmNfc3RydF93aWQgPSBhdHlfbGRfbGUzMihDUlRDX0hfU1lOQ19TVFJUX1dJRCwgcGFyKTsKCWNydGMtPnZfdG90X2Rpc3AgPSBhdHlfbGRfbGUzMihDUlRDX1ZfVE9UQUxfRElTUCwgcGFyKTsKCWNydGMtPnZfc3luY19zdHJ0X3dpZCA9IGF0eV9sZF9sZTMyKENSVENfVl9TWU5DX1NUUlRfV0lELCBwYXIpOwoJY3J0Yy0+dmxpbmVfY3JudF92bGluZSA9IGF0eV9sZF9sZTMyKENSVENfVkxJTkVfQ1JOVF9WTElORSwgcGFyKTsKCWNydGMtPm9mZl9waXRjaCA9IGF0eV9sZF9sZTMyKENSVENfT0ZGX1BJVENILCBwYXIpOwoJY3J0Yy0+Z2VuX2NudGwgPSBhdHlfbGRfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXIpOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJLyogc3dpdGNoIHRvIHNoYWRvdyByZWdpc3RlcnMgKi8KCQlhdHlfc3RfbGNkKExDRF9HRU5fQ05UTCwgKGNydGMtPmxjZF9nZW5fY250bCAmIH5DUlRDX1JXX1NFTEVDVCkgfAoJCQlTSEFET1dfRU4gfCBTSEFET1dfUldfRU4sIHBhcik7CgoJCWNydGMtPnNoYWRvd19oX3RvdF9kaXNwID0gYXR5X2xkX2xlMzIoQ1JUQ19IX1RPVEFMX0RJU1AsIHBhcik7CgkJY3J0Yy0+c2hhZG93X2hfc3luY19zdHJ0X3dpZCA9IGF0eV9sZF9sZTMyKENSVENfSF9TWU5DX1NUUlRfV0lELCBwYXIpOwoJCWNydGMtPnNoYWRvd192X3RvdF9kaXNwID0gYXR5X2xkX2xlMzIoQ1JUQ19WX1RPVEFMX0RJU1AsIHBhcik7CgkJY3J0Yy0+c2hhZG93X3Zfc3luY19zdHJ0X3dpZCA9IGF0eV9sZF9sZTMyKENSVENfVl9TWU5DX1NUUlRfV0lELCBwYXIpOwoKCQlhdHlfc3RfbGUzMihMQ0RfR0VOX0NOVEwsIGNydGMtPmxjZF9nZW5fY250bCwgcGFyKTsKCX0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgKi8KfQoKc3RhdGljIHZvaWQgYXR5X3NldF9jcnRjKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgY29uc3Qgc3RydWN0IGNydGMgKmNydGMpCnsKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJLyogc3RvcCBDUlRDICovCgkJYXR5X3N0X2xlMzIoQ1JUQ19HRU5fQ05UTCwgY3J0Yy0+Z2VuX2NudGwgJiB+KENSVENfRVhUX0RJU1BfRU4gfCBDUlRDX0VOKSwgcGFyKTsKCgkJLyogdXBkYXRlIG5vbi1zaGFkb3cgcmVnaXN0ZXJzIGZpcnN0ICovCgkJYXR5X3N0X2xjZChDT05GSUdfUEFORUwsIGNydGMtPmxjZF9jb25maWdfcGFuZWwsIHBhcik7CgkJYXR5X3N0X2xjZChMQ0RfR0VOX0NOVEwsIGNydGMtPmxjZF9nZW5fY250bCAmCgkJCX4oQ1JUQ19SV19TRUxFQ1QgfCBTSEFET1dfRU4gfCBTSEFET1dfUldfRU4pLCBwYXIpOwoKCQkvKiB0ZW1wb3JhcmlseSBkaXNhYmxlIHN0cmV0Y2hpbmcgKi8KCQlhdHlfc3RfbGNkKEhPUlpfU1RSRVRDSElORywKCQkJY3J0Yy0+aG9yel9zdHJldGNoaW5nICYKCQkJfihIT1JaX1NUUkVUQ0hfTU9ERSB8IEhPUlpfU1RSRVRDSF9FTiksIHBhcik7CgkJYXR5X3N0X2xjZChWRVJUX1NUUkVUQ0hJTkcsCgkJCWNydGMtPnZlcnRfc3RyZXRjaGluZyAmCgkJCX4oVkVSVF9TVFJFVENIX1JBVElPMSB8IFZFUlRfU1RSRVRDSF9SQVRJTzIgfAoJCQlWRVJUX1NUUkVUQ0hfVVNFMCB8IFZFUlRfU1RSRVRDSF9FTiksIHBhcik7Cgl9CiNlbmRpZgoJLyogdHVybiBvZmYgQ1JUICovCglhdHlfc3RfbGUzMihDUlRDX0dFTl9DTlRMLCBjcnRjLT5nZW5fY250bCAmIH5DUlRDX0VOLCBwYXIpOwoKCURQUklOVEsoInNldHRpbmcgdXAgQ1JUQ1xuIik7CglEUFJJTlRLKCJzZXQgcHJpbWFyeSBDUlQgdG8gJWl4JWkgJWMlYyBjb21wb3NpdGUgJWNcbiIsCgkgICAgKCgoKGNydGMtPmhfdG90X2Rpc3A+PjE2KSAmIDB4ZmYpICsgMSk8PDMpLCAoKChjcnRjLT52X3RvdF9kaXNwPj4xNikgJiAweDdmZikgKyAxKSwKCSAgICAoY3J0Yy0+aF9zeW5jX3N0cnRfd2lkICYgMHgyMDAwMDApPydOJzonUCcsIChjcnRjLT52X3N5bmNfc3RydF93aWQgJiAweDIwMDAwMCk/J04nOidQJywKCSAgICAoY3J0Yy0+Z2VuX2NudGwgJiBDUlRDX0NTWU5DX0VOKT8nUCc6J04nKTsKCglEUFJJTlRLKCJDUlRDX0hfVE9UQUxfRElTUDogJXhcbiIsY3J0Yy0+aF90b3RfZGlzcCk7CglEUFJJTlRLKCJDUlRDX0hfU1lOQ19TVFJUX1dJRDogJXhcbiIsY3J0Yy0+aF9zeW5jX3N0cnRfd2lkKTsKCURQUklOVEsoIkNSVENfVl9UT1RBTF9ESVNQOiAleFxuIixjcnRjLT52X3RvdF9kaXNwKTsKCURQUklOVEsoIkNSVENfVl9TWU5DX1NUUlRfV0lEOiAleFxuIixjcnRjLT52X3N5bmNfc3RydF93aWQpOwoJRFBSSU5USygiQ1JUQ19PRkZfUElUQ0g6ICV4XG4iLCBjcnRjLT5vZmZfcGl0Y2gpOwoJRFBSSU5USygiQ1JUQ19WTElORV9DUk5UX1ZMSU5FOiAleFxuIiwgY3J0Yy0+dmxpbmVfY3JudF92bGluZSk7CglEUFJJTlRLKCJDUlRDX0dFTl9DTlRMOiAleFxuIixjcnRjLT5nZW5fY250bCk7CgoJYXR5X3N0X2xlMzIoQ1JUQ19IX1RPVEFMX0RJU1AsIGNydGMtPmhfdG90X2Rpc3AsIHBhcik7CglhdHlfc3RfbGUzMihDUlRDX0hfU1lOQ19TVFJUX1dJRCwgY3J0Yy0+aF9zeW5jX3N0cnRfd2lkLCBwYXIpOwoJYXR5X3N0X2xlMzIoQ1JUQ19WX1RPVEFMX0RJU1AsIGNydGMtPnZfdG90X2Rpc3AsIHBhcik7CglhdHlfc3RfbGUzMihDUlRDX1ZfU1lOQ19TVFJUX1dJRCwgY3J0Yy0+dl9zeW5jX3N0cnRfd2lkLCBwYXIpOwoJYXR5X3N0X2xlMzIoQ1JUQ19PRkZfUElUQ0gsIGNydGMtPm9mZl9waXRjaCwgcGFyKTsKCWF0eV9zdF9sZTMyKENSVENfVkxJTkVfQ1JOVF9WTElORSwgY3J0Yy0+dmxpbmVfY3JudF92bGluZSwgcGFyKTsKCglhdHlfc3RfbGUzMihDUlRDX0dFTl9DTlRMLCBjcnRjLT5nZW5fY250bCwgcGFyKTsKI2lmIDAKCUZJWE1FCglpZiAocGFyLT5hY2NlbF9mbGFncyAmIEZCX0FDQ0VMRl9URVhUKQoJCWF0eV9pbml0X2VuZ2luZShwYXIsIGluZm8pOwojZW5kaWYKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCS8qIGFmdGVyIHNldHRpbmcgdGhlIENSVEMgcmVnaXN0ZXJzIHdlIHNob3VsZCBzZXQgdGhlIExDRCByZWdpc3RlcnMuICovCglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCS8qIHN3aXRjaCB0byBzaGFkb3cgcmVnaXN0ZXJzICovCgkJYXR5X3N0X2xjZChMQ0RfR0VOX0NOVEwsIChjcnRjLT5sY2RfZ2VuX2NudGwgJiB+Q1JUQ19SV19TRUxFQ1QpIHwKCQkJKFNIQURPV19FTiB8IFNIQURPV19SV19FTiksIHBhcik7CgoJCURQUklOVEsoInNldCBzaGFkb3cgQ1JUIHRvICVpeCVpICVjJWNcbiIsCgkJICAgICgoKChjcnRjLT5zaGFkb3dfaF90b3RfZGlzcD4+MTYpICYgMHhmZikgKyAxKTw8MyksICgoKGNydGMtPnNoYWRvd192X3RvdF9kaXNwPj4xNikgJiAweDdmZikgKyAxKSwKCQkgICAgKGNydGMtPnNoYWRvd19oX3N5bmNfc3RydF93aWQgJiAweDIwMDAwMCk/J04nOidQJywgKGNydGMtPnNoYWRvd192X3N5bmNfc3RydF93aWQgJiAweDIwMDAwMCk/J04nOidQJyk7CgoJCURQUklOVEsoIlNIQURPVyBDUlRDX0hfVE9UQUxfRElTUDogJXhcbiIsIGNydGMtPnNoYWRvd19oX3RvdF9kaXNwKTsKCQlEUFJJTlRLKCJTSEFET1cgQ1JUQ19IX1NZTkNfU1RSVF9XSUQ6ICV4XG4iLCBjcnRjLT5zaGFkb3dfaF9zeW5jX3N0cnRfd2lkKTsKCQlEUFJJTlRLKCJTSEFET1cgQ1JUQ19WX1RPVEFMX0RJU1A6ICV4XG4iLCBjcnRjLT5zaGFkb3dfdl90b3RfZGlzcCk7CgkJRFBSSU5USygiU0hBRE9XIENSVENfVl9TWU5DX1NUUlRfV0lEOiAleFxuIiwgY3J0Yy0+c2hhZG93X3Zfc3luY19zdHJ0X3dpZCk7CgoJCWF0eV9zdF9sZTMyKENSVENfSF9UT1RBTF9ESVNQLCBjcnRjLT5zaGFkb3dfaF90b3RfZGlzcCwgcGFyKTsKCQlhdHlfc3RfbGUzMihDUlRDX0hfU1lOQ19TVFJUX1dJRCwgY3J0Yy0+c2hhZG93X2hfc3luY19zdHJ0X3dpZCwgcGFyKTsKCQlhdHlfc3RfbGUzMihDUlRDX1ZfVE9UQUxfRElTUCwgY3J0Yy0+c2hhZG93X3ZfdG90X2Rpc3AsIHBhcik7CgkJYXR5X3N0X2xlMzIoQ1JUQ19WX1NZTkNfU1RSVF9XSUQsIGNydGMtPnNoYWRvd192X3N5bmNfc3RydF93aWQsIHBhcik7CgoJCS8qIHJlc3RvcmUgQ1JUQyBzZWxlY3Rpb24gJiBzaGFkb3cgc3RhdGUgYW5kIGVuYWJsZSBzdHJldGNoaW5nICovCgkJRFBSSU5USygiTENEX0dFTl9DTlRMOiAleFxuIiwgY3J0Yy0+bGNkX2dlbl9jbnRsKTsKCQlEUFJJTlRLKCJIT1JaX1NUUkVUQ0hJTkc6ICV4XG4iLCBjcnRjLT5ob3J6X3N0cmV0Y2hpbmcpOwoJCURQUklOVEsoIlZFUlRfU1RSRVRDSElORzogJXhcbiIsIGNydGMtPnZlcnRfc3RyZXRjaGluZyk7CgkJaWYoIU02NF9IQVMoTFRfTENEX1JFR1MpKQoJCSAgICBEUFJJTlRLKCJFWFRfVkVSVF9TVFJFVENIOiAleFxuIiwgY3J0Yy0+ZXh0X3ZlcnRfc3RyZXRjaCk7CgoJCWF0eV9zdF9sY2QoTENEX0dFTl9DTlRMLCBjcnRjLT5sY2RfZ2VuX2NudGwsIHBhcik7CgkJYXR5X3N0X2xjZChIT1JaX1NUUkVUQ0hJTkcsIGNydGMtPmhvcnpfc3RyZXRjaGluZywgcGFyKTsKCQlhdHlfc3RfbGNkKFZFUlRfU1RSRVRDSElORywgY3J0Yy0+dmVydF9zdHJldGNoaW5nLCBwYXIpOwoJCWlmKCFNNjRfSEFTKExUX0xDRF9SRUdTKSkgewoJCSAgICBhdHlfc3RfbGNkKEVYVF9WRVJUX1NUUkVUQ0gsIGNydGMtPmV4dF92ZXJ0X3N0cmV0Y2gsIHBhcik7CgkJICAgIGF0eV9sZF9sZTMyKExDRF9JTkRFWCwgcGFyKTsKCQkgICAgYXR5X3N0X2xlMzIoTENEX0lOREVYLCBjcnRjLT5sY2RfaW5kZXgsIHBhcik7CgkJfQoJfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCAqLwp9CgpzdGF0aWMgaW50IGF0eV92YXJfdG9fY3J0Yyhjb25zdCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKCWNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgY3J0YyAqY3J0YykKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJdTMyIHhyZXMsIHlyZXMsIHZ4cmVzLCB2eXJlcywgeG9mZnNldCwgeW9mZnNldCwgYnBwOwoJdTMyIHN5bmMsIHZtb2RlLCB2ZGlzcGxheTsKCXUzMiBoX3RvdGFsLCBoX2Rpc3AsIGhfc3luY19zdHJ0LCBoX3N5bmNfZW5kLCBoX3N5bmNfZGx5LCBoX3N5bmNfd2lkLCBoX3N5bmNfcG9sOwoJdTMyIHZfdG90YWwsIHZfZGlzcCwgdl9zeW5jX3N0cnQsIHZfc3luY19lbmQsIHZfc3luY193aWQsIHZfc3luY19wb2wsIGNfc3luYzsKCXUzMiBwaXhfd2lkdGgsIGRwX3BpeF93aWR0aCwgZHBfY2hhaW5fbWFzazsKCgkvKiBpbnB1dCAqLwoJeHJlcyA9IHZhci0+eHJlczsKCXlyZXMgPSB2YXItPnlyZXM7Cgl2eHJlcyA9IHZhci0+eHJlc192aXJ0dWFsOwoJdnlyZXMgPSB2YXItPnlyZXNfdmlydHVhbDsKCXhvZmZzZXQgPSB2YXItPnhvZmZzZXQ7Cgl5b2Zmc2V0ID0gdmFyLT55b2Zmc2V0OwoJYnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKCWlmIChicHAgPT0gMTYpCgkJYnBwID0gKHZhci0+Z3JlZW4ubGVuZ3RoID09IDUpID8gMTUgOiAxNjsKCXN5bmMgPSB2YXItPnN5bmM7Cgl2bW9kZSA9IHZhci0+dm1vZGU7CgoJLyogY29udmVydCAoYW5kIHJvdW5kIHVwKSBhbmQgdmFsaWRhdGUgKi8KCWlmICh2eHJlcyA8IHhyZXMgKyB4b2Zmc2V0KQoJCXZ4cmVzID0geHJlcyArIHhvZmZzZXQ7CgloX2Rpc3AgPSB4cmVzOwoKCWlmICh2eXJlcyA8IHlyZXMgKyB5b2Zmc2V0KQoJCXZ5cmVzID0geXJlcyArIHlvZmZzZXQ7Cgl2X2Rpc3AgPSB5cmVzOwoKCWlmIChicHAgPD0gOCkgewoJCWJwcCA9IDg7CgkJcGl4X3dpZHRoID0gQ1JUQ19QSVhfV0lEVEhfOEJQUDsKCQlkcF9waXhfd2lkdGggPQoJCSAgICBIT1NUXzhCUFAgfCBTUkNfOEJQUCB8IERTVF84QlBQIHwKCQkgICAgQllURV9PUkRFUl9MU0JfVE9fTVNCOwoJCWRwX2NoYWluX21hc2sgPSBEUF9DSEFJTl84QlBQOwoJfSBlbHNlIGlmIChicHAgPD0gMTUpIHsKCQlicHAgPSAxNjsKCQlwaXhfd2lkdGggPSBDUlRDX1BJWF9XSURUSF8xNUJQUDsKCQlkcF9waXhfd2lkdGggPSBIT1NUXzE1QlBQIHwgU1JDXzE1QlBQIHwgRFNUXzE1QlBQIHwKCQkgICAgQllURV9PUkRFUl9MU0JfVE9fTVNCOwoJCWRwX2NoYWluX21hc2sgPSBEUF9DSEFJTl8xNUJQUDsKCX0gZWxzZSBpZiAoYnBwIDw9IDE2KSB7CgkJYnBwID0gMTY7CgkJcGl4X3dpZHRoID0gQ1JUQ19QSVhfV0lEVEhfMTZCUFA7CgkJZHBfcGl4X3dpZHRoID0gSE9TVF8xNkJQUCB8IFNSQ18xNkJQUCB8IERTVF8xNkJQUCB8CgkJICAgIEJZVEVfT1JERVJfTFNCX1RPX01TQjsKCQlkcF9jaGFpbl9tYXNrID0gRFBfQ0hBSU5fMTZCUFA7Cgl9IGVsc2UgaWYgKGJwcCA8PSAyNCAmJiBNNjRfSEFTKElOVEVHUkFURUQpKSB7CgkJYnBwID0gMjQ7CgkJcGl4X3dpZHRoID0gQ1JUQ19QSVhfV0lEVEhfMjRCUFA7CgkJZHBfcGl4X3dpZHRoID0KCQkgICAgSE9TVF84QlBQIHwgU1JDXzhCUFAgfCBEU1RfOEJQUCB8CgkJICAgIEJZVEVfT1JERVJfTFNCX1RPX01TQjsKCQlkcF9jaGFpbl9tYXNrID0gRFBfQ0hBSU5fMjRCUFA7Cgl9IGVsc2UgaWYgKGJwcCA8PSAzMikgewoJCWJwcCA9IDMyOwoJCXBpeF93aWR0aCA9IENSVENfUElYX1dJRFRIXzMyQlBQOwoJCWRwX3BpeF93aWR0aCA9IEhPU1RfMzJCUFAgfCBTUkNfMzJCUFAgfCBEU1RfMzJCUFAgfAoJCSAgICBCWVRFX09SREVSX0xTQl9UT19NU0I7CgkJZHBfY2hhaW5fbWFzayA9IERQX0NIQUlOXzMyQlBQOwoJfSBlbHNlCgkJRkFJTCgiaW52YWxpZCBicHAiKTsKCglpZiAodnhyZXMgKiB2eXJlcyAqIGJwcCAvIDggPiBpbmZvLT5maXguc21lbV9sZW4pCgkJRkFJTCgibm90IGVub3VnaCB2aWRlbyBSQU0iKTsKCgloX3N5bmNfcG9sID0gc3luYyAmIEZCX1NZTkNfSE9SX0hJR0hfQUNUID8gMCA6IDE7Cgl2X3N5bmNfcG9sID0gc3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCA/IDAgOiAxOwoKCWlmKCh4cmVzID4gMTYwMCkgfHwgKHlyZXMgPiAxMjAwKSkgewoJCUZBSUwoIk1BQ0g2NCBjaGlwcyBhcmUgZGVzaWduZWQgZm9yIG1heCAxNjAweDEyMDBcbiIKCQkic2VsZWN0IGFub3RlciByZXNvbHV0aW9uLiIpOwoJfQoJaF9zeW5jX3N0cnQgPSBoX2Rpc3AgKyB2YXItPnJpZ2h0X21hcmdpbjsKCWhfc3luY19lbmQgPSBoX3N5bmNfc3RydCArIHZhci0+aHN5bmNfbGVuOwoJaF9zeW5jX2RseSAgPSB2YXItPnJpZ2h0X21hcmdpbiAmIDc7CgloX3RvdGFsID0gaF9zeW5jX2VuZCArIGhfc3luY19kbHkgKyB2YXItPmxlZnRfbWFyZ2luOwoKCXZfc3luY19zdHJ0ID0gdl9kaXNwICsgdmFyLT5sb3dlcl9tYXJnaW47Cgl2X3N5bmNfZW5kID0gdl9zeW5jX3N0cnQgKyB2YXItPnZzeW5jX2xlbjsKCXZfdG90YWwgPSB2X3N5bmNfZW5kICsgdmFyLT51cHBlcl9tYXJnaW47CgojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQlpZighTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQkgICAgdTMyIGxjZF9pbmRleCA9IGF0eV9sZF9sZTMyKExDRF9JTkRFWCwgcGFyKTsKCQkgICAgY3J0Yy0+bGNkX2luZGV4ID0gbGNkX2luZGV4ICYKCQkJfihMQ0RfSU5ERVhfTUFTSyB8IExDRF9ESVNQTEFZX0RJUyB8IExDRF9TUkNfU0VMIHwgQ1JUQzJfRElTUExBWV9ESVMpOwoJCSAgICBhdHlfc3RfbGUzMihMQ0RfSU5ERVgsIGxjZF9pbmRleCwgcGFyKTsKCQl9CgoJCWlmICghTTY0X0hBUyhNT0JJTF9CVVMpKQoJCQljcnRjLT5sY2RfaW5kZXggfD0gQ1JUQzJfRElTUExBWV9ESVM7CgoJCWNydGMtPmxjZF9jb25maWdfcGFuZWwgPSBhdHlfbGRfbGNkKENPTkZJR19QQU5FTCwgcGFyKSB8IDB4NDAwMDsKCQljcnRjLT5sY2RfZ2VuX2NudGwgPSBhdHlfbGRfbGNkKExDRF9HRU5fQ05UTCwgcGFyKSAmIH5DUlRDX1JXX1NFTEVDVDsKCgkJY3J0Yy0+bGNkX2dlbl9jbnRsICY9CgkJCX4oSE9SWl9ESVZCWTJfRU4gfCBESVNfSE9SX0NSVF9ESVZCWTIgfCBUVkNMS19QTV9FTiB8CgkJCS8qVkNMS19EQUNfUE1fRU4gfCBVU0VfU0hBRE9XRURfVkVORCB8Ki8KCQkJVVNFX1NIQURPV0VEX1JPV0NVUiB8IFNIQURPV19FTiB8IFNIQURPV19SV19FTik7CgkJY3J0Yy0+bGNkX2dlbl9jbnRsIHw9IERPTlRfU0hBRE9XX1ZQQVIgfCBMT0NLXzhET1Q7CgoJCWlmKChjcnRjLT5sY2RfZ2VuX2NudGwgJiBMQ0RfT04pICYmCgkJCSgoeHJlcyA+IHBhci0+bGNkX3dpZHRoKSB8fCAoeXJlcyA+IHBhci0+bGNkX2hlaWdodCkpKSB7CgkJCS8qIFdlIGNhbm5vdCBkaXNwbGF5IHRoZSBtb2RlIG9uIHRoZSBMQ0QuIElmIHRoZSBDUlQgaXMgZW5hYmxlZAoJCQkgICB3ZSBjYW4gdHVybiBvZmYgdGhlIExDRC4KCQkJICAgSWYgdGhlIENSVCBpcyBvZmYsIGl0IGlzbid0IGEgZ29vZCBpZGVhIHRvIHN3aXRjaCBpdCBvbjsgd2UgZG9uJ3QKCQkJICAga25vdyBpZiBvbmUgaXMgY29ubmVjdGVkLiBTbyBpdCdzIGJldHRlciB0byBmYWlsIHRoZW4uCgkJCSAqLwoJCQlpZiAoY3J0Yy0+bGNkX2dlbl9jbnRsICYgQ1JUX09OKSB7CgkJCQlpZiAoISh2YXItPmFjdGl2YXRlICYgRkJfQUNUSVZBVEVfVEVTVCkpCgkJCQkJUFJJTlRLSSgiRGlzYWJsZSBMQ0QgcGFuZWwsIGJlY2F1c2UgdmlkZW8gbW9kZSBkb2VzIG5vdCBmaXQuXG4iKTsKCQkJCWNydGMtPmxjZF9nZW5fY250bCAmPSB+TENEX09OOwoJCQkJLyphdHlfc3RfbGNkKExDRF9HRU5fQ05UTCwgY3J0Yy0+bGNkX2dlbl9jbnRsLCBwYXIpOyovCgkJCX0gZWxzZSB7CgkJCQlpZiAoISh2YXItPmFjdGl2YXRlICYgRkJfQUNUSVZBVEVfVEVTVCkpCgkJCQkJUFJJTlRLRSgiVmlkZW8gbW9kZSBleGNlZWRzIHNpemUgb2YgTENEIHBhbmVsLlxuQ29ubmVjdCB0aGlzIGNvbXB1dGVyIHRvIGEgY29udmVudGlvbmFsIG1vbml0b3IgaWYgeW91IHJlYWxseSBuZWVkIHRoaXMgbW9kZS5cbiIpOwoJCQkJcmV0dXJuIC1FSU5WQUw7CgkJCX0KCQl9Cgl9CgoJaWYgKChwYXItPmxjZF90YWJsZSAhPSAwKSAmJiAoY3J0Yy0+bGNkX2dlbl9jbnRsICYgTENEX09OKSkgewoJCWludCBWU2NhbiA9IDE7CgkJLyogYnBwIC0+IGJ5dGVzcHAsIDEsNCAtPiAwOyA4IC0+IDI7IDE1LDE2IC0+IDE7IDI0IC0+IDY7IDMyIC0+IDUKCQljb25zdCB1OCBERlBfaF9zeW5jX2RseV9MVFtdID0geyAwLCAyLCAxLCA2LCA1IH07CgkJY29uc3QgdTggQUREX3RvX3N0cnRfd2lkX2FuZF9kbHlfTFRfREFDW10gPSB7IDAsIDUsIDYsIDksIDksIDEyLCAxMiB9OyAgKi8KCgkJdm1vZGUgJj0gfihGQl9WTU9ERV9ET1VCTEUgfCBGQl9WTU9ERV9JTlRFUkxBQ0VEKTsKCgkJLyogVGhpcyBpcyBob3Jyb3IhIFdoZW4gd2Ugc2ltdWxhdGUsIHNheSA2NDB4NDgwIG9uIGFuIDgwMHg2MDAKCQkgICBMQ0QgbW9uaXRvciwgdGhlIENSVEMgc2hvdWxkIGJlIHByb2dyYW1tZWQgODAweDYwMCB2YWx1ZXMgZm9yCgkJICAgdGhlIG5vbiB2aXNpYmxlIHBhcnQsIGJ1dCA2NDB4NDgwIGZvciB0aGUgdmlzaWJsZSBwYXJ0LgoJCSAgIFRoaXMgY29kZSBoYXMgYmVlbiB0ZXN0ZWQgb24gYSBsYXB0b3Agd2l0aCBpdCdzIDE0MDB4MTA1MCBMQ0QKCQkgICBtb25pdG9yIGFuZCBhIGNvbnZlbnRpb25hbCBtb25pdG9yIGJvdGggc3dpdGNoZWQgb24uCgkJICAgVGVzdGVkIG1vZGVzOiAxMjgweDEwMjQsIDExNTJ4ODY0LCAxMDI0eDc2OCwgODAweDYwMCwKCQkgICAgd29ya3Mgd2l0aCBsaXR0bGUgZ2xpdGNoZXMgYWxzbyB3aXRoIERPVUJMRVNDQU4gbW9kZXMKCQkgKi8KCQlpZiAoeXJlcyA8IHBhci0+bGNkX2hlaWdodCkgewoJCQlWU2NhbiA9IHBhci0+bGNkX2hlaWdodCAvIHlyZXM7CgkJCWlmKFZTY2FuID4gMSkgewoJCQkJVlNjYW4gPSAyOwoJCQkJdm1vZGUgfD0gRkJfVk1PREVfRE9VQkxFOwoJCQl9CgkJfQoKCQloX3N5bmNfc3RydCA9IGhfZGlzcCArIHBhci0+bGNkX3JpZ2h0X21hcmdpbjsKCQloX3N5bmNfZW5kID0gaF9zeW5jX3N0cnQgKyBwYXItPmxjZF9oc3luY19sZW47CgkJaF9zeW5jX2RseSA9IC8qREZQX2hfc3luY19kbHlbICggYnBwICsgMSApIC8gMyBdOyAqL3Bhci0+bGNkX2hzeW5jX2RseTsKCQloX3RvdGFsID0gaF9kaXNwICsgcGFyLT5sY2RfaGJsYW5rX2xlbjsKCgkJdl9zeW5jX3N0cnQgPSB2X2Rpc3AgKyBwYXItPmxjZF9sb3dlcl9tYXJnaW4gLyBWU2NhbjsKCQl2X3N5bmNfZW5kID0gdl9zeW5jX3N0cnQgKyBwYXItPmxjZF92c3luY19sZW4gLyBWU2NhbjsKCQl2X3RvdGFsID0gdl9kaXNwICsgcGFyLT5sY2RfdmJsYW5rX2xlbiAvIFZTY2FuOwoJfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCAqLwoKCWhfZGlzcCA9IChoX2Rpc3AgPj4gMykgLSAxOwoJaF9zeW5jX3N0cnQgPSAoaF9zeW5jX3N0cnQgPj4gMykgLSAxOwoJaF9zeW5jX2VuZCA9IChoX3N5bmNfZW5kID4+IDMpIC0gMTsKCWhfdG90YWwgPSAoaF90b3RhbCA+PiAzKSAtIDE7CgloX3N5bmNfd2lkID0gaF9zeW5jX2VuZCAtIGhfc3luY19zdHJ0OwoKCUZBSUxfTUFYKCJoX2Rpc3AgdG9vIGxhcmdlIiwgaF9kaXNwLCAweGZmKTsKCUZBSUxfTUFYKCJoX3N5bmNfc3RydCB0b28gbGFyZ2UiLCBoX3N5bmNfc3RydCwgMHgxZmYpOwoJLypGQUlMX01BWCgiaF9zeW5jX3dpZCB0b28gbGFyZ2UiLCBoX3N5bmNfd2lkLCAweDFmKTsqLwoJaWYoaF9zeW5jX3dpZCA+IDB4MWYpCgkJaF9zeW5jX3dpZCA9IDB4MWY7CglGQUlMX01BWCgiaF90b3RhbCB0b28gbGFyZ2UiLCBoX3RvdGFsLCAweDFmZik7CgoJaWYgKHZtb2RlICYgRkJfVk1PREVfRE9VQkxFKSB7CgkJdl9kaXNwIDw8PSAxOwoJCXZfc3luY19zdHJ0IDw8PSAxOwoJCXZfc3luY19lbmQgPDw9IDE7CgkJdl90b3RhbCA8PD0gMTsKCX0KCgl2ZGlzcGxheSA9IHlyZXM7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECglpZiAoKHBhci0+bGNkX3RhYmxlICE9IDApICYmIChjcnRjLT5sY2RfZ2VuX2NudGwgJiBMQ0RfT04pKQoJCXZkaXNwbGF5ICA9IHBhci0+bGNkX2hlaWdodDsKI2VuZGlmCgoJdl9kaXNwLS07Cgl2X3N5bmNfc3RydC0tOwoJdl9zeW5jX2VuZC0tOwoJdl90b3RhbC0tOwoJdl9zeW5jX3dpZCA9IHZfc3luY19lbmQgLSB2X3N5bmNfc3RydDsKCglGQUlMX01BWCgidl9kaXNwIHRvbyBsYXJnZSIsIHZfZGlzcCwgMHg3ZmYpOwoJRkFJTF9NQVgoInZfc3luY19zdHNydCB0b28gbGFyZ2UiLCB2X3N5bmNfc3RydCwgMHg3ZmYpOwoJLypGQUlMX01BWCgidl9zeW5jX3dpZCB0b28gbGFyZ2UiLCB2X3N5bmNfd2lkLCAweDFmKTsqLwoJaWYodl9zeW5jX3dpZCA+IDB4MWYpCgkJdl9zeW5jX3dpZCA9IDB4MWY7CglGQUlMX01BWCgidl90b3RhbCB0b28gbGFyZ2UiLCB2X3RvdGFsLCAweDdmZik7CgoJY19zeW5jID0gc3luYyAmIEZCX1NZTkNfQ09NUF9ISUdIX0FDVCA/IENSVENfQ1NZTkNfRU4gOiAwOwoKCS8qIG91dHB1dCAqLwoJY3J0Yy0+dnhyZXMgPSB2eHJlczsKCWNydGMtPnZ5cmVzID0gdnlyZXM7CgljcnRjLT54b2Zmc2V0ID0geG9mZnNldDsKCWNydGMtPnlvZmZzZXQgPSB5b2Zmc2V0OwoJY3J0Yy0+YnBwID0gYnBwOwoJY3J0Yy0+b2ZmX3BpdGNoID0gKCh5b2Zmc2V0KnZ4cmVzK3hvZmZzZXQpKmJwcC82NCkgfCAodnhyZXM8PDE5KTsKCWNydGMtPnZsaW5lX2NybnRfdmxpbmUgPSAwOwoKCWNydGMtPmhfdG90X2Rpc3AgPSBoX3RvdGFsIHwgKGhfZGlzcDw8MTYpOwoJY3J0Yy0+aF9zeW5jX3N0cnRfd2lkID0gKGhfc3luY19zdHJ0ICYgMHhmZikgfCAoaF9zeW5jX2RseTw8OCkgfAoJCSgoaF9zeW5jX3N0cnQgJiAweDEwMCk8PDQpIHwgKGhfc3luY193aWQ8PDE2KSB8IChoX3N5bmNfcG9sPDwyMSk7CgljcnRjLT52X3RvdF9kaXNwID0gdl90b3RhbCB8ICh2X2Rpc3A8PDE2KTsKCWNydGMtPnZfc3luY19zdHJ0X3dpZCA9IHZfc3luY19zdHJ0IHwgKHZfc3luY193aWQ8PDE2KSB8ICh2X3N5bmNfcG9sPDwyMSk7CgoJLyogY3J0Yy0+Z2VuX2NudGwgPSBhdHlfbGRfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXIpICYgQ1JUQ19QUkVTRVJWRURfTUFTSzsgKi8KCWNydGMtPmdlbl9jbnRsID0gQ1JUQ19FWFRfRElTUF9FTiB8IENSVENfRU4gfCBwaXhfd2lkdGggfCBjX3N5bmM7CgljcnRjLT5nZW5fY250bCB8PSBDUlRDX1ZHQV9MSU5FQVI7CgoJLyogRW5hYmxlIGRvdWJsZXNjYW4gbW9kZSBpZiByZXF1ZXN0ZWQgKi8KCWlmICh2bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRSkKCQljcnRjLT5nZW5fY250bCB8PSBDUlRDX0RCTF9TQ0FOX0VOOwoJLyogRW5hYmxlIGludGVybGFjZWQgbW9kZSBpZiByZXF1ZXN0ZWQgKi8KCWlmICh2bW9kZSAmIEZCX1ZNT0RFX0lOVEVSTEFDRUQpCgkJY3J0Yy0+Z2VuX2NudGwgfD0gQ1JUQ19JTlRFUkxBQ0VfRU47CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCXZkaXNwbGF5ID0geXJlczsKCQlpZih2bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRSkKCQkJdmRpc3BsYXkgPDw9IDE7CgkJY3J0Yy0+Z2VuX2NudGwgJj0gfihDUlRDMl9FTiB8IENSVEMyX1BJWF9XSURUSCk7CgkJY3J0Yy0+bGNkX2dlbl9jbnRsICY9IH4oSE9SWl9ESVZCWTJfRU4gfCBESVNfSE9SX0NSVF9ESVZCWTIgfAoJCQkvKlRWQ0xLX1BNX0VOIHwgVkNMS19EQUNfUE1fRU4gfCovCgkJCVVTRV9TSEFET1dFRF9WRU5EIHwgVVNFX1NIQURPV0VEX1JPV0NVUiB8IFNIQURPV19FTiB8IFNIQURPV19SV19FTik7CgkJY3J0Yy0+bGNkX2dlbl9jbnRsIHw9IChET05UX1NIQURPV19WUEFSLyogfCBMT0NLXzhET1QqLyk7CgoJCS8qIE1PQklMSVRZIE0xIHRlc3RlZCwgRklYTUU6IExUICovCgkJY3J0Yy0+aG9yel9zdHJldGNoaW5nID0gYXR5X2xkX2xjZChIT1JaX1NUUkVUQ0hJTkcsIHBhcik7CgkJaWYgKCFNNjRfSEFTKExUX0xDRF9SRUdTKSkKCQkJY3J0Yy0+ZXh0X3ZlcnRfc3RyZXRjaCA9IGF0eV9sZF9sY2QoRVhUX1ZFUlRfU1RSRVRDSCwgcGFyKSAmCgkJCQl+KEFVVE9fVkVSVF9SQVRJTyB8IFZFUlRfU1RSRVRDSF9NT0RFIHwgVkVSVF9TVFJFVENIX1JBVElPMyk7CgoJCWNydGMtPmhvcnpfc3RyZXRjaGluZyAmPQoJCQl+KEhPUlpfU1RSRVRDSF9SQVRJTyB8IEhPUlpfU1RSRVRDSF9MT09QIHwgQVVUT19IT1JaX1JBVElPIHwKCQkJSE9SWl9TVFJFVENIX01PREUgfCBIT1JaX1NUUkVUQ0hfRU4pOwoJCWlmICh4cmVzIDwgcGFyLT5sY2Rfd2lkdGggJiYgY3J0Yy0+bGNkX2dlbl9jbnRsICYgTENEX09OKSB7CgkJCWRvIHsKCQkJCS8qCgkJCQkqIFRoZSBob3Jpem9udGFsIGJsZW5kZXIgbWlzYmVoYXZlcyB3aGVuIEhEaXNwbGF5IGlzIGxlc3MgdGhhbiBhCgkJCQkqIGEgY2VydGFpbiB0aHJlc2hvbGQgKDQ0MCBmb3IgYSAxMDI0LXdpZGUgcGFuZWwpLiAgSXQgZG9lc24ndAoJCQkJKiBzdHJldGNoIHN1Y2ggbW9kZXMgZW5vdWdoLiAgVXNlIHBpeGVsIHJlcGxpY2F0aW9uIGluc3RlYWQgb2YKCQkJCSogYmxlbmRpbmcgdG8gc3RyZXRjaCBtb2RlcyB0aGF0IGNhbiBiZSBtYWRlIHRvIGV4YWN0bHkgZml0IHRoZQoJCQkJKiBwYW5lbCB3aWR0aC4gIFRoZSB1bmRvY3VtZW50ZWQgIk5vTENEQmxlbmQiIG9wdGlvbiBhbGxvd3MgdGhlCgkJCQkqIHBpeGVsLXJlcGxpY2F0ZWQgbW9kZSB0byBiZSBzbGlnaHRseSB3aWRlciBvciBuYXJyb3dlciB0aGFuIHRoZQoJCQkJKiBwYW5lbCB3aWR0aC4gIEl0IGFsc28gY2F1c2VzIGEgbW9kZSB0aGF0IGlzIGV4YWN0bHkgaGFsZiBhcyB3aWRlCgkJCQkqIGFzIHRoZSBwYW5lbCB0byBiZSBwaXhlbC1yZXBsaWNhdGVkLCByYXRoZXIgdGhhbiBibGVuZGVkLgoJCQkJKi8KCQkJCWludCBIRGlzcGxheSAgPSB4cmVzICYgfjc7CgkJCQlpbnQgblN0cmV0Y2ggID0gcGFyLT5sY2Rfd2lkdGggLyBIRGlzcGxheTsKCQkJCWludCBSZW1haW5kZXIgPSBwYXItPmxjZF93aWR0aCAlIEhEaXNwbGF5OwoKCQkJCWlmICgoIVJlbWFpbmRlciAmJiAoKG5TdHJldGNoID4gMikpKSB8fAoJCQkJCSgoKEhEaXNwbGF5ICogMTYpIC8gcGFyLT5sY2Rfd2lkdGgpIDwgNykpIHsKCQkJCQlzdGF0aWMgY29uc3QgY2hhciBTdHJldGNoTG9vcHNbXSA9IHsxMCwgMTIsIDEzLCAxNSwgMTZ9OwoJCQkJCWludCBob3J6X3N0cmV0Y2hfbG9vcCA9IC0xLCBCZXN0UmVtYWluZGVyOwoJCQkJCWludCBOdW1lcmF0b3IgPSBIRGlzcGxheSwgRGVub21pbmF0b3IgPSBwYXItPmxjZF93aWR0aDsKCQkJCQlpbnQgSW5kZXggPSA1OwoJCQkJCUFUSVJlZHVjZVJhdGlvKCZOdW1lcmF0b3IsICZEZW5vbWluYXRvcik7CgoJCQkJCUJlc3RSZW1haW5kZXIgPSAoTnVtZXJhdG9yICogMTYpIC8gRGVub21pbmF0b3I7CgkJCQkJd2hpbGUgKC0tSW5kZXggPj0gMCkgewoJCQkJCQlSZW1haW5kZXIgPSAoKERlbm9taW5hdG9yIC0gTnVtZXJhdG9yKSAqIFN0cmV0Y2hMb29wc1tJbmRleF0pICUKCQkJCQkJCURlbm9taW5hdG9yOwoJCQkJCQlpZiAoUmVtYWluZGVyIDwgQmVzdFJlbWFpbmRlcikgewoJCQkJCQkJaG9yel9zdHJldGNoX2xvb3AgPSBJbmRleDsKCQkJCQkJCWlmICghKEJlc3RSZW1haW5kZXIgPSBSZW1haW5kZXIpKQoJCQkJCQkJCWJyZWFrOwoJCQkJCQl9CgkJCQkJfQoKCQkJCQlpZiAoKGhvcnpfc3RyZXRjaF9sb29wID49IDApICYmICFCZXN0UmVtYWluZGVyKSB7CgkJCQkJCWludCBob3J6X3N0cmV0Y2hfcmF0aW8gPSAwLCBBY2N1bXVsYXRvciA9IDA7CgkJCQkJCWludCByZXVzZV9wcmV2aW91cyA9IDE7CgoJCQkJCQlJbmRleCA9IFN0cmV0Y2hMb29wc1tob3J6X3N0cmV0Y2hfbG9vcF07CgoJCQkJCQl3aGlsZSAoLS1JbmRleCA+PSAwKSB7CgkJCQkJCQlpZiAoQWNjdW11bGF0b3IgPiAwKQoJCQkJCQkJCWhvcnpfc3RyZXRjaF9yYXRpbyB8PSByZXVzZV9wcmV2aW91czsKCQkJCQkJCWVsc2UKCQkJCQkJCQlBY2N1bXVsYXRvciArPSBEZW5vbWluYXRvcjsKCQkJCQkJCUFjY3VtdWxhdG9yIC09IE51bWVyYXRvcjsKCQkJCQkJCXJldXNlX3ByZXZpb3VzIDw8PSAxOwoJCQkJCQl9CgoJCQkJCQljcnRjLT5ob3J6X3N0cmV0Y2hpbmcgfD0gKEhPUlpfU1RSRVRDSF9FTiB8CgkJCQkJCQkoKGhvcnpfc3RyZXRjaF9sb29wICYgSE9SWl9TVFJFVENIX0xPT1ApIDw8IDE2KSB8CgkJCQkJCQkoaG9yel9zdHJldGNoX3JhdGlvICYgSE9SWl9TVFJFVENIX1JBVElPKSk7CgkJCQkJCWJyZWFrOyAgICAgIC8qIE91dCBvZiB0aGUgZG8geyAuLi4gfSB3aGlsZSAoMCkgKi8KCQkJCQl9CgkJCQl9CgoJCQkJY3J0Yy0+aG9yel9zdHJldGNoaW5nIHw9IChIT1JaX1NUUkVUQ0hfTU9ERSB8IEhPUlpfU1RSRVRDSF9FTiB8CgkJCQkJKCgoSERpc3BsYXkgKiAoSE9SWl9TVFJFVENIX0JMRU5EICsgMSkpIC8gcGFyLT5sY2Rfd2lkdGgpICYgSE9SWl9TVFJFVENIX0JMRU5EKSk7CgkJCX0gd2hpbGUgKDApOwoJCX0KCgkJaWYgKHZkaXNwbGF5IDwgcGFyLT5sY2RfaGVpZ2h0ICYmIGNydGMtPmxjZF9nZW5fY250bCAmIExDRF9PTikgewoJCQljcnRjLT52ZXJ0X3N0cmV0Y2hpbmcgPSAoVkVSVF9TVFJFVENIX1VTRTAgfCBWRVJUX1NUUkVUQ0hfRU4gfAoJCQkJKCgodmRpc3BsYXkgKiAoVkVSVF9TVFJFVENIX1JBVElPMCArIDEpKSAvIHBhci0+bGNkX2hlaWdodCkgJiBWRVJUX1NUUkVUQ0hfUkFUSU8wKSk7CgoJCQlpZiAoIU02NF9IQVMoTFRfTENEX1JFR1MpICYmCgkJCSAgICB4cmVzIDw9IChNNjRfSEFTKE1PQklMX0JVUyk/MTAyNDo4MDApKQoJCQkJY3J0Yy0+ZXh0X3ZlcnRfc3RyZXRjaCB8PSBWRVJUX1NUUkVUQ0hfTU9ERTsKCQl9IGVsc2UgewoJCQkvKgoJCQkgKiBEb24ndCB1c2UgdmVydGljYWwgYmxlbmRpbmcgaWYgdGhlIG1vZGUgaXMgdG9vIHdpZGUgb3Igbm90CgkJCSAqIHZlcnRpY2FsbHkgc3RyZXRjaGVkLgoJCQkgKi8KCQkJY3J0Yy0+dmVydF9zdHJldGNoaW5nID0gMDsKCQl9CgkJLyogY29weSB0byBzaGFkb3cgY3J0YyAqLwoJCWNydGMtPnNoYWRvd19oX3RvdF9kaXNwID0gY3J0Yy0+aF90b3RfZGlzcDsKCQljcnRjLT5zaGFkb3dfaF9zeW5jX3N0cnRfd2lkID0gY3J0Yy0+aF9zeW5jX3N0cnRfd2lkOwoJCWNydGMtPnNoYWRvd192X3RvdF9kaXNwID0gY3J0Yy0+dl90b3RfZGlzcDsKCQljcnRjLT5zaGFkb3dfdl9zeW5jX3N0cnRfd2lkID0gY3J0Yy0+dl9zeW5jX3N0cnRfd2lkOwoJfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCAqLwoKCWlmIChNNjRfSEFTKE1BR0lDX0ZJRk8pKSB7CgkJLyogRklYTUU6IGRpc3BsYXkgRklGTyBsb3cgd2F0ZXJtYXJrIHZhbHVlcyAqLwoJCWNydGMtPmdlbl9jbnRsIHw9IChhdHlfbGRfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXIpICYgQ1JUQ19GSUZPX0xXTSk7Cgl9CgljcnRjLT5kcF9waXhfd2lkdGggPSBkcF9waXhfd2lkdGg7CgljcnRjLT5kcF9jaGFpbl9tYXNrID0gZHBfY2hhaW5fbWFzazsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBhdHlfY3J0Y190b192YXIoY29uc3Qgc3RydWN0IGNydGMgKmNydGMsIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQp7Cgl1MzIgeHJlcywgeXJlcywgYnBwLCBsZWZ0LCByaWdodCwgdXBwZXIsIGxvd2VyLCBoc2xlbiwgdnNsZW4sIHN5bmM7Cgl1MzIgaF90b3RhbCwgaF9kaXNwLCBoX3N5bmNfc3RydCwgaF9zeW5jX2RseSwgaF9zeW5jX3dpZCwKCSAgICBoX3N5bmNfcG9sOwoJdTMyIHZfdG90YWwsIHZfZGlzcCwgdl9zeW5jX3N0cnQsIHZfc3luY193aWQsIHZfc3luY19wb2wsIGNfc3luYzsKCXUzMiBwaXhfd2lkdGg7Cgl1MzIgZG91YmxlX3NjYW4sIGludGVybGFjZTsKCgkvKiBpbnB1dCAqLwoJaF90b3RhbCA9IGNydGMtPmhfdG90X2Rpc3AgJiAweDFmZjsKCWhfZGlzcCA9IChjcnRjLT5oX3RvdF9kaXNwID4+IDE2KSAmIDB4ZmY7CgloX3N5bmNfc3RydCA9IChjcnRjLT5oX3N5bmNfc3RydF93aWQgJiAweGZmKSB8ICgoY3J0Yy0+aF9zeW5jX3N0cnRfd2lkID4+IDQpICYgMHgxMDApOwoJaF9zeW5jX2RseSA9IChjcnRjLT5oX3N5bmNfc3RydF93aWQgPj4gOCkgJiAweDc7CgloX3N5bmNfd2lkID0gKGNydGMtPmhfc3luY19zdHJ0X3dpZCA+PiAxNikgJiAweDFmOwoJaF9zeW5jX3BvbCA9IChjcnRjLT5oX3N5bmNfc3RydF93aWQgPj4gMjEpICYgMHgxOwoJdl90b3RhbCA9IGNydGMtPnZfdG90X2Rpc3AgJiAweDdmZjsKCXZfZGlzcCA9IChjcnRjLT52X3RvdF9kaXNwID4+IDE2KSAmIDB4N2ZmOwoJdl9zeW5jX3N0cnQgPSBjcnRjLT52X3N5bmNfc3RydF93aWQgJiAweDdmZjsKCXZfc3luY193aWQgPSAoY3J0Yy0+dl9zeW5jX3N0cnRfd2lkID4+IDE2KSAmIDB4MWY7Cgl2X3N5bmNfcG9sID0gKGNydGMtPnZfc3luY19zdHJ0X3dpZCA+PiAyMSkgJiAweDE7CgljX3N5bmMgPSBjcnRjLT5nZW5fY250bCAmIENSVENfQ1NZTkNfRU4gPyAxIDogMDsKCXBpeF93aWR0aCA9IGNydGMtPmdlbl9jbnRsICYgQ1JUQ19QSVhfV0lEVEhfTUFTSzsKCWRvdWJsZV9zY2FuID0gY3J0Yy0+Z2VuX2NudGwgJiBDUlRDX0RCTF9TQ0FOX0VOOwoJaW50ZXJsYWNlID0gY3J0Yy0+Z2VuX2NudGwgJiBDUlRDX0lOVEVSTEFDRV9FTjsKCgkvKiBjb252ZXJ0ICovCgl4cmVzID0gKGhfZGlzcCArIDEpICogODsKCXlyZXMgPSB2X2Rpc3AgKyAxOwoJbGVmdCA9IChoX3RvdGFsIC0gaF9zeW5jX3N0cnQgLSBoX3N5bmNfd2lkKSAqIDggLSBoX3N5bmNfZGx5OwoJcmlnaHQgPSAoaF9zeW5jX3N0cnQgLSBoX2Rpc3ApICogOCArIGhfc3luY19kbHk7Cgloc2xlbiA9IGhfc3luY193aWQgKiA4OwoJdXBwZXIgPSB2X3RvdGFsIC0gdl9zeW5jX3N0cnQgLSB2X3N5bmNfd2lkOwoJbG93ZXIgPSB2X3N5bmNfc3RydCAtIHZfZGlzcDsKCXZzbGVuID0gdl9zeW5jX3dpZDsKCXN5bmMgPSAoaF9zeW5jX3BvbCA/IDAgOiBGQl9TWU5DX0hPUl9ISUdIX0FDVCkgfAoJICAgICh2X3N5bmNfcG9sID8gMCA6IEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkgfAoJICAgIChjX3N5bmMgPyBGQl9TWU5DX0NPTVBfSElHSF9BQ1QgOiAwKTsKCglzd2l0Y2ggKHBpeF93aWR0aCkgewojaWYgMAoJY2FzZSBDUlRDX1BJWF9XSURUSF80QlBQOgoJCWJwcCA9IDQ7CgkJdmFyLT5yZWQub2Zmc2V0ID0gMDsKCQl2YXItPnJlZC5sZW5ndGggPSA4OwoJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gMDsKCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CgkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CgkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7CgkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOwoJCWJyZWFrOwojZW5kaWYKCWNhc2UgQ1JUQ19QSVhfV0lEVEhfOEJQUDoKCQlicHAgPSA4OwoJCXZhci0+cmVkLm9mZnNldCA9IDA7CgkJdmFyLT5yZWQubGVuZ3RoID0gODsKCQl2YXItPmdyZWVuLm9mZnNldCA9IDA7CgkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OwoJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwoJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OwoJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7CgkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKCQlicmVhazsKCWNhc2UgQ1JUQ19QSVhfV0lEVEhfMTVCUFA6CS8qIFJHQiA1NTUgKi8KCQlicHAgPSAxNjsKCQl2YXItPnJlZC5vZmZzZXQgPSAxMDsKCQl2YXItPnJlZC5sZW5ndGggPSA1OwoJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsKCQl2YXItPmdyZWVuLmxlbmd0aCA9IDU7CgkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CgkJdmFyLT5ibHVlLmxlbmd0aCA9IDU7CgkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOwoJCWJyZWFrOwoJY2FzZSBDUlRDX1BJWF9XSURUSF8xNkJQUDoJLyogUkdCIDU2NSAqLwoJCWJwcCA9IDE2OwoJCXZhci0+cmVkLm9mZnNldCA9IDExOwoJCXZhci0+cmVkLmxlbmd0aCA9IDU7CgkJdmFyLT5ncmVlbi5vZmZzZXQgPSA1OwoJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNjsKCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOwoJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CgkJYnJlYWs7CgljYXNlIENSVENfUElYX1dJRFRIXzI0QlBQOgkvKiBSR0IgODg4ICovCgkJYnBwID0gMjQ7CgkJdmFyLT5yZWQub2Zmc2V0ID0gMTY7CgkJdmFyLT5yZWQubGVuZ3RoID0gODsKCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7CgkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OwoJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwoJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OwoJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7CgkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKCQlicmVhazsKCWNhc2UgQ1JUQ19QSVhfV0lEVEhfMzJCUFA6CS8qIEFSR0IgODg4OCAqLwoJCWJwcCA9IDMyOwoJCXZhci0+cmVkLm9mZnNldCA9IDE2OwoJCXZhci0+cmVkLmxlbmd0aCA9IDg7CgkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OwoJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKCQl2YXItPmJsdWUubGVuZ3RoID0gODsKCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAyNDsKCQl2YXItPnRyYW5zcC5sZW5ndGggPSA4OwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlQUklOVEtFKCJJbnZhbGlkIHBpeGVsIHdpZHRoXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvKiBvdXRwdXQgKi8KCXZhci0+eHJlcyA9IHhyZXM7Cgl2YXItPnlyZXMgPSB5cmVzOwoJdmFyLT54cmVzX3ZpcnR1YWwgPSBjcnRjLT52eHJlczsKCXZhci0+eXJlc192aXJ0dWFsID0gY3J0Yy0+dnlyZXM7Cgl2YXItPmJpdHNfcGVyX3BpeGVsID0gYnBwOwoJdmFyLT5sZWZ0X21hcmdpbiA9IGxlZnQ7Cgl2YXItPnJpZ2h0X21hcmdpbiA9IHJpZ2h0OwoJdmFyLT51cHBlcl9tYXJnaW4gPSB1cHBlcjsKCXZhci0+bG93ZXJfbWFyZ2luID0gbG93ZXI7Cgl2YXItPmhzeW5jX2xlbiA9IGhzbGVuOwoJdmFyLT52c3luY19sZW4gPSB2c2xlbjsKCXZhci0+c3luYyA9IHN5bmM7Cgl2YXItPnZtb2RlID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKCS8qIEluIGRvdWJsZSBzY2FuIG1vZGUsIHRoZSB2ZXJ0aWNhbCBwYXJhbWV0ZXJzIGFyZSBkb3VibGVkLCBzbyB3ZSBuZWVkIHRvCgkgICBoYWxmIHRoZW0gdG8gZ2V0IHRoZSByaWdodCB2YWx1ZXMuCgkgICBJbiBpbnRlcmxhY2VkIG1vZGUgdGhlIHZhbHVlcyBhcmUgYWxyZWFkeSBjb3JyZWN0LCBzbyBubyBjb3JyZWN0aW9uIGlzCgkgICBuZWNlc3NhcnkuCgkgKi8KCWlmIChpbnRlcmxhY2UpCgkJdmFyLT52bW9kZSA9IEZCX1ZNT0RFX0lOVEVSTEFDRUQ7CgoJaWYgKGRvdWJsZV9zY2FuKSB7CgkJdmFyLT52bW9kZSA9IEZCX1ZNT0RFX0RPVUJMRTsKCQl2YXItPnlyZXM+Pj0xOwoJCXZhci0+dXBwZXJfbWFyZ2luPj49MTsKCQl2YXItPmxvd2VyX21hcmdpbj4+PTE7CgkJdmFyLT52c3luY19sZW4+Pj0xOwoJfQoKCXJldHVybiAwOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgpzdGF0aWMgaW50IGF0eWZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmluZm8tPnZhcjsKCXUzMiB0bXAsIHBpeGNsb2NrOwoJaW50IGVycjsKI2lmZGVmIERFQlVHCglzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZGVidWc7Cgl1MzIgcGl4Y2xvY2tfaW5fcHM7CiNlbmRpZgoJaWYgKHBhci0+YXNsZWVwKQoJCXJldHVybiAwOwoKCWlmICgoZXJyID0gYXR5X3Zhcl90b19jcnRjKGluZm8sIHZhciwgJnBhci0+Y3J0YykpKQoJCXJldHVybiBlcnI7CgoJcGl4Y2xvY2sgPSBhdHlmYl9nZXRfcGl4Y2xvY2sodmFyLCBwYXIpOwoKCWlmIChwaXhjbG9jayA9PSAwKSB7CgkJUFJJTlRLRSgiSW52YWxpZCBwaXhjbG9ja1xuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9IGVsc2UgewoJCWlmKChlcnIgPSBwYXItPnBsbF9vcHMtPnZhcl90b19wbGwoaW5mbywgcGl4Y2xvY2ssIHZhci0+Yml0c19wZXJfcGl4ZWwsICZwYXItPnBsbCkpKQoJCQlyZXR1cm4gZXJyOwoJfQoKCXBhci0+YWNjZWxfZmxhZ3MgPSB2YXItPmFjY2VsX2ZsYWdzOyAvKiBoYWNrICovCgoJaWYgKHZhci0+YWNjZWxfZmxhZ3MpIHsKCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyA9IGF0eWZiX3N5bmM7CgkJaW5mby0+ZmxhZ3MgJj0gfkZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOwoJfSBlbHNlIHsKCQlpbmZvLT5mYm9wcy0+ZmJfc3luYyA9IE5VTEw7CgkJaW5mby0+ZmxhZ3MgfD0gRkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7Cgl9CgoJaWYgKHBhci0+YmxpdHRlcl9tYXlfYmVfYnVzeSkKCQl3YWl0X2Zvcl9pZGxlKHBhcik7CgoJYXR5X3NldF9jcnRjKHBhciwgJnBhci0+Y3J0Yyk7CglwYXItPmRhY19vcHMtPnNldF9kYWMoaW5mbywgJnBhci0+cGxsLCB2YXItPmJpdHNfcGVyX3BpeGVsLCBwYXItPmFjY2VsX2ZsYWdzKTsKCXBhci0+cGxsX29wcy0+c2V0X3BsbChpbmZvLCAmcGFyLT5wbGwpOwoKI2lmZGVmIERFQlVHCglpZihwYXItPnBsbF9vcHMgJiYgcGFyLT5wbGxfb3BzLT5wbGxfdG9fdmFyKQoJCXBpeGNsb2NrX2luX3BzID0gcGFyLT5wbGxfb3BzLT5wbGxfdG9fdmFyKGluZm8sICYocGFyLT5wbGwpKTsKCWVsc2UKCQlwaXhjbG9ja19pbl9wcyA9IDA7CgoJaWYoMCA9PSBwaXhjbG9ja19pbl9wcykgewoJCVBSSU5US0UoIkFMRVJUIG9wcy0+cGxsX3RvX3ZhciBnZXQgMFxuIik7CgkJcGl4Y2xvY2tfaW5fcHMgPSBwaXhjbG9jazsKCX0KCgltZW1zZXQoJmRlYnVnLCAwLCBzaXplb2YoZGVidWcpKTsKCWlmKCFhdHlfY3J0Y190b192YXIoJihwYXItPmNydGMpLCAmZGVidWcpKSB7CgkJdTMyIGhTeW5jLCB2UmVmcmVzaDsKCQl1MzIgaF9kaXNwLCBoX3N5bmNfc3RydCwgaF9zeW5jX2VuZCwgaF90b3RhbDsKCQl1MzIgdl9kaXNwLCB2X3N5bmNfc3RydCwgdl9zeW5jX2VuZCwgdl90b3RhbDsKCgkJaF9kaXNwID0gZGVidWcueHJlczsKCQloX3N5bmNfc3RydCA9IGhfZGlzcCArIGRlYnVnLnJpZ2h0X21hcmdpbjsKCQloX3N5bmNfZW5kID0gaF9zeW5jX3N0cnQgKyBkZWJ1Zy5oc3luY19sZW47CgkJaF90b3RhbCA9IGhfc3luY19lbmQgKyBkZWJ1Zy5sZWZ0X21hcmdpbjsKCQl2X2Rpc3AgPSBkZWJ1Zy55cmVzOwoJCXZfc3luY19zdHJ0ID0gdl9kaXNwICsgZGVidWcubG93ZXJfbWFyZ2luOwoJCXZfc3luY19lbmQgPSB2X3N5bmNfc3RydCArIGRlYnVnLnZzeW5jX2xlbjsKCQl2X3RvdGFsID0gdl9zeW5jX2VuZCArIGRlYnVnLnVwcGVyX21hcmdpbjsKCgkJaFN5bmMgPSAxMDAwMDAwMDAwIC8gKHBpeGNsb2NrX2luX3BzICogaF90b3RhbCk7CgkJdlJlZnJlc2ggPSAoaFN5bmMgKiAxMDAwKSAvIHZfdG90YWw7CiAgICAgICAgCWlmIChwYXItPmNydGMuZ2VuX2NudGwgJiBDUlRDX0lOVEVSTEFDRV9FTikKICAgICAgICAgICAgCXZSZWZyZXNoICo9IDI7CiAgICAgICAgCWlmIChwYXItPmNydGMuZ2VuX2NudGwgJiBDUlRDX0RCTF9TQ0FOX0VOKQogICAgICAgICAgICAJdlJlZnJlc2ggLz0gMjsKCgkJRFBSSU5USygiYXR5ZmJfc2V0X3BhclxuIik7CgkJRFBSSU5USygiIFNldCBWaXNpYmxlIE1vZGUgdG8gJWl4JWktJWlcbiIsIHZhci0+eHJlcywgdmFyLT55cmVzLCB2YXItPmJpdHNfcGVyX3BpeGVsKTsKCQlEUFJJTlRLKCIgVmlydHVhbCByZXNvbHV0aW9uICVpeCVpLCBwaXhjbG9ja19pbl9wcyAlaSAoY2FsY3VsYXRlZCAlaSlcbiIsCgkJCXZhci0+eHJlc192aXJ0dWFsLCB2YXItPnlyZXNfdmlydHVhbCwgcGl4Y2xvY2ssIHBpeGNsb2NrX2luX3BzKTsKCQlEUFJJTlRLKCIgRG90IGNsb2NrOiAgICAgICAgICAgJWkgTUh6XG4iLCAxMDAwMDAwIC8gcGl4Y2xvY2tfaW5fcHMpOwoJCURQUklOVEsoIiBIb3Jpem9udGFsIHN5bmM6ICAgICAlaSBrSHpcbiIsIGhTeW5jKTsKCQlEUFJJTlRLKCIgVmVydGljYWwgcmVmcmVzaDogICAgJWkgSHpcbiIsIHZSZWZyZXNoKTsKCQlEUFJJTlRLKCIgeCAgc3R5bGU6ICVpLiUwM2kgJWkgJWkgJWkgJWkgICAlaSAlaSAlaSAlaVxuIiwKCQkJMTAwMDAwMCAvIHBpeGNsb2NrX2luX3BzLCAxMDAwMDAwICUgcGl4Y2xvY2tfaW5fcHMsCgkJCWhfZGlzcCwgaF9zeW5jX3N0cnQsIGhfc3luY19lbmQsIGhfdG90YWwsCgkJCXZfZGlzcCwgdl9zeW5jX3N0cnQsIHZfc3luY19lbmQsIHZfdG90YWwpOwoJCURQUklOVEsoIiBmYiBzdHlsZTogJWkgICVpICVpICVpICVpICVpICVpICVpICVpXG4iLAoJCQlwaXhjbG9ja19pbl9wcywKCQkJZGVidWcubGVmdF9tYXJnaW4sIGhfZGlzcCwgZGVidWcucmlnaHRfbWFyZ2luLCBkZWJ1Zy5oc3luY19sZW4sCgkJCWRlYnVnLnVwcGVyX21hcmdpbiwgdl9kaXNwLCBkZWJ1Zy5sb3dlcl9tYXJnaW4sIGRlYnVnLnZzeW5jX2xlbik7Cgl9CiNlbmRpZiAvKiBERUJVRyAqLwoKCWlmICghTTY0X0hBUyhJTlRFR1JBVEVEKSkgewoJCS8qIERvbid0IGZvcmdldCBNRU1fQ05UTCAqLwoJCXRtcCA9IGF0eV9sZF9sZTMyKE1FTV9DTlRMLCBwYXIpICYgMHhmMGZmZmZmZjsKCQlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKCQljYXNlIDg6CgkJCXRtcCB8PSAweDAyMDAwMDAwOwoJCQlicmVhazsKCQljYXNlIDE2OgoJCQl0bXAgfD0gMHgwMzAwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSAzMjoKCQkJdG1wIHw9IDB4MDYwMDAwMDA7CgkJCWJyZWFrOwoJCX0KCQlhdHlfc3RfbGUzMihNRU1fQ05UTCwgdG1wLCBwYXIpOwoJfSBlbHNlIHsKCQl0bXAgPSBhdHlfbGRfbGUzMihNRU1fQ05UTCwgcGFyKSAmIDB4ZjAwZmZmZmY7CgkJaWYgKCFNNjRfSEFTKE1BR0lDX1BPU1RESVYpKQoJCQl0bXAgfD0gcGFyLT5tZW1fcmVmcmVzaF9yYXRlIDw8IDIwOwoJCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgewoJCWNhc2UgODoKCQljYXNlIDI0OgoJCQl0bXAgfD0gMHgwMDAwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSAxNjoKCQkJdG1wIHw9IDB4MDQwMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgMzI6CgkJCXRtcCB8PSAweDA4MDAwMDAwOwoJCQlicmVhazsKCQl9CgkJaWYgKE02NF9IQVMoQ1RfQlVTKSkgewoJCQlhdHlfc3RfbGUzMihEQUNfQ05UTCwgMHg4NzAxMDE4NCwgcGFyKTsKCQkJYXR5X3N0X2xlMzIoQlVTX0NOVEwsIDB4NjgwMDAwZjksIHBhcik7CgkJfSBlbHNlIGlmIChNNjRfSEFTKFZUX0JVUykpIHsKCQkJYXR5X3N0X2xlMzIoREFDX0NOVEwsIDB4ODcwMTAxODQsIHBhcik7CgkJCWF0eV9zdF9sZTMyKEJVU19DTlRMLCAweDY4MDAwMGY5LCBwYXIpOwoJCX0gZWxzZSBpZiAoTTY0X0hBUyhNT0JJTF9CVVMpKSB7CgkJCWF0eV9zdF9sZTMyKERBQ19DTlRMLCAweDgwMDEwMTAyLCBwYXIpOwoJCQlhdHlfc3RfbGUzMihCVVNfQ05UTCwgMHg3YjMzYTA0MCB8IChwYXItPmF1eF9zdGFydCA/IEJVU19BUEVSX1JFR19ESVMgOiAwKSwgcGFyKTsKCQl9IGVsc2UgewoJCQkvKiBHVCAqLwoJCQlhdHlfc3RfbGUzMihEQUNfQ05UTCwgMHg4NjAxMDEwMiwgcGFyKTsKCQkJYXR5X3N0X2xlMzIoQlVTX0NOVEwsIDB4N2IyM2EwNDAgfCAocGFyLT5hdXhfc3RhcnQgPyBCVVNfQVBFUl9SRUdfRElTIDogMCksIHBhcik7CgkJCWF0eV9zdF9sZTMyKEVYVF9NRU1fQ05UTCwgYXR5X2xkX2xlMzIoRVhUX01FTV9DTlRMLCBwYXIpIHwgMHg1MDAwMDAxLCBwYXIpOwoJCX0KCQlhdHlfc3RfbGUzMihNRU1fQ05UTCwgdG1wLCBwYXIpOwoJfQoJYXR5X3N0XzgoREFDX01BU0ssIDB4ZmYsIHBhcik7CgoJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gdmFyLT54cmVzX3ZpcnR1YWwgKiB2YXItPmJpdHNfcGVyX3BpeGVsLzg7CglpbmZvLT5maXgudmlzdWFsID0gdmFyLT5iaXRzX3Blcl9waXhlbCA8PSA4ID8KCQlGQl9WSVNVQUxfUFNFVURPQ09MT1IgOiBGQl9WSVNVQUxfRElSRUNUQ09MT1I7CgoJLyogSW5pdGlhbGl6ZSB0aGUgZ3JhcGhpY3MgZW5naW5lICovCglpZiAocGFyLT5hY2NlbF9mbGFncyAmIEZCX0FDQ0VMRl9URVhUKQoJCWF0eV9pbml0X2VuZ2luZShwYXIsIGluZm8pOwoKI2lmZGVmIENPTkZJR19CT09UWF9URVhUCglidGV4dF91cGRhdGVfZGlzcGxheShpbmZvLT5maXguc21lbV9zdGFydCwKCQkoKChwYXItPmNydGMuaF90b3RfZGlzcCA+PiAxNikgJiAweGZmKSArIDEpICogOCwKCQkoKHBhci0+Y3J0Yy52X3RvdF9kaXNwID4+IDE2KSAmIDB4N2ZmKSArIDEsCgkJdmFyLT5iaXRzX3Blcl9waXhlbCwKCQlwYXItPmNydGMudnhyZXMgKiB2YXItPmJpdHNfcGVyX3BpeGVsIC8gOCk7CiNlbmRpZiAvKiBDT05GSUdfQk9PVFhfVEVYVCAqLwojaWYgMAoJLyogc3dpdGNoIHRvIGFjY2VsZXJhdG9yIG1vZGUgKi8KCWlmICghKHBhci0+Y3J0Yy5nZW5fY250bCAmIENSVENfRVhUX0RJU1BfRU4pKQoJCWF0eV9zdF9sZTMyKENSVENfR0VOX0NOVEwsIHBhci0+Y3J0Yy5nZW5fY250bCB8IENSVENfRVhUX0RJU1BfRU4sIHBhcik7CiNlbmRpZgojaWZkZWYgREVCVUcKewoJLyogZHVtcCBub24gc2hhZG93IENSVEMsIHBsbCwgTENEIHJlZ2lzdGVycyAqLwoJaW50IGk7IHUzMiBiYXNlOwoKCS8qIENSVEMgcmVnaXN0ZXJzICovCgliYXNlID0gMHgyMDAwOwoJcHJpbnRrKCJkZWJ1ZyBhdHlmYjogTWFjaDY0IG5vbi1zaGFkb3cgcmVnaXN0ZXIgdmFsdWVzOiIpOwoJZm9yIChpID0gMDsgaSA8IDI1NjsgaSA9IGkrNCkgewoJCWlmKGklMTYgPT0gMCkgcHJpbnRrKCJcbmRlYnVnIGF0eWZiOiAweCUwNFg6ICIsIGJhc2UgKyBpKTsKCQlwcmludGsoIiAlMDhYIiwgYXR5X2xkX2xlMzIoaSwgcGFyKSk7Cgl9CglwcmludGsoIlxuXG4iKTsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0NUCgkvKiBQTEwgcmVnaXN0ZXJzICovCgliYXNlID0gMHgwMDsKCXByaW50aygiZGVidWcgYXR5ZmI6IE1hY2g2NCBQTEwgcmVnaXN0ZXIgdmFsdWVzOiIpOwoJZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKCQlpZihpJTE2ID09IDApIHByaW50aygiXG5kZWJ1ZyBhdHlmYjogMHglMDJYOiAiLCBiYXNlICsgaSk7CgkJaWYoaSU0ID09IDApICBwcmludGsoIiAiKTsKCQlwcmludGsoIiUwMlgiLCBhdHlfbGRfcGxsX2N0KGksIHBhcikpOwoJfQoJcHJpbnRrKCJcblxuIik7CiNlbmRpZgkvKiBDT05GSUdfRkJfQVRZX0NUICovCgojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQkvKiBMQ0QgcmVnaXN0ZXJzICovCgkJYmFzZSA9IDB4MDA7CgkJcHJpbnRrKCJkZWJ1ZyBhdHlmYjogTENEIHJlZ2lzdGVyIHZhbHVlczoiKTsKCQlpZihNNjRfSEFTKExUX0xDRF9SRUdTKSkgewoJCSAgICBmb3IoaSA9IDA7IGkgPD0gUE9XRVJfTUFOQUdFTUVOVDsgaSsrKSB7CgkJCWlmKGkgPT0gRVhUX1ZFUlRfU1RSRVRDSCkKCQkJICAgIGNvbnRpbnVlOwoJCQlwcmludGsoIlxuZGVidWcgYXR5ZmI6IDB4JTA0WDogIiwgbHRfbGNkX3JlZ3NbaV0pOwoJCQlwcmludGsoIiAlMDhYIiwgYXR5X2xkX2xjZChpLCBwYXIpKTsKCQkgICAgfQoKCQl9IGVsc2UgewoJCSAgICBmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewoJCQlpZihpJTQgPT0gMCkgcHJpbnRrKCJcbmRlYnVnIGF0eWZiOiAweCUwMlg6ICIsIGJhc2UgKyBpKTsKCQkJcHJpbnRrKCIgJTA4WCIsIGF0eV9sZF9sY2QoaSwgcGFyKSk7CgkJICAgIH0KCQl9CgkJcHJpbnRrKCJcblxuIik7Cgl9CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEICovCn0KI2VuZGlmIC8qIERFQlVHICovCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBhdHlmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CglpbnQgZXJyOwoJc3RydWN0IGNydGMgY3J0YzsKCXVuaW9uIGF0eV9wbGwgcGxsOwoJdTMyIHBpeGNsb2NrOwoKCW1lbWNweSgmcGxsLCAmKHBhci0+cGxsKSwgc2l6ZW9mKHBsbCkpOwoKCWlmKChlcnIgPSBhdHlfdmFyX3RvX2NydGMoaW5mbywgdmFyLCAmY3J0YykpKQoJCXJldHVybiBlcnI7CgoJcGl4Y2xvY2sgPSBhdHlmYl9nZXRfcGl4Y2xvY2sodmFyLCBwYXIpOwoKCWlmIChwaXhjbG9jayA9PSAwKSB7CgkJaWYgKCEodmFyLT5hY3RpdmF0ZSAmIEZCX0FDVElWQVRFX1RFU1QpKQoJCQlQUklOVEtFKCJJbnZhbGlkIHBpeGNsb2NrXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0gZWxzZSB7CgkJaWYoKGVyciA9IHBhci0+cGxsX29wcy0+dmFyX3RvX3BsbChpbmZvLCBwaXhjbG9jaywgdmFyLT5iaXRzX3Blcl9waXhlbCwgJnBsbCkpKQoJCQlyZXR1cm4gZXJyOwoJfQoKCWlmICh2YXItPmFjY2VsX2ZsYWdzICYgRkJfQUNDRUxGX1RFWFQpCgkJaW5mby0+dmFyLmFjY2VsX2ZsYWdzID0gRkJfQUNDRUxGX1RFWFQ7CgllbHNlCgkJaW5mby0+dmFyLmFjY2VsX2ZsYWdzID0gMDsKCiNpZiAwIC8qIGZibW9uIGlzIG5vdCBkb25lLiB1bmNvbW1lbnQgZm9yIDIuNS54IC1icmFkICovCglpZiAoIWZibW9uX3ZhbGlkX3RpbWluZ3MocGl4Y2xvY2ssIGh0b3RhbCwgdnRvdGFsLCBpbmZvKSkKCQlyZXR1cm4gLUVJTlZBTDsKI2VuZGlmCglhdHlfY3J0Y190b192YXIoJmNydGMsIHZhcik7Cgl2YXItPnBpeGNsb2NrID0gcGFyLT5wbGxfb3BzLT5wbGxfdG9fdmFyKGluZm8sICZwbGwpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIHNldF9vZmZfcGl0Y2goc3RydWN0IGF0eWZiX3BhciAqcGFyLCBjb25zdCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJdTMyIHhvZmZzZXQgPSBpbmZvLT52YXIueG9mZnNldDsKCXUzMiB5b2Zmc2V0ID0gaW5mby0+dmFyLnlvZmZzZXQ7Cgl1MzIgdnhyZXMgPSBwYXItPmNydGMudnhyZXM7Cgl1MzIgYnBwID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwoKCXBhci0+Y3J0Yy5vZmZfcGl0Y2ggPSAoKHlvZmZzZXQgKiB2eHJlcyArIHhvZmZzZXQpICogYnBwIC8gNjQpIHwgKHZ4cmVzIDw8IDE5KTsKfQoKCiAgICAvKgogICAgICogIE9wZW4vUmVsZWFzZSB0aGUgZnJhbWUgYnVmZmVyIGRldmljZQogICAgICovCgpzdGF0aWMgaW50IGF0eWZiX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CgoJaWYgKHVzZXIpIHsKCQlwYXItPm9wZW4rKzsKI2lmZGVmIF9fc3BhcmNfXwoJCXBhci0+bW1hcGVkID0gMDsKI2VuZGlmCgl9CglyZXR1cm4gKDApOwp9CgpzdGF0aWMgaXJxcmV0dXJuX3QgYXR5X2lycShpbnQgaXJxLCB2b2lkICpkZXZfaWQpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IGRldl9pZDsKCWludCBoYW5kbGVkID0gMDsKCXUzMiBpbnRfY250bDsKCglzcGluX2xvY2soJnBhci0+aW50X2xvY2spOwoKCWludF9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19JTlRfQ05UTCwgcGFyKTsKCglpZiAoaW50X2NudGwgJiBDUlRDX1ZCTEFOS19JTlQpIHsKCQkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KCQlhdHlfc3RfbGUzMihDUlRDX0lOVF9DTlRMLCAoaW50X2NudGwgJiBDUlRDX0lOVF9FTl9NQVNLKSB8IENSVENfVkJMQU5LX0lOVF9BSywgcGFyKTsKCQlwYXItPnZibGFuay5jb3VudCsrOwoJCWlmIChwYXItPnZibGFuay5wYW5fZGlzcGxheSkgewoJCQlwYXItPnZibGFuay5wYW5fZGlzcGxheSA9IDA7CgkJCWF0eV9zdF9sZTMyKENSVENfT0ZGX1BJVENILCBwYXItPmNydGMub2ZmX3BpdGNoLCBwYXIpOwoJCX0KCQl3YWtlX3VwX2ludGVycnVwdGlibGUoJnBhci0+dmJsYW5rLndhaXQpOwoJCWhhbmRsZWQgPSAxOwoJfQoKCXNwaW5fdW5sb2NrKCZwYXItPmludF9sb2NrKTsKCglyZXR1cm4gSVJRX1JFVFZBTChoYW5kbGVkKTsKfQoKc3RhdGljIGludCBhdHlfZW5hYmxlX2lycShzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGludCByZWVuYWJsZSkKewoJdTMyIGludF9jbnRsOwoKCWlmICghdGVzdF9hbmRfc2V0X2JpdCgwLCAmcGFyLT5pcnFfZmxhZ3MpKSB7CgkJaWYgKHJlcXVlc3RfaXJxKHBhci0+aXJxLCBhdHlfaXJxLCBJUlFGX1NIQVJFRCwgImF0eWZiIiwgcGFyKSkgewoJCQljbGVhcl9iaXQoMCwgJnBhci0+aXJxX2ZsYWdzKTsKCQkJcmV0dXJuIC1FSU5WQUw7CgkJfQoJCXNwaW5fbG9ja19pcnEoJnBhci0+aW50X2xvY2spOwoJCWludF9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19JTlRfQ05UTCwgcGFyKSAmIENSVENfSU5UX0VOX01BU0s7CgkJLyogY2xlYXIgaW50ZXJydXB0ICovCgkJYXR5X3N0X2xlMzIoQ1JUQ19JTlRfQ05UTCwgaW50X2NudGwgfCBDUlRDX1ZCTEFOS19JTlRfQUssIHBhcik7CgkJLyogZW5hYmxlIGludGVycnVwdCAqLwoJCWF0eV9zdF9sZTMyKENSVENfSU5UX0NOVEwsIGludF9jbnRsIHwgQ1JUQ19WQkxBTktfSU5UX0VOLCBwYXIpOwoJCXNwaW5fdW5sb2NrX2lycSgmcGFyLT5pbnRfbG9jayk7Cgl9IGVsc2UgaWYgKHJlZW5hYmxlKSB7CgkJc3Bpbl9sb2NrX2lycSgmcGFyLT5pbnRfbG9jayk7CgkJaW50X2NudGwgPSBhdHlfbGRfbGUzMihDUlRDX0lOVF9DTlRMLCBwYXIpICYgQ1JUQ19JTlRfRU5fTUFTSzsKCQlpZiAoIShpbnRfY250bCAmIENSVENfVkJMQU5LX0lOVF9FTikpIHsKCQkJcHJpbnRrKCJhdHlmYjogc29tZW9uZSBkaXNhYmxlZCBJUlEgWyUwOHhdXG4iLCBpbnRfY250bCk7CgkJCS8qIHJlLWVuYWJsZSBpbnRlcnJ1cHQgKi8KCQkJYXR5X3N0X2xlMzIoQ1JUQ19JTlRfQ05UTCwgaW50X2NudGwgfCBDUlRDX1ZCTEFOS19JTlRfRU4sIHBhciApOwoJCX0KCQlzcGluX3VubG9ja19pcnEoJnBhci0+aW50X2xvY2spOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eV9kaXNhYmxlX2lycShzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKCXUzMiBpbnRfY250bDsKCglpZiAodGVzdF9hbmRfY2xlYXJfYml0KDAsICZwYXItPmlycV9mbGFncykpIHsKCQlpZiAocGFyLT52YmxhbmsucGFuX2Rpc3BsYXkpIHsKCQkJcGFyLT52YmxhbmsucGFuX2Rpc3BsYXkgPSAwOwoJCQlhdHlfc3RfbGUzMihDUlRDX09GRl9QSVRDSCwgcGFyLT5jcnRjLm9mZl9waXRjaCwgcGFyKTsKCQl9CgkJc3Bpbl9sb2NrX2lycSgmcGFyLT5pbnRfbG9jayk7CgkJaW50X2NudGwgPSBhdHlfbGRfbGUzMihDUlRDX0lOVF9DTlRMLCBwYXIpICYgQ1JUQ19JTlRfRU5fTUFTSzsKCQkvKiBkaXNhYmxlIGludGVycnVwdCAqLwoJCWF0eV9zdF9sZTMyKENSVENfSU5UX0NOVEwsIGludF9jbnRsICYgfkNSVENfVkJMQU5LX0lOVF9FTiwgcGFyICk7CgkJc3Bpbl91bmxvY2tfaXJxKCZwYXItPmludF9sb2NrKTsKCQlmcmVlX2lycShwYXItPmlycSwgcGFyKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBhdHlmYl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJaWYgKHVzZXIpIHsKCQlwYXItPm9wZW4tLTsKCQltZGVsYXkoMSk7CgkJd2FpdF9mb3JfaWRsZShwYXIpOwoJCWlmICghcGFyLT5vcGVuKSB7CiNpZmRlZiBfX3NwYXJjX18KCQkJaW50IHdhc19tbWFwZWQgPSBwYXItPm1tYXBlZDsKCgkJCXBhci0+bW1hcGVkID0gMDsKCgkJCWlmICh3YXNfbW1hcGVkKSB7CgkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwoKCQkJCS8qIE5vdyByZXNldCB0aGUgZGVmYXVsdCBkaXNwbGF5IGNvbmZpZywgd2UgaGF2ZSBubwoJCQkJICogaWRlYSB3aGF0IHRoZSBwcm9ncmFtKHMpIHdoaWNoIG1tYXAnZCB0aGUgY2hpcCBkaWQKCQkJCSAqIHRvIHRoZSBjb25maWd1cmF0aW9uLCBub3Igd2hldGhlciBpdCByZXN0b3JlZCBpdAoJCQkJICogY29ycmVjdGx5LgoJCQkJICovCgkJCQl2YXIgPSBkZWZhdWx0X3ZhcjsKCQkJCWlmIChub2FjY2VsKQoJCQkJCXZhci5hY2NlbF9mbGFncyAmPSB+RkJfQUNDRUxGX1RFWFQ7CgkJCQllbHNlCgkJCQkJdmFyLmFjY2VsX2ZsYWdzIHw9IEZCX0FDQ0VMRl9URVhUOwoJCQkJaWYgKHZhci55cmVzID09IHZhci55cmVzX3ZpcnR1YWwpIHsKCQkJCQl1MzIgdmlkZW9yYW0gPSAoaW5mby0+Zml4LnNtZW1fbGVuIC0gKFBBR0VfU0laRSA8PCAyKSk7CgkJCQkJdmFyLnlyZXNfdmlydHVhbCA9ICgodmlkZW9yYW0gKiA4KSAvIHZhci5iaXRzX3Blcl9waXhlbCkgLyB2YXIueHJlc192aXJ0dWFsOwoJCQkJCWlmICh2YXIueXJlc192aXJ0dWFsIDwgdmFyLnlyZXMpCgkJCQkJCXZhci55cmVzX3ZpcnR1YWwgPSB2YXIueXJlczsKCQkJCX0KCQkJfQojZW5kaWYKCQkJYXR5X2Rpc2FibGVfaXJxKHBhcik7CgkJfQoJfQoJcmV0dXJuICgwKTsKfQoKICAgIC8qCiAgICAgKiAgUGFuIG9yIFdyYXAgdGhlIERpc3BsYXkKICAgICAqCiAgICAgKiAgVGhpcyBjYWxsIGxvb2tzIG9ubHkgYXQgeG9mZnNldCwgeW9mZnNldCBhbmQgdGhlIEZCX1ZNT0RFX1lXUkFQIGZsYWcKICAgICAqLwoKc3RhdGljIGludCBhdHlmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCXUzMiB4cmVzLCB5cmVzLCB4b2Zmc2V0LCB5b2Zmc2V0OwoKCXhyZXMgPSAoKChwYXItPmNydGMuaF90b3RfZGlzcCA+PiAxNikgJiAweGZmKSArIDEpICogODsKCXlyZXMgPSAoKHBhci0+Y3J0Yy52X3RvdF9kaXNwID4+IDE2KSAmIDB4N2ZmKSArIDE7CglpZiAocGFyLT5jcnRjLmdlbl9jbnRsICYgQ1JUQ19EQkxfU0NBTl9FTikKCQl5cmVzID4+PSAxOwoJeG9mZnNldCA9ICh2YXItPnhvZmZzZXQgKyA3KSAmIH43OwoJeW9mZnNldCA9IHZhci0+eW9mZnNldDsKCWlmICh4b2Zmc2V0ICsgeHJlcyA+IHBhci0+Y3J0Yy52eHJlcyB8fCB5b2Zmc2V0ICsgeXJlcyA+IHBhci0+Y3J0Yy52eXJlcykKCQlyZXR1cm4gLUVJTlZBTDsKCWluZm8tPnZhci54b2Zmc2V0ID0geG9mZnNldDsKCWluZm8tPnZhci55b2Zmc2V0ID0geW9mZnNldDsKCWlmIChwYXItPmFzbGVlcCkKCQlyZXR1cm4gMDsKCglzZXRfb2ZmX3BpdGNoKHBhciwgaW5mbyk7CglpZiAoKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9WQkwpICYmICFhdHlfZW5hYmxlX2lycShwYXIsIDApKSB7CgkJcGFyLT52YmxhbmsucGFuX2Rpc3BsYXkgPSAxOwoJfSBlbHNlIHsKCQlwYXItPnZibGFuay5wYW5fZGlzcGxheSA9IDA7CgkJYXR5X3N0X2xlMzIoQ1JUQ19PRkZfUElUQ0gsIHBhci0+Y3J0Yy5vZmZfcGl0Y2gsIHBhcik7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5X3dhaXRmb3J2Ymxhbmsoc3RydWN0IGF0eWZiX3BhciAqcGFyLCB1MzIgY3J0YykKewoJc3RydWN0IGF0eV9pbnRlcnJ1cHQgKnZibDsKCXVuc2lnbmVkIGludCBjb3VudDsKCWludCByZXQ7CgoJc3dpdGNoIChjcnRjKSB7CgljYXNlIDA6CgkJdmJsID0gJnBhci0+dmJsYW5rOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gLUVOT0RFVjsKCX0KCglyZXQgPSBhdHlfZW5hYmxlX2lycShwYXIsIDApOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoKCWNvdW50ID0gdmJsLT5jb3VudDsKCXJldCA9IHdhaXRfZXZlbnRfaW50ZXJydXB0aWJsZV90aW1lb3V0KHZibC0+d2FpdCwgY291bnQgIT0gdmJsLT5jb3VudCwgSFovMTApOwoJaWYgKHJldCA8IDApIHsKCQlyZXR1cm4gcmV0OwoJfQoJaWYgKHJldCA9PSAwKSB7CgkJYXR5X2VuYWJsZV9pcnEocGFyLCAxKTsKCQlyZXR1cm4gLUVUSU1FRE9VVDsKCX0KCglyZXR1cm4gMDsKfQoKCiNpZmRlZiBERUJVRwojZGVmaW5lIEFUWUlPX0NMS1IJCTB4NDE1NDU5MDAJLyogQVRZXDAwICovCiNkZWZpbmUgQVRZSU9fQ0xLVwkJMHg0MTU0NTkwMQkvKiBBVFlcMDEgKi8KCnN0cnVjdCBhdHljbGsgewoJdTMyIHJlZl9jbGtfcGVyOwoJdTggcGxsX3JlZl9kaXY7Cgl1OCBtY2xrX2ZiX2RpdjsKCXU4IG1jbGtfcG9zdF9kaXY7CS8qIDEsMiwzLDQsOCAqLwoJdTggbWNsa19mYl9tdWx0OwkvKiAyIG9yIDQgKi8KCXU4IHhjbGtfcG9zdF9kaXY7CS8qIDEsMiwzLDQsOCAqLwoJdTggdmNsa19mYl9kaXY7Cgl1OCB2Y2xrX3Bvc3RfZGl2OwkvKiAxLDIsMyw0LDYsOCwxMiAqLwoJdTMyIGRzcF94Y2xrc19wZXJfcm93OwkvKiAwLTE2MzgzICovCgl1MzIgZHNwX2xvb3BfbGF0ZW5jeTsJLyogMC0xNSAqLwoJdTMyIGRzcF9wcmVjaXNpb247CS8qIDAtNyAqLwoJdTMyIGRzcF9vbjsJCS8qIDAtMjA0NyAqLwoJdTMyIGRzcF9vZmY7CQkvKiAwLTIwNDcgKi8KfTsKCiNkZWZpbmUgQVRZSU9fRkVBVFIJCTB4NDE1NDU5MDIJLyogQVRZXDAyICovCiNkZWZpbmUgQVRZSU9fRkVBVFcJCTB4NDE1NDU5MDMJLyogQVRZXDAzICovCiNlbmRpZgoKI2lmbmRlZiBGQklPX1dBSVRGT1JWU1lOQwojZGVmaW5lIEZCSU9fV0FJVEZPUlZTWU5DIF9JT1coJ0YnLCAweDIwLCBfX3UzMikKI2VuZGlmCgpzdGF0aWMgaW50IGF0eWZiX2lvY3RsKHN0cnVjdCBmYl9pbmZvICppbmZvLCB1X2ludCBjbWQsIHVfbG9uZyBhcmcpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKI2lmZGVmIF9fc3BhcmNfXwoJc3RydWN0IGZidHlwZSBmYnR5cDsKI2VuZGlmCgoJc3dpdGNoIChjbWQpIHsKI2lmZGVmIF9fc3BhcmNfXwoJY2FzZSBGQklPR1RZUEU6CgkJZmJ0eXAuZmJfdHlwZSA9IEZCVFlQRV9QQ0lfR0VORVJJQzsKCQlmYnR5cC5mYl93aWR0aCA9IHBhci0+Y3J0Yy52eHJlczsKCQlmYnR5cC5mYl9oZWlnaHQgPSBwYXItPmNydGMudnlyZXM7CgkJZmJ0eXAuZmJfZGVwdGggPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWw7CgkJZmJ0eXAuZmJfY21zaXplID0gaW5mby0+Y21hcC5sZW47CgkJZmJ0eXAuZmJfc2l6ZSA9IGluZm8tPmZpeC5zbWVtX2xlbjsKCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgZmJ0eXBlIF9fdXNlciAqKSBhcmcsICZmYnR5cCwgc2l6ZW9mKGZidHlwKSkpCgkJCXJldHVybiAtRUZBVUxUOwoJCWJyZWFrOwojZW5kaWYgLyogX19zcGFyY19fICovCgoJY2FzZSBGQklPX1dBSVRGT1JWU1lOQzoKCQl7CgkJCXUzMiBjcnRjOwoKCQkJaWYgKGdldF91c2VyKGNydGMsIChfX3UzMiBfX3VzZXIgKikgYXJnKSkKCQkJCXJldHVybiAtRUZBVUxUOwoKCQkJcmV0dXJuIGF0eV93YWl0Zm9ydmJsYW5rKHBhciwgY3J0Yyk7CgkJfQoJCWJyZWFrOwoKI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9DVCkKCWNhc2UgQVRZSU9fQ0xLUjoKCQlpZiAoTTY0X0hBUyhJTlRFR1JBVEVEKSkgewoJCQlzdHJ1Y3QgYXR5Y2xrIGNsazsKCQkJdW5pb24gYXR5X3BsbCAqcGxsID0gJihwYXItPnBsbCk7CgkJCXUzMiBkc3BfY29uZmlnID0gcGxsLT5jdC5kc3BfY29uZmlnOwoJCQl1MzIgZHNwX29uX29mZiA9IHBsbC0+Y3QuZHNwX29uX29mZjsKCQkJY2xrLnJlZl9jbGtfcGVyID0gcGFyLT5yZWZfY2xrX3BlcjsKCQkJY2xrLnBsbF9yZWZfZGl2ID0gcGxsLT5jdC5wbGxfcmVmX2RpdjsKCQkJY2xrLm1jbGtfZmJfZGl2ID0gcGxsLT5jdC5tY2xrX2ZiX2RpdjsKCQkJY2xrLm1jbGtfcG9zdF9kaXYgPSBwbGwtPmN0Lm1jbGtfcG9zdF9kaXZfcmVhbDsKCQkJY2xrLm1jbGtfZmJfbXVsdCA9IHBsbC0+Y3QubWNsa19mYl9tdWx0OwoJCQljbGsueGNsa19wb3N0X2RpdiA9IHBsbC0+Y3QueGNsa19wb3N0X2Rpdl9yZWFsOwoJCQljbGsudmNsa19mYl9kaXYgPSBwbGwtPmN0LnZjbGtfZmJfZGl2OwoJCQljbGsudmNsa19wb3N0X2RpdiA9IHBsbC0+Y3QudmNsa19wb3N0X2Rpdl9yZWFsOwoJCQljbGsuZHNwX3hjbGtzX3Blcl9yb3cgPSBkc3BfY29uZmlnICYgMHgzZmZmOwoJCQljbGsuZHNwX2xvb3BfbGF0ZW5jeSA9IChkc3BfY29uZmlnID4+IDE2KSAmIDB4ZjsKCQkJY2xrLmRzcF9wcmVjaXNpb24gPSAoZHNwX2NvbmZpZyA+PiAyMCkgJiA3OwoJCQljbGsuZHNwX29mZiA9IGRzcF9vbl9vZmYgJiAweDdmZjsKCQkJY2xrLmRzcF9vbiA9IChkc3Bfb25fb2ZmID4+IDE2KSAmIDB4N2ZmOwoJCQlpZiAoY29weV90b191c2VyKChzdHJ1Y3QgYXR5Y2xrIF9fdXNlciAqKSBhcmcsICZjbGssCgkJCQkJIHNpemVvZihjbGspKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCX0gZWxzZQoJCQlyZXR1cm4gLUVJTlZBTDsKCQlicmVhazsKCWNhc2UgQVRZSU9fQ0xLVzoKCQlpZiAoTTY0X0hBUyhJTlRFR1JBVEVEKSkgewoJCQlzdHJ1Y3QgYXR5Y2xrIGNsazsKCQkJdW5pb24gYXR5X3BsbCAqcGxsID0gJihwYXItPnBsbCk7CgkJCWlmIChjb3B5X2Zyb21fdXNlcigmY2xrLCAoc3RydWN0IGF0eWNsayBfX3VzZXIgKikgYXJnLCBzaXplb2YoY2xrKSkpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQkJcGFyLT5yZWZfY2xrX3BlciA9IGNsay5yZWZfY2xrX3BlcjsKCQkJcGxsLT5jdC5wbGxfcmVmX2RpdiA9IGNsay5wbGxfcmVmX2RpdjsKCQkJcGxsLT5jdC5tY2xrX2ZiX2RpdiA9IGNsay5tY2xrX2ZiX2RpdjsKCQkJcGxsLT5jdC5tY2xrX3Bvc3RfZGl2X3JlYWwgPSBjbGsubWNsa19wb3N0X2RpdjsKCQkJcGxsLT5jdC5tY2xrX2ZiX211bHQgPSBjbGsubWNsa19mYl9tdWx0OwoJCQlwbGwtPmN0LnhjbGtfcG9zdF9kaXZfcmVhbCA9IGNsay54Y2xrX3Bvc3RfZGl2OwoJCQlwbGwtPmN0LnZjbGtfZmJfZGl2ID0gY2xrLnZjbGtfZmJfZGl2OwoJCQlwbGwtPmN0LnZjbGtfcG9zdF9kaXZfcmVhbCA9IGNsay52Y2xrX3Bvc3RfZGl2OwoJCQlwbGwtPmN0LmRzcF9jb25maWcgPSAoY2xrLmRzcF94Y2xrc19wZXJfcm93ICYgMHgzZmZmKSB8CgkJCQkoKGNsay5kc3BfbG9vcF9sYXRlbmN5ICYgMHhmKTw8MTYpfCAoKGNsay5kc3BfcHJlY2lzaW9uICYgNyk8PDIwKTsKCQkJcGxsLT5jdC5kc3Bfb25fb2ZmID0gKGNsay5kc3Bfb2ZmICYgMHg3ZmYpIHwgKChjbGsuZHNwX29uICYgMHg3ZmYpPDwxNik7CgkJCS8qYXR5X2NhbGNfcGxsX2N0KGluZm8sICZwbGwtPmN0KTsqLwoJCQlhdHlfc2V0X3BsbF9jdChpbmZvLCBwbGwpOwoJCX0gZWxzZQoJCQlyZXR1cm4gLUVJTlZBTDsKCQlicmVhazsKCWNhc2UgQVRZSU9fRkVBVFI6CgkJaWYgKGdldF91c2VyKHBhci0+ZmVhdHVyZXMsICh1MzIgX191c2VyICopIGFyZykpCgkJCXJldHVybiAtRUZBVUxUOwoJCWJyZWFrOwoJY2FzZSBBVFlJT19GRUFUVzoKCQlpZiAocHV0X3VzZXIocGFyLT5mZWF0dXJlcywgKHUzMiBfX3VzZXIgKikgYXJnKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJYnJlYWs7CiNlbmRpZiAvKiBERUJVRyAmJiBDT05GSUdfRkJfQVRZX0NUICovCglkZWZhdWx0OgoJCXJldHVybiAtRUlOVkFMOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5ZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoKCWlmIChwYXItPmJsaXR0ZXJfbWF5X2JlX2J1c3kpCgkJd2FpdF9mb3JfaWRsZShwYXIpOwoJcmV0dXJuIDA7Cn0KCiNpZmRlZiBfX3NwYXJjX18Kc3RhdGljIGludCBhdHlmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJdW5zaWduZWQgaW50IHNpemUsIHBhZ2UsIG1hcF9zaXplID0gMDsKCXVuc2lnbmVkIGxvbmcgbWFwX29mZnNldCA9IDA7Cgl1bnNpZ25lZCBsb25nIG9mZjsKCWludCBpOwoKCWlmICghcGFyLT5tbWFwX21hcCkKCQlyZXR1cm4gLUVOWElPOwoKCWlmICh2bWEtPnZtX3Bnb2ZmID4gKH4wVUwgPj4gUEFHRV9TSElGVCkpCgkJcmV0dXJuIC1FSU5WQUw7CgoJb2ZmID0gdm1hLT52bV9wZ29mZiA8PCBQQUdFX1NISUZUOwoJc2l6ZSA9IHZtYS0+dm1fZW5kIC0gdm1hLT52bV9zdGFydDsKCgkvKiBUbyBzdG9wIHRoZSBzd2FwcGVyIGZyb20gZXZlbiBjb25zaWRlcmluZyB0aGVzZSBwYWdlcy4gKi8KCXZtYS0+dm1fZmxhZ3MgfD0gKFZNX0lPIHwgVk1fUkVTRVJWRUQpOwoKCWlmICgoKHZtYS0+dm1fcGdvZmYgPT0gMCkgJiYgKHNpemUgPT0gaW5mby0+Zml4LnNtZW1fbGVuKSkgfHwKCSAgICAoKG9mZiA9PSBpbmZvLT5maXguc21lbV9sZW4pICYmIChzaXplID09IFBBR0VfU0laRSkpKQoJCW9mZiArPSAweDgwMDAwMDAwMDAwMDAwMDBVTDsKCgl2bWEtPnZtX3Bnb2ZmID0gb2ZmID4+IFBBR0VfU0hJRlQ7CS8qIHByb3BhZ2F0ZSBvZmYgY2hhbmdlcyAqLwoKCS8qIEVhY2ggcGFnZSwgc2VlIHdoaWNoIG1hcCBhcHBsaWVzICovCglmb3IgKHBhZ2UgPSAwOyBwYWdlIDwgc2l6ZTspIHsKCQltYXBfc2l6ZSA9IDA7CgkJZm9yIChpID0gMDsgcGFyLT5tbWFwX21hcFtpXS5zaXplOyBpKyspIHsKCQkJdW5zaWduZWQgbG9uZyBzdGFydCA9IHBhci0+bW1hcF9tYXBbaV0udm9mZjsKCQkJdW5zaWduZWQgbG9uZyBlbmQgPSBzdGFydCArIHBhci0+bW1hcF9tYXBbaV0uc2l6ZTsKCQkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBvZmYgKyBwYWdlOwoKCQkJaWYgKHN0YXJ0ID4gb2Zmc2V0KQoJCQkJY29udGludWU7CgkJCWlmIChvZmZzZXQgPj0gZW5kKQoJCQkJY29udGludWU7CgoJCQltYXBfc2l6ZSA9IHBhci0+bW1hcF9tYXBbaV0uc2l6ZSAtIChvZmZzZXQgLSBzdGFydCk7CgkJCW1hcF9vZmZzZXQgPQoJCQkgICAgcGFyLT5tbWFwX21hcFtpXS5wb2ZmICsgKG9mZnNldCAtIHN0YXJ0KTsKCQkJYnJlYWs7CgkJfQoJCWlmICghbWFwX3NpemUpIHsKCQkJcGFnZSArPSBQQUdFX1NJWkU7CgkJCWNvbnRpbnVlOwoJCX0KCQlpZiAocGFnZSArIG1hcF9zaXplID4gc2l6ZSkKCQkJbWFwX3NpemUgPSBzaXplIC0gcGFnZTsKCgkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgJj0KCQkgICAgfihwYXItPm1tYXBfbWFwW2ldLnByb3RfbWFzayk7CgkJcGdwcm90X3ZhbCh2bWEtPnZtX3BhZ2VfcHJvdCkgfD0gcGFyLT5tbWFwX21hcFtpXS5wcm90X2ZsYWc7CgoJCWlmIChyZW1hcF9wZm5fcmFuZ2Uodm1hLCB2bWEtPnZtX3N0YXJ0ICsgcGFnZSwKCQkJbWFwX29mZnNldCA+PiBQQUdFX1NISUZULCBtYXBfc2l6ZSwgdm1hLT52bV9wYWdlX3Byb3QpKQoJCQlyZXR1cm4gLUVBR0FJTjsKCgkJcGFnZSArPSBtYXBfc2l6ZTsKCX0KCglpZiAoIW1hcF9zaXplKQoJCXJldHVybiAtRUlOVkFMOwoKCWlmICghcGFyLT5tbWFwZWQpCgkJcGFyLT5tbWFwZWQgPSAxOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgewoJdTMyIHlvZmZzZXQ7Cgl1OCByWzJdWzI1Nl07Cgl1OCBnWzJdWzI1Nl07Cgl1OCBiWzJdWzI1Nl07Cn0gYXR5ZmJfc2F2ZTsKCnN0YXRpYyB2b2lkIGF0eWZiX3NhdmVfcGFsZXR0ZShzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGludCBlbnRlcikKewoJaW50IGksIHRtcDsKCglmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKCQl0bXAgPSBhdHlfbGRfOChEQUNfQ05UTCwgcGFyKSAmIDB4ZmM7CgkJaWYgKE02NF9IQVMoRVhUUkFfQlJJR0hUKSkKCQkJdG1wIHw9IDB4MjsKCQlhdHlfc3RfOChEQUNfQ05UTCwgdG1wLCBwYXIpOwoJCWF0eV9zdF84KERBQ19NQVNLLCAweGZmLCBwYXIpOwoKCQl3cml0ZWIoaSwgJnBhci0+YXR5X2NtYXBfcmVncy0+cmluZGV4KTsKCQlhdHlmYl9zYXZlLnJbZW50ZXJdW2ldID0gcmVhZGIoJnBhci0+YXR5X2NtYXBfcmVncy0+bHV0KTsKCQlhdHlmYl9zYXZlLmdbZW50ZXJdW2ldID0gcmVhZGIoJnBhci0+YXR5X2NtYXBfcmVncy0+bHV0KTsKCQlhdHlmYl9zYXZlLmJbZW50ZXJdW2ldID0gcmVhZGIoJnBhci0+YXR5X2NtYXBfcmVncy0+bHV0KTsKCQl3cml0ZWIoaSwgJnBhci0+YXR5X2NtYXBfcmVncy0+d2luZGV4KTsKCQl3cml0ZWIoYXR5ZmJfc2F2ZS5yWzEgLSBlbnRlcl1baV0sCgkJICAgICAgICZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7CgkJd3JpdGViKGF0eWZiX3NhdmUuZ1sxIC0gZW50ZXJdW2ldLAoJCSAgICAgICAmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQpOwoJCXdyaXRlYihhdHlmYl9zYXZlLmJbMSAtIGVudGVyXVtpXSwKCQkgICAgICAgJnBhci0+YXR5X2NtYXBfcmVncy0+bHV0KTsKCX0KfQoKc3RhdGljIHZvaWQgYXR5ZmJfcGFsZXR0ZShpbnQgZW50ZXIpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhcjsKCXN0cnVjdCBmYl9pbmZvICppbmZvOwoJaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IEZCX01BWDsgaSsrKSB7CgkJaW5mbyA9IHJlZ2lzdGVyZWRfZmJbaV07CgkJaWYgKGluZm8gJiYgaW5mby0+ZmJvcHMgPT0gJmF0eWZiX29wcykgewoJCQlwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CgkJCQoJCQlhdHlmYl9zYXZlX3BhbGV0dGUocGFyLCBlbnRlcik7CgkJCWlmIChlbnRlcikgewoJCQkJYXR5ZmJfc2F2ZS55b2Zmc2V0ID0gaW5mby0+dmFyLnlvZmZzZXQ7CgkJCQlpbmZvLT52YXIueW9mZnNldCA9IDA7CgkJCQlzZXRfb2ZmX3BpdGNoKHBhciwgaW5mbyk7CgkJCX0gZWxzZSB7CgkJCQlpbmZvLT52YXIueW9mZnNldCA9IGF0eWZiX3NhdmUueW9mZnNldDsKCQkJCXNldF9vZmZfcGl0Y2gocGFyLCBpbmZvKTsKCQkJfQoJCQlhdHlfc3RfbGUzMihDUlRDX09GRl9QSVRDSCwgcGFyLT5jcnRjLm9mZl9waXRjaCwgcGFyKTsKCQkJYnJlYWs7CgkJfQoJfQp9CiNlbmRpZiAvKiBfX3NwYXJjX18gKi8KCgoKI2lmIGRlZmluZWQoQ09ORklHX1BNKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCgovKiBQb3dlciBtYW5hZ2VtZW50IHJvdXRpbmVzLiBUaG9zZSBhcmUgdXNlZCBmb3IgUG93ZXJCb29rIHNsZWVwLgogKi8Kc3RhdGljIGludCBhdHlfcG93ZXJfbWdtdChpbnQgc2xlZXAsIHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJdTMyIHBtOwoJaW50IHRpbWVvdXQ7CgoJcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CglwbSA9IChwbSAmIH5QV1JfTUdUX01PREVfTUFTSykgfCBQV1JfTUdUX01PREVfUkVHOwoJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoKCXRpbWVvdXQgPSAyMDAwOwoJaWYgKHNsZWVwKSB7CgkJLyogU2xlZXAgKi8KCQlwbSAmPSB+UFdSX01HVF9PTjsKCQlhdHlfc3RfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBtLCBwYXIpOwoJCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCXVkZWxheSgxMCk7CgkJcG0gJj0gfihQV1JfQkxPTiB8IEFVVE9fUFdSX1VQKTsKCQlwbSB8PSBTVVNQRU5EX05PVzsKCQlhdHlfc3RfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBtLCBwYXIpOwoJCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCXVkZWxheSgxMCk7CgkJcG0gfD0gUFdSX01HVF9PTjsKCQlhdHlfc3RfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBtLCBwYXIpOwoJCWRvIHsKCQkJcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJCW1kZWxheSgxKTsKCQkJaWYgKCgtLXRpbWVvdXQpID09IDApCgkJCQlicmVhazsKCQl9IHdoaWxlICgocG0gJiBQV1JfTUdUX1NUQVRVU19NQVNLKSAhPSBQV1JfTUdUX1NUQVRVU19TVVNQRU5EKTsKCX0gZWxzZSB7CgkJLyogV2FrZXVwICovCgkJcG0gJj0gflBXUl9NR1RfT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQl1ZGVsYXkoMTApOwoJCXBtICY9IH5TVVNQRU5EX05PVzsKCQlwbSB8PSAoUFdSX0JMT04gfCBBVVRPX1BXUl9VUCk7CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQl1ZGVsYXkoMTApOwoJCXBtIHw9IFBXUl9NR1RfT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlkbyB7CgkJCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCQltZGVsYXkoMSk7CgkJCWlmICgoLS10aW1lb3V0KSA9PSAwKQoJCQkJYnJlYWs7CgkJfSB3aGlsZSAoKHBtICYgUFdSX01HVF9TVEFUVVNfTUFTSykgIT0gMCk7Cgl9CgltZGVsYXkoNTAwKTsKCglyZXR1cm4gdGltZW91dCA/IDAgOiAtRUlPOwp9CgpzdGF0aWMgaW50IGF0eWZiX3BjaV9zdXNwZW5kKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoKI2lmbmRlZiBDT05GSUdfUFBDX1BNQUMKCS8qIEhBQ0sgQUxFUlQgISBPbmNlIEkgZmluZCBhIHByb3BlciB3YXkgdG8gc2F5IHRvIGVhY2ggZHJpdmVyCgkgKiBpbmRpdmlkdWFsbHkgd2hhdCB3aWxsIGhhcHBlbiB3aXRoIGl0J3MgUENJIHNsb3QsIEknbGwgY2hhbmdlCgkgKiB0aGF0LiBPbiBsYXB0b3BzLCB0aGUgQUdQIHNsb3QgaXMganVzdCB1bmNsb2NrZWQsIHNvIEQyIGlzCgkgKiBleHBlY3RlZCwgd2hpbGUgb24gZGVza3RvcHMsIHRoZSBjYXJkIGlzIHBvd2VyZWQgb2ZmCgkgKi8KCXJldHVybiAwOwojZW5kaWYgLyogQ09ORklHX1BQQ19QTUFDICovCgoJaWYgKHN0YXRlLmV2ZW50ID09IHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkKCQlyZXR1cm4gMDsKCglhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CgoJZmJfc2V0X3N1c3BlbmQoaW5mbywgMSk7CgoJLyogSWRsZSAmIHJlc2V0IGVuZ2luZSAqLwoJd2FpdF9mb3JfaWRsZShwYXIpOwoJYXR5X3Jlc2V0X2VuZ2luZShwYXIpOwoKCS8qIEJsYW5rIGRpc3BsYXkgYW5kIExDRCAqLwoJYXR5ZmJfYmxhbmsoRkJfQkxBTktfUE9XRVJET1dOLCBpbmZvKTsKCglwYXItPmFzbGVlcCA9IDE7CglwYXItPmxvY2tfYmxhbmsgPSAxOwoKCS8qIFNldCBjaGlwIHRvICJzdXNwZW5kIiBtb2RlICovCglpZiAoYXR5X3Bvd2VyX21nbXQoMSwgcGFyKSkgewoJCXBhci0+YXNsZWVwID0gMDsKCQlwYXItPmxvY2tfYmxhbmsgPSAwOwoJCWF0eWZiX2JsYW5rKEZCX0JMQU5LX1VOQkxBTkssIGluZm8pOwoJCWZiX3NldF9zdXNwZW5kKGluZm8sIDApOwoJCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKCQlyZXR1cm4gLUVJTzsKCX0KCglyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CgoJcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gc3RhdGU7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5ZmJfcGNpX3Jlc3VtZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKewoJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CgoJaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSBQTV9FVkVOVF9PTikKCQlyZXR1cm4gMDsKCglhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CgoJaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSAyKQoJCWF0eV9wb3dlcl9tZ210KDAsIHBhcik7CglwYXItPmFzbGVlcCA9IDA7CgoJLyogUmVzdG9yZSBkaXNwbGF5ICovCglhdHlmYl9zZXRfcGFyKGluZm8pOwoKCS8qIFJlZnJlc2ggKi8KCWZiX3NldF9zdXNwZW5kKGluZm8sIDApOwoKCS8qIFVuYmxhbmsgKi8KCXBhci0+bG9ja19ibGFuayA9IDA7CglhdHlmYl9ibGFuayhGQl9CTEFOS19VTkJMQU5LLCBpbmZvKTsKCglyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CgoJcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKCglyZXR1cm4gMDsKfQoKI2VuZGlmIC8qICBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUENJKSAqLwoKLyogQmFja2xpZ2h0ICovCiNpZmRlZiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVAojZGVmaW5lIE1BWF9MRVZFTCAweEZGCgpzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIGF0eV9ibF9kYXRhOwoKLyogQ2FsbCB3aXRoIGZiX2luZm8tPmJsX211dGV4IGhlbGQgKi8Kc3RhdGljIGludCBhdHlfYmxfZ2V0X2xldmVsX2JyaWdodG5lc3Moc3RydWN0IGF0eWZiX3BhciAqcGFyLCBpbnQgbGV2ZWwpCnsKCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGRldik7CglpbnQgYXR5bGV2ZWw7CgoJLyogR2V0IGFuZCBjb252ZXJ0IHRoZSB2YWx1ZSAqLwoJYXR5bGV2ZWwgPSBpbmZvLT5ibF9jdXJ2ZVtsZXZlbF0gKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMOwoKCWlmIChhdHlsZXZlbCA8IDApCgkJYXR5bGV2ZWwgPSAwOwoJZWxzZSBpZiAoYXR5bGV2ZWwgPiBNQVhfTEVWRUwpCgkJYXR5bGV2ZWwgPSBNQVhfTEVWRUw7CgoJcmV0dXJuIGF0eWxldmVsOwp9CgovKiBDYWxsIHdpdGggZmJfaW5mby0+YmxfbXV0ZXggaGVsZCAqLwpzdGF0aWMgaW50IF9fYXR5X2JsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSBjbGFzc19nZXRfZGV2ZGF0YSgmYmQtPmNsYXNzX2Rldik7Cgl1bnNpZ25lZCBpbnQgcmVnID0gYXR5X2xkX2xjZChMQ0RfTUlTQ19DTlRMLCBwYXIpOwoJaW50IGxldmVsOwoKCWlmIChiZC0+cHJvcHMtPnBvd2VyICE9IEZCX0JMQU5LX1VOQkxBTksgfHwKCSAgICBiZC0+cHJvcHMtPmZiX2JsYW5rICE9IEZCX0JMQU5LX1VOQkxBTkspCgkJbGV2ZWwgPSAwOwoJZWxzZQoJCWxldmVsID0gYmQtPnByb3BzLT5icmlnaHRuZXNzOwoKCXJlZyB8PSAoQkxNT0RfRU4gfCBCSUFTTU9EX0VOKTsKCWlmIChsZXZlbCA+IDApIHsKCQlyZWcgJj0gfkJJQVNfTU9EX0xFVkVMX01BU0s7CgkJcmVnIHw9IChhdHlfYmxfZ2V0X2xldmVsX2JyaWdodG5lc3MocGFyLCBsZXZlbCkgPDwgQklBU19NT0RfTEVWRUxfU0hJRlQpOwoJfSBlbHNlIHsKCQlyZWcgJj0gfkJJQVNfTU9EX0xFVkVMX01BU0s7CgkJcmVnIHw9IChhdHlfYmxfZ2V0X2xldmVsX2JyaWdodG5lc3MocGFyLCAwKSA8PCBCSUFTX01PRF9MRVZFTF9TSElGVCk7Cgl9CglhdHlfc3RfbGNkKExDRF9NSVNDX0NOVEwsIHJlZywgcGFyKTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBhdHlfYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IGNsYXNzX2dldF9kZXZkYXRhKCZiZC0+Y2xhc3NfZGV2KTsKCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGRldik7CglpbnQgcmV0OwoKCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKCXJldCA9IF9fYXR5X2JsX3VwZGF0ZV9zdGF0dXMoYmQpOwoJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CgoJcmV0dXJuIHJldDsKfQoKc3RhdGljIGludCBhdHlfYmxfZ2V0X2JyaWdodG5lc3Moc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQp7CglyZXR1cm4gYmQtPnByb3BzLT5icmlnaHRuZXNzOwp9CgpzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9wcm9wZXJ0aWVzIGF0eV9ibF9kYXRhID0gewoJLm93bmVyCSAgPSBUSElTX01PRFVMRSwKCS5nZXRfYnJpZ2h0bmVzcyA9IGF0eV9ibF9nZXRfYnJpZ2h0bmVzcywKCS51cGRhdGVfc3RhdHVzCT0gYXR5X2JsX3VwZGF0ZV9zdGF0dXMsCgkubWF4X2JyaWdodG5lc3MgPSAoRkJfQkFDS0xJR0hUX0xFVkVMUyAtIDEpLAp9OwoKc3RhdGljIHZvaWQgYXR5X2JsX3NldF9wb3dlcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHBvd2VyKQp7CgltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CgoJaWYgKGluZm8tPmJsX2RldikgewoJCWRvd24oJmluZm8tPmJsX2Rldi0+c2VtKTsKCQlpbmZvLT5ibF9kZXYtPnByb3BzLT5wb3dlciA9IHBvd2VyOwoJCV9fYXR5X2JsX3VwZGF0ZV9zdGF0dXMoaW5mby0+YmxfZGV2KTsKCQl1cCgmaW5mby0+YmxfZGV2LT5zZW0pOwoJfQoKCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOwp9CgpzdGF0aWMgdm9pZCBhdHlfYmxfaW5pdChzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBhci0+cGRldik7CglzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQ7CgljaGFyIG5hbWVbMTJdOwoKI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAoJaWYgKCFwbWFjX2hhc19iYWNrbGlnaHRfdHlwZSgiYXRpIikpCgkJcmV0dXJuOwojZW5kaWYKCglzbnByaW50ZihuYW1lLCBzaXplb2YobmFtZSksICJhdHlibCVkIiwgaW5mby0+bm9kZSk7CgoJYmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKG5hbWUsIHBhciwgJmF0eV9ibF9kYXRhKTsKCWlmIChJU19FUlIoYmQpKSB7CgkJaW5mby0+YmxfZGV2ID0gTlVMTDsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdHk6IEJhY2tsaWdodCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKCQlnb3RvIGVycm9yOwoJfQoKCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKCWluZm8tPmJsX2RldiA9IGJkOwoJZmJfYmxfZGVmYXVsdF9jdXJ2ZShpbmZvLCAwLAoJCTB4M0YgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMLAoJCTB4RkYgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMKTsKCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOwoKCWRvd24oJmJkLT5zZW0pOwoJYmQtPnByb3BzLT5icmlnaHRuZXNzID0gYXR5X2JsX2RhdGEubWF4X2JyaWdodG5lc3M7CgliZC0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKCWJkLT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhiZCk7Cgl1cCgmYmQtPnNlbSk7CgojaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCgltdXRleF9sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CglpZiAoIXBtYWNfYmFja2xpZ2h0KQoJCXBtYWNfYmFja2xpZ2h0ID0gYmQ7CgltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKI2VuZGlmCgoJcHJpbnRrKCJhdHk6IEJhY2tsaWdodCBpbml0aWFsaXplZCAoJXMpXG4iLCBuYW1lKTsKCglyZXR1cm47CgplcnJvcjoKCXJldHVybjsKfQoKc3RhdGljIHZvaWQgYXR5X2JsX2V4aXQoc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOwoKI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAoJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOwojZW5kaWYKCgltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CglpZiAoaW5mby0+YmxfZGV2KSB7CiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKCQlpZiAocG1hY19iYWNrbGlnaHQgPT0gaW5mby0+YmxfZGV2KQoJCQlwbWFjX2JhY2tsaWdodCA9IE5VTEw7CiNlbmRpZgoKCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoaW5mby0+YmxfZGV2KTsKCgkJcHJpbnRrKCJhdHk6IEJhY2tsaWdodCB1bmxvYWRlZFxuIik7Cgl9CgltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOwojZW5kaWYKfQoKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUICovCgpzdGF0aWMgdm9pZCBfX2RldmluaXQgYXR5X2NhbGNfbWVtX3JlZnJlc2goc3RydWN0IGF0eWZiX3BhciAqcGFyLCBpbnQgeGNsaykKewoJY29uc3QgaW50IHJhZ2Vwcm9fdGJsW10gPSB7CgkJNDQsIDUwLCA1NSwgNjYsIDc1LCA4MCwgMTAwCgl9OwoJY29uc3QgaW50IHJhZ2V4bF90YmxbXSA9IHsKCQk1MCwgNjYsIDc1LCA4MywgOTAsIDk1LCAxMDAsIDEwNSwKCQkxMTAsIDExNSwgMTIwLCAxMjUsIDEzMywgMTQzLCAxNjYKCX07Cgljb25zdCBpbnQgKnJlZnJlc2hfdGJsOwoJaW50IGksIHNpemU7CgoJaWYgKElTX1hMKHBhci0+cGNpX2lkKSB8fCBJU19NT0JJTElUWShwYXItPnBjaV9pZCkpIHsKCQlyZWZyZXNoX3RibCA9IHJhZ2V4bF90Ymw7CgkJc2l6ZSA9IEFSUkFZX1NJWkUocmFnZXhsX3RibCk7Cgl9IGVsc2UgewoJCXJlZnJlc2hfdGJsID0gcmFnZXByb190Ymw7CgkJc2l6ZSA9IEFSUkFZX1NJWkUocmFnZXByb190YmwpOwoJfQoKCWZvciAoaT0wOyBpIDwgc2l6ZTsgaSsrKSB7CgkJaWYgKHhjbGsgPCByZWZyZXNoX3RibFtpXSkKCQlicmVhazsKCX0KCXBhci0+bWVtX3JlZnJlc2hfcmF0ZSA9IGk7Cn0KCiAgICAvKgogICAgICogIEluaXRpYWxpc2F0aW9uCiAgICAgKi8KCnN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyAqZmJfbGlzdCA9IE5VTEw7CgojaWYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQpzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlmYl9nZXRfdGltaW5nc19mcm9tX2xjZChzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsCgkJCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQp7CglpbnQgcmV0ID0gLUVJTlZBTDsKCglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCAmJiAoYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcikgJiBMQ0RfT04pKSB7CgkJKnZhciA9IGRlZmF1bHRfdmFyOwoJCXZhci0+eHJlcyA9IHZhci0+eHJlc192aXJ0dWFsID0gcGFyLT5sY2RfaGRpc3A7CgkJdmFyLT5yaWdodF9tYXJnaW4gPSBwYXItPmxjZF9yaWdodF9tYXJnaW47CgkJdmFyLT5sZWZ0X21hcmdpbiA9IHBhci0+bGNkX2hibGFua19sZW4gLQoJCQkocGFyLT5sY2RfcmlnaHRfbWFyZ2luICsgcGFyLT5sY2RfaHN5bmNfZGx5ICsKCQkJIHBhci0+bGNkX2hzeW5jX2xlbik7CgkJdmFyLT5oc3luY19sZW4gPSBwYXItPmxjZF9oc3luY19sZW4gKyBwYXItPmxjZF9oc3luY19kbHk7CgkJdmFyLT55cmVzID0gdmFyLT55cmVzX3ZpcnR1YWwgPSBwYXItPmxjZF92ZGlzcDsKCQl2YXItPmxvd2VyX21hcmdpbiA9IHBhci0+bGNkX2xvd2VyX21hcmdpbjsKCQl2YXItPnVwcGVyX21hcmdpbiA9IHBhci0+bGNkX3ZibGFua19sZW4gLQoJCQkocGFyLT5sY2RfbG93ZXJfbWFyZ2luICsgcGFyLT5sY2RfdnN5bmNfbGVuKTsKCQl2YXItPnZzeW5jX2xlbiA9IHBhci0+bGNkX3ZzeW5jX2xlbjsKCQl2YXItPnBpeGNsb2NrID0gcGFyLT5sY2RfcGl4Y2xvY2s7CgkJcmV0ID0gMDsKCX0KCglyZXR1cm4gcmV0Owp9CiNlbmRpZiAvKiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpICovCgpzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlfaW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqbmFtZSkKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJY29uc3QgY2hhciAqcmFtbmFtZSA9IE5VTEwsICp4dGFsOwoJaW50IGd0Yl9tZW1zaXplLCBoYXNfdmFyID0gMDsKCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7Cgl1OCBwbGxfcmVmX2RpdjsKCXUzMiBpOwojaWYgZGVmaW5lZChDT05GSUdfUFBDKQoJaW50IHNlbnNlOwojZW5kaWYKCglpbml0X3dhaXRxdWV1ZV9oZWFkKCZwYXItPnZibGFuay53YWl0KTsKCXNwaW5fbG9ja19pbml0KCZwYXItPmludF9sb2NrKTsKCglwYXItPmF0eV9jbWFwX3JlZ3MgPQoJICAgIChzdHJ1Y3QgYXR5X2NtYXBfcmVncyBfX2lvbWVtICopIChwYXItPmF0aV9yZWdiYXNlICsgMHhjMCk7CgojaWZkZWYgQ09ORklHX1BQQ19QTUFDCgkvKiBUaGUgQXBwbGUgaUJvb2sxIHVzZXMgbm9uLXN0YW5kYXJkIG1lbW9yeSBmcmVxdWVuY2llcy4gV2UgZGV0ZWN0IGl0CgkgKiBhbmQgc2V0IHRoZSBmcmVxdWVuY3kgbWFudWFsbHkuICovCglpZiAobWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2syLDEiKSkgewoJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gNzA7CgkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA1MzsKCX0KI2VuZGlmCglpZiAocGxsKQoJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gcGxsOwoJaWYgKG1jbGspCgkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSBtY2xrOwoJaWYgKHhjbGspCgkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSB4Y2xrOwoKCWF0eV9jYWxjX21lbV9yZWZyZXNoKHBhciwgcGFyLT5wbGxfbGltaXRzLnhjbGspOwoJcGFyLT5wbGxfcGVyID0gMTAwMDAwMC9wYXItPnBsbF9saW1pdHMucGxsX21heDsKCXBhci0+bWNsa19wZXIgPSAxMDAwMDAwL3Bhci0+cGxsX2xpbWl0cy5tY2xrOwoJcGFyLT54Y2xrX3BlciA9IDEwMDAwMDAvcGFyLT5wbGxfbGltaXRzLnhjbGs7CgoJcGFyLT5yZWZfY2xrX3BlciA9IDEwMDAwMDAwMDAwMDBVTEwgLyAxNDMxODE4MDsKCXh0YWwgPSAiMTQuMzE4MTgiOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR1gKCWlmICghTTY0X0hBUyhJTlRFR1JBVEVEKSkgewoJCXUzMiBzdGF0MDsKCQl1OCBkYWNfdHlwZSwgZGFjX3N1YnR5cGUsIGNsa190eXBlOwoJCXN0YXQwID0gYXR5X2xkX2xlMzIoQ09ORklHX1NUQVQwLCBwYXIpOwoJCXBhci0+YnVzX3R5cGUgPSAoc3RhdDAgPj4gMCkgJiAweDA3OwoJCXBhci0+cmFtX3R5cGUgPSAoc3RhdDAgPj4gMykgJiAweDA3OwoJCXJhbW5hbWUgPSBhdHlfZ3hfcmFtW3Bhci0+cmFtX3R5cGVdOwoJCS8qIEZJWE1FOiBjbG9ja2NoaXAvUkFNREFDIHByb2Jpbmc/ICovCgkJZGFjX3R5cGUgPSAoYXR5X2xkX2xlMzIoREFDX0NOVEwsIHBhcikgPj4gMTYpICYgMHgwNzsKI2lmZGVmIENPTkZJR19BVEFSSQoJCWNsa190eXBlID0gQ0xLX0FUSTE4ODE4XzE7CgkJZGFjX3R5cGUgPSAoc3RhdDAgPj4gOSkgJiAweDA3OwoJCWlmIChkYWNfdHlwZSA9PSAweDA3KQoJCQlkYWNfc3VidHlwZSA9IERBQ19BVFQyMEM0MDg7CgkJZWxzZQoJCQlkYWNfc3VidHlwZSA9IChhdHlfbGRfOChTQ1JBVENIX1JFRzEgKyAxLCBwYXIpICYgMHhGMCkgfCBkYWNfdHlwZTsKI2Vsc2UKCQlkYWNfdHlwZSA9IERBQ19JQk1SR0I1MTQ7CgkJZGFjX3N1YnR5cGUgPSBEQUNfSUJNUkdCNTE0OwoJCWNsa190eXBlID0gQ0xLX0lCTVJHQjUxNDsKI2VuZGlmCgkJc3dpdGNoIChkYWNfc3VidHlwZSkgewoJCWNhc2UgREFDX0lCTVJHQjUxNDoKCQkJcGFyLT5kYWNfb3BzID0gJmF0eV9kYWNfaWJtNTE0OwoJCQlicmVhazsKCQljYXNlIERBQ19BVEk2ODg2MF9COgoJCWNhc2UgREFDX0FUSTY4ODYwX0M6CgkJCXBhci0+ZGFjX29wcyA9ICZhdHlfZGFjX2F0aTY4ODYwYjsKCQkJYnJlYWs7CgkJY2FzZSBEQUNfQVRUMjBDNDA4OgoJCWNhc2UgREFDX0FUVDIxQzQ5ODoKCQkJcGFyLT5kYWNfb3BzID0gJmF0eV9kYWNfYXR0MjFjNDk4OwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlQUklOVEtJKCJhdHlfaW5pdDogREFDIHR5cGUgbm90IGltcGxlbWVudGVkIHlldCFcbiIpOwoJCQlwYXItPmRhY19vcHMgPSAmYXR5X2RhY191bnN1cHBvcnRlZDsKCQkJYnJlYWs7CgkJfQoJCXN3aXRjaCAoY2xrX3R5cGUpIHsKI2lmZGVmIENPTkZJR19BVEFSSQoJCWNhc2UgQ0xLX0FUSTE4ODE4XzE6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX2F0aTE4ODE4XzE7CgkJCWJyZWFrOwojZWxzZQoJCWNhc2UgQ0xLX0lCTVJHQjUxNDoKCQkJcGFyLT5wbGxfb3BzID0gJmF0eV9wbGxfaWJtNTE0OwoJCQlicmVhazsKI2VuZGlmCiNpZiAwIC8qIGRlYWQgY29kZSAqLwoJCWNhc2UgQ0xLX1NURzE3MDM6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX3N0ZzE3MDM7CgkJCWJyZWFrOwoJCWNhc2UgQ0xLX0NIODM5ODoKCQkJcGFyLT5wbGxfb3BzID0gJmF0eV9wbGxfY2g4Mzk4OwoJCQlicmVhazsKCQljYXNlIENMS19BVFQyMEM0MDg6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX2F0dDIwYzQwODsKCQkJYnJlYWs7CiNlbmRpZgoJCWRlZmF1bHQ6CgkJCVBSSU5US0koImF0eV9pbml0OiBDTEsgdHlwZSBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOwoJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF91bnN1cHBvcnRlZDsKCQkJYnJlYWs7CgkJfQoJfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HWCAqLwojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVAoJaWYgKE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQlwYXItPmRhY19vcHMgPSAmYXR5X2RhY19jdDsKCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9jdDsKCQlwYXItPmJ1c190eXBlID0gUENJOwoJCXBhci0+cmFtX3R5cGUgPSAoYXR5X2xkX2xlMzIoQ09ORklHX1NUQVQwLCBwYXIpICYgMHgwNyk7CgkJcmFtbmFtZSA9IGF0eV9jdF9yYW1bcGFyLT5yYW1fdHlwZV07CgkJLyogZm9yIG1hbnkgY2hpcHMsIHRoZSBtY2xrIGlzIDY3IE1IeiBmb3IgU0RSQU0sIDYzIE1IeiBvdGhlcndpc2UgKi8KCQlpZiAocGFyLT5wbGxfbGltaXRzLm1jbGsgPT0gNjcgJiYgcGFyLT5yYW1fdHlwZSA8IFNEUkFNKQoJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDYzOwoJfQoKCWlmIChNNjRfSEFTKEdUQl9EU1ApCgkgICAgJiYgKHBsbF9yZWZfZGl2ID0gYXR5X2xkX3BsbF9jdChQTExfUkVGX0RJViwgcGFyKSkpIHsKCQlpbnQgZGlmZjEsIGRpZmYyOwoJCWRpZmYxID0gNTEwICogMTQgLyBwbGxfcmVmX2RpdiAtIHBhci0+cGxsX2xpbWl0cy5wbGxfbWF4OwoJCWRpZmYyID0gNTEwICogMjkgLyBwbGxfcmVmX2RpdiAtIHBhci0+cGxsX2xpbWl0cy5wbGxfbWF4OwoJCWlmIChkaWZmMSA8IDApCgkJCWRpZmYxID0gLWRpZmYxOwoJCWlmIChkaWZmMiA8IDApCgkJCWRpZmYyID0gLWRpZmYyOwoJCWlmIChkaWZmMiA8IGRpZmYxKSB7CgkJCXBhci0+cmVmX2Nsa19wZXIgPSAxMDAwMDAwMDAwMDAwVUxMIC8gMjk0OTg5Mjg7CgkJCXh0YWwgPSAiMjkuNDk4OTI4IjsKCQl9Cgl9CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0NUICovCgoJLyogc2F2ZSBwcmV2aW91cyB2aWRlbyBtb2RlICovCglhdHlfZ2V0X2NydGMocGFyLCAmc2F2ZWRfY3J0Yyk7CglpZihwYXItPnBsbF9vcHMtPmdldF9wbGwpCgkJcGFyLT5wbGxfb3BzLT5nZXRfcGxsKGluZm8sICZzYXZlZF9wbGwpOwoKCWkgPSBhdHlfbGRfbGUzMihNRU1fQ05UTCwgcGFyKTsKCWd0Yl9tZW1zaXplID0gTTY0X0hBUyhHVEJfRFNQKTsKCWlmIChndGJfbWVtc2l6ZSkKCQlzd2l0Y2ggKGkgJiAweEYpIHsJLyogMHhGIHVzZWQgaW5zdGVhZCBvZiBNRU1fU0laRV9BTElBUyAqLwoJCWNhc2UgTUVNX1NJWkVfNTEySzoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV8xTToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHgxMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfMk1fR1RCOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDIwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV80TV9HVEI6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4NDAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzZNX0dUQjoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg2MDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfOE1fR1RCOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDgwMDAwMDsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDsKCX0gZWxzZQoJCXN3aXRjaCAoaSAmIE1FTV9TSVpFX0FMSUFTKSB7CgkJY2FzZSBNRU1fU0laRV81MTJLOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDgwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzFNOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDEwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV8yTToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHgyMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfNE06CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4NDAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzZNOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDYwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV84TToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDA7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDA7CgkJfQoKCWlmIChNNjRfSEFTKE1BR0lDX1ZSQU1fU0laRSkpIHsKCQlpZiAoYXR5X2xkX2xlMzIoQ09ORklHX1NUQVQxLCBwYXIpICYgMHg0MDAwMDAwMCkKCQkJaW5mby0+Zml4LnNtZW1fbGVuICs9IDB4NDAwMDAwOwoJfQoKCWlmICh2cmFtKSB7CgkJaW5mby0+Zml4LnNtZW1fbGVuID0gdnJhbSAqIDEwMjQ7CgkJaSA9IGkgJiB+KGd0Yl9tZW1zaXplID8gMHhGIDogTUVNX1NJWkVfQUxJQVMpOwoJCWlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHg4MDAwMCkKCQkJaSB8PSBNRU1fU0laRV81MTJLOwoJCWVsc2UgaWYgKGluZm8tPmZpeC5zbWVtX2xlbiA8PSAweDEwMDAwMCkKCQkJaSB8PSBNRU1fU0laRV8xTTsKCQllbHNlIGlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHgyMDAwMDApCgkJCWkgfD0gZ3RiX21lbXNpemUgPyBNRU1fU0laRV8yTV9HVEIgOiBNRU1fU0laRV8yTTsKCQllbHNlIGlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHg0MDAwMDApCgkJCWkgfD0gZ3RiX21lbXNpemUgPyBNRU1fU0laRV80TV9HVEIgOiBNRU1fU0laRV80TTsKCQllbHNlIGlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHg2MDAwMDApCgkJCWkgfD0gZ3RiX21lbXNpemUgPyBNRU1fU0laRV82TV9HVEIgOiBNRU1fU0laRV82TTsKCQllbHNlCgkJCWkgfD0gZ3RiX21lbXNpemUgPyBNRU1fU0laRV84TV9HVEIgOiBNRU1fU0laRV84TTsKCQlhdHlfc3RfbGUzMihNRU1fQ05UTCwgaSwgcGFyKTsKCX0KCgkvKgoJICogIFJlZyBCbG9jayAwIChDVC1jb21wYXRpYmxlIGJsb2NrKSBpcyBhdCBtbWlvX3N0YXJ0CgkgKiAgUmVnIEJsb2NrIDEgKG11bHRpbWVkaWEgZXh0ZW5zaW9ucykgaXMgYXQgbW1pb19zdGFydCAtIDB4NDAwCgkgKi8KCWlmIChNNjRfSEFTKEdYKSkgewoJCWluZm8tPmZpeC5tbWlvX2xlbiA9IDB4NDAwOwoJCWluZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX0FUSV9NQUNINjRHWDsKCX0gZWxzZSBpZiAoTTY0X0hBUyhDVCkpIHsKCQlpbmZvLT5maXgubW1pb19sZW4gPSAweDQwMDsKCQlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9BVElfTUFDSDY0Q1Q7Cgl9IGVsc2UgaWYgKE02NF9IQVMoVlQpKSB7CgkJaW5mby0+Zml4Lm1taW9fc3RhcnQgLT0gMHg0MDA7CgkJaW5mby0+Zml4Lm1taW9fbGVuID0gMHg4MDA7CgkJaW5mby0+Zml4LmFjY2VsID0gRkJfQUNDRUxfQVRJX01BQ0g2NFZUOwoJfSBlbHNlIHsvKiBHVCAqLwoJCWluZm8tPmZpeC5tbWlvX3N0YXJ0IC09IDB4NDAwOwoJCWluZm8tPmZpeC5tbWlvX2xlbiA9IDB4ODAwOwoJCWluZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX0FUSV9NQUNINjRHVDsKCX0KCglQUklOVEtJKCIlZCVjICVzLCAlcyBNSHogWFRBTCwgJWQgTUh6IFBMTCwgJWQgTWh6IE1DTEssICVkIE1IeiBYQ0xLXG4iLAoJICAgICAgIGluZm8tPmZpeC5zbWVtX2xlbiA9PSAweDgwMDAwID8gNTEyIDogKGluZm8tPmZpeC5zbWVtX2xlbiA+PiAyMCksCgkgICAgICAgaW5mby0+Zml4LnNtZW1fbGVuID09IDB4ODAwMDAgPyAnSycgOiAnTScsIHJhbW5hbWUsIHh0YWwsIHBhci0+cGxsX2xpbWl0cy5wbGxfbWF4LAoJICAgICAgIHBhci0+cGxsX2xpbWl0cy5tY2xrLCBwYXItPnBsbF9saW1pdHMueGNsayk7CgojaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChDT05GSUdfQVRZX0NUKQoJaWYgKE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQlpbnQgaTsKCQlwcmludGsoImRlYnVnIGF0eWZiOiBCVVNfQ05UTCBEQUNfQ05UTCBNRU1fQ05UTCBFWFRfTUVNX0NOVEwgQ1JUQ19HRU5fQ05UTCAiCgkJICAgICAgICJEU1BfQ09ORklHIERTUF9PTl9PRkYgQ0xPQ0tfQ05UTFxuIgoJCSAgICAgICAiZGVidWcgYXR5ZmI6ICUwOHggJTA4eCAlMDh4ICUwOHggICAgICUwOHggICAgICAlMDh4ICAgJTA4eCAgICUwOHhcbiIKCQkgICAgICAgImRlYnVnIGF0eWZiOiBQTEwiLAoJCQlhdHlfbGRfbGUzMihCVVNfQ05UTCwgcGFyKSwgYXR5X2xkX2xlMzIoREFDX0NOVEwsIHBhciksCgkJCWF0eV9sZF9sZTMyKE1FTV9DTlRMLCBwYXIpLCBhdHlfbGRfbGUzMihFWFRfTUVNX0NOVEwsIHBhciksCgkJCWF0eV9sZF9sZTMyKENSVENfR0VOX0NOVEwsIHBhciksIGF0eV9sZF9sZTMyKERTUF9DT05GSUcsIHBhciksCgkJCWF0eV9sZF9sZTMyKERTUF9PTl9PRkYsIHBhciksIGF0eV9sZF9sZTMyKENMT0NLX0NOVEwsIHBhcikpOwoJCWZvciAoaSA9IDA7IGkgPCA0MDsgaSsrKQoJCQlwcmludGsoIiAlMDJ4IiwgYXR5X2xkX3BsbF9jdChpLCBwYXIpKTsKCQlwcmludGsoIlxuIik7Cgl9CiNlbmRpZgoJaWYocGFyLT5wbGxfb3BzLT5pbml0X3BsbCkKCQlwYXItPnBsbF9vcHMtPmluaXRfcGxsKGluZm8sICZwYXItPnBsbCk7CgoJLyoKCSAqICBMYXN0IHBhZ2Ugb2YgOCBNQiAoNCBNQiBvbiBJU0EpIGFwZXJ0dXJlIGlzIE1NSU8KCSAqICBGSVhNRTogd2Ugc2hvdWxkIHVzZSB0aGUgYXV4aWxpYXJ5IGFwZXJ0dXJlIGluc3RlYWQgc28gd2UgY2FuIGFjY2VzcwoJICogIHRoZSBmdWxsIDggTUIgb2YgdmlkZW8gUkFNIG9uIDggTUIgYm9hcmRzCgkgKi8KCglpZiAoIXBhci0+YXV4X3N0YXJ0ICYmCgkJKGluZm8tPmZpeC5zbWVtX2xlbiA9PSAweDgwMDAwMCB8fCAocGFyLT5idXNfdHlwZSA9PSBJU0EgJiYgaW5mby0+Zml4LnNtZW1fbGVuID09IDB4NDAwMDAwKSkpCgkJaW5mby0+Zml4LnNtZW1fbGVuIC09IEdVSV9SRVNFUlZFOwoKCS8qCgkgKiAgRGlzYWJsZSByZWdpc3RlciBhY2Nlc3MgdGhyb3VnaCB0aGUgbGluZWFyIGFwZXJ0dXJlCgkgKiAgaWYgdGhlIGF1eGlsaWFyeSBhcGVydHVyZSBpcyB1c2VkIHNvIHdlIGNhbiBhY2Nlc3MKCSAqICB0aGUgZnVsbCA4IE1CIG9mIHZpZGVvIFJBTSBvbiA4IE1CIGJvYXJkcy4KCSAqLwoJaWYgKHBhci0+YXV4X3N0YXJ0KQoJCWF0eV9zdF9sZTMyKEJVU19DTlRMLCBhdHlfbGRfbGUzMihCVVNfQ05UTCwgcGFyKSB8IEJVU19BUEVSX1JFR19ESVMsIHBhcik7CgojaWZkZWYgQ09ORklHX01UUlIKCXBhci0+bXRycl9hcGVyID0gLTE7CglwYXItPm10cnJfcmVnID0gLTE7CglpZiAoIW5vbXRycikgewoJCS8qIENvdmVyIHRoZSB3aG9sZSByZXNvdXJjZS4gKi8KCQkgcGFyLT5tdHJyX2FwZXIgPSBtdHJyX2FkZChwYXItPnJlc19zdGFydCwgcGFyLT5yZXNfc2l6ZSwgTVRSUl9UWVBFX1dSQ09NQiwgMSk7CgkJIGlmIChwYXItPm10cnJfYXBlciA+PSAwICYmICFwYXItPmF1eF9zdGFydCkgewoJCQkvKiBNYWtlIGEgaG9sZSBmb3IgbW1pby4gKi8KCQkJcGFyLT5tdHJyX3JlZyA9IG10cnJfYWRkKHBhci0+cmVzX3N0YXJ0ICsgMHg4MDAwMDAgLSBHVUlfUkVTRVJWRSwKCQkJCUdVSV9SRVNFUlZFLCBNVFJSX1RZUEVfVU5DQUNIQUJMRSwgMSk7CgkJCWlmIChwYXItPm10cnJfcmVnIDwgMCkgewoJCQkJbXRycl9kZWwocGFyLT5tdHJyX2FwZXIsIDAsIDApOwoJCQkJcGFyLT5tdHJyX2FwZXIgPSAtMTsKCQkJfQoJCSB9Cgl9CiNlbmRpZgoKCWluZm8tPmZib3BzID0gJmF0eWZiX29wczsKCWluZm8tPnBzZXVkb19wYWxldHRlID0gcHNldWRvX3BhbGV0dGU7CglpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUICAgICAgICAgICB8CgkgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX0lNQUdFQkxJVCB8CgkgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX0ZJTExSRUNUICB8CgkgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBICB8CgkgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX1lQQU47CgojaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCglpZiAoTTY0X0hBUyhHM19QQl8xXzEpICYmIG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMSwxIikpIHsKCQkvKiB0aGVzZSBiaXRzIGxldCB0aGUgMTAxIHBvd2VyYm9vayB3YWtlIHVwIGZyb20gc2xlZXAgLS0gcGF1bHVzICovCgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcikKCQkJICAgfCAoVVNFX0YzMktIWiB8IFRSSVNUQVRFX01FTV9FTiksIHBhcik7Cgl9IGVsc2UKI2VuZGlmCglpZiAoTTY0X0hBUyhNT0JJTF9CVVMpKSB7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVAoJCWF0eV9ibF9pbml0IChwYXIpOwojZW5kaWYKCX0KCgltZW1zZXQoJnZhciwgMCwgc2l6ZW9mKHZhcikpOwojaWZkZWYgQ09ORklHX1BQQwoJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpKSB7CgkJLyoKCQkgKiAgRklYTUU6IFRoZSBOVlJBTSBzdHVmZiBzaG91bGQgYmUgcHV0IGluIGEgTWFjLXNwZWNpZmljIGZpbGUsIGFzIGl0CgkJICogICAgICAgICBhcHBsaWVzIHRvIGFsbCBNYWMgdmlkZW8gY2FyZHMKCQkgKi8KCQlpZiAobW9kZSkgewoJCQlpZiAobWFjX2ZpbmRfbW9kZSgmdmFyLCBpbmZvLCBtb2RlLCA4KSkKCQkJCWhhc192YXIgPSAxOwoJCX0gZWxzZSB7CgkJCWlmIChkZWZhdWx0X3Ztb2RlID09IFZNT0RFX0NIT09TRSkgewoJCQkJaWYgKE02NF9IQVMoRzNfUEJfMTAyNHg3NjgpKQoJCQkJCS8qIEczIFBvd2VyQm9vayB3aXRoIDEwMjR4NzY4IExDRCAqLwoJCQkJCWRlZmF1bHRfdm1vZGUgPSBWTU9ERV8xMDI0Xzc2OF82MDsKCQkJCWVsc2UgaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiaU1hYyIpKQoJCQkJCWRlZmF1bHRfdm1vZGUgPSBWTU9ERV8xMDI0Xzc2OF83NTsKCQkJCWVsc2UgaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZQoJCQkJCSAoIlBvd2VyQm9vazIsMSIpKQoJCQkJCS8qIGlCb29rIHdpdGggODAweDYwMCBMQ0QgKi8KCQkJCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfODAwXzYwMF82MDsKCQkJCWVsc2UKCQkJCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfNjQwXzQ4MF82NzsKCQkJCXNlbnNlID0gcmVhZF9hdHlfc2Vuc2UocGFyKTsKCQkJCVBSSU5US0koIm1vbml0b3Igc2Vuc2U9JXgsIG1vZGUgJWRcbiIsCgkJCQkJc2Vuc2UsICBtYWNfbWFwX21vbml0b3Jfc2Vuc2Uoc2Vuc2UpKTsKCQkJfQoJCQlpZiAoZGVmYXVsdF92bW9kZSA8PSAwIHx8IGRlZmF1bHRfdm1vZGUgPiBWTU9ERV9NQVgpCgkJCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfNjQwXzQ4MF82MDsKCQkJaWYgKGRlZmF1bHRfY21vZGUgPCBDTU9ERV84IHx8IGRlZmF1bHRfY21vZGUgPiBDTU9ERV8zMikKCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV84OwoJCQlpZiAoIW1hY192bW9kZV90b192YXIoZGVmYXVsdF92bW9kZSwgZGVmYXVsdF9jbW9kZSwKCQkJCQkgICAgICAgJnZhcikpCgkJCQloYXNfdmFyID0gMTsKCQl9Cgl9CgojZW5kaWYgLyogIUNPTkZJR19QUEMgKi8KCiNpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpCglpZiAoIWF0eWZiX2dldF90aW1pbmdzX2Zyb21fbGNkKHBhciwgJnZhcikpCgkJaGFzX3ZhciA9IDE7CiNlbmRpZgoKCWlmIChtb2RlICYmIGZiX2ZpbmRfbW9kZSgmdmFyLCBpbmZvLCBtb2RlLCBOVUxMLCAwLCAmZGVmbW9kZSwgOCkpCgkJaGFzX3ZhciA9IDE7CgoJaWYgKCFoYXNfdmFyKQoJCXZhciA9IGRlZmF1bHRfdmFyOwoKCWlmIChub2FjY2VsKQoJCXZhci5hY2NlbF9mbGFncyAmPSB+RkJfQUNDRUxGX1RFWFQ7CgllbHNlCgkJdmFyLmFjY2VsX2ZsYWdzIHw9IEZCX0FDQ0VMRl9URVhUOwoKCWlmIChjb21wX3N5bmMgIT0gLTEpIHsKCQlpZiAoIWNvbXBfc3luYykKCQkJdmFyLnN5bmMgJj0gfkZCX1NZTkNfQ09NUF9ISUdIX0FDVDsKCQllbHNlCgkJCXZhci5zeW5jIHw9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVDsKCX0KCglpZiAodmFyLnlyZXMgPT0gdmFyLnlyZXNfdmlydHVhbCkgewoJCXUzMiB2aWRlb3JhbSA9IChpbmZvLT5maXguc21lbV9sZW4gLSAoUEFHRV9TSVpFIDw8IDIpKTsKCQl2YXIueXJlc192aXJ0dWFsID0gKCh2aWRlb3JhbSAqIDgpIC8gdmFyLmJpdHNfcGVyX3BpeGVsKSAvIHZhci54cmVzX3ZpcnR1YWw7CgkJaWYgKHZhci55cmVzX3ZpcnR1YWwgPCB2YXIueXJlcykKCQkJdmFyLnlyZXNfdmlydHVhbCA9IHZhci55cmVzOwoJfQoKCWlmIChhdHlmYl9jaGVja192YXIoJnZhciwgaW5mbykpIHsKCQlQUklOVEtFKCJjYW4ndCBzZXQgZGVmYXVsdCB2aWRlbyBtb2RlXG4iKTsKCQlnb3RvIGF0eV9pbml0X2V4aXQ7Cgl9CgojaWZkZWYgX19zcGFyY19fCglhdHlmYl9zYXZlX3BhbGV0dGUocGFyLCAwKTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVAoJaWYgKCFub2FjY2VsICYmIE02NF9IQVMoSU5URUdSQVRFRCkpCgkJYXR5X2luaXRfY3Vyc29yKGluZm8pOwojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9DVCAqLwoJaW5mby0+dmFyID0gdmFyOwoKCWZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCk7CgoJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pIDwgMCkKCQlnb3RvIGF0eV9pbml0X2V4aXQ7CgoJZmJfbGlzdCA9IGluZm87CgoJUFJJTlRLSSgiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZSBvbiAlc1xuIiwKCSAgICAgICBpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQsIG5hbWUpOwoJcmV0dXJuIDA7CgphdHlfaW5pdF9leGl0OgoJLyogcmVzdG9yZSB2aWRlbyBtb2RlICovCglhdHlfc2V0X2NydGMocGFyLCAmc2F2ZWRfY3J0Yyk7CglwYXItPnBsbF9vcHMtPnNldF9wbGwoaW5mbywgJnNhdmVkX3BsbCk7CgojaWZkZWYgQ09ORklHX01UUlIKCWlmIChwYXItPm10cnJfcmVnID49IDApIHsKCSAgICBtdHJyX2RlbChwYXItPm10cnJfcmVnLCAwLCAwKTsKCSAgICBwYXItPm10cnJfcmVnID0gLTE7Cgl9CglpZiAocGFyLT5tdHJyX2FwZXIgPj0gMCkgewoJICAgIG10cnJfZGVsKHBhci0+bXRycl9hcGVyLCAwLCAwKTsKCSAgICBwYXItPm10cnJfYXBlciA9IC0xOwoJfQojZW5kaWYKCXJldHVybiAtMTsKfQoKI2lmZGVmIENPTkZJR19BVEFSSQpzdGF0aWMgaW50IF9fZGV2aW5pdCBzdG9yZV92aWRlb19wYXIoY2hhciAqdmlkZW9fc3RyLCB1bnNpZ25lZCBjaGFyIG02NF9udW0pCnsKCWNoYXIgKnA7Cgl1bnNpZ25lZCBsb25nIHZtZW1iYXNlLCBzaXplLCBndWlyZWdiYXNlOwoKCVBSSU5US0koInN0b3JlX3ZpZGVvX3BhcigpICclcycgXG4iLCB2aWRlb19zdHIpOwoKCWlmICghKHAgPSBzdHJzZXAoJnZpZGVvX3N0ciwgIjsiKSkgfHwgISpwKQoJCWdvdG8gbWFjaDY0X2ludmFsaWQ7Cgl2bWVtYmFzZSA9IHNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDApOwoJaWYgKCEocCA9IHN0cnNlcCgmdmlkZW9fc3RyLCAiOyIpKSB8fCAhKnApCgkJZ290byBtYWNoNjRfaW52YWxpZDsKCXNpemUgPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAwKTsKCWlmICghKHAgPSBzdHJzZXAoJnZpZGVvX3N0ciwgIjsiKSkgfHwgISpwKQoJCWdvdG8gbWFjaDY0X2ludmFsaWQ7CglndWlyZWdiYXNlID0gc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMCk7CgoJcGh5c192bWVtYmFzZVttNjRfbnVtXSA9IHZtZW1iYXNlOwoJcGh5c19zaXplW202NF9udW1dID0gc2l6ZTsKCXBoeXNfZ3VpcmVnYmFzZVttNjRfbnVtXSA9IGd1aXJlZ2Jhc2U7CglQUklOVEtJKCJzdG9yZWQgdGhlbSBhbGw6ICQlMDhsWCAkJTA4bFggJCUwOGxYIFxuIiwgdm1lbWJhc2UsIHNpemUsCgkgICAgICAgZ3VpcmVnYmFzZSk7CglyZXR1cm4gMDsKCiAgICAgIG1hY2g2NF9pbnZhbGlkOgoJcGh5c192bWVtYmFzZVttNjRfbnVtXSA9IDA7CglyZXR1cm4gLTE7Cn0KI2VuZGlmIC8qIENPTkZJR19BVEFSSSAqLwoKICAgIC8qCiAgICAgKiAgQmxhbmsgdGhlIGRpc3BsYXkuCiAgICAgKi8KCnN0YXRpYyBpbnQgYXR5ZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJdTMyIGdlbl9jbnRsOwoKCWlmIChwYXItPmxvY2tfYmxhbmsgfHwgcGFyLT5hc2xlZXApCgkJcmV0dXJuIDA7CgojaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSAmJiBibGFuayA+IEZCX0JMQU5LX05PUk1BTCkKCQlhdHlfYmxfc2V0X3Bvd2VyKGluZm8sIEZCX0JMQU5LX1BPV0VSRE9XTik7CiNlbGlmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKCWlmIChwYXItPmxjZF90YWJsZSAmJiBibGFuayA+IEZCX0JMQU5LX05PUk1BTCAmJgoJICAgIChhdHlfbGRfbGNkKExDRF9HRU5fQ05UTCwgcGFyKSAmIExDRF9PTikpIHsKCQl1MzIgcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJcG0gJj0gflBXUl9CTE9OOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7Cgl9CiNlbmRpZgoKCWdlbl9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKTsKCXN3aXRjaCAoYmxhbmspIHsKICAgICAgICAJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgoJCQlnZW5fY250bCAmPSB+MHg0MDAwMDRjOwoJCQlicmVhazsKCQljYXNlIEZCX0JMQU5LX05PUk1BTDoKCQkJZ2VuX2NudGwgfD0gMHg0MDAwMDQwOwoJCQlicmVhazsKCQljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CgkJCWdlbl9jbnRsIHw9IDB4NDAwMDA0ODsKCQkJYnJlYWs7CgkJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgoJCQlnZW5fY250bCB8PSAweDQwMDAwNDQ7CgkJCWJyZWFrOwoJCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgoJCQlnZW5fY250bCB8PSAweDQwMDAwNGM7CgkJCWJyZWFrOwoJfQoJYXR5X3N0X2xlMzIoQ1JUQ19HRU5fQ05UTCwgZ2VuX2NudGwsIHBhcik7CgojaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSAmJiBibGFuayA8PSBGQl9CTEFOS19OT1JNQUwpCgkJYXR5X2JsX3NldF9wb3dlcihpbmZvLCBGQl9CTEFOS19VTkJMQU5LKTsKI2VsaWYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQoJaWYgKHBhci0+bGNkX3RhYmxlICYmIGJsYW5rIDw9IEZCX0JMQU5LX05PUk1BTCAmJgoJICAgIChhdHlfbGRfbGNkKExDRF9HRU5fQ05UTCwgcGFyKSAmIExDRF9PTikpIHsKCQl1MzIgcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJcG0gfD0gUFdSX0JMT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCX0KI2VuZGlmCgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGF0eV9zdF9wYWwodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCgkJICAgICAgIGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewojaWZkZWYgQ09ORklHX0FUQVJJCglvdXRfOCgmcGFyLT5hdHlfY21hcF9yZWdzLT53aW5kZXgsIHJlZ25vKTsKCW91dF84KCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCwgcmVkKTsKCW91dF84KCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCwgZ3JlZW4pOwoJb3V0XzgoJnBhci0+YXR5X2NtYXBfcmVncy0+bHV0LCBibHVlKTsKI2Vsc2UKCXdyaXRlYihyZWdubywgJnBhci0+YXR5X2NtYXBfcmVncy0+d2luZGV4KTsKCXdyaXRlYihyZWQsICZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7Cgl3cml0ZWIoZ3JlZW4sICZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7Cgl3cml0ZWIoYmx1ZSwgJnBhci0+YXR5X2NtYXBfcmVncy0+bHV0KTsKI2VuZGlmCn0KCiAgICAvKgogICAgICogIFNldCBhIHNpbmdsZSBjb2xvciByZWdpc3Rlci4gVGhlIHZhbHVlcyBzdXBwbGllZCBhcmUgYWxyZWFkeQogICAgICogIHJvdW5kZWQgZG93biB0byB0aGUgaGFyZHdhcmUncyBjYXBhYmlsaXRpZXMgKGFjY29yZGluZyB0byB0aGUKICAgICAqICBlbnRyaWVzIGluIHRoZSB2YXIgc3RydWN0dXJlKS4gUmV0dXJuICE9IDAgZm9yIGludmFsaWQgcmVnbm8uCiAgICAgKiAgISEgNCAmIDggPSAgUFNFVURPLCA+IDggPSBESVJFQ1RDT0xPUgogICAgICovCgpzdGF0aWMgaW50IGF0eWZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKCXVfaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCWludCBpLCBkZXB0aDsKCXUzMiAqcGFsID0gaW5mby0+cHNldWRvX3BhbGV0dGU7CgoJZGVwdGggPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWw7CglpZiAoZGVwdGggPT0gMTYpCgkJZGVwdGggPSAoaW5mby0+dmFyLmdyZWVuLmxlbmd0aCA9PSA1KSA/IDE1IDogMTY7CgoJaWYgKHBhci0+YXNsZWVwKQoJCXJldHVybiAwOwoKCWlmIChyZWdubyA+IDI1NSB8fAoJICAgIChkZXB0aCA9PSAxNiAmJiByZWdubyA+IDYzKSB8fAoJICAgIChkZXB0aCA9PSAxNSAmJiByZWdubyA+IDMxKSkKCQlyZXR1cm4gMTsKCglyZWQgPj49IDg7CglncmVlbiA+Pj0gODsKCWJsdWUgPj49IDg7CgoJcGFyLT5wYWxldHRlW3JlZ25vXS5yZWQgPSByZWQ7CglwYXItPnBhbGV0dGVbcmVnbm9dLmdyZWVuID0gZ3JlZW47CglwYXItPnBhbGV0dGVbcmVnbm9dLmJsdWUgPSBibHVlOwoKCWlmIChyZWdubyA8IDE2KSB7CgkJc3dpdGNoIChkZXB0aCkgewoJCWNhc2UgMTU6CgkJCXBhbFtyZWdub10gPSAocmVnbm8gPDwgMTApIHwgKHJlZ25vIDw8IDUpIHwgcmVnbm87CgkJCWJyZWFrOwoJCWNhc2UgMTY6CgkJCXBhbFtyZWdub10gPSAocmVnbm8gPDwgMTEpIHwgKHJlZ25vIDw8IDUpIHwgcmVnbm87CgkJCWJyZWFrOwoJCWNhc2UgMjQ6CgkJCXBhbFtyZWdub10gPSAocmVnbm8gPDwgMTYpIHwgKHJlZ25vIDw8IDgpIHwgcmVnbm87CgkJCWJyZWFrOwoJCWNhc2UgMzI6CgkJCWkgPSAocmVnbm8gPDwgOCkgfCByZWdubzsKCQkJcGFsW3JlZ25vXSA9IChpIDw8IDE2KSB8IGk7CgkJCWJyZWFrOwoJCX0KCX0KCglpID0gYXR5X2xkXzgoREFDX0NOVEwsIHBhcikgJiAweGZjOwoJaWYgKE02NF9IQVMoRVhUUkFfQlJJR0hUKSkKCQlpIHw9IDB4MjsgLyogREFDX0NOVEwgfCAweDIgdHVybnMgb2ZmIHRoZSBleHRyYSBicmlnaHRuZXNzIGZvciBndCAqLwoJYXR5X3N0XzgoREFDX0NOVEwsIGksIHBhcik7CglhdHlfc3RfOChEQUNfTUFTSywgMHhmZiwgcGFyKTsKCglpZiAoTTY0X0hBUyhJTlRFR1JBVEVEKSkgewoJCWlmIChkZXB0aCA9PSAxNikgewoJCQlpZiAocmVnbm8gPCAzMikKCQkJCWF0eV9zdF9wYWwocmVnbm8gPDwgMywgcmVkLAoJCQkJCSAgIHBhci0+cGFsZXR0ZVtyZWdubzw8MV0uZ3JlZW4sCgkJCQkJICAgYmx1ZSwgcGFyKTsKCQkJcmVkID0gcGFyLT5wYWxldHRlW3JlZ25vPj4xXS5yZWQ7CgkJCWJsdWUgPSBwYXItPnBhbGV0dGVbcmVnbm8+PjFdLmJsdWU7CgkJCXJlZ25vIDw8PSAyOwoJCX0gZWxzZSBpZiAoZGVwdGggPT0gMTUpIHsKCQkJcmVnbm8gPDw9IDM7CgkJCWZvcihpID0gMDsgaSA8IDg7IGkrKykgewoJCQkgICAgYXR5X3N0X3BhbChyZWdubyArIGksIHJlZCwgZ3JlZW4sIGJsdWUsIHBhcik7CgkJCX0KCQl9Cgl9CglhdHlfc3RfcGFsKHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLCBwYXIpOwoKCXJldHVybiAwOwp9CgojaWZkZWYgQ09ORklHX1BDSQoKI2lmZGVmIF9fc3BhcmNfXwoKZXh0ZXJuIHZvaWQgKCpwcm9tX3BhbGV0dGUpIChpbnQpOwoKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfc2V0dXBfc3BhcmMoc3RydWN0IHBjaV9kZXYgKnBkZXYsCgkJCXN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIGFkZHIpCnsKCWV4dGVybiBpbnQgY29uX2lzX3ByZXNlbnQodm9pZCk7CgoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwoJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcDsKCWNoYXIgcHJvcFsxMjhdOwoJaW50IG5vZGUsIGxlbiwgaSwgaiwgcmV0OwoJdTMyIG1lbSwgY2hpcF9pZDsKCgkvKiBEbyBub3QgYXR0YWNoIHdoZW4gd2UgaGF2ZSBhIHNlcmlhbCBjb25zb2xlLiAqLwoJaWYgKCFjb25faXNfcHJlc2VudCgpKQoJCXJldHVybiAtRU5YSU87CgoJLyoKCSAqIE1hcCBtZW1vcnktbWFwcGVkIHJlZ2lzdGVycy4KCSAqLwoJcGFyLT5hdGlfcmVnYmFzZSA9ICh2b2lkICopYWRkciArIDB4N2ZmYzAwVUw7CglpbmZvLT5maXgubW1pb19zdGFydCA9IGFkZHIgKyAweDdmZmMwMFVMOwoKCS8qCgkgKiBNYXAgaW4gYmlnLWVuZGlhbiBhcGVydHVyZS4KCSAqLwoJaW5mby0+c2NyZWVuX2Jhc2UgPSAoY2hhciAqKSAoYWRkciArIDB4ODAwMDAwVUwpOwoJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBhZGRyICsgMHg4MDAwMDBVTDsKCgkvKgoJICogRmlndXJlIG1tYXAgYWRkcmVzc2VzIGZyb20gUENJIGNvbmZpZyBzcGFjZS4KCSAqIFNwbGl0IEZyYW1lYnVmZmVyIGluIGJpZy0gYW5kIGxpdHRsZS1lbmRpYW4gaGFsZnMuCgkgKi8KCWZvciAoaSA9IDA7IGkgPCA2ICYmIHBkZXYtPnJlc291cmNlW2ldLnN0YXJ0OyBpKyspCgkJLyogbm90aGluZyAqLyA7CglqID0gaSArIDQ7CgoJcGFyLT5tbWFwX21hcCA9IGttYWxsb2MoaiAqIHNpemVvZigqcGFyLT5tbWFwX21hcCksIEdGUF9BVE9NSUMpOwoJaWYgKCFwYXItPm1tYXBfbWFwKSB7CgkJUFJJTlRLRSgiYXR5ZmJfc2V0dXBfc3BhcmMoKSBjYW4ndCBhbGxvYyBtbWFwX21hcFxuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgltZW1zZXQocGFyLT5tbWFwX21hcCwgMCwgaiAqIHNpemVvZigqcGFyLT5tbWFwX21hcCkpOwoKCWZvciAoaSA9IDAsIGogPSAyOyBpIDwgNiAmJiBwZGV2LT5yZXNvdXJjZVtpXS5zdGFydDsgaSsrKSB7CgkJc3RydWN0IHJlc291cmNlICpycCA9ICZwZGV2LT5yZXNvdXJjZVtpXTsKCQlpbnQgaW8sIGJyZWcgPSBQQ0lfQkFTRV9BRERSRVNTXzAgKyAoaSA8PCAyKTsKCQl1bnNpZ25lZCBsb25nIGJhc2U7CgkJdTMyIHNpemUsIHBiYXNlOwoKCQliYXNlID0gcnAtPnN0YXJ0OwoKCQlpbyA9IChycC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKTsKCgkJc2l6ZSA9IHJwLT5lbmQgLSBiYXNlICsgMTsKCgkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGJyZWcsICZwYmFzZSk7CgoJCWlmIChpbykKCQkJc2l6ZSAmPSB+MTsKCgkJLyoKCQkgKiBNYXAgdGhlIGZyYW1lYnVmZmVyIGEgc2Vjb25kIHRpbWUsIHRoaXMgdGltZSB3aXRob3V0CgkJICogdGhlIGJyYWluZGVhZCBfUEFHRV9JRSBzZXR0aW5nLiBUaGlzIGlzIHVzZWQgYnkgdGhlCgkJICogZml4ZWQgWHNlcnZlciwgYnV0IHdlIG5lZWQgdG8gbWFpbnRhaW4gdGhlIG9sZCBtYXBwaW5nCgkJICogdG8gc3RheSBjb21wYXRpYmxlIHdpdGggb2xkZXIgb25lcy4uLgoJCSAqLwoJCWlmIChiYXNlID09IGFkZHIpIHsKCQkJcGFyLT5tbWFwX21hcFtqXS52b2ZmID0gKHBiYXNlICsgMHgxMDAwMDAwMCkgJiBQQUdFX01BU0s7CgkJCXBhci0+bW1hcF9tYXBbal0ucG9mZiA9IGJhc2UgJiBQQUdFX01BU0s7CgkJCXBhci0+bW1hcF9tYXBbal0uc2l6ZSA9IChzaXplICsgflBBR0VfTUFTSykgJiBQQUdFX01BU0s7CgkJCXBhci0+bW1hcF9tYXBbal0ucHJvdF9tYXNrID0gX1BBR0VfQ0FDSEU7CgkJCXBhci0+bW1hcF9tYXBbal0ucHJvdF9mbGFnID0gX1BBR0VfRTsKCQkJaisrOwoJCX0KCgkJLyoKCQkgKiBIZXJlIGNvbWVzIHRoZSBvbGQgZnJhbWVidWZmZXIgbWFwcGluZyB3aXRoIF9QQUdFX0lFCgkJICogc2V0IGZvciB0aGUgYmlnIGVuZGlhbiBoYWxmIG9mIHRoZSBmcmFtZWJ1ZmZlci4uLgoJCSAqLwoJCWlmIChiYXNlID09IGFkZHIpIHsKCQkJcGFyLT5tbWFwX21hcFtqXS52b2ZmID0gKHBiYXNlICsgMHg4MDAwMDApICYgUEFHRV9NQVNLOwoJCQlwYXItPm1tYXBfbWFwW2pdLnBvZmYgPSAoYmFzZSArIDB4ODAwMDAwKSAmIFBBR0VfTUFTSzsKCQkJcGFyLT5tbWFwX21hcFtqXS5zaXplID0gMHg4MDAwMDA7CgkJCXBhci0+bW1hcF9tYXBbal0ucHJvdF9tYXNrID0gX1BBR0VfQ0FDSEU7CgkJCXBhci0+bW1hcF9tYXBbal0ucHJvdF9mbGFnID0gX1BBR0VfRSB8IF9QQUdFX0lFOwoJCQlzaXplIC09IDB4ODAwMDAwOwoJCQlqKys7CgkJfQoKCQlwYXItPm1tYXBfbWFwW2pdLnZvZmYgPSBwYmFzZSAmIFBBR0VfTUFTSzsKCQlwYXItPm1tYXBfbWFwW2pdLnBvZmYgPSBiYXNlICYgUEFHRV9NQVNLOwoJCXBhci0+bW1hcF9tYXBbal0uc2l6ZSA9IChzaXplICsgflBBR0VfTUFTSykgJiBQQUdFX01BU0s7CgkJcGFyLT5tbWFwX21hcFtqXS5wcm90X21hc2sgPSBfUEFHRV9DQUNIRTsKCQlwYXItPm1tYXBfbWFwW2pdLnByb3RfZmxhZyA9IF9QQUdFX0U7CgkJaisrOwoJfQoKCWlmKChyZXQgPSBjb3JyZWN0X2NoaXBzZXQocGFyKSkpCgkJcmV0dXJuIHJldDsKCglpZiAoSVNfWEwocGRldi0+ZGV2aWNlKSkgewoJCS8qCgkJICogRml4IFBST01zIGlkZWEgb2YgTUVNX0NOVEwgc2V0dGluZ3MuLi4KCQkgKi8KCQltZW0gPSBhdHlfbGRfbGUzMihNRU1fQ05UTCwgcGFyKTsKCQljaGlwX2lkID0gYXR5X2xkX2xlMzIoQ09ORklHX0NISVBfSUQsIHBhcik7CgkJaWYgKCgoY2hpcF9pZCAmIENGR19DSElQX1RZUEUpID09IFZUX0NISVBfSUQpICYmICEoKGNoaXBfaWQgPj4gMjQpICYgMSkpIHsKCQkJc3dpdGNoIChtZW0gJiAweDBmKSB7CgkJCWNhc2UgMzoKCQkJCW1lbSA9IChtZW0gJiB+KDB4MGYpKSB8IDI7CgkJCQlicmVhazsKCQkJY2FzZSA3OgoJCQkJbWVtID0gKG1lbSAmIH4oMHgwZikpIHwgMzsKCQkJCWJyZWFrOwoJCQljYXNlIDk6CgkJCQltZW0gPSAobWVtICYgfigweDBmKSkgfCA0OwoJCQkJYnJlYWs7CgkJCWNhc2UgMTE6CgkJCQltZW0gPSAobWVtICYgfigweDBmKSkgfCA1OwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoKGF0eV9sZF9sZTMyKENPTkZJR19TVEFUMCwgcGFyKSAmIDcpID49IFNEUkFNKQoJCQkJbWVtICY9IH4oMHgwMDcwMDAwMCk7CgkJfQoJCW1lbSAmPSB+KDB4Y2Y4MGUwMDApOwkvKiBUdXJuIG9mZiBhbGwgdW5kb2N1bWVudGVkIGJpdHMuICovCgkJYXR5X3N0X2xlMzIoTUVNX0NOVEwsIG1lbSwgcGFyKTsKCX0KCgkvKgoJICogSWYgdGhpcyBpcyB0aGUgY29uc29sZSBkZXZpY2UsIHdlIHdpbGwgc2V0IGRlZmF1bHQgdmlkZW8KCSAqIHNldHRpbmdzIHRvIHdoYXQgdGhlIFBST00gbGVmdCB1cyB3aXRoLgoJICovCglub2RlID0gcHJvbV9nZXRjaGlsZChwcm9tX3Jvb3Rfbm9kZSk7Cglub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAiYWxpYXNlcyIpOwoJaWYgKG5vZGUpIHsKCQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsICJzY3JlZW4iLCBwcm9wLCBzaXplb2YocHJvcCkpOwoJCWlmIChsZW4gPiAwKSB7CgkJCXByb3BbbGVuXSA9ICdcMCc7CgkJCW5vZGUgPSBwcm9tX2ZpbmRkZXZpY2UocHJvcCk7CgkJfSBlbHNlCgkJCW5vZGUgPSAwOwoJfQoKCXBjcCA9IHBkZXYtPnN5c2RhdGE7CglpZiAobm9kZSA9PSBwY3AtPnByb21fbm9kZS0+bm9kZSkgewoJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmRlZmF1bHRfdmFyOwoJCXVuc2lnbmVkIGludCBOLCBQLCBRLCBNLCBULCBSOwoJCXUzMiB2X3RvdGFsLCBoX3RvdGFsOwoJCXN0cnVjdCBjcnRjIGNydGM7CgkJdTggcGxsX3JlZ3NbMTZdOwoJCXU4IGNsb2NrX2NudGw7CgoJCWNydGMudnhyZXMgPSBwcm9tX2dldGludGRlZmF1bHQobm9kZSwgIndpZHRoIiwgMTAyNCk7CgkJY3J0Yy52eXJlcyA9IHByb21fZ2V0aW50ZGVmYXVsdChub2RlLCAiaGVpZ2h0IiwgNzY4KTsKCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gcHJvbV9nZXRpbnRkZWZhdWx0KG5vZGUsICJkZXB0aCIsIDgpOwoJCXZhci0+eG9mZnNldCA9IHZhci0+eW9mZnNldCA9IDA7CgkJY3J0Yy5oX3RvdF9kaXNwID0gYXR5X2xkX2xlMzIoQ1JUQ19IX1RPVEFMX0RJU1AsIHBhcik7CgkJY3J0Yy5oX3N5bmNfc3RydF93aWQgPSBhdHlfbGRfbGUzMihDUlRDX0hfU1lOQ19TVFJUX1dJRCwgcGFyKTsKCQljcnRjLnZfdG90X2Rpc3AgPSBhdHlfbGRfbGUzMihDUlRDX1ZfVE9UQUxfRElTUCwgcGFyKTsKCQljcnRjLnZfc3luY19zdHJ0X3dpZCA9IGF0eV9sZF9sZTMyKENSVENfVl9TWU5DX1NUUlRfV0lELCBwYXIpOwoJCWNydGMuZ2VuX2NudGwgPSBhdHlfbGRfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXIpOwoJCWF0eV9jcnRjX3RvX3ZhcigmY3J0YywgdmFyKTsKCgkJaF90b3RhbCA9IHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luICsgdmFyLT5oc3luY19sZW4gKyB2YXItPmxlZnRfbWFyZ2luOwoJCXZfdG90YWwgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuICsgdmFyLT51cHBlcl9tYXJnaW47CgoJCS8qCgkJICogUmVhZCB0aGUgUExMIHRvIGZpZ3VyZSBhY3R1YWwgUmVmcmVzaCBSYXRlLgoJCSAqLwoJCWNsb2NrX2NudGwgPSBhdHlfbGRfOChDTE9DS19DTlRMLCBwYXIpOwoJCS8qIERQUklOVEsoIkNMT0NLX0NOVEwgJTAyeFxuIiwgY2xvY2tfY250bCk7ICovCgkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCgkJCXBsbF9yZWdzW2ldID0gYXR5X2xkX3BsbF9jdChpLCBwYXIpOwoKCQkvKgoJCSAqIFBMTCBSZWZlcmVuY2UgRGl2aWRlciBNOgoJCSAqLwoJCU0gPSBwbGxfcmVnc1syXTsKCgkJLyoKCQkgKiBQTEwgRmVlZGJhY2sgRGl2aWRlciBOIChEZXBlbmRhbnQgb24gQ0xPQ0tfQ05UTCk6CgkJICovCgkJTiA9IHBsbF9yZWdzWzcgKyAoY2xvY2tfY250bCAmIDMpXTsKCgkJLyoKCQkgKiBQTEwgUG9zdCBEaXZpZGVyIFAgKERlcGVuZGFudCBvbiBDTE9DS19DTlRMKToKCQkgKi8KCQlQID0gMSA8PCAocGxsX3JlZ3NbNl0gPj4gKChjbG9ja19jbnRsICYgMykgPDwgMSkpOwoKCQkvKgoJCSAqIFBMTCBEaXZpZGVyIFE6CgkJICovCgkJUSA9IE4gLyBQOwoKCQkvKgoJCSAqIFRhcmdldCBGcmVxdWVuY3k6CgkJICoKCQkgKiAgICAgIFQgKiBNCgkJICogUSA9IC0tLS0tLS0KCQkgKiAgICAgIDIgKiBSCgkJICoKCQkgKiB3aGVyZSBSIGlzIFhUQUxJTiAoPSAxNDMxOCBvciAyOTQ5OCBrSHopLgoJCSAqLwoJCWlmIChJU19YTChwZGV2LT5kZXZpY2UpKQoJCQlSID0gMjk0OTg7CgkJZWxzZQoJCQlSID0gMTQzMTg7CgoJCVQgPSAyICogUSAqIFIgLyBNOwoKCQlkZWZhdWx0X3Zhci5waXhjbG9jayA9IDEwMDAwMDAwMDAgLyBUOwoJfQoKCXJldHVybiAwOwp9CgojZWxzZSAvKiBfX3NwYXJjX18gKi8KCiNpZmRlZiBfX2kzODZfXwojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRApzdGF0aWMgdm9pZCBhdHlfaW5pdF9sY2Qoc3RydWN0IGF0eWZiX3BhciAqcGFyLCB1MzIgYmlvc19iYXNlKQp7Cgl1MzIgZHJpdl9pbmZfdGFiLCBzaWc7Cgl1MTYgbGNkX29mczsKCgkvKiBUbyBzdXBwb3J0IGFuIExDRCBwYW5lbCwgd2Ugc2hvdWxkIGtub3cgaXQncyBkaW1lbnNpb25zIGFuZAoJICogIGl0J3MgZGVzaXJlZCBwaXhlbCBjbG9jay4KCSAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byBkbyBpdDoKCSAqICAtIENoZWNrIHRoZSBzdGFydHVwIHZpZGVvIG1vZGUgYW5kIGNhbGN1bGF0ZSB0aGUgcGFuZWwKCSAqICAgIHNpemUgZnJvbSBpdC4gVGhpcyBpcyB1bnJlbGlhYmxlLgoJICogIC0gUmVhZCBpdCBmcm9tIHRoZSBkcml2ZXIgaW5mb3JtYXRpb24gdGFibGUgaW4gdGhlIHZpZGVvIEJJT1MuCgkqLwoJLyogQWRkcmVzcyBvZiBkcml2ZXIgaW5mb3JtYXRpb24gdGFibGUgaXMgYXQgb2Zmc2V0IDB4NzguICovCglkcml2X2luZl90YWIgPSBiaW9zX2Jhc2UgKyAqKCh1MTYgKikoYmlvc19iYXNlKzB4NzgpKTsKCgkvKiBDaGVjayBmb3IgdGhlIGRyaXZlciBpbmZvcm1hdGlvbiB0YWJsZSBzaWduYXR1cmUuICovCglzaWcgPSAoKih1MzIgKilkcml2X2luZl90YWIpOwoJaWYgKChzaWcgPT0gMHg1NDUwNGMyNCkgfHwgLyogUmFnZSBMVCBwcm8gKi8KCQkoc2lnID09IDB4NTQ0ZDUyMjQpIHx8IC8qIFJhZ2UgbW9iaWxpdHkgKi8KCQkoc2lnID09IDB4NTQ0MzU4MjQpIHx8IC8qIFJhZ2UgWEMgKi8KCQkoc2lnID09IDB4NTQ0YzU4MjQpKSB7IC8qIFJhZ2UgWEwgKi8KCQlQUklOVEtJKCJCSU9TIGNvbnRhaW5zIGRyaXZlciBpbmZvcm1hdGlvbiB0YWJsZS5cbiIpOwoJCWxjZF9vZnMgPSAoKih1MTYgKikoZHJpdl9pbmZfdGFiICsgMTApKTsKCQlwYXItPmxjZF90YWJsZSA9IDA7CgkJaWYgKGxjZF9vZnMgIT0gMCkgewoJCQlwYXItPmxjZF90YWJsZSA9IGJpb3NfYmFzZSArIGxjZF9vZnM7CgkJfQoJfQoKCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJY2hhciBtb2RlbFsyNF07CgkJY2hhciBzdHJidWZbMTZdOwoJCWNoYXIgcmVmcmVzaF9yYXRlc19idWZbMTAwXTsKCQlpbnQgaWQsIHRlY2gsIGYsIGksIG0sIGRlZmF1bHRfcmVmcmVzaF9yYXRlOwoJCWNoYXIgKnR4dGNvbG91cjsKCQljaGFyICp0eHRtb25pdG9yOwoJCWNoYXIgKnR4dGR1YWw7CgkJY2hhciAqdHh0Zm9ybWF0OwoJCXUxNiB3aWR0aCwgaGVpZ2h0LCBwYW5lbF90eXBlLCByZWZyZXNoX3JhdGVzOwoJCXUxNiAqbGNkbW9kZXB0cjsKCQl1MzIgZm9ybWF0OwoJCXU4IGxjZF9yZWZyZXNoX3JhdGVzWzE2XSA9IHs1MCw1Niw2MCw2Nyw3MCw3Miw3NSw3Niw4NSw5MCwxMDAsMTIwLDE0MCwxNTAsMTYwLDIwMH07CgkJLyogVGhlIG1vc3QgaW1wb3J0YW50IGluZm9ybWF0aW9uIGlzIHRoZSBwYW5lbCBzaXplIGF0CgkJICogb2Zmc2V0IDI1IGFuZCAyNywgYnV0IHRoZXJlJ3Mgc29tZSBvdGhlciBuaWNlIGluZm9ybWF0aW9uCgkJICogd2hpY2ggd2UgcHJpbnQgdG8gdGhlIHNjcmVlbi4KCQkgKi8KCQlpZCA9ICoodTggKilwYXItPmxjZF90YWJsZTsKCQlzdHJuY3B5KG1vZGVsLChjaGFyICopcGFyLT5sY2RfdGFibGUrMSwyNCk7CgkJbW9kZWxbMjNdPTA7CgoJCXdpZHRoID0gcGFyLT5sY2Rfd2lkdGggPSAqKHUxNiAqKShwYXItPmxjZF90YWJsZSsyNSk7CgkJaGVpZ2h0ID0gcGFyLT5sY2RfaGVpZ2h0ID0gKih1MTYgKikocGFyLT5sY2RfdGFibGUrMjcpOwoJCXBhbmVsX3R5cGUgPSAqKHUxNiAqKShwYXItPmxjZF90YWJsZSsyOSk7CgkJaWYgKHBhbmVsX3R5cGUgJiAxKQoJCQl0eHRjb2xvdXIgPSAiY29sb3VyIjsKCQllbHNlCgkJCXR4dGNvbG91ciA9ICJtb25vY2hyb21lIjsKCQlpZiAocGFuZWxfdHlwZSAmIDIpCgkJCXR4dGR1YWwgPSAiZHVhbCAoc3BsaXQpICI7CgkJZWxzZQoJCQl0eHRkdWFsID0gIiI7CgkJdGVjaCA9IChwYW5lbF90eXBlPj4yKSAmIDYzOwoJCXN3aXRjaCAodGVjaCkgewoJCWNhc2UgMDoKCQkJdHh0bW9uaXRvciA9ICJwYXNzaXZlIG1hdHJpeCI7CgkJCWJyZWFrOwoJCWNhc2UgMToKCQkJdHh0bW9uaXRvciA9ICJhY3RpdmUgbWF0cml4IjsKCQkJYnJlYWs7CgkJY2FzZSAyOgoJCQl0eHRtb25pdG9yID0gImFjdGl2ZSBhZGRyZXNzZWQgU1ROIjsKCQkJYnJlYWs7CgkJY2FzZSAzOgoJCQl0eHRtb25pdG9yID0gIkVMIjsKCQkJYnJlYWs7CgkJY2FzZSA0OgoJCQl0eHRtb25pdG9yID0gInBsYXNtYSI7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXR4dG1vbml0b3IgPSAidW5rbm93biI7CgkJfQoJCWZvcm1hdCA9ICoodTMyICopKHBhci0+bGNkX3RhYmxlKzU3KTsKCQlpZiAodGVjaCA9PSAwIHx8IHRlY2ggPT0gMikgewoJCQlzd2l0Y2ggKGZvcm1hdCAmIDcpIHsKCQkJY2FzZSAwOgoJCQkJdHh0Zm9ybWF0ID0gIjEyIGJpdCBpbnRlcmZhY2UiOwoJCQkJYnJlYWs7CgkJCWNhc2UgMToKCQkJCXR4dGZvcm1hdCA9ICIxNiBiaXQgaW50ZXJmYWNlIjsKCQkJCWJyZWFrOwoJCQljYXNlIDI6CgkJCQl0eHRmb3JtYXQgPSAiMjQgYml0IGludGVyZmFjZSI7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXR4dGZvcm1hdCA9ICJ1bmtvd24gZm9ybWF0IjsKCQkJfQoJCX0gZWxzZSB7CgkJCXN3aXRjaCAoZm9ybWF0ICYgNykgewoJCQljYXNlIDA6CgkJCQl0eHRmb3JtYXQgPSAiOCBjb2xvdXJzIjsKCQkJCWJyZWFrOwoJCQljYXNlIDE6CgkJCQl0eHRmb3JtYXQgPSAiNTEyIGNvbG91cnMiOwoJCQkJYnJlYWs7CgkJCWNhc2UgMjoKCQkJCXR4dGZvcm1hdCA9ICI0MDk2IGNvbG91cnMiOwoJCQkJYnJlYWs7CgkJCWNhc2UgNDoKCQkJCXR4dGZvcm1hdCA9ICIyNjIxNDQgY29sb3VycyAoTFQgbW9kZSkiOwoJCQkJYnJlYWs7CgkJCWNhc2UgNToKCQkJCXR4dGZvcm1hdCA9ICIxNjc3NzIxNiBjb2xvdXJzIjsKCQkJCWJyZWFrOwoJCQljYXNlIDY6CgkJCQl0eHRmb3JtYXQgPSAiMjYyMTQ0IGNvbG91cnMgKEZEUEktMiBtb2RlKSI7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXR4dGZvcm1hdCA9ICJ1bmtvd24gZm9ybWF0IjsKCQkJfQoJCX0KCQlQUklOVEtJKCIlcyVzICVzIG1vbml0b3IgZGV0ZWN0ZWQ6ICVzXG4iLAoJCQl0eHRkdWFsICx0eHRjb2xvdXIsIHR4dG1vbml0b3IsIG1vZGVsKTsKCQlQUklOVEtJKCIgICAgICAgaWQ9JWQsICVkeCVkIHBpeGVscywgJXNcbiIsCgkJCWlkLCB3aWR0aCwgaGVpZ2h0LCB0eHRmb3JtYXQpOwoJCXJlZnJlc2hfcmF0ZXNfYnVmWzBdID0gMDsKCQlyZWZyZXNoX3JhdGVzID0gKih1MTYgKikocGFyLT5sY2RfdGFibGUrNjIpOwoJCW0gPSAxOwoJCWYgPSAwOwoJCWZvciAoaT0wO2k8MTY7aSsrKSB7CgkJCWlmIChyZWZyZXNoX3JhdGVzICYgbSkgewoJCQkJaWYgKGYgPT0gMCkgewoJCQkJCXNwcmludGYoc3RyYnVmLCAiJWQiLCBsY2RfcmVmcmVzaF9yYXRlc1tpXSk7CgkJCQkJZisrOwoJCQkJfSBlbHNlIHsKCQkJCQlzcHJpbnRmKHN0cmJ1ZiwgIiwlZCIsIGxjZF9yZWZyZXNoX3JhdGVzW2ldKTsKCQkJCX0KCQkJCXN0cmNhdChyZWZyZXNoX3JhdGVzX2J1ZixzdHJidWYpOwoJCQl9CgkJCW0gPSBtIDw8IDE7CgkJfQoJCWRlZmF1bHRfcmVmcmVzaF9yYXRlID0gKCoodTggKikocGFyLT5sY2RfdGFibGUrNjEpICYgMHhmMCkgPj4gNDsKCQlQUklOVEtJKCIgICAgICAgc3VwcG9ydHMgcmVmcmVzaCByYXRlcyBbJXNdLCBkZWZhdWx0ICVkIEh6XG4iLAoJCQlyZWZyZXNoX3JhdGVzX2J1ZiwgbGNkX3JlZnJlc2hfcmF0ZXNbZGVmYXVsdF9yZWZyZXNoX3JhdGVdKTsKCQlwYXItPmxjZF9yZWZyZXNocmF0ZSA9IGxjZF9yZWZyZXNoX3JhdGVzW2RlZmF1bHRfcmVmcmVzaF9yYXRlXTsKCQkvKiBXZSBub3cgbmVlZCB0byBkZXRlcm1pbmUgdGhlIGNydGMgcGFyYW1ldGVycyBmb3IgdGhlCgkJICogTENEIG1vbml0b3IuIFRoaXMgaXMgdHJpY2t5LCBiZWNhdXNlIHRoZXkgYXJlIG5vdCBzdG9yZWQKCQkgKiBpbmRpdmlkdWFsbHkgaW4gdGhlIEJJT1MuIEluc3RlYWQsIHRoZSBCSU9TIGNvbnRhaW5zIGEKCQkgKiB0YWJsZSBvZiBkaXNwbGF5IG1vZGVzIHRoYXQgd29yayBmb3IgdGhpcyBtb25pdG9yLgoJCSAqCgkJICogVGhlIGlkZWEgaXMgdGhhdCB3ZSBzZWFyY2ggZm9yIGEgbW9kZSBvZiB0aGUgc2FtZSBkaW1lbnNpb25zCgkJICogYXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIExDRCBtb25pdG9yLiBTYXkgb3VyIExDRCBtb25pdG9yCgkJICogaXMgODAweDYwMCBwaXhlbHMsIHdlIHNlYXJjaCBmb3IgYSA4MDB4NjAwIG1vbml0b3IuCgkJICogVGhlIENSVEMgcGFyYW1ldGVycyB3ZSBmaW5kIGhlcmUgYXJlIHRoZSBvbmVzIHRoYXQgd2UgbmVlZAoJCSAqIHRvIHVzZSB0byBzaW11bGF0ZSBvdGhlciByZXNvbHV0aW9ucyBvbiB0aGUgTENEIHNjcmVlbi4KCQkgKi8KCQlsY2Rtb2RlcHRyID0gKHUxNiAqKShwYXItPmxjZF90YWJsZSArIDY0KTsKCQl3aGlsZSAoKmxjZG1vZGVwdHIgIT0gMCkgewoJCQl1MzIgbW9kZXB0cjsKCQkJdTE2IG13aWR0aCwgbWhlaWdodCwgbGNkX2hzeW5jX3N0YXJ0LCBsY2RfdnN5bmNfc3RhcnQ7CgkJCW1vZGVwdHIgPSBiaW9zX2Jhc2UgKyAqbGNkbW9kZXB0cjsKCgkJCW13aWR0aCA9ICooKHUxNiAqKShtb2RlcHRyKzApKTsKCQkJbWhlaWdodCA9ICooKHUxNiAqKShtb2RlcHRyKzIpKTsKCgkJCWlmIChtd2lkdGggPT0gd2lkdGggJiYgbWhlaWdodCA9PSBoZWlnaHQpIHsKCQkJCXBhci0+bGNkX3BpeGNsb2NrID0gMTAwMDAwMDAwIC8gKigodTE2ICopKG1vZGVwdHIrOSkpOwoJCQkJcGFyLT5sY2RfaHRvdGFsID0gKigodTE2ICopKG1vZGVwdHIrMTcpKSAmIDUxMTsKCQkJCXBhci0+bGNkX2hkaXNwID0gKigodTE2ICopKG1vZGVwdHIrMTkpKSAmIDUxMTsKCQkJCWxjZF9oc3luY19zdGFydCA9ICooKHUxNiAqKShtb2RlcHRyKzIxKSkgJiA1MTE7CgkJCQlwYXItPmxjZF9oc3luY19kbHkgPSAoKigodTE2ICopKG1vZGVwdHIrMjEpKSA+PiA5KSAmIDc7CgkJCQlwYXItPmxjZF9oc3luY19sZW4gPSAqKCh1OCAqKShtb2RlcHRyKzIzKSkgJiA2MzsKCgkJCQlwYXItPmxjZF92dG90YWwgPSAqKCh1MTYgKikobW9kZXB0cisyNCkpICYgMjA0NzsKCQkJCXBhci0+bGNkX3ZkaXNwID0gKigodTE2ICopKG1vZGVwdHIrMjYpKSAmIDIwNDc7CgkJCQlsY2RfdnN5bmNfc3RhcnQgPSAqKCh1MTYgKikobW9kZXB0cisyOCkpICYgMjA0NzsKCQkJCXBhci0+bGNkX3ZzeW5jX2xlbiA9ICgqKCh1MTYgKikobW9kZXB0cisyOCkpID4+IDExKSAmIDMxOwoKCQkJCXBhci0+bGNkX2h0b3RhbCA9IChwYXItPmxjZF9odG90YWwgKyAxKSAqIDg7CgkJCQlwYXItPmxjZF9oZGlzcCA9IChwYXItPmxjZF9oZGlzcCArIDEpICogODsKCQkJCWxjZF9oc3luY19zdGFydCA9IChsY2RfaHN5bmNfc3RhcnQgKyAxKSAqIDg7CgkJCQlwYXItPmxjZF9oc3luY19sZW4gPSBwYXItPmxjZF9oc3luY19sZW4gKiA4OwoKCQkJCXBhci0+bGNkX3Z0b3RhbCsrOwoJCQkJcGFyLT5sY2RfdmRpc3ArKzsKCQkJCWxjZF92c3luY19zdGFydCsrOwoKCQkJCXBhci0+bGNkX3JpZ2h0X21hcmdpbiA9IGxjZF9oc3luY19zdGFydCAtIHBhci0+bGNkX2hkaXNwOwoJCQkJcGFyLT5sY2RfbG93ZXJfbWFyZ2luID0gbGNkX3ZzeW5jX3N0YXJ0IC0gcGFyLT5sY2RfdmRpc3A7CgkJCQlwYXItPmxjZF9oYmxhbmtfbGVuID0gcGFyLT5sY2RfaHRvdGFsIC0gcGFyLT5sY2RfaGRpc3A7CgkJCQlwYXItPmxjZF92YmxhbmtfbGVuID0gcGFyLT5sY2RfdnRvdGFsIC0gcGFyLT5sY2RfdmRpc3A7CgkJCQlicmVhazsKCQkJfQoKCQkJbGNkbW9kZXB0cisrOwoJCX0KCQlpZiAoKmxjZG1vZGVwdHIgPT0gMCkgewoJCQlQUklOVEtFKCJMQ0QgbW9uaXRvciBDUlRDIHBhcmFtZXRlcnMgbm90IGZvdW5kISEhXG4iKTsKCQkJLyogVG8gZG86IFN3aXRjaCB0byBDUlQgaWYgcG9zc2libGUuICovCgkJfSBlbHNlIHsKCQkJUFJJTlRLSSgiICAgICAgIExDRCBDUlRDIHBhcmFtZXRlcnM6ICVkLiVkICAlZCAlZCAlZCAlZCAgJWQgJWQgJWQgJWRcbiIsCgkJCQkxMDAwMDAwIC8gcGFyLT5sY2RfcGl4Y2xvY2ssIDEwMDAwMDAgJSBwYXItPmxjZF9waXhjbG9jaywKCQkJCXBhci0+bGNkX2hkaXNwLAoJCQkJcGFyLT5sY2RfaGRpc3AgKyBwYXItPmxjZF9yaWdodF9tYXJnaW4sCgkJCQlwYXItPmxjZF9oZGlzcCArIHBhci0+bGNkX3JpZ2h0X21hcmdpbgoJCQkJCSsgcGFyLT5sY2RfaHN5bmNfZGx5ICsgcGFyLT5sY2RfaHN5bmNfbGVuLAoJCQkJcGFyLT5sY2RfaHRvdGFsLAoJCQkJcGFyLT5sY2RfdmRpc3AsCgkJCQlwYXItPmxjZF92ZGlzcCArIHBhci0+bGNkX2xvd2VyX21hcmdpbiwKCQkJCXBhci0+bGNkX3ZkaXNwICsgcGFyLT5sY2RfbG93ZXJfbWFyZ2luICsgcGFyLT5sY2RfdnN5bmNfbGVuLAoJCQkJcGFyLT5sY2RfdnRvdGFsKTsKCQkJUFJJTlRLSSgiICAgICAgICAgICAgICAgICAgICAgICAgICA6ICVkICVkICVkICVkICVkICVkICVkICVkICVkXG4iLAoJCQkJcGFyLT5sY2RfcGl4Y2xvY2ssCgkJCQlwYXItPmxjZF9oYmxhbmtfbGVuIC0gKHBhci0+bGNkX3JpZ2h0X21hcmdpbiArCgkJCQkJcGFyLT5sY2RfaHN5bmNfZGx5ICsgcGFyLT5sY2RfaHN5bmNfbGVuKSwKCQkJCXBhci0+bGNkX2hkaXNwLAoJCQkJcGFyLT5sY2RfcmlnaHRfbWFyZ2luLAoJCQkJcGFyLT5sY2RfaHN5bmNfbGVuLAoJCQkJcGFyLT5sY2RfdmJsYW5rX2xlbiAtIChwYXItPmxjZF9sb3dlcl9tYXJnaW4gKyBwYXItPmxjZF92c3luY19sZW4pLAoJCQkJcGFyLT5sY2RfdmRpc3AsCgkJCQlwYXItPmxjZF9sb3dlcl9tYXJnaW4sCgkJCQlwYXItPmxjZF92c3luY19sZW4pOwoJCX0KCX0KfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCAqLwoKc3RhdGljIGludCBfX2RldmluaXQgaW5pdF9mcm9tX2Jpb3Moc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7Cgl1MzIgYmlvc19iYXNlLCByb21fYWRkcjsKCWludCByZXQ7CgoJcm9tX2FkZHIgPSAweGMwMDAwICsgKChhdHlfbGRfbGUzMihTQ1JBVENIX1JFRzEsIHBhcikgJiAweDdmKSA8PCAxMSk7CgliaW9zX2Jhc2UgPSAodW5zaWduZWQgbG9uZylpb3JlbWFwKHJvbV9hZGRyLCAweDEwMDAwKTsKCgkvKiBUaGUgQklPUyBzdGFydHMgd2l0aCAweGFhNTUuICovCglpZiAoKigodTE2ICopYmlvc19iYXNlKSA9PSAweGFhNTUpIHsKCgkJdTggKmJpb3NfcHRyOwoJCXUxNiByb21fdGFibGVfb2Zmc2V0LCBmcmVxX3RhYmxlX29mZnNldDsKCQlQTExfQkxPQ0tfTUFDSDY0IHBsbF9ibG9jazsKCgkJUFJJTlRLSSgiTWFjaDY0IEJJT1MgaXMgbG9jYXRlZCBhdCAleCwgbWFwcGVkIGF0ICV4LlxuIiwgcm9tX2FkZHIsIGJpb3NfYmFzZSk7CgoJCS8qIGNoZWNrIGZvciBmcmVxdW5jeSB0YWJsZSAqLwoJCWJpb3NfcHRyID0gKHU4KiliaW9zX2Jhc2U7CgkJcm9tX3RhYmxlX29mZnNldCA9ICh1MTYpKGJpb3NfcHRyWzB4NDhdIHwgKGJpb3NfcHRyWzB4NDldIDw8IDgpKTsKCQlmcmVxX3RhYmxlX29mZnNldCA9IGJpb3NfcHRyW3JvbV90YWJsZV9vZmZzZXQgKyAxNl0gfCAoYmlvc19wdHJbcm9tX3RhYmxlX29mZnNldCArIDE3XSA8PCA4KTsKCQltZW1jcHkoJnBsbF9ibG9jaywgYmlvc19wdHIgKyBmcmVxX3RhYmxlX29mZnNldCwgc2l6ZW9mKFBMTF9CTE9DS19NQUNINjQpKTsKCgkJUFJJTlRLSSgiQklPUyBmcmVxdWVuY3kgdGFibGU6XG4iKTsKCQlQUklOVEtJKCJQQ0xLX21pbl9mcmVxICVkLCBQQ0xLX21heF9mcmVxICVkLCByZWZfZnJlcSAlZCwgcmVmX2RpdmlkZXIgJWRcbiIsCgkJCXBsbF9ibG9jay5QQ0xLX21pbl9mcmVxLCBwbGxfYmxvY2suUENMS19tYXhfZnJlcSwKCQkJcGxsX2Jsb2NrLnJlZl9mcmVxLCBwbGxfYmxvY2sucmVmX2RpdmlkZXIpOwoJCVBSSU5US0koIk1DTEtfcHdkICVkLCBNQ0xLX21heF9mcmVxICVkLCBYQ0xLX21heF9mcmVxICVkLCBTQ0xLX2ZyZXEgJWRcbiIsCgkJCXBsbF9ibG9jay5NQ0xLX3B3ZCwgcGxsX2Jsb2NrLk1DTEtfbWF4X2ZyZXEsCgkJCXBsbF9ibG9jay5YQ0xLX21heF9mcmVxLCBwbGxfYmxvY2suU0NMS19mcmVxKTsKCgkJcGFyLT5wbGxfbGltaXRzLnBsbF9taW4gPSBwbGxfYmxvY2suUENMS19taW5fZnJlcS8xMDA7CgkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSBwbGxfYmxvY2suUENMS19tYXhfZnJlcS8xMDA7CgkJcGFyLT5wbGxfbGltaXRzLnJlZl9jbGsgPSBwbGxfYmxvY2sucmVmX2ZyZXEvMTAwOwoJCXBhci0+cGxsX2xpbWl0cy5yZWZfZGl2ID0gcGxsX2Jsb2NrLnJlZl9kaXZpZGVyOwoJCXBhci0+cGxsX2xpbWl0cy5zY2xrID0gcGxsX2Jsb2NrLlNDTEtfZnJlcS8xMDA7CgkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSBwbGxfYmxvY2suTUNMS19tYXhfZnJlcS8xMDA7CgkJcGFyLT5wbGxfbGltaXRzLm1jbGtfcG0gPSBwbGxfYmxvY2suTUNMS19wd2QvMTAwOwoJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gcGxsX2Jsb2NrLlhDTEtfbWF4X2ZyZXEvMTAwOwojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJCWF0eV9pbml0X2xjZChwYXIsIGJpb3NfYmFzZSk7CiNlbmRpZgoJCXJldCA9IDA7Cgl9IGVsc2UgewoJCVBSSU5US0UoIm5vIEJJT1MgZnJlcXVlbmN5IHRhYmxlIGZvdW5kLCB1c2UgcGFyYW1ldGVyc1xuIik7CgkJcmV0ID0gLUVOWElPOwoJfQoJaW91bm1hcCgodm9pZCogX19pb21lbSApYmlvc19iYXNlKTsKCglyZXR1cm4gcmV0Owp9CiNlbmRpZiAvKiBfX2kzODZfXyAqLwoKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfc2V0dXBfZ2VuZXJpYyhzdHJ1Y3QgcGNpX2RldiAqcGRldiwgc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGxvbmcgYWRkcikKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwoJdTE2IHRtcDsKCXVuc2lnbmVkIGxvbmcgcmFkZHI7CglzdHJ1Y3QgcmVzb3VyY2UgKnJycDsKCWludCByZXQgPSAwOwoKCXJhZGRyID0gYWRkciArIDB4N2ZmMDAwVUw7CglycnAgPSAmcGRldi0+cmVzb3VyY2VbMl07CglpZiAoKHJycC0+ZmxhZ3MgJiBJT1JFU09VUkNFX01FTSkgJiYgcmVxdWVzdF9tZW1fcmVnaW9uKHJycC0+c3RhcnQsIHJycC0+ZW5kIC0gcnJwLT5zdGFydCArIDEsICJhdHlmYiIpKSB7CgkJcGFyLT5hdXhfc3RhcnQgPSBycnAtPnN0YXJ0OwoJCXBhci0+YXV4X3NpemUgPSBycnAtPmVuZCAtIHJycC0+c3RhcnQgKyAxOwoJCXJhZGRyID0gcnJwLT5zdGFydDsKCQlQUklOVEtJKCJ1c2luZyBhdXhpbGlhcnkgcmVnaXN0ZXIgYXBlcnR1cmVcbiIpOwoJfQoKCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gcmFkZHI7CglwYXItPmF0aV9yZWdiYXNlID0gaW9yZW1hcChpbmZvLT5maXgubW1pb19zdGFydCwgMHgxMDAwKTsKCWlmIChwYXItPmF0aV9yZWdiYXNlID09IDApCgkJcmV0dXJuIC1FTk9NRU07CgoJaW5mby0+Zml4Lm1taW9fc3RhcnQgKz0gcGFyLT5hdXhfc3RhcnQgPyAweDQwMCA6IDB4YzAwOwoJcGFyLT5hdGlfcmVnYmFzZSArPSBwYXItPmF1eF9zdGFydCA/IDB4NDAwIDogMHhjMDA7CgoJLyoKCSAqIEVuYWJsZSBtZW1vcnktc3BhY2UgYWNjZXNzZXMgdXNpbmcgY29uZmlnLXNwYWNlCgkgKiBjb21tYW5kIHJlZ2lzdGVyLgoJICovCglwY2lfcmVhZF9jb25maWdfd29yZChwZGV2LCBQQ0lfQ09NTUFORCwgJnRtcCk7CglpZiAoISh0bXAgJiBQQ0lfQ09NTUFORF9NRU1PUlkpKSB7CgkJdG1wIHw9IFBDSV9DT01NQU5EX01FTU9SWTsKCQlwY2lfd3JpdGVfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsIHRtcCk7Cgl9CiNpZmRlZiBfX0JJR19FTkRJQU4KCS8qIFVzZSB0aGUgYmlnLWVuZGlhbiBhcGVydHVyZSAqLwoJYWRkciArPSAweDgwMDAwMDsKI2VuZGlmCgoJLyogTWFwIGluIGZyYW1lIGJ1ZmZlciAqLwoJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBhZGRyOwoJaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKGFkZHIsIDB4ODAwMDAwKTsKCWlmIChpbmZvLT5zY3JlZW5fYmFzZSA9PSBOVUxMKSB7CgkJcmV0ID0gLUVOT01FTTsKCQlnb3RvIGF0eWZiX3NldHVwX2dlbmVyaWNfZmFpbDsKCX0KCglpZigocmV0ID0gY29ycmVjdF9jaGlwc2V0KHBhcikpKQoJCWdvdG8gYXR5ZmJfc2V0dXBfZ2VuZXJpY19mYWlsOwojaWZkZWYgX19pMzg2X18KCWlmKChyZXQgPSBpbml0X2Zyb21fYmlvcyhwYXIpKSkKCQlnb3RvIGF0eWZiX3NldHVwX2dlbmVyaWNfZmFpbDsKI2VuZGlmCglpZiAoIShhdHlfbGRfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXIpICYgQ1JUQ19FWFRfRElTUF9FTikpCgkJcGFyLT5jbGtfd3Jfb2Zmc2V0ID0gKGluYihSX0dFTk1PKSAmIDB4MENVKSA+PiAyOwoJZWxzZQoJCXBhci0+Y2xrX3dyX29mZnNldCA9IGF0eV9sZF84KENMT0NLX0NOVEwsIHBhcikgJiAweDAzVTsKCgkvKiBhY2NvcmRpbmcgdG8gQVRJLCB3ZSBzaG91bGQgdXNlIGNsb2NrIDMgZm9yIGFjZWxlcmF0ZWQgbW9kZSAqLwoJcGFyLT5jbGtfd3Jfb2Zmc2V0ID0gMzsKCglyZXR1cm4gMDsKCmF0eWZiX3NldHVwX2dlbmVyaWNfZmFpbDoKCWlvdW5tYXAocGFyLT5hdGlfcmVnYmFzZSk7CglwYXItPmF0aV9yZWdiYXNlID0gTlVMTDsKCXJldHVybiByZXQ7Cn0KCiNlbmRpZiAvKiAhX19zcGFyY19fICovCgpzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlmYl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCnsKCXVuc2lnbmVkIGxvbmcgYWRkciwgcmVzX3N0YXJ0LCByZXNfc2l6ZTsKCXN0cnVjdCBmYl9pbmZvICppbmZvOwoJc3RydWN0IHJlc291cmNlICpycDsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhcjsKCWludCBpLCByYyA9IC1FTk9NRU07CgoJZm9yIChpID0gQVJSQVlfU0laRShhdHlfY2hpcHMpIC0gMTsgaSA+PSAwOyBpLS0pCgkJaWYgKHBkZXYtPmRldmljZSA9PSBhdHlfY2hpcHNbaV0ucGNpX2lkKQoJCQlicmVhazsKCglpZiAoaSA8IDApCgkJcmV0dXJuIC1FTk9ERVY7CgoJLyogRW5hYmxlIGRldmljZSBpbiBQQ0kgY29uZmlnICovCglpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKCQlQUklOVEtFKCJDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIpOwoJCXJldHVybiAtRU5YSU87Cgl9CgoJLyogRmluZCB3aGljaCByZXNvdXJjZSB0byB1c2UgKi8KCXJwID0gJnBkZXYtPnJlc291cmNlWzBdOwoJaWYgKHJwLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCgkJcnAgPSAmcGRldi0+cmVzb3VyY2VbMV07CglhZGRyID0gcnAtPnN0YXJ0OwoJaWYgKCFhZGRyKQoJCXJldHVybiAtRU5YSU87CgoJLyogUmVzZXJ2ZSBzcGFjZSAqLwoJcmVzX3N0YXJ0ID0gcnAtPnN0YXJ0OwoJcmVzX3NpemUgPSBycC0+ZW5kIC0gcnAtPnN0YXJ0ICsgMTsKCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uIChyZXNfc3RhcnQsIHJlc19zaXplLCAiYXR5ZmIiKSkKCQlyZXR1cm4gLUVCVVNZOwoKICAgICAgICAvKiBBbGxvY2F0ZSBmcmFtZWJ1ZmZlciAqLwoJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgYXR5ZmJfcGFyKSwgJnBkZXYtPmRldik7CglpZiAoIWluZm8pIHsKCQlQUklOVEtFKCJhdHlmYl9wY2lfcHJvYmUoKSBjYW4ndCBhbGxvYyBmYl9pbmZvXG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCXBhciA9IGluZm8tPnBhcjsKCWluZm8tPmZpeCA9IGF0eWZiX2ZpeDsKCWluZm8tPmRldmljZSA9ICZwZGV2LT5kZXY7CglwYXItPnBjaV9pZCA9IGF0eV9jaGlwc1tpXS5wY2lfaWQ7CglwYXItPnJlc19zdGFydCA9IHJlc19zdGFydDsKCXBhci0+cmVzX3NpemUgPSByZXNfc2l6ZTsKCXBhci0+aXJxID0gcGRldi0+aXJxOwoJcGFyLT5wZGV2ID0gcGRldjsKCgkvKiBTZXR1cCAiaW5mbyIgc3RydWN0dXJlICovCiNpZmRlZiBfX3NwYXJjX18KCXJjID0gYXR5ZmJfc2V0dXBfc3BhcmMocGRldiwgaW5mbywgYWRkcik7CiNlbHNlCglyYyA9IGF0eWZiX3NldHVwX2dlbmVyaWMocGRldiwgaW5mbywgYWRkcik7CiNlbmRpZgoJaWYgKHJjKQoJCWdvdG8gZXJyX3JlbGVhc2VfbWVtOwoKCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKCgkvKiBJbml0IGNoaXAgJiByZWdpc3RlciBmcmFtZWJ1ZmZlciAqLwoJaWYgKGF0eV9pbml0KGluZm8sICJQQ0kiKSkKCQlnb3RvIGVycl9yZWxlYXNlX2lvOwoKI2lmZGVmIF9fc3BhcmNfXwoJaWYgKCFwcm9tX3BhbGV0dGUpCgkJcHJvbV9wYWxldHRlID0gYXR5ZmJfcGFsZXR0ZTsKCgkvKgoJICogQWRkIC9kZXYvZmIgbW1hcCB2YWx1ZXMuCgkgKi8KCXBhci0+bW1hcF9tYXBbMF0udm9mZiA9IDB4ODAwMDAwMDAwMDAwMDAwMFVMOwoJcGFyLT5tbWFwX21hcFswXS5wb2ZmID0gKHVuc2lnbmVkIGxvbmcpIGluZm8tPnNjcmVlbl9iYXNlICYgUEFHRV9NQVNLOwoJcGFyLT5tbWFwX21hcFswXS5zaXplID0gaW5mby0+Zml4LnNtZW1fbGVuOwoJcGFyLT5tbWFwX21hcFswXS5wcm90X21hc2sgPSBfUEFHRV9DQUNIRTsKCXBhci0+bW1hcF9tYXBbMF0ucHJvdF9mbGFnID0gX1BBR0VfRTsKCXBhci0+bW1hcF9tYXBbMV0udm9mZiA9IHBhci0+bW1hcF9tYXBbMF0udm9mZiArIGluZm8tPmZpeC5zbWVtX2xlbjsKCXBhci0+bW1hcF9tYXBbMV0ucG9mZiA9IChsb25nKXBhci0+YXRpX3JlZ2Jhc2UgJiBQQUdFX01BU0s7CglwYXItPm1tYXBfbWFwWzFdLnNpemUgPSBQQUdFX1NJWkU7CglwYXItPm1tYXBfbWFwWzFdLnByb3RfbWFzayA9IF9QQUdFX0NBQ0hFOwoJcGFyLT5tbWFwX21hcFsxXS5wcm90X2ZsYWcgPSBfUEFHRV9FOwojZW5kaWYgLyogX19zcGFyY19fICovCgoJcmV0dXJuIDA7CgplcnJfcmVsZWFzZV9pbzoKI2lmZGVmIF9fc3BhcmNfXwoJa2ZyZWUocGFyLT5tbWFwX21hcCk7CiNlbHNlCglpZiAocGFyLT5hdGlfcmVnYmFzZSkKCQlpb3VubWFwKHBhci0+YXRpX3JlZ2Jhc2UpOwoJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQoJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwojZW5kaWYKZXJyX3JlbGVhc2VfbWVtOgoJaWYgKHBhci0+YXV4X3N0YXJ0KQoJCXJlbGVhc2VfbWVtX3JlZ2lvbihwYXItPmF1eF9zdGFydCwgcGFyLT5hdXhfc2l6ZSk7CgoJcmVsZWFzZV9tZW1fcmVnaW9uKHBhci0+cmVzX3N0YXJ0LCBwYXItPnJlc19zaXplKTsKCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CgoJcmV0dXJuIHJjOwp9CgojZW5kaWYgLyogQ09ORklHX1BDSSAqLwoKI2lmZGVmIENPTkZJR19BVEFSSQoKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfYXRhcmlfcHJvYmUodm9pZCkKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyOwoJc3RydWN0IGZiX2luZm8gKmluZm87CglpbnQgbTY0X251bTsKCXUzMiBjbG9ja19yOwoKCWZvciAobTY0X251bSA9IDA7IG02NF9udW0gPCBtYWNoNjRfY291bnQ7IG02NF9udW0rKykgewoJCWlmICghcGh5c192bWVtYmFzZVttNjRfbnVtXSB8fCAhcGh5c19zaXplW202NF9udW1dIHx8CgkJICAgICFwaHlzX2d1aXJlZ2Jhc2VbbTY0X251bV0pIHsKCQkgICAgUFJJTlRLSSgicGh5c18qWyVkXSBwYXJhbWV0ZXJzIG5vdCBzZXQgPT4gcmV0dXJuaW5nIGVhcmx5LiBcbiIsIG02NF9udW0pOwoJCQljb250aW51ZTsKCQl9CgoJCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGF0eWZiX3BhciksIE5VTEwpOwoJCWlmICghaW5mbykgewoJCQlQUklOVEtFKCJhdHlmYl9hdGFyaV9wcm9iZSgpIGNhbid0IGFsbG9jIGZiX2luZm9cbiIpOwoJCQlyZXR1cm4gLUVOT01FTTsKCQl9CgkJcGFyID0gaW5mby0+cGFyOwoKCQlpbmZvLT5maXggPSBhdHlmYl9maXg7CgoJCXBhci0+aXJxID0gKHVuc2lnbmVkIGludCkgLTE7IC8qIHNvbWV0aGluZyBpbnZhbGlkICovCgoJCS8qCgkJICogIE1hcCB0aGUgdmlkZW8gbWVtb3J5IChwaHlzaWNhbCBhZGRyZXNzIGdpdmVuKSB0byBzb21ld2hlcmUgaW4gdGhlCgkJICogIGtlcm5lbCBhZGRyZXNzIHNwYWNlLgoJCSAqLwoJCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcChwaHlzX3ZtZW1iYXNlW202NF9udW1dLCBwaHlzX3NpemVbbTY0X251bV0pOwoJCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpaW5mby0+c2NyZWVuX2Jhc2U7IC8qIEZha2UhICovCgkJcGFyLT5hdGlfcmVnYmFzZSA9IGlvcmVtYXAocGh5c19ndWlyZWdiYXNlW202NF9udW1dLCAweDEwMDAwKSArCgkJCQkJCTB4RkMwMHVsOwoJCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gKHVuc2lnbmVkIGxvbmcpcGFyLT5hdGlfcmVnYmFzZTsgLyogRmFrZSEgKi8KCgkJYXR5X3N0X2xlMzIoQ0xPQ0tfQ05UTCwgMHgxMjM0NTY3OCwgcGFyKTsKCQljbG9ja19yID0gYXR5X2xkX2xlMzIoQ0xPQ0tfQ05UTCwgcGFyKTsKCgkJc3dpdGNoIChjbG9ja19yICYgMHgwMDNGKSB7CgkJY2FzZSAweDEyOgoJCQlwYXItPmNsa193cl9vZmZzZXQgPSAzOyAvKiAgKi8KCQkJYnJlYWs7CgkJY2FzZSAweDM0OgoJCQlwYXItPmNsa193cl9vZmZzZXQgPSAyOyAvKiBNZWR1c2EgU1QtSU8gSVNBIEFkYXB0ZXIgZXRjLiAqLwoJCQlicmVhazsKCQljYXNlIDB4MTY6CgkJCXBhci0+Y2xrX3dyX29mZnNldCA9IDE7IC8qICAqLwoJCQlicmVhazsKCQljYXNlIDB4Mzg6CgkJCXBhci0+Y2xrX3dyX29mZnNldCA9IDA7IC8qIFBhbnRoZXIgMSBJU0EgQWRhcHRlciAoR2VyYWxkKSAqLwoJCQlicmVhazsKCQl9CgoJCWlmIChhdHlfaW5pdChpbmZvLCAiSVNBIGJ1cyIpKSB7CgkJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CgkJCS8qIFRoaXMgaXMgaW5zdWZmaWNpZW50ISBrZXJuZWxfbWFwIGhhcyBhZGRlZCB0d28gbGFyZ2UgY2h1bmtzISEgKi8KCQkJcmV0dXJuIC1FTlhJTzsKCQl9Cgl9Cn0KCiNlbmRpZiAvKiBDT05GSUdfQVRBUkkgKi8KCnN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhdHlmYl9yZW1vdmUoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCgkvKiByZXN0b3JlIHZpZGVvIG1vZGUgKi8KCWF0eV9zZXRfY3J0YyhwYXIsICZzYXZlZF9jcnRjKTsKCXBhci0+cGxsX29wcy0+c2V0X3BsbChpbmZvLCAmc2F2ZWRfcGxsKTsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVAoJaWYgKE02NF9IQVMoTU9CSUxfQlVTKSkKCQlhdHlfYmxfZXhpdChwYXIpOwojZW5kaWYKCgl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwoKI2lmZGVmIENPTkZJR19NVFJSCglpZiAocGFyLT5tdHJyX3JlZyA+PSAwKSB7CgkgICAgbXRycl9kZWwocGFyLT5tdHJyX3JlZywgMCwgMCk7CgkgICAgcGFyLT5tdHJyX3JlZyA9IC0xOwoJfQoJaWYgKHBhci0+bXRycl9hcGVyID49IDApIHsKCSAgICBtdHJyX2RlbChwYXItPm10cnJfYXBlciwgMCwgMCk7CgkgICAgcGFyLT5tdHJyX2FwZXIgPSAtMTsKCX0KI2VuZGlmCiNpZm5kZWYgX19zcGFyY19fCglpZiAocGFyLT5hdGlfcmVnYmFzZSkKCQlpb3VubWFwKHBhci0+YXRpX3JlZ2Jhc2UpOwoJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQoJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwojaWZkZWYgX19CSUdfRU5ESUFOCglpZiAoaW5mby0+c3ByaXRlLmFkZHIpCgkJaW91bm1hcChpbmZvLT5zcHJpdGUuYWRkcik7CiNlbmRpZgojZW5kaWYKI2lmZGVmIF9fc3BhcmNfXwoJa2ZyZWUocGFyLT5tbWFwX21hcCk7CiNlbmRpZgoJaWYgKHBhci0+YXV4X3N0YXJ0KQoJCXJlbGVhc2VfbWVtX3JlZ2lvbihwYXItPmF1eF9zdGFydCwgcGFyLT5hdXhfc2l6ZSk7CgoJaWYgKHBhci0+cmVzX3N0YXJ0KQoJCXJlbGVhc2VfbWVtX3JlZ2lvbihwYXItPnJlc19zdGFydCwgcGFyLT5yZXNfc2l6ZSk7CgoJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKfQoKI2lmZGVmIENPTkZJR19QQ0kKCnN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhdHlmYl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKCglhdHlmYl9yZW1vdmUoaW5mbyk7Cn0KCi8qCiAqIFRoaXMgZHJpdmVyIHVzZXMgaXRzIG93biBtYXRjaGluZyB0YWJsZS4gVGhhdCB3aWxsIGJlIG1vcmUgZGlmZmljdWx0CiAqIHRvIGZpeCwgc28gZm9yIG5vdywgd2UganVzdCBtYXRjaCBhZ2FpbnN0IGFueSBBVEkgSUQgYW5kIGxldCB0aGUKICogcHJvYmUoKSBmdW5jdGlvbiBmaW5kIG91dCB3aGF0J3MgdXAuIFRoYXQgYWxzbyBtZWFuIHdlIGRvbid0IGhhdmUKICogYSBtb2R1bGUgSUQgdGFibGUgdGhvdWdoLgogKi8Kc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGF0eWZiX3BjaV90YmxbXSA9IHsKCXsgUENJX1ZFTkRPUl9JRF9BVEksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCgkgIFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkgPDwgMTYsIDB4ZmYwMDAwLCAwIH0sCgl7IDAsIH0KfTsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhdHlmYl9kcml2ZXIgPSB7CgkubmFtZQkJPSAiYXR5ZmIiLAoJLmlkX3RhYmxlCT0gYXR5ZmJfcGNpX3RibCwKCS5wcm9iZQkJPSBhdHlmYl9wY2lfcHJvYmUsCgkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF0eWZiX3BjaV9yZW1vdmUpLAojaWZkZWYgQ09ORklHX1BNCgkuc3VzcGVuZAk9IGF0eWZiX3BjaV9zdXNwZW5kLAoJLnJlc3VtZQkJPSBhdHlmYl9wY2lfcmVzdW1lLAojZW5kaWYgLyogQ09ORklHX1BNICovCn07CgojZW5kaWYgLyogQ09ORklHX1BDSSAqLwoKI2lmbmRlZiBNT0RVTEUKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKewoJY2hhciAqdGhpc19vcHQ7CgoJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKCQlyZXR1cm4gMDsKCgl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CgkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibm9hY2NlbCIsIDcpKSB7CgkJCW5vYWNjZWwgPSAxOwojaWZkZWYgQ09ORklHX01UUlIKCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibm9tdHJyIiwgNikpIHsKCQkJbm9tdHJyID0gMTsKI2VuZGlmCgkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZyYW06IiwgNSkpCgkJCXZyYW0gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsIE5VTEwsIDApOwoJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAicGxsOiIsIDQpKQoJCQlwbGwgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDQsIE5VTEwsIDApOwoJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibWNsazoiLCA1KSkKCQkJbWNsayA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7CgkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ4Y2xrOiIsIDUpKQoJCQl4Y2xrID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNSwgTlVMTCwgMCk7CgkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJjb21wX3N5bmM6IiwgMTApKQoJCQljb21wX3N5bmMgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCsxMCwgTlVMTCwgMCk7CiNpZmRlZiBDT05GSUdfUFBDCgkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2bW9kZToiLCA2KSkgewoJCQl1bnNpZ25lZCBpbnQgdm1vZGUgPQoJCQkgICAgc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA2LCBOVUxMLCAwKTsKCQkJaWYgKHZtb2RlID4gMCAmJiB2bW9kZSA8PSBWTU9ERV9NQVgpCgkJCQlkZWZhdWx0X3Ztb2RlID0gdm1vZGU7CgkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImNtb2RlOiIsIDYpKSB7CgkJCXVuc2lnbmVkIGludCBjbW9kZSA9CgkJCSAgICBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDYsIE5VTEwsIDApOwoJCQlzd2l0Y2ggKGNtb2RlKSB7CgkJCWNhc2UgMDoKCQkJY2FzZSA4OgoJCQkJZGVmYXVsdF9jbW9kZSA9IENNT0RFXzg7CgkJCQlicmVhazsKCQkJY2FzZSAxNToKCQkJY2FzZSAxNjoKCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV8xNjsKCQkJCWJyZWFrOwoJCQljYXNlIDI0OgoJCQljYXNlIDMyOgoJCQkJZGVmYXVsdF9jbW9kZSA9IENNT0RFXzMyOwoJCQkJYnJlYWs7CgkJCX0KCQl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FUQVJJCgkJLyoKCQkgKiBXaHkgZG8gd2UgbmVlZCB0aGlzIHNpbGx5IE1hY2g2NCBhcmd1bWVudD8KCQkgKiBXZSBhcmUgYWxyZWFkeSBoZXJlIGJlY2F1c2Ugb2YgbWFjaDY0PSBzbyBpdHMgcmVkdW5kYW50LgoJCSAqLwoJCWVsc2UgaWYgKE1BQ0hfSVNfQVRBUkkKCQkJICYmICghc3RybmNtcCh0aGlzX29wdCwgIk1hY2g2NDoiLCA3KSkpIHsKCQkJc3RhdGljIHVuc2lnbmVkIGNoYXIgbTY0X251bTsKCQkJc3RhdGljIGNoYXIgbWFjaDY0X3N0cls4MF07CgkJCXN0cmxjcHkobWFjaDY0X3N0ciwgdGhpc19vcHQgKyA3LCBzaXplb2YobWFjaDY0X3N0cikpOwoJCQlpZiAoIXN0b3JlX3ZpZGVvX3BhcihtYWNoNjRfc3RyLCBtNjRfbnVtKSkgewoJCQkJbTY0X251bSsrOwoJCQkJbWFjaDY0X2NvdW50ID0gbTY0X251bTsKCQkJfQoJCX0KI2VuZGlmCgkJZWxzZQoJCQltb2RlID0gdGhpc19vcHQ7Cgl9CglyZXR1cm4gMDsKfQojZW5kaWYgIC8qICBNT0RVTEUgICovCgpzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlmYl9pbml0KHZvaWQpCnsKICAgIGludCBlcnIxID0gMSwgZXJyMiA9IDE7CiNpZm5kZWYgTU9EVUxFCiAgICBjaGFyICpvcHRpb24gPSBOVUxMOwoKICAgIGlmIChmYl9nZXRfb3B0aW9ucygiYXR5ZmIiLCAmb3B0aW9uKSkKCXJldHVybiAtRU5PREVWOwogICAgYXR5ZmJfc2V0dXAob3B0aW9uKTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX1BDSQogICAgZXJyMSA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmF0eWZiX2RyaXZlcik7CiNlbmRpZgojaWZkZWYgQ09ORklHX0FUQVJJCiAgICBlcnIyID0gYXR5ZmJfYXRhcmlfcHJvYmUoKTsKI2VuZGlmCgogICAgcmV0dXJuIChlcnIxICYmIGVycjIpID8gLUVOT0RFViA6IDA7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBhdHlmYl9leGl0KHZvaWQpCnsKI2lmZGVmIENPTkZJR19QQ0kKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYXR5ZmJfZHJpdmVyKTsKI2VuZGlmCn0KCm1vZHVsZV9pbml0KGF0eWZiX2luaXQpOwptb2R1bGVfZXhpdChhdHlmYl9leGl0KTsKCk1PRFVMRV9ERVNDUklQVElPTigiRkJEZXYgZHJpdmVyIGZvciBBVEkgTWFjaDY0IGNhcmRzIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKbW9kdWxlX3BhcmFtKG5vYWNjZWwsIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vYWNjZWwsICJib29sOiBkaXNhYmxlIGFjY2VsZXJhdGlvbiIpOwptb2R1bGVfcGFyYW0odnJhbSwgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh2cmFtLCAiaW50OiBvdmVycmlkZSBzaXplIG9mIHZpZGVvIHJhbSIpOwptb2R1bGVfcGFyYW0ocGxsLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHBsbCwgImludDogb3ZlcnJpZGUgdmlkZW8gY2xvY2siKTsKbW9kdWxlX3BhcmFtKG1jbGssIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MobWNsaywgImludDogb3ZlcnJpZGUgbWVtb3J5IGNsb2NrIik7Cm1vZHVsZV9wYXJhbSh4Y2xrLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHhjbGssICJpbnQ6IG92ZXJyaWRlIGFjY2VsZXJhdGVkIGVuZ2luZSBjbG9jayIpOwptb2R1bGVfcGFyYW0oY29tcF9zeW5jLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGNvbXBfc3luYywKCQkgIlNldCBjb21wb3NpdGUgc3luYyBzaWduYWwgdG8gbG93ICgwKSBvciBoaWdoICgxKSIpOwptb2R1bGVfcGFyYW0obW9kZSwgY2hhcnAsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1vZGUsICJTcGVjaWZ5IHJlc29sdXRpb24gYXMgXCI8eHJlcz54PHlyZXM+Wy08YnBwPl1bQDxyZWZyZXNoPl1cIiAiKTsKI2lmZGVmIENPTkZJR19NVFJSCm1vZHVsZV9wYXJhbShub210cnIsIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vbXRyciwgImJvb2w6IGRpc2FibGUgdXNlIG9mIE1UUlIgcmVnaXN0ZXJzIik7CiNlbmRpZgo=