LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuLCBVU0EuCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKICogb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogR2VuZXJpYyBzaW1wbGUgbWVtb3J5IG1hbmFnZXIgaW1wbGVtZW50YXRpb24uIEludGVuZGVkIHRvIGJlIHVzZWQgYXMgYSBiYXNlCiAqIGNsYXNzIGltcGxlbWVudGF0aW9uIGZvciBtb3JlIGFkdmFuY2VkIG1lbW9yeSBtYW5hZ2Vycy4KICoKICogTm90ZSB0aGF0IHRoZSBhbGdvcml0aG0gdXNlZCBpcyBxdWl0ZSBzaW1wbGUgYW5kIHRoZXJlIG1pZ2h0IGJlIHN1YnN0YW50aWFsCiAqIHBlcmZvcm1hbmNlIGdhaW5zIGlmIGEgc21hcnRlciBmcmVlIGxpc3QgaXMgaW1wbGVtZW50ZWQuIEN1cnJlbnRseSBpdCBpcyBqdXN0IGFuCiAqIHVub3JkZXJlZCBzdGFjayBvZiBmcmVlIHJlZ2lvbnMuIFRoaXMgY291bGQgZWFzaWx5IGJlIGltcHJvdmVkIGlmIGFuIFJCLXRyZWUKICogaXMgdXNlZCBpbnN0ZWFkLiBBdCBsZWFzdCBpZiB3ZSBleHBlY3QgaGVhdnkgZnJhZ21lbnRhdGlvbi4KICoKICogQWxpZ25lZCBhbGxvY2F0aW9ucyBjYW4gYWxzbyBzZWUgaW1wcm92ZW1lbnQuCiAqCiAqIEF1dGhvcnM6CiAqIFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2luY2x1ZGUgImRybVAuaCIKCmRybV9tbV9ub2RlX3QgKmRybV9tbV9nZXRfYmxvY2soZHJtX21tX25vZGVfdCAqIHBhcmVudCwKCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50KQp7CgoJZHJtX21tX25vZGVfdCAqY2hpbGQ7CgoJaWYgKGFsaWdubWVudCkKCQlzaXplICs9IGFsaWdubWVudCAtIDE7CgoJaWYgKHBhcmVudC0+c2l6ZSA9PSBzaXplKSB7CgkJbGlzdF9kZWxfaW5pdCgmcGFyZW50LT5mbF9lbnRyeSk7CgkJcGFyZW50LT5mcmVlID0gMDsKCQlyZXR1cm4gcGFyZW50OwoJfSBlbHNlIHsKCQljaGlsZCA9IChkcm1fbW1fbm9kZV90ICopIGRybV9hbGxvYyhzaXplb2YoKmNoaWxkKSwgRFJNX01FTV9NTSk7CgkJaWYgKCFjaGlsZCkKCQkJcmV0dXJuIE5VTEw7CgoJCUlOSVRfTElTVF9IRUFEKCZjaGlsZC0+bWxfZW50cnkpOwoJCUlOSVRfTElTVF9IRUFEKCZjaGlsZC0+ZmxfZW50cnkpOwoKCQljaGlsZC0+ZnJlZSA9IDA7CgkJY2hpbGQtPnNpemUgPSBzaXplOwoJCWNoaWxkLT5zdGFydCA9IHBhcmVudC0+c3RhcnQ7CgoJCWxpc3RfYWRkX3RhaWwoJmNoaWxkLT5tbF9lbnRyeSwgJnBhcmVudC0+bWxfZW50cnkpOwoJCXBhcmVudC0+c2l6ZSAtPSBzaXplOwoJCXBhcmVudC0+c3RhcnQgKz0gc2l6ZTsKCX0KCXJldHVybiBjaGlsZDsKfQoKLyoKICogUHV0IGEgYmxvY2suIE1lcmdlIHdpdGggdGhlIHByZXZpb3VzIGFuZCAvIG9yIG5leHQgYmxvY2sgaWYgdGhleSBhcmUgZnJlZS4KICogT3RoZXJ3aXNlIGFkZCB0byB0aGUgZnJlZSBzdGFjay4KICovCgp2b2lkIGRybV9tbV9wdXRfYmxvY2soZHJtX21tX3QgKiBtbSwgZHJtX21tX25vZGVfdCAqIGN1cikKewoKCWRybV9tbV9ub2RlX3QgKmxpc3Rfcm9vdCA9ICZtbS0+cm9vdF9ub2RlOwoJc3RydWN0IGxpc3RfaGVhZCAqY3VyX2hlYWQgPSAmY3VyLT5tbF9lbnRyeTsKCXN0cnVjdCBsaXN0X2hlYWQgKnJvb3RfaGVhZCA9ICZsaXN0X3Jvb3QtPm1sX2VudHJ5OwoJZHJtX21tX25vZGVfdCAqcHJldl9ub2RlID0gTlVMTDsKCWRybV9tbV9ub2RlX3QgKm5leHRfbm9kZTsKCglpbnQgbWVyZ2VkID0gMDsKCglpZiAoY3VyX2hlYWQtPnByZXYgIT0gcm9vdF9oZWFkKSB7CgkJcHJldl9ub2RlID0gbGlzdF9lbnRyeShjdXJfaGVhZC0+cHJldiwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOwoJCWlmIChwcmV2X25vZGUtPmZyZWUpIHsKCQkJcHJldl9ub2RlLT5zaXplICs9IGN1ci0+c2l6ZTsKCQkJbWVyZ2VkID0gMTsKCQl9Cgl9CglpZiAoY3VyX2hlYWQtPm5leHQgIT0gcm9vdF9oZWFkKSB7CgkJbmV4dF9ub2RlID0gbGlzdF9lbnRyeShjdXJfaGVhZC0+bmV4dCwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOwoJCWlmIChuZXh0X25vZGUtPmZyZWUpIHsKCQkJaWYgKG1lcmdlZCkgewoJCQkJcHJldl9ub2RlLT5zaXplICs9IG5leHRfbm9kZS0+c2l6ZTsKCQkJCWxpc3RfZGVsKCZuZXh0X25vZGUtPm1sX2VudHJ5KTsKCQkJCWxpc3RfZGVsKCZuZXh0X25vZGUtPmZsX2VudHJ5KTsKCQkJCWRybV9mcmVlKG5leHRfbm9kZSwgc2l6ZW9mKCpuZXh0X25vZGUpLAoJCQkJCSBEUk1fTUVNX01NKTsKCQkJfSBlbHNlIHsKCQkJCW5leHRfbm9kZS0+c2l6ZSArPSBjdXItPnNpemU7CgkJCQluZXh0X25vZGUtPnN0YXJ0ID0gY3VyLT5zdGFydDsKCQkJCW1lcmdlZCA9IDE7CgkJCX0KCQl9Cgl9CglpZiAoIW1lcmdlZCkgewoJCWN1ci0+ZnJlZSA9IDE7CgkJbGlzdF9hZGQoJmN1ci0+ZmxfZW50cnksICZsaXN0X3Jvb3QtPmZsX2VudHJ5KTsKCX0gZWxzZSB7CgkJbGlzdF9kZWwoJmN1ci0+bWxfZW50cnkpOwoJCWRybV9mcmVlKGN1ciwgc2l6ZW9mKCpjdXIpLCBEUk1fTUVNX01NKTsKCX0KfQoKZHJtX21tX25vZGVfdCAqZHJtX21tX3NlYXJjaF9mcmVlKGNvbnN0IGRybV9tbV90ICogbW0sCgkJCQkgIHVuc2lnbmVkIGxvbmcgc2l6ZSwKCQkJCSAgdW5zaWduZWQgYWxpZ25tZW50LCBpbnQgYmVzdF9tYXRjaCkKewoJc3RydWN0IGxpc3RfaGVhZCAqbGlzdDsKCWNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmZyZWVfc3RhY2sgPSAmbW0tPnJvb3Rfbm9kZS5mbF9lbnRyeTsKCWRybV9tbV9ub2RlX3QgKmVudHJ5OwoJZHJtX21tX25vZGVfdCAqYmVzdDsKCXVuc2lnbmVkIGxvbmcgYmVzdF9zaXplOwoKCWJlc3QgPSBOVUxMOwoJYmVzdF9zaXplID0gfjBVTDsKCglpZiAoYWxpZ25tZW50KQoJCXNpemUgKz0gYWxpZ25tZW50IC0gMTsKCglsaXN0X2Zvcl9lYWNoKGxpc3QsIGZyZWVfc3RhY2spIHsKCQllbnRyeSA9IGxpc3RfZW50cnkobGlzdCwgZHJtX21tX25vZGVfdCwgZmxfZW50cnkpOwoJCWlmIChlbnRyeS0+c2l6ZSA+PSBzaXplKSB7CgkJCWlmICghYmVzdF9tYXRjaCkKCQkJCXJldHVybiBlbnRyeTsKCQkJaWYgKHNpemUgPCBiZXN0X3NpemUpIHsKCQkJCWJlc3QgPSBlbnRyeTsKCQkJCWJlc3Rfc2l6ZSA9IGVudHJ5LT5zaXplOwoJCQl9CgkJfQoJfQoKCXJldHVybiBiZXN0Owp9CgppbnQgZHJtX21tX2luaXQoZHJtX21tX3QgKiBtbSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKQp7Cglkcm1fbW1fbm9kZV90ICpjaGlsZDsKCglJTklUX0xJU1RfSEVBRCgmbW0tPnJvb3Rfbm9kZS5tbF9lbnRyeSk7CglJTklUX0xJU1RfSEVBRCgmbW0tPnJvb3Rfbm9kZS5mbF9lbnRyeSk7CgljaGlsZCA9IChkcm1fbW1fbm9kZV90ICopIGRybV9hbGxvYyhzaXplb2YoKmNoaWxkKSwgRFJNX01FTV9NTSk7CglpZiAoIWNoaWxkKQoJCXJldHVybiAtRU5PTUVNOwoKCUlOSVRfTElTVF9IRUFEKCZjaGlsZC0+bWxfZW50cnkpOwoJSU5JVF9MSVNUX0hFQUQoJmNoaWxkLT5mbF9lbnRyeSk7CgoJY2hpbGQtPnN0YXJ0ID0gc3RhcnQ7CgljaGlsZC0+c2l6ZSA9IHNpemU7CgljaGlsZC0+ZnJlZSA9IDE7CgoJbGlzdF9hZGQoJmNoaWxkLT5mbF9lbnRyeSwgJm1tLT5yb290X25vZGUuZmxfZW50cnkpOwoJbGlzdF9hZGQoJmNoaWxkLT5tbF9lbnRyeSwgJm1tLT5yb290X25vZGUubWxfZW50cnkpOwoKCXJldHVybiAwOwp9CgpFWFBPUlRfU1lNQk9MKGRybV9tbV9pbml0KTsKCnZvaWQgZHJtX21tX3Rha2Vkb3duKGRybV9tbV90ICogbW0pCnsKCXN0cnVjdCBsaXN0X2hlYWQgKmJub2RlID0gbW0tPnJvb3Rfbm9kZS5mbF9lbnRyeS5uZXh0OwoJZHJtX21tX25vZGVfdCAqZW50cnk7CgoJZW50cnkgPSBsaXN0X2VudHJ5KGJub2RlLCBkcm1fbW1fbm9kZV90LCBmbF9lbnRyeSk7CgoJaWYgKGVudHJ5LT5tbF9lbnRyeS5uZXh0ICE9ICZtbS0+cm9vdF9ub2RlLm1sX2VudHJ5IHx8CgkgICAgZW50cnktPmZsX2VudHJ5Lm5leHQgIT0gJm1tLT5yb290X25vZGUuZmxfZW50cnkpIHsKCQlEUk1fRVJST1IoIk1lbW9yeSBtYW5hZ2VyIG5vdCBjbGVhbi4gRGVsYXlpbmcgdGFrZWRvd25cbiIpOwoJCXJldHVybjsKCX0KCglsaXN0X2RlbCgmZW50cnktPmZsX2VudHJ5KTsKCWxpc3RfZGVsKCZlbnRyeS0+bWxfZW50cnkpOwoKCWRybV9mcmVlKGVudHJ5LCBzaXplb2YoKmVudHJ5KSwgRFJNX01FTV9NTSk7Cn0KCkVYUE9SVF9TWU1CT0woZHJtX21tX3Rha2Vkb3duKTsK