LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqIENvcHlyaWdodCAyMDA2IFR1bmdzdGVuIEdyYXBoaWNzLCBJbmMuLCBCaXNtYWNrLCBORC4gVVNBLgogKiBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYQogKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlCiAqICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcKICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAogKiBkaXN0cmlidXRlLCBzdWIgbGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCiAqIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0bwogKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CiAqCiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIChpbmNsdWRpbmcgdGhlCiAqIG5leHQgcGFyYWdyYXBoKSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zCiAqIG9mIHRoZSBTb2Z0d2FyZS4KICoKICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTAogKiBUSEUgQ09QWVJJR0hUIEhPTERFUlMsIEFVVEhPUlMgQU5EL09SIElUUyBTVVBQTElFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCiAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgogKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFCiAqIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCiAqCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyoKICogU2ltcGxlIG9wZW4gaGFzaCB0YWIgaW1wbGVtZW50YXRpb24uCiAqCiAqIEF1dGhvcnM6CiAqIFRob21hcyBIZWxsc3Ry9m0gPHRob21hcy1hdC10dW5nc3RlbmdyYXBoaWNzLWRvdC1jb20+CiAqLwoKI2lmbmRlZiBEUk1fSEFTSFRBQl9ICiNkZWZpbmUgRFJNX0hBU0hUQUJfSAoKI2RlZmluZSBkcm1faGFzaF9lbnRyeShfcHRyLCBfdHlwZSwgX21lbWJlcikgY29udGFpbmVyX29mKF9wdHIsIF90eXBlLCBfbWVtYmVyKQoKdHlwZWRlZiBzdHJ1Y3QgZHJtX2hhc2hfaXRlbXsKCXN0cnVjdCBobGlzdF9ub2RlIGhlYWQ7Cgl1bnNpZ25lZCBsb25nIGtleTsKfSBkcm1faGFzaF9pdGVtX3Q7Cgp0eXBlZGVmIHN0cnVjdCBkcm1fb3Blbl9oYXNoewoJdW5zaWduZWQgaW50IHNpemU7Cgl1bnNpZ25lZCBpbnQgb3JkZXI7Cgl1bnNpZ25lZCBpbnQgZmlsbDsKCXN0cnVjdCBobGlzdF9oZWFkICp0YWJsZTsKfSBkcm1fb3Blbl9oYXNoX3Q7CgoKZXh0ZXJuIGludCBkcm1faHRfY3JlYXRlKGRybV9vcGVuX2hhc2hfdCAqaHQsIHVuc2lnbmVkIGludCBvcmRlcik7CmV4dGVybiBpbnQgZHJtX2h0X2luc2VydF9pdGVtKGRybV9vcGVuX2hhc2hfdCAqaHQsIGRybV9oYXNoX2l0ZW1fdCAqaXRlbSk7CmV4dGVybiBpbnQgZHJtX2h0X2p1c3RfaW5zZXJ0X3BsZWFzZShkcm1fb3Blbl9oYXNoX3QgKmh0LCBkcm1faGFzaF9pdGVtX3QgKml0ZW0sCgkJCQkgICAgIHVuc2lnbmVkIGxvbmcgc2VlZCwgaW50IGJpdHMsIGludCBzaGlmdCwKCQkJCSAgICAgdW5zaWduZWQgbG9uZyBhZGQpOwpleHRlcm4gaW50IGRybV9odF9maW5kX2l0ZW0oZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgbG9uZyBrZXksIGRybV9oYXNoX2l0ZW1fdCAqKml0ZW0pOwoKZXh0ZXJuIHZvaWQgZHJtX2h0X3ZlcmJvc2VfbGlzdChkcm1fb3Blbl9oYXNoX3QgKmh0LCB1bnNpZ25lZCBsb25nIGtleSk7CmV4dGVybiBpbnQgZHJtX2h0X3JlbW92ZV9rZXkoZHJtX29wZW5faGFzaF90ICpodCwgdW5zaWduZWQgbG9uZyBrZXkpOwpleHRlcm4gaW50IGRybV9odF9yZW1vdmVfaXRlbShkcm1fb3Blbl9oYXNoX3QgKmh0LCBkcm1faGFzaF9pdGVtX3QgKml0ZW0pOwpleHRlcm4gdm9pZCBkcm1faHRfcmVtb3ZlKGRybV9vcGVuX2hhc2hfdCAqaHQpOwoKCiNlbmRpZgoK