LyoKICogTFRDMjk1MiAoUG93ZXJQYXRoKSBkcml2ZXIKICoKICogQ29weXJpZ2h0IChDKSAyMDE0LCBYc2VucyBUZWNobm9sb2dpZXMgQlYgPGluZm9AeHNlbnMuY29tPgogKiBNYWludGFpbmVyOiBSZW7pIE1vbGwgPGxpbnV4QHItbW9sbC5ubD4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgogKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAtIERlc2NyaXB0aW9uCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogVGhpcyBkcml2ZXIgaXMgdG8gYmUgdXNlZCB3aXRoIGFuIGV4dGVybmFsIFBvd2VyUGF0aCBDb250cm9sbGVyIChMVEMyOTUyKS4KICogSXRzIGZ1bmN0aW9uIGlzIHRvIGRldGVybWluZSB3aGVuIGEgZXh0ZXJuYWwgc2h1dCBkb3duIGlzIHRyaWdnZXJlZAogKiBhbmQgcmVhY3QgYnkgcHJvcGVybHkgc2h1dHRpbmcgZG93biB0aGUgc3lzdGVtLgogKgogKiBUaGlzIGRyaXZlciBleHBlY3RzIGEgZGV2aWNlIHRyZWUgd2l0aCBhIGx0YzI5NTIgZW50cnkgZm9yIHBpbiBtYXBwaW5nLgogKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIC0gR1BJTwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFRoZSBmb2xsb3dpbmcgR1BJT3MgYXJlIHVzZWQ6CiAqIC0gdHJpZ2dlciAoaW5wdXQpCiAqICAgICBBIGxldmVsIGNoYW5nZSBpbmRpY2F0ZXMgdGhlIHNodXQtZG93biB0cmlnZ2VyLiBJZiBpdCdzIHN0YXRlIHJldmVydHMKICogICAgIHdpdGhpbiB0aGUgdGltZS1vdXQgZGVmaW5lZCBieSB0cmlnZ2VyX2RlbGF5LCB0aGUgc2h1dCBkb3duIGlzIG5vdAogKiAgICAgZXhlY3V0ZWQuCiAqCiAqIC0gd2F0Y2hkb2cgKG91dHB1dCkKICogICAgIE9uY2UgYSBzaHV0IGRvd24gaXMgdHJpZ2dlcmVkLCB0aGUgZHJpdmVyIHdpbGwgdG9nZ2xlIHRoaXMgc2lnbmFsLAogKiAgICAgd2l0aCBhbiBpbnRlcm5hbCAod2RlX2ludGVydmFsKSB0byBzdGFsbCB0aGUgaGFyZHdhcmUgc2h1dCBkb3duLgogKgogKiAtIGtpbGwgKG91dHB1dCkKICogICAgIFRoZSBsYXN0IGFjdGlvbiBkdXJpbmcgc2h1dCBkb3duIGlzIHRyaWdnZXJpbmcgdGhpcyBzaWduYWxsaW5nLCBzdWNoCiAqICAgICB0aGF0IHRoZSBQb3dlclBhdGggQ29udHJvbCB3aWxsIHBvd2VyIGRvd24gdGhlIGhhcmR3YXJlLgogKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIC0gSW50ZXJydXB0cwogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqCiAqIFRoZSBkcml2ZXIgcmVxdWlyZXMgYSBub24tc2hhcmVkLCBlZGdlLXRyaWdnZXJlZCBpbnRlcnJ1cHQgb24gdGhlIHRyaWdnZXIKICogR1BJTy4KICoKICovCgojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgojaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgojaW5jbHVkZSA8bGludXgvc2xhYi5oPgojaW5jbHVkZSA8bGludXgva21vZC5oPgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9ncGlvL2NvbnN1bWVyLmg+CiNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KCnN0cnVjdCBsdGMyOTUyX3Bvd2Vyb2ZmX2RhdGEgewoJc3RydWN0IGhydGltZXIgdGltZXJfdHJpZ2dlcjsKCXN0cnVjdCBocnRpbWVyIHRpbWVyX3dkZTsKCglrdGltZV90IHRyaWdnZXJfZGVsYXk7CglrdGltZV90IHdkZV9pbnRlcnZhbDsKCglzdHJ1Y3QgZGV2aWNlICpkZXY7CgoJdW5zaWduZWQgaW50IHZpcnE7CgoJLyoqCgkgKiAwOiB0cmlnZ2VyCgkgKiAxOiB3YXRjaGRvZwoJICogMjoga2lsbAoJICovCglzdHJ1Y3QgZ3Bpb19kZXNjICpncGlvWzNdOwp9OwoKc3RhdGljIGludCBsdGMyOTUyX3Bvd2Vyb2ZmX3BhbmljOwpzdGF0aWMgc3RydWN0IGx0YzI5NTJfcG93ZXJvZmZfZGF0YSAqbHRjMjk1Ml9kYXRhOwoKI2RlZmluZSBQT1dFUlBBVEhfSU9fVFJJR0dFUgkwCiNkZWZpbmUgUE9XRVJQQVRIX0lPX1dBVENIRE9HCTEKI2RlZmluZSBQT1dFUlBBVEhfSU9fS0lMTAkyCgovKioKICogbHRjMjk1Ml9wb3dlcm9mZl90aW1lcl93ZGUgLSBUaW1lciBjYWxsYmFjawogKiBUb2dnbGVzIHRoZSB3YXRjaGRvZyByZXNldCBzaWduYWwgZWFjaCB3ZGVfaW50ZXJ2YWwKICoKICogQHRpbWVyOiBjb3JyZXNwb25kaW5nIHRpbWVyCiAqCiAqIFJldHVybnMgSFJUSU1FUl9SRVNUQVJUIGZvciBhbiBpbmZpbml0ZSBsb29wIHdoaWNoIHdpbGwgb25seSBzdG9wIHdoZW4gdGhlCiAqIG1hY2hpbmUgYWN0dWFsbHkgc2h1dHMgZG93bgogKi8Kc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGx0YzI5NTJfcG93ZXJvZmZfdGltZXJfd2RlKHN0cnVjdCBocnRpbWVyICp0aW1lcikKewoJa3RpbWVfdCBub3c7CglpbnQgc3RhdGU7Cgl1bnNpZ25lZCBsb25nIG92ZXJydW5zOwoKCWlmIChsdGMyOTUyX3Bvd2Vyb2ZmX3BhbmljKQoJCXJldHVybiBIUlRJTUVSX05PUkVTVEFSVDsKCglzdGF0ZSA9IGdwaW9kX2dldF92YWx1ZShsdGMyOTUyX2RhdGEtPmdwaW9bUE9XRVJQQVRIX0lPX1dBVENIRE9HXSk7CglncGlvZF9zZXRfdmFsdWUobHRjMjk1Ml9kYXRhLT5ncGlvW1BPV0VSUEFUSF9JT19XQVRDSERPR10sICFzdGF0ZSk7CgoJbm93ID0gaHJ0aW1lcl9jYl9nZXRfdGltZSh0aW1lcik7CglvdmVycnVucyA9IGhydGltZXJfZm9yd2FyZCh0aW1lciwgbm93LCBsdGMyOTUyX2RhdGEtPndkZV9pbnRlcnZhbCk7CgoJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKfQoKc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IGx0YzI5NTJfcG93ZXJvZmZfdGltZXJfdHJpZ2dlcigKCXN0cnVjdCBocnRpbWVyICp0aW1lcikKewoJaW50IHJldDsKCglyZXQgPSBocnRpbWVyX3N0YXJ0KCZsdGMyOTUyX2RhdGEtPnRpbWVyX3dkZSwKCQlsdGMyOTUyX2RhdGEtPndkZV9pbnRlcnZhbCwgSFJUSU1FUl9NT0RFX1JFTCk7CgoJaWYgKHJldCkgewoJCWRldl9lcnIobHRjMjk1Ml9kYXRhLT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgdGhlIHRpbWVyXG4iKTsKCQkvKgoJCSAqIFRoZSBkZXZpY2Ugd2lsbCBub3QgdG9nZ2xlIHRoZSB3YXRjaGRvZyByZXNldCwKCQkgKiB0aHVzIHNodXQgZG93biBpcyBvbmx5IHNhZmUgaWYgdGhlIFBvd2VyUGF0aCBjb250cm9sbGVyCgkJICogaGFzIGEgbG9uZyBlbm91Z2ggdGltZS1vZmYgYmVmb3JlIHRyaWdnZXJpbmcgYSBoYXJkd2FyZQoJCSAqIHBvd2VyLW9mZi4KCQkgKgoJCSAqIE9ubHkgc2VuZGluZyBhIHdhcm5pbmcgYXMgdGhlIHN5c3RlbSB3aWxsIHBvd2VyLW9mZiBhbnl3YXkKCQkgKi8KCX0KCglkZXZfaW5mbyhsdGMyOTUyX2RhdGEtPmRldiwgImV4ZWN1dGluZyBzaHV0ZG93blxuIik7CgoJb3JkZXJseV9wb3dlcm9mZih0cnVlKTsKCglyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7Cn0KCi8qKgogKiBsdGMyOTUyX3Bvd2Vyb2ZmX2hhbmRsZXIgLSBJbnRlcnJ1cHQgaGFuZGxlcgogKiBUcmlnZ2VyZWQgZWFjaCB0aW1lIHRoZSB0cmlnZ2VyIHNpZ25hbCBjaGFuZ2VzIHN0YXRlIGFuZCAoZGUpYWN0aXZhdGVzIGEKICogdGltZS1vdXQgKHRpbWVyX3RyaWdnZXIpLiBPbmNlIHRoZSB0aW1lLW91dCBpcyBhY3R1YWxseSByZWFjaGVkIHRoZSBzaHV0CiAqIGRvd24gaXMgZXhlY3V0ZWQuCiAqCiAqIEBpcnE6IElSUSBudW1iZXIKICogQGRldl9pZDogcG9pbnRlciB0byB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZQogKi8Kc3RhdGljIGlycXJldHVybl90IGx0YzI5NTJfcG93ZXJvZmZfaGFuZGxlcihpbnQgaXJxLCB2b2lkICpkZXZfaWQpCnsKCWludCByZXQ7CglzdHJ1Y3QgbHRjMjk1Ml9wb3dlcm9mZl9kYXRhICpkYXRhID0gZGV2X2lkOwoKCWlmIChsdGMyOTUyX3Bvd2Vyb2ZmX3BhbmljKQoJCWdvdG8gaXJxX29rOwoKCWlmIChocnRpbWVyX2FjdGl2ZSgmZGF0YS0+dGltZXJfd2RlKSkgewoJCS8qIHNodXRkb3duIGlzIGFscmVhZHkgdHJpZ2dlcmVkLCBub3RoaW5nIHRvIGRvIGFueSBtb3JlICovCgkJZ290byBpcnFfb2s7Cgl9CgoJaWYgKCFocnRpbWVyX2FjdGl2ZSgmZGF0YS0+dGltZXJfdHJpZ2dlcikpIHsKCQlyZXQgPSBocnRpbWVyX3N0YXJ0KCZkYXRhLT50aW1lcl90cmlnZ2VyLCBkYXRhLT50cmlnZ2VyX2RlbGF5LAoJCQlIUlRJTUVSX01PREVfUkVMKTsKCgkJaWYgKHJldCkKCQkJZGV2X2VycihkYXRhLT5kZXYsICJ1bmFibGUgdG8gc3RhcnQgdGhlIHdhaXQgdGltZXJcbiIpOwoJfSBlbHNlIHsKCQlyZXQgPSBocnRpbWVyX2NhbmNlbCgmZGF0YS0+dGltZXJfdHJpZ2dlcik7CgkJLyogb21pdHRpbmcgcmV0dXJuIHZhbHVlIGNoZWNrLCB0aW1lciBzaG91bGQgaGF2ZSBiZWVuIHZhbGlkICovCgl9CgppcnFfb2s6CglyZXR1cm4gSVJRX0hBTkRMRUQ7Cn0KCnN0YXRpYyB2b2lkIGx0YzI5NTJfcG93ZXJvZmZfa2lsbCh2b2lkKQp7CglncGlvZF9zZXRfdmFsdWUobHRjMjk1Ml9kYXRhLT5ncGlvW1BPV0VSUEFUSF9JT19LSUxMXSwgMSk7Cn0KCnN0YXRpYyBpbnQgbHRjMjk1Ml9wb3dlcm9mZl9zdXNwZW5kKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYsCglwbV9tZXNzYWdlX3Qgc3RhdGUpCnsKCXJldHVybiAtRU5PU1lTOwp9CgpzdGF0aWMgaW50IGx0YzI5NTJfcG93ZXJvZmZfcmVzdW1lKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCXJldHVybiAtRU5PU1lTOwp9CgpzdGF0aWMgdm9pZCBsdGMyOTUyX3Bvd2Vyb2ZmX2RlZmF1bHQoc3RydWN0IGx0YzI5NTJfcG93ZXJvZmZfZGF0YSAqZGF0YSkKewoJdW5zaWduZWQgaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGF0YS0+Z3Bpbyk7IGkrKykKCQlkYXRhLT5ncGlvW2ldID0gTlVMTDsKCglkYXRhLT53ZGVfaW50ZXJ2YWwgPSBrdGltZV9zZXQoMCwgMzAwTCoxRTZMKTsKCWRhdGEtPnRyaWdnZXJfZGVsYXkgPSBrdGltZV9zZXQoMiwgNTAwTCoxRTZMKTsKCglocnRpbWVyX2luaXQoJmRhdGEtPnRpbWVyX3RyaWdnZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CglkYXRhLT50aW1lcl90cmlnZ2VyLmZ1bmN0aW9uID0gJmx0YzI5NTJfcG93ZXJvZmZfdGltZXJfdHJpZ2dlcjsKCglocnRpbWVyX2luaXQoJmRhdGEtPnRpbWVyX3dkZSwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKCWRhdGEtPnRpbWVyX3dkZS5mdW5jdGlvbiA9ICZsdGMyOTUyX3Bvd2Vyb2ZmX3RpbWVyX3dkZTsKfQoKc3RhdGljIGludCBsdGMyOTUyX3Bvd2Vyb2ZmX2luaXQoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKewoJaW50IHJldCwgdmlycTsKCXVuc2lnbmVkIGludCBpOwoJc3RydWN0IGx0YzI5NTJfcG93ZXJvZmZfZGF0YSAqZGF0YTsKCglzdGF0aWMgY2hhciAqbmFtZVtdID0gewoJCSJ0cmlnZ2VyIiwKCQkid2F0Y2hkb2ciLAoJCSJraWxsIiwKCQlOVUxMCgl9OwoKCWRhdGEgPSBsdGMyOTUyX2RhdGE7CglsdGMyOTUyX3Bvd2Vyb2ZmX2RlZmF1bHQobHRjMjk1Ml9kYXRhKTsKCglmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsdGMyOTUyX2RhdGEtPmdwaW8pOyBpKyspIHsKCQlsdGMyOTUyX2RhdGEtPmdwaW9baV0gPSBncGlvZF9nZXQoJnBkZXYtPmRldiwgbmFtZVtpXSk7CgoJCWlmIChJU19FUlIobHRjMjk1Ml9kYXRhLT5ncGlvW2ldKSkgewoJCQlyZXQgPSBQVFJfRVJSKGx0YzI5NTJfZGF0YS0+Z3Bpb1tpXSk7CgkJCWRldl9lcnIoJnBkZXYtPmRldiwKCQkJCSJ1bmFibGUgdG8gY2xhaW0gdGhlIGZvbGxvd2luZyBncGlvOiAlc1xuIiwKCQkJCW5hbWVbaV0pOwoJCQlnb3RvIGVycl9pbzsKCQl9Cgl9CgoJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX291dHB1dCgKCQlsdGMyOTUyX2RhdGEtPmdwaW9bUE9XRVJQQVRIX0lPX1dBVENIRE9HXSwgMCk7CglpZiAocmV0KSB7CgkJZGV2X2VycigmcGRldi0+ZGV2LCAidW5hYmxlIHRvIHVzZSB3YXRjaGRvZy1ncGlvIGFzIG91dHB1dFxuIik7CgkJZ290byBlcnJfaW87Cgl9CgoJcmV0ID0gZ3Bpb2RfZGlyZWN0aW9uX291dHB1dChsdGMyOTUyX2RhdGEtPmdwaW9bUE9XRVJQQVRIX0lPX0tJTExdLCAwKTsKCWlmIChyZXQpIHsKCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJ1bmFibGUgdG8gdXNlIGtpbGwtZ3BpbyBhcyBvdXRwdXRcbiIpOwoJCWdvdG8gZXJyX2lvOwoJfQoKCXZpcnEgPSBncGlvZF90b19pcnEobHRjMjk1Ml9kYXRhLT5ncGlvW1BPV0VSUEFUSF9JT19UUklHR0VSXSk7CglpZiAodmlycSA8IDApIHsKCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJjYW5ub3QgbWFwIEdQSU8gYXMgaW50ZXJydXB0Iik7CgkJZ290byBlcnJfaW87Cgl9CgoJbHRjMjk1Ml9kYXRhLT52aXJxID0gdmlycTsKCXJldCA9IHJlcXVlc3RfaXJxKHZpcnEsCgkJbHRjMjk1Ml9wb3dlcm9mZl9oYW5kbGVyLAoJCShJUlFGX1RSSUdHRVJfRkFMTElORyB8IElSUUZfVFJJR0dFUl9SSVNJTkcpLAoJCSJsdGMyOTUyLXBvd2Vyb2ZmIiwKCQlsdGMyOTUyX2RhdGEKCSk7CgoJaWYgKHJldCkgewoJCWRldl9lcnIoJnBkZXYtPmRldiwgImNhbm5vdCBjb25maWd1cmUgYW4gaW50ZXJydXB0IGhhbmRsZXJcbiIpOwoJCWdvdG8gZXJyX2lvOwoJfQoKCXJldHVybiAwOwoKZXJyX2lvOgoJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobHRjMjk1Ml9kYXRhLT5ncGlvKTsgaSsrKQoJCWlmIChsdGMyOTUyX2RhdGEtPmdwaW9baV0pCgkJCWdwaW9kX3B1dChsdGMyOTUyX2RhdGEtPmdwaW9baV0pOwoKCXJldHVybiByZXQ7Cn0KCnN0YXRpYyBpbnQgbHRjMjk1Ml9wb3dlcm9mZl9wcm9iZShzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpwZGV2KQp7CglpbnQgcmV0OwoKCWlmIChwbV9wb3dlcl9vZmYpIHsKCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJwbV9wb3dlcl9vZmYgYWxyZWFkeSByZWdpc3RlcmVkIik7CgkJcmV0dXJuIC1FQlVTWTsKCX0KCglsdGMyOTUyX2RhdGEgPSBremFsbG9jKHNpemVvZigqbHRjMjk1Ml9kYXRhKSwgR0ZQX0tFUk5FTCk7CglpZiAoIWx0YzI5NTJfZGF0YSkKCQlyZXR1cm4gLUVOT01FTTsKCglsdGMyOTUyX2RhdGEtPmRldiA9ICZwZGV2LT5kZXY7CgoJcmV0ID0gbHRjMjk1Ml9wb3dlcm9mZl9pbml0KHBkZXYpOwoJaWYgKHJldCkKCQlnb3RvIGVycjsKCglwbV9wb3dlcl9vZmYgPSAmbHRjMjk1Ml9wb3dlcm9mZl9raWxsOwoKCWRldl9pbmZvKCZwZGV2LT5kZXYsICJwcm9iZSBzdWNjZXNzZnVsXG4iKTsKCglyZXR1cm4gMDsKCmVycjoKCWtmcmVlKGx0YzI5NTJfZGF0YSk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGx0YzI5NTJfcG93ZXJvZmZfcmVtb3ZlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCnsKCXVuc2lnbmVkIGludCBpOwoKCXBtX3Bvd2VyX29mZiA9IE5VTEw7CgoJaWYgKGx0YzI5NTJfZGF0YSkgewoJCWZyZWVfaXJxKGx0YzI5NTJfZGF0YS0+dmlycSwgbHRjMjk1Ml9kYXRhKTsKCgkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobHRjMjk1Ml9kYXRhLT5ncGlvKTsgaSsrKQoJCQlncGlvZF9wdXQobHRjMjk1Ml9kYXRhLT5ncGlvW2ldKTsKCgkJa2ZyZWUobHRjMjk1Ml9kYXRhKTsKCX0KCglyZXR1cm4gMDsKfQoKc3RhdGljIGNvbnN0IHN0cnVjdCBvZl9kZXZpY2VfaWQgb2ZfbHRjMjk1Ml9wb3dlcm9mZl9tYXRjaFtdID0gewoJeyAuY29tcGF0aWJsZSA9ICJsbHRjLGx0YzI5NTIifSwKCXt9LAp9OwpNT0RVTEVfREVWSUNFX1RBQkxFKG9mLCBvZl9sdGMyOTUyX3Bvd2Vyb2ZmX21hdGNoKTsKCnN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGx0YzI5NTJfcG93ZXJvZmZfZHJpdmVyID0gewoJLnByb2JlID0gbHRjMjk1Ml9wb3dlcm9mZl9wcm9iZSwKCS5yZW1vdmUgPSBsdGMyOTUyX3Bvd2Vyb2ZmX3JlbW92ZSwKCS5kcml2ZXIgPSB7CgkJLm5hbWUgPSAibHRjMjk1Mi1wb3dlcm9mZiIsCgkJLm9mX21hdGNoX3RhYmxlID0gb2ZfbHRjMjk1Ml9wb3dlcm9mZl9tYXRjaCwKCX0sCgkuc3VzcGVuZCA9IGx0YzI5NTJfcG93ZXJvZmZfc3VzcGVuZCwKCS5yZXN1bWUgPSBsdGMyOTUyX3Bvd2Vyb2ZmX3Jlc3VtZSwKfTsKCnN0YXRpYyBpbnQgbHRjMjk1Ml9wb3dlcm9mZl9ub3RpZnlfcGFuaWMoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwKCXVuc2lnbmVkIGxvbmcgY29kZSwgdm9pZCAqdW51c2VkKQp7CglsdGMyOTUyX3Bvd2Vyb2ZmX3BhbmljID0gMTsKCXJldHVybiBOT1RJRllfRE9ORTsKfQoKc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBsdGMyOTUyX3Bvd2Vyb2ZmX3BhbmljX25iID0gewoJLm5vdGlmaWVyX2NhbGwgPSBsdGMyOTUyX3Bvd2Vyb2ZmX25vdGlmeV9wYW5pYywKfTsKCnN0YXRpYyBpbnQgX19pbml0IGx0YzI5NTJfcG93ZXJvZmZfcGxhdGZvcm1faW5pdCh2b2lkKQp7CglsdGMyOTUyX3Bvd2Vyb2ZmX3BhbmljID0gMDsKCglhdG9taWNfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJnBhbmljX25vdGlmaWVyX2xpc3QsCgkJJmx0YzI5NTJfcG93ZXJvZmZfcGFuaWNfbmIpOwoKCXJldHVybiBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJmx0YzI5NTJfcG93ZXJvZmZfZHJpdmVyKTsKfQoKc3RhdGljIHZvaWQgX19leGl0IGx0YzI5NTJfcG93ZXJvZmZfcGxhdGZvcm1fZXhpdCh2b2lkKQp7CglhdG9taWNfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmcGFuaWNfbm90aWZpZXJfbGlzdCwKCQkmbHRjMjk1Ml9wb3dlcm9mZl9wYW5pY19uYik7CgoJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmx0YzI5NTJfcG93ZXJvZmZfZHJpdmVyKTsKfQoKbW9kdWxlX2luaXQobHRjMjk1Ml9wb3dlcm9mZl9wbGF0Zm9ybV9pbml0KTsKbW9kdWxlX2V4aXQobHRjMjk1Ml9wb3dlcm9mZl9wbGF0Zm9ybV9leGl0KTsKCk1PRFVMRV9BVVRIT1IoIlJlbukgTW9sbCA8cmVuZS5tb2xsQHhzZW5zLmNvbT4iKTsKTU9EVUxFX0RFU0NSSVBUSU9OKCJMVEMgUG93ZXJQYXRoIHBvd2VyLW9mZiBkcml2ZXIiKTsKTU9EVUxFX0xJQ0VOU0UoIkdQTCB2MiIpOwo=