LyoKICogIEFUSSBGcmFtZSBCdWZmZXIgRGV2aWNlIERyaXZlciBDb3JlCiAqCiAqCUNvcHlyaWdodCAoQykgMjAwNCAgQWxleCBLZXJuIDxhbGV4Lmtlcm5AZ214LmRlPgogKglDb3B5cmlnaHQgKEMpIDE5OTctMjAwMSAgR2VlcnQgVXl0dGVyaG9ldmVuCiAqCUNvcHlyaWdodCAoQykgMTk5OCAgQmVybmQgSGFycmllcwogKglDb3B5cmlnaHQgKEMpIDE5OTggIEVkZGllIEMuIERvc3QgIChlY2RAc2t5bmV0LmJlKQogKgogKiAgVGhpcyBkcml2ZXIgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBBVEkgZ3JhcGhpY3MgY2hpcHM6CiAqICAgIC0gQVRJIE1hY2g2NAogKgogKiAgVG8gZG86IGFkZCBzdXBwb3J0IGZvcgogKiAgICAtIEFUSSBSYWdlMTI4IChmcm9tIGF0eTEyOGZiLmMpCiAqICAgIC0gQVRJIFJhZGVvbiAoZnJvbSByYWRlb25mYi5jKQogKgogKiAgVGhpcyBkcml2ZXIgaXMgcGFydGx5IGJhc2VkIG9uIHRoZSBQb3dlck1hYyBjb25zb2xlIGRyaXZlcjoKICoKICoJQ29weXJpZ2h0IChDKSAxOTk2IFBhdWwgTWFja2VycmFzCiAqCiAqICBhbmQgb24gdGhlIFBvd2VyTWFjIEFUSS9tYWNoNjQgZGlzcGxheSBkcml2ZXI6CiAqCiAqCUNvcHlyaWdodCAoQykgMTk5NyBNaWNoYWVsIEFLIFRlc2NoCiAqCiAqCSAgICAgIHdpdGggd29yayBieSBKb24gSG93ZWxsCiAqCQkJICAgSGFycnkgQUMgRWF0b24KICoJCQkgICBBbnRob255IFRvbmcgPGF0b25nQHVpdWMuZWR1PgogKgogKiAgR2VuZXJpYyBMQ0Qgc3VwcG9ydCB3cml0dGVuIGJ5IERhbmllbCBNYW50aW9uZSwgcG9ydGVkIGZyb20gMi40LjIwIGJ5IEFsZXggS2VybgogKiAgTWFueSBUaGFua3MgdG8gVmlsbGUgU3lyauRs5CBmb3IgcGF0Y2hlcyBhbmQgZml4aW5nIG5hc3RpbmcgMTYgYml0IGNvbG9yIGJ1Zy4KICoKICogIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqICBMaWNlbnNlLiBTZWUgdGhlIGZpbGUgQ09QWUlORyBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlIGZvcgogKiAgbW9yZSBkZXRhaWxzLgogKgogKiAgTWFueSB0aGFua3MgdG8gTml0eWEgZnJvbSBBVEkgZGV2cmVsIGZvciBzdXBwb3J0IGFuZCBwYXRpZW5jZSAhCiAqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKICBUT0RPOgoKICAgIC0gY3Vyc29yIHN1cHBvcnQgb24gYWxsIGNhcmRzIGFuZCBhbGwgcmFtZGFjcy4KICAgIC0gY3Vyc29yIHBhcmFtZXRlcnMgY29udHJvbGFibGUgdmlhIGlvY3RsKClzLgogICAgLSBndWVzcyBQTEwgYW5kIE1DTEsgYmFzZWQgb24gdGhlIG9yaWdpbmFsIFBMTCByZWdpc3RlciB2YWx1ZXMgaW5pdGlhbGl6ZWQKICAgICAgYnkgT3BlbiBGaXJtd2FyZSAoaWYgdGhleSBhcmUgaW5pdGlhbGl6ZWQpLiBCSU9TIGlzIGRvbmUKCiAgICAoQW55b25lIHdpdGggTWFjIHRvIGhlbHAgd2l0aCB0aGlzPykKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgojaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiNpbmNsdWRlIDxsaW51eC9tbS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgojaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KI2luY2x1ZGUgPGxpbnV4L2NvbnNvbGUuaD4KI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9wY2kuaD4KI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgojaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KI2luY2x1ZGUgPGxpbnV4L3dhaXQuaD4KI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgoKI2luY2x1ZGUgPGFzbS9pby5oPgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KCiNpbmNsdWRlIDx2aWRlby9tYWNoNjQuaD4KI2luY2x1ZGUgImF0eWZiLmgiCiNpbmNsdWRlICJhdGlfaWRzLmgiCgojaWZkZWYgX19wb3dlcnBjX18KI2luY2x1ZGUgPGFzbS9tYWNoZGVwLmg+CiNpbmNsdWRlIDxhc20vcHJvbS5oPgojaW5jbHVkZSAiLi4vbWFjbW9kZXMuaCIKI2VuZGlmCiNpZmRlZiBfX3NwYXJjX18KI2luY2x1ZGUgPGFzbS9wYm0uaD4KI2luY2x1ZGUgPGFzbS9mYmlvLmg+CiNlbmRpZgoKI2lmZGVmIENPTkZJR19BREJfUE1VCiNpbmNsdWRlIDxsaW51eC9hZGIuaD4KI2luY2x1ZGUgPGxpbnV4L3BtdS5oPgojZW5kaWYKI2lmZGVmIENPTkZJR19CT09UWF9URVhUCiNpbmNsdWRlIDxhc20vYnRleHQuaD4KI2VuZGlmCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKI2luY2x1ZGUgPGFzbS9iYWNrbGlnaHQuaD4KI2VuZGlmCiNpZmRlZiBDT05GSUdfTVRSUgojaW5jbHVkZSA8YXNtL210cnIuaD4KI2VuZGlmCgovKgogKiBEZWJ1ZyBmbGFncy4KICovCiN1bmRlZiBERUJVRwovKiNkZWZpbmUgREVCVUcqLwoKLyogTWFrZSBzdXJlIG4gKiBQQUdFX1NJWkUgaXMgcHJvdGVjdGVkIGF0IGVuZCBvZiBBcGVydHVyZSBmb3IgR1VJLXJlZ3MgKi8KLyogIC0gbXVzdCBiZSBsYXJnZSBlbm91Z2ggdG8gY2F0Y2ggYWxsIEdVSS1SZWdzICAgKi8KLyogIC0gbXVzdCBiZSBhbGlnbmVkIHRvIGEgUEFHRSBib3VuZGFyeSAgICAgICAgICAgKi8KI2RlZmluZSBHVUlfUkVTRVJWRQkoMSAqIFBBR0VfU0laRSkKCi8qIEZJWE1FOiByZW1vdmUgdGhlIEZBSUwgZGVmaW5pdGlvbiAqLwojZGVmaW5lIEZBSUwobXNnKSBkbyB7IFwKCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAoJCXByaW50ayhLRVJOX0NSSVQgImF0eWZiOiAiIG1zZyAiXG4iKTsgXAoJcmV0dXJuIC1FSU5WQUw7IFwKfSB3aGlsZSAoMCkKI2RlZmluZSBGQUlMX01BWChtc2csIHgsIF9tYXhfKSBkbyB7IFwKCWlmICh4ID4gX21heF8pIHsgXAoJCWlmICghKHZhci0+YWN0aXZhdGUgJiBGQl9BQ1RJVkFURV9URVNUKSkgXAoJCQlwcmludGsoS0VSTl9DUklUICJhdHlmYjogIiBtc2cgIiAleCgleClcbiIsIHgsIF9tYXhfKTsgXAoJCXJldHVybiAtRUlOVkFMOyBcCgl9IFwKfSB3aGlsZSAoMCkKI2lmZGVmIERFQlVHCiNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHICJhdHlmYjogIiBmbXQsICMjIGFyZ3MpCiNlbHNlCiNkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCiNlbmRpZgoKI2RlZmluZSBQUklOVEtJKGZtdCwgYXJncy4uLikJcHJpbnRrKEtFUk5fSU5GTyAiYXR5ZmI6ICIgZm10LCAjIyBhcmdzKQojZGVmaW5lIFBSSU5US0UoZm10LCBhcmdzLi4uKQkgcHJpbnRrKEtFUk5fRVJSICJhdHlmYjogIiBmbXQsICMjIGFyZ3MpCgojaWYgZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX1BNQUNfQkFDS0xJR0hUKSB8fCBkZWZpbmVkIChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQpzdGF0aWMgY29uc3QgdTMyIGx0X2xjZF9yZWdzW10gPSB7CglDT05GSUdfUEFORUxfTEcsCglMQ0RfR0VOX0NOVExfTEcsCglEU1ROX0NPTlRST0xfTEcsCglIRkJfUElUQ0hfQUREUl9MRywKCUhPUlpfU1RSRVRDSElOR19MRywKCVZFUlRfU1RSRVRDSElOR19MRywKCTAsIC8qIEVYVF9WRVJUX1NUUkVUQ0ggKi8KCUxUX0dJT19MRywKCVBPV0VSX01BTkFHRU1FTlRfTEcKfTsKCnZvaWQgYXR5X3N0X2xjZChpbnQgaW5kZXgsIHUzMiB2YWwsIGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJaWYgKE02NF9IQVMoTFRfTENEX1JFR1MpKSB7CgkJYXR5X3N0X2xlMzIobHRfbGNkX3JlZ3NbaW5kZXhdLCB2YWwsIHBhcik7Cgl9IGVsc2UgewoJCXVuc2lnbmVkIGxvbmcgdGVtcDsKCgkJLyogd3JpdGUgYWRkciBieXRlICovCgkJdGVtcCA9IGF0eV9sZF9sZTMyKExDRF9JTkRFWCwgcGFyKTsKCQlhdHlfc3RfbGUzMihMQ0RfSU5ERVgsICh0ZW1wICYgfkxDRF9JTkRFWF9NQVNLKSB8IGluZGV4LCBwYXIpOwoJCS8qIHdyaXRlIHRoZSByZWdpc3RlciB2YWx1ZSAqLwoJCWF0eV9zdF9sZTMyKExDRF9EQVRBLCB2YWwsIHBhcik7Cgl9Cn0KCnUzMiBhdHlfbGRfbGNkKGludCBpbmRleCwgY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglpZiAoTTY0X0hBUyhMVF9MQ0RfUkVHUykpIHsKCQlyZXR1cm4gYXR5X2xkX2xlMzIobHRfbGNkX3JlZ3NbaW5kZXhdLCBwYXIpOwoJfSBlbHNlIHsKCQl1bnNpZ25lZCBsb25nIHRlbXA7CgoJCS8qIHdyaXRlIGFkZHIgYnl0ZSAqLwoJCXRlbXAgPSBhdHlfbGRfbGUzMihMQ0RfSU5ERVgsIHBhcik7CgkJYXR5X3N0X2xlMzIoTENEX0lOREVYLCAodGVtcCAmIH5MQ0RfSU5ERVhfTUFTSykgfCBpbmRleCwgcGFyKTsKCQkvKiByZWFkIHRoZSByZWdpc3RlciB2YWx1ZSAqLwoJCXJldHVybiBhdHlfbGRfbGUzMihMQ0RfREFUQSwgcGFyKTsKCX0KfQojZW5kaWYgLyogZGVmaW5lZChDT05GSUdfUE0pIHx8IGRlZmluZWQoQ09ORklHX1BNQUNfQkFDS0xJR0hUKSB8fCBkZWZpbmVkIChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKSAqLwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QKLyoKICogQVRJUmVkdWNlUmF0aW8gLS0KICoKICogUmVkdWNlIGEgZnJhY3Rpb24gYnkgZmFjdG9yaW5nIG91dCB0aGUgbGFyZ2VzdCBjb21tb24gZGl2aWRlciBvZiB0aGUKICogZnJhY3Rpb24ncyBudW1lcmF0b3IgYW5kIGRlbm9taW5hdG9yLgogKi8Kc3RhdGljIHZvaWQgQVRJUmVkdWNlUmF0aW8oaW50ICpOdW1lcmF0b3IsIGludCAqRGVub21pbmF0b3IpCnsKICAgIGludCBNdWx0aXBsaWVyLCBEaXZpZGVyLCBSZW1haW5kZXI7CgogICAgTXVsdGlwbGllciA9ICpOdW1lcmF0b3I7CiAgICBEaXZpZGVyID0gKkRlbm9taW5hdG9yOwoKICAgIHdoaWxlICgoUmVtYWluZGVyID0gTXVsdGlwbGllciAlIERpdmlkZXIpKQogICAgewogICAgICAgIE11bHRpcGxpZXIgPSBEaXZpZGVyOwogICAgICAgIERpdmlkZXIgPSBSZW1haW5kZXI7CiAgICB9CgogICAgKk51bWVyYXRvciAvPSBEaXZpZGVyOwogICAgKkRlbm9taW5hdG9yIC89IERpdmlkZXI7Cn0KI2VuZGlmCiAgICAvKgogICAgICogIFRoZSBIYXJkd2FyZSBwYXJhbWV0ZXJzIGZvciBlYWNoIGNhcmQKICAgICAqLwoKc3RydWN0IHBjaV9tbWFwX21hcCB7Cgl1bnNpZ25lZCBsb25nIHZvZmY7Cgl1bnNpZ25lZCBsb25nIHBvZmY7Cgl1bnNpZ25lZCBsb25nIHNpemU7Cgl1bnNpZ25lZCBsb25nIHByb3RfZmxhZzsKCXVuc2lnbmVkIGxvbmcgcHJvdF9tYXNrOwp9OwoKc3RhdGljIHN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBhdHlmYl9maXggX19kZXZpbml0ZGF0YSA9IHsKCS5pZAkJPSAiQVRZIE1hY2g2NCIsCgkudHlwZQkJPSBGQl9UWVBFX1BBQ0tFRF9QSVhFTFMsCgkudmlzdWFsCQk9IEZCX1ZJU1VBTF9QU0VVRE9DT0xPUiwKCS54cGFuc3RlcAk9IDgsCgkueXBhbnN0ZXAJPSAxLAp9OwoKICAgIC8qCiAgICAgKiAgRnJhbWUgYnVmZmVyIGRldmljZSBBUEkKICAgICAqLwoKc3RhdGljIGludCBhdHlmYl9vcGVuKHN0cnVjdCBmYl9pbmZvICppbmZvLCBpbnQgdXNlcik7CnN0YXRpYyBpbnQgYXR5ZmJfcmVsZWFzZShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpOwpzdGF0aWMgaW50IGF0eWZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwgc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgaW50IGF0eWZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgaW50IGF0eWZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKCXVfaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgaW50IGF0eWZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYXR5ZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVfaW50IGNtZCwgdV9sb25nIGFyZyk7CiNpZmRlZiBfX3NwYXJjX18Kc3RhdGljIGludCBhdHlmYl9tbWFwKHN0cnVjdCBmYl9pbmZvICppbmZvLCBzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CiNlbmRpZgpzdGF0aWMgaW50IGF0eWZiX3N5bmMoc3RydWN0IGZiX2luZm8gKmluZm8pOwoKICAgIC8qCiAgICAgKiAgSW50ZXJuYWwgcm91dGluZXMKICAgICAqLwoKc3RhdGljIGludCBhdHlfaW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyB2b2lkIGF0eV9yZXN1bWVfY2hpcChzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CiNpZmRlZiBDT05GSUdfQVRBUkkKc3RhdGljIGludCBzdG9yZV92aWRlb19wYXIoY2hhciAqdmlkZW9wYXIsIHVuc2lnbmVkIGNoYXIgbTY0X251bSk7CiNlbmRpZgoKc3RhdGljIHN0cnVjdCBjcnRjIHNhdmVkX2NydGM7CnN0YXRpYyB1bmlvbiBhdHlfcGxsIHNhdmVkX3BsbDsKc3RhdGljIHZvaWQgYXR5X2dldF9jcnRjKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgc3RydWN0IGNydGMgKmNydGMpOwoKc3RhdGljIHZvaWQgYXR5X3NldF9jcnRjKGNvbnN0IHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgY29uc3Qgc3RydWN0IGNydGMgKmNydGMpOwpzdGF0aWMgaW50IGF0eV92YXJfdG9fY3J0Yyhjb25zdCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsIHN0cnVjdCBjcnRjICpjcnRjKTsKc3RhdGljIGludCBhdHlfY3J0Y190b192YXIoY29uc3Qgc3RydWN0IGNydGMgKmNydGMsIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKTsKc3RhdGljIHZvaWQgc2V0X29mZl9waXRjaChzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvKTsKI2lmZGVmIENPTkZJR19QUEMKc3RhdGljIGludCByZWFkX2F0eV9zZW5zZShjb25zdCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpOwojZW5kaWYKCgogICAgLyoKICAgICAqICBJbnRlcmZhY2UgdXNlZCBieSB0aGUgd29ybGQKICAgICAqLwoKc3RhdGljIHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBkZWZhdWx0X3ZhciA9IHsKCS8qIDY0MHg0ODAsIDYwIEh6LCBOb24tSW50ZXJsYWNlZCAoMjUuMTc1IE1IeiBkb3RjbG9jaykgKi8KCTY0MCwgNDgwLCA2NDAsIDQ4MCwgMCwgMCwgOCwgMCwKCXswLCA4LCAwfSwgezAsIDgsIDB9LCB7MCwgOCwgMH0sIHswLCAwLCAwfSwKCTAsIDAsIC0xLCAtMSwgMCwgMzk3MjIsIDQ4LCAxNiwgMzMsIDEwLCA5NiwgMiwKCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQKfTsKCnN0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIGRlZm1vZGUgPSB7CgkvKiA2NDB4NDgwIEAgNjAgSHosIDMxLjUga0h6IGhzeW5jICovCglOVUxMLCA2MCwgNjQwLCA0ODAsIDM5NzIxLCA0MCwgMjQsIDMyLCAxMSwgOTYsIDIsCgkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VECn07CgpzdGF0aWMgc3RydWN0IGZiX29wcyBhdHlmYl9vcHMgPSB7Cgkub3duZXIJCT0gVEhJU19NT0RVTEUsCgkuZmJfb3Blbgk9IGF0eWZiX29wZW4sCgkuZmJfcmVsZWFzZQk9IGF0eWZiX3JlbGVhc2UsCgkuZmJfY2hlY2tfdmFyCT0gYXR5ZmJfY2hlY2tfdmFyLAoJLmZiX3NldF9wYXIJPSBhdHlmYl9zZXRfcGFyLAoJLmZiX3NldGNvbHJlZwk9IGF0eWZiX3NldGNvbHJlZywKCS5mYl9wYW5fZGlzcGxheQk9IGF0eWZiX3Bhbl9kaXNwbGF5LAoJLmZiX2JsYW5rCT0gYXR5ZmJfYmxhbmssCgkuZmJfaW9jdGwJPSBhdHlmYl9pb2N0bCwKCS5mYl9maWxscmVjdAk9IGF0eWZiX2ZpbGxyZWN0LAoJLmZiX2NvcHlhcmVhCT0gYXR5ZmJfY29weWFyZWEsCgkuZmJfaW1hZ2VibGl0CT0gYXR5ZmJfaW1hZ2VibGl0LAojaWZkZWYgX19zcGFyY19fCgkuZmJfbW1hcAk9IGF0eWZiX21tYXAsCiNlbmRpZgoJLmZiX3N5bmMJPSBhdHlmYl9zeW5jLAp9OwoKc3RhdGljIGludCBub2FjY2VsOwojaWZkZWYgQ09ORklHX01UUlIKc3RhdGljIGludCBub210cnI7CiNlbmRpZgpzdGF0aWMgaW50IHZyYW07CnN0YXRpYyBpbnQgcGxsOwpzdGF0aWMgaW50IG1jbGs7CnN0YXRpYyBpbnQgeGNsazsKc3RhdGljIGludCBjb21wX3N5bmMgX19kZXZpbml0ZGF0YSA9IC0xOwpzdGF0aWMgY2hhciAqbW9kZTsKCiNpZmRlZiBDT05GSUdfUFBDCnN0YXRpYyBpbnQgZGVmYXVsdF92bW9kZSBfX2RldmluaXRkYXRhID0gVk1PREVfQ0hPT1NFOwpzdGF0aWMgaW50IGRlZmF1bHRfY21vZGUgX19kZXZpbml0ZGF0YSA9IENNT0RFX0NIT09TRTsKCm1vZHVsZV9wYXJhbV9uYW1lZCh2bW9kZSwgZGVmYXVsdF92bW9kZSwgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh2bW9kZSwgImludDogdmlkZW8gbW9kZSBmb3IgbWFjIik7Cm1vZHVsZV9wYXJhbV9uYW1lZChjbW9kZSwgZGVmYXVsdF9jbW9kZSwgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyhjbW9kZSwgImludDogY29sb3IgbW9kZSBmb3IgbWFjIik7CiNlbmRpZgoKI2lmZGVmIENPTkZJR19BVEFSSQpzdGF0aWMgdW5zaWduZWQgaW50IG1hY2g2NF9jb3VudCBfX2RldmluaXRkYXRhID0gMDsKc3RhdGljIHVuc2lnbmVkIGxvbmcgcGh5c192bWVtYmFzZVtGQl9NQVhdIF9fZGV2aW5pdGRhdGEgPSB7IDAsIH07CnN0YXRpYyB1bnNpZ25lZCBsb25nIHBoeXNfc2l6ZVtGQl9NQVhdIF9fZGV2aW5pdGRhdGEgPSB7IDAsIH07CnN0YXRpYyB1bnNpZ25lZCBsb25nIHBoeXNfZ3VpcmVnYmFzZVtGQl9NQVhdIF9fZGV2aW5pdGRhdGEgPSB7IDAsIH07CiNlbmRpZgoKLyogdG9wIC0+IGRvd24gaXMgYW4gZXZvbHV0aW9uIG9mIG1hY2g2NCBjaGlwc2V0LCBhbnkgY29ycmVjdGlvbnM/ICovCiNkZWZpbmUgQVRJX0NISVBfODg4MDBHWCAgIChNNjRGX0dYKQojZGVmaW5lIEFUSV9DSElQXzg4ODAwQ1ggICAoTTY0Rl9HWCkKCiNkZWZpbmUgQVRJX0NISVBfMjY0Q1QgICAgIChNNjRGX0NUIHwgTTY0Rl9JTlRFR1JBVEVEIHwgTTY0Rl9DVF9CVVMgfCBNNjRGX01BR0lDX0ZJRk8pCiNkZWZpbmUgQVRJX0NISVBfMjY0RVQgICAgIChNNjRGX0NUIHwgTTY0Rl9JTlRFR1JBVEVEIHwgTTY0Rl9DVF9CVVMgfCBNNjRGX01BR0lDX0ZJRk8pCgojZGVmaW5lIEFUSV9DSElQXzI2NFZUICAgICAoTTY0Rl9WVCB8IE02NEZfSU5URUdSQVRFRCB8IE02NEZfVlRfQlVTIHwgTTY0Rl9NQUdJQ19GSUZPKQojZGVmaW5lIEFUSV9DSElQXzI2NEdUICAgICAoTTY0Rl9HVCB8IE02NEZfSU5URUdSQVRFRCAgICAgICAgICAgICAgIHwgTTY0Rl9NQUdJQ19GSUZPIHwgTTY0Rl9FWFRSQV9CUklHSFQpCgojZGVmaW5lIEFUSV9DSElQXzI2NFZUQiAgICAoTTY0Rl9WVCB8IE02NEZfSU5URUdSQVRFRCB8IE02NEZfVlRfQlVTIHwgTTY0Rl9HVEJfRFNQKQojZGVmaW5lIEFUSV9DSElQXzI2NFZUMyAgICAoTTY0Rl9WVCB8IE02NEZfSU5URUdSQVRFRCB8IE02NEZfVlRfQlVTIHwgTTY0Rl9HVEJfRFNQIHwgTTY0Rl9TRFJBTV9NQUdJQ19QTEwpCiNkZWZpbmUgQVRJX0NISVBfMjY0VlQ0ICAgIChNNjRGX1ZUIHwgTTY0Rl9JTlRFR1JBVEVEICAgICAgICAgICAgICAgfCBNNjRGX0dUQl9EU1ApCgovKiBGSVhNRSB3aGF0IGlzIHRoaXMgY2hpcD8gKi8KI2RlZmluZSBBVElfQ0hJUF8yNjRMVCAgICAgKE02NEZfR1QgfCBNNjRGX0lOVEVHUkFURUQgICAgICAgICAgICAgICB8IE02NEZfR1RCX0RTUCkKCi8qIG1ha2Ugc2V0cyBzaG9ydGVyICovCiNkZWZpbmUgQVRJX01PREVSTl9TRVQgICAgIChNNjRGX0dUIHwgTTY0Rl9JTlRFR1JBVEVEICAgICAgICAgICAgICAgfCBNNjRGX0dUQl9EU1AgfCBNNjRGX0VYVFJBX0JSSUdIVCkKCiNkZWZpbmUgQVRJX0NISVBfMjY0R1RCICAgIChBVElfTU9ERVJOX1NFVCB8IE02NEZfU0RSQU1fTUFHSUNfUExMKQovKiNkZWZpbmUgQVRJX0NISVBfMjY0R1REVkQgID8qLwojZGVmaW5lIEFUSV9DSElQXzI2NExURyAgICAoQVRJX01PREVSTl9TRVQgfCBNNjRGX1NEUkFNX01BR0lDX1BMTCkKCiNkZWZpbmUgQVRJX0NISVBfMjY0R1QyQyAgIChBVElfTU9ERVJOX1NFVCB8IE02NEZfU0RSQU1fTUFHSUNfUExMIHwgTTY0Rl9IV19UUklQTEUpCiNkZWZpbmUgQVRJX0NISVBfMjY0R1RQUk8gIChBVElfTU9ERVJOX1NFVCB8IE02NEZfU0RSQU1fTUFHSUNfUExMIHwgTTY0Rl9IV19UUklQTEUgfCBNNjRGX0ZJRk9fMzIgfCBNNjRGX1JFU0VUXzNEKQojZGVmaW5lIEFUSV9DSElQXzI2NExUUFJPICAoQVRJX01PREVSTl9TRVQgfCBNNjRGX0hXX1RSSVBMRSB8IE02NEZfRklGT18zMiB8IE02NEZfUkVTRVRfM0QpCgojZGVmaW5lIEFUSV9DSElQXzI2NFhMICAgICAoQVRJX01PREVSTl9TRVQgfCBNNjRGX0hXX1RSSVBMRSB8IE02NEZfRklGT18zMiB8IE02NEZfUkVTRVRfM0QgfCBNNjRGX1hMX0RMTCB8IE02NEZfTUZCX0ZPUkNFXzQpCiNkZWZpbmUgQVRJX0NISVBfTU9CSUxJVFkgIChBVElfTU9ERVJOX1NFVCB8IE02NEZfSFdfVFJJUExFIHwgTTY0Rl9GSUZPXzMyIHwgTTY0Rl9SRVNFVF8zRCB8IE02NEZfWExfRExMIHwgTTY0Rl9NRkJfRk9SQ0VfNCB8IE02NEZfTU9CSUxfQlVTKQoKc3RhdGljIHN0cnVjdCB7Cgl1MTYgcGNpX2lkOwoJY29uc3QgY2hhciAqbmFtZTsKCWludCBwbGwsIG1jbGssIHhjbGssIGVjcF9tYXg7Cgl1MzIgZmVhdHVyZXM7Cn0gYXR5X2NoaXBzW10gX19kZXZpbml0ZGF0YSA9IHsKI2lmZGVmIENPTkZJR19GQl9BVFlfR1gKCS8qIE1hY2g2NCBHWCAqLwoJeyBQQ0lfQ0hJUF9NQUNINjRHWCwgIkFUSTg4OEdYMDAgKE1hY2g2NCBHWCkiLCAxMzUsIDUwLCA1MCwgMCwgQVRJX0NISVBfODg4MDBHWCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRDWCwgIkFUSTg4OENYMDAgKE1hY2g2NCBDWCkiLCAxMzUsIDUwLCA1MCwgMCwgQVRJX0NISVBfODg4MDBDWCB9LAojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HWCAqLwoKI2lmZGVmIENPTkZJR19GQl9BVFlfQ1QKCXsgUENJX0NISVBfTUFDSDY0Q1QsICJBVEkyNjRDVCAoTWFjaDY0IENUKSIsIDEzNSwgNjAsIDYwLCAwLCBBVElfQ0hJUF8yNjRDVCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRFVCwgIkFUSTI2NEVUIChNYWNoNjQgRVQpIiwgMTM1LCA2MCwgNjAsIDAsIEFUSV9DSElQXzI2NEVUIH0sCgoJLyogRklYTUUgd2hhdCBpcyB0aGlzIGNoaXA/ICovCgl7IFBDSV9DSElQX01BQ0g2NExULCAiQVRJMjY0TFQgKE1hY2g2NCBMVCkiLCAxMzUsIDYzLCA2MywgMCwgQVRJX0NISVBfMjY0TFQgfSwKCgl7IFBDSV9DSElQX01BQ0g2NFZULCAiQVRJMjY0VlQgKE1hY2g2NCBWVCkiLCAxNzAsIDY3LCA2NywgODAsIEFUSV9DSElQXzI2NFZUIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdULCAiM0QgUkFHRSAoTWFjaDY0IEdUKSIsIDEzNSwgNjMsIDYzLCA4MCwgQVRJX0NISVBfMjY0R1QgfSwKCgl7IFBDSV9DSElQX01BQ0g2NFZVLCAiQVRJMjY0VlQzIChNYWNoNjQgVlUpIiwgMjAwLCA2NywgNjcsIDgwLCBBVElfQ0hJUF8yNjRWVDMgfSwKCXsgUENJX0NISVBfTUFDSDY0R1UsICIzRCBSQUdFIElJKyAoTWFjaDY0IEdVKSIsIDIwMCwgNjcsIDY3LCAxMDAsIEFUSV9DSElQXzI2NEdUQiB9LAoKCXsgUENJX0NISVBfTUFDSDY0TEcsICIzRCBSQUdFIExUIChNYWNoNjQgTEcpIiwgMjMwLCA2MywgNjMsIDEwMCwgQVRJX0NISVBfMjY0TFRHIHwgTTY0Rl9MVF9MQ0RfUkVHUyB8IE02NEZfRzNfUEJfMTAyNHg3NjggfSwKCgl7IFBDSV9DSElQX01BQ0g2NFZWLCAiQVRJMjY0VlQ0IChNYWNoNjQgVlYpIiwgMjMwLCA4MywgODMsIDEwMCwgQVRJX0NISVBfMjY0VlQ0IH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRHViwgIjNEIFJBR0UgSUlDIChNYWNoNjQgR1YsIFBDSSkiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRHVDJDIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdXLCAiM0QgUkFHRSBJSUMgKE1hY2g2NCBHVywgQUdQKSIsIDIzMCwgODMsIDgzLCAxMDAsIEFUSV9DSElQXzI2NEdUMkMgfSwKCXsgUENJX0NISVBfTUFDSDY0R1ksICIzRCBSQUdFIElJQyAoTWFjaDY0IEdZLCBQQ0kpIiwgMjMwLCA4MywgODMsIDEwMCwgQVRJX0NISVBfMjY0R1QyQyB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHWiwgIjNEIFJBR0UgSUlDIChNYWNoNjQgR1osIEFHUCkiLCAyMzAsIDgzLCA4MywgMTAwLCBBVElfQ0hJUF8yNjRHVDJDIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRHQiwgIjNEIFJBR0UgUFJPIChNYWNoNjQgR0IsIEJHQSwgQUdQKSIsIDIzMCwgMTAwLCAxMDAsIDEyNSwgQVRJX0NISVBfMjY0R1RQUk8gfSwKCXsgUENJX0NISVBfTUFDSDY0R0QsICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdELCBCR0EsIEFHUCAxeCkiLCAyMzAsIDEwMCwgMTAwLCAxMjUsIEFUSV9DSElQXzI2NEdUUFJPIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdJLCAiM0QgUkFHRSBQUk8gKE1hY2g2NCBHSSwgQkdBLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTI1LCBBVElfQ0hJUF8yNjRHVFBSTyB8IE02NEZfTUFHSUNfVlJBTV9TSVpFIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdQLCAiM0QgUkFHRSBQUk8gKE1hY2g2NCBHUCwgUFFGUCwgUENJKSIsIDIzMCwgMTAwLCAxMDAsIDEyNSwgQVRJX0NISVBfMjY0R1RQUk8gfSwKCXsgUENJX0NISVBfTUFDSDY0R1EsICIzRCBSQUdFIFBSTyAoTWFjaDY0IEdRLCBQUUZQLCBQQ0ksIGxpbWl0ZWQgM0QpIiwgMjMwLCAxMDAsIDEwMCwgMTI1LCBBVElfQ0hJUF8yNjRHVFBSTyB9LAoKCXsgUENJX0NISVBfTUFDSDY0TEIsICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExCLCBBR1ApIiwgMjM2LCA3NSwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIH0sCgl7IFBDSV9DSElQX01BQ0g2NExELCAiM0QgUkFHRSBMVCBQUk8gKE1hY2g2NCBMRCwgQUdQKSIsIDIzMCwgMTAwLCAxMDAsIDEzNSwgQVRJX0NISVBfMjY0TFRQUk8gfSwKCXsgUENJX0NISVBfTUFDSDY0TEksICIzRCBSQUdFIExUIFBSTyAoTWFjaDY0IExJLCBQQ0kpIiwgMjMwLCAxMDAsIDEwMCwgMTM1LCBBVElfQ0hJUF8yNjRMVFBSTyB8IE02NEZfRzNfUEJfMV8xIHwgTTY0Rl9HM19QQl8xMDI0eDc2OCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMUCwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTFAsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIHwgTTY0Rl9HM19QQl8xMDI0eDc2OCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMUSwgIjNEIFJBR0UgTFQgUFJPIChNYWNoNjQgTFEsIFBDSSkiLCAyMzAsIDEwMCwgMTAwLCAxMzUsIEFUSV9DSElQXzI2NExUUFJPIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRHTSwgIjNEIFJBR0UgWEwgKE1hY2g2NCBHTSwgQUdQIDJ4KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdOLCAiM0QgUkFHRSBYQyAoTWFjaDY0IEdOLCBBR1AgMngpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfSwKCXsgUENJX0NISVBfTUFDSDY0R08sICIzRCBSQUdFIFhMIChNYWNoNjQgR08sIFBDSS02NikiLCAyMzAsIDgzLCA2MywgMTM1LCBBVElfQ0hJUF8yNjRYTCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHTCwgIjNEIFJBR0UgWEMgKE1hY2g2NCBHTCwgUENJLTY2KSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCgl7IFBDSV9DSElQX01BQ0g2NEdSLCAiM0QgUkFHRSBYTCAoTWFjaDY0IEdSLCBQQ0ktMzMpIiwgMjMwLCA4MywgNjMsIDEzNSwgQVRJX0NISVBfMjY0WEwgfCBNNjRGX1NEUkFNX01BR0lDX1BMTCB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRHUywgIjNEIFJBR0UgWEMgKE1hY2g2NCBHUywgUENJLTMzKSIsIDIzMCwgODMsIDYzLCAxMzUsIEFUSV9DSElQXzI2NFhMIH0sCgoJeyBQQ0lfQ0hJUF9NQUNINjRMTSwgIjNEIFJBR0UgTW9iaWxpdHkgUC9NIChNYWNoNjQgTE0sIEFHUCAyeCkiLCAyMzAsIDgzLCAxMjUsIDEzNSwgQVRJX0NISVBfTU9CSUxJVFkgfSwKCXsgUENJX0NISVBfTUFDSDY0TE4sICIzRCBSQUdFIE1vYmlsaXR5IEwgKE1hY2g2NCBMTiwgQUdQIDJ4KSIsIDIzMCwgODMsIDEyNSwgMTM1LCBBVElfQ0hJUF9NT0JJTElUWSB9LAoJeyBQQ0lfQ0hJUF9NQUNINjRMUiwgIjNEIFJBR0UgTW9iaWxpdHkgUC9NIChNYWNoNjQgTFIsIFBDSSkiLCAyMzAsIDgzLCAxMjUsIDEzNSwgQVRJX0NISVBfTU9CSUxJVFkgfSwKCXsgUENJX0NISVBfTUFDSDY0TFMsICIzRCBSQUdFIE1vYmlsaXR5IEwgKE1hY2g2NCBMUywgUENJKSIsIDIzMCwgODMsIDEyNSwgMTM1LCBBVElfQ0hJUF9NT0JJTElUWSB9LAojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9DVCAqLwp9OwoKLyogY2FuIG5vdCBmYWlsICovCnN0YXRpYyBpbnQgX19kZXZpbml0IGNvcnJlY3RfY2hpcHNldChzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKCXU4IHJldjsKCXUxNiB0eXBlOwoJdTMyIGNoaXBfaWQ7Cgljb25zdCBjaGFyICpuYW1lOwoJaW50IGk7CgoJZm9yIChpID0gQVJSQVlfU0laRShhdHlfY2hpcHMpIC0gMTsgaSA+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+YWNjZWxfZmxhZ3MgJiBGQl9BQ0NFTEZfVEVYVCkKCQlpbmZvLT52YXIuYWNjZWxfZmxhZ3MgPSBGQl9BQ0NFTEZfVEVYVDsKCWVsc2UKCQlpbmZvLT52YXIuYWNjZWxfZmxhZ3MgPSAwOwoKCWF0eV9jcnRjX3RvX3ZhcigmY3J0YywgdmFyKTsKCXZhci0+cGl4Y2xvY2sgPSBwYXItPnBsbF9vcHMtPnBsbF90b192YXIoaW5mbywgJnBsbCk7CglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgc2V0X29mZl9waXRjaChzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIGNvbnN0IHN0cnVjdCBmYl9pbmZvICppbmZvKQp7Cgl1MzIgeG9mZnNldCA9IGluZm8tPnZhci54b2Zmc2V0OwoJdTMyIHlvZmZzZXQgPSBpbmZvLT52YXIueW9mZnNldDsKCXUzMiB2eHJlcyA9IHBhci0+Y3J0Yy52eHJlczsKCXUzMiBicHAgPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWw7CgoJcGFyLT5jcnRjLm9mZl9waXRjaCA9ICgoeW9mZnNldCAqIHZ4cmVzICsgeG9mZnNldCkgKiBicHAgLyA2NCkgfCAodnhyZXMgPDwgMTkpOwp9CgoKICAgIC8qCiAgICAgKiAgT3Blbi9SZWxlYXNlIHRoZSBmcmFtZSBidWZmZXIgZGV2aWNlCiAgICAgKi8KCnN0YXRpYyBpbnQgYXR5ZmJfb3BlbihzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgaW50IHVzZXIpCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCglpZiAodXNlcikgewoJCXBhci0+b3BlbisrOwojaWZkZWYgX19zcGFyY19fCgkJcGFyLT5tbWFwZWQgPSAwOwojZW5kaWYKCX0KCXJldHVybiAoMCk7Cn0KCnN0YXRpYyBpcnFyZXR1cm5fdCBhdHlfaXJxKGludCBpcnEsIHZvaWQgKmRldl9pZCkKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gZGV2X2lkOwoJaW50IGhhbmRsZWQgPSAwOwoJdTMyIGludF9jbnRsOwoKCXNwaW5fbG9jaygmcGFyLT5pbnRfbG9jayk7CgoJaW50X2NudGwgPSBhdHlfbGRfbGUzMihDUlRDX0lOVF9DTlRMLCBwYXIpOwoKCWlmIChpbnRfY250bCAmIENSVENfVkJMQU5LX0lOVCkgewoJCS8qIGNsZWFyIGludGVycnVwdCAqLwoJCWF0eV9zdF9sZTMyKENSVENfSU5UX0NOVEwsIChpbnRfY250bCAmIENSVENfSU5UX0VOX01BU0spIHwgQ1JUQ19WQkxBTktfSU5UX0FLLCBwYXIpOwoJCXBhci0+dmJsYW5rLmNvdW50Kys7CgkJaWYgKHBhci0+dmJsYW5rLnBhbl9kaXNwbGF5KSB7CgkJCXBhci0+dmJsYW5rLnBhbl9kaXNwbGF5ID0gMDsKCQkJYXR5X3N0X2xlMzIoQ1JUQ19PRkZfUElUQ0gsIHBhci0+Y3J0Yy5vZmZfcGl0Y2gsIHBhcik7CgkJfQoJCXdha2VfdXBfaW50ZXJydXB0aWJsZSgmcGFyLT52Ymxhbmsud2FpdCk7CgkJaGFuZGxlZCA9IDE7Cgl9CgoJc3Bpbl91bmxvY2soJnBhci0+aW50X2xvY2spOwoKCXJldHVybiBJUlFfUkVUVkFMKGhhbmRsZWQpOwp9CgpzdGF0aWMgaW50IGF0eV9lbmFibGVfaXJxKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgaW50IHJlZW5hYmxlKQp7Cgl1MzIgaW50X2NudGw7CgoJaWYgKCF0ZXN0X2FuZF9zZXRfYml0KDAsICZwYXItPmlycV9mbGFncykpIHsKCQlpZiAocmVxdWVzdF9pcnEocGFyLT5pcnEsIGF0eV9pcnEsIElSUUZfU0hBUkVELCAiYXR5ZmIiLCBwYXIpKSB7CgkJCWNsZWFyX2JpdCgwLCAmcGFyLT5pcnFfZmxhZ3MpOwoJCQlyZXR1cm4gLUVJTlZBTDsKCQl9CgkJc3Bpbl9sb2NrX2lycSgmcGFyLT5pbnRfbG9jayk7CgkJaW50X2NudGwgPSBhdHlfbGRfbGUzMihDUlRDX0lOVF9DTlRMLCBwYXIpICYgQ1JUQ19JTlRfRU5fTUFTSzsKCQkvKiBjbGVhciBpbnRlcnJ1cHQgKi8KCQlhdHlfc3RfbGUzMihDUlRDX0lOVF9DTlRMLCBpbnRfY250bCB8IENSVENfVkJMQU5LX0lOVF9BSywgcGFyKTsKCQkvKiBlbmFibGUgaW50ZXJydXB0ICovCgkJYXR5X3N0X2xlMzIoQ1JUQ19JTlRfQ05UTCwgaW50X2NudGwgfCBDUlRDX1ZCTEFOS19JTlRfRU4sIHBhcik7CgkJc3Bpbl91bmxvY2tfaXJxKCZwYXItPmludF9sb2NrKTsKCX0gZWxzZSBpZiAocmVlbmFibGUpIHsKCQlzcGluX2xvY2tfaXJxKCZwYXItPmludF9sb2NrKTsKCQlpbnRfY250bCA9IGF0eV9sZF9sZTMyKENSVENfSU5UX0NOVEwsIHBhcikgJiBDUlRDX0lOVF9FTl9NQVNLOwoJCWlmICghKGludF9jbnRsICYgQ1JUQ19WQkxBTktfSU5UX0VOKSkgewoJCQlwcmludGsoImF0eWZiOiBzb21lb25lIGRpc2FibGVkIElSUSBbJTA4eF1cbiIsIGludF9jbnRsKTsKCQkJLyogcmUtZW5hYmxlIGludGVycnVwdCAqLwoJCQlhdHlfc3RfbGUzMihDUlRDX0lOVF9DTlRMLCBpbnRfY250bCB8IENSVENfVkJMQU5LX0lOVF9FTiwgcGFyICk7CgkJfQoJCXNwaW5fdW5sb2NrX2lycSgmcGFyLT5pbnRfbG9jayk7Cgl9CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5X2Rpc2FibGVfaXJxKHN0cnVjdCBhdHlmYl9wYXIgKnBhcikKewoJdTMyIGludF9jbnRsOwoKCWlmICh0ZXN0X2FuZF9jbGVhcl9iaXQoMCwgJnBhci0+aXJxX2ZsYWdzKSkgewoJCWlmIChwYXItPnZibGFuay5wYW5fZGlzcGxheSkgewoJCQlwYXItPnZibGFuay5wYW5fZGlzcGxheSA9IDA7CgkJCWF0eV9zdF9sZTMyKENSVENfT0ZGX1BJVENILCBwYXItPmNydGMub2ZmX3BpdGNoLCBwYXIpOwoJCX0KCQlzcGluX2xvY2tfaXJxKCZwYXItPmludF9sb2NrKTsKCQlpbnRfY250bCA9IGF0eV9sZF9sZTMyKENSVENfSU5UX0NOVEwsIHBhcikgJiBDUlRDX0lOVF9FTl9NQVNLOwoJCS8qIGRpc2FibGUgaW50ZXJydXB0ICovCgkJYXR5X3N0X2xlMzIoQ1JUQ19JTlRfQ05UTCwgaW50X2NudGwgJiB+Q1JUQ19WQkxBTktfSU5UX0VOLCBwYXIgKTsKCQlzcGluX3VubG9ja19pcnEoJnBhci0+aW50X2xvY2spOwoJCWZyZWVfaXJxKHBhci0+aXJxLCBwYXIpOwoJfQoKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0eWZiX3JlbGVhc2Uoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCB1c2VyKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CglpZiAodXNlcikgewoJCXBhci0+b3Blbi0tOwoJCW1kZWxheSgxKTsKCQl3YWl0X2Zvcl9pZGxlKHBhcik7CgkJaWYgKCFwYXItPm9wZW4pIHsKI2lmZGVmIF9fc3BhcmNfXwoJCQlpbnQgd2FzX21tYXBlZCA9IHBhci0+bW1hcGVkOwoKCQkJcGFyLT5tbWFwZWQgPSAwOwoKCQkJaWYgKHdhc19tbWFwZWQpIHsKCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CgoJCQkJLyogTm93IHJlc2V0IHRoZSBkZWZhdWx0IGRpc3BsYXkgY29uZmlnLCB3ZSBoYXZlIG5vCgkJCQkgKiBpZGVhIHdoYXQgdGhlIHByb2dyYW0ocykgd2hpY2ggbW1hcCdkIHRoZSBjaGlwIGRpZAoJCQkJICogdG8gdGhlIGNvbmZpZ3VyYXRpb24sIG5vciB3aGV0aGVyIGl0IHJlc3RvcmVkIGl0CgkJCQkgKiBjb3JyZWN0bHkuCgkJCQkgKi8KCQkJCXZhciA9IGRlZmF1bHRfdmFyOwoJCQkJaWYgKG5vYWNjZWwpCgkJCQkJdmFyLmFjY2VsX2ZsYWdzICY9IH5GQl9BQ0NFTEZfVEVYVDsKCQkJCWVsc2UKCQkJCQl2YXIuYWNjZWxfZmxhZ3MgfD0gRkJfQUNDRUxGX1RFWFQ7CgkJCQlpZiAodmFyLnlyZXMgPT0gdmFyLnlyZXNfdmlydHVhbCkgewoJCQkJCXUzMiB2aWRlb3JhbSA9IChpbmZvLT5maXguc21lbV9sZW4gLSAoUEFHRV9TSVpFIDw8IDIpKTsKCQkJCQl2YXIueXJlc192aXJ0dWFsID0gKCh2aWRlb3JhbSAqIDgpIC8gdmFyLmJpdHNfcGVyX3BpeGVsKSAvIHZhci54cmVzX3ZpcnR1YWw7CgkJCQkJaWYgKHZhci55cmVzX3ZpcnR1YWwgPCB2YXIueXJlcykKCQkJCQkJdmFyLnlyZXNfdmlydHVhbCA9IHZhci55cmVzOwoJCQkJfQoJCQl9CiNlbmRpZgoJCQlhdHlfZGlzYWJsZV9pcnEocGFyKTsKCQl9Cgl9CglyZXR1cm4gKDApOwp9CgogICAgLyoKICAgICAqICBQYW4gb3IgV3JhcCB0aGUgRGlzcGxheQogICAgICoKICAgICAqICBUaGlzIGNhbGwgbG9va3Mgb25seSBhdCB4b2Zmc2V0LCB5b2Zmc2V0IGFuZCB0aGUgRkJfVk1PREVfWVdSQVAgZmxhZwogICAgICovCgpzdGF0aWMgaW50IGF0eWZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJdTMyIHhyZXMsIHlyZXMsIHhvZmZzZXQsIHlvZmZzZXQ7CgoJeHJlcyA9ICgoKHBhci0+Y3J0Yy5oX3RvdF9kaXNwID4+IDE2KSAmIDB4ZmYpICsgMSkgKiA4OwoJeXJlcyA9ICgocGFyLT5jcnRjLnZfdG90X2Rpc3AgPj4gMTYpICYgMHg3ZmYpICsgMTsKCWlmIChwYXItPmNydGMuZ2VuX2NudGwgJiBDUlRDX0RCTF9TQ0FOX0VOKQoJCXlyZXMgPj49IDE7Cgl4b2Zmc2V0ID0gKHZhci0+eG9mZnNldCArIDcpICYgfjc7Cgl5b2Zmc2V0ID0gdmFyLT55b2Zmc2V0OwoJaWYgKHhvZmZzZXQgKyB4cmVzID4gcGFyLT5jcnRjLnZ4cmVzIHx8IHlvZmZzZXQgKyB5cmVzID4gcGFyLT5jcnRjLnZ5cmVzKQoJCXJldHVybiAtRUlOVkFMOwoJaW5mby0+dmFyLnhvZmZzZXQgPSB4b2Zmc2V0OwoJaW5mby0+dmFyLnlvZmZzZXQgPSB5b2Zmc2V0OwoJaWYgKHBhci0+YXNsZWVwKQoJCXJldHVybiAwOwoKCXNldF9vZmZfcGl0Y2gocGFyLCBpbmZvKTsKCWlmICgodmFyLT5hY3RpdmF0ZSAmIEZCX0FDVElWQVRFX1ZCTCkgJiYgIWF0eV9lbmFibGVfaXJxKHBhciwgMCkpIHsKCQlwYXItPnZibGFuay5wYW5fZGlzcGxheSA9IDE7Cgl9IGVsc2UgewoJCXBhci0+dmJsYW5rLnBhbl9kaXNwbGF5ID0gMDsKCQlhdHlfc3RfbGUzMihDUlRDX09GRl9QSVRDSCwgcGFyLT5jcnRjLm9mZl9waXRjaCwgcGFyKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBhdHlfd2FpdGZvcnZibGFuayhzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsIHUzMiBjcnRjKQp7CglzdHJ1Y3QgYXR5X2ludGVycnVwdCAqdmJsOwoJdW5zaWduZWQgaW50IGNvdW50OwoJaW50IHJldDsKCglzd2l0Y2ggKGNydGMpIHsKCWNhc2UgMDoKCQl2YmwgPSAmcGFyLT52Ymxhbms7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiAtRU5PREVWOwoJfQoKCXJldCA9IGF0eV9lbmFibGVfaXJxKHBhciwgMCk7CglpZiAocmV0KQoJCXJldHVybiByZXQ7CgoJY291bnQgPSB2YmwtPmNvdW50OwoJcmV0ID0gd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQodmJsLT53YWl0LCBjb3VudCAhPSB2YmwtPmNvdW50LCBIWi8xMCk7CglpZiAocmV0IDwgMCkgewoJCXJldHVybiByZXQ7Cgl9CglpZiAocmV0ID09IDApIHsKCQlhdHlfZW5hYmxlX2lycShwYXIsIDEpOwoJCXJldHVybiAtRVRJTUVET1VUOwoJfQoKCXJldHVybiAwOwp9CgoKI2lmZGVmIERFQlVHCiNkZWZpbmUgQVRZSU9fQ0xLUgkJMHg0MTU0NTkwMAkvKiBBVFlcMDAgKi8KI2RlZmluZSBBVFlJT19DTEtXCQkweDQxNTQ1OTAxCS8qIEFUWVwwMSAqLwoKc3RydWN0IGF0eWNsayB7Cgl1MzIgcmVmX2Nsa19wZXI7Cgl1OCBwbGxfcmVmX2RpdjsKCXU4IG1jbGtfZmJfZGl2OwoJdTggbWNsa19wb3N0X2RpdjsJLyogMSwyLDMsNCw4ICovCgl1OCBtY2xrX2ZiX211bHQ7CS8qIDIgb3IgNCAqLwoJdTggeGNsa19wb3N0X2RpdjsJLyogMSwyLDMsNCw4ICovCgl1OCB2Y2xrX2ZiX2RpdjsKCXU4IHZjbGtfcG9zdF9kaXY7CS8qIDEsMiwzLDQsNiw4LDEyICovCgl1MzIgZHNwX3hjbGtzX3Blcl9yb3c7CS8qIDAtMTYzODMgKi8KCXUzMiBkc3BfbG9vcF9sYXRlbmN5OwkvKiAwLTE1ICovCgl1MzIgZHNwX3ByZWNpc2lvbjsJLyogMC03ICovCgl1MzIgZHNwX29uOwkJLyogMC0yMDQ3ICovCgl1MzIgZHNwX29mZjsJCS8qIDAtMjA0NyAqLwp9OwoKI2RlZmluZSBBVFlJT19GRUFUUgkJMHg0MTU0NTkwMgkvKiBBVFlcMDIgKi8KI2RlZmluZSBBVFlJT19GRUFUVwkJMHg0MTU0NTkwMwkvKiBBVFlcMDMgKi8KI2VuZGlmCgojaWZuZGVmIEZCSU9fV0FJVEZPUlZTWU5DCiNkZWZpbmUgRkJJT19XQUlURk9SVlNZTkMgX0lPVygnRicsIDB4MjAsIF9fdTMyKQojZW5kaWYKCnN0YXRpYyBpbnQgYXR5ZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVfaW50IGNtZCwgdV9sb25nIGFyZykKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwojaWZkZWYgX19zcGFyY19fCglzdHJ1Y3QgZmJ0eXBlIGZidHlwOwojZW5kaWYKCglzd2l0Y2ggKGNtZCkgewojaWZkZWYgX19zcGFyY19fCgljYXNlIEZCSU9HVFlQRToKCQlmYnR5cC5mYl90eXBlID0gRkJUWVBFX1BDSV9HRU5FUklDOwoJCWZidHlwLmZiX3dpZHRoID0gcGFyLT5jcnRjLnZ4cmVzOwoJCWZidHlwLmZiX2hlaWdodCA9IHBhci0+Y3J0Yy52eXJlczsKCQlmYnR5cC5mYl9kZXB0aCA9IGluZm8tPnZhci5iaXRzX3Blcl9waXhlbDsKCQlmYnR5cC5mYl9jbXNpemUgPSBpbmZvLT5jbWFwLmxlbjsKCQlmYnR5cC5mYl9zaXplID0gaW5mby0+Zml4LnNtZW1fbGVuOwoJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBmYnR5cGUgX191c2VyICopIGFyZywgJmZidHlwLCBzaXplb2YoZmJ0eXApKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJYnJlYWs7CiNlbmRpZiAvKiBfX3NwYXJjX18gKi8KCgljYXNlIEZCSU9fV0FJVEZPUlZTWU5DOgoJCXsKCQkJdTMyIGNydGM7CgoJCQlpZiAoZ2V0X3VzZXIoY3J0YywgKF9fdTMyIF9fdXNlciAqKSBhcmcpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgoJCQlyZXR1cm4gYXR5X3dhaXRmb3J2YmxhbmsocGFyLCBjcnRjKTsKCQl9CgkJYnJlYWs7CgojaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0NUKQoJY2FzZSBBVFlJT19DTEtSOgoJCWlmIChNNjRfSEFTKElOVEVHUkFURUQpKSB7CgkJCXN0cnVjdCBhdHljbGsgY2xrOwoJCQl1bmlvbiBhdHlfcGxsICpwbGwgPSAmKHBhci0+cGxsKTsKCQkJdTMyIGRzcF9jb25maWcgPSBwbGwtPmN0LmRzcF9jb25maWc7CgkJCXUzMiBkc3Bfb25fb2ZmID0gcGxsLT5jdC5kc3Bfb25fb2ZmOwoJCQljbGsucmVmX2Nsa19wZXIgPSBwYXItPnJlZl9jbGtfcGVyOwoJCQljbGsucGxsX3JlZl9kaXYgPSBwbGwtPmN0LnBsbF9yZWZfZGl2OwoJCQljbGsubWNsa19mYl9kaXYgPSBwbGwtPmN0Lm1jbGtfZmJfZGl2OwoJCQljbGsubWNsa19wb3N0X2RpdiA9IHBsbC0+Y3QubWNsa19wb3N0X2Rpdl9yZWFsOwoJCQljbGsubWNsa19mYl9tdWx0ID0gcGxsLT5jdC5tY2xrX2ZiX211bHQ7CgkJCWNsay54Y2xrX3Bvc3RfZGl2ID0gcGxsLT5jdC54Y2xrX3Bvc3RfZGl2X3JlYWw7CgkJCWNsay52Y2xrX2ZiX2RpdiA9IHBsbC0+Y3QudmNsa19mYl9kaXY7CgkJCWNsay52Y2xrX3Bvc3RfZGl2ID0gcGxsLT5jdC52Y2xrX3Bvc3RfZGl2X3JlYWw7CgkJCWNsay5kc3BfeGNsa3NfcGVyX3JvdyA9IGRzcF9jb25maWcgJiAweDNmZmY7CgkJCWNsay5kc3BfbG9vcF9sYXRlbmN5ID0gKGRzcF9jb25maWcgPj4gMTYpICYgMHhmOwoJCQljbGsuZHNwX3ByZWNpc2lvbiA9IChkc3BfY29uZmlnID4+IDIwKSAmIDc7CgkJCWNsay5kc3Bfb2ZmID0gZHNwX29uX29mZiAmIDB4N2ZmOwoJCQljbGsuZHNwX29uID0gKGRzcF9vbl9vZmYgPj4gMTYpICYgMHg3ZmY7CgkJCWlmIChjb3B5X3RvX3VzZXIoKHN0cnVjdCBhdHljbGsgX191c2VyICopIGFyZywgJmNsaywKCQkJCQkgc2l6ZW9mKGNsaykpKQoJCQkJcmV0dXJuIC1FRkFVTFQ7CgkJfSBlbHNlCgkJCXJldHVybiAtRUlOVkFMOwoJCWJyZWFrOwoJY2FzZSBBVFlJT19DTEtXOgoJCWlmIChNNjRfSEFTKElOVEVHUkFURUQpKSB7CgkJCXN0cnVjdCBhdHljbGsgY2xrOwoJCQl1bmlvbiBhdHlfcGxsICpwbGwgPSAmKHBhci0+cGxsKTsKCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjbGssIChzdHJ1Y3QgYXR5Y2xrIF9fdXNlciAqKSBhcmcsIHNpemVvZihjbGspKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlwYXItPnJlZl9jbGtfcGVyID0gY2xrLnJlZl9jbGtfcGVyOwoJCQlwbGwtPmN0LnBsbF9yZWZfZGl2ID0gY2xrLnBsbF9yZWZfZGl2OwoJCQlwbGwtPmN0Lm1jbGtfZmJfZGl2ID0gY2xrLm1jbGtfZmJfZGl2OwoJCQlwbGwtPmN0Lm1jbGtfcG9zdF9kaXZfcmVhbCA9IGNsay5tY2xrX3Bvc3RfZGl2OwoJCQlwbGwtPmN0Lm1jbGtfZmJfbXVsdCA9IGNsay5tY2xrX2ZiX211bHQ7CgkJCXBsbC0+Y3QueGNsa19wb3N0X2Rpdl9yZWFsID0gY2xrLnhjbGtfcG9zdF9kaXY7CgkJCXBsbC0+Y3QudmNsa19mYl9kaXYgPSBjbGsudmNsa19mYl9kaXY7CgkJCXBsbC0+Y3QudmNsa19wb3N0X2Rpdl9yZWFsID0gY2xrLnZjbGtfcG9zdF9kaXY7CgkJCXBsbC0+Y3QuZHNwX2NvbmZpZyA9IChjbGsuZHNwX3hjbGtzX3Blcl9yb3cgJiAweDNmZmYpIHwKCQkJCSgoY2xrLmRzcF9sb29wX2xhdGVuY3kgJiAweGYpPDwxNil8ICgoY2xrLmRzcF9wcmVjaXNpb24gJiA3KTw8MjApOwoJCQlwbGwtPmN0LmRzcF9vbl9vZmYgPSAoY2xrLmRzcF9vZmYgJiAweDdmZikgfCAoKGNsay5kc3Bfb24gJiAweDdmZik8PDE2KTsKCQkJLyphdHlfY2FsY19wbGxfY3QoaW5mbywgJnBsbC0+Y3QpOyovCgkJCWF0eV9zZXRfcGxsX2N0KGluZm8sIHBsbCk7CgkJfSBlbHNlCgkJCXJldHVybiAtRUlOVkFMOwoJCWJyZWFrOwoJY2FzZSBBVFlJT19GRUFUUjoKCQlpZiAoZ2V0X3VzZXIocGFyLT5mZWF0dXJlcywgKHUzMiBfX3VzZXIgKikgYXJnKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgkJYnJlYWs7CgljYXNlIEFUWUlPX0ZFQVRXOgoJCWlmIChwdXRfdXNlcihwYXItPmZlYXR1cmVzLCAodTMyIF9fdXNlciAqKSBhcmcpKQoJCQlyZXR1cm4gLUVGQVVMVDsKCQlicmVhazsKI2VuZGlmIC8qIERFQlVHICYmIENPTkZJR19GQl9BVFlfQ1QgKi8KCWRlZmF1bHQ6CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBhdHlmYl9zeW5jKHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CgoJaWYgKHBhci0+YmxpdHRlcl9tYXlfYmVfYnVzeSkKCQl3YWl0X2Zvcl9pZGxlKHBhcik7CglyZXR1cm4gMDsKfQoKI2lmZGVmIF9fc3BhcmNfXwpzdGF0aWMgaW50IGF0eWZiX21tYXAoc3RydWN0IGZiX2luZm8gKmluZm8sIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7Cgl1bnNpZ25lZCBpbnQgc2l6ZSwgcGFnZSwgbWFwX3NpemUgPSAwOwoJdW5zaWduZWQgbG9uZyBtYXBfb2Zmc2V0ID0gMDsKCXVuc2lnbmVkIGxvbmcgb2ZmOwoJaW50IGk7CgoJaWYgKCFwYXItPm1tYXBfbWFwKQoJCXJldHVybiAtRU5YSU87CgoJaWYgKHZtYS0+dm1fcGdvZmYgPiAofjBVTCA+PiBQQUdFX1NISUZUKSkKCQlyZXR1cm4gLUVJTlZBTDsKCglvZmYgPSB2bWEtPnZtX3Bnb2ZmIDw8IFBBR0VfU0hJRlQ7CglzaXplID0gdm1hLT52bV9lbmQgLSB2bWEtPnZtX3N0YXJ0OwoKCS8qIFRvIHN0b3AgdGhlIHN3YXBwZXIgZnJvbSBldmVuIGNvbnNpZGVyaW5nIHRoZXNlIHBhZ2VzLiAqLwoJdm1hLT52bV9mbGFncyB8PSAoVk1fSU8gfCBWTV9SRVNFUlZFRCk7CgoJaWYgKCgodm1hLT52bV9wZ29mZiA9PSAwKSAmJiAoc2l6ZSA9PSBpbmZvLT5maXguc21lbV9sZW4pKSB8fAoJICAgICgob2ZmID09IGluZm8tPmZpeC5zbWVtX2xlbikgJiYgKHNpemUgPT0gUEFHRV9TSVpFKSkpCgkJb2ZmICs9IDB4ODAwMDAwMDAwMDAwMDAwMFVMOwoKCXZtYS0+dm1fcGdvZmYgPSBvZmYgPj4gUEFHRV9TSElGVDsJLyogcHJvcGFnYXRlIG9mZiBjaGFuZ2VzICovCgoJLyogRWFjaCBwYWdlLCBzZWUgd2hpY2ggbWFwIGFwcGxpZXMgKi8KCWZvciAocGFnZSA9IDA7IHBhZ2UgPCBzaXplOykgewoJCW1hcF9zaXplID0gMDsKCQlmb3IgKGkgPSAwOyBwYXItPm1tYXBfbWFwW2ldLnNpemU7IGkrKykgewoJCQl1bnNpZ25lZCBsb25nIHN0YXJ0ID0gcGFyLT5tbWFwX21hcFtpXS52b2ZmOwoJCQl1bnNpZ25lZCBsb25nIGVuZCA9IHN0YXJ0ICsgcGFyLT5tbWFwX21hcFtpXS5zaXplOwoJCQl1bnNpZ25lZCBsb25nIG9mZnNldCA9IG9mZiArIHBhZ2U7CgoJCQlpZiAoc3RhcnQgPiBvZmZzZXQpCgkJCQljb250aW51ZTsKCQkJaWYgKG9mZnNldCA+PSBlbmQpCgkJCQljb250aW51ZTsKCgkJCW1hcF9zaXplID0gcGFyLT5tbWFwX21hcFtpXS5zaXplIC0gKG9mZnNldCAtIHN0YXJ0KTsKCQkJbWFwX29mZnNldCA9CgkJCSAgICBwYXItPm1tYXBfbWFwW2ldLnBvZmYgKyAob2Zmc2V0IC0gc3RhcnQpOwoJCQlicmVhazsKCQl9CgkJaWYgKCFtYXBfc2l6ZSkgewoJCQlwYWdlICs9IFBBR0VfU0laRTsKCQkJY29udGludWU7CgkJfQoJCWlmIChwYWdlICsgbWFwX3NpemUgPiBzaXplKQoJCQltYXBfc2l6ZSA9IHNpemUgLSBwYWdlOwoKCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSAmPQoJCSAgICB+KHBhci0+bW1hcF9tYXBbaV0ucHJvdF9tYXNrKTsKCQlwZ3Byb3RfdmFsKHZtYS0+dm1fcGFnZV9wcm90KSB8PSBwYXItPm1tYXBfbWFwW2ldLnByb3RfZmxhZzsKCgkJaWYgKHJlbWFwX3Bmbl9yYW5nZSh2bWEsIHZtYS0+dm1fc3RhcnQgKyBwYWdlLAoJCQltYXBfb2Zmc2V0ID4+IFBBR0VfU0hJRlQsIG1hcF9zaXplLCB2bWEtPnZtX3BhZ2VfcHJvdCkpCgkJCXJldHVybiAtRUFHQUlOOwoKCQlwYWdlICs9IG1hcF9zaXplOwoJfQoKCWlmICghbWFwX3NpemUpCgkJcmV0dXJuIC1FSU5WQUw7CgoJaWYgKCFwYXItPm1tYXBlZCkKCQlwYXItPm1tYXBlZCA9IDE7CglyZXR1cm4gMDsKfQoKc3RhdGljIHN0cnVjdCB7Cgl1MzIgeW9mZnNldDsKCXU4IHJbMl1bMjU2XTsKCXU4IGdbMl1bMjU2XTsKCXU4IGJbMl1bMjU2XTsKfSBhdHlmYl9zYXZlOwoKc3RhdGljIHZvaWQgYXR5ZmJfc2F2ZV9wYWxldHRlKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgaW50IGVudGVyKQp7CglpbnQgaSwgdG1wOwoKCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgewoJCXRtcCA9IGF0eV9sZF84KERBQ19DTlRMLCBwYXIpICYgMHhmYzsKCQlpZiAoTTY0X0hBUyhFWFRSQV9CUklHSFQpKQoJCQl0bXAgfD0gMHgyOwoJCWF0eV9zdF84KERBQ19DTlRMLCB0bXAsIHBhcik7CgkJYXR5X3N0XzgoREFDX01BU0ssIDB4ZmYsIHBhcik7CgoJCWF0eV9zdF84KERBQ19SX0lOREVYLCBpLCBwYXIpOwoJCWF0eWZiX3NhdmUucltlbnRlcl1baV0gPSBhdHlfbGRfOChEQUNfREFUQSwgcGFyKTsKCQlhdHlmYl9zYXZlLmdbZW50ZXJdW2ldID0gYXR5X2xkXzgoREFDX0RBVEEsIHBhcik7CgkJYXR5ZmJfc2F2ZS5iW2VudGVyXVtpXSA9IGF0eV9sZF84KERBQ19EQVRBLCBwYXIpOwoJCWF0eV9zdF84KERBQ19XX0lOREVYLCBpLCBwYXIpOwoJCWF0eV9zdF84KERBQ19EQVRBLCBhdHlmYl9zYXZlLnJbMSAtIGVudGVyXVtpXSwgcGFyKTsKCQlhdHlfc3RfOChEQUNfREFUQSwgYXR5ZmJfc2F2ZS5nWzEgLSBlbnRlcl1baV0sIHBhcik7CgkJYXR5X3N0XzgoREFDX0RBVEEsIGF0eWZiX3NhdmUuYlsxIC0gZW50ZXJdW2ldLCBwYXIpOwoJfQp9CgpzdGF0aWMgdm9pZCBhdHlmYl9wYWxldHRlKGludCBlbnRlcikKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyOwoJc3RydWN0IGZiX2luZm8gKmluZm87CglpbnQgaTsKCglmb3IgKGkgPSAwOyBpIDwgRkJfTUFYOyBpKyspIHsKCQlpbmZvID0gcmVnaXN0ZXJlZF9mYltpXTsKCQlpZiAoaW5mbyAmJiBpbmZvLT5mYm9wcyA9PSAmYXR5ZmJfb3BzKSB7CgkJCXBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCQkJCgkJCWF0eWZiX3NhdmVfcGFsZXR0ZShwYXIsIGVudGVyKTsKCQkJaWYgKGVudGVyKSB7CgkJCQlhdHlmYl9zYXZlLnlvZmZzZXQgPSBpbmZvLT52YXIueW9mZnNldDsKCQkJCWluZm8tPnZhci55b2Zmc2V0ID0gMDsKCQkJCXNldF9vZmZfcGl0Y2gocGFyLCBpbmZvKTsKCQkJfSBlbHNlIHsKCQkJCWluZm8tPnZhci55b2Zmc2V0ID0gYXR5ZmJfc2F2ZS55b2Zmc2V0OwoJCQkJc2V0X29mZl9waXRjaChwYXIsIGluZm8pOwoJCQl9CgkJCWF0eV9zdF9sZTMyKENSVENfT0ZGX1BJVENILCBwYXItPmNydGMub2ZmX3BpdGNoLCBwYXIpOwoJCQlicmVhazsKCQl9Cgl9Cn0KI2VuZGlmIC8qIF9fc3BhcmNfXyAqLwoKCgojaWYgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1BDSSkKCiNpZmRlZiBDT05GSUdfUFBDX1BNQUMKLyogUG93ZXIgbWFuYWdlbWVudCByb3V0aW5lcy4gVGhvc2UgYXJlIHVzZWQgZm9yIFBvd2VyQm9vayBzbGVlcC4KICovCnN0YXRpYyBpbnQgYXR5X3Bvd2VyX21nbXQoaW50IHNsZWVwLCBzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIpCnsKCXUzMiBwbTsKCWludCB0aW1lb3V0OwoKCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJcG0gPSAocG0gJiB+UFdSX01HVF9NT0RFX01BU0spIHwgUFdSX01HVF9NT0RFX1JFRzsKCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CglwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCgl0aW1lb3V0ID0gMjAwMDsKCWlmIChzbGVlcCkgewoJCS8qIFNsZWVwICovCgkJcG0gJj0gflBXUl9NR1RfT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQl1ZGVsYXkoMTApOwoJCXBtICY9IH4oUFdSX0JMT04gfCBBVVRPX1BXUl9VUCk7CgkJcG0gfD0gU1VTUEVORF9OT1c7CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQl1ZGVsYXkoMTApOwoJCXBtIHw9IFBXUl9NR1RfT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCQlkbyB7CgkJCXBtID0gYXR5X2xkX2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwYXIpOwoJCQltZGVsYXkoMSk7CgkJCWlmICgoLS10aW1lb3V0KSA9PSAwKQoJCQkJYnJlYWs7CgkJfSB3aGlsZSAoKHBtICYgUFdSX01HVF9TVEFUVVNfTUFTSykgIT0gUFdSX01HVF9TVEFUVVNfU1VTUEVORCk7Cgl9IGVsc2UgewoJCS8qIFdha2V1cCAqLwoJCXBtICY9IH5QV1JfTUdUX09OOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CgkJcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJdWRlbGF5KDEwKTsKCQlwbSAmPSB+U1VTUEVORF9OT1c7CgkJcG0gfD0gKFBXUl9CTE9OIHwgQVVUT19QV1JfVVApOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CgkJcG0gPSBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcik7CgkJdWRlbGF5KDEwKTsKCQlwbSB8PSBQV1JfTUdUX09OOwoJCWF0eV9zdF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcG0sIHBhcik7CgkJZG8gewoJCQlwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQkJbWRlbGF5KDEpOwoJCQlpZiAoKC0tdGltZW91dCkgPT0gMCkKCQkJCWJyZWFrOwoJCX0gd2hpbGUgKChwbSAmIFBXUl9NR1RfU1RBVFVTX01BU0spICE9IDApOwoJfQoJbWRlbGF5KDUwMCk7CgoJcmV0dXJuIHRpbWVvdXQgPyAwIDogLUVJTzsKfQojZW5kaWYKCnN0YXRpYyBpbnQgYXR5ZmJfcGNpX3N1c3BlbmQoc3RydWN0IHBjaV9kZXYgKnBkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKewoJc3RydWN0IGZiX2luZm8gKmluZm8gPSBwY2lfZ2V0X2RydmRhdGEocGRldik7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7CgoJaWYgKHN0YXRlLmV2ZW50ID09IHBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZS5ldmVudCkKCQlyZXR1cm4gMDsKCglhY3F1aXJlX2NvbnNvbGVfc2VtKCk7CgoJZmJfc2V0X3N1c3BlbmQoaW5mbywgMSk7CgoJLyogSWRsZSAmIHJlc2V0IGVuZ2luZSAqLwoJd2FpdF9mb3JfaWRsZShwYXIpOwoJYXR5X3Jlc2V0X2VuZ2luZShwYXIpOwoKCS8qIEJsYW5rIGRpc3BsYXkgYW5kIExDRCAqLwoJYXR5ZmJfYmxhbmsoRkJfQkxBTktfUE9XRVJET1dOLCBpbmZvKTsKCglwYXItPmFzbGVlcCA9IDE7CglwYXItPmxvY2tfYmxhbmsgPSAxOwoKI2lmZGVmIENPTkZJR19QUENfUE1BQwoJLyogU2V0IGNoaXAgdG8gInN1c3BlbmQiIG1vZGUgKi8KCWlmIChhdHlfcG93ZXJfbWdtdCgxLCBwYXIpKSB7CgkJcGFyLT5hc2xlZXAgPSAwOwoJCXBhci0+bG9ja19ibGFuayA9IDA7CgkJYXR5ZmJfYmxhbmsoRkJfQkxBTktfVU5CTEFOSywgaW5mbyk7CgkJZmJfc2V0X3N1c3BlbmQoaW5mbywgMCk7CgkJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwoJCXJldHVybiAtRUlPOwoJfQojZWxzZQoJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBwY2lfY2hvb3NlX3N0YXRlKHBkZXYsIHN0YXRlKSk7CiNlbmRpZgoKCXJlbGVhc2VfY29uc29sZV9zZW0oKTsKCglwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUgPSBzdGF0ZTsKCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBhdHlmYl9wY2lfcmVzdW1lKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCglpZiAocGRldi0+ZGV2LnBvd2VyLnBvd2VyX3N0YXRlLmV2ZW50ID09IFBNX0VWRU5UX09OKQoJCXJldHVybiAwOwoKCWFjcXVpcmVfY29uc29sZV9zZW0oKTsKCiNpZmRlZiBDT05GSUdfUFBDX1BNQUMKCWlmIChwZGV2LT5kZXYucG93ZXIucG93ZXJfc3RhdGUuZXZlbnQgPT0gMikKCQlhdHlfcG93ZXJfbWdtdCgwLCBwYXIpOwojZWxzZQoJcGNpX3NldF9wb3dlcl9zdGF0ZShwZGV2LCBQQ0lfRDApOwojZW5kaWYKCglhdHlfcmVzdW1lX2NoaXAoaW5mbyk7CgoJcGFyLT5hc2xlZXAgPSAwOwoKCS8qIFJlc3RvcmUgZGlzcGxheSAqLwoJYXR5ZmJfc2V0X3BhcihpbmZvKTsKCgkvKiBSZWZyZXNoICovCglmYl9zZXRfc3VzcGVuZChpbmZvLCAwKTsKCgkvKiBVbmJsYW5rICovCglwYXItPmxvY2tfYmxhbmsgPSAwOwoJYXR5ZmJfYmxhbmsoRkJfQkxBTktfVU5CTEFOSywgaW5mbyk7CgoJcmVsZWFzZV9jb25zb2xlX3NlbSgpOwoKCXBkZXYtPmRldi5wb3dlci5wb3dlcl9zdGF0ZSA9IFBNU0dfT047CgoJcmV0dXJuIDA7Cn0KCiNlbmRpZiAvKiAgZGVmaW5lZChDT05GSUdfUE0pICYmIGRlZmluZWQoQ09ORklHX1BDSSkgKi8KCi8qIEJhY2tsaWdodCAqLwojaWZkZWYgQ09ORklHX0ZCX0FUWV9CQUNLTElHSFQKI2RlZmluZSBNQVhfTEVWRUwgMHhGRgoKc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBhdHlfYmxfZGF0YTsKCi8qIENhbGwgd2l0aCBmYl9pbmZvLT5ibF9tdXRleCBoZWxkICovCnN0YXRpYyBpbnQgYXR5X2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgaW50IGxldmVsKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOwoJaW50IGF0eWxldmVsOwoKCS8qIEdldCBhbmQgY29udmVydCB0aGUgdmFsdWUgKi8KCWF0eWxldmVsID0gaW5mby0+YmxfY3VydmVbbGV2ZWxdICogRkJfQkFDS0xJR0hUX01BWCAvIE1BWF9MRVZFTDsKCglpZiAoYXR5bGV2ZWwgPCAwKQoJCWF0eWxldmVsID0gMDsKCWVsc2UgaWYgKGF0eWxldmVsID4gTUFYX0xFVkVMKQoJCWF0eWxldmVsID0gTUFYX0xFVkVMOwoKCXJldHVybiBhdHlsZXZlbDsKfQoKLyogQ2FsbCB3aXRoIGZiX2luZm8tPmJsX211dGV4IGhlbGQgKi8Kc3RhdGljIGludCBfX2F0eV9ibF91cGRhdGVfc3RhdHVzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gY2xhc3NfZ2V0X2RldmRhdGEoJmJkLT5jbGFzc19kZXYpOwoJdW5zaWduZWQgaW50IHJlZyA9IGF0eV9sZF9sY2QoTENEX01JU0NfQ05UTCwgcGFyKTsKCWludCBsZXZlbDsKCglpZiAoYmQtPnByb3BzLT5wb3dlciAhPSBGQl9CTEFOS19VTkJMQU5LIHx8CgkgICAgYmQtPnByb3BzLT5mYl9ibGFuayAhPSBGQl9CTEFOS19VTkJMQU5LKQoJCWxldmVsID0gMDsKCWVsc2UKCQlsZXZlbCA9IGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKCglyZWcgfD0gKEJMTU9EX0VOIHwgQklBU01PRF9FTik7CglpZiAobGV2ZWwgPiAwKSB7CgkJcmVnICY9IH5CSUFTX01PRF9MRVZFTF9NQVNLOwoJCXJlZyB8PSAoYXR5X2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBhciwgbGV2ZWwpIDw8IEJJQVNfTU9EX0xFVkVMX1NISUZUKTsKCX0gZWxzZSB7CgkJcmVnICY9IH5CSUFTX01PRF9MRVZFTF9NQVNLOwoJCXJlZyB8PSAoYXR5X2JsX2dldF9sZXZlbF9icmlnaHRuZXNzKHBhciwgMCkgPDwgQklBU19NT0RfTEVWRUxfU0hJRlQpOwoJfQoJYXR5X3N0X2xjZChMQ0RfTUlTQ19DTlRMLCByZWcsIHBhcik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYXR5X2JsX3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSBjbGFzc19nZXRfZGV2ZGF0YSgmYmQtPmNsYXNzX2Rldik7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOwoJaW50IHJldDsKCgltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CglyZXQgPSBfX2F0eV9ibF91cGRhdGVfc3RhdHVzKGJkKTsKCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgYXR5X2JsX2dldF9icmlnaHRuZXNzKHN0cnVjdCBiYWNrbGlnaHRfZGV2aWNlICpiZCkKewoJcmV0dXJuIGJkLT5wcm9wcy0+YnJpZ2h0bmVzczsKfQoKc3RhdGljIHN0cnVjdCBiYWNrbGlnaHRfcHJvcGVydGllcyBhdHlfYmxfZGF0YSA9IHsKCS5vd25lcgkgID0gVEhJU19NT0RVTEUsCgkuZ2V0X2JyaWdodG5lc3MgPSBhdHlfYmxfZ2V0X2JyaWdodG5lc3MsCgkudXBkYXRlX3N0YXR1cwk9IGF0eV9ibF91cGRhdGVfc3RhdHVzLAoJLm1heF9icmlnaHRuZXNzID0gKEZCX0JBQ0tMSUdIVF9MRVZFTFMgLSAxKSwKfTsKCnN0YXRpYyB2b2lkIGF0eV9ibF9zZXRfcG93ZXIoc3RydWN0IGZiX2luZm8gKmluZm8sIGludCBwb3dlcikKewoJbXV0ZXhfbG9jaygmaW5mby0+YmxfbXV0ZXgpOwoKCWlmIChpbmZvLT5ibF9kZXYpIHsKCQlkb3duKCZpbmZvLT5ibF9kZXYtPnNlbSk7CgkJaW5mby0+YmxfZGV2LT5wcm9wcy0+cG93ZXIgPSBwb3dlcjsKCQlfX2F0eV9ibF91cGRhdGVfc3RhdHVzKGluZm8tPmJsX2Rldik7CgkJdXAoJmluZm8tPmJsX2Rldi0+c2VtKTsKCX0KCgltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKfQoKc3RhdGljIHZvaWQgYXR5X2JsX2luaXQoc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOwoJc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkOwoJY2hhciBuYW1lWzEyXTsKCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKCWlmICghcG1hY19oYXNfYmFja2xpZ2h0X3R5cGUoImF0aSIpKQoJCXJldHVybjsKI2VuZGlmCgoJc25wcmludGYobmFtZSwgc2l6ZW9mKG5hbWUpLCAiYXR5YmwlZCIsIGluZm8tPm5vZGUpOwoKCWJkID0gYmFja2xpZ2h0X2RldmljZV9yZWdpc3RlcihuYW1lLCBpbmZvLT5kZXYsIHBhciwgJmF0eV9ibF9kYXRhKTsKCWlmIChJU19FUlIoYmQpKSB7CgkJaW5mby0+YmxfZGV2ID0gTlVMTDsKCQlwcmludGsoS0VSTl9XQVJOSU5HICJhdHk6IEJhY2tsaWdodCByZWdpc3RyYXRpb24gZmFpbGVkXG4iKTsKCQlnb3RvIGVycm9yOwoJfQoKCW11dGV4X2xvY2soJmluZm8tPmJsX211dGV4KTsKCWluZm8tPmJsX2RldiA9IGJkOwoJZmJfYmxfZGVmYXVsdF9jdXJ2ZShpbmZvLCAwLAoJCTB4M0YgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMLAoJCTB4RkYgKiBGQl9CQUNLTElHSFRfTUFYIC8gTUFYX0xFVkVMKTsKCW11dGV4X3VubG9jaygmaW5mby0+YmxfbXV0ZXgpOwoKCWRvd24oJmJkLT5zZW0pOwoJYmQtPnByb3BzLT5icmlnaHRuZXNzID0gYXR5X2JsX2RhdGEubWF4X2JyaWdodG5lc3M7CgliZC0+cHJvcHMtPnBvd2VyID0gRkJfQkxBTktfVU5CTEFOSzsKCWJkLT5wcm9wcy0+dXBkYXRlX3N0YXR1cyhiZCk7Cgl1cCgmYmQtPnNlbSk7CgojaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCgltdXRleF9sb2NrKCZwbWFjX2JhY2tsaWdodF9tdXRleCk7CglpZiAoIXBtYWNfYmFja2xpZ2h0KQoJCXBtYWNfYmFja2xpZ2h0ID0gYmQ7CgltdXRleF91bmxvY2soJnBtYWNfYmFja2xpZ2h0X211dGV4KTsKI2VuZGlmCgoJcHJpbnRrKCJhdHk6IEJhY2tsaWdodCBpbml0aWFsaXplZCAoJXMpXG4iLCBuYW1lKTsKCglyZXR1cm47CgplcnJvcjoKCXJldHVybjsKfQoKc3RhdGljIHZvaWQgYXR5X2JsX2V4aXQoc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwYXItPnBkZXYpOwoKI2lmZGVmIENPTkZJR19QTUFDX0JBQ0tMSUdIVAoJbXV0ZXhfbG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOwojZW5kaWYKCgltdXRleF9sb2NrKCZpbmZvLT5ibF9tdXRleCk7CglpZiAoaW5mby0+YmxfZGV2KSB7CiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKCQlpZiAocG1hY19iYWNrbGlnaHQgPT0gaW5mby0+YmxfZGV2KQoJCQlwbWFjX2JhY2tsaWdodCA9IE5VTEw7CiNlbmRpZgoKCQliYWNrbGlnaHRfZGV2aWNlX3VucmVnaXN0ZXIoaW5mby0+YmxfZGV2KTsKCgkJcHJpbnRrKCJhdHk6IEJhY2tsaWdodCB1bmxvYWRlZFxuIik7Cgl9CgltdXRleF91bmxvY2soJmluZm8tPmJsX211dGV4KTsKCiNpZmRlZiBDT05GSUdfUE1BQ19CQUNLTElHSFQKCW11dGV4X3VubG9jaygmcG1hY19iYWNrbGlnaHRfbXV0ZXgpOwojZW5kaWYKfQoKI2VuZGlmIC8qIENPTkZJR19GQl9BVFlfQkFDS0xJR0hUICovCgpzdGF0aWMgdm9pZCBfX2RldmluaXQgYXR5X2NhbGNfbWVtX3JlZnJlc2goc3RydWN0IGF0eWZiX3BhciAqcGFyLCBpbnQgeGNsaykKewoJY29uc3QgaW50IHJhZ2Vwcm9fdGJsW10gPSB7CgkJNDQsIDUwLCA1NSwgNjYsIDc1LCA4MCwgMTAwCgl9OwoJY29uc3QgaW50IHJhZ2V4bF90YmxbXSA9IHsKCQk1MCwgNjYsIDc1LCA4MywgOTAsIDk1LCAxMDAsIDEwNSwKCQkxMTAsIDExNSwgMTIwLCAxMjUsIDEzMywgMTQzLCAxNjYKCX07Cgljb25zdCBpbnQgKnJlZnJlc2hfdGJsOwoJaW50IGksIHNpemU7CgoJaWYgKElTX1hMKHBhci0+cGNpX2lkKSB8fCBJU19NT0JJTElUWShwYXItPnBjaV9pZCkpIHsKCQlyZWZyZXNoX3RibCA9IHJhZ2V4bF90Ymw7CgkJc2l6ZSA9IEFSUkFZX1NJWkUocmFnZXhsX3RibCk7Cgl9IGVsc2UgewoJCXJlZnJlc2hfdGJsID0gcmFnZXByb190Ymw7CgkJc2l6ZSA9IEFSUkFZX1NJWkUocmFnZXByb190YmwpOwoJfQoKCWZvciAoaT0wOyBpIDwgc2l6ZTsgaSsrKSB7CgkJaWYgKHhjbGsgPCByZWZyZXNoX3RibFtpXSkKCQlicmVhazsKCX0KCXBhci0+bWVtX3JlZnJlc2hfcmF0ZSA9IGk7Cn0KCiAgICAvKgogICAgICogIEluaXRpYWxpc2F0aW9uCiAgICAgKi8KCnN0YXRpYyBzdHJ1Y3QgZmJfaW5mbyAqZmJfbGlzdCA9IE5VTEw7CgojaWYgZGVmaW5lZChfX2kzODZfXykgJiYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQpzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlmYl9nZXRfdGltaW5nc19mcm9tX2xjZChzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIsCgkJCQkJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQp7CglpbnQgcmV0ID0gLUVJTlZBTDsKCglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCAmJiAoYXR5X2xkX2xjZChMQ0RfR0VOX0NOVEwsIHBhcikgJiBMQ0RfT04pKSB7CgkJKnZhciA9IGRlZmF1bHRfdmFyOwoJCXZhci0+eHJlcyA9IHZhci0+eHJlc192aXJ0dWFsID0gcGFyLT5sY2RfaGRpc3A7CgkJdmFyLT5yaWdodF9tYXJnaW4gPSBwYXItPmxjZF9yaWdodF9tYXJnaW47CgkJdmFyLT5sZWZ0X21hcmdpbiA9IHBhci0+bGNkX2hibGFua19sZW4gLQoJCQkocGFyLT5sY2RfcmlnaHRfbWFyZ2luICsgcGFyLT5sY2RfaHN5bmNfZGx5ICsKCQkJIHBhci0+bGNkX2hzeW5jX2xlbik7CgkJdmFyLT5oc3luY19sZW4gPSBwYXItPmxjZF9oc3luY19sZW4gKyBwYXItPmxjZF9oc3luY19kbHk7CgkJdmFyLT55cmVzID0gdmFyLT55cmVzX3ZpcnR1YWwgPSBwYXItPmxjZF92ZGlzcDsKCQl2YXItPmxvd2VyX21hcmdpbiA9IHBhci0+bGNkX2xvd2VyX21hcmdpbjsKCQl2YXItPnVwcGVyX21hcmdpbiA9IHBhci0+bGNkX3ZibGFua19sZW4gLQoJCQkocGFyLT5sY2RfbG93ZXJfbWFyZ2luICsgcGFyLT5sY2RfdnN5bmNfbGVuKTsKCQl2YXItPnZzeW5jX2xlbiA9IHBhci0+bGNkX3ZzeW5jX2xlbjsKCQl2YXItPnBpeGNsb2NrID0gcGFyLT5sY2RfcGl4Y2xvY2s7CgkJcmV0ID0gMDsKCX0KCglyZXR1cm4gcmV0Owp9CiNlbmRpZiAvKiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpICovCgpzdGF0aWMgaW50IF9fZGV2aW5pdCBhdHlfaW5pdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gKHN0cnVjdCBhdHlmYl9wYXIgKikgaW5mby0+cGFyOwoJY29uc3QgY2hhciAqcmFtbmFtZSA9IE5VTEwsICp4dGFsOwoJaW50IGd0Yl9tZW1zaXplLCBoYXNfdmFyID0gMDsKCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB2YXI7CgoJaW5pdF93YWl0cXVldWVfaGVhZCgmcGFyLT52Ymxhbmsud2FpdCk7CglzcGluX2xvY2tfaW5pdCgmcGFyLT5pbnRfbG9jayk7CgojaWZkZWYgQ09ORklHX1BQQ19QTUFDCgkvKiBUaGUgQXBwbGUgaUJvb2sxIHVzZXMgbm9uLXN0YW5kYXJkIG1lbW9yeSBmcmVxdWVuY2llcy4gV2UgZGV0ZWN0IGl0CgkgKiBhbmQgc2V0IHRoZSBmcmVxdWVuY3kgbWFudWFsbHkuICovCglpZiAobWFjaGluZV9pc19jb21wYXRpYmxlKCJQb3dlckJvb2syLDEiKSkgewoJCXBhci0+cGxsX2xpbWl0cy5tY2xrID0gNzA7CgkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSA1MzsKCX0KI2VuZGlmCglpZiAocGxsKQoJCXBhci0+cGxsX2xpbWl0cy5wbGxfbWF4ID0gcGxsOwoJaWYgKG1jbGspCgkJcGFyLT5wbGxfbGltaXRzLm1jbGsgPSBtY2xrOwoJaWYgKHhjbGspCgkJcGFyLT5wbGxfbGltaXRzLnhjbGsgPSB4Y2xrOwoKCWF0eV9jYWxjX21lbV9yZWZyZXNoKHBhciwgcGFyLT5wbGxfbGltaXRzLnhjbGspOwoJcGFyLT5wbGxfcGVyID0gMTAwMDAwMC9wYXItPnBsbF9saW1pdHMucGxsX21heDsKCXBhci0+bWNsa19wZXIgPSAxMDAwMDAwL3Bhci0+cGxsX2xpbWl0cy5tY2xrOwoJcGFyLT54Y2xrX3BlciA9IDEwMDAwMDAvcGFyLT5wbGxfbGltaXRzLnhjbGs7CgoJcGFyLT5yZWZfY2xrX3BlciA9IDEwMDAwMDAwMDAwMDBVTEwgLyAxNDMxODE4MDsKCXh0YWwgPSAiMTQuMzE4MTgiOwoKI2lmZGVmIENPTkZJR19GQl9BVFlfR1gKCWlmICghTTY0X0hBUyhJTlRFR1JBVEVEKSkgewoJCXUzMiBzdGF0MDsKCQl1OCBkYWNfdHlwZSwgZGFjX3N1YnR5cGUsIGNsa190eXBlOwoJCXN0YXQwID0gYXR5X2xkX2xlMzIoQ09ORklHX1NUQVQwLCBwYXIpOwoJCXBhci0+YnVzX3R5cGUgPSAoc3RhdDAgPj4gMCkgJiAweDA3OwoJCXBhci0+cmFtX3R5cGUgPSAoc3RhdDAgPj4gMykgJiAweDA3OwoJCXJhbW5hbWUgPSBhdHlfZ3hfcmFtW3Bhci0+cmFtX3R5cGVdOwoJCS8qIEZJWE1FOiBjbG9ja2NoaXAvUkFNREFDIHByb2Jpbmc/ICovCgkJZGFjX3R5cGUgPSAoYXR5X2xkX2xlMzIoREFDX0NOVEwsIHBhcikgPj4gMTYpICYgMHgwNzsKI2lmZGVmIENPTkZJR19BVEFSSQoJCWNsa190eXBlID0gQ0xLX0FUSTE4ODE4XzE7CgkJZGFjX3R5cGUgPSAoc3RhdDAgPj4gOSkgJiAweDA3OwoJCWlmIChkYWNfdHlwZSA9PSAweDA3KQoJCQlkYWNfc3VidHlwZSA9IERBQ19BVFQyMEM0MDg7CgkJZWxzZQoJCQlkYWNfc3VidHlwZSA9IChhdHlfbGRfOChTQ1JBVENIX1JFRzEgKyAxLCBwYXIpICYgMHhGMCkgfCBkYWNfdHlwZTsKI2Vsc2UKCQlkYWNfdHlwZSA9IERBQ19JQk1SR0I1MTQ7CgkJZGFjX3N1YnR5cGUgPSBEQUNfSUJNUkdCNTE0OwoJCWNsa190eXBlID0gQ0xLX0lCTVJHQjUxNDsKI2VuZGlmCgkJc3dpdGNoIChkYWNfc3VidHlwZSkgewoJCWNhc2UgREFDX0lCTVJHQjUxNDoKCQkJcGFyLT5kYWNfb3BzID0gJmF0eV9kYWNfaWJtNTE0OwoJCQlicmVhazsKCQljYXNlIERBQ19BVEk2ODg2MF9COgoJCWNhc2UgREFDX0FUSTY4ODYwX0M6CgkJCXBhci0+ZGFjX29wcyA9ICZhdHlfZGFjX2F0aTY4ODYwYjsKCQkJYnJlYWs7CgkJY2FzZSBEQUNfQVRUMjBDNDA4OgoJCWNhc2UgREFDX0FUVDIxQzQ5ODoKCQkJcGFyLT5kYWNfb3BzID0gJmF0eV9kYWNfYXR0MjFjNDk4OwoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQlQUklOVEtJKCJhdHlfaW5pdDogREFDIHR5cGUgbm90IGltcGxlbWVudGVkIHlldCFcbiIpOwoJCQlwYXItPmRhY19vcHMgPSAmYXR5X2RhY191bnN1cHBvcnRlZDsKCQkJYnJlYWs7CgkJfQoJCXN3aXRjaCAoY2xrX3R5cGUpIHsKI2lmZGVmIENPTkZJR19BVEFSSQoJCWNhc2UgQ0xLX0FUSTE4ODE4XzE6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX2F0aTE4ODE4XzE7CgkJCWJyZWFrOwojZWxzZQoJCWNhc2UgQ0xLX0lCTVJHQjUxNDoKCQkJcGFyLT5wbGxfb3BzID0gJmF0eV9wbGxfaWJtNTE0OwoJCQlicmVhazsKI2VuZGlmCiNpZiAwIC8qIGRlYWQgY29kZSAqLwoJCWNhc2UgQ0xLX1NURzE3MDM6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX3N0ZzE3MDM7CgkJCWJyZWFrOwoJCWNhc2UgQ0xLX0NIODM5ODoKCQkJcGFyLT5wbGxfb3BzID0gJmF0eV9wbGxfY2g4Mzk4OwoJCQlicmVhazsKCQljYXNlIENMS19BVFQyMEM0MDg6CgkJCXBhci0+cGxsX29wcyA9ICZhdHlfcGxsX2F0dDIwYzQwODsKCQkJYnJlYWs7CiNlbmRpZgoJCWRlZmF1bHQ6CgkJCVBSSU5US0koImF0eV9pbml0OiBDTEsgdHlwZSBub3QgaW1wbGVtZW50ZWQgeWV0ISIpOwoJCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF91bnN1cHBvcnRlZDsKCQkJYnJlYWs7CgkJfQoJfQojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9HWCAqLwojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVAoJaWYgKE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQlwYXItPmRhY19vcHMgPSAmYXR5X2RhY19jdDsKCQlwYXItPnBsbF9vcHMgPSAmYXR5X3BsbF9jdDsKCQlwYXItPmJ1c190eXBlID0gUENJOwoJCXBhci0+cmFtX3R5cGUgPSAoYXR5X2xkX2xlMzIoQ09ORklHX1NUQVQwLCBwYXIpICYgMHgwNyk7CgkJcmFtbmFtZSA9IGF0eV9jdF9yYW1bcGFyLT5yYW1fdHlwZV07CgkJLyogZm9yIG1hbnkgY2hpcHMsIHRoZSBtY2xrIGlzIDY3IE1IeiBmb3IgU0RSQU0sIDYzIE1IeiBvdGhlcndpc2UgKi8KCQlpZiAocGFyLT5wbGxfbGltaXRzLm1jbGsgPT0gNjcgJiYgcGFyLT5yYW1fdHlwZSA8IFNEUkFNKQoJCQlwYXItPnBsbF9saW1pdHMubWNsayA9IDYzOwoJfQoKCWlmIChNNjRfSEFTKEdUQl9EU1ApKSB7CgkJdTggcGxsX3JlZl9kaXYgPSBhdHlfbGRfcGxsX2N0KFBMTF9SRUZfRElWLCBwYXIpOwoKCQlpZiAocGxsX3JlZl9kaXYpIHsKCQkJaW50IGRpZmYxLCBkaWZmMjsKCQkJZGlmZjEgPSA1MTAgKiAxNCAvIHBsbF9yZWZfZGl2IC0gcGFyLT5wbGxfbGltaXRzLnBsbF9tYXg7CgkJCWRpZmYyID0gNTEwICogMjkgLyBwbGxfcmVmX2RpdiAtIHBhci0+cGxsX2xpbWl0cy5wbGxfbWF4OwoJCQlpZiAoZGlmZjEgPCAwKQoJCQkJZGlmZjEgPSAtZGlmZjE7CgkJCWlmIChkaWZmMiA8IDApCgkJCQlkaWZmMiA9IC1kaWZmMjsKCQkJaWYgKGRpZmYyIDwgZGlmZjEpIHsKCQkJCXBhci0+cmVmX2Nsa19wZXIgPSAxMDAwMDAwMDAwMDAwVUxMIC8gMjk0OTg5Mjg7CgkJCQl4dGFsID0gIjI5LjQ5ODkyOCI7CgkJCX0KCQl9Cgl9CiNlbmRpZiAvKiBDT05GSUdfRkJfQVRZX0NUICovCgoJLyogc2F2ZSBwcmV2aW91cyB2aWRlbyBtb2RlICovCglhdHlfZ2V0X2NydGMocGFyLCAmc2F2ZWRfY3J0Yyk7CglpZihwYXItPnBsbF9vcHMtPmdldF9wbGwpCgkJcGFyLT5wbGxfb3BzLT5nZXRfcGxsKGluZm8sICZzYXZlZF9wbGwpOwoKCXBhci0+bWVtX2NudGwgPSBhdHlfbGRfbGUzMihNRU1fQ05UTCwgcGFyKTsKCWd0Yl9tZW1zaXplID0gTTY0X0hBUyhHVEJfRFNQKTsKCWlmIChndGJfbWVtc2l6ZSkKCQlzd2l0Y2ggKHBhci0+bWVtX2NudGwgJiAweEYpIHsJLyogMHhGIHVzZWQgaW5zdGVhZCBvZiBNRU1fU0laRV9BTElBUyAqLwoJCWNhc2UgTUVNX1NJWkVfNTEySzoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV8xTToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHgxMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfMk1fR1RCOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDIwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV80TV9HVEI6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4NDAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzZNX0dUQjoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg2MDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfOE1fR1RCOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDgwMDAwMDsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDsKCX0gZWxzZQoJCXN3aXRjaCAocGFyLT5tZW1fY250bCAmIE1FTV9TSVpFX0FMSUFTKSB7CgkJY2FzZSBNRU1fU0laRV81MTJLOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDgwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzFNOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDEwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV8yTToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHgyMDAwMDA7CgkJCWJyZWFrOwoJCWNhc2UgTUVNX1NJWkVfNE06CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4NDAwMDAwOwoJCQlicmVhazsKCQljYXNlIE1FTV9TSVpFXzZNOgoJCQlpbmZvLT5maXguc21lbV9sZW4gPSAweDYwMDAwMDsKCQkJYnJlYWs7CgkJY2FzZSBNRU1fU0laRV84TToKCQkJaW5mby0+Zml4LnNtZW1fbGVuID0gMHg4MDAwMDA7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWluZm8tPmZpeC5zbWVtX2xlbiA9IDB4ODAwMDA7CgkJfQoKCWlmIChNNjRfSEFTKE1BR0lDX1ZSQU1fU0laRSkpIHsKCQlpZiAoYXR5X2xkX2xlMzIoQ09ORklHX1NUQVQxLCBwYXIpICYgMHg0MDAwMDAwMCkKCQkJaW5mby0+Zml4LnNtZW1fbGVuICs9IDB4NDAwMDAwOwoJfQoKCWlmICh2cmFtKSB7CgkJaW5mby0+Zml4LnNtZW1fbGVuID0gdnJhbSAqIDEwMjQ7CgkJcGFyLT5tZW1fY250bCAmPSB+KGd0Yl9tZW1zaXplID8gMHhGIDogTUVNX1NJWkVfQUxJQVMpOwoJCWlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHg4MDAwMCkKCQkJcGFyLT5tZW1fY250bCB8PSBNRU1fU0laRV81MTJLOwoJCWVsc2UgaWYgKGluZm8tPmZpeC5zbWVtX2xlbiA8PSAweDEwMDAwMCkKCQkJcGFyLT5tZW1fY250bCB8PSBNRU1fU0laRV8xTTsKCQllbHNlIGlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHgyMDAwMDApCgkJCXBhci0+bWVtX2NudGwgfD0gZ3RiX21lbXNpemUgPyBNRU1fU0laRV8yTV9HVEIgOiBNRU1fU0laRV8yTTsKCQllbHNlIGlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHg0MDAwMDApCgkJCXBhci0+bWVtX2NudGwgfD0gZ3RiX21lbXNpemUgPyBNRU1fU0laRV80TV9HVEIgOiBNRU1fU0laRV80TTsKCQllbHNlIGlmIChpbmZvLT5maXguc21lbV9sZW4gPD0gMHg2MDAwMDApCgkJCXBhci0+bWVtX2NudGwgfD0gZ3RiX21lbXNpemUgPyBNRU1fU0laRV82TV9HVEIgOiBNRU1fU0laRV82TTsKCQllbHNlCgkJCXBhci0+bWVtX2NudGwgfD0gZ3RiX21lbXNpemUgPyBNRU1fU0laRV84TV9HVEIgOiBNRU1fU0laRV84TTsKCQlhdHlfc3RfbGUzMihNRU1fQ05UTCwgcGFyLT5tZW1fY250bCwgcGFyKTsKCX0KCgkvKgoJICogIFJlZyBCbG9jayAwIChDVC1jb21wYXRpYmxlIGJsb2NrKSBpcyBhdCBtbWlvX3N0YXJ0CgkgKiAgUmVnIEJsb2NrIDEgKG11bHRpbWVkaWEgZXh0ZW5zaW9ucykgaXMgYXQgbW1pb19zdGFydCAtIDB4NDAwCgkgKi8KCWlmIChNNjRfSEFTKEdYKSkgewoJCWluZm8tPmZpeC5tbWlvX2xlbiA9IDB4NDAwOwoJCWluZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX0FUSV9NQUNINjRHWDsKCX0gZWxzZSBpZiAoTTY0X0hBUyhDVCkpIHsKCQlpbmZvLT5maXgubW1pb19sZW4gPSAweDQwMDsKCQlpbmZvLT5maXguYWNjZWwgPSBGQl9BQ0NFTF9BVElfTUFDSDY0Q1Q7Cgl9IGVsc2UgaWYgKE02NF9IQVMoVlQpKSB7CgkJaW5mby0+Zml4Lm1taW9fc3RhcnQgLT0gMHg0MDA7CgkJaW5mby0+Zml4Lm1taW9fbGVuID0gMHg4MDA7CgkJaW5mby0+Zml4LmFjY2VsID0gRkJfQUNDRUxfQVRJX01BQ0g2NFZUOwoJfSBlbHNlIHsvKiBHVCAqLwoJCWluZm8tPmZpeC5tbWlvX3N0YXJ0IC09IDB4NDAwOwoJCWluZm8tPmZpeC5tbWlvX2xlbiA9IDB4ODAwOwoJCWluZm8tPmZpeC5hY2NlbCA9IEZCX0FDQ0VMX0FUSV9NQUNINjRHVDsKCX0KCglQUklOVEtJKCIlZCVjICVzLCAlcyBNSHogWFRBTCwgJWQgTUh6IFBMTCwgJWQgTWh6IE1DTEssICVkIE1IeiBYQ0xLXG4iLAoJICAgICAgIGluZm8tPmZpeC5zbWVtX2xlbiA9PSAweDgwMDAwID8gNTEyIDogKGluZm8tPmZpeC5zbWVtX2xlbiA+PiAyMCksCgkgICAgICAgaW5mby0+Zml4LnNtZW1fbGVuID09IDB4ODAwMDAgPyAnSycgOiAnTScsIHJhbW5hbWUsIHh0YWwsIHBhci0+cGxsX2xpbWl0cy5wbGxfbWF4LAoJICAgICAgIHBhci0+cGxsX2xpbWl0cy5tY2xrLCBwYXItPnBsbF9saW1pdHMueGNsayk7CgojaWYgZGVmaW5lZChERUJVRykgJiYgZGVmaW5lZChDT05GSUdfQVRZX0NUKQoJaWYgKE02NF9IQVMoSU5URUdSQVRFRCkpIHsKCQlpbnQgaTsKCQlwcmludGsoImRlYnVnIGF0eWZiOiBCVVNfQ05UTCBEQUNfQ05UTCBNRU1fQ05UTCBFWFRfTUVNX0NOVEwgQ1JUQ19HRU5fQ05UTCAiCgkJICAgICAgICJEU1BfQ09ORklHIERTUF9PTl9PRkYgQ0xPQ0tfQ05UTFxuIgoJCSAgICAgICAiZGVidWcgYXR5ZmI6ICUwOHggJTA4eCAlMDh4ICUwOHggICAgICUwOHggICAgICAlMDh4ICAgJTA4eCAgICUwOHhcbiIKCQkgICAgICAgImRlYnVnIGF0eWZiOiBQTEwiLAoJCQlhdHlfbGRfbGUzMihCVVNfQ05UTCwgcGFyKSwgYXR5X2xkX2xlMzIoREFDX0NOVEwsIHBhciksCgkJCWF0eV9sZF9sZTMyKE1FTV9DTlRMLCBwYXIpLCBhdHlfbGRfbGUzMihFWFRfTUVNX0NOVEwsIHBhciksCgkJCWF0eV9sZF9sZTMyKENSVENfR0VOX0NOVEwsIHBhciksIGF0eV9sZF9sZTMyKERTUF9DT05GSUcsIHBhciksCgkJCWF0eV9sZF9sZTMyKERTUF9PTl9PRkYsIHBhciksIGF0eV9sZF9sZTMyKENMT0NLX0NOVEwsIHBhcikpOwoJCWZvciAoaSA9IDA7IGkgPCA0MDsgaSsrKQoJCQlwcmludGsoIiAlMDJ4IiwgYXR5X2xkX3BsbF9jdChpLCBwYXIpKTsKCQlwcmludGsoIlxuIik7Cgl9CiNlbmRpZgoJaWYocGFyLT5wbGxfb3BzLT5pbml0X3BsbCkKCQlwYXItPnBsbF9vcHMtPmluaXRfcGxsKGluZm8sICZwYXItPnBsbCk7CglpZiAocGFyLT5wbGxfb3BzLT5yZXN1bWVfcGxsKQoJCXBhci0+cGxsX29wcy0+cmVzdW1lX3BsbChpbmZvLCAmcGFyLT5wbGwpOwoKCS8qCgkgKiAgTGFzdCBwYWdlIG9mIDggTUIgKDQgTUIgb24gSVNBKSBhcGVydHVyZSBpcyBNTUlPLAoJICogIHVubGVzcyB0aGUgYXV4aWxpYXJ5IHJlZ2lzdGVyIGFwZXJ0dXJlIGlzIHVzZWQuCgkgKi8KCglpZiAoIXBhci0+YXV4X3N0YXJ0ICYmCgkJKGluZm8tPmZpeC5zbWVtX2xlbiA9PSAweDgwMDAwMCB8fCAocGFyLT5idXNfdHlwZSA9PSBJU0EgJiYgaW5mby0+Zml4LnNtZW1fbGVuID09IDB4NDAwMDAwKSkpCgkJaW5mby0+Zml4LnNtZW1fbGVuIC09IEdVSV9SRVNFUlZFOwoKCS8qCgkgKiAgRGlzYWJsZSByZWdpc3RlciBhY2Nlc3MgdGhyb3VnaCB0aGUgbGluZWFyIGFwZXJ0dXJlCgkgKiAgaWYgdGhlIGF1eGlsaWFyeSBhcGVydHVyZSBpcyB1c2VkIHNvIHdlIGNhbiBhY2Nlc3MKCSAqICB0aGUgZnVsbCA4IE1CIG9mIHZpZGVvIFJBTSBvbiA4IE1CIGJvYXJkcy4KCSAqLwoJaWYgKHBhci0+YXV4X3N0YXJ0KQoJCWF0eV9zdF9sZTMyKEJVU19DTlRMLCBhdHlfbGRfbGUzMihCVVNfQ05UTCwgcGFyKSB8IEJVU19BUEVSX1JFR19ESVMsIHBhcik7CgojaWZkZWYgQ09ORklHX01UUlIKCXBhci0+bXRycl9hcGVyID0gLTE7CglwYXItPm10cnJfcmVnID0gLTE7CglpZiAoIW5vbXRycikgewoJCS8qIENvdmVyIHRoZSB3aG9sZSByZXNvdXJjZS4gKi8KCQkgcGFyLT5tdHJyX2FwZXIgPSBtdHJyX2FkZChwYXItPnJlc19zdGFydCwgcGFyLT5yZXNfc2l6ZSwgTVRSUl9UWVBFX1dSQ09NQiwgMSk7CgkJIGlmIChwYXItPm10cnJfYXBlciA+PSAwICYmICFwYXItPmF1eF9zdGFydCkgewoJCQkvKiBNYWtlIGEgaG9sZSBmb3IgbW1pby4gKi8KCQkJcGFyLT5tdHJyX3JlZyA9IG10cnJfYWRkKHBhci0+cmVzX3N0YXJ0ICsgMHg4MDAwMDAgLSBHVUlfUkVTRVJWRSwKCQkJCUdVSV9SRVNFUlZFLCBNVFJSX1RZUEVfVU5DQUNIQUJMRSwgMSk7CgkJCWlmIChwYXItPm10cnJfcmVnIDwgMCkgewoJCQkJbXRycl9kZWwocGFyLT5tdHJyX2FwZXIsIDAsIDApOwoJCQkJcGFyLT5tdHJyX2FwZXIgPSAtMTsKCQkJfQoJCSB9Cgl9CiNlbmRpZgoKCWluZm8tPmZib3BzID0gJmF0eWZiX29wczsKCWluZm8tPnBzZXVkb19wYWxldHRlID0gcHNldWRvX3BhbGV0dGU7CglpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUICAgICAgICAgICB8CgkgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX0lNQUdFQkxJVCB8CgkgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX0ZJTExSRUNUICB8CgkgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX0NPUFlBUkVBICB8CgkgICAgICAgICAgICAgIEZCSU5GT19IV0FDQ0VMX1lQQU47CgojaWZkZWYgQ09ORklHX1BNQUNfQkFDS0xJR0hUCglpZiAoTTY0X0hBUyhHM19QQl8xXzEpICYmIG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiUG93ZXJCb29rMSwxIikpIHsKCQkvKiB0aGVzZSBiaXRzIGxldCB0aGUgMTAxIHBvd2VyYm9vayB3YWtlIHVwIGZyb20gc2xlZXAgLS0gcGF1bHVzICovCgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBhdHlfbGRfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBhcikKCQkJICAgfCAoVVNFX0YzMktIWiB8IFRSSVNUQVRFX01FTV9FTiksIHBhcik7Cgl9IGVsc2UKI2VuZGlmCglpZiAoTTY0X0hBUyhNT0JJTF9CVVMpKSB7CiNpZmRlZiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVAoJCWF0eV9ibF9pbml0IChwYXIpOwojZW5kaWYKCX0KCgltZW1zZXQoJnZhciwgMCwgc2l6ZW9mKHZhcikpOwojaWZkZWYgQ09ORklHX1BQQwoJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpKSB7CgkJLyoKCQkgKiAgRklYTUU6IFRoZSBOVlJBTSBzdHVmZiBzaG91bGQgYmUgcHV0IGluIGEgTWFjLXNwZWNpZmljIGZpbGUsIGFzIGl0CgkJICogICAgICAgICBhcHBsaWVzIHRvIGFsbCBNYWMgdmlkZW8gY2FyZHMKCQkgKi8KCQlpZiAobW9kZSkgewoJCQlpZiAobWFjX2ZpbmRfbW9kZSgmdmFyLCBpbmZvLCBtb2RlLCA4KSkKCQkJCWhhc192YXIgPSAxOwoJCX0gZWxzZSB7CgkJCWlmIChkZWZhdWx0X3Ztb2RlID09IFZNT0RFX0NIT09TRSkgewoJCQkJaW50IHNlbnNlOwoJCQkJaWYgKE02NF9IQVMoRzNfUEJfMTAyNHg3NjgpKQoJCQkJCS8qIEczIFBvd2VyQm9vayB3aXRoIDEwMjR4NzY4IExDRCAqLwoJCQkJCWRlZmF1bHRfdm1vZGUgPSBWTU9ERV8xMDI0Xzc2OF82MDsKCQkJCWVsc2UgaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZSgiaU1hYyIpKQoJCQkJCWRlZmF1bHRfdm1vZGUgPSBWTU9ERV8xMDI0Xzc2OF83NTsKCQkJCWVsc2UgaWYgKG1hY2hpbmVfaXNfY29tcGF0aWJsZQoJCQkJCSAoIlBvd2VyQm9vazIsMSIpKQoJCQkJCS8qIGlCb29rIHdpdGggODAweDYwMCBMQ0QgKi8KCQkJCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfODAwXzYwMF82MDsKCQkJCWVsc2UKCQkJCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfNjQwXzQ4MF82NzsKCQkJCXNlbnNlID0gcmVhZF9hdHlfc2Vuc2UocGFyKTsKCQkJCVBSSU5US0koIm1vbml0b3Igc2Vuc2U9JXgsIG1vZGUgJWRcbiIsCgkJCQkJc2Vuc2UsICBtYWNfbWFwX21vbml0b3Jfc2Vuc2Uoc2Vuc2UpKTsKCQkJfQoJCQlpZiAoZGVmYXVsdF92bW9kZSA8PSAwIHx8IGRlZmF1bHRfdm1vZGUgPiBWTU9ERV9NQVgpCgkJCQlkZWZhdWx0X3Ztb2RlID0gVk1PREVfNjQwXzQ4MF82MDsKCQkJaWYgKGRlZmF1bHRfY21vZGUgPCBDTU9ERV84IHx8IGRlZmF1bHRfY21vZGUgPiBDTU9ERV8zMikKCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV84OwoJCQlpZiAoIW1hY192bW9kZV90b192YXIoZGVmYXVsdF92bW9kZSwgZGVmYXVsdF9jbW9kZSwKCQkJCQkgICAgICAgJnZhcikpCgkJCQloYXNfdmFyID0gMTsKCQl9Cgl9CgojZW5kaWYgLyogIUNPTkZJR19QUEMgKi8KCiNpZiBkZWZpbmVkKF9faTM4Nl9fKSAmJiBkZWZpbmVkKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpCglpZiAoIWF0eWZiX2dldF90aW1pbmdzX2Zyb21fbGNkKHBhciwgJnZhcikpCgkJaGFzX3ZhciA9IDE7CiNlbmRpZgoKCWlmIChtb2RlICYmIGZiX2ZpbmRfbW9kZSgmdmFyLCBpbmZvLCBtb2RlLCBOVUxMLCAwLCAmZGVmbW9kZSwgOCkpCgkJaGFzX3ZhciA9IDE7CgoJaWYgKCFoYXNfdmFyKQoJCXZhciA9IGRlZmF1bHRfdmFyOwoKCWlmIChub2FjY2VsKQoJCXZhci5hY2NlbF9mbGFncyAmPSB+RkJfQUNDRUxGX1RFWFQ7CgllbHNlCgkJdmFyLmFjY2VsX2ZsYWdzIHw9IEZCX0FDQ0VMRl9URVhUOwoKCWlmIChjb21wX3N5bmMgIT0gLTEpIHsKCQlpZiAoIWNvbXBfc3luYykKCQkJdmFyLnN5bmMgJj0gfkZCX1NZTkNfQ09NUF9ISUdIX0FDVDsKCQllbHNlCgkJCXZhci5zeW5jIHw9IEZCX1NZTkNfQ09NUF9ISUdIX0FDVDsKCX0KCglpZiAodmFyLnlyZXMgPT0gdmFyLnlyZXNfdmlydHVhbCkgewoJCXUzMiB2aWRlb3JhbSA9IChpbmZvLT5maXguc21lbV9sZW4gLSAoUEFHRV9TSVpFIDw8IDIpKTsKCQl2YXIueXJlc192aXJ0dWFsID0gKCh2aWRlb3JhbSAqIDgpIC8gdmFyLmJpdHNfcGVyX3BpeGVsKSAvIHZhci54cmVzX3ZpcnR1YWw7CgkJaWYgKHZhci55cmVzX3ZpcnR1YWwgPCB2YXIueXJlcykKCQkJdmFyLnlyZXNfdmlydHVhbCA9IHZhci55cmVzOwoJfQoKCWlmIChhdHlmYl9jaGVja192YXIoJnZhciwgaW5mbykpIHsKCQlQUklOVEtFKCJjYW4ndCBzZXQgZGVmYXVsdCB2aWRlbyBtb2RlXG4iKTsKCQlnb3RvIGF0eV9pbml0X2V4aXQ7Cgl9CgojaWZkZWYgX19zcGFyY19fCglhdHlmYl9zYXZlX3BhbGV0dGUocGFyLCAwKTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX0ZCX0FUWV9DVAoJaWYgKCFub2FjY2VsICYmIE02NF9IQVMoSU5URUdSQVRFRCkpCgkJYXR5X2luaXRfY3Vyc29yKGluZm8pOwojZW5kaWYgLyogQ09ORklHX0ZCX0FUWV9DVCAqLwoJaW5mby0+dmFyID0gdmFyOwoKCWZiX2FsbG9jX2NtYXAoJmluZm8tPmNtYXAsIDI1NiwgMCk7CgoJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pIDwgMCkKCQlnb3RvIGF0eV9pbml0X2V4aXQ7CgoJZmJfbGlzdCA9IGluZm87CgoJUFJJTlRLSSgiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZSBvbiAlc1xuIiwKCQlpbmZvLT5ub2RlLCBpbmZvLT5maXguaWQsIHBhci0+YnVzX3R5cGUgPT0gSVNBID8gIklTQSIgOiAiUENJIik7CglyZXR1cm4gMDsKCmF0eV9pbml0X2V4aXQ6CgkvKiByZXN0b3JlIHZpZGVvIG1vZGUgKi8KCWF0eV9zZXRfY3J0YyhwYXIsICZzYXZlZF9jcnRjKTsKCXBhci0+cGxsX29wcy0+c2V0X3BsbChpbmZvLCAmc2F2ZWRfcGxsKTsKCiNpZmRlZiBDT05GSUdfTVRSUgoJaWYgKHBhci0+bXRycl9yZWcgPj0gMCkgewoJICAgIG10cnJfZGVsKHBhci0+bXRycl9yZWcsIDAsIDApOwoJICAgIHBhci0+bXRycl9yZWcgPSAtMTsKCX0KCWlmIChwYXItPm10cnJfYXBlciA+PSAwKSB7CgkgICAgbXRycl9kZWwocGFyLT5tdHJyX2FwZXIsIDAsIDApOwoJICAgIHBhci0+bXRycl9hcGVyID0gLTE7Cgl9CiNlbmRpZgoJcmV0dXJuIC0xOwp9CgpzdGF0aWMgdm9pZCBhdHlfcmVzdW1lX2NoaXAoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IGluZm8tPnBhcjsKCglhdHlfc3RfbGUzMihNRU1fQ05UTCwgcGFyLT5tZW1fY250bCwgcGFyKTsKCglpZiAocGFyLT5wbGxfb3BzLT5yZXN1bWVfcGxsKQoJCXBhci0+cGxsX29wcy0+cmVzdW1lX3BsbChpbmZvLCAmcGFyLT5wbGwpOwoKCWlmIChwYXItPmF1eF9zdGFydCkKCQlhdHlfc3RfbGUzMihCVVNfQ05UTCwgYXR5X2xkX2xlMzIoQlVTX0NOVEwsIHBhcikgfCBCVVNfQVBFUl9SRUdfRElTLCBwYXIpOwp9CgojaWZkZWYgQ09ORklHX0FUQVJJCnN0YXRpYyBpbnQgX19kZXZpbml0IHN0b3JlX3ZpZGVvX3BhcihjaGFyICp2aWRlb19zdHIsIHVuc2lnbmVkIGNoYXIgbTY0X251bSkKewoJY2hhciAqcDsKCXVuc2lnbmVkIGxvbmcgdm1lbWJhc2UsIHNpemUsIGd1aXJlZ2Jhc2U7CgoJUFJJTlRLSSgic3RvcmVfdmlkZW9fcGFyKCkgJyVzJyBcbiIsIHZpZGVvX3N0cik7CgoJaWYgKCEocCA9IHN0cnNlcCgmdmlkZW9fc3RyLCAiOyIpKSB8fCAhKnApCgkJZ290byBtYWNoNjRfaW52YWxpZDsKCXZtZW1iYXNlID0gc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMCk7CglpZiAoIShwID0gc3Ryc2VwKCZ2aWRlb19zdHIsICI7IikpIHx8ICEqcCkKCQlnb3RvIG1hY2g2NF9pbnZhbGlkOwoJc2l6ZSA9IHNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDApOwoJaWYgKCEocCA9IHN0cnNlcCgmdmlkZW9fc3RyLCAiOyIpKSB8fCAhKnApCgkJZ290byBtYWNoNjRfaW52YWxpZDsKCWd1aXJlZ2Jhc2UgPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAwKTsKCglwaHlzX3ZtZW1iYXNlW202NF9udW1dID0gdm1lbWJhc2U7CglwaHlzX3NpemVbbTY0X251bV0gPSBzaXplOwoJcGh5c19ndWlyZWdiYXNlW202NF9udW1dID0gZ3VpcmVnYmFzZTsKCVBSSU5US0koInN0b3JlZCB0aGVtIGFsbDogJCUwOGxYICQlMDhsWCAkJTA4bFggXG4iLCB2bWVtYmFzZSwgc2l6ZSwKCSAgICAgICBndWlyZWdiYXNlKTsKCXJldHVybiAwOwoKICAgICAgbWFjaDY0X2ludmFsaWQ6CglwaHlzX3ZtZW1iYXNlW202NF9udW1dID0gMDsKCXJldHVybiAtMTsKfQojZW5kaWYgLyogQ09ORklHX0FUQVJJICovCgogICAgLyoKICAgICAqICBCbGFuayB0aGUgZGlzcGxheS4KICAgICAqLwoKc3RhdGljIGludCBhdHlmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXIgPSAoc3RydWN0IGF0eWZiX3BhciAqKSBpbmZvLT5wYXI7Cgl1MzIgZ2VuX2NudGw7CgoJaWYgKHBhci0+bG9ja19ibGFuayB8fCBwYXItPmFzbGVlcCkKCQlyZXR1cm4gMDsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVAoJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpICYmIGJsYW5rID4gRkJfQkxBTktfTk9STUFMKQoJCWF0eV9ibF9zZXRfcG93ZXIoaW5mbywgRkJfQkxBTktfUE9XRVJET1dOKTsKI2VsaWYgZGVmaW5lZChDT05GSUdfRkJfQVRZX0dFTkVSSUNfTENEKQoJaWYgKHBhci0+bGNkX3RhYmxlICYmIGJsYW5rID4gRkJfQkxBTktfTk9STUFMICYmCgkgICAgKGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpICYgTENEX09OKSkgewoJCXUzMiBwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQlwbSAmPSB+UFdSX0JMT047CgkJYXR5X3N0X2xjZChQT1dFUl9NQU5BR0VNRU5ULCBwbSwgcGFyKTsKCX0KI2VuZGlmCgoJZ2VuX2NudGwgPSBhdHlfbGRfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXIpOwoJZ2VuX2NudGwgJj0gfjB4NDAwMDA0YzsKCXN3aXRjaCAoYmxhbmspIHsKCQljYXNlIEZCX0JMQU5LX1VOQkxBTks6CgkJCWJyZWFrOwoJCWNhc2UgRkJfQkxBTktfTk9STUFMOgoJCQlnZW5fY250bCB8PSAweDQwMDAwNDA7CgkJCWJyZWFrOwoJCWNhc2UgRkJfQkxBTktfVlNZTkNfU1VTUEVORDoKCQkJZ2VuX2NudGwgfD0gMHg0MDAwMDQ4OwoJCQlicmVhazsKCQljYXNlIEZCX0JMQU5LX0hTWU5DX1NVU1BFTkQ6CgkJCWdlbl9jbnRsIHw9IDB4NDAwMDA0NDsKCQkJYnJlYWs7CgkJY2FzZSBGQl9CTEFOS19QT1dFUkRPV046CgkJCWdlbl9jbnRsIHw9IDB4NDAwMDA0YzsKCQkJYnJlYWs7Cgl9CglhdHlfc3RfbGUzMihDUlRDX0dFTl9DTlRMLCBnZW5fY250bCwgcGFyKTsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVAoJaWYgKG1hY2hpbmVfaXMocG93ZXJtYWMpICYmIGJsYW5rIDw9IEZCX0JMQU5LX05PUk1BTCkKCQlhdHlfYmxfc2V0X3Bvd2VyKGluZm8sIEZCX0JMQU5LX1VOQkxBTkspOwojZWxpZiBkZWZpbmVkKENPTkZJR19GQl9BVFlfR0VORVJJQ19MQ0QpCglpZiAocGFyLT5sY2RfdGFibGUgJiYgYmxhbmsgPD0gRkJfQkxBTktfTk9STUFMICYmCgkgICAgKGF0eV9sZF9sY2QoTENEX0dFTl9DTlRMLCBwYXIpICYgTENEX09OKSkgewoJCXUzMiBwbSA9IGF0eV9sZF9sY2QoUE9XRVJfTUFOQUdFTUVOVCwgcGFyKTsKCQlwbSB8PSBQV1JfQkxPTjsKCQlhdHlfc3RfbGNkKFBPV0VSX01BTkFHRU1FTlQsIHBtLCBwYXIpOwoJfQojZW5kaWYKCglyZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgYXR5X3N0X3BhbCh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKCQkgICAgICAgY29uc3Qgc3RydWN0IGF0eWZiX3BhciAqcGFyKQp7CglhdHlfc3RfOChEQUNfV19JTkRFWCwgcmVnbm8sIHBhcik7CglhdHlfc3RfOChEQUNfREFUQSwgcmVkLCBwYXIpOwoJYXR5X3N0XzgoREFDX0RBVEEsIGdyZWVuLCBwYXIpOwoJYXR5X3N0XzgoREFDX0RBVEEsIGJsdWUsIHBhcik7Cn0KCiAgICAvKgogICAgICogIFNldCBhIHNpbmdsZSBjb2xvciByZWdpc3Rlci4gVGhlIHZhbHVlcyBzdXBwbGllZCBhcmUgYWxyZWFkeQogICAgICogIHJvdW5kZWQgZG93biB0byB0aGUgaGFyZHdhcmUncyBjYXBhYmlsaXRpZXMgKGFjY29yZGluZyB0byB0aGUKICAgICAqICBlbnRyaWVzIGluIHRoZSB2YXIgc3RydWN0dXJlKS4gUmV0dXJuICE9IDAgZm9yIGludmFsaWQgcmVnbm8uCiAgICAgKiAgISEgNCAmIDggPSAgUFNFVURPLCA+IDggPSBESVJFQ1RDT0xPUgogICAgICovCgpzdGF0aWMgaW50IGF0eWZiX3NldGNvbHJlZyh1X2ludCByZWdubywgdV9pbnQgcmVkLCB1X2ludCBncmVlbiwgdV9pbnQgYmx1ZSwKCXVfaW50IHRyYW5zcCwgc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCWludCBpLCBkZXB0aDsKCXUzMiAqcGFsID0gaW5mby0+cHNldWRvX3BhbGV0dGU7CgoJZGVwdGggPSBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWw7CglpZiAoZGVwdGggPT0gMTYpCgkJZGVwdGggPSAoaW5mby0+dmFyLmdyZWVuLmxlbmd0aCA9PSA1KSA/IDE1IDogMTY7CgoJaWYgKHBhci0+YXNsZWVwKQoJCXJldHVybiAwOwoKCWlmIChyZWdubyA+IDI1NSB8fAoJICAgIChkZXB0aCA9PSAxNiAmJiByZWdubyA+IDYzKSB8fAoJICAgIChkZXB0aCA9PSAxNSAmJiByZWdubyA+IDMxKSkKCQlyZXR1cm4gMTsKCglyZWQgPj49IDg7CglncmVlbiA+Pj0gODsKCWJsdWUgPj49IDg7CgoJcGFyLT5wYWxldHRlW3JlZ25vXS5yZWQgPSByZWQ7CglwYXItPnBhbGV0dGVbcmVnbm9dLmdyZWVuID0gZ3JlZW47CglwYXItPnBhbGV0dGVbcmVnbm9dLmJsdWUgPSBibHVlOwoKCWlmIChyZWdubyA8IDE2KSB7CgkJc3dpdGNoIChkZXB0aCkgewoJCWNhc2UgMTU6CgkJCXBhbFtyZWdub10gPSAocmVnbm8gPDwgMTApIHwgKHJlZ25vIDw8IDUpIHwgcmVnbm87CgkJCWJyZWFrOwoJCWNhc2UgMTY6CgkJCXBhbFtyZWdub10gPSAocmVnbm8gPDwgMTEpIHwgKHJlZ25vIDw8IDUpIHwgcmVnbm87CgkJCWJyZWFrOwoJCWNhc2UgMjQ6CgkJCXBhbFtyZWdub10gPSAocmVnbm8gPDwgMTYpIHwgKHJlZ25vIDw8IDgpIHwgcmVnbm87CgkJCWJyZWFrOwoJCWNhc2UgMzI6CgkJCWkgPSAocmVnbm8gPDwgOCkgfCByZWdubzsKCQkJcGFsW3JlZ25vXSA9IChpIDw8IDE2KSB8IGk7CgkJCWJyZWFrOwoJCX0KCX0KCglpID0gYXR5X2xkXzgoREFDX0NOVEwsIHBhcikgJiAweGZjOwoJaWYgKE02NF9IQVMoRVhUUkFfQlJJR0hUKSkKCQlpIHw9IDB4MjsgLyogREFDX0NOVEwgfCAweDIgdHVybnMgb2ZmIHRoZSBleHRyYSBicmlnaHRuZXNzIGZvciBndCAqLwoJYXR5X3N0XzgoREFDX0NOVEwsIGksIHBhcik7CglhdHlfc3RfOChEQUNfTUFTSywgMHhmZiwgcGFyKTsKCglpZiAoTTY0X0hBUyhJTlRFR1JBVEVEKSkgewoJCWlmIChkZXB0aCA9PSAxNikgewoJCQlpZiAocmVnbm8gPCAzMikKCQkJCWF0eV9zdF9wYWwocmVnbm8gPDwgMywgcmVkLAoJCQkJCSAgIHBhci0+cGFsZXR0ZVtyZWdubzw8MV0uZ3JlZW4sCgkJCQkJICAgYmx1ZSwgcGFyKTsKCQkJcmVkID0gcGFyLT5wYWxldHRlW3JlZ25vPj4xXS5yZWQ7CgkJCWJsdWUgPSBwYXItPnBhbGV0dGVbcmVnbm8+PjFdLmJsdWU7CgkJCXJlZ25vIDw8PSAyOwoJCX0gZWxzZSBpZiAoZGVwdGggPT0gMTUpIHsKCQkJcmVnbm8gPDw9IDM7CgkJCWZvcihpID0gMDsgaSA8IDg7IGkrKykgewoJCQkgICAgYXR5X3N0X3BhbChyZWdubyArIGksIHJlZCwgZ3JlZW4sIGJsdWUsIHBhcik7CgkJCX0KCQl9Cgl9CglhdHlfc3RfcGFsKHJlZ25vLCByZWQsIGdyZWVuLCBibHVlLCBwYXIpOwoKCXJldHVybiAwOwp9CgojaWZkZWYgQ09ORklHX1BDSQoKI2lmZGVmIF9fc3BhcmNfXwoKZXh0ZXJuIHZvaWQgKCpwcm9tX3BhbGV0dGUpIChpbnQpOwoKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfc2V0dXBfc3BhcmMoc3RydWN0IHBjaV9kZXYgKnBkZXYsCgkJCXN0cnVjdCBmYl9pbmZvICppbmZvLCB1bnNpZ25lZCBsb25nIGFkZHIpCnsKCWV4dGVybiBpbnQgY29uX2lzX3ByZXNlbnQodm9pZCk7CgoJc3RydWN0IGF0eWZiX3BhciAqcGFyID0gaW5mby0+cGFyOwoJc3RydWN0IHBjaWRldl9jb29raWUgKnBjcDsKCWNoYXIgcHJvcFsxMjhdOwoJaW50IG5vZGUsIGxlbiwgaSwgaiwgcmV0OwoJdTMyIG1lbSwgY2hpcF9pZDsKCgkvKiBEbyBub3QgYXR0YWNoIHdoZW4gd2UgaGF2ZSBhIHNlcmlhbCBjb25zb2xlLiAqLwoJaWYgKCFjb25faXNfcHJlc2VudCgpKQoJCXJldHVybiAtRU5YSU87CgoJLyoKCSAqIE1hcCBtZW1vcnktbWFwcGVkIHJlZ2lzdGVycy4KCSAqLwoJcGFyLT5hdGlfcmVnYmFzZSA9ICh2b2lkICopYWRkciArIDB4N2ZmYzAwVUw7CglpbmZvLT5maXgubW1pb19zdGFydCA9IGFkZHIgKyAweDdmZmMwMFVMOwoKCS8qCgkgKiBNYXAgaW4gYmlnLWVuZGlhbiBhcGVydHVyZS4KCSAqLwoJaW5mby0+c2NyZWVuX2Jhc2UgPSAoY2hhciAqKSAoYWRkciArIDB4ODAwMDAwVUwpOwoJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSBhZGRyICsgMHg4MDAwMDBVTDsKCgkvKgoJICogRmlndXJlIG1tYXAgYWRkcmVzc2VzIGZyb20gUENJIGNvbmZpZyBzcGFjZS4KCSAqIFNwbGl0IEZyYW1lYnVmZmVyIGluIGJpZy0gYW5kIGxpdHRsZS1lbmRpYW4gaGFsZnMuCgkgKi8KCWZvciAoaSA9IDA7IGkgPCA2ICYmIHBkZXYtPnJlc291cmNlW2ldLnN0YXJ0OyBpKyspCgkJLyogbm90aGluZyAqLyA7CglqID0gaSArIDQ7CgoJcGFyLT5tbWFwX21hcCA9IGttYWxsb2MoaiAqIHNpemVvZigqcGFyLT5tbWFwX21hcCksIEdGUF9BVE9NSUMpOwoJaWYgKCFwYXItPm1tYXBfbWFwKSB7CgkJUFJJTlRLRSgiYXR5ZmJfc2V0dXBfc3BhcmMoKSBjYW4ndCBhbGxvYyBtbWFwX21hcFxuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CgltZW1zZXQocGFyLT5tbWFwX21hcCwgMCwgaiAqIHNpemVvZigqcGFyLT5tbWFwX21hcCkpOwoKCWZvciAoaSA9IDAsIGogPSAyOyBpIDwgNiAmJiBwZGV2LT5yZXNvdXJjZVtpXS5zdGFydDsgaSsrKSB7CgkJc3RydWN0IHJlc291cmNlICpycCA9ICZwZGV2LT5yZXNvdXJjZVtpXTsKCQlpbnQgaW8sIGJyZWcgPSBQQ0lfQkFTRV9BRERSRVNTXzAgKyAoaSA8PCAyKTsKCQl1bnNpZ25lZCBsb25nIGJhc2U7CgkJdTMyIHNpemUsIHBiYXNlOwoKCQliYXNlID0gcnAtPnN0YXJ0OwoKCQlpbyA9IChycC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKTsKCgkJc2l6ZSA9IHJwLT5lbmQgLSBiYXNlICsgMTsKCgkJcGNpX3JlYWRfY29uZmlnX2R3b3JkKHBkZXYsIGJyZWcsICZwYmFzZSk7CgoJCWlmIChpbykKCQkJc2l6ZSAmPSB+MTsKCgkJLyoKCQkgKiBNYXAgdGhlIGZyYW1lYnVmZmVyIGEgc2Vjb25kIHRpbWUsIHRoaXMgdGltZSB3aXRob3V0CgkJICogdGhlIGJyYWluZGVhZCBfUEFHRV9JRSBzZXR0aW5nLiBUaGlzIGlzIHVzZWQgYnkgdGhlCgkJICogZml4ZWQgWHNlcnZlciwgYnV0IHdlIG5lZWQgdG8gbWFpbnRhaW4gdGhlIG9sZCBtYXBwaW5nCgkJICogdG8gc3RheSBjb21wYXRpYmxlIHdpdGggb2xkZXIgb25lcy4uLgoJCSAqLwoJCWlmIChiYXNlID09IGFkZHIpIHsKCQkJcGFyLT5tbWFwX21hcFtqXS52b2ZmID0gKHBiYXNlICsgMHgxMDAwMDAwMCkgJiBQQUdFX01BU0s7CgkJCXBhci0+bW1hcF9tYXBbal0ucG9mZiA9IGJhc2UgJiBQQUdFX01BU0s7CgkJCXBhci0+bW1hcF9tYXBbal0uc2l6ZSA9IChzaXplICsgflBBR0VfTUFTSykgJiBQQUdFX01BU0s7CgkJCXBhci0+bW1hcF9tYXBbal0ucHJvdF9tYXNrID0gX1BBR0VfQ0FDSEU7CgkJCXBhci0+bW1hcF9tYXBbal0ucHJvdF9mbGFnID0gX1BBR0VfRTsKCQkJaisrOwoJCX0KCgkJLyoKCQkgKiBIZXJlIGNvbWVzIHRoZSBvbGQgZnJhbWVidWZmZXIgbWFwcGluZyB3aXRoIF9QQUdFX0lFCgkJICogc2V0IGZvciB0aGUgYmlnIGVuZGlhbiBoYWxmIG9mIHRoZSBmcmFtZWJ1ZmZlci4uLgoJCSAqLwoJCWlmIChiYXNlID09IGFkZHIpIHsKCQkJcGFyLT5tbWFwX21hcFtqXS52b2ZmID0gKHBiYXNlICsgMHg4MDAwMDApICYgUEFHRV9NQVNLOwoJCQlwYXItPm1tYXBfbWFwW2pdLnBvZmYgPSAoYmFzZSArIDB4ODAwMDAwKSAmIFBBR0VfTUFTSzsKCQkJcGFyLT5tbWFwX21hcFtqXS5zaXplID0gMHg4MDAwMDA7CgkJCXBhci0+bW1hcF9tYXBbal0ucHJvdF9tYXNrID0gX1BBR0VfQ0FDSEU7CgkJCXBhci0+bW1hcF9tYXBbal0ucHJvdF9mbGFnID0gX1BBR0VfRSB8IF9QQUdFX0lFOwoJCQlzaXplIC09IDB4ODAwMDAwOwoJCQlqKys7CgkJfQoKCQlwYXItPm1tYXBfbWFwW2pdLnZvZmYgPSBwYmFzZSAmIFBBR0VfTUFTSzsKCQlwYXItPm1tYXBfbWFwW2pdLnBvZmYgPSBiYXNlICYgUEFHRV9NQVNLOwoJCXBhci0+bW1hcF9tYXBbal0uc2l6ZSA9IChzaXplICsgflBBR0VfTUFTSykgJiBQQUdFX01BU0s7CgkJcGFyLT5tbWFwX21hcFtqXS5wcm90X21hc2sgPSBfUEFHRV9DQUNIRTsKCQlwYXItPm1tYXBfbWFwW2pdLnByb3RfZmxhZyA9IF9QQUdFX0U7CgkJaisrOwoJfQoKCWlmKChyZXQgPSBjb3JyZWN0X2NoaXBzZXQocGFyKSkpCgkJcmV0dXJuIHJldDsKCglpZiAoSVNfWEwocGRldi0+ZGV2aWNlKSkgewoJCS8qCgkJICogRml4IFBST01zIGlkZWEgb2YgTUVNX0NOVEwgc2V0dGluZ3MuLi4KCQkgKi8KCQltZW0gPSBhdHlfbGRfbGUzMihNRU1fQ05UTCwgcGFyKTsKCQljaGlwX2lkID0gYXR5X2xkX2xlMzIoQ09ORklHX0NISVBfSUQsIHBhcik7CgkJaWYgKCgoY2hpcF9pZCAmIENGR19DSElQX1RZUEUpID09IFZUX0NISVBfSUQpICYmICEoKGNoaXBfaWQgPj4gMjQpICYgMSkpIHsKCQkJc3dpdGNoIChtZW0gJiAweDBmKSB7CgkJCWNhc2UgMzoKCQkJCW1lbSA9IChtZW0gJiB+KDB4MGYpKSB8IDI7CgkJCQlicmVhazsKCQkJY2FzZSA3OgoJCQkJbWVtID0gKG1lbSAmIH4oMHgwZikpIHwgMzsKCQkJCWJyZWFrOwoJCQljYXNlIDk6CgkJCQltZW0gPSAobWVtICYgfigweDBmKSkgfCA0OwoJCQkJYnJlYWs7CgkJCWNhc2UgMTE6CgkJCQltZW0gPSAobWVtICYgfigweDBmKSkgfCA1OwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlicmVhazsKCQkJfQoJCQlpZiAoKGF0eV9sZF9sZTMyKENPTkZJR19TVEFUMCwgcGFyKSAmIDcpID49IFNEUkFNKQoJCQkJbWVtICY9IH4oMHgwMDcwMDAwMCk7CgkJfQoJCW1lbSAmPSB+KDB4Y2Y4MGUwMDApOwkvKiBUdXJuIG9mZiBhbGwgdW5kb2N1bWVudGVkIGJpdHMuICovCgkJYXR5X3N0X2xlMzIoTUVNX0NOVEwsIG1lbSwgcGFyKTsKCX0KCgkvKgoJICogSWYgdGhpcyBpcyB0aGUgY29uc29sZSBkZXZpY2UsIHdlIHdpbGwgc2V0IGRlZmF1bHQgdmlkZW8KCSAqIHNldHRpbmdzIHRvIHdoYXQgdGhlIFBST00gbGVmdCB1cyB3aXRoLgoJICovCglub2RlID0gcHJvbV9nZXRjaGlsZChwcm9tX3Jvb3Rfbm9kZSk7Cglub2RlID0gcHJvbV9zZWFyY2hzaWJsaW5ncyhub2RlLCAiYWxpYXNlcyIpOwoJaWYgKG5vZGUpIHsKCQlsZW4gPSBwcm9tX2dldHByb3BlcnR5KG5vZGUsICJzY3JlZW4iLCBwcm9wLCBzaXplb2YocHJvcCkpOwoJCWlmIChsZW4gPiAwKSB7CgkJCXByb3BbbGVuXSA9ICdcMCc7CgkJCW5vZGUgPSBwcm9tX2ZpbmRkZXZpY2UocHJvcCk7CgkJfSBlbHNlCgkJCW5vZGUgPSAwOwoJfQoKCXBjcCA9IHBkZXYtPnN5c2RhdGE7CglpZiAobm9kZSA9PSBwY3AtPnByb21fbm9kZS0+bm9kZSkgewoJCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyID0gJmRlZmF1bHRfdmFyOwoJCXVuc2lnbmVkIGludCBOLCBQLCBRLCBNLCBULCBSOwoJCXUzMiB2X3RvdGFsLCBoX3RvdGFsOwoJCXN0cnVjdCBjcnRjIGNydGM7CgkJdTggcGxsX3JlZ3NbMTZdOwoJCXU4IGNsb2NrX2NudGw7CgoJCWNydGMudnhyZXMgPSBwcm9tX2dldGludGRlZmF1bHQobm9kZSwgIndpZHRoIiwgMTAyNCk7CgkJY3J0Yy52eXJlcyA9IHByb21fZ2V0aW50ZGVmYXVsdChub2RlLCAiaGVpZ2h0IiwgNzY4KTsKCQl2YXItPmJpdHNfcGVyX3BpeGVsID0gcHJvbV9nZXRpbnRkZWZhdWx0KG5vZGUsICJkZXB0aCIsIDgpOwoJCXZhci0+eG9mZnNldCA9IHZhci0+eW9mZnNldCA9IDA7CgkJY3J0Yy5oX3RvdF9kaXNwID0gYXR5X2xkX2xlMzIoQ1JUQ19IX1RPVEFMX0RJU1AsIHBhcik7CgkJY3J0Yy5oX3N5bmNfc3RydF93aWQgPSBhdHlfbGRfbGUzMihDUlRDX0hfU1lOQ19TVFJUX1dJRCwgcGFyKTsKCQljcnRjLnZfdG90X2Rpc3AgPSBhdHlfbGRfbGUzMihDUlRDX1ZfVE9UQUxfRElTUCwgcGFyKTsKCQljcnRjLnZfc3luY19zdHJ0X3dpZCA9IGF0eV9sZF9sZTMyKENSVENfVl9TWU5DX1NUUlRfV0lELCBwYXIpOwoJCWNydGMuZ2VuX2NudGwgPSBhdHlfbGRfbGUzMihDUlRDX0dFTl9DTlRMLCBwYXIpOwoJCWF0eV9jcnRjX3RvX3ZhcigmY3J0YywgdmFyKTsKCgkJaF90b3RhbCA9IHZhci0+eHJlcyArIHZhci0+cmlnaHRfbWFyZ2luICsgdmFyLT5oc3luY19sZW4gKyB2YXItPmxlZnRfbWFyZ2luOwoJCXZfdG90YWwgPSB2YXItPnlyZXMgKyB2YXItPmxvd2VyX21hcmdpbiArIHZhci0+dnN5bmNfbGVuICsgdmFyLT51cHBlcl9tYXJnaW47CgoJCS8qCgkJICogUmVhZCB0aGUgUExMIHRvIGZpZ3VyZSBhY3R1YWwgUmVmcmVzaCBSYXRlLgoJCSAqLwoJCWNsb2NrX2NudGwgPSBhdHlfbGRfOChDTE9DS19DTlRMLCBwYXIpOwoJCS8qIERQUklOVEsoIkNMT0NLX0NOVEwgJTAyeFxuIiwgY2xvY2tfY250bCk7ICovCgkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCgkJCXBsbF9yZWdzW2ldID0gYXR5X2xkX3BsbF9jdChpLCBwYXIpOwoKCQkvKgoJCSAqIFBMTCBSZWZlcmVuY2UgRGl2aWRlciBNOgoJCSAqLwoJCU0gPSBwbGxfcmVnc1syXTsKCgkJLyoKCQkgKiBQTEwgRmVlZGJhY2sgRGl2aWRlciBOIChEZXBlbmRhbnQgb24gQ0xPQ0tfQ05UTCk6CgkJICovCgkJTiA9IHBsbF9yZWdzWzcgKyAoY2xvY2tfY250bCAmIDMpXTsKCgkJLyoKCQkgKiBQTEwgUG9zdCBEaXZpZGVyIFAgKERlcGVuZGFudCBvbiBDTE9DS19DTlRMKToKCQkgKi8KCQlQID0gMSA8PCAocGxsX3JlZ3NbNl0gPj4gKChjbG9ja19jbnRsICYgMykgPDwgMSkpOwoKCQkvKgoJCSAqIFBMTCBEaXZpZGVyIFE6CgkJICovCgkJUSA9IE4gLyBQOwoKCQkvKgoJCSAqIFRhcmdldCBGcmVxdWVuY3k6CgkJICoKCQkgKiAgICAgIFQgKiBNCgkJICogUSA9IC0tLS0tLS0KCQkgKiAgICAgIDIgKiBSCgkJICoKCQkgKiB3aGVyZSBSIGlzIFhUQUxJTiAoPSAxNDMxOCBvciAyOTQ5OCBrSHopLgoJCSAqLwoJCWlmIChJU19YTChwZGV2LT5kZXZpY2UpKQoJCQlSID0gMjk0OTg7CgkJZWxzZQoJCQlSID0gMTQzMTg7CgoJCVQgPSAyICogUSAqIFIgLyBNOwoKCQlkZWZhdWx0X3Zhci5waXhjbG9jayA9IDEwMDAwMDAwMDAgLyBUOwoJfQoKCXJldHVybiAwOwp9CgojZWxzZSAvKiBfX3NwYXJjX18gKi8KCiNpZmRlZiBfX2kzODZfXwojaWZkZWYgQ09ORklHX0ZCX0FUWV9HRU5FUklDX0xDRApzdGF0aWMgdm9pZCBfX2RldmluaXQgYXR5X2luaXRfbGNkKHN0cnVjdCBhdHlmYl9wYXIgKnBhciwgdTMyIGJpb3NfYmFzZSkKewoJdTMyIGRyaXZfaW5mX3RhYiwgc2lnOwoJdTE2IGxjZF9vZnM7CgoJLyogVG8gc3VwcG9ydCBhbiBMQ0QgcGFuZWwsIHdlIHNob3VsZCBrbm93IGl0J3MgZGltZW5zaW9ucyBhbmQKCSAqICBpdCdzIGRlc2lyZWQgcGl4ZWwgY2xvY2suCgkgKiBUaGVyZSBhcmUgdHdvIHdheXMgdG8gZG8gaXQ6CgkgKiAgLSBDaGVjayB0aGUgc3RhcnR1cCB2aWRlbyBtb2RlIGFuZCBjYWxjdWxhdGUgdGhlIHBhbmVsCgkgKiAgICBzaXplIGZyb20gaXQuIFRoaXMgaXMgdW5yZWxpYWJsZS4KCSAqICAtIFJlYWQgaXQgZnJvbSB0aGUgZHJpdmVyIGluZm9ybWF0aW9uIHRhYmxlIGluIHRoZSB2aWRlbyBCSU9TLgoJKi8KCS8qIEFkZHJlc3Mgb2YgZHJpdmVyIGluZm9ybWF0aW9uIHRhYmxlIGlzIGF0IG9mZnNldCAweDc4LiAqLwoJZHJpdl9pbmZfdGFiID0gYmlvc19iYXNlICsgKigodTE2ICopKGJpb3NfYmFzZSsweDc4KSk7CgoJLyogQ2hlY2sgZm9yIHRoZSBkcml2ZXIgaW5mb3JtYXRpb24gdGFibGUgc2lnbmF0dXJlLiAqLwoJc2lnID0gKCoodTMyICopZHJpdl9pbmZfdGFiKTsKCWlmICgoc2lnID09IDB4NTQ1MDRjMjQpIHx8IC8qIFJhZ2UgTFQgcHJvICovCgkJKHNpZyA9PSAweDU0NGQ1MjI0KSB8fCAvKiBSYWdlIG1vYmlsaXR5ICovCgkJKHNpZyA9PSAweDU0NDM1ODI0KSB8fCAvKiBSYWdlIFhDICovCgkJKHNpZyA9PSAweDU0NGM1ODI0KSkgeyAvKiBSYWdlIFhMICovCgkJUFJJTlRLSSgiQklPUyBjb250YWlucyBkcml2ZXIgaW5mb3JtYXRpb24gdGFibGUuXG4iKTsKCQlsY2Rfb2ZzID0gKCoodTE2ICopKGRyaXZfaW5mX3RhYiArIDEwKSk7CgkJcGFyLT5sY2RfdGFibGUgPSAwOwoJCWlmIChsY2Rfb2ZzICE9IDApIHsKCQkJcGFyLT5sY2RfdGFibGUgPSBiaW9zX2Jhc2UgKyBsY2Rfb2ZzOwoJCX0KCX0KCglpZiAocGFyLT5sY2RfdGFibGUgIT0gMCkgewoJCWNoYXIgbW9kZWxbMjRdOwoJCWNoYXIgc3RyYnVmWzE2XTsKCQljaGFyIHJlZnJlc2hfcmF0ZXNfYnVmWzEwMF07CgkJaW50IGlkLCB0ZWNoLCBmLCBpLCBtLCBkZWZhdWx0X3JlZnJlc2hfcmF0ZTsKCQljaGFyICp0eHRjb2xvdXI7CgkJY2hhciAqdHh0bW9uaXRvcjsKCQljaGFyICp0eHRkdWFsOwoJCWNoYXIgKnR4dGZvcm1hdDsKCQl1MTYgd2lkdGgsIGhlaWdodCwgcGFuZWxfdHlwZSwgcmVmcmVzaF9yYXRlczsKCQl1MTYgKmxjZG1vZGVwdHI7CgkJdTMyIGZvcm1hdDsKCQl1OCBsY2RfcmVmcmVzaF9yYXRlc1sxNl0gPSB7NTAsNTYsNjAsNjcsNzAsNzIsNzUsNzYsODUsOTAsMTAwLDEyMCwxNDAsMTUwLDE2MCwyMDB9OwoJCS8qIFRoZSBtb3N0IGltcG9ydGFudCBpbmZvcm1hdGlvbiBpcyB0aGUgcGFuZWwgc2l6ZSBhdAoJCSAqIG9mZnNldCAyNSBhbmQgMjcsIGJ1dCB0aGVyZSdzIHNvbWUgb3RoZXIgbmljZSBpbmZvcm1hdGlvbgoJCSAqIHdoaWNoIHdlIHByaW50IHRvIHRoZSBzY3JlZW4uCgkJICovCgkJaWQgPSAqKHU4ICopcGFyLT5sY2RfdGFibGU7CgkJc3RybmNweShtb2RlbCwoY2hhciAqKXBhci0+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+YXRpX3JlZ2Jhc2UpOwoJcGFyLT5hdGlfcmVnYmFzZSA9IE5VTEw7CglpZiAoaW5mby0+c2NyZWVuX2Jhc2UpIHsKCQlpb3VubWFwKGluZm8tPnNjcmVlbl9iYXNlKTsKCQlpbmZvLT5zY3JlZW5fYmFzZSA9IE5VTEw7Cgl9CglyZXR1cm4gcmV0Owp9CgojZW5kaWYgLyogIV9fc3BhcmNfXyAqLwoKc3RhdGljIGludCBfX2RldmluaXQgYXR5ZmJfcGNpX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBjb25zdCBzdHJ1Y3QgcGNpX2RldmljZV9pZCAqZW50KQp7Cgl1bnNpZ25lZCBsb25nIGFkZHIsIHJlc19zdGFydCwgcmVzX3NpemU7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbzsKCXN0cnVjdCByZXNvdXJjZSAqcnA7CglzdHJ1Y3QgYXR5ZmJfcGFyICpwYXI7CglpbnQgaSwgcmMgPSAtRU5PTUVNOwoKCWZvciAoaSA9IEFSUkFZX1NJWkUoYXR5X2NoaXBzKSAtIDE7IGkgPj0gMDsgaS0tKQoJCWlmIChwZGV2LT5kZXZpY2UgPT0gYXR5X2NoaXBzW2ldLnBjaV9pZCkKCQkJYnJlYWs7CgoJaWYgKGkgPCAwKQoJCXJldHVybiAtRU5PREVWOwoKCS8qIEVuYWJsZSBkZXZpY2UgaW4gUENJIGNvbmZpZyAqLwoJaWYgKHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpKSB7CgkJUFJJTlRLRSgiQ2Fubm90IGVuYWJsZSBQQ0kgZGV2aWNlXG4iKTsKCQlyZXR1cm4gLUVOWElPOwoJfQoKCS8qIEZpbmQgd2hpY2ggcmVzb3VyY2UgdG8gdXNlICovCglycCA9ICZwZGV2LT5yZXNvdXJjZVswXTsKCWlmIChycC0+ZmxhZ3MgJiBJT1JFU09VUkNFX0lPKQoJCXJwID0gJnBkZXYtPnJlc291cmNlWzFdOwoJYWRkciA9IHJwLT5zdGFydDsKCWlmICghYWRkcikKCQlyZXR1cm4gLUVOWElPOwoKCS8qIFJlc2VydmUgc3BhY2UgKi8KCXJlc19zdGFydCA9IHJwLT5zdGFydDsKCXJlc19zaXplID0gcnAtPmVuZCAtIHJwLT5zdGFydCArIDE7CglpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbiAocmVzX3N0YXJ0LCByZXNfc2l6ZSwgImF0eWZiIikpCgkJcmV0dXJuIC1FQlVTWTsKCiAgICAgICAgLyogQWxsb2NhdGUgZnJhbWVidWZmZXIgKi8KCWluZm8gPSBmcmFtZWJ1ZmZlcl9hbGxvYyhzaXplb2Yoc3RydWN0IGF0eWZiX3BhciksICZwZGV2LT5kZXYpOwoJaWYgKCFpbmZvKSB7CgkJUFJJTlRLRSgiYXR5ZmJfcGNpX3Byb2JlKCkgY2FuJ3QgYWxsb2MgZmJfaW5mb1xuIik7CgkJcmV0dXJuIC1FTk9NRU07Cgl9CglwYXIgPSBpbmZvLT5wYXI7CglpbmZvLT5maXggPSBhdHlmYl9maXg7CglpbmZvLT5kZXZpY2UgPSAmcGRldi0+ZGV2OwoJcGFyLT5wY2lfaWQgPSBhdHlfY2hpcHNbaV0ucGNpX2lkOwoJcGFyLT5yZXNfc3RhcnQgPSByZXNfc3RhcnQ7CglwYXItPnJlc19zaXplID0gcmVzX3NpemU7CglwYXItPmlycSA9IHBkZXYtPmlycTsKCXBhci0+cGRldiA9IHBkZXY7CgoJLyogU2V0dXAgImluZm8iIHN0cnVjdHVyZSAqLwojaWZkZWYgX19zcGFyY19fCglyYyA9IGF0eWZiX3NldHVwX3NwYXJjKHBkZXYsIGluZm8sIGFkZHIpOwojZWxzZQoJcmMgPSBhdHlmYl9zZXR1cF9nZW5lcmljKHBkZXYsIGluZm8sIGFkZHIpOwojZW5kaWYKCWlmIChyYykKCQlnb3RvIGVycl9yZWxlYXNlX21lbTsKCglwY2lfc2V0X2RydmRhdGEocGRldiwgaW5mbyk7CgoJLyogSW5pdCBjaGlwICYgcmVnaXN0ZXIgZnJhbWVidWZmZXIgKi8KCWlmIChhdHlfaW5pdChpbmZvKSkKCQlnb3RvIGVycl9yZWxlYXNlX2lvOwoKI2lmZGVmIF9fc3BhcmNfXwoJaWYgKCFwcm9tX3BhbGV0dGUpCgkJcHJvbV9wYWxldHRlID0gYXR5ZmJfcGFsZXR0ZTsKCgkvKgoJICogQWRkIC9kZXYvZmIgbW1hcCB2YWx1ZXMuCgkgKi8KCXBhci0+bW1hcF9tYXBbMF0udm9mZiA9IDB4ODAwMDAwMDAwMDAwMDAwMFVMOwoJcGFyLT5tbWFwX21hcFswXS5wb2ZmID0gKHVuc2lnbmVkIGxvbmcpIGluZm8tPnNjcmVlbl9iYXNlICYgUEFHRV9NQVNLOwoJcGFyLT5tbWFwX21hcFswXS5zaXplID0gaW5mby0+Zml4LnNtZW1fbGVuOwoJcGFyLT5tbWFwX21hcFswXS5wcm90X21hc2sgPSBfUEFHRV9DQUNIRTsKCXBhci0+bW1hcF9tYXBbMF0ucHJvdF9mbGFnID0gX1BBR0VfRTsKCXBhci0+bW1hcF9tYXBbMV0udm9mZiA9IHBhci0+bW1hcF9tYXBbMF0udm9mZiArIGluZm8tPmZpeC5zbWVtX2xlbjsKCXBhci0+bW1hcF9tYXBbMV0ucG9mZiA9IChsb25nKXBhci0+YXRpX3JlZ2Jhc2UgJiBQQUdFX01BU0s7CglwYXItPm1tYXBfbWFwWzFdLnNpemUgPSBQQUdFX1NJWkU7CglwYXItPm1tYXBfbWFwWzFdLnByb3RfbWFzayA9IF9QQUdFX0NBQ0hFOwoJcGFyLT5tbWFwX21hcFsxXS5wcm90X2ZsYWcgPSBfUEFHRV9FOwojZW5kaWYgLyogX19zcGFyY19fICovCgoJcmV0dXJuIDA7CgplcnJfcmVsZWFzZV9pbzoKI2lmZGVmIF9fc3BhcmNfXwoJa2ZyZWUocGFyLT5tbWFwX21hcCk7CiNlbHNlCglpZiAocGFyLT5hdGlfcmVnYmFzZSkKCQlpb3VubWFwKHBhci0+YXRpX3JlZ2Jhc2UpOwoJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQoJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwojZW5kaWYKZXJyX3JlbGVhc2VfbWVtOgoJaWYgKHBhci0+YXV4X3N0YXJ0KQoJCXJlbGVhc2VfbWVtX3JlZ2lvbihwYXItPmF1eF9zdGFydCwgcGFyLT5hdXhfc2l6ZSk7CgoJcmVsZWFzZV9tZW1fcmVnaW9uKHBhci0+cmVzX3N0YXJ0LCBwYXItPnJlc19zaXplKTsKCWZyYW1lYnVmZmVyX3JlbGVhc2UoaW5mbyk7CgoJcmV0dXJuIHJjOwp9CgojZW5kaWYgLyogQ09ORklHX1BDSSAqLwoKI2lmZGVmIENPTkZJR19BVEFSSQoKc3RhdGljIGludCBfX2luaXQgYXR5ZmJfYXRhcmlfcHJvYmUodm9pZCkKewoJc3RydWN0IGF0eWZiX3BhciAqcGFyOwoJc3RydWN0IGZiX2luZm8gKmluZm87CglpbnQgbTY0X251bTsKCXUzMiBjbG9ja19yOwoJaW50IG51bV9mb3VuZCA9IDA7CgoJZm9yIChtNjRfbnVtID0gMDsgbTY0X251bSA8IG1hY2g2NF9jb3VudDsgbTY0X251bSsrKSB7CgkJaWYgKCFwaHlzX3ZtZW1iYXNlW202NF9udW1dIHx8ICFwaHlzX3NpemVbbTY0X251bV0gfHwKCQkgICAgIXBoeXNfZ3VpcmVnYmFzZVttNjRfbnVtXSkgewoJCSAgICBQUklOVEtJKCJwaHlzXypbJWRdIHBhcmFtZXRlcnMgbm90IHNldCA9PiByZXR1cm5pbmcgZWFybHkuIFxuIiwgbTY0X251bSk7CgkJCWNvbnRpbnVlOwoJCX0KCgkJaW5mbyA9IGZyYW1lYnVmZmVyX2FsbG9jKHNpemVvZihzdHJ1Y3QgYXR5ZmJfcGFyKSwgTlVMTCk7CgkJaWYgKCFpbmZvKSB7CgkJCVBSSU5US0UoImF0eWZiX2F0YXJpX3Byb2JlKCkgY2FuJ3QgYWxsb2MgZmJfaW5mb1xuIik7CgkJCXJldHVybiAtRU5PTUVNOwoJCX0KCQlwYXIgPSBpbmZvLT5wYXI7CgoJCWluZm8tPmZpeCA9IGF0eWZiX2ZpeDsKCgkJcGFyLT5pcnEgPSAodW5zaWduZWQgaW50KSAtMTsgLyogc29tZXRoaW5nIGludmFsaWQgKi8KCgkJLyoKCQkgKiAgTWFwIHRoZSB2aWRlbyBtZW1vcnkgKHBoeXNpY2FsIGFkZHJlc3MgZ2l2ZW4pIHRvIHNvbWV3aGVyZSBpbiB0aGUKCQkgKiAga2VybmVsIGFkZHJlc3Mgc3BhY2UuCgkJICovCgkJaW5mby0+c2NyZWVuX2Jhc2UgPSBpb3JlbWFwKHBoeXNfdm1lbWJhc2VbbTY0X251bV0sIHBoeXNfc2l6ZVttNjRfbnVtXSk7CgkJaW5mby0+Zml4LnNtZW1fc3RhcnQgPSAodW5zaWduZWQgbG9uZylpbmZvLT5zY3JlZW5fYmFzZTsgLyogRmFrZSEgKi8KCQlwYXItPmF0aV9yZWdiYXNlID0gaW9yZW1hcChwaHlzX2d1aXJlZ2Jhc2VbbTY0X251bV0sIDB4MTAwMDApICsKCQkJCQkJMHhGQzAwdWw7CgkJaW5mby0+Zml4Lm1taW9fc3RhcnQgPSAodW5zaWduZWQgbG9uZylwYXItPmF0aV9yZWdiYXNlOyAvKiBGYWtlISAqLwoKCQlhdHlfc3RfbGUzMihDTE9DS19DTlRMLCAweDEyMzQ1Njc4LCBwYXIpOwoJCWNsb2NrX3IgPSBhdHlfbGRfbGUzMihDTE9DS19DTlRMLCBwYXIpOwoKCQlzd2l0Y2ggKGNsb2NrX3IgJiAweDAwM0YpIHsKCQljYXNlIDB4MTI6CgkJCXBhci0+Y2xrX3dyX29mZnNldCA9IDM7IC8qICAqLwoJCQlicmVhazsKCQljYXNlIDB4MzQ6CgkJCXBhci0+Y2xrX3dyX29mZnNldCA9IDI7IC8qIE1lZHVzYSBTVC1JTyBJU0EgQWRhcHRlciBldGMuICovCgkJCWJyZWFrOwoJCWNhc2UgMHgxNjoKCQkJcGFyLT5jbGtfd3Jfb2Zmc2V0ID0gMTsgLyogICovCgkJCWJyZWFrOwoJCWNhc2UgMHgzODoKCQkJcGFyLT5jbGtfd3Jfb2Zmc2V0ID0gMDsgLyogUGFudGhlciAxIElTQSBBZGFwdGVyIChHZXJhbGQpICovCgkJCWJyZWFrOwoJCX0KCgkJLyogRmFrZSBwY2lfaWQgZm9yIGNvcnJlY3RfY2hpcHNldCgpICovCgkJc3dpdGNoIChhdHlfbGRfbGUzMihDT05GSUdfQ0hJUF9JRCwgcGFyKSAmIENGR19DSElQX1RZUEUpIHsKCQljYXNlIDB4MDBkNzoKCQkJcGFyLT5wY2lfaWQgPSBQQ0lfQ0hJUF9NQUNINjRHWDsKCQkJYnJlYWs7CgkJY2FzZSAweDAwNTc6CgkJCXBhci0+cGNpX2lkID0gUENJX0NISVBfTUFDSDY0Q1g7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWJyZWFrOwoJCX0KCgkJaWYgKGNvcnJlY3RfY2hpcHNldChwYXIpIHx8IGF0eV9pbml0KGluZm8pKSB7CgkJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwoJCQlpb3VubWFwKHBhci0+YXRpX3JlZ2Jhc2UpOwoJCQlmcmFtZWJ1ZmZlcl9yZWxlYXNlKGluZm8pOwoJCX0gZWxzZSB7CgkJCW51bV9mb3VuZCsrOwoJCX0KCX0KCglyZXR1cm4gbnVtX2ZvdW5kID8gMCA6IC1FTlhJTzsKfQoKI2VuZGlmIC8qIENPTkZJR19BVEFSSSAqLwoKI2lmZGVmIENPTkZJR19QQ0kKCnN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhdHlmYl9yZW1vdmUoc3RydWN0IGZiX2luZm8gKmluZm8pCnsKCXN0cnVjdCBhdHlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYXR5ZmJfcGFyICopIGluZm8tPnBhcjsKCgkvKiByZXN0b3JlIHZpZGVvIG1vZGUgKi8KCWF0eV9zZXRfY3J0YyhwYXIsICZzYXZlZF9jcnRjKTsKCXBhci0+cGxsX29wcy0+c2V0X3BsbChpbmZvLCAmc2F2ZWRfcGxsKTsKCiNpZmRlZiBDT05GSUdfRkJfQVRZX0JBQ0tMSUdIVAoJaWYgKE02NF9IQVMoTU9CSUxfQlVTKSkKCQlhdHlfYmxfZXhpdChwYXIpOwojZW5kaWYKCgl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKGluZm8pOwoKI2lmZGVmIENPTkZJR19NVFJSCglpZiAocGFyLT5tdHJyX3JlZyA+PSAwKSB7CgkgICAgbXRycl9kZWwocGFyLT5tdHJyX3JlZywgMCwgMCk7CgkgICAgcGFyLT5tdHJyX3JlZyA9IC0xOwoJfQoJaWYgKHBhci0+bXRycl9hcGVyID49IDApIHsKCSAgICBtdHJyX2RlbChwYXItPm10cnJfYXBlciwgMCwgMCk7CgkgICAgcGFyLT5tdHJyX2FwZXIgPSAtMTsKCX0KI2VuZGlmCiNpZm5kZWYgX19zcGFyY19fCglpZiAocGFyLT5hdGlfcmVnYmFzZSkKCQlpb3VubWFwKHBhci0+YXRpX3JlZ2Jhc2UpOwoJaWYgKGluZm8tPnNjcmVlbl9iYXNlKQoJCWlvdW5tYXAoaW5mby0+c2NyZWVuX2Jhc2UpOwojaWZkZWYgX19CSUdfRU5ESUFOCglpZiAoaW5mby0+c3ByaXRlLmFkZHIpCgkJaW91bm1hcChpbmZvLT5zcHJpdGUuYWRkcik7CiNlbmRpZgojZW5kaWYKI2lmZGVmIF9fc3BhcmNfXwoJa2ZyZWUocGFyLT5tbWFwX21hcCk7CiNlbmRpZgoJaWYgKHBhci0+YXV4X3N0YXJ0KQoJCXJlbGVhc2VfbWVtX3JlZ2lvbihwYXItPmF1eF9zdGFydCwgcGFyLT5hdXhfc2l6ZSk7CgoJaWYgKHBhci0+cmVzX3N0YXJ0KQoJCXJlbGVhc2VfbWVtX3JlZ2lvbihwYXItPnJlc19zdGFydCwgcGFyLT5yZXNfc2l6ZSk7CgoJZnJhbWVidWZmZXJfcmVsZWFzZShpbmZvKTsKfQoKCnN0YXRpYyB2b2lkIF9fZGV2ZXhpdCBhdHlmYl9wY2lfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpwZGV2KQp7CglzdHJ1Y3QgZmJfaW5mbyAqaW5mbyA9IHBjaV9nZXRfZHJ2ZGF0YShwZGV2KTsKCglhdHlmYl9yZW1vdmUoaW5mbyk7Cn0KCi8qCiAqIFRoaXMgZHJpdmVyIHVzZXMgaXRzIG93biBtYXRjaGluZyB0YWJsZS4gVGhhdCB3aWxsIGJlIG1vcmUgZGlmZmljdWx0CiAqIHRvIGZpeCwgc28gZm9yIG5vdywgd2UganVzdCBtYXRjaCBhZ2FpbnN0IGFueSBBVEkgSUQgYW5kIGxldCB0aGUKICogcHJvYmUoKSBmdW5jdGlvbiBmaW5kIG91dCB3aGF0J3MgdXAuIFRoYXQgYWxzbyBtZWFuIHdlIGRvbid0IGhhdmUKICogYSBtb2R1bGUgSUQgdGFibGUgdGhvdWdoLgogKi8Kc3RhdGljIHN0cnVjdCBwY2lfZGV2aWNlX2lkIGF0eWZiX3BjaV90YmxbXSA9IHsKCXsgUENJX1ZFTkRPUl9JRF9BVEksIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIFBDSV9BTllfSUQsCgkgIFBDSV9CQVNFX0NMQVNTX0RJU1BMQVkgPDwgMTYsIDB4ZmYwMDAwLCAwIH0sCgl7IDAsIH0KfTsKCnN0YXRpYyBzdHJ1Y3QgcGNpX2RyaXZlciBhdHlmYl9kcml2ZXIgPSB7CgkubmFtZQkJPSAiYXR5ZmIiLAoJLmlkX3RhYmxlCT0gYXR5ZmJfcGNpX3RibCwKCS5wcm9iZQkJPSBhdHlmYl9wY2lfcHJvYmUsCgkucmVtb3ZlCQk9IF9fZGV2ZXhpdF9wKGF0eWZiX3BjaV9yZW1vdmUpLAojaWZkZWYgQ09ORklHX1BNCgkuc3VzcGVuZAk9IGF0eWZiX3BjaV9zdXNwZW5kLAoJLnJlc3VtZQkJPSBhdHlmYl9wY2lfcmVzdW1lLAojZW5kaWYgLyogQ09ORklHX1BNICovCn07CgojZW5kaWYgLyogQ09ORklHX1BDSSAqLwoKI2lmbmRlZiBNT0RVTEUKc3RhdGljIGludCBfX2luaXQgYXR5ZmJfc2V0dXAoY2hhciAqb3B0aW9ucykKewoJY2hhciAqdGhpc19vcHQ7CgoJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKCQlyZXR1cm4gMDsKCgl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CgkJaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibm9hY2NlbCIsIDcpKSB7CgkJCW5vYWNjZWwgPSAxOwojaWZkZWYgQ09ORklHX01UUlIKCQl9IGVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibm9tdHJyIiwgNikpIHsKCQkJbm9tdHJyID0gMTsKI2VuZGlmCgkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgInZyYW06IiwgNSkpCgkJCXZyYW0gPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDUsIE5VTEwsIDApOwoJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAicGxsOiIsIDQpKQoJCQlwbGwgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDQsIE5VTEwsIDApOwoJCWVsc2UgaWYgKCFzdHJuY21wKHRoaXNfb3B0LCAibWNsazoiLCA1KSkKCQkJbWNsayA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0ICsgNSwgTlVMTCwgMCk7CgkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ4Y2xrOiIsIDUpKQoJCQl4Y2xrID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNSwgTlVMTCwgMCk7CgkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJjb21wX3N5bmM6IiwgMTApKQoJCQljb21wX3N5bmMgPSBzaW1wbGVfc3RydG91bCh0aGlzX29wdCsxMCwgTlVMTCwgMCk7CiNpZmRlZiBDT05GSUdfUFBDCgkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJ2bW9kZToiLCA2KSkgewoJCQl1bnNpZ25lZCBpbnQgdm1vZGUgPQoJCQkgICAgc2ltcGxlX3N0cnRvdWwodGhpc19vcHQgKyA2LCBOVUxMLCAwKTsKCQkJaWYgKHZtb2RlID4gMCAmJiB2bW9kZSA8PSBWTU9ERV9NQVgpCgkJCQlkZWZhdWx0X3Ztb2RlID0gdm1vZGU7CgkJfSBlbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImNtb2RlOiIsIDYpKSB7CgkJCXVuc2lnbmVkIGludCBjbW9kZSA9CgkJCSAgICBzaW1wbGVfc3RydG91bCh0aGlzX29wdCArIDYsIE5VTEwsIDApOwoJCQlzd2l0Y2ggKGNtb2RlKSB7CgkJCWNhc2UgMDoKCQkJY2FzZSA4OgoJCQkJZGVmYXVsdF9jbW9kZSA9IENNT0RFXzg7CgkJCQlicmVhazsKCQkJY2FzZSAxNToKCQkJY2FzZSAxNjoKCQkJCWRlZmF1bHRfY21vZGUgPSBDTU9ERV8xNjsKCQkJCWJyZWFrOwoJCQljYXNlIDI0OgoJCQljYXNlIDMyOgoJCQkJZGVmYXVsdF9jbW9kZSA9IENNT0RFXzMyOwoJCQkJYnJlYWs7CgkJCX0KCQl9CiNlbmRpZgojaWZkZWYgQ09ORklHX0FUQVJJCgkJLyoKCQkgKiBXaHkgZG8gd2UgbmVlZCB0aGlzIHNpbGx5IE1hY2g2NCBhcmd1bWVudD8KCQkgKiBXZSBhcmUgYWxyZWFkeSBoZXJlIGJlY2F1c2Ugb2YgbWFjaDY0PSBzbyBpdHMgcmVkdW5kYW50LgoJCSAqLwoJCWVsc2UgaWYgKE1BQ0hfSVNfQVRBUkkKCQkJICYmICghc3RybmNtcCh0aGlzX29wdCwgIk1hY2g2NDoiLCA3KSkpIHsKCQkJc3RhdGljIHVuc2lnbmVkIGNoYXIgbTY0X251bTsKCQkJc3RhdGljIGNoYXIgbWFjaDY0X3N0cls4MF07CgkJCXN0cmxjcHkobWFjaDY0X3N0ciwgdGhpc19vcHQgKyA3LCBzaXplb2YobWFjaDY0X3N0cikpOwoJCQlpZiAoIXN0b3JlX3ZpZGVvX3BhcihtYWNoNjRfc3RyLCBtNjRfbnVtKSkgewoJCQkJbTY0X251bSsrOwoJCQkJbWFjaDY0X2NvdW50ID0gbTY0X251bTsKCQkJfQoJCX0KI2VuZGlmCgkJZWxzZQoJCQltb2RlID0gdGhpc19vcHQ7Cgl9CglyZXR1cm4gMDsKfQojZW5kaWYgIC8qICBNT0RVTEUgICovCgpzdGF0aWMgaW50IF9faW5pdCBhdHlmYl9pbml0KHZvaWQpCnsKICAgIGludCBlcnIxID0gMSwgZXJyMiA9IDE7CiNpZm5kZWYgTU9EVUxFCiAgICBjaGFyICpvcHRpb24gPSBOVUxMOwoKICAgIGlmIChmYl9nZXRfb3B0aW9ucygiYXR5ZmIiLCAmb3B0aW9uKSkKCXJldHVybiAtRU5PREVWOwogICAgYXR5ZmJfc2V0dXAob3B0aW9uKTsKI2VuZGlmCgojaWZkZWYgQ09ORklHX1BDSQogICAgZXJyMSA9IHBjaV9yZWdpc3Rlcl9kcml2ZXIoJmF0eWZiX2RyaXZlcik7CiNlbmRpZgojaWZkZWYgQ09ORklHX0FUQVJJCiAgICBlcnIyID0gYXR5ZmJfYXRhcmlfcHJvYmUoKTsKI2VuZGlmCgogICAgcmV0dXJuIChlcnIxICYmIGVycjIpID8gLUVOT0RFViA6IDA7Cn0KCnN0YXRpYyB2b2lkIF9fZXhpdCBhdHlmYl9leGl0KHZvaWQpCnsKI2lmZGVmIENPTkZJR19QQ0kKCXBjaV91bnJlZ2lzdGVyX2RyaXZlcigmYXR5ZmJfZHJpdmVyKTsKI2VuZGlmCn0KCm1vZHVsZV9pbml0KGF0eWZiX2luaXQpOwptb2R1bGVfZXhpdChhdHlmYl9leGl0KTsKCk1PRFVMRV9ERVNDUklQVElPTigiRkJEZXYgZHJpdmVyIGZvciBBVEkgTWFjaDY0IGNhcmRzIik7Ck1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKbW9kdWxlX3BhcmFtKG5vYWNjZWwsIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vYWNjZWwsICJib29sOiBkaXNhYmxlIGFjY2VsZXJhdGlvbiIpOwptb2R1bGVfcGFyYW0odnJhbSwgaW50LCAwKTsKTU9EVUxFX1BBUk1fREVTQyh2cmFtLCAiaW50OiBvdmVycmlkZSBzaXplIG9mIHZpZGVvIHJhbSIpOwptb2R1bGVfcGFyYW0ocGxsLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHBsbCwgImludDogb3ZlcnJpZGUgdmlkZW8gY2xvY2siKTsKbW9kdWxlX3BhcmFtKG1jbGssIGludCwgMCk7Ck1PRFVMRV9QQVJNX0RFU0MobWNsaywgImludDogb3ZlcnJpZGUgbWVtb3J5IGNsb2NrIik7Cm1vZHVsZV9wYXJhbSh4Y2xrLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKHhjbGssICJpbnQ6IG92ZXJyaWRlIGFjY2VsZXJhdGVkIGVuZ2luZSBjbG9jayIpOwptb2R1bGVfcGFyYW0oY29tcF9zeW5jLCBpbnQsIDApOwpNT0RVTEVfUEFSTV9ERVNDKGNvbXBfc3luYywKCQkgIlNldCBjb21wb3NpdGUgc3luYyBzaWduYWwgdG8gbG93ICgwKSBvciBoaWdoICgxKSIpOwptb2R1bGVfcGFyYW0obW9kZSwgY2hhcnAsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG1vZGUsICJTcGVjaWZ5IHJlc29sdXRpb24gYXMgXCI8eHJlcz54PHlyZXM+Wy08YnBwPl1bQDxyZWZyZXNoPl1cIiAiKTsKI2lmZGVmIENPTkZJR19NVFJSCm1vZHVsZV9wYXJhbShub210cnIsIGJvb2wsIDApOwpNT0RVTEVfUEFSTV9ERVNDKG5vbXRyciwgImJvb2w6IGRpc2FibGUgdXNlIG9mIE1UUlIgcmVnaXN0ZXJzIik7CiNlbmRpZgo=