LyoKICogIEFUSSBGcmFtZSBCdWZmZXIgRGV2aWNlIERyaXZlciBDb3JlCiAqCiAqCUNvcHlyaWdodCAoQykgMjAwNCAgQWxleCBLZXJuIDxhbGV4Lmtlcm5AZ214LmRlPgogKglDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSAgR2VlcnQgVXl0dGVyaG9ldmVuCiAqCUNvcHlyaWdodCAoQykgMTk5OCAgQmVybmQgSGFycmllcwogKglDb3B5cmlnaHQgKEMpIDE5OTggIEVkZGllIEMuIERvc3QgIChlY2RAc2t5bmV0LmJlKQogKgogKiAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBVEkgZ3JhcGhpY3MgY2hpcHM6CiAqICAgIC0gQVRJIE1hY2g2NAogKgogKiAgVG8gZG86IGFkZCBzdXBwb3J0IGZvcgogKiAgICAtIEFUSSBSYWdlMTI4IChmcm9tIGF0eTEyOGZiLmMpCiAqICAgIC0gQVRJIFJhZGVvbiAoZnJvbSByYWRlb25mYi5jKQogKgogKiAgVGhpcyBkcml2ZXIgaXMgcGFydGx5IGJhc2VkIG9uIHRoZSBQb3dlck1hYyBjb25zb2xlIGRyaXZlcjoKICoKICoJQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCiAqCiAqICBhbmQgb24gdGhlIFBvd2VyTWFjIEFUSS9tYWNoNjQgZGlzcGxheSBkcml2ZXI6CiAqCiAqCUNvcHlyaWdodCAoQykgMTk5NyBNaWNoYWVsIEFLIFRlc2NoCiAqCiAqCSAgICAgIHdpdGggd29yayBieSBKb24gSG93ZWxsCiAqCQkJICAgSGFycnkgQUMgRWF0b24KICoJCQkgICBBbnRob255IFRvbmcgPGF0b25nQHVpdWMuZWR1PgogKgogKiAgR2VuZXJpYyBMQ0Qgc3VwcG9ydCB3cml0dGVuIGJ5IERhbmllbCBNYW50aW9uZSwgcG9ydGVkIGZyb20gMi40LjIwIGJ5IEFsZXggS2VybgogKiAgTWFueSBUaGFua3MgdG8gVmlsbGUgU3lyauRs5CBmb3IgcGF0Y2hlcyBhbmQgZml4aW5nIG5hc3RpbmcgMTYgYml0IGNvbG9yIGJ1Zy4KICoKICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqICBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgogKiAgbW9yZSBkZXRhaWxzLgogKgogKiAgTWFueSB0aGFua3MgdG8gTml0eWEgZnJvbSBBVEkgZGV2cmVsIGZvciBzdXBwb3J0IGFuZCBwYXRpZW5jZSAhCiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICBUT0RPOgoKICAgIC0gY3Vyc29yIHN1cHBvcnQgb24gYWxsIGNhcmRzIGFuZCBhbGwgcmFtZGFjcy4KICAgIC0gY3Vyc29yIHBhcmFtZXRlcnMgY29udHJvbGFibGUgdmlhIGlvY3RsKClzLgogICAgLSBndWVzcyBQTEwgYW5kIE1DTEsgYmFzZWQgb24gdGhlIG9yaWdpbmFsIFBMTCByZWdpc3RlciB2YWx1ZXMgaW5pdGlhbGl6ZWQKICAgICAgYnkgT3BlbiBGaXJtd2FyZSAoaWYgdGhleSBhcmUgaW5pdGlhbGl6ZWQpLiBCSU9TIGlzIGRvbmUKCiAgICAoQW55b25lIHdpdGggTWFjIHRvIGhlbHAgd2l0aCB0aGlzPykKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9tbS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KCiNpbmNsdWRlIDx2aWRlby9tYWNoNjQuaD4KI2luY2x1ZGUgImF0eWZiLmgiCiNpbmNsdWRlICJhdGlfaWRzLmgiCgojaWZkZWYgX19wb3dlcnBjX18KI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiNpbmNsdWRlIDxhc20vcHJvbS5oPgojaW5jbHVkZSAiLi4vbWFjbW9kZXMuaCIKI2VuZGlmCiNpZmRlZiBfX3NwYXJjX18KI2luY2x1ZGUgPGFzbS9wYm0uaD4KI2luY2x1ZGUgPGFzbS9mYmlvLmg+CiNlbmRpZgoKI2lmZGVmIENPTkZJR19BREJfUE1VCiNpbmNsdWRlIDxsaW51eC9hZGIuaD4KI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgojZW5kaWYKI2lmZGVmIENPTkZJR19CT09UWF9URVhUCiNpbmNsdWRlIDxhc20vYnRleHQuaD4KI2VuZGlmCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KI2VuZGlmCiNpZmRlZiBDT05GSUdfTVRSUgojaW5jbHVkZSA8YXNtL210cnIuaD4KI2VuZGlmCgovKgogKiBEZWJ1ZyBmbGFncy4KICovCiN1bmRlZiBERUJVRwovKiNkZWZpbmUgREVCVUcqLwoKLyogTWFrZSBzdXJlIG4gKiBQQUdFX1NJWkUgaXMgcHJvdGVjdGVkIGF0IGVuZCBvZiBBcGVydHVyZSBmb3IgR1VJLXJlZ3MgKi8KLyogIC0gbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gY2F0Y2ggYWxsIEdVSS1SZWdzICAgKi8KLyogIC0gbXVzdCBiZSBhbGlnbmVkIHRvIGEgUEFHRSBib3VuZGFyeSAgICAgICAgICAgKi8KI2RlZmluZSBHVUlfUkVTRVJWRQkoMSAqIFBBR0VfU0laRSkKCi8qIEZJWE1FOiByZW1vdmUgdGhlIEZBSUwgZGVmaW5pdGlvbiAqLwojZGVmaW5lIEZBSUwobXNnKSBkbyB7IFwKCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAoJCXByaW50ayhLRVJOX0NSSVQgImF0eWZiOiAiIG1zZyAiXG4iKTsgXAoJcmV0dXJuIC1FSU5WQUw7IFwKfSB3aGlsZSAoMCkKI2RlZmluZSBGQUlMX01BWChtc2csIHgsIF9tYXhfKSBkbyB7IFwKCWlmICh4ID4gX21heF8pIHsgXAoJCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAoJCQlwcmludGsoS0VSTl9DUklUICJhdHlmYjogIiBtc2cgIiAleCgleClcbiIsIHgsIF9tYXhfKTsgXAoJCXJldHVybiAtRUlOVkFMOyBcCgl9IFwKfSB3aGlsZSAoMCkKI2lmZGVmIERFQlVHCiNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHICJhdHlmYjogIiBmbXQsICMjIGFyZ3MpCiNlbHNlCiNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCiNlbmRpZgoKI2RlZmluZSBQUklOVEtJKGZtdCwgYXJncy4uLikJcHJpbnRrKEtFUk5fSU5GTyAiYXR5ZmI6ICIgZm10LCAjIyBhcmdzKQojZGVmaW5lIFBSSU5US0UoZm10LCBhcmdzLi4uKQkgcHJpbnRrKEtFUk5fRVJSICJhdHlmYjogIiBmbXQsICMjIGFyZ3MpCgojaWYgZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX1BNQUNfQkFDS0xJR0hUKSB8fCBcCmRlZmluZWQgKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQpCnN0YXRpYyBjb25zdCB1MzIgbHRfbGNkX3JlZ3NbXSA9IHsKCUNPTkZJR19QQU5FTF9MRywKCUxDRF9HRU5fQ05UTF9MRywKCURTVE5fQ09OVFJPTF9MRywKCUhGQl9QSVRDSF9BRERSX0xHLAoJSE9SWl9TVFJFVENISU5HX0xHLAoJVkVSVF9TVFJFVENISU5HX0xHLAoJMCwgLyogRVhUX1ZFUlRfU1RSRVRDSCAqLwoJTFRfR0lPX0xHLAoJUE9XRVJfTUFOQUdFTUVOVF9MRwp9OwoKdm9pZCBhdHlfc3RfbGNkKGludCBpbmRleCwgdTMyIHZhbCwgY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglpZiAoTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQlhdHlfc3RfbGUzMihsdF9sY2RfcmVnc1tpbmRleF0sIHZhbCwgcGFyKTsKCX0gZWxzZSB7CgkJdW5zaWduZWQgbG9uZyB0ZW1wOwoKCQkvKiB3cml0ZSBhZGRyIGJ5dGUgKi8KCQl0ZW1wID0gYXR5X2xkX2xlMzIoTENEX0lOREVYLCBwYXIpOwoJCWF0eV9zdF9sZTMyKExDRF9JTkRFWCwgKHRlbXAgJiB+TENEX0lOREVYX01BU0spIHwgaW5kZXgsIHBhcik7CgkJLyogd3JpdGUgdGhlIHJlZ2lzdGVyIHZhbHVlICovCgkJYXR5X3N0X2xlMzIoTENEX0RBVEEsIHZhbCwgcGFyKTsKCX0KfQoKdTMyIGF0eV9sZF9sY2QoaW50IGluZGV4LCBjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKCWlmIChNNjRfSEFTKExUX0xDRF9SRUdTKSkgewoJCXJldHVybiBhdHlfbGRfbGUzMihsdF9sY2RfcmVnc1tpbmRleF0sIHBhcik7Cgl9IGVsc2UgewoJCXVuc2lnbmVkIGxvbmcgdGVtcDsKCgkJLyogd3JpdGUgYWRkciBieXRlICovCgkJdGVtcCA9IGF0eV9sZF9sZTMyKExDRF9JTkRFWCwgcGFyKTsKCQlhdHlfc3RfbGUzMihMQ0RfSU5ERVgsICh0ZW1wICYgfkxDRF9JTkRFWF9NQVNLKSB8IGluZGV4LCBwYXIpOwoJCS8qIHJlYWQgdGhlIHJlZ2lzdGVyIHZhbHVlICovCgkJcmV0dXJuIGF0eV9sZF9sZTMyKExDRF9EQVRBLCBwYXIpOwoJfQp9CiNlbmRpZiAvKiBkZWZpbmVkKENPTkZJR19QTSkgfHwgZGVmaW5lZChDT05GSUdfUE1BQ19CQUNLTElHSFQpIHx8IGRlZmluZWQgKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpICovCgojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAovKgogKiBBVElSZWR1Y2VSYXRpbyAtLQogKgogKiBSZWR1Y2UgYSBmcmFjdGlvbiBieSBmYWN0b3Jpbmcgb3V0IHRoZSBsYXJnZXN0IGNvbW1vbiBkaXZpZGVyIG9mIHRoZQogKiBmcmFjdGlvbidzIG51bWVyYXRvciBhbmQgZGVub21pbmF0b3IuCiAqLwpzdGF0aWMgdm9pZCBBVElSZWR1Y2VSYXRpbyhpbnQgKk51bWVyYXRvciwgaW50ICpEZW5vbWluYXRvcikKewogICAgaW50IE11bHRpcGxpZXIsIERpdmlkZXIsIFJlbWFpbmRlcjsKCiAgICBNdWx0aXBsaWVyID0gKk51bWVyYXRvcjsKICAgIERpdmlkZXIgPSAqRGVub21pbmF0b3I7CgogICAgd2hpbGUgKChSZW1haW5kZXIgPSBNdWx0aXBsaWVyICUgRGl2aWRlcikpCiAgICB7CiAgICAgICAgTXVsdGlwbGllciA9IERpdmlkZXI7CiAgICAgICAgRGl2aWRlciA9IFJlbWFpbmRlcjsKICAgIH0KCiAgICAqTnVtZXJhdG9yIC89IERpdmlkZXI7CiAgICAqRGVub21pbmF0b3IgLz0gRGl2aWRlcjsKfQojZW5kaWYKICAgIC8qCiAgICAgKiAgVGhlIEhhcmR3YXJlIHBhcmFtZXRlcnMgZm9yIGVhY2ggY2FyZAogICAgICovCgpzdHJ1Y3QgcGNpX21tYXBfbWFwIHsKCXVuc2lnbmVkIGxvbmcgdm9mZjsKCXVuc2lnbmVkIGxvbmcgcG9mZjsKCXVuc2lnbmVkIGxvbmcgc2l6ZTsKCXVuc2lnbmVkIGxvbmcgcHJvdF9mbGFnOwoJdW5zaWduZWQgbG9uZyBwcm90X21hc2s7Cn07CgpzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGF0eWZiX2ZpeCBfX2RldmluaXRkYXRhID0gewoJLmlkCQk9ICJBVFkgTWFjaDY0IiwKCS50eXBlCQk9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUywKCS52aXN1YWwJCT0gRkJfVklTVUFMX1BTRVVET0NPTE9SLAoJLnhwYW5zdGVwCT0gOCwKCS55cGFuc3RlcAk9IDEsCn07CgogICAgLyoKICAgICAqICBGcmFtZSBidWZmZXIgZGV2aWNlIEFQSQogICAgICovCgpzdGF0aWMgaW50IGF0eWZiX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKTsKc3RhdGljIGludCBhdHlmYl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcik7CnN0YXRpYyBpbnQgYXR5ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAoJdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIGludCBhdHlmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIGludCBhdHlmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKTsKI2lmZGVmIF9fc3BhcmNfXwpzdGF0aWMgaW50IGF0eWZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKTsKI2VuZGlmCnN0YXRpYyBpbnQgYXR5ZmJfc3luYyhzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CgogICAgLyoKICAgICAqICBJbnRlcm5hbCByb3V0aW5lcwogICAgICovCgpzdGF0aWMgaW50IGF0eV9pbml0KHN0cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIHZvaWQgYXR5X3Jlc3VtZV9jaGlwKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKI2lmZGVmIENPTkZJR19BVEFSSQpzdGF0aWMgaW50IHN0b3JlX3ZpZGVvX3BhcihjaGFyICp2aWRlb3BhciwgdW5zaWduZWQgY2hhciBtNjRfbnVtKTsKI2VuZGlmCgpzdGF0aWMgc3RydWN0IGNydGMgc2F2ZWRfY3J0YzsKc3RhdGljIHVuaW9uIGF0eV9wbGwgc2F2ZWRfcGxsOwpzdGF0aWMgdm9pZCBhdHlfZ2V0X2NydGMoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyLCBzdHJ1Y3QgY3J0YyAqY3J0Yyk7CgpzdGF0aWMgdm9pZCBhdHlfc2V0X2NydGMoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyLCBjb25zdCBzdHJ1Y3QgY3J0YyAqY3J0Yyk7CnN0YXRpYyBpbnQgYXR5X3Zhcl90b19jcnRjKGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGNydGMgKmNydGMpOwpzdGF0aWMgaW50IGF0eV9jcnRjX3RvX3Zhcihjb25zdCBzdHJ1Y3QgY3J0YyAqY3J0Yywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpOwpzdGF0aWMgdm9pZCBzZXRfb2ZmX3BpdGNoKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8pOwojaWZkZWYgQ09ORklHX1BQQwpzdGF0aWMgaW50IHJlYWRfYXR5X3NlbnNlKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcik7CiNlbmRpZgoKCiAgICAvKgogICAgICogIEludGVyZmFjZSB1c2VkIGJ5IHRoZSB3b3JsZAogICAgICovCgpzdGF0aWMgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGRlZmF1bHRfdmFyID0gewoJLyogNjQweDQ4MCwgNjAgSHosIE5vbi1JbnRlcmxhY2VkICgyNS4xNzUgTUh6IGRvdGNsb2NrKSAqLwoJNjQwLCA0ODAsIDY0MCwgNDgwLCAwLCAwLCA4LCAwLAoJezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDAsIDB9LAoJMCwgMCwgLTEsIC0xLCAwLCAzOTcyMiwgNDgsIDE2LCAzMywgMTAsIDk2LCAyLAoJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAp9OwoKc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgZGVmbW9kZSA9IHsKCS8qIDY0MHg0ODAgQCA2MCBIeiwgMzEuNSBrSHogaHN5bmMgKi8KCU5VTEwsIDYwLCA2NDAsIDQ4MCwgMzk3MjEsIDQwLCAyNCwgMzIsIDExLCA5NiwgMiwKCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKfTsKCnN0YXRpYyBzdHJ1Y3QgZmJfb3BzIGF0eWZiX29wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5mYl9vcGVuCT0gYXR5ZmJfb3BlbiwKCS5mYl9yZWxlYXNlCT0gYXR5ZmJfcmVsZWFzZSwKCS5mYl9jaGVja192YXIJPSBhdHlmYl9jaGVja192YXIsCgkuZmJfc2V0X3Bhcgk9IGF0eWZiX3NldF9wYXIsCgkuZmJfc2V0Y29scmVnCT0gYXR5ZmJfc2V0Y29scmVnLAoJLmZiX3Bhbl9kaXNwbGF5CT0gYXR5ZmJfcGFuX2Rpc3BsYXksCgkuZmJfYmxhbmsJPSBhdHlmYl9ibGFuaywKCS5mYl9pb2N0bAk9IGF0eWZiX2lvY3RsLAoJLmZiX2ZpbGxyZWN0CT0gYXR5ZmJfZmlsbHJlY3QsCgkuZmJfY29weWFyZWEJPSBhdHlmYl9jb3B5YXJlYSwKCS5mYl9pbWFnZWJsaXQJPSBhdHlmYl9pbWFnZWJsaXQsCiNpZmRlZiBfX3NwYXJjX18KCS5mYl9tbWFwCT0gYXR5ZmJfbW1hcCwKI2VuZGlmCgkuZmJfc3luYwk9IGF0eWZiX3N5bmMsCn07CgpzdGF0aWMgaW50IG5vYWNjZWw7CiNpZmRlZiBDT05GSUdfTVRSUgpzdGF0aWMgaW50IG5vbXRycjsKI2VuZGlmCnN0YXRpYyBpbnQgdnJhbTsKc3RhdGljIGludCBwbGw7CnN0YXRpYyBpbnQgbWNsazsKc3RhdGljIGludCB4Y2xrOwpzdGF0aWMgaW50IGNvbXBfc3luYyBfX2RldmluaXRkYXRhID0gLTE7CnN0YXRpYyBjaGFyICptb2RlOwoKI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVApzdGF0aWMgaW50IGJhY2tsaWdodCBfX2RldmluaXRkYXRhID0gMTsKI2Vsc2UKc3RhdGljIGludCBiYWNrbGlnaHQgX19kZXZpbml0ZGF0YSA9IDA7CiNlbmRpZgoKI2lmZGVmIENPTkZJR19QUEMKc3RhdGljIGludCBkZWZhdWx0X3Ztb2RlIF9fZGV2aW5pdGRhdGEgPSBWTU9ERV9DSE9PU0U7CnN0YXRpYyBpbnQgZGVmYXVsdF9jbW9kZSBfX2RldmluaXRkYXRhID0gQ01PREVfQ0hPT1NFOwoKbW9kdWxlX3BhcmFtX25hbWVkKHZtb2RlLCBkZWZhdWx0X3Ztb2RlLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHZtb2RlLCAiaW50OiB2aWRlbyBtb2RlIGZvciBtYWMiKTsKbW9kdWxlX3BhcmFtX25hbWVkKGNtb2RlLCBkZWZhdWx0X2Ntb2RlLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGNtb2RlLCAiaW50OiBjb2xvciBtb2RlIGZvciBtYWMiKTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX0FUQVJJCnN0YXRpYyB1bnNpZ25lZCBpbnQgbWFjaDY0X2NvdW50IF9fZGV2aW5pdGRhdGEgPSAwOwpzdGF0aWMgdW5zaWduZWQgbG9uZyBwaHlzX3ZtZW1iYXNlW0ZCX01BWF0gX19kZXZpbml0ZGF0YSA9IHsgMCwgfTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgcGh5c19zaXplW0ZCX01BWF0gX19kZXZpbml0ZGF0YSA9IHsgMCwgfTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgcGh5c19ndWlyZWdiYXNlW0ZCX01BWF0gX19kZXZpbml0ZGF0YSA9IHsgMCwgfTsKI2VuZGlmCgovKiB0b3AgLT4gZG93biBpcyBhbiBldm9sdXRpb24gb2YgbWFjaDY0IGNoaXBzZXQsIGFueSBjb3JyZWN0aW9ucz8gKi8KI2RlZmluZSBBVElfQ0hJUF84ODgwMEdYICAgKE02NEZfR1gpCiNkZWZpbmUgQVRJX0NISVBfODg4MDBDWCAgIChNNjRGX0dYKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRDVCAgICAgKE02NEZfQ1QgfCBNNjRGX0lOVEVHUkFURUQgfCBNNjRGX0NUX0JVUyB8IE02NEZfTUFHSUNfRklGTykKI2RlZmluZSBBVElfQ0hJUF8yNjRFVCAgICAgKE02NEZfQ1QgfCBNNjRGX0lOVEVHUkFURUQgfCBNNjRGX0NUX0JVUyB8IE02NEZfTUFHSUNfRklGTykKCiNkZWZpbmUgQVRJX0NISVBfMjY0VlQgICAgIChNNjRGX1ZUIHwgTTY0Rl9JTlRFR1JBVEVEIHwgTTY0Rl9WVF9CVVMgfCBNNjRGX01BR0lDX0ZJRk8pCiNkZWZpbmUgQVRJX0NISVBfMjY0R1QgICAgIChNNjRGX0dUIHwgTTY0Rl9JTlRFR1JBVEVEICAgICAgICAgICAgICAgfCBNNjRGX01BR0lDX0ZJRk8gfCBNNjRGX0VYVFJBX0JSSUdIVCkKCiNkZWZpbmUgQVRJX0NISVBfMjY0VlRCICAgIChNNjRGX1ZUIHwgTTY0Rl9JTlRFR1JBVEVEIHwgTTY0Rl9WVF9CVVMgfCBNNjRGX0dUQl9EU1ApCiNkZWZpbmUgQVRJX0NISVBfMjY0VlQzICAgIChNNjRGX1ZUIHwgTTY0Rl9JTlRFR1JBVEVEIHwgTTY0Rl9WVF9CVVMgfCBNNjRGX0dUQl9EU1AgfCBNNjRGX1NEUkFNX01BR0lDX1BMTCkKI2RlZmluZSBBVElfQ0hJUF8yNjRWVDQgICAgKE02NEZfVlQgfCBNNjRGX0lOVEVHUkFURUQgICAgICAgICAgICAgICB8IE02NEZfR1RCX0RTUCkKCi8qIEZJWE1FIHdoYXQgaXMgdGhpcyBjaGlwPyAqLwojZGVmaW5lIEFUSV9DSElQXzI2NExUICAgICAoTTY0Rl9HVCB8IE02NEZfSU5URUdSQVRFRCAgICAgICAgICAgICAgIHwgTTY0Rl9HVEJfRFNQKQoKLyogbWFrZSBzZXRzIHNob3J0ZXIgKi8KI2RlZmluZSBBVElfTU9ERVJOX1NFVCAgICAgKE02NEZfR1QgfCBNNjRGX0lOVEVHUkFURUQgICAgICAgICAgICAgICB8IE02NEZfR1RCX0RTUCB8IE02NEZfRVhUUkFfQlJJR0hUKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRHVEIgICAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwpCi8qI2RlZmluZSBBVElfQ0hJUF8yNjRHVERWRCAgPyovCiNkZWZpbmUgQVRJX0NISVBfMjY0TFRHICAgIChBVElfTU9ERVJOX1NFVCB8IE02NEZfU0RSQU1fTUFHSUNfUExMKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRHVDJDICAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwgfCBNNjRGX0hXX1RSSVBMRSkKI2RlZmluZSBBVElfQ0hJUF8yNjRHVFBSTyAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwgfCBNNjRGX0hXX1RSSVBMRSB8IE02NEZfRklGT18zMiB8IE02NEZfUkVTRVRfM0QpCiNkZWZpbmUgQVRJX0NISVBfMjY0TFRQUk8gIChBVElfTU9ERVJOX1NFVCB8IE02NEZfSFdfVFJJUExFIHwgTTY0Rl9GSUZPXzMyIHwgTTY0Rl9SRVNFVF8zRCkKCiNkZWZpbmUgQVRJX0NISVBfMjY0WEwgICAgIChBVElfTU9ERVJOX1NFVCB8IE02NEZfSFdfVFJJUExFIHwgTTY0Rl9GSUZPXzMyIHwgTTY0Rl9SRVNFVF8zRCB8IE02NEZfWExfRExMIHwgTTY0Rl9NRkJfRk9SQ0VfNCkKI2RlZmluZSBBVElfQ0hJUF9NT0JJTElUWSAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9IV19UUklQTEUgfCBNNjRGX0ZJRk9fMzIgfCBNNjRGX1JFU0VUXzNEIHwgTTY0Rl9YTF9ETEwgfCBNNjRGX01GQl9GT1JDRV80IHwgTTY0Rl9NT0JJTF9CVVMpCgpzdGF0aWMgc3RydWN0IHsKCXUxNiBwY2lfaWQ7Cgljb25zdCBjaGFyICpuYW1lOwoJaW50IHBsbCwgbWNsaywgeGNsaywgZWNwX21heDsKCXUzMiBmZWF0dXJlczsKfSBhdHlfY2hpcHNbXSBfX2RldmluaXRkYXRhID0gewojaWZkZWYgQ09ORklHX0ZCX0FUWV9HWAoJLyogTWFjaDY0IEdYICovCgl7IFBDSV9DSElQX01BQ0g2NEdYLCAiQVRJODg4R1gwMCAoTWFjaDY0IEdYKSIsIDEzNSwgNTAsIDUwLCAwLCBBVElfQ0hJUF84ODgwMEdYIH0sCgl7IFBDSV9DSElQX01BQ0g2NENYLCAiQVRJODg4Q1gwMCAoTWFjaDY0IENYKSIsIDEzNSwgNTAsIDUwLCAwLCBBVElfQ0hJUF84ODgwMENYIH0sCiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0dYICovCgojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVAoJeyBQQ0lfQ0hJUF9NQUNINjRDVCwgIkFUSTI2NENUIChNYWNoNjQgQ1QpIiwgMTM1LCA2MCwgNjAsIDAsIEFUSV9DSElQXzI2NENUIH0sCgl7IFBDSV9DSElQX01BQ0g2NEVULCAiQVRJMjY0RVQgKE1hY2g2NCBFVCkiLCAxMzUsIDYwLCA2MCwgMCwgQVRJX0NISVBfMjY0RVQgfSwKCgkvKiBGSVhNRSB3aGF0IGlzIHRoaXMgY2hpcD8gKi8KCXsgUENJX0NISVBfTUFDSDY0TFQsICJBVEkyNjRMVCAoTWFjaDY0IExUKSIsIDEzNSwgNjMsIDYzLCAwLCBBVElfQ0hJUF8yNjRMVCB9LAoKCXsgUENJX0NISVBfTUFDSDY0VlQsICJBVEkyNjRWVCAoTWFjaDY0IFZUKSIsIDE3MCwgNjcsIDY3LCA4MCwgQVRJX0NISVBfMjY0VlQgfSwKCXsgUENJX0NISVBfTUFDSDY0R1QsICIzRCBSQUdFIChNYWNoNjQgR1QpIiwgMTM1LCA2MywgNjMsIDgwLCBBVElfQ0hJUF8yNjRHVCB9LAoKCXsgUENJX0NISVBfTUFDSDY0VlUsICJBVEkyNjRWVDMgKE1hY2g2NCBWVSkiLCAyMDAsIDY3LCA2NywgODAsIEFUSV9DSElQXzI2NFZUMyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHVSwgIjNEIFJBR0UgSUkrIChNYWNoNjQgR1UpIiwgMjAwLCA2NywgNjcsIDEwMCwgQVRJX0NISVBfMjY0R1RCIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRMRywgIjNEIFJBR0UgTFQgKE1hY2g2NCBMRykiLCAyMzAsIDYzLCA2MywgMTAwLCBBVElfQ0hJUF8yNjRMVEcgfCBNNjRGX0xUX0xDRF9SRUdTIHwgTTY0Rl9HM19QQl8xMDI0eDc2OCB9LAoKCXsgUENJX0NISVBfTUFDSDY0VlYsICJBVEkyNjRWVDQgKE1hY2g2NCBWVikiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRWVDQgfSwKCgl7IFBDSV9DSElQX01BQ0g2NEdWLCAiM0QgUkFHRSBJSUMgKE1hY2g2NCBHViwgUENJKSIsIDIzMCwgODMsIDgzLCAxMDAsIEFUSV9DSElQXzI2NEdUMkMgfSwKCXsgUENJX0NISVBfTUFDSDY0R1csICIzRCBSQUdFIElJQyAoTWFjaDY0IEdXLCBBR1ApIiwgMjMwLCA4MywgODMsIDEwMCwgQVRJX0NISVBfMjY0R1QyQyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHWSwgIjNEIFJBR0UgSUlDIChNYWNoNjQgR1ksIFBDSSkiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRHVDJDIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdaLCAiM0QgUkFHRSBJSUMgKE1hY2g2NCBHWiwgQUdQKSIsIDIzMCwgODMsIDgzLCAxMDAsIEFUSV9DSElQXzI2NEdUMkMgfSwKCgl7IFBDSV9DSElQX01BQ0g2NEdCLCAiM0QgUkFHRSBQUk8gKE1hY2g2NCBHQiwgQkdBLCBBR1ApIiwgMjMwLCAxMDAsIDEwMCwgMTI1LCBBVElfQ0hJUF8yNjRHVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHRCwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR0QsIEJHQSwgQUdQIDF4KSIsIDIzMCwgMTAwLCAxMDAsIDEyNSwgQVRJX0NISVBfMjY0R1RQUk8gfSwKCXsgUENJX0NISVBfTUFDSDY0R0ksICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdJLCBCR0EsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIHwgTTY0Rl9NQUdJQ19WUkFNX1NJWkUgfSwKCXsgUENJX0NISVBfTUFDSDY0R1AsICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdQLCBQUUZQLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTI1LCBBVElfQ0hJUF8yNjRHVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHUSwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR1EsIFBRRlAsIFBDSSwgbGltaXRlZCAzRCkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRMQiwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTEIsIEFHUCkiLCAyMzYsIDc1LCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfSwKCXsgUENJX0NISVBfTUFDSDY0TEQsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExELCBBR1ApIiwgMjMwLCAxMDAsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMSSwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTEksIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIHwgTTY0Rl9HM19QQl8xXzEgfCBNNjRGX0czX1BCXzEwMjR4NzY4IH0sCgl7IFBDSV9DSElQX01BQ0g2NExQLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMUCwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfCBNNjRGX0czX1BCXzEwMjR4NzY4IH0sCgl7IFBDSV9DSElQX01BQ0g2NExRLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMUSwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfSwKCgl7IFBDSV9DSElQX01BQ0g2NEdNLCAiM0QgUkFHRSBYTCAoTWFjaDY0IEdNLCBBR1AgMngpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfSwKCXsgUENJX0NISVBfTUFDSDY0R04sICIzRCBSQUdFIFhDIChNYWNoNjQgR04sIEFHUCAyeCkiLCAyMzAsIDgzLCA2MywgMTM1LCBBVElfQ0hJUF8yNjRYTCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHTywgIjNEIFJBR0UgWEwgKE1hY2g2NCBHTywgUENJLTY2KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdMLCAiM0QgUkFHRSBYQyAoTWFjaDY0IEdMLCBQQ0ktNjYpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfSwKCXsgUENJX0NISVBfTUFDSDY0R1IsICIzRCBSQUdFIFhMIChNYWNoNjQgR1IsIFBDSS0zMykiLCAyMzAsIDgzLCA2MywgMTM1LCBBVElfQ0hJUF8yNjRYTCB8IE02NEZfU0RSQU1fTUFHSUNfUExMIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdTLCAiM0QgUkFHRSBYQyAoTWFjaDY0IEdTLCBQQ0ktMzMpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfSwKCgl7IFBDSV9DSElQX01BQ0g2NExNLCAiM0QgUkFHRSBNb2JpbGl0eSBQL00gKE1hY2g2NCBMTSwgQUdQIDJ4KSIsIDIzMCwgODMsIDEyNSwgMTM1LCBBVElfQ0hJUF9NT0JJTElUWSB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMTiwgIjNEIFJBR0UgTW9iaWxpdHkgTCAoTWFjaDY0IExOLCBBR1AgMngpIiwgMjMwLCA4MywgMTI1LCAxMzUsIEFUSV9DSElQX01PQklMSVRZIH0sCgl7IFBDSV9DSElQX01BQ0g2NExSLCAiM0QgUkFHRSBNb2JpbGl0eSBQL00gKE1hY2g2NCBMUiwgUENJKSIsIDIzMCwgODMsIDEyNSwgMTM1LCBBVElfQ0hJUF9NT0JJTElUWSB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMUywgIjNEIFJBR0UgTW9iaWxpdHkgTCAoTWFjaDY0IExTLCBQQ0kpIiwgMjMwLCA4MywgMTI1LCAxMzUsIEFUSV9DSElQX01PQklMSVRZIH0sCiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0NUICovCn07CgovKiBjYW4gbm90IGZhaWwgKi8Kc3RhdGljIGludCBfX2RldmluaXQgY29ycmVjdF9jaGlwc2V0KHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJdTggcmV2OwoJdTE2IHR5cGU7Cgl1MzIgY2hpcF9pZDsKCWNvbnN0IGNoYXIgKm5hbWU7CglpbnQgaTsKCglmb3IgKGkgPSBBUlJBWV9TSVpFKGF0eV9jaGlwcykgLSAxOyBpID49IDA7IGktLSkKCQlpZiAocGFyLT5wY2lfaWQgPT0gYXR5X2NoaXBzW2ldLnBjaV9pZCkKCQkJYnJlYWs7CgoJbmFtZSA9IGF0eV9jaGlwc1tpXS5uYW1lOwoJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSBhdHlfY2hpcHNbaV0ucGxsOwoJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSBhdHlfY2hpcHNbaV0ubWNsazsKCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gYXR5X2NoaXBzW2ldLnhjbGs7CglwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IGF0eV9jaGlwc1tpXS5lY3BfbWF4OwoJcGFyLT5mZWF0dXJlcyA9IGF0eV9jaGlwc1tpXS5mZWF0dXJlczsKCgljaGlwX2lkID0gYXR5X2xkX2xlMzIoQ09ORklHX0NISVBfSUQsIHBhcik7Cgl0eXBlID0gY2hpcF9pZCAmIENGR19DSElQX1RZUEU7CglyZXYgPSAoY2hpcF9pZCAmIENGR19DSElQX1JFVikgPj4gMjQ7CgoJc3dpdGNoKHBhci0+cGNpX2lkKSB7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dYCgljYXNlIFBDSV9DSElQX01BQ0g2NEdYOgoJCWlmKHR5cGUgIT0gMHgwMGQ3KQoJCQlyZXR1cm4gLUVOT0RFVjsKCQlicmVhazsKCWNhc2UgUENJX0NISVBfTUFDSDY0Q1g6CgkJaWYodHlwZSAhPSAweDAwNTcpCgkJCXJldHVybiAtRU5PREVWOwoJCWJyZWFrOwojZW5kaWYKI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKCWNhc2UgUENJX0NISVBfTUFDSDY0VlQ6CgkJc3dpdGNoIChyZXYgJiAweDA3KSB7CgkJY2FzZSAweDAwOgoJCQlzd2l0Y2ggKHJldiAmIDB4YzApIHsKCQkJY2FzZSAweDAwOgoJCQkJbmFtZSA9ICJBVEkyNjRWVCAoQTMpIChNYWNoNjQgVlQpIjsKCQkJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gMTcwOwoJCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKCQkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CgkJCQlwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IDgwOwoJCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NFZUOwoJCQkJYnJlYWs7CgkJCWNhc2UgMHg0MDoKCQkJCW5hbWUgPSAiQVRJMjY0VlQyIChBNCkgKE1hY2g2NCBWVCkiOwoJCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAyMDA7CgkJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDY3OwoJCQkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA2NzsKCQkJCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gODA7CgkJCQlwYXItPmZlYXR1cmVzID0gQVRJX0NISVBfMjY0VlQgfCBNNjRGX01BR0lDX1BPU1RESVY7CgkJCQlicmVhazsKCQkJfQoJCQlicmVhazsKCQljYXNlIDB4MDE6CgkJCW5hbWUgPSAiQVRJMjY0VlQzIChCMSkgKE1hY2g2NCBWVCkiOwoJCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IDIwMDsKCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLmVjcF9tYXggPSA4MDsKCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NFZUQjsKCQkJYnJlYWs7CgkJY2FzZSAweDAyOgoJCQluYW1lID0gIkFUSTI2NFZUMyAoQjIpIChNYWNoNjQgVlQpIjsKCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAyMDA7CgkJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gODA7CgkJCXBhci0+ZmVhdHVyZXMgPSBBVElfQ0hJUF8yNjRWVDM7CgkJCWJyZWFrOwoJCX0KCQlicmVhazsKCWNhc2UgUENJX0NISVBfTUFDSDY0R1Q6CgkJc3dpdGNoIChyZXYgJiAweDA3KSB7CgkJY2FzZSAweDAxOgoJCQluYW1lID0gIjNEIFJBR0UgSUkgKE1hY2g2NCBHVCkiOwoJCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IDE3MDsKCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA2NzsKCQkJcGFyLT5wbGxfbGltaXRzLmVjcF9tYXggPSA4MDsKCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NEdUQjsKCQkJYnJlYWs7CgkJY2FzZSAweDAyOgoJCQluYW1lID0gIjNEIFJBR0UgSUkrIChNYWNoNjQgR1QpIjsKCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAyMDA7CgkJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gMTAwOwoJCQlwYXItPmZlYXR1cmVzID0gQVRJX0NISVBfMjY0R1RCOwoJCQlicmVhazsKCQl9CgkJYnJlYWs7CiNlbmRpZgoJfQoKCVBSSU5US0koIiVzIFsweCUwNHggcmV2IDB4JTAyeF1cbiIsIG5hbWUsIHR5cGUsIHJldik7CglyZXR1cm4gMDsKfQoKc3RhdGljIGNoYXIgcmFtX2RyYW1bXSBfX2RldmluaXRkYXRhID0gIkRSQU0iOwpzdGF0aWMgY2hhciByYW1fcmVzdltdIF9fZGV2aW5pdGRhdGEgPSAiUkVTViI7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dYCnN0YXRpYyBjaGFyIHJhbV92cmFtW10gX19kZXZpbml0ZGF0YSA9ICJWUkFNIjsKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR1ggKi8KI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKc3RhdGljIGNoYXIgcmFtX2Vkb1tdIF9fZGV2aW5pdGRhdGEgPSAiRURPIjsKc3RhdGljIGNoYXIgcmFtX3NkcmFtW10gX19kZXZpbml0ZGF0YSA9ICJTRFJBTSAoMToxKSI7CnN0YXRpYyBjaGFyIHJhbV9zZ3JhbVtdIF9fZGV2aW5pdGRhdGEgPSAiU0dSQU0gKDE6MSkiOwpzdGF0aWMgY2hhciByYW1fc2RyYW0zMltdIF9fZGV2aW5pdGRhdGEgPSAiU0RSQU0gKDI6MSkgKDMyLWJpdCkiOwpzdGF0aWMgY2hhciByYW1fb2ZmW10gX19kZXZpbml0ZGF0YSA9ICJPRkYiOwojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9DVCAqLwoKCnN0YXRpYyB1MzIgcHNldWRvX3BhbGV0dGVbMTddOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR1gKc3RhdGljIGNoYXIgKmF0eV9neF9yYW1bOF0gX19kZXZpbml0ZGF0YSA9IHsKCXJhbV9kcmFtLCByYW1fdnJhbSwgcmFtX3ZyYW0sIHJhbV9kcmFtLAoJcmFtX2RyYW0sIHJhbV92cmFtLCByYW1fdnJhbSwgcmFtX3Jlc3YKfTsKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR1ggKi8KCiNpZmRlZiBDT05GSUdfRkJfQVRZX0NUCnN0YXRpYyBjaGFyICphdHlfY3RfcmFtWzhdIF9fZGV2aW5pdGRhdGEgPSB7CglyYW1fb2ZmLCByYW1fZHJhbSwgcmFtX2VkbywgcmFtX2VkbywKCXJhbV9zZHJhbSwgcmFtX3NncmFtLCByYW1fc2RyYW0zMiwgcmFtX3Jlc3YKfTsKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQ1QgKi8KCnN0YXRpYyB1MzIgYXR5ZmJfZ2V0X3BpeGNsb2NrKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKCXUzMiBwaXhjbG9jayA9IHZhci0+cGl4Y2xvY2s7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECgl1MzIgbGNkX29uX29mZjsKCXBhci0+cGxsLmN0LnhyZXMgPSAwOwoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQlsY2Rfb25fb2ZmID0gYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcik7CgkJaWYobGNkX29uX29mZiAmIExDRF9PTikgewoJCQlwYXItPnBsbC5jdC54cmVzID0gdmFyLT54cmVzOwoJCQlwaXhjbG9jayA9IHBhci0+bGNkX3BpeGNsb2NrOwoJCX0KCX0KI2VuZGlmCglyZXR1cm4gcGl4Y2xvY2s7Cn0KCiNpZiBkZWZpbmVkKENPTkZJR19QUEMpCgovKgogKiAgQXBwbGUgbW9uaXRvciBzZW5zZQogKi8KCnN0YXRpYyBpbnQgX19kZXZpbml0IHJlYWRfYXR5X3NlbnNlKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJaW50IHNlbnNlLCBpOwoKCWF0eV9zdF9sZTMyKEdQX0lPLCAweDMxMDAzMTAwLCBwYXIpOyAvKiBkcml2ZSBvdXRwdXRzIGhpZ2ggKi8KCV9fZGVsYXkoMjAwKTsKCWF0eV9zdF9sZTMyKEdQX0lPLCAwLCBwYXIpOyAvKiB0dXJuIG9mZiBvdXRwdXRzICovCglfX2RlbGF5KDIwMDApOwoJaSA9IGF0eV9sZF9sZTMyKEdQX0lPLCBwYXIpOyAvKiBnZXQgcHJpbWFyeSBzZW5zZSB2YWx1ZSAqLwoJc2Vuc2UgPSAoKGkgJiAweDMwMDApID4+IDMpIHwgKGkgJiAweDEwMCk7CgoJLyogZHJpdmUgZWFjaCBzZW5zZSBsaW5lIGxvdyBpbiB0dXJuIGFuZCBjb2xsZWN0IHRoZSBvdGhlciAyICovCglhdHlfc3RfbGUzMihHUF9JTywgMHgyMDAwMDAwMCwgcGFyKTsgLyogZHJpdmUgQSBsb3cgKi8KCV9fZGVsYXkoMjAwMCk7CglpID0gYXR5X2xkX2xlMzIoR1BfSU8sIHBhcik7CglzZW5zZSB8PSAoKGkgJiAweDEwMDApID4+IDcpIHwgKChpICYgMHgxMDApID4+IDQpOwoJYXR5X3N0X2xlMzIoR1BfSU8sIDB4MjAwMDIwMDAsIHBhcik7IC8qIGRyaXZlIEEgaGlnaCBhZ2FpbiAqLwoJX19kZWxheSgyMDApOwoKCWF0eV9zdF9sZTMyKEdQX0lPLCAweDEwMDAwMDAwLCBwYXIpOyAvKiBkcml2ZSBCIGxvdyAqLwoJX19kZWxheSgyMDAwKTsKCWkgPSBhdHlfbGRfbGUzMihHUF9JTywgcGFyKTsKCXNlbnNlIHw9ICgoaSAmIDB4MjAwMCkgPj4gMTApIHwgKChpICYgMHgxMDApID4+IDYpOwoJYXR5X3N0X2xlMzIoR1BfSU8sIDB4MTAwMDEwMDAsIHBhcik7IC8qIGRyaXZlIEIgaGlnaCBhZ2FpbiAqLwoJX19kZWxheSgyMDApOwoKCWF0eV9zdF9sZTMyKEdQX0lPLCAweDAxMDAwMDAwLCBwYXIpOyAvKiBkcml2ZSBDIGxvdyAqLwoJX19kZWxheSgyMDAwKTsKCXNlbnNlIHw9IChhdHlfbGRfbGUzMihHUF9JTywgcGFyKSAmIDB4MzAwMCkgPj4gMTI7CglhdHlfc3RfbGUzMihHUF9JTywgMCwgcGFyKTsgLyogdHVybiBvZmYgb3V0cHV0cyAqLwoJcmV0dXJuIHNlbnNlOwp9CgojZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUFBDKSAqLwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKLyoKICogIENSVEMgcHJvZ3JhbW1pbmcKICovCgpzdGF0aWMgdm9pZCBhdHlfZ2V0X2NydGMoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyLCBzdHJ1Y3QgY3J0YyAqY3J0YykKewojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQlpZighTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQkgICAgY3J0Yy0+bGNkX2luZGV4ID0gYXR5X2xkX2xlMzIoTENEX0lOREVYLCBwYXIpOwoJCSAgICBhdHlfc3RfbGUzMihMQ0RfSU5ERVgsIGNydGMtPmxjZF9pbmRleCwgcGFyKTsKCQl9CgkJY3J0Yy0+bGNkX2NvbmZpZ19wYW5lbCA9IGF0eV9sZF9sY2QoQ09ORklHX1BBTkVMLCBwYXIpOwoJCWNydGMtPmxjZF9nZW5fY250bCA9IGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpOwoKCgkJLyogc3dpdGNoIHRvIG5vbiBzaGFkb3cgcmVnaXN0ZXJzICovCgkJYXR5X3N0X2xjZChMQ0RfR0VOX0NOVEwsIGNydGMtPmxjZF9nZW5fY250bCAmCiAgICAgICAgICAgICAgICAgICAgfihDUlRDX1JXX1NFTEVDVCB8IFNIQURPV19FTiB8IFNIQURPV19SV19FTiksIHBhcik7CgoJCS8qIHNhdmUgc3RyZXRjaGluZyAqLwoJCWNydGMtPmhvcnpfc3RyZXRjaGluZyA9IGF0eV9sZF9sY2QoSE9SWl9TVFJFVENISU5HLCBwYXIpOwoJCWNydGMtPnZlcnRfc3RyZXRjaGluZyA9IGF0eV9sZF9sY2QoVkVSVF9TVFJFVENISU5HLCBwYXIpOwoJCWlmICghTTY0X0hBUyhMVF9MQ0RfUkVHUykpCgkJCWNydGMtPmV4dF92ZXJ0X3N0cmV0Y2ggPSBhdHlfbGRfbGNkKEVYVF9WRVJUX1NUUkVUQ0gsIHBhcik7Cgl9CiNlbmRpZgoJY3J0Yy0+aF90b3RfZGlzcCA9IGF0eV9sZF9sZTMyKENSVENfSF9UT1RBTF9ESVNQLCBwYXIpOwoJY3J0Yy0+aF9zeW5jX3N0cnRfd2lkID0gYXR5X2xkX2xlMzIoQ1JUQ19IX1NZTkNfU1RSVF9XSUQsIHBhcik7CgljcnRjLT52X3RvdF9kaXNwID0gYXR5X2xkX2xlMzIoQ1JUQ19WX1RPVEFMX0RJU1AsIHBhcik7CgljcnRjLT52X3N5bmNfc3RydF93aWQgPSBhdHlfbGRfbGUzMihDUlRDX1ZfU1lOQ19TVFJUX1dJRCwgcGFyKTsKCWNydGMtPnZsaW5lX2NybnRfdmxpbmUgPSBhdHlfbGRfbGUzMihDUlRDX1ZMSU5FX0NSTlRfVkxJTkUsIHBhcik7CgljcnRjLT5vZmZfcGl0Y2ggPSBhdHlfbGRfbGUzMihDUlRDX09GRl9QSVRDSCwgcGFyKTsKCWNydGMtPmdlbl9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKTsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCS8qIHN3aXRjaCB0byBzaGFkb3cgcmVnaXN0ZXJzICovCgkJYXR5X3N0X2xjZChMQ0RfR0VOX0NOVEwsIChjcnRjLT5sY2RfZ2VuX2NudGwgJiB+Q1JUQ19SV19TRUxFQ1QpIHwKCQkJU0hBRE9XX0VOIHwgU0hBRE9XX1JXX0VOLCBwYXIpOwoKCQljcnRjLT5zaGFkb3dfaF90b3RfZGlzcCA9IGF0eV9sZF9sZTMyKENSVENfSF9UT1RBTF9ESVNQLCBwYXIpOwoJCWNydGMtPnNoYWRvd19oX3N5bmNfc3RydF93aWQgPSBhdHlfbGRfbGUzMihDUlRDX0hfU1lOQ19TVFJUX1dJRCwgcGFyKTsKCQljcnRjLT5zaGFkb3dfdl90b3RfZGlzcCA9IGF0eV9sZF9sZTMyKENSVENfVl9UT1RBTF9ESVNQLCBwYXIpOwoJCWNydGMtPnNoYWRvd192X3N5bmNfc3RydF93aWQgPSBhdHlfbGRfbGUzMihDUlRDX1ZfU1lOQ19TVFJUX1dJRCwgcGFyKTsKCgkJYXR5X3N0X2xlMzIoTENEX0dFTl9DTlRMLCBjcnRjLT5sY2RfZ2VuX2NudGwsIHBhcik7Cgl9CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEICovCn0KCnN0YXRpYyB2b2lkIGF0eV9zZXRfY3J0Yyhjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGNvbnN0IHN0cnVjdCBjcnRjICpjcnRjKQp7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCS8qIHN0b3AgQ1JUQyAqLwoJCWF0eV9zdF9sZTMyKENSVENfR0VOX0NOVEwsIGNydGMtPmdlbl9jbnRsICYgfihDUlRDX0VYVF9ESVNQX0VOIHwgQ1JUQ19FTiksIHBhcik7CgoJCS8qIHVwZGF0ZSBub24tc2hhZG93IHJlZ2lzdGVycyBmaXJzdCAqLwoJCWF0eV9zdF9sY2QoQ09ORklHX1BBTkVMLCBjcnRjLT5sY2RfY29uZmlnX3BhbmVsLCBwYXIpOwoJCWF0eV9zdF9sY2QoTENEX0dFTl9DTlRMLCBjcnRjLT5sY2RfZ2VuX2NudGwgJgoJCQl+KENSVENfUldfU0VMRUNUIHwgU0hBRE9XX0VOIHwgU0hBRE9XX1JXX0VOKSwgcGFyKTsKCgkJLyogdGVtcG9yYXJpbHkgZGlzYWJsZSBzdHJldGNoaW5nICovCgkJYXR5X3N0X2xjZChIT1JaX1NUUkVUQ0hJTkcsCgkJCWNydGMtPmhvcnpfc3RyZXRjaGluZyAmCgkJCX4oSE9SWl9TVFJFVENIX01PREUgfCBIT1JaX1NUUkVUQ0hfRU4pLCBwYXIpOwoJCWF0eV9zdF9sY2QoVkVSVF9TVFJFVENISU5HLAoJCQljcnRjLT52ZXJ0X3N0cmV0Y2hpbmcgJgoJCQl+KFZFUlRfU1RSRVRDSF9SQVRJTzEgfCBWRVJUX1NUUkVUQ0hfUkFUSU8yIHwKCQkJVkVSVF9TVFJFVENIX1VTRTAgfCBWRVJUX1NUUkVUQ0hfRU4pLCBwYXIpOwoJfQojZW5kaWYKCS8qIHR1cm4gb2ZmIENSVCAqLwoJYXR5X3N0X2xlMzIoQ1JUQ19HRU5fQ05UTCwgY3J0Yy0+Z2VuX2NudGwgJiB+Q1JUQ19FTiwgcGFyKTsKCglEUFJJTlRLKCJzZXR0aW5nIHVwIENSVENcbiIpOwoJRFBSSU5USygic2V0IHByaW1hcnkgQ1JUIHRvICVpeCVpICVjJWMgY29tcG9zaXRlICVjXG4iLAoJICAgICgoKChjcnRjLT5oX3RvdF9kaXNwPj4xNikgJiAweGZmKSArIDEpPDwzKSwgKCgoY3J0Yy0+dl90b3RfZGlzcD4+MTYpICYgMHg3ZmYpICsgMSksCgkgICAgKGNydGMtPmhfc3luY19zdHJ0X3dpZCAmIDB4MjAwMDAwKT8nTic6J1AnLCAoY3J0Yy0+dl9zeW5jX3N0cnRfd2lkICYgMHgyMDAwMDApPydOJzonUCcsCgkgICAgKGNydGMtPmdlbl9jbnRsICYgQ1JUQ19DU1lOQ19FTik/J1AnOidOJyk7CgoJRFBSSU5USygiQ1JUQ19IX1RPVEFMX0RJU1A6ICV4XG4iLGNydGMtPmhfdG90X2Rpc3ApOwoJRFBSSU5USygiQ1JUQ19IX1NZTkNfU1RSVF9XSUQ6ICV4XG4iLGNydGMtPmhfc3luY19zdHJ0X3dpZCk7CglEUFJJTlRLKCJDUlRDX1ZfVE9UQUxfRElTUDogJXhcbiIsY3J0Yy0+dl90b3RfZGlzcCk7CglEUFJJTlRLKCJDUlRDX1ZfU1lOQ19TVFJUX1dJRDogJXhcbiIsY3J0Yy0+dl9zeW5jX3N0cnRfd2lkKTsKCURQUklOVEsoIkNSVENfT0ZGX1BJVENIOiAleFxuIiwgY3J0Yy0+b2ZmX3BpdGNoKTsKCURQUklOVEsoIkNSVENfVkxJTkVfQ1JOVF9WTElORTogJXhcbiIsIGNydGMtPnZsaW5lX2NybnRfdmxpbmUpOwoJRFBSSU5USygiQ1JUQ19HRU5fQ05UTDogJXhcbiIsY3J0Yy0+Z2VuX2NudGwpOwoKCWF0eV9zdF9sZTMyKENSVENfSF9UT1RBTF9ESVNQLCBjcnRjLT5oX3RvdF9kaXNwLCBwYXIpOwoJYXR5X3N0X2xlMzIoQ1JUQ19IX1NZTkNfU1RSVF9XSUQsIGNydGMtPmhfc3luY19zdHJ0X3dpZCwgcGFyKTsKCWF0eV9zdF9sZTMyKENSVENfVl9UT1RBTF9ESVNQLCBjcnRjLT52X3RvdF9kaXNwLCBwYXIpOwoJYXR5X3N0X2xlMzIoQ1JUQ19WX1NZTkNfU1RSVF9XSUQsIGNydGMtPnZfc3luY19zdHJ0X3dpZCwgcGFyKTsKCWF0eV9zdF9sZTMyKENSVENfT0ZGX1BJVENILCBjcnRjLT5vZmZfcGl0Y2gsIHBhcik7CglhdHlfc3RfbGUzMihDUlRDX1ZMSU5FX0NSTlRfVkxJTkUsIGNydGMtPnZsaW5lX2NybnRfdmxpbmUsIHBhcik7CgoJYXR5X3N0X2xlMzIoQ1JUQ19HRU5fQ05UTCwgY3J0Yy0+Z2VuX2NudGwsIHBhcik7CiNpZiAwCglGSVhNRQoJaWYgKHBhci0+YWNjZWxfZmxhZ3MgJiBGQl9BQ0NFTEZfVEVYVCkKCQlhdHlfaW5pdF9lbmdpbmUocGFyLCBpbmZvKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECgkvKiBhZnRlciBzZXR0aW5nIHRoZSBDUlRDIHJlZ2lzdGVycyB3ZSBzaG91bGQgc2V0IHRoZSBMQ0QgcmVnaXN0ZXJzLiAqLwoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQkvKiBzd2l0Y2ggdG8gc2hhZG93IHJlZ2lzdGVycyAqLwoJCWF0eV9zdF9sY2QoTENEX0dFTl9DTlRMLCAoY3J0Yy0+bGNkX2dlbl9jbnRsICYgfkNSVENfUldfU0VMRUNUKSB8CgkJCShTSEFET1dfRU4gfCBTSEFET1dfUldfRU4pLCBwYXIpOwoKCQlEUFJJTlRLKCJzZXQgc2hhZG93IENSVCB0byAlaXglaSAlYyVjXG4iLAoJCSAgICAoKCgoY3J0Yy0+c2hhZG93X2hfdG90X2Rpc3A+PjE2KSAmIDB4ZmYpICsgMSk8PDMpLCAoKChjcnRjLT5zaGFkb3dfdl90b3RfZGlzcD4+MTYpICYgMHg3ZmYpICsgMSksCgkJICAgIChjcnRjLT5zaGFkb3dfaF9zeW5jX3N0cnRfd2lkICYgMHgyMDAwMDApPydOJzonUCcsIChjcnRjLT5zaGFkb3dfdl9zeW5jX3N0cnRfd2lkICYgMHgyMDAwMDApPydOJzonUCcpOwoKCQlEUFJJTlRLKCJTSEFET1cgQ1JUQ19IX1RPVEFMX0RJU1A6ICV4XG4iLCBjcnRjLT5zaGFkb3dfaF90b3RfZGlzcCk7CgkJRFBSSU5USygiU0hBRE9XIENSVENfSF9TWU5DX1NUUlRfV0lEOiAleFxuIiwgY3J0Yy0+c2hhZG93X2hfc3luY19zdHJ0X3dpZCk7CgkJRFBSSU5USygiU0hBRE9XIENSVENfVl9UT1RBTF9ESVNQOiAleFxuIiwgY3J0Yy0+c2hhZG93X3ZfdG90X2Rpc3ApOwoJCURQUklOVEsoIlNIQURPVyBDUlRDX1ZfU1lOQ19TVFJUX1dJRDogJXhcbiIsIGNydGMtPnNoYWRvd192X3N5bmNfc3RydF93aWQpOwoKCQlhdHlfc3RfbGUzMihDUlRDX0hfVE9UQUxfRElTUCwgY3J0Yy0+c2hhZG93X2hfdG90X2Rpc3AsIHBhcik7CgkJYXR5X3N0X2xlMzIoQ1JUQ19IX1NZTkNfU1RSVF9XSUQsIGNydGMtPnNoYWRvd19oX3N5bmNfc3RydF93aWQsIHBhcik7CgkJYXR5X3N0X2xlMzIoQ1JUQ19WX1RPVEFMX0RJU1AsIGNydGMtPnNoYWRvd192X3RvdF9kaXNwLCBwYXIpOwoJCWF0eV9zdF9sZTMyKENSVENfVl9TWU5DX1NUUlRfV0lELCBjcnRjLT5zaGFkb3dfdl9zeW5jX3N0cnRfd2lkLCBwYXIpOwoKCQkvKiByZXN0b3JlIENSVEMgc2VsZWN0aW9uICYgc2hhZG93IHN0YXRlIGFuZCBlbmFibGUgc3RyZXRjaGluZyAqLwoJCURQUklOVEsoIkxDRF9HRU5fQ05UTDogJXhcbiIsIGNydGMtPmxjZF9nZW5fY250bCk7CgkJRFBSSU5USygiSE9SWl9TVFJFVENISU5HOiAleFxuIiwgY3J0Yy0+aG9yel9zdHJldGNoaW5nKTsKCQlEUFJJTlRLKCJWRVJUX1NUUkVUQ0hJTkc6ICV4XG4iLCBjcnRjLT52ZXJ0X3N0cmV0Y2hpbmcpOwoJCWlmKCFNNjRfSEFTKExUX0xDRF9SRUdTKSkKCQkgICAgRFBSSU5USygiRVhUX1ZFUlRfU1RSRVRDSDogJXhcbiIsIGNydGMtPmV4dF92ZXJ0X3N0cmV0Y2gpOwoKCQlhdHlfc3RfbGNkKExDRF9HRU5fQ05UTCwgY3J0Yy0+bGNkX2dlbl9jbnRsLCBwYXIpOwoJCWF0eV9zdF9sY2QoSE9SWl9TVFJFVENISU5HLCBjcnRjLT5ob3J6X3N0cmV0Y2hpbmcsIHBhcik7CgkJYXR5X3N0X2xjZChWRVJUX1NUUkVUQ0hJTkcsIGNydGMtPnZlcnRfc3RyZXRjaGluZywgcGFyKTsKCQlpZighTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQkgICAgYXR5X3N0X2xjZChFWFRfVkVSVF9TVFJFVENILCBjcnRjLT5leHRfdmVydF9zdHJldGNoLCBwYXIpOwoJCSAgICBhdHlfbGRfbGUzMihMQ0RfSU5ERVgsIHBhcik7CgkJICAgIGF0eV9zdF9sZTMyKExDRF9JTkRFWCwgY3J0Yy0+bGNkX2luZGV4LCBwYXIpOwoJCX0KCX0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgKi8KfQoKc3RhdGljIGludCBhdHlfdmFyX3RvX2NydGMoY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8sCgljb25zdCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGNydGMgKmNydGMpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCXUzMiB4cmVzLCB5cmVzLCB2eHJlcywgdnlyZXMsIHhvZmZzZXQsIHlvZmZzZXQsIGJwcDsKCXUzMiBzeW5jLCB2bW9kZSwgdmRpc3BsYXk7Cgl1MzIgaF90b3RhbCwgaF9kaXNwLCBoX3N5bmNfc3RydCwgaF9zeW5jX2VuZCwgaF9zeW5jX2RseSwgaF9zeW5jX3dpZCwgaF9zeW5jX3BvbDsKCXUzMiB2X3RvdGFsLCB2X2Rpc3AsIHZfc3luY19zdHJ0LCB2X3N5bmNfZW5kLCB2X3N5bmNfd2lkLCB2X3N5bmNfcG9sLCBjX3N5bmM7Cgl1MzIgcGl4X3dpZHRoLCBkcF9waXhfd2lkdGgsIGRwX2NoYWluX21hc2s7CgoJLyogaW5wdXQgKi8KCXhyZXMgPSB2YXItPnhyZXM7Cgl5cmVzID0gdmFyLT55cmVzOwoJdnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbDsKCXZ5cmVzID0gdmFyLT55cmVzX3ZpcnR1YWw7Cgl4b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OwoJeW9mZnNldCA9IHZhci0+eW9mZnNldDsKCWJwcCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7CglpZiAoYnBwID09IDE2KQoJCWJwcCA9ICh2YXItPmdyZWVuLmxlbmd0aCA9PSA1KSA/IDE1IDogMTY7CglzeW5jID0gdmFyLT5zeW5jOwoJdm1vZGUgPSB2YXItPnZtb2RlOwoKCS8qIGNvbnZlcnQgKGFuZCByb3VuZCB1cCkgYW5kIHZhbGlkYXRlICovCglpZiAodnhyZXMgPCB4cmVzICsgeG9mZnNldCkKCQl2eHJlcyA9IHhyZXMgKyB4b2Zmc2V0OwoJaF9kaXNwID0geHJlczsKCglpZiAodnlyZXMgPCB5cmVzICsgeW9mZnNldCkKCQl2eXJlcyA9IHlyZXMgKyB5b2Zmc2V0OwoJdl9kaXNwID0geXJlczsKCglpZiAoYnBwIDw9IDgpIHsKCQlicHAgPSA4OwoJCXBpeF93aWR0aCA9IENSVENfUElYX1dJRFRIXzhCUFA7CgkJZHBfcGl4X3dpZHRoID0KCQkgICAgSE9TVF84QlBQIHwgU1JDXzhCUFAgfCBEU1RfOEJQUCB8CgkJICAgIEJZVEVfT1JERVJfTFNCX1RPX01TQjsKCQlkcF9jaGFpbl9tYXNrID0gRFBfQ0hBSU5fOEJQUDsKCX0gZWxzZSBpZiAoYnBwIDw9IDE1KSB7CgkJYnBwID0gMTY7CgkJcGl4X3dpZHRoID0gQ1JUQ19QSVhfV0lEVEhfMTVCUFA7CgkJZHBfcGl4X3dpZHRoID0gSE9TVF8xNUJQUCB8IFNSQ18xNUJQUCB8IERTVF8xNUJQUCB8CgkJICAgIEJZVEVfT1JERVJfTFNCX1RPX01TQjsKCQlkcF9jaGFpbl9tYXNrID0gRFBfQ0hBSU5fMTVCUFA7Cgl9IGVsc2UgaWYgKGJwcCA8PSAxNikgewoJCWJwcCA9IDE2OwoJCXBpeF93aWR0aCA9IENSVENfUElYX1dJRFRIXzE2QlBQOwoJCWRwX3BpeF93aWR0aCA9IEhPU1RfMTZCUFAgfCBTUkNfMTZCUFAgfCBEU1RfMTZCUFAgfAoJCSAgICBCWVRFX09SREVSX0xTQl9UT19NU0I7CgkJZHBfY2hhaW5fbWFzayA9IERQX0NIQUlOXzE2QlBQOwoJfSBlbHNlIGlmIChicHAgPD0gMjQgJiYgTTY0X0hBUyhJTlRFR1JBVEVEKSkgewoJCWJwcCA9IDI0OwoJCXBpeF93aWR0aCA9IENSVENfUElYX1dJRFRIXzI0QlBQOwoJCWRwX3BpeF93aWR0aCA9CgkJICAgIEhPU1RfOEJQUCB8IFNSQ184QlBQIHwgRFNUXzhCUFAgfAoJCSAgICBCWVRFX09SREVSX0xTQl9UT19NU0I7CgkJZHBfY2hhaW5fbWFzayA9IERQX0NIQUlOXzI0QlBQOwoJfSBlbHNlIGlmIChicHAgPD0gMzIpIHsKCQlicHAgPSAzMjsKCQlwaXhfd2lkdGggPSBDUlRDX1BJWF9XSURUSF8zMkJQUDsKCQlkcF9waXhfd2lkdGggPSBIT1NUXzMyQlBQIHwgU1JDXzMyQlBQIHwgRFNUXzMyQlBQIHwKCQkgICAgQllURV9PUkRFUl9MU0JfVE9fTVNCOwoJCWRwX2NoYWluX21hc2sgPSBEUF9DSEFJTl8zMkJQUDsKCX0gZWxzZQoJCUZBSUwoImludmFsaWQgYnBwIik7CgoJaWYgKHZ4cmVzICogdnlyZXMgKiBicHAgLyA4ID4gaW5mby0+Zml4LnNtZW1fbGVuKQoJCUZBSUwoIm5vdCBlbm91Z2ggdmlkZW8gUkFNIik7CgoJaF9zeW5jX3BvbCA9IHN5bmMgJiBGQl9TWU5DX0hPUl9ISUdIX0FDVCA/IDAgOiAxOwoJdl9zeW5jX3BvbCA9IHN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QgPyAwIDogMTsKCglpZigoeHJlcyA+IDE2MDApIHx8ICh5cmVzID4gMTIwMCkpIHsKCQlGQUlMKCJNQUNINjQgY2hpcHMgYXJlIGRlc2lnbmVkIGZvciBtYXggMTYwMHgxMjAwXG4iCgkJInNlbGVjdCBhbm90ZXIgcmVzb2x1dGlvbi4iKTsKCX0KCWhfc3luY19zdHJ0ID0gaF9kaXNwICsgdmFyLT5yaWdodF9tYXJnaW47CgloX3N5bmNfZW5kID0gaF9zeW5jX3N0cnQgKyB2YXItPmhzeW5jX2xlbjsKCWhfc3luY19kbHkgID0gdmFyLT5yaWdodF9tYXJnaW4gJiA3OwoJaF90b3RhbCA9IGhfc3luY19lbmQgKyBoX3N5bmNfZGx5ICsgdmFyLT5sZWZ0X21hcmdpbjsKCgl2X3N5bmNfc3RydCA9IHZfZGlzcCArIHZhci0+bG93ZXJfbWFyZ2luOwoJdl9zeW5jX2VuZCA9IHZfc3luY19zdHJ0ICsgdmFyLT52c3luY19sZW47Cgl2X3RvdGFsID0gdl9zeW5jX2VuZCArIHZhci0+dXBwZXJfbWFyZ2luOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJaWYoIU02NF9IQVMoTFRfTENEX1JFR1MpKSB7CgkJICAgIHUzMiBsY2RfaW5kZXggPSBhdHlfbGRfbGUzMihMQ0RfSU5ERVgsIHBhcik7CgkJICAgIGNydGMtPmxjZF9pbmRleCA9IGxjZF9pbmRleCAmCgkJCX4oTENEX0lOREVYX01BU0sgfCBMQ0RfRElTUExBWV9ESVMgfCBMQ0RfU1JDX1NFTCB8IENSVEMyX0RJU1BMQVlfRElTKTsKCQkgICAgYXR5X3N0X2xlMzIoTENEX0lOREVYLCBsY2RfaW5kZXgsIHBhcik7CgkJfQoKCQlpZiAoIU02NF9IQVMoTU9CSUxfQlVTKSkKCQkJY3J0Yy0+bGNkX2luZGV4IHw9IENSVEMyX0RJU1BMQVlfRElTOwoKCQljcnRjLT5sY2RfY29uZmlnX3BhbmVsID0gYXR5X2xkX2xjZChDT05GSUdfUEFORUwsIHBhcikgfCAweDQwMDA7CgkJY3J0Yy0+bGNkX2dlbl9jbnRsID0gYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcikgJiB+Q1JUQ19SV19TRUxFQ1Q7CgoJCWNydGMtPmxjZF9nZW5fY250bCAmPQoJCQl+KEhPUlpfRElWQlkyX0VOIHwgRElTX0hPUl9DUlRfRElWQlkyIHwgVFZDTEtfUE1fRU4gfAoJCQkvKlZDTEtfREFDX1BNX0VOIHwgVVNFX1NIQURPV0VEX1ZFTkQgfCovCgkJCVVTRV9TSEFET1dFRF9ST1dDVVIgfCBTSEFET1dfRU4gfCBTSEFET1dfUldfRU4pOwoJCWNydGMtPmxjZF9nZW5fY250bCB8PSBET05UX1NIQURPV19WUEFSIHwgTE9DS184RE9UOwoKCQlpZigoY3J0Yy0+bGNkX2dlbl9jbnRsICYgTENEX09OKSAmJgoJCQkoKHhyZXMgPiBwYXItPmxjZF93aWR0aCkgfHwgKHlyZXMgPiBwYXItPmxjZF9oZWlnaHQpKSkgewoJCQkvKiBXZSBjYW5ub3QgZGlzcGxheSB0aGUgbW9kZSBvbiB0aGUgTENELiBJZiB0aGUgQ1JUIGlzIGVuYWJsZWQKCQkJICAgd2UgY2FuIHR1cm4gb2ZmIHRoZSBMQ0QuCgkJCSAgIElmIHRoZSBDUlQgaXMgb2ZmLCBpdCBpc24ndCBhIGdvb2QgaWRlYSB0byBzd2l0Y2ggaXQgb247IHdlIGRvbid0CgkJCSAgIGtub3cgaWYgb25lIGlzIGNvbm5lY3RlZC4gU28gaXQncyBiZXR0ZXIgdG8gZmFpbCB0aGVuLgoJCQkgKi8KCQkJaWYgKGNydGMtPmxjZF9nZW5fY250bCAmIENSVF9PTikgewoJCQkJaWYgKCEodmFyLT5hY3RpdmF0ZSAmIEZCX0FDVElWQVRFX1RFU1QpKQoJCQkJCVBSSU5US0koIkRpc2FibGUgTENEIHBhbmVsLCBiZWNhdXNlIHZpZGVvIG1vZGUgZG9lcyBub3QgZml0LlxuIik7CgkJCQljcnRjLT5sY2RfZ2VuX2NudGwgJj0gfkxDRF9PTjsKCQkJCS8qYXR5X3N0X2xjZChMQ0RfR0VOX0NOVEwsIGNydGMtPmxjZF9nZW5fY250bCwgcGFyKTsqLwoJCQl9IGVsc2UgewoJCQkJaWYgKCEodmFyLT5hY3RpdmF0ZSAmIEZCX0FDVElWQVRFX1RFU1QpKQoJCQkJCVBSSU5US0UoIlZpZGVvIG1vZGUgZXhjZWVkcyBzaXplIG9mIExDRCBwYW5lbC5cbkNvbm5lY3QgdGhpcyBjb21wdXRlciB0byBhIGNvbnZlbnRpb25hbCBtb25pdG9yIGlmIHlvdSByZWFsbHkgbmVlZCB0aGlzIG1vZGUuXG4iKTsKCQkJCXJldHVybiAtRUlOVkFMOwoJCQl9CgkJfQoJfQoKCWlmICgocGFyLT5sY2RfdGFibGUgIT0gMCkgJiYgKGNydGMtPmxjZF9nZW5fY250bCAmIExDRF9PTikpIHsKCQlpbnQgVlNjYW4gPSAxOwoJCS8qIGJwcCAtPiBieXRlc3BwLCAxLDQgLT4gMDsgOCAtPiAyOyAxNSwxNiAtPiAxOyAyNCAtPiA2OyAzMiAtPiA1CgkJY29uc3QgdTggREZQX2hfc3luY19kbHlfTFRbXSA9IHsgMCwgMiwgMSwgNiwgNSB9OwoJCWNvbnN0IHU4IEFERF90b19zdHJ0X3dpZF9hbmRfZGx5X0xUX0RBQ1tdID0geyAwLCA1LCA2LCA5LCA5LCAxMiwgMTIgfTsgICovCgoJCXZtb2RlICY9IH4oRkJfVk1PREVfRE9VQkxFIHwgRkJfVk1PREVfSU5URVJMQUNFRCk7CgoJCS8qIFRoaXMgaXMgaG9ycm9yISBXaGVuIHdlIHNpbXVsYXRlLCBzYXkgNjQweDQ4MCBvbiBhbiA4MDB4NjAwCgkJICAgTENEIG1vbml0b3IsIHRoZSBDUlRDIHNob3VsZCBiZSBwcm9ncmFtbWVkIDgwMHg2MDAgdmFsdWVzIGZvcgoJCSAgIHRoZSBub24gdmlzaWJsZSBwYXJ0LCBidXQgNjQweDQ4MCBmb3IgdGhlIHZpc2libGUgcGFydC4KCQkgICBUaGlzIGNvZGUgaGFzIGJlZW4gdGVzdGVkIG9uIGEgbGFwdG9wIHdpdGggaXQncyAxNDAweDEwNTAgTENECgkJICAgbW9uaXRvciBhbmQgYSBjb252ZW50aW9uYWwgbW9uaXRvciBib3RoIHN3aXRjaGVkIG9uLgoJCSAgIFRlc3RlZCBtb2RlczogMTI4MHgxMDI0LCAxMTUyeDg2NCwgMTAyNHg3NjgsIDgwMHg2MDAsCgkJICAgIHdvcmtzIHdpdGggbGl0dGxlIGdsaXRjaGVzIGFsc28gd2l0aCBET1VCTEVTQ0FOIG1vZGVzCgkJICovCgkJaWYgKHlyZXMgPCBwYXItPmxjZF9oZWlnaHQpIHsKCQkJVlNjYW4gPSBwYXItPmxjZF9oZWlnaHQgLyB5cmVzOwoJCQlpZihWU2NhbiA+IDEpIHsKCQkJCVZTY2FuID0gMjsKCQkJCXZtb2RlIHw9IEZCX1ZNT0RFX0RPVUJMRTsKCQkJfQoJCX0KCgkJaF9zeW5jX3N0cnQgPSBoX2Rpc3AgKyBwYXItPmxjZF9yaWdodF9tYXJnaW47CgkJaF9zeW5jX2VuZCA9IGhfc3luY19zdHJ0ICsgcGFyLT5sY2RfaHN5bmNfbGVuOwoJCWhfc3luY19kbHkgPSAvKkRGUF9oX3N5bmNfZGx5WyAoIGJwcCArIDEgKSAvIDMgXTsgKi9wYXItPmxjZF9oc3luY19kbHk7CgkJaF90b3RhbCA9IGhfZGlzcCArIHBhci0+bGNkX2hibGFua19sZW47CgoJCXZfc3luY19zdHJ0ID0gdl9kaXNwICsgcGFyLT5sY2RfbG93ZXJfbWFyZ2luIC8gVlNjYW47CgkJdl9zeW5jX2VuZCA9IHZfc3luY19zdHJ0ICsgcGFyLT5sY2RfdnN5bmNfbGVuIC8gVlNjYW47CgkJdl90b3RhbCA9IHZfZGlzcCArIHBhci0+bGNkX3ZibGFua19sZW4gLyBWU2NhbjsKCX0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgKi8KCgloX2Rpc3AgPSAoaF9kaXNwID4+IDMpIC0gMTsKCWhfc3luY19zdHJ0ID0gKGhfc3luY19zdHJ0ID4+IDMpIC0gMTsKCWhfc3luY19lbmQgPSAoaF9zeW5jX2VuZCA+PiAzKSAtIDE7CgloX3RvdGFsID0gKGhfdG90YWwgPj4gMykgLSAxOwoJaF9zeW5jX3dpZCA9IGhfc3luY19lbmQgLSBoX3N5bmNfc3RydDsKCglGQUlMX01BWCgiaF9kaXNwIHRvbyBsYXJnZSIsIGhfZGlzcCwgMHhmZik7CglGQUlMX01BWCgiaF9zeW5jX3N0cnQgdG9vIGxhcmdlIiwgaF9zeW5jX3N0cnQsIDB4MWZmKTsKCS8qRkFJTF9NQVgoImhfc3luY193aWQgdG9vIGxhcmdlIiwgaF9zeW5jX3dpZCwgMHgxZik7Ki8KCWlmKGhfc3luY193aWQgPiAweDFmKQoJCWhfc3luY193aWQgPSAweDFmOwoJRkFJTF9NQVgoImhfdG90YWwgdG9vIGxhcmdlIiwgaF90b3RhbCwgMHgxZmYpOwoKCWlmICh2bW9kZSAmIEZCX1ZNT0RFX0RPVUJMRSkgewoJCXZfZGlzcCA8PD0gMTsKCQl2X3N5bmNfc3RydCA8PD0gMTsKCQl2X3N5bmNfZW5kIDw8PSAxOwoJCXZfdG90YWwgPDw9IDE7Cgl9CgoJdmRpc3BsYXkgPSB5cmVzOwojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJaWYgKChwYXItPmxjZF90YWJsZSAhPSAwKSAmJiAoY3J0Yy0+bGNkX2dlbl9jbnRsICYgTENEX09OKSkKCQl2ZGlzcGxheSAgPSBwYXItPmxjZF9oZWlnaHQ7CiNlbmRpZgoKCXZfZGlzcC0tOwoJdl9zeW5jX3N0cnQtLTsKCXZfc3luY19lbmQtLTsKCXZfdG90YWwtLTsKCXZfc3luY193aWQgPSB2X3N5bmNfZW5kIC0gdl9zeW5jX3N0cnQ7CgoJRkFJTF9NQVgoInZfZGlzcCB0b28gbGFyZ2UiLCB2X2Rpc3AsIDB4N2ZmKTsKCUZBSUxfTUFYKCJ2X3N5bmNfc3RzcnQgdG9vIGxhcmdlIiwgdl9zeW5jX3N0cnQsIDB4N2ZmKTsKCS8qRkFJTF9NQVgoInZfc3luY193aWQgdG9vIGxhcmdlIiwgdl9zeW5jX3dpZCwgMHgxZik7Ki8KCWlmKHZfc3luY193aWQgPiAweDFmKQoJCXZfc3luY193aWQgPSAweDFmOwoJRkFJTF9NQVgoInZfdG90YWwgdG9vIGxhcmdlIiwgdl90b3RhbCwgMHg3ZmYpOwoKCWNfc3luYyA9IHN5bmMgJiBGQl9TWU5DX0NPTVBfSElHSF9BQ1QgPyBDUlRDX0NTWU5DX0VOIDogMDsKCgkvKiBvdXRwdXQgKi8KCWNydGMtPnZ4cmVzID0gdnhyZXM7CgljcnRjLT52eXJlcyA9IHZ5cmVzOwoJY3J0Yy0+eG9mZnNldCA9IHhvZmZzZXQ7CgljcnRjLT55b2Zmc2V0ID0geW9mZnNldDsKCWNydGMtPmJwcCA9IGJwcDsKCWNydGMtPm9mZl9waXRjaCA9ICgoeW9mZnNldCp2eHJlcyt4b2Zmc2V0KSpicHAvNjQpIHwgKHZ4cmVzPDwxOSk7CgljcnRjLT52bGluZV9jcm50X3ZsaW5lID0gMDsKCgljcnRjLT5oX3RvdF9kaXNwID0gaF90b3RhbCB8IChoX2Rpc3A8PDE2KTsKCWNydGMtPmhfc3luY19zdHJ0X3dpZCA9IChoX3N5bmNfc3RydCAmIDB4ZmYpIHwgKGhfc3luY19kbHk8PDgpIHwKCQkoKGhfc3luY19zdHJ0ICYgMHgxMDApPDw0KSB8IChoX3N5bmNfd2lkPDwxNikgfCAoaF9zeW5jX3BvbDw8MjEpOwoJY3J0Yy0+dl90b3RfZGlzcCA9IHZfdG90YWwgfCAodl9kaXNwPDwxNik7CgljcnRjLT52X3N5bmNfc3RydF93aWQgPSB2X3N5bmNfc3RydCB8ICh2X3N5bmNfd2lkPDwxNikgfCAodl9zeW5jX3BvbDw8MjEpOwoKCS8qIGNydGMtPmdlbl9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKSAmIENSVENfUFJFU0VSVkVEX01BU0s7ICovCgljcnRjLT5nZW5fY250bCA9IENSVENfRVhUX0RJU1BfRU4gfCBDUlRDX0VOIHwgcGl4X3dpZHRoIHwgY19zeW5jOwoJY3J0Yy0+Z2VuX2NudGwgfD0gQ1JUQ19WR0FfTElORUFSOwoKCS8qIEVuYWJsZSBkb3VibGVzY2FuIG1vZGUgaWYgcmVxdWVzdGVkICovCglpZiAodm1vZGUgJiBGQl9WTU9ERV9ET1VCTEUpCgkJY3J0Yy0+Z2VuX2NudGwgfD0gQ1JUQ19EQkxfU0NBTl9FTjsKCS8qIEVuYWJsZSBpbnRlcmxhY2VkIG1vZGUgaWYgcmVxdWVzdGVkICovCglpZiAodm1vZGUgJiBGQl9WTU9ERV9JTlRFUkxBQ0VEKQoJCWNydGMtPmdlbl9jbnRsIHw9IENSVENfSU5URVJMQUNFX0VOOwojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQl2ZGlzcGxheSA9IHlyZXM7CgkJaWYodm1vZGUgJiBGQl9WTU9ERV9ET1VCTEUpCgkJCXZkaXNwbGF5IDw8PSAxOwoJCWNydGMtPmdlbl9jbnRsICY9IH4oQ1JUQzJfRU4gfCBDUlRDMl9QSVhfV0lEVEgpOwoJCWNydGMtPmxjZF9nZW5fY250bCAmPSB+KEhPUlpfRElWQlkyX0VOIHwgRElTX0hPUl9DUlRfRElWQlkyIHwKCQkJLypUVkNMS19QTV9FTiB8IFZDTEtfREFDX1BNX0VOIHwqLwoJCQlVU0VfU0hBRE9XRURfVkVORCB8IFVTRV9TSEFET1dFRF9ST1dDVVIgfCBTSEFET1dfRU4gfCBTSEFET1dfUldfRU4pOwoJCWNydGMtPmxjZF9nZW5fY250bCB8PSAoRE9OVF9TSEFET1dfVlBBUi8qIHwgTE9DS184RE9UKi8pOwoKCQkvKiBNT0JJTElUWSBNMSB0ZXN0ZWQsIEZJWE1FOiBMVCAqLwoJCWNydGMtPmhvcnpfc3RyZXRjaGluZyA9IGF0eV9sZF9sY2QoSE9SWl9TVFJFVENISU5HLCBwYXIpOwoJCWlmICghTTY0X0hBUyhMVF9MQ0RfUkVHUykpCgkJCWNydGMtPmV4dF92ZXJ0X3N0cmV0Y2ggPSBhdHlfbGRfbGNkKEVYVF9WRVJUX1NUUkVUQ0gsIHBhcikgJgoJCQkJfihBVVRPX1ZFUlRfUkFUSU8gfCBWRVJUX1NUUkVUQ0hfTU9ERSB8IFZFUlRfU1RSRVRDSF9SQVRJTzMpOwoKCQljcnRjLT5ob3J6X3N0cmV0Y2hpbmcgJj0KCQkJfihIT1JaX1NUUkVUQ0hfUkFUSU8gfCBIT1JaX1NUUkVUQ0hfTE9PUCB8IEFVVE9fSE9SWl9SQVRJTyB8CgkJCUhPUlpfU1RSRVRDSF9NT0RFIHwgSE9SWl9TVFJFVENIX0VOKTsKCQlpZiAoeHJlcyA8IHBhci0+bGNkX3dpZHRoICYmIGNydGMtPmxjZF9nZW5fY250bCAmIExDRF9PTikgewoJCQlkbyB7CgkJCQkvKgoJCQkJKiBUaGUgaG9yaXpvbnRhbCBibGVuZGVyIG1pc2JlaGF2ZXMgd2hlbiBIRGlzcGxheSBpcyBsZXNzIHRoYW4gYQoJCQkJKiBhIGNlcnRhaW4gdGhyZXNob2xkICg0NDAgZm9yIGEgMTAyNC13aWRlIHBhbmVsKS4gIEl0IGRvZXNuJ3QKCQkJCSogc3RyZXRjaCBzdWNoIG1vZGVzIGVub3VnaC4gIFVzZSBwaXhlbCByZXBsaWNhdGlvbiBpbnN0ZWFkIG9mCgkJCQkqIGJsZW5kaW5nIHRvIHN0cmV0Y2ggbW9kZXMgdGhhdCBjYW4gYmUgbWFkZSB0byBleGFjdGx5IGZpdCB0aGUKCQkJCSogcGFuZWwgd2lkdGguICBUaGUgdW5kb2N1bWVudGVkICJOb0xDREJsZW5kIiBvcHRpb24gYWxsb3dzIHRoZQoJCQkJKiBwaXhlbC1yZXBsaWNhdGVkIG1vZGUgdG8gYmUgc2xpZ2h0bHkgd2lkZXIgb3IgbmFycm93ZXIgdGhhbiB0aGUKCQkJCSogcGFuZWwgd2lkdGguICBJdCBhbHNvIGNhdXNlcyBhIG1vZGUgdGhhdCBpcyBleGFjdGx5IGhhbGYgYXMgd2lkZQoJCQkJKiBhcyB0aGUgcGFuZWwgdG8gYmUgcGl4ZWwtcmVwbGljYXRlZCwgcmF0aGVyIHRoYW4gYmxlbmRlZC4KCQkJCSovCgkJCQlpbnQgSERpc3BsYXkgID0geHJlcyAmIH43OwoJCQkJaW50IG5TdHJldGNoICA9IHBhci0+bGNkX3dpZHRoIC8gSERpc3BsYXk7CgkJCQlpbnQgUmVtYWluZGVyID0gcGFyLT5sY2Rfd2lkdGggJSBIRGlzcGxheTsKCgkJCQlpZiAoKCFSZW1haW5kZXIgJiYgKChuU3RyZXRjaCA+IDIpKSkgfHwKCQkJCQkoKChIRGlzcGxheSAqIDE2KSAvIHBhci0+bGNkX3dpZHRoKSA8IDcpKSB7CgkJCQkJc3RhdGljIGNvbnN0IGNoYXIgU3RyZXRjaExvb3BzW10gPSB7MTAsIDEyLCAxMywgMTUsIDE2fTsKCQkJCQlpbnQgaG9yel9zdHJldGNoX2xvb3AgPSAtMSwgQmVzdFJlbWFpbmRlcjsKCQkJCQlpbnQgTnVtZXJhdG9yID0gSERpc3BsYXksIERlbm9taW5hdG9yID0gcGFyLT5sY2Rfd2lkdGg7CgkJCQkJaW50IEluZGV4ID0gNTsKCQkJCQlBVElSZWR1Y2VSYXRpbygmTnVtZXJhdG9yLCAmRGVub21pbmF0b3IpOwoKCQkJCQlCZXN0UmVtYWluZGVyID0gKE51bWVyYXRvciAqIDE2KSAvIERlbm9taW5hdG9yOwoJCQkJCXdoaWxlICgtLUluZGV4ID49IDApIHsKCQkJCQkJUmVtYWluZGVyID0gKChEZW5vbWluYXRvciAtIE51bWVyYXRvcikgKiBTdHJldGNoTG9vcHNbSW5kZXhdKSAlCgkJCQkJCQlEZW5vbWluYXRvcjsKCQkJCQkJaWYgKFJlbWFpbmRlciA8IEJlc3RSZW1haW5kZXIpIHsKCQkJCQkJCWhvcnpfc3RyZXRjaF9sb29wID0gSW5kZXg7CgkJCQkJCQlpZiAoIShCZXN0UmVtYWluZGVyID0gUmVtYWluZGVyKSkKCQkJCQkJCQlicmVhazsKCQkJCQkJfQoJCQkJCX0KCgkJCQkJaWYgKChob3J6X3N0cmV0Y2hfbG9vcCA+PSAwKSAmJiAhQmVzdFJlbWFpbmRlcikgewoJCQkJCQlpbnQgaG9yel9zdHJldGNoX3JhdGlvID0gMCwgQWNjdW11bGF0b3IgPSAwOwoJCQkJCQlpbnQgcmV1c2VfcHJldmlvdXMgPSAxOwoKCQkJCQkJSW5kZXggPSBTdHJldGNoTG9vcHNbaG9yel9zdHJldGNoX2xvb3BdOwoKCQkJCQkJd2hpbGUgKC0tSW5kZXggPj0gMCkgewoJCQkJCQkJaWYgKEFjY3VtdWxhdG9yID4gMCkKCQkJCQkJCQlob3J6X3N0cmV0Y2hfcmF0aW8gfD0gcmV1c2VfcHJldmlvdXM7CgkJCQkJCQllbHNlCgkJCQkJCQkJQWNjdW11bGF0b3IgKz0gRGVub21pbmF0b3I7CgkJCQkJCQlBY2N1bXVsYXRvciAtPSBOdW1lcmF0b3I7CgkJCQkJCQlyZXVzZV9wcmV2aW91cyA8PD0gMTsKCQkJCQkJfQoKCQkJCQkJY3J0Yy0+aG9yel9zdHJldGNoaW5nIHw9IChIT1JaX1NUUkVUQ0hfRU4gfAoJCQkJCQkJKChob3J6X3N0cmV0Y2hfbG9vcCAmIEhPUlpfU1RSRVRDSF9MT09QKSA8PCAxNikgfAoJCQkJCQkJKGhvcnpfc3RyZXRjaF9yYXRpbyAmIEhPUlpfU1RSRVRDSF9SQVRJTykpOwoJCQkJCQlicmVhazsgICAgICAvKiBPdXQgb2YgdGhlIGRvIHsgLi4uIH0gd2hpbGUgKDApICovCgkJCQkJfQoJCQkJfQoKCQkJCWNydGMtPmhvcnpfc3RyZXRjaGluZyB8PSAoSE9SWl9TVFJFVENIX01PREUgfCBIT1JaX1NUUkVUQ0hfRU4gfAoJCQkJCSgoKEhEaXNwbGF5ICogKEhPUlpfU1RSRVRDSF9CTEVORCArIDEpKSAvIHBhci0+bGNkX3dpZHRoKSAmIEhPUlpfU1RSRVRDSF9CTEVORCkpOwoJCQl9IHdoaWxlICgwKTsKCQl9CgoJCWlmICh2ZGlzcGxheSA8IHBhci0+bGNkX2hlaWdodCAmJiBjcnRjLT5sY2RfZ2VuX2NudGwgJiBMQ0RfT04pIHsKCQkJY3J0Yy0+dmVydF9zdHJldGNoaW5nID0gKFZFUlRfU1RSRVRDSF9VU0UwIHwgVkVSVF9TVFJFVENIX0VOIHwKCQkJCSgoKHZkaXNwbGF5ICogKFZFUlRfU1RSRVRDSF9SQVRJTzAgKyAxKSkgLyBwYXItPmxjZF9oZWlnaHQpICYgVkVSVF9TVFJFVENIX1JBVElPMCkpOwoKCQkJaWYgKCFNNjRfSEFTKExUX0xDRF9SRUdTKSAmJgoJCQkgICAgeHJlcyA8PSAoTTY0X0hBUyhNT0JJTF9CVVMpPzEwMjQ6ODAwKSkKCQkJCWNydGMtPmV4dF92ZXJ0X3N0cmV0Y2ggfD0gVkVSVF9TVFJFVENIX01PREU7CgkJfSBlbHNlIHsKCQkJLyoKCQkJICogRG9uJ3QgdXNlIHZlcnRpY2FsIGJsZW5kaW5nIGlmIHRoZSBtb2RlIGlzIHRvbyB3aWRlIG9yIG5vdAoJCQkgKiB2ZXJ0aWNhbGx5IHN0cmV0Y2hlZC4KCQkJICovCgkJCWNydGMtPnZlcnRfc3RyZXRjaGluZyA9IDA7CgkJfQoJCS8qIGNvcHkgdG8gc2hhZG93IGNydGMgKi8KCQljcnRjLT5zaGFkb3dfaF90b3RfZGlzcCA9IGNydGMtPmhfdG90X2Rpc3A7CgkJY3J0Yy0+c2hhZG93X2hfc3luY19zdHJ0X3dpZCA9IGNydGMtPmhfc3luY19zdHJ0X3dpZDsKCQljcnRjLT5zaGFkb3dfdl90b3RfZGlzcCA9IGNydGMtPnZfdG90X2Rpc3A7CgkJY3J0Yy0+c2hhZG93X3Zfc3luY19zdHJ0X3dpZCA9IGNydGMtPnZfc3luY19zdHJ0X3dpZDsKCX0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgKi8KCglpZiAoTTY0X0hBUyhNQUdJQ19GSUZPKSkgewoJCS8qIEZJWE1FOiBkaXNwbGF5IEZJRk8gbG93IHdhdGVybWFyayB2YWx1ZXMgKi8KCQljcnRjLT5nZW5fY250bCB8PSAoYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKSAmIENSVENfRklGT19MV00pOwoJfQoJY3J0Yy0+ZHBfcGl4X3dpZHRoID0gZHBfcGl4X3dpZHRoOwoJY3J0Yy0+ZHBfY2hhaW5fbWFzayA9IGRwX2NoYWluX21hc2s7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5X2NydGNfdG9fdmFyKGNvbnN0IHN0cnVjdCBjcnRjICpjcnRjLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKewoJdTMyIHhyZXMsIHlyZXMsIGJwcCwgbGVmdCwgcmlnaHQsIHVwcGVyLCBsb3dlciwgaHNsZW4sIHZzbGVuLCBzeW5jOwoJdTMyIGhfdG90YWwsIGhfZGlzcCwgaF9zeW5jX3N0cnQsIGhfc3luY19kbHksIGhfc3luY193aWQsCgkgICAgaF9zeW5jX3BvbDsKCXUzMiB2X3RvdGFsLCB2X2Rpc3AsIHZfc3luY19zdHJ0LCB2X3N5bmNfd2lkLCB2X3N5bmNfcG9sLCBjX3N5bmM7Cgl1MzIgcGl4X3dpZHRoOwoJdTMyIGRvdWJsZV9zY2FuLCBpbnRlcmxhY2U7CgoJLyogaW5wdXQgKi8KCWhfdG90YWwgPSBjcnRjLT5oX3RvdF9kaXNwICYgMHgxZmY7CgloX2Rpc3AgPSAoY3J0Yy0+aF90b3RfZGlzcCA+PiAxNikgJiAweGZmOwoJaF9zeW5jX3N0cnQgPSAoY3J0Yy0+aF9zeW5jX3N0cnRfd2lkICYgMHhmZikgfCAoKGNydGMtPmhfc3luY19zdHJ0X3dpZCA+PiA0KSAmIDB4MTAwKTsKCWhfc3luY19kbHkgPSAoY3J0Yy0+aF9zeW5jX3N0cnRfd2lkID4+IDgpICYgMHg3OwoJaF9zeW5jX3dpZCA9IChjcnRjLT5oX3N5bmNfc3RydF93aWQgPj4gMTYpICYgMHgxZjsKCWhfc3luY19wb2wgPSAoY3J0Yy0+aF9zeW5jX3N0cnRfd2lkID4+IDIxKSAmIDB4MTsKCXZfdG90YWwgPSBjcnRjLT52X3RvdF9kaXNwICYgMHg3ZmY7Cgl2X2Rpc3AgPSAoY3J0Yy0+dl90b3RfZGlzcCA+PiAxNikgJiAweDdmZjsKCXZfc3luY19zdHJ0ID0gY3J0Yy0+dl9zeW5jX3N0cnRfd2lkICYgMHg3ZmY7Cgl2X3N5bmNfd2lkID0gKGNydGMtPnZfc3luY19zdHJ0X3dpZCA+PiAxNikgJiAweDFmOwoJdl9zeW5jX3BvbCA9IChjcnRjLT52X3N5bmNfc3RydF93aWQgPj4gMjEpICYgMHgxOwoJY19zeW5jID0gY3J0Yy0+Z2VuX2NudGwgJiBDUlRDX0NTWU5DX0VOID8gMSA6IDA7CglwaXhfd2lkdGggPSBjcnRjLT5nZW5fY250bCAmIENSVENfUElYX1dJRFRIX01BU0s7Cglkb3VibGVfc2NhbiA9IGNydGMtPmdlbl9jbnRsICYgQ1JUQ19EQkxfU0NBTl9FTjsKCWludGVybGFjZSA9IGNydGMtPmdlbl9jbnRsICYgQ1JUQ19JTlRFUkxBQ0VfRU47CgoJLyogY29udmVydCAqLwoJeHJlcyA9IChoX2Rpc3AgKyAxKSAqIDg7Cgl5cmVzID0gdl9kaXNwICsgMTsKCWxlZnQgPSAoaF90b3RhbCAtIGhfc3luY19zdHJ0IC0gaF9zeW5jX3dpZCkgKiA4IC0gaF9zeW5jX2RseTsKCXJpZ2h0ID0gKGhfc3luY19zdHJ0IC0gaF9kaXNwKSAqIDggKyBoX3N5bmNfZGx5OwoJaHNsZW4gPSBoX3N5bmNfd2lkICogODsKCXVwcGVyID0gdl90b3RhbCAtIHZfc3luY19zdHJ0IC0gdl9zeW5jX3dpZDsKCWxvd2VyID0gdl9zeW5jX3N0cnQgLSB2X2Rpc3A7Cgl2c2xlbiA9IHZfc3luY193aWQ7CglzeW5jID0gKGhfc3luY19wb2wgPyAwIDogRkJfU1lOQ19IT1JfSElHSF9BQ1QpIHwKCSAgICAodl9zeW5jX3BvbCA/IDAgOiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpIHwKCSAgICAoY19zeW5jID8gRkJfU1lOQ19DT01QX0hJR0hfQUNUIDogMCk7CgoJc3dpdGNoIChwaXhfd2lkdGgpIHsKI2lmIDAKCWNhc2UgQ1JUQ19QSVhfV0lEVEhfNEJQUDoKCQlicHAgPSA0OwoJCXZhci0+cmVkLm9mZnNldCA9IDA7CgkJdmFyLT5yZWQubGVuZ3RoID0gODsKCQl2YXItPmdyZWVuLm9mZnNldCA9IDA7CgkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OwoJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwoJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OwoJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7CgkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKCQlicmVhazsKI2VuZGlmCgljYXNlIENSVENfUElYX1dJRFRIXzhCUFA6CgkJYnBwID0gODsKCQl2YXItPnJlZC5vZmZzZXQgPSAwOwoJCXZhci0+cmVkLmxlbmd0aCA9IDg7CgkJdmFyLT5ncmVlbi5vZmZzZXQgPSAwOwoJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKCQl2YXItPmJsdWUubGVuZ3RoID0gODsKCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOwoJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CgkJYnJlYWs7CgljYXNlIENSVENfUElYX1dJRFRIXzE1QlBQOgkvKiBSR0IgNTU1ICovCgkJYnBwID0gMTY7CgkJdmFyLT5yZWQub2Zmc2V0ID0gMTA7CgkJdmFyLT5yZWQubGVuZ3RoID0gNTsKCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7CgkJdmFyLT5ncmVlbi5sZW5ndGggPSA1OwoJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwoJCXZhci0+Ymx1ZS5sZW5ndGggPSA1OwoJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7CgkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKCQlicmVhazsKCWNhc2UgQ1JUQ19QSVhfV0lEVEhfMTZCUFA6CS8qIFJHQiA1NjUgKi8KCQlicHAgPSAxNjsKCQl2YXItPnJlZC5vZmZzZXQgPSAxMTsKCQl2YXItPnJlZC5sZW5ndGggPSA1OwoJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gNTsKCQl2YXItPmdyZWVuLmxlbmd0aCA9IDY7CgkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CgkJdmFyLT5ibHVlLmxlbmd0aCA9IDU7CgkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOwoJCWJyZWFrOwoJY2FzZSBDUlRDX1BJWF9XSURUSF8yNEJQUDoJLyogUkdCIDg4OCAqLwoJCWJwcCA9IDI0OwoJCXZhci0+cmVkLm9mZnNldCA9IDE2OwoJCXZhci0+cmVkLmxlbmd0aCA9IDg7CgkJdmFyLT5ncmVlbi5vZmZzZXQgPSA4OwoJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKCQl2YXItPmJsdWUubGVuZ3RoID0gODsKCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOwoJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CgkJYnJlYWs7CgljYXNlIENSVENfUElYX1dJRFRIXzMyQlBQOgkvKiBBUkdCIDg4ODggKi8KCQlicHAgPSAzMjsKCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKCQl2YXItPnJlZC5sZW5ndGggPSA4OwoJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CgkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CgkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7CgkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMjQ7CgkJdmFyLT50cmFuc3AubGVuZ3RoID0gODsKCQlicmVhazsKCWRlZmF1bHQ6CgkJUFJJTlRLRSgiSW52YWxpZCBwaXhlbCB3aWR0aFxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CgoJLyogb3V0cHV0ICovCgl2YXItPnhyZXMgPSB4cmVzOwoJdmFyLT55cmVzID0geXJlczsKCXZhci0+eHJlc192aXJ0dWFsID0gY3J0Yy0+dnhyZXM7Cgl2YXItPnlyZXNfdmlydHVhbCA9IGNydGMtPnZ5cmVzOwoJdmFyLT5iaXRzX3Blcl9waXhlbCA9IGJwcDsKCXZhci0+bGVmdF9tYXJnaW4gPSBsZWZ0OwoJdmFyLT5yaWdodF9tYXJnaW4gPSByaWdodDsKCXZhci0+dXBwZXJfbWFyZ2luID0gdXBwZXI7Cgl2YXItPmxvd2VyX21hcmdpbiA9IGxvd2VyOwoJdmFyLT5oc3luY19sZW4gPSBoc2xlbjsKCXZhci0+dnN5bmNfbGVuID0gdnNsZW47Cgl2YXItPnN5bmMgPSBzeW5jOwoJdmFyLT52bW9kZSA9IEZCX1ZNT0RFX05PTklOVEVSTEFDRUQ7CgkvKiBJbiBkb3VibGUgc2NhbiBtb2RlLCB0aGUgdmVydGljYWwgcGFyYW1ldGVycyBhcmUgZG91YmxlZCwgc28gd2UgbmVlZCB0bwoJICAgaGFsZiB0aGVtIHRvIGdldCB0aGUgcmlnaHQgdmFsdWVzLgoJICAgSW4gaW50ZXJsYWNlZCBtb2RlIHRoZSB2YWx1ZXMgYXJlIGFscmVhZHkgY29ycmVjdCwgc28gbm8gY29ycmVjdGlvbiBpcwoJICAgbmVjZXNzYXJ5LgoJICovCglpZiAoaW50ZXJsYWNlKQoJCXZhci0+dm1vZGUgPSBGQl9WTU9ERV9JTlRFUkxBQ0VEOwoKCWlmIChkb3VibGVfc2NhbikgewoJCXZhci0+dm1vZGUgPSBGQl9WTU9ERV9ET1VCTEU7CgkJdmFyLT55cmVzPj49MTsKCQl2YXItPnVwcGVyX21hcmdpbj4+PTE7CgkJdmFyLT5sb3dlcl9tYXJnaW4+Pj0xOwoJCXZhci0+dnN5bmNfbGVuPj49MTsKCX0KCglyZXR1cm4gMDsKfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKc3RhdGljIGludCBhdHlmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CglzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZpbmZvLT52YXI7Cgl1MzIgdG1wLCBwaXhjbG9jazsKCWludCBlcnI7CiNpZmRlZiBERUJVRwoJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIGRlYnVnOwoJdTMyIHBpeGNsb2NrX2luX3BzOwojZW5kaWYKCWlmIChwYXItPmFzbGVlcCkKCQlyZXR1cm4gMDsKCglpZiAoKGVyciA9IGF0eV92YXJfdG9fY3J0YyhpbmZvLCB2YXIsICZwYXItPmNydGMpKSkKCQlyZXR1cm4gZXJyOwoKCXBpeGNsb2NrID0gYXR5ZmJfZ2V0X3BpeGNsb2NrKHZhciwgcGFyKTsKCglpZiAocGl4Y2xvY2sgPT0gMCkgewoJCVBSSU5US0UoIkludmFsaWQgcGl4Y2xvY2tcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfSBlbHNlIHsKCQlpZigoZXJyID0gcGFyLT5wbGxfb3BzLT52YXJfdG9fcGxsKGluZm8sIHBpeGNsb2NrLCB2YXItPmJpdHNfcGVyX3BpeGVsLCAmcGFyLT5wbGwpKSkKCQkJcmV0dXJuIGVycjsKCX0KCglwYXItPmFjY2VsX2ZsYWdzID0gdmFyLT5hY2NlbF9mbGFnczsgLyogaGFjayAqLwoKCWlmICh2YXItPmFjY2VsX2ZsYWdzKSB7CgkJaW5mby0+ZmJvcHMtPmZiX3N5bmMgPSBhdHlmYl9zeW5jOwoJCWluZm8tPmZsYWdzICY9IH5GQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKCX0gZWxzZSB7CgkJaW5mby0+ZmJvcHMtPmZiX3N5bmMgPSBOVUxMOwoJCWluZm8tPmZsYWdzIHw9IEZCSU5GT19IV0FDQ0VMX0RJU0FCTEVEOwoJfQoKCWlmIChwYXItPmJsaXR0ZXJfbWF5X2JlX2J1c3kpCgkJd2FpdF9mb3JfaWRsZShwYXIpOwoKCWF0eV9zZXRfY3J0YyhwYXIsICZwYXItPmNydGMpOwoJcGFyLT5kYWNfb3BzLT5zZXRfZGFjKGluZm8sICZwYXItPnBsbCwgdmFyLT5iaXRzX3Blcl9waXhlbCwgcGFyLT5hY2NlbF9mbGFncyk7CglwYXItPnBsbF9vcHMtPnNldF9wbGwoaW5mbywgJnBhci0+cGxsKTsKCiNpZmRlZiBERUJVRwoJaWYocGFyLT5wbGxfb3BzICYmIHBhci0+cGxsX29wcy0+cGxsX3RvX3ZhcikKCQlwaXhjbG9ja19pbl9wcyA9IHBhci0+cGxsX29wcy0+cGxsX3RvX3ZhcihpbmZvLCAmKHBhci0+cGxsKSk7CgllbHNlCgkJcGl4Y2xvY2tfaW5fcHMgPSAwOwoKCWlmKDAgPT0gcGl4Y2xvY2tfaW5fcHMpIHsKCQlQUklOVEtFKCJBTEVSVCBvcHMtPnBsbF90b192YXIgZ2V0IDBcbiIpOwoJCXBpeGNsb2NrX2luX3BzID0gcGl4Y2xvY2s7Cgl9CgoJbWVtc2V0KCZkZWJ1ZywgMCwgc2l6ZW9mKGRlYnVnKSk7CglpZighYXR5X2NydGNfdG9fdmFyKCYocGFyLT5jcnRjKSwgJmRlYnVnKSkgewoJCXUzMiBoU3luYywgdlJlZnJlc2g7CgkJdTMyIGhfZGlzcCwgaF9zeW5jX3N0cnQsIGhfc3luY19lbmQsIGhfdG90YWw7CgkJdTMyIHZfZGlzcCwgdl9zeW5jX3N0cnQsIHZfc3luY19lbmQsIHZfdG90YWw7CgoJCWhfZGlzcCA9IGRlYnVnLnhyZXM7CgkJaF9zeW5jX3N0cnQgPSBoX2Rpc3AgKyBkZWJ1Zy5yaWdodF9tYXJnaW47CgkJaF9zeW5jX2VuZCA9IGhfc3luY19zdHJ0ICsgZGVidWcuaHN5bmNfbGVuOwoJCWhfdG90YWwgPSBoX3N5bmNfZW5kICsgZGVidWcubGVmdF9tYXJnaW47CgkJdl9kaXNwID0gZGVidWcueXJlczsKCQl2X3N5bmNfc3RydCA9IHZfZGlzcCArIGRlYnVnLmxvd2VyX21hcmdpbjsKCQl2X3N5bmNfZW5kID0gdl9zeW5jX3N0cnQgKyBkZWJ1Zy52c3luY19sZW47CgkJdl90b3RhbCA9IHZfc3luY19lbmQgKyBkZWJ1Zy51cHBlcl9tYXJnaW47CgoJCWhTeW5jID0gMTAwMDAwMDAwMCAvIChwaXhjbG9ja19pbl9wcyAqIGhfdG90YWwpOwoJCXZSZWZyZXNoID0gKGhTeW5jICogMTAwMCkgLyB2X3RvdGFsOwogICAgICAgIAlpZiAocGFyLT5jcnRjLmdlbl9jbnRsICYgQ1JUQ19JTlRFUkxBQ0VfRU4pCiAgICAgICAgICAgIAl2UmVmcmVzaCAqPSAyOwogICAgICAgIAlpZiAocGFyLT5jcnRjLmdlbl9jbnRsICYgQ1JUQ19EQkxfU0NBTl9FTikKICAgICAgICAgICAgCXZSZWZyZXNoIC89IDI7CgoJCURQUklOVEsoImF0eWZiX3NldF9wYXJcbiIpOwoJCURQUklOVEsoIiBTZXQgVmlzaWJsZSBNb2RlIHRvICVpeCVpLSVpXG4iLCB2YXItPnhyZXMsIHZhci0+eXJlcywgdmFyLT5iaXRzX3Blcl9waXhlbCk7CgkJRFBSSU5USygiIFZpcnR1YWwgcmVzb2x1dGlvbiAlaXglaSwgcGl4Y2xvY2tfaW5fcHMgJWkgKGNhbGN1bGF0ZWQgJWkpXG4iLAoJCQl2YXItPnhyZXNfdmlydHVhbCwgdmFyLT55cmVzX3ZpcnR1YWwsIHBpeGNsb2NrLCBwaXhjbG9ja19pbl9wcyk7CgkJRFBSSU5USygiIERvdCBjbG9jazogICAgICAgICAgICVpIE1IelxuIiwgMTAwMDAwMCAvIHBpeGNsb2NrX2luX3BzKTsKCQlEUFJJTlRLKCIgSG9yaXpvbnRhbCBzeW5jOiAgICAgJWkga0h6XG4iLCBoU3luYyk7CgkJRFBSSU5USygiIFZlcnRpY2FsIHJlZnJlc2g6ICAgICVpIEh6XG4iLCB2UmVmcmVzaCk7CgkJRFBSSU5USygiIHggIHN0eWxlOiAlaS4lMDNpICVpICVpICVpICVpICAgJWkgJWkgJWkgJWlcbiIsCgkJCTEwMDAwMDAgLyBwaXhjbG9ja19pbl9wcywgMTAwMDAwMCAlIHBpeGNsb2NrX2luX3BzLAoJCQloX2Rpc3AsIGhfc3luY19zdHJ0LCBoX3N5bmNfZW5kLCBoX3RvdGFsLAoJCQl2X2Rpc3AsIHZfc3luY19zdHJ0LCB2X3N5bmNfZW5kLCB2X3RvdGFsKTsKCQlEUFJJTlRLKCIgZmIgc3R5bGU6ICVpICAlaSAlaSAlaSAlaSAlaSAlaSAlaSAlaVxuIiwKCQkJcGl4Y2xvY2tfaW5fcHMsCgkJCWRlYnVnLmxlZnRfbWFyZ2luLCBoX2Rpc3AsIGRlYnVnLnJpZ2h0X21hcmdpbiwgZGVidWcuaHN5bmNfbGVuLAoJCQlkZWJ1Zy51cHBlcl9tYXJnaW4sIHZfZGlzcCwgZGVidWcubG93ZXJfbWFyZ2luLCBkZWJ1Zy52c3luY19sZW4pOwoJfQojZW5kaWYgLyogREVCVUcgKi8KCglpZiAoIU02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQkvKiBEb24ndCBmb3JnZXQgTUVNX0NOVEwgKi8KCQl0bXAgPSBhdHlfbGRfbGUzMihNRU1fQ05UTCwgcGFyKSAmIDB4ZjBmZmZmZmY7CgkJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CgkJY2FzZSA4OgoJCQl0bXAgfD0gMHgwMjAwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSAxNjoKCQkJdG1wIHw9IDB4MDMwMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgMzI6CgkJCXRtcCB8PSAweDA2MDAwMDAwOwoJCQlicmVhazsKCQl9CgkJYXR5X3N0X2xlMzIoTUVNX0NOVEwsIHRtcCwgcGFyKTsKCX0gZWxzZSB7CgkJdG1wID0gYXR5X2xkX2xlMzIoTUVNX0NOVEwsIHBhcikgJiAweGYwMGZmZmZmOwoJCWlmICghTTY0X0hBUyhNQUdJQ19QT1NURElWKSkKCQkJdG1wIHw9IHBhci0+bWVtX3JlZnJlc2hfcmF0ZSA8PCAyMDsKCQlzd2l0Y2ggKHZhci0+Yml0c19wZXJfcGl4ZWwpIHsKCQljYXNlIDg6CgkJY2FzZSAyNDoKCQkJdG1wIHw9IDB4MDAwMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgMTY6CgkJCXRtcCB8PSAweDA0MDAwMDAwOwoJCQlicmVhazsKCQljYXNlIDMyOgoJCQl0bXAgfD0gMHgwODAwMDAwMDsKCQkJYnJlYWs7CgkJfQoJCWlmIChNNjRfSEFTKENUX0JVUykpIHsKCQkJYXR5X3N0X2xlMzIoREFDX0NOVEwsIDB4ODcwMTAxODQsIHBhcik7CgkJCWF0eV9zdF9sZTMyKEJVU19DTlRMLCAweDY4MDAwMGY5LCBwYXIpOwoJCX0gZWxzZSBpZiAoTTY0X0hBUyhWVF9CVVMpKSB7CgkJCWF0eV9zdF9sZTMyKERBQ19DTlRMLCAweDg3MDEwMTg0LCBwYXIpOwoJCQlhdHlfc3RfbGUzMihCVVNfQ05UTCwgMHg2ODAwMDBmOSwgcGFyKTsKCQl9IGVsc2UgaWYgKE02NF9IQVMoTU9CSUxfQlVTKSkgewoJCQlhdHlfc3RfbGUzMihEQUNfQ05UTCwgMHg4MDAxMDEwMiwgcGFyKTsKCQkJYXR5X3N0X2xlMzIoQlVTX0NOVEwsIDB4N2IzM2EwNDAgfCAocGFyLT5hdXhfc3RhcnQgPyBCVVNfQVBFUl9SRUdfRElTIDogMCksIHBhcik7CgkJfSBlbHNlIHsKCQkJLyogR1QgKi8KCQkJYXR5X3N0X2xlMzIoREFDX0NOVEwsIDB4ODYwMTAxMDIsIHBhcik7CgkJCWF0eV9zdF9sZTMyKEJVU19DTlRMLCAweDdiMjNhMDQwIHwgKHBhci0+YXV4X3N0YXJ0ID8gQlVTX0FQRVJfUkVHX0RJUyA6IDApLCBwYXIpOwoJCQlhdHlfc3RfbGUzMihFWFRfTUVNX0NOVEwsIGF0eV9sZF9sZTMyKEVYVF9NRU1fQ05UTCwgcGFyKSB8IDB4NTAwMDAwMSwgcGFyKTsKCQl9CgkJYXR5X3N0X2xlMzIoTUVNX0NOVEwsIHRtcCwgcGFyKTsKCX0KCWF0eV9zdF84KERBQ19NQVNLLCAweGZmLCBwYXIpOwoKCWluZm8tPmZpeC5saW5lX2xlbmd0aCA9IHZhci0+eHJlc192aXJ0dWFsICogdmFyLT5iaXRzX3Blcl9waXhlbC84OwoJaW5mby0+Zml4LnZpc3VhbCA9IHZhci0+Yml0c19wZXJfcGl4ZWwgPD0gOCA/CgkJRkJfVklTVUFMX1BTRVVET0NPTE9SIDogRkJfVklTVUFMX0RJUkVDVENPTE9SOwoKCS8qIEluaXRpYWxpemUgdGhlIGdyYXBoaWNzIGVuZ2luZSAqLwoJaWYgKHBhci0+YWNjZWxfZmxhZ3MgJiBGQl9BQ0NFTEZfVEVYVCkKCQlhdHlfaW5pdF9lbmdpbmUocGFyLCBpbmZvKTsKCiNpZmRlZiBDT05GSUdfQk9PVFhfVEVYVAoJYnRleHRfdXBkYXRlX2Rpc3BsYXkoaW5mby0+Zml4LnNtZW1fc3RhcnQsCgkJKCgocGFyLT5jcnRjLmhfdG90X2Rpc3AgPj4gMTYpICYgMHhmZikgKyAxKSAqIDgsCgkJKChwYXItPmNydGMudl90b3RfZGlzcCA+PiAxNikgJiAweDdmZikgKyAxLAoJCXZhci0+Yml0c19wZXJfcGl4ZWwsCgkJcGFyLT5jcnRjLnZ4cmVzICogdmFyLT5iaXRzX3Blcl9waXhlbCAvIDgpOwojZW5kaWYgLyogQ09ORklHX0JPT1RYX1RFWFQgKi8KI2lmIDAKCS8qIHN3aXRjaCB0byBhY2NlbGVyYXRvciBtb2RlICovCglpZiAoIShwYXItPmNydGMuZ2VuX2NudGwgJiBDUlRDX0VYVF9ESVNQX0VOKSkKCQlhdHlfc3RfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXItPmNydGMuZ2VuX2NudGwgfCBDUlRDX0VYVF9ESVNQX0VOLCBwYXIpOwojZW5kaWYKI2lmZGVmIERFQlVHCnsKCS8qIGR1bXAgbm9uIHNoYWRvdyBDUlRDLCBwbGwsIExDRCByZWdpc3RlcnMgKi8KCWludCBpOyB1MzIgYmFzZTsKCgkvKiBDUlRDIHJlZ2lzdGVycyAqLwoJYmFzZSA9IDB4MjAwMDsKCXByaW50aygiZGVidWcgYXR5ZmI6IE1hY2g2NCBub24tc2hhZG93IHJlZ2lzdGVyIHZhbHVlczoiKTsKCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgPSBpKzQpIHsKCQlpZihpJTE2ID09IDApIHByaW50aygiXG5kZWJ1ZyBhdHlmYjogMHglMDRYOiAiLCBiYXNlICsgaSk7CgkJcHJpbnRrKCIgJTA4WCIsIGF0eV9sZF9sZTMyKGksIHBhcikpOwoJfQoJcHJpbnRrKCJcblxuIik7CgojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVAoJLyogUExMIHJlZ2lzdGVycyAqLwoJYmFzZSA9IDB4MDA7CglwcmludGsoImRlYnVnIGF0eWZiOiBNYWNoNjQgUExMIHJlZ2lzdGVyIHZhbHVlczoiKTsKCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CgkJaWYoaSUxNiA9PSAwKSBwcmludGsoIlxuZGVidWcgYXR5ZmI6IDB4JTAyWDogIiwgYmFzZSArIGkpOwoJCWlmKGklNCA9PSAwKSAgcHJpbnRrKCIgIik7CgkJcHJpbnRrKCIlMDJYIiwgYXR5X2xkX3BsbF9jdChpLCBwYXIpKTsKCX0KCXByaW50aygiXG5cbiIpOwojZW5kaWYJLyogQ09ORklHX0ZCX0FUWV9DVCAqLwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJLyogTENEIHJlZ2lzdGVycyAqLwoJCWJhc2UgPSAweDAwOwoJCXByaW50aygiZGVidWcgYXR5ZmI6IExDRCByZWdpc3RlciB2YWx1ZXM6Iik7CgkJaWYoTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQkgICAgZm9yKGkgPSAwOyBpIDw9IFBPV0VSX01BTkFHRU1FTlQ7IGkrKykgewoJCQlpZihpID09IEVYVF9WRVJUX1NUUkVUQ0gpCgkJCSAgICBjb250aW51ZTsKCQkJcHJpbnRrKCJcbmRlYnVnIGF0eWZiOiAweCUwNFg6ICIsIGx0X2xjZF9yZWdzW2ldKTsKCQkJcHJpbnRrKCIgJTA4WCIsIGF0eV9sZF9sY2QoaSwgcGFyKSk7CgkJICAgIH0KCgkJfSBlbHNlIHsKCQkgICAgZm9yIChpID0gMDsgaSA8IDY0OyBpKyspIHsKCQkJaWYoaSU0ID09IDApIHByaW50aygiXG5kZWJ1ZyBhdHlmYjogMHglMDJYOiAiLCBiYXNlICsgaSk7CgkJCXByaW50aygiICUwOFgiLCBhdHlfbGRfbGNkKGksIHBhcikpOwoJCSAgICB9CgkJfQoJCXByaW50aygiXG5cbiIpOwoJfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCAqLwp9CiNlbmRpZiAvKiBERUJVRyAqLwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJaW50IGVycjsKCXN0cnVjdCBjcnRjIGNydGM7Cgl1bmlvbiBhdHlfcGxsIHBsbDsKCXUzMiBwaXhjbG9jazsKCgltZW1jcHkoJnBsbCwgJihwYXItPnBsbCksIHNpemVvZihwbGwpKTsKCglpZigoZXJyID0gYXR5X3Zhcl90b19jcnRjKGluZm8sIHZhciwgJmNydGMpKSkKCQlyZXR1cm4gZXJyOwoKCXBpeGNsb2NrID0gYXR5ZmJfZ2V0X3BpeGNsb2NrKHZhciwgcGFyKTsKCglpZiAocGl4Y2xvY2sgPT0gMCkgewoJCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkKCQkJUFJJTlRLRSgiSW52YWxpZCBwaXhjbG9ja1xuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9IGVsc2UgewoJCWlmKChlcnIgPSBwYXItPnBsbF9vcHMtPnZhcl90b19wbGwoaW5mbywgcGl4Y2xvY2ssIHZhci0+Yml0c19wZXJfcGl4ZWwsICZwbGwpKSkKCQkJcmV0dXJuIGVycjsKCX0KCglpZiAodmFyLT5hY2NlbF9mbGFncyAmIEZCX0FDQ0VMRl9URVhUKQoJCWluZm8tPnZhci5hY2NlbF9mbGFncyA9IEZCX0FDQ0VMRl9URVhUOwoJZWxzZQoJCWluZm8tPnZhci5hY2NlbF9mbGFncyA9IDA7CgoJYXR5X2NydGNfdG9fdmFyKCZjcnRjLCB2YXIpOwoJdmFyLT5waXhjbG9jayA9IHBhci0+cGxsX29wcy0+cGxsX3RvX3ZhcihpbmZvLCAmcGxsKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBzZXRfb2ZmX3BpdGNoKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXUzMiB4b2Zmc2V0ID0gaW5mby0+dmFyLnhvZmZzZXQ7Cgl1MzIgeW9mZnNldCA9IGluZm8tPnZhci55b2Zmc2V0OwoJdTMyIHZ4cmVzID0gcGFyLT5jcnRjLnZ4cmVzOwoJdTMyIGJwcCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbDsKCglwYXItPmNydGMub2ZmX3BpdGNoID0gKCh5b2Zmc2V0ICogdnhyZXMgKyB4b2Zmc2V0KSAqIGJwcCAvIDY0KSB8ICh2eHJlcyA8PCAxOSk7Cn0KCgogICAgLyoKICAgICAqICBPcGVuL1JlbGVhc2UgdGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UKICAgICAqLwoKc3RhdGljIGludCBhdHlmYl9vcGVuKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcikKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoKCWlmICh1c2VyKSB7CgkJcGFyLT5vcGVuKys7CiNpZmRlZiBfX3NwYXJjX18KCQlwYXItPm1tYXBlZCA9IDA7CiNlbmRpZgoJfQoJcmV0dXJuICgwKTsKfQoKc3RhdGljIGlycXJldHVybl90IGF0eV9pcnEoaW50IGlycSwgdm9pZCAqZGV2X2lkKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSBkZXZfaWQ7CglpbnQgaGFuZGxlZCA9IDA7Cgl1MzIgaW50X2NudGw7CgoJc3Bpbl9sb2NrKCZwYXItPmludF9sb2NrKTsKCglpbnRfY250bCA9IGF0eV9sZF9sZTMyKENSVENfSU5UX0NOVEwsIHBhcik7CgoJaWYgKGludF9jbnRsICYgQ1JUQ19WQkxBTktfSU5UKSB7CgkJLyogY2xlYXIgaW50ZXJydXB0ICovCgkJYXR5X3N0X2xlMzIoQ1JUQ19JTlRfQ05UTCwgKGludF9jbnRsICYgQ1JUQ19JTlRfRU5fTUFTSykgfCBDUlRDX1ZCTEFOS19JTlRfQUssIHBhcik7CgkJcGFyLT52YmxhbmsuY291bnQrKzsKCQlpZiAocGFyLT52YmxhbmsucGFuX2Rpc3BsYXkpIHsKCQkJcGFyLT52YmxhbmsucGFuX2Rpc3BsYXkgPSAwOwoJCQlhdHlfc3RfbGUzMihDUlRDX09GRl9QSVRDSCwgcGFyLT5jcnRjLm9mZl9waXRjaCwgcGFyKTsKCQl9CgkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwYXItPnZibGFuay53YWl0KTsKCQloYW5kbGVkID0gMTsKCX0KCglzcGluX3VubG9jaygmcGFyLT5pbnRfbG9jayk7CgoJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cn0KCnN0YXRpYyBpbnQgYXR5X2VuYWJsZV9pcnEoc3RydWN0IGF0eWZiX3BhciAqcGFyLCBpbnQgcmVlbmFibGUpCnsKCXUzMiBpbnRfY250bDsKCglpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJnBhci0+aXJxX2ZsYWdzKSkgewoJCWlmIChyZXF1ZXN0X2lycShwYXItPmlycSwgYXR5X2lycSwgSVJRRl9TSEFSRUQsICJhdHlmYiIsIHBhcikpIHsKCQkJY2xlYXJfYml0KDAsICZwYXItPmlycV9mbGFncyk7CgkJCXJldHVybiAtRUlOVkFMOwoJCX0KCQlzcGluX2xvY2tfaXJxKCZwYXItPmludF9sb2NrKTsKCQlpbnRfY250bCA9IGF0eV9sZF9sZTMyKENSVENfSU5UX0NOVEwsIHBhcikgJiBDUlRDX0lOVF9FTl9NQVNLOwoJCS8qIGNsZWFyIGludGVycnVwdCAqLwoJCWF0eV9zdF9sZTMyKENSVENfSU5UX0NOVEwsIGludF9jbnRsIHwgQ1JUQ19WQkxBTktfSU5UX0FLLCBwYXIpOwoJCS8qIGVuYWJsZSBpbnRlcnJ1cHQgKi8KCQlhdHlfc3RfbGUzMihDUlRDX0lOVF9DTlRMLCBpbnRfY250bCB8IENSVENfVkJMQU5LX0lOVF9FTiwgcGFyKTsKCQlzcGluX3VubG9ja19pcnEoJnBhci0+aW50X2xvY2spOwoJfSBlbHNlIGlmIChyZWVuYWJsZSkgewoJCXNwaW5fbG9ja19pcnEoJnBhci0+aW50X2xvY2spOwoJCWludF9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19JTlRfQ05UTCwgcGFyKSAmIENSVENfSU5UX0VOX01BU0s7CgkJaWYgKCEoaW50X2NudGwgJiBDUlRDX1ZCTEFOS19JTlRfRU4pKSB7CgkJCXByaW50aygiYXR5ZmI6IHNvbWVvbmUgZGlzYWJsZWQgSVJRIFslMDh4XVxuIiwgaW50X2NudGwpOwoJCQkvKiByZS1lbmFibGUgaW50ZXJydXB0ICovCgkJCWF0eV9zdF9sZTMyKENSVENfSU5UX0NOVEwsIGludF9jbnRsIHwgQ1JUQ19WQkxBTktfSU5UX0VOLCBwYXIgKTsKCQl9CgkJc3Bpbl91bmxvY2tfaXJxKCZwYXItPmludF9sb2NrKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBhdHlfZGlzYWJsZV9pcnEoc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7Cgl1MzIgaW50X2NudGw7CgoJaWYgKHRlc3RfYW5kX2NsZWFyX2JpdCgwLCAmcGFyLT5pcnFfZmxhZ3MpKSB7CgkJaWYgKHBhci0+dmJsYW5rLnBhbl9kaXNwbGF5KSB7CgkJCXBhci0+dmJsYW5rLnBhbl9kaXNwbGF5ID0gMDsKCQkJYXR5X3N0X2xlMzIoQ1JUQ19PRkZfUElUQ0gsIHBhci0+Y3J0Yy5vZmZfcGl0Y2gsIHBhcik7CgkJfQoJCXNwaW5fbG9ja19pcnEoJnBhci0+aW50X2xvY2spOwoJCWludF9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19JTlRfQ05UTCwgcGFyKSAmIENSVENfSU5UX0VOX01BU0s7CgkJLyogZGlzYWJsZSBpbnRlcnJ1cHQgKi8KCQlhdHlfc3RfbGUzMihDUlRDX0lOVF9DTlRMLCBpbnRfY250bCAmIH5DUlRDX1ZCTEFOS19JTlRfRU4sIHBhciApOwoJCXNwaW5fdW5sb2NrX2lycSgmcGFyLT5pbnRfbG9jayk7CgkJZnJlZV9pcnEocGFyLT5pcnEsIHBhcik7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5ZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCWlmICh1c2VyKSB7CgkJcGFyLT5vcGVuLS07CgkJbWRlbGF5KDEpOwoJCXdhaXRfZm9yX2lkbGUocGFyKTsKCQlpZiAoIXBhci0+b3BlbikgewojaWZkZWYgX19zcGFyY19fCgkJCWludCB3YXNfbW1hcGVkID0gcGFyLT5tbWFwZWQ7CgoJCQlwYXItPm1tYXBlZCA9IDA7CgoJCQlpZiAod2FzX21tYXBlZCkgewoJCQkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvIHZhcjsKCgkJCQkvKiBOb3cgcmVzZXQgdGhlIGRlZmF1bHQgZGlzcGxheSBjb25maWcsIHdlIGhhdmUgbm8KCQkJCSAqIGlkZWEgd2hhdCB0aGUgcHJvZ3JhbShzKSB3aGljaCBtbWFwJ2QgdGhlIGNoaXAgZGlkCgkJCQkgKiB0byB0aGUgY29uZmlndXJhdGlvbiwgbm9yIHdoZXRoZXIgaXQgcmVzdG9yZWQgaXQKCQkJCSAqIGNvcnJlY3RseS4KCQkJCSAqLwoJCQkJdmFyID0gZGVmYXVsdF92YXI7CgkJCQlpZiAobm9hY2NlbCkKCQkJCQl2YXIuYWNjZWxfZmxhZ3MgJj0gfkZCX0FDQ0VMRl9URVhUOwoJCQkJZWxzZQoJCQkJCXZhci5hY2NlbF9mbGFncyB8PSBGQl9BQ0NFTEZfVEVYVDsKCQkJCWlmICh2YXIueXJlcyA9PSB2YXIueXJlc192aXJ0dWFsKSB7CgkJCQkJdTMyIHZpZGVvcmFtID0gKGluZm8tPmZpeC5zbWVtX2xlbiAtIChQQUdFX1NJWkUgPDwgMikpOwoJCQkJCXZhci55cmVzX3ZpcnR1YWwgPSAoKHZpZGVvcmFtICogOCkgLyB2YXIuYml0c19wZXJfcGl4ZWwpIC8gdmFyLnhyZXNfdmlydHVhbDsKCQkJCQlpZiAodmFyLnlyZXNfdmlydHVhbCA8IHZhci55cmVzKQoJCQkJCQl2YXIueXJlc192aXJ0dWFsID0gdmFyLnlyZXM7CgkJCQl9CgkJCX0KI2VuZGlmCgkJCWF0eV9kaXNhYmxlX2lycShwYXIpOwoJCX0KCX0KCXJldHVybiAoMCk7Cn0KCiAgICAvKgogICAgICogIFBhbiBvciBXcmFwIHRoZSBEaXNwbGF5CiAgICAgKgogICAgICogIFRoaXMgY2FsbCBsb29rcyBvbmx5IGF0IHhvZmZzZXQsIHlvZmZzZXQgYW5kIHRoZSBGQl9WTU9ERV9ZV1JBUCBmbGFnCiAgICAgKi8KCnN0YXRpYyBpbnQgYXR5ZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7Cgl1MzIgeHJlcywgeXJlcywgeG9mZnNldCwgeW9mZnNldDsKCgl4cmVzID0gKCgocGFyLT5jcnRjLmhfdG90X2Rpc3AgPj4gMTYpICYgMHhmZikgKyAxKSAqIDg7Cgl5cmVzID0gKChwYXItPmNydGMudl90b3RfZGlzcCA+PiAxNikgJiAweDdmZikgKyAxOwoJaWYgKHBhci0+Y3J0Yy5nZW5fY250bCAmIENSVENfREJMX1NDQU5fRU4pCgkJeXJlcyA+Pj0gMTsKCXhvZmZzZXQgPSAodmFyLT54b2Zmc2V0ICsgNykgJiB+NzsKCXlvZmZzZXQgPSB2YXItPnlvZmZzZXQ7CglpZiAoeG9mZnNldCArIHhyZXMgPiBwYXItPmNydGMudnhyZXMgfHwgeW9mZnNldCArIHlyZXMgPiBwYXItPmNydGMudnlyZXMpCgkJcmV0dXJuIC1FSU5WQUw7CglpbmZvLT52YXIueG9mZnNldCA9IHhvZmZzZXQ7CglpbmZvLT52YXIueW9mZnNldCA9IHlvZmZzZXQ7CglpZiAocGFyLT5hc2xlZXApCgkJcmV0dXJuIDA7CgoJc2V0X29mZl9waXRjaChwYXIsIGluZm8pOwoJaWYgKCh2YXItPmFjdGl2YXRlICYgRkJfQUNUSVZBVEVfVkJMKSAmJiAhYXR5X2VuYWJsZV9pcnEocGFyLCAwKSkgewoJCXBhci0+dmJsYW5rLnBhbl9kaXNwbGF5ID0gMTsKCX0gZWxzZSB7CgkJcGFyLT52YmxhbmsucGFuX2Rpc3BsYXkgPSAwOwoJCWF0eV9zdF9sZTMyKENSVENfT0ZGX1BJVENILCBwYXItPmNydGMub2ZmX3BpdGNoLCBwYXIpOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eV93YWl0Zm9ydmJsYW5rKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgdTMyIGNydGMpCnsKCXN0cnVjdCBhdHlfaW50ZXJydXB0ICp2Ymw7Cgl1bnNpZ25lZCBpbnQgY291bnQ7CglpbnQgcmV0OwoKCXN3aXRjaCAoY3J0YykgewoJY2FzZSAwOgoJCXZibCA9ICZwYXItPnZibGFuazsKCQlicmVhazsKCWRlZmF1bHQ6CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CgoJcmV0ID0gYXR5X2VuYWJsZV9pcnEocGFyLCAwKTsKCWlmIChyZXQpCgkJcmV0dXJuIHJldDsKCgljb3VudCA9IHZibC0+Y291bnQ7CglyZXQgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfdGltZW91dCh2YmwtPndhaXQsIGNvdW50ICE9IHZibC0+Y291bnQsIEhaLzEwKTsKCWlmIChyZXQgPCAwKSB7CgkJcmV0dXJuIHJldDsKCX0KCWlmIChyZXQgPT0gMCkgewoJCWF0eV9lbmFibGVfaXJxKHBhciwgMSk7CgkJcmV0dXJuIC1FVElNRURPVVQ7Cgl9CgoJcmV0dXJuIDA7Cn0KCgojaWZkZWYgREVCVUcKI2RlZmluZSBBVFlJT19DTEtSCQkweDQxNTQ1OTAwCS8qIEFUWVwwMCAqLwojZGVmaW5lIEFUWUlPX0NMS1cJCTB4NDE1NDU5MDEJLyogQVRZXDAxICovCgpzdHJ1Y3QgYXR5Y2xrIHsKCXUzMiByZWZfY2xrX3BlcjsKCXU4IHBsbF9yZWZfZGl2OwoJdTggbWNsa19mYl9kaXY7Cgl1OCBtY2xrX3Bvc3RfZGl2OwkvKiAxLDIsMyw0LDggKi8KCXU4IG1jbGtfZmJfbXVsdDsJLyogMiBvciA0ICovCgl1OCB4Y2xrX3Bvc3RfZGl2OwkvKiAxLDIsMyw0LDggKi8KCXU4IHZjbGtfZmJfZGl2OwoJdTggdmNsa19wb3N0X2RpdjsJLyogMSwyLDMsNCw2LDgsMTIgKi8KCXUzMiBkc3BfeGNsa3NfcGVyX3JvdzsJLyogMC0xNjM4MyAqLwoJdTMyIGRzcF9sb29wX2xhdGVuY3k7CS8qIDAtMTUgKi8KCXUzMiBkc3BfcHJlY2lzaW9uOwkvKiAwLTcgKi8KCXUzMiBkc3Bfb247CQkvKiAwLTIwNDcgKi8KCXUzMiBkc3Bfb2ZmOwkJLyogMC0yMDQ3ICovCn07CgojZGVmaW5lIEFUWUlPX0ZFQVRSCQkweDQxNTQ1OTAyCS8qIEFUWVwwMiAqLwojZGVmaW5lIEFUWUlPX0ZFQVRXCQkweDQxNTQ1OTAzCS8qIEFUWVwwMyAqLwojZW5kaWYKCiNpZm5kZWYgRkJJT19XQUlURk9SVlNZTkMKI2RlZmluZSBGQklPX1dBSVRGT1JWU1lOQyBfSU9XKCdGJywgMHgyMCwgX191MzIpCiNlbmRpZgoKc3RhdGljIGludCBhdHlmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CiNpZmRlZiBfX3NwYXJjX18KCXN0cnVjdCBmYnR5cGUgZmJ0eXA7CiNlbmRpZgoKCXN3aXRjaCAoY21kKSB7CiNpZmRlZiBfX3NwYXJjX18KCWNhc2UgRkJJT0dUWVBFOgoJCWZidHlwLmZiX3R5cGUgPSBGQlRZUEVfUENJX0dFTkVSSUM7CgkJZmJ0eXAuZmJfd2lkdGggPSBwYXItPmNydGMudnhyZXM7CgkJZmJ0eXAuZmJfaGVpZ2h0ID0gcGFyLT5jcnRjLnZ5cmVzOwoJCWZidHlwLmZiX2RlcHRoID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwoJCWZidHlwLmZiX2Ntc2l6ZSA9IGluZm8tPmNtYXAubGVuOwoJCWZidHlwLmZiX3NpemUgPSBpbmZvLT5maXguc21lbV9sZW47CgkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGZidHlwZSBfX3VzZXIgKikgYXJnLCAmZmJ0eXAsIHNpemVvZihmYnR5cCkpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlicmVhazsKI2VuZGlmIC8qIF9fc3BhcmNfXyAqLwoKCWNhc2UgRkJJT19XQUlURk9SVlNZTkM6CgkJewoJCQl1MzIgY3J0YzsKCgkJCWlmIChnZXRfdXNlcihjcnRjLCAoX191MzIgX191c2VyICopIGFyZykpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCgkJCXJldHVybiBhdHlfd2FpdGZvcnZibGFuayhwYXIsIGNydGMpOwoJCX0KCQlicmVhazsKCiNpZiBkZWZpbmVkKERFQlVHKSAmJiBkZWZpbmVkKENPTkZJR19GQl9BVFlfQ1QpCgljYXNlIEFUWUlPX0NMS1I6CgkJaWYgKE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQkJc3RydWN0IGF0eWNsayBjbGs7CgkJCXVuaW9uIGF0eV9wbGwgKnBsbCA9ICYocGFyLT5wbGwpOwoJCQl1MzIgZHNwX2NvbmZpZyA9IHBsbC0+Y3QuZHNwX2NvbmZpZzsKCQkJdTMyIGRzcF9vbl9vZmYgPSBwbGwtPmN0LmRzcF9vbl9vZmY7CgkJCWNsay5yZWZfY2xrX3BlciA9IHBhci0+cmVmX2Nsa19wZXI7CgkJCWNsay5wbGxfcmVmX2RpdiA9IHBsbC0+Y3QucGxsX3JlZl9kaXY7CgkJCWNsay5tY2xrX2ZiX2RpdiA9IHBsbC0+Y3QubWNsa19mYl9kaXY7CgkJCWNsay5tY2xrX3Bvc3RfZGl2ID0gcGxsLT5jdC5tY2xrX3Bvc3RfZGl2X3JlYWw7CgkJCWNsay5tY2xrX2ZiX211bHQgPSBwbGwtPmN0Lm1jbGtfZmJfbXVsdDsKCQkJY2xrLnhjbGtfcG9zdF9kaXYgPSBwbGwtPmN0LnhjbGtfcG9zdF9kaXZfcmVhbDsKCQkJY2xrLnZjbGtfZmJfZGl2ID0gcGxsLT5jdC52Y2xrX2ZiX2RpdjsKCQkJY2xrLnZjbGtfcG9zdF9kaXYgPSBwbGwtPmN0LnZjbGtfcG9zdF9kaXZfcmVhbDsKCQkJY2xrLmRzcF94Y2xrc19wZXJfcm93ID0gZHNwX2NvbmZpZyAmIDB4M2ZmZjsKCQkJY2xrLmRzcF9sb29wX2xhdGVuY3kgPSAoZHNwX2NvbmZpZyA+PiAxNikgJiAweGY7CgkJCWNsay5kc3BfcHJlY2lzaW9uID0gKGRzcF9jb25maWcgPj4gMjApICYgNzsKCQkJY2xrLmRzcF9vZmYgPSBkc3Bfb25fb2ZmICYgMHg3ZmY7CgkJCWNsay5kc3Bfb24gPSAoZHNwX29uX29mZiA+PiAxNikgJiAweDdmZjsKCQkJaWYgKGNvcHlfdG9fdXNlcigoc3RydWN0IGF0eWNsayBfX3VzZXIgKikgYXJnLCAmY2xrLAoJCQkJCSBzaXplb2YoY2xrKSkpCgkJCQlyZXR1cm4gLUVGQVVMVDsKCQl9IGVsc2UKCQkJcmV0dXJuIC1FSU5WQUw7CgkJYnJlYWs7CgljYXNlIEFUWUlPX0NMS1c6CgkJaWYgKE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQkJc3RydWN0IGF0eWNsayBjbGs7CgkJCXVuaW9uIGF0eV9wbGwgKnBsbCA9ICYocGFyLT5wbGwpOwoJCQlpZiAoY29weV9mcm9tX3VzZXIoJmNsaywgKHN0cnVjdCBhdHljbGsgX191c2VyICopIGFyZywgc2l6ZW9mKGNsaykpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJCXBhci0+cmVmX2Nsa19wZXIgPSBjbGsucmVmX2Nsa19wZXI7CgkJCXBsbC0+Y3QucGxsX3JlZl9kaXYgPSBjbGsucGxsX3JlZl9kaXY7CgkJCXBsbC0+Y3QubWNsa19mYl9kaXYgPSBjbGsubWNsa19mYl9kaXY7CgkJCXBsbC0+Y3QubWNsa19wb3N0X2Rpdl9yZWFsID0gY2xrLm1jbGtfcG9zdF9kaXY7CgkJCXBsbC0+Y3QubWNsa19mYl9tdWx0ID0gY2xrLm1jbGtfZmJfbXVsdDsKCQkJcGxsLT5jdC54Y2xrX3Bvc3RfZGl2X3JlYWwgPSBjbGsueGNsa19wb3N0X2RpdjsKCQkJcGxsLT5jdC52Y2xrX2ZiX2RpdiA9IGNsay52Y2xrX2ZiX2RpdjsKCQkJcGxsLT5jdC52Y2xrX3Bvc3RfZGl2X3JlYWwgPSBjbGsudmNsa19wb3N0X2RpdjsKCQkJcGxsLT5jdC5kc3BfY29uZmlnID0gKGNsay5kc3BfeGNsa3NfcGVyX3JvdyAmIDB4M2ZmZikgfAoJCQkJKChjbGsuZHNwX2xvb3BfbGF0ZW5jeSAmIDB4Zik8PDE2KXwgKChjbGsuZHNwX3ByZWNpc2lvbiAmIDcpPDwyMCk7CgkJCXBsbC0+Y3QuZHNwX29uX29mZiA9IChjbGsuZHNwX29mZiAmIDB4N2ZmKSB8ICgoY2xrLmRzcF9vbiAmIDB4N2ZmKTw8MTYpOwoJCQkvKmF0eV9jYWxjX3BsbF9jdChpbmZvLCAmcGxsLT5jdCk7Ki8KCQkJYXR5X3NldF9wbGxfY3QoaW5mbywgcGxsKTsKCQl9IGVsc2UKCQkJcmV0dXJuIC1FSU5WQUw7CgkJYnJlYWs7CgljYXNlIEFUWUlPX0ZFQVRSOgoJCWlmIChnZXRfdXNlcihwYXItPmZlYXR1cmVzLCAodTMyIF9fdXNlciAqKSBhcmcpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlicmVhazsKCWNhc2UgQVRZSU9fRkVBVFc6CgkJaWYgKHB1dF91c2VyKHBhci0+ZmVhdHVyZXMsICh1MzIgX191c2VyICopIGFyZykpCgkJCXJldHVybiAtRUZBVUxUOwoJCWJyZWFrOwojZW5kaWYgLyogREVCVUcgJiYgQ09ORklHX0ZCX0FUWV9DVCAqLwoJZGVmYXVsdDoKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eWZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCglpZiAocGFyLT5ibGl0dGVyX21heV9iZV9idXN5KQoJCXdhaXRfZm9yX2lkbGUocGFyKTsKCXJldHVybiAwOwp9CgojaWZkZWYgX19zcGFyY19fCnN0YXRpYyBpbnQgYXR5ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCXVuc2lnbmVkIGludCBzaXplLCBwYWdlLCBtYXBfc2l6ZSA9IDA7Cgl1bnNpZ25lZCBsb25nIG1hcF9vZmZzZXQgPSAwOwoJdW5zaWduZWQgbG9uZyBvZmY7CglpbnQgaTsKCglpZiAoIXBhci0+bW1hcF9tYXApCgkJcmV0dXJuIC1FTlhJTzsKCglpZiAodm1hLT52bV9wZ29mZiA+ICh+MFVMID4+IFBBR0VfU0hJRlQpKQoJCXJldHVybiAtRUlOVkFMOwoKCW9mZiA9IHZtYS0+dm1fcGdvZmYgPDwgUEFHRV9TSElGVDsKCXNpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CgoJLyogVG8gc3RvcCB0aGUgc3dhcHBlciBmcm9tIGV2ZW4gY29uc2lkZXJpbmcgdGhlc2UgcGFnZXMuICovCgl2bWEtPnZtX2ZsYWdzIHw9IChWTV9JTyB8IFZNX1JFU0VSVkVEKTsKCglpZiAoKCh2bWEtPnZtX3Bnb2ZmID09IDApICYmIChzaXplID09IGluZm8tPmZpeC5zbWVtX2xlbikpIHx8CgkgICAgKChvZmYgPT0gaW5mby0+Zml4LnNtZW1fbGVuKSAmJiAoc2l6ZSA9PSBQQUdFX1NJWkUpKSkKCQlvZmYgKz0gMHg4MDAwMDAwMDAwMDAwMDAwVUw7CgoJdm1hLT52bV9wZ29mZiA9IG9mZiA+PiBQQUdFX1NISUZUOwkvKiBwcm9wYWdhdGUgb2ZmIGNoYW5nZXMgKi8KCgkvKiBFYWNoIHBhZ2UsIHNlZSB3aGljaCBtYXAgYXBwbGllcyAqLwoJZm9yIChwYWdlID0gMDsgcGFnZSA8IHNpemU7KSB7CgkJbWFwX3NpemUgPSAwOwoJCWZvciAoaSA9IDA7IHBhci0+bW1hcF9tYXBbaV0uc2l6ZTsgaSsrKSB7CgkJCXVuc2lnbmVkIGxvbmcgc3RhcnQgPSBwYXItPm1tYXBfbWFwW2ldLnZvZmY7CgkJCXVuc2lnbmVkIGxvbmcgZW5kID0gc3RhcnQgKyBwYXItPm1tYXBfbWFwW2ldLnNpemU7CgkJCXVuc2lnbmVkIGxvbmcgb2Zmc2V0ID0gb2ZmICsgcGFnZTsKCgkJCWlmIChzdGFydCA+IG9mZnNldCkKCQkJCWNvbnRpbnVlOwoJCQlpZiAob2Zmc2V0ID49IGVuZCkKCQkJCWNvbnRpbnVlOwoKCQkJbWFwX3NpemUgPSBwYXItPm1tYXBfbWFwW2ldLnNpemUgLSAob2Zmc2V0IC0gc3RhcnQpOwoJCQltYXBfb2Zmc2V0ID0KCQkJICAgIHBhci0+bW1hcF9tYXBbaV0ucG9mZiArIChvZmZzZXQgLSBzdGFydCk7CgkJCWJyZWFrOwoJCX0KCQlpZiAoIW1hcF9zaXplKSB7CgkJCXBhZ2UgKz0gUEFHRV9TSVpFOwoJCQljb250aW51ZTsKCQl9CgkJaWYgKHBhZ2UgKyBtYXBfc2l6ZSA+IHNpemUpCgkJCW1hcF9zaXplID0gc2l6ZSAtIHBhZ2U7CgoJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpICY9CgkJICAgIH4ocGFyLT5tbWFwX21hcFtpXS5wcm90X21hc2spOwoJCXBncHJvdF92YWwodm1hLT52bV9wYWdlX3Byb3QpIHw9IHBhci0+bW1hcF9tYXBbaV0ucHJvdF9mbGFnOwoKCQlpZiAocmVtYXBfcGZuX3JhbmdlKHZtYSwgdm1hLT52bV9zdGFydCArIHBhZ2UsCgkJCW1hcF9vZmZzZXQgPj4gUEFHRV9TSElGVCwgbWFwX3NpemUsIHZtYS0+dm1fcGFnZV9wcm90KSkKCQkJcmV0dXJuIC1FQUdBSU47CgoJCXBhZ2UgKz0gbWFwX3NpemU7Cgl9CgoJaWYgKCFtYXBfc2l6ZSkKCQlyZXR1cm4gLUVJTlZBTDsKCglpZiAoIXBhci0+bW1hcGVkKQoJCXBhci0+bW1hcGVkID0gMTsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHsKCXUzMiB5b2Zmc2V0OwoJdTggclsyXVsyNTZdOwoJdTggZ1syXVsyNTZdOwoJdTggYlsyXVsyNTZdOwp9IGF0eWZiX3NhdmU7CgpzdGF0aWMgdm9pZCBhdHlmYl9zYXZlX3BhbGV0dGUoc3RydWN0IGF0eWZiX3BhciAqcGFyLCBpbnQgZW50ZXIpCnsKCWludCBpLCB0bXA7CgoJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CgkJdG1wID0gYXR5X2xkXzgoREFDX0NOVEwsIHBhcikgJiAweGZjOwoJCWlmIChNNjRfSEFTKEVYVFJBX0JSSUdIVCkpCgkJCXRtcCB8PSAweDI7CgkJYXR5X3N0XzgoREFDX0NOVEwsIHRtcCwgcGFyKTsKCQlhdHlfc3RfOChEQUNfTUFTSywgMHhmZiwgcGFyKTsKCgkJYXR5X3N0XzgoREFDX1JfSU5ERVgsIGksIHBhcik7CgkJYXR5ZmJfc2F2ZS5yW2VudGVyXVtpXSA9IGF0eV9sZF84KERBQ19EQVRBLCBwYXIpOwoJCWF0eWZiX3NhdmUuZ1tlbnRlcl1baV0gPSBhdHlfbGRfOChEQUNfREFUQSwgcGFyKTsKCQlhdHlmYl9zYXZlLmJbZW50ZXJdW2ldID0gYXR5X2xkXzgoREFDX0RBVEEsIHBhcik7CgkJYXR5X3N0XzgoREFDX1dfSU5ERVgsIGksIHBhcik7CgkJYXR5X3N0XzgoREFDX0RBVEEsIGF0eWZiX3NhdmUuclsxIC0gZW50ZXJdW2ldLCBwYXIpOwoJCWF0eV9zdF84KERBQ19EQVRBLCBhdHlmYl9zYXZlLmdbMSAtIGVudGVyXVtpXSwgcGFyKTsKCQlhdHlfc3RfOChEQUNfREFUQSwgYXR5ZmJfc2F2ZS5iWzEgLSBlbnRlcl1baV0sIHBhcik7Cgl9Cn0KCnN0YXRpYyB2b2lkIGF0eWZiX3BhbGV0dGUoaW50IGVudGVyKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXI7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBGQl9NQVg7IGkrKykgewoJCWluZm8gPSByZWdpc3RlcmVkX2ZiW2ldOwoJCWlmIChpbmZvICYmIGluZm8tPmZib3BzID09ICZhdHlmYl9vcHMpIHsKCQkJcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJCQkKCQkJYXR5ZmJfc2F2ZV9wYWxldHRlKHBhciwgZW50ZXIpOwoJCQlpZiAoZW50ZXIpIHsKCQkJCWF0eWZiX3NhdmUueW9mZnNldCA9IGluZm8tPnZhci55b2Zmc2V0OwoJCQkJaW5mby0+dmFyLnlvZmZzZXQgPSAwOwoJCQkJc2V0X29mZl9waXRjaChwYXIsIGluZm8pOwoJCQl9IGVsc2UgewoJCQkJaW5mby0+dmFyLnlvZmZzZXQgPSBhdHlmYl9zYXZlLnlvZmZzZXQ7CgkJCQlzZXRfb2ZmX3BpdGNoKHBhciwgaW5mbyk7CgkJCX0KCQkJYXR5X3N0X2xlMzIoQ1JUQ19PRkZfUElUQ0gsIHBhci0+Y3J0Yy5vZmZfcGl0Y2gsIHBhcik7CgkJCWJyZWFrOwoJCX0KCX0KfQojZW5kaWYgLyogX19zcGFyY19fICovCgoKCiNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUENJKQoKI2lmZGVmIENPTkZJR19QUENfUE1BQwovKiBQb3dlciBtYW5hZ2VtZW50IHJvdXRpbmVzLiBUaG9zZSBhcmUgdXNlZCBmb3IgUG93ZXJCb29rIHNsZWVwLgogKi8Kc3RhdGljIGludCBhdHlfcG93ZXJfbWdtdChpbnQgc2xlZXAsIHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJdTMyIHBtOwoJaW50IHRpbWVvdXQ7CgoJcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CglwbSA9IChwbSAmIH5QV1JfTUdUX01PREVfTUFTSykgfCBQV1JfTUdUX01PREVfUkVHOwoJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoKCXRpbWVvdXQgPSAyMDAwOwoJaWYgKHNsZWVwKSB7CgkJLyogU2xlZXAgKi8KCQlwbSAmPSB+UFdSX01HVF9PTjsKCQlhdHlfc3RfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBtLCBwYXIpOwoJCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCXVkZWxheSgxMCk7CgkJcG0gJj0gfihQV1JfQkxPTiB8IEFVVE9fUFdSX1VQKTsKCQlwbSB8PSBTVVNQRU5EX05PVzsKCQlhdHlfc3RfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBtLCBwYXIpOwoJCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCXVkZWxheSgxMCk7CgkJcG0gfD0gUFdSX01HVF9PTjsKCQlhdHlfc3RfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBtLCBwYXIpOwoJCWRvIHsKCQkJcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJCW1kZWxheSgxKTsKCQkJaWYgKCgtLXRpbWVvdXQpID09IDApCgkJCQlicmVhazsKCQl9IHdoaWxlICgocG0gJiBQV1JfTUdUX1NUQVRVU19NQVNLKSAhPSBQV1JfTUdUX1NUQVRVU19TVVNQRU5EKTsKCX0gZWxzZSB7CgkJLyogV2FrZXVwICovCgkJcG0gJj0gflBXUl9NR1RfT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQl1ZGVsYXkoMTApOwoJCXBtICY9IH5TVVNQRU5EX05PVzsKCQlwbSB8PSAoUFdSX0JMT04gfCBBVVRPX1BXUl9VUCk7CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQl1ZGVsYXkoMTApOwoJCXBtIHw9IFBXUl9NR1RfT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlkbyB7CgkJCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCQltZGVsYXkoMSk7CgkJCWlmICgoLS10aW1lb3V0KSA9PSAwKQoJCQkJYnJlYWs7CgkJfSB3aGlsZSAoKHBtICYgUFdSX01HVF9TVEFUVVNfTUFTSykgIT0gMCk7Cgl9CgltZGVsYXkoNTAwKTsKCglyZXR1cm4gdGltZW91dCA/IDAgOiAtRUlPOwp9CiNlbmRpZgoKc3RhdGljIGludCBhdHlmYl9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCglpZiAoc3RhdGUuZXZlbnQgPT0gcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50KQoJCXJldHVybiAwOwoKCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKCglmYl9zZXRfc3VzcGVuZChpbmZvLCAxKTsKCgkvKiBJZGxlICYgcmVzZXQgZW5naW5lICovCgl3YWl0X2Zvcl9pZGxlKHBhcik7CglhdHlfcmVzZXRfZW5naW5lKHBhcik7CgoJLyogQmxhbmsgZGlzcGxheSBhbmQgTENEICovCglhdHlmYl9ibGFuayhGQl9CTEFOS19QT1dFUkRPV04sIGluZm8pOwoKCXBhci0+YXNsZWVwID0gMTsKCXBhci0+bG9ja19ibGFuayA9IDE7CgojaWZkZWYgQ09ORklHX1BQQ19QTUFDCgkvKiBTZXQgY2hpcCB0byAic3VzcGVuZCIgbW9kZSAqLwoJaWYgKGF0eV9wb3dlcl9tZ210KDEsIHBhcikpIHsKCQlwYXItPmFzbGVlcCA9IDA7CgkJcGFyLT5sb2NrX2JsYW5rID0gMDsKCQlhdHlmYl9ibGFuayhGQl9CTEFOS19VTkJMQU5LLCBpbmZvKTsKCQlmYl9zZXRfc3VzcGVuZChpbmZvLCAwKTsKCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CgkJcmV0dXJuIC1FSU87Cgl9CiNlbHNlCglwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIHBjaV9jaG9vc2Vfc3RhdGUocGRldiwgc3RhdGUpKTsKI2VuZGlmCgoJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwoKCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eWZiX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCnsKCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoKCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pCgkJcmV0dXJuIDA7CgoJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwoKI2lmZGVmIENPTkZJR19QUENfUE1BQwoJaWYgKHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCA9PSAyKQoJCWF0eV9wb3dlcl9tZ210KDAsIHBhcik7CiNlbHNlCglwY2lfc2V0X3Bvd2VyX3N0YXRlKHBkZXYsIFBDSV9EMCk7CiNlbmRpZgoKCWF0eV9yZXN1bWVfY2hpcChpbmZvKTsKCglwYXItPmFzbGVlcCA9IDA7CgoJLyogUmVzdG9yZSBkaXNwbGF5ICovCglhdHlmYl9zZXRfcGFyKGluZm8pOwoKCS8qIFJlZnJlc2ggKi8KCWZiX3NldF9zdXNwZW5kKGluZm8sIDApOwoKCS8qIFVuYmxhbmsgKi8KCXBhci0+bG9ja19ibGFuayA9IDA7CglhdHlmYl9ibGFuayhGQl9CTEFOS19VTkJMQU5LLCBpbmZvKTsKCglyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CgoJcGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlID0gUE1TR19PTjsKCglyZXR1cm4gMDsKfQoKI2VuZGlmIC8qICBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUENJKSAqLwoKLyogQmFja2xpZ2h0ICovCiNpZmRlZiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVAojZGVmaW5lIE1BWF9MRVZFTCAweEZGCgpzdGF0aWMgaW50IGF0eV9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGludCBsZXZlbCkKewoJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGFyLT5wZGV2KTsKCWludCBhdHlsZXZlbDsKCgkvKiBHZXQgYW5kIGNvbnZlcnQgdGhlIHZhbHVlICovCgkvKiBObyBsb2NraW5nIG9mIGJsX2N1cnZlIHNpbmNlIHdlIHJlYWQgYSBzaW5nbGUgdmFsdWUgKi8KCWF0eWxldmVsID0gaW5mby0+YmxfY3VydmVbbGV2ZWxdICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTDsKCglpZiAoYXR5bGV2ZWwgPCAwKQoJCWF0eWxldmVsID0gMDsKCWVsc2UgaWYgKGF0eWxldmVsID4gTUFYX0xFVkVMKQoJCWF0eWxldmVsID0gTUFYX0xFVkVMOwoKCXJldHVybiBhdHlsZXZlbDsKfQoKc3RhdGljIGludCBhdHlfYmxfdXBkYXRlX3N0YXR1cyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IGNsYXNzX2dldF9kZXZkYXRhKCZiZC0+Y2xhc3NfZGV2KTsKCXVuc2lnbmVkIGludCByZWcgPSBhdHlfbGRfbGNkKExDRF9NSVNDX0NOVEwsIHBhcik7CglpbnQgbGV2ZWw7CgoJaWYgKGJkLT5wcm9wcy5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CgkgICAgYmQtPnByb3BzLmZiX2JsYW5rICE9IEZCX0JMQU5LX1VOQkxBTkspCgkJbGV2ZWwgPSAwOwoJZWxzZQoJCWxldmVsID0gYmQtPnByb3BzLmJyaWdodG5lc3M7CgoJcmVnIHw9IChCTE1PRF9FTiB8IEJJQVNNT0RfRU4pOwoJaWYgKGxldmVsID4gMCkgewoJCXJlZyAmPSB+QklBU19NT0RfTEVWRUxfTUFTSzsKCQlyZWcgfD0gKGF0eV9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhwYXIsIGxldmVsKSA8PCBCSUFTX01PRF9MRVZFTF9TSElGVCk7Cgl9IGVsc2UgewoJCXJlZyAmPSB+QklBU19NT0RfTEVWRUxfTUFTSzsKCQlyZWcgfD0gKGF0eV9ibF9nZXRfbGV2ZWxfYnJpZ2h0bmVzcyhwYXIsIDApIDw8IEJJQVNfTU9EX0xFVkVMX1NISUZUKTsKCX0KCWF0eV9zdF9sY2QoTENEX01JU0NfQ05UTCwgcmVnLCBwYXIpOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eV9ibF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCnsKCXJldHVybiBiZC0+cHJvcHMuYnJpZ2h0bmVzczsKfQoKc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfb3BzIGF0eV9ibF9kYXRhID0gewoJLmdldF9icmlnaHRuZXNzID0gYXR5X2JsX2dldF9icmlnaHRuZXNzLAoJLnVwZGF0ZV9zdGF0dXMJPSBhdHlfYmxfdXBkYXRlX3N0YXR1cywKfTsKCnN0YXRpYyB2b2lkIGF0eV9ibF9pbml0KHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGFyLT5wZGV2KTsKCXN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZDsKCWNoYXIgbmFtZVsxMl07CgojaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCglpZiAoIXBtYWNfaGFzX2JhY2tsaWdodF90eXBlKCJhdGkiKSkKCQlyZXR1cm47CiNlbmRpZgoKCXNucHJpbnRmKG5hbWUsIHNpemVvZihuYW1lKSwgImF0eWJsJWQiLCBpbmZvLT5ub2RlKTsKCgliZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIobmFtZSwgaW5mby0+ZGV2LCBwYXIsICZhdHlfYmxfZGF0YSk7CglpZiAoSVNfRVJSKGJkKSkgewoJCWluZm8tPmJsX2RldiA9IE5VTEw7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXR5OiBCYWNrbGlnaHQgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CgkJZ290byBlcnJvcjsKCX0KCglpbmZvLT5ibF9kZXYgPSBiZDsKCWZiX2JsX2RlZmF1bHRfY3VydmUoaW5mbywgMCwKCQkweDNGICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCwKCQkweEZGICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCk7CgoJYmQtPnByb3BzLm1heF9icmlnaHRuZXNzID0gRkJfQkFDS0xJR0hUX0xFVkVMUyAtIDE7CgliZC0+cHJvcHMuYnJpZ2h0bmVzcyA9IGJkLT5wcm9wcy5tYXhfYnJpZ2h0bmVzczsKCWJkLT5wcm9wcy5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CgliYWNrbGlnaHRfdXBkYXRlX3N0YXR1cyhiZCk7CgoJcHJpbnRrKCJhdHk6IEJhY2tsaWdodCBpbml0aWFsaXplZCAoJXMpXG4iLCBuYW1lKTsKCglyZXR1cm47CgplcnJvcjoKCXJldHVybjsKfQoKc3RhdGljIHZvaWQgYXR5X2JsX2V4aXQoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQp7CgliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoYmQpOwoJcHJpbnRrKCJhdHk6IEJhY2tsaWdodCB1bmxvYWRlZFxuIik7Cn0KCiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVCAqLwoKc3RhdGljIHZvaWQgX19kZXZpbml0IGF0eV9jYWxjX21lbV9yZWZyZXNoKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgaW50IHhjbGspCnsKCWNvbnN0IGludCByYWdlcHJvX3RibFtdID0gewoJCTQ0LCA1MCwgNTUsIDY2LCA3NSwgODAsIDEwMAoJfTsKCWNvbnN0IGludCByYWdleGxfdGJsW10gPSB7CgkJNTAsIDY2LCA3NSwgODMsIDkwLCA5NSwgMTAwLCAxMDUsCgkJMTEwLCAxMTUsIDEyMCwgMTI1LCAxMzMsIDE0MywgMTY2Cgl9OwoJY29uc3QgaW50ICpyZWZyZXNoX3RibDsKCWludCBpLCBzaXplOwoKCWlmIChJU19YTChwYXItPnBjaV9pZCkgfHwgSVNfTU9CSUxJVFkocGFyLT5wY2lfaWQpKSB7CgkJcmVmcmVzaF90YmwgPSByYWdleGxfdGJsOwoJCXNpemUgPSBBUlJBWV9TSVpFKHJhZ2V4bF90YmwpOwoJfSBlbHNlIHsKCQlyZWZyZXNoX3RibCA9IHJhZ2Vwcm9fdGJsOwoJCXNpemUgPSBBUlJBWV9TSVpFKHJhZ2Vwcm9fdGJsKTsKCX0KCglmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykgewoJCWlmICh4Y2xrIDwgcmVmcmVzaF90YmxbaV0pCgkJYnJlYWs7Cgl9CglwYXItPm1lbV9yZWZyZXNoX3JhdGUgPSBpOwp9CgogICAgLyoKICAgICAqICBJbml0aWFsaXNhdGlvbgogICAgICovCgpzdGF0aWMgc3RydWN0IGZiX2luZm8gKmZiX2xpc3QgPSBOVUxMOwoKI2lmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfZ2V0X3RpbWluZ3NfZnJvbV9sY2Qoc3RydWN0IGF0eWZiX3BhciAqcGFyLAoJCQkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKewoJaW50IHJldCA9IC1FSU5WQUw7CgoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDAgJiYgKGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpICYgTENEX09OKSkgewoJCSp2YXIgPSBkZWZhdWx0X3ZhcjsKCQl2YXItPnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbCA9IHBhci0+bGNkX2hkaXNwOwoJCXZhci0+cmlnaHRfbWFyZ2luID0gcGFyLT5sY2RfcmlnaHRfbWFyZ2luOwoJCXZhci0+bGVmdF9tYXJnaW4gPSBwYXItPmxjZF9oYmxhbmtfbGVuIC0KCQkJKHBhci0+bGNkX3JpZ2h0X21hcmdpbiArIHBhci0+bGNkX2hzeW5jX2RseSArCgkJCSBwYXItPmxjZF9oc3luY19sZW4pOwoJCXZhci0+aHN5bmNfbGVuID0gcGFyLT5sY2RfaHN5bmNfbGVuICsgcGFyLT5sY2RfaHN5bmNfZGx5OwoJCXZhci0+eXJlcyA9IHZhci0+eXJlc192aXJ0dWFsID0gcGFyLT5sY2RfdmRpc3A7CgkJdmFyLT5sb3dlcl9tYXJnaW4gPSBwYXItPmxjZF9sb3dlcl9tYXJnaW47CgkJdmFyLT51cHBlcl9tYXJnaW4gPSBwYXItPmxjZF92YmxhbmtfbGVuIC0KCQkJKHBhci0+bGNkX2xvd2VyX21hcmdpbiArIHBhci0+bGNkX3ZzeW5jX2xlbik7CgkJdmFyLT52c3luY19sZW4gPSBwYXItPmxjZF92c3luY19sZW47CgkJdmFyLT5waXhjbG9jayA9IHBhci0+bGNkX3BpeGNsb2NrOwoJCXJldCA9IDA7Cgl9CgoJcmV0dXJuIHJldDsKfQojZW5kaWYgLyogZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKSAqLwoKc3RhdGljIGludCBfX2RldmluaXQgYXR5X2luaXQoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCWNvbnN0IGNoYXIgKnJhbW5hbWUgPSBOVUxMLCAqeHRhbDsKCWludCBndGJfbWVtc2l6ZSwgaGFzX3ZhciA9IDA7CglzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwoKCWluaXRfd2FpdHF1ZXVlX2hlYWQoJnBhci0+dmJsYW5rLndhaXQpOwoJc3Bpbl9sb2NrX2luaXQoJnBhci0+aW50X2xvY2spOwoKI2lmZGVmIENPTkZJR19QUENfUE1BQwoJLyogVGhlIEFwcGxlIGlCb29rMSB1c2VzIG5vbi1zdGFuZGFyZCBtZW1vcnkgZnJlcXVlbmNpZXMuIFdlIGRldGVjdCBpdAoJICogYW5kIHNldCB0aGUgZnJlcXVlbmN5IG1hbnVhbGx5LiAqLwoJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMiwxIikpIHsKCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDcwOwoJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNTM7Cgl9CiNlbmRpZgoJaWYgKHBsbCkKCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IHBsbDsKCWlmIChtY2xrKQoJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gbWNsazsKCWlmICh4Y2xrKQoJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0geGNsazsKCglhdHlfY2FsY19tZW1fcmVmcmVzaChwYXIsIHBhci0+cGxsX2xpbWl0cy54Y2xrKTsKCXBhci0+cGxsX3BlciA9IDEwMDAwMDAvcGFyLT5wbGxfbGltaXRzLnBsbF9tYXg7CglwYXItPm1jbGtfcGVyID0gMTAwMDAwMC9wYXItPnBsbF9saW1pdHMubWNsazsKCXBhci0+eGNsa19wZXIgPSAxMDAwMDAwL3Bhci0+cGxsX2xpbWl0cy54Y2xrOwoKCXBhci0+cmVmX2Nsa19wZXIgPSAxMDAwMDAwMDAwMDAwVUxMIC8gMTQzMTgxODA7Cgl4dGFsID0gIjE0LjMxODE4IjsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0dYCglpZiAoIU02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQl1MzIgc3RhdDA7CgkJdTggZGFjX3R5cGUsIGRhY19zdWJ0eXBlLCBjbGtfdHlwZTsKCQlzdGF0MCA9IGF0eV9sZF9sZTMyKENPTkZJR19TVEFUMCwgcGFyKTsKCQlwYXItPmJ1c190eXBlID0gKHN0YXQwID4+IDApICYgMHgwNzsKCQlwYXItPnJhbV90eXBlID0gKHN0YXQwID4+IDMpICYgMHgwNzsKCQlyYW1uYW1lID0gYXR5X2d4X3JhbVtwYXItPnJhbV90eXBlXTsKCQkvKiBGSVhNRTogY2xvY2tjaGlwL1JBTURBQyBwcm9iaW5nPyAqLwoJCWRhY190eXBlID0gKGF0eV9sZF9sZTMyKERBQ19DTlRMLCBwYXIpID4+IDE2KSAmIDB4MDc7CiNpZmRlZiBDT05GSUdfQVRBUkkKCQljbGtfdHlwZSA9IENMS19BVEkxODgxOF8xOwoJCWRhY190eXBlID0gKHN0YXQwID4+IDkpICYgMHgwNzsKCQlpZiAoZGFjX3R5cGUgPT0gMHgwNykKCQkJZGFjX3N1YnR5cGUgPSBEQUNfQVRUMjBDNDA4OwoJCWVsc2UKCQkJZGFjX3N1YnR5cGUgPSAoYXR5X2xkXzgoU0NSQVRDSF9SRUcxICsgMSwgcGFyKSAmIDB4RjApIHwgZGFjX3R5cGU7CiNlbHNlCgkJZGFjX3R5cGUgPSBEQUNfSUJNUkdCNTE0OwoJCWRhY19zdWJ0eXBlID0gREFDX0lCTVJHQjUxNDsKCQljbGtfdHlwZSA9IENMS19JQk1SR0I1MTQ7CiNlbmRpZgoJCXN3aXRjaCAoZGFjX3N1YnR5cGUpIHsKCQljYXNlIERBQ19JQk1SR0I1MTQ6CgkJCXBhci0+ZGFjX29wcyA9ICZhdHlfZGFjX2libTUxNDsKCQkJYnJlYWs7CgkJY2FzZSBEQUNfQVRJNjg4NjBfQjoKCQljYXNlIERBQ19BVEk2ODg2MF9DOgoJCQlwYXItPmRhY19vcHMgPSAmYXR5X2RhY19hdGk2ODg2MGI7CgkJCWJyZWFrOwoJCWNhc2UgREFDX0FUVDIwQzQwODoKCQljYXNlIERBQ19BVFQyMUM0OTg6CgkJCXBhci0+ZGFjX29wcyA9ICZhdHlfZGFjX2F0dDIxYzQ5ODsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJUFJJTlRLSSgiYXR5X2luaXQ6IERBQyB0eXBlIG5vdCBpbXBsZW1lbnRlZCB5ZXQhXG4iKTsKCQkJcGFyLT5kYWNfb3BzID0gJmF0eV9kYWNfdW5zdXBwb3J0ZWQ7CgkJCWJyZWFrOwoJCX0KCQlzd2l0Y2ggKGNsa190eXBlKSB7CiNpZmRlZiBDT05GSUdfQVRBUkkKCQljYXNlIENMS19BVEkxODgxOF8xOgoJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9hdGkxODgxOF8xOwoJCQlicmVhazsKI2Vsc2UKCQljYXNlIENMS19JQk1SR0I1MTQ6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX2libTUxNDsKCQkJYnJlYWs7CiNlbmRpZgojaWYgMCAvKiBkZWFkIGNvZGUgKi8KCQljYXNlIENMS19TVEcxNzAzOgoJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9zdGcxNzAzOwoJCQlicmVhazsKCQljYXNlIENMS19DSDgzOTg6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX2NoODM5ODsKCQkJYnJlYWs7CgkJY2FzZSBDTEtfQVRUMjBDNDA4OgoJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9hdHQyMGM0MDg7CgkJCWJyZWFrOwojZW5kaWYKCQlkZWZhdWx0OgoJCQlQUklOVEtJKCJhdHlfaW5pdDogQ0xLIHR5cGUgbm90IGltcGxlbWVudGVkIHlldCEiKTsKCQkJcGFyLT5wbGxfb3BzID0gJmF0eV9wbGxfdW5zdXBwb3J0ZWQ7CgkJCWJyZWFrOwoJCX0KCX0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR1ggKi8KI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKCWlmIChNNjRfSEFTKElOVEVHUkFURUQpKSB7CgkJcGFyLT5kYWNfb3BzID0gJmF0eV9kYWNfY3Q7CgkJcGFyLT5wbGxfb3BzID0gJmF0eV9wbGxfY3Q7CgkJcGFyLT5idXNfdHlwZSA9IFBDSTsKCQlwYXItPnJhbV90eXBlID0gKGF0eV9sZF9sZTMyKENPTkZJR19TVEFUMCwgcGFyKSAmIDB4MDcpOwoJCXJhbW5hbWUgPSBhdHlfY3RfcmFtW3Bhci0+cmFtX3R5cGVdOwoJCS8qIGZvciBtYW55IGNoaXBzLCB0aGUgbWNsayBpcyA2NyBNSHogZm9yIFNEUkFNLCA2MyBNSHogb3RoZXJ3aXNlICovCgkJaWYgKHBhci0+cGxsX2xpbWl0cy5tY2xrID09IDY3ICYmIHBhci0+cmFtX3R5cGUgPCBTRFJBTSkKCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2MzsKCX0KCglpZiAoTTY0X0hBUyhHVEJfRFNQKSkgewoJCXU4IHBsbF9yZWZfZGl2ID0gYXR5X2xkX3BsbF9jdChQTExfUkVGX0RJViwgcGFyKTsKCgkJaWYgKHBsbF9yZWZfZGl2KSB7CgkJCWludCBkaWZmMSwgZGlmZjI7CgkJCWRpZmYxID0gNTEwICogMTQgLyBwbGxfcmVmX2RpdiAtIHBhci0+cGxsX2xpbWl0cy5wbGxfbWF4OwoJCQlkaWZmMiA9IDUxMCAqIDI5IC8gcGxsX3JlZl9kaXYgLSBwYXItPnBsbF9saW1pdHMucGxsX21heDsKCQkJaWYgKGRpZmYxIDwgMCkKCQkJCWRpZmYxID0gLWRpZmYxOwoJCQlpZiAoZGlmZjIgPCAwKQoJCQkJZGlmZjIgPSAtZGlmZjI7CgkJCWlmIChkaWZmMiA8IGRpZmYxKSB7CgkJCQlwYXItPnJlZl9jbGtfcGVyID0gMTAwMDAwMDAwMDAwMFVMTCAvIDI5NDk4OTI4OwoJCQkJeHRhbCA9ICIyOS40OTg5MjgiOwoJCQl9CgkJfQoJfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9DVCAqLwoKCS8qIHNhdmUgcHJldmlvdXMgdmlkZW8gbW9kZSAqLwoJYXR5X2dldF9jcnRjKHBhciwgJnNhdmVkX2NydGMpOwoJaWYocGFyLT5wbGxfb3BzLT5nZXRfcGxsKQoJCXBhci0+cGxsX29wcy0+Z2V0X3BsbChpbmZvLCAmc2F2ZWRfcGxsKTsKCglwYXItPm1lbV9jbnRsID0gYXR5X2xkX2xlMzIoTUVNX0NOVEwsIHBhcik7CglndGJfbWVtc2l6ZSA9IE02NF9IQVMoR1RCX0RTUCk7CglpZiAoZ3RiX21lbXNpemUpCgkJc3dpdGNoIChwYXItPm1lbV9jbnRsICYgMHhGKSB7CS8qIDB4RiB1c2VkIGluc3RlYWQgb2YgTUVNX1NJWkVfQUxJQVMgKi8KCQljYXNlIE1FTV9TSVpFXzUxMks6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfMU06CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4MTAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzJNX0dUQjoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHgyMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfNE1fR1RCOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDQwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV82TV9HVEI6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4NjAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzhNX0dUQjoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDA7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDA7Cgl9IGVsc2UKCQlzd2l0Y2ggKHBhci0+bWVtX2NudGwgJiBNRU1fU0laRV9BTElBUykgewoJCWNhc2UgTUVNX1NJWkVfNTEySzoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV8xTToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHgxMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfMk06CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4MjAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzRNOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDQwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV82TToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg2MDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfOE06CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDAwOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDgwMDAwOwoJCX0KCglpZiAoTTY0X0hBUyhNQUdJQ19WUkFNX1NJWkUpKSB7CgkJaWYgKGF0eV9sZF9sZTMyKENPTkZJR19TVEFUMSwgcGFyKSAmIDB4NDAwMDAwMDApCgkJCWluZm8tPmZpeC5zbWVtX2xlbiArPSAweDQwMDAwMDsKCX0KCglpZiAodnJhbSkgewoJCWluZm8tPmZpeC5zbWVtX2xlbiA9IHZyYW0gKiAxMDI0OwoJCXBhci0+bWVtX2NudGwgJj0gfihndGJfbWVtc2l6ZSA/IDB4RiA6IE1FTV9TSVpFX0FMSUFTKTsKCQlpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4ODAwMDApCgkJCXBhci0+bWVtX2NudGwgfD0gTUVNX1NJWkVfNTEySzsKCQllbHNlIGlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHgxMDAwMDApCgkJCXBhci0+bWVtX2NudGwgfD0gTUVNX1NJWkVfMU07CgkJZWxzZSBpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4MjAwMDAwKQoJCQlwYXItPm1lbV9jbnRsIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfMk1fR1RCIDogTUVNX1NJWkVfMk07CgkJZWxzZSBpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4NDAwMDAwKQoJCQlwYXItPm1lbV9jbnRsIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfNE1fR1RCIDogTUVNX1NJWkVfNE07CgkJZWxzZSBpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4NjAwMDAwKQoJCQlwYXItPm1lbV9jbnRsIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfNk1fR1RCIDogTUVNX1NJWkVfNk07CgkJZWxzZQoJCQlwYXItPm1lbV9jbnRsIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfOE1fR1RCIDogTUVNX1NJWkVfOE07CgkJYXR5X3N0X2xlMzIoTUVNX0NOVEwsIHBhci0+bWVtX2NudGwsIHBhcik7Cgl9CgoJLyoKCSAqICBSZWcgQmxvY2sgMCAoQ1QtY29tcGF0aWJsZSBibG9jaykgaXMgYXQgbW1pb19zdGFydAoJICogIFJlZyBCbG9jayAxIChtdWx0aW1lZGlhIGV4dGVuc2lvbnMpIGlzIGF0IG1taW9fc3RhcnQgLSAweDQwMAoJICovCglpZiAoTTY0X0hBUyhHWCkpIHsKCQlpbmZvLT5maXgubW1pb19sZW4gPSAweDQwMDsKCQlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9BVElfTUFDSDY0R1g7Cgl9IGVsc2UgaWYgKE02NF9IQVMoQ1QpKSB7CgkJaW5mby0+Zml4Lm1taW9fbGVuID0gMHg0MDA7CgkJaW5mby0+Zml4LmFjY2VsID0gRkJfQUNDRUxfQVRJX01BQ0g2NENUOwoJfSBlbHNlIGlmIChNNjRfSEFTKFZUKSkgewoJCWluZm8tPmZpeC5tbWlvX3N0YXJ0IC09IDB4NDAwOwoJCWluZm8tPmZpeC5tbWlvX2xlbiA9IDB4ODAwOwoJCWluZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX0FUSV9NQUNINjRWVDsKCX0gZWxzZSB7LyogR1QgKi8KCQlpbmZvLT5maXgubW1pb19zdGFydCAtPSAweDQwMDsKCQlpbmZvLT5maXgubW1pb19sZW4gPSAweDgwMDsKCQlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9BVElfTUFDSDY0R1Q7Cgl9CgoJUFJJTlRLSSgiJWQlYyAlcywgJXMgTUh6IFhUQUwsICVkIE1IeiBQTEwsICVkIE1oeiBNQ0xLLCAlZCBNSHogWENMS1xuIiwKCSAgICAgICBpbmZvLT5maXguc21lbV9sZW4gPT0gMHg4MDAwMCA/IDUxMiA6IChpbmZvLT5maXguc21lbV9sZW4gPj4gMjApLAoJICAgICAgIGluZm8tPmZpeC5zbWVtX2xlbiA9PSAweDgwMDAwID8gJ0snIDogJ00nLCByYW1uYW1lLCB4dGFsLCBwYXItPnBsbF9saW1pdHMucGxsX21heCwKCSAgICAgICBwYXItPnBsbF9saW1pdHMubWNsaywgcGFyLT5wbGxfbGltaXRzLnhjbGspOwoKI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9DVCkKCWlmIChNNjRfSEFTKElOVEVHUkFURUQpKSB7CgkJaW50IGk7CgkJcHJpbnRrKCJkZWJ1ZyBhdHlmYjogQlVTX0NOVEwgREFDX0NOVEwgTUVNX0NOVEwgRVhUX01FTV9DTlRMIENSVENfR0VOX0NOVEwgIgoJCSAgICAgICAiRFNQX0NPTkZJRyBEU1BfT05fT0ZGIENMT0NLX0NOVExcbiIKCQkgICAgICAgImRlYnVnIGF0eWZiOiAlMDh4ICUwOHggJTA4eCAlMDh4ICAgICAlMDh4ICAgICAgJTA4eCAgICUwOHggICAlMDh4XG4iCgkJICAgICAgICJkZWJ1ZyBhdHlmYjogUExMIiwKCQkJYXR5X2xkX2xlMzIoQlVTX0NOVEwsIHBhciksIGF0eV9sZF9sZTMyKERBQ19DTlRMLCBwYXIpLAoJCQlhdHlfbGRfbGUzMihNRU1fQ05UTCwgcGFyKSwgYXR5X2xkX2xlMzIoRVhUX01FTV9DTlRMLCBwYXIpLAoJCQlhdHlfbGRfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXIpLCBhdHlfbGRfbGUzMihEU1BfQ09ORklHLCBwYXIpLAoJCQlhdHlfbGRfbGUzMihEU1BfT05fT0ZGLCBwYXIpLCBhdHlfbGRfbGUzMihDTE9DS19DTlRMLCBwYXIpKTsKCQlmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykKCQkJcHJpbnRrKCIgJTAyeCIsIGF0eV9sZF9wbGxfY3QoaSwgcGFyKSk7CgkJcHJpbnRrKCJcbiIpOwoJfQojZW5kaWYKCWlmKHBhci0+cGxsX29wcy0+aW5pdF9wbGwpCgkJcGFyLT5wbGxfb3BzLT5pbml0X3BsbChpbmZvLCAmcGFyLT5wbGwpOwoJaWYgKHBhci0+cGxsX29wcy0+cmVzdW1lX3BsbCkKCQlwYXItPnBsbF9vcHMtPnJlc3VtZV9wbGwoaW5mbywgJnBhci0+cGxsKTsKCgkvKgoJICogIExhc3QgcGFnZSBvZiA4IE1CICg0IE1CIG9uIElTQSkgYXBlcnR1cmUgaXMgTU1JTywKCSAqICB1bmxlc3MgdGhlIGF1eGlsaWFyeSByZWdpc3RlciBhcGVydHVyZSBpcyB1c2VkLgoJICovCgoJaWYgKCFwYXItPmF1eF9zdGFydCAmJgoJCShpbmZvLT5maXguc21lbV9sZW4gPT0gMHg4MDAwMDAgfHwgKHBhci0+YnVzX3R5cGUgPT0gSVNBICYmIGluZm8tPmZpeC5zbWVtX2xlbiA9PSAweDQwMDAwMCkpKQoJCWluZm8tPmZpeC5zbWVtX2xlbiAtPSBHVUlfUkVTRVJWRTsKCgkvKgoJICogIERpc2FibGUgcmVnaXN0ZXIgYWNjZXNzIHRocm91Z2ggdGhlIGxpbmVhciBhcGVydHVyZQoJICogIGlmIHRoZSBhdXhpbGlhcnkgYXBlcnR1cmUgaXMgdXNlZCBzbyB3ZSBjYW4gYWNjZXNzCgkgKiAgdGhlIGZ1bGwgOCBNQiBvZiB2aWRlbyBSQU0gb24gOCBNQiBib2FyZHMuCgkgKi8KCWlmIChwYXItPmF1eF9zdGFydCkKCQlhdHlfc3RfbGUzMihCVVNfQ05UTCwgYXR5X2xkX2xlMzIoQlVTX0NOVEwsIHBhcikgfCBCVVNfQVBFUl9SRUdfRElTLCBwYXIpOwoKI2lmZGVmIENPTkZJR19NVFJSCglwYXItPm10cnJfYXBlciA9IC0xOwoJcGFyLT5tdHJyX3JlZyA9IC0xOwoJaWYgKCFub210cnIpIHsKCQkvKiBDb3ZlciB0aGUgd2hvbGUgcmVzb3VyY2UuICovCgkJIHBhci0+bXRycl9hcGVyID0gbXRycl9hZGQocGFyLT5yZXNfc3RhcnQsIHBhci0+cmVzX3NpemUsIE1UUlJfVFlQRV9XUkNPTUIsIDEpOwoJCSBpZiAocGFyLT5tdHJyX2FwZXIgPj0gMCAmJiAhcGFyLT5hdXhfc3RhcnQpIHsKCQkJLyogTWFrZSBhIGhvbGUgZm9yIG1taW8uICovCgkJCXBhci0+bXRycl9yZWcgPSBtdHJyX2FkZChwYXItPnJlc19zdGFydCArIDB4ODAwMDAwIC0gR1VJX1JFU0VSVkUsCgkJCQlHVUlfUkVTRVJWRSwgTVRSUl9UWVBFX1VOQ0FDSEFCTEUsIDEpOwoJCQlpZiAocGFyLT5tdHJyX3JlZyA8IDApIHsKCQkJCW10cnJfZGVsKHBhci0+bXRycl9hcGVyLCAwLCAwKTsKCQkJCXBhci0+bXRycl9hcGVyID0gLTE7CgkJCX0KCQkgfQoJfQojZW5kaWYKCglpbmZvLT5mYm9wcyA9ICZhdHlmYl9vcHM7CglpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBzZXVkb19wYWxldHRlOwoJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVCAgICAgICAgICAgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVCAgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9DT1BZQVJFQSAgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9ZUEFOOwoKI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAoJaWYgKE02NF9IQVMoRzNfUEJfMV8xKSAmJiBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazEsMSIpKSB7CgkJLyogdGhlc2UgYml0cyBsZXQgdGhlIDEwMSBwb3dlcmJvb2sgd2FrZSB1cCBmcm9tIHNsZWVwIC0tIHBhdWx1cyAqLwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpCgkJCSAgIHwgKFVTRV9GMzJLSFogfCBUUklTVEFURV9NRU1fRU4pLCBwYXIpOwoJfSBlbHNlCiNlbmRpZgoJaWYgKE02NF9IQVMoTU9CSUxfQlVTKSAmJiBiYWNrbGlnaHQpIHsKI2lmZGVmIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUCgkJYXR5X2JsX2luaXQgKHBhcik7CiNlbmRpZgoJfQoKCW1lbXNldCgmdmFyLCAwLCBzaXplb2YodmFyKSk7CiNpZmRlZiBDT05GSUdfUFBDCglpZiAobWFjaGluZV9pcyhwb3dlcm1hYykpIHsKCQkvKgoJCSAqICBGSVhNRTogVGhlIE5WUkFNIHN0dWZmIHNob3VsZCBiZSBwdXQgaW4gYSBNYWMtc3BlY2lmaWMgZmlsZSwgYXMgaXQKCQkgKiAgICAgICAgIGFwcGxpZXMgdG8gYWxsIE1hYyB2aWRlbyBjYXJkcwoJCSAqLwoJCWlmIChtb2RlKSB7CgkJCWlmIChtYWNfZmluZF9tb2RlKCZ2YXIsIGluZm8sIG1vZGUsIDgpKQoJCQkJaGFzX3ZhciA9IDE7CgkJfSBlbHNlIHsKCQkJaWYgKGRlZmF1bHRfdm1vZGUgPT0gVk1PREVfQ0hPT1NFKSB7CgkJCQlpbnQgc2Vuc2U7CgkJCQlpZiAoTTY0X0hBUyhHM19QQl8xMDI0eDc2OCkpCgkJCQkJLyogRzMgUG93ZXJCb29rIHdpdGggMTAyNHg3NjggTENEICovCgkJCQkJZGVmYXVsdF92bW9kZSA9IFZNT0RFXzEwMjRfNzY4XzYwOwoJCQkJZWxzZSBpZiAobWFjaGluZV9pc19jb21wYXRpYmxlKCJpTWFjIikpCgkJCQkJZGVmYXVsdF92bW9kZSA9IFZNT0RFXzEwMjRfNzY4Xzc1OwoJCQkJZWxzZSBpZiAobWFjaGluZV9pc19jb21wYXRpYmxlCgkJCQkJICgiUG93ZXJCb29rMiwxIikpCgkJCQkJLyogaUJvb2sgd2l0aCA4MDB4NjAwIExDRCAqLwoJCQkJCWRlZmF1bHRfdm1vZGUgPSBWTU9ERV84MDBfNjAwXzYwOwoJCQkJZWxzZQoJCQkJCWRlZmF1bHRfdm1vZGUgPSBWTU9ERV82NDBfNDgwXzY3OwoJCQkJc2Vuc2UgPSByZWFkX2F0eV9zZW5zZShwYXIpOwoJCQkJUFJJTlRLSSgibW9uaXRvciBzZW5zZT0leCwgbW9kZSAlZFxuIiwKCQkJCQlzZW5zZSwgIG1hY19tYXBfbW9uaXRvcl9zZW5zZShzZW5zZSkpOwoJCQl9CgkJCWlmIChkZWZhdWx0X3Ztb2RlIDw9IDAgfHwgZGVmYXVsdF92bW9kZSA+IFZNT0RFX01BWCkKCQkJCWRlZmF1bHRfdm1vZGUgPSBWTU9ERV82NDBfNDgwXzYwOwoJCQlpZiAoZGVmYXVsdF9jbW9kZSA8IENNT0RFXzggfHwgZGVmYXVsdF9jbW9kZSA+IENNT0RFXzMyKQoJCQkJZGVmYXVsdF9jbW9kZSA9IENNT0RFXzg7CgkJCWlmICghbWFjX3Ztb2RlX3RvX3ZhcihkZWZhdWx0X3Ztb2RlLCBkZWZhdWx0X2Ntb2RlLAoJCQkJCSAgICAgICAmdmFyKSkKCQkJCWhhc192YXIgPSAxOwoJCX0KCX0KCiNlbmRpZiAvKiAhQ09ORklHX1BQQyAqLwoKI2lmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKCWlmICghYXR5ZmJfZ2V0X3RpbWluZ3NfZnJvbV9sY2QocGFyLCAmdmFyKSkKCQloYXNfdmFyID0gMTsKI2VuZGlmCgoJaWYgKG1vZGUgJiYgZmJfZmluZF9tb2RlKCZ2YXIsIGluZm8sIG1vZGUsIE5VTEwsIDAsICZkZWZtb2RlLCA4KSkKCQloYXNfdmFyID0gMTsKCglpZiAoIWhhc192YXIpCgkJdmFyID0gZGVmYXVsdF92YXI7CgoJaWYgKG5vYWNjZWwpCgkJdmFyLmFjY2VsX2ZsYWdzICY9IH5GQl9BQ0NFTEZfVEVYVDsKCWVsc2UKCQl2YXIuYWNjZWxfZmxhZ3MgfD0gRkJfQUNDRUxGX1RFWFQ7CgoJaWYgKGNvbXBfc3luYyAhPSAtMSkgewoJCWlmICghY29tcF9zeW5jKQoJCQl2YXIuc3luYyAmPSB+RkJfU1lOQ19DT01QX0hJR0hfQUNUOwoJCWVsc2UKCQkJdmFyLnN5bmMgfD0gRkJfU1lOQ19DT01QX0hJR0hfQUNUOwoJfQoKCWlmICh2YXIueXJlcyA9PSB2YXIueXJlc192aXJ0dWFsKSB7CgkJdTMyIHZpZGVvcmFtID0gKGluZm8tPmZpeC5zbWVtX2xlbiAtIChQQUdFX1NJWkUgPDwgMikpOwoJCXZhci55cmVzX3ZpcnR1YWwgPSAoKHZpZGVvcmFtICogOCkgLyB2YXIuYml0c19wZXJfcGl4ZWwpIC8gdmFyLnhyZXNfdmlydHVhbDsKCQlpZiAodmFyLnlyZXNfdmlydHVhbCA8IHZhci55cmVzKQoJCQl2YXIueXJlc192aXJ0dWFsID0gdmFyLnlyZXM7Cgl9CgoJaWYgKGF0eWZiX2NoZWNrX3ZhcigmdmFyLCBpbmZvKSkgewoJCVBSSU5US0UoImNhbid0IHNldCBkZWZhdWx0IHZpZGVvIG1vZGVcbiIpOwoJCWdvdG8gYXR5X2luaXRfZXhpdDsKCX0KCiNpZmRlZiBfX3NwYXJjX18KCWF0eWZiX3NhdmVfcGFsZXR0ZShwYXIsIDApOwojZW5kaWYKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0NUCglpZiAoIW5vYWNjZWwgJiYgTTY0X0hBUyhJTlRFR1JBVEVEKSkKCQlhdHlfaW5pdF9jdXJzb3IoaW5mbyk7CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0NUICovCglpbmZvLT52YXIgPSB2YXI7CgoJZmJfYWxsb2NfY21hcCgmaW5mby0+Y21hcCwgMjU2LCAwKTsKCglpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbykgPCAwKQoJCWdvdG8gYXR5X2luaXRfZXhpdDsKCglmYl9saXN0ID0gaW5mbzsKCglQUklOVEtJKCJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlIG9uICVzXG4iLAoJCWluZm8tPm5vZGUsIGluZm8tPmZpeC5pZCwgcGFyLT5idXNfdHlwZSA9PSBJU0EgPyAiSVNBIiA6ICJQQ0kiKTsKCXJldHVybiAwOwoKYXR5X2luaXRfZXhpdDoKCS8qIHJlc3RvcmUgdmlkZW8gbW9kZSAqLwoJYXR5X3NldF9jcnRjKHBhciwgJnNhdmVkX2NydGMpOwoJcGFyLT5wbGxfb3BzLT5zZXRfcGxsKGluZm8sICZzYXZlZF9wbGwpOwoKI2lmZGVmIENPTkZJR19NVFJSCglpZiAocGFyLT5tdHJyX3JlZyA+PSAwKSB7CgkgICAgbXRycl9kZWwocGFyLT5tdHJyX3JlZywgMCwgMCk7CgkgICAgcGFyLT5tdHJyX3JlZyA9IC0xOwoJfQoJaWYgKHBhci0+bXRycl9hcGVyID49IDApIHsKCSAgICBtdHJyX2RlbChwYXItPm10cnJfYXBlciwgMCwgMCk7CgkgICAgcGFyLT5tdHJyX2FwZXIgPSAtMTsKCX0KI2VuZGlmCglyZXR1cm4gLTE7Cn0KCnN0YXRpYyB2b2lkIGF0eV9yZXN1bWVfY2hpcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwoKCWF0eV9zdF9sZTMyKE1FTV9DTlRMLCBwYXItPm1lbV9jbnRsLCBwYXIpOwoKCWlmIChwYXItPnBsbF9vcHMtPnJlc3VtZV9wbGwpCgkJcGFyLT5wbGxfb3BzLT5yZXN1bWVfcGxsKGluZm8sICZwYXItPnBsbCk7CgoJaWYgKHBhci0+YXV4X3N0YXJ0KQoJCWF0eV9zdF9sZTMyKEJVU19DTlRMLCBhdHlfbGRfbGUzMihCVVNfQ05UTCwgcGFyKSB8IEJVU19BUEVSX1JFR19ESVMsIHBhcik7Cn0KCiNpZmRlZiBDT05GSUdfQVRBUkkKc3RhdGljIGludCBfX2RldmluaXQgc3RvcmVfdmlkZW9fcGFyKGNoYXIgKnZpZGVvX3N0ciwgdW5zaWduZWQgY2hhciBtNjRfbnVtKQp7CgljaGFyICpwOwoJdW5zaWduZWQgbG9uZyB2bWVtYmFzZSwgc2l6ZSwgZ3VpcmVnYmFzZTsKCglQUklOVEtJKCJzdG9yZV92aWRlb19wYXIoKSAnJXMnIFxuIiwgdmlkZW9fc3RyKTsKCglpZiAoIShwID0gc3Ryc2VwKCZ2aWRlb19zdHIsICI7IikpIHx8ICEqcCkKCQlnb3RvIG1hY2g2NF9pbnZhbGlkOwoJdm1lbWJhc2UgPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAwKTsKCWlmICghKHAgPSBzdHJzZXAoJnZpZGVvX3N0ciwgIjsiKSkgfHwgISpwKQoJCWdvdG8gbWFjaDY0X2ludmFsaWQ7CglzaXplID0gc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMCk7CglpZiAoIShwID0gc3Ryc2VwKCZ2aWRlb19zdHIsICI7IikpIHx8ICEqcCkKCQlnb3RvIG1hY2g2NF9pbnZhbGlkOwoJZ3VpcmVnYmFzZSA9IHNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDApOwoKCXBoeXNfdm1lbWJhc2VbbTY0X251bV0gPSB2bWVtYmFzZTsKCXBoeXNfc2l6ZVttNjRfbnVtXSA9IHNpemU7CglwaHlzX2d1aXJlZ2Jhc2VbbTY0X251bV0gPSBndWlyZWdiYXNlOwoJUFJJTlRLSSgic3RvcmVkIHRoZW0gYWxsOiAkJTA4bFggJCUwOGxYICQlMDhsWCBcbiIsIHZtZW1iYXNlLCBzaXplLAoJICAgICAgIGd1aXJlZ2Jhc2UpOwoJcmV0dXJuIDA7CgogICAgICBtYWNoNjRfaW52YWxpZDoKCXBoeXNfdm1lbWJhc2VbbTY0X251bV0gPSAwOwoJcmV0dXJuIC0xOwp9CiNlbmRpZiAvKiBDT05GSUdfQVRBUkkgKi8KCiAgICAvKgogICAgICogIEJsYW5rIHRoZSBkaXNwbGF5LgogICAgICovCgpzdGF0aWMgaW50IGF0eWZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCXUzMiBnZW5fY250bDsKCglpZiAocGFyLT5sb2NrX2JsYW5rIHx8IHBhci0+YXNsZWVwKQoJCXJldHVybiAwOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUCiNlbGlmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKCWlmIChwYXItPmxjZF90YWJsZSAmJiBibGFuayA+IEZCX0JMQU5LX05PUk1BTCAmJgoJICAgIChhdHlfbGRfbGNkKExDRF9HRU5fQ05UTCwgcGFyKSAmIExDRF9PTikpIHsKCQl1MzIgcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJcG0gJj0gflBXUl9CTE9OOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7Cgl9CiNlbmRpZgoKCWdlbl9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKTsKCWdlbl9jbnRsICY9IH4weDQwMDAwNGM7Cglzd2l0Y2ggKGJsYW5rKSB7CgkJY2FzZSBGQl9CTEFOS19VTkJMQU5LOgoJCQlicmVhazsKCQljYXNlIEZCX0JMQU5LX05PUk1BTDoKCQkJZ2VuX2NudGwgfD0gMHg0MDAwMDQwOwoJCQlicmVhazsKCQljYXNlIEZCX0JMQU5LX1ZTWU5DX1NVU1BFTkQ6CgkJCWdlbl9jbnRsIHw9IDB4NDAwMDA0ODsKCQkJYnJlYWs7CgkJY2FzZSBGQl9CTEFOS19IU1lOQ19TVVNQRU5EOgoJCQlnZW5fY250bCB8PSAweDQwMDAwNDQ7CgkJCWJyZWFrOwoJCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgoJCQlnZW5fY250bCB8PSAweDQwMDAwNGM7CgkJCWJyZWFrOwoJfQoJYXR5X3N0X2xlMzIoQ1JUQ19HRU5fQ05UTCwgZ2VuX2NudGwsIHBhcik7CgojaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKI2VsaWYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQoJaWYgKHBhci0+bGNkX3RhYmxlICYmIGJsYW5rIDw9IEZCX0JMQU5LX05PUk1BTCAmJgoJICAgIChhdHlfbGRfbGNkKExDRF9HRU5fQ05UTCwgcGFyKSAmIExDRF9PTikpIHsKCQl1MzIgcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJcG0gfD0gUFdSX0JMT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCX0KI2VuZGlmCgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGF0eV9zdF9wYWwodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCgkJICAgICAgIGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJYXR5X3N0XzgoREFDX1dfSU5ERVgsIHJlZ25vLCBwYXIpOwoJYXR5X3N0XzgoREFDX0RBVEEsIHJlZCwgcGFyKTsKCWF0eV9zdF84KERBQ19EQVRBLCBncmVlbiwgcGFyKTsKCWF0eV9zdF84KERBQ19EQVRBLCBibHVlLCBwYXIpOwp9CgogICAgLyoKICAgICAqICBTZXQgYSBzaW5nbGUgY29sb3IgcmVnaXN0ZXIuIFRoZSB2YWx1ZXMgc3VwcGxpZWQgYXJlIGFscmVhZHkKICAgICAqICByb3VuZGVkIGRvd24gdG8gdGhlIGhhcmR3YXJlJ3MgY2FwYWJpbGl0aWVzIChhY2NvcmRpbmcgdG8gdGhlCiAgICAgKiAgZW50cmllcyBpbiB0aGUgdmFyIHN0cnVjdHVyZSkuIFJldHVybiAhPSAwIGZvciBpbnZhbGlkIHJlZ25vLgogICAgICogICEhIDQgJiA4ID0gIFBTRVVETywgPiA4ID0gRElSRUNUQ09MT1IKICAgICAqLwoKc3RhdGljIGludCBhdHlmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCgl1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CglpbnQgaSwgZGVwdGg7Cgl1MzIgKnBhbCA9IGluZm8tPnBzZXVkb19wYWxldHRlOwoKCWRlcHRoID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwoJaWYgKGRlcHRoID09IDE2KQoJCWRlcHRoID0gKGluZm8tPnZhci5ncmVlbi5sZW5ndGggPT0gNSkgPyAxNSA6IDE2OwoKCWlmIChwYXItPmFzbGVlcCkKCQlyZXR1cm4gMDsKCglpZiAocmVnbm8gPiAyNTUgfHwKCSAgICAoZGVwdGggPT0gMTYgJiYgcmVnbm8gPiA2MykgfHwKCSAgICAoZGVwdGggPT0gMTUgJiYgcmVnbm8gPiAzMSkpCgkJcmV0dXJuIDE7CgoJcmVkID4+PSA4OwoJZ3JlZW4gPj49IDg7CglibHVlID4+PSA4OwoKCXBhci0+cGFsZXR0ZVtyZWdub10ucmVkID0gcmVkOwoJcGFyLT5wYWxldHRlW3JlZ25vXS5ncmVlbiA9IGdyZWVuOwoJcGFyLT5wYWxldHRlW3JlZ25vXS5ibHVlID0gYmx1ZTsKCglpZiAocmVnbm8gPCAxNikgewoJCXN3aXRjaCAoZGVwdGgpIHsKCQljYXNlIDE1OgoJCQlwYWxbcmVnbm9dID0gKHJlZ25vIDw8IDEwKSB8IChyZWdubyA8PCA1KSB8IHJlZ25vOwoJCQlicmVhazsKCQljYXNlIDE2OgoJCQlwYWxbcmVnbm9dID0gKHJlZ25vIDw8IDExKSB8IChyZWdubyA8PCA1KSB8IHJlZ25vOwoJCQlicmVhazsKCQljYXNlIDI0OgoJCQlwYWxbcmVnbm9dID0gKHJlZ25vIDw8IDE2KSB8IChyZWdubyA8PCA4KSB8IHJlZ25vOwoJCQlicmVhazsKCQljYXNlIDMyOgoJCQlpID0gKHJlZ25vIDw8IDgpIHwgcmVnbm87CgkJCXBhbFtyZWdub10gPSAoaSA8PCAxNikgfCBpOwoJCQlicmVhazsKCQl9Cgl9CgoJaSA9IGF0eV9sZF84KERBQ19DTlRMLCBwYXIpICYgMHhmYzsKCWlmIChNNjRfSEFTKEVYVFJBX0JSSUdIVCkpCgkJaSB8PSAweDI7IC8qIERBQ19DTlRMIHwgMHgyIHR1cm5zIG9mZiB0aGUgZXh0cmEgYnJpZ2h0bmVzcyBmb3IgZ3QgKi8KCWF0eV9zdF84KERBQ19DTlRMLCBpLCBwYXIpOwoJYXR5X3N0XzgoREFDX01BU0ssIDB4ZmYsIHBhcik7CgoJaWYgKE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQlpZiAoZGVwdGggPT0gMTYpIHsKCQkJaWYgKHJlZ25vIDwgMzIpCgkJCQlhdHlfc3RfcGFsKHJlZ25vIDw8IDMsIHJlZCwKCQkJCQkgICBwYXItPnBhbGV0dGVbcmVnbm88PDFdLmdyZWVuLAoJCQkJCSAgIGJsdWUsIHBhcik7CgkJCXJlZCA9IHBhci0+cGFsZXR0ZVtyZWdubz4+MV0ucmVkOwoJCQlibHVlID0gcGFyLT5wYWxldHRlW3JlZ25vPj4xXS5ibHVlOwoJCQlyZWdubyA8PD0gMjsKCQl9IGVsc2UgaWYgKGRlcHRoID09IDE1KSB7CgkJCXJlZ25vIDw8PSAzOwoJCQlmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKCQkJICAgIGF0eV9zdF9wYWwocmVnbm8gKyBpLCByZWQsIGdyZWVuLCBibHVlLCBwYXIpOwoJCQl9CgkJfQoJfQoJYXR5X3N0X3BhbChyZWdubywgcmVkLCBncmVlbiwgYmx1ZSwgcGFyKTsKCglyZXR1cm4gMDsKfQoKI2lmZGVmIENPTkZJR19QQ0kKCiNpZmRlZiBfX3NwYXJjX18KCmV4dGVybiB2b2lkICgqcHJvbV9wYWxldHRlKSAoaW50KTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX3NldHVwX3NwYXJjKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAoJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBhZGRyKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSBpbmZvLT5wYXI7CglzdHJ1Y3QgcGNpZGV2X2Nvb2tpZSAqcGNwOwoJY2hhciBwcm9wWzEyOF07CglpbnQgbm9kZSwgbGVuLCBpLCBqLCByZXQ7Cgl1MzIgbWVtLCBjaGlwX2lkOwoKCS8qIERvIG5vdCBhdHRhY2ggd2hlbiB3ZSBoYXZlIGEgc2VyaWFsIGNvbnNvbGUuICovCglpZiAoIWNvbl9pc19wcmVzZW50KCkpCgkJcmV0dXJuIC1FTlhJTzsKCgkvKgoJICogTWFwIG1lbW9yeS1tYXBwZWQgcmVnaXN0ZXJzLgoJICovCglwYXItPmF0aV9yZWdiYXNlID0gKHZvaWQgKilhZGRyICsgMHg3ZmZjMDBVTDsKCWluZm8tPmZpeC5tbWlvX3N0YXJ0ID0gYWRkciArIDB4N2ZmYzAwVUw7CgoJLyoKCSAqIE1hcCBpbiBiaWctZW5kaWFuIGFwZXJ0dXJlLgoJICovCglpbmZvLT5zY3JlZW5fYmFzZSA9IChjaGFyICopIChhZGRyICsgMHg4MDAwMDBVTCk7CglpbmZvLT5maXguc21lbV9zdGFydCA9IGFkZHIgKyAweDgwMDAwMFVMOwoKCS8qCgkgKiBGaWd1cmUgbW1hcCBhZGRyZXNzZXMgZnJvbSBQQ0kgY29uZmlnIHNwYWNlLgoJICogU3BsaXQgRnJhbWVidWZmZXIgaW4gYmlnLSBhbmQgbGl0dGxlLWVuZGlhbiBoYWxmcy4KCSAqLwoJZm9yIChpID0gMDsgaSA8IDYgJiYgcGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7IGkrKykKCQkvKiBub3RoaW5nICovIDsKCWogPSBpICsgNDsKCglwYXItPm1tYXBfbWFwID0ga21hbGxvYyhqICogc2l6ZW9mKCpwYXItPm1tYXBfbWFwKSwgR0ZQX0FUT01JQyk7CglpZiAoIXBhci0+bW1hcF9tYXApIHsKCQlQUklOVEtFKCJhdHlmYl9zZXR1cF9zcGFyYygpIGNhbid0IGFsbG9jIG1tYXBfbWFwXG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCW1lbXNldChwYXItPm1tYXBfbWFwLCAwLCBqICogc2l6ZW9mKCpwYXItPm1tYXBfbWFwKSk7CgoJZm9yIChpID0gMCwgaiA9IDI7IGkgPCA2ICYmIHBkZXYtPnJlc291cmNlW2ldLnN0YXJ0OyBpKyspIHsKCQlzdHJ1Y3QgcmVzb3VyY2UgKnJwID0gJnBkZXYtPnJlc291cmNlW2ldOwoJCWludCBpbywgYnJlZyA9IFBDSV9CQVNFX0FERFJFU1NfMCArIChpIDw8IDIpOwoJCXVuc2lnbmVkIGxvbmcgYmFzZTsKCQl1MzIgc2l6ZSwgcGJhc2U7CgoJCWJhc2UgPSBycC0+c3RhcnQ7CgoJCWlvID0gKHJwLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pOwoKCQlzaXplID0gcnAtPmVuZCAtIGJhc2UgKyAxOwoKCQlwY2lfcmVhZF9jb25maWdfZHdvcmQocGRldiwgYnJlZywgJnBiYXNlKTsKCgkJaWYgKGlvKQoJCQlzaXplICY9IH4xOwoKCQkvKgoJCSAqIE1hcCB0aGUgZnJhbWVidWZmZXIgYSBzZWNvbmQgdGltZSwgdGhpcyB0aW1lIHdpdGhvdXQKCQkgKiB0aGUgYnJhaW5kZWFkIF9QQUdFX0lFIHNldHRpbmcuIFRoaXMgaXMgdXNlZCBieSB0aGUKCQkgKiBmaXhlZCBYc2VydmVyLCBidXQgd2UgbmVlZCB0byBtYWludGFpbiB0aGUgb2xkIG1hcHBpbmcKCQkgKiB0byBzdGF5IGNvbXBhdGlibGUgd2l0aCBvbGRlciBvbmVzLi4uCgkJICovCgkJaWYgKGJhc2UgPT0gYWRkcikgewoJCQlwYXItPm1tYXBfbWFwW2pdLnZvZmYgPSAocGJhc2UgKyAweDEwMDAwMDAwKSAmIFBBR0VfTUFTSzsKCQkJcGFyLT5tbWFwX21hcFtqXS5wb2ZmID0gYmFzZSAmIFBBR0VfTUFTSzsKCQkJcGFyLT5tbWFwX21hcFtqXS5zaXplID0gKHNpemUgKyB+UEFHRV9NQVNLKSAmIFBBR0VfTUFTSzsKCQkJcGFyLT5tbWFwX21hcFtqXS5wcm90X21hc2sgPSBfUEFHRV9DQUNIRTsKCQkJcGFyLT5tbWFwX21hcFtqXS5wcm90X2ZsYWcgPSBfUEFHRV9FOwoJCQlqKys7CgkJfQoKCQkvKgoJCSAqIEhlcmUgY29tZXMgdGhlIG9sZCBmcmFtZWJ1ZmZlciBtYXBwaW5nIHdpdGggX1BBR0VfSUUKCQkgKiBzZXQgZm9yIHRoZSBiaWcgZW5kaWFuIGhhbGYgb2YgdGhlIGZyYW1lYnVmZmVyLi4uCgkJICovCgkJaWYgKGJhc2UgPT0gYWRkcikgewoJCQlwYXItPm1tYXBfbWFwW2pdLnZvZmYgPSAocGJhc2UgKyAweDgwMDAwMCkgJiBQQUdFX01BU0s7CgkJCXBhci0+bW1hcF9tYXBbal0ucG9mZiA9IChiYXNlICsgMHg4MDAwMDApICYgUEFHRV9NQVNLOwoJCQlwYXItPm1tYXBfbWFwW2pdLnNpemUgPSAweDgwMDAwMDsKCQkJcGFyLT5tbWFwX21hcFtqXS5wcm90X21hc2sgPSBfUEFHRV9DQUNIRTsKCQkJcGFyLT5tbWFwX21hcFtqXS5wcm90X2ZsYWcgPSBfUEFHRV9FIHwgX1BBR0VfSUU7CgkJCXNpemUgLT0gMHg4MDAwMDA7CgkJCWorKzsKCQl9CgoJCXBhci0+bW1hcF9tYXBbal0udm9mZiA9IHBiYXNlICYgUEFHRV9NQVNLOwoJCXBhci0+bW1hcF9tYXBbal0ucG9mZiA9IGJhc2UgJiBQQUdFX01BU0s7CgkJcGFyLT5tbWFwX21hcFtqXS5zaXplID0gKHNpemUgKyB+UEFHRV9NQVNLKSAmIFBBR0VfTUFTSzsKCQlwYXItPm1tYXBfbWFwW2pdLnByb3RfbWFzayA9IF9QQUdFX0NBQ0hFOwoJCXBhci0+bW1hcF9tYXBbal0ucHJvdF9mbGFnID0gX1BBR0VfRTsKCQlqKys7Cgl9CgoJaWYoKHJldCA9IGNvcnJlY3RfY2hpcHNldChwYXIpKSkKCQlyZXR1cm4gcmV0OwoKCWlmIChJU19YTChwZGV2LT5kZXZpY2UpKSB7CgkJLyoKCQkgKiBGaXggUFJPTXMgaWRlYSBvZiBNRU1fQ05UTCBzZXR0aW5ncy4uLgoJCSAqLwoJCW1lbSA9IGF0eV9sZF9sZTMyKE1FTV9DTlRMLCBwYXIpOwoJCWNoaXBfaWQgPSBhdHlfbGRfbGUzMihDT05GSUdfQ0hJUF9JRCwgcGFyKTsKCQlpZiAoKChjaGlwX2lkICYgQ0ZHX0NISVBfVFlQRSkgPT0gVlRfQ0hJUF9JRCkgJiYgISgoY2hpcF9pZCA+PiAyNCkgJiAxKSkgewoJCQlzd2l0Y2ggKG1lbSAmIDB4MGYpIHsKCQkJY2FzZSAzOgoJCQkJbWVtID0gKG1lbSAmIH4oMHgwZikpIHwgMjsKCQkJCWJyZWFrOwoJCQljYXNlIDc6CgkJCQltZW0gPSAobWVtICYgfigweDBmKSkgfCAzOwoJCQkJYnJlYWs7CgkJCWNhc2UgOToKCQkJCW1lbSA9IChtZW0gJiB+KDB4MGYpKSB8IDQ7CgkJCQlicmVhazsKCQkJY2FzZSAxMToKCQkJCW1lbSA9IChtZW0gJiB+KDB4MGYpKSB8IDU7CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCWJyZWFrOwoJCQl9CgkJCWlmICgoYXR5X2xkX2xlMzIoQ09ORklHX1NUQVQwLCBwYXIpICYgNykgPj0gU0RSQU0pCgkJCQltZW0gJj0gfigweDAwNzAwMDAwKTsKCQl9CgkJbWVtICY9IH4oMHhjZjgwZTAwMCk7CS8qIFR1cm4gb2ZmIGFsbCB1bmRvY3VtZW50ZWQgYml0cy4gKi8KCQlhdHlfc3RfbGUzMihNRU1fQ05UTCwgbWVtLCBwYXIpOwoJfQoKCS8qCgkgKiBJZiB0aGlzIGlzIHRoZSBjb25zb2xlIGRldmljZSwgd2Ugd2lsbCBzZXQgZGVmYXVsdCB2aWRlbwoJICogc2V0dGluZ3MgdG8gd2hhdCB0aGUgUFJPTSBsZWZ0IHVzIHdpdGguCgkgKi8KCW5vZGUgPSBwcm9tX2dldGNoaWxkKHByb21fcm9vdF9ub2RlKTsKCW5vZGUgPSBwcm9tX3NlYXJjaHNpYmxpbmdzKG5vZGUsICJhbGlhc2VzIik7CglpZiAobm9kZSkgewoJCWxlbiA9IHByb21fZ2V0cHJvcGVydHkobm9kZSwgInNjcmVlbiIsIHByb3AsIHNpemVvZihwcm9wKSk7CgkJaWYgKGxlbiA+IDApIHsKCQkJcHJvcFtsZW5dID0gJ1wwJzsKCQkJbm9kZSA9IHByb21fZmluZGRldmljZShwcm9wKTsKCQl9IGVsc2UKCQkJbm9kZSA9IDA7Cgl9CgoJcGNwID0gcGRldi0+c3lzZGF0YTsKCWlmIChub2RlID09IHBjcC0+cHJvbV9ub2RlLT5ub2RlKSB7CgkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmZGVmYXVsdF92YXI7CgkJdW5zaWduZWQgaW50IE4sIFAsIFEsIE0sIFQsIFI7CgkJdTMyIHZfdG90YWwsIGhfdG90YWw7CgkJc3RydWN0IGNydGMgY3J0YzsKCQl1OCBwbGxfcmVnc1sxNl07CgkJdTggY2xvY2tfY250bDsKCgkJY3J0Yy52eHJlcyA9IHByb21fZ2V0aW50ZGVmYXVsdChub2RlLCAid2lkdGgiLCAxMDI0KTsKCQljcnRjLnZ5cmVzID0gcHJvbV9nZXRpbnRkZWZhdWx0KG5vZGUsICJoZWlnaHQiLCA3NjgpOwoJCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBwcm9tX2dldGludGRlZmF1bHQobm9kZSwgImRlcHRoIiwgOCk7CgkJdmFyLT54b2Zmc2V0ID0gdmFyLT55b2Zmc2V0ID0gMDsKCQljcnRjLmhfdG90X2Rpc3AgPSBhdHlfbGRfbGUzMihDUlRDX0hfVE9UQUxfRElTUCwgcGFyKTsKCQljcnRjLmhfc3luY19zdHJ0X3dpZCA9IGF0eV9sZF9sZTMyKENSVENfSF9TWU5DX1NUUlRfV0lELCBwYXIpOwoJCWNydGMudl90b3RfZGlzcCA9IGF0eV9sZF9sZTMyKENSVENfVl9UT1RBTF9ESVNQLCBwYXIpOwoJCWNydGMudl9zeW5jX3N0cnRfd2lkID0gYXR5X2xkX2xlMzIoQ1JUQ19WX1NZTkNfU1RSVF9XSUQsIHBhcik7CgkJY3J0Yy5nZW5fY250bCA9IGF0eV9sZF9sZTMyKENSVENfR0VOX0NOVEwsIHBhcik7CgkJYXR5X2NydGNfdG9fdmFyKCZjcnRjLCB2YXIpOwoKCQloX3RvdGFsID0gdmFyLT54cmVzICsgdmFyLT5yaWdodF9tYXJnaW4gKyB2YXItPmhzeW5jX2xlbiArIHZhci0+bGVmdF9tYXJnaW47CgkJdl90b3RhbCA9IHZhci0+eXJlcyArIHZhci0+bG93ZXJfbWFyZ2luICsgdmFyLT52c3luY19sZW4gKyB2YXItPnVwcGVyX21hcmdpbjsKCgkJLyoKCQkgKiBSZWFkIHRoZSBQTEwgdG8gZmlndXJlIGFjdHVhbCBSZWZyZXNoIFJhdGUuCgkJICovCgkJY2xvY2tfY250bCA9IGF0eV9sZF84KENMT0NLX0NOVEwsIHBhcik7CgkJLyogRFBSSU5USygiQ0xPQ0tfQ05UTCAlMDJ4XG4iLCBjbG9ja19jbnRsKTsgKi8KCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKCQkJcGxsX3JlZ3NbaV0gPSBhdHlfbGRfcGxsX2N0KGksIHBhcik7CgoJCS8qCgkJICogUExMIFJlZmVyZW5jZSBEaXZpZGVyIE06CgkJICovCgkJTSA9IHBsbF9yZWdzWzJdOwoKCQkvKgoJCSAqIFBMTCBGZWVkYmFjayBEaXZpZGVyIE4gKERlcGVuZGFudCBvbiBDTE9DS19DTlRMKToKCQkgKi8KCQlOID0gcGxsX3JlZ3NbNyArIChjbG9ja19jbnRsICYgMyldOwoKCQkvKgoJCSAqIFBMTCBQb3N0IERpdmlkZXIgUCAoRGVwZW5kYW50IG9uIENMT0NLX0NOVEwpOgoJCSAqLwoJCVAgPSAxIDw8IChwbGxfcmVnc1s2XSA+PiAoKGNsb2NrX2NudGwgJiAzKSA8PCAxKSk7CgoJCS8qCgkJICogUExMIERpdmlkZXIgUToKCQkgKi8KCQlRID0gTiAvIFA7CgoJCS8qCgkJICogVGFyZ2V0IEZyZXF1ZW5jeToKCQkgKgoJCSAqICAgICAgVCAqIE0KCQkgKiBRID0gLS0tLS0tLQoJCSAqICAgICAgMiAqIFIKCQkgKgoJCSAqIHdoZXJlIFIgaXMgWFRBTElOICg9IDE0MzE4IG9yIDI5NDk4IGtIeikuCgkJICovCgkJaWYgKElTX1hMKHBkZXYtPmRldmljZSkpCgkJCVIgPSAyOTQ5ODsKCQllbHNlCgkJCVIgPSAxNDMxODsKCgkJVCA9IDIgKiBRICogUiAvIE07CgoJCWRlZmF1bHRfdmFyLnBpeGNsb2NrID0gMTAwMDAwMDAwMCAvIFQ7Cgl9CgoJcmV0dXJuIDA7Cn0KCiNlbHNlIC8qIF9fc3BhcmNfXyAqLwoKI2lmZGVmIF9faTM4Nl9fCiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECnN0YXRpYyB2b2lkIF9fZGV2aW5pdCBhdHlfaW5pdF9sY2Qoc3RydWN0IGF0eWZiX3BhciAqcGFyLCB1MzIgYmlvc19iYXNlKQp7Cgl1MzIgZHJpdl9pbmZfdGFiLCBzaWc7Cgl1MTYgbGNkX29mczsKCgkvKiBUbyBzdXBwb3J0IGFuIExDRCBwYW5lbCwgd2Ugc2hvdWxkIGtub3cgaXQncyBkaW1lbnNpb25zIGFuZAoJICogIGl0J3MgZGVzaXJlZCBwaXhlbCBjbG9jay4KCSAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byBkbyBpdDoKCSAqICAtIENoZWNrIHRoZSBzdGFydHVwIHZpZGVvIG1vZGUgYW5kIGNhbGN1bGF0ZSB0aGUgcGFuZWwKCSAqICAgIHNpemUgZnJvbSBpdC4gVGhpcyBpcyB1bnJlbGlhYmxlLgoJICogIC0gUmVhZCBpdCBmcm9tIHRoZSBkcml2ZXIgaW5mb3JtYXRpb24gdGFibGUgaW4gdGhlIHZpZGVvIEJJT1MuCgkqLwoJLyogQWRkcmVzcyBvZiBkcml2ZXIgaW5mb3JtYXRpb24gdGFibGUgaXMgYXQgb2Zmc2V0IDB4NzguICovCglkcml2X2luZl90YWIgPSBiaW9zX2Jhc2UgKyAqKCh1MTYgKikoYmlvc19iYXNlKzB4NzgpKTsKCgkvKiBDaGVjayBmb3IgdGhlIGRyaXZlciBpbmZvcm1hdGlvbiB0YWJsZSBzaWduYXR1cmUuICovCglzaWcgPSAoKih1MzIgKilkcml2X2luZl90YWIpOwoJaWYgKChzaWcgPT0gMHg1NDUwNGMyNCkgfHwgLyogUmFnZSBMVCBwcm8gKi8KCQkoc2lnID09IDB4NTQ0ZDUyMjQpIHx8IC8qIFJhZ2UgbW9iaWxpdHkgKi8KCQkoc2lnID09IDB4NTQ0MzU4MjQpIHx8IC8qIFJhZ2UgWEMgKi8KCQkoc2lnID09IDB4NTQ0YzU4MjQpKSB7IC8qIFJhZ2UgWEwgKi8KCQlQUklOVEtJKCJCSU9TIGNvbnRhaW5zIGRyaXZlciBpbmZvcm1hdGlvbiB0YWJsZS5cbiIpOwoJCWxjZF9vZnMgPSAoKih1MTYgKikoZHJpdl9pbmZfdGFiICsgMTApKTsKCQlwYXItPmxjZF90YWJsZSA9IDA7CgkJaWYgKGxjZF9vZnMgIT0gMCkgewoJCQlwYXItPmxjZF90YWJsZSA9IGJpb3NfYmFzZSArIGxjZF9vZnM7CgkJfQoJfQoKCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJY2hhciBtb2RlbFsyNF07CgkJY2hhciBzdHJidWZbMTZdOwoJCWNoYXIgcmVmcmVzaF9yYXRlc19idWZbMTAwXTsKCQlpbnQgaWQsIHRlY2gsIGYsIGksIG0sIGRlZmF1bHRfcmVmcmVzaF9yYXRlOwoJCWNoYXIgKnR4dGNvbG91cjsKCQljaGFyICp0eHRtb25pdG9yOwoJCWNoYXIgKnR4dGR1YWw7CgkJY2hhciAqdHh0Zm9ybWF0OwoJCXUxNiB3aWR0aCwgaGVpZ2h0LCBwYW5lbF90eXBlLCByZWZyZXNoX3JhdGVzOwoJCXUxNiAqbGNkbW9kZXB0cjsKCQl1MzIgZm9ybWF0OwoJCXU4IGxjZF9yZWZyZXNoX3JhdGVzWzE2XSA9IHs1MCw1Niw2MCw2Nyw3MCw3Miw3NSw3Niw4NSw5MCwxMDAsMTIwLDE0MCwxNTAsMTYwLDIwMH07CgkJLyogVGhlIG1vc3QgaW1wb3J0YW50IGluZm9ybWF0aW9uIGlzIHRoZSBwYW5lbCBzaXplIGF0CgkJICogb2Zmc2V0IDI1IGFuZCAyNywgYnV0IHRoZXJlJ3Mgc29tZSBvdGhlciBuaWNlIGluZm9ybWF0aW9uCgkJICogd2hpY2ggd2UgcHJpbnQgdG8gdGhlIHNjcmVlbi4KCQkgKi8KCQlpZCA9ICoodTggKilwYXItPmxjZF90YWJsZTsKCQlzdHJuY3B5KG1vZGVsLChjaGFyICopcGFyLT5sY2RfdGFibGUrMSwyNCk7CgkJbW9kZWxbMjNdPTA7CgoJCXdpZHRoID0gcGFyLT5sY2Rfd2lkdGggPSAqKHUxNiAqKShwYXItPmxjZF90YWJsZSsyNSk7CgkJaGVpZ2h0ID0gcGFyLT5sY2RfaGVpZ2h0ID0gKih1MTYgKikocGFyLT5sY2RfdGFibGUrMjcpOwoJCXBhbmVsX3R5cGUgPSAqKHUxNiAqKShwYXItPmxjZF90YWJsZSsyOSk7CgkJaWYgKHBhbmVsX3R5cGUgJiAxKQoJCQl0eHRjb2xvdXIgPSAiY29sb3VyIjsKCQllbHNlCgkJCXR4dGNvbG91ciA9ICJtb25vY2hyb21lIjsKCQlpZiAocGFuZWxfdHlwZSAmIDIpCgkJCXR4dGR1YWwgPSAiZHVhbCAoc3BsaXQpICI7CgkJZWxzZQoJCQl0eHRkdWFsID0gIiI7CgkJdGVjaCA9IChwYW5lbF90eXBlPj4yKSAmIDYzOwoJCXN3aXRjaCAodGVjaCkgewoJCWNhc2UgMDoKCQkJdHh0bW9uaXRvciA9ICJwYXNzaXZlIG1hdHJpeCI7CgkJCWJyZWFrOwoJCWNhc2UgMToKCQkJdHh0bW9uaXRvciA9ICJhY3RpdmUgbWF0cml4IjsKCQkJYnJlYWs7CgkJY2FzZSAyOgoJCQl0eHRtb25pdG9yID0gImFjdGl2ZSBhZGRyZXNzZWQgU1ROIjsKCQkJYnJlYWs7CgkJY2FzZSAzOgoJCQl0eHRtb25pdG9yID0gIkVMIjsKCQkJYnJlYWs7CgkJY2FzZSA0OgoJCQl0eHRtb25pdG9yID0gInBsYXNtYSI7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCXR4dG1vbml0b3IgPSAidW5rbm93biI7CgkJfQoJCWZvcm1hdCA9ICoodTMyICopKHBhci0+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+Y2xrX3dyX29mZnNldCA9IGF0eV9sZF84KENMT0NLX0NOVEwsIHBhcikgJiAweDAzVTsKCgkvKiBhY2NvcmRpbmcgdG8gQVRJLCB3ZSBzaG91bGQgdXNlIGNsb2NrIDMgZm9yIGFjZWxlcmF0ZWQgbW9kZSAqLwoJcGFyLT5jbGtfd3Jfb2Zmc2V0ID0gMzsKCglyZXR1cm4gMDsKCmF0eWZiX3NldHVwX2dlbmVyaWNfZmFpbDoKCWlvdW5tYXAocGFyLT5hdGlfcmVnYmFzZSk7CglwYXItPmF0aV9yZWdiYXNlID0gTlVMTDsKCWlmIChpbmZvLT5zY3JlZW5fYmFzZSkgewoJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwoJCWluZm8tPnNjcmVlbl9iYXNlID0gTlVMTDsKCX0KCXJldHVybiByZXQ7Cn0KCiNlbmRpZiAvKiAhX19zcGFyY19fICovCgpzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlmYl9wY2lfcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGNvbnN0IHN0cnVjdCBwY2lfZGV2aWNlX2lkICplbnQpCnsKCXVuc2lnbmVkIGxvbmcgYWRkciwgcmVzX3N0YXJ0LCByZXNfc2l6ZTsKCXN0cnVjdCBmYl9pbmZvICppbmZvOwoJc3RydWN0IHJlc291cmNlICpycDsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhcjsKCWludCBpLCByYyA9IC1FTk9NRU07CgoJZm9yIChpID0gQVJSQVlfU0laRShhdHlfY2hpcHMpIC0gMTsgaSA+PSAwOyBpLS0pCgkJaWYgKHBkZXYtPmRldmljZSA9PSBhdHlfY2hpcHNbaV0ucGNpX2lkKQoJCQlicmVhazsKCglpZiAoaSA8IDApCgkJcmV0dXJuIC1FTk9ERVY7CgoJLyogRW5hYmxlIGRldmljZSBpbiBQQ0kgY29uZmlnICovCglpZiAocGNpX2VuYWJsZV9kZXZpY2UocGRldikpIHsKCQlQUklOVEtFKCJDYW5ub3QgZW5hYmxlIFBDSSBkZXZpY2VcbiIpOwoJCXJldHVybiAtRU5YSU87Cgl9CgoJLyogRmluZCB3aGljaCByZXNvdXJjZSB0byB1c2UgKi8KCXJwID0gJnBkZXYtPnJlc291cmNlWzBdOwoJaWYgKHJwLT5mbGFncyAmIElPUkVTT1VSQ0VfSU8pCgkJcnAgPSAmcGRldi0+cmVzb3VyY2VbMV07CglhZGRyID0gcnAtPnN0YXJ0OwoJaWYgKCFhZGRyKQoJCXJldHVybiAtRU5YSU87CgoJLyogUmVzZXJ2ZSBzcGFjZSAqLwoJcmVzX3N0YXJ0ID0gcnAtPnN0YXJ0OwoJcmVzX3NpemUgPSBycC0+ZW5kIC0gcnAtPnN0YXJ0ICsgMTsKCWlmICghcmVxdWVzdF9tZW1fcmVnaW9uIChyZXNfc3RhcnQsIHJlc19zaXplLCAiYXR5ZmIiKSkKCQlyZXR1cm4gLUVCVVNZOwoKICAgICAgICAvKiBBbGxvY2F0ZSBmcmFtZWJ1ZmZlciAqLwoJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgYXR5ZmJfcGFyKSwgJnBkZXYtPmRldik7CglpZiAoIWluZm8pIHsKCQlQUklOVEtFKCJhdHlmYl9wY2lfcHJvYmUoKSBjYW4ndCBhbGxvYyBmYl9pbmZvXG4iKTsKCQlyZXR1cm4gLUVOT01FTTsKCX0KCXBhciA9IGluZm8tPnBhcjsKCWluZm8tPmZpeCA9IGF0eWZiX2ZpeDsKCWluZm8tPmRldmljZSA9ICZwZGV2LT5kZXY7CglwYXItPnBjaV9pZCA9IGF0eV9jaGlwc1tpXS5wY2lfaWQ7CglwYXItPnJlc19zdGFydCA9IHJlc19zdGFydDsKCXBhci0+cmVzX3NpemUgPSByZXNfc2l6ZTsKCXBhci0+aXJxID0gcGRldi0+aXJxOwoJcGFyLT5wZGV2ID0gcGRldjsKCgkvKiBTZXR1cCAiaW5mbyIgc3RydWN0dXJlICovCiNpZmRlZiBfX3NwYXJjX18KCXJjID0gYXR5ZmJfc2V0dXBfc3BhcmMocGRldiwgaW5mbywgYWRkcik7CiNlbHNlCglyYyA9IGF0eWZiX3NldHVwX2dlbmVyaWMocGRldiwgaW5mbywgYWRkcik7CiNlbmRpZgoJaWYgKHJjKQoJCWdvdG8gZXJyX3JlbGVhc2VfbWVtOwoKCXBjaV9zZXRfZHJ2ZGF0YShwZGV2LCBpbmZvKTsKCgkvKiBJbml0IGNoaXAgJiByZWdpc3RlciBmcmFtZWJ1ZmZlciAqLwoJaWYgKGF0eV9pbml0KGluZm8pKQoJCWdvdG8gZXJyX3JlbGVhc2VfaW87CgojaWZkZWYgX19zcGFyY19fCglpZiAoIXByb21fcGFsZXR0ZSkKCQlwcm9tX3BhbGV0dGUgPSBhdHlmYl9wYWxldHRlOwoKCS8qCgkgKiBBZGQgL2Rldi9mYiBtbWFwIHZhbHVlcy4KCSAqLwoJcGFyLT5tbWFwX21hcFswXS52b2ZmID0gMHg4MDAwMDAwMDAwMDAwMDAwVUw7CglwYXItPm1tYXBfbWFwWzBdLnBvZmYgPSAodW5zaWduZWQgbG9uZykgaW5mby0+c2NyZWVuX2Jhc2UgJiBQQUdFX01BU0s7CglwYXItPm1tYXBfbWFwWzBdLnNpemUgPSBpbmZvLT5maXguc21lbV9sZW47CglwYXItPm1tYXBfbWFwWzBdLnByb3RfbWFzayA9IF9QQUdFX0NBQ0hFOwoJcGFyLT5tbWFwX21hcFswXS5wcm90X2ZsYWcgPSBfUEFHRV9FOwoJcGFyLT5tbWFwX21hcFsxXS52b2ZmID0gcGFyLT5tbWFwX21hcFswXS52b2ZmICsgaW5mby0+Zml4LnNtZW1fbGVuOwoJcGFyLT5tbWFwX21hcFsxXS5wb2ZmID0gKGxvbmcpcGFyLT5hdGlfcmVnYmFzZSAmIFBBR0VfTUFTSzsKCXBhci0+bW1hcF9tYXBbMV0uc2l6ZSA9IFBBR0VfU0laRTsKCXBhci0+bW1hcF9tYXBbMV0ucHJvdF9tYXNrID0gX1BBR0VfQ0FDSEU7CglwYXItPm1tYXBfbWFwWzFdLnByb3RfZmxhZyA9IF9QQUdFX0U7CiNlbmRpZiAvKiBfX3NwYXJjX18gKi8KCglyZXR1cm4gMDsKCmVycl9yZWxlYXNlX2lvOgojaWZkZWYgX19zcGFyY19fCglrZnJlZShwYXItPm1tYXBfbWFwKTsKI2Vsc2UKCWlmIChwYXItPmF0aV9yZWdiYXNlKQoJCWlvdW5tYXAocGFyLT5hdGlfcmVnYmFzZSk7CglpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCgkJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CiNlbmRpZgplcnJfcmVsZWFzZV9tZW06CglpZiAocGFyLT5hdXhfc3RhcnQpCgkJcmVsZWFzZV9tZW1fcmVnaW9uKHBhci0+YXV4X3N0YXJ0LCBwYXItPmF1eF9zaXplKTsKCglyZWxlYXNlX21lbV9yZWdpb24ocGFyLT5yZXNfc3RhcnQsIHBhci0+cmVzX3NpemUpOwoJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKCglyZXR1cm4gcmM7Cn0KCiNlbmRpZiAvKiBDT05GSUdfUENJICovCgojaWZkZWYgQ09ORklHX0FUQVJJCgpzdGF0aWMgaW50IF9faW5pdCBhdHlmYl9hdGFyaV9wcm9iZSh2b2lkKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXI7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKCWludCBtNjRfbnVtOwoJdTMyIGNsb2NrX3I7CglpbnQgbnVtX2ZvdW5kID0gMDsKCglmb3IgKG02NF9udW0gPSAwOyBtNjRfbnVtIDwgbWFjaDY0X2NvdW50OyBtNjRfbnVtKyspIHsKCQlpZiAoIXBoeXNfdm1lbWJhc2VbbTY0X251bV0gfHwgIXBoeXNfc2l6ZVttNjRfbnVtXSB8fAoJCSAgICAhcGh5c19ndWlyZWdiYXNlW202NF9udW1dKSB7CgkJICAgIFBSSU5US0koInBoeXNfKlslZF0gcGFyYW1ldGVycyBub3Qgc2V0ID0+IHJldHVybmluZyBlYXJseS4gXG4iLCBtNjRfbnVtKTsKCQkJY29udGludWU7CgkJfQoKCQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdHlmYl9wYXIpLCBOVUxMKTsKCQlpZiAoIWluZm8pIHsKCQkJUFJJTlRLRSgiYXR5ZmJfYXRhcmlfcHJvYmUoKSBjYW4ndCBhbGxvYyBmYl9pbmZvXG4iKTsKCQkJcmV0dXJuIC1FTk9NRU07CgkJfQoJCXBhciA9IGluZm8tPnBhcjsKCgkJaW5mby0+Zml4ID0gYXR5ZmJfZml4OwoKCQlwYXItPmlycSA9ICh1bnNpZ25lZCBpbnQpIC0xOyAvKiBzb21ldGhpbmcgaW52YWxpZCAqLwoKCQkvKgoJCSAqICBNYXAgdGhlIHZpZGVvIG1lbW9yeSAocGh5c2ljYWwgYWRkcmVzcyBnaXZlbikgdG8gc29tZXdoZXJlIGluIHRoZQoJCSAqICBrZXJuZWwgYWRkcmVzcyBzcGFjZS4KCQkgKi8KCQlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXAocGh5c192bWVtYmFzZVttNjRfbnVtXSwgcGh5c19zaXplW202NF9udW1dKTsKCQlpbmZvLT5maXguc21lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWluZm8tPnNjcmVlbl9iYXNlOyAvKiBGYWtlISAqLwoJCXBhci0+YXRpX3JlZ2Jhc2UgPSBpb3JlbWFwKHBoeXNfZ3VpcmVnYmFzZVttNjRfbnVtXSwgMHgxMDAwMCkgKwoJCQkJCQkweEZDMDB1bDsKCQlpbmZvLT5maXgubW1pb19zdGFydCA9ICh1bnNpZ25lZCBsb25nKXBhci0+YXRpX3JlZ2Jhc2U7IC8qIEZha2UhICovCgoJCWF0eV9zdF9sZTMyKENMT0NLX0NOVEwsIDB4MTIzNDU2NzgsIHBhcik7CgkJY2xvY2tfciA9IGF0eV9sZF9sZTMyKENMT0NLX0NOVEwsIHBhcik7CgoJCXN3aXRjaCAoY2xvY2tfciAmIDB4MDAzRikgewoJCWNhc2UgMHgxMjoKCQkJcGFyLT5jbGtfd3Jfb2Zmc2V0ID0gMzsgLyogICovCgkJCWJyZWFrOwoJCWNhc2UgMHgzNDoKCQkJcGFyLT5jbGtfd3Jfb2Zmc2V0ID0gMjsgLyogTWVkdXNhIFNULUlPIElTQSBBZGFwdGVyIGV0Yy4gKi8KCQkJYnJlYWs7CgkJY2FzZSAweDE2OgoJCQlwYXItPmNsa193cl9vZmZzZXQgPSAxOyAvKiAgKi8KCQkJYnJlYWs7CgkJY2FzZSAweDM4OgoJCQlwYXItPmNsa193cl9vZmZzZXQgPSAwOyAvKiBQYW50aGVyIDEgSVNBIEFkYXB0ZXIgKEdlcmFsZCkgKi8KCQkJYnJlYWs7CgkJfQoKCQkvKiBGYWtlIHBjaV9pZCBmb3IgY29ycmVjdF9jaGlwc2V0KCkgKi8KCQlzd2l0Y2ggKGF0eV9sZF9sZTMyKENPTkZJR19DSElQX0lELCBwYXIpICYgQ0ZHX0NISVBfVFlQRSkgewoJCWNhc2UgMHgwMGQ3OgoJCQlwYXItPnBjaV9pZCA9IFBDSV9DSElQX01BQ0g2NEdYOwoJCQlicmVhazsKCQljYXNlIDB4MDA1NzoKCQkJcGFyLT5wY2lfaWQgPSBQQ0lfQ0hJUF9NQUNINjRDWDsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJYnJlYWs7CgkJfQoKCQlpZiAoY29ycmVjdF9jaGlwc2V0KHBhcikgfHwgYXR5X2luaXQoaW5mbykpIHsKCQkJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CgkJCWlvdW5tYXAocGFyLT5hdGlfcmVnYmFzZSk7CgkJCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CgkJfSBlbHNlIHsKCQkJbnVtX2ZvdW5kKys7CgkJfQoJfQoKCXJldHVybiBudW1fZm91bmQgPyAwIDogLUVOWElPOwp9CgojZW5kaWYgLyogQ09ORklHX0FUQVJJICovCgojaWZkZWYgQ09ORklHX1BDSQoKc3RhdGljIHZvaWQgX19kZXZleGl0IGF0eWZiX3JlbW92ZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoKCS8qIHJlc3RvcmUgdmlkZW8gbW9kZSAqLwoJYXR5X3NldF9jcnRjKHBhciwgJnNhdmVkX2NydGMpOwoJcGFyLT5wbGxfb3BzLT5zZXRfcGxsKGluZm8sICZzYXZlZF9wbGwpOwoKCXVucmVnaXN0ZXJfZnJhbWVidWZmZXIoaW5mbyk7CgojaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKCWlmIChNNjRfSEFTKE1PQklMX0JVUykpCgkJYXR5X2JsX2V4aXQoaW5mby0+YmxfZGV2KTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX01UUlIKCWlmIChwYXItPm10cnJfcmVnID49IDApIHsKCSAgICBtdHJyX2RlbChwYXItPm10cnJfcmVnLCAwLCAwKTsKCSAgICBwYXItPm10cnJfcmVnID0gLTE7Cgl9CglpZiAocGFyLT5tdHJyX2FwZXIgPj0gMCkgewoJICAgIG10cnJfZGVsKHBhci0+bXRycl9hcGVyLCAwLCAwKTsKCSAgICBwYXItPm10cnJfYXBlciA9IC0xOwoJfQojZW5kaWYKI2lmbmRlZiBfX3NwYXJjX18KCWlmIChwYXItPmF0aV9yZWdiYXNlKQoJCWlvdW5tYXAocGFyLT5hdGlfcmVnYmFzZSk7CglpZiAoaW5mby0+c2NyZWVuX2Jhc2UpCgkJaW91bm1hcChpbmZvLT5zY3JlZW5fYmFzZSk7CiNpZmRlZiBfX0JJR19FTkRJQU4KCWlmIChpbmZvLT5zcHJpdGUuYWRkcikKCQlpb3VubWFwKGluZm8tPnNwcml0ZS5hZGRyKTsKI2VuZGlmCiNlbmRpZgojaWZkZWYgX19zcGFyY19fCglrZnJlZShwYXItPm1tYXBfbWFwKTsKI2VuZGlmCglpZiAocGFyLT5hdXhfc3RhcnQpCgkJcmVsZWFzZV9tZW1fcmVnaW9uKHBhci0+YXV4X3N0YXJ0LCBwYXItPmF1eF9zaXplKTsKCglpZiAocGFyLT5yZXNfc3RhcnQpCgkJcmVsZWFzZV9tZW1fcmVnaW9uKHBhci0+cmVzX3N0YXJ0LCBwYXItPnJlc19zaXplKTsKCglmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwp9CgoKc3RhdGljIHZvaWQgX19kZXZleGl0IGF0eWZiX3BjaV9yZW1vdmUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCnsKCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwoKCWF0eWZiX3JlbW92ZShpbmZvKTsKfQoKLyoKICogVGhpcyBkcml2ZXIgdXNlcyBpdHMgb3duIG1hdGNoaW5nIHRhYmxlLiBUaGF0IHdpbGwgYmUgbW9yZSBkaWZmaWN1bHQKICogdG8gZml4LCBzbyBmb3Igbm93LCB3ZSBqdXN0IG1hdGNoIGFnYWluc3QgYW55IEFUSSBJRCBhbmQgbGV0IHRoZQogKiBwcm9iZSgpIGZ1bmN0aW9uIGZpbmQgb3V0IHdoYXQncyB1cC4gVGhhdCBhbHNvIG1lYW4gd2UgZG9uJ3QgaGF2ZQogKiBhIG1vZHVsZSBJRCB0YWJsZSB0aG91Z2guCiAqLwpzdGF0aWMgc3RydWN0IHBjaV9kZXZpY2VfaWQgYXR5ZmJfcGNpX3RibFtdID0gewoJeyBQQ0lfVkVORE9SX0lEX0FUSSwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwgUENJX0FOWV9JRCwKCSAgUENJX0JBU0VfQ0xBU1NfRElTUExBWSA8PCAxNiwgMHhmZjAwMDAsIDAgfSwKCXsgMCwgfQp9OwoKc3RhdGljIHN0cnVjdCBwY2lfZHJpdmVyIGF0eWZiX2RyaXZlciA9IHsKCS5uYW1lCQk9ICJhdHlmYiIsCgkuaWRfdGFibGUJPSBhdHlmYl9wY2lfdGJsLAoJLnByb2JlCQk9IGF0eWZiX3BjaV9wcm9iZSwKCS5yZW1vdmUJCT0gX19kZXZleGl0X3AoYXR5ZmJfcGNpX3JlbW92ZSksCiNpZmRlZiBDT05GSUdfUE0KCS5zdXNwZW5kCT0gYXR5ZmJfcGNpX3N1c3BlbmQsCgkucmVzdW1lCQk9IGF0eWZiX3BjaV9yZXN1bWUsCiNlbmRpZiAvKiBDT05GSUdfUE0gKi8KfTsKCiNlbmRpZiAvKiBDT05GSUdfUENJICovCgojaWZuZGVmIE1PRFVMRQpzdGF0aWMgaW50IF9faW5pdCBhdHlmYl9zZXR1cChjaGFyICpvcHRpb25zKQp7CgljaGFyICp0aGlzX29wdDsKCglpZiAoIW9wdGlvbnMgfHwgISpvcHRpb25zKQoJCXJldHVybiAwOwoKCXdoaWxlICgodGhpc19vcHQgPSBzdHJzZXAoJm9wdGlvbnMsICIsIikpICE9IE5VTEwpIHsKCQlpZiAoIXN0cm5jbXAodGhpc19vcHQsICJub2FjY2VsIiwgNykpIHsKCQkJbm9hY2NlbCA9IDE7CiNpZmRlZiBDT05GSUdfTVRSUgoJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJub210cnIiLCA2KSkgewoJCQlub210cnIgPSAxOwojZW5kaWYKCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidnJhbToiLCA1KSkKCQkJdnJhbSA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7CgkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJwbGw6IiwgNCkpCgkJCXBsbCA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNCwgTlVMTCwgMCk7CgkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtY2xrOiIsIDUpKQoJCQltY2xrID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA1LCBOVUxMLCAwKTsKCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInhjbGs6IiwgNSkpCgkJCXhjbGsgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCs1LCBOVUxMLCAwKTsKCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImNvbXBfc3luYzoiLCAxMCkpCgkJCWNvbXBfc3luYyA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzEwLCBOVUxMLCAwKTsKCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImJhY2tsaWdodDoiLCAxMCkpCgkJCWJhY2tsaWdodCA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzEwLCBOVUxMLCAwKTsKI2lmZGVmIENPTkZJR19QUEMKCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZtb2RlOiIsIDYpKSB7CgkJCXVuc2lnbmVkIGludCB2bW9kZSA9CgkJCSAgICBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDYsIE5VTEwsIDApOwoJCQlpZiAodm1vZGUgPiAwICYmIHZtb2RlIDw9IFZNT0RFX01BWCkKCQkJCWRlZmF1bHRfdm1vZGUgPSB2bW9kZTsKCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiY21vZGU6IiwgNikpIHsKCQkJdW5zaWduZWQgaW50IGNtb2RlID0KCQkJICAgIHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNiwgTlVMTCwgMCk7CgkJCXN3aXRjaCAoY21vZGUpIHsKCQkJY2FzZSAwOgoJCQljYXNlIDg6CgkJCQlkZWZhdWx0X2Ntb2RlID0gQ01PREVfODsKCQkJCWJyZWFrOwoJCQljYXNlIDE1OgoJCQljYXNlIDE2OgoJCQkJZGVmYXVsdF9jbW9kZSA9IENNT0RFXzE2OwoJCQkJYnJlYWs7CgkJCWNhc2UgMjQ6CgkJCWNhc2UgMzI6CgkJCQlkZWZhdWx0X2Ntb2RlID0gQ01PREVfMzI7CgkJCQlicmVhazsKCQkJfQoJCX0KI2VuZGlmCiNpZmRlZiBDT05GSUdfQVRBUkkKCQkvKgoJCSAqIFdoeSBkbyB3ZSBuZWVkIHRoaXMgc2lsbHkgTWFjaDY0IGFyZ3VtZW50PwoJCSAqIFdlIGFyZSBhbHJlYWR5IGhlcmUgYmVjYXVzZSBvZiBtYWNoNjQ9IHNvIGl0cyByZWR1bmRhbnQuCgkJICovCgkJZWxzZSBpZiAoTUFDSF9JU19BVEFSSQoJCQkgJiYgKCFzdHJuY21wKHRoaXNfb3B0LCAiTWFjaDY0OiIsIDcpKSkgewoJCQlzdGF0aWMgdW5zaWduZWQgY2hhciBtNjRfbnVtOwoJCQlzdGF0aWMgY2hhciBtYWNoNjRfc3RyWzgwXTsKCQkJc3RybGNweShtYWNoNjRfc3RyLCB0aGlzX29wdCArIDcsIHNpemVvZihtYWNoNjRfc3RyKSk7CgkJCWlmICghc3RvcmVfdmlkZW9fcGFyKG1hY2g2NF9zdHIsIG02NF9udW0pKSB7CgkJCQltNjRfbnVtKys7CgkJCQltYWNoNjRfY291bnQgPSBtNjRfbnVtOwoJCQl9CgkJfQojZW5kaWYKCQllbHNlCgkJCW1vZGUgPSB0aGlzX29wdDsKCX0KCXJldHVybiAwOwp9CiNlbmRpZiAgLyogIE1PRFVMRSAgKi8KCnN0YXRpYyBpbnQgX19pbml0IGF0eWZiX2luaXQodm9pZCkKewogICAgaW50IGVycjEgPSAxLCBlcnIyID0gMTsKI2lmbmRlZiBNT0RVTEUKICAgIGNoYXIgKm9wdGlvbiA9IE5VTEw7CgogICAgaWYgKGZiX2dldF9vcHRpb25zKCJhdHlmYiIsICZvcHRpb24pKQoJcmV0dXJuIC1FTk9ERVY7CiAgICBhdHlmYl9zZXR1cChvcHRpb24pOwojZW5kaWYKCiNpZmRlZiBDT05GSUdfUENJCiAgICBlcnIxID0gcGNpX3JlZ2lzdGVyX2RyaXZlcigmYXR5ZmJfZHJpdmVyKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfQVRBUkkKICAgIGVycjIgPSBhdHlmYl9hdGFyaV9wcm9iZSgpOwojZW5kaWYKCiAgICByZXR1cm4gKGVycjEgJiYgZXJyMikgPyAtRU5PREVWIDogMDsKfQoKc3RhdGljIHZvaWQgX19leGl0IGF0eWZiX2V4aXQodm9pZCkKewojaWZkZWYgQ09ORklHX1BDSQoJcGNpX3VucmVnaXN0ZXJfZHJpdmVyKCZhdHlmYl9kcml2ZXIpOwojZW5kaWYKfQoKbW9kdWxlX2luaXQoYXR5ZmJfaW5pdCk7Cm1vZHVsZV9leGl0KGF0eWZiX2V4aXQpOwoKTU9EVUxFX0RFU0NSSVBUSU9OKCJGQkRldiBkcml2ZXIgZm9yIEFUSSBNYWNoNjQgY2FyZHMiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwptb2R1bGVfcGFyYW0obm9hY2NlbCwgYm9vbCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0Mobm9hY2NlbCwgImJvb2w6IGRpc2FibGUgYWNjZWxlcmF0aW9uIik7Cm1vZHVsZV9wYXJhbSh2cmFtLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHZyYW0sICJpbnQ6IG92ZXJyaWRlIHNpemUgb2YgdmlkZW8gcmFtIik7Cm1vZHVsZV9wYXJhbShwbGwsIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MocGxsLCAiaW50OiBvdmVycmlkZSB2aWRlbyBjbG9jayIpOwptb2R1bGVfcGFyYW0obWNsaywgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhtY2xrLCAiaW50OiBvdmVycmlkZSBtZW1vcnkgY2xvY2siKTsKbW9kdWxlX3BhcmFtKHhjbGssIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoeGNsaywgImludDogb3ZlcnJpZGUgYWNjZWxlcmF0ZWQgZW5naW5lIGNsb2NrIik7Cm1vZHVsZV9wYXJhbShjb21wX3N5bmMsIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoY29tcF9zeW5jLAoJCSAiU2V0IGNvbXBvc2l0ZSBzeW5jIHNpZ25hbCB0byBsb3cgKDApIG9yIGhpZ2ggKDEpIik7Cm1vZHVsZV9wYXJhbShtb2RlLCBjaGFycCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MobW9kZSwgIlNwZWNpZnkgcmVzb2x1dGlvbiBhcyBcIjx4cmVzPng8eXJlcz5bLTxicHA+XVtAPHJlZnJlc2g+XVwiICIpOwojaWZkZWYgQ09ORklHX01UUlIKbW9kdWxlX3BhcmFtKG5vbXRyciwgYm9vbCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0Mobm9tdHJyLCAiYm9vbDogZGlzYWJsZSB1c2Ugb2YgTVRSUiByZWdpc3RlcnMiKTsKI2VuZGlmCg==