LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYXJjaywgTkQuLCBVU0EuCiAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqCiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCiAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUKICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZwogKiB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsCiAqIGRpc3RyaWJ1dGUsIHN1YiBsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KICogcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCiAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKICoKICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgKGluY2x1ZGluZyB0aGUKICogbmV4dCBwYXJhZ3JhcGgpIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMKICogb2YgdGhlIFNvZnR3YXJlLgogKgogKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTi1JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMCiAqIFRIRSBDT1BZUklHSFQgSE9MREVSUywgQVVUSE9SUyBBTkQvT1IgSVRTIFNVUFBMSUVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCiAqIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKICogVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KICoKICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogR2VuZXJpYyBzaW1wbGUgbWVtb3J5IG1hbmFnZXIgaW1wbGVtZW50YXRpb24uIEludGVuZGVkIHRvIGJlIHVzZWQgYXMgYSBiYXNlCiAqIGNsYXNzIGltcGxlbWVudGF0aW9uIGZvciBtb3JlIGFkdmFuY2VkIG1lbW9yeSBtYW5hZ2Vycy4KICoKICogTm90ZSB0aGF0IHRoZSBhbGdvcml0aG0gdXNlZCBpcyBxdWl0ZSBzaW1wbGUgYW5kIHRoZXJlIG1pZ2h0IGJlIHN1YnN0YW50aWFsCiAqIHBlcmZvcm1hbmNlIGdhaW5zIGlmIGEgc21hcnRlciBmcmVlIGxpc3QgaXMgaW1wbGVtZW50ZWQuIEN1cnJlbnRseSBpdCBpcyBqdXN0IGFuCiAqIHVub3JkZXJlZCBzdGFjayBvZiBmcmVlIHJlZ2lvbnMuIFRoaXMgY291bGQgZWFzaWx5IGJlIGltcHJvdmVkIGlmIGFuIFJCLXRyZWUKICogaXMgdXNlZCBpbnN0ZWFkLiBBdCBsZWFzdCBpZiB3ZSBleHBlY3QgaGVhdnkgZnJhZ21lbnRhdGlvbi4KICoKICogQWxpZ25lZCBhbGxvY2F0aW9ucyBjYW4gYWxzbyBzZWUgaW1wcm92ZW1lbnQuCiAqCiAqIEF1dGhvcnM6CiAqIFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2luY2x1ZGUgImRybVAuaCIKI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KCnVuc2lnbmVkIGxvbmcgZHJtX21tX3RhaWxfc3BhY2UoZHJtX21tX3QgKm1tKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICp0YWlsX25vZGU7Cglkcm1fbW1fbm9kZV90ICplbnRyeTsKCgl0YWlsX25vZGUgPSBtbS0+bWxfZW50cnkucHJldjsKCWVudHJ5ID0gbGlzdF9lbnRyeSh0YWlsX25vZGUsIGRybV9tbV9ub2RlX3QsIG1sX2VudHJ5KTsKCWlmICghZW50cnktPmZyZWUpCgkJcmV0dXJuIDA7CgoJcmV0dXJuIGVudHJ5LT5zaXplOwp9CgppbnQgZHJtX21tX3JlbW92ZV9zcGFjZV9mcm9tX3RhaWwoZHJtX21tX3QgKm1tLCB1bnNpZ25lZCBsb25nIHNpemUpCnsKCXN0cnVjdCBsaXN0X2hlYWQgKnRhaWxfbm9kZTsKCWRybV9tbV9ub2RlX3QgKmVudHJ5OwoKCXRhaWxfbm9kZSA9IG1tLT5tbF9lbnRyeS5wcmV2OwoJZW50cnkgPSBsaXN0X2VudHJ5KHRhaWxfbm9kZSwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOwoJaWYgKCFlbnRyeS0+ZnJlZSkKCQlyZXR1cm4gLUVOT01FTTsKCglpZiAoZW50cnktPnNpemUgPD0gc2l6ZSkKCQlyZXR1cm4gLUVOT01FTTsKCgllbnRyeS0+c2l6ZSAtPSBzaXplOwoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW50IGRybV9tbV9jcmVhdGVfdGFpbF9ub2RlKGRybV9tbV90ICptbSwKCQkJICAgIHVuc2lnbmVkIGxvbmcgc3RhcnQsCgkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUpCnsKCWRybV9tbV9ub2RlX3QgKmNoaWxkOwoKCWNoaWxkID0gKGRybV9tbV9ub2RlX3QgKikKCQlkcm1fYWxsb2Moc2l6ZW9mKCpjaGlsZCksIERSTV9NRU1fTU0pOwoJaWYgKCFjaGlsZCkKCQlyZXR1cm4gLUVOT01FTTsKCgljaGlsZC0+ZnJlZSA9IDE7CgljaGlsZC0+c2l6ZSA9IHNpemU7CgljaGlsZC0+c3RhcnQgPSBzdGFydDsKCWNoaWxkLT5tbSA9IG1tOwoKCWxpc3RfYWRkX3RhaWwoJmNoaWxkLT5tbF9lbnRyeSwgJm1tLT5tbF9lbnRyeSk7CglsaXN0X2FkZF90YWlsKCZjaGlsZC0+ZmxfZW50cnksICZtbS0+ZmxfZW50cnkpOwoKCXJldHVybiAwOwp9CgoKaW50IGRybV9tbV9hZGRfc3BhY2VfdG9fdGFpbChkcm1fbW1fdCAqbW0sIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJc3RydWN0IGxpc3RfaGVhZCAqdGFpbF9ub2RlOwoJZHJtX21tX25vZGVfdCAqZW50cnk7CgoJdGFpbF9ub2RlID0gbW0tPm1sX2VudHJ5LnByZXY7CgllbnRyeSA9IGxpc3RfZW50cnkodGFpbF9ub2RlLCBkcm1fbW1fbm9kZV90LCBtbF9lbnRyeSk7CglpZiAoIWVudHJ5LT5mcmVlKSB7CgkJcmV0dXJuIGRybV9tbV9jcmVhdGVfdGFpbF9ub2RlKG1tLCBlbnRyeS0+c3RhcnQgKyBlbnRyeS0+c2l6ZSwgc2l6ZSk7Cgl9CgllbnRyeS0+c2l6ZSArPSBzaXplOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBkcm1fbW1fbm9kZV90ICpkcm1fbW1fc3BsaXRfYXRfc3RhcnQoZHJtX21tX25vZGVfdCAqcGFyZW50LAoJCQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUpCnsKCWRybV9tbV9ub2RlX3QgKmNoaWxkOwoKCWNoaWxkID0gKGRybV9tbV9ub2RlX3QgKikKCQlkcm1fYWxsb2Moc2l6ZW9mKCpjaGlsZCksIERSTV9NRU1fTU0pOwoJaWYgKCFjaGlsZCkKCQlyZXR1cm4gTlVMTDsKCglJTklUX0xJU1RfSEVBRCgmY2hpbGQtPmZsX2VudHJ5KTsKCgljaGlsZC0+ZnJlZSA9IDA7CgljaGlsZC0+c2l6ZSA9IHNpemU7CgljaGlsZC0+c3RhcnQgPSBwYXJlbnQtPnN0YXJ0OwoJY2hpbGQtPm1tID0gcGFyZW50LT5tbTsKCglsaXN0X2FkZF90YWlsKCZjaGlsZC0+bWxfZW50cnksICZwYXJlbnQtPm1sX2VudHJ5KTsKCUlOSVRfTElTVF9IRUFEKCZjaGlsZC0+ZmxfZW50cnkpOwoKCXBhcmVudC0+c2l6ZSAtPSBzaXplOwoJcGFyZW50LT5zdGFydCArPSBzaXplOwoJcmV0dXJuIGNoaWxkOwp9CgoKCmRybV9tbV9ub2RlX3QgKmRybV9tbV9nZXRfYmxvY2soZHJtX21tX25vZGVfdCAqIHBhcmVudCwKCQkJCXVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgYWxpZ25tZW50KQp7CgoJZHJtX21tX25vZGVfdCAqYWxpZ25fc3BsaXRvZmYgPSBOVUxMOwoJZHJtX21tX25vZGVfdCAqY2hpbGQ7Cgl1bnNpZ25lZCB0bXAgPSAwOwoKCWlmIChhbGlnbm1lbnQpCgkJdG1wID0gcGFyZW50LT5zdGFydCAlIGFsaWdubWVudDsKCglpZiAodG1wKSB7CgkJYWxpZ25fc3BsaXRvZmYgPSBkcm1fbW1fc3BsaXRfYXRfc3RhcnQocGFyZW50LCBhbGlnbm1lbnQgLSB0bXApOwoJCWlmICghYWxpZ25fc3BsaXRvZmYpCgkJCXJldHVybiBOVUxMOwoJfQoKCWlmIChwYXJlbnQtPnNpemUgPT0gc2l6ZSkgewoJCWxpc3RfZGVsX2luaXQoJnBhcmVudC0+ZmxfZW50cnkpOwoJCXBhcmVudC0+ZnJlZSA9IDA7CgkJcmV0dXJuIHBhcmVudDsKCX0gZWxzZSB7CgkJY2hpbGQgPSBkcm1fbW1fc3BsaXRfYXRfc3RhcnQocGFyZW50LCBzaXplKTsKCX0KCglpZiAoYWxpZ25fc3BsaXRvZmYpCgkJZHJtX21tX3B1dF9ibG9jayhhbGlnbl9zcGxpdG9mZik7CgoJcmV0dXJuIGNoaWxkOwp9CgovKgogKiBQdXQgYSBibG9jay4gTWVyZ2Ugd2l0aCB0aGUgcHJldmlvdXMgYW5kIC8gb3IgbmV4dCBibG9jayBpZiB0aGV5IGFyZSBmcmVlLgogKiBPdGhlcndpc2UgYWRkIHRvIHRoZSBmcmVlIHN0YWNrLgogKi8KCnZvaWQgZHJtX21tX3B1dF9ibG9jayhkcm1fbW1fbm9kZV90ICogY3VyKQp7CgoJZHJtX21tX3QgKm1tID0gY3VyLT5tbTsKCXN0cnVjdCBsaXN0X2hlYWQgKmN1cl9oZWFkID0gJmN1ci0+bWxfZW50cnk7CglzdHJ1Y3QgbGlzdF9oZWFkICpyb290X2hlYWQgPSAmbW0tPm1sX2VudHJ5OwoJZHJtX21tX25vZGVfdCAqcHJldl9ub2RlID0gTlVMTDsKCWRybV9tbV9ub2RlX3QgKm5leHRfbm9kZTsKCglpbnQgbWVyZ2VkID0gMDsKCglpZiAoY3VyX2hlYWQtPnByZXYgIT0gcm9vdF9oZWFkKSB7CgkJcHJldl9ub2RlID0gbGlzdF9lbnRyeShjdXJfaGVhZC0+cHJldiwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOwoJCWlmIChwcmV2X25vZGUtPmZyZWUpIHsKCQkJcHJldl9ub2RlLT5zaXplICs9IGN1ci0+c2l6ZTsKCQkJbWVyZ2VkID0gMTsKCQl9Cgl9CglpZiAoY3VyX2hlYWQtPm5leHQgIT0gcm9vdF9oZWFkKSB7CgkJbmV4dF9ub2RlID0gbGlzdF9lbnRyeShjdXJfaGVhZC0+bmV4dCwgZHJtX21tX25vZGVfdCwgbWxfZW50cnkpOwoJCWlmIChuZXh0X25vZGUtPmZyZWUpIHsKCQkJaWYgKG1lcmdlZCkgewoJCQkJcHJldl9ub2RlLT5zaXplICs9IG5leHRfbm9kZS0+c2l6ZTsKCQkJCWxpc3RfZGVsKCZuZXh0X25vZGUtPm1sX2VudHJ5KTsKCQkJCWxpc3RfZGVsKCZuZXh0X25vZGUtPmZsX2VudHJ5KTsKCQkJCWRybV9mcmVlKG5leHRfbm9kZSwgc2l6ZW9mKCpuZXh0X25vZGUpLAoJCQkJCSBEUk1fTUVNX01NKTsKCQkJfSBlbHNlIHsKCQkJCW5leHRfbm9kZS0+c2l6ZSArPSBjdXItPnNpemU7CgkJCQluZXh0X25vZGUtPnN0YXJ0ID0gY3VyLT5zdGFydDsKCQkJCW1lcmdlZCA9IDE7CgkJCX0KCQl9Cgl9CglpZiAoIW1lcmdlZCkgewoJCWN1ci0+ZnJlZSA9IDE7CgkJbGlzdF9hZGQoJmN1ci0+ZmxfZW50cnksICZtbS0+ZmxfZW50cnkpOwoJfSBlbHNlIHsKCQlsaXN0X2RlbCgmY3VyLT5tbF9lbnRyeSk7CgkJZHJtX2ZyZWUoY3VyLCBzaXplb2YoKmN1ciksIERSTV9NRU1fTU0pOwoJfQp9Cgpkcm1fbW1fbm9kZV90ICpkcm1fbW1fc2VhcmNoX2ZyZWUoY29uc3QgZHJtX21tX3QgKiBtbSwKCQkJCSAgdW5zaWduZWQgbG9uZyBzaXplLAoJCQkJICB1bnNpZ25lZCBhbGlnbm1lbnQsIGludCBiZXN0X21hdGNoKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OwoJY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqZnJlZV9zdGFjayA9ICZtbS0+ZmxfZW50cnk7Cglkcm1fbW1fbm9kZV90ICplbnRyeTsKCWRybV9tbV9ub2RlX3QgKmJlc3Q7Cgl1bnNpZ25lZCBsb25nIGJlc3Rfc2l6ZTsKCXVuc2lnbmVkIHdhc3RlZDsKCgliZXN0ID0gTlVMTDsKCWJlc3Rfc2l6ZSA9IH4wVUw7CgoJbGlzdF9mb3JfZWFjaChsaXN0LCBmcmVlX3N0YWNrKSB7CgkJZW50cnkgPSBsaXN0X2VudHJ5KGxpc3QsIGRybV9tbV9ub2RlX3QsIGZsX2VudHJ5KTsKCQl3YXN0ZWQgPSAwOwoKCQlpZiAoZW50cnktPnNpemUgPCBzaXplKQoJCQljb250aW51ZTsKCgkJaWYgKGFsaWdubWVudCkgewoJCQlyZWdpc3RlciB1bnNpZ25lZCB0bXAgPSBlbnRyeS0+c3RhcnQgJSBhbGlnbm1lbnQ7CgkJCWlmICh0bXApCgkJCQl3YXN0ZWQgKz0gYWxpZ25tZW50IC0gdG1wOwoJCX0KCgoJCWlmIChlbnRyeS0+c2l6ZSA+PSBzaXplICsgd2FzdGVkKSB7CgkJCWlmICghYmVzdF9tYXRjaCkKCQkJCXJldHVybiBlbnRyeTsKCQkJaWYgKHNpemUgPCBiZXN0X3NpemUpIHsKCQkJCWJlc3QgPSBlbnRyeTsKCQkJCWJlc3Rfc2l6ZSA9IGVudHJ5LT5zaXplOwoJCQl9CgkJfQoJfQoKCXJldHVybiBiZXN0Owp9CgppbnQgZHJtX21tX2NsZWFuKGRybV9tbV90ICogbW0pCnsKCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmbW0tPm1sX2VudHJ5OwoKCXJldHVybiAoaGVhZC0+bmV4dC0+bmV4dCA9PSBoZWFkKTsKfQoKaW50IGRybV9tbV9pbml0KGRybV9tbV90ICogbW0sIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKewoJSU5JVF9MSVNUX0hFQUQoJm1tLT5tbF9lbnRyeSk7CglJTklUX0xJU1RfSEVBRCgmbW0tPmZsX2VudHJ5KTsKCglyZXR1cm4gZHJtX21tX2NyZWF0ZV90YWlsX25vZGUobW0sIHN0YXJ0LCBzaXplKTsKfQoKRVhQT1JUX1NZTUJPTChkcm1fbW1faW5pdCk7Cgp2b2lkIGRybV9tbV90YWtlZG93bihkcm1fbW1fdCAqIG1tKQp7CglzdHJ1Y3QgbGlzdF9oZWFkICpibm9kZSA9IG1tLT5mbF9lbnRyeS5uZXh0OwoJZHJtX21tX25vZGVfdCAqZW50cnk7CgoJZW50cnkgPSBsaXN0X2VudHJ5KGJub2RlLCBkcm1fbW1fbm9kZV90LCBmbF9lbnRyeSk7CgoJaWYgKGVudHJ5LT5tbF9lbnRyeS5uZXh0ICE9ICZtbS0+bWxfZW50cnkgfHwKCSAgICBlbnRyeS0+ZmxfZW50cnkubmV4dCAhPSAmbW0tPmZsX2VudHJ5KSB7CgkJRFJNX0VSUk9SKCJNZW1vcnkgbWFuYWdlciBub3QgY2xlYW4uIERlbGF5aW5nIHRha2Vkb3duXG4iKTsKCQlyZXR1cm47Cgl9CgoJbGlzdF9kZWwoJmVudHJ5LT5mbF9lbnRyeSk7CglsaXN0X2RlbCgmZW50cnktPm1sX2VudHJ5KTsKCglkcm1fZnJlZShlbnRyeSwgc2l6ZW9mKCplbnRyeSksIERSTV9NRU1fTU0pOwp9CgpFWFBPUlRfU1lNQk9MKGRybV9tbV90YWtlZG93bik7Cg==