LyoKICogIEFUSSBGcmFtZSBCdWZmZXIgRGV2aWNlIERyaXZlciBDb3JlCiAqCiAqCUNvcHlyaWdodCAoQykgMjAwNCAgQWxleCBLZXJuIDxhbGV4Lmtlcm5AZ214LmRlPgogKglDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSAgR2VlcnQgVXl0dGVyaG9ldmVuCiAqCUNvcHlyaWdodCAoQykgMTk5OCAgQmVybmQgSGFycmllcwogKglDb3B5cmlnaHQgKEMpIDE5OTggIEVkZGllIEMuIERvc3QgIChlY2RAc2t5bmV0LmJlKQogKgogKiAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBVEkgZ3JhcGhpY3MgY2hpcHM6CiAqICAgIC0gQVRJIE1hY2g2NAogKgogKiAgVG8gZG86IGFkZCBzdXBwb3J0IGZvcgogKiAgICAtIEFUSSBSYWdlMTI4IChmcm9tIGF0eTEyOGZiLmMpCiAqICAgIC0gQVRJIFJhZGVvbiAoZnJvbSByYWRlb25mYi5jKQogKgogKiAgVGhpcyBkcml2ZXIgaXMgcGFydGx5IGJhc2VkIG9uIHRoZSBQb3dlck1hYyBjb25zb2xlIGRyaXZlcjoKICoKICoJQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCiAqCiAqICBhbmQgb24gdGhlIFBvd2VyTWFjIEFUSS9tYWNoNjQgZGlzcGxheSBkcml2ZXI6CiAqCiAqCUNvcHlyaWdodCAoQykgMTk5NyBNaWNoYWVsIEFLIFRlc2NoCiAqCiAqCSAgICAgIHdpdGggd29yayBieSBKb24gSG93ZWxsCiAqCQkJICAgSGFycnkgQUMgRWF0b24KICoJCQkgICBBbnRob255IFRvbmcgPGF0b25nQHVpdWMuZWR1PgogKgogKiAgR2VuZXJpYyBMQ0Qgc3VwcG9ydCB3cml0dGVuIGJ5IERhbmllbCBNYW50aW9uZSwgcG9ydGVkIGZyb20gMi40LjIwIGJ5IEFsZXggS2VybgogKiAgTWFueSBUaGFua3MgdG8gVmlsbGUgU3lyauRs5CBmb3IgcGF0Y2hlcyBhbmQgZml4aW5nIG5hc3RpbmcgMTYgYml0IGNvbG9yIGJ1Zy4KICoKICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqICBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgogKiAgbW9yZSBkZXRhaWxzLgogKgogKiAgTWFueSB0aGFua3MgdG8gTml0eWEgZnJvbSBBVEkgZGV2cmVsIGZvciBzdXBwb3J0IGFuZCBwYXRpZW5jZSAhCiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICBUT0RPOgoKICAgIC0gY3Vyc29yIHN1cHBvcnQgb24gYWxsIGNhcmRzIGFuZCBhbGwgcmFtZGFjcy4KICAgIC0gY3Vyc29yIHBhcmFtZXRlcnMgY29udHJvbGFibGUgdmlhIGlvY3RsKClzLgogICAgLSBndWVzcyBQTEwgYW5kIE1DTEsgYmFzZWQgb24gdGhlIG9yaWdpbmFsIFBMTCByZWdpc3RlciB2YWx1ZXMgaW5pdGlhbGl6ZWQKICAgICAgYnkgT3BlbiBGaXJtd2FyZSAoaWYgdGhleSBhcmUgaW5pdGlhbGl6ZWQpLiBCSU9TIGlzIGRvbmUKCiAgICAoQW55b25lIHdpdGggTWFjIHRvIGhlbHAgd2l0aCB0aGlzPykKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9tbS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KCiNpbmNsdWRlIDx2aWRlby9tYWNoNjQuaD4KI2luY2x1ZGUgImF0eWZiLmgiCiNpbmNsdWRlICJhdGlfaWRzLmgiCgojaWZkZWYgX19wb3dlcnBjX18KI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiNpbmNsdWRlIDxhc20vcHJvbS5oPgojaW5jbHVkZSAiLi4vbWFjbW9kZXMuaCIKI2VuZGlmCiNpZmRlZiBfX3NwYXJjX18KI2luY2x1ZGUgPGFzbS9wYm0uaD4KI2luY2x1ZGUgPGFzbS9mYmlvLmg+CiNlbmRpZgoKI2lmZGVmIENPTkZJR19BREJfUE1VCiNpbmNsdWRlIDxsaW51eC9hZGIuaD4KI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgojZW5kaWYKI2lmZGVmIENPTkZJR19CT09UWF9URVhUCiNpbmNsdWRlIDxhc20vYnRleHQuaD4KI2VuZGlmCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KI2VuZGlmCiNpZmRlZiBDT05GSUdfTVRSUgojaW5jbHVkZSA8YXNtL210cnIuaD4KI2VuZGlmCgovKgogKiBEZWJ1ZyBmbGFncy4KICovCiN1bmRlZiBERUJVRwovKiNkZWZpbmUgREVCVUcqLwoKLyogTWFrZSBzdXJlIG4gKiBQQUdFX1NJWkUgaXMgcHJvdGVjdGVkIGF0IGVuZCBvZiBBcGVydHVyZSBmb3IgR1VJLXJlZ3MgKi8KLyogIC0gbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gY2F0Y2ggYWxsIEdVSS1SZWdzICAgKi8KLyogIC0gbXVzdCBiZSBhbGlnbmVkIHRvIGEgUEFHRSBib3VuZGFyeSAgICAgICAgICAgKi8KI2RlZmluZSBHVUlfUkVTRVJWRQkoMSAqIFBBR0VfU0laRSkKCi8qIEZJWE1FOiByZW1vdmUgdGhlIEZBSUwgZGVmaW5pdGlvbiAqLwojZGVmaW5lIEZBSUwobXNnKSBkbyB7IFwKCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAoJCXByaW50ayhLRVJOX0NSSVQgImF0eWZiOiAiIG1zZyAiXG4iKTsgXAoJcmV0dXJuIC1FSU5WQUw7IFwKfSB3aGlsZSAoMCkKI2RlZmluZSBGQUlMX01BWChtc2csIHgsIF9tYXhfKSBkbyB7IFwKCWlmICh4ID4gX21heF8pIHsgXAoJCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAoJCQlwcmludGsoS0VSTl9DUklUICJhdHlmYjogIiBtc2cgIiAleCgleClcbiIsIHgsIF9tYXhfKTsgXAoJCXJldHVybiAtRUlOVkFMOyBcCgl9IFwKfSB3aGlsZSAoMCkKI2lmZGVmIERFQlVHCiNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHICJhdHlmYjogIiBmbXQsICMjIGFyZ3MpCiNlbHNlCiNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCiNlbmRpZgoKI2RlZmluZSBQUklOVEtJKGZtdCwgYXJncy4uLikJcHJpbnRrKEtFUk5fSU5GTyAiYXR5ZmI6ICIgZm10LCAjIyBhcmdzKQojZGVmaW5lIFBSSU5US0UoZm10LCBhcmdzLi4uKQkgcHJpbnRrKEtFUk5fRVJSICJhdHlmYjogIiBmbXQsICMjIGFyZ3MpCgojaWYgZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX1BNQUNfQkFDS0xJR0hUKSB8fCBkZWZpbmVkIChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQpzdGF0aWMgY29uc3QgdTMyIGx0X2xjZF9yZWdzW10gPSB7CglDT05GSUdfUEFORUxfTEcsCglMQ0RfR0VOX0NOVExfTEcsCglEU1ROX0NPTlRST0xfTEcsCglIRkJfUElUQ0hfQUREUl9MRywKCUhPUlpfU1RSRVRDSElOR19MRywKCVZFUlRfU1RSRVRDSElOR19MRywKCTAsIC8qIEVYVF9WRVJUX1NUUkVUQ0ggKi8KCUxUX0dJT19MRywKCVBPV0VSX01BTkFHRU1FTlRfTEcKfTsKCnZvaWQgYXR5X3N0X2xjZChpbnQgaW5kZXgsIHUzMiB2YWwsIGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJaWYgKE02NF9IQVMoTFRfTENEX1JFR1MpKSB7CgkJYXR5X3N0X2xlMzIobHRfbGNkX3JlZ3NbaW5kZXhdLCB2YWwsIHBhcik7Cgl9IGVsc2UgewoJCXVuc2lnbmVkIGxvbmcgdGVtcDsKCgkJLyogd3JpdGUgYWRkciBieXRlICovCgkJdGVtcCA9IGF0eV9sZF9sZTMyKExDRF9JTkRFWCwgcGFyKTsKCQlhdHlfc3RfbGUzMihMQ0RfSU5ERVgsICh0ZW1wICYgfkxDRF9JTkRFWF9NQVNLKSB8IGluZGV4LCBwYXIpOwoJCS8qIHdyaXRlIHRoZSByZWdpc3RlciB2YWx1ZSAqLwoJCWF0eV9zdF9sZTMyKExDRF9EQVRBLCB2YWwsIHBhcik7Cgl9Cn0KCnUzMiBhdHlfbGRfbGNkKGludCBpbmRleCwgY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglpZiAoTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQlyZXR1cm4gYXR5X2xkX2xlMzIobHRfbGNkX3JlZ3NbaW5kZXhdLCBwYXIpOwoJfSBlbHNlIHsKCQl1bnNpZ25lZCBsb25nIHRlbXA7CgoJCS8qIHdyaXRlIGFkZHIgYnl0ZSAqLwoJCXRlbXAgPSBhdHlfbGRfbGUzMihMQ0RfSU5ERVgsIHBhcik7CgkJYXR5X3N0X2xlMzIoTENEX0lOREVYLCAodGVtcCAmIH5MQ0RfSU5ERVhfTUFTSykgfCBpbmRleCwgcGFyKTsKCQkvKiByZWFkIHRoZSByZWdpc3RlciB2YWx1ZSAqLwoJCXJldHVybiBhdHlfbGRfbGUzMihMQ0RfREFUQSwgcGFyKTsKCX0KfQojZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX1BNQUNfQkFDS0xJR0hUKSB8fCBkZWZpbmVkIChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKSAqLwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKLyoKICogQVRJUmVkdWNlUmF0aW8gLS0KICoKICogUmVkdWNlIGEgZnJhY3Rpb24gYnkgZmFjdG9yaW5nIG91dCB0aGUgbGFyZ2VzdCBjb21tb24gZGl2aWRlciBvZiB0aGUKICogZnJhY3Rpb24ncyBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yLgogKi8Kc3RhdGljIHZvaWQgQVRJUmVkdWNlUmF0aW8oaW50ICpOdW1lcmF0b3IsIGludCAqRGVub21pbmF0b3IpCnsKICAgIGludCBNdWx0aXBsaWVyLCBEaXZpZGVyLCBSZW1haW5kZXI7CgogICAgTXVsdGlwbGllciA9ICpOdW1lcmF0b3I7CiAgICBEaXZpZGVyID0gKkRlbm9taW5hdG9yOwoKICAgIHdoaWxlICgoUmVtYWluZGVyID0gTXVsdGlwbGllciAlIERpdmlkZXIpKQogICAgewogICAgICAgIE11bHRpcGxpZXIgPSBEaXZpZGVyOwogICAgICAgIERpdmlkZXIgPSBSZW1haW5kZXI7CiAgICB9CgogICAgKk51bWVyYXRvciAvPSBEaXZpZGVyOwogICAgKkRlbm9taW5hdG9yIC89IERpdmlkZXI7Cn0KI2VuZGlmCiAgICAvKgogICAgICogIFRoZSBIYXJkd2FyZSBwYXJhbWV0ZXJzIGZvciBlYWNoIGNhcmQKICAgICAqLwoKc3RydWN0IGF0eV9jbWFwX3JlZ3MgewoJdTggd2luZGV4OwoJdTggbHV0OwoJdTggbWFzazsKCXU4IHJpbmRleDsKCXU4IGNudGw7Cn07CgpzdHJ1Y3QgcGNpX21tYXBfbWFwIHsKCXVuc2lnbmVkIGxvbmcgdm9mZjsKCXVuc2lnbmVkIGxvbmcgcG9mZjsKCXVuc2lnbmVkIGxvbmcgc2l6ZTsKCXVuc2lnbmVkIGxvbmcgcHJvdF9mbGFnOwoJdW5zaWduZWQgbG9uZyBwcm90X21hc2s7Cn07CgpzdGF0aWMgc3RydWN0IGZiX2ZpeF9zY3JlZW5pbmZvIGF0eWZiX2ZpeCBfX2RldmluaXRkYXRhID0gewoJLmlkCQk9ICJBVFkgTWFjaDY0IiwKCS50eXBlCQk9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUywKCS52aXN1YWwJCT0gRkJfVklTVUFMX1BTRVVET0NPTE9SLAoJLnhwYW5zdGVwCT0gOCwKCS55cGFuc3RlcAk9IDEsCn07CgogICAgLyoKICAgICAqICBGcmFtZSBidWZmZXIgZGV2aWNlIEFQSQogICAgICovCgpzdGF0aWMgaW50IGF0eWZiX29wZW4oc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKTsKc3RhdGljIGludCBhdHlmYl9yZWxlYXNlKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcik7CnN0YXRpYyBpbnQgYXR5ZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAoJdV9pbnQgdHJhbnNwLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIGludCBhdHlmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKTsKc3RhdGljIGludCBhdHlmYl9pb2N0bChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdV9pbnQgY21kLCB1X2xvbmcgYXJnKTsKZXh0ZXJuIHZvaWQgYXR5ZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9maWxscmVjdCAqcmVjdCk7CmV4dGVybiB2b2lkIGF0eWZiX2NvcHlhcmVhKHN0cnVjdCBmYl9pbmZvICppbmZvLCBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKmFyZWEpOwpleHRlcm4gdm9pZCBhdHlmYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpOwojaWZkZWYgX19zcGFyY19fCnN0YXRpYyBpbnQgYXR5ZmJfbW1hcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEpOwojZW5kaWYKc3RhdGljIGludCBhdHlmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKTsKCiAgICAvKgogICAgICogIEludGVybmFsIHJvdXRpbmVzCiAgICAgKi8KCnN0YXRpYyBpbnQgYXR5X2luaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKm5hbWUpOwojaWZkZWYgQ09ORklHX0FUQVJJCnN0YXRpYyBpbnQgc3RvcmVfdmlkZW9fcGFyKGNoYXIgKnZpZGVvcGFyLCB1bnNpZ25lZCBjaGFyIG02NF9udW0pOwojZW5kaWYKCnN0YXRpYyBzdHJ1Y3QgY3J0YyBzYXZlZF9jcnRjOwpzdGF0aWMgdW5pb24gYXR5X3BsbCBzYXZlZF9wbGw7CnN0YXRpYyB2b2lkIGF0eV9nZXRfY3J0Yyhjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIHN0cnVjdCBjcnRjICpjcnRjKTsKCnN0YXRpYyB2b2lkIGF0eV9zZXRfY3J0Yyhjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGNvbnN0IHN0cnVjdCBjcnRjICpjcnRjKTsKc3RhdGljIGludCBhdHlfdmFyX3RvX2NydGMoY29uc3Qgc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgY3J0YyAqY3J0Yyk7CnN0YXRpYyBpbnQgYXR5X2NydGNfdG9fdmFyKGNvbnN0IHN0cnVjdCBjcnRjICpjcnRjLCBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7CnN0YXRpYyB2b2lkIHNldF9vZmZfcGl0Y2goc3RydWN0IGF0eWZiX3BhciAqcGFyLCBjb25zdCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiNpZmRlZiBDT05GSUdfUFBDCnN0YXRpYyBpbnQgcmVhZF9hdHlfc2Vuc2UoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyKTsKI2VuZGlmCgoKICAgIC8qCiAgICAgKiAgSW50ZXJmYWNlIHVzZWQgYnkgdGhlIHdvcmxkCiAgICAgKi8KCnN0YXRpYyBzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gZGVmYXVsdF92YXIgPSB7CgkvKiA2NDB4NDgwLCA2MCBIeiwgTm9uLUludGVybGFjZWQgKDI1LjE3NSBNSHogZG90Y2xvY2spICovCgk2NDAsIDQ4MCwgNjQwLCA0ODAsIDAsIDAsIDgsIDAsCgl7MCwgOCwgMH0sIHswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgMCwgMH0sCgkwLCAwLCAtMSwgLTEsIDAsIDM5NzIyLCA0OCwgMTYsIDMzLCAxMCwgOTYsIDIsCgkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECn07CgpzdGF0aWMgc3RydWN0IGZiX3ZpZGVvbW9kZSBkZWZtb2RlID0gewoJLyogNjQweDQ4MCBAIDYwIEh6LCAzMS41IGtIeiBoc3luYyAqLwoJTlVMTCwgNjAsIDY0MCwgNDgwLCAzOTcyMSwgNDAsIDI0LCAzMiwgMTEsIDk2LCAyLAoJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRAp9OwoKc3RhdGljIHN0cnVjdCBmYl9vcHMgYXR5ZmJfb3BzID0gewoJLm93bmVyCQk9IFRISVNfTU9EVUxFLAoJLmZiX29wZW4JPSBhdHlmYl9vcGVuLAoJLmZiX3JlbGVhc2UJPSBhdHlmYl9yZWxlYXNlLAoJLmZiX2NoZWNrX3Zhcgk9IGF0eWZiX2NoZWNrX3ZhciwKCS5mYl9zZXRfcGFyCT0gYXR5ZmJfc2V0X3BhciwKCS5mYl9zZXRjb2xyZWcJPSBhdHlmYl9zZXRjb2xyZWcsCgkuZmJfcGFuX2Rpc3BsYXkJPSBhdHlmYl9wYW5fZGlzcGxheSwKCS5mYl9ibGFuawk9IGF0eWZiX2JsYW5rLAoJLmZiX2lvY3RsCT0gYXR5ZmJfaW9jdGwsCgkuZmJfZmlsbHJlY3QJPSBhdHlmYl9maWxscmVjdCwKCS5mYl9jb3B5YXJlYQk9IGF0eWZiX2NvcHlhcmVhLAoJLmZiX2ltYWdlYmxpdAk9IGF0eWZiX2ltYWdlYmxpdCwKI2lmZGVmIF9fc3BhcmNfXwoJLmZiX21tYXAJPSBhdHlmYl9tbWFwLAojZW5kaWYKCS5mYl9zeW5jCT0gYXR5ZmJfc3luYywKfTsKCnN0YXRpYyBpbnQgbm9hY2NlbDsKI2lmZGVmIENPTkZJR19NVFJSCnN0YXRpYyBpbnQgbm9tdHJyOwojZW5kaWYKc3RhdGljIGludCB2cmFtOwpzdGF0aWMgaW50IHBsbDsKc3RhdGljIGludCBtY2xrOwpzdGF0aWMgaW50IHhjbGs7CnN0YXRpYyBpbnQgY29tcF9zeW5jIF9fZGV2aW5pdGRhdGEgPSAtMTsKc3RhdGljIGNoYXIgKm1vZGU7CgojaWZkZWYgQ09ORklHX1BQQwpzdGF0aWMgaW50IGRlZmF1bHRfdm1vZGUgX19kZXZpbml0ZGF0YSA9IFZNT0RFX0NIT09TRTsKc3RhdGljIGludCBkZWZhdWx0X2Ntb2RlIF9fZGV2aW5pdGRhdGEgPSBDTU9ERV9DSE9PU0U7Cgptb2R1bGVfcGFyYW1fbmFtZWQodm1vZGUsIGRlZmF1bHRfdm1vZGUsIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0Modm1vZGUsICJpbnQ6IHZpZGVvIG1vZGUgZm9yIG1hYyIpOwptb2R1bGVfcGFyYW1fbmFtZWQoY21vZGUsIGRlZmF1bHRfY21vZGUsIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MoY21vZGUsICJpbnQ6IGNvbG9yIG1vZGUgZm9yIG1hYyIpOwojZW5kaWYKCiNpZmRlZiBDT05GSUdfQVRBUkkKc3RhdGljIHVuc2lnbmVkIGludCBtYWNoNjRfY291bnQgX19kZXZpbml0ZGF0YSA9IDA7CnN0YXRpYyB1bnNpZ25lZCBsb25nIHBoeXNfdm1lbWJhc2VbRkJfTUFYXSBfX2RldmluaXRkYXRhID0geyAwLCB9OwpzdGF0aWMgdW5zaWduZWQgbG9uZyBwaHlzX3NpemVbRkJfTUFYXSBfX2RldmluaXRkYXRhID0geyAwLCB9OwpzdGF0aWMgdW5zaWduZWQgbG9uZyBwaHlzX2d1aXJlZ2Jhc2VbRkJfTUFYXSBfX2RldmluaXRkYXRhID0geyAwLCB9OwojZW5kaWYKCi8qIHRvcCAtPiBkb3duIGlzIGFuIGV2b2x1dGlvbiBvZiBtYWNoNjQgY2hpcHNldCwgYW55IGNvcnJlY3Rpb25zPyAqLwojZGVmaW5lIEFUSV9DSElQXzg4ODAwR1ggICAoTTY0Rl9HWCkKI2RlZmluZSBBVElfQ0hJUF84ODgwMENYICAgKE02NEZfR1gpCgojZGVmaW5lIEFUSV9DSElQXzI2NENUICAgICAoTTY0Rl9DVCB8IE02NEZfSU5URUdSQVRFRCB8IE02NEZfQ1RfQlVTIHwgTTY0Rl9NQUdJQ19GSUZPKQojZGVmaW5lIEFUSV9DSElQXzI2NEVUICAgICAoTTY0Rl9DVCB8IE02NEZfSU5URUdSQVRFRCB8IE02NEZfQ1RfQlVTIHwgTTY0Rl9NQUdJQ19GSUZPKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRWVCAgICAgKE02NEZfVlQgfCBNNjRGX0lOVEVHUkFURUQgfCBNNjRGX1ZUX0JVUyB8IE02NEZfTUFHSUNfRklGTykKI2RlZmluZSBBVElfQ0hJUF8yNjRHVCAgICAgKE02NEZfR1QgfCBNNjRGX0lOVEVHUkFURUQgICAgICAgICAgICAgICB8IE02NEZfTUFHSUNfRklGTyB8IE02NEZfRVhUUkFfQlJJR0hUKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRWVEIgICAgKE02NEZfVlQgfCBNNjRGX0lOVEVHUkFURUQgfCBNNjRGX1ZUX0JVUyB8IE02NEZfR1RCX0RTUCkKI2RlZmluZSBBVElfQ0hJUF8yNjRWVDMgICAgKE02NEZfVlQgfCBNNjRGX0lOVEVHUkFURUQgfCBNNjRGX1ZUX0JVUyB8IE02NEZfR1RCX0RTUCB8IE02NEZfU0RSQU1fTUFHSUNfUExMKQojZGVmaW5lIEFUSV9DSElQXzI2NFZUNCAgICAoTTY0Rl9WVCB8IE02NEZfSU5URUdSQVRFRCAgICAgICAgICAgICAgIHwgTTY0Rl9HVEJfRFNQKQoKLyogRklYTUUgd2hhdCBpcyB0aGlzIGNoaXA/ICovCiNkZWZpbmUgQVRJX0NISVBfMjY0TFQgICAgIChNNjRGX0dUIHwgTTY0Rl9JTlRFR1JBVEVEICAgICAgICAgICAgICAgfCBNNjRGX0dUQl9EU1ApCgovKiBtYWtlIHNldHMgc2hvcnRlciAqLwojZGVmaW5lIEFUSV9NT0RFUk5fU0VUICAgICAoTTY0Rl9HVCB8IE02NEZfSU5URUdSQVRFRCAgICAgICAgICAgICAgIHwgTTY0Rl9HVEJfRFNQIHwgTTY0Rl9FWFRSQV9CUklHSFQpCgojZGVmaW5lIEFUSV9DSElQXzI2NEdUQiAgICAoQVRJX01PREVSTl9TRVQgfCBNNjRGX1NEUkFNX01BR0lDX1BMTCkKLyojZGVmaW5lIEFUSV9DSElQXzI2NEdURFZEICA/Ki8KI2RlZmluZSBBVElfQ0hJUF8yNjRMVEcgICAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwpCgojZGVmaW5lIEFUSV9DSElQXzI2NEdUMkMgICAoQVRJX01PREVSTl9TRVQgfCBNNjRGX1NEUkFNX01BR0lDX1BMTCB8IE02NEZfSFdfVFJJUExFKQojZGVmaW5lIEFUSV9DSElQXzI2NEdUUFJPICAoQVRJX01PREVSTl9TRVQgfCBNNjRGX1NEUkFNX01BR0lDX1BMTCB8IE02NEZfSFdfVFJJUExFIHwgTTY0Rl9GSUZPXzMyIHwgTTY0Rl9SRVNFVF8zRCkKI2RlZmluZSBBVElfQ0hJUF8yNjRMVFBSTyAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9IV19UUklQTEUgfCBNNjRGX0ZJRk9fMzIgfCBNNjRGX1JFU0VUXzNEKQoKI2RlZmluZSBBVElfQ0hJUF8yNjRYTCAgICAgKEFUSV9NT0RFUk5fU0VUIHwgTTY0Rl9IV19UUklQTEUgfCBNNjRGX0ZJRk9fMzIgfCBNNjRGX1JFU0VUXzNEIHwgTTY0Rl9YTF9ETEwgfCBNNjRGX01GQl9GT1JDRV80KQojZGVmaW5lIEFUSV9DSElQX01PQklMSVRZICAoQVRJX01PREVSTl9TRVQgfCBNNjRGX0hXX1RSSVBMRSB8IE02NEZfRklGT18zMiB8IE02NEZfUkVTRVRfM0QgfCBNNjRGX1hMX0RMTCB8IE02NEZfTUZCX0ZPUkNFXzQgfCBNNjRGX01PQklMX0JVUykKCnN0YXRpYyBzdHJ1Y3QgewoJdTE2IHBjaV9pZDsKCWNvbnN0IGNoYXIgKm5hbWU7CglpbnQgcGxsLCBtY2xrLCB4Y2xrLCBlY3BfbWF4OwoJdTMyIGZlYXR1cmVzOwp9IGF0eV9jaGlwc1tdIF9fZGV2aW5pdGRhdGEgPSB7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0dYCgkvKiBNYWNoNjQgR1ggKi8KCXsgUENJX0NISVBfTUFDSDY0R1gsICJBVEk4ODhHWDAwIChNYWNoNjQgR1gpIiwgMTM1LCA1MCwgNTAsIDAsIEFUSV9DSElQXzg4ODAwR1ggfSwKCXsgUENJX0NISVBfTUFDSDY0Q1gsICJBVEk4ODhDWDAwIChNYWNoNjQgQ1gpIiwgMTM1LCA1MCwgNTAsIDAsIEFUSV9DSElQXzg4ODAwQ1ggfSwKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR1ggKi8KCiNpZmRlZiBDT05GSUdfRkJfQVRZX0NUCgl7IFBDSV9DSElQX01BQ0g2NENULCAiQVRJMjY0Q1QgKE1hY2g2NCBDVCkiLCAxMzUsIDYwLCA2MCwgMCwgQVRJX0NISVBfMjY0Q1QgfSwKCXsgUENJX0NISVBfTUFDSDY0RVQsICJBVEkyNjRFVCAoTWFjaDY0IEVUKSIsIDEzNSwgNjAsIDYwLCAwLCBBVElfQ0hJUF8yNjRFVCB9LAoKCS8qIEZJWE1FIHdoYXQgaXMgdGhpcyBjaGlwPyAqLwoJeyBQQ0lfQ0hJUF9NQUNINjRMVCwgIkFUSTI2NExUIChNYWNoNjQgTFQpIiwgMTM1LCA2MywgNjMsIDAsIEFUSV9DSElQXzI2NExUIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRWVCwgIkFUSTI2NFZUIChNYWNoNjQgVlQpIiwgMTcwLCA2NywgNjcsIDgwLCBBVElfQ0hJUF8yNjRWVCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHVCwgIjNEIFJBR0UgKE1hY2g2NCBHVCkiLCAxMzUsIDYzLCA2MywgODAsIEFUSV9DSElQXzI2NEdUIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRWVSwgIkFUSTI2NFZUMyAoTWFjaDY0IFZVKSIsIDIwMCwgNjcsIDY3LCA4MCwgQVRJX0NISVBfMjY0VlQzIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdVLCAiM0QgUkFHRSBJSSsgKE1hY2g2NCBHVSkiLCAyMDAsIDY3LCA2NywgMTAwLCBBVElfQ0hJUF8yNjRHVEIgfSwKCgl7IFBDSV9DSElQX01BQ0g2NExHLCAiM0QgUkFHRSBMVCAoTWFjaDY0IExHKSIsIDIzMCwgNjMsIDYzLCAxMDAsIEFUSV9DSElQXzI2NExURyB8IE02NEZfTFRfTENEX1JFR1MgfCBNNjRGX0czX1BCXzEwMjR4NzY4IH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRWViwgIkFUSTI2NFZUNCAoTWFjaDY0IFZWKSIsIDIzMCwgODMsIDgzLCAxMDAsIEFUSV9DSElQXzI2NFZUNCB9LAoKCXsgUENJX0NISVBfTUFDSDY0R1YsICIzRCBSQUdFIElJQyAoTWFjaDY0IEdWLCBQQ0kpIiwgMjMwLCA4MywgODMsIDEwMCwgQVRJX0NISVBfMjY0R1QyQyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHVywgIjNEIFJBR0UgSUlDIChNYWNoNjQgR1csIEFHUCkiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRHVDJDIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdZLCAiM0QgUkFHRSBJSUMgKE1hY2g2NCBHWSwgUENJKSIsIDIzMCwgODMsIDgzLCAxMDAsIEFUSV9DSElQXzI2NEdUMkMgfSwKCXsgUENJX0NISVBfTUFDSDY0R1osICIzRCBSQUdFIElJQyAoTWFjaDY0IEdaLCBBR1ApIiwgMjMwLCA4MywgODMsIDEwMCwgQVRJX0NISVBfMjY0R1QyQyB9LAoKCXsgUENJX0NISVBfTUFDSDY0R0IsICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdCLCBCR0EsIEFHUCkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdELCAiM0QgUkFHRSBQUk8gKE1hY2g2NCBHRCwgQkdBLCBBR1AgMXgpIiwgMjMwLCAxMDAsIDEwMCwgMTI1LCBBVElfQ0hJUF8yNjRHVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHSSwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR0ksIEJHQSwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIDEyNSwgQVRJX0NISVBfMjY0R1RQUk8gfCBNNjRGX01BR0lDX1ZSQU1fU0laRSB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHUCwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR1AsIFBRRlAsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdRLCAiM0QgUkFHRSBQUk8gKE1hY2g2NCBHUSwgUFFGUCwgUENJLCBsaW1pdGVkIDNEKSIsIDIzMCwgMTAwLCAxMDAsIDEyNSwgQVRJX0NISVBfMjY0R1RQUk8gfSwKCgl7IFBDSV9DSElQX01BQ0g2NExCLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMQiwgQUdQKSIsIDIzNiwgNzUsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMRCwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTEQsIEFHUCkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIH0sCgl7IFBDSV9DSElQX01BQ0g2NExJLCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMSSwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfCBNNjRGX0czX1BCXzFfMSB8IE02NEZfRzNfUEJfMTAyNHg3NjggfSwKCXsgUENJX0NISVBfTUFDSDY0TFAsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExQLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMUSwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTFEsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRHTSwgIjNEIFJBR0UgWEwgKE1hY2g2NCBHTSwgQUdQIDJ4KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdOLCAiM0QgUkFHRSBYQyAoTWFjaDY0IEdOLCBBR1AgMngpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfSwKCXsgUENJX0NISVBfTUFDSDY0R08sICIzRCBSQUdFIFhMIChNYWNoNjQgR08sIFBDSS02NikiLCAyMzAsIDgzLCA2MywgMTM1LCBBVElfQ0hJUF8yNjRYTCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHTCwgIjNEIFJBR0UgWEMgKE1hY2g2NCBHTCwgUENJLTY2KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdSLCAiM0QgUkFHRSBYTCAoTWFjaDY0IEdSLCBQQ0ktMzMpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfCBNNjRGX1NEUkFNX01BR0lDX1BMTCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHUywgIjNEIFJBR0UgWEMgKE1hY2g2NCBHUywgUENJLTMzKSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRMTSwgIjNEIFJBR0UgTW9iaWxpdHkgUC9NIChNYWNoNjQgTE0sIEFHUCAyeCkiLCAyMzAsIDgzLCAxMjUsIDEzNSwgQVRJX0NISVBfTU9CSUxJVFkgfSwKCXsgUENJX0NISVBfTUFDSDY0TE4sICIzRCBSQUdFIE1vYmlsaXR5IEwgKE1hY2g2NCBMTiwgQUdQIDJ4KSIsIDIzMCwgODMsIDEyNSwgMTM1LCBBVElfQ0hJUF9NT0JJTElUWSB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMUiwgIjNEIFJBR0UgTW9iaWxpdHkgUC9NIChNYWNoNjQgTFIsIFBDSSkiLCAyMzAsIDgzLCAxMjUsIDEzNSwgQVRJX0NISVBfTU9CSUxJVFkgfSwKCXsgUENJX0NISVBfTUFDSDY0TFMsICIzRCBSQUdFIE1vYmlsaXR5IEwgKE1hY2g2NCBMUywgUENJKSIsIDIzMCwgODMsIDEyNSwgMTM1LCBBVElfQ0hJUF9NT0JJTElUWSB9LAojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9DVCAqLwp9OwoKLyogY2FuIG5vdCBmYWlsICovCnN0YXRpYyBpbnQgX19kZXZpbml0IGNvcnJlY3RfY2hpcHNldChzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKCXU4IHJldjsKCXUxNiB0eXBlOwoJdTMyIGNoaXBfaWQ7Cgljb25zdCBjaGFyICpuYW1lOwoJaW50IGk7CgoJZm9yIChpID0gQVJSQVlfU0laRShhdHlfY2hpcHMpIC0gMTsgaSA+PSAwOyBpLS0pCgkJaWYgKHBhci0+cGNpX2lkID09IGF0eV9jaGlwc1tpXS5wY2lfaWQpCgkJCWJyZWFrOwoKCW5hbWUgPSBhdHlfY2hpcHNbaV0ubmFtZTsKCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gYXR5X2NoaXBzW2ldLnBsbDsKCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gYXR5X2NoaXBzW2ldLm1jbGs7CglwYXItPnBsbF9saW1pdHMueGNsayA9IGF0eV9jaGlwc1tpXS54Y2xrOwoJcGFyLT5wbGxfbGltaXRzLmVjcF9tYXggPSBhdHlfY2hpcHNbaV0uZWNwX21heDsKCXBhci0+ZmVhdHVyZXMgPSBhdHlfY2hpcHNbaV0uZmVhdHVyZXM7CgoJY2hpcF9pZCA9IGF0eV9sZF9sZTMyKENPTkZJR19DSElQX0lELCBwYXIpOwoJdHlwZSA9IGNoaXBfaWQgJiBDRkdfQ0hJUF9UWVBFOwoJcmV2ID0gKGNoaXBfaWQgJiBDRkdfQ0hJUF9SRVYpID4+IDI0OwoKCXN3aXRjaChwYXItPnBjaV9pZCkgewojaWZkZWYgQ09ORklHX0ZCX0FUWV9HWAoJY2FzZSBQQ0lfQ0hJUF9NQUNINjRHWDoKCQlpZih0eXBlICE9IDB4MDBkNykKCQkJcmV0dXJuIC1FTk9ERVY7CgkJYnJlYWs7CgljYXNlIFBDSV9DSElQX01BQ0g2NENYOgoJCWlmKHR5cGUgIT0gMHgwMDU3KQoJCQlyZXR1cm4gLUVOT0RFVjsKCQlicmVhazsKI2VuZGlmCiNpZmRlZiBDT05GSUdfRkJfQVRZX0NUCgljYXNlIFBDSV9DSElQX01BQ0g2NFZUOgoJCXN3aXRjaCAocmV2ICYgMHgwNykgewoJCWNhc2UgMHgwMDoKCQkJc3dpdGNoIChyZXYgJiAweGMwKSB7CgkJCWNhc2UgMHgwMDoKCQkJCW5hbWUgPSAiQVRJMjY0VlQgKEEzKSAoTWFjaDY0IFZUKSI7CgkJCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IDE3MDsKCQkJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gNjc7CgkJCQlwYXItPnBsbF9saW1pdHMueGNsayA9IDY3OwoJCQkJcGFyLT5wbGxfbGltaXRzLmVjcF9tYXggPSA4MDsKCQkJCXBhci0+ZmVhdHVyZXMgPSBBVElfQ0hJUF8yNjRWVDsKCQkJCWJyZWFrOwoJCQljYXNlIDB4NDA6CgkJCQluYW1lID0gIkFUSTI2NFZUMiAoQTQpIChNYWNoNjQgVlQpIjsKCQkJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gMjAwOwoJCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2NzsKCQkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CgkJCQlwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IDgwOwoJCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NFZUIHwgTTY0Rl9NQUdJQ19QT1NURElWOwoJCQkJYnJlYWs7CgkJCX0KCQkJYnJlYWs7CgkJY2FzZSAweDAxOgoJCQluYW1lID0gIkFUSTI2NFZUMyAoQjEpIChNYWNoNjQgVlQpIjsKCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAyMDA7CgkJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gODA7CgkJCXBhci0+ZmVhdHVyZXMgPSBBVElfQ0hJUF8yNjRWVEI7CgkJCWJyZWFrOwoJCWNhc2UgMHgwMjoKCQkJbmFtZSA9ICJBVEkyNjRWVDMgKEIyKSAoTWFjaDY0IFZUKSI7CgkJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gMjAwOwoJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDY3OwoJCQlwYXItPnBsbF9saW1pdHMueGNsayA9IDY3OwoJCQlwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IDgwOwoJCQlwYXItPmZlYXR1cmVzID0gQVRJX0NISVBfMjY0VlQzOwoJCQlicmVhazsKCQl9CgkJYnJlYWs7CgljYXNlIFBDSV9DSElQX01BQ0g2NEdUOgoJCXN3aXRjaCAocmV2ICYgMHgwNykgewoJCWNhc2UgMHgwMToKCQkJbmFtZSA9ICIzRCBSQUdFIElJIChNYWNoNjQgR1QpIjsKCQkJcGFyLT5wbGxfbGltaXRzLnBsbF9tYXggPSAxNzA7CgkJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNjc7CgkJCXBhci0+cGxsX2xpbWl0cy5lY3BfbWF4ID0gODA7CgkJCXBhci0+ZmVhdHVyZXMgPSBBVElfQ0hJUF8yNjRHVEI7CgkJCWJyZWFrOwoJCWNhc2UgMHgwMjoKCQkJbmFtZSA9ICIzRCBSQUdFIElJKyAoTWFjaDY0IEdUKSI7CgkJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gMjAwOwoJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDY3OwoJCQlwYXItPnBsbF9saW1pdHMueGNsayA9IDY3OwoJCQlwYXItPnBsbF9saW1pdHMuZWNwX21heCA9IDEwMDsKCQkJcGFyLT5mZWF0dXJlcyA9IEFUSV9DSElQXzI2NEdUQjsKCQkJYnJlYWs7CgkJfQoJCWJyZWFrOwojZW5kaWYKCX0KCglQUklOVEtJKCIlcyBbMHglMDR4IHJldiAweCUwMnhdXG4iLCBuYW1lLCB0eXBlLCByZXYpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBjaGFyIHJhbV9kcmFtW10gX19kZXZpbml0ZGF0YSA9ICJEUkFNIjsKc3RhdGljIGNoYXIgcmFtX3Jlc3ZbXSBfX2RldmluaXRkYXRhID0gIlJFU1YiOwojaWZkZWYgQ09ORklHX0ZCX0FUWV9HWApzdGF0aWMgY2hhciByYW1fdnJhbVtdIF9fZGV2aW5pdGRhdGEgPSAiVlJBTSI7CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0dYICovCiNpZmRlZiBDT05GSUdfRkJfQVRZX0NUCnN0YXRpYyBjaGFyIHJhbV9lZG9bXSBfX2RldmluaXRkYXRhID0gIkVETyI7CnN0YXRpYyBjaGFyIHJhbV9zZHJhbVtdIF9fZGV2aW5pdGRhdGEgPSAiU0RSQU0gKDE6MSkiOwpzdGF0aWMgY2hhciByYW1fc2dyYW1bXSBfX2RldmluaXRkYXRhID0gIlNHUkFNICgxOjEpIjsKc3RhdGljIGNoYXIgcmFtX3NkcmFtMzJbXSBfX2RldmluaXRkYXRhID0gIlNEUkFNICgyOjEpICgzMi1iaXQpIjsKc3RhdGljIGNoYXIgcmFtX29mZltdIF9fZGV2aW5pdGRhdGEgPSAiT0ZGIjsKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQ1QgKi8KCgpzdGF0aWMgdTMyIHBzZXVkb19wYWxldHRlWzE3XTsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0dYCnN0YXRpYyBjaGFyICphdHlfZ3hfcmFtWzhdIF9fZGV2aW5pdGRhdGEgPSB7CglyYW1fZHJhbSwgcmFtX3ZyYW0sIHJhbV92cmFtLCByYW1fZHJhbSwKCXJhbV9kcmFtLCByYW1fdnJhbSwgcmFtX3ZyYW0sIHJhbV9yZXN2Cn07CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0dYICovCgojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVApzdGF0aWMgY2hhciAqYXR5X2N0X3JhbVs4XSBfX2RldmluaXRkYXRhID0gewoJcmFtX29mZiwgcmFtX2RyYW0sIHJhbV9lZG8sIHJhbV9lZG8sCglyYW1fc2RyYW0sIHJhbV9zZ3JhbSwgcmFtX3NkcmFtMzIsIHJhbV9yZXN2Cn07CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0NUICovCgpzdGF0aWMgdTMyIGF0eWZiX2dldF9waXhjbG9jayhzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7Cgl1MzIgcGl4Y2xvY2sgPSB2YXItPnBpeGNsb2NrOwojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJdTMyIGxjZF9vbl9vZmY7CglwYXItPnBsbC5jdC54cmVzID0gMDsKCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJbGNkX29uX29mZiA9IGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpOwoJCWlmKGxjZF9vbl9vZmYgJiBMQ0RfT04pIHsKCQkJcGFyLT5wbGwuY3QueHJlcyA9IHZhci0+eHJlczsKCQkJcGl4Y2xvY2sgPSBwYXItPmxjZF9waXhjbG9jazsKCQl9Cgl9CiNlbmRpZgoJcmV0dXJuIHBpeGNsb2NrOwp9CgojaWYgZGVmaW5lZChDT05GSUdfUFBDKQoKLyoKICogIEFwcGxlIG1vbml0b3Igc2Vuc2UKICovCgpzdGF0aWMgaW50IF9fZGV2aW5pdCByZWFkX2F0eV9zZW5zZShjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKCWludCBzZW5zZSwgaTsKCglhdHlfc3RfbGUzMihHUF9JTywgMHgzMTAwMzEwMCwgcGFyKTsgLyogZHJpdmUgb3V0cHV0cyBoaWdoICovCglfX2RlbGF5KDIwMCk7CglhdHlfc3RfbGUzMihHUF9JTywgMCwgcGFyKTsgLyogdHVybiBvZmYgb3V0cHV0cyAqLwoJX19kZWxheSgyMDAwKTsKCWkgPSBhdHlfbGRfbGUzMihHUF9JTywgcGFyKTsgLyogZ2V0IHByaW1hcnkgc2Vuc2UgdmFsdWUgKi8KCXNlbnNlID0gKChpICYgMHgzMDAwKSA+PiAzKSB8IChpICYgMHgxMDApOwoKCS8qIGRyaXZlIGVhY2ggc2Vuc2UgbGluZSBsb3cgaW4gdHVybiBhbmQgY29sbGVjdCB0aGUgb3RoZXIgMiAqLwoJYXR5X3N0X2xlMzIoR1BfSU8sIDB4MjAwMDAwMDAsIHBhcik7IC8qIGRyaXZlIEEgbG93ICovCglfX2RlbGF5KDIwMDApOwoJaSA9IGF0eV9sZF9sZTMyKEdQX0lPLCBwYXIpOwoJc2Vuc2UgfD0gKChpICYgMHgxMDAwKSA+PiA3KSB8ICgoaSAmIDB4MTAwKSA+PiA0KTsKCWF0eV9zdF9sZTMyKEdQX0lPLCAweDIwMDAyMDAwLCBwYXIpOyAvKiBkcml2ZSBBIGhpZ2ggYWdhaW4gKi8KCV9fZGVsYXkoMjAwKTsKCglhdHlfc3RfbGUzMihHUF9JTywgMHgxMDAwMDAwMCwgcGFyKTsgLyogZHJpdmUgQiBsb3cgKi8KCV9fZGVsYXkoMjAwMCk7CglpID0gYXR5X2xkX2xlMzIoR1BfSU8sIHBhcik7CglzZW5zZSB8PSAoKGkgJiAweDIwMDApID4+IDEwKSB8ICgoaSAmIDB4MTAwKSA+PiA2KTsKCWF0eV9zdF9sZTMyKEdQX0lPLCAweDEwMDAxMDAwLCBwYXIpOyAvKiBkcml2ZSBCIGhpZ2ggYWdhaW4gKi8KCV9fZGVsYXkoMjAwKTsKCglhdHlfc3RfbGUzMihHUF9JTywgMHgwMTAwMDAwMCwgcGFyKTsgLyogZHJpdmUgQyBsb3cgKi8KCV9fZGVsYXkoMjAwMCk7CglzZW5zZSB8PSAoYXR5X2xkX2xlMzIoR1BfSU8sIHBhcikgJiAweDMwMDApID4+IDEyOwoJYXR5X3N0X2xlMzIoR1BfSU8sIDAsIHBhcik7IC8qIHR1cm4gb2ZmIG91dHB1dHMgKi8KCXJldHVybiBzZW5zZTsKfQoKI2VuZGlmIC8qIGRlZmluZWQoQ09ORklHX1BQQykgKi8KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qCiAqICBDUlRDIHByb2dyYW1taW5nCiAqLwoKc3RhdGljIHZvaWQgYXR5X2dldF9jcnRjKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgc3RydWN0IGNydGMgKmNydGMpCnsKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJaWYoIU02NF9IQVMoTFRfTENEX1JFR1MpKSB7CgkJICAgIGNydGMtPmxjZF9pbmRleCA9IGF0eV9sZF9sZTMyKExDRF9JTkRFWCwgcGFyKTsKCQkgICAgYXR5X3N0X2xlMzIoTENEX0lOREVYLCBjcnRjLT5sY2RfaW5kZXgsIHBhcik7CgkJfQoJCWNydGMtPmxjZF9jb25maWdfcGFuZWwgPSBhdHlfbGRfbGNkKENPTkZJR19QQU5FTCwgcGFyKTsKCQljcnRjLT5sY2RfZ2VuX2NudGwgPSBhdHlfbGRfbGNkKExDRF9HRU5fQ05UTCwgcGFyKTsKCgoJCS8qIHN3aXRjaCB0byBub24gc2hhZG93IHJlZ2lzdGVycyAqLwoJCWF0eV9zdF9sY2QoTENEX0dFTl9DTlRMLCBjcnRjLT5sY2RfZ2VuX2NudGwgJgogICAgICAgICAgICAgICAgICAgIH4oQ1JUQ19SV19TRUxFQ1QgfCBTSEFET1dfRU4gfCBTSEFET1dfUldfRU4pLCBwYXIpOwoKCQkvKiBzYXZlIHN0cmV0Y2hpbmcgKi8KCQljcnRjLT5ob3J6X3N0cmV0Y2hpbmcgPSBhdHlfbGRfbGNkKEhPUlpfU1RSRVRDSElORywgcGFyKTsKCQljcnRjLT52ZXJ0X3N0cmV0Y2hpbmcgPSBhdHlfbGRfbGNkKFZFUlRfU1RSRVRDSElORywgcGFyKTsKCQlpZiAoIU02NF9IQVMoTFRfTENEX1JFR1MpKQoJCQljcnRjLT5leHRfdmVydF9zdHJldGNoID0gYXR5X2xkX2xjZChFWFRfVkVSVF9TVFJFVENILCBwYXIpOwoJfQojZW5kaWYKCWNydGMtPmhfdG90X2Rpc3AgPSBhdHlfbGRfbGUzMihDUlRDX0hfVE9UQUxfRElTUCwgcGFyKTsKCWNydGMtPmhfc3luY19zdHJ0X3dpZCA9IGF0eV9sZF9sZTMyKENSVENfSF9TWU5DX1NUUlRfV0lELCBwYXIpOwoJY3J0Yy0+dl90b3RfZGlzcCA9IGF0eV9sZF9sZTMyKENSVENfVl9UT1RBTF9ESVNQLCBwYXIpOwoJY3J0Yy0+dl9zeW5jX3N0cnRfd2lkID0gYXR5X2xkX2xlMzIoQ1JUQ19WX1NZTkNfU1RSVF9XSUQsIHBhcik7CgljcnRjLT52bGluZV9jcm50X3ZsaW5lID0gYXR5X2xkX2xlMzIoQ1JUQ19WTElORV9DUk5UX1ZMSU5FLCBwYXIpOwoJY3J0Yy0+b2ZmX3BpdGNoID0gYXR5X2xkX2xlMzIoQ1JUQ19PRkZfUElUQ0gsIHBhcik7CgljcnRjLT5nZW5fY250bCA9IGF0eV9sZF9sZTMyKENSVENfR0VOX0NOVEwsIHBhcik7CgojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQkvKiBzd2l0Y2ggdG8gc2hhZG93IHJlZ2lzdGVycyAqLwoJCWF0eV9zdF9sY2QoTENEX0dFTl9DTlRMLCAoY3J0Yy0+bGNkX2dlbl9jbnRsICYgfkNSVENfUldfU0VMRUNUKSB8CgkJCVNIQURPV19FTiB8IFNIQURPV19SV19FTiwgcGFyKTsKCgkJY3J0Yy0+c2hhZG93X2hfdG90X2Rpc3AgPSBhdHlfbGRfbGUzMihDUlRDX0hfVE9UQUxfRElTUCwgcGFyKTsKCQljcnRjLT5zaGFkb3dfaF9zeW5jX3N0cnRfd2lkID0gYXR5X2xkX2xlMzIoQ1JUQ19IX1NZTkNfU1RSVF9XSUQsIHBhcik7CgkJY3J0Yy0+c2hhZG93X3ZfdG90X2Rpc3AgPSBhdHlfbGRfbGUzMihDUlRDX1ZfVE9UQUxfRElTUCwgcGFyKTsKCQljcnRjLT5zaGFkb3dfdl9zeW5jX3N0cnRfd2lkID0gYXR5X2xkX2xlMzIoQ1JUQ19WX1NZTkNfU1RSVF9XSUQsIHBhcik7CgoJCWF0eV9zdF9sZTMyKExDRF9HRU5fQ05UTCwgY3J0Yy0+bGNkX2dlbl9jbnRsLCBwYXIpOwoJfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCAqLwp9CgpzdGF0aWMgdm9pZCBhdHlfc2V0X2NydGMoY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyLCBjb25zdCBzdHJ1Y3QgY3J0YyAqY3J0YykKewojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDApIHsKCQkvKiBzdG9wIENSVEMgKi8KCQlhdHlfc3RfbGUzMihDUlRDX0dFTl9DTlRMLCBjcnRjLT5nZW5fY250bCAmIH4oQ1JUQ19FWFRfRElTUF9FTiB8IENSVENfRU4pLCBwYXIpOwoKCQkvKiB1cGRhdGUgbm9uLXNoYWRvdyByZWdpc3RlcnMgZmlyc3QgKi8KCQlhdHlfc3RfbGNkKENPTkZJR19QQU5FTCwgY3J0Yy0+bGNkX2NvbmZpZ19wYW5lbCwgcGFyKTsKCQlhdHlfc3RfbGNkKExDRF9HRU5fQ05UTCwgY3J0Yy0+bGNkX2dlbl9jbnRsICYKCQkJfihDUlRDX1JXX1NFTEVDVCB8IFNIQURPV19FTiB8IFNIQURPV19SV19FTiksIHBhcik7CgoJCS8qIHRlbXBvcmFyaWx5IGRpc2FibGUgc3RyZXRjaGluZyAqLwoJCWF0eV9zdF9sY2QoSE9SWl9TVFJFVENISU5HLAoJCQljcnRjLT5ob3J6X3N0cmV0Y2hpbmcgJgoJCQl+KEhPUlpfU1RSRVRDSF9NT0RFIHwgSE9SWl9TVFJFVENIX0VOKSwgcGFyKTsKCQlhdHlfc3RfbGNkKFZFUlRfU1RSRVRDSElORywKCQkJY3J0Yy0+dmVydF9zdHJldGNoaW5nICYKCQkJfihWRVJUX1NUUkVUQ0hfUkFUSU8xIHwgVkVSVF9TVFJFVENIX1JBVElPMiB8CgkJCVZFUlRfU1RSRVRDSF9VU0UwIHwgVkVSVF9TVFJFVENIX0VOKSwgcGFyKTsKCX0KI2VuZGlmCgkvKiB0dXJuIG9mZiBDUlQgKi8KCWF0eV9zdF9sZTMyKENSVENfR0VOX0NOVEwsIGNydGMtPmdlbl9jbnRsICYgfkNSVENfRU4sIHBhcik7CgoJRFBSSU5USygic2V0dGluZyB1cCBDUlRDXG4iKTsKCURQUklOVEsoInNldCBwcmltYXJ5IENSVCB0byAlaXglaSAlYyVjIGNvbXBvc2l0ZSAlY1xuIiwKCSAgICAoKCgoY3J0Yy0+aF90b3RfZGlzcD4+MTYpICYgMHhmZikgKyAxKTw8MyksICgoKGNydGMtPnZfdG90X2Rpc3A+PjE2KSAmIDB4N2ZmKSArIDEpLAoJICAgIChjcnRjLT5oX3N5bmNfc3RydF93aWQgJiAweDIwMDAwMCk/J04nOidQJywgKGNydGMtPnZfc3luY19zdHJ0X3dpZCAmIDB4MjAwMDAwKT8nTic6J1AnLAoJICAgIChjcnRjLT5nZW5fY250bCAmIENSVENfQ1NZTkNfRU4pPydQJzonTicpOwoKCURQUklOVEsoIkNSVENfSF9UT1RBTF9ESVNQOiAleFxuIixjcnRjLT5oX3RvdF9kaXNwKTsKCURQUklOVEsoIkNSVENfSF9TWU5DX1NUUlRfV0lEOiAleFxuIixjcnRjLT5oX3N5bmNfc3RydF93aWQpOwoJRFBSSU5USygiQ1JUQ19WX1RPVEFMX0RJU1A6ICV4XG4iLGNydGMtPnZfdG90X2Rpc3ApOwoJRFBSSU5USygiQ1JUQ19WX1NZTkNfU1RSVF9XSUQ6ICV4XG4iLGNydGMtPnZfc3luY19zdHJ0X3dpZCk7CglEUFJJTlRLKCJDUlRDX09GRl9QSVRDSDogJXhcbiIsIGNydGMtPm9mZl9waXRjaCk7CglEUFJJTlRLKCJDUlRDX1ZMSU5FX0NSTlRfVkxJTkU6ICV4XG4iLCBjcnRjLT52bGluZV9jcm50X3ZsaW5lKTsKCURQUklOVEsoIkNSVENfR0VOX0NOVEw6ICV4XG4iLGNydGMtPmdlbl9jbnRsKTsKCglhdHlfc3RfbGUzMihDUlRDX0hfVE9UQUxfRElTUCwgY3J0Yy0+aF90b3RfZGlzcCwgcGFyKTsKCWF0eV9zdF9sZTMyKENSVENfSF9TWU5DX1NUUlRfV0lELCBjcnRjLT5oX3N5bmNfc3RydF93aWQsIHBhcik7CglhdHlfc3RfbGUzMihDUlRDX1ZfVE9UQUxfRElTUCwgY3J0Yy0+dl90b3RfZGlzcCwgcGFyKTsKCWF0eV9zdF9sZTMyKENSVENfVl9TWU5DX1NUUlRfV0lELCBjcnRjLT52X3N5bmNfc3RydF93aWQsIHBhcik7CglhdHlfc3RfbGUzMihDUlRDX09GRl9QSVRDSCwgY3J0Yy0+b2ZmX3BpdGNoLCBwYXIpOwoJYXR5X3N0X2xlMzIoQ1JUQ19WTElORV9DUk5UX1ZMSU5FLCBjcnRjLT52bGluZV9jcm50X3ZsaW5lLCBwYXIpOwoKCWF0eV9zdF9sZTMyKENSVENfR0VOX0NOVEwsIGNydGMtPmdlbl9jbnRsLCBwYXIpOwojaWYgMAoJRklYTUUKCWlmIChwYXItPmFjY2VsX2ZsYWdzICYgRkJfQUNDRUxGX1RFWFQpCgkJYXR5X2luaXRfZW5naW5lKHBhciwgaW5mbyk7CiNlbmRpZgojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRAoJLyogYWZ0ZXIgc2V0dGluZyB0aGUgQ1JUQyByZWdpc3RlcnMgd2Ugc2hvdWxkIHNldCB0aGUgTENEIHJlZ2lzdGVycy4gKi8KCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJLyogc3dpdGNoIHRvIHNoYWRvdyByZWdpc3RlcnMgKi8KCQlhdHlfc3RfbGNkKExDRF9HRU5fQ05UTCwgKGNydGMtPmxjZF9nZW5fY250bCAmIH5DUlRDX1JXX1NFTEVDVCkgfAoJCQkoU0hBRE9XX0VOIHwgU0hBRE9XX1JXX0VOKSwgcGFyKTsKCgkJRFBSSU5USygic2V0IHNoYWRvdyBDUlQgdG8gJWl4JWkgJWMlY1xuIiwKCQkgICAgKCgoKGNydGMtPnNoYWRvd19oX3RvdF9kaXNwPj4xNikgJiAweGZmKSArIDEpPDwzKSwgKCgoY3J0Yy0+c2hhZG93X3ZfdG90X2Rpc3A+PjE2KSAmIDB4N2ZmKSArIDEpLAoJCSAgICAoY3J0Yy0+c2hhZG93X2hfc3luY19zdHJ0X3dpZCAmIDB4MjAwMDAwKT8nTic6J1AnLCAoY3J0Yy0+c2hhZG93X3Zfc3luY19zdHJ0X3dpZCAmIDB4MjAwMDAwKT8nTic6J1AnKTsKCgkJRFBSSU5USygiU0hBRE9XIENSVENfSF9UT1RBTF9ESVNQOiAleFxuIiwgY3J0Yy0+c2hhZG93X2hfdG90X2Rpc3ApOwoJCURQUklOVEsoIlNIQURPVyBDUlRDX0hfU1lOQ19TVFJUX1dJRDogJXhcbiIsIGNydGMtPnNoYWRvd19oX3N5bmNfc3RydF93aWQpOwoJCURQUklOVEsoIlNIQURPVyBDUlRDX1ZfVE9UQUxfRElTUDogJXhcbiIsIGNydGMtPnNoYWRvd192X3RvdF9kaXNwKTsKCQlEUFJJTlRLKCJTSEFET1cgQ1JUQ19WX1NZTkNfU1RSVF9XSUQ6ICV4XG4iLCBjcnRjLT5zaGFkb3dfdl9zeW5jX3N0cnRfd2lkKTsKCgkJYXR5X3N0X2xlMzIoQ1JUQ19IX1RPVEFMX0RJU1AsIGNydGMtPnNoYWRvd19oX3RvdF9kaXNwLCBwYXIpOwoJCWF0eV9zdF9sZTMyKENSVENfSF9TWU5DX1NUUlRfV0lELCBjcnRjLT5zaGFkb3dfaF9zeW5jX3N0cnRfd2lkLCBwYXIpOwoJCWF0eV9zdF9sZTMyKENSVENfVl9UT1RBTF9ESVNQLCBjcnRjLT5zaGFkb3dfdl90b3RfZGlzcCwgcGFyKTsKCQlhdHlfc3RfbGUzMihDUlRDX1ZfU1lOQ19TVFJUX1dJRCwgY3J0Yy0+c2hhZG93X3Zfc3luY19zdHJ0X3dpZCwgcGFyKTsKCgkJLyogcmVzdG9yZSBDUlRDIHNlbGVjdGlvbiAmIHNoYWRvdyBzdGF0ZSBhbmQgZW5hYmxlIHN0cmV0Y2hpbmcgKi8KCQlEUFJJTlRLKCJMQ0RfR0VOX0NOVEw6ICV4XG4iLCBjcnRjLT5sY2RfZ2VuX2NudGwpOwoJCURQUklOVEsoIkhPUlpfU1RSRVRDSElORzogJXhcbiIsIGNydGMtPmhvcnpfc3RyZXRjaGluZyk7CgkJRFBSSU5USygiVkVSVF9TVFJFVENISU5HOiAleFxuIiwgY3J0Yy0+dmVydF9zdHJldGNoaW5nKTsKCQlpZighTTY0X0hBUyhMVF9MQ0RfUkVHUykpCgkJICAgIERQUklOVEsoIkVYVF9WRVJUX1NUUkVUQ0g6ICV4XG4iLCBjcnRjLT5leHRfdmVydF9zdHJldGNoKTsKCgkJYXR5X3N0X2xjZChMQ0RfR0VOX0NOVEwsIGNydGMtPmxjZF9nZW5fY250bCwgcGFyKTsKCQlhdHlfc3RfbGNkKEhPUlpfU1RSRVRDSElORywgY3J0Yy0+aG9yel9zdHJldGNoaW5nLCBwYXIpOwoJCWF0eV9zdF9sY2QoVkVSVF9TVFJFVENISU5HLCBjcnRjLT52ZXJ0X3N0cmV0Y2hpbmcsIHBhcik7CgkJaWYoIU02NF9IQVMoTFRfTENEX1JFR1MpKSB7CgkJICAgIGF0eV9zdF9sY2QoRVhUX1ZFUlRfU1RSRVRDSCwgY3J0Yy0+ZXh0X3ZlcnRfc3RyZXRjaCwgcGFyKTsKCQkgICAgYXR5X2xkX2xlMzIoTENEX0lOREVYLCBwYXIpOwoJCSAgICBhdHlfc3RfbGUzMihMQ0RfSU5ERVgsIGNydGMtPmxjZF9pbmRleCwgcGFyKTsKCQl9Cgl9CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEICovCn0KCnN0YXRpYyBpbnQgYXR5X3Zhcl90b19jcnRjKGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvLAoJY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBjcnRjICpjcnRjKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7Cgl1MzIgeHJlcywgeXJlcywgdnhyZXMsIHZ5cmVzLCB4b2Zmc2V0LCB5b2Zmc2V0LCBicHA7Cgl1MzIgc3luYywgdm1vZGUsIHZkaXNwbGF5OwoJdTMyIGhfdG90YWwsIGhfZGlzcCwgaF9zeW5jX3N0cnQsIGhfc3luY19lbmQsIGhfc3luY19kbHksIGhfc3luY193aWQsIGhfc3luY19wb2w7Cgl1MzIgdl90b3RhbCwgdl9kaXNwLCB2X3N5bmNfc3RydCwgdl9zeW5jX2VuZCwgdl9zeW5jX3dpZCwgdl9zeW5jX3BvbCwgY19zeW5jOwoJdTMyIHBpeF93aWR0aCwgZHBfcGl4X3dpZHRoLCBkcF9jaGFpbl9tYXNrOwoKCS8qIGlucHV0ICovCgl4cmVzID0gdmFyLT54cmVzOwoJeXJlcyA9IHZhci0+eXJlczsKCXZ4cmVzID0gdmFyLT54cmVzX3ZpcnR1YWw7Cgl2eXJlcyA9IHZhci0+eXJlc192aXJ0dWFsOwoJeG9mZnNldCA9IHZhci0+eG9mZnNldDsKCXlvZmZzZXQgPSB2YXItPnlvZmZzZXQ7CglicHAgPSB2YXItPmJpdHNfcGVyX3BpeGVsOwoJaWYgKGJwcCA9PSAxNikKCQlicHAgPSAodmFyLT5ncmVlbi5sZW5ndGggPT0gNSkgPyAxNSA6IDE2OwoJc3luYyA9IHZhci0+c3luYzsKCXZtb2RlID0gdmFyLT52bW9kZTsKCgkvKiBjb252ZXJ0IChhbmQgcm91bmQgdXApIGFuZCB2YWxpZGF0ZSAqLwoJaWYgKHZ4cmVzIDwgeHJlcyArIHhvZmZzZXQpCgkJdnhyZXMgPSB4cmVzICsgeG9mZnNldDsKCWhfZGlzcCA9IHhyZXM7CgoJaWYgKHZ5cmVzIDwgeXJlcyArIHlvZmZzZXQpCgkJdnlyZXMgPSB5cmVzICsgeW9mZnNldDsKCXZfZGlzcCA9IHlyZXM7CgoJaWYgKGJwcCA8PSA4KSB7CgkJYnBwID0gODsKCQlwaXhfd2lkdGggPSBDUlRDX1BJWF9XSURUSF84QlBQOwoJCWRwX3BpeF93aWR0aCA9CgkJICAgIEhPU1RfOEJQUCB8IFNSQ184QlBQIHwgRFNUXzhCUFAgfAoJCSAgICBCWVRFX09SREVSX0xTQl9UT19NU0I7CgkJZHBfY2hhaW5fbWFzayA9IERQX0NIQUlOXzhCUFA7Cgl9IGVsc2UgaWYgKGJwcCA8PSAxNSkgewoJCWJwcCA9IDE2OwoJCXBpeF93aWR0aCA9IENSVENfUElYX1dJRFRIXzE1QlBQOwoJCWRwX3BpeF93aWR0aCA9IEhPU1RfMTVCUFAgfCBTUkNfMTVCUFAgfCBEU1RfMTVCUFAgfAoJCSAgICBCWVRFX09SREVSX0xTQl9UT19NU0I7CgkJZHBfY2hhaW5fbWFzayA9IERQX0NIQUlOXzE1QlBQOwoJfSBlbHNlIGlmIChicHAgPD0gMTYpIHsKCQlicHAgPSAxNjsKCQlwaXhfd2lkdGggPSBDUlRDX1BJWF9XSURUSF8xNkJQUDsKCQlkcF9waXhfd2lkdGggPSBIT1NUXzE2QlBQIHwgU1JDXzE2QlBQIHwgRFNUXzE2QlBQIHwKCQkgICAgQllURV9PUkRFUl9MU0JfVE9fTVNCOwoJCWRwX2NoYWluX21hc2sgPSBEUF9DSEFJTl8xNkJQUDsKCX0gZWxzZSBpZiAoYnBwIDw9IDI0ICYmIE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQlicHAgPSAyNDsKCQlwaXhfd2lkdGggPSBDUlRDX1BJWF9XSURUSF8yNEJQUDsKCQlkcF9waXhfd2lkdGggPQoJCSAgICBIT1NUXzhCUFAgfCBTUkNfOEJQUCB8IERTVF84QlBQIHwKCQkgICAgQllURV9PUkRFUl9MU0JfVE9fTVNCOwoJCWRwX2NoYWluX21hc2sgPSBEUF9DSEFJTl8yNEJQUDsKCX0gZWxzZSBpZiAoYnBwIDw9IDMyKSB7CgkJYnBwID0gMzI7CgkJcGl4X3dpZHRoID0gQ1JUQ19QSVhfV0lEVEhfMzJCUFA7CgkJZHBfcGl4X3dpZHRoID0gSE9TVF8zMkJQUCB8IFNSQ18zMkJQUCB8IERTVF8zMkJQUCB8CgkJICAgIEJZVEVfT1JERVJfTFNCX1RPX01TQjsKCQlkcF9jaGFpbl9tYXNrID0gRFBfQ0hBSU5fMzJCUFA7Cgl9IGVsc2UKCQlGQUlMKCJpbnZhbGlkIGJwcCIpOwoKCWlmICh2eHJlcyAqIHZ5cmVzICogYnBwIC8gOCA+IGluZm8tPmZpeC5zbWVtX2xlbikKCQlGQUlMKCJub3QgZW5vdWdoIHZpZGVvIFJBTSIpOwoKCWhfc3luY19wb2wgPSBzeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QgPyAwIDogMTsKCXZfc3luY19wb2wgPSBzeW5jICYgRkJfU1lOQ19WRVJUX0hJR0hfQUNUID8gMCA6IDE7CgoJaWYoKHhyZXMgPiAxNjAwKSB8fCAoeXJlcyA+IDEyMDApKSB7CgkJRkFJTCgiTUFDSDY0IGNoaXBzIGFyZSBkZXNpZ25lZCBmb3IgbWF4IDE2MDB4MTIwMFxuIgoJCSJzZWxlY3QgYW5vdGVyIHJlc29sdXRpb24uIik7Cgl9CgloX3N5bmNfc3RydCA9IGhfZGlzcCArIHZhci0+cmlnaHRfbWFyZ2luOwoJaF9zeW5jX2VuZCA9IGhfc3luY19zdHJ0ICsgdmFyLT5oc3luY19sZW47CgloX3N5bmNfZGx5ICA9IHZhci0+cmlnaHRfbWFyZ2luICYgNzsKCWhfdG90YWwgPSBoX3N5bmNfZW5kICsgaF9zeW5jX2RseSArIHZhci0+bGVmdF9tYXJnaW47CgoJdl9zeW5jX3N0cnQgPSB2X2Rpc3AgKyB2YXItPmxvd2VyX21hcmdpbjsKCXZfc3luY19lbmQgPSB2X3N5bmNfc3RydCArIHZhci0+dnN5bmNfbGVuOwoJdl90b3RhbCA9IHZfc3luY19lbmQgKyB2YXItPnVwcGVyX21hcmdpbjsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCWlmKCFNNjRfSEFTKExUX0xDRF9SRUdTKSkgewoJCSAgICB1MzIgbGNkX2luZGV4ID0gYXR5X2xkX2xlMzIoTENEX0lOREVYLCBwYXIpOwoJCSAgICBjcnRjLT5sY2RfaW5kZXggPSBsY2RfaW5kZXggJgoJCQl+KExDRF9JTkRFWF9NQVNLIHwgTENEX0RJU1BMQVlfRElTIHwgTENEX1NSQ19TRUwgfCBDUlRDMl9ESVNQTEFZX0RJUyk7CgkJICAgIGF0eV9zdF9sZTMyKExDRF9JTkRFWCwgbGNkX2luZGV4LCBwYXIpOwoJCX0KCgkJaWYgKCFNNjRfSEFTKE1PQklMX0JVUykpCgkJCWNydGMtPmxjZF9pbmRleCB8PSBDUlRDMl9ESVNQTEFZX0RJUzsKCgkJY3J0Yy0+bGNkX2NvbmZpZ19wYW5lbCA9IGF0eV9sZF9sY2QoQ09ORklHX1BBTkVMLCBwYXIpIHwgMHg0MDAwOwoJCWNydGMtPmxjZF9nZW5fY250bCA9IGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpICYgfkNSVENfUldfU0VMRUNUOwoKCQljcnRjLT5sY2RfZ2VuX2NudGwgJj0KCQkJfihIT1JaX0RJVkJZMl9FTiB8IERJU19IT1JfQ1JUX0RJVkJZMiB8IFRWQ0xLX1BNX0VOIHwKCQkJLypWQ0xLX0RBQ19QTV9FTiB8IFVTRV9TSEFET1dFRF9WRU5EIHwqLwoJCQlVU0VfU0hBRE9XRURfUk9XQ1VSIHwgU0hBRE9XX0VOIHwgU0hBRE9XX1JXX0VOKTsKCQljcnRjLT5sY2RfZ2VuX2NudGwgfD0gRE9OVF9TSEFET1dfVlBBUiB8IExPQ0tfOERPVDsKCgkJaWYoKGNydGMtPmxjZF9nZW5fY250bCAmIExDRF9PTikgJiYKCQkJKCh4cmVzID4gcGFyLT5sY2Rfd2lkdGgpIHx8ICh5cmVzID4gcGFyLT5sY2RfaGVpZ2h0KSkpIHsKCQkJLyogV2UgY2Fubm90IGRpc3BsYXkgdGhlIG1vZGUgb24gdGhlIExDRC4gSWYgdGhlIENSVCBpcyBlbmFibGVkCgkJCSAgIHdlIGNhbiB0dXJuIG9mZiB0aGUgTENELgoJCQkgICBJZiB0aGUgQ1JUIGlzIG9mZiwgaXQgaXNuJ3QgYSBnb29kIGlkZWEgdG8gc3dpdGNoIGl0IG9uOyB3ZSBkb24ndAoJCQkgICBrbm93IGlmIG9uZSBpcyBjb25uZWN0ZWQuIFNvIGl0J3MgYmV0dGVyIHRvIGZhaWwgdGhlbi4KCQkJICovCgkJCWlmIChjcnRjLT5sY2RfZ2VuX2NudGwgJiBDUlRfT04pIHsKCQkJCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkKCQkJCQlQUklOVEtJKCJEaXNhYmxlIExDRCBwYW5lbCwgYmVjYXVzZSB2aWRlbyBtb2RlIGRvZXMgbm90IGZpdC5cbiIpOwoJCQkJY3J0Yy0+bGNkX2dlbl9jbnRsICY9IH5MQ0RfT047CgkJCQkvKmF0eV9zdF9sY2QoTENEX0dFTl9DTlRMLCBjcnRjLT5sY2RfZ2VuX2NudGwsIHBhcik7Ki8KCQkJfSBlbHNlIHsKCQkJCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkKCQkJCQlQUklOVEtFKCJWaWRlbyBtb2RlIGV4Y2VlZHMgc2l6ZSBvZiBMQ0QgcGFuZWwuXG5Db25uZWN0IHRoaXMgY29tcHV0ZXIgdG8gYSBjb252ZW50aW9uYWwgbW9uaXRvciBpZiB5b3UgcmVhbGx5IG5lZWQgdGhpcyBtb2RlLlxuIik7CgkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJfQoJCX0KCX0KCglpZiAoKHBhci0+bGNkX3RhYmxlICE9IDApICYmIChjcnRjLT5sY2RfZ2VuX2NudGwgJiBMQ0RfT04pKSB7CgkJaW50IFZTY2FuID0gMTsKCQkvKiBicHAgLT4gYnl0ZXNwcCwgMSw0IC0+IDA7IDggLT4gMjsgMTUsMTYgLT4gMTsgMjQgLT4gNjsgMzIgLT4gNQoJCWNvbnN0IHU4IERGUF9oX3N5bmNfZGx5X0xUW10gPSB7IDAsIDIsIDEsIDYsIDUgfTsKCQljb25zdCB1OCBBRERfdG9fc3RydF93aWRfYW5kX2RseV9MVF9EQUNbXSA9IHsgMCwgNSwgNiwgOSwgOSwgMTIsIDEyIH07ICAqLwoKCQl2bW9kZSAmPSB+KEZCX1ZNT0RFX0RPVUJMRSB8IEZCX1ZNT0RFX0lOVEVSTEFDRUQpOwoKCQkvKiBUaGlzIGlzIGhvcnJvciEgV2hlbiB3ZSBzaW11bGF0ZSwgc2F5IDY0MHg0ODAgb24gYW4gODAweDYwMAoJCSAgIExDRCBtb25pdG9yLCB0aGUgQ1JUQyBzaG91bGQgYmUgcHJvZ3JhbW1lZCA4MDB4NjAwIHZhbHVlcyBmb3IKCQkgICB0aGUgbm9uIHZpc2libGUgcGFydCwgYnV0IDY0MHg0ODAgZm9yIHRoZSB2aXNpYmxlIHBhcnQuCgkJICAgVGhpcyBjb2RlIGhhcyBiZWVuIHRlc3RlZCBvbiBhIGxhcHRvcCB3aXRoIGl0J3MgMTQwMHgxMDUwIExDRAoJCSAgIG1vbml0b3IgYW5kIGEgY29udmVudGlvbmFsIG1vbml0b3IgYm90aCBzd2l0Y2hlZCBvbi4KCQkgICBUZXN0ZWQgbW9kZXM6IDEyODB4MTAyNCwgMTE1Mng4NjQsIDEwMjR4NzY4LCA4MDB4NjAwLAoJCSAgICB3b3JrcyB3aXRoIGxpdHRsZSBnbGl0Y2hlcyBhbHNvIHdpdGggRE9VQkxFU0NBTiBtb2RlcwoJCSAqLwoJCWlmICh5cmVzIDwgcGFyLT5sY2RfaGVpZ2h0KSB7CgkJCVZTY2FuID0gcGFyLT5sY2RfaGVpZ2h0IC8geXJlczsKCQkJaWYoVlNjYW4gPiAxKSB7CgkJCQlWU2NhbiA9IDI7CgkJCQl2bW9kZSB8PSBGQl9WTU9ERV9ET1VCTEU7CgkJCX0KCQl9CgoJCWhfc3luY19zdHJ0ID0gaF9kaXNwICsgcGFyLT5sY2RfcmlnaHRfbWFyZ2luOwoJCWhfc3luY19lbmQgPSBoX3N5bmNfc3RydCArIHBhci0+bGNkX2hzeW5jX2xlbjsKCQloX3N5bmNfZGx5ID0gLypERlBfaF9zeW5jX2RseVsgKCBicHAgKyAxICkgLyAzIF07ICovcGFyLT5sY2RfaHN5bmNfZGx5OwoJCWhfdG90YWwgPSBoX2Rpc3AgKyBwYXItPmxjZF9oYmxhbmtfbGVuOwoKCQl2X3N5bmNfc3RydCA9IHZfZGlzcCArIHBhci0+bGNkX2xvd2VyX21hcmdpbiAvIFZTY2FuOwoJCXZfc3luY19lbmQgPSB2X3N5bmNfc3RydCArIHBhci0+bGNkX3ZzeW5jX2xlbiAvIFZTY2FuOwoJCXZfdG90YWwgPSB2X2Rpc3AgKyBwYXItPmxjZF92YmxhbmtfbGVuIC8gVlNjYW47Cgl9CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEICovCgoJaF9kaXNwID0gKGhfZGlzcCA+PiAzKSAtIDE7CgloX3N5bmNfc3RydCA9IChoX3N5bmNfc3RydCA+PiAzKSAtIDE7CgloX3N5bmNfZW5kID0gKGhfc3luY19lbmQgPj4gMykgLSAxOwoJaF90b3RhbCA9IChoX3RvdGFsID4+IDMpIC0gMTsKCWhfc3luY193aWQgPSBoX3N5bmNfZW5kIC0gaF9zeW5jX3N0cnQ7CgoJRkFJTF9NQVgoImhfZGlzcCB0b28gbGFyZ2UiLCBoX2Rpc3AsIDB4ZmYpOwoJRkFJTF9NQVgoImhfc3luY19zdHJ0IHRvbyBsYXJnZSIsIGhfc3luY19zdHJ0LCAweDFmZik7CgkvKkZBSUxfTUFYKCJoX3N5bmNfd2lkIHRvbyBsYXJnZSIsIGhfc3luY193aWQsIDB4MWYpOyovCglpZihoX3N5bmNfd2lkID4gMHgxZikKCQloX3N5bmNfd2lkID0gMHgxZjsKCUZBSUxfTUFYKCJoX3RvdGFsIHRvbyBsYXJnZSIsIGhfdG90YWwsIDB4MWZmKTsKCglpZiAodm1vZGUgJiBGQl9WTU9ERV9ET1VCTEUpIHsKCQl2X2Rpc3AgPDw9IDE7CgkJdl9zeW5jX3N0cnQgPDw9IDE7CgkJdl9zeW5jX2VuZCA8PD0gMTsKCQl2X3RvdGFsIDw8PSAxOwoJfQoKCXZkaXNwbGF5ID0geXJlczsKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCWlmICgocGFyLT5sY2RfdGFibGUgIT0gMCkgJiYgKGNydGMtPmxjZF9nZW5fY250bCAmIExDRF9PTikpCgkJdmRpc3BsYXkgID0gcGFyLT5sY2RfaGVpZ2h0OwojZW5kaWYKCgl2X2Rpc3AtLTsKCXZfc3luY19zdHJ0LS07Cgl2X3N5bmNfZW5kLS07Cgl2X3RvdGFsLS07Cgl2X3N5bmNfd2lkID0gdl9zeW5jX2VuZCAtIHZfc3luY19zdHJ0OwoKCUZBSUxfTUFYKCJ2X2Rpc3AgdG9vIGxhcmdlIiwgdl9kaXNwLCAweDdmZik7CglGQUlMX01BWCgidl9zeW5jX3N0c3J0IHRvbyBsYXJnZSIsIHZfc3luY19zdHJ0LCAweDdmZik7CgkvKkZBSUxfTUFYKCJ2X3N5bmNfd2lkIHRvbyBsYXJnZSIsIHZfc3luY193aWQsIDB4MWYpOyovCglpZih2X3N5bmNfd2lkID4gMHgxZikKCQl2X3N5bmNfd2lkID0gMHgxZjsKCUZBSUxfTUFYKCJ2X3RvdGFsIHRvbyBsYXJnZSIsIHZfdG90YWwsIDB4N2ZmKTsKCgljX3N5bmMgPSBzeW5jICYgRkJfU1lOQ19DT01QX0hJR0hfQUNUID8gQ1JUQ19DU1lOQ19FTiA6IDA7CgoJLyogb3V0cHV0ICovCgljcnRjLT52eHJlcyA9IHZ4cmVzOwoJY3J0Yy0+dnlyZXMgPSB2eXJlczsKCWNydGMtPnhvZmZzZXQgPSB4b2Zmc2V0OwoJY3J0Yy0+eW9mZnNldCA9IHlvZmZzZXQ7CgljcnRjLT5icHAgPSBicHA7CgljcnRjLT5vZmZfcGl0Y2ggPSAoKHlvZmZzZXQqdnhyZXMreG9mZnNldCkqYnBwLzY0KSB8ICh2eHJlczw8MTkpOwoJY3J0Yy0+dmxpbmVfY3JudF92bGluZSA9IDA7CgoJY3J0Yy0+aF90b3RfZGlzcCA9IGhfdG90YWwgfCAoaF9kaXNwPDwxNik7CgljcnRjLT5oX3N5bmNfc3RydF93aWQgPSAoaF9zeW5jX3N0cnQgJiAweGZmKSB8IChoX3N5bmNfZGx5PDw4KSB8CgkJKChoX3N5bmNfc3RydCAmIDB4MTAwKTw8NCkgfCAoaF9zeW5jX3dpZDw8MTYpIHwgKGhfc3luY19wb2w8PDIxKTsKCWNydGMtPnZfdG90X2Rpc3AgPSB2X3RvdGFsIHwgKHZfZGlzcDw8MTYpOwoJY3J0Yy0+dl9zeW5jX3N0cnRfd2lkID0gdl9zeW5jX3N0cnQgfCAodl9zeW5jX3dpZDw8MTYpIHwgKHZfc3luY19wb2w8PDIxKTsKCgkvKiBjcnRjLT5nZW5fY250bCA9IGF0eV9sZF9sZTMyKENSVENfR0VOX0NOVEwsIHBhcikgJiBDUlRDX1BSRVNFUlZFRF9NQVNLOyAqLwoJY3J0Yy0+Z2VuX2NudGwgPSBDUlRDX0VYVF9ESVNQX0VOIHwgQ1JUQ19FTiB8IHBpeF93aWR0aCB8IGNfc3luYzsKCWNydGMtPmdlbl9jbnRsIHw9IENSVENfVkdBX0xJTkVBUjsKCgkvKiBFbmFibGUgZG91Ymxlc2NhbiBtb2RlIGlmIHJlcXVlc3RlZCAqLwoJaWYgKHZtb2RlICYgRkJfVk1PREVfRE9VQkxFKQoJCWNydGMtPmdlbl9jbnRsIHw9IENSVENfREJMX1NDQU5fRU47CgkvKiBFbmFibGUgaW50ZXJsYWNlZCBtb2RlIGlmIHJlcXVlc3RlZCAqLwoJaWYgKHZtb2RlICYgRkJfVk1PREVfSU5URVJMQUNFRCkKCQljcnRjLT5nZW5fY250bCB8PSBDUlRDX0lOVEVSTEFDRV9FTjsKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCWlmIChwYXItPmxjZF90YWJsZSAhPSAwKSB7CgkJdmRpc3BsYXkgPSB5cmVzOwoJCWlmKHZtb2RlICYgRkJfVk1PREVfRE9VQkxFKQoJCQl2ZGlzcGxheSA8PD0gMTsKCQljcnRjLT5nZW5fY250bCAmPSB+KENSVEMyX0VOIHwgQ1JUQzJfUElYX1dJRFRIKTsKCQljcnRjLT5sY2RfZ2VuX2NudGwgJj0gfihIT1JaX0RJVkJZMl9FTiB8IERJU19IT1JfQ1JUX0RJVkJZMiB8CgkJCS8qVFZDTEtfUE1fRU4gfCBWQ0xLX0RBQ19QTV9FTiB8Ki8KCQkJVVNFX1NIQURPV0VEX1ZFTkQgfCBVU0VfU0hBRE9XRURfUk9XQ1VSIHwgU0hBRE9XX0VOIHwgU0hBRE9XX1JXX0VOKTsKCQljcnRjLT5sY2RfZ2VuX2NudGwgfD0gKERPTlRfU0hBRE9XX1ZQQVIvKiB8IExPQ0tfOERPVCovKTsKCgkJLyogTU9CSUxJVFkgTTEgdGVzdGVkLCBGSVhNRTogTFQgKi8KCQljcnRjLT5ob3J6X3N0cmV0Y2hpbmcgPSBhdHlfbGRfbGNkKEhPUlpfU1RSRVRDSElORywgcGFyKTsKCQlpZiAoIU02NF9IQVMoTFRfTENEX1JFR1MpKQoJCQljcnRjLT5leHRfdmVydF9zdHJldGNoID0gYXR5X2xkX2xjZChFWFRfVkVSVF9TVFJFVENILCBwYXIpICYKCQkJCX4oQVVUT19WRVJUX1JBVElPIHwgVkVSVF9TVFJFVENIX01PREUgfCBWRVJUX1NUUkVUQ0hfUkFUSU8zKTsKCgkJY3J0Yy0+aG9yel9zdHJldGNoaW5nICY9CgkJCX4oSE9SWl9TVFJFVENIX1JBVElPIHwgSE9SWl9TVFJFVENIX0xPT1AgfCBBVVRPX0hPUlpfUkFUSU8gfAoJCQlIT1JaX1NUUkVUQ0hfTU9ERSB8IEhPUlpfU1RSRVRDSF9FTik7CgkJaWYgKHhyZXMgPCBwYXItPmxjZF93aWR0aCAmJiBjcnRjLT5sY2RfZ2VuX2NudGwgJiBMQ0RfT04pIHsKCQkJZG8gewoJCQkJLyoKCQkJCSogVGhlIGhvcml6b250YWwgYmxlbmRlciBtaXNiZWhhdmVzIHdoZW4gSERpc3BsYXkgaXMgbGVzcyB0aGFuIGEKCQkJCSogYSBjZXJ0YWluIHRocmVzaG9sZCAoNDQwIGZvciBhIDEwMjQtd2lkZSBwYW5lbCkuICBJdCBkb2Vzbid0CgkJCQkqIHN0cmV0Y2ggc3VjaCBtb2RlcyBlbm91Z2guICBVc2UgcGl4ZWwgcmVwbGljYXRpb24gaW5zdGVhZCBvZgoJCQkJKiBibGVuZGluZyB0byBzdHJldGNoIG1vZGVzIHRoYXQgY2FuIGJlIG1hZGUgdG8gZXhhY3RseSBmaXQgdGhlCgkJCQkqIHBhbmVsIHdpZHRoLiAgVGhlIHVuZG9jdW1lbnRlZCAiTm9MQ0RCbGVuZCIgb3B0aW9uIGFsbG93cyB0aGUKCQkJCSogcGl4ZWwtcmVwbGljYXRlZCBtb2RlIHRvIGJlIHNsaWdodGx5IHdpZGVyIG9yIG5hcnJvd2VyIHRoYW4gdGhlCgkJCQkqIHBhbmVsIHdpZHRoLiAgSXQgYWxzbyBjYXVzZXMgYSBtb2RlIHRoYXQgaXMgZXhhY3RseSBoYWxmIGFzIHdpZGUKCQkJCSogYXMgdGhlIHBhbmVsIHRvIGJlIHBpeGVsLXJlcGxpY2F0ZWQsIHJhdGhlciB0aGFuIGJsZW5kZWQuCgkJCQkqLwoJCQkJaW50IEhEaXNwbGF5ICA9IHhyZXMgJiB+NzsKCQkJCWludCBuU3RyZXRjaCAgPSBwYXItPmxjZF93aWR0aCAvIEhEaXNwbGF5OwoJCQkJaW50IFJlbWFpbmRlciA9IHBhci0+bGNkX3dpZHRoICUgSERpc3BsYXk7CgoJCQkJaWYgKCghUmVtYWluZGVyICYmICgoblN0cmV0Y2ggPiAyKSkpIHx8CgkJCQkJKCgoSERpc3BsYXkgKiAxNikgLyBwYXItPmxjZF93aWR0aCkgPCA3KSkgewoJCQkJCXN0YXRpYyBjb25zdCBjaGFyIFN0cmV0Y2hMb29wc1tdID0gezEwLCAxMiwgMTMsIDE1LCAxNn07CgkJCQkJaW50IGhvcnpfc3RyZXRjaF9sb29wID0gLTEsIEJlc3RSZW1haW5kZXI7CgkJCQkJaW50IE51bWVyYXRvciA9IEhEaXNwbGF5LCBEZW5vbWluYXRvciA9IHBhci0+bGNkX3dpZHRoOwoJCQkJCWludCBJbmRleCA9IDU7CgkJCQkJQVRJUmVkdWNlUmF0aW8oJk51bWVyYXRvciwgJkRlbm9taW5hdG9yKTsKCgkJCQkJQmVzdFJlbWFpbmRlciA9IChOdW1lcmF0b3IgKiAxNikgLyBEZW5vbWluYXRvcjsKCQkJCQl3aGlsZSAoLS1JbmRleCA+PSAwKSB7CgkJCQkJCVJlbWFpbmRlciA9ICgoRGVub21pbmF0b3IgLSBOdW1lcmF0b3IpICogU3RyZXRjaExvb3BzW0luZGV4XSkgJQoJCQkJCQkJRGVub21pbmF0b3I7CgkJCQkJCWlmIChSZW1haW5kZXIgPCBCZXN0UmVtYWluZGVyKSB7CgkJCQkJCQlob3J6X3N0cmV0Y2hfbG9vcCA9IEluZGV4OwoJCQkJCQkJaWYgKCEoQmVzdFJlbWFpbmRlciA9IFJlbWFpbmRlcikpCgkJCQkJCQkJYnJlYWs7CgkJCQkJCX0KCQkJCQl9CgoJCQkJCWlmICgoaG9yel9zdHJldGNoX2xvb3AgPj0gMCkgJiYgIUJlc3RSZW1haW5kZXIpIHsKCQkJCQkJaW50IGhvcnpfc3RyZXRjaF9yYXRpbyA9IDAsIEFjY3VtdWxhdG9yID0gMDsKCQkJCQkJaW50IHJldXNlX3ByZXZpb3VzID0gMTsKCgkJCQkJCUluZGV4ID0gU3RyZXRjaExvb3BzW2hvcnpfc3RyZXRjaF9sb29wXTsKCgkJCQkJCXdoaWxlICgtLUluZGV4ID49IDApIHsKCQkJCQkJCWlmIChBY2N1bXVsYXRvciA+IDApCgkJCQkJCQkJaG9yel9zdHJldGNoX3JhdGlvIHw9IHJldXNlX3ByZXZpb3VzOwoJCQkJCQkJZWxzZQoJCQkJCQkJCUFjY3VtdWxhdG9yICs9IERlbm9taW5hdG9yOwoJCQkJCQkJQWNjdW11bGF0b3IgLT0gTnVtZXJhdG9yOwoJCQkJCQkJcmV1c2VfcHJldmlvdXMgPDw9IDE7CgkJCQkJCX0KCgkJCQkJCWNydGMtPmhvcnpfc3RyZXRjaGluZyB8PSAoSE9SWl9TVFJFVENIX0VOIHwKCQkJCQkJCSgoaG9yel9zdHJldGNoX2xvb3AgJiBIT1JaX1NUUkVUQ0hfTE9PUCkgPDwgMTYpIHwKCQkJCQkJCShob3J6X3N0cmV0Y2hfcmF0aW8gJiBIT1JaX1NUUkVUQ0hfUkFUSU8pKTsKCQkJCQkJYnJlYWs7ICAgICAgLyogT3V0IG9mIHRoZSBkbyB7IC4uLiB9IHdoaWxlICgwKSAqLwoJCQkJCX0KCQkJCX0KCgkJCQljcnRjLT5ob3J6X3N0cmV0Y2hpbmcgfD0gKEhPUlpfU1RSRVRDSF9NT0RFIHwgSE9SWl9TVFJFVENIX0VOIHwKCQkJCQkoKChIRGlzcGxheSAqIChIT1JaX1NUUkVUQ0hfQkxFTkQgKyAxKSkgLyBwYXItPmxjZF93aWR0aCkgJiBIT1JaX1NUUkVUQ0hfQkxFTkQpKTsKCQkJfSB3aGlsZSAoMCk7CgkJfQoKCQlpZiAodmRpc3BsYXkgPCBwYXItPmxjZF9oZWlnaHQgJiYgY3J0Yy0+bGNkX2dlbl9jbnRsICYgTENEX09OKSB7CgkJCWNydGMtPnZlcnRfc3RyZXRjaGluZyA9IChWRVJUX1NUUkVUQ0hfVVNFMCB8IFZFUlRfU1RSRVRDSF9FTiB8CgkJCQkoKCh2ZGlzcGxheSAqIChWRVJUX1NUUkVUQ0hfUkFUSU8wICsgMSkpIC8gcGFyLT5sY2RfaGVpZ2h0KSAmIFZFUlRfU1RSRVRDSF9SQVRJTzApKTsKCgkJCWlmICghTTY0X0hBUyhMVF9MQ0RfUkVHUykgJiYKCQkJICAgIHhyZXMgPD0gKE02NF9IQVMoTU9CSUxfQlVTKT8xMDI0OjgwMCkpCgkJCQljcnRjLT5leHRfdmVydF9zdHJldGNoIHw9IFZFUlRfU1RSRVRDSF9NT0RFOwoJCX0gZWxzZSB7CgkJCS8qCgkJCSAqIERvbid0IHVzZSB2ZXJ0aWNhbCBibGVuZGluZyBpZiB0aGUgbW9kZSBpcyB0b28gd2lkZSBvciBub3QKCQkJICogdmVydGljYWxseSBzdHJldGNoZWQuCgkJCSAqLwoJCQljcnRjLT52ZXJ0X3N0cmV0Y2hpbmcgPSAwOwoJCX0KCQkvKiBjb3B5IHRvIHNoYWRvdyBjcnRjICovCgkJY3J0Yy0+c2hhZG93X2hfdG90X2Rpc3AgPSBjcnRjLT5oX3RvdF9kaXNwOwoJCWNydGMtPnNoYWRvd19oX3N5bmNfc3RydF93aWQgPSBjcnRjLT5oX3N5bmNfc3RydF93aWQ7CgkJY3J0Yy0+c2hhZG93X3ZfdG90X2Rpc3AgPSBjcnRjLT52X3RvdF9kaXNwOwoJCWNydGMtPnNoYWRvd192X3N5bmNfc3RydF93aWQgPSBjcnRjLT52X3N5bmNfc3RydF93aWQ7Cgl9CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEICovCgoJaWYgKE02NF9IQVMoTUFHSUNfRklGTykpIHsKCQkvKiBGSVhNRTogZGlzcGxheSBGSUZPIGxvdyB3YXRlcm1hcmsgdmFsdWVzICovCgkJY3J0Yy0+Z2VuX2NudGwgfD0gKGF0eV9sZF9sZTMyKENSVENfR0VOX0NOVEwsIHBhcikgJiBDUlRDX0ZJRk9fTFdNKTsKCX0KCWNydGMtPmRwX3BpeF93aWR0aCA9IGRwX3BpeF93aWR0aDsKCWNydGMtPmRwX2NoYWluX21hc2sgPSBkcF9jaGFpbl9tYXNrOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eV9jcnRjX3RvX3Zhcihjb25zdCBzdHJ1Y3QgY3J0YyAqY3J0Yywgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCnsKCXUzMiB4cmVzLCB5cmVzLCBicHAsIGxlZnQsIHJpZ2h0LCB1cHBlciwgbG93ZXIsIGhzbGVuLCB2c2xlbiwgc3luYzsKCXUzMiBoX3RvdGFsLCBoX2Rpc3AsIGhfc3luY19zdHJ0LCBoX3N5bmNfZGx5LCBoX3N5bmNfd2lkLAoJICAgIGhfc3luY19wb2w7Cgl1MzIgdl90b3RhbCwgdl9kaXNwLCB2X3N5bmNfc3RydCwgdl9zeW5jX3dpZCwgdl9zeW5jX3BvbCwgY19zeW5jOwoJdTMyIHBpeF93aWR0aDsKCXUzMiBkb3VibGVfc2NhbiwgaW50ZXJsYWNlOwoKCS8qIGlucHV0ICovCgloX3RvdGFsID0gY3J0Yy0+aF90b3RfZGlzcCAmIDB4MWZmOwoJaF9kaXNwID0gKGNydGMtPmhfdG90X2Rpc3AgPj4gMTYpICYgMHhmZjsKCWhfc3luY19zdHJ0ID0gKGNydGMtPmhfc3luY19zdHJ0X3dpZCAmIDB4ZmYpIHwgKChjcnRjLT5oX3N5bmNfc3RydF93aWQgPj4gNCkgJiAweDEwMCk7CgloX3N5bmNfZGx5ID0gKGNydGMtPmhfc3luY19zdHJ0X3dpZCA+PiA4KSAmIDB4NzsKCWhfc3luY193aWQgPSAoY3J0Yy0+aF9zeW5jX3N0cnRfd2lkID4+IDE2KSAmIDB4MWY7CgloX3N5bmNfcG9sID0gKGNydGMtPmhfc3luY19zdHJ0X3dpZCA+PiAyMSkgJiAweDE7Cgl2X3RvdGFsID0gY3J0Yy0+dl90b3RfZGlzcCAmIDB4N2ZmOwoJdl9kaXNwID0gKGNydGMtPnZfdG90X2Rpc3AgPj4gMTYpICYgMHg3ZmY7Cgl2X3N5bmNfc3RydCA9IGNydGMtPnZfc3luY19zdHJ0X3dpZCAmIDB4N2ZmOwoJdl9zeW5jX3dpZCA9IChjcnRjLT52X3N5bmNfc3RydF93aWQgPj4gMTYpICYgMHgxZjsKCXZfc3luY19wb2wgPSAoY3J0Yy0+dl9zeW5jX3N0cnRfd2lkID4+IDIxKSAmIDB4MTsKCWNfc3luYyA9IGNydGMtPmdlbl9jbnRsICYgQ1JUQ19DU1lOQ19FTiA/IDEgOiAwOwoJcGl4X3dpZHRoID0gY3J0Yy0+Z2VuX2NudGwgJiBDUlRDX1BJWF9XSURUSF9NQVNLOwoJZG91YmxlX3NjYW4gPSBjcnRjLT5nZW5fY250bCAmIENSVENfREJMX1NDQU5fRU47CglpbnRlcmxhY2UgPSBjcnRjLT5nZW5fY250bCAmIENSVENfSU5URVJMQUNFX0VOOwoKCS8qIGNvbnZlcnQgKi8KCXhyZXMgPSAoaF9kaXNwICsgMSkgKiA4OwoJeXJlcyA9IHZfZGlzcCArIDE7CglsZWZ0ID0gKGhfdG90YWwgLSBoX3N5bmNfc3RydCAtIGhfc3luY193aWQpICogOCAtIGhfc3luY19kbHk7CglyaWdodCA9IChoX3N5bmNfc3RydCAtIGhfZGlzcCkgKiA4ICsgaF9zeW5jX2RseTsKCWhzbGVuID0gaF9zeW5jX3dpZCAqIDg7Cgl1cHBlciA9IHZfdG90YWwgLSB2X3N5bmNfc3RydCAtIHZfc3luY193aWQ7Cglsb3dlciA9IHZfc3luY19zdHJ0IC0gdl9kaXNwOwoJdnNsZW4gPSB2X3N5bmNfd2lkOwoJc3luYyA9IChoX3N5bmNfcG9sID8gMCA6IEZCX1NZTkNfSE9SX0hJR0hfQUNUKSB8CgkgICAgKHZfc3luY19wb2wgPyAwIDogRkJfU1lOQ19WRVJUX0hJR0hfQUNUKSB8CgkgICAgKGNfc3luYyA/IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCA6IDApOwoKCXN3aXRjaCAocGl4X3dpZHRoKSB7CiNpZiAwCgljYXNlIENSVENfUElYX1dJRFRIXzRCUFA6CgkJYnBwID0gNDsKCQl2YXItPnJlZC5vZmZzZXQgPSAwOwoJCXZhci0+cmVkLmxlbmd0aCA9IDg7CgkJdmFyLT5ncmVlbi5vZmZzZXQgPSAwOwoJCXZhci0+Z3JlZW4ubGVuZ3RoID0gODsKCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKCQl2YXItPmJsdWUubGVuZ3RoID0gODsKCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOwoJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CgkJYnJlYWs7CiNlbmRpZgoJY2FzZSBDUlRDX1BJWF9XSURUSF84QlBQOgoJCWJwcCA9IDg7CgkJdmFyLT5yZWQub2Zmc2V0ID0gMDsKCQl2YXItPnJlZC5sZW5ndGggPSA4OwoJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gMDsKCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CgkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CgkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7CgkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOwoJCWJyZWFrOwoJY2FzZSBDUlRDX1BJWF9XSURUSF8xNUJQUDoJLyogUkdCIDU1NSAqLwoJCWJwcCA9IDE2OwoJCXZhci0+cmVkLm9mZnNldCA9IDEwOwoJCXZhci0+cmVkLmxlbmd0aCA9IDU7CgkJdmFyLT5ncmVlbi5vZmZzZXQgPSA1OwoJCXZhci0+Z3JlZW4ubGVuZ3RoID0gNTsKCQl2YXItPmJsdWUub2Zmc2V0ID0gMDsKCQl2YXItPmJsdWUubGVuZ3RoID0gNTsKCQl2YXItPnRyYW5zcC5vZmZzZXQgPSAwOwoJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7CgkJYnJlYWs7CgljYXNlIENSVENfUElYX1dJRFRIXzE2QlBQOgkvKiBSR0IgNTY1ICovCgkJYnBwID0gMTY7CgkJdmFyLT5yZWQub2Zmc2V0ID0gMTE7CgkJdmFyLT5yZWQubGVuZ3RoID0gNTsKCQl2YXItPmdyZWVuLm9mZnNldCA9IDU7CgkJdmFyLT5ncmVlbi5sZW5ndGggPSA2OwoJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwoJCXZhci0+Ymx1ZS5sZW5ndGggPSA1OwoJCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7CgkJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKCQlicmVhazsKCWNhc2UgQ1JUQ19QSVhfV0lEVEhfMjRCUFA6CS8qIFJHQiA4ODggKi8KCQlicHAgPSAyNDsKCQl2YXItPnJlZC5vZmZzZXQgPSAxNjsKCQl2YXItPnJlZC5sZW5ndGggPSA4OwoJCXZhci0+Z3JlZW4ub2Zmc2V0ID0gODsKCQl2YXItPmdyZWVuLmxlbmd0aCA9IDg7CgkJdmFyLT5ibHVlLm9mZnNldCA9IDA7CgkJdmFyLT5ibHVlLmxlbmd0aCA9IDg7CgkJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKCQl2YXItPnRyYW5zcC5sZW5ndGggPSAwOwoJCWJyZWFrOwoJY2FzZSBDUlRDX1BJWF9XSURUSF8zMkJQUDoJLyogQVJHQiA4ODg4ICovCgkJYnBwID0gMzI7CgkJdmFyLT5yZWQub2Zmc2V0ID0gMTY7CgkJdmFyLT5yZWQubGVuZ3RoID0gODsKCQl2YXItPmdyZWVuLm9mZnNldCA9IDg7CgkJdmFyLT5ncmVlbi5sZW5ndGggPSA4OwoJCXZhci0+Ymx1ZS5vZmZzZXQgPSAwOwoJCXZhci0+Ymx1ZS5sZW5ndGggPSA4OwoJCXZhci0+dHJhbnNwLm9mZnNldCA9IDI0OwoJCXZhci0+dHJhbnNwLmxlbmd0aCA9IDg7CgkJYnJlYWs7CglkZWZhdWx0OgoJCVBSSU5US0UoIkludmFsaWQgcGl4ZWwgd2lkdGhcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8qIG91dHB1dCAqLwoJdmFyLT54cmVzID0geHJlczsKCXZhci0+eXJlcyA9IHlyZXM7Cgl2YXItPnhyZXNfdmlydHVhbCA9IGNydGMtPnZ4cmVzOwoJdmFyLT55cmVzX3ZpcnR1YWwgPSBjcnRjLT52eXJlczsKCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBicHA7Cgl2YXItPmxlZnRfbWFyZ2luID0gbGVmdDsKCXZhci0+cmlnaHRfbWFyZ2luID0gcmlnaHQ7Cgl2YXItPnVwcGVyX21hcmdpbiA9IHVwcGVyOwoJdmFyLT5sb3dlcl9tYXJnaW4gPSBsb3dlcjsKCXZhci0+aHN5bmNfbGVuID0gaHNsZW47Cgl2YXItPnZzeW5jX2xlbiA9IHZzbGVuOwoJdmFyLT5zeW5jID0gc3luYzsKCXZhci0+dm1vZGUgPSBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEOwoJLyogSW4gZG91YmxlIHNjYW4gbW9kZSwgdGhlIHZlcnRpY2FsIHBhcmFtZXRlcnMgYXJlIGRvdWJsZWQsIHNvIHdlIG5lZWQgdG8KCSAgIGhhbGYgdGhlbSB0byBnZXQgdGhlIHJpZ2h0IHZhbHVlcy4KCSAgIEluIGludGVybGFjZWQgbW9kZSB0aGUgdmFsdWVzIGFyZSBhbHJlYWR5IGNvcnJlY3QsIHNvIG5vIGNvcnJlY3Rpb24gaXMKCSAgIG5lY2Vzc2FyeS4KCSAqLwoJaWYgKGludGVybGFjZSkKCQl2YXItPnZtb2RlID0gRkJfVk1PREVfSU5URVJMQUNFRDsKCglpZiAoZG91YmxlX3NjYW4pIHsKCQl2YXItPnZtb2RlID0gRkJfVk1PREVfRE9VQkxFOwoJCXZhci0+eXJlcz4+PTE7CgkJdmFyLT51cHBlcl9tYXJnaW4+Pj0xOwoJCXZhci0+bG93ZXJfbWFyZ2luPj49MTsKCQl2YXItPnZzeW5jX2xlbj4+PTE7Cgl9CgoJcmV0dXJuIDA7Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCnN0YXRpYyBpbnQgYXR5ZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIgPSAmaW5mby0+dmFyOwoJdTMyIHRtcCwgcGl4Y2xvY2s7CglpbnQgZXJyOwojaWZkZWYgREVCVUcKCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBkZWJ1ZzsKCXUzMiBwaXhjbG9ja19pbl9wczsKI2VuZGlmCglpZiAocGFyLT5hc2xlZXApCgkJcmV0dXJuIDA7CgoJaWYgKChlcnIgPSBhdHlfdmFyX3RvX2NydGMoaW5mbywgdmFyLCAmcGFyLT5jcnRjKSkpCgkJcmV0dXJuIGVycjsKCglwaXhjbG9jayA9IGF0eWZiX2dldF9waXhjbG9jayh2YXIsIHBhcik7CgoJaWYgKHBpeGNsb2NrID09IDApIHsKCQlQUklOVEtFKCJJbnZhbGlkIHBpeGNsb2NrXG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0gZWxzZSB7CgkJaWYoKGVyciA9IHBhci0+cGxsX29wcy0+dmFyX3RvX3BsbChpbmZvLCBwaXhjbG9jaywgdmFyLT5iaXRzX3Blcl9waXhlbCwgJnBhci0+cGxsKSkpCgkJCXJldHVybiBlcnI7Cgl9CgoJcGFyLT5hY2NlbF9mbGFncyA9IHZhci0+YWNjZWxfZmxhZ3M7IC8qIGhhY2sgKi8KCglpZiAodmFyLT5hY2NlbF9mbGFncykgewoJCWluZm8tPmZib3BzLT5mYl9zeW5jID0gYXR5ZmJfc3luYzsKCQlpbmZvLT5mbGFncyAmPSB+RkJJTkZPX0hXQUNDRUxfRElTQUJMRUQ7Cgl9IGVsc2UgewoJCWluZm8tPmZib3BzLT5mYl9zeW5jID0gTlVMTDsKCQlpbmZvLT5mbGFncyB8PSBGQklORk9fSFdBQ0NFTF9ESVNBQkxFRDsKCX0KCglpZiAocGFyLT5ibGl0dGVyX21heV9iZV9idXN5KQoJCXdhaXRfZm9yX2lkbGUocGFyKTsKCglhdHlfc2V0X2NydGMocGFyLCAmcGFyLT5jcnRjKTsKCXBhci0+ZGFjX29wcy0+c2V0X2RhYyhpbmZvLCAmcGFyLT5wbGwsIHZhci0+Yml0c19wZXJfcGl4ZWwsIHBhci0+YWNjZWxfZmxhZ3MpOwoJcGFyLT5wbGxfb3BzLT5zZXRfcGxsKGluZm8sICZwYXItPnBsbCk7CgojaWZkZWYgREVCVUcKCWlmKHBhci0+cGxsX29wcyAmJiBwYXItPnBsbF9vcHMtPnBsbF90b192YXIpCgkJcGl4Y2xvY2tfaW5fcHMgPSBwYXItPnBsbF9vcHMtPnBsbF90b192YXIoaW5mbywgJihwYXItPnBsbCkpOwoJZWxzZQoJCXBpeGNsb2NrX2luX3BzID0gMDsKCglpZigwID09IHBpeGNsb2NrX2luX3BzKSB7CgkJUFJJTlRLRSgiQUxFUlQgb3BzLT5wbGxfdG9fdmFyIGdldCAwXG4iKTsKCQlwaXhjbG9ja19pbl9wcyA9IHBpeGNsb2NrOwoJfQoKCW1lbXNldCgmZGVidWcsIDAsIHNpemVvZihkZWJ1ZykpOwoJaWYoIWF0eV9jcnRjX3RvX3ZhcigmKHBhci0+Y3J0YyksICZkZWJ1ZykpIHsKCQl1MzIgaFN5bmMsIHZSZWZyZXNoOwoJCXUzMiBoX2Rpc3AsIGhfc3luY19zdHJ0LCBoX3N5bmNfZW5kLCBoX3RvdGFsOwoJCXUzMiB2X2Rpc3AsIHZfc3luY19zdHJ0LCB2X3N5bmNfZW5kLCB2X3RvdGFsOwoKCQloX2Rpc3AgPSBkZWJ1Zy54cmVzOwoJCWhfc3luY19zdHJ0ID0gaF9kaXNwICsgZGVidWcucmlnaHRfbWFyZ2luOwoJCWhfc3luY19lbmQgPSBoX3N5bmNfc3RydCArIGRlYnVnLmhzeW5jX2xlbjsKCQloX3RvdGFsID0gaF9zeW5jX2VuZCArIGRlYnVnLmxlZnRfbWFyZ2luOwoJCXZfZGlzcCA9IGRlYnVnLnlyZXM7CgkJdl9zeW5jX3N0cnQgPSB2X2Rpc3AgKyBkZWJ1Zy5sb3dlcl9tYXJnaW47CgkJdl9zeW5jX2VuZCA9IHZfc3luY19zdHJ0ICsgZGVidWcudnN5bmNfbGVuOwoJCXZfdG90YWwgPSB2X3N5bmNfZW5kICsgZGVidWcudXBwZXJfbWFyZ2luOwoKCQloU3luYyA9IDEwMDAwMDAwMDAgLyAocGl4Y2xvY2tfaW5fcHMgKiBoX3RvdGFsKTsKCQl2UmVmcmVzaCA9IChoU3luYyAqIDEwMDApIC8gdl90b3RhbDsKICAgICAgICAJaWYgKHBhci0+Y3J0Yy5nZW5fY250bCAmIENSVENfSU5URVJMQUNFX0VOKQogICAgICAgICAgICAJdlJlZnJlc2ggKj0gMjsKICAgICAgICAJaWYgKHBhci0+Y3J0Yy5nZW5fY250bCAmIENSVENfREJMX1NDQU5fRU4pCiAgICAgICAgICAgIAl2UmVmcmVzaCAvPSAyOwoKCQlEUFJJTlRLKCJhdHlmYl9zZXRfcGFyXG4iKTsKCQlEUFJJTlRLKCIgU2V0IFZpc2libGUgTW9kZSB0byAlaXglaS0laVxuIiwgdmFyLT54cmVzLCB2YXItPnlyZXMsIHZhci0+Yml0c19wZXJfcGl4ZWwpOwoJCURQUklOVEsoIiBWaXJ0dWFsIHJlc29sdXRpb24gJWl4JWksIHBpeGNsb2NrX2luX3BzICVpIChjYWxjdWxhdGVkICVpKVxuIiwKCQkJdmFyLT54cmVzX3ZpcnR1YWwsIHZhci0+eXJlc192aXJ0dWFsLCBwaXhjbG9jaywgcGl4Y2xvY2tfaW5fcHMpOwoJCURQUklOVEsoIiBEb3QgY2xvY2s6ICAgICAgICAgICAlaSBNSHpcbiIsIDEwMDAwMDAgLyBwaXhjbG9ja19pbl9wcyk7CgkJRFBSSU5USygiIEhvcml6b250YWwgc3luYzogICAgICVpIGtIelxuIiwgaFN5bmMpOwoJCURQUklOVEsoIiBWZXJ0aWNhbCByZWZyZXNoOiAgICAlaSBIelxuIiwgdlJlZnJlc2gpOwoJCURQUklOVEsoIiB4ICBzdHlsZTogJWkuJTAzaSAlaSAlaSAlaSAlaSAgICVpICVpICVpICVpXG4iLAoJCQkxMDAwMDAwIC8gcGl4Y2xvY2tfaW5fcHMsIDEwMDAwMDAgJSBwaXhjbG9ja19pbl9wcywKCQkJaF9kaXNwLCBoX3N5bmNfc3RydCwgaF9zeW5jX2VuZCwgaF90b3RhbCwKCQkJdl9kaXNwLCB2X3N5bmNfc3RydCwgdl9zeW5jX2VuZCwgdl90b3RhbCk7CgkJRFBSSU5USygiIGZiIHN0eWxlOiAlaSAgJWkgJWkgJWkgJWkgJWkgJWkgJWkgJWlcbiIsCgkJCXBpeGNsb2NrX2luX3BzLAoJCQlkZWJ1Zy5sZWZ0X21hcmdpbiwgaF9kaXNwLCBkZWJ1Zy5yaWdodF9tYXJnaW4sIGRlYnVnLmhzeW5jX2xlbiwKCQkJZGVidWcudXBwZXJfbWFyZ2luLCB2X2Rpc3AsIGRlYnVnLmxvd2VyX21hcmdpbiwgZGVidWcudnN5bmNfbGVuKTsKCX0KI2VuZGlmIC8qIERFQlVHICovCgoJaWYgKCFNNjRfSEFTKElOVEVHUkFURUQpKSB7CgkJLyogRG9uJ3QgZm9yZ2V0IE1FTV9DTlRMICovCgkJdG1wID0gYXR5X2xkX2xlMzIoTUVNX0NOVEwsIHBhcikgJiAweGYwZmZmZmZmOwoJCXN3aXRjaCAodmFyLT5iaXRzX3Blcl9waXhlbCkgewoJCWNhc2UgODoKCQkJdG1wIHw9IDB4MDIwMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgMTY6CgkJCXRtcCB8PSAweDAzMDAwMDAwOwoJCQlicmVhazsKCQljYXNlIDMyOgoJCQl0bXAgfD0gMHgwNjAwMDAwMDsKCQkJYnJlYWs7CgkJfQoJCWF0eV9zdF9sZTMyKE1FTV9DTlRMLCB0bXAsIHBhcik7Cgl9IGVsc2UgewoJCXRtcCA9IGF0eV9sZF9sZTMyKE1FTV9DTlRMLCBwYXIpICYgMHhmMDBmZmZmZjsKCQlpZiAoIU02NF9IQVMoTUFHSUNfUE9TVERJVikpCgkJCXRtcCB8PSBwYXItPm1lbV9yZWZyZXNoX3JhdGUgPDwgMjA7CgkJc3dpdGNoICh2YXItPmJpdHNfcGVyX3BpeGVsKSB7CgkJY2FzZSA4OgoJCWNhc2UgMjQ6CgkJCXRtcCB8PSAweDAwMDAwMDAwOwoJCQlicmVhazsKCQljYXNlIDE2OgoJCQl0bXAgfD0gMHgwNDAwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSAzMjoKCQkJdG1wIHw9IDB4MDgwMDAwMDA7CgkJCWJyZWFrOwoJCX0KCQlpZiAoTTY0X0hBUyhDVF9CVVMpKSB7CgkJCWF0eV9zdF9sZTMyKERBQ19DTlRMLCAweDg3MDEwMTg0LCBwYXIpOwoJCQlhdHlfc3RfbGUzMihCVVNfQ05UTCwgMHg2ODAwMDBmOSwgcGFyKTsKCQl9IGVsc2UgaWYgKE02NF9IQVMoVlRfQlVTKSkgewoJCQlhdHlfc3RfbGUzMihEQUNfQ05UTCwgMHg4NzAxMDE4NCwgcGFyKTsKCQkJYXR5X3N0X2xlMzIoQlVTX0NOVEwsIDB4NjgwMDAwZjksIHBhcik7CgkJfSBlbHNlIGlmIChNNjRfSEFTKE1PQklMX0JVUykpIHsKCQkJYXR5X3N0X2xlMzIoREFDX0NOVEwsIDB4ODAwMTAxMDIsIHBhcik7CgkJCWF0eV9zdF9sZTMyKEJVU19DTlRMLCAweDdiMzNhMDQwIHwgKHBhci0+YXV4X3N0YXJ0ID8gQlVTX0FQRVJfUkVHX0RJUyA6IDApLCBwYXIpOwoJCX0gZWxzZSB7CgkJCS8qIEdUICovCgkJCWF0eV9zdF9sZTMyKERBQ19DTlRMLCAweDg2MDEwMTAyLCBwYXIpOwoJCQlhdHlfc3RfbGUzMihCVVNfQ05UTCwgMHg3YjIzYTA0MCB8IChwYXItPmF1eF9zdGFydCA/IEJVU19BUEVSX1JFR19ESVMgOiAwKSwgcGFyKTsKCQkJYXR5X3N0X2xlMzIoRVhUX01FTV9DTlRMLCBhdHlfbGRfbGUzMihFWFRfTUVNX0NOVEwsIHBhcikgfCAweDUwMDAwMDEsIHBhcik7CgkJfQoJCWF0eV9zdF9sZTMyKE1FTV9DTlRMLCB0bXAsIHBhcik7Cgl9CglhdHlfc3RfOChEQUNfTUFTSywgMHhmZiwgcGFyKTsKCglpbmZvLT5maXgubGluZV9sZW5ndGggPSB2YXItPnhyZXNfdmlydHVhbCAqIHZhci0+Yml0c19wZXJfcGl4ZWwvODsKCWluZm8tPmZpeC52aXN1YWwgPSB2YXItPmJpdHNfcGVyX3BpeGVsIDw9IDggPwoJCUZCX1ZJU1VBTF9QU0VVRE9DT0xPUiA6IEZCX1ZJU1VBTF9ESVJFQ1RDT0xPUjsKCgkvKiBJbml0aWFsaXplIHRoZSBncmFwaGljcyBlbmdpbmUgKi8KCWlmIChwYXItPmFjY2VsX2ZsYWdzICYgRkJfQUNDRUxGX1RFWFQpCgkJYXR5X2luaXRfZW5naW5lKHBhciwgaW5mbyk7CgojaWZkZWYgQ09ORklHX0JPT1RYX1RFWFQKCWJ0ZXh0X3VwZGF0ZV9kaXNwbGF5KGluZm8tPmZpeC5zbWVtX3N0YXJ0LAoJCSgoKHBhci0+Y3J0Yy5oX3RvdF9kaXNwID4+IDE2KSAmIDB4ZmYpICsgMSkgKiA4LAoJCSgocGFyLT5jcnRjLnZfdG90X2Rpc3AgPj4gMTYpICYgMHg3ZmYpICsgMSwKCQl2YXItPmJpdHNfcGVyX3BpeGVsLAoJCXBhci0+Y3J0Yy52eHJlcyAqIHZhci0+Yml0c19wZXJfcGl4ZWwgLyA4KTsKI2VuZGlmIC8qIENPTkZJR19CT09UWF9URVhUICovCiNpZiAwCgkvKiBzd2l0Y2ggdG8gYWNjZWxlcmF0b3IgbW9kZSAqLwoJaWYgKCEocGFyLT5jcnRjLmdlbl9jbnRsICYgQ1JUQ19FWFRfRElTUF9FTikpCgkJYXR5X3N0X2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyLT5jcnRjLmdlbl9jbnRsIHwgQ1JUQ19FWFRfRElTUF9FTiwgcGFyKTsKI2VuZGlmCiNpZmRlZiBERUJVRwp7CgkvKiBkdW1wIG5vbiBzaGFkb3cgQ1JUQywgcGxsLCBMQ0QgcmVnaXN0ZXJzICovCglpbnQgaTsgdTMyIGJhc2U7CgoJLyogQ1JUQyByZWdpc3RlcnMgKi8KCWJhc2UgPSAweDIwMDA7CglwcmludGsoImRlYnVnIGF0eWZiOiBNYWNoNjQgbm9uLXNoYWRvdyByZWdpc3RlciB2YWx1ZXM6Iik7Cglmb3IgKGkgPSAwOyBpIDwgMjU2OyBpID0gaSs0KSB7CgkJaWYoaSUxNiA9PSAwKSBwcmludGsoIlxuZGVidWcgYXR5ZmI6IDB4JTA0WDogIiwgYmFzZSArIGkpOwoJCXByaW50aygiICUwOFgiLCBhdHlfbGRfbGUzMihpLCBwYXIpKTsKCX0KCXByaW50aygiXG5cbiIpOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKCS8qIFBMTCByZWdpc3RlcnMgKi8KCWJhc2UgPSAweDAwOwoJcHJpbnRrKCJkZWJ1ZyBhdHlmYjogTWFjaDY0IFBMTCByZWdpc3RlciB2YWx1ZXM6Iik7Cglmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgewoJCWlmKGklMTYgPT0gMCkgcHJpbnRrKCJcbmRlYnVnIGF0eWZiOiAweCUwMlg6ICIsIGJhc2UgKyBpKTsKCQlpZihpJTQgPT0gMCkgIHByaW50aygiICIpOwoJCXByaW50aygiJTAyWCIsIGF0eV9sZF9wbGxfY3QoaSwgcGFyKSk7Cgl9CglwcmludGsoIlxuXG4iKTsKI2VuZGlmCS8qIENPTkZJR19GQl9BVFlfQ1QgKi8KCiNpZmRlZiBDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENECglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCS8qIExDRCByZWdpc3RlcnMgKi8KCQliYXNlID0gMHgwMDsKCQlwcmludGsoImRlYnVnIGF0eWZiOiBMQ0QgcmVnaXN0ZXIgdmFsdWVzOiIpOwoJCWlmKE02NF9IQVMoTFRfTENEX1JFR1MpKSB7CgkJICAgIGZvcihpID0gMDsgaSA8PSBQT1dFUl9NQU5BR0VNRU5UOyBpKyspIHsKCQkJaWYoaSA9PSBFWFRfVkVSVF9TVFJFVENIKQoJCQkgICAgY29udGludWU7CgkJCXByaW50aygiXG5kZWJ1ZyBhdHlmYjogMHglMDRYOiAiLCBsdF9sY2RfcmVnc1tpXSk7CgkJCXByaW50aygiICUwOFgiLCBhdHlfbGRfbGNkKGksIHBhcikpOwoJCSAgICB9CgoJCX0gZWxzZSB7CgkJICAgIGZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CgkJCWlmKGklNCA9PSAwKSBwcmludGsoIlxuZGVidWcgYXR5ZmI6IDB4JTAyWDogIiwgYmFzZSArIGkpOwoJCQlwcmludGsoIiAlMDhYIiwgYXR5X2xkX2xjZChpLCBwYXIpKTsKCQkgICAgfQoJCX0KCQlwcmludGsoIlxuXG4iKTsKCX0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgKi8KfQojZW5kaWYgLyogREVCVUcgKi8KCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eWZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCWludCBlcnI7CglzdHJ1Y3QgY3J0YyBjcnRjOwoJdW5pb24gYXR5X3BsbCBwbGw7Cgl1MzIgcGl4Y2xvY2s7CgoJbWVtY3B5KCZwbGwsICYocGFyLT5wbGwpLCBzaXplb2YocGxsKSk7CgoJaWYoKGVyciA9IGF0eV92YXJfdG9fY3J0YyhpbmZvLCB2YXIsICZjcnRjKSkpCgkJcmV0dXJuIGVycjsKCglwaXhjbG9jayA9IGF0eWZiX2dldF9waXhjbG9jayh2YXIsIHBhcik7CgoJaWYgKHBpeGNsb2NrID09IDApIHsKCQlpZiAoISh2YXItPmFjdGl2YXRlICYgRkJfQUNUSVZBVEVfVEVTVCkpCgkJCVBSSU5US0UoIkludmFsaWQgcGl4Y2xvY2tcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfSBlbHNlIHsKCQlpZigoZXJyID0gcGFyLT5wbGxfb3BzLT52YXJfdG9fcGxsKGluZm8sIHBpeGNsb2NrLCB2YXItPmJpdHNfcGVyX3BpeGVsLCAmcGxsKSkpCgkJCXJldHVybiBlcnI7Cgl9CgoJaWYgKHZhci0+YWNjZWxfZmxhZ3MgJiBGQl9BQ0NFTEZfVEVYVCkKCQlpbmZvLT52YXIuYWNjZWxfZmxhZ3MgPSBGQl9BQ0NFTEZfVEVYVDsKCWVsc2UKCQlpbmZvLT52YXIuYWNjZWxfZmxhZ3MgPSAwOwoKI2lmIDAgLyogZmJtb24gaXMgbm90IGRvbmUuIHVuY29tbWVudCBmb3IgMi41LnggLWJyYWQgKi8KCWlmICghZmJtb25fdmFsaWRfdGltaW5ncyhwaXhjbG9jaywgaHRvdGFsLCB2dG90YWwsIGluZm8pKQoJCXJldHVybiAtRUlOVkFMOwojZW5kaWYKCWF0eV9jcnRjX3RvX3ZhcigmY3J0YywgdmFyKTsKCXZhci0+cGl4Y2xvY2sgPSBwYXItPnBsbF9vcHMtPnBsbF90b192YXIoaW5mbywgJnBsbCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgc2V0X29mZl9waXRjaChzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvKQp7Cgl1MzIgeG9mZnNldCA9IGluZm8tPnZhci54b2Zmc2V0OwoJdTMyIHlvZmZzZXQgPSBpbmZvLT52YXIueW9mZnNldDsKCXUzMiB2eHJlcyA9IHBhci0+Y3J0Yy52eHJlczsKCXUzMiBicHAgPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWw7CgoJcGFyLT5jcnRjLm9mZl9waXRjaCA9ICgoeW9mZnNldCAqIHZ4cmVzICsgeG9mZnNldCkgKiBicHAgLyA2NCkgfCAodnhyZXMgPDwgMTkpOwp9CgoKICAgIC8qCiAgICAgKiAgT3Blbi9SZWxlYXNlIHRoZSBmcmFtZSBidWZmZXIgZGV2aWNlCiAgICAgKi8KCnN0YXRpYyBpbnQgYXR5ZmJfb3BlbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCglpZiAodXNlcikgewoJCXBhci0+b3BlbisrOwojaWZkZWYgX19zcGFyY19fCgkJcGFyLT5tbWFwZWQgPSAwOwojZW5kaWYKCX0KCXJldHVybiAoMCk7Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdCBhdHlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSBkZXZfaWQ7CglpbnQgaGFuZGxlZCA9IDA7Cgl1MzIgaW50X2NudGw7CgoJc3Bpbl9sb2NrKCZwYXItPmludF9sb2NrKTsKCglpbnRfY250bCA9IGF0eV9sZF9sZTMyKENSVENfSU5UX0NOVEwsIHBhcik7CgoJaWYgKGludF9jbnRsICYgQ1JUQ19WQkxBTktfSU5UKSB7CgkJLyogY2xlYXIgaW50ZXJydXB0ICovCgkJYXR5X3N0X2xlMzIoQ1JUQ19JTlRfQ05UTCwgKGludF9jbnRsICYgQ1JUQ19JTlRfRU5fTUFTSykgfCBDUlRDX1ZCTEFOS19JTlRfQUssIHBhcik7CgkJcGFyLT52YmxhbmsuY291bnQrKzsKCQlpZiAocGFyLT52YmxhbmsucGFuX2Rpc3BsYXkpIHsKCQkJcGFyLT52YmxhbmsucGFuX2Rpc3BsYXkgPSAwOwoJCQlhdHlfc3RfbGUzMihDUlRDX09GRl9QSVRDSCwgcGFyLT5jcnRjLm9mZl9waXRjaCwgcGFyKTsKCQl9CgkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZwYXItPnZibGFuay53YWl0KTsKCQloYW5kbGVkID0gMTsKCX0KCglzcGluX3VubG9jaygmcGFyLT5pbnRfbG9jayk7CgoJcmV0dXJuIElSUV9SRVRWQUwoaGFuZGxlZCk7Cn0KCnN0YXRpYyBpbnQgYXR5X2VuYWJsZV9pcnEoc3RydWN0IGF0eWZiX3BhciAqcGFyLCBpbnQgcmVlbmFibGUpCnsKCXUzMiBpbnRfY250bDsKCglpZiAoIXRlc3RfYW5kX3NldF9iaXQoMCwgJnBhci0+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+bW1hcGVkID0gMTsKCXJldHVybiAwOwp9CgpzdGF0aWMgc3RydWN0IHsKCXUzMiB5b2Zmc2V0OwoJdTggclsyXVsyNTZdOwoJdTggZ1syXVsyNTZdOwoJdTggYlsyXVsyNTZdOwp9IGF0eWZiX3NhdmU7CgpzdGF0aWMgdm9pZCBhdHlmYl9zYXZlX3BhbGV0dGUoc3RydWN0IGF0eWZiX3BhciAqcGFyLCBpbnQgZW50ZXIpCnsKCWludCBpLCB0bXA7CgoJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CgkJdG1wID0gYXR5X2xkXzgoREFDX0NOVEwsIHBhcikgJiAweGZjOwoJCWlmIChNNjRfSEFTKEVYVFJBX0JSSUdIVCkpCgkJCXRtcCB8PSAweDI7CgkJYXR5X3N0XzgoREFDX0NOVEwsIHRtcCwgcGFyKTsKCQlhdHlfc3RfOChEQUNfTUFTSywgMHhmZiwgcGFyKTsKCgkJd3JpdGViKGksICZwYXItPmF0eV9jbWFwX3JlZ3MtPnJpbmRleCk7CgkJYXR5ZmJfc2F2ZS5yW2VudGVyXVtpXSA9IHJlYWRiKCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7CgkJYXR5ZmJfc2F2ZS5nW2VudGVyXVtpXSA9IHJlYWRiKCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7CgkJYXR5ZmJfc2F2ZS5iW2VudGVyXVtpXSA9IHJlYWRiKCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7CgkJd3JpdGViKGksICZwYXItPmF0eV9jbWFwX3JlZ3MtPndpbmRleCk7CgkJd3JpdGViKGF0eWZiX3NhdmUuclsxIC0gZW50ZXJdW2ldLAoJCSAgICAgICAmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQpOwoJCXdyaXRlYihhdHlmYl9zYXZlLmdbMSAtIGVudGVyXVtpXSwKCQkgICAgICAgJnBhci0+YXR5X2NtYXBfcmVncy0+bHV0KTsKCQl3cml0ZWIoYXR5ZmJfc2F2ZS5iWzEgLSBlbnRlcl1baV0sCgkJICAgICAgICZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7Cgl9Cn0KCnN0YXRpYyB2b2lkIGF0eWZiX3BhbGV0dGUoaW50IGVudGVyKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXI7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKCWludCBpOwoKCWZvciAoaSA9IDA7IGkgPCBGQl9NQVg7IGkrKykgewoJCWluZm8gPSByZWdpc3RlcmVkX2ZiW2ldOwoJCWlmIChpbmZvICYmIGluZm8tPmZib3BzID09ICZhdHlmYl9vcHMpIHsKCQkJcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJCQkKCQkJYXR5ZmJfc2F2ZV9wYWxldHRlKHBhciwgZW50ZXIpOwoJCQlpZiAoZW50ZXIpIHsKCQkJCWF0eWZiX3NhdmUueW9mZnNldCA9IGluZm8tPnZhci55b2Zmc2V0OwoJCQkJaW5mby0+dmFyLnlvZmZzZXQgPSAwOwoJCQkJc2V0X29mZl9waXRjaChwYXIsIGluZm8pOwoJCQl9IGVsc2UgewoJCQkJaW5mby0+dmFyLnlvZmZzZXQgPSBhdHlmYl9zYXZlLnlvZmZzZXQ7CgkJCQlzZXRfb2ZmX3BpdGNoKHBhciwgaW5mbyk7CgkJCX0KCQkJYXR5X3N0X2xlMzIoQ1JUQ19PRkZfUElUQ0gsIHBhci0+Y3J0Yy5vZmZfcGl0Y2gsIHBhcik7CgkJCWJyZWFrOwoJCX0KCX0KfQojZW5kaWYgLyogX19zcGFyY19fICovCgoKCiNpZiBkZWZpbmVkKENPTkZJR19QTSkgJiYgZGVmaW5lZChDT05GSUdfUENJKQoKLyogUG93ZXIgbWFuYWdlbWVudCByb3V0aW5lcy4gVGhvc2UgYXJlIHVzZWQgZm9yIFBvd2VyQm9vayBzbGVlcC4KICovCnN0YXRpYyBpbnQgYXR5X3Bvd2VyX21nbXQoaW50IHNsZWVwLCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKCXUzMiBwbTsKCWludCB0aW1lb3V0OwoKCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJcG0gPSAocG0gJiB+UFdSX01HVF9NT0RFX01BU0spIHwgUFdSX01HVF9NT0RFX1JFRzsKCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CglwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCgl0aW1lb3V0ID0gMjAwMDsKCWlmIChzbGVlcCkgewoJCS8qIFNsZWVwICovCgkJcG0gJj0gflBXUl9NR1RfT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQl1ZGVsYXkoMTApOwoJCXBtICY9IH4oUFdSX0JMT04gfCBBVVRPX1BXUl9VUCk7CgkJcG0gfD0gU1VTUEVORF9OT1c7CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQl1ZGVsYXkoMTApOwoJCXBtIHw9IFBXUl9NR1RfT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlkbyB7CgkJCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCQltZGVsYXkoMSk7CgkJCWlmICgoLS10aW1lb3V0KSA9PSAwKQoJCQkJYnJlYWs7CgkJfSB3aGlsZSAoKHBtICYgUFdSX01HVF9TVEFUVVNfTUFTSykgIT0gUFdSX01HVF9TVEFUVVNfU1VTUEVORCk7Cgl9IGVsc2UgewoJCS8qIFdha2V1cCAqLwoJCXBtICY9IH5QV1JfTUdUX09OOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CgkJcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJdWRlbGF5KDEwKTsKCQlwbSAmPSB+U1VTUEVORF9OT1c7CgkJcG0gfD0gKFBXUl9CTE9OIHwgQVVUT19QV1JfVVApOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CgkJcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJdWRlbGF5KDEwKTsKCQlwbSB8PSBQV1JfTUdUX09OOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CgkJZG8gewoJCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQkJbWRlbGF5KDEpOwoJCQlpZiAoKC0tdGltZW91dCkgPT0gMCkKCQkJCWJyZWFrOwoJCX0gd2hpbGUgKChwbSAmIFBXUl9NR1RfU1RBVFVTX01BU0spICE9IDApOwoJfQoJbWRlbGF5KDUwMCk7CgoJcmV0dXJuIHRpbWVvdXQgPyAwIDogLUVJTzsKfQoKc3RhdGljIGludCBhdHlmYl9wY2lfc3VzcGVuZChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCiNpZm5kZWYgQ09ORklHX1BQQ19QTUFDCgkvKiBIQUNLIEFMRVJUICEgT25jZSBJIGZpbmQgYSBwcm9wZXIgd2F5IHRvIHNheSB0byBlYWNoIGRyaXZlcgoJICogaW5kaXZpZHVhbGx5IHdoYXQgd2lsbCBoYXBwZW4gd2l0aCBpdCdzIFBDSSBzbG90LCBJJ2xsIGNoYW5nZQoJICogdGhhdC4gT24gbGFwdG9wcywgdGhlIEFHUCBzbG90IGlzIGp1c3QgdW5jbG9ja2VkLCBzbyBEMiBpcwoJICogZXhwZWN0ZWQsIHdoaWxlIG9uIGRlc2t0b3BzLCB0aGUgY2FyZCBpcyBwb3dlcmVkIG9mZgoJICovCglyZXR1cm4gMDsKI2VuZGlmIC8qIENPTkZJR19QUENfUE1BQyAqLwoKCWlmIChzdGF0ZS5ldmVudCA9PSBwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQpCgkJcmV0dXJuIDA7CgoJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwoKCWZiX3NldF9zdXNwZW5kKGluZm8sIDEpOwoKCS8qIElkbGUgJiByZXNldCBlbmdpbmUgKi8KCXdhaXRfZm9yX2lkbGUocGFyKTsKCWF0eV9yZXNldF9lbmdpbmUocGFyKTsKCgkvKiBCbGFuayBkaXNwbGF5IGFuZCBMQ0QgKi8KCWF0eWZiX2JsYW5rKEZCX0JMQU5LX1BPV0VSRE9XTiwgaW5mbyk7CgoJcGFyLT5hc2xlZXAgPSAxOwoJcGFyLT5sb2NrX2JsYW5rID0gMTsKCgkvKiBTZXQgY2hpcCB0byAic3VzcGVuZCIgbW9kZSAqLwoJaWYgKGF0eV9wb3dlcl9tZ210KDEsIHBhcikpIHsKCQlwYXItPmFzbGVlcCA9IDA7CgkJcGFyLT5sb2NrX2JsYW5rID0gMDsKCQlhdHlmYl9ibGFuayhGQl9CTEFOS19VTkJMQU5LLCBpbmZvKTsKCQlmYl9zZXRfc3VzcGVuZChpbmZvLCAwKTsKCQlyZWxlYXNlX2NvbnNvbGVfc2VtKCk7CgkJcmV0dXJuIC1FSU87Cgl9CgoJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwoKCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IHN0YXRlOwoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eWZiX3BjaV9yZXN1bWUoc3RydWN0IHBjaV9kZXYgKnBkZXYpCnsKCXN0cnVjdCBmYl9pbmZvICppbmZvID0gcGNpX2dldF9kcnZkYXRhKHBkZXYpOwoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoKCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gUE1fRVZFTlRfT04pCgkJcmV0dXJuIDA7CgoJYWNxdWlyZV9jb25zb2xlX3NlbSgpOwoKCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gMikKCQlhdHlfcG93ZXJfbWdtdCgwLCBwYXIpOwoJcGFyLT5hc2xlZXAgPSAwOwoKCS8qIFJlc3RvcmUgZGlzcGxheSAqLwoJYXR5ZmJfc2V0X3BhcihpbmZvKTsKCgkvKiBSZWZyZXNoICovCglmYl9zZXRfc3VzcGVuZChpbmZvLCAwKTsKCgkvKiBVbmJsYW5rICovCglwYXItPmxvY2tfYmxhbmsgPSAwOwoJYXR5ZmJfYmxhbmsoRkJfQkxBTktfVU5CTEFOSywgaW5mbyk7CgoJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwoKCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CgoJcmV0dXJuIDA7Cn0KCiNlbmRpZiAvKiAgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1BDSSkgKi8KCi8qIEJhY2tsaWdodCAqLwojaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKI2RlZmluZSBNQVhfTEVWRUwgMHhGRgoKc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBhdHlfYmxfZGF0YTsKCi8qIENhbGwgd2l0aCBmYl9pbmZvLT5ibF9tdXRleCBoZWxkICovCnN0YXRpYyBpbnQgYXR5X2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgaW50IGxldmVsKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOwoJaW50IGF0eWxldmVsOwoKCS8qIEdldCBhbmQgY29udmVydCB0aGUgdmFsdWUgKi8KCWF0eWxldmVsID0gaW5mby0+YmxfY3VydmVbbGV2ZWxdICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTDsKCglpZiAoYXR5bGV2ZWwgPCAwKQoJCWF0eWxldmVsID0gMDsKCWVsc2UgaWYgKGF0eWxldmVsID4gTUFYX0xFVkVMKQoJCWF0eWxldmVsID0gTUFYX0xFVkVMOwoKCXJldHVybiBhdHlsZXZlbDsKfQoKLyogQ2FsbCB3aXRoIGZiX2luZm8tPmJsX211dGV4IGhlbGQgKi8Kc3RhdGljIGludCBfX2F0eV9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gY2xhc3NfZ2V0X2RldmRhdGEoJmJkLT5jbGFzc19kZXYpOwoJdW5zaWduZWQgaW50IHJlZyA9IGF0eV9sZF9sY2QoTENEX01JU0NfQ05UTCwgcGFyKTsKCWludCBsZXZlbDsKCglpZiAoYmQtPnByb3BzLT5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CgkgICAgYmQtPnByb3BzLT5mYl9ibGFuayAhPSBGQl9CTEFOS19VTkJMQU5LKQoJCWxldmVsID0gMDsKCWVsc2UKCQlsZXZlbCA9IGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKCglyZWcgfD0gKEJMTU9EX0VOIHwgQklBU01PRF9FTik7CglpZiAobGV2ZWwgPiAwKSB7CgkJcmVnICY9IH5CSUFTX01PRF9MRVZFTF9NQVNLOwoJCXJlZyB8PSAoYXR5X2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBhciwgbGV2ZWwpIDw8IEJJQVNfTU9EX0xFVkVMX1NISUZUKTsKCX0gZWxzZSB7CgkJcmVnICY9IH5CSUFTX01PRF9MRVZFTF9NQVNLOwoJCXJlZyB8PSAoYXR5X2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBhciwgMCkgPDwgQklBU19NT0RfTEVWRUxfU0hJRlQpOwoJfQoJYXR5X3N0X2xjZChMQ0RfTUlTQ19DTlRMLCByZWcsIHBhcik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5X2JsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSBjbGFzc19nZXRfZGV2ZGF0YSgmYmQtPmNsYXNzX2Rldik7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOwoJaW50IHJldDsKCgltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CglyZXQgPSBfX2F0eV9ibF91cGRhdGVfc3RhdHVzKGJkKTsKCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgYXR5X2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKewoJcmV0dXJuIGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKfQoKc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBhdHlfYmxfZGF0YSA9IHsKCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCgkuZ2V0X2JyaWdodG5lc3MgPSBhdHlfYmxfZ2V0X2JyaWdodG5lc3MsCgkudXBkYXRlX3N0YXR1cwk9IGF0eV9ibF91cGRhdGVfc3RhdHVzLAoJLm1heF9icmlnaHRuZXNzID0gKEZCX0JBQ0tMSUdIVF9MRVZFTFMgLSAxKSwKfTsKCnN0YXRpYyB2b2lkIGF0eV9ibF9zZXRfcG93ZXIoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCBwb3dlcikKewoJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOwoKCWlmIChpbmZvLT5ibF9kZXYpIHsKCQlkb3duKCZpbmZvLT5ibF9kZXYtPnNlbSk7CgkJaW5mby0+YmxfZGV2LT5wcm9wcy0+cG93ZXIgPSBwb3dlcjsKCQlfX2F0eV9ibF91cGRhdGVfc3RhdHVzKGluZm8tPmJsX2Rldik7CgkJdXAoJmluZm8tPmJsX2Rldi0+c2VtKTsKCX0KCgltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKfQoKc3RhdGljIHZvaWQgYXR5X2JsX2luaXQoc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOwoJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOwoJY2hhciBuYW1lWzEyXTsKCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKCWlmICghcG1hY19oYXNfYmFja2xpZ2h0X3R5cGUoImF0aSIpKQoJCXJldHVybjsKI2VuZGlmCgoJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiYXR5YmwlZCIsIGluZm8tPm5vZGUpOwoKCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihuYW1lLCBwYXIsICZhdHlfYmxfZGF0YSk7CglpZiAoSVNfRVJSKGJkKSkgewoJCWluZm8tPmJsX2RldiA9IE5VTEw7CgkJcHJpbnRrKEtFUk5fV0FSTklORyAiYXR5OiBCYWNrbGlnaHQgcmVnaXN0cmF0aW9uIGZhaWxlZFxuIik7CgkJZ290byBlcnJvcjsKCX0KCgltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CglpbmZvLT5ibF9kZXYgPSBiZDsKCWZiX2JsX2RlZmF1bHRfY3VydmUoaW5mbywgMCwKCQkweDNGICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCwKCQkweEZGICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTCk7CgltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKCglkb3duKCZiZC0+c2VtKTsKCWJkLT5wcm9wcy0+YnJpZ2h0bmVzcyA9IGF0eV9ibF9kYXRhLm1heF9icmlnaHRuZXNzOwoJYmQtPnByb3BzLT5wb3dlciA9IEZCX0JMQU5LX1VOQkxBTks7CgliZC0+cHJvcHMtPnVwZGF0ZV9zdGF0dXMoYmQpOwoJdXAoJmJkLT5zZW0pOwoKI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAoJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOwoJaWYgKCFwbWFjX2JhY2tsaWdodCkKCQlwbWFjX2JhY2tsaWdodCA9IGJkOwoJbXV0ZXhfdW5sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CiNlbmRpZgoKCXByaW50aygiYXR5OiBCYWNrbGlnaHQgaW5pdGlhbGl6ZWQgKCVzKVxuIiwgbmFtZSk7CgoJcmV0dXJuOwoKZXJyb3I6CglyZXR1cm47Cn0KCnN0YXRpYyB2b2lkIGF0eV9ibF9leGl0KHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGFyLT5wZGV2KTsKCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKCW11dGV4X2xvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKI2VuZGlmCgoJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOwoJaWYgKGluZm8tPmJsX2RldikgewojaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCgkJaWYgKHBtYWNfYmFja2xpZ2h0ID09IGluZm8tPmJsX2RldikKCQkJcG1hY19iYWNrbGlnaHQgPSBOVUxMOwojZW5kaWYKCgkJYmFja2xpZ2h0X2RldmljZV91bnJlZ2lzdGVyKGluZm8tPmJsX2Rldik7CgoJCXByaW50aygiYXR5OiBCYWNrbGlnaHQgdW5sb2FkZWRcbiIpOwoJfQoJbXV0ZXhfdW5sb2NrKCZpbmZvLT5ibF9tdXRleCk7CgojaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCgltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKI2VuZGlmCn0KCiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVCAqLwoKc3RhdGljIHZvaWQgX19kZXZpbml0IGF0eV9jYWxjX21lbV9yZWZyZXNoKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgaW50IHhjbGspCnsKCWNvbnN0IGludCByYWdlcHJvX3RibFtdID0gewoJCTQ0LCA1MCwgNTUsIDY2LCA3NSwgODAsIDEwMAoJfTsKCWNvbnN0IGludCByYWdleGxfdGJsW10gPSB7CgkJNTAsIDY2LCA3NSwgODMsIDkwLCA5NSwgMTAwLCAxMDUsCgkJMTEwLCAxMTUsIDEyMCwgMTI1LCAxMzMsIDE0MywgMTY2Cgl9OwoJY29uc3QgaW50ICpyZWZyZXNoX3RibDsKCWludCBpLCBzaXplOwoKCWlmIChJU19YTChwYXItPnBjaV9pZCkgfHwgSVNfTU9CSUxJVFkocGFyLT5wY2lfaWQpKSB7CgkJcmVmcmVzaF90YmwgPSByYWdleGxfdGJsOwoJCXNpemUgPSBBUlJBWV9TSVpFKHJhZ2V4bF90YmwpOwoJfSBlbHNlIHsKCQlyZWZyZXNoX3RibCA9IHJhZ2Vwcm9fdGJsOwoJCXNpemUgPSBBUlJBWV9TSVpFKHJhZ2Vwcm9fdGJsKTsKCX0KCglmb3IgKGk9MDsgaSA8IHNpemU7IGkrKykgewoJCWlmICh4Y2xrIDwgcmVmcmVzaF90YmxbaV0pCgkJYnJlYWs7Cgl9CglwYXItPm1lbV9yZWZyZXNoX3JhdGUgPSBpOwp9CgogICAgLyoKICAgICAqICBJbml0aWFsaXNhdGlvbgogICAgICovCgpzdGF0aWMgc3RydWN0IGZiX2luZm8gKmZiX2xpc3QgPSBOVUxMOwoKI2lmIGRlZmluZWQoX19pMzg2X18pICYmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfZ2V0X3RpbWluZ3NfZnJvbV9sY2Qoc3RydWN0IGF0eWZiX3BhciAqcGFyLAoJCQkJCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcikKewoJaW50IHJldCA9IC1FSU5WQUw7CgoJaWYgKHBhci0+bGNkX3RhYmxlICE9IDAgJiYgKGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpICYgTENEX09OKSkgewoJCSp2YXIgPSBkZWZhdWx0X3ZhcjsKCQl2YXItPnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbCA9IHBhci0+bGNkX2hkaXNwOwoJCXZhci0+cmlnaHRfbWFyZ2luID0gcGFyLT5sY2RfcmlnaHRfbWFyZ2luOwoJCXZhci0+bGVmdF9tYXJnaW4gPSBwYXItPmxjZF9oYmxhbmtfbGVuIC0KCQkJKHBhci0+bGNkX3JpZ2h0X21hcmdpbiArIHBhci0+bGNkX2hzeW5jX2RseSArCgkJCSBwYXItPmxjZF9oc3luY19sZW4pOwoJCXZhci0+aHN5bmNfbGVuID0gcGFyLT5sY2RfaHN5bmNfbGVuICsgcGFyLT5sY2RfaHN5bmNfZGx5OwoJCXZhci0+eXJlcyA9IHZhci0+eXJlc192aXJ0dWFsID0gcGFyLT5sY2RfdmRpc3A7CgkJdmFyLT5sb3dlcl9tYXJnaW4gPSBwYXItPmxjZF9sb3dlcl9tYXJnaW47CgkJdmFyLT51cHBlcl9tYXJnaW4gPSBwYXItPmxjZF92YmxhbmtfbGVuIC0KCQkJKHBhci0+bGNkX2xvd2VyX21hcmdpbiArIHBhci0+bGNkX3ZzeW5jX2xlbik7CgkJdmFyLT52c3luY19sZW4gPSBwYXItPmxjZF92c3luY19sZW47CgkJdmFyLT5waXhjbG9jayA9IHBhci0+bGNkX3BpeGNsb2NrOwoJCXJldCA9IDA7Cgl9CgoJcmV0dXJuIHJldDsKfQojZW5kaWYgLyogZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKSAqLwoKc3RhdGljIGludCBfX2RldmluaXQgYXR5X2luaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKm5hbWUpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCWNvbnN0IGNoYXIgKnJhbW5hbWUgPSBOVUxMLCAqeHRhbDsKCWludCBndGJfbWVtc2l6ZSwgaGFzX3ZhciA9IDA7CglzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyOwoJdTggcGxsX3JlZl9kaXY7Cgl1MzIgaTsKI2lmIGRlZmluZWQoQ09ORklHX1BQQykKCWludCBzZW5zZTsKI2VuZGlmCgoJaW5pdF93YWl0cXVldWVfaGVhZCgmcGFyLT52Ymxhbmsud2FpdCk7CglzcGluX2xvY2tfaW5pdCgmcGFyLT5pbnRfbG9jayk7CgoJcGFyLT5hdHlfY21hcF9yZWdzID0KCSAgICAoc3RydWN0IGF0eV9jbWFwX3JlZ3MgX19pb21lbSAqKSAocGFyLT5hdGlfcmVnYmFzZSArIDB4YzApOwoKI2lmZGVmIENPTkZJR19QUENfUE1BQwoJLyogVGhlIEFwcGxlIGlCb29rMSB1c2VzIG5vbi1zdGFuZGFyZCBtZW1vcnkgZnJlcXVlbmNpZXMuIFdlIGRldGVjdCBpdAoJICogYW5kIHNldCB0aGUgZnJlcXVlbmN5IG1hbnVhbGx5LiAqLwoJaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMiwxIikpIHsKCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDcwOwoJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0gNTM7Cgl9CiNlbmRpZgoJaWYgKHBsbCkKCQlwYXItPnBsbF9saW1pdHMucGxsX21heCA9IHBsbDsKCWlmIChtY2xrKQoJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gbWNsazsKCWlmICh4Y2xrKQoJCXBhci0+cGxsX2xpbWl0cy54Y2xrID0geGNsazsKCglhdHlfY2FsY19tZW1fcmVmcmVzaChwYXIsIHBhci0+cGxsX2xpbWl0cy54Y2xrKTsKCXBhci0+cGxsX3BlciA9IDEwMDAwMDAvcGFyLT5wbGxfbGltaXRzLnBsbF9tYXg7CglwYXItPm1jbGtfcGVyID0gMTAwMDAwMC9wYXItPnBsbF9saW1pdHMubWNsazsKCXBhci0+eGNsa19wZXIgPSAxMDAwMDAwL3Bhci0+cGxsX2xpbWl0cy54Y2xrOwoKCXBhci0+cmVmX2Nsa19wZXIgPSAxMDAwMDAwMDAwMDAwVUxMIC8gMTQzMTgxODA7Cgl4dGFsID0gIjE0LjMxODE4IjsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0dYCglpZiAoIU02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQl1MzIgc3RhdDA7CgkJdTggZGFjX3R5cGUsIGRhY19zdWJ0eXBlLCBjbGtfdHlwZTsKCQlzdGF0MCA9IGF0eV9sZF9sZTMyKENPTkZJR19TVEFUMCwgcGFyKTsKCQlwYXItPmJ1c190eXBlID0gKHN0YXQwID4+IDApICYgMHgwNzsKCQlwYXItPnJhbV90eXBlID0gKHN0YXQwID4+IDMpICYgMHgwNzsKCQlyYW1uYW1lID0gYXR5X2d4X3JhbVtwYXItPnJhbV90eXBlXTsKCQkvKiBGSVhNRTogY2xvY2tjaGlwL1JBTURBQyBwcm9iaW5nPyAqLwoJCWRhY190eXBlID0gKGF0eV9sZF9sZTMyKERBQ19DTlRMLCBwYXIpID4+IDE2KSAmIDB4MDc7CiNpZmRlZiBDT05GSUdfQVRBUkkKCQljbGtfdHlwZSA9IENMS19BVEkxODgxOF8xOwoJCWRhY190eXBlID0gKHN0YXQwID4+IDkpICYgMHgwNzsKCQlpZiAoZGFjX3R5cGUgPT0gMHgwNykKCQkJZGFjX3N1YnR5cGUgPSBEQUNfQVRUMjBDNDA4OwoJCWVsc2UKCQkJZGFjX3N1YnR5cGUgPSAoYXR5X2xkXzgoU0NSQVRDSF9SRUcxICsgMSwgcGFyKSAmIDB4RjApIHwgZGFjX3R5cGU7CiNlbHNlCgkJZGFjX3R5cGUgPSBEQUNfSUJNUkdCNTE0OwoJCWRhY19zdWJ0eXBlID0gREFDX0lCTVJHQjUxNDsKCQljbGtfdHlwZSA9IENMS19JQk1SR0I1MTQ7CiNlbmRpZgoJCXN3aXRjaCAoZGFjX3N1YnR5cGUpIHsKCQljYXNlIERBQ19JQk1SR0I1MTQ6CgkJCXBhci0+ZGFjX29wcyA9ICZhdHlfZGFjX2libTUxNDsKCQkJYnJlYWs7CgkJY2FzZSBEQUNfQVRJNjg4NjBfQjoKCQljYXNlIERBQ19BVEk2ODg2MF9DOgoJCQlwYXItPmRhY19vcHMgPSAmYXR5X2RhY19hdGk2ODg2MGI7CgkJCWJyZWFrOwoJCWNhc2UgREFDX0FUVDIwQzQwODoKCQljYXNlIERBQ19BVFQyMUM0OTg6CgkJCXBhci0+ZGFjX29wcyA9ICZhdHlfZGFjX2F0dDIxYzQ5ODsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJUFJJTlRLSSgiYXR5X2luaXQ6IERBQyB0eXBlIG5vdCBpbXBsZW1lbnRlZCB5ZXQhXG4iKTsKCQkJcGFyLT5kYWNfb3BzID0gJmF0eV9kYWNfdW5zdXBwb3J0ZWQ7CgkJCWJyZWFrOwoJCX0KCQlzd2l0Y2ggKGNsa190eXBlKSB7CiNpZmRlZiBDT05GSUdfQVRBUkkKCQljYXNlIENMS19BVEkxODgxOF8xOgoJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9hdGkxODgxOF8xOwoJCQlicmVhazsKI2Vsc2UKCQljYXNlIENMS19JQk1SR0I1MTQ6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX2libTUxNDsKCQkJYnJlYWs7CiNlbmRpZgojaWYgMCAvKiBkZWFkIGNvZGUgKi8KCQljYXNlIENMS19TVEcxNzAzOgoJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9zdGcxNzAzOwoJCQlicmVhazsKCQljYXNlIENMS19DSDgzOTg6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX2NoODM5ODsKCQkJYnJlYWs7CgkJY2FzZSBDTEtfQVRUMjBDNDA4OgoJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9hdHQyMGM0MDg7CgkJCWJyZWFrOwojZW5kaWYKCQlkZWZhdWx0OgoJCQlQUklOVEtJKCJhdHlfaW5pdDogQ0xLIHR5cGUgbm90IGltcGxlbWVudGVkIHlldCEiKTsKCQkJcGFyLT5wbGxfb3BzID0gJmF0eV9wbGxfdW5zdXBwb3J0ZWQ7CgkJCWJyZWFrOwoJCX0KCX0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR1ggKi8KI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKCWlmIChNNjRfSEFTKElOVEVHUkFURUQpKSB7CgkJcGFyLT5kYWNfb3BzID0gJmF0eV9kYWNfY3Q7CgkJcGFyLT5wbGxfb3BzID0gJmF0eV9wbGxfY3Q7CgkJcGFyLT5idXNfdHlwZSA9IFBDSTsKCQlwYXItPnJhbV90eXBlID0gKGF0eV9sZF9sZTMyKENPTkZJR19TVEFUMCwgcGFyKSAmIDB4MDcpOwoJCXJhbW5hbWUgPSBhdHlfY3RfcmFtW3Bhci0+cmFtX3R5cGVdOwoJCS8qIGZvciBtYW55IGNoaXBzLCB0aGUgbWNsayBpcyA2NyBNSHogZm9yIFNEUkFNLCA2MyBNSHogb3RoZXJ3aXNlICovCgkJaWYgKHBhci0+cGxsX2xpbWl0cy5tY2xrID09IDY3ICYmIHBhci0+cmFtX3R5cGUgPCBTRFJBTSkKCQkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSA2MzsKCX0KCglpZiAoTTY0X0hBUyhHVEJfRFNQKQoJICAgICYmIChwbGxfcmVmX2RpdiA9IGF0eV9sZF9wbGxfY3QoUExMX1JFRl9ESVYsIHBhcikpKSB7CgkJaW50IGRpZmYxLCBkaWZmMjsKCQlkaWZmMSA9IDUxMCAqIDE0IC8gcGxsX3JlZl9kaXYgLSBwYXItPnBsbF9saW1pdHMucGxsX21heDsKCQlkaWZmMiA9IDUxMCAqIDI5IC8gcGxsX3JlZl9kaXYgLSBwYXItPnBsbF9saW1pdHMucGxsX21heDsKCQlpZiAoZGlmZjEgPCAwKQoJCQlkaWZmMSA9IC1kaWZmMTsKCQlpZiAoZGlmZjIgPCAwKQoJCQlkaWZmMiA9IC1kaWZmMjsKCQlpZiAoZGlmZjIgPCBkaWZmMSkgewoJCQlwYXItPnJlZl9jbGtfcGVyID0gMTAwMDAwMDAwMDAwMFVMTCAvIDI5NDk4OTI4OwoJCQl4dGFsID0gIjI5LjQ5ODkyOCI7CgkJfQoJfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9DVCAqLwoKCS8qIHNhdmUgcHJldmlvdXMgdmlkZW8gbW9kZSAqLwoJYXR5X2dldF9jcnRjKHBhciwgJnNhdmVkX2NydGMpOwoJaWYocGFyLT5wbGxfb3BzLT5nZXRfcGxsKQoJCXBhci0+cGxsX29wcy0+Z2V0X3BsbChpbmZvLCAmc2F2ZWRfcGxsKTsKCglpID0gYXR5X2xkX2xlMzIoTUVNX0NOVEwsIHBhcik7CglndGJfbWVtc2l6ZSA9IE02NF9IQVMoR1RCX0RTUCk7CglpZiAoZ3RiX21lbXNpemUpCgkJc3dpdGNoIChpICYgMHhGKSB7CS8qIDB4RiB1c2VkIGluc3RlYWQgb2YgTUVNX1NJWkVfQUxJQVMgKi8KCQljYXNlIE1FTV9TSVpFXzUxMks6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfMU06CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4MTAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzJNX0dUQjoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHgyMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfNE1fR1RCOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDQwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV82TV9HVEI6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4NjAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzhNX0dUQjoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDA7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDA7Cgl9IGVsc2UKCQlzd2l0Y2ggKGkgJiBNRU1fU0laRV9BTElBUykgewoJCWNhc2UgTUVNX1NJWkVfNTEySzoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV8xTToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHgxMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfMk06CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4MjAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzRNOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDQwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV82TToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg2MDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfOE06CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDAwOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDgwMDAwOwoJCX0KCglpZiAoTTY0X0hBUyhNQUdJQ19WUkFNX1NJWkUpKSB7CgkJaWYgKGF0eV9sZF9sZTMyKENPTkZJR19TVEFUMSwgcGFyKSAmIDB4NDAwMDAwMDApCgkJCWluZm8tPmZpeC5zbWVtX2xlbiArPSAweDQwMDAwMDsKCX0KCglpZiAodnJhbSkgewoJCWluZm8tPmZpeC5zbWVtX2xlbiA9IHZyYW0gKiAxMDI0OwoJCWkgPSBpICYgfihndGJfbWVtc2l6ZSA/IDB4RiA6IE1FTV9TSVpFX0FMSUFTKTsKCQlpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4ODAwMDApCgkJCWkgfD0gTUVNX1NJWkVfNTEySzsKCQllbHNlIGlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHgxMDAwMDApCgkJCWkgfD0gTUVNX1NJWkVfMU07CgkJZWxzZSBpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4MjAwMDAwKQoJCQlpIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfMk1fR1RCIDogTUVNX1NJWkVfMk07CgkJZWxzZSBpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4NDAwMDAwKQoJCQlpIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfNE1fR1RCIDogTUVNX1NJWkVfNE07CgkJZWxzZSBpZiAoaW5mby0+Zml4LnNtZW1fbGVuIDw9IDB4NjAwMDAwKQoJCQlpIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfNk1fR1RCIDogTUVNX1NJWkVfNk07CgkJZWxzZQoJCQlpIHw9IGd0Yl9tZW1zaXplID8gTUVNX1NJWkVfOE1fR1RCIDogTUVNX1NJWkVfOE07CgkJYXR5X3N0X2xlMzIoTUVNX0NOVEwsIGksIHBhcik7Cgl9CgoJLyoKCSAqICBSZWcgQmxvY2sgMCAoQ1QtY29tcGF0aWJsZSBibG9jaykgaXMgYXQgbW1pb19zdGFydAoJICogIFJlZyBCbG9jayAxIChtdWx0aW1lZGlhIGV4dGVuc2lvbnMpIGlzIGF0IG1taW9fc3RhcnQgLSAweDQwMAoJICovCglpZiAoTTY0X0hBUyhHWCkpIHsKCQlpbmZvLT5maXgubW1pb19sZW4gPSAweDQwMDsKCQlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9BVElfTUFDSDY0R1g7Cgl9IGVsc2UgaWYgKE02NF9IQVMoQ1QpKSB7CgkJaW5mby0+Zml4Lm1taW9fbGVuID0gMHg0MDA7CgkJaW5mby0+Zml4LmFjY2VsID0gRkJfQUNDRUxfQVRJX01BQ0g2NENUOwoJfSBlbHNlIGlmIChNNjRfSEFTKFZUKSkgewoJCWluZm8tPmZpeC5tbWlvX3N0YXJ0IC09IDB4NDAwOwoJCWluZm8tPmZpeC5tbWlvX2xlbiA9IDB4ODAwOwoJCWluZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX0FUSV9NQUNINjRWVDsKCX0gZWxzZSB7LyogR1QgKi8KCQlpbmZvLT5maXgubW1pb19zdGFydCAtPSAweDQwMDsKCQlpbmZvLT5maXgubW1pb19sZW4gPSAweDgwMDsKCQlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9BVElfTUFDSDY0R1Q7Cgl9CgoJUFJJTlRLSSgiJWQlYyAlcywgJXMgTUh6IFhUQUwsICVkIE1IeiBQTEwsICVkIE1oeiBNQ0xLLCAlZCBNSHogWENMS1xuIiwKCSAgICAgICBpbmZvLT5maXguc21lbV9sZW4gPT0gMHg4MDAwMCA/IDUxMiA6IChpbmZvLT5maXguc21lbV9sZW4gPj4gMjApLAoJICAgICAgIGluZm8tPmZpeC5zbWVtX2xlbiA9PSAweDgwMDAwID8gJ0snIDogJ00nLCByYW1uYW1lLCB4dGFsLCBwYXItPnBsbF9saW1pdHMucGxsX21heCwKCSAgICAgICBwYXItPnBsbF9saW1pdHMubWNsaywgcGFyLT5wbGxfbGltaXRzLnhjbGspOwoKI2lmIGRlZmluZWQoREVCVUcpICYmIGRlZmluZWQoQ09ORklHX0FUWV9DVCkKCWlmIChNNjRfSEFTKElOVEVHUkFURUQpKSB7CgkJaW50IGk7CgkJcHJpbnRrKCJkZWJ1ZyBhdHlmYjogQlVTX0NOVEwgREFDX0NOVEwgTUVNX0NOVEwgRVhUX01FTV9DTlRMIENSVENfR0VOX0NOVEwgIgoJCSAgICAgICAiRFNQX0NPTkZJRyBEU1BfT05fT0ZGIENMT0NLX0NOVExcbiIKCQkgICAgICAgImRlYnVnIGF0eWZiOiAlMDh4ICUwOHggJTA4eCAlMDh4ICAgICAlMDh4ICAgICAgJTA4eCAgICUwOHggICAlMDh4XG4iCgkJICAgICAgICJkZWJ1ZyBhdHlmYjogUExMIiwKCQkJYXR5X2xkX2xlMzIoQlVTX0NOVEwsIHBhciksIGF0eV9sZF9sZTMyKERBQ19DTlRMLCBwYXIpLAoJCQlhdHlfbGRfbGUzMihNRU1fQ05UTCwgcGFyKSwgYXR5X2xkX2xlMzIoRVhUX01FTV9DTlRMLCBwYXIpLAoJCQlhdHlfbGRfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXIpLCBhdHlfbGRfbGUzMihEU1BfQ09ORklHLCBwYXIpLAoJCQlhdHlfbGRfbGUzMihEU1BfT05fT0ZGLCBwYXIpLCBhdHlfbGRfbGUzMihDTE9DS19DTlRMLCBwYXIpKTsKCQlmb3IgKGkgPSAwOyBpIDwgNDA7IGkrKykKCQkJcHJpbnRrKCIgJTAyeCIsIGF0eV9sZF9wbGxfY3QoaSwgcGFyKSk7CgkJcHJpbnRrKCJcbiIpOwoJfQojZW5kaWYKCWlmKHBhci0+cGxsX29wcy0+aW5pdF9wbGwpCgkJcGFyLT5wbGxfb3BzLT5pbml0X3BsbChpbmZvLCAmcGFyLT5wbGwpOwoKCS8qCgkgKiAgTGFzdCBwYWdlIG9mIDggTUIgKDQgTUIgb24gSVNBKSBhcGVydHVyZSBpcyBNTUlPCgkgKiAgRklYTUU6IHdlIHNob3VsZCB1c2UgdGhlIGF1eGlsaWFyeSBhcGVydHVyZSBpbnN0ZWFkIHNvIHdlIGNhbiBhY2Nlc3MKCSAqICB0aGUgZnVsbCA4IE1CIG9mIHZpZGVvIFJBTSBvbiA4IE1CIGJvYXJkcwoJICovCgoJaWYgKCFwYXItPmF1eF9zdGFydCAmJgoJCShpbmZvLT5maXguc21lbV9sZW4gPT0gMHg4MDAwMDAgfHwgKHBhci0+YnVzX3R5cGUgPT0gSVNBICYmIGluZm8tPmZpeC5zbWVtX2xlbiA9PSAweDQwMDAwMCkpKQoJCWluZm8tPmZpeC5zbWVtX2xlbiAtPSBHVUlfUkVTRVJWRTsKCgkvKgoJICogIERpc2FibGUgcmVnaXN0ZXIgYWNjZXNzIHRocm91Z2ggdGhlIGxpbmVhciBhcGVydHVyZQoJICogIGlmIHRoZSBhdXhpbGlhcnkgYXBlcnR1cmUgaXMgdXNlZCBzbyB3ZSBjYW4gYWNjZXNzCgkgKiAgdGhlIGZ1bGwgOCBNQiBvZiB2aWRlbyBSQU0gb24gOCBNQiBib2FyZHMuCgkgKi8KCWlmIChwYXItPmF1eF9zdGFydCkKCQlhdHlfc3RfbGUzMihCVVNfQ05UTCwgYXR5X2xkX2xlMzIoQlVTX0NOVEwsIHBhcikgfCBCVVNfQVBFUl9SRUdfRElTLCBwYXIpOwoKI2lmZGVmIENPTkZJR19NVFJSCglwYXItPm10cnJfYXBlciA9IC0xOwoJcGFyLT5tdHJyX3JlZyA9IC0xOwoJaWYgKCFub210cnIpIHsKCQkvKiBDb3ZlciB0aGUgd2hvbGUgcmVzb3VyY2UuICovCgkJIHBhci0+bXRycl9hcGVyID0gbXRycl9hZGQocGFyLT5yZXNfc3RhcnQsIHBhci0+cmVzX3NpemUsIE1UUlJfVFlQRV9XUkNPTUIsIDEpOwoJCSBpZiAocGFyLT5tdHJyX2FwZXIgPj0gMCAmJiAhcGFyLT5hdXhfc3RhcnQpIHsKCQkJLyogTWFrZSBhIGhvbGUgZm9yIG1taW8uICovCgkJCXBhci0+bXRycl9yZWcgPSBtdHJyX2FkZChwYXItPnJlc19zdGFydCArIDB4ODAwMDAwIC0gR1VJX1JFU0VSVkUsCgkJCQlHVUlfUkVTRVJWRSwgTVRSUl9UWVBFX1VOQ0FDSEFCTEUsIDEpOwoJCQlpZiAocGFyLT5tdHJyX3JlZyA8IDApIHsKCQkJCW10cnJfZGVsKHBhci0+bXRycl9hcGVyLCAwLCAwKTsKCQkJCXBhci0+bXRycl9hcGVyID0gLTE7CgkJCX0KCQkgfQoJfQojZW5kaWYKCglpbmZvLT5mYm9wcyA9ICZhdHlmYl9vcHM7CglpbmZvLT5wc2V1ZG9fcGFsZXR0ZSA9IHBzZXVkb19wYWxldHRlOwoJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVCAgICAgICAgICAgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9JTUFHRUJMSVQgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9GSUxMUkVDVCAgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9DT1BZQVJFQSAgfAoJICAgICAgICAgICAgICBGQklORk9fSFdBQ0NFTF9ZUEFOOwoKI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAoJaWYgKE02NF9IQVMoRzNfUEJfMV8xKSAmJiBtYWNoaW5lX2lzX2NvbXBhdGlibGUoIlBvd2VyQm9vazEsMSIpKSB7CgkJLyogdGhlc2UgYml0cyBsZXQgdGhlIDEwMSBwb3dlcmJvb2sgd2FrZSB1cCBmcm9tIHNsZWVwIC0tIHBhdWx1cyAqLwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpCgkJCSAgIHwgKFVTRV9GMzJLSFogfCBUUklTVEFURV9NRU1fRU4pLCBwYXIpOwoJfSBlbHNlCiNlbmRpZgoJaWYgKE02NF9IQVMoTU9CSUxfQlVTKSkgewojaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKCQlhdHlfYmxfaW5pdCAocGFyKTsKI2VuZGlmCgl9CgoJbWVtc2V0KCZ2YXIsIDAsIHNpemVvZih2YXIpKTsKI2lmZGVmIENPTkZJR19QUEMKCWlmIChtYWNoaW5lX2lzKHBvd2VybWFjKSkgewoJCS8qCgkJICogIEZJWE1FOiBUaGUgTlZSQU0gc3R1ZmYgc2hvdWxkIGJlIHB1dCBpbiBhIE1hYy1zcGVjaWZpYyBmaWxlLCBhcyBpdAoJCSAqICAgICAgICAgYXBwbGllcyB0byBhbGwgTWFjIHZpZGVvIGNhcmRzCgkJICovCgkJaWYgKG1vZGUpIHsKCQkJaWYgKG1hY19maW5kX21vZGUoJnZhciwgaW5mbywgbW9kZSwgOCkpCgkJCQloYXNfdmFyID0gMTsKCQl9IGVsc2UgewoJCQlpZiAoZGVmYXVsdF92bW9kZSA9PSBWTU9ERV9DSE9PU0UpIHsKCQkJCWlmIChNNjRfSEFTKEczX1BCXzEwMjR4NzY4KSkKCQkJCQkvKiBHMyBQb3dlckJvb2sgd2l0aCAxMDI0eDc2OCBMQ0QgKi8KCQkJCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfMTAyNF83NjhfNjA7CgkJCQllbHNlIGlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUoImlNYWMiKSkKCQkJCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfMTAyNF83NjhfNzU7CgkJCQllbHNlIGlmIChtYWNoaW5lX2lzX2NvbXBhdGlibGUKCQkJCQkgKCJQb3dlckJvb2syLDEiKSkKCQkJCQkvKiBpQm9vayB3aXRoIDgwMHg2MDAgTENEICovCgkJCQkJZGVmYXVsdF92bW9kZSA9IFZNT0RFXzgwMF82MDBfNjA7CgkJCQllbHNlCgkJCQkJZGVmYXVsdF92bW9kZSA9IFZNT0RFXzY0MF80ODBfNjc7CgkJCQlzZW5zZSA9IHJlYWRfYXR5X3NlbnNlKHBhcik7CgkJCQlQUklOVEtJKCJtb25pdG9yIHNlbnNlPSV4LCBtb2RlICVkXG4iLAoJCQkJCXNlbnNlLCAgbWFjX21hcF9tb25pdG9yX3NlbnNlKHNlbnNlKSk7CgkJCX0KCQkJaWYgKGRlZmF1bHRfdm1vZGUgPD0gMCB8fCBkZWZhdWx0X3Ztb2RlID4gVk1PREVfTUFYKQoJCQkJZGVmYXVsdF92bW9kZSA9IFZNT0RFXzY0MF80ODBfNjA7CgkJCWlmIChkZWZhdWx0X2Ntb2RlIDwgQ01PREVfOCB8fCBkZWZhdWx0X2Ntb2RlID4gQ01PREVfMzIpCgkJCQlkZWZhdWx0X2Ntb2RlID0gQ01PREVfODsKCQkJaWYgKCFtYWNfdm1vZGVfdG9fdmFyKGRlZmF1bHRfdm1vZGUsIGRlZmF1bHRfY21vZGUsCgkJCQkJICAgICAgICZ2YXIpKQoJCQkJaGFzX3ZhciA9IDE7CgkJfQoJfQoKI2VuZGlmIC8qICFDT05GSUdfUFBDICovCgojaWYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQoJaWYgKCFhdHlmYl9nZXRfdGltaW5nc19mcm9tX2xjZChwYXIsICZ2YXIpKQoJCWhhc192YXIgPSAxOwojZW5kaWYKCglpZiAobW9kZSAmJiBmYl9maW5kX21vZGUoJnZhciwgaW5mbywgbW9kZSwgTlVMTCwgMCwgJmRlZm1vZGUsIDgpKQoJCWhhc192YXIgPSAxOwoKCWlmICghaGFzX3ZhcikKCQl2YXIgPSBkZWZhdWx0X3ZhcjsKCglpZiAobm9hY2NlbCkKCQl2YXIuYWNjZWxfZmxhZ3MgJj0gfkZCX0FDQ0VMRl9URVhUOwoJZWxzZQoJCXZhci5hY2NlbF9mbGFncyB8PSBGQl9BQ0NFTEZfVEVYVDsKCglpZiAoY29tcF9zeW5jICE9IC0xKSB7CgkJaWYgKCFjb21wX3N5bmMpCgkJCXZhci5zeW5jICY9IH5GQl9TWU5DX0NPTVBfSElHSF9BQ1Q7CgkJZWxzZQoJCQl2YXIuc3luYyB8PSBGQl9TWU5DX0NPTVBfSElHSF9BQ1Q7Cgl9CgoJaWYgKHZhci55cmVzID09IHZhci55cmVzX3ZpcnR1YWwpIHsKCQl1MzIgdmlkZW9yYW0gPSAoaW5mby0+Zml4LnNtZW1fbGVuIC0gKFBBR0VfU0laRSA8PCAyKSk7CgkJdmFyLnlyZXNfdmlydHVhbCA9ICgodmlkZW9yYW0gKiA4KSAvIHZhci5iaXRzX3Blcl9waXhlbCkgLyB2YXIueHJlc192aXJ0dWFsOwoJCWlmICh2YXIueXJlc192aXJ0dWFsIDwgdmFyLnlyZXMpCgkJCXZhci55cmVzX3ZpcnR1YWwgPSB2YXIueXJlczsKCX0KCglpZiAoYXR5ZmJfY2hlY2tfdmFyKCZ2YXIsIGluZm8pKSB7CgkJUFJJTlRLRSgiY2FuJ3Qgc2V0IGRlZmF1bHQgdmlkZW8gbW9kZVxuIik7CgkJZ290byBhdHlfaW5pdF9leGl0OwoJfQoKI2lmZGVmIF9fc3BhcmNfXwoJYXR5ZmJfc2F2ZV9wYWxldHRlKHBhciwgMCk7CiNlbmRpZgoKI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKCWlmICghbm9hY2NlbCAmJiBNNjRfSEFTKElOVEVHUkFURUQpKQoJCWF0eV9pbml0X2N1cnNvcihpbmZvKTsKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQ1QgKi8KCWluZm8tPnZhciA9IHZhcjsKCglmYl9hbGxvY19jbWFwKCZpbmZvLT5jbWFwLCAyNTYsIDApOwoKCWlmIChyZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKSA8IDApCgkJZ290byBhdHlfaW5pdF9leGl0OwoKCWZiX2xpc3QgPSBpbmZvOwoKCVBSSU5US0koImZiJWQ6ICVzIGZyYW1lIGJ1ZmZlciBkZXZpY2Ugb24gJXNcbiIsCgkgICAgICAgaW5mby0+bm9kZSwgaW5mby0+Zml4LmlkLCBuYW1lKTsKCXJldHVybiAwOwoKYXR5X2luaXRfZXhpdDoKCS8qIHJlc3RvcmUgdmlkZW8gbW9kZSAqLwoJYXR5X3NldF9jcnRjKHBhciwgJnNhdmVkX2NydGMpOwoJcGFyLT5wbGxfb3BzLT5zZXRfcGxsKGluZm8sICZzYXZlZF9wbGwpOwoKI2lmZGVmIENPTkZJR19NVFJSCglpZiAocGFyLT5tdHJyX3JlZyA+PSAwKSB7CgkgICAgbXRycl9kZWwocGFyLT5tdHJyX3JlZywgMCwgMCk7CgkgICAgcGFyLT5tdHJyX3JlZyA9IC0xOwoJfQoJaWYgKHBhci0+bXRycl9hcGVyID49IDApIHsKCSAgICBtdHJyX2RlbChwYXItPm10cnJfYXBlciwgMCwgMCk7CgkgICAgcGFyLT5tdHJyX2FwZXIgPSAtMTsKCX0KI2VuZGlmCglyZXR1cm4gLTE7Cn0KCiNpZmRlZiBDT05GSUdfQVRBUkkKc3RhdGljIGludCBfX2RldmluaXQgc3RvcmVfdmlkZW9fcGFyKGNoYXIgKnZpZGVvX3N0ciwgdW5zaWduZWQgY2hhciBtNjRfbnVtKQp7CgljaGFyICpwOwoJdW5zaWduZWQgbG9uZyB2bWVtYmFzZSwgc2l6ZSwgZ3VpcmVnYmFzZTsKCglQUklOVEtJKCJzdG9yZV92aWRlb19wYXIoKSAnJXMnIFxuIiwgdmlkZW9fc3RyKTsKCglpZiAoIShwID0gc3Ryc2VwKCZ2aWRlb19zdHIsICI7IikpIHx8ICEqcCkKCQlnb3RvIG1hY2g2NF9pbnZhbGlkOwoJdm1lbWJhc2UgPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAwKTsKCWlmICghKHAgPSBzdHJzZXAoJnZpZGVvX3N0ciwgIjsiKSkgfHwgISpwKQoJCWdvdG8gbWFjaDY0X2ludmFsaWQ7CglzaXplID0gc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMCk7CglpZiAoIShwID0gc3Ryc2VwKCZ2aWRlb19zdHIsICI7IikpIHx8ICEqcCkKCQlnb3RvIG1hY2g2NF9pbnZhbGlkOwoJZ3VpcmVnYmFzZSA9IHNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDApOwoKCXBoeXNfdm1lbWJhc2VbbTY0X251bV0gPSB2bWVtYmFzZTsKCXBoeXNfc2l6ZVttNjRfbnVtXSA9IHNpemU7CglwaHlzX2d1aXJlZ2Jhc2VbbTY0X251bV0gPSBndWlyZWdiYXNlOwoJUFJJTlRLSSgic3RvcmVkIHRoZW0gYWxsOiAkJTA4bFggJCUwOGxYICQlMDhsWCBcbiIsIHZtZW1iYXNlLCBzaXplLAoJICAgICAgIGd1aXJlZ2Jhc2UpOwoJcmV0dXJuIDA7CgogICAgICBtYWNoNjRfaW52YWxpZDoKCXBoeXNfdm1lbWJhc2VbbTY0X251bV0gPSAwOwoJcmV0dXJuIC0xOwp9CiNlbmRpZiAvKiBDT05GSUdfQVRBUkkgKi8KCiAgICAvKgogICAgICogIEJsYW5rIHRoZSBkaXNwbGF5LgogICAgICovCgpzdGF0aWMgaW50IGF0eWZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCXUzMiBnZW5fY250bDsKCglpZiAocGFyLT5sb2NrX2JsYW5rIHx8IHBhci0+YXNsZWVwKQoJCXJldHVybiAwOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUCglpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgYmxhbmsgPiBGQl9CTEFOS19OT1JNQUwpCgkJYXR5X2JsX3NldF9wb3dlcihpbmZvLCBGQl9CTEFOS19QT1dFUkRPV04pOwojZWxpZiBkZWZpbmVkKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpCglpZiAocGFyLT5sY2RfdGFibGUgJiYgYmxhbmsgPiBGQl9CTEFOS19OT1JNQUwgJiYKCSAgICAoYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcikgJiBMQ0RfT04pKSB7CgkJdTMyIHBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCXBtICY9IH5QV1JfQkxPTjsKCQlhdHlfc3RfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBtLCBwYXIpOwoJfQojZW5kaWYKCglnZW5fY250bCA9IGF0eV9sZF9sZTMyKENSVENfR0VOX0NOVEwsIHBhcik7Cglzd2l0Y2ggKGJsYW5rKSB7CiAgICAgICAgCWNhc2UgRkJfQkxBTktfVU5CTEFOSzoKCQkJZ2VuX2NudGwgJj0gfjB4NDAwMDA0YzsKCQkJYnJlYWs7CgkJY2FzZSBGQl9CTEFOS19OT1JNQUw6CgkJCWdlbl9jbnRsIHw9IDB4NDAwMDA0MDsKCQkJYnJlYWs7CgkJY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgoJCQlnZW5fY250bCB8PSAweDQwMDAwNDg7CgkJCWJyZWFrOwoJCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKCQkJZ2VuX2NudGwgfD0gMHg0MDAwMDQ0OwoJCQlicmVhazsKCQljYXNlIEZCX0JMQU5LX1BPV0VSRE9XTjoKCQkJZ2VuX2NudGwgfD0gMHg0MDAwMDRjOwoJCQlicmVhazsKCX0KCWF0eV9zdF9sZTMyKENSVENfR0VOX0NOVEwsIGdlbl9jbnRsLCBwYXIpOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUCglpZiAobWFjaGluZV9pcyhwb3dlcm1hYykgJiYgYmxhbmsgPD0gRkJfQkxBTktfTk9STUFMKQoJCWF0eV9ibF9zZXRfcG93ZXIoaW5mbywgRkJfQkxBTktfVU5CTEFOSyk7CiNlbGlmIGRlZmluZWQoQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRCkKCWlmIChwYXItPmxjZF90YWJsZSAmJiBibGFuayA8PSBGQl9CTEFOS19OT1JNQUwgJiYKCSAgICAoYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcikgJiBMQ0RfT04pKSB7CgkJdTMyIHBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCXBtIHw9IFBXUl9CTE9OOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7Cgl9CiNlbmRpZgoKCXJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBhdHlfc3RfcGFsKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAoJCSAgICAgICBjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKI2lmZGVmIENPTkZJR19BVEFSSQoJb3V0XzgoJnBhci0+YXR5X2NtYXBfcmVncy0+d2luZGV4LCByZWdubyk7CglvdXRfOCgmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQsIHJlZCk7CglvdXRfOCgmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQsIGdyZWVuKTsKCW91dF84KCZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCwgYmx1ZSk7CiNlbHNlCgl3cml0ZWIocmVnbm8sICZwYXItPmF0eV9jbWFwX3JlZ3MtPndpbmRleCk7Cgl3cml0ZWIocmVkLCAmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQpOwoJd3JpdGViKGdyZWVuLCAmcGFyLT5hdHlfY21hcF9yZWdzLT5sdXQpOwoJd3JpdGViKGJsdWUsICZwYXItPmF0eV9jbWFwX3JlZ3MtPmx1dCk7CiNlbmRpZgp9CgogICAgLyoKICAgICAqICBTZXQgYSBzaW5nbGUgY29sb3IgcmVnaXN0ZXIuIFRoZSB2YWx1ZXMgc3VwcGxpZWQgYXJlIGFscmVhZHkKICAgICAqICByb3VuZGVkIGRvd24gdG8gdGhlIGhhcmR3YXJlJ3MgY2FwYWJpbGl0aWVzIChhY2NvcmRpbmcgdG8gdGhlCiAgICAgKiAgZW50cmllcyBpbiB0aGUgdmFyIHN0cnVjdHVyZSkuIFJldHVybiAhPSAwIGZvciBpbnZhbGlkIHJlZ25vLgogICAgICogICEhIDQgJiA4ID0gIFBTRVVETywgPiA4ID0gRElSRUNUQ09MT1IKICAgICAqLwoKc3RhdGljIGludCBhdHlmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCgl1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CglpbnQgaSwgZGVwdGg7Cgl1MzIgKnBhbCA9IGluZm8tPnBzZXVkb19wYWxldHRlOwoKCWRlcHRoID0gaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsOwoJaWYgKGRlcHRoID09IDE2KQoJCWRlcHRoID0gKGluZm8tPnZhci5ncmVlbi5sZW5ndGggPT0gNSkgPyAxNSA6IDE2OwoKCWlmIChwYXItPmFzbGVlcCkKCQlyZXR1cm4gMDsKCglpZiAocmVnbm8gPiAyNTUgfHwKCSAgICAoZGVwdGggPT0gMTYgJiYgcmVnbm8gPiA2MykgfHwKCSAgICAoZGVwdGggPT0gMTUgJiYgcmVnbm8gPiAzMSkpCgkJcmV0dXJuIDE7CgoJcmVkID4+PSA4OwoJZ3JlZW4gPj49IDg7CglibHVlID4+PSA4OwoKCXBhci0+cGFsZXR0ZVtyZWdub10ucmVkID0gcmVkOwoJcGFyLT5wYWxldHRlW3JlZ25vXS5ncmVlbiA9IGdyZWVuOwoJcGFyLT5wYWxldHRlW3JlZ25vXS5ibHVlID0gYmx1ZTsKCglpZiAocmVnbm8gPCAxNikgewoJCXN3aXRjaCAoZGVwdGgpIHsKCQljYXNlIDE1OgoJCQlwYWxbcmVnbm9dID0gKHJlZ25vIDw8IDEwKSB8IChyZWdubyA8PCA1KSB8IHJlZ25vOwoJCQlicmVhazsKCQljYXNlIDE2OgoJCQlwYWxbcmVnbm9dID0gKHJlZ25vIDw8IDExKSB8IChyZWdubyA8PCA1KSB8IHJlZ25vOwoJCQlicmVhazsKCQljYXNlIDI0OgoJCQlwYWxbcmVnbm9dID0gKHJlZ25vIDw8IDE2KSB8IChyZWdubyA8PCA4KSB8IHJlZ25vOwoJCQlicmVhazsKCQljYXNlIDMyOgoJCQlpID0gKHJlZ25vIDw8IDgpIHwgcmVnbm87CgkJCXBhbFtyZWdub10gPSAoaSA8PCAxNikgfCBpOwoJCQlicmVhazsKCQl9Cgl9CgoJaSA9IGF0eV9sZF84KERBQ19DTlRMLCBwYXIpICYgMHhmYzsKCWlmIChNNjRfSEFTKEVYVFJBX0JSSUdIVCkpCgkJaSB8PSAweDI7IC8qIERBQ19DTlRMIHwgMHgyIHR1cm5zIG9mZiB0aGUgZXh0cmEgYnJpZ2h0bmVzcyBmb3IgZ3QgKi8KCWF0eV9zdF84KERBQ19DTlRMLCBpLCBwYXIpOwoJYXR5X3N0XzgoREFDX01BU0ssIDB4ZmYsIHBhcik7CgoJaWYgKE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQlpZiAoZGVwdGggPT0gMTYpIHsKCQkJaWYgKHJlZ25vIDwgMzIpCgkJCQlhdHlfc3RfcGFsKHJlZ25vIDw8IDMsIHJlZCwKCQkJCQkgICBwYXItPnBhbGV0dGVbcmVnbm88PDFdLmdyZWVuLAoJCQkJCSAgIGJsdWUsIHBhcik7CgkJCXJlZCA9IHBhci0+cGFsZXR0ZVtyZWdubz4+MV0ucmVkOwoJCQlibHVlID0gcGFyLT5wYWxldHRlW3JlZ25vPj4xXS5ibHVlOwoJCQlyZWdubyA8PD0gMjsKCQl9IGVsc2UgaWYgKGRlcHRoID09IDE1KSB7CgkJCXJlZ25vIDw8PSAzOwoJCQlmb3IoaSA9IDA7IGkgPCA4OyBpKyspIHsKCQkJICAgIGF0eV9zdF9wYWwocmVnbm8gKyBpLCByZWQsIGdyZWVuLCBibHVlLCBwYXIpOwoJCQl9CgkJfQoJfQoJYXR5X3N0X3BhbChyZWdubywgcmVkLCBncmVlbiwgYmx1ZSwgcGFyKTsKCglyZXR1cm4gMDsKfQoKI2lmZGVmIENPTkZJR19QQ0kKCiNpZmRlZiBfX3NwYXJjX18KCmV4dGVybiB2b2lkICgqcHJvbV9wYWxldHRlKSAoaW50KTsKCnN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX3NldHVwX3NwYXJjKHN0cnVjdCBwY2lfZGV2ICpwZGV2LAoJCQlzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgdW5zaWduZWQgbG9uZyBhZGRyKQp7CglleHRlcm4gaW50IGNvbl9pc19wcmVzZW50KHZvaWQpOwoKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKCXN0cnVjdCBwY2lkZXZfY29va2llICpwY3A7CgljaGFyIHByb3BbMTI4XTsKCWludCBub2RlLCBsZW4sIGksIGosIHJldDsKCXUzMiBtZW0sIGNoaXBfaWQ7CgoJLyogRG8gbm90IGF0dGFjaCB3aGVuIHdlIGhhdmUgYSBzZXJpYWwgY29uc29sZS4gKi8KCWlmICghY29uX2lzX3ByZXNlbnQoKSkKCQlyZXR1cm4gLUVOWElPOwoKCS8qCgkgKiBNYXAgbWVtb3J5LW1hcHBlZCByZWdpc3RlcnMuCgkgKi8KCXBhci0+YXRpX3JlZ2Jhc2UgPSAodm9pZCAqKWFkZHIgKyAweDdmZmMwMFVMOwoJaW5mby0+Zml4Lm1taW9fc3RhcnQgPSBhZGRyICsgMHg3ZmZjMDBVTDsKCgkvKgoJICogTWFwIGluIGJpZy1lbmRpYW4gYXBlcnR1cmUuCgkgKi8KCWluZm8tPnNjcmVlbl9iYXNlID0gKGNoYXIgKikgKGFkZHIgKyAweDgwMDAwMFVMKTsKCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gYWRkciArIDB4ODAwMDAwVUw7CgoJLyoKCSAqIEZpZ3VyZSBtbWFwIGFkZHJlc3NlcyBmcm9tIFBDSSBjb25maWcgc3BhY2UuCgkgKiBTcGxpdCBGcmFtZWJ1ZmZlciBpbiBiaWctIGFuZCBsaXR0bGUtZW5kaWFuIGhhbGZzLgoJICovCglmb3IgKGkgPSAwOyBpIDwgNiAmJiBwZGV2LT5yZXNvdXJjZVtpXS5zdGFydDsgaSsrKQoJCS8qIG5vdGhpbmcgKi8gOwoJaiA9IGkgKyA0OwoKCXBhci0+bW1hcF9tYXAgPSBrbWFsbG9jKGogKiBzaXplb2YoKnBhci0+bW1hcF9tYXApLCBHRlBfQVRPTUlDKTsKCWlmICghcGFyLT5tbWFwX21hcCkgewoJCVBSSU5US0UoImF0eWZiX3NldHVwX3NwYXJjKCkgY2FuJ3QgYWxsb2MgbW1hcF9tYXBcbiIpOwoJCXJldHVybiAtRU5PTUVNOwoJfQoJbWVtc2V0KHBhci0+bW1hcF9tYXAsIDAsIGogKiBzaXplb2YoKnBhci0+bW1hcF9tYXApKTsKCglmb3IgKGkgPSAwLCBqID0gMjsgaSA8IDYgJiYgcGRldi0+cmVzb3VyY2VbaV0uc3RhcnQ7IGkrKykgewoJCXN0cnVjdCByZXNvdXJjZSAqcnAgPSAmcGRldi0+cmVzb3VyY2VbaV07CgkJaW50IGlvLCBicmVnID0gUENJX0JBU0VfQUREUkVTU18wICsgKGkgPDwgMik7CgkJdW5zaWduZWQgbG9uZyBiYXNlOwoJCXUzMiBzaXplLCBwYmFzZTsKCgkJYmFzZSA9IHJwLT5zdGFydDsKCgkJaW8gPSAocnAtPmZsYWdzICYgSU9SRVNPVVJDRV9JTyk7CgoJCXNpemUgPSBycC0+ZW5kIC0gYmFzZSArIDE7CgoJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChwZGV2LCBicmVnLCAmcGJhc2UpOwoKCQlpZiAoaW8pCgkJCXNpemUgJj0gfjE7CgoJCS8qCgkJICogTWFwIHRoZSBmcmFtZWJ1ZmZlciBhIHNlY29uZCB0aW1lLCB0aGlzIHRpbWUgd2l0aG91dAoJCSAqIHRoZSBicmFpbmRlYWQgX1BBR0VfSUUgc2V0dGluZy4gVGhpcyBpcyB1c2VkIGJ5IHRoZQoJCSAqIGZpeGVkIFhzZXJ2ZXIsIGJ1dCB3ZSBuZWVkIHRvIG1haW50YWluIHRoZSBvbGQgbWFwcGluZwoJCSAqIHRvIHN0YXkgY29tcGF0aWJsZSB3aXRoIG9sZGVyIG9uZXMuLi4KCQkgKi8KCQlpZiAoYmFzZSA9PSBhZGRyKSB7CgkJCXBhci0+bW1hcF9tYXBbal0udm9mZiA9IChwYmFzZSArIDB4MTAwMDAwMDApICYgUEFHRV9NQVNLOwoJCQlwYXItPm1tYXBfbWFwW2pdLnBvZmYgPSBiYXNlICYgUEFHRV9NQVNLOwoJCQlwYXItPm1tYXBfbWFwW2pdLnNpemUgPSAoc2l6ZSArIH5QQUdFX01BU0spICYgUEFHRV9NQVNLOwoJCQlwYXItPm1tYXBfbWFwW2pdLnByb3RfbWFzayA9IF9QQUdFX0NBQ0hFOwoJCQlwYXItPm1tYXBfbWFwW2pdLnByb3RfZmxhZyA9IF9QQUdFX0U7CgkJCWorKzsKCQl9CgoJCS8qCgkJICogSGVyZSBjb21lcyB0aGUgb2xkIGZyYW1lYnVmZmVyIG1hcHBpbmcgd2l0aCBfUEFHRV9JRQoJCSAqIHNldCBmb3IgdGhlIGJpZyBlbmRpYW4gaGFsZiBvZiB0aGUgZnJhbWVidWZmZXIuLi4KCQkgKi8KCQlpZiAoYmFzZSA9PSBhZGRyKSB7CgkJCXBhci0+bW1hcF9tYXBbal0udm9mZiA9IChwYmFzZSArIDB4ODAwMDAwKSAmIFBBR0VfTUFTSzsKCQkJcGFyLT5tbWFwX21hcFtqXS5wb2ZmID0gKGJhc2UgKyAweDgwMDAwMCkgJiBQQUdFX01BU0s7CgkJCXBhci0+bW1hcF9tYXBbal0uc2l6ZSA9IDB4ODAwMDAwOwoJCQlwYXItPm1tYXBfbWFwW2pdLnByb3RfbWFzayA9IF9QQUdFX0NBQ0hFOwoJCQlwYXItPm1tYXBfbWFwW2pdLnByb3RfZmxhZyA9IF9QQUdFX0UgfCBfUEFHRV9JRTsKCQkJc2l6ZSAtPSAweDgwMDAwMDsKCQkJaisrOwoJCX0KCgkJcGFyLT5tbWFwX21hcFtqXS52b2ZmID0gcGJhc2UgJiBQQUdFX01BU0s7CgkJcGFyLT5tbWFwX21hcFtqXS5wb2ZmID0gYmFzZSAmIFBBR0VfTUFTSzsKCQlwYXItPm1tYXBfbWFwW2pdLnNpemUgPSAoc2l6ZSArIH5QQUdFX01BU0spICYgUEFHRV9NQVNLOwoJCXBhci0+bW1hcF9tYXBbal0ucHJvdF9tYXNrID0gX1BBR0VfQ0FDSEU7CgkJcGFyLT5tbWFwX21hcFtqXS5wcm90X2ZsYWcgPSBfUEFHRV9FOwoJCWorKzsKCX0KCglpZigocmV0ID0gY29ycmVjdF9jaGlwc2V0KHBhcikpKQoJCXJldHVybiByZXQ7CgoJaWYgKElTX1hMKHBkZXYtPmRldmljZSkpIHsKCQkvKgoJCSAqIEZpeCBQUk9NcyBpZGVhIG9mIE1FTV9DTlRMIHNldHRpbmdzLi4uCgkJICovCgkJbWVtID0gYXR5X2xkX2xlMzIoTUVNX0NOVEwsIHBhcik7CgkJY2hpcF9pZCA9IGF0eV9sZF9sZTMyKENPTkZJR19DSElQX0lELCBwYXIpOwoJCWlmICgoKGNoaXBfaWQgJiBDRkdfQ0hJUF9UWVBFKSA9PSBWVF9DSElQX0lEKSAmJiAhKChjaGlwX2lkID4+IDI0KSAmIDEpKSB7CgkJCXN3aXRjaCAobWVtICYgMHgwZikgewoJCQljYXNlIDM6CgkJCQltZW0gPSAobWVtICYgfigweDBmKSkgfCAyOwoJCQkJYnJlYWs7CgkJCWNhc2UgNzoKCQkJCW1lbSA9IChtZW0gJiB+KDB4MGYpKSB8IDM7CgkJCQlicmVhazsKCQkJY2FzZSA5OgoJCQkJbWVtID0gKG1lbSAmIH4oMHgwZikpIHwgNDsKCQkJCWJyZWFrOwoJCQljYXNlIDExOgoJCQkJbWVtID0gKG1lbSAmIH4oMHgwZikpIHwgNTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJYnJlYWs7CgkJCX0KCQkJaWYgKChhdHlfbGRfbGUzMihDT05GSUdfU1RBVDAsIHBhcikgJiA3KSA+PSBTRFJBTSkKCQkJCW1lbSAmPSB+KDB4MDA3MDAwMDApOwoJCX0KCQltZW0gJj0gfigweGNmODBlMDAwKTsJLyogVHVybiBvZmYgYWxsIHVuZG9jdW1lbnRlZCBiaXRzLiAqLwoJCWF0eV9zdF9sZTMyKE1FTV9DTlRMLCBtZW0sIHBhcik7Cgl9CgoJLyoKCSAqIElmIHRoaXMgaXMgdGhlIGNvbnNvbGUgZGV2aWNlLCB3ZSB3aWxsIHNldCBkZWZhdWx0IHZpZGVvCgkgKiBzZXR0aW5ncyB0byB3aGF0IHRoZSBQUk9NIGxlZnQgdXMgd2l0aC4KCSAqLwoJbm9kZSA9IHByb21fZ2V0Y2hpbGQocHJvbV9yb290X25vZGUpOwoJbm9kZSA9IHByb21fc2VhcmNoc2libGluZ3Mobm9kZSwgImFsaWFzZXMiKTsKCWlmIChub2RlKSB7CgkJbGVuID0gcHJvbV9nZXRwcm9wZXJ0eShub2RlLCAic2NyZWVuIiwgcHJvcCwgc2l6ZW9mKHByb3ApKTsKCQlpZiAobGVuID4gMCkgewoJCQlwcm9wW2xlbl0gPSAnXDAnOwoJCQlub2RlID0gcHJvbV9maW5kZGV2aWNlKHByb3ApOwoJCX0gZWxzZQoJCQlub2RlID0gMDsKCX0KCglwY3AgPSBwZGV2LT5zeXNkYXRhOwoJaWYgKG5vZGUgPT0gcGNwLT5wcm9tX25vZGUtPm5vZGUpIHsKCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciA9ICZkZWZhdWx0X3ZhcjsKCQl1bnNpZ25lZCBpbnQgTiwgUCwgUSwgTSwgVCwgUjsKCQl1MzIgdl90b3RhbCwgaF90b3RhbDsKCQlzdHJ1Y3QgY3J0YyBjcnRjOwoJCXU4IHBsbF9yZWdzWzE2XTsKCQl1OCBjbG9ja19jbnRsOwoKCQljcnRjLnZ4cmVzID0gcHJvbV9nZXRpbnRkZWZhdWx0KG5vZGUsICJ3aWR0aCIsIDEwMjQpOwoJCWNydGMudnlyZXMgPSBwcm9tX2dldGludGRlZmF1bHQobm9kZSwgImhlaWdodCIsIDc2OCk7CgkJdmFyLT5iaXRzX3Blcl9waXhlbCA9IHByb21fZ2V0aW50ZGVmYXVsdChub2RlLCAiZGVwdGgiLCA4KTsKCQl2YXItPnhvZmZzZXQgPSB2YXItPnlvZmZzZXQgPSAwOwoJCWNydGMuaF90b3RfZGlzcCA9IGF0eV9sZF9sZTMyKENSVENfSF9UT1RBTF9ESVNQLCBwYXIpOwoJCWNydGMuaF9zeW5jX3N0cnRfd2lkID0gYXR5X2xkX2xlMzIoQ1JUQ19IX1NZTkNfU1RSVF9XSUQsIHBhcik7CgkJY3J0Yy52X3RvdF9kaXNwID0gYXR5X2xkX2xlMzIoQ1JUQ19WX1RPVEFMX0RJU1AsIHBhcik7CgkJY3J0Yy52X3N5bmNfc3RydF93aWQgPSBhdHlfbGRfbGUzMihDUlRDX1ZfU1lOQ19TVFJUX1dJRCwgcGFyKTsKCQljcnRjLmdlbl9jbnRsID0gYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKTsKCQlhdHlfY3J0Y190b192YXIoJmNydGMsIHZhcik7CgoJCWhfdG90YWwgPSB2YXItPnhyZXMgKyB2YXItPnJpZ2h0X21hcmdpbiArIHZhci0+aHN5bmNfbGVuICsgdmFyLT5sZWZ0X21hcmdpbjsKCQl2X3RvdGFsID0gdmFyLT55cmVzICsgdmFyLT5sb3dlcl9tYXJnaW4gKyB2YXItPnZzeW5jX2xlbiArIHZhci0+dXBwZXJfbWFyZ2luOwoKCQkvKgoJCSAqIFJlYWQgdGhlIFBMTCB0byBmaWd1cmUgYWN0dWFsIFJlZnJlc2ggUmF0ZS4KCQkgKi8KCQljbG9ja19jbnRsID0gYXR5X2xkXzgoQ0xPQ0tfQ05UTCwgcGFyKTsKCQkvKiBEUFJJTlRLKCJDTE9DS19DTlRMICUwMnhcbiIsIGNsb2NrX2NudGwpOyAqLwoJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKQoJCQlwbGxfcmVnc1tpXSA9IGF0eV9sZF9wbGxfY3QoaSwgcGFyKTsKCgkJLyoKCQkgKiBQTEwgUmVmZXJlbmNlIERpdmlkZXIgTToKCQkgKi8KCQlNID0gcGxsX3JlZ3NbMl07CgoJCS8qCgkJICogUExMIEZlZWRiYWNrIERpdmlkZXIgTiAoRGVwZW5kYW50IG9uIENMT0NLX0NOVEwpOgoJCSAqLwoJCU4gPSBwbGxfcmVnc1s3ICsgKGNsb2NrX2NudGwgJiAzKV07CgoJCS8qCgkJICogUExMIFBvc3QgRGl2aWRlciBQIChEZXBlbmRhbnQgb24gQ0xPQ0tfQ05UTCk6CgkJICovCgkJUCA9IDEgPDwgKHBsbF9yZWdzWzZdID4+ICgoY2xvY2tfY250bCAmIDMpIDw8IDEpKTsKCgkJLyoKCQkgKiBQTEwgRGl2aWRlciBROgoJCSAqLwoJCVEgPSBOIC8gUDsKCgkJLyoKCQkgKiBUYXJnZXQgRnJlcXVlbmN5OgoJCSAqCgkJICogICAgICBUICogTQoJCSAqIFEgPSAtLS0tLS0tCgkJICogICAgICAyICogUgoJCSAqCgkJICogd2hlcmUgUiBpcyBYVEFMSU4gKD0gMTQzMTggb3IgMjk0OTgga0h6KS4KCQkgKi8KCQlpZiAoSVNfWEwocGRldi0+ZGV2aWNlKSkKCQkJUiA9IDI5NDk4OwoJCWVsc2UKCQkJUiA9IDE0MzE4OwoKCQlUID0gMiAqIFEgKiBSIC8gTTsKCgkJZGVmYXVsdF92YXIucGl4Y2xvY2sgPSAxMDAwMDAwMDAwIC8gVDsKCX0KCglyZXR1cm4gMDsKfQoKI2Vsc2UgLyogX19zcGFyY19fICovCgojaWZkZWYgX19pMzg2X18KI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKc3RhdGljIHZvaWQgYXR5X2luaXRfbGNkKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgdTMyIGJpb3NfYmFzZSkKewoJdTMyIGRyaXZfaW5mX3RhYiwgc2lnOwoJdTE2IGxjZF9vZnM7CgoJLyogVG8gc3VwcG9ydCBhbiBMQ0QgcGFuZWwsIHdlIHNob3VsZCBrbm93IGl0J3MgZGltZW5zaW9ucyBhbmQKCSAqICBpdCdzIGRlc2lyZWQgcGl4ZWwgY2xvY2suCgkgKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gZG8gaXQ6CgkgKiAgLSBDaGVjayB0aGUgc3RhcnR1cCB2aWRlbyBtb2RlIGFuZCBjYWxjdWxhdGUgdGhlIHBhbmVsCgkgKiAgICBzaXplIGZyb20gaXQuIFRoaXMgaXMgdW5yZWxpYWJsZS4KCSAqICAtIFJlYWQgaXQgZnJvbSB0aGUgZHJpdmVyIGluZm9ybWF0aW9uIHRhYmxlIGluIHRoZSB2aWRlbyBCSU9TLgoJKi8KCS8qIEFkZHJlc3Mgb2YgZHJpdmVyIGluZm9ybWF0aW9uIHRhYmxlIGlzIGF0IG9mZnNldCAweDc4LiAqLwoJZHJpdl9pbmZfdGFiID0gYmlvc19iYXNlICsgKigodTE2ICopKGJpb3NfYmFzZSsweDc4KSk7CgoJLyogQ2hlY2sgZm9yIHRoZSBkcml2ZXIgaW5mb3JtYXRpb24gdGFibGUgc2lnbmF0dXJlLiAqLwoJc2lnID0gKCoodTMyICopZHJpdl9pbmZfdGFiKTsKCWlmICgoc2lnID09IDB4NTQ1MDRjMjQpIHx8IC8qIFJhZ2UgTFQgcHJvICovCgkJKHNpZyA9PSAweDU0NGQ1MjI0KSB8fCAvKiBSYWdlIG1vYmlsaXR5ICovCgkJKHNpZyA9PSAweDU0NDM1ODI0KSB8fCAvKiBSYWdlIFhDICovCgkJKHNpZyA9PSAweDU0NGM1ODI0KSkgeyAvKiBSYWdlIFhMICovCgkJUFJJTlRLSSgiQklPUyBjb250YWlucyBkcml2ZXIgaW5mb3JtYXRpb24gdGFibGUuXG4iKTsKCQlsY2Rfb2ZzID0gKCoodTE2ICopKGRyaXZfaW5mX3RhYiArIDEwKSk7CgkJcGFyLT5sY2RfdGFibGUgPSAwOwoJCWlmIChsY2Rfb2ZzICE9IDApIHsKCQkJcGFyLT5sY2RfdGFibGUgPSBiaW9zX2Jhc2UgKyBsY2Rfb2ZzOwoJCX0KCX0KCglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCWNoYXIgbW9kZWxbMjRdOwoJCWNoYXIgc3RyYnVmWzE2XTsKCQljaGFyIHJlZnJlc2hfcmF0ZXNfYnVmWzEwMF07CgkJaW50IGlkLCB0ZWNoLCBmLCBpLCBtLCBkZWZhdWx0X3JlZnJlc2hfcmF0ZTsKCQljaGFyICp0eHRjb2xvdXI7CgkJY2hhciAqdHh0bW9uaXRvcjsKCQljaGFyICp0eHRkdWFsOwoJCWNoYXIgKnR4dGZvcm1hdDsKCQl1MTYgd2lkdGgsIGhlaWdodCwgcGFuZWxfdHlwZSwgcmVmcmVzaF9yYXRlczsKCQl1MTYgKmxjZG1vZGVwdHI7CgkJdTMyIGZvcm1hdDsKCQl1OCBsY2RfcmVmcmVzaF9yYXRlc1sxNl0gPSB7NTAsNTYsNjAsNjcsNzAsNzIsNzUsNzYsODUsOTAsMTAwLDEyMCwxNDAsMTUwLDE2MCwyMDB9OwoJCS8qIFRoZSBtb3N0IGltcG9ydGFudCBpbmZvcm1hdGlvbiBpcyB0aGUgcGFuZWwgc2l6ZSBhdAoJCSAqIG9mZnNldCAyNSBhbmQgMjcsIGJ1dCB0aGVyZSdzIHNvbWUgb3RoZXIgbmljZSBpbmZvcm1hdGlvbgoJCSAqIHdoaWNoIHdlIHByaW50IHRvIHRoZSBzY3JlZW4uCgkJICovCgkJaWQgPSAqKHU4ICopcGFyLT5sY2RfdGFibGU7CgkJc3RybmNweShtb2RlbCwoY2hhciAqKXBhci0+bGNkX3RhYmxlKzEsMjQpOwoJCW1vZGVsWzIzXT0wOwoKCQl3aWR0aCA9IHBhci0+bGNkX3dpZHRoID0gKih1MTYgKikocGFyLT5sY2RfdGFibGUrMjUpOwoJCWhlaWdodCA9IHBhci0+bGNkX2hlaWdodCA9ICoodTE2ICopKHBhci0+bGNkX3RhYmxlKzI3KTsKCQlwYW5lbF90eXBlID0gKih1MTYgKikocGFyLT5sY2RfdGFibGUrMjkpOwoJCWlmIChwYW5lbF90eXBlICYgMSkKCQkJdHh0Y29sb3VyID0gImNvbG91ciI7CgkJZWxzZQoJCQl0eHRjb2xvdXIgPSAibW9ub2Nocm9tZSI7CgkJaWYgKHBhbmVsX3R5cGUgJiAyKQoJCQl0eHRkdWFsID0gImR1YWwgKHNwbGl0KSAiOwoJCWVsc2UKCQkJdHh0ZHVhbCA9ICIiOwoJCXRlY2ggPSAocGFuZWxfdHlwZT4+MikgJiA2MzsKCQlzd2l0Y2ggKHRlY2gpIHsKCQljYXNlIDA6CgkJCXR4dG1vbml0b3IgPSAicGFzc2l2ZSBtYXRyaXgiOwoJCQlicmVhazsKCQljYXNlIDE6CgkJCXR4dG1vbml0b3IgPSAiYWN0aXZlIG1hdHJpeCI7CgkJCWJyZWFrOwoJCWNhc2UgMjoKCQkJdHh0bW9uaXRvciA9ICJhY3RpdmUgYWRkcmVzc2VkIFNUTiI7CgkJCWJyZWFrOwoJCWNhc2UgMzoKCQkJdHh0bW9uaXRvciA9ICJFTCI7CgkJCWJyZWFrOwoJCWNhc2UgNDoKCQkJdHh0bW9uaXRvciA9ICJwbGFzbWEiOwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQl0eHRtb25pdG9yID0gInVua25vd24iOwoJCX0KCQlmb3JtYXQgPSAqKHUzMiAqKShwYXItPmxjZF90YWJsZSs1Nyk7CgkJaWYgKHRlY2ggPT0gMCB8fCB0ZWNoID09IDIpIHsKCQkJc3dpdGNoIChmb3JtYXQgJiA3KSB7CgkJCWNhc2UgMDoKCQkJCXR4dGZvcm1hdCA9ICIxMiBiaXQgaW50ZXJmYWNlIjsKCQkJCWJyZWFrOwoJCQljYXNlIDE6CgkJCQl0eHRmb3JtYXQgPSAiMTYgYml0IGludGVyZmFjZSI7CgkJCQlicmVhazsKCQkJY2FzZSAyOgoJCQkJdHh0Zm9ybWF0ID0gIjI0IGJpdCBpbnRlcmZhY2UiOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQl0eHRmb3JtYXQgPSAidW5rb3duIGZvcm1hdCI7CgkJCX0KCQl9IGVsc2UgewoJCQlzd2l0Y2ggKGZvcm1hdCAmIDcpIHsKCQkJY2FzZSAwOgoJCQkJdHh0Zm9ybWF0ID0gIjggY29sb3VycyI7CgkJCQlicmVhazsKCQkJY2FzZSAxOgoJCQkJdHh0Zm9ybWF0ID0gIjUxMiBjb2xvdXJzIjsKCQkJCWJyZWFrOwoJCQljYXNlIDI6CgkJCQl0eHRmb3JtYXQgPSAiNDA5NiBjb2xvdXJzIjsKCQkJCWJyZWFrOwoJCQljYXNlIDQ6CgkJCQl0eHRmb3JtYXQgPSAiMjYyMTQ0IGNvbG91cnMgKExUIG1vZGUpIjsKCQkJCWJyZWFrOwoJCQljYXNlIDU6CgkJCQl0eHRmb3JtYXQgPSAiMTY3NzcyMTYgY29sb3VycyI7CgkJCQlicmVhazsKCQkJY2FzZSA2OgoJCQkJdHh0Zm9ybWF0ID0gIjI2MjE0NCBjb2xvdXJzIChGRFBJLTIgbW9kZSkiOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQl0eHRmb3JtYXQgPSAidW5rb3duIGZvcm1hdCI7CgkJCX0KCQl9CgkJUFJJTlRLSSgiJXMlcyAlcyBtb25pdG9yIGRldGVjdGVkOiAlc1xuIiwKCQkJdHh0ZHVhbCAsdHh0Y29sb3VyLCB0eHRtb25pdG9yLCBtb2RlbCk7CgkJUFJJTlRLSSgiICAgICAgIGlkPSVkLCAlZHglZCBwaXhlbHMsICVzXG4iLAoJCQlpZCwgd2lkdGgsIGhlaWdodCwgdHh0Zm9ybWF0KTsKCQlyZWZyZXNoX3JhdGVzX2J1ZlswXSA9IDA7CgkJcmVmcmVzaF9yYXRlcyA9ICoodTE2ICopKHBhci0+bGNkX3RhYmxlKzYyKTsKCQltID0gMTsKCQlmID0gMDsKCQlmb3IgKGk9MDtpPDE2O2krKykgewoJCQlpZiAocmVmcmVzaF9yYXRlcyAmIG0pIHsKCQkJCWlmIChmID09IDApIHsKCQkJCQlzcHJpbnRmKHN0cmJ1ZiwgIiVkIiwgbGNkX3JlZnJlc2hfcmF0ZXNbaV0pOwoJCQkJCWYrKzsKCQkJCX0gZWxzZSB7CgkJCQkJc3ByaW50ZihzdHJidWYsICIsJWQiLCBsY2RfcmVmcmVzaF9yYXRlc1tpXSk7CgkJCQl9CgkJCQlzdHJjYXQocmVmcmVzaF9yYXRlc19idWYsc3RyYnVmKTsKCQkJfQoJCQltID0gbSA8PCAxOwoJCX0KCQlkZWZhdWx0X3JlZnJlc2hfcmF0ZSA9ICgqKHU4ICopKHBhci0+bGNkX3RhYmxlKzYxKSAmIDB4ZjApID4+IDQ7CgkJUFJJTlRLSSgiICAgICAgIHN1cHBvcnRzIHJlZnJlc2ggcmF0ZXMgWyVzXSwgZGVmYXVsdCAlZCBIelxuIiwKCQkJcmVmcmVzaF9yYXRlc19idWYsIGxjZF9yZWZyZXNoX3JhdGVzW2RlZmF1bHRfcmVmcmVzaF9yYXRlXSk7CgkJcGFyLT5sY2RfcmVmcmVzaHJhdGUgPSBsY2RfcmVmcmVzaF9yYXRlc1tkZWZhdWx0X3JlZnJlc2hfcmF0ZV07CgkJLyogV2Ugbm93IG5lZWQgdG8gZGV0ZXJtaW5lIHRoZSBjcnRjIHBhcmFtZXRlcnMgZm9yIHRoZQoJCSAqIExDRCBtb25pdG9yLiBUaGlzIGlzIHRyaWNreSwgYmVjYXVzZSB0aGV5IGFyZSBub3Qgc3RvcmVkCgkJICogaW5kaXZpZHVhbGx5IGluIHRoZSBCSU9TLiBJbnN0ZWFkLCB0aGUgQklPUyBjb250YWlucyBhCgkJICogdGFibGUgb2YgZGlzcGxheSBtb2RlcyB0aGF0IHdvcmsgZm9yIHRoaXMgbW9uaXRvci4KCQkgKgoJCSAqIFRoZSBpZGVhIGlzIHRoYXQgd2Ugc2VhcmNoIGZvciBhIG1vZGUgb2YgdGhlIHNhbWUgZGltZW5zaW9ucwoJCSAqIGFzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBMQ0QgbW9uaXRvci4gU2F5IG91ciBMQ0QgbW9uaXRvcgoJCSAqIGlzIDgwMHg2MDAgcGl4ZWxzLCB3ZSBzZWFyY2ggZm9yIGEgODAweDYwMCBtb25pdG9yLgoJCSAqIFRoZSBDUlRDIHBhcmFtZXRlcnMgd2UgZmluZCBoZXJlIGFyZSB0aGUgb25lcyB0aGF0IHdlIG5lZWQKCQkgKiB0byB1c2UgdG8gc2ltdWxhdGUgb3RoZXIgcmVzb2x1dGlvbnMgb24gdGhlIExDRCBzY3JlZW4uCgkJICovCgkJbGNkbW9kZXB0ciA9ICh1MTYgKikocGFyLT5sY2RfdGFibGUgKyA2NCk7CgkJd2hpbGUgKCpsY2Rtb2RlcHRyICE9IDApIHsKCQkJdTMyIG1vZGVwdHI7CgkJCXUxNiBtd2lkdGgsIG1oZWlnaHQsIGxjZF9oc3luY19zdGFydCwgbGNkX3ZzeW5jX3N0YXJ0OwoJCQltb2RlcHRyID0gYmlvc19iYXNlICsgKmxjZG1vZGVwdHI7CgoJCQltd2lkdGggPSAqKCh1MTYgKikobW9kZXB0ciswKSk7CgkJCW1oZWlnaHQgPSAqKCh1MTYgKikobW9kZXB0cisyKSk7CgoJCQlpZiAobXdpZHRoID09IHdpZHRoICYmIG1oZWlnaHQgPT0gaGVpZ2h0KSB7CgkJCQlwYXItPmxjZF9waXhjbG9jayA9IDEwMDAwMDAwMCAvICooKHUxNiAqKShtb2RlcHRyKzkpKTsKCQkJCXBhci0+bGNkX2h0b3RhbCA9ICooKHUxNiAqKShtb2RlcHRyKzE3KSkgJiA1MTE7CgkJCQlwYXItPmxjZF9oZGlzcCA9ICooKHUxNiAqKShtb2RlcHRyKzE5KSkgJiA1MTE7CgkJCQlsY2RfaHN5bmNfc3RhcnQgPSAqKCh1MTYgKikobW9kZXB0cisyMSkpICYgNTExOwoJCQkJcGFyLT5sY2RfaHN5bmNfZGx5ID0gKCooKHUxNiAqKShtb2RlcHRyKzIxKSkgPj4gOSkgJiA3OwoJCQkJcGFyLT5sY2RfaHN5bmNfbGVuID0gKigodTggKikobW9kZXB0cisyMykpICYgNjM7CgoJCQkJcGFyLT5sY2RfdnRvdGFsID0gKigodTE2ICopKG1vZGVwdHIrMjQpKSAmIDIwNDc7CgkJCQlwYXItPmxjZF92ZGlzcCA9ICooKHUxNiAqKShtb2RlcHRyKzI2KSkgJiAyMDQ3OwoJCQkJbGNkX3ZzeW5jX3N0YXJ0ID0gKigodTE2ICopKG1vZGVwdHIrMjgpKSAmIDIwNDc7CgkJCQlwYXItPmxjZF92c3luY19sZW4gPSAoKigodTE2ICopKG1vZGVwdHIrMjgpKSA+PiAxMSkgJiAzMTsKCgkJCQlwYXItPmxjZF9odG90YWwgPSAocGFyLT5sY2RfaHRvdGFsICsgMSkgKiA4OwoJCQkJcGFyLT5sY2RfaGRpc3AgPSAocGFyLT5sY2RfaGRpc3AgKyAxKSAqIDg7CgkJCQlsY2RfaHN5bmNfc3RhcnQgPSAobGNkX2hzeW5jX3N0YXJ0ICsgMSkgKiA4OwoJCQkJcGFyLT5sY2RfaHN5bmNfbGVuID0gcGFyLT5sY2RfaHN5bmNfbGVuICogODsKCgkJCQlwYXItPmxjZF92dG90YWwrKzsKCQkJCXBhci0+bGNkX3ZkaXNwKys7CgkJCQlsY2RfdnN5bmNfc3RhcnQrKzsKCgkJCQlwYXItPmxjZF9yaWdodF9tYXJnaW4gPSBsY2RfaHN5bmNfc3RhcnQgLSBwYXItPmxjZF9oZGlzcDsKCQkJCXBhci0+bGNkX2xvd2VyX21hcmdpbiA9IGxjZF92c3luY19zdGFydCAtIHBhci0+bGNkX3ZkaXNwOwoJCQkJcGFyLT5sY2RfaGJsYW5rX2xlbiA9IHBhci0+bGNkX2h0b3RhbCAtIHBhci0+bGNkX2hkaXNwOwoJCQkJcGFyLT5sY2RfdmJsYW5rX2xlbiA9IHBhci0+bGNkX3Z0b3RhbCAtIHBhci0+bGNkX3ZkaXNwOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWxjZG1vZGVwdHIrKzsKCQl9CgkJaWYgKCpsY2Rtb2RlcHRyID09IDApIHsKCQkJUFJJTlRLRSgiTENEIG1vbml0b3IgQ1JUQyBwYXJhbWV0ZXJzIG5vdCBmb3VuZCEhIVxuIik7CgkJCS8qIFRvIGRvOiBTd2l0Y2ggdG8gQ1JUIGlmIHBvc3NpYmxlLiAqLwoJCX0gZWxzZSB7CgkJCVBSSU5US0koIiAgICAgICBMQ0QgQ1JUQyBwYXJhbWV0ZXJzOiAlZC4lZCAgJWQgJWQgJWQgJWQgICVkICVkICVkICVkXG4iLAoJCQkJMTAwMDAwMCAvIHBhci0+bGNkX3BpeGNsb2NrLCAxMDAwMDAwICUgcGFyLT5sY2RfcGl4Y2xvY2ssCgkJCQlwYXItPmxjZF9oZGlzcCwKCQkJCXBhci0+bGNkX2hkaXNwICsgcGFyLT5sY2RfcmlnaHRfbWFyZ2luLAoJCQkJcGFyLT5sY2RfaGRpc3AgKyBwYXItPmxjZF9yaWdodF9tYXJnaW4KCQkJCQkrIHBhci0+bGNkX2hzeW5jX2RseSArIHBhci0+bGNkX2hzeW5jX2xlbiwKCQkJCXBhci0+bGNkX2h0b3RhbCwKCQkJCXBhci0+bGNkX3ZkaXNwLAoJCQkJcGFyLT5sY2RfdmRpc3AgKyBwYXItPmxjZF9sb3dlcl9tYXJnaW4sCgkJCQlwYXItPmxjZF92ZGlzcCArIHBhci0+bGNkX2xvd2VyX21hcmdpbiArIHBhci0+bGNkX3ZzeW5jX2xlbiwKCQkJCXBhci0+bGNkX3Z0b3RhbCk7CgkJCVBSSU5US0koIiAgICAgICAgICAgICAgICAgICAgICAgICAgOiAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZCAlZFxuIiwKCQkJCXBhci0+bGNkX3BpeGNsb2NrLAoJCQkJcGFyLT5sY2RfaGJsYW5rX2xlbiAtIChwYXItPmxjZF9yaWdodF9tYXJnaW4gKwoJCQkJCXBhci0+bGNkX2hzeW5jX2RseSArIHBhci0+bGNkX2hzeW5jX2xlbiksCgkJCQlwYXItPmxjZF9oZGlzcCwKCQkJCXBhci0+bGNkX3JpZ2h0X21hcmdpbiwKCQkJCXBhci0+bGNkX2hzeW5jX2xlbiwKCQkJCXBhci0+bGNkX3ZibGFua19sZW4gLSAocGFyLT5sY2RfbG93ZXJfbWFyZ2luICsgcGFyLT5sY2RfdnN5bmNfbGVuKSwKCQkJCXBhci0+bGNkX3ZkaXNwLAoJCQkJcGFyLT5sY2RfbG93ZXJfbWFyZ2luLAoJCQkJcGFyLT5sY2RfdnN5bmNfbGVuKTsKCQl9Cgl9Cn0KI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QgKi8KCnN0YXRpYyBpbnQgX19kZXZpbml0IGluaXRfZnJvbV9iaW9zKHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJdTMyIGJpb3NfYmFzZSwgcm9tX2FkZHI7CglpbnQgcmV0OwoKCXJvbV9hZGRyID0gMHhjMDAwMCArICgoYXR5X2xkX2xlMzIoU0NSQVRDSF9SRUcxLCBwYXIpICYgMHg3ZikgPDwgMTEpOwoJYmlvc19iYXNlID0gKHVuc2lnbmVkIGxvbmcpaW9yZW1hcChyb21fYWRkciwgMHgxMDAwMCk7CgoJLyogVGhlIEJJT1Mgc3RhcnRzIHdpdGggMHhhYTU1LiAqLwoJaWYgKCooKHUxNiAqKWJpb3NfYmFzZSkgPT0gMHhhYTU1KSB7CgoJCXU4ICpiaW9zX3B0cjsKCQl1MTYgcm9tX3RhYmxlX29mZnNldCwgZnJlcV90YWJsZV9vZmZzZXQ7CgkJUExMX0JMT0NLX01BQ0g2NCBwbGxfYmxvY2s7CgoJCVBSSU5US0koIk1hY2g2NCBCSU9TIGlzIGxvY2F0ZWQgYXQgJXgsIG1hcHBlZCBhdCAleC5cbiIsIHJvbV9hZGRyLCBiaW9zX2Jhc2UpOwoKCQkvKiBjaGVjayBmb3IgZnJlcXVuY3kgdGFibGUgKi8KCQliaW9zX3B0ciA9ICh1OCopYmlvc19iYXNlOwoJCXJvbV90YWJsZV9vZmZzZXQgPSAodTE2KShiaW9zX3B0clsweDQ4XSB8IChiaW9zX3B0clsweDQ5XSA8PCA4KSk7CgkJZnJlcV90YWJsZV9vZmZzZXQgPSBiaW9zX3B0cltyb21fdGFibGVfb2Zmc2V0ICsgMTZdIHwgKGJpb3NfcHRyW3JvbV90YWJsZV9vZmZzZXQgKyAxN10gPDwgOCk7CgkJbWVtY3B5KCZwbGxfYmxvY2ssIGJpb3NfcHRyICsgZnJlcV90YWJsZV9vZmZzZXQsIHNpemVvZihQTExfQkxPQ0tfTUFDSDY0KSk7CgoJCVBSSU5US0koIkJJT1MgZnJlcXVlbmN5IHRhYmxlOlxuIik7CgkJUFJJTlRLSSgiUENMS19taW5fZnJlcSAlZCwgUENMS19tYXhfZnJlcSAlZCwgcmVmX2ZyZXEgJWQsIHJlZl9kaXZpZGVyICVkXG4iLAoJCQlwbGxfYmxvY2suUENMS19taW5fZnJlcSwgcGxsX2Jsb2NrLlBDTEtfbWF4X2ZyZXEsCgkJCXBsbF9ibG9jay5yZWZfZnJlcSwgcGxsX2Jsb2NrLnJlZl9kaXZpZGVyKTsKCQlQUklOVEtJKCJNQ0xLX3B3ZCAlZCwgTUNMS19tYXhfZnJlcSAlZCwgWENMS19tYXhfZnJlcSAlZCwgU0NMS19mcmVxICVkXG4iLAoJCQlwbGxfYmxvY2suTUNMS19wd2QsIHBsbF9ibG9jay5NQ0xLX21heF9mcmVxLAoJCQlwbGxfYmxvY2suWENMS19tYXhfZnJlcSwgcGxsX2Jsb2NrLlNDTEtfZnJlcSk7CgoJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWluID0gcGxsX2Jsb2NrLlBDTEtfbWluX2ZyZXEvMTAwOwoJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gcGxsX2Jsb2NrLlBDTEtfbWF4X2ZyZXEvMTAwOwoJCXBhci0+cGxsX2xpbWl0cy5yZWZfY2xrID0gcGxsX2Jsb2NrLnJlZl9mcmVxLzEwMDsKCQlwYXItPnBsbF9saW1pdHMucmVmX2RpdiA9IHBsbF9ibG9jay5yZWZfZGl2aWRlcjsKCQlwYXItPnBsbF9saW1pdHMuc2NsayA9IHBsbF9ibG9jay5TQ0xLX2ZyZXEvMTAwOwoJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gcGxsX2Jsb2NrLk1DTEtfbWF4X2ZyZXEvMTAwOwoJCXBhci0+cGxsX2xpbWl0cy5tY2xrX3BtID0gcGxsX2Jsb2NrLk1DTEtfcHdkLzEwMDsKCQlwYXItPnBsbF9saW1pdHMueGNsayA9IHBsbF9ibG9jay5YQ0xLX21heF9mcmVxLzEwMDsKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKCQlhdHlfaW5pdF9sY2QocGFyLCBiaW9zX2Jhc2UpOwojZW5kaWYKCQlyZXQgPSAwOwoJfSBlbHNlIHsKCQlQUklOVEtFKCJubyBCSU9TIGZyZXF1ZW5jeSB0YWJsZSBmb3VuZCwgdXNlIHBhcmFtZXRlcnNcbiIpOwoJCXJldCA9IC1FTlhJTzsKCX0KCWlvdW5tYXAoKHZvaWQqIF9faW9tZW0gKWJpb3NfYmFzZSk7CgoJcmV0dXJuIHJldDsKfQojZW5kaWYgLyogX19pMzg2X18gKi8KCnN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX3NldHVwX2dlbmVyaWMoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIGFkZHIpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKCXUxNiB0bXA7Cgl1bnNpZ25lZCBsb25nIHJhZGRyOwoJc3RydWN0IHJlc291cmNlICpycnA7CglpbnQgcmV0ID0gMDsKCglyYWRkciA9IGFkZHIgKyAweDdmZjAwMFVMOwoJcnJwID0gJnBkZXYtPnJlc291cmNlWzJdOwoJaWYgKChycnAtPmZsYWdzICYgSU9SRVNPVVJDRV9NRU0pICYmIHJlcXVlc3RfbWVtX3JlZ2lvbihycnAtPnN0YXJ0LCBycnAtPmVuZCAtIHJycC0+c3RhcnQgKyAxLCAiYXR5ZmIiKSkgewoJCXBhci0+YXV4X3N0YXJ0ID0gcnJwLT5zdGFydDsKCQlwYXItPmF1eF9zaXplID0gcnJwLT5lbmQgLSBycnAtPnN0YXJ0ICsgMTsKCQlyYWRkciA9IHJycC0+c3RhcnQ7CgkJUFJJTlRLSSgidXNpbmcgYXV4aWxpYXJ5IHJlZ2lzdGVyIGFwZXJ0dXJlXG4iKTsKCX0KCglpbmZvLT5maXgubW1pb19zdGFydCA9IHJhZGRyOwoJcGFyLT5hdGlfcmVnYmFzZSA9IGlvcmVtYXAoaW5mby0+Zml4Lm1taW9fc3RhcnQsIDB4MTAwMCk7CglpZiAocGFyLT5hdGlfcmVnYmFzZSA9PSAwKQoJCXJldHVybiAtRU5PTUVNOwoKCWluZm8tPmZpeC5tbWlvX3N0YXJ0ICs9IHBhci0+YXV4X3N0YXJ0ID8gMHg0MDAgOiAweGMwMDsKCXBhci0+YXRpX3JlZ2Jhc2UgKz0gcGFyLT5hdXhfc3RhcnQgPyAweDQwMCA6IDB4YzAwOwoKCS8qCgkgKiBFbmFibGUgbWVtb3J5LXNwYWNlIGFjY2Vzc2VzIHVzaW5nIGNvbmZpZy1zcGFjZQoJICogY29tbWFuZCByZWdpc3Rlci4KCSAqLwoJcGNpX3JlYWRfY29uZmlnX3dvcmQocGRldiwgUENJX0NPTU1BTkQsICZ0bXApOwoJaWYgKCEodG1wICYgUENJX0NPTU1BTkRfTUVNT1JZKSkgewoJCXRtcCB8PSBQQ0lfQ09NTUFORF9NRU1PUlk7CgkJcGNpX3dyaXRlX2NvbmZpZ193b3JkKHBkZXYsIFBDSV9DT01NQU5ELCB0bXApOwoJfQojaWZkZWYgX19CSUdfRU5ESUFOCgkvKiBVc2UgdGhlIGJpZy1lbmRpYW4gYXBlcnR1cmUgKi8KCWFkZHIgKz0gMHg4MDAwMDA7CiNlbmRpZgoKCS8qIE1hcCBpbiBmcmFtZSBidWZmZXIgKi8KCWluZm8tPmZpeC5zbWVtX3N0YXJ0ID0gYWRkcjsKCWluZm8tPnNjcmVlbl9iYXNlID0gaW9yZW1hcChhZGRyLCAweDgwMDAwMCk7CglpZiAoaW5mby0+c2NyZWVuX2Jhc2UgPT0gTlVMTCkgewoJCXJldCA9IC1FTk9NRU07CgkJZ290byBhdHlmYl9zZXR1cF9nZW5lcmljX2ZhaWw7Cgl9CgoJaWYoKHJldCA9IGNvcnJlY3RfY2hpcHNldChwYXIpKSkKCQlnb3RvIGF0eWZiX3NldHVwX2dlbmVyaWNfZmFpbDsKI2lmZGVmIF9faTM4Nl9fCglpZigocmV0ID0gaW5pdF9mcm9tX2Jpb3MocGFyKSkpCgkJZ290byBhdHlmYl9zZXR1cF9nZW5lcmljX2ZhaWw7CiNlbmRpZgoJaWYgKCEoYXR5X2xkX2xlMzIoQ1JUQ19HRU5fQ05UTCwgcGFyKSAmIENSVENfRVhUX0RJU1BfRU4pKQoJCXBhci0+Y2xrX3dyX29mZnNldCA9IChpbmIoUl9HRU5NTykgJiAweDBDVSkgPj4gMjsKCWVsc2UKCQlwYXItPmNsa193cl9vZmZzZXQgPSBhdHlfbGRfOChDTE9DS19DTlRMLCBwYXIpICYgMHgwM1U7CgoJLyogYWNjb3JkaW5nIHRvIEFUSSwgd2Ugc2hvdWxkIHVzZSBjbG9jayAzIGZvciBhY2VsZXJhdGVkIG1vZGUgKi8KCXBhci0+Y2xrX3dyX29mZnNldCA9IDM7CgoJcmV0dXJuIDA7CgphdHlmYl9zZXR1cF9nZW5lcmljX2ZhaWw6Cglpb3VubWFwKHBhci0+YXRpX3JlZ2Jhc2UpOwoJcGFyLT5hdGlfcmVnYmFzZSA9IE5VTEw7CglyZXR1cm4gcmV0Owp9CgojZW5kaWYgLyogIV9fc3BhcmNfXyAqLwoKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQp7Cgl1bnNpZ25lZCBsb25nIGFkZHIsIHJlc19zdGFydCwgcmVzX3NpemU7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKCXN0cnVjdCByZXNvdXJjZSAqcnA7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXI7CglpbnQgaSwgcmMgPSAtRU5PTUVNOwoKCWZvciAoaSA9IEFSUkFZX1NJWkUoYXR5X2NoaXBzKSAtIDE7IGkgPj0gMDsgaS0tKQoJCWlmIChwZGV2LT5kZXZpY2UgPT0gYXR5X2NoaXBzW2ldLnBjaV9pZCkKCQkJYnJlYWs7CgoJaWYgKGkgPCAwKQoJCXJldHVybiAtRU5PREVWOwoKCS8qIEVuYWJsZSBkZXZpY2UgaW4gUENJIGNvbmZpZyAqLwoJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CgkJUFJJTlRLRSgiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKCQlyZXR1cm4gLUVOWElPOwoJfQoKCS8qIEZpbmQgd2hpY2ggcmVzb3VyY2UgdG8gdXNlICovCglycCA9ICZwZGV2LT5yZXNvdXJjZVswXTsKCWlmIChycC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQoJCXJwID0gJnBkZXYtPnJlc291cmNlWzFdOwoJYWRkciA9IHJwLT5zdGFydDsKCWlmICghYWRkcikKCQlyZXR1cm4gLUVOWElPOwoKCS8qIFJlc2VydmUgc3BhY2UgKi8KCXJlc19zdGFydCA9IHJwLT5zdGFydDsKCXJlc19zaXplID0gcnAtPmVuZCAtIHJwLT5zdGFydCArIDE7CglpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbiAocmVzX3N0YXJ0LCByZXNfc2l6ZSwgImF0eWZiIikpCgkJcmV0dXJuIC1FQlVTWTsKCiAgICAgICAgLyogQWxsb2NhdGUgZnJhbWVidWZmZXIgKi8KCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGF0eWZiX3BhciksICZwZGV2LT5kZXYpOwoJaWYgKCFpbmZvKSB7CgkJUFJJTlRLRSgiYXR5ZmJfcGNpX3Byb2JlKCkgY2FuJ3QgYWxsb2MgZmJfaW5mb1xuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CglwYXIgPSBpbmZvLT5wYXI7CglpbmZvLT5maXggPSBhdHlmYl9maXg7CglpbmZvLT5kZXZpY2UgPSAmcGRldi0+ZGV2OwoJcGFyLT5wY2lfaWQgPSBhdHlfY2hpcHNbaV0ucGNpX2lkOwoJcGFyLT5yZXNfc3RhcnQgPSByZXNfc3RhcnQ7CglwYXItPnJlc19zaXplID0gcmVzX3NpemU7CglwYXItPmlycSA9IHBkZXYtPmlycTsKCXBhci0+cGRldiA9IHBkZXY7CgoJLyogU2V0dXAgImluZm8iIHN0cnVjdHVyZSAqLwojaWZkZWYgX19zcGFyY19fCglyYyA9IGF0eWZiX3NldHVwX3NwYXJjKHBkZXYsIGluZm8sIGFkZHIpOwojZWxzZQoJcmMgPSBhdHlmYl9zZXR1cF9nZW5lcmljKHBkZXYsIGluZm8sIGFkZHIpOwojZW5kaWYKCWlmIChyYykKCQlnb3RvIGVycl9yZWxlYXNlX21lbTsKCglwY2lfc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CgoJLyogSW5pdCBjaGlwICYgcmVnaXN0ZXIgZnJhbWVidWZmZXIgKi8KCWlmIChhdHlfaW5pdChpbmZvLCAiUENJIikpCgkJZ290byBlcnJfcmVsZWFzZV9pbzsKCiNpZmRlZiBfX3NwYXJjX18KCWlmICghcHJvbV9wYWxldHRlKQoJCXByb21fcGFsZXR0ZSA9IGF0eWZiX3BhbGV0dGU7CgoJLyoKCSAqIEFkZCAvZGV2L2ZiIG1tYXAgdmFsdWVzLgoJICovCglwYXItPm1tYXBfbWFwWzBdLnZvZmYgPSAweDgwMDAwMDAwMDAwMDAwMDBVTDsKCXBhci0+bW1hcF9tYXBbMF0ucG9mZiA9ICh1bnNpZ25lZCBsb25nKSBpbmZvLT5zY3JlZW5fYmFzZSAmIFBBR0VfTUFTSzsKCXBhci0+bW1hcF9tYXBbMF0uc2l6ZSA9IGluZm8tPmZpeC5zbWVtX2xlbjsKCXBhci0+bW1hcF9tYXBbMF0ucHJvdF9tYXNrID0gX1BBR0VfQ0FDSEU7CglwYXItPm1tYXBfbWFwWzBdLnByb3RfZmxhZyA9IF9QQUdFX0U7CglwYXItPm1tYXBfbWFwWzFdLnZvZmYgPSBwYXItPm1tYXBfbWFwWzBdLnZvZmYgKyBpbmZvLT5maXguc21lbV9sZW47CglwYXItPm1tYXBfbWFwWzFdLnBvZmYgPSAobG9uZylwYXItPmF0aV9yZWdiYXNlICYgUEFHRV9NQVNLOwoJcGFyLT5tbWFwX21hcFsxXS5zaXplID0gUEFHRV9TSVpFOwoJcGFyLT5tbWFwX21hcFsxXS5wcm90X21hc2sgPSBfUEFHRV9DQUNIRTsKCXBhci0+bW1hcF9tYXBbMV0ucHJvdF9mbGFnID0gX1BBR0VfRTsKI2VuZGlmIC8qIF9fc3BhcmNfXyAqLwoKCXJldHVybiAwOwoKZXJyX3JlbGVhc2VfaW86CiNpZmRlZiBfX3NwYXJjX18KCWtmcmVlKHBhci0+bW1hcF9tYXApOwojZWxzZQoJaWYgKHBhci0+YXRpX3JlZ2Jhc2UpCgkJaW91bm1hcChwYXItPmF0aV9yZWdiYXNlKTsKCWlmIChpbmZvLT5zY3JlZW5fYmFzZSkKCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKI2VuZGlmCmVycl9yZWxlYXNlX21lbToKCWlmIChwYXItPmF1eF9zdGFydCkKCQlyZWxlYXNlX21lbV9yZWdpb24ocGFyLT5hdXhfc3RhcnQsIHBhci0+YXV4X3NpemUpOwoKCXJlbGVhc2VfbWVtX3JlZ2lvbihwYXItPnJlc19zdGFydCwgcGFyLT5yZXNfc2l6ZSk7CglmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwoKCXJldHVybiByYzsKfQoKI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KCiNpZmRlZiBDT05GSUdfQVRBUkkKCnN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX2F0YXJpX3Byb2JlKHZvaWQpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhcjsKCXN0cnVjdCBmYl9pbmZvICppbmZvOwoJaW50IG02NF9udW07Cgl1MzIgY2xvY2tfcjsKCglmb3IgKG02NF9udW0gPSAwOyBtNjRfbnVtIDwgbWFjaDY0X2NvdW50OyBtNjRfbnVtKyspIHsKCQlpZiAoIXBoeXNfdm1lbWJhc2VbbTY0X251bV0gfHwgIXBoeXNfc2l6ZVttNjRfbnVtXSB8fAoJCSAgICAhcGh5c19ndWlyZWdiYXNlW202NF9udW1dKSB7CgkJICAgIFBSSU5US0koInBoeXNfKlslZF0gcGFyYW1ldGVycyBub3Qgc2V0ID0+IHJldHVybmluZyBlYXJseS4gXG4iLCBtNjRfbnVtKTsKCQkJY29udGludWU7CgkJfQoKCQlpbmZvID0gZnJhbWVidWZmZXJfYWxsb2Moc2l6ZW9mKHN0cnVjdCBhdHlmYl9wYXIpLCBOVUxMKTsKCQlpZiAoIWluZm8pIHsKCQkJUFJJTlRLRSgiYXR5ZmJfYXRhcmlfcHJvYmUoKSBjYW4ndCBhbGxvYyBmYl9pbmZvXG4iKTsKCQkJcmV0dXJuIC1FTk9NRU07CgkJfQoJCXBhciA9IGluZm8tPnBhcjsKCgkJaW5mby0+Zml4ID0gYXR5ZmJfZml4OwoKCQlwYXItPmlycSA9ICh1bnNpZ25lZCBpbnQpIC0xOyAvKiBzb21ldGhpbmcgaW52YWxpZCAqLwoKCQkvKgoJCSAqICBNYXAgdGhlIHZpZGVvIG1lbW9yeSAocGh5c2ljYWwgYWRkcmVzcyBnaXZlbikgdG8gc29tZXdoZXJlIGluIHRoZQoJCSAqICBrZXJuZWwgYWRkcmVzcyBzcGFjZS4KCQkgKi8KCQlpbmZvLT5zY3JlZW5fYmFzZSA9IGlvcmVtYXAocGh5c192bWVtYmFzZVttNjRfbnVtXSwgcGh5c19zaXplW202NF9udW1dKTsKCQlpbmZvLT5maXguc21lbV9zdGFydCA9ICh1bnNpZ25lZCBsb25nKWluZm8tPnNjcmVlbl9iYXNlOyAvKiBGYWtlISAqLwoJCXBhci0+YXRpX3JlZ2Jhc2UgPSBpb3JlbWFwKHBoeXNfZ3VpcmVnYmFzZVttNjRfbnVtXSwgMHgxMDAwMCkgKwoJCQkJCQkweEZDMDB1bDsKCQlpbmZvLT5maXgubW1pb19zdGFydCA9ICh1bnNpZ25lZCBsb25nKXBhci0+YXRpX3JlZ2Jhc2U7IC8qIEZha2UhICovCgoJCWF0eV9zdF9sZTMyKENMT0NLX0NOVEwsIDB4MTIzNDU2NzgsIHBhcik7CgkJY2xvY2tfciA9IGF0eV9sZF9sZTMyKENMT0NLX0NOVEwsIHBhcik7CgoJCXN3aXRjaCAoY2xvY2tfciAmIDB4MDAzRikgewoJCWNhc2UgMHgxMjoKCQkJcGFyLT5jbGtfd3Jfb2Zmc2V0ID0gMzsgLyogICovCgkJCWJyZWFrOwoJCWNhc2UgMHgzNDoKCQkJcGFyLT5jbGtfd3Jfb2Zmc2V0ID0gMjsgLyogTWVkdXNhIFNULUlPIElTQSBBZGFwdGVyIGV0Yy4gKi8KCQkJYnJlYWs7CgkJY2FzZSAweDE2OgoJCQlwYXItPmNsa193cl9vZmZzZXQgPSAxOyAvKiAgKi8KCQkJYnJlYWs7CgkJY2FzZSAweDM4OgoJCQlwYXItPmNsa193cl9vZmZzZXQgPSAwOyAvKiBQYW50aGVyIDEgSVNBIEFkYXB0ZXIgKEdlcmFsZCkgKi8KCQkJYnJlYWs7CgkJfQoKCQlpZiAoYXR5X2luaXQoaW5mbywgIklTQSBidXMiKSkgewoJCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwoJCQkvKiBUaGlzIGlzIGluc3VmZmljaWVudCEga2VybmVsX21hcCBoYXMgYWRkZWQgdHdvIGxhcmdlIGNodW5rcyEhICovCgkJCXJldHVybiAtRU5YSU87CgkJfQoJfQp9CgojZW5kaWYgLyogQ09ORklHX0FUQVJJICovCgpzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXR5ZmJfcmVtb3ZlKHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CgoJLyogcmVzdG9yZSB2aWRlbyBtb2RlICovCglhdHlfc2V0X2NydGMocGFyLCAmc2F2ZWRfY3J0Yyk7CglwYXItPnBsbF9vcHMtPnNldF9wbGwoaW5mbywgJnNhdmVkX3BsbCk7CgojaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKCWlmIChNNjRfSEFTKE1PQklMX0JVUykpCgkJYXR5X2JsX2V4aXQocGFyKTsKI2VuZGlmCgoJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcihpbmZvKTsKCiNpZmRlZiBDT05GSUdfTVRSUgoJaWYgKHBhci0+bXRycl9yZWcgPj0gMCkgewoJICAgIG10cnJfZGVsKHBhci0+bXRycl9yZWcsIDAsIDApOwoJICAgIHBhci0+bXRycl9yZWcgPSAtMTsKCX0KCWlmIChwYXItPm10cnJfYXBlciA+PSAwKSB7CgkgICAgbXRycl9kZWwocGFyLT5tdHJyX2FwZXIsIDAsIDApOwoJICAgIHBhci0+bXRycl9hcGVyID0gLTE7Cgl9CiNlbmRpZgojaWZuZGVmIF9fc3BhcmNfXwoJaWYgKHBhci0+YXRpX3JlZ2Jhc2UpCgkJaW91bm1hcChwYXItPmF0aV9yZWdiYXNlKTsKCWlmIChpbmZvLT5zY3JlZW5fYmFzZSkKCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKI2lmZGVmIF9fQklHX0VORElBTgoJaWYgKGluZm8tPnNwcml0ZS5hZGRyKQoJCWlvdW5tYXAoaW5mby0+c3ByaXRlLmFkZHIpOwojZW5kaWYKI2VuZGlmCiNpZmRlZiBfX3NwYXJjX18KCWtmcmVlKHBhci0+bW1hcF9tYXApOwojZW5kaWYKCWlmIChwYXItPmF1eF9zdGFydCkKCQlyZWxlYXNlX21lbV9yZWdpb24ocGFyLT5hdXhfc3RhcnQsIHBhci0+YXV4X3NpemUpOwoKCWlmIChwYXItPnJlc19zdGFydCkKCQlyZWxlYXNlX21lbV9yZWdpb24ocGFyLT5yZXNfc3RhcnQsIHBhci0+cmVzX3NpemUpOwoKCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7Cn0KCiNpZmRlZiBDT05GSUdfUENJCgpzdGF0aWMgdm9pZCBfX2RldmV4aXQgYXR5ZmJfcGNpX3JlbW92ZShzdHJ1Y3QgcGNpX2RldiAqcGRldikKewoJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CgoJYXR5ZmJfcmVtb3ZlKGluZm8pOwp9CgovKgogKiBUaGlzIGRyaXZlciB1c2VzIGl0cyBvd24gbWF0Y2hpbmcgdGFibGUuIFRoYXQgd2lsbCBiZSBtb3JlIGRpZmZpY3VsdAogKiB0byBmaXgsIHNvIGZvciBub3csIHdlIGp1c3QgbWF0Y2ggYWdhaW5zdCBhbnkgQVRJIElEIGFuZCBsZXQgdGhlCiAqIHByb2JlKCkgZnVuY3Rpb24gZmluZCBvdXQgd2hhdCdzIHVwLiBUaGF0IGFsc28gbWVhbiB3ZSBkb24ndCBoYXZlCiAqIGEgbW9kdWxlIElEIHRhYmxlIHRob3VnaC4KICovCnN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBhdHlmYl9wY2lfdGJsW10gPSB7Cgl7IFBDSV9WRU5ET1JfSURfQVRJLCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELAoJICBQQ0lfQkFTRV9DTEFTU19ESVNQTEFZIDw8IDE2LCAweGZmMDAwMCwgMCB9LAoJeyAwLCB9Cn07CgpzdGF0aWMgc3RydWN0IHBjaV9kcml2ZXIgYXR5ZmJfZHJpdmVyID0gewoJLm5hbWUJCT0gImF0eWZiIiwKCS5pZF90YWJsZQk9IGF0eWZiX3BjaV90YmwsCgkucHJvYmUJCT0gYXR5ZmJfcGNpX3Byb2JlLAoJLnJlbW92ZQkJPSBfX2RldmV4aXRfcChhdHlmYl9wY2lfcmVtb3ZlKSwKI2lmZGVmIENPTkZJR19QTQoJLnN1c3BlbmQJPSBhdHlmYl9wY2lfc3VzcGVuZCwKCS5yZXN1bWUJCT0gYXR5ZmJfcGNpX3Jlc3VtZSwKI2VuZGlmIC8qIENPTkZJR19QTSAqLwp9OwoKI2VuZGlmIC8qIENPTkZJR19QQ0kgKi8KCiNpZm5kZWYgTU9EVUxFCnN0YXRpYyBpbnQgX19kZXZpbml0IGF0eWZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCnsKCWNoYXIgKnRoaXNfb3B0OwoKCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCgkJcmV0dXJuIDA7CgoJd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewoJCWlmICghc3RybmNtcCh0aGlzX29wdCwgIm5vYWNjZWwiLCA3KSkgewoJCQlub2FjY2VsID0gMTsKI2lmZGVmIENPTkZJR19NVFJSCgkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIm5vbXRyciIsIDYpKSB7CgkJCW5vbXRyciA9IDE7CiNlbmRpZgoJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2cmFtOiIsIDUpKQoJCQl2cmFtID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA1LCBOVUxMLCAwKTsKCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInBsbDoiLCA0KSkKCQkJcGxsID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA0LCBOVUxMLCAwKTsKCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIm1jbGs6IiwgNSkpCgkJCW1jbGsgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsIE5VTEwsIDApOwoJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAieGNsazoiLCA1KSkKCQkJeGNsayA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzUsIE5VTEwsIDApOwoJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAiY29tcF9zeW5jOiIsIDEwKSkKCQkJY29tcF9zeW5jID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrMTAsIE5VTEwsIDApOwojaWZkZWYgQ09ORklHX1BQQwoJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAidm1vZGU6IiwgNikpIHsKCQkJdW5zaWduZWQgaW50IHZtb2RlID0KCQkJICAgIHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNiwgTlVMTCwgMCk7CgkJCWlmICh2bW9kZSA+IDAgJiYgdm1vZGUgPD0gVk1PREVfTUFYKQoJCQkJZGVmYXVsdF92bW9kZSA9IHZtb2RlOwoJCX0gZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJjbW9kZToiLCA2KSkgewoJCQl1bnNpZ25lZCBpbnQgY21vZGUgPQoJCQkgICAgc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA2LCBOVUxMLCAwKTsKCQkJc3dpdGNoIChjbW9kZSkgewoJCQljYXNlIDA6CgkJCWNhc2UgODoKCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV84OwoJCQkJYnJlYWs7CgkJCWNhc2UgMTU6CgkJCWNhc2UgMTY6CgkJCQlkZWZhdWx0X2Ntb2RlID0gQ01PREVfMTY7CgkJCQlicmVhazsKCQkJY2FzZSAyNDoKCQkJY2FzZSAzMjoKCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV8zMjsKCQkJCWJyZWFrOwoJCQl9CgkJfQojZW5kaWYKI2lmZGVmIENPTkZJR19BVEFSSQoJCS8qCgkJICogV2h5IGRvIHdlIG5lZWQgdGhpcyBzaWxseSBNYWNoNjQgYXJndW1lbnQ/CgkJICogV2UgYXJlIGFscmVhZHkgaGVyZSBiZWNhdXNlIG9mIG1hY2g2ND0gc28gaXRzIHJlZHVuZGFudC4KCQkgKi8KCQllbHNlIGlmIChNQUNIX0lTX0FUQVJJCgkJCSAmJiAoIXN0cm5jbXAodGhpc19vcHQsICJNYWNoNjQ6IiwgNykpKSB7CgkJCXN0YXRpYyB1bnNpZ25lZCBjaGFyIG02NF9udW07CgkJCXN0YXRpYyBjaGFyIG1hY2g2NF9zdHJbODBdOwoJCQlzdHJsY3B5KG1hY2g2NF9zdHIsIHRoaXNfb3B0ICsgNywgc2l6ZW9mKG1hY2g2NF9zdHIpKTsKCQkJaWYgKCFzdG9yZV92aWRlb19wYXIobWFjaDY0X3N0ciwgbTY0X251bSkpIHsKCQkJCW02NF9udW0rKzsKCQkJCW1hY2g2NF9jb3VudCA9IG02NF9udW07CgkJCX0KCQl9CiNlbmRpZgoJCWVsc2UKCQkJbW9kZSA9IHRoaXNfb3B0OwoJfQoJcmV0dXJuIDA7Cn0KI2VuZGlmICAvKiAgTU9EVUxFICAqLwoKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfaW5pdCh2b2lkKQp7CiNpZm5kZWYgTU9EVUxFCiAgICBjaGFyICpvcHRpb24gPSBOVUxMOwoKICAgIGlmIChmYl9nZXRfb3B0aW9ucygiYXR5ZmIiLCAmb3B0aW9uKSkKCXJldHVybiAtRU5PREVWOwogICAgYXR5ZmJfc2V0dXAob3B0aW9uKTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX1BDSQogICAgcGNpX3JlZ2lzdGVyX2RyaXZlcigmYXR5ZmJfZHJpdmVyKTsKI2VuZGlmCiNpZmRlZiBDT05GSUdfQVRBUkkKICAgIGF0eWZiX2F0YXJpX3Byb2JlKCk7CiNlbmRpZgogICAgcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBhdHlmYl9leGl0KHZvaWQpCnsKI2lmZGVmIENPTkZJR19QQ0kKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYXR5ZmJfZHJpdmVyKTsKI2VuZGlmCn0KCm1vZHVsZV9pbml0KGF0eWZiX2luaXQpOwptb2R1bGVfZXhpdChhdHlmYl9leGl0KTsKCk1PRFVMRV9ERVNDUklQVElPTigiRkJEZXYgZHJpdmVyIGZvciBBVEkgTWFjaDY0IGNhcmRzIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKbW9kdWxlX3BhcmFtKG5vYWNjZWwsIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vYWNjZWwsICJib29sOiBkaXNhYmxlIGFjY2VsZXJhdGlvbiIpOwptb2R1bGVfcGFyYW0odnJhbSwgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh2cmFtLCAiaW50OiBvdmVycmlkZSBzaXplIG9mIHZpZGVvIHJhbSIpOwptb2R1bGVfcGFyYW0ocGxsLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHBsbCwgImludDogb3ZlcnJpZGUgdmlkZW8gY2xvY2siKTsKbW9kdWxlX3BhcmFtKG1jbGssIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MobWNsaywgImludDogb3ZlcnJpZGUgbWVtb3J5IGNsb2NrIik7Cm1vZHVsZV9wYXJhbSh4Y2xrLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHhjbGssICJpbnQ6IG92ZXJyaWRlIGFjY2VsZXJhdGVkIGVuZ2luZSBjbG9jayIpOwptb2R1bGVfcGFyYW0oY29tcF9zeW5jLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGNvbXBfc3luYywKCQkgIlNldCBjb21wb3NpdGUgc3luYyBzaWduYWwgdG8gbG93ICgwKSBvciBoaWdoICgxKSIpOwptb2R1bGVfcGFyYW0obW9kZSwgY2hhcnAsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1vZGUsICJTcGVjaWZ5IHJlc29sdXRpb24gYXMgXCI8eHJlcz54PHlyZXM+Wy08YnBwPl1bQDxyZWZyZXNoPl1cIiAiKTsKI2lmZGVmIENPTkZJR19NVFJSCm1vZHVsZV9wYXJhbShub210cnIsIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vbXRyciwgImJvb2w6IGRpc2FibGUgdXNlIG9mIE1UUlIgcmVnaXN0ZXJzIik7CiNlbmRpZgo=