LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPHBjaS5oPgojaW5jbHVkZSA8YXNtL2lvLmg+CiNpbmNsdWRlIDxhc20vcGNpLmg+CgojdW5kZWYgUENJX1JPTV9TQ0FOX1ZFUkJPU0UKCmludCBwY2lfc2hhZG93X3JvbShwY2lfZGV2X3QgZGV2LCB1bnNpZ25lZCBjaGFyICpkZXN0KQp7CglzdHJ1Y3QgcGNpX2NvbnRyb2xsZXIgKmhvc2U7CglpbnQgcmVzID0gLTE7CglpbnQgaTsKCgl1MzIgcm9tX2FkZHI7Cgl1MzIgYWRkcl9yZWc7Cgl1MzIgc2l6ZTsKCgl1MTYgdmVuZG9yOwoJdTE2IGRldmljZTsKCXUzMiBjbGFzc19jb2RlOwoKCWhvc2UgPSBwY2lfYnVzX3RvX2hvc2UoUENJX0JVUyhkZXYpKTsKI2lmIDAKCXByaW50ZigicGNpX3NoYWRvd19yb20oKSBhc2tlZCB0byBzaGFkb3cgZGV2aWNlICV4IHRvICV4XG4iLAoJICAgICAgIGRldiwgKHUzMilkZXN0KTsKI2VuZGlmCglwY2lfcmVhZF9jb25maWdfd29yZChkZXYsIFBDSV9WRU5ET1JfSUQsICZ2ZW5kb3IpOwoJcGNpX3JlYWRfY29uZmlnX3dvcmQoZGV2LCBQQ0lfREVWSUNFX0lELCAmZGV2aWNlKTsKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9DTEFTU19SRVZJU0lPTiwgJmNsYXNzX2NvZGUpOwoKCWNsYXNzX2NvZGUgJj0gMHhmZmZmZmYwMDsKCWNsYXNzX2NvZGUgPj49IDg7CgojaWYgMAoJcHJpbnRmKCJQQ0kgSGVhZGVyIFZlbmRvciAlMDR4IGRldmljZSAlMDR4IGNsYXNzICUwNnhcbiIsCgkgICAgICAgdmVuZG9yLCBkZXZpY2UsIGNsYXNzX2NvZGUpOwojZW5kaWYKCS8qIEVuYWJsZSB0aGUgcm9tIGFkZGVzcyBkZWNvZGVyICovCglwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgUENJX1JPTV9BRERSRVNTLCAodTMyKVBDSV9ST01fQUREUkVTU19NQVNLKTsKCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywgJmFkZHJfcmVnKTsKCglpZiAoIWFkZHJfcmVnKSB7CgkJLyogcmVnaXN0ZXIgdW5pbXBsZW1lbnRlZCAqLwoJCXByaW50ZigicGNpX2NoYWRvd19yb206IGRldmljZSBkbyBub3Qgc2VlbSB0byBoYXZlIGEgcm9tXG4iKTsKCQlyZXR1cm4gLTE7Cgl9CgoJc2l6ZSA9ICh+KGFkZHJfcmVnJlBDSV9ST01fQUREUkVTU19NQVNLKSkrMTsKCiNpZiAwCglwcmludGYoIlJPTSBpcyAlZCBieXRlc1xuIiwgc2l6ZSk7CiNlbmRpZgoJcm9tX2FkZHIgPSBwY2lfZ2V0X3JvbV93aW5kb3coaG9zZSwgc2l6ZSk7CiNpZiAwCglwcmludGYoIlJPTSBtYXBwZWQgYXQgJXggXG4iLCByb21fYWRkcik7CiNlbmRpZgoJcGNpX3dyaXRlX2NvbmZpZ19kd29yZChkZXYsIFBDSV9ST01fQUREUkVTUywKCQkJICAgICAgIHBjaV9waHlzX3RvX21lbShkZXYsIHJvbV9hZGRyKQoJCQkgICAgICAgfFBDSV9ST01fQUREUkVTU19FTkFCTEUpOwoKCglmb3IgKGk9cm9tX2FkZHI7aTxyb21fYWRkcitzaXplOyBpKz01MTIpIHsKCgoJCWlmIChyZWFkdyhpKSA9PSAweGFhNTUpIHsKCQkJdTMyIHBjaV9kYXRhOwojaWZkZWYgUENJX1JPTV9TQ0FOX1ZFUkJPU0UKCQkJcHJpbnRmKCJST00gc2lnbmF0dXJlIGZvdW5kXG4iKTsKI2VuZGlmCgkJCXBjaV9kYXRhID0gcmVhZHcoMHgxOCtpKTsKCQkJcGNpX2RhdGEgKz0gaTsKCgkJCWlmICgwPT1tZW1jbXAoKHZvaWQqKXBjaV9kYXRhLCAiUENJUiIsIDQpKSB7CiNpZmRlZiBQQ0lfUk9NX1NDQU5fVkVSQk9TRQoJCQkJcHJpbnRmKCJGb3VudCBQQ0kgcm9tIGltYWdlIGF0IG9mZnNldCAlZFxuIiwgaS1yb21fYWRkcik7CgkJCQlwcmludGYoIlZlbmRvciAlMDR4IGRldmljZSAlMDR4IGNsYXNzICUwNnhcbiIsCgkJCQkgICAgICAgcmVhZHcocGNpX2RhdGErNCksIHJlYWR3KHBjaV9kYXRhKzYpLAoJCQkJICAgICAgIHJlYWRsKHBjaV9kYXRhKzB4MGQpJjB4ZmZmZmZmKTsKCQkJCXByaW50ZigiJXNcbiIsCgkJCQkgICAgICAgKHJlYWR3KHBjaV9kYXRhKzB4MTUpICYweDgwKT8KCQkJCSAgICAgICAiTGFzdCBpbWFnZSI6Ik1vcmUgaW1hZ2VzIGZvbGxvdyIpOwoJCQkJc3dpdGNoCShyZWFkYihwY2lfZGF0YSsweDE0KSkgewoJCQkJY2FzZSAwOgoJCQkJCXByaW50ZigiWDg2IGNvZGVcbiIpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAxOgoJCQkJCXByaW50ZigiT3BlbmZpcm13YXJlIGNvZGVcbiIpOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAyOgoJCQkJCXByaW50ZigiUEFSSVNDIGNvZGVcbiIpOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQkJcHJpbnRmKCJJbWFnZSBzaXplICVkXG4iLCByZWFkdyhwY2lfZGF0YSsweDEwKSAqIDUxMik7CiNlbmRpZgoJCQkJLyogRml4TWU6IEkgdGhpbmsgd2Ugc2hvdWxkIGNvbXBhcmUgdGhlIGNsYXNzIGNvZGUKCQkJCSAqIGJ5dGVzIGFzIHdlbGwgYnV0IEkgaGF2ZSBubyByZWZlcmVuY2Ugb24gdGhlCgkJCQkgKiBleGFjdCBvcmRlciBvZiB0aGVzZSBieXRlcyBpbiB0aGUgUENJIFJPTSBoZWFkZXIgKi8KCQkJCWlmIChyZWFkdyhwY2lfZGF0YSs0KSA9PSB2ZW5kb3IgJiYKCQkJCSAgICByZWFkdyhwY2lfZGF0YSs2KSA9PSBkZXZpY2UgJiYKCQkJCSAgICAvKiAocmVhZGwocGNpX2RhdGErMHgwZCkmMHhmZmZmZmYpID09IGNsYXNzX2NvZGUgJiYgKi8KCQkJCSAgICByZWFkYihwY2lfZGF0YSsweDE0KSA9PSAwIC8qIHg4NiBjb2RlIGltYWdlICovICkgewojaWZkZWYgUENJX1JPTV9TQ0FOX1ZFUkJPU0UKCQkJCQlwcmludGYoIlN1aXRhYmxlIFJPTSBpbWFnZSBmb3VuZCwgY29weWluZ1xuIik7CiNlbmRpZgoJCQkJCW1lbW1vdmUoZGVzdCwgKHZvaWQqKXJvbV9hZGRyLCByZWFkdyhwY2lfZGF0YSsweDEwKSAqIDUxMik7CgkJCQkJcmVzID0gMDsKCQkJCQlicmVhazsKCgkJCQl9CgkJCQlpZiAocmVhZHcocGNpX2RhdGErMHgxNSkgJjB4ODApIHsKCQkJCQlicmVhazsKCQkJCX0KCQkJfQoJCX0KCgl9CgojaWZkZWYgUENJX1JPTV9TQ0FOX1ZFUkJPU0UKCWlmIChyZXMpIHsKCQlwcmludGYoIk5vIHN1aXRhYmxlIGltYWdlIGZvdW5kXG4iKTsKCX0KI2VuZGlmCgkvKiBkaXNhYmxlIFBBUiByZWdpc3RlciBhbmQgUENJIGRldmljZSBST00gYWRkcmVzcyBkZXZvY2VyICovCglwY2lfcmVtb3ZlX3JvbV93aW5kb3coaG9zZSwgcm9tX2FkZHIpOwoKCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCBQQ0lfUk9NX0FERFJFU1MsIDApOwoKCXJldHVybiByZXM7Cn0K