VGhpcyBpcyBhbiBhdHRlbXB0IHRvIGdpdmUgY3JlZGl0IHRvIHRoZSBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIGluIHNvbWUgd2F5IHRvIHRoZSBtcGcxMjMgcHJvamVjdC4KVGhlcmUgYXJlIG5hbWVzIGFuZCBlbWFpbCBhZGRyZXNzZXMgbGlzdGVkLiBQbGVhc2UgdXNlIHRoZXNlIGFkZHJlc3NlcyBvbmx5IHRvIGNvbnRhY3QgY29udHJpYnV0b3JzIHdpdGggc29tZSBxdWVzdGlvbiBhYm91dCB0aGVpciBtcGcxMjMgY29udHJpYnV0aW9uLgpZb3UgYXJlIGV4cGxpY2l0bHkgbm90IGFsbG93ZWQgdG8gc2VuZCB0aGVtIHVud2FudGVkIGJ1c2luZXNzIG9mZmVycyBvciB0byBxdWVzdGlvbiB0aGUgcXVhbGl0eSBvZiB0aGVpciBzZXggbGlmZS4KLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkN1cnJlbnQgbWFpbnRhaW5lcnMgd2l0aCB2YXJpb3VzIHNvcnRzIG9mIGNvbnRyaWJ1dGlvbnM6CglUaG9tYXMgT3JnaXMgPHRob21hc0Bvcmdpcy5vcmc+CglOaWNob2xhcyBKIEh1bWZyZXkgPG5qaEBlY3Muc290b24uYWMudWs+CgpHZW5lcmljIGFkZHJlc3MgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgbWFpbnRhaW5lciAoaG9wZWZ1bGx5IHN0aWxsIHdvcmtzIGluIGZ1dHVyZSBpbiBjYXNlIG1haW50YWluZXJzaGlwIHdpbGwgY2hhbmdlIGFnYWluKTogPG1haW50YWluZXJAbXBnMTIzLm9yZz4KClRoZSBjcmVhdG9yOiBNaWNoYWVsIEhpcHAgKGVtYWlsOiBoaXBwbUBpbmZvcm1hdGlrLnVuaS10dWViaW5nZW4uZGUgLSBwbGVhc2UgYm90aGVyIG1haW50YWluZXJzIGZpcnN0KQoKQ29udHJpYnV0aW9ucy9pZGVhcyBUaG9tYXMgT3JnaXMgZXJhIChpbmNsdWRlcyBiYWNrcG9ydHMgZnJvbSBtaGlwcCB0cnVuayk6CgpUYWloZWkgTW9ubWEgPHRta2tAbWFjLmNvbT46IEEgd2hvbGUgbG90IG9mIG5ldy9pbXByb3ZlZCBhc3NlbWJsZXIgY29kZSEKQ2hyaXN0aWFuIFdlaXNnZXJiZXIgPG5hZGR5QG9wZW5ic2Qub3JnPjogc25kaW8gb3V0cHV0ClBhdHJpY2sgRGVobmUgPHBhdHJpY2tAc3RlaWRsZS5uZXQ+OiBtb3JlIE1TVkMrKyBwb3J0aW5nLCBwYXRjaCB0byBoYW5kbGUgbWlzc2luZyBiaXQgcmVzZXJ2b2lycwpUaG9yc3RlbiBHbGFzZXIgPHRnQG1pcmJzZC5kZT46IGljeTJ1dGY4LCBzdWdnZXN0IHV0ZjggbG9jYWxlIHN0dWZmCkRhbiBTbWl0aCA8ZGFuQGFsZ2VudGEuY29tPjogQUJJIGZpeGVzIGZvciBlbnN1cmluZyBzdGFjayBhbGlnbm1lbnQgKGVzcC4gZm9yIE1pbkdXLWJ1aWx0IERMTCB3aXRoIE1TVkMpCk1pY2hhZWwgUnl6aHlraCA8bWNscm95QGdtYWlsLmNvbT46IG1wZzEyMy5zcGVjLmluClN0ZWZhbiBMZW5zZWxpbmsgPFN0ZWZhbkBsZW5zZWxpbmsub3JnPjogaW5pdGlhbCBhUnRzIG91dHB1dApTZXJnZWogS3ZhY2hvbm9rIDxyYXZlbmV4cEBnbWFpbC5jb20+OiB3aW4zMiBhdWRpbyByZXdyaXRlCldpbnN0b246IFN1bk9TLTQuMS40L2djYy0yLjcuMCB0ZXN0aW5nIGFuZCBzdWdnZXN0aW9ucyBmb3IgZml4ZXMgKGxlZ2FjeSBNYWtlZmlsZSwgaW50ZWdlciB0eXBlIGhlYWRlcnMpCk1pa2EgVGlhaW5lbjogcG9pbnRpbmcgb3V0IHRoZSBmaXggZm9yIHRoZSBVVEYgdG8gQVNDSUkgZmlsdGVyaW5nIG9mIHRhZ3MgdG8gYWN0dWFsbHkgd29yawpOaWNrIEt1cnNoZXYgPG5pY2tvbHNfa0BtYWlsLnJ1PjogZXh0ZW5kZWQgM2Rub3cgKGZyb20gbXBsYXllcikKWnV4eSBNZW5nIDx6dXh5Lm1lbmdAZ21haWwuY29tPjogU1NFIChmcm9tIG1wbGF5ZXIpCkhvbnphIDxjdW5kcmFrQHF1aWNrLmN6PjogaWRlYSBhbmQgcHJvdG90eXBlIHBhdGNoIGZvciBJQ1kgbWV0YSBkYXRhIHN1cHBvcnQKUGV0ciBCYXVkaXMgPHBhc2t5QHVjdy5jej46IHBhdGNoZXM6IHRlcm0gc2lnY29udCwgaWQzIGRpc3BsYXkgdW5pY29kZSBmYWxsYmFjayBhbmQgY29uZGVuc2VkIG91dHB1dApQZXRyIFNhbGluZ2VyIDxQZXRyLlNhbGluZ2VyQHNlem5hbS5jej46IGk0ODYgZW5oYW5jZW1lbnQKbXBkYXZpZ0B1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ6IGxpbnV4LXBwYy1uYXMgTWFrZWZpbGUubGVnYWN5IGVudHJ5CkFkcmlhbiBCYWNvbiA8YWRyaWFuLmJhY29uQHhzNGFsbC5ubD46IHBhdGNoZWQgZGVjb2RlX2k1ODZfZGl0aGVyIChub2lzZSBzaGFwZWQgZmxvYXQvaW50IHJvdW5kaW5nKQpDb29sIEZlZXQgQXVkaW8gcHJvamVjdCA8bnV0Y2FzZUBkdGZtLm9yZz46IHJlYWx0aW1lIGVxdWFsaXplciBjb250cm9sClN0ZXZlIEdydW5kZWxsIDx3d3dAZ3J1bmRlbGwudS1uZXQuY29tPjogY2xlYW4gc3Rkb3V0IGluIGNvbnRyb2wgbW9kZSB3aXRoIHN0ZG91dCBkZWNvZGluZwpSb21haW4gRG9sYmVhdSA8cm9tYWluQGRvbGJlYXUub3JnPjogQWx0aXZlYyBzdXBwb3J0ICh0YWtlbiBmcm9tIG1wbGF5ZXIpClRhaWhlaSBNb25tYSA8dG1ra0BtYWMuY29tPjogQWx0aXZlYyBpbXByb3ZlbWVudHMKaGlnd2F5IDxoaWd3YXlAbWVkbmV0Lm1kPjogTU1YIFBhdGNoCkNsZW1lbnMgTGFkaXNjaCA8Y2xlbWVuc0BsYWRpc2NoLmRlPjogQUxTQSAwLjkvMS4wIHN1cHBvcnQKCkRlYmlhbiBEYW5pZWwgS29icmFzIDxrb2JyYXNAZGViaWFuLm9yZz4gZXJhOgoKU3RldmUgS2VtcCA8c2t4QGRlYmlhbi5vcmc+CkRhbiBPbHNvbiA8dGhlb2Rkb25lMzNAaWNjdWx1cy5vcmc+ClN5dXVoZWkgS2FzaGl5YW1hIDxzcXVhc2hAbWIua2NvbS5uZS5qcD4KUnVwZXJ0IExldmVuZSA8cnVwZXJ0LmRlYmlhbkBob3Rwb3AuY29tPgpBbmRyZWFzIERpbGdlciA8YWRpbGdlckB0dXJib2xpbnV4LmNvbT4KRXJpayBCLiBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4KQ2hyaXMgQnV0bGVyIDxjaHJpc2JAZGViaWFuLm9yZz4KTWFydGluIFNqb2dyZW4gPG1kOW1zQG1kc3R1ZC5jaGFsbWVycy5zZT4KQ2hldCBIb3NleSA8Y2hvc2V5QGJ1ZGFwcmVzcy5jb20+ClJvbGFuZCBSb3NlbmZlbGQgPHJvbGFuZEBzcGlubmFrZXIuZGU+CgoKRGViaWFuIENvbGluIFdhdHNvbiA8Y2p3YXRzb25AZGViaWFuLm9yZz4gZXJhOgoKSGVsZ2UgRGVsbGVyIDxkZWxsZXJAZ214LmRlPgpDaGV0IEhvc2V5IDxjaG9zZXlAYnVkYXByZXNzLmNvbT4KQ2hyaXN0b3BoZXIgQy4gQ2hpbWVsaXMgPGNocmlzQGRlYmlhbi5vcmc+ClJvbGFuZCBSb3NlbmZlbGQgPHJvbGFuZEBzcGlubmFrZXIuZGU+Ck1hcmNlbG8gRS4gTWFnYWxsb24gPG1tYWdhbGxvQGRlYmlhbi5vcmc+CgoKSW5pdGlhbCBEZWJpYW5lcnM6CgpUb21taSBWaXJ0YW5lbiA8dHZAZGViaWFuLm9yZz4KUGF1bCBIYWdnYXJ0IDxwaGFnZ2FydEBkZWJpYW4ub3JnPgoKCkNvbnRyaWJ1dGlvbnMvaWRlYXMgTWljaGFlbCBIaXBwIGVyYToKCk1pa2tvIFRvbW1pbGE6IERDVDkKT2xpdmVyIEZyb21tZSA8b2xpdmVyLmZyb21tZUBoZWltMy50dS1jbGF1c3RoYWwuZGU+Ck1QRUcgU29mdHdhcmUgU2ltdWxhdGlvbiBHcm91cDogcmVmZXJlbmNlIGRlY29kZXIgcGFja2FnZQpUb2JpYXMgQmFkaW5nOiBpZGVhIGZvciBEQ1Q2NCBpbiBzdWJiYW5kIHN5bnRoZXNpcyBmcm9tIG1hcGxheSBwYWNrYWdlCkplZmYgVHNheSBhbmQgTWlra28gVG9tbWlsYTogTURDVDM2IGZyb20gbWFwbGF5IHBhY2thZ2UKUGhpbGlwcCBLbmlyc2NoIDxwaGlsQG1waWstdHVlYi5tcGcuZGU+OiBEQ1QzNi9tYW51YWwgdW5yb2xsIGlkZWEKVGhvbWFzIFdvZXJuZXI6IFNHSSBBdWRpbwpEYW1pZW4gQ2xlcm1vbnRlOiBIUC1VWCBhdWRpbyBmaXhlcwpOaWNsYXMgTGluZHN0cm9tIDxuaWxAd2luZWFzeS5zZT46IE9TMiBwb3J0ClN0ZWZhbiBCaWVzY2hld3NraSA8c3RiQGFjbS5vcmc+OiBQZW50aXVtIG9wdGltaXphdGlvbnMsIGRlY29kZV9pNTg2LnMKTWFydGluIERlbm4gPG1kZW5uQHVuaXgtYWcudW5pLWtsLmRlPjogTkFTIHBvcnQKTmlrbGFzIEJlaXNlcnQgPG5iZWlzZXJ0QHBoeXNpay50dS1tdWVuY2hlbi5kZT46IE1QRUcgMi41IHRhYmxlcwo8bXljcm9mdEBOZXRCU0QuT1JHPiBhbmQgPGF1Z3VzdHNzQGNzLmNoYWxtZXJzLnNlPjogTmV0QlNEIFBhdGNoKGVzKQpLZXZpbiBCcmludG5hbGwgPGticmludEB2aXNpLmNvbT46IEJTRCBwYXRjaApUb255IE1pbGxpb246IHdpbjMyIHBvcnQKU3RldmVuIFRpZ2VyIExhbmc6IGFkdmFuY2VkIHNodWZmbGUKRXJpYyBCLiBNaXRjaGVsbDogZXNkIHBvcnQKUnlhbiBSLiBQcm9zc2VyIDxwcm9zc2VyQGdlb2NpdGllcy5jb20+OiBlc2QgcG9ydCBmb3IgU29sYXJpcwpBbmRyZWFzIE5ldWhhdXM6IGluaXRpYWwgZ2VuZXJpYyBjb250cm9sIGludGVyZmFjZQoKKGFkZGl0aW9uYWxseSBmZXRjaGVkIGZyb20gY2hhbmdlbG9nOikKClJhbGYgSGlsZGVicmFuZHQgPFIuSGlsZGVicmFuZHRAVFUtQlMuREU+OiBhdWRpb19hbGliIGNoYW5nZXMKPHNtc0Btb2UuMmJzZC5jb20+OiBCU0RPUyA0LjAgd2l0aCBnY2MgYWRkZWQgdG8gTWFrZWZpbGUKQmVydHJhbmQgUGV0aXQgPGVscm9uZEBwaG9lLm5ldGRldi5uZXQ+OiBmcm9udGVuZCBjaGFuZ2VzCkVyaWsgTW91dyA8Si5BLksuTW91d0BpdHMudHVkZWxmdC5ubD46IFNHSSBhdWRpbyBmaXggZm9yIG5vbiBSQUQgbWFjaGluZXMKRGFuaWVsIE8nQ29ubm9yIDxkYXJpdXNAZ3VwcHkuZG9ucy5uZXQuYXU+OiBmcmVlYnNkLWVzZCBtYWtlLWVudHJ5CkQuIFNrYXJkYSA8MHJmZWx5dXNAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PjogZW5oYW5jZWQgaGVhZF9jaGVjawpXaWxzb24sIEplZmYgRCA8amVmZi53aWxzb25Ad2lsY29tLmNvbT46IHh0ZXJtLXRpdGxlClJvYmVydCBCaWhsbWV5ZXIgPHJvYmJlQG9yY3VzLnByaXYuYXQ+OiBlc2QgY2hhbmdlcwpIYW5udSBOYXBhcmkncyA8SGFubnUuTmFwYXJpQGh1dC5maT46IFNHSSBhdWRpbyBwYXRjaGVzCjxKdWVyZ2VuLlNjaG9ld0B1bml4LWFnLnVuaS1zaWVnZW4uZGU+OiBuYXRpdmUgQUlYIHN1cHBvcnQKPHBzc3RAZXVza2FsbmV0Lm5ldD46IHBsYXlsaXN0IHBhdGNoCkdpbGxlcyBadW5pbm8gPEdpbGxlcy5adW5pbm9AaGVpLmZ1cGwuYXNzby5mcj46IFNHSSBhdWRpbyBwYXRjaGVzCk1hdHRoZXcgUGFyc2xvdyA8cm95QGFscGhhLmFscGhhbGluay5jb20uYXU+OiBlc2RzZXJ2ZXIgcGF0Y2gKPGRsdXhAZGx1eC5zY2guYm1lLmh1PjogZXF1YWxpemVyIHBhdGNoIChlcXVhbGZpbGUgc2V0dGluZykKRHVjcm9xdWV0IEVyd2FuIDxkdWNyb3F1ZUB1ZnItaW5mby1wNy5pYnAuZnI+OiBIUFVYL0FMaWIgc3VwcG9ydApTaGFuZSBXZWduZXIgPHNoYW5lQENNLk5VPjogZ2VucmVwYXRjaApTYW11ZWwgQXVkZXQgPGd1YXJkaWFAc3RlcC5wb2x5bXRsLmNhPjogd2F2LUZpbGUgcGF0Y2gKIkouIERlYW4gQnJlZGVyc29uIiA8amRiQGNzLnV0YWguZWR1PjogU0dJLVJBRCBzdXBwb3J0CkNob3UgWWUtY2hpIDxpczg0MDAyQGNpcy5uY3R1LmVkdS50dz46IHNhamJlcnBsYXkvRnJlZUJTRCBwYXRjaApGYWJyaWNlIEJlbGxhcmQgPGJlbGxhcmRAZW1haWwuZW5zdC5mcj46IDQ4NiBvcHRpbWl6YXRpb25zCkEuIEhlcm1hbnNlbiA8YWhlcm1hbnNAdmYudGVsaWEubm8+IGFuZCBKLiBLeXNlbGEgPHBlcmV4QGpjdS5jej46IEFMU0Egb3V0cHV0CktJTVVSQSBUYWt1aGlybyA8a2ltQGhhbm5haC5pcGMubWl5YWt5by11LmFjLmpwPjogSzYtM0ROb3cKUGV0ciBTdGVobGlrIDxzdGVobGlrQGNhczMuemxpbi52dXRici5jej46IE1JTlQKQW5keSA8YW5keUBzbm9vZ2llLmRlbW9uLmNvLnVrPjogZmxvYXQyaW50IHNwZWVkIHVwIHByb3Bvc2FsCkJyaWFuIEZvdXR6IDxmb3V0ekBhbmlzZS5lZS5jb3JuZWxsLmVkdT46IFRLM1BsYXkKVGhvbWFzIE5pZWRlcnJlaXRlciA8dG5AdGFyYW50ZWwucnouZmgtbXVlbmNoZW4uZGU+OiBSSUZGIGhlYWRlciBmaXgKU3RlZmFuIEd5YmFzIDxjYWJAc3R1ZGJveC51bmktc3R1dHRnYXJ0LmRlPjogbTY4ayBwYXRjaCAKR3JhbnQgRXJpY2tzb24gPGVyaWMwMTM5QHRjLnVtbi5lZHU+OiBMaW51eCBQUEMgcGF0Y2gKUGV0ZXIgQmVyZ2VyIDxwZXRlcmJAaG9vcG9lLnBzYy5lZHU+OiBCU0RpIHBhdGNoIApIZW5yaWsgUCBKb2huc29uIDxraW5nQG9uZS5zZT46IEhUVFAgYXV0aApTdGV2ZW4gVGlnZXIgTGFuZyA8dGlnZXJAdHlnZXIub3JnPjogYWR2YW5jZWQgc2h1ZmZsZQoiQnJpYW4gSi4gU3dldGxhbmQiIDxzd2V0bGFuZEB1aXVjLmVkdT46IGZyb250LWVuZCAocmVtb3RlKSBwYXRjaAo8bGVvQHp5Y2FkLmNvbT4KVGlsbG1hbm4gU3RlaW5icmVjaGVyIDx0c3RAZ214LmRlPjogc2h1ZmZsZSBwYXRjaApNLlN0ZWtlbGVuYnVyZyA8bS5zdGVrZWxlbmJ1cmdAc3R1ZGVudC51dHdlbnRlLm5sPjogaTM4Ni1nZXRiaXRzCkFudHRpIEFuZHJlaW1hbm4gPGFudHRpeEBjeWJlcml4LmVkdS5lZT46IG91dGJ1cnN0IHBhdGNoCkh1ciBUYWVTdW5nIDxzYXR1cm5AYXJhcmkuc251LmFjLmtyPjogJ2h0dHAgYWNjZXB0JyBwYXRjaCAKCihmcm9tIHBvc3QtMC41OSBjaGFuZ2VzIHRoYXQgeWV0IGhhdmUgdG8gZ28gaW50byBuZXcgdHJ1bms6KQoKSGFucyBTY2h3ZW5nZWxlciA8c2Nod2VuZ0Bhc3Ryby51bmliYXMuY2g+OiBhdWRpb19kZWMgYWRkaXRpb25zCldvamNpZWNoIEJhcmHxc2tpJ3MgTXAzUGxheSAoY2hlY2sgdGhlIHRvb2xzIGZvbGRlcik6IE1wM1BsYXkgZnJvbnRlbmQKRGFuaWVsIEtvdWtvbGE6IGF1ZGlvX29zcy5jIHBhdGNoCk11bmVjaGlrYSBTVU1JS0FXQSA8c3VtaWthd2FAZWJpbmEuaGl0YWNoaS5jby5qcD46IElQdjYKVEVNTk9UQSA8dGVtbm90YUBrbXYucnU+OiBIVFRQLEZUUCBwYXRjaC9wbGF5bGlzdCBmaXgKUGV0ZXIgU3VyZGEgPHNodXJkZWVrQHBhbm9yYW1hLnN0aC5hYy5hdD46IFZCUiBwYXRjaApCZW4gPGJlbkBibGF1a29wZi5jb20+OiBBUk0gc3RhcnR1cCB0aW1lIGltcHJvdmVtZW50cyAKRGF2ZSBNYWNLZW56aWUgPGRqbUBwaXgubmV0PjogaW5pdF9vdXRwdXQoKSBwYXRjaApwYXNreSdzIDxwYXNreUBqdS5jej46IGNsb3NlLW9uLXN0b3AgcGF0Y2gK