LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuLCBVU0EuCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKICogb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogR2VuZXJpYyBzaW1wbGUgbWVtb3J5IG1hbmFnZXIgaW1wbGVtZW50YXRpb24uIEludGVuZGVkIHRvIGJlIHVzZWQgYXMgYSBiYXNlCiAqIGNsYXNzIGltcGxlbWVudGF0aW9uIGZvciBtb3JlIGFkdmFuY2VkIG1lbW9yeSBtYW5hZ2Vycy4KICoKICogTm90ZSB0aGF0IHRoZSBhbGdvcml0aG0gdXNlZCBpcyBxdWl0ZSBzaW1wbGUgYW5kIHRoZXJlIG1pZ2h0IGJlIHN1YnN0YW50aWFsCiAqIHBlcmZvcm1hbmNlIGdhaW5zIGlmIGEgc21hcnRlciBmcmVlIGxpc3QgaXMgaW1wbGVtZW50ZWQuIEN1cnJlbnRseSBpdCBpcyBqdXN0IGFuCiAqIHVub3JkZXJlZCBzdGFjayBvZiBmcmVlIHJlZ2lvbnMuIFRoaXMgY291bGQgZWFzaWx5IGJlIGltcHJvdmVkIGlmIGFuIFJCLXRyZWUKICogaXMgdXNlZCBpbnN0ZWFkLiBBdCBsZWFzdCBpZiB3ZSBleHBlY3QgaGVhdnkgZnJhZ21lbnRhdGlvbi4KICoKICogQWxpZ25lZCBhbGxvY2F0aW9ucyBjYW4gYWxzbyBzZWUgaW1wcm92ZW1lbnQuCiAqCiAqIEF1dGhvcnM6CiAqIFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2luY2x1ZGUgImRybVAuaCIKI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KCnVuc2lnbmVkIGxvbmcgZHJtX21tX3RhaWxfc3BhY2Uoc3RydWN0IGRybV9tbSAqbW0pCnsKCXN0cnVjdCBsaXN0X2hlYWQgKnRhaWxfbm9kZTsKCXN0cnVjdCBkcm1fbW1fbm9kZSAqZW50cnk7CgoJdGFpbF9ub2RlID0gbW0tPm1sX2VudHJ5LnByZXY7CgllbnRyeSA9IGxpc3RfZW50cnkodGFpbF9ub2RlLCBzdHJ1Y3QgZHJtX21tX25vZGUsIG1sX2VudHJ5KTsKCWlmICghZW50cnktPmZyZWUpCgkJcmV0dXJuIDA7CgoJcmV0dXJuIGVudHJ5LT5zaXplOwp9CgppbnQgZHJtX21tX3JlbW92ZV9zcGFjZV9mcm9tX3RhaWwoc3RydWN0IGRybV9tbSAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJc3RydWN0IGxpc3RfaGVhZCAqdGFpbF9ub2RlOwoJc3RydWN0IGRybV9tbV9ub2RlICplbnRyeTsKCgl0YWlsX25vZGUgPSBtbS0+bWxfZW50cnkucHJldjsKCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIHN0cnVjdCBkcm1fbW1fbm9kZSwgbWxfZW50cnkpOwoJaWYgKCFlbnRyeS0+ZnJlZSkKCQlyZXR1cm4gLUVOT01FTTsKCglpZiAoZW50cnktPnNpemUgPD0gc2l6ZSkKCQlyZXR1cm4gLUVOT01FTTsKCgllbnRyeS0+c2l6ZSAtPSBzaXplOwoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW50IGRybV9tbV9jcmVhdGVfdGFpbF9ub2RlKHN0cnVjdCBkcm1fbW0gKm1tLAoJCQkgICAgdW5zaWduZWQgbG9uZyBzdGFydCwKCQkJICAgIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJc3RydWN0IGRybV9tbV9ub2RlICpjaGlsZDsKCgljaGlsZCA9IChzdHJ1Y3QgZHJtX21tX25vZGUgKikKCQlkcm1fYWxsb2Moc2l6ZW9mKCpjaGlsZCksIERSTV9NRU1fTU0pOwoJaWYgKCFjaGlsZCkKCQlyZXR1cm4gLUVOT01FTTsKCgljaGlsZC0+ZnJlZSA9IDE7CgljaGlsZC0+c2l6ZSA9IHNpemU7CgljaGlsZC0+c3RhcnQgPSBzdGFydDsKCWNoaWxkLT5tbSA9IG1tOwoKCWxpc3RfYWRkX3RhaWwoJmNoaWxkLT5tbF9lbnRyeSwgJm1tLT5tbF9lbnRyeSk7CglsaXN0X2FkZF90YWlsKCZjaGlsZC0+ZmxfZW50cnksICZtbS0+ZmxfZW50cnkpOwoKCXJldHVybiAwOwp9CgoKaW50IGRybV9tbV9hZGRfc3BhY2VfdG9fdGFpbChzdHJ1Y3QgZHJtX21tICptbSwgdW5zaWduZWQgbG9uZyBzaXplKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICp0YWlsX25vZGU7CglzdHJ1Y3QgZHJtX21tX25vZGUgKmVudHJ5OwoKCXRhaWxfbm9kZSA9IG1tLT5tbF9lbnRyeS5wcmV2OwoJZW50cnkgPSBsaXN0X2VudHJ5KHRhaWxfbm9kZSwgc3RydWN0IGRybV9tbV9ub2RlLCBtbF9lbnRyeSk7CglpZiAoIWVudHJ5LT5mcmVlKSB7CgkJcmV0dXJuIGRybV9tbV9jcmVhdGVfdGFpbF9ub2RlKG1tLCBlbnRyeS0+c3RhcnQgKyBlbnRyeS0+c2l6ZSwgc2l6ZSk7Cgl9CgllbnRyeS0+c2l6ZSArPSBzaXplOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBzdHJ1Y3QgZHJtX21tX25vZGUgKmRybV9tbV9zcGxpdF9hdF9zdGFydChzdHJ1Y3QgZHJtX21tX25vZGUgKnBhcmVudCwKCQkJCQkgICAgdW5zaWduZWQgbG9uZyBzaXplKQp7CglzdHJ1Y3QgZHJtX21tX25vZGUgKmNoaWxkOwoKCWNoaWxkID0gKHN0cnVjdCBkcm1fbW1fbm9kZSAqKQoJCWRybV9hbGxvYyhzaXplb2YoKmNoaWxkKSwgRFJNX01FTV9NTSk7CglpZiAoIWNoaWxkKQoJCXJldHVybiBOVUxMOwoKCUlOSVRfTElTVF9IRUFEKCZjaGlsZC0+ZmxfZW50cnkpOwoKCWNoaWxkLT5mcmVlID0gMDsKCWNoaWxkLT5zaXplID0gc2l6ZTsKCWNoaWxkLT5zdGFydCA9IHBhcmVudC0+c3RhcnQ7CgljaGlsZC0+bW0gPSBwYXJlbnQtPm1tOwoKCWxpc3RfYWRkX3RhaWwoJmNoaWxkLT5tbF9lbnRyeSwgJnBhcmVudC0+bWxfZW50cnkpOwoJSU5JVF9MSVNUX0hFQUQoJmNoaWxkLT5mbF9lbnRyeSk7CgoJcGFyZW50LT5zaXplIC09IHNpemU7CglwYXJlbnQtPnN0YXJ0ICs9IHNpemU7CglyZXR1cm4gY2hpbGQ7Cn0KCgoKc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fZ2V0X2Jsb2NrKHN0cnVjdCBkcm1fbW1fbm9kZSAqIHBhcmVudCwKCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50KQp7CgoJc3RydWN0IGRybV9tbV9ub2RlICphbGlnbl9zcGxpdG9mZiA9IE5VTEw7CglzdHJ1Y3QgZHJtX21tX25vZGUgKmNoaWxkOwoJdW5zaWduZWQgdG1wID0gMDsKCglpZiAoYWxpZ25tZW50KQoJCXRtcCA9IHBhcmVudC0+c3RhcnQgJSBhbGlnbm1lbnQ7CgoJaWYgKHRtcCkgewoJCWFsaWduX3NwbGl0b2ZmID0gZHJtX21tX3NwbGl0X2F0X3N0YXJ0KHBhcmVudCwgYWxpZ25tZW50IC0gdG1wKTsKCQlpZiAoIWFsaWduX3NwbGl0b2ZmKQoJCQlyZXR1cm4gTlVMTDsKCX0KCglpZiAocGFyZW50LT5zaXplID09IHNpemUpIHsKCQlsaXN0X2RlbF9pbml0KCZwYXJlbnQtPmZsX2VudHJ5KTsKCQlwYXJlbnQtPmZyZWUgPSAwOwoJCXJldHVybiBwYXJlbnQ7Cgl9IGVsc2UgewoJCWNoaWxkID0gZHJtX21tX3NwbGl0X2F0X3N0YXJ0KHBhcmVudCwgc2l6ZSk7Cgl9CgoJaWYgKGFsaWduX3NwbGl0b2ZmKQoJCWRybV9tbV9wdXRfYmxvY2soYWxpZ25fc3BsaXRvZmYpOwoKCXJldHVybiBjaGlsZDsKfQoKLyoKICogUHV0IGEgYmxvY2suIE1lcmdlIHdpdGggdGhlIHByZXZpb3VzIGFuZCAvIG9yIG5leHQgYmxvY2sgaWYgdGhleSBhcmUgZnJlZS4KICogT3RoZXJ3aXNlIGFkZCB0byB0aGUgZnJlZSBzdGFjay4KICovCgp2b2lkIGRybV9tbV9wdXRfYmxvY2soc3RydWN0IGRybV9tbV9ub2RlICogY3VyKQp7CgoJc3RydWN0IGRybV9tbSAqbW0gPSBjdXItPm1tOwoJc3RydWN0IGxpc3RfaGVhZCAqY3VyX2hlYWQgPSAmY3VyLT5tbF9lbnRyeTsKCXN0cnVjdCBsaXN0X2hlYWQgKnJvb3RfaGVhZCA9ICZtbS0+bWxfZW50cnk7CglzdHJ1Y3QgZHJtX21tX25vZGUgKnByZXZfbm9kZSA9IE5VTEw7CglzdHJ1Y3QgZHJtX21tX25vZGUgKm5leHRfbm9kZTsKCglpbnQgbWVyZ2VkID0gMDsKCglpZiAoY3VyX2hlYWQtPnByZXYgIT0gcm9vdF9oZWFkKSB7CgkJcHJldl9ub2RlID0gbGlzdF9lbnRyeShjdXJfaGVhZC0+cHJldiwgc3RydWN0IGRybV9tbV9ub2RlLCBtbF9lbnRyeSk7CgkJaWYgKHByZXZfbm9kZS0+ZnJlZSkgewoJCQlwcmV2X25vZGUtPnNpemUgKz0gY3VyLT5zaXplOwoJCQltZXJnZWQgPSAxOwoJCX0KCX0KCWlmIChjdXJfaGVhZC0+bmV4dCAhPSByb290X2hlYWQpIHsKCQluZXh0X25vZGUgPSBsaXN0X2VudHJ5KGN1cl9oZWFkLT5uZXh0LCBzdHJ1Y3QgZHJtX21tX25vZGUsIG1sX2VudHJ5KTsKCQlpZiAobmV4dF9ub2RlLT5mcmVlKSB7CgkJCWlmIChtZXJnZWQpIHsKCQkJCXByZXZfbm9kZS0+c2l6ZSArPSBuZXh0X25vZGUtPnNpemU7CgkJCQlsaXN0X2RlbCgmbmV4dF9ub2RlLT5tbF9lbnRyeSk7CgkJCQlsaXN0X2RlbCgmbmV4dF9ub2RlLT5mbF9lbnRyeSk7CgkJCQlkcm1fZnJlZShuZXh0X25vZGUsIHNpemVvZigqbmV4dF9ub2RlKSwKCQkJCQkgRFJNX01FTV9NTSk7CgkJCX0gZWxzZSB7CgkJCQluZXh0X25vZGUtPnNpemUgKz0gY3VyLT5zaXplOwoJCQkJbmV4dF9ub2RlLT5zdGFydCA9IGN1ci0+c3RhcnQ7CgkJCQltZXJnZWQgPSAxOwoJCQl9CgkJfQoJfQoJaWYgKCFtZXJnZWQpIHsKCQljdXItPmZyZWUgPSAxOwoJCWxpc3RfYWRkKCZjdXItPmZsX2VudHJ5LCAmbW0tPmZsX2VudHJ5KTsKCX0gZWxzZSB7CgkJbGlzdF9kZWwoJmN1ci0+bWxfZW50cnkpOwoJCWRybV9mcmVlKGN1ciwgc2l6ZW9mKCpjdXIpLCBEUk1fTUVNX01NKTsKCX0KfQoKc3RydWN0IGRybV9tbV9ub2RlICpkcm1fbW1fc2VhcmNoX2ZyZWUoY29uc3Qgc3RydWN0IGRybV9tbSAqIG1tLAoJCQkJICB1bnNpZ25lZCBsb25nIHNpemUsCgkJCQkgIHVuc2lnbmVkIGFsaWdubWVudCwgaW50IGJlc3RfbWF0Y2gpCnsKCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3Q7Cgljb25zdCBzdHJ1Y3QgbGlzdF9oZWFkICpmcmVlX3N0YWNrID0gJm1tLT5mbF9lbnRyeTsKCXN0cnVjdCBkcm1fbW1fbm9kZSAqZW50cnk7CglzdHJ1Y3QgZHJtX21tX25vZGUgKmJlc3Q7Cgl1bnNpZ25lZCBsb25nIGJlc3Rfc2l6ZTsKCXVuc2lnbmVkIHdhc3RlZDsKCgliZXN0ID0gTlVMTDsKCWJlc3Rfc2l6ZSA9IH4wVUw7CgoJbGlzdF9mb3JfZWFjaChsaXN0LCBmcmVlX3N0YWNrKSB7CgkJZW50cnkgPSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBkcm1fbW1fbm9kZSwgZmxfZW50cnkpOwoJCXdhc3RlZCA9IDA7CgoJCWlmIChlbnRyeS0+c2l6ZSA8IHNpemUpCgkJCWNvbnRpbnVlOwoKCQlpZiAoYWxpZ25tZW50KSB7CgkJCXJlZ2lzdGVyIHVuc2lnbmVkIHRtcCA9IGVudHJ5LT5zdGFydCAlIGFsaWdubWVudDsKCQkJaWYgKHRtcCkKCQkJCXdhc3RlZCArPSBhbGlnbm1lbnQgLSB0bXA7CgkJfQoKCgkJaWYgKGVudHJ5LT5zaXplID49IHNpemUgKyB3YXN0ZWQpIHsKCQkJaWYgKCFiZXN0X21hdGNoKQoJCQkJcmV0dXJuIGVudHJ5OwoJCQlpZiAoc2l6ZSA8IGJlc3Rfc2l6ZSkgewoJCQkJYmVzdCA9IGVudHJ5OwoJCQkJYmVzdF9zaXplID0gZW50cnktPnNpemU7CgkJCX0KCQl9Cgl9CgoJcmV0dXJuIGJlc3Q7Cn0KCmludCBkcm1fbW1fY2xlYW4oc3RydWN0IGRybV9tbSAqIG1tKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkID0gJm1tLT5tbF9lbnRyeTsKCglyZXR1cm4gKGhlYWQtPm5leHQtPm5leHQgPT0gaGVhZCk7Cn0KCmludCBkcm1fbW1faW5pdChzdHJ1Y3QgZHJtX21tICogbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJSU5JVF9MSVNUX0hFQUQoJm1tLT5tbF9lbnRyeSk7CglJTklUX0xJU1RfSEVBRCgmbW0tPmZsX2VudHJ5KTsKCglyZXR1cm4gZHJtX21tX2NyZWF0ZV90YWlsX25vZGUobW0sIHN0YXJ0LCBzaXplKTsKfQoKCnZvaWQgZHJtX21tX3Rha2Vkb3duKHN0cnVjdCBkcm1fbW0gKiBtbSkKewoJc3RydWN0IGxpc3RfaGVhZCAqYm5vZGUgPSBtbS0+ZmxfZW50cnkubmV4dDsKCXN0cnVjdCBkcm1fbW1fbm9kZSAqZW50cnk7CgoJZW50cnkgPSBsaXN0X2VudHJ5KGJub2RlLCBzdHJ1Y3QgZHJtX21tX25vZGUsIGZsX2VudHJ5KTsKCglpZiAoZW50cnktPm1sX2VudHJ5Lm5leHQgIT0gJm1tLT5tbF9lbnRyeSB8fAoJICAgIGVudHJ5LT5mbF9lbnRyeS5uZXh0ICE9ICZtbS0+ZmxfZW50cnkpIHsKCQlEUk1fRVJST1IoIk1lbW9yeSBtYW5hZ2VyIG5vdCBjbGVhbi4gRGVsYXlpbmcgdGFrZWRvd25cbiIpOwoJCXJldHVybjsKCX0KCglsaXN0X2RlbCgmZW50cnktPmZsX2VudHJ5KTsKCWxpc3RfZGVsKCZlbnRyeS0+bWxfZW50cnkpOwoKCWRybV9mcmVlKGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9NTSk7Cn0KCg==