LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBGaWxlbmFtZTogICAgICBpcnF1ZXVlLmMKICogVmVyc2lvbjogICAgICAgMC4zCiAqIERlc2NyaXB0aW9uOiAgIEdlbmVyYWwgcXVldWUgaW1wbGVtZW50YXRpb24KICogU3RhdHVzOiAgICAgICAgRXhwZXJpbWVudGFsLgogKiBBdXRob3I6ICAgICAgICBEYWcgQnJhdHRsaSA8ZGFnYkBjcy51aXQubm8+CiAqIENyZWF0ZWQgYXQ6ICAgIFR1ZSBKdW4gIDkgMTM6Mjk6MzEgMTk5OAogKiBNb2RpZmllZCBhdDogICBTdW4gRGVjIDEyIDEzOjQ4OjIyIDE5OTkKICogTW9kaWZpZWQgYnk6ICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBNb2RpZmllZCBhdDogICBUaHUgSmFuICA0IDE0OjI5OjEwIENFVCAyMDAxCiAqIE1vZGlmaWVkIGJ5OiAgIE1hcmMgWnluZ2llciA8bXp5bmdpZXJAZnJlZXN1cmYuZnI+CiAqCiAqICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OSwgQWFnZSBLdmFsbmVzIDxhYWdlQGNzLnVpdC5ubz4KICogICAgIENvcHlyaWdodCAoQykgMTk5OCwgRGFnIEJyYXR0bGksCiAqICAgICBBbGwgUmlnaHRzIFJlc2VydmVkLgogKgogKiAgICAgVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gdGhlIFZvcnRleCBPcGVyYXRpbmcgU3lzdGVtIHdyaXR0ZW4gYnkgQWFnZQogKiAgICAgS3ZhbG5lcy4gQWFnZSBoYXMgYWdyZWVkIHRoYXQgdGhpcyBjb2RlIGNhbiB1c2UgdGhlIEdQTCBsaWNlbmNlLAogKiAgICAgYWx0aG91Z2ggaGUgZG9lcyBub3QgdXNlIHRoYXQgbGljZW5jZSBpbiBoaXMgb3duIGNvZGUuCiAqCiAqICAgICBUaGlzIGNvcHlyaWdodCBkb2VzIGhvd2V2ZXIgX25vdF8gaW5jbHVkZSB0aGUgRUxGIGhhc2goKSBmdW5jdGlvbgogKiAgICAgd2hpY2ggSSBjdXJyZW50bHkgZG9uJ3Qga25vdyB3aGljaCBsaWNlbmNlIG9yIGNvcHlyaWdodCBpdAogKiAgICAgaGFzLiBQbGVhc2UgaW5mb3JtIG1lIGlmIHlvdSBrbm93LgogKgogKiAgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogICAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqICAgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogICAgIE5laXRoZXIgRGFnIEJyYXR0bGkgbm9yIFVuaXZlcnNpdHkgb2YgVHJvbXP4IGFkbWl0IGxpYWJpbGl0eSBub3IKICogICAgIHByb3ZpZGUgd2FycmFudHkgZm9yIGFueSBvZiB0aGlzIHNvZnR3YXJlLiBUaGlzIG1hdGVyaWFsIGlzCiAqICAgICBwcm92aWRlZCAiQVMtSVMiIGFuZCBhdCBubyBjaGFyZ2UuCiAqCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAqIE5PVEUgOgogKiBUaGVyZSBhcmUgdmFyaW91cyBwcm9ibGVtcyB3aXRoIHRoaXMgcGFja2FnZSA6CiAqCW8gdGhlIGhhc2ggZnVuY3Rpb24gZm9yIGludHMgaXMgcGF0aGV0aWMgKGJ1dCBjb3VsZCBiZSBjaGFuZ2VkKQogKglvIGxvY2tpbmcgaXMgc29tZXRpbWUgc3VzcGljaW91cyAoZXNwZWNpYWxseSBkdXJpbmcgZW51bWVyYXRpb24pCiAqCW8gbW9zdCB1c2VycyBoYXZlIG9ubHkgYSBmZXcgZWxlbWVudHMgKD09IG92ZXJoZWFkKQogKglvIG1vc3QgdXNlcnMgbmV2ZXIgdXNlIHNlYWNoLCBzbyBkb24ndCBiZW5lZml0IGZyb20gaGFzaGluZwogKiBQcm9ibGVtIGFscmVhZHkgZml4ZWQgOgogKglvIG5vdCA2NCBiaXQgY29tcGxpYW50IChtb3N0IHVzZXJzIGRvIGhhc2h2ID0gKGludCkgc2VsZikKICoJbyBoYXNoYmluX3JlbW92ZSgpIGlzIGJyb2tlbiA9PiB1c2UgaGFzaGJpbl9yZW1vdmVfdGhpcygpCiAqIEkgdGhpbmsgbW9zdCB1c2VycyB3b3VsZCBiZSBiZXR0ZXIgc2VydmVkIGJ5IGEgc2ltcGxlIGxpbmtlZCBsaXN0CiAqIChsaWtlIGluY2x1ZGUvbGludXgvbGlzdC5oKSB3aXRoIGEgZ2xvYmFsIHNwaW5sb2NrIHBlciBsaXN0LgogKiBKZWFuIElJCiAqLwoKLyoKICogTm90ZXMgb24gdGhlIGNvbmN1cnJlbnQgYWNjZXNzIHRvIGhhc2hiaW4gYW5kIG90aGVyIFNNUCBpc3N1ZXMKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKglIYXNoYmlucyBhcmUgdmVyeSBvZnRlbiBpbiB0aGUgSXJEQSBzdGFjayBhIGdsb2JhbCByZXBvc2l0b3J5IG9mCiAqIGluZm9ybWF0aW9uLCBhbmQgdGhlcmVmb3JlIHVzZWQgaW4gYSB2ZXJ5IGFzeW5jaHJvbm91cyBtYW5uZXIgZm9sbG93aW5nCiAqIHZhcmlvdXMgZXZlbnRzIChkcml2ZXIgY2FsbHMsIHRpbWVycywgdXNlciBjYWxscy4uLikuCiAqCVRoZXJlZm9yZSwgdmVyeSBvZnRlbiBpdCBpcyBoaWdobHkgaW1wb3J0YW50IHRvIGNvbnNpZGVyIHRoZQogKiBtYW5hZ2VtZW50IG9mIGNvbmN1cnJlbnQgYWNjZXNzIHRvIHRoZSBoYXNoYmluIGFuZCBob3cgdG8gZ3VhcmFudGVlIHRoZQogKiBjb25zaXN0ZW5jeSBvZiB0aGUgb3BlcmF0aW9ucyBvbiBpdC4KICoKICoJRmlyc3QsIHdlIG5lZWQgdG8gZGVmaW5lIHRoZSBvYmplY3RpdmUgb2YgbG9ja2luZyA6CiAqCQkxKSBQcm90ZWN0IHVzZXIgZGF0YSAoY29udGVudCBwb2ludGVkIGJ5IHRoZSBoYXNoYmluKQogKgkJMikgUHJvdGVjdCBoYXNoYmluIHN0cnVjdHVyZSBpdHNlbGYgKGxpbmtlZCBsaXN0IGluIGVhY2ggYmluKQogKgogKgkJCSAgICAgT0xEIExPQ0tJTkcKICoJCQkgICAgIC0tLS0tLS0tLS0tCiAqCiAqCVRoZSBwcmV2aW91cyBsb2NraW5nIHN0cmF0ZWd5LCBlaXRoZXIgSEJfTE9DQUwgb3IgSEJfR0xPQkFMIHdlcmUKICogYm90aCBpbmFkZXF1YXRlIGluICpib3RoKiBhc3BlY3QuCiAqCQlvIEhCX0dMT0JBTCB3YXMgdXNpbmcgYSBzcGlubG9jayBmb3IgZWFjaCBiaW4gKGxvY2FsIGxvY2tpbmcpLgogKgkJbyBIQl9MT0NBTCB3YXMgZGlzYWJsaW5nIGlycSBvbiAqYWxsKiBDUFVzLCBzbyB1c2UgYSBzaW5nbGUKICoJCSAgZ2xvYmFsIHNlbWFwaG9yZS4KICoJVGhlIHByb2JsZW1zIHdlcmUgOgogKgkJQSkgR2xvYmFsIGlycSBkaXNhYmxpbmcgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBieSB0aGUga2VybmVsCiAqCQlCKSBObyBwcm90ZWN0aW9uIGZvciB0aGUgaGFzaGJpbiBzdHJ1Y3QgZ2xvYmFsIGRhdGEKICoJCQlvIGhhc2hiaW5fZGVsZXRlKCkKICoJCQlvIGhiX2N1cnJlbnQKICoJCUMpIE5vIHByb3RlY3Rpb24gZm9yIHVzZXIgZGF0YSBpbiBzb21lIGNhc2VzCiAqCiAqCUEpIEhCX0xPQ0FMIHVzZSBnbG9iYWwgaXJxIGRpc2FibGluZywgc28gZG9lc24ndCB3b3JrIG9uIGtlcm5lbAogKiAyLjUuWC4gRXZlbiB3aGVuIGl0IGlzIHN1cHBvcnRlZCAoa2VybmVsIDIuNC5YIGFuZCBlYXJsaWVyKSwgaXRzCiAqIHBlcmZvcm1hbmNlIGlzIG5vdCBzYXRpc2ZhY3Rvcnkgb24gU01QIHNldHVwcy4gTW9zdCBoYXNoYmlucyB3ZXJlCiAqIEhCX0xPQ0FMLCBzbyAoQSkgZGVmaW5pdGVseSBuZWVkIGZpeGluZy4KICoJQikgSEJfTE9DQUwgY291bGQgYmUgbW9kaWZpZWQgdG8gZml4IChCKS4gSG93ZXZlciwgYmVjYXVzZSBIQl9HTE9CQUwKICogbG9jayBvbmx5IHRoZSBpbmRpdmlkdWFsIGJpbnMsIGl0IHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBsb2NrIHRoZQogKiBnbG9iYWwgZGF0YSwgc28gY2FuJ3QgZG8gKEIpLgogKglDKSBTb21lIGZ1bmN0aW9ucyByZXR1cm4gcG9pbnRlciB0byBkYXRhIHRoYXQgaXMgc3RpbGwgaW4gdGhlCiAqIGhhc2hiaW4gOgogKgkJbyBoYXNoYmluX2ZpbmQoKQogKgkJbyBoYXNoYmluX2dldF9maXJzdCgpCiAqCQlvIGhhc2hiaW5fZ2V0X25leHQoKQogKglBcyB0aGUgZGF0YSBpcyBzdGlsbCBpbiB0aGUgaGFzaGJpbiwgaXQgbWF5IGJlIGNoYW5nZWQgb3IgZnJlZSdkCiAqIHdoaWxlIHRoZSBjYWxsZXIgaXMgZXhhbWluaW1nIHRoZSBkYXRhLiBJbiB0aG9zZSBjYXNlLCBsb2NraW5nIGNhbid0CiAqIGJlIGRvbmUgd2l0aGluIHRoZSBoYXNoYmluLCBidXQgbXVzdCBpbmNsdWRlIHVzZSBvZiB0aGUgZGF0YSB3aXRoaW4KICogdGhlIGNhbGxlci4KICoJVGhlIGNhbGxlciBjYW4gZWFzaWx5IGRvIHRoaXMgd2l0aCBIQl9MT0NBTCAoanVzdCBkaXNhYmxlIGlycXMpLgogKiBIb3dldmVyLCB0aGlzIGlzIGltcG9zc2libGUgd2l0aCBIQl9HTE9CQUwgYmVjYXVzZSB0aGUgY2FsbGVyIGhhcyBubwogKiB3YXkgdG8ga25vdyB0aGUgcHJvcGVyIGJpbiwgc28gZG9uJ3Qga25vdyB3aGljaCBzcGlubG9jayB0byB1c2UuCiAqCiAqCVF1aWNrIHN1bW1hcnkgOiBjYW4gbm8gbG9uZ2VyIHVzZSBIQl9MT0NBTCwgYW5kIEhCX0dMT0JBTCBpcwogKiBmdW5kYW1lbnRhbGx5IGJyb2tlbiBhbmQgd2lsbCBuZXZlciB3b3JrLgogKgogKgkJCSAgICAgTkVXIExPQ0tJTkcKICoJCQkgICAgIC0tLS0tLS0tLS0tCiAqCiAqCVRvIGZpeCB0aG9zZSBwcm9ibGVtcywgSSd2ZSBpbnRyb2R1Y2UgYSBmZXcgY2hhbmdlcyBpbiB0aGUKICogaGFzaGJpbiBsb2NraW5nIDoKICoJCTEpIE5ldyBIQl9MT0NLIHNjaGVtZQogKgkJMikgaGFzaGJpbi0+aGJfc3BpbmxvY2sKICoJCTMpIE5ldyBoYXNoYmluIHVzYWdlIHBvbGljeQogKgogKiBIQl9MT0NLIDoKICogLS0tLS0tLQogKglIQl9MT0NLIGlzIGEgbG9ja2luZyBzY2hlbWUgaW50ZXJtZWRpYXRlIGJldHdlZW4gdGhlIG9sZCBIQl9MT0NBTAogKiBhbmQgSEJfR0xPQkFMLiBJdCB1c2VzIGEgc2luZ2xlIHNwaW5sb2NrIHRvIHByb3RlY3QgdGhlIHdob2xlIGNvbnRlbnQKICogb2YgdGhlIGhhc2hiaW4uIEFzIGl0IGlzIGEgc2luZ2xlIHNwaW5sb2NrLCBpdCBjYW4gcHJvdGVjdCB0aGUgZ2xvYmFsCiAqIGRhdGEgb2YgdGhlIGhhc2hiaW4gYW5kIG5vdCBvbmx5IHRoZSBiaW5zIHRoZW1zZWx2ZXMuCiAqCUhCX0xPQ0sgY2FuIG9ubHkgcHJvdGVjdCBzb21lIG9mIHRoZSBoYXNoYmluIGNhbGxzLCBzbyBpdCBvbmx5IGxvY2sKICogY2FsbCB0aGF0IGNhbiBiZSBtYWRlIDEwMCUgc2FmZSBhbmQgbGVhdmUgb3RoZXIgY2FsbCB1bnByb3RlY3RlZC4KICoJSEJfTE9DSyBpbiB0aGVvcnkgaXMgc2xvd2VyIHRoYW4gSEJfR0xPQkFMLCBidXQgYXMgdGhlIGhhc2hiaW4KICogY29udGVudCBpcyBhbHdheXMgc21hbGwgY29udGVudGlvbiBpcyBub3QgaGlnaCwgc28gaXQgZG9lc24ndCBtYXR0ZXIKICogbXVjaC4gSEJfTE9DSyBpcyBwcm9iYWJseSBmYXN0ZXIgdGhhbiBIQl9MT0NBTC4KICoKICogaGFzaGJpbi0+aGJfc3BpbmxvY2sgOgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLQogKglUaGUgc3BpbmxvY2sgdGhhdCBIQl9MT0NLIHVzZXMgaXMgYXZhaWxhYmxlIGZvciBjYWxsZXIsIHNvIHRoYXQKICogdGhlIGNhbGxlciBjYW4gcHJvdGVjdCB1bnByb3RlY3RlZCBjYWxscyAoc2VlIGJlbG93KS4KICoJSWYgdGhlIGNhbGxlciB3YW50IHRvIGRvIGVudGlyZWx5IGl0cyBvd24gbG9ja2luZyAoSEJfTk9MT0NLKSwgaGUKICogY2FuIGRvIHNvIGFuZCBtYXkgdXNlIHNhZmVseSB0aGlzIHNwaW5sb2NrLgogKglMb2NraW5nIGlzIGRvbmUgbGlrZSB0aGlzIDoKICoJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwogKglSZWxlYXNpbmcgdGhlIGxvY2sgOgogKgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKICoKICogU2FmZSAmIFByb3RlY3RlZCBjYWxscyA6CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoJVGhlIGZvbGxvd2luZyBjYWxscyBhcmUgc2FmZSBvciBwcm90ZWN0ZWQgdmlhIEhCX0xPQ0sgOgogKgkJbyBoYXNoYmluX25ldygpCQktPiBzYWZlCiAqCQlvIGhhc2hiaW5fZGVsZXRlKCkKICoJCW8gaGFzaGJpbl9pbnNlcnQoKQogKgkJbyBoYXNoYmluX3JlbW92ZV9maXJzdCgpCiAqCQlvIGhhc2hiaW5fcmVtb3ZlKCkKICoJCW8gaGFzaGJpbl9yZW1vdmVfdGhpcygpCiAqCQlvIEhBU0hCSU5fR0VUX1NJWkUoKQktPiBhdG9taWMKICoKICoJVGhlIGZvbGxvd2luZyBjYWxscyBvbmx5IHByb3RlY3QgdGhlIGhhc2hiaW4gaXRzZWxmIDoKICoJCW8gaGFzaGJpbl9sb2NrX2ZpbmQoKQogKgkJbyBoYXNoYmluX2ZpbmRfbmV4dCgpCiAqCiAqIFVucHJvdGVjdGVkIGNhbGxzIDoKICogLS0tLS0tLS0tLS0tLS0tLS0KICoJVGhlIGZvbGxvd2luZyBjYWxscyBuZWVkIHRvIGJlIHByb3RlY3RlZCBieSB0aGUgY2FsbGVyIDoKICoJCW8gaGFzaGJpbl9maW5kKCkKICoJCW8gaGFzaGJpbl9nZXRfZmlyc3QoKQogKgkJbyBoYXNoYmluX2dldF9uZXh0KCkKICoKICogTG9ja2luZyBQb2xpY3kgOgogKiAtLS0tLS0tLS0tLS0tLQogKglJZiB0aGUgaGFzaGJpbiBpcyB1c2VkIG9ubHkgaW4gYSBzaW5nbGUgdGhyZWFkIG9mIGV4ZWN1dGlvbgogKiAoZXhwbGljaXRseSBvciBpbXBsaWNpdGVseSksIHlvdSBjYW4gdXNlIEhCX05PTE9DSwogKglJZiB0aGUgY2FsbGluZyBtb2R1bGUgYWxyZWFkeSBwcm92aWRlIGNvbmN1cnJlbnQgYWNjZXNzIHByb3RlY3Rpb24sCiAqIHlvdSBtYXkgdXNlIEhCX05PTE9DSy4KICoKICoJSW4gYWxsIG90aGVyIGNhc2VzLCB5b3UgbmVlZCB0byB1c2UgSEJfTE9DSyBhbmQgbG9jayB0aGUgaGFzaGJpbgogKiBldmVyeSB0aW1lIGJlZm9yZSBjYWxsaW5nIG9uZSBvZiB0aGUgdW5wcm90ZWN0ZWQgY2FsbHMuIFlvdSBhbHNvIG11c3QKICogdXNlIHRoZSBwb2ludGVyIHJldHVybmVkIGJ5IHRoZSB1bnByb3RlY3RlZCBjYWxsIHdpdGhpbiB0aGUgbG9ja2VkCiAqIHJlZ2lvbi4KICoKICogRXh0cmEgY2FyZSBmb3IgZW51bWVyYXRpb24gOgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKgloYXNoYmluX2dldF9maXJzdCgpIGFuZCBoYXNoYmluX2dldF9uZXh0KCkgdXNlIHRoZSBoYXNoYmluIHRvCiAqIHN0b3JlIHRoZSBjdXJyZW50IHBvc2l0aW9uLCBpbiBoYl9jdXJyZW50LgogKglBcyBsb25nIGFzIHRoZSBoYXNoYmluIHJlbWFpbnMgbG9ja2VkLCB0aGlzIGlzIHNhZmUuIElmIHlvdSB1bmxvY2sKICogdGhlIGhhc2hiaW4sIHRoZSBjdXJyZW50IHBvc2l0aW9uIG1heSBjaGFuZ2UgaWYgYW55Ym9keSBlbHNlIG1vZGlmeQogKiBvciBlbnVtZXJhdGUgdGhlIGhhc2hiaW4uCiAqCVN1bW1hcnkgOiBkbyB0aGUgZnVsbCBlbnVtZXJhdGlvbiB3aGlsZSBsb2NrZWQuCiAqCiAqCUFsdGVybmF0aXZlbHksIHlvdSBtYXkgdXNlIGhhc2hiaW5fZmluZF9uZXh0KCkuIEJ1dCwgdGhpcyB3aWxsCiAqIGJlIHNsb3dlciwgaXMgbW9yZSBjb21wbGV4IHRvIHVzZSBhbmQgZG9lc24ndCBwcm90ZWN0IHRoZSBoYXNoYmluCiAqIGNvbnRlbnQuIFNvLCBjYXJlIGlzIG5lZWRlZCBoZXJlIGFzIHdlbGwuCiAqCiAqIE90aGVyIGlzc3VlcyA6CiAqIC0tLS0tLS0tLS0tLQogKglJIGJlbGlldmUgdGhhdCB3ZSBhcmUgb3ZlcmRvaW5nIGl0IGJ5IHVzaW5nIHNwaW5fbG9ja19pcnFzYXZlKCkKICogYW5kIHdlIHNob3VsZCB1c2Ugb25seSBzcGluX2xvY2tfYmgoKSBvciBzaW1pbGFyLiBCdXQsIEkgZG9uJ3QgaGF2ZQogKiB0aGUgYmFsbHMgdG8gdHJ5IGl0IG91dC4KICoJRG9uJ3QgYmVsaWV2ZSB0aGF0IGJlY2F1c2UgaGFzaGJpbiBhcmUgbm93IChzb21ld2hhdCkgU01QIHNhZmUKICogdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29kZSBpcy4gSGlnaGVyIGxheWVycyB0ZW5kIHRvIGJlIHNhZmVzdCwKICogYnV0IExBUCBhbmQgTE1QIHdvdWxkIG5lZWQgc29tZSBzZXJpb3VzIGRlZGljYXRlZCBsb3ZlLgogKgogKiBKZWFuIElJCiAqLwojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CgojaW5jbHVkZSA8bmV0L2lyZGEvaXJkYS5oPgojaW5jbHVkZSA8bmV0L2lyZGEvaXJxdWV1ZS5oPgoKLyoqKioqKioqKioqKioqKioqKioqKioqKiBRVUVVRSBTVUJST1VUSU5FUyAqKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBIYXNoYmluCiAqLwojZGVmaW5lIEdFVF9IQVNIQklOKHgpICggeCAmIEhBU0hCSU5fTUFTSyApCgovKgogKiBGdW5jdGlvbiBoYXNoIChuYW1lKQogKgogKiAgICBUaGlzIGZ1bmN0aW9uIGhhc2ggdGhlIGlucHV0IHN0cmluZyAnbmFtZScgdXNpbmcgdGhlIEVMRiBoYXNoCiAqICAgIGZ1bmN0aW9uIGZvciBzdHJpbmdzLgogKi8Kc3RhdGljIF9fdTMyIGhhc2goIGNvbnN0IGNoYXIqIG5hbWUpCnsKCV9fdTMyIGggPSAwOwoJX191MzIgZzsKCgl3aGlsZSgqbmFtZSkgewoJCWggPSAoaDw8NCkgKyAqbmFtZSsrOwoJCWlmICgoZyA9IChoICYgMHhmMDAwMDAwMCkpKQoJCQloIF49Zz4+MjQ7CgkJaCAmPX5nOwoJfQoJcmV0dXJuIGg7Cn0KCi8qCiAqIEZ1bmN0aW9uIGVucXVldWVfZmlyc3QgKHF1ZXVlLCBwcm9jKQogKgogKiAgICBJbnNlcnQgaXRlbSBmaXJzdCBpbiBxdWV1ZS4KICoKICovCnN0YXRpYyB2b2lkIGVucXVldWVfZmlyc3QoaXJkYV9xdWV1ZV90ICoqcXVldWUsIGlyZGFfcXVldWVfdCogZWxlbWVudCkKewoKCUlSREFfREVCVUcoIDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCS8qCgkgKiBDaGVjayBpZiBxdWV1ZSBpcyBlbXB0eS4KCSAqLwoJaWYgKCAqcXVldWUgPT0gTlVMTCApIHsKCQkvKgoJCSAqIFF1ZXVlIGlzIGVtcHR5LiAgSW5zZXJ0IG9uZSBlbGVtZW50IGludG8gdGhlIHF1ZXVlLgoJCSAqLwoJCWVsZW1lbnQtPnFfbmV4dCA9IGVsZW1lbnQtPnFfcHJldiA9ICpxdWV1ZSA9IGVsZW1lbnQ7CgoJfSBlbHNlIHsKCQkvKgoJCSAqIFF1ZXVlIGlzIG5vdCBlbXB0eS4gIEluc2VydCBlbGVtZW50IGludG8gZnJvbnQgb2YgcXVldWUuCgkJICovCgkJZWxlbWVudC0+cV9uZXh0ICAgICAgICAgID0gKCpxdWV1ZSk7CgkJKCpxdWV1ZSktPnFfcHJldi0+cV9uZXh0ID0gZWxlbWVudDsKCQllbGVtZW50LT5xX3ByZXYgICAgICAgICAgPSAoKnF1ZXVlKS0+cV9wcmV2OwoJCSgqcXVldWUpLT5xX3ByZXYgICAgICAgICA9IGVsZW1lbnQ7CgkJKCpxdWV1ZSkgICAgICAgICAgICAgICAgID0gZWxlbWVudDsKCX0KfQoKCi8qCiAqIEZ1bmN0aW9uIGRlcXVldWUgKHF1ZXVlKQogKgogKiAgICBSZW1vdmUgZmlyc3QgZW50cnkgaW4gcXVldWUKICoKICovCnN0YXRpYyBpcmRhX3F1ZXVlX3QgKmRlcXVldWVfZmlyc3QoaXJkYV9xdWV1ZV90ICoqcXVldWUpCnsKCWlyZGFfcXVldWVfdCAqcmV0OwoKCUlSREFfREVCVUcoIDQsICJkZXF1ZXVlX2ZpcnN0KClcbiIpOwoKCS8qCgkgKiBTZXQgcmV0dXJuIHZhbHVlCgkgKi8KCXJldCA9ICAqcXVldWU7CgoJaWYgKCAqcXVldWUgPT0gTlVMTCApIHsKCQkvKgoJCSAqIFF1ZXVlIHdhcyBlbXB0eS4KCQkgKi8KCX0gZWxzZSBpZiAoICgqcXVldWUpLT5xX25leHQgPT0gKnF1ZXVlICkgewoJCS8qCgkJICogIFF1ZXVlIG9ubHkgY29udGFpbmVkIGEgc2luZ2xlIGVsZW1lbnQuIEl0IHdpbGwgbm93IGJlCgkJICogIGVtcHR5LgoJCSAqLwoJCSpxdWV1ZSA9IE5VTEw7Cgl9IGVsc2UgewoJCS8qCgkJICogUXVldWUgY29udGFpbmVkIHNldmVyYWwgZWxlbWVudC4gIFJlbW92ZSB0aGUgZmlyc3Qgb25lLgoJCSAqLwoJCSgqcXVldWUpLT5xX3ByZXYtPnFfbmV4dCA9ICgqcXVldWUpLT5xX25leHQ7CgkJKCpxdWV1ZSktPnFfbmV4dC0+cV9wcmV2ID0gKCpxdWV1ZSktPnFfcHJldjsKCQkqcXVldWUgPSAoKnF1ZXVlKS0+cV9uZXh0OwoJfQoKCS8qCgkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgZW50cnkgKG9yIE5VTEwgb2YgcXVldWUgd2FzIGVtcHR5KS4KCSAqLwoJcmV0dXJuIHJldDsKfQoKLyoKICogRnVuY3Rpb24gZGVxdWV1ZV9nZW5lcmFsIChxdWV1ZSwgZWxlbWVudCkKICoKICoKICovCnN0YXRpYyBpcmRhX3F1ZXVlX3QgKmRlcXVldWVfZ2VuZXJhbChpcmRhX3F1ZXVlX3QgKipxdWV1ZSwgaXJkYV9xdWV1ZV90KiBlbGVtZW50KQp7CglpcmRhX3F1ZXVlX3QgKnJldDsKCglJUkRBX0RFQlVHKCA0LCAiZGVxdWV1ZV9nZW5lcmFsKClcbiIpOwoKCS8qCgkgKiBTZXQgcmV0dXJuIHZhbHVlCgkgKi8KCXJldCA9ICAqcXVldWU7CgoJaWYgKCAqcXVldWUgPT0gTlVMTCApIHsKCQkvKgoJCSAqIFF1ZXVlIHdhcyBlbXB0eS4KCQkgKi8KCX0gZWxzZSBpZiAoICgqcXVldWUpLT5xX25leHQgPT0gKnF1ZXVlICkgewoJCS8qCgkJICogIFF1ZXVlIG9ubHkgY29udGFpbmVkIGEgc2luZ2xlIGVsZW1lbnQuIEl0IHdpbGwgbm93IGJlCgkJICogIGVtcHR5LgoJCSAqLwoJCSpxdWV1ZSA9IE5VTEw7CgoJfSBlbHNlIHsKCQkvKgoJCSAqICBSZW1vdmUgc3BlY2lmaWMgZWxlbWVudC4KCQkgKi8KCQllbGVtZW50LT5xX3ByZXYtPnFfbmV4dCA9IGVsZW1lbnQtPnFfbmV4dDsKCQllbGVtZW50LT5xX25leHQtPnFfcHJldiA9IGVsZW1lbnQtPnFfcHJldjsKCQlpZiAoICgqcXVldWUpID09IGVsZW1lbnQpCgkJCSgqcXVldWUpID0gZWxlbWVudC0+cV9uZXh0OwoJfQoKCS8qCgkgKiBSZXR1cm4gdGhlIHJlbW92ZWQgZW50cnkgKG9yIE5VTEwgb2YgcXVldWUgd2FzIGVtcHR5KS4KCSAqLwoJcmV0dXJuIHJldDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKiBIQVNIQklOIE1BTkFHRU1FTlQgKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9jcmVhdGUgKCB0eXBlLCBuYW1lICkKICoKICogICAgQ3JlYXRlIGhhc2hiaW4hCiAqCiAqLwpoYXNoYmluX3QgKmhhc2hiaW5fbmV3KGludCB0eXBlKQp7CgloYXNoYmluX3QqIGhhc2hiaW47CgoJLyoKCSAqIEFsbG9jYXRlIG5ldyBoYXNoYmluCgkgKi8KCWhhc2hiaW4gPSBremFsbG9jKHNpemVvZigqaGFzaGJpbiksIEdGUF9BVE9NSUMpOwoJaWYgKCFoYXNoYmluKQoJCXJldHVybiBOVUxMOwoKCS8qCgkgKiBJbml0aWFsaXplIHN0cnVjdHVyZQoJICovCgloYXNoYmluLT5oYl90eXBlID0gdHlwZTsKCWhhc2hiaW4tPm1hZ2ljID0gSEJfTUFHSUM7CgkvL2hhc2hiaW4tPmhiX2N1cnJlbnQgPSBOVUxMOwoKCS8qIE1ha2Ugc3VyZSBhbGwgc3BpbmxvY2sncyBhcmUgdW5sb2NrZWQgKi8KCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CgkJc3Bpbl9sb2NrX2luaXQoJmhhc2hiaW4tPmhiX3NwaW5sb2NrKTsKCX0KCglyZXR1cm4gaGFzaGJpbjsKfQpFWFBPUlRfU1lNQk9MKGhhc2hiaW5fbmV3KTsKCgovKgogKiBGdW5jdGlvbiBoYXNoYmluX2RlbGV0ZSAoaGFzaGJpbiwgZnJlZV9mdW5jKQogKgogKiAgICBEZXN0cm95IGhhc2hiaW4sIHRoZSBmcmVlX2Z1bmMgY2FuIGJlIGEgdXNlciBzdXBwbGllZCBzcGVjaWFsIHJvdXRpbmUKICogICAgZm9yIGRlYWxsb2NhdGluZyB0aGlzIHN0cnVjdHVyZSBpZiBpdCdzIGNvbXBsZXguIElmIG5vdCB0aGUgdXNlciBjYW4KICogICAganVzdCBzdXBwbHkga2ZyZWUsIHdoaWNoIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhlIGpvYi4KICovCmludCBoYXNoYmluX2RlbGV0ZSggaGFzaGJpbl90KiBoYXNoYmluLCBGUkVFX0ZVTkMgZnJlZV9mdW5jKQp7CglpcmRhX3F1ZXVlX3QqIHF1ZXVlOwoJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CglpbnQgaTsKCglJUkRBX0FTU0VSVChoYXNoYmluICE9IE5VTEwsIHJldHVybiAtMTspOwoJSVJEQV9BU1NFUlQoaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiAtMTspOwoKCS8qIFN5bmNocm9uaXplICovCglpZiAoIGhhc2hiaW4tPmhiX3R5cGUgJiBIQl9MT0NLICkgewoJCXNwaW5fbG9ja19pcnFzYXZlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJfQoKCS8qCgkgKiAgRnJlZSB0aGUgZW50cmllcyBpbiB0aGUgaGFzaGJpbiwgVE9ETzogdXNlIGhhc2hiaW5fY2xlYXIgd2hlbgoJICogIGl0IGhhcyBiZWVuIHNob3duIHRvIHdvcmsKCSAqLwoJZm9yIChpID0gMDsgaSA8IEhBU0hCSU5fU0laRTsgaSArKyApIHsKCQlxdWV1ZSA9IGRlcXVldWVfZmlyc3QoKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbaV0pOwoJCXdoaWxlIChxdWV1ZSApIHsKCQkJaWYgKGZyZWVfZnVuYykKCQkJCSgqZnJlZV9mdW5jKShxdWV1ZSk7CgkJCXF1ZXVlID0gZGVxdWV1ZV9maXJzdCgKCQkJCShpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlW2ldKTsKCQl9Cgl9CgoJLyogQ2xlYW51cCBsb2NhbCBkYXRhICovCgloYXNoYmluLT5oYl9jdXJyZW50ID0gTlVMTDsKCWhhc2hiaW4tPm1hZ2ljID0gfkhCX01BR0lDOwoKCS8qIFJlbGVhc2UgbG9jayAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSykgewoJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7Cgl9CgoJLyoKCSAqICBGcmVlIHRoZSBoYXNoYmluIHN0cnVjdHVyZQoJICovCglrZnJlZShoYXNoYmluKTsKCglyZXR1cm4gMDsKfQpFWFBPUlRfU1lNQk9MKGhhc2hiaW5fZGVsZXRlKTsKCi8qKioqKioqKioqKioqKioqKioqKiogSEFTSEJJTiBMSVNUIE9QRVJBVElPTlMgKioqKioqKioqKioqKioqKioqKioqLwoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9pbnNlcnQgKGhhc2hiaW4sIGVudHJ5LCBuYW1lKQogKgogKiAgICBJbnNlcnQgYW4gZW50cnkgaW50byB0aGUgaGFzaGJpbgogKgogKi8Kdm9pZCBoYXNoYmluX2luc2VydChoYXNoYmluX3QqIGhhc2hiaW4sIGlyZGFfcXVldWVfdCogZW50cnksIGxvbmcgaGFzaHYsCgkJICAgIGNvbnN0IGNoYXIqIG5hbWUpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwoJaW50IGJpbjsKCglJUkRBX0RFQlVHKCA0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm47KTsKCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuOyk7CgoJLyoKCSAqIExvY2F0ZSBoYXNoYmluCgkgKi8KCWlmICggbmFtZSApCgkJaGFzaHYgPSBoYXNoKCBuYW1lICk7CgliaW4gPSBHRVRfSEFTSEJJTiggaGFzaHYgKTsKCgkvKiBTeW5jaHJvbml6ZSAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLwoKCS8qCgkgKiBTdG9yZSBuYW1lIGFuZCBrZXkKCSAqLwoJZW50cnktPnFfaGFzaCA9IGhhc2h2OwoJaWYgKCBuYW1lICkKCQlzdHJsY3B5KCBlbnRyeS0+cV9uYW1lLCBuYW1lLCBzaXplb2YoZW50cnktPnFfbmFtZSkpOwoKCS8qCgkgKiBJbnNlcnQgbmV3IGVudHJ5IGZpcnN0CgkgKi8KCWVucXVldWVfZmlyc3QoIChpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlWyBiaW4gXSwKCQkgICAgICAgZW50cnkpOwoJaGFzaGJpbi0+aGJfc2l6ZSsrOwoKCS8qIFJlbGVhc2UgbG9jayAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCn0KRVhQT1JUX1NZTUJPTChoYXNoYmluX2luc2VydCk7CgovKgogKiAgRnVuY3Rpb24gaGFzaGJpbl9yZW1vdmVfZmlyc3QgKGhhc2hiaW4pCiAqCiAqICAgIFJlbW92ZSBmaXJzdCBlbnRyeSBvZiB0aGUgaGFzaGJpbgogKgogKiBOb3RlIDogdGhpcyBmdW5jdGlvbiBubyBsb25nZXIgdXNlIGhhc2hiaW5fcmVtb3ZlKCksIGJ1dCBkb2VzIHRoaW5ncwogKiBzaW1pbGFyIHRvIGhhc2hiaW5fcmVtb3ZlX3RoaXMoKSwgc28gY2FuIGJlIGNvbnNpZGVyZWQgc2FmZS4KICogSmVhbiBJSQogKi8Kdm9pZCAqaGFzaGJpbl9yZW1vdmVfZmlyc3QoIGhhc2hiaW5fdCAqaGFzaGJpbikKewoJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CglpcmRhX3F1ZXVlX3QgKmVudHJ5ID0gTlVMTDsKCgkvKiBTeW5jaHJvbml6ZSAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLwoKCWVudHJ5ID0gaGFzaGJpbl9nZXRfZmlyc3QoIGhhc2hiaW4pOwoJaWYgKCBlbnRyeSAhPSBOVUxMKSB7CgkJaW50CWJpbjsKCQlsb25nCWhhc2h2OwoJCS8qCgkJICogTG9jYXRlIGhhc2hiaW4KCQkgKi8KCQloYXNodiA9IGVudHJ5LT5xX2hhc2g7CgkJYmluID0gR0VUX0hBU0hCSU4oIGhhc2h2ICk7CgoJCS8qCgkJICogRGVxdWV1ZSB0aGUgZW50cnkuLi4KCQkgKi8KCQlkZXF1ZXVlX2dlbmVyYWwoIChpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlWyBiaW4gXSwKCQkJCSAoaXJkYV9xdWV1ZV90KikgZW50cnkgKTsKCQloYXNoYmluLT5oYl9zaXplLS07CgkJZW50cnktPnFfbmV4dCA9IE5VTEw7CgkJZW50cnktPnFfcHJldiA9IE5VTEw7CgoJCS8qCgkJICogIENoZWNrIGlmIHRoaXMgaXRlbSBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIGFuZCBpbgoJCSAqICB0aGF0IGNhc2Ugd2UgbXVzdCByZXNldCBoYl9jdXJyZW50CgkJICovCgkJaWYgKCBlbnRyeSA9PSBoYXNoYmluLT5oYl9jdXJyZW50KQoJCQloYXNoYmluLT5oYl9jdXJyZW50ID0gTlVMTDsKCX0KCgkvKiBSZWxlYXNlIGxvY2sgKi8KCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLwoKCXJldHVybiBlbnRyeTsKfQoKCi8qCiAqICBGdW5jdGlvbiBoYXNoYmluX3JlbW92ZSAoaGFzaGJpbiwgaGFzaHYsIG5hbWUpCiAqCiAqICAgIFJlbW92ZSBlbnRyeSB3aXRoIHRoZSBnaXZlbiBuYW1lCiAqCiAqICBUaGUgdXNlIG9mIHRoaXMgZnVuY3Rpb24gaXMgaGlnaGx5IGRpc2NvdXJhZ2VkLCBiZWNhdXNlIHRoZSB3aG9sZQogKiAgY29uY2VwdCBiZWhpbmQgaGFzaGJpbl9yZW1vdmUoKSBpcyBicm9rZW4uIEluIG1hbnkgY2FzZXMsIGl0J3Mgbm90CiAqICBwb3NzaWJsZSB0byBndWFyYW50ZWUgdGhlIHVuaWNpdHkgb2YgdGhlIGluZGV4IChlaXRoZXIgaGFzaHYgb3IgbmFtZSksCiAqICBsZWFkaW5nIHRvIHJlbW92aW5nIHRoZSBXUk9ORyBlbnRyeS4KICogIFRoZSBvbmx5IHNpbXBsZSBzYWZlIHVzZSBpcyA6CiAqCQloYXNoYmluX3JlbW92ZShoYXNiaW4sIChpbnQpIHNlbGYsIE5VTEwpOwogKiAgSW4gb3RoZXIgY2FzZSwgeW91IG11c3QgdGhpbmsgaGFyZCB0byBndWFyYW50ZWUgdW5pY2l0eSBvZiB0aGUgaW5kZXguCiAqICBKZWFuIElJCiAqLwp2b2lkKiBoYXNoYmluX3JlbW92ZSggaGFzaGJpbl90KiBoYXNoYmluLCBsb25nIGhhc2h2LCBjb25zdCBjaGFyKiBuYW1lKQp7CglpbnQgYmluLCBmb3VuZCA9IEZBTFNFOwoJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CglpcmRhX3F1ZXVlX3QqIGVudHJ5OwoKCUlSREFfREVCVUcoIDQsICIlcygpXG4iLCBfX0ZVTkNUSU9OX18pOwoKCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CglJUkRBX0FTU0VSVCggaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiBOVUxMOyk7CgoJLyoKCSAqIExvY2F0ZSBoYXNoYmluCgkgKi8KCWlmICggbmFtZSApCgkJaGFzaHYgPSBoYXNoKCBuYW1lICk7CgliaW4gPSBHRVRfSEFTSEJJTiggaGFzaHYgKTsKCgkvKiBTeW5jaHJvbml6ZSAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX2xvY2tfaXJxc2F2ZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLwoKCS8qCgkgKiBTZWFyY2ggZm9yIGVudHJ5CgkgKi8KCWVudHJ5ID0gaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdOwoJaWYgKCBlbnRyeSApIHsKCQlkbyB7CgkJCS8qCgkJCSAqIENoZWNrIGZvciBrZXkKCQkJICovCgkJCWlmICggZW50cnktPnFfaGFzaCA9PSBoYXNodiApIHsKCQkJCS8qCgkJCQkgKiBOYW1lIGNvbXBhcmUgdG9vPwoJCQkJICovCgkJCQlpZiAoIG5hbWUgKSB7CgkJCQkJaWYgKCBzdHJjbXAoIGVudHJ5LT5xX25hbWUsIG5hbWUpID09IDApCgkJCQkJewoJCQkJCQlmb3VuZCA9IFRSVUU7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJZm91bmQgPSBUUlVFOwoJCQkJCWJyZWFrOwoJCQkJfQoJCQl9CgkJCWVudHJ5ID0gZW50cnktPnFfbmV4dDsKCQl9IHdoaWxlICggZW50cnkgIT0gaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdICk7Cgl9CgoJLyoKCSAqIElmIGVudHJ5IHdhcyBmb3VuZCwgZGVxdWV1ZSBpdAoJICovCglpZiAoIGZvdW5kICkgewoJCWRlcXVldWVfZ2VuZXJhbCggKGlyZGFfcXVldWVfdCoqKSAmaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdLAoJCQkJIChpcmRhX3F1ZXVlX3QqKSBlbnRyeSApOwoJCWhhc2hiaW4tPmhiX3NpemUtLTsKCgkJLyoKCQkgKiAgQ2hlY2sgaWYgdGhpcyBpdGVtIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgYW5kIGluCgkJICogIHRoYXQgY2FzZSB3ZSBtdXN0IHJlc2V0IGhiX2N1cnJlbnQKCQkgKi8KCQlpZiAoIGVudHJ5ID09IGhhc2hiaW4tPmhiX2N1cnJlbnQpCgkJCWhhc2hiaW4tPmhiX2N1cnJlbnQgPSBOVUxMOwoJfQoKCS8qIFJlbGVhc2UgbG9jayAqLwoJaWYgKCBoYXNoYmluLT5oYl90eXBlICYgSEJfTE9DSyApIHsKCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZoYXNoYmluLT5oYl9zcGlubG9jaywgZmxhZ3MpOwoJfSAvKiBEZWZhdWx0IGlzIG5vLWxvY2sgICovCgoKCS8qIFJldHVybiAqLwoJaWYgKCBmb3VuZCApCgkJcmV0dXJuIGVudHJ5OwoJZWxzZQoJCXJldHVybiBOVUxMOwoKfQpFWFBPUlRfU1lNQk9MKGhhc2hiaW5fcmVtb3ZlKTsKCi8qCiAqICBGdW5jdGlvbiBoYXNoYmluX3JlbW92ZV90aGlzIChoYXNoYmluLCBlbnRyeSkKICoKICogICAgUmVtb3ZlIGVudHJ5IHdpdGggdGhlIGdpdmVuIG5hbWUKICoKICogSW4gc29tZSBjYXNlcywgdGhlIHVzZXIgb2YgaGFzaGJpbiBjYW4ndCBndWFyYW50ZWUgdGhlIHVuaWNpdHkKICogb2YgZWl0aGVyIHRoZSBoYXNodiBvciBuYW1lLgogKiBJbiB0aG9zZSBjYXNlcywgdXNpbmcgdGhlIGFib3ZlIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gY2F1c2UgdHJvdWJsZXMsCiAqIHNvIHdlIHVzZSB0aGlzIG9uZSBpbnN0ZWFkLi4uCiAqIEFuZCBieSB0aGUgd2F5LCBpdCdzIGFsc28gZmFzdGVyLCBiZWNhdXNlIHdlIHNraXAgdGhlIHNlYXJjaCBwaGFzZSA7LSkKICovCnZvaWQqIGhhc2hiaW5fcmVtb3ZlX3RoaXMoIGhhc2hiaW5fdCogaGFzaGJpbiwgaXJkYV9xdWV1ZV90KiBlbnRyeSkKewoJdW5zaWduZWQgbG9uZyBmbGFncyA9IDA7CglpbnQJYmluOwoJbG9uZwloYXNodjsKCglJUkRBX0RFQlVHKCA0LCAiJXMoKVxuIiwgX19GVU5DVElPTl9fKTsKCglJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQoIGVudHJ5ICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CgoJLyogU3luY2hyb25pemUgKi8KCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CgkJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7Cgl9IC8qIERlZmF1bHQgaXMgbm8tbG9jayAgKi8KCgkvKiBDaGVjayBpZiB2YWxpZCBhbmQgbm90IGFscmVhZHkgcmVtb3ZlZC4uLiAqLwoJaWYoKGVudHJ5LT5xX25leHQgPT0gTlVMTCkgfHwgKGVudHJ5LT5xX3ByZXYgPT0gTlVMTCkpIHsKCQllbnRyeSA9IE5VTEw7CgkJZ290byBvdXQ7Cgl9CgoJLyoKCSAqIExvY2F0ZSBoYXNoYmluCgkgKi8KCWhhc2h2ID0gZW50cnktPnFfaGFzaDsKCWJpbiA9IEdFVF9IQVNIQklOKCBoYXNodiApOwoKCS8qCgkgKiBEZXF1ZXVlIHRoZSBlbnRyeS4uLgoJICovCglkZXF1ZXVlX2dlbmVyYWwoIChpcmRhX3F1ZXVlX3QqKikgJmhhc2hiaW4tPmhiX3F1ZXVlWyBiaW4gXSwKCQkJIChpcmRhX3F1ZXVlX3QqKSBlbnRyeSApOwoJaGFzaGJpbi0+aGJfc2l6ZS0tOwoJZW50cnktPnFfbmV4dCA9IE5VTEw7CgllbnRyeS0+cV9wcmV2ID0gTlVMTDsKCgkvKgoJICogIENoZWNrIGlmIHRoaXMgaXRlbSBpcyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0sIGFuZCBpbgoJICogIHRoYXQgY2FzZSB3ZSBtdXN0IHJlc2V0IGhiX2N1cnJlbnQKCSAqLwoJaWYgKCBlbnRyeSA9PSBoYXNoYmluLT5oYl9jdXJyZW50KQoJCWhhc2hiaW4tPmhiX2N1cnJlbnQgPSBOVUxMOwpvdXQ6CgkvKiBSZWxlYXNlIGxvY2sgKi8KCWlmICggaGFzaGJpbi0+aGJfdHlwZSAmIEhCX0xPQ0sgKSB7CgkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCX0gLyogRGVmYXVsdCBpcyBuby1sb2NrICAqLwoKCXJldHVybiBlbnRyeTsKfQpFWFBPUlRfU1lNQk9MKGhhc2hiaW5fcmVtb3ZlX3RoaXMpOwoKLyoqKioqKioqKioqKioqKioqKioqKioqIEhBU0hCSU4gRU5VTUVSQVRJT04gKioqKioqKioqKioqKioqKioqKioqKiovCgovKgogKiBGdW5jdGlvbiBoYXNoYmluX2NvbW1vbl9maW5kIChoYXNoYmluLCBoYXNodiwgbmFtZSkKICoKICogICAgRmluZCBpdGVtIHdpdGggdGhlIGdpdmVuIGhhc2h2IG9yIG5hbWUKICoKICovCnZvaWQqIGhhc2hiaW5fZmluZCggaGFzaGJpbl90KiBoYXNoYmluLCBsb25nIGhhc2h2LCBjb25zdCBjaGFyKiBuYW1lICkKewoJaW50IGJpbjsKCWlyZGFfcXVldWVfdCogZW50cnk7CgoJSVJEQV9ERUJVRyggNCwgImhhc2hiaW5fZmluZCgpXG4iKTsKCglJUkRBX0FTU0VSVCggaGFzaGJpbiAhPSBOVUxMLCByZXR1cm4gTlVMTDspOwoJSVJEQV9BU1NFUlQoIGhhc2hiaW4tPm1hZ2ljID09IEhCX01BR0lDLCByZXR1cm4gTlVMTDspOwoKCS8qCgkgKiBMb2NhdGUgaGFzaGJpbgoJICovCglpZiAoIG5hbWUgKQoJCWhhc2h2ID0gaGFzaCggbmFtZSApOwoJYmluID0gR0VUX0hBU0hCSU4oIGhhc2h2ICk7CgoJLyoKCSAqIFNlYXJjaCBmb3IgZW50cnkKCSAqLwoJZW50cnkgPSBoYXNoYmluLT5oYl9xdWV1ZVsgYmluXTsKCWlmICggZW50cnkgKSB7CgkJZG8gewoJCQkvKgoJCQkgKiBDaGVjayBmb3Iga2V5CgkJCSAqLwoJCQlpZiAoIGVudHJ5LT5xX2hhc2ggPT0gaGFzaHYgKSB7CgkJCQkvKgoJCQkJICogTmFtZSBjb21wYXJlIHRvbz8KCQkJCSAqLwoJCQkJaWYgKCBuYW1lICkgewoJCQkJCWlmICggc3RyY21wKCBlbnRyeS0+cV9uYW1lLCBuYW1lICkgPT0gMCApIHsKCQkJCQkJcmV0dXJuIGVudHJ5OwoJCQkJCX0KCQkJCX0gZWxzZSB7CgkJCQkJcmV0dXJuIGVudHJ5OwoJCQkJfQoJCQl9CgkJCWVudHJ5ID0gZW50cnktPnFfbmV4dDsKCQl9IHdoaWxlICggZW50cnkgIT0gaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdICk7Cgl9CgoJcmV0dXJuIE5VTEw7Cn0KRVhQT1JUX1NZTUJPTChoYXNoYmluX2ZpbmQpOwoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9sb2NrX2ZpbmQgKGhhc2hiaW4sIGhhc2h2LCBuYW1lKQogKgogKiAgICBGaW5kIGl0ZW0gd2l0aCB0aGUgZ2l2ZW4gaGFzaHYgb3IgbmFtZQogKgogKiBTYW1lLCBidXQgd2l0aCBzcGlubG9jayBwcm90ZWN0aW9uLi4uCiAqIEkgY2FsbCBpdCBzYWZlLCBidXQgaXQncyBvbmx5IHNhZmUgd2l0aCByZXNwZWN0IHRvIHRoZSBoYXNoYmluLCBub3QgaXRzCiAqIGNvbnRlbnQuIC0gSmVhbiBJSQogKi8Kdm9pZCogaGFzaGJpbl9sb2NrX2ZpbmQoIGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSApCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwoJaXJkYV9xdWV1ZV90KiBlbnRyeTsKCgkvKiBTeW5jaHJvbml6ZSAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CgoJLyoKCSAqIFNlYXJjaCBmb3IgZW50cnkKCSAqLwoJZW50cnkgPSAoaXJkYV9xdWV1ZV90KiApIGhhc2hiaW5fZmluZCggaGFzaGJpbiwgaGFzaHYsIG5hbWUgKTsKCgkvKiBSZWxlYXNlIGxvY2sgKi8KCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CgoJcmV0dXJuIGVudHJ5Owp9CkVYUE9SVF9TWU1CT0woaGFzaGJpbl9sb2NrX2ZpbmQpOwoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9maW5kIChoYXNoYmluLCBoYXNodiwgbmFtZSwgcG5leHQpCiAqCiAqICAgIEZpbmQgYW4gaXRlbSB3aXRoIHRoZSBnaXZlbiBoYXNodiBvciBuYW1lLCBhbmQgaXRzIHN1Y2Nlc3NvcgogKgogKiBUaGlzIGZ1bmN0aW9uIGFsbG93IHRvIGRvIGNvbmN1cnJlbnQgZW51bWVyYXRpb25zIHdpdGhvdXQgdGhlCiAqIG5lZWQgdG8gbG9jayBvdmVyIHRoZSB3aG9sZSBzZXNzaW9uLCBiZWNhdXNlIHRoZSBjYWxsZXIga2VlcCB0aGUKICogY29udGV4dCBvZiB0aGUgc2VhcmNoLiBPbiB0aGUgb3RoZXIgaGFuZCwgaXQgbWlnaHQgZmFpbCBhbmQgcmV0dXJuCiAqIE5VTEwgaWYgdGhlIGVudHJ5IGlzIHJlbW92ZWQuIC0gSmVhbiBJSQogKi8Kdm9pZCogaGFzaGJpbl9maW5kX25leHQoIGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSwKCQkJIHZvaWQgKiogcG5leHQpCnsKCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAwOwoJaXJkYV9xdWV1ZV90KiBlbnRyeTsKCgkvKiBTeW5jaHJvbml6ZSAqLwoJc3Bpbl9sb2NrX2lycXNhdmUoJmhhc2hiaW4tPmhiX3NwaW5sb2NrLCBmbGFncyk7CgoJLyoKCSAqIFNlYXJjaCBmb3IgY3VycmVudCBlbnRyeQoJICogVGhpcyBhbGxvdyB0byBjaGVjayBpZiB0aGUgY3VycmVudCBpdGVtIGlzIHN0aWxsIGluIHRoZQoJICogaGFzaGJpbiBvciBoYXMgYmVlbiByZW1vdmVkLgoJICovCgllbnRyeSA9IChpcmRhX3F1ZXVlX3QqICkgaGFzaGJpbl9maW5kKCBoYXNoYmluLCBoYXNodiwgbmFtZSApOwoKCS8qCgkgKiBUcmljayBoYXNoYmluX2dldF9uZXh0KCkgdG8gcmV0dXJuIHdoYXQgd2Ugd2FudAoJICovCglpZihlbnRyeSkgewoJCWhhc2hiaW4tPmhiX2N1cnJlbnQgPSBlbnRyeTsKCQkqcG5leHQgPSBoYXNoYmluX2dldF9uZXh0KCBoYXNoYmluICk7Cgl9IGVsc2UKCQkqcG5leHQgPSBOVUxMOwoKCS8qIFJlbGVhc2UgbG9jayAqLwoJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaGFzaGJpbi0+aGJfc3BpbmxvY2ssIGZsYWdzKTsKCglyZXR1cm4gZW50cnk7Cn0KCi8qCiAqIEZ1bmN0aW9uIGhhc2hiaW5fZ2V0X2ZpcnN0IChoYXNoYmluKQogKgogKiAgICBHZXQgYSBwb2ludGVyIHRvIGZpcnN0IGVsZW1lbnQgaW4gaGFzaGJpbiwgdGhpcyBmdW5jdGlvbiBtdXN0IGJlCiAqICAgIGNhbGxlZCBiZWZvcmUgYW55IGNhbGxzIHRvIGhhc2hiaW5fZ2V0X25leHQoKSEKICoKICovCmlyZGFfcXVldWVfdCAqaGFzaGJpbl9nZXRfZmlyc3QoIGhhc2hiaW5fdCogaGFzaGJpbikKewoJaXJkYV9xdWV1ZV90ICplbnRyeTsKCWludCBpOwoKCUlSREFfQVNTRVJUKCBoYXNoYmluICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CglJUkRBX0FTU0VSVCggaGFzaGJpbi0+bWFnaWMgPT0gSEJfTUFHSUMsIHJldHVybiBOVUxMOyk7CgoJaWYgKCBoYXNoYmluID09IE5VTEwpCgkJcmV0dXJuIE5VTEw7CgoJZm9yICggaSA9IDA7IGkgPCBIQVNIQklOX1NJWkU7IGkgKysgKSB7CgkJZW50cnkgPSBoYXNoYmluLT5oYl9xdWV1ZVsgaV07CgkJaWYgKCBlbnRyeSkgewoJCQloYXNoYmluLT5oYl9jdXJyZW50ID0gZW50cnk7CgkJCXJldHVybiBlbnRyeTsKCQl9Cgl9CgkvKgoJICogIERpZCBub3QgZmluZCBhbnkgaXRlbSBpbiBoYXNoYmluCgkgKi8KCXJldHVybiBOVUxMOwp9CkVYUE9SVF9TWU1CT0woaGFzaGJpbl9nZXRfZmlyc3QpOwoKLyoKICogRnVuY3Rpb24gaGFzaGJpbl9nZXRfbmV4dCAoaGFzaGJpbikKICoKICogICAgR2V0IG5leHQgaXRlbSBpbiBoYXNoYmluLiBBIHNlcmllcyBvZiBoYXNoYmluX2dldF9uZXh0KCkgY2FsbHMgbXVzdAogKiAgICBiZSBzdGFydGVkIGJ5IGEgY2FsbCB0byBoYXNoYmluX2dldF9maXJzdCgpLiBUaGUgZnVuY3Rpb24gcmV0dXJucwogKiAgICBOVUxMIHdoZW4gYWxsIGl0ZW1zIGhhdmUgYmVlbiB0cmF2ZXJzZWQKICoKICogVGhlIGNvbnRleHQgb2YgdGhlIHNlYXJjaCBpcyBzdG9yZWQgd2l0aGluIHRoZSBoYXNoYmluLCBzbyB5b3UgbXVzdAogKiBwcm90ZWN0IHlvdXJzZWxmIGZyb20gY29uY3VycmVudCBlbnVtZXJhdGlvbnMuIC0gSmVhbiBJSQogKi8KaXJkYV9xdWV1ZV90ICpoYXNoYmluX2dldF9uZXh0KCBoYXNoYmluX3QgKmhhc2hiaW4pCnsKCWlyZGFfcXVldWVfdCogZW50cnk7CglpbnQgYmluOwoJaW50IGk7CgoJSVJEQV9BU1NFUlQoIGhhc2hiaW4gIT0gTlVMTCwgcmV0dXJuIE5VTEw7KTsKCUlSREFfQVNTRVJUKCBoYXNoYmluLT5tYWdpYyA9PSBIQl9NQUdJQywgcmV0dXJuIE5VTEw7KTsKCglpZiAoIGhhc2hiaW4tPmhiX2N1cnJlbnQgPT0gTlVMTCkgewoJCUlSREFfQVNTRVJUKCBoYXNoYmluLT5oYl9jdXJyZW50ICE9IE5VTEwsIHJldHVybiBOVUxMOyk7CgkJcmV0dXJuIE5VTEw7Cgl9CgllbnRyeSA9IGhhc2hiaW4tPmhiX2N1cnJlbnQtPnFfbmV4dDsKCWJpbiA9IEdFVF9IQVNIQklOKCBlbnRyeS0+cV9oYXNoKTsKCgkvKgoJICogIE1ha2Ugc3VyZSB0aGF0IHdlIGFyZSBub3QgYmFjayBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBxdWV1ZQoJICogIGFnYWluCgkgKi8KCWlmICggZW50cnkgIT0gaGFzaGJpbi0+aGJfcXVldWVbIGJpbiBdKSB7CgkJaGFzaGJpbi0+aGJfY3VycmVudCA9IGVudHJ5OwoKCQlyZXR1cm4gZW50cnk7Cgl9CgoJLyoKCSAqICBDaGVjayB0aGF0IHRoaXMgaXMgbm90IHRoZSBsYXN0IHF1ZXVlIGluIGhhc2hiaW4KCSAqLwoJaWYgKCBiaW4gPj0gSEFTSEJJTl9TSVpFKQoJCXJldHVybiBOVUxMOwoKCS8qCgkgKiAgTW92ZSB0byBuZXh0IHF1ZXVlIGluIGhhc2hiaW4KCSAqLwoJYmluKys7Cglmb3IgKCBpID0gYmluOyBpIDwgSEFTSEJJTl9TSVpFOyBpKysgKSB7CgkJZW50cnkgPSBoYXNoYmluLT5oYl9xdWV1ZVsgaV07CgkJaWYgKCBlbnRyeSkgewoJCQloYXNoYmluLT5oYl9jdXJyZW50ID0gZW50cnk7CgoJCQlyZXR1cm4gZW50cnk7CgkJfQoJfQoJcmV0dXJuIE5VTEw7Cn0KRVhQT1JUX1NZTUJPTChoYXNoYmluX2dldF9uZXh0KTsK