LyoKICogTFRDMjk1MiAoUG93ZXJQYXRoKSBkcml2ZXIKICoKICogQ29weXJpZ2h0IChDKSAyMDE0LCBYc2VucyBUZWNobm9sb2dpZXMgQlYgPGluZm9AeHNlbnMuY29tPgogKiBNYWludGFpbmVyOiBSZW7pIE1vbGwgPGxpbnV4QHItbW9sbC5ubD4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAtIERlc2NyaXB0aW9uCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogVGhpcyBkcml2ZXIgaXMgdG8gYmUgdXNlZCB3aXRoIGFuIGV4dGVybmFsIFBvd2VyUGF0aCBDb250cm9sbGVyIChMVEMyOTUyKS4KICogSXRzIGZ1bmN0aW9uIGlzIHRvIGRldGVybWluZSB3aGVuIGEgZXh0ZXJuYWwgc2h1dCBkb3duIGlzIHRyaWdnZXJlZAogKiBhbmQgcmVhY3QgYnkgcHJvcGVybHkgc2h1dHRpbmcgZG93biB0aGUgc3lzdGVtLgogKgogKiBUaGlzIGRyaXZlciBleHBlY3RzIGEgZGV2aWNlIHRyZWUgd2l0aCBhIGx0YzI5NTIgZW50cnkgZm9yIHBpbiBtYXBwaW5nLgogKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIC0gR1BJTwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFRoZSBmb2xsb3dpbmcgR1BJT3MgYXJlIHVzZWQ6CiAqIC0gdHJpZ2dlciAoaW5wdXQpCiAqICAgICBBIGxldmVsIGNoYW5nZSBpbmRpY2F0ZXMgdGhlIHNodXQtZG93biB0cmlnZ2VyLiBJZiBpdCdzIHN0YXRlIHJldmVydHMKICogICAgIHdpdGhpbiB0aGUgdGltZS1vdXQgZGVmaW5lZCBieSB0cmlnZ2VyX2RlbGF5LCB0aGUgc2h1dCBkb3duIGlzIG5vdAogKiAgICAgZXhlY3V0ZWQuCiAqCiAqIC0gd2F0Y2hkb2cgKG91dHB1dCkKICogICAgIE9uY2UgYSBzaHV0IGRvd24gaXMgdHJpZ2dlcmVkLCB0aGUgZHJpdmVyIHdpbGwgdG9nZ2xlIHRoaXMgc2lnbmFsLAogKiAgICAgd2l0aCBhbiBpbnRlcm5hbCAod2RlX2ludGVydmFsKSB0byBzdGFsbCB0aGUgaGFyZHdhcmUgc2h1dCBkb3duLgogKgogKiAtIGtpbGwgKG91dHB1dCkKICogICAgIFRoZSBsYXN0IGFjdGlvbiBkdXJpbmcgc2h1dCBkb3duIGlzIHRyaWdnZXJpbmcgdGhpcyBzaWduYWxsaW5nLCBzdWNoCiAqICAgICB0aGF0IHRoZSBQb3dlclBhdGggQ29udHJvbCB3aWxsIHBvd2VyIGRvd24gdGhlIGhhcmR3YXJlLgogKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIC0gSW50ZXJydXB0cwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFRoZSBkcml2ZXIgcmVxdWlyZXMgYSBub24tc2hhcmVkLCBlZGdlLXRyaWdnZXJlZCBpbnRlcnJ1cHQgb24gdGhlIHRyaWdnZXIKICogR1BJTy4KICoKICovCgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgva21vZC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CiNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KCnN0cnVjdCBsdGMyOTUyX3Bvd2Vyb2ZmIHsKCXN0cnVjdCBocnRpbWVyIHRpbWVyX3RyaWdnZXI7CglzdHJ1Y3QgaHJ0aW1lciB0aW1lcl93ZGU7CgoJa3RpbWVfdCB0cmlnZ2VyX2RlbGF5OwoJa3RpbWVfdCB3ZGVfaW50ZXJ2YWw7CgoJc3RydWN0IGRldmljZSAqZGV2OwoKCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9fdHJpZ2dlcjsKCXN0cnVjdCBncGlvX2Rlc2MgKmdwaW9fd2F0Y2hkb2c7CglzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvX2tpbGw7CgoJYm9vbCBrZXJuZWxfcGFuaWM7CglzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcGFuaWNfbm90aWZpZXI7Cn07CgojZGVmaW5lIHRvX2x0YzI5NTIocCwgbSkgY29udGFpbmVyX29mKHAsIHN0cnVjdCBsdGMyOTUyX3Bvd2Vyb2ZmLCBtKQoKLyoKICogVGhpcyBnbG9iYWwgdmFyaWFibGUgaXMgb25seSBuZWVkZWQgZm9yIHBtX3Bvd2VyX29mZi4gV2Ugc2hvdWxkCiAqIHJlbW92ZSBpdCBlbnRpcmVseSBvbmNlIHdlIGRvbid0IG5lZWQgdGhlIGdsb2JhbCBzdGF0ZSBhbnltb3JlLgogKi8Kc3RhdGljIHN0cnVjdCBsdGMyOTUyX3Bvd2Vyb2ZmICpsdGMyOTUyX2RhdGE7CgovKioKICogbHRjMjk1Ml9wb3dlcm9mZl90aW1lcl93ZGUgLSBUaW1lciBjYWxsYmFjawogKiBUb2dnbGVzIHRoZSB3YXRjaGRvZyByZXNldCBzaWduYWwgZWFjaCB3ZGVfaW50ZXJ2YWwKICoKICogQHRpbWVyOiBjb3JyZXNwb25kaW5nIHRpbWVyCiAqCiAqIFJldHVybnMgSFJUSU1FUl9SRVNUQVJUIGZvciBhbiBpbmZpbml0ZSBsb29wIHdoaWNoIHdpbGwgb25seSBzdG9wIHdoZW4gdGhlCiAqIG1hY2hpbmUgYWN0dWFsbHkgc2h1dHMgZG93bgogKi8Kc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGx0YzI5NTJfcG93ZXJvZmZfdGltZXJfd2RlKHN0cnVjdCBocnRpbWVyICp0aW1lcikKewoJa3RpbWVfdCBub3c7CglpbnQgc3RhdGU7Cgl1bnNpZ25lZCBsb25nIG92ZXJydW5zOwoJc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmRhdGEgPSB0b19sdGMyOTUyKHRpbWVyLCB0aW1lcl93ZGUpOwoKCWlmIChkYXRhLT5rZXJuZWxfcGFuaWMpCgkJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwoKCXN0YXRlID0gZ3Bpb2RfZ2V0X3ZhbHVlKGRhdGEtPmdwaW9fd2F0Y2hkb2cpOwoJZ3Bpb2Rfc2V0X3ZhbHVlKGRhdGEtPmdwaW9fd2F0Y2hkb2csICFzdGF0ZSk7CgoJbm93ID0gaHJ0aW1lcl9jYl9nZXRfdGltZSh0aW1lcik7CglvdmVycnVucyA9IGhydGltZXJfZm9yd2FyZCh0aW1lciwgbm93LCBkYXRhLT53ZGVfaW50ZXJ2YWwpOwoKCXJldHVybiBIUlRJTUVSX1JFU1RBUlQ7Cn0KCnN0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydApsdGMyOTUyX3Bvd2Vyb2ZmX3RpbWVyX3RyaWdnZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQp7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZiAqZGF0YSA9IHRvX2x0YzI5NTIodGltZXIsIHRpbWVyX3RyaWdnZXIpOwoJaW50IHJldCA9IGhydGltZXJfc3RhcnQoJmRhdGEtPnRpbWVyX3dkZSwKCQkJCWRhdGEtPndkZV9pbnRlcnZhbCwgSFJUSU1FUl9NT0RFX1JFTCk7CgoJaWYgKHJldCkgewoJCWRldl9lcnIoZGF0YS0+ZGV2LCAidW5hYmxlIHRvIHN0YXJ0IHRoZSB0aW1lclxuIik7CgkJLyoKCQkgKiBUaGUgZGV2aWNlIHdpbGwgbm90IHRvZ2dsZSB0aGUgd2F0Y2hkb2cgcmVzZXQsCgkJICogdGh1cyBzaHV0IGRvd24gaXMgb25seSBzYWZlIGlmIHRoZSBQb3dlclBhdGggY29udHJvbGxlcgoJCSAqIGhhcyBhIGxvbmcgZW5vdWdoIHRpbWUtb2ZmIGJlZm9yZSB0cmlnZ2VyaW5nIGEgaGFyZHdhcmUKCQkgKiBwb3dlci1vZmYuCgkJICoKCQkgKiBPbmx5IHNlbmRpbmcgYSB3YXJuaW5nIGFzIHRoZSBzeXN0ZW0gd2lsbCBwb3dlci1vZmYgYW55d2F5CgkJICovCgl9CgoJZGV2X2luZm8oZGF0YS0+ZGV2LCAiZXhlY3V0aW5nIHNodXRkb3duXG4iKTsKCglvcmRlcmx5X3Bvd2Vyb2ZmKHRydWUpOwoKCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKfQoKLyoqCiAqIGx0YzI5NTJfcG93ZXJvZmZfaGFuZGxlciAtIEludGVycnVwdCBoYW5kbGVyCiAqIFRyaWdnZXJlZCBlYWNoIHRpbWUgdGhlIHRyaWdnZXIgc2lnbmFsIGNoYW5nZXMgc3RhdGUgYW5kIChkZSlhY3RpdmF0ZXMgYQogKiB0aW1lLW91dCAodGltZXJfdHJpZ2dlcikuIE9uY2UgdGhlIHRpbWUtb3V0IGlzIGFjdHVhbGx5IHJlYWNoZWQgdGhlIHNodXQKICogZG93biBpcyBleGVjdXRlZC4KICoKICogQGlycTogSVJRIG51bWJlcgogKiBAZGV2X2lkOiBwb2ludGVyIHRvIHRoZSBtYWluIGRhdGEgc3RydWN0dXJlCiAqLwpzdGF0aWMgaXJxcmV0dXJuX3QgbHRjMjk1Ml9wb3dlcm9mZl9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRldl9pZCkKewoJc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmRhdGEgPSBkZXZfaWQ7CgoJaWYgKGRhdGEtPmtlcm5lbF9wYW5pYyB8fCBocnRpbWVyX2FjdGl2ZSgmZGF0YS0+dGltZXJfd2RlKSkgewoJCS8qIHNodXRkb3duIGlzIGFscmVhZHkgdHJpZ2dlcmVkLCBub3RoaW5nIHRvIGRvIGFueSBtb3JlICovCgkJcmV0dXJuIElSUV9IQU5ETEVEOwoJfQoKCWlmIChncGlvZF9nZXRfdmFsdWUoZGF0YS0+Z3Bpb190cmlnZ2VyKSkgewoJCWlmIChocnRpbWVyX3N0YXJ0KCZkYXRhLT50aW1lcl90cmlnZ2VyLCBkYXRhLT50cmlnZ2VyX2RlbGF5LAoJCQkJICBIUlRJTUVSX01PREVfUkVMKSkKCQkJZGV2X2VycihkYXRhLT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgdGhlIHdhaXQgdGltZXJcbiIpOwoJfSBlbHNlIHsKCQlocnRpbWVyX2NhbmNlbCgmZGF0YS0+dGltZXJfdHJpZ2dlcik7CgkJLyogb21pdHRpbmcgcmV0dXJuIHZhbHVlIGNoZWNrLCB0aW1lciBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkICovCgl9CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCnN0YXRpYyB2b2lkIGx0YzI5NTJfcG93ZXJvZmZfa2lsbCh2b2lkKQp7CglncGlvZF9zZXRfdmFsdWUobHRjMjk1Ml9kYXRhLT5ncGlvX2tpbGwsIDEpOwp9CgpzdGF0aWMgdm9pZCBsdGMyOTUyX3Bvd2Vyb2ZmX2RlZmF1bHQoc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmRhdGEpCnsKCWRhdGEtPndkZV9pbnRlcnZhbCA9IGt0aW1lX3NldCgwLCAzMDBMKjFFNkwpOwoJZGF0YS0+dHJpZ2dlcl9kZWxheSA9IGt0aW1lX3NldCgyLCA1MDBMKjFFNkwpOwoKCWhydGltZXJfaW5pdCgmZGF0YS0+dGltZXJfdHJpZ2dlciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKCWRhdGEtPnRpbWVyX3RyaWdnZXIuZnVuY3Rpb24gPSBsdGMyOTUyX3Bvd2Vyb2ZmX3RpbWVyX3RyaWdnZXI7CgoJaHJ0aW1lcl9pbml0KCZkYXRhLT50aW1lcl93ZGUsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CglkYXRhLT50aW1lcl93ZGUuZnVuY3Rpb24gPSBsdGMyOTUyX3Bvd2Vyb2ZmX3RpbWVyX3dkZTsKfQoKc3RhdGljIGludCBsdGMyOTUyX3Bvd2Vyb2ZmX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJaW50IHJldCwgdmlycTsKCXN0cnVjdCBsdGMyOTUyX3Bvd2Vyb2ZmICpkYXRhID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CgoJbHRjMjk1Ml9wb3dlcm9mZl9kZWZhdWx0KGRhdGEpOwoKCWRhdGEtPmdwaW9fd2F0Y2hkb2cgPSBkZXZtX2dwaW9kX2dldCgmcGRldi0+ZGV2LCAid2F0Y2hkb2ciLAoJCQkJCSAgICAgR1BJT0RfT1VUX0xPVyk7CglpZiAoSVNfRVJSKGRhdGEtPmdwaW9fd2F0Y2hkb2cpKSB7CgkJcmV0ID0gUFRSX0VSUihkYXRhLT5ncGlvX3dhdGNoZG9nKTsKCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gY2xhaW0gZ3BpbyBcIndhdGNoZG9nXCJcbiIpOwoJCXJldHVybiByZXQ7Cgl9CgoJZGF0YS0+Z3Bpb19raWxsID0gZGV2bV9ncGlvZF9nZXQoJnBkZXYtPmRldiwgImtpbGwiLCBHUElPRF9PVVRfTE9XKTsKCWlmIChJU19FUlIoZGF0YS0+Z3Bpb19raWxsKSkgewoJCXJldCA9IFBUUl9FUlIoZGF0YS0+Z3Bpb19raWxsKTsKCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gY2xhaW0gZ3BpbyBcImtpbGxcIlxuIik7CgkJcmV0dXJuIHJldDsKCX0KCglkYXRhLT5ncGlvX3RyaWdnZXIgPSBkZXZtX2dwaW9kX2dldCgmcGRldi0+ZGV2LCAidHJpZ2dlciIsCgkJCQkJICAgIEdQSU9EX0lOKTsKCWlmIChJU19FUlIobHRjMjk1Ml9kYXRhLT5ncGlvX3RyaWdnZXIpKSB7CgkJcmV0ID0gUFRSX0VSUihsdGMyOTUyX2RhdGEtPmdwaW9fdHJpZ2dlcik7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIGNsYWltIGdwaW8gXCJ0cmlnZ2VyXCJcbiIpOwoJCXJldHVybiByZXQ7Cgl9CgoJdmlycSA9IGdwaW9kX3RvX2lycShkYXRhLT5ncGlvX3RyaWdnZXIpOwoJaWYgKHZpcnEgPCAwKSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IG1hcCBHUElPIGFzIGludGVycnVwdCIpOwoJCXJldHVybiByZXQ7Cgl9CgoJcmV0ID0gZGV2bV9yZXF1ZXN0X2lycSgmcGRldi0+ZGV2LCB2aXJxLAoJCQkgICAgICAgbHRjMjk1Ml9wb3dlcm9mZl9oYW5kbGVyLAoJCQkgICAgICAgKElSUUZfVFJJR0dFUl9GQUxMSU5HIHwgSVJRRl9UUklHR0VSX1JJU0lORyksCgkJCSAgICAgICAibHRjMjk1Mi1wb3dlcm9mZiIsCgkJCSAgICAgICBkYXRhKTsKCglpZiAocmV0KSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAiY2Fubm90IGNvbmZpZ3VyZSBhbiBpbnRlcnJ1cHQgaGFuZGxlclxuIik7CgkJcmV0dXJuIHJldDsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBsdGMyOTUyX3Bvd2Vyb2ZmX25vdGlmeV9wYW5pYyhzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iLAoJCQkJCSB1bnNpZ25lZCBsb25nIGNvZGUsIHZvaWQgKnVudXNlZCkKewoJc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmRhdGEgPSB0b19sdGMyOTUyKG5iLCBwYW5pY19ub3RpZmllcik7CgoJZGF0YS0+a2VybmVsX3BhbmljID0gdHJ1ZTsKCXJldHVybiBOT1RJRllfRE9ORTsKfQoKc3RhdGljIGludCBsdGMyOTUyX3Bvd2Vyb2ZmX3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCWludCByZXQ7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZiAqZGF0YTsKCglpZiAocG1fcG93ZXJfb2ZmKSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAicG1fcG93ZXJfb2ZmIGFscmVhZHkgcmVnaXN0ZXJlZCIpOwoJCXJldHVybiAtRUJVU1k7Cgl9CgoJZGF0YSA9IGRldm1fa3phbGxvYygmcGRldi0+ZGV2LCBzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKCWlmICghZGF0YSkKCQlyZXR1cm4gLUVOT01FTTsKCglkYXRhLT5kZXYgPSAmcGRldi0+ZGV2OwoJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgZGF0YSk7CgoJcmV0ID0gbHRjMjk1Ml9wb3dlcm9mZl9pbml0KHBkZXYpOwoJaWYgKHJldCkKCQlyZXR1cm4gcmV0OwoKCS8qIFRPRE86IHJlbW92ZSBsdGMyOTUyX2RhdGEgKi8KCWx0YzI5NTJfZGF0YSA9IGRhdGE7CglwbV9wb3dlcl9vZmYgPSBsdGMyOTUyX3Bvd2Vyb2ZmX2tpbGw7CgoJZGF0YS0+cGFuaWNfbm90aWZpZXIubm90aWZpZXJfY2FsbCA9IGx0YzI5NTJfcG93ZXJvZmZfbm90aWZ5X3BhbmljOwoJYXRvbWljX25vdGlmaWVyX2NoYWluX3JlZ2lzdGVyKCZwYW5pY19ub3RpZmllcl9saXN0LAoJCQkJICAgICAgICZkYXRhLT5wYW5pY19ub3RpZmllcik7CglkZXZfaW5mbygmcGRldi0+ZGV2LCAicHJvYmUgc3VjY2Vzc2Z1bFxuIik7CgoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgbHRjMjk1Ml9wb3dlcm9mZl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJc3RydWN0IGx0YzI5NTJfcG93ZXJvZmYgKmRhdGEgPSBwbGF0Zm9ybV9nZXRfZHJ2ZGF0YShwZGV2KTsKCglwbV9wb3dlcl9vZmYgPSBOVUxMOwoJaHJ0aW1lcl9jYW5jZWwoJmRhdGEtPnRpbWVyX3RyaWdnZXIpOwoJaHJ0aW1lcl9jYW5jZWwoJmRhdGEtPnRpbWVyX3dkZSk7CglhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwKCQkJCQkgJmRhdGEtPnBhbmljX25vdGlmaWVyKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IG9mX2RldmljZV9pZCBvZl9sdGMyOTUyX3Bvd2Vyb2ZmX21hdGNoW10gPSB7Cgl7IC5jb21wYXRpYmxlID0gImxsdGMsbHRjMjk1MiJ9LAoJe30sCn07Ck1PRFVMRV9ERVZJQ0VfVEFCTEUob2YsIG9mX2x0YzI5NTJfcG93ZXJvZmZfbWF0Y2gpOwoKc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kcml2ZXIgbHRjMjk1Ml9wb3dlcm9mZl9kcml2ZXIgPSB7CgkucHJvYmUgPSBsdGMyOTUyX3Bvd2Vyb2ZmX3Byb2JlLAoJLnJlbW92ZSA9IGx0YzI5NTJfcG93ZXJvZmZfcmVtb3ZlLAoJLmRyaXZlciA9IHsKCQkubmFtZSA9ICJsdGMyOTUyLXBvd2Vyb2ZmIiwKCQkub2ZfbWF0Y2hfdGFibGUgPSBvZl9sdGMyOTUyX3Bvd2Vyb2ZmX21hdGNoLAoJfSwKfTsKCm1vZHVsZV9wbGF0Zm9ybV9kcml2ZXIobHRjMjk1Ml9wb3dlcm9mZl9kcml2ZXIpOwoKTU9EVUxFX0FVVEhPUigiUmVu6SBNb2xsIDxyZW5lLm1vbGxAeHNlbnMuY29tPiIpOwpNT0RVTEVfREVTQ1JJUFRJT04oIkxUQyBQb3dlclBhdGggcG93ZXItb2ZmIGRyaXZlciIpOwpNT0RVTEVfTElDRU5TRSgiR1BMIHYyIik7Cg==