Lyogdmk6IHNldCBzdz00IHRzPTQ6ICovCi8qIGZkZm9ybWF0LmMgIC0gIExvdy1sZXZlbCBmb3JtYXRzIGEgZmxvcHB5IGRpc2sgLSBXZXJuZXIgQWxtZXNiZXJnZXIgKi8KCi8qIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqIDE5OTktMDMtMjAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAqIC0gbW9yZSBpMThuL25scyB0cmFuc2xhdGFibGUgc3RyaW5ncyBtYXJrZWQKICoKICogNSBKdWx5IDIwMDMgLS0gbW9kaWZpZWQgZm9yIEJ1c3lib3ggYnkgRXJpayBBbmRlcnNlbgogKi8KCiNpbmNsdWRlICJidXN5Ym94LmgiCgoKLyogU3R1ZmYgZXh0cmFjdGVkIGZyb20gbGludXgvZmQuaCAqLwpzdHJ1Y3QgZmxvcHB5X3N0cnVjdCB7Cgl1bnNpZ25lZCBpbnQJc2l6ZSwJCS8qIG5yIG9mIHNlY3RvcnMgdG90YWwgKi8KCQkJc2VjdCwJCS8qIHNlY3RvcnMgcGVyIHRyYWNrICovCgkJCWhlYWQsCQkvKiBuciBvZiBoZWFkcyAqLwoJCQl0cmFjaywJCS8qIG5yIG9mIHRyYWNrcyAqLwoJCQlzdHJldGNoOwkvKiAhPTAgbWVhbnMgZG91YmxlIHRyYWNrIHN0ZXBzICovCiNkZWZpbmUgRkRfU1RSRVRDSCAxCiNkZWZpbmUgRkRfU1dBUFNJREVTIDIKCgl1bnNpZ25lZCBjaGFyCWdhcCwJCS8qIGdhcDEgc2l6ZSAqLwoKCQkJcmF0ZSwJCS8qIGRhdGEgcmF0ZS4gfD0gMHg0MCBmb3IgcGVycGVuZGljdWxhciAqLwojZGVmaW5lIEZEXzJNIDB4NAojZGVmaW5lIEZEX1NJWkVDT0RFTUFTSyAweDM4CiNkZWZpbmUgRkRfU0laRUNPREUoZmxvcHB5KSAoKCgoKGZsb3BweSktPnJhdGUmRkRfU0laRUNPREVNQVNLKT4+IDMpKyAyKSAlOCkKI2RlZmluZSBGRF9TRUNUU0laRShmbG9wcHkpICggKGZsb3BweSktPnJhdGUgJiBGRF8yTSA/IFwKCQkJICAgICA1MTIgOiAxMjggPDwgRkRfU0laRUNPREUoZmxvcHB5KSApCiNkZWZpbmUgRkRfUEVSUCAweDQwCgoJCQlzcGVjMSwJCS8qIHN0ZXBwaW5nIHJhdGUsIGhlYWQgdW5sb2FkIHRpbWUgKi8KCQkJZm10X2dhcDsJLyogZ2FwMiBzaXplICovCgljb25zdCBjaGFyCSogbmFtZTsgLyogdXNlZCBvbmx5IGZvciBwcmVkZWZpbmVkIGZvcm1hdHMgKi8KfTsKc3RydWN0IGZvcm1hdF9kZXNjciB7Cgl1bnNpZ25lZCBpbnQgZGV2aWNlLGhlYWQsdHJhY2s7Cn07CiNkZWZpbmUgRkRGTVRCRUcgX0lPKDIsMHg0NykKI2RlZmluZQlGREZNVFRSSyBfSU9XKDIsMHg0OCwgc3RydWN0IGZvcm1hdF9kZXNjcikKI2RlZmluZSBGREZNVEVORCBfSU8oMiwweDQ5KQojZGVmaW5lIEZER0VUUFJNIF9JT1IoMiwgMHgwNCwgc3RydWN0IGZsb3BweV9zdHJ1Y3QpCiNkZWZpbmUgRkRfRklMTF9CWVRFIDB4RjYgLyogZm9ybWF0IGZpbGwgYnl0ZS4gKi8KCnN0YXRpYyB2b2lkIHhpb2N0bChpbnQgZmQsIGludCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICpzdHJpbmcpCnsKCWlmIChpb2N0bCAoZmQsIHJlcXVlc3QsIGFyZ3ApIDwgMCkgewoJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShzdHJpbmcpOwoJfQp9CgppbnQgZmRmb3JtYXRfbWFpbihpbnQgYXJnYyxjaGFyICoqYXJndikKewoJaW50IGZkLCBuLCBjeWwsIHJlYWRfYnl0ZXMsIHZlcmlmeTsKCXVuc2lnbmVkIGNoYXIgKmRhdGE7CglzdHJ1Y3Qgc3RhdCBzdDsKCXN0cnVjdCBmbG9wcHlfc3RydWN0IHBhcmFtOwoJc3RydWN0IGZvcm1hdF9kZXNjciBkZXNjcjsKCglpZiAoYXJnYyA8IDIpIHsKCQliYl9zaG93X3VzYWdlKCk7Cgl9Cgl2ZXJpZnkgPSAhYmJfZ2V0b3B0X3VsZmxhZ3MoYXJnYywgYXJndiwgIm4iKTsKCWFyZ3YgKz0gb3B0aW5kOwoKCS8qIFJfT0sgaXMgbmVlZGVkIGZvciB2ZXJpZnlpbmcgKi8KCWlmIChzdGF0KCphcmd2LCZzdCkgPCAwIHx8IGFjY2VzcygqYXJndixXX09LIHwgUl9PSyApIDwgMCkgewoJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCphcmd2KTsKCX0KCWlmICghU19JU0JMSyhzdC5zdF9tb2RlKSkgewoJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogbm90IGEgYmxvY2sgZGV2aWNlIiwqYXJndik7CgkJLyogZG8gbm90IHRlc3QgbWFqb3IgLSBwZXJoYXBzIHRoaXMgd2FzIGFuIFVTQiBmbG9wcHkgKi8KCX0KCgoJLyogT19SRFdSIGZvciBmb3JtYXR0aW5nIGFuZCB2ZXJpZnlpbmcgKi8KCWZkID0geG9wZW4oKmFyZ3YsT19SRFdSICk7CgoJeGlvY3RsKGZkLCBGREdFVFBSTSwgJnBhcmFtLCAiRkRHRVRQUk0iKTsvKm9yaWdpbmFsIG1lc3NhZ2Ugd2FzOiAiQ291bGQgbm90IGRldGVybWluZSBjdXJyZW50IGZvcm1hdCB0eXBlIiAqLwoKCXByaW50ZigiJXMtc2lkZWQsICVkIHRyYWNrcywgJWQgc2VjL3RyYWNrLiBUb3RhbCBjYXBhY2l0eSAlZCBrQi5cbiIsCgkJKHBhcmFtLmhlYWQgPT0gMikgPyAiRG91YmxlIiA6ICJTaW5nbGUiLAoJCXBhcmFtLnRyYWNrLCBwYXJhbS5zZWN0LCBwYXJhbS5zaXplID4+IDEpOwoKCS8qIEZPUk1BVCAqLwoJcHJpbnRmKCJGb3JtYXR0aW5nIC4uLiAiKTsKCXhpb2N0bChmZCwgRkRGTVRCRUcsTlVMTCwiRkRGTVRCRUciKTsKCgkvKiBuID09IHRyYWNrICovCglmb3IgKG4gPSAwOyBuIDwgcGFyYW0udHJhY2s7IG4rKykKCXsKCSAgICBkZXNjci5oZWFkID0gMDsKCSAgICBkZXNjci50cmFjayA9IG47CgkgICAgeGlvY3RsKGZkLCBGREZNVFRSSywmZGVzY3IsIkZERk1UVFJLIik7CgkgICAgcHJpbnRmKCIlM2RcYlxiXGIiLCBuKTsKCSAgICBpZiAocGFyYW0uaGVhZCA9PSAyKSB7CgkJZGVzY3IuaGVhZCA9IDE7CgkJeGlvY3RsKGZkLCBGREZNVFRSSywmZGVzY3IsIkZERk1UVFJLIik7CgkgICAgfQoJfQoKCXhpb2N0bChmZCxGREZNVEVORCxOVUxMLCJGREZNVEVORCIpOwoJcHJpbnRmKCJkb25lXG4iKTsKCgkvKiBWRVJJRlkgKi8KCWlmKHZlcmlmeSkgewoJCS8qIG4gPT0gY3lsX3NpemUgKi8KCQluID0gcGFyYW0uc2VjdCpwYXJhbS5oZWFkKjUxMjsKCgkJZGF0YSA9IHhtYWxsb2Mobik7CgkJcHJpbnRmKCJWZXJpZnlpbmcgLi4uICIpOwoJCWZvciAoY3lsID0gMDsgY3lsIDwgcGFyYW0udHJhY2s7IGN5bCsrKSB7CgkJCXByaW50ZigiJTNkXGJcYlxiIiwgY3lsKTsKCQkJaWYoKHJlYWRfYnl0ZXMgPSBzYWZlX3JlYWQoZmQsZGF0YSxuKSkhPSBuICkgewoJCQkJaWYocmVhZF9ieXRlcyA8IDApIHsKCQkJCQliYl9wZXJyb3JfbXNnKGJiX21zZ19yZWFkX2Vycm9yKTsKCQkJCX0KCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJQcm9ibGVtIHJlYWRpbmcgY3lsaW5kZXIgJWQsIGV4cGVjdGVkICVkLCByZWFkICVkIiwgY3lsLCBuLCByZWFkX2J5dGVzKTsKCQkJfQoJCQkvKiBDaGVjayBiYWNrd2FyZHMgc28gd2UgZG9uJ3QgbmVlZCBhIGNvdW50ZXIgKi8KCQkJd2hpbGUoLS1yZWFkX2J5dGVzPj0wKSB7CgkJCQlpZiggZGF0YVtyZWFkX2J5dGVzXSAhPSBGRF9GSUxMX0JZVEUpIHsKCQkJCQkgcHJpbnRmKCJiYWQgZGF0YSBpbiBjeWwgJWRcbkNvbnRpbnVpbmcgLi4uICIsY3lsKTsKCQkJCX0KCQkJfQoJCX0KCQkvKiBUaGVyZSBpcyBubyBwb2ludCBpbiBmcmVlaW5nIGJsb2NrcyBhdCB0aGUgZW5kIG9mIGEgcHJvZ3JhbSwgYmVjYXVzZQoJCWFsbCBvZiB0aGUgcHJvZ3JhbSdzIHNwYWNlIGlzIGdpdmVuIGJhY2sgdG8gdGhlIHN5c3RlbSB3aGVuIHRoZSBwcm9jZXNzCgkJdGVybWluYXRlcy4qLwoKCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUoZGF0YSk7CgoJCXByaW50ZigiZG9uZVxuIik7Cgl9CgoJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBjbG9zZShmZCk7CgoJLyogRG9uJ3QgYm90aGVyIGNsb3NpbmcuICBFeGl0IGRvZXMKCSAqIHRoYXQsIHNvIHdlIGNhbiBzYXZlIGEgZmV3IGJ5dGVzICovCglyZXR1cm4gRVhJVF9TVUNDRVNTOwp9Cg==