Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qIGZkZm9ybWF0LmMgIC0gIExvdy1sZXZlbCBmb3JtYXRzIGEgZmxvcHB5IGRpc2sgLSBXZXJuZXIgQWxtZXNiZXJnZXIgKi8KCi8qIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqIDE5OTktMDMtMjAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAqIC0gbW9yZSBpMThuL25scyB0cmFuc2xhdGFibGUgc3RyaW5ncyBtYXJrZWQKICoKICogNSBKdWx5IDIwMDMgLS0gbW9kaWZpZWQgZm9yIEJ1c3lib3ggYnkgRXJpayBBbmRlcnNlbgogKi8KCiNpbmNsdWRlICJidXN5Ym94LmgiCgoKLyogU3R1ZmYgZXh0cmFjdGVkIGZyb20gbGludXgvZmQuaCAqLwpzdHJ1Y3QgZmxvcHB5X3N0cnVjdCB7Cgl1bnNpZ25lZCBpbnQJc2l6ZSwJCS8qIG5yIG9mIHNlY3RvcnMgdG90YWwgKi8KCQkJc2VjdCwJCS8qIHNlY3RvcnMgcGVyIHRyYWNrICovCgkJCWhlYWQsCQkvKiBuciBvZiBoZWFkcyAqLwoJCQl0cmFjaywJCS8qIG5yIG9mIHRyYWNrcyAqLwoJCQlzdHJldGNoOwkvKiAhPTAgbWVhbnMgZG91YmxlIHRyYWNrIHN0ZXBzICovCiNkZWZpbmUgRkRfU1RSRVRDSCAxCiNkZWZpbmUgRkRfU1dBUFNJREVTIDIKCgl1bnNpZ25lZCBjaGFyCWdhcCwJCS8qIGdhcDEgc2l6ZSAqLwoKCQkJcmF0ZSwJCS8qIGRhdGEgcmF0ZS4gfD0gMHg0MCBmb3IgcGVycGVuZGljdWxhciAqLwojZGVmaW5lIEZEXzJNIDB4NAojZGVmaW5lIEZEX1NJWkVDT0RFTUFTSyAweDM4CiNkZWZpbmUgRkRfU0laRUNPREUoZmxvcHB5KSAoKCgoKGZsb3BweSktPnJhdGUmRkRfU0laRUNPREVNQVNLKT4+IDMpKyAyKSAlOCkKI2RlZmluZSBGRF9TRUNUU0laRShmbG9wcHkpICggKGZsb3BweSktPnJhdGUgJiBGRF8yTSA/IFwKCQkJICAgICA1MTIgOiAxMjggPDwgRkRfU0laRUNPREUoZmxvcHB5KSApCiNkZWZpbmUgRkRfUEVSUCAweDQwCgoJCQlzcGVjMSwJCS8qIHN0ZXBwaW5nIHJhdGUsIGhlYWQgdW5sb2FkIHRpbWUgKi8KCQkJZm10X2dhcDsJLyogZ2FwMiBzaXplICovCgljb25zdCBjaGFyCSogbmFtZTsgLyogdXNlZCBvbmx5IGZvciBwcmVkZWZpbmVkIGZvcm1hdHMgKi8KfTsKc3RydWN0IGZvcm1hdF9kZXNjciB7Cgl1bnNpZ25lZCBpbnQgZGV2aWNlLGhlYWQsdHJhY2s7Cn07CiNkZWZpbmUgRkRGTVRCRUcgX0lPKDIsMHg0NykKI2RlZmluZQlGREZNVFRSSyBfSU9XKDIsMHg0OCwgc3RydWN0IGZvcm1hdF9kZXNjcikKI2RlZmluZSBGREZNVEVORCBfSU8oMiwweDQ5KQojZGVmaW5lIEZER0VUUFJNIF9JT1IoMiwgMHgwNCwgc3RydWN0IGZsb3BweV9zdHJ1Y3QpCiNkZWZpbmUgRkRfRklMTF9CWVRFIDB4RjYgLyogZm9ybWF0IGZpbGwgYnl0ZS4gKi8KCnN0YXRpYyB2b2lkIHhpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICpzdHJpbmcpCnsKCWlmIChpb2N0bChmZCwgcmVxdWVzdCwgYXJncCkgPCAwKSB7CgkJYmJfcGVycm9yX21zZ19hbmRfZGllKHN0cmluZyk7Cgl9Cn0KCmludCBmZGZvcm1hdF9tYWluKGludCBhcmdjLGNoYXIgKiphcmd2KTsKaW50IGZkZm9ybWF0X21haW4oaW50IGFyZ2MsY2hhciAqKmFyZ3YpCnsKCWludCBmZCwgbiwgY3lsLCByZWFkX2J5dGVzLCB2ZXJpZnk7Cgl1bnNpZ25lZCBjaGFyICpkYXRhOwoJc3RydWN0IHN0YXQgc3Q7CglzdHJ1Y3QgZmxvcHB5X3N0cnVjdCBwYXJhbTsKCXN0cnVjdCBmb3JtYXRfZGVzY3IgZGVzY3I7CgoJaWYgKGFyZ2MgPCAyKSB7CgkJYmJfc2hvd191c2FnZSgpOwoJfQoJdmVyaWZ5ID0gIWdldG9wdDMyKGFyZ2MsIGFyZ3YsICJuIik7Cglhcmd2ICs9IG9wdGluZDsKCgl4c3RhdCgqYXJndiwgJnN0KTsKCWlmICghU19JU0JMSyhzdC5zdF9tb2RlKSkgewoJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogbm90IGEgYmxvY2sgZGV2aWNlIiwgKmFyZ3YpOwoJCS8qIGRvIG5vdCB0ZXN0IG1ham9yIC0gcGVyaGFwcyB0aGlzIHdhcyBhbiBVU0IgZmxvcHB5ICovCgl9CgoJLyogT19SRFdSIGZvciBmb3JtYXR0aW5nIGFuZCB2ZXJpZnlpbmcgKi8KCWZkID0geG9wZW4oKmFyZ3YsIE9fUkRXUik7CgoJLyogb3JpZ2luYWwgbWVzc2FnZSB3YXM6ICJDb3VsZCBub3QgZGV0ZXJtaW5lIGN1cnJlbnQgZm9ybWF0IHR5cGUiICovCgl4aW9jdGwoZmQsIEZER0VUUFJNLCAmcGFyYW0sICJGREdFVFBSTSIpOwoKCXByaW50ZigiJXMtc2lkZWQsICVkIHRyYWNrcywgJWQgc2VjL3RyYWNrLiBUb3RhbCBjYXBhY2l0eSAlZCBrQlxuIiwKCQkocGFyYW0uaGVhZCA9PSAyKSA/ICJEb3VibGUiIDogIlNpbmdsZSIsCgkJcGFyYW0udHJhY2ssIHBhcmFtLnNlY3QsIHBhcmFtLnNpemUgPj4gMSk7CgoJLyogRk9STUFUICovCglwcmludGYoIkZvcm1hdHRpbmcuLi4gIik7Cgl4aW9jdGwoZmQsIEZERk1UQkVHLCBOVUxMLCAiRkRGTVRCRUciKTsKCgkvKiBuID09IHRyYWNrICovCglmb3IgKG4gPSAwOyBuIDwgcGFyYW0udHJhY2s7IG4rKykgewoJCWRlc2NyLmhlYWQgPSAwOwoJCWRlc2NyLnRyYWNrID0gbjsKCQl4aW9jdGwoZmQsIEZERk1UVFJLLCAmZGVzY3IsICJGREZNVFRSSyIpOwoJCXByaW50ZigiJTNkXGJcYlxiIiwgbik7CgkJaWYgKHBhcmFtLmhlYWQgPT0gMikgewoJCQlkZXNjci5oZWFkID0gMTsKCQkJeGlvY3RsKGZkLCBGREZNVFRSSywgJmRlc2NyLCAiRkRGTVRUUksiKTsKCQl9Cgl9CgoJeGlvY3RsKGZkLCBGREZNVEVORCwgTlVMTCwgIkZERk1URU5EIik7CglwcmludGYoImRvbmVcbiIpOwoKCS8qIFZFUklGWSAqLwoJaWYgKHZlcmlmeSkgewoJCS8qIG4gPT0gY3lsX3NpemUgKi8KCQluID0gcGFyYW0uc2VjdCpwYXJhbS5oZWFkKjUxMjsKCgkJZGF0YSA9IHhtYWxsb2Mobik7CgkJcHJpbnRmKCJWZXJpZnlpbmcuLi4gIik7CgkJZm9yIChjeWwgPSAwOyBjeWwgPCBwYXJhbS50cmFjazsgY3lsKyspIHsKCQkJcHJpbnRmKCIlM2RcYlxiXGIiLCBjeWwpOwoJCQlyZWFkX2J5dGVzID0gc2FmZV9yZWFkKGZkLCBkYXRhLCBuKTsKCQkJaWYgKHJlYWRfYnl0ZXMgIT0gbikgewoJCQkJaWYgKHJlYWRfYnl0ZXMgPCAwKSB7CgkJCQkJYmJfcGVycm9yX21zZyhiYl9tc2dfcmVhZF9lcnJvcik7CgkJCQl9CgkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicHJvYmxlbSByZWFkaW5nIGN5bGluZGVyICVkLCAiCgkJCQkJImV4cGVjdGVkICVkLCByZWFkICVkIiwgY3lsLCBuLCByZWFkX2J5dGVzKTsKCQkJCS8vIEZJWE1FOiBtYXliZSBiZXR0ZXIgc2VlayAmIGNvbnRpbnVlPz8KCQkJfQoJCQkvKiBDaGVjayBiYWNrd2FyZHMgc28gd2UgZG9uJ3QgbmVlZCBhIGNvdW50ZXIgKi8KCQkJd2hpbGUgKC0tcmVhZF9ieXRlcyA+PSAwKSB7CgkJCQlpZiAoZGF0YVtyZWFkX2J5dGVzXSAhPSBGRF9GSUxMX0JZVEUpIHsKCQkJCQkgcHJpbnRmKCJiYWQgZGF0YSBpbiBjeWwgJWRcbkNvbnRpbnVpbmcuLi4gIixjeWwpOwoJCQkJfQoJCQl9CgkJfQoJCS8qIFRoZXJlIGlzIG5vIHBvaW50IGluIGZyZWVpbmcgYmxvY2tzIGF0IHRoZSBlbmQgb2YgYSBwcm9ncmFtLCBiZWNhdXNlCgkJYWxsIG9mIHRoZSBwcm9ncmFtJ3Mgc3BhY2UgaXMgZ2l2ZW4gYmFjayB0byB0aGUgc3lzdGVtIHdoZW4gdGhlIHByb2Nlc3MKCQl0ZXJtaW5hdGVzLiovCgoJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZShkYXRhKTsKCgkJcHJpbnRmKCJkb25lXG4iKTsKCX0KCglpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGNsb3NlKGZkKTsKCgkvKiBEb24ndCBib3RoZXIgY2xvc2luZy4gIEV4aXQgZG9lcwoJICogdGhhdCwgc28gd2UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgKi8KCXJldHVybiBFWElUX1NVQ0NFU1M7Cn0K