LyoKICogU2FtcGxlIG1hbmFnZW1lbnQgZnVuY3Rpb25zLgogKgogKiBDb3B5cmlnaHQgMjAwOS0yMDEwIEVYQ0VMSUFOQ0UsIEVtZXJpYyBCcnVuIDxlYnJ1bkBleGNlbGlhbmNlLmZyPgogKiBDb3B5cmlnaHQgKEMpIDIwMTIgV2lsbHkgVGFycmVhdSA8d0Axd3QuZXU+CiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCiAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqLwoKI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGFycGEvaW5ldC5oPgojaW5jbHVkZSA8c3RkaW8uaD4KCiNpbmNsdWRlIDx0eXBlcy9nbG9iYWwuaD4KCiNpbmNsdWRlIDxjb21tb24vY2h1bmsuaD4KI2luY2x1ZGUgPGNvbW1vbi9oYXNoLmg+CiNpbmNsdWRlIDxjb21tb24vc3RhbmRhcmQuaD4KI2luY2x1ZGUgPGNvbW1vbi91cmlfYXV0aC5oPgojaW5jbHVkZSA8Y29tbW9uL2Jhc2U2NC5oPgoKI2luY2x1ZGUgPHByb3RvL2FyZy5oPgojaW5jbHVkZSA8cHJvdG8vYXV0aC5oPgojaW5jbHVkZSA8cHJvdG8vbG9nLmg+CiNpbmNsdWRlIDxwcm90by9wcm90b19odHRwLmg+CiNpbmNsdWRlIDxwcm90by9wcm94eS5oPgojaW5jbHVkZSA8cHJvdG8vc2FtcGxlLmg+CiNpbmNsdWRlIDxwcm90by9zdGlja190YWJsZS5oPgoKLyogc2FtcGxlIHR5cGUgbmFtZXMgKi8KY29uc3QgY2hhciAqc21wX3RvX3R5cGVbU01QX1RZUEVTXSA9IHsKCVtTTVBfVF9BTlldICA9ICJhbnkiLAoJW1NNUF9UX0JPT0xdID0gImJvb2wiLAoJW1NNUF9UX1VJTlRdID0gInVpbnQiLAoJW1NNUF9UX1NJTlRdID0gInNpbnQiLAoJW1NNUF9UX0FERFJdID0gImFkZHIiLAoJW1NNUF9UX0lQVjRdID0gImlwdjQiLAoJW1NNUF9UX0lQVjZdID0gImlwdjYiLAoJW1NNUF9UX1NUUl0gID0gInN0ciIsCglbU01QX1RfQklOXSAgPSAiYmluIiwKCVtTTVBfVF9NRVRIXSA9ICJtZXRoIiwKfTsKCi8qIHN0YXRpYyBzYW1wbGUgdXNlZCBpbiBzYW1wbGVfcHJvY2VzcygpIHdoZW4gPHA+IGlzIE5VTEwgKi8Kc3RhdGljIHN0cnVjdCBzYW1wbGUgdGVtcF9zbXA7CgovKiBsaXN0IGhlYWQgb2YgYWxsIGtub3duIHNhbXBsZSBmZXRjaCBrZXl3b3JkcyAqLwpzdGF0aWMgc3RydWN0IHNhbXBsZV9mZXRjaF9rd19saXN0IHNhbXBsZV9mZXRjaGVzID0gewoJLmxpc3QgPSBMSVNUX0hFQURfSU5JVChzYW1wbGVfZmV0Y2hlcy5saXN0KQp9OwoKLyogbGlzdCBoZWFkIG9mIGFsbCBrbm93biBzYW1wbGUgZm9ybWF0IGNvbnZlcnNpb24ga2V5d29yZHMgKi8Kc3RhdGljIHN0cnVjdCBzYW1wbGVfY29udl9rd19saXN0IHNhbXBsZV9jb252cyA9IHsKCS5saXN0ID0gTElTVF9IRUFEX0lOSVQoc2FtcGxlX2NvbnZzLmxpc3QpCn07Cgpjb25zdCB1bnNpZ25lZCBpbnQgZmV0Y2hfY2FwW1NNUF9TUkNfRU5UUklFU10gPSB7CglbU01QX1NSQ19JTlRSTl0gPSAoU01QX1ZBTF9GRV9DT05fQUNDIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MSVNUTl0gPSAoU01QX1ZBTF9GRV9DT05fQUNDIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19GVEVORF0gPSAoU01QX1ZBTF9GRV9DT05fQUNDIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNENMSV0gPSAoU01QX1ZBTF9GRV9DT05fQUNDIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNUNMSV0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19UUkFDS10gPSAoU01QX1ZBTF9GRV9DT05fQUNDIHwgU01QX1ZBTF9GRV9TRVNfQUNDIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNlJFUV0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19IUlFIVl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19IUlFIUF0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9GRV9SRVFfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0ZFX0hSUV9IRFIgfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19IUlFCT10gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX0ZFX0hSUV9CRFkgfCBTTVBfVkFMX0ZFX1NFVF9CQ0sgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19CS0VORF0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfQkVfUkVRX0NOVCB8IFNNUF9WQUxfQkVfSFJRX0hEUiB8IFNNUF9WQUxfQkVfSFJRX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9CRV9TRVRfU1JWIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19TRVJWUl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9TUlZfQ09OIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNFNSVl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNVNSVl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19MNlJFU10gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19IUlNIVl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19IUlNIUF0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9CRV9SRVNfQ05UIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX0JFX0hSU19IRFIgfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19IUlNCT10gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX0JFX0hSU19CRFkgfCBTTVBfVkFMX0JFX1NUT19SVUwgfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfRkVfUkVTX0NOVCB8IFNNUF9WQUxfRkVfSFJTX0hEUiB8IFNNUF9WQUxfRkVfSFJTX0JEWSB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fKSwKCglbU01QX1NSQ19SUUZJTl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19SU0ZJTl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19UWEZJTl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKCglbU01QX1NSQ19TU0ZJTl0gPSAoU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwgU01QX1ZBTF9fX19fX19fX19fIHwKCSAgICAgICAgICAgICAgICAgICBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfCBTTVBfVkFMX19fX19fX19fX18gfAoJICAgICAgICAgICAgICAgICAgIFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8IFNNUF9WQUxfX19fX19fX19fXyB8CgkgICAgICAgICAgICAgICAgICAgU01QX1ZBTF9GRV9MT0dfRU5EKSwKfTsKCnN0YXRpYyBjb25zdCBjaGFyICpmZXRjaF9zcmNfbmFtZXNbU01QX1NSQ19FTlRSSUVTXSA9IHsKCVtTTVBfU1JDX0lOVFJOXSA9ICJpbnRlcm5hbCBzdGF0ZSIsCglbU01QX1NSQ19MSVNUTl0gPSAibGlzdGVuZXIiLAoJW1NNUF9TUkNfRlRFTkRdID0gImZyb250ZW5kIiwKCVtTTVBfU1JDX0w0Q0xJXSA9ICJjbGllbnQgYWRkcmVzcyIsCglbU01QX1NSQ19MNUNMSV0gPSAiY2xpZW50LXNpZGUgY29ubmVjdGlvbiIsCglbU01QX1NSQ19UUkFDS10gPSAidHJhY2sgY291bnRlcnMiLAoJW1NNUF9TUkNfTDZSRVFdID0gInJlcXVlc3QgYnVmZmVyIiwKCVtTTVBfU1JDX0hSUUhWXSA9ICJIVFRQIHJlcXVlc3QgaGVhZGVycyIsCglbU01QX1NSQ19IUlFIUF0gPSAiSFRUUCByZXF1ZXN0IiwKCVtTTVBfU1JDX0hSUUJPXSA9ICJIVFRQIHJlcXVlc3QgYm9keSIsCglbU01QX1NSQ19CS0VORF0gPSAiYmFja2VuZCIsCglbU01QX1NSQ19TRVJWUl0gPSAic2VydmVyIiwKCVtTTVBfU1JDX0w0U1JWXSA9ICJzZXJ2ZXIgYWRkcmVzcyIsCglbU01QX1NSQ19MNVNSVl0gPSAic2VydmVyLXNpZGUgY29ubmVjdGlvbiIsCglbU01QX1NSQ19MNlJFU10gPSAicmVzcG9uc2UgYnVmZmVyIiwKCVtTTVBfU1JDX0hSU0hWXSA9ICJIVFRQIHJlc3BvbnNlIGhlYWRlcnMiLAoJW1NNUF9TUkNfSFJTSFBdID0gIkhUVFAgcmVzcG9uc2UiLAoJW1NNUF9TUkNfSFJTQk9dID0gIkhUVFAgcmVzcG9uc2UgYm9keSIsCglbU01QX1NSQ19SUUZJTl0gPSAicmVxdWVzdCBidWZmZXIgc3RhdGlzdGljcyIsCglbU01QX1NSQ19SU0ZJTl0gPSAicmVzcG9uc2UgYnVmZmVyIHN0YXRpc3RpY3MiLAoJW1NNUF9TUkNfVFhGSU5dID0gInRyYW5zYWN0aW9uIHN0YXRpc3RpY3MiLAoJW1NNUF9TUkNfU1NGSU5dID0gInNlc3Npb24gc3RhdGlzdGljcyIsCn07CgpzdGF0aWMgY29uc3QgY2hhciAqZmV0Y2hfY2twX25hbWVzW1NNUF9DS1BfRU5UUklFU10gPSB7CglbU01QX0NLUF9GRV9DT05fQUNDXSA9ICJmcm9udGVuZCB0Y3AtcmVxdWVzdCBjb25uZWN0aW9uIHJ1bGUiLAoJW1NNUF9DS1BfRkVfU0VTX0FDQ10gPSAiZnJvbnRlbmQgdGNwLXJlcXVlc3Qgc2Vzc2lvbiBydWxlIiwKCVtTTVBfQ0tQX0ZFX1JFUV9DTlRdID0gImZyb250ZW5kIHRjcC1yZXF1ZXN0IGNvbnRlbnQgcnVsZSIsCglbU01QX0NLUF9GRV9IUlFfSERSXSA9ICJmcm9udGVuZCBodHRwLXJlcXVlc3QgaGVhZGVyIHJ1bGUiLAoJW1NNUF9DS1BfRkVfSFJRX0JEWV0gPSAiZnJvbnRlbmQgaHR0cC1yZXF1ZXN0IGJvZHkgcnVsZSIsCglbU01QX0NLUF9GRV9TRVRfQkNLXSA9ICJmcm9udGVuZCB1c2UtYmFja2VuZCBydWxlIiwKCVtTTVBfQ0tQX0JFX1JFUV9DTlRdID0gImJhY2tlbmQgdGNwLXJlcXVlc3QgY29udGVudCBydWxlIiwKCVtTTVBfQ0tQX0JFX0hSUV9IRFJdID0gImJhY2tlbmQgaHR0cC1yZXF1ZXN0IGhlYWRlciBydWxlIiwKCVtTTVBfQ0tQX0JFX0hSUV9CRFldID0gImJhY2tlbmQgaHR0cC1yZXF1ZXN0IGJvZHkgcnVsZSIsCglbU01QX0NLUF9CRV9TRVRfU1JWXSA9ICJiYWNrZW5kIHVzZS1zZXJ2ZXIsIGJhbGFuY2Ugb3Igc3RpY2stbWF0Y2ggcnVsZSIsCglbU01QX0NLUF9CRV9TUlZfQ09OXSA9ICJzZXJ2ZXIgc291cmNlIHNlbGVjdGlvbiIsCglbU01QX0NLUF9CRV9SRVNfQ05UXSA9ICJiYWNrZW5kIHRjcC1yZXNwb25zZSBjb250ZW50IHJ1bGUiLAoJW1NNUF9DS1BfQkVfSFJTX0hEUl0gPSAiYmFja2VuZCBodHRwLXJlc3BvbnNlIGhlYWRlciBydWxlIiwKCVtTTVBfQ0tQX0JFX0hSU19CRFldID0gImJhY2tlbmQgaHR0cC1yZXNwb25zZSBib2R5IHJ1bGUiLAoJW1NNUF9DS1BfQkVfU1RPX1JVTF0gPSAiYmFja2VuZCBzdGljay1zdG9yZSBydWxlIiwKCVtTTVBfQ0tQX0ZFX1JFU19DTlRdID0gImZyb250ZW5kIHRjcC1yZXNwb25zZSBjb250ZW50IHJ1bGUiLAoJW1NNUF9DS1BfRkVfSFJTX0hEUl0gPSAiZnJvbnRlbmQgaHR0cC1yZXNwb25zZSBoZWFkZXIgcnVsZSIsCglbU01QX0NLUF9GRV9IUlNfQkRZXSA9ICJmcm9udGVuZCBodHRwLXJlc3BvbnNlIGJvZHkgcnVsZSIsCglbU01QX0NLUF9GRV9MT0dfRU5EXSA9ICJsb2dzIiwKfTsKCi8qIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZGF0YSByZXR1cm5lZCBieSB0aGUgc2FtcGxlX2V4cHIuCiAqIEl0IGFzc3VtZXMgdGhhdCB0aGUgPGV4cHI+IGFuZCBhbGwgb2YgaXRzIGNvbnZlcnRlcnMgYXJlIHByb3Blcmx5CiAqIGluaXRpYWxpemVkLgogKi8KaW5saW5lCmludCBzbXBfZXhwcl9vdXRwdXRfdHlwZShzdHJ1Y3Qgc2FtcGxlX2V4cHIgKmV4cHIpCnsKCXN0cnVjdCBzYW1wbGVfY29udl9leHByICpzbXBfZXhwcjsKCglpZiAoIUxJU1RfSVNFTVBUWSgmZXhwci0+Y29udl9leHBycykpIHsKCQlzbXBfZXhwciA9IExJU1RfUFJFVigmZXhwci0+Y29udl9leHBycywgc3RydWN0IHNhbXBsZV9jb252X2V4cHIgKiwgbGlzdCk7CgkJcmV0dXJuIHNtcF9leHByLT5jb252LT5vdXRfdHlwZTsKCX0KCXJldHVybiBleHByLT5mZXRjaC0+b3V0X3R5cGU7Cn0KCgovKiBmaWxsIHRoZSB0cmFzaCB3aXRoIGEgY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2Ygc291cmNlIG5hbWVzIGZvciB0aGUgPHVzZT4gYml0CiAqIGZpZWxkIHdoaWNoIG11c3QgYmUgY29tcG9zZWQgb2YgYSBub24tbnVsbCBzZXQgb2YgU01QX1VTRV8qIGZsYWdzLiBUaGUgcmV0dXJuCiAqIHZhbHVlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgaW4gdGhlIHRyYXNoIGJ1ZmZlci4KICovCmNvbnN0IGNoYXIgKnNhbXBsZV9zcmNfbmFtZXModW5zaWduZWQgaW50IHVzZSkKewoJaW50IGJpdDsKCgl0cmFzaC5sZW4gPSAwOwoJdHJhc2guc3RyWzBdID0gJ1wwJzsKCWZvciAoYml0ID0gMDsgYml0IDwgU01QX1NSQ19FTlRSSUVTOyBiaXQrKykgewoJCWlmICghKHVzZSAmIH4oKDEgPDwgYml0KSAtIDEpKSkKCQkJYnJlYWs7IC8qIG5vIG1vcmUgYml0cyAqLwoKCQlpZiAoISh1c2UgJiAoMSA8PCBiaXQpKSkKCQkJY29udGludWU7IC8qIGJpdCBub3Qgc2V0ICovCgoJCXRyYXNoLmxlbiArPSBzbnByaW50Zih0cmFzaC5zdHIgKyB0cmFzaC5sZW4sIHRyYXNoLnNpemUgLSB0cmFzaC5sZW4sICIlcyVzIiwKCQkJCSAgICAgICh1c2UgJiAoKDEgPDwgYml0KSAtIDEpKSA/ICIsIiA6ICIiLAoJCSAgICAgICAgICAgICAgICAgICAgICBmZXRjaF9zcmNfbmFtZXNbYml0XSk7Cgl9CglyZXR1cm4gdHJhc2guc3RyOwp9CgovKiByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBjb3JyZWN0IHNhbXBsZSBjaGVja3BvaW50IG5hbWUsIG9yICJ1bmtub3duIiB3aGVuCiAqIHRoZSBmbGFncyBhcmUgaW52YWxpZC4gT25seSB0aGUgbG93ZXN0IGJpdCBpcyB1c2VkLCBoaWdoZXIgYml0cyBhcmUgaWdub3JlZAogKiBpZiBzZXQuCiAqLwpjb25zdCBjaGFyICpzYW1wbGVfY2twX25hbWVzKHVuc2lnbmVkIGludCB1c2UpCnsKCWludCBiaXQ7CgoJZm9yIChiaXQgPSAwOyBiaXQgPCBTTVBfQ0tQX0VOVFJJRVM7IGJpdCsrKQoJCWlmICh1c2UgJiAoMSA8PCBiaXQpKQoJCQlyZXR1cm4gZmV0Y2hfY2twX25hbWVzW2JpdF07CglyZXR1cm4gInVua25vd24gc2FtcGxlIGNoZWNrIHBsYWNlLCBwbGVhc2UgcmVwb3J0IHRoaXMgYnVnIjsKfQoKLyoKICogUmVnaXN0ZXJzIHRoZSBzYW1wbGUgZmV0Y2gga2V5d29yZCBsaXN0IDxrd2w+IGFzIGEgbGlzdCBvZiB2YWxpZCBrZXl3b3JkcwogKiBmb3IgbmV4dCBwYXJzaW5nIHNlc3Npb25zLiBUaGUgZmV0Y2gga2V5d29yZHMgY2FwYWJpbGl0aWVzIGFyZSBhbHNvIGNvbXB1dGVkCiAqIGZyb20gdGhlaXIgLT51c2UgZmllbGQuCiAqLwp2b2lkIHNhbXBsZV9yZWdpc3Rlcl9mZXRjaGVzKHN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCAqa3dsKQp7CglzdHJ1Y3Qgc2FtcGxlX2ZldGNoICpzZjsKCWludCBiaXQ7CgoJZm9yIChzZiA9IGt3bC0+a3c7IHNmLT5rdyAhPSBOVUxMOyBzZisrKSB7CgkJZm9yIChiaXQgPSAwOyBiaXQgPCBTTVBfU1JDX0VOVFJJRVM7IGJpdCsrKQoJCQlpZiAoc2YtPnVzZSAmICgxIDw8IGJpdCkpCgkJCQlzZi0+dmFsIHw9IGZldGNoX2NhcFtiaXRdOwoJfQoJTElTVF9BRERRKCZzYW1wbGVfZmV0Y2hlcy5saXN0LCAma3dsLT5saXN0KTsKfQoKLyoKICogUmVnaXN0ZXJzIHRoZSBzYW1wbGUgZm9ybWF0IGNvdmVyc3Rpb24ga2V5d29yZCBsaXN0IDxwY2tsPiBhcyBhIGxpc3Qgb2YgdmFsaWQga2V5d29yZHMgZm9yIG5leHQKICogcGFyc2luZyBzZXNzaW9ucy4KICovCnZvaWQgc2FtcGxlX3JlZ2lzdGVyX2NvbnZzKHN0cnVjdCBzYW1wbGVfY29udl9rd19saXN0ICpwY2tsKQp7CglMSVNUX0FERFEoJnNhbXBsZV9jb252cy5saXN0LCAmcGNrbC0+bGlzdCk7Cn0KCi8qCiAqIFJldHVybnMgdGhlIHBvaW50ZXIgb24gc2FtcGxlIGZldGNoIGtleXdvcmQgc3RydWN0dXJlIGlkZW50aWZpZWQgYnkKICogc3RyaW5nIG9mIDxsZW4+IGluIGJ1ZmZlciA8a3c+LgogKgogKi8Kc3RydWN0IHNhbXBsZV9mZXRjaCAqZmluZF9zYW1wbGVfZmV0Y2goY29uc3QgY2hhciAqa3csIGludCBsZW4pCnsKCWludCBpbmRleDsKCXN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCAqa3dsOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoa3dsLCAmc2FtcGxlX2ZldGNoZXMubGlzdCwgbGlzdCkgewoJCWZvciAoaW5kZXggPSAwOyBrd2wtPmt3W2luZGV4XS5rdyAhPSBOVUxMOyBpbmRleCsrKSB7CgkJCWlmIChzdHJuY21wKGt3bC0+a3dbaW5kZXhdLmt3LCBrdywgbGVuKSA9PSAwICYmCgkJCSAgICBrd2wtPmt3W2luZGV4XS5rd1tsZW5dID09ICdcMCcpCgkJCQlyZXR1cm4gJmt3bC0+a3dbaW5kZXhdOwoJCX0KCX0KCXJldHVybiBOVUxMOwp9CgovKiBUaGlzIGZ1Y250aW9uIGJyb3dzZSB0aGUgbGlzdCBvZiBhdmFpbGFibGUgc2FwbGUgZmV0Y2guIDxjdXJyZW50PiBpcwogKiB0aGUgbGFzdCB1c2VkIHNhbXBsZSBmZXRjaC4gSWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwsIGl0IG11c3Qgc2V0IHRvIE5VTEwuCiAqIDxpZHg+IGlzIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzYW1wbGXoZmV0Y2ggZW50cnkuIEl0IGlzIHVzZWQgYXMgcHJpdmF0ZQogKiB2YWx1ZS4gSXQgaXMgdXNlbGVzIHRvIGluaXRpYXRlIGl0LgogKgogKiBJdCByZXR1cm5zIGFsd2F5cyB0aGUgbmV3dCBmZXRjaF9zYW1wbGUgZW50cnksIGFuZCBOVUxMIHdoZW4gdGhlIGVuZCBvZgogKiB0aGUgbGlzdCBpcyByZWFjaGVkLgogKi8Kc3RydWN0IHNhbXBsZV9mZXRjaCAqc2FtcGxlX2ZldGNoX2dldG5leHQoc3RydWN0IHNhbXBsZV9mZXRjaCAqY3VycmVudCwgaW50ICppZHgpCnsKCXN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCAqa3dsOwoJc3RydWN0IHNhbXBsZV9mZXRjaCAqYmFzZTsKCglpZiAoIWN1cnJlbnQpIHsKCQkvKiBHZXQgZmlyc3Qga3dsIGVudHJ5LiAqLwoJCWt3bCA9IExJU1RfTkVYVCgmc2FtcGxlX2ZldGNoZXMubGlzdCwgc3RydWN0IHNhbXBsZV9mZXRjaF9rd19saXN0ICosIGxpc3QpOwoJCSgqaWR4KSA9IDA7Cgl9IGVsc2UgewoJCS8qIEdldCBrd2wgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmV0IGVudHJ5LiAqLwoJCWJhc2UgPSBjdXJyZW50ICsgMSAtICgqaWR4KTsKCQlrd2wgPSBjb250YWluZXJfb2YoYmFzZSwgc3RydWN0IHNhbXBsZV9mZXRjaF9rd19saXN0LCBrdyk7Cgl9CgoJd2hpbGUgKDEpIHsKCgkJLyogQ2hlY2sgaWYga3dsIGlzIHRoZSBsYXN0IGVudHJ5LiAqLwoJCWlmICgma3dsLT5saXN0ID09ICZzYW1wbGVfZmV0Y2hlcy5saXN0KQoJCQlyZXR1cm4gTlVMTDsKCgkJLyogaWR4IGNvbnRhaW4gdGhlIG5leHQga2V5d29yZC4gSWYgaXQgaXMgYXZhaWxhYmxlLCByZXR1cm4gaXQuICovCgkJaWYgKGt3bC0+a3dbKmlkeF0ua3cpIHsKCQkJKCppZHgpKys7CgkJCXJldHVybiAma3dsLT5rd1soKmlkeCktMV07CgkJfQoKCQkvKiBnZXQgbmV4dCBlbnRyeSBpbiB0aGUgbWFpbiBsaXN0LCBhbmQgcmV0dXJuIE5VTEwgaWYgdGhlIGVuZCBpcyByZWFjaGVkLiAqLwoJCWt3bCA9IExJU1RfTkVYVCgma3dsLT5saXN0LCBzdHJ1Y3Qgc2FtcGxlX2ZldGNoX2t3X2xpc3QgKiwgbGlzdCk7CgoJCS8qIFNldCBpbmRleCB0byAwLCBhbnMgZG8gb25lIG90aGVyIGxvb3AuICovCgkJKCppZHgpID0gMDsKCX0KfQoKLyogVGhpcyBmdW5jdGlvbiBicm93c2VzIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBjb252ZXJ0ZXJzLiA8Y3VycmVudD4gaXMKICogdGhlIGxhc3QgdXNlZCBjb252ZXJ0ZXIuIElmIGl0IGlzIHRoZSBmaXJzdCBjYWxsLCBpdCBtdXN0IHNldCB0byBOVUxMLgogKiA8aWR4PiBpcyB0aGUgaW5kZXggb2YgdGhlIG5leHQgY29udmVydGVyIGVudHJ5LiBJdCBpcyB1c2VkIGFzIHByaXZhdGUKICogdmFsdWUuIEl0IGlzIHVzZWxlc3MgdG8gaW5pdGlhdGUgaXQuCiAqCiAqIEl0IHJldHVybnMgYWx3YXlzIHRoZSBuZXh0IHNhbXBsZV9jb252IGVudHJ5LCBhbmQgTlVMTCB3aGVuIHRoZSBlbmQgb2YKICogdGhlIGxpc3QgaXMgcmVhY2hlZC4KICovCnN0cnVjdCBzYW1wbGVfY29udiAqc2FtcGxlX2NvbnZfZ2V0bmV4dChzdHJ1Y3Qgc2FtcGxlX2NvbnYgKmN1cnJlbnQsIGludCAqaWR4KQp7CglzdHJ1Y3Qgc2FtcGxlX2NvbnZfa3dfbGlzdCAqa3dsOwoJc3RydWN0IHNhbXBsZV9jb252ICpiYXNlOwoKCWlmICghY3VycmVudCkgewoJCS8qIEdldCBmaXJzdCBrd2wgZW50cnkuICovCgkJa3dsID0gTElTVF9ORVhUKCZzYW1wbGVfY29udnMubGlzdCwgc3RydWN0IHNhbXBsZV9jb252X2t3X2xpc3QgKiwgbGlzdCk7CgkJKCppZHgpID0gMDsKCX0gZWxzZSB7CgkJLyogR2V0IGt3bCBjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZXQgZW50cnkuICovCgkJYmFzZSA9IGN1cnJlbnQgKyAxIC0gKCppZHgpOwoJCWt3bCA9IGNvbnRhaW5lcl9vZihiYXNlLCBzdHJ1Y3Qgc2FtcGxlX2NvbnZfa3dfbGlzdCwga3cpOwoJfQoKCXdoaWxlICgxKSB7CgkJLyogQ2hlY2sgaWYga3dsIGlzIHRoZSBsYXN0IGVudHJ5LiAqLwoJCWlmICgma3dsLT5saXN0ID09ICZzYW1wbGVfY29udnMubGlzdCkKCQkJcmV0dXJuIE5VTEw7CgoJCS8qIGlkeCBjb250YWluIHRoZSBuZXh0IGtleXdvcmQuIElmIGl0IGlzIGF2YWlsYWJsZSwgcmV0dXJuIGl0LiAqLwoJCWlmIChrd2wtPmt3WyppZHhdLmt3KSB7CgkJCSgqaWR4KSsrOwoJCQlyZXR1cm4gJmt3bC0+a3dbKCppZHgpLTFdOwoJCX0KCgkJLyogZ2V0IG5leHQgZW50cnkgaW4gdGhlIG1haW4gbGlzdCwgYW5kIHJldHVybiBOVUxMIGlmIHRoZSBlbmQgaXMgcmVhY2hlZC4gKi8KCQlrd2wgPSBMSVNUX05FWFQoJmt3bC0+bGlzdCwgc3RydWN0IHNhbXBsZV9jb252X2t3X2xpc3QgKiwgbGlzdCk7CgoJCS8qIFNldCBpbmRleCB0byAwLCBhbnMgZG8gb25lIG90aGVyIGxvb3AuICovCgkJKCppZHgpID0gMDsKCX0KfQoKLyoKICogUmV0dXJucyB0aGUgcG9pbnRlciBvbiBzYW1wbGUgZm9ybWF0IGNvbnZlcnNpb24ga2V5d29yZCBzdHJ1Y3R1cmUgaWRlbnRpZmllZCBieQogKiBzdHJpbmcgb2YgPGxlbj4gaW4gYnVmZmVyIDxrdz4uCiAqCiAqLwpzdHJ1Y3Qgc2FtcGxlX2NvbnYgKmZpbmRfc2FtcGxlX2NvbnYoY29uc3QgY2hhciAqa3csIGludCBsZW4pCnsKCWludCBpbmRleDsKCXN0cnVjdCBzYW1wbGVfY29udl9rd19saXN0ICprd2w7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeShrd2wsICZzYW1wbGVfY29udnMubGlzdCwgbGlzdCkgewoJCWZvciAoaW5kZXggPSAwOyBrd2wtPmt3W2luZGV4XS5rdyAhPSBOVUxMOyBpbmRleCsrKSB7CgkJCWlmIChzdHJuY21wKGt3bC0+a3dbaW5kZXhdLmt3LCBrdywgbGVuKSA9PSAwICYmCgkJCSAgICBrd2wtPmt3W2luZGV4XS5rd1tsZW5dID09ICdcMCcpCgkJCQlyZXR1cm4gJmt3bC0+a3dbaW5kZXhdOwoJCX0KCX0KCXJldHVybiBOVUxMOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICBTYW1wbGUgY2FzdHMgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgIE5vdGU6IHRoZXNlIGZ1bmN0aW9ucyBkbyAqTk9UKiBzZXQgdGhlIG91dHB1dCB0eXBlIG9uIHRoZSAgICAqLwovKiAgIHNhbXBsZSwgdGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZG9pbmcgdGhpcyBvbiByZXR1cm4uICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIGludCBjX2lwMmludChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXNtcC0+ZGF0YS51aW50ID0gbnRvaGwoc21wLT5kYXRhLmlwdjQuc19hZGRyKTsKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX2lwMnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCglpZiAoIWluZXRfbnRvcChBRl9JTkVULCAodm9pZCAqKSZzbXAtPmRhdGEuaXB2NCwgdHJhc2gtPnN0ciwgdHJhc2gtPnNpemUpKQoJCXJldHVybiAwOwoKCXRyYXNoLT5sZW4gPSBzdHJsZW4odHJhc2gtPnN0cik7CglzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19pcDJpcHY2KHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJdjR0b3Y2KCZzbXAtPmRhdGEuaXB2NiwgJnNtcC0+ZGF0YS5pcHY0KTsKCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjY7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX2lwdjYyc3RyKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJc3RydWN0IGNodW5rICp0cmFzaCA9IGdldF90cmFzaF9jaHVuaygpOwoKCWlmICghaW5ldF9udG9wKEFGX0lORVQ2LCAodm9pZCAqKSZzbXAtPmRhdGEuaXB2NiwgdHJhc2gtPnN0ciwgdHJhc2gtPnNpemUpKQoJCXJldHVybiAwOwoKCXRyYXNoLT5sZW4gPSBzdHJsZW4odHJhc2gtPnN0cik7CglzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKLyoKc3RhdGljIGludCBjX2lwdjYyaXAoc3RydWN0IHNhbXBsZSAqc21wKQp7CglyZXR1cm4gdjZ0b3Y0KCZzbXAtPmRhdGEuaXB2NCwgJnNtcC0+ZGF0YS5pcHY2KTsKfQoqLwoKc3RhdGljIGludCBjX2ludDJpcChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXNtcC0+ZGF0YS5pcHY0LnNfYWRkciA9IGh0b25sKHNtcC0+ZGF0YS51aW50KTsKCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjQ7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX3N0cjJhZGRyKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJaWYgKCFidWYyaXAoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuLCAmc21wLT5kYXRhLmlwdjQpKSB7CgkJaWYgKCFidWYyaXA2KHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbiwgJnNtcC0+ZGF0YS5pcHY2KSkKCQkJcmV0dXJuIDA7CgkJc21wLT50eXBlID0gU01QX1RfSVBWNjsKCQlzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCQlyZXR1cm4gMTsKCX0KCXNtcC0+dHlwZSA9IFNNUF9UX0lQVjQ7CglzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfc3RyMmlwKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJaWYgKCFidWYyaXAoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuLCAmc21wLT5kYXRhLmlwdjQpKQoJCXJldHVybiAwOwoJc21wLT50eXBlID0gU01QX1RfSVBWNDsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19zdHIyaXB2NihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWlmICghYnVmMmlwNihzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4sICZzbXAtPmRhdGEuaXB2NikpCgkJcmV0dXJuIDA7CglzbXAtPnR5cGUgPSBTTVBfVF9JUFY2OwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKLyoKICogVGhlIE5VTEwgY2hhciBhbHdheXMgZW5mb3JjZXMgdGhlIGVuZCBvZiBzdHJpbmcgaWYgaXQgaXMgbWV0LgogKiBEYXRhIGlzIG5ldmVyIGNoYW5nZWQsIHNvIHdlIGNhbiBpZ25vcmUgdGhlIENPTlNUIGNhc2UKICovCnN0YXRpYyBpbnQgY19iaW4yc3RyKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJaW50IGk7CgoJZm9yIChpID0gMDsgaSA8IHNtcC0+ZGF0YS5zdHIubGVuOyBpKyspIHsKCQlpZiAoIXNtcC0+ZGF0YS5zdHIuc3RyW2ldKSB7CgkJCXNtcC0+ZGF0YS5zdHIubGVuID0gaTsKCQkJYnJlYWs7CgkJfQoJfQoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19pbnQyc3RyKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJc3RydWN0IGNodW5rICp0cmFzaCA9IGdldF90cmFzaF9jaHVuaygpOwoJY2hhciAqcG9zOwoKCXBvcyA9IHVsdG9hX3Ioc21wLT5kYXRhLnVpbnQsIHRyYXNoLT5zdHIsIHRyYXNoLT5zaXplKTsKCWlmICghcG9zKQoJCXJldHVybiAwOwoKCXRyYXNoLT5zaXplID0gdHJhc2gtPnNpemUgLSAocG9zIC0gdHJhc2gtPnN0cik7Cgl0cmFzaC0+c3RyID0gcG9zOwoJdHJhc2gtPmxlbiA9IHN0cmxlbihwb3MpOwoJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19zaW50MnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCWNoYXIgKnBvczsKCglwb3MgPSBzbHRvYV9yKHNtcC0+ZGF0YS5zaW50LCB0cmFzaC0+c3RyLCB0cmFzaC0+c2l6ZSk7CglpZiAoIXBvcykKCQlyZXR1cm4gMDsKCgl0cmFzaC0+c2l6ZSA9IHRyYXNoLT5zaXplIC0gKHBvcyAtIHRyYXNoLT5zdHIpOwoJdHJhc2gtPnN0ciA9IHBvczsKCXRyYXNoLT5sZW4gPSBzdHJsZW4ocG9zKTsKCXNtcC0+ZGF0YS5zdHIgPSAqdHJhc2g7CglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CglzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXJldHVybiAxOwp9CgovKiBUaGlzIGZ1bmN0aW9uIGR1cGxpY2F0ZXMgZGF0YSBhbmQgcmVtb3ZlcyB0aGUgZmxhZyAiY29uc3QiLiAqLwppbnQgc21wX2R1cChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXN0cnVjdCBjaHVuayAqdHJhc2g7CgoJLyogSWYgdGhlIGNvbnN0IGZsYWcgaXMgbm90IHNldCwgd2UgZG9uJ3QgbmVlZCB0byBkdXBsaWNhdGUgdGhlCgkgKiBwYXR0ZXJuIGFzIGl0IGNhbiBiZSBtb2RpZmllZCBpbiBwbGFjZS4KCSAqLwoJaWYgKCEoc21wLT5mbGFncyAmIFNNUF9GX0NPTlNUKSkKCQlyZXR1cm4gMTsKCglzd2l0Y2ggKHNtcC0+dHlwZSkgewoJY2FzZSBTTVBfVF9CT09MOgoJY2FzZSBTTVBfVF9VSU5UOgoJY2FzZSBTTVBfVF9TSU5UOgoJY2FzZSBTTVBfVF9BRERSOgoJY2FzZSBTTVBfVF9JUFY0OgoJY2FzZSBTTVBfVF9JUFY2OgoJCS8qIFRoZXNlIHR5cGUgYXJlIG5vdCBjb25zdC4gKi8KCQlicmVhazsKCWNhc2UgU01QX1RfU1RSOgoJY2FzZSBTTVBfVF9CSU46CgkJLyogRHVwbGljYXRlIGRhdGEuICovCgkJdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCQl0cmFzaC0+bGVuID0gc21wLT5kYXRhLnN0ci5sZW4gPCB0cmFzaC0+c2l6ZSA/IHNtcC0+ZGF0YS5zdHIubGVuIDogdHJhc2gtPnNpemU7CgkJbWVtY3B5KHRyYXNoLT5zdHIsIHNtcC0+ZGF0YS5zdHIuc3RyLCB0cmFzaC0+bGVuKTsKCQlzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQkvKiBPdGhlciBjYXNlcyBhcmUgdW5leHBlY3RlZC4gKi8KCQlyZXR1cm4gMDsKCX0KCgkvKiByZW1vdmUgY29uc3QgZmxhZyAqLwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKaW50IGNfbm9uZShzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IGNfc3RyMmludChzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWludCBpOwoJdWludDMyX3QgcmV0ID0gMDsKCglpZiAoc21wLT5kYXRhLnN0ci5sZW4gPT0gMCkKCQlyZXR1cm4gMDsKCglmb3IgKGkgPSAwOyBpIDwgc21wLT5kYXRhLnN0ci5sZW47IGkrKykgewoJCXVpbnQzMl90IHZhbCA9IHNtcC0+ZGF0YS5zdHIuc3RyW2ldIC0gJzAnOwoKCQlpZiAodmFsID4gOSkgewoJCQlpZiAoaSA9PSAwKQoJCQkJcmV0dXJuIDA7CgkJCWJyZWFrOwoJCX0KCgkJcmV0ID0gcmV0ICogMTAgKyB2YWw7Cgl9CgoJc21wLT5kYXRhLnVpbnQgPSByZXQ7CglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX3N0cjJtZXRoKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJZW51bSBodHRwX21ldGhfdCBtZXRoOwoJaW50IGxlbjsKCgltZXRoID0gZmluZF9odHRwX21ldGgoc21wLT5kYXRhLnN0ci5zdHIsIHNtcC0+ZGF0YS5zdHIubGVuKTsKCWlmIChtZXRoID09IEhUVFBfTUVUSF9PVEhFUikgewoJCWxlbiA9IHNtcC0+ZGF0YS5zdHIubGVuOwoJCXNtcC0+ZGF0YS5tZXRoLnN0ci5zdHIgPSBzbXAtPmRhdGEuc3RyLnN0cjsKCQlzbXAtPmRhdGEubWV0aC5zdHIubGVuID0gbGVuOwoJfQoJZWxzZQoJCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJc21wLT5kYXRhLm1ldGgubWV0aCA9IG1ldGg7CglzbXAtPnR5cGUgPSBTTVBfVF9NRVRIOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19tZXRoMnN0cihzdHJ1Y3Qgc2FtcGxlICpzbXApCnsKCWludCBsZW47CgllbnVtIGh0dHBfbWV0aF90IG1ldGg7CgoJaWYgKHNtcC0+ZGF0YS5tZXRoLm1ldGggPT0gSFRUUF9NRVRIX09USEVSKSB7CgkJLyogVGhlIG1ldGhvZCBpcyB1bmtub3duLiBDb3B5IHRoZSBvcmlnaW5hbCBwb2ludGVyLiAqLwoJCWxlbiA9IHNtcC0+ZGF0YS5tZXRoLnN0ci5sZW47CgkJc21wLT5kYXRhLnN0ci5zdHIgPSBzbXAtPmRhdGEubWV0aC5zdHIuc3RyOwoJCXNtcC0+ZGF0YS5zdHIubGVuID0gbGVuOwoJCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCX0KCWVsc2UgaWYgKHNtcC0+ZGF0YS5tZXRoLm1ldGggPCBIVFRQX01FVEhfT1RIRVIpIHsKCQkvKiBUaGUgbWV0aG9kIGlzIGtub3duLCBjb3B5IHRoZSBwb2ludGVyIGNvbnRhaW5pbmcgdGhlIHN0cmluZy4gKi8KCQltZXRoID0gc21wLT5kYXRhLm1ldGgubWV0aDsKCQlzbXAtPmRhdGEuc3RyLnN0ciA9IGh0dHBfa25vd25fbWV0aG9kc1ttZXRoXS5uYW1lOwoJCXNtcC0+ZGF0YS5zdHIubGVuID0gaHR0cF9rbm93bl9tZXRob2RzW21ldGhdLmxlbjsKCQlzbXAtPmZsYWdzIHw9IFNNUF9GX0NPTlNUOwoJCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCX0KCWVsc2UgewoJCS8qIFVua25vd24gbWV0aG9kICovCgkJcmV0dXJuIDA7Cgl9CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBjX2FkZHIyYmluKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJc3RydWN0IGNodW5rICpjaGsgPSBnZXRfdHJhc2hfY2h1bmsoKTsKCglpZiAoc21wLT50eXBlID09IFNNUF9UX0lQVjQpIHsKCQljaGstPmxlbiA9IDQ7CgkJbWVtY3B5KGNoay0+c3RyLCAmc21wLT5kYXRhLmlwdjQsIGNoay0+bGVuKTsKCX0KCWVsc2UgaWYgKHNtcC0+dHlwZSA9PSBTTVBfVF9JUFY2KSB7CgkJY2hrLT5sZW4gPSAxNjsKCQltZW1jcHkoY2hrLT5zdHIsICZzbXAtPmRhdGEuaXB2NiwgY2hrLT5sZW4pOwoJfQoJZWxzZQoJCXJldHVybiAwOwoKCXNtcC0+ZGF0YS5zdHIgPSAqY2hrOwoJc21wLT50eXBlID0gU01QX1RfQklOOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgY19pbnQyYmluKHN0cnVjdCBzYW1wbGUgKnNtcCkKewoJc3RydWN0IGNodW5rICpjaGsgPSBnZXRfdHJhc2hfY2h1bmsoKTsKCgkqKHVuc2lnbmVkIGludCAqKWNoay0+c3RyID0gaHRvbmwoc21wLT5kYXRhLnVpbnQpOwoJY2hrLT5sZW4gPSA0OwoKCXNtcC0+ZGF0YS5zdHIgPSAqY2hrOwoJc21wLT50eXBlID0gU01QX1RfQklOOwoJcmV0dXJuIDE7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgU2FtcGxlIGNhc3RzIG1hdHJpeDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgIHNhbXBsZV9jYXN0c1tmcm9tIHR5cGVdW3RvIHR5cGVdICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgTlVMTCBwb2ludGVyIHVzZWQgZm9yIGltcG9zc2libGUgc2FtcGxlIGNhc3RzICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnNhbXBsZV9jYXN0X2ZjdCBzYW1wbGVfY2FzdHNbU01QX1RZUEVTXVtTTVBfVFlQRVNdID0gewovKiAgICAgICAgICAgIHRvOiAgQU5ZICAgICBCT09MICAgICAgIFVJTlQgICAgICAgU0lOVCAgICAgICBBRERSICAgICAgICBJUFY0ICAgICAgSVBWNiAgICAgICAgU1RSICAgICAgICAgQklOICAgICAgICAgTUVUSCAqLwovKiBmcm9tOiAgQU5ZICovIHsgY19ub25lLCBjX25vbmUsICAgIGNfbm9uZSwgICAgY19ub25lLCAgICBjX25vbmUsICAgICBjX25vbmUsICAgY19ub25lLCAgICAgY19ub25lLCAgICAgY19ub25lLCAgICAgY19ub25lLCAgICAgfSwKLyogICAgICAgQk9PTCAqLyB7IGNfbm9uZSwgY19ub25lLCAgICBjX25vbmUsICAgIGNfbm9uZSwgICAgTlVMTCwgICAgICAgTlVMTCwgICAgIE5VTEwsICAgICAgIGNfaW50MnN0ciwgIE5VTEwsICAgICAgIE5VTEwsICAgICAgIH0sCi8qICAgICAgIFVJTlQgKi8geyBjX25vbmUsIGNfbm9uZSwgICAgY19ub25lLCAgICBjX25vbmUsICAgIGNfaW50MmlwLCAgIGNfaW50MmlwLCBOVUxMLCAgICAgICBjX2ludDJzdHIsICBjX2ludDJiaW4sICBOVUxMLCAgICAgICB9LAovKiAgICAgICBTSU5UICovIHsgY19ub25lLCBjX25vbmUsICAgIGNfbm9uZSwgICAgY19ub25lLCAgICBjX2ludDJpcCwgICBjX2ludDJpcCwgTlVMTCwgICAgICAgY19zaW50MnN0ciwgY19pbnQyYmluLCAgTlVMTCwgICAgICAgfSwKLyogICAgICAgQUREUiAqLyB7IGNfbm9uZSwgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICAgTlVMTCwgICAgIE5VTEwsICAgICAgIE5VTEwsICAgICAgIE5VTEwsICAgICAgIE5VTEwsICAgICAgIH0sCi8qICAgICAgIElQVjQgKi8geyBjX25vbmUsIE5VTEwsICAgICAgY19pcDJpbnQsICBjX2lwMmludCwgIGNfbm9uZSwgICAgIGNfbm9uZSwgICBjX2lwMmlwdjYsICBjX2lwMnN0ciwgICBjX2FkZHIyYmluLCBOVUxMLCAgICAgICB9LAovKiAgICAgICBJUFY2ICovIHsgY19ub25lLCBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICBjX25vbmUsICAgICBOVUxMLCAgICAgY19ub25lLCAgICAgY19pcHY2MnN0ciwgY19hZGRyMmJpbiwgTlVMTCwgICAgICAgfSwKLyogICAgICAgIFNUUiAqLyB7IGNfbm9uZSwgY19zdHIyaW50LCBjX3N0cjJpbnQsIGNfc3RyMmludCwgY19zdHIyYWRkciwgY19zdHIyaXAsIGNfc3RyMmlwdjYsIGNfbm9uZSwgICAgIGNfbm9uZSwgICAgIGNfc3RyMm1ldGgsIH0sCi8qICAgICAgICBCSU4gKi8geyBjX25vbmUsIE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgIE5VTEwsICAgICAgIE5VTEwsICAgICBOVUxMLCAgICAgICBjX2JpbjJzdHIsICBjX25vbmUsICAgICBjX3N0cjJtZXRoLCB9LAovKiAgICAgICBNRVRIICovIHsgY19ub25lLCBOVUxMLCAgICAgIE5VTEwsICAgICAgTlVMTCwgICAgICBOVUxMLCAgICAgICBOVUxMLCAgICAgTlVMTCwgICAgICAgY19tZXRoMnN0ciwgY19tZXRoMnN0ciwgY19ub25lLCAgICAgfQp9OwoKLyoKICogUGFyc2UgYSBzYW1wbGUgZXhwcmVzc2lvbiBjb25maWd1cmF0aW9uOgogKiAgICAgICAgZmV0Y2gga2V5d29yZCBmb2xsb3dlZCBieSBmb3JtYXQgY29udmVyc2lvbiBrZXl3b3Jkcy4KICogUmV0dXJucyBhIHBvaW50ZXIgb24gYWxsb2NhdGVkIHNhbXBsZSBleHByZXNzaW9uIHN0cnVjdHVyZS4KICogVGhlIGNhbGxlciBtdXN0IGhhdmUgc2V0IGFsLT5jdHguCiAqLwpzdHJ1Y3Qgc2FtcGxlX2V4cHIgKnNhbXBsZV9wYXJzZV9leHByKGNoYXIgKipzdHIsIGludCAqaWR4LCBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqKmVycl9tc2csIHN0cnVjdCBhcmdfbGlzdCAqYWwpCnsKCWNvbnN0IGNoYXIgKmJlZ3c7IC8qIGJlZ2lubmluZyBvZiB3b3JkICovCgljb25zdCBjaGFyICplbmR3OyAvKiBlbmQgb2Ygd29yZCAqLwoJY29uc3QgY2hhciAqZW5kdDsgLyogZW5kIG9mIHRlcm0gKi8KCXN0cnVjdCBzYW1wbGVfZXhwciAqZXhwcjsKCXN0cnVjdCBzYW1wbGVfZmV0Y2ggKmZldGNoOwoJc3RydWN0IHNhbXBsZV9jb252ICpjb252OwoJdW5zaWduZWQgbG9uZyBwcmV2X3R5cGU7CgljaGFyICpma3cgPSBOVUxMOwoJY2hhciAqY2t3ID0gTlVMTDsKCWludCBlcnJfYXJnOwoKCWJlZ3cgPSBzdHJbKmlkeF07Cglmb3IgKGVuZHcgPSBiZWd3OyAqZW5kdyAmJiAqZW5kdyAhPSAnKCcgJiYgKmVuZHcgIT0gJywnOyBlbmR3KyspOwoKCWlmIChlbmR3ID09IGJlZ3cpIHsKCQltZW1wcmludGYoZXJyX21zZywgIm1pc3NpbmcgZmV0Y2ggbWV0aG9kIik7CgkJZ290byBvdXRfZXJyb3I7Cgl9CgoJLyoga2VlcCBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgZmV0Y2gga2V5d29yZCBmb3IgZXJyb3IgcmVwb3J0aW5nICovCglma3cgPSBteV9zdHJuZHVwKGJlZ3csIGVuZHcgLSBiZWd3KTsKCglmZXRjaCA9IGZpbmRfc2FtcGxlX2ZldGNoKGJlZ3csIGVuZHcgLSBiZWd3KTsKCWlmICghZmV0Y2gpIHsKCQltZW1wcmludGYoZXJyX21zZywgInVua25vd24gZmV0Y2ggbWV0aG9kICclcyciLCBma3cpOwoJCWdvdG8gb3V0X2Vycm9yOwoJfQoKCWVuZHQgPSBlbmR3OwoJaWYgKCplbmR0ID09ICcoJykgewoJCS8qIGxvb2sgZm9yIHRoZSBlbmQgb2YgdGhpcyB0ZXJtIGFuZCBza2lwIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzICovCgkJZW5kdCA9ICsrZW5kdzsKCQl3aGlsZSAoKmVuZHQgJiYgKmVuZHQgIT0gJyknKQoJCQllbmR0Kys7CgkJaWYgKCplbmR0ICE9ICcpJykgewoJCQltZW1wcmludGYoZXJyX21zZywgIm1pc3NpbmcgY2xvc2luZyAnKScgYWZ0ZXIgYXJndW1lbnRzIHRvIGZldGNoIGtleXdvcmQgJyVzJyIsIGZrdyk7CgkJCWdvdG8gb3V0X2Vycm9yOwoJCX0KCX0KCgkvKiBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIDoKCSAqICAgLSBiZWd3IDogYmVnaW5uaW5nIG9mIHRoZSBrZXl3b3JkCgkgKiAgIC0gZW5kdyA6IGVuZCBvZiB0aGUga2V5d29yZCwgZmlyc3QgY2hhcmFjdGVyIG5vdCBwYXJ0IG9mIGtleXdvcmQKCSAqICAgICAgICAgICAgbm9yIHRoZSBvcGVuaW5nIHBhcmVudGhlc2lzIChzbyBmaXJzdCBjaGFyYWN0ZXIgb2YgYXJncwoJICogICAgICAgICAgICBpZiBwcmVzZW50KS4KCSAqICAgLSBlbmR0IDogZW5kIG9mIHRoZSB0ZXJtICg9ZW5kdyBvciBsYXN0IHBhcmVudGhlc2lzIGlmIGFyZ3MgYXJlIHByZXNlbnQpCgkgKi8KCglpZiAoZmV0Y2gtPm91dF90eXBlID49IFNNUF9UWVBFUykgewoJCW1lbXByaW50ZihlcnJfbXNnLCAicmV0dXJucyB0eXBlIG9mIGZldGNoIG1ldGhvZCAnJXMnIGlzIHVua25vd24iLCBma3cpOwoJCWdvdG8gb3V0X2Vycm9yOwoJfQoJcHJldl90eXBlID0gZmV0Y2gtPm91dF90eXBlOwoKCWV4cHIgPSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBzYW1wbGVfZXhwcikpOwoJaWYgKCFleHByKQoJCWdvdG8gb3V0X2Vycm9yOwoKCUxJU1RfSU5JVCgmKGV4cHItPmNvbnZfZXhwcnMpKTsKCWV4cHItPmZldGNoID0gZmV0Y2g7CglleHByLT5hcmdfcCA9IGVtcHR5X2FyZ19saXN0OwoKCS8qIE5vdGUgdGhhdCB3ZSBjYWxsIHRoZSBhcmd1bWVudCBwYXJzZXIgZXZlbiB3aXRoIGFuIGVtcHR5IHN0cmluZywKCSAqIHRoaXMgYWxsb3dzIGl0IHRvIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGVudHJpZXMgZm9yIG1hbmRhdG9yeQoJICogaW1wbGljaXQgYXJndW1lbnRzIChlZzogbG9jYWwgcHJveHkgbmFtZSkuCgkgKi8KCWFsLT5rdyA9IGV4cHItPmZldGNoLT5rdzsKCWFsLT5jb252ID0gTlVMTDsKCWlmIChtYWtlX2FyZ19saXN0KGVuZHcsIGVuZHQgLSBlbmR3LCBmZXRjaC0+YXJnX21hc2ssICZleHByLT5hcmdfcCwgZXJyX21zZywgTlVMTCwgJmVycl9hcmcsIGFsKSA8IDApIHsKCQltZW1wcmludGYoZXJyX21zZywgImZldGNoIG1ldGhvZCAnJXMnIDogJXMiLCBma3csICplcnJfbXNnKTsKCQlnb3RvIG91dF9lcnJvcjsKCX0KCglpZiAoIWV4cHItPmFyZ19wKSB7CgkJZXhwci0+YXJnX3AgPSBlbXB0eV9hcmdfbGlzdDsKCX0KCWVsc2UgaWYgKGZldGNoLT52YWxfYXJncyAmJiAhZmV0Y2gtPnZhbF9hcmdzKGV4cHItPmFyZ19wLCBlcnJfbXNnKSkgewoJCW1lbXByaW50ZihlcnJfbXNnLCAiaW52YWxpZCBhcmdzIGluIGZldGNoIG1ldGhvZCAnJXMnIDogJXMiLCBma3csICplcnJfbXNnKTsKCQlnb3RvIG91dF9lcnJvcjsKCX0KCgkvKiBOb3cgcHJvY2VzcyB0aGUgY29udmVydGVycyBpZiBhbnkuIFdlIGhhdmUgdHdvIHN1cHBvcnRlZCBzeW50YXhlcwoJICogZm9yIHRoZSBjb252ZXJ0ZXJzLCB3aGljaCBjYW4gYmUgY29tYmluZWQgOgoJICogIC0gY29tbWEtZGVsaW1pdGVkIGxpc3Qgb2YgY29udmVydGVycyBqdXN0IGFmdGVyIHRoZSBrZXl3b3JkIGFuZCBhcmdzIDsKCSAqICAtIG9uZSBjb252ZXJ0ZXIgcGVyIGtleXdvcmQKCSAqIFRoZSBjb21iaW5hdGlvbiBhbGxvd3MgdG8gaGF2ZSBlYWNoIGtleXdvcmQgYmVpbmcgYSBjb21tYS1kZWxpbWl0ZWQKCSAqIHNlcmllcyBvZiBjb252ZXJ0ZXJzLgoJICoKCSAqIFdlIHdhbnQgdG8gcHJvY2VzcyB0aGUgZm9ybWVyIGZpcnN0LCB0aGVuIHRoZSBsYXR0ZXIuIEZvciB0aGlzIHdlIHN0YXJ0CgkgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN1cHBvc2VkIHBsYWNlIGluIHRoZSBleGl0aW5nIGNvbnYgY2hhaW4sIHdoaWNoCgkgKiBzdGFydHMgYXQgdGhlIGxhc3QgY29tbWEgKGVuZHQpLgoJICovCgoJd2hpbGUgKDEpIHsKCQlzdHJ1Y3Qgc2FtcGxlX2NvbnZfZXhwciAqY29udl9leHByOwoKCQlpZiAoKmVuZHQgPT0gJyknKSAvKiBza2lwIGxhc3QgY2xvc2luZyBwYXJlbnRoZXNpcyAqLwoJCQllbmR0Kys7CgoJCWlmICgqZW5kdCAmJiAqZW5kdCAhPSAnLCcpIHsKCQkJaWYgKGNrdykKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAibWlzc2luZyBjb21tYSBhZnRlciBjb252IGtleXdvcmQgJyVzJyIsIGNrdyk7CgkJCWVsc2UKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAibWlzc2luZyBjb21tYSBhZnRlciBmZXRjaCBrZXl3b3JkICclcyciLCBma3cpOwoJCQlnb3RvIG91dF9lcnJvcjsKCQl9CgoJCXdoaWxlICgqZW5kdCA9PSAnLCcpIC8qIHRoZW4gdHJhaWxpbmcgY29tbWFzICovCgkJCWVuZHQrKzsKCgkJYmVndyA9IGVuZHQ7IC8qIHN0YXJ0IG9mIGNvbnYga2V5d29yZCAqLwoKCQlpZiAoISpiZWd3KSB7CgkJCS8qIG5vbmUgPyBza2lwIHRvIG5leHQgc3RyaW5nICovCgkJCSgqaWR4KSsrOwoJCQliZWd3ID0gc3RyWyppZHhdOwoJCQlpZiAoIWJlZ3cgfHwgISpiZWd3KQoJCQkJYnJlYWs7CgkJfQoKCQlmb3IgKGVuZHcgPSBiZWd3OyAqZW5kdyAmJiAqZW5kdyAhPSAnKCcgJiYgKmVuZHcgIT0gJywnOyBlbmR3KyspOwoKCQlmcmVlKGNrdyk7CgkJY2t3ID0gbXlfc3RybmR1cChiZWd3LCBlbmR3IC0gYmVndyk7CgoJCWNvbnYgPSBmaW5kX3NhbXBsZV9jb252KGJlZ3csIGVuZHcgLSBiZWd3KTsKCQlpZiAoIWNvbnYpIHsKCQkJLyogd2UgZm91bmQgYW4gaXNvbGF0ZWQga2V5d29yZCB0aGF0IHdlIGRvbid0IGtub3csIGl0J3Mgbm90IG91cnMgKi8KCQkJaWYgKGJlZ3cgPT0gc3RyWyppZHhdKQoJCQkJYnJlYWs7CgkJCW1lbXByaW50ZihlcnJfbXNnLCAidW5rbm93biBjb252IG1ldGhvZCAnJXMnIiwgY2t3KTsKCQkJZ290byBvdXRfZXJyb3I7CgkJfQoKCQllbmR0ID0gZW5kdzsKCQlpZiAoKmVuZHQgPT0gJygnKSB7CgkJCS8qIGxvb2sgZm9yIHRoZSBlbmQgb2YgdGhpcyB0ZXJtICovCgkJCXdoaWxlICgqZW5kdCAmJiAqZW5kdCAhPSAnKScpCgkJCQllbmR0Kys7CgkJCWlmICgqZW5kdCAhPSAnKScpIHsKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAic3ludGF4IGVycm9yOiBtaXNzaW5nICcpJyBhZnRlciBjb252IGtleXdvcmQgJyVzJyIsIGNrdyk7CgkJCQlnb3RvIG91dF9lcnJvcjsKCQkJfQoJCX0KCgkJaWYgKGNvbnYtPmluX3R5cGUgPj0gU01QX1RZUEVTIHx8IGNvbnYtPm91dF90eXBlID49IFNNUF9UWVBFUykgewoJCQltZW1wcmludGYoZXJyX21zZywgInJldHVybnMgdHlwZSBvZiBjb252IG1ldGhvZCAnJXMnIGlzIHVua25vd24iLCBja3cpOwoJCQlnb3RvIG91dF9lcnJvcjsKCQl9CgoJCS8qIElmIGltcG9zc2libGUgdHlwZSBjb252ZXJzaW9uICovCgkJaWYgKCFzYW1wbGVfY2FzdHNbcHJldl90eXBlXVtjb252LT5pbl90eXBlXSkgewoJCQltZW1wcmludGYoZXJyX21zZywgImNvbnYgbWV0aG9kICclcycgY2Fubm90IGJlIGFwcGxpZWQiLCBja3cpOwoJCQlnb3RvIG91dF9lcnJvcjsKCQl9CgoJCXByZXZfdHlwZSA9IGNvbnYtPm91dF90eXBlOwoJCWNvbnZfZXhwciA9IGNhbGxvYygxLCBzaXplb2Yoc3RydWN0IHNhbXBsZV9jb252X2V4cHIpKTsKCQlpZiAoIWNvbnZfZXhwcikKCQkJZ290byBvdXRfZXJyb3I7CgoJCUxJU1RfQUREUSgmKGV4cHItPmNvbnZfZXhwcnMpLCAmKGNvbnZfZXhwci0+bGlzdCkpOwoJCWNvbnZfZXhwci0+Y29udiA9IGNvbnY7CgoJCWlmIChlbmR0ICE9IGVuZHcpIHsKCQkJaW50IGVycl9hcmc7CgoJCQlpZiAoIWNvbnYtPmFyZ19tYXNrKSB7CgkJCQltZW1wcmludGYoZXJyX21zZywgImNvbnYgbWV0aG9kICclcycgZG9lcyBub3Qgc3VwcG9ydCBhbnkgYXJncyIsIGNrdyk7CgkJCQlnb3RvIG91dF9lcnJvcjsKCQkJfQoKCQkJYWwtPmt3ID0gZXhwci0+ZmV0Y2gtPmt3OwoJCQlhbC0+Y29udiA9IGNvbnZfZXhwci0+Y29udi0+a3c7CgkJCWlmIChtYWtlX2FyZ19saXN0KGVuZHcgKyAxLCBlbmR0IC0gZW5kdyAtIDEsIGNvbnYtPmFyZ19tYXNrLCAmY29udl9leHByLT5hcmdfcCwgZXJyX21zZywgTlVMTCwgJmVycl9hcmcsIGFsKSA8IDApIHsKCQkJCW1lbXByaW50ZihlcnJfbXNnLCAiaW52YWxpZCBhcmcgJWQgaW4gY29udiBtZXRob2QgJyVzJyA6ICVzIiwgZXJyX2FyZysxLCBja3csICplcnJfbXNnKTsKCQkJCWdvdG8gb3V0X2Vycm9yOwoJCQl9CgoJCQlpZiAoIWNvbnZfZXhwci0+YXJnX3ApCgkJCQljb252X2V4cHItPmFyZ19wID0gZW1wdHlfYXJnX2xpc3Q7CgoJCQlpZiAoY29udi0+dmFsX2FyZ3MgJiYgIWNvbnYtPnZhbF9hcmdzKGNvbnZfZXhwci0+YXJnX3AsIGNvbnYsIGZpbGUsIGxpbmUsIGVycl9tc2cpKSB7CgkJCQltZW1wcmludGYoZXJyX21zZywgImludmFsaWQgYXJncyBpbiBjb252IG1ldGhvZCAnJXMnIDogJXMiLCBja3csICplcnJfbXNnKTsKCQkJCWdvdG8gb3V0X2Vycm9yOwoJCQl9CgkJfQoJCWVsc2UgaWYgKEFSR00oY29udi0+YXJnX21hc2spKSB7CgkJCW1lbXByaW50ZihlcnJfbXNnLCAibWlzc2luZyBhcmdzIGZvciBjb252IG1ldGhvZCAnJXMnIiwgY2t3KTsKCQkJZ290byBvdXRfZXJyb3I7CgkJfQoJfQoKIG91dDoKCWZyZWUoZmt3KTsKCWZyZWUoY2t3KTsKCXJldHVybiBleHByOwoKb3V0X2Vycm9yOgoJLyogVE9ETzogcHJ1bmVfc2FtcGxlX2V4cHIoZXhwcik7ICovCglleHByID0gTlVMTDsKCWdvdG8gb3V0Owp9CgovKgogKiBQcm9jZXNzIGEgZmV0Y2ggKyBmb3JtYXQgY29udmVyc2lvbiBvZiBkZWZpbmVkIGJ5IHRoZSBzYW1wbGUgZXhwcmVzc2lvbiA8ZXhwcj4KICogb24gcmVxdWVzdCBvciByZXNwb25zZSBjb25zaWRlcmluZyB0aGUgPG9wdD4gcGFyYW1ldGVyLgogKiBSZXR1cm5zIGEgcG9pbnRlciBvbiBhIHR5cGVkIHNhbXBsZSBzdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgcmVzdWx0IG9yIE5VTEwgaWYKICogc2FtcGxlIGlzIG5vdCBmb3VuZCBvciB3aGVuIGZvcm1hdCBjb252ZXJzaW9uIGZhaWxlZC4KICogIElmIDxwPiBpcyBub3QgbnVsbCwgZnVuY3Rpb24gcmV0dXJucyByZXN1bHRzIGluIHN0cnVjdHVyZSBwb2ludGVkIGJ5IDxwPi4KICogIElmIDxwPiBpcyBudWxsLCBmdW5jdGlvbnMgcmV0dXJucyBhIHBvaW50ZXIgb24gYSBzdGF0aWMgc2FtcGxlIHN0cnVjdHVyZS4KICoKICogTm90ZTogdGhlIGZldGNoIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgdG8gcHJvcGVybHkgc2V0IHRoZSByZXR1cm4gdHlwZS4gVGhlCiAqIGNvbnZlcnNpb24gZnVuY3Rpb25zIG11c3QgZG8gc28gdG9vLiBIb3dldmVyIHRoZSBjYXN0IGZ1bmN0aW9ucyBkbyBub3QgbmVlZAogKiB0byBzaW5jZSB0aGV5J3JlIG1hZGUgdG8gY2FzdCBtdXRpcGxlIHR5cGVzIGFjY29yZGluZyB0byB3aGF0IGlzIHJlcXVpcmVkLgogKgogKiBUaGUgY2FsbGVyIG1heSBpbmRpY2F0ZSBpbiA8b3B0PiBpZiBpdCBjb25zaWRlcnMgdGhlIHJlc3VsdCBmaW5hbCBvciBub3QuCiAqIFRoZSBjYWxsZXIgbmVlZHMgdG8gY2hlY2sgdGhlIFNNUF9GX01BWV9DSEFOR0UgZmxhZyBpbiBwLT5mbGFncyB0byB2ZXJpZnkKICogaWYgdGhlIHJlc3VsdCBpcyBzdGFibGUgb3Igbm90LCBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZyB0YWJsZSA6CiAqCiAqIHJldHVybiBNQVlfQ0hBTkdFIEZJTkFMICAgTWVhbmluZyBmb3IgdGhlIHNhbXBsZQogKiAgTlVMTCAgICAgIDAgICAgICAgICogICAgIE5vdCBwcmVzZW50IGFuZCB3aWxsIG5ldmVyIGJlIChlZzogaGVhZGVyKQogKiAgTlVMTCAgICAgIDEgICAgICAgIDAgICAgIE5vdCBwcmVzZW50IHlldCwgY291bGQgY2hhbmdlIChlZzogUE9TVCBwYXJhbSkKICogIE5VTEwgICAgICAxICAgICAgICAxICAgICBOb3QgcHJlc2VudCB5ZXQsIHdpbGwgbm90IGNoYW5nZSBhbnltb3JlCiAqICAgc21wICAgICAgMCAgICAgICAgKiAgICAgUHJlc2VudCBhbmQgd2lsbCBub3QgY2hhbmdlIChlZzogaGVhZGVyKQogKiAgIHNtcCAgICAgIDEgICAgICAgIDAgICAgIFByZXNlbnQsIG1heSBjaGFuZ2UgKGVnOiByZXF1ZXN0IGxlbmd0aCkKICogICBzbXAgICAgICAxICAgICAgICAxICAgICBQcmVzZW50LCBsYXN0IGtub3duIHZhbHVlIChlZzogcmVxdWVzdCBsZW5ndGgpCiAqLwpzdHJ1Y3Qgc2FtcGxlICpzYW1wbGVfcHJvY2VzcyhzdHJ1Y3QgcHJveHkgKnB4LCBzdHJ1Y3Qgc2Vzc2lvbiAqc2VzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmVhbSAqc3RybSwgdW5zaWduZWQgaW50IG9wdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZV9leHByICpleHByLCBzdHJ1Y3Qgc2FtcGxlICpwKQp7CglzdHJ1Y3Qgc2FtcGxlX2NvbnZfZXhwciAqY29udl9leHByOwoKCWlmIChwID09IE5VTEwpIHsKCQlwID0gJnRlbXBfc21wOwoJCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKCX0KCglwLT5weCAgID0gcHg7CglwLT5zZXNzID0gc2VzczsKCXAtPnN0cm0gPSBzdHJtOwoJcC0+b3B0ICA9IG9wdDsKCWlmICghZXhwci0+ZmV0Y2gtPnByb2Nlc3MoZXhwci0+YXJnX3AsIHAsIGV4cHItPmZldGNoLT5rdywgZXhwci0+ZmV0Y2gtPnByaXZhdGUpKQoJCXJldHVybiBOVUxMOwoKCWxpc3RfZm9yX2VhY2hfZW50cnkoY29udl9leHByLCAmZXhwci0+Y29udl9leHBycywgbGlzdCkgewoJCS8qIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgcC0+dHlwZSBjYW4gYmUgY2FzdGVkIGludG8KCQkgKiBjb252X2V4cHItPmNvbnYtPmluX3R5cGUuIFdlIGhhdmUgMyBwb3NzaWJpbGl0aWVzIDoKCQkgKiAgLSBOVUxMICAgPT4gbm90IGNhc3RhYmxlLgoJCSAqICAtIGNfbm9uZSA9PiBub3RoaW5nIHRvIGRvIChsZXQncyBvcHRpbWl6ZSBpdCkKCQkgKiAgLSBvdGhlciAgPT4gYXBwbHkgY2FzdCBhbmQgcHJlcGFyZSB0byBmYWlsCgkJICovCgkJaWYgKCFzYW1wbGVfY2FzdHNbcC0+dHlwZV1bY29udl9leHByLT5jb252LT5pbl90eXBlXSkKCQkJcmV0dXJuIE5VTEw7CgoJCWlmIChzYW1wbGVfY2FzdHNbcC0+dHlwZV1bY29udl9leHByLT5jb252LT5pbl90eXBlXSAhPSBjX25vbmUgJiYKCQkgICAgIXNhbXBsZV9jYXN0c1twLT50eXBlXVtjb252X2V4cHItPmNvbnYtPmluX3R5cGVdKHApKQoJCQlyZXR1cm4gTlVMTDsKCgkJLyogT0sgY2FzdCBzdWNjZWVkZWQgKi8KCgkJaWYgKCFjb252X2V4cHItPmNvbnYtPnByb2Nlc3MoY29udl9leHByLT5hcmdfcCwgcCwgY29udl9leHByLT5jb252LT5wcml2YXRlKSkKCQkJcmV0dXJuIE5VTEw7Cgl9CglyZXR1cm4gcDsKfQoKLyoKICogUmVzb2x2ZSBhbGwgcmVtYWluaW5nIGFyZ3VtZW50cyBpbiBwcm94eSA8cD4uIFJldHVybnMgdGhlIG51bWJlciBvZgogKiBlcnJvcnMgb3IgMCBpZiBldmVyeXRoaW5nIGlzIGZpbmUuCiAqLwppbnQgc21wX3Jlc29sdmVfYXJncyhzdHJ1Y3QgcHJveHkgKnApCnsKCXN0cnVjdCBhcmdfbGlzdCAqY3VyLCAqYmFrOwoJY29uc3QgY2hhciAqY3R4LCAqd2hlcmU7Cgljb25zdCBjaGFyICpjb252X2N0eCwgKmNvbnZfcHJlLCAqY29udl9wb3M7CglzdHJ1Y3QgdXNlcmxpc3QgKnVsOwoJc3RydWN0IG15X3JlZ2V4ICpyZWc7CglzdHJ1Y3QgYXJnICphcmc7CglpbnQgY2ZnZXJyID0gMDsKCWludCByZmxhZ3M7CgoJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGN1ciwgYmFrLCAmcC0+Y29uZi5hcmdzLmxpc3QsIGxpc3QpIHsKCQlzdHJ1Y3QgcHJveHkgKnB4OwoJCXN0cnVjdCBzZXJ2ZXIgKnNydjsKCQljaGFyICpwbmFtZSwgKnNuYW1lOwoJCWNoYXIgKmVycjsKCgkJYXJnID0gY3VyLT5hcmc7CgoJCS8qIHByZXBhcmUgb3V0cHV0IG1lc3NhZ2VzICovCgkJY29udl9wcmUgPSBjb252X3BvcyA9IGNvbnZfY3R4ID0gIiI7CgkJaWYgKGN1ci0+Y29udikgewoJCQljb252X2N0eCA9IGN1ci0+Y29udjsKCQkJY29udl9wcmUgPSAiY29udmVyc2lvbiBrZXl3b3JkICciOwoJCQljb252X3BvcyA9ICInIGZvciAiOwoJCX0KCgkJd2hlcmUgPSAiaW4iOwoJCWN0eCA9ICJzYW1wbGUgZmV0Y2gga2V5d29yZCI7CgkJc3dpdGNoIChjdXItPmN0eCkgewoJCWNhc2UgQVJHQ19TVEs6IHdoZXJlID0gImluIHN0aWNrIHJ1bGUgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfVFJLOiB3aGVyZSA9ICJpbiB0cmFja2luZyBydWxlIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX0xPRzogd2hlcmUgPSAiaW4gbG9nLWZvcm1hdCBzdHJpbmcgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfSFJROiB3aGVyZSA9ICJpbiBodHRwLXJlcXVlc3QgaGVhZGVyIGZvcm1hdCBzdHJpbmcgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfSFJTOiB3aGVyZSA9ICJpbiBodHRwLXJlc3BvbnNlIGhlYWRlciBmb3JtYXQgc3RyaW5nIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX1VJRjogd2hlcmUgPSAiaW4gdW5pcXVlLWlkLWZvcm1hdCBzdHJpbmcgaW4iOyBicmVhazsKCQljYXNlIEFSR0NfUkRSOiB3aGVyZSA9ICJpbiByZWRpcmVjdCBmb3JtYXQgc3RyaW5nIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX0NBUDogd2hlcmUgPSAiaW4gY2FwdHVyZSBydWxlIGluIjsgYnJlYWs7CgkJY2FzZSBBUkdDX0FDTDogY3R4ID0gIkFDTCBrZXl3b3JkIjsgYnJlYWs7CgkJY2FzZSBBUkdDX1NSVjogd2hlcmUgPSAiaW4gc2VydmVyIGRpcmVjdGl2ZSBpbiI7IGJyZWFrOwoJCX0KCgkJLyogc2V0IGEgZmV3IGRlZmF1bHQgc2V0dGluZ3MgKi8KCQlweCA9IHA7CgkJcG5hbWUgPSBwLT5pZDsKCgkJc3dpdGNoIChhcmctPnR5cGUpIHsKCQljYXNlIEFSR1RfU1JWOgoJCQlpZiAoIWFyZy0+ZGF0YS5zdHIubGVuKSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogbWlzc2luZyBzZXJ2ZXIgbmFtZSBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJLyogd2Ugc3VwcG9ydCB0d28gZm9ybWF0cyA6ICJiY2svc3J2IiBhbmQgInNydiIgKi8KCQkJc25hbWUgPSBzdHJyY2hyKGFyZy0+ZGF0YS5zdHIuc3RyLCAnLycpOwoKCQkJaWYgKHNuYW1lKSB7CgkJCQkqc25hbWUrKyA9ICdcMCc7CgkJCQlwbmFtZSA9IGFyZy0+ZGF0YS5zdHIuc3RyOwoKCQkJCXB4ID0gcHJveHlfYmVfYnlfbmFtZShwbmFtZSk7CgkJCQlpZiAoIXB4KSB7CgkJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IHVuYWJsZSB0byBmaW5kIHByb3h5ICclcycgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgcG5hbWUsCgkJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJCWNmZ2VycisrOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCWVsc2UKCQkJCXNuYW1lID0gYXJnLT5kYXRhLnN0ci5zdHI7CgoJCQlzcnYgPSBmaW5kc2VydmVyKHB4LCBzbmFtZSk7CgkJCWlmICghc3J2KSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogdW5hYmxlIHRvIGZpbmQgc2VydmVyICclcycgaW4gcHJveHkgJyVzJywgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBzbmFtZSwgcG5hbWUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWJyZWFrOwoJCQl9CgoJCQlmcmVlKGFyZy0+ZGF0YS5zdHIuc3RyKTsKCQkJYXJnLT5kYXRhLnN0ci5zdHIgPSBOVUxMOwoJCQlhcmctPnVucmVzb2x2ZWQgPSAwOwoJCQlhcmctPmRhdGEuc3J2ID0gc3J2OwoJCQlicmVhazsKCgkJY2FzZSBBUkdUX0ZFOgoJCQlpZiAoYXJnLT5kYXRhLnN0ci5sZW4pIHsKCQkJCXBuYW1lID0gYXJnLT5kYXRhLnN0ci5zdHI7CgkJCQlweCA9IHByb3h5X2ZlX2J5X25hbWUocG5hbWUpOwoJCQl9CgoJCQlpZiAoIXB4KSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogdW5hYmxlIHRvIGZpbmQgZnJvbnRlbmQgJyVzJyByZWZlcmVuY2VkIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsIHBuYW1lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQlicmVhazsKCQkJfQoKCQkJaWYgKCEocHgtPmNhcCAmIFBSX0NBUF9GRSkpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBwcm94eSAnJXMnLCByZWZlcmVuY2VkIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycsIGhhcyBub3QgZnJvbnRlbmQgY2FwYWJpbGl0eS5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgcG5hbWUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWJyZWFrOwoJCQl9CgoJCQlmcmVlKGFyZy0+ZGF0YS5zdHIuc3RyKTsKCQkJYXJnLT5kYXRhLnN0ci5zdHIgPSBOVUxMOwoJCQlhcmctPnVucmVzb2x2ZWQgPSAwOwoJCQlhcmctPmRhdGEucHJ4ID0gcHg7CgkJCWJyZWFrOwoKCQljYXNlIEFSR1RfQkU6CgkJCWlmIChhcmctPmRhdGEuc3RyLmxlbikgewoJCQkJcG5hbWUgPSBhcmctPmRhdGEuc3RyLnN0cjsKCQkJCXB4ID0gcHJveHlfYmVfYnlfbmFtZShwbmFtZSk7CgkJCX0KCgkJCWlmICghcHgpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiB1bmFibGUgdG8gZmluZCBiYWNrZW5kICclcycgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBwbmFtZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmICghKHB4LT5jYXAgJiBQUl9DQVBfQkUpKSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogcHJveHkgJyVzJywgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLCBoYXMgbm90IGJhY2tlbmQgY2FwYWJpbGl0eS5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgcG5hbWUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWJyZWFrOwoJCQl9CgoJCQlmcmVlKGFyZy0+ZGF0YS5zdHIuc3RyKTsKCQkJYXJnLT5kYXRhLnN0ci5zdHIgPSBOVUxMOwoJCQlhcmctPnVucmVzb2x2ZWQgPSAwOwoJCQlhcmctPmRhdGEucHJ4ID0gcHg7CgkJCWJyZWFrOwoKCQljYXNlIEFSR1RfVEFCOgoJCQlpZiAoYXJnLT5kYXRhLnN0ci5sZW4pIHsKCQkJCXBuYW1lID0gYXJnLT5kYXRhLnN0ci5zdHI7CgkJCQlweCA9IHByb3h5X3RibF9ieV9uYW1lKHBuYW1lKTsKCQkJfQoKCQkJaWYgKCFweCkgewoJCQkJQWxlcnQoInBhcnNpbmcgWyVzOiVkXSA6IHVuYWJsZSB0byBmaW5kIHRhYmxlICclcycgcmVmZXJlbmNlZCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLCBwbmFtZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJYnJlYWs7CgkJCX0KCgkJCWlmICghcHgtPnRhYmxlLnNpemUpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiBubyB0YWJsZSBpbiBwcm94eSAnJXMnIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgcG5hbWUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWJyZWFrOwoJCQl9CgoJCQlmcmVlKGFyZy0+ZGF0YS5zdHIuc3RyKTsKCQkJYXJnLT5kYXRhLnN0ci5zdHIgPSBOVUxMOwoJCQlhcmctPnVucmVzb2x2ZWQgPSAwOwoJCQlhcmctPmRhdGEucHJ4ID0gcHg7CgkJCWJyZWFrOwoKCQljYXNlIEFSR1RfVVNSOgoJCQlpZiAoIWFyZy0+ZGF0YS5zdHIubGVuKSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogbWlzc2luZyB1c2VybGlzdCBuYW1lIGluIGFyZyAlZCBvZiAlcyVzJXMlcyAnJXMnICVzIHByb3h5ICclcycuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWJyZWFrOwoJCQl9CgoJCQlpZiAocC0+dXJpX2F1dGggJiYgcC0+dXJpX2F1dGgtPnVzZXJsaXN0ICYmCgkJCSAgICAhc3RyY21wKHAtPnVyaV9hdXRoLT51c2VybGlzdC0+bmFtZSwgYXJnLT5kYXRhLnN0ci5zdHIpKQoJCQkJdWwgPSBwLT51cmlfYXV0aC0+dXNlcmxpc3Q7CgkJCWVsc2UKCQkJCXVsID0gYXV0aF9maW5kX3VzZXJsaXN0KGFyZy0+ZGF0YS5zdHIuc3RyKTsKCgkJCWlmICghdWwpIHsKCQkJCUFsZXJ0KCJwYXJzaW5nIFslczolZF0gOiB1bmFibGUgdG8gZmluZCB1c2VybGlzdCAnJXMnIHJlZmVyZW5jZWQgaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwgYXJnLT5kYXRhLnN0ci5zdHIsCgkJCQkgICAgICBjdXItPmFyZ19wb3MgKyAxLCBjb252X3ByZSwgY29udl9jdHgsIGNvbnZfcG9zLCBjdHgsIGN1ci0+a3csIHdoZXJlLCBwLT5pZCk7CgkJCQljZmdlcnIrKzsKCQkJCWJyZWFrOwoJCQl9CgoJCQlmcmVlKGFyZy0+ZGF0YS5zdHIuc3RyKTsKCQkJYXJnLT5kYXRhLnN0ci5zdHIgPSBOVUxMOwoJCQlhcmctPnVucmVzb2x2ZWQgPSAwOwoJCQlhcmctPmRhdGEudXNyID0gdWw7CgkJCWJyZWFrOwoKCQljYXNlIEFSR1RfUkVHOgoJCQlpZiAoIWFyZy0+ZGF0YS5zdHIubGVuKSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogbWlzc2luZyByZWdleCBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnLlxuIiwKCQkJCSAgICAgIGN1ci0+ZmlsZSwgY3VyLT5saW5lLAoJCQkJICAgICAgY3VyLT5hcmdfcG9zICsgMSwgY29udl9wcmUsIGNvbnZfY3R4LCBjb252X3BvcywgY3R4LCBjdXItPmt3LCB3aGVyZSwgcC0+aWQpOwoJCQkJY2ZnZXJyKys7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJcmVnID0gY2FsbG9jKDEsIHNpemVvZigqcmVnKSk7CgkJCWlmICghcmVnKSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogbm90IGVub3VnaCBtZW1vcnkgdG8gYnVpbGQgcmVnZXggaW4gYXJnICVkIG9mICVzJXMlcyVzICclcycgJXMgcHJveHkgJyVzJy5cbiIsCgkJCQkgICAgICBjdXItPmZpbGUsIGN1ci0+bGluZSwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkKTsKCQkJCWNmZ2VycisrOwoJCQkJY29udGludWU7CgkJCX0KCgkJCXJmbGFncyA9IDA7CgkJCXJmbGFncyB8PSAoYXJnLT50eXBlX2ZsYWdzICYgQVJHRl9SRUdfSUNBU0UpID8gUkVHX0lDQVNFIDogMDsKCQkJZXJyID0gTlVMTDsKCgkJCWlmICghcmVnZXhfY29tcChhcmctPmRhdGEuc3RyLnN0ciwgcmVnLCAhKHJmbGFncyAmIFJFR19JQ0FTRSksIDEgLyogY2FwdHVyZSBzdWJzdHIgKi8sICZlcnIpKSB7CgkJCQlBbGVydCgicGFyc2luZyBbJXM6JWRdIDogZXJyb3IgaW4gcmVnZXggJyVzJyBpbiBhcmcgJWQgb2YgJXMlcyVzJXMgJyVzJyAlcyBwcm94eSAnJXMnIDogJXMuXG4iLAoJCQkJICAgICAgY3VyLT5maWxlLCBjdXItPmxpbmUsCgkJCQkgICAgICBhcmctPmRhdGEuc3RyLnN0ciwKCQkJCSAgICAgIGN1ci0+YXJnX3BvcyArIDEsIGNvbnZfcHJlLCBjb252X2N0eCwgY29udl9wb3MsIGN0eCwgY3VyLT5rdywgd2hlcmUsIHAtPmlkLCBlcnIpOwoJCQkJY2ZnZXJyKys7CgkJCQljb250aW51ZTsKCQkJfQoKCQkJZnJlZShhcmctPmRhdGEuc3RyLnN0cik7CgkJCWFyZy0+ZGF0YS5zdHIuc3RyID0gTlVMTDsKCQkJYXJnLT51bnJlc29sdmVkID0gMDsKCQkJYXJnLT5kYXRhLnJlZyA9IHJlZzsKCQkJYnJlYWs7CgoKCQl9CgoJCUxJU1RfREVMKCZjdXItPmxpc3QpOwoJCWZyZWUoY3VyKTsKCX0gLyogZW5kIG9mIGFyZ3MgcHJvY2Vzc2luZyAqLwoKCXJldHVybiBjZmdlcnI7Cn0KCi8qCiAqIFByb2Nlc3MgYSBmZXRjaCArIGZvcm1hdCBjb252ZXJzaW9uIGFzIGRlZmluZWQgYnkgdGhlIHNhbXBsZSBleHByZXNzaW9uCiAqIDxleHByPiBvbiByZXF1ZXN0IG9yIHJlc3BvbnNlIGNvbnNpZGVyaW5nIHRoZSA8b3B0PiBwYXJhbWV0ZXIuIFRoZSBvdXRwdXQgaXMKICogbm90IGV4cGxpY2l0bHkgc2V0IHRvIDxzbXBfdHlwZT4sIGJ1dCBzaGFsbCBiZSBjb21wYXRpYmxlIHdpdGggaXQgYXMKICogc3BlY2lmaWVkIGJ5ICdzYW1wbGVfY2FzdHMnIHRhYmxlLiBJZiBhIHN0YWJsZSBzYW1wbGUgY2FuIGJlIGZldGNoZWQsIG9yIGFuCiAqIHVuc3RhYmxlIG9uZSB3aGVuIDxvcHQ+IGNvbnRhaW5zIFNNUF9PUFRfRklOQUwsIHRoZSBzYW1wbGUgaXMgY29udmVydGVkIGFuZAogKiByZXR1cm5lZCB3aXRob3V0IHRoZSBTTVBfRl9NQVlfQ0hBTkdFIGZsYWcuIElmIGFuIHVuc3RhYmxlIHNhbXBsZSBpcyBmb3VuZAogKiBhbmQgPG9wdD4gZG9lcyBub3QgY29udGFpbiBTTVBfT1BUX0ZJTkFMLCB0aGVuIHRoZSBzYW1wbGUgaXMgcmV0dXJuZWQgYXMtaXMKICogd2l0aCBpdHMgU01QX0ZfTUFZX0NIQU5HRSBmbGFnIHNvIHRoYXQgdGhlIGNhbGxlciBjYW4gY2hlY2sgaXQgYW5kIGRlY2lkZSB0bwogKiB0YWtlIGFjdGlvbnMgKGVnOiB3YWl0IGxvbmdlcikuIElmIGEgc2FtcGxlIGNvdWxkIG5vdCBiZSBmb3VuZCBvciBjb3VsZCBub3QKICogYmUgY29udmVydGVkLCBOVUxMIGlzIHJldHVybmVkLiBUaGUgY2FsbGVyIE1VU1QgTk9UIHVzZSB0aGUgc2FtcGxlIGlmIHRoZQogKiBTTVBfRl9NQVlfQ0hBTkdFIGZsYWcgaXMgcHJlc2VudCwgYXMgaXQgaXMgdXNlZCBvbmx5IGFzIGEgaGludCB0aGF0IHRoZXJlIGlzCiAqIHN0aWxsIGhvcGUgdG8gZ2V0IGl0IGFmdGVyIHdhaXRpbmcgbG9uZ2VyLCBhbmQgaXMgbm90IGNvbnZlcnRlZCB0byBzdHJpbmcuCiAqIFRoZSBwb3NzaWJsZSBvdXRwdXQgY29tYmluYXRpb25zIGFyZSB0aGUgZm9sbG93aW5nIDoKICoKICogcmV0dXJuIE1BWV9DSEFOR0UgRklOQUwgICBNZWFuaW5nIGZvciB0aGUgc2FtcGxlCiAqICBOVUxMICAgICAgKiAgICAgICAgKiAgICAgTm90IHByZXNlbnQgYW5kIHdpbGwgbmV2ZXIgYmUgKGVnOiBoZWFkZXIpCiAqICAgc21wICAgICAgMCAgICAgICAgKiAgICAgRmluYWwgdmFsdWUgY29udmVydGVkIChlZzogaGVhZGVyKQogKiAgIHNtcCAgICAgIDEgICAgICAgIDAgICAgIE5vdCBwcmVzZW50IHlldCwgbWF5IGFwcGVhciBsYXRlciAoZWc6IGhlYWRlcikKICogICBzbXAgICAgICAxICAgICAgICAxICAgICBuZXZlciBoYXBwZW5zIChlaXRoZXIgZmxhZyBpcyBjbGVhcmVkIG9uIG91dHB1dCkKICovCnN0cnVjdCBzYW1wbGUgKnNhbXBsZV9mZXRjaF9hc190eXBlKHN0cnVjdCBwcm94eSAqcHgsIHN0cnVjdCBzZXNzaW9uICpzZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdHJlYW0gKnN0cm0sIHVuc2lnbmVkIGludCBvcHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZV9leHByICpleHByLCBpbnQgc21wX3R5cGUpCnsKCXN0cnVjdCBzYW1wbGUgKnNtcCA9ICZ0ZW1wX3NtcDsKCgltZW1zZXQoc21wLCAwLCBzaXplb2YoKnNtcCkpOwoKCWlmICghc2FtcGxlX3Byb2Nlc3MocHgsIHNlc3MsIHN0cm0sIG9wdCwgZXhwciwgc21wKSkgewoJCWlmICgoc21wLT5mbGFncyAmIFNNUF9GX01BWV9DSEFOR0UpICYmICEob3B0ICYgU01QX09QVF9GSU5BTCkpCgkJCXJldHVybiBzbXA7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJaWYgKCFzYW1wbGVfY2FzdHNbc21wLT50eXBlXVtzbXBfdHlwZV0pCgkJcmV0dXJuIE5VTEw7CgoJaWYgKCFzYW1wbGVfY2FzdHNbc21wLT50eXBlXVtzbXBfdHlwZV0oc21wKSkKCQlyZXR1cm4gTlVMTDsKCglzbXAtPmZsYWdzICY9IH5TTVBfRl9NQVlfQ0hBTkdFOwoJcmV0dXJuIHNtcDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICBTYW1wbGUgZm9ybWF0IGNvbnZlcnQgZnVuY3Rpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIFRoZXNlIGZ1bmN0aW9ucyBzZXQgdGhlIGRhdGEgdHlwZSBvbiByZXR1cm4uICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmZGVmIERFQlVHX0VYUFIKc3RhdGljIGludCBzYW1wbGVfY29udl9kZWJ1Zyhjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglpbnQgaTsKCXN0cnVjdCBzYW1wbGUgdG1wOwoKCWlmICghKGdsb2JhbC5tb2RlICYgTU9ERV9RVUlFVCkgfHwgKGdsb2JhbC5tb2RlICYgKE1PREVfVkVSQk9TRSB8IE1PREVfU1RBUlRJTkcpKSkgewoJCWZwcmludGYoc3RkZXJyLCAiW2RlYnVnIGNvbnZlcnRlcl0gdHlwZTogJXMgIiwgc21wX3RvX3R5cGVbc21wLT50eXBlXSk7CgkJaWYgKCFzYW1wbGVfY2FzdHNbc21wLT50eXBlXVtTTVBfVF9TVFJdKSB7CgkJCWZwcmludGYoc3RkZXJyLCAiKHVuZGlzcGxheWFibGUpIik7CgkJfSBlbHNlIHsKCgkJCS8qIENvcHkgc2FtcGxlIGZldGNoLiBUaGlzIHB1dCB0aGUgc2FtcGxlIGFzIGNvbnN0LCB0aGUKCQkJICogY2FzdCB3aWxsIGNvcHkgZGF0YSBpZiBhIHRyYW5zZm9ybWF0aW9uIGlzIHJlcXVpcmVkLgoJCQkgKi8KCQkJbWVtY3B5KCZ0bXAsIHNtcCwgc2l6ZW9mKHN0cnVjdCBzYW1wbGUpKTsKCQkJdG1wLmZsYWdzID0gU01QX0ZfQ09OU1Q7CgoJCQlpZiAoIXNhbXBsZV9jYXN0c1tzbXAtPnR5cGVdW1NNUF9UX1NUUl0oJnRtcCkpCgkJCQlmcHJpbnRmKHN0ZGVyciwgIih1bmRpc3BsYXlhYmxlKSIpOwoKCQkJZWxzZSB7CgkJCQkvKiBEaXNwbGF5IHRoZSBkaXNwbGF5YWJsZSBjaGFycyouICovCgkJCQlmcHJpbnRmKHN0ZGVyciwgIjwiKTsKCQkJCWZvciAoaSA9IDA7IGkgPCB0bXAuZGF0YS5zdHIubGVuOyBpKyspIHsKCQkJCQlpZiAoaXNwcmludCh0bXAuZGF0YS5zdHIuc3RyW2ldKSkKCQkJCQkJZnB1dGModG1wLmRhdGEuc3RyLnN0cltpXSwgc3RkZXJyKTsKCQkJCQllbHNlCgkJCQkJCWZwdXRjKCcuJywgc3RkZXJyKTsKCQkJCX0KCQkJfQoJCQlmcHJpbnRmKHN0ZGVyciwgIj5cbiIpOwoJCX0KCX0KCXJldHVybiAxOwp9CiNlbmRpZgoKc3RhdGljIGludCBzYW1wbGVfY29udl9iaW4yYmFzZTY0KGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCWludCBiNjRfbGVuOwoKCXRyYXNoLT5sZW4gPSAwOwoJYjY0X2xlbiA9IGEyYmFzZTY0KHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbiwgdHJhc2gtPnN0ciwgdHJhc2gtPnNpemUpOwoJaWYgKGI2NF9sZW4gPCAwKQoJCXJldHVybiAwOwoKCXRyYXNoLT5sZW4gPSBiNjRfbGVuOwoJc21wLT5kYXRhLnN0ciA9ICp0cmFzaDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYmluMmhleChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzdHJ1Y3QgY2h1bmsgKnRyYXNoID0gZ2V0X3RyYXNoX2NodW5rKCk7Cgl1bnNpZ25lZCBjaGFyIGM7CglpbnQgcHRyID0gMDsKCgl0cmFzaC0+bGVuID0gMDsKCXdoaWxlIChwdHIgPCBzbXAtPmRhdGEuc3RyLmxlbiAmJiB0cmFzaC0+bGVuIDw9IHRyYXNoLT5zaXplIC0gMikgewoJCWMgPSBzbXAtPmRhdGEuc3RyLnN0cltwdHIrK107CgkJdHJhc2gtPnN0clt0cmFzaC0+bGVuKytdID0gaGV4dGFiWyhjID4+IDQpICYgMHhGXTsKCQl0cmFzaC0+c3RyW3RyYXNoLT5sZW4rK10gPSBoZXh0YWJbYyAmIDB4Rl07Cgl9CglzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5mbGFncyAmPSB+U01QX0ZfQ09OU1Q7CglyZXR1cm4gMTsKfQoKLyogaGFzaGVzIHRoZSBiaW5hcnkgaW5wdXQgaW50byBhIDMyLWJpdCB1bnNpZ25lZCBpbnQgKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9kamIyKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gaGFzaF9kamIyKHNtcC0+ZGF0YS5zdHIuc3RyLCBzbXAtPmRhdGEuc3RyLmxlbik7CglpZiAoYXJnX3AgJiYgYXJnX3AtPmRhdGEudWludCkKCQlzbXAtPmRhdGEudWludCA9IGZ1bGxfaGFzaChzbXAtPmRhdGEudWludCk7CglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfc3RyMmxvd2VyKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCWludCBpOwoKCWlmICghc21wX2R1cChzbXApKQoJCXJldHVybiAwOwoKCWlmICghc21wLT5kYXRhLnN0ci5zaXplKQoJCXJldHVybiAwOwoKCWZvciAoaSA9IDA7IGkgPCBzbXAtPmRhdGEuc3RyLmxlbjsgaSsrKSB7CgkJaWYgKChzbXAtPmRhdGEuc3RyLnN0cltpXSA+PSAnQScpICYmIChzbXAtPmRhdGEuc3RyLnN0cltpXSA8PSAnWicpKQoJCQlzbXAtPmRhdGEuc3RyLnN0cltpXSArPSAnYScgLSAnQSc7Cgl9CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzYW1wbGVfY29udl9zdHIydXBwZXIoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJaW50IGk7CgoJaWYgKCFzbXBfZHVwKHNtcCkpCgkJcmV0dXJuIDA7CgoJaWYgKCFzbXAtPmRhdGEuc3RyLnNpemUpCgkJcmV0dXJuIDA7CgoJZm9yIChpID0gMDsgaSA8IHNtcC0+ZGF0YS5zdHIubGVuOyBpKyspIHsKCQlpZiAoKHNtcC0+ZGF0YS5zdHIuc3RyW2ldID49ICdhJykgJiYgKHNtcC0+ZGF0YS5zdHIuc3RyW2ldIDw9ICd6JykpCgkJCXNtcC0+ZGF0YS5zdHIuc3RyW2ldICs9ICdBJyAtICdhJzsKCX0KCXJldHVybiAxOwp9CgovKiB0YWtlcyB0aGUgbmV0bWFzayBpbiBhcmdfcCAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2lwbWFzayhjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEuaXB2NC5zX2FkZHIgJj0gYXJnX3AtPmRhdGEuaXB2NC5zX2FkZHI7CglzbXAtPnR5cGUgPSBTTVBfVF9JUFY0OwoJcmV0dXJuIDE7Cn0KCi8qIHRha2VzIGFuIFVJTlQgdmFsdWUgb24gaW5wdXQgc3VwcG9zZWQgdG8gcmVwcmVzZW50IHRoZSB0aW1lIHNpbmNlIEVQT0NILAogKiBhZGRzIGFuIG9wdGlvbmFsIG9mZnNldCBmb3VuZCBpbiBhcmdzWzFdIGFuZCBlbWl0cyBhIHN0cmluZyByZXByZXNlbnRpbmcKICogdGhlIGxvY2FsIHRpbWUgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgaW4gYXJnc1sxXSB1c2luZyBzdHJmdGltZSgpLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9sdGltZShjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXN0cnVjdCBjaHVuayAqdGVtcDsKCXRpbWVfdCBjdXJyX2RhdGUgPSBzbXAtPmRhdGEudWludDsKCXN0cnVjdCB0bSAqdG07CgoJLyogYWRkIG9mZnNldCAqLwoJaWYgKGFyZ3NbMV0udHlwZSA9PSBBUkdUX1NJTlQgfHwgYXJnc1sxXS50eXBlID09IEFSR1RfVUlOVCkKCQljdXJyX2RhdGUgKz0gYXJnc1sxXS5kYXRhLnNpbnQ7CgoJdG0gPSBsb2NhbHRpbWUoJmN1cnJfZGF0ZSk7CglpZiAoIXRtKQoJCXJldHVybiAwOwoJdGVtcCA9IGdldF90cmFzaF9jaHVuaygpOwoJdGVtcC0+bGVuID0gc3RyZnRpbWUodGVtcC0+c3RyLCB0ZW1wLT5zaXplLCBhcmdzWzBdLmRhdGEuc3RyLnN0ciwgdG0pOwoJc21wLT5kYXRhLnN0ciA9ICp0ZW1wOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJcmV0dXJuIDE7Cn0KCi8qIGhhc2hlcyB0aGUgYmluYXJ5IGlucHV0IGludG8gYSAzMi1iaXQgdW5zaWduZWQgaW50ICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfc2RibShjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IGhhc2hfc2RibShzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4pOwoJaWYgKGFyZ19wICYmIGFyZ19wLT5kYXRhLnVpbnQpCgkJc21wLT5kYXRhLnVpbnQgPSBmdWxsX2hhc2goc21wLT5kYXRhLnVpbnQpOwoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXJldHVybiAxOwp9CgovKiB0YWtlcyBhbiBVSU5UIHZhbHVlIG9uIGlucHV0IHN1cHBvc2VkIHRvIHJlcHJlc2VudCB0aGUgdGltZSBzaW5jZSBFUE9DSCwKICogYWRkcyBhbiBvcHRpb25hbCBvZmZzZXQgZm91bmQgaW4gYXJnc1sxXSBhbmQgZW1pdHMgYSBzdHJpbmcgcmVwcmVzZW50aW5nCiAqIHRoZSBVVEMgZGF0ZSBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBpbiBhcmdzWzFdIHVzaW5nIHN0cmZ0aW1lKCkuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X3V0aW1lKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc3RydWN0IGNodW5rICp0ZW1wOwoJdGltZV90IGN1cnJfZGF0ZSA9IHNtcC0+ZGF0YS51aW50OwoJc3RydWN0IHRtICp0bTsKCgkvKiBhZGQgb2Zmc2V0ICovCglpZiAoYXJnc1sxXS50eXBlID09IEFSR1RfU0lOVCB8fCBhcmdzWzFdLnR5cGUgPT0gQVJHVF9VSU5UKQoJCWN1cnJfZGF0ZSArPSBhcmdzWzFdLmRhdGEuc2ludDsKCgl0bSA9IGdtdGltZSgmY3Vycl9kYXRlKTsKCWlmICghdG0pCgkJcmV0dXJuIDA7Cgl0ZW1wID0gZ2V0X3RyYXNoX2NodW5rKCk7Cgl0ZW1wLT5sZW4gPSBzdHJmdGltZSh0ZW1wLT5zdHIsIHRlbXAtPnNpemUsIGFyZ3NbMF0uZGF0YS5zdHIuc3RyLCB0bSk7CglzbXAtPmRhdGEuc3RyID0gKnRlbXA7CglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CglyZXR1cm4gMTsKfQoKLyogaGFzaGVzIHRoZSBiaW5hcnkgaW5wdXQgaW50byBhIDMyLWJpdCB1bnNpZ25lZCBpbnQgKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl93dDYoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSBoYXNoX3d0NihzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4pOwoJaWYgKGFyZ19wICYmIGFyZ19wLT5kYXRhLnVpbnQpCgkJc21wLT5kYXRhLnVpbnQgPSBmdWxsX2hhc2goc21wLT5kYXRhLnVpbnQpOwoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXJldHVybiAxOwp9CgovKiBoYXNoZXMgdGhlIGJpbmFyeSBpbnB1dCBpbnRvIGEgMzItYml0IHVuc2lnbmVkIGludCAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2NyYzMyKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gaGFzaF9jcmMzMihzbXAtPmRhdGEuc3RyLnN0ciwgc21wLT5kYXRhLnN0ci5sZW4pOwoJaWYgKGFyZ19wICYmIGFyZ19wLT5kYXRhLnVpbnQpCgkJc21wLT5kYXRhLnVpbnQgPSBmdWxsX2hhc2goc21wLT5kYXRhLnVpbnQpOwoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXJldHVybiAxOwp9CgovKiBUaGlzIGZ1bmN0aW9uIGVzY2FwZSBzcGVjaWFsIGpzb24gY2hhcmFjdGVycy4gVGhlIHJldHVybmVkIHN0cmluZyBjYW4gYmUKICogc2FmZWx5IHNldCBiZXR3ZWVuIHR3byAnIicgYW5kIHVzZWQgYXMganNvbiBzdHJpbmcuIFRoZSBqc29uIHN0cmluZyBpcwogKiBkZWZpbmVkIGxpa2UgdGhpczoKICoKICogICAgYW55IFVuaWNvZGUgY2hhcmFjdGVyIGV4Y2VwdCAnIicgb3IgJ1wnIG9yIGNvbnRyb2wgY2hhcmFjdGVyCiAqICAgIFwiLCBcXCwgXC8sIFxiLCBcZiwgXG4sIFxyLCBcdCwgXHUgKyBmb3VyLWhleC1kaWdpdHMKICoKICogVGhlIGVudW0gaW5wdXRfdHlwZSBjb250YWluIGFsbCB0aGUgYWxsb3dlZCBtb2RlIGZvciBkZWNvZGluZyB0aGUgaW5wdXQKICogc3RyaW5nLgogKi8KZW51bSBpbnB1dF90eXBlIHsKCUlUX0FTQ0lJID0gMCwKCUlUX1VURjgsCglJVF9VVEY4UywKCUlUX1VURjhQLAoJSVRfVVRGOFBTLAp9OwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2pzb25fY2hlY2soc3RydWN0IGFyZyAqYXJnLCBzdHJ1Y3Qgc2FtcGxlX2NvbnYgKmNvbnYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqKmVycikKewoJaWYgKCFhcmcpIHsKCQltZW1wcmludGYoZXJyLCAiVW5leHBlY3RlZCBlbXB0eSBhcmcgbGlzdCIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChhcmctPnR5cGUgIT0gQVJHVF9TVFIpIHsKCQltZW1wcmludGYoZXJyLCAiVW5leHBlY3RlZCBhcmcgdHlwZSIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChzdHJjbXAoYXJnLT5kYXRhLnN0ci5zdHIsICIiKSA9PSAwKSB7CgkJYXJnLT50eXBlID0gQVJHVF9VSU5UOwoJCWFyZy0+ZGF0YS51aW50ID0gSVRfQVNDSUk7CgkJcmV0dXJuIDE7Cgl9CgoJZWxzZSBpZiAoc3RyY21wKGFyZy0+ZGF0YS5zdHIuc3RyLCAiYXNjaWkiKSA9PSAwKSB7CgkJYXJnLT50eXBlID0gQVJHVF9VSU5UOwoJCWFyZy0+ZGF0YS51aW50ID0gSVRfQVNDSUk7CgkJcmV0dXJuIDE7Cgl9CgoJZWxzZSBpZiAoc3RyY21wKGFyZy0+ZGF0YS5zdHIuc3RyLCAidXRmOCIpID09IDApIHsKCQlhcmctPnR5cGUgPSBBUkdUX1VJTlQ7CgkJYXJnLT5kYXRhLnVpbnQgPSBJVF9VVEY4OwoJCXJldHVybiAxOwoJfQoKCWVsc2UgaWYgKHN0cmNtcChhcmctPmRhdGEuc3RyLnN0ciwgInV0ZjhzIikgPT0gMCkgewoJCWFyZy0+dHlwZSA9IEFSR1RfVUlOVDsKCQlhcmctPmRhdGEudWludCA9IElUX1VURjhTOwoJCXJldHVybiAxOwoJfQoKCWVsc2UgaWYgKHN0cmNtcChhcmctPmRhdGEuc3RyLnN0ciwgInV0ZjhwIikgPT0gMCkgewoJCWFyZy0+dHlwZSA9IEFSR1RfVUlOVDsKCQlhcmctPmRhdGEudWludCA9IElUX1VURjhQOwoJCXJldHVybiAxOwoJfQoKCWVsc2UgaWYgKHN0cmNtcChhcmctPmRhdGEuc3RyLnN0ciwgInV0ZjhwcyIpID09IDApIHsKCQlhcmctPnR5cGUgPSBBUkdUX1VJTlQ7CgkJYXJnLT5kYXRhLnVpbnQgPSBJVF9VVEY4UFM7CgkJcmV0dXJuIDE7Cgl9CgoJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgaW5wdXQgY29kZSB0eXBlIGF0IGZpbGUgJyVzJywgbGluZSAlZC4gIgoJICAgICAgICAgICAgICAgIkFsbG93ZWQgdmFsdWUgYXJlICdhc2NpaScsICd1dGY4JywgJ3V0ZjhwJyBhbmQgJ3V0ZjhwcCciLCBmaWxlLCBsaW5lKTsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IHNhbXBsZV9jb252X2pzb24oY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc3RydWN0IGNodW5rICp0ZW1wOwoJY2hhciBfc3RyWzddOyAvKiBcdSArIDQgaGV4IGRpZ2l0ICsgbnVsbCBjaGFyIGZvciBzcHJpbnRmLiAqLwoJY29uc3QgY2hhciAqc3RyOwoJaW50IGxlbjsKCWVudW0gaW5wdXRfdHlwZSBpbnB1dF90eXBlID0gSVRfQVNDSUk7Cgl1bnNpZ25lZCBpbnQgYzsKCXVuc2lnbmVkIGludCByZXQ7CgljaGFyICpwOwoKCWlmIChhcmdfcCkKCQlpbnB1dF90eXBlID0gYXJnX3AtPmRhdGEudWludDsKCgl0ZW1wID0gZ2V0X3RyYXNoX2NodW5rKCk7Cgl0ZW1wLT5sZW4gPSAwOwoKCXAgPSBzbXAtPmRhdGEuc3RyLnN0cjsKCXdoaWxlIChwIDwgc21wLT5kYXRhLnN0ci5zdHIgKyBzbXAtPmRhdGEuc3RyLmxlbikgewoKCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9BU0NJSSkgewoJCQkvKiBSZWFkIGlucHV0IGFzIEFTQ0lJLiAqLwoJCQljID0gKih1bnNpZ25lZCBjaGFyICopcDsKCQkJcCsrOwoJCX0KCQllbHNlIHsKCQkJLyogUmVhZCBpbnB1dCBhcyBVVEY4LiAqLwoJCQlyZXQgPSB1dGY4X25leHQocCwgc21wLT5kYXRhLnN0ci5sZW4gLSAoIHAgLSBzbXAtPmRhdGEuc3RyLnN0ciApLCAmYyk7CgkJCXAgKz0gdXRmOF9yZXR1cm5fbGVuZ3RoKHJldCk7CgoJCQlpZiAoaW5wdXRfdHlwZSA9PSBJVF9VVEY4ICYmIHV0ZjhfcmV0dXJuX2NvZGUocmV0KSAhPSBVVEY4X0NPREVfT0spCgkJCQkJcmV0dXJuIDA7CgkJCWlmIChpbnB1dF90eXBlID09IElUX1VURjhTICYmIHV0ZjhfcmV0dXJuX2NvZGUocmV0KSAhPSBVVEY4X0NPREVfT0spCgkJCQkJY29udGludWU7CgkJCWlmIChpbnB1dF90eXBlID09IElUX1VURjhQICYmIHV0ZjhfcmV0dXJuX2NvZGUocmV0KSAmIChVVEY4X0NPREVfSU5WUkFOR0V8VVRGOF9DT0RFX0JBRFNFUSkpCgkJCQkJcmV0dXJuIDA7CgkJCWlmIChpbnB1dF90eXBlID09IElUX1VURjhQUyAmJiB1dGY4X3JldHVybl9jb2RlKHJldCkgJiAoVVRGOF9DT0RFX0lOVlJBTkdFfFVURjhfQ09ERV9CQURTRVEpKQoJCQkJCWNvbnRpbnVlOwoKCQkJLyogQ2hlY2sgdG9vIGJpZyB2YWx1ZXMuICovCgkJCWlmICgodW5zaWduZWQgaW50KWMgPiAweGZmZmYpIHsKCQkJCWlmIChpbnB1dF90eXBlID09IElUX1VURjggfHwgaW5wdXRfdHlwZSA9PSBJVF9VVEY4UCkKCQkJCQlyZXR1cm4gMDsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJfQoKCQkvKiBDb252ZXJ0IGNoYXJhY3Rlci4gKi8KCQlpZiAoYyA9PSAnIicpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcXCIiOwoJCX0KCQllbHNlIGlmIChjID09ICdcXCcpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcXFwiOwoJCX0KCQllbHNlIGlmIChjID09ICcvJykgewoJCQlsZW4gPSAyOwoJCQlzdHIgPSAiXFwvIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnXGInKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXGIiOwoJCX0KCQllbHNlIGlmIChjID09ICdcZicpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcZiI7CgkJfQoJCWVsc2UgaWYgKGMgPT0gJ1xyJykgewoJCQlsZW4gPSAyOwoJCQlzdHIgPSAiXFxyIjsKCQl9CgkJZWxzZSBpZiAoYyA9PSAnXG4nKSB7CgkJCWxlbiA9IDI7CgkJCXN0ciA9ICJcXG4iOwoJCX0KCQllbHNlIGlmIChjID09ICdcdCcpIHsKCQkJbGVuID0gMjsKCQkJc3RyID0gIlxcdCI7CgkJfQoJCWVsc2UgaWYgKGMgPiAweGZmIHx8ICFpc3ByaW50KGMpKSB7CgkJCS8qIGlzcHJpbnQgZ2VuZXJhdGUgYSBzZWdmYXVsdCBpZiBjIGlzIHRvbyBiaWcuIFRoZSBtYW4gc2F5cyB0aGF0CgkJCSAqIGMgbXVzdCBoYXZlIHRoZSB2YWx1ZSBvZiBhbiB1bnNpZ25lZCBjaGFyIG9yIEVPRi4KCQkJICovCgkJCWxlbiA9IDY7CgkJCV9zdHJbMF0gPSAnXFwnOwoJCQlfc3RyWzFdID0gJ3UnOwoJCQlzbnByaW50ZigmX3N0clsyXSwgNSwgIiUwNHgiLCAodW5zaWduZWQgc2hvcnQpYyk7CgkJCXN0ciA9IF9zdHI7CgkJfQoJCWVsc2UgewoJCQlsZW4gPSAxOwoJCQlzdHIgPSAoY2hhciAqKSZjOwoJCX0KCgkJLyogQ2hlY2sgbGVuZ3RoICovCgkJaWYgKHRlbXAtPmxlbiArIGxlbiA+IHRlbXAtPnNpemUpCgkJCXJldHVybiAwOwoKCQkvKiBDb3B5IHN0cmluZy4gKi8KCQltZW1jcHkodGVtcC0+c3RyICsgdGVtcC0+bGVuLCBzdHIsIGxlbik7CgkJdGVtcC0+bGVuICs9IGxlbjsKCX0KCglzbXAtPmZsYWdzICY9IH5TTVBfRl9DT05TVDsKCXNtcC0+ZGF0YS5zdHIgPSAqdGVtcDsKCXNtcC0+dHlwZSA9IFNNUF9UX1NUUjsKCglyZXR1cm4gMTsKfQoKLyogVGhpcyBzYW1wbGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZXh0cmFjdCBzb21lIGJ5dGVzIGZyb20gYW4gaW5wdXQgYnVmZmVyLgogKiBGaXJzdCBhcmcgaXMgdGhlIG9mZnNldC4KICogT3B0aW9uYWwgc2Vjb25kIGFyZyBpcyB0aGUgbGVuZ3RoIHRvIHRydW5jYXRlICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYnl0ZXMoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJaWYgKHNtcC0+ZGF0YS5zdHIubGVuIDw9IGFyZ19wWzBdLmRhdGEudWludCkgewoJCXNtcC0+ZGF0YS5zdHIubGVuID0gMDsKCQlyZXR1cm4gMTsKCX0KCglpZiAoc21wLT5kYXRhLnN0ci5zaXplKQoJCQlzbXAtPmRhdGEuc3RyLnNpemUgLT0gYXJnX3BbMF0uZGF0YS51aW50OwoJc21wLT5kYXRhLnN0ci5sZW4gLT0gYXJnX3BbMF0uZGF0YS51aW50OwoJc21wLT5kYXRhLnN0ci5zdHIgKz0gYXJnX3BbMF0uZGF0YS51aW50OwoKCWlmICgoYXJnX3BbMV0udHlwZSA9PSBBUkdUX1VJTlQpICYmIChhcmdfcFsxXS5kYXRhLnVpbnQgPCBzbXAtPmRhdGEuc3RyLmxlbikpCgkJc21wLT5kYXRhLnN0ci5sZW4gPSBhcmdfcFsxXS5kYXRhLnVpbnQ7CgoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfZmllbGRfY2hlY2soc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZV9jb252ICpjb252LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNoYXIgKiplcnIpCnsKCXN0cnVjdCBhcmcgKmFyZyA9IGFyZ3M7CgoJaWYgKCFhcmcpIHsKCQltZW1wcmludGYoZXJyLCAiVW5leHBlY3RlZCBlbXB0eSBhcmcgbGlzdCIpOwoJCXJldHVybiAwOwoJfQoKCWlmIChhcmctPnR5cGUgIT0gQVJHVF9VSU5UKSB7CgkJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgYXJnIHR5cGUiKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoIWFyZy0+ZGF0YS51aW50KSB7CgkJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgdmFsdWUgMCBmb3IgaW5kZXgiKTsKCQlyZXR1cm4gMDsKCX0KCglhcmcrKzsKCglpZiAoYXJnLT50eXBlICE9IEFSR1RfU1RSKSB7CgkJbWVtcHJpbnRmKGVyciwgIlVuZXhwZWN0ZWQgYXJnIHR5cGUiKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAoIWFyZy0+ZGF0YS5zdHIubGVuKSB7CgkJbWVtcHJpbnRmKGVyciwgIkVtcHR5IHNlcGFyYXRvcnMgbGlzdCIpOwoJCXJldHVybiAwOwoJfQoKCXJldHVybiAxOwp9CgovKiBUaGlzIHNhbXBsZSBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBhIHJldHVybiBzZWxlY3RlZCBwYXJ0IG9mIGEgc3RyaW5nIChmaWVsZCkuCiAqIEZpcnN0IGFyZyBpcyB0aGUgaW5kZXggb2YgdGhlIGZpZWxkIChzdGFydCBhdCAxKQogKiBTZWNvbmQgYXJnIGlzIGEgY2hhciBsaXN0IG9mIHNlcGFyYXRvcnMgKHR5cGUgc3RyaW5nKQogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9maWVsZChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7Cgl1bnNpZ25lZCBpbnQgZmllbGQ7CgljaGFyICpzdGFydCwgKmVuZDsKCWludCBpOwoKCWlmICghYXJnX3BbMF0uZGF0YS51aW50KQoJCXJldHVybiAwOwoKCWZpZWxkID0gMTsKCWVuZCA9IHN0YXJ0ID0gc21wLT5kYXRhLnN0ci5zdHI7Cgl3aGlsZSAoZW5kIC0gc21wLT5kYXRhLnN0ci5zdHIgPCBzbXAtPmRhdGEuc3RyLmxlbikgewoKCQlmb3IgKGkgPSAwIDsgaSA8IGFyZ19wWzFdLmRhdGEuc3RyLmxlbiA7IGkrKykgewoJCQlpZiAoKmVuZCA9PSBhcmdfcFsxXS5kYXRhLnN0ci5zdHJbaV0pIHsKCQkJCWlmIChmaWVsZCA9PSBhcmdfcFswXS5kYXRhLnVpbnQpCgkJCQkJZ290byBmb3VuZDsKCQkJCXN0YXJ0ID0gZW5kKzE7CgkJCQlmaWVsZCsrOwoJCQkJYnJlYWs7CgkJCX0KCQl9CgkJZW5kKys7Cgl9CgoJLyogRmllbGQgbm90IGZvdW5kICovCglpZiAoZmllbGQgIT0gYXJnX3BbMF0uZGF0YS51aW50KSB7CgkJc21wLT5kYXRhLnN0ci5sZW4gPSAwOwoJCXJldHVybiAxOwoJfQpmb3VuZDoKCXNtcC0+ZGF0YS5zdHIubGVuID0gZW5kIC0gc3RhcnQ7CgkvKiBJZiByZXQgc3RyaW5nIGlzIGxlbiAwLCBubyBuZWVkIHRvCiAgICAgICAgICAgY2hhbmdlIHBvaW50ZXJzIG9yIHRvIHVwZGF0ZSBzaXplICovCglpZiAoIXNtcC0+ZGF0YS5zdHIubGVuKQoJCXJldHVybiAxOwoKCXNtcC0+ZGF0YS5zdHIuc3RyID0gc3RhcnQ7CgoJLyogQ29tcHV0ZSByZW1haW5pbmcgc2l6ZSBpZiBuZWVkZWQKICAgICAgICAgICBOb3RlOiBzbXAtPmRhdGEuc3RyLnNpemUgY2Fubm90IGJlIHNldCB0byAwICovCglpZiAoc21wLT5kYXRhLnN0ci5zaXplKQoJCXNtcC0+ZGF0YS5zdHIuc2l6ZSAtPSBzdGFydCAtIHNtcC0+ZGF0YS5zdHIuc3RyOwoKCXJldHVybiAxOwp9CgovKiBUaGlzIHNhbXBsZSBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byByZXR1cm4gYSB3b3JkIGZyb20gYSBzdHJpbmcuCiAqIEZpcnN0IGFyZyBpcyB0aGUgaW5kZXggb2YgdGhlIHdvcmQgKHN0YXJ0IGF0IDEpCiAqIFNlY29uZCBhcmcgaXMgYSBjaGFyIGxpc3Qgb2Ygd29yZHMgc2VwYXJhdG9ycyAodHlwZSBzdHJpbmcpCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X3dvcmQoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJdW5zaWduZWQgaW50IHdvcmQ7CgljaGFyICpzdGFydCwgKmVuZDsKCWludCBpLCBpc3NlcCwgaW53b3JkOwoKCWlmICghYXJnX3BbMF0uZGF0YS51aW50KQoJCXJldHVybiAwOwoKCXdvcmQgPSAwOwoJaW53b3JkID0gMDsKCWVuZCA9IHN0YXJ0ID0gc21wLT5kYXRhLnN0ci5zdHI7Cgl3aGlsZSAoZW5kIC0gc21wLT5kYXRhLnN0ci5zdHIgPCBzbXAtPmRhdGEuc3RyLmxlbikgewoJCWlzc2VwID0gMDsKCQlmb3IgKGkgPSAwIDsgaSA8IGFyZ19wWzFdLmRhdGEuc3RyLmxlbiA7IGkrKykgewoJCQlpZiAoKmVuZCA9PSBhcmdfcFsxXS5kYXRhLnN0ci5zdHJbaV0pIHsKCQkJCWlzc2VwID0gMTsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJCWlmICghaW53b3JkKSB7CgkJCWlmICghaXNzZXApIHsKCQkJCXdvcmQrKzsKCQkJCXN0YXJ0ID0gZW5kOwoJCQkJaW53b3JkID0gMTsKCQkJfQoJCX0KCQllbHNlIGlmIChpc3NlcCkgewoJCQlpZiAod29yZCA9PSBhcmdfcFswXS5kYXRhLnVpbnQpCgkJCQlnb3RvIGZvdW5kOwoJCQlpbndvcmQgPSAwOwoJCX0KCQllbmQrKzsKCX0KCgkvKiBGaWVsZCBub3QgZm91bmQgKi8KCWlmICh3b3JkICE9IGFyZ19wWzBdLmRhdGEudWludCkgewoJCXNtcC0+ZGF0YS5zdHIubGVuID0gMDsKCQlyZXR1cm4gMTsKCX0KZm91bmQ6CglzbXAtPmRhdGEuc3RyLmxlbiA9IGVuZCAtIHN0YXJ0OwoJLyogSWYgcmV0IHN0cmluZyBpcyBsZW4gMCwgbm8gbmVlZCB0bwogICAgICAgICAgIGNoYW5nZSBwb2ludGVycyBvciB0byB1cGRhdGUgc2l6ZSAqLwoJaWYgKCFzbXAtPmRhdGEuc3RyLmxlbikKCQlyZXR1cm4gMTsKCglzbXAtPmRhdGEuc3RyLnN0ciA9IHN0YXJ0OwoKCS8qIENvbXB1dGUgcmVtYWluaW5nIHNpemUgaWYgbmVlZGVkCiAgICAgICAgICAgTm90ZTogc21wLT5kYXRhLnN0ci5zaXplIGNhbm5vdCBiZSBzZXQgdG8gMCAqLwoJaWYgKHNtcC0+ZGF0YS5zdHIuc2l6ZSkKCQlzbXAtPmRhdGEuc3RyLnNpemUgLT0gc3RhcnQgLSBzbXAtPmRhdGEuc3RyLnN0cjsKCglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzYW1wbGVfY29udl9yZWdzdWJfY2hlY2soc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZV9jb252ICpjb252LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSwgY2hhciAqKmVycikKewoJc3RydWN0IGFyZyAqYXJnID0gYXJnczsKCWNoYXIgKnA7CglpbnQgbGVuOwoKCS8qIGFyZzAgaXMgYSByZWdleCwgaXQgdXNlcyB0eXBlX2ZsYWcgZm9yIElDQVNFIGFuZCBnbG9iYWwgbWF0Y2ggKi8KCWFyZ1swXS50eXBlX2ZsYWdzID0gMDsKCglpZiAoYXJnWzJdLnR5cGUgIT0gQVJHVF9TVFIpCgkJcmV0dXJuIDE7CgoJcCA9IGFyZ1syXS5kYXRhLnN0ci5zdHI7CglsZW4gPSBhcmdbMl0uZGF0YS5zdHIubGVuOwoJd2hpbGUgKGxlbikgewoJCWlmICgqcCA9PSAnaScpIHsKCQkJYXJnWzBdLnR5cGVfZmxhZ3MgfD0gQVJHRl9SRUdfSUNBU0U7CgkJfQoJCWVsc2UgaWYgKCpwID09ICdnJykgewoJCQlhcmdbMF0udHlwZV9mbGFncyB8PSBBUkdGX1JFR19HTE9COwoJCX0KCQllbHNlIHsKCQkJbWVtcHJpbnRmKGVyciwgImludmFsaWQgcmVnZXggZmxhZyAnJWMnLCBvbmx5ICdpJyBhbmQgJ2cnIGFyZSBzdXBwb3J0ZWQiLCAqcCk7CgkJCXJldHVybiAwOwoJCX0KCQlwKys7CgkJbGVuLS07Cgl9CglyZXR1cm4gMTsKfQoKLyogVGhpcyBzYW1wbGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZG8gdGhlIGVxdWl2YWxlbnQgb2Ygcy9tYXRjaC9yZXBsYWNlLyBvbgogKiB0aGUgaW5wdXQgc3RyaW5nLiBJdCBhcHBsaWVzIGEgcmVnZXggYW5kIHJlc3RhcnRzIGZyb20gdGhlIGxhc3QgbWF0Y2hlZAogKiBsb2NhdGlvbiB1bnRpbCBub3RoaW5nIG1hdGNoZXMgYW55bW9yZS4gRmlyc3QgYXJnIGlzIHRoZSByZWdleCB0byBhcHBseSB0bwogKiB0aGUgaW5wdXQgc3RyaW5nLCBzZWNvbmQgYXJnIGlzIHRoZSByZXBsYWNlbWVudCBleHByZXNzaW9uLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9yZWdzdWIoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJY2hhciAqc3RhcnQsICplbmQ7CglzdHJ1Y3QgbXlfcmVnZXggKnJlZyA9IGFyZ19wWzBdLmRhdGEucmVnOwoJcmVnbWF0Y2hfdCBwbWF0Y2hbTUFYX01BVENIXTsKCXN0cnVjdCBjaHVuayAqdHJhc2ggPSBnZXRfdHJhc2hfY2h1bmsoKTsKCWludCBmbGFnLCBtYXg7CglpbnQgZm91bmQ7CgoJc3RhcnQgPSBzbXAtPmRhdGEuc3RyLnN0cjsKCWVuZCA9IHN0YXJ0ICsgc21wLT5kYXRhLnN0ci5sZW47CgoJZmxhZyA9IDA7Cgl3aGlsZSAoMSkgewoJCS8qIGNoZWNrIGZvciBsYXN0IHJvdW5kIHdoaWNoIGlzIHVzZWQgdG8gY29weSByZW1haW5pbmcgcGFydHMKCQkgKiB3aGVuIG5vdCBydW5uaW5nIGluIGdsb2JhbCByZXBsYWNlbWVudCBtb2RlLgoJCSAqLwoJCWZvdW5kID0gMDsKCQlpZiAoKGFyZ19wWzBdLnR5cGVfZmxhZ3MgJiBBUkdGX1JFR19HTE9CKSB8fCAhKGZsYWcgJiBSRUdfTk9UQk9MKSkgewoJCQkvKiBOb3RlOiB3ZSBjYW4gaGF2ZSBzdGFydCA9PSBlbmQgb24gZW1wdHkgc3RyaW5ncyBvciBhdCB0aGUgZW5kICovCgkJCWZvdW5kID0gcmVnZXhfZXhlY19tYXRjaDIocmVnLCBzdGFydCwgZW5kIC0gc3RhcnQsIE1BWF9NQVRDSCwgcG1hdGNoLCBmbGFnKTsKCQl9CgoJCWlmICghZm91bmQpCgkJCXBtYXRjaFswXS5ybV9zbyA9IGVuZCAtIHN0YXJ0OwoKCQkvKiBjb3B5IHRoZSBoZWFkaW5nIG5vbi1tYXRjaGluZyBwYXJ0ICh3aGljaCBtYXkgYWxzbyBiZSB0aGUgdGFpbCBpZiBub3RoaW5nIG1hdGNoZXMpICovCgkJbWF4ID0gdHJhc2gtPnNpemUgLSB0cmFzaC0+bGVuOwoJCWlmIChtYXggJiYgcG1hdGNoWzBdLnJtX3NvID4gMCkgewoJCQlpZiAobWF4ID4gcG1hdGNoWzBdLnJtX3NvKQoJCQkJbWF4ID0gcG1hdGNoWzBdLnJtX3NvOwoJCQltZW1jcHkodHJhc2gtPnN0ciArIHRyYXNoLT5sZW4sIHN0YXJ0LCBtYXgpOwoJCQl0cmFzaC0+bGVuICs9IG1heDsKCQl9CgoJCWlmICghZm91bmQpCgkJCWJyZWFrOwoKCQkvKiByZXBsYWNlIHRoZSBtYXRjaGluZyBwYXJ0ICovCgkJbWF4ID0gdHJhc2gtPnNpemUgLSB0cmFzaC0+bGVuOwoJCWlmIChtYXgpIHsKCQkJaWYgKG1heCA+IGFyZ19wWzFdLmRhdGEuc3RyLmxlbikKCQkJCW1heCA9IGFyZ19wWzFdLmRhdGEuc3RyLmxlbjsKCQkJbWVtY3B5KHRyYXNoLT5zdHIgKyB0cmFzaC0+bGVuLCBhcmdfcFsxXS5kYXRhLnN0ci5zdHIsIG1heCk7CgkJCXRyYXNoLT5sZW4gKz0gbWF4OwoJCX0KCgkJLyogc3RvcCBoZXJlIGlmIHdlJ3JlIGRvbmUgd2l0aCB0aGlzIHN0cmluZyAqLwoJCWlmIChzdGFydCA+PSBlbmQpCgkJCWJyZWFrOwoKCQkvKiBXZSBoYXZlIGEgc3BlY2lhbCBjYXNlIGZvciBtYXRjaGVzIG9mIGxlbmd0aCAwIChlZzogIngqeSoiKS4KCQkgKiBUaGVzZSBvbmVzIGFyZSBjb25zaWRlcmVkIHRvIG1hdGNoIGluIGZyb250IG9mIGEgY2hhcmFjdGVyLAoJCSAqIHNvIHdlIGhhdmUgdG8gY29weSB0aGF0IGNoYXJhY3RlciBhbmQgc2tpcCB0byB0aGUgbmV4dCBvbmUuCgkJICovCgkJaWYgKCFwbWF0Y2hbMF0ucm1fZW8pIHsKCQkJaWYgKHRyYXNoLT5sZW4gPCB0cmFzaC0+c2l6ZSkKCQkJCXRyYXNoLT5zdHJbdHJhc2gtPmxlbisrXSA9IHN0YXJ0W3BtYXRjaFswXS5ybV9lb107CgkJCXBtYXRjaFswXS5ybV9lbysrOwoJCX0KCgkJc3RhcnQgKz0gcG1hdGNoWzBdLnJtX2VvOwoJCWZsYWcgfD0gUkVHX05PVEJPTDsKCX0KCglzbXAtPmRhdGEuc3RyID0gKnRyYXNoOwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhIGJpbmFyeSB0d29zIGNvbXBsZW1lbnQgYW5kIHJldHVybnMgdGhlIFVJTlQKICogcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9iaW5hcnlfY3BsKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gfnNtcC0+ZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhIGJpbmFyeSAiYW5kIiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLCBhbmQKICogcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2JpbmFyeV9hbmQoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgJj0gYXJnX3AtPmRhdGEudWludDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYSBiaW5hcnkgIm9yIiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLCBhbmQKICogcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2JpbmFyeV9vcihjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCB8PSBhcmdfcC0+ZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhIGJpbmFyeSAieG9yIiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLCBhbmQKICogcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2JpbmFyeV94b3IoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgXj0gYXJnX3AtPmRhdGEudWludDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYW4gYXJpdGhtZXRpYyAiYWRkIiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLAogKiBhbmQgcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX2FkZChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCArPSBhcmdfcC0+ZGF0YS51aW50OwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgYXBwbGllcyBhbiBhcml0aG1ldGljICJzdWIiIHdpdGggdGhlIFVJTlQgaW4gYXJnX3AsCiAqIGFuZCByZXR1cm5zIHRoZSBVSU5UIHJlc3VsdC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYXJpdGhfc3ViKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50IC09IGFyZ19wLT5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGFuIGFyaXRobWV0aWMgIm11bCIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwKICogYW5kIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9tdWwoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgKj0gYXJnX3AtPmRhdGEudWludDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIGFwcGxpZXMgYW4gYXJpdGhtZXRpYyAiZGl2IiB3aXRoIHRoZSBVSU5UIGluIGFyZ19wLAogKiBhbmQgcmV0dXJucyB0aGUgVUlOVCByZXN1bHQuIElmIGFyZ19wIG1ha2VzIHRoZSByZXN1bHQgb3ZlcmZsb3csIHRoZW4gdGhlCiAqIGxhcmdlc3QgcG9zc2libGUgcXVhbnRpdHkgaXMgcmV0dXJuZWQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX2Rpdihjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglpZiAoYXJnX3AtPmRhdGEudWludCkKCQlzbXAtPmRhdGEudWludCAvPSBhcmdfcC0+ZGF0YS51aW50OwoJZWxzZQoJCXNtcC0+ZGF0YS51aW50ID0gfjA7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGFuIGFyaXRobWV0aWMgIm1vZCIgd2l0aCB0aGUgVUlOVCBpbiBhcmdfcCwKICogYW5kIHJldHVybnMgdGhlIFVJTlQgcmVzdWx0LiBJZiBhcmdfcCBtYWtlcyB0aGUgcmVzdWx0IG92ZXJmbG93LCB0aGVuIHplcm8KICogaXMgcmV0dXJuZWQuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX21vZChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglpZiAoYXJnX3AtPmRhdGEudWludCkKCQlzbXAtPmRhdGEudWludCAlPSBhcmdfcC0+ZGF0YS51aW50OwoJZWxzZQoJCXNtcC0+ZGF0YS51aW50ID0gMDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhbiBVSU5UIG9uIGlucHV0LCBhcHBsaWVzIGFuIGFyaXRobWV0aWMgIm5lZyIgYW5kIHJldHVybnMgdGhlIFVJTlQKICogcmVzdWx0LgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9uZWcoY29uc3Qgc3RydWN0IGFyZyAqYXJnX3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSAtc21wLT5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCByZXR1cm5zIHRydWUgaXMgdGhlIHZhbHVlIGlzIG5vbi1udWxsLCBvdGhlcndpc2UKICogZmFsc2UuIFRoZSBvdXRwdXQgaXMgYSBCT09MLgogKi8Kc3RhdGljIGludCBzYW1wbGVfY29udl9hcml0aF9ib29sKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9ICEhc21wLT5kYXRhLnVpbnQ7CglzbXAtPnR5cGUgPSBTTVBfVF9CT09MOwoJcmV0dXJuIDE7Cn0KCi8qIFRha2VzIGEgVUlOVCBvbiBpbnB1dCwgcmV0dXJucyBmYWxzZSBpcyB0aGUgdmFsdWUgaXMgbm9uLW51bGwsIG90aGVyd2lzZQogKiB0cnVlZS4gVGhlIG91dHB1dCBpcyBhIEJPT0wuCiAqLwpzdGF0aWMgaW50IHNhbXBsZV9jb252X2FyaXRoX25vdChjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNhbXBsZSAqc21wLCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9ICFzbXAtPmRhdGEudWludDsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglyZXR1cm4gMTsKfQoKLyogVGFrZXMgYSBVSU5UIG9uIGlucHV0LCByZXR1cm5zIHRydWUgaXMgdGhlIHZhbHVlIGlzIG9kZCwgb3RoZXJ3aXNlIGZhbHNlLgogKiBUaGUgb3V0cHV0IGlzIGEgQk9PTC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYXJpdGhfb2RkKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ19wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc2FtcGxlICpzbXAsIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gc21wLT5kYXRhLnVpbnQgJiAxOwoJc21wLT50eXBlID0gU01QX1RfQk9PTDsKCXJldHVybiAxOwp9CgovKiBUYWtlcyBhIFVJTlQgb24gaW5wdXQsIHJldHVybnMgdHJ1ZSBpcyB0aGUgdmFsdWUgaXMgZXZlbiwgb3RoZXJ3aXNlIGZhbHNlLgogKiBUaGUgb3V0cHV0IGlzIGEgQk9PTC4KICovCnN0YXRpYyBpbnQgc2FtcGxlX2NvbnZfYXJpdGhfZXZlbihjb25zdCBzdHJ1Y3QgYXJnICphcmdfcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzYW1wbGUgKnNtcCwgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5kYXRhLnVpbnQgPSAhKHNtcC0+ZGF0YS51aW50ICYgMSk7CglzbXAtPnR5cGUgPSBTTVBfVF9CT09MOwoJcmV0dXJuIDE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgIEFsbCBzdXBwb3J0ZWQgc2FtcGxlIGZldGNoIGZ1bmN0aW9ucyBtdXN0IGJlIGRlY2xhcmVkIGhlcmUgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiBmb3JjZSBUUlVFIHRvIGJlIHJldHVybmVkIGF0IHRoZSBmZXRjaCBsZXZlbCAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF90cnVlKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglzbXAtPmRhdGEudWludCA9IDE7CglyZXR1cm4gMTsKfQoKLyogZm9yY2UgRkFMU0UgdG8gYmUgcmV0dXJuZWQgYXQgdGhlIGZldGNoIGxldmVsICovCnN0YXRpYyBpbnQKc21wX2ZldGNoX2ZhbHNlKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglzbXAtPmRhdGEudWludCA9IDA7CglyZXR1cm4gMTsKfQoKLyogcmV0cmlldmUgZW52aXJvbm1lbnQgdmFyaWFibGUgJDEgYXMgYSBzdHJpbmcgKi8Kc3RhdGljIGludApzbXBfZmV0Y2hfZW52KGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCWNoYXIgKmVudjsKCglpZiAoIWFyZ3MgfHwgYXJnc1swXS50eXBlICE9IEFSR1RfU1RSKQoJCXJldHVybiAwOwoKCWVudiA9IGdldGVudihhcmdzWzBdLmRhdGEuc3RyLnN0cik7CglpZiAoIWVudikKCQlyZXR1cm4gMDsKCglzbXAtPnR5cGUgPSBTTVBfVF9TVFI7CglzbXAtPmZsYWdzID0gU01QX0ZfQ09OU1Q7CglzbXAtPmRhdGEuc3RyLnN0ciA9IGVudjsKCXNtcC0+ZGF0YS5zdHIubGVuID0gc3RybGVuKGVudik7CglyZXR1cm4gMTsKfQoKLyogcmV0cmlldmUgdGhlIGN1cnJlbnQgbG9jYWwgZGF0ZSBpbiBlcG9jaCB0aW1lLCBhbmQgYXBwbGllcyBhbiBvcHRpb25hbCBvZmZzZXQKICogb2YgYXJnc1swXSBzZWNvbmRzLgogKi8Kc3RhdGljIGludApzbXBfZmV0Y2hfZGF0ZShjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmRhdGEudWludCA9IGRhdGUudHZfc2VjOwoKCS8qIGFkZCBvZmZzZXQgKi8KCWlmIChhcmdzICYmIChhcmdzWzBdLnR5cGUgPT0gQVJHVF9TSU5UIHx8IGFyZ3NbMF0udHlwZSA9PSBBUkdUX1VJTlQpKQoJCXNtcC0+ZGF0YS51aW50ICs9IGFyZ3NbMF0uZGF0YS5zaW50OwoKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglzbXAtPmZsYWdzIHw9IFNNUF9GX1ZPTF9URVNUIHwgU01QX0ZfTUFZX0NIQU5HRTsKCXJldHVybiAxOwp9CgovKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VzICovCnN0YXRpYyBpbnQKc21wX2ZldGNoX25icHJvYyhjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJc21wLT5kYXRhLnVpbnQgPSBnbG9iYWwubmJwcm9jOwoJcmV0dXJuIDE7Cn0KCi8qIHJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgY3VycmVudCBwcm9jZXNzIChiZXR3ZWVuIDEgYW5kIG5icHJvYyAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF9wcm9jKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX1VJTlQ7CglzbXAtPmRhdGEudWludCA9IHJlbGF0aXZlX3BpZDsKCXJldHVybiAxOwp9CgovKiBnZW5lcmF0ZSBhIHJhbmRvbSAzMi1iaXQgaW50ZWdlciBmb3Igd2hhdGV2ZXIgcHVycG9zZSwgd2l0aCBhbiBvcHRpb25hbAogKiByYW5nZSBzcGVjaWZpZWQgaW4gYXJndW1lbnQuCiAqLwpzdGF0aWMgaW50CnNtcF9mZXRjaF9yYW5kKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+ZGF0YS51aW50ID0gcmFuZG9tKCk7CgoJLyogcmVkdWNlIGlmIG5lZWRlZC4gRG9uJ3QgZG8gYSBtb2R1bG8sIHVzZSBhbGwgYml0cyEgKi8KCWlmIChhcmdzICYmIGFyZ3NbMF0udHlwZSA9PSBBUkdUX1VJTlQpCgkJc21wLT5kYXRhLnVpbnQgPSAoKHVpbnQ2NF90KXNtcC0+ZGF0YS51aW50ICogYXJnc1swXS5kYXRhLnVpbnQpIC8gKCh1NjQpUkFORF9NQVgrMSk7CgoJc21wLT50eXBlID0gU01QX1RfVUlOVDsKCXNtcC0+ZmxhZ3MgfD0gU01QX0ZfVk9MX1RFU1QgfCBTTVBfRl9NQVlfQ0hBTkdFOwoJcmV0dXJuIDE7Cn0KCi8qIHJldHVybnMgdHJ1ZSBpZiB0aGUgY3VycmVudCBwcm9jZXNzIGlzIHN0b3BwaW5nICovCnN0YXRpYyBpbnQKc21wX2ZldGNoX3N0b3BwaW5nKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX0JPT0w7CglzbXAtPmRhdGEudWludCA9IHN0b3BwaW5nOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc21wX2ZldGNoX2NvbnN0X3N0cihjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPmZsYWdzIHw9IFNNUF9GX0NPTlNUOwoJc21wLT50eXBlID0gU01QX1RfU1RSOwoJc21wLT5kYXRhLnN0ci5zdHIgPSBhcmdzWzBdLmRhdGEuc3RyLnN0cjsKCXNtcC0+ZGF0YS5zdHIubGVuID0gYXJnc1swXS5kYXRhLnN0ci5sZW47CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzbXBfY2hlY2tfY29uc3RfYm9vbChzdHJ1Y3QgYXJnICphcmdzLCBjaGFyICoqZXJyKQp7CglpZiAoc3RyY2FzZWNtcChhcmdzWzBdLmRhdGEuc3RyLnN0ciwgInRydWUiKSA9PSAwIHx8CgkgICAgc3RyY2FzZWNtcChhcmdzWzBdLmRhdGEuc3RyLnN0ciwgIjEiKSA9PSAwKSB7CgkJYXJnc1swXS50eXBlID0gQVJHVF9VSU5UOwoJCWFyZ3NbMF0uZGF0YS51aW50ID0gMTsKCQlyZXR1cm4gMTsKCX0KCWlmIChzdHJjYXNlY21wKGFyZ3NbMF0uZGF0YS5zdHIuc3RyLCAiZmFsc2UiKSA9PSAwIHx8CgkgICAgc3RyY2FzZWNtcChhcmdzWzBdLmRhdGEuc3RyLnN0ciwgIjAiKSA9PSAwKSB7CgkJYXJnc1swXS50eXBlID0gQVJHVF9VSU5UOwoJCWFyZ3NbMF0uZGF0YS51aW50ID0gMDsKCQlyZXR1cm4gMTsKCX0KCW1lbXByaW50ZihlcnIsICJFeHBlY3RzICd0cnVlJywgJ2ZhbHNlJywgJzAnIG9yICcxJyIpOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgc21wX2ZldGNoX2NvbnN0X2Jvb2woY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT50eXBlID0gU01QX1RfQk9PTDsKCXNtcC0+ZGF0YS51aW50ID0gYXJnc1swXS5kYXRhLnVpbnQ7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzbXBfZmV0Y2hfY29uc3RfdWludChjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPnR5cGUgPSBTTVBfVF9VSU5UOwoJc21wLT5kYXRhLnVpbnQgPSBhcmdzWzBdLmRhdGEudWludDsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IHNtcF9mZXRjaF9jb25zdF9zaW50KGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX1NJTlQ7CglzbXAtPmRhdGEuc2ludCA9IGFyZ3NbMF0uZGF0YS5zaW50OwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc21wX2ZldGNoX2NvbnN0X2lwdjQoY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT50eXBlID0gU01QX1RfSVBWNDsKCXNtcC0+ZGF0YS5pcHY0ID0gYXJnc1swXS5kYXRhLmlwdjQ7CglyZXR1cm4gMTsKfQoKc3RhdGljIGludCBzbXBfZmV0Y2hfY29uc3RfaXB2Nihjb25zdCBzdHJ1Y3QgYXJnICphcmdzLCBzdHJ1Y3Qgc2FtcGxlICpzbXAsIGNvbnN0IGNoYXIgKmt3LCB2b2lkICpwcml2YXRlKQp7CglzbXAtPnR5cGUgPSBTTVBfVF9JUFY2OwoJc21wLT5kYXRhLmlwdjYgPSBhcmdzWzBdLmRhdGEuaXB2NjsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IHNtcF9jaGVja19jb25zdF9iaW4oc3RydWN0IGFyZyAqYXJncywgY2hhciAqKmVycikKewoJY2hhciAqYmluc3RyOwoJaW50IGJpbnN0cmxlbjsKCglpZiAoIXBhcnNlX2JpbmFyeShhcmdzWzBdLmRhdGEuc3RyLnN0ciwgJmJpbnN0ciwgJmJpbnN0cmxlbiwgZXJyKSkKCQlyZXR1cm4gMDsKCWFyZ3NbMF0udHlwZSA9IEFSR1RfU1RSOwoJYXJnc1swXS5kYXRhLnN0ci5zdHIgPSBiaW5zdHI7CglhcmdzWzBdLmRhdGEuc3RyLmxlbiA9IGJpbnN0cmxlbjsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IHNtcF9mZXRjaF9jb25zdF9iaW4oY29uc3Qgc3RydWN0IGFyZyAqYXJncywgc3RydWN0IHNhbXBsZSAqc21wLCBjb25zdCBjaGFyICprdywgdm9pZCAqcHJpdmF0ZSkKewoJc21wLT5mbGFncyB8PSBTTVBfRl9DT05TVDsKCXNtcC0+dHlwZSA9IFNNUF9UX0JJTjsKCXNtcC0+ZGF0YS5zdHIuc3RyID0gYXJnc1swXS5kYXRhLnN0ci5zdHI7CglzbXAtPmRhdGEuc3RyLmxlbiA9IGFyZ3NbMF0uZGF0YS5zdHIubGVuOwoJcmV0dXJuIDE7Cn0KCnN0YXRpYyBpbnQgc21wX2NoZWNrX2NvbnN0X21ldGgoc3RydWN0IGFyZyAqYXJncywgY2hhciAqKmVycikKewoJZW51bSBodHRwX21ldGhfdCBtZXRoOwoJaW50IGk7CgoJbWV0aCA9IGZpbmRfaHR0cF9tZXRoKGFyZ3NbMF0uZGF0YS5zdHIuc3RyLCBhcmdzWzBdLmRhdGEuc3RyLmxlbik7CglpZiAobWV0aCAhPSBIVFRQX01FVEhfT1RIRVIpIHsKCQlhcmdzWzBdLnR5cGUgPSBBUkdUX1VJTlQ7CgkJYXJnc1swXS5kYXRhLnVpbnQgPSBtZXRoOwoJfSBlbHNlIHsKCQkvKiBDaGVjayBtZXRob2QgYXZhbGFpYmlsaXR5LiBBIG1ldGhvcyBpcyBhIHRva2VuIGRlZmluZWQgYXMgOgoJCSAqIHRjaGFyID0gIiEiIC8gIiMiIC8gIiQiIC8gIiUiIC8gIiYiIC8gIiciIC8gIioiIC8gIisiIC8gIi0iIC8gIi4iIC8KCQkgKiAgICAgICAgICJeIiAvICJfIiAvICJgIiAvICJ8IiAvICJ+IiAvIERJR0lUIC8gQUxQSEEKCQkgKiB0b2tlbiA9IDEqdGNoYXIKCQkgKi8KCQlmb3IgKGkgPSAwOyBpIDwgYXJnc1swXS5kYXRhLnN0ci5sZW47IGkrKykgewoJCQlpZiAoIWh0dHBfaXNfdG9rZW5bKHVuc2lnbmVkIGNoYXIpYXJnc1swXS5kYXRhLnN0ci5zdHJbaV1dKSB7CgkJCQltZW1wcmludGYoZXJyLCAiZXhwZWN0cyB2YWxpZCBtZXRob2QuIik7CgkJCQlyZXR1cm4gMDsKCQkJfQoJCX0KCX0KCXJldHVybiAxOwp9CgpzdGF0aWMgaW50IHNtcF9mZXRjaF9jb25zdF9tZXRoKGNvbnN0IHN0cnVjdCBhcmcgKmFyZ3MsIHN0cnVjdCBzYW1wbGUgKnNtcCwgY29uc3QgY2hhciAqa3csIHZvaWQgKnByaXZhdGUpCnsKCXNtcC0+dHlwZSA9IFNNUF9UX01FVEg7CglpZiAoYXJnc1swXS50eXBlID09IEFSR1RfVUlOVCkgewoJCXNtcC0+ZmxhZ3MgJj0gflNNUF9GX0NPTlNUOwoJCXNtcC0+ZGF0YS5tZXRoLm1ldGggPSBhcmdzWzBdLmRhdGEudWludDsKCQlzbXAtPmRhdGEubWV0aC5zdHIuc3RyID0gIiI7CgkJc21wLT5kYXRhLm1ldGguc3RyLmxlbiA9IDA7Cgl9IGVsc2UgewoJCXNtcC0+ZmxhZ3MgfD0gU01QX0ZfQ09OU1Q7CgkJc21wLT5kYXRhLm1ldGgubWV0aCA9IEhUVFBfTUVUSF9PVEhFUjsKCQlzbXAtPmRhdGEubWV0aC5zdHIuc3RyID0gYXJnc1swXS5kYXRhLnN0ci5zdHI7CgkJc21wLT5kYXRhLm1ldGguc3RyLmxlbiA9IGFyZ3NbMF0uZGF0YS5zdHIubGVuOwoJfQoJcmV0dXJuIDE7Cn0KCi8qIE5vdGU6IG11c3Qgbm90IGJlIGRlY2xhcmVkIDxjb25zdD4gYXMgaXRzIGxpc3Qgd2lsbCBiZSBvdmVyd3JpdHRlbi4KICogTm90ZTogZmV0Y2hlcyB0aGF0IG1heSByZXR1cm4gbXVsdGlwbGUgdHlwZXMgbXVzdCBiZSBkZWNsYXJlZCBhcyB0aGUgbG93ZXN0CiAqIGNvbW1vbiBkZW5vbWluYXRvciwgdGhlIHR5cGUgdGhhdCBjYW4gYmUgY2FzdGVkIGludG8gYWxsIG90aGVyIG9uZXMuIEZvcgogKiBpbnN0YW5jZSBJUHY0L0lQdjYgbXVzdCBiZSBkZWNsYXJlZCBJUHY0LgogKi8Kc3RhdGljIHN0cnVjdCBzYW1wbGVfZmV0Y2hfa3dfbGlzdCBzbXBfa3dzID0ge0lMSCwgewoJeyAiYWx3YXlzX2ZhbHNlIiwgc21wX2ZldGNoX2ZhbHNlLCAwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX0JPT0wsIFNNUF9VU0VfSU5UUk4gfSwKCXsgImFsd2F5c190cnVlIiwgIHNtcF9mZXRjaF90cnVlLCAgMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9CT09MLCBTTVBfVVNFX0lOVFJOIH0sCgl7ICJlbnYiLCAgICAgICAgICBzbXBfZmV0Y2hfZW52LCAgIEFSRzEoMSxTVFIpLCAgTlVMTCwgU01QX1RfU1RSLCAgU01QX1VTRV9JTlRSTiB9LAoJeyAiZGF0ZSIsICAgICAgICAgc21wX2ZldGNoX2RhdGUsICBBUkcxKDAsU0lOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9VU0VfSU5UUk4gfSwKCXsgIm5icHJvYyIsICAgICAgIHNtcF9mZXRjaF9uYnByb2MsMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVVNFX0lOVFJOIH0sCgl7ICJwcm9jIiwgICAgICAgICBzbXBfZmV0Y2hfcHJvYywgIDAsICAgICAgICAgICAgTlVMTCwgU01QX1RfVUlOVCwgU01QX1VTRV9JTlRSTiB9LAoJeyAicmFuZCIsICAgICAgICAgc21wX2ZldGNoX3JhbmQsICBBUkcxKDAsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9VU0VfSU5UUk4gfSwKCXsgInN0b3BwaW5nIiwgICAgIHNtcF9mZXRjaF9zdG9wcGluZywgMCwgICAgICAgICBOVUxMLCBTTVBfVF9CT09MLCBTTVBfVVNFX0lOVFJOIH0sCgoJeyAic3RyIiwgIHNtcF9mZXRjaF9jb25zdF9zdHIsICBBUkcxKDEsU1RSKSwgIE5VTEwgICAgICAgICAgICAgICAgLCBTTVBfVF9TVFIsICBTTVBfVVNFX0lOVFJOIH0sCgl7ICJib29sIiwgc21wX2ZldGNoX2NvbnN0X2Jvb2wsIEFSRzEoMSxTVFIpLCAgc21wX2NoZWNrX2NvbnN0X2Jvb2wsIFNNUF9UX0JPT0wsIFNNUF9VU0VfSU5UUk4gfSwKCXsgInVpbnQiLCBzbXBfZmV0Y2hfY29uc3RfdWludCwgQVJHMSgxLFVJTlQpLCBOVUxMICAgICAgICAgICAgICAgICwgU01QX1RfVUlOVCwgU01QX1VTRV9JTlRSTiB9LAoJeyAic2ludCIsIHNtcF9mZXRjaF9jb25zdF9zaW50LCBBUkcxKDEsU0lOVCksIE5VTEwgICAgICAgICAgICAgICAgLCBTTVBfVF9TSU5ULCBTTVBfVVNFX0lOVFJOIH0sCgl7ICJpcHY0Iiwgc21wX2ZldGNoX2NvbnN0X2lwdjQsIEFSRzEoMSxJUFY0KSwgTlVMTCAgICAgICAgICAgICAgICAsIFNNUF9UX0lQVjQsIFNNUF9VU0VfSU5UUk4gfSwKCXsgImlwdjYiLCBzbXBfZmV0Y2hfY29uc3RfaXB2NiwgQVJHMSgxLElQVjYpLCBOVUxMICAgICAgICAgICAgICAgICwgU01QX1RfSVBWNiwgU01QX1VTRV9JTlRSTiB9LAoJeyAiYmluIiwgIHNtcF9mZXRjaF9jb25zdF9iaW4sICBBUkcxKDEsU1RSKSwgIHNtcF9jaGVja19jb25zdF9iaW4gLCBTTVBfVF9CSU4sICBTTVBfVVNFX0lOVFJOIH0sCgl7ICJtZXRoIiwgc21wX2ZldGNoX2NvbnN0X21ldGgsIEFSRzEoMSxTVFIpLCAgc21wX2NoZWNrX2NvbnN0X21ldGgsIFNNUF9UX01FVEgsIFNNUF9VU0VfSU5UUk4gfSwKCgl7IC8qIEVORCAqLyB9LAp9fTsKCi8qIE5vdGU6IG11c3Qgbm90IGJlIGRlY2xhcmVkIDxjb25zdD4gYXMgaXRzIGxpc3Qgd2lsbCBiZSBvdmVyd3JpdHRlbiAqLwpzdGF0aWMgc3RydWN0IHNhbXBsZV9jb252X2t3X2xpc3Qgc2FtcGxlX2NvbnZfa3dzID0ge0lMSCwgewojaWZkZWYgREVCVUdfRVhQUgoJeyAiZGVidWciLCAgc2FtcGxlX2NvbnZfZGVidWcsICAgICAwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX0FOWSwgIFNNUF9UX0FOWSAgfSwKI2VuZGlmCgoJeyAiYmFzZTY0Iiwgc2FtcGxlX2NvbnZfYmluMmJhc2U2NCwwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX0JJTiwgIFNNUF9UX1NUUiAgfSwKCXsgInVwcGVyIiwgIHNhbXBsZV9jb252X3N0cjJ1cHBlciwgMCwgICAgICAgICAgICBOVUxMLCBTTVBfVF9TVFIsICBTTVBfVF9TVFIgIH0sCgl7ICJsb3dlciIsICBzYW1wbGVfY29udl9zdHIybG93ZXIsIDAsICAgICAgICAgICAgTlVMTCwgU01QX1RfU1RSLCAgU01QX1RfU1RSICB9LAoJeyAiaGV4IiwgICAgc2FtcGxlX2NvbnZfYmluMmhleCwgICAwLCAgICAgICAgICAgIE5VTEwsIFNNUF9UX0JJTiwgIFNNUF9UX1NUUiAgfSwKCXsgImlwbWFzayIsIHNhbXBsZV9jb252X2lwbWFzaywgICAgQVJHMSgxLE1TSzQpLCBOVUxMLCBTTVBfVF9JUFY0LCBTTVBfVF9JUFY0IH0sCgl7ICJsdGltZSIsICBzYW1wbGVfY29udl9sdGltZSwgICAgIEFSRzIoMSxTVFIsU0lOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1NUUiB9LAoJeyAidXRpbWUiLCAgc2FtcGxlX2NvbnZfdXRpbWUsICAgICBBUkcyKDEsU1RSLFNJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9TVFIgfSwKCXsgImNyYzMyIiwgIHNhbXBsZV9jb252X2NyYzMyLCAgICAgQVJHMSgwLFVJTlQpLCBOVUxMLCBTTVBfVF9CSU4sICBTTVBfVF9VSU5UIH0sCgl7ICJkamIyIiwgICBzYW1wbGVfY29udl9kamIyLCAgICAgIEFSRzEoMCxVSU5UKSwgTlVMTCwgU01QX1RfQklOLCAgU01QX1RfVUlOVCB9LAoJeyAic2RibSIsICAgc2FtcGxlX2NvbnZfc2RibSwgICAgICBBUkcxKDAsVUlOVCksIE5VTEwsIFNNUF9UX0JJTiwgIFNNUF9UX1VJTlQgfSwKCXsgInd0NiIsICAgIHNhbXBsZV9jb252X3d0NiwgICAgICAgQVJHMSgwLFVJTlQpLCBOVUxMLCBTTVBfVF9CSU4sICBTTVBfVF9VSU5UIH0sCgl7ICJqc29uIiwgICBzYW1wbGVfY29udl9qc29uLCAgICAgIEFSRzEoMSxTVFIpLCAgc2FtcGxlX2NvbnZfanNvbl9jaGVjaywgU01QX1RfU1RSLCAgU01QX1RfU1RSIH0sCgl7ICJieXRlcyIsICBzYW1wbGVfY29udl9ieXRlcywgICAgIEFSRzIoMSxVSU5ULFVJTlQpLCBOVUxMLCBTTVBfVF9CSU4sICBTTVBfVF9CSU4gfSwKCXsgImZpZWxkIiwgIHNhbXBsZV9jb252X2ZpZWxkLCAgICAgQVJHMigyLFVJTlQsU1RSKSwgc2FtcGxlX2NvbnZfZmllbGRfY2hlY2ssIFNNUF9UX1NUUiwgIFNNUF9UX1NUUiB9LAoJeyAid29yZCIsICAgc2FtcGxlX2NvbnZfd29yZCwgICAgICBBUkcyKDIsVUlOVCxTVFIpLCBzYW1wbGVfY29udl9maWVsZF9jaGVjaywgU01QX1RfU1RSLCAgU01QX1RfU1RSIH0sCgl7ICJyZWdzdWIiLCBzYW1wbGVfY29udl9yZWdzdWIsICAgIEFSRzMoMixSRUcsU1RSLFNUUiksIHNhbXBsZV9jb252X3JlZ3N1Yl9jaGVjaywgU01QX1RfU1RSLCBTTVBfVF9TVFIgfSwKCgl7ICJhbmQiLCAgICBzYW1wbGVfY29udl9iaW5hcnlfYW5kLCBBUkcxKDEsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgIm9yIiwgICAgIHNhbXBsZV9jb252X2JpbmFyeV9vciwgIEFSRzEoMSxVSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoJeyAieG9yIiwgICAgc2FtcGxlX2NvbnZfYmluYXJ5X3hvciwgQVJHMSgxLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJjcGwiLCAgICBzYW1wbGVfY29udl9iaW5hcnlfY3BsLCAgICAgICAgICAgIDAsIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgImJvb2wiLCAgIHNhbXBsZV9jb252X2FyaXRoX2Jvb2wsICAgICAgICAgICAgMCwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfQk9PTCB9LAoJeyAibm90IiwgICAgc2FtcGxlX2NvbnZfYXJpdGhfbm90LCAgICAgICAgICAgICAwLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9CT09MIH0sCgl7ICJvZGQiLCAgICBzYW1wbGVfY29udl9hcml0aF9vZGQsICAgICAgICAgICAgIDAsIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX0JPT0wgfSwKCXsgImV2ZW4iLCAgIHNhbXBsZV9jb252X2FyaXRoX2V2ZW4sICAgICAgICAgICAgMCwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfQk9PTCB9LAoJeyAiYWRkIiwgICAgc2FtcGxlX2NvbnZfYXJpdGhfYWRkLCAgQVJHMSgxLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJzdWIiLCAgICBzYW1wbGVfY29udl9hcml0aF9zdWIsICBBUkcxKDEsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgIm11bCIsICAgIHNhbXBsZV9jb252X2FyaXRoX211bCwgIEFSRzEoMSxVSU5UKSwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoJeyAiZGl2IiwgICAgc2FtcGxlX2NvbnZfYXJpdGhfZGl2LCAgQVJHMSgxLFVJTlQpLCBOVUxMLCBTTVBfVF9VSU5ULCBTTVBfVF9VSU5UIH0sCgl7ICJtb2QiLCAgICBzYW1wbGVfY29udl9hcml0aF9tb2QsICBBUkcxKDEsVUlOVCksIE5VTEwsIFNNUF9UX1VJTlQsIFNNUF9UX1VJTlQgfSwKCXsgIm5lZyIsICAgIHNhbXBsZV9jb252X2FyaXRoX25lZywgICAgICAgICAgICAgMCwgTlVMTCwgU01QX1RfVUlOVCwgU01QX1RfVUlOVCB9LAoKCXsgTlVMTCwgTlVMTCwgMCwgMCwgMCB9LAp9fTsKCl9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkKc3RhdGljIHZvaWQgX19zYW1wbGVfaW5pdCh2b2lkKQp7CgkvKiByZWdpc3RlciBzYW1wbGUgZmV0Y2ggYW5kIGZvcm1hdCBjb252ZXJzaW9uIGtleXdvcmRzICovCglzYW1wbGVfcmVnaXN0ZXJfZmV0Y2hlcygmc21wX2t3cyk7CglzYW1wbGVfcmVnaXN0ZXJfY29udnMoJnNhbXBsZV9jb252X2t3cyk7Cn0K