LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgICAgICAKICogRmlsZW5hbWU6ICAgICAgaXJxdWV1ZS5oCiAqIFZlcnNpb246ICAgICAgIDAuMwogKiBEZXNjcmlwdGlvbjogICBHZW5lcmFsIHF1ZXVlIGltcGxlbWVudGF0aW9uCiAqIFN0YXR1czogICAgICAgIEV4cGVyaW1lbnRhbC4KICogQXV0aG9yOiAgICAgICAgRGFnIEJyYXR0bGkgPGRhZ2JAY3MudWl0Lm5vPgogKiBDcmVhdGVkIGF0OiAgICBUdWUgSnVuICA5IDEzOjI2OjUwIDE5OTgKICogTW9kaWZpZWQgYXQ6ICAgVGh1IE9jdCAgNyAxMzoyNToxNiAxOTk5CiAqIE1vZGlmaWVkIGJ5OiAgIERhZyBCcmF0dGxpIDxkYWdiQGNzLnVpdC5ubz4KICogCiAqICAgICBDb3B5cmlnaHQgKEMpIDE5OTgtMTk5OSwgQWFnZSBLdmFsbmVzIDxhYWdlQGNzLnVpdC5ubz4KICogICAgIENvcHlyaWdodCAoYykgMTk5OCwgRGFnIEJyYXR0bGkKICogICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAqICAgICAgCiAqICAgICBUaGlzIGNvZGUgaXMgdGFrZW4gZnJvbSB0aGUgVm9ydGV4IE9wZXJhdGluZyBTeXN0ZW0gd3JpdHRlbiBieSBBYWdlCiAqICAgICBLdmFsbmVzIGFuZCBoYXMgYmVlbiBwb3J0ZWQgdG8gTGludXggYW5kIExpbnV4L0lSIGJ5IERhZyBCcmF0dGxpCiAqCiAqICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIAogKiAgICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgCiAqICAgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiAKICogICAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKiAgCiAqICAgICBOZWl0aGVyIERhZyBCcmF0dGxpIG5vciBVbml2ZXJzaXR5IG9mIFRyb21z+CBhZG1pdCBsaWFiaWxpdHkgbm9yCiAqICAgICBwcm92aWRlIHdhcnJhbnR5IGZvciBhbnkgb2YgdGhpcyBzb2Z0d2FyZS4gVGhpcyBtYXRlcmlhbCBpcyAKICogICAgIHByb3ZpZGVkICJBUy1JUyIgYW5kIGF0IG5vIGNoYXJnZS4KICogICAgIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CgojaWZuZGVmIElSREFfUVVFVUVfSAojZGVmaW5lIElSREFfUVVFVUVfSAoKI2RlZmluZSBOQU1FX1NJWkUgICAgICAzMgoKLyoKICogSGFzaCB0eXBlcyAoc29tZSBmbGFncyBjYW4gYmUgeG9yZWQpCiAqIFNlZSBjb21tZW50cyBpbiBpcnF1ZXVlLmMgZm9yIHdoaWNoIG9uZSB0byB1c2UuLi4KICovCiNkZWZpbmUgSEJfTk9MT0NLCTAJLyogTm8gY29uY3VyZW50IGFjY2VzcyBwcmV2ZW50aW9uICovCiNkZWZpbmUgSEJfTE9DSwkJMQkvKiBQcmV2ZW50IGNvbmN1cmVudCB3cml0ZSB3aXRoIGdsb2JhbCBsb2NrICovCgovKgogKiBIYXNoIGRlZmluZXMKICovCiNkZWZpbmUgSEFTSEJJTl9TSVpFICAgOAojZGVmaW5lIEhBU0hCSU5fTUFTSyAgIDB4NwoKI2lmbmRlZiBJUkRBX0FMSUdOIAojZGVmaW5lIElSREFfQUxJR04gX19hdHRyaWJ1dGVfXygoYWxpZ25lZCkpCiNlbmRpZgoKI2RlZmluZSBRX05VTEwgeyBOVUxMLCBOVUxMLCAiIiwgMCB9Cgp0eXBlZGVmIHZvaWQgKCpGUkVFX0ZVTkMpKHZvaWQgKmFyZyk7CgpzdHJ1Y3QgaXJkYV9xdWV1ZSB7CglzdHJ1Y3QgaXJkYV9xdWV1ZSAqcV9uZXh0OwoJc3RydWN0IGlyZGFfcXVldWUgKnFfcHJldjsKCgljaGFyICAgcV9uYW1lW05BTUVfU0laRV07Cglsb25nICAgcV9oYXNoOwkJCS8qIE11c3QgYmUgYWJsZSB0byBjYXN0IGEgKHZvaWQgKikgKi8KfTsKdHlwZWRlZiBzdHJ1Y3QgaXJkYV9xdWV1ZSBpcmRhX3F1ZXVlX3Q7Cgp0eXBlZGVmIHN0cnVjdCBoYXNoYmluX3QgewoJX191MzIgICAgICBtYWdpYzsKCWludCAgICAgICAgaGJfdHlwZTsKCWludCAgICAgICAgaGJfc2l6ZTsKCXNwaW5sb2NrX3QgaGJfc3BpbmxvY2s7CQkvKiBIQl9MT0NLIC0gQ2FuIGJlIHVzZWQgYnkgdGhlIHVzZXIgKi8KCglpcmRhX3F1ZXVlX3QqIGhiX3F1ZXVlW0hBU0hCSU5fU0laRV0gSVJEQV9BTElHTjsKCglpcmRhX3F1ZXVlX3QqIGhiX2N1cnJlbnQ7Cn0gaGFzaGJpbl90OwoKaGFzaGJpbl90ICpoYXNoYmluX25ldyhpbnQgdHlwZSk7CmludCAgICAgIGhhc2hiaW5fZGVsZXRlKGhhc2hiaW5fdCogaGFzaGJpbiwgRlJFRV9GVU5DIGZ1bmMpOwppbnQgICAgICBoYXNoYmluX2NsZWFyKGhhc2hiaW5fdCogaGFzaGJpbiwgRlJFRV9GVU5DIGZyZWVfZnVuYyk7CnZvaWQgICAgIGhhc2hiaW5faW5zZXJ0KGhhc2hiaW5fdCogaGFzaGJpbiwgaXJkYV9xdWV1ZV90KiBlbnRyeSwgbG9uZyBoYXNodiwgCgkJCWNvbnN0IGNoYXIqIG5hbWUpOwp2b2lkKiAgICBoYXNoYmluX3JlbW92ZShoYXNoYmluX3QqIGhhc2hiaW4sIGxvbmcgaGFzaHYsIGNvbnN0IGNoYXIqIG5hbWUpOwp2b2lkKiAgICBoYXNoYmluX3JlbW92ZV9maXJzdChoYXNoYmluX3QgKmhhc2hiaW4pOwp2b2lkKgkgaGFzaGJpbl9yZW1vdmVfdGhpcyggaGFzaGJpbl90KiBoYXNoYmluLCBpcmRhX3F1ZXVlX3QqIGVudHJ5KTsKdm9pZCogICAgaGFzaGJpbl9maW5kKGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSk7CnZvaWQqICAgIGhhc2hiaW5fbG9ja19maW5kKGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSk7CnZvaWQqICAgIGhhc2hiaW5fZmluZF9uZXh0KGhhc2hiaW5fdCogaGFzaGJpbiwgbG9uZyBoYXNodiwgY29uc3QgY2hhciogbmFtZSwKCQkJICAgdm9pZCAqKiBwbmV4dCk7CmlyZGFfcXVldWVfdCAqaGFzaGJpbl9nZXRfZmlyc3QoaGFzaGJpbl90ICpoYXNoYmluKTsKaXJkYV9xdWV1ZV90ICpoYXNoYmluX2dldF9uZXh0KGhhc2hiaW5fdCAqaGFzaGJpbik7CgojZGVmaW5lIEhBU0hCSU5fR0VUX1NJWkUoaGFzaGJpbikgaGFzaGJpbi0+aGJfc2l6ZQoKI2VuZGlmCg==