LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBzZHJhbSBjb250cm9sbGVyIHByb2plY3QgICAgICAgICAgIAogIGh0dHA6Ly93d3cub3BlbmNvcmVzLm9yZy9jb3Jlcy9zZHJfY3RybC8gICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogIERlc2NyaXB0aW9uOiBXSVNIQk9ORSB0byBTRFJBTSBDb250cm9sbGVyIEJ1cyBUcmFuc2FsYXRvcgogICAgIDEuIFRoaXMgbW9kdWxlIHRyYW5zbGF0ZSB0aGUgV0lTSEJPTkUgcHJvdG9jb2wgdG8gY3VzdG9tIHNkcmFtIGNvbnRyb2xsZXIgaS9mIAogICAgIDIuIEFsc28gSGFuZGxlIHRoZSBjbG9jayBkb21haW4gY2hhbmdlIGZyb20gQXBwbGljYXRpb24gbGF5ZXIgdG8gU2RyYW0gbGF5ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBUbyBEbzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIG5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICBBdXRob3Iocyk6ICBEaW5lc2ggQW5uYXl5YSwgZGluZXNoYUBvcGVuY29yZXMub3JnICAgICAgICAgICAgICAgICAKICBWZXJzaW9uICA6IDAuMCAtIEluaXRpYWwgUmVsZWFzZQogICAgICAgICAgICAgMC4xIC0gMm5kIEZlYiAyMDEyCgkgICAgICAgICAgIEFzeW5jIEZpZm8gdG93YXJkcyB0aGUgYXBwbGljYXRpb24gbGF5ZXIgaXMgc2VsZWN0ZWQgCgkJICAgd2l0aCBSZWdpc3RlcmVkIEZ1bGwgR2VuZXJhdGlvbgogICAgICAgICAgICAgMC4yIC0gMm5kIEZlYiAyMDEyCgkgICAgICAgICAgIFBlbmRpbmcgUmVhZCBnZW5lcmF0aW9uIGJ1ZyBmaXggZG9uZSB0byBoYW5kbGUgYmFja3RvIGJhY2sgd3JpdGUgCgkJICAgZm9sbG93ZWQgYnkgcmVhZCByZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKIENvcHlyaWdodCAoQykgMjAwMCBBdXRob3JzIGFuZCBPUEVOQ09SRVMuT1JHICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogVGhpcyBzb3VyY2UgZmlsZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgd2l0aG91dCAgICAgICAgIAogcmVzdHJpY3Rpb24gcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBzdGF0ZW1lbnQgaXMgbm90ICAgIAogcmVtb3ZlZCBmcm9tIHRoZSBmaWxlIGFuZCB0aGF0IGFueSBkZXJpdmF0aXZlIHdvcmsgY29udGFpbnMgIAogdGhlIG9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoZSBhc3NvY2lhdGVkIGRpc2NsYWltZXIuIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogVGhpcyBzb3VyY2UgZmlsZSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCAgIAogYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCAgIAogUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IAogZWl0aGVyIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSAgIApsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiBUaGlzIHNvdXJjZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgICAgICAgCiB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkICAgCiB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSICAgICAgCiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgCiBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgICAgCiBQdWJsaWMgTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgc291cmNlOyBpZiBub3QsIGRvd25sb2FkIGl0ICAgCiBmcm9tIGh0dHA6Ly93d3cub3BlbmNvcmVzLm9yZy9sZ3BsLnNodG1sICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKbW9kdWxlIHdiMnNkcmMgKAogICAgICAvLyBXQiBidXMKICAgICAgICAgICAgICAgICAgICB3Yl9yc3RfbiAgICAgICAgICAgICwKICAgICAgICAgICAgICAgICAgICB3Yl9jbGtfaSAgICAgICAgICAgICwKCiAgICAgICAgICAgICAgICAgICAgd2Jfc3RiX2kgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2JfYWNrX28gICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2JfYWRkcl9pICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2Jfd2VfaSAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2JfZGF0X2kgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2Jfc2VsX2kgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2JfZGF0X28gICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgd2JfY3ljX2kgICAgICAgICAgICAsCgoKICAgICAgLy9TRFJBTSBDb250cm9sbGVyIEhhbmQtU2hha2UgU2lnbmFsIAogICAgICAgICAgICAgICAgICAgIHNkcmFtX2NsayAgICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcmFtX3Jlc2V0biAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl9yZXEgICAgICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl9yZXFfYWRkciAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl9yZXFfbGVuICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl9yZXFfd3JfbiAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl9yZXFfYWNrICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl9idXN5X24gICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl93cl9lbl9uICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl93cl9uZXh0ICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl9yZF92YWxpZCAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl9sYXN0X3JkICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl93cl9kYXRhICAgICAgICAgLAogICAgICAgICAgICAgICAgICAgIHNkcl9yZF9kYXRhICAgICAgICAKCiAgICAgICk7IAoKcGFyYW1ldGVyICAgICAgZHcgICAgICAgICAgICAgID0gMzI7ICAvLyBkYXRhIHdpZHRoCnBhcmFtZXRlciAgICAgIHR3ICAgICAgICAgICAgICA9IDg7ICAgLy8gdGFnIGlkIHdpZHRoCnBhcmFtZXRlciAgICAgIGJsICAgICAgICAgICAgICA9IDk7ICAgLy8gYnVyc3RfbGVuZ2h0X3dpZHRoIApwYXJhbWV0ZXIgICAgICBBUFBfQVcgICAgICAgICAgPSAyNjsgIC8vIEFwcGxpY2F0aW9uIEFkZHJlc3MgV2lkdGgKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXaXNoIEJvbmUgSW50ZXJmYWNlCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAKaW5wdXQgICAgICAgICAgICAgICAgICAgd2JfcnN0X24gICAgICAgICAgIDsKaW5wdXQgICAgICAgICAgICAgICAgICAgd2JfY2xrX2kgICAgICAgICAgIDsKCmlucHV0ICAgICAgICAgICAgICAgICAgIHdiX3N0Yl9pICAgICAgICAgICA7Cm91dHB1dCAgICAgICAgICAgICAgICAgIHdiX2Fja19vICAgICAgICAgICA7CmlucHV0IFtBUFBfQVctMTowXSAgICAgIHdiX2FkZHJfaSAgICAgICAgICA7CmlucHV0ICAgICAgICAgICAgICAgICAgIHdiX3dlX2kgICAgICAgICAgICA7IC8vIDEgLSBXcml0ZSAsIDAgLSBSZWFkCmlucHV0IFtkdy0xOjBdICAgICAgICAgIHdiX2RhdF9pICAgICAgICAgICA7CmlucHV0IFtkdy84LTE6MF0gICAgICAgIHdiX3NlbF9pICAgICAgICAgICA7IC8vIEJ5dGUgZW5hYmxlCm91dHB1dCBbZHctMTowXSAgICAgICAgIHdiX2RhdF9vICAgICAgICAgICA7CmlucHV0ICAgICAgICAgICAgICAgICAgIHdiX2N5Y19pICAgICAgICAgICA7Ci8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKVGhlIEN5Y2xlIFR5cGUgSWRlbmZpZXIgW0NUSV9JTygpXSBBZGRyZXNzIFRhZyBwcm92aWRlcyAKYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBjeWNsZS4gClRoZSBNQVNURVIgc2VuZHMgdGhpcyBpbmZvcm1hdGlvbiB0byB0aGUgU0xBVkUuIFRoZSBTTEFWRSBjYW4gdXNlIHRoaXMKaW5mb3JtYXRpb24gdG8gcHJlcGFyZSB0aGUgcmVzcG9uc2UgZm9yIHRoZSBuZXh0IGN5Y2xlLgpUYWJsZSA0LTIgQ3ljbGUgVHlwZSBJZGVudGlmaWVycwpDVElfTygyOjApIERlc2NyaXB0aW9uCpEwMDCSIENsYXNzaWMgY3ljbGUuCpEwMDGSIENvbnN0YW50IGFkZHJlc3MgYnVyc3QgY3ljbGUKkTAxMJIgSW5jcmVtZW50aW5nIGJ1cnN0IGN5Y2xlCpEwMTGSIFJlc2VydmVkCpExMDCSIFJlc2VydmVkCpExMDEgUmVzZXJ2ZWQKkTExMJIgUmVzZXJ2ZWQKkTExMZIgRW5kLW9mLUJ1cnN0CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gU0RSQU0gY29udHJvbGxlciBJbnRlcmZhY2UgCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW5wdXQgICAgICAgICAgICAgICAgICAgc2RyYW1fY2xrICAgICAgICAgIDsgLy8gc2RyYW0gY2xvY2sKaW5wdXQgICAgICAgICAgICAgICAgICAgc2RyYW1fcmVzZXRuICAgICAgIDsgLy8gc2RyYW0gcmVzZXQKb3V0cHV0ICAgICAgICAgICAgICAgICAgc2RyX3JlcSAgICAgICAgICAgIDsgLy8gU0RSQU0gcmVxdWVzdApvdXRwdXQgW0FQUF9BVy0xOjBdICAgICBzZHJfcmVxX2FkZHIgICAgICAgOyAvLyBTRFJBTSBSZXF1ZXN0IEFkZHJlc3MKb3V0cHV0IFtibC0xOjBdICAgICAgICAgc2RyX3JlcV9sZW4gICAgICAgIDsKb3V0cHV0ICAgICAgICAgICAgICAgICAgc2RyX3JlcV93cl9uICAgICAgIDsgLy8gMCAtIFdyaXRlLCAxIC0+IFJlYWQKaW5wdXQgICAgICAgICAgICAgICAgICAgc2RyX3JlcV9hY2sgICAgICAgIDsgLy8gU0RSQU0gcmVxdWVzdCBBY2NlcHRlZAppbnB1dCAgICAgICAgICAgICAgICAgICBzZHJfYnVzeV9uICAgICAgICAgOyAvLyAwIC0+IHNkciBidXN5Cm91dHB1dCBbZHcvOC0xOjBdICAgICAgIHNkcl93cl9lbl9uICAgICAgICA7IC8vIEFjdGl2ZSBsb3cgc2RyIGJ5dGUtd2lzZSB3cml0ZSBkYXRhIHZhbGlkCmlucHV0ICAgICAgICAgICAgICAgICAgIHNkcl93cl9uZXh0ICAgICAgICA7IC8vIFJlYWR5IHRvIGFjY2VwdCB0aGUgbmV4dCB3cml0ZQppbnB1dCAgICAgICAgICAgICAgICAgICBzZHJfcmRfdmFsaWQgICAgICAgOyAvLyBzZHIgcmVhZCB2YWxpZAppbnB1dCAgICAgICAgICAgICAgICAgICBzZHJfbGFzdF9yZCAgICAgICAgOyAvLyBJbmRpY2F0ZSBsYXN0IFJlYWQgb2YgQnVyc3QgVHJhbnNmZXIKb3V0cHV0IFtkdy0xOjBdICAgICAgICAgc2RyX3dyX2RhdGEgICAgICAgIDsgLy8gc2RyIHdyaXRlIGRhdGEKaW5wdXQgIFtkdy0xOjBdICAgICAgICAgc2RyX3JkX2RhdGEgICAgICAgIDsgLy8gc2RyIHJlYWQgZGF0YQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFdpcmUgRGVjbGVyYXRpb24KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCndpcmUgICAgICAgICAgICAgICAgICAgIGNtZGZpZm9fZnVsbCAgICAgICA7CndpcmUgICAgICAgICAgICAgICAgICAgIGNtZGZpZm9fZW1wdHkgICAgICA7CndpcmUgICAgICAgICAgICAgICAgICAgIHdyZGF0YWZpZm9fZnVsbCAgICA7CndpcmUgICAgICAgICAgICAgICAgICAgIHdyZGF0YWZpZm9fZW1wdHkgICA7CndpcmUgICAgICAgICAgICAgICAgICAgIHRhZ2ZpZm9fZnVsbCAgICAgICA7CndpcmUgICAgICAgICAgICAgICAgICAgIHRhZ2ZpZm9fZW1wdHkgICAgICA7CndpcmUgICAgICAgICAgICAgICAgICAgIHJkZGF0YWZpZm9fZW1wdHkgICA7CndpcmUgICAgICAgICAgICAgICAgICAgIHJkZGF0YWZpZm9fZnVsbCAgICA7CgpyZWcgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nX3JlYWQgICAgICAgOwoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQWNrIEdlbmVyYWx0aW9uIExvZ2ljCi8vICBJZiBXcml0ZSBSZXF1ZXN0IC0gQWNrbm93bGVkZ2UgaWYgdGhlIGNvbW1hbmQgYW5kIHdyaXRlIEZJRk8gYXJlIG5vdCBmdWxsCi8vICBJZiBSZWFkIFJlcXVlc3QgIC0gR2VuZXJhdGUgdGhlIEFja25vd2xlZGdtZW50IG9uY2UgcmVhZCBmaWZvIGhhcyBkYXRhCi8vICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmFzc2lnbiB3Yl9hY2tfbyA9ICh3Yl9zdGJfaSAmJiB3Yl9jeWNfaSAmJiB3Yl93ZV9pKSA/ICAvLyBXcml0ZSBQaGFzZQoJICAgICAgICAgICAgICAgICAgKCghY21kZmlmb19mdWxsKSAmJiAoIXdyZGF0YWZpZm9fZnVsbCkpIDoKCQkgICh3Yl9zdGJfaSAmJiB3Yl9jeWNfaSAmJiAhd2Jfd2VfaSkgPyAvLyBSZWFkIFBoYXNlIAoJCSAgICAgICAgICAgIXJkZGF0YWZpZm9fZW1wdHkgOiAxJ2IwOwoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQ29tbWFuZCBGSUZPIFdyaXRlIEdlbmVyYXRpb24KLy8gICAgSWYgV3JpdGUgUmVxdWVzdCAtIEdlbmVyYXRlIHdyaXRlLCB3aGVuIFdyaXRlIGZpZm8gYW5kIGNvbW1hbmQgZmlmbyBpcwovLyAgICAgICAgICAgICAgICAgICAgICAgbm90IGZ1bGwKLy8gICAgSWYgUmVhZCBSZXF1ZXN0IC0gR2VuZXJhdGUgd3JpdGUsIHdoZW4gY29tbWFuZCBmaWZvIG5vdCBmdWxsIGFuZCB0aGVyZQovLyAgICAgICAgICAgICAgICAgICAgICBpcyBubyBwZW5kaW5nIHJlYWQgcmVxdWVzdC4KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kd2lyZSAgICAgICAgICAgY21kZmlmb193ciAgID0gKHdiX3N0Yl9pICYmIHdiX2N5Y19pICYmIHdiX3dlX2kgJiYgKCFjbWRmaWZvX2Z1bGwpICkgPyB3Yl9hY2tfbyA6CgkgICAgICAgICAgICAgICAgICAgICAgKHdiX3N0Yl9pICYmIHdiX2N5Y19pICYmICF3Yl93ZV9pICYmICghY21kZmlmb19mdWxsKSkgPyAhcGVuZGluZ19yZWFkOiAxJ2IwIDsgCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBjb21tYW5kIGZpZm8gcmVhZCBnZW5lcmF0aW9uCi8vICAgIENvbW1hbmQgRklGbyByZWFkIHdpbGwgYmUgZ2VuZXJhdGVkLCB3aGVuZXZlciBTRFJBTSBDb250cm9sbGVyCi8vICAgIEFja25vd2xkZ2UgdGhlIFJlcXVlc3QKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp3aXJlICAgICAgICAgICBjbWRmaWZvX3JkICAgPSBzZHJfcmVxX2FjazsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEFwcGxpY2F0aW9uIGxheWVyIHJlcXVlc3QgaXMgZ2VuZXJhdGVkIHRvd2FyZHMgdGhlIGNvbnRyb2xsZXIsIHdoZW5ldmVyCi8vIENvbW1hbmQgRklGTyBpcyBub3QgZnVsbAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQphc3NpZ24gICAgICAgICBzZHJfcmVxICAgICAgPSAhY21kZmlmb19lbXB0eTsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTaW5jZSBCdXJzdCBsZW5ndGggaXMgbm90IGtub3duIGF0IHRoZSBzdGFydCBvZiB0aGUgQnVyc3QsIEl0J3MgYXNzdW1lZCBhcwovLyBTaW5nbGUgQ3ljbGUgQnVyc3QuIFdlIG5lZWQgdG8gaW1wcm92aXNlIHRoaXMgLi4uCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCndpcmUgW2JsLTE6MF0gIGJ1cnN0X2xlbmd0aCAgPSAxOyAgLy8gMCBNZWFuIDEgVHJhbnNmZXIKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSW4gV2lzaCBCb25lIFNwZWMsIEZvciBSZWFkIFJlcXVlc3QgaGFzIHRvIGJlIGFja2VkIGFsb25nIHdpdGggZGF0YS4KLy8gV2UgbmVlZCB0byBpZGVudGlmeSB0aGUgcGVuZGluZyByZWFkIHJlcXVlc3QuCi8vIE9uY2Ugd2UgYWNjZXB0IHRoZSByZWFkIHJlcXVlc3QsIHdlIHNob3VsZCBub3QgYWNjZXB0IG9uZSBtb3JlIHJlYWQKLy8gcmVxdWVzdCwgdW50aWxsIHdlIGhhdmUgdHJhbnNtaXR0ZWQgdGhlIHJlYWQgZGF0YS4KLy8gIFBlbmRpbmcgUmVhZCB3aWxsIAovLyAgICAgc2V0IC0gd2l0aCBSZWFkIFJlcXVlc3QgCi8vICAgICByZXNldCAtIHdpdGggUmVhZCBSZXF1ZXN0ICsgQWNrCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KYWx3YXlzIEAobmVnZWRnZSB3Yl9yc3RfbiBvciBwb3NlZGdlIHdiX2Nsa19pKSBiZWdpbgogICBpZighd2JfcnN0X24pIGJlZ2luCiAgICAgICBwZW5kaW5nX3JlYWQgPD0gMSdiMDsKICAgZW5kIGVsc2UgYmVnaW4KICAgICAgLy9wZW5kaW5nX3JlYWQgPD0gIHdiX3N0Yl9pICYgd2JfY3ljX2kgJiAhd2Jfd2VfaSAmICF3Yl9hY2tfbzsKICAgICAgcGVuZGluZ19yZWFkIDw9ICAgKGNtZGZpZm9fd3IgJiYgIXdiX3dlX2kpID8gMSdiMToKCSAgICAgICAgICAgICAgICAod2Jfc3RiX2kgJiB3Yl9jeWNfaSAmICF3Yl93ZV9pICYgd2JfYWNrX28pID8gMSdiMDogcGVuZGluZ19yZWFkOwogICBlbmQKZW5kCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBBc3luYyBDb21tYW5kIEZJRk8uIFRoaXMgYmxvY2sgaGFuZGxlIHRoZSBjbG9jayBkb21haW4gY2hhbmdlIGZyb20KLy8gQXBwbGljYXRpb24gbGF5ZXIgdG8gU0RSQU0gQ29udHJvbGxlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gQWRkcmVzcyArIEJ1cnN0IExlbmd0aCArIFcvUiBSZXF1ZXN0IAogICAgYXN5bmNfZmlmbyAjKC5XKEFQUF9BVytibCsxKSwuRFAoNCksLldSX0ZBU1QoMSdiMCksIC5SRF9GQVNUKDEnYjApKSB1X2NtZGZpZm8gKAogICAgIC8vIFdyaXRlIFBhdGggU3lzIENMb2NrIERvbWFpbgogICAgICAgICAgLndyX2NsayAgICAgICAgICAgICAod2JfY2xrX2kgICAgICAgICAgICksCiAgICAgICAgICAud3JfcmVzZXRfbiAgICAgICAgICh3Yl9yc3RfbiAgICAgICAgICAgKSwKICAgICAgICAgIC53cl9lbiAgICAgICAgICAgICAgKGNtZGZpZm9fd3IgICAgICAgICApLAogICAgICAgICAgLndyX2RhdGEgICAgICAgICAgICAoe2J1cnN0X2xlbmd0aCwgCgkgICAgICAgICAgICAgICAgICAgICAgICAhd2Jfd2VfaSwgCgkJCQl3Yl9hZGRyX2l9ICAgICAgICApLAogICAgICAgICAgLmFmdWxsICAgICAgICAgICAgICAoICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAuZnVsbCAgICAgICAgICAgICAgIChjbWRmaWZvX2Z1bGwgICAgICAgKSwKCiAgICAgLy8gUmVhZCBQYXRoLCBTRFJBTSBjbG9jayBkb21haW4KICAgICAgICAgIC5yZF9jbGsgICAgICAgICAgICAgKHNkcmFtX2NsayAgICAgICAgICApLAogICAgICAgICAgLnJkX3Jlc2V0X24gICAgICAgICAoc2RyYW1fcmVzZXRuICAgICAgICksCiAgICAgICAgICAuYWVtcHR5ICAgICAgICAgICAgICggICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgIC5lbXB0eSAgICAgICAgICAgICAgKGNtZGZpZm9fZW1wdHkgICAgICApLAogICAgICAgICAgLnJkX2VuICAgICAgICAgICAgICAoY21kZmlmb19yZCAgICAgICAgICksCiAgICAgICAgICAucmRfZGF0YSAgICAgICAgICAgICh7c2RyX3JlcV9sZW4sCgkgICAgICAgICAgICAgICAgICAgICAgICBzZHJfcmVxX3dyX24sCgkJICAgICAgICAgICAgICAgIHNkcl9yZXFfYWRkcn0gICAgICkKICAgICApOwoKLy8gc3lub3BzeXMgdHJhbnNsYXRlX29mZgphbHdheXMgQChwb3NlZGdlIHdiX2Nsa19pKSBiZWdpbgogIGlmIChjbWRmaWZvX2Z1bGwgPT0gMSdiMSAmJiBjbWRmaWZvX3dyID09IDEnYjEpICBiZWdpbgogICAgICRkaXNwbGF5KCJFUlJPUjolbSBDT01NQU5EIEZJRk8gV1JJVEUgT1ZFUkZMT1ciKTsKICBlbmQgCmVuZCAKLy8gc3lub3BzeXMgdHJhbnNsYXRlX29uCi8vIHN5bm9wc3lzIHRyYW5zbGF0ZV9vZmYKYWx3YXlzIEAocG9zZWRnZSBzZHJhbV9jbGspIGJlZ2luCiAgIGlmIChjbWRmaWZvX2VtcHR5ID09IDEnYjEgJiYgY21kZmlmb19yZCA9PSAxJ2IxKSBiZWdpbgogICAgICAkZGlzcGxheSgiRVJST1I6JW0gQ09NTUFORCBGSUZPIFJFQUQgT1ZFUkZMT1ciKTsKICAgZW5kCmVuZCAKLy8gc3lub3BzeXMgdHJhbnNsYXRlX29uCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXcml0ZSBEYXRhIEZJRk8gV3JpdGUgR2VuZXJhdGlvbiwgd2hlbiBldmVyIEFja2VkICsgV3JpdGUgUmVxdWVzdAovLyAgIE5vdGU6IEFjayBzaWduYWwgZ2VuZXJhdGlvbiBhbHJlYWR5IHRha2luZyBhY2NvdW50IG9mIEZJRk8gZnVsbCBjb25kaXRpb24KLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp3aXJlICB3cmRhdGFmaWZvX3dyICA9IHdiX2Fja19vICYgd2Jfd2VfaSA7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBXcml0ZSBEYXRhIEZJRk8gUmVhZCBHZW5lcmF0aW9uLCBXaGVuIGV2ZXIgTmV4dCBXcml0ZSByZXF1ZXN0IGdlbmVyYXRlZAovLyBmcm9tIFNEUkFNIENvbnRyb2xsZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCndpcmUgIHdyZGF0YWZpZm9fcmQgID0gc2RyX3dyX25leHQ7CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQXN5bmMgV3JpdGUgRGF0YSBGSUZPCi8vICAgIFRoaXMgYmxvY2sgaGFuZGxlIHRoZSBjbG9jayBkb21haW4gY2hhbmdlIG92ZXIgKyBXcml0ZSBEYXRhICsgQnl0ZSBtYXNrIAovLyAgICBGcm9tIEFwcGxpY2F0aW9uIGxheWVyIHRvIFNEUkFNIGNvbnRyb2xsZXIgbGF5ZXIKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIC8vIFdyaXRlIERBVEEgKyBEYXRhIE1hc2sgRklGTwogICAgYXN5bmNfZmlmbyAjKC5XKGR3Kyhkdy84KSksIC5EUCg4KSwgLldSX0ZBU1QoMSdiMCksIC5SRF9GQVNUKDEnYjEpKSB1X3dyZGF0YWZpZm8gKAogICAgICAgLy8gV3JpdGUgUGF0aCAsIFN5c3RlbSBjbG9jayBkb21haW4KICAgICAgICAgIC53cl9jbGsgICAgICAgICAgICAgKHdiX2Nsa19pICAgICAgICAgICApLAogICAgICAgICAgLndyX3Jlc2V0X24gICAgICAgICAod2JfcnN0X24gICAgICAgICAgICksCiAgICAgICAgICAud3JfZW4gICAgICAgICAgICAgICh3cmRhdGFmaWZvX3dyICAgICAgKSwKICAgICAgICAgIC53cl9kYXRhICAgICAgICAgICAgKHt+d2Jfc2VsX2ksIAoJICAgICAgICAgICAgICAgICAgICAgICAgIHdiX2RhdF9pfSAgICAgICAgKSwKICAgICAgICAgIC5hZnVsbCAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgLmZ1bGwgICAgICAgICAgICAgICAod3JkYXRhZmlmb19mdWxsICAgICksCgoKICAgICAgIC8vIFJlYWQgUGF0aCAsIFNEUkFNIGNsb2NrIGRvbWFpbgogICAgICAgICAgLnJkX2NsayAgICAgICAgICAgICAoc2RyYW1fY2xrICAgICAgICAgICksCiAgICAgICAgICAucmRfcmVzZXRfbiAgICAgICAgIChzZHJhbV9yZXNldG4gICAgICAgKSwKICAgICAgICAgIC5hZW1wdHkgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgLmVtcHR5ICAgICAgICAgICAgICAod3JkYXRhZmlmb19lbXB0eSAgICksCiAgICAgICAgICAucmRfZW4gICAgICAgICAgICAgICh3cmRhdGFmaWZvX3JkICAgICAgKSwKICAgICAgICAgIC5yZF9kYXRhICAgICAgICAgICAgKHtzZHJfd3JfZW5fbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZHJfd3JfZGF0YX0gICAgICApCiAgICAgKTsKLy8gc3lub3BzeXMgdHJhbnNsYXRlX29mZgphbHdheXMgQChwb3NlZGdlIHdiX2Nsa19pKSBiZWdpbgogIGlmICh3cmRhdGFmaWZvX2Z1bGwgPT0gMSdiMSAmJiB3cmRhdGFmaWZvX3dyID09IDEnYjEpICBiZWdpbgogICAgICRkaXNwbGF5KCJFUlJPUjolbSBXUklURSBEQVRBIEZJRk8gV1JJVEUgT1ZFUkZMT1ciKTsKICBlbmQgCmVuZCAKCmFsd2F5cyBAKHBvc2VkZ2Ugc2RyYW1fY2xrKSBiZWdpbgogICBpZiAod3JkYXRhZmlmb19lbXB0eSA9PSAxJ2IxICYmIHdyZGF0YWZpZm9fcmQgPT0gMSdiMSkgYmVnaW4KICAgICAgJGRpc3BsYXkoIkVSUk9SOiVtIFdSSVRFIERBVEEgRklGTyBSRUFEIE9WRVJGTE9XIik7CiAgIGVuZAplbmQgCi8vIHN5bm9wc3lzIHRyYW5zbGF0ZV9vbgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyAgUkVBRCBEQVRBIEZJRk8KLy8gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp3aXJlICAgIHJkX2VvcDsgLy8gbGFzdCByZWFkIGluZGljYXRpb24KCi8vIFJlYWQgRklGTyB3cml0ZSBnZW5lcmF0aW9uLCB3aGVuIGV2ZXIgU0RSQU0gY29udHJvbGxlciBpc3N1ZXMgdGhlIHJlYWQKLy8gdmFsaWQgc2lnbmFsCndpcmUgICAgcmRkYXRhZmlmb193ciA9IHNkcl9yZF92YWxpZDsKCi8vIFJlYWQgRklGTyByZWFkIGdlbmVyYXRpb24sIHdoZW4gZXZlciBhY2sgaXMgZ2VuZXJhdGVkIGFsb25nIHdpdGggcmVhZAovLyByZXF1ZXN0LgovLyBOb3RlOiBBY2sgZ2VuZXJhdGlvbiBpcyBhbHJlYWR5IGFjY291bnRlZCB0aGUgd3JpdGUgRklGTyBOb3QgRW1wdHkKLy8gICAgICAgY29uZGl0aW9uCndpcmUgICAgcmRkYXRhZmlmb19yZCA9IHdiX2Fja19vICYgIXdiX3dlX2k7CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gQXN5bmMgUmVhZCBGSUZPCi8vIFRoaXMgYmxvY2sgaGFuZGxlcyB0aGUgY2xvY2sgZG9tYWluIGNoYW5nZSBvdmVyICsgUmVhZCBkYXRhIGZyb20gU0RSQU0KLy8gY29udHJvbGxlciB0byBBcHBsaWNhdGlvbiBsYXllci4KLy8gIE5vdGU6IAovLyAgICAxLiBSRUFEIERBVEEgRklGTyBkZXB0aCBpcyBrZXB0IHNtYWxsLCBhc3N1bWluZyB0aGF0IFN5cy1DTG9jayA+IFNEUkFNIENsb2NrCi8vICAgICAgIFJFQUQgREFUQSArIEVPUAovLyAgICAyLiBFT1AgaW5kaWNhdGUsIGxhc3QgdHJhbnNmZXIgb2YgQnVyc3QgUmVhZCBBY2Nlc3MuIHVzZS1mdWxsIGZvciBmdXR1cmUKLy8gICAgICAgVGFnIGhhbmRsaW5nIHBlciBidXJzdAovLwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGFzeW5jX2ZpZm8gIyguVyhkdysxKSwgLkRQKDQpLCAuV1JfRkFTVCgxJ2IwKSwgLlJEX0ZBU1QoMSdiMSkgKSB1X3JkZGF0YWZpZm8gKAogICAgICAgLy8gV3JpdGUgUGF0aCAsIFNEUkFNIGNsb2NrIGRvbWFpbgogICAgICAgICAgLndyX2NsayAgICAgICAgICAgICAoc2RyYW1fY2xrICAgICAgICAgICksCiAgICAgICAgICAud3JfcmVzZXRfbiAgICAgICAgIChzZHJhbV9yZXNldG4gICAgICAgKSwKICAgICAgICAgIC53cl9lbiAgICAgICAgICAgICAgKHJkZGF0YWZpZm9fd3IgICAgICApLAogICAgICAgICAgLndyX2RhdGEgICAgICAgICAgICAoe3Nkcl9sYXN0X3JkLAoJICAgICAgICAgICAgICAgICAgICAgICAgc2RyX3JkX2RhdGF9ICAgICAgKSwKICAgICAgICAgIC5hZnVsbCAgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgLmZ1bGwgICAgICAgICAgICAgICAocmRkYXRhZmlmb19mdWxsICAgICksCgoKICAgICAgIC8vIFJlYWQgUGF0aCAsIFNZUyBjbG9jayBkb21haW4KICAgICAgICAgIC5yZF9jbGsgICAgICAgICAgICAgKHdiX2Nsa19pICAgICAgICAgICApLAogICAgICAgICAgLnJkX3Jlc2V0X24gICAgICAgICAod2JfcnN0X24gICAgICAgICAgICksCiAgICAgICAgICAuZW1wdHkgICAgICAgICAgICAgIChyZGRhdGFmaWZvX2VtcHR5ICAgKSwKICAgICAgICAgIC5hZW1wdHkgICAgICAgICAgICAgKCAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgLnJkX2VuICAgICAgICAgICAgICAocmRkYXRhZmlmb19yZCAgICAgICksCiAgICAgICAgICAucmRfZGF0YSAgICAgICAgICAgICh7cmRfZW9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdiX2RhdF9vfSAgICAgICAgICkKICAgICApOwoKLy8gc3lub3BzeXMgdHJhbnNsYXRlX29mZgphbHdheXMgQChwb3NlZGdlIHNkcmFtX2NsaykgYmVnaW4KICBpZiAocmRkYXRhZmlmb19mdWxsID09IDEnYjEgJiYgcmRkYXRhZmlmb193ciA9PSAxJ2IxKSAgYmVnaW4KICAgICAkZGlzcGxheSgiRVJST1I6JW0gUkVBRCBEQVRBIEZJRk8gV1JJVEUgT1ZFUkZMT1ciKTsKICBlbmQgCmVuZCAKCmFsd2F5cyBAKHBvc2VkZ2Ugd2JfY2xrX2kpIGJlZ2luCiAgIGlmIChyZGRhdGFmaWZvX2VtcHR5ID09IDEnYjEgJiYgcmRkYXRhZmlmb19yZCA9PSAxJ2IxKSBiZWdpbgogICAgICAkZGlzcGxheSgiRVJST1I6JW0gUkVBRCBEQVRBIEZJRk8gUkVBRCBPVkVSRkxPVyIpOwogICBlbmQKZW5kIAovLyBzeW5vcHN5cyB0cmFuc2xhdGVfb24KCiAKZW5kbW9kdWxlCg==