LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIGZ0ZGVidWcuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgRGVidWdnaW5nIGFuZCBsb2dnaW5nIGNvbXBvbmVudCBmb3IgYW1pZ2EgKGJvZHkpLiAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIENvcHlyaWdodCAxOTk2LTIwMDEsIDIwMDIsIDIwMDQsIDIwMDUsIDIwMTMgYnkgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIERhdmlkIFR1cm5lciwgUm9iZXJ0IFdpbGhlbG0sIFdlcm5lciBMZW1iZXJnIGFuZCBEZXRsZWYgV/xya25lci4gICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0LCBhbmQgbWF5IG9ubHkgYmUgdXNlZCwgICAgICAgKi8KLyogIG1vZGlmaWVkLCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBGcmVlVHlwZSBwcm9qZWN0ICAgICAgKi8KLyogIGxpY2Vuc2UsIExJQ0VOU0UuVFhULiAgQnkgY29udGludWluZyB0byB1c2UsIG1vZGlmeSwgb3IgZGlzdHJpYnV0ZSAgICAgKi8KLyogIHRoaXMgZmlsZSB5b3UgaW5kaWNhdGUgdGhhdCB5b3UgaGF2ZSByZWFkIHRoZSBsaWNlbnNlIGFuZCAgICAgICAgICAgICAgKi8KLyogIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCBpdCBmdWxseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIFRoaXMgY29tcG9uZW50IGNvbnRhaW5zIHZhcmlvdXMgbWFjcm9zIGFuZCBmdW5jdGlvbnMgdXNlZCB0byBlYXNlIHRoZSAqLwogIC8qIGRlYnVnZ2luZyBvZiB0aGUgRnJlZVR5cGUgZW5naW5lLiAgSXRzIG1haW4gcHVycG9zZSBpcyBpbiBhc3NlcnRpb24gICAqLwogIC8qIGNoZWNraW5nLCB0cmFjaW5nLCBhbmQgZXJyb3IgZGV0ZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIFRoZXJlIGFyZSBub3cgdGhyZWUgZGVidWdnaW5nIG1vZGVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIC0gdHJhY2UgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgRXJyb3IgYW5kIHRyYWNlIG1lc3NhZ2VzIGFyZSBzZW50IHRvIHRoZSBsb2cgZmlsZSAod2hpY2ggY2FuIGJlIHRoZSAqLwogIC8qICAgc3RhbmRhcmQgZXJyb3Igb3V0cHV0KS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIC0gZXJyb3IgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgT25seSBlcnJvciBtZXNzYWdlcyBhcmUgZ2VuZXJhdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIC0gcmVsZWFzZSBtb2RlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgTm8gZXJyb3IgbWVzc2FnZSBpcyBzZW50IG9yIGdlbmVyYXRlZC4gIFRoZSBjb2RlIGlzIGZyZWUgZnJvbSBhbnkgICAqLwogIC8qICAgZGVidWdnaW5nIHBhcnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKCiAgLyoKICAgKiBCYXNlZCBvbiB0aGUgZGVmYXVsdCBmdGRlYnVnLmMsCiAgICogcmVwbGFjZWQgdnByaW50ZigpIHdpdGggS1ZQcmludEYoKSwKICAgKiBjb21tZW50ZWQgb3V0IGV4aXQoKSwKICAgKiByZXBsYWNlZCBnZXRlbnYoKSB3aXRoIEdldFZhcigpLgogICAqLwoKI2luY2x1ZGUgPGV4ZWMvdHlwZXMuaD4KI2luY2x1ZGUgPHV0aWxpdHkvdGFnaXRlbS5oPgojaW5jbHVkZSA8ZG9zL2V4YWxsLmg+CiNpbmNsdWRlIDxkb3MvdmFyLmg+CiNkZWZpbmUgX19OT0xJQkJBU0VfXwojZGVmaW5lIF9fTk9MT0JBTElGQUNFX18KI2RlZmluZSBfX1VTRV9JTkxJTkVfXwojaW5jbHVkZSA8cHJvdG8vZG9zLmg+CiNpbmNsdWRlIDxjbGliL2RlYnVnX3Byb3Rvcy5oPgoKI2lmbmRlZiBfX2FtaWdhb3M0X18KICBleHRlcm4gc3RydWN0IExpYnJhcnkgKkRPU0Jhc2U7CiNlbHNlCiAgZXh0ZXJuIHN0cnVjdCBET1NJRmFjZSAqSURPUzsKI2VuZGlmCgoKI2luY2x1ZGUgPGZ0MmJ1aWxkLmg+CiNpbmNsdWRlIEZUX0ZSRUVUWVBFX0gKI2luY2x1ZGUgRlRfSU5URVJOQUxfREVCVUdfSAoKCiNpZiBkZWZpbmVkKCBGVF9ERUJVR19MRVZFTF9FUlJPUiApCgogIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCgogIEZUX0JBU0VfREVGKCB2b2lkICkKICBGVF9NZXNzYWdlKCBjb25zdCBjaGFyKiAgZm10LAogICAgICAgICAgICAgIC4uLiApCiAgewogICAgdmFfbGlzdCAgYXA7CgoKICAgIHZhX3N0YXJ0KCBhcCwgZm10ICk7CiAgICBLVlByaW50RiggZm10LCBhcCApOwogICAgdmFfZW5kKCBhcCApOwogIH0KCgogIC8qIGRvY3VtZW50YXRpb24gaXMgaW4gZnRkZWJ1Zy5oICovCgogIEZUX0JBU0VfREVGKCB2b2lkICkKICBGVF9QYW5pYyggY29uc3QgY2hhciogIGZtdCwKICAgICAgICAgICAgLi4uICkKICB7CiAgICB2YV9saXN0ICBhcDsKCgogICAgdmFfc3RhcnQoIGFwLCBmbXQgKTsKICAgIEtWUHJpbnRGKCBmbXQsIGFwICk7CiAgICB2YV9lbmQoIGFwICk7CgovKiAgZXhpdCggRVhJVF9GQUlMVVJFICk7ICovCiAgfQoKCiAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KCiAgRlRfQkFTRV9ERUYoIGludCApCiAgRlRfVGhyb3coIEZUX0Vycm9yICAgICBlcnJvciwKICAgICAgICAgICAgaW50ICAgICAgICAgIGxpbmUsCiAgICAgICAgICAgIGNvbnN0IGNoYXIqICBmaWxlICkKICB7CiAgICBGVF9VTlVTRUQoIGVycm9yICk7CiAgICBGVF9VTlVTRUQoIGxpbmUgKTsKICAgIEZUX1VOVVNFRCggZmlsZSApOwoKICAgIHJldHVybiAwOwogIH0KCiNlbmRpZiAvKiBGVF9ERUJVR19MRVZFTF9FUlJPUiAqLwoKCgojaWZkZWYgRlRfREVCVUdfTEVWRUxfVFJBQ0UKCiAgLyogYXJyYXkgb2YgdHJhY2UgbGV2ZWxzLCBpbml0aWFsaXplZCB0byAwICovCiAgaW50ICBmdF90cmFjZV9sZXZlbHNbdHJhY2VfY291bnRdOwoKCiAgLyogZGVmaW5lIGFycmF5IG9mIHRyYWNlIHRvZ2dsZSBuYW1lcyAqLwojZGVmaW5lIEZUX1RSQUNFX0RFRiggeCApICAjeCAsCgogIHN0YXRpYyBjb25zdCBjaGFyKiAgZnRfdHJhY2VfdG9nZ2xlc1t0cmFjZV9jb3VudCArIDFdID0KICB7CiNpbmNsdWRlIEZUX0lOVEVSTkFMX1RSQUNFX0gKICAgIE5VTEwKICB9OwoKI3VuZGVmIEZUX1RSQUNFX0RFRgoKCiAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KCiAgRlRfQkFTRV9ERUYoIEZUX0ludCApCiAgRlRfVHJhY2VfR2V0X0NvdW50KCB2b2lkICkKICB7CiAgICByZXR1cm4gdHJhY2VfY291bnQ7CiAgfQoKCiAgLyogZG9jdW1lbnRhdGlvbiBpcyBpbiBmdGRlYnVnLmggKi8KCiAgRlRfQkFTRV9ERUYoIGNvbnN0IGNoYXIgKiApCiAgRlRfVHJhY2VfR2V0X05hbWUoIEZUX0ludCAgaWR4ICkKICB7CiAgICBpbnQgIG1heCA9IEZUX1RyYWNlX0dldF9Db3VudCgpOwoKCiAgICBpZiAoIGlkeCA8IG1heCApCiAgICAgIHJldHVybiBmdF90cmFjZV90b2dnbGVzW2lkeF07CiAgICBlbHNlCiAgICAgIHJldHVybiBOVUxMOwogIH0KCgogIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIEluaXRpYWxpemUgdGhlIHRyYWNpbmcgc3ViLXN5c3RlbS4gIFRoaXMgaXMgZG9uZSBieSByZXRyaWV2aW5nIHRoZSAgICAqLwogIC8qIHZhbHVlIG9mIHRoZSBgRlQyX0RFQlVHJyBlbnZpcm9ubWVudCB2YXJpYWJsZS4gIEl0IG11c3QgYmUgYSBsaXN0IG9mICAqLwogIC8qIHRvZ2dsZXMsIHNlcGFyYXRlZCBieSBzcGFjZXMsIGA7Jywgb3IgYCwnLiAgRXhhbXBsZTogICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIGV4cG9ydCBGVDJfREVCVUc9ImFueTozIG1lbW9yeTo3IHN0cmVhbTo1IiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIFRoaXMgcmVxdWVzdHMgdGhhdCBhbGwgbGV2ZWxzIGJlIHNldCB0byAzLCBleGNlcHQgdGhlIHRyYWNlIGxldmVsIGZvciAqLwogIC8qIHRoZSBtZW1vcnkgYW5kIHN0cmVhbSBjb21wb25lbnRzIHdoaWNoIGFyZSBzZXQgdG8gNyBhbmQgNSwgICAgICAgICAgICAqLwogIC8qIHJlc3BlY3RpdmVseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIFNlZSB0aGUgZmlsZSA8aW5jbHVkZS9mcmVldHlwZS9pbnRlcm5hbC9mdHRyYWNlLmg+IGZvciBkZXRhaWxzIG9mIHRoZSAqLwogIC8qIGF2YWlsYWJsZSB0b2dnbGUgbmFtZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIFRoZSBsZXZlbCBtdXN0IGJlIGJldHdlZW4gMCBhbmQgNzsgMCBtZWFucyBxdWlldCAoZXhjZXB0IGZvciBzZXJpb3VzICAqLwogIC8qIHJ1bnRpbWUgZXJyb3JzKSwgYW5kIDcgbWVhbnMgX3ZlcnlfIHZlcmJvc2UuICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIEZUX0JBU0VfREVGKCB2b2lkICkKICBmdF9kZWJ1Z19pbml0KCB2b2lkICkKICB7Ci8qICBjb25zdCBjaGFyKiAgZnQyX2RlYnVnID0gZ2V0ZW52KCAiRlQyX0RFQlVHIiApOyAqLwogICAgY2hhciAgICAgICAgIGJ1ZlsyNTZdOwogICAgY29uc3QgY2hhciogIGZ0Ml9kZWJ1ZyA9ICZidWZbMF07CgoKLyogIGlmICggZnQyX2RlYnVnICkgKi8KICAgIGlmICggR2V0VmFyKCAiRlQyX0RFQlVHIiwgKFNUUlBUUilmdDJfZGVidWcsIDI1NiwgTFZfVkFSICkgPiAwICkKICAgIHsKICAgICAgY29uc3QgY2hhciogIHAgPSBmdDJfZGVidWc7CiAgICAgIGNvbnN0IGNoYXIqICBxOwoKCiAgICAgIGZvciAoIDsgKnA7IHArKyApCiAgICAgIHsKICAgICAgICAvKiBza2lwIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgc2VwYXJhdG9ycyAqLwogICAgICAgIGlmICggKnAgPT0gJyAnIHx8ICpwID09ICdcdCcgfHwgKnAgPT0gJywnIHx8ICpwID09ICc7JyB8fCAqcCA9PSAnPScgKQogICAgICAgICAgY29udGludWU7CgogICAgICAgIC8qIHJlYWQgdG9nZ2xlIG5hbWUsIGZvbGxvd2VkIGJ5ICc6JyAqLwogICAgICAgIHEgPSBwOwogICAgICAgIHdoaWxlICggKnAgJiYgKnAgIT0gJzonICkKICAgICAgICAgIHArKzsKCiAgICAgICAgaWYgKCAqcCA9PSAnOicgJiYgcCA+IHEgKQogICAgICAgIHsKICAgICAgICAgIEZUX0ludCAgbiwgaSwgbGVuID0gKEZUX0ludCkoIHAgLSBxICk7CiAgICAgICAgICBGVF9JbnQgIGxldmVsID0gLTEsIGZvdW5kID0gLTE7CgoKICAgICAgICAgIGZvciAoIG4gPSAwOyBuIDwgdHJhY2VfY291bnQ7IG4rKyApCiAgICAgICAgICB7CiAgICAgICAgICAgIGNvbnN0IGNoYXIqICB0b2dnbGUgPSBmdF90cmFjZV90b2dnbGVzW25dOwoKCiAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbGVuOyBpKysgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgaWYgKCB0b2dnbGVbaV0gIT0gcVtpXSApCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBpID09IGxlbiAmJiB0b2dnbGVbaV0gPT0gMCApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICBmb3VuZCA9IG47CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvKiByZWFkIGxldmVsICovCiAgICAgICAgICBwKys7CiAgICAgICAgICBpZiAoICpwICkKICAgICAgICAgIHsKICAgICAgICAgICAgbGV2ZWwgPSAqcCsrIC0gJzAnOwogICAgICAgICAgICBpZiAoIGxldmVsIDwgMCB8fCBsZXZlbCA+IDcgKQogICAgICAgICAgICAgIGxldmVsID0gLTE7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKCBmb3VuZCA+PSAwICYmIGxldmVsID49IDAgKQogICAgICAgICAgewogICAgICAgICAgICBpZiAoIGZvdW5kID09IHRyYWNlX2FueSApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAvKiBzcGVjaWFsIGNhc2UgZm9yIGBhbnknICovCiAgICAgICAgICAgICAgZm9yICggbiA9IDA7IG4gPCB0cmFjZV9jb3VudDsgbisrICkKICAgICAgICAgICAgICAgIGZ0X3RyYWNlX2xldmVsc1tuXSA9IGxldmVsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBmdF90cmFjZV9sZXZlbHNbZm91bmRdID0gbGV2ZWw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKCiNlbHNlICAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KCgogIEZUX0JBU0VfREVGKCB2b2lkICkKICBmdF9kZWJ1Z19pbml0KCB2b2lkICkKICB7CiAgICAvKiBub3RoaW5nICovCiAgfQoKCiAgRlRfQkFTRV9ERUYoIEZUX0ludCApCiAgRlRfVHJhY2VfR2V0X0NvdW50KCB2b2lkICkKICB7CiAgICByZXR1cm4gMDsKICB9CgoKICBGVF9CQVNFX0RFRiggY29uc3QgY2hhciAqICkKICBGVF9UcmFjZV9HZXRfTmFtZSggRlRfSW50ICBpZHggKQogIHsKICAgIEZUX1VOVVNFRCggaWR4ICk7CgogICAgcmV0dXJuIE5VTEw7CiAgfQoKCiNlbmRpZiAvKiAhRlRfREVCVUdfTEVWRUxfVFJBQ0UgKi8KCi8qCkxvY2FsIFZhcmlhYmxlczoKY29kaW5nOiBsYXRpbi0xCkVuZDoKKi8KLyogRU5EICovCg==