LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPHBjaS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vcGNpLmg+CgojaWZkZWYgQ09ORklHX1BDSQojdW5kZWYgUENJX1JPTV9TQ0FOX1ZFUkJPU0UKCmludCBwY2lfc2hhZG93X3JvbShwY2lfZGV2X3QgZGV2LCB1bnNpZ25lZCBjaGFyICpkZXN0KQp7CglzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CglpbnQgcmVzID0gLTE7CglpbnQgaTsKCgl1MzIgcm9tX2FkZHI7Cgl1MzIgYWRkcl9yZWc7Cgl1MzIgc2l6ZTsKCgl1MTYgdmVuZG9yOwoJdTE2IGRldmljZTsKCXUzMiBjbGFzc19jb2RlOwoKCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoUENJX0JVUyhkZXYpKTsKI2lmIDAKCXByaW50ZigicGNpX3NoYWRvd19yb20oKSBhc2tlZCB0byBzaGFkb3cgZGV2aWNlICV4IHRvICV4XG4iLAoJICAgICAgIGRldiwgKHUzMilkZXN0KTsKI2VuZGlmCglwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9WRU5ET1JfSUQsICZ2ZW5kb3IpOwoJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlKTsKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmNsYXNzX2NvZGUpOwoKIAljbGFzc19jb2RlICY9IDB4ZmZmZmZmMDA7CgljbGFzc19jb2RlID4+PSA4OwoKI2lmIDAKCXByaW50ZigiUENJIEhlYWRlciBWZW5kb3IgJTA0eCBkZXZpY2UgJTA0eCBjbGFzcyAlMDZ4XG4iLAoJICAgICAgIHZlbmRvciwgZGV2aWNlLCBjbGFzc19jb2RlKTsKI2VuZGlmCgkvKiBFbmFibGUgdGhlIHJvbSBhZGRlc3MgZGVjb2RlciAqLwoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywgUENJX1JPTV9BRERSRVNTX01BU0spOwoJcGNpX3JlYWRfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAmYWRkcl9yZWcpOwoKCWlmICghYWRkcl9yZWcpIHsKCQkvKiByZWdpc3RlciB1bmltcGxlbWVudGVkICovCgkJcHJpbnRmKCJwY2lfY2hhZG93X3JvbTogZGV2aWNlIGRvIG5vdCBzZWVtIHRvIGhhdmUgYSByb21cbiIpOwoJCXJldHVybiAtMTsKCX0KCglzaXplID0gKH4oYWRkcl9yZWcmUENJX1JPTV9BRERSRVNTX01BU0spKSsxOwoKI2lmIDAKCXByaW50ZigiUk9NIGlzICVkIGJ5dGVzXG4iLCBzaXplKTsKI2VuZGlmCglyb21fYWRkciA9IHBjaV9nZXRfcm9tX3dpbmRvdyhob3NlLCBzaXplKTsKI2lmIDAKCXByaW50ZigiUk9NIG1hcHBlZCBhdCAleCBcbiIsIHJvbV9hZGRyKTsKI2VuZGlmCglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLAoJCQkgICAgICAgcGNpX3BoeXNfdG9fbWVtKGRldiwgcm9tX2FkZHIpCgkJCSAgICAgICB8UENJX1JPTV9BRERSRVNTX0VOQUJMRSk7CgoKCWZvciAoaT1yb21fYWRkcjtpPHJvbV9hZGRyK3NpemU7IGkrPTUxMikgewoKCgkJaWYgKHJlYWR3KGkpID09IDB4YWE1NSkgewoJCQl1MzIgcGNpX2RhdGE7CiNpZmRlZiBQQ0lfUk9NX1NDQU5fVkVSQk9TRQoJCQlwcmludGYoIlJPTSBzaWduYXR1cmUgZm91bmRcbiIpOwojZW5kaWYKCQkJcGNpX2RhdGEgPSByZWFkdygweDE4K2kpOwoJCQlwY2lfZGF0YSArPSBpOwoKCQkJaWYgKDA9PW1lbWNtcCgodm9pZCopcGNpX2RhdGEsICJQQ0lSIiwgNCkpIHsKI2lmZGVmIFBDSV9ST01fU0NBTl9WRVJCT1NFCgkJCQlwcmludGYoIkZvdW50IFBDSSByb20gaW1hZ2UgYXQgb2Zmc2V0ICVkXG4iLCBpLXJvbV9hZGRyKTsKCQkJCXByaW50ZigiVmVuZG9yICUwNHggZGV2aWNlICUwNHggY2xhc3MgJTA2eFxuIiwKCQkJCSAgICAgICByZWFkdyhwY2lfZGF0YSs0KSwgcmVhZHcocGNpX2RhdGErNiksCgkJCQkgICAgICAgcmVhZGwocGNpX2RhdGErMHgwZCkmMHhmZmZmZmYpOwoJCQkJcHJpbnRmKCIlc1xuIiwKCQkJCSAgICAgICAocmVhZHcocGNpX2RhdGErMHgxNSkgJjB4ODApPwoJCQkJICAgICAgICJMYXN0IGltYWdlIjoiTW9yZSBpbWFnZXMgZm9sbG93Iik7CgkJCQlzd2l0Y2ggCShyZWFkYihwY2lfZGF0YSsweDE0KSkgewoJCQkJY2FzZSAwOgoJCQkJCXByaW50ZigiWDg2IGNvZGVcbiIpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAxOgoJCQkJCXByaW50ZigiT3BlbmZpcm13YXJlIGNvZGVcbiIpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAyOgoJCQkJCXByaW50ZigiUEFSSVNDIGNvZGVcbiIpOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJcHJpbnRmKCJJbWFnZSBzaXplICVkXG4iLCByZWFkdyhwY2lfZGF0YSsweDEwKSAqIDUxMik7CiNlbmRpZgoJCQkJLyogRml4TWU6IEkgdGhpbmsgd2Ugc2hvdWxkIGNvbXBhcmUgdGhlIGNsYXNzIGNvZGUKCQkJCSAqIGJ5dGVzIGFzIHdlbGwgYnV0IEkgaGF2ZSBubyByZWZlcmVuY2Ugb24gdGhlCgkJCQkgKiBleGFjdCBvcmRlciBvZiB0aGVzZSBieXRlcyBpbiB0aGUgUENJIFJPTSBoZWFkZXIgKi8KCQkJCWlmIChyZWFkdyhwY2lfZGF0YSs0KSA9PSB2ZW5kb3IgJiYKCQkJCSAgICByZWFkdyhwY2lfZGF0YSs2KSA9PSBkZXZpY2UgJiYKCQkJCSAgICAvKiAocmVhZGwocGNpX2RhdGErMHgwZCkmMHhmZmZmZmYpID09IGNsYXNzX2NvZGUgJiYgKi8KCQkJCSAgICByZWFkYihwY2lfZGF0YSsweDE0KSA9PSAwIC8qIHg4NiBjb2RlIGltYWdlICovICkgewojaWZkZWYgUENJX1JPTV9TQ0FOX1ZFUkJPU0UKCQkJCQlwcmludGYoIlN1aXRhYmxlIFJPTSBpbWFnZSBmb3VuZCwgY29weWluZ1xuIik7CiNlbmRpZgoJCQkJCW1lbW1vdmUoZGVzdCwgKHZvaWQqKXJvbV9hZGRyLCByZWFkdyhwY2lfZGF0YSsweDEwKSAqIDUxMik7CgkJCQkJcmVzID0gMDsKCQkJCQlicmVhazsKCgkJCQl9CgkJCQlpZiAocmVhZHcocGNpX2RhdGErMHgxNSkgJjB4ODApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCgl9CgojaWZkZWYgUENJX1JPTV9TQ0FOX1ZFUkJPU0UKCWlmIChyZXMpIHsKCQlwcmludGYoIk5vIHN1aXRhYmxlIGltYWdlIGZvdW5kXG4iKTsKCX0KI2VuZGlmCgkvKiBkaXNhYmxlIFBBUiByZWdpc3RlciBhbmQgUENJIGRldmljZSBST00gYWRkcmVzcyBkZXZvY2VyICovCglwY2lfcmVtb3ZlX3JvbV93aW5kb3coaG9zZSwgcm9tX2FkZHIpOwoKCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsIDApOwoKCXJldHVybiByZXM7Cn0KCiNlbmRpZgo=