RE8gTk9UIFRSQU5TTEFURSBPUiBMT0NBTElaRS4KCiUlIFRoaXMgbm90aWNlIGlzIHByb3ZpZGVkIHdpdGggcmVzcGVjdCB0byBUaGFpIGRpY3Rpb25hcnkgZm9yIHRleHQgYnJlYWtpbmcsIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoKLS0tIGJlZ2luIG9mIExJQ0VOU0UgZmlsZSAtLS0KCkNvcHlyaWdodCAoQykgMTk4MiBUaGUgUm95YWwgSW5zdGl0dXRlLCBUaGFpIFJveWFsIEdvdmVybm1lbnQuCgpDb3B5cmlnaHQgKEMpIDE5OTggTmF0aW9uYWwgRWxlY3Ryb25pY3MgYW5kIENvbXB1dGVyIFRlY2hub2xvZ3kgQ2VudGVyLAogTmF0aW9uYWwgU2NpZW5jZSBhbmQgVGVjaG5vbG9neSBEZXZlbG9wbWVudCBBZ2VuY3ksCiBNaW5pc3RyeSBvZiBTY2llbmNlIFRlY2hub2xvZ3kgYW5kIEVudmlyb25tZW50LAogVGhhaSBSb3lhbCBHb3Zlcm5tZW50LgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nCmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8KZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQKbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwKc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvCndob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nCmNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAppbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCk9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTgpOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCk9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUKVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KCi0tLSBlbmQgb2YgTElDRU5TRSBmaWxlIC0tLQolJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gQVNNLCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAKQ29weXJpZ2h0IChjKSAyMDAwLTIwMDcgSU5SSUEsIEZyYW5jZSBUZWxlY29tCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCmFyZSBtZXQ6CgoxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCgoyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCiAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCgozLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cwogICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQogICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCkFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCkxJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCklOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCkNPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCkFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIGxpdHRsZWNtcywgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogIAoKTGl0dGxlIGNtcwpDb3B5cmlnaHQgKEMpIDE5OTgtMjAwNCBNYXJ0aSBNYXJpYQoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgp0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbgp0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvCnVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCnRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywKc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGwKY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCkZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUgpDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIKSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4KQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIHpsaWIgMS4xLjMsIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6ICAgCgpBY2tub3dsZWRnbWVudHM6CgogIFRoZSBkZWZsYXRlIGZvcm1hdCB1c2VkIGJ5IHpsaWIgd2FzIGRlZmluZWQgYnkgUGhpbCBLYXR6LiBUaGUgZGVmbGF0ZQogIGFuZCB6bGliIHNwZWNpZmljYXRpb25zIHdlcmUgd3JpdHRlbiBieSBMLiBQZXRlciBEZXV0c2NoLiBUaGFua3MgdG8gYWxsIHRoZQogIHBlb3BsZSB3aG8gcmVwb3J0ZWQgcHJvYmxlbXMgYW5kIHN1Z2dlc3RlZCB2YXJpb3VzIGltcHJvdmVtZW50cyBpbiB6bGliOwogIHRoZXkgYXJlIHRvbyBudW1lcm91cyB0byBjaXRlIGhlcmUuCgpDb3B5cmlnaHQgbm90aWNlOgoKIChDKSAxOTk1LTE5OTggSmVhbi1sb3VwIEdhaWxseSBhbmQgTWFyayBBZGxlcgoKICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICdhcy1pcycsIHdpdGhvdXQgYW55IGV4cHJlc3Mgb3IgaW1wbGllZAogIHdhcnJhbnR5LiAgSW4gbm8gZXZlbnQgd2lsbCB0aGUgYXV0aG9ycyBiZSBoZWxkIGxpYWJsZSBmb3IgYW55IGRhbWFnZXMKICBhcmlzaW5nIGZyb20gdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLgoKICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gYW55b25lIHRvIHVzZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZSwKICBpbmNsdWRpbmcgY29tbWVyY2lhbCBhcHBsaWNhdGlvbnMsIGFuZCB0byBhbHRlciBpdCBhbmQgcmVkaXN0cmlidXRlIGl0CiAgZnJlZWx5LCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgcmVzdHJpY3Rpb25zOgoKICAxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc29mdHdhcmUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQ7IHlvdSBtdXN0IG5vdAogICAgIGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gSWYgeW91IHVzZSB0aGlzIHNvZnR3YXJlCiAgICAgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdCBkb2N1bWVudGF0aW9uIHdvdWxkIGJlCiAgICAgYXBwcmVjaWF0ZWQgYnV0IGlzIG5vdCByZXF1aXJlZC4KICAyLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0IG5vdCBiZQogICAgIG1pc3JlcHJlc2VudGVkIGFzIGJlaW5nIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4KICAzLiBUaGlzIG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueSBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKICBKZWFuLWxvdXAgR2FpbGx5ICAgICAgICBNYXJrIEFkbGVyCiAgamxvdXBAZ3ppcC5vcmcgICAgICAgICAgbWFkbGVyQGFsdW1uaS5jYWx0ZWNoLmVkdQoKSWYgeW91IHVzZSB0aGUgemxpYiBsaWJyYXJ5IGluIGEgcHJvZHVjdCwgd2Ugd291bGQgYXBwcmVjaWF0ZSAqbm90KgpyZWNlaXZpbmcgbGVuZ3RoeSBsZWdhbCBkb2N1bWVudHMgdG8gc2lnbi4gVGhlIHNvdXJjZXMgYXJlIHByb3ZpZGVkCmZvciBmcmVlIGJ1dCB3aXRob3V0IHdhcnJhbnR5IG9mIGFueSBraW5kLiAgVGhlIGxpYnJhcnkgaGFzIGJlZW4KZW50aXJlbHkgd3JpdHRlbiBieSBKZWFuLWxvdXAgR2FpbGx5IGFuZCBNYXJrIEFkbGVyOyBpdCBkb2VzIG5vdAppbmNsdWRlIHRoaXJkLXBhcnR5IGNvZGUuCgpJZiB5b3UgcmVkaXN0cmlidXRlIG1vZGlmaWVkIHNvdXJjZXMsIHdlIHdvdWxkIGFwcHJlY2lhdGUgdGhhdCB5b3UgaW5jbHVkZQppbiB0aGUgZmlsZSBDaGFuZ2VMb2cgaGlzdG9yeSBpbmZvcm1hdGlvbiBkb2N1bWVudGluZyB5b3VyIGNoYW5nZXMuCgolJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gVzNDIChEVEQgZm9yIFhNTCBTaWduYXR1cmVzKSwgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogClczQ64gU09GVFdBUkUgTk9USUNFIEFORCBMSUNFTlNFCkNvcHlyaWdodCCpIDE5OTQtMjAwMiBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLCAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUgUmVjaGVyY2hlIGVuIEluZm9ybWF0aXF1ZSBldCBlbiBBdXRvbWF0aXF1ZSwgS2VpbyBVbml2ZXJzaXR5KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8KVGhpcyBXM0Mgd29yayAoaW5jbHVkaW5nIHNvZnR3YXJlLCBkb2N1bWVudHMsIG9yIG90aGVyIHJlbGF0ZWQgaXRlbXMpIGlzIGJlaW5nIHByb3ZpZGVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2UuIEJ5IG9idGFpbmluZywgdXNpbmcgYW5kL29yIGNvcHlpbmcgdGhpcyB3b3JrLCB5b3UgKHRoZSBsaWNlbnNlZSkgYWdyZWUgdGhhdCB5b3UgaGF2ZSByZWFkLCB1bmRlcnN0b29kLCBhbmQgd2lsbCBjb21wbHkgd2l0aCB0aGUgZm9sbG93aW5nIHRlcm1zIGFuZCBjb25kaXRpb25zOgpQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiwgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiygIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgb3Igcm95YWx0eSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZyBtb2RpZmljYXRpb25zLCB0aGF0IHlvdSBtYWtlOgoxLlRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIHdvcmsuIAoyLkFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvciB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gSWYgbm9uZSBleGlzdCwgYSBzaG9ydCBub3RpY2Ugb2YgdGhlIGZvbGxvd2luZyBmb3JtIChoeXBlcnRleHQgaXMgcHJlZmVycmVkLCB0ZXh0IGlzIHBlcm1pdHRlZCkgc2hvdWxkIGJlIHVzZWQgd2l0aGluIHRoZSBib2R5IG9mIGFueSByZWRpc3RyaWJ1dGVkIG9yIGRlcml2YXRpdmUgY29kZTogIkNvcHlyaWdodCCpIFskZGF0ZS1vZi1zb2Z0d2FyZV0gV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSwgKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIGh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvIiAKMy5Ob3RpY2Ugb2YgYW55IGNoYW5nZXMgb3IgbW9kaWZpY2F0aW9ucyB0byB0aGUgVzNDIGZpbGVzLCBpbmNsdWRpbmcgdGhlIGRhdGUgY2hhbmdlcyB3ZXJlIG1hZGUuIChXZSByZWNvbW1lbmQgeW91IHByb3ZpZGUgVVJJcyB0byB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCB0aGUgY29kZSBpcyBkZXJpdmVkLikgClRISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5EIENPUFlSSUdIVCBIT0xERVJTIE1BS0UgTk8gUkVQUkVTRU5UQVRJT05TIE9SIFdBUlJBTlRJRVMsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTywgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgT1IgRklUTkVTUyBGT1IgQU5ZIFBBUlRJQ1VMQVIgUFVSUE9TRSBPUiBUSEFUIFRIRSBVU0UgT0YgVEhFIFNPRlRXQVJFIE9SIERPQ1VNRU5UQVRJT04gV0lMTCBOT1QgSU5GUklOR0UgQU5ZIFRISVJEIFBBUlRZIFBBVEVOVFMsIENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLgpDT1BZUklHSFQgSE9MREVSUyBXSUxMIE5PVCBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBTUEVDSUFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBBTlkgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OLgpUaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGl0bGUgdG8gY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgYW5kIGFueSBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0IGhvbGRlcnMuCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpUaGlzIGZvcm11bGF0aW9uIG9mIFczQydzIG5vdGljZSBhbmQgbGljZW5zZSBiZWNhbWUgYWN0aXZlIG9uIEF1Z3VzdCAxNCAxOTk4IHNvIGFzIHRvIGltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoIEdQTC4gVGhpcyB2ZXJzaW9uIGVuc3VyZXMgdGhhdCBXM0Mgc29mdHdhcmUgbGljZW5zaW5nIHRlcm1zIGFyZSBubyBtb3JlIHJlc3RyaWN0aXZlIHRoYW4gR1BMIGFuZCBjb25zZXF1ZW50bHkgVzNDIHNvZnR3YXJlIG1heSBiZSBkaXN0cmlidXRlZCBpbiBHUEwgcGFja2FnZXMuIFNlZSB0aGUgb2xkZXIgZm9ybXVsYXRpb24gZm9yIHRoZSBwb2xpY3kgcHJpb3IgdG8gdGhpcyBkYXRlLiBQbGVhc2Ugc2VlIG91ciBDb3B5cmlnaHQgRkFRIGZvciBjb21tb24gcXVlc3Rpb25zIGFib3V0IHVzaW5nIG1hdGVyaWFscyBmcm9tIG91ciBzaXRlLCBpbmNsdWRpbmcgc3BlY2lmaWMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHBhY2thZ2VzIGxpa2UgbGlid3d3LCBBbWF5YSwgYW5kIEppZ3Nhdy4gT3RoZXIgcXVlc3Rpb25zIGFib3V0IHRoaXMgbm90aWNlIGNhbiBiZSBkaXJlY3RlZCB0byBzaXRlLXBvbGljeUB3My5vcmcuCgoKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIFBDL1NDIExpdGUgZm9yIFN1c2UgTGludXggdi4gMS4xLjEsIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoKQ29weXJpZ2h0IChjKSAxOTk5LTIwMDQgRGF2aWQgQ29yY29yYW4gCkFsbCByaWdodHMgcmVzZXJ2ZWQuCgpSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCmFyZSBtZXQ6CgoxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCjIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCiAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKQ2hhbmdlcyB0byB0aGlzIGxpY2Vuc2UgY2FuIGJlIG1hZGUgb25seSBieSB0aGUgY29weXJpZ2h0IGF1dGhvciB3aXRoIApleHBsaWNpdCB3cml0dGVuIGNvbnNlbnQuCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgpJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCk9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCk5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZClRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GClRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgoKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIElBSUsgUEtDUyBXcmFwcGVyLCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAKCkNvcHlyaWdodCAoYykgMjAwMiBHcmF6IFVuaXZlcnNpdHkgb2YgVGVjaG5vbG9neS4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbixhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CgoKMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCgoyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgoKMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmIGFueSwgbXVzdCAgIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKCiAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IElBSUsgb2YgR3JheiBVbml2ZXJzaXR5IG9mICAgIFRlY2hub2xvZ3kuIgoKICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLCBpZiBhbmQgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCgo0LiBUaGUgbmFtZXMgIkdyYXogVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5IiBhbmQgIklBSUsgb2YgR3JheiBVbml2ZXJzaXR5IG9mICAgVGVjaG5vbG9neSIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KCjUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJJQUlLIFBLQ1MgV3JhcHBlciIsICAgbm9yIG1heSAiSUFJSyIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mICAgR3JheiBVbml2ZXJzaXR5IG9mIFRlY2hub2xvZ3kuCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRApXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQKV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgpQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgTElDRU5TT1IgQkUKTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLApPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLApQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwKT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04KQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCk9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCk9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUKUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgolJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gRG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIHYuIExldmVsIDMsIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoKVzNDw73DvSBTT0ZUV0FSRSBOT1RJQ0UgQU5EIExJQ0VOU0UKCmh0dHA6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAwMi9jb3B5cmlnaHQtc29mdHdhcmUtMjAwMjEyMzEKClRoaXMgd29yayAoYW5kIGluY2x1ZGVkIHNvZnR3YXJlLCBkb2N1bWVudGF0aW9uIHN1Y2ggYXMgUkVBRE1Fcywgb3Igb3RoZXIgcmVsYXRlZCBpdGVtcykgaXMgYmVpbmcKcHJvdmlkZWQgYnkgdGhlIGNvcHlyaWdodCBob2xkZXJzIHVuZGVyIHRoZSBmb2xsb3dpbmcgbGljZW5zZS4gQnkgb2J0YWluaW5nLCB1c2luZyBhbmQvb3IgY29weWluZyB0aGlzIHdvcmssIHlvdQoodGhlIGxpY2Vuc2VlKSBhZ3JlZSB0aGF0IHlvdSBoYXZlIHJlYWQsIHVuZGVyc3Rvb2QsIGFuZCB3aWxsIGNvbXBseSB3aXRoIHRoZSBmb2xsb3dpbmcgdGVybXMgYW5kIGNvbmRpdGlvbnMuCgpQZXJtaXNzaW9uIHRvIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24sIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIGZvcgphbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgb3Igcm95YWx0eSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB5b3UgaW5jbHVkZSB0aGUgZm9sbG93aW5nIG9uIEFMTCBjb3BpZXMKb2YgdGhlIHNvZnR3YXJlIGFuZCBkb2N1bWVudGF0aW9uIG9yIHBvcnRpb25zIHRoZXJlb2YsIGluY2x1ZGluZyBtb2RpZmljYXRpb25zOgogICAxLlRoZSBmdWxsIHRleHQgb2YgdGhpcyBOT1RJQ0UgaW4gYSBsb2NhdGlvbiB2aWV3YWJsZSB0byB1c2VycyBvZiB0aGUgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIHdvcmsuIAogICAyLkFueSBwcmUtZXhpc3RpbmcgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGRpc2NsYWltZXJzLCBub3RpY2VzLCBvciB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gSWYgbm9uZSBleGlzdCwgdGhlCiAgICAgVzNDIFNvZnR3YXJlIFNob3J0IE5vdGljZSBzaG91bGQgYmUgaW5jbHVkZWQgKGh5cGVydGV4dCBpcyBwcmVmZXJyZWQsIHRleHQgaXMgcGVybWl0dGVkKSB3aXRoaW4gdGhlIGJvZHkKICAgICBvZiBhbnkgcmVkaXN0cmlidXRlZCBvciBkZXJpdmF0aXZlIGNvZGUuIAogICAzLk5vdGljZSBvZiBhbnkgY2hhbmdlcyBvciBtb2RpZmljYXRpb25zIHRvIHRoZSBmaWxlcywgaW5jbHVkaW5nIHRoZSBkYXRlIGNoYW5nZXMgd2VyZSBtYWRlLiAoV2UKICAgICByZWNvbW1lbmQgeW91IHByb3ZpZGUgVVJJcyB0byB0aGUgbG9jYXRpb24gZnJvbSB3aGljaCB0aGUgY29kZSBpcyBkZXJpdmVkLikgClRISVMgU09GVFdBUkUgQU5EIERPQ1VNRU5UQVRJT04gSVMgUFJPVklERUQgIkFTIElTLCIgQU5EIENPUFlSSUdIVCBIT0xERVJTIE1BS0VOTyBSRVBSRVNFTlRBVElPTlMgT1IgV0FSUkFOVElFUywgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPLApXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBTlkgUEFSVElDVUxBUiBQVVJQT1NFIE9SIFRIQVQgVEhFVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OIFdJTEwgTk9UIElORlJJTkdFIEFOWSBUSElSRCBQQVJUWSBQQVRFTlRTLENPUFlSSUdIVFMsIFRSQURFTUFSS1MgT1IgT1RIRVIgUklHSFRTLgoKQ09QWVJJR0hUIEhPTERFUlMgV0lMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCBPUkNPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HIE9VVCBPRiBBTlkgVVNFIE9GIFRIRSBTT0ZUV0FSRSBPUiBET0NVTUVOVEFUSU9OLgpUaGUgbmFtZSBhbmQgdHJhZGVtYXJrcyBvZiBjb3B5cmlnaHQgaG9sZGVycyBtYXkgTk9UIGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gdGhlCnNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gVGl0bGUgdG8gY29weXJpZ2h0IGluIHRoaXMgc29mdHdhcmUgYW5kIGFueSBhc3NvY2lhdGVkCmRvY3VtZW50YXRpb24gd2lsbCBhdCBhbGwgdGltZXMgcmVtYWluIHdpdGggY29weXJpZ2h0IGhvbGRlcnMuCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KClRoaXMgZm9ybXVsYXRpb24gb2YgVzNDJ3Mgbm90aWNlIGFuZCBsaWNlbnNlIGJlY2FtZSBhY3RpdmUgb24gRGVjZW1iZXIgMzEgMjAwMi4gVGhpcyB2ZXJzaW9uIHJlbW92ZXMgdGhlCmNvcHlyaWdodCBvd25lcnNoaXAgbm90aWNlIHN1Y2ggdGhhdCB0aGlzIGxpY2Vuc2UgY2FuIGJlIHVzZWQgd2l0aCBtYXRlcmlhbHMgb3RoZXIgdGhhbiB0aG9zZSBvd25lZCBieSB0aGUKVzNDLCByZWZsZWN0cyB0aGF0IEVSQ0lNIGlzIG5vdyBhIGhvc3Qgb2YgdGhlIFczQywgaW5jbHVkZXMgcmVmZXJlbmNlcyB0byB0aGlzIHNwZWNpZmljIGRhdGVkIHZlcnNpb24gb2YgdGhlCmxpY2Vuc2UsIGFuZCByZW1vdmVzIHRoZSBhbWJpZ3VvdXMgZ3JhbnQgb2YgInVzZSIuIE90aGVyd2lzZSwgdGhpcyB2ZXJzaW9uIGlzIHRoZSBzYW1lIGFzIHRoZSBwcmV2aW91cwp2ZXJzaW9uIGFuZCBpcyB3cml0dGVuIHNvIGFzIHRvIHByZXNlcnZlIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBhc3Nlc3NtZW50IG9mIEdQTCBjb21wYXRpYmlsaXR5IGFuZApPU0kncyBjZXJ0aWZpY2F0aW9uIHVuZGVyIHRoZSBPcGVuIFNvdXJjZSBEZWZpbml0aW9uLiBQbGVhc2Ugc2VlIG91ciBDb3B5cmlnaHQgRkFRIGZvciBjb21tb24gcXVlc3Rpb25zCmFib3V0IHVzaW5nIG1hdGVyaWFscyBmcm9tIG91ciBzaXRlLCBpbmNsdWRpbmcgc3BlY2lmaWMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHBhY2thZ2VzIGxpa2UgbGlid3d3LCBBbWF5YSwKYW5kIEppZ3Nhdy4gT3RoZXIgcXVlc3Rpb25zIGFib3V0IHRoaXMgbm90aWNlIGNhbiBiZSBkaXJlY3RlZCB0byAKc2l0ZS1wb2xpY3lAdzMub3JnLgoKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIFhhbGFuLCBYZXJjZXMsIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoKLyoKICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQogKgogKgogKiBDb3B5cmlnaHQgKGMpIDE5OTktMjAwMyBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzICAqIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gICoKICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQogKiAgICBkaXN0cmlidXRpb24uCiAqCiAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAogKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgCiAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQogKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLCAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuICoKICogNC4gVGhlIG5hbWVzICJYZXJjZXMiIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCiAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiAKICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCiAqCiAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAogKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgogKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCiAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgogKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCiAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAogKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICoKICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCiAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBJbnRlcm5hdGlvbmFsCiAqIEJ1c2luZXNzIE1hY2hpbmVzLCBJbmMuLCBodHRwOi8vd3d3LmlibS5jb20uICBGb3IgbW9yZQogKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKICogCgolJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gSmF2YVNjcmlwdCwgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogCgpBTUVORE1FTlRTIApUaGUgTmV0c2NhcGUgUHVibGljIExpY2Vuc2UgVmVyc2lvbiAxLjEgKCJOUEwiKSBjb25zaXN0cyBvZiB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSB3aXRoIHRoZSBmb2xsb3dpbmcgQW1lbmRtZW50cywgaW5jbHVkaW5nIEV4aGliaXQgQS1OZXRzY2FwZSBQdWJsaWMgTGljZW5zZS6gIEZpbGVzIGlkZW50aWZpZWQgd2l0aCAiRXhoaWJpdCBBLU5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlIiBhcmUgZ292ZXJuZWQgYnkgdGhlIE5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlIFZlcnNpb24gMS4xLiAKQWRkaXRpb25hbCBUZXJtcyBhcHBsaWNhYmxlIHRvIHRoZSBOZXRzY2FwZSBQdWJsaWMgTGljZW5zZS4gCkkuIEVmZmVjdC4gClRoZXNlIGFkZGl0aW9uYWwgdGVybXMgZGVzY3JpYmVkIGluIHRoaXMgTmV0c2NhcGUgUHVibGljIExpY2Vuc2UgLS0gQW1lbmRtZW50cyBzaGFsbCBhcHBseSB0byB0aGUgTW96aWxsYSBDb21tdW5pY2F0b3IgY2xpZW50IGNvZGUgYW5kIHRvIGFsbCBDb3ZlcmVkIENvZGUgdW5kZXIgdGhpcyBMaWNlbnNlLiAKSUkuICcnTmV0c2NhcGUncyBCcmFuZGVkIENvZGUnJyBtZWFucyBDb3ZlcmVkIENvZGUgdGhhdCBOZXRzY2FwZSBkaXN0cmlidXRlcyBhbmQvb3IgcGVybWl0cyBvdGhlcnMgdG8gZGlzdHJpYnV0ZSB1bmRlciBvbmUgb3IgbW9yZSB0cmFkZW1hcmsocykgd2hpY2ggYXJlIGNvbnRyb2xsZWQgYnkgTmV0c2NhcGUgYnV0IHdoaWNoIGFyZSBub3QgbGljZW5zZWQgZm9yIHVzZSB1bmRlciB0aGlzIExpY2Vuc2UuIApJSUkuIE5ldHNjYXBlIGFuZCBsb2dvLiAKVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IGFueSByaWdodHMgdG8gdXNlIHRoZSB0cmFkZW1hcmtzICJOZXRzY2FwZScnLCB0aGUgIk5ldHNjYXBlIE4gYW5kIGhvcml6b24nJyBsb2dvIG9yIHRoZSAiTmV0c2NhcGUgbGlnaHRob3VzZSIgbG9nbywgIk5ldGNlbnRlciIsICJHZWNrbyIsICJKYXZhIiBvciAiSmF2YVNjcmlwdCIsICJTbWFydCBCcm93c2luZyIgZXZlbiBpZiBzdWNoIG1hcmtzIGFyZSBpbmNsdWRlZCBpbiB0aGUgT3JpZ2luYWwgQ29kZSBvciBNb2RpZmljYXRpb25zLiAKSVYuIEluYWJpbGl0eSB0byBDb21wbHkgRHVlIHRvIENvbnRyYWN0dWFsIE9ibGlnYXRpb24uIApQcmlvciB0byBsaWNlbnNpbmcgdGhlIE9yaWdpbmFsIENvZGUgdW5kZXIgdGhpcyBMaWNlbnNlLCBOZXRzY2FwZSBoYXMgbGljZW5zZWQgdGhpcmQgcGFydHkgY29kZSBmb3IgdXNlIGluIE5ldHNjYXBlJ3MgQnJhbmRlZCBDb2RlLiBUbyB0aGUgZXh0ZW50IHRoYXQgTmV0c2NhcGUgaXMgbGltaXRlZCBjb250cmFjdHVhbGx5IGZyb20gbWFraW5nIHN1Y2ggdGhpcmQgcGFydHkgY29kZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBMaWNlbnNlLCBOZXRzY2FwZSBtYXkgY2hvb3NlIHRvIHJlaW50ZWdyYXRlIHN1Y2ggY29kZSBpbnRvIENvdmVyZWQgQ29kZSB3aXRob3V0IGJlaW5nIHJlcXVpcmVkIHRvIGRpc3RyaWJ1dGUgc3VjaCBjb2RlIGluIFNvdXJjZSBDb2RlIGZvcm0sIGV2ZW4gaWYgc3VjaCBjb2RlIHdvdWxkIG90aGVyd2lzZSBiZSBjb25zaWRlcmVkICcnTW9kaWZpY2F0aW9ucycnIHVuZGVyIHRoaXMgTGljZW5zZS4gClYuIFVzZSBvZiBNb2RpZmljYXRpb25zIGFuZCBDb3ZlcmVkIENvZGUgYnkgSW5pdGlhbCBEZXZlbG9wZXIuIApWLjEuIEluIEdlbmVyYWwuIApUaGUgb2JsaWdhdGlvbnMgb2YgU2VjdGlvbiAzIGFwcGx5IHRvIE5ldHNjYXBlLCBleGNlcHQgdG8gdGhlIGV4dGVudCBzcGVjaWZpZWQgaW4gdGhpcyBBbWVuZG1lbnQsIFNlY3Rpb24gVi4yIGFuZCBWLjMuIApWLjIuIE90aGVyIFByb2R1Y3RzLiAKTmV0c2NhcGUgbWF5IGluY2x1ZGUgQ292ZXJlZCBDb2RlIGluIHByb2R1Y3RzIG90aGVyIHRoYW4gdGhlIE5ldHNjYXBlJ3MgQnJhbmRlZCBDb2RlIHdoaWNoIGFyZSByZWxlYXNlZCBieSBOZXRzY2FwZSBkdXJpbmcgdGhlIHR3byAoMikgeWVhcnMgZm9sbG93aW5nIHRoZSByZWxlYXNlIGRhdGUgb2YgdGhlIE9yaWdpbmFsIENvZGUsIHdpdGhvdXQgc3VjaCBhZGRpdGlvbmFsIHByb2R1Y3RzIGJlY29taW5nIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgYW5kIG1heSBsaWNlbnNlIHN1Y2ggYWRkaXRpb25hbCBwcm9kdWN0cyBvbiBkaWZmZXJlbnQgdGVybXMgZnJvbSB0aG9zZSBjb250YWluZWQgaW4gdGhpcyBMaWNlbnNlLiAKVi4zLiBBbHRlcm5hdGl2ZSBMaWNlbnNpbmcuIApOZXRzY2FwZSBtYXkgbGljZW5zZSB0aGUgU291cmNlIENvZGUgb2YgTmV0c2NhcGUncyBCcmFuZGVkIENvZGUsIGluY2x1ZGluZyBNb2RpZmljYXRpb25zIGluY29ycG9yYXRlZCB0aGVyZWluLCB3aXRob3V0IHN1Y2ggTmV0c2NhcGUgQnJhbmRlZCBDb2RlIGJlY29taW5nIHN1YmplY3QgdG8gdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgYW5kIG1heSBsaWNlbnNlIHN1Y2ggTmV0c2NhcGUgQnJhbmRlZCBDb2RlIG9uIGRpZmZlcmVudCB0ZXJtcyBmcm9tIHRob3NlIGNvbnRhaW5lZCBpbiB0aGlzIExpY2Vuc2UuIAqgClZJLiBMaXRpZ2F0aW9uLiAKTm90d2l0aHN0YW5kaW5nIHRoZSBsaW1pdGF0aW9ucyBvZiBTZWN0aW9uIDExIGFib3ZlLCB0aGUgcHJvdmlzaW9ucyByZWdhcmRpbmcgbGl0aWdhdGlvbiBpbiBTZWN0aW9uIDExKGEpLCAoYikgYW5kIChjKSBvZiB0aGUgTGljZW5zZSBzaGFsbCBhcHBseSB0byBhbGwgZGlzcHV0ZXMgcmVsYXRpbmcgdG8gdGhpcyBMaWNlbnNlLgoKRVhISUJJVCBBLU5ldHNjYXBlIFB1YmxpYyBMaWNlbnNlLiAKoCAKJydUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBOZXRzY2FwZSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IGh0dHA6Ly93d3cubW96aWxsYS5vcmcvTlBMLyAKU29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBiYXNpcywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHJpZ2h0cyBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIApUaGUgT3JpZ2luYWwgQ29kZSBpcyBNb3ppbGxhIENvbW11bmljYXRvciBjbGllbnQgY29kZSwgcmVsZWFzZWQgTWFyY2ggMzEsIDE5OTguIApUaGUgSW5pdGlhbCBEZXZlbG9wZXIgb2YgdGhlIE9yaWdpbmFsIENvZGUgaXMgTmV0c2NhcGUgQ29tbXVuaWNhdGlvbnMgQ29ycG9yYXRpb24uIFBvcnRpb25zIGNyZWF0ZWQgYnkgTmV0c2NhcGUgYXJlIENvcHlyaWdodCAoQykgMTk5OC0xOTk5IE5ldHNjYXBlIENvbW11bmljYXRpb25zIENvcnBvcmF0aW9uLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKQ29udHJpYnV0b3Iocyk6IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fLgqgIApBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgX19fX18gbGljZW5zZSAodGhloCAiW19fX10gTGljZW5zZSIpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIFtfX19fX19dIExpY2Vuc2UgYXJlIGFwcGxpY2FibGWgIGluc3RlYWQgb2YgdGhvc2UgYWJvdmUuoCBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgW19fX19dIExpY2Vuc2UgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE5QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZ6AgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2WgIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBbX19fXSBMaWNlbnNlLqAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE5QTCBvciB0aGUgW19fX10gTGljZW5zZS4iCgpNT1pJTExBIFBVQkxJQyBMSUNFTlNFIApWZXJzaW9uIDEuMSAKCjEuIERlZmluaXRpb25zLiAKMS4wLjEuICJDb21tZXJjaWFsIFVzZSIgbWVhbnMgZGlzdHJpYnV0aW9uIG9yIG90aGVyd2lzZSBtYWtpbmcgdGhlIENvdmVyZWQgQ29kZSBhdmFpbGFibGUgdG8gYSB0aGlyZCBwYXJ0eS4gCjEuMS4gJydDb250cmlidXRvcicnIG1lYW5zIGVhY2ggZW50aXR5IHRoYXQgY3JlYXRlcyBvciBjb250cmlidXRlcyB0byB0aGUgY3JlYXRpb24gb2YgTW9kaWZpY2F0aW9ucy4gCjEuMi4gJydDb250cmlidXRvciBWZXJzaW9uJycgbWVhbnMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlLCBwcmlvciBNb2RpZmljYXRpb25zIHVzZWQgYnkgYSBDb250cmlidXRvciwgYW5kIHRoZSBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBwYXJ0aWN1bGFyIENvbnRyaWJ1dG9yLiAKMS4zLiAnJ0NvdmVyZWQgQ29kZScnIG1lYW5zIHRoZSBPcmlnaW5hbCBDb2RlIG9yIE1vZGlmaWNhdGlvbnMgb3IgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIGFuZCBNb2RpZmljYXRpb25zLCBpbiBlYWNoIGNhc2UgaW5jbHVkaW5nIHBvcnRpb25zIHRoZXJlb2YuIAoxLjQuICcnRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtJycgbWVhbnMgYSBtZWNoYW5pc20gZ2VuZXJhbGx5IGFjY2VwdGVkIGluIHRoZSBzb2Z0d2FyZSBkZXZlbG9wbWVudCBjb21tdW5pdHkgZm9yIHRoZSBlbGVjdHJvbmljIHRyYW5zZmVyIG9mIGRhdGEuIAoxLjUuICcnRXhlY3V0YWJsZScnIG1lYW5zIENvdmVyZWQgQ29kZSBpbiBhbnkgZm9ybSBvdGhlciB0aGFuIFNvdXJjZSBDb2RlLiAKMS42LiAnJ0luaXRpYWwgRGV2ZWxvcGVyJycgbWVhbnMgdGhlIGluZGl2aWR1YWwgb3IgZW50aXR5IGlkZW50aWZpZWQgYXMgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdCBBLiAKMS43LiAnJ0xhcmdlciBXb3JrJycgbWVhbnMgYSB3b3JrIHdoaWNoIGNvbWJpbmVzIENvdmVyZWQgQ29kZSBvciBwb3J0aW9ucyB0aGVyZW9mIHdpdGggY29kZSBub3QgZ292ZXJuZWQgYnkgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gCjEuOC4gJydMaWNlbnNlJycgbWVhbnMgdGhpcyBkb2N1bWVudC4gCjEuOC4xLiAiTGljZW5zYWJsZSIgbWVhbnMgaGF2aW5nIHRoZSByaWdodCB0byBncmFudCwgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlLCB3aGV0aGVyIGF0IHRoZSB0aW1lIG9mIHRoZSBpbml0aWFsIGdyYW50IG9yIHN1YnNlcXVlbnRseSBhY3F1aXJlZCwgYW55IGFuZCBhbGwgb2YgdGhlIHJpZ2h0cyBjb252ZXllZCBoZXJlaW4uIAoxLjkuICcnTW9kaWZpY2F0aW9ucycnIG1lYW5zIGFueSBhZGRpdGlvbiB0byBvciBkZWxldGlvbiBmcm9tIHRoZSBzdWJzdGFuY2Ugb3Igc3RydWN0dXJlIG9mIGVpdGhlciB0aGUgT3JpZ2luYWwgQ29kZSBvciBhbnkgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4gV2hlbiBDb3ZlcmVkIENvZGUgaXMgcmVsZWFzZWQgYXMgYSBzZXJpZXMgb2YgZmlsZXMsIGEgTW9kaWZpY2F0aW9uIGlzOiAKQS4gQW55IGFkZGl0aW9uIHRvIG9yIGRlbGV0aW9uIGZyb20gdGhlIGNvbnRlbnRzIG9mIGEgZmlsZSBjb250YWluaW5nIE9yaWdpbmFsIENvZGUgb3IgcHJldmlvdXMgTW9kaWZpY2F0aW9ucy4gCkIuIEFueSBuZXcgZmlsZSB0aGF0IGNvbnRhaW5zIGFueSBwYXJ0IG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yIHByZXZpb3VzIE1vZGlmaWNhdGlvbnMuIAqgCjEuMTAuICcnT3JpZ2luYWwgQ29kZScnIG1lYW5zIFNvdXJjZSBDb2RlIG9mIGNvbXB1dGVyIHNvZnR3YXJlIGNvZGUgd2hpY2ggaXMgZGVzY3JpYmVkIGluIHRoZSBTb3VyY2UgQ29kZSBub3RpY2UgcmVxdWlyZWQgYnkgRXhoaWJpdCBBIGFzIE9yaWdpbmFsIENvZGUsIGFuZCB3aGljaCwgYXQgdGhlIHRpbWUgb2YgaXRzIHJlbGVhc2UgdW5kZXIgdGhpcyBMaWNlbnNlIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZSBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UuIAoxLjEwLjEuICJQYXRlbnQgQ2xhaW1zIiBtZWFucyBhbnkgcGF0ZW50IGNsYWltKHMpLCBub3cgb3duZWQgb3IgaGVyZWFmdGVyIGFjcXVpcmVkLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uLKAgbWV0aG9kLCBwcm9jZXNzLCBhbmQgYXBwYXJhdHVzIGNsYWltcywgaW4gYW55IHBhdGVudCBMaWNlbnNhYmxlIGJ5IGdyYW50b3IuIAoxLjExLiAnJ1NvdXJjZSBDb2RlJycgbWVhbnMgdGhlIHByZWZlcnJlZCBmb3JtIG9mIHRoZSBDb3ZlcmVkIENvZGUgZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LCBpbmNsdWRpbmcgYWxsIG1vZHVsZXMgaXQgY29udGFpbnMsIHBsdXMgYW55IGFzc29jaWF0ZWQgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMsIHNjcmlwdHMgdXNlZCB0byBjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgYW4gRXhlY3V0YWJsZSwgb3Igc291cmNlIGNvZGUgZGlmZmVyZW50aWFsIGNvbXBhcmlzb25zIGFnYWluc3QgZWl0aGVyIHRoZSBPcmlnaW5hbCBDb2RlIG9yIGFub3RoZXIgd2VsbCBrbm93biwgYXZhaWxhYmxlIENvdmVyZWQgQ29kZSBvZiB0aGUgQ29udHJpYnV0b3IncyBjaG9pY2UuIFRoZSBTb3VyY2UgQ29kZSBjYW4gYmUgaW4gYSBjb21wcmVzc2VkIG9yIGFyY2hpdmFsIGZvcm0sIHByb3ZpZGVkIHRoZSBhcHByb3ByaWF0ZSBkZWNvbXByZXNzaW9uIG9yIGRlLWFyY2hpdmluZyBzb2Z0d2FyZSBpcyB3aWRlbHkgYXZhaWxhYmxlIGZvciBubyBjaGFyZ2UuIAoxLjEyLiAiWW91JycgKG9yICJZb3VyIimgIG1lYW5zIGFuIGluZGl2aWR1YWwgb3IgYSBsZWdhbCBlbnRpdHkgZXhlcmNpc2luZyByaWdodHMgdW5kZXIsIGFuZCBjb21wbHlpbmcgd2l0aCBhbGwgb2YgdGhlIHRlcm1zIG9mLCB0aGlzIExpY2Vuc2Ugb3IgYSBmdXR1cmUgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgaXNzdWVkIHVuZGVyIFNlY3Rpb24gNi4xLiBGb3IgbGVnYWwgZW50aXRpZXMsICJZb3UnJyBpbmNsdWRlcyBhbnkgZW50aXR5IHdoaWNoIGNvbnRyb2xzLCBpcyBjb250cm9sbGVkIGJ5LCBvciBpcyB1bmRlciBjb21tb24gY29udHJvbCB3aXRoIFlvdS4gRm9yIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgImNvbnRyb2wnJyBtZWFucyAoYSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZSBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvciBvdGhlcndpc2UsIG9yIChiKSBvd25lcnNoaXAgb2YgbW9yZSB0aGFuIGZpZnR5IHBlcmNlbnQgKDUwJSkgb2YgdGhlIG91dHN0YW5kaW5nIHNoYXJlcyBvciBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KMi4gU291cmNlIENvZGUgTGljZW5zZS4gCjIuMS4gVGhlIEluaXRpYWwgRGV2ZWxvcGVyIEdyYW50LiAKVGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UsIHN1YmplY3QgdG8gdGhpcmQgcGFydHkgaW50ZWxsZWN0dWFsIHByb3BlcnR5IGNsYWltczogCihhKaAgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IEluaXRpYWwgRGV2ZWxvcGVyIHRvIHVzZSwgcmVwcm9kdWNlLCBtb2RpZnksIGRpc3BsYXksIHBlcmZvcm0sIHN1YmxpY2Vuc2UgYW5kIGRpc3RyaWJ1dGUgdGhlIE9yaWdpbmFsIENvZGUgKG9yIHBvcnRpb25zIHRoZXJlb2YpIHdpdGggb3Igd2l0aG91dCBNb2RpZmljYXRpb25zLCBhbmQvb3IgYXMgcGFydCBvZiBhIExhcmdlciBXb3JrOyBhbmQgCihiKSB1bmRlciBQYXRlbnRzIENsYWltcyBpbmZyaW5nZWQgYnkgdGhlIG1ha2luZywgdXNpbmcgb3Igc2VsbGluZyBvZiBPcmlnaW5hbCBDb2RlLCB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgcHJhY3RpY2UsIHNlbGwsIGFuZCBvZmZlciBmb3Igc2FsZSwgYW5kL29yIG90aGVyd2lzZSBkaXNwb3NlIG9mIHRoZSBPcmlnaW5hbCBDb2RlIChvciBwb3J0aW9ucyB0aGVyZW9mKS4gCqAKKGMpIHRoZSBsaWNlbnNlcyBncmFudGVkIGluIHRoaXMgU2VjdGlvbiAyLjEoYSkgYW5kIChiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIEluaXRpYWwgRGV2ZWxvcGVyIGZpcnN0IGRpc3RyaWJ1dGVzIE9yaWdpbmFsIENvZGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4gCihkKSBOb3R3aXRoc3RhbmRpbmcgU2VjdGlvbiAyLjEoYikgYWJvdmUsIG5vIHBhdGVudCBsaWNlbnNlIGlzIGdyYW50ZWQ6IDEpIGZvciBjb2RlIHRoYXQgWW91IGRlbGV0ZSBmcm9tIHRoZSBPcmlnaW5hbCBDb2RlOyAyKSBzZXBhcmF0ZSBmcm9tIHRoZSBPcmlnaW5hbCBDb2RlO6Agb3IgMykgZm9yIGluZnJpbmdlbWVudHMgY2F1c2VkIGJ5OiBpKSB0aGUgbW9kaWZpY2F0aW9uIG9mIHRoZSBPcmlnaW5hbCBDb2RlIG9yIGlpKSB0aGUgY29tYmluYXRpb24gb2YgdGhlIE9yaWdpbmFsIENvZGUgd2l0aCBvdGhlciBzb2Z0d2FyZSBvciBkZXZpY2VzLiAKoAoyLjIuIENvbnRyaWJ1dG9yIEdyYW50LiAKU3ViamVjdCB0byB0aGlyZCBwYXJ0eSBpbnRlbGxlY3R1YWwgcHJvcGVydHkgY2xhaW1zLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgWW91IGEgd29ybGQtd2lkZSwgcm95YWx0eS1mcmVlLCBub24tZXhjbHVzaXZlIGxpY2Vuc2UgCqAgCihhKaAgdW5kZXIgaW50ZWxsZWN0dWFsIHByb3BlcnR5IHJpZ2h0cyAob3RoZXIgdGhhbiBwYXRlbnQgb3IgdHJhZGVtYXJrKSBMaWNlbnNhYmxlIGJ5IENvbnRyaWJ1dG9yLCB0byB1c2UsIHJlcHJvZHVjZSwgbW9kaWZ5LCBkaXNwbGF5LCBwZXJmb3JtLCBzdWJsaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBNb2RpZmljYXRpb25zIGNyZWF0ZWQgYnkgc3VjaCBDb250cmlidXRvciAob3IgcG9ydGlvbnMgdGhlcmVvZikgZWl0aGVyIG9uIGFuIHVubW9kaWZpZWQgYmFzaXMsIHdpdGggb3RoZXIgTW9kaWZpY2F0aW9ucywgYXMgQ292ZXJlZCBDb2RlIGFuZC9vciBhcyBwYXJ0IG9mIGEgTGFyZ2VyIFdvcms7IGFuZCAKKGIpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IHRoZSBtYWtpbmcsIHVzaW5nLCBvciBzZWxsaW5nIG9moCBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciBlaXRoZXIgYWxvbmUgYW5kL29yIGluIGNvbWJpbmF0aW9uIHdpdGggaXRzIENvbnRyaWJ1dG9yIFZlcnNpb24gKG9yIHBvcnRpb25zIG9mIHN1Y2ggY29tYmluYXRpb24pLCB0byBtYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBoYXZlIG1hZGUsIGFuZC9vciBvdGhlcndpc2UgZGlzcG9zZSBvZjogMSkgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgQ29udHJpYnV0b3IgKG9yIHBvcnRpb25zIHRoZXJlb2YpOyBhbmQgMikgdGhlIGNvbWJpbmF0aW9uIG9moCBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIGl0cyBDb250cmlidXRvciBWZXJzaW9uIChvciBwb3J0aW9ucyBvZiBzdWNoIGNvbWJpbmF0aW9uKS4gCihjKSB0aGUgbGljZW5zZXMgZ3JhbnRlZCBpbiBTZWN0aW9ucyAyLjIoYSkgYW5kIDIuMihiKSBhcmUgZWZmZWN0aXZlIG9uIHRoZSBkYXRlIENvbnRyaWJ1dG9yIGZpcnN0IG1ha2VzIENvbW1lcmNpYWwgVXNlIG9mIHRoZSBDb3ZlcmVkIENvZGUuIAooZCmgoKAgTm90d2l0aHN0YW5kaW5nIFNlY3Rpb24gMi4yKGIpIGFib3ZlLCBubyBwYXRlbnQgbGljZW5zZSBpcyBncmFudGVkOiAxKSBmb3IgYW55IGNvZGUgdGhhdCBDb250cmlidXRvciBoYXMgZGVsZXRlZCBmcm9tIHRoZSBDb250cmlidXRvciBWZXJzaW9uOyAyKaAgc2VwYXJhdGUgZnJvbSB0aGUgQ29udHJpYnV0b3IgVmVyc2lvbjugIDMpoCBmb3IgaW5mcmluZ2VtZW50cyBjYXVzZWQgYnk6IGkpIHRoaXJkIHBhcnR5IG1vZGlmaWNhdGlvbnMgb2YgQ29udHJpYnV0b3IgVmVyc2lvbiBvciBpaSmgIHRoZSBjb21iaW5hdGlvbiBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvciB3aXRoIG90aGVyIHNvZnR3YXJloCAoZXhjZXB0IGFzIHBhcnQgb2YgdGhlIENvbnRyaWJ1dG9yIFZlcnNpb24pIG9yIG90aGVyIGRldmljZXM7IG9yIDQpIHVuZGVyIFBhdGVudCBDbGFpbXMgaW5mcmluZ2VkIGJ5IENvdmVyZWQgQ29kZSBpbiB0aGUgYWJzZW5jZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgdGhhdCBDb250cmlidXRvci4KCjMuIERpc3RyaWJ1dGlvbiBPYmxpZ2F0aW9ucy4gCjMuMS4gQXBwbGljYXRpb24gb2YgTGljZW5zZS4gClRoZSBNb2RpZmljYXRpb25zIHdoaWNoIFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgYXJlIGdvdmVybmVkIGJ5IHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gU2VjdGlvbiAyLjIuIFRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mIENvdmVyZWQgQ29kZSBtYXkgYmUgZGlzdHJpYnV0ZWQgb25seSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIG9yIGEgZnV0dXJlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIHJlbGVhc2VkIHVuZGVyIFNlY3Rpb24gNi4xLCBhbmQgWW91IG11c3QgaW5jbHVkZSBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlIHdpdGggZXZlcnkgY29weSBvZiB0aGUgU291cmNlIENvZGUgWW91IGRpc3RyaWJ1dGUuIFlvdSBtYXkgbm90IG9mZmVyIG9yIGltcG9zZSBhbnkgdGVybXMgb24gYW55IFNvdXJjZSBDb2RlIHZlcnNpb24gdGhhdCBhbHRlcnMgb3IgcmVzdHJpY3RzIHRoZSBhcHBsaWNhYmxlIHZlcnNpb24gb2YgdGhpcyBMaWNlbnNlIG9yIHRoZSByZWNpcGllbnRzJyByaWdodHMgaGVyZXVuZGVyLiBIb3dldmVyLCBZb3UgbWF5IGluY2x1ZGUgYW4gYWRkaXRpb25hbCBkb2N1bWVudCBvZmZlcmluZyB0aGUgYWRkaXRpb25hbCByaWdodHMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy41LiAKMy4yLiBBdmFpbGFiaWxpdHkgb2YgU291cmNlIENvZGUuIApBbnkgTW9kaWZpY2F0aW9uIHdoaWNoIFlvdSBjcmVhdGUgb3IgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgbXVzdCBiZSBtYWRlIGF2YWlsYWJsZSBpbiBTb3VyY2UgQ29kZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgZWl0aGVyIG9uIHRoZSBzYW1lIG1lZGlhIGFzIGFuIEV4ZWN1dGFibGUgdmVyc2lvbiBvciB2aWEgYW4gYWNjZXB0ZWQgRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtIHRvIGFueW9uZSB0byB3aG9tIHlvdSBtYWRlIGFuIEV4ZWN1dGFibGUgdmVyc2lvbiBhdmFpbGFibGU7IGFuZCBpZiBtYWRlIGF2YWlsYWJsZSB2aWEgRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtLCBtdXN0IHJlbWFpbiBhdmFpbGFibGUgZm9yIGF0IGxlYXN0IHR3ZWx2ZSAoMTIpIG1vbnRocyBhZnRlciB0aGUgZGF0ZSBpdCBpbml0aWFsbHkgYmVjYW1lIGF2YWlsYWJsZSwgb3IgYXQgbGVhc3Qgc2l4ICg2KSBtb250aHMgYWZ0ZXIgYSBzdWJzZXF1ZW50IHZlcnNpb24gb2YgdGhhdCBwYXJ0aWN1bGFyIE1vZGlmaWNhdGlvbiBoYXMgYmVlbiBtYWRlIGF2YWlsYWJsZSB0byBzdWNoIHJlY2lwaWVudHMuIFlvdSBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgdGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gcmVtYWlucyBhdmFpbGFibGUgZXZlbiBpZiB0aGUgRWxlY3Ryb25pYyBEaXN0cmlidXRpb24gTWVjaGFuaXNtIGlzIG1haW50YWluZWQgYnkgYSB0aGlyZCBwYXJ0eS4gCjMuMy4gRGVzY3JpcHRpb24gb2YgTW9kaWZpY2F0aW9ucy4gCllvdSBtdXN0IGNhdXNlIGFsbCBDb3ZlcmVkIENvZGUgdG8gd2hpY2ggWW91IGNvbnRyaWJ1dGUgdG8gY29udGFpbiBhIGZpbGUgZG9jdW1lbnRpbmcgdGhlIGNoYW5nZXMgWW91IG1hZGUgdG8gY3JlYXRlIHRoYXQgQ292ZXJlZCBDb2RlIGFuZCB0aGUgZGF0ZSBvZiBhbnkgY2hhbmdlLiBZb3UgbXVzdCBpbmNsdWRlIGEgcHJvbWluZW50IHN0YXRlbWVudCB0aGF0IHRoZSBNb2RpZmljYXRpb24gaXMgZGVyaXZlZCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgZnJvbSBPcmlnaW5hbCBDb2RlIHByb3ZpZGVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgaW5jbHVkaW5nIHRoZSBuYW1lIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBpbiAoYSkgdGhlIFNvdXJjZSBDb2RlLCBhbmQgKGIpIGluIGFueSBub3RpY2UgaW4gYW4gRXhlY3V0YWJsZSB2ZXJzaW9uIG9yIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBpbiB3aGljaCBZb3UgZGVzY3JpYmUgdGhlIG9yaWdpbiBvciBvd25lcnNoaXAgb2YgdGhlIENvdmVyZWQgQ29kZS4gCjMuNC4gSW50ZWxsZWN0dWFsIFByb3BlcnR5IE1hdHRlcnMgCihhKSBUaGlyZCBQYXJ0eSBDbGFpbXMuIApJZiBDb250cmlidXRvciBoYXMga25vd2xlZGdlIHRoYXQgYSBsaWNlbnNlIHVuZGVyIGEgdGhpcmQgcGFydHkncyBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIGlzIHJlcXVpcmVkIHRvIGV4ZXJjaXNlIHRoZSByaWdodHMgZ3JhbnRlZCBieSBzdWNoIENvbnRyaWJ1dG9yIHVuZGVyIFNlY3Rpb25zIDIuMSBvciAyLjIsIENvbnRyaWJ1dG9yIG11c3QgaW5jbHVkZSBhIHRleHQgZmlsZSB3aXRoIHRoZSBTb3VyY2UgQ29kZSBkaXN0cmlidXRpb24gdGl0bGVkICJMRUdBTCcnIHdoaWNoIGRlc2NyaWJlcyB0aGUgY2xhaW0gYW5kIHRoZSBwYXJ0eSBtYWtpbmcgdGhlIGNsYWltIGluIHN1ZmZpY2llbnQgZGV0YWlsIHRoYXQgYSByZWNpcGllbnQgd2lsbCBrbm93IHdob20gdG8gY29udGFjdC4gSWYgQ29udHJpYnV0b3Igb2J0YWlucyBzdWNoIGtub3dsZWRnZSBhZnRlciB0aGUgTW9kaWZpY2F0aW9uIGlzIG1hZGUgYXZhaWxhYmxlIGFzIGRlc2NyaWJlZCBpbiBTZWN0aW9uIDMuMiwgQ29udHJpYnV0b3Igc2hhbGwgcHJvbXB0bHkgbW9kaWZ5IHRoZSBMRUdBTCBmaWxlIGluIGFsbCBjb3BpZXMgQ29udHJpYnV0b3IgbWFrZXMgYXZhaWxhYmxlIHRoZXJlYWZ0ZXIgYW5kIHNoYWxsIHRha2Ugb3RoZXIgc3RlcHMgKHN1Y2ggYXMgbm90aWZ5aW5nIGFwcHJvcHJpYXRlIG1haWxpbmcgbGlzdHMgb3IgbmV3c2dyb3VwcykgcmVhc29uYWJseSBjYWxjdWxhdGVkIHRvIGluZm9ybSB0aG9zZSB3aG8gcmVjZWl2ZWQgdGhlIENvdmVyZWQgQ29kZSB0aGF0IG5ldyBrbm93bGVkZ2UgaGFzIGJlZW4gb2J0YWluZWQuIAooYikgQ29udHJpYnV0b3IgQVBJcy4gCklmIENvbnRyaWJ1dG9yJ3MgTW9kaWZpY2F0aW9ucyBpbmNsdWRlIGFuIGFwcGxpY2F0aW9uIHByb2dyYW1taW5nIGludGVyZmFjZSBhbmQgQ29udHJpYnV0b3IgaGFzIGtub3dsZWRnZSBvZiBwYXRlbnQgbGljZW5zZXMgd2hpY2ggYXJlIHJlYXNvbmFibHkgbmVjZXNzYXJ5IHRvIGltcGxlbWVudCB0aGF0IEFQSSwgQ29udHJpYnV0b3IgbXVzdCBhbHNvIGluY2x1ZGUgdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUgTEVHQUwgZmlsZS4gCqAKoKCgoKCgoKCgIChjKaCgoCBSZXByZXNlbnRhdGlvbnMuIApDb250cmlidXRvciByZXByZXNlbnRzIHRoYXQsIGV4Y2VwdCBhcyBkaXNjbG9zZWQgcHVyc3VhbnQgdG8gU2VjdGlvbiAzLjQoYSkgYWJvdmUsIENvbnRyaWJ1dG9yIGJlbGlldmVzIHRoYXQgQ29udHJpYnV0b3IncyBNb2RpZmljYXRpb25zIGFyZSBDb250cmlidXRvcidzIG9yaWdpbmFsIGNyZWF0aW9uKHMpIGFuZC9vciBDb250cmlidXRvciBoYXMgc3VmZmljaWVudCByaWdodHMgdG8gZ3JhbnQgdGhlIHJpZ2h0cyBjb252ZXllZCBieSB0aGlzIExpY2Vuc2UuCgozLjUuIFJlcXVpcmVkIE5vdGljZXMuIApZb3UgbXVzdCBkdXBsaWNhdGUgdGhlIG5vdGljZSBpbiBFeGhpYml0IEEgaW4gZWFjaCBmaWxlIG9mIHRoZSBTb3VyY2UgQ29kZS6gIElmIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwdXQgc3VjaCBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyIFNvdXJjZSBDb2RlIGZpbGUgZHVlIHRvIGl0cyBzdHJ1Y3R1cmUsIHRoZW4gWW91IG11c3QgaW5jbHVkZSBzdWNoIG5vdGljZSBpbiBhIGxvY2F0aW9uIChzdWNoIGFzIGEgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHVzZXIgd291bGQgYmUgbGlrZWx5IHRvIGxvb2sgZm9yIHN1Y2ggYSBub3RpY2UuoCBJZiBZb3UgY3JlYXRlZCBvbmUgb3IgbW9yZSBNb2RpZmljYXRpb24ocykgWW91IG1heSBhZGQgeW91ciBuYW1lIGFzIGEgQ29udHJpYnV0b3IgdG8gdGhlIG5vdGljZSBkZXNjcmliZWQgaW4gRXhoaWJpdCBBLqAgWW91IG11c3QgYWxzbyBkdXBsaWNhdGUgdGhpcyBMaWNlbnNlIGluIGFueSBkb2N1bWVudGF0aW9uIGZvciB0aGUgU291cmNlIENvZGUgd2hlcmUgWW91IGRlc2NyaWJlIHJlY2lwaWVudHMnIHJpZ2h0cyBvciBvd25lcnNoaXAgcmlnaHRzIHJlbGF0aW5nIHRvIENvdmVyZWQgQ29kZS6gIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLCBhbmQgdG8gY2hhcmdlIGEgZmVlIGZvciwgd2FycmFudHksIHN1cHBvcnQsIGluZGVtbml0eSBvciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgdG8gb25lIG9yIG1vcmUgcmVjaXBpZW50cyBvZiBDb3ZlcmVkIENvZGUuIEhvd2V2ZXIsIFlvdSBtYXkgZG8gc28gb25seSBvbiBZb3VyIG93biBiZWhhbGYsIGFuZCBub3Qgb24gYmVoYWxmIG9mIHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBtdXN0IG1ha2UgaXQgYWJzb2x1dGVseSBjbGVhciB0aGFuIGFueSBzdWNoIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IG9ibGlnYXRpb24gaXMgb2ZmZXJlZCBieSBZb3UgYWxvbmUsIGFuZCBZb3UgaGVyZWJ5IGFncmVlIHRvIGluZGVtbmlmeSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgYW5kIGV2ZXJ5IENvbnRyaWJ1dG9yIGZvciBhbnkgbGlhYmlsaXR5IGluY3VycmVkIGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBzdWNoIENvbnRyaWJ1dG9yIGFzIGEgcmVzdWx0IG9mIHdhcnJhbnR5LCBzdXBwb3J0LCBpbmRlbW5pdHkgb3IgbGlhYmlsaXR5IHRlcm1zIFlvdSBvZmZlci4gCjMuNi4gRGlzdHJpYnV0aW9uIG9mIEV4ZWN1dGFibGUgVmVyc2lvbnMuIApZb3UgbWF5IGRpc3RyaWJ1dGUgQ292ZXJlZCBDb2RlIGluIEV4ZWN1dGFibGUgZm9ybSBvbmx5IGlmIHRoZSByZXF1aXJlbWVudHMgb2YgU2VjdGlvbiAzLjEtMy41IGhhdmUgYmVlbiBtZXQgZm9yIHRoYXQgQ292ZXJlZCBDb2RlLCBhbmQgaWYgWW91IGluY2x1ZGUgYSBub3RpY2Ugc3RhdGluZyB0aGF0IHRoZSBTb3VyY2UgQ29kZSB2ZXJzaW9uIG9mIHRoZSBDb3ZlcmVkIENvZGUgaXMgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UsIGluY2x1ZGluZyBhIGRlc2NyaXB0aW9uIG9mIGhvdyBhbmQgd2hlcmUgWW91IGhhdmUgZnVsZmlsbGVkIHRoZSBvYmxpZ2F0aW9ucyBvZiBTZWN0aW9uIDMuMi4gVGhlIG5vdGljZSBtdXN0IGJlIGNvbnNwaWN1b3VzbHkgaW5jbHVkZWQgaW4gYW55IG5vdGljZSBpbiBhbiBFeGVjdXRhYmxlIHZlcnNpb24sIHJlbGF0ZWQgZG9jdW1lbnRhdGlvbiBvciBjb2xsYXRlcmFsIGluIHdoaWNoIFlvdSBkZXNjcmliZSByZWNpcGllbnRzJyByaWdodHMgcmVsYXRpbmcgdG8gdGhlIENvdmVyZWQgQ29kZS4gWW91IG1heSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gb2YgQ292ZXJlZCBDb2RlIG9yIG93bmVyc2hpcCByaWdodHMgdW5kZXIgYSBsaWNlbnNlIG9mIFlvdXIgY2hvaWNlLCB3aGljaCBtYXkgY29udGFpbiB0ZXJtcyBkaWZmZXJlbnQgZnJvbSB0aGlzIExpY2Vuc2UsIHByb3ZpZGVkIHRoYXQgWW91IGFyZSBpbiBjb21wbGlhbmNlIHdpdGggdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSBhbmQgdGhhdCB0aGUgbGljZW5zZSBmb3IgdGhlIEV4ZWN1dGFibGUgdmVyc2lvbiBkb2VzIG5vdCBhdHRlbXB0IHRvIGxpbWl0IG9yIGFsdGVyIHRoZSByZWNpcGllbnQncyByaWdodHMgaW4gdGhlIFNvdXJjZSBDb2RlIHZlcnNpb24gZnJvbSB0aGUgcmlnaHRzIHNldCBmb3J0aCBpbiB0aGlzIExpY2Vuc2UuIElmIFlvdSBkaXN0cmlidXRlIHRoZSBFeGVjdXRhYmxlIHZlcnNpb24gdW5kZXIgYSBkaWZmZXJlbnQgbGljZW5zZSBZb3UgbXVzdCBtYWtlIGl0IGFic29sdXRlbHkgY2xlYXIgdGhhdCBhbnkgdGVybXMgd2hpY2ggZGlmZmVyIGZyb20gdGhpcyBMaWNlbnNlIGFyZSBvZmZlcmVkIGJ5IFlvdSBhbG9uZSwgbm90IGJ5IHRoZSBJbml0aWFsIERldmVsb3BlciBvciBhbnkgQ29udHJpYnV0b3IuIFlvdSBoZXJlYnkgYWdyZWUgdG8gaW5kZW1uaWZ5IHRoZSBJbml0aWFsIERldmVsb3BlciBhbmQgZXZlcnkgQ29udHJpYnV0b3IgZm9yIGFueSBsaWFiaWxpdHkgaW5jdXJyZWQgYnkgdGhlIEluaXRpYWwgRGV2ZWxvcGVyIG9yIHN1Y2ggQ29udHJpYnV0b3IgYXMgYSByZXN1bHQgb2YgYW55IHN1Y2ggdGVybXMgWW91IG9mZmVyLiAKMy43LiBMYXJnZXIgV29ya3MuIApZb3UgbWF5IGNyZWF0ZSBhIExhcmdlciBXb3JrIGJ5IGNvbWJpbmluZyBDb3ZlcmVkIENvZGUgd2l0aCBvdGhlciBjb2RlIG5vdCBnb3Zlcm5lZCBieSB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIGFuZCBkaXN0cmlidXRlIHRoZSBMYXJnZXIgV29yayBhcyBhIHNpbmdsZSBwcm9kdWN0LiBJbiBzdWNoIGEgY2FzZSwgWW91IG11c3QgbWFrZSBzdXJlIHRoZSByZXF1aXJlbWVudHMgb2YgdGhpcyBMaWNlbnNlIGFyZSBmdWxmaWxsZWQgZm9yIHRoZSBDb3ZlcmVkIENvZGUuCjQuIEluYWJpbGl0eSB0byBDb21wbHkgRHVlIHRvIFN0YXR1dGUgb3IgUmVndWxhdGlvbi4gCklmIGl0IGlzIGltcG9zc2libGUgZm9yIFlvdSB0byBjb21wbHkgd2l0aCBhbnkgb2YgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8gc29tZSBvciBhbGwgb2YgdGhlIENvdmVyZWQgQ29kZSBkdWUgdG8gc3RhdHV0ZSwganVkaWNpYWwgb3JkZXIsIG9yIHJlZ3VsYXRpb24gdGhlbiBZb3UgbXVzdDogKGEpIGNvbXBseSB3aXRoIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgdG8gdGhlIG1heGltdW0gZXh0ZW50IHBvc3NpYmxlOyBhbmQgKGIpIGRlc2NyaWJlIHRoZSBsaW1pdGF0aW9ucyBhbmQgdGhlIGNvZGUgdGhleSBhZmZlY3QuIFN1Y2ggZGVzY3JpcHRpb24gbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgTEVHQUwgZmlsZSBkZXNjcmliZWQgaW4gU2VjdGlvbiAzLjQgYW5kIG11c3QgYmUgaW5jbHVkZWQgd2l0aCBhbGwgZGlzdHJpYnV0aW9ucyBvZiB0aGUgU291cmNlIENvZGUuIEV4Y2VwdCB0byB0aGUgZXh0ZW50IHByb2hpYml0ZWQgYnkgc3RhdHV0ZSBvciByZWd1bGF0aW9uLCBzdWNoIGRlc2NyaXB0aW9uIG11c3QgYmUgc3VmZmljaWVudGx5IGRldGFpbGVkIGZvciBhIHJlY2lwaWVudCBvZiBvcmRpbmFyeSBza2lsbCB0byBiZSBhYmxlIHRvIHVuZGVyc3RhbmQgaXQuCjUuIEFwcGxpY2F0aW9uIG9mIHRoaXMgTGljZW5zZS4gClRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGNvZGUgdG8gd2hpY2ggdGhlIEluaXRpYWwgRGV2ZWxvcGVyIGhhcyBhdHRhY2hlZCB0aGUgbm90aWNlIGluIEV4aGliaXQgQSBhbmQgdG8gcmVsYXRlZCBDb3ZlcmVkIENvZGUuCjYuIFZlcnNpb25zIG9mIHRoZSBMaWNlbnNlLiAKNi4xLiBOZXcgVmVyc2lvbnMuIApOZXRzY2FwZSBDb21tdW5pY2F0aW9ucyBDb3Jwb3JhdGlvbiAoJydOZXRzY2FwZScnKSBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcgdmVyc2lvbnMgb2YgdGhlIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuIEVhY2ggdmVyc2lvbiB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIAo2LjIuIEVmZmVjdCBvZiBOZXcgVmVyc2lvbnMuIApPbmNlIENvdmVyZWQgQ29kZSBoYXMgYmVlbiBwdWJsaXNoZWQgdW5kZXIgYSBwYXJ0aWN1bGFyIHZlcnNpb24gb2YgdGhlIExpY2Vuc2UsIFlvdSBtYXkgYWx3YXlzIGNvbnRpbnVlIHRvIHVzZSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhhdCB2ZXJzaW9uLiBZb3UgbWF5IGFsc28gY2hvb3NlIHRvIHVzZSBzdWNoIENvdmVyZWQgQ29kZSB1bmRlciB0aGUgdGVybXMgb2YgYW55IHN1YnNlcXVlbnQgdmVyc2lvbiBvZiB0aGUgTGljZW5zZSBwdWJsaXNoZWQgYnkgTmV0c2NhcGUuIE5vIG9uZSBvdGhlciB0aGFuIE5ldHNjYXBlIGhhcyB0aGUgcmlnaHQgdG8gbW9kaWZ5IHRoZSB0ZXJtcyBhcHBsaWNhYmxlIHRvIENvdmVyZWQgQ29kZSBjcmVhdGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gCjYuMy4gRGVyaXZhdGl2ZSBXb3Jrcy4gCklmIFlvdSBjcmVhdGUgb3IgdXNlIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGlzIExpY2Vuc2UgKHdoaWNoIHlvdSBtYXkgb25seSBkbyBpbiBvcmRlciB0byBhcHBseSBpdCB0byBjb2RlIHdoaWNoIGlzIG5vdCBhbHJlYWR5IENvdmVyZWQgQ29kZSBnb3Zlcm5lZCBieSB0aGlzIExpY2Vuc2UpLCBZb3UgbXVzdCAoYSkgcmVuYW1lIFlvdXIgbGljZW5zZSBzbyB0aGF0IHRoZSBwaHJhc2VzICcnTW96aWxsYScnLCAnJ01PWklMTEFQTCcnLCAnJ01PWlBMJycsICcnTmV0c2NhcGUnJywgIk1QTCIsICcnTlBMJycgb3IgYW55IGNvbmZ1c2luZ2x5IHNpbWlsYXIgcGhyYXNlIGRvIG5vdCBhcHBlYXIgaW4geW91ciBsaWNlbnNlIChleGNlcHQgdG8gbm90ZSB0aGF0IHlvdXIgbGljZW5zZSBkaWZmZXJzIGZyb20gdGhpcyBMaWNlbnNlKSBhbmQgKGIpIG90aGVyd2lzZSBtYWtlIGl0IGNsZWFyIHRoYXQgWW91ciB2ZXJzaW9uIG9mIHRoZSBsaWNlbnNlIGNvbnRhaW5zIHRlcm1zIHdoaWNoIGRpZmZlciBmcm9tIHRoZSBNb3ppbGxhIFB1YmxpYyBMaWNlbnNlIGFuZCBOZXRzY2FwZSBQdWJsaWMgTGljZW5zZS4gKEZpbGxpbmcgaW4gdGhlIG5hbWUgb2YgdGhlIEluaXRpYWwgRGV2ZWxvcGVyLCBPcmlnaW5hbCBDb2RlIG9yIENvbnRyaWJ1dG9yIGluIHRoZSBub3RpY2UgZGVzY3JpYmVkIGluIEV4aGliaXQgQSBzaGFsbCBub3Qgb2YgdGhlbXNlbHZlcyBiZSBkZWVtZWQgdG8gYmUgbW9kaWZpY2F0aW9ucyBvZiB0aGlzIExpY2Vuc2UuKQo3LiBESVNDTEFJTUVSIE9GIFdBUlJBTlRZLiAKQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMnJyBCQVNJUywgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRUlUSEVSIEVYUFJFU1NFRCBPUiBJTVBMSUVELCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgV0FSUkFOVElFUyBUSEFUIFRIRSBDT1ZFUkVEIENPREUgSVMgRlJFRSBPRiBERUZFQ1RTLCBNRVJDSEFOVEFCTEUsIEZJVCBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgT1IgTk9OLUlORlJJTkdJTkcuIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIENPVkVSRUQgQ09ERSBJUyBXSVRIIFlPVS4gU0hPVUxEIEFOWSBDT1ZFUkVEIENPREUgUFJPVkUgREVGRUNUSVZFIElOIEFOWSBSRVNQRUNULCBZT1UgKE5PVCBUSEUgSU5JVElBTCBERVZFTE9QRVIgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SKSBBU1NVTUUgVEhFIENPU1QgT0YgQU5ZIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLiBUSElTIERJU0NMQUlNRVIgT0YgV0FSUkFOVFkgQ09OU1RJVFVURVMgQU4gRVNTRU5USUFMIFBBUlQgT0YgVEhJUyBMSUNFTlNFLiBOTyBVU0UgT0YgQU5ZIENPVkVSRUQgQ09ERSBJUyBBVVRIT1JJWkVEIEhFUkVVTkRFUiBFWENFUFQgVU5ERVIgVEhJUyBESVNDTEFJTUVSLgo4LiBURVJNSU5BVElPTi4gCjguMS6gIFRoaXMgTGljZW5zZSBhbmQgdGhlIHJpZ2h0cyBncmFudGVkIGhlcmV1bmRlciB3aWxsIHRlcm1pbmF0ZSBhdXRvbWF0aWNhbGx5IGlmIFlvdSBmYWlsIHRvIGNvbXBseSB3aXRoIHRlcm1zIGhlcmVpbiBhbmQgZmFpbCB0byBjdXJlIHN1Y2ggYnJlYWNoIHdpdGhpbiAzMCBkYXlzIG9mIGJlY29taW5nIGF3YXJlIG9mIHRoZSBicmVhY2guIEFsbCBzdWJsaWNlbnNlcyB0byB0aGUgQ292ZXJlZCBDb2RlIHdoaWNoIGFyZSBwcm9wZXJseSBncmFudGVkIHNoYWxsIHN1cnZpdmUgYW55IHRlcm1pbmF0aW9uIG9mIHRoaXMgTGljZW5zZS4gUHJvdmlzaW9ucyB3aGljaCwgYnkgdGhlaXIgbmF0dXJlLCBtdXN0IHJlbWFpbiBpbiBlZmZlY3QgYmV5b25kIHRoZSB0ZXJtaW5hdGlvbiBvZiB0aGlzIExpY2Vuc2Ugc2hhbGwgc3Vydml2ZS4gCjguMi6gIElmIFlvdSBpbml0aWF0ZSBsaXRpZ2F0aW9uIGJ5IGFzc2VydGluZyBhIHBhdGVudCBpbmZyaW5nZW1lbnQgY2xhaW0gKGV4Y2x1ZGluZyBkZWNsYXRvcnkganVkZ21lbnQgYWN0aW9ucykgYWdhaW5zdCBJbml0aWFsIERldmVsb3BlciBvciBhIENvbnRyaWJ1dG9yICh0aGUgSW5pdGlhbCBEZXZlbG9wZXIgb3IgQ29udHJpYnV0b3IgYWdhaW5zdCB3aG9tIFlvdSBmaWxlIHN1Y2ggYWN0aW9uIGlzIHJlZmVycmVkIHRvIGFzICJQYXJ0aWNpcGFudCIpoCBhbGxlZ2luZyB0aGF0OiAKKGEpoCBzdWNoIFBhcnRpY2lwYW50J3MgQ29udHJpYnV0b3IgVmVyc2lvbiBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSBhbmQgYWxsIHJpZ2h0cyBncmFudGVkIGJ5IHN1Y2ggUGFydGljaXBhbnQgdG8gWW91IHVuZGVyIFNlY3Rpb25zIDIuMSBhbmQvb3IgMi4yIG9mIHRoaXMgTGljZW5zZSBzaGFsbCwgdXBvbiA2MCBkYXlzIG5vdGljZSBmcm9tIFBhcnRpY2lwYW50IHRlcm1pbmF0ZSBwcm9zcGVjdGl2ZWx5LCB1bmxlc3MgaWYgd2l0aGluIDYwIGRheXMgYWZ0ZXIgcmVjZWlwdCBvZiBub3RpY2UgWW91IGVpdGhlcjogKGkpoCBhZ3JlZSBpbiB3cml0aW5nIHRvIHBheSBQYXJ0aWNpcGFudCBhIG11dHVhbGx5IGFncmVlYWJsZSByZWFzb25hYmxlIHJveWFsdHkgZm9yIFlvdXIgcGFzdCBhbmQgZnV0dXJlIHVzZSBvZiBNb2RpZmljYXRpb25zIG1hZGUgYnkgc3VjaCBQYXJ0aWNpcGFudCwgb3IgKGlpKSB3aXRoZHJhdyBZb3VyIGxpdGlnYXRpb24gY2xhaW0gd2l0aCByZXNwZWN0IHRvIHRoZSBDb250cmlidXRvciBWZXJzaW9uIGFnYWluc3Qgc3VjaCBQYXJ0aWNpcGFudC6gIElmIHdpdGhpbiA2MCBkYXlzIG9mIG5vdGljZSwgYSByZWFzb25hYmxlIHJveWFsdHkgYW5kIHBheW1lbnQgYXJyYW5nZW1lbnQgYXJlIG5vdCBtdXR1YWxseSBhZ3JlZWQgdXBvbiBpbiB3cml0aW5nIGJ5IHRoZSBwYXJ0aWVzIG9yIHRoZSBsaXRpZ2F0aW9uIGNsYWltIGlzIG5vdCB3aXRoZHJhd24sIHRoZSByaWdodHMgZ3JhbnRlZCBieSBQYXJ0aWNpcGFudCB0byBZb3UgdW5kZXIgU2VjdGlvbnMgMi4xIGFuZC9vciAyLjIgYXV0b21hdGljYWxseSB0ZXJtaW5hdGUgYXQgdGhlIGV4cGlyYXRpb24gb2YgdGhlIDYwIGRheSBub3RpY2UgcGVyaW9kIHNwZWNpZmllZCBhYm92ZS4gCihiKaAgYW55IHNvZnR3YXJlLCBoYXJkd2FyZSwgb3IgZGV2aWNlLCBvdGhlciB0aGFuIHN1Y2ggUGFydGljaXBhbnQncyBDb250cmlidXRvciBWZXJzaW9uLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGluZnJpbmdlcyBhbnkgcGF0ZW50LCB0aGVuIGFueSByaWdodHMgZ3JhbnRlZCB0byBZb3UgYnkgc3VjaCBQYXJ0aWNpcGFudCB1bmRlciBTZWN0aW9ucyAyLjEoYikgYW5kIDIuMihiKSBhcmUgcmV2b2tlZCBlZmZlY3RpdmUgYXMgb2YgdGhlIGRhdGUgWW91IGZpcnN0IG1hZGUsIHVzZWQsIHNvbGQsIGRpc3RyaWJ1dGVkLCBvciBoYWQgbWFkZSwgTW9kaWZpY2F0aW9ucyBtYWRlIGJ5IHRoYXQgUGFydGljaXBhbnQuIAo4LjMuoCBJZiBZb3UgYXNzZXJ0IGEgcGF0ZW50IGluZnJpbmdlbWVudCBjbGFpbSBhZ2FpbnN0IFBhcnRpY2lwYW50IGFsbGVnaW5nIHRoYXQgc3VjaCBQYXJ0aWNpcGFudCdzIENvbnRyaWJ1dG9yIFZlcnNpb24gZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBpbmZyaW5nZXMgYW55IHBhdGVudCB3aGVyZSBzdWNoIGNsYWltIGlzIHJlc29sdmVkIChzdWNoIGFzIGJ5IGxpY2Vuc2Ugb3Igc2V0dGxlbWVudCkgcHJpb3IgdG8gdGhlIGluaXRpYXRpb24gb2YgcGF0ZW50IGluZnJpbmdlbWVudCBsaXRpZ2F0aW9uLCB0aGVuIHRoZSByZWFzb25hYmxlIHZhbHVlIG9mIHRoZSBsaWNlbnNlcyBncmFudGVkIGJ5IHN1Y2ggUGFydGljaXBhbnQgdW5kZXIgU2VjdGlvbnMgMi4xIG9yIDIuMiBzaGFsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgaW4gZGV0ZXJtaW5pbmcgdGhlIGFtb3VudCBvciB2YWx1ZSBvZiBhbnkgcGF5bWVudCBvciBsaWNlbnNlLiAKOC40LqAgSW4gdGhlIGV2ZW50IG9mIHRlcm1pbmF0aW9uIHVuZGVyIFNlY3Rpb25zIDguMSBvciA4LjIgYWJvdmUsoCBhbGwgZW5kIHVzZXIgbGljZW5zZSBhZ3JlZW1lbnRzIChleGNsdWRpbmcgZGlzdHJpYnV0b3JzIGFuZCByZXNlbGxlcnMpIHdoaWNoIGhhdmUgYmVlbiB2YWxpZGx5IGdyYW50ZWQgYnkgWW91IG9yIGFueSBkaXN0cmlidXRvciBoZXJldW5kZXIgcHJpb3IgdG8gdGVybWluYXRpb24gc2hhbGwgc3Vydml2ZSB0ZXJtaW5hdGlvbi4KOS4gTElNSVRBVElPTiBPRiBMSUFCSUxJVFkuIApVTkRFUiBOTyBDSVJDVU1TVEFOQ0VTIEFORCBVTkRFUiBOTyBMRUdBTCBUSEVPUlksIFdIRVRIRVIgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UpLCBDT05UUkFDVCwgT1IgT1RIRVJXSVNFLCBTSEFMTCBZT1UsIFRIRSBJTklUSUFMIERFVkVMT1BFUiwgQU5ZIE9USEVSIENPTlRSSUJVVE9SLCBPUiBBTlkgRElTVFJJQlVUT1IgT0YgQ09WRVJFRCBDT0RFLCBPUiBBTlkgU1VQUExJRVIgT0YgQU5ZIE9GIFNVQ0ggUEFSVElFUywgQkUgTElBQkxFIFRPIEFOWSBQRVJTT04gRk9SIEFOWSBJTkRJUkVDVCwgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9GIEFOWSBDSEFSQUNURVIgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIERBTUFHRVMgRk9SIExPU1MgT0YgR09PRFdJTEwsIFdPUksgU1RPUFBBR0UsIENPTVBVVEVSIEZBSUxVUkUgT1IgTUFMRlVOQ1RJT04sIE9SIEFOWSBBTkQgQUxMIE9USEVSIENPTU1FUkNJQUwgREFNQUdFUyBPUiBMT1NTRVMsIEVWRU4gSUYgU1VDSCBQQVJUWSBTSEFMTCBIQVZFIEJFRU4gSU5GT1JNRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4gVEhJUyBMSU1JVEFUSU9OIE9GIExJQUJJTElUWSBTSEFMTCBOT1QgQVBQTFkgVE8gTElBQklMSVRZIEZPUiBERUFUSCBPUiBQRVJTT05BTCBJTkpVUlkgUkVTVUxUSU5HIEZST00gU1VDSCBQQVJUWSdTIE5FR0xJR0VOQ0UgVE8gVEhFIEVYVEVOVCBBUFBMSUNBQkxFIExBVyBQUk9ISUJJVFMgU1VDSCBMSU1JVEFUSU9OLiBTT01FIEpVUklTRElDVElPTlMgRE8gTk9UIEFMTE9XIFRIRSBFWENMVVNJT04gT1IgTElNSVRBVElPTiBPRiBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUywgU08gVEhJUyBFWENMVVNJT04gQU5EIExJTUlUQVRJT04gTUFZIE5PVCBBUFBMWSBUTyBZT1UuCjEwLiBVLlMuIEdPVkVSTk1FTlQgRU5EIFVTRVJTLiAKVGhlIENvdmVyZWQgQ29kZSBpcyBhICcnY29tbWVyY2lhbCBpdGVtLCcnIGFzIHRoYXQgdGVybSBpcyBkZWZpbmVkIGluIDQ4IEMuRi5SLiAyLjEwMSAoT2N0LiAxOTk1KSwgY29uc2lzdGluZyBvZiAnJ2NvbW1lcmNpYWwgY29tcHV0ZXIgc29mdHdhcmUnJyBhbmQgJydjb21tZXJjaWFsIGNvbXB1dGVyIHNvZnR3YXJlIGRvY3VtZW50YXRpb24sJycgYXMgc3VjaCB0ZXJtcyBhcmUgdXNlZCBpbiA0OCBDLkYuUi4gMTIuMjEyIChTZXB0LiAxOTk1KS4gQ29uc2lzdGVudCB3aXRoIDQ4IEMuRi5SLiAxMi4yMTIgYW5kIDQ4IEMuRi5SLiAyMjcuNzIwMi0xIHRocm91Z2ggMjI3LjcyMDItNCAoSnVuZSAxOTk1KSwgYWxsIFUuUy4gR292ZXJubWVudCBFbmQgVXNlcnMgYWNxdWlyZSBDb3ZlcmVkIENvZGUgd2l0aCBvbmx5IHRob3NlIHJpZ2h0cyBzZXQgZm9ydGggaGVyZWluLgoxMS4gTUlTQ0VMTEFORU9VUy4gClRoaXMgTGljZW5zZSByZXByZXNlbnRzIHRoZSBjb21wbGV0ZSBhZ3JlZW1lbnQgY29uY2VybmluZyBzdWJqZWN0IG1hdHRlciBoZXJlb2YuIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlIGlzIGhlbGQgdG8gYmUgdW5lbmZvcmNlYWJsZSwgc3VjaCBwcm92aXNpb24gc2hhbGwgYmUgcmVmb3JtZWQgb25seSB0byB0aGUgZXh0ZW50IG5lY2Vzc2FyeSB0byBtYWtlIGl0IGVuZm9yY2VhYmxlLiBUaGlzIExpY2Vuc2Ugc2hhbGwgYmUgZ292ZXJuZWQgYnkgQ2FsaWZvcm5pYSBsYXcgcHJvdmlzaW9ucyAoZXhjZXB0IHRvIHRoZSBleHRlbnQgYXBwbGljYWJsZSBsYXcsIGlmIGFueSwgcHJvdmlkZXMgb3RoZXJ3aXNlKSwgZXhjbHVkaW5nIGl0cyBjb25mbGljdC1vZi1sYXcgcHJvdmlzaW9ucy4gV2l0aCByZXNwZWN0IHRvIGRpc3B1dGVzIGluIHdoaWNoIGF0IGxlYXN0IG9uZSBwYXJ0eSBpcyBhIGNpdGl6ZW4gb2YsIG9yIGFuIGVudGl0eSBjaGFydGVyZWQgb3IgcmVnaXN0ZXJlZCB0byBkbyBidXNpbmVzcyBpbiB0aGUgVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhLCBhbnkgbGl0aWdhdGlvbiByZWxhdGluZyB0byB0aGlzIExpY2Vuc2Ugc2hhbGwgYmUgc3ViamVjdCB0byB0aGUganVyaXNkaWN0aW9uIG9mIHRoZSBGZWRlcmFsIENvdXJ0cyBvZiB0aGUgTm9ydGhlcm4gRGlzdHJpY3Qgb2YgQ2FsaWZvcm5pYSwgd2l0aCB2ZW51ZSBseWluZyBpbiBTYW50YSBDbGFyYSBDb3VudHksIENhbGlmb3JuaWEsIHdpdGggdGhlIGxvc2luZyBwYXJ0eSByZXNwb25zaWJsZSBmb3IgY29zdHMsIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24sIGNvdXJ0IGNvc3RzIGFuZCByZWFzb25hYmxlIGF0dG9ybmV5cycgZmVlcyBhbmQgZXhwZW5zZXMuIFRoZSBhcHBsaWNhdGlvbiBvZiB0aGUgVW5pdGVkIE5hdGlvbnMgQ29udmVudGlvbiBvbiBDb250cmFjdHMgZm9yIHRoZSBJbnRlcm5hdGlvbmFsIFNhbGUgb2YgR29vZHMgaXMgZXhwcmVzc2x5IGV4Y2x1ZGVkLiBBbnkgbGF3IG9yIHJlZ3VsYXRpb24gd2hpY2ggcHJvdmlkZXMgdGhhdCB0aGUgbGFuZ3VhZ2Ugb2YgYSBjb250cmFjdCBzaGFsbCBiZSBjb25zdHJ1ZWQgYWdhaW5zdCB0aGUgZHJhZnRlciBzaGFsbCBub3QgYXBwbHkgdG8gdGhpcyBMaWNlbnNlLgoxMi4gUkVTUE9OU0lCSUxJVFkgRk9SIENMQUlNUy4gCkFzIGJldHdlZW4gSW5pdGlhbCBEZXZlbG9wZXIgYW5kIHRoZSBDb250cmlidXRvcnMsIGVhY2ggcGFydHkgaXMgcmVzcG9uc2libGUgZm9yIGNsYWltcyBhbmQgZGFtYWdlcyBhcmlzaW5nLCBkaXJlY3RseSBvciBpbmRpcmVjdGx5LCBvdXQgb2YgaXRzIHV0aWxpemF0aW9uIG9mIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIFlvdSBhZ3JlZSB0byB3b3JrIHdpdGggSW5pdGlhbCBEZXZlbG9wZXIgYW5kIENvbnRyaWJ1dG9ycyB0byBkaXN0cmlidXRlIHN1Y2ggcmVzcG9uc2liaWxpdHkgb24gYW4gZXF1aXRhYmxlIGJhc2lzLiBOb3RoaW5nIGhlcmVpbiBpcyBpbnRlbmRlZCBvciBzaGFsbCBiZSBkZWVtZWQgdG8gY29uc3RpdHV0ZSBhbnkgYWRtaXNzaW9uIG9mIGxpYWJpbGl0eS4KMTMuIE1VTFRJUExFLUxJQ0VOU0VEIENPREUuIApJbml0aWFsIERldmVsb3BlciBtYXkgZGVzaWduYXRlIHBvcnRpb25zIG9mIHRoZSBDb3ZlcmVkIENvZGUgYXMgIk11bHRpcGxlLUxpY2Vuc2VkIi6gICJNdWx0aXBsZS1MaWNlbnNlZCIgbWVhbnMgdGhhdCB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgcGVybWl0cyB5b3UgdG8gdXRpbGl6ZSBwb3J0aW9ucyBvZiB0aGUgQ292ZXJlZCBDb2RlIHVuZGVyIFlvdXIgY2hvaWNlIG9mIHRoZSBOUEwgb3IgdGhlIGFsdGVybmF0aXZlIGxpY2Vuc2VzLCBpZiBhbnksIHNwZWNpZmllZCBieSB0aGUgSW5pdGlhbCBEZXZlbG9wZXIgaW4gdGhlIGZpbGUgZGVzY3JpYmVkIGluIEV4aGliaXQgQS4KCkVYSElCSVQgQSAtTW96aWxsYSBQdWJsaWMgTGljZW5zZS4gCmBgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhcmUgc3ViamVjdCB0byB0aGUgTW96aWxsYSBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDEuMSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0IApodHRwOi8vd3d3Lm1vemlsbGEub3JnL01QTC8gClNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgYmFzaXMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgCkFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcmlnaHRzIGFuZCAKbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuIApUaGUgT3JpZ2luYWwgQ29kZSBpcyBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXy4gClRoZSBJbml0aWFsIERldmVsb3BlciBvZiB0aGUgT3JpZ2luYWwgQ29kZSBpcyBfX19fX19fX19fX19fX19fX19fX19fX18uIFBvcnRpb25zIGNyZWF0ZWQgYnkgCqBfX19fX19fX19fX19fX19fX19fX19fIGFyZSBDb3B5cmlnaHQgKEMpIF9fX19fXyBfX19fX19fX19fX19fX19fX19fX19fXy4gQWxsIFJpZ2h0cyAKUmVzZXJ2ZWQuIApDb250cmlidXRvcihzKTogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18uIApBbHRlcm5hdGl2ZWx5LCB0aGUgY29udGVudHMgb2YgdGhpcyBmaWxlIG1heSBiZSB1c2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgX19fX18gbGljZW5zZSAodGhloCAiW19fX10gTGljZW5zZSIpLCBpbiB3aGljaCBjYXNlIHRoZSBwcm92aXNpb25zIG9mIFtfX19fX19dIExpY2Vuc2UgYXJlIGFwcGxpY2FibGWgIGluc3RlYWQgb2YgdGhvc2UgYWJvdmUuoCBJZiB5b3Ugd2lzaCB0byBhbGxvdyB1c2Ugb2YgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSBvbmx5IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgW19fX19dIExpY2Vuc2UgYW5kIG5vdCB0byBhbGxvdyBvdGhlcnMgdG8gdXNlIHlvdXIgdmVyc2lvbiBvZiB0aGlzIGZpbGUgdW5kZXIgdGhlIE1QTCwgaW5kaWNhdGUgeW91ciBkZWNpc2lvbiBieSBkZWxldGluZ6AgdGhlIHByb3Zpc2lvbnMgYWJvdmUgYW5kIHJlcGxhY2WgIHRoZW0gd2l0aCB0aGUgbm90aWNlIGFuZCBvdGhlciBwcm92aXNpb25zIHJlcXVpcmVkIGJ5IHRoZSBbX19fXSBMaWNlbnNlLqAgSWYgeW91IGRvIG5vdCBkZWxldGUgdGhlIHByb3Zpc2lvbnMgYWJvdmUsIGEgcmVjaXBpZW50IG1heSB1c2UgeW91ciB2ZXJzaW9uIG9mIHRoaXMgZmlsZSB1bmRlciBlaXRoZXIgdGhlIE1QTCBvciB0aGUgW19fX10gTGljZW5zZS4iIApbTk9URTogVGhlIHRleHQgb2YgdGhpcyBFeGhpYml0IEEgbWF5IGRpZmZlciBzbGlnaHRseSBmcm9tIHRoZSB0ZXh0IG9mIHRoZSBub3RpY2VzIGluIHRoZSBTb3VyY2UgQ29kZSBmaWxlcyBvZiB0aGUgT3JpZ2luYWwgQ29kZS4gWW91IHNob3VsZCB1c2UgdGhlIHRleHQgb2YgdGhpcyBFeGhpYml0IEEgcmF0aGVyIHRoYW4gdGhlIHRleHQgZm91bmQgaW4gdGhlIE9yaWdpbmFsIENvZGUgU291cmNlIENvZGUgZm9yIFlvdXIgTW9kaWZpY2F0aW9ucy5dIAoKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkgdi4gNSwgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogCgpDb3B5cmlnaHQgKGMpIDIwMDcgVGhlIEtocm9ub3MgR3JvdXAgSW5jLiAKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIApjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kL29yIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIAoiTWF0ZXJpYWxzIiksIHRvIGRlYWwgaW4gdGhlIE1hdGVyaWFscyB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgCndpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgCmRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgTWF0ZXJpYWxzLCBhbmQgdG8gCnBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIE1hdGVyaWFscyBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIAp0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6IAoKVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgCmluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIE1hdGVyaWFscy4gCgpUSEUgTUFURVJJQUxTIEFSRSBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCAKRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIApNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIApJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSAKQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgClRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIApNQVRFUklBTFMgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgTUFURVJJQUxTLiAKCiUlIFRoaXMgbm90aWNlIGlzIHByb3ZpZGVkIHdpdGggcmVzcGVjdCB0byBCeXRlIENvZGUgRW5naW5lZXJpbmcgTGlicmFyeSAoQkNFTCksIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoKICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UgCgogICAgICAgICAgICAgICAgICAgICAvKgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbHJpZ2h0cwogICAgICAgICAgICAgICAgICAgICAgKiByZXNlcnZlZC4KICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aG9yIHdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAgICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZ2NvbmRpdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICogYXJlIG1ldDoKICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZWNvcHlyaWdodAogICAgICAgICAgICAgICAgICAgICAgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nZGlzY2xhaW1lci4KICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZWFib3ZlIGNvcHlyaWdodAogICAgICAgICAgICAgICAgICAgICAgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nZGlzY2xhaW1lciBpbgogICAgICAgICAgICAgICAgICAgICAgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkd2l0aCB0aGUKICAgICAgICAgICAgICAgICAgICAgICogICAgZGlzdHJpYnV0aW9uLgogICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICAgICAgKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZXJlZGlzdHJpYnV0aW9uLAogICAgICAgICAgICAgICAgICAgICAgKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OiAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSAgICAgICAgICAgICAgICAgICAgICAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbgooaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgogICAgICAgICAgICAgICAgICAgICAgKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZXNvZnR3YXJlIGl0c2VsZiwKICAgICAgICAgICAgICAgICAgICAgICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzbm9ybWFsbHkgYXBwZWFyLgogICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICAgICAgKiA0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiJhbmQgCiAgICAgICAgICAgICAgICAgICAgICAqICAgICJBcGFjaGUgQkNFTCIgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGVwcm9kdWN0cyAKICAgICAgICAgICAgICAgICAgICAgICogICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVucGVybWlzc2lvbi4gRm9yIAogICAgICAgICAgICAgICAgICAgICAgKiAgICB3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLiAgICAgICAgICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgICAgICAgICAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkIkFwYWNoZSIsCiAgICAgICAgICAgICAgICAgICAgICAqICAgICJBcGFjaGUgQkNFTCIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsd2l0aG91dCAKICAgICAgICAgICAgICAgICAgICAgICogICAgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmVGb3VuZGF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICAgICAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUklNUExJRUQKICAgICAgICAgICAgICAgICAgICAgICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEV0FSUkFOVElFUwogICAgICAgICAgICAgICAgICAgICAgKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFQVJFCiAgICAgICAgICAgICAgICAgICAgICAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFRk9VTkRBVElPTiBPUgogICAgICAgICAgICAgICAgICAgICAgKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsSU5DSURFTlRBTCwKICAgICAgICAgICAgICAgICAgICAgICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyxCVVQgTk9UCiAgICAgICAgICAgICAgICAgICAgICAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7TE9TUyBPRgogICAgICAgICAgICAgICAgICAgICAgKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUkNBVVNFRCBBTkQKICAgICAgICAgICAgICAgICAgICAgICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVExJQUJJTElUWSwKICAgICAgICAgICAgICAgICAgICAgICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOQU5ZIFdBWSBPVVQKICAgICAgICAgICAgICAgICAgICAgICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFUE9TU0lCSUxJVFkgT0YKICAgICAgICAgICAgICAgICAgICAgICogU1VDSCBEQU1BR0UuCiAgICAgICAgICAgICAgICAgICAgICAqCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICAgICAgICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAgICAgICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlYnkgbWFueQogICAgICAgICAgICAgICAgICAgICAgKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZQpGb3VuZGF0aW9uLiAgRm9yIG1vcmUKICAgICAgICAgICAgICAgICAgICAgICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2VzZWUKICAgICAgICAgICAgICAgICAgICAgICogLgogICAgICAgICAgICAgICAgICAgICAgKi8KCiUlIFRoaXMgbm90aWNlIGlzIHByb3ZpZGVkIHdpdGggcmVzcGVjdCB0byBSZWdleHAsIFJlZ3VsYXIgRXhwcmVzc2lvbiBQYWNrYWdlLCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAKClRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKcmVzZXJ2ZWQuClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCnRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKZGlzdHJpYnV0aW9uLgoKMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCmlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CiJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQpBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgpBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCmlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCgo0LiBUaGUgbmFtZXMgIkFwYWNoZSIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgYW5kIAoiQXBhY2hlIFR1cmJpbmUiIG11c3Qgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIApkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIAp3cml0dGVuIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgoKNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCiJBcGFjaGUgVHVyYmluZSIsIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgCnByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECldBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCk9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCkRJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLApTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCkxJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORApPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCk9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgpTVUNIIERBTUFHRS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQppbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgRm9yIG1vcmUKaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKaHR0cDovL3d3dy5hcGFjaGUub3JnLgoKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIENVUCBQYXJzZXIgR2VuZXJhdG9yIGZvciBKYXZhLCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAKCkNVUCBQYXJzZXIgR2VuZXJhdG9yIENvcHlyaWdodCBOb3RpY2UsIExpY2Vuc2UsIGFuZCBEaXNjbGFpbWVyCgpDb3B5cmlnaHQgMTk5Ni0xOTk5IGJ5IFNjb3R0IEh1ZHNvbiwgRnJhbmsgRmxhbm5lcnksIEMuIFNjb3R0IEFuYW5pYW4gClBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kIGl0cwpkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBhbmQgd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXR0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhcHBlYXIgaW4gYWxsIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHRub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYW5kIHdhcnJhbnR5IGRpc2NsYWltZXIgYXBwZWFyIGluCnN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWVzIG9mIHRoZSBhdXRob3JzIG9yIHRoZWlyIGVtcGxveWVyc25vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIHRvIGRpc3RyaWJ1dGlvbiBvZgp0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiAKClRoZSBhdXRob3JzIGFuZCB0aGVpciBlbXBsb3llcnMgZGlzY2xhaW0gYWxsIHdhcnJhbnRpZXMgd2l0aCByZWdhcmQgdG8gdGhpc3NvZnR3YXJlLCBpbmNsdWRpbmcgYWxsIGltcGxpZWQgd2FycmFudGllcyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kCmZpdG5lc3MuIEluIG5vIGV2ZW50IHNoYWxsIHRoZSBhdXRob3JzIG9yIHRoZWlyIGVtcGxveWVycyBiZSBsaWFibGUgZm9yIGFueXNwZWNpYWwsIGluZGlyZWN0IG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvciBhbnkgZGFtYWdlcyB3aGF0c29ldmVyCnJlc3VsdGluZyBmcm9tIGxvc3Mgb2YgdXNlLCBkYXRhIG9yIHByb2ZpdHMsIHdoZXRoZXIgaW4gYW4gYWN0aW9uIG9mIGNvbnRyYWN0LG5lZ2xpZ2VuY2Ugb3Igb3RoZXIgdG9ydGlvdXMgYWN0aW9uLCBhcmlzaW5nIG91dCBvZiBvciBpbiBjb25uZWN0aW9uIHdpdGh0aGUgdXNlIG9yIHBlcmZvcm1hbmNlIG9mIHRoaXMgc29mdHdhcmUuIAoKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIFNBWCB2LiAyLjAuMSwgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogCgpDb3B5cmlnaHQgU3RhdHVzCgogICAgICAgICAgICAgICAgICAgICAgICAgU0FYIGlzIGZyZWUhCgogICAgICAgICAgICAgICAgICAgICAgICAgSW4gZmFjdCwgaXQncyBub3QgcG9zc2libGUgdG8gb3duIGEgbGljZW5zZSB0byBTQVgsIHNpbmNlIGl0J3MgYmVlbiBwbGFjZWQgaW4gdGhlIHB1YmxpYwogICAgICAgICAgICAgICAgICAgICAgICAgZG9tYWluLiAKCiAgICAgICAgICAgICAgICAgICAgICAgICBObyBXYXJyYW50eQoKICAgICAgICAgICAgICAgICAgICAgICAgIEJlY2F1c2UgU0FYIGlzIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIGRlc2lnbiBvciBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzb2Z0d2FyZSBpbXBsZW1lbnRhdGlvbiwgdG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgYXBwbGljYWJsZSBsYXcuIEV4Y2VwdCB3aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2Ugc3RhdGVkIGluIHdyaXRpbmcgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZC9vciBvdGhlciBwYXJ0aWVzIHByb3ZpZGUgU0FYICJhcyBpcyIKICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgd2FycmFudHkgb2YgYW55IGtpbmQsIGVpdGhlciBleHByZXNzZWQgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCBidXQgbm90IGxpbWl0ZWQgdG8sIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGllZCB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuIFRoZSBlbnRpcmUgcmlzayBhcwogICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHF1YWxpdHkgYW5kIHBlcmZvcm1hbmNlIG9mIFNBWCBpcyB3aXRoIHlvdS4gU2hvdWxkIFNBWCBwcm92ZSBkZWZlY3RpdmUsIHlvdQogICAgICAgICAgICAgICAgICAgICAgICAgYXNzdW1lIHRoZSBjb3N0IG9mIGFsbCBuZWNlc3Nhcnkgc2VydmljaW5nLCByZXBhaXIgb3IgY29ycmVjdGlvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgICBJbiBubyBldmVudCB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcgd2lsbCBhbnkgY29weXJpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICBob2xkZXIsIG9yIGFueSBvdGhlciBwYXJ0eSB3aG8gbWF5IG1vZGlmeSBhbmQvb3IgcmVkaXN0cmlidXRlIFNBWCwgYmUgbGlhYmxlIHRvIHlvdSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZ2VuZXJhbCwgc3BlY2lhbCwgaW5jaWRlbnRhbCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgYXJpc2luZyBvdXQgb2YKICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSBTQVggKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gbG9zcyBvZiBkYXRhIG9yIGRhdGEgYmVpbmcKICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkIGluYWNjdXJhdGUgb3IgbG9zc2VzIHN1c3RhaW5lZCBieSB5b3Ugb3IgdGhpcmQgcGFydGllcyBvciBhIGZhaWx1cmUgb2YgdGhlIFNBWCB0bwogICAgICAgICAgICAgICAgICAgICAgICAgb3BlcmF0ZSB3aXRoIGFueSBvdGhlciBwcm9ncmFtcyksIGV2ZW4gaWYgc3VjaCBob2xkZXIgb3Igb3RoZXIgcGFydHkgaGFzIGJlZW4gYWR2aXNlZCBvZgogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KCiAgICAgICAgICAgICAgICAgICAgICAgICBDb3B5cmlnaHQgRGlzY2xhaW1lcnMgCgogICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYWdlIGluY2x1ZGVzIHN0YXRlbWVudHMgdG8gdGhhdCBlZmZlY3QgYnkgRGF2aWQgTWVnZ2luc29uLCB3aG8gd291bGQgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgICAgICAgICAgICBhYmxlIHRvIGNsYWltIGNvcHlyaWdodCBmb3IgdGhlIG9yaWdpbmFsIHdvcmsuIAogICAgICAgICAgICAgICAgICAgICAgICAgU0FYIDEuMCAKCiAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDEuMCBvZiB0aGUgU2ltcGxlIEFQSSBmb3IgWE1MIChTQVgpLCBjcmVhdGVkIGNvbGxlY3RpdmVseSBieSB0aGUgbWVtYmVyc2hpcCBvZgogICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFhNTC1ERVYgbWFpbGluZyBsaXN0LCBpcyBoZXJlYnkgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi4KCiAgICAgICAgICAgICAgICAgICAgICAgICBObyBvbmUgb3ducyBTQVg6IHlvdSBtYXkgdXNlIGl0IGZyZWVseSBpbiBib3RoIGNvbW1lcmNpYWwgYW5kIG5vbi1jb21tZXJjaWFsCiAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMsIGJ1bmRsZSBpdCB3aXRoIHlvdXIgc29mdHdhcmUgZGlzdHJpYnV0aW9uLCBpbmNsdWRlIGl0IG9uIGEgQ0QtUk9NLCBsaXN0IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlIGNvZGUgaW4gYSBib29rLCBtaXJyb3IgdGhlIGRvY3VtZW50YXRpb24gYXQgeW91ciBvd24gd2ViIHNpdGUsIG9yIHVzZSBpdCBpbiBhbnkKICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHdheSB5b3Ugc2VlIGZpdC4KCiAgICAgICAgICAgICAgICAgICAgICAgICBEYXZpZCBNZWdnaW5zb24sIHNheEBtZWdnaW5zb24uY29tCiAgICAgICAgICAgICAgICAgICAgICAgICAxOTk4LTA1LTExCgogICAgICAgICAgICAgICAgICAgICAgICAgU0FYIDIuMCAKCiAgICAgICAgICAgICAgICAgICAgICAgICBJIGhlcmVieSBhYmFuZG9uIGFueSBwcm9wZXJ0eSByaWdodHMgdG8gU0FYIDIuMCAodGhlIFNpbXBsZSBBUEkgZm9yIFhNTCksIGFuZCByZWxlYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgb2YgdGhlIFNBWCAyLjAgc291cmNlIGNvZGUsIGNvbXBpbGVkIGNvZGUsIGFuZCBkb2N1bWVudGF0aW9uIGNvbnRhaW5lZCBpbiB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICBkaXN0cmlidXRpb24gaW50byB0aGUgUHVibGljIERvbWFpbi4gU0FYIGNvbWVzIHdpdGggTk8gV0FSUkFOVFkgb3IgZ3VhcmFudGVlIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICBmaXRuZXNzIGZvciBhbnkgcHVycG9zZS4KCiAgICAgICAgICAgICAgICAgICAgICAgICBEYXZpZCBNZWdnaW5zb24sIGRhdmlkQG1lZ2dpbnNvbi5jb20KICAgICAgICAgICAgICAgICAgICAgICAgIDIwMDAtMDUtMDUKCiUlIFRoaXMgbm90aWNlIGlzIHByb3ZpZGVkIHdpdGggcmVzcGVjdCB0byBDcnlwdGl4LCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAKCkNyeXB0aXggR2VuZXJhbCBMaWNlbnNlCgpDb3B5cmlnaHQgwqkgMTk5NS0yMDAzIFRoZSBDcnlwdGl4IEZvdW5kYXRpb24gTGltaXRlZC4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmVtZXQ6CgogICAxLlJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4gICAgMi5SZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ1JZUFRJWCBGT1VOREFUSU9OIExJTUlURUQgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDUllQVElYIEZPVU5EQVRJT04gTElNSVRFRCBPUiBDT05UUklCVVRPUlMgQkVMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIFggV2luZG93IFN5c3RlbSwgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogCgpDb3B5cmlnaHQgIFRoZSBPcGVuIEdyb3VwCgpQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBkaXN0cmlidXRlLCBhbmQgc2VsbCB0aGlzIHNvZnR3YXJlIGFuZCBpdHNkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCB0aGVhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIHN1cHBvcnRpbmcgZG9jdW1lbnRhdGlvbi4KClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRkNPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRVNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgVGhlIE9wZW4gR3JvdXAgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIGZyb20gVGhlIE9wZW4gR3JvdXAuCgpQb3J0aW9ucyBhbHNvIGNvdmVyZWQgYnkgb3RoZXIgbGljZW5zZXMgYXMgbm90ZWQgaW4gdGhlIGFib3ZlIFVSTC4KCiUlIFRoaXMgbm90aWNlIGlzIHByb3ZpZGVkIHdpdGggcmVzcGVjdCB0byBSZXRyb3dlYXZlciwgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogCgpDb3B5cmlnaHQgKGMpIEZlYnJ1YXJ5IDIwMDQsIFRvYnkgUmV5ZWx0cwpBbGwgcmlnaHRzIHJlc2VydmVkLgoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLiAKUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLiAKTmVpdGhlciB0aGUgbmFtZSBvZiBUb2J5IFJleWVsdHMgbm9yIHRoZSBuYW1lcyBvZiBoaXMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gCgpUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVExJQUJJTElUWSwgCk9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgolJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gc3RyaXBwZXIsIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoKU3RyaXBwZXIgOiBkZWJ1ZyBpbmZvcm1hdGlvbiBzdHJpcHBlcgogQ29weXJpZ2h0IChjKSAyMDAzIEtvaHN1a2UgS2F3YWd1Y2hpCiBBbGwgcmlnaHRzIHJlc2VydmVkLgoKIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiBhcmUgbWV0OgogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIGxpYnBuZyBvZmZpY2lhbCBQTkcgcmVmZXJlbmNlIGxpYnJhcnksIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoKVGhpcyBjb3B5IG9mIHRoZSBsaWJwbmcgbm90aWNlcyBpcyBwcm92aWRlZCBmb3IgeW91ciBjb252ZW5pZW5jZS4gIEluIGNhc2Ugb2ZhbnkgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIGNvcHkgYW5kIHRoZSBub3RpY2VzIGluIHRoZSBmaWxlIHBuZy5oIHRoYXQgaXNpbmNsdWRlZCBpbiB0aGUgbGlicG5nIGRpc3RyaWJ1dGlvbiwgdGhlIGxhdHRlciBzaGFsbCBwcmV2YWlsLgoKQ09QWVJJR0hUIE5PVElDRSwgRElTQ0xBSU1FUiwgYW5kIExJQ0VOU0U6CgpJZiB5b3UgbW9kaWZ5IGxpYnBuZyB5b3UgbWF5IGluc2VydCBhZGRpdGlvbmFsIG5vdGljZXMgaW1tZWRpYXRlbHkgZm9sbG93aW5ndGhpcyBzZW50ZW5jZS4KCmxpYnBuZyB2ZXJzaW9uIDEuMi42LCBEZWNlbWJlciAzLCAyMDA0LCBpcwpDb3B5cmlnaHQgKGMpIDIwMDQgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhbmQgaXMKZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTEuMi41d2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWwgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgQ29udHJpYnV0aW5nIEF1dGhvcnMKICAgQ29zbWluIFRydXRhCgpsaWJwbmcgdmVyc2lvbnMgMS4wLjcsIEp1bHkgMSwgMjAwMCwgdGhyb3VnaCAxLjIuNSAtIE9jdG9iZXIgMywgMjAwMiwgYXJlQ29weXJpZ2h0IChjKSAyMDAwLTIwMDIgR2xlbm4gUmFuZGVycy1QZWhyc29uLCBhbmQgYXJlCmRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgc2FtZSBkaXNjbGFpbWVyIGFuZCBsaWNlbnNlIGFzIGxpYnBuZy0xLjAuNndpdGggdGhlIGZvbGxvd2luZyBpbmRpdmlkdWFscyBhZGRlZCB0byB0aGUgbGlzdCBvZiBDb250cmlidXRpbmcgQXV0aG9ycwogICBTaW1vbi1QaWVycmUgQ2FkaWV1eAogICBFcmljIFMuIFJheW1vbmQKICAgR2lsbGVzIFZvbGxhbnQKCmFuZCB3aXRoIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25zIHRvIHRoZSBkaXNjbGFpbWVyOgoKICAgVGhlcmUgaXMgbm8gd2FycmFudHkgYWdhaW5zdCBpbnRlcmZlcmVuY2Ugd2l0aCB5b3VyIGVuam95bWVudCBvZiB0aGUgICBsaWJyYXJ5IG9yIGFnYWluc3QgaW5mcmluZ2VtZW50LiAgVGhlcmUgaXMgbm8gd2FycmFudHkgdGhhdCBvdXIKICAgZWZmb3J0cyBvciB0aGUgbGlicmFyeSB3aWxsIGZ1bGZpbGwgYW55IG9mIHlvdXIgcGFydGljdWxhciBwdXJwb3NlcyAgIG9yIG5lZWRzLiAgVGhpcyBsaWJyYXJ5IGlzIHByb3ZpZGVkIHdpdGggYWxsIGZhdWx0cywgYW5kIHRoZSBlbnRpcmUgICByaXNrIG9mIHNhdGlzZmFjdG9yeSBxdWFsaXR5LCBwZXJmb3JtYW5jZSwgYWNjdXJhY3ksIGFuZCBlZmZvcnQgaXMgd2l0aCAgIHRoZSB1c2VyLgoKbGlicG5nIHZlcnNpb25zIDAuOTcsIEphbnVhcnkgMTk5OCwgdGhyb3VnaCAxLjAuNiwgTWFyY2ggMjAsIDIwMDAsIGFyZUNvcHlyaWdodCAoYykgMTk5OCwgMTk5OSBHbGVubiBSYW5kZXJzLVBlaHJzb24sIGFuZCBhcmUKZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTAuOTYsd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgogICBUb20gTGFuZQogICBHbGVubiBSYW5kZXJzLVBlaHJzb24KICAgV2lsbGVtIHZhbiBTY2hhaWsKCmxpYnBuZyB2ZXJzaW9ucyAwLjg5LCBKdW5lIDE5OTYsIHRocm91Z2ggMC45NiwgTWF5IDE5OTcsIGFyZQpDb3B5cmlnaHQgKGMpIDE5OTYsIDE5OTcgQW5kcmVhcyBEaWxnZXIKRGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzYW1lIGRpc2NsYWltZXIgYW5kIGxpY2Vuc2UgYXMgbGlicG5nLTAuODgsd2l0aCB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIENvbnRyaWJ1dGluZyBBdXRob3JzOgogICBKb2huIEJvd2xlcgogICBLZXZpbiBCcmFjZXkKICAgU2FtIEJ1c2hlbGwKICAgTWFnbnVzIEhvbG1ncmVuCiAgIEdyZWcgUm9lbG9mcwogICBUb20gVGFubmVyCgpsaWJwbmcgdmVyc2lvbnMgMC41LCBNYXkgMTk5NSwgdGhyb3VnaCAwLjg4LCBKYW51YXJ5IDE5OTYsIGFyZQpDb3B5cmlnaHQgKGMpIDE5OTUsIDE5OTYgR3V5IEVyaWMgU2NoYWxuYXQsIEdyb3VwIDQyLCBJbmMuCgpGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgY29weXJpZ2h0IGFuZCBsaWNlbnNlLCAiQ29udHJpYnV0aW5nIEF1dGhvcnMiaXMgZGVmaW5lZCBhcyB0aGUgZm9sbG93aW5nIHNldCBvZiBpbmRpdmlkdWFsczoKCiAgIEFuZHJlYXMgRGlsZ2VyCiAgIERhdmUgTWFydGluZGFsZQogICBHdXkgRXJpYyBTY2hhbG5hdAogICBQYXVsIFNjaG1pZHQKICAgVGltIFdlZ25lcgoKVGhlIFBORyBSZWZlcmVuY2UgTGlicmFyeSBpcyBzdXBwbGllZCAiQVMgSVMiLiAgVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzYW5kIEdyb3VwIDQyLCBJbmMuIGRpc2NsYWltIGFsbCB3YXJyYW50aWVzLCBleHByZXNzZWQgb3IgaW1wbGllZCwKaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIHRoZSB3YXJyYW50aWVzIG9mIG1lcmNoYW50YWJpbGl0eSBhbmQgb2ZmaXRuZXNzIGZvciBhbnkgcHVycG9zZS4gIFRoZSBDb250cmlidXRpbmcgQXV0aG9ycyBhbmQgR3JvdXAgNDIsIEluYy4KYXNzdW1lIG5vIGxpYWJpbGl0eSBmb3IgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgd2hpY2ggbWF5IHJlc3VsdCBmcm9tIHRoZSB1c2Ugb2YgdGhlIFBORwpSZWZlcmVuY2UgTGlicmFyeSwgZXZlbiBpZiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZS4KClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQgdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXNzb3VyY2UgY29kZSwgb3IgcG9ydGlvbnMgaGVyZW9mLCBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0dG8gdGhlIGZvbGxvd2luZyByZXN0cmljdGlvbnM6CgoxLiBUaGUgb3JpZ2luIG9mIHRoaXMgc291cmNlIGNvZGUgbXVzdCBub3QgYmUgbWlzcmVwcmVzZW50ZWQuCgoyLiBBbHRlcmVkIHZlcnNpb25zIG11c3QgYmUgcGxhaW5seSBtYXJrZWQgYXMgc3VjaCBhbmQgbXVzdCBub3QKICAgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvdXJjZS4KCjMuIFRoaXMgQ29weXJpZ2h0IG5vdGljZSBtYXkgbm90IGJlIHJlbW92ZWQgb3IgYWx0ZXJlZCBmcm9tIGFueQogICBzb3VyY2Ugb3IgYWx0ZXJlZCBzb3VyY2UgZGlzdHJpYnV0aW9uLgoKVGhlIENvbnRyaWJ1dGluZyBBdXRob3JzIGFuZCBHcm91cCA0MiwgSW5jLiBzcGVjaWZpY2FsbHkgcGVybWl0LCB3aXRob3V0ZmVlLCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBhcyBhIGNvbXBvbmVudCB0bwpzdXBwb3J0aW5nIHRoZSBQTkcgZmlsZSBmb3JtYXQgaW4gY29tbWVyY2lhbCBwcm9kdWN0cy4gIElmIHlvdSB1c2UgdGhpc3NvdXJjZSBjb2RlIGluIGEgcHJvZHVjdCwgYWNrbm93bGVkZ21lbnQgaXMgbm90IHJlcXVpcmVkIGJ1dCB3b3VsZCBiZQphcHByZWNpYXRlZC4KCgpBICJwbmdfZ2V0X2NvcHlyaWdodCIgZnVuY3Rpb24gaXMgYXZhaWxhYmxlLCBmb3IgY29udmVuaWVudCB1c2UgaW4gImFib3V0ImJveGVzIGFuZCB0aGUgbGlrZToKCiAgIHByaW50ZigiJXMiLHBuZ19nZXRfY29weXJpZ2h0KE5VTEwpKTsKCkFsc28sIHRoZSBQTkcgbG9nbyAoaW4gUE5HIGZvcm1hdCwgb2YgY291cnNlKSBpcyBzdXBwbGllZCBpbiB0aGUKZmlsZXMgInBuZ2Jhci5wbmciIGFuZCAicG5nYmFyLmpwZyAoODh4MzEpIGFuZCAicG5nbm93LnBuZyIgKDk4eDMxKS4KCkxpYnBuZyBpcyBPU0kgQ2VydGlmaWVkIE9wZW4gU291cmNlIFNvZnR3YXJlLiAgT1NJIENlcnRpZmllZCBPcGVuIFNvdXJjZSBpcyBhY2VydGlmaWNhdGlvbiBtYXJrIG9mIHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgoKR2xlbm4gUmFuZGVycy1QZWhyc29uCmdsZW5ucnAgYXQgdXNlcnMuc291cmNlZm9yZ2UubmV0CkRlY2VtYmVyIDMsIDIwMDQKCiUlIFRoaXMgbm90aWNlIGlzIHByb3ZpZGVkIHdpdGggcmVzcGVjdCB0byBMaWJ1bmdpZiAtIEFuIHVuY29tcHJlc3NlZCBHSUYgbGlicmFyeSwgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogCgpUaGUgR0lGTElCIGRpc3RyaWJ1dGlvbiBpcyBDb3B5cmlnaHQgKGMpIDE5OTcgIEVyaWMgUy4gUmF5bW9uZAoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c3RvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEVBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOVEhFIFNPRlRXQVJFLgoKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIFhNTCBSZXNvbHZlciBsaWJyYXJ5LCBYYWxhbiBKMiwgYW5kIFN0QVggQVBJLCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwoKICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCgogICAxLiBEZWZpbml0aW9ucy4KCiAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCiAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5ICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgoKICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbCAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAogICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQogICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgoKICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbiAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCgogICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAogICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CiAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgoKICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawogICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgoKICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdCAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUgICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KCiAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCiAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lciAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZiAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIiAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQgICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgogICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZCAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgoKICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLCAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCiAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAogICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgoKICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCiAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQogICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwgICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCiAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCiAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsgICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdCAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCiAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KCiAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCiAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAogICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQogICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCiAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCiAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAoKICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKCiAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwogICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAogICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKCiAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwogICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdCAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90ICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZCAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCiAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAogICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCiAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KCiAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZCAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCiAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aCAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCgogICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgoKICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUgICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCiAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgogICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55ICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgogICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCiAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5ICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAogICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCiAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KCiAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAogICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LCAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZiAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CiAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KCiAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwoKICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgoKICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgogICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQogICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQogICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgogICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCgogICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KCiAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiUlIFNvbWUgUG9ydGlvbnMgbGljZW5zZWQgZnJvbSBJQk0gYXJlIGF2YWlsYWJsZSBhdDogCmh0dHA6Ly93d3cuaWJtLmNvbS9zb2Z0d2FyZS9nbG9iYWxpemF0aW9uL2ljdS8KCiUlIFRoaXMgbm90aWNlIGlzIHByb3ZpZGVkIHdpdGggcmVzcGVjdCB0byBJQ1U0SiwgSUNVIDEuOC4xIGFuZCBsYXRlciwgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogCgpJQ1UgTGljZW5zZSAtIElDVSAxLjguMSBhbmQgbGF0ZXIgQ09QWVJJR0hUIEFORCBQRVJNSVNTSU9OIE5PVElDRSBDb3AKeXJpZ2h0IChjKQoxOTk1LTIwMDMgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiBhbmQgb3RoZXJzIEFsbCByaWdodHNyZXNlcnZlZC4gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nYSBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0b2RlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgYW5kL29yIHNlbGwgY29waWVzIG9mdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UocykgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluYWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUgYW5kIHRoYXQgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpc3Blcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24uIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1RMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0VBTkQgTk9OSU5GUklOR0VNRU5UIE9GIFRISVJEIFBBUlRZIFJJR0hUUy4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVEhPTERFUiBPUiBIT0xERVJTIElOQ0xVREVEIElOIFRISVMgTk9USUNFIEJFIExJQUJMRSBGT1IgQU5ZIEMKIExBSU0sIE9SIEFOWVNQRUNJQUwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTLCBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElOR0ZST00gTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0VPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgYWNvcHlyaWdodCBob2xkZXIgc2hhbGwgbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzIGluIHRoaXMgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb25vZiB0aGUgY29weXJpZ2h0IGhvbGRlci4KCiUlIFRoaXMgbm90aWNlIGlzIHByb3ZpZGVkIHdpdGggcmVzcGVjdCB0byBKaW5nLCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAKCkppbmcgQ29weWluZyBDb25kaXRpb25zCgpDb3B5cmlnaHQgKGMpIDIwMDEtMjAwMyBUaGFpIE9wZW4gU291cmNlIFNvZnR3YXJlIENlbnRlciBMdGQKQWxsIHJpZ2h0cyByZXNlcnZlZC4KClJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSx0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vcm90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCiAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFRoYWkgT3BlbiBTb3VyY2UgU29mdHdhcmUgQ2VudGVyIEx0ZCBub3IgdGhlIG5hbWVzb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXNzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KClRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIiBBTkRBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkVESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTllESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyhJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUztMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT05BTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCgolJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gUkVMQVggTkcgT2JqZWN0IE1vZGVsL1BhcnNlciwgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogCgoKVGhlIE1JVCBMaWNlbnNlCgpDb3B5cmlnaHQgKGMpICAKClBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHkgb2Z0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbCBpbnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG91c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZnRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbyxzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCgpUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU5DT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgoKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIFhGcmVlODYtVmlkTW9kZSBFeHRlbnNpb24sIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoKVmVyc2lvbiAxLjEgb2YgWEZyZWU4NiBQcm9qZWN0TGljZW5jZS4KCiAgICBDb3B5cmlnaHQgKEMpIDE5OTQtMjAwNCBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCgogICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weW9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGludGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0b3VzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5jZSwgYW5kL29yIHNlbGwgY29waWVzIG9mdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKICAgICAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSx0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucywgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICAgICAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0bm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQpkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgaW4gdGhlc2FtZSBwbGFjZSBhbmQgZm9ybSBhcyBvdGhlciBjb3B5cmlnaHQsIGxpY2Vuc2UgYW5kIGRpc2NsYWltZXIgaW5mb3JtYXRpb24uICAgICAgIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLCBpZiBhbnksbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmVkZXZlbG9wZWQgYnkgVGhlIFhGcmVlODYgUHJvamVjdCwgSW5jIChodHRwOi8vd3d3LnhmcmVlODYub3JnLykgYW5kIGl0c2NvbnRyaWJ1dG9ycyIsIGluIHRoZSBzYW1lIHBsYWNlIGFuZCBmb3JtIGFzIG90aGVyIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cy5BbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsIGluIHRoZSBzYW1lZm9ybSBhbmQgbG9jYXRpb24gYXMgb3RoZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMuCiAgICAgICA0LiBFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgWEZyZWU4NiBQcm9qZWN0LEluYyBzaGFsbCBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZVhGcmVlODYgUHJvamVjdCwgSW5jLgoKICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQgV0FSUkFOVElFUyxJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5ERklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBYRlJFRTg2UFJPSkVDVCwgSU5DIE9SIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCxTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU5DT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZT0YgU1VDSCBEQU1BR0UuCgolJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gWE1MIFNlY3VyaXR5LCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAKCiAgVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDEuMQoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBERgoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvcHlyaWdodCAoQykgMjAwMiBUaGUgQXBhY2hlIFNvZnR3YXJlRm91bmRhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4gUmVkaXN0cmlidXRpb24gYW5kdXNlIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXRtb2RpZmljYS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZWZvbGxvd2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25zIGFyZSBtZXQ6IDEuIFJlZGlzdHJpYnV0aW9ucyBvZnNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHRub3RpY2UsIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nZGlzY2xhaW1lci4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3RyZXByb2R1Y2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcmluIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHNwcm92aWRlZCB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBkaXN0cmlidXRpb24uIDMuIFRoZSBlbmQtdXNlcmRvY3VtZW50YXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sIGlmIGFueSxtdXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoiVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieXRoZSBBcGFjaGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29mdHdhcmUgRm91bmRhdGlvbgooaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXlhcHBlYXIgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvZnR3YXJlIGl0c2VsZiwgaWYgYW5kIHdoZXJldmVyIHN1Y2h0aGlyZC1wYXJ0eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLiA0LiBUaGVuYW1lcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXBhY2hlIEZvcnJlc3QiIGFuZCAiQXBhY2hlIFNvZnR3YXJlRm91bmRhdGlvbiIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzdCBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGVwcm9kdWN0cwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHByaW9yd3JpdHRlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbiBwZXJtaXNzaW9uLHBsZWFzZSBjb250YWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwYWNoZUBhcGFjaGUub3JnLiA1LiBQcm9kdWN0cyBkZXJpdmVkZnJvbSB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLCBub3JtYXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXRwcmlvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvdW5kYXRpb24uIFRISVMgU09GVFdBUkUgSVMgUFJPVklERURgYEFTIElTJycKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRCBXQVJSQU5USUVTLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEVJTVBMSUVECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTRk9SIEEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOT0VWRU5UCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUklUUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULElORElSRUNULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SQ09OU0VRVUVOVElBTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQU1BR0VTIChJTkNMVS0gRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1JTRVJWSUNFUzsgTE9TUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZVEhFT1JZIE9GCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUTElBQklMSVRZLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUk9USEVSV0lTRSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRVBPU1NJQklMSVRZIE9GCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNVQ0ggREFNQUdFLiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mdm9sdW50YXJ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55IGluZGl2aWR1YWxzIG9uYmVoYWxmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gRm9ybW9yZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlRm91bmRhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxlYXNlIHNlZSAuCgolJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gSW5kZXBlbmRlbnQgSlBFRyBHcm91cCdzIHNvZnR3YXJlIChsaWJqcGVnKSwgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogCgpJbiBwbGFpbiBFbmdsaXNoOgoKMS4gV2UgZG9uJ3QgcHJvbWlzZSB0aGF0IHRoaXMgc29mdHdhcmUgd29ya3MuICAoQnV0IGlmIHlvdSBmaW5kIGFueSBidWdzLAogICBwbGVhc2UgbGV0IHVzIGtub3chKQoyLiBZb3UgY2FuIHVzZSB0aGlzIHNvZnR3YXJlIGZvciB3aGF0ZXZlciB5b3Ugd2FudC4gIFlvdSBkb24ndCBoYXZlIHRvIHBheSB1cy4KMy4gWW91IG1heSBub3QgcHJldGVuZCB0aGF0IHlvdSB3cm90ZSB0aGlzIHNvZnR3YXJlLiAgSWYgeW91IHVzZSBpdCBpbiBhIHByb2dyYW0sIHlvdSBtdXN0IGFja25vd2xlZGdlIHNvbWV3aGVyZSBpbiB5b3VyIGRvY3VtZW50YXRpb24gdGhhdCB5b3UndmUgdXNlZCB0aGUgSUpHIGNvZGUuCgpJbiBsZWdhbGVzZToKClRoZSBhdXRob3JzIG1ha2UgTk8gV0FSUkFOVFkgb3IgcmVwcmVzZW50YXRpb24sIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQsIHdpdGggcmVzcGVjdCB0byB0aGlzIHNvZnR3YXJlLCBpdHMgcXVhbGl0eSwgYWNjdXJhY3ksIG1lcmNoYW50YWJpbGl0eSwgb3IgZml0bmVzcyBmb3IgYSBwYXJ0aWN1bGFyIHB1cnBvc2UuICBUaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJBUyBJUyIsIGFuZCB5b3UsIGl0cyB1c2VyLCBhc3N1bWUgdGhlIGVudGlyZSByaXNrIGFzIHRvIGl0cyBxdWFsaXR5IGFuZCBhY2N1cmFjeS4KClRoaXMgc29mdHdhcmUgaXMgY29weXJpZ2h0IChDKSAxOTkxLTE5OTgsIFRob21hcyBHLiBMYW5lLgpBbGwgUmlnaHRzIFJlc2VydmVkIGV4Y2VwdCBhcyBzcGVjaWZpZWQgYmVsb3cuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIChvciBwb3J0aW9ucyB0aGVyZW9mKSBmb3IgYW55IHB1cnBvc2UsIHdpdGhvdXQgZmVlLCBzdWJqZWN0IHRvIHRoZXNlIGNvbmRpdGlvbnM6CgooMSkgSWYgYW55IHBhcnQgb2YgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGlzIHNvZnR3YXJlIGlzIGRpc3RyaWJ1dGVkLCB0aGVuIHRoaXMKUkVBRE1FIGZpbGUgbXVzdCBiZSBpbmNsdWRlZCwgd2l0aCB0aGlzIGNvcHlyaWdodCBhbmQgbm8td2FycmFudHkgbm90aWNlIHVuYWx0ZXJlZDsgYW5kIGFueSBhZGRpdGlvbnMsIGRlbGV0aW9ucywgb3IgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgZmlsZXMgbXVzdCBiZSBjbGVhcmx5IGluZGljYXRlZCBpbiBhY2NvbXBhbnlpbmcgZG9jdW1lbnRhdGlvbi4KCigyKSBJZiBvbmx5IGV4ZWN1dGFibGUgY29kZSBpcyBkaXN0cmlidXRlZCwgdGhlbiB0aGUgYWNjb21wYW55aW5nIGRvY3VtZW50YXRpb24gbXVzdCBzdGF0ZSB0aGF0ICJ0aGlzIHNvZnR3YXJlIGlzIGJhc2VkIGluIHBhcnQgb24gdGhlIHdvcmsgb2YgdGhlIEluZGVwZW5kZW50IEpQRUcgR3JvdXAiLgoKKDMpIFBlcm1pc3Npb24gZm9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgb25seSBpZiB0aGUgdXNlciBhY2NlcHRzIGZ1bGwgcmVzcG9uc2liaWxpdHkgZm9yIGFueSB1bmRlc2lyYWJsZSBjb25zZXF1ZW5jZXM7IHRoZSBhdXRob3JzIGFjY2VwdCBOTyBMSUFCSUxJVFkgZm9yIGRhbWFnZXMgb2YgYW55IGtpbmQuCgpUaGVzZSBjb25kaXRpb25zIGFwcGx5IHRvIGFueSBzb2Z0d2FyZSBkZXJpdmVkIGZyb20gb3IgYmFzZWQgb24gdGhlIElKRyBjb2RlLCBub3QganVzdCB0byB0aGUgdW5tb2RpZmllZCBsaWJyYXJ5LiAgSWYgeW91IHVzZSBvdXIgd29yaywgeW91IG91Z2h0IHRvIGFja25vd2xlZGdlIHVzLgoKUGVybWlzc2lvbiBpcyBOT1QgZ3JhbnRlZCBmb3IgdGhlIHVzZSBvZiBhbnkgSUpHIGF1dGhvcidzIG5hbWUgb3IgY29tcGFueSBuYW1lIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSByZWxhdGluZyB0byB0aGlzIHNvZnR3YXJlIG9yIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSBpdC4gIFRoaXMgc29mdHdhcmUgbWF5IGJlIHJlZmVycmVkIHRvIG9ubHkgYXMgInRoZSBJbmRlcGVuZGVudCBKUEVHIEdyb3VwJ3Mgc29mdHdhcmUiLgoKV2Ugc3BlY2lmaWNhbGx5IHBlcm1pdCBhbmQgZW5jb3VyYWdlIHRoZSB1c2Ugb2YgdGhpcyBzb2Z0d2FyZSBhcyB0aGUgYmFzaXMgb2YgY29tbWVyY2lhbCBwcm9kdWN0cywgcHJvdmlkZWQgdGhhdCBhbGwgd2FycmFudHkgb3IgbGlhYmlsaXR5IGNsYWltcyBhcmUgYXNzdW1lZCBieSB0aGUgcHJvZHVjdCB2ZW5kb3IuCgphbnNpMmtuci5jIGlzIGluY2x1ZGVkIGluIHRoaXMgZGlzdHJpYnV0aW9uIGJ5IHBlcm1pc3Npb24gb2YgTC4gUGV0ZXIgRGV1dHNjaCwgc29sZSBwcm9wcmlldG9yIG9mIGl0cyBjb3B5cmlnaHQgaG9sZGVyLCBBbGFkZGluIEVudGVycHJpc2VzIG9mIE1lbmxvIFBhcmssIENBLiBhbnNpMmtuci5jIGlzIE5PVCBjb3ZlcmVkIGJ5IHRoZSBhYm92ZSBjb3B5cmlnaHQgYW5kIGNvbmRpdGlvbnMsIGJ1dCBpbnN0ZWFkIGJ5IHRoZSB1c3VhbCBkaXN0cmlidXRpb24gdGVybXMgb2YgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgcHJpbmNpcGFsbHksIHRoYXQgeW91IG11c3QgaW5jbHVkZSBzb3VyY2UgY29kZSBpZiB5b3UgcmVkaXN0cmlidXRlIGl0LiAgKFNlZSB0aGUgZmlsZSBhbnNpMmtuci5jIGZvciBmdWxsIGRldGFpbHMuKSAgSG93ZXZlciwgc2luY2UgYW5zaTJrbnIuYyBpcyBub3QgbmVlZGVkIGFzIHBhcnQgb2YgYW55IHByb2dyYW0gZ2VuZXJhdGVkIGZyb20gdGhlIElKRyBjb2RlLCB0aGlzIGRvZXMgbm90IGxpbWl0IHlvdSBtb3JlIHRoYW4gdGhlIGZvcmVnb2luZyBwYXJhZ3JhcGhzIGRvLgoKVGhlIFVuaXggY29uZmlndXJhdGlvbiBzY3JpcHQgImNvbmZpZ3VyZSIgd2FzIHByb2R1Y2VkIHdpdGggR05VIEF1dG9jb25mLiBJdCBpcyBjb3B5cmlnaHQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBidXQgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUuIFRoZSBzYW1lIGhvbGRzIGZvciBpdHMgc3VwcG9ydGluZyBzY3JpcHRzIChjb25maWcuZ3Vlc3MsIGNvbmZpZy5zdWIsIGx0Y29uZmlnLCBsdG1haW4uc2gpLiAgQW5vdGhlciBzdXBwb3J0IHNjcmlwdCwgaW5zdGFsbC1zaCwgaXMgY29weXJpZ2h0IGJ5IE0uSS5ULiBidXQgaXMgYWxzbyBmcmVlbHkgZGlzdHJpYnV0YWJsZS4KCkl0IGFwcGVhcnMgdGhhdCB0aGUgYXJpdGhtZXRpYyBjb2Rpbmcgb3B0aW9uIG9mIHRoZSBKUEVHIHNwZWMgaXMgY292ZXJlZCBieSBwYXRlbnRzIG93bmVkIGJ5IElCTSwgQVQmVCwgYW5kIE1pdHN1YmlzaGkuICBIZW5jZSBhcml0aG1ldGljIGNvZGluZyBjYW5ub3QgbGVnYWxseSBiZSB1c2VkIHdpdGhvdXQgb2J0YWluaW5nIG9uZSBvciBtb3JlIGxpY2Vuc2VzLiAgRm9yIHRoaXMgcmVhc29uLCBzdXBwb3J0IGZvciBhcml0aG1ldGljIGNvZGluZyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGZyZWUgSlBFRyBzb2Z0d2FyZS4gKFNpbmNlIGFyaXRobWV0aWMgY29kaW5nIHByb3ZpZGVzIG9ubHkgYSBtYXJnaW5hbCBnYWluIG92ZXIgdGhlIHVucGF0ZW50ZWQgSHVmZm1hbiBtb2RlLCBpdCBpcyB1bmxpa2VseSB0aGF0IHZlcnkgbWFueSBpbXBsZW1lbnRhdGlvbnMgd2lsbCBzdXBwb3J0IGl0LikgU28gZmFyIGFzIHdlIGFyZSBhd2FyZSwgdGhlcmUgYXJlIG5vIHBhdGVudCByZXN0cmljdGlvbnMgb24gdGhlIHJlbWFpbmluZyBjb2RlLgoKVGhlIElKRyBkaXN0cmlidXRpb24gZm9ybWVybHkgaW5jbHVkZWQgY29kZSB0byByZWFkIGFuZCB3cml0ZSBHSUYgZmlsZXMuIFRvIGF2b2lkIGVudGFuZ2xlbWVudCB3aXRoIHRoZSBVbmlzeXMgTFpXIHBhdGVudCwgR0lGIHJlYWRpbmcgc3VwcG9ydCBoYXMgYmVlbiByZW1vdmVkIGFsdG9nZXRoZXIsIGFuZCB0aGUgR0lGIHdyaXRlciBoYXMgYmVlbiBzaW1wbGlmaWVkIHRvIHByb2R1Y2UgInVuY29tcHJlc3NlZCBHSUZzIi4gIFRoaXMgdGVjaG5pcXVlIGRvZXMgbm90IHVzZSB0aGUgTFpXIGFsZ29yaXRobTsgdGhlIHJlc3VsdGluZyBHSUYgZmlsZXMgYXJlIGxhcmdlciB0aGFuIHVzdWFsLCBidXQgYXJlIHJlYWRhYmxlIGJ5IGFsbCBzdGFuZGFyZCBHSUYgZGVjb2RlcnMuCgpXZSBhcmUgcmVxdWlyZWQgdG8gc3RhdGUgdGhhdAogICAgIlRoZSBHcmFwaGljcyBJbnRlcmNoYW5nZSBGb3JtYXQoYykgaXMgdGhlIENvcHlyaWdodCBwcm9wZXJ0eSBvZgogICAgQ29tcHVTZXJ2ZSBJbmNvcnBvcmF0ZWQuICBHSUYoc20pIGlzIGEgU2VydmljZSBNYXJrIHByb3BlcnR5IG9mCiAgICBDb21wdVNlcnZlIEluY29ycG9yYXRlZC4iCgolJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gWCBSZXNpemUgYW5kIFJvdGF0ZSAoWHJhbmRyKSBFeHRlbnNpb24sIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoyLiBYRnJlZTg2IExpY2Vuc2UKClhGcmVlODYgY29kZSB3aXRob3V0IGFuIGV4cGxpY2l0IGNvcHlyaWdodCBpcyBjb3ZlcmVkIGJ5IHRoZSBmb2xsb3dpbmcKY29weXJpZ2h0L2xpY2Vuc2U6CgpDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMyBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluCnRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8KdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YKdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLApzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MKRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBYRlJFRTg2ClBST0pFQ1QgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOCkFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04KV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgpFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWEZyZWU4NiBQcm9qZWN0IHNoYWxsIG5vdCBiZQp1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZSB0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4KdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYRnJlZTg2IFByb2plY3QuCgolJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gZm9udGNvbmZpZywgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIHdpdGggdGhpcyBzb2Z0d2FyZTogCklkOiBDT1BZSU5HLHYgMS4zIDIwMDMvMDQvMDQgMjA6MTc6NDAga2VpdGhwIEV4cCAkCkNvcHlyaWdodCAyMDAxLDIwMDMgS2VpdGggUGFja2FyZAoKUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CnRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdApjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCmRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIEtlaXRoIFBhY2thcmQgbm90IGJlIHVzZWQgaW4KYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0CnNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uICBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vCnJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgdGhpcyBzb2Z0d2FyZSBmb3IgYW55IHB1cnBvc2UuICBJdAppcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LgoKS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwKSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTwpFVkVOVCBTSEFMTCBLRUlUSCBQQUNLQVJEIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SCkNPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLApEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SIE9USEVSClRPUlRJT1VTIEFDVElPTiwgQVJJU0lORyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IKUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIFhGcmVlODYsIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IApDb3B5cmlnaHQgKEMpIDE5OTQtMjAwMiBUaGUgWEZyZWU4NiBQcm9qZWN0LCBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5IG9mCnRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQKZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CnJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCnRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3IKc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8KcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZQpmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbApjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlClNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVApOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgpQVVJQT1NFIEFORApOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBYRlJFRTg2IFBST0pFQ1QgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sCkRBTUFHRVMgT1IgT1RIRVIKTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKT1VUIE9GIE9SIElOCkNPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuCgpFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiB0aGUgWEZyZWU4NiBQcm9qZWN0IHNoYWxsIG5vdCBiZQp1c2VkIGluIGFkdmVydGlzaW5nIG9yIG90aGVyd2lzZQp0byBwcm9tb3RlIHRoZSBzYWxlLCB1c2Ugb3Igb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yCndyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIHRoZSBYRnJlZTg2ClByb2plY3QuCiUlIFRoaXMgbm90aWNlIGlzIHByb3ZpZGVkIHdpdGggcmVzcGVjdCB0byBGYXN0IEluZm9zZXQsIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoqIEZhc3QgSW5mb3NldCB2ZXIuIDAuMSBzb2Z0d2FyZSAoIlNvZnR3YXJlIikgCiogCiogQ29weXJpZ2h0LCAyMDA0LTIwMDUgU3VuIE1pY3Jvc3lzdGVtcywgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLiAKKiAKKiBTb2Z0d2FyZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgCiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IAoqIG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6IAqgKiAKoCogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wIAqgKiAKoCogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSAKKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIAoqIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gU2VlIHRoZSAKKiBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucy4gCiogCiogU3VuIHN1cHBvcnRzIGFuZCBiZW5lZml0cyBmcm9tIHRoZSBnbG9iYWwgY29tbXVuaXR5IG9mIG9wZW4gc291cmNlIAoqIGRldmVsb3BlcnMsIGFuZCB0aGFua3MgdGhlIGNvbW11bml0eSBmb3IgaXRzIGltcG9ydGFudCBjb250cmlidXRpb25zIGFuZCAKKiBvcGVuIHN0YW5kYXJkcy1iYXNlZCB0ZWNobm9sb2d5LCB3aGljaCBTdW4gaGFzIGFkb3B0ZWQgaW50byBtYW55IG9mIGl0cyAKKiBwcm9kdWN0cy4gCiogCiogUGxlYXNlIG5vdGUgdGhhdCBwb3J0aW9ucyBvZiBTb2Z0d2FyZSBtYXkgYmUgcHJvdmlkZWQgd2l0aCBub3RpY2VzIGFuZCAKKiBvcGVuIHNvdXJjZSBsaWNlbnNlcyBmcm9tIHN1Y2ggY29tbXVuaXRpZXMgYW5kIHRoaXJkIHBhcnRpZXMgdGhhdCBnb3Zlcm4gdGhlIAoqIHVzZSBvZiB0aG9zZSBwb3J0aW9ucywgYW5kIGFueSBsaWNlbnNlcyBncmFudGVkIGhlcmV1bmRlciBkbyBub3QgYWx0ZXIgYW55IAoqIHJpZ2h0cyBhbmQgb2JsaWdhdGlvbnMgeW91IG1heSBoYXZlIHVuZGVyIHN1Y2ggb3BlbiBzb3VyY2UgbGljZW5zZXMsIAoqIGhvd2V2ZXIsIHRoZSBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5IGFuZCBsaW1pdGF0aW9uIG9mIGxpYWJpbGl0eSBwcm92aXNpb25zIAoqIGluIHRoaXMgTGljZW5zZSB3aWxsIGFwcGx5IHRvIGFsbCBTb2Z0d2FyZSBpbiB0aGlzIGRpc3RyaWJ1dGlvbi4gCiogCiogWW91IGFja25vd2xlZGdlIHRoYXQgdGhlIFNvZnR3YXJlIGlzIG5vdCBkZXNpZ25lZCwgbGljZW5zZWQgb3IgaW50ZW5kZWQgCiogZm9yIHVzZSBpbiB0aGUgZGVzaWduLCBjb25zdHJ1Y3Rpb24sIG9wZXJhdGlvbiBvciBtYWludGVuYW5jZSBvZiBhbnkgbnVjbGVhciAKKiBmYWNpbGl0eS4gCiogCiogQXBhY2hlIExpY2Vuc2UgCiogVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNCAKKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvIAoqIAoqLyAKLyogCiogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gCiogCiogVGhpcyBjb2RlIGlzIHN1YmplY3QgdG8gdGhlIGZyZWVieG1sIExpY2Vuc2UsIFZlcnNpb24gMS4xIAoqIAoqIENvcHlyaWdodCAoYykgMjAwMSAtIDIwMDUgZnJlZWJ4bWwub3JnLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKKiAKKiAkSGVhZGVyOiAvY3ZzL2ZpL0Zhc3RJbmZvc2V0L3NyYy9jb20vc3VuL3htbC9pbnRlcm5hbC9mYXN0aW5mb3NldC9BYnN0cmFjdFJlc291cmNlQnVuZGxlLmphdmEsdiAxLjIgCiqgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IAoqLyAKJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIEtlcmJlcm9zLCB3aGljaCBtYXkgYmUgaW5jbHVkZWQgd2l0aCB0aGlzIHNvZnR3YXJlOiAKCi8qIAogKiBDb3B5cmlnaHQgKEMpIDE5OTggYnkgdGhlIEZ1bmRzWHByZXNzLCBJTkMuIAogKiAKICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gCiAqIAogKiBFeHBvcnQgb2YgdGhpcyBzb2Z0d2FyZSBmcm9tIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EgbWF5IHJlcXVpcmUgCiAqIGEgc3BlY2lmaWMgbGljZW5zZSBmcm9tIHRoZSBVbml0ZWQgU3RhdGVzIEdvdmVybm1lbnQuoCBJdCBpcyB0aGUgCiAqIHJlc3BvbnNpYmlsaXR5IG9mIGFueSBwZXJzb24gb3Igb3JnYW5pemF0aW9uIGNvbnRlbXBsYXRpbmcgZXhwb3J0IHRvIAogKiBvYnRhaW4gc3VjaCBhIGxpY2Vuc2UgYmVmb3JlIGV4cG9ydGluZy4gCiAqIAogKiBXSVRISU4gVEhBVCBDT05TVFJBSU5ULCBwZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgCiAqIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCAKICogd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCAKICogbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCAKICogdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCAKICogdGhlIG5hbWUgb2YgRnVuZHNYcHJlc3MuIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIHB1YmxpY2l0eSBwZXJ0YWluaW5nIAogKiB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgCiAqIHBlcm1pc3Npb24uIEZ1bmRzWHByZXNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgCiAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiIHdpdGhvdXQgZXhwcmVzcyAKICogb3IgaW1wbGllZCB3YXJyYW50eS4gCiAqIAogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiAKICogSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgCiAqIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRJQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gCiAqLyAKCiUlIFRoaXMgbm90aWNlIGlzIHByb3ZpZGVkIHdpdGggcmVzcGVjdCB0byBVbmljb2RlJ3MgQ0xEUiBkYXRhIHJlcG9zaXRvcnksIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoKIFVuaWNvZGUgQ29weXJpZ2h0CgogICAgRm9yIHRoZSBnZW5lcmFsIHByaXZhY3kgcG9saWN5IGdvdmVybmluZyBhY2Nlc3MgdG8gdGhpcyBzaXRlLCBzZWUgdGhlIApVbmljb2RlIFByaXZhY3kgUG9saWN5LiBGb3IgdHJhZGVtYXJrIHVzYWdlLCBzZWUgdGhlIHRoZSBVbmljb2RlIENvbnNvcnRpdW0KVHJhZGVtYXJrcyBhbmQgTG9nbyBQb2xpY3kuCiAgICBOb3RpY2UgdG8gRW5kIFVzZXI6IFRlcm1zIG9mIFVzZQogICAgQ2FyZWZ1bGx5IHJlYWQgdGhlIGZvbGxvd2luZyBsZWdhbCBhZ3JlZW1lbnQgKCJBZ3JlZW1lbnQiKS4gVXNlIG9yIGNvcHlpbmcKb2YgdGhlIHNvZnR3YXJlIGFuZC9vciBjb2RlcyBwcm92aWRlZCB3aXRoIHRoaXMgYWdyZWVtZW50IChUaGUgIlNvZnR3YXJlIikKY29uc3RpdHV0ZXMgeW91ciBhY2NlcHRhbmNlIG9mIHRoZXNlIHRlcm1zCgogICAgICAgMS4gVW5pY29kZSBDb3B5cmlnaHQuCiAgICAgICAgICAgICAxLiBDb3B5cmlnaHQgqSAxOTkxLTIwMDUgVW5pY29kZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICAgICAgICAgMi4gQ2VydGFpbiBkb2N1bWVudHMgYW5kIGZpbGVzIG9uIHRoaXMgd2Vic2l0ZSBjb250YWluIGEgbGVnZW5kCmluZGljYXRpbmcgdGhhdCAiTW9kaWZpY2F0aW9uIGlzIHBlcm1pdHRlZC4iIEFueSBwZXJzb24gaXMgaGVyZWJ5IGF1dGhvcml6ZWQsCndpdGhvdXQgZmVlLCB0byBtb2RpZnkgc3VjaCBkb2N1bWVudHMgYW5kIGZpbGVzIHRvIGNyZWF0ZSBkZXJpdmF0aXZlIHdvcmtzCmNvbmZvcm1pbmcgdG8gdGhlIFVuaWNvZGWuIFN0YW5kYXJkLCBzdWJqZWN0IHRvIFRlcm1zIGFuZCBDb25kaXRpb25zIGhlcmVpbi4KICAgICAgICAgICAgIDMuIEFueSBwZXJzb24gaXMgaGVyZWJ5IGF1dGhvcml6ZWQsIHdpdGhvdXQgZmVlLCB0byB2aWV3LCB1c2UsCnJlcHJvZHVjZSwgYW5kIGRpc3RyaWJ1dGUgYWxsIGRvY3VtZW50cyBhbmQgZmlsZXMgc29sZWx5IGZvciBpbmZvcm1hdGlvbmFsCnB1cnBvc2VzIGluIHRoZSBjcmVhdGlvbiBvZiBwcm9kdWN0cyBzdXBwb3J0aW5nIHRoZSBVbmljb2RlIFN0YW5kYXJkLCBzdWJqZWN0IHRvCnRoZSBUZXJtcyBhbmQgQ29uZGl0aW9ucyBoZXJlaW4uCiAgICAgICAgICAgICA0LiBGdXJ0aGVyIHNwZWNpZmljYXRpb25zIG9mIHJpZ2h0cyBhbmQgcmVzdHJpY3Rpb25zIHBlcnRhaW5pbmcgdG8KdGhlIHVzZSBvZiB0aGUgcGFydGljdWxhciBzZXQgb2YgZGF0YSBmaWxlcyBrbm93biBhcyB0aGUgIlVuaWNvZGUgQ2hhcmFjdGVyCkRhdGFiYXNlIiBjYW4gYmUgZm91bmQgaW4gRXhoaWJpdCAxLgogICAgICAgICAgICAgNS4gRnVydGhlciBzcGVjaWZpY2F0aW9ucyBvZiByaWdodHMgYW5kIHJlc3RyaWN0aW9ucyBwZXJ0YWluaW5nIHRvCnRoZSB1c2Ugb2YgdGhlIHBhcnRpY3VsYXIgc2V0IG9mIGZpbGVzIHRoYXQgY29uc3RpdHV0ZSB0aGUgb25saW5lIGVkaXRpb24gb2YgVGhlClVuaWNvZGUgU3RhbmRhcmQsIFZlcnNpb24gNC4wLCBtYXkgYmUgZm91bmQgaW4gVjQuMCBvbmxpbmUgZWRpdGlvbi4KICAgICAgICAgICAgIDYuIE5vIGxpY2Vuc2UgaXMgZ3JhbnRlZCB0byAibWlycm9yIiB0aGUgVW5pY29kZSB3ZWJzaXRlIHdoZXJlIGEKZmVlIGlzIGNoYXJnZWQgZm9yIGFjY2VzcyB0byB0aGUgIm1pcnJvciIgc2l0ZS4KICAgICAgICAgICAgIDcuIE1vZGlmaWNhdGlvbiBpcyBub3QgcGVybWl0dGVkIHdpdGggcmVzcGVjdCB0byB0aGlzIGRvY3VtZW50LiBBbGwKY29waWVzIG9mIHRoaXMgZG9jdW1lbnQgbXVzdCBiZSB2ZXJiYXRpbS4KICAgICAgIDIuIFJlc3RyaWN0ZWQgUmlnaHRzIExlZ2VuZC4gQW55IHRlY2huaWNhbCBkYXRhIG9yIHNvZnR3YXJlIHdoaWNoIGlzCmxpY2Vuc2VkIHRvIHRoZSBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EsIGl0cyBhZ2VuY2llcyBhbmQvb3IgaW5zdHJ1bWVudGFsaXRpZXMKdW5kZXIgdGhpcyBBZ3JlZW1lbnQgaXMgY29tbWVyY2lhbCB0ZWNobmljYWwgZGF0YSBvciBjb21tZXJjaWFsIGNvbXB1dGVyCnNvZnR3YXJlIGRldmVsb3BlZCBleGNsdXNpdmVseSBhdCBwcml2YXRlIGV4cGVuc2UgYXMgZGVmaW5lZCBpbiBGQVIgMi4xMDEsIG9yCkRGQVJTIDI1Mi4yMjctNzAxNCAoSnVuZSAxOTk1KSwgYXMgYXBwbGljYWJsZS4gRm9yIHRlY2huaWNhbCBkYXRhLCB1c2UsCmR1cGxpY2F0aW9uLCBvciBkaXNjbG9zdXJlIGJ5IHRoZSBHb3Zlcm5tZW50IGlzIHN1YmplY3QgdG8gcmVzdHJpY3Rpb25zIGFzIHNldApmb3J0aCBpbiBERkFSUyAyMDIuMjI3LTcwMTUgVGVjaG5pY2FsIERhdGEsIENvbW1lcmNpYWwgYW5kIEl0ZW1zIChOb3YgMTk5NSkgYW5kCnRoaXMgQWdyZWVtZW50LiBGb3IgU29mdHdhcmUsIGluIGFjY29yZGFuY2Ugd2l0aCBGQVIgMTItMjEyIG9yIERGQVJTIDIyNy03MjAyLAphcyBhcHBsaWNhYmxlLCB1c2UsIGR1cGxpY2F0aW9uIG9yIGRpc2Nsb3N1cmUgYnkgdGhlIEdvdmVybm1lbnQgaXMgc3ViamVjdCB0bwp0aGUgcmVzdHJpY3Rpb25zIHNldCBmb3J0aCBpbiB0aGlzIEFncmVlbWVudC4KICAgICAgIDMuIFdhcnJhbnRpZXMgYW5kIERpc2NsYWltZXJzLgogICAgICAgICAgICAgMS4gVGhpcyBwdWJsaWNhdGlvbiBhbmQvb3Igd2Vic2l0ZSBtYXkgaW5jbHVkZSB0ZWNobmljYWwgb3IKdHlwb2dyYXBoaWNhbCBlcnJvcnMgb3Igb3RoZXIgaW5hY2N1cmFjaWVzIC4gQ2hhbmdlcyBhcmUgcGVyaW9kaWNhbGx5IGFkZGVkIHRvCnRoZSBpbmZvcm1hdGlvbiBoZXJlaW47IHRoZXNlIGNoYW5nZXMgd2lsbCBiZSBpbmNvcnBvcmF0ZWQgaW4gbmV3IGVkaXRpb25zIG9mCnRoZSBwdWJsaWNhdGlvbiBhbmQvb3Igd2Vic2l0ZS4gVW5pY29kZSBtYXkgbWFrZSBpbXByb3ZlbWVudHMgYW5kL29yIGNoYW5nZXMgaW4KdGhlIHByb2R1Y3QocykgYW5kL29yIHByb2dyYW0ocykgZGVzY3JpYmVkIGluIHRoaXMgcHVibGljYXRpb24gYW5kL29yIHdlYnNpdGUgYXQKYW55IHRpbWUuCiAgICAgICAgICAgICAyLiBJZiB0aGlzIGZpbGUgaGFzIGJlZW4gcHVyY2hhc2VkIG9uIG1hZ25ldGljIG9yIG9wdGljYWwgbWVkaWEKZnJvbSBVbmljb2RlLCBJbmMuIHRoZSBzb2xlIGFuZCBleGNsdXNpdmUgcmVtZWR5IGZvciBhbnkgY2xhaW0gd2lsbCBiZSBleGNoYW5nZQpvZiB0aGUgZGVmZWN0aXZlIG1lZGlhIHdpdGhpbiBuaW5ldHkgKDkwKSBkYXlzIG9mIG9yaWdpbmFsIHB1cmNoYXNlLgogICAgICAgICAgICAgMy4gRVhDRVBUIEFTIFBST1ZJREVEIElOIFNFQ1RJT04gQy4yLCBUSElTIFBVQkxJQ0FUSU9OIEFORC9PUgpTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQgRUlUSEVSIEVYUFJFU1MsCklNUExJRUQsIE9SIFNUQVRVVE9SWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIEFOWSBXQVJSQU5USUVTIE9GCk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UsIE9SIE5PTi1JTkZSSU5HRU1FTlQuIFVOSUNPREUKQU5EIElUUyBMSUNFTlNPUlMgQVNTVU1FIE5PIFJFU1BPTlNJQklMSVRZIEZPUiBFUlJPUlMgT1IgT01JU1NJT05TIElOIFRISVMKUFVCTElDQVRJT04gQU5EL09SIFNPRlRXQVJFIE9SIE9USEVSIERPQ1VNRU5UUyBXSElDSCBBUkUgUkVGRVJFTkNFRCBCWSBPUiBMSU5LRUQKVE8gVEhJUyBQVUJMSUNBVElPTiBPUiBUSEUgVU5JQ09ERSBXRUJTSVRFLgogICAgICAgNC4gV2FpdmVyIG9mIERhbWFnZXMuIEluIG5vIGV2ZW50IHNoYWxsIFVuaWNvZGUgb3IgaXRzIGxpY2Vuc29ycyBiZQpsaWFibGUgZm9yIGFueSBzcGVjaWFsLCBpbmNpZGVudGFsLCBpbmRpcmVjdCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55CmtpbmQsIG9yIGFueSBkYW1hZ2VzIHdoYXRzb2V2ZXIsIHdoZXRoZXIgb3Igbm90IFVuaWNvZGUgd2FzIGFkdmlzZWQgb2YgdGhlCnBvc3NpYmlsaXR5IG9mIHRoZSBkYW1hZ2UsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCB0aG9zZSByZXN1bHRpbmcgZnJvbQp0aGUgZm9sbG93aW5nOiBsb3NzIG9mIHVzZSwgZGF0YSBvciBwcm9maXRzLCBpbiBjb25uZWN0aW9uIHdpdGggdGhlIHVzZSwKbW9kaWZpY2F0aW9uIG9yIGRpc3RyaWJ1dGlvbiBvZiB0aGlzIGluZm9ybWF0aW9uIG9yIGl0cyBkZXJpdmF0aXZlcy4KICAgICAgIDUuIFRyYWRlbWFya3MuCiAgICAgICAgICAgICAxLiBVbmljb2RlIGFuZCB0aGUgVW5pY29kZSBsb2dvIGFyZSByZWdpc3RlcmVkIHRyYWRlbWFya3Mgb2YKVW5pY29kZSwgSW5jLiAKICAgICAgICAgICAgIDIuIFRoaXMgc2l0ZSBjb250YWlucyBwcm9kdWN0IG5hbWVzIGFuZCBjb3Jwb3JhdGUgbmFtZXMgb2Ygb3RoZXIKY29tcGFuaWVzLiBBbGwgcHJvZHVjdCBuYW1lcyBhbmQgY29tcGFueSBuYW1lcyBhbmQgbG9nb3MgbWVudGlvbmVkIGhlcmVpbiBhcmUKdGhlIHRyYWRlbWFya3Mgb3IgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIHRoZWlyIHJlc3BlY3RpdmUgb3duZXJzLiBPdGhlcgpwcm9kdWN0cyBhbmQgY29ycG9yYXRlIG5hbWVzIG1lbnRpb25lZCBoZXJlaW4gd2hpY2ggYXJlIHRyYWRlbWFya3Mgb2YgYSB0aGlyZApwYXJ0eSBhcmUgdXNlZCBvbmx5IGZvciBleHBsYW5hdGlvbiBhbmQgZm9yIHRoZSBvd25lcnMnIGJlbmVmaXQgYW5kIHdpdGggbm8KaW50ZW50IHRvIGluZnJpbmdlLgogICAgICAgICAgICAgMy4gVXNlIG9mIHRoaXJkIHBhcnR5IHByb2R1Y3RzIG9yIGluZm9ybWF0aW9uIHJlZmVycmVkIHRvIGhlcmVpbiBpcwphdCB0aGUgdXNlcidzIHJpc2suCiAgICAgICA2LiBNaXNjZWxsYW5lb3VzLgogICAgICAgICAgICAgMS4gSnVyaXNkaWN0aW9uIGFuZCBWZW51ZS4gVGhpcyBzZXJ2ZXIgaXMgb3BlcmF0ZWQgZnJvbSBhIGxvY2F0aW9uCmluIHRoZSBTdGF0ZSBvZiBDYWxpZm9ybmlhLCBVbml0ZWQgU3RhdGVzIG9mIEFtZXJpY2EuIFVuaWNvZGUgbWFrZXMgbm8KcmVwcmVzZW50YXRpb24gdGhhdCB0aGUgbWF0ZXJpYWxzIGFyZSBhcHByb3ByaWF0ZSBmb3IgdXNlIGluIG90aGVyIGxvY2F0aW9ucy4gSWYKeW91IGFjY2VzcyB0aGlzIHNlcnZlciBmcm9tIG90aGVyIGxvY2F0aW9ucywgeW91IGFyZSByZXNwb25zaWJsZSBmb3IgY29tcGxpYW5jZQp3aXRoIGxvY2FsIGxhd3MuIFRoaXMgQWdyZWVtZW50LCBhbGwgdXNlIG9mIHRoaXMgc2l0ZSBhbmQgYW55IGNsYWltcyBhbmQgZGFtYWdlcwpyZXN1bHRpbmcgZnJvbSB1c2Ugb2YgdGhpcyBzaXRlIGFyZSBnb3Zlcm5lZCBzb2xlbHkgYnkgdGhlIGxhd3Mgb2YgdGhlIFN0YXRlIG9mCkNhbGlmb3JuaWEgd2l0aG91dCByZWdhcmQgdG8gYW55IHByaW5jaXBsZXMgd2hpY2ggd291bGQgYXBwbHkgdGhlIGxhd3Mgb2YgYQpkaWZmZXJlbnQganVyaXNkaWN0aW9uLiBUaGUgdXNlciBhZ3JlZXMgdGhhdCBhbnkgZGlzcHV0ZXMgcmVnYXJkaW5nIHRoaXMgc2l0ZQpzaGFsbCBiZSByZXNvbHZlZCBzb2xlbHkgaW4gdGhlIGNvdXJ0cyBsb2NhdGVkIGluIFNhbnRhIENsYXJhIENvdW50eSwKQ2FsaWZvcm5pYS4gVGhlIHVzZXIgYWdyZWVzIHNhaWQgY291cnRzIGhhdmUgcGVyc29uYWwganVyaXNkaWN0aW9uIGFuZCBhZ3JlZSB0bwp3YWl2ZSBhbnkgcmlnaHQgdG8gdHJhbnNmZXIgdGhlIGRpc3B1dGUgdG8gYW55IG90aGVyIGZvcnVtLgogICAgICAgICAgICAgMi4gTW9kaWZpY2F0aW9uIGJ5IFVuaWNvZGUgVW5pY29kZSBzaGFsbCBoYXZlIHRoZSByaWdodCB0byBtb2RpZnkKdGhpcyBBZ3JlZW1lbnQgYXQgYW55IHRpbWUgYnkgcG9zdGluZyBpdCB0byB0aGlzIHNpdGUuIFRoZSB1c2VyIG1heSBub3QgYXNzaWduCmFueSBwYXJ0IG9mIHRoaXMgQWdyZWVtZW50IHdpdGhvdXQgVW5pY29kZSdzIHByaW9yIHdyaXR0ZW4gY29uc2VudC4KICAgICAgICAgICAgIDMuIFRheGVzLiBUaGUgdXNlciBhZ3JlZXMgdG8gcGF5IGFueSB0YXhlcyBhcmlzaW5nIGZyb20gYWNjZXNzIHRvCnRoaXMgd2Vic2l0ZSBvciB1c2Ugb2YgdGhlIGluZm9ybWF0aW9uIGhlcmVpbiwgZXhjZXB0IGZvciB0aG9zZSBiYXNlZCBvbgpVbmljb2RlJ3MgbmV0IGluY29tZS4KICAgICAgICAgICAgIDQuIFNldmVyYWJpbGl0eS4gIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgZGVjbGFyZWQKaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlLCB0aGUgcmVtYWluaW5nIHByb3Zpc2lvbnMgb2YgdGhpcyBBZ3JlZW1lbnQgc2hhbGwKcmVtYWluIGluIGVmZmVjdC4KICAgICAgICAgICAgIDUuIEVudGlyZSBBZ3JlZW1lbnQuIFRoaXMgQWdyZWVtZW50IGNvbnN0aXR1dGVzIHRoZSBlbnRpcmUKYWdyZWVtZW50IGJldHdlZW4gdGhlIHBhcnRpZXMuIAoKRVhISUJJVCAxClVOSUNPREUsIElOQy4gTElDRU5TRSBBR1JFRU1FTlQgLSBEQVRBIEZJTEVTIEFORCBTT0ZUV0FSRQoKICAgIFVuaWNvZGUgRGF0YSBGaWxlcyBpbmNsdWRlIGFsbCBkYXRhIGZpbGVzIHVuZGVyIHRoZSBkaXJlY3RvcmllcwpodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy8gYW5kIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy8uIFVuaWNvZGUKU29mdHdhcmUgaW5jbHVkZXMgYW55IHNvdXJjZSBjb2RlIHVuZGVyIHRoZSBkaXJlY3RvcmllcwpodHRwOi8vd3d3LnVuaWNvZGUub3JnL1B1YmxpYy8gYW5kIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvcmVwb3J0cy8uCgogICAgTk9USUNFIFRPIFVTRVI6IENhcmVmdWxseSByZWFkIHRoZSBmb2xsb3dpbmcgbGVnYWwgYWdyZWVtZW50LiBCWQpET1dOTE9BRElORywgSU5TVEFMTElORywgQ09QWUlORyBPUiBPVEhFUldJU0UgVVNJTkcgVU5JQ09ERSBJTkMuJ1MgREFUQSBGSUxFUwooIkRBVEEgRklMRVMiKSwgQU5EL09SIFNPRlRXQVJFICgiU09GVFdBUkUiKSwgWU9VIFVORVFVSVZPQ0FMTFkgQUNDRVBULCBBTkQKQUdSRUUgVE8gQkUgQk9VTkQgQlksIEFMTCBPRiBUSEUgVEVSTVMgQU5EIENPTkRJVElPTlMgT0YgVEhJUyBBR1JFRU1FTlQuIElGIFlPVQpETyBOT1QgQUdSRUUsIERPIE5PVCBET1dOTE9BRCwgSU5TVEFMTCwgQ09QWSwgRElTVFJJQlVURSBPUiBVU0UgVEhFIERBVEEgRklMRVMKT1IgU09GVFdBUkUuCgogICAgQ09QWVJJR0hUIEFORCBQRVJNSVNTSU9OIE5PVElDRQoKICAgIENvcHlyaWdodCDDP8IswyzCqSAxOTkxLTIwMDQgVW5pY29kZSwgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLiBEaXN0cmlidXRlZCB1bmRlcgp0aGUgVGVybXMgb2YgVXNlIGluIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvY29weXJpZ2h0Lmh0bWwuCgogICAgUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGUgVW5pY29kZSBkYXRhIGZpbGVzIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gKHRoZSAiRGF0YSBGaWxlcyIpIG9yClVuaWNvZGUgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiAodGhlICJTb2Z0d2FyZSIpIHRvIGRlYWwgaW4gdGhlCkRhdGEgRmlsZXMgb3IgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUKcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgYW5kL29yIHNlbGwgY29waWVzIG9mCnRoZSBEYXRhIEZpbGVzIG9yIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgRGF0YSBGaWxlcyBvcgpTb2Z0d2FyZSBhcmUgZnVybmlzaGVkIHRvIGRvIHNvLCBwcm92aWRlZCB0aGF0IChhKSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKQphbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgd2l0aCBhbGwgY29waWVzIG9mIHRoZSBEYXRhIEZpbGVzIG9yIFNvZnR3YXJlLAooYikgYm90aCB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZShzKSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4KYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uLCBhbmQgKGMpIHRoZXJlIGlzIGNsZWFyIG5vdGljZSBpbiBlYWNoIG1vZGlmaWVkIERhdGEKRmlsZSBvciBpbiB0aGUgU29mdHdhcmUgYXMgd2VsbCBhcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIERhdGEKRmlsZShzKSBvciBTb2Z0d2FyZSB0aGF0IHRoZSBkYXRhIG9yIHNvZnR3YXJlIGhhcyBiZWVuIG1vZGlmaWVkLgoKICAgIFRIRSBEQVRBIEZJTEVTIEFORCBTT0ZUV0FSRSBBUkUgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkKS0lORCwgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GCk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVCBPRiBUSElSRApQQVJUWSBSSUdIVFMuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIEhPTERFUlMgSU5DTFVERUQgSU4gVEhJUwpOT1RJQ0UgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIE9SIEFOWSBTUEVDSUFMIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwKREFNQUdFUywgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLApXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcKT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRIRSBEQVRBIEZJTEVTIE9SIFNPRlRXQVJFLgoKICAgIEV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIGEgY29weXJpZ2h0IGhvbGRlciBzaGFsbCBub3QKYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIG90aGVyIGRlYWxpbmdzCmluIHRoZXNlIERhdGEgRmlsZXMgb3IgU29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIGF1dGhvcml6YXRpb24gb2YgdGhlCmNvcHlyaWdodCBob2xkZXIuCgogICAgVW5pY29kZSBhbmQgdGhlIFVuaWNvZGUgbG9nbyBhcmUgdHJhZGVtYXJrcyBvZiBVbmljb2RlLCBJbmMuLCBhbmQgbWF5IGJlCnJlZ2lzdGVyZWQgaW4gc29tZSBqdXJpc2RpY3Rpb25zLiBBbGwgb3RoZXIgdHJhZGVtYXJrcyBhbmQgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzCm1lbnRpb25lZCBoZXJlaW4gYXJlIHRoZSBwcm9wZXJ0eSBvZiB0aGVpciByZXNwZWN0aXZlIG93bmVycy4KJSUgVGhpcyBub3RpY2UgaXMgcHJvdmlkZWQgd2l0aCByZXNwZWN0IHRvIFJTQSBQS0NTIzExIEhlYWRlciBGaWxlcyAmIFNwZWNpZmljYXRpb24sIHdoaWNoIG1heSBiZSBpbmNsdWRlZCB3aXRoIHRoaXMgc29mdHdhcmU6IAoKLyogCiAqIENvcHlyaWdodCAoQykgMTk5OCBieSB0aGUgRnVuZHNYcHJlc3MsIElOQy4gCiAqIAogKiBBbGwgcmlnaHRzIHJlc2VydmVkLiAKICogCiAqIEV4cG9ydCBvZiB0aGlzIHNvZnR3YXJlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgb2YgQW1lcmljYSBtYXkgcmVxdWlyZSAKICogYSBzcGVjaWZpYyBsaWNlbnNlIGZyb20gdGhlIFVuaXRlZCBTdGF0ZXMgR292ZXJubWVudC6gIEl0IGlzIHRoZSAKICogcmVzcG9uc2liaWxpdHkgb2YgYW55IHBlcnNvbiBvciBvcmdhbml6YXRpb24gY29udGVtcGxhdGluZyBleHBvcnQgdG8gCiAqIG9idGFpbiBzdWNoIGEgbGljZW5zZSBiZWZvcmUgZXhwb3J0aW5nLiAKICogCiAqIFdJVEhJTiBUSEFUIENPTlNUUkFJTlQsIHBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCAKICogZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgYW5kIAogKiB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUgY29weXJpZ2h0IAogKiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIAogKiB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IAogKiB0aGUgbmFtZSBvZiBGdW5kc1hwcmVzcy4gbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3IgcHVibGljaXR5IHBlcnRhaW5pbmcgCiAqIHRvIGRpc3RyaWJ1dGlvbiBvZiB0aGUgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYywgd3JpdHRlbiBwcmlvciAKICogcGVybWlzc2lvbi6gIEZ1bmRzWHByZXNzIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBhYm91dCB0aGUgc3VpdGFiaWxpdHkgb2YgCiAqIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLqAgSXQgaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3MgCiAqIG9yIGltcGxpZWQgd2FycmFudHkuIAogKiAKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIFdJVEhPVVQgQU5ZIEVYUFJFU1MgT1IgCiAqIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIFRIRSBJTVBMSUVEIAogKiBXQVJSQU5USUVTIE9GIE1FUkNIQU5USUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIAogKi8gCgolJSBUaGlzIG5vdGljZSBpcyBwcm92aWRlZCB3aXRoIHJlc3BlY3QgdG8gY2VydGFpbiBmaWxlcy9jb2RlIHdoaWNoIG1heSBpbmNsdWRlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgQVdUIHdpdGhpbiB0aGUgc29mdHdhcmU6IAoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIApCRUdJTqAgc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvSFBrZXlzeW0uaCAKQ29weXJpZ2h0IDE5ODcsIDE5OTigIFRoZSBPcGVuIEdyb3VwIAoKQWxsIFJpZ2h0cyBSZXNlcnZlZC4gCgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAKaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgCk9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgCk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gCklOIE5PIEVWRU5UIFNIQUxMIFRIRSBPUEVOIEdST1VQIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIApPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgCkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiAKT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLiAKCkV4Y2VwdCBhcyBjb250YWluZWQgaW4gdGhpcyBub3RpY2UsIHRoZSBuYW1lIG9mIFRoZSBPcGVuIEdyb3VwIHNoYWxsIApub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBvdGhlcndpc2UgdG8gcHJvbW90ZSB0aGUgc2FsZSwgdXNlIG9yIApvdGhlciBkZWFsaW5ncyBpbiB0aGlzIFNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBhdXRob3JpemF0aW9uIApmcm9tIFRoZSBPcGVuIEdyb3VwLiAKCkNvcHlyaWdodCAxOTg3IGJ5IERpZ2l0YWwgRXF1aXBtZW50IENvcnBvcmF0aW9uLCBNYXluYXJkLCBNYXNzYWNodXNldHRzLCAKCkFsbCBSaWdodHMgUmVzZXJ2ZWQgCgpQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCmRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCnByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgCmJvdGggdGhhdCBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiAKc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZXMgb2YgSGV3bGV0dCBQYWNrYXJkIApvciBEaWdpdGFsIG5vdCBiZSAKdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIApzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uIAoKRElHSVRBTCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgSU5DTFVESU5HIApBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gRVZFTlQgU0hBTEwgCkRJR0lUQUwgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIApBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIApXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIApBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIApTT0ZUV0FSRS4gCgpIRVdMRVRULVBBQ0tBUkQgTUFLRVMgTk8gV0FSUkFOVFkgT0YgQU5ZIEtJTkQgV0lUSCBSRUdBUkQgClRPIFRISVMgU09GV0FSRSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIApXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIApQVVJQT1NFLqAgSGV3bGV0dC1QYWNrYXJkIHNoYWxsIG5vdCBiZSBsaWFibGUgZm9yIGVycm9ycyAKY29udGFpbmVkIGhlcmVpbiBvciBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLCBpbmNpZGVudGFsIG9yIApjb25zZXF1ZW50aWFsIGRhbWFnZXMgaW4gY29ubmVjdGlvbiB3aXRoIHRoZSBmdXJuaXNoaW5nLCAKcGVyZm9ybWFuY2UsIG9yIHVzZSBvZiB0aGlzIG1hdGVyaWFsLiAKCkVORKAgc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvSFBrZXlzeW0uaCAKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCkJFR0lOIHNyYy9zb2xhcmlzL25hdGl2ZS9zdW4vYXd0L1hyYW5kci5oIAovKiAKoCogJFhGcmVlODY6IHhjL2xpYi9YcmFuZHIvWHJhbmRyLmgsdiAxLjkgMjAwMi8wOS8yOSAyMzozOTo0NCBrZWl0aHAgRXhwICQgCqAqIAqgKiBDb3B5cmlnaHQgqSAyMDAwIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiwgSW5jLiAKoCogQ29weXJpZ2h0IKkgMjAwMiBIZXdsZXR0LVBhY2thcmQgQ29tcGFueSwgSW5jLiAKoCogCqAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKoCogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgCqAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCAKoCogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyAKoCogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ29tcGFxIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIG9yIAqgKiBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIAqgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uoCBIUCBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIAqgKiBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS6gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgCqAqIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAKoCogCqAqIEhQIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIAqgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBDT01QQVEgCqAqIEJFIExJQUJMRSBGT1IgQU5ZIFNQRUNJQUwsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyAKoCogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiAKoCogT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiAKoCogQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gCqAqIAqgKiBBdXRob3I6oCBKaW0gR2V0dHlzLCBIUCBMYWJzLCBIUC4gCqAqLyAKCgpFTkQgc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvWHJhbmRyLmggCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKQkVHSU4gc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvZXh0dXRpbC5oIAovKiAKoCogJFhvcmc6IGV4dHV0aWwuaCx2IDEuMyAyMDAwLzA4LzE4IDA0OjA1OjQ1IGNvc2tyZXkgRXhwICQgCqAqIApDb3B5cmlnaHQgMTk4OSwgMTk5OKAgVGhlIE9wZW4gR3JvdXAgCgpBbGwgUmlnaHRzIFJlc2VydmVkLiAKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLiAKClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SIApJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwgCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuoCBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgCk9QRU4gR1JPVVAgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIApBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiAKQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4gCgpFeGNlcHQgYXMgY29udGFpbmVkIGluIHRoaXMgbm90aWNlLCB0aGUgbmFtZSBvZiBUaGUgT3BlbiBHcm91cCBzaGFsbCBub3QgYmUgCnVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciBvdGhlciBkZWFsaW5ncyAKaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiBmcm9tIFRoZSBPcGVuIEdyb3VwLiAKoCogCqAqIEF1dGhvcjqgIEppbSBGdWx0b24sIE1JVCBUaGUgT3BlbiBHcm91cCAKoCogCqAqoKCgoKCgoKCgoKCgoKCgoKCgoKAgWGxpYiBFeHRlbnNpb24tV3JpdGluZyBVdGlsaXRpZXMgCqAqIAqgKiBUaGlzIHBhY2thZ2UgY29udGFpbnMgdXRpbGl0aWVzIGZvciB3cml0aW5nIHRoZSBjbGllbnQgQVBJIGZvciB2YXJpb3VzIAqgKiBwcm90b2NvbCBleHRlbnNpb25zLqAgVEhFU0UgSU5URVJGQUNFUyBBUkUgTk9UIFBBUlQgT0YgVEhFIFggU1RBTkRBUkQgQU5EIAqgKiBBUkUgU1VCSkVDVCBUTyBDSEFOR0UhIAqgKi8gCi8qICRYRnJlZTg2OiB4Yy9pbmNsdWRlL2V4dGVuc2lvbnMvZXh0dXRpbC5oLHYgMS41IDIwMDEvMDEvMTcgMTc6NTM6MjAgZGF3ZXMgRXhwICQgKi8gCgpFTkQgc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvZXh0dXRpbC5oIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogCkJFR0lOoKAgc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvZm9udGNvbmZpZy5oIAovKiAKoCogJFJDU0lkOiB4Yy9saWIvZm9udGNvbmZpZy9mb250Y29uZmlnL2ZvbnRjb25maWcuaCx2IDEuMzAgMjAwMi8wOS8yNiAwMDoxNzoyNyAKa2VpdGhwIEV4cCAkIAqgKiAKoCogQ29weXJpZ2h0IKkgMjAwMSBLZWl0aCBQYWNrYXJkIAqgKiAKoCogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzIAqgKiBkb2N1bWVudGF0aW9uIGZvciBhbnkgcHVycG9zZSBpcyBoZXJlYnkgZ3JhbnRlZCB3aXRob3V0IGZlZSwgcHJvdmlkZWQgdGhhdCAKoCogdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQgYm90aCB0aGF0IAqgKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nIAqgKiBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZSBvZiBLZWl0aCBQYWNrYXJkIG5vdCBiZSB1c2VkIGluIAqgKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgCqAqIHNwZWNpZmljLCB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uoCBLZWl0aCBQYWNrYXJkIG1ha2VzIG5vIAqgKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLqAgSXQgCqAqIGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuIAqgKiAKoCogS0VJVEggUEFDS0FSRCBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSCBSRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSwgCqAqIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUywgSU4gTk8gCqAqIEVWRU5UIFNIQUxMIEtFSVRIIFBBQ0tBUkQgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgCqAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCAKoCogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiAKoCogVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiAKoCogUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4gCgpFTkSgoCBzcmMvc29sYXJpcy9uYXRpdmUvc3VuL2F3dC9mb250Y29uZmlnLmggCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKQkVHSU4gc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvbGlzdC5jIApBTkSgIHNyYy9zb2xhcmlzL25hdGl2ZS9zdW4vYXd0L2xpc3QuaCAKQU5EIHNyYy9zb2xhcmlzL25hdGl2ZS9zdW4vYXd0L211bHRpVmlzLmMgCkFORKAgc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvbXVsdGlWaXMuaCAKQU5EoCBzcmMvc29sYXJpcy9uYXRpdmUvc3VuL2F3dC93c3V0aWxzLmggCgpDb3B5cmlnaHQgKGMpIDE5OTQgSGV3bGV0dC1QYWNrYXJkIENvLiAKQ29weXJpZ2h0IChjKSAxOTk2oCBYIENvbnNvcnRpdW0gCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgCmEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAKIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyAKd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCAKZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIApwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gCnRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAKaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgCk9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgCk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gCklOIE5PIEVWRU5UIFNIQUxMIFRIRSBYIENPTlNPUlRJVU0gQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgCk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCAKQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIApPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAoKRXhjZXB0IGFzIGNvbnRhaW5lZCBpbiB0aGlzIG5vdGljZSwgdGhlIG5hbWUgb2YgdGhlIFggQ29uc29ydGl1bSBzaGFsbCAKbm90IGJlIHVzZWQgaW4gYWR2ZXJ0aXNpbmcgb3Igb3RoZXJ3aXNlIHRvIHByb21vdGUgdGhlIHNhbGUsIHVzZSBvciAKb3RoZXIgZGVhbGluZ3MgaW4gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gYXV0aG9yaXphdGlvbiAKZnJvbSB0aGUgWCBDb25zb3J0aXVtLiAKCkVORCBzcmMvc29sYXJpcy9uYXRpdmUvc3VuL2F3dC9saXN0LmMgCkFORKAgc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvbGlzdC5oIApBTkQgc3JjL3NvbGFyaXMvbmF0aXZlL3N1bi9hd3QvbXVsdGlWaXMuYyAKQU5EoCBzcmMvc29sYXJpcy9uYXRpdmUvc3VuL2F3dC9tdWx0aVZpcy5oIApBTkSgIHNyYy9zb2xhcmlzL25hdGl2ZS9zdW4vYXd0L3dzdXRpbHMuaCAKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIApCRUdJTiBzcmMvc29sYXJpcy9uYXRpdmUvc3VuL2F3dC9yYW5kci5oIAoKoCogCqAqIENvcHlyaWdodCCpIDIwMDAsIENvbXBhcSBDb21wdXRlciBDb3Jwb3JhdGlvbiwgCqAqIENvcHlyaWdodCCpIDIwMDIsIEhld2xldHQgUGFja2FyZCwgSW5jLiAKoCogCqAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGRpc3RyaWJ1dGUsIGFuZCBzZWxsIHRoaXMgc29mdHdhcmUgYW5kIGl0cyAKoCogZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2UgaXMgaGVyZWJ5IGdyYW50ZWQgd2l0aG91dCBmZWUsIHByb3ZpZGVkIHRoYXQgCqAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdCAKoCogY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyAKoCogZG9jdW1lbnRhdGlvbiwgYW5kIHRoYXQgdGhlIG5hbWUgb2YgQ29tcGFxIG9yIEhQIG5vdCBiZSB1c2VkIGluIGFkdmVydGlzaW5nIAqgKiBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIAqgKiB3cml0dGVuIHByaW9yIHBlcm1pc3Npb24uoCBIUCBtYWtlcyBubyByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIAqgKiBzdWl0YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIGZvciBhbnkgcHVycG9zZS6gIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgCqAqIHdpdGhvdXQgZXhwcmVzcyBvciBpbXBsaWVkIHdhcnJhbnR5LiAKoCogCqAqIEhQIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcgQUxMIAqgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTLCBJTiBOTyBFVkVOVCBTSEFMTCBIUCAKoCogQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIAqgKiBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIAqgKiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIAqgKiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUiBQRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLiAKoCogCqAqIEF1dGhvcjqgIEppbSBHZXR0eXMsIEhQIExhYnMsIEhld2xldHQtUGFja2FyZCwgSW5jLiAKCkVORCBzcmMvc29sYXJpcy9uYXRpdmUvc3VuL2F3dC9yYW5kci5oIAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAKCkJFR0lOIHNyYy9zb2xhcmlzL25hdGl2ZS9zdW4vamF2YTJkL29wZW5nbC9KMkRfR0wvZ2x4LmggCqAqIE1lc2EgMy1EIGdyYXBoaWNzIGxpYnJhcnkgCqAqIFZlcnNpb246oCA0LjEgCqAqIAqgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwMqAgQnJpYW4gUGF1bKCgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIAqgKiAKoCogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgCqAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIAqgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIAqgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgCqAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSAKoCogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczogCqAqIAqgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCAKoCogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuIAqgKiAKoCogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgCqAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCAKoCogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC6gIElOIE5PIEVWRU5UIFNIQUxMIAqgKiBCUklBTiBQQVVMIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiAKoCogQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gCqAqIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuIAoKRU5EIHNyYy9zb2xhcmlzL25hdGl2ZS9zdW4vamF2YTJkL29wZW5nbC9KMkRfR0wvZ2x4LmggCg==