RGFuaWVsICgyNSBEZWNlbWJlciAyMDA0KQotIFJlbW92ZWQgc3JjL2NvbmZpZy5oLmluIGZyb20gQ1ZTLCBpdCBpcyBub3cgY29waWVkIGZyb20gdGhlIChnZW5lcmF0ZWQpCiAgbGliL2NvbmZpZy5oLmluIGluc3RlYWQsIGFzIHRoZXkgY2FuIHZlcnkgd2VsbCBiZSB0aGUgc2FtZS4gVGhpcyByZW1vdmVzIGEKICAibWFudWFsIGhhc3NsZSIuIFlvdSBtYXkgd2FudCB0byByZS1ydW4gYnVpbGRjb25mIG5vdy4KCi0gV2VybmVyIEtvY2ggZmlsZWQgRGViaWFuIGJ1ZyByZXBvcnQgIzI4Njc5NCwgbWVudGlvbmluZyB0aGF0IGN1cmwgY29udGFpbmVkCiAgbm9uLWZyZWUgKGJ5IERlYmlhbidzIHZpZXcpIHNvdXJjZSBjb2RlLiBUaGlzIHdhcyBBbmd1cyBNYWNrYXkncwogIHNyYy9nZXRwYXNzLmMgc291cmNlIGNvZGUuIEkgdHJpZWQgdG8gY29udGFjdCBoaW0gYWJvdXQgaXQgdG8gcXVpY2tseSBzb2x2ZQogIHRoaXMgaXNzdWUsIGJ1dCBoaXMgZW1haWwgYWRkcmVzc2VzIGJvdW5jZSBhbmQgSSBnb3Qgc29tZSB0aW1lICJvdmVyIiBhbmQKICByZWltcGxlbWVudGVkIHRoZSBmdW5jdGlvbmFsaXR5IG9uY2UgYnJvdWdodCBieSBBbmd1cy4gV2Ugbm8gbG9uZ2VyIHVzZSBhbnkKICBvZiBBbmd1cycgb3JpZ2luYWwgY29kZSBhbmQgdGhlIG5ldyBmdW5jdGlvbiBpcyBtdWNoIHNpbXBsZXIgKElNTykuIElzc3VlCiAgc29sdmVkLgoKRGFuaWVsICgyNCBEZWNlbWJlciAyMDA0KQotIERhdmlkIFNoYXcgYWRkZWQgLS1wcm90b2NvbHMgdG8gY3VybC1jb25maWcsIHNvIHRoYXQgaXQgbm93IGxpc3RzIGFsbAogIHByb3RvY29scyBsaWJjdXJsIHdhcyBidWlsdCB0byBzdXBwb3J0LiAtLWZlYXR1cmUgbm8gbG9uZ2VyIGxpc3RzIGRpc2FibGVkCiAgcHJvdG9jb2xzLgoKRGFuaWVsICgyMyBEZWNlbWJlciAyMDA0KQotIERhdmlkIFNoYXcgZml4ZWQgdGhlIGNvbmZpZ3VyZSAtLWRpc2FibGUtW3Byb3RvY29sXSB2YXJpYWJsZXMgc28gdGhhdAogIGN1cmwtY29uZmlnIC0tZmVhdHVyZSBub3cgd29ya3MgY29ycmVjdGx5IQoKRGFuaWVsICgyMiBEZWNlbWJlciAyMDA0KQotIFJ1bmUgS2xldmVsYW5kIGZpeGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgZm9yIHJlY2VpdmVkIGNvb2tpZXMgd2l0aCB0aGUKICAocmFyZSkgdmVyc2lvbiBhdHRyaWJ1dGUgc2V0LgoKLSBNYXJjaW4gS29uaWNraSBwcm92aWRlZCB0d28gY29uZmlndXJlIGZpeGVzIGFuZCBhIHNvdXJjZSBmaXggdG8gbWFrZSBjdXJsCiAgYnVpbGQgb3V0LW9mLXRoZS1ib3ggb24gQmVPUy4KCkRhbmllbCAoMjEgRGVjZW1iZXIgMjAwNCkKLSBBZGRlZCB0ZXN0IGNhc2UgMjE3IHRoYXQgdmVyaWZpZWQgQ1VSTElORk9fSFRUUF9DT05ORUNUQ09ERSwgYW5kIEkgbWFkZSB0aGUKICAtdyBvcHRpb24gc3VwcG9ydCAnaHR0cF9jb25uZWN0JyB0byBtYWtlIGl0IGVhc2llciB0byB2ZXJpZnkhCgotIEZpeGVkIGxpYi9zZWxlY3QuYyBpbmNsdWRlIG9yZGVyIHRvIGJ1aWxkIGZpbmUgb24gRnJlZUJTRAoKLSBGaXhlZCBmYWlsZigpJ3MgcmV1c2Ugb2YgdGhlIHZhX2xpc3QgdmFyaWFibGUgdGhhdCBjcmFzaGVkIG9uIEZyZWVCU0QuCiAgUG9pbnRlZCBvdXQgYnkgUGV0ZXIgUGVudGNoZXYuCgpWZXJzaW9uIDcuMTIuMyAoMjAgRGVjZW1iZXIgMjAwNCkKCkRhbmllbCAoMTkgRGVjZW1iZXIgMjAwNCkKLSBJIGludmVzdGlnYXRlZCBvdXIgUEtDUzEyIGJ1aWxkIHByb2JsZW0gb24gU29sYXJpcyAyLjcgd2l0aCBPcGVuU1NMIDAuOS43ZSwKICBhbmQgaXQgdHVybmVkIG91dCB0byBiZSB0aGUgZmF1bHQgb2YgdGhlIHpsaWIgMS4xLjQgaGVhZGVycyBkb2luZyBhIHR5cGVkZWYKICBuYW1lZCAnZnJlZV9mdW5jJyBhbmQgdGhlIE9wZW5TU0wgaGVhZGVycyBoYXZlIGEgcHJvdG90eXBlIHRoYXQgdXNlcwogICdmcmVlX2Z1bmMnIGluIG9uZSBvZiBpdHMgYXJndW1lbnRzLiBUaGlzIGlzIHdoeSB0aGUgY29tcGlsZSBlcnJvcnMgb3V0LgoKICBJbiBvdGhlciB3b3Jkcywgd2UgbmVlZCB0byBpbmNsdWRlIHRoZSBvcGVuc3NsL3BrY3MxMi5oIGhlYWRlciBiZWZvcmUgdGhlCiAgemxpYi5oIGhlYWRlciBhbmQgaXQgYnVpbGRzIGZpbmUuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgZm9yIHRoaXMKICBmaWxlIGFuZCBpdCB0aGVuIGdldHMgaW5jbHVkZWQgZWFybHkgaW4gbGliL3VybGRhdGEuaC4KCkRhbmllbCAoMTggRGVjZW1iZXIgMjAwNCkKLSBTYW11ZWwgTGlzdG9wYWQgYWRkZWQgc3VwcG9ydCBmb3IgUEtDUzEyIGZvcm1hdHRlZCBjZXJ0aWZpY2F0ZXMuCgotIFNhbXVlbCBMaXN0b3BhZCBmaXhlZCAtRSB0byBzdXBwb3J0ICJDOi9wYXRoIiAod2l0aCBmb3J3YXJkIHNsYXNoKSBhcyB3ZWxsLgoKRGFuaWVsICgxNiBEZWNlbWJlciAyMDA0KQotIEdpc2xlIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIGRpcmVjdG9yeSByZS11c2UgZm9yIEZUUC4KCiAgSSBhZGRlZCB0ZXN0IGNhc2UgMjE1IGFuZCAyMTYgdG8gYmV0dGVyIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gRGluYXIgaW4gYnVnIHJlcG9ydCAjMTA4NjEyMSwgZm91bmQgYSBmaWxlIGhhbmRsZSBsZWFrIHdoZW4gYSBtdWx0aXBhcnQKICBmb3JtcG9zdCAoaW5jbHVkaW5nIGEgZmlsZSB1cGxvYWQgcGFydCkgd2FzIGFib3J0ZWQgYmVmb3JlIHRoZSB3aG9sZSBmaWxlCiAgd2FzIHNlbnQuCgpEYW5pZWwgKDE1IERlY2VtYmVyIDIwMDQpCi0gVG9tIExlZSBmb3VuZCBvdXQgdGhhdCBnbG9iYmluZyBvZiBzdHJpbmdzIHdpdGggYmFja3NsYXNoZXMgZGlkbid0IHdvcmsgYXMKICB5b3UnZCBleHBlY3QuIEJhY2tzbGFzaGVzIGFyZSBzdWNoIGEgY2VudHJhbCBwYXJ0IG9mIHdpbmRvd3MgZmlsZSBuYW1lcyB0aGF0CiAgZm9yY2luZyBiYWNrc2xhc2hlcyB0byBoYXZlIHRvIGJlIGVzY2FwZWQgd2l0aCBiYWNrc2xhc2hlcyBpcyBhIGJpdCB0b28KICBhd2t3YXJkIHRvIHVzZXJzLiBTdGFydGluZyBub3csIHlvdSBvbmx5IG5lZWQgdG8gZXNjYXBlIGdsb2JiaW5nIGNoYXJhY3RlcnMKICBzdWNoIGFzIHRoZSBmaXZlIGxldHRlcnM6ICJbXXt9LCIuIEFkZGVkIHRlc3QgY2FzZSAyMTQgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDE0IERlY2VtYmVyIDIwMDQpCi0gSGFyc2hhbCBQcmFkaGFuIHBhdGNoZWQgYSBIVFRQIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBmbGF3OiBpZiB0aGUgdXNlciBuYW1lCiAgYW5kL29yIHBhc3N3b3JkIHdlcmUgbW9kaWZpZWQgYmV0d2VlbiB0d28gcmVxdWVzdHMgb24gYSBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbiwgdGhlIHNlY29uZCByZXF1ZXN0IHdlcmUgc3RpbGwgbWFkZSB3aXRoIHRoZSBmaXJzdCBzZXR1cCEKCiAgSSBhZGRlZCB0ZXN0IGNhc2UgNTE5IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgxMyBEZWNlbWJlciAyMDA0KQotIEdpc2xlIGFkZGVkIENVUkxJTkZPX1NTTF9FTkdJTkVTIHRvIGN1cmxfZWFzeV9nZXRpbmZvKCkgdG8gYWxsb3cgYW4gYXBwCiAgdG8gbGlzdCBhbGwgYXZhaWxhYmxlIGNyeXB0byBFTkdJTkVTLgoKLSBHaXNsZSBmaXhlZCBidWcgcmVwb3J0ICMxMDgzNTQyLCB3aGljaCBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCByZXN1bWluZwogIGxhcmdlIGZpbGUgKD40R0IpIGZpbGU6Ly8gdHJhbnNmZXJzIG9uIHdpbmRvd3MuCgpEYW5pZWwgKDExIERlY2VtYmVyIDIwMDQpCi0gTWFkZSB0aGUgdGVzdCBzdWl0ZSBIVFRQIHNlcnZlciAoc3dzKSBjYXBhYmxlIG9mIHVzaW5nIElQdjYsIGFuZCB0aGVuCiAgZXh0ZW5kZWQgdGhlIHRlc3QgZW52aXJvbm1lbnQgdG8gc3VwcG9ydCB0aGF0IGFuZCBhbHNvIGFkZGVkIHRocmVlIHRlc3QKICBjYXNlcyAoMjQwLCAyNDEsIDI0MikgdGhhdCBydW4gdGVzdHMgdXNpbmcgSVB2Ni4gVGVzdCAyNDIgdXNlcyBhIFVSTCB0aGF0CiAgZGlkbid0IHdvcmsgYmVmb3JlIHRoZSAxMCBkZWMgZml4IGJ5IEthaSBTb21tZXJmZWxkLgoKLSBNYWRlIGEgZmFpbGVkIGZpbGU6Ly8gcmVzdW1lIG91dHB1dCBhbiBlcnJvciBtZXNzYWdlCgotIENvcnJlY3RlZCB0aGUgQ1VSTEVfQkFEX0RPV05MT0FEX1JFU1VNRSBlcnJvciBtZXNzYWdlIGluIGxpYi9zdHJlcnJvci5jCgotIERhbiBGYW5kcmljaDoKCiAgc2ltcGxpZmllZCBhbmQgY29uc29saWRhdGVkIHRoZSBTU0wgY2hlY2tzIGluIGNvbmZpZ3VyZSBhbmQgdGhlIHVzYWdlIG9mIHRoZQogIGRlZmluZXMgaW4gbGliL3NldHVwLmgKCiAgcHJvdmlkZWQgYSBmaXJzdCBsaWJjdXJsLnBjLmluIGZpbGUgZm9yIHBrZy1jb25maWcgKGJ1dCB0aGUgcmVzdWx0IGlzIG5vdAogIGluc3RhbGxlZCBhbnl3aGVyZSBhdCB0aGlzIHBvaW50KQoKICBleHRlbmRlZCB0aGUgY3Jvc3MgY29tcGlsZSBzZWN0aW9uIGluIHRoZSBkb2NzL0lOU1RBTEwgZmlsZQoKRGFuaWVsICgxMCBEZWNlbWJlciAyMDA0KQotIFdoZW4gcHJvdmlkaW5nIHVzZXIgbmFtZSBpbiB0aGUgVVJMIGFuZCBhIElQdjYtc3R5bGUgSVAtYWRkcmVzcyAobGlrZSBpbgogICJmdHA6Ly91c2VyQFs6OjFdL3RtcCIpLCB0aGUgVVJMIHBhcnNlciBkaWRuJ3QgZ2V0IHRoZSBob3N0IGV4dHJhY3RlZAogIHByb3Blcmx5LiAgUmVwb3J0ZWQgYW5kIGZpeGVkIGJ5IEthaSBTb21tZXJmZWxkLgoKRGFuaWVsICg5IERlY2VtYmVyIDIwMDQpCi0gVG9uIFZvb24gcHJvdmlkZWQgYSBjb25maWd1cmUgZml4IHRoYXQgc2hvdWxkIGZpeCB0aGUgbm90b3Jpb3VzIChtb3N0bHkKICByZXBvcnRlZCBvbiBTb2xhcmlzKSBwcm9ibGVtIHdoZXJlIHRoZSBzaXplX3QgY2hlY2sgZmFpbHMgZHVlIHRvIHRoZSBTU0wKICBsaWJzIGJlaW5nIGZvdW5kIGluIGEgZGlyIG5vdCBzZWFyY2hlZCB0aHJvdWdoIGJ5IHRoZSBydW4tdGltZSBsaW5rZXIuCiAgcGF0Y2gtdHJhY2tlciBlbnRyeSAjMTA4MTcwNy4KCi0gQnJ5YW4gSGVuZGVyc29uIHBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgIzEwODE3ODggdGhhdCB0aGUgY3VybC1jb25maWcKICAtLXZlcm51bSBvdXRwdXQgd2Fzbid0IHplcm8gcHJlZml4ZWQgcHJvcGVybHkgKGFzIGNsYWltZWQgaW4gZG9jdW1lbnRhdGlvbikuCiAgVGhpcyBpcyBmaXhlZCBpbiBtYWtldGd6IG5vdy4KCkRhbmllbCAoOCBEZWNlbWJlciAyMDA0KQotIE1hdHQgVmVlbnN0cmEgdXBkYXRlZCB0aGUgbWFjaC1PIGZyYW1ld29yayBmaWxlcyBmb3IgTWFjIE9TIFguCgotIFJlbmUgQmVybmhhcmR0IGZvdW5kIGFuZCBmaXhlZCBhIGJ1ZmZlciBvdmVycnVuIGluIHRoZSBOVExNIGNvZGUsIHdoZXJlCiAgbGliY3VybCBhbHdheXMgYW5kIHVuY29uZGl0aW9uYWxseSBvdmVyd3JvdGUgYSBzdGFjay1iYXNlZCBhcnJheSB3aXRoIDMgemVybwogIGJ5dGVzLiBUaGlzIGlzIG5vdCBhbiBleHBsb2l0YWJsZSBidWZmZXIgb3ZlcmZsb3cuIE5vIG5lZWQgdG8gZ2V0IGFsYXJtZWQuCgpEYW5pZWwgKDcgRGVjZW1iZXIgMjAwNCkKLSBGaXhlZCBzbyB0aGF0IHRoZSBmaW5hbCBlcnJvciBtZXNzYWdlIGlzIHNlbnQgdG8gdGhlIHZlcmJvc2UgaW5mbyAic3RyZWFtIgogIGV2ZW4gaWYgbm8gZXJyb3JidWZmZXIgaXMgc2V0LgoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoIGFkZGVkIHRoZSAtLWRpc2FibGUtY29va2llcyBvcHRpb24gdG8gY29uZmlndXJlIHRvIGJ1aWxkCiAgbGliY3VybCB3aXRob3V0IGNvb2tpZSBzdXBwb3J0LiBUaGlzIGlzIG1haW5seSB1c2VmdWwgaWYgeW91IHdhbnQgdG8gYnVpbGQgYQogIG1pbmltYWxpc3RpYyBsaWJjdXJsIHdpdGggbm8gY29va2llcyBzdXBwb3J0IGF0IGFsbC4gTGlrZSBmb3IgZW1iZWRkZWQKICBzeXN0ZW1zIG9yIHNpbWlsYXIuCgotIFJpY2hhcmQgQXR0ZXJlciBmaXhlZCBsaWJjdXJsJ3Mgd2F5IG9mIGRlYWxpbmcgd2l0aCB0aGUgRVBTVgogIHJlc3BvbnNlLiBQcmV2aW91c2x5LCBsaWJjdXJsIHdvdWxkIHJlLXJlc29sdmUgdGhlIGhvc3QgbmFtZSB3aXRoIHRoZSBuZXcKICBwb3J0IG51bWJlciBhbmQgYXR0ZW1wdCB0byBjb25uZWN0IHRvIHRoYXQsIHdoaWxlIGl0IHNob3VsZCB1c2UgdGhlIElQIGZyb20KICB0aGUgY29udHJvbCBjaGFubmVsLiBUaGlzIGJ1ZyBtYWRlIGl0IGhhcmQgdG8gRVBTViBmcm9tIGFuIEZUUCBzZXJ2ZXIgd2l0aAogIG11bHRpcGxlIElQIGFkZHJlc3NlcyEKCkRhbmllbCAoMyBEZWNlbWJlciAyMDA0KQotIEJ1ZyByZXBvcnQgIzEwNzgwNjY6IHdoZW4gYSBjaHVua2VkIHRyYW5zZmVyIHdhcyBwcmUtbWF0dXJlbHkgY2xvc2VkIGV4YWN0bHkKICBhdCBhIGNodW5rIGJvdW5kYXJ5IGl0IHdhcyBub3QgY29uc2lkZXJlZCBhbiBlcnJvciBhbmQgdGh1cyB3ZW50IHVubm90aWNlZC4KICBGaXhlZCBieSBNYXVyaWNlIEJhcm51bS4KCiAgQWRkZWQgdGVzdCBjYXNlIDIwNyB0byB2ZXJpZnkuCgpEYW5pZWwgKDIgRGVjZW1iZXIgMjAwNCkKLSBGaXhlZCB0aGUgQ09OTkVDVCBsb29wIHRvIGRlZmF1bHQgdGltZW91dCB0byAzNjAwIHNlY29uZHMuCgogIEFkZGVkIHRlc3QgY2FzZSAyMDYgdGhhdCBtYWtlcyBDT05ORUNUIHdpdGggRGlnZXN0LgoKICBGaXhlZCBhIGZsYXcgdGhhdCBwcmVwZW5kZWQgIihuaWwpIiB0byB0aGUgaW5pdGlhbCBDT05ORUNUIHJxZXVlc3QncyB1c2VyLQogIGFnZW50IGZpZWxkLgoKRGFuaWVsICgzMCBOb3ZlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCdzIGZpeCBmb3IgbGlieiAxLjEgYW5kICJleHRyYSBmaWVsZCIgdXNhZ2UgaW4gYSBnemlwIHN0cmVhbQoKLSBEYW4gYWxzbyBoZWxwZWQgbWUgd2l0aCBpbnB1dCBkYXRhIHRvIGNyZWF0ZSB0aHJlZSBtb3JlIHRlc3QgY2FzZXMgZm9yIHRoZQogIC0tY29tcHJlc3NlZCBvcHRpb24uCgpEYW5pZWwgKDI5IE5vdmVtYmVyIDIwMDQpCi0gSSBpbXByb3ZlZCB0aGUgdGVzdCBzdWl0ZSB0byBlbmFibGUgYmluYXJ5IGNvbnRlbnRzIGluIHRoZSB0ZXN0cyAoYnkgcHJvdmluZwogIGl0IGJhc2U2NCBlbmNvZGVkKSwgbGlrZSBmb3IgdGVzdGluZyBkZWNvbXByZXNzIGV0Yy4gQWRkZWQgdGVzdCAyMjAgYW5kIDIyMQogIGZvciB0aGlzIHB1cnBvc2UuIFRlc3RzIGNhbiBub3cgYWxzbyBkZXBlbmQgb24gbGlieiB0byBydW4uCgotIEFzIHJlcG9ydGVkIGJ5IFJlaW5vdXQgdmFuIFNjaG91d2VuIGluIE1hbmRyYWtlJ3MgYnVnIHRyYWNrZXIgYnVnIDEyMjg1CiAgKGh0dHA6Ly9xYS5tYW5kcmFrZXNvZnQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMjI4NSksIHdoZW4gY29ubmVjdGluZyB0byBhbgogIElQdjYgaG9zdCB3aXRoIEZUUCwgLS1kaXNhYmxlLWVwc3YgKG9yIC0tZGlzYWJsZS1lcHJ0KSBlZmZlY3RpdmVseSBkaXNhYmxlcwogIHRoZSBhYmlsaXR5IHRvIHRyYW5zZmVyIGEgZmlsZS4gTm93LCB3aGVuIGNvbm5lY3RlZCB0byBhbiBGVFAgc2VydmVyIHdpdGgKICBJUHY2LCB0aGVzZSBGVFAgY29tbWFuZHMgY2FuJ3QgYmUgZGlzYWJsZWQgZXZlbiBpZiBhc2tlZCB0byB3aXRoIHRoZQogIGF2YWlsYWJsZSBsaWJjdXJsIG9wdGlvbnMuCgpEYW5pZWwgKDI2IE5vdmVtYmVyIDIwMDQpCi0gQXMgcmVwb3J0ZWQgaW4gTWFuZHJha2UncyBidWcgdHJhY2tlciBidWcgMTIyODkKICAoaHR0cDovL3FhLm1hbmRyYWtlc29mdC5jb20vc2hvd19idWcuY2dpP2lkPTEyMjg5KSwgY3VybCB3b3VsZCBwcmludCBhCiAgbmV3bGluZSB0byAiZmluaXNoIiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYWZ0ZXIgZWFjaCByZWRpcmVjdCBhbmQgbm90IG9ubHkKICBhZnRlciBhIGNvbXBsZXRlZCB0cmFuc2Zlci4KCkRhbmllbCAoMjUgTm92ZW1iZXIgMjAwNCkKLSBGVFAgaW1wcm92ZW1lbnRzOgoKICBJZiBFUFNWLCBFUFJUIG9yIExQUlQgaXMgdHJpZWQgYW5kIGRvZXNuJ3Qgd29yaywgaXQgd2lsbCBub3QgYmUgcmV0cmllZCBvbgogIHRoZSBzYW1lIHNlcnZlciBhZ2FpbiBldmVuIGlmIGEgZm9sbG93aW5nIHJlcXVlc3QgaXMgbWFkZSB1c2luZyBhIHBlcnNpc3RlbnQKICBjb25uZWN0aW9uLgoKICBJZiBhIHNlY29uZCByZXF1ZXN0IGlzIG1hZGUgdG8gYSBzZXJ2ZXIsIHJlcXVlc3RpbmcgYSBmaWxlIGZyb20gdGhlIHNhbWUKICBkaXJlY3RvcnkgYXMgdGhlIHByZXZpb3VzIHJlcXVlc3Qgb3BlcmF0ZWQgb24sIGxpYmN1cmwgd2lsbCBubyBsb25nZXIgbWFrZQogIHRoYXQgbG9uZyBzZXJpZXMgb2YgQ1dEIGNvbW1hbmRzIGp1c3QgdG8gZW5kIHVwIG9uIHRoZSBzYW1lIHNwb3QuIE5vdGUgdGhhdAogIHRoaXMgaXMgb25seSBmb3IgKmV4YWN0bHkqIHRoZSBzYW1lIGRpci4gVGhlcmUgaXMgc3RpbGwgcm9vbSBmb3IgaW1wcm92ZW1lbnRzCiAgdG8gb3B0aW1pemUgdGhlIENXRC1zZW5kaW5nIHdoZW4gdGhlIGRpcnMgYXJlIG9ubHkgc2xpZ2h0bHkgZGlmZmVyZW50LgoKICBBZGRlZCB0ZXN0IDIxMCwgMjExIGFuZCAyMTIgdG8gdmVyaWZ5IHRoZXNlIGNoYW5nZXMuIEhhZCB0byBpbXByb3ZlIHRoZQogIHRlc3Qgc2NyaXB0IHRvbyBhbmQgYWRkZWQgYSBuZXcgcHJpbWl0aXZlIHRvIHRoZSB0ZXN0IGZpbGUgZm9ybWF0LgoKRGFuaWVsICgyNCBOb3ZlbWJlciAyMDA0KQotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZGV0ZWN0IHNlbGVjdCBwcm9wZXJseSB3aGVuIHJ1bgogIHdpdGggTXN5cy9NaW5ndyBvbiBXaW5kb3dzLgoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDA0KQotIE1hZGUgSFRUUCBQVVQgYW5kIFBPU1QgcmVxdWVzdHMgbm8gbG9uZ2VyIHVzZSBIRUFEIHdoZW4gZG9pbmcgbXVsdGktcGFzcwogIGF1dGggbmVnb3RpYXRpb24gKE5UTE0sIERpZ2VzdCBhbmQgTmVnb3RpYXRlKSwgYnV0IGluc3RlYWQgdXNlIHRoZSByZXF1ZXN0CiAga2V5d29yZCAicHJvcGVybHkiLiBEZXRhaWxzIGluIGxpYi9SRUFETUUuaHR0cGF1dGguIFRoaXMgYWxzbyBpbnRyb2R1Y2VzCiAgQ1VSTE9QVF9JT0NUTEZVTkNUSU9OIGFuZCBDVVJMT1BUX0lPQ1RMREFUQSwgdG8gYmUgdXNlZCBieSBhcHBzIHRoYXQgdXNlIHRoZQogICJhbnkiIGF1dGggYWx0ZXJuYXRpdmUgYXMgdGhlbiBsaWJjdXJsIG1heSBuZWVkIHRvIHNlbmQgdGhlIFBVVC9QT1NUIGRhdGEKICBtb3JlIHRoYW4gb25jZSBhbmQgdGh1cyBtYXkgbmVlZCB0byBhc2sgdGhlIGFwcCB0byAicmV3aW5kIiB0aGUgcmVhZCBkYXRhCiAgc3RyZWFtIHRvIHN0YXJ0LgoKICBTZWUgYWxzbyB0aGUgbmV3IGV4YW1wbGUgdXNpbmcgdGhpczogZG9jcy9leGFtcGxlcy9hbnlhdXRocHV0LmMKCi0gRGF2aWQgUGhpbGxpcHMgZW5oYW5jZWQgdGVzdCA1MTguIEkgbWFkZSBpdCBkZXBlbmQgb24gYSAiZmVhdHVyZSIgc28gdGhhdAogIHN5c3RlbXMgd2l0aG91dCBnZXRybGltaXQoKSB3b24ndCBhdHRlbXB0IHRvIHRlc3QgNTE4LiBjb25maWd1cmUgbm93IGNoZWNrcwogIGZvciBnZXRybGltaXQoKSBhbmQgc2V0cmxpbWl0KCkgZm9yIHRoaXMgdGVzdCBjYXNlLgoKRGFuaWVsICgxOCBOb3ZlbWJlciAyMDA0KQotIERhdmlkIFBoaWxsaXBzIGZpeGVkIGxpYmN1cmwgdG8gbm90IGNyYXNoIGFueW1vcmUgd2hlbiBtb3JlIHRoYW4gRkRfU0VUU0laRQogIGZpbGUgZGVzY3JpcHRvcnMgYXJlIGluIHVzZS4gVGVzdCBjYXNlIDUxOCBhZGRlZCB0byB2ZXJpZnkuCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDQpCi0gVG8gdGVzdCBteSBmaXggZm9yIHRoZSBDVVJMSU5GT19SRURJUkVDVF9USU1FIGJ1ZywgSSBhZGRlZCB0aW1lX3JlZGlyZWN0IGFuZAogIG51bV9yZWRpcmVjdHMgc3VwcG9ydCB0byB0aGUgLXcgd3JpdGVvdXQgb3B0aW9uIGZvciB0aGUgY29tbWFuZCBsaW5lIHRvb2wuCgotIFdvamNpZWNoIFp3aWVma2EgZm91bmQgb3V0IHRoYXQgQ1VSTElORk9fUkVESVJFQ1RfVElNRSBkaWRuJ3Qgd29yayBhcwogIGRvY3VtZW50ZWQuCgpEYW5pZWwgKDEyIE5vdmVtYmVyIDIwMDQpCi0gR2lzbGUgVmFuZW0gbW9kaWdpZWQgdGhlIE1TVkMgYW5kIE5ldHdhcmUgbWFrZWZpbGVzIHRvIGJ1aWxkIHdpdGhvdXQKICBsaWJjdXJsLmRlZgoKLSBEYW4gRmFuZHJpY2ggYWRkZWQgdGhlIC0tZGlzYWJsZS1jcnlwdG8tYXV0aCBvcHRpb24gdG8gY29uZmlndXJlIHRvIGFsbG93CiAgbGliY3VybCB0byBidWlsZCB3aXRob3V0IERpZ2VzdCBzdXBwb3J0LiAoSSBmaWd1cmUgaXQgc2hvdWxkIGFsc28gZXhwbGljaXRseQogIGRpc2FibGUgTmVnb3RpYXRlIGFuZCBOVExNLikKCi0gICAgICAgICAgICAgICAgICoqKiBNb2RpZmllZCBCZWhhdmlvdXIgQWxlcnQgKioqCgogIFNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIHRvIE5VTEwgd2lsbCBubyBsb25nZXIgZG8gYSBHRVQuCgogIFNldHRpbmcgQ1VSTE9QVF9QT1NURklFTERTIHRvICIiIHdpbGwgc2VuZCBhIHplcm8gYnl0ZSBQT1NUIGFuZCBzZXR0aW5nCiAgQ1VSTE9QVF9QT1NURklFTERTIHRvIE5VTEwgYW5kIENVUkxPUFRfUE9TVEZJRUxEU0laRSB0byB6ZXJvIHdpbGwgYWxzbyBtYWtlCiAgYSB6ZXJvIGJ5dGUgUE9TVC4gQWRkZWQgdGVzdCBjYXNlIDUxNSB0byB2ZXJpZnkgdGhpcy4KCiAgU2V0dGluZyBDVVJMT1BUX0hUVFBQT1NUIHRvIE5VTEwgbWFrZXMgYSB6ZXJvIGJ5dGUgcG9zdC4gQWRkZWQgdGVzdCBjYXNlIDUxNgogIHRvIHZlcmlmeSB0aGlzLgoKICBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgbXVzdCBub3cgYmUgc2V0IHRvIC0xIHRvIHNpZ25hbCAid2UgZG9uJ3Qga25vdyIuCiAgU2V0dGluZyBpdCB0byB6ZXJvIHNpbXBseSBzYXlzIHRoaXMgaXMgYSB6ZXJvIGJ5dGUgUE9TVC4KCiAgV2hlbiBwcm92aWRpbmcgUE9TVCBkYXRhIHdpdGggYSByZWFkIGNhbGxiYWNrLCBzZXR0aW5nIHRoZSBzaXplIHVwIGZyb250CiAgaXMgbm93IG1hZGUgd2l0aCBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgYW5kIG5vdCB3aXRoIENVUkxPUFRfSU5GSUxFU0laRS4KCkRhbmllbCAoMTEgTm92ZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2ggYWRkZWQgLS1kaXNhYmxlLXZlcmJvc2UgdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWxsb3cgYnVpbGRzCiAgd2l0aG91dCB2ZXJib3NlIHN0cmluZ3MgaW4gdGhlIGNvZGUsIHRvIHNhdmUgc29tZSAxMktCIHNwYWNlLiBNYWtlcyBzZW5zZQogIG9ubHkgZm9yIHN5c3RlbXMgd2l0aCB2ZXJ5IGxpdHRsZSBtZW1vcnkgcmVzb3VyY2VzLgoKLSBKZWZmIFBoaWxsaXBzIGZvdW5kIG91dCB0aGF0IGEgZGF0ZSBzdHJpbmcgd2l0aCBhIHllYXIgYmV5b25kIDIwMzggY291bGQKICBjcmFzaCB0aGUgbmV3IGRhdGUgcGFyc2VyIG9uIHN5c3RlbXMgd2l0aCAzMmJpdCB0aW1lX3QuIFdlIG5vdyBjaGVjayBmb3IKICB0aGlzIGNhc2UgYW5kIGRlYWwgd2l0aCBpdC4KCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwNCkKLSBJIGluc3RhbGxlZCBIZWltZGFsIG9uIG15IERlYmlhbiBib3ggKHVzaW5nIHRoZSBkZWJpYW4gcGFja2FnZSkgYW5kIG5vdGljZWQKICB0aGF0IGNvbmZpZ3VyZSAtLXdpdGgtZ3NzYXBpIGZhaWxlZCB0byBjcmVhdGUgYSBuaWNlIGJ1aWxkLiBGaXhlZCBub3cuCgpEYW5pZWwgKDkgTm92ZW1iZXIgMjAwNCkKLSBHaXNsZSBWYW5lbSBtYXJrZWQgYWxsIGV4dGVybmFsIGZ1bmN0aW9uIGNhbGxzIHdpdGggQ1VSTF9FWFRFUk4gc28gdGhhdCBub3cKICB0aGUgV2luZG93cywgTmV0d2FyZSBhbmQgb3RoZXIgYnVpbGRzIG5vIGxvbmdlciBuZWVkIGxpYmN1cmwuZGVmIG9yIHNpbWlsYXIKICBmaWxlcy4KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDA0KQotIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2hlY2sgZm9yIHRsZC5oIGlmIGxpYmlkbiB3YXMgZGV0ZWN0ZWQsIHNpbmNlCiAgbGliaWRuIDAuMy5YIGRpZG4ndCBoYXZlIHN1Y2ggYSBoZWFkZXIgYW5kIHdlIGRvbid0IHdvcmsgd2l0aCBhbnl0aGluZwogIGJlZm9yZSBsaWJpZG4gMC40LjEgYW55d2F5ISBTdXNlIDkuMSBhcHBhcmVudGx5IHNoaXBzIHdpdGggYSAwLjMuWCB2ZXJzaW9uCiAgb2YgbGliaWRuIHdoaWNoIG1ha2VzIHRoZSBjdXJsIDcuMTIuMiBidWlsZCBmYWlsLiBKZWFuLVBoaWxpcHBlCiAgQmFycmV0dGUtTGFQaWVycmUgaGVscGVkIHBvaW50aW5nIHRoaXMgb3V0LgoKLSBJYW4gR3VsbGl2ZXIgcmVwb3J0ZWQgaW4gZGViaWFuIGJ1ZyByZXBvcnQgIzI3ODY5MTogaWYgY3VybCBpcyBpbnZva2VkIGluIGFuCiAgZW52aXJvbm1lbnQgd2hlcmUgc3RkZXJyIGlzIGNsb3NlZCB0aGUgLXYgb3V0cHV0IHdpbGwgc3RpbGwgYmUgc2VudCB0byBmaWxlCiAgZGVzY3JpcHRvciAyIHdoaWNoIHRoZW4gbWlnaHQgYmUgdGhlIG5ldHdvcmsgc29ja2V0IGhhbmRsZSEgTm93IHdlIGhhdmUgYQogIHdlaXJkIGhhY2sgaW5zdGVhZCB0aGF0IGF0dGVtcHRzIHRvIG1ha2Ugc3VyZSB0aGF0IGZpbGUgZGVzY3JpcHRvciAyIGlzCiAgb3BlbmVkICh3aXRoIGEgY2FsbCB0byBwaXBlKCkpIGJlZm9yZSBsaWJjdXJsIGlzIGNhbGxlZCB0byBkbyB0aGUgdHJhbnNmZXIuCiAgY29uZmlndXJlIG5vdyBjaGVja3MgZm9yIHBpcGUoKSBhbmQgc3lzdGVtcyB3aXRob3V0IHBpcGUgZG9uJ3QgZ2V0IHRoZSB3ZWlyZAogIGhhY2sgZG9uZS4KCkRhbmllbCAoNSBOb3ZlbWJlciAyMDA0KQotIFRpbSBTbmVkZG9uIG1hZGUgbGliY3VybCBzZW5kIG5vIG1vcmUgdGhhbiA2NEsgaW4gYSBzaW5nbGUgZmlyc3QgY2h1bmsgd2hlbgogIGRvaW5nIGEgaHVnZSBQT1NUIG9uIFZNUywgYXMgdGhpcyBpcyBhIHN5c3RlbSBsaW1pdGF0aW9uLiBEZWZhdWx0IG9uIGdlbmVyYWwKICBzeXN0ZW1zIGlzIDEwMEsuCgpEYW5pZWwgKDQgTm92ZW1iZXIgMjAwNCkKLSBBbmRyZXMgR2FyY2lhIG1hZGUgaXQgYnVpbGQgb24gbWluZ3cgYWdhaW5hLCBteSAtLXJldHJ5IGNvZGUgYnJva2UgdGhlIGJ1aWxkLgoKRGFuaWVsICgyIE5vdmVtYmVyIDIwMDQpCi0gQWRkZWQgLS1yZXRyeS1tYXgtdGltZSB0aGF0IGFsbG93cyBhIG1heGltdW0gdGltZSB0aGF0IG1heSBub3QgaGF2ZSBiZWVuCiAgcmVhY2hlZCBmb3IgYSByZXRyeSB0byBiZSBtYWRlLiBJZiBub3Qgc2V0IHRoZXJlIGlzIG5vIG1heGltdW0gdGltZSwgb25seQogIHRoZSBhbW91bnQgb2YgcmV0cmllcyBzZXQgd2l0aCAtLXJldHJ5LgoKLSBQYXVsIE5vbGFuIHByb3ZpZGVkIGEgcGF0Y2ggdG8gbWFrZSBsaWJjdXJsIGJ1aWxkIG5pY2VseSBvbiBXaW5kb3dzIENFLgoKRGFuaWVsICgxIE5vdmVtYmVyIDIwMDQpCi0gV2hlbiBjcm9zcy1jb21waWxpbmcsIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vIGxvbmdlciBhdHRlbXB0cyB0byB1c2UKICBwa2ctY29uZmlnIG9uIHRoZSBidWlsZCBob3N0IGluIG9yZGVyIHRvIGRldGVjdCBPcGVuU1NMIGNvbXBpbGVyIG9wdGlvbnMuCgpEYW5pZWwgKDI3IE9jdG9iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2g6CgogIEFuIGltcHJvdmVtZW50IHRvIHRoZSBnemlwIGhhbmRsaW5nIG9mIGxpYmN1cmwuIFRoZXJlIHdlcmUgdHdvIHByb2JsZW1zIHdpdGgKICB0aGUgb2xkIHZlcnNpb246IGl0IHdhcyBwb3NzaWJsZSBmb3IgYSBtYWxpY2lvdXMgZ3ppcCBmaWxlIHRvIGNhdXNlIGxpYmN1cmwKICB0byBsZWFrIG1lbW9yeSwgYXMgYSBidWZmZXIgd2FzIG1hbGxvY2VkIHRvIGhvbGQgdGhlIGhlYWRlciBhbmQgbmV2ZXIgZnJlZWQKICBpZiB0aGUgaGVhZGVyIGVuZGVkIHdpdGggbm8gZmlsZSBjb250ZW50cy4gIFRoZSBzZWNvbmQgcHJvYmxlbSBpcyB0aGF0IHRoZQogIDY0IEtpQiBkZWNvbXByZXNzaW9uIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaywgd2hpY2ggY2F1c2VkCiAgdW5leHBlY3RlZGx5IGhpZ2ggc3RhY2sgdXNhZ2UgYW5kIG92ZXJmbG93ZWQgdGhlIHN0YWNrIG9uIHNvbWUgc3lzdGVtcwogIChzb21lb25lIGNvbXBsYWluZWQgYWJvdXQgdGhhdCBpbiB0aGUgbWFpbGluZyBsaXN0IGFib3V0IGEgeWVhciBhZ28pLgoKICBCb3RoIHByb2JsZW1zIGFyZSBmaXhlZCBieSB0aGlzIHBhdGNoLiBUaGUgZmlyc3Qgb25lIGlzIGZpeGVkIHdoZW4gYSByZWNlbnQKICAoMS4yKSB2ZXJzaW9uIG9mIHpsaWIgaXMgdXNlZCwgYXMgaXQgdGFrZXMgY2FyZSBvZiBnemlwIGhlYWRlciBwYXJzaW5nCiAgaXRzZWxmLiAgQSBjaGVjayBmb3IgdGhlIHZlcnNpb24gbnVtYmVyIGlzIGRvbmUgYXQgcnVuLXRpbWUgYW5kIGxpYmN1cmwgdXNlcwogIHRoYXQgZmVhdHVyZSBpZiBpdCdzIHByZXNlbnQuIEkndmUgY3JlYXRlZCBhIGRlZmluZSBPTERfWkxJQl9TVVBQT1JUIHRoYXQKICBjYW4gYmUgY29tbWVudGVkIG91dCB0byBzYXZlIHNvbWUgY29kZSBzcGFjZSBpZiBsaWJjdXJsIGlzIGd1YXJhbnRlZWQgdG8gYmUKICB1c2luZyBhIDEuMiB2ZXJzaW9uIG9mIHpsaWIuCgogIFRoZSBzZWNvbmQgcHJvYmxlbSBpcyBzb2x2ZWQgYnkgZHluYW1pY2FsbHkgYWxsb2NhdGluZyB0aGUgbWVtb3J5IGJ1ZmZlcgogIGluc3RlYWQgb2Ygc3RvcmluZyBpdCBvbiB0aGUgc3RhY2suIFRoZSBhbGxvY2F0aW9uL2ZyZWUgaXMgZG9uZSBmb3IgZXZlcnkKICBpbmNvbWluZyBwYWNrZXQsIHdoaWNoIGlzIHN1Ym9wdGltYWwsIGJ1dCBzaG91bGQgYmUgZHdhcmZlZCBieSB0aGUgYWN0dWFsCiAgZGVjb21wcmVzc2lvbiBjb21wdXRhdGlvbi4KCiAgSSd2ZSBhbHNvIGZhY3RvcmVkIG91dCBzb21lIGNvbW1vbiBjb2RlIGJldHdlZW4gZGVmbGF0ZSBhbmQgZ3ppcCB0byByZWR1Y2UKICB0aGUgY29kZSBmb290cHJpbnQgc29tZXdoYXQuICBJJ3ZlIHRlc3RlZCB0aGUgZ3ppcCBjb2RlIG9uIGEgZmV3IHRlc3QgZmlsZXMKICBhbmQgSSB0cmllZCBkZWZsYXRlIHVzaW5nIHRoZSBmcmVzaG1lYXQubmV0IHNlcnZlciwgYW5kIGl0IGFsbCBsb29rcyBPSy4gSQogIGRpZG4ndCB0cnkgcnVubmluZyBpdCB3aXRoIHZhbGdyaW5kLCBob3dldmVyLgoKLSBBZGRlZCBhIC0tcmV0cnkgb3B0aW9uIHRvIGN1cmwgdGhhdCB0YWtlcyBhIG51bWVyaWNhbCBvcHRpb24gZm9yIHRoZSBudW1iZXIKICBvZiB0aW1lcyB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSByZXRyaWVkLiBJdCBpcyByZXRyaWVkIGlmIGEgdHJhbnNpZW50IGVycm9yCiAgaXMgZGV0ZWN0ZWQgb3IgaWYgYSB0aW1lb3V0IG9jY3VycmVkLiBCeSBkZWZhdWx0LCBpdCB3aWxsIGZpcnN0IHdhaXQgb25lCiAgc2Vjb25kIGJldHdlZW4gdGhlIHJldHJpZXMgYW5kIHRoZW4gZG91YmxlIHRoZSBkZWxheSB0aW1lIGJldHdlZW4gZWFjaCByZXRyeQogIHVudGlsIHRoZSBkZWxheSB0aW1lIGlzIHRlbiBtaW51dGVzIHdoaWNoIHRoZW4gd2lsbCBiZSB0aGUgZGVsYXkgdGltZQogIGJldHdlZW4gYWxsIGZvcnRoY29taW5nIHJldHJpZXMuIFlvdSBjYW4gc2V0IGEgc3RhdGljIGRlbGF5IHRpbWUgd2l0aAogICItLXJldHJ5LWRlbGF5IFtudW1dIiB3aGVyZSBbbnVtXSBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gd2FpdCBiZXR3ZWVuCiAgZWFjaCByZXRyeS4KCkRhbmllbCAoMjUgT2N0b2JlciAyMDA0KQotIFRvbWFzIFBvc3Bpc2VrIGZpbGVkIGJ1ZyByZXBvcnQgIzEwNTMyODcgdGhhdCBwcm92ZWQgLUMgLSBhbmQgLS1mYWlsIG9uIGEKICBmaWxlIHRoYXQgd2FzIGFscmVhZHkgY29tcGxldGVseSBkb3dubG9hZGVkIGNhdXNlZCBhbiBlcnJvciwgd2hpbGUgaXQKICBkb2Vzbid0IGlmIHlvdSBkb24ndCB1c2UgLS1mYWlsISBJIGFkZGVkIHRlc3QgY2FzZSAxOTQgdG8gdmVyaWZ5IHRoZSBmaXguCiAgR3Jyci4gQ1VSTE9QVF9GQUlMT05FUlJPUiBpcyBub3cgYWRkZWQgdG8gdGhlIGxpc3Qgc3R1ZmYgdG8gcmVtb3ZlIGluCiAgbGliY3VybCB2OCBkdWUgdG8gYWxsIHRoZSBrbHVkZ2VzIG5lZWRlZCB0byBzdXBwb3J0IGl0LgoKLSBNb2h1biBCaXN3YXMgZm91bmQgb3V0IHRoYXQgZm9ybXBvc3RpbmcgYSB6ZXJvLWJ5dGUgZmlsZSBkaWRuJ3Qgd29yayB2ZXJ5CiAgZ29vZC4gSSBmaXhlZC4KCkRhbmllbCAoMTkgT2N0b2JlciAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgaXQgcG9zc2libGUgdG8gbWFrZSBGVFAgM3JkIHBhcnR5IHRyYW5zZmVycwogIHdpdGggYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJlaW5nIHRoZSBzYW1lIGhvc3QuIEl0IGNhbiBiZSB1c2VmdWwgaWYKICB5b3Ugd2FudCB0byBtb3ZlIGEgZmlsZSBvbiBhIHNlcnZlciBvciBzaW1pbGFyLgoKLSBHdWlsbGF1bWUgQXJsdWlzb24gYWRkZWQgQ1VSTElORk9fTlVNX0NPTk5FQ1RTIHRvIGFsbG93IGFuIGFwcCB0byBmaWd1cmUKICBvdXQgaG93IG1hbnkgbmV3IGNvbm5lY3RzIGEgcHJldmlvdXMgdHJhbnNmZXIgcmVxdWlyZWQuCgogIEkgYWRkZWQgJXtudW1fY29ubmVjdHN9IHRvIHRoZSBjdXJsIHRvb2wgYW5kIGFkZGVkIHRlc3QgY2FzZSAxOTIgYW5kIDE5MwogIHRvIHZlcmlmeSB0aGUgbmV3IGNvZGUuCgpEYW5pZWwgKDE4IE9jdG9iZXIgMjAwNCkKLSBQZXRlciBXdWxsaW5nZXIgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHNob3VsZCBjYWxsIHNldGxvY2FsZSgpIHByb3Blcmx5IHRvCiAgaW5pdGlhdGUgdGhlIHNwZWNpZmljIGxhbmd1YWdlIG9wZXJhdGlvbnMsIHRvIG1ha2UgdGhlIElETiBzdHVmZiB3b3JrCiAgYmV0dGVyLgoKVmVyc2lvbiA3LjEyLjIgKDE4IE9jdG9iZXIgMjAwNCkKCkRhbmllbCAoMTYgT2N0b2JlciAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgdGhlIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgb3B0aW9uIHdvcmsKICBmaW5lIGV2ZW4gZm9yIHRoaXJkIHBhcnR5IHRyYW5zZmVycy4KCi0gcnVuZWtsIGF0IG9wb2ludC5jb20gZm91bmQgb3V0IChhbmQgcHJvdmlkZWQgYSBmaXgpIHRoYXQgbGliY3VybCBsZWFrZWQKICBtZW1vcnkgZm9yIGNvb2tpZXMgd2l0aCB0aGUgIm1heC1hZ2UiIGZpZWxkIHNldC4KCkdpc2xlICgxNiBPY3RvYmVyIDIwMDQpCi0gSXNzdWUgNTAgaW4gVE9ETy1SRUxFQVNFOyBBZGRlZCBUcmFpYW4gTmljb2xlc2N1J3MgcGF0Y2hlcyBmb3IgdGhyZWFkZWQKICByZXNvbHZlciBvbiBXaW5kb3dzLiBQbHVnZ2VkIHNvbWUgcG90ZW50aWFsIGhhbmRsZSBhbmQgbWVtb3J5IGxlYWtzLgoKRGFuaWVsICgxNCBPY3RvYmVyIDIwMDQpCi0gRXJpYyBWZXJnbmF1ZCBwb2ludGVkIG91dCB0aGF0IGxpYmN1cmwgZGlkbid0IHRyZWF0ID8tbGV0dGVycyBpbiB0aGUgdXNlcgogIG5hbWUgYW5kIHBhc3N3b3JkIGZpZWxkcyBwcm9wZXJseSBpbiBVUkxzLCBsaWtlCiAgZnRwOi8vdXM/ZXI6cGFzcz93b3JkQHNpdGUuY29tLy4gQWRkZWQgdGVzdCAxOTEgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDExIE9jdG9iZXIgMjAwNCkKLSBsaWJjdXJsIG5vdyB1c2VzIFNPX05PU0lHUElQRSBmb3Igc3lzdGVtcyB0aGF0IHN1cHBvcnQgaXQgKE1hYyBPUyBYIDEwLjIgb3IKICBsYXRlciBpcyBvbmUpIHRvIGluaGliaXQgdGhlIFNJR1BJUEUgc2lnbmFsIHdoZW4gd3JpdGluZyB0byBhIHNvY2tldCB3aGlsZQogIHRoZSBwZWVyIGRpZXMuIFRoZSBzYW1lIGVmZmVjdCBpcyBwcm92aWRlIGJ5IHRoZSBNU0dfTk9TSUdOQUwgcGFyYW1ldGVyIHRvCiAgc2VuZCgpIG9uIG90aGVyIHN5c3RlbXMuIEFsYW4gUGluc3RlaW4gdmVyaWZpZWQgdGhlIGZpeC4KCkRhbmllbCAoMTAgT2N0b2JlciAyMDA0KQotIFN5c3RlbXMgd2l0aCA2NGJpdCBsb25ncyBubyBsb25nZXIgdXNlIHN0cnRvbGwoKSBvciBvdXIgc3RydG9sbC0gcmVwbGFjZW1lbnQKICB0byBwYXJzZSA2NCBiaXQgbnVtYmVycy4gc3RydG9sKCkgd29ya3MgZmluZS4gQWRkZWQgYSBjb25maWd1cmUgY2hlY2sgdG8KICBkZXRlY3QgaWYgW2NvbnN0YW50XUxMIHdvcmtzIGFuZCBpZiBzbywgdXNlIHRoYXQgaW4gdGhlIHN0cnRvbGwgcmVwbGFjZW1lbnQKICBjb2RlIHRvIHdvcmsgYXJvdW5kIGNvbXBpbGVyIHdhcm5pbmdzIHJlcG9ydGVkIGJ5IEFuZHkgQ2VkaWxuaWsuCgpHaXNsZSAoNiBPY3RvYmVyIDIwMDQpCi0gRm9yIFVTRV9MSUJJRE4gYnVpbGRzOiBBZGRlZCBUb3AtTGV2ZWwtRG9tYWluIChUTEQpIGNoZWNrIG9mIGhvc3QtbmFtZQogIHVzZWQgaW4gZml4X2hvc3RuYW1lKCkuIENoZWNrcyBpZiBjaGFyYWN0ZXJzIGluICdob3N0LT5uYW1lJyAoaW5kaXJlY3RseQogIHZpYSAnYWNlX2hvc3RuYW1lJykgYXJlIGxlZ2FsIGFjY29yZGluZyB0byB0aGUgVExEIHRhYmxlcyBpbiBsaWJpZG4uCgpEYW5pZWwgKDYgT2N0b2JlciAyMDA0KQotIENoaWgtQ2h1bmcgQ2hhbmcgcmVwb3J0ZWQgdGhhdCBpZiB5b3UgdXNlIENVUkxPUFRfUkVTVU1FX0ZST00gYW5kIGVuYWJsZWQKICBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCBsaWJjdXJsIHJlcG9ydGVkIGVycm9yIGlmIGEgcmVkaXJlY3QgaGFwcGVuZWQgZXZlbgogIGlmIHRoZSBuZXcgVVJMIHdvdWxkIHByb3ZpZGUgdGhlIHJlc3VtZWQgZmlsZS4gVGVzdCBjYXNlIDE4OCBhZGRlZCB0byB2ZXJpZnkKICB0aGUgZml4ICh0b2dldGhlciB3aXRoIGV4aXN0aW5nIHRlc3QgOTkpLgoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgYSBjb25maWd1cmUgZmxhdyBmb3Igc3lzdGVtcyB0aGF0IG5lZWQgYm90aCBuc2wgYW5kIHNvY2tldAogIGxpYnMgdG8gdXNlIGdldGhvc3RieW5hbWUoKS4KCi0gUmVtb3ZlZCB0YWJzIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGZyb20gbG90cyBvZiBzb3VyY2UgZmlsZXMuCgpEYW5pZWwgKDUgT2N0b2JlciAyMDA0KQotIE1hZGUgY29uZmlndXJlIC0td2l0aC1saWJpZG49UEFUSCB0cnkgdGhlIGdpdmVuIFBBVEggYmVmb3JlIHRoZSBkZWZhdWx0CiAgcGF0aHMgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBvdmVycmlkZS4KCi0gSWYgaWRuYV9zdHJlcnJvcigpIGlzIHByZXNlbnQgaW4gbGliaWRuLCB3ZSBjYW4gdXNlIHRoYXQgaW5zdGVhZCBvZiBvdXIKICBpbnRlcm5hbCByZXBsYWNlbWVudC4gVGhpcyBmdW5jdGlvbiB3YXMgYWRkZWQgYnkgU2ltb24gaW4gbGliaWRuIDAuNS42IGFuZAogIGlzIGRldGVjdGVkIGJ5IGNvbmZpZ3VyZS4KCi0gSXQgc2VlbXMgYmFzZW5hbWUoKSBvbiBJUklYIGlzIGluIHRoZSBsaWJnZW4gbGlicmFyeSBhbmQgc2luY2Ugd2UgZG9uJ3QgdXNlCiAgdGhhdCwgY29uZmlndXJlIGZpbmRzIGxpYmdlbi5oIGJ1dCBub3QgYmFzZW5hbWUgYW5kIHRoZW4gd2UgZ2V0IGEgY29tcGlsZXIKICBlcnJvciBiZWNhdXNlIG91ciBiYXNlbmFtZSgpIHJlcGxhY2VtZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIHByb3RvIGluCiAgbGliZ2VuLmguIFN0YXJ0aW5nIG5vdywgd2UgZG9uJ3QgaW5jbHVkZSB0aGUgZmlsZSBpZiBiYXNlbmFtZSB3YXNuJ3QgZm91bmQKICBhcyB3ZWxsLgoKRGFuaWVsICg0IE9jdG9iZXIgMjAwNCkKLSBDaHJpcyBmb3VuZCBhIHJhY2UgY29uZGl0aW9uIHJlc3VsdGluZyBpbiBDVVJMRV9DT1VMRE5UX1JFU09MVkVfSE9TVCBhbmQKICBwb3RlbnRpYWwgY3Jhc2gsIGluIHRoZSB3aW5kb3dzIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXIgY29kZS4KCkRhbmllbCAoMyBPY3RvYmVyIDIwMDQpCi0gUmVwbGFjZWQgdGhlIHVzZSBvZiBpc3NwYWNlKCkgaW4gY29va2llLmMgd2l0aCBvdXIgb3duIHZlcnNpb24gaW5zdGVhZCBzaW5jZQogIHdlIGhhdmUgbW9zdCBkYXRhIGFzICdjaGFyIConIGFuZCB0aGF0IG1ha2VzIHVzIHBhc3MgaW4gbmVnYXRpdmUgdmFsdWVzIGlmCiAgdGhlcmUgaXMgOGJpdCBkYXRhIGluIHRoZSBzdHJpbmcuIENoYW5naW5nIHRvIHVuc2lnbmVkIGNhdXNlcyB0b28gbXVjaAogIHdhcm5pbmdzIG9yIHRvbyBtYW55IHJlcXVpcmVkIHR5cGVjYXN0cyB0byB0aGUgbm9ybWFsIHN0cmluZyBmdW5jdGlvbnMuCiAgSGFyc2hhbCBQcmFkaGFuIGlkZW50aWZpZWQgdGhpcyBwcm9ibGVtLgoKRGFuaWVsICgyIE9jdG9iZXIgMjAwNCkKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmb3VuZCBhIGNhc2Ugd2hlcmUgbGliY3VybCBjb3VsZCByZWFkIGFscmVhZHkgZnJlZWQKICBkYXRhIHdoZW4gQ1VSTE9QVF9WRVJCT1NFIGlzIHVzZWQgYW5kIGEgKHZlcnkpIHBlcnNpc3RlbnQgY29ubmVjdGlvbi4gSXQKICBoYXBwZW5lZCB3aGVuIHRoZSBkbnMgY2FjaGUgZW50cnkgZm9yIHRoZSBjb25uZWN0aW9uIHdhcyBwcnVuZWQgd2hpbGUgdGhlCiAgY29ubmVjdGlvbiB3YXMgc3RpbGwgYWxpdmUgYW5kIHRoZW4gYWdhaW4gcmUtdXNlZC4gV2Ugd29ya2VkIHRvZ2V0aGVyIG9uCiAgdGhpcyBmaXguCgotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIGNvZGUgdGhhdCBkaXNwbGF5cyBhbiBlcnJvciBtZXNzYWdlIHdoZW4gdGhlIChsaWJpZG4KICBiYXNlZCkgSUROIGNvbnZlcnNpb24gZmFpbHMuIFRoaXMgaXMgcmVhbGx5IGR1ZSB0byBhIG1pc3Npbmcgc3VpdGFibGUKICBmdW5jdGlvbiBpbiB0aGUgbGliaWRuIEFQSSB0aGF0IEkgaG9wZSB3ZSBjYW4gcmVtb3ZlIG9uY2UgbGliaWRuIGdldHMgYQogIGZ1bmN0aW9uIGxpa2UgdGhpcy4KCkRhbmllbCAoMSBPY3RvYmVyIDIwMDQpCi0gQWxla3NhbmRhciBNaWxpdm9qZXZpYyByZXBvcnRlZCBhIHByb2JsZW0gaW4gdGhlIFJlZGhhdCBidWd6aWxsYSAoc2VlCiAgaHR0cHM6Ly9idWd6aWxsYS5yZWRoYXQuY29tL2J1Z3ppbGxhL3Nob3dfYnVnLmNnaT9pZD0xMzQxMzMpIGFuZCBub3QgdG8KICBhbnlvbmUgaW52b2x2ZWQgaW4gdGhlIGN1cmwgcHJvamVjdCEgVGhpcyBoYXBwZW5zIHdoZW4geW91IHRyeSB0byBjdXJsIGEKICBmaWxlIGZyb20gYSBwcm9mdHBkIHNpdGUgdXNpbmcgU1NMLiBJdCBzZWVtcyBwcm9mdHBkIHNlbmRzIGEgc29tZXdoYXQKICB1bm9ydGhvZG94IHJlc3BvbnNlIGNvZGUgKDIzMiBpbnN0ZWFkIG9mIDIzMCkuIEkgcmVsYXhlZCB0aGUgcmVzcG9uc2UgY29kZQogIGNoZWNrIHRvIGRlYWwgd2l0aCB0aGlzIGFuZCBzaW1pbGFyIGNhc2VzLgoKLSBCYXNlZCBvbiBGZWRvciBLYXJwZWxldml0Y2gncyBmb3JtcG9zdCBwYXRoIGJhc2VuYW1lIHBhdGNoLCBmaWxlIHBhcnRzIGluCiAgZm9ybXBvc3RzIG5vIGxvbmdlciBpbmNsdWRlIHRoZSBwYXRoIHBhcnQuIElmIHlvdSBfcmVhbGx5XyB3YW50IHRoZW0sIHlvdQogIG11c3QgcHJvdmlkZSB5b3VyIHByZWZlcnJlZCBmdWxsIGZpbGUgbmFtZSB3aXRoIENVUkxGT1JNX0ZJTEVOQU1FLgoKICBBZGRlZCBkZXRlY3Rpb24gZm9yIGxpYmdlbi5oIGFuZCBiYXNlbmFtZSgpIHRvIGNvbmZpZ3VyZS4gTXkgY3VzdG9tCiAgYmFzZW5hbWUoKSByZXBsYWNlbWVudCBmdW5jdGlvbiBmb3Igc3lzdGVtcyB3aXRob3V0IGl0LCBtaWdodCBiZSBhIGJpdCB0b28KICBuYWl2ZS4uLgoKICBVcGRhdGVkIDYgdGVzdCBjYXNlcyB0byBtYWtlIHRoZW0gd29yayB3aXRoIHRoZSBzdHJpcHBlZCBwYXRocy4KCkRhbmllbCAoMzAgU2VwdGVtYmVyIDIwMDQpCi0gTGFycnkgQ2FtcGJlbGwgYWRkZWQgQ1VSTElORk9fT1NfRVJSTk8gdG8gY3VybF9lYXN5X2dldGluZm8oKSB0aGF0IGFsbG93cyBhbgogIGFwcCB0byByZXRyaWV2ZSB0aGUgZXJybm8gdmFyaWFibGUgYWZ0ZXIgYSAoY29ubmVjdCkgZmFpbHVyZS4gSXQgd2lsbCBtYWtlCiAgc2Vuc2UgdG8gcHJvdmlkZSB0aGlzIGZvciBtb3JlIGZhaWx1cmVzIGluIGEgbW9yZSBnZW5lcmljIHdheSwgYnV0IGxldCdzCiAgc3RhcnQgbGlrZSB0aGlzLgoKLSBH/G50ZXIgS25hdWYgYW5kIENhc2V5IE8nRG9ubmVsbCB3b3JrZWQgb3V0IGFuIGV4dHJhICNpZiBjb25kaXRpb24gZm9yIHRoZQogIGN1cmwvbXVsdGkuaCBoZWFkZXIgdG8gd29yayBiZXR0ZXIgaW4gd2luc29jay11c2luZyBhcHBzLgoKLSBKZWFuLVBoaWxpcHBlIEJhcnJldHRlLUxhUGllcnJlIG1hZGUgYnVpbGRjb25mIHJ1biBiZXR0ZXIgb24gTWFjIE9TIFggYnkKICBwcm9wZXJseSB1c2luZyBnbGlidG9vbGl6ZSBpbnN0ZWFkIG9mIHBsYWluIGxpYnRvb2xpemUuIChUaGlzIGlzIG1hZGUgaWYKICBnbGlidG9vbCB3YXMgZm91bmQgYW5kIHVzZWQgaW5zdGVhZCBvZiBwbGFpbiBsaWJ0b29sLikKCkRhbmllbCAoMjkgU2VwdGVtYmVyIDIwMDQpCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgY3VybF9lYXN5X3Jlc2V0KCkgc28gdGhhdCBpdCBkb2Vzbid0IG1pc3Rha2luZ2x5CiAgZW5hYmxlIHRoZSBwcm9ncmVzcyBtZXRlci4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDQpCi0gIk1la29uaWt1bSIgZm91bmQgb3V0IHRoYXQgaWYgeW91IGJ1aWx0IGN1cmwgd2l0aG91dCBTU0wgc3VwcG9ydCwgYWx0aG91Z2gKICB5b3VyIGN1cnJlbnQgU1NMIGluc3RhbGxhdGlvbiBzdXBwb3J0cyBFbmdpbmUsIHRoZSBjb21waWxlIGZhaWxzLgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwNCkKLSBXaGVuIC0td2l0aC1zc2w9UEFUSCBpcyB1c2VkIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0LCBpdCBubyBsb25nZXIgdXNlcwogIHBrZy1jb25maWcgdG8gZmlndXJlIG91dCBleHRyYSBkZXRhaWxzLiBUaGF0IGlzIG5vdyBvbmx5IGRvbmUgaWYgbm8gUEFUSCBpcwogIGluY2x1ZGVkIG9yIGlmIFNTTCBpcyBjaGVja2VkIGZvciBieSBkZWZhdWx0IHdpdGhvdXQgdGhlIC0td2l0aC1zc2wgb3B0aW9uLgoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgcG9pbnRlZCBvdXQgdGhhdCBDVVJMT1BUX1NTTEVOR0lORSBjb3VsZG4ndCBldmVuIGJlIHNldCB0bwogIE5VTEwgd2hlbiBubyBlbmdpbmUgd2FzIHN1cHBvcnRlZC4gSXQgY2FuIG5vdy4KCkRhbmllbCAoMjIgU2VwdGVtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRocmVlIHRlc3QgY2FzZXMgdG8gbm8gbG9uZ2VyIHVzZSAibG9jYWxob3N0IiBidXQgaW5zdGVhZAogIHVzZSAiMTI3LjAuMC4xIiB0byBhdm9pZCByZXF1aXJpbmcgdGhhdCBsb2NhbGhvc3QgcmVzb2x2ZXMgbmljZWx5LgoKLSBKZWFuLUNsYXVkZSBDaGF1dmUgZml4ZWQgYW4gTERBUCBjcmFzaCB3aGVuIG1vcmUgdGhhbiBvbmUgcmVjb3JkIHdhcwogIHJldHJpZXZlZC4KCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDQpCi0gQW5kcmVhcyBSaWVrZSBwb2ludGVkIG91dCB0aGF0IHdoZW4gYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIGEgaG9zdCB3aXRob3V0CiAgYSBzZXJ2aWNlIG9uIHRoZSBzcGVjaWZpZWQgcG9ydCwgY3VybF9lYXN5X3BlcmZvcm0oKSBkaWRuJ3QgcHJvcGVybHkgcHJvdmlkZQogIGFuIGVycm9yIG1lc3NhZ2UgaW4gdGhlIENVUkxPUFRfRVJST1JCVUZGRVIgYnVmZmVyLgoKRGFuaWVsICgxNiBTZXB0ZW1iZXIgMjAwNCkKLSBEYW5pZWwgYXQgdG91Y2h0dW5lcyB1c2VzIHRoZSBGVFArU1NMIHNlcnZlciAiQlNERlRQRC1TU0wgZnJvbQogIGh0dHA6Ly9ic2RmdHBkLXNzbC5zYy5ydS8iIHdoaWNoIGFjY29yZGluZ2x5IGRvZXNuJ3QgcHJvcGVybHkgd29yayB3aXRoIGN1cmwKICB3aGVuICJBVVRIIFNTTCIgaXMgaXNzdWVkIChhbHRob3VnaCB0aGUgc2VydmVyIHJlc3BvbmRzIGZpbmUgYW5kIGV2ZXJ5dGhpbmcpCiAgYnV0IHJlcXVpcmVzIHRoYXQgY3VybCBpc3N1ZXMgIkFVVEggVExTIiBpbnN0ZWFkLiBTZWUKICBodHRwOi8vY3VybC5oYXh4LnNlL2ZlZWRiYWNrL2Rpc3BsYXkuY2dpP2lkPTEwOTUxOTQ0OTM3NjAzJnN1cHBvcnQ9eWVzCgogIEludHJvZHVjaW5nIENVUkxPUFRfRlRQU1NMQVVUSCB0aGF0IGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gc2VsZWN0IHdoaWNoCiAgb2YgdGhlIEFVVEggc3RyaW5ncyB0byBhdHRlbXB0IGZpcnN0LgoKLSBBbm9ueW1vdXMgZmlsZWQgYnVnIHJlcG9ydCAjMTAyOTQ3OCB3aGljaCBpZGVudGlmaWVkIGEgYnVnIHdoZW4geW91IDEpIHVzZWQKICBhIFVSTCB3aXRob3V0IHByb3Blcmx5IHNlcGVyYXRpbmcgdGhlIGhvc3QgbmFtZSBhbmQgdGhlIHBhcmFtZXRlcnMgd2l0aCBhCiAgc2xhc2guIDIpIHRoZSBVUkwgaGFkIHBhcmFtZXRlcnMgdG8gdGhlIHJpZ2h0IG9mIGEgPyB0aGF0IGNvbnRhaW5zIGEgc2xhc2gKICAzKSBjdXJsIHdhcyB0b2xkIHRvIGZvbGxvdyBMb2NhdGlvbjpzIDQpIHRoZSByZXF1ZXN0IGdvdCBhIHJlc3BvbnNlIHRoYXQKICBjb250YWluZWQgYSBMb2NhdGlvbjogdG8gcmVkaXJlY3QgdG8gIi9kaXIiLiBjdXJsIHRoZW4gYXBwZW5kZWQgdGhlIG5ldyBwYXRoCiAgb24gdGhlIHdyb25nIHBvc2l0aW9uIG9mIHRoZSBvcmlnaW5hbCBVUkwuCgogIFRlc3QgY2FzZSAxODcgd2FzIGFkZGVkIHRvIHZlcmlmeSB0aGF0IHRoaXMgd2FzIGZpeGVkIHByb3Blcmx5LgoKRGFuaWVsICgxMSBTZXB0ZW1iZXIgMjAwNCkKLSBBZGRlZCBwYXJzZWRhdGUuYyB0aGF0IGNvbnRhaW5zIGEgcmV3cml0ZSBvZiB0aGUgZGF0ZSBwYXJzZXIgY3VycmVudGx5CiAgcHJvdmlkZWQgYnkgZ2V0ZGF0ZS55LiBUaGUgbmV3IG9uZSBpcyBNVUNIIHNtYWxsZXIgYW5kIHdpbGwgYWxsb3cgdXMgdG8gcnVuCiAgYXdheSBmcm9tIHRoZSB5YWNjL2Jpc29uIGp1bmdsZS4gSXQgaXMgYWxzbyBzbGlnaHRseSBsYWNraW5nIGluIGZlYXR1cmVzCiAgY29tcGFyZWQgdG8gdGhlIG9sZCBvbmUsIGJ1dCBpdCBzdXBwb3J0cyBwYXJzaW5nIG9mIGFsbCBkYXRlIGZvcm1hdHMgSFRUUAogIGludm9sdmVzIChhbmQgYSBmYWlyIGJ1bmNoIG9mIG90aGVycykuCgpEYW5pZWwgKDEwIFNlcHRlbWJlciAyMDA0KQotIEFzIGZvdW5kIG91dCBieSBKb25hcyBGb3JzbWFuLCBjdXJsIGRpZG4ndCBhbGxvdyAtRiB0byBzZXQgQ29udGVudC1UeXBlIG9uCiAgdGV4dC1wYXJ0cy4gU3RhcnRpbmcgbm93LCB3ZSBjYW4gZG8gLUYgIm5hbWU9ZGFuaWVsO3R5cGU9dGV4dC9leHRyYSIuIEFkZGVkCiAgdGVzdCBjYXNlIDE4NiB0byB2ZXJpZnkuCgotIEJ1ZyByZXBvcnQgIzEwMjU5ODYuIFdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246IHdpdGggYSBjdXN0b20gSG9zdDogaGVhZGVyCiAgcmVwbGFjZW1lbnQsIGN1cmwgb25seSByZXBsYWNlZCB0aGUgSG9zdDogaGVhZGVyIG9uIHRoZSBpbml0aWFsIHJlcXVlc3QKICBhbmQgZGlkbid0IHJlcGxhY2UgaXQgb24gdGhlIGZvbGxvd2luZyBvbmVzLiBUaGlzIHJlc3VsdGVkIGluIHJlcXVlc3RzIHdpdGgKICB0d28gSG9zdDogaGVhZGVycy4KCiAgTm93LCBjdXJsIGNoZWNrcyBpZiB0aGUgbG9jYXRpb24gaXMgb24gdGhlIHNhbWUgaG9zdCBhcyB0aGUgaW5pdGlhbCByZXF1ZXN0CiAgYW5kIHRoZW4gY29udGludWVzIHRvIHJlcGxhY2UgdGhlIEhvc3Q6IGhlYWRlci4gQW5kIHdoZW4gaXQgbW92ZXMgdG8gYW5vdGhlcgogIGhvc3QsIGl0IGRvZXNuJ3QgcmVwbGFjZSB0aGUgSG9zdDogaGVhZGVyIGJ1dCBpdCBhbHNvIGRvZXNuJ3QgbWFrZSB0aGUKICBzZWNvbmQgSG9zdDogaGVhZGVyIGdldCB1c2VkIGluIHRoZSByZXF1ZXN0LgoKICBUaGlzIGNoYW5nZSBpcyB2ZXJpZmllZCBieSB0aGUgdHdvIG5ldyB0ZXN0IGNhc2VzIDE4NCBhbmQgMTg1LgoKRGFuaWVsICg4IFNlcHRlbWJlciAyMDA0KQotIE1vZGlmaWVkIHRoZSB0ZXN0IHN1aXRlIHRvIGJlIGFibGUgdG8gdXNlIGFuZCBydW4gd2l0aCBjdXN0b21pemVkIHBvcnQKICBudW1iZXJzLiBUaGlzIHdhcyBhbHdheXMgaW50ZW5kZWQgYnV0IG5ldmVyIGJlZm9yZSBwb3NzaWJsZS4gTm93IGEgc2ltcGxlCiAgY2hhbmdlIGluIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgY2FuIG1ha2UgYWxsIHRlc3RzIHVzZSBkaWZmZXJlbnQgcG9ydHMuCiAgVGhlIGRlZmF1bHQgcG9ydHMgaW4gdXNlIGZyb20gbm93IG9uIGFyZSA4OTkwIHRvIDg5OTMuCgpEYW5pZWwgKDIgU2VwdGVtYmVyIDIwMDQpCi0gTWlub3IgbW9kaWZpY2F0aW9uIG9mIGFuIFNTTC1yZWxhdGVkIGVycm9yIG1lc3NhZ2UuCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDA0KQotIERhdmlkIFRhcmVuZGFzaCBmb3VuZCBvdXQgdGhhdCBjdXJsX211bHRpX2FkZF9oYW5kbGUoKSByZXR1cm5lZAogIENVUkxNX0NBTExfTVVMVElfUEVSRk9STSBpbnN0ZWFkIG9mIENVUkxNX09LLgoKRGFuaWVsICgzMCBBdWd1c3QgMjAwNCkKLSBNYWtlICJQcm94eS1Db25uZWN0aW9uOiBjbG9zZSIgY2xvc2UgdGhlIGN1cnJlbnQgcHJveHkgY29ubmVjdGlvbiwgYXMgUm9tYW4KICBLb2lmbWFuIGZvdW5kIG91dC4KCkRhbmllbCAoMjQgQXVndXN0IDIwMDQpCi0gRml4ZWQgYSBnZXRkYXRlIHByb2JsZW0gYnkgcG9zdC1yZXBsYWNpbmcgdGhlIGdldGRhdGUuYyBmaWxlIGFmdGVyIHRoZQogIGJpc29uL3lhY2MgcHJvY2VzcyB0byBhZGQgdGhlIGZpeCBIYXJzaGFsIFByYWRoYW4gc3VnZ2VzdGVkLiBUaGUgcHJvYmxlbQogIGNhdXNlZCBhIGNyYXNoIG9uIFdpbmRvd3Mgd2hlbiBwYXJzaW5nIHNvbWUgZGF0ZXMuCgpEYW5pZWwgKDIzIEF1Z3VzdCAyMDA0KQotIFJvbWFuIEtvaWZtYW4gcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIHNlbmQgRXhwZWN0OiAxMDAtY29udGludWUgb24gUE9TVHMKICBldmVuIHdoZW4gdG9sZCB0byB1c2UgSFRUUCAxLjAsIHdoaWNoIGlzIG5vdCBjb3JyZWN0LiBUZXN0IGNhc2UgMTgwIGFuZAogIDE4MSB2ZXJpZnkgdGhpcy4KCi0gQWRkZWQgdGVzdCBjYXNlIDE4MiB0byB2ZXJpZnkgdGhhdCB6ZXJvIGJ5dGUgdHJhbnNmZXJzIGNhbGwgdGhlIGNhbGxiYWNrCiAgcHJvcGVybHkuCgpEYW5pZWwgKDIwIEF1Z3VzdCAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgdGhlIHdyaXRlIGNhbGxiYWNrIGdldCBjYWxsZWQgZXZlbiB3aGVuIGEgemVybwogIGJ5dGUgZmlsZSBpcyBkb3dubG9hZGVkLgoKRGFuaWVsICgxOCBBdWd1c3QgMjAwNCkKLSBMaW5nIFRoaW8gcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGxpYmN1cmwgaXMgYnVpbHQgaXB2Ni1lbmFibGVkLCBpdCBzdGlsbCBkaWQKICByZXZlcnNlIEROUyBsb29rdXBzIHdoZW4gZmVkIHdpdGggYSBudW1lcmljYWwgSVAtYWRkcmVzcyAobGlrZQogIGh0dHA6Ly8xMjcuMC4wLjEvKSwgYWx0aG91Z2ggaXQgZG9lc24ndCB3aGVuIGJ1aWx0IGlwdjYtZGlzYWJsZWQuIGxpYmN1cmwKICBzaG91bGQgbmV2ZXIgZG8gcmV2ZXJzZSBsb29rdXBzLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwNCkKLSBLamV0aWwgSmFjb2JzZW4gbm90aWNlZCB0aGF0IHdoZW4gdHJhbnNmZXJyaW5nIGEgZmlsZTovLyBVUkwgcG9pbnRpbmcgdG8gYW4KICBlbXB0eSBmaWxlLCBsaWJjdXJsIHdvdWxkIHJldHVybiB3aXRoIHRoZSBmaWxlIHN0aWxsIG9wZW4uCgotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IHBvaW50ZWQgb3V0IHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbmVlZHMgdG8gZGVmaW5lCiAgX1RIUkVBRF9TQUZFIGZvciBBSVggc3lzdGVtcyB0byBtYWtlIGxpYmN1cmwgYnVpbHQgcmVhbGx5IHRocmVhZC1zYWZlLgoKICBBbHNvIGFkZGVkIGEgY2hlY2sgZm9yIHRoZSB4bGMgY29tcGlsZXIgb24gQUlYLCBhbmQgaWYgdGhhdCBpcyBkZXRlY3Qgd2UgdXNlCiAgdGhlIC1xdGhyZWFkZWQgY29tcGlsZXIgb3B0aW9uCgpEYW5pZWwgKDE2IEF1Z3VzdCAyMDA0KQotIGxpYmN1cmwgbm93IGFsbG93cyBhIGN1c3RvbSAiQWNjZXB0LUVuY29kaW5nOiIgaGVhZGVyIG92ZXJyaWRlIHRoZQogIGludGVybmFsbHkgc2V0IG9uZSB0aGF0IGdldHMgc2V0IHdpdGggQ1VSTE9QVF9FTkNPRElORy4gUG9pbnRlZCBvdXQgYnkgQWxleC4KCi0gUm9sYW5kIEtyaWthdmEgZm91bmQgYW5kIGZpeGVkIGEgY29va2llIHByb2JsZW0gd2hlbiB1c2luZyBhIHByb3h5ICh0aGUKICBwYXRoIG1hdGNoaW5nIHdhcyB3cm9uZykuIEkgYWRkZWQgdGVzdCBjYXNlIDE3OSB0byB2ZXJpZnkgdGhhdCB3ZSBub3cgZG8KICByaWdodC4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDQpCi0gQ2FzZXkgTydEb25uZWxsIGZpeGVkIHNvbWUgTVNWQyBtYWtlZmlsZSB0YXJnZXRzIHRvIGxpbmsgcHJvcGVybHkuCgpEYW5pZWwgKDExIEF1Z3VzdCAyMDA0KQotIGNvbmZpZ3VyZSBub3cgZGVmaW5lcyBfWE9QRU5fU09VUkNFIHRvIDUwMCBvbiBzeXN0ZW1zIHRoYXQgbmVlZCBpdCB0byBidWlsZAogIHdhcm5pbmctZnJlZSAodGhlIG9ubHkga25vd24gb25lIHNvIGZhciBpcyBub24tZ2NjIGJ1aWxkcyBvbiA2NGJpdCBTR0kKICBJUklYKS4gKFJldmVydGVkIHRoaXMgY2hhbmdlIGxhdGVyIGFzIGl0IGNhdXNlZCBjb21waWxlciBlcnJvcnMuKQoKLSB0aGUgRlRQIGNvZGUgbm93IGluY2x1ZGVzIHRoZSBzZXJ2ZXIgcmVzcG9uc2UgaW4gdGhlIGVycm9yIG1lc3NhZ2Ugd2hlbiB0aGUKICBzZXJ2ZXIgZ2l2ZXMgYmFjayBhIDUzMCBhZnRlciB0aGUgcGFzc3dvcmQgaXMgcHJvdmlkZWQsIGFzIGl0IGlzbid0CiAgbmVjZXNzYXJ5IGJlY2F1c2Ugb2YgYSBiYWQgdXNlciBuYW1lIG9yIHBhc3N3b3JkLgoKVmVyc2lvbiA3LjEyLjEgKDEwIEF1Z3VzdCAyMDA0KQoKRGFuaWVsICgxMCBBdWd1c3QgMjAwNCkKLSBJbiBPcGVuU1NMIDAuOS43ZCBhbmQgZWFybGllciwgQVNOMV9TVFJJTkdfdG9fVVRGOCBmYWlscyBpZiB0aGUgaW5wdXQgaXMKICBhbHJlYWR5IFVURi04IGVuY29kZWQuIFRoaXMgbWFkZSB0aGUgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGZhaWwgaWYgdGhlCiAgcmVtb3RlIHNlcnZlciB1c2VkIGEgY2VydGlmaWNhdGUgd2l0aCB0aGUgbmFtZSBVVEYtOCBlbmNvZGVkLgoKICBXb3JrLWFyb3VuZCBicm91Z2h0IGJ5IEFsZXhpcyBTLiBMLiBDYXJ2YWxoby4KCkRhbmllbCAoOSBBdWd1c3QgMjAwNCkKLSBJIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IGZvciBrcmI0IHRvIHVzZSAtbGNvbV9lcnIgYXMgd2VsbCwgYXMgSSBzdGFydGVkCiAgdG8gZ2V0IGxpbmsgcHJvYmxlbXMgd2l0aCBpdCB1bmxlc3MgSSBkaWQgdGhhdCBvbiBteSBTb2xhcmlzIDIuNyBib3guIEkKICBkb24ndCB1bmRlcnN0YW5kIHdoeSBJIHN0YXJ0ZWQgdG8gZ2V0IHByb2JsZW1zIHdpdGggdGhpcyBub3chCgpEYW5pZWwgKDUgQXVndXN0IDIwMDQpCi0gRW5yaWNvIFNjaG9seiBmaXhlZCB0aGUgSFRUUC1OZWdvdGlhdGUgc2VydmljZSBuYW1lIHRvIGJlIHVwcGVyY2FzZSBhcwogIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzEwMDQxMDUKCkRhbmllbCAoNCBBdWd1c3QgMjAwNCkKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBhIGZpeCBmb3IgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgY29ubmVjdGluZyB0byBhIGhvc3QKICB1c2luZyBtdWx0aXBsZSBJUCAoYmFkKSBhZGRyZXNzZXMuCgotIER5bGFuIFNhbGlzYnVyeSBtYWRlIGxpYmN1cmwgbm8gbG9uZ2VyIGFjY2VwdCBjb29raWVzIHNldCB0byBhIFRMRCBvbmx5IChpdAogIHByZXZpb3VzbHkgYWxsb3dlZCB0aGF0IG9uIHRoZSBzZXZlbiB0aHJlZS1sZXR0ZXIgZG9tYWlucykuCgpEYW5pZWwgKDMxIEp1bHkgMjAwNCkKLSBKb2VsIENoZW4gcmVwb3J0ZWQgdGhhdCB0aGUgZGlnZXN0IGNvZGUgYXNzdW1lZCBxdW90ZXMgYXJvdW5kIHRoZSBjb250ZW50cyBhCiAgYml0IHRvbyBtdWNoLgoKRGFuaWVsICgyOCBKdWx5IDIwMDQpCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgdGhlIGhvc3QgbmFtZSB0byBnZXQgc2V0dXAgcHJvcGVybHkgZXZlbiB3aGVuIGEKICBjb25uZWN0aW9uIGlzIHJlLXVzZWQsIHdoZW4gYSBwcm94eSBpcyBpbiB1c2UuIFByZXZpb3VzbHkgdGhlIHdyb25nIEhvc3Q6CiAgaGVhZGVyIGNvdWxkIGdldCBzZW50IHdoZW4gcmUtdXNpbmcgYSBwcm94eSBjb25uZWN0aW9uIHRvIGEgZGlmZmVyZW50IHRhcmdldAogIGhvc3QuCgotIEZpeGVkIEJyaWFuIEFraW5zJyByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIGR1cGxpY2F0ZSBIb3N0OiBoZWFkZXJzIG9uIHJlLXVzZWQKICBjb25uZWN0aW9ucy4gSWYgeW91IGF0dGVtcHRlZCB0byByZXBsYWNlIHRoZSBIb3N0OiBoZWFkZXIgaW4gdGhlIHNlY29uZAogIHJlcXVlc3QsIHlvdSBnb3QgdHdvIHN1Y2ggaGVhZGVycyEKCi0gc3JjL01ha2VmaWxlLmFtIG5vdyBpbmNsdWRlcyB0aGUgTWFrZWZpbGUuaW5jIGZpbGUgdG8gZ2V0IGluZm8gYWJvdXQgZmlsZXMKCkRhbmllbCAoMjYgSnVseSAyMDA0KQotIE1hZGUgImN1cmwgW1VSTF0gLW8gbmFtZSMyIiB3b3JrIGFzIGV4cGVjdGVkLiBJZiB0aGVyZSdzIG5vIGdsb2JiaW5nIGZvciB0aGUKICAjLW51bWJlciwgaXQgd2lsbCBzaW1wbHkgYmUgdXNlZCBhcyAjMiBpbiB0aGUgZmlsZSBuYW1lLgoKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmaXhlZCB0ZXN0aW5nIHdpdGggdmFsZ3JpbmQgMi4xLnggYW5kIGFkZGVkIHR3byBtaXNzaW5nCiAgbmV3bGluZXMgaW4gdGhlIGNvb2tpZSBpbmZvcm1hdGlvbmFscy4KCkRhbmllbCAoMjQgSnVseSAyMDA0KQotIEkgZml4ZWQgdGhlIGF1dG9idWlsZHMgd2l0aCBhcmVzLCBzaW5jZSB0aGV5IG5vdyBuZWVkIHRvIGhhdmUgYnVpbGRjb25mIHJ1bgogIGluIHRoZSBhcmVzIGRpciBiZWZvcmUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaXMgcnVuLgoKLSBBZGRlZCBDYXNleSBPJ0Rvbm5lbGwncyBjdXJsX2Vhc3lfcmVzZXQoKSBmdW5jdGlvbi4gSXQgaGFzIGEgcHJvdG8gaW4KICBjdXJsL2N1cmwuaCBidXQgd2UgaGF2ZSBubyBtYW4gcGFnZSB5ZXQuCgpEYW5pZWwgKDIwIEp1bHkgMjAwNCkKLSBBZGRlZCBidWlsZGNvbmYgYW5kIGJ1aWxkY29uZi5iYXQgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZXMsIHNpbmNlIHRoZXkgYXJlCiAgaGFuZHkgZm9yIHJlYnVpbGRpbmcgY3VybCB3aGVuIHVzaW5nIGEgZGFpbHkgc25hcHNob3QgKGFuZCBub3QgYSBwdXJlIENWUwogIGNoZWNrb3V0KS4KCkRhbmllbCAoMTYgSnVseSAyMDA0KQotIEFzIHN1Z2dlc3RlZCBieSBUb2J5IFBldGVyc29uLCBsaWJjdXJsIG5vdyBpZ25vcmVzIENvbnRlbnQtTGVuZ3RoIGRhdGEgaWYgdGhlCiAgZ2l2ZW4gc2l6ZSBpcyBhIG5lZ2F0aXZlIG51bWJlci4gVGVzdCBjYXNlIDE3OCB2ZXJpZmllcyB0aGlzLgoKRGFuaWVsICgxNCBKdWx5IDIwMDQpCi0gR/xudGVyIEtuYXVmIGhhcyBtYWRlIHRoZSBOZXR3YXJlIGJ1aWxkcyBkbyB3aXRob3V0IHRoZSBjb25maWctbmV0d2FyZS5oCiAgZmlsZXMsIHNvIHRoZXkgYXJlIG5vdyByZW1vdmVkIGZyb20gdGhlIGRpc3QgcGFja2FnZXMuCgotIEf8bnRlciBLbmF1ZiBtYWRlIGN1cmwgYW5kIGxpYmN1cmwgYnVpbGQgd2l0aCBCb3JsYW5kIGFnYWluLgoKLSBBbmRyZXMgR2FyY2lhIGZpeGVkIHRoZSBjb21tb24gdGVzdCA1MDUgZmFpbHVyZXMgb24gd2luZG93cy4KCkRhbmllbCAoNiBKdWx5IDIwMDQpCi0gQW5kculzIEdhcmPtYSBmb3VuZCBvdXQgd2h5IHRoZSB3aW5kb3dzIHRlc3RzIGZhaWxlZCBvbiBmaWxlOi8vICJ1cGxvYWRzIi4KCkRhbmllbCAoMiBKdWx5IDIwMDQpCi0gQW5kculzIEdhcmPtYSByZXBvcnRlZCBhIGN1cmxfc2hhcmVfY2xlYW51cCgpIGNyYXNoIHRoYXQgb2NjdXJzIHdoZW4gbm8KICBsb2NrL3VubG9jayBjYWxsYmFja3MgaGF2ZSBiZWVuIHNldCBhbmQgdGhlIHNoYXJlIGlzIGNsZWFuZWQgdXAuCgpEYW5pZWwgKDEgSnVseSAyMDA0KQotIFdoZW4gdXNpbmcgY3VybCAtLXRyYWNlIG9yIC0tdHJhY2UtYXNjaWksIG5vIHRyYWNlIG1lc3NhZ2VzIHRoYXQgd2VyZSBzZW50CiAgYnkgY3VybF9lYXN5X2NsZWFudXAoKSB3ZXJlIGluY2x1ZGVkIGluIHRoZSB0cmFjZSBmaWxlLiBUaGlzIG1hZGUgdGhlCiAgbWVzc2FnZSAiQ2xvc2luZyBjb25uZWN0aW9uICMwIiBuZXZlciBhcHBlYXIgaW4gdHJhY2UgZHVtcHMuCgpEYW5pZWwgKDMwIEp1bmUgMjAwNCkKLSBOaWVscyB2YW4gVG9uZ2VyZW4gZm91bmQgdGhhdCBzZXR0aW5nIENVUkxPUFRfTk9CT0RZIHRvIFRSVUUgZG9lc24ndCBkaXNhYmxlCiAgYSBwcmV2aW91c2x5IHNldCBQT1NUIHJlcXVlc3QsIG1ha2luZyBhIHZlcnkgb2RkIHJlcXVlc3QgZ2V0IHNlbnQgKHVubGVzcwogIHlvdSBkaXNhYmxlZCB0aGUgUE9TVCkgYSBIRUFEIHJlcXVlc3Qgd2l0aCBhIFBPU1QgcmVxdWVzdC1ib2R5LiBJJ3ZlIG5vdwogIG1hZGUgQ1VSTE9QVF9OT0JPRFkgZW5mb3JjZSBhIHByb3BlciBIRUFELiBBZGRlZCB0ZXN0IGNhc2UgNTE0IGZvciB0aGlzLgoKRGFuaWVsICgyOSBKdW5lIDIwMDQpCi0gR/xudGVyIEtuYXVmIG1hZGUgdGhlIHRlc3RjdXJsLnBsIHNjcmlwdCBjYXBhYmxlIG9mIHVzaW5nIGEgY3VzdG9tIHNldHVwCiAgZmlsZSB0byBlYXNpZXIgcnVuIG11bHRpcGxlIGF1dG9idWlsZHMgb24gdGhlIHNhbWUgc291cmNlIHRyZWUuCgotIEdpc2xlIGZpeGVkIHRoZSBkamdwcCBidWlsZCBhbmQgZml4ZWQgYSBtZW1vcnkgcHJvYmxlbSBpbiBzb21lIG9mIHRoZQogIHJlb3JnZWQgbmFtZSByZXNvbHZlZCBjb2RlLgoKLSBGaXhlZCBjb2RlIHRvIGFsbG93IGNvbm5lY3RzIGRvbmUgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSB0byBhdHRlbXB0IHRoZQogIG5leHQgSVAgd2hlbiBjb25uZWN0aW5nIHRvIGEgaG9zdCB0aGF0IHJlc29sdmVzIHRvIG11bHRpcGxlIElQcyBhbmQgYQogIGNvbm5lY3QgYXR0ZW1wdCBmYWlscy4KCkRhbmllbCAoMjcgSnVuZSAyMDA0KQotIEJhc2VkIG9uIFJvYiBTdGFuemVsJ3MgYnVnIHJlcG9ydCAjOTc5NDgwLCBJIHdyb3RlIGEgY29uZmlndXJlIGNoZWNrIHRoYXQKICBjaGVja3MgaWYgcG9sbCgpIGNhbiBiZSB1c2VkIHRvIHdhaXQgb24gTlVMTCBhcyBvdGhlcndpc2Ugc2VsZWN0KCkgc2hvdWxkIGJlCiAgdXNlZCB0byBkbyBpdC4gVGhlIHNlbGVjdCgpIHVzYWdlIHdhcyBhbHNvIGZpeGVkIGFjY29yZGluZyB0byBoaXMgcmVwb3J0LgoKICBNYWMgT1MgWCAxMC4zIHNheXMgInBvbGwoKSBmdW5jdGlvbmFsaXR5IGZvciBNYWMgT1MgWCBpcyBpbXBsZW1lbnRlZCB2aWEgYW4KICBlbXVsYXRpb24gbGF5ZXIgb24gdG9wIG9mIHNlbGVjdCgpLCBub3QgaW4gdGhlIGtlcm5lbCBkaXJlY3RseS4gSXQgaXMKICByZWNvbW1lbmRlZCB0aGF0IHByb2dyYW1zIHJ1bm5pbmcgdW5kZXIgT1MgWCAxMC4zIHByZWZlciBzZWxlY3QoKSBvdmVyCiAgcG9sbCgpLiBDb25maWd1cmUgc2NyaXB0cyBzaG91bGQgbG9vayBmb3IgdGhlIF9QT0xMX0VNVUxfSF8gZGVmaW5lIChpbnN0ZWFkCiAgb2YgX1BPTExfSF8gb3IgX1NZU19QT0xMX0hfKSBhbmQgYXZvaWQgaW1wbGVtZW50YXRpb25zIHdoZXJlIHBvbGwgaXMgbm90CiAgaW1wbGVtZW50ZWQgaW4gdGhlIGtlcm5lbC4iCgogIFllcywgd2UgY2FuIHByb2JhYmx5IHVzZSBzZWxlY3QoKSBvbiBtb3N0IHBsYXRmb3JtcyBidXQgdG9kYXkgSSBwcmVmZXJlZCB0bwogIGxlYXZlIHRoZSBjb2RlIHVuYWx0ZXJlZC4KCkRhbmllbCAoMjQgSnVuZSAyMDA0KQotIFRoZSBzdGFuZGFyZCBjdXJsX3ZlcnNpb24oKSBzdHJpbmcgbm93IG9ubHkgaW5jbHVkZXMgdmVyc2lvbiBpbmZvIGFib3V0CiAgaW52b2x2ZWQgbGlicmFyaWVzIGFuZCBub3QgYWJvdXQgcGFydGljdWxhciBmZWF0dXJlcy4gVGh1cyBpdCB3aWxsIG5vIGxvbmdlcgogIGluY2x1ZGUgaW5mbyBhYm91dCBpcHY2IG5vciBHU1MuIFRoYXQgaW5mbyBpcyBvZiBjb3Vyc2Ugc3RpbGwgYXZhaWxhYmxlIGluCiAgdGhlIGZlYXR1cmUgYml0bWFzayBjdXJsX3ZlcnNpb25faW5mbygpIG9mZmVycy4KCi0gUmVwbGFjZWQgYWxsIG9jY3VyYW5jZXMgb2Ygc3ByaW50ZigpIHdpdGggc25wcmludGYoKS4gVGhpcyBpcyBtb3N0bHkgYmVjYXVzZQogIGl0IGlzICJBIEdvb2QgVGhpbmciIHJhdGhlciB0aGFuIGFjdHVhbGx5IGZpeGluZyBhbnkga25vd24gcHJvYmxlbS4gVGhpcwogIHdpbGwgaGVscCBwcmV2ZW50aW5nIGZ1dHVyZSBwb3NzaWJsZSBtaXN0YWtlcyB0byBjYXVzZSBidWZmZXIgb3ZlcmZsb3dzLgoKLSBNYWpvciByZW9yZ2FuaXphdGlvbiBpbiB0aGUgaG9zdCByZXNvbHZlIGNvZGUgKGFnYWluKS4gVGhpcyB0aW1lLCBJJ3ZlCiAgbW9kaWZpZWQgdGhlIGNvZGUgdG8gbm93IGFsd2F5cyB1c2UgYSBsaW5rZWQgbGlzdCBvZiBDdXJsX2FkZHJpbmZvIHN0cnVjdHMKICB0byByZXR1cm4gcmVzb2x2ZWQgaW5mbyBpbiwgbm8gbWF0dGVyIHdoYXQgcmVzb2x2ZXIgbWV0aG9kIG9yIHN1cHBvcnQgdGhhdAogIGlzIGF2YWlsYWJsZSBvbiB0aGUgcGxhdGZvcm0uIEl0IG1ha2VzIGl0IGEgbG90IGVhc2llciB0byB3cml0ZSBjb2RlIHRoYXQKICB1c2VzIG9yIGRlcGVuZHMgb24gcmVzb2x2ZWQgZGF0YS4KCiAgSW50ZXJuYWxseSwgdGhpcyBtZWFucyBhbW9uZ3N0IG90aGVyIHRoaW5ncyB0aGF0IHdlIGNhbiBzdG9wIGRvaW5nIHRoZSB3ZWlyZAogICJpbmNyZWFzZSBidWZmZXIgc2l6ZSB1bnRpbCBpdCB3b3JrcyIgdHJpY2sgd2hlbiByZXNvbHZpbmcgaG9zdHMgb24KICBpcHY0LW9ubHkgd2l0aCBnZXRob3N0YnluYW1lX3IoKSwgd2Ugc3VwcG9ydCBzb2NrcyBldmVuIG9uIGxpYmN1cmxzIGJ1aWx0CiAgd2l0aCBpcHY2IGVuYWJsZWQgKGJ1dCBvbmx5IHRvIHNvY2tzIHNlcnZlcnMgdGhhdCByZXNvbHZlIHRvIGFuIGlwdjQKICBhZGRyZXNzKSBhbmQgd2Ugbm8gbG9uZ2VyIGRlZXAtY29weSBvciByZWxvY2F0ZSBob3N0ZW50IHN0cnVjdHMgKHdlIGNyZWF0ZQogIEN1cmxfYWRkcmluZm8gY2hhaW5zIGluc3RlYWQpLgoKICBUaGUgbmV3ICJob3N0ZW50IHRvIEN1cmxfYWRkcmluZm8iIGNvbnZlcnRlciBmdW5jdGlvbiBpcyBuYW1lZCBDdXJsX2hlMmFpKCkKICBhbmQgaXMgc2xpZ2h0bHkgbmFpdmUgYW5kIHNpbXBsZSwgeWV0IEkgYmVsaWV2ZSBpdCBpcyBmdW5jdGlvbmFsIGVub3VnaCB0bwogIHdvcmsgZm9yIGxpYmN1cmwuCgpEYW5pZWwgKDIyIEp1bmUgMjAwNCkKLSBEYXZpZCBDb2hlbiBwb2ludGVkIG91dCB0aGF0IFJGQzIxMDkgc2F5cyBjbGllbnRzIHNob3VsZCBhbGxvdyBjb29raWVzIHRvCiAgY29udGFpbiBsZWFzdCA0MDk2IGJ5dGVzIHdoaWxlIGxpYmN1cmwgb25seSBhbGxvd2VkIDIwNDcuIEkgcmFpc2VkIHRoZSBsaW1pdAogIHRvIDQ5OTkgbm93IGFuZCBtYWRlIHRoZSB1c2VkIGJ1ZmZlciBnZXQgbWFsbG9jKCllZCBpbnN0ZWFkIG9mIHNpbXBseQogIGFsbG9jYXRlZCBvbiBzdGFjayBhcyBiZWZvcmUuIEV4dGVuZGVkIHRlc3QgY2FzZSA0NiB0byBpbmNsdWRlIGEgY29va2llIHdpdGgKICB2ZXJ5IGh1Z2UgY29udGVudCB0byB2ZXJpZnkgdGhlIGZpeC4KCi0gR/xudGVyIEtuYXVmIGZpeGVkIGdldGRhdGUueSB0byByZW1vdmUgYSBmZXcgd2FybmluZ3MuIEkgcmVtb3ZlZCB0aGUKICBpZmRlZidlZCB0ZXN0IHdlIG5ldmVyIGV2ZXIgdXNlIGFueXdheS4KCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIGNlcnRpZmljYXRlIHdpbGRjYXJkIGNoZWNrcyB0byBzdXBwb3J0IGEgJyonLWxldHRlcgogIGFueXdoZXJlIGluIHRoZSB3aWxkY2FyZCBzdHJpbmcsIHN1cHBvcnQgbXVsdGlwbGUgJyonLWxldHRlcnMgaW4gdGhlCiAgd2lsZGNhcmQgYW5kIHRvIGFsbG93IHRoZSAnKictbGV0dGVyIHRvIG1hdGNoIGEgc3RyaW5nIHRoYXQgaW5jbHVkZXMgYSBkb3QuCgpEYW5pZWwgKDIxIEp1bmUgMjAwNCkKLSB0ZXN0Y3VybC5zaCBpcyBub3cgcmVtb3ZlZCBjb21wbGV0ZWx5LCB0ZXN0cy90ZXN0Y3VybC5wbCBpcyB0aGUgc2NyaXB0IHRvCiAgdXNlIHdoZW4gYXV0b2J1aWxkaW5nIGN1cmwhCgotIEtqZXRpbCBKYWNvYnNlbiBicm91Z2h0IG15IGF0dGVudGlvbiB0byB0aGUgZmFjdCB0aGF0IHlvdSBjYW5ub3QgcHJvcGVybHkKICBhYm9ydCBhbiB1cGxvYWQgd2l0aCB0aGUgcmVhZGZ1bmN0aW9uIGNhbGxiYWNrLCBzaW5jZSByZXR1cm5pbmcgMCBvciAtMSBvbmx5CiAgc3RvcHMgdGhlIHVwbG9hZCBhbmQgbGliY3VybCB3aWxsIGNvbnRpbnVlIHdhaXRpbmcgZm9yIGRvd25sb2FkZWQgZGF0YSBhbmQKICB0aGUgc2VydmVyIG9mdGVuIHdhaXRzIGZvciB0aGUgcmVzdCBvZiB0aGUgdXBsb2FkIGRhdGEgdG8gYXJyaXZlLgoKICBUaHVzLCBJJ3ZlIG5vdyBhZGRlZCB0aGUgYWJpbGl0eSBmb3IgcmVhZCBjYWxsYmFja3MgdG8gcmV0dXJuCiAgQ1VSTF9SRUFERlVOQ19BQk9SVCB0byBhYm9ydCBhbiB1cGxvYWQgZnJvbSBhIHJlYWQgY2FsbGJhY2suIFRoaXMgd2lsbCBzdG9wCiAgdGhlIHRyYW5zZmVyIGltbWVkaWF0ZWx5IHdpdGggYSBDVVJMRV9BQk9SVEVEX0JZX0NBTExCQUNLIHJldHVybiBjb2RlLgoKICBUZXN0IGNhc2UgNTEzIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhhdCBpdCB3b3Jrcy4gSSBoYWQgdG8gaW1wcm92ZSB0aGUgdGVzdAogIEhUVFAgc2VydmVyIHRvbyB0byBkdW1wIHRoZSByZXF1ZXN0IHRvIGEgZmlsZSBldmVuIHdoZW4gdGhlIGNsaWVudAogIGRpc2Nvbm5lY3RzIHByZW1hdHVyZWx5LgoKRGFuaWVsICgxOSBKdW5lIDIwMDQpCi0gTHVjYSBBbHRlYXMgcHJvdmlkZWQgYSB0ZXN0IGNhc2Ugd2l0aCBhIGZhaWxpbmcgY3VybCBvcGVyYXRpb246IHdoZW4gd2UgUE9TVAogIHRvIGEgc2l0ZSB3aXRoIC0tZGlnZXN0IChvciBzaW1pbGFyKSBzZXQsIGFuZCB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEgMzAyCiAgTG9jYXRpb246IHRvIHRoZSAiYXV0aHByb2JlIiByZXF1ZXN0LCBpdCB3YXMgbm90IHRyZWF0ZWQgY29ycmVjdGx5LiBXZSBzdGlsbAogIHdpbGwgYmVoYXZlIGJhZGx5IGlmIEZPTExPV0xPQ0FUSU9OIGlzIGVuYWJsZWQgZm9yIHRoaXMgY2FzZSwgYnV0IEknbSBub3QKICBpbiB0aGUgbW9vZCB0byBkaXZlIGludG8gdGhpcyByaWdodCBub3cgYW5kIHdpbGwgbGVhdmUgaXQgYXMtaXMgZm9yIG5vdy4KICBWZXJpZmllZCBteSBmaXggd2l0aCB0ZXN0IGNhc2UgMTc3LgoKRGFuaWVsICgxOCBKdW5lIDIwMDQpCi0gR2lzbGUgVmFuZW0ncyBwYXRjaCB0aGF0IHByb3ZpZGVzIG1vcmUgZGV0YWlscyBmcm9tIHRoZSBTU0wgbGF5ZXJzIChpZiB5b3UKICB1c2UgYW4gT3BlblNTTCB2ZXJzaW9uIHRoYXQgc3VwcG9ydHMgaXQpLiBJdCBhbHNvIGludHJvZHVjZXMgdHdvIG5ldyB0eXBlcwogIG9mIGRhdGEgdGhhdCBjYW4gYmUgc2VudCB0byB0aGUgZGVidWcgY2FsbGJhY2s6IENVUkxJTkZPX1NTTF9EQVRBX0lOIGFuZAogIENVUkxJTkZPX1NTTF9EQVRBX09VVC4KCi0gV2l0aCBEYXZpZCBCeXJvbidzIHRlc3Qgc2VydmVyIEkgY291bGQgcmVwZWF0IGhpcyBwcm9ibGVtIGFuZCBtYWtlIHN1cmUgdGhhdAogIFBPU1Rpbmcgb3ZlciBIVFRQUzovLyB3aXRoIE5UTE0gd29ya3MgZmluZSBub3cuIFRoZXJlIHdhcyBhIGdlbmVyYWwgcHJvYmxlbQogIHdpdGggbXVsdGktcGFzcyBhdXRoZW50aWNhdGlvbiB3aXRoIG5vbi1HRVQgb3BlcmF0aW9ucyB3aXRoIENPTk5FQ1QuCgpEYW5pZWwgKDE2IEp1bmUgMjAwNCkKLSBNb2RpZmllZCB0byBrZWVwIHRoZSB1cGxvYWQgYnl0ZSBjb3VudGVyIGluIGFuIGN1cmxfb2ZmX3QsIG5vdCBhbiBpbnQgYXMKICBiZWZvcmUuIDMyYml0cyBpcyBub3QgZW5vdWdoLiBUaGlzIGlzIG1vc3QgbGlrZWx5IHRoZSBidWcgSmVhbi1Mb3VpcyBMZW1haXJlCiAgcmVwb3J0ZWQgdGhhdCBtYWtlcyAyR0IgRlRQIHVwbG9hZHMgdG8gcmVwb3J0IGVycm9yICgidW5hbGlnbmVkIGZpbGUgc2l6ZXMiKQogIHdoZW4gY29tcGxldGVkLgoKRGFuaWVsICgxNSBKdW5lIDIwMDQpCi0gTHVjYSBBbHRlYXMgcmVwb3J0ZWQgYSBwcm9ibGVtIHRoYXQgSSBmaXhlZDogaWYgeW91IGRpZCBhIFBPU1Qgd2l0aAogIENVUkxBVVRIX0RJR0VTVCBzZXQgYnV0IHRoZSBzZXJ2ZXIgZGlkbid0IHJlcXVpcmUgYW55IGF1dGhlbnRpY2F0aW9uLAogIGxpYmN1cmwgd291bGQgcmVwZWF0ZWRseSBzZW5kIEhFQUQgbG90cyBvZiB0aW1lcyB1bnRpbCBpdCBnaXZlcyB1cC4gVGhpcyB3YXMKICBhY3R1YWxseSB0aGUgY2FzZSBmb3IgYWxsIG11bHRpLXBhc3MgYXV0aGVudGljYXRpb25zLiBBZGRlZCB0ZXN0IGNhc2UgMTc0LAogIDE3NSBhbmQgMTc2IHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgxNCBKdW5lIDIwMDQpCi0gTXVsdGlwYXJ0IGZvcm1wb3N0cyB1cGxvYWRpbmcgZmlsZXMgbm8gbG9uZ2VyIGluc2VydHMgdGhlIGZpbGVzIHRoZW1zZWx2ZXMKICBpbnRvIHRoZSBodWdlIHByZWJ1aWx0IGNodW5rLiBUaGlzIGVuYWJsZXMgbGliY3VybCB0byBmb3JtcG9zdCBmaWxlcyB0aGF0IGlzCiAgbGFyZ2VyIHRoYW4gdGhlIGFtb3VudCBvZiBzeXN0ZW0gbWVtb3J5LiBXaGVuIHRoZSBmaWxlIGdpdmVuIGlzIHBhc3NlZCBvbgogIHN0ZGluLCBsaWJjdXJsIHN0aWxsIHVzZXMgdGhlIG9sZCBtZXRob2Qgb2YgcmVhZGluZyB0aGUgZnVsbCBmaWxsIGJlZm9yZSB0aGUKICB1cGxvYWQgdGFrZXMgcGxhY2UuIFRoaXMgYXBwcm9hY2ggd2FzIHNlbGVjdGVkIGluIG9yZGVyIHRvIG5vdCBhbHRlciB0aGUKICBiZWhhdmlvciBmb3IgZXhpc3RpbmcgYXBwbGljYXRpb25zLCBhcyB3aGVuIHVzaW5nIHN0ZGluIGxpYmN1cmwgY2FuJ3Qga25vdwogIHRoZSBzaXplIG9mIHRoZSB1cGxvYWQgYW5kIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcgY2FuIG9ubHkgYmUgdXNlZCBvbgogIEhUVFAgMS4xIHNlcnZlcnMuCgpEYW5pZWwgKDEzIEp1bmUgMjAwNCkKLSBHaXNsZSBmb3VuZCBvdXQgdGhhdCB3ZSBkaWQgd2lsZGNhcmQgY2VydCBuYW1lIGNoZWNrcyB3cm9uZywgc28gdGhhdCBwYXJ0cwogIG9mIHRoZSBjaGVjayB3cm9uZ2x5IHdhcyBjYXNlIHNlbnNpdGl2ZS4KCkRhbmllbCAoMTEgSnVuZSAyMDA0KQotIFRpbSBTbmVkZG9uIGJyb3VnaHQgYSBtaW5vciBWTVMgZml4IHRvIG1ha2UgY3VybCBidWlsZCBwcm9wZXJseSBvbiBoaXMgVk1TCiAgbWFjaGluZS4gSGUgYWxzbyBoYWQgc29tZSBpbnRlcmVzdGluZyBsaWJjdXJsIHBhdGNoZXMuLi4gdGhleSBtaWdodCBiZSBhYmxlCiAgdG8gZG8gaW4gYSBzbGlnaHRseSBuaWNlciB3YXkuIERpc2N1c3Npb25zIGFyZSBpbiBwcm9ncmVzcy4KCkRhbmllbCAoMTAgSnVuZSAyMDA0KQotIEdpc2xlIFZhbmVtIGJyb3VnaHQgY29kZSBjbGVhbnVwc20gYmV0dGVyIHZlcmJvc2Ugb3V0cHV0IGFuZCBiZXR0ZXIgY29ubmVjdAogIHRpbWVvdXQgaGFuZGxpbmcgd2hlbiBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gYSBob3N0IHRoYXQgcmVzb2x2ZXMgdG8KICBtdWx0aXBsZSBJUCBhZGRyZXNzZXMuCgotIFN0ZXZlbiBCYXp5bCBhbmQgU2VzaHViYWJ1IFBhc2FtIHBvaW50ZWQgb3V0IGEgYnVnIG9uIHdpbjMyIHdoZW4gZnJlZWluZyB0aGUKICBwYXRoIGFmdGVyIGEgZmlsZTovLyB0cmFuc2Zlci4KCkRhbmllbCAoOSBKdW5lIDIwMDQpCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgbWFkZSAnY29uZmlndXJlIC0tZGlzYWJsZS1odHRwJyB3b3JrIHRvIGJ1aWxkIGxpYmN1cmwKICB3aXRob3V0IEhUVFAgc3VwcG9ydC4gSSBhZGRlZCBhIG5ldyByZXR1cm4gY29kZSBmb3IgY3VybF9mb3JtYWRkKCkgaW4gY2FzZQogIGxpYmN1cmwgaXMgYnVpbHQgd2l0aCBIVFRQIGRpc2FibGU6IENVUkxfRk9STUFERF9ESVNBQkxFRC4KCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgcG9pbnRlZCBvdXQgYSBtaXNzaW5nIGZpbGUgaW4gdGhlIGdlbmVyYXRlZAogIGN1cmxsaWIuZHNwIGZpbGUsIGFuZCBub3cgcGVvcGxlIGJ1aWxkaW5nIHdpdGggdGhpcyBzaG91bGQgZ2V0IGEgbGliY3VybC5saWIKICBmaWxlIGdlbmVyYXRlZCBhcyBpdCB1c2VkIHRvIGRvIGJlZm9yZSB3ZSBnZW5lcmF0ZWQgdGhpcyBmaWxlLgoKRGFuaWVsICg4IEp1bmUgMjAwNCkKLSBNYXJ0eSBLdWhydCBmaXhlZCBhIG1pbm9yIGJ1aWxkIHByb2JsZW0gZm9yIFZNUy4KCkRhbmllbCAoNyBKdW5lIDIwMDQpCi0gUmV2ZXJ0ZWQgdGhlIGNvbmZpZ3VyZSBjaGVjayBmcm9tIHRoZSA0dGggc2luY2UgaXQgb2J2aW91c2x5IGRpZG4ndCB3b3JrLgogIFJlbWFkZSBpdCBpbiBhIGRpZmZlcmVudCBtYW5uZXIgdGhhdCBob3BlZnVsbHkgd29ya3MgYmV0dGVyLgoKRGFuaWVsICg0IEp1bmUgMjAwNCkKLSBH/G50ZXIgS25hdWYgYnJvdWdodCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIE5ldFdhcmUgYWdhaW4uCgotIE1hZGUgdGhlIGNvbmZpZ3VyZSBjaGVja3MgZm9yIHN0cmVycm9yX3IoKSBub3QgZXhpdCB0aGUgY29uZmlndXJlIHNjcmlwdAogIHdoZW4gYnVpbHQgZm9yIGNyb3NzLWNvbXBpbGluZy4KCkRhbmllbCAoMyBKdW5lIDIwMDQpCi0gQ2hyaXMgR2F1a3JvZ2VyIHBvaW50ZWQgb3V0IHRoYXQgJ21ha2UgdGVzdCcgYXR0ZW1wdHMgdG8gcnVuIHRoZSB0ZXN0cyBldmVuCiAgaWYgY3VybCBpcyBidWlsdCBjcm9zcy1jb21waWxlZC4gSSd2ZSBub3cgbWFkZSBpdCBvdXRwdXQgYSBzaG9ydCBtZXNzYWdlCiAgaW5zdGVhZCwgc2F5aW5nIGl0IGlzbid0IHBvc3NpYmxlIHRvIGRvLgoKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBicm91Z2h0IEZUUCAzcmQgcGFydHkgdHJhbnNmZXIgc3VwcG9ydCB0byBsaWJjdXJsLgogIFlvdSBjYW4gbm93IHVzZSBsaWJjdXJsIHRvIHRyYW5zZmVyIGZpbGVzIGJldHdlZW4gdHdvIHJlbW90ZSBob3N0cyB1c2luZwogIEZUUC4gVGhlcmUgYXJlIGEgYnVuY2ggb2YgbmV3IG9wdGlvbnMgdG8gY29udHJvbCB0aGlzIHdpdGg6CiAgIENVUkxPUFRfU09VUkNFX0hPU1QKICAgQ1VSTE9QVF9TT1VSQ0VfVVNFUlBXRAogICBDVVJMT1BUX1NPVVJDRV9QQVRICiAgIENVUkxPUFRfU09VUkNFX1BPUlQKICAgQ1VSTE9QVF9QQVNWX0hPU1QKICAgQ1VSTE9QVF9TT1VSQ0VfUFJFUVVPVEUKICAgQ1VSTE9QVF9TT1VSQ0VfUE9TVFFVT1RFCgogIChUaGV5IHN0aWxsIHJlbWFpbiB0byBiZSBkb2N1bWVudGVkIHByb3Blcmx5IGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbgogIHBhZ2UuKQoKICBXaGVuIHVzaW5nIHRoaXMsIHRoZSBvcmRpbmFyeSBDVVJMT1BUX1VSTCBzcGVjaWZpZXMgdGhlIHRhcmdldCBVUkwsIGFuZCB5b3UKICBzcGVjaWZ5IHRoZSBzb3VyY2UgZGF0YSB3aXRoIHRoZXNlIGFkZGl0aW9uYWwgb3B0aW9ucy4gZnRwM3JkcGFydHkuYyBpcyBhCiAgbmV3IGV4YW1wbGUgc291cmNlIGNvZGUgc2hvd2luZyBob3cgdG8gdXNlIHRoaXMuCgotIFZpbmNlbnQgQnJvbm5lciBmaXhlZCB0aGUgSFRUUCBEaWdlc3QgY29kZSB0byB1c2UgdGhlIHByb3h5IHVzZXIgbmFtZSBhbmQKICBwYXNzd29yZCB3aGVuIGRvaW5nIHByb3h5IGF1dGhlbnRpY2F0aW9uLCBpdCBwcmV2aW91c2x5IGFsd2F5cyB1c2VkIHRoZSBob3N0CiAgdXNlciBuYW1lIGFuZCBwYXNzd29yZCEKCkRhbmllbCAoMiBKdW5lIDIwMDQpCi0gQ1VSTE9QVF9VUExPQUQgYW5kIENVUkxPUFRfUFVUIG5vdyBkbyB0aGUgZXhhY3Qgc2FtZSB0aGluZyBpbnRlcm5hbGx5LCB3aGljaAogIGZpeGVzIHNvbWUgb2xkIGNvbmZ1c2lvbnMgb24gd2hlbiB3aGljaCBvZiB0aGVzZSBzaG91bGQgYmUgdXNlZCBhbmQgd2hhdCB0aGUKICBkaWZmZXJlbmNlcyBhcmUuCgotIEFwcGxpZWQgR2lzbGUncyBmaXhlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSB3aXRoIGxjYy13aW4zMgoKVmVyc2lvbiA3LjEyLjAgKDIgSnVuZSAyMDA0KQoKRGFuaWVsICgxIEp1bmUgMjAwNCkKLSBJIGNsYXJpZmllZCB0aGUgLS1jcmVhdGUtZGlycyBvcHRpb24gc29tZXdoYXQgaW4gdGhlIGN1cmwgbWFuIHBhZ2UuCgotIFJlbmF1ZCBEdWhhdXQgY29ycmVjdGVkIHRoZSBjdXJsX3VuZXNjYXBlIG1hbiBwYWdlLgoKLSBEYXZpZCBCeXJvbiBtb2RpZmllZCBvbmUgb2YgTWFzc2ltaWxpYW5vIFppY2NhcmRpJ3MgcmVjZW50IE1TVkMgbWFrZWZpbGUKICBjaGFuZ2VzIHRvIG5vdyBhZ2FpbiB1c2UgdGhlIG1tIGxpYiBieSBkZWZhdWx0LgoKRGFuaWVsICgyNiBNYXkgMjAwNCkKLSBNb2h1biBCaXN3YXMgYWRkZWQgcmVsZWFzZS16bGliIGFuZCBkZWJ1Zy16bGliIHRhcmdldHMgdG8gdGhlIE1TVkMgbGliY3VybAogIE1ha2VmaWxlCgotIERhdmlkIEJ5cm9uIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIHByb3h5IGF1dGhlbnRpY2F0aW9uIHdoZW4gZG9pbmcgQ09OTkVDVCwKICBsaWtlIHdoZW4gYWNjZXNzaW5nIEhUVFBTIHNpdGVzIHdpaHQgYSBwcm94eS4gVGhpcyBwcm9iYWJseSBicm9rZSB3aGVuIEkKICByZXdyb3RlIHRoZSBhdXRoIHN0dWZmIHJlY2VudGx5LgoKLSBJIGFkZGVkIGZpbGV1cGxvYWQuYyBpbiB0aGUgZXhhbXBsZXMgZGlyZWN0b3J5LCBzaG93aW5nIGhvdyBhbiB1cGxvYWQgdG8gYQogIGZpbGU6Ly8gVVJMIGlzIG1hZGUuCgpEYW5pZWwgKDI1IE1heSAyMDA0KQotIE1hc3NpbWlsaWFubyBaaWNjYXJkaSB1cGRhdGVkIHRoZSBNU1ZDIG1ha2VmaWxlcy4KCkRhbmllbCAoMjQgTWF5IDIwMDQpCi0gbGliY3VybCBub3cgc3VwcG9ydHMgInVwbG9hZGluZyIgdG8gZmlsZTovLyBVUkxzLiBUZXN0IDIwNCBhbmQgMjA1IHdlcmUKICBhZGRlZCB0byB2ZXJpZnkuCgotIFNpbW9uIEpvc2Vmc3NvbiBhZGRlZCBhIGlkbl9mcmVlKCkgZnVuY3Rpb24gaW4gbGliaWRuIDAuNC41IGFzIGEgcmVhY3Rpb24gdG8KICBHaXNsZSdzIHByZXZpb3VzIG1haWwuIFdlIG5vdyB1c2UgdGhpcyBmdW5jdGlvbiwgYW5kIHRodXMgd2UgcmVxdWlyZSBsaWJpZG4KICAwLjQuNSBvciBsYXRlci4gTm8gZWFybGllciB2ZXJzaW9uIHdpbGwgZG8uCgotIFJvYmVydCBELiBZb3VuZyByZXBvcnRlZCB0aGF0IENVUkxPUFRfQ09PS0lFRklMRSBhbmQgQ1VSTE9QVF9DT09LSUUgY291bGQKICBub3QgYmUgdXNlZCBib3RoIGluIG9uZSByZXF1ZXN0LiBGaXhlZCBpdCBhbmQgYWRkZWQgdGVzdCBjYXNlIDE3MiB0byB2ZXJpZnkuCgpEYW5pZWwgKDIxIE1heSAyMDA0KQotIFdoaWxlIHRhbGtpbmcgdG8gaG9zdCBhLmIuYywgbGliY3VybCBkaWQgd3JvbmdseSBub3QgYWNjZXB0IGNvb2tpZXMgdGhhdAogIHdlcmUgc2V0IHRvIHRoZSBkb21haW4gLmEuYi5jICh0aGF0IGlzIHdpdGggYSBkb3QgcHJlZml4KS4gVGhpcyBpcyBub3cgZml4ZWQKICBhbmQgdGVzdCBjYXNlIDE3MSB2ZXJpZmllcyBpdC4KCkRhbmllbCAoMjAgTWF5IDIwMDQpCi0gSmVzc2UgTm9sbGVyIHJlcG9ydGVkIHRoYXQgdGhlIHVwbG9hZCBzcGVlZCBpbmZvIHJlcG9ydGVkIGJ5IGxpYmN1cmwgd2FzCiAgd3JvbmcuIFRoZSBzYW1lIHdhcyB0cnVlIGZvciB0aGUgZG93bmxvYWQgc3BlZWQuIEZpeGVkIG5vdy4KCkRhbmllbCAoMTkgTWF5IDIwMDQpCi0gRGF2aWQgQnlyb24gYWRkZWQgdGVzdCBjYXNlIDE3MCAtIHRoaXMgdXNlZCB0byBjcmFzaCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvZgogIGN1cmwuCgpEYW5pZWwgKDE3IE1heSAyMDA0KQotIFBldGVyIFN5bHZlc3RlcidzIHBhdGNoIHRoYXQgYWRkcmVzc2VzIHR3byBmbGF3cyBpbiB0aGUgcGVlciBjZXJ0aWZpY2F0ZQogIG5hbWUgdmVyaWZpY2F0aW9uOgogIG8gd2hlbiBtdWx0aXBsZSBjb21tb24gbmFtZXMgYXJlIHVzZWQgKGFzIGluIHRoZSBjdXJsIHRlc3RzKSwgdGhlIGxhc3QgbmFtZQogICAgbmVlZHMgdG8gYmUgc2VsZWN0ZWQuCiAgbyBhbGxvdyBjb21wYXJpbmcgd2l0aCBlbmNvZGVkIHZhbHVlcywgYXQgbGVhc3Qgd2l0aCBCTVAgYW5kIElTTyBsYXRpbjEKICAgIGVuY29kZWQgVDYxc3RyaW5ncy4KCi0gQWxsIDE5MSB0ZXN0IGNhc2VzIHJ1biB0aHJvdWdoIHRoZSB0b3J0dXJlIHRlc3QgT0shICdtYWtlIHRlc3QtdG9ydHVyZScgaXMKICBub3cgYXZhaWxhYmxlIGluIHRoZSByb290IG1ha2VmaWxlIChvbiBjb25maWd1cmUtYmFzZWQgZW52aXJvbm1lbnRzKS4KCkRhbmllbCAoMTQgTWF5IDIwMDQpCi0gV2l0aCBhIHNsaWdodGx5IG1vZGlmaWVkIGZ0cHNlcnZlci5wbCBJJ3ZlIG5vdyBydW4gYWxtb3N0IGFsbCB0ZXN0cyB0aHJvdWdoCiAgd2l0aCBydW50ZXN0cy5wbCAtdC4gVGhpcyBpcyBnb29kbmVzcyEKCi0gU2luY2UgSSBoYXZlIGJlZW4gdW5hYmxlIHRvIGNvbnRhY3QgdGhlIENWUyBhZG1pbnMgZm9yIHNldmVyYWwgbW9udGhzLCBJJ3ZlCiAgZGVjaWRlZCB0aGF0IHRoZSBjdXJyZW50IENWUyBob3N0aW5nIHdhcyBub3QgZ29vZCBlbm91Z2guIEkndmUgbm93IG1vdmVkIHRoZQogIENWUyByZXBvIG9uY2UgYWdhaW4sIHNlZSBSRUFETUUgZm9yIHVwZGF0ZWQgY3ZzIGNoZWNrb3V0IGluc3RydWN0aW9ucy4KCkRhbmllbCAoMTMgTWF5IDIwMDQpCi0gcnVudGVzdHMucGwgLXQgbm93IHJ1bnMgZmluZSBhbGwgdGhlIHdheSB0byB0ZXN0IDEwMC4gSSBiZWxpZXZlIHRlc3QgY2FzZQogIDEwMCBmYWlscyBiZWNhdXNlIG9mIGFuIEZUUCBzZXJ2ZXIgcHJvYmxlbS4KCkRhbmllbCAoMTIgTWF5IDIwMDQpCi0gR2VuZXJhbCBjbGVhbnVwcyBhbGwgb3ZlciB0byBtYWtlIGxpYmN1cmwgc3Vydml2ZSBhbmQgZG8gd2VsbCB3aGVuIGEgbWVtb3J5CiAgZnVuY3Rpb24gcmV0dXJucyBOVUxMLiBydW50ZXN0cy5wbCAtdCBub3cgd29ya3MgZmluZSBmb3IgdGhlIGZpcnN0IDI2IHRlc3QKICBjYXNlcy4KCkRhbmllbCAoMTEgTWF5IDIwMDQpCi0gU2VzaHViYWJ1IFBhc2FtIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIGN1cmxfZ2xvYmFsX2luaXRfbWVtKCkgLQogIGxpa2Ugbm9ybWFsIGN1cmxfZ2xvYmFsX2luaXQoKSBidXQgYWxsb3dzIHRoZSBhcHAgdG8gcmVwbGFjZSBhbGwgbWVtb3J5CiAgZnVuY3Rpb25zIHdpdGggaXRzIG93biBzZXQuIEkgbW9kaWZpZWQgaXQgc2xpZ2h0bHkuCgotIEJhc2VkIG9uIEx1Y2EgQWx0ZWFzJyBjb21tZW50cywgSSBtb2RpZmllZCB0aGUgY3VybGxpYi5kc3AgZ2VuZXJhdGlvbiBjb2RlLgoKRGFuaWVsICgxMCBNYXkgMjAwNCkKLSBHaXNsZSBtYWlsZWQgU2ltb24gSm9zZWZzc29uIChvZiBsaWJpZG4gZmFtZSkgYWJvdXQgdGhlIGJlbmVmaXRzIG9mIGEKICBzZXBhcmF0ZSBmcmVlKCktZnVuY3Rpb24gYnkgdGhhdCBsaWIgdG8gbWFrZSBzdXJlIHRoZSBtZW1vcnkgaXMgZnJlZWQgYnkgdGhlCiAgc2FtZSBtZW1vcnkgc3Vic3lzdGVtIHRoYXQgYWxsb2NhdGVkIGl0LiBIZSByZXNwb25kZWQgcG9zaXRpdmVseSBhbmQgdGhpcwogIHdpbGwgbGlrZWx5IGNhdXNlIHVzIHRvIHJlcXVpcmUgYSBuZXdlciB2ZXJzaW9uIG9mIGxpYmlkbiBhcyBzb29uIGFzIFNpbW9uCiAgcmVsZWFzZXMgb25lIHdpdGggc3VjaCBhIGxpYmlkbl9mcmVlKCkgZnVuY3Rpb24uCgotIEphbWVzIEJ1cnNhIG1hZGUgcnVudGVzdHMucGwncyAtdCBvcHRpb24gd29yayBmb3IgYW55IGdpdmVuIHRlc3QgY2FzZSwgYW5kIEkKICBlZGl0ZWQgdG8gYWxsb3cgLWcgdG9vLiBOb3QgZXZlbiB0ZXN0IGNhc2UgMSB3b3JrZWQuLi4KCi0gTHVjYSBBbHRlYSBtYWRlIHRoZSBuYz0gZmllbGQgbm90IHVzZSBxdW90ZXMgaW4gb3V0Z29pbmcgSFRUUCBEaWdlc3QgaGVhZGVycy4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIHRlc3Qgc2NyaXB0IHRoYXQgbWFkZSBpdCBmYWlsIHRvCiAgcmVjb2duaXplIG91ciBvd24gcnVubmluZyBIVFRQIHNlcnZlci4KCkRhbmllbCAoNyBNYXkgMjAwNCkKLSBKYW1lcyBCdXJzYSBmaXhlZCB0aGUgbWVtYW5hbHl6ZS5wbCBzY3JpcHQgdG8gY29uZGVyIG1hbGxvYygwKSBhcmVhcyBPSyB0bwogIGZyZWUoKSBhbmQgaGUgbWFkZSB0d28gZmFpbGVkLXJlc29sdmUgZXJyb3IgbWVzc2FnZXMgdXNlIHRoZSBuZXcgZGlzcGxheS0KICBuYW1lIGluc3RlYWQgb2YgdGhlIGludGVybmFsbHktdXNlZCBuYW1lLgoKLSBHaXNsZSBWYW5lbSB0cmllZCBjdXJsIHdpdGgKICB3d3cuZXRkb21lbmVuYXZua2FubWFrc2ltYWx0aW5uZWhvbGRlc2Vrc3RpdHJlYm9rc3RhdmVyc2xpa3NvbWRldHRlLmNvbQogIHdoaWNoIGNhdXNlZCBwcm9ibGVtcywgYW5kIEkgZml4ZWQgdGhlIHNpbmdsZSB6ZXJvIGJ5dGUgYnVmZmVyIG92ZXJ3cml0ZQogIHRoYXQgb2NjdXJyZWQgKGR1ZSB0byBhIHN0dXBpZCBwcm90b2NvbCBidWZmZXIgc2l6ZSBhbmQgcGFyc2VyKS4KCi0gTWFkZSB0aGUgbGliL2N1cmxsaWIuZHNwIGZpbGUgZ2V0IGdlbmVyYXRlZCBhdXRvbWF0aWNseSB3aGVuIGEgZGlzdHJpYnV0aW9uCiAgcGFja2FnZSBpcyBtYWRlLCB3aXRoIHRoZSBtc3ZjcHJvai4qIGZpbGVzIGFzIHRlbXBsYXRlcyBhbmQgYWxsCiAgd2luMzItc291cmNlcyBhZGRlZC4gSSB0aGluayB0aGlzIGNhbiBiZSBtYWRlIHRvIHdvcmsgYmV0dGVyIHRoYW4gdGhlIGFsd2F5cwogIGxhZ2dpbmctYmVoaW5kIHByZXZpb3VzIGFwcHJvYWNoLiBJJ20gbm90IHN1cmUgdGhpcyBidWlsZHMgYSB3b3JraW5nIHByb2plY3QKICBmaWxlIHJpZ2h0IG5vdyB0aG91Z2ghCgpEYW5pZWwgKDYgTWF5IDIwMDQpCi0gTWljaGFlbCBCZW5lZGljdCBicm91Z2h0IGEgZml4IHRoYXQgZmlsbHMgaW4gdGhlIGVycm9yYnVmZmVyIHByb3Blcmx5IHdoZW4KICBhcmVzIGZhaWxzIHRvIHJlc29sdmUgYSBuYW1lIGZvciBhIGNhc2Ugbm90IHByZXZpb3VzbHkgZGVhbHQgd2l0aCBsaWtlIHRoaXMuCgpEYW5pZWwgKDUgTWF5IDIwMDQpCi0gSm9lIEhhbHBpbiBmaXhlZCB0aGUgYW5ub3lpbmcgdHlwZWNhc3Qgd2FybmluZyBpbiBsaWIvbGRhcC5jCgotIEdpc2xlIFZhbmVtIGZpeGVzOgogIG8gbWVtZGVidWcgdG8gbm90IGFjY2VzcyBOVUxMIG9uIHNldmVyYWwgcGxhY2VzCiAgbyBsaWJjdXJsLmRlZjsgY3VybF9mb3JtcGFyc2UgaXMgZ29uZS4KICBvIHByb2dyZXNzLmM7IGZpeGVkIHRoZSBwZXJjZW50IHZhbHVlcyBiZWluZyB0cnVuY2VkIHRvIDAuCiAgbyBpZjJpcC4qOyBjb25zdGlmaWVkIHRoZSAnaW50ZXJmYWNlJyBhcmd1bWVudC4KCi0gVG9yIEFybnRzZW4gcmVwb3J0ZWQgdGhhdCBtYW55IG9mIGhpcyBhdXRvYnVpbGRzIGZyb3plIGFuZCBJIGZvdW5kIGFuZCBmaXhlZAogIGEgcHJvYmxlbSBpbnRyb2R1Y2VkIHdpdGggdGhlIEhUVFAgYXV0aCBvdmVyaGF1bCB0aGF0IGNvdWxkIGxlYWQgdG8gYQogIG5ldmVyLWVuZGluZyBpbnRlcm5hbCByZXF1ZXN0LWxvb3AgZHVlIHRvIHVuLWluaXRpYWxpemVkIHZhcmlhYmxlcyEKCi0gUmVtb3ZlZCBzZXZlcmFsIGNvbXBpbGVyIHdhcm5pbmdzIG9uIHZhcmlvdXMgY29tcGlsZXJzL3BsYXRmb3Jtcy4KCkRhbmllbCAoNCBNYXkgMjAwNCkKLSBjdXJsX2Zvcm1wYXJzZSgpIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgbGlicmFyeS4gSXQgaGFzIGJlZW4gbWFya2VkIGFuZAogIG1lbnRpb25lZCBhcyBkZXByZWNhdGVkIGZvciBzZXZlcmFsIHllYXJzLgoKRGFuaWVsICgzIE1heSAyMDA0KQotIFJld3JpdHRlbiBIVFRQIGF1dGhlbnRpY2F0aW9uIGNvZGUuIFRoZSBwcmV2aW91cyBjb2RlIGNvdWxkIG5vdCBwcm9wZXJseQogIGRlYWwgd2l0aCB0aGUgYWRkZWQgdGVzdCBjYXNlcyAxNjcsIDE2OCBhbmQgMTY5LiBJJ3ZlIG5vdyByZXdyaXR0ZW4gdGhlIGNvZGUKICB0byBiZXR0ZXIgc2VwYXJhdGUgaG9zdCBhbmQgcHJveHkgYXV0aGVudGljYXRpb24gYW5kIG5vdCByZS11c2UgdGhlIHNhbWUKICB2YXJpYWJsZXMgYXMgbXVjaCBhcyBiZWZvcmUgYXMgaXQgcHJvdmVkIG5vbiB3b3JraW5nIGluIHRoZSBtb3JlIGludm9sdmVkCiAgY2FzZXMuIEFsbCB0aGUgY3VycmVudCB0ZXN0cyBydW4gT0sgbm93LCBhbmQgc28gZG8gdGhlIG5ldyBvbmVzLiBUaGUgY3VybAogIHRvb2wgZ290IGEgbmV3IG9wdGlvbiBuYW1lZCAtLXByb3h5LWRpZ2VzdCB0byBlbmFibGUgSFRUUCBEaWdlc3QKICBhdXRoZW50aWNhdGlvbiB3aXRoIHRoZSBwcm94eS4gSSBhbHNvIG1hZGUgdGhlIGxpYnJhcnkgc3VwcG9ydCBpdC4KCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgTERBUCBjb2RlIHdvcmsgd2l0aCB3bGRhcDMyLmRsbCBhcyBzdXBwbGllZCB3aXRoCiAgV2luLTk4L01FLzIwMDAvWFAsIHNvIG5vIGV4dHJhIC5kbGxzIGFyZSByZXF1aXJlZCB3aGVuIGN1cmwvbGliY3VybCBpcyB1c2VkCiAgb24gdGhlc2UgV2luZG93cyB2ZXJzaW9ucy4KCkRhbmllbCAoMzAgQXByaWwgMjAwNCkKLSBydW50ZXN0cy5wbCBub3cgc2NhbnMgdGhlIHZhbGdyaW5kIGxvZyBmb3IgdmFsZ3JpbmQtZGV0ZWN0ZWQgbWVtb3J5IGxlYWtzCiAgYWZ0ZXIgZWFjaCB0ZXN0IGNhc2UgaWYgdmFsZ3JpbmQgd2FzIGZvdW5kIGFuZCB1c2VkLgoKLSBJIG1vZGlmaWVkIHRoZSBhcHAtY29kZSBpbiBjdXJsIHRvIGluY2x1ZGUgdGhlIG5ldyBsaWIvY3VybHguaCBhbmQgb25seQogIGFjY2VzcyB0aG9zZSBmdW5jdGlvbnMgdXNpbmcgdGhlIGN1cmx4Xy1wcmVmaXggaW4gcHJlcGFyYXRpb24gZm9yIHRoZSBmdXR1cmUKICByZW1vdmFsIG9mIHNldmVyYWwgY3VybF8tZnVuY3Rpb25zIGZyb20gdGhlIHB1YmxpYyBsaWJjdXJsIEFQSS4KCi0gSW50cm9kdWNlZCBsaWIvY3VybHguaCBhcyBhIHNpbmdsZSBoZWFkZXIgdG8gcHJvdmlkZSB0aGUgY3VybHhfLWZ1bmN0aW9ucwogIHRvIGFwcHMuCgotIEFkZGVkIG5vdGljZXMgaW4gdGhlIG1hbiBwYWdlcyBmb3IgY3VybF9nZXRlbnYsIGN1cmxfbXByaW50ZiwgY3VybF9zdHJlcXVhbAogIGFuZCBjdXJsX3N0cm5lcXVhbCB0aGF0IHRoZXkgYXJlIHN1YmplY3QgZm9yIHJlbW92YWwgaW4gYSBmdXR1cmUgcmVsZWFzZS4KICBTVE9QIFVTSU5HIFRIRVNFIEZVTkNUSU9OUy4KCi0gTWloYWkgSW9uZXNjdSBub3RpY2VkIGhlIGNvdWxkbid0IGRvIGZvcm1wb3N0cyB3aXRoIHdoaXRlc3BhY2UgaW4gdGhlIGZpbGUKICBuYW1lcyBhbmQgeWVzLCBJIGJyb2tlIHRoYXQgb24gQXByaWwgMjMuIFNpZ2guIEkgZml4ZWQgaXQgbm93IGFuZCBhZGRlZAogIHRlc3QgY2FzZSAxNjYgdG8gdmVyaWZ5IGl0LgoKLSBMdWNhIEFsdGVhIHBvaW50ZWQgb3V0IGEgbWlzdGFrZSBsZWZ0IGZyb20gdGhlIERpZ2VzdCBwYXRjaCBvZiB5ZXN0ZXJkYXkuCgpEYW5pZWwgKDI5IEFwcmlsIDIwMDQpCi0gTWFkZSBJRE4gZG9tYWlucyB3b3JrIHdoZW4gc2VuZGluZyByZXF1c3RzIG92ZXIgSFRUUCBwcm94eSBhcyB3ZWxsLiBBZGRlZAogIHRlc3QgY2FzZSAxNjUgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBGaXhlZCBhIGJ1ZyBpbiB0aGUgbmV3IGludGVybmFsIGhvc3QgbmFtZSBzZXR1cCB3aGVuIHJlLXVzaW5nIGNvbm5lY3Rpb25zLgoKLSBKYW1lcyBCdXJzYSBmb3VuZCBvdXQgdGhhdCBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgd2l0aCBhcmVzLWJ1aWx0IGxpYmN1cmwKICBjcmVhdGVkIGEgYmFkIGhhbmRsZSB0aGF0IHdvdWxkIGNyYXNoIGluIHRoZSBmaXJzdCBuYW1lIHJlc29sdmUgYXR0ZW1wdC4gVGhpcwogIGlzIG5vdyBmaXhlZCBhbmQgdGVzdCBjYXNlIDUxMiB3YXMgYWRkZWQgdG8gdmVyaWZ5IGl0LgoKLSBMdWNhIEFsdGVhIHByb3ZpZGVkIGEgbWFqb3IgSFRUUCBEaWdlc3QgY29kZSBmaXggYW5kIGNsZWFudXAuIFdlIG5vdyBmb2xsb3cKICB0aGUgRGlnZXN0IFJGQyBhIGxvdCBiZXR0ZXIuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIFNTTCBjb2RlIHVzZSBFUlJfZXJyb3Jfc3RyaW5nX24oKSB3aGVyZSBhcHBsaWNhYmxlLgoKRGFuaWVsICgyNyBBcHJpbCAyMDA0KQotIEkgcmVtb2RlbGVkIEdpc2xlJ3MgSUROIGNvZGUgc2xpZ2h0bHkgYW5kIG5vdyB3ZSBjb252ZXJ0IGJvdGggdGhlIGhvc3QgbmFtZQogIGFuZCBwcm94eSBuYW1lIHRvIHRoZSBBQ0UgZW5jb2RlZCB2ZXJzaW9uIHRvIHVzZSBpbnRlcm5hbGx5IGZvciByZXNvbHZlcyBhbmQKICBjb29raWVzIGV0Yy4gVGhleSBhcmUgbm93IHVzaW5nIG9uZSAnc3RydWN0IGhvc3RuYW1lJyBlYWNoIHRoYXQga2VlcCBib3RoCiAgdGhlIG9yaWdpbmFsIG5hbWUgYW5kIHRoZSBwb3NzaWJseSBlbmNvZGVkIG5hbWUuIElETiByZXNvbHZlcyB3b3JrIGZvciBtZQogIG5vdyB1c2luZyBpcHY2LCBpcHY0IGFuZCBhcmVzIHJlc29sdmluZy4gRXZlbiBjb29raWVzIG9uIElETiBzaXRlcyBzZWVtIHRvCiAgZG8gcmlnaHQuIEkgZ290IHNvbWUgZmFpbHVyZXMgYXQgZmlyc3Qgd2hlbiBDSEFSU0VUIHdhc24ndCBzZXQgYXQgYWxsIHdoaWNoCiAgY29uZnVzZWQgbGliaWRuIGNvbXBsZXRlbHkgYW5kIGl0IGRlY2lkZWQgYnkgZW5jb2Rpbmcgb2YgY2hvaWNlIHdhcwogICdBTlNJX1gzLjQtMTk2OCcuLi4KCi0gbWFkZSAnY29uZmlndXJlIC0td2l0aG91dC1saWJpZG4nIHdvcmsKCkRhbmllbCAoMjUgQXByaWwgMjAwNCkKLSBGaXhlZCB0aGUgc3JjL2h1Z2VoZWxwLmMgZmlsZSB0byBpbmNsdWRlICJzZXR1cC5oIiBpbnN0ZWFkIG9mICJjb25maWcuaCIgdG8KICBtYWtlIHRoZSBwcm9ibGVtcyB3aXRoIFVTRV9NQU5VQUwgb24gd2luZG93cyBnbyBhd2F5LgoKLSBjb25maWd1cmUgLS13aXRob3V0LXNzbCBjb3VsZCBzdGlsbCB3cm9uZ2x5IGluY2x1ZGUgc29tZSBPcGVuU1NMIGluZm8gaW4gdGhlCiAgTWFrZWZpbGVzIGlmIHBrZy1jb25maWcgaGFkIGluZm8gYWJvdXQgT3BlblNTTC4gQnVnICM5NDE3NjIgcmVwb3J0ZWQgYnkKICBNYXJ0aW4uCgotIFNpbmNlIHdlIGNhbiBub3cgYnVpbGQgYW5kIHVzZSBxdWl0ZSBhIGxhcmdlIHNldCBvZiAzcmQgcGFydHkgbGlicmFyaWVzLCBJCiAgZGVjaWRlZCBJIHdvdWxkIG1ha2UgY29uZmlndXJlIHByb2R1Y2UgYSBzdW1tYXJ5IGF0IHRoZSBlbmQgc2hvd2luZyB3aGF0CiAgbGlicmFyaWVzIGl0IHVzZXMgYW5kIGlmIG5vdCwgd2hhdCBvcHRpb24gdG8gdXNlIHRvIG1ha2UgaXQgdXNlIHRoYXQuIEkgYWxzbwogIGFkZGVkIHNvbWUgb3RoZXIgcmFuZG9tIGluZm8gdGhhdCBpcyBuaWNlIGluIGEgImNvbmZpZ3VyZSBzdW1tYXJ5IiBvdXRwdXQuCgotIEFwcGxpZWQgVG9tbXlUYW0ncyBwYXRjaCB0aGF0IG5vdyBtYWtlIGN1cmwgd29yayB3aXRoIHRlbG5ldCBhbmQgc3RkaW4KICBwcm9wZXJseSBvbiBXaW5kb3dzLgoKLSBUaGUgY2hhbmdlcyBmb3IgdG9kYXkgYmVsb3cgd2VyZSBtYWRlIGJ5IG1lIGFuZCBHaXNsZSBWYW5lbS4KCiAgVGhlIGZpbGUgcHJldmlvdXNseSBrbm93biBhcyBob3N0aXAuYyBoYXMgbm93IHVuZGVyZ29uZSBhIGh1Z2UgY2xlYW51cCBhbmQKICBzcGxpdDoKCiAgaG9zdGlwLmMgZXhwbGFpbmVkCiAgPT09PT09PT09PT09PT09PT09CgogIFRoZSBtYWluIENPTVBJTEUtVElNRSBERUZJTkVTIHRvIGtlZXAgaW4gbWluZCB3aGVuIHJlYWRpbmcgdGhlIGhvc3QqLmMKICBzb3VyY2UgZmlsZSBhcmUgdGhlc2U6CgogIENVUkxSRVNfSVBWNiAtIHRoaXMgaG9zdCBoYXMgZ2V0YWRkcmluZm8oKSBhbmQgZmFtaWx5LCBhbmQgdGh1cyB3ZSB1c2UKICB0aGF0LiBUaGUgaG9zdCBtYXkgbm90IGJlIGFibGUgdG8gcmVzb2x2ZSBJUHY2LCBidXQgd2UgZG9uJ3QgcmVhbGx5IGhhdmUgdG8KICB0YWtlIHRoYXQgaW50byBhY2NvdW50LiBIb3N0cyB0aGF0IGFyZW4ndCBJUHY2LWVuYWJsZWQgaGF2ZSBDVVJMUkVTX0lQVjQKICBkZWZpbmVkLgoKICBDVVJMUkVTX0FSRVMgLSBpcyBkZWZpbmVkIGlmIGxpYmN1cmwgaXMgYnVpbHQgdG8gdXNlIGMtYXJlcyBmb3IgYXN5bmNocm9ub3VzCiAgbmFtZSByZXNvbHZlcy4gSXQgY2Fubm90IGhhdmUgRU5BQkxFX0lQVjYgZGVmaW5lZCBhdCB0aGUgc2FtZSB0aW1lLCBhcwogIGMtYXJlcyBoYXMgbm8gaXB2NiBzdXBwb3J0LiBUaGlzIGNhbiBiZSBXaW5kb3dzIG9yICpuaXguCgogIENVUkxSRVNfVEhSRUFERUQgLSBpcyBkZWZpbmVkIGlmIGxpYmN1cmwgaXMgYnVpbHQgdG8gcnVuIHVuZGVyIChuYXRpdmUpCiAgV2luZG93cywgYW5kIHRoZW4gdGhlIG5hbWUgcmVzb2x2ZSB3aWxsIGJlIGRvbmUgaW4gYSBuZXcgdGhyZWFkLCBhbmQgdGhlCiAgc3VwcG9ydGVkIGFzeW5jaCBBUEkgd2lsbCBiZSB0aGUgc2FtZSBhcyBmb3IgYXJlcy1idWlsZHMuCgogIElmIGFueSBvZiB0aGUgdHdvIHByZXZpb3VzIGFyZSBkZWZpbmVkLCBDVVJMUkVTX0FTWU5DSCBpcyBkZWZpbmVkIHRvby4gSWYKICBsaWJjdXJsIGlzIG5vdCBidWlsdCB0byB1c2UgYW4gYXN5bmNocm9ub3VzIHJlc29sdmVyLCBDVVJMUkVTX1NZTkNIIGlzCiAgZGVmaW5lZC4KCiAgVGhlIGhvc3QqLmMgc291cmNlcyBmaWxlcyBhcmUgc3BsaXQgdXAgbGlrZSB0aGlzOgoKICBob3N0aXAuYyAgIC0gbWV0aG9kLWluZGVwZW5kZW50IHJlc29sdmVyIGZ1bmN0aW9ucyBhbmQgdXRpbGl0eSBmdW5jdGlvbnMKICBob3N0YXN5bi5jIC0gZnVuY3Rpb25zIGZvciBhc3luY2hyb25vdXMgbmFtZSByZXNvbHZlcwogIGhvc3RzeW4uYyAgLSBmdW5jdGlvbnMgZm9yIHN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXMKICBob3N0YXJlcy5jIC0gZnVuY3Rpb25zIGZvciBhcmVzLXVzaW5nIG5hbWUgcmVzb2x2ZXMKICBob3N0dGhyZS5jIC0gZnVuY3Rpb25zIGZvciB0aHJlYWRlZCBuYW1lIHJlc29sdmVzCiAgaG9zdGlwNC5jICAtIGlwdjQtc3BlY2lmaWMgZnVuY3Rpb25zCiAgaG9zdGlwNi5jICAtIGlwdjYtc3BlY2lmaWMgZnVuY3Rpb25zCgogIFRoZSBob3N0aXAuaCBpcyB0aGUgc2luZ2xlIHVuaXRlZCBoZWFkZXIgZmlsZSBmb3IgYWxsIHRoaXMuIEl0IGRlZmluZXMgdGhlCiAgQ1VSTFJFU18qIGRlZmluZXMgYmFzZWQgb24gdGhlIGNvbmZpZyouaCBhbmQgc2V0dXAuaCBkZWZpbmVzLgoKLSBBZGRlZCBmdW5jdGlvbiBoZWFkZXIgY29tbWVudHMgdG8gbWFueSBmdW5jdGlvbnMgaW4gYW4gYXR0ZW1wdCB0byBiZXR0ZXIKICBleHBsYWluIHRoZSBwdXJwb3NlIG9mIHRoZW0gYWxsLgoKLSBjb25maWd1cmUgLS13aXRoLWxpYmlkbiBpcyBub3cgc3VwcG9ydGVkLiBJdCBtYWtlcyB0aGUgY29uZmlndXJlIHNjcmlwdAogIGNoZWNrIGZvciBsaWJpZG4gbGlicyBhbmQgaW5jbHVkZSBmaWxlcyBpbiB0aGUgcHJlZml4IHBhdGggZ2l2ZW4uIElmIHlvdQogIHNheSAtLXdpdGgtbGliaWRuPS91c3IvbG9jYWwsIGl0IHdpbGwgY2hlY2sgZm9yIHRoZSBsaWIgaW4gL3Vzci9sb2NhbC9saWIKICBhbmQgdGhlIGluY2x1ZGVzIGluIC91c3IvbG9jYWwvaW5jbHVkZSBldGMuCgotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYSBzdHJ1Y3QgYWdlZCBDVVJMVkVSU0lPTl9USElSRCBpbmNsdWRpbmcKICBsaWJpZG4gdmVyc2lvbiBpbmZvLiBUaGUgc3RyaW5nIGN1cmxfdmVyc2lvbigpIHJldHVybnMgYWxzbyBpbmNsdWRlcyBsaWJpZG4KICB2ZXJzaW9uIGluZm8sIGlmIGF2YWlsYWJsZS4KClZlcnNpb24gNy4xMS4yICgyNiBBcHJpbCAyMDA0KQoKRGFuaWVsICgyNSBBcHJpbCAyMDA0KQotIEVyd2luIEF1dGhyaWVkIHBvaW50ZWQgb3V0IHRoYXQgY29uZmlndXJlIC0tZGlzYWJsZS1tYW51YWwgZGlkbid0IGRvIHJpZ2h0CiAgaWYgeW91IGFscmVhZHkgaGFkIGEgc3JjL2h1Z2VoZWxwLmMgc291cmNlIGZpbGUgcHJlc2VudCAod2hpY2ggbW9zdCBwZW9wbGUKICBkbyBJIGd1ZXNzKS4gSXQgbm93IHVzZXMgdGhlIFVTRV9NQU5VQUwgZGVmaW5lIHByb3Blcmx5LgoKRGFuaWVsICgyMyBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtIGZvdW5kIGFuZCBmaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4gZG9pbmcgKGZhaWxpbmcpIFdpbmRvd3MKICB0aHJlYWRlZCBuYW1lIHJlc29sdmVzLgoKLSBJIGFsc28gYWRkZWQgdGVzdCBjYXNlIDE2MyBqdXN0IHRvIG1ha2Ugc3VyZSAtRiAidmFyPTxmaWxlIiB3b3JrcyBmaW5lIGFuZAogIGNhbiBwYXNzIG9uIGNoYXJhY3RlcnMgc3VjaCBhcyBuZXdsaW5lcywgY2FycmlhZ2UtcmV0dXJuIGFuZCB0YWJzLgoKLSBXaGVuIHdlIGFkZGVkIHRlc3QgY2FzZSAxNjIgd2l0aG91dCBhZGRpbmcgdGhlIG5lY2Vzc2FyeSByZXF1aXJlbWVudCBmaWVsZAogIGluIHRoZSB0ZXN0IG1ldGEgZGF0YSB3ZSBjb3VsZCBzZWUgdGhhdCBjdXJsIGRpZG4ndCBjb21wbGFpbiBpZiB5b3UgdXNlZAogIC0tcHJveHktbnRsbSBldmVuIGlmIHRoZSB1bmRlcmx5aW5nIGxpYmN1cmwgaXQgdXNlcyBoYXMgbm8gTlRMTSBzdXBwb3J0ISBJCiAgbm93IG1hZGUgaXQgY2hlY2sgdGhpcyBmaXJzdCwgYW5kIGl0IG5vdyBleGlzdHMgd2l0aCBhICJ0aGUgaW5zdGFsbGVkCiAgbGliY3VybCB2ZXJzaW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGlzIiBtZXNzYWdlIGlmIGl0IGhhcHBlbnMgYWdhaW4uCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDQpCi0gRGF2aWQgQnlyb24gZm91bmQgYW5kIGZpeGVkIGEgc21hbGwgYnVnIHdpdGggdGhlIC0tZmFpbCBhbmQgYXV0aGVudGljYXRpb24KICBzdHVmZiBhZGRlZCBhIGZldyB3ZWVrcyBhZ28uICBUdXJucyBvdXQgdGhhdCBpZiB5b3Ugc3BlY2lmeSAtLXByb3h5LW50bG0gYW5kCiAgY29tbXVuaWNhdGUgd2l0aCBhIHByb3h5IHRoYXQgcmVxdWlyZXMgYmFzaWMgYXV0aGVudGljYXRpb24sIHRoZSBwcm94eQogIHByb3Blcmx5IHJldHVybnMgYSA0MDcsIGJ1dCB0aGUgZmFpbHVyZSBkZXRlY3Rpb24gY29kZSBkb2Vzbid0IHJlYWxpemUgaXQKICBzaG91bGQgZ2l2ZSB1cCwgc28gY3VybCByZXR1cm5zIHdpdGggZXhpdCBjb2RlIDAuIFRlc3QgY2FzZSAxNjIgYWRkZWQgdG8KICB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIGFsbG93IG5ld2xpbmVzIGluIHRoZSBjb250ZW50cyB3aGVuIGRvaW5nIC1GICJ2YXI9W2NvbnRlbnRzXSIKICBSb2JlcnQgTWFybG93IHJlcG9ydGVkLgoKLSBJZiBhIHRyYW5zZmVyIGlzIGZvdW5kIG91dCB0byBiZSBvbmx5IHBhcnRpYWwsIGxpYmN1cmwgd2lsbCBub3cgdHJlYXQgdGhhdAogIGFzIGEgcHJvYmxlbSBzZXJpb3VzIGVub3VnaCB0byBza2lwIHRoZSBmaW5hbCBRVUlUIGNvbW1hbmQgYmVmb3JlIGNsb3NpbmcKICB0aGUgY29udHJvbCBjb25uZWN0aW9uLiBUbyBhdm9pZCB0aGUgcmlzayB0aGF0IGl0IHdpbGwgImhhbmciIHdhaXRpbmcgZm9yCiAgdGhlIFFVSVQgcmVzcG9uc2UuIEFkZGVkIHRlc3QgY2FzZSAxNjEgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDIxIEFwcmlsIDIwMDQpCi0gTW9kaWZpZWQgdGhlIGhldXJpc3RpY3MgZm9yIGRlYWxpbmcgd2l0aCB0aGUgdGVzdCAxNjAgc2NlbmFyaW8uIFdoZW4gYQogIGNvbm5lY3Rpb24gaXMgcmUtdXNlZCBhbmQgbm90aGluZyBhdCBhbGwgaXMgcmVjZWl2ZWQgZnJvbSBpdCAoYmVjYXVzZSB0aGUKICBzZXJ2ZXIgY2xvc2VzIHRoZSBjb25uZWN0aW9uKSwgd2Ugd2lsbCBub3cgcmV0cnkgdGhlIHJlcXVlc3Qgb24gYSBmcmVzaCBuZXcKICBjb25uZWN0aW9uLiBUaGUgcHJldmlvdXMgRUNPTk5SRVNFVCBzdHVmZiBmcm9tIEphbnVhcnkgMzAgd2FzIHJlbW92ZWQgYWdhaW4KICBhcyBpdCBkaWRuJ3QgZGV0ZWN0IHRoZSBzaXR1YXRpb24gZ29vZCBlbm91Z2guCgpEYW5pZWwgKDIwIEFwcmlsIDIwMDQpCi0gQWRkZWQgdGVzdCBjYXNlIDE2MCB0byB2ZXJpZnkgdGhhdCBjdXJsIHdvcmtzIGNvcnJlY3RseSB3aGVuIGl0IGdldHMgYQogIGNvbm5lY3Rpb24gcmVzZXQgd2hlbiB0cnlpbmcgdG8gcmUtdXNlIGEgY29ubmVjdGlvbi4gSXQgc2hvdWxkIHRoZW4gc2ltcGx5CiAgY3JlYXRlIGEgbmV3IGNvbm5lY3Rpb24gYW5kIHJlc2VuZCB0aGUgcmVxdWVzdC4KCkRhbmllbCAoMTkgQXByaWwgMjAwNCkKLSBObyBtb3JlIDUxMiBieXRlIGxpbWl0IGZvciBob3N0IG5hbWUgKGluY2x1c2luZyBuYW1lICsgcGFzc3dvcmQpIGluIGxpYmN1cmwuCiAgQW4gYWRkZWQgYm9udXMgaXMgdGhhdCB3ZSB1c2UgbGVzcyBtZW1vcnkgZm9yIHRoZSB0eXBpY2FsIChzaG9ydGVyIFVSTCkKICBjYXNlLgoKLSBDbGVhbmVkIHVwIHRoZSBzb3VyY2VzIHRvIGJldHRlciB1c2UgdGhlIHRlcm1zICdob3N0bmFtZScgYW5kICdwYXRoJwogIGludGVybmFsbHkgd2hlbiByZWZlcnJpbmcgdG8gdGhhdCBkYXRhLiBUaGUgYnVmZmVycyB1c2VkIGZvciBrZWVwIHRoYXQgaW5mbwogIGlzIGNhbGxlZCAnbmFtZWJ1ZmZlcicgYW5kICdwYXRoYnVmZmVyJy4gTXVjaCBlYXNpZXIgdG8gcmVhZCBhbmQgdW5kZXJzdGFuZAogIHRoYW4gdGhlIHByZXZpb3VzIG1lc3MuCgpEYW5pZWwgKDE1IEFwcmlsIDIwMDQpCi0gTW9kaWZpZWQgcnVudGVzdHMucGwgYWdhaW4gdG8gcmVtb3ZlIGFsbCBsb2cgZmlsZXMgaW4gdGhlIGxvZy8gZGlyIGJldHdlZW4KICBlYWNoIHRlc3QsIGFuZCB0aGVuIG1hZGUgLXAgZGlzcGxheSBhbGwgbm9uLXplcm8gYnl0ZSBmaWxlcyBpbiB0aGUgbG9nIGRpci4KICBJdCBzaG91bGQgbWFrZSB0aGF0IGRhdGEgbW9yZSB1c2FibGUgYW5kIGNvbnRhaW4gbGVzcyBydWJiaXNoLgoKLSBmdHBzZXJ2ZXIucGwgbm93IHByb2R1Y2VzIGxvZyBmaWxlcyBtb3JlIHNpbWlsYXIgdG8gaG93IHRoZSBzd3Mgb25lcyBsb29rCiAgYW5kIHRoZXkgbm93IGFsc28gY29udGFpbnMgYSBiaXQgbW9yZSBkZXRhaWxzIHRvIGhlbHAgZGVidWdnaW5nIGZ0cAogIHByb2JsZW1zLgoKLSBSZW1vdmVkIHRoZSBmaXhlZCBtYXhpbXVtIGFtb3VudCBvZiBkaXIgbGV2ZWxzIHRoZSBGVFAgY29kZSBzdXBwb3J0ZWQuCiAgUHJldmlvdXNseSB3ZSBoYWQgYSBmaXhlZCBhcnJheSBmb3IgMTAwIGxldmVscywgbm93IHdlIHNhdmUgc3BhY2UgaW4gZWFjaAogIGhhbmRsZSBieSBhbGxvY2F0aW5nIG9ubHkgZm9yIGEgZmV3IGxldmVsIGJ5IGRlZmF1bHQgYW5kIHRoZW4gZW5sYXJnaW5nIHRoYXQKICBpbiBjYXNlIG9mIG5lZWQgKHdpdGggbm8gbWF4aW11bSBkZXB0aCkuIEFkanVzdGVkIHRlc3QgY2FzZSAxNDIgdG8gdmVyaWZ5CiAgdGhhdCAxNTAgZGlyIGxldmVscyB3b3JrIGZpbmUuICBBbiBhZGRlZCBib251cyBpcyB0aGF0IHdlIHVzZSBsZXNzIG1lbW9yeQogIGZvciB0aGUgdHlwaWNhbCAobm90IHZlcnkgZGVlcCkgY2FzZS4KCkRhbmllbCAoMTQgQXByaWwgMjAwNCkKLSBBc2tpbmcgZm9yIENVUkxfSVBSRVNPTFZFX1Y2IHdoZW4gaXB2NiBhZGRyZXNzZXMgY2FuJ3QgYmUgcmVzb2x2ZWQgd2lsbAogIG5vdyBjYXVzZSB0aGUgcmVzb2x2ZSBmdW5jdGlvbiB0byByZXR1cm4gTlVMTCBpbW1lZGlhdGVseS4gVGhpcyBmbGF3IHdhcwogIHBvaW50ZWQgb3V0IGJ5IEdpc2xlIFZhbmVtLgoKLSBHaXNsZSBWYW5lbSBtYWRlIGN1cmwgLTQvLTYgYWN0dWFsbHkgc2V0IHRoZSBkZXNpcmVkIG9wdGlvbiB0byBsaWJjdXJsLgoKLSBydW50ZXN0cy5wbCBub3cgaGFzIGEgbmV3IG9wdGlvbiAoLXApIHRoYXQgd2lsbCBkaXNwbGF5ICJpbnRlcmVzdGluZyIgbG9nCiAgZmlsZXMgdG8gc3Rkb3V0IGluIGNhc2Ugb2YgYSB0ZXN0IGZhaWx1cmUuIFRoaXMgaXMgcHJpbWFyaWx5IGludGVuZGVkIHRvIGJlCiAgdXNlZCBpbiB0aGUgJ2Z1bGwtdGVzdCcgbWFrZSB0YXJnZXQgdGhhdCBpcyB1c2VkIGJ5IHRoZSBhdXRvYnVpbGQgdGVzdHMsIGFzCiAgd2UgdGhlbiBnZXQgYSBtdWNoIGJldHRlciBjaGFuY2UgdG8gdW5kZXJzdGFuZCAocmVtb3RlKSB0ZXN0IGZhaWx1cmVzIGJhc2VkCiAgb24gYXV0b2J1aWxkIGxvZ3MgYWxvbmUuCgpEYW5pZWwgKDEzIEFwcmlsIDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFkZSB0aGUgbXVsdGkgaW50ZXJmYWNlIHdvcmsgYWdhaW4gb24gV2luZG93cyBldmVuIHdoZW4gYnVpbHQKICB3aXRob3V0IGFyZXMuIEJlZm9yZSB0aGlzLCBzZWxlY3QoKSB3b3VsZCByZXR1cm4gLTEgZHVyaW5nIHRoZSBuYW1lIHJlc29sdmUKICBwaGFzZSBzaW5jZSBjdXJsX211bHRpX2Zkc2V0KCkgZGlkbid0IHJldHVybiBhbnkgZmRfc2V0IGF0IGFsbCB3aGljaCB3YXNuJ3QKICBhcHByZWNpYXRlZCEKCi0gY3VybF9lYXN5X2R1cGhhbmRsZSgpIG5vdyBkdXBsaWNhdGVzIHRoZSB0Y3Bfbm9kZWxheSBpbmZvIGFzIHdlbGwuCgpEYW5pZWwgKDExIEFwcmlsIDIwMDQpCi0gQXBwbGllZCBEYXZpZCBCeXJvbidzIHBhdGNoIGZvciB0aGUgTVNWQyBsaWJjdXJsIG1ha2VmaWxlIGZvciBidWlsZHMgd2l0aAogIHpsaWIuCgpEYW5pZWwgKDkgQXByaWwgMjAwNCkKLSBEaXJrIE1hbnNrZSBpbXByb3ZlZCB0aGUgdGltZXIgcmVzb2x1dGlvbiBmb3IgQ1VSTElORk9fKl9USU1FLCBpdCBjYW4gbm93CiAgYmUgZG93biB0byB1c2VjIGlmIHRoZSBzeXN0ZW0gc3lwcG9ydHMgaXQuCgpEYW5pZWwgKDcgQXByaWwgMjAwNCkKLSBBIHJlcXVlc3QgdGhhdCBzZW5kcyAiRXhwZWN0OiAxMDAtY29udGludWUiIGFuZCBnZXRzIG5vdGhpbmcgYnV0IGEgc2luZ2xlCiAgMTAwIHJlc3BvbnNlIGJhY2sgd2lsbCBub3cgcmV0dXJuIGEgQ1VSTEVfR09UX05PVEhJTkcuIFRlc3QgMTU4IHZlcmlmaWVzLgoKLSBUaGUgc3RydG9vZmZ0KCkgbWFjcm8gaXMgbm93IG5hbWVkIGN1cmx4X3N0cnRvb2ZmdCgpIHRvIHVzZSB0aGUgY3VybHhfKgogIGFwcHJvYWNoIGZ1bGx5LgoKRGFuaWVsICg2IEFwcmlsIDIwMDQpCi0gR2lzbGUgVmFuZW0ncyBmaXhlZCBidWcgIzkyNzk3OSByZXBvcnRlZCBieSBOYXRoYW4gTydTdWxsaXZhbi4gVGhlIHByb2JsZW0KICBtYWRlIGxpYmN1cmwgb24gV2luZG93cyBsZWFrIGEgc21hbGwgYW1vdW50IG9mIG1lbW9yeSBpbiBlYWNoIG5hbWUgcmVzb2x2ZQogIHdoZW4gbm90IHVzZWQgYXMgYSBETEwuCgotIE5ldyBhdXRoZW50aWNhdGlvbiBjb2RlIGFkZGVkLCBwYXJ0aWN1bGFybHkgbm90aWNhYmxlIHdoZW4gZG9pbmcgUE9TVCBvciBQVVQKICB3aXRoIERpZ2VzdCBvciBOVExNLiBsaWJjdXJsIHdpbGwgbm93IHVzZSBIRUFEIHRvIG5lZ290aWF0ZSB0aGUKICBhdXRoZW50aWNhdGlvbiBhbmQgd2hlbiBkb25lIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBQT1NULiBQcmV2aW91c2x5IGxpYmN1cmwKICBzZW50IFBPU1QgaW1tZWRpYXRlbHkgYW5kIGV4cGVjdGVkIHRoZSBzZXJ2ZXIgdG8gcmVwbHkgYSBmaW5hbCBzdGF0dXMgY29kZQogIHdpdGggYW4gZXJyb3IgYW5kIHRoZW4gbGliY3VybCB3b3VsZCBub3Qgc2VuZCB0aGUgcmVxdWVzdC1ib2R5IGJ1dCBpbnN0ZWFkCiAgc2VuZCB0aGVuIG5leHQgcmVxdWVzdCBpbiB0aGUgc2VxdWVuY2UuCgogIFRoZSByZWFzb24gZm9yIHRoaXMgY2hhbmdlIGlzIGR1ZSB0byBJSVM2IGJhcmZpbmcgb24gbGliY3VybCB3aGVuIHdlIGF0dGVtcHQKICB0byBQT1NUIHdpdGggTlRMTSBhdXRoZW50aWNhdGlvbi4gVGhlIHJlYXNvbiBmb3IgdGhlIHByb2JsZW1zIGlzIGZvdW5kIGluCiAgUkZDMjYxNiBzZWN0aW9uIDguMi4zIHJlZ2FyZGluZyBob3cgc2VydmVycyBzaG91bGQgZGVhbCB3aXRoIHRoZSAxMDAKICBjb250aW51ZSByZXF1ZXN0LWhlYWRlcjoKCiAgICAgICAgSWYgaXQgcmVzcG9uZHMgd2l0aCBhIGZpbmFsIHN0YXR1cyBjb2RlLCBpdCBNQVkgY2xvc2UgdGhlIHRyYW5zcG9ydAogICAgICAgIGNvbm5lY3Rpb24gb3IgaXQgTUFZIGNvbnRpbnVlIHRvIHJlYWQgYW5kIGRpc2NhcmQgdGhlIHJlc3Qgb2YgdGhlCiAgICAgICAgcmVxdWVzdC4KCiAgUHJldmlvdXMgdmVyc2lvbnMgb2YgSUlTIGNsZWFybHkgZGlkIGNsb3NlIHRoZSBjb25uZWN0aW9uIGluIHRoaXMgY2FzZSwKICB3aGlsZSB0aGlzIG5ld2VyIHZlcnNpb24gZGVjaWRlZCBpdCBzaG91bGQgInJlYWQgYW5kIGRpc2NhcmQiLiBUaGF0IHdvdWxkJ3ZlCiAgZm9yY2VkIHVzIHRvIHNlbmQgdGhlIHdob2xlIFBPU1QgKG9yIFBVVCkgZGF0YSBvbmx5IHRvIGhhdmUgaXQgZGlzY2FyZGVkIGFuZAogIHRoZW4gYmUgZm9yY2VkIHRvIHNlbmQgaXQgYWdhaW4uIFRvIGF2b2lkIHRoYXQgaHVnZSBwZW5hbGl0eSwgd2Ugc3dpdGNoIHRvCiAgdXNpbmcgSEVBRCB1bnRpbCB3ZSBhcmUgYXV0aGVudGljYXRlZCBhbmQgdGhlbiBzZW5kIHRoZSBQT1NULgoKICBUaGUgb25seSBhY3R1YWwgZHJhd2JhY2sgSSBjYW4gdGhpbmsgb2YgKGV4Y2VwdCBmb3IgdGhlIG9kZCBzaXRlcyB0aGF0IG1pZ2h0CiAgdHJlYXQgSEVBRCBkaWZmZXJlbnRseSB0aGFuIHRoZXkgd291bGQgdHJlYXQgUE9TVC9QVVQgd2hlbiBnaXZlbiB0aGUgc2FtZQogIFVSTCkgaXMgdGhhdCBpZiB5b3UgZG8gUE9TVCB3aXRoIENVUkxBVVRIX0FOWSBzZXQgYW5kIHRoZSBzaXRlIHJlcXVpcmVzIE5PCiAgYXV0aGVudGljYXRpb24sIGxpYmN1cmwgd2lsbCBzdGlsbCB1c2UgYSBIRUFEIGluIGEgZmlyc3Qgcm91bmQgYW5kIHRoZW4gZG8gYQogIFBPU1QuCgogIElmIHlvdSBkbyBhIEhFQUQgb3IgYSBHRVQgb24gYSBzaXRlIHVzaW5nIENVUkxBVVRIX0FOWSwgbGliY3VybCB3aWxsIHNlbmQKICBhbiB1bi1hdXRoZW50aWNhdGVkIHJlcXVlc3QgYXQgb25jZSwgd2hpY2ggdGhlbiBpcyB0aGUgb25seSByZXF1ZXN0IGlmIHRoZQogIHNpdGUgcmVxdWlyZXMgbm8gYXV0aC4KCiAgQWxhbiBQaW5zdGVpbiBoZWxwZWQgbWUgd29yayBvdXQgdGhlIHByb3RvY29sIGRldGFpbHMgYnkgZmlndXJpbmcgb3V0IHdoeQogIGxpYmN1cmwgZmFpbGVkIGFuZCB3aGF0IElJUzYgZXhwZWN0cy4KCi0gVGhlIC0tbGltaXQtcmF0ZSBsb2dpYyB3YXMgY29ycmVjdGVkIGFuZCBub3cgaXQgd29ya3MgYSBsb3QgYmV0dGVyIGZvcgogIGhpZ2hlciBzcGVlZHMsIHN1Y2ggYXMgJzEwbScgb3Igc2ltaWxhci4gUmVwb3J0ZWQgaW4gYnVnIHJlcG9ydCAjOTMwMjQ5LgoKLSBJbnRyb2R1Y2luZyBjdXJseF90dm5vdygpIGFuZCBjdXJseF90dmRpZmYoKSB1c2luZyB0aGUgbmV3IGN1cmx4XyogZmFzaGlvbi4KICAjaW5jbHVkZSAidGltZXZhbC5oIiBmcm9tIHRoZSBsaWIgZGlyIHRvIGdldCB0aGUgcHJvdG9zIGV0Yy4gIE5vdGUgdGhhdAogIHRoZXNlIGFyZSBOT1QgcGFydCBvZiB0aGUgbGliY3VybCBBUEkuIFRoZSBjdXJsIGFwcCBzaW1wbHkgdXNlcyB0aGUgc2FtZQogIHNvdXJjZSBmaWxlcyBhcyB0aGUgbGlicmFyeSBkb2VzIGFuZCB0aGVyZWZvcmUgdGhlIGZpbGUgbmVlZHMgdG8gYmUgY29tcGlsZWQKICBhbmQgbGlua2VkIHdpdGggY3VybCB0b28sIG5vdCBqdXN0IHdoZW4gY3JlYXRpbmcgbGliY3VybC4KCi0gbGliL3N0cmVycm9yLmMgbm8gbG9uZ2VyIHVzZXMgc3lzX25lcnIgb24gbm9uLXdpbmRvd3MgcGxhdGZvcm1zIHNpbmNlIGl0CiAgaXNuJ3QgcG9ydGFibGUgZW5vdWdoCgpEYW5pZWwgKDIgQXByaWwgMjAwNCkKLSBJbiB0aGUgY3VybF9zdHJucXVhbC4zIG1hbiBwYWdlLCB3ZSBub3cgcHJlcGVuZCB0aGUgbWFuMyBkaXIgdG8gdGhlIGZpbGUKICBuYW1lIHRvIHdvcmsgYmV0dGVyLiBBcyBwb2ludGVkIG91dCBieSBSb2JpbiBLYXkuCgotIEFuZHLpcyBHYXJj7WEgdXBkYXRlZCB0aGUgbWluZ3cgbWFrZWZpbGVzLgoKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIHByb2JsZW0gSSByZWNlbnRseSBhZGRlZCBpbiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgY29kZSB0aGF0CiAgYnJva2Ugc3Vic2Vjb25kIHJlc29sdXRpb24gZm9yIENVUkxJTkZPX1RPVEFMX1RJTUUuIEhlIGFsc28gcG9pbnRlZCBvdXQgYQogIG1pc3Rha2UgaW4gdGhlIGNvZGUgdGhhdCBwcm9kdWNlcyB0aGUgZmluYWwgdXBkYXRlIG9mIHRoZSBwcm9ncmVzcyBtZXRlcgogIHRoYXQgd291bGQgb2Z0ZW4gcHJldmVudCBpdCBmcm9tIGFjdHVhbGx5IGJlaW5nIHVwZGF0ZWQgdGhhdCBmaW5hbCB0aW1lLgoKRGFuaWVsICgxIEFwcmlsIDIwMDQpCi0gRGlyayBNYW5za2UgZml4ZWQgYSBtZW1vcnkgbGVhayB0aGF0IGhhcHBlbmVkIHdoZW4gd2UgdXNlIGFyZXMgZm9yIG5hbWUKICByZXNvbHZlcyBhbmQgZGVjaWRlcyB0byB0aW1lLW91dCBiZWZvcmUgYXJlcyBkb2VzIGl0LiBUaGlzIGZpeCB1c2VzIHRoZQogIGJyYW5kIG5ldyBhcmVzX2NhbmNlbCgpIGZ1bmN0aW9uIHdoaWNoIGlzIG5vdCBwcmVzZW50IGluIGMtYXJlcyAxLjEuMC4KCiAgV2hlbiB0b2xkIHRvIGVuYWJsZSBhcmVzLCB0aGUgY29uZmlndXJlIHNjcmlwdCBub3cgY2hlY2tzIGZvciBwcmVzZW5jZSBvZgogIHRoZSBhcmVzX2NhbmNlbCBmdW5jdGlvbiB0byBhbGVydCB1c2VycyBpZiB0aGV5IGF0dGVtcHQgdG8gdXNlIGEgdG9vIG9sZAogIGMtYXJlcyBsaWJyYXJ5LgoKRGFuaWVsICgzMSBNYXJjaCAyMDA0KQotIFJveSBTaGFuIGZpeGVkIGEgZmxhdyB0aGF0IHByZXZlbnRlZCBhcmVzIG5hbWUgcmVzb2x2ZSB0aW1lb3V0cyB0byBvY2N1ciEKCi0gRGlyayBNYW5za2UgZm91bmQgb3V0IHRoYXQgbGliY3VybCB0aW1lZCBvdXQgd2FpdGluZyBmb3IgcmVzb2x2ZXMgZmFyIHRvbwogIGVhc3kgd2hlbiBsaWJjdXJsIHdhcyBidWlsdCB0byB1c2UgKGMtKWFyZXMgZm9yIG5hbWUgcmVzb2x2aW5nLgoKLSBGdXJ0aGVyIERpZ2VzdCBmaXhpbmcgYW5kIGEgc3VjY2Vzc2Z1bCB0ZXN0IGNhc2UgMTUzIG5vdyBtYWtlcyBtZSBiZWxpZXZlCiAgTWl0eiBXYXJrJ3MgcHJvYmxlbXMgYXJlIGZpeGVkLgoKLSBBbmRyZXMgR2FyY2lhIGZpZ3VyZWQgb3V0IHRoYXQgdGVzdCBjYXNlIDYzLCB3aGlsZSB3b3JraW5nLCBvbmx5IHByb3ZlZCBhCiAgZmxhdyBpbiBsaWJjdXJsJ3MgJ2h0dHBfcHJveHknIHBhcnNlciB3aGVuIGEgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBpcwogIHByb3ZpZGVkLiBUaGUgdXNlciBuYW1lIHdhcyBub3QgZXh0cmFjdGVkIHByb3Blcmx5IChhbmQgJ2h0dHAnIHdhcyBhbHdheXMKICB1c2VkIGFzIHVzZXIgbmFtZSkuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgY29tcGlsZXIgd2FybmluZ3MgaW4gb3VyIGlvY3Rsc29ja2V0KCkgdXNhZ2UuCgpEYW5pZWwgKDMwIE1hcmNoIDIwMDQpCi0gSm9lIEhhbHBpbiBmYWNlZCBwcm9ibGVtcyB3aXRoIHRoZSBnZXRuYW1laW5mbygpIGFyZ3VtZW50IGFpX2ZsYWdzIGFuZCB0aGUKICBwYXJ0aWN1bGFyIGJpdCBuYW1lZCAnTklfV0lUSFNDT1BFSUQnIG9uIFNvbGFyaXMgOSBmb3IgSW50ZWwuICBJJ3ZlIG5vdwogIHdyaXR0ZW4gYSBjb25maWd1cmUgdGVzdCB0aGF0IGNoZWNrcyBmb3IgYSB3b3JraW5nIE5JX1dJVEhTQ09QRUlECiAgaW1wbGVtZW5hdGlvbi4gTm8gY29kZSB1c2VzIHRoZSByZXN1bHQgZnJvbSB0aGlzIHRlc3QgeWV0LCBpdCBpcyBzdGlsbAogIGV4cGVyaW1lbnRhbC4gSmFtZXMgQ2FybHNvbiB3cm90ZSBpbiBjb21wLnVuaXguc29sYXJpczogIkl0J3MgYSBidWcKICAoNTAwNjYyMykgLS0gaXQncyBub3Qgc3VwcG9ydGVkIGFuZCBzaG91bGRuJ3QgYmUgaW4gdGhlIGhlYWRlciBmaWxlLiIKCi0gSSBwcm92aWRlZCBNaXR6IFdhcmsgd2l0aCBhIGZpcnN0IHBhdGNoIGluIG9yZGVyIHRvIGZpeCBsaWJjdXJsJ3MgcHJvYmxlbXMKICB0byByZS1uZWdvdGlhdGUgRGlnZXN0IGF1dGhlbnRpY2F0aW9uICh3aGVuICdzdGFsZT10cnVlJyBpcyBpbmNsdWRlZCBpbiB0aGUKICByZXNwb25zZSBoZWFkZXIpLgoKLSBSb3kgU2hhbiBkaXNjb3ZlcmVkIHRoYXQgdGhlIG11bHRpIGludGVyZmFjZSBkaWRuJ3QgcHJvcGVybHkgdGltZW91dCBuYW1lCiAgbG9va3VwcyB3aGljaCBjb3VsZCBtYWtlIGhhbmRsZXMgZ2V0IHN0dWNrIGluIHRoYXQgc3RhdGUgYW5kIHRodXMgbmV2ZXIgZ2V0CiAgY29tcGxldGVkLiBJJ3ZlIHByb2R1Y2VkIGEgZmlyc3QgdGVzdCBwYXRjaCB0aGF0IGF0dGVtcHRzIHRvIGNvcnJlY3QgdGhpcy4KCi0gRGF2aWQgQnlyb24ncyBwYXRjaCB3YXMgYXBwcGxpZWQgdG8gbWFrZSBDVVJMT1BUX0ZBSUxPTkVSUk9SIHdvcmsgbmljZWx5CiAgZXZlbiB3aXRoIGF1dGhlbnRjYXRpb25zIHN1Y2ggYXMgTlRMTSBvciBEaWdlc3QgZW5hYmxlZC4gVGVzdCBjYXNlcyAxNTAsIDE1MQogIGFuZCAxNTIgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgpEYW5pZWwgKDI5IE1hcmNoIDIwMDQpCi0gR2lzbGUgVmFuZW0gdXBkYXRlZCBmaWxlcyBmb3IgdGhlIGRqZ3BwL01TLURPUyBidWlsZC4KCi0gQW5kculzIEdhcmPtYSBoZWxwZWQgbWUgd29yayBvdXQgYSBmaXggZm9yIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgdG8gbWFrZQogIHRoZSBmaWxlOi8vIHRlc3RzIHJ1biBmaW5lIHdoZW4gdGVzdGVkIHdpdGggdGhlIG1pbmd3LWJ1aWx0IHZlcnNpb24gb2YgY3VybC4KCi0gRml4ZWQgYW4gaW5jbHVkZSBpc3N1ZSB3aXRoIG5ldGluZXQvdGNwLmggb24gQUlYLCBiYXNlZCBvbiBpbnB1dCBieSBUb3IuCiAgVGhpcyBhbHNvIHJlcXVpcmVkIGEgbWlub3IgZml4IG9mIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKLSBUaGUgcG9zdGl0Mi5jIHNvdXJjZSBleGFtcGxlIHVzZWQgdGhlIHdyb25nIHN0cnVjdCBuYW1lIGZvciB0aGUgcG9zdCBkYXRhLgoKRGFuaWVsICgyNiBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtIGltcHJvdmVkIGlwdjYgc3VwcG9ydCBvbiB3aW5kb3dzIGJ5IG1ha2luZyB0aGUgY3VybCBidWlsZCB0byB1c2UKICB0aGUgY29ycmVjdCBnZXRhZGRyaW5mbygpIGZ1bmN0aW9uLgoKRGFuaWVsICgyNSBNYXJjaCAyMDA0KQotIEl0IHR1cm5lZCBvdXQgdGhhdCBBSVgsIGRlc3BpdGUgaGF2aW5nIGEgInRocmVhZC1zYWZlIGxpYmMiLCBkb2Vzbid0IG9mZmVyCiAgYWxsIHRyYWRpdGlvbmFsIGZ1bmN0aW9ucyB0aHJlYWQtc2FmZS4gVGhpcyBVUkwgaXMgaW5mb3JtYXRpdmUgb24gdGhpcwogIHN1YmplY3Q6CgogICAgaHR0cDovL3B1YmxpYm4uYm91bGRlci5pYm0uY29tL2RvY19saW5rL2VuX1VTL2FfZG9jX2xpYi9haXhwcmdnZC8gXAogICAgZ2VucHJvZ2MvdGhyZWFkX3F1aWNrX3JlZi5odG0KCiAgQXMgYSByZXN1bHQgb2YgdGhpcywgd2Ugbm93IGNoZWNrIGZvciB0aHJlZSAqX3IoKSBmdW5jdGlvbnMgb24gcmVjZW50IEFJWAogIHZlcnNpb25zIGFzIHdlbGwgdGhhdCB0aGUgVVJMIG1lbnRpb25zIGFyZW4ndCB0aHJlYWQtc2FmZSBpbiBBSVggNS4xLgoKLSByZW5hbWVkIGN1cmxfc3RyZXJyb3IuW2NoXSB0byBzdHJlcnJvci5bY2hdCgotIEpvZSBIYWxwaW4gYWRkZWQgQ1VSTE9QVF9UQ1BfTk9ERUxBWSBhbmQgLS10Y3Atbm9kZWxheSB0byBtYWtlIGl0IHBvc3NpYmxlCiAgZm9yIHVzZXJzIHRvIGRpc2FibGUgdGhlIE5hZ2xlIGFsZ29ydGhpbS11c2FnZS4KCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgc29tZSBpbnRlcmVzdGluZyBzdHJlcnJvcl9yKCkga25vd2xlZGdlLiBnbGliYyBoYXMgaXRzCiAgb3duIEFQSSB3aGljaCBkaWZmZXJzIGZyb20gdGhlIFBPU0lYIG9uZS4gRGFuaWVsIGFkanVzdGVkIHRoZSBjb25maWd1cmUKICBzY3JpcHQgdG8gZGV0ZWN0IHRoZSB2ZXJzaW9uIGluIHVzZSwgYW5kIHRoZSBjb2RlIG5vdyB1c2VzIHRoZSBuZXcgZGVmaW5lcwogIGFjY29yZGluZ2x5LgoKLSBGaXhlZCBzb21lIGJ1aWxkIGZsYXdzIHdpdGggdGhlIG5ldyBsaWIvY3VybF9zdHJlcnJvci5jIHNvdXJjZSBmaWxlLgoKRGFuaWVsICgyNCBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgZml4IHRvIHJlcGxhY2UgdGhlIGJhZCB1c2Ugb2Ygc3RyZXJyb3IoKS4gVGhpcyBpbnRyb2R1Y2VzCiAgQ3VybF9zdHJlcnJvcigpIHRoYXQgYXR0ZW1wdHMgdG8gYmUgdGhyZWFkLXNhZmUgX2FuZF8gd29ya3Mgb24gV2luZG93cyB0b28hCgotIFRvciBBcm50c2VuIHNwZWxsLWZpeGVkIGxvdHMgb2YgbGliY3VybCBtYW4gcGFnZXMuCgotIFRvciBBcm50c2VuIG1hZGUgdGVzdGN1cmwucGwgd29yayB3aXRoIG9sZGVyIHBlcmwgNSB2ZXJzaW9ucywgYW5kIERhbmllbAogIG1hZGUgaXQgbm90IHVzZSBjaGRpciAuLiB0byBnbyBiYWNrLCBhcyB0aGF0IGlzbid0IHZlcnkgZ29vZCB3aGVuIHlvdSd2ZQogIHNldHVwIGEgdGVzdGRpciBjb250YWluaW5nIHN5bWxpbmtzLgoKLSBBZGRlZCBhIGNoZWNrIGZvciBzdHJlcnJvcl9yKCkgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDQpCi0gQWRkZWQgR3JlZyBIZXdnaWxsJ3MgdGVzdGN1cmwucGwgc2NyaXB0IHRvIENWUy4gV2UgaGF2ZSBub3QgbW92ZWQgb3ZlciB0bwogIHVzZSB0aGlzIHNjcmlwdCBmb3IgdGhlIHJlYWwgZGlzdHJpYnV0ZWQgdGVzdGluZyBqdXN0IHlldCwgYnV0IGl0IGlzIG9ubHkKICBhIG1hdHRlciBvZiB0aW1lLgoKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBjb2RlIHRoYXQgbWFrZXMgY3VybCByZXBvcnQgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZQogIGlmIC0taW50ZXJmYWNlIGZhaWxzIG9uIHdpbmRvd3MuCgotIFRoZSByZWd1bGFyIHByb2dyZXNzIG1ldGVyIGlzIG5vdyBmaXhlZCB0byBuZXZlciB3cmFwIGR1ZSB0byBsb25nIGxpbmVzLiBBbGwKICBmaWVsZHMgYXJlIG5vdyBzdGF0aWMgc2l6ZWQuIElmIHRoZSB0aW1lIGluIHRoZSB0aW1lIGZpZWxkcyBnZXQgYSB0aW1lIHZhbHVlCiAgdGhhdCB3b3VsZCByZXByZXNlbnQgYSB0aW1lIHRoYXQgaXMgMTAwIGhvdXJzIG9yIG1vcmUgKGlmIG5vdCwgaXQgcmVtYWlucwogIHVzaW5nIGEgSEg6TU06U1MgZGlzcGxheSksIGl0IHN3aXRjaGVzIGZpcnN0IHRvIGEgIk5OTmQgTk5oIiBkaXNwbGF5IChmb3IKICBkYXlzIGFuZCBob3VycykgYW5kIGlmIHRoYXQgaXNuJ3QgZW5vdWdoIGl0IHN3aXRjaGVzIHRvIGEgIk5OTmQiIGRpc3BsYXkgaWYKICBpdCBpcyBtb3JlIHRoYW4gOTk5IGRheXMuCgogIFNldmVyYWwgb2YgdGhlIGNhbGN1bGF0aW9ucyB3ZXJlIGFsc28gbW92ZWQgdG8gZml4ZWQtcG9pbnQgbWF0aCBpbnN0ZWFkIG9mCiAgdXNpbmcgZG91Ymxlcy4KCkRhbmllbCAoMjIgTWFyY2ggMjAwNCkKLSBHbGVuIE5ha2FtdXJhIG5vdGljZWQgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgZGlkbid0IHdvcmsgYXMgaXQKICB1c2VkIHRvIGRvIGlmIENVUkxPUFRfTk9CT0RZIGlzIHNldCBUUlVFLgoKLSBLZXZpbiBSb3RoIHBhdGNoZWQgdGhlIGN5Z3dpbiBwYWNrYWdlIG1ha2VmaWxlIGFuZCBSRUFETUUgdG8gYWRqdXN0IHRvCiAgbmV3IGN5Z3dpbiBwYWNrYWdpbmcgZ3VpZGVsaW5lcy4KCi0gRW5hYmxlZCAiTlQgcmVzcG9uc2VzIiBpbiB0aGUgTlRMTSBhdXRoZW50aWNhdGlvbi4gRG9pbmcgdGhpcyBzaW1wbHkgbWVhbnMKICB0aGF0IHdlIHByb3ZpZGUgYW4gZXh0cmEgY2h1bmsgb2YgZGF0YSBpbiBlYWNoICJ0eXBlLTMgbWVzc2FnZSIuIFRoZSBvbmx5CiAgcmVhc29uIGZvciBkb2luZyB0aGlzIGlzIHRoYXQgaXQgc2VlbXMgdGhhdCB1c2luZyBvbmx5IHRoZSAiTGFubWFuYWdlciBoYXNoIgogIChhcyB3ZSd2ZSBiZWVuIGRvaW5nIHVudGlsIG5vdykgZG9lc24ndCBzdXBwb3J0IHBhc3N3b3JkcyBsb25nZXIgdGhhbiAxNAogIGNoYXJhY3RlcnMgYW5kIGl0IHR1cm5zIG91dCB0aGVyZSBhcmUgdXNlcnMgb3V0IHRoZXJlIHdobyB3YW50IHRvIHVzZQogIGxpYmN1cmwgYW5kIE5UTE0gd2l0aCBzdWNoIHBhc3N3b3JkcyEgOy0pIFNldmVuIE5UTE0tcmVsYXRlZCB0ZXN0IGNhc2VzIHdlcmUKICB1cGRhdGVkIGFjY29yZGluZ2x5LiBNZW50aW9uZWQgYXMgaXNzdWUgMjkgaW4gVE9ETy1SRUxFQVNFLCBidWcgcmVwb3J0CiAgIzkxNTYwOQoKLSBNb3ZlZCB0aGUgZ2VuZXJhdGVkIGxpYmN1cmwgdmVyc2lvbiBpbmZvIHRvIGEgbmV3IGhlYWRlciBmaWxlLCBuYW1lZAogIGN1cmwvY3VybHZlci5oLiBOb3cgaW50ZXJlc3RlZCBwYXJ0aWVzIGNhbiBpbmNsdWRlIE9OTFkgdmVyc2lvbiBpbmZvLCBzaG91bGQKICBhbnlvbmUgd2FudCB0aGF0IChhbmQgaXQgc2VlbXMgYXQgbGVhc3Qgc29tZSB3aW5kb3dzIHJlc291cmNlIGZpbGVzIHdvdWxkKS4KICBNZW50aW9uZWQgYXMgaXNzdWUgMjcgaW4gVE9ETy1SRUxFQVNFLgoKRGFuaWVsICgyMSBNYXJjaCAyMDA0KQotIEZpeGVkIHRoZSByb290IE1ha2VmaWxlIHRvIHVzZSB0YWJzIGZvciB0aGUgbmV0d2FyZSB0YXJnZXQuIEf8bnRlciBLbmF1ZgogIHBvaW50ZWQgdGhpcyBvdXQuCgotIE1hcnR5IEt1aHJ0J3MgVk1TIGNsZWFudXAKCi0gVGhvbWFzIFNjaHdpbmdlIG1hZGUgYnVpbGRjb25mIHJlY29nbml6ZSBBQ0xPQ0FMX0ZMQUdTIHRvIGludm9rZSBhY2xvY2FsCiAgd2l0aCBwYXJ0aWN1bGFyIHByZS1kZXRlcm1pbmVkIG9wdGlvbnMuCgpWZXJzaW9uIDcuMTEuMSAoMTkgTWFyY2ggMjAwNCkKCkRhbmllbCAoMTggTWFyY2ggMjAwNCkKLSBUb3IgQXJudHNlbiBicm91Z2h0IHNvbWUgaW5mbyBhYm91dCBTR0kgSVJJWDoKCiAgSVJJWCBzdXBwb3J0cyAzIGRpZmZlcmVudCBleGVjdXRhYmxlL29iamVjdCBmb3JtYXRzLCAtMzIsIC1uMzIgYW5kIC02NC4KICAtbjMyIGlzIGRlZmF1bHQgMzItYml0IGZvcm1hdCwgLTMyIGlzIHRoZSAib2xkIiAzMi1iaXQgZm9ybWF0LCBhbmQgLTY0IGlzCiAgdGhlIDY0LWJpdCBmb3JtYXQuICBMaWJyYXJpZXMgZm9yIHRoZSBkaWZmZXJlbnQgZm9ybWF0cyBhcmUgaW4gbGliLCBsaWIzMgogIGFuZCBsaWI2NCByZXNwZWN0aXZlbHkuCgogIFdlJ3ZlIG5vdyBhZGp1c3RlZCB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBhZGFwdCB0byB0aGlzIHdoZW4gc2Nhbm5pbmcgZm9yCiAgM3JkIHBhcnR5IGxpYnMsIHN1Y2ggYXMgT3BlblNTTC4KCkRhbmllbCAoMTcgTWFyY2ggMjAwNCkKLSBXYXR6IHBvaW50ZWQgb3V0IGEgZmV3IG1pc3NpbmcgZmlsZXMgaW4gdGhlIE1TVkMgcHJvamVjdCBkZXNjcmlwdGlvbiBmaWxlLgoKLSBH/G50ZXIgS25hdWYgYnJvdWdodCBwYXRjaGVzLCBjb2RlIGFuZCBtYWtlZmlsZXMgdG8gYnVpbGQgY3VybCBvbiBOb3ZlbGwKICBOZXRXYXJlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDA0KQotIExvdHMgb2YgbGliY3VybCBtYW4gcGFnZXMgd2VyZSB1cGRhdGVkIHRvIGNvbnRhaW4gcmVmZXJlbmNlcyB0byBvdGhlciBtYW4KICBwYWdlcyB0aGUgcmVjb2duaXplZCB3YXkgc28gdGhhdCB0aGV5IGFwcGVhciBhcyBuaWNlIGh5cGVybGlua3MgaW4gdGhlIEhUTUwKICB2ZXJzaW9ucy4KCi0gYnVpbGRjb25mIG5vdyBjaGVja3MgdGhlIG00IHZlcnNpb24gdG9vLCBzaW5jZSBhdXRvY29uZiByZXF1aXJlcyBhIEdOVSBtNAogIHZlcnNpb24gdG8gYnVpbGQgcHJvcGVyIGNvbmZpZ3VyZSBzY3JpcHRzLgoKRGFuaWVsICgxMiBNYXJjaCAyMDA0KQotIEFkZGVkIENVUkxPUFRfUE9TVEZJRUxEU0laRV9MQVJHRSwgdGhlIGxhcmdlIGZpbGUgdmVyc2lvbiBvZgogIENVUkxPUFRfUE9TVEZJRUxEU0laRSB0byBhbGxvdyBQT1NUcyBsYXJnZXIgdGhhbiAyR0IuCgotIERhdmlkIEJ5cm9uIGZpeGVkIGFuIHVuaW5pdGlhbGl6ZWQgdmFyaWFibGUgY2FzZS9jcmFzaC4KCkRhbmllbCAoMTAgTWFyY2ggMjAwNCkKLSBKZWZmIExhd3NvbiBmaXhlZCB0aGUgU1NMIGNvbm5lY3Rpb24gdG8gZGVhbCB3aXRoIHJlY2VpdmVkIHNpZ25hbHMgZHVyaW5nIHRoZQogIGNvbm5lY3QuCgotIENoYW5nZWQgdGhlIE9TIHN0cmluZyBmb3Igd2luMzIgdG8gYmVjb21lICJpMzg2LXBjLXdpbjMyIi4KCkRhbmllbCAoOSBNYXJjaCAyMDA0KQotIENoYW5nZWQgdGhlIGludGVybmFscyB0byB1c2UgY3VybF9zb2NrZXRfdCBmb3Igc29ja2V0IHZhcmlhYmxlIHR5cGUuIFRoaXMKICBzaG91bGQgZW5hYmxlIHVzIHRvIGJ1aWxkIHdpdGggbGVzcyB3YXJuaW5ncyBvbiBXaW5kb3dzLCB3aGVyZSBTT0NLRVQgaXMKICB1c2VkIHdoaWNoIGlzIGFuIHVuc2lnbmVkIGludCwgd2hpbGUgbW9zdCBvdGhlciBwbGF0Zm9ybXMgdXNlIGEgbWVyZSBpbnQuCgotIE1vZGlmaWVkIGxpYi9jb25maWctd2luMzIuaCB0byBidWlsZCBmaW5lIG9uIE1TVkMgYWdhaW4uCgpWZXJzaW9uIDcuMTEuMS1wcmUxICg4IE1hcmNoIDIwMDQpCgpEYW5pZWwgKDggTWFyY2ggMjAwNCkKLSBNaW5vciBmaXggdG8gbWFrZSBjdXJsIENVUkxfVkVSU0lPTl9MQVJHRUZJTEUgaXMgb25seSBzZXQgaWYgY3VybF9vZmZfdCBpcwogIGxhcmdlciB0aGFuIDQgYnl0ZXMuCgpEYW5pZWwgKDQgTWFyY2ggMjAwNCkKLSBJbXByb3ZlZCBQVVQvUE9TVCB3aXRoIE5UTE0vRGlnZXN0IGF1dGhlbnRpY2F0aW9uLCB0aGUgc28gY2FsbGVkIGlzc3VlIDEyLgoKLSBNb2RpZmllZCB0aGUgdGVzdCBIVFRQIHNlcnZlciBhIGxvdCB0byB3b3JrIHdpdGggdGhlIHVwY29taW5nIGNoYW5nZXMgZm9yCiAgUFVUL1BPU1Qgd2l0aCBOVExNL0RpZ2VzdCBhdXRoZW50aWNhdGlvbiAobGlrZSB0ZXN0IGNhc2UgODgpLiBBZGRlZCBBbmRy6XMKICBHYXJj7WEncyB3aW4zMi1jaGFuZ2VzLiBJbXByb3ZlZCB0aGUgbG9nZ2luZy4KCi0gRml4ZWQgdGhlIGZpbGU6LXJlbGF0ZWQgcHJvZ3Jlc3MvZ2V0aW5mbyBzdHVmZiBhIGJpdCBtb3JlLgoKRGFuaWVsICg0IE1hcmNoIDIwMDQpCi0gSSBjb3JyZWN0ZWQgYSBwcm9ibGVtIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSB3aGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOgogIGhlYWRlciBvciB3aGVuIGRvaW5nIG11bHRpcGxlLXJlcXVlc3QgYXV0aGVudGljYXRpb25zLiBBIHN1YnNlcXVlbnQgcmVxdWVzdAogIGNvdWxkIGVycm9uZW91c2x5IHJlLXVzZSBhIHByZXZpb3VzIGNvbm5lY3Rpb24gdGhhdCB3YXMgc2VudCB3aXRoCiAgQ29ubmVjdGlvbjogY2xvc2UuIENocmlzdG9waGVyIFIuIFBhbG1lciByZXBvcnRlZC4KCi0gQW5kculzIEdhcmPtYSBwYXRjaGVkIGN1cmwgdG8gcHJldmVudCB3YXJuaW5ncyB3aGlsZSBjb21waWxpbmcgd2l0aCBtaW5ndywKICBtYWlubHkgYmVjYXVzZSBpdCBpcyBub3cgcG9zc2libGUgdG8gaGF2ZSBib3RoIFdJTjMyIGFuZCBIQVZFX0NPTkZJR19ICiAgZGVmaW5lZC4KCi0gV2hlbiB0cmFuc2ZlcnJpbmcgZmlsZXMgZnJvbSBhIGZpbGU6IFVSTCwgdGhlIHByb2dyZXNzIG1ldGVyIGFuZCBvdGhlcgogIHRyYW5zZmVyIG1ldHJpY3Mgd2VyZSBub3QgdXBkYXRlZCBwcm9wZXJseS4KCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSAidmVyc2lvbiByZXNvdXJjZSIgZmlsZSB0byB0aGUgY3VybCBleGVjdXRhYmxlIGZvcgogIHRoZSB3aW5kb3dzIGJ1aWxkcy4KCkRhbmllbCAoMyBNYXJjaCAyMDA0KQotIERhdmlkIEJ5cm9uJ3Mgd29yayBvbiBtYWtpbmcgbGliY3VybCBvbmx5IHJlcXVpcmUgd2luc29jayAxLjEgb24gV2luZG93cwogIG1hY2hpbmVzLgoKLSBNb3JlIHZhcmlhYmxlIGNsZWFudXBzIGJhc2VkIG9uIGNvbXBpbGVyIHdhcm5pbmdzIGdlbmVyYXRlZCBieSBUb3IgQXJudHNlbidzCiAgYXV0b2J1aWxkcyB3aXRoIE1JUFNQcm8uCgotIEpvZSBIYWxwaW4gaGVscGVkIHVzIGZpeCBzb21lIHBlZGFudGljIGNvbXBpbGVyIHdhcm5pbmdzIG9uIEZyZWVCU0QuCgotIEFwcGxpZWQgVG9tIEJhdGVzJyBwYXRjaCB0byBidWlsZCBvbiBuc3ItdGFuZGVtLW5zay4KCi0gRGFuIEZhbmRyaWNoIGNvcnJlY3RlZCBzb21lIGZsYXdzIGluIHRoZSBjb25maWd1cmUgR1NTIGRldGVjdGlvbi4KCkRhbmllbCAoMiBNYXJjaCAyMDA0KQotIEZpeGVkIHRoZSBsaWJjdXJsIGNvZGUgdG8gdXNlIEZPUk1BVF9PRkZfVCBmb3IgcHJpbnRmKCkgZm9ybWF0dGluZwogIGN1cmxfb2ZmX3QgdHlwZXMgaW50ZXJuYWxseS4KCkRhbmllbCAoMSBNYXJjaCAyMDA0KQotIEFkZGVkIENVUkxfVkVSU0lPTl9MQVJHRUZJTEUgYXMgYSBmZWF0dXJlLWJpdCBpbiB0aGUgY3VybF92ZXJzaW9uX2luZm8oKQogIHJlc3BvbnNlLCB0aGF0IHNpZ25hbHMgaWYgdGhpcyBsaWJjdXJsIHN1cHBvcnRzID4yR0IgZmlsZXMuIGN1cmwgLVYgbm93CiAgb3V0cHV0cyAnTGFyZ2VmaWxlJyBpbiB0aGUgRmVhdHVyZXM6IGZpZWxkIGlmIHRoaXMgaXMgdGhlIGNhc2UuIE1vc3Qgc3lzdGVtcwogIGFyZSBsaWtlbHkgdG8gc3VwcG9ydCB0aGlzLgoKLSBXZSBvZmZlciBhIENVUkxfRk9STUFUX09GRl9UIGRlZmluZSBpbiB0aGUgcHVibGljIGhlYWRlciwgd2hpY2ggY2FuIGJlIHVzZWQKICB0byBwcmludGYoKSBjdXJsX29mZl90IHZhcmlhYmxlcy4gV2UgYWxzbyBtb2RpZmllZCB0aGUgbGliY3VybCBzb3VyY2VzIHRvCiAgdXNlIHRoaXMgZGVmaW5lIGluc3RlYWQgb2YgdGhlIHByZXZpb3VzICVPZCBhcHByb2FjaCAoYWx0aG91Z2ggSSd2ZSBsZWZ0IHRoZQogIE8tZmxhZyBmdW5jdGlvbmFsIGluIHRoZSBjb2RlKS4gVGhpcyBzaG91bGQgYWxzbyBwcmV2ZW50IGNvbXBpbGVycyB0byB3YXJuCiAgb24gdGhlIGhvbWUtZ3Jvd24gb3B0aW9uLgoKLSBGaXhlZCB0aGUgcmVzdW1lLWNoZWNrIGNvZGUgdG8gdGVzdCBmb3IgYSB3b3JraW5nIHJlc3VtZSBhdCB0aGUgZW5kIG9mIHRoZQogIGhlYWRlcnMgYW5kIG5vdCBhdCB0aGUgZmlyc3QgYm9keS1ieXRlLgoKLSBDVVJMT1BUX0ROU19VU0VfR0xPQkFMX0NBQ0hFIGlzIG5vdyBjb25zaWRlcmVkIG9ic29sZXRlLiBTdG9wIHVzaW5nIGl0LiBJZgogIHlvdSBuZWVkIGEgZ2xvYmFsIEROUyBjYWNoZSBmb3Igd2hhdGV2ZXIgcmVhc29uLCB1c2UgdGhlIHNoYXJlIGludGVyZmFjZSBhbmQKICB5b3UnbGwgZ2V0IGEgZ2xvYmFsIGNhY2hlIHRoYXQgd29ya3MgdGhlIHdheSBpdCBzaG91bGQgd29yay4gWW91IGNhbiBldmVuCiAgaGF2ZSBhbnkgbnVtYmVyIG9mIGdsb2JhbCBjYWNoZXMsIGFsbCBhdCB5b3VyIGNvbW1hbmQuIFRoaXMgaXMgbm93IGFsc28KICBtZW50aW9uZWQgaW4gdGhlIGRvY3MuCgotIE1hZGUgdGhlICpwcmludGYgY29kZSBzdXBwb3J0IHRoZSB6LWZsYWcgdG8gZW5hYmxlIHNpemVfdCBwcmludGYoKSBpbiBhCiAgbWFubmVyIHNpbWlsYXIgdG8gaG93IGdsaWJjIGFsbG93cyBpdC4gVG8gbWFrZSBwcmludGZpbmcgb2YgdGhpcyB3b3JrIG9uCiAgcGxhdGZvcm1zIHdpdGggNjRiaXQgc2l6ZV90IGFuZCAzMmJpdCBpbnRzLiBJZiB0aGVyZSBldmVuIGFyZSBhbnkhIDstKQoKLSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgZGlzY292ZXJlZCB0aGF0IGlmIHlvdSBDVVJMT1BUX0ZSRVNIX0NPTk5FQ1QgYW5kCiAgQ1VSTEFVVEhfTlRMTSAob3IgQ1VSTEFVVEhfQU5ZIGFuZCBsaWJjdXJsIHRoZW4gcGlja2VkIE5UTE0pLCBsaWJjdXJsIHdvdWxkCiAgbG9vcCB3aXRob3V0IHN1Y2NlZWRpbmcgdG8gYXV0aGVudGljYXRlIGR1ZSB0byB0aGUgbmV3IGNvbm5lY3Rpb24gdGhhdCB3YXMKICBtYWRlIGZvciBhbGwgcm91bmQtdHJpcHMgaW4gdGhlIGF1dGhlbnRpY2F0aW9uLiBOb3csIHRoZSBGUkVTSF9DT05ORUNUIGlzCiAgcmVtYWRlIHRvIG9ubHkgbWF0dGVyIGZvciB0aGUgZmlyc3QgY29ubmVjdGlvbiBtYWRlIHdpdGggY3VybF9lYXN5X3BlcmZvcm0oKQogIGFuZCBhbGwgdGhlIHJlc3QgdGhhdCBtaWdodCBmb2xsb3cgZHVlIHRvIEZPTExPV0xPQ0FUSU9OIG9yIEhUVFAKICBhdXRoZW50aWNhdGlvbiBhcmUgbm93IGlnbm9yaW5nIHRoYXQgb3B0aW9uLgoKLSBBZGp1c3RlZCB0aGUgUVVJVCBjb2RlIHNsaWdodGx5IHNpbmNlIGl0IGNvdWxkIGNvcmUtZHVtcC4KCi0gQ29ycmVjdGVkIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0byBwcm92aWRlIGEgY29ycmVjdCBzaXplIHRvIHRoZQogICd2ZXJpZmllZHNlcnZlcicgcmVxdWVzdC4KCkRhbmllbCAoMjcgRmVicnVhcnkgMjAwNCkKLSBKb2UgSGFscGluIG1hZGUgdGhlIEZUUCBjb2RlIHNlbmQgUVVJVCBvbiB0aGUgY29udHJvbCBjb25uZWN0aW9uIGJlZm9yZQogIGRpc2Nvbm5lY3RpbmcgdGhlIFRDUCBjb25uZWN0aW9uLiBUaGlzIGlzIHdoYXQgZ29vZC1iZWhhdmluZyBmdHAgY2xpZW50cwogIHNob3VsZCBkby4KCkRhbmllbCAoMjYgRmVicnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbiB1cGRhdGVkIHNldmVyYWwgZmlsZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgb24gTVNWQyA2LiBIZQogIGFsc28gYWRkZWQgdGhlICdidWlsZGNvbmYuYmF0JyB0aGF0IHdvcmtzIGxpa2UgdGhlICdidWlsZGNvbmYgKyBjb25maWd1cmUnCiAgY29tYm8gZG9lcyBvbiB1bml4ZXMuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIG1lbWRlYnVnIHN0dWZmIHN1cHBvcnQgY2FsbG9jKCkgYXMgd2VsbC4KCi0gVG9yIEFybnRzZW4gcG9pbnRlZCBvdXQgdGhhdCB0ZXN0Y3VybC5zaCBuZWVkZWQgdG8gcmVtb3ZlIHRoZSBnZW5lcmF0ZWQKICBmaWxlcyBpbiBvcmRlciB0byBoYXZlIHRoZW0gcmUtZ2VuZXJhdGVkIGluIGVhY2ggYnVpbGQuCgotIEFuZHkgU2VycGEgZm91bmQgb3V0IHRoYXQgdGhlIHNoYXJlIGludGVyZmFjZSBkaWQgbm90IGVuam95IGxpZmUgd2hlbiBub3QKICBoYXZpbmcgdGhlIGxvY2sgYW5kIHVubG9jayBjYWxsYmFja3Mgc2V0LCBldmVuIHRob3VnaCBkb2N1bWVudGVkIHRvIGJlCiAgT0suIEl0IHN0aWxsIGlzIE9LLCBhbmQgbm93IHRoZSBjb2RlIHdvbid0IHNlZ2ZhdWx0IGFueW1vcmUhCgpEYW5pZWwgKDI1IEZlYnJ1YXJ5IDIwMDQpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHcmVnIEhld2dpbGwgSSBtb2RpZmllZCBob3cgbG9uZyBsb25nIGlzIHVzZWQgaW4gdGhlCiAgbXByaW50ZiBjb2RlLCBhcyB3ZSBjYW4gdXNlIGEgNjRiaXQgdHlwZSB3aXRoIE1TVkMgdGhhdCBpcyBhIGxvbmcgbG9uZwogIGVxdWl2YWxlbnQuIFRoaXMgY29ycmVjdHMgc29tZSB3ZWlyZCBsYXJnZSBmaWxlIGJlaGF2aW9ycyBvbiB3aW5kb3dzLgoKLSBUb3IgQXJudHNlbiBoZWxwZWQgbWUgd29yayBvdXQgLS1lbmFibGUtZGVidWcgdG8gd29yayBiZXR0ZXIgd2l0aCBkaWZmZXJlbnQKICB2ZXJzaW9ucyBvZiB0aGUgZ2NjIGFuZCBpY2MgY29tcGlsZXJzLgoKLSBBZGRlZCBDVVJMT1BUX1NIQVJFIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2UuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDQpCi0gQXBwbGllZCB0aGUgZmluYWwgcGllY2VzIG9mIEdpc2xlIFZhbmVtJ3MgcGF0Y2ggdGhhdCBicmluZ3MgYSB3b3JraW5nIG5hbWUKICByZXNvbHZlIHRpbWVvdXQgdG8gdGhlIHdpbmRvd3MgdmVyc2lvbnMgb2YgY3VybCEKCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbidzIGZpeCB0byBhbGxvdyB0aGUgc3BlZWQtbGltaXQgbG9naWMgd29yayBldmVuIGlmIHlvdSBzZXQKICBsaW1pdC1yYXRlLiBJdCBkb2VzIHdvcmsgb24gdGhlIGV4cGVuc2Ugb2YgdGhlIHJhdGUgbGltaXRlci4KCkRhbmllbCAoMjAgRmVicnVhcnkgMjAwNCkKLSBjb25maWd1cmUgLS1lbmFibGUtZGVidWcgd2l0aCBnY2Mgbm93IGFsc28gdHJpZXMgdG8gZGV0ZWN0IHRoZSBpY2MgY29tcGlsZXIKICAod2hpY2ggc29tZWhvdyBnZXRzIHRyZWF0ZWQgYXMgaWYgaXQgaXMgYSBnY2MpIHRvIHN0b3AgdXNpbmcgYWxsIHRoZSBnY2MKICBvcHRpb25zIHdpdGggaXQsIGFuZCB3ZSBhbHNvIHByb3ZpZGUgLWlzeXN0ZW0gb3B0aW9ucyBmb3IgZWFjaCBleHRyYSAtSQogIG9wdGlvbiB0aGUgY29uZmlndXJlIHNjcmlwdCBoYXMgZmlndXJlZCBvdXQgKGZvciBPcGVuU1NMLCBrZXJiZXJvcywgemxpYiwKICBIZWltZGFsIGV0YykuIFRoaXMgb2YgY291cnNlIHRvIHByZXZlbnQgd2FybmluZ3Mgb24gaGVhZGVycyB3ZSBkb24ndCBoYXZlCiAgY29udHJvbCBvZi4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwNCkKLSBEb3VnIFBvcnRlciBtYWRlIGxpYmN1cmwgdXNlIHRoZSBIT01FIGVudmlyb25tZW50IHZhcmlhYmxlIGJlZm9yZSB0aGUKICBnZXRwd3VpZCByZXN1bHRzIHdoZW4gbG9va2luZyBmb3IgLm5ldHJjIGZpbGVzLgoKLSBJZiAnY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnJyBpcyB1c2VkIHdpdGggZ2NjLCBpdCBub3cgY2hlY2tzIHdoaWNoIGdjYwogIHZlcnNpb24gaXQgaXMgYW5kIHVzZXMgYXMgcGlja3kgY29tcGlsZXIgb3B0aW9ucyBhcyBwb3NzaWJsZSBmb3IgdGhlCiAgcGFydGljdWxhciB2ZXJzaW9uLgoKLSBDb2RlIHRoYXQgY2FuIGJlIHVzZWQgaW4gYm90aCB0aGUgbGliIGFuZCBpbiB0aGUgY3VybCBhcHAgaXMgbm93IG1hZGUgdG8gdXNlCiAgdGhlIGN1cmx4XyBwcmVmaXguIFRoZSBmaXJzdCBmdW5jdGlvbiB0byBiZSBhdmFpbGFibGUgbGlrZSB0aGlzIGlzIHRoZQogIGN1cmx4X3N0cnRvbGwoKSBmdW5jdGlvbi4gVGhpcyBpcyBtYWRlIHRvIGFsbG93IHRoZSBhcHAgdG8gdXNlIGV4aXN0aW5nIGNvZGUsCiAgYnV0IHdpdGhvdXQgcG9sbHV0aW5nIHRoZSBsaWJjdXJsIEFQSS4gRnVydGhlciBleHBsYW5hdGlvbnMgcG9zdGVkIGhlcmU6CgogICAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA0LTAyLzAyMTUuaHRtbAoKRGFuaWVsICgxOCBGZWJydWFyeSAyMDA0KQotIEZpeGVkIGJ1aWxkY29uZiB0byBub3QgdXNlICJ3aGljaCIgYXMgQUlYIGFuZCBUcnU2NCBoYXZlIHdoYXQgaGF2ZSBiZWVuCiAgcmVmZXJyZWQgdG8gYXMgImhvcnJpYmx5IGJyb2tlbiAnd2hpY2gnIHByb2dyYW1zIi4KCi0gTWFkZSBzdXJlIGRucyBjYWNoZSB0aW1lb3V0IHNldCB0byAtMSByZWFsbHkgbWVhbnMgY2FjaGluZyBmb3JldmVyLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA0KQotIE1hZGUgaXQgcG9zc2libHkgdG8gYnVpbGQgYy1hcmVzIHdpdGggdGhlIGxpYmN1cmwgbWVtZGVidWcgc3lzdGVtIHRvIGJldHRlcgogIHRyYWNrIG1lbW9yeS4KCkRhbmllbCAoMTYgRmVicnVhcnkgMjAwNCkKLSBXaGVuIHVzaW5nIGFyZXMsIHdlIG5vdyBpbml0aWFsaXplIHRoZSBhcmVzICdjaGFubmVsJyBpbiBjdXJsX2Vhc3lfaW5pdCgpCiAgYW5kIHJlLXVzZSB0aGF0IHNhbWUgaGFuZGxlIGR1cmluZyB0aGUgZW50aXJlIGN1cmwgaGFuZGxlJ3MgbGlmZS10aW1lLiBJdAogIGltcHJvdmVzIHBlcmZvcm1hbmNlLgoKLSBGaXhlZCBhIHByb2JsZW0gd2hlbiBkaXNwbGF5aW5nIHZlcmJvc2UgZm9yIGlwdjYtZW5hYmxlZCBsaWJjdXJscyBhbmQKICByZS11c2VkIGNvbm5lY3Rpb25zLiBQcm9ibGVtIHJlcG9ydGVkIGFuZCBmaXggdmVyaWZpZWQgYnkgR3JpZ29yeSBFbnRpbi4KCi0gSmVmZiBMYXdzb24gZml4ZWQgdGhlIHZlcnNpb24tY2hlY2sgaW4gdGhlIFNPQ0tTNSBjb2RlLgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDA0KQotIEZpeGVkIGEgY2FzZSB3aGVyZSBhIGhvc3QgY2FjaGUgZW50cnkgd2FzIG5vdCBmbGFnZ2VkIGluLXVzZSBwcm9wZXJseSB3aGVuIGEKICBjYWNoZWQgZW50cnkgd2FzIHVzZWQuCgotIEFuZHLpcyBHYXJj7WEncyBwYXRjaCB0aGF0IGNoZWNrcyBmb3Igd2lubW0gaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgd2FzCiAgYXBwbGllZC4KCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwNCkKLSBCZW4gR3JlZWFyJ3MgU09fQklORFRPREVWSUNFIHBhdGNoIGZvciB0aGUgYmluZGluZyBvZiB0aGUgbG9jYWwgZW5kIHRvIGEKICBzcGVjaWZpYyBuZXR3b3JrIGludGVyZmFjZS4KCi0gR3JlZyBIZXdnaWxsIGZvdW5kIG91dCB0aGF0IHRoZSB2YXJpYWJsZSBob2xkaW5nICdjb250ZW50bGVuZ3RoJyB3YXNuJ3QgYmlnCiAgZW5vdWdoIHRvIGhvbGQgYSBsYXJnZSBmaWxlIQoKLSBUb3IgQXJudHNlbiBmaXhlZCBhIDY0Yml0LXJlbGF0ZWQgcHJvYmxlbSBpbiBkYXRlLXJlbGF0ZWQgY29kZSBpbiB0aGUgZnRwCiAgZGVwYXJ0bWVudCwgYW5kIHRoZXJlIHdhcyBhbm90aGVyIHBvdGVudGlhbCBwcm9ibGVtIGluIHRoZSBuYW1lIHJlc29sdmUgY29kZQogIHRvby4KCkRhbmllbCAoMTEgRmVicnVhcnkgMjAwNCkKLSBSZW1vdmVkIGEgZmV3IHZhcmlhYmxlcyB0aGF0IHdlcmUgb25seSBzZXQgYnV0IG5ldmVyIHVzZWQsIGFzIHNvbWUgY29tcGlsZXJzCiAgd2FybiBhYm91dCB0aGF0IGFuZCB3ZSBkbyBub3QgbGlrZSBjb21waWxlciB3YXJuaW5ncyEKCi0gUmVtb3ZlZCB0aGUgbmVlZCBmb3Igc3ltbGlua3MgaW4gdGhlIHRlc3RzL2RhdGEgZGlyZWN0b3J5IGlmIGN1cmwgaXMgYnVpbHQKICBvdXRzaWRlIG9mIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGFuZCB0aGUgJ21ha2UgdGVzdCcgaXMgdXNlZC4gVGhpcyB3YXMgZG9uZQogIGJ5IHByb3ZpZGluZyBhICJzb3VyY2UgZGlyIHBhdGgiIHRvIHRoZSBzY3JpcHRzL3NlcnZlcnMuCgotIE5vdywgaWYgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgY2FuJ3QgZmluZCBhbiBucm9mZiB0b29sIG9yIGFuIG9wdGlvbiB0byBucm9mZgogIHRvIHVzZSB0byBjb252ZXJ0IG1hbiBwYWdlcyB3aXRoLCBpdCB3aWxsIGNvbXBsZXRlbHkgc3dpdGNoIG9mZiB0aGUgYnVpbHQtaW4KICBtYW51YWwuCgotICdjb25maWd1cmUgLS1kaXNhYmxlLW1hbnVhbCcgY29tcGxldGVseSBkaXNhYmxlcyB0aGUgYnVpbHQtaW4gbWFudWFsIGZyb20KICB0aGUgY3VybCBjb21tYW5kIHRvb2wuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgYW5kIGEgbWlub3Igc291cmNlIGVkaXQsIGFuZCBub3cKICBoZSBoYXMgbWFuYWdlZCB0byBnZXQgbXN5cy9taW5ndyB0byBydW4gY29uZmlndXJlIGFuZCB0aGVuIGJ1aWxkIQoKRGFuaWVsICg5IEZlYnJ1YXJ5IDIwMDQpCi0gVGhlIGRlZmF1bHQgSFRUUCBBY2NlcHQ6IGhlYWRlciB3YXMgbW9kaWZpZWQgdG8gdGhlIG11Y2ggc2ltcGxlcgogICJBY2NlcHQ6ICovKiIuCgotIFAgUiBTY2hhZmZuZXIgdXBkYXRlZCB0aGUgY3VybC1zc2wgc3BlYyBmaWxlIGZvciBSUE1zLgoKLSBEb21pbmljayBNZWdsaW8gYnJvdWdodCBsb3RzIG9mIGRvY3VtZW50YXRpb24gZm9yIHRoZSBzaGFyZSBpbnRlcmZhY2UncyBtYW4KICBwYWdlcyB0aGF0IHdlcmUgcHJldmlvdXNseSBtaXNzaW5nLgoKLSBUb3IgQXJudHNlbiBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgbGliY3VybCB3b3JrLWFyb3VuZCBhIGJ1ZyBpbiB0aGUKICBBSVg1IGltcGxlbWVudGF0aW9uIG9mIGdldGFkZHJpbmZvKCkuIFRoaXMgbWFrZXMgdGhlIEZUUCBQT1JUIHN0dWZmIHdvcmsgb24KICBpcHY2LWVuYWJsZWQgQUlYIGJ1aWxkcy4KCi0gS2VuIFJhc3RhdHRlciBwcm92aWRlZCBwb3J0YWJpbGl0eSBmaXhlcyBmb3IgdGhlIGN1cmxndGsuYyBleGFtcGxlLCBhbmQgbm93CiAgaXQgcnVucyBvbiB3aW5kb3dzIHdpdGggR1RLIGFzIHdlbGwhCgpEYW5pZWwgKDYgRmVicnVhcnkgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBnZXRob3N0YnluYW1lKCkgZmluZSB3aGVuIHJ1bgogIHdpdGggbWluZ3cgb24gd2luZG93cy4KCi0gTW9kaWZpZWQgdGhlIGxkYXAgY29kZSB0byB1c2UgcHJvcGVyIGZ1bmN0aW9uIHBvaW50ZXJzIGFsbCBvdmVyIChpbnN0ZWFkIG9mCiAgbWl4ZWQgZGF0YSBhbmQgZnVuY3Rpb24gcG9pbnRlcnMpIHRvIHdvcmstYXJvdW5kIHRoZSBwaWNreSBNSVBTUHJvIGNvbXBpbGVyCiAgd2FybmluZ3MuCgotIEEgY3VzdG9tIEhvc3Q6IGhlYWRlciBpcyBvbmx5IGNvbnNpZGVyZWQgaWYgdGhlIHJlcXVlc3QgaXMgbm90IG1hZGUgYnkKICBmb2xsb3dpbmcgYSBsb2NhdGlvbi4gQWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBUaW0gQmFrZXIuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNCkKLSBUaGUgbGlieiBwYXJ0IG9mIHRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBvbmx5IHNldCB0aGUgdHdvIGxpYnotcmVsYXRlZAogIGRlZmluZSBIQVZFX1pMSUJfSCBhbmQgSEFWRV9MSUJaIGlmIGJvdGggdGhlIGxpYiBhbmQgdGhlIGhlYWRlciBpcyBmb3VuZC4KICBJZiBvbmUgaXMgbWlzc2luZywgbm9uZSBvZiB0aGUgZGVmaW5lcyBpcyBzZXQuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgdGhlIE1pbmd3IG1ha2VmaWxlcy4KCi0gTGVuIEtyYXVzZSByZXBvcnRlZCB0aGF0IGN1cmwgNy45LlggY291bGQgZG8gdXBsb2FkaW5nIGZyb20gc3RkaW4gd2l0aG91dAogIGRvaW5nIGNodW5rZWQgZW5jb2RpbmcsIHdoaWNoIGN1cnJlbnQgY3VybCBjYW5ub3QgZG8gZXZlbiBpZiB5b3UgZGlzYWJsZQogIHRoZSB0cmFuc2Zlci1lbmNvZGluZyBjaHVua2VkIGhlYWRlci4gTm93IGl0IGNhbiBhZ2FpbiwgYW5kIHRlc3QgY2FzZSA5OAogIHZlcmlmaWVzIHRoaXMgZnVuY3Rpb25hbGl0eS4KCi0gVG9yIEFybnRzZW4gZml4ZWQgYSB3ZWlyZCBnZXRhZGRyaW5mbygpIHVzYWdlIGluIHRoZSBGVFAgY29kZSwgcHJldmVudGluZwogIHRoZSBpcHY2LWNvZGUgZm9yIFBPUlQgd29yayBvbiBBSVggNS4yLiBXZSBub3cgYWxzbyBwcm92aWRlIChiZXR0ZXIpIGVycm9yCiAgbWVzc2FnZXMgd2hlbiBiYWlsaW5nIG91dCBpbiB0aGUgdGhhdCBmdW5jdGlvbi4KCi0gVG9yIEFybnRzZW4gbm93IHByb3ZpZGVzIEFJWCBhbmQgSVJJWCAodXNpbmcgZ2NjLCB4bGMgYW5kIHRoZSBNSVBTUHJvCiAgY29tcGlsZXJzKSBhdXRvbWF0ZWQgYnVpbGQgbG9ncyAoaHR0cDovL2N1cmwuaGF4eC5zZS9hdXRvLykgYW5kIHdlJ3ZlIGZpeGVkCiAgbnVtZXJvdXMgbWlub3IgcXVpcmtzIHRvIG1ha2UgbGVzcyB3YXJuaW5ncyBhcHBlYXIuCgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdpbGFkLCB3ZSBub3cgdXNlIHRoZSBjdXN0b20gdGltZW91dHMgd2hlbiB3YWl0aW5nIGZvciBhCiAgc2VydmVyIHRvIGNvbm5lY3Qgd2hlbiB1c2luZyBGVFAgUE9SVC4gUHJldmlvdXNseSB3ZSBhbHdheXMgd2FpdGVkIDEwCiAgc2Vjb25kcywgbm8gbW9yZSBubyBsZXNzLiBXZSBub3cgYWxzbyBjaGFuZ2VkIHRoZSBkZWZhdWx0IChpZiBubyB0aW1lb3V0IGlzCiAgc2V0KSB0byB3YWl0IDYwIHNlY29uZHMgZm9yIHRoZSBjb25uZWN0IGJlZm9yZSB3ZSBmYWlsLgoKRGFuaWVsICgzIEZlYnJ1YXJ5IDIwMDQpCi0gTW9kaWZpZWQgdG8gbGluayB3aXRoIGMtYXJlcyBpbnN0ZWFkIG9mIGFyZXMuCgpEYW5pZWwgKDIgRmVicnVhcnkgMjAwNCkKLSBBZGRlZCBhIGNvbmZpZ3VyZSB0ZXN0IHRvIGNoZWNrIGZvciB3aGljaCBvcHRpb24gdGhlIChnKW5yb2ZmIHRvb2wgd2FudHMKICB0byBleHRyYWN0IHBsYWluIHRleHQgZnJvbSB0aGUgbWFuIHBhZ2VzLiBUb3IgQXJudHNlbiB0b2xkIHVzIHRoZSBBSVgKICB2ZXJzaW9uIG9mIEdOVSBnbnJvZmYgZG9lc24ndCBzdXBwb3J0IC1tYW4hCgotIEFkZGVkIGFuIHVuZGVmIG9mIGFjY2VwdCBpbiBtZW1kZWJ1Zy5oIHRvIG1ha2UgY3VybCBidWlsZCB3aXRoIC0tZW5hYmxlLWRlYnVnCiAgb24gQUlYIDUuMiB3aGljaCBzZWVtcyB0byBoYXZlIGFjY2VwdCBkZWZpbmVkLiBSZXBvcnRlZCBieSBUb3IgQXJudHNlbi4KCi0gY3VybF92ZXJzaW9uKCkgbm93IGluY2x1ZGVzIGMtYXJlcyB2ZXJzaW9uIGluZm8sIGFuZCBjdXJsX3ZlcnNpb25faW5mbygpIG5vdwogIHJldHVybnMgYSBzdHJ1Y3Qgd2l0aCB2ZXJzaW9uIFNFQ09ORCB0aGF0IGFsc28gaW5jbHVkZXMgdGhhdCBpbmZvLgoKLSBXZSBhcmUgbm93IG9mZmljaWFsbHkgdXNpbmcgYy1hcmVzIGZvciBhc3luY2ggbmFtZSByZXNvbHZlcy4gYy1hcmVzIGlzIHRoZQogIG5ldyBsaWJyYXJ5LCBiYXNlZCBvbiB0aGUgZXhpc3RpbmcgYXJlcyBidXQgd2l0aCBhbiBleHRlbmRlZCBhbmQgc2xpZ2h0bHkKICBtb2RpZmllZCBBUEkuCgotIERpcmsgaW1wcm92ZWQgdGhlIGFyZXMgdGltZW91dCBjb2RlLCBhbmQgbm93IHdlIGFsc28gaW5jbHVkZSB0aGUgYXJlcyBlcnJvcgogIHN0cmluZyB3aGVuIHdlIGZhaWwgdG8gcmVzb2x2ZSBhIG5hbWUuCgotIEFub3RoZXIgdHdlYWsgdG8gbWFrZSB0ZXN0IGNhc2UgOTEgcnVuIGZpbmUuIE5vdyB3ZSBoYXZlIGFub3RoZXIgYml0IG9uIGEKICBjb25uZWN0aW9uIHRoYXQgaXMgc2V0IHRydWUgaWYgdGhlIGNvbm5lY3Rpb24gaXMgbWFya2VkIGZvciAncmV0cnknLiBUaGF0CiAgbWFrZXMgdGhlIGNvbm5lY3Rpb24gZ2V0IGNsb3NlZCBhbmQgcmUtb3BlbmVkIGFuZCB0aGUgSFRUUC1kb25lIGNvZGUgbXVzdAogIG5vdCBjb21wbGFpbiBvbiB0aGUgZmFjdCB0aGF0IG5vIGRhdGEgd2FzIHJlY2VpdmVkLgoKLSBCYXNlZCBvbiBEaXJrIE1hbnNrZSdzIHBhdGNoLCBJIG1vZGlmaWVkIHRoZSBuYW1lIHJlc29sdmluZyB3aXRoIGFyZXMgdG8KICBmZWF0dXJlIGEgdGltZW91dCBmb3IgcmVhbGx5IHNsb3cgbG9va3Vwcy4gSXQgbm93IGRlZmF1bHRzIHRvIDMwMCBzZWNvbmRzLAogIGJ1dCBpcyBub3cgYWRqdXN0ZWQgdG8gdGhlIENPTk5FQ1RUSU1FT1VUL1RJTU9VRSB0aW1lb3V0cyBpZiBvbmUgb2YgdGhlbQogIGlzIHNldC4KCi0gRml4ZWQgdGhlIGluY2x1c2lvbiBvZiBjYS1idW5kbGUuaCB0byByZWFsbHkgdXNlIHRoZSBvbmUgaW4gdGhlIGJ1aWxkIGRpcgogIGJlZm9yZSB0aGUgb25lIGluIHRoZSBzb3VyY2UgZGlyLiBEb21lbmljbyBBbmRyZW9saSBmb3VuZCBvdXQgYW5kIHJlcG9ydGVkLgoKLSBBZGRlZCB0ZXN0IGNhc2UgOTcsIGEgc2ltcGxlIFBPU1Qgd2l0aCBhIGN1c3RvbSBDb250ZW50LVR5cGUgaGVhZGVyCiAgcmVwbGFjaW5nIHRoZSBvcmlnaW5hbCBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgb25lLgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDQpCi0gQWRkZWQgY29kZSB0aGF0IGF0dGVtcHRzIHRvIGZpeCB0aGUgdGVzdCA5MSBmYWlsdXJlLiBBcyBoYXMgYmVlbiBmaWd1cmVkIG91dAogIGJ5IFBhdHJpY2sgU21pdGgsIHRoZSBlcnJvciBoYXBwZW5zIGJlY2F1c2Ugd2UgcmUtdXNlIGEgY29ubmVjdGlvbiB0aGF0IHRoZQogIHNlcnZlciBpcyBqdXN0IGFib3V0IHRvIGNsb3NlIGFuZCB3ZSBldmVuIG1hbmFnZSB0byBzZW5kIGF3YXkgdGhlIHJlcXVlc3QKICB3aXRob3V0IHNlZWluZyBhbiBlcnJvci4gT24gdGhlIGZpcnN0IHJlYWQgYXR0ZW1wdCB3ZSBnZXQgYSBFQ09OTlJFU0VULgogIFN0YXJ0aW5nIG5vdywgd2UgYXR0ZW1wdCB0byBkZXRlY3QgdGhpcyBhbmQgaWYgc28sIHdlIHJldHJ5IHRoZSByZXF1ZXN0IG9uIGEKICBmcmVzaCBjb25uZWN0aW9uLgoKLSBJIGFkZGVkIHRlc3QgY2FzZSA1MTAgd2hpY2ggaXMgYSBjdXN0b20gcHJvZ3JhbSB0aGF0IGRvZXMgYSBQT1NUIHVzaW5nIGEKICByZWFkIGNhbGxiYWNrLCB3aXRoIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcuCgotIEFkanVzdGVkIG9uZSBvZiB0aGUgTVBFL2lYIGNoYW5nZXMgYXMgaXQgbWFkZSB0ZXN0IGNhc2UgNTA0IGZhaWwgYWxsIG92ZXIuCgotIEFkZGVkIC0tc29ja3MgYXMgYSByZWNvZ25pemVkIG9wdGlvbi4gSXQgd29ya3MganVzdCBsaWtlIC0tcHJveHkgYnV0IHNldHMgYQogIFNPQ0tTNSBwcm94eSB0byB1c2UuIFNPQ0tTNSBzdXBwb3J0IGhhcyBiZWVuIGF2YWlsYWJsZSBpbiBsaWJjdXJsIGZvciBhCiAgd2hpbGUsIGp1c3Qgbm90IHByb3ZpZGVkIGJ5IHRoZSBjdXJsIHRvb2wuIFRoaXMgZG9lcyBub3QgY3VycmVudGx5IHdvcmsgZm9yCiAgSVB2Ni1lbmFibGVkIGxpYmN1cmxzLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDQpCi0gU3RhZGxlciBTdGVwaGFuIHBvaW50ZWQgb3V0IHRoYXQgc3JjL2h1Z2VoZWxwLmMgaW5jbHVkZWQgY29uZmlnLmggd2l0aG91dAogIGNoZWNraW5nIHRoZSBkZWZpbmUgaWYgaXRzIHByZXNlbnQuLi4KCi0gS2VuIEhpcnNjaCBwcm92aWRlZCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIHRoZSBNUEUvaVggb3BlcmF0aW5nCiAgc3lzdGVtLgoKLSBEYW4gRmFuZHJpY2ggY29tcGlsZWQgY3VybCB3aXRoIGxvdHMgb2YgYWdncmVzc2l2ZWx5IHBlZGFudGljIGNvbXBpbGVyCiAgb3B0aW9ucyBhbmQgdGh1cyBmb3VuZCBhIGZldyBtaW5vciBlcnJvcnMgYW5kIGRpZCBzb21lIGdlbmVyYWwgY2xlYW51cHMgdG8KICBhdm9pZCB0aGVtLgoKLSBEaXJrIE1hbnNrZSBmaXhlZCBhIGZsYXcgaW4gYXJlcyB0aGF0IHByZXZlbnRlZCBpdCB0byB1c2Ugbm9uLWJsb2NraW5nCiAgc29ja2V0cyBwcm9wZXJseS4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA0KQotIFJpY2hhcmQgQnJhbWFudGUgZml4ZWQgY2h1bmtlZCB0cmFuc2Zlci1lbmNvZGVkICJ1cGxvYWRzIiB0byBzZW5kIGEgZmluYWwKICBDUkxGIGNvbWJvIHByb3Blcmx5LgoKRGFuaWVsICgyNyBKYW51YXJ5IDIwMDQpCi0gTWFkZSB0aGUgcmVzcG9uc2UtaGVhZGVycyBkdXJpbmcgYSBDT05ORUNUIHJlcXVlc3QgdG8gYSBwcm94eSBnZXQgcGFzc2VkIG9uCiAgYXMgcmVndWxhciBoZWFkZXJzLCBzbyB0aGV5IGFwcGVhciB3aXRoIC1pLy1JIG9wdGlvbnMgYW5kIHNpbWlsYXIuCgotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR2lzbGUgVmFuZW0sIEkndmUgbWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZGlzcGxheQogIHByb3Blcmx5IHN3aXRjaCB0byBhIEdCLWRpc3BsYXkgd2hlbiBtb3JlIHRoYW4gOTk5OU1CIGhhdmUgYmVlbiB0cmFuc2ZlcmVkLgoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gcG9pbnRlZCBvdXQgYSBjdXJscmMgcGFyc2VyIHByb2JsZW0vY3Jhc2ggd2hlbiBhbiBvcHRpb24gd2l0aCBhCiAgcmVxdWlyZWQgZGlkbid0IGhhdmUgb25lIGFuZCB3YXMgb24gdGhlIGxhc3QgbGluZSBvZiBhIGZpbGUuCgotIE1vcmUgV2luZG93cyBmaXhlcyBmb3IgbGFyZ2UgZmlsZXMuIFdlIG5vdyBidWlsZCBhbmQgbGluayB3aXRoCiAgLi4vbGliL3N0cnRvb2ZmdC5jIGluIHRoZSBhcHAgY29kZSBzaW5jZSBDdXJsX3N0cnRvbGwoKSBpcyBub3QgYSBwcm92aWRlZAogIGxpYmN1cmwgZnVuY3Rpb24uLi4gUGVyaGFwcyB3ZSBzaG91bGQgY29uc2lkZXIgYSAnY29tbW9uJyBkaXIgb3Igc2ltaWxhcgogIHdoZXJlIHdlIHB1dCBzb3VyY2UgY29kZSB1c2VkIGluIGJvdGggdGhlIGxpYiBhbmQgdGhlIGNsaWVudC4gT3IgcGVyaGFwcwogIHdlJ2xsIGp1c3QgbWFrZSB0aGlzIGZ1bmN0aW9uIGF2YWlsYWJsZSBpbiB0aGUgbGlicmFyeS4uLgoKLSBWaW5jZW50IEJyb25uZXIgZm91bmQgb3V0IHRoZSBzb2NrczUgY29kZSBjcmFzaGVkIHdoZW4gbm8gdXNlcm5hbWUgd2FzCiAgc2V0LgoKLSBWaW5jZW50IEJyb25uZXIgc3BvdHRlZCBhIHByb2JsZW0gd2l0aCBwcm94eSB1c2VybmFtZS9wYXNzd29yZCB3aGVuIHJlLXVzaW5nCiAgYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uCgotIEZpeGVkIHRoZSBwcm9ncmVzcyBtZXRlciBkaXNwbGF5IGZvciBmaWxlcyBsYXJnZXIgdGhhbiAyXjMxIGJ5dGVzLiBHaXNsZQogIFZhbmVtIHJlcG9ydGVkLgoKRGFuaWVsICgyMiBKYW51YXJ5IDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFkZSBzdHJ0b2xsKCkgZ2V0IHVzZWQgd2hlbiBjdXJsIGlzIGJ1aWx0IHdpdGggdGhlIG1pbmd3CiAgY29tcGlsZXIuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBjb21wcmVzc2VkIGhlbHAgdGV4dCBjb2RlIHRvIGRpc3BsYXkgcHJvcGVybHkuCgotIFJlbW92ZWQgdGhlICcjZGVmaW5lIEh0dHBQb3N0JyBmcm9tIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIGFzIGN1cmxfaHR0cHBvc3QKICBpcyB0aGUgcHJvcGVyIG5hbWUgYW5kIGl0IGhhcyBiZWVuIGZvciBxdWl0ZSBzb21lIHRpbWUgbm93LiBGaXhlcyBhbm90aGVyCiAgbmFtZSBzcGFjZSBwb2xsdXRpb24uCgotIEFkZGVkICdjdXJsX29mZl90JyB0eXBlZGVmIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUsIHRvIGJlIHVzZWQgdG8gcHJvdmlkZQogIGxhcmdlIGZpbGUgc2l6ZXMgdG8gdGhlICpfTEFSR0Ugb3B0aW9ucy4gQWRqdXN0ZWQgdGhlIGNvZGUgYWxsIG92ZXIgdG8gdXNlCiAgdGhpcyB2YXJpYWJsZSB0eXBlIGluc3RlYWQgb2YgJ29mZl90Jy4gVGhpcyBpcyBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlIGxhcmdlCiAgZmlsZSBzdXBwb3J0IHdvcmsgb24gbW9yZSBwbGF0Zm9ybXMuIFRoZSBjb25maWd1cmUgc2NyaXB0IG5vdyBjaGVja3MgdGhlCiAgc2l6ZSBvZiB0aGUgY3VybF9vZmZfdCBpbnN0ZWFkIG9mIHRoZSBwbGFpbiBvZmZfdC4KClZlcnNpb24gNy4xMS4wICgyMiBKYW51YXJ5IDIwMDQpCgpEYW5pZWwgKDIxIEphbnVhcnkgMjAwNCkKLSBSZW1vdmVkIHRoZSBkZWZpbmVzIGluIHRoZSBwdWJsaWMgaGVhZGVyIGZpbGUgd2l0aCBUSU1FQ09ORF8gcHJlZml4ZXMuIFRoZXkKICBoYXZlIGJlZW4gb2Jzb2xldGUgc2luY2UgQXByaWwgMjJuZCAyMDAyLCBhbmQgaWYgdGhpcyBjYXVzZXMgYW55b25lIGFueQogIHByb2JsZW1zIG5vdyBpdCBpcyB2ZXJ5IGVhc3kgdG8ganVzdCBhZGQgQ1VSTF8gdG8gdGhlIG5hbWVzLiBUaGlzIGNvcnJlY3RzCiAgdGhpcyBuYW1lIHNwYWNlIHBvbGx1dGlvbi4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA0KQotIERhdmlkIEJ5cm9uIGNsZWFuZWQgdXAgaG93IC0tdHJhY2Ugd2l0aCBubyBvcHRpb24gd2FzIHRyZWF0ZWQsIGFuZCBhbHNvCiAgYXJndW1lbnRzIGluIGEgY29uZmlnIGZpbGUgd2l0aG91dCBhIHJlcXVpcmVkIHBhcmFtZXRlciEKCkRhbmllbCAoMTYgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIGZpeGVkIGEgZmV3IGlzc3VlcyB3aGVyZSBjb21waWxlcnMgd2FybmVkIGFib3V0IHZhcmlhYmxlcwogIHBvc3NpYmx5IGJlaW5nIHVzZWQgdW5hc3NpZ25lZC4KCi0gTWlub3IgSW50ZXJpeCBidWlsZCBwcm9ibGVtIGZpeGVkLgoKRGFuaWVsICgxNSBKYW51YXJ5IDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHNvbWUgbmVjZXNzYXJ5IGVzY2FwaW5nIG5lZWRlZCBpbiB0aGUKICBhY2luY2x1ZGUubTQgZmlsZSB3aGVuIGF1dG9tYWtlIDEuOCBvciBsYXRlciBpcyB1c2VkLgoKRGFuaWVsICgxNCBKYW51YXJ5IDIwMDQpCi0gVmluY2VudCBCcm9ubmVyIGZpeGVkIHRoZSBDdXJsX3Jlc29sdigpIHJldHVybiBjb2RlLiBUaGlzIGV4dGVuZHMgdGhlIGZpeAogIFN0ZXZlIEdyZWVuIHByb3ZpZGVkIG9uIGRlY2VtYmVyIDMuLi4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA0KQotIEx1a2UgQ2FsbCBtYWRlIHRoZSB3aW4zMiB2ZXJzaW9uIG9mIHRoZSBwYXNzd29yZCBwcm9tcHRpbmcgZnVuY3Rpb24gc3VwcG9ydAogIGJhY2tzcGFjZS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHRoZSBodWdlaGVscCBzb3VyY2UgZmlsZSB0byBjb250YWluIGJvdGggYSBjb21wcmVzc2VkIGFuZAogIGFuIHVuY29tcHJlc3NlZCB2ZXJzaW9uIGluIHRoZSBkaXN0cmlidXRpb24sIHNvIHRoYXQgbW9yZSBwZW9wbGUgZWFzaWVyIGNhbgogIGJ1aWxkIGN1cmwgd2l0aCB0aGUgY29tcHJlc3NlZCB2ZXJzaW9uLgoKLSBEaWVnbyBDYXNvcnJhbiBicm91Z2h0IGFub3RoZXIgQW1pZ2FPUyBidWlsZCBwYXRjaCBmb3IgbmF0aXZlIEFtaWdhIGJ1aWxkcy4KCi0gTWF0dCBWZWVuc3RyYSB1cGRhdGVkIHRoZSBNYWMgT1MgWCBmcmFtZXdvcmsgZmlsZXMuCgotIEJyaWFuIFIgRHVmZnkgYnJvdWdodCBhIHNlY3Rpb24gdG8gdGhlIElOU1RBTEwgZmlsZSBvbiBob3cgdG8gYnVpbGQgYQogIFNTTC1lbmFibGVkIGN1cmwgdXNpbmcgdGhlIGZyZWUgQm9ybGFuZCBDKysgY29tcGlsZXIuIEhlIGFsc28gdXBkYXRlZCB0aGUKICBCb3JsYW5kIGxpYi9NYWtlZmlsZS5iMzIuCgotIEkgZml4ZWQgdGhlIHRlc3QgY2FzZSA1MDkgd2hpY2ggSSBicm9rZSB5ZXN0ZXJkYXkuIE5vdyB0aGUgbGlidGVzdCBhcmUKICBjb21waWxlZCB3aXRoIGFuIGluY2x1ZGUgcGF0aCB0aGF0IHBvaW50cyB0byB0aGUgbGlicmFyeSdzIHNvdXJjZSBkaXIsIHNvCiAgdGhhdCB0aGUgbGlidGVzdHMgY2FuIGluY2x1ZGUgZmlsZXMgZnJvbSB0aGUgc291cmNlIHRyZWUuIFRoaXMgd2FzIG1hZGUgdG8KICBtYWtlIGl0IHBvc3NpYmxlIHRvIHVzZSB0aGUgVVNFX1NTTEVBWSBkZWZpbmUgaW4gdGhlIGxpYnJhcnkgdGVzdCBmaWxlcy4KCkRhbmllbCAoMTIgSmFudWFyeSAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBicm91Z2h0IGNvZGUgdGhhdCBub3cgYWxsb3dzIGEgY2FsbGJhY2sgdG8gbW9kaWZpZWQgdGhlIFVSTAogIGV2ZW4gd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlIGlzIHVzZWQsIGFuZCB0aGVuIGxpYmN1cmwgd2lsbCBzaW11bGF0ZSBhCiAgImZvbGxvdyBsb2NhdGlvbiIgdG8gdGhhdCBuZXcgVVJMLiBUZXN0IDUwOSB3YXMgYWRkZWQgdG8gdGVzdCB0aGlzIGZlYXR1cmUuCgotIEV4dGVuZGVkIHRoZSB0aW1lIHdlIHJldHJ5IHNlcnZlcnMgaW4gdGhlIHRlc3Qgc2NyaXB0LCBhbmQgSSBhbHNvIG1hZGUgaXQKICByZXRyeSB0aGUgaHR0cHMgYW5kIGZ0cHMgc2VydmVycyBiZWZvcmUgdGhleSBhcmUgY29uc2lkZXJlZCBiYWQuIEkgYmVsaWV2ZQogIHRoZSBwcmV2aW91cyBhcHByb2FjaCBjb3VsZCB0dXJuIHByb2JsZW1hdGljIG9uIHJlYWxseSBzbG93IGhvc3RzLgoKVmVyc2lvbiA3LjExLjAtcHJlMSAoMTIgSmFudWFyeSAyMDA0KQoKRGFuaWVsICgxMSBKYW51YXJ5IDIwMDQpCi0gRG9taW5pY2sgTWVnbGlvIHBvaW50ZWQgb3V0IEZUUFMgc2hvdWxkIHVzZSBkZWZhdWx0IHBvcnQgOTkwIGFjY29yZGluZyB0bwogIElBTkEuCgpEYW5pZWwgKDggSmFudWFyeSAyMDA0KQotIEZpeGVkIHRoZSBTUE5FR08gY29uZmlndXJlIGNoZWNrIHRvIG5vdCB1c2UgLVIgb3Igb3RoZXIgbm9uLXBvcnRhYmxlIG9wdGlvbnMKICBpbiB0aGUgTERGTEFHUy4gUmVwb3J0ZWQgYnkgUGllcnJlIGluIGJ1ZyByZXBvcnQgIzg3MjkzMC4KCkRhbmllbCAoNSBKYW51YXJ5IDIwMDQpCi0gRGFuIEZhbmRyaWNoIHByb3ZpZGVkIGEgZml4IG9uIG91ciB6bGliIHVzYWdlLgoKLSBEYXZpZCBKIE1leWVyJ3MgcGF0Y2ggdGhhdCBpbnRyb2R1Y2UgbGFyZ2UgZmlsZSBzdXBwb3J0IHRvIGxpYmN1cmwgd2FzCiAgYXBwbGllZC4gTmV3IGN1cmxfZWFzeV9zZXRvcHQgb3B0aW9ucyB0aGF0IGFjY2VwdCAnb2ZmX3QnIGFyZ3VtZW50cyBhcmU6CgogIElORklMRVNJWkVfTEFSR0UKICBSRVNVTUVfRlJPTV9MQVJHRQogIE1BWEZJTEVTSVpFX0xBUkdFCgpEYW5pZWwgKDQgSmFudWFyeSAyMDA0KQotIEJhc2VkIG9uIERvbWluaWNrIE1lZ2xpbydzIGNvbW1lbnRzLCBJIG1hZGUgb3VyIHByaXZhdGUgdmVyc2lvbiBvZgogIGdldHRpbWVvZmRheSgpIGRlY2xhcmVkIHN0YXRpYy4gVGhpcyB3b3VsZCBvdGhlcndpc2UgY29sbGlkZSB3aXRoIHRoZSBzYW1lCiAgZnVuY3Rpb24gaW4gb3RoZXIgbGlicyAobGlrZSBhcmVzIGZvciBleGFtcGxlKS4KCi0gQWRkZWQgRG9taW5pY2sgTWVnbGlvJ3MgZGVzY3JpcHRpb24gb24gaG93IHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCBhcmVzCiAgb24gd2luMzIuCg==