ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKRGFuaWVsICgyNiBNYXkgMjAwNCkKLSBNb2h1biBCaXN3YXMgYWRkZWQgcmVsZWFzZS16bGliIGFuZCBkZWJ1Zy16bGliIHRhcmdldHMgdG8gdGhlIE1TVkMgbGliY3VybAogIE1ha2VmaWxlCgotIERhdmlkIEJ5cm9uIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIHByb3h5IGF1dGhlbnRpY2F0aW9uIHdoZW4gZG9pbmcgQ09OTkVDVCwKICBsaWtlIHdoZW4gYWNjZXNzaW5nIEhUVFBTIHNpdGVzIHdpaHQgYSBwcm94eS4gVGhpcyBwcm9iYWJseSBicm9rZSB3aGVuIEkKICByZXdyb3RlIHRoZSBhdXRoIHN0dWZmIHJlY2VudGx5LgoKLSBJIGFkZGVkIGZpbGV1cGxvYWQuYyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LCBzaG93aW5nIGhvdyBhbiB1cGxvYWQgdG8gYQogIGZpbGU6Ly8gVVJMIGlzIG1hZGUuCgpEYW5pZWwgKDI1IE1heSAyMDA0KQotIE1hc3NpbWlsaWFubyBaaWNjYXJkaSB1cGRhdGVkIHRoZSBNU1ZDIG1ha2VmaWxlcy4KCkRhbmllbCAoMjQgTWF5IDIwMDQpCi0gbGliY3VybCBub3cgc3VwcG9ydHMgInVwbG9hZGluZyIgdG8gZmlsZTovLyBVUkxzLiBUZXN0IDIwNCBhbmQgMjA1IHdlcmUKICBhZGRlZCB0byB2ZXJpZnkuCgotIFNpbW9uIEpvc2Vmc3NvbiBhZGRlZCBhIGlkbl9mcmVlKCkgZnVuY3Rpb24gaW4gbGliaWRuIDAuNC41IGFzIGEgcmVhY3Rpb24gdG8KICBHaXNsZSdzIHByZXZpb3VzIG1haWwuIFdlIG5vdyB1c2UgdGhpcyBmdW5jdGlvbiwgYW5kIHRodXMgd2UgcmVxdWlyZSBsaWJpZG4KICAwLjQuNSBvciBsYXRlci4gTm8gZWFybGllciB2ZXJzaW9uIHdpbGwgZG8uCgotIFJvYmVydCBELiBZb3VuZyByZXBvcnRlZCB0aGF0IENVUkxPUFRfQ09PS0lFRklMRSBhbmQgQ1VSTE9QVF9DT09LSUUgY291bGQKICBub3QgYmUgdXNlZCBib3RoIGluIG9uZSByZXF1ZXN0LiBGaXhlZCBpdCBhbmQgYWRkZWQgdGVzdCBjYXNlIDE3MiB0byB2ZXJpZnkuCgpEYW5pZWwgKDIxIE1heSAyMDA0KQotIFdoaWxlIHRhbGtpbmcgdG8gaG9zdCBhLmIuYywgbGliY3VybCBkaWQgd3JvbmdseSBub3QgYWNjZXB0IGNvb2tpZXMgdGhhdAogIHdlcmUgc2V0IHRvIHRoZSBkb21haW4gLmEuYi5jICh0aGF0IGlzIHdpdGggYSBkb3QgcHJlZml4KS4gVGhpcyBpcyBub3cgZml4ZWQKICBhbmQgdGVzdCBjYXNlIDE3MSB2ZXJpZmllcyBpdC4KCkRhbmllbCAoMjAgTWF5IDIwMDQpCi0gSmVzc2UgTm9sbGVyIHJlcG9ydGVkIHRoYXQgdGhlIHVwbG9hZCBzcGVlZCBpbmZvIHJlcG9ydGVkIGJ5IGxpYmN1cmwgd2FzCiAgd3JvbmcuIFRoZSBzYW1lIHdhcyB0cnVlIGZvciB0aGUgZG93bmxvYWQgc3BlZWQuIEZpeGVkIG5vdy4KCkRhbmllbCAoMTkgTWF5IDIwMDQpCi0gRGF2aWQgQnlyb24gYWRkZWQgdGVzdCBjYXNlIDE3MCAtIHRoaXMgdXNlZCB0byBjcmFzaCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZiAKICBjdXJsLgoKRGFuaWVsICgxNyBNYXkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIncyBwYXRjaCB0aGF0IGFkZHJlc3NlcyB0d28gZmxhd3MgaW4gdGhlIHBlZXIgY2VydGlmaWNhdGUKICBuYW1lIHZlcmlmaWNhdGlvbjoKICBvIHdoZW4gbXVsdGlwbGUgY29tbW9uIG5hbWVzIGFyZSB1c2VkIChhcyBpbiB0aGUgY3VybCB0ZXN0cyksIHRoZSBsYXN0IG5hbWUKICAgIG5lZWRzIHRvIGJlIHNlbGVjdGVkLgogIG8gYWxsb3cgY29tcGFyaW5nIHdpdGggZW5jb2RlZCB2YWx1ZXMsIGF0IGxlYXN0IHdpdGggQk1QIGFuZCBJU08gbGF0aW4xCiAgICBlbmNvZGVkIFQ2MXN0cmluZ3MuCgotIEFsbCAxOTEgdGVzdCBjYXNlcyBydW4gdGhyb3VnaCB0aGUgdG9ydHVyZSB0ZXN0IE9LISAnbWFrZSB0ZXN0LXRvcnR1cmUnIGlzCiAgbm93IGF2YWlsYWJsZSBpbiB0aGUgcm9vdCBtYWtlZmlsZSAob24gY29uZmlndXJlLWJhc2VkIGVudmlyb25tZW50cykuCgpEYW5pZWwgKDE0IE1heSAyMDA0KQotIFdpdGggYSBzbGlnaHRseSBtb2RpZmllZCBmdHBzZXJ2ZXIucGwgSSd2ZSBub3cgcnVuIGFsbW9zdCBhbGwgdGVzdHMgdGhyb3VnaAogIHdpdGggcnVudGVzdHMucGwgLXQuIFRoaXMgaXMgZ29vZG5lc3MhCgotIFNpbmNlIEkgaGF2ZSBiZWVuIHVuYWJsZSB0byBjb250YWN0IHRoZSBDVlMgYWRtaW5zIGZvciBzZXZlcmFsIG1vbnRocywgSSd2ZQogIGRlY2lkZWQgdGhhdCB0aGUgY3VycmVudCBDVlMgaG9zdGluZyB3YXMgbm90IGdvb2QgZW5vdWdoLiBJJ3ZlIG5vdyBtb3ZlZCB0aGUKICBDVlMgcmVwbyBvbmNlIGFnYWluLCBzZWUgUkVBRE1FIGZvciB1cGRhdGVkIGN2cyBjaGVja291dCBpbnN0cnVjdGlvbnMuCgpEYW5pZWwgKDEzIE1heSAyMDA0KQotIHJ1bnRlc3RzLnBsIC10IG5vdyBydW5zIGZpbmUgYWxsIHRoZSB3YXkgdG8gdGVzdCAxMDAuIEkgYmVsaWV2ZSB0ZXN0IGNhc2UKICAxMDAgZmFpbHMgYmVjYXVzZSBvZiBhbiBGVFAgc2VydmVyIHByb2JsZW0uCgpEYW5pZWwgKDEyIE1heSAyMDA0KQotIEdlbmVyYWwgY2xlYW51cHMgYWxsIG92ZXIgdG8gbWFrZSBsaWJjdXJsIHN1cnZpdmUgYW5kIGRvIHdlbGwgd2hlbiBhIG1lbW9yeQogIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4gcnVudGVzdHMucGwgLXQgbm93IHdvcmtzIGZpbmUgZm9yIHRoZSBmaXJzdCAyNiB0ZXN0CiAgY2FzZXMuCgpEYW5pZWwgKDExIE1heSAyMDA0KQotIFNlc2h1YmFidSBQYXNhbSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBjdXJsX2dsb2JhbF9pbml0X21lbSgpIC0KICBsaWtlIG5vcm1hbCBjdXJsX2dsb2JhbF9pbml0KCkgYnV0IGFsbG93cyB0aGUgYXBwIHRvIHJlcGxhY2UgYWxsIG1lbW9yeQogIGZ1bmN0aW9ucyB3aXRoIGl0cyBvd24gc2V0LiBJIG1vZGlmaWVkIGl0IHNsaWdodGx5LgoKLSBCYXNlZCBvbiBMdWNhIEFsdGVhcycgY29tbWVudHMsIEkgbW9kaWZpZWQgdGhlIGN1cmxsaWIuZHNwIGdlbmVyYXRpb24gY29kZS4KCkRhbmllbCAoMTAgTWF5IDIwMDQpCi0gR2lzbGUgbWFpbGVkIFNpbW9uIEpvc2Vmc3NvbiAob2YgbGliaWRuIGZhbWUpIGFib3V0IHRoZSBiZW5lZml0cyBvZiBhCiAgc2VwYXJhdGUgZnJlZSgpLWZ1bmN0aW9uIGJ5IHRoYXQgbGliIHRvIG1ha2Ugc3VyZSB0aGUgbWVtb3J5IGlzIGZyZWVkIGJ5IHRoZQogIHNhbWUgbWVtb3J5IHN1YnN5c3RlbSB0aGF0IGFsbG9jYXRlZCBpdC4gSGUgcmVzcG9uZGVkIHBvc2l0aXZlbHkgYW5kIHRoaXMKICB3aWxsIGxpa2VseSBjYXVzZSB1cyB0byByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiBsaWJpZG4gYXMgc29vbiBhcyBTaW1vbgogIHJlbGVhc2VzIG9uZSB3aXRoIHN1Y2ggYSBsaWJpZG5fZnJlZSgpIGZ1bmN0aW9uLgoKLSBKYW1lcyBCdXJzYSBtYWRlIHJ1bnRlc3RzLnBsJ3MgLXQgb3B0aW9uIHdvcmsgZm9yIGFueSBnaXZlbiB0ZXN0IGNhc2UsIGFuZCBJCiAgZWRpdGVkIHRvIGFsbG93IC1nIHRvby4gTm90IGV2ZW4gdGVzdCBjYXNlIDEgd29ya2VkLi4uCgotIEx1Y2EgQWx0ZWEgbWFkZSB0aGUgbmM9IGZpZWxkIG5vdCB1c2UgcXVvdGVzIGluIG91dGdvaW5nIEhUVFAgRGlnZXN0IGhlYWRlcnMuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBwcm9ibGVtIGluIHRoZSB0ZXN0IHNjcmlwdCB0aGF0IG1hZGUgaXQgZmFpbCB0bwogIHJlY29nbml6ZSBvdXIgb3duIHJ1bm5pbmcgSFRUUCBzZXJ2ZXIuCgpEYW5pZWwgKDcgTWF5IDIwMDQpCi0gSmFtZXMgQnVyc2EgZml4ZWQgdGhlIG1lbWFuYWx5emUucGwgc2NyaXB0IHRvIGNvbmRlciBtYWxsb2MoMCkgYXJlYXMgT0sgdG8KICBmcmVlKCkgYW5kIGhlIG1hZGUgdHdvIGZhaWxlZC1yZXNvbHZlIGVycm9yIG1lc3NhZ2VzIHVzZSB0aGUgbmV3IGRpc3BsYXktCiAgbmFtZSBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbGx5LXVzZWQgbmFtZS4KCi0gR2lzbGUgVmFuZW0gdHJpZWQgY3VybCB3aXRoCiAgd3d3LmV0ZG9tZW5lbmF2bmthbm1ha3NpbWFsdGlubmVob2xkZXNla3N0aXRyZWJva3N0YXZlcnNsaWtzb21kZXR0ZS5jb20KICB3aGljaCBjYXVzZWQgcHJvYmxlbXMsIGFuZCBJIGZpeGVkIHRoZSBzaW5nbGUgemVybyBieXRlIGJ1ZmZlciBvdmVyd3JpdGUKICB0aGF0IG9jY3VycmVkIChkdWUgdG8gYSBzdHVwaWQgcHJvdG9jb2wgYnVmZmVyIHNpemUgYW5kIHBhcnNlcikuCgotIE1hZGUgdGhlIGxpYi9jdXJsbGliLmRzcCBmaWxlIGdldCBnZW5lcmF0ZWQgYXV0b21hdGljbHkgd2hlbiBhIGRpc3RyaWJ1dGlvbgogIHBhY2thZ2UgaXMgbWFkZSwgd2l0aCB0aGUgbXN2Y3Byb2ouKiBmaWxlcyBhcyB0ZW1wbGF0ZXMgYW5kIGFsbAogIHdpbjMyLXNvdXJjZXMgYWRkZWQuIEkgdGhpbmsgdGhpcyBjYW4gYmUgbWFkZSB0byB3b3JrIGJldHRlciB0aGFuIHRoZSBhbHdheXMKICBsYWdnaW5nLWJlaGluZCBwcmV2aW91cyBhcHByb2FjaC4gSSdtIG5vdCBzdXJlIHRoaXMgYnVpbGRzIGEgd29ya2luZyBwcm9qZWN0CiAgZmlsZSByaWdodCBub3cgdGhvdWdoIQoKRGFuaWVsICg2IE1heSAyMDA0KQotIE1pY2hhZWwgQmVuZWRpY3QgYnJvdWdodCBhIGZpeCB0aGF0IGZpbGxzIGluIHRoZSBlcnJvcmJ1ZmZlciBwcm9wZXJseSB3aGVuCiAgYXJlcyBmYWlscyB0byByZXNvbHZlIGEgbmFtZSBmb3IgYSBjYXNlIG5vdCBwcmV2aW91c2x5IGRlYWx0IHdpdGggbGlrZSB0aGlzLgoKRGFuaWVsICg1IE1heSAyMDA0KQotIEpvZSBIYWxwaW4gZml4ZWQgdGhlIGFubm95aW5nIHR5cGVjYXN0IHdhcm5pbmcgaW4gbGliL2xkYXAuYwoKLSBHaXNsZSBWYW5lbSBmaXhlczoKICBvIG1lbWRlYnVnIHRvIG5vdCBhY2Nlc3MgTlVMTCBvbiBzZXZlcmFsIHBsYWNlcwogIG8gbGliY3VybC5kZWY7IGN1cmxfZm9ybXBhcnNlIGlzIGdvbmUuCiAgbyBwcm9ncmVzcy5jOyBmaXhlZCB0aGUgcGVyY2VudCB2YWx1ZXMgYmVpbmcgdHJ1bmNlZCB0byAwLgogIG8gaWYyaXAuKjsgY29uc3RpZmllZCB0aGUgJ2ludGVyZmFjZScgYXJndW1lbnQuCgotIFRvciBBcm50c2VuIHJlcG9ydGVkIHRoYXQgbWFueSBvZiBoaXMgYXV0b2J1aWxkcyBmcm96ZSBhbmQgSSBmb3VuZCBhbmQgZml4ZWQKICBhIHByb2JsZW0gaW50cm9kdWNlZCB3aXRoIHRoZSBIVFRQIGF1dGggb3ZlcmhhdWwgdGhhdCBjb3VsZCBsZWFkIHRvIGEKICBuZXZlci1lbmRpbmcgaW50ZXJuYWwgcmVxdWVzdC1sb29wIGR1ZSB0byB1bi1pbml0aWFsaXplZCB2YXJpYWJsZXMhCgotIFJlbW92ZWQgc2V2ZXJhbCBjb21waWxlciB3YXJuaW5ncyBvbiB2YXJpb3VzIGNvbXBpbGVycy9wbGF0Zm9ybXMuCgpEYW5pZWwgKDQgTWF5IDIwMDQpCi0gY3VybF9mb3JtcGFyc2UoKSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpYnJhcnkuIEl0IGhhcyBiZWVuIG1hcmtlZCBhbmQKICBtZW50aW9uZWQgYXMgZGVwcmVjYXRlZCBmb3Igc2V2ZXJhbCB5ZWFycy4KCkRhbmllbCAoMyBNYXkgMjAwNCkKLSBSZXdyaXR0ZW4gSFRUUCBhdXRoZW50aWNhdGlvbiBjb2RlLiBUaGUgcHJldmlvdXMgY29kZSBjb3VsZCBub3QgcHJvcGVybHkKICBkZWFsIHdpdGggdGhlIGFkZGVkIHRlc3QgY2FzZXMgMTY3LCAxNjggYW5kIDE2OS4gSSd2ZSBub3cgcmV3cml0dGVuIHRoZSBjb2RlCiAgdG8gYmV0dGVyIHNlcGFyYXRlIGhvc3QgYW5kIHByb3h5IGF1dGhlbnRpY2F0aW9uIGFuZCBub3QgcmUtdXNlIHRoZSBzYW1lCiAgdmFyaWFibGVzIGFzIG11Y2ggYXMgYmVmb3JlIGFzIGl0IHByb3ZlZCBub24gd29ya2luZyBpbiB0aGUgbW9yZSBpbnZvbHZlZAogIGNhc2VzLiBBbGwgdGhlIGN1cnJlbnQgdGVzdHMgcnVuIE9LIG5vdywgYW5kIHNvIGRvIHRoZSBuZXcgb25lcy4gVGhlIGN1cmwKICB0b29sIGdvdCBhIG5ldyBvcHRpb24gbmFtZWQgLS1wcm94eS1kaWdlc3QgdG8gZW5hYmxlIEhUVFAgRGlnZXN0CiAgYXV0aGVudGljYXRpb24gd2l0aCB0aGUgcHJveHkuIEkgYWxzbyBtYWRlIHRoZSBsaWJyYXJ5IHN1cHBvcnQgaXQuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIExEQVAgY29kZSB3b3JrIHdpdGggd2xkYXAzMi5kbGwgYXMgc3VwcGxpZWQgd2l0aAogIFdpbi05OC9NRS8yMDAwL1hQLCBzbyBubyBleHRyYSAuZGxscyBhcmUgcmVxdWlyZWQgd2hlbiBjdXJsL2xpYmN1cmwgaXMgdXNlZAogIG9uIHRoZXNlIFdpbmRvd3MgdmVyc2lvbnMuCgpEYW5pZWwgKDMwIEFwcmlsIDIwMDQpCi0gcnVudGVzdHMucGwgbm93IHNjYW5zIHRoZSB2YWxncmluZCBsb2cgZm9yIHZhbGdyaW5kLWRldGVjdGVkIG1lbW9yeSBsZWFrcwogIGFmdGVyIGVhY2ggdGVzdCBjYXNlIGlmIHZhbGdyaW5kIHdhcyBmb3VuZCBhbmQgdXNlZC4KCi0gSSBtb2RpZmllZCB0aGUgYXBwLWNvZGUgaW4gY3VybCB0byBpbmNsdWRlIHRoZSBuZXcgbGliL2N1cmx4LmggYW5kIG9ubHkKICBhY2Nlc3MgdGhvc2UgZnVuY3Rpb25zIHVzaW5nIHRoZSBjdXJseF8tcHJlZml4IGluIHByZXBhcmF0aW9uIGZvciB0aGUgZnV0dXJlCiAgcmVtb3ZhbCBvZiBzZXZlcmFsIGN1cmxfLWZ1bmN0aW9ucyBmcm9tIHRoZSBwdWJsaWMgbGliY3VybCBBUEkuCgotIEludHJvZHVjZWQgbGliL2N1cmx4LmggYXMgYSBzaW5nbGUgaGVhZGVyIHRvIHByb3ZpZGUgdGhlIGN1cmx4Xy1mdW5jdGlvbnMKICB0byBhcHBzLgoKLSBBZGRlZCBub3RpY2VzIGluIHRoZSBtYW4gcGFnZXMgZm9yIGN1cmxfZ2V0ZW52LCBjdXJsX21wcmludGYsIGN1cmxfc3RyZXF1YWwKICBhbmQgY3VybF9zdHJuZXF1YWwgdGhhdCB0aGV5IGFyZSBzdWJqZWN0IGZvciByZW1vdmFsIGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgU1RPUCBVU0lORyBUSEVTRSBGVU5DVElPTlMuCgotIE1paGFpIElvbmVzY3Ugbm90aWNlZCBoZSBjb3VsZG4ndCBkbyBmb3JtcG9zdHMgd2l0aCB3aGl0ZXNwYWNlIGluIHRoZSBmaWxlCiAgbmFtZXMgYW5kIHllcywgSSBicm9rZSB0aGF0IG9uIEFwcmlsIDIzLiBTaWdoLiBJIGZpeGVkIGl0IG5vdyBhbmQgYWRkZWQKICB0ZXN0IGNhc2UgMTY2IHRvIHZlcmlmeSBpdC4KCi0gTHVjYSBBbHRlYSBwb2ludGVkIG91dCBhIG1pc3Rha2UgbGVmdCBmcm9tIHRoZSBEaWdlc3QgcGF0Y2ggb2YgeWVzdGVyZGF5LgoKRGFuaWVsICgyOSBBcHJpbCAyMDA0KQotIE1hZGUgSUROIGRvbWFpbnMgd29yayB3aGVuIHNlbmRpbmcgcmVxdXN0cyBvdmVyIEhUVFAgcHJveHkgYXMgd2VsbC4gQWRkZWQKICB0ZXN0IGNhc2UgMTY1IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gRml4ZWQgYSBidWcgaW4gdGhlIG5ldyBpbnRlcm5hbCBob3N0IG5hbWUgc2V0dXAgd2hlbiByZS11c2luZyBjb25uZWN0aW9ucy4KCi0gSmFtZXMgQnVyc2EgZm91bmQgb3V0IHRoYXQgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHdpdGggYXJlcy1idWlsdCBsaWJjdXJsCiAgY3JlYXRlZCBhIGJhZCBoYW5kbGUgdGhhdCB3b3VsZCBjcmFzaCBpbiB0aGUgZmlyc3QgbmFtZSByZXNvbHZlIGF0dGVtcHQuIFRoaXMKICBpcyBub3cgZml4ZWQgYW5kIHRlc3QgY2FzZSA1MTIgd2FzIGFkZGVkIHRvIHZlcmlmeSBpdC4KCi0gTHVjYSBBbHRlYSBwcm92aWRlZCBhIG1ham9yIEhUVFAgRGlnZXN0IGNvZGUgZml4IGFuZCBjbGVhbnVwLiBXZSBub3cgZm9sbG93CiAgdGhlIERpZ2VzdCBSRkMgYSBsb3QgYmV0dGVyLgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBTU0wgY29kZSB1c2UgRVJSX2Vycm9yX3N0cmluZ19uKCkgd2hlcmUgYXBwbGljYWJsZS4KCkRhbmllbCAoMjcgQXByaWwgMjAwNCkKLSBJIHJlbW9kZWxlZCBHaXNsZSdzIElETiBjb2RlIHNsaWdodGx5IGFuZCBub3cgd2UgY29udmVydCBib3RoIHRoZSBob3N0IG5hbWUKICBhbmQgcHJveHkgbmFtZSB0byB0aGUgQUNFIGVuY29kZWQgdmVyc2lvbiB0byB1c2UgaW50ZXJuYWxseSBmb3IgcmVzb2x2ZXMgYW5kCiAgY29va2llcyBldGMuIFRoZXkgYXJlIG5vdyB1c2luZyBvbmUgJ3N0cnVjdCBob3N0bmFtZScgZWFjaCB0aGF0IGtlZXAgYm90aAogIHRoZSBvcmlnaW5hbCBuYW1lIGFuZCB0aGUgcG9zc2libHkgZW5jb2RlZCBuYW1lLiBJRE4gcmVzb2x2ZXMgd29yayBmb3IgbWUKICBub3cgdXNpbmcgaXB2NiwgaXB2NCBhbmQgYXJlcyByZXNvbHZpbmcuIEV2ZW4gY29va2llcyBvbiBJRE4gc2l0ZXMgc2VlbSB0bwogIGRvIHJpZ2h0LiBJIGdvdCBzb21lIGZhaWx1cmVzIGF0IGZpcnN0IHdoZW4gQ0hBUlNFVCB3YXNuJ3Qgc2V0IGF0IGFsbCB3aGljaAogIGNvbmZ1c2VkIGxpYmlkbiBjb21wbGV0ZWx5IGFuZCBpdCBkZWNpZGVkIGJ5IGVuY29kaW5nIG9mIGNob2ljZSB3YXMKICAnQU5TSV9YMy40LTE5NjgnLi4uCgotIG1hZGUgJ2NvbmZpZ3VyZSAtLXdpdGhvdXQtbGliaWRuJyB3b3JrCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDQpCi0gRml4ZWQgdGhlIHNyYy9odWdlaGVscC5jIGZpbGUgdG8gaW5jbHVkZSAic2V0dXAuaCIgaW5zdGVhZCBvZiAiY29uZmlnLmgiIHRvCiAgbWFrZSB0aGUgcHJvYmxlbXMgd2l0aCBVU0VfTUFOVUFMIG9uIHdpbmRvd3MgZ28gYXdheS4KCi0gY29uZmlndXJlIC0td2l0aG91dC1zc2wgY291bGQgc3RpbGwgd3JvbmdseSBpbmNsdWRlIHNvbWUgT3BlblNTTCBpbmZvIGluIHRoZQogIE1ha2VmaWxlcyBpZiBwa2ctY29uZmlnIGhhZCBpbmZvIGFib3V0IE9wZW5TU0wuIEJ1ZyAjOTQxNzYyIHJlcG9ydGVkIGJ5CiAgTWFydGluLgoKLSBTaW5jZSB3ZSBjYW4gbm93IGJ1aWxkIGFuZCB1c2UgcXVpdGUgYSBsYXJnZSBzZXQgb2YgM3JkIHBhcnR5IGxpYnJhcmllcywgSQogIGRlY2lkZWQgSSB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBwcm9kdWNlIGEgc3VtbWFyeSBhdCB0aGUgZW5kIHNob3dpbmcgd2hhdAogIGxpYnJhcmllcyBpdCB1c2VzIGFuZCBpZiBub3QsIHdoYXQgb3B0aW9uIHRvIHVzZSB0byBtYWtlIGl0IHVzZSB0aGF0LiBJIGFsc28KICBhZGRlZCBzb21lIG90aGVyIHJhbmRvbSBpbmZvIHRoYXQgaXMgbmljZSBpbiBhICJjb25maWd1cmUgc3VtbWFyeSIgb3V0cHV0LgoKLSBBcHBsaWVkIFRvbW15VGFtJ3MgcGF0Y2ggdGhhdCBub3cgbWFrZSBjdXJsIHdvcmsgd2l0aCB0ZWxuZXQgYW5kIHN0ZGluCiAgcHJvcGVybHkgb24gV2luZG93cy4KCi0gVGhlIGNoYW5nZXMgZm9yIHRvZGF5IGJlbG93IHdlcmUgbWFkZSBieSBtZSBhbmQgR2lzbGUgVmFuZW0uCgogIFRoZSBmaWxlIHByZXZpb3VzbHkga25vd24gYXMgaG9zdGlwLmMgaGFzIG5vdyB1bmRlcmdvbmUgYSBodWdlIGNsZWFudXAgYW5kCiAgc3BsaXQ6CgogIGhvc3RpcC5jIGV4cGxhaW5lZAogID09PT09PT09PT09PT09PT09PQoKICBUaGUgbWFpbiBDT01QSUxFLVRJTUUgREVGSU5FUyB0byBrZWVwIGluIG1pbmQgd2hlbiByZWFkaW5nIHRoZSBob3N0Ki5jCiAgc291cmNlIGZpbGUgYXJlIHRoZXNlOgoKICBDVVJMUkVTX0lQVjYgLSB0aGlzIGhvc3QgaGFzIGdldGFkZHJpbmZvKCkgYW5kIGZhbWlseSwgYW5kIHRodXMgd2UgdXNlCiAgdGhhdC4gVGhlIGhvc3QgbWF5IG5vdCBiZSBhYmxlIHRvIHJlc29sdmUgSVB2NiwgYnV0IHdlIGRvbid0IHJlYWxseSBoYXZlIHRvCiAgdGFrZSB0aGF0IGludG8gYWNjb3VudC4gSG9zdHMgdGhhdCBhcmVuJ3QgSVB2Ni1lbmFibGVkIGhhdmUgQ1VSTFJFU19JUFY0CiAgZGVmaW5lZC4KCiAgQ1VSTFJFU19BUkVTIC0gaXMgZGVmaW5lZCBpZiBsaWJjdXJsIGlzIGJ1aWx0IHRvIHVzZSBjLWFyZXMgZm9yIGFzeW5jaHJvbm91cwogIG5hbWUgcmVzb2x2ZXMuIEl0IGNhbm5vdCBoYXZlIEVOQUJMRV9JUFY2IGRlZmluZWQgYXQgdGhlIHNhbWUgdGltZSwgYXMKICBjLWFyZXMgaGFzIG5vIGlwdjYgc3VwcG9ydC4gVGhpcyBjYW4gYmUgV2luZG93cyBvciAqbml4LgoKICBDVVJMUkVTX1RIUkVBREVEIC0gaXMgZGVmaW5lZCBpZiBsaWJjdXJsIGlzIGJ1aWx0IHRvIHJ1biB1bmRlciAobmF0aXZlKQogIFdpbmRvd3MsIGFuZCB0aGVuIHRoZSBuYW1lIHJlc29sdmUgd2lsbCBiZSBkb25lIGluIGEgbmV3IHRocmVhZCwgYW5kIHRoZQogIHN1cHBvcnRlZCBhc3luY2ggQVBJIHdpbGwgYmUgdGhlIHNhbWUgYXMgZm9yIGFyZXMtYnVpbGRzLgoKICBJZiBhbnkgb2YgdGhlIHR3byBwcmV2aW91cyBhcmUgZGVmaW5lZCwgQ1VSTFJFU19BU1lOQ0ggaXMgZGVmaW5lZCB0b28uIElmCiAgbGliY3VybCBpcyBub3QgYnVpbHQgdG8gdXNlIGFuIGFzeW5jaHJvbm91cyByZXNvbHZlciwgQ1VSTFJFU19TWU5DSCBpcwogIGRlZmluZWQuCgogIFRoZSBob3N0Ki5jIHNvdXJjZXMgZmlsZXMgYXJlIHNwbGl0IHVwIGxpa2UgdGhpczoKCiAgaG9zdGlwLmMgICAtIG1ldGhvZC1pbmRlcGVuZGVudCByZXNvbHZlciBmdW5jdGlvbnMgYW5kIHV0aWxpdHkgZnVuY3Rpb25zCiAgaG9zdGFzeW4uYyAtIGZ1bmN0aW9ucyBmb3IgYXN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXMKICBob3N0c3luLmMgIC0gZnVuY3Rpb25zIGZvciBzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVzCiAgaG9zdGFyZXMuYyAtIGZ1bmN0aW9ucyBmb3IgYXJlcy11c2luZyBuYW1lIHJlc29sdmVzCiAgaG9zdHRocmUuYyAtIGZ1bmN0aW9ucyBmb3IgdGhyZWFkZWQgbmFtZSByZXNvbHZlcwogIGhvc3RpcDQuYyAgLSBpcHY0LXNwZWNpZmljIGZ1bmN0aW9ucwogIGhvc3RpcDYuYyAgLSBpcHY2LXNwZWNpZmljIGZ1bmN0aW9ucwoKICBUaGUgaG9zdGlwLmggaXMgdGhlIHNpbmdsZSB1bml0ZWQgaGVhZGVyIGZpbGUgZm9yIGFsbCB0aGlzLiBJdCBkZWZpbmVzIHRoZQogIENVUkxSRVNfKiBkZWZpbmVzIGJhc2VkIG9uIHRoZSBjb25maWcqLmggYW5kIHNldHVwLmggZGVmaW5lcy4KCi0gQWRkZWQgZnVuY3Rpb24gaGVhZGVyIGNvbW1lbnRzIHRvIG1hbnkgZnVuY3Rpb25zIGluIGFuIGF0dGVtcHQgdG8gYmV0dGVyCiAgZXhwbGFpbiB0aGUgcHVycG9zZSBvZiB0aGVtIGFsbC4KCi0gY29uZmlndXJlIC0td2l0aC1saWJpZG4gaXMgbm93IHN1cHBvcnRlZC4gSXQgbWFrZXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICBjaGVjayBmb3IgbGliaWRuIGxpYnMgYW5kIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHByZWZpeCBwYXRoIGdpdmVuLiBJZiB5b3UKICBzYXkgLS13aXRoLWxpYmlkbj0vdXNyL2xvY2FsLCBpdCB3aWxsIGNoZWNrIGZvciB0aGUgbGliIGluIC91c3IvbG9jYWwvbGliCiAgYW5kIHRoZSBpbmNsdWRlcyBpbiAvdXNyL2xvY2FsL2luY2x1ZGUgZXRjLgoKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGEgc3RydWN0IGFnZWQgQ1VSTFZFUlNJT05fVEhJUkQgaW5jbHVkaW5nCiAgbGliaWRuIHZlcnNpb24gaW5mby4gVGhlIHN0cmluZyBjdXJsX3ZlcnNpb24oKSByZXR1cm5zIGFsc28gaW5jbHVkZXMgbGliaWRuCiAgdmVyc2lvbiBpbmZvLCBpZiBhdmFpbGFibGUuCgpWZXJzaW9uIDcuMTEuMiAoMjYgQXByaWwgMjAwNCkKCkRhbmllbCAoMjUgQXByaWwgMjAwNCkKLSBFcndpbiBBdXRocmllZCBwb2ludGVkIG91dCB0aGF0IGNvbmZpZ3VyZSAtLWRpc2FibGUtbWFudWFsIGRpZG4ndCBkbyByaWdodAogIGlmIHlvdSBhbHJlYWR5IGhhZCBhIHNyYy9odWdlaGVscC5jIHNvdXJjZSBmaWxlIHByZXNlbnQgKHdoaWNoIG1vc3QgcGVvcGxlCiAgZG8gSSBndWVzcykuIEl0IG5vdyB1c2VzIHRoZSBVU0VfTUFOVUFMIGRlZmluZSBwcm9wZXJseS4KCkRhbmllbCAoMjMgQXByaWwgMjAwNCkKLSBHaXNsZSBWYW5lbSBmb3VuZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayB3aGVuIGRvaW5nIChmYWlsaW5nKSBXaW5kb3dzCiAgdGhyZWFkZWQgbmFtZSByZXNvbHZlcy4KCi0gSSBhbHNvIGFkZGVkIHRlc3QgY2FzZSAxNjMganVzdCB0byBtYWtlIHN1cmUgLUYgInZhcj08ZmlsZSIgd29ya3MgZmluZSBhbmQKICBjYW4gcGFzcyBvbiBjaGFyYWN0ZXJzIHN1Y2ggYXMgbmV3bGluZXMsIGNhcnJpYWdlLXJldHVybiBhbmQgdGFicy4KCi0gV2hlbiB3ZSBhZGRlZCB0ZXN0IGNhc2UgMTYyIHdpdGhvdXQgYWRkaW5nIHRoZSBuZWNlc3NhcnkgcmVxdWlyZW1lbnQgZmllbGQKICBpbiB0aGUgdGVzdCBtZXRhIGRhdGEgd2UgY291bGQgc2VlIHRoYXQgY3VybCBkaWRuJ3QgY29tcGxhaW4gaWYgeW91IHVzZWQKICAtLXByb3h5LW50bG0gZXZlbiBpZiB0aGUgdW5kZXJseWluZyBsaWJjdXJsIGl0IHVzZXMgaGFzIG5vIE5UTE0gc3VwcG9ydCEgSQogIG5vdyBtYWRlIGl0IGNoZWNrIHRoaXMgZmlyc3QsIGFuZCBpdCBub3cgZXhpc3RzIHdpdGggYSAidGhlIGluc3RhbGxlZAogIGxpYmN1cmwgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgdGhpcyIgbWVzc2FnZSBpZiBpdCBoYXBwZW5zIGFnYWluLgoKRGFuaWVsICgyMiBBcHJpbCAyMDA0KQotIERhdmlkIEJ5cm9uIGZvdW5kIGFuZCBmaXhlZCBhIHNtYWxsIGJ1ZyB3aXRoIHRoZSAtLWZhaWwgYW5kIGF1dGhlbnRpY2F0aW9uCiAgc3R1ZmYgYWRkZWQgYSBmZXcgd2Vla3MgYWdvLiAgVHVybnMgb3V0IHRoYXQgaWYgeW91IHNwZWNpZnkgLS1wcm94eS1udGxtIGFuZAogIGNvbW11bmljYXRlIHdpdGggYSBwcm94eSB0aGF0IHJlcXVpcmVzIGJhc2ljIGF1dGhlbnRpY2F0aW9uLCB0aGUgcHJveHkKICBwcm9wZXJseSByZXR1cm5zIGEgNDA3LCBidXQgdGhlIGZhaWx1cmUgZGV0ZWN0aW9uIGNvZGUgZG9lc24ndCByZWFsaXplIGl0CiAgc2hvdWxkIGdpdmUgdXAsIHNvIGN1cmwgcmV0dXJucyB3aXRoIGV4aXQgY29kZSAwLiBUZXN0IGNhc2UgMTYyIGFkZGVkIHRvCiAgdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBhbGxvdyBuZXdsaW5lcyBpbiB0aGUgY29udGVudHMgd2hlbiBkb2luZyAtRiAidmFyPVtjb250ZW50c10iCiAgUm9iZXJ0IE1hcmxvdyByZXBvcnRlZC4KCi0gSWYgYSB0cmFuc2ZlciBpcyBmb3VuZCBvdXQgdG8gYmUgb25seSBwYXJ0aWFsLCBsaWJjdXJsIHdpbGwgbm93IHRyZWF0IHRoYXQKICBhcyBhIHByb2JsZW0gc2VyaW91cyBlbm91Z2ggdG8gc2tpcCB0aGUgZmluYWwgUVVJVCBjb21tYW5kIGJlZm9yZSBjbG9zaW5nCiAgdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gVG8gYXZvaWQgdGhlIHJpc2sgdGhhdCBpdCB3aWxsICJoYW5nIiB3YWl0aW5nIGZvcgogIHRoZSBRVUlUIHJlc3BvbnNlLiBBZGRlZCB0ZXN0IGNhc2UgMTYxIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgyMSBBcHJpbCAyMDA0KQotIE1vZGlmaWVkIHRoZSBoZXVyaXN0aWNzIGZvciBkZWFsaW5nIHdpdGggdGhlIHRlc3QgMTYwIHNjZW5hcmlvLiBXaGVuIGEKICBjb25uZWN0aW9uIGlzIHJlLXVzZWQgYW5kIG5vdGhpbmcgYXQgYWxsIGlzIHJlY2VpdmVkIGZyb20gaXQgKGJlY2F1c2UgdGhlCiAgc2VydmVyIGNsb3NlcyB0aGUgY29ubmVjdGlvbiksIHdlIHdpbGwgbm93IHJldHJ5IHRoZSByZXF1ZXN0IG9uIGEgZnJlc2ggbmV3CiAgY29ubmVjdGlvbi4gVGhlIHByZXZpb3VzIEVDT05OUkVTRVQgc3R1ZmYgZnJvbSBKYW51YXJ5IDMwIHdhcyByZW1vdmVkIGFnYWluCiAgYXMgaXQgZGlkbid0IGRldGVjdCB0aGUgc2l0dWF0aW9uIGdvb2QgZW5vdWdoLgoKRGFuaWVsICgyMCBBcHJpbCAyMDA0KQotIEFkZGVkIHRlc3QgY2FzZSAxNjAgdG8gdmVyaWZ5IHRoYXQgY3VybCB3b3JrcyBjb3JyZWN0bHkgd2hlbiBpdCBnZXRzIGEKICBjb25uZWN0aW9uIHJlc2V0IHdoZW4gdHJ5aW5nIHRvIHJlLXVzZSBhIGNvbm5lY3Rpb24uIEl0IHNob3VsZCB0aGVuIHNpbXBseQogIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGFuZCByZXNlbmQgdGhlIHJlcXVlc3QuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDQpCi0gTm8gbW9yZSA1MTIgYnl0ZSBsaW1pdCBmb3IgaG9zdCBuYW1lIChpbmNsdXNpbmcgbmFtZSArIHBhc3N3b3JkKSBpbiBsaWJjdXJsLgogIEFuIGFkZGVkIGJvbnVzIGlzIHRoYXQgd2UgdXNlIGxlc3MgbWVtb3J5IGZvciB0aGUgdHlwaWNhbCAoc2hvcnRlciBVUkwpCiAgY2FzZS4KCi0gQ2xlYW5lZCB1cCB0aGUgc291cmNlcyB0byBiZXR0ZXIgdXNlIHRoZSB0ZXJtcyAnaG9zdG5hbWUnIGFuZCAncGF0aCcKICBpbnRlcm5hbGx5IHdoZW4gcmVmZXJyaW5nIHRvIHRoYXQgZGF0YS4gVGhlIGJ1ZmZlcnMgdXNlZCBmb3Iga2VlcCB0aGF0IGluZm8KICBpcyBjYWxsZWQgJ25hbWVidWZmZXInIGFuZCAncGF0aGJ1ZmZlcicuIE11Y2ggZWFzaWVyIHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQKICB0aGFuIHRoZSBwcmV2aW91cyBtZXNzLgoKRGFuaWVsICgxNSBBcHJpbCAyMDA0KQotIE1vZGlmaWVkIHJ1bnRlc3RzLnBsIGFnYWluIHRvIHJlbW92ZSBhbGwgbG9nIGZpbGVzIGluIHRoZSBsb2cvIGRpciBiZXR3ZWVuCiAgZWFjaCB0ZXN0LCBhbmQgdGhlbiBtYWRlIC1wIGRpc3BsYXkgYWxsIG5vbi16ZXJvIGJ5dGUgZmlsZXMgaW4gdGhlIGxvZyBkaXIuCiAgSXQgc2hvdWxkIG1ha2UgdGhhdCBkYXRhIG1vcmUgdXNhYmxlIGFuZCBjb250YWluIGxlc3MgcnViYmlzaC4KCi0gZnRwc2VydmVyLnBsIG5vdyBwcm9kdWNlcyBsb2cgZmlsZXMgbW9yZSBzaW1pbGFyIHRvIGhvdyB0aGUgc3dzIG9uZXMgbG9vawogIGFuZCB0aGV5IG5vdyBhbHNvIGNvbnRhaW5zIGEgYml0IG1vcmUgZGV0YWlscyB0byBoZWxwIGRlYnVnZ2luZyBmdHAKICBwcm9ibGVtcy4KCi0gUmVtb3ZlZCB0aGUgZml4ZWQgbWF4aW11bSBhbW91bnQgb2YgZGlyIGxldmVscyB0aGUgRlRQIGNvZGUgc3VwcG9ydGVkLgogIFByZXZpb3VzbHkgd2UgaGFkIGEgZml4ZWQgYXJyYXkgZm9yIDEwMCBsZXZlbHMsIG5vdyB3ZSBzYXZlIHNwYWNlIGluIGVhY2gKICBoYW5kbGUgYnkgYWxsb2NhdGluZyBvbmx5IGZvciBhIGZldyBsZXZlbCBieSBkZWZhdWx0IGFuZCB0aGVuIGVubGFyZ2luZyB0aGF0CiAgaW4gY2FzZSBvZiBuZWVkICh3aXRoIG5vIG1heGltdW0gZGVwdGgpLiBBZGp1c3RlZCB0ZXN0IGNhc2UgMTQyIHRvIHZlcmlmeQogIHRoYXQgMTUwIGRpciBsZXZlbHMgd29yayBmaW5lLiAgQW4gYWRkZWQgYm9udXMgaXMgdGhhdCB3ZSB1c2UgbGVzcyBtZW1vcnkKICBmb3IgdGhlIHR5cGljYWwgKG5vdCB2ZXJ5IGRlZXApIGNhc2UuCgpEYW5pZWwgKDE0IEFwcmlsIDIwMDQpCi0gQXNraW5nIGZvciBDVVJMX0lQUkVTT0xWRV9WNiB3aGVuIGlwdjYgYWRkcmVzc2VzIGNhbid0IGJlIHJlc29sdmVkIHdpbGwKICBub3cgY2F1c2UgdGhlIHJlc29sdmUgZnVuY3Rpb24gdG8gcmV0dXJuIE5VTEwgaW1tZWRpYXRlbHkuIFRoaXMgZmxhdyB3YXMKICBwb2ludGVkIG91dCBieSBHaXNsZSBWYW5lbS4KCi0gR2lzbGUgVmFuZW0gbWFkZSBjdXJsIC00Ly02IGFjdHVhbGx5IHNldCB0aGUgZGVzaXJlZCBvcHRpb24gdG8gbGliY3VybC4KCi0gcnVudGVzdHMucGwgbm93IGhhcyBhIG5ldyBvcHRpb24gKC1wKSB0aGF0IHdpbGwgZGlzcGxheSAiaW50ZXJlc3RpbmciIGxvZwogIGZpbGVzIHRvIHN0ZG91dCBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLiBUaGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBiZQogIHVzZWQgaW4gdGhlICdmdWxsLXRlc3QnIG1ha2UgdGFyZ2V0IHRoYXQgaXMgdXNlZCBieSB0aGUgYXV0b2J1aWxkIHRlc3RzLCBhcwogIHdlIHRoZW4gZ2V0IGEgbXVjaCBiZXR0ZXIgY2hhbmNlIHRvIHVuZGVyc3RhbmQgKHJlbW90ZSkgdGVzdCBmYWlsdXJlcyBiYXNlZAogIG9uIGF1dG9idWlsZCBsb2dzIGFsb25lLgoKRGFuaWVsICgxMyBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIG11bHRpIGludGVyZmFjZSB3b3JrIGFnYWluIG9uIFdpbmRvd3MgZXZlbiB3aGVuIGJ1aWx0CiAgd2l0aG91dCBhcmVzLiBCZWZvcmUgdGhpcywgc2VsZWN0KCkgd291bGQgcmV0dXJuIC0xIGR1cmluZyB0aGUgbmFtZSByZXNvbHZlCiAgcGhhc2Ugc2luY2UgY3VybF9tdWx0aV9mZHNldCgpIGRpZG4ndCByZXR1cm4gYW55IGZkX3NldCBhdCBhbGwgd2hpY2ggd2Fzbid0CiAgYXBwcmVjaWF0ZWQhCgotIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSBub3cgZHVwbGljYXRlcyB0aGUgdGNwX25vZGVsYXkgaW5mbyBhcyB3ZWxsLgoKRGFuaWVsICgxMSBBcHJpbCAyMDA0KQotIEFwcGxpZWQgRGF2aWQgQnlyb24ncyBwYXRjaCBmb3IgdGhlIE1TVkMgbGliY3VybCBtYWtlZmlsZSBmb3IgYnVpbGRzIHdpdGgKICB6bGliLgoKRGFuaWVsICg5IEFwcmlsIDIwMDQpCi0gRGlyayBNYW5za2UgaW1wcm92ZWQgdGhlIHRpbWVyIHJlc29sdXRpb24gZm9yIENVUkxJTkZPXypfVElNRSwgaXQgY2FuIG5vdwogIGJlIGRvd24gdG8gdXNlYyBpZiB0aGUgc3lzdGVtIHN5cHBvcnRzIGl0LgoKRGFuaWVsICg3IEFwcmlsIDIwMDQpCi0gQSByZXF1ZXN0IHRoYXQgc2VuZHMgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBhbmQgZ2V0cyBub3RoaW5nIGJ1dCBhIHNpbmdsZQogIDEwMCByZXNwb25zZSBiYWNrIHdpbGwgbm93IHJldHVybiBhIENVUkxFX0dPVF9OT1RISU5HLiBUZXN0IDE1OCB2ZXJpZmllcy4KCi0gVGhlIHN0cnRvb2ZmdCgpIG1hY3JvIGlzIG5vdyBuYW1lZCBjdXJseF9zdHJ0b29mZnQoKSB0byB1c2UgdGhlIGN1cmx4XyoKICBhcHByb2FjaCBmdWxseS4KCkRhbmllbCAoNiBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgZml4ZWQgYnVnICM5Mjc5NzkgcmVwb3J0ZWQgYnkgTmF0aGFuIE8nU3VsbGl2YW4uIFRoZSBwcm9ibGVtCiAgbWFkZSBsaWJjdXJsIG9uIFdpbmRvd3MgbGVhayBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkgaW4gZWFjaCBuYW1lIHJlc29sdmUKICB3aGVuIG5vdCB1c2VkIGFzIGEgRExMLgoKLSBOZXcgYXV0aGVudGljYXRpb24gY29kZSBhZGRlZCwgcGFydGljdWxhcmx5IG5vdGljYWJsZSB3aGVuIGRvaW5nIFBPU1Qgb3IgUFVUCiAgd2l0aCBEaWdlc3Qgb3IgTlRMTS4gbGliY3VybCB3aWxsIG5vdyB1c2UgSEVBRCB0byBuZWdvdGlhdGUgdGhlCiAgYXV0aGVudGljYXRpb24gYW5kIHdoZW4gZG9uZSBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgUE9TVC4gUHJldmlvdXNseSBsaWJjdXJsCiAgc2VudCBQT1NUIGltbWVkaWF0ZWx5IGFuZCBleHBlY3RlZCB0aGUgc2VydmVyIHRvIHJlcGx5IGEgZmluYWwgc3RhdHVzIGNvZGUKICB3aXRoIGFuIGVycm9yIGFuZCB0aGVuIGxpYmN1cmwgd291bGQgbm90IHNlbmQgdGhlIHJlcXVlc3QtYm9keSBidXQgaW5zdGVhZAogIHNlbmQgdGhlbiBuZXh0IHJlcXVlc3QgaW4gdGhlIHNlcXVlbmNlLgoKICBUaGUgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyBkdWUgdG8gSUlTNiBiYXJmaW5nIG9uIGxpYmN1cmwgd2hlbiB3ZSBhdHRlbXB0CiAgdG8gUE9TVCB3aXRoIE5UTE0gYXV0aGVudGljYXRpb24uIFRoZSByZWFzb24gZm9yIHRoZSBwcm9ibGVtcyBpcyBmb3VuZCBpbgogIFJGQzI2MTYgc2VjdGlvbiA4LjIuMyByZWdhcmRpbmcgaG93IHNlcnZlcnMgc2hvdWxkIGRlYWwgd2l0aCB0aGUgMTAwCiAgY29udGludWUgcmVxdWVzdC1oZWFkZXI6CgogICAgICAgIElmIGl0IHJlc3BvbmRzIHdpdGggYSBmaW5hbCBzdGF0dXMgY29kZSwgaXQgTUFZIGNsb3NlIHRoZSB0cmFuc3BvcnQKICAgICAgICBjb25uZWN0aW9uIG9yIGl0IE1BWSBjb250aW51ZSB0byByZWFkIGFuZCBkaXNjYXJkIHRoZSByZXN0IG9mIHRoZQogICAgICAgIHJlcXVlc3QuCgogIFByZXZpb3VzIHZlcnNpb25zIG9mIElJUyBjbGVhcmx5IGRpZCBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbiB0aGlzIGNhc2UsCiAgd2hpbGUgdGhpcyBuZXdlciB2ZXJzaW9uIGRlY2lkZWQgaXQgc2hvdWxkICJyZWFkIGFuZCBkaXNjYXJkIi4gVGhhdCB3b3VsZCd2ZQogIGZvcmNlZCB1cyB0byBzZW5kIHRoZSB3aG9sZSBQT1NUIChvciBQVVQpIGRhdGEgb25seSB0byBoYXZlIGl0IGRpc2NhcmRlZCBhbmQKICB0aGVuIGJlIGZvcmNlZCB0byBzZW5kIGl0IGFnYWluLiBUbyBhdm9pZCB0aGF0IGh1Z2UgcGVuYWxpdHksIHdlIHN3aXRjaCB0bwogIHVzaW5nIEhFQUQgdW50aWwgd2UgYXJlIGF1dGhlbnRpY2F0ZWQgYW5kIHRoZW4gc2VuZCB0aGUgUE9TVC4KCiAgVGhlIG9ubHkgYWN0dWFsIGRyYXdiYWNrIEkgY2FuIHRoaW5rIG9mIChleGNlcHQgZm9yIHRoZSBvZGQgc2l0ZXMgdGhhdCBtaWdodAogIHRyZWF0IEhFQUQgZGlmZmVyZW50bHkgdGhhbiB0aGV5IHdvdWxkIHRyZWF0IFBPU1QvUFVUIHdoZW4gZ2l2ZW4gdGhlIHNhbWUKICBVUkwpIGlzIHRoYXQgaWYgeW91IGRvIFBPU1Qgd2l0aCBDVVJMQVVUSF9BTlkgc2V0IGFuZCB0aGUgc2l0ZSByZXF1aXJlcyBOTwogIGF1dGhlbnRpY2F0aW9uLCBsaWJjdXJsIHdpbGwgc3RpbGwgdXNlIGEgSEVBRCBpbiBhIGZpcnN0IHJvdW5kIGFuZCB0aGVuIGRvIGEKICBQT1NULgoKICBJZiB5b3UgZG8gYSBIRUFEIG9yIGEgR0VUIG9uIGEgc2l0ZSB1c2luZyBDVVJMQVVUSF9BTlksIGxpYmN1cmwgd2lsbCBzZW5kCiAgYW4gdW4tYXV0aGVudGljYXRlZCByZXF1ZXN0IGF0IG9uY2UsIHdoaWNoIHRoZW4gaXMgdGhlIG9ubHkgcmVxdWVzdCBpZiB0aGUKICBzaXRlIHJlcXVpcmVzIG5vIGF1dGguCgogIEFsYW4gUGluc3RlaW4gaGVscGVkIG1lIHdvcmsgb3V0IHRoZSBwcm90b2NvbCBkZXRhaWxzIGJ5IGZpZ3VyaW5nIG91dCB3aHkKICBsaWJjdXJsIGZhaWxlZCBhbmQgd2hhdCBJSVM2IGV4cGVjdHMuCgotIFRoZSAtLWxpbWl0LXJhdGUgbG9naWMgd2FzIGNvcnJlY3RlZCBhbmQgbm93IGl0IHdvcmtzIGEgbG90IGJldHRlciBmb3IKICBoaWdoZXIgc3BlZWRzLCBzdWNoIGFzICcxMG0nIG9yIHNpbWlsYXIuIFJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzkzMDI0OS4KCi0gSW50cm9kdWNpbmcgY3VybHhfdHZub3coKSBhbmQgY3VybHhfdHZkaWZmKCkgdXNpbmcgdGhlIG5ldyBjdXJseF8qIGZhc2hpb24uCiAgI2luY2x1ZGUgInRpbWV2YWwuaCIgZnJvbSB0aGUgbGliIGRpciB0byBnZXQgdGhlIHByb3RvcyBldGMuICBOb3RlIHRoYXQKICB0aGVzZSBhcmUgTk9UIHBhcnQgb2YgdGhlIGxpYmN1cmwgQVBJLiBUaGUgY3VybCBhcHAgc2ltcGx5IHVzZXMgdGhlIHNhbWUKICBzb3VyY2UgZmlsZXMgYXMgdGhlIGxpYnJhcnkgZG9lcyBhbmQgdGhlcmVmb3JlIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGNvbXBpbGVkCiAgYW5kIGxpbmtlZCB3aXRoIGN1cmwgdG9vLCBub3QganVzdCB3aGVuIGNyZWF0aW5nIGxpYmN1cmwuCgotIGxpYi9zdHJlcnJvci5jIG5vIGxvbmdlciB1c2VzIHN5c19uZXJyIG9uIG5vbi13aW5kb3dzIHBsYXRmb3JtcyBzaW5jZSBpdAogIGlzbid0IHBvcnRhYmxlIGVub3VnaAoKRGFuaWVsICgyIEFwcmlsIDIwMDQpCi0gSW4gdGhlIGN1cmxfc3RybnF1YWwuMyBtYW4gcGFnZSwgd2Ugbm93IHByZXBlbmQgdGhlIG1hbjMgZGlyIHRvIHRoZSBmaWxlCiAgbmFtZSB0byB3b3JrIGJldHRlci4gQXMgcG9pbnRlZCBvdXQgYnkgUm9iaW4gS2F5LgoKLSBBbmRy6XMgR2FyY+1hIHVwZGF0ZWQgdGhlIG1pbmd3IG1ha2VmaWxlcy4KCi0gRGlyayBNYW5za2UgZml4ZWQgYSBwcm9ibGVtIEkgcmVjZW50bHkgYWRkZWQgaW4gdGhlIHByb2dyZXNzIG1ldGVyIGNvZGUgdGhhdAogIGJyb2tlIHN1YnNlY29uZCByZXNvbHV0aW9uIGZvciBDVVJMSU5GT19UT1RBTF9USU1FLiBIZSBhbHNvIHBvaW50ZWQgb3V0IGEKICBtaXN0YWtlIGluIHRoZSBjb2RlIHRoYXQgcHJvZHVjZXMgdGhlIGZpbmFsIHVwZGF0ZSBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIKICB0aGF0IHdvdWxkIG9mdGVuIHByZXZlbnQgaXQgZnJvbSBhY3R1YWxseSBiZWluZyB1cGRhdGVkIHRoYXQgZmluYWwgdGltZS4KCkRhbmllbCAoMSBBcHJpbCAyMDA0KQotIERpcmsgTWFuc2tlIGZpeGVkIGEgbWVtb3J5IGxlYWsgdGhhdCBoYXBwZW5lZCB3aGVuIHdlIHVzZSBhcmVzIGZvciBuYW1lCiAgcmVzb2x2ZXMgYW5kIGRlY2lkZXMgdG8gdGltZS1vdXQgYmVmb3JlIGFyZXMgZG9lcyBpdC4gVGhpcyBmaXggdXNlcyB0aGUKICBicmFuZCBuZXcgYXJlc19jYW5jZWwoKSBmdW5jdGlvbiB3aGljaCBpcyBub3QgcHJlc2VudCBpbiBjLWFyZXMgMS4xLjAuCgogIFdoZW4gdG9sZCB0byBlbmFibGUgYXJlcywgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGNoZWNrcyBmb3IgcHJlc2VuY2Ugb2YKICB0aGUgYXJlc19jYW5jZWwgZnVuY3Rpb24gdG8gYWxlcnQgdXNlcnMgaWYgdGhleSBhdHRlbXB0IHRvIHVzZSBhIHRvbyBvbGQKICBjLWFyZXMgbGlicmFyeS4KCkRhbmllbCAoMzEgTWFyY2ggMjAwNCkKLSBSb3kgU2hhbiBmaXhlZCBhIGZsYXcgdGhhdCBwcmV2ZW50ZWQgYXJlcyBuYW1lIHJlc29sdmUgdGltZW91dHMgdG8gb2NjdXIhCgotIERpcmsgTWFuc2tlIGZvdW5kIG91dCB0aGF0IGxpYmN1cmwgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc29sdmVzIGZhciB0b28KICBlYXN5IHdoZW4gbGliY3VybCB3YXMgYnVpbHQgdG8gdXNlIChjLSlhcmVzIGZvciBuYW1lIHJlc29sdmluZy4KCi0gRnVydGhlciBEaWdlc3QgZml4aW5nIGFuZCBhIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlIDE1MyBub3cgbWFrZXMgbWUgYmVsaWV2ZQogIE1pdHogV2FyaydzIHByb2JsZW1zIGFyZSBmaXhlZC4KCi0gQW5kcmVzIEdhcmNpYSBmaWd1cmVkIG91dCB0aGF0IHRlc3QgY2FzZSA2Mywgd2hpbGUgd29ya2luZywgb25seSBwcm92ZWQgYQogIGZsYXcgaW4gbGliY3VybCdzICdodHRwX3Byb3h5JyBwYXJzZXIgd2hlbiBhIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgaXMKICBwcm92aWRlZC4gVGhlIHVzZXIgbmFtZSB3YXMgbm90IGV4dHJhY3RlZCBwcm9wZXJseSAoYW5kICdodHRwJyB3YXMgYWx3YXlzCiAgdXNlZCBhcyB1c2VyIG5hbWUpLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIG91ciBpb2N0bHNvY2tldCgpIHVzYWdlLgoKRGFuaWVsICgzMCBNYXJjaCAyMDA0KQotIEpvZSBIYWxwaW4gZmFjZWQgcHJvYmxlbXMgd2l0aCB0aGUgZ2V0bmFtZWluZm8oKSBhcmd1bWVudCBhaV9mbGFncyBhbmQgdGhlCiAgcGFydGljdWxhciBiaXQgbmFtZWQgJ05JX1dJVEhTQ09QRUlEJyBvbiBTb2xhcmlzIDkgZm9yIEludGVsLiAgSSd2ZSBub3cKICB3cml0dGVuIGEgY29uZmlndXJlIHRlc3QgdGhhdCBjaGVja3MgZm9yIGEgd29ya2luZyBOSV9XSVRIU0NPUEVJRAogIGltcGxlbWVuYXRpb24uIE5vIGNvZGUgdXNlcyB0aGUgcmVzdWx0IGZyb20gdGhpcyB0ZXN0IHlldCwgaXQgaXMgc3RpbGwKICBleHBlcmltZW50YWwuIEphbWVzIENhcmxzb24gd3JvdGUgaW4gY29tcC51bml4LnNvbGFyaXM6ICJJdCdzIGEgYnVnCiAgKDUwMDY2MjMpIC0tIGl0J3Mgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkbid0IGJlIGluIHRoZSBoZWFkZXIgZmlsZS4iCgotIEkgcHJvdmlkZWQgTWl0eiBXYXJrIHdpdGggYSBmaXJzdCBwYXRjaCBpbiBvcmRlciB0byBmaXggbGliY3VybCdzIHByb2JsZW1zCiAgdG8gcmUtbmVnb3RpYXRlIERpZ2VzdCBhdXRoZW50aWNhdGlvbiAod2hlbiAnc3RhbGU9dHJ1ZScgaXMgaW5jbHVkZWQgaW4gdGhlCiAgcmVzcG9uc2UgaGVhZGVyKS4KCi0gUm95IFNoYW4gZGlzY292ZXJlZCB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2UgZGlkbid0IHByb3Blcmx5IHRpbWVvdXQgbmFtZQogIGxvb2t1cHMgd2hpY2ggY291bGQgbWFrZSBoYW5kbGVzIGdldCBzdHVjayBpbiB0aGF0IHN0YXRlIGFuZCB0aHVzIG5ldmVyIGdldAogIGNvbXBsZXRlZC4gSSd2ZSBwcm9kdWNlZCBhIGZpcnN0IHRlc3QgcGF0Y2ggdGhhdCBhdHRlbXB0cyB0byBjb3JyZWN0IHRoaXMuCgotIERhdmlkIEJ5cm9uJ3MgcGF0Y2ggd2FzIGFwcHBsaWVkIHRvIG1ha2UgQ1VSTE9QVF9GQUlMT05FUlJPUiB3b3JrIG5pY2VseQogIGV2ZW4gd2l0aCBhdXRoZW50Y2F0aW9ucyBzdWNoIGFzIE5UTE0gb3IgRGlnZXN0IGVuYWJsZWQuIFRlc3QgY2FzZXMgMTUwLCAxNTEKICBhbmQgMTUyIHdlcmUgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKRGFuaWVsICgyOSBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtIHVwZGF0ZWQgZmlsZXMgZm9yIHRoZSBkamdwcC9NUy1ET1MgYnVpbGQuCgotIEFuZHLpcyBHYXJj7WEgaGVscGVkIG1lIHdvcmsgb3V0IGEgZml4IGZvciB0aGUgcnVudGVzdHMucGwgc2NyaXB0IHRvIG1ha2UKICB0aGUgZmlsZTovLyB0ZXN0cyBydW4gZmluZSB3aGVuIHRlc3RlZCB3aXRoIHRoZSBtaW5ndy1idWlsdCB2ZXJzaW9uIG9mIGN1cmwuCgotIEZpeGVkIGFuIGluY2x1ZGUgaXNzdWUgd2l0aCBuZXRpbmV0L3RjcC5oIG9uIEFJWCwgYmFzZWQgb24gaW5wdXQgYnkgVG9yLgogIFRoaXMgYWxzbyByZXF1aXJlZCBhIG1pbm9yIGZpeCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCi0gVGhlIHBvc3RpdDIuYyBzb3VyY2UgZXhhbXBsZSB1c2VkIHRoZSB3cm9uZyBzdHJ1Y3QgbmFtZSBmb3IgdGhlIHBvc3QgZGF0YS4KCkRhbmllbCAoMjYgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSBpbXByb3ZlZCBpcHY2IHN1cHBvcnQgb24gd2luZG93cyBieSBtYWtpbmcgdGhlIGN1cmwgYnVpbGQgdG8gdXNlCiAgdGhlIGNvcnJlY3QgZ2V0YWRkcmluZm8oKSBmdW5jdGlvbi4KCkRhbmllbCAoMjUgTWFyY2ggMjAwNCkKLSBJdCB0dXJuZWQgb3V0IHRoYXQgQUlYLCBkZXNwaXRlIGhhdmluZyBhICJ0aHJlYWQtc2FmZSBsaWJjIiwgZG9lc24ndCBvZmZlcgogIGFsbCB0cmFkaXRpb25hbCBmdW5jdGlvbnMgdGhyZWFkLXNhZmUuIFRoaXMgVVJMIGlzIGluZm9ybWF0aXZlIG9uIHRoaXMKICBzdWJqZWN0OgoKICAgIGh0dHA6Ly9wdWJsaWJuLmJvdWxkZXIuaWJtLmNvbS9kb2NfbGluay9lbl9VUy9hX2RvY19saWIvYWl4cHJnZ2QvIFwKICAgIGdlbnByb2djL3RocmVhZF9xdWlja19yZWYuaHRtCgogIEFzIGEgcmVzdWx0IG9mIHRoaXMsIHdlIG5vdyBjaGVjayBmb3IgdGhyZWUgKl9yKCkgZnVuY3Rpb25zIG9uIHJlY2VudCBBSVgKICB2ZXJzaW9ucyBhcyB3ZWxsIHRoYXQgdGhlIFVSTCBtZW50aW9ucyBhcmVuJ3QgdGhyZWFkLXNhZmUgaW4gQUlYIDUuMS4KCi0gcmVuYW1lZCBjdXJsX3N0cmVycm9yLltjaF0gdG8gc3RyZXJyb3IuW2NoXQoKLSBKb2UgSGFscGluIGFkZGVkIENVUkxPUFRfVENQX05PREVMQVkgYW5kIC0tdGNwLW5vZGVsYXkgdG8gbWFrZSBpdCBwb3NzaWJsZQogIGZvciB1c2VycyB0byBkaXNhYmxlIHRoZSBOYWdsZSBhbGdvcnRoaW0tdXNhZ2UuCgotIFRvciBBcm50c2VuIHByb3ZpZGVkIHNvbWUgaW50ZXJlc3Rpbmcgc3RyZXJyb3JfcigpIGtub3dsZWRnZS4gZ2xpYmMgaGFzIGl0cwogIG93biBBUEkgd2hpY2ggZGlmZmVycyBmcm9tIHRoZSBQT1NJWCBvbmUuIERhbmllbCBhZGp1c3RlZCB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHRvIGRldGVjdCB0aGUgdmVyc2lvbiBpbiB1c2UsIGFuZCB0aGUgY29kZSBub3cgdXNlcyB0aGUgbmV3IGRlZmluZXMKICBhY2NvcmRpbmdseS4KCi0gRml4ZWQgc29tZSBidWlsZCBmbGF3cyB3aXRoIHRoZSBuZXcgbGliL2N1cmxfc3RyZXJyb3IuYyBzb3VyY2UgZmlsZS4KCkRhbmllbCAoMjQgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSdzIGZpeCB0byByZXBsYWNlIHRoZSBiYWQgdXNlIG9mIHN0cmVycm9yKCkuIFRoaXMgaW50cm9kdWNlcwogIEN1cmxfc3RyZXJyb3IoKSB0aGF0IGF0dGVtcHRzIHRvIGJlIHRocmVhZC1zYWZlIF9hbmRfIHdvcmtzIG9uIFdpbmRvd3MgdG9vIQoKLSBUb3IgQXJudHNlbiBzcGVsbC1maXhlZCBsb3RzIG9mIGxpYmN1cmwgbWFuIHBhZ2VzLgoKLSBUb3IgQXJudHNlbiBtYWRlIHRlc3RjdXJsLnBsIHdvcmsgd2l0aCBvbGRlciBwZXJsIDUgdmVyc2lvbnMsIGFuZCBEYW5pZWwKICBtYWRlIGl0IG5vdCB1c2UgY2hkaXIgLi4gdG8gZ28gYmFjaywgYXMgdGhhdCBpc24ndCB2ZXJ5IGdvb2Qgd2hlbiB5b3UndmUKICBzZXR1cCBhIHRlc3RkaXIgY29udGFpbmluZyBzeW1saW5rcy4KCi0gQWRkZWQgYSBjaGVjayBmb3Igc3RyZXJyb3JfcigpIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKRGFuaWVsICgyMyBNYXJjaCAyMDA0KQotIEFkZGVkIEdyZWcgSGV3Z2lsbCdzIHRlc3RjdXJsLnBsIHNjcmlwdCB0byBDVlMuIFdlIGhhdmUgbm90IG1vdmVkIG92ZXIgdG8KICB1c2UgdGhpcyBzY3JpcHQgZm9yIHRoZSByZWFsIGRpc3RyaWJ1dGVkIHRlc3RpbmcganVzdCB5ZXQsIGJ1dCBpdCBpcyBvbmx5CiAgYSBtYXR0ZXIgb2YgdGltZS4KCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgY29kZSB0aGF0IG1ha2VzIGN1cmwgcmVwb3J0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UKICBpZiAtLWludGVyZmFjZSBmYWlscyBvbiB3aW5kb3dzLgoKLSBUaGUgcmVndWxhciBwcm9ncmVzcyBtZXRlciBpcyBub3cgZml4ZWQgdG8gbmV2ZXIgd3JhcCBkdWUgdG8gbG9uZyBsaW5lcy4gQWxsCiAgZmllbGRzIGFyZSBub3cgc3RhdGljIHNpemVkLiBJZiB0aGUgdGltZSBpbiB0aGUgdGltZSBmaWVsZHMgZ2V0IGEgdGltZSB2YWx1ZQogIHRoYXQgd291bGQgcmVwcmVzZW50IGEgdGltZSB0aGF0IGlzIDEwMCBob3VycyBvciBtb3JlIChpZiBub3QsIGl0IHJlbWFpbnMKICB1c2luZyBhIEhIOk1NOlNTIGRpc3BsYXkpLCBpdCBzd2l0Y2hlcyBmaXJzdCB0byBhICJOTk5kIE5OaCIgZGlzcGxheSAoZm9yCiAgZGF5cyBhbmQgaG91cnMpIGFuZCBpZiB0aGF0IGlzbid0IGVub3VnaCBpdCBzd2l0Y2hlcyB0byBhICJOTk5kIiBkaXNwbGF5IGlmCiAgaXQgaXMgbW9yZSB0aGFuIDk5OSBkYXlzLgoKICBTZXZlcmFsIG9mIHRoZSBjYWxjdWxhdGlvbnMgd2VyZSBhbHNvIG1vdmVkIHRvIGZpeGVkLXBvaW50IG1hdGggaW5zdGVhZCBvZgogIHVzaW5nIGRvdWJsZXMuCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDQpCi0gR2xlbiBOYWthbXVyYSBub3RpY2VkIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGRpZG4ndCB3b3JrIGFzIGl0CiAgdXNlZCB0byBkbyBpZiBDVVJMT1BUX05PQk9EWSBpcyBzZXQgVFJVRS4KCi0gS2V2aW4gUm90aCBwYXRjaGVkIHRoZSBjeWd3aW4gcGFja2FnZSBtYWtlZmlsZSBhbmQgUkVBRE1FIHRvIGFkanVzdCB0bwogIG5ldyBjeWd3aW4gcGFja2FnaW5nIGd1aWRlbGluZXMuCgotIEVuYWJsZWQgIk5UIHJlc3BvbnNlcyIgaW4gdGhlIE5UTE0gYXV0aGVudGljYXRpb24uIERvaW5nIHRoaXMgc2ltcGx5IG1lYW5zCiAgdGhhdCB3ZSBwcm92aWRlIGFuIGV4dHJhIGNodW5rIG9mIGRhdGEgaW4gZWFjaCAidHlwZS0zIG1lc3NhZ2UiLiBUaGUgb25seQogIHJlYXNvbiBmb3IgZG9pbmcgdGhpcyBpcyB0aGF0IGl0IHNlZW1zIHRoYXQgdXNpbmcgb25seSB0aGUgIkxhbm1hbmFnZXIgaGFzaCIKICAoYXMgd2UndmUgYmVlbiBkb2luZyB1bnRpbCBub3cpIGRvZXNuJ3Qgc3VwcG9ydCBwYXNzd29yZHMgbG9uZ2VyIHRoYW4gMTQKICBjaGFyYWN0ZXJzIGFuZCBpdCB0dXJucyBvdXQgdGhlcmUgYXJlIHVzZXJzIG91dCB0aGVyZSB3aG8gd2FudCB0byB1c2UKICBsaWJjdXJsIGFuZCBOVExNIHdpdGggc3VjaCBwYXNzd29yZHMhIDstKSBTZXZlbiBOVExNLXJlbGF0ZWQgdGVzdCBjYXNlcyB3ZXJlCiAgdXBkYXRlZCBhY2NvcmRpbmdseS4gTWVudGlvbmVkIGFzIGlzc3VlIDI5IGluIFRPRE8tUkVMRUFTRSwgYnVnIHJlcG9ydAogICM5MTU2MDkKCi0gTW92ZWQgdGhlIGdlbmVyYXRlZCBsaWJjdXJsIHZlcnNpb24gaW5mbyB0byBhIG5ldyBoZWFkZXIgZmlsZSwgbmFtZWQKICBjdXJsL2N1cmx2ZXIuaC4gTm93IGludGVyZXN0ZWQgcGFydGllcyBjYW4gaW5jbHVkZSBPTkxZIHZlcnNpb24gaW5mbywgc2hvdWxkCiAgYW55b25lIHdhbnQgdGhhdCAoYW5kIGl0IHNlZW1zIGF0IGxlYXN0IHNvbWUgd2luZG93cyByZXNvdXJjZSBmaWxlcyB3b3VsZCkuCiAgTWVudGlvbmVkIGFzIGlzc3VlIDI3IGluIFRPRE8tUkVMRUFTRS4KCkRhbmllbCAoMjEgTWFyY2ggMjAwNCkKLSBGaXhlZCB0aGUgcm9vdCBNYWtlZmlsZSB0byB1c2UgdGFicyBmb3IgdGhlIG5ldHdhcmUgdGFyZ2V0LiBH/G50ZXIgS25hdWYKICBwb2ludGVkIHRoaXMgb3V0LgoKLSBNYXJ0eSBLdWhydCdzIFZNUyBjbGVhbnVwCgotIFRob21hcyBTY2h3aW5nZSBtYWRlIGJ1aWxkY29uZiByZWNvZ25pemUgQUNMT0NBTF9GTEFHUyB0byBpbnZva2UgYWNsb2NhbAogIHdpdGggcGFydGljdWxhciBwcmUtZGV0ZXJtaW5lZCBvcHRpb25zLgoKVmVyc2lvbiA3LjExLjEgKDE5IE1hcmNoIDIwMDQpCgpEYW5pZWwgKDE4IE1hcmNoIDIwMDQpCi0gVG9yIEFybnRzZW4gYnJvdWdodCBzb21lIGluZm8gYWJvdXQgU0dJIElSSVg6CgogIElSSVggc3VwcG9ydHMgMyBkaWZmZXJlbnQgZXhlY3V0YWJsZS9vYmplY3QgZm9ybWF0cywgLTMyLCAtbjMyIGFuZCAtNjQuCiAgLW4zMiBpcyBkZWZhdWx0IDMyLWJpdCBmb3JtYXQsIC0zMiBpcyB0aGUgIm9sZCIgMzItYml0IGZvcm1hdCwgYW5kIC02NCBpcwogIHRoZSA2NC1iaXQgZm9ybWF0LiAgTGlicmFyaWVzIGZvciB0aGUgZGlmZmVyZW50IGZvcm1hdHMgYXJlIGluIGxpYiwgbGliMzIKICBhbmQgbGliNjQgcmVzcGVjdGl2ZWx5LgoKICBXZSd2ZSBub3cgYWRqdXN0ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWRhcHQgdG8gdGhpcyB3aGVuIHNjYW5uaW5nIGZvcgogIDNyZCBwYXJ0eSBsaWJzLCBzdWNoIGFzIE9wZW5TU0wuCgpEYW5pZWwgKDE3IE1hcmNoIDIwMDQpCi0gV2F0eiBwb2ludGVkIG91dCBhIGZldyBtaXNzaW5nIGZpbGVzIGluIHRoZSBNU1ZDIHByb2plY3QgZGVzY3JpcHRpb24gZmlsZS4KCi0gR/xudGVyIEtuYXVmIGJyb3VnaHQgcGF0Y2hlcywgY29kZSBhbmQgbWFrZWZpbGVzIHRvIGJ1aWxkIGN1cmwgb24gTm92ZWxsCiAgTmV0V2FyZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNCkKLSBMb3RzIG9mIGxpYmN1cmwgbWFuIHBhZ2VzIHdlcmUgdXBkYXRlZCB0byBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgbWFuCiAgcGFnZXMgdGhlIHJlY29nbml6ZWQgd2F5IHNvIHRoYXQgdGhleSBhcHBlYXIgYXMgbmljZSBoeXBlcmxpbmtzIGluIHRoZSBIVE1MCiAgdmVyc2lvbnMuCgotIGJ1aWxkY29uZiBub3cgY2hlY2tzIHRoZSBtNCB2ZXJzaW9uIHRvbywgc2luY2UgYXV0b2NvbmYgcmVxdWlyZXMgYSBHTlUgbTQKICB2ZXJzaW9uIHRvIGJ1aWxkIHByb3BlciBjb25maWd1cmUgc2NyaXB0cy4KCkRhbmllbCAoMTIgTWFyY2ggMjAwNCkKLSBBZGRlZCBDVVJMT1BUX1BPU1RGSUVMRFNJWkVfTEFSR0UsIHRoZSBsYXJnZSBmaWxlIHZlcnNpb24gb2YKICBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgdG8gYWxsb3cgUE9TVHMgbGFyZ2VyIHRoYW4gMkdCLgoKLSBEYXZpZCBCeXJvbiBmaXhlZCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGNhc2UvY3Jhc2guCgpEYW5pZWwgKDEwIE1hcmNoIDIwMDQpCi0gSmVmZiBMYXdzb24gZml4ZWQgdGhlIFNTTCBjb25uZWN0aW9uIHRvIGRlYWwgd2l0aCByZWNlaXZlZCBzaWduYWxzIGR1cmluZyB0aGUKICBjb25uZWN0LgoKLSBDaGFuZ2VkIHRoZSBPUyBzdHJpbmcgZm9yIHdpbjMyIHRvIGJlY29tZSAiaTM4Ni1wYy13aW4zMiIuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNCkKLSBDaGFuZ2VkIHRoZSBpbnRlcm5hbHMgdG8gdXNlIGN1cmxfc29ja2V0X3QgZm9yIHNvY2tldCB2YXJpYWJsZSB0eXBlLiBUaGlzCiAgc2hvdWxkIGVuYWJsZSB1cyB0byBidWlsZCB3aXRoIGxlc3Mgd2FybmluZ3Mgb24gV2luZG93cywgd2hlcmUgU09DS0VUIGlzCiAgdXNlZCB3aGljaCBpcyBhbiB1bnNpZ25lZCBpbnQsIHdoaWxlIG1vc3Qgb3RoZXIgcGxhdGZvcm1zIHVzZSBhIG1lcmUgaW50LgoKLSBNb2RpZmllZCBsaWIvY29uZmlnLXdpbjMyLmggdG8gYnVpbGQgZmluZSBvbiBNU1ZDIGFnYWluLgoKVmVyc2lvbiA3LjExLjEtcHJlMSAoOCBNYXJjaCAyMDA0KQoKRGFuaWVsICg4IE1hcmNoIDIwMDQpCi0gTWlub3IgZml4IHRvIG1ha2UgY3VybCBDVVJMX1ZFUlNJT05fTEFSR0VGSUxFIGlzIG9ubHkgc2V0IGlmIGN1cmxfb2ZmX3QgaXMKICBsYXJnZXIgdGhhbiA0IGJ5dGVzLgoKRGFuaWVsICg0IE1hcmNoIDIwMDQpCi0gSW1wcm92ZWQgUFVUL1BPU1Qgd2l0aCBOVExNL0RpZ2VzdCBhdXRoZW50aWNhdGlvbiwgdGhlIHNvIGNhbGxlZCBpc3N1ZSAxMi4KCi0gTW9kaWZpZWQgdGhlIHRlc3QgSFRUUCBzZXJ2ZXIgYSBsb3QgdG8gd29yayB3aXRoIHRoZSB1cGNvbWluZyBjaGFuZ2VzIGZvcgogIFBVVC9QT1NUIHdpdGggTlRMTS9EaWdlc3QgYXV0aGVudGljYXRpb24gKGxpa2UgdGVzdCBjYXNlIDg4KS4gQWRkZWQgQW5kculzCiAgR2FyY+1hJ3Mgd2luMzItY2hhbmdlcy4gSW1wcm92ZWQgdGhlIGxvZ2dpbmcuCgotIEZpeGVkIHRoZSBmaWxlOi1yZWxhdGVkIHByb2dyZXNzL2dldGluZm8gc3R1ZmYgYSBiaXQgbW9yZS4KCkRhbmllbCAoNCBNYXJjaCAyMDA0KQotIEkgY29ycmVjdGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjoKICBoZWFkZXIgb3Igd2hlbiBkb2luZyBtdWx0aXBsZS1yZXF1ZXN0IGF1dGhlbnRpY2F0aW9ucy4gQSBzdWJzZXF1ZW50IHJlcXVlc3QKICBjb3VsZCBlcnJvbmVvdXNseSByZS11c2UgYSBwcmV2aW91cyBjb25uZWN0aW9uIHRoYXQgd2FzIHNlbnQgd2l0aAogIENvbm5lY3Rpb246IGNsb3NlLiBDaHJpc3RvcGhlciBSLiBQYWxtZXIgcmVwb3J0ZWQuCgotIEFuZHLpcyBHYXJj7WEgcGF0Y2hlZCBjdXJsIHRvIHByZXZlbnQgd2FybmluZ3Mgd2hpbGUgY29tcGlsaW5nIHdpdGggbWluZ3csCiAgbWFpbmx5IGJlY2F1c2UgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGhhdmUgYm90aCBXSU4zMiBhbmQgSEFWRV9DT05GSUdfSAogIGRlZmluZWQuCgotIFdoZW4gdHJhbnNmZXJyaW5nIGZpbGVzIGZyb20gYSBmaWxlOiBVUkwsIHRoZSBwcm9ncmVzcyBtZXRlciBhbmQgb3RoZXIKICB0cmFuc2ZlciBtZXRyaWNzIHdlcmUgbm90IHVwZGF0ZWQgcHJvcGVybHkuCgotIERhdmlkIEJ5cm9uIHByb3ZpZGVkIGEgInZlcnNpb24gcmVzb3VyY2UiIGZpbGUgdG8gdGhlIGN1cmwgZXhlY3V0YWJsZSBmb3IKICB0aGUgd2luZG93cyBidWlsZHMuCgpEYW5pZWwgKDMgTWFyY2ggMjAwNCkKLSBEYXZpZCBCeXJvbidzIHdvcmsgb24gbWFraW5nIGxpYmN1cmwgb25seSByZXF1aXJlIHdpbnNvY2sgMS4xIG9uIFdpbmRvd3MKICBtYWNoaW5lcy4KCi0gTW9yZSB2YXJpYWJsZSBjbGVhbnVwcyBiYXNlZCBvbiBjb21waWxlciB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgVG9yIEFybnRzZW4ncwogIGF1dG9idWlsZHMgd2l0aCBNSVBTUHJvLgoKLSBKb2UgSGFscGluIGhlbHBlZCB1cyBmaXggc29tZSBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncyBvbiBGcmVlQlNELgoKLSBBcHBsaWVkIFRvbSBCYXRlcycgcGF0Y2ggdG8gYnVpbGQgb24gbnNyLXRhbmRlbS1uc2suCgotIERhbiBGYW5kcmljaCBjb3JyZWN0ZWQgc29tZSBmbGF3cyBpbiB0aGUgY29uZmlndXJlIEdTUyBkZXRlY3Rpb24uCgpEYW5pZWwgKDIgTWFyY2ggMjAwNCkKLSBGaXhlZCB0aGUgbGliY3VybCBjb2RlIHRvIHVzZSBGT1JNQVRfT0ZGX1QgZm9yIHByaW50ZigpIGZvcm1hdHRpbmcKICBjdXJsX29mZl90IHR5cGVzIGludGVybmFsbHkuCgpEYW5pZWwgKDEgTWFyY2ggMjAwNCkKLSBBZGRlZCBDVVJMX1ZFUlNJT05fTEFSR0VGSUxFIGFzIGEgZmVhdHVyZS1iaXQgaW4gdGhlIGN1cmxfdmVyc2lvbl9pbmZvKCkKICByZXNwb25zZSwgdGhhdCBzaWduYWxzIGlmIHRoaXMgbGliY3VybCBzdXBwb3J0cyA+MkdCIGZpbGVzLiBjdXJsIC1WIG5vdwogIG91dHB1dHMgJ0xhcmdlZmlsZScgaW4gdGhlIEZlYXR1cmVzOiBmaWVsZCBpZiB0aGlzIGlzIHRoZSBjYXNlLiBNb3N0IHN5c3RlbXMKICBhcmUgbGlrZWx5IHRvIHN1cHBvcnQgdGhpcy4KCi0gV2Ugb2ZmZXIgYSBDVVJMX0ZPUk1BVF9PRkZfVCBkZWZpbmUgaW4gdGhlIHB1YmxpYyBoZWFkZXIsIHdoaWNoIGNhbiBiZSB1c2VkCiAgdG8gcHJpbnRmKCkgY3VybF9vZmZfdCB2YXJpYWJsZXMuIFdlIGFsc28gbW9kaWZpZWQgdGhlIGxpYmN1cmwgc291cmNlcyB0bwogIHVzZSB0aGlzIGRlZmluZSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyAlT2QgYXBwcm9hY2ggKGFsdGhvdWdoIEkndmUgbGVmdCB0aGUKICBPLWZsYWcgZnVuY3Rpb25hbCBpbiB0aGUgY29kZSkuIFRoaXMgc2hvdWxkIGFsc28gcHJldmVudCBjb21waWxlcnMgdG8gd2FybgogIG9uIHRoZSBob21lLWdyb3duIG9wdGlvbi4KCi0gRml4ZWQgdGhlIHJlc3VtZS1jaGVjayBjb2RlIHRvIHRlc3QgZm9yIGEgd29ya2luZyByZXN1bWUgYXQgdGhlIGVuZCBvZiB0aGUKICBoZWFkZXJzIGFuZCBub3QgYXQgdGhlIGZpcnN0IGJvZHktYnl0ZS4KCi0gQ1VSTE9QVF9ETlNfVVNFX0dMT0JBTF9DQUNIRSBpcyBub3cgY29uc2lkZXJlZCBvYnNvbGV0ZS4gU3RvcCB1c2luZyBpdC4gSWYKICB5b3UgbmVlZCBhIGdsb2JhbCBETlMgY2FjaGUgZm9yIHdoYXRldmVyIHJlYXNvbiwgdXNlIHRoZSBzaGFyZSBpbnRlcmZhY2UgYW5kCiAgeW91J2xsIGdldCBhIGdsb2JhbCBjYWNoZSB0aGF0IHdvcmtzIHRoZSB3YXkgaXQgc2hvdWxkIHdvcmsuIFlvdSBjYW4gZXZlbgogIGhhdmUgYW55IG51bWJlciBvZiBnbG9iYWwgY2FjaGVzLCBhbGwgYXQgeW91ciBjb21tYW5kLiBUaGlzIGlzIG5vdyBhbHNvCiAgbWVudGlvbmVkIGluIHRoZSBkb2NzLgoKLSBNYWRlIHRoZSAqcHJpbnRmIGNvZGUgc3VwcG9ydCB0aGUgei1mbGFnIHRvIGVuYWJsZSBzaXplX3QgcHJpbnRmKCkgaW4gYQogIG1hbm5lciBzaW1pbGFyIHRvIGhvdyBnbGliYyBhbGxvd3MgaXQuIFRvIG1ha2UgcHJpbnRmaW5nIG9mIHRoaXMgd29yayBvbgogIHBsYXRmb3JtcyB3aXRoIDY0Yml0IHNpemVfdCBhbmQgMzJiaXQgaW50cy4gSWYgdGhlcmUgZXZlbiBhcmUgYW55ISA7LSkKCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGRpc2NvdmVyZWQgdGhhdCBpZiB5b3UgQ1VSTE9QVF9GUkVTSF9DT05ORUNUIGFuZAogIENVUkxBVVRIX05UTE0gKG9yIENVUkxBVVRIX0FOWSBhbmQgbGliY3VybCB0aGVuIHBpY2tlZCBOVExNKSwgbGliY3VybCB3b3VsZAogIGxvb3Agd2l0aG91dCBzdWNjZWVkaW5nIHRvIGF1dGhlbnRpY2F0ZSBkdWUgdG8gdGhlIG5ldyBjb25uZWN0aW9uIHRoYXQgd2FzCiAgbWFkZSBmb3IgYWxsIHJvdW5kLXRyaXBzIGluIHRoZSBhdXRoZW50aWNhdGlvbi4gTm93LCB0aGUgRlJFU0hfQ09OTkVDVCBpcwogIHJlbWFkZSB0byBvbmx5IG1hdHRlciBmb3IgdGhlIGZpcnN0IGNvbm5lY3Rpb24gbWFkZSB3aXRoIGN1cmxfZWFzeV9wZXJmb3JtKCkKICBhbmQgYWxsIHRoZSByZXN0IHRoYXQgbWlnaHQgZm9sbG93IGR1ZSB0byBGT0xMT1dMT0NBVElPTiBvciBIVFRQCiAgYXV0aGVudGljYXRpb24gYXJlIG5vdyBpZ25vcmluZyB0aGF0IG9wdGlvbi4KCi0gQWRqdXN0ZWQgdGhlIFFVSVQgY29kZSBzbGlnaHRseSBzaW5jZSBpdCBjb3VsZCBjb3JlLWR1bXAuCgotIENvcnJlY3RlZCB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdG8gcHJvdmlkZSBhIGNvcnJlY3Qgc2l6ZSB0byB0aGUKICAndmVyaWZpZWRzZXJ2ZXInIHJlcXVlc3QuCgpEYW5pZWwgKDI3IEZlYnJ1YXJ5IDIwMDQpCi0gSm9lIEhhbHBpbiBtYWRlIHRoZSBGVFAgY29kZSBzZW5kIFFVSVQgb24gdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBiZWZvcmUKICBkaXNjb25uZWN0aW5nIHRoZSBUQ1AgY29ubmVjdGlvbi4gVGhpcyBpcyB3aGF0IGdvb2QtYmVoYXZpbmcgZnRwIGNsaWVudHMKICBzaG91bGQgZG8uCgpEYW5pZWwgKDI2IEZlYnJ1YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24gdXBkYXRlZCBzZXZlcmFsIGZpbGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIE1TVkMgNi4gSGUKICBhbHNvIGFkZGVkIHRoZSAnYnVpbGRjb25mLmJhdCcgdGhhdCB3b3JrcyBsaWtlIHRoZSAnYnVpbGRjb25mICsgY29uZmlndXJlJwogIGNvbWJvIGRvZXMgb24gdW5peGVzLgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBtZW1kZWJ1ZyBzdHVmZiBzdXBwb3J0IGNhbGxvYygpIGFzIHdlbGwuCgotIFRvciBBcm50c2VuIHBvaW50ZWQgb3V0IHRoYXQgdGVzdGN1cmwuc2ggbmVlZGVkIHRvIHJlbW92ZSB0aGUgZ2VuZXJhdGVkCiAgZmlsZXMgaW4gb3JkZXIgdG8gaGF2ZSB0aGVtIHJlLWdlbmVyYXRlZCBpbiBlYWNoIGJ1aWxkLgoKLSBBbmR5IFNlcnBhIGZvdW5kIG91dCB0aGF0IHRoZSBzaGFyZSBpbnRlcmZhY2UgZGlkIG5vdCBlbmpveSBsaWZlIHdoZW4gbm90CiAgaGF2aW5nIHRoZSBsb2NrIGFuZCB1bmxvY2sgY2FsbGJhY2tzIHNldCwgZXZlbiB0aG91Z2ggZG9jdW1lbnRlZCB0byBiZQogIE9LLiBJdCBzdGlsbCBpcyBPSywgYW5kIG5vdyB0aGUgY29kZSB3b24ndCBzZWdmYXVsdCBhbnltb3JlIQoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDA0KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR3JlZyBIZXdnaWxsIEkgbW9kaWZpZWQgaG93IGxvbmcgbG9uZyBpcyB1c2VkIGluIHRoZQogIG1wcmludGYgY29kZSwgYXMgd2UgY2FuIHVzZSBhIDY0Yml0IHR5cGUgd2l0aCBNU1ZDIHRoYXQgaXMgYSBsb25nIGxvbmcKICBlcXVpdmFsZW50LiBUaGlzIGNvcnJlY3RzIHNvbWUgd2VpcmQgbGFyZ2UgZmlsZSBiZWhhdmlvcnMgb24gd2luZG93cy4KCi0gVG9yIEFybnRzZW4gaGVscGVkIG1lIHdvcmsgb3V0IC0tZW5hYmxlLWRlYnVnIHRvIHdvcmsgYmV0dGVyIHdpdGggZGlmZmVyZW50CiAgdmVyc2lvbnMgb2YgdGhlIGdjYyBhbmQgaWNjIGNvbXBpbGVycy4KCi0gQWRkZWQgQ1VSTE9QVF9TSEFSRSB0byB0aGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlLgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA0KQotIEFwcGxpZWQgdGhlIGZpbmFsIHBpZWNlcyBvZiBHaXNsZSBWYW5lbSdzIHBhdGNoIHRoYXQgYnJpbmdzIGEgd29ya2luZyBuYW1lCiAgcmVzb2x2ZSB0aW1lb3V0IHRvIHRoZSB3aW5kb3dzIHZlcnNpb25zIG9mIGN1cmwhCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24ncyBmaXggdG8gYWxsb3cgdGhlIHNwZWVkLWxpbWl0IGxvZ2ljIHdvcmsgZXZlbiBpZiB5b3Ugc2V0CiAgbGltaXQtcmF0ZS4gSXQgZG9lcyB3b3JrIG9uIHRoZSBleHBlbnNlIG9mIHRoZSByYXRlIGxpbWl0ZXIuCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDQpCi0gY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIHdpdGggZ2NjIG5vdyBhbHNvIHRyaWVzIHRvIGRldGVjdCB0aGUgaWNjIGNvbXBpbGVyCiAgKHdoaWNoIHNvbWVob3cgZ2V0cyB0cmVhdGVkIGFzIGlmIGl0IGlzIGEgZ2NjKSB0byBzdG9wIHVzaW5nIGFsbCB0aGUgZ2NjCiAgb3B0aW9ucyB3aXRoIGl0LCBhbmQgd2UgYWxzbyBwcm92aWRlIC1pc3lzdGVtIG9wdGlvbnMgZm9yIGVhY2ggZXh0cmEgLUkKICBvcHRpb24gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaGFzIGZpZ3VyZWQgb3V0IChmb3IgT3BlblNTTCwga2VyYmVyb3MsIHpsaWIsCiAgSGVpbWRhbCBldGMpLiBUaGlzIG9mIGNvdXJzZSB0byBwcmV2ZW50IHdhcm5pbmdzIG9uIGhlYWRlcnMgd2UgZG9uJ3QgaGF2ZQogIGNvbnRyb2wgb2YuCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDQpCi0gRG91ZyBQb3J0ZXIgbWFkZSBsaWJjdXJsIHVzZSB0aGUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgdGhlCiAgZ2V0cHd1aWQgcmVzdWx0cyB3aGVuIGxvb2tpbmcgZm9yIC5uZXRyYyBmaWxlcy4KCi0gSWYgJ2NvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZycgaXMgdXNlZCB3aXRoIGdjYywgaXQgbm93IGNoZWNrcyB3aGljaCBnY2MKICB2ZXJzaW9uIGl0IGlzIGFuZCB1c2VzIGFzIHBpY2t5IGNvbXBpbGVyIG9wdGlvbnMgYXMgcG9zc2libGUgZm9yIHRoZQogIHBhcnRpY3VsYXIgdmVyc2lvbi4KCi0gQ29kZSB0aGF0IGNhbiBiZSB1c2VkIGluIGJvdGggdGhlIGxpYiBhbmQgaW4gdGhlIGN1cmwgYXBwIGlzIG5vdyBtYWRlIHRvIHVzZQogIHRoZSBjdXJseF8gcHJlZml4LiBUaGUgZmlyc3QgZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlIGxpa2UgdGhpcyBpcyB0aGUKICBjdXJseF9zdHJ0b2xsKCkgZnVuY3Rpb24uIFRoaXMgaXMgbWFkZSB0byBhbGxvdyB0aGUgYXBwIHRvIHVzZSBleGlzdGluZyBjb2RlLAogIGJ1dCB3aXRob3V0IHBvbGx1dGluZyB0aGUgbGliY3VybCBBUEkuIEZ1cnRoZXIgZXhwbGFuYXRpb25zIHBvc3RlZCBoZXJlOgoKICAgIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNC0wMi8wMjE1Lmh0bWwKCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNCkKLSBGaXhlZCBidWlsZGNvbmYgdG8gbm90IHVzZSAid2hpY2giIGFzIEFJWCBhbmQgVHJ1NjQgaGF2ZSB3aGF0IGhhdmUgYmVlbgogIHJlZmVycmVkIHRvIGFzICJob3JyaWJseSBicm9rZW4gJ3doaWNoJyBwcm9ncmFtcyIuCgotIE1hZGUgc3VyZSBkbnMgY2FjaGUgdGltZW91dCBzZXQgdG8gLTEgcmVhbGx5IG1lYW5zIGNhY2hpbmcgZm9yZXZlci4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwNCkKLSBNYWRlIGl0IHBvc3NpYmx5IHRvIGJ1aWxkIGMtYXJlcyB3aXRoIHRoZSBsaWJjdXJsIG1lbWRlYnVnIHN5c3RlbSB0byBiZXR0ZXIKICB0cmFjayBtZW1vcnkuCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDQpCi0gV2hlbiB1c2luZyBhcmVzLCB3ZSBub3cgaW5pdGlhbGl6ZSB0aGUgYXJlcyAnY2hhbm5lbCcgaW4gY3VybF9lYXN5X2luaXQoKQogIGFuZCByZS11c2UgdGhhdCBzYW1lIGhhbmRsZSBkdXJpbmcgdGhlIGVudGlyZSBjdXJsIGhhbmRsZSdzIGxpZmUtdGltZS4gSXQKICBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KCi0gRml4ZWQgYSBwcm9ibGVtIHdoZW4gZGlzcGxheWluZyB2ZXJib3NlIGZvciBpcHY2LWVuYWJsZWQgbGliY3VybHMgYW5kCiAgcmUtdXNlZCBjb25uZWN0aW9ucy4gUHJvYmxlbSByZXBvcnRlZCBhbmQgZml4IHZlcmlmaWVkIGJ5IEdyaWdvcnkgRW50aW4uCgotIEplZmYgTGF3c29uIGZpeGVkIHRoZSB2ZXJzaW9uLWNoZWNrIGluIHRoZSBTT0NLUzUgY29kZS4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwNCkKLSBGaXhlZCBhIGNhc2Ugd2hlcmUgYSBob3N0IGNhY2hlIGVudHJ5IHdhcyBub3QgZmxhZ2dlZCBpbi11c2UgcHJvcGVybHkgd2hlbiBhCiAgY2FjaGVkIGVudHJ5IHdhcyB1c2VkLgoKLSBBbmRy6XMgR2FyY+1hJ3MgcGF0Y2ggdGhhdCBjaGVja3MgZm9yIHdpbm1tIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHdhcwogIGFwcGxpZWQuCgpEYW5pZWwgKDEzIEZlYnJ1YXJ5IDIwMDQpCi0gQmVuIEdyZWVhcidzIFNPX0JJTkRUT0RFVklDRSBwYXRjaCBmb3IgdGhlIGJpbmRpbmcgb2YgdGhlIGxvY2FsIGVuZCB0byBhCiAgc3BlY2lmaWMgbmV0d29yayBpbnRlcmZhY2UuCgotIEdyZWcgSGV3Z2lsbCBmb3VuZCBvdXQgdGhhdCB0aGUgdmFyaWFibGUgaG9sZGluZyAnY29udGVudGxlbmd0aCcgd2Fzbid0IGJpZwogIGVub3VnaCB0byBob2xkIGEgbGFyZ2UgZmlsZSEKCi0gVG9yIEFybnRzZW4gZml4ZWQgYSA2NGJpdC1yZWxhdGVkIHByb2JsZW0gaW4gZGF0ZS1yZWxhdGVkIGNvZGUgaW4gdGhlIGZ0cAogIGRlcGFydG1lbnQsIGFuZCB0aGVyZSB3YXMgYW5vdGhlciBwb3RlbnRpYWwgcHJvYmxlbSBpbiB0aGUgbmFtZSByZXNvbHZlIGNvZGUKICB0b28uCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDQpCi0gUmVtb3ZlZCBhIGZldyB2YXJpYWJsZXMgdGhhdCB3ZXJlIG9ubHkgc2V0IGJ1dCBuZXZlciB1c2VkLCBhcyBzb21lIGNvbXBpbGVycwogIHdhcm4gYWJvdXQgdGhhdCBhbmQgd2UgZG8gbm90IGxpa2UgY29tcGlsZXIgd2FybmluZ3MhCgotIFJlbW92ZWQgdGhlIG5lZWQgZm9yIHN5bWxpbmtzIGluIHRoZSB0ZXN0cy9kYXRhIGRpcmVjdG9yeSBpZiBjdXJsIGlzIGJ1aWx0CiAgb3V0c2lkZSBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBhbmQgdGhlICdtYWtlIHRlc3QnIGlzIHVzZWQuIFRoaXMgd2FzIGRvbmUKICBieSBwcm92aWRpbmcgYSAic291cmNlIGRpciBwYXRoIiB0byB0aGUgc2NyaXB0cy9zZXJ2ZXJzLgoKLSBOb3csIGlmIHRoZSBjb25maWd1cmUgc2NyaXB0IGNhbid0IGZpbmQgYW4gbnJvZmYgdG9vbCBvciBhbiBvcHRpb24gdG8gbnJvZmYKICB0byB1c2UgdG8gY29udmVydCBtYW4gcGFnZXMgd2l0aCwgaXQgd2lsbCBjb21wbGV0ZWx5IHN3aXRjaCBvZmYgdGhlIGJ1aWx0LWluCiAgbWFudWFsLgoKLSAnY29uZmlndXJlIC0tZGlzYWJsZS1tYW51YWwnIGNvbXBsZXRlbHkgZGlzYWJsZXMgdGhlIGJ1aWx0LWluIG1hbnVhbCBmcm9tCiAgdGhlIGN1cmwgY29tbWFuZCB0b29sLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBhIG1pbm9yIHNvdXJjZSBlZGl0LCBhbmQgbm93CiAgaGUgaGFzIG1hbmFnZWQgdG8gZ2V0IG1zeXMvbWluZ3cgdG8gcnVuIGNvbmZpZ3VyZSBhbmQgdGhlbiBidWlsZCEKCkRhbmllbCAoOSBGZWJydWFyeSAyMDA0KQotIFRoZSBkZWZhdWx0IEhUVFAgQWNjZXB0OiBoZWFkZXIgd2FzIG1vZGlmaWVkIHRvIHRoZSBtdWNoIHNpbXBsZXIKICAiQWNjZXB0OiAqLyoiLgoKLSBQIFIgU2NoYWZmbmVyIHVwZGF0ZWQgdGhlIGN1cmwtc3NsIHNwZWMgZmlsZSBmb3IgUlBNcy4KCi0gRG9taW5pY2sgTWVnbGlvIGJyb3VnaHQgbG90cyBvZiBkb2N1bWVudGF0aW9uIGZvciB0aGUgc2hhcmUgaW50ZXJmYWNlJ3MgbWFuCiAgcGFnZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgbWlzc2luZy4KCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgd29yay1hcm91bmQgYSBidWcgaW4gdGhlCiAgQUlYNSBpbXBsZW1lbnRhdGlvbiBvZiBnZXRhZGRyaW5mbygpLiBUaGlzIG1ha2VzIHRoZSBGVFAgUE9SVCBzdHVmZiB3b3JrIG9uCiAgaXB2Ni1lbmFibGVkIEFJWCBidWlsZHMuCgotIEtlbiBSYXN0YXR0ZXIgcHJvdmlkZWQgcG9ydGFiaWxpdHkgZml4ZXMgZm9yIHRoZSBjdXJsZ3RrLmMgZXhhbXBsZSwgYW5kIG5vdwogIGl0IHJ1bnMgb24gd2luZG93cyB3aXRoIEdUSyBhcyB3ZWxsIQoKRGFuaWVsICg2IEZlYnJ1YXJ5IDIwMDQpCi0gQW5kculzIEdhcmPtYSBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZpbmQgZ2V0aG9zdGJ5bmFtZSgpIGZpbmUgd2hlbiBydW4KICB3aXRoIG1pbmd3IG9uIHdpbmRvd3MuCgotIE1vZGlmaWVkIHRoZSBsZGFwIGNvZGUgdG8gdXNlIHByb3BlciBmdW5jdGlvbiBwb2ludGVycyBhbGwgb3ZlciAoaW5zdGVhZCBvZgogIG1peGVkIGRhdGEgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzKSB0byB3b3JrLWFyb3VuZCB0aGUgcGlja3kgTUlQU1BybyBjb21waWxlcgogIHdhcm5pbmdzLgoKLSBBIGN1c3RvbSBIb3N0OiBoZWFkZXIgaXMgb25seSBjb25zaWRlcmVkIGlmIHRoZSByZXF1ZXN0IGlzIG5vdCBtYWRlIGJ5CiAgZm9sbG93aW5nIGEgbG9jYXRpb24uIEFmdGVyIGRpc2N1c3Npb25zIHdpdGggVGltIEJha2VyLgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDQpCi0gVGhlIGxpYnogcGFydCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdCBub3cgb25seSBzZXQgdGhlIHR3byBsaWJ6LXJlbGF0ZWQKICBkZWZpbmUgSEFWRV9aTElCX0ggYW5kIEhBVkVfTElCWiBpZiBib3RoIHRoZSBsaWIgYW5kIHRoZSBoZWFkZXIgaXMgZm91bmQuCiAgSWYgb25lIGlzIG1pc3NpbmcsIG5vbmUgb2YgdGhlIGRlZmluZXMgaXMgc2V0LgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHRoZSBNaW5ndyBtYWtlZmlsZXMuCgotIExlbiBLcmF1c2UgcmVwb3J0ZWQgdGhhdCBjdXJsIDcuOS5YIGNvdWxkIGRvIHVwbG9hZGluZyBmcm9tIHN0ZGluIHdpdGhvdXQKICBkb2luZyBjaHVua2VkIGVuY29kaW5nLCB3aGljaCBjdXJyZW50IGN1cmwgY2Fubm90IGRvIGV2ZW4gaWYgeW91IGRpc2FibGUKICB0aGUgdHJhbnNmZXItZW5jb2RpbmcgY2h1bmtlZCBoZWFkZXIuIE5vdyBpdCBjYW4gYWdhaW4sIGFuZCB0ZXN0IGNhc2UgOTgKICB2ZXJpZmllcyB0aGlzIGZ1bmN0aW9uYWxpdHkuCgotIFRvciBBcm50c2VuIGZpeGVkIGEgd2VpcmQgZ2V0YWRkcmluZm8oKSB1c2FnZSBpbiB0aGUgRlRQIGNvZGUsIHByZXZlbnRpbmcKICB0aGUgaXB2Ni1jb2RlIGZvciBQT1JUIHdvcmsgb24gQUlYIDUuMi4gV2Ugbm93IGFsc28gcHJvdmlkZSAoYmV0dGVyKSBlcnJvcgogIG1lc3NhZ2VzIHdoZW4gYmFpbGluZyBvdXQgaW4gdGhlIHRoYXQgZnVuY3Rpb24uCgotIFRvciBBcm50c2VuIG5vdyBwcm92aWRlcyBBSVggYW5kIElSSVggKHVzaW5nIGdjYywgeGxjIGFuZCB0aGUgTUlQU1BybwogIGNvbXBpbGVycykgYXV0b21hdGVkIGJ1aWxkIGxvZ3MgKGh0dHA6Ly9jdXJsLmhheHguc2UvYXV0by8pIGFuZCB3ZSd2ZSBmaXhlZAogIG51bWVyb3VzIG1pbm9yIHF1aXJrcyB0byBtYWtlIGxlc3Mgd2FybmluZ3MgYXBwZWFyLgoKRGFuaWVsICg0IEZlYnJ1YXJ5IDIwMDQpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHaWxhZCwgd2Ugbm93IHVzZSB0aGUgY3VzdG9tIHRpbWVvdXRzIHdoZW4gd2FpdGluZyBmb3IgYQogIHNlcnZlciB0byBjb25uZWN0IHdoZW4gdXNpbmcgRlRQIFBPUlQuIFByZXZpb3VzbHkgd2UgYWx3YXlzIHdhaXRlZCAxMAogIHNlY29uZHMsIG5vIG1vcmUgbm8gbGVzcy4gV2Ugbm93IGFsc28gY2hhbmdlZCB0aGUgZGVmYXVsdCAoaWYgbm8gdGltZW91dCBpcwogIHNldCkgdG8gd2FpdCA2MCBzZWNvbmRzIGZvciB0aGUgY29ubmVjdCBiZWZvcmUgd2UgZmFpbC4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDA0KQotIE1vZGlmaWVkIHRvIGxpbmsgd2l0aCBjLWFyZXMgaW5zdGVhZCBvZiBhcmVzLgoKRGFuaWVsICgyIEZlYnJ1YXJ5IDIwMDQpCi0gQWRkZWQgYSBjb25maWd1cmUgdGVzdCB0byBjaGVjayBmb3Igd2hpY2ggb3B0aW9uIHRoZSAoZylucm9mZiB0b29sIHdhbnRzCiAgdG8gZXh0cmFjdCBwbGFpbiB0ZXh0IGZyb20gdGhlIG1hbiBwYWdlcy4gVG9yIEFybnRzZW4gdG9sZCB1cyB0aGUgQUlYCiAgdmVyc2lvbiBvZiBHTlUgZ25yb2ZmIGRvZXNuJ3Qgc3VwcG9ydCAtbWFuIQoKLSBBZGRlZCBhbiB1bmRlZiBvZiBhY2NlcHQgaW4gbWVtZGVidWcuaCB0byBtYWtlIGN1cmwgYnVpbGQgd2l0aCAtLWVuYWJsZS1kZWJ1ZwogIG9uIEFJWCA1LjIgd2hpY2ggc2VlbXMgdG8gaGF2ZSBhY2NlcHQgZGVmaW5lZC4gUmVwb3J0ZWQgYnkgVG9yIEFybnRzZW4uCgotIGN1cmxfdmVyc2lvbigpIG5vdyBpbmNsdWRlcyBjLWFyZXMgdmVyc2lvbiBpbmZvLCBhbmQgY3VybF92ZXJzaW9uX2luZm8oKSBub3cKICByZXR1cm5zIGEgc3RydWN0IHdpdGggdmVyc2lvbiBTRUNPTkQgdGhhdCBhbHNvIGluY2x1ZGVzIHRoYXQgaW5mby4KCi0gV2UgYXJlIG5vdyBvZmZpY2lhbGx5IHVzaW5nIGMtYXJlcyBmb3IgYXN5bmNoIG5hbWUgcmVzb2x2ZXMuIGMtYXJlcyBpcyB0aGUKICBuZXcgbGlicmFyeSwgYmFzZWQgb24gdGhlIGV4aXN0aW5nIGFyZXMgYnV0IHdpdGggYW4gZXh0ZW5kZWQgYW5kIHNsaWdodGx5CiAgbW9kaWZpZWQgQVBJLgoKLSBEaXJrIGltcHJvdmVkIHRoZSBhcmVzIHRpbWVvdXQgY29kZSwgYW5kIG5vdyB3ZSBhbHNvIGluY2x1ZGUgdGhlIGFyZXMgZXJyb3IKICBzdHJpbmcgd2hlbiB3ZSBmYWlsIHRvIHJlc29sdmUgYSBuYW1lLgoKLSBBbm90aGVyIHR3ZWFrIHRvIG1ha2UgdGVzdCBjYXNlIDkxIHJ1biBmaW5lLiBOb3cgd2UgaGF2ZSBhbm90aGVyIGJpdCBvbiBhCiAgY29ubmVjdGlvbiB0aGF0IGlzIHNldCB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIG1hcmtlZCBmb3IgJ3JldHJ5Jy4gVGhhdAogIG1ha2VzIHRoZSBjb25uZWN0aW9uIGdldCBjbG9zZWQgYW5kIHJlLW9wZW5lZCBhbmQgdGhlIEhUVFAtZG9uZSBjb2RlIG11c3QKICBub3QgY29tcGxhaW4gb24gdGhlIGZhY3QgdGhhdCBubyBkYXRhIHdhcyByZWNlaXZlZC4KCi0gQmFzZWQgb24gRGlyayBNYW5za2UncyBwYXRjaCwgSSBtb2RpZmllZCB0aGUgbmFtZSByZXNvbHZpbmcgd2l0aCBhcmVzIHRvCiAgZmVhdHVyZSBhIHRpbWVvdXQgZm9yIHJlYWxseSBzbG93IGxvb2t1cHMuIEl0IG5vdyBkZWZhdWx0cyB0byAzMDAgc2Vjb25kcywKICBidXQgaXMgbm93IGFkanVzdGVkIHRvIHRoZSBDT05ORUNUVElNRU9VVC9USU1PVUUgdGltZW91dHMgaWYgb25lIG9mIHRoZW0KICBpcyBzZXQuCgotIEZpeGVkIHRoZSBpbmNsdXNpb24gb2YgY2EtYnVuZGxlLmggdG8gcmVhbGx5IHVzZSB0aGUgb25lIGluIHRoZSBidWlsZCBkaXIKICBiZWZvcmUgdGhlIG9uZSBpbiB0aGUgc291cmNlIGRpci4gRG9tZW5pY28gQW5kcmVvbGkgZm91bmQgb3V0IGFuZCByZXBvcnRlZC4KCi0gQWRkZWQgdGVzdCBjYXNlIDk3LCBhIHNpbXBsZSBQT1NUIHdpdGggYSBjdXN0b20gQ29udGVudC1UeXBlIGhlYWRlcgogIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIG9uZS4KCkRhbmllbCAoMzAgSmFudWFyeSAyMDA0KQotIEFkZGVkIGNvZGUgdGhhdCBhdHRlbXB0cyB0byBmaXggdGhlIHRlc3QgOTEgZmFpbHVyZS4gQXMgaGFzIGJlZW4gZmlndXJlZCBvdXQKICBieSBQYXRyaWNrIFNtaXRoLCB0aGUgZXJyb3IgaGFwcGVucyBiZWNhdXNlIHdlIHJlLXVzZSBhIGNvbm5lY3Rpb24gdGhhdCB0aGUKICBzZXJ2ZXIgaXMganVzdCBhYm91dCB0byBjbG9zZSBhbmQgd2UgZXZlbiBtYW5hZ2UgdG8gc2VuZCBhd2F5IHRoZSByZXF1ZXN0CiAgd2l0aG91dCBzZWVpbmcgYW4gZXJyb3IuIE9uIHRoZSBmaXJzdCByZWFkIGF0dGVtcHQgd2UgZ2V0IGEgRUNPTk5SRVNFVC4KICBTdGFydGluZyBub3csIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IHRoaXMgYW5kIGlmIHNvLCB3ZSByZXRyeSB0aGUgcmVxdWVzdCBvbiBhCiAgZnJlc2ggY29ubmVjdGlvbi4KCi0gSSBhZGRlZCB0ZXN0IGNhc2UgNTEwIHdoaWNoIGlzIGEgY3VzdG9tIHByb2dyYW0gdGhhdCBkb2VzIGEgUE9TVCB1c2luZyBhCiAgcmVhZCBjYWxsYmFjaywgd2l0aCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLgoKLSBBZGp1c3RlZCBvbmUgb2YgdGhlIE1QRS9pWCBjaGFuZ2VzIGFzIGl0IG1hZGUgdGVzdCBjYXNlIDUwNCBmYWlsIGFsbCBvdmVyLgoKLSBBZGRlZCAtLXNvY2tzIGFzIGEgcmVjb2duaXplZCBvcHRpb24uIEl0IHdvcmtzIGp1c3QgbGlrZSAtLXByb3h5IGJ1dCBzZXRzIGEKICBTT0NLUzUgcHJveHkgdG8gdXNlLiBTT0NLUzUgc3VwcG9ydCBoYXMgYmVlbiBhdmFpbGFibGUgaW4gbGliY3VybCBmb3IgYQogIHdoaWxlLCBqdXN0IG5vdCBwcm92aWRlZCBieSB0aGUgY3VybCB0b29sLiBUaGlzIGRvZXMgbm90IGN1cnJlbnRseSB3b3JrIGZvcgogIElQdjYtZW5hYmxlZCBsaWJjdXJscy4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDA0KQotIFN0YWRsZXIgU3RlcGhhbiBwb2ludGVkIG91dCB0aGF0IHNyYy9odWdlaGVscC5jIGluY2x1ZGVkIGNvbmZpZy5oIHdpdGhvdXQKICBjaGVja2luZyB0aGUgZGVmaW5lIGlmIGl0cyBwcmVzZW50Li4uCgotIEtlbiBIaXJzY2ggcHJvdmlkZWQgcGF0Y2hlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiB0aGUgTVBFL2lYIG9wZXJhdGluZwogIHN5c3RlbS4KCi0gRGFuIEZhbmRyaWNoIGNvbXBpbGVkIGN1cmwgd2l0aCBsb3RzIG9mIGFnZ3Jlc3NpdmVseSBwZWRhbnRpYyBjb21waWxlcgogIG9wdGlvbnMgYW5kIHRodXMgZm91bmQgYSBmZXcgbWlub3IgZXJyb3JzIGFuZCBkaWQgc29tZSBnZW5lcmFsIGNsZWFudXBzIHRvCiAgYXZvaWQgdGhlbS4KCi0gRGlyayBNYW5za2UgZml4ZWQgYSBmbGF3IGluIGFyZXMgdGhhdCBwcmV2ZW50ZWQgaXQgdG8gdXNlIG5vbi1ibG9ja2luZwogIHNvY2tldHMgcHJvcGVybHkuCgpEYW5pZWwgKDI4IEphbnVhcnkgMjAwNCkKLSBSaWNoYXJkIEJyYW1hbnRlIGZpeGVkIGNodW5rZWQgdHJhbnNmZXItZW5jb2RlZCAidXBsb2FkcyIgdG8gc2VuZCBhIGZpbmFsCiAgQ1JMRiBjb21ibyBwcm9wZXJseS4KCkRhbmllbCAoMjcgSmFudWFyeSAyMDA0KQotIE1hZGUgdGhlIHJlc3BvbnNlLWhlYWRlcnMgZHVyaW5nIGEgQ09OTkVDVCByZXF1ZXN0IHRvIGEgcHJveHkgZ2V0IHBhc3NlZCBvbgogIGFzIHJlZ3VsYXIgaGVhZGVycywgc28gdGhleSBhcHBlYXIgd2l0aCAtaS8tSSBvcHRpb25zIGFuZCBzaW1pbGFyLgoKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdpc2xlIFZhbmVtLCBJJ3ZlIG1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIGRpc3BsYXkKICBwcm9wZXJseSBzd2l0Y2ggdG8gYSBHQi1kaXNwbGF5IHdoZW4gbW9yZSB0aGFuIDk5OTlNQiBoYXZlIGJlZW4gdHJhbnNmZXJlZC4KCkRhbmllbCAoMjMgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIHBvaW50ZWQgb3V0IGEgY3VybHJjIHBhcnNlciBwcm9ibGVtL2NyYXNoIHdoZW4gYW4gb3B0aW9uIHdpdGggYQogIHJlcXVpcmVkIGRpZG4ndCBoYXZlIG9uZSBhbmQgd2FzIG9uIHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlLgoKLSBNb3JlIFdpbmRvd3MgZml4ZXMgZm9yIGxhcmdlIGZpbGVzLiBXZSBub3cgYnVpbGQgYW5kIGxpbmsgd2l0aAogIC4uL2xpYi9zdHJ0b29mZnQuYyBpbiB0aGUgYXBwIGNvZGUgc2luY2UgQ3VybF9zdHJ0b2xsKCkgaXMgbm90IGEgcHJvdmlkZWQKICBsaWJjdXJsIGZ1bmN0aW9uLi4uIFBlcmhhcHMgd2Ugc2hvdWxkIGNvbnNpZGVyIGEgJ2NvbW1vbicgZGlyIG9yIHNpbWlsYXIKICB3aGVyZSB3ZSBwdXQgc291cmNlIGNvZGUgdXNlZCBpbiBib3RoIHRoZSBsaWIgYW5kIHRoZSBjbGllbnQuIE9yIHBlcmhhcHMKICB3ZSdsbCBqdXN0IG1ha2UgdGhpcyBmdW5jdGlvbiBhdmFpbGFibGUgaW4gdGhlIGxpYnJhcnkuLi4KCi0gVmluY2VudCBCcm9ubmVyIGZvdW5kIG91dCB0aGUgc29ja3M1IGNvZGUgY3Jhc2hlZCB3aGVuIG5vIHVzZXJuYW1lIHdhcwogIHNldC4KCi0gVmluY2VudCBCcm9ubmVyIHNwb3R0ZWQgYSBwcm9ibGVtIHdpdGggcHJveHkgdXNlcm5hbWUvcGFzc3dvcmQgd2hlbiByZS11c2luZwogIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLgoKLSBGaXhlZCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZGlzcGxheSBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gMl4zMSBieXRlcy4gR2lzbGUKICBWYW5lbSByZXBvcnRlZC4KCkRhbmllbCAoMjIgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIG1hZGUgc3RydG9sbCgpIGdldCB1c2VkIHdoZW4gY3VybCBpcyBidWlsdCB3aXRoIHRoZSBtaW5ndwogIGNvbXBpbGVyLgoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgY29tcHJlc3NlZCBoZWxwIHRleHQgY29kZSB0byBkaXNwbGF5IHByb3Blcmx5LgoKLSBSZW1vdmVkIHRoZSAnI2RlZmluZSBIdHRwUG9zdCcgZnJvbSB0aGUgcHVibGljIGhlYWRlciBmaWxlLCBhcyBjdXJsX2h0dHBwb3N0CiAgaXMgdGhlIHByb3BlciBuYW1lIGFuZCBpdCBoYXMgYmVlbiBmb3IgcXVpdGUgc29tZSB0aW1lIG5vdy4gRml4ZXMgYW5vdGhlcgogIG5hbWUgc3BhY2UgcG9sbHV0aW9uLgoKLSBBZGRlZCAnY3VybF9vZmZfdCcgdHlwZWRlZiBpbiB0aGUgcHVibGljIGhlYWRlciBmaWxlLCB0byBiZSB1c2VkIHRvIHByb3ZpZGUKICBsYXJnZSBmaWxlIHNpemVzIHRvIHRoZSAqX0xBUkdFIG9wdGlvbnMuIEFkanVzdGVkIHRoZSBjb2RlIGFsbCBvdmVyIHRvIHVzZQogIHRoaXMgdmFyaWFibGUgdHlwZSBpbnN0ZWFkIG9mICdvZmZfdCcuIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBsYXJnZQogIGZpbGUgc3VwcG9ydCB3b3JrIG9uIG1vcmUgcGxhdGZvcm1zLiBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgY2hlY2tzIHRoZQogIHNpemUgb2YgdGhlIGN1cmxfb2ZmX3QgaW5zdGVhZCBvZiB0aGUgcGxhaW4gb2ZmX3QuCgpWZXJzaW9uIDcuMTEuMCAoMjIgSmFudWFyeSAyMDA0KQoKRGFuaWVsICgyMSBKYW51YXJ5IDIwMDQpCi0gUmVtb3ZlZCB0aGUgZGVmaW5lcyBpbiB0aGUgcHVibGljIGhlYWRlciBmaWxlIHdpdGggVElNRUNPTkRfIHByZWZpeGVzLiBUaGV5CiAgaGF2ZSBiZWVuIG9ic29sZXRlIHNpbmNlIEFwcmlsIDIybmQgMjAwMiwgYW5kIGlmIHRoaXMgY2F1c2VzIGFueW9uZSBhbnkKICBwcm9ibGVtcyBub3cgaXQgaXMgdmVyeSBlYXN5IHRvIGp1c3QgYWRkIENVUkxfIHRvIHRoZSBuYW1lcy4gVGhpcyBjb3JyZWN0cwogIHRoaXMgbmFtZSBzcGFjZSBwb2xsdXRpb24uCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbiBjbGVhbmVkIHVwIGhvdyAtLXRyYWNlIHdpdGggbm8gb3B0aW9uIHdhcyB0cmVhdGVkLCBhbmQgYWxzbwogIGFyZ3VtZW50cyBpbiBhIGNvbmZpZyBmaWxlIHdpdGhvdXQgYSByZXF1aXJlZCBwYXJhbWV0ZXIhCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNCkKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIGZldyBpc3N1ZXMgd2hlcmUgY29tcGlsZXJzIHdhcm5lZCBhYm91dCB2YXJpYWJsZXMKICBwb3NzaWJseSBiZWluZyB1c2VkIHVuYXNzaWduZWQuCgotIE1pbm9yIEludGVyaXggYnVpbGQgcHJvYmxlbSBmaXhlZC4KCkRhbmllbCAoMTUgSmFudWFyeSAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCBzb21lIG5lY2Vzc2FyeSBlc2NhcGluZyBuZWVkZWQgaW4gdGhlCiAgYWNpbmNsdWRlLm00IGZpbGUgd2hlbiBhdXRvbWFrZSAxLjggb3IgbGF0ZXIgaXMgdXNlZC4KCkRhbmllbCAoMTQgSmFudWFyeSAyMDA0KQotIFZpbmNlbnQgQnJvbm5lciBmaXhlZCB0aGUgQ3VybF9yZXNvbHYoKSByZXR1cm4gY29kZS4gVGhpcyBleHRlbmRzIHRoZSBmaXgKICBTdGV2ZSBHcmVlbiBwcm92aWRlZCBvbiBkZWNlbWJlciAzLi4uCgpEYW5pZWwgKDEzIEphbnVhcnkgMjAwNCkKLSBMdWtlIENhbGwgbWFkZSB0aGUgd2luMzIgdmVyc2lvbiBvZiB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nIGZ1bmN0aW9uIHN1cHBvcnQKICBiYWNrc3BhY2UuCgotIERhbiBGYW5kcmljaCBmaXhlZCB0aGUgaHVnZWhlbHAgc291cmNlIGZpbGUgdG8gY29udGFpbiBib3RoIGEgY29tcHJlc3NlZCBhbmQKICBhbiB1bmNvbXByZXNzZWQgdmVyc2lvbiBpbiB0aGUgZGlzdHJpYnV0aW9uLCBzbyB0aGF0IG1vcmUgcGVvcGxlIGVhc2llciBjYW4KICBidWlsZCBjdXJsIHdpdGggdGhlIGNvbXByZXNzZWQgdmVyc2lvbi4KCi0gRGllZ28gQ2Fzb3JyYW4gYnJvdWdodCBhbm90aGVyIEFtaWdhT1MgYnVpbGQgcGF0Y2ggZm9yIG5hdGl2ZSBBbWlnYSBidWlsZHMuCgotIE1hdHQgVmVlbnN0cmEgdXBkYXRlZCB0aGUgTWFjIE9TIFggZnJhbWV3b3JrIGZpbGVzLgoKLSBCcmlhbiBSIER1ZmZ5IGJyb3VnaHQgYSBzZWN0aW9uIHRvIHRoZSBJTlNUQUxMIGZpbGUgb24gaG93IHRvIGJ1aWxkIGEKICBTU0wtZW5hYmxlZCBjdXJsIHVzaW5nIHRoZSBmcmVlIEJvcmxhbmQgQysrIGNvbXBpbGVyLiBIZSBhbHNvIHVwZGF0ZWQgdGhlCiAgQm9ybGFuZCBsaWIvTWFrZWZpbGUuYjMyLgoKLSBJIGZpeGVkIHRoZSB0ZXN0IGNhc2UgNTA5IHdoaWNoIEkgYnJva2UgeWVzdGVyZGF5LiBOb3cgdGhlIGxpYnRlc3QgYXJlCiAgY29tcGlsZWQgd2l0aCBhbiBpbmNsdWRlIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIGxpYnJhcnkncyBzb3VyY2UgZGlyLCBzbwogIHRoYXQgdGhlIGxpYnRlc3RzIGNhbiBpbmNsdWRlIGZpbGVzIGZyb20gdGhlIHNvdXJjZSB0cmVlLiBUaGlzIHdhcyBtYWRlIHRvCiAgbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgdGhlIFVTRV9TU0xFQVkgZGVmaW5lIGluIHRoZSBsaWJyYXJ5IHRlc3QgZmlsZXMuCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgYnJvdWdodCBjb2RlIHRoYXQgbm93IGFsbG93cyBhIGNhbGxiYWNrIHRvIG1vZGlmaWVkIHRoZSBVUkwKICBldmVuIHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSBpcyB1c2VkLCBhbmQgdGhlbiBsaWJjdXJsIHdpbGwgc2ltdWxhdGUgYQogICJmb2xsb3cgbG9jYXRpb24iIHRvIHRoYXQgbmV3IFVSTC4gVGVzdCA1MDkgd2FzIGFkZGVkIHRvIHRlc3QgdGhpcyBmZWF0dXJlLgoKLSBFeHRlbmRlZCB0aGUgdGltZSB3ZSByZXRyeSBzZXJ2ZXJzIGluIHRoZSB0ZXN0IHNjcmlwdCwgYW5kIEkgYWxzbyBtYWRlIGl0CiAgcmV0cnkgdGhlIGh0dHBzIGFuZCBmdHBzIHNlcnZlcnMgYmVmb3JlIHRoZXkgYXJlIGNvbnNpZGVyZWQgYmFkLiBJIGJlbGlldmUKICB0aGUgcHJldmlvdXMgYXBwcm9hY2ggY291bGQgdHVybiBwcm9ibGVtYXRpYyBvbiByZWFsbHkgc2xvdyBob3N0cy4KClZlcnNpb24gNy4xMS4wLXByZTEgKDEyIEphbnVhcnkgMjAwNCkKCkRhbmllbCAoMTEgSmFudWFyeSAyMDA0KQotIERvbWluaWNrIE1lZ2xpbyBwb2ludGVkIG91dCBGVFBTIHNob3VsZCB1c2UgZGVmYXVsdCBwb3J0IDk5MCBhY2NvcmRpbmcgdG8KICBJQU5BLgoKRGFuaWVsICg4IEphbnVhcnkgMjAwNCkKLSBGaXhlZCB0aGUgU1BORUdPIGNvbmZpZ3VyZSBjaGVjayB0byBub3QgdXNlIC1SIG9yIG90aGVyIG5vbi1wb3J0YWJsZSBvcHRpb25zCiAgaW4gdGhlIExERkxBR1MuIFJlcG9ydGVkIGJ5IFBpZXJyZSBpbiBidWcgcmVwb3J0ICM4NzI5MzAuCgpEYW5pZWwgKDUgSmFudWFyeSAyMDA0KQotIERhbiBGYW5kcmljaCBwcm92aWRlZCBhIGZpeCBvbiBvdXIgemxpYiB1c2FnZS4KCi0gRGF2aWQgSiBNZXllcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlIGxhcmdlIGZpbGUgc3VwcG9ydCB0byBsaWJjdXJsIHdhcwogIGFwcGxpZWQuIE5ldyBjdXJsX2Vhc3lfc2V0b3B0IG9wdGlvbnMgdGhhdCBhY2NlcHQgJ29mZl90JyBhcmd1bWVudHMgYXJlOgoKICBJTkZJTEVTSVpFX0xBUkdFCiAgUkVTVU1FX0ZST01fTEFSR0UKICBNQVhGSUxFU0laRV9MQVJHRQoKRGFuaWVsICg0IEphbnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBEb21pbmljayBNZWdsaW8ncyBjb21tZW50cywgSSBtYWRlIG91ciBwcml2YXRlIHZlcnNpb24gb2YKICBnZXR0aW1lb2ZkYXkoKSBkZWNsYXJlZCBzdGF0aWMuIFRoaXMgd291bGQgb3RoZXJ3aXNlIGNvbGxpZGUgd2l0aCB0aGUgc2FtZQogIGZ1bmN0aW9uIGluIG90aGVyIGxpYnMgKGxpa2UgYXJlcyBmb3IgZXhhbXBsZSkuCgotIEFkZGVkIERvbWluaWNrIE1lZ2xpbydzIGRlc2NyaXB0aW9uIG9uIGhvdyB0byBidWlsZCBsaWJjdXJsIHdpdGggYXJlcwogIG9uIHdpbjMyLgo=