LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBzZHJhbSBjb250cm9sbGVyIHByb2plY3QgICAgICAgICAgIAogIGh0dHA6Ly93d3cub3BlbmNvcmVzLm9yZy9jb3Jlcy9zZHJfY3RybC8gICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIERlc2NyaXB0aW9uOiBXSVNIQk9ORSB0byBTRFJBTSBDb250cm9sbGVyIEJ1cyBUcmFuc2FsYXRvcgogICAgIDEuIFRoaXMgbW9kdWxlIHRyYW5zbGF0ZSB0aGUgV0lTSEJPTkUgcHJvdG9jb2wgdG8gY3VzdG9tIHNkcmFtIGNvbnRyb2xsZXIgaS9mIAogICAgIDIuIEFsc28gSGFuZGxlIHRoZSBjbG9jayBkb21haW4gY2hhbmdlIGZyb20gQXBwbGljYXRpb24gbGF5ZXIgdG8gU2RyYW0gbGF5ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBUbyBEbzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIG5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBBdXRob3Iocyk6ICBEaW5lc2ggQW5uYXl5YSwgZGluZXNoYUBvcGVuY29yZXMub3JnICAgICAgICAgICAgICAgICAKICBWZXJzaW9uICA6IDAuMCAtIEluaXRpYWwgUmVsZWFzZQogICAgICAgICAgICAgMC4xIC0gMm5kIEZlYiAyMDEyCgkgICAgICAgICAgIEFzeW5jIEZpZm8gdG93YXJkcyB0aGUgYXBwbGljYXRpb24gbGF5ZXIgaXMgc2VsZWN0ZWQgCgkJICAgd2l0aCBSZWdpc3RlcmVkIEZ1bGwgR2VuZXJhdGlvbgogICAgICAgICAgICAgMC4yIC0gMm5kIEZlYiAyMDEyCgkgICAgICAgICAgIFBlbmRpbmcgUmVhZCBnZW5lcmF0aW9uIGJ1ZyBmaXggZG9uZSB0byBoYW5kbGUgYmFja3RvIGJhY2sgd3JpdGUgCgkJICAgZm9sbG93ZWQgYnkgcmVhZCByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIENvcHlyaWdodCAoQykgMjAwMCBBdXRob3JzIGFuZCBPUEVOQ09SRVMuT1JHICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogVGhpcyBzb3VyY2UgZmlsZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgd2l0aG91dCAgICAgICAgIAogcmVzdHJpY3Rpb24gcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBzdGF0ZW1lbnQgaXMgbm90ICAgIAogcmVtb3ZlZCBmcm9tIHRoZSBmaWxlIGFuZCB0aGF0IGFueSBkZXJpdmF0aXZlIHdvcmsgY29udGFpbnMgIAogdGhlIG9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZSBhc3NvY2lhdGVkIGRpc2NsYWltZXIuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogVGhpcyBzb3VyY2UgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCAgIAogYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCAgIAogUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IAogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSAgIApsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgICAgICAgCiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkICAgCiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSICAgICAgCiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgCiBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgICAgCiBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgc291cmNlOyBpZiBub3QsIGRvd25sb2FkIGl0ICAgCiBmcm9tIGh0dHA6Ly93d3cub3BlbmNvcmVzLm9yZy9sZ3BsLnNodG1sICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKbW9kdWxlIHdiMnNkcmMgKAogICAgICAvLyBXQiBidXMKICAgICAgICAgICAgICAgICAgICB3Yl9yc3RfaSAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICB3Yl9jbGtfaSAgICAgICAgICAgICwKCiAgICAgICAgICAgICAgICAgICAgd2Jfc3RiX2kgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2JfYWNrX28gICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2JfYWRkcl9pICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2Jfd2VfaSAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2JfZGF0X2kgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2Jfc2VsX2kgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2JfZGF0X28gICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2JfY3ljX2kgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2JfY3RpX2kgICAgICAgICAgICAsIAoKCiAgICAgIC8vU0RSQU0gQ29udHJvbGxlciBIYW5kLVNoYWtlIFNpZ25hbCAKICAgICAgICAgICAgICAgICAgICBzZHJhbV9jbGsgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJhbV9yZXNldG4gICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfcmVxICAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfcmVxX2FkZHIgICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfcmVxX2xlbiAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfcmVxX3dyX24gICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfcmVxX2FjayAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfYnVzeV9uICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfd3JfZW5fbiAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfd3JfbmV4dCAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfcmRfdmFsaWQgICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfbGFzdF9yZCAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfd3JfZGF0YSAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICBzZHJfcmRfZGF0YSAgICAgICAgCgogICAgICApOyAKCnBhcmFtZXRlciAgICAgIGR3ICAgICAgICAgICAgICA9IDMyOyAgLy8gZGF0YSB3aWR0aApwYXJhbWV0ZXIgICAgICB0dyAgICAgICAgICAgICAgPSA4OyAgIC8vIHRhZyBpZCB3aWR0aApwYXJhbWV0ZXIgICAgICBibCAgICAgICAgICAgICAgPSA5OyAgIC8vIGJ1cnN0X2xlbmdodF93aWR0aCAKcGFyYW1ldGVyICAgICAgQVBQX0FXICAgICAgICAgID0gMjY7ICAvLyBBcHBsaWNhdGlvbiBBZGRyZXNzIFdpZHRoCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gV2lzaCBCb25lIEludGVyZmFjZQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgCmlucHV0ICAgICAgICAgICAgICAgICAgIHdiX3JzdF9pICAgICAgICAgICA7CmlucHV0ICAgICAgICAgICAgICAgICAgIHdiX2Nsa19pICAgICAgICAgICA7CgppbnB1dCAgICAgICAgICAgICAgICAgICB3Yl9zdGJfaSAgICAgICAgICAgOwpvdXRwdXQgICAgICAgICAgICAgICAgICB3Yl9hY2tfbyAgICAgICAgICAgOwppbnB1dCBbQVBQX0FXLTE6MF0gICAgICB3Yl9hZGRyX2kgICAgICAgICAgOwppbnB1dCAgICAgICAgICAgICAgICAgICB3Yl93ZV9pICAgICAgICAgICAgOyAvLyAxIC0gV3JpdGUgLCAwIC0gUmVhZAppbnB1dCBbZHctMTowXSAgICAgICAgICB3Yl9kYXRfaSAgICAgICAgICAgOwppbnB1dCBbZHcvOC0xOjBdICAgICAgICB3Yl9zZWxfaSAgICAgICAgICAgOyAvLyBCeXRlIGVuYWJsZQpvdXRwdXQgW2R3LTE6MF0gICAgICAgICB3Yl9kYXRfbyAgICAgICAgICAgOwppbnB1dCAgICAgICAgICAgICAgICAgICB3Yl9jeWNfaSAgICAgICAgICAgOwppbnB1dCAgWzI6MF0gICAgICAgICAgICB3Yl9jdGlfaSAgICAgICAgICAgOwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqClRoZSBDeWNsZSBUeXBlIElkZW5maWVyIFtDVElfSU8oKV0gQWRkcmVzcyBUYWcgcHJvdmlkZXMgCmFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGN1cnJlbnQgY3ljbGUuIApUaGUgTUFTVEVSIHNlbmRzIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhlIFNMQVZFLiBUaGUgU0xBVkUgY2FuIHVzZSB0aGlzCmluZm9ybWF0aW9uIHRvIHByZXBhcmUgdGhlIHJlc3BvbnNlIGZvciB0aGUgbmV4dCBjeWNsZS4KVGFibGUgNC0yIEN5Y2xlIFR5cGUgSWRlbnRpZmllcnMKQ1RJX08oMjowKSBEZXNjcmlwdGlvbgqRMDAwkiBDbGFzc2ljIGN5Y2xlLgqRMDAxkiBDb25zdGFudCBhZGRyZXNzIGJ1cnN0IGN5Y2xlCpEwMTCSIEluY3JlbWVudGluZyBidXJzdCBjeWNsZQqRMDExkiBSZXNlcnZlZAqRMTAwkiBSZXNlcnZlZAqRMTAxIFJlc2VydmVkCpExMTCSIFJlc2VydmVkCpExMTGSIEVuZC1vZi1CdXJzdAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFNEUkFNIGNvbnRyb2xsZXIgSW50ZXJmYWNlIAovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmlucHV0ICAgICAgICAgICAgICAgICAgIHNkcmFtX2NsayAgICAgICAgICA7IC8vIHNkcmFtIGNsb2NrCmlucHV0ICAgICAgICAgICAgICAgICAgIHNkcmFtX3Jlc2V0biAgICAgICA7IC8vIHNkcmFtIHJlc2V0Cm91dHB1dCAgICAgICAgICAgICAgICAgIHNkcl9yZXEgICAgICAgICAgICA7IC8vIFNEUkFNIHJlcXVlc3QKb3V0cHV0IFtBUFBfQVctMTowXSAgICAgc2RyX3JlcV9hZGRyICAgICAgIDsgLy8gU0RSQU0gUmVxdWVzdCBBZGRyZXNzCm91dHB1dCBbYmwtMTowXSAgICAgICAgIHNkcl9yZXFfbGVuICAgICAgICA7Cm91dHB1dCAgICAgICAgICAgICAgICAgIHNkcl9yZXFfd3JfbiAgICAgICA7IC8vIDAgLSBXcml0ZSwgMSAtPiBSZWFkCmlucHV0ICAgICAgICAgICAgICAgICAgIHNkcl9yZXFfYWNrICAgICAgICA7IC8vIFNEUkFNIHJlcXVlc3QgQWNjZXB0ZWQKaW5wdXQgICAgICAgICAgICAgICAgICAgc2RyX2J1c3lfbiAgICAgICAgIDsgLy8gMCAtPiBzZHIgYnVzeQpvdXRwdXQgW2R3LzgtMTowXSAgICAgICBzZHJfd3JfZW5fbiAgICAgICAgOyAvLyBBY3RpdmUgbG93IHNkciBieXRlLXdpc2Ugd3JpdGUgZGF0YSB2YWxpZAppbnB1dCAgICAgICAgICAgICAgICAgICBzZHJfd3JfbmV4dCAgICAgICAgOyAvLyBSZWFkeSB0byBhY2NlcHQgdGhlIG5leHQgd3JpdGUKaW5wdXQgICAgICAgICAgICAgICAgICAgc2RyX3JkX3ZhbGlkICAgICAgIDsgLy8gc2RyIHJlYWQgdmFsaWQKaW5wdXQgICAgICAgICAgICAgICAgICAgc2RyX2xhc3RfcmQgICAgICAgIDsgLy8gSW5kaWNhdGUgbGFzdCBSZWFkIG9mIEJ1cnN0IFRyYW5zZmVyCm91dHB1dCBbZHctMTowXSAgICAgICAgIHNkcl93cl9kYXRhICAgICAgICA7IC8vIHNkciB3cml0ZSBkYXRhCmlucHV0ICBbZHctMTowXSAgICAgICAgIHNkcl9yZF9kYXRhICAgICAgICA7IC8vIHNkciByZWFkIGRhdGEKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXaXJlIERlY2xlcmF0aW9uCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp3aXJlICAgICAgICAgICAgICAgICAgICBjbWRmaWZvX2Z1bGwgICAgICAgOwp3aXJlICAgICAgICAgICAgICAgICAgICBjbWRmaWZvX2VtcHR5ICAgICAgOwp3aXJlICAgICAgICAgICAgICAgICAgICB3cmRhdGFmaWZvX2Z1bGwgICAgOwp3aXJlICAgICAgICAgICAgICAgICAgICB3cmRhdGFmaWZvX2VtcHR5ICAgOwp3aXJlICAgICAgICAgICAgICAgICAgICB0YWdmaWZvX2Z1bGwgICAgICAgOwp3aXJlICAgICAgICAgICAgICAgICAgICB0YWdmaWZvX2VtcHR5ICAgICAgOwp3aXJlICAgICAgICAgICAgICAgICAgICByZGRhdGFmaWZvX2VtcHR5ICAgOwp3aXJlICAgICAgICAgICAgICAgICAgICByZGRhdGFmaWZvX2Z1bGwgICAgOwoKcmVnICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ19yZWFkICAgICAgIDsKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFjayBHZW5lcmFsdGlvbiBMb2dpYwovLyAgSWYgV3JpdGUgUmVxdWVzdCAtIEFja25vd2xlZGdlIGlmIHRoZSBjb21tYW5kIGFuZCB3cml0ZSBGSUZPIGFyZSBub3QgZnVsbAovLyAgSWYgUmVhZCBSZXF1ZXN0ICAtIEdlbmVyYXRlIHRoZSBBY2tub3dsZWRnbWVudCBvbmNlIHJlYWQgZmlmbyBoYXMgZGF0YQovLyAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgphc3NpZ24gd2JfYWNrX28gPSAod2Jfc3RiX2kgJiYgd2JfY3ljX2kgJiYgd2Jfd2VfaSkgPyAgLy8gV3JpdGUgUGhhc2UKCSAgICAgICAgICAgICAgICAgICgoIWNtZGZpZm9fZnVsbCkgJiYgKCF3cmRhdGFmaWZvX2Z1bGwpKSA6CgkJICAod2Jfc3RiX2kgJiYgd2JfY3ljX2kgJiYgIXdiX3dlX2kpID8gLy8gUmVhZCBQaGFzZSAKCQkgICAgICAgICAgICFyZGRhdGFmaWZvX2VtcHR5IDogMSdiMDsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIENvbW1hbmQgRklGTyBXcml0ZSBHZW5lcmF0aW9uCi8vICAgIElmIFdyaXRlIFJlcXVlc3QgLSBHZW5lcmF0ZSB3cml0ZSwgd2hlbiBXcml0ZSBmaWZvIGFuZCBjb21tYW5kIGZpZm8gaXMKLy8gICAgICAgICAgICAgICAgICAgICAgIG5vdCBmdWxsCi8vICAgIElmIFJlYWQgUmVxdWVzdCAtIEdlbmVyYXRlIHdyaXRlLCB3aGVuIGNvbW1hbmQgZmlmbyBub3QgZnVsbCBhbmQgdGhlcmUKLy8gICAgICAgICAgICAgICAgICAgICAgaXMgbm8gcGVuZGluZyByZWFkIHJlcXVlc3QuCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCndpcmUgICAgICAgICAgIGNtZGZpZm9fd3IgICA9ICh3Yl9zdGJfaSAmJiB3Yl9jeWNfaSAmJiB3Yl93ZV9pICYmICghY21kZmlmb19mdWxsKSApID8gd2JfYWNrX28gOgoJICAgICAgICAgICAgICAgICAgICAgICh3Yl9zdGJfaSAmJiB3Yl9jeWNfaSAmJiAhd2Jfd2VfaSAmJiAoIWNtZGZpZm9fZnVsbCkpID8gIXBlbmRpbmdfcmVhZDogMSdiMCA7IAoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gY29tbWFuZCBmaWZvIHJlYWQgZ2VuZXJhdGlvbgovLyAgICBDb21tYW5kIEZJRm8gcmVhZCB3aWxsIGJlIGdlbmVyYXRlZCwgd2hlbmV2ZXIgU0RSQU0gQ29udHJvbGxlcgovLyAgICBBY2tub3dsZGdlIHRoZSBSZXF1ZXN0Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKd2lyZSAgICAgICAgICAgY21kZmlmb19yZCAgID0gc2RyX3JlcV9hY2s7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBcHBsaWNhdGlvbiBsYXllciByZXF1ZXN0IGlzIGdlbmVyYXRlZCB0b3dhcmRzIHRoZSBjb250cm9sbGVyLCB3aGVuZXZlcgovLyBDb21tYW5kIEZJRk8gaXMgbm90IGZ1bGwKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYXNzaWduICAgICAgICAgc2RyX3JlcSAgICAgID0gIWNtZGZpZm9fZW1wdHk7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU2luY2UgQnVyc3QgbGVuZ3RoIGlzIG5vdCBrbm93biBhdCB0aGUgc3RhcnQgb2YgdGhlIEJ1cnN0LCBJdCdzIGFzc3VtZWQgYXMKLy8gU2luZ2xlIEN5Y2xlIEJ1cnN0LiBXZSBuZWVkIHRvIGltcHJvdmlzZSB0aGlzIC4uLgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp3aXJlIFtibC0xOjBdICBidXJzdF9sZW5ndGggID0gMTsgIC8vIDAgTWVhbiAxIFRyYW5zZmVyCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEluIFdpc2ggQm9uZSBTcGVjLCBGb3IgUmVhZCBSZXF1ZXN0IGhhcyB0byBiZSBhY2tlZCBhbG9uZyB3aXRoIGRhdGEuCi8vIFdlIG5lZWQgdG8gaWRlbnRpZnkgdGhlIHBlbmRpbmcgcmVhZCByZXF1ZXN0LgovLyBPbmNlIHdlIGFjY2VwdCB0aGUgcmVhZCByZXF1ZXN0LCB3ZSBzaG91bGQgbm90IGFjY2VwdCBvbmUgbW9yZSByZWFkCi8vIHJlcXVlc3QsIHVudGlsbCB3ZSBoYXZlIHRyYW5zbWl0dGVkIHRoZSByZWFkIGRhdGEuCi8vICBQZW5kaW5nIFJlYWQgd2lsbCAKLy8gICAgIHNldCAtIHdpdGggUmVhZCBSZXF1ZXN0IAovLyAgICAgcmVzZXQgLSB3aXRoIFJlYWQgUmVxdWVzdCArIEFjawovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmFsd2F5cyBAKHBvc2VkZ2Ugd2JfcnN0X2kgb3IgcG9zZWRnZSB3Yl9jbGtfaSkgYmVnaW4KICAgaWYod2JfcnN0X2kpIGJlZ2luCiAgICAgICBwZW5kaW5nX3JlYWQgPD0gMSdiMDsKICAgZW5kIGVsc2UgYmVnaW4KICAgICAgLy9wZW5kaW5nX3JlYWQgPD0gIHdiX3N0Yl9pICYgd2JfY3ljX2kgJiAhd2Jfd2VfaSAmICF3Yl9hY2tfbzsKICAgICAgcGVuZGluZ19yZWFkIDw9ICAgKGNtZGZpZm9fd3IgJiYgIXdiX3dlX2kpID8gMSdiMToKCSAgICAgICAgICAgICAgICAod2Jfc3RiX2kgJiB3Yl9jeWNfaSAmICF3Yl93ZV9pICYgd2JfYWNrX28pID8gMSdiMDogcGVuZGluZ19yZWFkOwogICBlbmQKZW5kCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBc3luYyBDb21tYW5kIEZJRk8uIFRoaXMgYmxvY2sgaGFuZGxlIHRoZSBjbG9jayBkb21haW4gY2hhbmdlIGZyb20KLy8gQXBwbGljYXRpb24gbGF5ZXIgdG8gU0RSQU0gQ29udHJvbGxlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gQWRkcmVzcyArIEJ1cnN0IExlbmd0aCArIFcvUiBSZXF1ZXN0IAogICAgYXN5bmNfZmlmbyAjKC5XKEFQUF9BVytibCsxKSwuRFAoNCksLldSX0ZBU1QoMSdiMCksIC5SRF9GQVNUKDEnYjApKSB1X2NtZGZpZm8gKAogICAgIC8vIFdyaXRlIFBhdGggU3lzIENMb2NrIERvbWFpbgogICAgICAgICAgLndyX2NsayAgICAgICAgICAgICAod2JfY2xrX2kgICAgICAgICAgICksCiAgICAgICAgICAud3JfcmVzZXRfbiAgICAgICAgICghd2JfcnN0X2kgICAgICAgICAgKSwKICAgICAgICAgIC53cl9lbiAgICAgICAgICAgICAgKGNtZGZpZm9fd3IgICAgICAgICApLAogICAgICAgICAgLndyX2RhdGEgICAgICAgICAgICAoe2J1cnN0X2xlbmd0aCwgCgkgICAgICAgICAgICAgICAgICAgICAgICAhd2Jfd2VfaSwgCgkJCQl3Yl9hZGRyX2l9ICAgICAgICApLAogICAgICAgICAgLmFmdWxsICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAuZnVsbCAgICAgICAgICAgICAgIChjbWRmaWZvX2Z1bGwgICAgICAgKSwKCiAgICAgLy8gUmVhZCBQYXRoLCBTRFJBTSBjbG9jayBkb21haW4KICAgICAgICAgIC5yZF9jbGsgICAgICAgICAgICAgKHNkcmFtX2NsayAgICAgICAgICApLAogICAgICAgICAgLnJkX3Jlc2V0X24gICAgICAgICAoc2RyYW1fcmVzZXRuICAgICAgICksCiAgICAgICAgICAuYWVtcHR5ICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgIC5lbXB0eSAgICAgICAgICAgICAgKGNtZGZpZm9fZW1wdHkgICAgICApLAogICAgICAgICAgLnJkX2VuICAgICAgICAgICAgICAoY21kZmlmb19yZCAgICAgICAgICksCiAgICAgICAgICAucmRfZGF0YSAgICAgICAgICAgICh7c2RyX3JlcV9sZW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBzZHJfcmVxX3dyX24sCgkJICAgICAgICAgICAgICAgIHNkcl9yZXFfYWRkcn0gICAgICkKICAgICApOwoKLy8gc3lub3BzeXMgdHJhbnNsYXRlX29mZgphbHdheXMgQChwb3NlZGdlIHdiX2Nsa19pKSBiZWdpbgogIGlmIChjbWRmaWZvX2Z1bGwgPT0gMSdiMSAmJiBjbWRmaWZvX3dyID09IDEnYjEpICBiZWdpbgogICAgICRkaXNwbGF5KCJFUlJPUjolbSBDT01NQU5EIEZJRk8gV1JJVEUgT1ZFUkZMT1ciKTsKICBlbmQgCmVuZCAKLy8gc3lub3BzeXMgdHJhbnNsYXRlX29uCi8vIHN5bm9wc3lzIHRyYW5zbGF0ZV9vZmYKYWx3YXlzIEAocG9zZWRnZSBzZHJhbV9jbGspIGJlZ2luCiAgIGlmIChjbWRmaWZvX2VtcHR5ID09IDEnYjEgJiYgY21kZmlmb19yZCA9PSAxJ2IxKSBiZWdpbgogICAgICAkZGlzcGxheSgiRVJST1I6JW0gQ09NTUFORCBGSUZPIFJFQUQgT1ZFUkZMT1ciKTsKICAgZW5kCmVuZCAKLy8gc3lub3BzeXMgdHJhbnNsYXRlX29uCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXcml0ZSBEYXRhIEZJRk8gV3JpdGUgR2VuZXJhdGlvbiwgd2hlbiBldmVyIEFja2VkICsgV3JpdGUgUmVxdWVzdAovLyAgIE5vdGU6IEFjayBzaWduYWwgZ2VuZXJhdGlvbiBhbHJlYWR5IHRha2luZyBhY2NvdW50IG9mIEZJRk8gZnVsbCBjb25kaXRpb24KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp3aXJlICB3cmRhdGFmaWZvX3dyICA9IHdiX2Fja19vICYgd2Jfd2VfaSA7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXcml0ZSBEYXRhIEZJRk8gUmVhZCBHZW5lcmF0aW9uLCBXaGVuIGV2ZXIgTmV4dCBXcml0ZSByZXF1ZXN0IGdlbmVyYXRlZAovLyBmcm9tIFNEUkFNIENvbnRyb2xsZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCndpcmUgIHdyZGF0YWZpZm9fcmQgID0gc2RyX3dyX25leHQ7CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQXN5bmMgV3JpdGUgRGF0YSBGSUZPCi8vICAgIFRoaXMgYmxvY2sgaGFuZGxlIHRoZSBjbG9jayBkb21haW4gY2hhbmdlIG92ZXIgKyBXcml0ZSBEYXRhICsgQnl0ZSBtYXNrIAovLyAgICBGcm9tIEFwcGxpY2F0aW9uIGxheWVyIHRvIFNEUkFNIGNvbnRyb2xsZXIgbGF5ZXIKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIC8vIFdyaXRlIERBVEEgKyBEYXRhIE1hc2sgRklGTwogICAgYXN5bmNfZmlmbyAjKC5XKGR3Kyhkdy84KSksIC5EUCg4KSwgLldSX0ZBU1QoMSdiMCksIC5SRF9GQVNUKDEnYjEpKSB1X3dyZGF0YWZpZm8gKAogICAgICAgLy8gV3JpdGUgUGF0aCAsIFN5c3RlbSBjbG9jayBkb21haW4KICAgICAgICAgIC53cl9jbGsgICAgICAgICAgICAgKHdiX2Nsa19pICAgICAgICAgICApLAogICAgICAgICAgLndyX3Jlc2V0X24gICAgICAgICAoIXdiX3JzdF9pICAgICAgICAgICksCiAgICAgICAgICAud3JfZW4gICAgICAgICAgICAgICh3cmRhdGFmaWZvX3dyICAgICAgKSwKICAgICAgICAgIC53cl9kYXRhICAgICAgICAgICAgKHt+d2Jfc2VsX2ksIAoJICAgICAgICAgICAgICAgICAgICAgICAgIHdiX2RhdF9pfSAgICAgICAgKSwKICAgICAgICAgIC5hZnVsbCAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgLmZ1bGwgICAgICAgICAgICAgICAod3JkYXRhZmlmb19mdWxsICAgICksCgoKICAgICAgIC8vIFJlYWQgUGF0aCAsIFNEUkFNIGNsb2NrIGRvbWFpbgogICAgICAgICAgLnJkX2NsayAgICAgICAgICAgICAoc2RyYW1fY2xrICAgICAgICAgICksCiAgICAgICAgICAucmRfcmVzZXRfbiAgICAgICAgIChzZHJhbV9yZXNldG4gICAgICAgKSwKICAgICAgICAgIC5hZW1wdHkgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgLmVtcHR5ICAgICAgICAgICAgICAod3JkYXRhZmlmb19lbXB0eSAgICksCiAgICAgICAgICAucmRfZW4gICAgICAgICAgICAgICh3cmRhdGFmaWZvX3JkICAgICAgKSwKICAgICAgICAgIC5yZF9kYXRhICAgICAgICAgICAgKHtzZHJfd3JfZW5fbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZHJfd3JfZGF0YX0gICAgICApCiAgICAgKTsKLy8gc3lub3BzeXMgdHJhbnNsYXRlX29mZgphbHdheXMgQChwb3NlZGdlIHdiX2Nsa19pKSBiZWdpbgogIGlmICh3cmRhdGFmaWZvX2Z1bGwgPT0gMSdiMSAmJiB3cmRhdGFmaWZvX3dyID09IDEnYjEpICBiZWdpbgogICAgICRkaXNwbGF5KCJFUlJPUjolbSBXUklURSBEQVRBIEZJRk8gV1JJVEUgT1ZFUkZMT1ciKTsKICBlbmQgCmVuZCAKCmFsd2F5cyBAKHBvc2VkZ2Ugc2RyYW1fY2xrKSBiZWdpbgogICBpZiAod3JkYXRhZmlmb19lbXB0eSA9PSAxJ2IxICYmIHdyZGF0YWZpZm9fcmQgPT0gMSdiMSkgYmVnaW4KICAgICAgJGRpc3BsYXkoIkVSUk9SOiVtIFdSSVRFIERBVEEgRklGTyBSRUFEIE9WRVJGTE9XIik7CiAgIGVuZAplbmQgCi8vIHN5bm9wc3lzIHRyYW5zbGF0ZV9vbgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgUkVBRCBEQVRBIEZJRk8KLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp3aXJlICAgIHJkX2VvcDsgLy8gbGFzdCByZWFkIGluZGljYXRpb24KCi8vIFJlYWQgRklGTyB3cml0ZSBnZW5lcmF0aW9uLCB3aGVuIGV2ZXIgU0RSQU0gY29udHJvbGxlciBpc3N1ZXMgdGhlIHJlYWQKLy8gdmFsaWQgc2lnbmFsCndpcmUgICAgcmRkYXRhZmlmb193ciA9IHNkcl9yZF92YWxpZDsKCi8vIFJlYWQgRklGTyByZWFkIGdlbmVyYXRpb24sIHdoZW4gZXZlciBhY2sgaXMgZ2VuZXJhdGVkIGFsb25nIHdpdGggcmVhZAovLyByZXF1ZXN0LgovLyBOb3RlOiBBY2sgZ2VuZXJhdGlvbiBpcyBhbHJlYWR5IGFjY291bnRlZCB0aGUgd3JpdGUgRklGTyBOb3QgRW1wdHkKLy8gICAgICAgY29uZGl0aW9uCndpcmUgICAgcmRkYXRhZmlmb19yZCA9IHdiX2Fja19vICYgIXdiX3dlX2k7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQXN5bmMgUmVhZCBGSUZPCi8vIFRoaXMgYmxvY2sgaGFuZGxlcyB0aGUgY2xvY2sgZG9tYWluIGNoYW5nZSBvdmVyICsgUmVhZCBkYXRhIGZyb20gU0RSQU0KLy8gY29udHJvbGxlciB0byBBcHBsaWNhdGlvbiBsYXllci4KLy8gIE5vdGU6IAovLyAgICAxLiBSRUFEIERBVEEgRklGTyBkZXB0aCBpcyBrZXB0IHNtYWxsLCBhc3N1bWluZyB0aGF0IFN5cy1DTG9jayA+IFNEUkFNIENsb2NrCi8vICAgICAgIFJFQUQgREFUQSArIEVPUAovLyAgICAyLiBFT1AgaW5kaWNhdGUsIGxhc3QgdHJhbnNmZXIgb2YgQnVyc3QgUmVhZCBBY2Nlc3MuIHVzZS1mdWxsIGZvciBmdXR1cmUKLy8gICAgICAgVGFnIGhhbmRsaW5nIHBlciBidXJzdAovLwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGFzeW5jX2ZpZm8gIyguVyhkdysxKSwgLkRQKDQpLCAuV1JfRkFTVCgxJ2IwKSwgLlJEX0ZBU1QoMSdiMSkgKSB1X3JkZGF0YWZpZm8gKAogICAgICAgLy8gV3JpdGUgUGF0aCAsIFNEUkFNIGNsb2NrIGRvbWFpbgogICAgICAgICAgLndyX2NsayAgICAgICAgICAgICAoc2RyYW1fY2xrICAgICAgICAgICksCiAgICAgICAgICAud3JfcmVzZXRfbiAgICAgICAgIChzZHJhbV9yZXNldG4gICAgICAgKSwKICAgICAgICAgIC53cl9lbiAgICAgICAgICAgICAgKHJkZGF0YWZpZm9fd3IgICAgICApLAogICAgICAgICAgLndyX2RhdGEgICAgICAgICAgICAoe3Nkcl9sYXN0X3JkLAoJICAgICAgICAgICAgICAgICAgICAgICAgc2RyX3JkX2RhdGF9ICAgICAgKSwKICAgICAgICAgIC5hZnVsbCAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgLmZ1bGwgICAgICAgICAgICAgICAocmRkYXRhZmlmb19mdWxsICAgICksCgoKICAgICAgIC8vIFJlYWQgUGF0aCAsIFNZUyBjbG9jayBkb21haW4KICAgICAgICAgIC5yZF9jbGsgICAgICAgICAgICAgKHdiX2Nsa19pICAgICAgICAgICApLAogICAgICAgICAgLnJkX3Jlc2V0X24gICAgICAgICAoIXdiX3JzdF9pICAgICAgICAgICksCiAgICAgICAgICAuZW1wdHkgICAgICAgICAgICAgIChyZGRhdGFmaWZvX2VtcHR5ICAgKSwKICAgICAgICAgIC5hZW1wdHkgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgLnJkX2VuICAgICAgICAgICAgICAocmRkYXRhZmlmb19yZCAgICAgICksCiAgICAgICAgICAucmRfZGF0YSAgICAgICAgICAgICh7cmRfZW9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiX2RhdF9vfSAgICAgICAgICkKICAgICApOwoKLy8gc3lub3BzeXMgdHJhbnNsYXRlX29mZgphbHdheXMgQChwb3NlZGdlIHNkcmFtX2NsaykgYmVnaW4KICBpZiAocmRkYXRhZmlmb19mdWxsID09IDEnYjEgJiYgcmRkYXRhZmlmb193ciA9PSAxJ2IxKSAgYmVnaW4KICAgICAkZGlzcGxheSgiRVJST1I6JW0gUkVBRCBEQVRBIEZJRk8gV1JJVEUgT1ZFUkZMT1ciKTsKICBlbmQgCmVuZCAKCmFsd2F5cyBAKHBvc2VkZ2Ugd2JfY2xrX2kpIGJlZ2luCiAgIGlmIChyZGRhdGFmaWZvX2VtcHR5ID09IDEnYjEgJiYgcmRkYXRhZmlmb19yZCA9PSAxJ2IxKSBiZWdpbgogICAgICAkZGlzcGxheSgiRVJST1I6JW0gUkVBRCBEQVRBIEZJRk8gUkVBRCBPVkVSRkxPVyIpOwogICBlbmQKZW5kIAovLyBzeW5vcHN5cyB0cmFuc2xhdGVfb24KCiAKZW5kbW9kdWxlCg==