ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2xkIENoYW5nZWxvZwoKQ2hhbmdlcyBkb25lIHRvIGN1cmwgYW5kIGxpYmN1cmwgZnJvbSAxOTk3IHRvIDIwMDYuIFRoZSBtb3N0IHJlY2VudCBjaGFuZ2VzIGFyZQphbHdheXMga2VwdCBpbiB0aGUgQ0hBTkdFUyBmaWxlLgoKRGFuaWVsICgyOSBEZWNlbWJlciAyMDA2KQotIE1ha2UgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHNldCB0aGUgbWFnaWMgbnVtYmVyIGluIHRoZSBuZXcgaGFuZGxlLgoKRGFuaWVsICgyMiBEZWNlbWJlciAyMDA2KQotIFJvYmVydCBGb3JlbWFuIHByb3ZpZGVkIGEgcHJpbWUgZXhhbXBsZSBzbmlwcGV0IHNob3dpbmcgaG93IGxpYmN1cmwgd291bGQKICBnZXQgY29uZnVzZWQgYW5kIG5vdCBhY2tub3dsZWRnZSB0aGUgJ25vX3Byb3h5JyB2YXJpYWJsZSBwcm9wZXJseSBvbmNlIGl0CiAgaGFkIHVzZWQgdGhlIHByb3h5IGFuZCB5b3UgcmUtdXNlZCB0aGUgc2FtZSBlYXN5IGhhbmRsZS4gSSBtYWRlIHN1cmUgdGhlCiAgcHJveHkgbmFtZSBpcyBwcm9wZXJseSBzdG9yZWQgaW4gdGhlIGNvbm5lY3Qgc3RydWN0IHJhdGhlciB0aGFuIHRoZQogIHNlc3Npb25oYW5kbGUvZWFzeSBzdHJ1Y3QuCgotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIGEgYmFkIGNhbGwgdG8gZ2V0c29ja25hbWUoKSB0aGF0IHdyb25nbHkgdXNlZCBhIHNpemVfdAogIHZhcmlhYmxlIHRvIHBvaW50IHRvIHdoZW4gaXQgc2hvdWxkIGJlIGEgc29ja2xlbl90LgoKLSBXaGVuIHNldHRpbmcgYSBwcm94eSB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgKGZvciBleGFtcGxlKSBydW5uaW5nCiAgJ2N1cmwgW1VSTF0nIHdpdGggYSBVUkwgd2l0aG91dCBhIHByb3RvY29sIHByZWZpeCwgY3VybCB3b3VsZCBub3Qgc2VuZCBhCiAgY29ycmVjdCByZXF1ZXN0IGFzIGl0IGZhaWxlZCB0byBhZGQgdGhlIHByb3RvY29sIHByZWZpeC4KCkRhbmllbCAoMjEgRGVjZW1iZXIgMjAwNikKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIHJlcG9ydGVkIGJ1ZyAjMTYxODM1OQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjE4MzU5KSBhbmQgc3Vic2VxdWVudGx5IHByb3ZpZGVkIGEKICBwYXRjaCBmb3IgaXQ6IHdoZW4gZG93bmxvYWRpbmcgMiB6ZXJvIGJ5dGUgZmlsZXMgaW4gYSByb3csIGN1cmwgNy4xNi4wCiAgZW50ZXJzIGFuIGluZmluaXRlIGxvb3AsIHdoaWxlIGN1cmwgNy4xNi4xLTIwMDYxMjE4IGRvZXMgb25lIGFkZGl0aW9uYWwKICB1bm5lY2Vzc2FyeSByZXF1ZXN0LgoKICBGaXg6IER1cmluZyB0aGUgIk1ham9yIG92ZXJoYXVsIGludHJvZHVjaW5nIGh0dHAgcGlwZWxpbmluZyBzdXBwb3J0IGFuZAogIHNoYXJlZCBjb25uZWN0aW9uIGNhY2hlIHdpdGhpbiB0aGUgbXVsdGkgaGFuZGxlLiIgY2hhbmdlLCBoZWFkZXJieXRlY291bnQKICB3YXMgbW92ZWQgdG8gbGl2ZSBpbiB0aGUgQ3VybF90cmFuc2Zlcl9rZWVwZXIgc3RydWN0dXJlLiBCdXQgdGhhdCBzdHJ1Y3R1cmUKICBpcyByZXNldCBpbiB0aGUgVHJhbnNmZXIgbWV0aG9kLCBsb3NpbmcgdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgaGFkIGFib3V0CiAgdGhlIGhlYWRlciBzaXplLiBUaGlzIHBhdGNoIG1vdmVzIGl0IGJhY2sgdG8gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdC4KCkRhbmllbCAoMTYgRGVjZW1iZXIgMjAwNikKLSBCcmVuZGFuIEp1cmQgcHJvdmlkZWQgYSBmaXggdGhhdCBub3cgcHJldmVudHMgbGliY3VybCBmcm9tIGdldHRpbmcgYSBTSUdQSVBFCiAgZHVyaW5nIGNlcnRhaW4gY29uZGl0aW9ucyB3aGVuIEdudVRMUyBpcyB1c2VkLgoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDA2KQotIEFsZXhleSBTaW1hayBmb3VuZCBvdXQgdGhhdCB3aGVuIGRvaW5nIEZUUCB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kCiAgc29tZXRoaW5nIHdlbnQgd3JvbmcgbGlrZSBpdCBnb3QgYSBiYWQgcmVzcG9uc2UgY29kZSBiYWNrIGZyb20gdGhlIHNlcnZlciwKICBsaWJjdXJsIHdvdWxkIGxlYWsgbWVtb3J5LiBBZGRlZCB0ZXN0IGNhc2UgNTM4IHRvIHZlcmlmeSB0aGUgZml4LgoKICBJIGFsc28gbm90ZWQgdGhhdCB0aGUgY29ubmVjdGlvbiB3b3VsZCBnZXQgY2FjaGVkIGluIHRoYXQgY2FzZSwgd2hpY2gKICBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2luY2UgaXQgY2Fubm90IGJlIHJlLXVzZSB3aGVuIHRoZSBhdXRoZW50aWNhdGlvbiBoYXMKICBmYWlsZWQuIEkgZml4ZWQgdGhhdCBpc3N1ZSB0b28gYXQgdGhlIHNhbWUgdGltZSwgYW5kIGFsc28gdGhhdCB0aGUgcGF0aAogIHdvdWxkIGJlICJyZW1lbWJlcmVkIiBpbiB2YWluIGZvciBjYXNlcyB3aGVyZSB0aGUgY29ubmVjdGlvbiB3YXMgYWJvdXQgdG8KICBnZXQgY2xvc2VkLgoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDYpCi0gU2ViYXN0aWVuIFdpbGxlbWlqbnMgcmVwb3J0ZWQgYnVnICMxNjAzNzEyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MDM3MTIpIHdoaWNoIGlzIGFib3V0IGNvbm5lY3Rpb25zCiAgZ2V0dGluZyBjdXQgb2ZmIHByZW1hdHVyZWx5IHdoZW4gLS1saW1pdC1yYXRlIGlzIHVzZWQuIFdoaWxlIEkgZm91bmQgbm8gc3VjaAogIHByb2JsZW1zIGluIG15IHRlc3RzIG5vciBpbiBteSByZWFkaW5nIG9mIHRoZSBjb2RlLCBJIGZvdW5kIHRoYXQgdGhlCiAgLS1saW1pdC1yYXRlIGNvZGUgd2FzIHNldmVybHkgZmxhd2VkIChzaW5jZSBpdCB3YXMgbW92ZWQgaW50byB0aGUgbGliLCBzaW5jZQogIDcuMTUuNSkgd2hlbiB1c2VkIHdpdGggdGhlIGVhc3kgaW50ZXJmYWNlIGFuZCBpdCBkaWRuJ3Qgd29yayBhcyBkb2N1bWVudGVkCiAgc28gSSByZXdvcmtlZCBpdCBzb21ld2hhdCBhbmQgbm93IGl0IHdvcmtzIGZvciBteSB0ZXN0cy4KCkRhbmllbCAoNSBEZWNlbWJlciAyMDA2KQotIFN0ZWZhbiBLcmF1c2UgcG9pbnRlZCBvdXQgYSBjb21waWxlciB3YXJuaW5nIHdpdGggYSBwaWNreSBNU0NWIGNvbXBpbGVyIHdoZW4KICBwYXNzaW5nIGEgY3VybF9vZmZfdCBhcmd1bWVudCB0byB0aGUgQ3VybF9yZWFkX3Jld2luZCgpIGZ1bmN0aW9uIHdoaWNoIHRha2VzCiAgYW4gc2l6ZV90IGFyZ3VtZW50LiBDdXJsX3JlYWRfcmV3aW5kKCkgYWxzbyBoYWQgZGVidWcgY29kZSBsZWZ0IGluIGl0IGFuZCBpdAogIHdhcyBwdXQgaW4gYSBkaWZmZXJlbnQgc291cmNlIGZpbGUgd2l0aCBubyBnb29kIHJlYXNvbiB3aGVuIG9ubHkgdXNlZCBmcm9tCiAgb25lIHNpbmdsZSBzcG90LgoKLSBTaCBEaWFvIHJlcG9ydGVkIHRoYXQgQ1VSTE9QVF9DTE9TRVBPTElDWSBkb2Vzbid0IHdvcmssIGFuZCBpbmRlZWQsIHRoZXJlIGlzCiAgbm8gY29kZSBwcmVzZW50IGluIHRoZSBsaWJyYXJ5IHRoYXQgcmVjZWl2ZXMgdGhlIG9wdGlvbi4gU2luY2UgaXQgd2FzIG5vdAogIHBvc3NpYmxlIHRvIHVzZSwgd2Uga25vdyB0aGF0IG5vIGN1cnJlbnQgdXNlcnMgZXhpc3QgYW5kIHRodXMgd2Ugc2ltcGx5CiAgcmVtb3ZlZCBpdCBmcm9tIHRoZSBkb2NzIGFuZCBtYWRlIHRoZSBjb2RlIGFsd2F5cyB1c2UgdGhlIGRlZmF1bHQgcGF0aCBvZgogIHRoZSBjb2RlLgoKLSBKYXJlZCBMdW5kZWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzE2MDQ5NTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwNDk1Nikgd2hpY2ggaWRlbnRpZmllZCBzZXR0aW5nCiAgQ1VSTE9QVF9NQVhDT05ORUNUUyB0byB6ZXJvIGNhdXNlZCBsaWJjdXJsIHRvIFNJR1NFR1YuIFN0YXJ0aW5nIG5vdywgbGliY3VybAogIHdpbGwgYWx3YXlzIGludGVybmFsbHkgdXNlIG5vIGxlc3MgdGhhbiAxIGVudHJ5IGluIHRoZSBjb25uZWN0aW9uIGNhY2hlLgoKLSBTaCBEaWFvIHJlcG9ydGVkIHRoYXQgQ1VSTE9QVF9GT1JCSURfUkVVU0Ugbm8gd29ya3MsIGFuZCBpbmRlZWQgaXQgYnJva2UgaW4KICB0aGUgNy4xNi4wIHJlbGVhc2UuCgotIE1hcnRpbiBTa2lubmVyIGJyb3VnaHQgYmFjayBidWcgcmVwb3J0ICMxMjMwMTE4IHRvIGhhdW50IHVzIG9uY2UgYWdhaW4uCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMzAxMTgpIGN1cmxfZ2V0ZGF0ZSgpIGRpZCBub3Qgd29yawogIHByb3Blcmx5IGZvciBhbGwgaW5wdXQgZGF0ZXMgb24gV2luZG93cy4gSXQgd2FzIG1vc3RseSBzZWVuIG9uIHNvbWUgVFogdGltZQogIHpvbmVzIHVzaW5nIERTVC4gTHVja2lseSwgTWFydGluIGFsc28gcHJvdmlkZWQgYSBmaXguCgotIEFsZXhleSBTaW1hayBmaWxlZCBidWcgcmVwb3J0ICMxNjAwNDQ3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MDA0NDcpIGluIHdoaWNoIGhlIG5vdGVkIHRoYXQgYWN0aXZlCiAgRlRQIGNvbm5lY3Rpb25zIGRvbid0IHdvcmsgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlLiBUaGUgcHJvYmxlbSBpcyBoZXJlCiAgdGhhdCB0aGUgbXVsdGkgaW50ZXJmYWNlIHN0YXRlIG1hY2hpbmUgaGFzIGEgc3RhdGUgZHVyaW5nIHdoaWNoIGl0IGNhbiB3YWl0CiAgZm9yIHRoZSBkYXRhIGNvbm5lY3Rpb24gdG8gY29ubmVjdCwgYnV0IHRoZSBhY3RpdmUgY29ubmVjdGlvbiBpcyBub3QgZG9uZSBpbgogIHRoZSBzYW1lIHN0ZXAgaW4gdGhlIHNlcXVlbmNlIGFzIHRoZSBwYXNzaXZlIG9uZSBpcyBzbyBpdCBkb2Vzbid0IHF1aXRlIHdvcmsKICBmb3IgYWN0aXZlLiBUaGUgYWN0aXZlIEZUUCBjb2RlIHN0aWxsIHVzZSBhIGJsb2NraW5nIGZ1bmN0aW9uIHRvIGFsbG93IHRoZQogIHJlbW90ZSBzZXJ2ZXIgdG8gY29ubmVjdC4KCiAgVGhlIGZpeCAod29yay1hcm91bmQgaXMgYSBiZXR0ZXIgd29yZCkgZm9yIHRoaXMgcHJvYmxlbSBpcyB0byBzZXQgdGhlCiAgYm9vbGVhbiBwcmVtYXR1cmVseSB0aGF0IHRoZSBkYXRhIGNvbm5lY3Rpb24gaXMgY29tcGxldGVkLCBzbyB0aGF0IHRoZSAid2FpdAogIGZvciBjb25uZWN0IiBwaGFzZSBlbmRzIGF0IG9uY2UuCgogIFRoZSBwcm9wZXIgZml4LCBsZWZ0IGZvciB0aGUgZnV0dXJlLCBpcyBvZiBjb3Vyc2UgdG8gbWFrZSB0aGUgYWN0aXZlIEZUUAogIGNhc2UgdG8gYWN0IGluIGEgbm9uLWJsb2NraW5nIHdheSB0b28uCgotIE1hdHQgV2l0aGVyc3Bvb24gZml4ZWQgYSBwcm9ibGVtIGNhc2Ugd2hlbiB0aGUgQ1BVIGxvYWQgd2VudCB0byAxMDAlIHdoZW4gYQogIEhUVFAgdXBsb2FkIHdhcyBkaXNjb25uZWN0ZWQ6CgogICJXaGF0IGFwcGVhcnMgdG8gYmUgaGFwcGVuaW5nIGlzIHRoYXQgbXkgc3lzdGVtIChMaW51eCAyLjYuMTcgYW5kIDIuNi4xMykgaXMKICBzZXR0aW5nICpvbmx5KiBQT0xMSFVQIG9uIHBvbGwoKSB3aGVuIHRoZSBjb25kaXRpb25zIGluIG15IHByZXZpb3VzIG1haWwKICBvY2N1ci4gQXMgeW91IGNhbiBzZWUsIHNlbGVjdC5jOkN1cmxfc2VsZWN0KCkgZG9lcyBub3QgY2hlY2sgZm9yIFBPTExIVVAuIFNvCiAgYmFzaWNhbGx5IHdoYXQgd2FzIGhhcHBlbmluZywgaXMgcG9sbCgpIHdhcyByZXR1cm5pbmcgaW1tZWRpYXRlbHkgKHdpdGgKICBQT0xMSFVQIHNldCksIGJ1dCB3aGVuIEN1cmxfc2VsZWN0KCkgbG9va2VkIGF0IHRoZSBiaXRzLCBuZWl0aGVyIFBPTExFUlIgb3IKICBQT0xMT1VUIHdhcyBzZXQuIFRoaXMgc3RpbGwgY2F1c2VkIEN1cmxfcmVhZHdyaXRlKCkgdG8gYmUgY2FsbGVkLCB3aGljaAogIHF1aWNrbHkgcmV0dXJuZWQuIFRoZW4gdGhlIHRyYW5zZmVyKCkgbG9vcCBrZXB0IGNvbnRpbnVpbmcgYXQgZnVsbCBzcGVlZAogIGZvcmV2ZXIuIgoKRGFuaWVsICgxIERlY2VtYmVyIDIwMDYpCi0gVG9vbiBWZXJ3YWVzdCByZXBvcnRlZCB0aGF0IHRoZXJlIGFyZSBzZXJ2ZXJzIHRoYXQgc2VuZCB0aGUgQ29udGVudC1SYW5nZToKICBoZWFkZXIgaW4gYSB0aGlyZCwgbm90IHN1cHBwb3J0ZWQgYnkgbGliY3VybCwgZm9ybWF0IGFuZCB3ZSBhZ3JlZWQgdGhhdCB3ZQogIGNvdWxkIG1ha2UgdGhlIHBhcnNlciBtb3JlIGZvcmdpdmluZyB0byBhY2NlcHQgYWxsIHRoZSB0aHJlZSBmb3VuZAogIHZhcmlhdGlvbnMuCgpEYW5pZWwgKDI1IE5vdmVtYmVyIDIwMDYpCi0gVmVua2F0IEFrZWxsYSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIGRpZCBub3QgbGlrZSBIVFRQIHJlc3BvbnNlcyB0aGF0IHNpbXBseQogIHJlc3BvbmRlZCB3aXRoIGEgc2luZ2xlIHN0YXR1cyBsaW5lIGFuZCBubyBoZWFkZXJzIG5vciBib2R5LiBTdGFydGluZyBub3csIGEKICBIVFRQIHJlc3BvbnNlIG9uIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIChpLmUgbm90IHNldCB0byBiZSBjbG9zZWQgYWZ0ZXIgdGhlCiAgcmVzcG9uc2UgaGFzIGJlZW4gdGFrZW4gY2FyZSBvZikgbXVzdCBoYXZlIENvbnRlbnQtTGVuZ3RoIG9yIGNodW5rZWQKICBlbmNvZGluZyBzZXQsIG9yIGxpYmN1cmwgd2lsbCBzaW1wbHkgYXNzdW1lIHRoYXQgdGhlcmUgaXMgbm8gYm9keS4KCiAgVG8gbXkgaG9ycm9yIEkgbGVhcm5lZCB0aGF0IHdlIGhhZCBubyBsZXNzIHRoYW4gNTcoISkgdGVzdCBjYXNlcyB0aGF0IGRpZCBiYWQKICBIVFRQIHJlc3BvbnNlcyBsaWtlIHRoaXMsIGFuZCBldmVuIHRoZSB0ZXN0IGh0dHAgc2VydmVyIChzd3MpIHJlc3BvbmRlZCBiYWRseQogIHdoZW4gcXVlcmllZCBieSB0aGUgdGVzdCBzeXN0ZW0gaWYgaXQgaXMgdGhlIHRlc3Qgc3lzdGVtLiBTbyBhbHRob3VnaCB0aGUKICBhY3R1YWwgZml4IGZvciB0aGUgcHJvYmxlbSB3YXMgdGlueSwgZ29pbmcgdGhyb3VnaCBhbGwgdGhlIG5ld2x5IGZhaWxpbmcgdGVzdAogIGNhc2VzIGdvdCByZWFsbHkgcGFpbmZ1bCBhbmQgYm9yaW5nLgoKRGFuaWVsICgyNCBOb3ZlbWJlciAyMDA2KQotIEphbWVzIEhvdXNsZXkgZGlkIGxvdHMgb2Ygd29yayBhbmQgaW50cm9kdWNlZCBTRlRQIGRvd25sb2Fkcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwNikKLSBSb24gaW4gYnVnICMxNTk1MzQ4IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTk1MzQ4KSBwb2ludGVkCiAgb3V0IGEgc3RhY2sgb3ZlcndyaXRlIChhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZml4KSBvbiA2NGJpdCBXaW5kb3dzIHdoZW4KICBkZWFsaW5nIHdpdGggSFRUUCBjaHVua2VkIGVuY29kaW5nLgoKRGFuaWVsICg5IE5vdmVtYmVyIDIwMDYpCi0gTmlyIFNvZmZlciB1cGRhdGVkIGxpYmN1cmwuZnJhbWV3b3JrLm1ha2U6CiAgbyBmaXggc3ltbGlua3MsIHNob3VsZCBsaW5rIHRvIFZlcnNpb25zLCBub3QgdG8gLi9WZXJzaW9ucwogIG8gaW5kZW50YXRpb24gaW1wcm92bWVudHMKCi0gRG1pdHJpeSBTZXJnZXlldiBmb3VuZCBhIFNJR1NFR1Ygd2l0aCBoaXMgdGVzdDA0LmMgZXhhbXBsZSBwb3N0ZWQgb24gNyBOb3YKICAyMDA2LiBJdCB0dXJuZWQgb3V0IHdlIHdyb25nbHkgYXNzdW1lZCB0aGF0IHRoZSBjb25uZWN0aW9uIGNhY2hlIHdhcyBwcmVzZW50CiAgd2hlbiB0ZWFyaW5nIGRvd24gYSBjb25uZWN0aW9uLgoKLSBDaXByaWFuIEJhZGVzY3UgZm91bmQgYSBTSUdTRUdWIHdoZW4gZG9pbmcgbXVsdGlwbGUgVEZUUCB0cmFuc2ZlcnMgdXNpbmcgdGhlCiAgbXVsdGkgaW50ZXJmYWNlLCBidXQgSSBjb3VsZCBhbHNvIHJlcGVhdCBpdCBkb2luZyBtdWx0aXBsZSBzZXF1ZW50aWFsIG9uZXMKICB3aXRoIHRoZSBlYXN5IGludGVyZmFjZS4gVXNpbmcgQ2lwcmlhbidzIHRlc3QgY2FzZSwgSSBjb3VsZCBmaXggaXQuCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwNikKLSBCcmFkZm9yZCBCcnVjZSByZXBvcnRlZCB0aGF0IHdoZW4gc2V0dGluZyBDVVJMT1BUX0RFQlVHRlVOQ1RJT04gd2l0aG91dAogIENVUkxPUFRfVkVSQk9TRSBzZXQgdG8gbm9uLXplcm8sIHlvdSBzdGlsbCBnb3QgYSBmZXcgZGVidWcgbWVzc2FnZXMgZnJvbSB0aGUKICBTU0wgaGFuZHNoYWtlLiBUaGlzIGlzIG5vdyBzdG9wcGVkLgoKRGFuaWVsICg3IE5vdmVtYmVyIDIwMDYpCi0gT2xhZiBmaXhlZCBhIGxlZnRvdmVyIHByb2JsZW0gd2l0aCB0aGUgQ09OTkVDVCBmaXggb2YgaGlzIHRoYXQgd291bGQgbGVhdmUgYQogIHdyb25nIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGVycm9yIG1lc3NhZ2UgYnVmZmVyLgoKRGFuaWVsICgzIE5vdmVtYmVyIDIwMDYpCi0gT2xhZiBTdHVlYmVuIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBJIGVkaXRlZCBzbGlnaHRseS4gSXQgZml4ZXMgdGhlIG5vdG9yaW91cwogIEtOT1dOX0JVR1MgIzI1LCB3aGljaCBoYXBwZW5zIHdoZW4gYSBwcm94eSBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gd2hlbgogIGxpYmN1cmwgaGFzIHNlbnQgQ09OTkVDVCwgYXMgcGFydCBvZiBhbiBhdXRoZW50aWNhdGlvbiBuZWdvdGlhdGlvbi4gU3RhcnRpbmcKICBub3csIGxpYmN1cmwgd2lsbCByZS1jb25uZWN0IGFjY29yZGluZ2x5IGFuZCBjb250aW51ZSB0aGUgYXV0aGVudGljYXRpb24gYXMKICBpdCBzaG91bGQuCgpEYW5pZWwgKDIgTm92ZW1iZXIgMjAwNikKLSBKYW1lcyBIb3VzbGV5IGJyb3VnaHQgc3VwcG9ydCBmb3IgU0NQIHRyYW5zZmVycywgYmFzZWQgb24gdGhlIGxpYnNzaDIgbGlicmFyeQogIGZvciB0aGUgYWN0dWFsIG5ldHdvcmsgcHJvdG9jb2wgc3R1ZmYuCgogIEFkZGVkIHRoZXNlIG5ldyBjdXJsX2Vhc3lfc2V0b3B0KCkgb3B0aW9uczoKCiAgICBDVVJMT1BUX1NTSF9BVVRIX1RZUEVTCiAgICBDVVJMT1BUX1NTSF9QVUJMSUNfS0VZRklMRQogICAgQ1VSTE9QVF9TU0hfUFJJVkFURV9LRVlGSUxFCgpWZXJzaW9uIDcuMTYuMCAoMzAgT2N0b2JlciAyMDA2KQoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDYpCi0gRml4ZWQgQ1VSTE9QVF9GQUlMT05FUlJPUiB0byByZXR1cm4gQ1VSTEVfSFRUUF9SRVRVUk5FRF9FUlJPUiBldmVuIGZvciB0aGUKICBjYXNlIHdoZW4gNDAxIG9yIDQwNyBhcmUgcmV0dXJuZWQsICpJRiogbm8gYXV0aCBjcmVkZW50aWFscyBoYXZlIGJlZW4gZ2l2ZW4uCiAgVGhlIENVUkxPUFRfRkFJTE9ORVJST1Igb3B0aW9uIGlzIG5vdCBwb3NzaWJsZSB0byBtYWtlIGZvb2wtcHJvb2YgZm9yIDQwMQogIGFuZCA0MDcgY2FzZXMgd2hlbiBhdXRoIGNyZWRlbnRpYWxzIGlzIGdpdmVuLCBidXQgd2UndmUgbm93IGNvdmVyZWQgdGhpcwogIHNvbWV3aGF0IG1vcmUuCgogIFlvdSBtaWdodCBnZXQgc29tZSBhbW91bnRzIG9mIGhlYWRlcnMgdHJhbnNmZXJyZWQgYmVmb3JlIHRoaXMgc2l0dWF0aW9uIGlzCiAgZGV0ZWN0ZWQsIGxpa2UgZm9yIHdoZW4gYSAiMTAwLWNvbnRpbnVlIiBpcyByZWNlaXZlZCBhcyBhIHJlc3BvbnNlIHRvIGEKICBQT1NUL1BVVCBhbmQgYSA0MDEgb3IgNDA3IGlzIHJlY2VpdmVkIGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMuCgogIEFkZGVkIHRlc3QgMjgxIHRvIHZlcmlmeSB0aGlzIGNoYW5nZS4KCkRhbmllbCAoMjMgT2N0b2JlciAyMDA2KQotIFJhdmkgUHJhdGFwIHByb3ZpZGVkIGEgbWFqb3IgdXBkYXRlIHdpdGggcGlwZWxpbmluZyBmaXhlcy4gV2UgYWxzbyBubyBsb25nZXIKICByZS11c2UgY29ubmVjdGlvbnMgKGZvciBwaXBlbGluaW5nKSBiZWZvcmUgdGhlIG5hbWUgcmVzb2x2aW5nIGlzIGRvbmUuCgpEYW5pZWwgKDIxIE9jdG9iZXIgMjAwNikKLSBOaXIgU29mZmVyIG1hZGUgdGhlIHRlc3RzL2xpYnRlc3QvTWFrZWZpbGUuYW0gdXNlIGEgcHJvcGVyIHZhcmlhYmxlIGZvciBhbGwKICB0aGUgc2luZ2xlIHRlc3QgYXBwbGljYXRpb25zJyBsaW5rIGFuZCBkZXBlbmRlbmNlcywgc28gdGhhdCB5b3UgZWFzaWVyIGNhbgogIG92ZXJyaWRlIHRob3NlIGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aGVuIHVzaW5nIG1ha2UuCgotIEFybWVsIEFzc2VsaW4gc2VwYXJhdGVkIENBIGNlcnQgdmVyaWZpY2F0aW9uIHByb2JsZW1zIGZyb20gcHJvYmxlbXMgd2l0aAogIHJlYWRpbmcgdGhlIChsb2NhbCkgQ0EgY2VydCBmaWxlIHRvIGxldCB1c2VycyBlYXNpZXIgcGlucG9pbnQgdGhlIGFjdHVhbAogIHByb2JsZW0uIENVUkxFX1NTTF9DQUNFUlRfQkFERklMRSAoNzcpIGlzIHRoZSBuZXcgbGliY3VybCBlcnJvciBjb2RlLgoKRGFuaWVsICgxOCBPY3RvYmVyIDIwMDYpCi0gUmVtb3ZlZCB0aGUgInByb3RvY29sLWd1ZXNzaW5nIiBmb3IgVVJMcyB3aXRoIGhvc3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBGVFBTCiAgb3IgVEVMTkVUIHNpbmNlIHRoZXkgYXJlIHByYWN0aWNhbGx5IG5vbi1leGlzdGFudC4gVGhpcyBsZWF2ZXMgdXMgd2l0aCBvbmx5CiAgdGhyZWUgZGlmZmVyZW50IHByZWZpeGVzIHRoYXQgd291bGQgYXNzdW1lIHRoZSBwcm90b2NvbCBpcyBhbnl0aGluZyBidXQKICBIVFRQLCBhbmQgdGhleSBhcmUgaG9zdCBuYW1lcyBzdGFydGluZyB3aXRoICJmdHAuIiwgImRpY3QuIiBvciAibGRhcC4iLgoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDYpCi0gQnVnIHJlcG9ydCAjMTU3OTE3MSBwb2ludGVkIG91dCBjb2RlIGZsYXdzIGRldGVjdGVkIHdpdGggInByZWZhc3QiLCBhbmQgdGhleQogIHdlcmUgMSAtIGEgdG9vIHNtYWxsIG1lbW9yeSBjbGVhciB3aXRoIG1lbXNldCgpIGluIHRoZSB0aHJlYWRlZCByZXNvbHZlciBhbmQKICAyIC0gYSByYW5nZSBvZiBwb3RlbnRpYWxseSBiYWQgdXNlcyBvZiB0aGUgY3R5cGUgZmFtaWx5IG9mIGlzKigpIGZ1bmN0aW9ucwogIHN1Y2ggYXMgaXNkaWdpdCgpLCBpc2FsbnVtKCksIGlzcHJpbnQoKSBhbmQgbW9yZS4gVGhlIGxhdHRlciBtYWRlIG1lIHN3aXRjaAogIHRvIHVzaW5nIG91ciBvd24gc2V0IG9mIHRoZXNlIGZ1bmN0aW9ucy9tYWNyb3MgdXNpbmcgdXBwZXJjYXNlIGxldHRlcnMsIGFuZAogIHdpdGggc29tZSBleHRyYSBzZXQgb2YgY3JhenkgdHlwZWNhc3RzIHRvIGF2b2lkIG1pc3Rha2luZ2x5IHBhc3NpbmcgaW4KICBuZWdhdGl2ZSBudW1iZXJzIHRvIHRoZSB1bmRlcmx5aW5nIGlzKigpIGZ1bmN0aW9ucy4KCi0gV2l0aCBKZWZmIFBvaGxtZXllcidzIGhlbHAsIEkgZml4ZWQgdGhlIGV4cGlyZSB0aW1lciB3aGVuIHVzaW5nCiAgY3VybF9tdWx0aV9zb2NrZXQoKSBkdXJpbmcgbmFtZSByZXNvbHZlcyB3aXRoIGMtYXJlcyBhbmQgdGhlIExPV19TUEVFRAogIG9wdGlvbnMgbm93IHdvcmsgZmluZSB3aXRoIGN1cmxfbXVsdGlfc29ja2V0KCkgYXMgd2VsbC4KCkRhbmllbCAoMTYgT2N0b2JlciAyMDA2KQotIEFkZGVkIGEgY2hlY2sgaW4gY29uZmlndXJlIHRoYXQgc2ltcGx5IHRyaWVzIHRvIHJ1biBhIHByb2dyYW0gKG5vdCB3aGVuCiAgY3Jvc3MtY29tcGlsaW5nKSBpbiBvcmRlciB0byBkZXRlY3QgcHJvYmxlbXMgd2l0aCBydW4tdGltZSBsaWJyYXJpZXMgdGhhdAogIG90aGVyd2lzZSB3b3VsZCBvY2N1ciB3aGVuIHRoZSBzaXplb2YgdGVzdHMgZm9yIGN1cmxfb2ZmX3Qgd291bGQgcnVuIGFuZAogIHRodXMgYmUgbXVjaCBtb3JlIGNvbmZ1c2luZyB0byB1c2Vycy4gVGhlIGNoZWNrIG9mIGNvdXJzZSBzaG91bGQgcnVuIGFmdGVyCiAgYWxsIGxpYi1jaGVja3MgYXJlIGRvbmUgYW5kIGJlZm9yZSBhbnkgb3RoZXIgdGVzdCBpcyB1c2VkIHRoYXQgd291bGQgcnVuIGFuCiAgZXhlY3V0YWJsZSBidWlsdCBmb3IgdGVzdGluZy1wdXJwb3Nlcy4KCkRhbiBGICgxMyBPY3RvYmVyIDIwMDYpCi0gVGhlIHRhZ2dpbmcgb2YgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIFBPU1QgYm9keSBkYXRhIHNlbnQKICB0byB0aGUgQ1VSTE9QVF9ERUJVR0ZVTkNUSU9OIGNhbGxiYWNrIGhhcyBiZWVuIGZpeGVkIChpdCB3YXMgZXJyb25lb3VzbHkKICBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBoZWFkZXIpLiAgQSBtZXNzYWdlIHdhcyBhbHNvIGFkZGVkIHRvIHRoZQogIGNvbW1hbmQgbGluZSB0b29sIHRvIHNob3cgd2hlbiBkYXRhIGlzIGJlaW5nIHNlbnQsIGVuYWJsZWQgd2hlbgogIC0tdmVyYm9zZSBpcyB1c2VkLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDYpCi0gU3RhcnRpbmcgbm93LCBhZGRpbmcgYW4gZWFzeSBoYW5kbGUgdG8gYSBtdWx0aSBzdGFjayB0aGF0IHdhcyBhbHJlYWR5IGFkZGVkCiAgdG8gYSBtdWx0aSBzdGFjayB3aWxsIGNhdXNlIENVUkxNX0JBRF9FQVNZX0hBTkRMRSB0byBnZXQgcmV0dXJuZWQuCgotIEplZmYgUG9obG1leWVyIGhhcyBiZWVuIHdvcmtpbmcgd2l0aCB0aGUgaGlwZXJmaWZvLmMgZXhhbXBsZSBzb3VyY2UgY29kZSwKICBhbmQgd2hpbGUgZG9pbmcgc28gaXQgYmVjYW1lIGFwcGFyZW50IHRoYXQgdGhlIGN1cnJlbnQgdGltZW91dCBzeXN0ZW0gZm9yCiAgdGhlIHNvY2tldCBBUEkgcmVhbGx5IHdhcyBhIGJpdCBhd2t3YXJkIHNpbmNlIGl0IGJlY29tZSBxdWl0ZSBzb21lIHdvcmsgdG8KICBiZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgdGltZW91dCBzZXQuCgogIEplZmYgdGhlbiBwcm92aWRlZCB0aGUgbmV3IENVUkxNT1BUX1RJTUVSRlVOQ1RJT04gdGhhdCBpcyB5ZXQgYW5vdGhlcgogIGNhbGxiYWNrIHRoZSBhcHAgY2FuIHNldCB0byBnZXQgdG8ga25vdyB3aGVuIHRoZSBnZW5lcmFsIHRpbWVvdXQgdGltZQogIGNoYW5nZXMgYW5kIHRodXMgZm9yIGFuIGFwcGxpY2F0aW9uIGxpa2UgaGlwZXJmaWZvLmMgaXQgbWFrZXMgZXZlcnl0aGluZyBhCiAgbG90IGVhc2llciBhbmQgbmljZXIuIFRoZXJlJ3MgYSBDVVJMTU9QVF9USU1FUkRBVEEgb3B0aW9uIHRvbyBvZiBjb3Vyc2UgaW4KICBnb29kIG9sZCBsaWJjdXJsIHRyYWRpdGlvbi4KCiAgSmVmZiBoYXMgYWxzbyB1cGRhdGVkIHRoZSBoaXBlcmZpZm8uYyBleGFtcGxlIGNvZGUgdG8gdXNlIHRoaXMgbmV3cy4KCkRhbmllbCAoOSBPY3RvYmVyIDIwMDYpCi0gQm9nZGFuIE5pY3VsYSdzIHNlY29uZCB0ZXN0IGNhc2UgKHBvc3RlZCBTdW4sIDA4IE9jdCAyMDA2KSBjb252ZXJ0ZWQgdG8gdGVzdAogIGNhc2UgNTM1IGFuZCBpdCBub3cgcnVucyBmaW5lLiBBZ2FpbiBhIHByb2JsZW0gd2l0aCB0aGUgcGlwZWxpbmluZyBjb2RlIG5vdAogIHRha2luZyBhbGwgcG9zc2libGUgKGVycm9yKSBjb25kaXRpb25zIGludG8gYWNjb3VudC4KCkRhbmllbCAoNiBPY3RvYmVyIDIwMDYpCi0gQm9nZGFuIE5pY3VsYSdzIGhhbmdpbmcgdGVzdCBjYXNlIChwb3N0ZWQgV2VkLCAwNCBPY3QgMjAwNikgd2FzIGNvbnZlcnRlZCB0bwogIHRlc3QgY2FzZSA1MzMgYW5kIHRoZSB0ZXN0IG5vdyBydW5zIGZpbmUuCgpEYW5pZWwgKDQgT2N0b2JlciAyMDA2KQotIERtaXRyaXkgU2VyZ2V5ZXYgcHJvdmlkZWQgYW4gZXhhbXBsZSBzb3VyY2UgY29kZSB0aGF0IGNyYXNoZWQgQ1ZTIGxpYmN1cmwKICBidXQgdGhhdCB3b3JrZWQgbmljZWx5IGluIDcuMTUuNS4gSSBjb252ZXJ0ZWQgaXQgaW50byB0ZXN0IGNhc2UgNTMyIGFuZAogIGZpeGVkIHRoZSBwcm9ibGVtLgoKRGFuaWVsICgyOSBTZXB0ZW1iZXIgMjAwNikKLSBSZW1vdmVkIGEgZmV3IG90aGVyIG5vLWxvbmdlciBwcmVzZW50IG9wdGlvbnMgZnJvbSB0aGUgaGVhZGVyIGZpbGUuCgotIFN1cHBvcnQgZm9yIEZUUCB0aGlyZCBwYXJ0eSB0cmFuc2ZlcnMgd2FzIHJlbW92ZWQuIEhlcmUncyB3aHk6CgogIG8gVGhlIHJlY2VudCBtdWx0aSBpbnRlcmZhY2UgY2hhbmdlcyBicm9rZSBpdCBhbmQgdGhlIGRlc2lnbiBvZiB0aGUgM3JkIHBhcnR5CiAgICB0cmFuc2ZlcnMgbWFkZSBpdCB2ZXJ5IGhhcmQgdG8gZml4IHRoZSBwcm9ibGVtcwogIG8gSXQgd2FzIHN0aWxsIGJsb2NraW5nIGFuZCB0aHVzIG5hc3R5IGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgbyBJdCB3YXMgYSBsb3Qgb2YgZXh0cmEgY29kZSBmb3IgYSB2ZXJ5IHJhcmVseSB1c2VkIGZlYXR1cmUKICBvIEl0IGRpZG4ndCB1c2UgdGhlIHNhbWUgY29kZSBhcyBmb3IgInBsYWluIiBGVFAgdHJhbnNmZXJzLCBzbyBpdCBkaWRuJ3Qgd29yawogICAgZmluZSBmb3IgSVB2NiBhbmQgaXQgZGlkbid0IHByb3Blcmx5IHJlLXVzZSBjb25uZWN0aW9ucyBhbmQgbW9yZQogIG8gVGhlcmUncyBub2JvZHkgYXJvdW5kIHdobydzIHdpbGxpbmcgdG8gd29yayBvbiBhbmQgaW1wcm92ZSB0aGUgZXhpc3RpbmcKICAgIGNvZGUKCiAgVGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhpcmQgcGFydHkgdHJhbnNmZXJzIGFyZSBiYW5uZWQgZm9yZXZlciwgb25seSB0aGF0CiAgdGhleSBuZWVkIHRvIGJlIGRvbmUgYmV0dGVyIGlmIHRoZXkgYXJlIHRvIGJlIHJlLWFkZGVkIGluIHRoZSBmdXR1cmUuCgogIFRoZSBDVVJMT1BUX1NPVVJDRV8qIG9wdGlvbnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgbGliIGFuZCBzbyBhcmUgdGhlIC0tM3AqCiAgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdG9vbC4gRm9yIHRoaXMgcmVhc29uLCBJIGFsc28gYnVtcGVkIHRoZQogIHZlcnNpb24gaW5mbyBmb3IgdGhlIGxpYi4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDYpCi0gUmVwb3J0ZWQgaW4gIzE1NjE0NzAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1NjE0NzApLCBsaWJjdXJsCiAgd291bGQgY3Jhc2ggaWYgYSBiYWQgZnVuY3Rpb24gc2VxdWVuY2Ugd2FzIHVzZWQgd2hlbiBzaHV0dGluZyBkb3duIGFmdGVyCiAgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSAoaS5lIHVzaW5nIGVhc3lfY2xlYW51cCBhZnRlciBtdWx0aV9jbGVhbnVwKSBzbwogIHByZWNhdXRpb25zIGhhdmUgYmVlbiBhZGRlZCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBhbnkgbW9yZSAtIHRlc3QgY2FzZSA1MjkKICB3YXMgYWRkZWQgdG8gdmVyaWZ5LgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwNikKLSBUaGUgVVJMIGluIHRoZSBjb29raWUgamFyIGZpbGUgaXMgbm93IGNoYW5nZWQgc2luY2UgaXQgd2FzIGdpdmluZyBhIDQwNC4KICBSZXBvcnRlZCBieSBUaW1vdGh5IFN0b25lLiBUaGUgbmV3IFVSTCB3aWxsIHRha2UgdGhlIHZpc2l0b3IgdG8gYSBjdXJsIHdlYgogIHNpdGUgbWlycm9yIHdpdGggdGhlIGRvY3VtZW50LgoKRGFuaWVsICgyNCBTZXB0ZW1iZXIgMjAwNikKLSBCZXJuYXJkIExlYWsgZml4ZWQgY29uZmlndXJlIC0td2l0aC1nc3NhcGktbGlicy4KCi0gQ29yeSBOZWxzb24gbWFkZSBsaWJjdXJsIHVzZSB0aGUgV1NBUG9sbCgpIGZ1bmN0aW9uIGlmIGJ1aWx0IGZvciBXaW5kb3dzCiAgVmlzdGEgKF9XSU4zMl9XSU5OVCA+PSAweDA2MDApCgpEYW5pZWwgKDIzIFNlcHRlbWJlciAyMDA2KQotIE1pa2UgUHJvdHRzIGFkZGVkIC0tZnRwLXNzbC1jb250cm9sIHRvIG1ha2UgY3VybCB1c2UgRlRQLVNTTCwgYnV0IG9ubHkKICBlbmNyeXB0IHRoZSBjb250cm9sIGNvbm5lY3Rpb24gYW5kIHVzZSB0aGUgZGF0YSBjb25uZWN0aW9uICJwbGFpbiIuCgotIERtaXRyaXkgU2VyZ2V5ZXYgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgdGhlIFNPQ0tTWzQ1XSBjb2RlIHdvcmsgYmV0dGVyCiAgYXMgaXQgbm93IHdpbGwgcmVhZCB0aGUgZnVsbCBkYXRhIHNlbnQgZnJvbSBzZXJ2ZXJzLiBUaGUgU09DS1MtcmVsYXRlZCBjb2RlCiAgd2FzIGFsc28gbW92ZWQgdG8gdGhlIG5ldyBsaWIvc29ja3MuYyBzb3VyY2UgZmlsZS4KCkRhbmllbCAoMjEgU2VwdGVtYmVyIDIwMDYpCi0gQWRkZWQgdGVzdCBjYXNlIDUzMSBpbiBhbiBhdHRlbXB0IHRvIHJlcGVhdCBidWcgcmVwb3J0ICMxNTYxNDcwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1NjE0NzApIHRoYXQgaXMgc2FpZCB0byBjcmFzaCB3aGVuIGFuCiAgRlRQIHVwbG9hZCBmYWlscyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UuIEl0IGRpZCBub3QsIGJ1dCBJIG1hZGUgYSBmYWlsZWQKICB1cGxvYWQgc3RpbGwgYXNzdW1lIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gdG8gYmUgZmluZS4KCkRhbmllbCAoMjAgU2VwdGVtYmVyIDIwMDYpCi0gQXJtZWwgQXNzZWxpbiBmaXhlZCBwcm9ibGVtcyB3aGVuIHlvdSBnYXZlIGEgcHJveHkgVVJMIHdpdGggdXNlciBuYW1lIGFuZAogIGVtcHR5IHBhc3N3b3JkIG9yIG5vIHBhc3N3b3JkIGF0IGFsbC4gVGVzdCBjYXNlIDI3OCBhbmQgMjc5IHdlcmUgYWRkZWQgdG8KICB2ZXJpZnkuCgpEYW5pZWwgKDEyIFNlcHRlbWJlciAyMDA2KQotIEFkZGVkIGRvY3MvZXhhbXBsZXMvMTAtYXQtYS10aW1lLmMgYnkgTWljaGFlbCBXYWxsbmVyCgotIEFkZGVkIGRvY3MvZXhhbXBsZXMvaGlwZXJmaWZvLmMgYnkgSmVmZiBQb2hsbWV5ZXIKCkRhbmllbCAoMTEgU2VwdGVtYmVyIDIwMDYpCi0gRml4ZWQgbXkgYnJlYWthZ2UgZnJvbSBlYXJsaWVyIHRvZGF5IHNvIHRoYXQgZG9pbmcgY3VybF9lYXN5X2NsZWFudXAoKSBvbiBhCiAgaGFuZGxlIHRoYXQgaXMgcGFydCBvZiBhIG11bHRpIGhhbmRsZSBmaXJzdCByZW1vdmVzIHRoZSBoYW5kbGUgZnJvbSB0aGUKICBzdGFjay4KCi0gQWRkZWQgQ1VSTE9QVF9TU0xfU0VTU0lPTklEX0NBQ0hFIGFuZCAtLW5vLXNlc3Npb25pZCB0byBkaXNhYmxlIFNTTAogIHNlc3Npb24tSUQgcmUtdXNlIG9uIGRlbWFuZCBzaW5jZSB0aGVyZSBvYnZpb3VzbHkgYXJlIGJyb2tlbiBzZXJ2ZXJzIG91dAogIHRoZXJlIHRoYXQgbWlzYmVoYXZlIHdpdGggc2Vzc2lvbi1JRHMgdXNlZC4KCi0gSmVmZiBQb2hsbWV5ZXIgcHJlc2VudGVkIGEgKm11bHRpX3NvY2tldCgpLXVzaW5nIHByb2dyYW0gdGhhdCBleHBvc2VkIGEKICBwcm9ibGVtIHdpdGggaXQgKFNJR1NFR1Ytc3R5bGUpLiBJdCBjbGVhcmx5IHNob3dlZCB0aGF0IHRoZSBleGlzdGluZwogIHNvY2tldC1zdGF0ZSBhbmQgc3RhdGUtZGlmZmVyZW5jZSBmdW5jdGlvbiB3YXNuJ3QgZ29vZCBlbm91Z2ggc28gSSByZXdyb3RlCiAgaXQgYW5kIGNvdWxkIHRoZW4gcmUtcnVuIEplZmYncyBwcm9ncmFtIHdpdGhvdXQgYW55IGNyYXNoLiBUaGUgcHJldmlvdXMKICB2ZXJzaW9uIGNsZWFybHkgY291bGQgbWlzcyB0byB0ZWxsIHRoZSBhcHBsaWNhdGlvbiB3aGVuIGEgaGFuZGxlIGNoYW5nZWQKICBmcm9tIHVzaW5nIG9uZSBzb2NrZXQgdG8gdXNpbmcgYW5vdGhlci4KCiAgV2hpbGUgSSB3YXMgYXQgaXQgKGFzIEkgY291bGQgdXNlIHRoaXMgYXMgYSBtZWFucyB0byB0cmFjayB0aGlzIHByb2JsZW0KICBkb3duKSwgSSd2ZSBub3cgYWRkZWQgYSAnbWFnaWMnIG51bWJlciB0byB0aGUgZWFzeSBoYW5kbGUgc3RydWN0IHRoYXQgaXMKICBpbml0ZWQgYXQgY3VybF9lYXN5X2luaXQoKSB0aW1lIGFuZCBjbGVhcmVkIGF0IGN1cmxfZWFzeV9jbGVhbnVwKCkgdGltZSB0aGF0CiAgd2UgY2FuIHVzZSBpbnRlcm5hbGx5IHRvIGRldGVjdCB0aGF0IGFuIGVhc3kgaGFuZGxlIHNlZW1zIHRvIGJlIGZpbmUsIG9yIGF0CiAgbGVhc3Qgbm90IGNsb3NlZCBvciBmcmVlZCAoZnJlZWluZyBpbiBkZWJ1ZyBidWlsZHMgZmlsbCB0aGUgYXJlYSB3aXRoIDB4MTMKICBieXRlcyBidXQgaW4gbm9ybWFsIGJ1aWxkcyB3ZSBjYW4gb2YgY291cnNlIG5vdCBhc3N1bWUgYW55IHBhcnRpY3VsYXIgZGF0YQogIGluIHRoZSBmcmVlZCBhcmVhcykuCgpEYW5pZWwgKDkgU2VwdGVtYmVyIDIwMDYpCi0gTWljaGVsZSBCaW5pIGZpeGVkIGhvdyB0aGUgaG9zdG5hbWUgaXMgcHV0IGluIE5UTE0gcGFja2FnZXMuIEFzIHNlcnZlcnMKICBkb24ndCBleHBlY3QgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIHdlIG5lZWQgdG8gY3V0IHRoZW0gb2ZmIGF0IHRoZSBmaXJzdCBkb3QuCgotIFBldGVyIFN5bHZlc3RlciBjbGVhbmVkIHVwIGFuZCBmaXhlZCB0aGUgZ2V0c29ja25hbWUoKSB1c2VzIGluIGZ0cC5jLiBTb21lCiAgb2YgdGhlbSBjYW4gYmUgY29tcGxldGV0bHkgcmVtb3ZlZCB0aG91Z2guLi4KCkRhbmllbCAoNiBTZXB0ZW1iZXIgMjAwNikKLSBSYXZpIFByYXRhcCBhbmQgSSBoYXZlIGltcGxlbWVudGVkIEhUVFAgUGlwZWxpbmluZyBzdXBwb3J0LiBFbmFibGUgaXQgZm9yIGEKICBtdWx0aSBoYW5kbGUgdXNpbmcgQ1VSTE1PUFRfUElQRUxJTklORyBhbmQgYWxsIEhUVFAgY29ubmVjdGlvbnMgZG9uZSBvbiB0aGF0CiAgaGFuZGxlIHdpbGwgYmUgYXR0ZW1wdGVkIHRvIGdldCBwaXBlbGluZWQgaW5zdGVhZCBvZiBkb25lIGluIHBhcmFsbGVsbCBhcwogIHRoZXkgYXJlIHBlcmZvcm1lZCBvdGhlcndpc2UuCgogIEFzIGEgc2lkZS1lZmZlY3QgZnJvbSB0aGlzIHdvcmssIGNvbm5lY3Rpb25zIGFyZSBub3cgc2hhcmVkIGJldHdlZW4gYWxsIGVhc3kKICBoYW5kbGVzIHdpdGhpbiBhIG11bHRpIGhhbmRsZSwgc28gaWYgeW91IHVzZSBOIGVhc3kgaGFuZGxlcyBmb3IgdHJhbnNmZXJzLAogIGVhY2ggb2YgdGhlbSBjYW4gcGljayB1cCBhbmQgcmUtdXNlIGEgY29ubmVjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHVzZWQgYnkKICBhbnkgb2YgdGhlIGhhbmRsZXMsIGJlIGl0IHRoZSBzYW1lIG9yIG9uZSBvZiB0aGUgb3RoZXJzLgoKICBUaGlzIHNlcGFyYXRpb24gb2YgdGhlIHRpZ2h0IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbm5lY3Rpb25zIGFuZCBlYXN5CiAgaGFuZGxlcyBpcyBtb3N0IG5vdGljYWJsZSB3aGVuIHlvdSBjbG9zZSBlYXN5IGhhbmRsZXMgdGhhdCBoYXZlIGJlZW4gdXNlZCBpbgogIGEgbXVsdGkgaGFuZGxlIGFuZCBjaGVjayBhbW91bnQgb2YgdXNlZCBtZW1vcnkgb3Igd2F0Y2ggdGhlIGRlYnVnIG91dHB1dCwgYXMKICB0aGVyZSBhcmUgdGltZXMgd2hlbiBsaWJjdXJsIHdpbGwga2VlcCB0aGUgZWFzeSBoYW5kbGUgYXJvdW5kIGZvciBhIHdoaWxlCiAgbG9uZ2VyIHRvIGJlIGFibGUgdG8gY2xvc2UgaXQgcHJvcGVybHkuIExpa2UgZm9yIHNlbmRpbmcgUVVJVCB0byBjbG9zZSBkb3duCiAgYW4gRlRQIGNvbm5lY3Rpb24uCgogIFRoaXMgaXMgYSBtYWpvciBjaGFuZ2UuCiAgCkRhbmllbCAoNCBTZXB0ZW1iZXIgMjAwNikKLSBEbWl0cnkgUmVjaGtpbiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTU1MTQxMikgcHJvdmlkZWQgYQogIHBhdGNoIHRoYXQgd2hpbGUgbm90IGZpeGluZyB0aGluZ3MgdmVyeSBuaWNlbHksIGl0IGRvZXMgbWFrZSB0aGUgU09DS1M1CiAgcHJveHkgY29ubmVjdGlvbiBzbGlnaHRseSBiZXR0ZXIgYXMgaXQgbm93IGFja25vd2xlZGdlcyB0aGUgdGltZW91dCBmb3IKICBjb25uZWN0aW9uIGFuZCBpdCBubyBsb25nZXIgc2VnZmF1bHRzIGluIHRoZSBjYXNlIHdoZW4gU09DS1MgcmVxdWlyZXMKICBhdXRoZW50aWNhdGlvbiBhbmQgeW91IGRpZCBub3Qgc3BlY2lmeSB1c2VybmFtZTpwYXNzd29yZC4KCkRhbmllbCAoMzEgQXVndXN0IDIwMDYpCi0gRG1pdHJpeSBTZXJnZXlldiBmb3VuZCBhbmQgZml4ZWQgYSBtdWx0aSBpbnRlcmZhY2UgZmxhdyB3aGVuIHVzaW5nIGFzeW5jaAogIG5hbWUgcmVzb2x2ZXMuIEl0IGNvdWxkIGdldCBzdHVjayBpbiB0aGUgd3Jvbmcgc3RhdGUuCgpHaXNsZSAoMjkgQXVndXN0IDIwMDYpCi0gQWRkZWQgc3VwcG9ydCBmb3Igb3RoZXIgTVMtRE9TIGNvbXBpbGVycyAoZGVzaWRlcyBkamdwcCkuIEFsbCBNUy1ET1MKICBjb21waWxlciBub3cgdXNlcyB0aGUgc2FtZSBjb25maWcuZG9zIGZpbGUgKHJlbmFtZWQgdG8gY29uZmlnLmggYnkKICBtYWtlKS4gbGliY3VybCBub3cgYnVpbGRzIGZpbmUgdXNpbmcgV2F0Y29tIGFuZCBNZXRhd2FyZSdzIEhpZ2gtQwogIHVzaW5nIHRoZSBXYXR0LTMyIHRjcC9pcC1zdGFjay4KCkRhbmllbCAoMjkgQXVndXN0IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgYWRkZWQgQ1VSTE9QVF9TT0NLT1BURlVOQ1RJT04gYW5kIENVUkxPUFRfU09DS09QVERBVEEgdG8KICBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gc2V0IHRoZWlyIG93biBzb2NrZXQgb3B0aW9ucy4KCkRhbmllbCAoMjUgQXVndXN0IDIwMDYpCi0gQXJtZWwgQXNzZWxpbiByZXBvcnRlZCB0aGF0IHRoZSAncnVubmluZ19oYW5kbGVzJyBjb3VudGVyIHdhc24ndCB1cGRhdGVkCiAgcHJvcGVybHkgaWYgeW91IHJlbW92ZWQgYSAibGl2ZSIgaGFuZGxlIGZyb20gYSBtdWx0aSBoYW5kbGUgd2l0aAogIGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpLgoKRGFuaWVsICgyMiBBdWd1c3QgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIHJlbWFpbmluZyBtaXN0YWtlIGZyb20gdGhlIEF1Z3VzdCAxOSBUWVBFIGNoYW5nZS4KCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgQWxsb3dTZXJ2ZXJDb25uZWN0KCkgaW4gdGhlIEZUUAogIGNvZGUgd2hlbiBkb2luZyBwdXJlIGlwdjYgRVBSVCBjb25uZWN0aW9ucy4KCkRhbmllbCAoMTkgQXVndXN0IDIwMDYpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBBcm1lbCBBc3NlbGluLCB0aGUgRlRQIGNvZGUgbm8gbG9uZ2VyIHJlLWlzc3VlcyB0aGUgVFlQRQogIGNvbW1hbmQgb24gc3Vic2VxdWVudCByZXF1ZXN0cyBvbiBhIHJlLXVzZWQgY29ubmVjdGlvbiB1bmxlc3MgaXQgaGFzIHRvLgoKLSBBcm1lbCBBc3NlbGluIGZpeGVkIGEgY3Jhc2ggaW4gdGhlIEZUUCBjb2RlIHdoZW4gdXNpbmcgU0lOR0xFQ1dEIG1vZGUgYW5kCiAgZmlsZXMgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LgoKLSBBbmRyZXcgQmlnZ3MgcG9pbnRlZCBvdXQgYSAiRXhwZWN0OiAxMDAtY29udGludWUiIGZsYXcgd2hlcmUgbGliY3VybCBkaWRuJ3QKICBzZW5kIHRoZSB3aG9sZSByZXF1ZXN0IGF0IG9uY2UsIGV2ZW4gdGhvdWdoIHRoZSBFeHBlY3Q6IGhlYWRlciB3YXMgZGlzYWJsZWQKICBieSB0aGUgYXBwbGljYXRpb24uIEFuIGVmZmVjdCBvZiB0aGlzIGNoYW5nZSBpcyBhbHNvIHRoYXQgc21hbGwgKDwgMTAyNAogIGJ5dGVzKSBQT1NUcyBhcmUgbm93IGFsd2F5cyBzZW50IHdpdGhvdXQgRXhwZWN0OiBoZWFkZXIgc2luY2Ugd2UgZGVlbSBpdAogIG1vcmUgY29zdGx5IHRvIGJvdGhlciBhYm91dCB0aGF0IHRoYW4gdGhlIHJpc2sgdGhhdCB3ZSBzZW5kIHRoZSBkYXRhIGluCiAgdmFpbi4KCkRhbmllbCAoOSBBdWd1c3QgMjAwNikKLSBBcm1lbCBBc3NlbGluIG1hZGUgdGhlIENVUkxPUFRfUFJFUVVPVEUgb3B0aW9uIHdvcmsgZmluZSBldmVuIHdoZW4KICBDVVJMT1BUX05PQk9EWSBpcyBzZXQgdHJ1ZS4gUFJFUVVPVEUgaXMgdGhlbiBydW4gcm91Z2hseSBhdCB0aGUgc2FtZSBwbGFjZQogIGluIHRoZSBjb21tYW5kIHNlcXVlbmNlIGFzIGl0IHdvdWxkIGhhdmUgcnVuIGlmIHRoZXJlIHdvdWxkJ3ZlIGJlZW4gYQogIHRyYW5zZmVyLgoKRGFuaWVsICg4IEF1Z3VzdCAyMDA2KQotIEZpeGVkIGEgZmxhdyBpbiB0aGUgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiB0cmVhdG1lbnQuIElmIHlvdSBkaWQgdHdvIFBPU1RzCiAgb24gYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gYW5kIGFsbG93ZWQgdGhlIGZpcnN0IHRvIHVzZSB0aGF0IGhlYWRlciwgeW91CiAgY291bGQgbm90IGRpc2FibGUgaXQgZm9yIHRoZSBzZWNvbmQgcmVxdWVzdC4KCkRhbmllbCAoNyBBdWd1c3QgMjAwNikKLSBEb21lbmljbyBBbmRyZW9sZm91bmQgYSBxdWljayBidWlsZCBlcnJvciB3aGljaCBoYXBwZW5lZCBiZWNhdXNlCiAgc3JjL2NvbmZpZy5oLmluIHdhcyBub3QgYSBwcm9wZXIgZHVwbGNhdGUgb2YgbGliL2NvbmZpZy5oLmluIHdoaWNoIGl0CiAgc2hvdWxkJ3ZlIGJlZW4gYW5kIHRoaXMgd2FzIGR1ZSB0byB0aGUgbWFrZXRneiBzY3JpcHQgbm90IGRvaW5nIHRoZSBjcAogIHByb3Blcmx5LgoKVmVyc2lvbiA3LjE1LjUgKDcgQXVndXN0IDIwMDYpCgpEYW5pZWwgKDIgQXVndXN0IDIwMDYpCi0gTWFyayBMZW50Y3puZXIgZml4ZWQgaG93IGxpYmN1cmwgd2FzIG5vdCBwcm9wZXJseSBkb2luZyBjaHVua2VkIGVuY29kaW5nCiAgaWYgdGhlIGhlYWRlciAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIHdhcyBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uLgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1MzE4MzgKCkRhbmllbCAoMSBBdWd1c3QgMjAwNikKLSBNYWNpZWogS2FycGl1ayBmaXhlZCBhIGNyYXNoIHRoYXQgd291bGQgb2NjdXIgaWYgd2UgcGFzc2VkIEN1cmxfc3RyZXJyb3IoKQogIGFuIHVua25vd24gZXJyb3IgbnVtYmVyIG9uIGdsaWJjIHN5c3RlbXMuCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTUzMjI4OQoKRGFuaWVsICgzMSBKdWx5IDIwMDYpCi0gKkFMRVJUKiBjdXJsX211bHRpX3NvY2tldCgpIGFuZCBjdXJsX211bHRpX3NvY2tldF9hbGwoKSBnb3QgbW9kaWZpZWQKICBwcm90b3R5cGVzOiB0aGV5IGJvdGggbm93IHByb3ZpZGUgdGhlIG51bWJlciBvZiBydW5uaW5nIGhhbmRsZXMgYmFjayB0byB0aGUKICBjYWxsaW5nIGZ1bmN0aW9uLiBJdCBtYWtlcyB0aGUgZnVuY3Rpb25zIHJlc2VtYmxlIHRoZSBnb29kIG9sZAogIGN1cmxfbXVsdGlfcGVyZm9ybSgpIG1vcmUgYW5kIHByb3ZpZGVzIGEgbmljZSB3YXkgdG8ga25vdyB3aGVuIHRoZSBtdWx0aQogIGhhbmRsZSBnb2VzIGVtcHR5LgoKICBBTEVSVDI6IGRvbid0IHVzZSB0aGUgY3VybF9tdWx0aV9zb2NrZXQqKCkgZnVuY3Rpb25hbGl0eSBpbiBhbnl0aGluZwogIHByb2R1Y3Rpb24tbGlrZSB1bnRpbCBJIHNheSBpdCdzIHNvbWV3aGF0IHNldHRsZWQsIGFzIEkgc3VzcGVjdCB0aGVyZSBtaWdodAogIGJlIHNvbWUgZnVydGhlciBBUEkgY2hhbmdlcyBiZWZvcmUgSSdtIGRvbmUuLi4KCkRhbmllbCAoMjggSnVseSAyMDA2KQotIFl2ZXMgTGVqZXVuZSBmaXhlZCBzbyB0aGF0IHJlcGxhY2luZyBDb250ZW50LVR5cGU6IHdoZW4gZG9pbmcgbXVsdGlwYXJ0CiAgZm9ybXBvc3RzIHdvcmsgZXhhY3RseSB0aGUgd2F5IHlvdSB3YW50IGl0IChhbmQgdGhlIHdheSB5b3UnZCBhc3N1bWUgaXQKICB3b3JrcykuCgpEYW5pZWwgKDI3IEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBhZGRlZCAtLWZ0cC1zc2wtcmVxZCB3aGljaCBtYWtlcyBjdXJsICpyZXF1aXJlKiBTU0wgZm9yIGJvdGgKICBjb250cm9sIGFuZCBkYXRhIGNvbm5lY3Rpb24sIGFzIHRoZSBleGlzdGluZyAtLWZ0cC1zc2wgb3B0aW9uIG9ubHkgcmVxdWVzdHMKICBpdC4KCi0gW0hpcGVyLXJlbGF0ZWQgd29ya10gQWRkZWQgYSBmdW5jdGlvbiBjYWxsZWQgY3VybF9tdWx0aV9hc3NpZ24oKSB0aGF0IHdpbGwKICBzZXQgYSBwcml2YXRlIHBvaW50ZXIgYWRkZWQgdG8gdGhlIGludGVybmFsIGxpYmN1cmwgaGFzaCB0YWJsZSBmb3IgdGhlCiAgcGFydGljdWxhciBzb2NrZXQgcGFzc2VkIGluIHRvIHRoaXMgZnVuY3Rpb246CgogIENVUkxNY29kZSBjdXJsX211bHRpX2Fzc2lnbihDVVJMTSAqbXVsdGlfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX3NvY2tldF90IHNvY2tmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc29ja3ApOwoKICAnc29ja3AnIGJlaW5nIGEgY3VzdG9tIHBvaW50ZXIgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGgKICB0aGlzIHNvY2tldC4gVGhlIHNvY2tldCBoYXMgdG8gYmUgYWxyZWFkeSBleGlzdGluZyBhbmQgaW4tdXNlIGJ5IGxpYmN1cmwsCiAgbGlrZSBoYXZpbmcgYWxyZWFkeSBjYWxsZWQgdGhlIGNhbGxiYWNrIHRlbGxpbmcgYWJvdXQgaXRzIGV4aXN0YW5jZS4KCiAgVGhlIHNldCBoYXNocCBwb2ludGVyIHdpbGwgdGhlbiBiZSBwYXNzZWQgb24gdG8gdGhlIGNhbGxiYWNrIGluIHVwY29taW5nCiAgY2FsbHMgd2hlbiB0aGlzIHNhbWUgc29ja2V0IGlzIHVzZWQgKGluIHRoZSBicmFuZCBuZXcgJ3NvY2tldHAnIGFyZ3VtZW50KS4KCkRhbmllbCAoMjYgSnVseSAyMDA2KQotIERhbiBOZWxzb24gYWRkZWQgdGhlIENVUkxPUFRfRlRQX0FMVEVSTkFUSVZFX1RPX1VTRVIgbGliY3VybCBvcHRpb24gYW5kIGN1cmwKICB0b29sIG9wdGlvbiBuYW1lZCAtLWZ0cC1hbHRlcm5hdGl2ZS10by11c2VyLiBJdCBwcm92aWRlcyBhIG1lYW4gdG8gc2VuZCBhCiAgcGFydGljdWxhciBjb21tYW5kIGlmIHRoZSBub3JtYWwgVVNFUi9QQVNTIGFwcHJvYWNoIGZhaWxzLgoKLSBNaWNoYWVsIEplcnJpcyBhZGRlZCBtYWdpYyB0aGF0IGJ1aWxkcyBsaWIvY3VybGxpYi52Y3Byb2ogYXV0b21hdGljYWxseSBmb3IKICBuZXdlciBNU1ZDLgoKRGFuaWVsICgyNSBKdWx5IDIwMDYpCi0gR2VvcmcgSG9ybiBtYWRlIHRoZSB0cmFuc2ZlciB0aW1lb3V0IGVycm9yIG1lc3NhZ2UgaW5jbHVkZSBtb3JlIGRldGFpbHMuCgpEYW5pZWwgKDIwIEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIGJ1aWxkIGVycm9yIHdoZW4gYnVpbGRpbmcgbGliY3VybCB3aXRoIEhUVFAgZGlzYWJsZWQsCiAgcHJvYmxlbSBhZGRlZCB3aXRoIHRoZSBjdXJsX2Zvcm1nZXQoKSBwYXRjaC4KCkRhbmllbCAoMTcgSnVseSAyMDA2KQotIEphcmkgU3VuZGVsbCBkaWQgc29tZSBleGNlbGxlbnQgcmVzZWFyY2ggYW5kIGJ1ZyB0cmFja2luZywgZmlndXJlZCBvdXQgdGhhdAogIHdlIGRpZCB3cm9uZyBhbmQgcGF0Y2hlZCBpdDogV2hlbiBub2RlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgc3BsYXkgdHJlZSwKICBhbmQgd2UgZGlkbid0IHByb3Blcmx5IHJlbW92ZSBpdCBmcm9tIHRoZSBzcGxheSB0cmVlIHdoZW4gYW4gZWFzeSBoYW5kbGUgd2FzCiAgcmVtb3ZlZCBmcm9tIGEgbXVsdGkgc3RhY2sgYW5kIHRodXMgd2UgY291bGQgd3JvbmdseSBsZWF2ZSBhIG5vZGUgaW4gdGhlCiAgc3BsYXkgdHJlZSBwb2ludGluZyB0byAoYmFkKSBtZW1vcnkuCgpEYW5pZWwgKDE0IEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIGZsYXcgd2hlcmUgdGhlIENSTEYgY291bnRlciB3YXNuJ3QgcHJvcGVybHkgY2xlYXJlZAogIGZvciBGVFAgQVNDSUkgdHJhbnNmZXJzLgoKRGFuaWVsICg4IEp1bHkgMjAwNikKLSBBdGVzIEdvcmFsIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCdzIGNvb2tpZSBwYXJzZXIgZGlkIGNhc2UgaW5zZW5zaXRpdmUKICBzdHJpbmcgY29tcGFyaXNvbnMgb24gdGhlIHBhdGggd2hpY2ggaXMgaW5jb3JyZWN0IGFuZCBwcm92aWRlZCBhIHBhdGNoIHRoYXQKICBmaXhlcyB0aGlzLiBJIGVkaXRlZCB0ZXN0IGNhc2UgOCB0byBpbmNsdWRlIGRldGFpbHMgdGhhdCB0ZXN0IGZvciB0aGlzLgoKLSBJbmdtYXIgUnVuZ2UgcHJvdmlkZWQgYSBzb3VyY2Ugc25pcHBldCB0aGF0IGNhdXNlZCBhIGNyYXNoLiBUaGUgcmVhc29uIGZvcgogIHRoZSBjcmFzaCB3YXMgdGhhdCBsaWJjdXJsIGludGVybmFsbHkgd2FzIGEgYml0IGNvbmZ1c2VkIGFib3V0IHdobyBvd25lZCB0aGUKICBETlMgY2FjaGUgYXQgYWxsIHRpbWVzIHNvIGlmIHlvdSBjcmVhdGVkIGFuIGVhc3kgaGFuZGxlIHRoYXQgdXNlcyBhIHNoYXJlZAogIEROUyBjYWNoZSBhbmQgYWRkZWQgdGhhdCB0byBhIG11bHRpIGhhbmRsZSBpdCB3b3VsZCBjcmFzaC4gTm93IHdlIGtlZXAgbW9yZQogIGNhcmVmdWwgaW50ZXJuYWwgdHJhY2sgb2YgZXhhY3RseSB3aGF0IGtpbmQgb2YgRE5TIGNhY2hlIGVhY2ggZWFzeSBoYW5kbGUKICB1c2VzOiBOb25lLCBQcml2YXRlIChhbGxvY2F0ZWQgZm9yIGFuZCB1c2VkIG9ubHkgYnkgdGhpcyBzaW5nbGUgaGFuZGxlKSwKICBTaGFyZWQgKHBvaW50cyB0byBhIGNhY2hlIGhlbGQgYnkgYSBzaGFyZWQgb2JqZWN0KSwgR2xvYmFsIChwb2ludHMgdG8gdGhlCiAgZ2xvYmFsIGNhY2hlKSBvciBNdWx0aSAocG9pbnRzIHRvIHRoZSBjYWNoZSB3aXRoaW4gdGhlIG11bHRpIGhhbmRsZSB0aGF0IGlzCiAgYXV0b21hdGljYWxseSBzaGFyZWQgYmV0d2VlbiBhbGwgZWFzeSBoYW5kbGVzIHRoYXQgYXJlIGFkZGVkIHdpdGggcHJpdmF0ZQogIGNhY2hlcykuCgpEYW5pZWwgKDQgSnVseSAyMDA2KQotIFRvc2hpeXVraSBNYWV6YXdhIGZpeGVkIGEgcHJvYmxlbSB3aGVyZSB5b3UgY291bGRuJ3Qgb3ZlcnJpZGUgdGhlCiAgUHJveHktQ29ubmVjdGlvbjogaGVhZGVyIHdoZW4gdXNpbmcgYSBwcm94eSBhbmQgbm90IGRvaW5nIENPTk5FQ1QuCgpEYW5pZWwgKDI0IEp1bmUgMjAwNikKLSBNaWNoYWVsIFdhbGxuZXIgYWRkZWQgY3VybF9mb3JtZ2V0KCksIHdoaWNoIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBleHRyYWN0CiAgKHNlcmlhbGlzZSkgYSBwcmV2aW91c2x5IGJ1aWx0IGZvcm1wb3N0IChhcyB3aXRoIGN1cmxfZm9ybWFkZCgpKS4KCkRhbmllbCAoMjMgSnVuZSAyMDA2KQotIEFydmUgS251ZHNlbiBmb3VuZCBhIGZsYXcgaW4gY3VybF9tdWx0aV9mZHNldCgpIGZvciBzeXN0ZW1zIHdoZXJlCiAgY3VybF9zb2NrZXRfdCBpcyB1bnNpZ25lZCAobGlrZSBXaW5kb3dzKSB0aGF0IGNvdWxkIGNhdXNlIGl0IHRvIHdyb25nbHkKICByZXR1cm4gYSBtYXggZmQgb2YgLTEuCgpEYW5pZWwgKDIwIEp1bmUgMjAwNikKLSBQZXRlciBTaWx2YSBpbnRyb2R1Y2VkIENVUkxPUFRfTUFYX1NFTkRfU1BFRURfTEFSR0UgYW5kCiAgQ1VSTE9QVF9NQVhfUkVDVl9TUEVFRF9MQVJHRSB0aGF0IGxpbWl0IHRoYSBtYXhpbXVtIHJhdGUgbGliY3VybCBpcyBhbGxvd2VkCiAgdG8gc2VuZCBvciByZWNlaXZlIGRhdGEuIFRoaXMga2luZCBvZiBhZGRzIHRoZSB0aGUgY29tbWFuZCBsaW5lIHRvb2wncwogIG9wdGlvbiAtLWxpbWl0LXJhdGUgdG8gdGhlIGxpYnJhcnkuCgogIFRoZSByYXRlIGxpbWl0aW5nIGxvZ2ljIGluIHRoZSBjdXJsIGFwcCBpcyBub3cgcmVtb3ZlZCBhbmQgaXMgaW5zdGVhZAogIHByb3ZpZGVkIGJ5IGxpYmN1cmwgaXRzZWxmLiBUcmFuc2ZlciByYXRlIGxpbWl0aW5nIHdpbGwgbm93IGFsc28gd29yayBmb3IgLWQKICBhbmQgLUYsIHdoaWNoIGl0IGRpZG4ndCBiZWZvcmUuCgpEYW5pZWwgKDE5IEp1bmUgMjAwNikKLSBNYWRlIC1LIG9uIGEgZmlsZSB0aGF0IGNvdWxkbid0IGJlIHJlYWQgY2F1c2UgYSB3YXJuaW5nIHRvIGJlIGRpc3BsYXllZC4KCkRhbmllbCAoMTMgSnVuZSAyMDA2KQotIERhbiBGYW5kcmljaCBpbXBsZW1lbnRlZCAtLWVuYWJsZS1oaWRkZW4tc3ltYm9scyBjb25maWd1cmUgb3B0aW9uIHRvIGVuYWJsZQogIC1mdmlzaWJpbGl0eT1oaWRkZW4gb24gZ2NjID49IDQuMC4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgbGliY3VybAogIGJpbmFyeSBhbmQgc3BlZWRzIHVwIGR5bmFtaWMgbGlua2luZyBieSBoaWRpbmcgYWxsIHRoZSBpbnRlcm5hbCBzeW1ib2xzIGZyb20KICB0aGUgc3ltYm9sIHRhYmxlLgoKVmVyc2lvbiA3LjE1LjQgKDEyIEp1bmUgMjAwNikKCkRhbmllbCAoOCBKdW5lIDIwMDYpCi0gQnJpYW4gRGVzc2VudCBmaXhlZCB0aGUgY29kZSBmb3IgY3lnd2luIGluIHRocmVlIGRpc3RpbmN0IHdheXM6CgogIFRoZSBmaXJzdCBtb2RpZmllcyB7bGliLHNyY30vc2V0dXAuaCB0byBub3QgaW5jbHVkZSB0aGUgd2luc29jayBoZWFkZXJzCiAgdW5kZXIgQ3lnd2luLiAgVGhpcyBmaXhlcyB0aGUgcmVwb3J0ZWQgYnVpbGQgcHJvYmxlbS4gIEN5Z3dpbiBhdHRlbXB0cyBhcwogIG11Y2ggYXMgcG9zc2libGUgdG8gZW11bGF0ZSBhIHBvc2l4IGVudmlyb25tZW50IHVuZGVyIFdpbmRvd3MuICBUaGlzIG1lYW5zCiAgdGhhdCBXSU4zMiBpcyAqbm90KiAjZGVmaW5lZCBhbmQgKHRvIHRoZSBleHRlbnQgcG9zc2libGUpIGV2ZXJ5dGhpbmcgaXMgZG9uZQogIGFzIGl0IHdvdWxkIGJlIG9uIGEgKml4IHR5cGUgc3lzdGVtLiAgVGh1cyA8c3lzL3NvY2tldC5oPiBpcyB0aGUgcHJvcGVyCiAgaW5jbHVkZSwgYW5kIGV2ZW4gdGhvdWdoIHdpbnNvY2syLmggaXMgcHJlc2VudCwgaW5jbHVkaW5nIGl0IGp1c3QgaW50cm9kdWNlcwogIGEgd2hvbGUgYnVuY2ggb2YgaW5jb21wYXRpYmxlIHNvY2tldCBBUEkgc3R1ZmYuCgogIFRoZSBzZWNvbmQgaXMgYSBwYXRjaCBJJ3ZlIGluY2x1ZGVkIGluIHRoZSBDeWd3aW4gYmluYXJ5IHBhY2thZ2VzIGZvciBhCiAgd2hpbGUuICBJdCBza2lwcyB0d28gdW5uZWNlc3NhcnkgbGlicmFyeSBjaGVja3MgKC1sd2lubW0gYW5kIC1sZ2RpMzIpLiAgVGhlCiAgY2hlY2tzIGFyZSBpbm5vY3VvdXMgYW5kIHRoZXkgZG8gc3VjY2VlZCwgYnV0IHRoZXkgcG9sbHV0ZSBMSUJTIHdpdGgKICB1bm5lY2Vzc2FyeSBzdHVmZiB3aGljaCBnZXRzIHJlY29yZGVkIGFzIHN1Y2ggaW4gdGhlIGxpYmN1cmwubGEgZmlsZSwgd2hpY2gKICBicmluZ3MgdGhlbSBpbnRvIHRoZSBidWlsZCBvZiBhbnkgbGliY3VybC1kb3duc3RyZWFtLiAgQXMgZmFyIGFzIEkga25vdwogIHRoZXNlIGxpYnMgYXJlIHJlYWxseSBvbmx5IG5lY2Vzc2FyeSBmb3IgbWluZ3csIHNvIGFsdGVybmF0aXZlbHkgdGhleSBjb3VsZAogIGJlIGRlc2lnbmVkIHRvIG9ubHkgcnVuIGlmICRob3N0IG1hdGNoZXMgKi0qLW1pbmd3KiBidXQgSSB0b29rIHRoZSBzYWZlcgogIHJvdXRlIG9mIHNraXBwaW5nIHRoZW0gZm9yICotKi1jeWd3aW4qLgoKICBUaGUgdGhpcmQgcGF0Y2ggcmVwbGFjZXMgYWxsIHVzZXMgb2YgdGhlIGFuY2llbnQgYW5kIG9ic29sZXRlIF9fQ1lHV0lOMzJfXwogIHdpdGggX19DWUdXSU5fXy4gUmVmOiA8aHR0cDovL2N5Z3dpbi5jb20vbWwvY3lnd2luLzIwMDMtMDkvbXNnMDE1MjAuaHRtbD4uCgpEYW5pZWwgKDcgSnVuZSAyMDA2KQotIE1pa2FlbCBTZW5uZXJob2xtIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhZGRlZCBOVExNMiBzZXNzaW9uIHJlc3BvbnNlIHN1cHBvcnQKICB0byBsaWJjdXJsLiBUaGUgMjEgTlRMTSB0ZXN0IGNhc2VzIHdlcmUgYWdhaW4gbW9kaWZpZWQgdG8gY29tcGx5Li4uCgpEYW5pZWwgKDI3IE1heSAyMDA2KQotINNzY2FyIE1vcmFsZXMgVml28yB1cGRhdGVkIHRoZSBsaWJjdXJsLmZyYW1ld29yay5tYWtlIGZpbGUuCgpEYW5pZWwgKDI2IE1heSAyMDA2KQotIE9sYWYgU3T8YmVuIGZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIERpZ2VzdCBhdXRoZW50aWNhdGlvbiB3aXRoIG1kNS1zZXNzIHRvCiAgZmFpbC4gV2hlbiB1c2luZyB0aGUgbWQ1LXNlc3MsIHRoZSByZXN1bHQgd2FzIG5vdCBNZDUgZW5jb2RlZCBhbmQgQmFzZTY0CiAgdHJhbnNmb3JtZWQuCgpEYW5pZWwgKDI1IE1heSAyMDA2KQotIE1pY2hhZWwgV2FsbG5lciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWxsb3dzICJTRVNTIiB0byBiZSBzZXQgd2l0aAogIENVUkxPUFRfQ09PS0lFTElTVCwgd2hpY2ggdGhlbiBtYWtlcyBhbGwgc2Vzc2lvbiBjb29raWVzIGdldCBjbGVhcmVkLgoKRGFuaWVsICgyNCBNYXkgMjAwNikKLSBUb3IgQXJudHNlbiBtYWRlIHRlc3QgMjcxIHJ1biBmaW5lIGFnYWluIHNpbmNlIHRoZSBURlRQIHBhdGggZml4LgoKRGFuaWVsICgyMyBNYXkgMjAwNikKLSBNYXJ0aW4gTWljaGxtYXlyIGZpbGVkIGRlYmlhbiBidWcgcmVwb3J0ICMzNjc5NTQsIGJ1dCB0aGUgc2FtZSBlcnJvciBhbHNvCiAgc2hvd2VkIHVwIGluIHRoZSBhdXRvYnVpbGRzLiBJdCBzZWVtcyBhIHJhdGhlciBsb25nLXNpbmNlIGludHJvZHVjZWQgc2hlbGwKICBzY3JpcHQgZmxhdyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBzdWRkZW5seSB3YXMgZGV0ZWN0ZWQgYnkgdGhlIGJhc2gKICB2ZXJzaW9uIGluIERlYmlhbiBVbnN0YWJsZS4gSXQgaGFkIHByZXZpb3VzbHkgcGFzc2VkIHVuZGV0ZWN0ZWQgYnkgYWxsCiAgc2hlbGxzIHVzZWQgc28gZmFyLi4uCgotIERhdmlkIE1jQ3JlZWR5IHVwZGF0ZWQgbGliL2NvbmZpZy10cGYuaAoKRGFuaWVsICgxMSBNYXkgMjAwNikKLSBGaXhlZCB0aGUgY29uZmlndXJlJ3MgY2hlY2sgZm9yIG9sZC1zdHlsZSBTU0xlYXkgaGVhZGVycyBzaW5jZSBJIGZlbGwgb3ZlciBhCiAgY2FzZSB3aXRoIGEgZHVwbGljYXRlIGZpbGUgbmFtZSAoYSBrcmI0IGltcGxlbWVudGF0aW9uIHdpdGggYW4gZXJyLmgKICBmaWxlKS4gSSBjb252ZXJ0ZWQgdGhlIGNoZWNrIHRvIG1hbnVhbGx5IG1ha2Ugc3VyZSB0aHJlZSBvZiB0aGUgaGVhZGVycyBhcmUKICBwcmVzZW50IGJlZm9yZSBjb25zaWRlcmluZyB0aGVtIGZpbmUuCgotIERhdmlkIE1jQ3JlZWR5IHByb3ZpZGVkIGEgZml4IGZvciBDVVJMSU5GT19MQVNUU09DS0VUIHRoYXQgZG9lcyBleHRlbmRlZAogIGNoZWNrcyBvbiB0aGUgdG8tYmUtcmV0dXJuZWQgc29ja2V0IHRvIG1ha2Ugc3VyZSBpdCB0cnVseSBzZWVtcyB0byBiZSBhbGl2ZQogIGFuZCB3ZWxsLiBGb3IgU1NMIGNvbm5lY3Rpb24gaXQgKG9ubHkpIHVzZXMgT3BlblNTTCBmdW5jdGlvbnMuCgpEYW5pZWwgKDEwIE1heSAyMDA2KQotIEZpeGVkIERJQ1QgaW4gdHdvIGFzcGVjdHM6CgogIDEgLSBhbGxvdyBwcm9wZXJseSBVUkwtZXNjYXBlZCB3b3JkcywgbGlrZSB1c2luZyAlMjAgZm9yIHNwYWNlcwoKICAyIC0gcHJvcGVybHkgZXNjYXBlIGNlcnRhaW4gbGV0dGVycyB3aXRoaW4gYSB3b3JkIHRvIGNvbXBseSB0byB0aGUgUkZDMjIyOQoKRGFuaWVsICg5IE1heSAyMDA2KQotIEFuZHJlYXMgTnRhZmxvcyByZXBvcnRlZCBhIGJ1ZyBpbiBsaWJjdXJsLm00OiBXaGVuIGNvbmZpZ3VyaW5nIG15IEdOVQogIGF1dG90b29scyBwcm9qZWN0LCB3aGljaCBvcHRpb25hbGx5IChkZWZhdWx0PXllcykgdXNlcyBsaWJjdXJsIG9uIGEgc3lzdGVtCiAgd2l0aG91dCBhICh1c2FibGUpIGxpYmN1cmwgaW5zdGFsbGF0aW9uLCBidXQgbm90IHNwZWNpZnlpbmcKICBgLS13aXRob3V0LWxpYmN1cmwnLCBjb25maWd1cmUgZGV0ZXJtaW5lcyBjb3JyZWN0bHkgdGhhdCBubyBsaWJjdXJsIGlzCiAgYXZhaWxhYmxlLCBob3dldmVyLCB0aGUgTElCQ1VSTCB2YXJpYWJsZSBnZXRzIGV4cGFuZGVkIHRvIGBMSUJDVVJMID0gLWxjdXJsJwogIGluIHRoZSByZXN1bHRpbmcgTWFrZWZpbGVzLgoKICBEYXZpZCBTaGF3IGZpeGVkIHRoZSBmbGF3LgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpeGVkIHR3byBwcm9ibGVtcyBpbiB0aGUgcmVjZW50bHkgYWRkZWQgbm9uLWJsb2NraW5nIFNTTAogIGNvbm5lY3RzLiBUaGUgc3RhdGUgbWFjaGluZSB3YXMgbm90IHJlc2V0IHByb3Blcmx5IHNvIHRoYXQgc3Vic2VxdWVudAogIGNvbm5lY3RzIHVzaW5nIHRoZSBzYW1lIGhhbmRsZSB3b3VsZCBmYWlsLCBhbmQgdGhlcmUgd2VyZSB0d28gbWVtb3J5IGxlYWtzLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiB5b3UgYWRkZWQgYW4gZWFzeSBoYW5kbGUgdG8gYQogIG11bHRpIHN0YWNrIGFuZCB0aGF0IGVhc3kgaGFuZGxlIGhhZCBhbHJlYWR5IGJlZW4gdXNlZCB0byBkbyBvbmUgb3IgbW9yZQogIGVhc3kgaW50ZXJmYWNlIHRyYW5zZmVycywgYXMgdGhlbiB0aGUgY29kZSB0aHJldyBhd2F5IHRoZSBwcmV2aW91c2x5IHVzZWQKICBETlMgY2FjaGUgd2l0aG91dCBwcm9wZXJseSBmcmVlaW5nIGl0LgoKRGFuaWVsICg4IE1heSAyMDA2KQotIERhbiBGYW5kcmljaCB3ZW50IG92ZXIgdGhlIFRGVFAgY29kZSBhbmQgaGUgcG9pbnRlZCBvdXQgYW5kIGZpeGVkIG51bWVyb3VzCiAgcHJvYmxlbXM6CgogICogVGhlIHJlY2VpdmVkIGZpbGUgaXMgY29ycnVwdGVkIHdoZW4gYSBwYWNrZXQgaXMgbG9zdCBhbmQgcmV0cmFuc21pdHRlZAogICAgKHRoaXMgaXMgYSBzZXJpb3VzIHByb2JsZW0hKQoKICAqIFRyYW5zbWl0dGluZyBhIGZpbGUgYWJvcnRzIGlmIGEgYmxvY2sgaXMgbG9zdCBhbmQgcmV0cmFuc21pdHRlZAoKICAqIERhdGEgaXMgc3RvcmVkIGluIHRoZSB3cm9uZyBsb2NhdGlvbiBpbiB0aGUgYnVmZmVyIGZvciB1cGxvYWRzLCBzbyB1cGxvYWRzCiAgICBhbHdheXMgZmFpbCAoSSBkb24ndCBzZWUgaG93IGl0IGNvdWxkIGhhdmUgZXZlciB3b3JrZWQsIGJ1dCBpdCBkaWQgb24geDg2CiAgICBhdCBsZWFzdCkKCiAgKiBBIG51bWJlciBvZiBjYWxscyBhcmUgbWFkZSB0byBzdHJlcnJvciBpbnN0ZWFkIG9mIEN1cmxfc3RyZXJyb3IsIG1ha2luZwogICAgdGhlIGNvZGUgbm90IHRocmVhZCBzYWZlCgogICogVGhlcmUgYXJlIHJlZmVyZW5jZXMgdG8gZXJybm8gaW5zdGVhZCBvZiBDdXJsX3NvY2tlcnJubygpLCBjYXVzaW5nCiAgICBpbmNvcnJlY3QgZXJyb3IgbWVzc2FnZXMgb24gV2luZG93cwoKICAqIFRoZSBmaWxlIG5hbWUgaW5jbHVkZXMgYSBsZWFkaW5nIC8gd2hpY2ggdmlvbGF0ZXMgUkZDMzYxNy4gRG9pbmcgc29tZXRoaW5nCiAgICBzaW1pbGFyIHRvIGZ0cCwgd2hlcmUgdHdvIHNsYXNoZXMgYWZ0ZXIgdGhlIGhvc3QgbmFtZSBtZWFucyBhbiBhYnNvbHV0ZQogICAgcmVmZXJlbmNlIHNlZW1zIGEgcmVhc29uYWJsZSBleHRlbnNpb24gdG8gZml4IHRoaXMuCgogICogRmFpbHVyZXMgaW4gRUJDRElDIGNvbnZlcnNpb24gYXJlIG5vdCBwcm9wYWdhdGVkIHVwIHRvIHRoZSBjYWxsZXIgYnV0IGFyZQogICAgc2lsZW50bHkgaWdub3JlZAoKLSBGaXhlZCBrbm93biBidWcgIzI4LiBUaGUgVEZUUCBjb2RlIG5vIGxvbmdlciBhc3N1bWVzIGEgcGFja2VkIHN0cnVjdCBhbmQKICB0aHVzIHdvcmtzIHJlbGlhYmx5IG9uIG1vcmUgcGxhdGZvcm1zLgoKRGFuaWVsICg1IE1heSAyMDA2KQotIFJvbGFuZCBCbG9tIGZpbGVkIGJ1ZyByZXBvcnQgIzE0ODEyMTcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQ4MTIxNyksIHdpdGggZm9sbG93LXVwcyBieSBNaWNoZWxlCiAgQmluaSBhbmQgRGF2aWQgQnlyb24uIGxpYmN1cmwgcHJldmlvdXNseSB3cm9uZ2x5IHVzZWQgR2V0TGFzdEVycm9yKCkgb24KICB3aW5kb3dzIHRvIGdldCBlcnJvciBkZXRhaWxzIGFmdGVyIHNvY2tldC1yZWxhdGVkIGZ1bmN0aW9uIGNhbGxzLCB3aGVuIGl0CiAgcmVhbGx5IHNob3VsZCB1c2UgV1NBR2V0TGFzdEVycm9yKCkgaW5zdGVhZC4KCiAgV2hlbiBjaGFuZ2luZyB0byB0aGlzLCB0aGUgZm9ybWVyIGZ1bmN0aW9uIEN1cmxfb3VyZXJybm8oKSBpcyBub3cgaW5zdGVhZAogIGNhbGxlZCBDdXJsX3NvY2tlcnJubygpIGFzIGl0IGlzIG5lY2Vzc2FyeSB0byBvbmx5IHVzZSBpdCB0byBnZXQgZXJybm8gZnJvbQogIHNvY2tldC1yZWxhdGVkIGZ1bmN0aW9ucyBhcyBvdGhlcndpc2UgaXQgd29uJ3Qgd29yayBhcyBpbnRlbmRlZCBvbiBXaW5kb3dzLgoKRGFuaWVsICg0IE1heSAyMDA2KQotIE1hcmsgRWljaGluIHN1Ym1pdHRlZCBidWcgcmVwb3J0ICMxNDgwODIxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0ODA4MjEpIEhlIGZvdW5kIGFuZCBpZGVudGlmaWVkIGEKICBwcm9ibGVtIHdpdGggaG93IGxpYmN1cmwgZGVhbHQgd2l0aCBHbnVUTFMgYW5kIGEgY2FzZSB3aGVyZSBnbnV0bHMgcmV0dXJuZWQKICBHTlVUTFNfRV9BR0FJTiBpbmRpY2F0aW5nIGl0IHdvdWxkIGJsb2NrLiBJdCB3b3VsZCB0aGVuIHJldHVybiBhbiB1bmV4cGVjdGVkCiAgcmV0dXJuIGNvZGUsIG1ha2luZyBDdXJsX3NzbF9zZW5kKCkgY29uZnVzZSB0aGUgdXBwZXIgbGF5ZXIgLSBjYXVzaW5nIHJhbmRvbQogIDI4IGJ5dGVzIHRyYXNoIGRhdGEgdG8gZ2V0IGluc2VydGVkIGluIHRoZSB0cmFuc2ZlcmVkIHN0cmVhbS4KCiAgVGhlIHByb3BlciBmaXggd2FzIHRvIG1ha2UgdGhlIEN1cmxfZ3Rsc19zZW5kKCkgZnVuY3Rpb24gcmV0dXJuIHRoZSBwcm9wZXIKICByZXR1cm4gY29kZXMgdGhhdCB0aGUgY2FsbGVycyB3b3VsZCBleHBlY3QuIFRoZSBDdXJsX29zc2xfc2VuZCgpIGZ1bmN0aW9uCiAgYWxyZWFkeSBkaWQgdGhpcy4KCkRhbmllbCAoMiBNYXkgMjAwNikKLSBBZGRlZCBhIC0tY2hlY2tmb3Igb3B0aW9uIHRvIGN1cmwtY29uZmlnIHRvIGFsbG93IHVzZXJzIHRvIGVhc2llcgogIHdyaXRlIGZvciBleGFtcGxlIHNoZWxsIHNjcmlwdHMgdGhhdCB0ZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgYQogIG5ldy1lbm91Z2ggbGliY3VybCB2ZXJzaW9uLiBJZiAtLWNoZWNrZm9yIGlzIGdpdmVuIGEgdmVyc2lvbiBzdHJpbmcKICBuZXdlciB0aGFuIHdoYXQgaXMgY3VycmVudGx5IGluc3RhbGxlZCwgY3VybC1jb25maWcgd2lsbCByZXR1cm4gYQogIG5vbi16ZXJvIGV4aXQgY29kZSBhbmQgb3V0cHV0IGEgc3RyaW5nIGFib3V0IHRoZSB1bmZ1bGZpbGxlZAogIHJlcXVpcmVtZW50LgoKRGFuaWVsICgyNiBBcHJpbCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGJyb3VnaHQgaW5pdGlhbCBsaW5lIGVuZCBjb252ZXJzaW9ucyB3aGVuIGRvaW5nIEZUUCBBU0NJSQogIHRyYW5zZmVycy4gVGhleSBhcmUgZG9uZSBvbiBub24td2luZG93cyBzeXN0ZW1zIGFuZCB0cmFuc2xhdGUgQ1JMRiB0byBMRi4KCiAgSSBtb2RpZmllZCB0aGUgMTUgTElTVC11c2luZyB0ZXN0IGNhc2VzIGFjY29yZGluZ2x5LiBUaGUgZG93bnNpZGUgaXMgdGhhdCBub3cKICB3ZSdsbCBoYXZlIGV2ZW4gbW9yZSB0cm91YmxlIHRvIGdldCB0aGUgdGVzdHMgdG8gcnVuIG9uIFdpbmRvd3Mgc2luY2UgdGhleQogIHNob3VsZCBnZXQgQ1JMRiBuZXdsaW5lcyBsZWZ0IGludGFjdCB3aGljaCB0aGUgKm5peCB2ZXJzaW9ucyBkb24ndC4gSSBmaWd1cmUKICB0aGUgb25seSBzYW5lIHRoaW5nIHRvIGRvIGlzIHRvIGFkZCBzb21lIGtpbmQgb2YgW25ld2xpbmVdIG1hY3JvIGZvciB0aGUgdGVzdAogIGNhc2UgZmlsZXMgYW5kIGhhdmUgdGhlbSBleHBhbmRlZCB0byB0aGUgcHJvcGVyIG5hdGl2ZSBsaW5lIGVuZGluZyB3aGVuIHRoZQogIHRlc3QgY2FzZXMgYXJlIHJ1bi4gVGhpcyBpcyBob3dldmVyIGxlZnQgdG8gaW1wbGVtZW50LgoKRGFuaWVsICgyNSBBcHJpbCAyMDA2KQotIFBhdWwgUXVlcm5hIGZpeGVkIGxpYmN1cmwgdG8gYmV0dGVyIGRlYWwgd2l0aCBkZWZsYXRlIGNvbnRlbnQgZW5jb2RpbmcKICB3aGVuIHRoZSBzdHJlYW0gKHdyb25nbHkpIGxhY2tzIGEgcHJvcGVyIHpsaWIgaGVhZGVyLiBUaGlzIHNlZW1zIHRvIGJlIHRoZQogIGNhc2Ugb24gdG9vIG1hbnkgYWN0dWFsIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMuCgpEYW5pZWwgKDIxIEFwcmlsIDIwMDYpCi0gQWxlIFZlc2VseSBmaXhlZCBDVVJMT1BUX0lOVEVSRkFDRSB3aGVuIHVzaW5nIGEgaG9zdG5hbWUuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDYpCi0gQmFzZWQgb24gcHJldmlvdXMgaW5mbyBmcm9tIFRvciBBcm50c2VuLCBJIG1hZGUgY29uZmlndXJlIGRldGVjdCB0aGUgSW50ZWwKICBJQ0MgY29tcGlsZXIgdG8gYWRkIGEgY29tcGlsZXIgb3B0aW9uIGZvciBpdCwgaW4gb3JkZXIgZm9yIGNvbmZpZ3VyZSB0bwogIHByb3Blcmx5IGJlIGFibGUgdG8gZGV0ZWN0IGZ1bmN0aW9uIHByb3RvdHlwZXMuCgotIFJvYnNvbiBCcmFnYSBBcmF1am8gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgbGVzcyBlYWdlciB0byBjbG9zZQogIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gd2hlbiB1c2luZyBGVFAsIGZvciBleGFtcGxlIHdoZW4geW91IHJlbW92ZSBhbiBlYXN5CiAgaGFuZGxlIGZyb20gYSBtdWx0aSBzdGFjay4KCi0gQXBwbGllZCBhIHBhdGNoIGJ5IEF0ZXMgR29yYWwgYW5kIEthdGllIFdhbmcgdGhhdCBjb3JyZWN0ZWQgbXkgYmFkIGZpeAogIGF0dGVtcHQgZnJvbSBBcHJpbCAxMC4KCkRhbmllbCAoMTEgQXByaWwgMjAwNikKLSAjMTQ2ODMzMCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQ2ODMzMCkgcG9pbnRlZCBvdXQgYSBiYWQKICB0eXBlY2FzdCBpbiB0aGUgY3VybCB0b29sIGxlYWRpbmcgdG8gYSBjcmFzaCB3aXRoICg2NGJpdD8pIFZTMjAwNSAoYXQgbGVhc3QpCiAgc2luY2UgdGhlIHN0cnVjdCB0aW1ldmFsIGZpZWxkIHR2X3NlYyBpcyBhbiBpbnQgd2hpbGUgdGltZV90IGlzIDY0Yml0LgoKRGFuaWVsICgxMCBBcHJpbCAyMDA2KQotIEF0ZXMgR29yYWwgZm91bmQgb3V0IHRoYXQgaWYgeW91IHNwZWNpZmllZCBib3RoIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgYW5kCiAgQ1VSTE9QVF9USU1FT1VULCB0aGUgX2xvbmdlcl8gdGltZSB3b3VsZCB3cm9uZ2x5IGJlIHVzZWQgZm9yIHRoZSBTU0wKICBjb25uZWN0aW9uIHRpbWUtb3V0IQoKLSBJIG1lcmdlZCBteSBoaXBlciBwYXRjaCAoaHR0cDovL2N1cmwuaGF4eC5zZS9saWJjdXJsL2hpcGVyLykgaW50byB0aGUgbWFpbgogIHNvdXJjZXMuIFNlZSB0aGUgbGliL1JFQURNRS5tdWx0aV9zb2NrZXQgZm9yIGltcGxlbWVudGF0aW9uIHN0b3J5IHdpdGgKICBkZXRhaWxzLiBEb24ndCBleHBlY3QgaXQgdG8gd29yayBmdWxseSB5ZXQuIEkgZG9uJ3QgaW50ZW5kIHRvIGJsb3cgYW55CiAgd2hpc3RsZXMgb3IgcmluZyBhbnkgYmVsbHMgYWJvdXQgaXQgdW50aWwgSSdtIG1vcmUgY29udmluY2VkIGl0IHdvcmtzIGF0CiAgbGVhc3Qgc29tZXdoYXQgcmVsaWFibHkuCgpEYW5pZWwgKDcgQXByaWwgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSdzIEVCQ0RJQyBhbmQgVFBGIGNoYW5nZXMuIFRocmVlIG5ldyBjdXJsX2Vhc3lfc2V0b3B0KCkKICBvcHRpb25zIChjYWxsYmFja3MpIHdlcmUgYWRkZWQ6CgogIENPTlZfRlJPTV9ORVRXT1JLX0ZVTkNUSU9OCiAgQ09OVl9UT19ORVRXT1JLX0ZVTkNUSU9OCiAgQ09OVl9GUk9NX1VURjhfRlVOQ1RJT04KCkRhbmllbCAoNSBBcHJpbCAyMDA2KQotIE1pY2hlbGUgQmluaSBtb2RpZmllZCB0aGUgTlRMTSBjb2RlIHRvIHdvcmsgZm9yIGhpcyAid2VpcmQgSUlTIGNhc2UiCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNi0wMi8wMTU0Lmh0bWwpIGJ5IGFkZGluZyB0aGUgTlRMTSBoYXNoCiAgZnVuY3Rpb24gaW4gYWRkaXRpb24gdG8gdGhlIExNIG9uZSBhbmQgbWFraW5nIHNvbWUgb3RoZXIgYWRqdXN0bWVudHMgaW4gdGhlCiAgb3JkZXIgdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgZGF0YSBibG9jayBhcmUgc2VudCBpbiB0aGUgVHlwZS0yIHJlcGx5LgogIEluc3BpcmF0aW9uIGZvciB0aGlzIHdvcmsgd2FzIHRha2VuIGZyb20gdGhlIEZpcmVmb3ggTlRMTSBpbXBsZW1lbnRhdGlvbi4KCiAgSSBlZGl0ZWQgdGhlIGV4aXN0aW5nIDIxKCEpIE5UTE0gdGVzdCBjYXNlcyB0byBydW4gZmluZSB3aXRoIHRoZXNlIG5ld3MuIER1ZQogIHRvIHRoZSBmYWN0IHRoYXQgd2Ugbm93IHByb3Blcmx5IGluY2x1ZGUgdGhlIGhvc3QgbmFtZSBpbiB0aGUgVHlwZS0yIG1lc3NhZ2UKICB0aGUgdGVzdCBjYXNlcyBub3cgb25seSBjb21wYXJlIHBhcnRzIG9mIHRoYXQgY2h1bmsuCgpEYW5pZWwgKDI4IE1hcmNoIDIwMDYpCi0gIzE0NTE5MjkgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0NTE5MjkpIGRldGFpbGVkIGEgYnVnIHRoYXQKICBvY2N1cnJlZCB3aGVuIGFza2luZyBsaWJjdXJsIHRvIGZvbGxvdyBIVFRQIHJlZGlyZWN0cyBhbmQgdGhlIG9yaWdpbmFsIFVSTAogIGhhZCBtb3JlIHRoYW4gb25lIHF1ZXN0aW9uIG1hcmsgKD8pLiBBZGRlZCB0ZXN0IGNhc2UgMjc2IHRvIHZlcmlmeS4KCkRhbmllbCAoMjcgTWFyY2ggMjAwNikKLSBEYXZpZCBCeXJvbiBmb3VuZCBhIHByb2JsZW0gbXVsdGlwbGUgLWQgb3B0aW9ucyB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0IHdpdGgKICAtLWVuYWJsZS1kZWJ1ZywgYXMgdGhlbiBjdXJsIHVzZWQgZnJlZSgpIG9uIG1lbW9yeSBhbGxvY2F0ZWQgYm90aCB3aXRoCiAgbm9ybWFsIG1hbGxvYygpIGFuZCB3aXRoIGxpYmN1cmwtcHJvdmlkZWQgZnVuY3Rpb25zLCB3aGVuIHRoZSBsYXR0ZXIgTVVTVCBiZQogIGZyZWVkIHdpdGggY3VybF9mcmVlKCkgaW4gZGVidWcgYnVpbGRzLgoKRGFuaWVsICgyNiBNYXJjaCAyMDA2KQotIFRvciBBcm50c2VuIGZpZ3VyZWQgb3V0IHRoYXQgVEZUUCB3YXMgYnJva2VuIG9uIGEgbG90IG9mIHN5c3RlbXMgc2luY2Ugd2UKICBjYWxsZWQgYmluZCgpIHdpdGggYSB0b28gYmlnIGFyZ3VtZW50IGluIHRoZSAzcmQgcGFyYW1ldGVyIGFuZCBhdCBsZWFzdAogIFRydTY0LCBBSVggYW5kIElSSVggc2VlbSB0byBiZSB2ZXJ5IHBpY2t5IGFib3V0IGl0LgoKRGFuaWVsICgyMSBNYXJjaCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGFkZGVkIENVUkxJTkZPX0ZUUF9FTlRSWV9QQVRILgoKLSBYYXZpZXIgQm91Y2hvdXggbWFkZSB0aGUgU1NMIGNvbm5lY3Rpb24gbm9uLWJsb2NraW5nIGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgKHdoZW4gdXNpbmcgT3BlblNTTCkuCgotIFRvciBBcm50c2VuIGZpeGVkIHRoZSBBSVggVG9vbGJveCBSUE0gc3BlYwoKRGFuaWVsICgyMCBNYXJjaCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIGxpYmN1cmwgdG8gbm8gbG9uZ2VyIGlnbm9yZSBBVVRIIGZhaWx1cmVzIGFuZCBub3cgaXQKICByZWFjdHMgcHJvcGVybHkgYWNjb3JkaW5nIHRvIHRoZSBDVVJMT1BUX0ZUUF9TU0wgc2V0dGluZy4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHR3byBURlRQIHByb2JsZW1zOiBGaXhlZCBhIGJ1ZyB3aGVyZWJ5IGEgcmVjZWl2ZWQgZmlsZQogIHdob3NlIGxlbmd0aCB3YXMgYSBtdWx0aXBsZSBvZiA1MTIgYnl0ZXMgY291bGQgaGF2ZSByYW5kb20gZ2FyYmFnZQogIGFwcGVuZGVkLiBBbHNvLCBzdG9wIHByb2Nlc3NpbmcgVEZUUCBwYWNrZXRzIHdoaWNoIGFyZSB0b28gc2hvcnQgdG8gYmUKICBsZWdhbC4KCi0gSWxqYSB2YW4gU3BydW5kZWwgcmVwb3J0ZWQgYSBwb3NzaWJsZSBjcmFzaCBpbiB0aGUgY3VybCB0b29sIHdoZW4gdXNpbmcKICAiY3VybCBob3N0d2l0aG91dHNsYXNoIC1kIGRhdGEgLUciCgpWZXJzaW9uIDcuMTUuMyAoMjAgTWFyY2ggMjAwNikKCkRhbmllbCAoMjAgTWFyY2ggMjAwNikKLSBWVUxORVJBQklMSVRZIHJlcG9ydGVkIHRvIHVzIGJ5IFVsZiBIYXJuaGFtbWFyLgoKICBsaWJjdXJsIHVzZXMgdGhlIGdpdmVuIGZpbGUgcGFydCBvZiBhIFRGVFAgVVJMIGluIGEgbWFubmVyIHRoYXQgYWxsb3dzIGEKICBtYWxpY2lvdXMgdXNlciB0byBvdmVyZmxvdyBhIGhlYXAtYmFzZWQgbWVtb3J5IGJ1ZmZlciBkdWUgdG8gdGhlIGxhY2sgb2YKICBib3VuZGFyeSBjaGVjay4KCiAgVGhpcyBvdmVyZmxvdyBoYXBwZW5zIGlmIHlvdSBwYXNzIGluIGEgVVJMIHdpdGggYSBURlRQIHByb3RvY29sIHByZWZpeAogICgidGZ0cDovLyIpLCB1c2luZyBhIHZhbGlkIGhvc3QgYW5kIGEgcGF0aCBwYXJ0IHRoYXQgaXMgbG9uZ2VyIHRoYW4gNTEyCiAgYnl0ZXMuCgogIFRoZSBhZmZlY3RlZCBmbGF3IGNhbiBiZSB0cmlnZ2VyZWQgYnkgYSByZWRpcmVjdCwgaWYgY3VybC9saWJjdXJsIGlzIHRvbGQgdG8KICBmb2xsb3cgcmVkaXJlY3RzIGFuZCBhbiBIVFRQIHNlcnZlciBwb2ludHMgdGhlIGNsaWVudCB0byBhIHRmdHAgVVJMIHdpdGggdGhlCiAgY2hhcmFjdGVyaXN0aWNzIGRlc2NyaWJlZCBhYm92ZS4KCiAgVGhlIENvbW1vbiBWdWxuZXJhYmlsaXRpZXMgYW5kIEV4cG9zdXJlcyAoQ1ZFKSBwcm9qZWN0IGhhcyBhc3NpZ25lZCB0aGUgbmFtZQogIENWRS0yMDA2LTEwNjEgdG8gdGhpcyBpc3N1ZS4KCkRhbmllbCAoMTYgTWFyY2ggMjAwNikKLSBUb3IgQXJudHNlbiBwcm92aWRlZCBhIFJQTSBzcGVjIGZpbGUgZm9yIEFJWCBUb29sYm94LCB0aGF0IG5vdyBpcyBpbmNsdWRlZAogIGluIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQ6CgogIGEgYmFkIFNTTCBlcnJvciBtZXNzYWdlIHdoZW4gT3BlblNTTCBjZXJ0aWZpY2F0ZXMgYXJlIHZlcmlmaWVkIGZpbmUuCgogIGEgbWlzc2luZyByZXR1cm4gY29kZSBhc3NpZ25tZW50IGluIHRoZSBGVFAgY29kZQoKRGFuaWVsICg3IE1hcmNoIDIwMDYpCi0gTWFya3VzIEtvZXR0ZXIgZmlsZWQgZGViaWFuIGJ1ZyByZXBvcnQgIzM1NTcxNSB3aGljaCBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBhbmQgbXVsdGktcGFydCBmb3JtcG9zdHMuIFRoZSBmaXggZnJvbSBGZWJydWFyeQogIDIybmQgY291bGQgbWFrZSB0aGUgQ3VybF9kb25lKCkgZnVuY3Rpb24gZ2V0IGNhbGxlZCB0d2ljZSBvbiB0aGUgc2FtZQogIGNvbm5lY3Rpb24gYW5kIGl0IHdhcyBub3QgZGVzaWduZWQgZm9yIHRoYXQgYW5kIHRodXMgdHJpZWQgdG8gY2FsbCBmcmVlKCkgb24KICBhbiBhbHJlYWR5IGZyZWVkIG1lbW9yeSBhcmVhIQoKLSBQZXRlciBIZXVjaGVydCBtYWRlIHN1cmUgdGhlIENVUkxGVFBTU0xfQ09OVFJPTCBzZXR0aW5nIGZvciBDVVJMT1BUX0ZUUF9TU0wKICBpcyB1c2VkIHByb3Blcmx5LgoKRGFuaWVsICg2IE1hcmNoIDIwMDYpCi0gTG90cyBvZiB1c2VycyBvbiBXaW5kb3dzIGhhdmUgcmVwb3J0ZWQgZ2V0dGluZyB0aGUgIlNTTDogY291bGRuJ3Qgc2V0CiAgY2FsbGJhY2siIGVycm9yIG1lc3NhZ2Ugc28gSSd2ZSBub3cgbWFkZSB0aGUgc2V0dGluZyBvZiB0aGF0IGNhbGxiYWNrIG5vdCBiZQogIGFzIGNyaXRpY2FsIGFzIGJlZm9yZS4gVGhlIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3IgYWRkaXRpb25hbCBsb2dnZ2luZy8KICB0cmFjZSBhbnl3YXkgc28gYSBmYWlsdXJlIGp1c3QgbWVhbnMgc2xpZ2h0bHkgbGVzcyBkYXRhLiBJdCBzaG91bGQgc3RpbGwgYmUKICBhYmxlIHRvIHByb2NlZWQgYW5kIGNvbm5lY3QgZmluZSB0byB0aGUgc2VydmVyLgoKRGFuaWVsICg0IE1hcmNoIDIwMDYpCi0gVGhvbWFzIEtsYXVzbmVyIHByb3ZpZGVkIGEgcGF0Y2ggd3JpdHRlbiBieSBUb2RkIFZpZXJsaW5nIGluIGJ1ZyByZXBvcnQKICAjMTQ0MjQ3MSB0aGF0IGZpeGVzIGEgYnVpbGQgcHJvYmxlbSBvbiBJbnRlcml4LgoKRGFuaWVsICgyIE1hcmNoIDIwMDYpCi0gRlRQIHVwbG9hZCB3aXRob3V0IGEgZmlsZSBuYW1lIHBhcnQgaW4gdGhlIFVSTCBub3cgY2F1c2VzCiAgY3VybF9lYXN5X3BlcmZvcm0oKSB0byByZXR1cm4gQ1VSTEVfVVJMX01BTEZPUk1BVC4gUHJldmlvdXNseSBpdCBhbGxvd2VkIHRoZQogIHVwbG9hZCBidXQgbmFtZWQgdGhlIGZpbGUgIihuaWwpIiAod2l0aG91dCB0aGUgcXVvdGVzKS4gVGVzdCBjYXNlIDUyNAogIHZlcmlmaWVzLgoKLSBBZGRlZCBhIGNoZWNrIGZvciBnZXRwcm90b2J5bmFtZSBpbiBjb25maWd1cmUgc28gdGhhdCBpdCdsbCBiZSB1c2VkLCB0aGFua3MKICB0byBHaXNsZSBWYW5lbSdzIGNoYW5nZSB0aGUgb3RoZXIgZGF5LgoKRGFuaWVsICgyOCBGZWJydWFyeSAyMDA2KQotIERhbiBGYW5kcmljaCBwcmV2ZW50ZWQgY3VybCBmcm9tIGdldHRpbmcgc3R1Y2sgaW4gYW4gZW5kbGVzcyBsb29wIGluIGNhc2Ugd2UKICBhcmUgb3V0IG9mIGZpbGUgaGFuZGxlcyB2ZXJ5IGVhcmx5IGluIGN1cmwncyBjb2RlIHdoZXJlIGl0IG1ha2VzIHN1cmUgdGhhdAogIDAsIDEgYW5kIDIgYXJlbid0IGdvbm5hIGJlIHVzZWQgYnkgdGhlIGxpYiBmb3IgdHJhbnNmZXJzLgoKRGFuaWVsICgyNyBGZWJydWFyeSAyMDA2KQotIE1hcnR5IEt1aHJ0IHBvaW50ZWQgb3V0IHRoYXQgdGhlcmUgd2VyZSB0d28gVk1TLXNwZWNpZmljIGZpbGVzIG1pc3NpbmcgaW4KICB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKVmVyc2lvbiA3LjE1LjIgKDI3IEZlYnJ1YXJ5IDIwMDYpCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDYpCi0gTG90cyBvZiB3b3JrIGFuZCBhbmFseXNpcyBieSAieGJ4X19fIiBpbiBidWcgIzE0MzE3NTAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQzMTc1MCkgaGVscGVkIG1lIGlkZW50aWZ5IGFuZCBmaXggdHdvCiAgZGlmZmVyZW50IGJ1dCByZWxhdGVkIGJ1Z3M6CgogIDEpIFJlbW92aW5nIGFuIGVhc3kgaGFuZGxlIGZyb20gYSBtdWx0aSBoYW5kbGUgYmVmb3JlIHRoZSB0cmFuc2ZlciBpcyBkb25lCiAgICAgY291bGQgbGVhdmUgYSBjb25uZWN0aW9uIGluIHRoZSBjb25uZWN0aW9uIGNhY2hlIGZvciB0aGF0IGhhbmRsZSB0aGF0IGlzCiAgICAgaW4gYSBzdGF0ZSB0aGF0IGlzbid0IHN1aXRhYmxlIGZvciByZS11c2UuIEEgc3Vic2VxdWVudCByZS11c2UgY291bGQgdGhlbgogICAgIHJlYWQgZnJvbSBhIE5VTEwgcG9pbnRlciBhbmQgc2VnZmF1bHQuCgogIDIpIFdoZW4gYW4gZWFzeSBoYW5kbGUgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbXVsdGkgaGFuZGxlLCB0aGVyZSBjb3VsZCBiZSBhbgogICAgIG91dHN0YW5kaW5nIGMtYXJlcyBETlMgbmFtZSByZXNvbHZlIHJlcXVlc3QuIFdoZW4gdGhlIHJlc3BvbnNlIGFycml2ZWQsCiAgICAgaXQgY2F1c2VkIGhhdm9jIHNpbmNlIHRoZSBjb25uZWN0aW9uIHN0cnVjdCBpdCAiYmVsb25nZWQiIHRvIGNvdWxkJ3ZlCiAgICAgYmVlbiBmcmVlZCBhbHJlYWR5LgoKICBOb3cgQ3VybF9kb25lKCkgaXMgY2FsbGVkIHdoZW4gYW4gZWFzeSBoYW5kbGUgaXMgcmVtb3ZlZCBmcm9tIGEgbXVsdGkgaGFuZGxlCiAgcHJlLW1hdHVyZWx5ICh0aGF0IGlzLCBiZWZvcmUgdGhlIHRyYW5zZmVyIHdhcyBjb21wbHRldGVkKS4gQ3VybF9kb25lKCkgYWxzbwogIG1ha2VzIHN1cmUgdG8gY2FuY2VsIGFsbCAoaWYgYW55KSBvdXRzdGFuZGluZyBjLWFyZXMgcmVxdWVzdHMuCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDYpCi0gUGV0ZXIgU3UgYWRkZWQgc3VwcG9ydCBmb3IgU09DS1M0IHByb3hpZXMuIEVuYWJsZSB0aGlzIGJ5IHNldHRpbmcgdGhlIHByb3h5CiAgdHlwZSB0byB0aGUgYWxyZWFkeSBwcm92aWRlZCB0eXBlIENVUkxQUk9YWV9TT0NLUzQuCgogIEkgYWRkZWQgYSAtLXNvY2tzNCBvcHRpb24gdGhhdCB3b3JrcyBsaWtlIHRoZSBjdXJyZW50IC0tc29ja3M1IG9wdGlvbiBidXQKICBpbnN0ZWFkIHVzZSB0aGUgc29ja3M0IHByb3RvY29sLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDA2KQotIFNobXVsaWsgUmVnZXYgZml4ZWQgYW4gaXNzdWUgd2l0aCBtdWx0aS1wYXNzIGF1dGhlbnRpY2F0aW9uIGFuZCBjb21wcmVzc2VkCiAgY29udGVudCB3aGVuIGxpYmN1cmwgZGlkbid0IGhvbm9yIHRoZSBpbnRlcm5hbCBpZ25vcmVib2R5IGZsYWcuCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDYpCi0gVWxmIEjkcm5oYW1tYXIgZml4ZWQgYSBmb3JtYXQgc3RyaW5nIChwcmludGYgc3R5bGUpIHByb2JsZW0gaW4gdGhlIE5lZ290aWF0ZQogIGNvZGUuIEl0IHNob3VsZCBob3dldmVyIG5vdCBiZSB0aGUgY2F1c2Ugb2YgYW55IHRyb3VibGVzLiBIZSBhbHNvIGZpeGVkIGEKICBmZXcgc2ltaWxhciBwcm9ibGVtcyBpbiB0aGUgSFRUUCB0ZXN0IHNlcnZlciBjb2RlLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA2KQotIFNobXVsaWsgUmVnZXYgcHJvdmlkZWQgYSBmaXggZm9yIHRoZSBETlMgY2FjaGUgd2hlbiB1c2luZyBzaG9ydCBsaWZlIHRpbWVzLAogIGFzIHByZXZpb3VzbHkgaXQgY291bGQgYmUgaG9sZGluZyBvbiB0byBvbGQgY2FjaGVkIGVudHJpZXMgbG9uZ2VyIHRoYW4KICByZXF1ZXN0ZWQuCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDYpCi0gS2FybCBNb2VyZGVyIGFkZGVkIHRoZSBDVVJMT1BUX0NPTk5FQ1RfT05MWSBhbmQgQ1VSTElORk9fTEFTVFNPQ0tFVCBvcHRpb25zCiAgdGhhdCBhbiBhcHAgY2FuIHVzZSB0byBsZXQgbGliY3VybCBvbmx5IGNvbm5lY3QgdG8gYSByZW1vdGUgaG9zdCBhbmQgdGhlbgogIGV4dHJhY3QgdGhlIHNvY2tldCBmcm9tIGxpYmN1cmwuIGxpYmN1cmwgd2lsbCB0aGVuIG5vdCBhdHRlbXB0IHRvIGRvIGFueQogIHRyYW5zZmVyIGF0IGFsbCBhZnRlciB0aGUgY29ubmVjdCBpcyBkb25lLgoKLSBLZW50IEJvb3J0eiBpbXByb3ZlZCB0aGUgY29uZmlndXJlIGNoZWNrIGZvciBHbnVUTFMgdG8gcHJvcGVybHkgc2V0IExJQlMKICBpbnN0ZWFkIG9mIExERkxBR1MuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwNikKLSBQaGlsaXBwZSBWYXVjaGVyIHByb3ZpZGVkIGEgYnJpbGxpYW50IHBpZWNlIG9mIHRlc3QgY29kZSB0aGF0IHNob3cgYSBwcm9ibGVtCiAgd2l0aCByZS11c2VkIEZUUCBjb25uZWN0aW9ucy4gSWYgdGhlIHNlY29uZCByZXF1ZXN0IG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24KICB3YXMgc2V0IG5vdCB0byBmZXRjaCBhICJib2R5IiwgbGliY3VybCBjb3VsZCBnZXQgY29uZnVzZWQgYW5kIGNvbnNpZGVyIGl0IGFuCiAgYXR0ZW1wdCB0byB1c2UgYSBkZWFkIGNvbm5lY3Rpb24gYW5kIHdvdWxkIGdvIGFjdGluZyBtaWdodHkgc3RyYW5nZS4KCkRhbmllbCAoMiBGZWJydWFyeSAyMDA2KQotIE1ha2UgLS1saW1pdC1yYXRlIFtudW1dIG1lYW4gYnl0ZXMuIEl0IHVzZWQgdG8gYmUgdGhhdCBidXQgaXQgYnJva2UgaW4gbXkKICBjaGFuZ2UgZG9uZSBpbiBOb3ZlbWJlciAyMDA1LgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDYpCi0gQWRkZWQgQ1VSTE9QVF9MT0NBTFBPUlQgYW5kIENVUkxPUFRfTE9DQUxQT1JUUkFOR0UgdG8gbGliY3VybC4gU2V0IHdpdGggdGhlCiAgY3VybCB0b29sIHdpdGggLS1sb2NhbC1wb3J0LiBQbGFpbiBhbmQgc2ltcGx5IHNldCB0aGUgcmFuZ2Ugb2YgcG9ydHMgdG8gYmluZAogIHRoZSBsb2NhbCBlbmQgb2YgY29ubmVjdGlvbnMgdG8uIEltcGxlbWVudGVkIG9uIHRvIHBvcHVsYXIgZGVtYW5kLgoKLSBCYXNlZCBvbiBhbiBlcnJvciByZXBvcnQgYnkgUGhpbGlwcGUgVmF1Y2hlciwgd2Ugbm8gbG9uZ2VyIGNvdW50IGEgcmV0cmllZAogIGNvbm5lY3Rpb24gc2V0dXAgYXMgYSBmb2xsb3ctcmVkaXJlY3QuIEl0IHR1cm5zIG91dCAxKSB0aGlzIGZhaWxzIHdoZW4gYSBGVFAKICBjb25uZWN0aW9uIGlzIHJlLXNldHVwIGFuZCAyKSBpdCBkb2VzIG1ha2UgdGhlIG1heC1yZWRpcnMgY291bnRlciBiZWhhdmUKICB3cm9uZy4KCkRhbmllbCAoMjQgSmFudWFyeSAyMDA2KQotIE1pY2hhbCBNYXJlayBwcm92aWRlZCBhIHBhdGNoIGZvciBGVFAgdGhhdCBtYWtlcyBsaWJjdXJsIGNvbnRpbnVlIHRvIHRyeQogIFBBU1YgZXZlbiBhZnRlciBFUFNWIHJldHVybmVkIGEgcG9zaXRpdmUgcmVzcG9uc2UgY29kZSwgaWYgbGliY3VybCBmYWlsZWQgdG8KICBjb25uZWN0IHRvIHRoZSBwb3J0IG51bWJlciB0aGUgRVBTViByZXNwb25zZSBzYWlkLiBPYnZpb3VzbHkgc29tZSBwZW9wbGUgYXJlCiAgZ29pbmcgdGhyb3VnaCBwcm90b2NvbC1zZW5zaXRpdmUgZmlyZXdhbGxzIChvciBzaW1pbGFyKSB0aGF0IGRvbid0CiAgdW5kZXJzdGFuZCBFUFNWIGFuZCB0aGVuIHRoZXkgZG9uJ3QgYWxsb3cgdGhlIHNlY29uZCBjb25uZWN0aW9uIHVubGVzcyBQQVNWCiAgd2FzIHVzZWQuIFRoaXMgYWxzbyBjYWxsZWQgZm9yIGEgbWlub3IgZml4IG9mIHRlc3QgY2FzZSAyMzguCgpEYW5pZWwgKDIwIEphbnVhcnkgMjAwNikKLSBEdWFuZSBDYXRoZXkgd2FzIG9uZSBvZiBvdXIgZnJpZW5kcyB3aG8gcmVwb3J0ZWQgdGhhdCBjdXJsIC1QIFtJUF0KICAoQ1VSTE9QVF9GVFBQT1JUKSBkaWRuJ3Qgd29yayBmb3IgaXB2Ni1lbmFiZWQgY3VybHMgaWYgdGhlIElQIHdhc24ndCBhCiAgIm5hdGl2ZSIgSVAgd2hpbGUgaXQgd29ya3MgZmluZSBmb3IgaXB2Ni1kaXNhYmxlZCBidWlsZHMhCgogIEluIHRoZSBwcm9jZXNzIG9mIGZpeGluZyB0aGlzLCBJIHJlbW92ZWQgdGhlIHN1cHBvcnQgZm9yIExQUlQgc2luY2UgSSBjYW4ndAogIHRoaW5rIG9mIG1hbnkgcmVhc29ucyB0byBrZWVwIGRvaW5nIGl0IGFuZCBhc2tpbmcgb24gdGhlIG1haWxpbmcgbGlzdCBkaWRuJ3QKICByZXZlYWwgYW55b25lIGVsc2UgdGhhdCBjb3VsZCBlaXRoZXIuIFRoZSBjb2RlIHRoYXQgc2VuZHMgRVBSVCBhbmQgUE9SVCBpcwogIG5vdyBhbHNvIGEgbG90IHNpbXBsZXIgdGhhbiBiZWZvcmUgKElNSE8pLgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDYpCi0gSm9uIFR1cm5lciBwb2ludGVkIG91dCB0aGF0IGRvaW5nIC1QIFtob3N0bmFtZV0gKENVUkxPUFRfRlRQUE9SVCkgd2l0aCBjdXJsCiAgKGJ1aWx0IGlwdjQtb25seSkgZGlkbid0IHdvcmsuCgpEYW5pZWwgKDE4IEphbnVhcnkgMjAwNikKLSBBcyByZXBvcnRlZCBpbiBidWcgIzE0MDg3NDIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0MDg3NDIpLAogIHRoZSBjb25maWd1cmUgc2NyaXB0IGNvbXBsYWluZWQgYWJvdXQgYSBtaXNzaW5nICJtaXNzaW5nIiBzY3JpcHQgaWYgeW91IHJhbgogIGNvbmZpZ3VyZSB3aXRoaW4gYSBwYXRoIHdob3NlIG5hbWUgaW5jbHVkZWQgb25lIG9yIG1vcmUgc3BhY2VzLiBUaGlzIGlzIGR1ZQogIHRvIGEgZmxhdyBpbiBhdXRvbWFrZSAoMS45LjYgYW5kIGVhcmxpZXIpLiBJJ3ZlIG5vdyB3b3JrZWQgYXJvdW5kIGl0IGJ5CiAgaW5jbHVkaW5nIGFuICJvdmVybG9hZGVkIiB2ZXJzaW9uIG9mIHRoZSBBTV9NSVNTSU5HX0hBU19SVU4gc2NyaXB0IHRoYXQnbGwKICBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIG9uZSBhdXRvbWFrZSBzaGlwcyB3aXRoLiBUaGlzIGtsdWRnZSBuZWVkcyB0byBiZQogIHJlbW92ZWQgb25jZSB3ZSBnZXQgYW4gYXV0b21ha2UgdmVyc2lvbiB3aXRoIHRoaXMgcHJvYmxlbSBjb3JyZWN0ZWQuCiAgUG9zc2libHkgd2UnbGwgdGhlbiBuZWVkIHRvIGNvbnZlcnQgdGhpcyBpbnRvIGEga2x1ZGdlIGRlcGVuZGluZyBvbiB3aGF0CiAgYXV0b21ha2UgdmVyc2lvbiB0aGF0IGlzIHVzZWQgYW5kIHRoYXQgaXMgZ29ubmEgYmUgcGFpbmZ1bCBhbmQgSSBkb24ndCBldmVuCiAgd2FudCB0byB0aGluayBhYm91dCB0aGF0IG5vdy4uLiEKCkRhbmllbCAoMTcgSmFudWFyeSAyMDA2KQotIERhdmlkIFNoYXc6IEhlcmUgaXMgdGhlIGxhdGVzdCBsaWJjdXJsLm00IGF1dG9jb25mIHRlc3RzLiBJdCBpcyB1cGRhdGVkIHdpdGgKICB0aGUgbGF0ZXN0IGZlYXR1cmVzIGFuZCBwcm90b2NvbHMgdGhhdCBsaWJjdXJsIHN1cHBvcnRzIGFuZCBoYXMgYSBtaW5vciBmaXgKICB0byBiZXR0ZXIgZGVhbCB3aXRoIHRoZSBvYnNjdXJlIGNhc2Ugd2hlcmUgc29tZW9uZSBoYXMgbW9yZSB0aGFuIG9uZSBsaWJjdXJsCiAgaW5zdGFsbGVkIGF0IHRoZSBzYW1lIHRpbWUuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNikKLSBEYXZpZCBTaGF3IGZpbmFsbHkgcmVtb3ZlZCBhbGwgdHJhY2VzIG9mIEdvcGhlciBhbmQgd2UgYXJlIG5vdyBvZmZpY2lhbGx5CiAgbm90IHN1cHBvcnRpbmcgaXQuIEl0IGhhc24ndCBiZWVuIGZ1bmN0aW9uaW5nIGZvciB5ZWFycyBhbnl3YXksIHNvIHRoaXMgaXMKICBqdXN0IGZpbmFsbHkgc3RhdGluZyB3aGF0IGFscmVhZHkgd2FzIHRydWUuIEFuZCBhIGNsZWFudXAgYXQgdGhlIHNhbWUgdGltZS4KCi0gQnJ5YW4gSGVuZGVyc29uIHR1cm5lZCB0aGUgJ2luaXRpYWxpemVkJyB2YXJpYWJsZSBmb3IgY3VybF9nbG9iYWxfaW5pdCgpCiAgaW50byBhIGNvdW50ZXIsIGFuZCB0aHVzIHlvdSBjYW4gbm93IGRvIG11bHRpcGxlIGN1cmxfZ2xvYmFsX2luaXQoKSBhbmQgeW91CiAgYXJlIHRoZW4gc3VwcG9zZWQgdG8gZG8gdGhlIHNhbWUgYW1vdW50IG9mIGNhbGxzIHRvIGN1cmxfZ2xvYmFsX2NsZWFudXAoKS4KICBCcnlhbiBoYXMgYWxzbyB1cGRhdGVkIHRoZSBkb2NzIGFjY29yZGluZ2x5LgoKRGFuaWVsICgxMyBKYW51YXJ5IDIwMDYpCi0gQW5kcmV3IEJlbmhhbSBmaXhlZCBhIHJhY2UgY29uZGl0aW9uIGluIHRoZSB0ZXN0IHN1aXRlIHRoYXQgY291bGQgY2F1c2UgdGhlCiAgdGVzdCBzY3JpcHQgdG8ga2lsbCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBjdXJyZW50IHByb2Nlc3MgZ3JvdXAhCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNikKLSBNaWNoYWVsIEphaG46CgogIEZpeGVkIEZUUF9TS0lQX1BBU1ZfSVAgYW5kIEZUUF9VU0VfRVBTViB0byAiZG8gcmlnaHQiIHdoZW4gdXNlZCBvbiBGVFAgdGhydQogIEhUVFAgcHJveHkuCgogIEZpeGVkIFBST1hZVFVOTkVMIHRvIHdvcmsgZmluZSB3aGVuIHlvdSBkbyBmdHAgdGhyb3VnaCBhIHByb3h5LiAgSXQgd291bGQKICBwcmV2aW91c2x5IG92ZXJ3cml0ZSBpbnRlcm5hbCBtZW1vcnkgYW5kIGNhdXNlIHVucHJlZGljdGVkIGJlaGF2aW91ciEKCkRhbmllbCAoMTEgSmFudWFyeSAyMDA2KQotIEkgZGVjaWRlZCB0byBkb2N1bWVudCB0aGUgInNlY3JldCBvcHRpb24iIGhlcmUgbm93LCBhcyBJJ3ZlIHJlY2VpdmVkICpOTyoKICBmZWVkYmFjayBhdCBhbGwgb24gbXkgbWFpbGluZyBsaXN0IHJlcXVlc3RzIGZyb20gTm92ZW1iZXIgMjAwNToKCiAgSSdtIGxvb2tpbmcgZm9yIGZlZWRiYWNrIGFuZCBjb21tZW50cy4gSSBhZGRlZCBzb21lIGV4cGVyaW1lbnRhbCBjb2RlIHRoZQogIG90aGVyIGRheSwgdGhhdCBhbGxvd3MgYSBsaWJjdXJsIHVzZXIgdG8gc2VsZWN0IHdoYXQgbWV0aG9kIGxpYmN1cmwgc2hvdWxkCiAgdXNlIHRvIHJlYWNoIGEgZmlsZSBvbiBhIEZUUChTKSBzZXJ2ZXIuCgogIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgaW4gQ1ZTIGNvZGUgYW5kIGluIHJlY2VudCBkYWlseSBzbmFwc2hvdHMuCgogIExldCBtZSBleHBsYWluLi4uCgogIFRoZSBjdXJyZW50IG5hbWUgZm9yIHRoZSBvcHRpb24gaXMgQ1VSTE9QVF9GVFBfRklMRU1FVEhPRCAoLS1mdHAtbWV0aG9kIGZvcgogIHRoZSBjb21tYW5kIGxpbmUgdG9vbCkgYW5kIHlvdSBzZXQgaXQgdG8gYSBsb25nICh0aGVyZSBhcmUgY3VycmVubHkgbm8KICBkZWZpbmVzIGZvciB0aGUgYXJndW1lbnQgdmFsdWVzLCBqdXN0IHBsYWluIG51bWVyaWNhbHMpLiBZb3UgY2FuIHNldCB0aHJlZQogIGRpZmZlcmVudCAibWV0aG9kcyIgdGhhdCBkbyB0aGlzOgoKICAxIG11bHRpY3dkIC0gbGlrZSB0b2RheSwgY3VybCB3aWxsIGRvIGEgc2luZ2xlIENXRCBvcGVyYXRpb24gZm9yIGVhY2ggcGF0aAogICAgICAgICAgIHBhcnQgaW4gdGhlIGdpdmVuIFVSTC4gRm9yIGRlZXAgaGllcmFyY2hpZXMgdGhpcyBtZWFucyB2ZXJ5IG1hbnkKICAgICAgICAgICBjb21tYW5kcy4gVGhpcyBpcyBob3cgUkZDMTczOCBzYXlzIGl0IHNob3VsZCBiZSBkb25lLiBUaGlzIGlzIHRoZQogICAgICAgICAgIGRlZmF1bHQuCgogIDIgbm9jd2QgLSBubyBDV0QgYXQgYWxsIGlzIGRvbmUsIGN1cmwgd2lsbCBkbyBTSVpFLCBSRVRSLCBTVE9SIGV0YyBhbmQgZ2l2ZQogICAgICAgICAgIGEgZnVsbCBwYXRoIHRvIHRoZSBzZXJ2ZXIuCgogIDMgc2luZ2xlY3dkIC0gbWFrZSBvbmUgQ1dEIHdpdGggdGhlIGZ1bGwgdGFyZ2V0IGRpcmVjdG9yeSBhbmQgdGhlbiBvcGVyYXRlCiAgICAgICAgICAgIG9uIHRoZSBmaWxlICJub3JtYWxseSIuCgogIChXaXRoIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB5b3UgZG8gLS1mdHAtbWV0aG9kIFtNRVRIT0RdLCB3aGVyZSBbTUVUSE9EXSBpcwogIG9uZSBvZiAibXVsdGljd2QiLCAibm9jd2QiIG9yICJzaW5nbGVjd2QiLikKCiAgV2hhdCBmZWVkYmFjayBJJ20gaW50ZXJlc3RlZCBpbjoKCiAgMSAtIERvIHRoZXkgd29yayBhdCBhbGw/IERvIHlvdSBmaW5kIHNlcnZlcnMgd2hlcmUgb25lIG9mIHRoZXNlIGRvbid0IHdvcms/CgogIDIgLSBXaGF0IHdvdWxkIHByb3BlciBuYW1lcyBmb3IgdGhlIG9wdGlvbiBhbmQgaXRzIGFyZ3VtZW50cyBiZSwgaWYgd2UKICAgICAgY29uc2lkZXIgdGhpcyBmZWF0dXJlIGdvb2QgZW5vdWdoIHRvIGdldCBpbmNsdWRlZCBhbmQgZG9jdW1lbnRlZCBpbgogICAgICB1cGNvbWluZyByZWxlYXNlcz8KCiAgMyAtIFNob3VsZCB3ZSBtYWtlIGxpYmN1cmwgYWJsZSB0byAid2FsayB0aHJvdWdoIiB0aGVzZSBvcHRpb25zIGluIGNhc2Ugb2YKICAgICAgKHBhdGggcmVsYXRlZCkgZmFpbHVyZXMsIG9yIHNob3VsZCBpdCBmYWlsIGFuZCBsZXQgdGhlIHVzZXIgcmVkbyBhbnkKICAgICAgcG9zc2libGUgcmV0cmllcz8KCiAgKFRoaXMgb3B0aW9uIGlzIG5vdCBkb2N1bWVudGVkIGluIGFueSBtYW4gcGFnZSBqdXN0IHlldCBzaW5jZSBJJ20gbm90IHN1cmUKICB0aGVzZSBuYW1lcyB3aWxsIGJlIHVzZWQgb3IgaWYgdGhlIGZ1bmN0aW9uYWxpdHkgd2lsbCBlbmQgdXAgZXhhY3RseSBsaWtlCiAgdGhpcy4gIEFuZCBmb3IgdGhlIHNhbWUgcmVhc29ucyB3ZSBoYXZlIG5vIHRlc3QgY2FzZXMgZm9yIHRoZXNlIHlldC4pCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwNikKLSBXaGVuIHVzaW5nIGEgYmFkIHBhdGggb3ZlciBGVFAsIGFzIGluIHdoZW4gbGliY3VybCBjb3VsZG4ndCBDV0QgaW50byBhbGwKICBnaXZlbiBzdWJkaXJzLCBsaWJjdXJsIHdvdWxkIHN0aWxsICJyZW1lbWJlciIgdGhlIGZ1bGwgcGF0aCBhcyBpZiBpdCBpcyB0aGUKICBjdXJyZW50IGRpcmVjdG9yeSBsaWJjdXJsIGlzIGluIHNvIHRoYXQgdGhlIG5leHQgY3VybF9lYXN5X3BlcmZvcm0oKSB3b3VsZAogIGdldCByZWFsbHkgY29uZnVzZWQgaWYgaXQgdHJpZWQgdGhlIHNhbWUgcGF0aCBhZ2FpbiAtIGFzIGl0IHdvdWxkIG5vdCBpc3N1ZQogIGFueSBDV0QgY29tbWFuZHMgYXQgYWxsLCBhc3N1bWluZyBpdCBpcyBhbHJlYWR5IGluIHRoZSAicHJvcGVyIiBkaXIuCgogIFN0YXJ0aW5nIG5vdywgYSBmYWlsZWQgQ1dEIGNvbW1hbmQgc2V0cyBhIGZsYWcgdGhhdCBwcmV2ZW50cyB0aGUgcGF0aCB0byBiZQogICJyZW1lbWJlcmVkIiBhZnRlciByZXR1cm5pbmcuCgpEYW5pZWwgKDcgSmFudWFyeSAyMDA2KQotIE1pY2hhZWwgSmFobiBmaXhlZCBzbyB0aGF0IHRoZSBzZWNvbmQgQ09OTkVDVCB3aGVuIGRvaW5nIEZUUCBvdmVyIGEgSFRUUAogIHByb3h5IGFjdHVhbGx5IHVzZWQgYSBuZXcgY29ubmVjdGlvbiBhbmQgbm90IHNlbnQgdGhlIHNlY29uZCByZXF1ZXN0IG9uIHRoZQogIGZpcnN0IHNvY2tldCEKCkRhbmllbCAoNiBKYW51YXJ5IDIwMDYpCi0gQWxleGFuZGVyIExhemljIG1hZGUgdGhlIGJ1aWxkY29uZiBydW4gdGhlIGJ1aWxkY29uZiBpbiB0aGUgYXJlcyBkaXIgaWYgdGhhdAogIGlzIHByZXNlbnQgaW5zdGVhZCBvZiB0cnlpbmcgdG8gbWltaWMgdGhhdCBzY3JpcHQgaW4gY3VybCdzIGJ1aWxkY29uZgogIHNjcmlwdC4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDYpCi0gQW5kcmVzIEdhcmNpYSBtYWRlIHRoZSBURlRQIHRlc3Qgc2VydmVyIGJ1aWxkIHdpdGggbWluZ3cuCkRhbmllbCAoMTYgRGVjZW1iZXIgMjAwNSkKLSBKZWFuIEphY3F1ZXMgRHJvdWluIHBvaW50ZWQgb3V0IHRoYXQgeW91IGNvdWxkIG9ubHkgaGF2ZSBhIHVzZXIgbmFtZSBvcgogIHBhc3N3b3JkIG9mIDEyNyBieXRlcyBvciBsZXNzIGVtYmVkZGVkIGluIGEgVVJMLCB3aGVyZSBhY3R1YWxseSB0aGUgY29kZQogIHVzZXMgYSAyNTUgYnl0ZSBidWZmZXIgZm9yIGl0ISBNb2RpZmllZCBub3cgdG8gdXNlIHRoZSBmdWxsIGJ1ZmZlciBzaXplLgoKRGFuaWVsICgxMiBEZWNlbWJlciAyMDA1KQotIERvdiBNdXJpayBjb3JyZWN0ZWQgdGhlIEhUVFBfT05MWSBkZWZpbmUgdG8gZGlzYWJsZSB0aGUgVEZUUCBzdXBwb3J0IHByb3Blcmx5CgpWZXJzaW9uIDcuMTUuMSAoNyBEZWNlbWJlciAyMDA1KQoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDUpCi0gRnVsbCB0ZXh0IGhlcmU6IGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9hZHZfMjAwNTEyMDcuaHRtbCBQb2ludGVkIG91dCBieQogIFN0ZWZhbiBFc3Nlci4KCiAgVlVMTkVSQUJJTElUWQoKICBsaWJjdXJsJ3MgVVJMIHBhcnNlciBmdW5jdGlvbiBjYW4gb3ZlcmZsb3cgYSBtYWxsb2NlZCBidWZmZXIgaW4gdHdvIHdheXMsIGlmCiAgZ2l2ZW4gYSB0b28gbG9uZyBVUkwuCgogIFRoZXNlIG92ZXJmbG93cyBoYXBwZW4gaWYgeW91CiAKICAxIC0gcGFzcyBpbiBhIFVSTCB3aXRoIG5vIHByb3RvY29sIChsaWtlICJodHRwOi8vIikgcHJlZml4LCB1c2luZyBubyBzbGFzaAogICAgICBhbmQgdGhlIHN0cmluZyBpcyAyNTYgYnl0ZXMgb3IgbG9uZ2VyLiBUaGlzIGxlYWRzIHRvIGEgc2luZ2xlIHplcm8gYnl0ZQogICAgICBvdmVyZmxvdyBvZiB0aGUgbWFsbG9jZWQgYnVmZmVyLgoKICAyIC0gcGFzcyBpbiBhIFVSTCB3aXRoIG9ubHkgYSBxdWVzdGlvbiBtYXJrIGFzIHNlcGFyYXRvciAobm8gc2xhc2gpIGJldHdlZW4KICAgICAgdGhlIGhvc3QgYW5kIHRoZSBxdWVyeSBwYXJ0IG9mIHRoZSBVUkwuIFRoaXMgbGVhZHMgdG8gYSBzaW5nbGUgemVybyBieXRlCiAgICAgIG92ZXJmbG93IG9mIHRoZSBtYWxsb2NlZCBidWZmZXIuCgogIEJvdGggb3ZlcmZsb3dzIGNhbiBiZSBtYWRlIHdpdGggdGhlIHNhbWUgaW5wdXQgc3RyaW5nLCBsZWFkaW5nIHRvIHR3byBzaW5nbGUKICB6ZXJvIGJ5dGUgb3ZlcndyaXRlcy4KCiAgVGhlIGFmZmVjdGVkIGZsYXcgY2Fubm90IGJlIHRyaWdnZXJlZCBieSBhIHJlZGlyZWN0LCBidXQgdGhlIGxvbmcgVVJMIG11c3QKICBiZSBwYXNzZWQgaW4gImRpcmVjdGx5IiB0byBsaWJjdXJsLiBJdCBtYWtlcyB0aGlzIGEgImxvY2FsIiBwcm9ibGVtLiBPZgogIGNvdXJzZSwgbG90cyBvZiBwcm9ncmFtcyBtYXkgc3RpbGwgcGFzcyBpbiB1c2VyLXByb3ZpZGVkIFVSTHMgdG8gbGliY3VybAogIHdpdGhvdXQgZG9pbmcgbXVjaCBzeW50YXggY2hlY2tpbmcgb2YgdGhlaXIgb3duLCBhbGxvd2luZyBhIHVzZXIgdG8gZXhwbG9pdAogIHRoaXMgdnVsbmVyYWJpbGl0eS4KCiAgVGhlcmUgaXMgbm8ga25vd24gZXhwbG9pdCBhdCB0aGUgdGltZSBvZiB0aGlzIHdyaXRpbmcuCgoKRGFuaWVsICgyIERlY2VtYmVyIDIwMDUpCi0gSmFtaWUgTmV3dG9uIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCdzIGZpbGU6Ly8gY29kZSB3b3VsZCBjbG9zZSgpIGEgemVybwogIGZpbGUgZGVzY3JpcHRvciBpZiBnaXZlbiBhIG5vbi1leGlzdGluZyBmaWxlLgoKRGFuaWVsICgyNCBOb3ZlbWJlciAyMDA1KQotIERvdWcgS2F1Zm1hbiBwcm92aWRlZCBhIHNldCBvZiBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIERKR1BQCiAgYWdhaW4gdXNpbmcgY29uZmlndXJlLgoKLSBZYW5nIFRzZSBwcm92aWRlZCBhIHdob2xlIHNlcmllcyBvZiBwYXRjaGVzIHRvIGNsZWFyIHVwIGNvbXBpbGVyIHdhcm5pbmdzIG9uCiAgTVNWQyA2LgoKRGFuaWVsICgxNyBOb3ZlbWJlciAyMDA1KQotIEkgZXh0ZW5kZWQgYSBwYXRjaCBmcm9tIERhdmlkIFNoYXcgdG8gbWFrZSBsaWJjdXJsIF9hbHdheXNfIHByb3ZpZGUgYW4gZXJyb3IKICBzdHJpbmcgaW4gdGhlIGdpdmVuIGVycm9yIGJ1ZmZlciB0byBhZGRyZXNzIHRoZSBmbGF3IG1lbnRpb24gb24gMjEgc2VwIDIwMDUuCgpEYW5pZWwgKDE2IE5vdmVtYmVyIDIwMDUpCi0gQXBwbGllZCBBbGJlcnQgQ2hpbidzIHBhdGNoIHRoYXQgbWFrZXMgdGhlIGxpYmN1cmwucGMgcGtnY29uZmlnIGZpbGUgZ2V0CiAgaW5zdGFsbGVkIG9uICdtYWtlIGluc3RhbGwnIHRpbWUuCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDUpCi0gUXVhZ21pcmUgcmVwb3J0ZWQgdGhhdCBoZSBuZWVkZWQgdG8gcmFpc2UgYSBOVExNIGJ1ZmZlciBmb3IgU1NQSSB0byB3b3JrCiAgcHJvcGVybHkgZm9yIGEgY2FzZSwgYW5kIHNvIHdlIGRpZC4gV2UgcmFpc2VkIGl0IGV2ZW4gZm9yIG5vbi1TU1BJIGJ1aWxkcwogIGJ1dCBpdCBzaG91bGQgbm90IGRvIGFueSBoYXJtLiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzU2NzE1CgotIEphbiBLdW5kZXIncyBkZWJpYW4gYnVnIHJlcG9ydAogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMzg2ODAgaWRlbnRpZmllZCBhIHdlaXJkCiAgZXJyb3IgbWVzc2FnZSBmb3Igd2hlbiB5b3UgdHJ5IHRvIHVwbG9hZCBhIGZpbGUgYW5kIHRoZSByZXF1ZXN0ZWQgZGlyZWN0b3J5CiAgZG9lc24ndCBleGlzdCBvbiB0aGUgdGFyZ2V0IHNlcnZlci4KCi0gWWFuZyBUc2UgZml4ZWQgY29tcGlsZXIgd2FybmluZ3MgaW4gbGliL3NzbHVzZS5jIHdpdGggT3BlblNTTCAwLjkuOCBhbmQgaW4KICBsaWIvbWVtZGVidWcuaCB0aGF0IHNob3dlZCB1cCBpbiBoaXMgbXN2YyBidWlsZHMuCgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDUpCi0gRGViaWFuIGJ1ZyByZXBvcnQgMzM4NjgxIGJ5IEphbiBLdW5kZXI6IG1ha2UgY3VybCBiZXR0ZXIgZGV0ZWN0IGFuZCByZXBvcnQKICBiYWQgbGltaXQtcmF0ZSB1bml0czoKICBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzM4NjgxIE5vdyBjdXJsIHdpbGwgcmV0dXJuCiAgZXJyb3IgaWYgYSBiYWQgdW5pdCBpcyB1c2VkLgoKLSBUaGFua3MgdG8gdGhpcyBuaWNlIHN1bW1hcnkgb2YgcG9sbCgpIGltcGxlbWVudGF0aW9uczoKICBodHRwOi8vd3d3LmdyZWVuZW5kLm9yZy51ay9yamsvMjAwMS8wNi9wb2xsLmh0bWwgYW5kIGZ1cnRoZXIgdGVzdHMgYnkgRXVnZW5lCiAgS290bHlhcm92LCB3ZSBub3cga25vdyB0aGF0IGN5Z3dpbidzIHBvbGwgcmV0dXJucyBvbmx5IFBPTExIVVAgb24gcmVtb3RlCiAgY29ubmVjdGluIGNsb3N1cmUgc28gd2UgY2hlY2sgZm9yIHRoYXQgY2FzZSAodG9vKSBhbmQgcmUtZW5hYmxlIHBvbGwgZm9yCiAgY3lnd2luIGJ1aWxkcy4KCkRhbmllbCAoMTIgTm92ZW1iZXIgMjAwNSkKLSBFdWdlbmUgS290bHlhcm92IGZvdW5kIG91dCB0aGF0IGN5Z3dpbidzIHBvbGwoKSBmdW5jdGlvbiBpc24ndCBkb2luZyB0aGluZ3MKICByaWdodDogaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2FyY2hpdmUtMjAwNS0xMS8wMDQ1Lmh0bWwgc28gd2Ugbm93IGRpc2FibGUKICBwb2xsKCkgYW5kIHVzZSBzZWxlY3QoKSBvbiBjeWd3aW4gdG9vICh3ZSBhbHJlYWR5IGRvIHRoZSBzYW1lIGNob2ljZSBvbiBNYWMKICBPUyBYKQoKLSBEaW1hIEJhcnNreSBwYXRjaGVkIHByb2JsZW0gIzEzNDg5MzA6IHRoZSBHbnVUTFMgY29kZSBjb21wbGV0ZWx5IGlnbm9yZWQKICBjbGllbnQgY2VydGlmaWNhdGVzISAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTM0ODkzMCkuCgpEYW5pZWwgKDEwIE5vdmVtYmVyIDIwMDUpCi0gRGF2aWQgTGFuZyBmaXhlZCBJUHY2IHN1cHBvcnQgZm9yIFRGVFAhCgotIEludHJvZHVjaW5nIHJhbmdlIHN0ZXBwaW5nIHRvIHRoZSBjdXJsIGdsb2JiaW5nIHN1cHBvcnQuIE5vdyB5b3UgY2FuIHNwZWNpZnkKICBzdGVwIGNvdW50ZXIgYnkgYWRkaW5nIDpbbnVtXSB3aXRoaW4gdGhlIGJyYWNrZXRzIHdoZW4gc3BlY2lmeWluZyBhIHJhbmdlOgoKICAgWzEtMTAwOjEwXQogICBbYS16OjJdCgogIElmIG5vIHN0ZXAgY291bnRlciBpcyBzZXQsIGl0IGRlZmF1bHRzIHRvIDEgYXMgYmVmb3JlOgoKICAgWzEtMTAwXQogICBbZC1oXQoKRGFuaWVsICg4IE5vdmVtYmVyIDIwMDUpCi0gUmVtb3ZlZCB0aGUgdXNlIG9mIEFJX0NBTk9OTkFNRSBpbiB0aGUgSVB2Ni1lbmFibGVkIHJlc29sdmVyIGZ1bmN0aW9ucyBzaW5jZQogIHdlIHJlYWxseSBoYXZlIG5vIHVzZSBmb3IgcmV2ZXJzZSBsb29rdXBzIG9mIHRoZSBhZGRyZXNzLgoKICBJIHRydWx5IGhvcGUgdGhlc2UgYXJlIHRoZSBsYXN0IHJldmVyc2UgbG9va3VwcyB3ZSBoYWQgbGluZ2VyaW5nIGluIHRoZQogIGNvZGUhCgotIERtaXRyeSBCYXJ0c2V2aWNoIGRpc2NvdmVyZWQgc29tZSBpc3N1ZXMgaW4gY29tcGF0aWJpbHR5IG9mIFNTUEktZW5hYmxlZAogIHZlcnNpb24gb2YgbGliY3VybCB3aXRoIGRpZmZlcmVudCBXaW5kb3dzIHZlcnNpb25zLiBDdXJyZW50IHZlcnNpb24gb2YKICBsaWJjdXJsIGltcG9ydHMgU1NQSSBmdW5jdGlvbnMgZnJvbSBzZWN1cjMyLmRsbC4gSG93ZXZlciwgdW5kZXIgV2luZG93cyBOVAogIDQuMCB0aGVzZSBmdW5jdGlvbnMgYXJlIGxvY2F0ZWQgaW4gc2VjdXJpdHkuZGxsLCB1bmRlciBXaW5kb3dzIDl4IC0gaW4KICBzZWN1cjMyLmRsbCBhbmQgV2luZG93cyAyMDAwIGFuZCBYUCBjb250YWlucyBib3RoIHRoZXNlIERMTHMgKHNlY3VyaXR5LmRsbAogIGp1c3QgZm9yd2FyZHMgY2FsbHMgdG8gc2VjdXIzMi5kbGwpLgoKICBEbWl0cnkncyBwYXRjaCBsb2FkcyBwcm9wZXIgbGlicmFyeSBkeW5hbWljYWxseSBkZXBlbmRpbmcgb24gV2luZG93cwogIHZlcnNpb24uIEZ1bmN0aW9uIEluaXRTZWN1cml0eUludGVyZmFjZSgpIGlzIHVzZWQgdG8gb2J0YWluIHBvaW50ZXJzIHRvIGFsbAogIG9mIFNTUEkgZnVuY3Rpb24gaW4gb25lIHN0cnVjdHVyZS4KCkRhbmllbCAoMzEgT2N0b2JlciAyMDA1KQotIFZpbG1vcyBOZWJlaGFqIGltcHJvdmVkIGxpYmN1cmwncyBMREFQIGFiaWxpdGllczoKCiAgVGhlIExEQVAgY29kZSBpbiBsaWJjdXJsIGNhbid0IGhhbmRsZSBMREFQIHNlcnZlcnMgb2YgTERBUHYzIG5vciBiaW5hcnkKICBhdHRyaWJ1dGVzIGluIExEQVAgb2JqZWN0cy4gU28sIEkgbWFkZSBhIHF1aWNrIHBhdGNoIHRvIGFkZHJlc3MgdGhlc2UKICBwcm9ibGVtcy4KCiAgVGhlIHNvbHV0aW9uIGlzIHNpbXBsZTogaWYgd2UgY29ubmVjdCB0byBhbiBMREFQIHNlcnZlciwgZmlyc3QgdHJ5IExEQVB2MwogICh3aGljaCBpcyB0aGUgcHJlZmVycmVkIHByb3RvY29sIGFzIG9mIG5vdykgYW5kIHRoZW4gZmFsbCBiYWNrIHRvIExEQVB2Mi4KICBJbiBjYXNlIG9mIGJpbmFyeSBhdHRyaWJ1dGVzLCB3ZSBmaXJzdCBjb252ZXJ0IHRoZW0gdG8gYmFzZTY0LCBqdXN0IGxpa2UgdGhlCiAgb3BlbmxkYXAgY2xpZW50IGRvZXMuIEl0IHVzZXMgbGRhcF9nZXRfdmFsdWVzX2xlbigpIGluc3RlYWQgb2YKICBsZGFwX2dldF92YWx1ZXMoKSB0byBiZSBhYmxlIHRvIHJldHJpZXZlIGJpbmFyeSBhdHRyaWJ1dGVzIGNvcnJlY3RseS4gSQogIGRlZmluZWQgdGhlIG5lY2Vzc2FyeSBMREFQIG1hY3JvcyBpbiBsaWIvbGRhcC5jIHRvIGJlIGFibGUgdG8gY29tcGlsZQogIGxpYmN1cmwgd2l0aG91dCB0aGUgcHJlc2VuY2Ugb2YgbGlibGRhcAoKRGFuaWVsICgyNyBPY3RvYmVyIDIwMDUpCi0gTmlzIEpvcmdlbnNlbiBmaWxlZCBidWcgcmVwb3J0ICMxMzM4NjQ4CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzg2NDgpIHdoaWNoIHJlYWxseSBpcyBtb3JlIG9mIGEKICBmZWF0dXJlIHJlcXVlc3QsIGJ1dCBhbnl3YXkuIEl0IHBvaW50ZWQgb3V0IHRoYXQgLS1tYXgtcmVkaXJzIGRpZCBub3QgYWxsb3cKICBpdCB0byBiZSBzZXQgdG8gMCwgd2hpY2ggdGhlbiB3b3VsZCByZXR1cm4gYW4gZXJyb3IgY29kZSBvbiB0aGUgZmlyc3QKICBMb2NhdGlvbjogZm91bmQuIEJhc2VkIG9uIE5pcycgcGF0Y2gsIG5vdyBsaWJjdXJsIHN1cHBvcnRzIENVUkxPUFRfTUFYUkVESVJTCiAgc2V0IHRvIDAsIG9yIC0xIGZvciBpbmZpbml0eS4gQWRkZWQgdGVzdCBjYXNlIDI3NCB0byB2ZXJpZnkuCgotIHRvbW1pbmtbYXRdcG9zdC5wbCByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICMxMzM3NzIzCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzc3MjMpIHRoYXQgY3VybCBjb3VsZCBub3QgdXBsb2FkCiAgYmluYXJ5IGRhdGEgZnJvbSBzdGRpbiBvbiBXaW5kb3dzIGlmIHRoZSBkYXRhIGNvbnRhaW5lZCBjb250cm9sLVogKGhleCAxYSkKICBzaW5jZSB0aGF0IGlzIHRyZWF0ZWQgYXMgZW5kLW9mLWZpbGUgd2hlbiByZWFkIGluIHRleHQgbW9kZS4gR2lzbGUgVmFuZW0KICBwb2ludGVkIG91dCB0aGUgZml4LCBhbmQgSSBtYWRlIGJvdGggLVQgYW5kIC0tZGF0YS1iaW5hcnkgdGFrZSBhZHZhbnRhZ2Ugb2YKICBpdC4KCi0gSmF6IEZyZXNoIHBvaW50ZWQgb3V0IHRoYXQgaWYgeW91IHVzZWQgIi1yIFtudW1iZXJdIiBhcyB3YXMgd3JvbmdseSBkZXNjcmliZWQKICBpbiB0aGUgbWFuIHBhZ2UsIGN1cmwgd291bGQgc2VuZCBhbiBpbnZhbGlkIEhUVFAgUmFuZ2U6IGhlYWRlci4gVGhlIGNvcnJlY3QKICB3YXkgd291bGQgYmUgdG8gdXNlICItciBbbnVtYmVyXS0iIG9yIGV2ZW4gIi1yIC1bbnVtYmVyXSIuIFN0YXJ0aW5nIG5vdywKICBjdXJsIHdpbGwgd2FybiBpZiB0aGlzIGlzIGRpc2NvdmVyZWQsIGFuZCBhdXRvbWF0aWNhbGx5IGFwcGVuZCBhIGRhc2ggdG8gdGhlCiAgcmFuZ2UgYmVmb3JlIHBhc3NpbmcgaXQgdG8gbGliY3VybC4KCkRhbmllbCAoMjUgT2N0b2JlciAyMDA1KQotIEFtb2wgUGF0dGVrYXIgcmVwb3J0ZWQgYSBidWcgd2l0aCBncmVhdCBkZXRhaWwgYW5kIGEgZmluZSBleGFtcGxlIGluIGJ1ZwogICMxMzI2MzA2IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzI2MzA2KS4gV2hlbiB1c2luZyB0aGUgbXVsdGkKICBpbnRlcmZhY2UgYW5kIGNvbm5lY3RpbmcgdG8gYSBob3N0IHdpdGggbXVsdGlwbGUgSVAgYWRkcmVzc2VzLCBhbmQgb25lIG9mCiAgdGhlIGFkZHJlc3NlcyBmYWlscyB0byBjb25uZWN0ICh0aGUgc2VydmVyIG11c3QgZXhpc3QgYW5kIHJlc3BvbmQsIGp1c3Qgbm90CiAgYWNjZXB0IGNvbm5lY3Rpb25zKSBsaWJjdXJsIGxlYWtzIGEgc29ja2V0IGRlc2NyaXB0b3IuIFRoYW5rcyB0byB0aGUgZmluZQogIHJlcG9ydCwgSSBjb3VsZCBmaW5kIGFuZCBmaXggdGhpcy4KCkRhbmllbCAoMjIgT2N0b2JlciAyMDA1KQotIERpbWEgQmFyc2t5IHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIEdudVRMUy1lbmFibGVkIGxpYmN1cmwgaW4gYnVnIHJlcG9ydAogICMxMzM0MzM4IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzM0MzM4KS4gV2hlbiByZWFkaW5nIGFuIFNTTAogIHN0cmVhbSBmcm9tIGEgc2VydmVyIGFuZCB0aGUgc2VydmVyIHJlcXVlc3RzIGEgInJlaGFuZHNoYWtlIiwgdGhlIGN1cnJlbnQKICBjb2RlIHNpbXBseSByZXR1cm5zIHRoaXMgYXMgYW4gZXJyb3IuIEkgaGF2ZSBubyBnb29kIHdheSB0byB0ZXN0IHRoaXMsIGJ1dAogIEkndmUgYWRkZWQgYSBjcnVkZSBhdHRlbXB0IG9mIGRlYWxpbmcgd2l0aCB0aGlzIHNpdHVhdGlvbiBzbGlnaHRseSBiZXR0ZXIgLQogIGl0IG1ha2VzIGEgYmxvY2tpbmcgaGFuZHNoYWtlIGlmIHRoaXMgaGFwcGVucy4gRG9uZSBsaWtlIHRoaXMgYmVjYXVzZSBmaXhpbmcKICB0aGlzIHRoZSAicHJvcGVyIiB3YXkgKHRoYXQgd291bGQgaGFuZHNoYWtlIGFzeW5jaHJvbm91c2x5KSB3aWxsIHJlcXVpcmUKICBxdWl0ZSBzb21lIHdvcmsgYW5kIEkgcmVhbGx5IG5lZWQgYSBnb29kIHdheSB0byB0ZXN0IHRoaXMgdG8gZG8gc3VjaCBhCiAgY2hhbmdlLgoKRGFuaWVsICgyMSBPY3RvYmVyIDIwMDUpCi0gIk9mZXIiIHJlcG9ydGVkIGEgcHJvYmxlbSB3aGVuIGxpYmN1cmwgcmUtdXNlZCBhIGNvbm5lY3Rpb24gYW5kIGZhaWxlZCB0byBkbwogIGl0LCBpdCBjb3VsZCB0aGVuIGFjY2lkZW50YWxseSBhY3R1YWxseSBjcmFzaC4gUHJlc3VtYWJseSwgdGhpcyBjb25jZXJucyBGVFAKICBjb25uZWN0aW9ucy4gIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEzMzAzMTAKCi0gVGVtcHJpbXVzIGltcHJvdmVkIHRoZSBNU1ZDIG1ha2VmaWxlIHNvIHRoYXQgdGhlIHN0YXRpYyBkZWJ1ZyBTU0wgbGlicyBhcmUKICBsaW5rZWQgdG8gdGhlIGV4ZWN1dGFibGUgYW5kIG5vdCB0byB0aGUgbGliY3VybGQubGliCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTMyNjY3NgoKLSBCcmFkZm9yZCBCcnVjZSBtYWRlIHRoZSB3aW5kb3dzIHJlc29sdmVyIGNvZGUgcHJvcGVybHkgcmV0dXJuCiAgQ1VSTEVfQ09VTEROVF9SRVNPTFZFX1BST1hZIGFuZCBDVVJMRV9DT1VMRE5UX1JFU09MVkVfSE9TVCBvbiByZXNvbHZpbmcKICBlcnJvcnMgKGFzIGRvY3VtZW50ZWQpLgoKRGFuaWVsICgyMCBPY3RvYmVyIDIwMDUpCi0gRGF2ZSBEcmliaW4gbWFkZSBsaWJjdXJsIHVuZGVyc3RhbmQgYW5kIGhhbmRsZSBjYXNlcyB3aGVuIHRoZSBzZXJ2ZXIKICAod3JvbmdseSkgc2VuZHMgKnR3byogV1dXLUF1dGhlbnRpY2F0ZSBoZWFkZXJzIGZvciBEaWdlc3QuIFdoaWxlIHRoaXMgc2hvdWxkCiAgbmV2ZXIgaGFwcGVuIGluIGEgc2FuZSB3b3JsZCwgbGliY3VybCBwcmV2aW91c2x5IGdvdCBpbnRvIGFuIGluZmluaXRlIGxvb3AKICB3aGVuIHRoaXMgb2NjdXJyZWQuIERhdmUgYWRkZWQgdGVzdCAyNzMgdG8gdmVyaWZ5IHRoaXMuCgotIFRlbXByaW11cyBpbXByb3ZlZCB0aGUgTVNWQyBtYWtlZmlsZTogIm1ha2VzIGEgYnVpbGQgb3B0aW9uIGF2YWlsYWJsZSBzbyBpZgogIHlvdSBzZXQgcnRsaWJjZmc9c3RhdGljIGZvciB0aGUgbWFrZSwgdGhlbiBpdCB3b3VsZCBidWlsZCB3aXRoIC9NVC4gVGhlCiAgZGVmYXVsdCBiZWhhdmlvdXIgaXMgL01EICh0aGUgb3JpZ2luYWwpLiIKICBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMzI2NjY1CgpEYW5pZWwgKDE0IE9jdG9iZXIgMjAwNSkKLSBSZXZlcnRlZCB0aGUgTElCQ1VSTF9WRVJTSU9OX05VTSBjaGFuZ2UgZnJvbSBPY3RvYmVyIDYuIEFzIERhdmUgRHJpYmluCiAgcmVwb3J0ZWQsIHRoZSBkZWZpbmUgaXMgdXNlZCBieSB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQgaXMgYXNzdW1lZCB0byB1c2UKICB0aGUgMHhZWVhYWlogZm9ybWF0LiBUaGlzIG1hZGUgImN1cmwtY29uZmlnIC0tdmVybnVtIiBmYWlsIGluIHRoZSA3LjE1LjAKICByZWxlYXNlIHZlcnNpb24uCgpWZXJzaW9uIDcuMTUuMCAoMTMgT2N0b2JlciAyMDA1KQoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDUpCi0gTWljaGFlbCBTdXR0b24gb2YgaURFRkVOU0UgcmVwb3J0ZWQgYW5kIEkgZml4ZWQgYSBzZWN1cml0ZnkgZmxhdyBpbiB0aGUgTlRMTQogIGNvZGUgdGhhdCB3b3VsZCBvdmVyZmxvdyBhIGJ1ZmZlciBpZiBnaXZlbiBhIHRvbyBsb25nIHVzZXIgbmFtZSBvciBkb21haW4KICBuYW1lLiBUaGlzIHdvdWxkIGhhcHBlbiBpZiB5b3UgZW5hYmxlIE5UTE0gYXV0aGVudGljYXRpb24gYW5kIGVpdGhlcgoKICBBIC0gcGFzcyBpbiBhIHVzZXIgbmFtZSBhbmQgZG9tYWluIG5hbWUgdG8gbGliY3VybCB0aGF0IHRvZ2V0aGVyIGFyZSBsb25nZXIKICAgICAgdGhhbiAxOTIgYnl0ZXMKCiAgQiAtIGFsbG93IChsaWIpY3VybCB0byBmb2xsb3cgSFRUUCAicmVkaXJlY3RzIiAoTG9jYXRpb246IGFuZCB0aGUKICAgICAgYXBwcm9wcmlhdGUgSFRUUCAzMHggcmVzcG9uc2UgY29kZSkgYW5kIHRoZSBuZXcgVVJMIGNvbnRhaW5zIGEgVVJMIHdpdGgKICAgICAgYSB1c2VyIG5hbWUgYW5kIGRvbWFpbiBuYW1lIHRoYXQgdG9nZXRoZXIgYXJlIGxvbmdlciB0aGFuIDE5MiBieXRlcwoKICBTZWUgaHR0cDovL2N1cmwuaGF4eC5zZS9kb2NzL3NlY3VyaXR5Lmh0bWwgZm9yIGZ1cnRoZXIgZGV0YWlscyBhbmQgdXBkYXRlcwoKRGFuaWVsICg1IE9jdG9iZXIgMjAwNSkKLSBEYXJyeWwgSG91c2UgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggdXNpbmcgLXogdG8gZG93bmxvYWQgZmlsZXMgZnJvbSBGVFAuCiAgSXQgdHVybmVkIG91dCB0aGF0IGlmIHRoZSBnaXZlbiB0aW1lIHN0YW1wIHdhcyBleGFjdCB0aGUgc2FtZSBhcyB0aGUgcmVtb3RlCiAgdGltZSBzdGFtcCwgdGhlIGZpbGUgd291bGQgc3RpbGwgd3JvbmdseSBiZSBkb3dubG9hZGVkLiBBZGRlZCB0ZXN0IGNhc2UgMjcyCiAgdG8gdmVyaWZ5LgoKRGFuaWVsICg0IE9jdG9iZXIgMjAwNSkKLSBEb21lbmljbyBBbmRyZW9saSBmaXhlZCBhIG1hbiBwYWdlIG1hbGZvcm1hdCBhbmQgcmVtb3ZlZCBvZGQgKDB4YTApIGJ5dGVzCiAgZnJvbSB0aGUgY29uZmlndXJlIHNjcmlwdC4KCi0gTWljaGFlbCBXYWxsbmVyIHJlcG9ydGVkIHRoYXQgdGhlIGRhdGUgcGFyc2VyIGhhZCB3cm9uZyBvZmZzZXQgc3RvcmVkIGZvcgogIHRoZSBNRVNUIGFuZCBDRVNUIHRpbWUgem9uZXMuCgpEYW5pZWwgKDI3IFNlcHRlbWJlciAyMDA1KQotIERhdmlkIFlhbiBmaWxlZCBidWcgIzEyOTkxODEgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyOTkxODEpCiAgdGhhdCBpZGVudGlmaWVkIGEgc2lsbHkgcHJvYmxlbSB3aXRoIENvbnRlbnQtUmFuZ2U6IGhlYWRlcnMgd2l0aCB0aGUgJ2J5dGVzJwogIGtleXdvcmQgd3JpdHRlbiBpbiBhIGRpZmZlcmVudCBjYXNlIHRoYW4gYWxsIGxvd2VyY2FzZSEgSXQgd291bGQgY2F1c2UgYQogIHNlZ2ZhdWx0IQoKLSBUSiBTYXVuZGVycyBvZiB0aGUgcHJvZnRwZCBwcm9qZWN0IGlkZW50aWZpZWQgYW5kIHBvaW50ZWQgb3V0IHByb2JsZW1zIHdpdGgKICB0aGUgbW9kaWZpZWQgRlRQUyBuZWdvdGlhdGlvbiBjaGFuZ2Ugb2YgQXVndXN0IDE5IDIwMDUuIFRodXMsIHdlIHJldmVydCB0aGUKICBjaGFuZ2UgYmFjayB0byBwcmUtNy4xNC4xIHN0YXR1cy4KCkRhbmllbCAoMjEgU2VwdGVtYmVyIDIwMDUpCi0gRml4ZWQgImN1dCBvZmYiIHNlbnRlbmNlIGluIHRoZSBsaWJjdXJsLXR1dG9yaWFsIG1hbiBwYWdlOgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjkzMDUKCi0gQ2xhcmlmaWVkIGluIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIHdoYXQgdGhlIGRlZmF1bHQKICBDVVJMT1BUX1dSSVRFRlVOQ1RJT04gYW5kIENVUkxPUFRfV1JJVEVEQVRBIG1lYW46CiAgaHR0cDovL2J1Z3MuZGViaWFuLm9yZy9jZ2ktYmluL2J1Z3JlcG9ydC5jZ2k/YnVnPTMyOTMxMQoKLSBDbGFyaWZpZWQgaW4gdGhlIGN1cmxfZWFzeV9zZXRvcHQgbWFuIHBhZ2UgdGhhdCBDVVJMT1BUX0VSUk9SQlVGRkVSCiAgc29tZXRpbWVzIGRvZXNuJ3QgZmlsbCBpbiB0aGUgYnVmZmVyIGV2ZW4gdGhvdWdoIGl0IGlzIHN1cHBvc2VkIHRvOgogIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMjkzMTMKCi0gV2hlbiBDVVJMRV9VUkxfTUFMRk9STUFUIGlzIHJldHVybmVkIGR1ZSB0byBhIG1pc3NpbmcgVVJMLCBpdCBub3cgaGFzIGFuCiAgZXJyb3Igc3RyaW5nIHNldC4KCkRhbmllbCAoMTkgU2VwdGVtYmVyIDIwMDUpCi0gRG1pdHJ5IEJhcnRzZXZpY2ggbWFkZSB0aGUgU1NQSSBzdXBwb3J0IHdvcmsgb24gV2luZG93cyA5eCBhcyB3ZWxsLgoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwNSkKLSBBZGRlZCBhIFRGVFAgc2VydmVyIHRvIHRoZSB0ZXN0IHN1aXRlIGFuZCBtYWRlIHRoZSB0ZXN0IHN1aXRlIGNhcGFibGUgb2YKICB1c2luZyBpdC4KCkRhbmllbCAoNyBTZXB0ZW1iZXIgMjAwNSkKLSBCZW4gTWFkc2VuJ3MgZGV0YWlsZWQgcmVwb3J0cyB0aGF0IGZ1bm5pbHkgZW5vdWdoIG9ubHkgb2NjdXJyZWQgd2l0aCBjZXJ0YWluCiAgZ2xpYmMgdmVyc2lvbnMgdHVybmVkIG91dCB0byBiZSBjdXJsIHVzaW5nIGFuIGFscmVhZHkgY2xvc2VkIGZpbGUgaGFuZGxlCiAgZHVyaW5nIGNlcnRhaW4gY29uZGl0aW9ucyAobGlrZSB3aGVuIHNhdmluZyBGVFAgc2VydmVyICJoZWFkZXJzIikuCgotIFNjb3R0IERhdmlzIGhlbHBlZCBtZSB0cmFjayBkb3duIGEgcHJvYmxlbSBpbiB0aGUgdGVzdCBIVFRQIHNlcnZlciB0aGF0IG1hZGUKICB0ZXN0IGNhc2UgNTYgd3JvbmdseSBmYWlsIGF0IHRpbWVzLiBJdCB0dXJuZWQgb3V0IGl0IHdhcyBkdWUgdG8gdGhlIHNlcnZlcgogIGZpbmRpbmcgdGhlIGVuZCBvZiBhIGNodW5rZWQtZW5jb2RlZCBQT1NUIHRvbyBlYXJseS4KCkRhbmllbCAoNiBTZXB0ZW1iZXIgMjAwNSkKLSBOb3cgY3VybCB3YXJucyBpZiBhbiB1bmtub3duIHZhcmlhYmxlIGlzIHVzZWQgaW4gdGhlIC13Ly0td3JpdGVvdXQgYXJndW1lbnQuCgpEYW5pZWwgKDQgU2VwdGVtYmVyIDIwMDUpCi0gSSBhcHBsaWVkIE5pY29sYXMgRnJhbudvaXMnIG1hbiBwYWdlIHBhdGNoIGhlIHBvc3RlZCB0byB0aGUgRGViaWFuIGJ1ZwogIHRyYWNrZXIuIEl0IGNvcnJlY3RlZCB0d28gbGluZXMgdGhhdCBzdGFydGVkIHdpdGggYXBvc3Ryb3BoZXMsIHdoaWNoIGlzbid0CiAgbGVnYWwgbnJvZmYgZm9ybWF0LiBodHRwOi8vYnVncy5kZWJpYW4ub3JnL2NnaS1iaW4vYnVncmVwb3J0LmNnaT9idWc9MzI2NTExCgotIEFkZGVkIC0tZnRwLXNraXAtcGFzdi1pcCB0byB0aGUgY29tbWFuZCBsaW5lIHRvb2wsIHRoYXQgc2V0cyB0aGUgbmV3CiAgQ1VSTE9QVF9GVFBfU0tJUF9QQVNWX0lQIG9wdGlvbi4gSXQgbWFrZXMgbGliY3VybCByZS11c2UgdGhlIGNvbnRyb2wKICBjb25uZWN0aW9uJ3MgSVAgYWRkcmVzcyB3aGVuIHNldHRpbmcgdXAgdGhlIGRhdGEgY29ubmVjdGlvbiBpbnN0ZWFkIG9mCiAgZXh0cmFjdHRpbmcgdGhlIElQIGFkZHJlc3MgZnJvbSB0aGUgUEFTViByZXNwb25zZS4gSXQgaGFzIHR1cm5lZCBvdXQgdGhpcwogIGZlYXR1cmUgaXMgZnJlcXVlbnRseSBuZWVkZWQgYnkgcGVvcGxlIHRvIGNpcmN1bXZlbnQgc2lsbHkgc2VydmVycyBhbmQgc2lsbHkKICBmaXJld2FsbHMsIGVzcGVjaWFsbHkgd2hlbiBGVFBTIGlzIHVzZWQgYW5kIHRoZSBQQVNWIGNvbW1hbmQtcmVzcG9uc2UgaXMKICBzZW50IGVuY3J0eXBlZC4KCiAgU3BvbnNvcmVkIGJ5IENVKkFuc3dlcnMKCkRhbmllbCAoMSBTZXB0ZW1iZXIgMjAwNSkKLSBKb2huIEtlbGx5IGFkZGVkIFRGVFAgc3VwcG9ydCB0byBsaWJjdXJsLiBBIGJ1bmNoIG9mIG5ldyBlcnJvciBjb2RlcyB3YXMKICBhZGRlZC4gVE9ETzogYWRkIHRoZW0gdG8gZG9jcy4gYWRkIFRGVFAgc2VydmVyIHRvIHRlc3Qgc3VpdGUuIGFkZCBURlRQIHRvCiAgbGlzdCBvZiBwcm90b2NvbHMgd2hlcmVldmVyIHRob3NlIGFyZSBtZW50aW9uZWQuCgpWZXJzaW9uIDcuMTQuMSAoMSBTZXB0ZW1iZXIgMjAwNSkKCkRhbmllbCAoMjkgQXVndXN0IDIwMDUpCi0gS2V2aW4gTHVzc2llciBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBjdXJsbGliLmRzcCBhbmQgaG93IHRvIGZpeCBpdC4KCi0gSWdvciBQb2x5YWtvdiBmaXhlZCBhIHJhdGhlciBuYXN0eSBwcm9ibGVtIHdpdGggdGhlIHRocmVhZGVkIG5hbWUgcmVzb2x2ZXIKICBmb3IgV2luZG93cywgdGhhdCBjb3VsZCBsZWFkIHRvIGFuIEFjY2VzcyBWaW9sYXRpb24gd2hlbiB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgd2FzIHVzZWQgZHVlIHRvIGFuIGlzc3VlIHdpdGggaG93IHRoZSByZXNvbHZlciB0aHJlYWQgd2FzIGFuZCB3YXMgbm90CiAgdGVybWluYXRlZC4KCi0gU2ltb24gSm9zZWZzc29uIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGFsbG93cyBjdXJsIHRvIGdldCBidWlsdCB0byB1c2UgR05VIEdTUwogIGluc3RlYWQgb2YgTUlUL0hlaW1kYWwgZm9yIEdTUyBjYXBhYmlsaXRpZXMuCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDA1KQotIFRvYnkgUGV0ZXJzb24gYWRkZWQgQ1VSTE9QVF9JR05PUkVfQ09OVEVOVF9MRU5HVEggdG8gdGhlIGxpYnJhcnksIGFjY2Vzc2libGUKICBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB3aXRoIC0taWdub3JlLWNvbnRlbnQtbGVuZ3RoLiBUaGlzIHdpbGwgbWFrZSBpdAogIGVhc2llciB0byBkb3dubG9hZCBmaWxlcyBmcm9tIEFwYWNoZSAxLnggKGFuZCBzaW1pbGFyKSBzZXJ2ZXJzIHRoYXQgYXJlCiAgc3RpbGwgaGF2aW5nIHByb2JsZW1zIHNlcnZpbmcgZmlsZXMgbGFyZ2VyIHRoYW4gMiBvciA0IEdCLiBXaGVuIHRoaXMgb3B0aW9uCiAgaXMgZW5hYmxlZCwgY3VybCB3aWxsIHNpbXBseSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBzZXJ2ZXIgdG8gY2xvc2UgdGhlCiAgY29ubmVjdGlvbiB0byBzaWduYWwgZW5kIG9mIHRyYW5zZmVyLiBJIHdyb3RlIHRlc3QgY2FzZSAyNjkgdGhhdCBydW5zIGEKICBzaW1wbGUgdGVzdCB0byB2ZXJpZnkgdGhhdCB0aGlzIHdvcmtzLgoKLSAoVHJ5aW5nIGhhcmQgdG8gZXhjbHVkZSBlbW90aW9ucyBub3cuKSB2YWxncmluZCB2ZXJzaW9uIDMgc3VkZGVubHkgcmVuYW1lZAogIHRoZSAtLWxvZ2ZpbGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0byAtLWxvZy1maWxlLCBhbmQgdGh1cyB0aGUgdGVzdCBzY3JpcHQKICB2YWxncmluZCBhdXRvZGV0ZWN0aW9uIG5vdyBoYXMgeWV0IGFub3RoZXIgdmVyc2lvbiBjaGVjayB0byBkbyBhbmQgdGhlbiBpdAogIGFsdGVycyB0aGUgdmFsZ3JpbmQgY29tbWFuZCBsaW5lIGFjY29yZGluZ2x5LgoKLSBGaXhlZCBDQSBjZXJ0IHZlcmlmaWNhdGlvbiB1c2luZyBHbnVUTFMgd2l0aCB0aGUgZGVmYXVsdCBidW5kbGUsIHdoaWNoCiAgcHJldmlvdXNseSBmYWlsZWQgZHVlIHRvIEdudVRMUyBub3QgYWxsb3dpbmcgeDUwOSB2MSBDQSBjZXJ0cyBieSBkZWZhdWx0LgogIFJhbHBoIE1pdGNoZWxsIHJlcG9ydGVkLgoKRGFuaWVsICgxOSBBdWd1c3QgMjAwNSkKLSBOb3JiZXJ0IE5vdm90bnkgaGFkIHByb2JsZW1zIHdpdGggRlRQUyBhbmQgaGUgaGVscGVkIG1lIHdvcmsgb3V0IGEgcGF0Y2gKICB0aGF0IG1hZGUgY3VybCBydW4gZmluZSBpbiBoaXMgZW5kLiBUaGUga2V5IHdhcyB0byBtYWtlIHN1cmUgd2UgZG8gdGhlCiAgU1NML1RMUyBuZWdvdGlhdGlvbiBpbW1lZGlhdGVseSBhZnRlciB0aGUgVENQIGNvbm5lY3QgaXMgZG9uZSBhbmQgbm90IGFmdGVyCiAgYSBmZXcgb3RoZXIgY29tbWFuZHMgaGF2ZSBiZWVuIHNlbnQgbGlrZSB3ZSBkaWQgcHJldmlvdXNseS4gSSBkb24ndCBjb25zaWRlcgogIHRoaXMgY2hhbmdlIG5lY2Vzc2FyeSB0byBvYmV5IHRoZSBzdGFuZGFyZHMsIEkgdGhpbmsgdGhpcyBzZXJ2ZXIgaXMgcGlja2llcgogIHRoYW4gd2hhdCB0aGUgc3BlY3MgYWxsb3cgaXQgdG8gYmUsIGJ1dCBJIGNhbid0IHNlZSBob3cgdGhpcyBtb2RpZmllZAogIGxpYmN1cmwgY29kZSBjYW4gYWRkIGFueSBwcm9ibGVtcyB0byB0aG9zZSB3aG8gYXJlIGludGVycHJldGluZyB0aGUKICBzdGFuZGFyZHMgbW9yZSBsaWJlcmFsbHkuCgpEYW5pZWwgKDE3IEF1Z3VzdCAyMDA1KQotIEplZmYgUG9obG1leWVyIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBhc2sgbGliY3VybCB0byBsb2FkIGEgY29va2llZmlsZSAod2l0aAogIENVUkxPUFRfQ09PS0lFRklMRSksIGFkZCBhIGNvb2tpZSAod2l0aCBDVVJMT1BUX0NPT0tJRUxJU1QpLCB0ZWxsIGl0IHRvCiAgd3JpdGUgdGhlIHJlc3VsdCB0byBhIGdpdmVuIGNvb2tpZSBqYXIgYW5kIHRoZW4gbmV2ZXIgYWN0dWFsbHkgY2FsbAogIGN1cmxfZWFzeV9wZXJmb3JtKCkgLSB0aGUgZ2l2ZW4gZmlsZShzKSB0byByZWFkIHdhcyBuZXZlciByZWFkIGJ1dCB0aGUKICBvdXRwdXQgZmlsZSB3YXMgd3JpdHRlbiBhbmQgdGh1cyBpdCBjYXVzZWQgYSAiZnVubnkiIHJlc3VsdC4KCi0gV2hpbGUgZG9pbmcgc29tZSB0ZXN0cyBmb3IgdGhlIGJ1ZyBhYm92ZSwgSSBub3RpY2VkIHRoYXQgRmlyZWZveCBnZW5lcmF0ZXMKICBsYXJnZSBudW1iZXJzIChmb3IgdGhlIGV4cGlyZSB0aW1lKSBpbiB0aGUgY29va2llcy50eHQgZmlsZSBhbmQgbGliY3VybAogIGRpZG4ndCB0cmVhdCB0aGVtIHByb3Blcmx5LiBOb3cgaXQgZG9lcy4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDUpCi0gQWRkZWQgbW9yZSB2ZXJib3NlICJ3YXJuaW5nIiBtZXNzYWdlcyB0byB0aGUgY3VybCBjbGllbnQgZm9yIGNhc2VzIHdoZXJlIGl0CiAgZmFpbHMgdG8gb3Blbi9yZWFkIGZpbGVzIGV0YyB0byBoZWxwIHVzZXJzIGRpYWdub3NlIHdoeSBpdCBkb2Vzbid0IGRvIHdoYXQKICB5b3UnZCBleHBlY3QgaXQgdG8uIENvbnZlcnRlZCBsb3RzIG9mIG9sZCBtZXNzYWdlcyB0byB1c2UgdGhlIG5ldyBnZW5lcmljCiAgZnVuY3Rpb24gSSB3cm90ZSBmb3IgdGhpcyBwdXJwb3NlLgoKRGFuaWVsICgxMyBBdWd1c3QgMjAwNSkKLSBKYW1lcyBCdXJzYSBpZGVudGlmaWVkIGEgbGliY3VybCBIVFRQIGJ1ZyBhbmQgYSBnb29kIHdheSB0byByZXBlYXQgaXQuIElmIGEKICBzaXRlIHJlc3BvbmRzIHdpdGggYmFkIEhUVFAgcmVzcG9uc2UgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYW55IGhlYWRlciBhdCBhbGwsCiAgb25seSBhIHJlc3BvbnNlIGJvZHksIGFuZCB0aGUgd3JpdGUgY2FsbGJhY2sgcmV0dXJucyAwIHRvIGFib3J0IHRoZQogIHRyYW5zZmVyLCBpdCBkaWRuJ3QgaGF2ZSBhbnkgcmVhbCBlZmZlY3QgYnV0IHRoZSB3cml0ZSBjYWxsYmFjayB3b3VsZCBiZQogIGNhbGxlZCBvbmNlIG1vcmUgYW55d2F5LgoKRGFuaWVsICgxMiBBdWd1c3QgMjAwNSkKLSBCYXNlZCBvbiBSaWNoYXJkIENsYXl0b24ncyByZXBvcnRzLCBJIGZvdW5kIG91dCB0aGF0IHVzaW5nIGN1cmwgLWQgQGZpbGVuYW1lCiAgd2hlbiAnZmlsZW5hbWUnIHdhcyBub3QgcG9zc2libGUgdG8gYWNjZXNzIG1hZGUgY3VybCB1c2UgYSBHRVQgcmVxdWVzdAogIGluc3RlYWQuCgotIFRoZSB0aW1lIGNvbmRpdGlvbiBpbGxlZ2FsIHN5bnRheCB3YXJuaW5nIGlzIG5vdyBpbmhpYml0ZWQgaWYgLXMgaXMgdXNlZC4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDUpCi0gTWFyaW8gU2Nocm9lZGVyIGZvdW5kIG91dCB0aGF0IG9uZSBvZiB0aGUgZGVidWcgY2FsbGJhY2tzIGNhbGxzIHRoYXQgcmVnYXJkcwogIFNTTCBkYXRhIHdpdGggdGhlIENVUkxJTkZPX1RFWFQgdHlwZSBjbGFpbWVkIHRoYXQgdGhlIGRhdGEgd2FzIG9uZSBieXRlCiAgbGFyZ2VyIHRoYW4gaXQgYWN0dWFsbHkgaXMsIHRodXMgZmFsc2VseSB0ZWxsaW5nIHRoZSBhcHBsaWNhdGlvbiB0aGF0IHRoZQogIHRlcm1pbmF0aW5nIHplcm8gd2FzIHBhcnQgb2YgdGhlIGRhdGEuCgpEYW5pZWwgKDkgQXVndXN0IDIwMDUpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGZpeGVkIHRoZSBvZmZzZXRzIHVzZWQgZm9yIGRhdGUgcGFyc2luZ3Mgd2hlbiB0aGUgdGltZQogIHpvbmUgbmFtZSBvZiBhIGRheWxpZ2h0IHNhdmluZ3MgdGltZSB3YXMgdXNlZC4gRm9yIGV4YW1wbGUsIFBEVCB2cyBQRFMuIFRoaXMKICBmbGF3IHdhcyBpbnRyb2R1Y2VkIHdpdGggdGhlIG5ldyBkYXRlIHBhcnNlciAoMTEgc2VwIDIwMDQgLSA3LjEyLjIpLgogIEZvcnR1bmF0ZWx5LCBubyB3ZWIgc2VydmVyIG9yIGNvb2tpZSBzdHJpbmcgZXRjIHNob3VsZCBiZSB1c2luZyBzdWNoIHRpbWUKICB6b25lIG5hbWVzIHRodXMgbGltaXRpbmcgdGhlIGVmZmVjdCBvZiB0aGlzIGJ1Zy4KCkRhbmllbCAoOCBBdWd1c3QgMjAwNSkKLSBKb24gR3J1YmJzIGZpbGVkIGJ1ZyByZXBvcnQgIzEyNDk5NjIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTI0OTk2Mikgd2hpY2ggaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIE5UTE0gb24gYSBIVFRQIHByb3h5IGlmIGFuIEZUUCBVUkwgd2FzIGdpdmVuLiBsaWJjdXJsIG5vdyBwcm9wZXJseQogIHN3aXRjaGVzIHRvIHB1cmUgSFRUUCBpbnRlcm5hbGx5IHdoZW4gYW4gSFRUUCBwcm94eSBpcyB1c2VkLCBldmVuIGZvciBGVFAKICBVUkxzLiBUaGUgcHJvYmxlbSB3b3VsZCBhbHNvIG9jY3VyIHdpdGggb3RoZXIgbXVsdGktcGFzcyBhdXRoIG1ldGhvZHMuCgpEYW5pZWwgKDcgQXVndXN0IDIwMDUpCi0gV2hlbiBjdXJsIGlzIGJ1aWx0IHdpdGggR251VExTLCBjdXJsLWNvbmZpZyBkaWRuJ3QgaW5jbHVkZSAiU1NMIiB3aGVuCiAgLS1mZWF0dXJlcyB3YXMgdXNlZC4KCkRhbmllbCAoMjggSnVseSAyMDA1KQotIElmIGFueSBvZiB0aGUgb3B0aW9ucyBDVVJMT1BUX0hUVFBHRVQsIENVUkxPUFRfUE9TVCBhbmQgQ1VSTE9QVF9IVFRQUE9TVCBpcwogIHNldCB0byAxLCBDVVJMT1BUX05PQk9EWSB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IGJlIHNldCB0byAwLgoKRGFuaWVsICgyNyBKdWx5IDIwMDUpCi0gRGFuIEZhbmRyaWNoIGNoYW5nZXMgb3ZlciB0aGUgbGFzdCB3ZWVrOiBmaXhlZCBudW1lcm91cyBtaW5vciBjb25maWd1cmUKICBvcHRpb24gcGFyc2luZyBmbGF3czogLS13aXRob3V0LWdudXRscywgLS13aXRob3V0LXNwbmVnbyAtLXdpdGhvdXQtZ3NzYXBpCiAgYW5kIC0td2l0aG91dC1rcmI0LiBTcGVsbGZpeGVkIHNldmVyYWwgZXJyb3IgbWVzc2FnZXMuCgotIFBldGVyaXMgS3J1bWlucyBhZGRlZCBDVVJMT1BUX0NPT0tJRUxJU1QgYW5kIENVUkxJTkZPX0NPT0tJRUxJU1QsIHdoaWNoIGlzIGEKICBzaW1wbGUgaW50ZXJmYWNlIHRvIGV4dHJhY3RpbmcgYW5kIHNldHRpbmcgY29va2llcyBpbiBsaWJjdXJsJ3MgaW50ZXJuYWwKICAiY29va2llIGphciIuIFNlZSB0aGUgbmV3IGNvb2tpZV9pbnRlcmZhY2UuYyBleGFtcGxlIGNvZGUuCgpEYW5pZWwgKDEzIEp1bHkgMjAwNSkKLSBEaWVnbyBDYXNvcnJhbiBwcm92aWRlZCBwYXRjaGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIEFtaWdhIGFnYWluLgoKRGFuaWVsICgxMiBKdWx5IDIwMDUpCi0gQWRyaWFuIFNjaHV1ciBhZGRlZCB0cmFpbGVyIHN1cHBvcnQgaW4gdGhlIGNodW5rZWQgZW5jb2Rpbmcgc3RyZWFtLiBUaGUKICB0cmFpbGVyIGlzIHRoZW4gc2VudCB0byB0aGUgbm9ybWFsIGhlYWRlciBjYWxsYmFjay9zdHJlYW0uIEkgd3JvdGUgdXAgdGVzdAogIGNhc2UgMjY2IHRvIHZlcmlmeSB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eS4gRG8gbm90ZSB0aGF0IHRlc3QgY2FzZSAzNAogIGNvbnRhaW5zIGEgZmxhd2VkIGNodW5rZWQgZW5jb2Rpbmcgc3RyZWFtIHRoYXQgc3RpbGwgd29ya3MgdGhlIHNhbWUuCgpEYW5pZWwgKDUgSnVseSAyMDA1KQotIEdpc2xlIFZhbmVtIGNhbWUgdXAgd2l0aCBhIG5pY2UgbGl0dGxlIHdvcmstYXJvdW5kIGZvciBidWcgIzEyMzAxMTgKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIzMDExOCkuIEl0IHNlZW1zIHRoZSBXaW5kb3dzIChNU1ZDKQogIGxpYmMgdGltZSBmdW5jdGlvbnMgbWF5IHJldHVybiBkYXRhIG9uZSBob3VyIG9mZiBpZiBUWiBpcyBub3Qgc2V0IGFuZAogIGF1dG9tYXRpYyBEU1QgYWRqdXN0bWVudCBpcyBlbmFibGVkLiBUaGlzIG1hZGUgY3VybF9nZXRkYXRlKCkgcmV0dXJuIHdyb25nCiAgdmFsdWUsIGFuZCBpdCBhbHNvIGNvbmNlcm5lZCBpbnRlcm5hbCBjb29raWUgZXhwaXJhdGlvbnMgZXRjLgoKRGFuaWVsICg0IEp1bHkgMjAwNSkKLSBBbmRyZXcgQnVzaG5lbGwgcHJvdmlkZWQgZW5vdWdoIGluZm8gZm9yIG1lIHRvIHRlbGwgdGhhdCB3ZSBiYWRseSBuZWVkZWQgdG8KICBmaXggdGhlIENPTk5FQ1QgYXV0aGVudGljYXRpb24gY29kZSB3aXRoIG11bHRpLXBhc3MgYXV0aCBtZXRob2RzIChzdWNoIGFzCiAgTlRMTSkgYXMgaXQgZGlkbid0IHByZXZpb3VzbHkgcHJvcGVybHkgaWdub3JlIHJlc3BvbnNlLWJvZGllcyAtIGluIGZhY3QgaXQKICBzdG9wcGVkIHJlYWRpbmcgYWZ0ZXIgYWxsIHJlc3BvbnNlIGhlYWRlcnMgaGFkIGJlZW4gcmVjZWl2ZWQuIFRoaXMgY291bGQKICBsZWFkIHRvIGxpYmN1cmwgc2VuZGluZyB0aGUgbmV4dCByZXF1ZXN0IGFuZCByZWFkaW5nIHRoZSBib2R5IGZyb20gdGhlIGZpcnN0CiAgcmVxdWVzdCBhcyByZXNwb25zZSB0byB0aGUgc2Vjb25kIHJlcXVlc3QuIChJIGFsc28gcmVuYW1lZCB0aGUgZnVuY3Rpb24sCiAgd2hpY2ggd2Fzbid0IHN0cmljdGx5IG5lY2Vzc2FyeSBidXQuLi4pCgogIFRoZSBiZXN0IGZpeCB3b3VsZCB0byBvbmNlIGFuZCBmb3IgYWxsIG1ha2UgdGhlIENPTk5FQ1QgY29kZSB1c2UgdGhlCiAgb3JkaW5hcnkgcmVxdWVzdCBzZW5kaW5nL3JlY2VpdmluZyBjb2RlLCB0cmVhdGluZyBpdCBhcyBhbnkgb3JkaW5hcnkgcmVxdWVzdAogIGluc3RlYWQgb2YgdGhlIHNwZWNpYWwtcHVycG9zZSBmdW5jdGlvbiB3ZSBoYXZlIG5vdy4gSXQgc2hvdWxkIG1ha2UgaXQKICBiZXR0ZXIgZm9yIG11bHRpLWludGVyZmFjZSB0b28uIEFuZCBwb3NzaWJseSBsZWFkIHRvIGxlc3MgY29kZS4uLgoKICBBZGRlZCB0ZXN0IGNhc2UgMjY1IGZvciB0aGlzLiBJdCBkb2Vzbid0IHdvcmsgYXMgYSBfcmVhbGx5XyBnb29kIHRlc3QgY2FzZQogIHNpbmNlIHRoZSB0ZXN0IHByb3h5IGlzIHRvbyBzdHVwaWQsIGJ1dCB0aGUgdGVzdCBjYXNlIGhlbHBzIHdoZW4gcnVubmluZyB0aGUKICBkZWJ1Z2dlciB0byB2ZXJpZnkuCgpEYW5pZWwgKDMwIEp1bmUgMjAwNSkKLSBEYW4gRmFuZHJpY2ggaW1wcm92ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQncyBhYmlsaXR5IHRvIGZpZ3VyZSBvdXQgd2hhdCBraW5kCiAgb2Ygc3RyZXJyb3JfcigpIEFQSSB0aGF0IGlzIHVzZWQgd2hlbiBjcm9zcy1jb21waWxpbmcuIElmIF9fR0xJQl9fIGlzCiAgZGVmaW5lZCwgaXQgYXNzdW1lcyB0aGUgZ2xpYmMgQVBJLiBJZiBub3QsIGl0IGlzc3VlcyBhIG5vdGljZSBhcyBiZWZvcmUgdGhhdAogIHRoZSB1c2VyIG5lZWRzIHRvIG1hbnVhbGx5IGVkaXQgbGliL2NvbmZpZy5oIGZvciB0aGlzLgoKRGFuaWVsICgyMyBKdW5lIDIwMDUpCi0gRGF2aWQgU2hhdydzIGZpeCB0aGF0IHVuaWZpZXMgcHJveHkgc3RyaW5nIHRyZWF0bWVudCBzbyB0aGF0IGEgcHJveHkgZ2l2ZW4KICB3aXRoIENVUkxPUFRfUFJPWFkgY2FuIHVzZSBhIGh0dHA6Ly8gcHJlZml4IGFuZCB1c2VyICsgcGFzc3dvcmQuIFRoZSB1c2VyCiAgYW5kIHBhc3N3b3JkIGZpZWxkcyBhcmUgbm93IGFsc28gVVJMIGRlY29kZWQgcHJvcGVybHkuIFRlc3QgY2FzZSAyNjQgYWRkZWQKICB0byB2ZXJpZnkuCgpEYW5pZWwgKDIyIEp1bmUgMjAwNSkKLSBEYXZpZCBTaGF3IHVwZGF0ZWQgbGliY3VybC5tNAoKRGFuaWVsICgxNCBKdW5lIDIwMDUpCi0gR2lzbGUgVmFuZW0gZml4ZWQgYSBwb3RlbnRpYWwgdGhyZWFkIGhhbmRsZSBsZWFrLiBCdWcgcmVwb3J0ICMxMjE2NTAwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMTY1MDApLiAgQ29tbWVudCBpbgogIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNS0wNi8wMDU5Lmh0bWwKCkRhbmllbCAoMTMgSnVuZSAyMDA1KQotIE1hZGUgYnVpbGRjb25mIHJ1biBsaWJ0b29saXplIGluIHRoZSBhcmVzIGRpciB0b28gKGluc3BpcmVkIGJ5IFR1cG9uZSdzCiAgcmV2ZXJ0ZWQgcGF0Y2gpLgoKRGFuaWVsICg5IEp1bmUgMjAwNSkKLSBJbmNvcnBvcmF0ZWQgVHVwb25lJ3MgZmluZHRvb2wgZml4IGluIGJ1aWxkY29uZiAoc2xpZ2h0bHkgZWRpdGVkKQoKLSBJbmNvcnBvcmF0ZWQgVHVwb25lJ3MgaGVhZCAtbiBmaXggaW4gYnVpbGRjb25mLgoKRGFuaWVsICg4IEp1bmUgMjAwNSkKLSBSZXZlcnRlZCBUdXBvbmUncyBwYXRjaCBhZ2FpbiwgaXQgYnJva2UgbnVtZXJvdXMgYXV0b2J1aWxkcy4gTGV0J3MgYXBwbHkgaXQKICBpbiBwaWVjZXMsIG9uZSBieSBvbmUgYW5kIHNlZSB3aGF0IHdlIG5lZWQgdG8gYWRqdXN0IHRvIHdvcmsgYWxsIG92ZXIuCgpEYW5pZWwgKDYgSnVuZSAyMDA1KQotIFR1cG9uZSBBbGZyZWRvIGZpeGVkIHRocmVlIHByb2JsZW1zIGluIGJ1aWxkY29uZjoKCiAgMSkgZmluZHRvb2wgZG9lcyBsb29rIHBlciB0b29sIGluIFBBVEggYW5kIHRoaW5rIC4vcGVybCBpcyB0aGUgcGVybAogIGV4ZWN1dGFibGUsIHdoaWxlIGlzIGp1c3QgYSBsb2NhbCBkaXJlY3RvcnkgKEkgaGF2ZSAuIGluIHRoZSBQQVRIKQoKICAyKSBJIGdvdCBzZXZlcmFsIHdhcm5pbmcgZm9yIGhlYWQgLTEgZGVwcmVjYXRlZCBpbiBmYXZvdXIgb2YgaGVhZCAtbiAxCiAKICAzKSBhcmVzIGRpcmVjdG9yeSBpcyBtaXNzaW5nIHNvbWUgZmlsZSAobWlzc2luZyBpcyBtaXNzaW5nIDotKSApIGJlY2F1c2UKICBhdXRvbWFrZSBhbmQgZnJpZW5kcyBpcyBub3QgcnVuLgoKRGFuaWVsICgzIEp1bmUgMjAwNSkKLSBBZGRlZCBkb2NzL2xpYmN1cmwvZ2V0aW5mby10aW1lcywgYmFzZWQgb24gZmVlZGJhY2sgZnJvbSAnRWRpJzoKICBodHRwOi8vY3VybC5oYXh4LnNlL2ZlZWRiYWNrL2Rpc3BsYXkuY2dpP2lkPTExMTc4MzI1Nzk4Mjk5JnN1cHBvcnQ9eWVzCgotIEFuZHJlcyBHYXJjaWEgcHJvdmlkZWQgeWV0IGFub3RoZXIgdGV4dCBtb2RlIHBhdGNoIGZvciBzZXZlcmFsIHRlc3QgY2FzZXMgc28KICB0aGF0IHRoZXkgZG8gdGV4dCBjb21wYXJpc2lvbnMgYmV0dGVyIG9uIFdpbmRvd3MgKG5ld2xpbmUtd2lzZSkuCgpEYW5pZWwgKDEgSnVuZSAyMDA1KQotIFRoZSBjb25maWd1cmUgY2hlY2sgZm9yIGMtYXJlcyBub3cgYWRkcyB0aGUgY2FyZXMgbGliIGJlZm9yZSB0aGUgb3RoZXIgbGlicywKICB0byBtYWtlIGl0IGJ1aWxkIGZpbmUgd2l0aCBtaW5ndy4gSW5zcGlyZWQgYnkgVHVwb25lIEFsZnJlZG8ncyBidWcgcmVwb3J0CiAgYW5kIHBhdGNoOiBodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjEyOTQwCgpEYW5pZWwgKDMxIE1heSAyMDA1KQotIFRvZGQgS3VsZXN6YSByZXBvcnRlZCBhIGZsYXcgaW4gdGhlIHByb3h5IG9wdGlvbiwgc2luY2UgYSBudW1lcmljYWwgSVB2NgogIGFkZHJlc3Mgd2FzIG5vdCBwb3NzaWJsZSB0byB1c2UuIEl0IGlzIG5vdywgYnV0IHJlcXVpcmVzIGl0IHdyaXR0ZW4KICBSRkMyNzMyLXN0eWxlLCB3aXRoaW4gYnJhY2tldHMgLSB3aGljaCBpbmNpZGVudGx5IGlzIGhvdyB5b3UgZW50ZXIgbnVtZXJpY2FsCiAgSVB2NiBhZGRyZXNzZXMgaW4gVVJMcy4gVGVzdCBjYXNlIDI2MyBhZGRlZCB0byB2ZXJpZnkuCgpEYW5pZWwgKDMwIE1heSAyMDA1KQotIEVyaWMgQ29vcGVyIHJlcG9ydGVkIGFib3V0IGEgcHJvYmxlbSB3aXRoIEhUVFAgc2VydmVycyB0aGF0IHJlc3BvbmRzIHdpdGgKICBiaW5hcnkgemVyb2VzIHdpdGhpbiB0aGUgaGVhZGVycy4gVGhleSBjb25mdXNlZCBsaWJjdXJsIHRvIGRvIHdyb25nIHNvIHRoZQogIGRvd25sb2FkZWQgaGVhZGVycyBiZWNvbWUgaW5jb21wbGV0ZS4gVGhlIGZpeCBpcyBub3cgdmVyaWZpZWQgd2l0aCB0ZXN0IGNhc2UKICAyNjIuIGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz0zMTA5NDgKCkRhbmllbCAoMjUgTWF5IDIwMDUpCi0gRml4ZWQgcHJvYmxlbXMgd2l0aCB0aGUgdGVzdCBzdWl0ZSwgYW5kIGluIHBhcnRpY3VsYXIgdGhlIEZUUCB0ZXN0IGNhc2VzCiAgc2luY2UgaXQgcHJldmlvdXNseSB3YXMgZmFpbGluZyBldmVyeSBub3cgYW5kIHRoZW4gaW4gYSBub25zZW5zZSBtYW5uZXIuCgotIC0tdHJhY2UtdGltZSBub3cgb3V0cHV0cyB0aGUgZnVsbCBtaWNyb3NlY29uZCwgYWxsIDYgZGlnaXRzLgoKRGFuaWVsICgyNCBNYXkgMjAwNSkKLSBBbmRyZXMgR2FyY2lhIHByb3ZpZGVkIGEgdGV4dCBtb2RlIHBhdGNoIGZvciBzZXZlcmFsIHRlc3QgY2FzZXMgc28gdGhhdCB0aGV5CiAgZG8gdGV4dCBjb21wYXJpc2lvbnMgYmV0dGVyIG9uIFdpbmRvd3MgKG5ld2xpbmUtd2lzZSkuCgotIEFueSAyeHggcmVzcG9uc2UgKGFuZCBub3QganVzdCAyMDApIGlzIG5vdyBjb25zaWRlcmVkIGEgZmluZSByZXNwb25zZSB0bwogIFRZUEUsIGFzIHNvbWUgc2VydmVycyBvYnZpb3VzbHkgc2VuZHMgYSAyMjYgdGhlcmUuIEFkZGVkIHRlc3QgY2FzZSAyNjEgdG8KICB2ZXJpZnkuIEJhc2VkIG9uIGEgcXVlc3Rpb24vcmVwb3J0IGJ5IEdlb3JnIFdpY2hlcnNraS4KCkRhbmllbCAoMjAgTWF5IDIwMDUpCi0gSW1wcm92ZWQgcnVudGVzdHMucGwgdG8gYWxsb3cgc3Rkb3V0IHRlc3RzIHRvIGJlIG1vZGU9dGV4dCBhcyB3ZWxsLCBqdXN0CiAgYXMgZmlsZSBjb21wYXJpc29ucyBhbHJlYWR5IHN1cHBvcnRzLiBBZGRlZCB0aGlzIGluZm8gdG8gdGhlIEZJTEVGT1JNQVQKICBkb2NzLgoKRGFuaWVsICgxOCBNYXkgMjAwNSkKLSBKb2huIE1jR293YW4gaWRlbnRpZmllZCBhIHByb2JsZW0gaW4gYnVnIHJlcG9ydCAjMTIwNDQzNQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xMjA0NDM1KSB3aXRoIG1hbGZvcm1lZCBVUkxzIGxpa2UKICAiaHR0cDovL3NvbWVob3N0P2RhdGEiIGFzIGl0IGFkZGVkIGEgc2xhc2ggdG9vIG11Y2ggaW4gdGhlIHJlcXVlc3QgKCJHRVQKICAvP2RhdGEvIi4uLikuIEFkZGVkIHRlc3QgY2FzZSAyNjAgdG8gdmVyaWZ5LgoKLSBUaGUgY29uZmlndXJlIGNoZWNrIGZvciBzdHJlcnJvcl9yKCkgZmFpbGVkIHRvIGRldGVjdCB0aGUgcHJvcGVyIEFQSSBhdAogIHRpbWVzLCBsaWtlIG9uIEhQLVVYIDEwLjIwLiBUaGVuIGxpYi9zdHJlcnJvci5jIGJhZGx5IGFzc3VtZWQgdGhlIGdsaWJjCiAgdmVyc2lvbiBpZiB0aGUgcG9zaXggZGVmaW5lIHdhc24ndCBzZXQgKHNpbmNlIGl0IF9oYWRfIGZvdW5kIGEgc3RyZXJyb3JfcikuCgpEYW5pZWwgKDE2IE1heSAyMDA1KQotIFRoZSBnbXRpbWVfcigpIGZ1bmN0aW9uIGluIEhQLVVYIDEwLjIwIGlzIGJyb2tlbi4gQWJvdXQgMTMgdGVzdCBjYXNlcyBmYWlsCiAgZHVlIHRvIHRoaXMuIFRoZXJlJ3Mgbm93IGEgY29uZmlndXJlIGNoZWNrIHRoYXQgYXR0ZW1wdHMgdG8gZGV0ZWN0IHRoZSBiYWQKICBmdW5jdGlvbiBhbmQgbm90IHVzZSBpdCBvbiBzdWNoIHN5c3RlbXMuCgpWZXJzaW9uIDcuMTQuMCAoMTYgTWF5IDIwMDUpCgpEYW5pZWwgKDEzIE1heSAyMDA1KQotIEdyaWdvcnkgRW50aW4gcmVwb3J0ZWQgdGhhdCBjdXJsJ3MgY29uZmlndXJlIGRldGVjdHMgYSBmaW5lIHBvbGwoKSBmb3IgTWFjCiAgT1MgWCAxMC40ICh3aGlsZSAxMC4zIG9yIGxhdGVyIGRldGVjdGVkIGEgImJhZCIgb25lKSwgYnV0IHRoZSBleGVjdXRhYmxlCiAgZG9lc24ndCB3b3JrIGFzIGdvb2QgYXMgaWYgYnVpbHQgd2l0aG91dCBwb2xsKCkuIEkndmUgYWRqdXN0ZWQgdGhlIGNvbmZpZ3VyZQogIHRvIGFsd2F5cyBza2lwIHRoZSBmaW5lLXBvbGwoKSB0ZXN0IG9uIE1hYyBPUyBYIChkYXJ3aW4pLgoKRGFuaWVsICgxMiBNYXkgMjAwNSkKLSBXaGVuIGRvaW5nIGEgc2Vjb25kIHJlcXVlc3QgKGFmdGVyIGEgZGlzY29ubmVjdCkgdXNpbmcgdGhlIHNhbWUgZWFzeSBoYW5kbGUsCiAgb3ZlciBhIHByb3h5IHRoYXQgdXNlcyBOVExNIGF1dGhlbnRpY2F0aW9uLCBsaWJjdXJsIGZhaWxlZCB0byB1c2UgTlRMTSBhZ2FpbgogIHByb3Blcmx5ICh0aGUgYXV0aCBtZXRob2Qgd2FzIGFjY2lkZW50YWxseSByZXNldCB0byB0aGUgc2FtZSBhcyBoYWQgYmVlbiBzZXQKICBmb3IgaG9zdCBhdXRoLCB3aGljaCBkZWZhdWx0cyB0byBCYXNpYykuIEJ1ZyByZXBvcnQgIzEyMDA2NjEKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTIwMDY2MSkgaWRlbnRpZmllZCB0aGUgdGhlIHByb2JsZW0gYW5kCiAgdGhlIGZpeC4KCi0gSWYgLXovLS10aW1lLWNvbmQgaXMgdXNlZCB3aXRoIGFuIGludmFsaWQgZGF0ZSBzeW50YXgsIHRoaXMgaXMgbm8gbG9uZ2VyCiAgc2lsZW50bHkgZGlzY2FyZGVkLiBJbnN0ZWFkIGEgcHJvcGVyIHdhcm5pbmcgbWVzc2FnZSBpcyBkaXBsYXllZCB0aGF0CiAgaW5mb3JtcyBhYm91dCBpdC4gQnV0IGl0IHN0aWxsIGNvbnRpbnVlcyB3aXRob3V0IHRoZSBjb25kaXRpb24uCgpWZXJzaW9uIDcuMTQuMC1wcmUyICgxMSBNYXkgMjAwNSkKCkRhbmllbCAoMTEgTWF5IDIwMDUpCi0gU3RhcnRpbmcgbm93LCBsaWJjdXJsIHNlbmRzIGEgbGl0dGxlIGRpZmZlcmVudCBzZXQgb2YgaGVhZGVycyBpbiBpdHMgZGVmYXVsdAogIEhUVFAgcmVxdWVzdHM6CiAgCiAgQSkgTm9ybWFsIG5vbi1wcm94eSBIVFRQOgogICAgLSBubyBtb3JlICJQcmFnbWE6IG5vLWNhY2hlIiAodGhpcyBvbmx5IG1ha2VzIHNlbnNlIHRvIHByb3hpZXMpCgogIEIpIE5vbi1DT05ORUNUIEhUVFAgcmVxdWVzdCBvdmVyIHByb3h5OgogICAgLSAiUHJhZ21hOiBuby1jYWNoZSIgaXMgdXNlZCAobGlrZSBiZWZvcmUpCiAgICAtICJQcm94eS1Db25uZWN0aW9uOiBLZWVwLWFsaXZlIiAoZm9yIG9sZGVyIHN0eWxlIDEuMC1wcm94aWVzKQoKICBDKSBDT05ORUNUIEhUVFAgcmVxdWVzdCBvdmVyIHByb3h5OgogICAgLSAiSG9zdDogW25hbWVdOltwb3J0XSIKICAgIC0gIlByb3h5LUNvbm5lY3Rpb246IEtlZXAtYWxpdmUiCgogIFRoZSBBKSBjYXNlIGlzIG1vc3RseSB0byByZWR1Y2UgdGhlIGRlZmF1bHQgaGVhZGVyIHNpemUgYW5kIHJlbW92ZSBhCiAgcG9pbnRsZXNzIGhlYWRlci4KCiAgVGhlIEIpIGlzIHRvIGFkZHJlc3MgKHJhcmUpIHByb2JsZW1zIHdpdGggSFRUUCAxLjAgcHJveGllcwoKICBUaGUgQykgaGVhZGVycyBhcmUgYm90aCB0byBhZGRyZXNzIChyYXJlKSBwcm9ibGVtcyB3aXRoIHNvbWUgcHJveGllcy4gVGhlCiAgY29kZSBpbiBsaWJjdXJsIHRoYXQgZGVhbHMgd2l0aCBDT05ORUNUIHJlcXVlc3RzIG5lZWQgYSByZXdyaXRlLCBidXQgaXQKICBmZWVscyBsaWtlIGEgdG9vIGJpZyBhIGpvYiBmb3IgbWUgdG8gZG8gbm93LiBEZXRhaWxzIGFyZSBhZGRlZCBpbiB0aGUgY29kZQogIGNvbW1lbnRzIGZvciBub3cuCgogIFVwZGF0ZWQgYSBsYXJnZSBhbW91bnQgb2YgdGVzdCBjYXNlcyB0byByZWZsZWN0IHRoZSBuZXdzLgoKRGFuaWVsICgxMCBNYXkgMjAwNSkKLSBIYWxmLWJha2VkIGF0dGVtcHQgdG8gYmFpbCBvdXQgaWYgc2VsZWN0KCkgcmV0dXJucyBfb25seV8gZXJyb3JmZHMgd2hlbiB0aGUKICB0cmFuc2ZlciBpcyBpbiBwcm9ncmVzcy4gQW4gYXR0ZW1wdCB0byBmaXggQWxsYW4ncyBwcm9ibGVtLiBTZWUKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDUtMDUvMDA3My5odG1sIGFuZCB0aGUgcmVzdCBvZiB0aGF0IHRocmVhZAogIGZvciBkZXRhaWxzLgoKICBJJ20gc3RpbGwgbm90IHN1cmUgdGhpcyBpcyB0aGUgcmlnaHQgZml4LCBidXQuLi4KClZlcnNpb24gNy4xNC4wLXByZTEgKDkgTWF5IDIwMDUpCgpEYW5pZWwgKDIgTWF5IDIwMDUpCi0gU29ydCBvZiAiZml4ZWQiIEtOT1dOX0JVR1MgIzQ6IGN1cmwgbm93IGJ1aWxkcyBJUHY2IGVuYWJsZWQgb24gQUlYIDQuMy4gQXQKICBsZWFzdCBpdCBzaG91bGQgbm8gbG9uZ2VyIGNhdXNlIGEgY29tcGlsZXIgZXJyb3IuIEhvd2V2ZXIsIGl0IGRvZXMgbm90IGhhdmUKICBBSV9OVU1FUklDSE9TVCBzbyB3ZSBjYW5ub3QgZ2V0YWRkcmluZm8oKSBhbnkgbnVtZXJpY2FsIGFkZHJlc3NlcyB3aXRoIGl0CiAgKHdlIHVzZSB0aGF0IGZvciBGVFAgUE9SVC9FUFJUKSEgU28sIEkgbW9kaWZpZWQgdGhlIGNvbmZpZ3VyZSBjaGVjayB0aGF0CiAgY2hlY2tzIGlmIHRoZSBnZXRhZGRyaW5mbygpIGlzIHdvcmtpbmcsIHRvIHVzZSBBSV9OVU1FUklDSE9TVCBzaW5jZSB0aGVuCiAgaXQnbGwgZmFpbCBvbiBBSVggNC4zIGFuZCBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYnVpbGQgd2l0aCBJUHY2IHN1cHBvcnQKICBkaXNhYmxlZC4KCi0gQWRkZWQgLS10cmFjZS10aW1lIHRoYXQgd2hlbiB1c2VkIGFkZHMgYSB0aW1lIHN0YW1wIHRvIGVhY2ggdHJhY2UgbGluZSB0aGF0CiAgLS10cmFjZSwgLS10cmFjZS1hc2NpaSBhbmQgLS12ZXJib3NlIG91dHB1dC4gSSBhbHNvIG1hZGUgdGhlICc+JyBkaXNwbGF5CiAgc2VwYXJhdGUgZWFjaCBsaW5lIG9uIHRoZSBsaW5lZmVlZCBzbyB0aGF0IEhUVFAgcmVxdWVzdHMgZXRjIGxvb2sgbmljZXIgaW4KICB0aGUgLXYgb3V0cHV0LgoKLSBNYWRlIGN1cmwgcmVjb2duaXplIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgTHlueCAoYW5kIG90aGVycz8pIHN1cHBvcnQgZm9yCiAgcG9pbnRpbmcgb3V0IHRoZSBDQSBjZXJ0IHBhdGgvZmlsZTogU1NMX0NFUlRfRElSIGFuZCBTU0xfQ0VSVF9GSUxFLiBJZgogIENVUkxfQ0FfQlVORExFIGlzIG5vdCBzZXQsIHRoZXkgYXJlIGNoZWNrZWQgYWZ0ZXJ3YXJkcy4KCiAgTGlrZSBiZWZvcmU6IG9uIHdpbmRvd3MgaWYgbm9uZSBvZiB0aGVzZSBhcmUgc2V0LCBpdCBjaGVja3MgZm9yIHRoZSBjYSBjZXJ0CiAgZmlsZSBsaWtlIHRoaXM6CgogIDEuIGFwcGxpY2F0aW9uJ3MgZGlyZWN0b3J5CiAgMi4gY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQogIDMuIFdpbmRvd3MgU3lzdGVtIGRpcmVjdG9yeSAoZS5nLiBDOlx3aW5kb3dzXHN5c3RlbTMyKQogIDQuIFdpbmRvd3MgRGlyZWN0b3J5IChlLmcuIEM6XHdpbmRvd3MpCiAgNS4gYWxsIGRpcmVjdG9yaWVzIGFsb25nICVQQVRIJQoKRGFuaWVsICgxIE1heSAyMDA1KQotIFRoZSBydW50ZXN0cy5wbCBzY3JpcHQgbm93IHN0YXJ0cyB0ZXN0IHNlcnZlcnMgYnkgZG9pbmcgZm9yaygpIGFuZCBleGVjKCkKICBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBhcHByb2FjaC4gVGhpcyBpcyBsZXNzIGNvbXBsaWNhdGVkIGFuZCBzaG91bGQKICBob3BlZnVsbHkgbGVhZCB0byBsZXNzICJsZWFrZWQiIHNlcnZlcnMgKHNlcnZlcnMgdGhhdCBhcmVuJ3Qgc3RvcHBlZAogIHByb3Blcmx5IHdoZW4gdGhlIHRlc3RzIGFyZSBzdG9wcGVkKS4KCi0gQWxleGFuZGVyIFpodXJhdmxldiBmb3VuZCBhIGNhc2Ugd2hlbiB5b3UgZGlkICJjdXJsIC1JIFtVUkxdIiBhbmQgaXQKICBjb21wbGFpbmVkIG9uIHRoZSBjaHVua2VkIGVuY29kaW5nLCBldmVuIHRob3VnaCBhIEhFQUQgc2hvdWxkIG5ldmVyIHJldHVybiBhCiAgYm9keSBhbmQgdGh1cyBpdCBjYW5ub3QgYmUgYSBjaHVua2VkLWVuY29kaW5nIHByb2JsZW0hCgpEYW5pZWwgKDMwIEFwcmlsIDIwMDUpCi0gQWxleGFuZGVyIFpodXJhdmxldiBmb3VuZCBvdXQgdGhhdCAobGliKWN1cmwgU0lHU0VHVmVkIHdoZW4gdXNpbmcKICAtLWludGVyZmFjZSBvbiBhbiBhZGRyZXNzIHRoYXQgY2FuJ3QgYmUgYm91bmQuCgpEYW5pZWwgKDI4IEFwcmlsIDIwMDUpCi0gV29ya2luZyBvbiBmaXhpbmcgdXAgdGVzdCBjYXNlcyB0byBtYXJrIHNlY3Rpb25zIGFzICdtb2RlPXRleHQnIGZvciB0aGluZ3MKICB0aGF0IGN1cmwgd3JpdGVzIGFzIHRleHQgZmlsZXMsIHNpbmNlIHRoZW4gdGhleSBjYW4gZ2V0IGRpZmZlcmVudCBsaW5lCiAgZW5kaW5ncyBkZXBlbmRpbmcgb24gT1MuIEFuZHLpcyBHYXJj7WEgaGVscHMgbWUgd29yayB0aGlzIG91dC4KCiAgRGlkIGxvdHMgb2Ygb3RoZXIgbWlub3IgdHdlYWtzIG9uIHRoZSB0ZXN0IHNjcmlwdHMgdG8gd29yayBiZXR0ZXIgYW5kIG1vcmUKICByZWxpYWJseSBmaW5kIHRlc3Qgc2VydmVycyBhbmQgYWxzbyBraWxsIHRlc3Qgc2VydmVycy4KCi0gRGFuIEZhbmRyaWNoIHBvaW50ZWQgb3V0IGhvdyB0aGUgcnVudGVzdHMucGwgc2NyaXB0IGtpbGxlZCB0aGUgSFRUUCBzZXJ2ZXIKICBpbnN0ZWFkIG9mIHRoZSBIVFRQUyBzZXJ2ZXIgd2hlbiBjbG9zaW5nIGl0IGRvd24uCgpEYW5pZWwgKDI3IEFwcmlsIDIwMDUpCi0gUGF1bCBNb29yZSBtYWRlIGN1cmwgY2hlY2sgZm9yIHRoZSAuY3VybHJjIGZpbGUgKF9jdXJscmMgb24gd2luZG93cykgb24gdHdvCiAgbW9yZSBwbGFjZXMuIEZpcnN0LCBDVVJMX0hPTUUgaXMgYSBuZXcgZW52aXJvbm1lbnQgdmFyaWFibGUgdGhhdCBpcyB1c2VkCiAgaW5zdGVhZCBvZiBIT01FIGlmIGl0IGlzIHNldCwgdG8gcG9pbnQgb3V0IHdoZXJlIHRoZSBkZWZhdWx0IGNvbmZpZyBmaWxlCiAgbGl2ZXMuIElmIHRoZXJlJ3Mgbm8gY29uZmlnIGZpbGUgaW4gdGhlIGRpciBwb2ludGVkIG91dCBieSBvbmUgb2YgdGhlCiAgZW52aXJvbm1lbnQgdmFyaWFibGVzLCB0aGUgV2luZG93cyB2ZXJzaW9uIHdpbGwgaW5zdGVhZCBjaGVjayB0aGUgc2FtZQogIGRpcmVjdG9yeSB0aGUgZXhlY3V0YWJsZSBjdXJsIGlzIGxvY2F0ZWQgaW4uCgpEYW5pZWwgKDI2IEFwcmlsIDIwMDUpCi0gQ29yeSBOZWxzb24ncyB3b3JrIG9uIG51a2luZyBjb21waWxlciB3YXJuaW5ncyB3aGVuIGJ1aWxkaW5nIG9uIHg2NCB3aXRoCiAgVlMyMDA1LgoKRGFuaWVsICgyNSBBcHJpbCAyMDA1KQotIEZyZWQgTmV3IHJlcG9ydGVkIGEgYnVnIHdoZXJlIHdlIHVzZWQgQmFzaWMgYXV0aCBhbmQgdXNlciBuYW1lIGFuZCBwYXNzd29yZAogIGluIC5uZXRyYywgYW5kIHdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246IHRoZSBzdWJzZXF1ZW50IHJlcXVlc3RzIGRpZG4ndAogIHByb3Blcmx5IHVzZSB0aGUgYXV0aCBhcyBmb3VuZCBpbiB0aGUgbmV0cmMgZmlsZS4gQWRkZWQgdGVzdCBjYXNlIDI1NyB0bwogIHZlcmlmeSBteSBmaXguCgotIEJhc2VkIG9uIGZlZWRiYWNrIGZyb20gQ29yeSBOZWxzb24sIEkgYWRkZWQgc29tZSBwcmVwcm9jZXNzb3IgbWFnaWMgaW4KICAqL3NldHVwLmggYW5kICovY29uZmlnLXdpbjMyLmggdG8gYnVpbGQgZmluZSB3aXRoIFZTMjAwNSBvbiB4NjQuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDUpCi0gQWxleCBTdXlrb3YgbWFkZSB0aGUgY3VybCB0b29sIG5vdyBhc3N1bWUgdGhhdCB1cGxvYWRzIHVzaW5nIEhUVFA6Ly8gb3IKICBIVFRQUzovLyBhcmUgdGhlIG9ubHkgb25lcyB0aGF0IHNob3cgb3V0cHV0IGFuZCB0aHVzIG1vdGl2YXRlcyBhIHN3aXRjaGVkCiAgb2ZmIHByb2dyZXNzIG1ldGVyIGlmIHRoZSBvdXRwdXQgaXMgc2VudCB0byB0aGUgdGVybWluYWwuIFRoaXMgbWFrZXMgRlRQCiAgdXBsb2FkcyB3aXRob3V0ICc+JywgLW8gb3IgLU8gc2hvdyB0aGUgcHJvZ3Jlc3MgbWV0ZXIuCgpEYW5pZWwgKDIyIEFwcmlsIDIwMDUpCi0gRGF2ZSBEcmliaW4ncyBNU1ZDIG1ha2VmaWxlIGZpeDogc2V0IENVUkxfU1RBVElDTElCIHdoZW4gaXQgYnVpbGRzIHN0YXRpYwogIGxpYnJhcnkgdmFyaWFudHMuCgotIEFuZHJlcyBHYXJjaWEgZml4ZWQgY29uZmlndXJlIHRvIHNldCB0aGUgcHJvcGVyIGRlZmluZSB3aGVuIGJ1aWxkaW5nIHN0YXRpYwogIGxpYmN1cmwgb24gd2luZG93cy4KCi0gLS1yZXRyeS1kZWxheSBkaWRuJ3Qgd29yay4KCkRhbmllbCAoMTggQXByaWwgMjAwNSkKLSBPbGl2aWVyIHJlcG9ydGVkIHRoYXQgZXZlbiB0aG91Z2ggaGUgdXNlZCBDVVJMT1BUX1BPUlQsIGxpYmN1cmwgY2xlYXJseQogIHN0aWxsIHVzZWQgdGhlIGRlZmF1bHQgcG9ydC4gSGUgd2FzIHJpZ2h0LiBJIGZpeGVkIHRoZSBwcm9ibGVtIGFuZCBhZGRlZCB0aGUKICB0ZXN0IGNhc2VzIDUyMSwgNTIyIGFuZCA1MjMgdG8gdmVyaWZ5IHRoZSBmaXguCgotIFRvc2hpeXVraSBNYWV6YXdhIHJlcG9ydGVkIHRoYXQgd2hlbiBkb2luZyBhIFBPU1Qgd2l0aCBhIHJlYWQgY2FsbGJhY2ssCiAgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkgc2VuZCBhbiBFeHBlY3Q6IDEwMC1jb250aW51ZSBoZWFkZXIuIEl0IGRvZXMgbm93LgoKLSBJIGNvbW1pdHRlZCBieSBtaWcgY2hhbmdlIGluIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0aGF0IG1vdmVzIG91dCBhbGwKICBzb2NrZXQvVENQIGNvZGUgdG8gYSBzZXBhcmF0ZSBDIHByb2dyYW0gbmFtZWQgc29ja2ZpbHQuIEFuZCBhZGRlZCA0IG5ldwogIHRlc3QgY2FzZXMgZm9yIEZUUCBvdmVyIElQdjYuCgpEYW5pZWwgKDggQXByaWwgMjAwNSkKLSBDb3J5IE5lbHNvbiByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBhIEhUVFAgc2VydmVyIHRoYXQgcmVzcG9uZGVkIHdpdGggYSAzMDQKICByZXNwb25zZSBjb250YWluaW5nIGFuICJpbGxlZ2FsIiBDb250ZW50LUxlbmd0aDogaGVhZGVyLCB3aGljaCB3YXMgbm90CiAgcHJvcGVybHkgaWdub3JlZCBieSBsaWJjdXJsLiBOb3cgaXQgaXMuIFRlc3QgY2FzZSAyNDkgdmVyaWZpZXMuCgpEYW5pZWwgKDcgQXByaWwgMjAwNSkKLSBBZGRlZCBhYmlsaXR5IHRvIGJ1aWxkIGFuZCBydW4gd2l0aCBHbnVUTFMgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gT3BlblNTTCBmb3IKICB0aGUgc2VjdXJlIGxheWVyLiBjb25maWd1cmUgLS13aXRoLWdudXRscyBlbmFibGVzIHdpdGguIE5vdGUgdGhhdCB0aGUKICBwcmV2aW91cyBPcGVuU1NMIGNoZWNrIHN0aWxsIGhhcyBwcmVmZXJlbmNlIGFuZCBpZiBpdCBmaXJzdCBkZXRlY3RzIE9wZW5TU0wsCiAgaXQgd2lsbCBub3QgY2hlY2sgZm9yIEdudVRMUy4gWW91IG1heSBuZWVkIHRvIGV4cGxpY3RseSBkaWFibGUgT3BlblNTTCB3aXRoCiAgLS13aXRob3V0LXNzbC4KCiAgVGhpcyB3b3JrIGhhcyBiZWVuIHNwb25zb3JlZCBieSBUaGUgV3JpdHRlbiBXb3JkLgoKRGFuaWVsICg1IEFwcmlsIDIwMDUpCi0gQ2hyaXN0b3BoZSBMZWdyeSBmaXhlZCB0aGUgcG9zdC11cGxvYWQgY2hlY2sgZm9yIEZUUCB0byBub3QgY29tcGxhaW4gaWYgdGhlCiAgdXBsb2FkIHdhcyBza2lwcGVkIGR1ZSB0byBhIHRpbWUtY29uZGl0aW9uIGFzIHNldCB3aXRoCiAgQ1VSTE9QVF9USU1FQ09ORElUSU9OLiBJIGFkZGVkIHRlc3QgY2FzZSAyNDcgYW5kIDI0OCB0byB2ZXJpZnkuCgpWZXJzaW9uIDcuMTMuMiAoNSBBcHJpbCAyMDA1KQoKRGFuaWVsICg0IEFwcmlsIDIwMDUpCi0gTWFyY2VsbyBKdWNoZW0gZml4ZWQgdGhlIE1TVkMgbWFrZWZpbGUgZm9yIGxpYmN1cmwKCi0gR2lzbGUgVmFuZW0gZml4ZWQgYSBjcmFzaCBpbiBsaWJjdXJsLCB0aGF0IGNvdWxkIGhhcHBlbiBpZiB0aGUgZWFzeSBoYW5kbGUKICB3YXMga2lsbGVkIGJlZm9yZSB0aGUgdGhyZWFkaW5nIHJlc29sdmVyICh3aW5kb3dzIG9ubHkpIHN0aWxsIGhhZG4ndAogIGNvbXBsZXRlZC4KCi0gSGFyZGVlcCBTaW5naCByZXBvcnRlZCBhIHByb2JsZW0gZG9pbmcgSFRUUCBQT1NUIHdpdGggRGlnZXN0LiAoSXQgd2FzCiAgYWN0dWFsbHkgYWxzbyBhZmZlY3RpbmcgTlRMTSBhbmQgTmVnb3RpYXRlLikgSXQgdHVybmVkIG91dCB0aGF0IGlmIHRoZQogIHNlcnZlciByZXNwb25kZWQgd2l0aCAxMDAgQ29udGludWUgYmVmb3JlIHRoZSBpbml0aWFsIDQwMSByZXNwb25zZSwgbGliY3VybAogIGRpZG4ndCB0YWtlIGNhcmUgb2YgdGhlIHJlc3BvbnNlIHByb3Blcmx5LiBUZXN0IGNhc2UgMjQ1IGFuZCAyNDYgYWRkZWQgdG8KICB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMzAgTWFyY2ggMjAwNSkKLSBBbmRyZXMgR2FyY2lhIG1vZGlmaWVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGNoZWNrIGZvciBsaWJnZGkzMiBiZWZvcmUKICBsaWJjcnlwdG8sIHRvIG1ha2UgdGhlIFNTTCBjaGVjayB3b3JrIGZpbmUgb24gbXN5cy9taW5ndy4KCkRhbmllbCAoMjkgTWFyY2ggMjAwNSkKLSBUb20gTW9lcnMgaWRlbnRpZmllZCBhIGZsYXcgd2hlbiB5b3Ugc2VudCBhIFBPU1Qgd2l0aCBEaWdlc3QgYXV0aGVudGljYXRpb24sCiAgYXMgaW4gdGhlIGZpcnN0IHJlcXVlc3Qgd2hlbiBjdXJsIHNlbmRzIGEgUE9TVCB3aXRoIENvbnRlbnQtTGVuZ3RoOiAwLCBpdAogIHN0aWxsIGZvcmNpYmx5IGNsb3NlZCB0aGUgY29ubmVjdGlvbiBiZWZvcmUgZG9pbmcgdGhlIG5leHQgc3RlcCBpbiB0aGUgYXV0aAogIG5lZ290aWF0aW9uLgoKLSBKZXNwZXIgSmVuc2VuIGZvdW5kIG91dCB0aGF0IEZUUC1TU0wgZGlkbid0IHdvcmsgc2luY2UgbXkgRlRQCiAgcmV3cml0ZS4gRml4aW5nIHRoYXQgd2FzIGVhc3ksIGJ1dCBpdCBhbHNvIHJldmVhbGVkIGEgbXVjaCB3b3JzZSBwcm9ibGVtOgogIHRoZSBGVFAgc2VydmVyIHJlc3BvbnNlIHJlYWRlciBmdW5jdGlvbiBkaWRuJ3QgcHJvcGVybHkgZGVhbCB3aXRoIHJlYWRpbmcKICByZXNwb25zZXMgaW4gbXVsdGlwbGUgdGlueSBjaHVua3MgcHJvcGVybHkhIEkgbW9kaWZpZWQgdGhlIEZUUCBzZXJ2ZXIgdG8KICBhbGxvdyBpdCB0byBwcm9kdWNlIHN1Y2ggc3BsaXQtdXAgcmVzcG9uc2VzIHRvIG1ha2Ugc3VyZSBjdXJsIGRlYWxzIHdpdGgKICB0aGVtIGFzIGl0IHNob3VsZC4KCi0gQmFzZWQgb24gQXVndXN0dXMgU2F1bmRlcnMnIGNvbW1lbnRzIGFuZCBmaW5kaW5ncywgdGhlIEhUVFAgb3V0cHV0IGF1dGgKICBmdW5jdGlvbiB3YXMgZml4ZWQgdG8gdXNlIHRoZSBwcm9wZXIgcHJveHkgYXV0aGVudGljYXRpb24gd2hlbiBtdWx0aXBsZSBvbmVzCiAgYXJlIGFjY2VwdGVkLiB0ZXN0IDIzOSBhbmQgdGVzdCAyNDMgd2VyZSBhZGRlZCB0byByZXBlYXQgdGhlIHByb2JsZW1zIGFuZAogIHZlcmlmeSB0aGUgZml4ZXMuCgogIC0tcHJveHktYW55YXV0aCB3YXMgYWRkZWQgdG8gdGhlIGN1cmwgdG9vbAoKRGFuaWVsICgxNiBNYXJjaCAyMDA1KQotIFRydTY0IGFuZCBzb21lIElSSVggYm94ZXMgc2VlbSB0byBub3QgbGlrZSB0ZXN0IDIzNyBhcyBpdCBpcy4gVGhlaXIKICBpbmV0X2FkZHIoKSBmdW5jdGlvbnMgc2VlbXMgdG8gdXNlICYyNTUgb24gYWxsIG51bWVyaWNhbHMgaW4gYSBpcHY0IGRvdHRlZAogIGFkZHJlc3Mgd2hpY2ggbWFrZXMgYSBkaWZmZXJlbnQgZmFpbHVyZS4uLiBOb3cgSSd2ZSBtb2RpZmllZCB0aGUgaXB2NAogIHJlc29sdmUgY29kZSB0byB1c2UgaW5ldF9wdG9uKCkgaW5zdGVhZCBpbiBhbiBhdHRlbXB0IHRvIG1ha2UgdGhlc2Ugc3lzdGVtcwogIGJldHRlciBkZXRlY3QgdGhpcyBhcyBhIGJhZCBJUCBhZGRyZXNzIHJhdGhlciB0aGFuIGNyZWF0aW5nIGEgdG9hbGx5IGJvZ3VzCiAgYWRkcmVzcyB0aGF0IGlzIHRoZW4gcGFzc2VkIG9uIGFuZCB1c2VkLgoKRGFuaWVsICgxNSBNYXJjaCAyMDA1KQotIERhbiBGYW5kcmljaCBtYWRlIHRoZSBjb2RlIHByb3Blcmx5IHVzZSB0aGUgdUNsaWJjJ3MgdmVyc2lvbiBvZgogIGluZXRfbnRvYV9yKCkgd2hlbiBidWlsdCB3aXRoIGl0LgoKLSBBZGRlZCB0ZXN0IDIzNyBhbmQgMjM4OiB0ZXN0IEVQU1YgYW5kIFBBU1YgcmVzcG9uc2UgaGFuZGxpbmcgd2hlbiB0aGV5IGdldAogIHdlbGwtIGZvcm1hdGVkIGRhdGEgYmFjayBidXQgdXNpbmcgaWxsZWdhbCB2YWx1ZXMuIEluIDIzNyBQQVNWIGdldHMgYW4gSVAKICBhZGRyZXNzIHRoYXQgaXMgd2F5IGJhZC4gSW4gMjM4IEVQU1YgZ2V0cyBhIHBvcnQgdGhhdCBpcyB3YXkgb3V0IG9mIHJhbmdlLgoKRGFuaWVsICgxNCBNYXJjaCAyMDA1KQotIEFkZGVkIGEgZmV3IG1pc3NpbmcgZmVhdHVyZXMgdG8gdGhlIGN1cmwtY29uZmlnIC0tZmVhdHVyZXMgbGlzdAoKLSBNb2RpZmllZCB0ZXN0Y3VybC5wbCB0byBub3cgb2ZmZXIKICAxIC0gY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIGFsbCBpbmZvIGl0IHByZXZpb3VzbHkgb25seSByZWFkIGZyb20KICAgICAgZmlsZTogLS1uYW1lLCAtLWVtYWlsLCAtLWRlc2MgYW5kIC0tY29uZmlndXJlCiAgMiAtIC0tbm9jdnN1cCBtYWtlcyBpdCBub3QgYXR0ZW1wdCB0byBkbyBjdnMgdXBkYXRlCiAgMyAtIC0tY3Jvc3Njb21waWxlIGluZm9ybXMgaXQgYW5kIG1ha2VzIGl0IG5vdCBhdHRlbXB0IHRoaW5ncyBpdCBjYW4ndCBkbwoKLSBGaXhlZCBudW1lcm91cyB3aW4zMiBjb21waWxlciB3YXJuaW5ncy4KCi0gUmVtb3ZlZCB0aGUgbGliL3NlY3VyaXR5LmggZmlsZSBzaW5jZSBpdCBzaGFkb3dlZCB0aGUgbWluZ3cvd2luMzIgaGVhZGVyCiAgd2l0aCB0aGUgc2FtZSBuYW1lIHdoaWNoIGlzIG5lZWRlZCBmb3IgU1NQSSBidWlsZHMuIFRoZSBjb250ZW50cyBvZiB0aGUKICBmb3JtZXIgc2VjdXJpdHkuaCBpcyBub3cgaSBrcmI0LmgKCi0gY29uZmlndXJlIC0tZW5hYmxlLXNzcGkgbm93IGVuYWJsZXMgU1NQSSBpbiB0aGUgYnVpbGQuIEl0IG9ubHkgd29ya3MgZm9yCiAgd2luZG93cyBidWlsZHMgKGluY2x1ZGluZyBjcm9zcy1jb21waWxlcyBmb3Igd2luZG93cykuCgpEYW5pZWwgKDEyIE1hcmNoIDIwMDUpCi0gRGF2aWQgSG91bGRlciBhZGRlZCAtLWZvcm0tc3RyaW5nIHRoYXQgYWRkcyB0aGF0IHN0cmluZyB0byBhIG11bHRpcGFydAogIGZvcm1wb3N0IHBhcnQsIHdpdGhvdXQgc3BlY2lhbCBjaGFyYWN0ZXJzIGhhdmluZyBzcGVjaWFsIG1lYW5pbmdzIGV0YyBsaWtlCiAgLS1mb3JtIGZlYXR1cmVzLgoKRGFuaWVsICgxMSBNYXJjaCAyMDA1KQotIGN1cmxfdmVyc2lvbl9pbmZvKCkgcmV0dXJucyB0aGUgZmVhdHVyZSBiaXQgQ1VSTF9WRVJTSU9OX1NTUEkgaWYgaXQgd2FzCiAgYnVpbHQgd2l0aCBTU1BJIHN1cHBvcnQuCgotIENocmlzdG9waGVyIFIuIFBhbG1lciBtYWRlIGl0IHBvc3NpYmxlIHRvIGJ1aWxkIGxpYmN1cmwgd2l0aCB0aGUKICBVU0VfV0lORE9XU19TU1BJIG9uIFdpbmRvd3MsIGFuZCB0aGVuIGxpYmN1cmwgd2lsbCBiZSBidWlsdCB0byB1c2UgdGhlCiAgbmF0aXZlIHdheSB0byBkbyBOVExNLiBTU1BJIGFsc28gYWxsb3dzIGxpYmN1cmwgdG8gcGFzcyBvbiB0aGUgY3VycmVudCB1c2VyCiAgYW5kIGl0cyBwYXNzd29yZCBpbiB0aGUgcmVxdWVzdC4KCkRhbmllbCAoOSBNYXJjaCAyMDA1KQotIERhbiBGIGltcHJvdmVkIHRoZSBTU0wgbGliIHNldHVwIGluIGNvbmZpZ3VyZS4KCi0gTm9kYWsgU29kYWsgcmVwb3J0ZWQgYSBjcmFzaCB3aGVuIHVzaW5nIGEgU09DS1M0IHByb3h5LgoKLSBKZWFuLU1hcmMgUmFuZ2VyIHBvaW50ZWQgb3V0IGFuIGVtYmFyYXNzaW5nIGRlYnVnIHByaW50ZigpIGxlZnRvdmVyIGluIHRoZQogIG11bHRpIGludGVyZmFjZSBjb2RlLgoKLSBBZGp1c3RlZCB0aGUgbWFuIHBhZ2UgZm9yIHRoZSBjdXJsX2dldGRhdGUoKSByZXR1cm4gdmFsdWUgZm9yIGRhdGVzIGFmdGVyCiAgeWVhciAyMDM4LiBGb3IgMzIgYml0IHRpbWVfdCBpdCByZXR1cm5zIDB4N2ZmZmZmZmYgYnV0IGZvciA2NGJpdCB0aW1lX3QgaXQKICByZXR1cm5zIGVpdGhlciB0aGUgY29ycmVjdCB2YWx1ZSBvciBldmVuIC0xIG9uIHNvbWUgc3lzdGVtcyB0aGF0IHN0aWxsIHNlZW0KICB0byBub3QgZGVhbCB3aXRoIHRoaXMgcHJvcGVybHkuIFRvciBBcm50c2VuIGZvdW5kIGEgNjRiaXQgQUlYIHN5c3RlbSBmb3IgdXMKICB0aGF0IGRpZCB0aGUgbGF0dGVyLiBHd2Vub2xlIEJlYXVjaGVzbmUncyBNYW5kcmFrZSBwYXRjaCBwdXQgdGhlIGxpZ2h0cyBvbgogIHRoaXMgcHJvYmxlbSBpbiB0aGUgZmlyc3QgcGxhY2UuCgpEYW5pZWwgKDggTWFyY2ggMjAwNSkKLSBEb21pbmljayBNZWdsaW8gcmVwb3J0ZWQgdGhhdCB1c2luZyBDVVJMT1BUX0ZJTEVUSU1FIHdoZW4gdHJhbnNmZXJyaW5nIGEgRlRQCiAgZmlsZSBnb3QgYSBMYXN0LU1vZGlmaWVkOiBoZWFkZXIgd3JpdHRlbiB0byB0aGUgZGF0YSBzdHJlYW0sIGNvcnJ1cHRpbmcgdGhlCiAgYWN0dWFsIGRhdGEuIFRoaXMgd2FzIGJlY2F1c2Ugc29tZSBjb25kaXRpb25zIGZyb20gdGhlIHByZXZpb3VzIEZUUCBjb2RlIHdhcwogIG5vdCBwcm9wZXJseSBicm91Z2h0IGludG8gdGhlIG5ldyBGVFAgY29kZS4gSSBmaXhlZCBhbmQgSSBhZGRlZCB0ZXN0IGNhc2UKICA1MjAgdG8gdmVyaWZ5LiAoVGhpcyBidWcgd2FzIGludHJvZHVjZWQgaW4gNy4xMy4xKQoKLSBEYW4gRmFuZHJpY2ggZml4ZWQgdGhlIGNvbmZpZ3VyZSAtLXdpdGgtemxpYiBvcHRpb24gdG8gYWx3YXlzIGNvbnNpZGVyIHRoZQogIGdpdmVuIHBhdGggYmVmb3JlIGFueSBzdGFuZGFyZCBwYXRocy4KCkRhbmllbCAoNiBNYXJjaCAyMDA1KQotIFJhbmR5IE1jTXVyY2h5IHdhcyB0aGUgZmlyc3QgdG8gcmVwb3J0IHRoYXQgdmFsZ3JpbmQucG0gd2FzIG1pc3NpbmcgZnJvbSB0aGUKICByZWxlYXNlIGFyY2hpdmUgYW5kIHRodXMgJ21ha2UgdGVzdCcgZmFpbHMuCgpEYW5pZWwgKDUgTWFyY2ggMjAwNSkKLSBEYW4gRmFuZHJpY2ggYWRkZWQgSEFWRV9GVFJVTkNBVEUgdG8gc2V2ZXJhbCBjb25maWctKi5oIGZpbGVzLgoKLSBBZGRlZCB0ZXN0IGNhc2UgMjM1IHRoYXQgbWFrZXMgYSByZXN1bWVkIHVwbG9hZCBvZiBhIGZpbGUgdGhhdCBpc24ndCBwcmVzZW50CiAgb24gdGhlIHJlbW90ZSBzaWRlLiBUaGlzIHRoZW4gY29udmVydHMgdGhlIG9wZXJhdGlvbiB0byBhbiBvcmRpbmFyeSBTVE9SCiAgdXBsb2FkLiBUaGlzIHdhcyByZXF1ZXN0ZWQvcG9pbnRlZCBvdXQgYnkgSWduYWNpbyBWYXpxdWV6LUFicmFtcy4KCiAgSXQgYWxzbyBwcm92ZWQgKGFuZCBJIGZpeGVkKSBhIGJ1ZyBpbiB0aGUgbmV3bHkgcmV3cml0dGVuIGZ0cCBjb2RlIChhbmQKICBwcmVzZW50IGluIHRoZSA3LjEzLjEgcmVsZWFzZSkgd2hlbiB0cnlpbmcgdG8gcmVzdW1lIGFuIHVwbG9hZCBhbmQgdGhlCiAgc2VydmVycyByZXR1cm5zIGFuIGVycm9yIHRvIHRoZSBTSVpFIGNvbW1hbmQuIGxpYmN1cmwgdGhlbiBsb29wcyBhbmQgc2VuZHMKICBTSVpFIGNvbW1hbmRzIGluZmluaXRlbHkuCgotIERhbiBGYW5kcmljaCBmaXhlZCBhIFNTTCBwcm9ibGVtIGludHJvZHVjZWQgb24gRmVicnVhcnkgOXRoIHRoYXQgbWFkZQogIGxpYmN1cmwgYXR0ZW1wdCB0byBsb2FkIHRoZSB3aG9sZSByYW5kb20gZmlsZSB0byBzZWVkIHRoZSBQUk5HLiBUaGlzIGlzCiAgcmVhbGx5IGJhZCBzaW5jZSB0aGlzIHR1cm5zIG91dCB0byBiZSB1c2luZyAvZGV2L3VyYW5kb20gYXQgdGltZXMuLi4KClZlcnNpb24gNy4xMy4xICg0IE1hcmNoIDIwMDUpCgpEYW5pZWwgKDQgTWFyY2ggMjAwNSkKLSBEYXZlIERyaWJpbiBtYWRlIGl0IHBvc3NpYmxlIHRvIHNldCBDVVJMT1BUX0NPT0tJRUZJTEUgdG8gIiIgdG8gYWN0aXZhdGUKICB0aGUgY29va2llICJlbmdpbmUiIHdpdGhvdXQgaGF2aW5nIHRvIHByb3ZpZGUgYW4gZW1wdHkgb3Igbm9uLWV4aXN0aW5nIGZpbGUuCgotIFJlbmUgUmViZSBmaXhlZCBhIC0jIGNyYXNoIHdoZW4gbW9yZSBkYXRhIHRoYW4gZXhwZWN0ZWQgd2FzIHJldHJpZXZlZC4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwNSkKLSBOVExNIGFuZCBmdHAta3JiNCBidWZmZXIgb3ZlcmZsb3cgZml4ZWQsIGFzIHJlcG9ydGVkIGhlcmU6CiAgaHR0cDovL3d3dy5zZWN1cml0eWZvY3VzLmNvbS9hcmNoaXZlLzEvMzkxMDQyIGFuZCB0aGUgQ0FOIHJlcG9ydCBoZXJlOgogIGh0dHA6Ly9jdmUubWl0cmUub3JnL2NnaS1iaW4vY3ZlbmFtZS5jZ2k/bmFtZT1DQU4tMjAwNS0wNDkwCgogIElmIHRoZXNlIHNlY3VyaXR5IGd1eXMgd2VyZSBzZXJpb3VzLCB3ZSdkIGJlZW4gbm90aWZpZWQgaW4gYWR2YW5jZSBhbmQgd2UKICBjb3VsZCd2ZSBzYXZlZCBhIGZldyBvZiB5b3UgYSBsaXR0bGUgc3VycHJpc2UsIGJ1dCBub3cgd2Ugd2VyZW4ndC4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwNSkKLSBSYWxwaCBNaXRjaGVsbCByZXBvcnRlZCBhIGZsYXcgd2hlbiB5b3UgdXNlZCBhIHByb3h5IHdpdGggYXV0aCwgYW5kIHlvdQogIHJlcXVlc3RlZCBkYXRhIGZyb20gYSBob3N0IGFuZCB0aGVuIGZvbGxvd2VkIGEgcmVkaXJlY3QgdG8gYW5vdGhlcgogIGhvc3QuIGxpYmN1cmwgdGhlbiBkaWRuJ3QgdXNlIHRoZSBwcm94eS1hdXRoIHByb3Blcmx5IGluIHRoZSBzZWNvbmQgcmVxdWVzdCwKICBkdWUgdG8gdGhlIGhvc3Qtb25seSBjaGVjayBmb3Igb3JpZ2luYWwgaG9zdCBuYW1lIHdyb25nbHkgYmVpbmcgZXh0ZW5kZWQgdG8KICB0aGUgcHJveHkgYXV0aCBhcyB3ZWxsLiBBZGRlZCB0ZXN0IGNhc2UgMjMzIHRvIHZlcmlmeSB0aGUgZmxhdyBhbmQgdGhhdCB0aGUKICBmaXggcmVtb3ZlZCB0aGUgcHJvYmxlbS4KCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNSkKLSBNaWtlIERvYmJzIHJlcG9ydGVkIGEgbWluZ3cgYnVpbGQgZmFpbHVyZSBkdWUgdG8gdGhlIGxhY2sgb2YKICBCVUlMRElOR19MSUJDVVJMIGJlaW5nIGRlZmluZWQgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0LiBOb3cgdGhpcyBpcyBkZWZpbmVkIGJ5CiAgY29uZmlndXJlIHdoZW4gbWluZ3cgaXMgdXNlZC4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwNSkKLSBEYXZpZCBpbiBidWcgcmVwb3J0ICMxMTI0NTg4IGZvdW5kIGFuZCBmaXhlZCBhIHNvY2tldCBsZWFrIHdoZW4gbGliY3VybAogIGRpZG4ndCBjbG9zZSB0aGUgc29ja2V0IHByb3Blcmx5IHdoZW4gcmV0dXJuaW5nIGVycm9yIGR1ZSB0byBmYWlsaW5nCiAgbG9jYWxiaW5kCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDUpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIHJlcG9ydGVkIGEgcHJvYmxlbSB3aXRoIEhUVFAtUE9TVGluZyB1c2luZyAiYW55YXV0aCIKICB0aGF0IHBpY2tzIE5UTE0uIFRoYW5rcyB0byBEYXZpZCBCeXJvbiBsZXR0aW5nIG1lIHRlc3QgTlRMTSBhZ2FpbnN0IGhpcwogIHNlcnZlcnMsIEkgY291bGQgcXVpY2tseSByZXBlYXQgYW5kIGZpeCB0aGUgcHJvYmxlbS4gSXQgdHVybmVkIG91dCB0byBiZToKCiAgV2hlbiBsaWJjdXJsIFBPU1RzIHdpdGhvdXQga25vd2luZy91c2luZyBhbiBhdXRoZW50aWNhdGlvbiBhbmQgaXQgZ2V0cyBiYWNrCiAgYSBsaXN0IG9mIHR5cGVzIGZyb20gd2hpY2ggaXQgcGlja3MgTlRMTSwgaXQgbmVlZHMgdG8gZWl0aGVyIGNvbnRpbnVlCiAgc2VuZGluZyBpdHMgZGF0YSBpZiBpdCBrZWVwcyB0aGUgY29ubmVjdGlvbiBhbGl2ZSwgb3Igbm90IHNlbmQgdGhlIGRhdGEgYnV0CiAgY2xvc2UgdGhlIGNvbm5lY3Rpb24uIFRoZW4gZG8gdGhlIGZpcnN0IHN0ZXAgaW4gdGhlIE5UTE0gYXV0aC4gbGliY3VybAogIGRpZG4ndCBzZW5kIHRoZSBkYXRhIG5vciBjbG9zZSB0aGUgY29ubmVjdGlvbiBidXQgc2ltcGx5IHJlYWQgdGhlCiAgcmVzcG9uc2UtYm9keSBhbmQgdGhlbiBzZW50IHRoZSBmaXJzdCBuZWdvdGlhdGlvbiBzdGVwLiBXaGljaCB0aGVuIGZhaWxlZAogIG1pc2VyYWJseSBvZiBjb3Vyc2UuIFRoZSBmaXhlZCB2ZXJzaW9uIGZvcmNlcyBhIGNvbm5lY3Rpb24gaWYgdGhlcmUgaXMgbW9yZQogIHRoYW4gMjAwMCBieXRlcyBsZWZ0IHRvIHNlbmQuCgpEYW5pZWwgKDE0IEZlYnJ1YXJ5IDIwMDUpCi0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgZGlkbid0IGNoZWNrIGZvciBFTkdJTkVfbG9hZF9idWlsdGluX2VuZ2luZXMoKSBzbyBpdAogIHdhcyBuZXZlciB1c2VkLgoKRGFuaWVsICgxMSBGZWJydWFyeSAyMDA1KQotIFJlbW92ZWQgYWxsIHVzZXMgb2Ygc3RyZnRpbWUoKSBzaW5jZSBpdCB1c2VzIHRoZSBsb2NhbGlzZWQgdmVyc2lvbiBvZiB0aGUKICB3ZWVrIGRheSBuYW1lcyBhbmQgbW9udGggbmFtZXMgYW5kIHNlcnZlcnMgZG9uJ3QgbGlrZSB0aGF0LgoKRGFuaWVsICgxMCBGZWJydWFyeSAyMDA1KQotIE5vdyB0aGUgdGVzdCBzY3JpcHQgZGlzYWJsZXMgdmFsZ3JpbmQtdGVzdGluZyB3aGVuIHRoZSB0ZXN0IHN1aXRlIHJ1bnMgaWYKICBsaWJjdXJsIGlzIGJ1aWx0IHNoYXJlZC4gT3RoZXJ3aXNlIHZhbGdyaW5kIG9ubHkgdGVzdHMgdGhlIHNoZWxsIHRoYXQgcnVucwogIHRoZSB3cmFwcGVyLXNjcmlwdCBuYW1lZCAnY3VybCcgdGhhdCBpcyBhIGZyb250LWVuZCB0byBjdXJsIGluIHRoaXMgY2FzZS4KICBUaGlzIHNob3VsZCBhbHNvIGZpeCB0aGUgaHVnZSBhbW91bnQgb2YgcmVwb3J0cyBvZiBmYWxzZSBwb3NpdGl2ZXMgd2hlbgogIHZhbGdyaW5kIGhhcyBpZGVudGlmaWVkIGxlYWtzIGluIChiYSlzaCBhbmQgbm90IGluIGN1cmwgYW5kIHBlb3BsZSByZXBvcnQKICB0aGF0IGFzIGN1cmwgYnVncy4gQnVnIHJlcG9ydCAjMTExNjY3MiBpcyBvbmUgZXhhbXBsZS4KCiAgQWxzbywgdGhlIHZhbGdyaW5kIHJlcG9ydCBwYXJzZXIgaGFzIGJlZW4gYWRhcHRlZCB0byBjaGVjayB0aGF0IGF0IGxlYXN0IG9uZQogIG9mIHRoZSBzb3VyY2VzIGluIGEgc3RhY2sgc3RyYWNlIGlzIG9uZSBvZiAobGliKWN1cmwncyBzb3VyY2UgZmlsZXMgb3IKICBvdGhlcndpc2UgaXQgd2lsbCBub3QgY29uc2lkZXIgdGhlIHByb2JsZW0gdG8gY29uY2VybiAobGliKWN1cmwuCgotIE1hcnR5IEt1aHJ0IHN0cmVhbWxpbmVkIHRoZSBWTVMgYnVpbGQuCgpEYW5pZWwgKDkgRmVicnVhcnkgMjAwNSkKLSBEYXZpZCBCeXJvbiBmaXhlZCBoaXMgU1NMIHByb2JsZW1zLCBpbml0aWFsbHkgbWVudGlvbmVkIGhlcmU6CiAgaHR0cDovL2N1cmwuaGF4eC5zZS9tYWlsL2xpYi0yMDA1LTAxLzAyNDAuaHRtbC4gSXQgdHVybmVkIG91dCB3ZSBkaWRuJ3QgdXNlCiAgU1NMX3BlbmRpbmcoKSBhcyB3ZSBzaG91bGQuCgotIENvbnZlcnRlZCBsb3RzIG9mIEZUUCBjb2RlIHRvIGEgc3RhdGVtYWNoaW5lLCBzbyB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2UKICBkb2Vzbid0IGJsb2NrIHdoaWxlIGNvbW11bmljYXRpbmcgY29tbWFuZHMtcmVzcG9uc2VzIHdpdGggYW4gRlRQIHNlcnZlci4KCiAgSSd2ZSBhZGRlZCBhIGNvbW1lbnQgbGlrZSBCTE9DS0lORyBpbiB0aGUgY29kZSBvbiBhbGwgc3BvdHMgSSBjb3VsZCBmaW5kCiAgd2hlcmUgd2Ugc3RpbGwgaGF2ZSBibG9ja2luZyBvcGVyYXRpb25zLiBXaGVuIHdlIGNoYW5nZSBjdXJsX2Vhc3lfcGVyZm9ybSgpCiAgdG8gdXNlIHRoZSBtdWx0aSBpbnRlcmZhY2UsIHdlJ2xsIGFsc28gYmUgYWJsZSB0byBzaW1wbGlmeSB0aGUgY29kZSBzaW5jZQogIHRoZXJlIHdpbGwgb25seSBiZSBvbmUgImludGVybmFsIGludGVyZmFjZSIuCgogIFdoaWxlIGRvaW5nIHRoaXMsIEkndmUgbm93IG1hZGUgQ1VSTEVfRlRQX0FDQ0VTU19ERU5JRUQgc2VwYXJhdGUgZnJvbSB0aGUKICBuZXcgQ1VSTEVfTE9HSU5fREVOSUVELiBUaGUgZmlyc3Qgb25lIGlzIG5vdyBhY2Nlc3MgZGVuaWVkIHRvIGEgZnVuY3Rpb24sCiAgbGlrZSBjaGFuZ2luZyBkaXJlY3Rvcnkgb3IgcmV0cmlldmluZyBhIGZpbGUsIHdoaWxlIHRoZSBzZWNvbmQgbWVhbnMgdGhhdCB3ZQogIHdlcmUgZGVuaWVkIGxvZ2luLgoKICBUaGUgQ1ZTIHRhZyAnYmVmb3JlX2Z0cF9zdGF0ZW1hY2hpbmUnIHdhcyBzZXQganVzdCBiZWZvcmUgdGhpcyB3ZW50IGluLCBpbgogIGNhc2Ugb2YgZnV0dXJlIG5lZWQuCgotIEdpc2xlIG1hZGUgdGhlIERJQ1QgY29kZSBzZW5kIENSTEYgYW5kIG5vdCBqdXN0IExGIGFzIHRoZSBzcGVjIHNheXMgc28uCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwNSkKLSBHaXNsZSBmaXhlZCBwcm9ibGVtcyB3aGVuIGxpYmN1cmwgcnVucyBvdXQgb2YgbWVtb3J5LCBhbmQgd29ya2VkIG9uIG1ha2luZwogIHN1cmUgdGhlIHByb3BlciBlcnJvciBjb2RlIGlzIHJldHVybmVkIGZvciB0aG9zZSBvY2NhdGlvbnMuCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwNSkKLSBNYXJ1a28gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggaW5mbGF0ZSBkZWNvbXByZXNzaW5nIGV4YWN0bHkgNjRLCiAgY29udGVudHMuCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwNSkKLSBFcmljIFZlcmduYXVkIGZvdW5kIGEgdXNlIG9mIGFuIHVuaW5pdGlhbGlzZWQgdmFyaWFibGUgaW4gdGhlIGZ0cCB3aGVuIGRvaW5nCiAgUE9SVCBvbiBpcHY2LWVuYWJsZWQgaG9zdHMuCgotIERhdmlkIEJ5cm9uIHBvaW50ZWQgb3V0IHdlIGNvdWxkIHVzZSBCVUZTSVpFIHRvIHJlYWQgZGF0YSAoaW4KICBsaWIvdHJhbnNmZXIuYykgaW5zdGVhZCBvZiB1c2luZyBCVUZTSVpFIC0xLgoKVmVyc2lvbiA3LjEzLjAgKDEgRmVicnVhcnkgMjAwNSkKCkRhbmllbCAoMzEgSmFudWFyeSAyMDA1KQotIEFkZGVkIExhcnMgTmlsc3NvbidzIGh0bWx0aXRsZS5jYyBleGFtcGxlCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwNSkKLSBGaXhlZCBhIG1lbW9yeSBsZWFrIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgdGhlIERPIG9wZXJhdGlvbgogIGZhaWxlZCAoYXMgaW4gdGVzdCBjYXNlIDIwNSkuCgotIEZpeGVkIGEgdmFsZ3JpbmQgd2FybmluZyBmb3IgZmlsZTovLyBvcGVyYXRpb25zLgoKLSBGaXhlZCBhIHZhbGdyaW5kIHJlcG9ydCBpbiB0aGUgdXJsIGdsb2JiaW5nIGNvZGUgZm9yIHRoZSBjdXJsIGNvbW1hbmQgbGluZQogIHRvb2wuCgotIEJ1Z2ZpeGVkIHRoZSBwYXJzZXIgdGhhdCBzY2FucyB0aGUgdmFsZ3JpbmQgcmVwb3J0IG91dHB1dHMgKGluIHJ1bnRlc3RzLnBsKS4KICBJIG5vdGljZWQgdGhhdCBpdCBwcmV2aW91c2x5IGRpZG4ndCBkZXRlY3QgYW5kIHJlcG9ydCB0aGUgIkNvbmRpdGlvbmFsIGp1bXAKICBvciBtb3ZlIGRlcGVuZHMgb24gdW5pbml0aWFsaXNlZCB2YWx1ZShzKSIgZXJyb3IuIFdoZW4gSSBmaXhlZCB0aGlzLCBJCiAgY2F1Z2h0IGEgZmV3IGN1cmwgYnVncyB3aXRoIGl0LiBBbmQgdGhlbiBJIGhhZCB0byBzcGVuZCB0aW1lIHRvIG1ha2UgdGhlCiAgdGVzdCBzdWl0ZSBJR05PUkUgdGhlc2UgZXJyb3JzIHdoZW4gT3BlblNTTCBpcyB1c2VkIHNpbmNlIGl0IHByb2R1Y2UgbWFzc2l2ZQogIGFtb3VudHMgb2YgdmFsZ3JpbmQgd2FybmluZ3MgKGJ1dCBvbmx5IG9mIHRoZSAiQ29uZGl0aW9uYWwuLi4iIGtpbmQgaXQKICBzZWVtcykuIFNvLCBpZiBhIHRlc3QgdGhhdCByZXF1aXJlcyBTU0wgaXMgcnVuLCBpdCBpZ25vcmVzIHRoZQogICJDb25kaXRpb25hbC4uLiIgZXJyb3JzLCBhbmQgeW91J2xsIGdldCBhICJ2YWxncmluZCBQQVJUSUFMIiBvdXRwdXQgaW5zdGVhZAogIG9mICJ2YWxncmluZCBPSyIuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwNSkKLSBVc2luZyB0aGUgbXVsdGkgaW50ZXJmYWNlLCBhbmQgZG9pbmcgYSByZXF1c3RlZCBhIHJlLXVzZWQgY29ubmVjdGlvbiB0aGF0CiAgZ2V0cyBjbG9zZWQganVzdCBhZnRlciB0aGUgcmVxdWVzdCBoYXMgYmVlbiBzZW50IGZhaWxlZCBhbmQgZGlkIG5vdCByZS1pc3N1ZQogIGEgcmVxdWVzdCBvbiBhIGZyZXNoIHJlY29ubmVjdCBsaWtlIHRoZSBlYXN5IGludGVyZmFjZSBkaWQuIE5vdyBpdCBkb2VzIQoKLSBEZWZpbmUgQ1VSTF9NVUxUSUVBU1kgd2hlbiBidWlsZGluZyBsaWJjdXJsIChsaWIvZWFzeS5jIHRvIGJlIGV4YWN0KSwgdG8gdXNlCiAgbXkgbmV3IGN1cmxfZWFzeV9wZXJmb3JtKCkgdGhhdCB1c2VzIHRoZSBtdWx0aSBpbnRlcmZhY2UgdG8gcnVuIHRoZQogIHJlcXVlc3QuIEl0IGlzIGEgZ3JlYXQgdGVzdGJlZCBmb3IgdGhlIG11bHRpIGludGVyZmFjZSBhbmQgSSBiZWxpZXZlIHdlCiAgc2hhbGwgZG8gaXQgdGhpcyB3YXkgZm9yIHJlYWwgaW4gdGhlIGZ1dHVyZSB3aGVuIHdlIGhhdmUgYSBzdWNjZXNzb3IgdG8KICBjdXJsX211bHRpX2Zkc2V0KCkuIEkndmUgdXNlZCB0aGlzIGFwcHJvYWNoIHRvIGRldGVjdCBhbmQgZml4IHNldmVyYWwgb2YgdGhlCiAgcmVjZW50IG11bHRpLWludGVyZmFjZXMgaXNzdWVzLgoKLSBBZGp1c3RlZCB0aGUgS05PV05fQlVHUyAjMTcgZml4IGEgYml0IG1vcmUgc2luY2UgdGhlIEZUUCBjb2RlIGFsc28gZGlkIHNvbWUKICBiYWQgYXNzdW1wdGlvbnMuCgotIG11bHRpIGludGVyZmFjZTogd2hlbiBhIHJlcXVlc3QgaXMgZGVuaWVkIGR1ZSB0byAiTWF4aW11bSByZWRpcmVjdHMKICBmb2xsb3dlZCIgbGliY3VybCBsZWFrZWQgdGhlIGxhc3QgTG9jYXRpb246IFVSTC4KCi0gQ29ubmVjdCBmYWlsdXJlcyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIG9mdGVuIHJldHVybmVkIGFzICJjb25uZWN0KCkKICB0aW1lZCBvdXQiIGV2ZW4gdGhvdWdoIHRoZSByZWFzb24gd2FzIGRpZmZlcmVudC4KCkRhbmllbCAoMjggSmFudWFyeSAyMDA1KQotIEtOT1dOX0JVR1MgIzE3IGZpeGVkLiBBIEROUyBjYWNoZSBlbnRyeSBtYXkgbm90IHJlbWFpbiBsb2NrZWQgYmV0d2VlbiB0d28KICBjdXJsX2Vhc3lfcGVyZm9ybSgpIGludm9rZXMuIEl0IHdhcyBwcmV2aW91c2x5IHVubG9ja2VkIGF0IGRpc2Nvbm5lY3QsIHdoaWNoCiAgY291bGQgbWVhbiB0aGF0IGl0IHJlbWFpbmVkIGxvY2tlZCBiZXR3ZWVuIG11bHRpcGxlIHRyYW5zZmVycy4gVGhlIEROUyBjYWNoZQogIG1heSBub3QgbGl2ZSBhcyBsb25nIGFzIHRoZSBjb25uZWN0aW9uIGNhY2hlIGRvZXMsIGFzIHRoZXkgYXJlIHNlcGFyYXRlLgoKICBUbyBkZWFsIHdpdGggdGhlIGxhY2sgb2YgRE5TIChob3N0IGFkZHJlc3MpIGRhdGEgYXZhaWxhYmlsaXR5IGluIHJlLXVzZWQKICBjb25uZWN0aW9ucywgbGliY3VybCBub3cga2VlcHMgYSBjb3B5IG9mIHRoZSBJUCBhZHJlc3MgYXMgYSBzdHJpbmcsIHRvIGJlCiAgYWJsZSB0byBzaG93IGl0IGV2ZW4gb24gc3Vic2VxdWVudCByZXF1ZXN0cyBvbiB0aGUgc2FtZSBjb25uZWN0aW9uLgoKICBUaGUgcHJvYmxlbSBjb3VsZCBiZSBtYWRlIHRvIGFwcGVhciB3aXRoIHRoaXMgc3R1bnQ6CgogIDEuIGNyZWF0ZSBhIG11bHRpIGhhbmRsZQogIDIuIGFkZCBhbiBlYXN5IGhhbmRsZQogIDMuIGZldGNoIGEgVVJMIHRoYXQgaXMgcGVyc2lzdGVudCAobGVhdmVzIHRoZSBjb25uZWN0aW9uIGFsaXZlKQogIDQuIHJlbW92ZSB0aGUgZWFzeSBoYW5kbGUgZnJvbSB0aGUgbXVsdGkKICA1LiBraWxsIHRoZSBtdWx0aSBoYW5kbGUKICA2LiBjcmVhdGUgYSBtdWx0aSBoYW5kbGUKICA3LiBhZGQgdGhlIHNhbWUgZWFzeSBoYW5kbGUgdG8gdGhlIG5ldyBtdWx0aSBoYW5kbGUKICA4LiBmZXRjaCBhIFVSTCBmcm9tIHRoZSBzYW1lIHNlcnZlciBhcyBiZWZvcmUgKHJlLXVzaW5nIHRoZSBjb25uZWN0aW9uKQoKLSBTdGVwaGVuIE1vcmUgcG9pbnRlZCBvdXQgdGhhdCBDVVJMT1BUX0ZUUFBPUlQgYW5kIHRoZSAtUCBvcHRpb24gZGlkbid0IHdvcmsKICB3aGVuIGJ1aWx0IGlwdjYtZW5hYmxlZC4gSSd2ZSBub3cgbWFkZSBhIGZpeCBmb3IgaXQuIFdyaXRpbmcgdGVzdCBjYXNlcyBmb3IKICBjdXN0b20gcG9ydCBob3N0cyB0dXJuZWQgdG9vIHRyaWNreSBzbyB1bmZvcnR1bmF0ZWx5IHRoZXJlJ3Mgbm9uZS4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDA1KQotIElhbiBGb3JkIGFza2VkIGFib3V0IHN1cHBvcnQgZm9yIHRoZSBGVFAgY29tbWFuZCBBQ0NULCBhbmQgSSBkaXNjb3ZlcmVkIGl0CiAgaXMgcHJlc2VudCBpbiBSRkM5NTkuLi4gc28gbm93IChsaWIpY3VybCBzdXBwb3J0cyBpdCBhcyB3ZWxsLiAtLWZ0cC1hY2NvdW50CiAgYW5kIENVUkxPUFRfRlRQX0FDQ09VTlQgc2V0IHRoZSBhY2NvdW50IHN0cmluZy4gKFRoZSBzZXJ2ZXIgbWF5IGFzayBmb3IgYW4KICBhY2NvdW50IHN0cmluZyBhZnRlciBQQVNTIGhhdmUgYmVlbiBzZW50IGF3YXkuIFRoZSBjbGllbnQgcmVzcG9uZHMKICB3aXRoICJBQ0NUIFthY2NvdW50IHN0cmluZ10iLikgQWRkZWQgdGVzdCBjYXNlIDIyOCBhbmQgMjI5IHRvIHZlcmlmeSB0aGUKICBmdW5jdGlvbmFsaXR5LiBVcGRhdGVkIHRoZSB0ZXN0IEZUUCBzZXJ2ZXIgdG8gc3VwcG9ydCBBQ0NUIHNvbWV3aGF0LgoKLSBEYXZpZCBTaGF3IGNvbnRyaWJ1dGVkIGEgZmFpcmx5IGNvbXBsZXRlIGFuZCBkZXRhaWxlZCBhdXRvY29uZiB0ZXN0IHlvdSBjYW4KICB1c2UgdG8gZGV0ZWN0IGxpYmN1cmwgYW5kIHNldHVwIHZhcmlhYmxlcyBmb3IgdGhlIHByb3RvY29scyB0aGUgaW5zdGFsbGVkCiAgbGliY3VybCBzdXBwb3J0czogZG9jcy9saWJjdXJsL2xpYmN1cmwubTQKCkRhbmllbCAoMjEgSmFudWFyeSAyMDA1KQotIE1ham9yIEZUUCB0aGlyZCBwYXJ0eSB0cmFuc2ZlciBvdmVyaGF1bC4KCiAgVGhlc2UgZm91ciBvcHRpb25zIGFyZSBub3cgb2Jzb2xldGU6IENVUkxPUFRfU09VUkNFX0hPU1QsCiAgQ1VSTE9QVF9TT1VSQ0VfUEFUSCwgQ1VSTE9QVF9TT1VSQ0VfUE9SVCAodGhpcyBvcHRpb24gZGlkbid0IHdvcmsgYmVmb3JlKQogIGFuZCBDVVJMT1BUX1BBU1ZfSE9TVC4KCiAgVGhlc2UgdHdvIG9wdGlvbnMgYXJlIGFkZGVkOiBDVVJMT1BUX1NPVVJDRV9VUkwgYW5kIENVUkxPUFRfU09VUkNFX1FVT1RFLgoKICBUaGUgdGFyZ2V0LXNpZGUgZGlkbid0IHVzZSB0aGUgcHJvcGVyIHBhdGggd2l0aCBSRVRSLCBhbmQgdGh1cyB0aGlzIG9ubHkKICB3b3JrZWQgY29ycmVjdGx5IGluIHRoZSBsb2dpbiBwYXRoIChpLmUgd2l0aG91dCBkb2luZyBhbnkgQ1dEKS4gVGhlIHNvdXJjZS0KICBzaWRlIHN0aWxsIHVzZXMgYSB3cm9uZyBwYXRoLCBidXQgdGhlIGZpeCBmb3IgdGhpcyB3aWxsIG5lZWQgdG8gd2FpdC4gVmVyaWZ5CiAgdGhlIGZsYXcgYnkgdXNpbmcgYSBzb3VyY2UgVVJMIHdpdGggaW5jbHVkZWQgJVhYLWNvZGVzLgoKICBNYWRlIENVUkxPUFRfRlRQUE9SVCBjb250cm9sIHdlYXRoZXIgdGhlIHRhcmdldCBvcGVyYXRpb24gc2hvdWxkIHVzZSBQT1JUCiAgKG9yIG5vdCkuIFRoZSBvdGhlciBzaWRlIHRodXMgdXNlcyBwYXNzaXZlIChQQVNWKSBtb2RlLgoKICBVcGRhdGVkIHRoZSBmdHAzcmRwYXJ0eS5jIGV4YW1wbGUgc291cmNlIHRvIHVzZSB0aGUgdXBkYXRlZCBvcHRpb25zLgoKICBBZGRlZCBzdXBwb3J0IGZvciBhIHNlY29uZCBGVFAgc2VydmVyIGluIHRoZSB0ZXN0IHN1aXRlLiBOYW1lZC4uLiBmdHAyLgogIEFkZGVkIHRlc3QgY2FzZXMgMjMwLCAyMzEgYW5kIDIzMiBhcyBhIGZldyBmaXJzdCBiYXNpYyB0ZXN0cyBvZiB2ZXJ5IHNpbXBsZQogIDNyZCBwYXJ0eSB0cmFuc2ZlcnMuCgogIENoYW5nZWQgdGhlIGRlYnVnIG91dHB1dCB0byBpbmNsdWRlICd0YXJnZXQnIGFuZCAnc291cmNlJyB3aGVuIGEgM3JkIHBhcnR5CiAgaXMgYmVpbmcgbWFkZSwgdG8gbWFrZSBpdCBjbGVhcmVyIHdoYXQgY29tbWFuZHMvcmVzcG9uc2VzIGNhbWUgb24gd2hhdAogIGNvbm5lY3Rpb24uCgogIEFkZGVkIHRocmVlIG5ldyBjb21tYW5kIGxpbmUgb3B0aW9uczogLS0zcC11cmwsIC0tM3AtdXNlciBhbmQgLS0zcC1xdW90ZS4KCiAgRG9jdW1lbnRlZCB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG9wdGlvbnMgcmVsYXRlZAogIHRvIHRoaXJkIHBhcnR5IHRyYW5zZmVycy4KCiAgKFRlbXBvcmFyaWx5KSBkaXNhYmxlZCB0aGUgYWJpbGl0eSB0byByZS11c2UgYW4gZXhpc3RpbmcgY29ubmVjdGlvbiBmb3IgdGhlCiAgc291cmNlIGNvbm5lY3Rpb24uIFRoaXMgaXMgYmVjYXVzZSBpdCBuZWVkcyB0byBmb3JjZSBhIG5ldyBpbiBjYXNlIHRoZQogIHNvdXJjZSBhbmQgdGFyZ2V0IGlzIHRoZSBzYW1lIGhvc3QsIGFuZCB0aGUgaG9zdCBuYW1lIGNoZWNrIGlzIHRyaWNraWVyIG5vdwogIHdoZW4gdGhlIHNvdXJjZSBpcyBpZGVudGlmaWVkIHdpdGggYSBmdWxsIFVSTCBpbnN0ZWFkIG9mIGEgcGxhaW4gaG9zdCBuYW1lCiAgbGlrZSBiZWZvcmUuCgogIFRPRE8gKHNob3J0LXRlcm0pIGZvciAzcmQgcGFydHkgdHJhbnNmZXJzOiBxdW90ZSBzdXBwb3J0LiBUaGUgb3B0aW9ucyBhcmUKICB0aGVyZSwgd2UgbmVlZCB0byBhZGQgdGVzdCBjYXNlcyB0byB2ZXJpZnkgdGhlaXIgZnVuY3Rpb25hbGl0eS4KCiAgVE9ETyAobG9uZy10ZXJtKSBmb3IgM3JkIHBhcnR5IHRyYW5zZmVyczogSVB2NiBzdXBwb3J0IChFUFJUIGFuZCBFUFNWIGV0YykKICBhbmQgU1NML1RTTCBzdXBwb3J0LgoKRGFuaWVsICgyMCBKYW51YXJ5IDIwMDUpCi0gUGhpbGlwcGUgSGFtZWF1IGZvdW5kIG91dCB0aGF0IC1RICIrW2NvbW1hbmRdIiBkaWRuJ3Qgd29yaywgYWx0aG91Z2ggc29tZQogIGNvZGUgd2FzIHdyaXR0ZW4gZm9yIGl0LiBJIGZpeGVkIGFuZCBhZGRlZCB0ZXN0IGNhc2UgMjI3IHRvIHZlcmlmeSBpdC4KICBUaGUgY3VybC4xIG1hbiBwYWdlIGRpZG4ndCBtZW50aW9uIHRoZSAnKycgc28gSSBhZGRlZCBpdC4KCkRhbmllbCAoMTkgSmFudWFyeSAyMDA1KQotIFN0ZXBoYW4gQmVyZ21hbm4gbWFkZSBsaWJjdXJsIHJldHVybiBDVVJMRV9VUkxfTUFMRk9STUFUIGlmIGFuIEZUUCBVUkwKICBjb250YWlucyAlMGEgb3IgJTBkIGluIHRoZSB1c2VyLCBwYXNzd29yZCBvciBDV0QgcGFydHMuIChBIGZ1dHVyZSBmaXggd291bGQKICBpbmNsdWRlIGRvaW5nIGl0IGZvciAlMDAgYXMgd2VsbCAtIHNlZSBLTk9XTl9CVUdTIGZvciBkZXRhaWxzLikgVGVzdCBjYXNlCiAgMjI1IGFuZCAyMjYgd2VyZSBhZGRlZCB0byB2ZXJpZnkgdGhpcwoKLSBTdGVwaGFuIEJlcmdtYW5uIHBvaW50ZWQgb3V0IHR3byBmbGF3cyBpbiBsaWJjdXJsIGJ1aWx0IHdpdGggSFRUUCBkaXNhYmxlZDoKCiAgMSkgdGhlIHByb3h5IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc3RpbGwgcmVhZCBhbmQgdXNlZCB0byBzZXQgSFRUUCBwcm94eQoKICAyKSB5b3UgY291bGRuJ3QgZGlzYWJsZSBodHRwIHByb3h5IHdpdGggQ1VSTE9QVF9QUk9YWSAoc2luY2UgdGhlIG9wdGlvbiB3YXMKICAgICBkaXNhYmxlZCkuIFRoaXMgaXMgaW1wb3J0YW50IHNpbmNlIGFwcHMgbWF5IHdhbnQgdG8gZGlzYWJsZSBIVFRQIHByb3h5CiAgICAgd2l0aG91dCBhY3R1YWxseSBrbm93aW5nIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHRvIGRpc2FibGUgSFRUUCBvciBub3QuCgogIEJhc2VkIG9uIFN0ZXBoYW4ncyBwYXRjaCwgYm90aCB0aGVzZSBpc3N1ZXMgc2hvdWxkIG5vdyBiZSBmaXhlZC4KCkRhbmllbCAoMTggSmFudWFyeSAyMDA1KQotIENvZHkgSm9uZXMnIGVuaGFuY2VkIHZlcnNpb24gb2YgU2FtdWVsIETtYXogR2FyY+1hJ3MgTVNWQyBtYWtlZmlsZSBwYXRjaCB3YXMKICBhcHBsaWVkLgoKRGFuaWVsICgxNiBKYW51YXJ5IDIwMDUpCi0gQWxleCBha2EgV2luZEVhZ2xlIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBkb2luZyAiY3VybCAtdiBkaWN0aW9uYXJ5LmNvbSIsIGN1cmwKICBhc3N1bWVkIHRoaXMgdXNlZCB0aGUgRElDVCBwcm90b2NvbC4gV2hpbGUgZ3Vlc3NpbmcgcHJvdG9jb2xzIHdpbGwgcmVtYWluCiAgZnV6enksIEkndmUgbm93IG1hZGUgc3VyZSB0aGF0IHRoZSBob3N0IG5hbWVzIG11c3Qgc3RhcnQgd2l0aCAiW3Byb3RvY29sXS4iCiAgZm9yIHRoZW0gdG8gYmUgYSB2YWxpZCBndWVzc2FibGUgbmFtZS4gSSBhbHNvIHJlbW92ZWQgImh0dHBzIiBhcyBhIHByZWZpeAogIHRoYXQgaW5kaWNhdGVzIEhUVFBTLCBzaW5jZSB3ZSBoYXJkbHkgZXZlciBzZWUgYW55IGhvc3QgbmFtZXMgdXNpbmcgdGhhdC4KCkRhbmllbCAoMTMgSmFudWFyeSAyMDA1KQotIEluc3BpcmVkIGJ5IE1hcnRpam4gS29zdGVyJ3MgcGF0Y2ggYW5kIGV4YW1wbGUgc291cmNlIGF0CiAgaHR0cDovL3d3dy5ncmVlbmhpbGxzLmNvLnVrL21hay9nZW50b28vY3VybC1laW50ci1idWcuYywgSSBub3cgbWFkZSB0aGUKICBzZWxlY3QoKSBhbmQgcG9sbCgpIGNhbGxzIHByb3Blcmx5IGxvb3AgaWYgdGhleSByZXR1cm4gLTEgYW5kIGVycm5vIGlzCiAgRUlOVFIuIGdsaWJjIGRvY3MgZm9yIHRoaXMgaXMgZm91bmQgaGVyZToKICBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliYy9tYW51YWwvaHRtbF9ub2RlL0ludGVycnVwdGVkLVByaW1pdGl2ZXMuaHRtbAoKICBUaGlzIGxhc3QgbGluayBzYXlzIEJTRCBkb2Vzbid0IGhhdmUgdGhpcyAiZWZmZWN0Ii4gV2lsbCB0aGVyZSBiZSBhIHByb2JsZW0KICBpZiB3ZSBkbyB0aGlzIHVuY29uZGl0aW9uYWxseT8KCkRhbmllbCAoMTEgSmFudWFyeSAyMDA1KQotIERhbiBUb3JvcCBjbGVhbmVkIHVwIGEgZmV3IG5vIGxvbmdlciB1c2VkIHZhcmlhYmxlcyBmcm9tIERhdmlkIFBoaWxsaXBzJwogIHNlbGVjdCgpIG92ZXJoYXVsIGZpeC4KCi0gQ3lyaWxsIE9zdGVyd2FsZGVyIHBvc3RlZCBhIGRldGFpbGVkIGFuYWx5c2lzIGFib3V0IGEgYnVnIHRoYXQgb2NjdXJzIHdoZW4KICB1c2luZyBhIGN1c3RvbSBIb3N0OiBoZWFkZXIgYW5kIGN1cmwgZmFpbHMgdG8gc2VuZCBhIHJlcXVlc3Qgb24gYSByZS11c2VkCiAgcGVyc2lzdGVudCBjb25uZWN0aW9uIGFuZCB0aHVzIGNyZWF0ZXMgYSBuZXcgY29ubmVjdGlvbiBhbmQgcmVzZW5kcyBpdC4gSXQKICB0aGVuIHNlbnQgdHdvIEhvc3Q6IGhlYWRlcnMuIEN5cmlsbCdzIGFuYWx5c2lzIHdhcyBwb3N0ZWQgaGVyZToKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvYXJjaGl2ZS0yMDA1LTAxLzAwMjIuaHRtbAoKLSBCcnVjZSBNaXRjaGVuZXIgaWRlbnRpZmllZCAoYnVnIHJlcG9ydCAjMTA5OTY0MCkgdGhlIG5ldmVyLWVuZGluZyBTT0NLUzUKICBwcm9ibGVtIHdpdGggdGhlIHZlcnNpb24gYnl0ZSBhbmQgdGhlIGNoZWNrIGZvciBiYWQgdmVyc2lvbnMuIEJydWNlIGhhcyBsb3RzCiAgb2YgY2x1ZXMgb24gdGhpcywgYW5kIGJhc2VkIG9uIGhpcyBzdWdnZXN0aW9uIEkndmUgbm93IHJlbW92ZWQgdGhlIGNoZWNrIG9mCiAgdGhhdCBieXRlIHNpbmNlIGl0IHNlZW1zIHRvIGJlIGFibGUgdG8gY29udGFpbiAxIG9yIDUuCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwNSkKLSBQYXZlbCBPcmVob3YgcmVwb3J0ZWQgbWVtb3J5IHByb2JsZW1zIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBpbiBidWcgcmVwb3J0CiAgIzEwOTg4NDMuIEluIHNob3J0LCBhIHNoYXJlZCBETlMgY2FjaGUgd2FzIHNldHVwIGZvciBhIG11bHRpIGhhbmRsZSBhbmQgd2hlbgogIHRoZSBzaGFyZWQgY2FjaGUgd2FzIGRlbGV0ZWQgYmVmb3JlIHRoZSBpbmRpdmlkdWFsIGVhc3kgaGFuZGxlcywgdGhlIGxhdHRlcgogIGNsZWFudXBzIGNhdXNlZCByZWFkL3dyaXRlcyB0byBhbHJlYWR5IGZyZWVkIG1lbW9yeS4KCi0gSHpoaWp1biByZXBvcnRlZCBhIG1lbW9yeSBsZWFrIGluIHRoZSBTU0wgY2VydGlmaWNhdGUgY29kZSwgdGhhdCBsZWFrZWQgdGhlCiAgcmVtb3RlIGNlcnRpZmljYXRlIG5hbWUgd2hlbiBpdCBkaWRuJ3QgbWF0Y2ggdGhlIHVzZWQgaG9zdCBuYW1lLgoKR2lzbGUgKDggSmFudWFyeSAyMDA1KQotIEFkZGVkIE1ha2VmaWxlLldhdGNvbSBmaWxlcyAoc3JjL2xpYikuIFVwZGF0ZWQgTWFrZWZpbGUuZGlzdC4KCkRhbmllbCAoNyBKYW51YXJ5IDIwMDUpCi0gSW1wcm92ZWQgdGhlIHRlc3Qgc2NyaXB0J3MgdmFsZ3JpbmQgbG9nIHBhcnNlciB0byBhY3R1YWxseSB3b3JrISBBbHNvIGFkZGVkCiAgdGhlIGFiaWxpdHkgdG8gZGlzYWJsZSB0aGUgbG9nIHNjYW5uZXIgZm9yIHNwZWNpZmljIHRlc3QgY2FzZXMuIFRlc3QgY2FzZQogIDUwOSByZXN1bHRzIGluIG51bWVyb3VzIHByb2JsZW1zIGFuZCBsZWFrcyBpbiBPcGVuU1NMIGFuZCBoYXMgdG8gZ2V0IGl0CiAgZGlzYWJsZWQuCgpEYW5pZWwgKDYgSmFudWFyeSAyMDA1KQotIEZpeGVkIGEgc2luZ2xlLWJ5dGUgcmVhZCBvdXQgb2YgYm91bmRzIGluIHRlc3QgY2FzZSAzOSBpbiB0aGUgY3VybCB0b29sIGNvZGUKICAoaS5lIG5vdCBpbiB0aGUgbGlicmFyeSkuCgotIEJ1ZyByZXBvcnQgIzEwOTcwMTkgaWRlbnRpZmllZCBhIHByb2JsZW0gd2hlbiBkb2luZyAtZCAiZGF0YSIgd2l0aCAtRyBhbmQKICBzZW5kaW5nIGl0IHRvIHR3byBVUkxzIHdpdGgge30uIEFkZGVkIHRlc3QgMTk5IHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICg0IEphbnVhcnkgMjAwNSkKLSBNYXJ0eSBLdWhydCBhZGp1c3RlZCBhIFZNUyBidWlsZCBzY3JpcHQgc2xpZ2h0bHkKCi0gS2FpIFNvbW1lcmZlbGQgYW5kIEdpc2xlIFZhbmVtIGZpeGVkIGxpYmN1cmwgdG8gYnVpbGQgd2l0aCBJUHY2IHN1cHBvcnQgb24KICBXaW4yMDAwLgoKRGFuaWVsICgyIEphbnVhcnkgMjAwNSkKLSBBbGV4IE5lYmxldHQgdXBkYXRlZCB0aGUgTVNWQyBtYWtlZmlsZXMgc2xpZ2h0bHkuCkRhbmllbCAoMjUgRGVjZW1iZXIgMjAwNCkKLSBSZW1vdmVkIHNyYy9jb25maWcuaC5pbiBmcm9tIENWUywgaXQgaXMgbm93IGNvcGllZCBmcm9tIHRoZSAoZ2VuZXJhdGVkKQogIGxpYi9jb25maWcuaC5pbiBpbnN0ZWFkLCBhcyB0aGV5IGNhbiB2ZXJ5IHdlbGwgYmUgdGhlIHNhbWUuIFRoaXMgcmVtb3ZlcyBhCiAgIm1hbnVhbCBoYXNzbGUiLiBZb3UgbWF5IHdhbnQgdG8gcmUtcnVuIGJ1aWxkY29uZiBub3cuCgotIFdlcm5lciBLb2NoIGZpbGVkIERlYmlhbiBidWcgcmVwb3J0ICMyODY3OTQsIG1lbnRpb25pbmcgdGhhdCBjdXJsIGNvbnRhaW5lZAogIG5vbi1mcmVlIChieSBEZWJpYW4ncyB2aWV3KSBzb3VyY2UgY29kZS4gVGhpcyB3YXMgQW5ndXMgTWFja2F5J3MKICBzcmMvZ2V0cGFzcy5jIHNvdXJjZSBjb2RlLiBJIHRyaWVkIHRvIGNvbnRhY3QgaGltIGFib3V0IGl0IHRvIHF1aWNrbHkgc29sdmUKICB0aGlzIGlzc3VlLCBidXQgaGlzIGVtYWlsIGFkZHJlc3NlcyBib3VuY2UgYW5kIEkgZ290IHNvbWUgdGltZSAib3ZlciIgYW5kCiAgcmVpbXBsZW1lbnRlZCB0aGUgZnVuY3Rpb25hbGl0eSBvbmNlIGJyb3VnaHQgYnkgQW5ndXMuIFdlIG5vIGxvbmdlciB1c2UgYW55CiAgb2YgQW5ndXMnIG9yaWdpbmFsIGNvZGUgYW5kIHRoZSBuZXcgZnVuY3Rpb24gaXMgbXVjaCBzaW1wbGVyIChJTU8pLiBJc3N1ZQogIHNvbHZlZC4KCkRhbmllbCAoMjQgRGVjZW1iZXIgMjAwNCkKLSBEYXZpZCBTaGF3IGFkZGVkIC0tcHJvdG9jb2xzIHRvIGN1cmwtY29uZmlnLCBzbyB0aGF0IGl0IG5vdyBsaXN0cyBhbGwKICBwcm90b2NvbHMgbGliY3VybCB3YXMgYnVpbHQgdG8gc3VwcG9ydC4gLS1mZWF0dXJlIG5vIGxvbmdlciBsaXN0cyBkaXNhYmxlZAogIHByb3RvY29scy4KCkRhbmllbCAoMjMgRGVjZW1iZXIgMjAwNCkKLSBEYXZpZCBTaGF3IGZpeGVkIHRoZSBjb25maWd1cmUgLS1kaXNhYmxlLVtwcm90b2NvbF0gdmFyaWFibGVzIHNvIHRoYXQKICBjdXJsLWNvbmZpZyAtLWZlYXR1cmUgbm93IHdvcmtzIGNvcnJlY3RseSEKCkRhbmllbCAoMjIgRGVjZW1iZXIgMjAwNCkKLSBSdW5lIEtsZXZlbGFuZCBmaXhlZCBhIG1pbm9yIG1lbW9yeSBsZWFrIGZvciByZWNlaXZlZCBjb29raWVzIHdpdGggdGhlCiAgKHJhcmUpIHZlcnNpb24gYXR0cmlidXRlIHNldC4KCi0gTWFyY2luIEtvbmlja2kgcHJvdmlkZWQgdHdvIGNvbmZpZ3VyZSBmaXhlcyBhbmQgYSBzb3VyY2UgZml4IHRvIG1ha2UgY3VybAogIGJ1aWxkIG91dC1vZi10aGUtYm94IG9uIEJlT1MuCgpEYW5pZWwgKDIxIERlY2VtYmVyIDIwMDQpCi0gQWRkZWQgdGVzdCBjYXNlIDIxNyB0aGF0IHZlcmlmaWVkIENVUkxJTkZPX0hUVFBfQ09OTkVDVENPREUsIGFuZCBJIG1hZGUgdGhlCiAgLXcgb3B0aW9uIHN1cHBvcnQgJ2h0dHBfY29ubmVjdCcgdG8gbWFrZSBpdCBlYXNpZXIgdG8gdmVyaWZ5IQoKLSBGaXhlZCBsaWIvc2VsZWN0LmMgaW5jbHVkZSBvcmRlciB0byBidWlsZCBmaW5lIG9uIEZyZWVCU0QKCi0gRml4ZWQgZmFpbGYoKSdzIHJldXNlIG9mIHRoZSB2YV9saXN0IHZhcmlhYmxlIHRoYXQgY3Jhc2hlZCBvbiBGcmVlQlNELgogIFBvaW50ZWQgb3V0IGJ5IFBldGVyIFBlbnRjaGV2LgoKVmVyc2lvbiA3LjEyLjMgKDIwIERlY2VtYmVyIDIwMDQpCgpEYW5pZWwgKDE5IERlY2VtYmVyIDIwMDQpCi0gSSBpbnZlc3RpZ2F0ZWQgb3VyIFBLQ1MxMiBidWlsZCBwcm9ibGVtIG9uIFNvbGFyaXMgMi43IHdpdGggT3BlblNTTCAwLjkuN2UsCiAgYW5kIGl0IHR1cm5lZCBvdXQgdG8gYmUgdGhlIGZhdWx0IG9mIHRoZSB6bGliIDEuMS40IGhlYWRlcnMgZG9pbmcgYSB0eXBlZGVmCiAgbmFtZWQgJ2ZyZWVfZnVuYycgYW5kIHRoZSBPcGVuU1NMIGhlYWRlcnMgaGF2ZSBhIHByb3RvdHlwZSB0aGF0IHVzZXMKICAnZnJlZV9mdW5jJyBpbiBvbmUgb2YgaXRzIGFyZ3VtZW50cy4gVGhpcyBpcyB3aHkgdGhlIGNvbXBpbGUgZXJyb3JzIG91dC4KCiAgSW4gb3RoZXIgd29yZHMsIHdlIG5lZWQgdG8gaW5jbHVkZSB0aGUgb3BlbnNzbC9wa2NzMTIuaCBoZWFkZXIgYmVmb3JlIHRoZQogIHpsaWIuaCBoZWFkZXIgYW5kIGl0IGJ1aWxkcyBmaW5lLiBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgY2hlY2tzIGZvciB0aGlzCiAgZmlsZSBhbmQgaXQgdGhlbiBnZXRzIGluY2x1ZGVkIGVhcmx5IGluIGxpYi91cmxkYXRhLmguCgpEYW5pZWwgKDE4IERlY2VtYmVyIDIwMDQpCi0gU2FtdWVsIExpc3RvcGFkIGFkZGVkIHN1cHBvcnQgZm9yIFBLQ1MxMiBmb3JtYXR0ZWQgY2VydGlmaWNhdGVzLgoKLSBTYW11ZWwgTGlzdG9wYWQgZml4ZWQgLUUgdG8gc3VwcG9ydCAiQzovcGF0aCIgKHdpdGggZm9yd2FyZCBzbGFzaCkgYXMgd2VsbC4KCkRhbmllbCAoMTYgRGVjZW1iZXIgMjAwNCkKLSBHaXNsZSBmb3VuZCBhbmQgZml4ZWQgYSBwcm9ibGVtIGluIHRoZSBkaXJlY3RvcnkgcmUtdXNlIGZvciBGVFAuCgogIEkgYWRkZWQgdGVzdCBjYXNlIDIxNSBhbmQgMjE2IHRvIGJldHRlciB2ZXJpZnkgdGhlIGZ1bmN0aW9uYWxpdHkuCgotIERpbmFyIGluIGJ1ZyByZXBvcnQgIzEwODYxMjEsIGZvdW5kIGEgZmlsZSBoYW5kbGUgbGVhayB3aGVuIGEgbXVsdGlwYXJ0CiAgZm9ybXBvc3QgKGluY2x1ZGluZyBhIGZpbGUgdXBsb2FkIHBhcnQpIHdhcyBhYm9ydGVkIGJlZm9yZSB0aGUgd2hvbGUgZmlsZQogIHdhcyBzZW50LgoKRGFuaWVsICgxNSBEZWNlbWJlciAyMDA0KQotIFRvbSBMZWUgZm91bmQgb3V0IHRoYXQgZ2xvYmJpbmcgb2Ygc3RyaW5ncyB3aXRoIGJhY2tzbGFzaGVzIGRpZG4ndCB3b3JrIGFzCiAgeW91J2QgZXhwZWN0LiBCYWNrc2xhc2hlcyBhcmUgc3VjaCBhIGNlbnRyYWwgcGFydCBvZiB3aW5kb3dzIGZpbGUgbmFtZXMgdGhhdAogIGZvcmNpbmcgYmFja3NsYXNoZXMgdG8gaGF2ZSB0byBiZSBlc2NhcGVkIHdpdGggYmFja3NsYXNoZXMgaXMgYSBiaXQgdG9vCiAgYXdrd2FyZCB0byB1c2Vycy4gU3RhcnRpbmcgbm93LCB5b3Ugb25seSBuZWVkIHRvIGVzY2FwZSBnbG9iYmluZyBjaGFyYWN0ZXJzCiAgc3VjaCBhcyB0aGUgZml2ZSBsZXR0ZXJzOiAiW117fSwiLiBBZGRlZCB0ZXN0IGNhc2UgMjE0IHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgxNCBEZWNlbWJlciAyMDA0KQotIEhhcnNoYWwgUHJhZGhhbiBwYXRjaGVkIGEgSFRUUCBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gZmxhdzogaWYgdGhlIHVzZXIgbmFtZQogIGFuZC9vciBwYXNzd29yZCB3ZXJlIG1vZGlmaWVkIGJldHdlZW4gdHdvIHJlcXVlc3RzIG9uIGEgcGVyc2lzdGVudAogIGNvbm5lY3Rpb24sIHRoZSBzZWNvbmQgcmVxdWVzdCB3ZXJlIHN0aWxsIG1hZGUgd2l0aCB0aGUgZmlyc3Qgc2V0dXAhCgogIEkgYWRkZWQgdGVzdCBjYXNlIDUxOSB0byB2ZXJpZnkgdGhlIGZpeC4KCkRhbmllbCAoMTMgRGVjZW1iZXIgMjAwNCkKLSBHaXNsZSBhZGRlZCBDVVJMSU5GT19TU0xfRU5HSU5FUyB0byBjdXJsX2Vhc3lfZ2V0aW5mbygpIHRvIGFsbG93IGFuIGFwcAogIHRvIGxpc3QgYWxsIGF2YWlsYWJsZSBjcnlwdG8gRU5HSU5FUy4KCi0gR2lzbGUgZml4ZWQgYnVnIHJlcG9ydCAjMTA4MzU0Miwgd2hpY2ggcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggcmVzdW1pbmcKICBsYXJnZSBmaWxlICg+NEdCKSBmaWxlOi8vIHRyYW5zZmVycyBvbiB3aW5kb3dzLgoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDA0KQotIE1hZGUgdGhlIHRlc3Qgc3VpdGUgSFRUUCBzZXJ2ZXIgKHN3cykgY2FwYWJsZSBvZiB1c2luZyBJUHY2LCBhbmQgdGhlbgogIGV4dGVuZGVkIHRoZSB0ZXN0IGVudmlyb25tZW50IHRvIHN1cHBvcnQgdGhhdCBhbmQgYWxzbyBhZGRlZCB0aHJlZSB0ZXN0CiAgY2FzZXMgKDI0MCwgMjQxLCAyNDIpIHRoYXQgcnVuIHRlc3RzIHVzaW5nIElQdjYuIFRlc3QgMjQyIHVzZXMgYSBVUkwgdGhhdAogIGRpZG4ndCB3b3JrIGJlZm9yZSB0aGUgMTAgZGVjIGZpeCBieSBLYWkgU29tbWVyZmVsZC4KCi0gTWFkZSBhIGZhaWxlZCBmaWxlOi8vIHJlc3VtZSBvdXRwdXQgYW4gZXJyb3IgbWVzc2FnZQoKLSBDb3JyZWN0ZWQgdGhlIENVUkxFX0JBRF9ET1dOTE9BRF9SRVNVTUUgZXJyb3IgbWVzc2FnZSBpbiBsaWIvc3RyZXJyb3IuYwoKLSBEYW4gRmFuZHJpY2g6CgogIHNpbXBsaWZpZWQgYW5kIGNvbnNvbGlkYXRlZCB0aGUgU1NMIGNoZWNrcyBpbiBjb25maWd1cmUgYW5kIHRoZSB1c2FnZSBvZiB0aGUKICBkZWZpbmVzIGluIGxpYi9zZXR1cC5oCgogIHByb3ZpZGVkIGEgZmlyc3QgbGliY3VybC5wYy5pbiBmaWxlIGZvciBwa2ctY29uZmlnIChidXQgdGhlIHJlc3VsdCBpcyBub3QKICBpbnN0YWxsZWQgYW55d2hlcmUgYXQgdGhpcyBwb2ludCkKCiAgZXh0ZW5kZWQgdGhlIGNyb3NzIGNvbXBpbGUgc2VjdGlvbiBpbiB0aGUgZG9jcy9JTlNUQUxMIGZpbGUKCkRhbmllbCAoMTAgRGVjZW1iZXIgMjAwNCkKLSBXaGVuIHByb3ZpZGluZyB1c2VyIG5hbWUgaW4gdGhlIFVSTCBhbmQgYSBJUHY2LXN0eWxlIElQLWFkZHJlc3MgKGxpa2UgaW4KICAiZnRwOi8vdXNlckBbOjoxXS90bXAiKSwgdGhlIFVSTCBwYXJzZXIgZGlkbid0IGdldCB0aGUgaG9zdCBleHRyYWN0ZWQKICBwcm9wZXJseS4gIFJlcG9ydGVkIGFuZCBmaXhlZCBieSBLYWkgU29tbWVyZmVsZC4KCkRhbmllbCAoOSBEZWNlbWJlciAyMDA0KQotIFRvbiBWb29uIHByb3ZpZGVkIGEgY29uZmlndXJlIGZpeCB0aGF0IHNob3VsZCBmaXggdGhlIG5vdG9yaW91cyAobW9zdGx5CiAgcmVwb3J0ZWQgb24gU29sYXJpcykgcHJvYmxlbSB3aGVyZSB0aGUgc2l6ZV90IGNoZWNrIGZhaWxzIGR1ZSB0byB0aGUgU1NMCiAgbGlicyBiZWluZyBmb3VuZCBpbiBhIGRpciBub3Qgc2VhcmNoZWQgdGhyb3VnaCBieSB0aGUgcnVuLXRpbWUgbGlua2VyLgogIHBhdGNoLXRyYWNrZXIgZW50cnkgIzEwODE3MDcuCgotIEJyeWFuIEhlbmRlcnNvbiBwb2ludGVkIG91dCBpbiBidWcgcmVwb3J0ICMxMDgxNzg4IHRoYXQgdGhlIGN1cmwtY29uZmlnCiAgLS12ZXJudW0gb3V0cHV0IHdhc24ndCB6ZXJvIHByZWZpeGVkIHByb3Blcmx5IChhcyBjbGFpbWVkIGluIGRvY3VtZW50YXRpb24pLgogIFRoaXMgaXMgZml4ZWQgaW4gbWFrZXRneiBub3cuCgpEYW5pZWwgKDggRGVjZW1iZXIgMjAwNCkKLSBNYXR0IFZlZW5zdHJhIHVwZGF0ZWQgdGhlIG1hY2gtTyBmcmFtZXdvcmsgZmlsZXMgZm9yIE1hYyBPUyBYLgoKLSBSZW5lIEJlcm5oYXJkdCBmb3VuZCBhbmQgZml4ZWQgYSBidWZmZXIgb3ZlcnJ1biBpbiB0aGUgTlRMTSBjb2RlLCB3aGVyZQogIGxpYmN1cmwgYWx3YXlzIGFuZCB1bmNvbmRpdGlvbmFsbHkgb3Zlcndyb3RlIGEgc3RhY2stYmFzZWQgYXJyYXkgd2l0aCAzIHplcm8KICBieXRlcy4gVGhpcyBpcyBub3QgYW4gZXhwbG9pdGFibGUgYnVmZmVyIG92ZXJmbG93LiBObyBuZWVkIHRvIGdldCBhbGFybWVkLgoKRGFuaWVsICg3IERlY2VtYmVyIDIwMDQpCi0gRml4ZWQgc28gdGhhdCB0aGUgZmluYWwgZXJyb3IgbWVzc2FnZSBpcyBzZW50IHRvIHRoZSB2ZXJib3NlIGluZm8gInN0cmVhbSIKICBldmVuIGlmIG5vIGVycm9yYnVmZmVyIGlzIHNldC4KCkRhbmllbCAoNiBEZWNlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCBhZGRlZCB0aGUgLS1kaXNhYmxlLWNvb2tpZXMgb3B0aW9uIHRvIGNvbmZpZ3VyZSB0byBidWlsZAogIGxpYmN1cmwgd2l0aG91dCBjb29raWUgc3VwcG9ydC4gVGhpcyBpcyBtYWlubHkgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGJ1aWxkIGEKICBtaW5pbWFsaXN0aWMgbGliY3VybCB3aXRoIG5vIGNvb2tpZXMgc3VwcG9ydCBhdCBhbGwuIExpa2UgZm9yIGVtYmVkZGVkCiAgc3lzdGVtcyBvciBzaW1pbGFyLgoKLSBSaWNoYXJkIEF0dGVyZXIgZml4ZWQgbGliY3VybCdzIHdheSBvZiBkZWFsaW5nIHdpdGggdGhlIEVQU1YKICByZXNwb25zZS4gUHJldmlvdXNseSwgbGliY3VybCB3b3VsZCByZS1yZXNvbHZlIHRoZSBob3N0IG5hbWUgd2l0aCB0aGUgbmV3CiAgcG9ydCBudW1iZXIgYW5kIGF0dGVtcHQgdG8gY29ubmVjdCB0byB0aGF0LCB3aGlsZSBpdCBzaG91bGQgdXNlIHRoZSBJUCBmcm9tCiAgdGhlIGNvbnRyb2wgY2hhbm5lbC4gVGhpcyBidWcgbWFkZSBpdCBoYXJkIHRvIEVQU1YgZnJvbSBhbiBGVFAgc2VydmVyIHdpdGgKICBtdWx0aXBsZSBJUCBhZGRyZXNzZXMhCgpEYW5pZWwgKDMgRGVjZW1iZXIgMjAwNCkKLSBCdWcgcmVwb3J0ICMxMDc4MDY2OiB3aGVuIGEgY2h1bmtlZCB0cmFuc2ZlciB3YXMgcHJlLW1hdHVyZWx5IGNsb3NlZCBleGFjdGx5CiAgYXQgYSBjaHVuayBib3VuZGFyeSBpdCB3YXMgbm90IGNvbnNpZGVyZWQgYW4gZXJyb3IgYW5kIHRodXMgd2VudCB1bm5vdGljZWQuCiAgRml4ZWQgYnkgTWF1cmljZSBCYXJudW0uCgogIEFkZGVkIHRlc3QgY2FzZSAyMDcgdG8gdmVyaWZ5LgoKRGFuaWVsICgyIERlY2VtYmVyIDIwMDQpCi0gRml4ZWQgdGhlIENPTk5FQ1QgbG9vcCB0byBkZWZhdWx0IHRpbWVvdXQgdG8gMzYwMCBzZWNvbmRzLgoKICBBZGRlZCB0ZXN0IGNhc2UgMjA2IHRoYXQgbWFrZXMgQ09OTkVDVCB3aXRoIERpZ2VzdC4KCiAgRml4ZWQgYSBmbGF3IHRoYXQgcHJlcGVuZGVkICIobmlsKSIgdG8gdGhlIGluaXRpYWwgQ09OTkVDVCBycWV1ZXN0J3MgdXNlci0KICBhZ2VudCBmaWVsZC4KCkRhbmllbCAoMzAgTm92ZW1iZXIgMjAwNCkKLSBEYW4gRmFuZHJpY2gncyBmaXggZm9yIGxpYnogMS4xIGFuZCAiZXh0cmEgZmllbGQiIHVzYWdlIGluIGEgZ3ppcCBzdHJlYW0KCi0gRGFuIGFsc28gaGVscGVkIG1lIHdpdGggaW5wdXQgZGF0YSB0byBjcmVhdGUgdGhyZWUgbW9yZSB0ZXN0IGNhc2VzIGZvciB0aGUKICAtLWNvbXByZXNzZWQgb3B0aW9uLgoKRGFuaWVsICgyOSBOb3ZlbWJlciAyMDA0KQotIEkgaW1wcm92ZWQgdGhlIHRlc3Qgc3VpdGUgdG8gZW5hYmxlIGJpbmFyeSBjb250ZW50cyBpbiB0aGUgdGVzdHMgKGJ5IHByb3ZpbmcKICBpdCBiYXNlNjQgZW5jb2RlZCksIGxpa2UgZm9yIHRlc3RpbmcgZGVjb21wcmVzcyBldGMuIEFkZGVkIHRlc3QgMjIwIGFuZCAyMjEKICBmb3IgdGhpcyBwdXJwb3NlLiBUZXN0cyBjYW4gbm93IGFsc28gZGVwZW5kIG9uIGxpYnogdG8gcnVuLgoKLSBBcyByZXBvcnRlZCBieSBSZWlub3V0IHZhbiBTY2hvdXdlbiBpbiBNYW5kcmFrZSdzIGJ1ZyB0cmFja2VyIGJ1ZyAxMjI4NQogIChodHRwOi8vcWEubWFuZHJha2Vzb2Z0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9MTIyODUpLCB3aGVuIGNvbm5lY3RpbmcgdG8gYW4KICBJUHY2IGhvc3Qgd2l0aCBGVFAsIC0tZGlzYWJsZS1lcHN2IChvciAtLWRpc2FibGUtZXBydCkgZWZmZWN0aXZlbHkgZGlzYWJsZXMKICB0aGUgYWJpbGl0eSB0byB0cmFuc2ZlciBhIGZpbGUuIE5vdywgd2hlbiBjb25uZWN0ZWQgdG8gYW4gRlRQIHNlcnZlciB3aXRoCiAgSVB2NiwgdGhlc2UgRlRQIGNvbW1hbmRzIGNhbid0IGJlIGRpc2FibGVkIGV2ZW4gaWYgYXNrZWQgdG8gd2l0aCB0aGUKICBhdmFpbGFibGUgbGliY3VybCBvcHRpb25zLgoKRGFuaWVsICgyNiBOb3ZlbWJlciAyMDA0KQotIEFzIHJlcG9ydGVkIGluIE1hbmRyYWtlJ3MgYnVnIHRyYWNrZXIgYnVnIDEyMjg5CiAgKGh0dHA6Ly9xYS5tYW5kcmFrZXNvZnQuY29tL3Nob3dfYnVnLmNnaT9pZD0xMjI4OSksIGN1cmwgd291bGQgcHJpbnQgYQogIG5ld2xpbmUgdG8gImZpbmlzaCIgdGhlIHByb2dyZXNzIG1ldGVyIGFmdGVyIGVhY2ggcmVkaXJlY3QgYW5kIG5vdCBvbmx5CiAgYWZ0ZXIgYSBjb21wbGV0ZWQgdHJhbnNmZXIuCgpEYW5pZWwgKDI1IE5vdmVtYmVyIDIwMDQpCi0gRlRQIGltcHJvdmVtZW50czoKCiAgSWYgRVBTViwgRVBSVCBvciBMUFJUIGlzIHRyaWVkIGFuZCBkb2Vzbid0IHdvcmssIGl0IHdpbGwgbm90IGJlIHJldHJpZWQgb24KICB0aGUgc2FtZSBzZXJ2ZXIgYWdhaW4gZXZlbiBpZiBhIGZvbGxvd2luZyByZXF1ZXN0IGlzIG1hZGUgdXNpbmcgYSBwZXJzaXN0ZW50CiAgY29ubmVjdGlvbi4KCiAgSWYgYSBzZWNvbmQgcmVxdWVzdCBpcyBtYWRlIHRvIGEgc2VydmVyLCByZXF1ZXN0aW5nIGEgZmlsZSBmcm9tIHRoZSBzYW1lCiAgZGlyZWN0b3J5IGFzIHRoZSBwcmV2aW91cyByZXF1ZXN0IG9wZXJhdGVkIG9uLCBsaWJjdXJsIHdpbGwgbm8gbG9uZ2VyIG1ha2UKICB0aGF0IGxvbmcgc2VyaWVzIG9mIENXRCBjb21tYW5kcyBqdXN0IHRvIGVuZCB1cCBvbiB0aGUgc2FtZSBzcG90LiBOb3RlIHRoYXQKICB0aGlzIGlzIG9ubHkgZm9yICpleGFjdGx5KiB0aGUgc2FtZSBkaXIuIFRoZXJlIGlzIHN0aWxsIHJvb20gZm9yIGltcHJvdmVtZW50cwogIHRvIG9wdGltaXplIHRoZSBDV0Qtc2VuZGluZyB3aGVuIHRoZSBkaXJzIGFyZSBvbmx5IHNsaWdodGx5IGRpZmZlcmVudC4KCiAgQWRkZWQgdGVzdCAyMTAsIDIxMSBhbmQgMjEyIHRvIHZlcmlmeSB0aGVzZSBjaGFuZ2VzLiBIYWQgdG8gaW1wcm92ZSB0aGUKICB0ZXN0IHNjcmlwdCB0b28gYW5kIGFkZGVkIGEgbmV3IHByaW1pdGl2ZSB0byB0aGUgdGVzdCBmaWxlIGZvcm1hdC4KCkRhbmllbCAoMjQgTm92ZW1iZXIgMjAwNCkKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGRldGVjdCBzZWxlY3QgcHJvcGVybHkgd2hlbiBydW4KICB3aXRoIE1zeXMvTWluZ3cgb24gV2luZG93cy4KCkRhbmllbCAoMjIgTm92ZW1iZXIgMjAwNCkKLSBNYWRlIEhUVFAgUFVUIGFuZCBQT1NUIHJlcXVlc3RzIG5vIGxvbmdlciB1c2UgSEVBRCB3aGVuIGRvaW5nIG11bHRpLXBhc3MKICBhdXRoIG5lZ290aWF0aW9uIChOVExNLCBEaWdlc3QgYW5kIE5lZ290aWF0ZSksIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgcmVxdWVzdAogIGtleXdvcmQgInByb3Blcmx5Ii4gRGV0YWlscyBpbiBsaWIvUkVBRE1FLmh0dHBhdXRoLiBUaGlzIGFsc28gaW50cm9kdWNlcwogIENVUkxPUFRfSU9DVExGVU5DVElPTiBhbmQgQ1VSTE9QVF9JT0NUTERBVEEsIHRvIGJlIHVzZWQgYnkgYXBwcyB0aGF0IHVzZSB0aGUKICAiYW55IiBhdXRoIGFsdGVybmF0aXZlIGFzIHRoZW4gbGliY3VybCBtYXkgbmVlZCB0byBzZW5kIHRoZSBQVVQvUE9TVCBkYXRhCiAgbW9yZSB0aGFuIG9uY2UgYW5kIHRodXMgbWF5IG5lZWQgdG8gYXNrIHRoZSBhcHAgdG8gInJld2luZCIgdGhlIHJlYWQgZGF0YQogIHN0cmVhbSB0byBzdGFydC4KCiAgU2VlIGFsc28gdGhlIG5ldyBleGFtcGxlIHVzaW5nIHRoaXM6IGRvY3MvZXhhbXBsZXMvYW55YXV0aHB1dC5jCgotIERhdmlkIFBoaWxsaXBzIGVuaGFuY2VkIHRlc3QgNTE4LiBJIG1hZGUgaXQgZGVwZW5kIG9uIGEgImZlYXR1cmUiIHNvIHRoYXQKICBzeXN0ZW1zIHdpdGhvdXQgZ2V0cmxpbWl0KCkgd29uJ3QgYXR0ZW1wdCB0byB0ZXN0IDUxOC4gY29uZmlndXJlIG5vdyBjaGVja3MKICBmb3IgZ2V0cmxpbWl0KCkgYW5kIHNldHJsaW1pdCgpIGZvciB0aGlzIHRlc3QgY2FzZS4KCkRhbmllbCAoMTggTm92ZW1iZXIgMjAwNCkKLSBEYXZpZCBQaGlsbGlwcyBmaXhlZCBsaWJjdXJsIHRvIG5vdCBjcmFzaCBhbnltb3JlIHdoZW4gbW9yZSB0aGFuIEZEX1NFVFNJWkUKICBmaWxlIGRlc2NyaXB0b3JzIGFyZSBpbiB1c2UuIFRlc3QgY2FzZSA1MTggYWRkZWQgdG8gdmVyaWZ5LgoKRGFuaWVsICgxNSBOb3ZlbWJlciAyMDA0KQotIFRvIHRlc3QgbXkgZml4IGZvciB0aGUgQ1VSTElORk9fUkVESVJFQ1RfVElNRSBidWcsIEkgYWRkZWQgdGltZV9yZWRpcmVjdCBhbmQKICBudW1fcmVkaXJlY3RzIHN1cHBvcnQgdG8gdGhlIC13IHdyaXRlb3V0IG9wdGlvbiBmb3IgdGhlIGNvbW1hbmQgbGluZSB0b29sLgoKLSBXb2pjaWVjaCBad2llZmthIGZvdW5kIG91dCB0aGF0IENVUkxJTkZPX1JFRElSRUNUX1RJTUUgZGlkbid0IHdvcmsgYXMKICBkb2N1bWVudGVkLgoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDA0KQotIEdpc2xlIFZhbmVtIG1vZGlnaWVkIHRoZSBNU1ZDIGFuZCBOZXR3YXJlIG1ha2VmaWxlcyB0byBidWlsZCB3aXRob3V0CiAgbGliY3VybC5kZWYKCi0gRGFuIEZhbmRyaWNoIGFkZGVkIHRoZSAtLWRpc2FibGUtY3J5cHRvLWF1dGggb3B0aW9uIHRvIGNvbmZpZ3VyZSB0byBhbGxvdwogIGxpYmN1cmwgdG8gYnVpbGQgd2l0aG91dCBEaWdlc3Qgc3VwcG9ydC4gKEkgZmlndXJlIGl0IHNob3VsZCBhbHNvIGV4cGxpY2l0bHkKICBkaXNhYmxlIE5lZ290aWF0ZSBhbmQgTlRMTS4pCgotICAgICAgICAgICAgICAgICAqKiogTW9kaWZpZWQgQmVoYXZpb3VyIEFsZXJ0ICoqKgoKICBTZXR0aW5nIENVUkxPUFRfUE9TVEZJRUxEUyB0byBOVUxMIHdpbGwgbm8gbG9uZ2VyIGRvIGEgR0VULgoKICBTZXR0aW5nIENVUkxPUFRfUE9TVEZJRUxEUyB0byAiIiB3aWxsIHNlbmQgYSB6ZXJvIGJ5dGUgUE9TVCBhbmQgc2V0dGluZwogIENVUkxPUFRfUE9TVEZJRUxEUyB0byBOVUxMIGFuZCBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgdG8gemVybyB3aWxsIGFsc28gbWFrZQogIGEgemVybyBieXRlIFBPU1QuIEFkZGVkIHRlc3QgY2FzZSA1MTUgdG8gdmVyaWZ5IHRoaXMuCgogIFNldHRpbmcgQ1VSTE9QVF9IVFRQUE9TVCB0byBOVUxMIG1ha2VzIGEgemVybyBieXRlIHBvc3QuIEFkZGVkIHRlc3QgY2FzZSA1MTYKICB0byB2ZXJpZnkgdGhpcy4KCiAgQ1VSTE9QVF9QT1NURklFTERTSVpFIG11c3Qgbm93IGJlIHNldCB0byAtMSB0byBzaWduYWwgIndlIGRvbid0IGtub3ciLgogIFNldHRpbmcgaXQgdG8gemVybyBzaW1wbHkgc2F5cyB0aGlzIGlzIGEgemVybyBieXRlIFBPU1QuCgogIFdoZW4gcHJvdmlkaW5nIFBPU1QgZGF0YSB3aXRoIGEgcmVhZCBjYWxsYmFjaywgc2V0dGluZyB0aGUgc2l6ZSB1cCBmcm9udAogIGlzIG5vdyBtYWRlIHdpdGggQ1VSTE9QVF9QT1NURklFTERTSVpFIGFuZCBub3Qgd2l0aCBDVVJMT1BUX0lORklMRVNJWkUuCgpEYW5pZWwgKDExIE5vdmVtYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoIGFkZGVkIC0tZGlzYWJsZS12ZXJib3NlIHRvIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGFsbG93IGJ1aWxkcwogIHdpdGhvdXQgdmVyYm9zZSBzdHJpbmdzIGluIHRoZSBjb2RlLCB0byBzYXZlIHNvbWUgMTJLQiBzcGFjZS4gTWFrZXMgc2Vuc2UKICBvbmx5IGZvciBzeXN0ZW1zIHdpdGggdmVyeSBsaXR0bGUgbWVtb3J5IHJlc291cmNlcy4KCi0gSmVmZiBQaGlsbGlwcyBmb3VuZCBvdXQgdGhhdCBhIGRhdGUgc3RyaW5nIHdpdGggYSB5ZWFyIGJleW9uZCAyMDM4IGNvdWxkCiAgY3Jhc2ggdGhlIG5ldyBkYXRlIHBhcnNlciBvbiBzeXN0ZW1zIHdpdGggMzJiaXQgdGltZV90LiBXZSBub3cgY2hlY2sgZm9yCiAgdGhpcyBjYXNlIGFuZCBkZWFsIHdpdGggaXQuCgpEYW5pZWwgKDEwIE5vdmVtYmVyIDIwMDQpCi0gSSBpbnN0YWxsZWQgSGVpbWRhbCBvbiBteSBEZWJpYW4gYm94ICh1c2luZyB0aGUgZGViaWFuIHBhY2thZ2UpIGFuZCBub3RpY2VkCiAgdGhhdCBjb25maWd1cmUgLS13aXRoLWdzc2FwaSBmYWlsZWQgdG8gY3JlYXRlIGEgbmljZSBidWlsZC4gRml4ZWQgbm93LgoKRGFuaWVsICg5IE5vdmVtYmVyIDIwMDQpCi0gR2lzbGUgVmFuZW0gbWFya2VkIGFsbCBleHRlcm5hbCBmdW5jdGlvbiBjYWxscyB3aXRoIENVUkxfRVhURVJOIHNvIHRoYXQgbm93CiAgdGhlIFdpbmRvd3MsIE5ldHdhcmUgYW5kIG90aGVyIGJ1aWxkcyBubyBsb25nZXIgbmVlZCBsaWJjdXJsLmRlZiBvciBzaW1pbGFyCiAgZmlsZXMuCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwNCkKLSBNYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGNoZWNrIGZvciB0bGQuaCBpZiBsaWJpZG4gd2FzIGRldGVjdGVkLCBzaW5jZQogIGxpYmlkbiAwLjMuWCBkaWRuJ3QgaGF2ZSBzdWNoIGEgaGVhZGVyIGFuZCB3ZSBkb24ndCB3b3JrIHdpdGggYW55dGhpbmcKICBiZWZvcmUgbGliaWRuIDAuNC4xIGFueXdheSEgU3VzZSA5LjEgYXBwYXJlbnRseSBzaGlwcyB3aXRoIGEgMC4zLlggdmVyc2lvbgogIG9mIGxpYmlkbiB3aGljaCBtYWtlcyB0aGUgY3VybCA3LjEyLjIgYnVpbGQgZmFpbC4gSmVhbi1QaGlsaXBwZQogIEJhcnJldHRlLUxhUGllcnJlIGhlbHBlZCBwb2ludGluZyB0aGlzIG91dC4KCi0gSWFuIEd1bGxpdmVyIHJlcG9ydGVkIGluIGRlYmlhbiBidWcgcmVwb3J0ICMyNzg2OTE6IGlmIGN1cmwgaXMgaW52b2tlZCBpbiBhbgogIGVudmlyb25tZW50IHdoZXJlIHN0ZGVyciBpcyBjbG9zZWQgdGhlIC12IG91dHB1dCB3aWxsIHN0aWxsIGJlIHNlbnQgdG8gZmlsZQogIGRlc2NyaXB0b3IgMiB3aGljaCB0aGVuIG1pZ2h0IGJlIHRoZSBuZXR3b3JrIHNvY2tldCBoYW5kbGUhIE5vdyB3ZSBoYXZlIGEKICB3ZWlyZCBoYWNrIGluc3RlYWQgdGhhdCBhdHRlbXB0cyB0byBtYWtlIHN1cmUgdGhhdCBmaWxlIGRlc2NyaXB0b3IgMiBpcwogIG9wZW5lZCAod2l0aCBhIGNhbGwgdG8gcGlwZSgpKSBiZWZvcmUgbGliY3VybCBpcyBjYWxsZWQgdG8gZG8gdGhlIHRyYW5zZmVyLgogIGNvbmZpZ3VyZSBub3cgY2hlY2tzIGZvciBwaXBlKCkgYW5kIHN5c3RlbXMgd2l0aG91dCBwaXBlIGRvbid0IGdldCB0aGUgd2VpcmQKICBoYWNrIGRvbmUuCgpEYW5pZWwgKDUgTm92ZW1iZXIgMjAwNCkKLSBUaW0gU25lZGRvbiBtYWRlIGxpYmN1cmwgc2VuZCBubyBtb3JlIHRoYW4gNjRLIGluIGEgc2luZ2xlIGZpcnN0IGNodW5rIHdoZW4KICBkb2luZyBhIGh1Z2UgUE9TVCBvbiBWTVMsIGFzIHRoaXMgaXMgYSBzeXN0ZW0gbGltaXRhdGlvbi4gRGVmYXVsdCBvbiBnZW5lcmFsCiAgc3lzdGVtcyBpcyAxMDBLLgoKRGFuaWVsICg0IE5vdmVtYmVyIDIwMDQpCi0gQW5kcmVzIEdhcmNpYSBtYWRlIGl0IGJ1aWxkIG9uIG1pbmd3IGFnYWluYSwgbXkgLS1yZXRyeSBjb2RlIGJyb2tlIHRoZSBidWlsZC4KCkRhbmllbCAoMiBOb3ZlbWJlciAyMDA0KQotIEFkZGVkIC0tcmV0cnktbWF4LXRpbWUgdGhhdCBhbGxvd3MgYSBtYXhpbXVtIHRpbWUgdGhhdCBtYXkgbm90IGhhdmUgYmVlbgogIHJlYWNoZWQgZm9yIGEgcmV0cnkgdG8gYmUgbWFkZS4gSWYgbm90IHNldCB0aGVyZSBpcyBubyBtYXhpbXVtIHRpbWUsIG9ubHkKICB0aGUgYW1vdW50IG9mIHJldHJpZXMgc2V0IHdpdGggLS1yZXRyeS4KCi0gUGF1bCBOb2xhbiBwcm92aWRlZCBhIHBhdGNoIHRvIG1ha2UgbGliY3VybCBidWlsZCBuaWNlbHkgb24gV2luZG93cyBDRS4KCkRhbmllbCAoMSBOb3ZlbWJlciAyMDA0KQotIFdoZW4gY3Jvc3MtY29tcGlsaW5nLCB0aGUgY29uZmlndXJlIHNjcmlwdCBubyBsb25nZXIgYXR0ZW1wdHMgdG8gdXNlCiAgcGtnLWNvbmZpZyBvbiB0aGUgYnVpbGQgaG9zdCBpbiBvcmRlciB0byBkZXRlY3QgT3BlblNTTCBjb21waWxlciBvcHRpb25zLgoKRGFuaWVsICgyNyBPY3RvYmVyIDIwMDQpCi0gRGFuIEZhbmRyaWNoOgoKICBBbiBpbXByb3ZlbWVudCB0byB0aGUgZ3ppcCBoYW5kbGluZyBvZiBsaWJjdXJsLiBUaGVyZSB3ZXJlIHR3byBwcm9ibGVtcyB3aXRoCiAgdGhlIG9sZCB2ZXJzaW9uOiBpdCB3YXMgcG9zc2libGUgZm9yIGEgbWFsaWNpb3VzIGd6aXAgZmlsZSB0byBjYXVzZSBsaWJjdXJsCiAgdG8gbGVhayBtZW1vcnksIGFzIGEgYnVmZmVyIHdhcyBtYWxsb2NlZCB0byBob2xkIHRoZSBoZWFkZXIgYW5kIG5ldmVyIGZyZWVkCiAgaWYgdGhlIGhlYWRlciBlbmRlZCB3aXRoIG5vIGZpbGUgY29udGVudHMuICBUaGUgc2Vjb25kIHByb2JsZW0gaXMgdGhhdCB0aGUKICA2NCBLaUIgZGVjb21wcmVzc2lvbiBidWZmZXIgd2FzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2ssIHdoaWNoIGNhdXNlZAogIHVuZXhwZWN0ZWRseSBoaWdoIHN0YWNrIHVzYWdlIGFuZCBvdmVyZmxvd2VkIHRoZSBzdGFjayBvbiBzb21lIHN5c3RlbXMKICAoc29tZW9uZSBjb21wbGFpbmVkIGFib3V0IHRoYXQgaW4gdGhlIG1haWxpbmcgbGlzdCBhYm91dCBhIHllYXIgYWdvKS4KCiAgQm90aCBwcm9ibGVtcyBhcmUgZml4ZWQgYnkgdGhpcyBwYXRjaC4gVGhlIGZpcnN0IG9uZSBpcyBmaXhlZCB3aGVuIGEgcmVjZW50CiAgKDEuMikgdmVyc2lvbiBvZiB6bGliIGlzIHVzZWQsIGFzIGl0IHRha2VzIGNhcmUgb2YgZ3ppcCBoZWFkZXIgcGFyc2luZwogIGl0c2VsZi4gIEEgY2hlY2sgZm9yIHRoZSB2ZXJzaW9uIG51bWJlciBpcyBkb25lIGF0IHJ1bi10aW1lIGFuZCBsaWJjdXJsIHVzZXMKICB0aGF0IGZlYXR1cmUgaWYgaXQncyBwcmVzZW50LiBJJ3ZlIGNyZWF0ZWQgYSBkZWZpbmUgT0xEX1pMSUJfU1VQUE9SVCB0aGF0CiAgY2FuIGJlIGNvbW1lbnRlZCBvdXQgdG8gc2F2ZSBzb21lIGNvZGUgc3BhY2UgaWYgbGliY3VybCBpcyBndWFyYW50ZWVkIHRvIGJlCiAgdXNpbmcgYSAxLjIgdmVyc2lvbiBvZiB6bGliLgoKICBUaGUgc2Vjb25kIHByb2JsZW0gaXMgc29sdmVkIGJ5IGR5bmFtaWNhbGx5IGFsbG9jYXRpbmcgdGhlIG1lbW9yeSBidWZmZXIKICBpbnN0ZWFkIG9mIHN0b3JpbmcgaXQgb24gdGhlIHN0YWNrLiBUaGUgYWxsb2NhdGlvbi9mcmVlIGlzIGRvbmUgZm9yIGV2ZXJ5CiAgaW5jb21pbmcgcGFja2V0LCB3aGljaCBpcyBzdWJvcHRpbWFsLCBidXQgc2hvdWxkIGJlIGR3YXJmZWQgYnkgdGhlIGFjdHVhbAogIGRlY29tcHJlc3Npb24gY29tcHV0YXRpb24uCgogIEkndmUgYWxzbyBmYWN0b3JlZCBvdXQgc29tZSBjb21tb24gY29kZSBiZXR3ZWVuIGRlZmxhdGUgYW5kIGd6aXAgdG8gcmVkdWNlCiAgdGhlIGNvZGUgZm9vdHByaW50IHNvbWV3aGF0LiAgSSd2ZSB0ZXN0ZWQgdGhlIGd6aXAgY29kZSBvbiBhIGZldyB0ZXN0IGZpbGVzCiAgYW5kIEkgdHJpZWQgZGVmbGF0ZSB1c2luZyB0aGUgZnJlc2htZWF0Lm5ldCBzZXJ2ZXIsIGFuZCBpdCBhbGwgbG9va3MgT0suIEkKICBkaWRuJ3QgdHJ5IHJ1bm5pbmcgaXQgd2l0aCB2YWxncmluZCwgaG93ZXZlci4KCi0gQWRkZWQgYSAtLXJldHJ5IG9wdGlvbiB0byBjdXJsIHRoYXQgdGFrZXMgYSBudW1lcmljYWwgb3B0aW9uIGZvciB0aGUgbnVtYmVyCiAgb2YgdGltZXMgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcmV0cmllZC4gSXQgaXMgcmV0cmllZCBpZiBhIHRyYW5zaWVudCBlcnJvcgogIGlzIGRldGVjdGVkIG9yIGlmIGEgdGltZW91dCBvY2N1cnJlZC4gQnkgZGVmYXVsdCwgaXQgd2lsbCBmaXJzdCB3YWl0IG9uZQogIHNlY29uZCBiZXR3ZWVuIHRoZSByZXRyaWVzIGFuZCB0aGVuIGRvdWJsZSB0aGUgZGVsYXkgdGltZSBiZXR3ZWVuIGVhY2ggcmV0cnkKICB1bnRpbCB0aGUgZGVsYXkgdGltZSBpcyB0ZW4gbWludXRlcyB3aGljaCB0aGVuIHdpbGwgYmUgdGhlIGRlbGF5IHRpbWUKICBiZXR3ZWVuIGFsbCBmb3J0aGNvbWluZyByZXRyaWVzLiBZb3UgY2FuIHNldCBhIHN0YXRpYyBkZWxheSB0aW1lIHdpdGgKICAiLS1yZXRyeS1kZWxheSBbbnVtXSIgd2hlcmUgW251bV0gaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbgogIGVhY2ggcmV0cnkuCgpEYW5pZWwgKDI1IE9jdG9iZXIgMjAwNCkKLSBUb21hcyBQb3NwaXNlayBmaWxlZCBidWcgcmVwb3J0ICMxMDUzMjg3IHRoYXQgcHJvdmVkIC1DIC0gYW5kIC0tZmFpbCBvbiBhCiAgZmlsZSB0aGF0IHdhcyBhbHJlYWR5IGNvbXBsZXRlbHkgZG93bmxvYWRlZCBjYXVzZWQgYW4gZXJyb3IsIHdoaWxlIGl0CiAgZG9lc24ndCBpZiB5b3UgZG9uJ3QgdXNlIC0tZmFpbCEgSSBhZGRlZCB0ZXN0IGNhc2UgMTk0IHRvIHZlcmlmeSB0aGUgZml4LgogIEdycnIuIENVUkxPUFRfRkFJTE9ORVJST1IgaXMgbm93IGFkZGVkIHRvIHRoZSBsaXN0IHN0dWZmIHRvIHJlbW92ZSBpbgogIGxpYmN1cmwgdjggZHVlIHRvIGFsbCB0aGUga2x1ZGdlcyBuZWVkZWQgdG8gc3VwcG9ydCBpdC4KCi0gTW9odW4gQmlzd2FzIGZvdW5kIG91dCB0aGF0IGZvcm1wb3N0aW5nIGEgemVyby1ieXRlIGZpbGUgZGlkbid0IHdvcmsgdmVyeQogIGdvb2QuIEkgZml4ZWQuCgpEYW5pZWwgKDE5IE9jdG9iZXIgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlIGl0IHBvc3NpYmxlIHRvIG1ha2UgRlRQIDNyZCBwYXJ0eSB0cmFuc2ZlcnMKICB3aXRoIGJvdGggc291cmNlIGFuZCBkZXN0aW5hdGlvbiBiZWluZyB0aGUgc2FtZSBob3N0LiBJdCBjYW4gYmUgdXNlZnVsIGlmCiAgeW91IHdhbnQgdG8gbW92ZSBhIGZpbGUgb24gYSBzZXJ2ZXIgb3Igc2ltaWxhci4KCi0gR3VpbGxhdW1lIEFybHVpc29uIGFkZGVkIENVUkxJTkZPX05VTV9DT05ORUNUUyB0byBhbGxvdyBhbiBhcHAgdG8gZmlndXJlCiAgb3V0IGhvdyBtYW55IG5ldyBjb25uZWN0cyBhIHByZXZpb3VzIHRyYW5zZmVyIHJlcXVpcmVkLgoKICBJIGFkZGVkICV7bnVtX2Nvbm5lY3RzfSB0byB0aGUgY3VybCB0b29sIGFuZCBhZGRlZCB0ZXN0IGNhc2UgMTkyIGFuZCAxOTMKICB0byB2ZXJpZnkgdGhlIG5ldyBjb2RlLgoKRGFuaWVsICgxOCBPY3RvYmVyIDIwMDQpCi0gUGV0ZXIgV3VsbGluZ2VyIHBvaW50ZWQgb3V0IHRoYXQgY3VybCBzaG91bGQgY2FsbCBzZXRsb2NhbGUoKSBwcm9wZXJseSB0bwogIGluaXRpYXRlIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBvcGVyYXRpb25zLCB0byBtYWtlIHRoZSBJRE4gc3R1ZmYgd29yawogIGJldHRlci4KClZlcnNpb24gNy4xMi4yICgxOCBPY3RvYmVyIDIwMDQpCgpEYW5pZWwgKDE2IE9jdG9iZXIgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlIHRoZSBDVVJMT1BUX0ZUUF9DUkVBVEVfTUlTU0lOR19ESVJTIG9wdGlvbiB3b3JrCiAgZmluZSBldmVuIGZvciB0aGlyZCBwYXJ0eSB0cmFuc2ZlcnMuCgotIHJ1bmVrbCBhdCBvcG9pbnQuY29tIGZvdW5kIG91dCAoYW5kIHByb3ZpZGVkIGEgZml4KSB0aGF0IGxpYmN1cmwgbGVha2VkCiAgbWVtb3J5IGZvciBjb29raWVzIHdpdGggdGhlICJtYXgtYWdlIiBmaWVsZCBzZXQuCgpHaXNsZSAoMTYgT2N0b2JlciAyMDA0KQotIElzc3VlIDUwIGluIFRPRE8tUkVMRUFTRTsgQWRkZWQgVHJhaWFuIE5pY29sZXNjdSdzIHBhdGNoZXMgZm9yIHRocmVhZGVkCiAgcmVzb2x2ZXIgb24gV2luZG93cy4gUGx1Z2dlZCBzb21lIHBvdGVudGlhbCBoYW5kbGUgYW5kIG1lbW9yeSBsZWFrcy4KCkRhbmllbCAoMTQgT2N0b2JlciAyMDA0KQotIEVyaWMgVmVyZ25hdWQgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIGRpZG4ndCB0cmVhdCA/LWxldHRlcnMgaW4gdGhlIHVzZXIKICBuYW1lIGFuZCBwYXNzd29yZCBmaWVsZHMgcHJvcGVybHkgaW4gVVJMcywgbGlrZQogIGZ0cDovL3VzP2VyOnBhc3M/d29yZEBzaXRlLmNvbS8uIEFkZGVkIHRlc3QgMTkxIHRvIHZlcmlmeSB0aGUgZml4LgoKRGFuaWVsICgxMSBPY3RvYmVyIDIwMDQpCi0gbGliY3VybCBub3cgdXNlcyBTT19OT1NJR1BJUEUgZm9yIHN5c3RlbXMgdGhhdCBzdXBwb3J0IGl0IChNYWMgT1MgWCAxMC4yIG9yCiAgbGF0ZXIgaXMgb25lKSB0byBpbmhpYml0IHRoZSBTSUdQSVBFIHNpZ25hbCB3aGVuIHdyaXRpbmcgdG8gYSBzb2NrZXQgd2hpbGUKICB0aGUgcGVlciBkaWVzLiBUaGUgc2FtZSBlZmZlY3QgaXMgcHJvdmlkZSBieSB0aGUgTVNHX05PU0lHTkFMIHBhcmFtZXRlciB0bwogIHNlbmQoKSBvbiBvdGhlciBzeXN0ZW1zLiBBbGFuIFBpbnN0ZWluIHZlcmlmaWVkIHRoZSBmaXguCgpEYW5pZWwgKDEwIE9jdG9iZXIgMjAwNCkKLSBTeXN0ZW1zIHdpdGggNjRiaXQgbG9uZ3Mgbm8gbG9uZ2VyIHVzZSBzdHJ0b2xsKCkgb3Igb3VyIHN0cnRvbGwtIHJlcGxhY2VtZW50CiAgdG8gcGFyc2UgNjQgYml0IG51bWJlcnMuIHN0cnRvbCgpIHdvcmtzIGZpbmUuIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIHRvCiAgZGV0ZWN0IGlmIFtjb25zdGFudF1MTCB3b3JrcyBhbmQgaWYgc28sIHVzZSB0aGF0IGluIHRoZSBzdHJ0b2xsIHJlcGxhY2VtZW50CiAgY29kZSB0byB3b3JrIGFyb3VuZCBjb21waWxlciB3YXJuaW5ncyByZXBvcnRlZCBieSBBbmR5IENlZGlsbmlrLgoKR2lzbGUgKDYgT2N0b2JlciAyMDA0KQotIEZvciBVU0VfTElCSUROIGJ1aWxkczogQWRkZWQgVG9wLUxldmVsLURvbWFpbiAoVExEKSBjaGVjayBvZiBob3N0LW5hbWUKICB1c2VkIGluIGZpeF9ob3N0bmFtZSgpLiBDaGVja3MgaWYgY2hhcmFjdGVycyBpbiAnaG9zdC0+bmFtZScgKGluZGlyZWN0bHkKICB2aWEgJ2FjZV9ob3N0bmFtZScpIGFyZSBsZWdhbCBhY2NvcmRpbmcgdG8gdGhlIFRMRCB0YWJsZXMgaW4gbGliaWRuLgoKRGFuaWVsICg2IE9jdG9iZXIgMjAwNCkKLSBDaGloLUNodW5nIENoYW5nIHJlcG9ydGVkIHRoYXQgaWYgeW91IHVzZSBDVVJMT1BUX1JFU1VNRV9GUk9NIGFuZCBlbmFibGVkCiAgQ1VSTE9QVF9GT0xMT1dMT0NBVElPTiwgbGliY3VybCByZXBvcnRlZCBlcnJvciBpZiBhIHJlZGlyZWN0IGhhcHBlbmVkIGV2ZW4KICBpZiB0aGUgbmV3IFVSTCB3b3VsZCBwcm92aWRlIHRoZSByZXN1bWVkIGZpbGUuIFRlc3QgY2FzZSAxODggYWRkZWQgdG8gdmVyaWZ5CiAgdGhlIGZpeCAodG9nZXRoZXIgd2l0aCBleGlzdGluZyB0ZXN0IDk5KS4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIGEgY29uZmlndXJlIGZsYXcgZm9yIHN5c3RlbXMgdGhhdCBuZWVkIGJvdGggbnNsIGFuZCBzb2NrZXQKICBsaWJzIHRvIHVzZSBnZXRob3N0YnluYW1lKCkuCgotIFJlbW92ZWQgdGFicyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGxvdHMgb2Ygc291cmNlIGZpbGVzLgoKRGFuaWVsICg1IE9jdG9iZXIgMjAwNCkKLSBNYWRlIGNvbmZpZ3VyZSAtLXdpdGgtbGliaWRuPVBBVEggdHJ5IHRoZSBnaXZlbiBQQVRIIGJlZm9yZSB0aGUgZGVmYXVsdAogIHBhdGhzIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gb3ZlcnJpZGUuCgotIElmIGlkbmFfc3RyZXJyb3IoKSBpcyBwcmVzZW50IGluIGxpYmlkbiwgd2UgY2FuIHVzZSB0aGF0IGluc3RlYWQgb2Ygb3VyCiAgaW50ZXJuYWwgcmVwbGFjZW1lbnQuIFRoaXMgZnVuY3Rpb24gd2FzIGFkZGVkIGJ5IFNpbW9uIGluIGxpYmlkbiAwLjUuNiBhbmQKICBpcyBkZXRlY3RlZCBieSBjb25maWd1cmUuCgotIEl0IHNlZW1zIGJhc2VuYW1lKCkgb24gSVJJWCBpcyBpbiB0aGUgbGliZ2VuIGxpYnJhcnkgYW5kIHNpbmNlIHdlIGRvbid0IHVzZQogIHRoYXQsIGNvbmZpZ3VyZSBmaW5kcyBsaWJnZW4uaCBidXQgbm90IGJhc2VuYW1lIGFuZCB0aGVuIHdlIGdldCBhIGNvbXBpbGVyCiAgZXJyb3IgYmVjYXVzZSBvdXIgYmFzZW5hbWUoKSByZXBsYWNlbWVudCBkb2Vzbid0IG1hdGNoIHRoZSBwcm90byBpbgogIGxpYmdlbi5oLiBTdGFydGluZyBub3csIHdlIGRvbid0IGluY2x1ZGUgdGhlIGZpbGUgaWYgYmFzZW5hbWUgd2Fzbid0IGZvdW5kCiAgYXMgd2VsbC4KCkRhbmllbCAoNCBPY3RvYmVyIDIwMDQpCi0gQ2hyaXMgZm91bmQgYSByYWNlIGNvbmRpdGlvbiByZXN1bHRpbmcgaW4gQ1VSTEVfQ09VTEROVF9SRVNPTFZFX0hPU1QgYW5kCiAgcG90ZW50aWFsIGNyYXNoLCBpbiB0aGUgd2luZG93cyB0aHJlYWRlZCBuYW1lIHJlc29sdmVyIGNvZGUuCgpEYW5pZWwgKDMgT2N0b2JlciAyMDA0KQotIFJlcGxhY2VkIHRoZSB1c2Ugb2YgaXNzcGFjZSgpIGluIGNvb2tpZS5jIHdpdGggb3VyIG93biB2ZXJzaW9uIGluc3RlYWQgc2luY2UKICB3ZSBoYXZlIG1vc3QgZGF0YSBhcyAnY2hhciAqJyBhbmQgdGhhdCBtYWtlcyB1cyBwYXNzIGluIG5lZ2F0aXZlIHZhbHVlcyBpZgogIHRoZXJlIGlzIDhiaXQgZGF0YSBpbiB0aGUgc3RyaW5nLiBDaGFuZ2luZyB0byB1bnNpZ25lZCBjYXVzZXMgdG9vIG11Y2gKICB3YXJuaW5ncyBvciB0b28gbWFueSByZXF1aXJlZCB0eXBlY2FzdHMgdG8gdGhlIG5vcm1hbCBzdHJpbmcgZnVuY3Rpb25zLgogIEhhcnNoYWwgUHJhZGhhbiBpZGVudGlmaWVkIHRoaXMgcHJvYmxlbS4KCkRhbmllbCAoMiBPY3RvYmVyIDIwMDQpCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZm91bmQgYSBjYXNlIHdoZXJlIGxpYmN1cmwgY291bGQgcmVhZCBhbHJlYWR5IGZyZWVkCiAgZGF0YSB3aGVuIENVUkxPUFRfVkVSQk9TRSBpcyB1c2VkIGFuZCBhICh2ZXJ5KSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24uIEl0CiAgaGFwcGVuZWQgd2hlbiB0aGUgZG5zIGNhY2hlIGVudHJ5IGZvciB0aGUgY29ubmVjdGlvbiB3YXMgcHJ1bmVkIHdoaWxlIHRoZQogIGNvbm5lY3Rpb24gd2FzIHN0aWxsIGFsaXZlIGFuZCB0aGVuIGFnYWluIHJlLXVzZWQuIFdlIHdvcmtlZCB0b2dldGhlciBvbgogIHRoaXMgZml4LgoKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBjb2RlIHRoYXQgZGlzcGxheXMgYW4gZXJyb3IgbWVzc2FnZSB3aGVuIHRoZSAobGliaWRuCiAgYmFzZWQpIElETiBjb252ZXJzaW9uIGZhaWxzLiBUaGlzIGlzIHJlYWxseSBkdWUgdG8gYSBtaXNzaW5nIHN1aXRhYmxlCiAgZnVuY3Rpb24gaW4gdGhlIGxpYmlkbiBBUEkgdGhhdCBJIGhvcGUgd2UgY2FuIHJlbW92ZSBvbmNlIGxpYmlkbiBnZXRzIGEKICBmdW5jdGlvbiBsaWtlIHRoaXMuCgpEYW5pZWwgKDEgT2N0b2JlciAyMDA0KQotIEFsZWtzYW5kYXIgTWlsaXZvamV2aWMgcmVwb3J0ZWQgYSBwcm9ibGVtIGluIHRoZSBSZWRoYXQgYnVnemlsbGEgKHNlZQogIGh0dHBzOi8vYnVnemlsbGEucmVkaGF0LmNvbS9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MTM0MTMzKSBhbmQgbm90IHRvCiAgYW55b25lIGludm9sdmVkIGluIHRoZSBjdXJsIHByb2plY3QhIFRoaXMgaGFwcGVucyB3aGVuIHlvdSB0cnkgdG8gY3VybCBhCiAgZmlsZSBmcm9tIGEgcHJvZnRwZCBzaXRlIHVzaW5nIFNTTC4gSXQgc2VlbXMgcHJvZnRwZCBzZW5kcyBhIHNvbWV3aGF0CiAgdW5vcnRob2RveCByZXNwb25zZSBjb2RlICgyMzIgaW5zdGVhZCBvZiAyMzApLiBJIHJlbGF4ZWQgdGhlIHJlc3BvbnNlIGNvZGUKICBjaGVjayB0byBkZWFsIHdpdGggdGhpcyBhbmQgc2ltaWxhciBjYXNlcy4KCi0gQmFzZWQgb24gRmVkb3IgS2FycGVsZXZpdGNoJ3MgZm9ybXBvc3QgcGF0aCBiYXNlbmFtZSBwYXRjaCwgZmlsZSBwYXJ0cyBpbgogIGZvcm1wb3N0cyBubyBsb25nZXIgaW5jbHVkZSB0aGUgcGF0aCBwYXJ0LiBJZiB5b3UgX3JlYWxseV8gd2FudCB0aGVtLCB5b3UKICBtdXN0IHByb3ZpZGUgeW91ciBwcmVmZXJyZWQgZnVsbCBmaWxlIG5hbWUgd2l0aCBDVVJMRk9STV9GSUxFTkFNRS4KCiAgQWRkZWQgZGV0ZWN0aW9uIGZvciBsaWJnZW4uaCBhbmQgYmFzZW5hbWUoKSB0byBjb25maWd1cmUuIE15IGN1c3RvbQogIGJhc2VuYW1lKCkgcmVwbGFjZW1lbnQgZnVuY3Rpb24gZm9yIHN5c3RlbXMgd2l0aG91dCBpdCwgbWlnaHQgYmUgYSBiaXQgdG9vCiAgbmFpdmUuLi4KCiAgVXBkYXRlZCA2IHRlc3QgY2FzZXMgdG8gbWFrZSB0aGVtIHdvcmsgd2l0aCB0aGUgc3RyaXBwZWQgcGF0aHMuCgpEYW5pZWwgKDMwIFNlcHRlbWJlciAyMDA0KQotIExhcnJ5IENhbXBiZWxsIGFkZGVkIENVUkxJTkZPX09TX0VSUk5PIHRvIGN1cmxfZWFzeV9nZXRpbmZvKCkgdGhhdCBhbGxvd3MgYW4KICBhcHAgdG8gcmV0cmlldmUgdGhlIGVycm5vIHZhcmlhYmxlIGFmdGVyIGEgKGNvbm5lY3QpIGZhaWx1cmUuIEl0IHdpbGwgbWFrZQogIHNlbnNlIHRvIHByb3ZpZGUgdGhpcyBmb3IgbW9yZSBmYWlsdXJlcyBpbiBhIG1vcmUgZ2VuZXJpYyB3YXksIGJ1dCBsZXQncwogIHN0YXJ0IGxpa2UgdGhpcy4KCi0gR/xudGVyIEtuYXVmIGFuZCBDYXNleSBPJ0Rvbm5lbGwgd29ya2VkIG91dCBhbiBleHRyYSAjaWYgY29uZGl0aW9uIGZvciB0aGUKICBjdXJsL211bHRpLmggaGVhZGVyIHRvIHdvcmsgYmV0dGVyIGluIHdpbnNvY2stdXNpbmcgYXBwcy4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBtYWRlIGJ1aWxkY29uZiBydW4gYmV0dGVyIG9uIE1hYyBPUyBYIGJ5CiAgcHJvcGVybHkgdXNpbmcgZ2xpYnRvb2xpemUgaW5zdGVhZCBvZiBwbGFpbiBsaWJ0b29saXplLiAoVGhpcyBpcyBtYWRlIGlmCiAgZ2xpYnRvb2wgd2FzIGZvdW5kIGFuZCB1c2VkIGluc3RlYWQgb2YgcGxhaW4gbGlidG9vbC4pCgpEYW5pZWwgKDI5IFNlcHRlbWJlciAyMDA0KQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZpeGVkIGN1cmxfZWFzeV9yZXNldCgpIHNvIHRoYXQgaXQgZG9lc24ndCBtaXN0YWtpbmdseQogIGVuYWJsZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDA0KQotICJNZWtvbmlrdW0iIGZvdW5kIG91dCB0aGF0IGlmIHlvdSBidWlsdCBjdXJsIHdpdGhvdXQgU1NMIHN1cHBvcnQsIGFsdGhvdWdoCiAgeW91ciBjdXJyZW50IFNTTCBpbnN0YWxsYXRpb24gc3VwcG9ydHMgRW5naW5lLCB0aGUgY29tcGlsZSBmYWlscy4KCkRhbmllbCAoMjcgU2VwdGVtYmVyIDIwMDQpCi0gV2hlbiAtLXdpdGgtc3NsPVBBVEggaXMgdXNlZCB0byB0aGUgY29uZmlndXJlIHNjcmlwdCwgaXQgbm8gbG9uZ2VyIHVzZXMKICBwa2ctY29uZmlnIHRvIGZpZ3VyZSBvdXQgZXh0cmEgZGV0YWlscy4gVGhhdCBpcyBub3cgb25seSBkb25lIGlmIG5vIFBBVEggaXMKICBpbmNsdWRlZCBvciBpZiBTU0wgaXMgY2hlY2tlZCBmb3IgYnkgZGVmYXVsdCB3aXRob3V0IHRoZSAtLXdpdGgtc3NsIG9wdGlvbi4KCkRhbmllbCAoMjUgU2VwdGVtYmVyIDIwMDQpCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IHRoYXQgQ1VSTE9QVF9TU0xFTkdJTkUgY291bGRuJ3QgZXZlbiBiZSBzZXQgdG8KICBOVUxMIHdoZW4gbm8gZW5naW5lIHdhcyBzdXBwb3J0ZWQuIEl0IGNhbiBub3cuCgpEYW5pZWwgKDIyIFNlcHRlbWJlciAyMDA0KQotIERhbiBGYW5kcmljaCBmaXhlZCB0aHJlZSB0ZXN0IGNhc2VzIHRvIG5vIGxvbmdlciB1c2UgImxvY2FsaG9zdCIgYnV0IGluc3RlYWQKICB1c2UgIjEyNy4wLjAuMSIgdG8gYXZvaWQgcmVxdWlyaW5nIHRoYXQgbG9jYWxob3N0IHJlc29sdmVzIG5pY2VseS4KCi0gSmVhbi1DbGF1ZGUgQ2hhdXZlIGZpeGVkIGFuIExEQVAgY3Jhc2ggd2hlbiBtb3JlIHRoYW4gb25lIHJlY29yZCB3YXMKICByZXRyaWV2ZWQuCgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDA0KQotIEFuZHJlYXMgUmlla2UgcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBhIGhvc3Qgd2l0aG91dAogIGEgc2VydmljZSBvbiB0aGUgc3BlY2lmaWVkIHBvcnQsIGN1cmxfZWFzeV9wZXJmb3JtKCkgZGlkbid0IHByb3Blcmx5IHByb3ZpZGUKICBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSBDVVJMT1BUX0VSUk9SQlVGRkVSIGJ1ZmZlci4KCkRhbmllbCAoMTYgU2VwdGVtYmVyIDIwMDQpCi0gRGFuaWVsIGF0IHRvdWNodHVuZXMgdXNlcyB0aGUgRlRQK1NTTCBzZXJ2ZXIgIkJTREZUUEQtU1NMIGZyb20KICBodHRwOi8vYnNkZnRwZC1zc2wuc2MucnUvIiB3aGljaCBhY2NvcmRpbmdseSBkb2Vzbid0IHByb3Blcmx5IHdvcmsgd2l0aCBjdXJsCiAgd2hlbiAiQVVUSCBTU0wiIGlzIGlzc3VlZCAoYWx0aG91Z2ggdGhlIHNlcnZlciByZXNwb25kcyBmaW5lIGFuZCBldmVyeXRoaW5nKQogIGJ1dCByZXF1aXJlcyB0aGF0IGN1cmwgaXNzdWVzICJBVVRIIFRMUyIgaW5zdGVhZC4gU2VlCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9mZWVkYmFjay9kaXNwbGF5LmNnaT9pZD0xMDk1MTk0NDkzNzYwMyZzdXBwb3J0PXllcwoKICBJbnRyb2R1Y2luZyBDVVJMT1BUX0ZUUFNTTEFVVEggdGhhdCBhbGxvd3MgdGhlIGFwcGxpY2F0aW9uIHRvIHNlbGVjdCB3aGljaAogIG9mIHRoZSBBVVRIIHN0cmluZ3MgdG8gYXR0ZW1wdCBmaXJzdC4KCi0gQW5vbnltb3VzIGZpbGVkIGJ1ZyByZXBvcnQgIzEwMjk0Nzggd2hpY2ggaWRlbnRpZmllZCBhIGJ1ZyB3aGVuIHlvdSAxKSB1c2VkCiAgYSBVUkwgd2l0aG91dCBwcm9wZXJseSBzZXBlcmF0aW5nIHRoZSBob3N0IG5hbWUgYW5kIHRoZSBwYXJhbWV0ZXJzIHdpdGggYQogIHNsYXNoLiAyKSB0aGUgVVJMIGhhZCBwYXJhbWV0ZXJzIHRvIHRoZSByaWdodCBvZiBhID8gdGhhdCBjb250YWlucyBhIHNsYXNoCiAgMykgY3VybCB3YXMgdG9sZCB0byBmb2xsb3cgTG9jYXRpb246cyA0KSB0aGUgcmVxdWVzdCBnb3QgYSByZXNwb25zZSB0aGF0CiAgY29udGFpbmVkIGEgTG9jYXRpb246IHRvIHJlZGlyZWN0IHRvICIvZGlyIi4gY3VybCB0aGVuIGFwcGVuZGVkIHRoZSBuZXcgcGF0aAogIG9uIHRoZSB3cm9uZyBwb3NpdGlvbiBvZiB0aGUgb3JpZ2luYWwgVVJMLgoKICBUZXN0IGNhc2UgMTg3IHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhhdCB0aGlzIHdhcyBmaXhlZCBwcm9wZXJseS4KCkRhbmllbCAoMTEgU2VwdGVtYmVyIDIwMDQpCi0gQWRkZWQgcGFyc2VkYXRlLmMgdGhhdCBjb250YWlucyBhIHJld3JpdGUgb2YgdGhlIGRhdGUgcGFyc2VyIGN1cnJlbnRseQogIHByb3ZpZGVkIGJ5IGdldGRhdGUueS4gVGhlIG5ldyBvbmUgaXMgTVVDSCBzbWFsbGVyIGFuZCB3aWxsIGFsbG93IHVzIHRvIHJ1bgogIGF3YXkgZnJvbSB0aGUgeWFjYy9iaXNvbiBqdW5nbGUuIEl0IGlzIGFsc28gc2xpZ2h0bHkgbGFja2luZyBpbiBmZWF0dXJlcwogIGNvbXBhcmVkIHRvIHRoZSBvbGQgb25lLCBidXQgaXQgc3VwcG9ydHMgcGFyc2luZyBvZiBhbGwgZGF0ZSBmb3JtYXRzIEhUVFAKICBpbnZvbHZlcyAoYW5kIGEgZmFpciBidW5jaCBvZiBvdGhlcnMpLgoKRGFuaWVsICgxMCBTZXB0ZW1iZXIgMjAwNCkKLSBBcyBmb3VuZCBvdXQgYnkgSm9uYXMgRm9yc21hbiwgY3VybCBkaWRuJ3QgYWxsb3cgLUYgdG8gc2V0IENvbnRlbnQtVHlwZSBvbgogIHRleHQtcGFydHMuIFN0YXJ0aW5nIG5vdywgd2UgY2FuIGRvIC1GICJuYW1lPWRhbmllbDt0eXBlPXRleHQvZXh0cmEiLiBBZGRlZAogIHRlc3QgY2FzZSAxODYgdG8gdmVyaWZ5LgoKLSBCdWcgcmVwb3J0ICMxMDI1OTg2LiBXaGVuIGZvbGxvd2luZyBhIExvY2F0aW9uOiB3aXRoIGEgY3VzdG9tIEhvc3Q6IGhlYWRlcgogIHJlcGxhY2VtZW50LCBjdXJsIG9ubHkgcmVwbGFjZWQgdGhlIEhvc3Q6IGhlYWRlciBvbiB0aGUgaW5pdGlhbCByZXF1ZXN0CiAgYW5kIGRpZG4ndCByZXBsYWNlIGl0IG9uIHRoZSBmb2xsb3dpbmcgb25lcy4gVGhpcyByZXN1bHRlZCBpbiByZXF1ZXN0cyB3aXRoCiAgdHdvIEhvc3Q6IGhlYWRlcnMuCgogIE5vdywgY3VybCBjaGVja3MgaWYgdGhlIGxvY2F0aW9uIGlzIG9uIHRoZSBzYW1lIGhvc3QgYXMgdGhlIGluaXRpYWwgcmVxdWVzdAogIGFuZCB0aGVuIGNvbnRpbnVlcyB0byByZXBsYWNlIHRoZSBIb3N0OiBoZWFkZXIuIEFuZCB3aGVuIGl0IG1vdmVzIHRvIGFub3RoZXIKICBob3N0LCBpdCBkb2Vzbid0IHJlcGxhY2UgdGhlIEhvc3Q6IGhlYWRlciBidXQgaXQgYWxzbyBkb2Vzbid0IG1ha2UgdGhlCiAgc2Vjb25kIEhvc3Q6IGhlYWRlciBnZXQgdXNlZCBpbiB0aGUgcmVxdWVzdC4KCiAgVGhpcyBjaGFuZ2UgaXMgdmVyaWZpZWQgYnkgdGhlIHR3byBuZXcgdGVzdCBjYXNlcyAxODQgYW5kIDE4NS4KCkRhbmllbCAoOCBTZXB0ZW1iZXIgMjAwNCkKLSBNb2RpZmllZCB0aGUgdGVzdCBzdWl0ZSB0byBiZSBhYmxlIHRvIHVzZSBhbmQgcnVuIHdpdGggY3VzdG9taXplZCBwb3J0CiAgbnVtYmVycy4gVGhpcyB3YXMgYWx3YXlzIGludGVuZGVkIGJ1dCBuZXZlciBiZWZvcmUgcG9zc2libGUuIE5vdyBhIHNpbXBsZQogIGNoYW5nZSBpbiB0aGUgcnVudGVzdHMucGwgc2NyaXB0IGNhbiBtYWtlIGFsbCB0ZXN0cyB1c2UgZGlmZmVyZW50IHBvcnRzLgogIFRoZSBkZWZhdWx0IHBvcnRzIGluIHVzZSBmcm9tIG5vdyBvbiBhcmUgODk5MCB0byA4OTkzLgoKRGFuaWVsICgyIFNlcHRlbWJlciAyMDA0KQotIE1pbm9yIG1vZGlmaWNhdGlvbiBvZiBhbiBTU0wtcmVsYXRlZCBlcnJvciBtZXNzYWdlLgoKRGFuaWVsICgzMSBBdWd1c3QgMjAwNCkKLSBEYXZpZCBUYXJlbmRhc2ggZm91bmQgb3V0IHRoYXQgY3VybF9tdWx0aV9hZGRfaGFuZGxlKCkgcmV0dXJuZWQKICBDVVJMTV9DQUxMX01VTFRJX1BFUkZPUk0gaW5zdGVhZCBvZiBDVVJMTV9PSy4KCkRhbmllbCAoMzAgQXVndXN0IDIwMDQpCi0gTWFrZSAiUHJveHktQ29ubmVjdGlvbjogY2xvc2UiIGNsb3NlIHRoZSBjdXJyZW50IHByb3h5IGNvbm5lY3Rpb24sIGFzIFJvbWFuCiAgS29pZm1hbiBmb3VuZCBvdXQuCgpEYW5pZWwgKDI0IEF1Z3VzdCAyMDA0KQotIEZpeGVkIGEgZ2V0ZGF0ZSBwcm9ibGVtIGJ5IHBvc3QtcmVwbGFjaW5nIHRoZSBnZXRkYXRlLmMgZmlsZSBhZnRlciB0aGUKICBiaXNvbi95YWNjIHByb2Nlc3MgdG8gYWRkIHRoZSBmaXggSGFyc2hhbCBQcmFkaGFuIHN1Z2dlc3RlZC4gVGhlIHByb2JsZW0KICBjYXVzZWQgYSBjcmFzaCBvbiBXaW5kb3dzIHdoZW4gcGFyc2luZyBzb21lIGRhdGVzLgoKRGFuaWVsICgyMyBBdWd1c3QgMjAwNCkKLSBSb21hbiBLb2lmbWFuIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCBzZW5kIEV4cGVjdDogMTAwLWNvbnRpbnVlIG9uIFBPU1RzCiAgZXZlbiB3aGVuIHRvbGQgdG8gdXNlIEhUVFAgMS4wLCB3aGljaCBpcyBub3QgY29ycmVjdC4gVGVzdCBjYXNlIDE4MCBhbmQKICAxODEgdmVyaWZ5IHRoaXMuCgotIEFkZGVkIHRlc3QgY2FzZSAxODIgdG8gdmVyaWZ5IHRoYXQgemVybyBieXRlIHRyYW5zZmVycyBjYWxsIHRoZSBjYWxsYmFjawogIHByb3Blcmx5LgoKRGFuaWVsICgyMCBBdWd1c3QgMjAwNCkKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBtYWRlIHRoZSB3cml0ZSBjYWxsYmFjayBnZXQgY2FsbGVkIGV2ZW4gd2hlbiBhIHplcm8KICBieXRlIGZpbGUgaXMgZG93bmxvYWRlZC4KCkRhbmllbCAoMTggQXVndXN0IDIwMDQpCi0gTGluZyBUaGlvIHBvaW50ZWQgb3V0IHRoYXQgd2hlbiBsaWJjdXJsIGlzIGJ1aWx0IGlwdjYtZW5hYmxlZCwgaXQgc3RpbGwgZGlkCiAgcmV2ZXJzZSBETlMgbG9va3VwcyB3aGVuIGZlZCB3aXRoIGEgbnVtZXJpY2FsIElQLWFkZHJlc3MgKGxpa2UKICBodHRwOi8vMTI3LjAuMC4xLyksIGFsdGhvdWdoIGl0IGRvZXNuJ3Qgd2hlbiBidWlsdCBpcHY2LWRpc2FibGVkLiBsaWJjdXJsCiAgc2hvdWxkIG5ldmVyIGRvIHJldmVyc2UgbG9va3Vwcy4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDQpCi0gS2pldGlsIEphY29ic2VuIG5vdGljZWQgdGhhdCB3aGVuIHRyYW5zZmVycmluZyBhIGZpbGU6Ly8gVVJMIHBvaW50aW5nIHRvIGFuCiAgZW1wdHkgZmlsZSwgbGliY3VybCB3b3VsZCByZXR1cm4gd2l0aCB0aGUgZmlsZSBzdGlsbCBvcGVuLgoKLSBBbGV4YW5kZXIgS3Jhc25vc3RhdnNreSBwb2ludGVkIG91dCB0aGF0IHRoZSBjb25maWd1cmUgc2NyaXB0IG5lZWRzIHRvIGRlZmluZQogIF9USFJFQURfU0FGRSBmb3IgQUlYIHN5c3RlbXMgdG8gbWFrZSBsaWJjdXJsIGJ1aWx0IHJlYWxseSB0aHJlYWQtc2FmZS4KCiAgQWxzbyBhZGRlZCBhIGNoZWNrIGZvciB0aGUgeGxjIGNvbXBpbGVyIG9uIEFJWCwgYW5kIGlmIHRoYXQgaXMgZGV0ZWN0IHdlIHVzZQogIHRoZSAtcXRocmVhZGVkIGNvbXBpbGVyIG9wdGlvbgoKRGFuaWVsICgxNiBBdWd1c3QgMjAwNCkKLSBsaWJjdXJsIG5vdyBhbGxvd3MgYSBjdXN0b20gIkFjY2VwdC1FbmNvZGluZzoiIGhlYWRlciBvdmVycmlkZSB0aGUKICBpbnRlcm5hbGx5IHNldCBvbmUgdGhhdCBnZXRzIHNldCB3aXRoIENVUkxPUFRfRU5DT0RJTkcuIFBvaW50ZWQgb3V0IGJ5IEFsZXguCgotIFJvbGFuZCBLcmlrYXZhIGZvdW5kIGFuZCBmaXhlZCBhIGNvb2tpZSBwcm9ibGVtIHdoZW4gdXNpbmcgYSBwcm94eSAodGhlCiAgcGF0aCBtYXRjaGluZyB3YXMgd3JvbmcpLiBJIGFkZGVkIHRlc3QgY2FzZSAxNzkgdG8gdmVyaWZ5IHRoYXQgd2Ugbm93IGRvCiAgcmlnaHQuCgpEYW5pZWwgKDE1IEF1Z3VzdCAyMDA0KQotIENhc2V5IE8nRG9ubmVsbCBmaXhlZCBzb21lIE1TVkMgbWFrZWZpbGUgdGFyZ2V0cyB0byBsaW5rIHByb3Blcmx5LgoKRGFuaWVsICgxMSBBdWd1c3QgMjAwNCkKLSBjb25maWd1cmUgbm93IGRlZmluZXMgX1hPUEVOX1NPVVJDRSB0byA1MDAgb24gc3lzdGVtcyB0aGF0IG5lZWQgaXQgdG8gYnVpbGQKICB3YXJuaW5nLWZyZWUgKHRoZSBvbmx5IGtub3duIG9uZSBzbyBmYXIgaXMgbm9uLWdjYyBidWlsZHMgb24gNjRiaXQgU0dJCiAgSVJJWCkuIChSZXZlcnRlZCB0aGlzIGNoYW5nZSBsYXRlciBhcyBpdCBjYXVzZWQgY29tcGlsZXIgZXJyb3JzLikKCi0gdGhlIEZUUCBjb2RlIG5vdyBpbmNsdWRlcyB0aGUgc2VydmVyIHJlc3BvbnNlIGluIHRoZSBlcnJvciBtZXNzYWdlIHdoZW4gdGhlCiAgc2VydmVyIGdpdmVzIGJhY2sgYSA1MzAgYWZ0ZXIgdGhlIHBhc3N3b3JkIGlzIHByb3ZpZGVkLCBhcyBpdCBpc24ndAogIG5lY2Vzc2FyeSBiZWNhdXNlIG9mIGEgYmFkIHVzZXIgbmFtZSBvciBwYXNzd29yZC4KClZlcnNpb24gNy4xMi4xICgxMCBBdWd1c3QgMjAwNCkKCkRhbmllbCAoMTAgQXVndXN0IDIwMDQpCi0gSW4gT3BlblNTTCAwLjkuN2QgYW5kIGVhcmxpZXIsIEFTTjFfU1RSSU5HX3RvX1VURjggZmFpbHMgaWYgdGhlIGlucHV0IGlzCiAgYWxyZWFkeSBVVEYtOCBlbmNvZGVkLiBUaGlzIG1hZGUgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBmYWlsIGlmIHRoZQogIHJlbW90ZSBzZXJ2ZXIgdXNlZCBhIGNlcnRpZmljYXRlIHdpdGggdGhlIG5hbWUgVVRGLTggZW5jb2RlZC4KCiAgV29yay1hcm91bmQgYnJvdWdodCBieSBBbGV4aXMgUy4gTC4gQ2FydmFsaG8uCgpEYW5pZWwgKDkgQXVndXN0IDIwMDQpCi0gSSBmaXhlZCB0aGUgY29uZmlndXJlIHNjcmlwdCBmb3Iga3JiNCB0byB1c2UgLWxjb21fZXJyIGFzIHdlbGwsIGFzIEkgc3RhcnRlZAogIHRvIGdldCBsaW5rIHByb2JsZW1zIHdpdGggaXQgdW5sZXNzIEkgZGlkIHRoYXQgb24gbXkgU29sYXJpcyAyLjcgYm94LiBJCiAgZG9uJ3QgdW5kZXJzdGFuZCB3aHkgSSBzdGFydGVkIHRvIGdldCBwcm9ibGVtcyB3aXRoIHRoaXMgbm93IQoKRGFuaWVsICg1IEF1Z3VzdCAyMDA0KQotIEVucmljbyBTY2hvbHogZml4ZWQgdGhlIEhUVFAtTmVnb3RpYXRlIHNlcnZpY2UgbmFtZSB0byBiZSB1cHBlcmNhc2UgYXMKICByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICMxMDA0MTA1CgpEYW5pZWwgKDQgQXVndXN0IDIwMDQpCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgYSBmaXggZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIGNvbm5lY3RpbmcgdG8gYSBob3N0CiAgdXNpbmcgbXVsdGlwbGUgSVAgKGJhZCkgYWRkcmVzc2VzLgoKLSBEeWxhbiBTYWxpc2J1cnkgbWFkZSBsaWJjdXJsIG5vIGxvbmdlciBhY2NlcHQgY29va2llcyBzZXQgdG8gYSBUTEQgb25seSAoaXQKICBwcmV2aW91c2x5IGFsbG93ZWQgdGhhdCBvbiB0aGUgc2V2ZW4gdGhyZWUtbGV0dGVyIGRvbWFpbnMpLgoKRGFuaWVsICgzMSBKdWx5IDIwMDQpCi0gSm9lbCBDaGVuIHJlcG9ydGVkIHRoYXQgdGhlIGRpZ2VzdCBjb2RlIGFzc3VtZWQgcXVvdGVzIGFyb3VuZCB0aGUgY29udGVudHMgYQogIGJpdCB0b28gbXVjaC4KCkRhbmllbCAoMjggSnVseSAyMDA0KQotIEJlcnRyYW5kIERlbWlkZGVsYWVyIGZpeGVkIHRoZSBob3N0IG5hbWUgdG8gZ2V0IHNldHVwIHByb3Blcmx5IGV2ZW4gd2hlbiBhCiAgY29ubmVjdGlvbiBpcyByZS11c2VkLCB3aGVuIGEgcHJveHkgaXMgaW4gdXNlLiBQcmV2aW91c2x5IHRoZSB3cm9uZyBIb3N0OgogIGhlYWRlciBjb3VsZCBnZXQgc2VudCB3aGVuIHJlLXVzaW5nIGEgcHJveHkgY29ubmVjdGlvbiB0byBhIGRpZmZlcmVudCB0YXJnZXQKICBob3N0LgoKLSBGaXhlZCBCcmlhbiBBa2lucycgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCBkdXBsaWNhdGUgSG9zdDogaGVhZGVycyBvbiByZS11c2VkCiAgY29ubmVjdGlvbnMuIElmIHlvdSBhdHRlbXB0ZWQgdG8gcmVwbGFjZSB0aGUgSG9zdDogaGVhZGVyIGluIHRoZSBzZWNvbmQKICByZXF1ZXN0LCB5b3UgZ290IHR3byBzdWNoIGhlYWRlcnMhCgotIHNyYy9NYWtlZmlsZS5hbSBub3cgaW5jbHVkZXMgdGhlIE1ha2VmaWxlLmluYyBmaWxlIHRvIGdldCBpbmZvIGFib3V0IGZpbGVzCgpEYW5pZWwgKDI2IEp1bHkgMjAwNCkKLSBNYWRlICJjdXJsIFtVUkxdIC1vIG5hbWUjMiIgd29yayBhcyBleHBlY3RlZC4gSWYgdGhlcmUncyBubyBnbG9iYmluZyBmb3IgdGhlCiAgIy1udW1iZXIsIGl0IHdpbGwgc2ltcGx5IGJlIHVzZWQgYXMgIzIgaW4gdGhlIGZpbGUgbmFtZS4KCi0gQmVydHJhbmQgRGVtaWRkZWxhZXIgZml4ZWQgdGVzdGluZyB3aXRoIHZhbGdyaW5kIDIuMS54IGFuZCBhZGRlZCB0d28gbWlzc2luZwogIG5ld2xpbmVzIGluIHRoZSBjb29raWUgaW5mb3JtYXRpb25hbHMuCgpEYW5pZWwgKDI0IEp1bHkgMjAwNCkKLSBJIGZpeGVkIHRoZSBhdXRvYnVpbGRzIHdpdGggYXJlcywgc2luY2UgdGhleSBub3cgbmVlZCB0byBoYXZlIGJ1aWxkY29uZiBydW4KICBpbiB0aGUgYXJlcyBkaXIgYmVmb3JlIHRoZSBjb25maWd1cmUgc2NyaXB0IGlzIHJ1bi4KCi0gQWRkZWQgQ2FzZXkgTydEb25uZWxsJ3MgY3VybF9lYXN5X3Jlc2V0KCkgZnVuY3Rpb24uIEl0IGhhcyBhIHByb3RvIGluCiAgY3VybC9jdXJsLmggYnV0IHdlIGhhdmUgbm8gbWFuIHBhZ2UgeWV0LgoKRGFuaWVsICgyMCBKdWx5IDIwMDQpCi0gQWRkZWQgYnVpbGRjb25mIGFuZCBidWlsZGNvbmYuYmF0IHRvIHRoZSByZWxlYXNlIGFyY2hpdmVzLCBzaW5jZSB0aGV5IGFyZQogIGhhbmR5IGZvciByZWJ1aWxkaW5nIGN1cmwgd2hlbiB1c2luZyBhIGRhaWx5IHNuYXBzaG90IChhbmQgbm90IGEgcHVyZSBDVlMKICBjaGVja291dCkuCgpEYW5pZWwgKDE2IEp1bHkgMjAwNCkKLSBBcyBzdWdnZXN0ZWQgYnkgVG9ieSBQZXRlcnNvbiwgbGliY3VybCBub3cgaWdub3JlcyBDb250ZW50LUxlbmd0aCBkYXRhIGlmIHRoZQogIGdpdmVuIHNpemUgaXMgYSBuZWdhdGl2ZSBudW1iZXIuIFRlc3QgY2FzZSAxNzggdmVyaWZpZXMgdGhpcy4KCkRhbmllbCAoMTQgSnVseSAyMDA0KQotIEf8bnRlciBLbmF1ZiBoYXMgbWFkZSB0aGUgTmV0d2FyZSBidWlsZHMgZG8gd2l0aG91dCB0aGUgY29uZmlnLW5ldHdhcmUuaAogIGZpbGVzLCBzbyB0aGV5IGFyZSBub3cgcmVtb3ZlZCBmcm9tIHRoZSBkaXN0IHBhY2thZ2VzLgoKLSBH/G50ZXIgS25hdWYgbWFkZSBjdXJsIGFuZCBsaWJjdXJsIGJ1aWxkIHdpdGggQm9ybGFuZCBhZ2Fpbi4KCi0gQW5kcmVzIEdhcmNpYSBmaXhlZCB0aGUgY29tbW9uIHRlc3QgNTA1IGZhaWx1cmVzIG9uIHdpbmRvd3MuCgpEYW5pZWwgKDYgSnVseSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgZm91bmQgb3V0IHdoeSB0aGUgd2luZG93cyB0ZXN0cyBmYWlsZWQgb24gZmlsZTovLyAidXBsb2FkcyIuCgpEYW5pZWwgKDIgSnVseSAyMDA0KQotIEFuZHLpcyBHYXJj7WEgcmVwb3J0ZWQgYSBjdXJsX3NoYXJlX2NsZWFudXAoKSBjcmFzaCB0aGF0IG9jY3VycyB3aGVuIG5vCiAgbG9jay91bmxvY2sgY2FsbGJhY2tzIGhhdmUgYmVlbiBzZXQgYW5kIHRoZSBzaGFyZSBpcyBjbGVhbmVkIHVwLgoKRGFuaWVsICgxIEp1bHkgMjAwNCkKLSBXaGVuIHVzaW5nIGN1cmwgLS10cmFjZSBvciAtLXRyYWNlLWFzY2lpLCBubyB0cmFjZSBtZXNzYWdlcyB0aGF0IHdlcmUgc2VudAogIGJ5IGN1cmxfZWFzeV9jbGVhbnVwKCkgd2VyZSBpbmNsdWRlZCBpbiB0aGUgdHJhY2UgZmlsZS4gVGhpcyBtYWRlIHRoZQogIG1lc3NhZ2UgIkNsb3NpbmcgY29ubmVjdGlvbiAjMCIgbmV2ZXIgYXBwZWFyIGluIHRyYWNlIGR1bXBzLgoKRGFuaWVsICgzMCBKdW5lIDIwMDQpCi0gTmllbHMgdmFuIFRvbmdlcmVuIGZvdW5kIHRoYXQgc2V0dGluZyBDVVJMT1BUX05PQk9EWSB0byBUUlVFIGRvZXNuJ3QgZGlzYWJsZQogIGEgcHJldmlvdXNseSBzZXQgUE9TVCByZXF1ZXN0LCBtYWtpbmcgYSB2ZXJ5IG9kZCByZXF1ZXN0IGdldCBzZW50ICh1bmxlc3MKICB5b3UgZGlzYWJsZWQgdGhlIFBPU1QpIGEgSEVBRCByZXF1ZXN0IHdpdGggYSBQT1NUIHJlcXVlc3QtYm9keS4gSSd2ZSBub3cKICBtYWRlIENVUkxPUFRfTk9CT0RZIGVuZm9yY2UgYSBwcm9wZXIgSEVBRC4gQWRkZWQgdGVzdCBjYXNlIDUxNCBmb3IgdGhpcy4KCkRhbmllbCAoMjkgSnVuZSAyMDA0KQotIEf8bnRlciBLbmF1ZiBtYWRlIHRoZSB0ZXN0Y3VybC5wbCBzY3JpcHQgY2FwYWJsZSBvZiB1c2luZyBhIGN1c3RvbSBzZXR1cAogIGZpbGUgdG8gZWFzaWVyIHJ1biBtdWx0aXBsZSBhdXRvYnVpbGRzIG9uIHRoZSBzYW1lIHNvdXJjZSB0cmVlLgoKLSBHaXNsZSBmaXhlZCB0aGUgZGpncHAgYnVpbGQgYW5kIGZpeGVkIGEgbWVtb3J5IHByb2JsZW0gaW4gc29tZSBvZiB0aGUKICByZW9yZ2VkIG5hbWUgcmVzb2x2ZWQgY29kZS4KCi0gRml4ZWQgY29kZSB0byBhbGxvdyBjb25uZWN0cyBkb25lIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgdG8gYXR0ZW1wdCB0aGUKICBuZXh0IElQIHdoZW4gY29ubmVjdGluZyB0byBhIGhvc3QgdGhhdCByZXNvbHZlcyB0byBtdWx0aXBsZSBJUHMgYW5kIGEKICBjb25uZWN0IGF0dGVtcHQgZmFpbHMuCgpEYW5pZWwgKDI3IEp1bmUgMjAwNCkKLSBCYXNlZCBvbiBSb2IgU3RhbnplbCdzIGJ1ZyByZXBvcnQgIzk3OTQ4MCwgSSB3cm90ZSBhIGNvbmZpZ3VyZSBjaGVjayB0aGF0CiAgY2hlY2tzIGlmIHBvbGwoKSBjYW4gYmUgdXNlZCB0byB3YWl0IG9uIE5VTEwgYXMgb3RoZXJ3aXNlIHNlbGVjdCgpIHNob3VsZCBiZQogIHVzZWQgdG8gZG8gaXQuIFRoZSBzZWxlY3QoKSB1c2FnZSB3YXMgYWxzbyBmaXhlZCBhY2NvcmRpbmcgdG8gaGlzIHJlcG9ydC4KCiAgTWFjIE9TIFggMTAuMyBzYXlzICJwb2xsKCkgZnVuY3Rpb25hbGl0eSBmb3IgTWFjIE9TIFggaXMgaW1wbGVtZW50ZWQgdmlhIGFuCiAgZW11bGF0aW9uIGxheWVyIG9uIHRvcCBvZiBzZWxlY3QoKSwgbm90IGluIHRoZSBrZXJuZWwgZGlyZWN0bHkuIEl0IGlzCiAgcmVjb21tZW5kZWQgdGhhdCBwcm9ncmFtcyBydW5uaW5nIHVuZGVyIE9TIFggMTAuMyBwcmVmZXIgc2VsZWN0KCkgb3ZlcgogIHBvbGwoKS4gQ29uZmlndXJlIHNjcmlwdHMgc2hvdWxkIGxvb2sgZm9yIHRoZSBfUE9MTF9FTVVMX0hfIGRlZmluZSAoaW5zdGVhZAogIG9mIF9QT0xMX0hfIG9yIF9TWVNfUE9MTF9IXykgYW5kIGF2b2lkIGltcGxlbWVudGF0aW9ucyB3aGVyZSBwb2xsIGlzIG5vdAogIGltcGxlbWVudGVkIGluIHRoZSBrZXJuZWwuIgoKICBZZXMsIHdlIGNhbiBwcm9iYWJseSB1c2Ugc2VsZWN0KCkgb24gbW9zdCBwbGF0Zm9ybXMgYnV0IHRvZGF5IEkgcHJlZmVyZWQgdG8KICBsZWF2ZSB0aGUgY29kZSB1bmFsdGVyZWQuCgpEYW5pZWwgKDI0IEp1bmUgMjAwNCkKLSBUaGUgc3RhbmRhcmQgY3VybF92ZXJzaW9uKCkgc3RyaW5nIG5vdyBvbmx5IGluY2x1ZGVzIHZlcnNpb24gaW5mbyBhYm91dAogIGludm9sdmVkIGxpYnJhcmllcyBhbmQgbm90IGFib3V0IHBhcnRpY3VsYXIgZmVhdHVyZXMuIFRodXMgaXQgd2lsbCBubyBsb25nZXIKICBpbmNsdWRlIGluZm8gYWJvdXQgaXB2NiBub3IgR1NTLiBUaGF0IGluZm8gaXMgb2YgY291cnNlIHN0aWxsIGF2YWlsYWJsZSBpbgogIHRoZSBmZWF0dXJlIGJpdG1hc2sgY3VybF92ZXJzaW9uX2luZm8oKSBvZmZlcnMuCgotIFJlcGxhY2VkIGFsbCBvY2N1cmFuY2VzIG9mIHNwcmludGYoKSB3aXRoIHNucHJpbnRmKCkuIFRoaXMgaXMgbW9zdGx5IGJlY2F1c2UKICBpdCBpcyAiQSBHb29kIFRoaW5nIiByYXRoZXIgdGhhbiBhY3R1YWxseSBmaXhpbmcgYW55IGtub3duIHByb2JsZW0uIFRoaXMKICB3aWxsIGhlbHAgcHJldmVudGluZyBmdXR1cmUgcG9zc2libGUgbWlzdGFrZXMgdG8gY2F1c2UgYnVmZmVyIG92ZXJmbG93cy4KCi0gTWFqb3IgcmVvcmdhbml6YXRpb24gaW4gdGhlIGhvc3QgcmVzb2x2ZSBjb2RlIChhZ2FpbikuIFRoaXMgdGltZSwgSSd2ZQogIG1vZGlmaWVkIHRoZSBjb2RlIHRvIG5vdyBhbHdheXMgdXNlIGEgbGlua2VkIGxpc3Qgb2YgQ3VybF9hZGRyaW5mbyBzdHJ1Y3RzCiAgdG8gcmV0dXJuIHJlc29sdmVkIGluZm8gaW4sIG5vIG1hdHRlciB3aGF0IHJlc29sdmVyIG1ldGhvZCBvciBzdXBwb3J0IHRoYXQKICBpcyBhdmFpbGFibGUgb24gdGhlIHBsYXRmb3JtLiBJdCBtYWtlcyBpdCBhIGxvdCBlYXNpZXIgdG8gd3JpdGUgY29kZSB0aGF0CiAgdXNlcyBvciBkZXBlbmRzIG9uIHJlc29sdmVkIGRhdGEuCgogIEludGVybmFsbHksIHRoaXMgbWVhbnMgYW1vbmdzdCBvdGhlciB0aGluZ3MgdGhhdCB3ZSBjYW4gc3RvcCBkb2luZyB0aGUgd2VpcmQKICAiaW5jcmVhc2UgYnVmZmVyIHNpemUgdW50aWwgaXQgd29ya3MiIHRyaWNrIHdoZW4gcmVzb2x2aW5nIGhvc3RzIG9uCiAgaXB2NC1vbmx5IHdpdGggZ2V0aG9zdGJ5bmFtZV9yKCksIHdlIHN1cHBvcnQgc29ja3MgZXZlbiBvbiBsaWJjdXJscyBidWlsdAogIHdpdGggaXB2NiBlbmFibGVkIChidXQgb25seSB0byBzb2NrcyBzZXJ2ZXJzIHRoYXQgcmVzb2x2ZSB0byBhbiBpcHY0CiAgYWRkcmVzcykgYW5kIHdlIG5vIGxvbmdlciBkZWVwLWNvcHkgb3IgcmVsb2NhdGUgaG9zdGVudCBzdHJ1Y3RzICh3ZSBjcmVhdGUKICBDdXJsX2FkZHJpbmZvIGNoYWlucyBpbnN0ZWFkKS4KCiAgVGhlIG5ldyAiaG9zdGVudCB0byBDdXJsX2FkZHJpbmZvIiBjb252ZXJ0ZXIgZnVuY3Rpb24gaXMgbmFtZWQgQ3VybF9oZTJhaSgpCiAgYW5kIGlzIHNsaWdodGx5IG5haXZlIGFuZCBzaW1wbGUsIHlldCBJIGJlbGlldmUgaXQgaXMgZnVuY3Rpb25hbCBlbm91Z2ggdG8KICB3b3JrIGZvciBsaWJjdXJsLgoKRGFuaWVsICgyMiBKdW5lIDIwMDQpCi0gRGF2aWQgQ29oZW4gcG9pbnRlZCBvdXQgdGhhdCBSRkMyMTA5IHNheXMgY2xpZW50cyBzaG91bGQgYWxsb3cgY29va2llcyB0bwogIGNvbnRhaW4gbGVhc3QgNDA5NiBieXRlcyB3aGlsZSBsaWJjdXJsIG9ubHkgYWxsb3dlZCAyMDQ3LiBJIHJhaXNlZCB0aGUgbGltaXQKICB0byA0OTk5IG5vdyBhbmQgbWFkZSB0aGUgdXNlZCBidWZmZXIgZ2V0IG1hbGxvYygpZWQgaW5zdGVhZCBvZiBzaW1wbHkKICBhbGxvY2F0ZWQgb24gc3RhY2sgYXMgYmVmb3JlLiBFeHRlbmRlZCB0ZXN0IGNhc2UgNDYgdG8gaW5jbHVkZSBhIGNvb2tpZSB3aXRoCiAgdmVyeSBodWdlIGNvbnRlbnQgdG8gdmVyaWZ5IHRoZSBmaXguCgotIEf8bnRlciBLbmF1ZiBmaXhlZCBnZXRkYXRlLnkgdG8gcmVtb3ZlIGEgZmV3IHdhcm5pbmdzLiBJIHJlbW92ZWQgdGhlCiAgaWZkZWYnZWQgdGVzdCB3ZSBuZXZlciBldmVyIHVzZSBhbnl3YXkuCgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBjZXJ0aWZpY2F0ZSB3aWxkY2FyZCBjaGVja3MgdG8gc3VwcG9ydCBhICcqJy1sZXR0ZXIKICBhbnl3aGVyZSBpbiB0aGUgd2lsZGNhcmQgc3RyaW5nLCBzdXBwb3J0IG11bHRpcGxlICcqJy1sZXR0ZXJzIGluIHRoZQogIHdpbGRjYXJkIGFuZCB0byBhbGxvdyB0aGUgJyonLWxldHRlciB0byBtYXRjaCBhIHN0cmluZyB0aGF0IGluY2x1ZGVzIGEgZG90LgoKRGFuaWVsICgyMSBKdW5lIDIwMDQpCi0gdGVzdGN1cmwuc2ggaXMgbm93IHJlbW92ZWQgY29tcGxldGVseSwgdGVzdHMvdGVzdGN1cmwucGwgaXMgdGhlIHNjcmlwdCB0bwogIHVzZSB3aGVuIGF1dG9idWlsZGluZyBjdXJsIQoKLSBLamV0aWwgSmFjb2JzZW4gYnJvdWdodCBteSBhdHRlbnRpb24gdG8gdGhlIGZhY3QgdGhhdCB5b3UgY2Fubm90IHByb3Blcmx5CiAgYWJvcnQgYW4gdXBsb2FkIHdpdGggdGhlIHJlYWRmdW5jdGlvbiBjYWxsYmFjaywgc2luY2UgcmV0dXJuaW5nIDAgb3IgLTEgb25seQogIHN0b3BzIHRoZSB1cGxvYWQgYW5kIGxpYmN1cmwgd2lsbCBjb250aW51ZSB3YWl0aW5nIGZvciBkb3dubG9hZGVkIGRhdGEgYW5kCiAgdGhlIHNlcnZlciBvZnRlbiB3YWl0cyBmb3IgdGhlIHJlc3Qgb2YgdGhlIHVwbG9hZCBkYXRhIHRvIGFycml2ZS4KCiAgVGh1cywgSSd2ZSBub3cgYWRkZWQgdGhlIGFiaWxpdHkgZm9yIHJlYWQgY2FsbGJhY2tzIHRvIHJldHVybgogIENVUkxfUkVBREZVTkNfQUJPUlQgdG8gYWJvcnQgYW4gdXBsb2FkIGZyb20gYSByZWFkIGNhbGxiYWNrLiBUaGlzIHdpbGwgc3RvcAogIHRoZSB0cmFuc2ZlciBpbW1lZGlhdGVseSB3aXRoIGEgQ1VSTEVfQUJPUlRFRF9CWV9DQUxMQkFDSyByZXR1cm4gY29kZS4KCiAgVGVzdCBjYXNlIDUxMyB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgaXQgd29ya3MuIEkgaGFkIHRvIGltcHJvdmUgdGhlIHRlc3QKICBIVFRQIHNlcnZlciB0b28gdG8gZHVtcCB0aGUgcmVxdWVzdCB0byBhIGZpbGUgZXZlbiB3aGVuIHRoZSBjbGllbnQKICBkaXNjb25uZWN0cyBwcmVtYXR1cmVseS4KCkRhbmllbCAoMTkgSnVuZSAyMDA0KQotIEx1Y2EgQWx0ZWFzIHByb3ZpZGVkIGEgdGVzdCBjYXNlIHdpdGggYSBmYWlsaW5nIGN1cmwgb3BlcmF0aW9uOiB3aGVuIHdlIFBPU1QKICB0byBhIHNpdGUgd2l0aCAtLWRpZ2VzdCAob3Igc2ltaWxhcikgc2V0LCBhbmQgdGhlIHNlcnZlciByZXNwb25kZWQgd2l0aCBhIDMwMgogIExvY2F0aW9uOiB0byB0aGUgImF1dGhwcm9iZSIgcmVxdWVzdCwgaXQgd2FzIG5vdCB0cmVhdGVkIGNvcnJlY3RseS4gV2Ugc3RpbGwKICB3aWxsIGJlaGF2ZSBiYWRseSBpZiBGT0xMT1dMT0NBVElPTiBpcyBlbmFibGVkIGZvciB0aGlzIGNhc2UsIGJ1dCBJJ20gbm90CiAgaW4gdGhlIG1vb2QgdG8gZGl2ZSBpbnRvIHRoaXMgcmlnaHQgbm93IGFuZCB3aWxsIGxlYXZlIGl0IGFzLWlzIGZvciBub3cuCiAgVmVyaWZpZWQgbXkgZml4IHdpdGggdGVzdCBjYXNlIDE3Ny4KCkRhbmllbCAoMTggSnVuZSAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgcGF0Y2ggdGhhdCBwcm92aWRlcyBtb3JlIGRldGFpbHMgZnJvbSB0aGUgU1NMIGxheWVycyAoaWYgeW91CiAgdXNlIGFuIE9wZW5TU0wgdmVyc2lvbiB0aGF0IHN1cHBvcnRzIGl0KS4gSXQgYWxzbyBpbnRyb2R1Y2VzIHR3byBuZXcgdHlwZXMKICBvZiBkYXRhIHRoYXQgY2FuIGJlIHNlbnQgdG8gdGhlIGRlYnVnIGNhbGxiYWNrOiBDVVJMSU5GT19TU0xfREFUQV9JTiBhbmQKICBDVVJMSU5GT19TU0xfREFUQV9PVVQuCgotIFdpdGggRGF2aWQgQnlyb24ncyB0ZXN0IHNlcnZlciBJIGNvdWxkIHJlcGVhdCBoaXMgcHJvYmxlbSBhbmQgbWFrZSBzdXJlIHRoYXQKICBQT1NUaW5nIG92ZXIgSFRUUFM6Ly8gd2l0aCBOVExNIHdvcmtzIGZpbmUgbm93LiBUaGVyZSB3YXMgYSBnZW5lcmFsIHByb2JsZW0KICB3aXRoIG11bHRpLXBhc3MgYXV0aGVudGljYXRpb24gd2l0aCBub24tR0VUIG9wZXJhdGlvbnMgd2l0aCBDT05ORUNULgoKRGFuaWVsICgxNiBKdW5lIDIwMDQpCi0gTW9kaWZpZWQgdG8ga2VlcCB0aGUgdXBsb2FkIGJ5dGUgY291bnRlciBpbiBhbiBjdXJsX29mZl90LCBub3QgYW4gaW50IGFzCiAgYmVmb3JlLiAzMmJpdHMgaXMgbm90IGVub3VnaC4gVGhpcyBpcyBtb3N0IGxpa2VseSB0aGUgYnVnIEplYW4tTG91aXMgTGVtYWlyZQogIHJlcG9ydGVkIHRoYXQgbWFrZXMgMkdCIEZUUCB1cGxvYWRzIHRvIHJlcG9ydCBlcnJvciAoInVuYWxpZ25lZCBmaWxlIHNpemVzIikKICB3aGVuIGNvbXBsZXRlZC4KCkRhbmllbCAoMTUgSnVuZSAyMDA0KQotIEx1Y2EgQWx0ZWFzIHJlcG9ydGVkIGEgcHJvYmxlbSB0aGF0IEkgZml4ZWQ6IGlmIHlvdSBkaWQgYSBQT1NUIHdpdGgKICBDVVJMQVVUSF9ESUdFU1Qgc2V0IGJ1dCB0aGUgc2VydmVyIGRpZG4ndCByZXF1aXJlIGFueSBhdXRoZW50aWNhdGlvbiwKICBsaWJjdXJsIHdvdWxkIHJlcGVhdGVkbHkgc2VuZCBIRUFEIGxvdHMgb2YgdGltZXMgdW50aWwgaXQgZ2l2ZXMgdXAuIFRoaXMgd2FzCiAgYWN0dWFsbHkgdGhlIGNhc2UgZm9yIGFsbCBtdWx0aS1wYXNzIGF1dGhlbnRpY2F0aW9ucy4gQWRkZWQgdGVzdCBjYXNlIDE3NCwKICAxNzUgYW5kIDE3NiB0byB2ZXJpZnkgdGhpcy4KCkRhbmllbCAoMTQgSnVuZSAyMDA0KQotIE11bHRpcGFydCBmb3JtcG9zdHMgdXBsb2FkaW5nIGZpbGVzIG5vIGxvbmdlciBpbnNlcnRzIHRoZSBmaWxlcyB0aGVtc2VsdmVzCiAgaW50byB0aGUgaHVnZSBwcmVidWlsdCBjaHVuay4gVGhpcyBlbmFibGVzIGxpYmN1cmwgdG8gZm9ybXBvc3QgZmlsZXMgdGhhdCBpcwogIGxhcmdlciB0aGFuIHRoZSBhbW91bnQgb2Ygc3lzdGVtIG1lbW9yeS4gV2hlbiB0aGUgZmlsZSBnaXZlbiBpcyBwYXNzZWQgb24KICBzdGRpbiwgbGliY3VybCBzdGlsbCB1c2VzIHRoZSBvbGQgbWV0aG9kIG9mIHJlYWRpbmcgdGhlIGZ1bGwgZmlsbCBiZWZvcmUgdGhlCiAgdXBsb2FkIHRha2VzIHBsYWNlLiBUaGlzIGFwcHJvYWNoIHdhcyBzZWxlY3RlZCBpbiBvcmRlciB0byBub3QgYWx0ZXIgdGhlCiAgYmVoYXZpb3IgZm9yIGV4aXN0aW5nIGFwcGxpY2F0aW9ucywgYXMgd2hlbiB1c2luZyBzdGRpbiBsaWJjdXJsIGNhbid0IGtub3cKICB0aGUgc2l6ZSBvZiB0aGUgdXBsb2FkIGFuZCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nIGNhbiBvbmx5IGJlIHVzZWQgb24KICBIVFRQIDEuMSBzZXJ2ZXJzLgoKRGFuaWVsICgxMyBKdW5lIDIwMDQpCi0gR2lzbGUgZm91bmQgb3V0IHRoYXQgd2UgZGlkIHdpbGRjYXJkIGNlcnQgbmFtZSBjaGVja3Mgd3JvbmcsIHNvIHRoYXQgcGFydHMKICBvZiB0aGUgY2hlY2sgd3JvbmdseSB3YXMgY2FzZSBzZW5zaXRpdmUuCgpEYW5pZWwgKDExIEp1bmUgMjAwNCkKLSBUaW0gU25lZGRvbiBicm91Z2h0IGEgbWlub3IgVk1TIGZpeCB0byBtYWtlIGN1cmwgYnVpbGQgcHJvcGVybHkgb24gaGlzIFZNUwogIG1hY2hpbmUuIEhlIGFsc28gaGFkIHNvbWUgaW50ZXJlc3RpbmcgbGliY3VybCBwYXRjaGVzLi4uIHRoZXkgbWlnaHQgYmUgYWJsZQogIHRvIGRvIGluIGEgc2xpZ2h0bHkgbmljZXIgd2F5LiBEaXNjdXNzaW9ucyBhcmUgaW4gcHJvZ3Jlc3MuCgpEYW5pZWwgKDEwIEp1bmUgMjAwNCkKLSBHaXNsZSBWYW5lbSBicm91Z2h0IGNvZGUgY2xlYW51cHNtIGJldHRlciB2ZXJib3NlIG91dHB1dCBhbmQgYmV0dGVyIGNvbm5lY3QKICB0aW1lb3V0IGhhbmRsaW5nIHdoZW4gYXR0ZW1wdGluZyB0byBjb25uZWN0IHRvIGEgaG9zdCB0aGF0IHJlc29sdmVzIHRvCiAgbXVsdGlwbGUgSVAgYWRkcmVzc2VzLgoKLSBTdGV2ZW4gQmF6eWwgYW5kIFNlc2h1YmFidSBQYXNhbSBwb2ludGVkIG91dCBhIGJ1ZyBvbiB3aW4zMiB3aGVuIGZyZWVpbmcgdGhlCiAgcGF0aCBhZnRlciBhIGZpbGU6Ly8gdHJhbnNmZXIuCgpEYW5pZWwgKDkgSnVuZSAyMDA0KQotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IG1hZGUgJ2NvbmZpZ3VyZSAtLWRpc2FibGUtaHR0cCcgd29yayB0byBidWlsZCBsaWJjdXJsCiAgd2l0aG91dCBIVFRQIHN1cHBvcnQuIEkgYWRkZWQgYSBuZXcgcmV0dXJuIGNvZGUgZm9yIGN1cmxfZm9ybWFkZCgpIGluIGNhc2UKICBsaWJjdXJsIGlzIGJ1aWx0IHdpdGggSFRUUCBkaXNhYmxlOiBDVVJMX0ZPUk1BRERfRElTQUJMRUQuCgotIEFsZXhhbmRlciBLcmFzbm9zdGF2c2t5IHBvaW50ZWQgb3V0IGEgbWlzc2luZyBmaWxlIGluIHRoZSBnZW5lcmF0ZWQKICBjdXJsbGliLmRzcCBmaWxlLCBhbmQgbm93IHBlb3BsZSBidWlsZGluZyB3aXRoIHRoaXMgc2hvdWxkIGdldCBhIGxpYmN1cmwubGliCiAgZmlsZSBnZW5lcmF0ZWQgYXMgaXQgdXNlZCB0byBkbyBiZWZvcmUgd2UgZ2VuZXJhdGVkIHRoaXMgZmlsZS4KCkRhbmllbCAoOCBKdW5lIDIwMDQpCi0gTWFydHkgS3VocnQgZml4ZWQgYSBtaW5vciBidWlsZCBwcm9ibGVtIGZvciBWTVMuCgpEYW5pZWwgKDcgSnVuZSAyMDA0KQotIFJldmVydGVkIHRoZSBjb25maWd1cmUgY2hlY2sgZnJvbSB0aGUgNHRoIHNpbmNlIGl0IG9idmlvdXNseSBkaWRuJ3Qgd29yay4KICBSZW1hZGUgaXQgaW4gYSBkaWZmZXJlbnQgbWFubmVyIHRoYXQgaG9wZWZ1bGx5IHdvcmtzIGJldHRlci4KCkRhbmllbCAoNCBKdW5lIDIwMDQpCi0gR/xudGVyIEtuYXVmIGJyb3VnaHQgcGF0Y2hlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiBOZXRXYXJlIGFnYWluLgoKLSBNYWRlIHRoZSBjb25maWd1cmUgY2hlY2tzIGZvciBzdHJlcnJvcl9yKCkgbm90IGV4aXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aGVuIGJ1aWx0IGZvciBjcm9zcy1jb21waWxpbmcuCgpEYW5pZWwgKDMgSnVuZSAyMDA0KQotIENocmlzIEdhdWtyb2dlciBwb2ludGVkIG91dCB0aGF0ICdtYWtlIHRlc3QnIGF0dGVtcHRzIHRvIHJ1biB0aGUgdGVzdHMgZXZlbgogIGlmIGN1cmwgaXMgYnVpbHQgY3Jvc3MtY29tcGlsZWQuIEkndmUgbm93IG1hZGUgaXQgb3V0cHV0IGEgc2hvcnQgbWVzc2FnZQogIGluc3RlYWQsIHNheWluZyBpdCBpc24ndCBwb3NzaWJsZSB0byBkby4KCi0gQWxleGFuZGVyIEtyYXNub3N0YXZza3kgYnJvdWdodCBGVFAgM3JkIHBhcnR5IHRyYW5zZmVyIHN1cHBvcnQgdG8gbGliY3VybC4KICBZb3UgY2FuIG5vdyB1c2UgbGliY3VybCB0byB0cmFuc2ZlciBmaWxlcyBiZXR3ZWVuIHR3byByZW1vdGUgaG9zdHMgdXNpbmcKICBGVFAuIFRoZXJlIGFyZSBhIGJ1bmNoIG9mIG5ldyBvcHRpb25zIHRvIGNvbnRyb2wgdGhpcyB3aXRoOgogICBDVVJMT1BUX1NPVVJDRV9IT1NUCiAgIENVUkxPUFRfU09VUkNFX1VTRVJQV0QKICAgQ1VSTE9QVF9TT1VSQ0VfUEFUSAogICBDVVJMT1BUX1NPVVJDRV9QT1JUCiAgIENVUkxPUFRfUEFTVl9IT1NUCiAgIENVUkxPUFRfU09VUkNFX1BSRVFVT1RFCiAgIENVUkxPUFRfU09VUkNFX1BPU1RRVU9URQoKICAoVGhleSBzdGlsbCByZW1haW4gdG8gYmUgZG9jdW1lbnRlZCBwcm9wZXJseSBpbiB0aGUgY3VybF9lYXN5X3NldG9wdCBtYW4KICBwYWdlLikKCiAgV2hlbiB1c2luZyB0aGlzLCB0aGUgb3JkaW5hcnkgQ1VSTE9QVF9VUkwgc3BlY2lmaWVzIHRoZSB0YXJnZXQgVVJMLCBhbmQgeW91CiAgc3BlY2lmeSB0aGUgc291cmNlIGRhdGEgd2l0aCB0aGVzZSBhZGRpdGlvbmFsIG9wdGlvbnMuIGZ0cDNyZHBhcnR5LmMgaXMgYQogIG5ldyBleGFtcGxlIHNvdXJjZSBjb2RlIHNob3dpbmcgaG93IHRvIHVzZSB0aGlzLgoKLSBWaW5jZW50IEJyb25uZXIgZml4ZWQgdGhlIEhUVFAgRGlnZXN0IGNvZGUgdG8gdXNlIHRoZSBwcm94eSB1c2VyIG5hbWUgYW5kCiAgcGFzc3dvcmQgd2hlbiBkb2luZyBwcm94eSBhdXRoZW50aWNhdGlvbiwgaXQgcHJldmlvdXNseSBhbHdheXMgdXNlZCB0aGUgaG9zdAogIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQhCgpEYW5pZWwgKDIgSnVuZSAyMDA0KQotIENVUkxPUFRfVVBMT0FEIGFuZCBDVVJMT1BUX1BVVCBub3cgZG8gdGhlIGV4YWN0IHNhbWUgdGhpbmcgaW50ZXJuYWxseSwgd2hpY2gKICBmaXhlcyBzb21lIG9sZCBjb25mdXNpb25zIG9uIHdoZW4gd2hpY2ggb2YgdGhlc2Ugc2hvdWxkIGJlIHVzZWQgYW5kIHdoYXQgdGhlCiAgZGlmZmVyZW5jZXMgYXJlLgoKLSBBcHBsaWVkIEdpc2xlJ3MgZml4ZXMgdG8gbWFrZSBjdXJsIGJ1aWxkIGZpbmUgd2l0aCBsY2Mtd2luMzIKClZlcnNpb24gNy4xMi4wICgyIEp1bmUgMjAwNCkKCkRhbmllbCAoMSBKdW5lIDIwMDQpCi0gSSBjbGFyaWZpZWQgdGhlIC0tY3JlYXRlLWRpcnMgb3B0aW9uIHNvbWV3aGF0IGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKLSBSZW5hdWQgRHVoYXV0IGNvcnJlY3RlZCB0aGUgY3VybF91bmVzY2FwZSBtYW4gcGFnZS4KCi0gRGF2aWQgQnlyb24gbW9kaWZpZWQgb25lIG9mIE1hc3NpbWlsaWFubyBaaWNjYXJkaSdzIHJlY2VudCBNU1ZDIG1ha2VmaWxlCiAgY2hhbmdlcyB0byBub3cgYWdhaW4gdXNlIHRoZSBtbSBsaWIgYnkgZGVmYXVsdC4KCkRhbmllbCAoMjYgTWF5IDIwMDQpCi0gTW9odW4gQmlzd2FzIGFkZGVkIHJlbGVhc2UtemxpYiBhbmQgZGVidWctemxpYiB0YXJnZXRzIHRvIHRoZSBNU1ZDIGxpYmN1cmwKICBNYWtlZmlsZQoKLSBEYXZpZCBCeXJvbiByZXBvcnRlZCBhIHByb2JsZW0gd2l0aCBwcm94eSBhdXRoZW50aWNhdGlvbiB3aGVuIGRvaW5nIENPTk5FQ1QsCiAgbGlrZSB3aGVuIGFjY2Vzc2luZyBIVFRQUyBzaXRlcyB3aWh0IGEgcHJveHkuIFRoaXMgcHJvYmFibHkgYnJva2Ugd2hlbiBJCiAgcmV3cm90ZSB0aGUgYXV0aCBzdHVmZiByZWNlbnRseS4KCi0gSSBhZGRlZCBmaWxldXBsb2FkLmMgaW4gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeSwgc2hvd2luZyBob3cgYW4gdXBsb2FkIHRvIGEKICBmaWxlOi8vIFVSTCBpcyBtYWRlLgoKRGFuaWVsICgyNSBNYXkgMjAwNCkKLSBNYXNzaW1pbGlhbm8gWmljY2FyZGkgdXBkYXRlZCB0aGUgTVNWQyBtYWtlZmlsZXMuCgpEYW5pZWwgKDI0IE1heSAyMDA0KQotIGxpYmN1cmwgbm93IHN1cHBvcnRzICJ1cGxvYWRpbmciIHRvIGZpbGU6Ly8gVVJMcy4gVGVzdCAyMDQgYW5kIDIwNSB3ZXJlCiAgYWRkZWQgdG8gdmVyaWZ5LgoKLSBTaW1vbiBKb3NlZnNzb24gYWRkZWQgYSBpZG5fZnJlZSgpIGZ1bmN0aW9uIGluIGxpYmlkbiAwLjQuNSBhcyBhIHJlYWN0aW9uIHRvCiAgR2lzbGUncyBwcmV2aW91cyBtYWlsLiBXZSBub3cgdXNlIHRoaXMgZnVuY3Rpb24sIGFuZCB0aHVzIHdlIHJlcXVpcmUgbGliaWRuCiAgMC40LjUgb3IgbGF0ZXIuIE5vIGVhcmxpZXIgdmVyc2lvbiB3aWxsIGRvLgoKLSBSb2JlcnQgRC4gWW91bmcgcmVwb3J0ZWQgdGhhdCBDVVJMT1BUX0NPT0tJRUZJTEUgYW5kIENVUkxPUFRfQ09PS0lFIGNvdWxkCiAgbm90IGJlIHVzZWQgYm90aCBpbiBvbmUgcmVxdWVzdC4gRml4ZWQgaXQgYW5kIGFkZGVkIHRlc3QgY2FzZSAxNzIgdG8gdmVyaWZ5LgoKRGFuaWVsICgyMSBNYXkgMjAwNCkKLSBXaGlsZSB0YWxraW5nIHRvIGhvc3QgYS5iLmMsIGxpYmN1cmwgZGlkIHdyb25nbHkgbm90IGFjY2VwdCBjb29raWVzIHRoYXQKICB3ZXJlIHNldCB0byB0aGUgZG9tYWluIC5hLmIuYyAodGhhdCBpcyB3aXRoIGEgZG90IHByZWZpeCkuIFRoaXMgaXMgbm93IGZpeGVkCiAgYW5kIHRlc3QgY2FzZSAxNzEgdmVyaWZpZXMgaXQuCgpEYW5pZWwgKDIwIE1heSAyMDA0KQotIEplc3NlIE5vbGxlciByZXBvcnRlZCB0aGF0IHRoZSB1cGxvYWQgc3BlZWQgaW5mbyByZXBvcnRlZCBieSBsaWJjdXJsIHdhcwogIHdyb25nLiBUaGUgc2FtZSB3YXMgdHJ1ZSBmb3IgdGhlIGRvd25sb2FkIHNwZWVkLiBGaXhlZCBub3cuCgpEYW5pZWwgKDE5IE1heSAyMDA0KQotIERhdmlkIEJ5cm9uIGFkZGVkIHRlc3QgY2FzZSAxNzAgLSB0aGlzIHVzZWQgdG8gY3Jhc2ggdGhlIHByZXZpb3VzIHZlcnNpb24gb2YKICBjdXJsLgoKRGFuaWVsICgxNyBNYXkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIncyBwYXRjaCB0aGF0IGFkZHJlc3NlcyB0d28gZmxhd3MgaW4gdGhlIHBlZXIgY2VydGlmaWNhdGUKICBuYW1lIHZlcmlmaWNhdGlvbjoKICBvIHdoZW4gbXVsdGlwbGUgY29tbW9uIG5hbWVzIGFyZSB1c2VkIChhcyBpbiB0aGUgY3VybCB0ZXN0cyksIHRoZSBsYXN0IG5hbWUKICAgIG5lZWRzIHRvIGJlIHNlbGVjdGVkLgogIG8gYWxsb3cgY29tcGFyaW5nIHdpdGggZW5jb2RlZCB2YWx1ZXMsIGF0IGxlYXN0IHdpdGggQk1QIGFuZCBJU08gbGF0aW4xCiAgICBlbmNvZGVkIFQ2MXN0cmluZ3MuCgotIEFsbCAxOTEgdGVzdCBjYXNlcyBydW4gdGhyb3VnaCB0aGUgdG9ydHVyZSB0ZXN0IE9LISAnbWFrZSB0ZXN0LXRvcnR1cmUnIGlzCiAgbm93IGF2YWlsYWJsZSBpbiB0aGUgcm9vdCBtYWtlZmlsZSAob24gY29uZmlndXJlLWJhc2VkIGVudmlyb25tZW50cykuCgpEYW5pZWwgKDE0IE1heSAyMDA0KQotIFdpdGggYSBzbGlnaHRseSBtb2RpZmllZCBmdHBzZXJ2ZXIucGwgSSd2ZSBub3cgcnVuIGFsbW9zdCBhbGwgdGVzdHMgdGhyb3VnaAogIHdpdGggcnVudGVzdHMucGwgLXQuIFRoaXMgaXMgZ29vZG5lc3MhCgotIFNpbmNlIEkgaGF2ZSBiZWVuIHVuYWJsZSB0byBjb250YWN0IHRoZSBDVlMgYWRtaW5zIGZvciBzZXZlcmFsIG1vbnRocywgSSd2ZQogIGRlY2lkZWQgdGhhdCB0aGUgY3VycmVudCBDVlMgaG9zdGluZyB3YXMgbm90IGdvb2QgZW5vdWdoLiBJJ3ZlIG5vdyBtb3ZlZCB0aGUKICBDVlMgcmVwbyBvbmNlIGFnYWluLCBzZWUgUkVBRE1FIGZvciB1cGRhdGVkIGN2cyBjaGVja291dCBpbnN0cnVjdGlvbnMuCgpEYW5pZWwgKDEzIE1heSAyMDA0KQotIHJ1bnRlc3RzLnBsIC10IG5vdyBydW5zIGZpbmUgYWxsIHRoZSB3YXkgdG8gdGVzdCAxMDAuIEkgYmVsaWV2ZSB0ZXN0IGNhc2UKICAxMDAgZmFpbHMgYmVjYXVzZSBvZiBhbiBGVFAgc2VydmVyIHByb2JsZW0uCgpEYW5pZWwgKDEyIE1heSAyMDA0KQotIEdlbmVyYWwgY2xlYW51cHMgYWxsIG92ZXIgdG8gbWFrZSBsaWJjdXJsIHN1cnZpdmUgYW5kIGRvIHdlbGwgd2hlbiBhIG1lbW9yeQogIGZ1bmN0aW9uIHJldHVybnMgTlVMTC4gcnVudGVzdHMucGwgLXQgbm93IHdvcmtzIGZpbmUgZm9yIHRoZSBmaXJzdCAyNiB0ZXN0CiAgY2FzZXMuCgpEYW5pZWwgKDExIE1heSAyMDA0KQotIFNlc2h1YmFidSBQYXNhbSBwcm92aWRlZCBhIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBjdXJsX2dsb2JhbF9pbml0X21lbSgpIC0KICBsaWtlIG5vcm1hbCBjdXJsX2dsb2JhbF9pbml0KCkgYnV0IGFsbG93cyB0aGUgYXBwIHRvIHJlcGxhY2UgYWxsIG1lbW9yeQogIGZ1bmN0aW9ucyB3aXRoIGl0cyBvd24gc2V0LiBJIG1vZGlmaWVkIGl0IHNsaWdodGx5LgoKLSBCYXNlZCBvbiBMdWNhIEFsdGVhcycgY29tbWVudHMsIEkgbW9kaWZpZWQgdGhlIGN1cmxsaWIuZHNwIGdlbmVyYXRpb24gY29kZS4KCkRhbmllbCAoMTAgTWF5IDIwMDQpCi0gR2lzbGUgbWFpbGVkIFNpbW9uIEpvc2Vmc3NvbiAob2YgbGliaWRuIGZhbWUpIGFib3V0IHRoZSBiZW5lZml0cyBvZiBhCiAgc2VwYXJhdGUgZnJlZSgpLWZ1bmN0aW9uIGJ5IHRoYXQgbGliIHRvIG1ha2Ugc3VyZSB0aGUgbWVtb3J5IGlzIGZyZWVkIGJ5IHRoZQogIHNhbWUgbWVtb3J5IHN1YnN5c3RlbSB0aGF0IGFsbG9jYXRlZCBpdC4gSGUgcmVzcG9uZGVkIHBvc2l0aXZlbHkgYW5kIHRoaXMKICB3aWxsIGxpa2VseSBjYXVzZSB1cyB0byByZXF1aXJlIGEgbmV3ZXIgdmVyc2lvbiBvZiBsaWJpZG4gYXMgc29vbiBhcyBTaW1vbgogIHJlbGVhc2VzIG9uZSB3aXRoIHN1Y2ggYSBsaWJpZG5fZnJlZSgpIGZ1bmN0aW9uLgoKLSBKYW1lcyBCdXJzYSBtYWRlIHJ1bnRlc3RzLnBsJ3MgLXQgb3B0aW9uIHdvcmsgZm9yIGFueSBnaXZlbiB0ZXN0IGNhc2UsIGFuZCBJCiAgZWRpdGVkIHRvIGFsbG93IC1nIHRvby4gTm90IGV2ZW4gdGVzdCBjYXNlIDEgd29ya2VkLi4uCgotIEx1Y2EgQWx0ZWEgbWFkZSB0aGUgbmM9IGZpZWxkIG5vdCB1c2UgcXVvdGVzIGluIG91dGdvaW5nIEhUVFAgRGlnZXN0IGhlYWRlcnMuCgotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBwcm9ibGVtIGluIHRoZSB0ZXN0IHNjcmlwdCB0aGF0IG1hZGUgaXQgZmFpbCB0bwogIHJlY29nbml6ZSBvdXIgb3duIHJ1bm5pbmcgSFRUUCBzZXJ2ZXIuCgpEYW5pZWwgKDcgTWF5IDIwMDQpCi0gSmFtZXMgQnVyc2EgZml4ZWQgdGhlIG1lbWFuYWx5emUucGwgc2NyaXB0IHRvIGNvbmRlciBtYWxsb2MoMCkgYXJlYXMgT0sgdG8KICBmcmVlKCkgYW5kIGhlIG1hZGUgdHdvIGZhaWxlZC1yZXNvbHZlIGVycm9yIG1lc3NhZ2VzIHVzZSB0aGUgbmV3IGRpc3BsYXktCiAgbmFtZSBpbnN0ZWFkIG9mIHRoZSBpbnRlcm5hbGx5LXVzZWQgbmFtZS4KCi0gR2lzbGUgVmFuZW0gdHJpZWQgY3VybCB3aXRoCiAgd3d3LmV0ZG9tZW5lbmF2bmthbm1ha3NpbWFsdGlubmVob2xkZXNla3N0aXRyZWJva3N0YXZlcnNsaWtzb21kZXR0ZS5jb20KICB3aGljaCBjYXVzZWQgcHJvYmxlbXMsIGFuZCBJIGZpeGVkIHRoZSBzaW5nbGUgemVybyBieXRlIGJ1ZmZlciBvdmVyd3JpdGUKICB0aGF0IG9jY3VycmVkIChkdWUgdG8gYSBzdHVwaWQgcHJvdG9jb2wgYnVmZmVyIHNpemUgYW5kIHBhcnNlcikuCgotIE1hZGUgdGhlIGxpYi9jdXJsbGliLmRzcCBmaWxlIGdldCBnZW5lcmF0ZWQgYXV0b21hdGljbHkgd2hlbiBhIGRpc3RyaWJ1dGlvbgogIHBhY2thZ2UgaXMgbWFkZSwgd2l0aCB0aGUgbXN2Y3Byb2ouKiBmaWxlcyBhcyB0ZW1wbGF0ZXMgYW5kIGFsbAogIHdpbjMyLXNvdXJjZXMgYWRkZWQuIEkgdGhpbmsgdGhpcyBjYW4gYmUgbWFkZSB0byB3b3JrIGJldHRlciB0aGFuIHRoZSBhbHdheXMKICBsYWdnaW5nLWJlaGluZCBwcmV2aW91cyBhcHByb2FjaC4gSSdtIG5vdCBzdXJlIHRoaXMgYnVpbGRzIGEgd29ya2luZyBwcm9qZWN0CiAgZmlsZSByaWdodCBub3cgdGhvdWdoIQoKRGFuaWVsICg2IE1heSAyMDA0KQotIE1pY2hhZWwgQmVuZWRpY3QgYnJvdWdodCBhIGZpeCB0aGF0IGZpbGxzIGluIHRoZSBlcnJvcmJ1ZmZlciBwcm9wZXJseSB3aGVuCiAgYXJlcyBmYWlscyB0byByZXNvbHZlIGEgbmFtZSBmb3IgYSBjYXNlIG5vdCBwcmV2aW91c2x5IGRlYWx0IHdpdGggbGlrZSB0aGlzLgoKRGFuaWVsICg1IE1heSAyMDA0KQotIEpvZSBIYWxwaW4gZml4ZWQgdGhlIGFubm95aW5nIHR5cGVjYXN0IHdhcm5pbmcgaW4gbGliL2xkYXAuYwoKLSBHaXNsZSBWYW5lbSBmaXhlczoKICBvIG1lbWRlYnVnIHRvIG5vdCBhY2Nlc3MgTlVMTCBvbiBzZXZlcmFsIHBsYWNlcwogIG8gbGliY3VybC5kZWY7IGN1cmxfZm9ybXBhcnNlIGlzIGdvbmUuCiAgbyBwcm9ncmVzcy5jOyBmaXhlZCB0aGUgcGVyY2VudCB2YWx1ZXMgYmVpbmcgdHJ1bmNlZCB0byAwLgogIG8gaWYyaXAuKjsgY29uc3RpZmllZCB0aGUgJ2ludGVyZmFjZScgYXJndW1lbnQuCgotIFRvciBBcm50c2VuIHJlcG9ydGVkIHRoYXQgbWFueSBvZiBoaXMgYXV0b2J1aWxkcyBmcm96ZSBhbmQgSSBmb3VuZCBhbmQgZml4ZWQKICBhIHByb2JsZW0gaW50cm9kdWNlZCB3aXRoIHRoZSBIVFRQIGF1dGggb3ZlcmhhdWwgdGhhdCBjb3VsZCBsZWFkIHRvIGEKICBuZXZlci1lbmRpbmcgaW50ZXJuYWwgcmVxdWVzdC1sb29wIGR1ZSB0byB1bi1pbml0aWFsaXplZCB2YXJpYWJsZXMhCgotIFJlbW92ZWQgc2V2ZXJhbCBjb21waWxlciB3YXJuaW5ncyBvbiB2YXJpb3VzIGNvbXBpbGVycy9wbGF0Zm9ybXMuCgpEYW5pZWwgKDQgTWF5IDIwMDQpCi0gY3VybF9mb3JtcGFyc2UoKSBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGxpYnJhcnkuIEl0IGhhcyBiZWVuIG1hcmtlZCBhbmQKICBtZW50aW9uZWQgYXMgZGVwcmVjYXRlZCBmb3Igc2V2ZXJhbCB5ZWFycy4KCkRhbmllbCAoMyBNYXkgMjAwNCkKLSBSZXdyaXR0ZW4gSFRUUCBhdXRoZW50aWNhdGlvbiBjb2RlLiBUaGUgcHJldmlvdXMgY29kZSBjb3VsZCBub3QgcHJvcGVybHkKICBkZWFsIHdpdGggdGhlIGFkZGVkIHRlc3QgY2FzZXMgMTY3LCAxNjggYW5kIDE2OS4gSSd2ZSBub3cgcmV3cml0dGVuIHRoZSBjb2RlCiAgdG8gYmV0dGVyIHNlcGFyYXRlIGhvc3QgYW5kIHByb3h5IGF1dGhlbnRpY2F0aW9uIGFuZCBub3QgcmUtdXNlIHRoZSBzYW1lCiAgdmFyaWFibGVzIGFzIG11Y2ggYXMgYmVmb3JlIGFzIGl0IHByb3ZlZCBub24gd29ya2luZyBpbiB0aGUgbW9yZSBpbnZvbHZlZAogIGNhc2VzLiBBbGwgdGhlIGN1cnJlbnQgdGVzdHMgcnVuIE9LIG5vdywgYW5kIHNvIGRvIHRoZSBuZXcgb25lcy4gVGhlIGN1cmwKICB0b29sIGdvdCBhIG5ldyBvcHRpb24gbmFtZWQgLS1wcm94eS1kaWdlc3QgdG8gZW5hYmxlIEhUVFAgRGlnZXN0CiAgYXV0aGVudGljYXRpb24gd2l0aCB0aGUgcHJveHkuIEkgYWxzbyBtYWRlIHRoZSBsaWJyYXJ5IHN1cHBvcnQgaXQuCgotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIExEQVAgY29kZSB3b3JrIHdpdGggd2xkYXAzMi5kbGwgYXMgc3VwcGxpZWQgd2l0aAogIFdpbi05OC9NRS8yMDAwL1hQLCBzbyBubyBleHRyYSAuZGxscyBhcmUgcmVxdWlyZWQgd2hlbiBjdXJsL2xpYmN1cmwgaXMgdXNlZAogIG9uIHRoZXNlIFdpbmRvd3MgdmVyc2lvbnMuCgpEYW5pZWwgKDMwIEFwcmlsIDIwMDQpCi0gcnVudGVzdHMucGwgbm93IHNjYW5zIHRoZSB2YWxncmluZCBsb2cgZm9yIHZhbGdyaW5kLWRldGVjdGVkIG1lbW9yeSBsZWFrcwogIGFmdGVyIGVhY2ggdGVzdCBjYXNlIGlmIHZhbGdyaW5kIHdhcyBmb3VuZCBhbmQgdXNlZC4KCi0gSSBtb2RpZmllZCB0aGUgYXBwLWNvZGUgaW4gY3VybCB0byBpbmNsdWRlIHRoZSBuZXcgbGliL2N1cmx4LmggYW5kIG9ubHkKICBhY2Nlc3MgdGhvc2UgZnVuY3Rpb25zIHVzaW5nIHRoZSBjdXJseF8tcHJlZml4IGluIHByZXBhcmF0aW9uIGZvciB0aGUgZnV0dXJlCiAgcmVtb3ZhbCBvZiBzZXZlcmFsIGN1cmxfLWZ1bmN0aW9ucyBmcm9tIHRoZSBwdWJsaWMgbGliY3VybCBBUEkuCgotIEludHJvZHVjZWQgbGliL2N1cmx4LmggYXMgYSBzaW5nbGUgaGVhZGVyIHRvIHByb3ZpZGUgdGhlIGN1cmx4Xy1mdW5jdGlvbnMKICB0byBhcHBzLgoKLSBBZGRlZCBub3RpY2VzIGluIHRoZSBtYW4gcGFnZXMgZm9yIGN1cmxfZ2V0ZW52LCBjdXJsX21wcmludGYsIGN1cmxfc3RyZXF1YWwKICBhbmQgY3VybF9zdHJuZXF1YWwgdGhhdCB0aGV5IGFyZSBzdWJqZWN0IGZvciByZW1vdmFsIGluIGEgZnV0dXJlIHJlbGVhc2UuCiAgU1RPUCBVU0lORyBUSEVTRSBGVU5DVElPTlMuCgotIE1paGFpIElvbmVzY3Ugbm90aWNlZCBoZSBjb3VsZG4ndCBkbyBmb3JtcG9zdHMgd2l0aCB3aGl0ZXNwYWNlIGluIHRoZSBmaWxlCiAgbmFtZXMgYW5kIHllcywgSSBicm9rZSB0aGF0IG9uIEFwcmlsIDIzLiBTaWdoLiBJIGZpeGVkIGl0IG5vdyBhbmQgYWRkZWQKICB0ZXN0IGNhc2UgMTY2IHRvIHZlcmlmeSBpdC4KCi0gTHVjYSBBbHRlYSBwb2ludGVkIG91dCBhIG1pc3Rha2UgbGVmdCBmcm9tIHRoZSBEaWdlc3QgcGF0Y2ggb2YgeWVzdGVyZGF5LgoKRGFuaWVsICgyOSBBcHJpbCAyMDA0KQotIE1hZGUgSUROIGRvbWFpbnMgd29yayB3aGVuIHNlbmRpbmcgcmVxdXN0cyBvdmVyIEhUVFAgcHJveHkgYXMgd2VsbC4gQWRkZWQKICB0ZXN0IGNhc2UgMTY1IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gRml4ZWQgYSBidWcgaW4gdGhlIG5ldyBpbnRlcm5hbCBob3N0IG5hbWUgc2V0dXAgd2hlbiByZS11c2luZyBjb25uZWN0aW9ucy4KCi0gSmFtZXMgQnVyc2EgZm91bmQgb3V0IHRoYXQgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHdpdGggYXJlcy1idWlsdCBsaWJjdXJsCiAgY3JlYXRlZCBhIGJhZCBoYW5kbGUgdGhhdCB3b3VsZCBjcmFzaCBpbiB0aGUgZmlyc3QgbmFtZSByZXNvbHZlIGF0dGVtcHQuIFRoaXMKICBpcyBub3cgZml4ZWQgYW5kIHRlc3QgY2FzZSA1MTIgd2FzIGFkZGVkIHRvIHZlcmlmeSBpdC4KCi0gTHVjYSBBbHRlYSBwcm92aWRlZCBhIG1ham9yIEhUVFAgRGlnZXN0IGNvZGUgZml4IGFuZCBjbGVhbnVwLiBXZSBub3cgZm9sbG93CiAgdGhlIERpZ2VzdCBSRkMgYSBsb3QgYmV0dGVyLgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBTU0wgY29kZSB1c2UgRVJSX2Vycm9yX3N0cmluZ19uKCkgd2hlcmUgYXBwbGljYWJsZS4KCkRhbmllbCAoMjcgQXByaWwgMjAwNCkKLSBJIHJlbW9kZWxlZCBHaXNsZSdzIElETiBjb2RlIHNsaWdodGx5IGFuZCBub3cgd2UgY29udmVydCBib3RoIHRoZSBob3N0IG5hbWUKICBhbmQgcHJveHkgbmFtZSB0byB0aGUgQUNFIGVuY29kZWQgdmVyc2lvbiB0byB1c2UgaW50ZXJuYWxseSBmb3IgcmVzb2x2ZXMgYW5kCiAgY29va2llcyBldGMuIFRoZXkgYXJlIG5vdyB1c2luZyBvbmUgJ3N0cnVjdCBob3N0bmFtZScgZWFjaCB0aGF0IGtlZXAgYm90aAogIHRoZSBvcmlnaW5hbCBuYW1lIGFuZCB0aGUgcG9zc2libHkgZW5jb2RlZCBuYW1lLiBJRE4gcmVzb2x2ZXMgd29yayBmb3IgbWUKICBub3cgdXNpbmcgaXB2NiwgaXB2NCBhbmQgYXJlcyByZXNvbHZpbmcuIEV2ZW4gY29va2llcyBvbiBJRE4gc2l0ZXMgc2VlbSB0bwogIGRvIHJpZ2h0LiBJIGdvdCBzb21lIGZhaWx1cmVzIGF0IGZpcnN0IHdoZW4gQ0hBUlNFVCB3YXNuJ3Qgc2V0IGF0IGFsbCB3aGljaAogIGNvbmZ1c2VkIGxpYmlkbiBjb21wbGV0ZWx5IGFuZCBpdCBkZWNpZGVkIGJ5IGVuY29kaW5nIG9mIGNob2ljZSB3YXMKICAnQU5TSV9YMy40LTE5NjgnLi4uCgotIG1hZGUgJ2NvbmZpZ3VyZSAtLXdpdGhvdXQtbGliaWRuJyB3b3JrCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDQpCi0gRml4ZWQgdGhlIHNyYy9odWdlaGVscC5jIGZpbGUgdG8gaW5jbHVkZSAic2V0dXAuaCIgaW5zdGVhZCBvZiAiY29uZmlnLmgiIHRvCiAgbWFrZSB0aGUgcHJvYmxlbXMgd2l0aCBVU0VfTUFOVUFMIG9uIHdpbmRvd3MgZ28gYXdheS4KCi0gY29uZmlndXJlIC0td2l0aG91dC1zc2wgY291bGQgc3RpbGwgd3JvbmdseSBpbmNsdWRlIHNvbWUgT3BlblNTTCBpbmZvIGluIHRoZQogIE1ha2VmaWxlcyBpZiBwa2ctY29uZmlnIGhhZCBpbmZvIGFib3V0IE9wZW5TU0wuIEJ1ZyAjOTQxNzYyIHJlcG9ydGVkIGJ5CiAgTWFydGluLgoKLSBTaW5jZSB3ZSBjYW4gbm93IGJ1aWxkIGFuZCB1c2UgcXVpdGUgYSBsYXJnZSBzZXQgb2YgM3JkIHBhcnR5IGxpYnJhcmllcywgSQogIGRlY2lkZWQgSSB3b3VsZCBtYWtlIGNvbmZpZ3VyZSBwcm9kdWNlIGEgc3VtbWFyeSBhdCB0aGUgZW5kIHNob3dpbmcgd2hhdAogIGxpYnJhcmllcyBpdCB1c2VzIGFuZCBpZiBub3QsIHdoYXQgb3B0aW9uIHRvIHVzZSB0byBtYWtlIGl0IHVzZSB0aGF0LiBJIGFsc28KICBhZGRlZCBzb21lIG90aGVyIHJhbmRvbSBpbmZvIHRoYXQgaXMgbmljZSBpbiBhICJjb25maWd1cmUgc3VtbWFyeSIgb3V0cHV0LgoKLSBBcHBsaWVkIFRvbW15VGFtJ3MgcGF0Y2ggdGhhdCBub3cgbWFrZSBjdXJsIHdvcmsgd2l0aCB0ZWxuZXQgYW5kIHN0ZGluCiAgcHJvcGVybHkgb24gV2luZG93cy4KCi0gVGhlIGNoYW5nZXMgZm9yIHRvZGF5IGJlbG93IHdlcmUgbWFkZSBieSBtZSBhbmQgR2lzbGUgVmFuZW0uCgogIFRoZSBmaWxlIHByZXZpb3VzbHkga25vd24gYXMgaG9zdGlwLmMgaGFzIG5vdyB1bmRlcmdvbmUgYSBodWdlIGNsZWFudXAgYW5kCiAgc3BsaXQ6CgogIGhvc3RpcC5jIGV4cGxhaW5lZAogID09PT09PT09PT09PT09PT09PQoKICBUaGUgbWFpbiBDT01QSUxFLVRJTUUgREVGSU5FUyB0byBrZWVwIGluIG1pbmQgd2hlbiByZWFkaW5nIHRoZSBob3N0Ki5jCiAgc291cmNlIGZpbGUgYXJlIHRoZXNlOgoKICBDVVJMUkVTX0lQVjYgLSB0aGlzIGhvc3QgaGFzIGdldGFkZHJpbmZvKCkgYW5kIGZhbWlseSwgYW5kIHRodXMgd2UgdXNlCiAgdGhhdC4gVGhlIGhvc3QgbWF5IG5vdCBiZSBhYmxlIHRvIHJlc29sdmUgSVB2NiwgYnV0IHdlIGRvbid0IHJlYWxseSBoYXZlIHRvCiAgdGFrZSB0aGF0IGludG8gYWNjb3VudC4gSG9zdHMgdGhhdCBhcmVuJ3QgSVB2Ni1lbmFibGVkIGhhdmUgQ1VSTFJFU19JUFY0CiAgZGVmaW5lZC4KCiAgQ1VSTFJFU19BUkVTIC0gaXMgZGVmaW5lZCBpZiBsaWJjdXJsIGlzIGJ1aWx0IHRvIHVzZSBjLWFyZXMgZm9yIGFzeW5jaHJvbm91cwogIG5hbWUgcmVzb2x2ZXMuIEl0IGNhbm5vdCBoYXZlIEVOQUJMRV9JUFY2IGRlZmluZWQgYXQgdGhlIHNhbWUgdGltZSwgYXMKICBjLWFyZXMgaGFzIG5vIGlwdjYgc3VwcG9ydC4gVGhpcyBjYW4gYmUgV2luZG93cyBvciAqbml4LgoKICBDVVJMUkVTX1RIUkVBREVEIC0gaXMgZGVmaW5lZCBpZiBsaWJjdXJsIGlzIGJ1aWx0IHRvIHJ1biB1bmRlciAobmF0aXZlKQogIFdpbmRvd3MsIGFuZCB0aGVuIHRoZSBuYW1lIHJlc29sdmUgd2lsbCBiZSBkb25lIGluIGEgbmV3IHRocmVhZCwgYW5kIHRoZQogIHN1cHBvcnRlZCBhc3luY2ggQVBJIHdpbGwgYmUgdGhlIHNhbWUgYXMgZm9yIGFyZXMtYnVpbGRzLgoKICBJZiBhbnkgb2YgdGhlIHR3byBwcmV2aW91cyBhcmUgZGVmaW5lZCwgQ1VSTFJFU19BU1lOQ0ggaXMgZGVmaW5lZCB0b28uIElmCiAgbGliY3VybCBpcyBub3QgYnVpbHQgdG8gdXNlIGFuIGFzeW5jaHJvbm91cyByZXNvbHZlciwgQ1VSTFJFU19TWU5DSCBpcwogIGRlZmluZWQuCgogIFRoZSBob3N0Ki5jIHNvdXJjZXMgZmlsZXMgYXJlIHNwbGl0IHVwIGxpa2UgdGhpczoKCiAgaG9zdGlwLmMgICAtIG1ldGhvZC1pbmRlcGVuZGVudCByZXNvbHZlciBmdW5jdGlvbnMgYW5kIHV0aWxpdHkgZnVuY3Rpb25zCiAgaG9zdGFzeW4uYyAtIGZ1bmN0aW9ucyBmb3IgYXN5bmNocm9ub3VzIG5hbWUgcmVzb2x2ZXMKICBob3N0c3luLmMgIC0gZnVuY3Rpb25zIGZvciBzeW5jaHJvbm91cyBuYW1lIHJlc29sdmVzCiAgaG9zdGFyZXMuYyAtIGZ1bmN0aW9ucyBmb3IgYXJlcy11c2luZyBuYW1lIHJlc29sdmVzCiAgaG9zdHRocmUuYyAtIGZ1bmN0aW9ucyBmb3IgdGhyZWFkZWQgbmFtZSByZXNvbHZlcwogIGhvc3RpcDQuYyAgLSBpcHY0LXNwZWNpZmljIGZ1bmN0aW9ucwogIGhvc3RpcDYuYyAgLSBpcHY2LXNwZWNpZmljIGZ1bmN0aW9ucwoKICBUaGUgaG9zdGlwLmggaXMgdGhlIHNpbmdsZSB1bml0ZWQgaGVhZGVyIGZpbGUgZm9yIGFsbCB0aGlzLiBJdCBkZWZpbmVzIHRoZQogIENVUkxSRVNfKiBkZWZpbmVzIGJhc2VkIG9uIHRoZSBjb25maWcqLmggYW5kIHNldHVwLmggZGVmaW5lcy4KCi0gQWRkZWQgZnVuY3Rpb24gaGVhZGVyIGNvbW1lbnRzIHRvIG1hbnkgZnVuY3Rpb25zIGluIGFuIGF0dGVtcHQgdG8gYmV0dGVyCiAgZXhwbGFpbiB0aGUgcHVycG9zZSBvZiB0aGVtIGFsbC4KCi0gY29uZmlndXJlIC0td2l0aC1saWJpZG4gaXMgbm93IHN1cHBvcnRlZC4gSXQgbWFrZXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICBjaGVjayBmb3IgbGliaWRuIGxpYnMgYW5kIGluY2x1ZGUgZmlsZXMgaW4gdGhlIHByZWZpeCBwYXRoIGdpdmVuLiBJZiB5b3UKICBzYXkgLS13aXRoLWxpYmlkbj0vdXNyL2xvY2FsLCBpdCB3aWxsIGNoZWNrIGZvciB0aGUgbGliIGluIC91c3IvbG9jYWwvbGliCiAgYW5kIHRoZSBpbmNsdWRlcyBpbiAvdXNyL2xvY2FsL2luY2x1ZGUgZXRjLgoKLSBjdXJsX3ZlcnNpb25faW5mbygpIG5vdyByZXR1cm5zIGEgc3RydWN0IGFnZWQgQ1VSTFZFUlNJT05fVEhJUkQgaW5jbHVkaW5nCiAgbGliaWRuIHZlcnNpb24gaW5mby4gVGhlIHN0cmluZyBjdXJsX3ZlcnNpb24oKSByZXR1cm5zIGFsc28gaW5jbHVkZXMgbGliaWRuCiAgdmVyc2lvbiBpbmZvLCBpZiBhdmFpbGFibGUuCgpWZXJzaW9uIDcuMTEuMiAoMjYgQXByaWwgMjAwNCkKCkRhbmllbCAoMjUgQXByaWwgMjAwNCkKLSBFcndpbiBBdXRocmllZCBwb2ludGVkIG91dCB0aGF0IGNvbmZpZ3VyZSAtLWRpc2FibGUtbWFudWFsIGRpZG4ndCBkbyByaWdodAogIGlmIHlvdSBhbHJlYWR5IGhhZCBhIHNyYy9odWdlaGVscC5jIHNvdXJjZSBmaWxlIHByZXNlbnQgKHdoaWNoIG1vc3QgcGVvcGxlCiAgZG8gSSBndWVzcykuIEl0IG5vdyB1c2VzIHRoZSBVU0VfTUFOVUFMIGRlZmluZSBwcm9wZXJseS4KCkRhbmllbCAoMjMgQXByaWwgMjAwNCkKLSBHaXNsZSBWYW5lbSBmb3VuZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayB3aGVuIGRvaW5nIChmYWlsaW5nKSBXaW5kb3dzCiAgdGhyZWFkZWQgbmFtZSByZXNvbHZlcy4KCi0gSSBhbHNvIGFkZGVkIHRlc3QgY2FzZSAxNjMganVzdCB0byBtYWtlIHN1cmUgLUYgInZhcj08ZmlsZSIgd29ya3MgZmluZSBhbmQKICBjYW4gcGFzcyBvbiBjaGFyYWN0ZXJzIHN1Y2ggYXMgbmV3bGluZXMsIGNhcnJpYWdlLXJldHVybiBhbmQgdGFicy4KCi0gV2hlbiB3ZSBhZGRlZCB0ZXN0IGNhc2UgMTYyIHdpdGhvdXQgYWRkaW5nIHRoZSBuZWNlc3NhcnkgcmVxdWlyZW1lbnQgZmllbGQKICBpbiB0aGUgdGVzdCBtZXRhIGRhdGEgd2UgY291bGQgc2VlIHRoYXQgY3VybCBkaWRuJ3QgY29tcGxhaW4gaWYgeW91IHVzZWQKICAtLXByb3h5LW50bG0gZXZlbiBpZiB0aGUgdW5kZXJseWluZyBsaWJjdXJsIGl0IHVzZXMgaGFzIG5vIE5UTE0gc3VwcG9ydCEgSQogIG5vdyBtYWRlIGl0IGNoZWNrIHRoaXMgZmlyc3QsIGFuZCBpdCBub3cgZXhpc3RzIHdpdGggYSAidGhlIGluc3RhbGxlZAogIGxpYmN1cmwgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgdGhpcyIgbWVzc2FnZSBpZiBpdCBoYXBwZW5zIGFnYWluLgoKRGFuaWVsICgyMiBBcHJpbCAyMDA0KQotIERhdmlkIEJ5cm9uIGZvdW5kIGFuZCBmaXhlZCBhIHNtYWxsIGJ1ZyB3aXRoIHRoZSAtLWZhaWwgYW5kIGF1dGhlbnRpY2F0aW9uCiAgc3R1ZmYgYWRkZWQgYSBmZXcgd2Vla3MgYWdvLiAgVHVybnMgb3V0IHRoYXQgaWYgeW91IHNwZWNpZnkgLS1wcm94eS1udGxtIGFuZAogIGNvbW11bmljYXRlIHdpdGggYSBwcm94eSB0aGF0IHJlcXVpcmVzIGJhc2ljIGF1dGhlbnRpY2F0aW9uLCB0aGUgcHJveHkKICBwcm9wZXJseSByZXR1cm5zIGEgNDA3LCBidXQgdGhlIGZhaWx1cmUgZGV0ZWN0aW9uIGNvZGUgZG9lc24ndCByZWFsaXplIGl0CiAgc2hvdWxkIGdpdmUgdXAsIHNvIGN1cmwgcmV0dXJucyB3aXRoIGV4aXQgY29kZSAwLiBUZXN0IGNhc2UgMTYyIGFkZGVkIHRvCiAgdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKLSBhbGxvdyBuZXdsaW5lcyBpbiB0aGUgY29udGVudHMgd2hlbiBkb2luZyAtRiAidmFyPVtjb250ZW50c10iCiAgUm9iZXJ0IE1hcmxvdyByZXBvcnRlZC4KCi0gSWYgYSB0cmFuc2ZlciBpcyBmb3VuZCBvdXQgdG8gYmUgb25seSBwYXJ0aWFsLCBsaWJjdXJsIHdpbGwgbm93IHRyZWF0IHRoYXQKICBhcyBhIHByb2JsZW0gc2VyaW91cyBlbm91Z2ggdG8gc2tpcCB0aGUgZmluYWwgUVVJVCBjb21tYW5kIGJlZm9yZSBjbG9zaW5nCiAgdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4gVG8gYXZvaWQgdGhlIHJpc2sgdGhhdCBpdCB3aWxsICJoYW5nIiB3YWl0aW5nIGZvcgogIHRoZSBRVUlUIHJlc3BvbnNlLiBBZGRlZCB0ZXN0IGNhc2UgMTYxIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgyMSBBcHJpbCAyMDA0KQotIE1vZGlmaWVkIHRoZSBoZXVyaXN0aWNzIGZvciBkZWFsaW5nIHdpdGggdGhlIHRlc3QgMTYwIHNjZW5hcmlvLiBXaGVuIGEKICBjb25uZWN0aW9uIGlzIHJlLXVzZWQgYW5kIG5vdGhpbmcgYXQgYWxsIGlzIHJlY2VpdmVkIGZyb20gaXQgKGJlY2F1c2UgdGhlCiAgc2VydmVyIGNsb3NlcyB0aGUgY29ubmVjdGlvbiksIHdlIHdpbGwgbm93IHJldHJ5IHRoZSByZXF1ZXN0IG9uIGEgZnJlc2ggbmV3CiAgY29ubmVjdGlvbi4gVGhlIHByZXZpb3VzIEVDT05OUkVTRVQgc3R1ZmYgZnJvbSBKYW51YXJ5IDMwIHdhcyByZW1vdmVkIGFnYWluCiAgYXMgaXQgZGlkbid0IGRldGVjdCB0aGUgc2l0dWF0aW9uIGdvb2QgZW5vdWdoLgoKRGFuaWVsICgyMCBBcHJpbCAyMDA0KQotIEFkZGVkIHRlc3QgY2FzZSAxNjAgdG8gdmVyaWZ5IHRoYXQgY3VybCB3b3JrcyBjb3JyZWN0bHkgd2hlbiBpdCBnZXRzIGEKICBjb25uZWN0aW9uIHJlc2V0IHdoZW4gdHJ5aW5nIHRvIHJlLXVzZSBhIGNvbm5lY3Rpb24uIEl0IHNob3VsZCB0aGVuIHNpbXBseQogIGNyZWF0ZSBhIG5ldyBjb25uZWN0aW9uIGFuZCByZXNlbmQgdGhlIHJlcXVlc3QuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDQpCi0gTm8gbW9yZSA1MTIgYnl0ZSBsaW1pdCBmb3IgaG9zdCBuYW1lIChpbmNsdXNpbmcgbmFtZSArIHBhc3N3b3JkKSBpbiBsaWJjdXJsLgogIEFuIGFkZGVkIGJvbnVzIGlzIHRoYXQgd2UgdXNlIGxlc3MgbWVtb3J5IGZvciB0aGUgdHlwaWNhbCAoc2hvcnRlciBVUkwpCiAgY2FzZS4KCi0gQ2xlYW5lZCB1cCB0aGUgc291cmNlcyB0byBiZXR0ZXIgdXNlIHRoZSB0ZXJtcyAnaG9zdG5hbWUnIGFuZCAncGF0aCcKICBpbnRlcm5hbGx5IHdoZW4gcmVmZXJyaW5nIHRvIHRoYXQgZGF0YS4gVGhlIGJ1ZmZlcnMgdXNlZCBmb3Iga2VlcCB0aGF0IGluZm8KICBpcyBjYWxsZWQgJ25hbWVidWZmZXInIGFuZCAncGF0aGJ1ZmZlcicuIE11Y2ggZWFzaWVyIHRvIHJlYWQgYW5kIHVuZGVyc3RhbmQKICB0aGFuIHRoZSBwcmV2aW91cyBtZXNzLgoKRGFuaWVsICgxNSBBcHJpbCAyMDA0KQotIE1vZGlmaWVkIHJ1bnRlc3RzLnBsIGFnYWluIHRvIHJlbW92ZSBhbGwgbG9nIGZpbGVzIGluIHRoZSBsb2cvIGRpciBiZXR3ZWVuCiAgZWFjaCB0ZXN0LCBhbmQgdGhlbiBtYWRlIC1wIGRpc3BsYXkgYWxsIG5vbi16ZXJvIGJ5dGUgZmlsZXMgaW4gdGhlIGxvZyBkaXIuCiAgSXQgc2hvdWxkIG1ha2UgdGhhdCBkYXRhIG1vcmUgdXNhYmxlIGFuZCBjb250YWluIGxlc3MgcnViYmlzaC4KCi0gZnRwc2VydmVyLnBsIG5vdyBwcm9kdWNlcyBsb2cgZmlsZXMgbW9yZSBzaW1pbGFyIHRvIGhvdyB0aGUgc3dzIG9uZXMgbG9vawogIGFuZCB0aGV5IG5vdyBhbHNvIGNvbnRhaW5zIGEgYml0IG1vcmUgZGV0YWlscyB0byBoZWxwIGRlYnVnZ2luZyBmdHAKICBwcm9ibGVtcy4KCi0gUmVtb3ZlZCB0aGUgZml4ZWQgbWF4aW11bSBhbW91bnQgb2YgZGlyIGxldmVscyB0aGUgRlRQIGNvZGUgc3VwcG9ydGVkLgogIFByZXZpb3VzbHkgd2UgaGFkIGEgZml4ZWQgYXJyYXkgZm9yIDEwMCBsZXZlbHMsIG5vdyB3ZSBzYXZlIHNwYWNlIGluIGVhY2gKICBoYW5kbGUgYnkgYWxsb2NhdGluZyBvbmx5IGZvciBhIGZldyBsZXZlbCBieSBkZWZhdWx0IGFuZCB0aGVuIGVubGFyZ2luZyB0aGF0CiAgaW4gY2FzZSBvZiBuZWVkICh3aXRoIG5vIG1heGltdW0gZGVwdGgpLiBBZGp1c3RlZCB0ZXN0IGNhc2UgMTQyIHRvIHZlcmlmeQogIHRoYXQgMTUwIGRpciBsZXZlbHMgd29yayBmaW5lLiAgQW4gYWRkZWQgYm9udXMgaXMgdGhhdCB3ZSB1c2UgbGVzcyBtZW1vcnkKICBmb3IgdGhlIHR5cGljYWwgKG5vdCB2ZXJ5IGRlZXApIGNhc2UuCgpEYW5pZWwgKDE0IEFwcmlsIDIwMDQpCi0gQXNraW5nIGZvciBDVVJMX0lQUkVTT0xWRV9WNiB3aGVuIGlwdjYgYWRkcmVzc2VzIGNhbid0IGJlIHJlc29sdmVkIHdpbGwKICBub3cgY2F1c2UgdGhlIHJlc29sdmUgZnVuY3Rpb24gdG8gcmV0dXJuIE5VTEwgaW1tZWRpYXRlbHkuIFRoaXMgZmxhdyB3YXMKICBwb2ludGVkIG91dCBieSBHaXNsZSBWYW5lbS4KCi0gR2lzbGUgVmFuZW0gbWFkZSBjdXJsIC00Ly02IGFjdHVhbGx5IHNldCB0aGUgZGVzaXJlZCBvcHRpb24gdG8gbGliY3VybC4KCi0gcnVudGVzdHMucGwgbm93IGhhcyBhIG5ldyBvcHRpb24gKC1wKSB0aGF0IHdpbGwgZGlzcGxheSAiaW50ZXJlc3RpbmciIGxvZwogIGZpbGVzIHRvIHN0ZG91dCBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLiBUaGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCB0byBiZQogIHVzZWQgaW4gdGhlICdmdWxsLXRlc3QnIG1ha2UgdGFyZ2V0IHRoYXQgaXMgdXNlZCBieSB0aGUgYXV0b2J1aWxkIHRlc3RzLCBhcwogIHdlIHRoZW4gZ2V0IGEgbXVjaCBiZXR0ZXIgY2hhbmNlIHRvIHVuZGVyc3RhbmQgKHJlbW90ZSkgdGVzdCBmYWlsdXJlcyBiYXNlZAogIG9uIGF1dG9idWlsZCBsb2dzIGFsb25lLgoKRGFuaWVsICgxMyBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtIG1hZGUgdGhlIG11bHRpIGludGVyZmFjZSB3b3JrIGFnYWluIG9uIFdpbmRvd3MgZXZlbiB3aGVuIGJ1aWx0CiAgd2l0aG91dCBhcmVzLiBCZWZvcmUgdGhpcywgc2VsZWN0KCkgd291bGQgcmV0dXJuIC0xIGR1cmluZyB0aGUgbmFtZSByZXNvbHZlCiAgcGhhc2Ugc2luY2UgY3VybF9tdWx0aV9mZHNldCgpIGRpZG4ndCByZXR1cm4gYW55IGZkX3NldCBhdCBhbGwgd2hpY2ggd2Fzbid0CiAgYXBwcmVjaWF0ZWQhCgotIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSBub3cgZHVwbGljYXRlcyB0aGUgdGNwX25vZGVsYXkgaW5mbyBhcyB3ZWxsLgoKRGFuaWVsICgxMSBBcHJpbCAyMDA0KQotIEFwcGxpZWQgRGF2aWQgQnlyb24ncyBwYXRjaCBmb3IgdGhlIE1TVkMgbGliY3VybCBtYWtlZmlsZSBmb3IgYnVpbGRzIHdpdGgKICB6bGliLgoKRGFuaWVsICg5IEFwcmlsIDIwMDQpCi0gRGlyayBNYW5za2UgaW1wcm92ZWQgdGhlIHRpbWVyIHJlc29sdXRpb24gZm9yIENVUkxJTkZPXypfVElNRSwgaXQgY2FuIG5vdwogIGJlIGRvd24gdG8gdXNlYyBpZiB0aGUgc3lzdGVtIHN5cHBvcnRzIGl0LgoKRGFuaWVsICg3IEFwcmlsIDIwMDQpCi0gQSByZXF1ZXN0IHRoYXQgc2VuZHMgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiBhbmQgZ2V0cyBub3RoaW5nIGJ1dCBhIHNpbmdsZQogIDEwMCByZXNwb25zZSBiYWNrIHdpbGwgbm93IHJldHVybiBhIENVUkxFX0dPVF9OT1RISU5HLiBUZXN0IDE1OCB2ZXJpZmllcy4KCi0gVGhlIHN0cnRvb2ZmdCgpIG1hY3JvIGlzIG5vdyBuYW1lZCBjdXJseF9zdHJ0b29mZnQoKSB0byB1c2UgdGhlIGN1cmx4XyoKICBhcHByb2FjaCBmdWxseS4KCkRhbmllbCAoNiBBcHJpbCAyMDA0KQotIEdpc2xlIFZhbmVtJ3MgZml4ZWQgYnVnICM5Mjc5NzkgcmVwb3J0ZWQgYnkgTmF0aGFuIE8nU3VsbGl2YW4uIFRoZSBwcm9ibGVtCiAgbWFkZSBsaWJjdXJsIG9uIFdpbmRvd3MgbGVhayBhIHNtYWxsIGFtb3VudCBvZiBtZW1vcnkgaW4gZWFjaCBuYW1lIHJlc29sdmUKICB3aGVuIG5vdCB1c2VkIGFzIGEgRExMLgoKLSBOZXcgYXV0aGVudGljYXRpb24gY29kZSBhZGRlZCwgcGFydGljdWxhcmx5IG5vdGljYWJsZSB3aGVuIGRvaW5nIFBPU1Qgb3IgUFVUCiAgd2l0aCBEaWdlc3Qgb3IgTlRMTS4gbGliY3VybCB3aWxsIG5vdyB1c2UgSEVBRCB0byBuZWdvdGlhdGUgdGhlCiAgYXV0aGVudGljYXRpb24gYW5kIHdoZW4gZG9uZSBwZXJmb3JtIHRoZSByZXF1ZXN0ZWQgUE9TVC4gUHJldmlvdXNseSBsaWJjdXJsCiAgc2VudCBQT1NUIGltbWVkaWF0ZWx5IGFuZCBleHBlY3RlZCB0aGUgc2VydmVyIHRvIHJlcGx5IGEgZmluYWwgc3RhdHVzIGNvZGUKICB3aXRoIGFuIGVycm9yIGFuZCB0aGVuIGxpYmN1cmwgd291bGQgbm90IHNlbmQgdGhlIHJlcXVlc3QtYm9keSBidXQgaW5zdGVhZAogIHNlbmQgdGhlbiBuZXh0IHJlcXVlc3QgaW4gdGhlIHNlcXVlbmNlLgoKICBUaGUgcmVhc29uIGZvciB0aGlzIGNoYW5nZSBpcyBkdWUgdG8gSUlTNiBiYXJmaW5nIG9uIGxpYmN1cmwgd2hlbiB3ZSBhdHRlbXB0CiAgdG8gUE9TVCB3aXRoIE5UTE0gYXV0aGVudGljYXRpb24uIFRoZSByZWFzb24gZm9yIHRoZSBwcm9ibGVtcyBpcyBmb3VuZCBpbgogIFJGQzI2MTYgc2VjdGlvbiA4LjIuMyByZWdhcmRpbmcgaG93IHNlcnZlcnMgc2hvdWxkIGRlYWwgd2l0aCB0aGUgMTAwCiAgY29udGludWUgcmVxdWVzdC1oZWFkZXI6CgogICAgICAgIElmIGl0IHJlc3BvbmRzIHdpdGggYSBmaW5hbCBzdGF0dXMgY29kZSwgaXQgTUFZIGNsb3NlIHRoZSB0cmFuc3BvcnQKICAgICAgICBjb25uZWN0aW9uIG9yIGl0IE1BWSBjb250aW51ZSB0byByZWFkIGFuZCBkaXNjYXJkIHRoZSByZXN0IG9mIHRoZQogICAgICAgIHJlcXVlc3QuCgogIFByZXZpb3VzIHZlcnNpb25zIG9mIElJUyBjbGVhcmx5IGRpZCBjbG9zZSB0aGUgY29ubmVjdGlvbiBpbiB0aGlzIGNhc2UsCiAgd2hpbGUgdGhpcyBuZXdlciB2ZXJzaW9uIGRlY2lkZWQgaXQgc2hvdWxkICJyZWFkIGFuZCBkaXNjYXJkIi4gVGhhdCB3b3VsZCd2ZQogIGZvcmNlZCB1cyB0byBzZW5kIHRoZSB3aG9sZSBQT1NUIChvciBQVVQpIGRhdGEgb25seSB0byBoYXZlIGl0IGRpc2NhcmRlZCBhbmQKICB0aGVuIGJlIGZvcmNlZCB0byBzZW5kIGl0IGFnYWluLiBUbyBhdm9pZCB0aGF0IGh1Z2UgcGVuYWxpdHksIHdlIHN3aXRjaCB0bwogIHVzaW5nIEhFQUQgdW50aWwgd2UgYXJlIGF1dGhlbnRpY2F0ZWQgYW5kIHRoZW4gc2VuZCB0aGUgUE9TVC4KCiAgVGhlIG9ubHkgYWN0dWFsIGRyYXdiYWNrIEkgY2FuIHRoaW5rIG9mIChleGNlcHQgZm9yIHRoZSBvZGQgc2l0ZXMgdGhhdCBtaWdodAogIHRyZWF0IEhFQUQgZGlmZmVyZW50bHkgdGhhbiB0aGV5IHdvdWxkIHRyZWF0IFBPU1QvUFVUIHdoZW4gZ2l2ZW4gdGhlIHNhbWUKICBVUkwpIGlzIHRoYXQgaWYgeW91IGRvIFBPU1Qgd2l0aCBDVVJMQVVUSF9BTlkgc2V0IGFuZCB0aGUgc2l0ZSByZXF1aXJlcyBOTwogIGF1dGhlbnRpY2F0aW9uLCBsaWJjdXJsIHdpbGwgc3RpbGwgdXNlIGEgSEVBRCBpbiBhIGZpcnN0IHJvdW5kIGFuZCB0aGVuIGRvIGEKICBQT1NULgoKICBJZiB5b3UgZG8gYSBIRUFEIG9yIGEgR0VUIG9uIGEgc2l0ZSB1c2luZyBDVVJMQVVUSF9BTlksIGxpYmN1cmwgd2lsbCBzZW5kCiAgYW4gdW4tYXV0aGVudGljYXRlZCByZXF1ZXN0IGF0IG9uY2UsIHdoaWNoIHRoZW4gaXMgdGhlIG9ubHkgcmVxdWVzdCBpZiB0aGUKICBzaXRlIHJlcXVpcmVzIG5vIGF1dGguCgogIEFsYW4gUGluc3RlaW4gaGVscGVkIG1lIHdvcmsgb3V0IHRoZSBwcm90b2NvbCBkZXRhaWxzIGJ5IGZpZ3VyaW5nIG91dCB3aHkKICBsaWJjdXJsIGZhaWxlZCBhbmQgd2hhdCBJSVM2IGV4cGVjdHMuCgotIFRoZSAtLWxpbWl0LXJhdGUgbG9naWMgd2FzIGNvcnJlY3RlZCBhbmQgbm93IGl0IHdvcmtzIGEgbG90IGJldHRlciBmb3IKICBoaWdoZXIgc3BlZWRzLCBzdWNoIGFzICcxMG0nIG9yIHNpbWlsYXIuIFJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzkzMDI0OS4KCi0gSW50cm9kdWNpbmcgY3VybHhfdHZub3coKSBhbmQgY3VybHhfdHZkaWZmKCkgdXNpbmcgdGhlIG5ldyBjdXJseF8qIGZhc2hpb24uCiAgI2luY2x1ZGUgInRpbWV2YWwuaCIgZnJvbSB0aGUgbGliIGRpciB0byBnZXQgdGhlIHByb3RvcyBldGMuICBOb3RlIHRoYXQKICB0aGVzZSBhcmUgTk9UIHBhcnQgb2YgdGhlIGxpYmN1cmwgQVBJLiBUaGUgY3VybCBhcHAgc2ltcGx5IHVzZXMgdGhlIHNhbWUKICBzb3VyY2UgZmlsZXMgYXMgdGhlIGxpYnJhcnkgZG9lcyBhbmQgdGhlcmVmb3JlIHRoZSBmaWxlIG5lZWRzIHRvIGJlIGNvbXBpbGVkCiAgYW5kIGxpbmtlZCB3aXRoIGN1cmwgdG9vLCBub3QganVzdCB3aGVuIGNyZWF0aW5nIGxpYmN1cmwuCgotIGxpYi9zdHJlcnJvci5jIG5vIGxvbmdlciB1c2VzIHN5c19uZXJyIG9uIG5vbi13aW5kb3dzIHBsYXRmb3JtcyBzaW5jZSBpdAogIGlzbid0IHBvcnRhYmxlIGVub3VnaAoKRGFuaWVsICgyIEFwcmlsIDIwMDQpCi0gSW4gdGhlIGN1cmxfc3RybnF1YWwuMyBtYW4gcGFnZSwgd2Ugbm93IHByZXBlbmQgdGhlIG1hbjMgZGlyIHRvIHRoZSBmaWxlCiAgbmFtZSB0byB3b3JrIGJldHRlci4gQXMgcG9pbnRlZCBvdXQgYnkgUm9iaW4gS2F5LgoKLSBBbmRy6XMgR2FyY+1hIHVwZGF0ZWQgdGhlIG1pbmd3IG1ha2VmaWxlcy4KCi0gRGlyayBNYW5za2UgZml4ZWQgYSBwcm9ibGVtIEkgcmVjZW50bHkgYWRkZWQgaW4gdGhlIHByb2dyZXNzIG1ldGVyIGNvZGUgdGhhdAogIGJyb2tlIHN1YnNlY29uZCByZXNvbHV0aW9uIGZvciBDVVJMSU5GT19UT1RBTF9USU1FLiBIZSBhbHNvIHBvaW50ZWQgb3V0IGEKICBtaXN0YWtlIGluIHRoZSBjb2RlIHRoYXQgcHJvZHVjZXMgdGhlIGZpbmFsIHVwZGF0ZSBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIKICB0aGF0IHdvdWxkIG9mdGVuIHByZXZlbnQgaXQgZnJvbSBhY3R1YWxseSBiZWluZyB1cGRhdGVkIHRoYXQgZmluYWwgdGltZS4KCkRhbmllbCAoMSBBcHJpbCAyMDA0KQotIERpcmsgTWFuc2tlIGZpeGVkIGEgbWVtb3J5IGxlYWsgdGhhdCBoYXBwZW5lZCB3aGVuIHdlIHVzZSBhcmVzIGZvciBuYW1lCiAgcmVzb2x2ZXMgYW5kIGRlY2lkZXMgdG8gdGltZS1vdXQgYmVmb3JlIGFyZXMgZG9lcyBpdC4gVGhpcyBmaXggdXNlcyB0aGUKICBicmFuZCBuZXcgYXJlc19jYW5jZWwoKSBmdW5jdGlvbiB3aGljaCBpcyBub3QgcHJlc2VudCBpbiBjLWFyZXMgMS4xLjAuCgogIFdoZW4gdG9sZCB0byBlbmFibGUgYXJlcywgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGNoZWNrcyBmb3IgcHJlc2VuY2Ugb2YKICB0aGUgYXJlc19jYW5jZWwgZnVuY3Rpb24gdG8gYWxlcnQgdXNlcnMgaWYgdGhleSBhdHRlbXB0IHRvIHVzZSBhIHRvbyBvbGQKICBjLWFyZXMgbGlicmFyeS4KCkRhbmllbCAoMzEgTWFyY2ggMjAwNCkKLSBSb3kgU2hhbiBmaXhlZCBhIGZsYXcgdGhhdCBwcmV2ZW50ZWQgYXJlcyBuYW1lIHJlc29sdmUgdGltZW91dHMgdG8gb2NjdXIhCgotIERpcmsgTWFuc2tlIGZvdW5kIG91dCB0aGF0IGxpYmN1cmwgdGltZWQgb3V0IHdhaXRpbmcgZm9yIHJlc29sdmVzIGZhciB0b28KICBlYXN5IHdoZW4gbGliY3VybCB3YXMgYnVpbHQgdG8gdXNlIChjLSlhcmVzIGZvciBuYW1lIHJlc29sdmluZy4KCi0gRnVydGhlciBEaWdlc3QgZml4aW5nIGFuZCBhIHN1Y2Nlc3NmdWwgdGVzdCBjYXNlIDE1MyBub3cgbWFrZXMgbWUgYmVsaWV2ZQogIE1pdHogV2FyaydzIHByb2JsZW1zIGFyZSBmaXhlZC4KCi0gQW5kcmVzIEdhcmNpYSBmaWd1cmVkIG91dCB0aGF0IHRlc3QgY2FzZSA2Mywgd2hpbGUgd29ya2luZywgb25seSBwcm92ZWQgYQogIGZsYXcgaW4gbGliY3VybCdzICdodHRwX3Byb3h5JyBwYXJzZXIgd2hlbiBhIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgaXMKICBwcm92aWRlZC4gVGhlIHVzZXIgbmFtZSB3YXMgbm90IGV4dHJhY3RlZCBwcm9wZXJseSAoYW5kICdodHRwJyB3YXMgYWx3YXlzCiAgdXNlZCBhcyB1c2VyIG5hbWUpLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIG91ciBpb2N0bHNvY2tldCgpIHVzYWdlLgoKRGFuaWVsICgzMCBNYXJjaCAyMDA0KQotIEpvZSBIYWxwaW4gZmFjZWQgcHJvYmxlbXMgd2l0aCB0aGUgZ2V0bmFtZWluZm8oKSBhcmd1bWVudCBhaV9mbGFncyBhbmQgdGhlCiAgcGFydGljdWxhciBiaXQgbmFtZWQgJ05JX1dJVEhTQ09QRUlEJyBvbiBTb2xhcmlzIDkgZm9yIEludGVsLiAgSSd2ZSBub3cKICB3cml0dGVuIGEgY29uZmlndXJlIHRlc3QgdGhhdCBjaGVja3MgZm9yIGEgd29ya2luZyBOSV9XSVRIU0NPUEVJRAogIGltcGxlbWVuYXRpb24uIE5vIGNvZGUgdXNlcyB0aGUgcmVzdWx0IGZyb20gdGhpcyB0ZXN0IHlldCwgaXQgaXMgc3RpbGwKICBleHBlcmltZW50YWwuIEphbWVzIENhcmxzb24gd3JvdGUgaW4gY29tcC51bml4LnNvbGFyaXM6ICJJdCdzIGEgYnVnCiAgKDUwMDY2MjMpIC0tIGl0J3Mgbm90IHN1cHBvcnRlZCBhbmQgc2hvdWxkbid0IGJlIGluIHRoZSBoZWFkZXIgZmlsZS4iCgotIEkgcHJvdmlkZWQgTWl0eiBXYXJrIHdpdGggYSBmaXJzdCBwYXRjaCBpbiBvcmRlciB0byBmaXggbGliY3VybCdzIHByb2JsZW1zCiAgdG8gcmUtbmVnb3RpYXRlIERpZ2VzdCBhdXRoZW50aWNhdGlvbiAod2hlbiAnc3RhbGU9dHJ1ZScgaXMgaW5jbHVkZWQgaW4gdGhlCiAgcmVzcG9uc2UgaGVhZGVyKS4KCi0gUm95IFNoYW4gZGlzY292ZXJlZCB0aGF0IHRoZSBtdWx0aSBpbnRlcmZhY2UgZGlkbid0IHByb3Blcmx5IHRpbWVvdXQgbmFtZQogIGxvb2t1cHMgd2hpY2ggY291bGQgbWFrZSBoYW5kbGVzIGdldCBzdHVjayBpbiB0aGF0IHN0YXRlIGFuZCB0aHVzIG5ldmVyIGdldAogIGNvbXBsZXRlZC4gSSd2ZSBwcm9kdWNlZCBhIGZpcnN0IHRlc3QgcGF0Y2ggdGhhdCBhdHRlbXB0cyB0byBjb3JyZWN0IHRoaXMuCgotIERhdmlkIEJ5cm9uJ3MgcGF0Y2ggd2FzIGFwcHBsaWVkIHRvIG1ha2UgQ1VSTE9QVF9GQUlMT05FUlJPUiB3b3JrIG5pY2VseQogIGV2ZW4gd2l0aCBhdXRoZW50Y2F0aW9ucyBzdWNoIGFzIE5UTE0gb3IgRGlnZXN0IGVuYWJsZWQuIFRlc3QgY2FzZXMgMTUwLCAxNTEKICBhbmQgMTUyIHdlcmUgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmdW5jdGlvbmFsaXR5LgoKRGFuaWVsICgyOSBNYXJjaCAyMDA0KQotIEdpc2xlIFZhbmVtIHVwZGF0ZWQgZmlsZXMgZm9yIHRoZSBkamdwcC9NUy1ET1MgYnVpbGQuCgotIEFuZHLpcyBHYXJj7WEgaGVscGVkIG1lIHdvcmsgb3V0IGEgZml4IGZvciB0aGUgcnVudGVzdHMucGwgc2NyaXB0IHRvIG1ha2UKICB0aGUgZmlsZTovLyB0ZXN0cyBydW4gZmluZSB3aGVuIHRlc3RlZCB3aXRoIHRoZSBtaW5ndy1idWlsdCB2ZXJzaW9uIG9mIGN1cmwuCgotIEZpeGVkIGFuIGluY2x1ZGUgaXNzdWUgd2l0aCBuZXRpbmV0L3RjcC5oIG9uIEFJWCwgYmFzZWQgb24gaW5wdXQgYnkgVG9yLgogIFRoaXMgYWxzbyByZXF1aXJlZCBhIG1pbm9yIGZpeCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCi0gVGhlIHBvc3RpdDIuYyBzb3VyY2UgZXhhbXBsZSB1c2VkIHRoZSB3cm9uZyBzdHJ1Y3QgbmFtZSBmb3IgdGhlIHBvc3QgZGF0YS4KCkRhbmllbCAoMjYgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSBpbXByb3ZlZCBpcHY2IHN1cHBvcnQgb24gd2luZG93cyBieSBtYWtpbmcgdGhlIGN1cmwgYnVpbGQgdG8gdXNlCiAgdGhlIGNvcnJlY3QgZ2V0YWRkcmluZm8oKSBmdW5jdGlvbi4KCkRhbmllbCAoMjUgTWFyY2ggMjAwNCkKLSBJdCB0dXJuZWQgb3V0IHRoYXQgQUlYLCBkZXNwaXRlIGhhdmluZyBhICJ0aHJlYWQtc2FmZSBsaWJjIiwgZG9lc24ndCBvZmZlcgogIGFsbCB0cmFkaXRpb25hbCBmdW5jdGlvbnMgdGhyZWFkLXNhZmUuIFRoaXMgVVJMIGlzIGluZm9ybWF0aXZlIG9uIHRoaXMKICBzdWJqZWN0OgoKICAgIGh0dHA6Ly9wdWJsaWJuLmJvdWxkZXIuaWJtLmNvbS9kb2NfbGluay9lbl9VUy9hX2RvY19saWIvYWl4cHJnZ2QvIFwKICAgIGdlbnByb2djL3RocmVhZF9xdWlja19yZWYuaHRtCgogIEFzIGEgcmVzdWx0IG9mIHRoaXMsIHdlIG5vdyBjaGVjayBmb3IgdGhyZWUgKl9yKCkgZnVuY3Rpb25zIG9uIHJlY2VudCBBSVgKICB2ZXJzaW9ucyBhcyB3ZWxsIHRoYXQgdGhlIFVSTCBtZW50aW9ucyBhcmVuJ3QgdGhyZWFkLXNhZmUgaW4gQUlYIDUuMS4KCi0gcmVuYW1lZCBjdXJsX3N0cmVycm9yLltjaF0gdG8gc3RyZXJyb3IuW2NoXQoKLSBKb2UgSGFscGluIGFkZGVkIENVUkxPUFRfVENQX05PREVMQVkgYW5kIC0tdGNwLW5vZGVsYXkgdG8gbWFrZSBpdCBwb3NzaWJsZQogIGZvciB1c2VycyB0byBkaXNhYmxlIHRoZSBOYWdsZSBhbGdvcnRoaW0tdXNhZ2UuCgotIFRvciBBcm50c2VuIHByb3ZpZGVkIHNvbWUgaW50ZXJlc3Rpbmcgc3RyZXJyb3JfcigpIGtub3dsZWRnZS4gZ2xpYmMgaGFzIGl0cwogIG93biBBUEkgd2hpY2ggZGlmZmVycyBmcm9tIHRoZSBQT1NJWCBvbmUuIERhbmllbCBhZGp1c3RlZCB0aGUgY29uZmlndXJlCiAgc2NyaXB0IHRvIGRldGVjdCB0aGUgdmVyc2lvbiBpbiB1c2UsIGFuZCB0aGUgY29kZSBub3cgdXNlcyB0aGUgbmV3IGRlZmluZXMKICBhY2NvcmRpbmdseS4KCi0gRml4ZWQgc29tZSBidWlsZCBmbGF3cyB3aXRoIHRoZSBuZXcgbGliL2N1cmxfc3RyZXJyb3IuYyBzb3VyY2UgZmlsZS4KCkRhbmllbCAoMjQgTWFyY2ggMjAwNCkKLSBHaXNsZSBWYW5lbSdzIGZpeCB0byByZXBsYWNlIHRoZSBiYWQgdXNlIG9mIHN0cmVycm9yKCkuIFRoaXMgaW50cm9kdWNlcwogIEN1cmxfc3RyZXJyb3IoKSB0aGF0IGF0dGVtcHRzIHRvIGJlIHRocmVhZC1zYWZlIF9hbmRfIHdvcmtzIG9uIFdpbmRvd3MgdG9vIQoKLSBUb3IgQXJudHNlbiBzcGVsbC1maXhlZCBsb3RzIG9mIGxpYmN1cmwgbWFuIHBhZ2VzLgoKLSBUb3IgQXJudHNlbiBtYWRlIHRlc3RjdXJsLnBsIHdvcmsgd2l0aCBvbGRlciBwZXJsIDUgdmVyc2lvbnMsIGFuZCBEYW5pZWwKICBtYWRlIGl0IG5vdCB1c2UgY2hkaXIgLi4gdG8gZ28gYmFjaywgYXMgdGhhdCBpc24ndCB2ZXJ5IGdvb2Qgd2hlbiB5b3UndmUKICBzZXR1cCBhIHRlc3RkaXIgY29udGFpbmluZyBzeW1saW5rcy4KCi0gQWRkZWQgYSBjaGVjayBmb3Igc3RyZXJyb3JfcigpIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LgoKRGFuaWVsICgyMyBNYXJjaCAyMDA0KQotIEFkZGVkIEdyZWcgSGV3Z2lsbCdzIHRlc3RjdXJsLnBsIHNjcmlwdCB0byBDVlMuIFdlIGhhdmUgbm90IG1vdmVkIG92ZXIgdG8KICB1c2UgdGhpcyBzY3JpcHQgZm9yIHRoZSByZWFsIGRpc3RyaWJ1dGVkIHRlc3RpbmcganVzdCB5ZXQsIGJ1dCBpdCBpcyBvbmx5CiAgYSBtYXR0ZXIgb2YgdGltZS4KCi0gR2lzbGUgVmFuZW0gcHJvdmlkZWQgY29kZSB0aGF0IG1ha2VzIGN1cmwgcmVwb3J0IGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UKICBpZiAtLWludGVyZmFjZSBmYWlscyBvbiB3aW5kb3dzLgoKLSBUaGUgcmVndWxhciBwcm9ncmVzcyBtZXRlciBpcyBub3cgZml4ZWQgdG8gbmV2ZXIgd3JhcCBkdWUgdG8gbG9uZyBsaW5lcy4gQWxsCiAgZmllbGRzIGFyZSBub3cgc3RhdGljIHNpemVkLiBJZiB0aGUgdGltZSBpbiB0aGUgdGltZSBmaWVsZHMgZ2V0IGEgdGltZSB2YWx1ZQogIHRoYXQgd291bGQgcmVwcmVzZW50IGEgdGltZSB0aGF0IGlzIDEwMCBob3VycyBvciBtb3JlIChpZiBub3QsIGl0IHJlbWFpbnMKICB1c2luZyBhIEhIOk1NOlNTIGRpc3BsYXkpLCBpdCBzd2l0Y2hlcyBmaXJzdCB0byBhICJOTk5kIE5OaCIgZGlzcGxheSAoZm9yCiAgZGF5cyBhbmQgaG91cnMpIGFuZCBpZiB0aGF0IGlzbid0IGVub3VnaCBpdCBzd2l0Y2hlcyB0byBhICJOTk5kIiBkaXNwbGF5IGlmCiAgaXQgaXMgbW9yZSB0aGFuIDk5OSBkYXlzLgoKICBTZXZlcmFsIG9mIHRoZSBjYWxjdWxhdGlvbnMgd2VyZSBhbHNvIG1vdmVkIHRvIGZpeGVkLXBvaW50IG1hdGggaW5zdGVhZCBvZgogIHVzaW5nIGRvdWJsZXMuCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDQpCi0gR2xlbiBOYWthbXVyYSBub3RpY2VkIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX0RPV05MT0FEIGRpZG4ndCB3b3JrIGFzIGl0CiAgdXNlZCB0byBkbyBpZiBDVVJMT1BUX05PQk9EWSBpcyBzZXQgVFJVRS4KCi0gS2V2aW4gUm90aCBwYXRjaGVkIHRoZSBjeWd3aW4gcGFja2FnZSBtYWtlZmlsZSBhbmQgUkVBRE1FIHRvIGFkanVzdCB0bwogIG5ldyBjeWd3aW4gcGFja2FnaW5nIGd1aWRlbGluZXMuCgotIEVuYWJsZWQgIk5UIHJlc3BvbnNlcyIgaW4gdGhlIE5UTE0gYXV0aGVudGljYXRpb24uIERvaW5nIHRoaXMgc2ltcGx5IG1lYW5zCiAgdGhhdCB3ZSBwcm92aWRlIGFuIGV4dHJhIGNodW5rIG9mIGRhdGEgaW4gZWFjaCAidHlwZS0zIG1lc3NhZ2UiLiBUaGUgb25seQogIHJlYXNvbiBmb3IgZG9pbmcgdGhpcyBpcyB0aGF0IGl0IHNlZW1zIHRoYXQgdXNpbmcgb25seSB0aGUgIkxhbm1hbmFnZXIgaGFzaCIKICAoYXMgd2UndmUgYmVlbiBkb2luZyB1bnRpbCBub3cpIGRvZXNuJ3Qgc3VwcG9ydCBwYXNzd29yZHMgbG9uZ2VyIHRoYW4gMTQKICBjaGFyYWN0ZXJzIGFuZCBpdCB0dXJucyBvdXQgdGhlcmUgYXJlIHVzZXJzIG91dCB0aGVyZSB3aG8gd2FudCB0byB1c2UKICBsaWJjdXJsIGFuZCBOVExNIHdpdGggc3VjaCBwYXNzd29yZHMhIDstKSBTZXZlbiBOVExNLXJlbGF0ZWQgdGVzdCBjYXNlcyB3ZXJlCiAgdXBkYXRlZCBhY2NvcmRpbmdseS4gTWVudGlvbmVkIGFzIGlzc3VlIDI5IGluIFRPRE8tUkVMRUFTRSwgYnVnIHJlcG9ydAogICM5MTU2MDkKCi0gTW92ZWQgdGhlIGdlbmVyYXRlZCBsaWJjdXJsIHZlcnNpb24gaW5mbyB0byBhIG5ldyBoZWFkZXIgZmlsZSwgbmFtZWQKICBjdXJsL2N1cmx2ZXIuaC4gTm93IGludGVyZXN0ZWQgcGFydGllcyBjYW4gaW5jbHVkZSBPTkxZIHZlcnNpb24gaW5mbywgc2hvdWxkCiAgYW55b25lIHdhbnQgdGhhdCAoYW5kIGl0IHNlZW1zIGF0IGxlYXN0IHNvbWUgd2luZG93cyByZXNvdXJjZSBmaWxlcyB3b3VsZCkuCiAgTWVudGlvbmVkIGFzIGlzc3VlIDI3IGluIFRPRE8tUkVMRUFTRS4KCkRhbmllbCAoMjEgTWFyY2ggMjAwNCkKLSBGaXhlZCB0aGUgcm9vdCBNYWtlZmlsZSB0byB1c2UgdGFicyBmb3IgdGhlIG5ldHdhcmUgdGFyZ2V0LiBH/G50ZXIgS25hdWYKICBwb2ludGVkIHRoaXMgb3V0LgoKLSBNYXJ0eSBLdWhydCdzIFZNUyBjbGVhbnVwCgotIFRob21hcyBTY2h3aW5nZSBtYWRlIGJ1aWxkY29uZiByZWNvZ25pemUgQUNMT0NBTF9GTEFHUyB0byBpbnZva2UgYWNsb2NhbAogIHdpdGggcGFydGljdWxhciBwcmUtZGV0ZXJtaW5lZCBvcHRpb25zLgoKVmVyc2lvbiA3LjExLjEgKDE5IE1hcmNoIDIwMDQpCgpEYW5pZWwgKDE4IE1hcmNoIDIwMDQpCi0gVG9yIEFybnRzZW4gYnJvdWdodCBzb21lIGluZm8gYWJvdXQgU0dJIElSSVg6CgogIElSSVggc3VwcG9ydHMgMyBkaWZmZXJlbnQgZXhlY3V0YWJsZS9vYmplY3QgZm9ybWF0cywgLTMyLCAtbjMyIGFuZCAtNjQuCiAgLW4zMiBpcyBkZWZhdWx0IDMyLWJpdCBmb3JtYXQsIC0zMiBpcyB0aGUgIm9sZCIgMzItYml0IGZvcm1hdCwgYW5kIC02NCBpcwogIHRoZSA2NC1iaXQgZm9ybWF0LiAgTGlicmFyaWVzIGZvciB0aGUgZGlmZmVyZW50IGZvcm1hdHMgYXJlIGluIGxpYiwgbGliMzIKICBhbmQgbGliNjQgcmVzcGVjdGl2ZWx5LgoKICBXZSd2ZSBub3cgYWRqdXN0ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYWRhcHQgdG8gdGhpcyB3aGVuIHNjYW5uaW5nIGZvcgogIDNyZCBwYXJ0eSBsaWJzLCBzdWNoIGFzIE9wZW5TU0wuCgpEYW5pZWwgKDE3IE1hcmNoIDIwMDQpCi0gV2F0eiBwb2ludGVkIG91dCBhIGZldyBtaXNzaW5nIGZpbGVzIGluIHRoZSBNU1ZDIHByb2plY3QgZGVzY3JpcHRpb24gZmlsZS4KCi0gR/xudGVyIEtuYXVmIGJyb3VnaHQgcGF0Y2hlcywgY29kZSBhbmQgbWFrZWZpbGVzIHRvIGJ1aWxkIGN1cmwgb24gTm92ZWxsCiAgTmV0V2FyZS4KCkRhbmllbCAoMTUgTWFyY2ggMjAwNCkKLSBMb3RzIG9mIGxpYmN1cmwgbWFuIHBhZ2VzIHdlcmUgdXBkYXRlZCB0byBjb250YWluIHJlZmVyZW5jZXMgdG8gb3RoZXIgbWFuCiAgcGFnZXMgdGhlIHJlY29nbml6ZWQgd2F5IHNvIHRoYXQgdGhleSBhcHBlYXIgYXMgbmljZSBoeXBlcmxpbmtzIGluIHRoZSBIVE1MCiAgdmVyc2lvbnMuCgotIGJ1aWxkY29uZiBub3cgY2hlY2tzIHRoZSBtNCB2ZXJzaW9uIHRvbywgc2luY2UgYXV0b2NvbmYgcmVxdWlyZXMgYSBHTlUgbTQKICB2ZXJzaW9uIHRvIGJ1aWxkIHByb3BlciBjb25maWd1cmUgc2NyaXB0cy4KCkRhbmllbCAoMTIgTWFyY2ggMjAwNCkKLSBBZGRlZCBDVVJMT1BUX1BPU1RGSUVMRFNJWkVfTEFSR0UsIHRoZSBsYXJnZSBmaWxlIHZlcnNpb24gb2YKICBDVVJMT1BUX1BPU1RGSUVMRFNJWkUgdG8gYWxsb3cgUE9TVHMgbGFyZ2VyIHRoYW4gMkdCLgoKLSBEYXZpZCBCeXJvbiBmaXhlZCBhbiB1bmluaXRpYWxpemVkIHZhcmlhYmxlIGNhc2UvY3Jhc2guCgpEYW5pZWwgKDEwIE1hcmNoIDIwMDQpCi0gSmVmZiBMYXdzb24gZml4ZWQgdGhlIFNTTCBjb25uZWN0aW9uIHRvIGRlYWwgd2l0aCByZWNlaXZlZCBzaWduYWxzIGR1cmluZyB0aGUKICBjb25uZWN0LgoKLSBDaGFuZ2VkIHRoZSBPUyBzdHJpbmcgZm9yIHdpbjMyIHRvIGJlY29tZSAiaTM4Ni1wYy13aW4zMiIuCgpEYW5pZWwgKDkgTWFyY2ggMjAwNCkKLSBDaGFuZ2VkIHRoZSBpbnRlcm5hbHMgdG8gdXNlIGN1cmxfc29ja2V0X3QgZm9yIHNvY2tldCB2YXJpYWJsZSB0eXBlLiBUaGlzCiAgc2hvdWxkIGVuYWJsZSB1cyB0byBidWlsZCB3aXRoIGxlc3Mgd2FybmluZ3Mgb24gV2luZG93cywgd2hlcmUgU09DS0VUIGlzCiAgdXNlZCB3aGljaCBpcyBhbiB1bnNpZ25lZCBpbnQsIHdoaWxlIG1vc3Qgb3RoZXIgcGxhdGZvcm1zIHVzZSBhIG1lcmUgaW50LgoKLSBNb2RpZmllZCBsaWIvY29uZmlnLXdpbjMyLmggdG8gYnVpbGQgZmluZSBvbiBNU1ZDIGFnYWluLgoKVmVyc2lvbiA3LjExLjEtcHJlMSAoOCBNYXJjaCAyMDA0KQoKRGFuaWVsICg4IE1hcmNoIDIwMDQpCi0gTWlub3IgZml4IHRvIG1ha2UgY3VybCBDVVJMX1ZFUlNJT05fTEFSR0VGSUxFIGlzIG9ubHkgc2V0IGlmIGN1cmxfb2ZmX3QgaXMKICBsYXJnZXIgdGhhbiA0IGJ5dGVzLgoKRGFuaWVsICg0IE1hcmNoIDIwMDQpCi0gSW1wcm92ZWQgUFVUL1BPU1Qgd2l0aCBOVExNL0RpZ2VzdCBhdXRoZW50aWNhdGlvbiwgdGhlIHNvIGNhbGxlZCBpc3N1ZSAxMi4KCi0gTW9kaWZpZWQgdGhlIHRlc3QgSFRUUCBzZXJ2ZXIgYSBsb3QgdG8gd29yayB3aXRoIHRoZSB1cGNvbWluZyBjaGFuZ2VzIGZvcgogIFBVVC9QT1NUIHdpdGggTlRMTS9EaWdlc3QgYXV0aGVudGljYXRpb24gKGxpa2UgdGVzdCBjYXNlIDg4KS4gQWRkZWQgQW5kculzCiAgR2FyY+1hJ3Mgd2luMzItY2hhbmdlcy4gSW1wcm92ZWQgdGhlIGxvZ2dpbmcuCgotIEZpeGVkIHRoZSBmaWxlOi1yZWxhdGVkIHByb2dyZXNzL2dldGluZm8gc3R1ZmYgYSBiaXQgbW9yZS4KCkRhbmllbCAoNCBNYXJjaCAyMDA0KQotIEkgY29ycmVjdGVkIGEgcHJvYmxlbSB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlbiBmb2xsb3dpbmcgYSBMb2NhdGlvbjoKICBoZWFkZXIgb3Igd2hlbiBkb2luZyBtdWx0aXBsZS1yZXF1ZXN0IGF1dGhlbnRpY2F0aW9ucy4gQSBzdWJzZXF1ZW50IHJlcXVlc3QKICBjb3VsZCBlcnJvbmVvdXNseSByZS11c2UgYSBwcmV2aW91cyBjb25uZWN0aW9uIHRoYXQgd2FzIHNlbnQgd2l0aAogIENvbm5lY3Rpb246IGNsb3NlLiBDaHJpc3RvcGhlciBSLiBQYWxtZXIgcmVwb3J0ZWQuCgotIEFuZHLpcyBHYXJj7WEgcGF0Y2hlZCBjdXJsIHRvIHByZXZlbnQgd2FybmluZ3Mgd2hpbGUgY29tcGlsaW5nIHdpdGggbWluZ3csCiAgbWFpbmx5IGJlY2F1c2UgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGhhdmUgYm90aCBXSU4zMiBhbmQgSEFWRV9DT05GSUdfSAogIGRlZmluZWQuCgotIFdoZW4gdHJhbnNmZXJyaW5nIGZpbGVzIGZyb20gYSBmaWxlOiBVUkwsIHRoZSBwcm9ncmVzcyBtZXRlciBhbmQgb3RoZXIKICB0cmFuc2ZlciBtZXRyaWNzIHdlcmUgbm90IHVwZGF0ZWQgcHJvcGVybHkuCgotIERhdmlkIEJ5cm9uIHByb3ZpZGVkIGEgInZlcnNpb24gcmVzb3VyY2UiIGZpbGUgdG8gdGhlIGN1cmwgZXhlY3V0YWJsZSBmb3IKICB0aGUgd2luZG93cyBidWlsZHMuCgpEYW5pZWwgKDMgTWFyY2ggMjAwNCkKLSBEYXZpZCBCeXJvbidzIHdvcmsgb24gbWFraW5nIGxpYmN1cmwgb25seSByZXF1aXJlIHdpbnNvY2sgMS4xIG9uIFdpbmRvd3MKICBtYWNoaW5lcy4KCi0gTW9yZSB2YXJpYWJsZSBjbGVhbnVwcyBiYXNlZCBvbiBjb21waWxlciB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgVG9yIEFybnRzZW4ncwogIGF1dG9idWlsZHMgd2l0aCBNSVBTUHJvLgoKLSBKb2UgSGFscGluIGhlbHBlZCB1cyBmaXggc29tZSBwZWRhbnRpYyBjb21waWxlciB3YXJuaW5ncyBvbiBGcmVlQlNELgoKLSBBcHBsaWVkIFRvbSBCYXRlcycgcGF0Y2ggdG8gYnVpbGQgb24gbnNyLXRhbmRlbS1uc2suCgotIERhbiBGYW5kcmljaCBjb3JyZWN0ZWQgc29tZSBmbGF3cyBpbiB0aGUgY29uZmlndXJlIEdTUyBkZXRlY3Rpb24uCgpEYW5pZWwgKDIgTWFyY2ggMjAwNCkKLSBGaXhlZCB0aGUgbGliY3VybCBjb2RlIHRvIHVzZSBGT1JNQVRfT0ZGX1QgZm9yIHByaW50ZigpIGZvcm1hdHRpbmcKICBjdXJsX29mZl90IHR5cGVzIGludGVybmFsbHkuCgpEYW5pZWwgKDEgTWFyY2ggMjAwNCkKLSBBZGRlZCBDVVJMX1ZFUlNJT05fTEFSR0VGSUxFIGFzIGEgZmVhdHVyZS1iaXQgaW4gdGhlIGN1cmxfdmVyc2lvbl9pbmZvKCkKICByZXNwb25zZSwgdGhhdCBzaWduYWxzIGlmIHRoaXMgbGliY3VybCBzdXBwb3J0cyA+MkdCIGZpbGVzLiBjdXJsIC1WIG5vdwogIG91dHB1dHMgJ0xhcmdlZmlsZScgaW4gdGhlIEZlYXR1cmVzOiBmaWVsZCBpZiB0aGlzIGlzIHRoZSBjYXNlLiBNb3N0IHN5c3RlbXMKICBhcmUgbGlrZWx5IHRvIHN1cHBvcnQgdGhpcy4KCi0gV2Ugb2ZmZXIgYSBDVVJMX0ZPUk1BVF9PRkZfVCBkZWZpbmUgaW4gdGhlIHB1YmxpYyBoZWFkZXIsIHdoaWNoIGNhbiBiZSB1c2VkCiAgdG8gcHJpbnRmKCkgY3VybF9vZmZfdCB2YXJpYWJsZXMuIFdlIGFsc28gbW9kaWZpZWQgdGhlIGxpYmN1cmwgc291cmNlcyB0bwogIHVzZSB0aGlzIGRlZmluZSBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyAlT2QgYXBwcm9hY2ggKGFsdGhvdWdoIEkndmUgbGVmdCB0aGUKICBPLWZsYWcgZnVuY3Rpb25hbCBpbiB0aGUgY29kZSkuIFRoaXMgc2hvdWxkIGFsc28gcHJldmVudCBjb21waWxlcnMgdG8gd2FybgogIG9uIHRoZSBob21lLWdyb3duIG9wdGlvbi4KCi0gRml4ZWQgdGhlIHJlc3VtZS1jaGVjayBjb2RlIHRvIHRlc3QgZm9yIGEgd29ya2luZyByZXN1bWUgYXQgdGhlIGVuZCBvZiB0aGUKICBoZWFkZXJzIGFuZCBub3QgYXQgdGhlIGZpcnN0IGJvZHktYnl0ZS4KCi0gQ1VSTE9QVF9ETlNfVVNFX0dMT0JBTF9DQUNIRSBpcyBub3cgY29uc2lkZXJlZCBvYnNvbGV0ZS4gU3RvcCB1c2luZyBpdC4gSWYKICB5b3UgbmVlZCBhIGdsb2JhbCBETlMgY2FjaGUgZm9yIHdoYXRldmVyIHJlYXNvbiwgdXNlIHRoZSBzaGFyZSBpbnRlcmZhY2UgYW5kCiAgeW91J2xsIGdldCBhIGdsb2JhbCBjYWNoZSB0aGF0IHdvcmtzIHRoZSB3YXkgaXQgc2hvdWxkIHdvcmsuIFlvdSBjYW4gZXZlbgogIGhhdmUgYW55IG51bWJlciBvZiBnbG9iYWwgY2FjaGVzLCBhbGwgYXQgeW91ciBjb21tYW5kLiBUaGlzIGlzIG5vdyBhbHNvCiAgbWVudGlvbmVkIGluIHRoZSBkb2NzLgoKLSBNYWRlIHRoZSAqcHJpbnRmIGNvZGUgc3VwcG9ydCB0aGUgei1mbGFnIHRvIGVuYWJsZSBzaXplX3QgcHJpbnRmKCkgaW4gYQogIG1hbm5lciBzaW1pbGFyIHRvIGhvdyBnbGliYyBhbGxvd3MgaXQuIFRvIG1ha2UgcHJpbnRmaW5nIG9mIHRoaXMgd29yayBvbgogIHBsYXRmb3JtcyB3aXRoIDY0Yml0IHNpemVfdCBhbmQgMzJiaXQgaW50cy4gSWYgdGhlcmUgZXZlbiBhcmUgYW55ISA7LSkKCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGRpc2NvdmVyZWQgdGhhdCBpZiB5b3UgQ1VSTE9QVF9GUkVTSF9DT05ORUNUIGFuZAogIENVUkxBVVRIX05UTE0gKG9yIENVUkxBVVRIX0FOWSBhbmQgbGliY3VybCB0aGVuIHBpY2tlZCBOVExNKSwgbGliY3VybCB3b3VsZAogIGxvb3Agd2l0aG91dCBzdWNjZWVkaW5nIHRvIGF1dGhlbnRpY2F0ZSBkdWUgdG8gdGhlIG5ldyBjb25uZWN0aW9uIHRoYXQgd2FzCiAgbWFkZSBmb3IgYWxsIHJvdW5kLXRyaXBzIGluIHRoZSBhdXRoZW50aWNhdGlvbi4gTm93LCB0aGUgRlJFU0hfQ09OTkVDVCBpcwogIHJlbWFkZSB0byBvbmx5IG1hdHRlciBmb3IgdGhlIGZpcnN0IGNvbm5lY3Rpb24gbWFkZSB3aXRoIGN1cmxfZWFzeV9wZXJmb3JtKCkKICBhbmQgYWxsIHRoZSByZXN0IHRoYXQgbWlnaHQgZm9sbG93IGR1ZSB0byBGT0xMT1dMT0NBVElPTiBvciBIVFRQCiAgYXV0aGVudGljYXRpb24gYXJlIG5vdyBpZ25vcmluZyB0aGF0IG9wdGlvbi4KCi0gQWRqdXN0ZWQgdGhlIFFVSVQgY29kZSBzbGlnaHRseSBzaW5jZSBpdCBjb3VsZCBjb3JlLWR1bXAuCgotIENvcnJlY3RlZCB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdG8gcHJvdmlkZSBhIGNvcnJlY3Qgc2l6ZSB0byB0aGUKICAndmVyaWZpZWRzZXJ2ZXInIHJlcXVlc3QuCgpEYW5pZWwgKDI3IEZlYnJ1YXJ5IDIwMDQpCi0gSm9lIEhhbHBpbiBtYWRlIHRoZSBGVFAgY29kZSBzZW5kIFFVSVQgb24gdGhlIGNvbnRyb2wgY29ubmVjdGlvbiBiZWZvcmUKICBkaXNjb25uZWN0aW5nIHRoZSBUQ1AgY29ubmVjdGlvbi4gVGhpcyBpcyB3aGF0IGdvb2QtYmVoYXZpbmcgZnRwIGNsaWVudHMKICBzaG91bGQgZG8uCgpEYW5pZWwgKDI2IEZlYnJ1YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24gdXBkYXRlZCBzZXZlcmFsIGZpbGVzIHRvIG1ha2UgY3VybCBidWlsZCBmaW5lIG9uIE1TVkMgNi4gSGUKICBhbHNvIGFkZGVkIHRoZSAnYnVpbGRjb25mLmJhdCcgdGhhdCB3b3JrcyBsaWtlIHRoZSAnYnVpbGRjb25mICsgY29uZmlndXJlJwogIGNvbWJvIGRvZXMgb24gdW5peGVzLgoKLSBHaXNsZSBWYW5lbSBtYWRlIHRoZSBtZW1kZWJ1ZyBzdHVmZiBzdXBwb3J0IGNhbGxvYygpIGFzIHdlbGwuCgotIFRvciBBcm50c2VuIHBvaW50ZWQgb3V0IHRoYXQgdGVzdGN1cmwuc2ggbmVlZGVkIHRvIHJlbW92ZSB0aGUgZ2VuZXJhdGVkCiAgZmlsZXMgaW4gb3JkZXIgdG8gaGF2ZSB0aGVtIHJlLWdlbmVyYXRlZCBpbiBlYWNoIGJ1aWxkLgoKLSBBbmR5IFNlcnBhIGZvdW5kIG91dCB0aGF0IHRoZSBzaGFyZSBpbnRlcmZhY2UgZGlkIG5vdCBlbmpveSBsaWZlIHdoZW4gbm90CiAgaGF2aW5nIHRoZSBsb2NrIGFuZCB1bmxvY2sgY2FsbGJhY2tzIHNldCwgZXZlbiB0aG91Z2ggZG9jdW1lbnRlZCB0byBiZQogIE9LLiBJdCBzdGlsbCBpcyBPSywgYW5kIG5vdyB0aGUgY29kZSB3b24ndCBzZWdmYXVsdCBhbnltb3JlIQoKRGFuaWVsICgyNSBGZWJydWFyeSAyMDA0KQotIEJhc2VkIG9uIGEgcGF0Y2ggYnkgR3JlZyBIZXdnaWxsIEkgbW9kaWZpZWQgaG93IGxvbmcgbG9uZyBpcyB1c2VkIGluIHRoZQogIG1wcmludGYgY29kZSwgYXMgd2UgY2FuIHVzZSBhIDY0Yml0IHR5cGUgd2l0aCBNU1ZDIHRoYXQgaXMgYSBsb25nIGxvbmcKICBlcXVpdmFsZW50LiBUaGlzIGNvcnJlY3RzIHNvbWUgd2VpcmQgbGFyZ2UgZmlsZSBiZWhhdmlvcnMgb24gd2luZG93cy4KCi0gVG9yIEFybnRzZW4gaGVscGVkIG1lIHdvcmsgb3V0IC0tZW5hYmxlLWRlYnVnIHRvIHdvcmsgYmV0dGVyIHdpdGggZGlmZmVyZW50CiAgdmVyc2lvbnMgb2YgdGhlIGdjYyBhbmQgaWNjIGNvbXBpbGVycy4KCi0gQWRkZWQgQ1VSTE9QVF9TSEFSRSB0byB0aGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlLgoKRGFuaWVsICgyMiBGZWJydWFyeSAyMDA0KQotIEFwcGxpZWQgdGhlIGZpbmFsIHBpZWNlcyBvZiBHaXNsZSBWYW5lbSdzIHBhdGNoIHRoYXQgYnJpbmdzIGEgd29ya2luZyBuYW1lCiAgcmVzb2x2ZSB0aW1lb3V0IHRvIHRoZSB3aW5kb3dzIHZlcnNpb25zIG9mIGN1cmwhCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDQpCi0gRGF2aWQgQnlyb24ncyBmaXggdG8gYWxsb3cgdGhlIHNwZWVkLWxpbWl0IGxvZ2ljIHdvcmsgZXZlbiBpZiB5b3Ugc2V0CiAgbGltaXQtcmF0ZS4gSXQgZG9lcyB3b3JrIG9uIHRoZSBleHBlbnNlIG9mIHRoZSByYXRlIGxpbWl0ZXIuCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDQpCi0gY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIHdpdGggZ2NjIG5vdyBhbHNvIHRyaWVzIHRvIGRldGVjdCB0aGUgaWNjIGNvbXBpbGVyCiAgKHdoaWNoIHNvbWVob3cgZ2V0cyB0cmVhdGVkIGFzIGlmIGl0IGlzIGEgZ2NjKSB0byBzdG9wIHVzaW5nIGFsbCB0aGUgZ2NjCiAgb3B0aW9ucyB3aXRoIGl0LCBhbmQgd2UgYWxzbyBwcm92aWRlIC1pc3lzdGVtIG9wdGlvbnMgZm9yIGVhY2ggZXh0cmEgLUkKICBvcHRpb24gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaGFzIGZpZ3VyZWQgb3V0IChmb3IgT3BlblNTTCwga2VyYmVyb3MsIHpsaWIsCiAgSGVpbWRhbCBldGMpLiBUaGlzIG9mIGNvdXJzZSB0byBwcmV2ZW50IHdhcm5pbmdzIG9uIGhlYWRlcnMgd2UgZG9uJ3QgaGF2ZQogIGNvbnRyb2wgb2YuCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDQpCi0gRG91ZyBQb3J0ZXIgbWFkZSBsaWJjdXJsIHVzZSB0aGUgSE9NRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgdGhlCiAgZ2V0cHd1aWQgcmVzdWx0cyB3aGVuIGxvb2tpbmcgZm9yIC5uZXRyYyBmaWxlcy4KCi0gSWYgJ2NvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZycgaXMgdXNlZCB3aXRoIGdjYywgaXQgbm93IGNoZWNrcyB3aGljaCBnY2MKICB2ZXJzaW9uIGl0IGlzIGFuZCB1c2VzIGFzIHBpY2t5IGNvbXBpbGVyIG9wdGlvbnMgYXMgcG9zc2libGUgZm9yIHRoZQogIHBhcnRpY3VsYXIgdmVyc2lvbi4KCi0gQ29kZSB0aGF0IGNhbiBiZSB1c2VkIGluIGJvdGggdGhlIGxpYiBhbmQgaW4gdGhlIGN1cmwgYXBwIGlzIG5vdyBtYWRlIHRvIHVzZQogIHRoZSBjdXJseF8gcHJlZml4LiBUaGUgZmlyc3QgZnVuY3Rpb24gdG8gYmUgYXZhaWxhYmxlIGxpa2UgdGhpcyBpcyB0aGUKICBjdXJseF9zdHJ0b2xsKCkgZnVuY3Rpb24uIFRoaXMgaXMgbWFkZSB0byBhbGxvdyB0aGUgYXBwIHRvIHVzZSBleGlzdGluZyBjb2RlLAogIGJ1dCB3aXRob3V0IHBvbGx1dGluZyB0aGUgbGliY3VybCBBUEkuIEZ1cnRoZXIgZXhwbGFuYXRpb25zIHBvc3RlZCBoZXJlOgoKICAgIGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNC0wMi8wMjE1Lmh0bWwKCkRhbmllbCAoMTggRmVicnVhcnkgMjAwNCkKLSBGaXhlZCBidWlsZGNvbmYgdG8gbm90IHVzZSAid2hpY2giIGFzIEFJWCBhbmQgVHJ1NjQgaGF2ZSB3aGF0IGhhdmUgYmVlbgogIHJlZmVycmVkIHRvIGFzICJob3JyaWJseSBicm9rZW4gJ3doaWNoJyBwcm9ncmFtcyIuCgotIE1hZGUgc3VyZSBkbnMgY2FjaGUgdGltZW91dCBzZXQgdG8gLTEgcmVhbGx5IG1lYW5zIGNhY2hpbmcgZm9yZXZlci4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwNCkKLSBNYWRlIGl0IHBvc3NpYmx5IHRvIGJ1aWxkIGMtYXJlcyB3aXRoIHRoZSBsaWJjdXJsIG1lbWRlYnVnIHN5c3RlbSB0byBiZXR0ZXIKICB0cmFjayBtZW1vcnkuCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDQpCi0gV2hlbiB1c2luZyBhcmVzLCB3ZSBub3cgaW5pdGlhbGl6ZSB0aGUgYXJlcyAnY2hhbm5lbCcgaW4gY3VybF9lYXN5X2luaXQoKQogIGFuZCByZS11c2UgdGhhdCBzYW1lIGhhbmRsZSBkdXJpbmcgdGhlIGVudGlyZSBjdXJsIGhhbmRsZSdzIGxpZmUtdGltZS4gSXQKICBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KCi0gRml4ZWQgYSBwcm9ibGVtIHdoZW4gZGlzcGxheWluZyB2ZXJib3NlIGZvciBpcHY2LWVuYWJsZWQgbGliY3VybHMgYW5kCiAgcmUtdXNlZCBjb25uZWN0aW9ucy4gUHJvYmxlbSByZXBvcnRlZCBhbmQgZml4IHZlcmlmaWVkIGJ5IEdyaWdvcnkgRW50aW4uCgotIEplZmYgTGF3c29uIGZpeGVkIHRoZSB2ZXJzaW9uLWNoZWNrIGluIHRoZSBTT0NLUzUgY29kZS4KCkRhbmllbCAoMTUgRmVicnVhcnkgMjAwNCkKLSBGaXhlZCBhIGNhc2Ugd2hlcmUgYSBob3N0IGNhY2hlIGVudHJ5IHdhcyBub3QgZmxhZ2dlZCBpbi11c2UgcHJvcGVybHkgd2hlbiBhCiAgY2FjaGVkIGVudHJ5IHdhcyB1c2VkLgoKLSBBbmRy6XMgR2FyY+1hJ3MgcGF0Y2ggdGhhdCBjaGVja3MgZm9yIHdpbm1tIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHdhcwogIGFwcGxpZWQuCgpEYW5pZWwgKDEzIEZlYnJ1YXJ5IDIwMDQpCi0gQmVuIEdyZWVhcidzIFNPX0JJTkRUT0RFVklDRSBwYXRjaCBmb3IgdGhlIGJpbmRpbmcgb2YgdGhlIGxvY2FsIGVuZCB0byBhCiAgc3BlY2lmaWMgbmV0d29yayBpbnRlcmZhY2UuCgotIEdyZWcgSGV3Z2lsbCBmb3VuZCBvdXQgdGhhdCB0aGUgdmFyaWFibGUgaG9sZGluZyAnY29udGVudGxlbmd0aCcgd2Fzbid0IGJpZwogIGVub3VnaCB0byBob2xkIGEgbGFyZ2UgZmlsZSEKCi0gVG9yIEFybnRzZW4gZml4ZWQgYSA2NGJpdC1yZWxhdGVkIHByb2JsZW0gaW4gZGF0ZS1yZWxhdGVkIGNvZGUgaW4gdGhlIGZ0cAogIGRlcGFydG1lbnQsIGFuZCB0aGVyZSB3YXMgYW5vdGhlciBwb3RlbnRpYWwgcHJvYmxlbSBpbiB0aGUgbmFtZSByZXNvbHZlIGNvZGUKICB0b28uCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDQpCi0gUmVtb3ZlZCBhIGZldyB2YXJpYWJsZXMgdGhhdCB3ZXJlIG9ubHkgc2V0IGJ1dCBuZXZlciB1c2VkLCBhcyBzb21lIGNvbXBpbGVycwogIHdhcm4gYWJvdXQgdGhhdCBhbmQgd2UgZG8gbm90IGxpa2UgY29tcGlsZXIgd2FybmluZ3MhCgotIFJlbW92ZWQgdGhlIG5lZWQgZm9yIHN5bWxpbmtzIGluIHRoZSB0ZXN0cy9kYXRhIGRpcmVjdG9yeSBpZiBjdXJsIGlzIGJ1aWx0CiAgb3V0c2lkZSBvZiB0aGUgc291cmNlIGRpcmVjdG9yeSBhbmQgdGhlICdtYWtlIHRlc3QnIGlzIHVzZWQuIFRoaXMgd2FzIGRvbmUKICBieSBwcm92aWRpbmcgYSAic291cmNlIGRpciBwYXRoIiB0byB0aGUgc2NyaXB0cy9zZXJ2ZXJzLgoKLSBOb3csIGlmIHRoZSBjb25maWd1cmUgc2NyaXB0IGNhbid0IGZpbmQgYW4gbnJvZmYgdG9vbCBvciBhbiBvcHRpb24gdG8gbnJvZmYKICB0byB1c2UgdG8gY29udmVydCBtYW4gcGFnZXMgd2l0aCwgaXQgd2lsbCBjb21wbGV0ZWx5IHN3aXRjaCBvZmYgdGhlIGJ1aWx0LWluCiAgbWFudWFsLgoKLSAnY29uZmlndXJlIC0tZGlzYWJsZS1tYW51YWwnIGNvbXBsZXRlbHkgZGlzYWJsZXMgdGhlIGJ1aWx0LWluIG1hbnVhbCBmcm9tCiAgdGhlIGN1cmwgY29tbWFuZCB0b29sLgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBhIG1pbm9yIHNvdXJjZSBlZGl0LCBhbmQgbm93CiAgaGUgaGFzIG1hbmFnZWQgdG8gZ2V0IG1zeXMvbWluZ3cgdG8gcnVuIGNvbmZpZ3VyZSBhbmQgdGhlbiBidWlsZCEKCkRhbmllbCAoOSBGZWJydWFyeSAyMDA0KQotIFRoZSBkZWZhdWx0IEhUVFAgQWNjZXB0OiBoZWFkZXIgd2FzIG1vZGlmaWVkIHRvIHRoZSBtdWNoIHNpbXBsZXIKICAiQWNjZXB0OiAqLyoiLgoKLSBQIFIgU2NoYWZmbmVyIHVwZGF0ZWQgdGhlIGN1cmwtc3NsIHNwZWMgZmlsZSBmb3IgUlBNcy4KCi0gRG9taW5pY2sgTWVnbGlvIGJyb3VnaHQgbG90cyBvZiBkb2N1bWVudGF0aW9uIGZvciB0aGUgc2hhcmUgaW50ZXJmYWNlJ3MgbWFuCiAgcGFnZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgbWlzc2luZy4KCi0gVG9yIEFybnRzZW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgd29yay1hcm91bmQgYSBidWcgaW4gdGhlCiAgQUlYNSBpbXBsZW1lbnRhdGlvbiBvZiBnZXRhZGRyaW5mbygpLiBUaGlzIG1ha2VzIHRoZSBGVFAgUE9SVCBzdHVmZiB3b3JrIG9uCiAgaXB2Ni1lbmFibGVkIEFJWCBidWlsZHMuCgotIEtlbiBSYXN0YXR0ZXIgcHJvdmlkZWQgcG9ydGFiaWxpdHkgZml4ZXMgZm9yIHRoZSBjdXJsZ3RrLmMgZXhhbXBsZSwgYW5kIG5vdwogIGl0IHJ1bnMgb24gd2luZG93cyB3aXRoIEdUSyBhcyB3ZWxsIQoKRGFuaWVsICg2IEZlYnJ1YXJ5IDIwMDQpCi0gQW5kculzIEdhcmPtYSBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGZpbmQgZ2V0aG9zdGJ5bmFtZSgpIGZpbmUgd2hlbiBydW4KICB3aXRoIG1pbmd3IG9uIHdpbmRvd3MuCgotIE1vZGlmaWVkIHRoZSBsZGFwIGNvZGUgdG8gdXNlIHByb3BlciBmdW5jdGlvbiBwb2ludGVycyBhbGwgb3ZlciAoaW5zdGVhZCBvZgogIG1peGVkIGRhdGEgYW5kIGZ1bmN0aW9uIHBvaW50ZXJzKSB0byB3b3JrLWFyb3VuZCB0aGUgcGlja3kgTUlQU1BybyBjb21waWxlcgogIHdhcm5pbmdzLgoKLSBBIGN1c3RvbSBIb3N0OiBoZWFkZXIgaXMgb25seSBjb25zaWRlcmVkIGlmIHRoZSByZXF1ZXN0IGlzIG5vdCBtYWRlIGJ5CiAgZm9sbG93aW5nIGEgbG9jYXRpb24uIEFmdGVyIGRpc2N1c3Npb25zIHdpdGggVGltIEJha2VyLgoKRGFuaWVsICg1IEZlYnJ1YXJ5IDIwMDQpCi0gVGhlIGxpYnogcGFydCBvZiB0aGUgY29uZmlndXJlIHNjcmlwdCBub3cgb25seSBzZXQgdGhlIHR3byBsaWJ6LXJlbGF0ZWQKICBkZWZpbmUgSEFWRV9aTElCX0ggYW5kIEhBVkVfTElCWiBpZiBib3RoIHRoZSBsaWIgYW5kIHRoZSBoZWFkZXIgaXMgZm91bmQuCiAgSWYgb25lIGlzIG1pc3NpbmcsIG5vbmUgb2YgdGhlIGRlZmluZXMgaXMgc2V0LgoKLSBBbmRy6XMgR2FyY+1hIGZpeGVkIHRoZSBNaW5ndyBtYWtlZmlsZXMuCgotIExlbiBLcmF1c2UgcmVwb3J0ZWQgdGhhdCBjdXJsIDcuOS5YIGNvdWxkIGRvIHVwbG9hZGluZyBmcm9tIHN0ZGluIHdpdGhvdXQKICBkb2luZyBjaHVua2VkIGVuY29kaW5nLCB3aGljaCBjdXJyZW50IGN1cmwgY2Fubm90IGRvIGV2ZW4gaWYgeW91IGRpc2FibGUKICB0aGUgdHJhbnNmZXItZW5jb2RpbmcgY2h1bmtlZCBoZWFkZXIuIE5vdyBpdCBjYW4gYWdhaW4sIGFuZCB0ZXN0IGNhc2UgOTgKICB2ZXJpZmllcyB0aGlzIGZ1bmN0aW9uYWxpdHkuCgotIFRvciBBcm50c2VuIGZpeGVkIGEgd2VpcmQgZ2V0YWRkcmluZm8oKSB1c2FnZSBpbiB0aGUgRlRQIGNvZGUsIHByZXZlbnRpbmcKICB0aGUgaXB2Ni1jb2RlIGZvciBQT1JUIHdvcmsgb24gQUlYIDUuMi4gV2Ugbm93IGFsc28gcHJvdmlkZSAoYmV0dGVyKSBlcnJvcgogIG1lc3NhZ2VzIHdoZW4gYmFpbGluZyBvdXQgaW4gdGhlIHRoYXQgZnVuY3Rpb24uCgotIFRvciBBcm50c2VuIG5vdyBwcm92aWRlcyBBSVggYW5kIElSSVggKHVzaW5nIGdjYywgeGxjIGFuZCB0aGUgTUlQU1BybwogIGNvbXBpbGVycykgYXV0b21hdGVkIGJ1aWxkIGxvZ3MgKGh0dHA6Ly9jdXJsLmhheHguc2UvYXV0by8pIGFuZCB3ZSd2ZSBmaXhlZAogIG51bWVyb3VzIG1pbm9yIHF1aXJrcyB0byBtYWtlIGxlc3Mgd2FybmluZ3MgYXBwZWFyLgoKRGFuaWVsICg0IEZlYnJ1YXJ5IDIwMDQpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBHaWxhZCwgd2Ugbm93IHVzZSB0aGUgY3VzdG9tIHRpbWVvdXRzIHdoZW4gd2FpdGluZyBmb3IgYQogIHNlcnZlciB0byBjb25uZWN0IHdoZW4gdXNpbmcgRlRQIFBPUlQuIFByZXZpb3VzbHkgd2UgYWx3YXlzIHdhaXRlZCAxMAogIHNlY29uZHMsIG5vIG1vcmUgbm8gbGVzcy4gV2Ugbm93IGFsc28gY2hhbmdlZCB0aGUgZGVmYXVsdCAoaWYgbm8gdGltZW91dCBpcwogIHNldCkgdG8gd2FpdCA2MCBzZWNvbmRzIGZvciB0aGUgY29ubmVjdCBiZWZvcmUgd2UgZmFpbC4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDA0KQotIE1vZGlmaWVkIHRvIGxpbmsgd2l0aCBjLWFyZXMgaW5zdGVhZCBvZiBhcmVzLgoKRGFuaWVsICgyIEZlYnJ1YXJ5IDIwMDQpCi0gQWRkZWQgYSBjb25maWd1cmUgdGVzdCB0byBjaGVjayBmb3Igd2hpY2ggb3B0aW9uIHRoZSAoZylucm9mZiB0b29sIHdhbnRzCiAgdG8gZXh0cmFjdCBwbGFpbiB0ZXh0IGZyb20gdGhlIG1hbiBwYWdlcy4gVG9yIEFybnRzZW4gdG9sZCB1cyB0aGUgQUlYCiAgdmVyc2lvbiBvZiBHTlUgZ25yb2ZmIGRvZXNuJ3Qgc3VwcG9ydCAtbWFuIQoKLSBBZGRlZCBhbiB1bmRlZiBvZiBhY2NlcHQgaW4gbWVtZGVidWcuaCB0byBtYWtlIGN1cmwgYnVpbGQgd2l0aCAtLWVuYWJsZS1kZWJ1ZwogIG9uIEFJWCA1LjIgd2hpY2ggc2VlbXMgdG8gaGF2ZSBhY2NlcHQgZGVmaW5lZC4gUmVwb3J0ZWQgYnkgVG9yIEFybnRzZW4uCgotIGN1cmxfdmVyc2lvbigpIG5vdyBpbmNsdWRlcyBjLWFyZXMgdmVyc2lvbiBpbmZvLCBhbmQgY3VybF92ZXJzaW9uX2luZm8oKSBub3cKICByZXR1cm5zIGEgc3RydWN0IHdpdGggdmVyc2lvbiBTRUNPTkQgdGhhdCBhbHNvIGluY2x1ZGVzIHRoYXQgaW5mby4KCi0gV2UgYXJlIG5vdyBvZmZpY2lhbGx5IHVzaW5nIGMtYXJlcyBmb3IgYXN5bmNoIG5hbWUgcmVzb2x2ZXMuIGMtYXJlcyBpcyB0aGUKICBuZXcgbGlicmFyeSwgYmFzZWQgb24gdGhlIGV4aXN0aW5nIGFyZXMgYnV0IHdpdGggYW4gZXh0ZW5kZWQgYW5kIHNsaWdodGx5CiAgbW9kaWZpZWQgQVBJLgoKLSBEaXJrIGltcHJvdmVkIHRoZSBhcmVzIHRpbWVvdXQgY29kZSwgYW5kIG5vdyB3ZSBhbHNvIGluY2x1ZGUgdGhlIGFyZXMgZXJyb3IKICBzdHJpbmcgd2hlbiB3ZSBmYWlsIHRvIHJlc29sdmUgYSBuYW1lLgoKLSBBbm90aGVyIHR3ZWFrIHRvIG1ha2UgdGVzdCBjYXNlIDkxIHJ1biBmaW5lLiBOb3cgd2UgaGF2ZSBhbm90aGVyIGJpdCBvbiBhCiAgY29ubmVjdGlvbiB0aGF0IGlzIHNldCB0cnVlIGlmIHRoZSBjb25uZWN0aW9uIGlzIG1hcmtlZCBmb3IgJ3JldHJ5Jy4gVGhhdAogIG1ha2VzIHRoZSBjb25uZWN0aW9uIGdldCBjbG9zZWQgYW5kIHJlLW9wZW5lZCBhbmQgdGhlIEhUVFAtZG9uZSBjb2RlIG11c3QKICBub3QgY29tcGxhaW4gb24gdGhlIGZhY3QgdGhhdCBubyBkYXRhIHdhcyByZWNlaXZlZC4KCi0gQmFzZWQgb24gRGlyayBNYW5za2UncyBwYXRjaCwgSSBtb2RpZmllZCB0aGUgbmFtZSByZXNvbHZpbmcgd2l0aCBhcmVzIHRvCiAgZmVhdHVyZSBhIHRpbWVvdXQgZm9yIHJlYWxseSBzbG93IGxvb2t1cHMuIEl0IG5vdyBkZWZhdWx0cyB0byAzMDAgc2Vjb25kcywKICBidXQgaXMgbm93IGFkanVzdGVkIHRvIHRoZSBDT05ORUNUVElNRU9VVC9USU1PVUUgdGltZW91dHMgaWYgb25lIG9mIHRoZW0KICBpcyBzZXQuCgotIEZpeGVkIHRoZSBpbmNsdXNpb24gb2YgY2EtYnVuZGxlLmggdG8gcmVhbGx5IHVzZSB0aGUgb25lIGluIHRoZSBidWlsZCBkaXIKICBiZWZvcmUgdGhlIG9uZSBpbiB0aGUgc291cmNlIGRpci4gRG9tZW5pY28gQW5kcmVvbGkgZm91bmQgb3V0IGFuZCByZXBvcnRlZC4KCi0gQWRkZWQgdGVzdCBjYXNlIDk3LCBhIHNpbXBsZSBQT1NUIHdpdGggYSBjdXN0b20gQ29udGVudC1UeXBlIGhlYWRlcgogIHJlcGxhY2luZyB0aGUgb3JpZ2luYWwgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIG9uZS4KCkRhbmllbCAoMzAgSmFudWFyeSAyMDA0KQotIEFkZGVkIGNvZGUgdGhhdCBhdHRlbXB0cyB0byBmaXggdGhlIHRlc3QgOTEgZmFpbHVyZS4gQXMgaGFzIGJlZW4gZmlndXJlZCBvdXQKICBieSBQYXRyaWNrIFNtaXRoLCB0aGUgZXJyb3IgaGFwcGVucyBiZWNhdXNlIHdlIHJlLXVzZSBhIGNvbm5lY3Rpb24gdGhhdCB0aGUKICBzZXJ2ZXIgaXMganVzdCBhYm91dCB0byBjbG9zZSBhbmQgd2UgZXZlbiBtYW5hZ2UgdG8gc2VuZCBhd2F5IHRoZSByZXF1ZXN0CiAgd2l0aG91dCBzZWVpbmcgYW4gZXJyb3IuIE9uIHRoZSBmaXJzdCByZWFkIGF0dGVtcHQgd2UgZ2V0IGEgRUNPTk5SRVNFVC4KICBTdGFydGluZyBub3csIHdlIGF0dGVtcHQgdG8gZGV0ZWN0IHRoaXMgYW5kIGlmIHNvLCB3ZSByZXRyeSB0aGUgcmVxdWVzdCBvbiBhCiAgZnJlc2ggY29ubmVjdGlvbi4KCi0gSSBhZGRlZCB0ZXN0IGNhc2UgNTEwIHdoaWNoIGlzIGEgY3VzdG9tIHByb2dyYW0gdGhhdCBkb2VzIGEgUE9TVCB1c2luZyBhCiAgcmVhZCBjYWxsYmFjaywgd2l0aCBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLgoKLSBBZGp1c3RlZCBvbmUgb2YgdGhlIE1QRS9pWCBjaGFuZ2VzIGFzIGl0IG1hZGUgdGVzdCBjYXNlIDUwNCBmYWlsIGFsbCBvdmVyLgoKLSBBZGRlZCAtLXNvY2tzIGFzIGEgcmVjb2duaXplZCBvcHRpb24uIEl0IHdvcmtzIGp1c3QgbGlrZSAtLXByb3h5IGJ1dCBzZXRzIGEKICBTT0NLUzUgcHJveHkgdG8gdXNlLiBTT0NLUzUgc3VwcG9ydCBoYXMgYmVlbiBhdmFpbGFibGUgaW4gbGliY3VybCBmb3IgYQogIHdoaWxlLCBqdXN0IG5vdCBwcm92aWRlZCBieSB0aGUgY3VybCB0b29sLiBUaGlzIGRvZXMgbm90IGN1cnJlbnRseSB3b3JrIGZvcgogIElQdjYtZW5hYmxlZCBsaWJjdXJscy4KCkRhbmllbCAoMjkgSmFudWFyeSAyMDA0KQotIFN0YWRsZXIgU3RlcGhhbiBwb2ludGVkIG91dCB0aGF0IHNyYy9odWdlaGVscC5jIGluY2x1ZGVkIGNvbmZpZy5oIHdpdGhvdXQKICBjaGVja2luZyB0aGUgZGVmaW5lIGlmIGl0cyBwcmVzZW50Li4uCgotIEtlbiBIaXJzY2ggcHJvdmlkZWQgcGF0Y2hlcyB0byBtYWtlIGN1cmwgYnVpbGQgZmluZSBvbiB0aGUgTVBFL2lYIG9wZXJhdGluZwogIHN5c3RlbS4KCi0gRGFuIEZhbmRyaWNoIGNvbXBpbGVkIGN1cmwgd2l0aCBsb3RzIG9mIGFnZ3Jlc3NpdmVseSBwZWRhbnRpYyBjb21waWxlcgogIG9wdGlvbnMgYW5kIHRodXMgZm91bmQgYSBmZXcgbWlub3IgZXJyb3JzIGFuZCBkaWQgc29tZSBnZW5lcmFsIGNsZWFudXBzIHRvCiAgYXZvaWQgdGhlbS4KCi0gRGlyayBNYW5za2UgZml4ZWQgYSBmbGF3IGluIGFyZXMgdGhhdCBwcmV2ZW50ZWQgaXQgdG8gdXNlIG5vbi1ibG9ja2luZwogIHNvY2tldHMgcHJvcGVybHkuCgpEYW5pZWwgKDI4IEphbnVhcnkgMjAwNCkKLSBSaWNoYXJkIEJyYW1hbnRlIGZpeGVkIGNodW5rZWQgdHJhbnNmZXItZW5jb2RlZCAidXBsb2FkcyIgdG8gc2VuZCBhIGZpbmFsCiAgQ1JMRiBjb21ibyBwcm9wZXJseS4KCkRhbmllbCAoMjcgSmFudWFyeSAyMDA0KQotIE1hZGUgdGhlIHJlc3BvbnNlLWhlYWRlcnMgZHVyaW5nIGEgQ09OTkVDVCByZXF1ZXN0IHRvIGEgcHJveHkgZ2V0IHBhc3NlZCBvbgogIGFzIHJlZ3VsYXIgaGVhZGVycywgc28gdGhleSBhcHBlYXIgd2l0aCAtaS8tSSBvcHRpb25zIGFuZCBzaW1pbGFyLgoKLSBCYXNlZCBvbiBhIHBhdGNoIGJ5IEdpc2xlIFZhbmVtLCBJJ3ZlIG1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIGRpc3BsYXkKICBwcm9wZXJseSBzd2l0Y2ggdG8gYSBHQi1kaXNwbGF5IHdoZW4gbW9yZSB0aGFuIDk5OTlNQiBoYXZlIGJlZW4gdHJhbnNmZXJlZC4KCkRhbmllbCAoMjMgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIHBvaW50ZWQgb3V0IGEgY3VybHJjIHBhcnNlciBwcm9ibGVtL2NyYXNoIHdoZW4gYW4gb3B0aW9uIHdpdGggYQogIHJlcXVpcmVkIGRpZG4ndCBoYXZlIG9uZSBhbmQgd2FzIG9uIHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlLgoKLSBNb3JlIFdpbmRvd3MgZml4ZXMgZm9yIGxhcmdlIGZpbGVzLiBXZSBub3cgYnVpbGQgYW5kIGxpbmsgd2l0aAogIC4uL2xpYi9zdHJ0b29mZnQuYyBpbiB0aGUgYXBwIGNvZGUgc2luY2UgQ3VybF9zdHJ0b2xsKCkgaXMgbm90IGEgcHJvdmlkZWQKICBsaWJjdXJsIGZ1bmN0aW9uLi4uIFBlcmhhcHMgd2Ugc2hvdWxkIGNvbnNpZGVyIGEgJ2NvbW1vbicgZGlyIG9yIHNpbWlsYXIKICB3aGVyZSB3ZSBwdXQgc291cmNlIGNvZGUgdXNlZCBpbiBib3RoIHRoZSBsaWIgYW5kIHRoZSBjbGllbnQuIE9yIHBlcmhhcHMKICB3ZSdsbCBqdXN0IG1ha2UgdGhpcyBmdW5jdGlvbiBhdmFpbGFibGUgaW4gdGhlIGxpYnJhcnkuLi4KCi0gVmluY2VudCBCcm9ubmVyIGZvdW5kIG91dCB0aGUgc29ja3M1IGNvZGUgY3Jhc2hlZCB3aGVuIG5vIHVzZXJuYW1lIHdhcwogIHNldC4KCi0gVmluY2VudCBCcm9ubmVyIHNwb3R0ZWQgYSBwcm9ibGVtIHdpdGggcHJveHkgdXNlcm5hbWUvcGFzc3dvcmQgd2hlbiByZS11c2luZwogIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uLgoKLSBGaXhlZCB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZGlzcGxheSBmb3IgZmlsZXMgbGFyZ2VyIHRoYW4gMl4zMSBieXRlcy4gR2lzbGUKICBWYW5lbSByZXBvcnRlZC4KCkRhbmllbCAoMjIgSmFudWFyeSAyMDA0KQotIEdpc2xlIFZhbmVtIG1hZGUgc3RydG9sbCgpIGdldCB1c2VkIHdoZW4gY3VybCBpcyBidWlsdCB3aXRoIHRoZSBtaW5ndwogIGNvbXBpbGVyLgoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgY29tcHJlc3NlZCBoZWxwIHRleHQgY29kZSB0byBkaXNwbGF5IHByb3Blcmx5LgoKLSBSZW1vdmVkIHRoZSAnI2RlZmluZSBIdHRwUG9zdCcgZnJvbSB0aGUgcHVibGljIGhlYWRlciBmaWxlLCBhcyBjdXJsX2h0dHBwb3N0CiAgaXMgdGhlIHByb3BlciBuYW1lIGFuZCBpdCBoYXMgYmVlbiBmb3IgcXVpdGUgc29tZSB0aW1lIG5vdy4gRml4ZXMgYW5vdGhlcgogIG5hbWUgc3BhY2UgcG9sbHV0aW9uLgoKLSBBZGRlZCAnY3VybF9vZmZfdCcgdHlwZWRlZiBpbiB0aGUgcHVibGljIGhlYWRlciBmaWxlLCB0byBiZSB1c2VkIHRvIHByb3ZpZGUKICBsYXJnZSBmaWxlIHNpemVzIHRvIHRoZSAqX0xBUkdFIG9wdGlvbnMuIEFkanVzdGVkIHRoZSBjb2RlIGFsbCBvdmVyIHRvIHVzZQogIHRoaXMgdmFyaWFibGUgdHlwZSBpbnN0ZWFkIG9mICdvZmZfdCcuIFRoaXMgaXMgYW4gYXR0ZW1wdCB0byBtYWtlIHRoZSBsYXJnZQogIGZpbGUgc3VwcG9ydCB3b3JrIG9uIG1vcmUgcGxhdGZvcm1zLiBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgY2hlY2tzIHRoZQogIHNpemUgb2YgdGhlIGN1cmxfb2ZmX3QgaW5zdGVhZCBvZiB0aGUgcGxhaW4gb2ZmX3QuCgpWZXJzaW9uIDcuMTEuMCAoMjIgSmFudWFyeSAyMDA0KQoKRGFuaWVsICgyMSBKYW51YXJ5IDIwMDQpCi0gUmVtb3ZlZCB0aGUgZGVmaW5lcyBpbiB0aGUgcHVibGljIGhlYWRlciBmaWxlIHdpdGggVElNRUNPTkRfIHByZWZpeGVzLiBUaGV5CiAgaGF2ZSBiZWVuIG9ic29sZXRlIHNpbmNlIEFwcmlsIDIybmQgMjAwMiwgYW5kIGlmIHRoaXMgY2F1c2VzIGFueW9uZSBhbnkKICBwcm9ibGVtcyBub3cgaXQgaXMgdmVyeSBlYXN5IHRvIGp1c3QgYWRkIENVUkxfIHRvIHRoZSBuYW1lcy4gVGhpcyBjb3JyZWN0cwogIHRoaXMgbmFtZSBzcGFjZSBwb2xsdXRpb24uCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwNCkKLSBEYXZpZCBCeXJvbiBjbGVhbmVkIHVwIGhvdyAtLXRyYWNlIHdpdGggbm8gb3B0aW9uIHdhcyB0cmVhdGVkLCBhbmQgYWxzbwogIGFyZ3VtZW50cyBpbiBhIGNvbmZpZyBmaWxlIHdpdGhvdXQgYSByZXF1aXJlZCBwYXJhbWV0ZXIhCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNCkKLSBHaXNsZSBWYW5lbSBmaXhlZCBhIGZldyBpc3N1ZXMgd2hlcmUgY29tcGlsZXJzIHdhcm5lZCBhYm91dCB2YXJpYWJsZXMKICBwb3NzaWJseSBiZWluZyB1c2VkIHVuYXNzaWduZWQuCgotIE1pbm9yIEludGVyaXggYnVpbGQgcHJvYmxlbSBmaXhlZC4KCkRhbmllbCAoMTUgSmFudWFyeSAyMDA0KQotIFBldGVyIFN5bHZlc3RlciBwb2ludGVkIG91dCBzb21lIG5lY2Vzc2FyeSBlc2NhcGluZyBuZWVkZWQgaW4gdGhlCiAgYWNpbmNsdWRlLm00IGZpbGUgd2hlbiBhdXRvbWFrZSAxLjggb3IgbGF0ZXIgaXMgdXNlZC4KCkRhbmllbCAoMTQgSmFudWFyeSAyMDA0KQotIFZpbmNlbnQgQnJvbm5lciBmaXhlZCB0aGUgQ3VybF9yZXNvbHYoKSByZXR1cm4gY29kZS4gVGhpcyBleHRlbmRzIHRoZSBmaXgKICBTdGV2ZSBHcmVlbiBwcm92aWRlZCBvbiBkZWNlbWJlciAzLi4uCgpEYW5pZWwgKDEzIEphbnVhcnkgMjAwNCkKLSBMdWtlIENhbGwgbWFkZSB0aGUgd2luMzIgdmVyc2lvbiBvZiB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nIGZ1bmN0aW9uIHN1cHBvcnQKICBiYWNrc3BhY2UuCgotIERhbiBGYW5kcmljaCBmaXhlZCB0aGUgaHVnZWhlbHAgc291cmNlIGZpbGUgdG8gY29udGFpbiBib3RoIGEgY29tcHJlc3NlZCBhbmQKICBhbiB1bmNvbXByZXNzZWQgdmVyc2lvbiBpbiB0aGUgZGlzdHJpYnV0aW9uLCBzbyB0aGF0IG1vcmUgcGVvcGxlIGVhc2llciBjYW4KICBidWlsZCBjdXJsIHdpdGggdGhlIGNvbXByZXNzZWQgdmVyc2lvbi4KCi0gRGllZ28gQ2Fzb3JyYW4gYnJvdWdodCBhbm90aGVyIEFtaWdhT1MgYnVpbGQgcGF0Y2ggZm9yIG5hdGl2ZSBBbWlnYSBidWlsZHMuCgotIE1hdHQgVmVlbnN0cmEgdXBkYXRlZCB0aGUgTWFjIE9TIFggZnJhbWV3b3JrIGZpbGVzLgoKLSBCcmlhbiBSIER1ZmZ5IGJyb3VnaHQgYSBzZWN0aW9uIHRvIHRoZSBJTlNUQUxMIGZpbGUgb24gaG93IHRvIGJ1aWxkIGEKICBTU0wtZW5hYmxlZCBjdXJsIHVzaW5nIHRoZSBmcmVlIEJvcmxhbmQgQysrIGNvbXBpbGVyLiBIZSBhbHNvIHVwZGF0ZWQgdGhlCiAgQm9ybGFuZCBsaWIvTWFrZWZpbGUuYjMyLgoKLSBJIGZpeGVkIHRoZSB0ZXN0IGNhc2UgNTA5IHdoaWNoIEkgYnJva2UgeWVzdGVyZGF5LiBOb3cgdGhlIGxpYnRlc3QgYXJlCiAgY29tcGlsZWQgd2l0aCBhbiBpbmNsdWRlIHBhdGggdGhhdCBwb2ludHMgdG8gdGhlIGxpYnJhcnkncyBzb3VyY2UgZGlyLCBzbwogIHRoYXQgdGhlIGxpYnRlc3RzIGNhbiBpbmNsdWRlIGZpbGVzIGZyb20gdGhlIHNvdXJjZSB0cmVlLiBUaGlzIHdhcyBtYWRlIHRvCiAgbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgdGhlIFVTRV9TU0xFQVkgZGVmaW5lIGluIHRoZSBsaWJyYXJ5IHRlc3QgZmlsZXMuCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNCkKLSBQZXRlciBTeWx2ZXN0ZXIgYnJvdWdodCBjb2RlIHRoYXQgbm93IGFsbG93cyBhIGNhbGxiYWNrIHRvIG1vZGlmaWVkIHRoZSBVUkwKICBldmVuIHdoZW4gdGhlIG11bHRpIGludGVyZmFjZSBpcyB1c2VkLCBhbmQgdGhlbiBsaWJjdXJsIHdpbGwgc2ltdWxhdGUgYQogICJmb2xsb3cgbG9jYXRpb24iIHRvIHRoYXQgbmV3IFVSTC4gVGVzdCA1MDkgd2FzIGFkZGVkIHRvIHRlc3QgdGhpcyBmZWF0dXJlLgoKLSBFeHRlbmRlZCB0aGUgdGltZSB3ZSByZXRyeSBzZXJ2ZXJzIGluIHRoZSB0ZXN0IHNjcmlwdCwgYW5kIEkgYWxzbyBtYWRlIGl0CiAgcmV0cnkgdGhlIGh0dHBzIGFuZCBmdHBzIHNlcnZlcnMgYmVmb3JlIHRoZXkgYXJlIGNvbnNpZGVyZWQgYmFkLiBJIGJlbGlldmUKICB0aGUgcHJldmlvdXMgYXBwcm9hY2ggY291bGQgdHVybiBwcm9ibGVtYXRpYyBvbiByZWFsbHkgc2xvdyBob3N0cy4KClZlcnNpb24gNy4xMS4wLXByZTEgKDEyIEphbnVhcnkgMjAwNCkKCkRhbmllbCAoMTEgSmFudWFyeSAyMDA0KQotIERvbWluaWNrIE1lZ2xpbyBwb2ludGVkIG91dCBGVFBTIHNob3VsZCB1c2UgZGVmYXVsdCBwb3J0IDk5MCBhY2NvcmRpbmcgdG8KICBJQU5BLgoKRGFuaWVsICg4IEphbnVhcnkgMjAwNCkKLSBGaXhlZCB0aGUgU1BORUdPIGNvbmZpZ3VyZSBjaGVjayB0byBub3QgdXNlIC1SIG9yIG90aGVyIG5vbi1wb3J0YWJsZSBvcHRpb25zCiAgaW4gdGhlIExERkxBR1MuIFJlcG9ydGVkIGJ5IFBpZXJyZSBpbiBidWcgcmVwb3J0ICM4NzI5MzAuCgpEYW5pZWwgKDUgSmFudWFyeSAyMDA0KQotIERhbiBGYW5kcmljaCBwcm92aWRlZCBhIGZpeCBvbiBvdXIgemxpYiB1c2FnZS4KCi0gRGF2aWQgSiBNZXllcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlIGxhcmdlIGZpbGUgc3VwcG9ydCB0byBsaWJjdXJsIHdhcwogIGFwcGxpZWQuIE5ldyBjdXJsX2Vhc3lfc2V0b3B0IG9wdGlvbnMgdGhhdCBhY2NlcHQgJ29mZl90JyBhcmd1bWVudHMgYXJlOgoKICBJTkZJTEVTSVpFX0xBUkdFCiAgUkVTVU1FX0ZST01fTEFSR0UKICBNQVhGSUxFU0laRV9MQVJHRQoKRGFuaWVsICg0IEphbnVhcnkgMjAwNCkKLSBCYXNlZCBvbiBEb21pbmljayBNZWdsaW8ncyBjb21tZW50cywgSSBtYWRlIG91ciBwcml2YXRlIHZlcnNpb24gb2YKICBnZXR0aW1lb2ZkYXkoKSBkZWNsYXJlZCBzdGF0aWMuIFRoaXMgd291bGQgb3RoZXJ3aXNlIGNvbGxpZGUgd2l0aCB0aGUgc2FtZQogIGZ1bmN0aW9uIGluIG90aGVyIGxpYnMgKGxpa2UgYXJlcyBmb3IgZXhhbXBsZSkuCgotIEFkZGVkIERvbWluaWNrIE1lZ2xpbydzIGRlc2NyaXB0aW9uIG9uIGhvdyB0byBidWlsZCBsaWJjdXJsIHdpdGggYXJlcwogIG9uIHdpbjMyLgpEYW5pZWwgKDE5IERlY2VtYmVyKQotIENVUkxPUFRfSVBSRVNPTFZFIHdhcyBub3QgcG9zc2libGUgdG8gc2V0LgoKLSBHaXNsZSBWYW5lbSB1cGRhdGVkIHRoZSBkamdwcCBidWlsZCBmaWxlcy4KCkRhbmllbCAoMTggRGVjZW1iZXIpCi0gSm9obiBNY0dvd2FuIHJlcG9ydGVkIGEgcmVkaXJlY3QtcHJvYmxlbSB0aGF0IGhhcHBlbmVkIGlmIGEgc2l0ZSB1c2VkIGEgVVJMCiAgbGlrZSAidXJsLmNvbT92YXI9Y29udGVudCIgKHdpdGhvdXQgYSBwcm9wZXIgc2xhc2gpIGFuZCBmcm9tIHRoYXQgYWRkcmVzcwogIHJlZGlyZWN0ZWQgdGhlIHVzZXItYWdlbnQgdG8gYW4gYWJzb2x1dGUgZGlyZWN0b3J5LgoKLSBEYXZpZCBCeXJvbiBtYWRlIGxpYmN1cmwgYnVpbGQgZmluZSB3aXRoIGJvdGggdGhlIC5ORVQgYW5kIFZDNiB2ZXJzaW9ucyBvZgogIE1TVkMKCkRhbmllbCAoMTYgRGVjZW1iZXIpCi0gVXBkYXRlZCB0ZXN0IDUwNiBzaW5jZSBpdCBzdGFydGVkIHRvIGZhaWwgYWZ0ZXIgdGhlIGNhY2hlIHBydW5lIGNoYW5nZQogIHllc3RlcmRheS4gSSBhbHNvIGNoYW5nZWQgaXQgc2xpZ2h0bHkgdG8gZmVhdHVyZSBhIGNvdW50ZXIgaW4gZWFjaCBkZWJ1ZwogIG91dHB1dCBmb3IgZWFzaWVyIHRyYWNpbmcuCgpEYW5pZWwgKDE1IERlY2VtYmVyKQotIE9sZCBETlMgY2FjaGUgZW50cmllcyBhcmUgbm93IG9ubHkgcHJ1bmVkIGFmdGVyIGN1cmwgaXMgZG9uZSB3aXRoIGEgcmVxdWVzdCwKICBhbmQgbm90IGluIHRoZSBhY3R1YWwgbmFtZSByZXNvbHZlIGNhbGwuCgotIGNvcnJlY3RlZCB0aGUgLS1lbmFibGUtYXJlcyBwYXRjaAoKLSBHaXVzZXBwZSBBdHRhcmRpIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aGluIGxpYmN1cmwgdGhhdCByZS11c2VkCiAgYWxyZWFkeSBmcmVlZCBtZW1vcnkuCgpEYW5pZWwgKDEwIERlY2VtYmVyKQotIEdpc2xlIFZhbmVtIHJlcG9ydGVkIHRoYXQgdGhlIGRpY3Qgc3VwcG9ydCB3YXMgYnJva2VuLiBJIGJyb2tlIGl0IGR1cmluZyBteQogIGZ0cHMtY2hhbmdlcyBvdmVyaGF1bC4gSSd2ZSBub3cgYWRkZWQgYSAnY3VybGFzc2VydCcgZnVuY3Rpb24gdGhhdCBjYW4gYmUKICB1c2VkIHRvIHZlcmlmeSBleHByZXNzaW9ucywgdG8gcHJldmVudCBmdXR1cmUgZXJyb3JzIG9mIHRoZSBzYW1lCiAga2luZC4gVGhleSdyZSBvbmx5IHByZXNlbnQgaW4gZGVidWctYnVpbGRzLgoKLSBEaWVnbyBDYXNvcnJhbiBtYWRlIGN1cmwgYW5kIGxpYmN1cmwgcG9zc2libGUgdG8gYnVpbGQgbmF0aXZlbHkgKG5vIG1vcmUKICBuZWVkIGZvciB0aGUgaXhlbXVsIGxpYnJhcnkpIG9uIEFtaWdhT1MuCgotIERvbWluaWNrIE1lZ2xpbyBtYWRlIGNvbmZpZ3VyZSAtLWVuYWJsZS1hcmVzIHN1cHBvcnQgYSBnaXZlbiBwYXRoIHRvIHRoZQogIGluc3RhbGxlZCBhcmVzIGxpYiwgaW5zdGVhZCBvZiBhbHdheXMgdXNpbmcgaXQgaW4gdGhlIGN1cmwgc291cmNlIHRyZWUuCiAgVGhpcyBhbHNvIGZpeGVkIHRoZSBjdXJsLWNvbmZpZyAtLWxpYnMgb3V0cHV0LgoKLSBFcmljIFMuIFJheW1vbmQgcGF0Y2hlZCBhIHZlcnkgbWlub3IgbWFuIHBhZ2UgZm9ybWF0IGVycm9yIGluCiAgbGliY3VybC1lcnJvcnMuMwoKRGFuaWVsICg4IERlY2VtYmVyKQotIEZpeGVkIHRoZSBmbGF3IHRoYXQgbWFkZSAtbHogYXBwZWFyIHR3aWNlIG9uIHRoZSBsaW5rIGNvbW1hbmQgbGluZS4KCi0gQWZ0ZXIgY29ycmVzcG9uZGVuY2Ugd2l0aCBHaXNsZSBWYW5lbSwgSSBjaGFuZ2VkIHRoZSAnY29ubmVjdGlvbiBhYm9ydGVkJwogIGVycm9yIHRleHQgd2hlbiB0aGUgRlRQIHJlc3BvbnNlIHJlYWRlciBmYWlsZWQgdG8gbW9yZSBzcGVjaWZpY2x5IGlkZW50aWZ5CiAgd2hhdCB0aGUgcHJvYmxlbSBpcy4KCi0gQmFzZWQgb24gYSBwYXRjaCBmcm9tIERvbWluaWNrIE1lZ2xpbywgY3VybC1jb25maWcgLS1mZWF0dXJlIG5vdyBvdXRwdXRzCiAgJ0FzeW5jaEROUycgYXMgYSBmZWF0dXJlIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHdpdGggYXJlcy4gVGhlIGZlYXR1cmUgbmFtZQogIGlzIHRoZSBzYW1lIHRoYXQgJ2N1cmwgLVYnIG91dHB1dHMsIGZvciBzaW1wbGljaXR5LgoKRGFuaWVsICgzIERlY2VtYmVyKQotIE1hcnR5IEt1aHJ0IG1hZGUgdGhlIGJ1aWxkIHVwLXRvLWRhdGUgb24gVk1TLCBhbmQgbW92ZWQgbW9zdCBvZiB0aGUgVk1TLQogIHNwZWNpZmljIHN0dWZmIGluIHRoZSBjbGllbnQgY29kZSB0byBhIHNlcGFyYXRlIGhlYWRlciBmaWxlLgoKLSBTdGV2ZSBHcmVlbiBmaXhlZCBhIHJldHVybiBjb2RlIGJ1ZyBpbiBDdXJsX3Jlc29sdigpLCB0aGF0IG1hZGUgdGhlIHNvY2tzNQogIGNvZGUgZmFpbC4KCi0gc3dhbGthdXMgYXQgeWFob28uY29tIHBhdGNoZWQgbGliY3VybCB0byBpZ25vcmUgQ29udGVudC1MZW5ndGg6IGhlYWRlcnMKICB3aGVuIFRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIGlzIHVzZWQsIGFzIG1hbmRhdGVkIGJ5IFJGQzI2MTYuCgpEYW5pZWwgKDIgRGVjZW1iZXIpCi0gLS1mdHAtcGFzdiB3YXMgYWRkZWQsIHdoaWNoIHNlcnZlcyB0aGUgb25seSBwdXJwb3NlIG9mIG92ZXJyaWRpbmcgYQogIHByZXZpb3VzbHkgc2V0IC0tZnRwcG9ydCBvcHRpb24uIFN0YXJ0aW5nIG5vdywgLS1mdHAtcG9ydCBpcyBhIHJlY29nbml6ZWQKICBhbGlhcyBmb3IgLS1mdHBwb3J0IGZvciBjb25zaXN0ZW5jeS4KCi0gR2l1c2VwcGUgQXR0YXJkaSBwb2ludGVkIG91dCB0aGF0IHdlIHNob3VsZCB1c2UgTVNHX05PU0lHTkFMIHdoZW4gd2UgdXNlCiAgc2VuZCgpIGFuZCByZWN2KCkuIEkgYWRkZWQgY2hlY2tzIGZvciB0aGUgZGVmaW5lIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZAogIGFkanVzdGVkIHRoZSBjb2RlIGFjY29yZGluZ2x5LiBJZiB0aGUgc3ltYm9sIGlzIHByZXNlbnQsIHdlIHdvbid0IGF0dGVtcHQKICB0byBpZ25vcmUgdGhlIFNJR1BJUEUgc2lnbmFsLgoKRGFuaWVsICgxIERlY2VtYmVyKQotIE1hdGhpYXMgQXhlbHNzb24gc2V0IHVwIGEgYnNkZnRwZC1zc2wgc2VydmVyIGZvciBtZSBhbmQgSSBjb3VsZCBtYWtlIGN1cmwKICBydW4gZmluZSBhZ2FpbnN0IGl0cyBGVFBTIGltcGxlbWVudGF0aW9uLiBOb3cgdGhlc2UgRlRQUy1yZWxhdGVkIHRoaW5ncwogIHdvcms6CiAgIG8gZXhwbGljaXQgYW5kIGltcGxpY2l0IEZUUFMKICAgbyBhY3RpdmUgKFBPUlQpIGFuZCBwYXNzaXZlIChQQVNWKQogICBvIHVwbG9hZCBhbmQgZG93bmxvYWQKICAgbyB2ZXJpZmllZCBhZ2FpbnN0IGJzZGZ0cGQtc3NsIGFuZCBSYWlkZW5GVFBECgpEYW5pZWwgKDI3IE5vdmVtYmVyKQotIEphbWVzIENsYW5jeSBtYWRlIHRoZSBCb3JsYW5kIE1ha2VmaWxlcyB1cCB0byBkYXRlLgoKLSBNYXJrdXMgTW9lbGxlciBpbXByb3ZlZCB0aGUgU1BORUdPIGRldGVjdGlvbiBpbiB0aGUgY29uZmlndXJlIHNjcmlwdC4KCkRhbmllbCAoMjUgTm92ZW1iZXIpCi0gRGF2ZSBNYXkgZmlsZWQgYnVnIHJlcG9ydCAjODQ4MzcxLCBpZGVudGlmeWluZyB0aGF0IGlmIHlvdSdkIGRvIFBPU1Qgb3ZlciBhCiAgcHJveHkgdG8gYSBodHRwcyBzZXJ2ZXIsIGxpYmN1cmwgZGlkbid0IFBPU1QgYXQgYWxsLCBpdCBqdXN0IG1hZGUgYSBHRVQhIEl0CiAgdHVybmVkIG91dCB0byBiZSBiZWNhdXNlIGxpYmN1cmwgd3JvbmdseSBkaWRuJ3QgY29uc2lkZXIgdGhlIGF1dGhlbnRpY2F0aW9uCiAgIm5lZ290aWF0aW9uIHBoYXNlIiB0byBiZSBjb21wbGV0ZSB5ZXQuCgogIEkgYWRkZWQgdGVzdCBjYXNlIDk1IHRvIHZlcmlmeSBteSBmaXggZm9yIHRoaXMuCgpEYW5pZWwgKDI0IE5vdmVtYmVyKQotIFRoYW5rcyB0byBNYXRoaWFzIEF4ZWxzc29uLCBJJ3ZlIGJlZW4gYWJsZSB0byB3b3JrIG9uIEZUUFMgZm9yIGxpYmN1cmwgYW5kIGl0CiAgc2VlbXMgdG8gd29yayBzb21ld2hhdCBmaW5lIG5vdy4KCiAgVGhlIEZUUFMgc3R1ZmYgaXMgYmFzZWQgb24gUkZDMjIyOCBhbmQgdGhlIG11cnJheS1hdXRoLWZ0cC1zc2wgZHJhZnQKICAodmVyc2lvbiAxMikuIFRoZXJlIHNlZW1zIHRvIGV4aXN0IHF1aXRlIGEgZmV3IHNlcnZlcnMgdGhhdCBoYXZlIGltcGxlbWVudGVkCiAgdGhlIHNlcnZlciBzaWRlIG9mIHRoaXMuCgogIFdlIGNhbiBub3cgdXNlIGZ0cHM6Ly8gVVJMcyB0byBleHBsaWNpdGx5IHN3aXRjaCBvbiBTU0wvVFNMIGZvciB0aGUgY29udHJvbAogIGNvbm5lY3Rpb24gYW5kIHRoZSBkYXRhIGNvbm5lY3Rpb24gKGRlYWxpbmcgd2l0aCB0d28gU1NMIGNvbm5lY3Rpb25zIGZvcmNlZAogIG1lIHRvIGNoYW5nZSBhIGxvdCBvZiBzdHVmZiBpbiBsaWJjdXJsKS4KCiAgQWx0ZXJuYXRpdmVseSwgYW5kIHdoYXQgc2VlbXMgdG8gYmUgdGhlIHJlY29tbWVuZGVkIHdheSwgd2UgY2FuIHNldCB0aGUgbmV3CiAgb3B0aW9uIENVUkxPUFRfRlRQX1NTTCB0byBvbmUgb2YgdGhlc2UgdmFsdWVzOgoKICAgICBDVVJMRlRQU1NMX05PUEUsICAgLSBkbyBub3QgYXR0ZW1wdCB0byB1c2UgU1NMCiAgICAgQ1VSTEZUUFNTTF9UUlkgICAgIC0gdHJ5IHVzaW5nIFNTTCwgcHJvY2VlZCBhbnl3YXkgb3RoZXJ3aXNlCiAgICAgQ1VSTEZUUFNTTF9DT05UUk9MIC0gU1NMIGZvciB0aGUgY29udHJvbCBjb25uZWN0aW9uIG9yIGZhaWwKICAgICBDVVJMRlRQU1NMX0FMTCAgICAgLSBTU0wgZm9yIGFsbCBjb21tdW5pY2F0aW9uIG9yIGZhaWwKCiAgQW55IGZhaWx1cmUgdG8gc2V0IHRoZSBkZXNpcmVkIGxldmVsIHdpbGwgbWFrZSBsaWJjdXJsIGZhaWwgd2l0aCB0aGUgZXJyb3IKICBjb2RlIENVUkxFX0ZUUF9TU0xfRkFJTEVELiBUaGlzIG5ldyBvcHRpb24gbWFrZXMgYSAibm9ybWFsIiBmdHA6Ly8gdHJhbnNmZXIKICBhdHRlbXB0IHRvIGJlIG1hZGUgc2VjdXJlbHkuCgogIEkndmUgYmVlbiBhYmxlIHRvIGxvZ2luIGFuZCBnZXQgZmlsZXMgKHBhc3NpdmVseSkgZnJvbSBNYXRoaWFzJyBzZXJ2ZXIgdXNpbmcKICBib3RoIGZ0cHM6Ly8gYW5kIENVUkxPUFRfRlRQX1NTTC4gKEkndmUgbWFkZSAnY3VybCcgdW5kZXJzdGFuZCB0aGUgLS1mdHAtc3NsCiAgb3B0aW9uIHRoYXQgc2V0cyBDVVJMRlRQU1NMX1RSWS4pCgotIEdheiBJcWJhbCBmaXhlZCBhIHJhbmdlIHN0cmluZyBtZW1vcnkgbGVhay4KCi0gR2lzbGUgVmFuZW0gZml4ZWQgdGhlIFdpbmRvd3MgYnVpbGRzLgoKLSBBZGRlZCB0aGUgbmV3IEZUUFNTTCBkZWZpbmVzIGluIGN1cmwvY3VybC5oCgpEYW5pZWwgKDIwIE5vdmVtYmVyKQotIEpvc2ggS2FwZWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzg0NTI0NyBhcyBoZSBmb3VuZCBhbiBlbmRsZXNzIGxvb3Agd2hlbgogIGdldHRpbmcgYSA0MDcgYmFjayBmcm9tIGEgcHJveHkgd2hlbiBubyB1c2VyK3Bhc3N3b3JkIHdhcyBnaXZlbi4gQWRkZWQgdGVzdAogIGNhc2UgOTQgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDE5IE5vdmVtYmVyKQotIEtldmluIFJvdGggZml4ZWQgYSBwcm9ncmVzcy1iYXIgcHJvYmxlbSBvbiBXaW5kb3dzLgoKLSBXaGlsZSB3b3JraW5nIHdpdGggTmljb2xhcyBDcm9pc2V0J3MgYnVnIHJlcG9ydCAjODQzNzM5LCBJIG5vdGljZWQgdHdvIG1pbm9yCiAgcHJvYmxlbXMgcmVsYXRlZCB0byBmdHAgcGFydGlhbCBkb3dubG9hZHM6IGlmIGEgcGFydGlhbCB0cmFuc2ZlciBpcwogIGRldGVjdGVkLCB3ZSBtdXN0IGNsb3NlIHRoZSBjb25uZWN0aW9uIGFzIHdlIGNhbm5vdCBrbm93IGluIHdoYXQgc3RhdGUgaXQgaXMKICBhbnltb3JlLiBUaGlzIGxvb2tzIGxpa2UgYSBQcm9GVFBEIGJ1ZzoKICBodHRwOi8vY3VybC5oYXh4LnNlL21haWwvbGliLTIwMDMtMTEvMDA3OS5odG1sCgpEYW5pZWwgKDE3IE5vdmVtYmVyKQotIE1hY2llaiBXLiBSb3p5Y2tpIG1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdXNlIGEgY2FjaGUgdmFyaWFibGUgZm9yIHRoZQogIHdyaXRhYmxlIGFyZ3YgdGVzdC4gVGhpcyB3YXksIHRoZSBkZWZhdWx0IGNhbiBiZSBvdmVycmlkZGVuIGJldHRlciAoZm9yCiAgY3Jvc3MtY29tcGlsZXMgZXRjKQoKRGFuaWVsICgxNSBOb3ZlbWJlcikKLSBNYXRoaWFzIEF4ZWxzc29uIGZvdW5kIG91dCBsaWJjdXJsIHNvbWV0aW1lcyBmcmVlZCB0aGUgc2VydmVyIGNlcnRpZmljYXRlCiAgdHdpY2UsIGxlYWRpbmcgdG8gY3Jhc2hlcyEKCkRhbmllbCAoMTQgTm92ZW1iZXIpCi0gU2lkZGhhcnRoYSBQcmFrYXNoIEphaW4gZm91bmQgYSBjYXNlIHdpdGggYSBiYWQgcmVzb2x2ZSB0aGF0IHdlIGRpZG4ndAogIHByb3Blcmx5IGJhaWwgb3V0IGZyb20sIHdoZW4gdXNpbmcgYXJlcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIpCi0gRGVmYXVsdCBDb250ZW50LVR5cGUgZm9yIHBhcnRzIGluIG11bHRpcGFydCBmb3JtcG9zdHMgaGFzIGNoYW5nZWQgdG8KICAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIi4gIFRoaXMgc2VlbXMgbW9yZSBhcHByb3ByaWF0ZSwgYW5kIEkgYmVsaWV2ZQogIG1vemlsbGEgYW5kIHRoZSBsaWtlcyBkbyB0aGlzLiBJbiB0aGUgc2FtZSBhcmVhOiAuaHRtbCBmaWxlcyBub3cgZ2V0CiAgdGV4dC9odG1sIGFzIENvbnRlbnQtVHlwZS4gKFBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgIzgzOTgwNikKCi0gR2lzbGUgVmFuZW0gY29ycmVjdGVkIHRoZSAtLXByb2dyZXNzLWJhciBvdXRwdXQgYnkgZG9pbmcgYSBmbHVzaCBvZiB0aGUKICBvdXRwdXQsIHdoaWNoIGFwcGFyZW50bHkgbWFrZXMgaXQgbG9vayBiZXR0ZXIgb24gYXQgbGVhc3Qgd2luZG93cywgYnV0CiAgcG9zc2libHkgb3RoZXIgcGxhdGZvcm1zIHRvby4KCi0gUGV0ZXIgU3lsdmVzdGVyIGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIHRoZSBjb25uZWN0IGNvZGUsIHdoaWNoIG1hZGUgdGhlCiAgbXVsdGkgaW50ZXJmYWNlIG9uIGEgaXB2Ni1lbmFibGVkIHNvbGFyaXMgYm94IGRvIGJhZC4gVGVzdCBjYXNlIDUwNCB0byBiZQogIHNwZWNpZmljLiBJJ3ZlIHNwZW50IHNvbWUgdGltZSB0byBjbGVhbi11cCB0aGUgQ3VybF9jb25uZWN0aG9zdCgpIGZ1bmN0aW9uCiAgbm93IHRvIHVzZSBsZXNzIGR1cGxpY2F0ZWQgY29kZSBmb3IgdGhlIHR3byBkaWZmZXJlbnQgc2VjdGlvbnM6IGlwdjYgYW5kCiAgaXB2NC4KCkRhbmllbCAoMTEgTm92ZW1iZXIpCi0gQWRkZWQgQ1VSTE9QVF9ORVRSQ19GSUxFLiBVc2UgdGhpcyB0byB0ZWxsIGxpYmN1cmwgd2hpY2ggZmlsZSB0byB1c2UgaW5zdGVhZAogIG9mIHRyeWluZyB0byBmaW5kIGEgLm5ldHJjIGluIHRoZSBjdXJyZW50IHVzZXIncyBob21lIGRpcmVjdG9yeS4gVGhlCiAgZXhpc3RpbmcgLm5ldHJjIGZpbGUgZmluZGVyIGlzIHNvbWV3aGF0IG5haXZlIGFuZCBpcyBmYXIgZnJvbSBwZXJmZWN0IG9uCiAgc2V2ZXJhbCBwbGF0Zm9ybXMgdGhhdCBhcmVuJ3QgdW5peC1zdHlsZS4gSWYgdGhpcyBvcHRpb24gaXNuJ3Qgc2V0IHdoZW4KICBDVVJMT1BUX05FVFJDIGlzIHNldCwgdGhlIHByZXZpb3VzIGFwcHJvYWNoIHdpbGwgc3RpbGwgYmUgdXNlZC4KCiAgVGhlIGN1cnJlbnQgLm5ldHJjIGNoZWNrIGNvZGUgbm93IGFsc28gc3VwcG9ydCBsb25nZXIgdGhhbiAyNTYgYnl0ZXMgcGF0aAogIG5hbWVzLgoKRGFuaWVsICgxMCBOb3ZlbWJlcikKLSBLYW5nLUppbiBMZWUgcG9pbnRlZCBvdXQgdGhhdCB0aGUgZ2VuZXJhdGVkIGNhLWJ1bmRsZS5oIGZpbGUgc2hvdWxkbid0IGJlCiAgd3JpdHRlbiBpbiB0aGUgc291cmNlIGRpciBpZiBhIGRpZmZlcmVudCBidWlsZCBkaXIgaXMgdXNlZC4KCi0gQWZ0ZXIgU+liYXN0aWVuIFdpbGxlbWlqbnMnIGJ1ZyByZXBvcnQsIHdlIG5vdyBjaGVjayB0aGUgc2VwYXJhdG9ycyBwcm9wZXJseQogIGluIHRoZSAyMjktcmVwbHkgc2VydmVycyByZXNwb25kIG9uIGEgRVBTViBjb21tYW5kIGFuZCBiYWlsIG91dCBiZXR0ZXIgaWYKICB0aGUgcmVwbHkgc3RyaW5nIGlzIG5vdCBSRkMyNDI4LWNvbXBsaWFudC4KCkRhbmllbCAoNyBOb3ZlbWJlcikKLSBCYXNlZCBvbiBHaXNsZSBWYW5lbSdzIHBhdGNoLCBJIG1hZGUgY3VybCB0cnkgaGFyZGVyIHRvIGdldCB0aGUgaG9tZQogIGRpcmVjdG9yeSBvZiB0aGUgY3VycmVudCB1c2VyLCBpbiBvcmRlciB0byBmaW5kIHRoZSBkZWZhdWx0IC5jdXJscmMgZmlsZS4KICBXZSdyZSBhbHNvIGNvbnNpZGVyaW5nIG1vdmluZyBvdXQgdGhlIEhPTUUtZGlyIGNvZGUgZnJvbSBsaWJjdXJsLCBhbmQKICBpbnN0ZWFkIGhhdmUgdGhlIGFwcCBwYXNzIGluIHRoZSBwYXRoIHRvIHRoZSAubmV0cmMgZmlsZSAod2hpY2ggaXMgdGhlIG9ubHkKICBsb2dpYyBsZWZ0IGluIGxpYmN1cmwgdGhhdCB1c2VzIHRoZSBIT01FIGRpcikuIFRoZW4gY3VybCBjYW4gdXNlIHRoZSBob21lCiAgZGlyIGZvciB0aGF0IHB1cnBvc2UgdG9vLgoKLSBSYWxwaCBNaXRjaGVsbCdzIHVwZGF0ZWQgdGVzdGN1cmwuc2ggdG8gdGhlIHNjcmlwdCB0byB0YWtlIGFuIGV4aXN0aW5nCiAgZGlyZWN0b3J5IG5hbWUgYW5kIGJ1aWxkL3J1bi90ZXN0IGN1cmwgaW4gdGhlcmUgaW5zdGVhZCBvZiB0cnlpbmcgdG8gdXBkYXRlCiAgZnJvbSBDVlMuIFVzaW5nIHRoaXMgYXBwcm9hY2gsIHRoZSBzY3JpcHQgY2FuIG5vdyBiZSB1c2VkIHRvIHRlc3QgZGFpbHkKICB0YXJiYWxscyBldGMuCgotIEdpc2xlIFZhbmVtIGFkZGVkIGEgInJlc291cmNlIGZpbGUiIHRvIHRoZSBXaW5kb3dzIERMTCBidWlsZHMsIHRvIGNvbnRhaW4KICBpbmZvcm1hdGlvbiBzdWNoIGFzIHZlcnNpb24gbnVtYmVyLCBsaWJyYXJ5IG5hbWUsIGNvcHlyaWdodCBpbmZvIGV0Yy4KCkRhbmllbCAoNiBOb3ZlbWJlcikKLSBjdXJsIGNoZWNrcyBpZiB0aGUgZXhpc3RpbmcgbGliY3VybCBzdXBwb3J0cyB0aGluZ3MgbGlrZSAtLW50bG0sIC0tbmVnb3RpYXRlCiAgYW5kIC0ta3JiNCBhbmQgcmV0dXJucyBlcnJvciBpZiBub3QuCgotIEkgYWRkZWQgdGhyZWUgbmV3IGdsb2JhbCBkZWZpbmVzIGluIHRoZSBjdXJsL2N1cmwuaCBoZWFkZXI6CiAgTElCQ1VSTF9WRVJTSU9OX01BSk9SLCBMSUJDVVJMX1ZFUlNJT05fTUlOT1IgYW5kIExJQkNVUkxfVkVSU0lPTl9QQVRDSC4gVGhleQogIGFyZSB0aGUgdGhyZWUgbnVtYmVycyBpbiB0aGUgbGlicmFyeSdzIHZlcnNpb24gbnVtYmVyLCBzZXBhcmF0ZWQgZm9yIGVhc2llcgogIHVzYWdlLiAnbWFrZXRneicgd2FzIHVwZGF0ZWQgYWNjb3JkaW5nbHkgdG8gZ2VuZXJhdGUgdGhlc2UgbnVtYmVycyBwcm9wZXJseQogIHdoZW4gYnVpbGRpbmcgcmVsZWFzZS1hcmNoaXZlcy4KCi0gVW5pbml0aWFsaXplZCB2YXJpYWJsZSBmaXgsIHJlcG9ydGVkIGJ5IGJvdGggTWFydHkgS3VocnQgYW5kIEJlbmphbWluCiAgR2VyYXJkLgoKLSBNYXR0IFZlZW5zdHJhIHByb3ZpZGVkIGJ1aWxkIGZpbGVzIHRvIGJ1aWxkIGxpYmN1cmwgYXMgYSAiZnJhbWV3b3JrIiB1bmRlcgogIE1hYyBPUyBYLiBTZWUgdGhlIGxpYi9saWJjdXJsLmZyYW1ld29yay5tYWtlIGZvciBkZXRhaWxzLgoKLSBSZW1vdmVkIHRoZSBkZWZpbmVzIG9mIFRSVUUgYW5kIEZBTFNFIGZyb20gdGhlIGN1cmwvY3VybC5oIGhlYWRlciBmaWxlLgogIFRoZXkncmUgbm90IGluIG91ciBuYW1lIHNwYWNlIHNvIHdlIHNob3VsZCBub3QgZmlkZGxlIHdpdGggdGhlbS4KCkRhbmllbCAoNSBOb3ZlbWJlcikKLSBSZXBsYWNlZCB0aGUgbWFuIHBhZ2UgdG8gSFRNTCBjb252ZXJ0ZXIgcHJvZ3JhbSB3aXRoIGEgbmV3IG9uZTogcm9mZml0LgogIE1ha2VzIG5pY2VyIHdlYiBwYWdlcy4KCkRhbmllbCAoNCBOb3ZlbWJlcikKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gZml4ZWQgdGhlIE1TVkMgbWFrZWZpbGVzIHRvIGxldCB0aGVtIGJ1aWxkIGN1cmwgZmluZQogIG9uIFdpbmRvd3MuCgotIEtldmluIFJvdGggY29ycmVjdGVkIHRoZSBjeWd3aW4gcGFja2FnZSBnZW5lcmF0b3IgYW5kIHNwZWxsLWZpeGVkIHRoZQogIGNvbW1lbnQgaW4gdGhlIGNhLWJ1bmRsZS5oIGZpbGUuCgpWZXJzaW9uIDcuMTAuOCAoMSBOb3ZlbWJlciAyMDAzKQoKRGFuaWVsICgzMSBPY3RvYmVyKQotIEFzc3VtZSB0aGF0IE1EVE0gb24gYW4gRlRQIHNlcnZlciByZXR1cm5zIHRoZSB0aW1lc3RhbXAgdXNpbmcgdGhlIFVUQyB0aW1lCiAgem9uZS4gVGhpcyBjaGFuZ2VzIHRoZSB0aW1lIENVUkxJTkZPX0ZJTEVUSU1FIHJldHVybnMgZm9yIGEgZ2l2ZW4gZmlsZSBvdmVyCiAgRlRQLCBhbmQgd2lsbCBjaGFuZ2UgZXhpc3RpbmcgdXNlcyBvZiBDVVJMT1BUX1RJTUVDT05ESVRJT04uIEl0IHdpbGwgbWFrZQogIHRoZSBmdW5jdGlvbmFsaXR5IG1vcmUgc2ltaWxhciB0byBob3cgdGhlIEhUVFAgb25lIGlzIGFscmVhZHkgd29ya2luZy4KCi0gQ29tbWFuZCBsaW5lIG9wdGlvbnMgdGhhdCB0YWtlIG51bWVyaWNhbCBwYXJhbWV0ZXJzIChzdWNoIGFzIC15LCAtWSwgLUMgZXRjKQogIG5vdyByZXBvcnQgZXJyb3IgYW5kIGV4aXQgaWYgdGhlIHBhcmFtZXRlciBpc24ndCB0cnVseSBhIG51bWJlciBncmVhdGVyIHRoYW4KICBvciBlcXVhbCB0byB6ZXJvLiBUaGlzIGhlbHBzIHVzZXJzIHRvIG5vdGljZSBiYWQgdXNhZ2UgZWFybGllci4gQmVmb3JlLCB3aGVuCiAgYSB1c2VyIGZvcmdvdCBvciBtaXNzZWQgdG8gYWRkIGEgbnVtZXJpY2FsIHBhcmFtZXRlciB0byBhbiBvcHRpb24sIHRoZQogIGNvbW1hbmQgbGluZSBwYXJzZXIgd291bGQgc2ltcGx5ICJlYXQiIHRoZSBmb2xsb3dpbmcgb3B0aW9uIGFuZCBpdCB3b3VsZAogIGNhdXNlIGdyZWF0IGNvbmZ1c2lvbi4KCkRhbmllbCAoMzAgT2N0b2JlcikKLSBEYXZpZCBIdWxsIG1hZGUgbGliY3VybCBkZWFsIHdpdGggTk9CT0RZIGFuZCBIRUFERVIgZm9yIGZpbGU6Ly8gdGhlIHNhbWUgd2F5CiAgaXQgYWxyZWFkeSBkb2VzIGZvciBGVFA6IGl0IHByb3ZpZGVzIEhUVFAtbG9va2luZyBoZWFkZXJzIHRoYXQgcHJvdmlkZSBpbmZvCiAgb25seSBhYm91dCB0aGUgZmlsZSwgd2l0aG91dCBkb2luZyB0aGUgYWN0dWFsIHRyYW5zZmVyLiBUaGUgY3VybCB0b29sIHRoZW4KICBsZXRzIC0taGVhZCBkbyB0aGlzLgoKRGFuaWVsICgyOSBPY3RvYmVyKQotIHJ1bnRlc3RzLnBsIG5vdyBjaGVja3MgZm9yIGFuZCB1c2UgdmFsZ3JpbmQgaWYgcHJlc2VudC4gSXQgd2lsbCByZWRpcmVjdCB0aGUKICB2YWxncmluZCByZXN1bHRzIGluIGxvZy92YWxncmluZFtudW1dIGJ1dCBpdCBjdXJyZW50bHkgZG9lc24ndCBzY2FuIHRoYXQKICBmaWxlIGZvciBhbnkgZXJyb3JzIG9yIGFueXRoaW5nLCB0aGF0IGlzIHN0aWxsIG9ubHkgbWFkZSBtYW51YWxseS4KCi0gRGF2aWQgSHVsbCBtYWRlIHRoZSBmaWxlOiBVUkwgcGFyc2VyIGFsc28gYWNjZXB0IHRoZSBzb21ld2hhdCBzbG9wcHkgZmlsZQogIHN5bnRheDogZmlsZTovcGF0aC4gSSBhZGRlZCB0ZXN0IGNhc2UgMjAzIHRvIHZlcmlmeSB0aGlzLgoKRGFuaWVsICgyOCBPY3RvYmVyKQotIERhbiBDIHRyYWNrZWQgZG93biB5ZXQgYW5vdGhlciB3ZWlyZCBiZWhhdmlvciBpbiB0aGUgZ2xpYmMgZ2V0aG9zdGJ5bmFtZV9yKCkKICBmdW5jdGlvbiBmb3Igc29tZSBzcGVjaWZpYyB2ZXJzaW9ucyAocmVwb3J0ZWQgb24gMi4yLjUgYW5kIDIuMS4xKSwgYW5kCiAgcHJvdmlkZWQgYSBmaXguIE9uIExpbnV4IG1hY2hpbmVzIHdpdGggdGhlc2UgZ2xpYmMgdmVyc2lvbnMsIG5vbi1pcHY2CiAgYnVpbGRzIG9mIGxpYmN1cmwgd291bGQgb2Z0ZW4gZmFpbCB0byByZXNvbHZlIHBlcmZlY3RseSByZXNvbHZhYmxlIGhvc3QKICBuYW1lcy4KCkRhbmllbCAoMjYgT2N0b2JlcikKLSBKYW1lcyBCdXJzYSBmb3VuZCBvdXQgdGhhdCBjdXJsX21zbnByaW50ZigpIGNvdWxkIHdyaXRlIHRoZSB0cmFpbGluZwogIHplcm8tYnl0ZSBvdXRzaWRlIGl0cyBnaXZlbiBidWZmZXIgc2l6ZS4gVGhpcyBjb3VsZCBoYXBwZW4gaWYgeW91IGdlbmVyYXRlZAogIGEgdmVyeSBsb25nIGVycm9yIG1lc3NhZ2UgYXMgdGhlbiBsaWJjdXJsIHdvdWxkIG92ZXJ3cml0ZSB0aGUgRVJST1JCVUZGRVIKICB3aXRoIG9uZSBieXRlLiBVc2luZyBhIG5vbi1leGlzdGluZyB2ZXJ5IGxvbmcgbG9jYWwgZmlsZTovLyBuYW1lIGlzIG9uZSBjYXNlCiAgdGhhdCBjb3VsZCBtYWtlIHRoaXMgb2NjdXIuCgpEYW5pZWwgKDI0IE9jdG9iZXIpCi0gRGF2aWQgSHVsbCBmaWxlZCBidWcgcmVwb3J0ICM4Mjk4MjcuIEl0IGlkZW50aWZpZWQgYSBwcm9ibGVtIHdpdGggLUMgLSBpZgogIHRoZSBmdWxsIGZpbGUgYWxyZWFkeSB3YXMgZG93bmxvYWRlZCBhbmQgdGh1cyB0aGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIGEKICA0MTYuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IHVzZSB0aGUgQ29udGVudC1MZW5ndGg6IGhlYWRlciBhbmQgZXhwZWN0CiAgdGhhdCBzaXplIHRvIGdldCB0cmFuc2ZlciwgY2F1c2luZyBhICJoYW5nIiB1bnRpbCB0aGUgc2VydmVyIGNsb3NlZCB0aGUKICBjb25uZWN0aW9uIGFuZCB0aGVuIGFuIGVycm9yIDE4ICgic3RpbGwgTiBieXRlcyBkYXRhIGxlZnQgb2YgdGhlIHRyYW5zZmVyIikuCgogIE5vdyB3ZSBkb24ndCByZXR1cm4gYW55IGVycm9yIGF0IGFsbCwgYnV0IEkgdGhpbmsgbGliY3VybCBzaG91bGQgcGVyaGFwcwogIHJldHVybiBzb21lIGtpbmQgb2YgaW5mbyBzaW5jZSB0aGUgcmVxdWVzdGVkIHJhbmdlIHdhcyBvdXQgb2YgdGhlIHNpemUgb2YKICB0aGUgZG9jdW1lbnQuCgotIEJhc2VkIG9uIERhdmlkIEh1bGwncyBmaXggaW4gYnVnIHJlcG9ydCAjODA0NTk5LCB3ZSBub3cgY2hlY2sgZm9yIHNvbGFyaXMgYW5kCiAgZ2NjIGluIGNvbmZpZ3VyZSBhbmQgc2V0IHRoZSAtbWltcHVyZS10ZXh0IGxpbmsgZmxhZyBmb3IgbGlua2luZyB0aGUgbGliCiAgYmV0dGVyLgoKLSBJJ3ZlIGludHJvZHVjZWQgYSAtdCBvcHRpb24gdG8gdGhlIHJ1bnRlc3RzLnBsIHNjcmlwdC4gV2l0aCB0aGF0IG9wdGlvbiBzZXQsCiAgdGhlIHNjcmlwdCBydW5zIHNwZWNpYWwgIm1lbW9yeSB0b3J0dXJlIiB0ZXN0cy4gRm9yIGVhY2ggdGVzdCBjb21tYW5kIGxpbmUKICBpbiB0aGF0IHNlY3Rpb24sIHRoZSBzY3JpcHQgZmlyc3QgcnVucyB0aGUgY29tbWFuZCBsaW5lIGFuZCBjb3VudHMgdGhlIHRvdGFsCiAgYW1vdW50IG9mIGFsbG9jYXRpb25zIG1hZGUuIEl0IHRoZW4gcnVucyB0aGUgZXhhY3Qgc2FtZSBjb21tYW5kIGxpbmUgYWdhaW4sCiAgZm9yY2luZyBhbGxvY2F0aW9uIG51bWJlciBOIHRvIGZhaWwuIEl0IHdpbGwgdHJ5IGV2ZXJ5IE4gZnJvbSAxIHRvIHRoZSB0b3RhbAogIG51bWJlciBvZiBhbW91bnRzIG1hZGUuIEZvciBldmVyeSBpbnZva2UsIGl0IGNoZWNrcyB0aGF0IG5vIG1lbW9yeSB3YXMKICBsZWFrZWQgYXMgdGhhdCB3b3VsZCBpbmRpY2F0ZSBhIGJhZCBjbGVhbnVwIHNvbWV3aGVyZSBpbiB0aGUgY29kZS4KCiAgVGhpcyBpcyBqdXN0IGJlZ2lubmluZyB0byB3b3JrLCBhbmQgSSd2ZSBhbHJlYWR5IG1hZGUgc29tZSBjb3JyZWN0aW9ucyBpbgogIGxpYmN1cmwgY29kZS4gV2hlbiB0aGlzIGNvZGUgd29ya3Mgc29tZXdoYXQgZmluZSwgSSdsbCBtYWtlIHN1cmUgJ21ha2UgdGVzdCcKICBpbiB0aGUgcm9vdCBkaXIgd2lsbCBydW4gdGhlc2UgdGVzdHMgYXMgd2VsbC4KCkRhbmllbCAoMjMgT2N0b2JlcikKLSBHZW9yZyBIb3JuIGZpeGVkIGhvdyB0aGUgQ0EgdmVyaWZpY2F0aW9uIGlzIG1hZGUuIFZlcmlmaWNhdGlvbnMgY2FuIG5vdyBiZQogIG1hZGUgd2hpbGUgYXQgdGhlIHNhbWUgdGltZSB0aGUgcmVzdWx0IG9mIGl0IGNhbiBiZSBpZ25vcmVkLiBUaGlzIGFsc28KICBhZmZlY3RzIHRoZSBjdXJsIHRvb2wgYXMgLWsgY2FuIG5vdyBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggLS1jYWNlcnQgb3IKICAtLWNhcGF0aC4KCkRhbmllbCAoMjIgT2N0b2JlcikKLSBHaXNsZSBWYW5lbSBmb3VuZCBvdXQgLS1kaXNhYmxlLWVwcnQgZGlkbid0IHdvcmsgYW5kIHBhdGNoZWQgaXQuCgotIFRlc3QgY2FzZSA5MSB3YXMgbW9kaWZpZWQgYW5kIGNvdWxkIG5vdyByZXBlYXQgdGhlIHByb2JsZW0gS2V2aW4gUm90aCBoYXMKICByZXBvcnRlZCwgYW5kIHRoZSBidWcgd2FzIGZpeGVkLgoKLSBEeWxhbiBFbGxpY290dCBhZGRlZCB2Yy1saWJjdXJsLXNzbC1kbGwgYXMgYSB0YXJnZXQgdG8gdGhlIHJvb3QgbWFrZWZpbGUKICB0byBidWlsZCBhIHN0YXRpYyBsaWJjdXJsIHRoYXQgbGlua3Mgd2l0aCBhIHNoYXJlZCBPcGVuU1NMIHVzaW5nIE1TVkMuCgpEYW5pZWwgKDIxIE9jdG9iZXIpCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndzMyIG1ha2VmaWxlcy4KClZlcnNpb24gNy4xMC44LXByZTUgKDIxIE9jdG9iZXIgMjAwMykKCkRhbmllbCAoMTkgT2N0b2JlcikKLSBHZW9yZyBIb3JuIG1hZGUgbGliY3VybCBvdXRwdXQgbW9yZSBpbmZvIG9uIFNTTCBmYWlsdXJlcyB3aGVuIHJlY2VpdmluZwogIGRhdGEuCgpWZXJzaW9uIDcuMTAuOC1wcmU0ICgxOCBPY3RvYmVyIDIwMDMpCgpEYW5pZWwgKDE3IE9jdG9iZXIpCi0gRG9taW5pY2sgTWVnbGlvIGltcGxlbWVudGVkIENVUkxPUFRfTUFYRklMRVNJWkUgYW5kIC0tbWF4LWZpbGVzaXplLgoKLSBNYWRlIGxpYmN1cmwgc2hvdyB2ZXJib3NlIGluZm8gYWJvdXQgd2hhdCBhdXRoIHR5cGUgYW5kIHVzZXIgbmFtZSB0aGF0IGlzCiAgYmVpbmcgc2VudCBpbiBpdHMgSFRUUCByZXF1ZXN0LWhlYWRlcnMuCgpEYW5pZWwgKDE2IE9jdG9iZXIpCi0gUmVtb3ZlZCBzdXBwb3J0IGZvciBDVVJMT1BUX1BBU1NXREZVTkNUSU9OIGFuZCBDVVJMT1BUX1BBU1NXRERBVEEuIGxpYmN1cmwKICBubyBsb25nZXIgcHJvbXB0IGZvciBwYXNzd29yZHMgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMuIFBhc3N3b3JkIHByb21wdGluZwogIHdhcyBpbnN0ZWFkIG1vdmVkIHRvIGN1cmwsIHdoaWNoIG5vdyBwcm9tcHRzIGZvciBwYXNzd29yZCBpZiAtdSBvciAtVSBsYWNrCiAgaXQuIFRoaXMgc29sdmVzIHRoZSBwcm9ibGVtIEtldmluIFJvdGggcmVwb3J0ZWQgd2hlbiBjdXJsIHByb21wdGVkIGZvcgogIHBhc3N3b3JkIHR3aWNlIHdoZW4gZG9pbmcgTlRMTSBhdXRoZW50aWNhdGlvbi4KCi0gSSByZXdyb3RlIHRoZSBTU0wgc3ViamVjdEFsdE5hbWUgY2hlY2sgdG8gYXZvaWQgaGF2aW5nIHRvIHJlbHkgb24gT3BlbkxEQVAtCiAgbGljZW5zZWQgZGVyaXZhdGUgY29kZS4KCkRhbmllbCAoMTUgT2N0b2JlcikKLSBBdm9pZCBkb2luZyBnZXRzb2Nrb3B0KCkgb24gV2luZG93cyB0byB2ZXJpZnkgY29ubmVjdHMuIEl0IHNlZW1zIHRoYXQgdGhpcwogIGhvZ3MgV2luZG93cyBtYWNoaW5lcyB3aGVuIGxpYmN1cmwgaXMgYmVpbmcgdXNlZCBtdWx0aS10aHJlYWRlZCAod2l0aCA+IH41MAogIHRocmVhZHMpLiBBbmRyZXcgRnVsbGVyIGhlbHBlZCB1cyB2ZXJpZnkgYW5kIHRlc3QgdGhpcy4KCkRhbmllbCAoMTQgT2N0b2JlcikKLSBLaW1tbyBLaW5udW5lbiBmaXhlZCBhIGNyYXNoIHdpdGggZHVwaGFuZGxlKCkgd2hlbiBDVVJMREVCVUcgaXMgc2V0LgoKLSBHaXNsZSBWYW5lbSBtYWRlIGxpYmN1cmwgYnVpbGQgYW5kIHdvcmsgd2l0aCBJUHY2IG9uIFdpbmRvd3MuCgpEYW5pZWwgKDEzIE9jdG9iZXIpCi0gR2l1c2VwcGUgQXR0YXJkaSByZXBvcnRlZCB5ZXQgYW5vdGhlciBzZWdmYXVsdCB3aXRoIGFyZXMgYW5kIHRoZSBtdWx0aQogIGludGVyZmFjZS4gTWUgZml4ZWQuCgotIERvbWVuaWNvIEFuZHJlb2xpIHJlbW92ZWQgdGhlIGV4dHJhIExERkxBR1MgYXNzaWdubWVudCBpbiBsaWIvTWFrZWZpbGUuYW0KICB0aGF0IHdhcyByZXBvcnRlZCBhYm91dCBpbiB0aGUgZGViaWFuIGJ1ZyByZXBvcnQgIzIxMjA4Ni4KCiAgRG9tZW5pY28gYWxzbyBmaXhlZCB0d28gbWFrZWZpbGVzIHdoZXJlIHdlIHVzZWQgJ2ducm9mZicgaW5zdGVhZCBvZiB0aGUgbW9yZQogIHBvcnRhYmxlICQoTlJPRkYpLgoKRGFuaWVsICgxMiBPY3RvYmVyKQotIERpcmsgTWFuc2tlIG1hZGUgdGhlIHNoYXJlIGxvY2tpbmcgYXJvdW5kIEROUyBsb29rdXBzIHNsaWdodGx5IGRpZmZlcmVudCB0bwogIGFsbG93IHRoZSBzaGFyZSBzeXN0ZW0ncyBETlMgbG9va3VwcyB0byBydW4gc29tZXdoYXQgbW9yZQogIGluZGVwZW5kZW50L2Zhc3Rlci4KCkRhbmllbCAoOSBPY3RvYmVyKQotIExhY2hsYW4gTydEZWEgZml4ZWQgYSByZXN1bWUgcHJvYmxlbTogIklmIEkgc2V0IENVUkxPUFRfUkVTVU1FX0ZST00sIHBlcmZvcm0KICBhbiBIVFRQIGRvd25sb2FkLCB0aGVuIHJlc2V0IENVUkxPUFRfUkVTVU1FX0ZST00gdG8gMCwgdGhlIG5leHQgZG93bmxvYWQKICBzdGlsbCBoYXMgYSBSYW5nZSBoZWFkZXIgd2l0aCBhIGdhcmJhZ2UgdmFsdWUuIiBidWcgcmVwb3J0ICM4MjA1MDIKCi0gRG9taW5pY2sgTWVnbGlvIG1hZGUgdGhlIGluZXRfcHRvbi5jIGZpbGUgYnVpbGQgZmluZSB1c2luZyBNU1ZDLgoKLSBUaGUgJ3N3cycgdGVzdCBzdWl0ZSB3ZWIgc2VydmVyIG5vdyAjaW5jbHVkZSBzZXR1cC5oIGZyb20gdGhlIGxpYiBkaXJlY3RvcnkuCiAgVGhpcyBtYWtlcyBpdCBtb3JlIHBvcnRhYmxlIGVhc2llci4KClZlcnNpb24gNy4xMC44LXByZTMgKDggT2N0b2JlciAyMDAzKQoKRGFuaWVsICg4IE9jdG9iZXIpCi0gRnJhbmsgVGljaGVsZXIgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGZpeGVzIGhvdyBsaWJjdXJsIGNvbm5lY3RzIHRvIG11bHRpcGxlCiAgYWRkcmVzc2VzLCBpZiBvbmUgb2YgdGhlbSBmYWlscyAoaXB2NC1jb2RlKS4KCkRhbmllbCAoNyBPY3RvYmVyKQotIE5laWwgRHVuYmFyIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBub3cgbWFrZXMgbGliY3VybCBjaGVjayBTU0wKICBzdWJqZWN0QWx0TmFtZXMgd2hlbiBtYXRjaGluZyBjZXJ0cy4gVGhpcyBpcyBhcHBhcmVudGx5IGRldGFpbGVkIGluIFJGQzI4MTgKICBhcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8uIEkgaGFkIHRvIGFkZCBjb25maWd1cmUgY2hlY2tzIGZvciBpbmV0X3B0b24oKSBhbmQKICBvdXIgb3duIChzdHJpY3RseSBzcGVha2luZywgY29kZSBmcm9tIEJJTkQgd3JpdHRlbiBieSBQYXVsIFZpeGllKSBwcm92aWRlZAogIGNvZGUgZm9yIHRoZSBmdW5jdGlvbiBmb3IgcGxhdGZvcm1zIHRoYXQgbWlzcyBpdC4KCi0gSFRUUCBQT1NUIHVzaW5nIHRoZSByZWFkIGNhbGxiYWNrIGRpZG4ndCB3b3JrLCBhcyBGbG9yaWFuIFNjaG9wcG1hbm4KICByZXBvcnRlZC4KCkRhbmllbCAoNSBPY3RvYmVyKQotIFNoYXJlZCBwcm92aWRlZCBhIGZldyBmaXhlcyB0byBtYWtlIGxpYmN1cmwgYnVpbGQgb24gQmVPUwogIG91dC1vZi10aGUtYm94LiBOZXcgY29kZSBmb3IgQmVPUy1zdHlsZSBub24tYmxvY2tpbmcgc29ja2V0cywgcHJvdmlkZWQgYnkKICBTaGFyZCBhbmQgSmVyZW15IEZyaWVzbmVyLiBNb2RpZmllZCB0aGUgYXV0b2NvbmYgY2hlY2sgZm9yIG5vbi1ibG9ja2luZwogIHNvY2tldHMgdG8gY2hlY2sgZm9yIHRoaXMga2luZCB0b28uCgpEYW5pZWwgKDQgT2N0b2JlcikKLSBWaW5jZW50IEJyb25uZXIgcG9pbnRlZCBvdXQgdGhhdCBpZiB5b3Ugc2V0IENVUkxPUFRfQ09PS0lFIGZvciBhIHRyYW5zZmVyCiAgYW5kIHRoZW4gc2V0IGl0IHRvIE5VTEwgaW4gYSBzdWJzZXF1ZW50IG9uZSwgdGhlIHByZXZpb3VzIGNvb2tpZSB3YXMgc3RpbGwKICBzZW50IG9mZiEKCi0gSm9uIFR1cm5lciBmaXhlZCBhIHByb2JsZW0gbGliY3VybCBoYWQgd2hlbiBpdCBmYWlsZWQgb24gYW4gRlRQIHRyYW5zZmVyIGR1ZQogIHRvIGEgYmFkIHBhdGgsIGl0IHdvdWxkIGNhdXNlIHRoZSBuZXh0IHRyYW5zZmVyIHRvIHVzZSBhIGJhZCBwYXRoIGFzIHdlbGwuCgotIFNpZGRoYXJ0aGEgUHJha2FzaCBKYWluIHByb3ZpZGVkIGEgcGF0Y2ggd2l0aCBhIGZpeCBmb3IgbGliY3VybCB3aXRoIGFyZXMsCiAgd2hlbiB3b3JraW5nIG9uIElQLW9ubHkgbmFtZXMgYXMgd2UgdGhlbiBjb3VsZCByZXR1cm4gIndhaXQiIHN0YXR1cyB3aGVuIHRoZQogIG5hbWUgaW4gZmFjdCBhbHJlYWR5IHdhcyByZXNvbHZlZC4gSSBlZGl0ZWQgdGhlIHBhdGNoIHNsaWdodGx5IHRvIG5vdCBleHBvc2UKICBhc3luY2ggZGV0YWlscyB0byBub24tYXJlcyBhd2FyZSBzb3VyY2UgY29kZS4KCkRhbmllbCAoMyBPY3RvYmVyKQotIE5laWwgU3ByaW5nIHBvc3RlZCB0aGUgZGViaWFuIGJ1ZyByZXBvcnQgIzIxMzE4MCwgYW5kIHBvaW50ZWQgb3V0IHRoYXQgdXNpbmcKICB0aGUgbmFtZSAnYWNjZXNzJyBpbiBhIGZ1bmN0aW9uIHByb3RvdHlwZSBpcyBub3QgdmVyeSB3aXNlIGFzIHNvbWUgY29tcGlsZXJzCiAgY29tcGxhaW4uCgotIFBldGVyIFN5bHZlc3RlciBwcm92aWRlZCBoaXMgYW5kIEplYW4tUGF1bCBNZXJsaW4ncyBjdXJseC5jIGV4YW1wbGUgc291cmNlCiAgY29kZSB0aGF0IHNob3dzIGhvdyB0aGV5IHVzZSBzc2wgYW5kIGNhbGxiYWNrcy4KCkRhbmllbCAoMiBPY3RvYmVyKQotIEphbWVzIE1hY01pbGxhbidzIHBhdGNoIG1ha2VzIGN1cmwgYnVpbGQgb24gUU5YIDYuMi54LgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIpCi0gTXkgZGF1Z2h0ZXIgd2FzIGJvcm4hCgpEYW5pZWwgKDIzIFNlcHRlbWJlcikKLSBBZGRlZCBzdXBwb3J0IGZvciAtNC8tLWlwdjQgYW5kIC02Ly0taXB2NiB0byBmb3JjZSBuYW1lcyB0byByZXNvbHZlIHRvIHRoYXQKICBwYXJ0aWN1bGFyIElQIHZlcnNpb24uIFRoZXkgb25seSB3b3JrIGZvciBJUHY2LWVuYWJsZWQgbGliY3VybHMuCgotIGN1cmwgLVYgbm93IG91dHB1dHMgJ1NQTkVHTycgYXMgYSBmZWF0dXJlIGluIGNhc2UgbGliY3VybCB3YXMgYnVpbHQgdG8KICBzdXBwb3J0IHRoYXQuCgpWZXJzaW9uIDcuMTAuOC1wcmUyICgyMiBTZXB0ZW1iZXIgMjAwMykKCkRhbmllbCAoMjIgU2VwdGVtYmVyKQotIEdpdXNlcHBlIEF0dGFyZGkgZm91bmQgYSBzZWdmYXVsdCBpbiBsaWJjdXJsIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZQogIHdpdGggYXJlcyBhbmQgZG9pbmcgcmVwZWF0ZWQgb3BlcmF0aW9ucyBhZ2FpbnN0IGEgbm9uLXJlc29sdmluZyBob3N0IG5hbWUuCgpEYW5pZWwgKDE5IFNlcHRlbWJlcikKLSBBZGRlZCB0aGUgQ1VSTE9QVF9JUFJFU09MVkUgb3B0aW9uLCB0aGF0IGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBzZWxlY3QKICB3aGF0IGtpbmQgb2YgSVAgYWRkcmVzc2VzIGhlIHdhbnRzIHRvIHVzZSB3aGVuIHJlc29sdmluZyBob3N0IG5hbWVzLiBUaGlzCiAgaXMgb25seSBpbnRlcmVzdGluZyB3aGVuIHVzaW5nIGhvc3QgbmFtZXMgdGhhdCByZXNvbHZlIGFkZHJlc3NlcyB1c2luZyBtb3JlCiAgdGhhbiBvbmUgdmVyc2lvbiBvZiBJUC4KCi0gQXBwbGllZCBNYXJrdXMgTW9lbGxlcidzIHBhdGNoIHRoYXQgaW50cm9kdWNlcyBTUE5FR08gc3VwcG9ydCBpZiBsaWJjdXJsCiAgaXMgYnVpbHQgd2l0aCB0aGUgRkJvcGVuc3NsIGxpYnJhcmllcy4gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucwogIGluZm8gb24gU1BORUdPIGF2YWlsYWJpbGl0eS4gVGhlIHBhdGNoIGFsc28gbWFkZSB0aGUgR1NTQVBJIHN0dWZmIHdvcmsgZmluZQogIHdpdGggdGhlIE1JVCBHU1MtbGlicmFyeSAodGhlIEhlaW1kYWwgb25lIHN0aWxsIHdvcmtzIHRvbykuCgpEYW5pZWwgKDE2IFNlcHRlbWJlcikKLSBEb2luZyBQVVQgd2l0aCAtLWRpZ2VzdCBmYWlsZWQsIGFzIHJlcG9ydGVkIGluIGJ1ZyByZXBvcnQgIzgwNTg1My4KCi0gVXNpbmcgLS1hbnlhdXRoIHRoYXQgcGlja2VkIE5UTE0sIGFuZCB0aGVuIGEgcmVkaXJlY3QgY2xvc2VkIHRoZSBjb25uZWN0aW9uCiAgYW5kIHRvb2sgY3VybCB0byBhIHNlY29uZCBOVExNIHBhZ2UgbWFkZSBjdXJsIGZhaWwuIEJ1ZyByZXBvcnQgIzgwNjMyOAogIGlkZW50aWZpZWQgdGhlIHByb2JsZW0sIHRlc3QgY2FzZSA5MCB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDE0IFNlcHRlbWJlcikKLSBjb2RlbWFzdHIgYnJvdWdodCBhIHBhdGNoIGZvciBhcmVzIHRvIG1ha2UgdGhlIFdpbmRvd3MgcG9ydGlvbnMgb2YgaXQgd29yawogIHByb3Blcmx5IG9uIE5UNC4gSSB1cGxvYWRlZCBhIG5ldyBkaWZmIGFuZCB1cGRhdGVkIHRoZSBkb2NzIG9uIHdoZXJlIHRvIGdldAogIGl0IGV0Yy4KCi0gSmVmZiBQb2hsbWV5ZXIgdHJhY2tlZCBkb3duIGEgdmVyeSBoYXJkLXRvLWZpbmQgYnVnIHdoZXJlIHdlIHJlbW92ZWQgYQogIGNhY2hlZCBETlMgZW50cnkgZXZlbiB0aG91Z2ggaXQgbWF5IGJlIGluIHVzZSwgd2hpY2ggY2F1c2VkICJyYW5kb20iIG1lbW9yeQogIHRvIGdldCBvdmVyd3JpdHRlbiBhbmQgdGh1cyAicmFuZG9tIiBjcmFzaGVzLgoKRGFuaWVsICgxMiBTZXB0ZW1iZXIpCi0gQmFzZWQgb24gYSBidWcgcmVwb3J0IGJ5IERhdmlkIEtpbWRvbiwgSSBtYWRlIHRoZSBydW50ZXN0cy5wbCBzY3JpcHQgY2xlYXIKICBhbGwgcG9zc2libGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzIGJlZm9yZSB0aGUgdGVzdHMgYXJlIHJ1bi4KCi0gQnkgZGVmYXVsdCwgZWFzeSBoYW5kbGVzIHdpdGhpbiBhIG11bHRpIGhhbmRsZSBub3cgc2hhcmUgRE5TIGNhY2hlLgoKLSBUaW0gQmFydGxleSBicm91Z2h0IGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgR1NTTkVHT1RJQVRFIG9wdGlvbiB3b3JrIGZvcgogIE1pY3Jvc29mdCdzICJOZWdvdGlhdGUiIGF1dGhlbnRpY2F0aW9uIGFzIHdlbGwuCgpEYW5pZWwgKDExIFNlcHRlbWJlcikKLSBBIHplcm8tbGVuZ3RoIHByb3h5IHN0cmluZyBjb25mdXNlZCBGVFAgdHJhbnNmZXJzLgoKLSBCam9ybiBSZWVzZSBmb3VuZCBhIGNhc2Ugd2l0aCBhbiB1bmluaXRpYWxpemVkIHBvaW50ZXIsIG9ubHkgcHJlc2VudCB3aGVuCiAgYnVpbHQgZm9yIGFyZXMuCgpWZXJzaW9uIDcuMTAuOC1wcmUxICg4IFNlcHRlbWJlciAyMDAzKQoKRGFuaWVsICg3IFNlcHRlbWJlcikKLSBKdXJpaiBTbWFrb3YgZm91bmQgb3V0IHRoYXQgdGhlIG5vbi1PcGVuU1NMIE1ENSBjb2RlIHdhcyBub3Qgd29ya2luZyBvbgogIEFscGhhIChvciBpYTY0KS4gT25seSB0aGUgT3BlblNTTC12ZXJzaW9uIGRpZC4gSSBtYWRlIGEgZml4IEkgdGhpbmsgY29ycmVjdHMKICB0aGUgcHJvYmxlbS4gCgpEYW5pZWwgKDUgU2VwdGVtYmVyKQotIEtldmluIEZpc2sgcmVwb3J0ZWQgdGhhdCBjb25maWd1cmUgLS1lbmFibGUtdGhyZWFkIGRpZG4ndCB3b3JrLiBJIGZpeGVkLgoKLSBEZS1tYWNyb2ZpZWQgdGhlIGxpYi9oYXNoLmMgc291cmNlIGNvZGUgc29tZXdoYXQuCgpEYW5pZWwgKDQgU2VwdGVtYmVyKQotIENVUkxJTkZPX0hUVFBBVVRIX0FWQUlMIGFuZCBDVVJMSU5GT19QUk9YWUFVVEhfQVZBSUwgYWRkZWQsIEJhc2VkIG9uIEpvZXJnCiAgTXVlbGxlci1Ub2xrJ3MgcGF0Y2gsCgpFYXJseSAoNCBTZXB0ZW1iZXIpCi0gQWRkZWQgQ1VSTE9QVF9GVFBfUkVTUE9OU0VfVElNRU9VVCAtIGFsbG93cyB1c2VyIHRvIHNldCBzdHJpY3QgdGltZW91dAogIHJlcXVpcmVtZW50cyBvbiB0aGUgRlRQIHNlcnZlcidzIGFiaWxpdHkgdG8gcmVzcG9uZCB0byBpbmRpdmlkdWFsIGNvbW1hbmRzCiAgd2l0aG91dCBwbGFjaW5nIGdsb2JhbCByZXF1aXJlbWVudHMgb24gdHJhbnNmZXIgb3IgY29ubmVjdCB0aW1lLiAgRmlsZXMKICBhZmZlY3RlZDoKICAgIC0gaW5jbHVkZS9jdXJsL2N1cmwuaAogICAgICAgIEFkZGVkIG9wdGlvbiBDVVJMT1BUX0ZUUF9SRVNQT05TRV9USU1FT1VUCiAgICAtIGxpYi9mdHAuYwogICAgICAgIEFkZGVkIGJyYW5jaCBpbnNpZGUgQ3VybF9HZXRGVFBSZXNwb25zZSB0byBjaGVjayBmb3IgCiAgICAgICAgZGF0YS0+c2V0LmZ0cF9yZXNwb25zZV90aW1lb3V0CiAgICAtIGxpYi91cmwuYwogICAgICAgIE1vZGlmaWVkIEN1cmxfc2V0b3B0IHRvIHJlY29nbml6ZSBDVVJMT1BUX0ZUUF9SRVNQT05TRV9USU1FT1VUCiAgICAtIGxpYi91cmxkYXRhLmgKICAgICAgICBBZGRlZCBmdHBfcmVzcG9uc2VfdGltZW91dCB0byBzdHJ1Y3QgVXNlckRlZmluZWQKCkRhbmllbCAoMyBTZXB0ZW1iZXIpCi0gUGV0ZXIgUGVudGNoZXYgZm91bmQgYW5kIGZpeGVkIHR3byBwcm9ibGVtcyBpbiB0aGUgdGVzdCBzdWl0ZSdzIHdlYiBzZXJ2ZXIKICBjb2RlLCB0aGF0IG1hZGUgaXQgc2VnZmF1bHQgYXQgdGltZXMuCgotIEr2cmcgTXVlbGxlci1Ub2xrIGltcHJvdmVkIHRoZSBwcm94eSB1c2VyK3Bhc3N3b3JkIGhhbmRsaW5nLCBlc3BlY2lhbGx5CiAgd2hlbiBwcm92aWRpbmcgYSBibGFuayBwYXNzd29yZC4KCkRhbmllbCAoMiBTZXB0ZW1iZXIpCi0gRml4IGZvciBtYWtpbmcgQ09OTkVDVCB0byBwcm94aWVzIGRvIHRoZSBjb3JyZWN0IG1hZ2ljIHRvIGFsbG93IE5UTE0sIERpZ2VzdAogIGFuZCBzaW1pbGFyIHRvIHdvcmsuCgpEYW5pZWwgKDEgU2VwdGVtYmVyKQotIEhlbnJpayBTdG9ybmVyIG1hZGUgbGliY3VybCB3b3JrIGZpbmUgd2l0aCBPcGVuTERBUCAyLjEuMjIgKGN1cnJlbnQpLgoKLSBKZWZmIFBvaGxtZXllciBhZGRlZCBhIHByb3BlciBlcnJvciBtZXNzYWdlIGZvciBub24tcmVzb2x2aW5nIGhvc3RzIHdoZW4KICB1c2luZyBhcmVzIGZvciBsb29rdXBzLgoKRGFuaWVsICgyNSBBdWd1c3QpCi0gSm9obiBNY0dvd2FuIHJlcG9ydGVkIHRoYXQgY3VybCAtayBzdGlsbCBmYWlsZWQgaWYgdGhlIEhUVFBTIHNlcnZlcidzIENOCiAgZmllbGQgd2Fzbid0IG9idGFpbmFibGUuIFRoaXMgd2FzIGR1ZSB0byB0aGUgQ1VSTE9QVF9TU0xfVkVSSUZZSE9TVCBiZWluZwogIHNldCB0byAxLCBhbmQgbGliY3VybCBmYWlsZWQgaWYgdGhlIENOIHdhcyBtaXNzaW5nLiBTdGFydGluZyBub3csIGhhdmluZyBpdAogIHNldCB0byAxIHdpbGwgc2ltcGx5IG91dHB1dCBhIHdhcm5pbmcgaWYgbm8gQ04gY291bGQgYmUgb2J0YWluZWQgKGFzIGhhdmluZwogIGEgbWlzbWF0Y2ggaXMgT0spLgoKRGFuaWVsICgyMSBBdWd1c3QpCi0gVmluY2VudCBTYW5kZXJzIHByb3ZpZGVkIGEgZml4IGZvciBuYW1lIHJlc29sdmluZyB3aGVuIGxpbmtlZCB3aXRoIHVDbGliYy4KCkRhbmllbCAoMjAgQXVndXN0KQotIEdlcmQgdi4gRWdpZHkgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgc3RvcmUgdGhlIEZUUCByZXNwb25zZQogIGNvZGUgZnJvbSBmdHAgc2VydmVycy4gVXNpbmcgY3VybF9lYXN5X2dldGluZm8oKSB3aXRoIENVUkxJTkZPX0hUVFBfQ09ERQogIHJldHVybnMgdGhhdCBkYXRhLiBUaGUgb3B0aW9uIGlzIHRoZXJlZm9yZSBub3cgYWxzbyBrbm93biBhcwogIENVUkxJTkZPX1JFU1BPTlNFX0NPREUuCgotIEFudG9pbmUgQ2FsYW5kbyBmb3VuZCBhIHNlZ2ZhdWx0IHdoZW4gZG9pbmcgbXVsdGktcGFydC9mb3JtcG9zdCB1c2luZwogIHRoZSBtdWx0aSBpbnRlcmZhY2UuCgotIEFudG9pbmUgQ2FsYW5kbyBwb2ludGVkIG91dCB0aGF0IGN1cmxfbXVsdGlfaW5mb19yZWFkKCkgZGlkbid0IHNldCB0aGUKICBtc2dzX2luX3F1ZXVlIHRvIDAgcHJvcGVybHkgd2hlbiByZXR1cm5pbmcgTlVMTC4KCkRhbmllbCAoMTkgQXVndXN0KQotIEkgbWFkZSBjdXJsIHN1cHBvcnQgbXVsdGlwbGUgLVQgb3B0aW9ucywgYXMgd2VsbCBhcyAtVCAie2ZpbGUxLGZpbGUyfSIKICBzdHlsZSBnbG9iYmluZy4gT25lIC1UIGZvciBlYWNoIFVSTCBpcyBzdXBwb3J0ZWQuCgotIEplZmYgUG9obG1leWVyIGZvdW5kIGEgc2VnZmF1bHQgd2hlbiB1c2luZyBhcmVzLWVuYWJsZWQgbGliY3VybCBhbmQgdGhlCiAgbXVsdGkgaW50ZXJmYWNlIHdoZW4gdHJ5aW5nIGEgbm9uLWV4aXN0aW5nIGhvc3QgbmFtZS4KCi0gTWFkZSB0aGUgbGliY3VybCBwcmludGYgY29kZSBzdXBwb3J0IGxvbmcgbG9uZ3MgaWYgYXZhaWxhYmxlLgoKLSBMb3JlbiBLaXJrYnkgcG9pbnRlZCBvdXQgdGhhdCB3ZSBkaWQgbm90IGNsZWFuIHVwIGFsbCBTU0wtYWxsb2NhdGVkIG1lbW9yeQogIGluIGN1cmxfZ2xvYmFsX2NsZWFudXAoKS4KCkRhbmllbCAoMTcgQXVndXN0KQotIFNldHRpbmcgQ1VSTE9QVF9XUklURUZVTkNUSU9OIG9yIENVUkxPUFRfUkVBREZVTkNUSU9OIHRvIE5VTEwgd2lsbCBub3cgbWFrZQogIHRoZW0gZ2V0IHRoZSBpbnRlcm5hbCBkZWZhdWx0cyByZXN0b3JlZC4gUHJldmlvdXNseSB0aGlzIGNvdWxkIGNhdXNlIGEKICBzZWdmYXVsdC4gV2Ugc2hvdWxkIGFpbSBhdCBoYXZpbmcgYWxsIHBvaW50ZXItcmVsYXRlZCBvcHRpb25zIGdldCByZXN0b3JlZAogIHRvIGRlZmF1bHQvc2FmZSB2YWx1ZXMgd2hlbiBzZXQgdG8gTlVMTC4KClZlcnNpb24gNy4xMC43ICgxNSBBdWd1c3QgMjAwMykKCkRhbmllbCAoMTQgQXVndXN0KQotIEkgbW9kaWZpZWQgdGhlIG1lbWRlYnVnIHN5c3RlbSB0byByZXR1cm4gZmFpbHVyZSBvbiBtZW1vcnkgYWxsb2NhdGlvbgogIGZ1bmN0aW9ucyBhZnRlciBhIHNldCBhbW91bnQgb2Ygc3VjY2Vzc2Z1bCBvbmVzLiBUaGlzIGVuYWJsZXMgdXMgdG8gdGVzdAogIG91dC1vZi1tZW1vcnkgc2l0dWF0aW9ucyBpbiBhIGNvbnRyb2xsZWQgbWFubmVyIGFuZCB3ZSBjYW4gbWFrZSBzdXJlIHRoYXQKICBjdXJsL2xpYmN1cmwgYmVoYXZlcyBnb29kIGluIHRob3NlLgoKICBUaGlzIG1hZGUgbWUgZmluZCBhbmQgZml4IHNldmVyYWwgc3BvdHMgd2hlcmUgd2UgZGlkIG5vdCBjbGVhbnVwIHByb3Blcmx5CiAgd2hlbiBiYWlsaW5nIG91dCBkdWUgdG8gZXJyb3JzIChsb3cgbWVtb3J5KS4KCi0gQ29ycmVjdGVkIHRlc3QgY2FzZSA3NC4gTWFkZSB1c2luZyAtbyB3aXRoIGJhZCAjW251bV0gY29kZXMgY29tcGxhaW4gYW5kCiAgYmFpbCBvdXQuIE1hZGUgI1tudW1dIHN1cHBvcnQgbnVtYmVycyBsYXJnZXIgdGhhbiA5IGFzIHdlbGwuIEFkZGVkIHRlc3QKICBjYXNlIDg2IGZvciBhIHByb3BlciByYW5nZSBnbG9iYmluZyB0ZXN0IGFzIHdlbGwuCgpWZXJzaW9uIDcuMTAuNy1wcmU0ICgxMiBBdWd1c3QgMjAwMykKCkRhbmllbCAoMTIgQXVndXN0KQotIGN1cmxfdmVyc2lvbl9pbmZvKCkgbm93IHJldHVybnMgYSBmbGFnIGlmIGxpYmN1cmwgd2FzIGJ1aWx0IHdpdGggYXN5bmNoIEROUwogIHN1cHBvcnQsIGFuZCB0aGlzIGlzIG5vdyBhbHNvIGRpc3BsYXllZCB3aXRoICdjdXJsIC1WJy4KCi0gQWRkZWQgYSBmZXcgbmV3IG1hbiBwYWdlcyB0byB0aGUgZG9jcy9saWJjdXJsIGRpcjogY3VybF9zaGFyZV9pbml0LAogIGN1cmxfc2hhcmVfc2V0b3B0LCBjdXJsX3NoYXJlX2NsZWFudXAsIGxpYmN1cmwtZWFzeSBhbmQgbGliY3VybC1zaGFyZS4KCkRhbmllbCAoMTEgQXVndXN0KQotIE1pa2UgQ2hlcmVwb3YgbWFkZSB0aGUgbG9jYWwgYmluZGluZyBjb2RlIHdvcmsgZm9yIFdpbmRvd3MsIHdoaWNoIG1ha2VzCiAgdGhlIG9wdGlvbiBDVVJMT1BUX0lOVEVSRkFDRSB3b3JrIG9uIFdpbmRvd3MgYXMgd2VsbC4KCi0gVmluY2VudCBTYW5kZXJzIHVwZGF0ZWQgdGhlIGZvcGVuLmMgZXhhbXBsZSBjb2RlIGEgbG90LgoKLSAtLXByb3h5LW50bG0gaXMgbm93IHN1cHBvcnRlZCBieSB0aGUgY3VybCB0b29sLiBJdCBmb3JjZXMgdGhlIHByb3h5CiAgYXV0aGVudGljYXRpb24gdG8gYmUgbWFkZSB1c2luZyBOVExNLiBJdCBkb2VzIG5vdCB5ZXQgd29yayBmb3IgSFRUUFMgb3ZlcgogIHByb3hpZXMgKG9yIG90aGVyIHByb3h5LXR1bm5lbGluZyBvcHRpb25zKS4gVGVzdCBjYXNlIDgxIGFuZCA4MiBkbyBzb21lCiAgc2ltcGxlIGluaXRpYWwgbnRsbSB0ZXN0aW5nLgoKLSBGb3VuZCBhbmQgZml4ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBvbiByZS11c2VkIGNvbm5lY3Rpb25zIHdpdGgKICBwcm94eS1hdXRoZW50aWNhdGlvbi4KCi0gSSByZW1vdmVkIC1AIGFuZCAtWiBhcyB2YWxpZCBzaG9ydCBvcHRpb25zLiBUaGV5IHdlcmUgdmVyeSByYXJlbHkgdXNlZCAoQAogIHdhc24ndCBldmVuIGRvY3VtZW50ZWQpLgoKLSBTZXJnZSBTZW1hc2hrbyBpbnRyb2R1Y2VkIENVUkxPUFRfUFJPWFlBVVRILCBhbmQgbWFrZSBpdCB3b3JrIHdoZW4gc2V0IHRvCiAgQ1VSTEFVVEhfTlRMTSBhbmQvb3IgQ1VSTEFVVEhfQkFTSUMuIFRoZSBQUk9YQVVUSCBpcyBzaW1pbGFyIHRvIEhUVFBBVVRILAogIGJ1dCBpcyBmb3IgdGhlIHByb3h5IGNvbm5lY3Rpb24gb25seSwgYW5kIEhUVFBBVVRIIGlzIGZvciB0aGUgcmVtb3RlIGhvc3QuCgotIEZpeGVkIGxvYWRpbmcgb2YgY29va2llcyB3aXRoIGJsYW5rIGNvbnRlbnRzIGZyb20gYSBjb29raWUgamFyLiBBbHNvIG1hZGUgdGhlCiAgY29va2llIGZ1bmN0aW9ucyBpbmZvcm0gb24gYWRkZWQgYW5kIHNraXBwZWQgY29va2llcyAoZm9yIGNvb2tpZSBkZWJ1Z2dpbmcpLgoKVmVyc2lvbiA3LjEwLjctcHJlMyAoOCBBdWd1c3QgMjAwMykKCkRhbmllbCAoOCBBdWd1c3QpCi0gQXBwbGllZCBEYXZpZCBCeXJvbidzIGZpeCBmb3IgZmlsZTovLyBVUkxzIHdpdGggZHJpdmUgbGV0dGVycyBpbmNsdWRlZC4KCi0gSSBhZGRlZCB0aGUgLS1mdHAtY3JlYXRlLWRpcnMgdG8gdGhlIGNsaWVudCBjb2RlLCB3aGljaCBhY3RpdmF0ZXMgRWFybHkncwogIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMgb3B0aW9uLCBhbmQgd3JvdGUgdGVzdCBjYXNlIDE0NyB0byB2ZXJpZnkKICBpdC4gQWRkZWQgdGhlIG9wdGlvbiB0byB0aGUgY3VybC4xIG1hbiBwYWdlIHRvby4gQWRkZWQgdGhlIG9wdGlvbiB0byB0aGUKICBjdXJsX2Vhc3lfc2V0b3B0LjMgbWFuIHBhZ2UgdG9vLgoKRGFuaWVsICg3IEF1Z3VzdCkKLSBUZXN0IGNhc2UgNjAgZmFpbGVkIG9uIGlhNjQgYW5kIEFNRCBPcHRlcm9uLiBGaXhlZCBub3cuCgotIEZpeGVkIGEgcHJpbnRmIHByb2JsZW0gdGhhdCByZXN1bHRlZCBpbiB1cmxnbG9iYmluZyBidWdzIChidWcgIzIwMzgyNyBpbiB0aGUKICBkZWJpYW4gYnVnIHRyYWNrZXIpLiBBZGRlZCB0ZXN0IGNhc2UgNzQgdG8gdmVyaWZ5IHRoZSBmaXggYW5kIHRvIGRpc2NvdmVyIGlmCiAgdGhpcyBicmVha3MgaW4gdGhlIGZ1dHVyZS4KCi0gIm1ha2UgZGlzdGNoZWNrIiB3b3JrcyBhZ2Fpbi4KClZlcnNpb24gNy4xMC43LXByZTIgKDYgQXVndXN0IDIwMDMpCgpEYW5pZWwgKDUgQXVndXN0KQotIER1bmNhbiBXaWxjb3ggaGVscGVkIG1lIHZlcmlmeSB0aGF0IHRoZSBsYXRlc3QgaW5jYXJuYXRpb24gb2YgbXkgYXJlcyBwYXRjaAogIGJ1aWxkcyBmaW5lIG9uIE1hYyBPUyBYIChzZWUgdGhlIG5ldyBsaWIvUkVBRE1FLmFyZXMpIGZpbGUgZm9yIGFsbCBkZXRhaWxzLgoKLSBTYWx2YXRvcmUgU29ycmVudGlubyBmaWxlZCBidWcgcmVwb3J0ICM3ODMxMTYgYW5kIEVhcmx5IEVobGluZ2VyIHBvc3RlZCBhCiAgYnVnIHJlcG9ydCB0byB0aGUgbGliY3VybCBsaXN0LCBib3RoIGlkZW50aWZ5aW5nIGEgcHJvYmxlbSB3aXRoIEZUUAogIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIGhvdyB0aGUgZGlyIGhpZXJhcmNoeSB3YXMgbm90IHByb3Blcmx5IHJlc2V0CiAgYmV0d2VlbiBmaWxlcy4KCi0gRGF2aWQgQnlyb24ncyB0aG91Z2h0cyBvbiBhIGZpeGVkIE1ha2VmaWxlIGluIHRlc3RzLyB3ZXJlIGFwcGxpZWQuCgotIEphbiBTdW5kaW4gcmVwb3J0ZWQgYSBjYXNlIHdoZXJlIGN1cmwgaWdub3JlZCBhIGNvb2tpZSB0aGF0IGJyb3dzZXJzIGRvbid0LAogIHdoaWNoIHR1cm5lZCB1cCB0byBiZSBkdWUgdG8gdGhlIG51bWJlciBvZiBkb3RzIGluIHRoZSAnZG9tYWluJy4gSSd2ZSBub3cKICBtYWRlIGN1cmwgZm9sbG93IHRoZSB0aGUgb3JpZ2luYWwgbmV0c2NhcGUgY29va2llIHNwZWMgbGVzcyBzdHJpY3Qgb24gdGhhdAogIHBhcnQuCgpEYW5pZWwgKDQgQXVndXN0KQotIERpcmsgTWFuc2tlIGFkZGVkIGNvb2tpZSBzdXBwb3J0IGZvciB0aGUgZXhwZXJpbWVudGFsLCBoaWRkZW4gYW5kIHN0aWxsCiAgdW5kb2N1bWVudGVkIHNoYXJlIGZlYXR1cmUhCgotIE1hcmsgRmxldGNoZXIgcHJvdmlkZWQgYW4gZXhjZWxsZW50IGJ1ZyByZXBvcnQgdGhhdCBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggRk9MTE9XTE9DQVRJT04gYW5kIGNodW5rZWQgdHJhbnNmZXItZW5jb2RpbmcsIGFzIGxpYmN1cmwgd291bGQgbm90CiAgcHJvcGVybHkgaWdub3JlIHRoZSBib2R5IGNvbnRlbnRzIG9mIDNYWCByZXNwb25zZSB0aGF0IGluY2x1ZGVkIHRoZQogIExvY2F0aW9uOiBoZWFkZXIuCgpFYXJseSAoNiBBdWd1c3QpCi0gQWRkZWQgb3B0aW9uIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMKICAgIFRoaXMgb3B0aW9uIHdpbGwgZm9yY2UgdGhlIHRhcmdldCBmaWxlJ3MgcGF0aCB0byBiZSBjcmVhdGVkIGlmIGl0CiAgICBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0IG9uIHRoZSByZW1vdGUgc3lzdGVtLgogCiAgRmlsZXMgYWZmZWN0ZWQ6CiAgICAtIGluY2x1ZGUvY3VybC9jdXJsLmgKICAgICAgICBBZGRlZCBvcHRpb24gQ1VSTE9QVF9GVFBfQ1JFQVRFX01JU1NJTkdfRElSUwogICAgLSBsaWIvZnRwLmMKICAgICAgICBBZGRlZCBmdW5jdGlvbiBmdHBfbWtkLCB3aGljaCBpc3N1ZXMgYSBNS0QgY29tbWFuZAogICAgICAgIEFkZGVkIGZ1bmN0aW9uIGZ0cF9mb3JjZV9jd2QsIHdoaWNoIGF0dGVtcHRzIGEgQ1dELAogICAgICAgICAgYW5kIGRvZXMgYSBNS0QgYW5kIHJldHJpZXMgdGhlIENXRCBpZiB0aGUgb3JpZ2luYWwgQ1dECiAgICAgICAgICBmYWlscwogICAgICAgIE1vZGlmaWVkIGZ0cF9wZXJmb3JtKCkgdG8gY2FsbCBpdHMgY2hhbmdlIGRpcmVjdG9yeSBmdW5jdGlvbgogICAgICAgICAgdGhyb3VnaCBhIHBvaW50ZXIuICBUaGUgcG9pbnRlciBwb2ludHMgdG8gZnRwX2N3ZCBieSBkZWZhdWx0LAogICAgICAgICAgYW5kIGlzIG1vZGlmaWVkIHRvIHBvaW50IHRvIGZ0cF9mb3JjZV9jd2QgSUZGCiAgICAgICAgICBkYXRhLT5zZXQuZnRwX2NyZWF0ZV9taXNzaW5nX2RpcnMgaXMgbm90IDAuICAgICAgICAKICAgIC0gbGliL3VybC5jCiAgICAgICAgTW9kaWZpZWQgQ3VybF9zZXRvcHQgdG8gcmVjb2duaXplIENVUkxPUFRfRlRQX0NSRUFURV9NSVNTSU5HX0RJUlMKICAgIC0gbGliL3VybGRhdGEuaAogICAgICAgIEFkZGVkIGZ0cF9jcmVhdGVfbWlzc2luZ19kaXJzIHRvIHN0cnVjdCBVc2VyRGVmaW5lZAogICAgICAgCi0gTWlub3IgQnVnZml4IGZvciBDVVJMT1BUX1RJTUVDT05ESVRJT04gd2l0aCBGVFAgLSBpZiB0aGUgZmlsZSB3YXMgbm90CiAgcHJlc2VudCB0byBkbyB0aGUgdGltZSBjb21wYXJpc29uLCBpdCB3b3VsZCBmYWlsLgogIEZpbGVzIGFmZmVjdGVkOgogICAgLSBsaWIvZnRwLmMKICAgICAgICBJbiBmdHBfcGVyZm9ybSgpLCB0aGUgY2FsbCB0byBmdHBfZ2V0ZmlsZXRpbWUoKSB1c2VkIHRvIGJlIGZvbGxvd2VkCiAgICAgICAgYnkKCSAgaWYgKHJlc3VsdCkKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICBBbmQgdGhlbiBieSB0aGUgY29kZSB0aGF0IGFjdHVhbGx5IGRpZCB0aGUgdGltZSBjb21wYXJpc29uLgogICAgICAgIFRoZSBjb2RlIHRoYXQgZGlkIHRoZSBjb21wYXJpc29uIGhhbmRsZWQgdGhlIGNhc2Ugd2hlcmUgdGhlIGZpbGV0aW1lCiAgICAgICAgd2FzIG5vdCBhdmFpbGFibGUgKGFzIGluZGljYXRlZCBieSBpbmZvLmZpbGV0aW1lIDwgMCBvciBzZXQudGltZXZhbHVlIAogICAgICAgIDwgMCksIHNvIEkgcmVwbGFjZWQgdGhlIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQgd2l0aCBhIHN3aXRjaChyZXN1bHQpCiAgICAgICAgdGhhdCBhbGxvd3MgQ1VSTEVfRlRQX0NPVUxETlRfUkVUUl9GSUxFIHRvIGZhbGwgdGhyb3VnaCB0byB0aGUgCiAgICAgICAgbm9ybWFsIHRpbWUgY29tcGFyaXNvbi4KCkRhbmllbCAoMyBBdWd1c3QpCi0gV2hlbiBwcm94eSBhdXRoZW50aWNhdGlvbiBpcyB1c2VkIGluIGEgQ09OTkVDVCByZXF1ZXN0IChhcyB1c2VkIGZvciBhbGwgU1NMCiAgY29ubmVjdHMgYW5kIG90aGVyd2lzZSBlbmZvcmNlZCB0dW5uZWwtdGhydS1wcm94eSByZXF1ZXN0cyksIHRoZSBzYW1lCiAgYXV0aGVudGljYXRpb24gaGVhZGVyIGlzIGFsc28gd3JvbmdseSBzZW50IHRvIHRoZSByZW1vdGUgaG9zdC4KCiAgVGhpcyBpcyBhIHJhdGhlciBzaWduaWZpY2FudCBpbmZvIGxlYWsuIEkndmUgZml4ZWQgaXQgbm93IGFuZCBtYWlsZWQgYSBwYXRjaAogIGFuZCB3YXJuaW5nIHRvIHRoZSBtYWlsaW5nIGxpc3RzLgoKRGFuaWVsICgxIEF1Z3VzdCkKLSBEYXZpZCBCeXJvbiBwcm92aWRlZCBhIHBhdGNoIHRvIG1ha2UgNy4xMC42IGJ1aWxkIGNvcnJlY3RseSB3aXRoIHRoZQogIGNvbXByZXNzZWQgaHVnZWhlbHAuYyBzb3VyY2UgZmlsZS4KClZlcnNpb24gNy4xMC43LXByZTEgKDMxIEp1bHkgMjAwMykKCkRhbmllbCAoMzAgSnVseSkKLSBK9nJnIE38bGxlci1Ub2xrIHVwZGF0ZWQgdGhlIFZDIG1ha2VmaWxlLgoKLSBEYW5pZWwgTm9ndWVyb2wgbWFkZSB0aGUgZnRwIGNvZGUgb3V0cHV0ICJBY2NlcHQtUmFuZ2VzOiBieXRlcyIgaW4gc2ltaWxhcgogIHN0eWxlIGxpa2Ugb3RoZXIgZmFrZWQgSFRUUCBoZWFkZXJzIHdoZW4gTk9CT0RZIGFuZCBIRUFERVIgYXJlIHVzZWQuIEkKICB1cGRhdGVkIHR3byBjb3JyZXNwb25kaW5nIHRlc3QgY2FzZXMgdG9vLgoKLSBNYXJ0eSBLdWhydCBwb2ludGVkIG91dCBhIGNvbXBpbGF0aW9uIHByb2JsZW0gb24gVk1TIGR1ZSB0byBteSBoYXZpbmcKICBjaGFuZ2VkIGEgdHlwZSBmcm9tIGxvbmcgdG8gdGltZV90LCBhbmQgSSdtIG5vdyBjaGFuZ2luZyBpdCBiYWNrIHRvIHdvcmsKICBtb3JlIHBvcnRhYmx5Li4uCgogIEhlIGFsc28gaW5kaWNhdGVkIHRoYXQgZGlzdHJpYnV0aW5nIHRoZSBzcmMvaHVnZWhlbHAuYyBpbiBhIGNvbXByZXNzZWQgc3RhdGUKICBsaWtlIEkgYWNjaWRlbnRhbGx5IGRpZCBtYXkgbm90IGJlIHRoZSBzbWFydGVzdCBtb3ZlLi4uIEkndmUgbm93IGZpeGVkIHRoZQogIGRpc3RyaWJ1dGUgcHJvY2VkdXJlIHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgYW4gdW5jb21wcmVzc2VkIHZlcnNpb24gd2hlbiBJCiAgbWFrZSByZWxlYXNlIGFyY2hpdmVzLgoKRGFuaWVsICgyOSBKdWx5KQotIEdpc2xlIFZhbmVtIGJyb3VnaHQgY2hhbmdlcyB0byB0aGUgbWtoZWxwIHNjcmlwdCBmb3IgdGhlIGdlbmVyYXRpb24gb2YgdGhlCiAgY29tcHJlc3NlZCBoZWxwIHRleHQgb24gc29tZSBwbGF0Zm9ybXMuCgpWZXJzaW9uIDcuMTAuNiAoMjggSnVseSAyMDAzKQoKRGFuaWVsICgyOCBKdWx5KQotIEZyYW7nb2lzIFBvbnMgYnJvdWdodCBhIHBhdGNoIHRoYXQgb25jZSBhZ2FpbiBtYWRlIGN1cmwgZGVhbCB3aXRoIGZ0cCBhbmQKICAiZG91YmxlIHNsYXNoIiBhcyBpbmRpY2F0aW5nIHRoZSByb290IGRpcmVjdG9yeS4gSW4gdGhlIFJGQzE3MzgtZml4IG9mIEFwcmlsCiAgMzAsIHRoYXQgYWJpbGl0eSB3YXMgcmVtb3ZlZCAoc2luY2UgaXQgaXMgbm90IHRoZSAicmlnaHQiIHdheSkuIFNvLCBzdGFydGluZwogIG5vdyB3ZSBjYW4gbGlzdCB0aGUgcm9vdCBkaXIgb2YgYW4gZnRwIHNlcnZlciBib3RoIHRoZXNlIHdheXM6CgogICAgY3VybCBmdHA6Ly9zZXJ2ZXIuY29tLyUyZiAgYXMgd2VsbCBhcwogICAgY3VybCBmdHA6Ly9zZXJ2ZXIuY29tLy8KCkRhbmllbCAoMjQgSnVseSkKLSBIZW5yeSBCbGFuZCBwb2ludGVkIG91dCB0aGF0IHdlIGluY2x1ZGVkIHN5cy9yZXNvdXJjZS5oIHdpdGhvdXQgZ29vZCByZWFzb24KICBpbiBzZXZlcmFsIHNvdXJjZSBmaWxlcy4gV2l0aG91dCBpdCBpbmNsdWRlZCwgUU5YIGJ1aWxkcyBiZXR0ZXIuLi4KCi0gQW5kculzIEdhcmPtYSB1cGRhdGVkIHRoZSBtaW5ndyBtYWtlZmlsZXMuCgpEYW5pZWwgKDIzIEp1bHkpCi0gVHJhY3kgQm9laHJlciBleHBlcmllbmNlZCBETlMgY2FjaGUgcHJvYmxlbXMgYW5kIGRpZCBzb21lIG5pY2UgZGVidWdnaW5nCiAgYW5kIHRyYWNraW5nIHdoaWNoIG1hZGUgaXQgZWFzeSBmb3IgbWUgdG8gY29ycmVjdCB0aGUgcHJvYmxlbSBhbmQgVHJhY3kKICBjb3VsZCB2ZXJpZnkgdGhhdCBpdCBkaWQgY3VyZSB0aGUgcHJvYmxlbSEgV2hlbiByZS11c2luZyBhIGNvbm5lY3Rpb24gd2UKICBub3cgbWFrZSBzdXJlIHdlIGRvbid0IHJlLXVzZSB0aGUgJ2Nvbm5lY3RfYWRkcicgc3RydWN0LgoKLSBEYW5pZWwgS291cmlsIGNvcnJlY3RlZCB0aGUgR1NTLU5lZ290aWF0ZSBjb2RlLgoKLSBKdWFuIEYuIENvZGFnbm9uZSBwcm92aWRlZCBmaXhlcyB0byBhbGxvdyBjdXJsIHRvIGJ1aWxkIGZpbmUgb24gV2luZG93cwogIGFnYWluLgoKRGFuaWVsICgyMiBKdWx5KQotIEVkaXRlZCB0aGUgY3VybC9jdXJsLmggaW5jbHVkZSBmaWxlIHRvIGJ1aWxkIG9uIFdpbmRvd3MgcHJvcGVybHkuCgpEYW5pZWwgKDIxIEp1bHkpCi0gTW92ZWQgdGhlIHByb3h5IGNyZWRlbnRpYWxzIGZyb20gdGhlIFNlc3Npb25IYW5kbGUgc3RydWN0IHRvIHRoZSBjb25uZWN0ZGF0YQogIHN0cnVjdCwgdG8gbWFrZSBtdWx0aXBsZSBwcm94eSBjb25uZWN0aW9ucyB3aXRoIGRpZmZlcmVyZW50IHVzZXIgbmFtZXMgd29yay4KCi0gQWRqdXN0ZWQgdGhlIE5UTE0gY29kZSB0byBzdXBwb3J0IHByb3h5IGZ1bmN0aW9uYWxpdHkuCgotIE1hZGUgdGhlIGtyYjQgc3R1ZmYgY29tcGlsZSB3aXRoIHRoZSB1c2VyK3Bhc3N3b3JkIGZpZWxkcyBtb3ZlZC4KClZlcnNpb24gNy4xMC42LXByZTQgKDIxIEp1bHkgMjAwMykKCkRhbmllbCAoMjAgSnVseSkKLSBEYXZpZCBHYXJkbmVyIHBvaW50ZWQgb3V0IGluIGJ1ZyByZXBvcnQgNzcwNzU1IHRoYXQgdXNpbmcgdGhlIEZUUCBjb21tYW5kCiAgQ1dEIHdpdGggYSBibGFuayBhcmd1bWVudCBpcyBhIGJhZCBpZGVhIGFuZCBJIG1hZGUgbGliY3VybCBza2lwIGVtcHR5IHBhdGgKICBzZWdtZW50cyBzdGFydGluZyBub3cuCgpEYW5pZWwgKDE4IEp1bHkpCi0gQ3JpcyBwb2ludGVkIG91dCB0aGF0IG15IGZpeCBvbiBKdWx5IDE2dGggZGlkbid0IHdvcmsgZnVsbHkuIEhpcyBwb2ludGluZwogIG91dCB0aGlzIChhbmQgaGlzIHBhdGNoKSBhbHNvIG1hZGUgbWUgcmVhbGl6ZSB0aGF0IHdlIGhhdmUgYSB2ZXJ5IHNpbWlsYXIKICBidWcgaW4gdGhlIEZUUCBjb25uZWN0aW9uIHJlLXVzZSBjb2RlLiBXZSBtdXN0IHN0b3JlIGEgc2VwYXJhdGUgdXNlciBhbmQKICBwYXNzd29yZCBmaWVsZCBmb3IgZWFjaCBjb25uZWN0aW9uIHdlIGtlZXAgKGF0IGxlYXN0IGZvciBGVFAgYW5kIEhUVFArTlRMTQogIGNvbm5lY3Rpb25zLCBzbyBJIG1hZGUgdXMgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHkpLgoKLSBTaW5jZSBOVExNIGF1dGhlbnRpY2F0ZXMgY29ubmVjdGlvbnMgaW5zdGVhZCBvZiBzaW5nbGUgcmVxdWVzdHMsIEkgaGFkIHRvCiAgcmUtYXJyYW5nZSBob3cgd2Ugc3RvcmUgdGhlIE5UTE0gZGF0YSBhbmQgSSBoYWQgdG8gaW1wcm92ZSB0aGUgdGVzdCBzdWl0ZSB0bwogIGZpbmFsbHkgd29yayBwcm9wZXJseSB3aXRoIHBlcnNpc3RlbmN5IHRvIG1ha2UgdGhlIE5UTE0gdGVzdHMgcnVuIGZpbmUKICBhZ2Fpbi4gVGhpcyBhbHNvIGZvcmNlZCBtZSB0byBoYXZlIHRvIHVwZGF0ZSBsb3RzIG9mIEhUVFAgdGVzdCBjYXNlcy4KCkRhbmllbCAoMTYgSnVseSkKLSBDcmlzIEJhaWxpZmYncyBidWcgcmVwb3J0IDc2ODI3NSBwb2ludGVkIG91dCB0aGF0IHVzaW5nIEJhc2ljIGF1dGggd2l0aAogIHdyb25nIHVzZXIrcGFzc3dvcmQgY2F1c2VkIGFuIGVuZGxlc3MgbG9vcC4gRml4ZWQgbm93LiBIZSBhbHNvIGZvdW5kIG91dCB0aGF0CiAgd2UgZGlkbid0IHByb3Blcmx5IGF1dGhlbnRpY2F0ZSBjb25uZWN0aW9ucyB3aXRoIE5UTE0uIEZpeGVkIHRvby4KCi0gRGFuIFdpbnNoaXAgcHJvdmlkZWQgZml4ZXMgZm9yIHRoZSBOVExNIGNvZGUuCgpEYW5pZWwgKDUgSnVseSkKLSBEb3VnIEthdWZtYW4gcHJvdmlkZWQgYWRkaXRpb25hbCBmaXhlcyBmb3IgdGhlIERPUyBwb3J0LgoKRGFuaWVsICg0IEp1bHkpCi0gUmljayBSaWNoYXJkc29uIHBvaW50ZWQgb3V0IHRoYXQgdXNpbmcgc2V0dmJ1ZigpIHRvIGFjaGlldmUgbm9uLWJ1ZmZlcmluZwogIG9uIG91dHB1dCBpcyBuby1nb29kIGZvciBTQ08gWGVuaXggYW5kIG90aGVyIHVuaXhlcy4gV2Ugc3dpdGNoZWQgb3ZlciB0bwogIHVzaW5nIHBsYWluIGZmbHVzaCgpIGluc3RlYWQuCgotIERhbiBHcmF5c29uIHBvaW50ZWQgb3V0IHRoYXQgd2Ugc2V0IHRoZSBDVVJMX0NBX0JVTkRMRSB2YXJpYWJsZSB3cm9uZ2x5IGluCiAgdGhlIGNvbmZpZ3VyZSBzY3JpcHQsIGFuZCBJIGhhZCB0byBjaGFuZ2Ugc29tZSBidWlsZCBzdHVmZiB0byBtYWtlIHRoZSBuZXcKICB3YXkgd29yay4KCi0gUGV0ZXIgU3lsdmVzdGVyJ3MgcGF0Y2ggd2FzIGFwcGxpZWQgdGhhdCBpbnRyb2R1Y2VzIHRoZSBmb2xsb3dpbmc6CgogICBDVVJMT1BUX1NTTF9DVFhfRlVOQ1RJT04gdG8gc2V0IGEgY2FsbGJhY2sgdGhhdCBnZXRzIGNhbGxlZCB3aXRoIHRoZQogICBPcGVuU1NMJ3Mgc3NsX2N0eCBwb2ludGVyIHBhc3NlZCBpbiBhbmQgYWxsb3cgYSBjYWxsYmFjayB0byBhY3Qgb24gaXQuIElmCiAgIGFueXRoaW5nIGJ1dCBDVVJMRV9PSyBpcyByZXR1cm5lZCwgdGhhdCB3aWxsIGFsc28gYmUgcmV0dXJuZWQgYnkgbGliY3VybAogICBhbGwgdGhlIHdheSBiYWNrLiBJZiB0aGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIENVUkxPUFRfVVJMLCBsaWJjdXJsIHdpbGwKICAgZGV0ZWN0IHRoaXMgYW5kIGluc3RlYWQgZ28gdXNlIHRoZSBuZXcgVVJMLgoKICAgQ1VSTE9QVF9TU0xfQ1RYX0RBVEEgaXMgYSBwb2ludGVyIHlvdSBzZXQgdG8gZ2V0IHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgc2V0CiAgIHdpdGggQ1VSTE9QVF9TU0xfQ1RYX0ZVTkNUSU9OLgoKRGFuaWVsICgxIEp1bHkpCi0gRGF2aWQgQnlyb24gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGFsbG93cyBhIGNsaWVudCB0byBxdWl0IHRoZSB0ZXN0IHN1aXRlJ3MKICBIVFRQIHNlcnZlci4KCi0gR2lzbGUgVmFuZW0gZm91bmQgYW5kIHBhdGNoZWQgYSBsaWIgaGFuZGxlIGxlYWsgaW4gdGhlIGxkYXAgY29kZS4KCkRhbmllbCAoMjUgSnVuZSkKLSBNb3JlIE5UTE0taW1wcm92ZW1lbnRzLiBMZXNzIGNvZGUuIFNtYWxsZXIgcGFja2V0cyBiYWNrIGFuZCBmb3J0aC4KCkRhbmllbCAoMjMgSnVuZSkKLSBFcmljIEdsYXNzIHByb3ZpZGVkIHVzIHdpdGggYSBiZXR0ZXIgZG9jIG9uIE5UTE0gZGV0YWlscywgYW5kIEkgYWRkZWQgbW9yZQogIGNvbW1lbnRzIGFuZCBjbGFyaWZpZWQgdGhlIGN1cnJlbnQgY29kZSBtb3JlLiBVc2luZyB0aGUgbmV3IGtub3dsZWRnZSwgd2UKICBzaG91bGQgYmUgYWJsZSB0byBtYWtlIHRoZSBOVExNIHN0dWZmIHdvcmsgZXZlbiBiZXR0ZXIuCiAgRXJpYydzIG9yaWdpbmFsIFVSTDogaHR0cDovL2RhdmVucG9ydC5zb3VyY2Vmb3JnZS5uZXQvbnRsbS5odG1sCiAgVmVyc2lvbiBzdG9yZWQgYW5kIHByb3ZpZGVkIGF0IGN1cmwgc2l0ZTogaHR0cDovL2N1cmwuaGF4eC5zZS9yZmMvbnRsbS5odG1sCgotIEZpeGVkIHRoZSBtaW5vciBjb21waWxlIHByb2JsZW1zIHByZTMgaGFkIGlmIGJ1aWx0IHdpdGhvdXQgR1NTQVBJIGFuZC9vcgogIFNTTC4KClZlcnNpb24gNy4xMC42LXByZTMgKDE5IEp1bmUgMjAwMykKCkRhbmllbCAoMTkgSnVuZSkKLSBNYWRlIGN1cmwgdXNlIGN1cmxfZnJlZSgpIG9uIG1lbW9yeSByZXR1cm5lZCBieSBjdXJsX2dldGVudigpLCBhcyB0aGlzCiAgc2hvdWxkIHRoZW9yZXRpY2x5IG1ha2UgaXQgcG9zc2libHkgdG8gYnVpbGQgYW5kIHJ1biBjdXJsIGFuZCBsaWJjdXJsIHdpdGgKICBkaWZmZXJlbnQgbWVtb3J5IGFsbG9jYXRpb24gc2NoZW1lcyB3aXRoIG5vIHByb2JsZW1zLgoKRGFuaWVsICgxOCBKdW5lKQotIEltcHJvdmVkIHRoZSBta2hlbHAucGwgYSBiaXQgZnVydGhlciB0byBtYWtlIGEgbmljZXIgaHVnZWhlbHAgdGV4dCBhbmQgdG8KICBpbmNsdWRlIGEgYmV0dGVyIGNvbW1lbnQgaW4gdGhlIHRvcCBmb3IgdGhlIGd6aXAgY29tcHJlc3NlZCB2ZXJzaW9uLgoKRGFuaWVsICgxNyBKdW5lKQotIENVUkxPUFRfSFRUUEFVVEggaXMgbm93IGEgYml0bWFzaywgaW4gd2hpY2ggeW91IHNldCB3aGljaCBhdXRoZW50aWNhdGlvbgogIHR5cGUocykgeW91IHdhbnQgdG8gdXNlLiBJZiBtb3JlIHRoYW4gb25lIGlzIHNldCwgbGliY3VybCB3aWxsIHVzZSBvbmUgb2YKICB0aGUgc2VsZWN0ZWQgb25lIGFuZCB0aGUgb25lIGl0IGNvbnNpZGVycyBpcyBtb3JlIHNlY3VyZS4gVGVzdCBjYXNlIDY3IGFuZAogIDY4IChmb3IgTlRMTSkgd2VyZSBmaXhlZCBhbmQgd2UndmUgcmVkdWNlZCBhIHJvdW5kLXRyaXAgZm9yIHNwZWNpZmljIC0tbnRsbQogIGZldGNoZXMsIGFuZCB0ZXN0IGNhc2UgNjkgYW5kIDcwIHdlcmUgYWRkZWQgZm9yIHRlc3RpbmcgYXV0aGVudGljYXRpb24KICAicGlja2luZyIuIC0tYW55YXV0aCBpcyB0aGUgbmV3IGNvbW1hbmQgbGluZSB0b29sIG9wdGlvbiwgYW5kIEkgYWxzbyBhZGRlZAogIC0tYmFzaWMgZm9yIGNvbXBsZXRlbmVzcyAodGhhdCdzIHRoZSBkZWZhdWx0IHR5cGUpLgoKLSBGaXhlZCB0aGUgcnVudGVzdHMucGwgc2NyaXB0IHRvIHVzZSB0aGUgaW5mbyBwcm92aWRlZCBieSB0aGUgbmV3IGN1cmwgLVYKICBvdXRwdXQuCgotIC0tZW5hYmxlLWRlYnVnIG5vdyBzZXRzIHRoZSBDVVJMREVCVUcgZGVmaW5lIGluc3RlYWQgb2YgTUFMTE9DREVCVUcsIGFzIGl0CiAgaXMgbWVhbnQgdG8gYmUgYSBnZW5lcmljIGRlYnVnIGNvbmRpdGlvbmFsLgoKLSBjdXJsX3ZlcnNpb25faW5mbygpIGNhbiBub3cgcmV0dXJuIENVUkxfVkVSU0lPTl9ERUJVRyBhcyBhIGZlYXR1cmUgYml0LCB0bwogIGluZGljYXRlIHRoYXQgdGhlIGxpYnJhcnkgd2FzIGJ1aWx0IHdpdGggQ1VSTERFQlVHIHNldC4KCi0gUmFscGggTWl0Y2hlbGwgZm91bmQgb3V0IHRoYXQgc29tZSB3ZWIgYXBwbGljYXRpb25zIHZlcnkgYmFkbHkgdXNlcyB3aGl0ZQogIHNwYWNlcyBpbiBMb2NhdGlvbjogcmVkaXJlY3RzLCBhbmQgYXBwYXJlbnRseSBJRSBpcyBhIGJyb3dzZXIgKHRoZSBvbmx5CiAgb25lPykgdGhhdCBzdXBwb3J0cyB0aGlzIGFib21pbmF0aW9uLiBCYXNlZCBvbiBSYWxwaCdzIHBhdGNoLCBJIGFkZGVkIGNvZGUKICB0aGF0IG5vdyBhdHRlbXB0cyB0byByZXBsYWNlIHdoaXRlIHNwYWNlcyB3aXRoIHRoZSBwcm9wZXIgIiUyMCIgb3IgIisiLgogIFRlc3QgY2FzZSA0MCBhbmQgNDIgd2VyZSBhZGRlZCB0byB2ZXJpZnkgbXkgY2hhbmdlcy4KCi0gY3VybCAtViBub3cgYWxzbyBvdXRwdXRzIGEgbGlzdCBvZiBmZWF0dXJlcyB0aGUgYXZhaWxhYmxlIGxpYnJhcnkgb2ZmZXJzIChpZgogIGFueSkuCgotIFRoZSBjdXJsX3ZlcnNpb24oKSBzdHJpbmcgbm93IGluY2x1ZGVzICJHU1MiIGlmIGxpYmN1cmwgaXMgYnVpbHQgd2l0aCBHU1NBUEkKICBzdXBwb3J0LgoKLSBEYXZpZCBPcnJlbGwgcmVwb3J0ZWQgdGhhdCBsaWJjdXJsIHN0aWxsIGNyYXNoZWQgd2hlbiBzZW5kaW5nIEhVR0UgcmVxdWVzdHMKICBvdmVyIEhUVFBTLi4uIEkgZml4ZWQuCgpWZXJzaW9uIDcuMTAuNi1wcmUyICgxNiBKdW5lIDIwMDMpCgpEYW5pZWwgKDE2IEp1bmUpCi0gY3VybF92ZXJzaW9uX2luZm8oKSBub3cgcmV0dXJucyBiaXRtYXNrZWQgaW5mb3JtYXRpb24gd2VhdGhlciBOVExNIGFuZAogIEdTU05FR09USUFURSBhcmUgc3VwcG9ydGVkLCBzaW5jZSBpdCBpcyBkb29tZWQgdG8gdmFyeSBvbiBkaWZmZXJlbnQKICBpbnN0YWxsYXRpb25zLgoKLSBJIHJlbWFkZSB0aGUgSFRUUCBEaWdlc3QgY29kZSB0byB1c2UgdGhlIE1ENS1jb2RlIHByb3ZpZGVkIGJ5IE9wZW5TU0wgaWYKICB0aGF0IGlzIHByZXNlbnQsIGFuZCBvbmx5IHVzZSBvdXIgb3duIE1ENS1jb2RlIGlmIGl0IGlzbid0LgogIApEYW5pZWwgKDEzIEp1bmUpCi0gTW9yZSBOVExNIGhlbHAsIGZpeGVzIGFuZCBwYXRjaGVzIGZyb20gQ3JpcyBCYWlsaWZmLgoKLSBNYXJ0eSBLdWhydCBicm91Z2h0IGluY2x1ZGUgZml4ZXMgZm9yIG1ha2luZyBWTVMgYnVpbGRzIHdhcm5pbmctZnJlZS4KCkRhbmllbCAoMTIgSnVuZSkKLSBOVExNIGF1dGhlbnRpY2F0aW9uIHdvcmtzIHNvbWV3aGF0IGFnYWluc3QgdGhlIHRlc3Qgc2VydmVycyBwcm92aWRlZCBieQogIE1hdGhpYXMgQXhlbHNzb24gYW5kIENyaXMgQmFpbGlmZi4gVXNlIGJ5IHNldHRpbmcgQ1VSTE9QVF9IVFRQQVVUSCB0bwogIENVUkxBVVRIX05UTE0gdG8gbGliY3VybCwgb3IgLS1udGxtIGZvciB0aGUgY3VybCB0b29sLiBUZXN0IGNhc2UgNjcgYW5kIDY4CiAgd2VyZSBhZGRlZCBmb3IgdGhpcy4gTlRMTS1zdXBwb3J0IHJlcXVpcmVzIE9wZW5TU0wuCgotIERhbiBGYW5kcmljaCBwcm92aWRlZCBhIHBhdGNoLCB0aGF0IGdyYW50ZWQgdGhhdCBnemlwIGFuZCBsaWJ6IGFyZSBhdmFpbGFibGUKICBhdCBidWlsZC10aW1lLCBjb21wcmVzc2VzIHRoZSBodWdlaGVscCB0ZXh0IGluIHRoZSBjdXJsIGNvbW1hbmQgbGluZSBhbmQKICB1bmNvbXByZXNzZXMgaXQgYXQgcmVxdWVzdC4gU2F2ZXMgc29tZSB+NjBLIGluIHRoZSBmaW5hbCBvdXRwdXQgZXhlY3V0YWJsZS4KCkRhbmllbCAoMTEgSnVuZSkKLSBMb25nIGRheSBvZiBmaWdodGluZyB0aGUgTlRMTSBkZW1vbnMuCgpEYW5pZWwgKDEwIEp1bmUpCi0gTW9kaWZpZWQgaG93IHRvIHNldCBhdXRoIHR5cGUgdG8gbGliY3VybC4gTm93IHVzZSBDVVJMT1BUX0hUVFBBVVRIIGluc3RlYWQsCiAgYW5kIHBpY2sgbWV0aG9kLiBTdXBwb3J0ZWQgb25lcyBjdXJyZW50bHkgYXJlOgogIENVUkxBVVRIX0JBU0lDICAgICAtIGRlZmF1bHQgc2VsZWN0aW9uCiAgQ1VSTEFVVEhfRElHRVNUICAgIC0gZm9ybWVybHkgQ1VSTE9QVF9IVFRQRElHRVNUCiAgQ1VSTEFVVEhfR1NTTkVHT1RJQVRFCgotIERhbmllbCBLb3VyaWwgYWRkZWQgSFRUUCBHU1MtTmVnb3RpYXRlIGF1dGhlbnRpY2F0aW9uIHN1cHBvcnQsIGFzIGRlZmluZWQgaW4KICB0aGUgSUVURiBkcmFmdCBkcmFmdC1icmV6YWstc3BuZWdvLWh0dHAtMDQudHh0LiBJbiB1c2UgYWxyZWFkeSBieSB2YXJpb3VzCiAgTWljcm9zb2Z0IHdlYiBhcHBsaWNhdGlvbnMuIC0tbmVnb3RpYXRlIGlzIHRoZSBuZXcgZmFtaWx5IG1lbWJlci4gVG8gdGFrZQogIGFkdmFudGFnZSBvZiB0aGlzLCB5b3UgbmVlZCBvbmUgb2YgdGhlc2UgcGFja2FnZXM6CgogIG8gSGVpbWRhbCBLZXJiZXJvczUgICAgICAgICAgICAgICBodHRwOi8vd3d3LnBkYy5rdGguc2UvaGVpbWRhbC9oZWltZGFsLmh0bWwKICBvIEdTU0FQSSBmcm9tIEdsb2J1cyAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3Lmdsb2J1cy5vcmcvCiAgbyBHU1NBUEkgbGlicmFyaWVzIGZyb20gTUlUIEtlcmJlcm9zNSAgaHR0cDovL3dlYi5taXQuZWR1L2tlcmJlcm9zL3d3dy8KCi0gQSBtaXNzaW5nIGVuZGluZyBicmFja2V0ICgnXScpIHdoaWxlIGRvaW5nIFVSTCBnbG9iYmluZyBjb3VsZCBsZWFkIHRvIGEKICBzZWdmYXVsdC4gV2hpbGUgZml4aW5nIHRoaXMsIEkgYWxzbyBpbnRyb2R1Y2VkIGJldHRlciBlcnJvciByZXBvcnRpbmcgaW4gdGhlCiAgZ2xvYmJpbmcgY29kZS4gKEFsbCB0aGlzIGlzIGFwcGxpY2F0aW9uIGNvZGUgb3V0c2lkZSBsaWJjdXJsLikKCkRhbmllbCAoNiBKdW5lKQotIERhdmlkIE9ycmVsbCBmb3VuZCBvdXQgdGhhdCBzZW5kaW5nIGEgaHVnZSBHRVQgcmVxdWVzdCBvdmVyIEhUVFBTIGNvdWxkCiAgbWFrZSBsaWJjdXJsIGZhaWwgYW5kIHJldHVybiBhbiBlcnJvciBjb2RlLgoKRGFuaWVsICgyIEp1bmUpCi0gUmljaGFyZCBCcmFtYW50ZSBmb3VuZCBvdXQgdGhhdCAiQ29udGVudC1MZW5ndGg6IDAiIHdhcyBub3QgcHJvcGVybHkgdXNlZCBieQogIGxpYmN1cmwgaWYgdGhlIHJlc3BvbnNlLWhlYWRlcnMgaW5kaWNhdGVkIHRoYXQgdGhlIGNvbm5lY3Rpb24gd291bGQgYmUKICBjbG9zZWQuCgotIERhdmlkIEJ5cm9uJ3MgcGF0Y2ggd2FzIGFwcGxpZWQsIHRoYXQgbWFrZXMgdGhlIC0tcHJvZ3Jlc3MtYmFyIHRha2UgdGhlCiAgbG9jYWwgc2l6ZSBpbnRvIGFjY291bnQgd2hlbiBkb2luZyByZXN1bWVkIGRvd25sb2Fkcy4KCi0gRmVlZGJhY2sgZnJvbSBTZXJnZSBTZW1hc2hrbyBtYWRlIG1lIGNoYW5nZSB0aGUgZXJyb3IgbWVzc2FnZSByZXR1cm5lZCB3aGVuCiAgQ1VSTEVfSFRUUF9SRVRVUk5FRF9FUlJPUiBpcyByZXR1cm5lZC4KCi0gQW5vbnltb3VzIGluIGJ1ZyByZXBvcnQgIzc0NTEyMiBwb2ludGVkIG91dCB0aGF0IHdlIHNob3VsZCByZWFsbHkgYmUgdXNpbmcKICBTU0xfQ1RYX3NldF9vcHRpb25zKC4uLiBTU0xfT1BfQUxMKSB0byB3b3JrIGFyb3VuZCBmbGF3cyBpbiBleGlzdGluZyBTU0wKICBpbXBsZW1lbnRhdGlvbnMuCgpEYW5pZWwgKDI3IE1heSkKLSBBbmRyZWFzIExleSBhbmQgUmljaCBHcmF5IGhlbHBlZCBtZSBwb2ludCBvdXQgdGhhdCBubyB2ZXJzaW9uIG9mIEhQLVVYIGhhcwogIHRoZSBzeXMvc2VsZWN0LmggaGVhZGVyIGZpbGUgc28gaW5jbHVkaW5nIGl0IHVuY29uZGl0aW9uYWxseSBpbiBjdXJsL211bHRpLmgKICBpcyBub3QgYSBnb29kIHRoaW5nLiBOb3cgd2UgY2hlY2sgZm9yIEhQVVggYW5kIGF2b2lkIHVzaW5nIHRoYXQgaGVhZGVyIG9uCiAgc3VjaCBzeXN0ZW1zLgoKLSBSdWR5IEtvZW50byBleHBlcmllbmNlZCBwcm9ibGVtcyB3aXRoIGN1cmwncyByZWNlbnQgaGFiaXQgb2YgUE9TVGluZyBkYXRhIGluCiAgdHdvIHNlcGFyYXRlIHNlbmQoKSBjYWxscywgZmlyc3QgdGhlIGhlYWRlcnMgYW5kIHRoZW4gdGhlIGRhdGEuIEkndmUgbm93CiAgbWFkZSBhIGZpeCB0aGF0IGZvciBzdGF0aWMgYW5kIGtub3duIGNvbnRlbnQgdGhhdCBpcyBsZXNzIHRoYW4gMTAwSyBpbiBzaXplLAogIGV2ZXJ5dGhpbmcgaXMgbm93IHNlbnQgaW4gb25lIHNpbmdsZSBzeXN0ZW0gY2FsbCBhZ2Fpbi4gVGhpcyBpcyBhbHNvIGJldHRlcgogIGZvciBuZXR3b3JrIHBlcmZvcm1hbmNlIHJlYXNvbnMuCgotIEkgbW9kaWZpZWQgdGhlIG1haW4gbWFrZWZpbGUgdG8gbm90IGJ1aWxkIHRoZSB0ZXN0IHN1aXRlIGFuZCBhIGZldyBvdGhlcgogIHVubmVjZXNzYXJ5IHRoaW5ncyBieSBkZWZhdWx0LiBOb3csIHRoZSB0ZXN0IHN1aXRlIGlzIGJ1aWx0IHdoZW4gJ21ha2UgdGVzdCcKICBpcyBydW4uICBUaGlzIHJlZHVjZXMgYnVpbGQgdGltZSBmb3IgdGhvc2Ugd2hvIGRvbid0IGNhcmUgZm9yIHRoZSB0ZXN0CiAgc3VpdGUsIGFuZCBpdCBhbHNvIHJlZHVjZXMgY29uZnVzaW9uIGZvciBwZW9wbGUgdXNpbmcgcGxhdGZvcm1zIHdoZXJlIHRoZQogIHRlc3Qgc3VpdGUgYnVpbGQgZmFpbHMhCgpEYW5pZWwgKDI2IE1heSkKLSBDaHJpcyBMZXdpcyBwb2ludGVkIG91dCBhIGZsYXcgaW4gdGhlICNpZmRlZnMgaW4gY3VybC9tdWx0aS5oIGZvciBXaW5kb3dzLAogIHdoaWNoIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEppcyBKb3kgZm91bmQgYW5vdGhlciBmbGF3IGluIHRoZSBTT0NLNSBjb2RlLCBhcyBsaWJjdXJsIHRyZWF0ZWQgdGhlIHNvY2tzNQogIHByb3h5IGEgbGl0dGxlIHRvbyBtdWNoIGxpa2UgYXMgaWYgaXQgd2FzIGEgaHR0cCBwcm94eS4KCkRhbmllbCAoMjMgTWF5KQotIFJpY2FyZG8gQ2FkaW1lIGZvdW5kIGEgc29ja2V0IGxlYWsgd2hlbiBsaXN0aW5nIGRpcmVjdG9yaWVzIHdpdGhvdXQKICBjb250ZW50cy4gVGVzdCBjYXNlcyAxNDQgYW5kIDE0NSB3ZXJlIGFkZGVkIHRvIHZlcmlmeSB0aGUgZml4LgoKLSBSdWR5IEtvZW50byBmb3VuZCB5ZXQgYW5vdGhlciBwcm9ibGVtIHdoZW4gYSBIVFRQIHNlcnZlciByZXR1cm5zIG9ubHkgYQogIHNpbmdsZS1saW5lIG9mIGNvbnRlbnRzIHdpdGhvdXQgYW55IGhlYWRlcnMgYXQgYWxsLiBsaWJjdXJsIHRoZW4gZmFpbGVkIHRvCiAgY291bnQgdGhlIGRhdGEsIHRodXMgcmV0dXJuaW5nIGVycm9yIDUyICJubyBjb250ZW50cyIuIFRlc3QgY2FzZSA2NiB3YXMKICBhZGRlZCB0byB2ZXJpZnkgdGhhdCB3ZSBub3cgZG8gcmlnaHQuCgpWZXJzaW9uIDcuMTAuNi1wcmUxICgyMyBNYXkgMjAwMykKCkRhbmllbCAoMjMgTWF5KQotIEppcyBpbiBidWcgcmVwb3J0ICM3NDE4NDEsIGZpeGVkIGEgYnVnIGluIHRoZSBTT0NLUzUgcHJveHktdXNpbmcgY29kZS4KCkRhbmllbCAoMjIgTWF5KQotIERhdmlkIFJlbWFobCBzZXQgdXAgYSB0ZXN0LXNlcnZlciBmb3IgbWUgcHJvdmlkaW5nIERpZ2VzdCBhdXRoZW50aWNhdGlvbiwKICBhbmQgSSB3cm90ZSB0aGUgZmlyc3Qgd29ya2luZyBjb2RlIHRoYXQgc3VwcG9ydCBpdC4gVGhlIHRlc3Qgc3VpdGUgd2FzCiAgbW9kaWZpZWQgc2xpZ2h0bHkgYXMgd2VsbCB0byB3b3JrIGJldHRlciBmb3IgaXQgYW5kIC0tZGlnZXN0IHdhcyBhZGRlZCB0bwogIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9ucyAoYW5kIENVUkxPUFRfSFRUUERJR0VTVCB0byB0aGUgbGlicmFyeSkuLi4gIFJGQzI2MTcKICBoYXMgYWxsIHRoZSBnb3J5IGRldGFpbHMuCgpEYW5pZWwgKDIxIE1heSkKLSBEYXZpZCBCYWxhemljIHBvaW50ZWQgb3V0IHRoYXQgY3VybF91bmVzY2FwZSgpIGRpZG4ndCBjaGVjayB0aGF0ICUtY29kZXMKICB3ZXJlIGNvcnJlY3RseSBmb2xsb3dlZCBieSB0d28gaGV4YWRlY2ltYWwgZGlnaXRzIHdoZW4gaXQgdW5lc2NhcGUgc3RyaW5ncy4KICBOb3csIHdlIGRvIHRoZSBjaGVjayBhbmQgb25seSAlWFggY29kZXMgYXJlIHVuZXNjYXBlZCBpZiB0aGUgWCBsZXR0ZXJzIGFyZQogIGhleGFkZWNpbWFscy4KCi0gR2lzbGUgVmFuZW0gbWFkZSBjdXJsIGJ1aWxkIHdpdGggZGpncHAgb24gRE9TLgoKLSBHaXNsZSBWYW5lbSBpbXByb3ZlZCB0aGUgbWtoZWxwLnBsIHNjcmlwdCB0byBtYWtlIGEgbmljZXIgbWFudWFsIHRoYXQgaXMKICBzaG93biB3aXRoIGN1cmwgLU0uCgpEYW5pZWwgKDIwIE1heSkKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBhIGZpeCB0aGF0IG1ha2VzIGxpYmN1cmwgbW9yZSBjb25zZXJ2YXRpdmUsIG5vdAogIGV4cGVjdGluZyBoX2FsaWFzZXMgb2YgdGhlIGhvc3RlbnQgc3RydWN0IHRvIGFsd2F5cyBiZSBub24tTlVMTC4KCkRhbmllbCAoMTkgTWF5KQotIEFzIHJlcXVlc3RlZCBieSBNYXJ0aW4gTWljaGxtYXlyIGluIERlYmlhbiBidWcgcmVwb3J0ICMxOTM2MzAsIGxpYmN1cmwgbm93CiAgc3VwcG9ydHMgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBpbiB0aGUgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGVzLiBBZGRlZAogIHRlc3QgY2FzZSA2MyB0byB2ZXJpZnkgdGhpcy4KClZlcnNpb24gNy4xMC41ICgxOSBNYXkgMjAwMykKCkRhbmllbCAoMTUgTWF5KQotIENoYW5nZWQgdGhlIG9yZGVyIGZvciB0aGUgaW5fYWRkcl90IHRlc3RpbmcsIGFzICd1bnNpZ25lZCBsb25nJyBzZWVtcyB0byBiZQogIGEgdmVyeSBjb21tb24gdHlwZSBpbmV0X2FkZHIoKSByZXR1cm5zLgoKRGFuaWVsICgxNCBNYXkpCi0gR2VvcmdlIENvbW5pbm9zIHByb3ZpZGVkIGEgZml4IHRoYXQgY2FsbHMgdGhlIHByb2dyZXNzIG1ldGVyIHdoZW4gd2FpdGluZwogIGZvciBGVFAgY29tbWFuZCByZXNwb25zZXMgdGFrZSA+MSBzZWNvbmQuIEl0J2xsIG1ha2UgYXBwbGljYXRpb25zIG1vcmUKICAicmVzcG9uc2l2ZSIgZXZlbiB3aGVuIGRlYWxpbmcgd2l0aCB2ZXJ5IHNsb3cgZnRwIHNlcnZlcnMuCgpEYW5pZWwgKDEyIE1heSkKLSBHZW9yZ2UgQ29tbmlub3MgcG9pbnRlZCBvdXQgdGhhdCBsaWJjdXJsIHVwbG9hZHMgaGFkIHR3byBxdWlya3M6CiAgIG8gd2hlbiB1c2luZyBGVFAgUE9SVCBjb21tYW5kLCBpdCB1c2VkIGJsb2NraW5nIHNvY2tldHMhCiAgIG8gaXQgY291bGQgbG9vcCBhIGxvbmcgdGltZSB3aXRob3V0IGRvaW5nIHByb2dyZXNzIG1ldGVyIHVwZGF0ZXMKICBCb3RoIGl0ZW1zIGFyZSBmaXhlZCBub3cuCgpEYW5pZWwgKDkgTWF5KQotIERhbiBGYW5kcmljaCBjaGFuZ2VkIENVUkxPUFRfRU5DT0RJTkcgdG8gc2VsZWN0IGFsbCBzdXBwb3J0ZWQgZW5jb2RpbmdzIGlmCiAgc2V0IHRvICIiLiAgVGhpcyBmcmVlcyB0aGUgYXBwbGljYXRpb24gZnJvbSBoYXZpbmcgdG8ga25vdyB3aGljaCBlbmNvZGluZ3MKICB0aGUgbGlicmFyeSBzdXBwb3J0cy4KCi0gRGFuIEZhbmRyaWNoIHBvaW50ZWQgb3V0IHdlIGhhZCB0aHJlZSB1bm5lY2Vzc2FyeSBmaWxlcyBpbiBDVlMgdGhhdCBpcwogIGdlbmVyYXRlZCB3aXRoIGxpYnRvb2xpemUsIHNvIHRoZXkncmUgbm93IHJlbW92ZWQgYW5kIGxpYnRvb2xpemUgaXMgaW52b2tlZAogIGFjY29yZGluZ2x5IGluIHRoZSBidWlsZGNvbmYgc2NyaXB0LgoKLSBBdmVyeSBGYXkgZm91bmQgb3V0IHRoYXQgdGhlIENVUkxPUFRfSU5URVJGQUNFIHdheSBvZiBmaXJzdCBjaGVja2luZyBpZiB0aGUKICBnaXZlbiBuYW1lIGlzIGEgbmV0d29yayBpbnRlcmZhY2UgZ2F2ZSBhIHJlYWwgcGVyZm9ybWFuY2UgcGVuYWx0eSBvbiBMaW51eCwKICBzbyBub3cgd2UgbW9yZSBhcHByb3ByaWF0ZWx5IGZpcnN0IGNoZWNrIGlmIGl0IGlzIGFuIElQIG51bWJlciBhbmQgaWYgc28KICB3ZSBkb24ndCBjaGVjayBmb3IgYSBuZXR3b3JrIGludGVyZmFjZSB3aXRoIHRoYXQgbmFtZS4KCi0gQ1VSTE9QVF9GVFBfVVNFX0VQUlQgYWRkZWQuIFNldCB0aGlzIHRvIEZBTFNFIHRvIGRpc2FibGUgbGliY3VybCdzIGF0dGVtcHRzCiAgdG8gdXNlIEVQUlQgYW5kIExQUlQgYmVmb3JlIHRoZSB0cmFkaXRpb25hbCBQT1JUIGNvbW1hbmQuIFRoZSBjb21tYW5kIGxpbmUKICB0b29sIHNldHMgdGhpcyBvcHRpb24gd2l0aCAnLS1kaXNhYmxlLWVwcnQnLgoKVmVyc2lvbiA3LjEwLjUtcHJlMiAoNiBNYXkgMjAwMykKCkRhbmllbCAoNiBNYXkpCi0gS2V2aW4gRGVsYWZpZWxkIHJlcG9ydGVkIGFub3RoZXIgY2FzZSB3aGVyZSB3ZSBkaWRuJ3QgY29ycmVjdGx5IGNoZWNrIGZvcgogIEVBR0FJTiBidXQgb25seSBFV09VTERCTE9DSywgd2hpY2ggY2F1c2VkIGJhZG5lc3Mgb24gSFBVWC4KCkRhbmllbCAoNCBNYXkpCi0gQmVuIEdyZWVhciBub3RpY2VkIHRoYXQgdGhlIGNoZWNrIGZvciAnd3JpdGFibGUgYXJndicgZXhpdGVkIHRoZSBjb25maWd1cmUKICBzY3JpcHQgd2hlbiBydW4gZm9yIGNyb3NzLWNvbXBpbGluZywgd2hpY2ggd2Fzbid0IG5pY2UuIE5vdyBpdCdsbCBkZWZhdWx0IHRvCiAgbm8gYW5kIG91dHB1dCBhIHdhcm5pbmcgYWJvdXQgdGhlIGZhY3QgdGhhdCBpdCB3YXMgbm90IGNoZWNrZWQgZm9yLgoKRGFuaWVsICgyIE1heSkKLSBBZGRlZCB0ZXN0IGNhc2UgNjIgYW5kIGZpeGVkIHNvbWUgbW9yZSBvbiB0aGUgY29va2llIHNlbmRpbmcgd2l0aCBhIGN1c3RvbQogIEhvc3Q6IGhlYWRlciBzZXQuCgpEYW5pZWwgKDEgTWF5KQotIEFuZHkgQ2VkaWxuaWsgZml4ZWQgYSBmZXcgY29tcGlsZXIgd2FybmluZ3MuCgotIE1hZGUgdGhlICJTU0wgcmVhZCBlcnJvcjogNSIgZXJyb3IgbWVzc2FnZSBtb3JlIHZlcmJvc2UsIGJ5IGFkZGluZyBjb2RlIHRoYXQKICBxdWVyaWVzIHRoZSBPcGVuU1NMIGxpYnJhcnkgdG8gZmlsbCBpbiB0aGUgZXJyb3IgYnVmZmVyLgoKRGFuaWVsICgzMCBBcHIpCi0gQWRkZWQgc3lzL3NlbGVjdC5oIGluY2x1ZGUgaW4gdGhlIGN1cmwvbXVsdGkuaCBmaWxlLCBhZnRlciBoYXZpbmcgYmVlbgogIHJlbWluZGVkIGFib3V0IHRoaXMgYnkgUmljaCBHcmF5LgoKLSBJIG1hZGUgZWFjaCB0ZXN0IHNldCBpdHMgb3duIHNlcnZlciByZXF1aXJlbWVudHMsIHRodXMgYWJhbmRvbmluZyB0aGUKICBwcmV2aW91cyBzeXN0ZW0gd2hlcmUgdGhlIHRlc3QgbnVtYmVyIGltcGxpZWQgd2hhdCBzZXJ2ZXIocykgdG8gdXNlIGZvciBhCiAgc3BlY2lmaWMgdGVzdC4KCi0gRGF2aWQgQmFsYXppYyBtYWRlIGN1cmwgbW9yZSBSRkMxNzM4LWNvbXBsaWFudCBmb3IgRlRQIFVSTHMsIGJ5IGZpeGluZyBzbwogIHRoYXQgbGliY3VybCBub3cgdXNlcyBvbmUgQ1dEIGNvbW1hbmQgZm9yIGVhY2ggcGF0aCBwYXJ0LiBBIGJ1bmNoIG9mIHRlc3QKICBjYXNlcyB3ZXJlIGZpeGVkIHRvIHdvcmsgYWNjb3JkaW5nbHkuCgotIENvb2tpZSBmaXhlczoKCiAgQS4gU2F2ZSBkb21haW5zIGluIGphcnMgbGlrZSBNb3ppbGxhIGRvZXMuIEl0IG1lYW5zIGFsbCBkb21haW5zIHNldCBpbgogICAgIFNldC1Db29raWU6IGhlYWRlcnMgYXJlIGRvdC1wcmVmaXhlZC4KICBCLiBTYXZlIGFuZCB1c2UgdGhlICd0YWlsbWF0Y2gnIGZpZWxkIGluIHRoZSBNb3ppbGxhL05ldHNjYXBlIGNvb2tpZSBqYXJzCiAgICAgKHRoZSBzZWNvbmQgY29sdW1uKS4KICBDLiBSZWplY3QgY29va2llcyB1c2luZyBpbGxlZ2FsIGRvbWFpbnMgaW4gdGhlIFNldC1Db29raWU6IGxpbmUuIENvbmNlcm5zCiAgICAgYm90aCBkb21haW5zIHdpdGggdG9vIGZldyBkb3RzIG9yIGRvbWFpbnMgdGhhdCBhcmUgb3V0c2lkZSB0aGUgY3VycmVudGx5CiAgICAgb3BlcmF0aW5nIHNlcnZlciBob3N0J3MgZG9tYWluLgogIEQuIFNldCB0aGUgcGF0aCBwYXJ0IGJ5IGRlZmF1bHQgdG8gdGhlIG9uZSB1c2VkIGluIHRoZSByZXF1ZXN0LCBpZiBub25lIHdhcwogICAgIHNldCBpbiB0aGUgU2V0LUNvb2tpZSBsaW5lLgoKICBUbyBtYWtlIGl0ZW0gQyByZWFsbHkgZ29vZCwgSSBhbHNvIG1hZGUgbGliY3VybCBub3RpY2UgY3VzdG9tIEhvc3Q6IGhlYWRlcnMKICBhbmQgZXh0cmFjdCB0aGUgaG9zdCBuYW1lIHNldCBpbiB0aGVyZSBhbmQgdXNlIHRoYXQgYXMgdGhlIGhvc3QgbmFtZSBmb3IgdGhlCiAgc2l0ZSB3ZSdyZSBnZXR0aW5nIHRoZSBjb29raWVzIGZyb20uIFRoaXMgYWxsb3dzIHVzZXIgdG8gc3BlY2lmeSBhIHNpdGUncwogIElQLWFkZHJlc3MsIGJ1dCBzdGlsbCBiZSBhYmxlIHRvIHJlY2VpdmUgYW5kIHNlbmQgaXRzIGNvb2tpZXMgcHJvcGVybHkgaWYKICB5b3UgcHJvdmlkZSBhIHZhbGlkIEhvc3Q6IG5hbWUgZm9yIHRoZSBzaXRlLgoKRGFuaWVsICgyOSBBcHIpCi0gUGV0ZXIgS292YWNzIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyB0aGUgQ1VSTElORk9fQ09OTkVDVF9USU1FIHdvcmsgZmluZQogIHdoZW4gdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSAodG9vKS4KClZlcnNpb24gNy4xMC41LXByZTEgKDIzIEFwciAyMDAzKQoKRGFuaWVsICgyMyBBcHIpCi0gVXBncmFkZWQgdG8gbGlidG9vbCAxLjUuCgpEYW5pZWwgKDIyIEFwcikKLSBQZXRlciBTeWx2ZXN0ZXIgcG9pbnRlZCBvdXQgdGhhdCBjdXJsX2Vhc3lfc2V0b3B0KCkgd2lsbCBhbHdheXMgKHdyb25nbHkpCiAgcmV0dXJuIENVUkxFX09LIG5vIG1hdHRlciB3aGF0IGhhcHBlbnMuCgotIERhbiBGYW5kcmljaCBmaXhlZCBzb21lIGd6aXAgZGVjb21wcmVzc2lvbiBidWdzIGFuZCBmbGF3cy4KCkRhbmllbCAoMTYgQXByKQotIEZpeGVkIG1pbm9yIHR5cG8gaW4gbWFuIHBhZ2UsIHJlcG9ydGVkIGluIHRoZSBEZWJpYW4gYnVnIHRyYWNrZXIuCgpEYW5pZWwgKDE1IEFwcikKLSBGaXhlZCBzb21lIEZUUCB0ZXN0cyBpbiB0aGUgdGVzdCBzdWl0ZSB0aGF0IGZhaWxlZCBvbiBteSBTb2xhcmlzIGhvc3QsIGR1ZQogIHRvIHRoZSBjb25maWcuaCBub3QgYmVpbmcgaW5jbHVkZWQgYmVmb3JlIHRoZSBzeXN0ZW0gaGVhZGVycy4gV2hlbiBkb25lIHRoYXQKICB3YXksIGl0IGRpZCBnZXQgYSBtaXhlZCBzZW5zZSBvZiBpZiBiaWcgZmlsZXMgYXJlIHN1cHBvcnRlZCBvciBub3QgYW5kIHRoZW4KICBzdGF0KCkgYW5kIGZzdGF0KCkgKGFzIHVzZWQgaW4gdGVzdCBjYXNlIDUwNSkgZ290IGNvbmZ1c2VkIGFuZCBmYWlsZWQgdG8KICByZXR1cm4gYSBwcm9wZXIgZmlsZSBzaXplLgoKLSBGb3JtcG9zdGluZyBhIGZpbGUgdXNpbmcgYSAuaHRtbCBzdWZmaXggaXMgbm93IHByb3Blcmx5IHNldCB0byBDb250ZW50LVR5cGU6ICAgIHRleHQvaHRtbC4KCkRhbmllbCAoMTQgQXByKQotIEZpeGVkIHRoZSBTU0wgZXJyb3IgaGFuZGxpbmcgdG8gcmV0dXJuIHByb3BlciBTU0wgZXJyb3IgbWVzc2FnZXMgYWdhaW4sIHRoZXkKICBicm9rZSBpbiA3LjEwLjQuIEkgYWxzbyBhdHRlbXB0IHRvIHRyYWNrIGRvd24gQ0EgY2VydCBwcm9ibGVtcyBhbmQgdGhlbgogIHJldHVybiB0aGUgQ1VSTEVfU1NMX0NBQ0VSVCBlcnJvciBjb2RlLgoKLSBUaGUgY3VybCB0b29sIG5vdyBpbnRlcmNlcHRzIHRoZSBDVVJMRV9TU0xfQ0FDRVJUIGVycm9yIGNvZGUgYW5kIGRpc3BsYXlzCiAgYSBmYWlybHkgYmlnIGFuZCBleHBsYW5hdG9yeSBlcnJvciBtZXNzYWdlLiBLZXZpbiBSb3RoIGhlbHBlZCBtZSBvdXQgd2l0aAogIHRoZSB3b3JkaW5nLgoKRGFuaWVsICgxMSBBcHIpCi0gTmljIEhpbmVzIHByb3ZpZGVkIGEgc2Vjb25kIHBhdGNoIGZvciBnemlwIGRlY29tcHJlc3Npb24sIGFuZCBmaXhlZCBhIGJ1ZwogIHdoZW4gZGVmbGF0ZSBvciBnemlwIGNvbnRlbnRzIHdlcmUgZG93bmxvYWRlZCB1c2luZyBjaHVua2VkIGVuY29kaW5nLgoKLSBEYW4gRmFuZHJpY2ggbWFkZSBsaWJjdXJsIHN1cHBvcnQgYXV0b21hdGljIGRlY29tcHJlc3Npb24gb2YgZ3ppcCBjb250ZW50cwogIChhcyBhbiBhZGRpdGlvbiB0byB0aGUgcHJldmlvdXMgZGVmbGF0ZSBzdXBwb3J0KS4KCi0gSSBtYWRlIHRoZSBDV0QgY29tbWFuZCBkdXJpbmcgRlRQIHNlc3Npb24gY29uc2lkZXIgYWxsIDJ4eSBjb2RlcyB0byBiZSBPSwogIHJlc3BvbnNlcy4KCkRhbmllbCAoMTAgQXByKQotIFZsYWQgS3J1cGluIGZpeGVkIGEgVVJMIHBhcnNpbmcgaXNzdWUuIFVSTHMgdGhhdCB3ZXJlIG5vdCB1c2luZyBhIHNsYXNoCiAgYWZ0ZXIgdGhlIGhvc3QgbmFtZSwgYnV0IHN0aWxsIGhhZCAiPyIgYW5kIHBhcmFtZXRlcnMgYXBwZW5kZWQsIGFzIGluCiAgImh0dHA6Ly9ob3N0bmFtZS5jb20/Zm9vYmFyPW1vbyIsIHdlcmUgbm90IHByb3Blcmx5IHBhcnNlZCBieSBsaWJjdXJsLgoKRGFuaWVsICg5IEFwcikKLSBNYWRlIENVUkxPUFRfVElNRUNPTkRJVElPTiB3b3JrIGZvciBGVFAgdHJhbnNmZXJzLCB1c2luZyB0aGUgc2FtZSBzeW50YXggYXMKICBmb3IgSFRUUC4gVGhpcyB0aGVuIG1hZGUgLXogd29yayBmb3IgZnRwIHRyYW5zZmVycyB0b28uIEFkZGVkIHRlc3QgY2FzZSAxMzkKICBhbmQgMTQwIGZvciB2ZXJpZnlpbmcgdGhpcy4KCi0gR2V0dGluZyB0aGUgZmlsZSBkYXRlIG9mIGFuIGZ0cCBmaWxlIHVzZWQgdGhlIHdyb25nIHRpbWUgem9uZSB3aGVuCiAgZGlzcGxheWVkLiBJdCBpcyBzdXBwb3NlZGx5IGFsd2F5cyBHTVQuIEFkZGVkIHRlc3QgY2FzZSAxNDEgZm9yIHRoaXMuCgotIE1hZGUgdGhlIHRlc3Qgc3VpdGUncyBGVFAgc2VydmVyIHN1cHBvcnQgTURUTS4KCi0gVGhlIGRlZmF1bHQgREVCVUdGVU5DVElPTiwgYXMgZW5hYmxlZCB3aXRoIENVUkxPUFRfVkVSQk9TRSBub3cgb3V0cHV0cwogIENVUkxJTkZPX0hFQURFUl9JTiBkYXRhIGFzIHdlbGwuIFRoZSBtb3N0IG5vdGFibGUgZWZmZWN0IGZyb20gdGhpcyBpcyB0aGF0CiAgdXNpbmcgY3VybCAtdiwgeW91IGdldCB0byBzZWUgdGhlIGluY29taW5nICJoZWFkZXJzIiBhcyB3ZWxsLiBUaGlzIGlzCiAgcGVyaGFwcyBtb3N0IHVzZWZ1bCB3aGVuIGRvaW5nIGZ0cC4KCkRhbmllbCAoOCBBcHIpCi0gSmFtZXMgQnVyc2EgZml4ZWQgYSBmbGF3IGluIHRoZSBDb250ZW50LVR5cGUgZXh0cmFjdGlvbiBjb2RlLCB3aGljaCBtaXNzZWQKICB0aGUgZmlyc3QgbGV0dGVyIGlmIG5vIHNwYWNlIGZvbGxvd2VkIHRoZSBjb2xvbi4KCi0gTWFnbnVzIE5pbHNzb24gcG9pbnRlZCBvdXQgdGhhdCBzaGFyZS5jIHdhcyBtaXNzaW5nIGluIHRoZSBNU1ZDIHByb2plY3QKICBmaWxlLgoKRGFuaWVsICg2IEFwcikKLSBSeWFuIFdlYXZlciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFrZXMgdGhlIENBIGNlcnQgYnVuZGxlIG5vdCBnZXQgaW5zdGFsbGVkCiAgYW55bW9yZSB3aGVuICdjb25maWd1cmUgLS13aXRob3V0LXNzbCcgaGFzIGJlZW4gdXNlZC4KCkRhbmllbCAoNCBBcHIpCi0gTWFydGlqbiBCcm9lbmxhbmQgZm91bmQgYW5vdGhlciBjYXNlcyB3aGVyZSBhIHNlcnZlciBhcHBsaWNhdGlvbiBkaWRuJ3QKICBsaWtlIHRoZSBib3VuZGFyeSBzdHJpbmcgdXNlZCBieSBjdXJsIHdoZW4gZG9pbmcgYSBtdWx0aS1wYXJ0L2Zvcm1wb3N0LiBXZQogIG1vZGlmaWVkIHRoZSBib3VuZGFyeSBzdHJpbmcgdG8gbG9vayBsaWtlIHRoZSBvbmUgSUUgdXNlcywgYXMgdGhpcyBpcwogIHByb2JhYmx5IGdvbm5hIG1ha2UgY3VybCB3b3JrIHdpdGggbW9yZSBhcHBsaWNhdGlvbnMuCgpEYW5pZWwgKDMgQXByKQotIEtldmluIFJvdGggcmVwb3J0ZWQgdGhhdCBhIGJ1bmNoIG9mIHRlc3RzIGZhaWxzIG9uIGN5Z3dpbi4gT25lIHNldCBmYWlscwogIHdoZW4gdXNpbmcgcGVybCA1LjggKGFuZCB0aGV5IHJ1biBmaW5lIHdpdGggcGVybCA1LjYpLCBhbmQgYW5vdGhlciBzZXQKICBmYWlsZWQgYmVjYXVzZSBvZiBhbiBhcnRpZmFjdCBpbiB0aGUgdGVzdCBzdWl0ZSdzIEZUUCBzZXJ2ZXIgdGhhdCBJCiAgY29ycmVjdGVkLiBJdCB0dXJuZWQgb3V0IHRoZSBGVFAgc2VydmVyIGNvZGUgd2FzIHN0aWxsIGhhdmluZyBhIGZpbGUgb3BlbmVkCiAgd2hpbGUgdGhlIG1haW4gdGVzdCBzY3JpcHQgcmVtb3ZlZCBpdCBhbmQgaW52b2tlZCB0aGUgSFRUUCBzZXJ2ZXIgdGhhdAogIGF0dGVtcHRlZCB0byBjcmVhdGUgdGhlIHNhbWUgZmlsZSBuYW1lIG9mIHRoZSBmaWxlIHRoZSBGVFAgc2VydmVyIGtlcHQgb3Blbi4KICBUaGlzIG9wZXJhdGlvbiB3b3JrcyBmaW5lIG9uIHVuaXgsIGJ1dCBub3Qgb24gY3lnd2luLgoKVmVyc2lvbiA3LjEwLjQgKDIgQXByIDIwMDMpCgpEYW5pZWwgKDEgQXByKQotIEFkZGVkIHRlc3QgY2FzZSA1MDUgdG8gZXhlcmNpc2UgRlRQIHVwbG9hZCB3aXRoIHJlbmFtZSBkb25lIHdpdGggbGliY3VybCwKICBhbmQgZm9yIHRoYXQgSSBoYWQgdG8gZXh0ZW5kIHRoZSB0ZXN0IHN1aXRlJ3MgRlRQIHNlcnZlciB0byBkZWFsIHdpdGggdGhlCiAgUk5GUiBhbmQgUk5UTyBjb21tYW5kcy4KCkRhbmllbCAoMzEgTWFyKQotIEV2ZW4gbW9yZSBTU0wgY29uZmlnIGNoZWNrIG1vZGlmaWNhdGlvbnMgYWZ0ZXIgUmljaGFyZCdzIHRlc3RpbmcuCgpWZXJzaW9uIDcuMTAuNC1wcmU2ICgzMSBNYXIgMjAwMykKCkRhbmllbCAoMzEgTWFyKQotIE1vcmUgZml4ZXMgZm9yIHRoZSBTU0wgc2Vzc2lvbiBJRCBjYWNoZSBjaGVja3Mgd2hlbiBTU0wgY29uZmlncyBhcmUgY2hhbmdlZAogIGJldHdlZW4gY29ubmVjdGlvbnMuIEJhc2VkIG9uIHRlc3RzIGFuZCB0YWxrcyB3aXRoIFJpY2hhcmQgQnJhbWFudGUuCgotIEd1aWxsYXVtZSBDb3R0ZW5jZWF1IHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhZGRlZCBDVVJMT1BUX1VOUkVTVFJJQ1RFRF9BVVRILgogIFdoZW4gZW5hYmxlZCwgaXQgd2lsbCBwcmV2ZW50IGxpYmN1cmwgZnJvbSBsaW1pdGluZyB0byB3aGljaCBob3N0IGl0IHNlbmRzCiAgdXNlcitwYXNzd29yZCB0byB3aGVuIGZvbGxvd2luZyBsb2NhdGlvbnMuIEJ5IGRlZmF1bHQsIGxpYmN1cmwgb25seSBzZW5kcwogIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoZSBvcmlnaW5hbCBob3N0IHVzZWQgaW4gdGhlIGZpcnN0IFVSTCwgYnV0IHdpdGggdGhpcwogIG9wdGlvbiBzZXQgaXQgd2lsbCBzZW5kIHRoZSBhdXRoIGluZm8gdG8gYWxsIGhvc3RzIGl0IGZvbGxvd3MgbG9jYXRpb24KICBoZWFkZXJzIHRvLiBUaGUgbmV3IHRvb2wgY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgdGhpcyBpcyBuYW1lZAogICItLWxvY2F0aW9uLXRydXN0ZWQiLgoKLSBGcmFua2llIEZvbmcgcmVwb3J0ZWQgYSBwcm9ibGVtIHdpdGggbGliY3VybCBpZiB5b3UgcmUtdXNlZCBhbiBlYXN5IGhhbmRsZQogIHdpdGggYSBwcm94eSwgYW5kIHlvdSBmaXJzdCBtYWRlIGEgaHR0cHM6Ly8gY29ubmVjdGlvbiB0byBhIGhvc3QgYW5kIHRoZW4KICBzd2l0Y2hlZCB0byBhIGh0dHA6Ly8gb25lIHRvIHRoZSBzYW1lIGhvc3QuIGxpYmN1cmwgd291bGQgdGhlbiB3cm9uZ2x5IHJlLXVzZQogIHRoZSBzYW1lIGNvbm5lY3Rpb24gZm9yIGl0IGFuZCBmYWlsIHRvIGdldCB0aGUgc2Vjb25kIFVSTCBwcm9wZXJseQoKRGFuaWVsICgyOSBNYXIpCi0gRGFuIFNoZWFyZXIncyBmaXggdGhhdCBtYWtlcyBjdXJsIGNvbXBsYWluIGlmIGludm9rZWQgd2l0aCBub3RoaW5nIGJ1dCAiY3VybAogIC1PIiB3YXMgYXBwbGllZC4KCkRhbmllbCAoMjYgTWFyKQotIEJyeWFuIEtlbXAgd2FzIGZyaWVuZGx5IGVub3VnaCB0byBsZW5kIG1lIGFuIGFjY291bnQgb24gaGlzIFJlZGhhdCA5IGJveCBhbmQKICBJIGNvdWxkIGZpeCB0aGUgY29uZmlndXJlIHByb2JsZW1zIG9uIHJlZGhhdCA4LjEgYW5kIDkgaW4gbm8gdGltZSB0aGFua3MgdG8KICB0aGlzLiBUaGFua3MgYSBidW5jaCBCcnlhbiEKCkRhbmllbCAoMjUgTWFyKQotIFJlbmFtZWQgY29uZmlndXJlLmluIHRvIGNvbmZpZ3VyZS5hYwoKVmVyc2lvbiA3LjEwLjQtcHJlNSAoMjUgTWFyIDIwMDMpCgpEYW5pZWwgKDI1IE1hcikKLSBSaWNoYXJkIEJyYW1hbnRlIHByb3ZpZGVkIGEgZml4IGZvciBhIGhhbmRsZSByZS11c2UgcHJvYmxlbSBzZWVuIHdoZW4geW91CiAgY2hhbmdlIG9wdGlvbnMgb24gYW4gU1NMLWVuYWJsZWQgY29ubmVjdGlvbiBiZXR3ZWVuIHJlcXVlc3RzLiBQcmV2aW91c2x5LAogIGNoYW5naW5nIHBlZXIgdmVyaWZpY2F0aW9uIG9yIGhvc3QgdmVyaWZpY2F0aW9uIGFuZCBzaW1pbGFyIHRoaW5ncyB3YXMgbm90CiAgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gYSBjb25uZWN0aW9uIHdlcmUgY2hlY2tlZCBmb3IgcmUtdXNlIGFuZCB0aHVzCiAgZW5hYmxpbmcgc3RyaWN0ZXIgY2hlY2sgYmV0d2VlbiByZXF1ZXN0cyBvbiBhIHJlLXVzZWQgY29ubmVjdGlvbiBtYWRlIG5vCiAgZGlmZmVyZW5jZSBhbmQgdGhlIGNvbm5lY3Rpb24gd291bGQgdGh1cyBiZSB1c2VkIGVycm9uZW91c2x5LgoKRGFuaWVsICgyNCBNYXIpCi0gR/Z0eiBCYWJpbi1FYmVsbCBwb2ludGVkIG91dCB0aGF0IHRoZSBjYS1idW5kbGUuY3J0IGZpbGUgY29udGFpbmVkIGEKICBjZXJ0aWZpY2F0ZSBmcm9tIFRydXN0Y2VudGVyIHRoYXQgd2FzIGEgZGVtbyBjZXJ0aWZpY2F0ZSBvbmx5IHRoYXQgd2FzIG5ldmVyCiAgaW50ZW5kZWQgdG8gYmUgcGFydCBvZiBhIENBIGJ1bmRsZS4KCkRhbmllbCAoMjEgTWFyKQotIExpZmUgaXMgYSBteXN0ZXJ5LiBXaXRoaW4gYSB0aW1lIHBlcmlvZCBvZiAxNyBob3VycywgVGltIFBvcGUgYW5kIE1pY2hhZWwKICBDaHVyY2hpbGwgZmlsZWQgb25lIGJ1ZyByZXBvcnQgZWFjaCwgYm90aCBpZGVudGlmeWluZyBwcm9ibGVtcyB3aXRoIGEgc2Vjb25kCiAgdHJhbnNmZXIgd2hlbiBkb2luZyBwZXJzaXN0ZW50IHRyYW5zZmVycyByZS11c2luZyBhIGNvbm5lY3Rpb24uIFRpbSdzIG9uZSBpcwogICM3MDY2MjQsIGxhYmVsZWQgIk11bHRpcGxlIHVwbG9hZHMgcGVyIGhhbmRsZSBmYWlsIiBhbmQgTWljaGFlbCdzICM3MDcwMDMKICAiRG9lcyBub3Qgc2VuZCBBdXRob3JpemF0aW9uOiBoZWFkZXIgd2hlbiByZXVzaW5nIGNvbm5lY3Rpb24iLiBJIGNvdWxkIHRyYWNrCiAgYm90aCBkb3duIHRvIHRoZSBzYW1lIHBpZWNlIG9mIGxvZ2ljIGFuZCBpdCB0dXJuZWQgb3V0IGxpYmN1cmwgd2FzIG5vdCB1c2luZwogIG5ldyBzZXR0aW5ncyBwcm9wZXJseSB3aGVuIHJlLXVzaW5nIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24uIFRoaXMgY29uY2VybmVkCiAgYm90aCB1cGxvYWRpbmcgYW5kIGRvd25sb2FkaW5nIGFuZCBpbnZvbHZlZCBleGFjdGx5IHRob3NlIHBpZWNlcyB0aGVzZSB0d28KICByZXBvcnRzIGlkZW50aWZpZWQuIFRoaXMgY29kZSBoYXMgYmVlbiB0aGlzIGZhdWx0eSBzaW5jZSB0aGUgZGF5IEkKICBpbnRyb2R1Y2VkIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdXBwb3J0IGluIGxpYmN1cmwsIG1vcmUgdGhhbiAyIHllYXJzIGFnby4KCkRhbmllbCAoMjAgTWFyIDIwMDMpCi0gRml2ZSB5ZWFyIGFubml2ZXJzYXJ5LiBUb2RheSBmaXZlIHllYXJzIGFnbywgdGhlIGZpcnN0IGV2ZXIgY3VybCByZWxlYXNlIHNhdwogIHRoZSBsaWdodCBvZiBkYXkuCgpEYW5pZWwgKDE3IE1hcikKLSBBbmR5IENlZGlsbmlrIGNvcnJlY3RlZCBmbGF3cyBpbiBzb21lIGxpYmN1cmwgZXhhbXBsZS11c2FnZSBzb3VyY2VzLgoKRGFuaWVsICgxNiBNYXIpCi0gSnVhbiBGLiBDb2RhZ25vbmUgcmVwb3J0ZWQgdGhhdCB0aGUgZml4IGZyb20gTWFyY2ggMm5kIHdhcyBpbmNvbXBsZXRlLgoKLSBBZGRlZCBjb2RlIHRvIHRoZSBjb25maWd1cmUuaW4gdG8gY2hlY2sgZm9yIHNlbGVjdCgpIGFyZ3VtZW50IHR5cGVzLiBJJ3ZlCiAgbm90IG1hZGUgYW55IGNvZGUgdXNlIHRoZSByZXN1bHRzIGp1c3QgeWV0IHRob3VnaC4KCkRhbmllbCAoMTUgTWFyKQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIHR3byBwYXRjaGVzIHRvIGJ1aWxkIGJldHRlciBvbiBXaW5kb3dzLgoKLSBBZGp1c3RlZCB0aGUgdGVzdCBzdWl0ZSBjb2RlIHRvIGJldHRlciBtYWtlIHN1cmUgdGhhdCB0aGUgc2VydmVyKHMpIHJlcXVpcmVkCiAgZm9yIGEgc3BlY2lmaWMgdGVzdCBpcyBwcm9wZXJseSBzdGFydGVkIGJlZm9yZSB0aGUgdGVzdCBjYXNlIGlzIGF0dGVtcHRlZC4KICBNYW55IHRlc3RzIG5vdyBydW4gYSBsb3QgZmFzdGVyIHRoYW4gYmVmb3JlLgoKRGFuaWVsICgxNCBNYXIpCi0gQW5vdGhlciBjb25maWd1cmUuaW4gYWRqdXN0bWVudCBtYWRlIHRoZSBjb25maWd1cmUgZGV0ZWN0IGZ1bmN0aW9ucyBwcm9wZXJseQogIG9uIEhQVVggbm93LgoKRGFuaWVsICgxMyBNYXIpCi0gUGhpbGlwcGUgUmFvdWx0IGZpeGVkIHByZTQtY29tcGlsZSBxdWlya3MgZm9yIEZyZWVCU0QuCgpWZXJzaW9uIDcuMTAuNC1wcmU0ICgxMyBNYXIgMjAwMykKCkRhbmllbCAoMTMgTWFyKQotIEFkZGVkIGEgYmFja3VwLWNoZWNrIGZvciBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgZm91bmQgYnkgQUNfQ0hFQ0tfRlVOQ1MoKQogIGFzIEkgYmVsaWV2ZSBzb21lIGNoZWNrcyBvbiBIUFVYIG5lZWQgdGhpcy4gQXQgbGVhc3Qgc29tZSBvZiB0aGUgaW5mbyBnaXZlbgogIHRvIHVzIGJ5IFJpY2sgSm9uZXMgc2VlbWVkIHRvIGluZGljYXRlIHRoaXMuCgpEYW5pZWwgKDEyIE1hcikKLSBUaG9tYXMgVG9uaW5vIGZvdW5kIG91dCB0aGF0IGlmIHlvdSB1c2VkIHRoZSBjdXJsIHRvb2wgdG8gZG8gUFVUIG9wZXJhdGlvbnMKICBhcyBpbiAnY3VybCB3d3cuZm9vLmNvbS9kaXIvIC1UIGZpbGUnIGFuZCB0aGUgZmlsZSBuYW1lIGluY2x1ZGVkIGZvciBleGFtcGxlCiAgc3BhY2Ugb3Igb3RoZXIgY2hhcmFjdGVycyB0aGF0IGRvbid0IGJlbG9uZyBpbiBVUkxzLCBjdXJsIGRpZCBub3QgcHJvcGVybHkKICBVUkwgZW5jb2RlIHRoZW0gYmVmb3JlIHVzaW5nIHRoZW0gaW4gdGhlIFVSTC4KCi0gQWRkZWQgYW4gb3B0aW9uIHRvIGNvbmZpZ3VyZSBjYWxsZWQgLS1lbmFibGUtbGliZ2NjIHRoYXQgc2ltcGx5IGFkZHMgLWxnY2MKICB0byB0aGUgTElCUyB2YXJpYWJsZSwgYXMgdGhpcyBzZWVtcyB0byBiZSBhIGNvbW1vbiBwcm9ibGVtLgoKLSBJIG1vZGlmaWVkIHRoZSBjb25maWd1cmUuaW4gZmlsZSwgc28gdGhhdCB0aGUgaGVhZGVycyBhcmUgbm93IGNoZWNrZWQgaW4gYW4KICBvcmRlciBvZiAidmlhbGl0eSIuIFdlIG11c3QgYWxzbyBtYWtlIHN1cmUgdG8gdXNlIHRoZSAiZGVmYXVsdCBoZWFkZXJzIgogIHBhcmFtZXRlciB0byBBQ19DSEVDS19IRUFERVJTKCkgc28gdGhhdCBoZWFkZXJzIGFyZSBjaGVja2VkIHdpdGggdGhlIHByb3BlcgogIHByZXJlcXVpc2l0ZXMgaW5jbHVkZWQgKGkuZSBhbGwgdGhlIG1ham9yIGFuZCBnZW5lcmFsbHkgaW1wb3J0YW50IGhlYWRlcgogIGZpbGVzIGFyZSBpbmNsdWRlZCB0aGVyZSBieSBkZWZhdWx0KS4gVGhpcyBtaWdodCBiZSB3aGF0IHdlIG5lZWQgZm9yIHZhcmlvdXMKICBTdW4sIEhQLCBBSVggYW5kIFRydTY0IHN5c3RlbXMgdG8gYmVoYXZlIGdvb2QgYWdhaW4gb24gdGhlIGhlYWRlciBjaGVjawogIGZyb250LgoKLSBSaWNrIEpvbmVzIHBvaW50ZWQgb3V0IGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzIG9uIEhQLVVYIHRoYXQgSSBhZGRyZXNzZWQuCgotIEkgbWFkZSB0aGUgY29uZmlndXJlIC0taGVscCBvdXRwdXQgbmljZXIgYnkgdXNpbmcgQUNfSEVMUF9TVFJJTkcoKSBhIGxvdAogIG1vcmUuCgpEYW5pZWwgKDExIE1hcikKLSBDaHJpc3RvcGhlIERlbW9yeSBmaXhlZCB0aGUgc29ja2V0IHNlbmRpbmcgY29kZSB0byB3b3JrIGJldHRlciBvbiBIUC1VWAogIHdoZW4gc2VuZGluZyBkYXRhIHRvIGEgc29ja2V0IHRoYXQgd291bGQgYmxvY2suIEl0IHRoZW4gcmV0dXJucyBFQUdBSU4sIG5vdAogIEVXT1VMREJMT0NLLgoKLSBSaWNoYXJkIEdvcnRvbiBpbXByb3ZlZCB0aGUgc2VlZGluZyBmdW5jdGlvbiBmb3Igc3lzdGVtcyB3aXRob3V0IGEgZ29vZAogIGFuZCByZWxpYWJsZSByYW5kb20gc291cmNlLgoKLSBSaWNoYXJkIEdvcnRvbiBmaXhlZCBhIGZldyB3YXJuaW5ncyB0aGF0IHBvcHBlZCB1cCB3aGVuIHlvdSBidWlsdCBjdXJsCiAgdXNpbmcgdGhlIFN1biBjb21waWxlciBvbiBhIDY0Yml0IFNQQVJDIHBsYXRmb3JtLgoKLSBNYXJ0aW4gQy4gTWFydGluIGZpeGVkIGEgY2FzZSB3aGVyZSBhIGNvbm5lY3QgZmFpbHVyZSB1c2luZyB0aGUgbXVsdGkKICBpbnRlcmZhY2UgZGlkbid0IHByb2R1Y2UgYSBodW1hbiByZWFkYWJsZSBlcnJvciBzdHJpbmcuCgpEYW5pZWwgKDEwIE1hcikKLSBSZXZlcnRlZCBsdG1haW4uc2ggYmFjayB0byBsaWJ0b29sIDEuNC4yIHN0YXR1cyBhZ2FpbiwgYXMgdGhlIDEuNC4zIHZlcnNpb24KICBicm9rZSB0aGUgYnVpbGQgb24gbnVtZXJvdXMgcGxhdGZvcm1zLiBJdCBzZWVtcyB0aGF0IGxpYnRvb2wgMS40LjMgcHV0cyBzb21lCiAgcmVxdWlyZW1lbnRzIG9uIHdoYXQgdmVyc2lvbnMgb2YgdGhlIG90aGVyIHRvb2xzIChhdXRvY29uZiArIGF1dG9tYWtlKSB0aGF0CiAgSSBhbSBub3QgZmFtaWxpYXIgd2l0aCBhbmQgdGh1cyBJIGNvdWxkbid0IGZ1bGZpbGwgYXQgdGhpcyBwb2ludC4KCiAgWWVzLCB0aGlzIGlzIG1vcmUgdGhhbiBtaWxkbHkgZnJ1c3RyYXRpbmcuCgpEYW5pZWwgKDcgTWFyKQotIFJ1biBsaWJ0b29saXplIHZlcnNpb24gMS40LjMuCgpWZXJzaW9uIDcuMTAuNC1wcmUzICg0IE1hciAyMDAzKQoKRGFuaWVsICgzIE1hcikKLSBBZGRlZCBzaGFyZS5vYmogdG8gdGhlIFZDNiBhbmQgQm9ybGFuZCBsaWJjdXJsIG1ha2VmaWxlcy4KCi0gVHJvZWxzIFdhbHN0ZWQgSGFuc2VuIGZvdW5kIGFuZCBpbnZlc3RpZ2F0ZWQgYSBwcm9ibGVtIHdpdGggbGliY3VybCBvbiBBSVgsCiAgcHJlc3VtYWJseSBvbmx5IG9uIDQuMyBvciBsYXRlci4gZ2V0aG9zdGJ5bmFtZV9yKCkgaXMgbm90IHJldHVybmluZyBkYXRhCiAgdGhhdCBpcyBwb3NzaWJsZSB0byAia2VlcCIgYW5kIGNhY2hlIHRoZSB3YXkgbGliY3VybCBkb2VzLiBCdXQgaW5zdGVhZCB0aGVzZQogIHZlcnNpb25zIG9mIEFJWCB1c2VzIGEgZ2V0aG9zdGJ5bmFtZSgpIHRoYXQgd29ya3MgdGhyZWFkLXNhZmVseSB3ZSBjYW4KICBpbnN0ZWFkIHVzZSB0aGUgb3JkaW5hcnkgZ2V0aG9zdGJ5bmFtZSgpIGFuZCBvdXIgcGFja19ob3N0ZW50KCkgYXBwcm9hY2ggdG8KICBhY2hpZXZlIHdoYXQgd2Ugd2FudC4gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGF0dGVtcHRzIHRvIGRldGVjdCBBSVggNC4zIG9yCiAgbGF0ZXIgdG8gYWRqdXN0IGZvciB0aGlzLgoKRGFuaWVsICgyIE1hcikKLSBKdWFuIEYuIENvZGFnbm9uZSBmb3VuZCBhIHByb2JsZW0gaW50cm9kdWNlZCBpbiA3LjEwLjMgd2hlbiB5b3UgZmlyc3QgZGlkIGEKICBQT1NUIGFuZCB0aGVuIGJhY2sgdG8gYSBHRVQgdXNpbmcgdGhlIHNhbWUgZWFzeSBoYW5kbGUuCgpEYW5pZWwgKDI4IEZlYikKLSBSZW1vdmVkIHRoZSBzdHJlcXVhbCBhbmQgc3RybmVxdWFsIGRlZmluZXMgZnJvbSBjdXJsL2N1cmwuaCBoZWFkZXIuIFRoZXkKICB3ZXJlIG5ldmVyIG1lYW50IGZvciB0aGUgcHVibGljIGhlYWRlciBhbnl3YXkuIFBoaWxpcHBlIFJhb3VsdCBicm91Z2h0IGl0CiAgdXAuCgotIEphbWVzIEJ1cnNhIGZpeGVkIHRoZSBSSVNDIE9TIGJ1aWxkLgoKRGFuaWVsICgyNyBGZWIpCi0gQXZlcnkgRmF5IHBvaW50ZWQgb3V0IHRoZSB2ZXJ5IG1pc2xlYWRpbmcgY3VybF9tdWx0aV9pbmZvX3JlYWQgbWFuIHBhZ2UsIGFuZAogIEkgdXBkYXRlZCBpdCB0byBiZWNvbWUgbW9yZSBhY2N1cmF0ZS4KCi0gU2FsdmF0b3JlIFNvcnJlbnRpbm8gZm91bmQgYSBwcm9ibGVtIHdpdGggRlRQIGRvd25sb2FkaW5nIHRoYXQgdHVybmVkIG91dCB0bwogIGJlIGhpcyBGVFAgc2VydmVyIHJldHVybmluZyBzaXplIHplcm8gKDAgYnl0ZXMpIHdoZW4gU0laRSB3YXMgdXNlZCBvbiBhIGZpbGUKICB3aGlsZSBiZWluZyBpbiBCSU5BUlkgbW9kZS4gV2Ugbm93IG1ha2UgYSBzZWNvbmQgY2hlY2sgZm9yIHRoZSBhY3R1YWwgc2l6ZQogIGJ5IHNjYW5uaW5nIHRoZSBSRVRSIHJlcGx5IGFueXdheSwgZXZlbiBpZiB0aGUgU0laRSBjb21tYW5kIHJldHVybmVkIDAuCgpEYW5pZWwgKDI2IEZlYikKLSBLeWxlIFNhbGxlZSByZXBvcnRlZCBhIGNhc2Ugd2hlcmUgaGUgd291bGQgZG8gYSB0cmFuc2ZlciB0aGF0IGRpZG4ndCB1cGRhdGUKICB0aGUgcHJvZ3Jlc3MgbWV0ZXIgcHJvcGVybHkuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYSBjYXNlIHdoZXJlIGxpYmN1cmwgd291bGQKICBsb29wIGEgbGl0dGxlIHRvbyBlYWdlcmx5IGluIHRoZSB0cmFuc2ZlciBsb29wLCB3aGljaCBpc24ndCByZWFsbHkgZ29vZCBmb3IKICB0aGUgQVBJcywgZXNwZWNpYWxseSBub3QgdGhlIG11bHRpIEFQSS4KClZlcnNpb24gNy4xMC40LXByZTIgKDI0IEZlYiAyMDAzKQoKRGFuaWVsICgyNCBGZWIpCi0gS2pldGlsIEphY29ic2VuIGZvdW5kIG91dCB0aGF0IHNldHRpbmcgQ1VSTE9QVF9NQVhDT05ORUNUUyB0byBhIHZhbHVlIGhpZ2hlcgogIHRoYW4gNSBjb3VsZCBjYXVzZSBhIHNlZ2ZhdWx0LgoKLSBJIGJlbGlldmUgSSBmaXhlZCB0aGUgJ0V4cGVjdDogMTAwLWNvbnRpbnVlJyBiZWhhdmlvciB0aGF0IGhhcyBiZWVuIGJyb2tlbgogIGZvciBhIHdoaWxlIChJIHRoaW5rIHNpbmNlIG15IGNoYW5nZSBkYXRlZCBEZWMgMTAgMjAwMikuIFdoZW4gdGhpcyBoZWFkZXIgaXMKICB1c2VkLCBsaWJjdXJsIHNob3VsZCB3YWl0IGZvciBhIEhUVFAgMTAwIChvciB0aW1lb3V0KSBiZWZvcmUgc2VuZGluZyB0aGUKICBwb3N0L3B1dCBkYXRhLgoKRGFuaWVsICgxNCBGZWIpCi0gTWF0dGhldyBDbGFya2UgcHJvdmlkZWQgc29tZSBpbmZvIHdoYXQgdG8gbW9kaWZ5IHRvIG1ha2UgY3VybCBidWlsZAogIGZsYXdsZXNzbHkgb24gQUlYIDMuMi41LgoKLSBNYXJ0aW4gQy4gTWFydGluIGZvdW5kIGFuZCBmaXhlZCBhIHByb2JsZW0gaW4gdGhlIG11bHRpIGludGVyZmFjZSB3aGVuCiAgcnVubmluZyBvbiBXaW5kb3dzIGFuZCB0cnlpbmcgdG8gY29ubmVjdCB0byBhIHBvcnQgd2l0aG91dCBhIGxpc3RlbmVyLgoKRGFuaWVsICgxMyBGZWIpCi0gQ2hyaXN0b3BoZXIgUi4gUGFsbWVyIGZpeGVkIEN1cmxfYmFzZTY0X2VuY29kZSgpIHRvIGRlYWwgd2l0aCB6ZXJvZXMgaW4gdGhlCiAgZGF0YSB0byBlbmNvZGUuCgpEYW5pZWwgKDQgRmViKQotIEplYW4tUGhpbGlwcGUgYWRkZWQgdGhlIGZpcnN0IGNvZGUgdGhhdCBlbmFibGVzIHRoZSAnc2hhcmUnIHN5c3RlbS4gVGhpcwogIHNob3VsZCBub3cgZW5hYmxlIHNoYXJpbmcgb2YgRE5TIGRhdGEgYmV0d2VlbiB0d28gY3VybCBlYXN5IGhhbmRsZXMuCgotIEluY29ycG9yYXRlZCBOaWNvIEJhZ2d1cycgZml4ZXMgdG8gYWdhaW4gY29tcGlsZSBmbGF3bGVzc2x5IG9uIFZNUy4KCi0gSmFtZXMgQnVyc2EgY29ycmVjdGVkIGEgYmFkIGNvbW1lbnQgaW4gdGhlIHB1YmxpYyBpbmNsdWRlIGZpbGUgY3VybC9tdWx0aS5oCgotIFBldGVyIEZvcnJldCByZXBvcnRlZCBvbmUgb2YgdGhvc2UgZXJyb3I6MDAwMDAwMDAgY2FzZXMgaW4gbGliY3VybCBhZ2FpbgogIHdoZW4gY29ubmVjdGluZyB0byBhIEhUVFBTIHNpdGUsIGFuZCB0aGlzIHRpbWUgSSBkaWQgZGlzY292ZXIgc29tZSBvZGRpdGllcwogIGluIGhvdyBjdXJsIHJlcG9ydHMgU1NMIGVycm9ycyBiYWNrLiBJdCBjb3VsZCBtaXNzIHNob3dpbmcgdGhlIGFjdHVhbCBlcnJvci4KClZlcnNpb24gNy4xMC40LXByZTEgKDMgRmViIDIwMDMpCgpEYW5pZWwgKDMgRmViKQotIFJlbW92ZWQgdGhpbmdzIGluIHRoZSBkb2NzIHNheWluZyBjYXBhdGggZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MsIGFzIEp1bGlhbgogIE5vYmxlIHRvbGQgdXMgaXQgd29ya3MgZmluZS4KCkRhbmllbCAoMzEgSmFuKQotIEtldmluIFJvdGggZml4ZWQgdGhlIHpsaWIgYnVpbGQgc3R1ZmYgaW4gdGhlIE1pbmd3MzIgbWFrZWZpbGUuCgpEYW5pZWwgKDMwIEphbikKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGF0IGN1cmwgb24gV2luZG93cyBhbHdheXMgY2hlY2tlZCBmb3IgdGhlIENBIGNlcnQKICBidW5kbGUgdXNpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIGFuZCB0aGUgcGF0aCBzY2FuLCBldmVuIHRob3VnaAogIC1rLy0taW5zZWN1cmUgd2FzIHVzZWQuCgotIEhhbWlzaCBNYWNrZW56aWUgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIG9ubHkgZGlkIHN0cmljdCBob3N0IG5hbWUgdmVyaWZ5aW5nCiAgaWYgY2FwYXRoIG9yIGNhaW5mbyB3YXMgdXNlZC4gTm93IGl0J2xsIGFsd2F5cyBkbyBpdCB1bmxlc3MgLWsgLyAtLWluc2VjdXJlCiAgaXMgdXNlZCEKCi0gUGF2ZWwgQ2VuZWsgcG9pbnRlZCBvdXQgdGhhdCB0aGUgQ29udGVudC1UeXBlIGV4dHJhY3Rpb24gd2FzIGRvbmUgd3JvbmdseQogIGFzIHRoZSBmdWxsIHN0cmluZyB3YXMgbm90IGZldGNoZWQuIEFkZGVkIHRlc3QgY2FzZSA1NyB0byB2ZXJpZnkgdGhhdCBjdXJsCiAgZG9lcyBpdCByaWdodCBub3cuCgpEYW5pZWwgKDI5IEphbikKLSBKYW1pZSBXaWxraW5zb24gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBjdXJsIGF0dGVtcHQgdG8gY2xlYXIgb3V0CiAgInNlbnNpdGl2ZSIgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBzbyB0aGF0IHRoZXkgZG9uJ3QgYXBwZWFyIGluIHBzIG91dHB1dHMKICAob25seSBvbiBwbGF0Zm9ybXMgdGhhdCBhbGxvdyB3cml0aW5nIHRvIGFyZ3ZbXSkuCgotIEpvaG4gTWNHb3dhbiBmb3VuZCBvdXQgdGhhdCB0aGUgREVCVUdGVU5DVElPTiBjb3VsZCBiZSBjYWxsZWQgd2l0aCBiYWQKICBhcmd1bWVudHMgYW5kIHRodXMgY2F1c2UgdGhlIC0tdHJhY2Ugb3V0cHV0cyB0byBnbyB3cm9uZy4KCi0gUmVtb3ZlZCBhbGwgdGhlIGVtYWNzIGxvY2FsIHZhcmlhYmxlcyBmcm9tIGFsbCBmaWxlcy4gTWF0cyBMaWRlbGwgcHJvdmlkZWQKICB0aGUgbmV3IHNhbXBsZS5lbWFjcyBmaWxlIChmb3IgYSBzYW1wbGUgb2Ygd2hhdCB0byBpbmNsdWRlIGluIHlvdXIgLmVtYWNzKQogIGFuZCB0aGUgY3VybC1zdHlsZS5lbCB0aGF0IHNldHMgYSBiZXR0ZXIgYy1zdHlsZSBmb3IgZWRpdGluZyBjdXJsIHNvdXJjZXMuCgotIERhdmUgSGFsYmFra2VuIGZvdW5kIGEgcHJvYmxlbSB3aXRoIEZUUCBkb3dubG9hZHMgdGhhdCBjb3VsZCBhY2NpZGVudGx5CiAgcmV0dXJuIENVUkxFX1BBUlRJQUxfRklMRSB3aGVuIGN1cmxfZWFzeV9wZXJmb3JtKCkgd2FzIGNhbGxlZCB3aXRoIE5PQk9EWQogIHNldCBUUlVFLgoKRGFuaWVsICgyNyBKYW4pCi0gVGhlIGZvcGVuLmMgZXhhbXBsZSB3YXMgZmxhd2VkIGFzIE5pY2sgSHVtZnJleSBub3RpY2VkLCBhbmQgSSBmaXhlZCBpdCB0bwogIHdvcmsgYWdhaW4uCgpEYW5pZWwgKDI0IEphbikKLSBCZXJ0cmFuZCBEZW1pZGRlbGFlciBmb3VuZCBhbmQgZml4ZWQgYSBtZW1vcnkgbGVhayAodGhlIGNvbnRlbnQtdHlwZSBzdHJpbmcpCiAgd2hlbiBmb2xsb3dpbmcgbG9jYXRpb25zLgoKRGFuaWVsICgyMiBKYW4gMjAwMykKLSBJYW4gV2lsa2VzIGFuZCBMZWdvZmYgVmluY2VudCBib3RoIGluZGVwZW5kZW50bHkgcHJvdmlkZWQgZml4ZXMgZm9yIG1ha2luZwogIGN1cmwvbXVsdGkuaCB3b3JrIHByb3Blcmx5IHdoZW4gY29tcGlsZWQgd2l0aCBhIEMrKyBjb21waWxlci4KCkRhbmllbCAoMjAgSmFuIDIwMDMpCi0gRml4ZWQgJ2J1aWxkY29uZicgdG8gY2hlY2sgdmVyc2lvbiBudW1iZXIgb2YgdGhlIHJlcXVpcmVkIHRvb2xzIGJlZm9yZQogIHRoZXkncmUgYWN0dWFsbHkgdXNlZC4KCi0gV3JvdGUgJ3Rlc3RjdXJsLnNoJywgYSBzY3JpcHQgdGFyZ2V0ZWQgZm9yIGF1dG9tYXRpYyBhbmQgZGlzdHJpYnV0ZWQgY3VybAogIHRlc3RzIG9uIHZhcmlvdXMgcGxhdGZvcm1zLgoKLSBEYXZpZCBUaGllbCBwb2ludGVkIG91dCB0aGF0IHRoZSAubmV0cmMgZmlsZSB3YXMgbm90IGJlaW5nIGRlYWx0IHdpdGgKICBwcm9wZXJseSBhbnltb3JlLiBJIGJyb2tlIHRoaXMgaW4gdGhlIHBhc3N3b3JkIHByb21wdGluZyAiZml4Ii4KCi0gTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgcGF0Y2hlZCBsaWJjdXJsIHRvIGFsbG9jYXRlIHRoZSBzY3JhdGNoIGJ1ZmZlciBvbmx5CiAgb24gZGVtYW5kIGFuZCB0aHVzIHdlIHNhdmUgMzJLQiBpbiBlYWNoIGN1cmwgaGFuZGxlIHRoYXQgZG9uJ3QgdXNlIHRoYXQKICBidWZmZXIuIFRoaXMgbmVlZCBhcHBlYXJlZCB3aGVuIHNvbWUgcGVvcGxlIHN0YXJ0ZWQgdXNpbmcgdGhvdXNhbmRzIG9mCiAgc2ltdWx0YW5lb3VzIGN1cmwgaGFuZGxlcy4uLiA6LSkKCkRhbmllbCAoMTYgSmFuIDIwMDMpCi0gTWFya3VzIE9iZXJodW1lciBmaXhlZCBjdXJsLWNvbmZpZyAtLWNmbGFncyB3aGVuIHRoZSBpbmNsdWRlZGlyIHdhcyBub3QKICAvdXNyL2luY2x1ZGUuCgotIE1hcmt1cyBPYmVyaHVtZXIgZml4ZWQgQ1VSTElORk9fUFJJVkFURSB0byBwcm9wZXJseSByZXR1cm4gTlVMTCBpZiBpdCB3YXMKICBzZXQgdG8gTlVMTCEKClZlcnNpb24gNy4xMC4zICgxNCBKYW4gMjAwMykKCkRhbmllbCAoMTAgSmFuIDIwMDMpCi0gU3RldmUgT2xpcGhhbnQgcG9pbnRlZCBvdXQgdGhhdCB0ZXN0IGNhc2UgMTA1IGRpZCBub3Qgd29yayBhbnltb3JlIGFuZCB0aGlzCiAgd2FzIGR1ZSB0byBhIG1pc3NpbmcgZml4IGZvciB0aGUgcGFzc3dvcmQgcHJvbXB0aW5nLgoKVmVyc2lvbiA3LjEwLjMtcHJlNiAoMTAgSmFuIDIwMDMpCgpEYW5pZWwgKDkgSmFuIDIwMDMpCi0gQnJ5YW4gS2VtcCBwb2ludGVkIG91dCB0aGF0IGN1cmwgLXUgY291bGQgbm90IHByb3ZpZGUgYSBibGFuayBwYXNzd29yZAogIHdpdGhvdXQgcHJvbXB0aW5nIHRoZSB1c2VyLiBJdCBjYW4gbm93LiAtdSB1c2VybmFtZTogbWFrZXMgdGhlIHBhc3N3b3JkCiAgZW1wdHksIHdoaWxlIC11IHVzZXJuYW1lIG1ha2VzIGN1cmwgcHJvbXB0IHRoZSB1c2VyIGZvciBhIHBhc3N3b3JkLgoKLSBLamV0aWwgSmFjb2JzZW4gZm91bmQgYSByZW1haW5pbmcgY29ubmVjdCBwcm9ibGVtIGluIHRoZSBtdWx0aSBpbnRlcmZhY2Ugb24KICBpcHY0IHN5c3RlbXMgKExpbnV4IG9ubHk/KSwgdGhhdCBJIGZpeGVkIGFuZCBLamV0aWwgdmVyaWZpZWQgdGhhdCBpdCBmaXhlZAogIGhpcyBwcm9ibGVtcy4KCi0gbWVtYW5hbHl6ZS5wbCBub3cgcmVhZHMgYSBmaWxlIG5hbWUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBhbmQgbm8gbG9uZ2VyCiAgdGFrZXMgdGhlIGRhdGEgb24gc3RkaW4gYXMgYmVmb3JlLgoKVmVyc2lvbiA3LjEwLjMtcHJlNSAoOSBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBGaXhlZCB0ZXN0cy9tZW1hbmFseXplLnBsIHRvIHdvcmsgd2l0aCBmaWxlIG5hbWVzIHRoYXQgY29udGFpbiBjb2xvbnMgKGFzIG9uCiAgV2luZG93cykuCiAgCi0gS2pldGlsIEphY29ic2VuIHF1aWNrbHkgcG9pbnRlZCBvdXQgdGhhdCBsaWIvc2hhcmUuaCB3YXMgbWlzc2luZy4uLgoKVmVyc2lvbiA3LjEwLjMtcHJlNCAoOSBKYW4gMjAwMykKCkRhbmllbCAoOSBKYW4gMjAwMykKLSBVcGRhdGVkIGxpYi9zaGFyZS5jIHF1aXRlIGEgYml0IHRvIG1hdGNoIHRoZSBkZXNpZ24gZG9jdW1lbnQgYXQKICBodHRwOi8vY3VybC5oYXh4LnNlL2Rldi9zaGFyaW5nLnR4dCBhIGxvdCBtb3JlLgoKICBJJ2xsIHRyeSB0byB1cGRhdGUgdGhlIGRvY3VtZW50IHNvb25pc2guIHNoYXJlLmMgaXMgc3RpbGwgbm90IGFjdHVhbGx5IHVzZWQKICBieSBsaWJjdXJsLCBidXQgdGhlIEFQSSBpcyBzbG93bHkgZ2V0dGluZyB0aGVyZSBhbmQgd2UgY2FuIHN0YXJ0CiAgaW1wbGVtZW50aW5nIGNvZGUgdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhpcyBzeXN0ZW0uCgpEYW5pZWwgKDggSmFuIDIwMDMpCi0gVXBkYXRlZCBzaGFyZSBzdHVmZiBpbiBjdXJsL2N1cmwuaCwgaW5jbHVkaW5nIGRhdGEgdHlwZXMsIHN0cnVjdHMgYW5kCiAgZnVuY3Rpb24gcHJvdG90eXBlcy4gVGhlIGNvcnJlc3BvbmRpbmcgZmlsZXMgaW4gbGliLyB3ZXJlIGFsc28gbW9kaWZpZWQKICBvZiBjb3Vyc2UgdG8gcmVtYWluIGNvbXBpbGFibGUuIEJhc2VkIG9uIGlucHV0IGZyb20gSmVhbi1QaGlsaXBwZSBhbmQgYWxzbwogIHRvIG1ha2UgaXQgbW9yZSBpbiBsaW5lIHdpdGggdGhlIGRlc2lnbiBkb2N1bWVudC4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBwYXRjaGVkIGEgdmVyeSB0cml2aWFsIG1lbW9yeSBsZWFrIGluCiAgY3VybF9lc2NhcGUoKSB0aGF0IHdvdWxkIGhhcHBlbiB3aGVuIHJlYWxsb2MoKSByZXR1cm5zIE5VTEwuLi4KCi0gTWF0dGhldyBCbGFpbiBwcm92aWRlZCBmZWVkYmFjayB0byBtYWtlIHRoZSAtLWNyZWF0ZS1kaXJzIHN0dWZmIGJ1aWxkCiAgcHJvcGVybHkgb24gV2luZG93cy4KCi0gRml4ZWQgdGhlICNpbmNsdWRlIGluIHRlc3RzL2xpYnRlc3QvZmlyc3QuYyBhcyBMZWdvZmYgVmluY2VudCBwb2ludGVkIG91dC4KCkRhbmllbCAoNyBKYW4gMjAwMykKLSBQaGlsaXBwZSBSYW91bHQgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG5vdyBtYWtlcyBsaWJjdXJsIHByb3Blcmx5IHN1cHBvcnQKICB3aWxkY2FyZCBjaGVja3MgZm9yIGNlcnRpZmljYXRlIG5hbWVzLgoKLSBTaW1vbiBMaXUgYWRkZWQgQ1VSTE9QVF9IVFRQMjAwQUxJQVNFUywgdG8gbGV0IGFuIGFwcGxpY2F0aW9uIHNldCBvdGhlcgogIHN0cmluZ3MgcmVjb2duaXplZCBhcyAiSFRUUCAyMDAiIHRvIGFsbG93IGh0dHAtbGlrZSBwcm90b2NvbHMgdG8gZ2V0CiAgZG93bmxvYWRlZCBmaW5lIGJ5IGN1cmwuCgotIE5vdyB1c2luZyBhdXRvY29uZiAyLjU3IGFuZCBhdXRvbWFrZSAxLjcuMgoKLSBEb2luZyAiY3VybCAtSSBmdHA6Ly9kb21haW4vbm9uLWV4aXN0aW5nLWZpbGUiIHN0aWxsIG91dHB1dGVkIGEgZGF0ZSEKICBXYXluZSBIYWlnaCByZXBvcnRlZC4KCi0gVGhlIGVycm9yIG1lc3NhZ2UgaXMgbm93IHdyaXR0ZW4gcHJvcGVybHkgd2l0aCBhIG5ld2xpbmUgaW4gdGhlIC0tdHJhY2UKICBmaWxlLgoKRGFuaWVsICg2IEphbiAyMDAzKQotIFN0ZXJsaW5nIEh1Z2hlcyBmaXhlZCBhIHBvc3NpYmxlIGJ1ZzogcHJldmlvdXNseSwgaWYgeW91IGNhbGxlZAogIGN1cmxfZWFzeV9wZXJmb3JtIGFuZCB0aGVuIHNldCB0aGUgZ2xvYmFsIGRucyBjYWNoZSwgdGhlIGdsb2JhbCBjYWNoZQogIHdvdWxkbid0IGJlIHVzZWQuIFBvaW50ZWQgb3V0IGJ5IEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUuCgotIE1hdHRoZXcgQmxhaW4ncyBmaXhlZCB0aGUgVkM2IGxpYmN1cmwgbWFrZWZpbGUgdG8gaW5jbHVkZSBiZXR0ZXIgZGVidWcgZGF0YQogIG9uIGRlYnVnIGJ1aWxkcy4KRGFuaWVsICgyNyBEZWMgMjAwMikKLSBQaGlsaXBwZSBSYW91bHQgcmVwb3J0ZWQgYSBidWcgd2l0aCBIVFRQUyBjb25uZWN0aW9ucyB3aGljaCBJIGV2aWRlbnRseQogIGFkZGVkIGluIG15IDE5IGRlYyBmaXguIEkgY29ycmVjdGVkIGl0LgoKRGFuaWVsICgyMCBEZWMpCi0gSWRlYSBmcm9tIHRoZSBEZWJpYW4gbGF0ZXN0IHBhdGNoOiB1c2UgQU1fTUFJTlRBSU5FUl9NT0RFIGluIHRoZSBjb25maWd1cmUKICBzY3JpcHQgdG8gbWFrZSB0aGUgZGVmYXVsdCBtYWtlZmlsZSBsZXNzIGNvbmZ1c2luZyAidG8gdGhlIGNhc3VhbAogIGluc3RhbGxlciIuCgpWZXJzaW9uIDcuMTAuMy1wcmUzICgyMCBEZWMpCgpEYW5pZWwgKDE5IERlYykKLSBNYXR0aGV3IEJsYWluIHBhdGNoZWQgdGhlIEN1cmxfYmFzZTY0X2RlY29kZSgpIGZ1bmN0aW9uLgoKLSBFdmFuIEpvcmRhbiByZXBvcnRlZCBpbiBidWcgcmVwb3J0ICM2NTMwMjIgdGhhdCB0aGUgU1NMX3JlYWQoKSB1c2FnZSB3YXMKICB3cm9uZywgYW5kIGl0IGNlcnRhaW5seSB3YXMuIEl0IGNvdWxkIGxlYWQgdG8gY3VybCB1c2luZyB0b28gbXVjaCBDUFUgZHVlIHRvCiAgYSBzdHVwaWQgbG9vcC4KCkRhbmllbCAoMTggRGVjKQotIEFzIHN1Z2dlc3RlZCBieSBNYXJndXMgRnJldWRlbnRoYWwsIENVUkxFX0hUVFBfTk9UX0ZPVU5EIHdhcyByZW5hbWVkIHRvCiAgQ1VSTEVfSFRUUF9SRVRVUk5FRF9FUlJPUiBzaW5jZSBpdCBpcyByZXR1cm5lZCBvbiBhbnkgPj0gNDAwIGNvZGUgd2hlbgogIENVUkxPUFRfRkFJTE9ORVJST1IgaXMgc2V0LgoKRGFuaWVsICgxNyBEZWMpCi0gQnVnIHJlcG9ydGVkICM2NTE0NjQsIHJlcG9ydGVkIGJ5IENocmlzdG9waGVyIFBhbG1lciwgcHJvdmlkZWQgYW4gZXhhbXBsZQogIHNvdXJjZSBjb2RlIHVzaW5nIHRoZSBtdWx0aSBpbnRlcmZhY2UgdGhhdCBoYW5nIHdoZW4gdHJ5aW5nIHRvIGNvbm5lY3QgdG8gYQogIHByb3h5IG9uIGEgbG9jYWxob3N0IHBvcnQgd2hlcmUgbm8gcHJveHkgd2FzIGxpc3RlbmluZy4gVGhpcyBidWcgd2FzIG5vdAogIHJlcGVhdGFibGUgb24gbGliY3VybHMgdGhhdCB3ZXJlIElQdjYtZW5hYmxlZC4KCkRhbmllbCAoMTYgRGVjKQotIENocmlzdG9waGVyIFBhbG1lciBhbHNvIG5vdGljZWQgd2hhdCBWb2p0ZWNoIEphbm90YSBhbHJlYWR5IHdhcwogIGV4cGVyaWVuY2luZzogVGhlIGF0dGVtcHRlZCBuYW1lIHJlc29sdmUgZml4IGZvciBnbGliYyAyLjIuOTMgY2F1c2VkIGxpYmN1cmwKICB0byBjcmFzaCB3aGVuIHVzZWQgb24gc29tZSBvbGRlciBnbGliYyB2ZXJzaW9ucy4gVGhlIHByb2JsZW0gaXMgb2YgY291cnNlCiAgdGhlIHNpbGxpbmVzcyBvZiB0aGUgMi4yLjkzLiBJIGNvbW1pdHRlZCBhIGZpeCB0aGF0IGhvcGVmdWxseSBzaG91bGQgbWFrZQogIHRoZSBiaW5hcnkgcnVuIGZpbmUgb24gZWl0aGVyIG9uZSBvZiB0aGUgdmVyc2lvbnMsIGV2ZW4gdGhvdWdoIHRoZSBzb2x1dGlvbgogIGlzIG5vdCBhcyBuaWNlIGFzIEknZCBsaWtlIGl0IHRvIGJlLgoKRGFuaWVsICgxMyBEZWMpCi0gQnVnIHJlcG9ydCAjNjUxNDYwIGJ5IENocmlzdG9waGVyIFIuIFBhbG1lciBzaG93ZWQgdGhhdCB3aGVuIHVzaW5nIGxpYmN1cmwKICB0byBmb3IgZXhhbXBsZSBnbyBvdmVyIGEgcHJveHkgb24gbG9jYWxob3N0LCBpdCB3b3VsZCBhdHRlbXB0IHRvIGNvbm5lY3QKICB0aHJvdWdoIHRoZSBwcm94eSBUV0lDRS4KCiAgSSBhZGRlZCB0ZXN0IGNhc2UgNTAzIHdpdGggd2hpY2ggSSBtYW5hZ2VkIHRvIHJlcGVhdCB0aGlzIHByb2JsZW0gYW5kIEkKICBmaXhlZCB0aGUgY29kZSB0byBub3QgcmUtYXR0ZW1wdCBhbnkgY29ubmVjdHMgKHdoaWNoIGFsc28gbWFkZSBpdCBhIG5pY2VyCiAgZml4IGZvciB0aGUgIzY1MDk0MSBidWcgbWVudGlvbmVkIGJlbG93KS4KCiAgVGhlIHN3cyBzZXJ2ZXIgd2FzIGV4dGVuZGVkIHRvIGRlYWwgd2l0aCBDT05ORUNUIGluIG9yZGVyIHRvIG1ha2UgdGVzdAogIGNhc2UgNTAzIGRvIGdvb2QuCgotIEV2YW4gSm9yZGFuIHBvc3RlZCBidWcgcmVwb3J0ICM2NTA5ODkgYWJvdXQgYSBtZW1vcnkgbGVhayBpbiB0aGUgcHVibGljIGtleQogIHJldHJpZXZpbmcgY29kZS4gSGUgcHJvdmlkZWQgYSBzdWdnZXN0ZWQgZml4IGFuZCBJIG1lcmVseSBhcHBsaWVkIGl0IQoKLSBCdWcgcmVwb3J0ICM2NTA5NDEsIHBvc3RlZCBieSBDaHJpc3RvcGhlciBSLiBQYWxtZXIgaWRlbnRpZmllZCBhIHByb2JsZW0KICB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kIGdldHRpbmcgZmlsZTovLyBVUkxzLiBUaGlzIHdhcyBub3cgZml4ZWQgYW5kCiAgdGVzdCBjYXNlIDUwMiB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoaXMuCgpEYW5pZWwgKDEyIERlYykKLSBUZXN0IGNhc2UgNTAwIGFuZCA1MDEgYXJlIHRoZSBmaXJzdCBldmVyIGxpYmN1cmwgdGVzdCBjYXNlcyB0aGF0IHJ1bi4KCi0gTWFkZSAiY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIiBjdXQgb2ZmIGFsbCAtTyogb3B0aW9ucyB0byB0aGUgY29tcGlsZXIKCi0gRmluYWxseSBmaXhlZCB0aGUgdGVzdCBzdWl0ZSdzIGZ0cCBzZXJ2ZXIgc28gdGhhdCB0ZXN0IGNhc2UgNDAyIGRvZXNuJ3QKICBjYXVzZSB0aGUgZm9sbG93aW5nIHRlc3QgY2FzZSB0byBmYWlsIGFueW1vcmUhCgpEYW5pZWwgKDExIERlYykKLSBDVVJMX01BWF9XUklURV9TSVpFIGlzIG5vdyBkZWNyZWFzZWQgdG8gMTZLQiBzaW5jZSBpdCBtYWtlcyB0aGUgV2luZG93cwogIHZlcnNpb24gcGVyZm9ybSB1cGxvYWRzIG11Y2ggZmFzdGVyISEhIFJCcmFtYW50ZSBkaWQgbG90cyBvZiByZXNlYXJjaCBvbgogIHRoaXMgdG9waWMuCgotIEZpeGVkIHRoZSAjaW5jbHVkZSBpbiBjdXJsL2N1cmwuaCB0byBpbmNsdWRlIHRoZSBvdGhlciBmaWxlcyBvdXRzaWRlIHRoZQogIGV4dGVybiAiQyIgc2NvcGUuCgpEYW5pZWwgKDEwIERlYykKLSBNb3ZlZCBhcm91bmQgYW5kIGFkZGVkIG1vcmUgbG9naWM6CgogIEZpcnN0LCBQT1NUIGRhdGEgaXMgbmV2ZXIgc2VudCBhcyBwYXJ0IG9mIHRoZSByZXF1ZXN0IGhlYWRlcnMgaW4gdGhlIGh0dHAuYwogIGNvZGUuIEl0IGlzIGFsd2F5cyBzZW50IHRoZSAibm9ybWFsIiByZWFkIGNhbGxiYWNrIHRoZW4gc2VuZCgpIHdheS4gVGhpcyBub3cKICBlbmFibGVzIGEgcGxhaW4gSFRUUCBQT1NUIHRvIGJlIHNlbnQgY2h1bmtlZCBpZiB3ZSB3YW50IHRvLiBUaGlzIGFsc28KICByZWR1Y2VzIHRoZSByaXNrIG9mIGhhdmluZyB2ZXJ5IGJpZyBQT1NUcyBjYXVzaW5nIHByb2JsZW1zLgoKICBGdXJ0aGVyLCBzZW5kaW5nIG9mZiB0aGUgaW5pdGlhbCBIVFRQIHJlcXVlc3QgaXMgbm90IGRvbmUgdXNpbmcgYSBsb29wCiAgYW55bW9yZS4gSWYgaXQgd2Fzbid0IGFsbCBzZW50IG9mZiBpbiB0aGUgZmlyc3Qgc2VuZCgpLCB0aGUgcmVzdCBvZiB0aGUKICByZXF1ZXN0IGlzIHNlbnQgb2ZmIGluIHRoZSBub3JtYWwgdHJhbnNmZXIgc2VsZWN0KCkgbG9vcC4gVGhpcyBtYWtlcyBzZXZlcmFsCiAgdGhpbmdzIHBvc3NpYmxlLCBidXQgbWFpbmx5IGl0IG1ha2VzIGxpYmN1cmwgYmxvY2sgbGVzcyB3aGVuIHVzZWQgZnJvbSB0aGUKICBtdWx0aSBpbnRlcmZhY2UgYW5kIGl0IGFsc28gcmVkdWNlcyB0aGUgcmlzayBvZiBwcm9ibGVtcyB3aXRoIGlzc3VpbmcgdmVyeQogIGxhcmdlIHJlcXVlc3RzLgoKRGFuaWVsICg5IERlYykKLSBNb3ZlZCB0aGUgcmVhZCBjYWxsYmFjayBwb2ludGVyIGFuZCBkYXRhIHdpdGhpbiB0aGUgc3RydWN0cyB0byBhIG1vcmUKICBzdWl0YWJsZSBwbGFjZS4gVGhpcyBpbiBwcmVwYXJhdGlvbiBmb3IgYSBiZXR0ZXIgSFRUUC1yZXF1ZXN0IHNlbmRpbmcgY29kZQogIHdpdGhvdXQgKGEgc2lsbHkpIGxvb3AuCgotIFRoZSBEb2RkcyBmaXggc2VlbXMgbm90IHRvIHdvcmsuCgotIFZvanRlY2ggSmFub3RhIHRlc3RzIHByb3ZlZCB0aGF0IHRoZSByZXNvbHZlIGZpeCBmcm9tIG9jdCAyMXN0IGlzIG5vdCBnb29kCiAgZW5vdWdoIHNpbmNlIG9idmlvdXNseSBvbGRlciBnbGliY3MgbWlnaHQgcmV0dXJuIEVBR0FJTiB3aXRob3V0IHRoaXMgbWVhbmluZwogIHRoYXQgdGhlIGJ1ZmZlciB3YXMgdG9vIHNtYWxsLgoKLSBbdGhlIG90aGVyIGRheV0gTWFkZSBsaWJjdXJsIGxvb3Agb24gcmVjdigpIGFuZCBzZW5kKCkgbm93IHVudGlsIGRvbmUsIGFuZAogIHRoZW4gZ2V0IGJhY2sgdG8gc2VsZWN0KCkuIFByZXZpb3VzbHkgaXQgd2VudCBiYWNrIHRvIHNlbGVjdCgpIG1vcmUgb2Z0ZW4KICB3aGljaCByZWFsbHkgd2FzIGEgc2xpZ2h0IG92ZXJoZWFkLiBUaGlzIHdhcyBkdWUgdG8gdGhlIHJlcG9ydGVkIHBlcmZvcm1hbmNlCiAgcHJvYmxlbXMgb24gSFRUUCBQVVQgb24gV2luZG93cy4gSSBjb3VsZG4ndCBzZWUgYW55IG5vdGFibGUgZGlmZmVyZW5jZSBvbgogIExpbnV4Li4uCgpWZXJzaW9uIDcuMTAuMy1wcmUyICg0IERlYyAyMDAyKQoKRGFuaWVsICg0IERlYyAyMDAyKQotIExvdHMgb2Ygd29yayB3aXRoIE1hbGNvbG0gRG9kZHMgbWFkZSBtZSBhZGQgYSB0ZW1wb3JhcnkgY29kZSBmaXggdGhhdCBub3cKICBzaG9ydGVucyB0aGUgdGltZW91dCB3YWl0aW5nIGZvciB0aGUgMjI2IG9yIDI1MCBsaW5lIGFmdGVyIGEgY29tcGxldGVkCiAgRlRQIHRyYW5zZmVyLgoKICBJZiBubyBkYXRhIGlzIHJlY2VpdmVkIHdpdGhpbiA2MCBzZWNvbmRzLCB0aGlzIGlzIHRha2VuIGFzIGEgc2lnbiBvZiBhIGRlYWQKICBjb250cm9sIGNvbm5lY3Rpb24gYW5kIHdlIGJhaWwgb3V0LgoKRGFuaWVsICgzIERlYyAyMDAyKQotIFJhbHBoJ3MgYnVnIHJlcG9ydCAjNjQ0ODQxIGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIHdoaWNoIGN1cmwgcmV0dXJuZWQgYQogIHRpbWVvdXQgZXJyb3IgY29kZSB3aGVuIGluIGZhY3QgdGhlIHByb2JsZW0gd2FzIG5vdCBhIHRpbWVvdXQuIFRoZSBwcm9wZXIKICBlcnJvciBzaG91bGQgbm93IGJlIHByb3BhZ2F0ZWQgYmV0dGVyIHdoZW4gdGhleSdyZSBkZXRlY3RlZCBpbiB0aGUgRlRQCiAgcmVzcG9uc2UgcmVhZGluZyBmdW5jdGlvbi4KCi0gVXBkYXRlZCB0aGUgQm9ybGFuZCBNYWtlZmlsZXMuCgpEYW5pZWwgKDIgRGVjIDIwMDIpCi0gTmljb2xhcyBCZXJsb3F1aW4gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IGludHJvZHVjZWQgLS1jcmVhdGUtZGlycyB0byB0aGUKICBjb21tYW5kIGxpbmUgdG9vbC4gV2hlbiB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGggLW8sIGl0IGxldHMgY3VybCBjcmVhdGUKICBbbm9uLWV4aXN0aW5nXSBkaXJlY3RvcmllcyB1c2VkIGluIC1vLCBzdWl0YWJseSB1c2VkIHdpdGggIy1jb21iaW5hdGlvbnMKICBzdWNoIGFzOgoKICAgICBjdXJsICJ3d3cuaW1hZ2VzLmNvbS97Zmxvd2VycyxjaXRpZXMscGFya3MsbW91bnRhaW5zfS9waWNfWzEtMTAwXS5qcGcgXAogICAgICAgLW8gImRpcl8jMS9waWMjMi5qcGciIC0tY3JlYXRlLWRpcnMKClZlcnNpb24gNy4xMC4zLXByZTEKCkRhbmllbCAoMjggTm92IDIwMDIpCi0gSSB2aXNpdGVkIExhcnMgTm9yZGdyZW4gYW5kIGhhZCBhIGdvIHdpdGggaGlzIHByb2JsZW0sIHdoaWNoIGxlYWQgbWUgdG8KICBpbXBsZW1lbnQgdGhpcyBmaXguIElmIGxpYmN1cmwgZGV0ZWN0cyB0aGUgYWRkZWQgY3VzdG9tIGhlYWRlcgogICJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZCIsIGl0IHdpbGwgbm93IGVuYWJsZSBhIGNodW5rZWQgdHJhbnNmZXIuCgogIEFsc28sIGNodW5rZWQgdHJhbnNmZXIgZGlkbid0IHF1aXRlIHdvcmsgYmVmb3JlIGJ1dCBzZWVtcyB0byBkbyBzbyBub3cuCgotIEtqZXRpbCBKYWNvYnNlbiBwb2ludGVkIG91dCB0aGF0IC4vY29uZmlndXJlIC0tZGlzYWJsZS1pcHY2IC0td2l0aG91dC16bGliCiAgZGlkbid0IHdvcmsgb24gYW55IHBsYXRmb3JtLi4uCgpEYW5pZWwgKDI2IE5vdiAyMDAyKQotIEZpeGVkIGEgYmFkIGFkZHJpbmZvIGZyZWUgaW4gdGhlIGhvc3RpcC5jIGNvZGUsIGhhcmRseSBleHBvc2VkIGFueXdoZXJlCgotIERhbiBCZWNrZXIgZm91bmQgYW5kIGZpeGVkIGEgbWlub3IgbWVtb3J5IGxlYWsgb24gcGVyc2lzdGVudCBjb25ubmVjdGlvbnMKICB1c2luZyBDVVJMT1BUX1VTRVJQV0QuCgpEYW5pZWwgKDIyIE5vdiAyMDAyKQotIEJhc2VkIG9uIFJhbHBoIE1pdGNoZWxsJ3MgZXhjZWxsZW50IGFuYWx5c2lzIEkgZm91bmQgYSBidWcgaW4gdGhlIHRlc3Qgc3VpdGUKICB3ZWIgc2VydmVyIChzd3MpIHdoaWNoIG5vdyBsZXRzIHRlc3QgY2FzZSAzMDYgcnVuIGZpbmUgZXZlbiBpbiBjb21iaW5hdGlvbgogIHdpdGggdGhlIG90aGVyIHRlc3QgY2FzZXMuCgotIEp1YW4gSWduYWNpbyBIZXJ24XMgZm91bmQgYSBjcmFzaCBpbiB0aGUgdmVyYm9zZSBjb25uZWN0IG1lc3NhZ2UgdGhhdCBpcwogIHVzZWQgb24gcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gVGhpcyBidWcgd2FzIGFkZGVkIGluIDcuMTAuMiBkdWUgdG8gdGhlCiAgcmVhcnJhbmdlZCBuYW1lIHJlc29sdmUgY29kZS4KCkRhbmllbCAoMjAgTm92IDIwMDIpCi0gS2pldGlsIEphY29ic2VuIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzOgoKICAgQ1VSTE9QVF9QUklWQVRFIHN0b3JlcyBhIHByaXZhdGUgcG9pbnRlciBpbiB0aGUgY3VybCBoYW5kbGUuCgogICBDVVJMSU5GT19QUklWQVRFIHJldHJpZXZlcyB0aGUgcHJpdmF0ZSBwb2ludGVyIGZyb20gdGhlIGN1cmwgaGFuZGxlLgoKLSBLYXJvbCBQaWV0cnphayBwb2ludGVkIG91dCBob3cgY3VybC1jb25maWcgLS1jZmxhZ3MgZGlkbid0IG91dHB1dCBhIGdvb2QKICBpbmNsdWRlIGRpciBzbyBJJ3ZlIHJlbW92ZWQgdGhhdCBmb3Igbm93LgoKVmVyc2lvbiA3LjEwLjIgKDE4IE5vdiAyMDAyKQoKRGFuaWVsICgxMSBOb3YgMjAwMikKLSBEYXZlIEhhbGJha2tlbiBhZGRlZCBjdXJsX3ZlcnNpb25faW5mbyB0byBsaWIvbGliY3VybC5kZWYgdG8gbWFrZSBsaWJjdXJsCiAgcHJvcGVybHkgYnVpbGQgd2l0aCBNU1ZDIG9uIFdpbmRvd3MuCgpEYW5pZWwgKDggTm92IDIwMDIpCi0gRG9pbmcgSFRUUCBQVVQgd2l0aG91dCBhIHNwZWNpZmllZCBmaWxlIHNpemUgbm93IG1ha2VzIGxpYmN1cmwgdXNlCiAgVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQuCgpEYW5pZWwgKDcgTm92IDIwMDIpCi0gQnVnIHJlcG9ydCAjNjM0NjI1IGlkZW50aWZpZWQgaG93IGN1cmwgcmV0dXJuZWQgdGltZW91dCBpbW1lZGlhdGVseSB3aGVuCiAgQ1VSTE9QVF9DT05ORUNUVElNRU9VVCB3YXMgdXNlZCBhbmQgcHJvdmlkZWQgYSBmaXguCgpWZXJzaW9uIDcuMTAuMi1wcmU0ICg2IE5vdiAyMDAyKQoKRGFuaWVsICg1IE5vdiAyMDAyKQotIExlaGVsIEJlcm5hZHQgZm91bmQgb3V0IGFuZCBmaXhlZC4gbGliY3VybCBzZW50IGVycm9yIG1lc3NhZ2UgdG8gdGhlIGRlYnVnCiAgb3V0cHV0IHdoZW4gaXQgc3RvcmVkIHRoZSBlcnJvciBtZXNzYWdlLgoKLSBBdmVyeSBGYXkgZm91bmQgc29tZSBwcm9ibGVtcyB3aXRoIHRoZSBETlMgY2FjaGUgKHdoZW4gdGhlIGNhY2hlIHRpbWUgd2FzCiAgc2V0IHRvIDAgd2UgZ290IGEgbWVtb3J5IGxlYWssIGJ1dCB3aGVuIHRoZSBsZWFrIHdhcyBmaXhlZCBoZSBnb3QgYSBjcmFzaAogIHdoZW4gaGUgdXNlZCB0aGUgQ1VSTE9QVF9JTlRFUkZBQ0Ugd2l0aCB0aGF0KSB0aGF0IGhhZCBtZSBkbyBzb21lIHJlYWwKICByZXN0cnVjdHVyaW5nIHNvIHRoYXQgd2Ugbm93IGhhdmUgYSByZWZlcmVuY2UgY291bnRlciBpbiB0aGUgZG5zIGNhY2hlCiAgZW50cmllcyB0byBwcmV2ZW50IGFuIGVudHJ5IHRvIGdldCBmbHVzaGVkIHdoaWxlIHN0aWxsIGFjdHVhbGx5IGluIHVzZS4KCiAgSSBhbHNvIGRldGVjdGVkIHRoYXQgd2UgcHJldmlvdXNseSBkaWRuJ3QgdXBkYXRlIHRoZSB0aW1lIHN0YW1wIHdoZW4gd2UKICBleHRyYWN0ZWQgYW4gZW50cnkgZnJvbSB0aGUgY2FjaGUgc28gdGhhdCBtdXN0J3ZlIGJlZW4gYSByZWFzb24gZm9yIHNvbWUKICB2ZXJ5IHdlaXJkIGRucyBjYWNoZSBidWdzLgoKVmVyc2lvbiA3LjEwLjItcHJlMwoKRGFuaWVsICgzMSBPY3QgMjAwMikKLSBEb3duZ3JhZGVkIGF1dG9tYWtlIHRvIDEuNi4zIGluIGFuIGF0dGVtcHQgdG8gZml4IGN5Z3dpbiBwcm9ibGVtcy4gKEl0CiAgdHVybmVkIG91dCB0aGlzIGRpZG4ndCBoZWxwIHRob3VnaC4pCgotIERpc2FibGUgdGhlIEROUyBjYWNoZSAoYnkgc2V0dGluZyB0aGUgdGltZW91dCB0byAwKSBtYWRlIGxpYmN1cmwgbGVhawogIG1lbW9yeS4gQXZlcnkgRmF5IGJyb3VnaHQgdGhlIGV4YW1wbGUgY29kZSB0aGF0IHByb3ZlZCB0aGlzLgoKVmVyc2lvbiA3LjEwLjItcHJlMgoKRGFuaWVsICgyOCBPY3QgMjAwMikKLSBVcGdyYWRlZCB0byBhdXRvY29uZiAyLjU0IGFuZCBhdXRvbWFrZSAxLjcgb24gdGhlIHJlbGVhc2UtYnVpbGQgaG9zdC4KCi0gS2V2aW4gUm90aCBtYWRlIHRoZSBjb21tYW5kIGxpbmUgdG9vbCBjaGVjayBmb3IgYSBDVVJMX0NBX0JVTkRMRSBlbnZpcm9ubWVudAogIHZhcmlhYmxlIChpZiAtLWNhY2VydCBpc24ndCB1c2VkKSBhbmQgaWYgbm90IHNldCwgdGhlIFdpbmRvd3MgdmVyc2lvbiB3aWxsCiAgY2hlY2sgZm9yIGEgZmlsZSBuYW1lZCAiY3VybC1jYS1idW5kbGUuY3J0IiBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb3IgdGhlCiAgZGlyZWN0b3J5IHdoZXJlIGN1cmwgaXMgbG9jYXRlZC4gVGhhdCBmaWxlIGlzIHRoZW4gdXNlZCBhcyBDQSByb290IGNlcnQKICBidW5kbGUuCgotIEF2ZXJ5IEZheSBwb2ludGVkIG91dCB0aGF0IGN1cmwncyBjb25maWd1cmUgc2NyaXAgZGlkbid0IGdldCByaWdodCBpZiB5b3UKICB1c2VkIGF1dG9jb25mIG5ld2VyIHRoYW4gMi41Mi4gVGhpcyB3YXMgZHVlIHRvIHNvbWUgYmFkbHkgcXVvdGVkIGNvZGUuCgpWZXJzaW9uIDcuMTAuMi1wcmUxCgpEYW5pZWwgKDIzIE9jdCAyMDAyKQotIEVtaWxpYW5vIElkYSBjb25maXJtZWQgdGhhdCB3ZSBub3cgYnVpbGQgcHJvcGVybHkgd2l0aCB0aGUgQm9ybGFuZCBDKysKICBjb21waWxlciB0b28uIFdlIG5lZWRlZCB5ZXQgYW5vdGhlciBmaXggZm9yIHRoZSBJU08gY3BwIGNoZWNrIGluIHRoZSBjdXJsLmgKICBoZWFkZXIgZmlsZS4KCi0gWWV0IGFub3RoZXIgZml4IHdhcyBuZWVkZWQgdG8gZ2V0IHRoZSBIVFRQIGRvd25sb2FkIHdpdGhvdXQgaGVhZGVycyB0byB3b3JrLgogIFRoaXMgdGltZSBpdCB3YXMgbmVlZGVkIGlmIHRoZSBmaXJzdCAiYmVsaWV2ZWQgaGVhZGVyIiB3YXMgcmVhZCBhbGwgaW4gdGhlCiAgZmlyc3QgcmVhZC4gVGVzdCAzMDYgaGFzIG5vdCBydW4gcHJvcGVybHkgc2luY2UgdGhlIDExdGggb2N0b2JlciBmaXguCgpEYW5pZWwgKDIxIE9jdCAyMDAyKQotIFp2aSBIYXInRWwgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIHdpdGggY3VybCdzIG5hbWUgcmVzb2x2aW5nIG9uIFJlZGhhdCA4CiAgbWFjaGluZXMgKHJ1bm5pbmcgSVB2NiBkaXNhYmxlZCkuIE1hdHMgTGlkZWxsIGxldCBtZSB1c2UgYW4gYWNjb3VudCBvbiBoaXMKICBtYWNoaW5lIGFuZCBJIGNvdWxkIHZlcmlmeSB0aGF0IGdldGhvc3RieW5hbWVfcigpIGhhcyBiZWVuIGNoYW5nZWQgdG8gcmV0dXJuCiAgRUFHQUlOIGluc3RlYWQgb2YgRVJBTkdFIHdoZW4gdGhlIGdpdmVuIGJ1ZmZlciBzaXplIGlzIHRvbyBzbWFsbC4gVGhpcyBpcwogIGdsaWJjIDIuMi45My4KCi0gQWxiZXJ0IENoaW4gaGVscGVkIG1lIGdldCB0aGUgLW5vLXVuZGVmaW5lZCBvcHRpb24gY29ycmVjdGVkIGluCiAgbGliL01ha2VmaWxlLmFtIHNpbmNlIEN5Z3dpbiBidWlsZHMgd2FudCBpdCB0aGVyZSB3aGlsZSBTb2xhcmlzIGJ1aWxkcyBkb24ndAogIHdhbnQgaXQgcHJlc2VudC4gS2V2aW4gUm90aCBoZWxwZWQgbWUgdHJ5IGl0IG91dCBvbiBjeWd3aW4uCiAgCi0gTmlraXRhIFNjaG1pZHQgcHJvdmlkZWQgYSBidWcgZml4IGZvciBhIEZPTExPV0xPQ0FUSU9OIGJ1ZyBpbnRyb2R1Y2VkIHdoZW4KICB0aGUgLi4vIHN1cHBvcnQgZ290IGluICg3LjEwLjEpLgoKRGFuaWVsICgxOCBPY3QgMjAwMikKLSBGYWJyaXppbyBBbW1vbGxvIHBvaW50ZWQgb3V0IGEgcmVtYWluaW5nIHByb2JsZW0gd2l0aCBGT0xMT1dMT0NBVElPTiBpbgogIHRoZSBtdWx0aSBpbnRlcmZhY2UuCgpEYW5pZWwgKDE3IE9jdCAyMDAyKQotIFJpY2hhcmQgQ29vcGVyJ3MgZXhwZXJpbWVudGluZyBwcm92ZWQgdGhhdCAtaiAoQ1VSTE9QVF9DT09LSUVTRVNTSU9OKSBkaWRuJ3QKICB3b3JrIHF1aXRlIGFzIHN1cHBvc2VkLiBZb3UgbmVlZGVkIHRvIHNldCBpdCAqYmVmb3JlKiB5b3UgdXNlCiAgQ1VSTE9QVF9DT09LSUVGSUxFLCBhbmQgd2UgZG9udCcgd2FudCB0aGF0IGtpbmQgb2YgZGVwZW5kZW5jaWVzLgoKRGFuaWVsICgxNSBPY3QgMjAwMikKLSBBbmRy6XMgR2FyY+1hIHByb3ZpZGVkIGNvcnJlY3Rpb25zIGZvciBlcnJhdGFzIGluIGZvdXIgbGliY3VybCBtYW4gcGFnZXMuCgpEYW5pZWwgKDEzIE9jdCAyMDAyKQotIFN0YXJ0aW5nIG5vdywgd2UgZ2VuZXJhdGUgYW5kIGluY2x1ZGUgUERGIHZlcnNpb25zIG9mIGFsbCB0aGUgZG9jcyBpbiB0aGUKICByZWxlYXNlIGFyY2hpdmVzLgoKRGFuaWVsICgxMiBPY3QgMjAwMikKLSBUcnlpbmcgdG8gY29ubmVjdCB0byBhIGhvc3Qgb24gYSBiYWQgcG9ydCBudW1iZXIgY2F1c2VkIHRoZSBtdWx0aSBpbnRlcmZhY2UKICB0byBuZXZlciByZXR1cm4gZmFpbHVyZSBhbmQgaXQgYXBwZWFyZWQgdG8ga2VlcCBvbiB0cnlpbmcgZm9yZXZlciAoaXQganVzdAogIGRpZG4ndCBkbyBhbnl0aGluZykuCgpEYW5pZWwgKDExIE9jdCAyMDAyKQotIERvd25sb2FkaW5nIEhUVFAgd2l0aG91dCBoZWFkZXJzIGRpZG4ndCB3b3JrIDEwMCUsIHNvbWUgb2YgdGhlIGluaXRpYWwgZGF0YQogIGdvdCB3cml0dGVuIHR3aWNlLiBLZXZpbiBSb3RoIHJlcG9ydGVkLgoKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGUgImNvbmZpZyBmaWxlIiBwYXJzZXIgaW4gdGhlIGNsaWVudCBjb2RlIGNvdWxkCiAgc2VnZmF1bHQsIGxpa2UgaWYgRE9TIG5ld2xpbmVzIHdlcmUgdXNlZC4KClZlcnNpb24gNy4xMC4xICgxMSBPY3QgMjAwMikKCkRhbmllbCAoMTAgT2N0IDIwMDIpCi0gSmVmZiBMYXdzb24gZml4ZWQgYSBmZXcgcHJvYmxlbXMgd2l0aCBjb25uZWN0aW9uIHJlLXVzZSB0aGF0IHJlbWFpbmVkIHdoZW4KICB5b3Ugc2V0IENVUkxPUFRfUFJPWFkgdG8gIiIuCgpEYW5pZWwgKDkgT2N0IDIwMDIpCi0gQ3JhaWcgRGF2aXNvbiBmb3VuZCBhIHRlcnJpYmxlIGZsYXcgYW5kIENyaXMgQmFpbGlmZiBoZWxwZWQgb3V0IGluIHRoZQogIHNlYXJjaC4gR2V0dGluZyBIVFRQIGRhdGEgZnJvbSBzZXJ2ZXJzIHdoZW4gdGhlIGhlYWRlcnMgYXJlIHNwbGl0IHVwIGluCiAgbXVsdGlwbGUgcmVhZHMsIGNvdWxkIGNhdXNlIGp1bmsgZGF0YSB0byBnZXQgaW5zZXJ0ZWQgYW1vbmcgdGhlIHNhdmVkCiAgaGVhZGVycy4gVGhpcyBvbmx5IGNvbmNlcm5zIEhUVFAoUykgaGVhZGVycy4KCkRhbmllbCAoOCBPY3QgMjAwMikKLSBWaW5jZW50IFBlbnF1ZXJjJ2ggZ2F2ZSB1cyB0aGUgZ29vZCBzdWdnZXN0aW9uIHRoYXQgd2hlbiB0aGUgRVJSUk9SQlVGRkVSCiAgaXMgc2V0IGludGVybmFsbHksIHRoZSBlcnJvciB0ZXh0IGlzIHNlbnQgdG8gdGhlIGRlYnVnIGZ1bmN0aW9uIGFzIHdlbGwuCgotIEkgZml4ZWQgdGhlIHRlbG5ldCBjb2RlIHRvIHRpbWVvdXQgcHJvcGVybHkgYXMgdGhlIG9wdGlvbiB0ZWxscyBpdCB0by4gT24KICBub24td2luZG93cyBwbGF0Zm9ybXMuCgpEYW5pZWwgKDcgT2N0IDIwMDIpCi0gSm9obiBDcm93IHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybC10aGUtZ3VpZGUgd2Fzbid0IGluY2x1ZGVkIGluIHRoZSByZWxlYXNlCiAgdGFyYmFsbCEKCi0gS2V2aW4gUm90aCBwb2ludGVkIG91dCB0aGF0IG1ha2UgaW5zdGFsbCBkaWRuJ3QgZG8gcmlnaHQgaWYgYnVpbGQgb3V0c2lkZQogIHRoZSBzb3VyY2UgdHJlZSAoY2EtYnVuZGxlIHdpc2UpLgoKLSBGT0xMT1dMT0NBVElPTiBidWdmaXggZm9yIHRoZSBtdWx0aSBpbnRlcmZhY2UKCkRhbmllbCAoNCBPY3QgMjAwMikKLSBLZXZpbiBSb3RoIGdvdCBwcm9ibGVtcyB3aXRoIGhpcyBjeWd3aW4gYnVpbGQgd2l0aCAtbm8tdW5kZWZpbmVkIHdhcyBub3QKICBwcmVzZW50IGluIGxpYi9NYWtlZmlsZS5hbSBzbyBJIHB1dCBpdCBiYWNrIGluIHRoZXJlIGFnYWluLiBUaGUgcG9vciBvbmUgd2hvCiAgbmVlZHMgdG8gcmVtb3ZlIGl0IGFnYWluIG11c3Qgd3JpdGUgYSBjb25maWd1cmUgc2NyaXB0IHRvIGRldGVjdCB0aGF0IG5lZWQuCgotIFJhbHBoIE1pdGNoZWxsIHBvaW50ZWQgb3V0IHRoYXQgY3VybCB3YXMgYSBiaXQgbmFpdmUgYW5kIGRpZG4ndCBkZWFsIHdpdGggLi8KICBvciAuLi8gc3R1ZmYgaW4gdGhlIHN0cmluZyBwYXNzZWQgYmFjayBpbiBhIExvY2F0aW9uOiBoZWFkZXIgd2hlbiBmb2xsb3dpbmcKICBsb2NhdGlvbnMuCgotIEFsYmVydCBDaGluIGhlbHBlZCBtZSB0byB3b3JrIG91dCBhIGJldHRlciBjb25maWd1cmUuaW4gY2hlY2sgZm9yIHpsaWIsIGFuZAogIGJvdGggLS13aXRob3V0LXpsaWIgYW5kIC13aXRoLXpsaWIgc2VlbSB0byB3b3JrIHJhdGhlciB3ZWxsIHJpZ2h0IG5vdy4KCi0gWnZpIEhhcidFbCBpbXByb3ZpZWQgdGhlIE9wZW5TU0wgRU5HSU5FIGNoZWNrIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvCiAgYmVjb21lIG1vcmUgYWNjdXJhdGUuCgpEYW5pZWwgKDEgT2N0IDIwMDIpCi0gRGV0bGVmIFNjaG1pZXIgcG9pbnRlZCBvdXQgdGhlIGxhY2sgb2YgYSAtLXdpdGhvdXQtbGlieiBvcHRpb24gdG8gY29uZmlndXJlLAogIHNvIEkgYWRkZWQgb25lLgoKVmVyc2lvbiA3LjEwICgxIE9jdCAyMDAyKQoKRGFuaWVsICgzMCBTZXAgMjAwMikKLSBNb2RpZmllZCB0aGUgY3VybF92ZXJzaW9uX2luZm8oKSBwcm90byBhbmQgcmV0dXJuZWQgc3RydWN0IG9uY2UgYWdhaW4sIGFuZAogIHVwZGF0ZWQgdGhlIG1hbiBwYWdlIGFjY29yZGluZ2x5LgoKLSBDcmlzIEJhaWxpZmYgZm91bmQgb3V0IHRoYXQgdGhlIHByZS1yZWxlYXNlcyBjcmFzaGVkIG9uIG5hbWUgbG9va3VwcyBvbgogIG5hbWVzIHN1Y2ggYXMgImE6IiBvciAiYmF6OiIgKG9uIExpbnV4IHZlcnNpb25zIG5vdCBiZWluZyBpcHY2LWVuYWJsZWQpIGR1ZQogIHRvIHNvbWUgd2VpcmQgcmV0dXJuIGNvZGVzIGZyb20gZ2V0aG9zdGJ5bmFtZV9yKCkuIEknbGwgYmxhbWUgdGhlIGNvbXBsZXRlCiAgbGFjayBvZiBkb2NzIGluIHRoYXQgZGVwYXJ0bWVudC4gQ3JpcyBwcm92aWRlZCBhIGZpeCwgd2hpY2ggSSBtb2RpZmllZCBvbmx5CiAgc2xpZ2h0bHkuCgpEYW5pZWwgKDI3IFNlcCAyMDAyKQotIEFmdGVyIGEgc3VnZ2VzdGlvbiBmcm9tIENocmlzdGlhbiBLdXJ6IHRvIERlYmlhbiBjdXJsIHBhY2thZ2UgbWFpbnRhaW5lcgogIERvbWVuaWNvIEFuZHJlb2xpLCBJIG1hZGUgaXQgcG9zc2libGUgdG8gb3ZlcnJpZGUgdGhlIHByb3h5IGVudmlyb25tZW50CiAgdmFyaWFibGVzIGJldHRlci4gTm93LCBieSBzZXR0aW5nIC14ICIiIHlvdSBjYW4gZXhwbGljaXRseSB0ZWxsIGxpYmN1cmwgdG8KICBub3QgdXNlIGEgcHJveHksIG5vIG1hdHRlciB3aGFuIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2F5LgoKVmVyc2lvbiA3LjEwLXByZTQKCkRhbmllbCAoMjYgU2VwIDIwMDIpCi0gRXh0ZW5kZWQgY3VybF92ZXJzaW9uX2luZm8oKSBtb3JlIGFuZCB3cm90ZSBhIG1hbiBwYWdlIGZvciBpdC4KCkRhbmllbCAoMjUgU2VwIDIwMDIpCi0gbGliY3VybCBjb3VsZCBsZWFrIG1lbW9yeSB3aGVuIGRvd25sb2FkaW5nIG11bHRpcGxlIGZpbGVzIHVzaW5nIGh0dHAgcmFuZ2VzLAogIHJlcG9ydGVkIGFuZCBmaXhlZCBieSBKZWFuLUx1YyBHdWV2ZWwuCgotIFdhbHRlciBKLiBNYWNrIHByb3ZpZGVkIGNvZGUgYW5kIGRvY3MgZm9yIHRoZSBuZXcgY3VybF9mcmVlKCkgZnVuY3Rpb24gdGhhdAogIHNoYWxsIGJlIHVzZWQgdG8gZnJlZSBtZW1vcnkgdGhhdCBpcyBhbGxvY2F0ZWQgYnkgbGliY3VybCBhbmQgcmV0dXJuZWQgYmFjawogIHRvIHRoZSBhcHBsaWNhdGlvbiwgYXMgY3VybF9lc2NhcGUoKSBhbmQgY3VybF91bmVzY2FwZSgpIGRvLgoKLSBZYXJyYW0gU3VuaWwgcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2hlcmUgYSBmYWlsZWQKICBjb25uZWN0aW9uIGRpZG4ndCBjbG9zZSBkb3duIHByb3Blcmx5IGFuZCB0aHVzIGEgc2Vjb25kIHRyYW5zZmVyIHVzaW5nIHRoZQogIHNhbWUgaGFuZGxlIGZhaWxlZC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCBhIGZsYXcgdGhhdCBtYWRlIChhbW9uZyBvdGhlciB0aGluZ3MpIGRpY3QtZmV0Y2hlcwogIHJldHVybiBhIHJhbmRvbSB2YWx1ZS4KCkRhbmllbCAoMjQgU2VwIDIwMDIpCi0gV2V6IEZ1cmxvbmcgYnJvdWdodCBoaXMgaW5pdGlhbCBwYXRjaCB0aGF0IGludHJvZHVjZWQgY3VybF92ZXJzaW9uX2luZm8oKS4KICBXZSBtaWdodCBuZWVkIHRvIHR3ZWFrIGl0IHNvbWV3aGF0IGJlZm9yZSByZWxlYXNlLgoKRGFuaWVsICgyMCBTZXAgMjAwMikKLSBDcmFpZyBNYXJrd2FyZHQgZml4ZWQgYW5vdGhlciBUcnU2NCBJUCByZXNvbHZlIHByb2JsZW0uCgpEYW5pZWwgKDE5IFNlcCAyMDAyKQotIERvbGJuZWZmIEEuViBhbmQgU3Bpcmlkb25vZmYgQS5WIG1hZGUgdGhlIGZpbGU6Ly8gY29kZSB3b3JrIHdpdGggcmVzdW1lcwogIGluIHRoZSBzYW1lIHN0eWxlIG90aGVyIGNvZGUgZG9lcy4KCi0gSWxndWl6IExhdHlwb3YgZml4ZWQgYSBmbGF3IGluIHRoZSBjbGllbnQgY29kZSB3aGVuIGZldGNoaW5nIG11bHRpcGxlIFVSTHMKICBhbmQgLUMgLSB3YXMgdXNlZC4gVGhlIGZpcnN0IGZpbGUncyByZXN1bWUgcG9zaXRpb24gd2FzIHRoZW4gYWNjaWRlbnRhbGx5CiAgcmV1c2VkIG9uIGFsbCB0aGUgb3RoZXIgZmlsZXMgdG9vLgoKRGFuaWVsICgxOCBTZXAgMjAwMikKLSBUaGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlIHdhcyBncmVhdGx5IG1vZGlmaWVkIGFuZCB0aGUgb3B0aW9ucyBoYXZlCiAgbm93IGJlZW4gZ3JvdXBlZCBpbiBsb2dpY2FsIGdyb3VwcyBzbyB0aGF0IGl0IHNob3VsZCBiZSBzb21ld2hhdCBlYXNpZXIgdG8KICByZWFkIGl0IGFuZCBmaW5kIHRoaW5ncyB5b3Ugc2VhcmNoIGZvci4KCkRhbmllbCAoMTMgU2VwIDIwMDIpCi0gS2V2aW4gUm90aCBwaW5wb2ludGVkIGEgc2NhcnkgZmxhdyBpbiBsaWJjdXJsLCB3aGVuIHRoZSBIVFRQIHNlcnZlciBkb2Vzbid0CiAgc2VuZCBhbnkgaGVhZGVycyBiYWNrLCBvbmx5IHJhdyBjb250ZW50LiBSaWdodCwgdGhhdCBpcyBhIHZpb2xhdGlvbiBvZiB0aGUKICBzdGFuZGFyZCBidXQgc3RpbGwgaGFwcGVucyBhdCB0aW1lcyBhbmQgd2UgbmVlZCB0byBkZWFsIHdpdGggaXQuIFRlc3QgY2FzZQogIDMwNiB3YXMgYWRkZWQgdG8gdmVyaWZ5IHRoYXQgd2UgZG8gcmlnaHQgbm93LgoKVmVyc2lvbiA3LjEwLXByZTMKCkRhbmllbCAoMTEgU2VwIDIwMDIpCi0gTHVrYXN6IEN6ZWtpZXJkYSBmb3VuZCBvdXQgdGhhdCBjdXJsIGRpZG4ndCBzZW5kIGEgY29ycmVjdCBIVFRQIEhvc3Q6IGhlYWRlcgogIHdoZW4geW91IHNwZWNpZmllZCB0aGUgVVJMIHdpdGggYW4gSVB2NiBJUC1hZGRyZXNzLgoKRGFuaWVsICg0IFNlcCAyMDAyKQotIFN2ZW4gTmV1aGF1cyBtYWRlIC0tc2lsZW50IGJlaW5nIGFja25vd2xlZGdlZCBldmVuIHdoZW4gbXVsdGlwbGUgVVJMcwogIHdlcmUgdXNlZC4gSXQgdXNlZCB0byBvdXRwdXQgIlsxLzJdOiBodHRwOi8vaG9zdC9hLmh0bWwuZGUgLS0+IGEuaHRtbC5kIiBldGMKICBldmVuIHdoZW4gdG9sZCB0byBzaHV0IHVwLgoKRGFuaWVsICgzIFNlcCAyMDAyKQotIFVwZGF0ZWQgYWxsIHNvdXJjZSBjb2RlIGhlYWRlcnMgdG8gdXNlIE1JVC1saWNlbnNlIHJlZmVyZW5jZXMgb25seSwgYW5kCiAgcG9pbnQgdG8gdGhlIENPUFlJTkcgZmlsZSBhbmQgdGhlIGh0dHA6Ly9jdXJsLmhheHguc2UvZG9jcy9jb3B5cmlnaHQuaHRtbAogIFVSTC4gSSd2ZSBjdXQgb3V0IGFsbCByZWZlcmVuY2VzIHRvIE1QTCB0aGF0IEkgY291bGQgZmluZC4KCi0gQ29yZWN0ZWQgdGhlIG1ha2VmaWxlcyB0byBub3QgYWx3YXlzIHVzZSAtbHogd2hlbiBsaW5raW5nCgpWZXJzaW9uIDcuMTAtcHJlMgoKRGFuaWVsICgyIFNlcCAyMDAyKQotIEphbWVzIEdhbGxhZ2hlciBhZGRlZCBDb250ZW50LUVuY29kaW5nIHN1cHBvcnQgdG8gbGliY3VybCBzbyBub3cgY3VybCBhbmQKICBsaWJjdXJsLXVzaW5nIGFwcHMgY2FuIHJlcXVlc3QgY29tcHJlc3NlZCBjb250ZW50cyB1c2luZyB0aGUgJ2RlZmxhdGUnCiAgbWV0aG9kLiBTZWUgdGhlIHNwZWNpYWwgZmlsZSBsaWIvUkVBRE1FLmVuY29kaW5nIGZvciBkZXRhaWxzLgoKICBjdXJsIC0tY29tcHJlc3NlZCBpcyBub3cgdXNlZCB0byByZXF1ZXN0IGNvbXByZXNzZWQgY29udGVudHMuCgogIGN1cmwtY29uZmlnIC0tZmVhdHVyZSB3aWxsIGluY2x1ZGUgJ2xpYnonIGlmIHRoaXMgZmVhdHVyZSB3YXMgYXJvdW5kIHdoZW4KICB0aGUgbGlicmFyeSB3YXMgYnVpbHQuCgpEYW5pZWwgKDMwIEF1ZyAyMDAyKQotIEFwcGxpZWQgYW4gYW5vbnltb3VzIFNPQ0tTNS1wcm94eSBwYXRjaC4gTm90IHByb3Blcmx5IHdvcmtpbmcgaW4gYWxsCiAgc2l0dWF0aW9ucyB0aG91Z2gsIGFzIGFsbCBnZXRhZGRyaW5mbygpLXVzaW5nIGxpYmN1cmxzIHdpbGwgZmFpbCBvbiB0aGlzLgogIFRoaXMgaXMgYmVjYXVzZSBvZiB0aGUgc29tZXdoYXQgbmFpdmUgd2F5IHRoZSBjdXJyZW50IGNvZGUgdHJpZXMgdG8gZXh0cmFjdAogIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBwcm94eS4KCi0gRml4ZWQgdXAgdGhlIFNTTCBjZXJ0IGZpeGVzIGZyb20gdGhlIG90aGVyIGRheSBldmVuIG1vcmUgYWZ0ZXIgbW9yZSBpbnB1dHMKICBmcm9tIENyaXMuIEFkZGVkIHRocmVlIG5ldyBTU0wgZXJyb3IgY29kZXMgdG8gbWFrZSB0aGUKICBDVVJMRV9TU0xfQ09OTkVDVF9FUlJPUiBzbGlnaHRseSBsZXNzIG92ZXJsb2FkZWQuCgpEYW5pZWwgKDI3IEF1ZyAyMDAyKQotIEFmdGVyIGxvdHMgb2YgdGFsayB3aXRoIFRvbSBaZXJ1Y2hhLCBOaWNrIEdpbWJyb25lIGFuZCBDcmlzIEJhaWxpZmYgSQogIGRlY2lkZWQgdG8gdGFsayB0aGUgYm9sZCBwYXRoIGFuZCBJIG5vdyBtYWRlIGxpYmN1cmwgZG8gQ0EgY2VydGlmaWNhdGUKICB2ZXJpZmljYXRpb24gYnkgZGVmYXVsdC4gVGh1cyBsaWJyYXJ5IHVzZXJzIG5lZWQgdG8gZXhwbGljaXRseSB0dXJuIHRoaXMgb2ZmCiAgaWYgeW91IHdhbnQgdG8gY29ubmVjdCB0byBzaXRlcyB3aXRob3V0IHByb3BlciBjaGVja2luZy4gV2UgYWxzbyBpbnN0YWxsIGEKICBDQSBjZXJ0IGJ1bmRsZSBvbiAnbWFrZSBpbnN0YWxsJyBub3cuCgogIFRoZSBjdXJsIHRvb2wgbm93IHJlcXVpcmVzIHRoZSAtay8tLWluc2VjdXJlIG9wdGlvbiBpbiBvcmRlciB0byBhbGxvdwogIGNvbm5lY3Rpb25zIGFuZCBvcGVyYXRpb25zIG9uIFNTTCBzaXRlcyB0aGF0IGFyZW4ndCBwcm9wZXJseSB2ZXJpZmllZCB3aXRoCiAgLWNhZmlsZSBvciAtLWNhcGF0aC4KCiAgY3VybC1jb25maWcgLS1jYSBkaXNwbGF5cyB0aGUgYnVpbHQtaW4gcGF0aCB0byB0aGUgQ0EgY2VydCBidW5kbGUuCgpEYW5pZWwgKDI2IEF1ZyAyMDAyKQotIEFuZHJldyBGcmFuY2lzIGNsZWFuZWQgdXAgc29tZSBjb2RlIHRoYXQgbm93IGNvbXBpbGVzIGZpbmUgd2l0aG91dCB0aGUgbmVlZAogIGZvciB1Z2x5IE1TVkMgcHJhZ21hcy4KCi0gS2VpdGggTWFjRG9uYWxkIGZvdW5kIGEgbWlub3IgYnVnIGluIHNyYy9tYWluLmMgdGhhdCBtYWRlIGl0IGNsb3NlIHN0ZGluCiAgaW5zdGVhZCBvZiB0aGUgYWN0dWFsIGZpbGUgaGFuZGxlLiBJdCBzaG91bGRuJ3QgaGF2ZSByZXN1bHRlZCBpbiBtdWNoCiAgdHJvdWJsZSBhcyBtb3N0IG9wZXJhdGluZyBzeXN0ZW1zIGNsb3NlIGFsbCBmaWxlIGhhbmRsZXMgb24gcHJvY2VzcyBleGl0CiAgYW55d2F5LgoKRGFuaWVsICgyMiBBdWcgMjAwMikKLSBNYXJrdXMgT2Jlcmh1bWVyIHByb3ZpZGVkIHNvbWUgZG9jdW1lbnRhdGlvbiBmb3IgaGlzIHByZXZpb3VzbHkgcHJvdmlkZWQKICBDVVJMT1BUX05PU0lHTkFMIGZpeC4KCi0gUGF0Y2hlZCB0aGUgbGliL01ha2VmaWxlLmFtIHRvIGhvcGVmdWxseSBubyBsb25nZXIgY29tcGxhaW4gb24gdW5kZWZpbmVkCiAgc3ltYm9scyB0aGF0IHNlZW1lZCB0byBvY2N1ciBvbiBidWlsZHMgd2l0aCBzaGFyZWQgT3BlblNTTCBsaWJyYXJpZXMgb24KICBTb2xhcmlzIGxhdGVseS4uLgoKRGFuaWVsICgyMCBBdWcgMjAwMikKLSBGaXhlZCBjb21waWxlciB3YXJuaW5ncyBvbiBNU0NWKysgY29tcGlsZXMuIFdlJ3JlIGxvb2tpbmcgZm9yIGhlbHAgaGVyZToKICByZW1vdmUgdGhlIHByYWdtYXMgZnJvbSBsaWIvY29uZmlnLXdpbjMyLmggYW5kIGFkanVzdCB0aGUgc291cmNlcyB3aGVyZQogIHRoZSB3YXJuaW5ncyBvY2N1ci4gSGlkaW5nIHRoZW0gd2l0aCBwcmFnbWFzIGxpa2UgdGhpcyBpcyBub3QgdGhlIGNvcnJlY3QKICB3YXkgb2YgZGVhbGluZyB3aXRoIGNvbXBpbGVyIHdhcm5pbmdzLgoKRGFuaWVsICgxMyBBdWcgMjAwMikKLSBVbHJpY2ggWmFkb3cgbWFkZSB0aGUgZ2xvYmFsIGluY2x1ZGUgZmlsZXMgaW4gY3VybC8qIGluY2x1ZGUgdGhlbXNlbHZlcwogIHVzaW5nICJjdXJsLmgiIGluc3RlYWQgb2YgPGN1cmwvY3VybC5oPiB3aGljaCB0aHVzIGFsbG93cyBwZW9wbGUgdG8gbW9yZQogIGZyZWVseSBkZWNpZGUgaG93IHRvIGluY2x1ZGUgY3VybCBhbmQgaG93IHRvIHNldHVwIHRoZWlyIGluY2x1ZGUgcGF0aHMuCgotIFN0ZXJsaW5nIEh1Z2hlcyBhZGRlZCB0aGUgY3VybF9zaGFyZSogaW50ZXJmYWNlLCBzb21ld2hhdCBhcyBkaXNjdXNzZWQKICBwcmV2aW91c2x5LgoKLSBK9nJuIEhhcnRyb3RoIHBvaW50ZWQgb3V0IHRoYXQgcG9sbCgpIHdhcyB1c2VkIGluIHRoZSBwcmUxIHNvdXJjZSBjb2RlIGFuZAogIGl0IGlzbid0IHZlcnkgcG9ydGFibGUsIHNvIG5vdyBJIGNoZWNrIGZvciBpdCBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBhbmQKICB3b3JrIGFyb3VuZCBpdC4KClZlcnNpb24gNy45LjktcHJlMQoKRGFuaWVsICgxMiBBdWcgMjAwMikKLSBBcHBsaWVkIG15IGluaXRpYWwgdGFrZSBvbiBtYWtpbmcgdGhlIG11bHRpIHN0dWZmIG1vcmUgYXN5bmNocm9ub3VzLiBDb25uZWN0cwogIHNob3VsZCBub3cgcmV0dXJuIGJhY2sgd2l0aG91dCAiaGFuZ2luZyIgdW50aWwgaXQgaGFzIGNvbm5lY3RlZCBmb3IgcmVhbC4KICBUaGlzIHNob3VsZCBhbHNvIGJlIHRoZSBjYXNlIGZvciBGVFAtUEFTViBjb25uZWN0cy4KCkRhbmllbCAoOSBBdWcgMjAwMikKLSBBcHBsaWVkIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyJ3MgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIENVUkxPUFRfTk9TSUdOQUwsCiAgd2hpY2ggZWZmZWN0aXZlbHkgcHJldmVudHMgbGliY3VybCBmcm9tIGRvaW5nIGFueXRoaW5nIHRoYXQgbWF5IGNhdXNlCiAgc2lnbmFscyB0byBnZXQgc2VudC4gVGhpcyBpcyBiYXNpY2x5IGZvciBtdWx0aS10aHJlYWRlZCBhcHBsaWNhdGlvbnMgdGhhdAogIG5vdyBjYW4gdXNlIHRpbWVvdXRzIHByb3Blcmx5LCB3aXRob3V0IHJpc2tpbmcgYW55IHNpZ25hbHMgdG8gYnVyc3QgaW4gYW5kCiAgcnVpbiB0aGUgcGFydHkuCiAgCkRhbmllbCAoNSBBdWcgMjAwMikKLSBMdWthc3ogQ3pla2llcmRhIHJlcG9ydGVkIHRoYXQgUkZDMjczMi1zdHlsZSBsaXRlcmFsIElQdjYgYWRkcmVzc2VzIGRpZG4ndAogIHdvcmsuIFdoZW4gZGlkIHRoYXQgY29kZSB2YW5pc2g/IEFueXdheSwgaXQncyBiYWNrIGFnYWluIG5vdyBhbmQgc2VlbXMgdG8KICB3b3JrIQoKLSBKb25hdGFuIExhbmRlciBmb3VuZCBvdXQgdGhhdCBQT1NUaW5nIGFuIGVtcHR5IHN0cmluZyBkaWRuJ3Qgd29yayB3aXRoIHRoZQogIGNvbW1hbmQgbGluZSB0b29sLgoKRGFuaWVsICgzIEF1ZyAyMDAyKQotIEr2cm4gSGFydHJvdGggZml4ZWQgdGhlIGxpYmN1cmwuZGVmIGZpbGUgdG8gYnVpbGQgdGhlIHdpbmRvd3MgRExMIHdpdGgKICB0aGUgbXVsdGkgaW50ZXJmYWNlIGVuYWJsZWQuCgpEYW5pZWwgKDEgQXVnIDIwMDIpCi0gVGhlIGZ0cCBQT1JUIGNvbW1hbmQgbm93IHVzZXMgYSBiZXR0ZXIgZGVmYXVsdCBJUCBhZGRyZXNzLCBhcyBpdCB3aWxsCiAgZXh0cmFjdCBhbmQgdXNlIHRoZSBsb2NhbCBJUCBhZGRyZXNzIHVzZWQgYnkgdGhlIGNvbnRyb2wgY29ubmVjdGlvbi4KCi0gTW9kaWZpZWQgdGhlICNpbmNsdWRlIGxpbmVzIGluIGN1cmwvbXVsdGkuaCB0byB3b3JrIGJldHRlciBvbiBtb3JlCiAgcGxhdGZvcm1zLgoKRGFuaWVsICgzMSBKdWwgMjAwMikKLSBBdHRlbXB0ZWQgYSBmaXggZm9yIFJheSBEZUdlbm5hcm8ncyByZXBvcnRlZCBIUC1VWCBob3N0IG5hbWUgcmVzb2x2ZQogIHByb2JsZW1zLgoKRGFuaWVsICgzMCBKdWwgMjAwMikKLSBQcml5YSBSYW1ha3Jpc2huYW4gYW5kIFJ5YW4gSm9uZXMgY29tcGlsZXMgY3VybC9jdXJsLmggd2l0aCBhIEMrKyBjb21waWxlcgogIGFuZCBkb24ndCBnZXQgX19TVERDX18gZGVmaW5lZCwgd2hpY2ggcmVxdWlyZWQgdXMgdG8gZXh0ZW5kIHRoZSBwcmVwcm9jZXNzb3IKICBjaGVjayBmb3IgdGhlICMjIG9wZXJhdG9yIHVzYWdlLgoKLSBDb3JyZWN0IHRoZSBkZXNjcmlwdGlvbiBmb3IgQ1VSTE9QVF9QQVNTV0RGVU5DVElPTiwgaWYgc2V0IHRvIE5VTEwgdGhlCiAgaW50ZXJuYWwgZGVmYXVsdCBmdW5jdGlvbiB3aWxsIGJlIHB1dCBiYWNrLgoKLSBkYW5mdXp6IGF0IG1pbGsuY29tIGZvdW5kIG91dCB0aGF0IGxpYmN1cmwgYmFkbHkgYXNzdW1lZCBhIHNwYWNlIGFmdGVyCiAgJ1NldC1Db29raWU6JyBzbyBpZiBpdCB3YXNuJ3QgcHJlc2VudCwgaXQgY2F1c2VkIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlCiAgY29va2llIG5hbWUgdG8gZmFsbCBvZmYhCgpEYW5pZWwgKDI5IEp1bCAyMDAyKQotIFRoZSBwYXNzd29yZCBwcm9tcHQgYXNraW5nIGZvciB1c2VyIHBhc3N3b3JkIHVzZWQgc3Rkb3V0IGFuZCBub3cgdXNlcwogIHN0ZGVyciBpbnN0ZWFkIHRvIGJldHRlciBhbGxvdyByZWRpcmVjdGluZy4gSXQgYWxzbyBsZWFrZWQgYSBmb3BlbigpIGZpbGUKICBoYW5kbGUgdGhhdCBpcyBub3cgZml4ZWQuCgpEYW5pZWwgKDI4IEp1bCAyMDAyKQotIEhBVkVfU0VUVkJVRiB3YXMgbGVmdCBvdXQgZnJvbSBzcmMvbWFpbi5jIHdoaWNoIG1hZGUgLU4gbm90IHdvcmsuIEZvdW5kIG91dAogIGJ5IE0gVC4KCkRhbmllbCAoMjYgSnVuIDIwMDIpCi0gR2xlbiBOYWthbXVyYSBzb2x2ZWQgYSBjcmFzaCBpbiB0aGUgbmFtZSByZXNvbHZpbmcgZnVuY3Rpb24gZm9yIElQLW9ubHkKICBhZGRyZXNzZXMgb24gQWxwaGEgTGludXggKGF0IGxlYXN0KS4KCi0gVC4gQmhhcmF0aCBjb3JyZWN0ZWQgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBpbnRyb2R1Y2VkIGluIDcuOS44LgoKRGFuaWVsICgyMiBKdW4gMjAwMikKLSBBbmRy6XMgR2FyY+1hIHBvaW50ZWQgb3V0IG1hbiBwYWdlIGVycm9ycyBpbiBjdXJsX2Zvcm1hZGQuMy4gSSBmaXhlZC4KCkRhbmllbCAoMTkgSnVuIDIwMDIpCi0gQ2hyaXMgQ29tYmVzIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiBjdXJsX2VzY2FwZSgpLiBJIGZpeGVkLiBXZSBubyBsb25nZXIKICB0cmllcyB0byBnZW5lcmF0ZSBub3IgcGFyc2UgJysnIGluIFVSTHMuIFNwYWNlcyBiZWNvbWUgJTIwLCBhbmQgb25seSAlLWNvZGVzCiAgYXJlIHRyYW5zbGF0ZWQgYnkgY3VybF91bmVzY2FwZSgpLgoKRGFuaWVsICgxNSBKdW4gMjAwMikKLSBBZGRlZCAtLWxpbWl0LXJhdGUgdG8gdGhlIGN1cmwgdG9vbC4gQWxsb3dzIHRoZSB1c2VyIHRvIHNldCBhIG1heG1pbXVtCiAgdXBwZXIgbGltaXQgdG8gaG93IG11Y2ggYmFuZHdpZHRoIHRvIHVzZSBmb3IgdHJhbnNmZXJzLgoKLSBDVVJMT1BUX0JVRkZFUlNJWkUgd2FzIGFkZGVkIHRvIGxpYmN1cmwuIFRoaXMgc2V0cyBhIHByZWZlcmVkIHNpemUgZm9yIHRoZQogIHJlY2VpdmUgYnVmZmVyIGluIGxpYmN1cmwuIFRoZSBtYWluIHBvaW50IG9mIHRoaXMgd291bGQgYmUgdGhhdCB0aGUgd3JpdGUKICBjYWxsYmFjayBnZXRzIGNhbGxlZCBtb3JlIG9mdGVuIGFuZCB3aXRoIHNtYWxsZXIgY2h1bmtzLgoKRGFuaWVsICgxNCBKdW4gMjAwMikKLSBZYXJyYW0gU3VuaWwgZm91bmQgb3V0IHRoYXQgdGhlIFNvY2tldElzRGVhZCgpIGZ1bmN0aW9uIHBlcmZvcm1lZCBhIGxvdAogIGZhc3RlciBvbiBXaW5kb3dzIHdoZW4gcmVtb3ZpbmcgdGhlIDEgbWljcm9zZWNvbmQgdGltZW91dC4KCi0gSGFubm8gTC4gS3Jhbnpob2ZmIGZpeGVkIHRoZSBWQysrIHByb2plY3QgZmlsZXMuCgotIFRvbSBNYXR0aXNvbiBmb3VuZCBvdXQgdGhhdCBmdHAgdHJhbnNmZXJzIGNsb3NlZCB0aGUgY29ubmVjdGlvbiBhIGxpdHRsZQogIHRvbyBvZnRlbi4KCi0gTWlrbG9zIE5lbWV0aCBwb3N0ZWQgYSBWQysrIG1ha2VmaWxlIGZpeCBhbmQgc29tZSBJTlNUQUxMIGNvbW1lbnRzIG9uIGhvdwogIHRvIGRpc2FibGUgc3BlY2lmaWMgcHJvdG9jb2xzIHdoZW4gYnVpbGRpbmcgZm9yIFdpbmRvd3MuCgpWZXJzaW9uIDcuOS44CgpEYW5pZWwgKDEzIEp1biAyMDAyKQotIFRpbWUgdG8gbGV0IHRoaXMgYmFieSBnby4KCkRhbmllbCAoMTIgSnVuIDIwMDIpCi0gQ2hyaXMgQ29tYmVzIGFkZGVkIHRocmVlIG5ldyBvcHRpb25zIGZvciBjdXJsX2Zvcm1hZGQoKTogQ1VSTEZPUk1fQlVGRkVSLAogIENVUkxGT1JNX0JVRkZFUlBUUiwgQ1VSTEZPUk1fQlVGRkVSTEVOR1RILiAgVGhleSBhcmUgdXNlZCB0byBjcmVhdGUgYQogIG11bHRpcGFydCB0aGF0IGFwcGVhcnMgYXMgYSByZWd1bGFyIGZpbGUgdXBsb2FkLCBidXQgdGhlIGRhdGEgaXMgcHJvdmlkZWQKICB3aXRoIGEgcG9pbnRlciBhbmQgbGVuZ3RoLgogIAotIE5pY28gQmFnZ3VzIG1hZGUgdGhlIFZNUyB2ZXJzaW9uIHVzZSBzaWdzZXRqbXAoKSB0b28uCgotIEr2cm4gSGFydHJvdGggZml4ZWQgdGhlIG1pbmd3MzIgYnVpbGQgdXNpbmcgdGhlIG1tIGxpYi4KCi0gQXBwbGllZCBwYXRjaGVzIGJ5IEtyaXMgS2VubmF3YXkgdGhhdCBjb3JyZWN0IGZvcm1hdCBzdHJpbmcgcHJvYmxlbXMgaW4KICBsaWIvZnRwLmMgYW5kIGxpYi9sZGFwLmMuCgpWZXJzaW9uIDcuOS44LXByZTMKCkRhbmllbCAoMTEgSnVuIDIwMDIpCi0gSmFtZXMgQ29uZSBicm91Z2h0IHRoZSBpZGVhIG9mIHVzaW5nIHNpZ3NldGptcCgpIGluIHRoZSBzaWduYWwgaGFuZGxlciB0bwogIG1ha2UgdGhlIHRpbWUtb3V0IG9mIG5hbWUgbG9va3VwcyB0byB3b3JrLCBldmVuIHdoZW4gdGhlIHVuZGVybHlpbmcgbmFtZQogIHJlc29sdmVyIGxpYnJhcnkgdHJhcHMgRUlOVFIuIFRoZSB1c2Ugb2Ygc2lnc2V0am1wKCkgYW5kIHNpZ2xvbmdqbXAoKSBmb3IKICB0aGlzIG1heSBiZSBhIGJpdCBkcmFzdGljLCBhbmQgYWxzbyBub3QgbGlrZWx5IHRvIGV4aXN0IG9uIGFsbCBwbGF0Zm9ybXMuICBJCiAgYWRkZWQgY2FyZWZ1bCBjaGVja2luZyBmb3IgdGhpcyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCwgZXZlbiBjaGVja3MgZm9yIGl0CiAgYmVpbmcgYSBtYWNybyAod2hpY2ggc2VlbXMgdG8gYmUgdGhlIGNhc2UgaW4gZm9yIGV4YW1wbGUgTGludXgpLgoKICBzaWdzZXRqbXAoKSBzZWVtcyB0byBiZSBtZW50aW9uZWQgaW4gdGhlIFNpbmdsZSBVbml4IHNwZWNpZmljYXRpb24uCgotIE1pa2xvcyBOZW1ldGggYnJvdWdodCBhIHBhdGNoIHRoYXQgYWxsb3dzIGxpYmN1cmwgdG8gZ2V0IGJ1aWx0IHdpdGggc3BlY2lmaWMKICBwcm90b2NvbHMgZGlzYWJsZWQuIFRoaXMgaXMgZG9uZSBieSBydW5uaW5nIC4vY29uZmlndXJlCiAgLS1kaXNhYmxlLVtwcm90b2NvbF0uCgotIEZUUCByYW5nZSBkb3dubG9hZHMgY291bGQgbWFrZSBDVVJMRV9GVFBfV1JJVEVfRVJST1IgZ2V0IHJldHVybmVkLiBXZSBub3cKICBtYWtlIHByZWNhdXRpb25zIHRvIG5vdCByZXR1cm4gdGhpcyBmb3IgcmFuZ2UgZG93bmxvYWRzLgoKICBBZGRlZCB0ZXN0IGNhc2UgMTM1IHRoYXQgbWFrZXMgYW4gZnRwIHJhbmdlIGRvd25sb2FkLiBIYWQgdG8gdHdlYWsgdGhlCiAgcnVudGVzdHMucGwgc2NyaXB0IGEgYml0IHRvby4KCi0gQnVnIHJlcG9ydCAjNTY2ODM1IGlkZW50aWZpZWQgYSBzdHJsZW4oKSBvbiBhIE5VTEwgcG9pbnRlci4gQWRkZWQgYWRkaXRpb25hbAogIGNoZWNrIHRvIHByZXZlbnQgdGhpcy4KCkRhbmllbCAoMTAgSnVuIDIwMDIpCi0gRm91bmQgYW5kIGNvcnJlY3RlZCBhIGNvbm5lY3QgZmFpbHVyZSBwcm9ibGVtIHRoYXQgZGlkbid0IGNyZWF0ZSBhIGh1bWFuCiAgZXJyb3IgdGV4dC4KCi0gQWRkZWQgY29kZSB0byBjb21waWxlIHdpdGggT3BlblNTTCAwLjkuNy4gQmFzZWQgb24gcGF0Y2ggZnJvbSBKYWNvYiBNZXVzZXIKICBhbmQgY29tbWVudHMgZnJvbSBH9nR6IEJhYmluLUViZWxsLgoKLSBHYXV0YW0gTWFuaSBmb3VuZCBhIHNvY2tldCBkZXNjcmlwdG9yIGxlYWsgdGhhdCBoYXBwZW5lZCB3aGVuIEZUUCB0cmFuc2ZlcnMKICBmYWlsZWQgYW5kIHlvdSByZWludm9rZWQgY3VybF9lYXN5X3BlcmZvcm0oKS4KCkRhbmllbCAoNSBKdW4gMjAwMikKLSBHdXN0YWYgSHVpIGNvcnJlY3RlZCBjdXJsX211bHRpX3JlbW92ZV9oYW5kbGUoKSBzbyB0aGF0IGl0IHdvbid0IGNyYXNoIG5vCiAgbWF0dGVyIHdoZW4geW91IGRlY2lkZSB0byByZW1vdmUgdGhlIENVUkwgaGFuZGxlLgoKLSBIQVZFX1JBTkRfU1RBVFVTIHdhcyBhZGRlZCB0byBsaWIvY29uZmlnLXdpbjMyLmggYnkgQW5kcmVhcyBPbHNzb24sIGFzIGl0CiAgbWFrZXMgd2luZG93cyBidWlsZHMgc3RvcCBjb21wbGFpbmluZyBhYm91dCAid2VhayBzZWVkaW5nIiB3aGVuIGl0IGluIGZhY3QKICBpc24ndC4KCi0gQW5vdGhlciA2NGJpdCBhcmNoaXRlY3R1cmUgY3Jhc2ggdGhhdCB3YXMgaW50cm9kdWNlZCBpbiA3LjkuNyB3YXMgbm93CiAgcmVtb3ZlZCwgYXMgYnVnIHJlcG9ydCAjNTY0NTg1IGNsYXJpZmllZC4gVGhpcyBoYXBwZW5lZCBkdWUgdG8gb3VyIGF0dGVtcHRzCiAgdG8gb25seSBhbGxvY2F0ZSBvbmx5IGFzIG11Y2ggbWVtb3J5IGFzIGlzIGFjdHVhbGx5IG5lZWRlZCBmb3IgbmFtZQogIHJlc29sdmluZyAodXNpbmcgcmVhbGxvYykgd2hpY2ggY2FsbGVkIGZvciBhIGZ1bmN0aW9uIHRoYXQgY291bGQgJ21vdmUnIGEKICBob3N0ZW50IHN0cnVjdCBpbiBtZW1vcnkuCgpWZXJzaW9uIDcuOS44LXByZTIKCkRhbmllbCAoMyBKdW4gMjAwMikKLSBULiBCaGFyYXRoIGZpeGVkIHRoZSBDVVJMSU5GT19SRURJUkVDVF9USU1FIHRvIHJldHVybiBhIGNvcnJlY3QgdGltZSBhbmQKICBtYWRlIHRoZSBDVVJMSU5GT19SRVFVRVNUX1NJWkUgcmV0dXJuIHRoZSBjb3JyZWN0IHRvdGFsIHJlcXVlc3Qgc2l6ZS4gSGUKICBhbHNvIG1hZGUgdGhlIHdpbjMyIHRpbWVycyB1c2UgaGlnaGVyIHJlc29sdXRpb24gdGhhbiBiZWZvcmUuCgpEYW5pZWwgKDI5IE1heSAyMDAyKQotIFJlbmF1ZCBDaGFpbGxhdCBtYWRlIG1lIGF3YXJlIG9mIHRoZSBmYWN0IHRoYXQgbGliY3VybCByZXR1cm5lZCBhbiBlcnJvciBpZgogIHlvdSB0cmllZCB0byBnZXQgYW4gZW1wdHkgRlRQIGZpbGUuIFRoaXMgc2VlbWVkIGxpa2UgYSB3cm9uZyB0aGluZyB0byBkbywgc28KICBub3cgaXQgbm8gbG9uZ2VyIGRvZXMgdGhhdCEgSSBqdXN0IGhvcGUgdGhhdCBubyBvbmUgYnVpbHQgYW55dGhpbmcgZmFuY3kKICB1cG9uIHRoaXMgdW5leHBlY3RlZCBiZWhhdmlvci4uLgoKRGFuaWVsICgyOCBNYXkgMjAwMikKLSBDcmlzIEJhaWxpZmYgYnJvdWdodCBDVVJMT1BUX0NBUEFUSCB0aGF0IHdvcmtzIGxpa2UgQ1VSTE9QVF9DQUlORk8gYnV0CiAgc3BlY2lmaWVzIGEgcGF0aCB0byBhIGRpcmVjdG9yeSB3aXRoIGNlcnRpZmljYXRlcyByYXRoZXIgdGhhbiBhIHNpbmdsZSBmaWxlCiAgd2l0aCB0aGVtIGFsbCBjb25jYXRlbmF0ZWQuIC0tY2FwYXRoIHdhcyBhZGRlZCB0byB0aGUgY29tbWFuZCBsaW5lIHRvb2wKICBmb3IgdGhlIHNhbWUgZnVuY3Rpb24uCgogIFdpbmRvd3MgdXNlcnMgbmVlZCB0byBwYXkgYXR0ZW50aW9uIHRoYXQgdGhlIGRpcmVjdG9yeSBzaG91bGQgYmUgc2V0dXAgd2l0aAogIHRoZSBjX3JlaGFzaCB0b29sIG9mIHRoZSBPcGVuU1NMIHBhY2thZ2UsIGFuZCB0aGF0IGNyZWF0ZXMgc3ltbGlua3MgYnkKICBkZWZhdWx0IHRoYXQgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIGFjdHVhbCBjb3BpZXMgdG8gd29yayBvbiBXaW5kb3dzLgoKLSBHdXN0YWYgSHVpIHByb3ZpZGVkIG5ldyBjb2RlIHRoYXQgY2hhbmdlcyBob3cgY3VybF9tdWx0aV9pbmZvX3JlYWQoKQogIG1lc3NhZ2VzIGFyZSBzdG9yZWQsIHNvIHRoYXQgdGhleSBkb24ndCBoYXZlIHRvIGJlIGtlcHQgYXJvdW5kIGZvciB0aGUgbXVsdGkKICBoYW5kbGUncyBlbnRpcmUgbGlmZSB0aW1lLiBIZSBhbHNvIG1hZGUgaXQgcmV0dXJuIGZhaWx1cmUgY29kZXMgcHJvcGVybHkKICB3aGljaCBpdCBkaWRuJ3QgZG8gYmVmb3JlLgoKRGFuaWVsICgyNyBNYXkgMjAwMikKLSBHdXN0YWYgSHVpIHBvaW50ZWQgb3V0IHRoYXQgcnVubmluZyBjdXJsX211bHRpX3BlcmZvcm0oKSB3aXRob3V0IGRvaW5nCiAgY3VybF9tdWx0aV9mZHNldCgpIGZpcnN0IHdhcyBub3QgcmVhbGx5IGEgd29ya2luZyBjb21iby4gSSBhZGRlZCBhbiBpbnRlcm5hbAogIGNoZWNrIGZvciB0aGlzIGFuZCBoYXZlIHNvbWUgZXh0cmEgc2VsZWN0KCkgY29kZSB3aXRob3V0IHRpbWVvdXQgdG8gbWFrZSB0aGUKICBsaWJyYXJ5IGludGVybmFscyB3b3JrIGlkZW50aWNhbGx5IG5ldmVydGhlbGVzcy4gV2UgbWlnaHQgbmVlZCB0byBzb21laG93CiAgZWl0aGVyIGRvY3VtZW50IHRoYXQgb25jZSB5b3UndmUgdXNlZCB0aGUgKl9mZHNldCgpIHlvdSBzaG91bGQgcmVtYWluIHVzaW5nCiAgdGhlbSBpbiBzZWxlY3QoKSBvciB5b3Ugc2hvdWxkIGJsYW5rIHRoZW0gc29tZWhvdyBzbyB0aGF0IGxpYmN1cmwgd29uJ3QgZ28KICBjcmF6eS4KClZlcnNpb24gNy45LjgtcHJlMQoKRGFuaWVsICgyMiBNYXkgMjAwMikKLSBKYW1lcyBDb25lIGJyb3VnaHQgYW4gZXhjZWxsZW50IHBhdGNoLCBpbmNsdWRpbmcgc2V2ZXJhbCB0ZXN0cyBhbmQgZG9jcyEKICBDVVJMT1BUX05FVFJDIG5vdyB0YWtlcyBhbiBlbnVtIGFzIGFyZ3VtZW50IGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIGJvb2xlYW4uCiAgLS1uZXRyYy1vcHRpb25hbCB3YXMgaW50cm9kdWNlZCBhcyBhbiBhZGRpdGlvbiB0byAtLW5ldHJjIHRvIGFsbG93IHRoZQogIGNvbW1hbmQgbGluZSBjbGllbnQgdG8gdGFrZSB1c2Ugb2YgYWxsIHRoYXQgbmV3IG5ldHJjIHN0dWZmLgoKLSBCdWcgcmVwb3J0ICM1NTg4ODggc2hvd2VkIGEgY2FzZSB3aGVyZSBsaWJjdXJsIHJlLXVzZWQgdGhlIHByZXZpb3VzIGhvc3QKICBuYW1lIHdoZW4gYSBjb25uZWN0aW9uIG92ZXIgYSBwcm94eSB3YXMgcmUtdXNlZCBidXQgdG8gYSBkaWZmZXJlbnQgdGFyZ2V0CiAgaG9zdC4KCkRhbmllbCAoMjEgTWF5IDIwMDIpCi0gRWRpbiBLYWRyaWJhc2ljIGhlbHBlZCBtZSBzb3J0IG91dCBhIHByb2JsZW0gdG8gbWFkZSBsaWJjdXJsIGNyYXNoIHdoZW4KICB0cnlpbmcgdG8gSFRUUCBQT1NUIGFuIGVtcHR5IHN0cmluZy4KCi0gQ2xhcmlmaWVkIHRoYXQgSnVlcmdlbiBXaWxrZSBkb25hdGVkIHRoZSBvcmlnaW5hbCB0ZXN0cy9zZXJ2ZXIvc3dzLmMgY29kZS4KCi0gSmVhbi1QaGlsaXBwZSBCYXJyZXR0ZS1MYVBpZXJyZSBtYWRlIGN1cmxfZm9ybWFkZCgpIHJldHVybiBhIHR5cGVkZWYgbmFtZWQKICBDVVJMRk9STWNvZGUgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgJ2ludCcsIGFuZCB0aGUgdmFyaW91cyByZXR1cm4gY29kZXMgYXJlCiAgbm93IGdsb2JhbGx5IGV4cG9ydGVkLiBJdCBhbGxvd3MgYXBwbGljYXRpb25zIHRvIGJldHRlciBmaWd1cmUgb3V0IHdoYXQgZ29lcwogIHdyb25nIHdoZW4gY3VybF9mb3JtYWRkKCkgcmV0dXJucyBlcnJvcnMuCgpEYW5pZWwgKDIwIE1heSAyMDAyKQotIFJvbGFuZCBaaW1tZXJtYW5uIHBvaW50ZWQgb3V0IHRoYXQgU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSgpCiAgaXMgcHJlZmVyZWQgdG8gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfZmlsZSgpLgoKRGFuaWVsICgxNyBNYXkgMjAwMikKLSBCdWcgcmVwb3J0ICM1NTY4NjkgcG9pbnRlZCBvdXQgdGhhdCBzcmMvd3JpdGVvdXQuYyBkaWRuJ3QgY29tcGlsZSBvbiBmcmVlYnNkCiAgYWZ0ZXIgbXkgQUlYIGZpeGVzIHRoZSBvdGhlciB3ZWVrLgoKLSBCdWcgcmVwb3J0ICM1NTY5MzAgcG9pbnRlZCBvdXQgYSBGcmVlQlNEIGNvcmUgZHVtcCBpbnRyb2R1Y2VkIGluIDcuOS43IGluCiAgdGhlIEROUyBzdHJ1Y3QgcmVhbGxvYyBzdHVmZi4gQWN0dWFsbHksIHRoaXMgY3Jhc2ggY291bGQgaGFwcGVuIG9uIGFsbAogIHN5c3RlbXMgdGhhdCBtYWRlIHRoZSBwYWNrX2hvc3RlbnQoKSBmdW5jdGlvbiBnZXQgaW52b2tlZC4KCi0gSSByZW1vdmVkIHNldmVyYWwgY29tcGlsZXIgd2FybmluZ3MgaW4gdGhlIHRlc3Qgc3VpdGUncyBIVFRQIHNlcnZlci4KClZlcnNpb24gNy45LjcKCkRhbmllbCAoMTAgTWF5IDIwMDIpCi0gS2V2aW4gUm90aCBhZGp1c3RlZCB0aGUgLS10cmFjZS1hc2NpaSBvdXRwdXQgc2xpZ2h0bHkuCgotIFBhdWwgSGFycmluZ3RvbiBmb3VuZCBvdXQgdGhhdCBzcmMvd3JpdGVvdXQuYyBuZWVkZWQgYW4gYWRkaXRpb25hbCBoZWFkZXIKICBmaWxlIGluY2x1ZGVkIGZvciBBSVggYnVpbGRzCgpWZXJzaW9uIDcuOS43LXByZTIKCkRhbmllbCAoNyBNYXkgMjAwMikKLSBVcGRhdGVkIHRoZSBtYW4gcGFnZSB3aXRoIC0tdHJhY2UtYXNjaWkgYW5kIC1qLy0tanVuay1zZXNzaW9uLWNvb2tpZXMuCgotIE1hZGUgLS10cmFjZS1hc2NpaSBkbyBwcmV0dHkgbXVjaCB0aGUgc2FtZSBhcyAtLXRyYWNlIGJ1dCB3aXRob3V0IHRoZSBoZXgKICBwYXJ0IGluIHRoZSBvdXRwdXQuCgotIEFkZGVkIENVUkxPUFRfQ09PS0lFU0VTU0lPTiB0aGF0IHdoZW4gZW5hYmxlZCBtYWtlcyBsaWJjdXJsIGlnbm9yZSBzZXNzaW9uCiAgY29va2llcyByZWFkIGZyb20gYSBmaWxlLiBUaGlzIG9wdGlvbiBpcyBlbmZvcmNlZCBieSB0aGUgY3VybCBjb21tYW5kIGxpbmUKICB0b29sIHVzaW5nIHRoZSBuZXcgLWovLS1qdW5rLXNlc3Npb24tY29va2llcyBvcHRpb24uIEFmdGVyIGRpc2N1c3Npb25zIHdpdGgKICBLZXZpbiBSb3RoLiBUaGlzIG1ha2VzIGl0IGVhc2llciB0byB1c2UgY3VybCB0byBmdWxseSBlbXVsYXRlIGEgYnJvd3NlcidzCiAgYmVoYXZpb3IsIGV2ZW4gd2hlbiBpdCBjb21lcyB0byAic2Vzc2lvbiBjb29raWVzIi4gU2Vzc2lvbiBjb29raWVzIGFyZQogIGNvb2tpZXMgdGhhdCBhIG5vcm1hbCBicm93c2VyIGRpc2NhcmRzIHdoZW4gdGhlIGJyb3dzZXIgaXMgc2h1dAogIGRvd24uIFRoZXkncmUgaWRlbnRpZmllZCBieSBub3QgaGF2aW5nIGFueSBleHBpcmUgZGF0ZS90aW1lLgoKLSBXaGVuIENVUkxPUFRfREVCVUdEQVRBIHdhcyBzZXQsIGl0IHJ1aW5lZCB0aGUgQ1VSTE9QVF9TVERFUlIgc2V0dGluZyBhbmQKICB0aGlzIHdhcyBkaXNjb3ZlcmVkIHdoZW4gLS10cmFjZSB3YXMgbWFkZSB0byBjcmFzaC4KCi0gVXNpbmcgLXYgYW5kIC0tdHJhY2UgYXQgdGhlIHNhbWUgdGltZSBjb25mdXNlZCBtYXR0ZXJzLiAtdiBpcyBub3cgcHJldHR5CiAgbXVjaCBpZ25vcmVkIHdoZW4gLS10cmFjZSBvciAtLXRyYWNlLWFzY2lpIGlzIHVzZWQuCgotIE1hZGUgLS10cmFjZSAoYW5kIC0tdHJhY2UtYXNjaWkpIHN1cHBvcnQgLSBhcyBmaWxlIG5hbWUgdG8gcGFzcyBvdXRwdXQgdG8KICBzdGRvdXQgaW5zdGVhZC4gSXQgbWFrZXMgaXQgY29uc2lzdGVudCB3aXRoIGhvdyBvdGhlciBvcHRpb25zIHdvcmsuCgpWZXJzaW9uIDcuOS43LXByZTEKCkRhbmllbCAoNiBNYXkgMjAwMikKLSBBZGRlZCBtdWx0aS1wb3N0LmMgdG8gdGhlIGV4YW1wbGVzIGRpcmVjdG9yeS4gSSBnb3QgdGhlIGJhc2ljIHNvdXJjZSBmb3IKICB0aGlzIGZyb20gR3VzdGFmIEh1aS4KCkRhbmllbCAoMyBNYXkgMjAwMikKLSBDVVJMX01BWF9XUklURV9TSVpFIGlzIG5vdyBhbiBleHBvcnRlZCAjZGVmaW5lIGluIHRoZSBjdXJsL2N1cmwuaCBoZWFkZXIgYW5kCiAgY2FuIGJlIHVzZWQgdG8gZmlndXJlIG91dCB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSB5b3VyIHdyaXRlIGNhbGxiYWNrIGNhbgogIGdldC4KCi0gQ1VSTE9QVF9SRUFEREFUQSBpcyBub3cgYW4gYWxpYXMgZm9yIENVUkxPUFRfSU5GSUxFIGFuZCBDVVJMT1BUX1dSSVRFREFURSBpcwogIGFuIGFsaWFzIGZvciBDVVJMT1BUX0ZJTEUuIFRoZXNlIHR3byB3ZXJlIGFkZGVkIGZvciBjb25mb3JtaXR5LiBNb3N0IG90aGVyCiAgY2FsbGJhY2sgZnVuY3Rpb24ncyB1c2VyZGF0YSBhcmUgcHJvdmlkZWQgd2l0aCBvcHRpb25zIHVzaW5nIGEgc2ltaWxhciBuYW1lLQogIHNjaGVtZS4KCi0gQWRkZWQgIi0tdHJhY2UgW2ZpbGVdIiB0byB0aGUgY29tbWFuZCBsaW5lIHRvb2wuIEl0IG1ha2VzIGEgdmVyeSBkZXRhaWxlZAogIHRyYWNlIGR1bXAgZ2V0IHN0b3JlZCwgd2l0aCBhIGZ1bGwgcHJvdG9jb2wgZHVtcCB0aGF0IGluY2x1ZGVzIGFsbCByZWNlaXZlZAogIGFuZCB0cmFuc21pdHRlZCBkYXRhLiBUaGlzIGNvdWxkIGJlIGEgdmVyeSBlZmZlY3RpdmUgdG9vbCBmb3IgZGVidWdnaW5nIHdoYXQKICBnb2VzIHdyb25nLiBUaGlzIGR1bXAgaW5jbHVkZXMgZXZlcnkgYnl0ZSB0aGUgd2F5IGl0IGlzIHNlbnQgdG8vcmVjZWl2ZWQKICBmcm9tIHRoZSBzZXJ2ZXIuIFRoZSBkdW1wIGlzIHRoZSBwbGFpbi10ZXh0IHZlcnNpb24sIHNvIFNTTCB0cmFuc2ZlcnMgd2lsbAogIHN0aWxsIGJlIHJlYWRhYmxlLgoKLSBJIGZvdW5kIG91dCB0aGF0IHRoZSBERUJVR0ZVTkNUSU9OIHdhcyBub3QgY2FsbGVkIHByb3Blcmx5IGV2ZXJ5d2hlcmUgYXMgd2UKICB3YW50ZWQgaXQgdG8uIEkgZml4ZWQgaXQuCgotIC1EIG5vdyBzdG9yZXMgYWxsIGhlYWRlcnMgdG8gdGhlIHNhbWUgZmlsZSBpZiBtdWx0aXBsZSBVUkxzIGFyZSBnaXZlbiBvbiB0aGUKICBjb21tYW5kIGxpbmUhIEtldmluIFJvdGggbWFkZSBtZSBhd2FyZSBvZiB0aGF0IGl0IGRpZG4ndCBhbHJlYWR5IGRvIHRoaXMhCgotIEd1c3RhZiBIdWkgd3JvdGUgYW4gZXhjZWxsZW50IGZvcm1wb3N0IGV4YW1wbGUgdGhhdCB1c2VkIHRoZSBtdWx0aQogIGludGVyZmFjZS4gIFVuZm9ydHVuYXRlbHksIGl0IGRpZG4ndCB3b3JrIGR1ZSB0byBzZXZlcmFsIGJ1Z3MgaW4gaG93CiAgdHJhbnNmZXJzIHdlcmUgbWFkZSB3aGVuIHRoZSBtdWx0aSBpbnRlcmZhY2Ugd2FzIHVzZWQuCgpEYW5pZWwgKDIgTWF5IDIwMDIpCi0gSGFubm8gS3Jhbnpob2ZmIGZvdW5kIG91dCB0aGF0IHdoZW4gZG9pbmcgbXVsdGlwbGUgdHJhbnNmZXJzIG9uIHRoZSBzYW1lCiAgZWFzeSBoYW5kbGUsIHRoZSBwcm9ncmVzcyBtZXRlciB3b3VsZCBzaG93IGEgYmFkICJjdXJyZW50bHkgZG93bmxvYWRlZAogIHZhbHVlIiB3aGVuIHRoZSB0cmFuc2ZlciBzdGFydHMuCgpEYW5pZWwgKDEgTWF5IDIwMDIpCi0gQXBwbGllZCBhbm90aGVyIHBhdGNoIGJ5IEphY2t5IExhbSB0byBtYWtlIHRoZSBuYW1lIHJlc29sdmUgaW5mbyByZWFsbG9jKCkKICBzdHVmZiB3b3JrIHByb3Blcmx5LgoKRGFuaWVsICgyOCBBcHJpbCAyMDAyKQotIGN1cmxfbXVsdGlfaW5mb19yZWFkKCkgaXMgbm93IGltcGxlbWVudGVkIQoKRGFuaWVsICgyNyBBcHJpbCAyMDAyKQotIFVwZGF0ZWQgQlVHUywgVE9ETywgRkFRLCBJTlNUQUxMIGFuZCBhZGRlZCBCSU5ESU5HUy4KCi0gSSB0aGluayBJIGZpeGVkIHRoZSBETlMgY2FjaGUgcHJ1bmUgY3JhY2ggSmFja3kgTGFtIGZvdW5kIGFuZCByZXBvcnRlZC4KCi0gSSBjbGVhbmVkIHVwIHRoZSBuYW1lIHByZWZpeCBzdHVmZiBpbiB0aGUgaGFzaCBhbmQgbGxpc3QgbW9kdWxlcy4KCi0gRlRQIHJlc3BvbnNlcyBzaG91bGQgbm93IGJlIGJldHRlciBvbiB0aW1pbmcgb3V0IHByb3Blcmx5LiBUaGUgdGltZW91dCB2YWx1ZQogIGlzIG1heGltdW0gdGltZW91dCBmb3IgdGhlIGVudGlyZSByZXF1ZXN0IG9wZXJhdGlvbiwgYnV0IGJlZm9yZSB0aGlzLCB0aGUKICB0aW1lb3V0IHdhcyB1c2VkIGFzIGEgbWF4aW11bSBhbGxvd2VkIHRpbWUgYmV0d2VlbiB0d28gcmVhZHMuLi4KCkRhbmllbCAoMjYgQXByaWwgMjAwMikKLSBGaXhlZCB0aGUgdGVzdCBzdWl0ZSBodHRwIHNlcnZlciB0byBub3QgdXNlIHNucHJpbnRmKCkgYW55bW9yZSBkdWUgdG8gYmV0dGVyCiAgcG9ydGFiaWxpdHkuCgpEYW5pZWwgKDI1IEFwcmlsIDIwMDIpCi0gV2l0aCBTdGVybGluZyBIdWdoZXMnIG5ldyBETlMgcHJ1bmluZywgSmFja3kgTGFtIGFza2VkIGlmIHRoaXMgd291bGRuJ3QKICBjYXVzZSBwcm9ibGVtcyBzaW5jZSB0aGUgcHJ1bmluZyBpcyBvbmx5IGNoZWNraW5nIHRoZSBlbnRyeSB0aW1lLCBhbmQgaXQKICBzdXJlIGNvdWxkIGNhdXNlIHByb2JsZW1zLiBUaGVyZWZvciwgSSd2ZSBub3cgYWRkZWQgYW5kIGNoYW5nZWQgY29kZSBzbyB0aGF0CiAgdGhpcyBzaG91bGQgbm90IGJlIGEgcHJvYmxlbS4gTm93aGVyZSBpbiB0aGUgY29kZSB3aWxsIGJlIHN0b3JlIG5hbWUKICByZXNvbHZlZCBpbmZvcm1hdGlvbiBhcm91bmQgc28gdGhhdCBhIHN1bnNlcXVlbnQgRE5TIGNhY2hlIHBydW5lIHNob3VsZAogIGNhdXNlIGEgcHJvYmxlbS4gVGhpcyBvZiBjb3Vyc2UgY2FsbGVkIGZvciBzb21lIG1pbGQgaW50ZXJuYWwgY2hhbmdlcy4KCkRhbmllbCAoMjMgQXByaWwgMjAwMikKLSBJbXByb3ZlZCB0aGUgJ25vX3Byb3h5JyBjaGVjaywgYXMgdXNpbmcgcG9ydCBudW1iZXJzIGluIHRoZSBVUkwgY29uZnVzZWQgaXQKICBwcmV2aW91c2x5LiBSZXBvcnRlZCBieSBFcndhbiBMZWdyYW5kIGluIGJ1ZyByZXBvcnQgIzU0NzQ4NC4KCi0gVGhlIC0taW50ZXJmYWNlIG9wdGlvbiBub3cgd29ya3MgZXZlbiBvbiBJUHY2IGVuYWJsZWQgYnVpbGRzLiBSZXBvcnRlZCBieQogICd0aG9yJy4KCkRhbmllbCAoMjIgQXByaWwgMjAwMikKLSBUaGUgI2RlZmluZXMgbmFtZXMgc3RhcnRpbmcgd2l0aCBUSU1FQ09ORCBub3cgaGFzIENVUkxfIHByZWZpeGVzLiAoVGhlIG9sZAogIG5hbWVzIGFyZSBzdGlsbCAjZGVmaW5lZCB0b28uKSBQb2ludGVkIG91dCBieSBSb2JlcnQgT2xzb24uCgotIEphY2t5IExhbSBicm91Z2h0IGNvZGUgdGhhdCBsZXRzIHRoZSBuYW1lIHJlc29sdmUgZnVuY3Rpb24gb25seSB1c2UgYXMgbXVjaAogIG1lbW9yeSBhcyBpdCBhY3R1YWxseSBuZWVkcy4gVGhpcyBvbmx5IHdvcmtzIG9uIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMsCiAgYnV0IGlzIHRvdGFsbHkgdHJhbnNwYXJhbnQgdG8gYWxsIHVzZXJzLgoKRGFuaWVsICgxOSBBcHJpbCAyMDAyKQotIEJqb3JuIFJlZXNlIGZpeGVkIHBhY2tfaG9zdGVudCB0byB3b3JrIHByb3Blcmx5IHdpdGggNjQgYml0IHBvaW50ZXJzLgoKRGFuaWVsICgxOCBBcHJpbCAyMDAyKQotIFN0ZXJsaW5nIEh1Z2hlcyBhZGRlZCBjb2RlIHRvIHBydW5lIG9sZCBETlMgY2FjaGUgZW50cmllcywgc2luY2UgSmFja3kgTGFtCiAgZXhwZXJpZW5jZWQgdmVyeSBiaWcgY2FjaGVzLgoKRGFuaWVsICgxNyBBcHJpbCAyMDAyKQotIERpcmsgTWFuc2tlIHBhdGNoZWQgdGhlIDMwMSByZXNwb25zZSB0byB3b3JrIGFnYWluc3QgdGhlIFJGQyBidXQgbW9yZSBsaWtlCiAgY29tbW9uIGJyb3dzZXJzIGRvLiBJZiBhIFBPU1QgZ2V0IGEgMzAxIGJhY2ssIGl0J2xsIHN3aXRjaCB0byBHRVQgaW4gdGhlCiAgbmV4dCByZXF1ZXN0IChpZiBsb2NhdGlvbi1mb2xsb3dpbmcgaXMgZW5hYmxlZCkuCgpEYW5pZWwgKDE2IEFwcmlsIDIwMDIpCi0gRGlyayBNYW5za2UgcG9zdGVkIGEgcGF0Y2ggb3JpZ2luYWxseSB3cml0dGVuIGJ5IEluZ28gV2lsa2VuIHRoYXQgaW50cm9kdWNlZAogIHR3byBuZXcgQ1VSTElORk9fKiB2YWx1ZXM6IENVUkxJTkZPX1JFRElSRUNUX1RJTUUgYW5kCiAgQ1VSTElORk9fUkVESVJFQ1RfQ09VTlQuCgpEYW5pZWwgKDE1IEFwcmlsIDIwMDIpCi0gSm9uYXRhbiBMYW5kZXIgcGF0Y2hlZCB0aGUgdmVyYm9zZSB0ZXh0ICdEaXNhYmxlcyBQT1NULCBnb2VzIHdpdGggR0VUJyB0bwogIHJlZmxlY3QgcmVhbGl0eSBiZXR0ZXIsIGxpa2Ugd2hlbiB0aGUgZmlyc3QgcmVxdWVzdCBpc24ndCBQT1NUIGFuZCB3aGVuCiAgdGhlIHNlY29uZCBpc24ndCBHRVQuLi4gOi0pCgotIENyYWlnIERhdmlzb24gcG9pbnRlZCBvdXQgdGhhdCB3aGVuIGN1cmxfZm9ybWFkZCgpaW5nIGEgZmlsZSB0aGF0IGRvZXNuJ3QKICBleGlzdCwgbGliY3VybCBkb2Vzbid0IHJldHVybiBlcnJvci4gTm93LCBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdpbGwgcmV0dXJuCiAgQ1VSTEVfUkVBRF9FUlJPUiBpZiB0aGF0IGlzIHRoZSBjYXNlLiBUZXN0IDQxIHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcy4KClZlcnNpb24gNy45LjYKCkRhbmllbCAoMTQgQXByaWwgMjAwMikKLSBEaXJrIE1hbnNrZSBicm91Z2h0IGEgZml4IHRoYXQgbWFrZXMgbGliY3VybCBzdHJpcCBvZmYgd2hpdGUgc3BhY2VzIGZyb20gdGhlCiAgYmVnaW5uaW5nIG9mIGNvb2tpZSBjb250ZW50cy4KCi0gSGFkIHRvIHBhdGNoIGluY2x1ZGUvY3VybC9jdXJsLmggc2luY2UgTVNWQyBkb2Vzbid0IHNldCB0aGUgX19TVERDX18gZGVmaW5lLgogIE1vb25lc2FteSBwb2ludGVkIG91dCB0aGUgcHJvYmxlbSwgQmpvcm4gUmVlc2UgdGhlIHNvbHV0aW9uLgoKVmVyc2lvbiA3LjkuNi1wcmU1CgpEYW5pZWwgKDEyIEFwcmlsIDIwMDIpCi0gRml4ZWQgdGhlIFRJTUVSX0NPTk5FQ1QgdG8gYmUgbW9yZSBhY2N1cmF0ZSBmb3IgRlRQIHRyYW5zZmVycy4gUHJldmlvdXNseQogIEZUUCB0cmFuc2ZlcnMgZ290IHRoZSAiY29ubmVjdCBkb25lIiB0aW1lIHNldCBhZnRlciB0aGUgaW5pdGlhbCBGVFAgY29tbWFuZHMKICBhbmQgbm90IGRpcmVjdGx5IGFmdGVyIHRoZSBUQ1AvSVAgY29ubmVjdCBhcyBpdCBzaG91bGQuCgogIEkgYWxzbyBtYWRlIHRoZSB0aW1lIHN0YW1wIGdldCBzZXQgZXZlbiBpZiB0aGUgY29ubmVjdCBpdHNlbGYgZmFpbHMsIHdoaWNoCiAgaXQgZGlkbid0IGRvIHByZXZpb3VzbHkuCgotIEplYW4tUGhpbGlwcGUgQmFycmV0dGUtTGFQaWVycmUgcHJvdmlkZWQgaGlzIHBhdGNoIHRoYXQgaW50cm9kdWNlcwogIENVUkxPUFRfREVCVUdGVU5DVElPTiBhbmQgQ1VSTE9QVF9ERUJVR0RBVEEuIFRoZXkgYWxsb3cgYSBwcm9ncmFtIHRvIGEgc2V0IGEKICBjYWxsYmFjayB0byByZWNlaXZlIGRlYnVnL2luZm9ybWF0aW9uIGRhdGEuIFRoYXQgaW5jbHVkZXMgaGVhZGVycyBhbmQgZGF0YQogIHRoYXQgaXMgcmVjZWl2ZWQgYW5kIHNlbnQuIENVUkxPUFRfVkVSQk9TRSBzdGlsbCBjb250cm9scyBpdC4KCiAgQnkgZGVmYXVsdCwgdGhlcmUgaXMgYW4gaW50ZXJuYWwgZGVidWdmdW5jdGlvbiB0aGF0IHdpbGwgbWFrZSB0aGluZ3MgbG9vawogIGFuZCB3b3JrIGFzIGJlZm9yZSBpZiBub3QgY2hhbmdlZC4KCkRhbmllbCAoMTAgQXByaWwgMjAwMikKLSBTZWJhc3RpZW4gV2lsbGVtaWpucyBmb3VuZCBvdXQgdGhhdCAteCBkaWRuJ3QgdXNlIHRoZSBkZWZhdWx0IHBvcnQgbnVtYmVyIGFzCiAgaXMgZG9jdW1lbnRlZC4gSXQgZG9lcyBub3cuCgotIGxpYmN1cmwtZXJyb3JzLjMgaXMgYSBuZXcgbWFuIHBhZ2UgYXR0ZW1wdGluZyB0byBkb2N1bWVudCBhbGwgbGliY3VybCBlcnJvcgogIGNvZGVzCgotIEFkZGVkIHR3byBuZXcgZXJyb3IgY29kZXMgYW5kIGNoYW5nZWQgdGhlIGJlaGF2aW91ciBvZiB0d28gb2xkIG9uZXMKICBzbGlnaHRseToKCiAgQ1VSTEVfV1JJVEVfRVJST1IKICAgVGhpcyBlcnJvciB3YXMgcmV0dXJuZWQgKmJvdGgqIGZvciBlcnJvcnMgdGhhdCBvY2N1cmVkIHdoZW4gd3JpdGluZwogICByZWNlaXZlZCBkYXRhIHRvIGEgbG9jYWwgZmlsZSwgYXMgd2VsbCBhcyB3aGVuIHdlIGdldCBwcm9ibGVtcyB3cml0aW5nIGRhdGEKICAgdG8gYSByZW1vdGUgc2VydmVyLiBDVVJMRV9TRU5EX0VSUk9SIGhhcyBub3cgYmVlbiBhZGRlZCBmb3IgdGhlIGxhdHRlcgogICBlcnJvci4KCiAgQ1VSTEVfUkVBRF9FUlJPUgogICBUaGlzIGVycm9yIHdhcyBzaW1pbGFybHkgcmV0dXJuZWQgKmJvdGgqIGZvciBlcnJvcnMgd2hlbiByZWFkaW5nIGEgbG9jYWwKICAgZmlsZSwgYXMgd2VsbCBhcyB3aGVuIGdldHRpbmcgcHJvYmxlbXMgd2hlbiByZWFkaW5nIG5ldHdvcmsgZGF0YS4KICAgQ1VSTEVfUkVDVl9FUlJPUiBoYXMgbm93IGJlZW4gYWRkZWQgZm9yIHRoZSBsYXR0ZXIgZXJyb3IuCgogKFR3byB0ZXN0IGNhc2VzIHdlcmUgYWRqdXN0ZWQgYWNjb3JkaW5nbHkuKQoKRGFuaWVsICg5IEFwcmlsIDIwMDIpCi0gcnVudGVzdHMucGwgbm93IHNldHMgdGhlIEhPTUUgdmFyaWFibGUgYmVmb3JlIHJ1bm5pbmcgY3VybCwgdG8gcHJldmVudCBhbnkKICBhY3R1YWwgfi8uY3VybHJjIGZpbGUgdG8gZm9vbCB0aGUgdGVzdHMhCgpWZXJzaW9uIDcuOS42LXByZTQKCkRhbmllbCAoOCBBcHJpbCAyMDAyKQotIE1pY2hhZWwgQ3VydGlzIHByb3ZpZGVkIG5ldyBmdW5jdGlvbmFsaXR5IGZvciBjdXJsIG9uIHNvbWUgcGxhdGZvcm1zLiBVc2luZwogIHRoZSAtLWVudmlyb25tZW50IG9wdGlvbiwgY3VybCB3aWxsICpzZXQqIGEgYnVuY2ggb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgdG8gdmFsdWVzLiBUaGUgbmFtZXMgYXJlIHRoZSBzYW1lIG9uZXMgYXMgZm9yIHRoZSAtdy8tLXdyaXRlb3V0IG9wdGlvbi4KCiAgRm9yIG5vdywgdGhpcyBvbmx5IHdvcmtzIG9uIHRoZSBSSVNDIE9TIHZlcnNpb24sIGFzIHRoaXMgZmVhdHVyZSByZWxpZXMgb24KICBib3RoIE9TIHN1cHBvcnQgYW5kIHRoYXQgaXQgbWF0Y2hlcyBPUyBwYXJhZGlnbXMuCgotIEphY2t5IExhbSBwcm92aWRlZCBhIGZpeCBmb3IgZ2V0dGluZyBoZWFkZXJzLW9ubHkgd2hlbiB0aGUgcmVwbHkgaXMgSFRUUC8xLjAKICBhbmQgMzA0LCBJIGVkaXRlZCBpdCBzbGlnaHRseS4KCkRhbmllbCAoNSBBcHJpbCAyMDAyKQotIEFzIHJlcXVlc3RlZCBieSBKYXkgR3JhdmVzLCB0aGUgJy5jdXJscmMnIGZpbGUgKG9yIF9jdXJscmMgYXMgaXQgaXMgY2FsbGVkCiAgd2hlbiB1c2VkIGluIHdpbmRvd3MpLCBpcyBub3cgbG9hZGVkIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIHRoZSBIT01FCiAgZW52aXJvbm1lbnQgdmFyaWFibGUgaXNuJ3Qgc2V0IChvciBpZiBpdCBpcyB0b28gbG9uZykuIEkgYWxzbyBlbmxhcmdlZCB0aGUKICBhcnJheSB1c2VkIHRvIHN0b3JlIHRoZSBmdWxsIGZpbGUgcGF0aCBpbiwgdG8gNTEyIGJ5dGVzLgoKLSBLZXZpbiBSb3RoIHBvaW50ZWQgb3V0IHRvIG1lIHdoeSB0aGUgIjE5IE1hcmNoIiBjaGFuZ2UgcmVnYXJkaW5nIC1HIGFuZCAtSQogIHdhcyBzdHVwaWQgYW5kIHRoZSBjaGFuZ2Ugd2FzIHJldmVydGVkLiBBZGRlZCB0ZXN0IGNhc2UgNDggdG8gdmVyaWZ5IHRoZQogIGZ1bmN0aW9uYWxpdHkuCgpWZXJzaW9uIDcuOS42LXByZTMKCkRhbmllbCAoNCBBcHJpbCAyMDAyKQotIEpvbmF0YW4gTGFuZGVyIGJyb3VnaHQgYSBwYXRjaCB0aGF0IG1ha2VzIGN1cmwvY3VybC5oIGNvbXBpbGUgbmljZWx5IG9uCiAgcHJlLUlTTyBjb21waWxlcnMsIGxpa2Ugd2hlbiB1c2luZyBnY2MgLXRyYWRpdGlvbmFsLgoKRGFuaWVsICgzIEFwcmlsIDIwMDIpCi0gSmFja3kgTGFtIGlkZW50aWZpZWQgYSBnbGl0Y2ggd2hlbiBnZXR0aW5nIGhlYWRlcnMtb25seSwgd2hlcmUgbGliY3VybCB3b3VsZAogICJoYW5nIiAxIHNlY29uZCBpbiB2YWluIGluIHRoZSBzZWxlY3QoKSBsb29wIGJlZm9yZSByZXR1cm5pbmcgYmFjay4KCi0gVG9yIEFybnRzZW4gYnJvdWdodCBhIHBhdGNoIGZvciBtdWx0aXBhcnQgZm9ybXBvc3RzLiBJdCB0dXJuZWQgb3V0IHRoYXQgdGhlCiAgIkNHSV9MaXRlIFBlcmwgcGFja2FnZSIgbWFrZXMgc29tZSBiYWQgYXNzdW1wdGlvbnMgb24gd2hhdCBsZXR0ZXJzIHRoYXQgbWF5CiAgYmUgdXNlZCBpbiBib3VuZGFyeSBzdHJpbmdzIGFuZCB0aHVzIGN1cmwgY291bGQgY29uZnVzZSBpdCBieSBpbmNsdWRpbmcgJysnCiAgYW5kICcvJy4gV2hpbGUgdGhpcyBpcyBzdGFuZGFyZHMtY29tcGxpYW50LCB3ZSBjaGFuZ2UgdGhlIGJlaGF2aW9yIHRvIHdvcmsKICBzbW9vdGhseSB3aXRoIGV4aXN0aW5nIHNvZnR3YXJlIGJhc2VkIG9uIHRoYXQgcGFja2FnZS4KCkRhbmllbCAoMiBBcHJpbCAyMDAyKQotIEdlcmhhcmQgSGVycmUgZmlsZWQgYnVnIHJlcG9ydCAjNTM2MjM4IHdoZXJlIGhlIHBvaW50ZWQgb3V0IGEgY3Jhc2ggaW4KICB2ZXJib3NlIEZUUCBwYXNzaXZlIHRyYW5zZmVycyBmb3IgQUlYLgoKLSBDbGFyZW5jZSBHYXJkbmVyIHBvaW50ZWQgb3V0IGEgbWlub3IgZmxhdyBpbiBob3cgbGliY3VybCBkaWRuJ3QgcHJvcGVybHkKICB0YWtlIGNhcmUgb2YgYWxsIGVycm9ycyB0aGF0IFNTTF9yZWFkKCkgY291bGQgcmV0dXJuLgoKLSBKYWNreSBMYW0gZml4ZWQgYSBNQUxMT0NERUJVRyBwcm9ibGVtIGluIGxpYi9nZXRpbmZvLmMKCkRhbmllbCAoMjcgTWFyY2ggMjAwMikKLSBULiBCaGFyYXRoIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgY29ubmVjdGlvbiByZS11c2UgZnVuY3Rpb24gdGhhdCBkaWRuJ3QKICBjaGVjayBwcm94eSBjb25uZWN0aW9ucyBwcm9wZXJseSBmb3IgImRlYWRuZXNzIiBiZWZvcmUgdGhleSB3ZXJlIHJlLXVzZWQuCgotIFBlZHJvIE5ldmVzIGZvdW5kIG91dCB0aGF0IEhUVFAgUE9TVGluZyB3aXRoIC0tZGF0YS1iaW5hcnkgZGlkIG5vdCBwcm9wZXJseQogIHdvcmsgdW5kZXIgV2luZG93cyBhcyB0aGUgZmlsZSBzcGVjaWZpZWQgd2Fzbid0IHJlYWQgZnVsbHkgYmluYXJ5IQoKRGFuaWVsICgyNSBNYXJjaCAyMDAyKQotIEphY2t5IExhbSBicm91Z2h0IGEgZml4IHRoYXQgaW1wcm92ZXMgdHJlYXRtZW50IG9mIGNvb2tpZXMgdXNpbmcgaWRlbnRpY2FsCiAgZG9tYWlucyBidXQgd2l0aCBsZWFkaW5nIGRvdHMgcHJvcGVybHkuCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDIpCi0gTWlrbG9zIE5lbWV0aCB1cGRhdGVkIHRoZSB3aW5kb3dzIHNlY3Rpb24gb2YgdGhlIGRvY3MvSU5TVEFMTCBmaWxlIGFuZCB0aGUKICB3aW5kb3dzIG1ha2VmaWxlcy4KCi0gSm9uIERpbGxvbiBwcm92aWRlZCB1cyB3aXRoIHNldmVyYWwgZ29vZC1sb29raW5nIGN1cmwgaW1hZ2VzIGZvcgogIHByb21vdGlvbi4gVmlldyB0aGVtIGhlcmUgaHR0cDovL2N1cmwuaGF4eC5zZS9pY29ucy5odG1sCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDIpCi0gUGV0ZXIgVmVyaGFzIGZvdW5kIG91dCB0aGF0IENSTEYgcmVwbGFjZW1lbnQgaW4gdXBsb2FkcyB3YXMgbm90IHdvcmtpbmcuIEkKICBmaXhlZCBpdCwgYW5kIGFkZGVkIHRlc3QgY2FzZSAxMjggdGhhdCB2ZXJpZmllcyB0aGUgZnVuY3Rpb25hbGl0eS4KCi0gVGhlIGxpc3QgZm9ybWVybHkga25vd24gYXMgY3VybC1tYWluIGlzIG5vdyBuYW1lZCBjdXJsLXVzZXJzIGFuZCBpcyBob3N0ZWQKICBieSBzb3VyY2Vmb3JnZS4gU3VzYmNyaWJlIHRvIHRoZSBuZXcgbGlzdCwgZ2V0IG9mZiB0aGUgb2xkIG9uZS4KClZlcnNpb24gNy45LjYtcHJlMgoKRGFuaWVsICgxOSBNYXJjaCAyMDAyKQotIE1hZGUgLUcgYW5kIC1JIG9uIHRoZSBzYW1lIGNvbW1hbmQgbGluZSBjYXVzZSBhbiBlcnJvci4KCi0gTW92ZWQgdGhlIG11bHRpLmggZmlsZSB0byB0aGUgInB1YmxpYyIgaW5jbHVkZSBkaXJlY3RvcnkgYW5kIG1hZGUgaXQgZ2V0CiAgaW5jbHVkZWQgYnkgY3VybC5oIHNvIHRoYXQgbm8gZXh0cmEgaW5jbHVkZSBmaWxlcyB3aWxsIGJlIG5lY2Vzc2FyeSB0byB1c2UKICBpdC4KCiAgQWRkZWQgZG9jcyBhbmQgbWFuIHBhZ2VzIGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlIHRvIHRoZSByZWxlYXNlIGFyY2hpdmUuCiAgQWRkZWQgdGhlIHRocmVlIGV4YW1wbGUgc291cmNlIGNvZGVzIHRvby4KCiAgTmVjZXNzYXJ5IHN0ZXBzIGluIG15IGNhbXBhaWduIHRvIHNuZWFrIGluIHRoZSBtdWx0aSBpbnRlcmZhY2UuLi4gOy0pCgotIFVwZGF0ZWQgdGhlIHllYXIgaW4gYWxsIGNvcHlyaWdodCBub3RpY2VzIGluIGFsbCBDIGFuZCBIIGZpbGVzLgoKRGFuaWVsICgxOCBNYXJjaCAyMDAyKQotIFRvbWFzIFN6ZXBlIGZvdW5kIG91dCB0aGF0IC1kIGFuZCAtRyBkaWRuJ3QgbWl4IGFzIHRoZXkgc2hvdWxkLiBJIGJyb2tlIHRoaXMKICBpbiA3LjkuNS4uLiBBZGRlZCB0ZXN0IGNhc2UgMzIgZm9yIHRoaXMuCgpWZXJzaW9uIDcuOS42LXByZTEKCkRhbmllbCAoMTYgTWFyY2ggMjAwMikKLSBQZXRlciBWZXJoYXMgcG9pbnRlZCBvdXQgdGhhdCB0aGUgY3VybF9lc2NhcGUgYW5kIGN1cmxfdW5zY2FwZSBtYW4gcGFnZXMKICBjb250YWluZWQgZmFjdHVhbCBlcnJvcnMuCgotIEFsYmVydCBDaG95IGZvdW5kIGFuZCBjb3JyZWN0ZWQgYSBwcm9ibGVtIHdpdGggdGhlIHZlcmJvc2Ugb3V0cHV0IHdoZW4gZG9pbmcKICBQQVNWIGZ0cCB0cmFuc2ZlcnMuIEl0IGNvdWxkIG1ha2UgbGliY3VybCBjcmFzaC4KCiAgRGV0YWlscyBpbiBidWcgcmVwb3J0ICM1MzA1NjI6CiAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC90cmFja2VyLz9mdW5jPWRldGFpbCZhdGlkPTEwMDk3NiZhaWQ9NTMwNTYyJmdyb3VwX2lkPTk3NgoKRGFuaWVsICgxNSBNYXJjaCAyMDAyKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBmaWxlZCBidWcgcmVwb3J0ICM1MzAyMDQgdGhhdCBjbGVhcmx5IHBvaW50ZWQgb3V0CiAgdGhlIFBGX0lORVQgZml4IGZyb20gRmVicnVhcnkgMTkgYXMgYSBub3QtdmVyeS1nb29kIGZpeCBhcyBpdCBicm9rZSBJUHY2CiAgY2FwYWJpbGl0eSEgVGhhdCBwYXRjaCBpcyBub3cgcmV2ZXJ0ZWQuCgogIFRoZSBwcm9ibGVtIHdpdGggc2xvdyBuYW1lIGxvb2t1cHMgd2l0aCBnZXRhZGRyaW5mbygpIG9uIG5vbi1JUHY2IGVuYWJsZWQKICBob3N0cyBhcmUgaW5zdGVhZCBtYWRlIGJ5IGZpcnN0IGNoZWNraW5nIGlmIHRoZSBzdGFjayBpcyBJUHY2LWVuYWJsZWQgYW5kIGlmCiAgbm90LCB0aGUgUEZfSU5FVCBpcyB1c2VkIGFuZCBvdGhlcndpc2Ugd2UgZ28gd2l0aCB0aGUgZnVsbCBQRl9VTlNQRUMuCgotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgdGhhdCB3aGVuIHdlIHJldHVybiBhbiAiZXJyb3IiIGZyb20gYSBXUklURUZVTkNUSU9OCiAgYXMgZGVzY3JpYmVkIGluIHRoZSBtYW4gcGFnZSwgbGliY3VybCBkaWQgbm90IHJldHVybiB0aGUgZG9jdW1lbnRlZCBlcnJvcgogIGNvZGUgKENVUkxFX1dSSVRFX0VSUk9SKSBidXQgd291bGQgaW5zdGVhZCByZXR1cm4gQ1VSTEVfUkVBRF9FUlJPUi4gVGhpcyBpcwogIG5vdyBjb3JyZWN0ZWQuCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDIpCi0gU2V0dGluZyBDVVJMT1BUX1BPU1Qgd2l0aG91dCBzZXR0aW5nIENVUkxPUFRfUE9TVEZJRUxEUyBub3cgcmVhZCB0aGUgUE9TVC0KICBkYXRhIGZyb20gdGhlIGNhbGxiYWNrLgoKLSBUaGUgR09QSEVSIHN1cHBvcnQgc2VlbXMgdG8gYmUgYnJva2VuLiBJIGRvbid0IHRoaW5rIEknbGwgZXZlbiBzdGFydCBmaXhpbmcKICBpdCB1bnRpbCBzb21lb25lIGVsc2UgZmluZHMgb3V0Li4uIDotKQoKRGFuaWVsICgxMyBNYXJjaCAyMDAyKQotIFRyeWluZyAnY3VybCAtSSBmdHAuc3VuZXQuc2UnIG9yIHNpbWlsYXIgZGlkIGEgU0laRSBvbiBhIHNpbGx5ICIobmlsKSIKICBzdHJpbmcuIElmIHN1Y2ggYSBmaWxlIHdvdWxkIGJlIHByZXNlbnQsIGN1cmwgcmV0dXJuZWQgdGhlIHNpemUgb2YgaXQhIE5vdwogIHdlIHByZXZlbnQgdGhpcy4KCi0gQ3VybF9zZW5kZigpIHdhcyBmaXhlZCB0byBkZWFsIHdpdGggc2l0dWF0aW9uIHdoZXJlIEN1cmxfd3JpdGUoKSB3b3VsZCd2ZQogIGJsb2NrZWQgYW5kIHRodXMgcmV0dXJuIC0xLgoKLSBTZXR0aW5nIENVUkxPUFRfUFJPR1JFU1NGVU5DVElPTiB0byBOVUxMIG5vdyByZXN0b3JlcyB0aGUgaW50ZXJuYWwgZnVuY3Rpb24uCgotIEFsbCBDVVJMRk9STV8qIG9wdGlvbnMgY2FuIG5vdyBiZSB1c2VkIGluIGEgQ1VSTEZPUk1fQVJSQVkgZXhjZXB0IHRoZQogIENVUkxGT1JNX0FSUkFZIGl0c2VsZi4gVGhpcyB3YXMgbmVjZXNzYXJ5IHNpbmNlIHdlIGNvdWxkbid0IGV4cGFuZCB0aGUKICBDVVJMRk9STV8qIGxpc3QgcHJvcHJlbHkgYW5kIHVucmVzdHJpY3RlZCB1bnRpbCB0aGlzIHdhcyB0aGUgY2FzZS4gSXQgd2FzCiAgYWxzbyBhIGJpdCBwZWN1bGlhciB0byB1c2VycyB3aHkgc29tZSBvcHRpb25zIGNvdWxkIGJlIHVzZWQgaW4gYW4gYXJyYXkKICB3aGlsZSBvdGhlcnMgY291bGRuJ3QuCgotIFJlbW92ZWQgc29tZSBzaWxseSBDUkxGIGxpbmVzIHRoYXQgaGFkIGFjY2lkZW50YWxseSBzbGlwcGVkIGludG8gc3JjL21haW4uYwogIE5pY28gQmFnZ3VzIHBvaW50ZWQgdGhlbSBvdXQgdG8gbWUuCgpEYW5pZWwgKDExIE1hcmNoIDIwMDIpCi0gQ1VSTEZPUk1fRklMRU5BTUUgd2FzIGFkZGVkLiBUaGlzIGNhbiBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIGZpbGUgdXBsb2FkCiAgcGFydCwgdG8gc2V0IHRoZSAnZmlsZW5hbWUnIGZpZWxkIHRvIGEgY3VzdG9tIHZhbHVlLiBJZiB0aGlzIGlzbid0IHVzZWQsCiAgdGhlIGFjdHVhbGx5IHVzZWQgZmlsZW5hbWUgd2lsbCBiZSBpbmNsdWRlZCBpbnN0ZWFkIChhcyBsaWJjdXJsIGFsd2F5cyBoYXMKICBkb25lKS4gY3VybCB3YXMgYWRqdXN0ZWQgYWNjb3JkaW5nbHksIGFuZCBub3cgLUYgYWNjZXB0cyBhICdmaWxlbmFtZT0nIGZpZWxkCiAgdG9vLCBhbmQgYWxsb3dzIGNvbnN0cnVjdHMgc3VjaCBhczoKCiAgICAtRiAnbmFtZT1AZmlsZW5hbWU7ZmlsZW5hbWU9L2Rldi9udWxsJwoKICBhbmQgdGhpcyBjYW4gYmUgY29tYmluZWQgd2l0aCB0eXBlPSB0b28sIGluIGEgbWFubmVyIHNpbWlsYXIgdG86CgogICAtRiAiZmlsZT1AbG9nL3Rlc3QzOS50eHQ7ZmlsZW5hbWU9ZmFrZXJmaWxlO3R5cGU9bW9vL2Zvb2JhciIKCiAgVGVzdCBjYXNlIDM5IHdhcyBhZGRlZCB0byB2ZXJpZnkgdGhpcyBmdW5jdGlvbmFsaXR5LgoKLSBUaGUgc3RydWN0IGZvcm1lcmx5IGtub3duIGFzIEh0dHBQb3N0IGlzIG5vdyBuYW1lZCBjdXJsX2h0dHBwb3N0IHRvIHByb3Blcmx5CiAgdXNlIHRoZSBjdXJsIG5hbWUgc3BhY2UuIEkgYWRkZWQgYSAjZGVmaW5lIGZvciB0aGUgb2xkIG5hbWUgdG8gbWFrZSBleGlzdGluZwogIHByb2dyYW1zIGNvbXBpbGUgZXZlbiB3aGVuIHRoaXMgbmV3IGluY2x1ZGUgZmlsZSBpcyB1c2VkLgoKRGFuaWVsICg4IE1hcmNoIDIwMDIpCi0gQ2xpZmZvcmQgYWxzbyBkaXNjb3ZlcmVkIHRoYXQgaWYgdGhlIGNsaWVudCBjb2RlIGZhaWxlZCBlYXJseSwgYXMgd2hlbiBkb2luZwogICJjdXJsIC1PIiBvbmx5LCBpdCB3b3VsZCBkbyBmY2xvc2UoTlVMTCkgd2hpY2ggY2F1c2VkIGEgc2VnbWVudGF0aW9uIGZhdWx0CiAgb24gc29tZSBzeXN0ZW1zLgoKLSBDbGlmZm9yZCBXb2xmIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBtYWRlIC0tcHJvZ3Jlc3MtYmFyIHdvcmsgYWdhaW4uCgotIEkgY2xvc2VkIGJ1ZyByZXBvcnQgIzUyNzAzMiBieSBtYWtpbmcgc3VyZSB0aGF0IHdlIGFkZCBhIG5ld2xpbmUgYWZ0ZXIgYQogIHRyYW5zZmVyIHdoZW4gLS1wcm9ncmVzcy1iYXIgaGFzIGJlZW4gdXNlZC4gQmVmb3JlLCB3aXRob3V0IHRoZSBuZXdsaW5lLCBpdAogIG1hZGUgdGhlIHN1YnNlcXVlbnQgdGV4dCBjb21lIG91dCB3cm9uZy4KClZlcnNpb24gNy45LjUKCkRhbmllbCAoNyBNYXJjaCAyMDAyKQotIEFkZGVkIGRvY3MvS05PV05fQlVHUyB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICg2IE1hcmNoIDIwMDIpCi0gS2V2aW4gUm90aCBjb3JyZWN0ZWQgYSBmbGF3IGluIHRoZSBjdXJsIGNsaWVudCBnbG9iYmluZyBjb2RlIHRoYXQgbWFkZSBpdAogIG1lc3MgdXAgYmFja3NsYXNoZXMuIFRoaXMgd2FzIG1vc3Qgbm90YWJsZSBvbiB3aW5kb3dzIChjeWd3aW4pIG1hY2hpbmVzIHdoZW4KICB1c2luZyBmaWxlOi8vLgoKLSBCcmFkIHByb3ZpZGVkIGFub3RoZXIgZml4IGZvciBidWlsZGluZyBvdXRzaWRlIHRoZSBzb3VyY2UtdHJlZS4KCi0gUmFscGggTWl0Y2hlbGwgcGF0Y2hlZCBhd2F5IGEgZmV3IGNvbXBpbGVyIHdhcm5pbmdzIGluIHRlc3RzL3NlcnZlci9zd3MuYwoKRGFuaWVsICg1IE1hcmNoIDIwMDIpCi0gSSBub3RpY2VkIHRoYXQgdGhlIHR5cGVkZWYgaW4gY3VybC5oIGZvciB0aGUgcHJvZ3Jlc3MgY2FsbGJhY2sgcHJvdG90eXBlIHdhcwogIHdyb25nIGFuZCB0aHVzIGFwcGxpY2F0aW9ucyB0aGF0IHVzZWQgaXQgd291bGQgbm90IGdldCB0aGUgcHJvcGVyIGlucHV0CiAgZGF0YS4gSXQgdXNlZCBzaXplX3Qgd2hlcmUgdGhlIGltcGxlbWVudGF0aW9uIGFjdHVhbGx5IHVzZXMgZG91YmxlcyEKCiAgSSB3aXNoIEkgY291bGQgYmxhbWUgc29tZW9uZSBlbHNlLCBidXQgdGhpcyB3YXMgbXkgZmF1bHQuIEFnYWluLgoKVmVyc2lvbiA3LjkuNS1wcmU2CgpEYW5pZWwgKDQgTWFyY2ggMjAwMikKLSBDdXQgb2ZmIHRoZSBjaGFuZ2VzIGRvbmUgZHVyaW5nIDIwMDEgZnJvbSB0aGlzIGNoYW5nZWxvZyBmaWxlIGFuZCBwdXQgdGhlbQogIGluIGEgc2VwYXJhdGUgZmlsZSAoQ0hBTkdFUy4yMDAxKSwgYXZhaWxhYmxlIGZyb20gQ1ZTIG9mIGNvdXJzZS4KCi0gSSByZW1vdmVkIHRoZSBtdWx0aSBkaXJlY3RvcnkuIFRoZSBleGFtcGxlIHNvdXJjZXMgd2VyZSBtb3ZlZCB0byB0aGUKICBkb2NzL2V4YW1wbGVzIGRpcmVjdG9yeSB3aGVyZSB0aGV5IGJlbG9uZy4KCi0gV3JvdGUgNyBuZXcgbWFuIHBhZ2VzIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbnMgaW4gdGhlIG5ldyBtdWx0aSBpbnRlcmZhY2UuCiAgVGhleSdyZSBhbGwgc3RpbGwgcHJldHR5IGJhc2ljLCBidXQgd2UgY2FuIHVzZSB0aGVtIGFzIGEgc3RhcnQgYW5kIGFkZCBtb3JlCiAgY29udGVudHMgdG8gdGhlbSB3aGVuIHdlIGZpZ3VyZSBvdXQgd2hhdCB0byB3cml0ZS4gVGhlIGxhcmdlIGFtb3VudCBvZiBtYW4KICBwYWdlcyBmb3IgbGliY3VybCBub3cgcHJlc2VudCBtYWRlIG1lIGRlY2lkZSB0byBwdXQgdGhlbSBpbiBhIG5ldyBzZXBhcmF0ZQogIHN1YmRpcmVjdG9yeSBpbiB0aGUgZG9jcyBkaXJlY3RvcnkuIE5hbWVkIGxpYmN1cmwuCgotIEdpdXNlcHBlIENvcmJlbGxpIHByb3ZpZGVkIGEgdGVtcGxhdGUgZmlsZSBmb3IgdGhlIEVQTSBwYWNrYWdlIG1hbmFnZXIsIGl0CiAgZ2V0cyBnZW5lcmF0ZWQgbmljZWx5IGJ5IHRoZSBjb25maWd1cmUgc2NyaXB0IG5vdy4KClZlcnNpb24gNy45LjUtcHJlNQoKRGFuaWVsICgxIE1hcmNoIDIwMDIpCi0gTW92ZWQgdGhlIG1lbWFuYWx5emUucGwgc2NyaXB0IGludG8gdGhlIHRlc3RzLyBkaXIgYW5kIGFkZGVkIGl0IHRvIHRoZQogIHJlbGVhc2UgYXJjaGl2ZXMuIEl0IHdhcyBwcmV2aW91c2x5IG9ubHkgcHJlc2VudCBpbiB0aGUgQ1ZTIHRyZWUuCgotIE1vZGlmaWVkIHRoZSBGZWJydWFyeSAxN3RoIEhvc3Q6IGZpeCwgYXMgYnVnIHJlcG9ydCAjNTIzNzE4IHBvaW50ZWQgb3V0IHRoYXQKICBpdCBjYXVzZWQgY3Jhc2hlcyEKCi0gTmljbyBCYWdndXMgYWRkZWQgbW9yZSBlcnJvciBjb2RlcyB0byB0aGUgVk1TIHN0dWZmLgoKLSBXZXNsZXkgTGF4dG9uIGJyb3VnaHQgdGhlIGNvZGUgdGhhdCBpbnRyb2R1Y2VkIHRoZSBuZXcgQ1VSTE9QVF9QUkVRVU9URQogIG9wdGlvbi4gSXQgaXMganVzdCBhbm90aGVyIEZUUCBxdW90ZSBvcHRpb24gdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeQogIGEgbGlzdCBvZiBGVFAgY29tbWFuZHMgdG8gaXNzdWUgKmp1c3QgYmVmb3JlKiB0aGUgdHJhbnNmZXIgY29tbWFuZCAoUkVUUiBvcgogIFNUT1IgZXRjKS4gSXQgaGFzIHR1cm5lZCB1cCBhIGZldyBzeXN0ZW1zIHRoYXQgcmVhbGx5IG5lZWQgdGhpcy4KCiAgVGhlIGN1cmwgY29tbWFuZCBsaW5lIHRvb2wgY2FuIGFsc28gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBieSBwcmVmaXhpbmcgdGhlCiAgcXVvdGUgY29tbWFuZHMgd2l0aCBhIHBsdXMgKCspIGluIHNpbWlsYXIgc3R5bGUgdGhhdCBwb3N0IHRyYW5zZmVyIHF1b3RlCiAgY29tbWFuZHMgYXJlIHNwZWNpZmllZC4KCiAgVGhpcyBpcyBub3QgeWV0IGRvY3VtZW50ZWQuIFRoZXJlIGlzIG5vIHRlc3QgY2FzZSBmb3IgdGhpcyB5ZXQuCgpEYW5pZWwgKDI4IEZlYnJ1YXJ5IDIwMDIpCi0gUmFscGggTWl0Y2hlbGwgbWFkZSBzb21lIHNlcmlvdXMgZWZmb3J0cyBhbmQgcHV0IGEgbG90IG9mIHN3ZWF0IGluIHNldHRpbmcKICB1cCBzY3JpcHRzIGFuZCB0aGluZ3MgZm9yIG1lIHRvIGJlIGFibGUgdG8gcmVwZWF0IGhpcyBwcm9ibGVtcywgYW5kIEkKICBmaW5hbGx5IGNvdWxkLiAgSSBmb3VuZCBhIHByb2JsZW0gd2l0aCB0aGUgaGVhZGVyIGJ5dGUgY291bnRlciB0aGF0IHdhc24ndAogIGluY3JlYXNlZCBwcm9wZXJseSBhbmQgdGh1cyB3ZSBjb3VsZCByZXR1cm4gQ1VSTEVfR09UX05PVEhJTkcgd2hlbiB3ZSBpbgogIGZhY3QgaGFkIHJlY2VpdmVkIGRhdGEuCgpEYW5pZWwgKDI3IEZlYnJ1YXJ5IDIwMDIpCi0gSSBoYWQgdG8gcmV2ZXJ0IHRoZSBub24tc3BhY2UgcGFyc2luZyBjb29raWUgZml4IEkgcG9zdGVkIHRvIHRoZSBtYWlsaW5nCiAgbGlzdC4gRXhwaXJlIGRhdGVzIGRvIGhhdmUgc3BhY2VzIGFuZCBzdGlsbCBuZWVkIHRvIGdldCBwYXJzZWQgcHJvcGVybHkhCiAgSW5zdGVhZCB3ZSBqdXN0IGlnbm9yZSB0cmFpbGluZyB3aGl0ZSBzcGFjZSBhbmQgaXQgc2VlbXMgdG8gd29yay4uLgoKRGFuaWVsICgyNiBGZWJydWFyeSAyMDAyKQotIE1hZGUgdGhlIGNvb2tpZSBwcm9wZXJ0eSAnTWF4LUFnZScgd29yaywganVzdCBzaW5jZSB3ZSBhbHJlYWR5IHRyaWVkIHRvCiAgc3VwcG9ydCBpdCwgaXQgaXMgYmV0dGVyIHRvIGRvIGl0IHJpZ2h0LiBObyBvbmUgdXNlcyB0aGlzIGFueXdheS4KCi0gVGhlIGNvb2tpZSBwYXJzZXIgY291bGQgY3Jhc2ggaWYgYSByZWFsbHkgd2VpcmQgKGlsbGVnYWwpIGNvb2tpZSBsaW5lIHdhcwogIHJlY2VpdmVkLiBJIGFsc28gbWFkZSBpdCBiZXR0ZXIgZGlzY2FyZCByZWFsbHkgb2RkbHkgZm9ybWF0dGVkIGxpbmVzIGJldHRlci4KCiAgTWFkZSB0aGUgY29va2llIGphciBzdG9yZSB0aGUgc2Vjb25kIGZpZWxkIGZyb20gdGhlIGxlZnQgdXNpbmcgdGhlIHN5bnRheAogIHRoYXQgTmV0c2NhcGUgYW5kIE1vemlsbGEgcHJvYmFibHkgbGlrZS4gQ3VybCBpdHNlbGYgaWdub3JlcyBpdC4KCiAgQWRkZWQgdGVzdCBjYXNlIDMxIGZvciB0aGVzZSBjYXNlcy4KCiAgQ2xheSBMb3ZlbGVzcycgZW1haWwgcmVnYXJkaW5nIHNvbWUgY29va2llIGlzc3VlcyBzdGFydGVkIG15IGNsZWFudXAuCgotIEtldmluIFJvdGggcG9pbnRlZCBvdXQgdGhhdCBteSBhdXRvbWFrZSBmaWRkbGVzIGJyb2tlIHRoZSBhYmlsaXR5IHRvIGJ1aWxkCiAgb3V0c2lkZSB0aGUgc291cmNlLXRyZWUgYW5kIEkgcG9zdGVkIGEgcGF0Y2ggdG8gdGhlIG1haWxpbmcgbGlzdCB0aGF0IGJyaW5ncwogIHRoaXMgYWJpbGl0eSBiYWNrLgoKVmVyc2lvbiA3LjkuNS1wcmU0CgpEYW5pZWwgKDI1IEZlYnJ1YXJ5IDIwMDIpCi0gRmlkZGxlZCB3aXRoIHRoZSBhdXRvbWFrZSBmaWxlcyB0byBtYWtlIGFsbCBzb3VyY2UgZmlsZXMgaW4gdGhlIGxpYgogIGRpcmVjdG9yeSBub3QgaGF2ZSAuLi9zcmMgaW4gdGhlIGluY2x1ZGUgcGF0aCwgYW5kIHRoZSBzcmMgc291cmNlcyBzaG91bGRuJ3QKICBoYXZlIC4uL2xpYiEKCi0gQWxsIDc5IHRlc3QgY2FzZXMgcmFuIE9LIHVuZGVyIExpbnV4IGFuZCBTb2xhcmlzIHVzaW5nIHRoZSBuZXcgSFRUUCBzZXJ2ZXIKICBpbiB0aGUgdGVzdCBzdWl0ZS4gVGhlIG5ldyBIVFRQIHNlcnZlciB3YXMgZmlyc3QgZG9uYXRlZCBieSBHZW9yZyBIb3JuIGFuZAogIHN1YnNlcXVlbnRseSBtb2RpZmllZCB0byB3b3JrIHdpdGggdGhlIHRlc3Qgc3VpdGUuIEl0IGlzIGN1cnJlbnRseSBzdGlsbCBub3QKICBwb3J0YWJsZSBlbm91Z2ggdG8gcnVuIG9uICJhbGwgb3ZlciIgYnV0IHRoaXMgaXMgYSBzdGFydCBhbmQgSSBjYW4gcnVuIGFsbAogIGN1cmwgdGVzdHMgb24gbXkgbWFjaGluZXMuIFRoaXMgaXMgYW4gaW1wb3J0YW50IHJlcXVpcmVtZW50IGZvciB0aGUgdXBjb21pbmcKICBwdWJsaWMgcmVsZWFzZS4KCi0gVXNpbmcgLWQgYW5kIC1JIG9uIHRoZSBzYW1lIGNvbW1hbmQgbGluZSBub3cgcmVwb3J0cyBhbiBlcnJvciwgYXMgaXQgaW1wbGllcwogIHR3byBkaWZmZXJlbnQgSFRUUCByZXF1ZXN0cyB0aGF0IGNhbid0IGJlIG1peGVkLgoKLSBKZWZmcmV5IFBvaGxtZXllciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgbWFkZSB0aGUgLXcvLS13cml0ZS1vdXQgb3B0aW9uCiAgc3VwcG9ydCAle2NvbnRlbnRfdHlwZX0gdG8gZ2V0IHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlY2VudCBkb3dubG9hZC4KCi0gS2V2aW4gUm90aCByZXBvcnRlZCB0aGF0IHByZTIgYW5kIHByZTMgZGlkbid0IGNvbXBpbGUgcHJvcGVybHkgb24gY3lnd2luLAogIGFuZCB0aGlzIHdhcyBiZWNhdXNlIEkgdXNlZCAjaWZkZWYgSEFWRV9XSU5TT0NLX0ggaW4gbGliL211bHRpLmggdG8gZmlndXJlCiAgb3V0IGlmIHdlIGNvdWxkIGluY2x1ZGUgd2luc29jay5oIHdoaWNoIHR1cm5zIG91dCBub3QgdG8gYmUgYSB3aXNlIGNob2ljZSB0bwogIGRvIG9uIGN5Z3dpbiBzaW5jZSBpdCBoYXMgdGhlIGZpbGUgYnV0IGNhbid0IGluY2x1ZGUgaXQhCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDIpCi0gQWRkZWQgc3JjL2NvbmZpZy12bXMuaCB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKLSBGaXhlZCB0aGUgY29ubmVjdGlvbiB0aW1lb3V0IHZhbHVlIGFnYWluLCB0aGUgY2hhbmdlIGZyb20gRmVicnVhcnkgMTggd2Fzbid0CiAgY29tcGxldGUuCgpWZXJzaW9uIDcuOS41LXByZTMKCkRhbmllbCAoMjEgRmVicnVhcnkgMjAwMikKLSBLZXZpbiBSb3RoIGFuZCBBbmRy6XMgR2FyY+1hIGJvdGggZm91bmQgb3V0IHRoYXQgbGliL2NvbmZpZy5oLmluIHdhcyBtaXNzaW5nCiAgaW4gdGhlIHByZS1yZWxlYXNlIGFyY2hpdmUgYW5kIHRodXMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmFpbGVkLgoKVmVyc2lvbiA3LjkuNS1wcmUyCgpEYW5pZWwgKDIwIEZlYnJ1YXJ5IDIwMDIpCi0gQW5kculzIEdhcmPtYSBwcm92aWRlZCBhIHNvbHV0aW9uIHRvIGJ1ZyByZXBvcnQgIzUxNTIyOC4gdGhlIHRvdGFsIHRpbWUKICBjb3VudGVyIHdhcyBub3Qgc2V0IGNvcnJlY3RseSB3aGVuIC1JIHdhcyB1c2VkIGR1cmluZyBzb21lIGNvbmRpdGlvbnMgKGFsbAogIGhlYWRlcnMgd2VyZSByZWFkIGluIG9uZSBzaW5nbGUgcmVhZCkuCgotIE5pY28gQmFnZ3VzIHByb3ZpZGVkIGEgaHVnZSBwYXRjaCB3aXRoIG1pbm9yIHR3ZWFrcyBhbGwgb3ZlciB0byBtYWtlIGN1cmwKICBjb21waWxlIG5pY2VseSBvbiBWTVMuCgpEYW5pZWwgKDE5IEZlYnJ1YXJ5IDIwMDIpCi0gUmljayBSaWNoYXJkc29uIGZvdW5kIG91dCB0aGF0IGJ5IHJlcGxhY2luZyBQRl9VTlNQRUMgd2l0aCBQRl9JTkVUIGluIHRoZQogIGdldGFkZHJpbmZvKCkgY2FsbHMsIGhlIGNvdWxkIHNwZWVkIHVwIHNvbWUgbmFtZSByZXNvbHZpbmcgY2FsbHMgd2l0aCBhbgogIG9yZGVyIG9mIG1hZ25pdHVkZXMgb24gaGlzIFJlZGhhdCBMaW51eCA3LjIuCgotIFBoaWxpcCBHbGFkc3RvbmUgZm91bmQgYSBzZWNvbmQgSU5BRERSX05PTkUgcHJvYmxlbSB3aGVyZSB3ZSB1c2VkIGxvbmcKICBpbnRlYWQgb2YgaW5fYWRkcl90IHdoaWNoIGNhdXNlZCA2NGJpdCBwcm9ibGVtb3MuIFdlIHJlYWxseSBzaG91bGRuJ3QgZGVmaW5lCiAgdGhhdCBvbiB0d28gZGlmZmVyZW50IHBsYWNlcy4KCkRhbmllbCAoMTggRmVicnVhcnkgMjAwMikKLSBQaGlsaXAgR2xhZHN0b25lIGZvdW5kIGEgcHJvYmxlbSBpbiBob3cgSFRUUCByZXF1ZXN0cyB3ZXJlIHNlbnQgaWYgdGhlCiAgcmVxdWVzdCBjb3VsZG4ndCBiZSBzZW50IGFsbCBhdCBvbmNlLgoKLSBFbWlsIGZvdW5kIGFuZCBjb3JyZWN0ZWQgYSBiYWQgY29ubmVjdGlvbiB0aW1lb3V0IGNvbXBhcmlzb24gdGhhdCBtYWRlIGN1cmwKICB1c2UgdGhlIGxvbmdlc3Qgb2YgY29ubmVjdC10aW1lb3V0IGFuZCB0aW1vdXQgYXMgYSB0aW1lb3V0IHZhbHVlLCBpbnN0ZWFkIG9mCiAgdGhlIHNob3J0ZXN0IGFzIGl0IHdhcyBzdXBwb3NlZCB0byEKCi0gQXJvbiBSb2JlcnRzIHByb3ZpZGVkIHVwZGF0ZWQgaW5mb3JtYXRpb24gYWJvdXQgTERBUCBVUkwgc3ludGF4IHRvIGdvIGludG8KICB0aGUgbWFudWFsIGFzIGEgcmVwbGFjZW1lbnQgZm9yIHRoZSBvbGQgcmVmZXJlbmNlcy4KCkRhbmllbCAoMTcgRmVicnVhcnkgMjAwMikKLSBQaGlsaXAgR2xhZHN0b25lIHBvaW50ZWQgb3V0IHR3byBtaXNzaW5nIGluY2x1ZGUgZmlsZXMgdGhhdCBtYWRlIGN1cmwgY29yZQogIGR1bXAgb24gNjRiaXQgYXJjaGl0ZWN0dXJlcy4gV2UgbmVlZCB0byBwYXkgbW9yZSBhdHRlbnRpb24gb24gdGhlc2UgZGV0YWlscy4KICBJdCBpcyAqbGV0aGFsKiB0byBmb3IgZXhhbXBsZSBmb3JnZXQgdGhlIG1hbGxvYygpIHByb3RvdHlwZSwgYXMgJ2ludCcgaXMKICAzMmJpdCBhbmQgbWFsbG9jKCkgbXVzdCByZXR1cm4gYSA2NGJpdCBwb2ludGVyIG9uIHRoZXNlIHBsYXRmb3Jtcy4KCi0gR2lhc2xhcyBHZW9yZ2lvcyBmaXhlZCBhIHByb2JsZW0gd2l0aCBIb3N0OiBoZWFkZXJzIG9uIHJlcGVhdGVkIHJlcXVlc3RzIG9uCiAgdGhlIHNhbWUgaGFuZGxlIHVzaW5nIGEgcHJveHkuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMikKLSBIYW5ubyBMLiBLcmFuemhvZmYgYWNjdXJhdGVseSBmb3VuZCBvdXQgdGhhdCBkaXNhYmxpbmcgdGhlIEV4cGVjdDogaGVhZGVyCiAgd2hlbiBkb2luZyBtdWx0aXBhcnQgZm9ybXBvc3RzIGRpZG4ndCB3b3JrIHZlcnkgd2VsbC4gSXQgZGlzYWJsZWQgb3RoZXIKICBwYXJ0cyBvZiB0aGUgcmVxdWVzdCBoZWFkZXIgdG9vLCByZXN1bHRpbmcgaW4gYSBicm9rZW4gaGVhZGVyLiBXaGVuIEkgZml4ZWQKICB0aGlzLCBJIGFsc28gbm90aWNlZCB0aGF0IHRoZSBDb250ZW50LVR5cGUgd2Fzbid0IHBvc3NpYmxlIHRvIGRpc2FibGUuIEl0IGlzCiAgbm93LCBldmVuIHRob3VnaCBpdCBwcm9iYWJseSBpcyByZWFsbHkgc3R1cGlkIHRvIHRyeSB0byBkbyB0aGlzIChiZWNhdXNlIG9mCiAgdGhlIGJvdW5kYXJ5IHN0cmluZyB0aGF0IGlzIGluY2x1ZGVkIGluIHRoZSBpbnRlcm5hbGx5IGdlbmVyYXRlZCBoZWFkZXIsCiAgdXNlZCBhcyBmb3JtIHBhcnQgc2VwYXJhdG9yLikKCkRhbmllbCAoNyBGZWJydWFyeSAyMDAyKQotIEkgbW92ZWQgdGhlIGNvbmZpZyouaCBmaWxlcyBmcm9tIHRoZSByb290IGRpcmVjdG9yeSB0byB0aGUgbGliLyBkaXJlY3RvcnkuCgotIEkndmUgYWRkZWQgdGhlIG5ldyB0ZXN0IHN1aXRlIEhUVFAgc2VydmVyIHRvIHRoZSBDVlMgcmVwb3NpdG9yeSwgSXQgc2VlbXMgdG8KICB3b3JrIHByZXR0eSBnb29kIG5vdywgYnV0IHdlIG11c3QgbWFrZSBpdCBnZXQgdXNlZCBieSB0aGUgdGVzdCBzY3JpcHRzCiAgcHJvcGVybHkgYW5kIHRoZW4gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBpdCBjb21waWxlcywgYnVpbGRzIGFuZCBydW5zIG9uCiAgbW9zdCBvcGVyYXRpbmcgc3lzdGVtcy4KClZlcnNpb24gNy45LjUtcHJlMQoKRGFuaWVsICg2IEZlYnJ1YXJ5IDIwMDIpCi0gTWlrbG9zIE5lbWV0aCBwcm92aWRlZCB1cGRhdGVkIHdpbmRvd3MgbWFrZWZpbGVzIGFuZCBJTlNUQUxMIGRvY3MuCgotIE1yIExhcnJ5IEZhaG5vZSBmb3VuZCBhIHByb2JsZW0gd2l0aCBmb3JtcG9zdHMgYW5kIEkgbWFuYWdlZCB0byB0cmFjayBkb3duCiAgYW5kIHBhdGNoIHRoaXMgYnVnLiBUaGlzIHdhcyBhY3R1YWxseSB0d28gYnVncywgYXMgdGhlIHBvc3RlZCBzaXplIHdhcyBhbHNvCiAgc2FpZCB0byBiZSB0d28gYnl0ZXMgdG9vIGxhcmdlLgoKLSBCcmVudCBCZWFyZHNsZXkgZm91bmQgb3V0IGFuZCBicm91Z2h0IGEgY29ycmVjdGlvbiBmb3IgdGhlCiAgQ1VSTElORk9fQ09OVEVOVF9UWVBFIHBhcnNlciB0aGF0IHdhcyBvZmYgb25lIGJ5dGUuIFRoaXMgd2FzIG15IGZhdWx0LCBJCiAgYWNjaWRlbnRhbHkgYnJva2UgR2lhc2xhcyBHZW9yZ2lvcycgcGF0Y2guCgpEYW5pZWwgKDUgRmVicnVhcnkgMjAwMikKLSBLZXZpbiBSb3RoIGZvdW5kIHlldCBhbm90aGVyIFNTTCBkb3dubG9hZCBwcm9ibGVtLgoKVmVyc2lvbiA3LjkuNAoKLSBubyBjaGFuZ2VzIHNpbmNlIHByZS1yZWxlYXNlCgpWZXJzaW9uIDcuOS40LXByZTIKCkRhbmllbCAoMyBGZWJydWFyeSAyMDAyKQotIEVyaWMgTWVsdmlsbGUgcHJvdmlkZWQgYSBmZXcgc3BlbGxpbmcgY29ycmVjdGlvbnMgaW4gdGhlIGN1cmwgbWFuIHBhZ2UuCgpEYW5pZWwgKDEgRmVicnVhcnkgMjAwMikKLSBBbmRyZWFzIERhbW0gY29ycmVjdGVkIHRoZSB1bmNvbmRpdGlvbmFsIHVzZSBvZiBnbXRpbWUoKSBpbiBnZXRkYXRlLCBpdCBub3cKICB1c2VzIGdtdGltZV9yKCkgb24gYWxsIGhvc3RzIHRoYXQgaGF2ZSBpdC4KCkRhbmllbCAoMzEgSmFudWFyeSAyMDAyKQotIEFuIGFub255bW91cyBidWcgcmVwb3J0IGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIHRoZSBETlMgY2FjaGluZyB3aGljaCBtYWRlIGl0CiAgc29tZXRpbWVzIGFsbG9jYXRlIG9uZSBieXRlIHRvbyBsaXR0bGUgdG8gc3RvcmUgdGhlIGNhY2hlIGVudHJ5IGluLiBUaGlzCiAgaGFwcGVuZWQgd2hlbiB0aGUgcG9ydCBudW1iZXIgc3RhcnRlZCB3aXRoIDEhCgotIEFsYmVydCBDaGluIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBpbXByb3ZlcyB0aGUgZ2V0aG9zdGJ5bmFtZV9yKCkgY29uZmlndXJlCiAgY2hlY2sgb24gSFAtVVggMTEuMDAuCgpWZXJzaW9uIDcuOS40LXByZTEKCkRhbmllbCAoMzAgSmFudWFyeSAyMDAyKQotIEdlb3JnIEhvcm4gZm91bmQgYW5vdGhlciB3YXkgdGhlIFNTTCByZWFkaW5nIGZhaWxlZCBkdWUgdG8gdGhlIG5vbi1ibG9ja2luZwogIHN0YXRlIG9mIHRoZSBzb2NrZXRzISBJIGZpeGVkLgoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDIpCi0gTXVsdGlwYXJ0IGZvcm1wb3N0cyBub3cgc2VuZCB0aGUgZnVsbCByZXF1ZXN0IHByb3Blcmx5LCBpbmNsdWRpbmcgdGhlIENSTEYuCiAgVGhleSB3ZXJlIHByZXZpb3VzbHkgdHJlYXRlZCBhcyBwYXJ0IG9mIHRoZSBwb3N0IGRhdGEuCgotIFRoZSB1cGxvYWQgYnl0ZSBjb3VudGVyIGJ1Z2dlZC4KCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCB0aGF0IHdlIHNlZWQgU1NMIG9uIGV2ZXJ5IGNvbm5lY3QsIHdoaWNoIGlzIGEgdGltZS0KICBjb25zdW1pbmcgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIG9ubHkgYmUgbmVlZGVkIHRvIGRvIG9uY2UuIFdlIHBhdGNoZWQKICBsaWJjdXJsIHRvIG5vdyBvbmx5IHNlZWQgb24gdGhlIGZpcnN0IGNvbm5lY3Qgd2hlbiB1bnNlZWRlZC4gVGhlIHNlZWRlZAogIHN0YXR1cyBpcyBnbG9iYWwgc28gaXQnbGwgbm93IG9ubHkgaGFwcGVuIG9uY2UgZHVyaW5nIGEgcHJvZ3JhbSdzIGxpZmUgdGltZS4KCiAgSWYgdGhlIHJhbmRvbV9maWxlIG9yIGVnZHNvY2tldCBpcyBzZXQsIHRoZSBzZWVkIHdpbGwgYmUgcmUtbWFkZSB0aG91Z2guCgotIEdpYXNsYXMgR2Vvcmdpb3MgaW50cm9kdWNlZCBDVVJMSU5GT19DT05URU5UX1RZUEUgdGhhdCBsZXRzCiAgY3VybF9lYXN5X2dldGluZm8oKSByZWFkIHRoZSBjb250ZW50LXR5cGUgZnJvbSB0aGUgcHJldmlvdXMgcmVxdWVzdC4KCkRhbmllbCAoMjggSmFudWFyeSAyMDAyKQotIEtqZXRpbCBKYWNvYnNlbiBmb3VuZCBhIHdheSB0byBjcmFzaCBjdXJsIGFuZCBhZnRlciBtdWNoIGRlYnVnZ2luZywgaXQKICB0dXJuZWQgb3V0IGl0IHdhcyBhIElQdjQtbGludXggb25seSBwcm9ibGVtIGludHJvZHVjZWQgaW4gNy45LjMgcmVsYXRlZCB0bwogIG5hbWUgcmVzb2x2aW5nLgoKLSBBbmRyZWFzIERhbW0gcG9zdGVkIGEgaHVnZSBwYXRjaCB0aGF0IG1hZGUgdGhlIGN1cmxfZ2V0ZGF0ZSgpIGZ1bmN0aW9uIGZ1bGx5CiAgcmVlbnRyYW50IQoKLSBTdGV2ZSBNYXJ4IHBvaW50ZWQgb3V0IHRoYXQgeW91IGNvdWxkbid0IG1peCBDVVJMT1BUX0NVU1RPTVJFUVVFU1Qgd2l0aAogIENVUkxPUFRfUE9TVEZJRUxEUy4gWW91IGNhbiBub3chCgpEYW5pZWwgKDI1IEphbnVhcnkgMjAwMikKLSBLcmlzaG5lbmR1IE1hanVtZGFyIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGhlYWRlciBsZW5ndGggY291bnRlciB3YXMgbm90IHJlc2V0CiAgYmV0d2VlbiBtdWx0aXBsZSByZXF1ZXN0cyBvbiB0aGUgc2FtZSBoYW5kbGUuCgotIFBlZHJvIE5ldmVzIHJpZ2h0ZnVsbHkgcXVlc3Rpb25lZCB3aHkgY3VybCBhbHdheXMgYXBwZW5kIFxyXG4gdG8gdGhlIGRhdGEKICB0aGF0IGlzIHNlbnQgaW4gSFRUUCBQT1NUIHJlcXVlc3RzLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGJyb2tlIHRoZSB0ZXN0IHN1aXRlCiAgYXMgdGhlIHRlc3QgSFRUUCBzZXJ2ZXIgaXMgbGFtZSBlbm91Z2ggbm90IHRvIGRlYWwgd2l0aCB0aGlzLi4uIDotTwoKLSBGb2xsb3dpbmcgTG9jYXRpb246IGhlYWRlcnMgd2hlbiB0aGUgY29ubmVjdGlvbiBkaWRuJ3QgY2xvc2UgZGlkbid0IHdvcmsgYXMKICBsaWJjdXJsIGRpZG4ndCBwcm9wZXJseSBzdG9wIHJlYWRpbmcuIFRoaXMgcHJvYmxlbSB3YXMgYWRkZWQgaW4gNy45LjMgZHVlIHRvCiAgdGhlIHJlc3RydWN0dXJlZCBpbnRlcm5hbHMuICdGcmFuaycgcG9zdGVkIGEgYnVnIHJlcG9ydCBhYm91dCB0aGlzLgoKRGFuaWVsICgyNCBKYW51YXJ5IDIwMDIpCi0gS2V2aW4gUm90aCB2ZXJ5IHF1aWNrbHkgc3BvdHRlZCB0aGF0IHdlIHdyb25nbHkgaW5zdGFsbGVkIHRoZSBleGFtcGxlCiAgcHJvZ3JhbXMgdGhhdCB3ZXJlIGJ1aWx0IGluIHRoZSBtdWx0aSBkaXJlY3RvcnksIHdoZW4gJ21ha2UgaW5zdGFsbCcgd2FzCiAgdXNlZC4gOi0vCgpWZXJzaW9uIDcuOS4zCgpEYW5pZWwgKDIzIEphbnVhcnkgMjAwMikKLSBBbmRy6XMgR2FyY+1hIGZvdW5kIGEgcGVyc2lzdGFuY3kgcHJvYmxlbSB3aGVuIGRvaW5nIEhUVFAgSEVBRCwgdGhhdCBtYWRlCiAgY3VybCAiaGFuZyIgdW50aWwgdGhlIGNvbm5lY3Rpb24gd2FzIGNsb3NlZCBieSB0aGUgc2VydmVyLiBUaGlzIHByb2JsZW0gaGFzCiAgYmVlbiBpbnRyb2R1Y2VkIGluIDcuOS4zIGR1ZSB0byBpbnRlcm5hbCByZXdyaXRlcywgdGhpcyB3YXMgbm90IHByZXNlbnQgaW4KICA3LjkuMi4KClZlcnNpb24gNy45LjMtcHJlNAoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDIpCi0gQW50b25pbyBmaWxlZCBidWcgcmVwb3J0ICM1MDU1MTQgYW5kIHByb3ZpZGVkIGEgZml4ISBXaGVuIGRvaW5nIG11bHRpcGFydAogIGZvcm1wb3N0cywgbGliY3VybCB3b3VsZCBpbmNsdWRlIGFuIGVycm9yIHRleHQgaW4gdGhlIGFjdHVhbCBwb3N0IGlmIGEKICBzcGVjaWZpZWQgZmlsZSB3YXNuJ3QgZm91bmQuIFRoaXMgaXMgbm90IGxpYmN1cmwncyBqb2IuIEluc3RlYWQgd2UgYWRkIGFuCiAgZW1wdHkgcGFydC4KCkRhbmllbCAoMTggSmFudWFyeSAyMDAyKQotIFBsYXllZCBhcm91bmQgd2l0aCBzdHJpY3RlciBjb21waWxlciB3YXJuaW5ncyBmb3IgZ2NjICh3aGVuIC4vY29uZmlndXJlCiAgLS1lbmFibGUtZGVidWcgaXMgdXNlZCkgYW5kIGNoYW5nZWQgc29tZSBtaW5vciB0aGluZ3MgdG8gc3RvcCB0aGUgd2FybmluZ3MuCgotIENvbW1lbnRlZCBvdXQgdGhlICdsb25nIGxvbmcnIGFuZCAnbG9uZyBkb3VibGUnIGNoZWNrcyBpbiBjb25maWd1cmUuaW4sIGFzCiAgd2UgZG9uJ3QgY3VycmVudGx5IHVzZSB0aGVtIGFueXdheSBhbmQgdGhlIGNvZGUgaW4gbGliL21wcmludGYuYyB0aGF0IHVzZQogIHRoZW0gY2F1c2VzIHdhcm5pbmdzLgoKLSBTYXVsIEdvb2QgYW5kIGpvbmF0YW4gcG9pbnRlZCBvdXQgTWFjIE9TIFggYnVpbGQgcHJvYmxlbXMgd2l0aCBwcmUzIGFuZCBob3cKICB0byBjb3JyZWN0IHRoZW0uIFR3byBjb21waWxlciB3YXJuaW5ncyB3ZXJlIHJlbW92ZWQgYXMgd2VsbC4KCi0gQW5kculzIEdhcmPtYSBmaXhlZCB0d28gbWlub3IgbWluZ3czMiBidWlsZGluZyBwcm9ibGVtcy4KClZlcnNpb24gNy45LjMtcHJlMwoKRGFuaWVsICgxNyBKYW51YXJ5IDIwMDIpCi0gZG9jcy9saWJjdXJsLXRoZS1ndWlkZSBpcyBhIG5ldyB0dXRvcmlhbCBmb3Igb3VyIGxpYmN1cmwgcHJvZ3JhbW1pbmcKICBmcmllbmRzLgoKLSBSaWNoYXJkIEFyY2hlciBicm91Z2h0IGJhY2sgdGhlIGFiaWxpdHkgdG8gY29tcGlsZSBhbmQgYnVpbGQgd2l0aCBPcGVuU1NMCiAgdmVyc2lvbnMgYmVmb3JlIDAuOS41LgogIFtodHRwOi8vc291cmNlZm9yZ2UubmV0L3RyYWNrZXIvP2Z1bmM9ZGV0YWlsJmF0aWQ9MTAwOTc2JmFpZD01MDQxNjMmZ3JvdXBfaWQ9OTc2XQoKLSBUaGUgRE5TIGNhY2hlIGNvZGUgZGlkbid0IHRha2UgdGhlIHBvcnQgbnVtYmVyIGludG8gYWNjb3VudCwgd2hpY2ggbWFkZSBpdAogIHdvcmsgcmF0aGVyIGJhZCBvbiBJUHY2LWVuYWJsZWQgaG9zdHMgKGVzcGVjaWFsbHkgd2hlbiBkb2luZyBwYXNzaXZlCiAgRlRQKS4gU3RlcmxpbmcgZml4ZWQgaXQuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwMikKLSBHZW9yZyBIb3JuIGNvdWxkIG1ha2UgYSB0cmFuc2ZlciB0aW1lLW91dCB3aXRob3V0IGVycm9yIHRleHQuIEkgZm91bmQgaXQgYW5kCiAgY29ycmVjdGVkIGl0LgoKLSBTU0wgd3JpdGVzIGRpZG4ndCB3b3JrLCB0aGV5IHJldHVybiBhbiB1bmluaXRpYWxpemVkIHZhbHVlIHRoYXQgY2F1c2VkCiAgaGF2b2MgYWxsIG92ZXIuIEdlb3JnIEhvcm4gZXhwZXJpZW5jZWQgdGhpcy4KCi0gS2V2aW4gUm90aCBwYXRjaGVkIHRoZSBjdXJsX3ZlcnNpb24oKSBmdW5jdGlvbiB0byB1c2UgdGhlIHByb3BlciBPcGVuU1NMCiAgZnVuY3Rpb24gZm9yIHZlcnNpb24gaW5mb3JtYXRpb24uIFRoaXMgd2F5LCBjdXJsIHdpbGwgcmVwb3J0IHRoZSB2ZXJzaW9uIG9mCiAgdGhlIFNTTCBsaWJyYXJ5IGFjdHVhbGx5IHJ1bm5pbmcgcmlnaHQgbm93LCBub3QgdGhlIG9uZSB0aGF0IGhhZCBpdHMgaGVhZGVycwogIGluc3RhbGxlZCB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0LiBNYWlubHkgaW50ZXJzdGluZyB3aGVuIHJ1bm5pbmcgd2l0aCBzaGFyZWQKICBPcGVuU1NMIGxpYnJhcmllcy4gIAoKVmVyc2lvbiA3LjkuMy1wcmUyCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwMikKLSBNb2ZpZWQgdGhlIG1haW4gdHJhbnNmZXIgbG9vcCBhbmQgcmVsYXRlZCBzdHVmZiB0byBkZWFsIHdpdGggbm9uLWJsb2NraW5nCiAgc29ja2V0cyBpbiB0aGUgdXBsb2FkIHNlY3Rpb24uIFdoaWxlIGRvaW5nIHRoaXMsIEkndmUgbm93IHNlcGFyYXRlZCB0aGUKICBjb25uZWN0aW9uIG9yaWVudGVkIGJ1ZmZlcnMgdG8gaGF2ZSBvbmUgZm9yIGRvd25sb2FkcyBhbmQgb25lIGZvciB1cGxvYWRzCiAgKGFzIHR3byBjYW4gaGFwcGVuIHNpbXVsdGFuZW91c2x5KS4gSSBhbHNvIHNocnVuayB0aGUgYnVmZmVycyB0byAyMEsKICBlYWNoLiBBcyB3ZSBoYXZlIGEgc2NyYXRjaCBidWZmZXIgdHdpY2UgdGhlIHNpemUgb2YgdGhlIHVwbG9hZCBidWZmZXIsIHdlCiAgYXJyaXZlZCBhdCA4MEsgZm9yIGJ1ZmZlcnMgY29tcGFyZWQgd2l0aCB0aGUgcHJldmlvdXMgMTUwSy4KCi0gQWRkZWQgdGhlIC0tY2Mgb3B0aW9uIHRvIGN1cmwtY29uZmlnIGNvbW1hbmQgYXMgaXQgZW5hYmxlcyBzbyB2ZXJ5IGNvb2wKICBvbmUtbGluZXJzLiBIYXZlIGEgZ28gYSB0aGlzIG9uZSwgYnVpbGRpbmcgdGhlIHNpbXBsZS5jIGV4YW1wbGU6CgogICAgICAgICQgYGN1cmwtY29uZmlnIC0tY2MgLS1jZmxhZ3MgLS1saWJzYCAtbyBleGFtcGxlIHNpbXBsZS5jCgpEYW5pZWwgKDE0IEphbnVhcnkgMjAwMikKLSBJIG1hZGUgYWxsIHNvY2tldCByZWFkcyAocmVjdikgaGFuZGxlIEVXT1VMREJMT0NLLiBJIGhvcGUgbmljZWx5LiBOb3cgd2UKICBvbmx5IG5lZWQgdG8gYWRkcmVzcyBhbGwgd3JpdGVzIChzZW5kKSB0b28gYW5kIHRoZW4gSSdtIHJlYWR5IGZvciBhbm90aGVyCiAgcHJlLXJlbGVhc2UuLi4KCi0gU3RvbmVkIEVsaXBvdCBwYXRjaGVkIHRoZSBpbl9hZGRyX3QgY29uZmlndXJlIHRlc3QgdG8gbWFrZSBpdCB3b3JrIGJldHRlciBvbgogIG1vcmUgcGxhdGZvcm1zLgoKRGFuaWVsICg5IEphbnVhcnkgMjAwMikKLSBDcmlzIEJhaWxpZmYgZm91bmQgb3V0IHRoYXQgZmlsbGluZyB1cCBjdXJsJ3MgU1NMIHNlc3Npb24gY2FjaGUgY2F1c2VkIGEKICBjcmFzaCEKCi0gUG9zdGVkIHRoZSBjdXJsIHF1ZXN0aW9ubmFpcmUgb24gdGhlIHdlYiBzaXRlLiBJZiB5b3UgaGF2ZW4ndCBwb3N0ZWQgeW91cgogIG9waW5pb25zIHRoZXJlIHlldCwgZ28gdGhlcmUgYW5kIGRvIGl0IG5vdyB3aGlsZSBpdCBpcyBzdGlsbCB0aGVyZToKCiAgICAgICAgaHR0cDovL2N1cmwuaGF4eC5zZS9xLwoKLSBHZW9yZyBIb3JuIHF1aWNrbHkgZm91bmQgb3V0IHRoYXQgdGhlIFNTTCByZWFkaW5nIG5vIGxvbmdlciB3b3JrZWQgYXMKICBzdXBwb3NlZCBzaW5jZSB0aGUgc3dpdGNoIHRvIG5vbi1ibG9ja2luZyBzb2NrZXRzLiBJJ3ZlIG1hZGUgYSBxdWljayBwYXRjaAogIChmb3IgcmVhZGluZyBvbmx5KSBidXQgd2Ugc2hvdWxkIGltcHJvdmUgaXQgZXZlbiBmdXJ0aGVyLgoKVmVyc2lvbiA3LjkuMy1wcmUxCgpEYW5pZWwgKDcgSmFudWFyeSAyMDAyKQotIEkgbWFkZSB0aGUgJ2Jvb2wnIHR5cGVkZWYgdXNlIGFuICJ1bnNpZ25lZCBjaGFyIi4gSXQgbWFrZXMgaXQgdGhlIHNhbWUgb24KICBhbGwgcGxhdGZvcm1zLCBubyBtYXR0ZXIgd2hhdCB0aGUgcGxhdGZvcm0gdGhpbmtzIHRoZSBkZWZhdWx0IGZvcm1hdCBmb3IKICBjaGFyIGlzLiBUaGlzIHdhcyBub3RpY2VkIHNpbmNlIHdlIG1hZGUgYSBzaWxseSBjb21wYXJpc29uIGludm9sdmluZyBzdWNoIGEKICBib29sIHZhcmlhYmxlLCBhbmQgb25seSBvbmUgY29tcGlsZXIvcGxhdGZvcm0gY29tYmluYXRpb24gKG9uIERlYmlhbiBMaW51eCkKICBjb21wbGFpbmVkIGFib3V0IGl0ICh0aGF0IGhhcHBlbmVkIHRvIGhhdmUgaXRzIGNoYXIgdW5zaWduZWQgYnkgZGVmYXVsdCkuCgotIEJ1ZyByZXBvcnQgIzQ5NTI5MCBpZGVudGlmaWVkIGEgY29va2llIHBhcnNpbmcgcHJvYmxlbSB0aGF0IHdhcyBjb3JyZWN0ZWQuCiAgV2hlbiBhIFNldC1Db29raWU6IGxpbmUgaXMgcmVjZWl2ZWQgd2l0aG91dCBhIHRyYWlsaW5nIHNlbWljb2xvbiwgbGliY3VybAogIGRpZG4ndCByZWFkIHRoZSBsYXN0ICJuYW1lPXZhbHVlIiBwYWlyIG9mIHRoZSBsaW5lLCBsZWFkaW5nIHRvIGNvbmZ1c2lvbnMuLi4KCi0gU3RlcmxpbmcgY29tbWl0dGVkIGhpcyB1cGRhdGVkIEROUyBjYWNoZSBjb2RlLgoKLSBJIHdvcmtlZCB3aXRoIEdlb3JnIEhvcm4gYW5kIGNvbW1lbnRzIGZyb20gR/Z0eiBCYWJpbi1FYmVsbCBhbmQgc3dpdGNoZWQKICBjdXJsJ3Mgc29ja2V0IG9wZXJhdGlvbnMgY29tcGxldGVseSBvdmVyIHRvIG5vbi1ibG9ja2luZyBmb3IgdGhlIGVudGlyZQogIG9wZXJhdGlvbiAocHJldmlvdXNseSB3ZSB1c2VkIG5vbi1ibG9ja2luZyBvbmx5IGZvciB0aGUgY29ubmVjdGlvbiBwaGFzZSkuCiAgV2UgaGFkIHRvIGRvIHRoaXMgdG8gbWFrZSB0aGUgU1NMIGNvbm5lY3Rpb24gcGhhc2UgdGltZW91dCBwcm9wZXJseSB3aXRob3V0CiAgdGhlIHVzZSBvZiBzaWduYWxzLiBBIGxpdHRsZSBleHRyYSBjb2RlIHRvIGRlYWwgd2l0aCB0aGlzIHdhcyBhZGRlZC4KCi0gVC4gQmhhcmF0aCBwb2ludGVkIG91dCBhIHNsaWdodGx5IG9ic2N1cmUgY29va2llIGVuZ2luZSBmbGF3LgoKLSBQZXRlIFN1IHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCBkaWRuJ3QgdHJlYXQgSFRUUCBjb2RlIDIwNCBhcyBpdCBzaG91bGQuCiAgMjA0LXJlcGxpZXMgbmV2ZXIgcHJvdmlkZXMgYSByZXNwb25zZS1ib2R5LiBUaGlzIHJlc3VsdGVkIGluIGJhZCBwZXJzaXN0YW50CiAgYmVoYXZpb3Igd2hlbiAyMDQgd2FzIHJlY2VpdmVkLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwMikKLSBTTSB1cGRhdGVkIHRoZSBWQysrIGxpYnJhcnkgTWFrZWZpbGVzIGZvciB0aGUgbmV3IHNvdXJjZSBmaWxlcy4KCkRhbmllbCAoNCBKYW51YXJ5IDIwMDIpCi0gSSBkaXNjb3ZlcmVkIHRoYXQgd2Ugd3JvbmdseSB1c2VkIGluZXRfbnRvYSgpIChpbnN0ZWFkIG9mIGluZXRfbnRvYV9yKCkgaW4KICB0d28gcGxhY2VzIGluIHRoZSBzb3VyY2UgY29kZSkuIE9uZSBoYXBwZW5lZCB3aXRoIFZFUkJPU0Ugc2V0IG9uIGNvbm5lY3RzLAogIGFuZCB0aGUgb3RoZXIgd2hlbiBWRVJCT1NFIHdhcyBvbiBhbmQga3JiNCBvdmVyIG5hdCB3YXMgdXNlZC4uLiBJIGhvbmVzdGx5CiAgZG9uJ3QgdGhpbmsgYW55b25lIGhhcyBzdWZmZXJlZCBmcm9tIHRoZXNlIG1pc3Rha2VzLgoKLSBJIHJlcGxhY2VkIGEgbG90IG9mIHNpbGx5IG9jY3VyYW5jZXMgb2YgcHJpbnRmKCkgdG8gaW5zdGVhZCB1c2UgdGhlIG1vcmUKICBhcHByb3ByaWF0ZSBDdXJsX2luZm9mKCkgb3IgQ3VybF9mYWlsZigpLiBUaGUga3JiNCBhbmQgdGVsbmV0IGNvZGUgd2VyZQogIGFmZmVjdGVkLgoKLSBQaGlsaXAgR2xhZHN0b25lIGZvdW5kIGEgZmV3IG1vcmUgcHJvYmxlbXMgd2l0aCA2NC1iaXQgYXJjaHMgKHRoZSA2NC1iaXQKICBzcGFyYyBvbiBzb2xhcmlzIDgpLgoKLSBBZnRlciBkaXNjdXNzaW9ucyBvbiB0aGUgbGliY3VybCBsaXN0IHdpdGggUmFvdWwgQ3JpZGxpZywgSSBqdXN0IG1hZGUgRlRQCiAgcmVzcG9uc2UgbGluZXMgZ2V0IHBhc3NlZCB0byB0aGUgaGVhZGVyIGNhbGxiYWNrIGlmIHN1Y2ggYSBvbmUgaXMKICByZWdpc3RlcmVkLiBJdCdsbCBtYWtlIGl0IHBvc3NpYmxlIGZvciBhbnkgYXBwbGljYXRpb24gdG8gZ2V0IGFsbCB0aGUKICByZXNwb25zZXMgYW4gRlRQIHNlcnZlciBzZW5kcyB0byBsaWJjdXJsLgoKRGFuaWVsICgzIEphbnVhcnkgMjAwMikKLSBTdGVybGluZyBIdWdoZXMgYnJvdWdodCBhIGZldyBidWNrZXRzIG9mIGNvZGUuIE5vdywgbGliY3VybCB3aWxsCiAgYXV0b21hdGljYWxseSBjYWNoZSBETlMgbG9va3VwcyBhbmQgcmUtdXNlIHRoZSBwcmV2aW91cyByZXN1bHRzIGZpcnN0IGlmIGFueQogIHN1Y2ggaXMgYXZhaWxhYmxlLiBJdCBncmVhdGx5IGltcHJvdmVzIHNwZWVkIHdoZW4gZG9pbmcgbWFueSByZXBlYXRlZAogIG9wZXJhdGlvbnMgdG8gdGhlIHNhbWUgaG9zdC4KCi0gQXMgdGhlIHRlc3QgY2FzZSB1c2VzIC0taW5jbHVkZSBhbmQgdGhlbiAtLWhlYWQsIEkgaGFkIHRvIG1vZGlmeSBzcmMvbWFpbi5jCiAgdG8gZGVhbCB3aXRoIHRoaXMgc2l0dWF0aW9uIHNsaWdodGx5IGJldHRlciB0aGFuIHByZXZpb3VzbHkuIFdoZW4gZG9uZSwgd2UKICBoYXZlIDEwMCUgZ29vZCB0ZXN0cyBhZ2FpbiBpbiB0aGUgbWFpbiBicmFuY2guCgpEYW5pZWwgKDIgSmFudWFyeSAyMDAyKQotIE1hZGUgdGVzdCBjYXNlIDI1IHJ1biBhZ2FpbiBpbiB0aGUgbXVsdGktZGV2IGJyYW5jaC4gQnV0IGl0IHNlZW1zIHRoYXQgdGhlCiAgY2hhbmdlcyBkb25lIG9uIGRlYy0yMCBtYWRlIHRlc3QgY2FzZSAxMDQgY2Vhc2UgdG8gd29yayAoaW4gYm90aCBicmFuY2hlcykuCgotIFBoaWxpcCBHbGFkc3RvbmUgcG9pbnRlZCBvdXQgYSBmZXcgcG9ydGFiaWxpdHkgcHJvYmxlbXMgaW4gdGhlIHNvdXJjZSBjb2RlCiAgdGhhdCBkaWRuJ3QgY29tcGlsZSBvbiA2NC1iaXQgc3BhcmNzIHVzaW5nIFN1bidzIG5hdGl2ZSBjb21waWxlci4KRGFuaWVsICgyMCBEZWNlbWJlciAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIGNhdWdodCBhbiB1bnBsZWFzZW50IChidXQgaGFyZC10by1maW5kKSBidWcgdGhhdCBjb3VsZCBjYXVzZQogIGxpYmN1cmwgdG8gaGFuZyBvbiB0cmFuc2ZlcnMgb3ZlciBwcm94eSwgd2hlbiB0aGUgcHJveHkgd2FzIHNwZWNpZmllZCB3aXRoCiAgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUhCgotIEFkZGVkIGNvZGUgdG8gbWFrZSBmdHAgb3BlcmF0aW9ucyB0cmVhdCB0aGUgTk9fQk9EWSBhbmQgSEVBREVSUyBvcHRpb25zCiAgYmV0dGVyOgoKICAgTk9fQk9EWSBzZXQgVFJVRSBhbmQgSEVBREVSUyBzZXQgVFJVRToKICAgIFJldHVybiBhIHNldCBvZiBoZWFkZXJzIHdpdGggZmlsZSBpbmZvCgogICBOT19CT0RZIHNldCBGQUxTRQogICAgVHJhbnNmZXIgZGF0YSBhcyB1c3VhbCwgSEVBREVSUyBpcyBpZ25vcmVkCgogICBOT19CT0RZIHNldCBUUlVFIGFuZCBIRUFERVJTIHNldCBGQUxTRQogICAgRG9uJ3QgdHJhbnNmZXIgYW55IGRhdGEsIGRvbid0IHJldHVybiBhbnkgaGVhZGVycy4gSnVzdCBwZXJmb3JtIHRoZSBzZXQKICAgIG9mIEZUUCBjb21tYW5kcy4KCkRhbmllbCAoMTcgRGVjZW1iZXIgMjAwMSkKLSBH9nR6IEJhYmluLUViZWxsIGRvdmUgaW50byB0aGUgZGFyayBkdW5nZW9ucyBvZiB0aGUgT3BlblNTTCBFTkdJTkUgc3R1ZmYgYW5kCiAgbWFkZSBsaWJjdXJsIHN1cHBvcnQgaXQhIFRoaXMgYWxsb3dzIGxpYmN1cmwgdG8gZG8gU1NMIGNvbm5lY3Rpb25zIHdpdGggdGhlCiAgcHJpdmF0ZSBrZXkgc3RvcmVkIGluIGV4dGVybmFsIGhhcmR3YXJlLgoKICBUbyBtYWtlIHRoaXMgZ29vZCwgaGUgaGFkIHRvIGFkZCBhIGJ1bmNoIG9mIG5ldyBsaWJyYXJ5IG9wdGlvbnMgdGhhdCdsbCBiZQogIHVzZWZ1bCB0byBvdGhlcnMgYXMgd2VsbDoKCiAgIENVUkxPUFRfU1NMQ0VSVFRZUEUgIHNldCBTU0wgY2VydCB0eXBlIChQRU0vREVSKQogICBDVVJMT1BUX1NTTEtFWSAgICAgICBzZXQgU1NMIHByaXZhdGUga2V5IChmaWxlKQogICBDVVJMT1BUX1NTTEtFWVRZUEU6ICBzZXQgU1NMIGtleSB0eXBlIChQRU0vREVSL0VORykKICAgQ1VSTE9QVF9TU0xLRVlQQVNTV0Q6IHNldCB0aGUgcGFzc3BocmFzZSBmb3IgeW91ciBwcml2YXRlIGtleQogICAgICAgICAgICAgICAgICAgICAgICAgIChDVVJMT1BUX1NTTENFUlRQQVNTV0QgaXMgYW4gYWxpYXMpCiAgIENVUkxPUFRfU1NMRU5HSU5FOiAgIHNldCB0aGUgbmFtZSBvZiB0aGUgY3J5cHRvIGVuZ2luZQogICAgICAgICAgICAgICAgICAgICAgICAocmV0dXJucyBDVVJMRV9TU0xfRU5HSU5FX05PVEZPVU5EIG9uIGVycm9yKQogICBDVVJMT1BUX1NTTEVOR0lORV9ERUZBVUxUOiBzZXQgdGhlIGRlZmF1bHQgZW5naW5lCgogIFRoZXJlIGFyZSB0d28gbmV3IGZhaWx1cmUgY29kZXM6CgogICBDVVJMRV9TU0xfRU5HSU5FX05PVEZPVU5ECiAgIENVUkxFX1NTTF9FTkdJTkVfU0VURkFJTEVECgpEYW5pZWwgKDE0IERlY2VtYmVyIDIwMDEpCi0gV2UgaGF2ZSAiYnJhbmNoZWQiIHRoZSBzb3VyY2UtdHJlZSBhdCBhIGZldyBwbGFjZXMuIENoZWNrb3V0IHRoZSBDVlMgc291cmNlcwogIHdpdGggdGhlICdtdWx0aS1kZXYnIGxhYmVsIHRvIGdldCB0aGUgbGF0ZXN0IG11bHRpIGludGVyZmFjZSBkZXZlbG9wbWVudAogIHRyZWUuIFRoZSBpZGVhIGlzIHRvIG9ubHkgYnJhbmNoIGFmZmVjdGVkIGZpbGVzIGFuZCB0byByZXN0cmljdCB0aGUgYnJhbmNoCiAgdG8gdGhlIHY4IG11bHRpIGludGVyZmFjZSBkZXZlbG9wbWVudCBvbmx5LgoKICAqTk9URSogdGhhdCBpZiB3ZSBnZXQgYnVnIHJlcG9ydHMgYW5kIHBhdGNoZXMgZXRjLCB3ZSBtaWdodCBuZWVkIHRvIGFwcGx5CiAgdGhlbSBpbiBib3RoIGJyYW5jaGVzIQoKICBUaGUgbXVsdGktZGV2IGJyYW5jaCBpcyB3aGF0IHdlIGFyZSBnb25uYSB1c2UgYXMgbWFpbiBicmFuY2ggaW4gdGhlIGZ1dHVyZQogIGlmIGl0IHR1cm5zIG91dCBzdWNjZXNzZnVsLiBUaHVzLCB3ZSBtdXN0IG1haW50YWluIGJvdGggbm93IGluIGNhc2Ugd2UgbmVlZAogIHRoZW0uIFRoZSBjdXJyZW50IG1haW4gYnJhbmNoIHdpbGwgYmUgdXNlZCBpZiB3ZSB3YW50IHRvIHJlbGVhc2UgYSA3LjkuMyBvcgogIHBlcmhhcHMgYSA3LjEwIHJlbGVhc2UgYmVmb3JlIHZlcnNpb24gOC4gV2hpY2ggaXMgdmVyeSBsaWtlbHkuCgotIE1hcmN1cyBXZWJzdGVyIHByb3ZpZGVkIGNvZGUgZm9yIHRoZSBuZXcgQ1VSTEZPUk1fQ09OVEVOVEhFQURFUiBvcHRpb24gZm9yCiAgY3VybF9mb3JtYWRkKCksIHRoYXQgbGV0cyBhbiBhcHBsaWNhdGlvbiBhZGQgYSBzZXQgb2YgaGVhZGVycyBmb3IgdGhhdAogIHBhcnRpY3VsYXIgcGFydCBpbiBhIG11bHRpcGFydC9mb3JtLXBvc3QuIEhlIGFsc28gcHJvdmlkZWQgYSBzZWN0aW9uIHRvIHRoZQogIG1hbiBwYWdlIHRoYXQgZGVzY3JpYmVzIHRoZSBuZXcgb3B0aW9uLgoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDAxKQotIEJlbiBHcmVlYXIgbWFkZSBtZSBhd2FyZSBvZiB0aGUgZmFjdCB0aGF0IHRoZSBDdXJsX2ZhaWxmKCkgdXNhZ2UgaW50ZXJuYWxseQogIHdhcyBhIGJpdCBzbG9wcHkgd2l0aCBhZGRpbmcgbmV3bGluZXMgb3Igbm90IHRvIHRoZSBlcnJvciBtZXNzYWdlcy4gTGV0J3MKICBvbmNlIGFuZCBmb3IgYWxsIHNheSB0aGF0IHRoZXkgZG8gbm90IGJlbG9uZyB0aGVyZSEKCi0gV2hlbiB1cGxvYWRpbmcgZmlsZXMgd2l0aCAtVCB0byBnaXZlIGEgbG9jYWwgZmlsZSBuYW1lLCBhbmQgeW91IGVuZCB0aGUgVVJMCiAgd2l0aCBhIHNsYXNoIHRvIGhhdmUgdGhlIGxvY2FsIGZpbGUgbmFtZSB1c2VkIHJlbW90ZSB0b28sIHdlIG5vdyBubyBsb25nZXIKICB1c2UgdGhlIGxvY2FsIGRpcmVjdG9yeSBhcyB3ZWxsLiBPbmx5IHRoZSBmaWxlIHBhcnQgb2YgdGhlIC1UIGZpbGUgbmFtZQogIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIHJpZ2h0IG9mIHRoZSBzbGFzaCBpbiB0aGUgVVJMLgoKRGFuaWVsICg3IERlY2VtYmVyIDIwMDEpCi0gTWljaGFsIEJvbmlubyBwb2ludGVkIG91dCB0aGF0IERpZ2l0YWwgVW5peCBkb2Vzbid0IGhhdmUgZ210aW1lX3Igc28gdGhlCiAgbGluayBmYWlsZWQuIEFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGFuZCBjb3JyZWN0ZWQgc291cmNlIGNvZGUuCgpWZXJzaW9uIDcuOS4yCgpEYW5pZWwgKDUgRGVjZW1iZXIgMjAwMSkKLSBKb24gVHJhdmlzIGZvdW5kIG91dCB0aGF0IGlmIHlvdSB1c2VkIGxpYmN1cmwgYW5kIENVUkxPUFRfVVBMT0FEIGFuZCB0aGVuCiAgb24gdGhlIHNhbWUgaGFuZGxlIHVzZWQgQ1VSTE9QVF9IVFRQR0VUIGl0IHdvdWxkIHN0aWxsIGF0dGVtcHQgdG8gdXBsb2FkLgogIEhpcyBzdWdnZXN0ZWQgZml4IHdhcyBwZXJmZWN0LgoKRGFuaWVsICg0IERlY2VtYmVyIDIwMDEpCi0gSW5jb3Jwb3JhdGVkIG1vcmUgbWFjb3MgZml4ZXMgYW5kIGFkZGVkIGZvdXIgc3BlY2lmaWMgZmlsZXMgaW4gYSBuZXcKICBzdWJkaXJlY3RvcnkgYmVsb3cgc3JjLgoKRGFuaWVsICgzIERlY2VtYmVyIDIwMDEpCi0gRXJpYyBMYXZpZ25lIHJlcG9ydGVkIHR3byBwcm9ibGVtczoKCiAgRmlyc3Qgb25lIGluIHRoZSBjdXJsX3N0cm5lcXVhbCgpIGZ1bmN0aW9uLiBJIHRoaW5rIHRoaXMgcHJvYmxlbSBpcyByYXRoZXIKICBtYWNvcyA5IHNwZWNpZmljLCBhcyBtb3N0IHBsYXRmb3JtIHByb3ZpZGVzIGEgZnVuY3Rpb24gdG8gdXNlIGluc3RlYWQgb2YgdGhlCiAgb25lIHByb3ZpZGVkIGJ5IGxpYmN1cmwuCgogIEEgc2Vjb25kLCBtb3JlIGltcG9ydGFudCwgd2FzIGluIHRoZSB3YXkgd2UgdGFrZSBjYXJlIG9mIEZUUCByZXNwb25zZXMuIFRoZQogIGNvZGUgd291bGQgcmVhZCBhIGxhcmdlIGNodW5rIG9mIGRhdGEgYW5kIHNlYXJjaCBmb3IgdGhlIGVuZC1vZi1yZXNwb25zZQogIGxpbmUgd2l0aGluIHRoYXQgY2h1bmsuIFdoZW4gZm91bmQsIGl0IHdvdWxkIGp1c3Qgc2tpcCB0aGUgcmVzdCBvZiB0aGUKICBkYXRhLiBIb3dldmVyLCB3aGVuIHRoZSBuZXR3b3JrIGNvbm5lY3Rpb25zIGFyZSBzcGVjaWFsLCBvciBwZXJoYXBzIHRoZQogIHNlcnZlciBpcywgd2UgY291bGQgYWN0dWFsbHkgZ2V0IG1vcmUgdGhhbiBvbmUgcmVzcG9uc2UgaW4gdGhhdCBjaHVuayBvZgogIGRhdGEgc28gdGhhdCB3aGVuIHRoZSBuZXh0IGludm9rZSB0byB0aGlzIGZ1bmN0aW9uIHdhcyBkb25lLCB0aGUgcmVzcG9uc2UKICBoYWQgYWxyZWFkeSBiZWVuIHJlYWQgYW5kIHRocm93biBhd2F5LiBOb3csIHdlIGNhY2hlIHRoZSBkYXRhIG5vdCB1c2VkIGluCiAgb25lIGNhbGwsIGFzIGl0IGNvdWxkIGJlIHVzZWZ1bCBpbiB0aGUgc3Vic2VxdWVudCBjYWxsLiBUZXN0IGNhc2UgMTI2IHdhcwogIGFkZGVkIGFuZCB0aGUgdGVzdCBmdHAgc2VydmVyIG1vZGlmaWVkLCB0byBleGVyY2lzZSB0aGlzIHBhcnRpY3VsYXIgY2FzZS4KClZlcnNpb24gNy45LjItcHJlOAoKRGFuaWVsICgyIERlY2VtYmVyIDIwMDEpCi0gQnVnIHJlcG9ydCAjNDg3ODI1IGNvcnJlY3RseSBpZGVudGlmaWVkIGEgcHJvYmxlbSB3aGVuIHVzaW5nIGEgcHJveHkgYW5kCiAgZm9sbG93aW5nIGEgcmVkaXJlY3Rpb24gZnJvbSBIVFRQIHRvIEhUVFBTLiBsaWJjdXJsIHRoZW4gcmUtdXNlZCB0aGUgc2FtZQogIHByb3h5IGNvbm5lY3Rpb24gYnV0IHdpdGhvdXQgZG9pbmcgYSBwcm9wZXIgSFRUUFMgcmVxdWVzdC4KCi0gRml4ZWQgd2luMzIgY29tcGlsaW5nIHF1aXJrcy4KClZlcnNpb24gNy45LjItcHJlNwoKRGFuaWVsICgzMCBOb3ZlbWJlciAyMDAxKQotIERvY3VtZW50ZWQgLS1kaXNhYmxlLWVwc3YgYW5kIENVUkxPUFRfRlRQX1VTRV9FUFNWLgoKRGFuaWVsICgyOSBOb3ZlbWJlciAyMDAxKQotIEFkZGVkIC0tZGlzYWJsZS1lcHN2IGFzIGFuIG9wdGlvbi4gV2hlbiB1c2VkLCBjdXJsIHdvbid0IGF0dGVtcHQgdG8gdXNlIHRoZQogIEVQU1YgY29tbWFuZCB3aGVuIGRvaW5nIHBhc3NpdmUgRlRQIGRvd25sb2Fkcy4gV3JvdGUgYSB0ZXN0IGNhc2UgZm9yIGl0LgoKLSBFcmljIHByb3ZpZGVkIGEgZmV3IG1vcmUgZml4ZXMgZm9yIGJ1aWxkaW5nIG9uIE1hY3MuIEhlIGFsc28gcG9pbnRlZCBvdXQKICBhIGZsYXcgaW4gdGhlIHNpZ25hbCBoYW5kbGVyIHJlc3RvcmF0aW9uIGNvZGUuCgpEYW5pZWwgKDI4IE5vdmVtYmVyIDIwMDEpCi0gRmlkZGxlZCB3aXRoIHNvbWUgVHJ1NjQgcHJvYmxlbXMgcmVwb3J0ZWQgYnkgRGltaXRyaXMgU2FycmlzLiBUaGV5IGFwcGVhcmVkCiAgb25seSB3aGVuIHVzaW5nIFZFUkJPU0UgZnRwIHRyYW5zZmVycy4gRG8gd2UgdXNlIGEgdG9vIHNtYWxsIGJ1ZmZlciBmb3IKICBnZXRob3N0YnlhZGRyX3IoKSwgd2FzIHRoZSBsYWNrIG9mIHVzaW5nIGluX2FkZHJfdCB3cm9uZyBvciBpcyBpdCB0aGF0IHRoZQogIGhvc3RlbnQgc3RydWN0IG11c3QgYmUgYmxhbmtlZCBiZWZvcmUgdXNlPyBXaXRoIERpbWl0cmlzIGhlbHAgYW5kIHRoZXNlCiAgcGF0Y2hlcywgdGhlIHByb2JsZW1zIHNlZW0gdG8gYmUgaGlzdG9yeS4KCi0gQ1VSTE9QVF9GVFBfVVNFX0VQU1Ygd2FzIGFkZGVkIGFuZCBjYW4gYmUgc2V0IHRvIEZBTFNFIHRvIHByZXZlbnQgbGliY3VybAogIGZyb20gdXNpbmcgdGhlIEVQU1YgY29tbWFuZCBiZWZvcmUgdHJ5aW5nIHRoZSBub3JtYWwgUEFTVi4gSGVpa2tpIEtvcnBlbGEKICBwb2ludGVkIG91dCB0aGF0IHNvbWUgZmlyZXdhbGxzIGFuZCBzaW1pbGFyIGRvbid0IGxpa2UgdGhlIEVQU1Ygc28gd2UgbXVzdAogIGJlIGFibGUgdG8gc2h1dCBpZiBvZmYgdG8gd29yayBldmVyeXdoZXJlLgoKLSBJIGFkZGVkIGEgY29uZmlndXJlIGNoZWNrIGZvciAnaW5fYWRkcl90JyBhbmQgbWFkZSB0aGUgZnRwIGNvZGUgdXNlIHRoYXQgdG8KICByZWNlaXZlIHRoZSBpbmV0X2FkZHIoKSByZXR1cm4gY29kZSBpbi4gV29ya3Mgb24gU29sYXJpcyBhbmQgTGludXggYXQKICBsZWFzdC4gVGhlIExpbnV4IG1hbiBwYWdlIGZvciBpbmV0X2FkZHIoKSBkb2Vzbid0IGV2ZW4gbWVudGlvbiBpbl9hZGRyX3QuLi4KCi0gQWRqdXN0ZWQgKGFsbW9zdCkgYWxsIEZUUCB0ZXN0cyB0byB0aGUgbmV3IGNvbW1hbmQgc2VxdWVuY2UuCgotIEZUUCBjb21tYW5kIHNlcXVlbmNlIGNoYW5nZXM6CgogIEVQU1YgaXMgbm93IGFsd2F5cyBhdHRlbXB0ZWQgYmVmb3JlIFBBU1YuIEl0IGlzIHRoZSBmaW5hbCB0b3VjaCB0byBtYWtlIElQdjYKICBwYXNzaXZlIEZUUCBkb3dubG9hZHMgdG8gd29yaywgYnV0IEVQU1YgaXMgbm90IHJlc3RyaWN0ZWQgdG8gSVB2NiBidXQgd29ya3MKICBmaW5lIHdpdGggSVB2NCB0b28gb24gdGhlIHNlcnZlcnMgdGhhdCBzdXBwb3J0IGl0LgoKICBTSVpFIGlzIG5vdyBhbHdheXMgaXNzdWVkIGJlZm9yZSBSRVRSLiBJdCBtYWtlcyBjdXJsIGtub3cgdGhlIGFjdHVhbAogIGRvd25sb2FkIHNpemUgYmVmb3JlIHRoZSBkb3dubG9hZCB0YWtlcyBwbGFjZSwgYXMgaXQgbWFrZXMgaXQgbGVzcyBpbXBvcnRhbnQKICB0byBmaW5kIHRoZSBzaXplIHNlbnQgaW4gUkVUUiByZXNwb25zZXMuIE1hbnkgc2l0ZXMgZG9uJ3QgaW5jbHVkZSB0aGUgc2l6ZQogIGluIHRoZXJlLgoKICBCb3RoIHRoZXNlIGNoYW5nZXMgbWFkZSBpdCBuZWNlc3NhcnkgdG8gY2hhbmdlIHRoZSB0ZXN0IHN1aXRlJ3MgZnRwIHNlcnZlcgogIGNvZGUsIGFuZCBhbGwgRlRQIHRlc3QgY2FzZXMgbmVlZCB0byBiZSBjaGVja2VkIGFuZCBhZGp1c3RlZCEKCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMSkKLSBIYW5zIFN0ZWVnZXJzIHBvaW50ZWQgb3V0IHRoYXQgdGhlIHRlbG5ldCBjb2RlIHJlYWQgZnJvbSBzdGRvdXQsIG5vdCBzdGRpbgogIGFzIGl0IGlzIHN1cHBvc2VkIHRvIGRvIQoKVmVyc2lvbiA3LjkuMi1wcmU2CgpEYW5pZWwgKDI3IE5vdmVtYmVyIDIwMDEpCi0gRXJpYyBMYXZpZ25lJ3MgbWlub3IgY2hhbmdlcyB0byBidWlsZCBvbiBNYWNPUyBiZWZvcmUgT1MgWCB3ZXJlIGFwcGxpZWQuCgotIGdyZWVwIGF0IG1pbmRzcHJpbmcuY29tIHByb3ZpZGVkIGEgbWFpbiBpbmRleC5odG1sIHBhZ2UgZm9yIG91ciByZWxlYXNlCiAgYXJjaGl2ZSBkb2NzIGRpcmVjdG9yeS4gSXQganVzdCBsaW5rcyB0byBhbGwgdGhlIGV4aXN0aW5nIEhUTUwgZmlsZXMsIGJ1dAogIEkgdGhpbmsgaXQgbWF5IGNvbWUgdXNlZnVsIHRvIHBlb3BsZS4KCi0gVGhlcmUncyBub3cgc29tZSBpbml0aWFsIGNvZGUgdG8gc3VwcG9ydCB0aGUgRVBTViBGVFAgY29tbWFuZC4gVGhhdCBzaG91bGQKICBiZSB1c2VkIHRvIGRvIHBhc3NpdmUgdHJhbnNmZXJzIElQdjYtc3R5bGUuIFRoZSBjb2RlIGlzIHN0aWxsICNpZiAwJ2VkIGluCiAgbGliL2Z0cC5jIGFzIEkgaGF2ZSBubyBJUHY2IGZ0cCBzZXJ2ZXIgdG8gdGVzdCB0aGlzIHdpdGguCgpEYW5pZWwgKDI2IE5vdmVtYmVyIDIwMDEpCi0gUm9iZXJ0IFNjaGxhYmJhY2ggaGFkIHByb2JsZW1zIHRvIHVuZGVyc3RhbmQgaG93IHRvIGRvIHJlc3VtZWQgdHJhbnNmZXJzLAogIGFuZCBJIGNsYXJpZmllZCB0aGUgbWFuIHBhZ2UgLUMgc2VjdGlvbiBzb21ld2hhdC4KClZlcnNpb24gNy45LjItcHJlNQoKRGFuaWVsICgyMiBOb3ZlbWJlciAyMDAxKQotIEFuZHLpcyBHYXJj7WEgaGVscGVkIG1lIG91dCB0byB0cmFjayBkb3duIHRoZSByb290cyBvZiBidWcgcmVwb3J0ICM0Nzk1MzcsCiAgd2hpY2ggd2FzIGNvbmNlcm5pbmcgY3VybCByZXR1cm5pbmcgdGhlIHdyb25nIGVycm9yIGNvZGUgd2hlbiBmYWlsaW5nIHRvCiAgY29ubmVjdC4gVGhpcyBkaWRuJ3QgaGFwcGVuIG9uIGFsbCBzeXN0ZW1zLCBhbmQgbW9yZSBzcGVjaWZpY2x5IEkndmUgc28gZmFyCiAgb25seSBzZWVuIHRoaXMgaGFwcGVuIG9uIElQdjQtb25seSBMaW51eCBob3N0cy4KCi0gSSBhcHBsaWVkIHRoZSBmaXhlcyBmb3IgdGhlIHR3byBidWdzIEVyaWMgTGF2aWduZSBmb3VuZCB3aGVuIGRvaW5nIGhpcyBNYWNPUwogIHBvcnQuIEEgbWlzc2luZyBjb21tYSBpbiBhcnBhX3RlbG5ldC5oIGFuZCBhIHByZXR0eSB3aWxkIHdyaXRlIGluIHRoZSBGVFAKICByZXNwb25zZSByZWFkZXIgZnVuY3Rpb24uIFRoZSBsYXR0ZXIgd3JpdGUgaXMgaG93ZXZlciBsaWtlbHkgdG8gb2NjdXIgaW4gb3VyCiAgb3duIGJ1ZmZlciB1bmxlc3MgdmVyeSBiaWcgRlRQIHNlcnZlciByZXBsaWVzICg+MjVLKSBhcmUgcmVhZC4gSSd2ZSBuZXZlcgogIHNlZW4gc3VjaCBhIHJlcGx5IGV2ZXIsIHNvIEkgdGhpbmsgdGhpcyBpcyBhIHJlbGF0aXZlbHkgbWlub3Igcmlzay4KCkRhbmllbCAoMjEgTm92ZW1iZXIgMjAwMSkKLSBNb29uZXNhbXkgcHJvdmlkZWQgY29kZSB0byBwcmV2ZW50IGp1bmsgZnJvbSBiZWluZyBvdXRwdXQgd2hlbiBsaWJjdXJsCiAgcmV0dXJucyBhbiBlcnJvciBjb2RlIGJ1dCBubyBlcnJvciBkZXNjcmlwdGlvbiBhbmQgdGhhdCBjb3JyZWN0cyBob3cgbWFrZSBpcwogIHJ1biBpbiB0aGUgTWFrZWZpbGUuZGlzdCBmaWxlICh0aGF0IGFwcGVhcnMgYXMgcm9vdCBNYWtlZmlsZSBpbiByZWxlYXNlCiAgYXJjaGl2ZXMpLgoKLSBFcmljIExhdmlnbmUgbWFpbGVkIG1lIGJ1Z2ZpeGVzIGFuZCBwYXRjaGVzIGZvciBidWlsZGluZyBsaWJjdXJsIG9uIE1hY09TCiAgKG5vbi1YKS4KCi0gS2V2aW4gUm90aCBtb2RpZmllZCB0aGUgY3lnd2luIGZpbGVzIG9uY2UgYWdhaW4sIG5vdyB0byBidWlsZCBhZ2FpbnN0IHRoZQogIHNoYXJlZCBPcGVuU1NMIERMTHMuCgpWZXJzaW9uIDcuOS4yLXByZTQKCkRhbmllbCAoMjAgTm92ZW1iZXIgMjAwMSkKLSBHZW9yZyBIb3JuIGJyb3VnaHQgYSBwYXRjaCB0aGF0IGludHJvZHVjZWQgQ1VSTElORk9fU1RBUlRUUkFOU0ZFUl9USU1FLAogIGNvbXBsZXRlIHdpdGggbWFuIHBhZ2UgdXBkYXRlcyEKCkRhbmllbCAoMTkgTm92ZW1iZXIgMjAwMSkKLSBNaWtsb3MgTmVtZXRoIHByb3ZpZGVkIGRldGFpbHMgZW5vdWdoIHRvIHVwZGF0ZSB0aGUgQm9ybGFuZCBtYWtlZmlsZQogIHByb3Blcmx5LgoKLSBMYXJzIE0gR3VzdGFmc3NvbiBmb3VuZCBhIGNhc2Ugd2l0aCBhIGJhZCBmcmVlKCkuIEluIGZhY3QsIGl0IHdhcyBzbyBiYWQgSSdtCiAgYW1hemVkIHdlIG5ldmVyIHNhdyB0aGlzIGJlZm9yZSEKCi0gS2V2aW4gUm90aCBwYXRjaGVkIHRoZSBjeWd3aW4gTWFrZmlsZS4KCkRhbmllbCAoMTYgTm92ZW1iZXIgMjAwMSkKLSBLbGV2dHNvdiBWYWRpbSBmaXhlZCBhIGJ1ZyBpbiBob3cgdGltZS1jb25kaXRpb25hbHMgd2VyZSBzZW50IHdoZW4gZG9pbmcKICBIVFRQLgoKVmVyc2lvbiA3LjkuMi1wcmUzCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDEpCi0gU2FtdWVsIExpc3RvcGFkIHBhdGNoZWQgYXdheSB0aGUgcHJvYmxlbSB3aXRoIFNTTCB3ZSBnb3Qgd2hlbiBzb21lb25lIGNhbGwKICBjdXJsX2dsb2JhbF9pbml0KCkgPT4gY3VybF9nbG9iYWxfY2xlYW51cCgpID0+IGN1cmxfZ2xvYmFsX2luaXQoKS4gVGhlCiAgc2Vjb25kIGluaXQgd291bGQgbm90ICJ0YWtlIiBhbmQgU1NMIHdvdWxkIGJlIHVudXNhYmxlIHdpdGggY3VybCBmcm9tIHRoYXQKICBwb2ludC4gVGhpcyBkb2Vzbid0IGNoYW5nZSB0aGUgZmFjdCB0aGF0IGNhbGxpbmcgdGhlIGZ1bmN0aW9ucyB0aGF0IHdheSBpcwogIHdyb25nLiBjdXJsX2dsb2JhbF9pbml0KCkgc2hvdWxkIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UgYW5kIG5vdCBtb3JlLgoKRGFuaWVsICgxMyBOb3ZlbWJlciAyMDAxKQotIEZpeGVkIHNvbWUgbWlub3IgdmFyaWFibGUgdHlwZSBtaXh1cHMgaW4gZnRwLmMgdGhhdCBjYXVzZWQgY29tcGlsZXIgd2FybmluZ3MKICBvbiBIUC1VWCAxMS4wMC4KCi0gVGhlIEZUUCBmaXggSSBkaWQgeWVzdGVyZGF5IHVzZWQgYW4gdW5pbml0aWFsaXplZCB2YXJpYWJsZSB0aGF0IGNhdXNlZAogIHNwdXJpb3VzIGVycm9ycyB3aGVuIGRvaW5nIEZUUC4KClZlcnNpb24gNy45LjItcHJlMgoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDAxKQotIFJpY2FyZG8gQ2FkaW1lIGZlbGwgb3ZlciBhIG11bHRpcGxlLXJlcXVlc3RzIHByb2JsZW0gd2hlbiBmaXJzdCBhIEZUUAogIGRpcmVjdG9yeSBmZXRjaCBmYWlsZWQgYW5kIHRoZW4gYSBzZWNvbmQgcmVxdWVzdCBpcyBtYWRlIGFmdGVyIHRoYXQuIFRoZQogIHNlY29uZCByZXF1ZXN0IGhhcHBlbmVkIHRvIGdldCB0aGUgRlRQIHNlcnZlciByZXNwb25zZSBiYWNrIGZyb20gdGhlCiAgcHJldmlvdXMgcmVxdWVzdCwgd2hlbiBpdCBkaWQgaXRzIGluaXRpYWwgQ1dEIGNvbW1hbmQuCgotIEJqb3JuIFJlZXNlIHBvaW50ZWQgb3V0IHRoYXQgd2UgY291bGQgaW1wcm92ZSB0aGUgdGltZSBkaWZmIGZ1bmN0aW9uIHRvCiAgcHJldmVudCB0cnVuY2F0aW9uIGEgYml0LgoKLSBLYWktVXdlIFJvbW1lbCBtYWRlIG1lIGF3YXJlIHRoYXQgLXAgKGh0dHAgcHJveHkgdHVubmVsKSBzaWxseSBlbm91Z2ggZGlkbid0CiAgd29yayBmb3IgcGxhaW4gSFRUUCByZXF1ZXN0cyEgU28gSSBtYWRlIHRoYXQgd29yay4KClZlcnNpb24gNy45LjItcHJlMQoKRGFuaWVsICgxMiBOb3ZlbWJlciAyMDAxKQotIFJld3JvdGUgdGhlIEN1cmxfQ29ubmVjdEhUVFBQcm94eVR1bm5lbCgpLiBJdCBzaG91bGQgbm93IG5vdCBvbmx5IHdvcmsgYSBsb3QKICBmYXN0ZXIsIGl0IHNob3VsZCBhbHNvIHN1cHBvcnQgc3VjaCAoImJyb2tlbiIpIHByb3hpZXMgdGhhdCBKb2huIExhc2sKICBwcmV2aW91c2x5IGhhdmUgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aC4gSGlzIHByb3h5IHNlbmRzIGEgdHJhaWxpbmcgemVybyBieXRlCiAgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgKHByb3h5LSkgaGVhZGVycy4gSSd2ZSB0ZXN0ZWQgdGhpcyBteXNlbGYgYW5kIGl0IHNlZW1zCiAgdG8gd29yayBvbiBhIHByb3h5IHRoZSBwcmV2aW91cyB2ZXJzaW9uIGFsc28gd29ya2VkIHdpdGguLi4hIFRoaXMgcmV3cml0ZSBpcwogIGR1ZSB0byB0aGUgcHJvYmxlbXMgSm9obiBMYXNrIHByZXZpb3VzbHkgZXhwZXJpZW5jZWQuCgotIEFuZHLpcyBHYXJj7WEgZm91bmQgb3V0IHdoeSB0aGUgImN1cnJlbnQgc3BlZWQiIG1ldGVyIHNvbWV0aW1lcyBzaG93ZWQgMjA0OEsKICBmb3IgdmVyeSBxdWljayB0cmFuc2ZlcnMuIEl0IHR1cm5lZCBvdXQgdGhlICJ0aW1lIGRpZmYiLWZ1bmN0aW9uIHJldHVybmVkIGEKICB6ZXJvIG1pbGxpc2Vjb25kIGRpZmYuIFdlIG5vdyBhbHdheXMgc2F5IGl0IGlzIGF0IGxlYXN0IG9uZSBtaWxsaXNlY29uZCEgSW4KICByZWFsaXR5LCB0aGVzZSB0aW1lcnMgdmVyeSByYXJlbHkgaGF2ZSB0aGF0IGdvb2QgcmVzb2x1dGlvbiBzbyBldmVuIHRob3VnaAogIHRoZSB0aW1lIGRpZmYgd2FzIGxvbmdlciB0aGFuIDEgbWlsbGlzZWNvbmQsIGl0IHdhcyByZXBvcnRlZCBhcyBubyBkaWZmLgoKLSBJIGFsc28gbW9kaWZpZWQgdGhlIGdldGluZm8oKSBhZ2FpbiB3aGVuIHJldHVybmluZyB0aW1lcywgYXMgUGF1bCBIYXJyaW5ndG9uCiAgcmVwb3J0cyB0aGF0IDcuOS4xIG9ubHkgcmV0dXJucyB0aW1lcyB3aXRoIDEgc2Vjb25kIGFjY3VyYWN5LCB3aGljaCBpbmRlZWQKICBpcyB3cm9uZy4KCkRhbmllbCAoOCBOb3ZlbWJlciAyMDAxKQotIE1hcmN1cyBXZWJzdGVyIGZvdW5kIG91dCB0aGF0IGN1cmxfZm9ybWFkZCgpIGNvdWxkIHJlYWQgb25lIGJ5dGUgb3V0c2lkZSBhCiAgYnVmZmVyIGJvdW5kYXJ5LCB3aGljaCB0aGVuIG9mIGNvdXJzZSBjb3VsZCBsZWFkIHRvIGEgY3Jhc2guIE1hcmN1cyBhbHNvCiAgZ3JhY2VmdWxseSBwcm92aWRlZCBhIHBhdGNoIGZvciB0aGlzIHRoaXMuCgotIEdsZW4gU2NvdHQgcmFuIGNvbmZpZ3VyZSBvbiBoaXMgQ29iYWx0IFF1YmUgYW5kIGl0IGRpZG4ndCBmaWd1cmUgb3V0IHRoZQogIGNvcnJlY3Qgd2F5IG9mIGNhbGxpbmcgZ2V0aG9zdGJ5bmFtZV9yKCkgYW5kIHRodXMgZmFpbGVkIHRvIHJlc29sdmUgaG9zdHMuCiAgVGhpcyBpcyB0d28gZXJyb3JzOiBpdCBzaG91bGRuJ3QgY29udGludWUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgaWYgaXQgZmluZHMKICBnZXRob3N0YnluYW1lX3IoKSBidXQgY2FuJ3QgZmlndXJlIG91dCBob3cgdG8gdXNlIGl0LCBhbmQgaXQgc2hvdWxkIHJlYWxseQogIGZpZ3VyZSBvdXQgaG93IHRvIHVzZSBpdCBhcyBpdCB3YXMgcnVubmluZyBMaW51eCBhbmQgd2Uga25vdyBob3cgdGhhdAogIHdvcmtzLi4uCiAKRGFuaWVsICg3IE5vdmVtYmVyIDIwMDEpCi0gZG9jcy9WRVJTSU9OUyBpcyBhIG5ldyBmaWxlIGluIHRoZSBhcmNoaXZlIHRoYXQgZXhwbGFpbnMgdGhlIHZlcnNpb24gbnVtYmVyCiAgc3lzdGVtIHdlIHVzZSBpbiB0aGUgY3VybCBwcm9qZWN0LgoKLSBEaWQgc29tZSBtb3JlIGZpeGVzIHRoYXQgbm93IG1ha2VzIGxpYmN1cmwgb25seSBpZ25vcmUgc2lnbmFscyBhcyBsb25nIGFzCiAgaXQgbmVlZHMgdG8sIGFuZCB0aGVuIHJlc3RvcmUgKGlmIGFueSkgcHJldmlvdXMgc2lnbmFsIGhhbmRsZXIgYWdhaW4uCgpEYW5pZWwgKDYgTm92ZW1iZXIgMjAwMSkKLSBFbnJpayBCZXJraGFuIHBvc3RlZCBidWcgcmVwb3J0ICM0Nzg3ODAsIGluIHdoaWNoIGhlIHZlcnkgY29ycmVjdGx5IHBvaW50ZWQKICBvdXQgdHdvIGJhZCB0aW1lb3V0IG1hdHRlcnMgaW4gbGliY3VybDogd2UgZGlkbid0IHJlc3RvcmUgdGhlIHNpZ2FjdGlvbgogIHN0cnVjdCAodGhlIGFsYXJtIGhhbmRsZXIgZm9yIFNJR0FMUk0pIG5vciBkaWQgd2UgcmVzdG9yZSB0aGUgcHJldmlvdXMKICBhbGFybSgpIHRpbWVvdXQgdGhhdCBjb3VsZCd2ZSBiZWVuIHNldCBieSBhICJwYXJlbnQiIHByb2Nlc3Mgb3Igc2ltaWxhci4KCi0gS2V2aW4gUm90aCBtYWRlIHRoZSBjeWd3aW4gYmluYXJ5IGdldCBzdHJpcHBlZCBiZWZvcmUgaW5zdGFsbC4KCkRhbmllbCAoNSBOb3ZlbWJlciAyMDAxKQotIERldGxlZiBTY2htaWVyIHJlcG9ydGVkIHRoYXQgY3VybCBkaWRuJ3QgY29tcGlsZSB1c2luZyBTb2xhcmlzIDggd2l0aCB0aGUKICBuYXRpdmUgY2MgY29tcGlsZXIuIEl0IHdhcyBkdWUgdG8gYSBiYWQgZnVuY3Rpb24gcHJvdG90eXBlLiBGaXhlZCBub3cuCiAgVW5mb3J0dW5hdGVseSwgSSBjYW4ndCBlbmFibGUgdGhlIC1Xc3RyaWN0LXByb3RvdHlwZXMgaW4gbXkgZGVidWcgYnVpbGRzCiAgdGhvdWdoLCBhcyBnY2MgdGhlbiBjb21wbGFpbnMgbGlrZSBjcmF6eSBvbiBPcGVuU1NMIGluY2x1ZGUgZmlsZXMuLi4gOi0oCgotIEpvaG4gTGFzayBwcm92aWRlZCBTU0wgb3ZlciBIVFRQIHByb3h5IGZpeGVzLiBUaGV5J2xsIG5lZWQgc29tZSB0d2Vha2luZwogIHRvIHdvcmsgb24gYWxsIHBsYXRmb3Jtcy4KCi0gSm9obiBMYXNrIGFkZGVkIHRoZSAtMS8tLVRMU3YxIG9wdGlvbnMgdGhhdCBmb3JjZXMgU1NMIGludG8gdXNpbmcgVExTCiAgdmVyc2lvbiAxIHdoZW4gc3BlYWtpbmcgSFRUUFMuCgotIEpvaG4gTGFzayBicm91Z2h0IGEgYnJhbmQgbmV3IFZDKysgbWFrZWZpbGUgZm9yIHRoZSBsaWIgZGlyZWN0b3J5LCB0aGF0CiAgd29ya3MgYSBsb3QgYmV0dGVyIHRoYW4gdGhlIHByZXZpb3VzIQoKLSBSYW1hbmEgTW9ra2FwYXRpIGJyb3VnaHQgc29tZSBjbGV2ZXIgaW5zaWdodHMgb24gdGhlIExEQVAgZmFpbHVyZXMgKGJ1ZwogIHJlcG9ydCAjNDc1NDA3KSwgYW5kIGhpcyBzdWdnZXN0ZWQgY2hhbmdlcyBhcmUgbm93IGFwcGxpZWQuCgpWZXJzaW9uIDcuOS4xCgpEYW5pZWwgKDQgTm92ZW1iZXIgMjAwMSkKLSBJJ3ZlIGFkZGVkIGEgbnVtYmVyIG9mIG5ldyB0ZXN0IGNhc2VzIHRoZSBsYXN0IGZldyBkYXlzLiBBIGZldyBvZiB0aGVtIHNpbmNlCiAgSSBnb3QgcmVwb3J0cyB0aGF0IGhpbnRlZCBvbiBwcm9ibGVtcyBvbiB0aW1lb3V0cywgc28gSSBhZGRlZCBmb3VyIHRlc3RzCiAgd2l0aCB0aW1lb3V0cyBmb3IgYWxsIHNvcnRzIG9mIHByb3RvY29scyBhbmQgc3R1ZmYuIEkgYWxzbyBjYW1lIHRvIHRoaW5rIG9mCiAgYSBmZXcgb3RoZXIgZXJyb3Igc2NlbmFyaW9zIHRoYXQgd2UgY3VycmVudGx5IGRpZG4ndCB0ZXN0IHByb3Blcmx5LCBzbyBJCiAgd3JvdGUgdXAgdGVzdHMgZm9yIGEgZmV3IG9mIHRob3NlIHRvby4KCkRhbmllbCAoMiBOb3ZlbWJlciAyMDAxKQotIFJlcGxhY2VkIHJlYWQoKSBhbmQgd3JpdGUoKSB3aXRoIHJlY3YoKSBhbmQgc2VuZCgpIGZvciBzb2NrZXQgb3BlcmF0aW9ucwogIGV2ZW4gdW5kZXIgbm9ybWFsIHVuaXhlcy4KCkRhbmllbCAoMSBOb3ZlbWJlciAyMDAxKQotIFdoZW4gYW4gRlRQIHRyYW5zZmVyIHdhcyBhYm9ydGVkIGR1ZSB0byBhIHRpbWVvdXQsIGl0IHdhc24ndCByZWFsbHkgYXdhcmUgb2YKICBob3cgbWFueSBieXRlcyB0aGF0IGhhZCBiZWVuIHRyYW5zZmVycmVkIGFuZCB0aGUgZXJyb3IgdGV4dCBhbHdheXMgc2FpZCAwCiAgYnl0ZXMuIEkgbW9kaWZpZWQgdGhpcyB0byBvdXRwdXQgdGhlIGFjdHVhbGx5IHRyYW5zZmVycmVkIGFtb3VudCEgOi0pCgotIFRoZSBGVFAgZml4ZXMgaW4gcHJlNyBkaWRuJ3QgY29tcGlsZSBvbiBJUHY2IGVuYWJsZWQgaG9zdHMuIERvZXMgbm93LiBJIGFsc28KICBhZGRlZCBtb3JlIGNvbW1lbnRzIGluIHRoZSBsaWIvZnRwLmMgc291cmNlIGZpbGUuCgotIE1pbm9yIHVwZGF0ZXMgdG8gdGhlIEZBUSwgYWRkZWQgYSBicmFuZCBuZXcgc2VjdGlvbiB0byB0aGUgd2ViIHNpdGUgYWJvdXQKICB0aGUgbmFtZSBpc3N1ZSAod2hvIG93bnMgImN1cmwiPyB3aWxsIHNvbWVvbmUgc3VlIHVzPyBldGMgZXRjKToKICBodHRwOi8vY3VybC5oYXh4LnNlL2xlZ2FsL3RoZW5hbWUuaHRtbAoKVmVyc2lvbiA3LjkuMS1wcmU3CgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwMSkKLSBUaGUgY3VybF9lYXN5X2dldGluZm8oKSB0aW1lcnMgYWNjaWRlbnRhbGx5IGxvc3QgdGhlaXIgc3Vic2Vjb25kIGFjY3VyYWN5IGFzCiAgdGhlIGNhbGN1bGF0aW9ucyB1c2VkIGxvbmdzIGluc3RlYWQgb2YgZG91YmxlcyEgUGF1bCBIYXJyaW5ndG9uIHJlcG9ydGVkLgoKLSBUaGUgU1NMIFNvY2tldElzRGVhZCgpIGNoZWNrcyB3ZXJlbid0IGdvb2QgZW5vdWdoIChhcyBleHBlY3RlZCByZWFsbHkpLCBzbyBJCiAgaGFkIHRvIGFkZCBhIGdlbmVyaWMgaW50ZXJuYWwgdHJ5LWl0LW91dCBzeXN0ZW0uIElmIHRoZSByZXF1ZXN0IG9uIGEgcmUtdXNlZAogIGNvbm5lY3Rpb24gc2VlbXMgdG8gZmFpbCwgdGhlbiB3ZSBnbyBiYWNrIGFuZCBnZXQgYSBuZXcgKGZyZXNoKSBjb25uZWN0aW9uCiAgYW5kIHJlLXRyaWVzIHRoZSByZXF1ZXN0IG9uIHRoYXQgaW5zdGVhZC4gSXQga2luZCBvZiBtYWtlcyB0aGUKICBTb2NrZXRJc0RlYWQoKSBjaGVjayBvYnNvbGV0ZSwgYnV0IEkgdGhpbmsgaXQgaXMgYSBxdWlja2VyIHdheSBmb3IgdGhvc2UKICBjYXNlcyB3aGVyZSBpdCBhY3R1YWxseSBkaXNjb3ZlcnMgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBkZWFkLgoKLSBXaGVuIGZpeGluZyB0aGUgYWJvdmUsIEkgbm90aWNlZCB0aGF0IHdlIGRpZCBxdWl0ZSBhIGZldyB3cml0ZXMgdG8gc29ja2V0cwogIGluIGxpYmN1cmwgd2hlcmUgd2UgZGlkbid0IGNoZWNrIHRoZSByZXR1cm4gY29kZSAodGhhdCBpdCBhY3R1YWxseSB3b3JrZWQgdG8KICBzZW5kIHRoZSBkYXRhKS4gV2l0aCB0aGUgbmV3ICJhdHRlbXB0ZWQgcmVxdWVzdCIgc3lzdGVtIHdlIG11c3QgZGV0ZWN0IHRob3NlCiAgc2l0dWF0aW9ucyBzbyBJIHdlbnQgb3ZlciBhIGJ1bmNoIG9mIGZ1bmN0aW9ucywgY2hhbmdlZCByZXR1cm4gdHlwZXMgYW5kCiAgYWRkZWQgY2hlY2tzIGZvciB3aGF0IHRoZXkgYWN0dWFsbHkgcmV0dXJuLgoKVmVyc2lvbiA3LjkuMS1wcmU2CgpEYW5pZWwgKDMxIE9jdG9iZXIgMjAwMSkKLSBQYXVsIEhhcnJpbmd0b24gZGV0ZWN0ZWQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGFudCBTU0wgY29ubmVjdGlvbnMuIE9yIHRvIGJlCiAgbW9yZSBleGFjdCwgd2UgZGlkbid0IHByb3Blcmx5IGRldGVjdCB0aGF0IHRoZSBjb25uZWN0aW9uIHdhcyBkZWFkIGFuZCB0aGVuCiAgYSBzZWNvbmQgY29ubmVjdGlvbiB3b3VsZCB0cnkgdG8gcmUtdXNlIGl0IHdyb25nbHkuIFRoZSBzb2x1dGlvbiB0byB0aGlzCiAgcHJvYmxlbSBpcyBzdGlsbCBub3QgdmVyeSBjbGVhciBhbmQgSSdtIHdvcmtpbmcgb24gaXQuIE9uZSBPcGVuU1NMIGluc2lkZXIKICBzYWlkIHRoZXJlIGlzIG5vIHdheSB0byBrbm93IGlmIHRoZSBTU0wgY29ubmVjdGlvbiBpcyBhbGl2ZSBvciBub3Qgd2l0aG91dAogIGFjdHVhbGx5IHRyeWluZyBhbiBvcGVyYXRpb24uCgpEYW5pZWwgKDMwIE9jdG9iZXIgMjAwMSkKLSBJZiBhIGNvb2tpZSB3YXMgcmVhZCBmcm9tIGEgZmlsZSwgaXQgY291bGQgYWNjaWRlbnRhbGx5IHN0cmR1cCgpIGEgTlVMTAogIHBvaW50ZXIuIFBhdWwgSGFycmluZ3RvbiByZXBvcnRlZC4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9jb29raWUuYy5kaWZmP3IxPTEuMjUmcjI9MS4yNl0KCi0gVGhlIE1BTlVBTCBmaWxlIG5vdyBkb2N1bWVudHMgLXQgY29ycmVjdGx5LiBJIGFsc28gZml4ZWQgdGhlIC1UIGRlc2NyaXB0aW9uCiAgaW4gdGhlIGN1cmwuMSBtYW4gcGFnZS4KCkRhbmllbCAoMjkgT2N0b2JlciAyMDAxKQotIEpvaG4gSmFuc3NlbiBmb3VuZCBvdXQgdGhhdCBjdXJsX2Zvcm1hZGQgd2FzIG1pc3NpbmcgaW4gdGhlIGxpYmN1cmwuZGVmIGZpbGUKICBhbmQgdGhhdCB0aGUgZG9jcyBzdGF0ZWQgdGhlIHdyb25nIHJldHVybiB0eXBlIGZvciB0aGUgZnVuY3Rpb24uCgotIEFuZHLpcyBHYXJj7WEgZm91bmQgYSBidWcgd2l0aCBtdWx0aXBsZSBmaWxlcyBpbiB0aGUgY3VybF9mb3JtYWRkKCkgZnVuY3Rpb24sCiAgdGhhdCBJIHJlbW92ZWQgd2l0aCB0aGlzIHBhdGNoIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvZm9ybWRhdGEuYy5kaWZmP3IxPTEuMjUmcjI9MS4yNl0uCgotIEtldmluIFJvdGggYnJvdWdodCBhbm90aGVyIHBhdGNoIHRoYXQgbW92ZWQgdGhlIGN5Z3dpbiBwYWNrYWdlIGZpbGVzIHRvIHRoZQogIHBhY2thZ2VzL1dpbjMyL2N5Z3dpbiBkaXJlY3RvcnkuCgotIEEgYnVnIGluIHRoZSBjb25uZWN0aW9uIHJlLXVzZSBsb2dpYyBtYWRlIHJlcGVhdGVkIHJlcXVlc3RzIHRvIHRoZSBzYW1lIEZUUAogIHNlcnZlciAod2hlbiB1c2luZyBuYW1lK3Bhc3dvcmQgaW4gdGhlIFVSTCkgc29tZXRpbWVzIHVzZSBtb3JlIHRoYW4gb25lCiAgY29ubmVjdGlvbi4gW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi91cmwuYy5kaWZmP3IxPTEuMTY2JnIyPTEuMTY3XQoKLSBNb29uZXNhbXkgdHJhY2tlZCBkb3duIGFuZCBmaXhlZCBhIHByb2JsZW0gd2l0aCB0aGUgbmV3IDcuOS4xIGNvbm5lY3QKICBjb2RlLiBUaGlzIGNvcnJlY3RlZCB0aGUgZXJyb3IgS2V2aW4gUm90aCByZXBvcnRlZCBvbiB0aGUgNy45LjEtcHJlNSByZWxlYXNlCiAgKHRlc3QgMTkpLi4uCiAgW2h0dHA6Ly9jdnMuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4vdmlld2N2cy5jZ2kvY3VybC9jdXJsL2xpYi9jb25uZWN0LmMuZGlmZj9yMT0xLjEzJnIyPTEuMTRdCgpEYW5pZWwgKDI2IE9jdG9iZXIgMjAwMSkKLSBBZGRlZCB0ZXN0Mjggd2hpY2ggdmVyaWZpZXMgdGhhdCAiTG9jYXRpb246Ii1mb2xsb3dpbmcgd29ya3MgZXZlbiBpZiB0aGUKICBjb250ZW50cyBpcyBzZXBhcmF0ZWQgd2l0aCBtb3JlIHRoYW4gb25lIHNwYWNlLgoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDEpCi0gUmFtYW5hIE1va2thcGF0aSBwb2ludGVkIG91dCB0aGF0IExEQVAgdHJhbnNmZXJzIHdvdWxkICdoYW5nJyBhZnRlciB0aGUKICBjb3JyZWN0IGRhdGEgaGFzIGJlZW4gb3V0cHV0LgoKVmVyc2lvbiA3LjkuMS1wcmU1CgpEYW5pZWwgKDI0IE9jdG9iZXIgMjAwMSkKLSBULiBCaGFyYXRoIGZvdW5kIGEgbWVtb3J5IGxlYWsgaW4gdGhlIGNvb2tpZSBlbmdpbmUuIFdoZW4gd2UgdXBkYXRlIGEgY29va2llCiAgdGhhdCB3ZSBhbHJlYWR5IGtuZXcgYWJvdXQsIHdlIGxvc3QgYSBjaHVuayBvZiBtZW1vcnkgaW4gdGhlIHByb2dyZXNzLi4uIFRoZQogIGJyYW5kIG5ldyB0ZXN0IGNhc2UgMjcgbm93IHRlc3RzIGZvciB0aGlzIG9jY3VycmVuY2UuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvY29va2llLmMuZGlmZj9yMT0xLjI0JnIyPTEuMjVdCgpEYW5pZWwgKDIzIE9jdG9iZXIgMjAwMSkKLSBwYWNrX2hvc3RlbnQoKSBkaWRuJ3QgcHJvcGVybHkgYWxpZ24gc29tZSBwb2ludGVycywgc28gYXQgbGVhc3QgU1BBUkMgQ1BVcwogIHdvdWxkIGNvcmUuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvaG9zdGlwLmMuZGlmZj9yMT0xLjM0JnIyPTEuMzVdCgpEYW5pZWwgKDIyIE9jdG9iZXIgMjAwMSkKLSBUb20gQmVub2lzdCByZXBvcnRlZCB0aGF0IHRoaXMgU0dJIElSSVggY29tcGlsZXIgZGlkbid0IGhhbmRsZSBpbmRlbnRlZAogIHByZXByb2Nlc3NvciBpbnN0cnVjdGlvbnMsIHNvIHRoZXkncmUgbm8gbG9uZ2VyIGluIHRoZSBzb3VyY2UgY29kZSEKCi0gQXBwbGllZCBLZXZpbiBSb3RoJ3MgcGF0Y2hlcyB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCBjeWd3aW4gcGFja2FnZXMgZnJvbQogIHRoZSBvdXQtb2YtdGhlLWJveCBjdXJsIHJlbGVhc2UgYXJjaGl2ZXMuCgotIEkgZm9yZ290IHRvIG1lbnRpb24gaXQgYmVsb3csIGJ1dCBsaWJjdXJsIG5vdyBjbG9zZXMgY29ubmVjdGlvbnMgdGhhdCByZXBvcnQKICB0cmFuc2ZlciBmYWlsdXJlcy4gVW5jb25kaXRpb25hbGx5LiBUaGlzIGNvdWxkIGJlIG1hZGUgbW9yZSBuaWNlbHkgaW4gdGhlCiAgZnV0dXJlIGlmIHdlIHNldCBhIGZsYWcgb3Igc29tZXRoaW5nIHRoYXQgdGhlIGNvbm5lY3Rpb24gaXMgc3RpbGwgZ29vZCB0byBiZQogIHVzZWQgZm9yIHRoZSBlcnJvcnMgdGhhdCBrbm93IHRoYXQgZm9yIGEgZmFjdC4gV2UgaGF2ZSB0byBjbG9zZSB0aGUKICBjb25uZWN0aW9uIGZvciB0aGUgY2FzZXMgd2hlcmUgd2UgYWJvcnQgZm9yIGV4YW1wbGUgYSBIVFRQIHRyYW5zZmVyIGluIHRoZQogIG1pZGRsZSwgb3Igb3RoZXJ3aXNlIHdlIG1pZ2h0IHJlLXVzZSB0aGF0IGNvbm5lY3Rpb24gbGF0ZXIgd2l0aCBsb3RzIG9mIGRhdGEKICBzdGlsbCBiZWluZyBzZW50IHRvIHVzIG9uIGl0LiBbaHR0cDovL2N2cy5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi92aWV3Y3ZzLmNnaS9jdXJsL2N1cmwvbGliL3RyYW5zZmVyLmMuZGlmZj9yMT0xLjYzJnIyPTEuNjRdCgpEYW5pZWwgKDE5IE9jdG9iZXIgMjAwMSkKLSBDVVJMRV9HT1RfTk9USElORyBpcyBub3cgcmV0dXJuZWQgd2hlbiBhIEhUVFAgc2VydmVyIGRvZXNuJ3QgcmV0dXJuCiAgYW55dGhpbmcsIG5vdCBldmVuIGEgaGVhZGVyLiB0ZXN0IGNhc2UgMzcgd2FzIGFkZGVkIHRvIHRlc3QgZm9yIHRoaXMuCgotIFQuIEJoYXJhdGggbWFkZSBjdXJsX2Vhc3lfZHVwaGFuZGxlKCkgcHJvcGVybHkgY2xvbmUgdGhlIGNvb2tpZSBzdGF0dXMgYXMKICB3ZWxsLgoKVmVyc2lvbiA3LjkuMS1wcmU0CgpEYW5pZWwgKDE4IE9jdG9iZXIgMjAwMSkKLSBDVVJMT1BUX0ZBSUxPTkVSUk9SLCBzZXQgd2l0aCAiY3VybCAtLWZhaWwiIG5vIGxvbmdlciByZXR1cm5zIGFuIGVycm9yIGlmCiAgdGhlIEhUVFAgcmV0dXJuIGNvZGUgaXMgYmVsb3cgNDAwLgoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDEpCi0gVGhlIHRlc3Qgc3VpdGUgbm93IGtpbGxzIGFueSBydW5uaW5nIHRlc3QgaHR0cCBzZXJ2ZXIgd2hlbiB5b3UgcmUtc3RhcnQgdGhlCiAgdGVzdHMuCgotIFdlIGhhZCB0byByZW1vdmUgJ3VzZSBzdHJpY3QnIGZyb20gdHdvIHBlcmwgc2NyaXB0cywgYXMgdGhlIGN5Z3dpbgogIGFkanVzdG1lbnRzIGRpZG4ndCBwbGF5IG5pY2VseSBvdGhlcndpc2UgZm9yIHNvbWUgcmVhc29uLiBBbnkgcGVybCB3aXphcmQKICBvdXQgdGhlcmUgd2hvIGNhbiBwdXQgdGhlIHNjcmljdCBiYWNrIGFuZCBzdGlsbCBtYWtlIGl0IHJ1biBnb29kIG9uIHVuaXggYW5kCiAgY3lnd2luPwoKLSBBIHBvdGVudGlhbCBtZW1vcnkgbGVhayBwb2ludGVkIG91dCB0byB1cyBieSBZYW5pY2sgUGVsbGV0aWVyIHdhcyByZW1vdmVkLgogIEl0IHdvdWxkIG9jY3VyIHdoZW4gYSBodHRwIGZpbGUgdHJhbnNmZXIgZmFpbHMuIFtodHRwOi8vY3ZzLnNvdXJjZWZvcmdlLm5ldC9jZ2ktYmluL3ZpZXdjdnMuY2dpL2N1cmwvY3VybC9saWIvdHJhbnNmZXIuYy5kaWZmP3IxPTEuNjAmcjI9MS42MV0KCi0gVGhlIG1lbW9yeSBkZWJ1Z2dpbmcgc3lzdGVtIHNob3VsZCBubyBsb25nZXIgZGlzcGxheSBhbnl0aGluZyB0byBzdGRlcnIKICBpZiB0aGUgY3VybF9tZW1kZWJ1ZygpIGhhc24ndCBiZWVuIHVzZWQgdG8gZXhwbGljaXRseSBzYXkgc28uIFRoaXMgbWFrZXMgaXQKICBlYXNpZXIgdG8gdXNlIHRoZSBtZW1vcnkgZGVidWcgc3lzdGVtIGFuZCBzd2l0Y2ggdGhlIGxvZ2dpbmcgb24vb2ZmLgoKRGFuaWVsICgxNiBPY3RvYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBmaXhlcyBmb3IgYnVpbGRpbmcgY3VybCBuaWNlciBpbiBjeWd3aW4gZW52aXJvbm1lbnRzLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDEpCi0gQ2xlYW5pbmcgdXAgdGhlIHByb2dyZXNzIG1ldGVyL2luZm8gY29kZS4gVGhlICJjdXJyZW50IHNwZWVkIiBpcyBub3cgbW9yZQogIGFjY3VyYXRlIHRoYW4gYmVmb3JlIGFzIHdlIG5vdyB1c2UgdGhlIHRydWUgdGltZSBzcGVudCBiZXR3ZWVuIHRoZSBtZWFzdXJlcywKICBhbmQgbm90IGp1c3QgImFzc3VtaW5nIiBldmVyeS1zZWNvbmQtdXBkYXRlIGxpa2UgYmVmb3JlLiBUaGUgb3V0cHV0IHNob3VsZAogIG5vdyBhbHNvIGJlIG9mIHRoZSBzYW1lIHdpZHRoIGF0IGFsbCB0aW1lcywgbmV2ZXIgdG8gc2hvdyAiZXh0cmEiIHplcm9lcyBvbgogIHRoZSByaWdodCBlZGdlLgoKLSBBZnRlciB0YWxraW5nIGFib3V0IHBvc3NpYmxlIExvY2F0aW9uOiBidWdzIG9uIHRoZSBtYWlsaW5nIGxpc3QsIEkgbW9kaWZpZWQKICB0aGUgImFic29sdXRlIFVSTCIgY2hlY2tlciBpbiBsaWIvdHJhbnNmZXIuYyB0byBiZSBtb3JlIHN0cmljdCB3aGVuIGNoZWNraW5nCiAgaWYgdGhlIHJlZGlyZWN0ZWQgVVJMIGlzIGFic29sdXRlLgoKRGFuaWVsICgxMSBPY3RvYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBwYXRjaGVzIHRoYXQgbWFrZSB0aGUgdGVzdCBzdWl0ZSBydW4gZmluZSBvbiBXaW5kb3dzCiAgMjAwMCBydW5uaW5nIGN5Z3dpbi4KCkRhbmllbCAoMTAgT2N0b2JlciAyMDAxKQotIFNldHRpbmcgdGhlIC1jIG9yIHRoZSBDVVJMT1BUX0NPT0tJRUpBUiBvcHRpb24gbm93IGVuYWJsZXMgdGhlIGNvb2tpZSBwYXJzZXIuCiAgUHJldmlvdXNseSAtYiBvciBDVVJMT1BUX0NPT0tJRUZJTEUgd2FzIGFsc28gcmVxdWlyZWQgZm9yIHRoZSBqYXIgdG8gd29yay4KClZlcnNpb24gNy45LjEtcHJlMwoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMSkKLSBBZGRlZCBhIG5ldyBvcHRpb24gdG8gdGhlIGNvbW1hbmQgbGluZSBjbGllbnQ6IC0wLy0taHR0cDEuMC4gSXQgdXNlcyB0aGUgbmV3CiAgbGliY3VybCBvcHRpb24gQ1VSTE9QVF9IVFRQX1ZFUlNJT04gdG8gcmVxdWVzdCB0aGF0IGxpYmN1cmwgdXNlcyBIVFRQIDEuMAogIHJlcXVlc3RzIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgdmVyc2lvbiAoMS4xKS4gSXQgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UKICByZWFsbHkgTVVTVCBkbyB0aGF0IGJlY2F1c2Ugb2YgYSBzaWxseSByZW1vdGUgc2VydmVyLgoKLSBSZW5hbWVkIHRoZSAnVGltZUNvbmQnIHR5cGVkZWYgaW4gY3VybC9jdXJsLmggdG8gdXNlIGEgJ2N1cmxfJyBwcmVmaXggYXMKICBhbGwgcHVibGljIGN1cmwtc3ltYm9scyBzaG91bGQuCgotIGxpYmN1cmwgbm93IGV4cGxpY2l0bHkgaWdub3JlcyB0aGUgU0lHUElQRSBzaWduYWwuCgpEYW5pZWwgKDggT2N0b2JlciAyMDAxKQotIEtldmluIFJvdGgncyBjaGFuZ2UgdG8gdGhlIGNvb2tpZS1qYXIgY29tbWVudCAoaW4gdGhlIHN0b3JlZCBmaWxlKSB3YXMKICBhcHBsaWVkLgoKLSBMdWNhcyBBZGFtc2tpJ3MgbWlub3IgYnVnIGluIHRoZSBiaW5kIGVycm9yIGNvZGUgZmFpbGYoKSB3YXMgZml4ZWQuCgpEYW5pZWwgKDUgT2N0b2JlciAyMDAxKQotIE1vb25lc2FteSBmaXhlZCB0aGUgQ3VybF9jb25uZWN0aG9zdCgpIGZ1bmN0aW9uIHRvIG5vdCBnaXZlIGNvbXBpbGVyIGVycm9ycwogIG9uIGEgYnVuY2ggb2YgY29tcGlsZXJzLCBkdWUgdG8gdGhlIGFyZ3VtZW50IG5hbWVkICdzb2NrZXQnLgoKLSBNb29uZXNhbXkgYWxzbyBwcm92aWRlZCB1cGRhdGVkIFZDKysgbWFrZWZpbGVzIGFuZCBwcm9qZWN0IGZpbGVzLgoKVmVyc2lvbiA3LjkuMS1wcmUyCgpEYW5pZWwgKDQgT2N0b2JlciAyMDAxKQotIEFsYmVydCBDaGluIHByb3ZpZGVkIGEgY29uZmlndXJlIHBhdGNoIHRoYXQgbWFrZXMgdGhlIHNjcmlwdCBkZXRlY3QgcHJvcGVyCiAgZ2V0aG9zdGJ5bmFtZV9yKCkgbWV0aG9kIHdpdGhvdXQgYWN0dWFsbHkgcnVubmluZyBhbnkgY29kZSwgb25seSBjb21waWxpbmcKICBpcyBuZWNlc3NhcnkuIFRoaXMgYWxzbyByZW1vdmVzIHRoZSBuZWVkIG9mIGhhdmluZyBhIHJlc29sdmluZyAnbG9jYWxob3N0JwogIG5hbWUuCgotIEZvdW5kIGFuZCByZW1vdmVkIG1lbW9yeSBsZWFrYWdlIChuYW1lIHJlc29sdmUgZGF0YSkgaW4gbGliY3VybCBvbgogIElQdjYtZW5hYmxlZCBob3N0cy4gVGhlc2UgY291bGQgc25lYWsgdGhyb3VnaCBiZWNhdXNlIHdlIGRpZG4ndCBoYXZlIGFueQogIHJlc291cmNlIHRyYWNpbmcgb24gdGhlIElQdjYtcmVsYXRlZCBmdW5jdGlvbnMuIFdlIGRvIG5vdy4KCkRhbmllbCAoMyBPY3RvYmVyIDIwMDEpCi0gS2VpdGggTWNHdWlnYW4gcGF0Y2hlZCBhd2F5IGEgKG1haW5seSBXaW5kb3dzLSkgcHJvYmxlbSB3aXRoIHRoZSBuYW1lCiAgcmVzb2x2ZXIgZGF0YSBiZWluZyBrZXB0IGluIHRoZSBzdGF0aWMgbWVtb3J5IGFyZWEsIHdoaWNoIGlzIHJlbW92ZWQgd2hlbiBhCiAgdGhyZWFkIGlzIGtpbGxlZC4gVGhlIGN1cmwgaGFuZGxlIGl0c2VsZiB0aG91Z2ggcGVyZmVjdGx5IGhhbmRsZXMgYmVpbmcKICBwYXNzZWQgYmV0d2VlbiB0aHJlYWRzLgoKLSBEaXJrIEVkZGVsYnVldHRlbCByZXBvcnRlZCBhbiBvZGQgYnVnIHRoYXQgdHVybmVkIG91dCB0byBiZSBoaXMgcHJveHkgdGhhdAogIHJlcXVpcmVkIGFuIEF1dGhvcml6YXRpb246IGhlYWRlci4gTm93LCBwcm94aWVzIGFyZSBub3Qgc3VwcG9zZWQgdG8gcmVxdWlyZQogIHRoYXQgaGVhZGVyLCB0aGF0IGlzIGZvciB0cnVlIHNlcnZlcnMuLi4KCi0gSSBhY2NpZGVudGFsbHkgcnVpbmVkIEdlb3JnJ3MgY3VybF9mb3JtYWRkKCkuIFVoLCBiYWQgbWUuIENvcnJlY3RlZCBub3cuCgpWZXJzaW9uIDcuOS4xLXByZTEKCkRhbmllbCAoMyBPY3RvYmVyIDIwMDEpCi0gR2VvcmcgSHVldHRlbmVnZ2VyIG9uY2UgYWdhaW4gbWFkZSBhbiBlZmZvcnQgYmV5b25kIHRoZSBjYWxsIG9mIGR1dHkgYW5kIG5vdAogIG9ubHkgaW1wcm92ZWQgdGhlIGN1cmxfZm9ybWFkZCgpIGZ1bmN0aW9uLCBidXQgYWxzbyB0b29rIGNhcmUgb2YgYWRqdXN0aW5nCiAgdGhlIGN1cmwgY29tbWFuZCBsaW5lIGNsaWVudCB0byB1c2UgdGhpcyBuZXcgZnVuY3Rpb24gaW5zdGVhZCBvZiB0aGUKICBvYnNvbGV0ZWQgY3VybF9mb3JtcGFyc2UuCgpEYW5pZWwgKDIgT2N0b2JlciAyMDAxKQotIE1ham9yIGZpeCBpbiBob3cgbGliY3VybCBkb2VzIFRDUCBjb25uZWN0cy4gSXQgbm93IGRvZXMgbm9uLWJsb2NraW5nCiAgY29ubmVjdHMgdG8gZW5hYmxlIGdvb2QgdGltZW91dHMgd2l0aG91dCBzaWduYWxzLCBhbmQgaXQgbm93IHRyaWVzIGFsbCBJUAogIGFkZHJlc3NlcyBmb3IgYW55IGdpdmVuIGhvc3QgKGlmIGl0IHJlc29sdmVzIG1vcmUgdGhhbiBvbmUgYW5kIHRoZSBmaXJzdAogIG9uZShzKSBkb24ndCBjb25uZWN0KS4gQWRkZWQgYSBuZXcgc291cmNlIGZpbGUgJ2Nvbm5lY3QuYycgdG8gZGVhbCB3aXRoIGFsbAogIHRoZSBUQ1AgY29ubmVjdCBzdHVmZi4KCi0gV2Ugbm93IHN1cHBvcnQgSVB2NC1zdHlsZSBJUC1hZGRyZXNzZXMgaW4gcmZjMjczMi1mb3JtYXQsIHRvIGJldHRlciBzdXBwb3J0CiAgcGVvcGxlIHdyaXRpbmcgc2NyaXB0cyB3aXRob3V0IGtub3dpbmcgd2hhdCBhZGRyZXNzIHRoZXJlIGlzLgoKRGFuaWVsICgyOCBTZXB0ZW1iZXIgMjAwMSkKLSBDbGVhbnVwcyBpbiB0aGUgRlRQIHNvdXJjZSBjb2RlLiBEaXZpZGVkIHRoZSBjb2RlIGludG8gZXZlbiBtb3JlIHNtYWxsZXIKICBmdW5jdGlvbnMgYW5kIGdlbmVyYWxseSB0cmllZCB0byBtYWtlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIElQdjQgYW5kIElQdjYKICBnZXQgbGVzcyBub3RpY2FibGUgaW4gdGhlIHNvdXJjZXMuCgotIElmIHRoZSByZW1vdGUgZmlsZSB0aW1lIGlzIG5vdCByZWFkYWJsZS9hY2Nlc3NhYmxlL3VuZGVyc3Rvb2QgYnkgbGliY3VybCwKICBsaWJjdXJsIG5vdyByZXR1cm5zIC0xIGluIHRoZSBDVVJMSU5GT19GSUxFVElNRSBkYXRhLCBub3QgMCBhcyBpdCBwcmV2aW91c2x5CiAgZGlkLiBUaGlzIHNob3VsZCBtYWtlIGN1cmwgbm90IHRvdWNoIHRoZSBmaWxlIGRhdGEgdW5sZXNzIHRoZXJlIHdhcyBhIGtub3duCiAgcmVtb3RlIGRhdGUgd2hlbiAtUiBpcyB1c2VkLgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwMSkKLSBXb3JraW5nIG9uIGdldHRpbmcgbm9uLWJsb2NraW5nIGNvbm5lY3RzIHdvcmtpbmcgcGxhdGZvcm0gaW5kZXBlbmRlbnQuIFdlCiAgd2lsbCBhbHNvIG1ha2UgY3VybCB0cnkgYWxsIElQcyBmb3IgYSBnaXZlbiBob3N0IGlmIHRoZSBmaXJzdCBvbmUgc2hvdWxkCiAgZmFpbC4KCkRhbmllbCAoMjYgU2VwdGVtYmVyIDIwMDEpCi0gS2V2aW4gUm90aCBwcm92aWRlZCBhIGNvb2tpZSBleGFtcGxlIHRoYXQgcHJvdmVkIHRoZSBjb29raWUgamFyCiAgZnVuY3Rpb25hbGl0eSB3YXNuJ3Qgd29ya2luZyBwcm9wZXJseS4gSSBhZGRlZCB0ZXN0IGNhc2UgNDYgYW5kIG1hZGUgaXQKICB3b3JrLgoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwMSkKLSBK9nJuIEhhcnRyb3RoIHVwZGF0ZWQgdGhlIG1pbmd3MzIgbWFrZWZpbGVzLgoKVmVyc2lvbiA3LjkKCkRhbmllbCAoMjMgU2VwdGVtYmVyIDIwMDEpCi0gRm91bmQgYW5kIHJlbW92ZWQgYSAnc29ja2V0IGxlYWsnIHRoYXQgd291bGQgb2NjdXIgb24gSVB2NiBlbmFibGVkIGhvc3RzCiAgd2hlbiBGVFAgUkVUUiBmYWlsZWQuCgotIE1hZGUgdGhlIEZUUCB1cGxvYWQgdGVzdHMgcnVuIGZpbmUgb24gbWFjaGluZXMgd2l0aCBJUHY2IGVuYWJsZWQuCgpWZXJzaW9uIDcuOS1wcmU4CgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDAxKQotIFZvanRlY2ggTWluYXJpayBzZXQgdXAgYSBzcGVjaWFsLXB1cnBvc2UgdGVzdCBzZXJ2ZXIgYW5kIHByb3ZpZGVkIG1lIHdpdGgKICB0ZXN0IGNlcnRpZmljYXRlcyBpbiBvcmRlciBmb3IgbWUgdG8gcmVwZWF0IHRoZSBidWcgcmVwb3J0cyAjNDQwMDY4IGFuZAogICM0NDAzNzMuIEl0IHR1cm5lZCBvdXQgd2UgZGlkbid0IGNoZWNrIGFsbCB0aGUgZXJyb3IgY29kZXMgcHJvcGVybHkuIFdlIGRvCiAgbm93LCBhbmQgY29ubmVjdGluZyB3aXRoIGEgdW5hY2NlcHRhYmxlIGNlcnRpZmljYXRlIHdpbGwgbWFrZSBsaWJjdXJsIGZhaWwKICB0byBjb25uZWN0IHdpdGggYW4gZXJyb3IgY29kZSByZXR1cm5lZC4KCi0gUmFtYW5hIE1va2thcGF0aSBmb3VuZCBhIGNhc2Ugd2hlbiB0aGUgTG9jYXRpb246IGZvbGxvd2luZyBjb2RlIGRpZCB3cm9uZy4KICBJIHdyb3RlIGEgdGVzdCBjYXNlIGZvciB0aGlzICg0NSkuCgpWZXJzaW9uIDcuOS1wcmU3CgpEYW5pZWwgKDE3IFNlcHRlbWJlciAyMDAxKQotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgZml4ZWQgdGVsbmV0IGZvciB3aW4zMi4gSXQgbWFrZXMgbGliY3VybCByZXF1aXJlCiAgd2luc29jayAyLjAuCgpWZXJzaW9uIDcuOS1wcmU2CgotIGxpYnRvb2wgMS40LjIgaXMgbm93IGluIHVzZSEKClZlcnNpb24gNy45LXByZTUKCkRhbmllbCAoMTQgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgYW5vdGhlciAxNCBmdHAgdGVzdHMuCgpEYW5pZWwgKDEzIFNlcHRlbWJlciAyMDAxKQotIEFkZGVkIGN1cmxfZWFzeV9kdXBoYW5kbGUoKSB0byB0aGUgZWFzeS5oIGhlYWRlciBmaWxlLiBJdCBoYXMgbm93IGJlZW4KICB0ZXN0ZWQgYW5kIHByb3ZlZCB0byB3b3JrIGluIGEgcmVhbC13b3JsZCB0ZXN0cyBieSBUIEJoYXJhdGguIFdlIHN0aWxsIG5lZWQKICB0byB3cml0ZSB1cCBzb21lIGRvY3MgZm9yIHRoaXMgZnVuY3Rpb24uCgotIEFkZGVkIGZvdXIgbW9yZSBmdHAgdGVzdHMgdG8gdGhlIHRlc3Qgc3VpdGUuCgpEYW5pZWwgKDEyIFNlcHRlbWJlciAyMDAxKQotIENVUkxPUFRfU1NMX0NJUEhFUl9MSVNUIHdhcyBhZGRlZCwgYW5kIHRoZSBjdXJsIHRvb2wgb3B0aW9uIGlzIG5hbWVkCiAgLS1jaXBoZXJzLiBVc2UgdGhlbSB0byBzcGVjaWZ5IGEgbGlzdCBvZiBjaXBoZXJzIHRvIHVzZSBpbiB0aGUgU1NMCiAgY29ubmVjdGlvbi4KCi0gVC4gQmhhcmF0aCBmb3VuZCBhIG1lbW9yeSBsZWFrIGluIGxpYmN1cmwncyB3aW5kb3dzIHZlcnNpb24uIEl0IHR1cm5lZCBvdXQKICB0byBiZSB0aGUgbmV3IGR1cGhhbmRsZSgpIHRoYXQgZGlkbid0IHF1aXRlIHdvcmsgeWV0LgoKVmVyc2lvbiA3LjktcHJlNAoKRGFuaWVsICgxMSBTZXB0ZW1iZXIgMjAwMSkKLSBBZGRlZCB2ZXJib3NlIG91dHB1dCBmb3IgU1NMIGNvbm5lY3Rpb25zIHRoYXQgb3V0cHV0IHRoZSBzZXJ2ZXIKICBjZXJ0aWZpY2F0ZSdzIHN0YXJ0IGFuZCBleHBpcmUgZGF0ZXMuIEFzIHN1Z2dlc3RlZCBieSBQYXVsIEhhcnJpbmd0b24uCgotIEhlaWtraSBLb3JwZWxhIGZvdW5kIHByb2JsZW1zIGluIHRoZSBwZXJsIGZ0cCBzZXJ2ZXIgdXNlZCBmb3IgdGhlIHRlc3QKICBzdWl0ZSwgd2hlbiBoZSBydW5zIG9uIG9uIE9wZW5CU0Qgd2l0aCBwZXJsIDUuNi4gU29tZSBjaGFuZ2VzIGhhdmUgYmVlbgogIG1hZGUsIGJ1dCBub3RoaW5nIHJlYWxseSBjZXJ0YWluLgoKLSBULiBCaGFyYXRoIGhhcyBleHBlcmllbmNlZCBwcm9ibGVtcyB3aXRoIGxpYmN1cmwncyBzdGFjayB1c2FnZSBvbiB3aW5kb3dzCiAgYW5kIHdvcmtzIG9uIHJlZHVjaW5nIGl0LgoKRGFuaWVsICgxMCBTZXB0ZW1iZXIgMjAwMSkKLSBDcmlzIEJhaWxpZmYgZml4ZWQgdGhlIHBlcmwgaW50ZXJmYWNlLiBJdCBzdG9wcGVkIHdvcmtpbmcgc2luY2UgdGhlIGNoYW5nZWQKICBiZWhhdmlvciB3aXRoIFdSSVRFSEVBREVSIGFuZCBOVUxMIHBvaW50ZXJzLgoKLSBUaGUgIm91dHB1dCBjb29raWVzIiBmdW5jdGlvbiBjb3VsZCBkdW1wIGNvcmUgaWYgbm8gY29va2llcyB3ZXJlIGVuYWJsZWQuCgpEYW5pZWwgKDcgU2VwdGVtYmVyIDIwMDEpCi0gU00gcG9pbnRlZCBvdXQgdGhhdCB0aGUgU1NMIGNvZGUgZGlkbid0IGNvbXBpbGUgYW55IGxvbmdlciBpZiBTU0wgd2FzCiAgZGlzYWJsZWQuLi4gQWxzbywgd2UgbmVlZGVkIHRvIGNvcnJlY3QgdGhlICNpbmNsdWRlIGZvciB0aGUgdXRpbWUgc3R1ZmYgb24KICB3aW5kb3dzLgoKRGFuaWVsICg2IFNlcHRlbWJlciAyMDAxKQotIFQuIEJoYXJhdGggcG9pbnRlZCBvdXQgYSBmbGF3IGluIHRoZSBTU0wgc2Vzc2lvbiBjYWNoZSBjb2RlIHRoYXQgbWFkZSBpdAogIHNvbWV0aW1lcyByZWFkIGZyb20gYSBOVUxMIHBvaW50ZXIuCgpWZXJzaW9uIDcuOS1wcmUzCgpEYW5pZWwgKDMgU2VwdGVtYmVyIDIwMDEpCi0gQWRkZWQgdGhlIC1SLy0tcmVtb3RlLXRpbWUgb3B0aW9uLCB0aGF0IHVzZXMgdGhlIHJlbW90ZSBmaWxlJ3MgZGF0ZXN0YW1wIHRvCiAgc2V0IHRoZSBsb2NhbCBmaWxlJ3MgZGF0ZXN0YW1wLiBUaHVzLCB3aGVuIHlvdSBnZXQgYSByZW1vdGUgZmlsZSB5b3VyIGxvY2FsCiAgZmlsZSB3aWxsIGdldCB0aGUgc2FtZSB0aW1lIGFuZCBkYXRlLiBOb3RlIHRoYXQgdGhpcyBvbmx5IHdvcmtzIHdoZW4geW91IHVzZQogIC1vIG9yIC1PLgoKLSBJbnN0YWxsZWQgbGlidG9vbCAxLjQuMSwgbGlidG9vbGl6ZWQgYW5kIGV2ZXJ5dGhpbmcuCgpEYW5pZWwgKDEgU2VwdGVtYmVyIDIwMDEpCi0gSGVpa2tpIEtvcnBlbGEgcG9pbnRlZCBvdXQgdGhhdCBJIGRpZCBub3Qgc2hpcCB0aGUgcHJvcGVyIGxpYnRvb2wgc3R1ZmYgaW4gCiAgdGhlIHByZS1yZWxlYXNlcywgZXZlbiB0aG91Z2ggdGhhdCB3YXMgbXkgaW50ZW50aW9uLiBsaWJ0b29saXplIGhhcyBub3cKICBiZWVuIHJlLXJ1bi4KCi0gSGVpa2tpIGFsc28gcGF0Y2hlZCBhd2F5IHRoZSBiYWQgdXNlIG9mICdtYWtlIC1DJyBpbiB0aGUgdGVzdCBzdWl0ZQogIG1ha2VmaWxlLiBtYWtlIC1DIGlzIG5vdCB2ZXJ5IHBvcnRhYmxlIGFuZCBpcyBub3cgYmFubmVkIGZyb20gaGVyZS4KClZlcnNpb24gNy45LXByZTIKCkRhbmllbCAoMzEgQXVndXN0IDIwMDEpCi0gSSBqdXN0IG1hZGUgYSBodWdlIGludGVybmFsIHN0cnVjdCByZWhhdWwsIGFuZCBhbGwgdGhlIGJpZyBpbnRlcm5hbGx5IHVzZWQKICBzdHJ1Y3RzIGhhdmUgYmVlbiByZW5hbWVkLCByZWRlc2lnbmVkIGFuZCBzdHVmZiBoYXZlIGJlZW4gbW92ZWQgYXJvdW5kIGEgYml0CiAgdG8gbWFrZSB0aGUgc291cmNlIGVhc2llciB0byBmb2xsb3csIG1vcmUgbG9naWNhbGx5IGdyb3VwZWQgYW5kIHRvIGhvcGVmdWxseQogIGRlY3JlYXNlIGZ1dHVyZSBidWdzLiBJIGFsc28gaG9wZSB0aGF0IHRoaXMgd2lsbCBtYWtlIG5ldyBmdW5jdGlvbnMgdG8gZ2V0CiAgZWFzaWVyIHRvIGFkZCwgYW5kIG1ha2UgaXQgbGVzcyBsaWtlbHkgdGhhdCB3ZSBoYXZlIGJ1Z3MgbGVmdCBsaWtlIHRoZSBVUkwtCiAgZnJlZSBidWcgZnJvbSBBdWd1c3QgMjMuCgpWZXJzaW9uIDcuOS1wcmUxCgpEYW5pZWwgKDI5IEF1Z3VzdCAyMDAxKQotIFRoZSBuZXcgY29va2llIGNvZGUgaGF2ZSBlbmFibGVkIHRoZSBicmFuZCBuZXcgJy1jLy0tY29va2llLWphcicgb3B0aW9uLiBVc2UKICB0aGF0IHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBpbiB3aGljaCB5b3Ugd2FudCB0byBoYXZlIGFsbCBjb29raWVzIGN1cmwKICBrbm93cyBvZiwgZHVtcGVkIHRvLiBJdCdsbCBiZSB3cml0dGVuIHVzaW5nIHRoZSBuZXRzY2FwZSBjb29raWUgZm9ybWF0LgoKICBUaGlzIGlzIGludGVybmFsbHkgZG9uZSB3aXRoIHRoZSBuZXcgQ1VSTE9QVF9DT09LSUVKQVIgb3B0aW9uIHRvIGxpYmN1cmwsCiAgd2hpY2ggaW4gdHVybiBkdW1wcyB0aGlzIGluZm9ybWF0aW9uIHdoZW4gY3VybF9lYXN5X2NsZWFudXAoKSBpcyBpbnZva2VkLgogIFRoZXJlIG1pZ2h0IGJlIHJlYXNvbnMgdG8gcmUtY29uc2lkZXIgbXkgY2hvaWNlIG9mIHB1dHRpbmcgaXQgdGhlcmUuIFBlcmhhcHMKICBpdCBpcyBiZXR0ZXIgcGxhY2VkIHRvIGdldCBkb25lIGp1c3QgYmVmb3JlICpfcGVyZm9ybSgpIGlzIGRvbmUuIEl0IGlzIGFsbAogIG9mIGNvdXJzZSBkZXBlbmRpbmcgb24gaG93IHlvdSBndXlzIHdhbnQgdG8gdXNlIHRoaXMgZmVhdHVyZS4uLgoKLSBBZGRlZCBmdHB1cGxvYWQuYyBpbiB0aGUgc291cmNlIGV4YW1wbGVzIHNlY3Rpb24sIGJhc2VkIG9uIHNvdXJjZSBjb2RlIHBvc3RlZAogIGJ5IEVyaWNrIE51d2VuZGFtLgoKRGFuaWVsICgyOCBBdWd1c3QgMjAwMSkKLSBOb3cgcnVubmluZyBsaWJ0b29sIENWUyBicmFuY2gtMS00IHRvIGdlbmVyYXRlIHN0dWZmLiBTaG91bGQgZml4IHByb2JsZW1zCiAgb24gT3BlbkJTRCBhbmQgaG9wZWZ1bGx5IG9uIEZyZWVCU0QgYXMgd2VsbCEKCi0gR2VvcmcgSHVldHRlbmVnZ2VyIG1vZGlmaWVkIHRoZSBjdXJsX2Zvcm1hZGQoKSBmdW5jdGlvbmFsaXR5IHNsaWdodGx5LCBhbmQKICBhZGRlZCBzdXBwb3J0IGZvciBlcnJvciBjb2RlIDQxNyB3aGVuIGRvaW5nIGZvcm0gcG9zdCBhbmQgdXNpbmcgdGhlIEV4cGVjdDoKICBoZWFkZXIuIEdyZWF0IHdvcmshCgotIE1hZGUgc29tZSB0ZXN0cyB3aXRoIGNhY2hlZCBTU0wgc2Vzc2lvbiBJRHMsIGFuZCB0aGV5IHNlZW0gdG8gd29yay4gVGhlcmUKICBzaG91bGQgYmUgYSBzaWduaWZpY2FudCBzcGVlZCBpbXByb3ZlbWVudCBpbiB0aGUgU1NMIGNvbm5lY3Rpb24gcGhhc2UsIGJ1dAogIGluIG15IHRpbnkgdGVzdHMgaXQganVzdCBpc24ndCBwb3NzaWJsZSB0byBub3RpY2UgYW55IGRpZmZlcmVuY2UuIExpa2Ugb3RoZXIKICBjYWNoaW5nIGluIGxpYmN1cmwsIHlvdSBtdXN0IHJldXNlIHRoZSBzYW1lIGhhbmRsZSBmb3IgdGhlIGNhY2hpbmcgdG8gdGFrZQogIGVmZmVjdC4gU1NMIHNlc3Npb24gSUQgY2FjaGluZyBpcyBkb25lIG9uIGEgcGVyIGhvc3QtbmFtZSBhbmQgZGVzdGluYXRpb24KICBwb3J0IG51bWJlciBiYXNpcy4KCiAgU2V0IHZlcmJvc2UsIGFuZCB5b3UnbGwgZ2V0IGluZm9ybWF0aW9uYWwgdGVzdHMgd2hlbiBsaWJjdXJsIGRldGVjdHMgYW5kCiAgdXNlcyBhIHByZXZpb3VzIFNTTCBzZXNzaW9uIElELgoKLSBVcGdyYWRlZCB0byBhdXRvbWFrZSAxLjUgb24gbXkgZGV2ZWxvcG1lbnQvcmVsZWFzZSBtYWNoaW5lLgoKRGFuaWVsICgyNyBBdWd1c3QgMjAwMSkKLSBTbG93bHkgc3RhcnRlZCB3cml0aW5nIFNTTCBzZXNzaW9uIElEIGNhY2hpbmcgY29kZQoKRGFuaWVsICgyNCBBdWd1c3QgMjAwMSkKLSBULiBCaGFyYXRoIHJlbW92ZWQgY29tcGlsZXIgd2FybmluZ3Mgb24gd2luZG93cyBhbmQgdXBkYXRlZCB0aGUgTVMgcHJvamVjdAogIGZpbGVzLgoKLSBLZXZpbiBSb3RoIHJlcG9ydGVkIHR3byBraW5kcyBvZiBjb21tYW5kIGxpbmUgY29uc3RydWN0cyB3aXRoIHRoZSBuZXcgLUcgdGhhdAogIGN1cmwgZGlkbid0IHJlYWxseSBkZWFsIHdpdGggdGhlIHdheSBvbmUgd291bGQgbGlrZS4KCi0gVGltIENvc3RlbGxvIHBhdGNoZWQgYXdheSBhIHVzZSBvZiBzdHJjYXNlY21wKCkgaW4gdGhlIFNTTCBjb2RlLiBXZSBoYXZlIG91cgogIG93biBwb3J0YWJsZSB2ZXJzaW9uIG5hbWVkIHN0cmVxdWFsKCkgdGhhdCBzaG91bGQgYmUgdXNlZCEKCi0gVGltIGFsc28gcG9pbnRlZCBvdXQgYSBwcm9ibGVtIGluIHRoZSBsaWIvTWFrZWZpbGUudmM2IGZpbGUgdGhhdCBtYWRlIGl0IG1peAogIGRlYnVnIG9iamVjdCBtb2R1bGVzIGNhdXNpbmcgY29uZnVzaW9ucy4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDEpCi0gVC4gQmhhcmF0aCBhY2N1cmF0ZWx5IGZvdW5kIGEgbGliY3VybCBidWcgdGhhdCB3b3VsZCBoYXBwZW4gd2hlbiBkb2luZyBhCiAgc2Vjb25kIGludm9rZSBvZiBjdXJsX2Vhc3lfcGVyZm9ybSgpIHdpdGggYSBuZXcgVVJMIHdoZW4gdGhlIHByZXZpb3VzIGludm9rZQogIGZvbGxvd2VkIGEgTG9jYXRpb246IGhlYWRlci4KCi0gU3RhcnRlZCB0aGUgaW1wcm92ZW1lbnQgd29yayBvbiB0aGUgY29va2llIGVuZ2luZToKICAtIE5vdyBrZWVwcyBjb29raWVzIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBjb29raWUgZmlsZQogIC0gQSB3cml0ZSB0byB0aGUgcG9zc2libHkgc3RhdGljIHN0cmluZyB3YXMgcmVtb3ZlZAogIC0gQWRkZWQgYSBmdW5jdGlvbiB0aGF0IGNhbiBvdXRwdXQgYWxsIGNvb2tpZXMKICAtIE5vdyBzdXBwb3J0cyByZWFkaW5nIG11bHRpcGxlIGNvb2tpZSBmaWxlcwoKLSBTdGV2ZSBMaG9tbWUgY29ycmVjdGVkIGEgRExMIG5hbWluZyBpc3N1ZSBpbiB0aGUgTVNWQysrIHByb2plY3QgZmlsZS4KCi0gU3BsaXQgdXAgdGhlIG1vbnN0ZXIgZnVuY3Rpb24gaW4gbGliL2Z0cC5jIHRvIHVzZSBtb3JlIHNtYWxsaXNoIGZ1bmN0aW9ucyB0bwogIGluY3JlYXNlIHJlYWRhYmlsaXR5IGFuZCBtYWludGFpbmFiaWxpdHkuCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAxKQotIEdlb3JnIEh1ZXR0ZW5lZ2dlcidzIGJpZyBwYXRjaCB3YXMgYXBwbGllZC4gTm93IHdlIGhhdmU6CiAgbyAiRXhwZWN0OiAxMDAtY29udGludWUiIHN1cHBvcnQuIFdlIHdpbGwgZnJvbSBub3cgb24gc2VuZCB0aGF0IGhlYWRlciBpbgogICAgYWxsIHJmYzE4NjctcG9zdHMsIGFzIHRoYXQgbWFrZXMgdXMgYWJvcnQgbXVjaCBmYXN0ZXIgd2hlbiB0aGUgc2VydmVyCiAgICByZWplY3RzIG91ciBQT1NULiBQb3N0aW5nIHdpdGhvdXQgdGhlIEV4cGVjdDogaGVhZGVyIGlzIHN0aWxsIHBvc3NpYmxlIGluCiAgICB0aGUgc3RhbmRhcmQgcmVwbGFjZS1pbnRlcm5hbC1oZWFkZXIgc3R5bGUuCiAgbyBjdXJsX2Zvcm1hZGQoKSBpcyBhIG5ldyBmb3JtcG9zdCBidWlsZGluZyBmdW5jdGlvbiB0aGF0IGlzIGludHJvZHVjZWQgdG8KICAgIHJlcGxhY2UgdGhlIG5vdyBkZXByZWNhdGVkIGN1cmxfZm9ybXBhcnNlKCkgZnVuY3Rpb24uIFRoZSBsYXR0ZXIgZnVuY3Rpb24KICAgIHdpbGwgc3RpbGwgaGFuZyBhcm91bmQgZm9yIGEgd2hpbGUsIGJ1dCB0aGUgY3VybF9mb3JtYWRkKCkgaXMgdGhlIG5ldyB3YXkKICAgIGFuZCBjb3JyZWN0IHdheSB0byBidWlsZCBmb3JtIHBvc3RzLgogIG8gRG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlc2UgY2hhbmdlcwoKICBUaGVzZSBjaGFuZ2VzIGFyZSByZWFzb24gZW5vdWdoIHRvIG5hbWUgdGhlIG5leHQgY3VybCByZWxlYXNlIDcuOS4uLgoKLSBXZSBub3cgY29udmVydCBtYW4gcGFnZXMgdG8gSFRNTCBwYWdlcyBhbmQgaW5jbHVkZSB0aGVtIGluIHRoZSByZWxlYXNlCiAgYXJjaGl2ZS4gRm9yIHRoZSBwbGVhc3VyZSBvZiBldmVyeW9uZSB3aXRob3V0IG5yb2ZmIHdpdGhpbiByZWFjaC4KCi0gQW5kculzIEdhcmPtYSdzIHN1Z2dlc3RlZCBmbHVzaGluZyBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgb3V0cHV0IHN0cmVhbSB3YXMKICBhZGRlZC4gSXQgc2hvdWxkIG1ha2UgdGhlIHByb2dyZXNzIG1ldGVyIGxvb2sgYmV0dGVyIG9uIFdpbmRvd3MuCgotIFRyb3kgRW5nZWwgcG9pbnRlZCBvdXQgYSBtaXN0YWtlIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHRoYXQgbWFkZSBpdCBmYWlsCiAgb24gbWFueSBSZWQgSGF0IGJveGVzIQoKRGFuaWVsICgyMCBBdWd1c3QgMjAwMSkKLSBXZSBuZWVkIGFuIHVwZGF0ZWQgbGlidG9vbCB0byBtYWtlIGEgYmV0dGVyIGJ1aWxkIGVudmlyb25tZW50IGZvciBPcGVuQlNECiAgYXMgd2VsbCBhcyBGcmVlQlNECgpWZXJzaW9uIDcuOC4xCgpEYW5pZWwgKDIwIEF1Z3VzdCAyMDAxKQotIEJyYWQgcG9pbnRlZCBvdXQgdGhhdCB3ZSBzaGlwIHR3byBleHRyYSBsaWJ0b29sIGZpbGVzIGluIHRoZSB0YXJiYWxscyB0aGF0CiAgd2UgcmVhbGx5IGRvbid0IG5lZWQgdG8hIFJlbW92aW5nIHRoZW0gbWFrZXMgdGhlIGd6LWFyY2hpdmUgYWJvdXQgNjBLCiAgc21hbGxlciEKCi0gQWxiZXJ0IENoaW4gYnJvdWdodCBmaXhlcyBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gZGV0ZWN0IHNvY2tsZW5fdAogIHByb3Blcmx5IGFzIHdlbGwgYXMgbW92aW5nIGxvdHMgb2Ygb3VyIGN1c3RvbSBhdXRvY29uZiBtYWNyb3MgdG8KICBhY2luY2x1ZGUubTQuCgpEYW5pZWwgKDE5IEF1Z3VzdCAyMDAxKQotIE1vb25lc2FteSBpbXByb3ZlZCBoaXMgLUcgZmVhdHVyZSBmb3IgaG9zdCBuYW1lcyBvbmx5IFVSTHMuLi4KCkRhbmllbCAoMTcgQXVndXN0IDIwMDEpCi0gRmluYWxseSBjbGVhbmVkIHVwIHRoZSBrZXJiZXJvcyBjb2RlIHRvIHVzZSBDdXJsXyBwcmVmaXhlcyBvbiBhbGwgZ2xvYmFsCiAgc3ltYm9scyBhbmQgdG8gbm90IHVzZSBnbG9iYWwgdmFyaWFibGVzLgoKVmVyc2lvbiA3LjguMS1wcmU2CgpEYW5pZWwgKDE2IEF1Z3VzdCAyMDAxKQotIFMuIE1vb25lc2FteSBhZGRlZCB0aGUgLUcgb3B0aW9uIHRvIGN1cmwsIHRoYXQgY29udmVydHMgdGhlIGRhdGEgc3BlY2lmaWVkCiAgd2l0aCAtZCB0byBhIEdFVCByZXF1ZXN0LiBEZWZhdWx0IGFjdGlvbiB3aGVuIHVzaW5nIC1kIGlzIFBPU1QuIFdoZW4gLUcgaXMKICB1c2VkLCB0aGUgLWQgc3BlY2lmaWVkIGRhdGEgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgVVJMIHdpdGggYSAnPycKICBzZXBhcmF0b3IuIEFzIHN1Z2dlc3RlZCBwcmV2aW91c2x5IGJ5IEtldmluIFJvdGguCgotIGN1cmwtY29uZmlnIC0tbGlicyBzaG91bGQgbm93IGRpc3BsYXkgYWxsIGxpbmtlciBvcHRpb25zIHJlcXVpcmVkIHRvIGxpbmsKICB3aXRoIGxpYmN1cmwuIEl0IGluY2x1ZGVzIHRoZSBwYXRoIGFuZCBvcHRpb25zIGZvciBsaWJjdXJsIGl0c2VsZi4KICBjdXJsLWNvbmZpZyAtLWNmbGFncyBkaXNwbGF5cyB0aGUgY29tcGlsZXIgb3B0aW9uKHMpIG5lZWRlZCB0byBjb21waWxlCiAgc291cmNlIGZpbGVzIHRoYXQgdXNlIGxpYmN1cmwgZnVuY3Rpb25zLiBCYXNpY2FsbHksIHRoYXQgc2V0cyB0aGUgaW5jbHVkZQogIHBhdGggY29ycmVjdC4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDEpCi0gQXJrYWRpdXN6IE1pc2tpZXdpY3ogcG9pbnRlZCBvdXQgYSBtaXN0YWtlIGluIGhvdyBJUHY2LXN0eWxlIElQLWFkZHJlc3NlcwogIHdlcmUgcGFyc2VkIGFuZCB1c2VkLiAoUkZDMjczMi1mb3JtYXQpCgotIEJ1ZyAjMTI3MzMgb3ZlciBvbiBwaHAubmV0IGlkZW50aWZpZWQgYSBwcm9ibGVtIGluIGxpYmN1cmwgdGhhdCBtYWRlIGl0IGNvcmUKICBkdW1wIGlmIHlvdSB1c2VkIENVUkxPUFRfUE9TVCB3aXRob3V0IHNldHRpbmcgYW55IGRhdGEgdG8gcG9zdCB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTISBUaGlzIGlzIG5vIGxvbmdlciB0aGUgY2FzZS4gTm90IHVzaW5nIENVUkxPUFRfUE9TVEZJRUxEUwogIG5vdyBlcXVhbHMgc2V0dGluZyBpdCB0byBubyBkYXRhIGF0IGFsbC4KCi0gUmFtYW5hIE1va2thcGF0aSByZXBvcnRlZCB0aGF0IGN1cmwgd2l0aCAnLXcgJXtodHRwX2NvZGV9JyBkaWRuJ3Qgd29yawogIHByb3Blcmx5IHdoZW4gdXNlZCBmb3IgbXVsdGlwbGUgVVJMcyBvbiBhIHNpbmdsZSBjb21tYW5kIGxpbmUuIEluZGVlZCwgdGhlCiAgdmFyaWFibGUgd2FzIG5vdCByZXNldCBiZXR3ZWVuIHRoZSByZXF1ZXN0cy4gVGhpcyBpcyBub3cgZml4ZWQuCgotIERhdmlkIEphbWVzIGZpeGVkIHRoZSBCb3JsYW5kIG1ha2VmaWxlIHNvIHRoYXQgbGliY3VybCBzdGlsbCBjb21waWxlcyBhbmQKICBidWlsZHMgd2l0aCB0aGF0IGNvbXBpbGVyLgoKRGFuaWVsICgxNCBBdWd1c3QgMjAwMSkKLSBPb3BzLiBJIHJ1aW5lZCBOaWNvJ3Mgc29ja2xlbl90IGRlZmluZSBpbiBjb25maWctdm1zLmgsIGNvcnJlY3RlZCBpdCBub3cuCgotIEFuIG9sZGVyIGl0ZW0gbm90IG1lbnRpb25lZCBoZXJlIGJlZm9yZTogQ1VSTF9HTE9CQUxfV0lOMzIgaXMgYSBkZWZpbmUgZm9yCiAgd2luZG93cyB1c2VycyB0byBjdXJsX2dsb2JhbF9pbml0KCksIHRoYXQgbWFrZXMgbGliY3VybCBpbml0IHRoZSB3aW5zb2NrCiAgc3R1ZmYuIElmIGxpYmN1cmwgaXMgYWxsIHNvY2tldCBzdHVmZiB5b3UgZG8sIHRoZW4gYWxsb3dpbmcgaXQgdG8gZmlkZGxlCiAgd2l0aCB0aGlzIGlzIGEgY29tZm9ydGFibGUgc2hvcnRjdXQgdG8gZmFtZS4KClZlcnNpb24gNy44LjEtcHJlNQoKRGFuaWVsICgxNCBBdWd1c3QgMjAwMSkKLSBOaWNvIEJhZ2d1cyBwcm92aWRlZCBtb3JlIGZlZWRiYWNrIGZyb20gaGlzIFZNUyBwb3J0aW5nIGVmZm9ydHMgYW5kIGEgZmV3CiAgbWlub3IgY2hhbmdlcyB3ZXJlIG5lY2Vzc2FyeS4KCi0gSSBtb2RpZmllZCBjb25maWd1cmUuaW4gc28gdGhhdCAtLWVuYWJsZS1kZWJ1ZyBzZXRzIG1vcmUgcGlja3kgZ2NjIG9wdGlvbnMuCiAgSSB0aGVuIHJlbW92ZWQgYWxtb3N0IGFsbCB0aGUgbmV3IHdhcm5pbmdzIHRoYXQgYXBwZWFyZWQsIGFuZCBieSBkb2luZyBzbyBJCiAgY29ycmVjdGVkIHRoZSBzaXplX3QtdHJlYXRlZC1hcy1zaWduZWQgcHJvYmxlbSB0aGF0IGhhcyBiZWVuIGRpc2N1c3NlZCBvbgogIHRoZSBtYWlsaW5nIGxpc3QgcHJldmlvdXNseS4gSSBhbHNvIHJlbW92ZWQgYSBidW5jaCBvZiB0aGUganVzdCByZWNlbnRseQogIGFkZGVkICNpZmRlZiBWTVMgbGluZXMuCgotIEkgcmVtb3ZlZCB0aGUgdXNlIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSBTU0wgY29kZS4gSXQgd2FzIG9uY2UKICBuZWNlc3NhcnkgYnV0IGhhc24ndCBiZWVuIG5lZWRlZCBzaW5jZSBPcGVuU1NMIDAuOS40LiBUaGUgb2xkIGNvZGUgc2hvdWxkCiAgKGhvcGVmdWxseSkgc3RpbGwgd29yayBpZiBsaWJjdXJsIGlzIGJ1aWx0IGFnYWluc3QgYW4gYW5jaWVudCB2ZXJzaW9uIG9mCiAgT3BlblNTTC4KCkRhbmllbCAoMTMgQXVndXN0IDIwMDEpCi0gUGV0ZXIgVG9kZCBwb3N0ZWQgYSBwYXRjaCB0aGF0IG5vdyBhbGxvd3Mgbm9uLWZpbGUgcmMxODY3LXN0eWxlIGZvcm0gcG9zdHMKICB0byBiZSBsYXJnZXIgdGhhbiA0Sy4KCkRhbmllbCAoMTAgQXVndXN0IDIwMDEpCi0gUy4gTW9vbmVzYW15IGZpeGVkIGJ1Z3MgZm9yIGJ1aWxkaW5nIGRlYnVnIGFuZCBTU0wgbGliIGluIFZDIG1ha2VmaWxlCgpEYW5pZWwgKDkgQXVndXN0IDIwMDEpCi0gVGhlIHJlZGlyZWN0ZWQgZXJyb3Igc3RyZWFtIHdhcyBjbG9zZWQgYmVmb3JlIHRoZSBjdXJsX2Vhc3lfY2xlYW51cCgpIGNhbGwKICB3YXMgbWFkZSwgYW5kIHdoZW4gVkVSQk9TRSB3YXMgZW5hYmxlZCwgdGhlIGNsZWFudXAgZnVuY3Rpb24gdHJpZWQgdG8gdXNlCiAgdGhlIHN0cmVhbS4gSXQgY291bGQgbGVhZCB0byBhIHNlZ21lbnRhdGlvbiBmYXVsdC4gQWxzbywgdGhlIHN0cmVhbSB3YXMKICBjbG9zZWQgZXZlbiBpZiB3ZSBsb29wZWQgdG8gZ2V0IG1vcmUgZmlsZXMuICBDb3JyZWN0cyBEdXN0aW4gQm9zd2VsbCdzIGJ1ZwogIHJlcG9ydCAjNDQxNjEwCgotIE5vdyBnZW5lcmF0ZXMgdGhlIHJlbGVhc2UgY29uZmlndXJlIHNjcmlwdCB3aXRoIGF1dG9jb25mIDIuNTIKClZlcnNpb24gNy44LjEtcHJlNAoKRGFuaWVsICg4IEF1Z3VzdCAyMDAxKQotIGN1cmwgLUUgdXNlcyBhIGNvbG9uIHRvIHNlcGFyYXRlIGEgZmlsZSBuYW1lIGZyb20gYSBwYXNzcGhyYXNlLiBUaGlzIHR1cm5lZAogIG91dCByZWFsbHkgYmFkIGZvciB0aGUgd2luZG93cyBwZW9wbGUgd2hvIHdhbnRzIHRvIGluY2x1ZGUgYSBkcml2ZSBsZXR0ZXIgaW4KICB0aGUgZmlsZSBuYW1lIGxpa2UgImM6XGNlcnQucGVtIi4gVGhlcmUncyBub3cgYSB3aW4zMiB3b3JrLWFyb3VuZAogIGltcGxlbWVudGVkIHRoYXQgdHJpZXMgd29yayBhcm91bmQgdGhhdCwgd2hlbiB0aGUgY29sb24gc2VlbXMgdG8gYmUgdXNlZCBmb3IKICB0aGlzIGtpbmQgb2YgY29uc3RydWN0LgoKLSBQYXRyaWNrIEJpaGFuLUZhb3UgaW50cm9kdWNlZCBDVVJMT1BUX1NTTF9WRVJJRllIT1NULCB3aGljaCBtYWtlcyBjdXJsCiAgdmVyaWZ5IHRoZSBzZXJ2ZXIncyBDTiBmaWVsZCB3aGVuIHRhbGtpbmcgaHR0cHM6Ly8uIElmIC0tY2FjZXJ0IGlzIG5vdCB1c2VkLAogIGFueSBmYWlsdXJlcyBpbiBtYXRjaGluZyBpcyBvbmx5IGRpc3BsYXllZCBhcyBpbmZvcm1hdGlvbiAoLXYpLgoKRGFuaWVsICg3IEF1Z3VzdCAyMDAxKQotIFdyb3RlIHVwIG5pbmUgbW9yZSB0ZXN0IGNhc2VzLCBtb3JlIG9yIGxlc3MgY29udmVydGVkIGZyb20gdGhlIGZvcm1lciB0ZXN0CiAgc3VpdGUuCgpEYW5pZWwgKDYgQXVndXN0IDIwMDEpCi0gSGVpa2tpIEtvcnBlbGEgcG9zdGVkIGEgcGF0Y2ggdGhhdCBtYWtlcyAnY3VybC1jb25maWcgLS1saWJzJyBpbmNsdWRlIHRoZQogIGRpcmVjdG9yeSBpbiB3aGljaCBsaWJjdXJsIGl0c2VsZiBpcyBpbnN0YWxsZWQgaW4uIFdoaWxlIHRoaXMgd2Fzbid0IG15CiAgaW5pdGlhbCBpbnRlbnRpb24gd2l0aCB0aGlzIG9wdGlvbiwgaXQgbWFrZXMgc2Vuc2UgYW5kIG1ha2VzIGxpbmtpbmcgd2l0aAogIGxpYmN1cmwgZWFzaWVyLgoKLSBTdGVmYW4gVWxyaWNoIHBvaW50ZWQgb3V0IHRvIHVzIHRoYXQgb3RoZXIgdG9vbHMgYW5kIGxpYnJhcmllcyB0cmVhdCBmaWxlOi8vCiAgVVJMcyB3aXRoIG9ubHkgb25lIHNsYXNoIGFmdGVyIHRoZSBob3N0IG5hbWUgc2xpZ2hseSBkaWZmZXJlbnQgdGhhbiBsaWJjdXJsCiAgZG9lcy4gU2luY2UgYWxsIHRoZSBvdGhlcnMgc2VlbSB0byBhZ3JlZSwgd2UgYmV0dGVyIGZvbGxvdyB0aGVtLgoKLSBOaWNvIEJhZ2d1cyBwcm92aWRlZCB1cyB3aXRoIGEgaHVnZSBzZXQgb2YgZml4ZXMgdG8gbWFrZSBjdXJsIGNvbXBpbGUgYW5kCiAgYnVpbGQgdW5kZXIgT3BlblZNUy4KClZlcnNpb24gNy44LjEtcHJlMwoKRGFuaWVsICg2IEF1Z3VzdCAyMDAxKQotIEpvbmF0aGFuIEhzZXUgbm90aWNlZCB0aGF0IHlvdSBjb3VsZG4ndCBnZXQgYSBoZWFkZXIgY2FsbGJhY2sgdW5sZXNzIHlvdQogIHNldCBDVVJMT1BUX1dSSVRFSEVBREVSIHRvIG5vbi1OVUxMLCBldmVuIGlmIHlvdSBkaWRuJ3QgY2FyZSBhYm91dCB0aGF0CiAgZGF0YS4gVGhpcyBpcyBub3cgZml4ZWQuCgpEYW5pZWwgKDUgQXVndXN0IDIwMDEpCi0gU2VyZ2lvIEJhbGxlc3RyZXJvIHByb3ZpZGVkIGEgcGF0Y2ggZm9yIHJlYWRpbmcgcmVzcG9uc2VzIGZyb20gTkNTQSBodHRwZAogIDEuNS54IHNlcnZlcnMsIGFzIHRoZXkgcmV0dXJuIHJlYWxseSBzY3Jld2VkIHVwIHJlc3BvbnNlIGhlYWRlcnMgd2hlbiBhc2tlZAogIGZvciB3aXRoIEhUVFAgMS4xLgoKLSBjdXJsX2VzY2FwZSgpIG5vIGxvbmdlciB0cmVhdHMgYWxyZWFkeSBlbmNvZGVkIGNoYXJhY3RlcnMgaW4gdGhlIGlucHV0CiAgc3RyaW5nIGVzcGVjaWFsbHkuCgpEYW5pZWwgKDMgQXVndXN0IDIwMDEpCi0gSSByZXBsYWNlZCB0aGUgZm9ybWVyIGxpYi9hcnBhX3RlbG5ldC5oIGZpbGUgd2l0aCBvbmUgSSB3cm90ZSBteXNlbGYsIHRvCiAgYXZvaWQgdGhlIEJTRCBhbm5vdWNlbWVudCBjbGF1c2Ugb2YgdGhlIGxpY2Vuc2UgaW4gdGhlIGZvcm1lciBmaWxlLgoKLSBBbmRyZXcgRnJhbmNpcyBwcm92aWRlZCBhIG5ldyB2ZXJzaW9uIG9mIGJhc2U2NC5jIHRvIHdvcmsgYXJvdW5kIHRoZSBsaWNlbnNlCiAgYm9pbGVyIHBsYXRlIHRoYXQgY2FtZSB3aXRoIHRoZSBwcmV2aW91cyBvbmUuIEkgcGF0Y2hlZCBpdCwgYnV0IHRoZSBnbG9yeQogIHNob3VsZCBnbyB0byBBbmRyZXcgZm9yIGhpcyBoZWFkcyB1cC4KCi0gVG9tYXN6IExhY2tpIG5vdGljZWQgdGhhdCB3aGVuIHlvdSBkbyByZXBlYXRlZCB0cmFuc2ZlcnMgd2l0aCBsaWJjdXJsIHlvdQogIGNvdWxkbid0IGFsd2F5cyByZWxpYWJseSBjaGFuZ2UgSFRUUCByZXF1ZXN0LiBUaGlzIGhhcyBub3cgYmVlbiBmaXhlZCBhbmQgYQogIG5ldyBsaWJjdXJsIG9wdGlvbiB3YXMgYWRkZWQ6IENVUkxPUFRfSFRUUEdFVCwgdGhhdCBjYW4gZm9yY2UgdGhlIEhUVFAKICByZXF1ZXN0ciAoYmFjaykgdG8gR0VULgoKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHBvaW50ZWQgb3V0IHRoYXQgaHR0cHNzZXJ2ZXIucGwgd2Fzbid0IGluY2x1ZGVkIGluCiAgcmVsZWFzZSBhcmNoaXZlcy4gSXQgc2hvdWxkIGJlIG5vdy4KCkRhbmllbCAoMiBBdWd1c3QgMjAwMSkKLSBGcmFuayBLZWVuZXkgcG9pbnRlZCBvdXQgYSBtYW51YWwgbWlzdGFrZSBmb3IgY2VydGlmaWNhdGUgY29udmVydGlvbnMuCgotIFRvbWFzeiBMYWNraSBwb2ludGVkIG91dCBhIHByb2JsZW0gaW4gdGhlIHRyYW5zZmVyIGxvb3AgdGhhdCBjb3VsZCBtYWtlIHRoZQogIHNlbGVjdCgpIGxvb3AgdXNlIGZhciB0b28gbXVjaCBDUFUuCgotIFBhd2VsIEEuIEdhamRhIHBvaW50ZWQgb3V0IGFuIG91dHB1dCBtaXN0YWtlIGRvbmUgd2hlbiB1c2luZyBsaWJjdXJsJ3MKICBwcm9ncmVzcyBjYWxsYmFjay4KCkRhbmllbCAoMjkgSnVuZSAyMDAxKQotIE5hdmVlbiBOb2VsIG5vdGljZWQgdGhhdCB0aGUgQm9ybGFuZCBsaWJyYXJ5IG1ha2VmaWxlIHdhc24ndCB1cGRhdGVkLgoKLSBOaWMgUm9ldHMgYnJvdWdodCBhIGZpeCBmb3IgdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiB3aGVuIHVzaW5nIFNTTC4KCkRhbmllbCAoMjcgSnVuZSAyMDAxKQotIE1hZGUgdGhlIEZUUCB0ZXN0cyBydW4gT0sgZXZlbiBvbiBtYWNoaW5lcyBydW5uaW5nIGN1cmwgSVB2Ni1lbmFibGVkLgoKLSBUcm95IEVuZ2VsIGNvcnJlY3RlZCBzb21lIFJQTSBwYWNrYWdlIGRldGFpbHMuCgpWZXJzaW9uIDcuOC4xLXByZTIKCkRhbmllbCAoMjUgSnVuZSAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIGNvcnJlY3RseSBpZGVudGlmaWVkIGEgcHJvYmxlbSB0aGF0IG9jY3VycmVkIHdoZW4gZG93bmxvYWRpbmcKICBzZXZlcmFsIGZpbGVzIHdpdGggY3VybCwgYW5kIHVzaW5nIHJlc3VtZS4gVGhlIGZpcnN0IGZpbGUncyByZXN1bWUgaW5kZXggd2FzCiAgdGhlbiB1c2VkIGZvciBhbGwgZmlsZXMsIHJlc3VsdGluZyBpbiB3ZWlyZCByZXN1bHRzLi4uCgotIEFudG9uIEthbG15a292IHByb3ZpZGVkIGEgZml4IHRoYXQgbWFrZXMgY3VybCB3b3JrIHdpdGggZm9ybSBmaWVsZCBuYW1lcwogIHdpdGggc3BhY2VzIGxpa2Ugd2hlbiAtRiBpcyB1c2VkLgoKVmVyc2lvbiA3LjguMS1wcmUxCgpEYW5pZWwgKDIwIEp1bmUgMjAwMSkKLSBNaWtlIEJ5dG5hciBwcm92aWRlZCBhIGZpbmUgcmVwb3J0IHRoYXQgcHJvdmVkIHRoYXQgdGhlIC0td2l0aC1zc2wgb3B0aW9uCiAgZm9yIGNvbmZpZ3VyZSBuZWVkZWQgdHdlYWtpbmcuIEl0IG5vIGxvbmdlciBzZWFyY2hlcyB0aGUgZGVmYXVsdCBkaXJlY3RvcmllcwogIGZvciBPcGVuU1NMIGxpYnMgb3IgZGlyZWN0b3JpZXMgd2hlbiBhIHNwZWNpZmllZCBwYXRoIGlzIGdpdmVuLgoKRGFuaWVsICgxOSBKdW5lIDIwMDEpCi0gV2hlbiBhbiBGVFAgdHJhbnNmZXIgaXMgY3V0IG9mZiBkdXJpbmcgdHJhbnNmZXIsIGN1cmwgY291bGQgcHJlc2VudCBhIHRydWx5CiAgZ2FyYmFnZWQgZXJyb3IgbWVzc2FnZSBhbmQgaW4gd29yc3QgY2FzZSBkdW1wIGNvcmUuIFRoYW5rcyB0byBkZXRhaWxlZAogIHJlcG9ydHMgZnJvbSBTaGF3biBQb3Vsc29uIHdlIG5haWxlZCB0aGlzLgoKRGFuaWVsICgxMiBKdW5lIDIwMDEpCi0gU2FsdmFkb3IgROF2aWxhIHByb3ZpZGVkIGEgZml4IGZvciBGVFAgcmFuZ2UgZG93bmxvYWRzLgoKLSBBZGRlZCBhIGZldyBtb3JlIHRlc3QgY2FzZXMgZnJvbSB0aGUgZm9ybWVyIHRlc3Qgc3VpdGUgdG8gdGhlIG5ldyBmaWxlCiAgZm9ybWF0LiBXZSdyZSBub3cgYXQgYSB0b3RhbCBvZiAyNiB0ZXN0cy4KCkRhbmllbCAoMTEgSnVuZSAyMDAxKQotIGxpYmN1cmwncyB2ZXJzaW9uLWluZm8gd2FzIHdyb25nLCBhcyBub3RlZCBieSBib3RoIERvbWVuaWNvIEFuZHJlb2xpIGFuZAogIERhdmlkIE9kaW4uCgpEYW5pZWwgKDcgSnVuZSAyMDAxKQotIEr2cm4gZml4ZWQgdGhlIGN1cmxfdW5lc2NhcGUgZHVwbGljYXRlIGVudHJ5IGluIGxpYi9saWJjdXJsLmRlZgoKLSBJIG1hZGUgU1NMIGNlcnRpZmljYXRlIGZhaWx1cmUgbWVzc2FnZXMgdG8gYmUgbW9yZSBkZXRhaWxlZC4KClZlcnNpb24gNy44CgpEYW5pZWwgKDcgSnVuZSAyMDAxKQotIFNEYXZpbGEgcHJvdmlkZWQgYSByZXN1bWVkIGRvd25sb2FkIGZpeC4KClZlcnNpb24gNy44LXByZTQKCkRhbmllbCAoMSBKdW5lIDIwMDEpCi0gU3RlcmxpbmcgcHJvdmlkZWQgc29tZSBuZXcgUEhQIGV4YW1wbGVzLgoKLSBDaGFuZ2VkIHRoZSBDVlMgaGllcmFyY2h5IGFuZCB0aGUgb2xkZXIgY2hlY2tvdXQgaW5zdHJ1Y3Rpb24gZG9lcyBubyBsb25nZXIKICB3b3JrLiBXZSBtb3ZlZCB0aGUgZW50aXJlIHNvdXJjZSBjb2RlIGludG8gYSBDVlMgbW9kdWxlIG5hbWVkICdjdXJsJy4KCkRhbmllbCAoMzEgTWF5IDIwMDEpCi0gQ1VSTE9QVF9NVVRFIGRvZXMgbm90IGV4aXN0IGFueW1vcmUuIEl0IGlzIHN0aWxsIHByZXNlbnQgaW4gdGhlIGluY2x1ZGUgZmlsZQogIHRvIG5vdCBjYXVzZSBjb21waWxlciBlcnJvcnMgZm9yIGFwcGxpY2F0aW9ucyB1c2luZyBpdCwgYnV0IGl0IGlzbid0IHVzZWQKICBhbnl3aGVyZSBpbiB0aGUgbGlicmFyeS4KClZlcnNpb24gNy44LXByZTMKCkRhbmllbCAoMzEgTWF5IDIwMDEpCi0gT25jZSBhbmQgZm9yIGFsbCBmaXhlZCB0aGUgX1JFRU5UUkFOVCBtZXNzIGZvciBTb2xhcmlzIGNvbXBpbGVzIHRvIHByZXNlbnQKICBsZXNzIHdhcm5pbmdzLgoKLSBTdGVybGluZyBIdWdoZXMgdGlyZWxlc3NseSBwb2ludHMgb3V0IGFuZCBjb3JyZWN0cyBteSBtaXN0YWtlcy4uLiEgU28sCiAgY3VybF9nbG9iYWxfaW5pdCgpIG5vdyBsZXRzIHRoZSBhcmd1bWVudCBmbGFncyAqU0VUKiB3aGF0IHBhcnRzIHRvCiAgaW5pdC4gQ1VSTF9HTE9CQUxfREVGQVVMVCBtYWtlcyBhIG5pY2UgZGVmYXVsdCwgQ1VSTF9HTE9CQUxfQUxMIGluaXRzIGFsbAogIGtub3duIHN1YnN5c3RlbXMgYW5kIENVUkxfR0xPQkFMX05PTkUgaW5pdHMgbm90aGluZyBtb3JlIHRoYW4gYWJzb2x1dGVseQogIG5lY2Vzc2FyeS4gTWFuIHBhZ2UgdXBkYXRlZCBhY2NvcmRpbmdseS4KCi0gRml4ZWQgdGhlIHN0cnRvay5oIGluY2x1ZGUgZmlsZSBhcyBpdCB3b3VsZG4ndCBjb21waWxlIG9uIGFsbCBwbGF0Zm9ybXMhCgpEYW5pZWwgKDMwIE1heSAyMDAxKQotIE1hZGUgbGliY3VybCBieSBkZWZhdWx0IGFjdCBhcyBpZiBDVVJMT1BUX01VVEUgYW5kIENVUkxPUFRfTk9QUk9HUkVTUyB3ZXJlCiAgc2V0IFRSVUUuIFNldCB0aGVtIHRvIEZBTFNFIHRvIG1ha2UgbGliY3VybCBtb3JlIHRhbGthdGl2ZS4gVGhlICpfTVVURQogIG9wdGlvbiBpcyBzdWJqZWN0IGZvciBjb21wbGV0ZSByZW1vdmFsLi4uCgpWZXJzaW9uIDcuOC1wcmUyCgpEYW5pZWwgKDMwIE1heSAyMDAxKQotIENyaXMgQmFpbGlmZiB3cm90ZSBhIG1ha2VmaWxlIGZvciBidWlsZGluZyBTb2xhcmlzIHBhY2thZ2VzLgoKLSBTdGVybGluZyBIdWdoZXMgYnJvdWdodCBmaXhlcyBmb3IgJ2J1aWxkY29uZicgKHRoZSBidWlsZC1mcm9tLUNWUyB0b29sKSBhbmQKICB3ZSBkaXNjdXNzZWQgYW5kIGFkZGVkIGEgZmV3IENVUkxfR0xPQkFMXyogZmxhZ3MgaW4gaW5jbHVkZS9jdXJsLmgKCi0gS2pldGlsIEphY29ic2VuIHByaXZhdGVseSBhbm5vdW5jZWQgaGlzIHB5dGhvbiBpbnRlcmZhY2UgdG8gbGliY3VybCwKICBhdmFpbGFibGUgYXQgaHR0cDovL3B5Y3VybC5zb3VyY2Vmb3JnZS5uZXQvCgpEYW5pZWwgKDI5IE1heSAyMDAxKQotIFN0ZXJsaW5nIEh1Z2hlcyBmaXhlZCBhIHN0cnRvaygpIHByb2JsZW0gaW4gbGliY3VybC4gSXQgaXMgbm90IGEgdGhyZWFkLQogIHNhZmUgZnVuY3Rpb24uIE5vdyBjb25maWd1cmUgY2hlY2tzIGZvciBhIHRocmVhZC1zYWZlIHZlcnNpb24sIGFuZAogIGxpYi9zdHJ0b2suYyBvZmZlcnMgb25lIGZvciB0aGUgc3lzdGVtcyB0aGF0IGRvbid0IGNvbWUgd2l0aCBvbmUgaW5jbHVkZWQhCgotIE1ldHRndXQgSmFtYWxsYSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIHdhcyB3cml0dGVuCiAgdG8gc3RkZXJyIGV2ZW4gdGhvdWdoIC0tc3RkZXJyIHJlZGlyZWN0aW9uIHdhcyB1c2VkLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQuCgotIEkgbW92ZWQgb3V0IHRoZSBsaXN0IG9mIGNvbnRyaWJ1dG9ycyBmcm9tIHRoZSBjdXJsLjEgbWFuIHBhZ2UgYW5kIG1hZGUgYQogIHNlcGFyYXRlIGRvY3MvVEhBTktTIGZpbGUuIEl0IG1ha2VzIHRoZSBsaXN0IGVhc2llciB0byBmaW5kLCBhbmQgbWFkZSBpdAogIGVhc2llciBmb3IgbWUgdG8gbWFrZSBhIHNlcGFyYXRlIHdlYiBwYWdlIHdpdGggdGhhdCBzYW1lIGluZm9ybWF0aW9uLgoKICBJIHJlYWxseSBkbyB3YW50IGFsbCB5b3UgZ3V5cyBtZW50aW9uZWQgaW4gdGhlcmUgdG8gZmVlbCB5b3UgZ2V0IHRoZSBjcmVkaXQKICB5b3UgZGVzZXJ2ZS4KCi0gbGliL2Vhc3kuYyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBpbiB0aGUgNy44LXByZTEgZHVlIHRvIGEgc2lsbHkgbWlzdGFrZQoKVmVyc2lvbiA3LjgtcHJlMQoKRGFuaWVsICgyOCBNYXkgMjAwMSkKLSBjdXJsLWNvbmZpZyBub3cgc3VwcG9ydHMgJy0tdmVybnVtJyB0aGF0IG91dHB1dHMgYSBwbGFpbiBoZXhhZGVjaW1hbCB2ZXJzaW9uCiAgb2YgdGhlIGxpYmN1cmwgdmVyc2lvbiBudW1iZXIgKHVzaW5nIDggYml0cyBmb3IgZWFjaCAzIG51bWJlcnMpLiBWZXJzaW9uCiAgNy43LjQgYXBwZWFycyBhcyAwNzA3MDQKCi0gV3JvdGUgbWFuIHBhZ2VzIGZvciBjdXJsX2dsb2JhbF9pbml0IGFuZCBjdXJsX2dsb2JhbF9jbGVhbnVwLi4uCgotIFQuIEJoYXJhdGggYnJvdWdodCBuZXdzIGFib3V0IHRoZSB1c2FnZSBvZiB0aGUgT3BlblNTTCBpbnRlcmZhY2UgdGhhdCB3YXMKICBub3QgcHJldmlvdXNseSB0YWtlbiBpbnRvIGNvbnNpZGVyYXRpb24gYW5kIHRodXMgY2F1c2VkIGxpYmN1cmwgdG8gbGVhawogIG1lbW9yeS4gIFRoZSBvbmx5IHNvbWV3aGF0IHNhbmUgYXBwcm9hY2ggdG8gZml4IHRoaXMgZGlsZW1tYSwgaXMgYWRkaW5nIHR3bwogIHR3byBuZXcgZnVuY3Rpb25zIGN1cmxfZ2xvYmFsX2luaXQoKSBhbmQgY3VybF9nbG9iYWxfY2xlYW51cCgpIHRoYXQgc2hvdWxkCiAgYmUgY2FsbGVkICpPTkNFKiBieSB0aGUgYXBwbGljYXRpb24gdXNpbmcgbGliY3VybC4gVGhlIGluaXQgc2hvdWxkIGJlIGRvbmUKICBvbmx5IGF0IHN0YXJ0dXAsIG5vIG1hdHRlciBob3cgbWFueSB0aHJlYWRzIHRoZSBhcHBsaWNhdGlvbiBpcyBnb25uYSB1c2UsCiAgYW5kIHRoZSBjbGVhbnVwIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaGFzIGZpbmlzaGVkIHVzaW5nCiAgbGliY3VybCBjb21wbGV0ZWx5LgoKICAqKiogVVBHUkFERSBOT1RJQ0UgKioqCgogIElmIHlvdSB3cml0ZSBhcHBsaWNhdGlvbnMgdXNpbmcgbGliY3VybCwgeW91IHJlYWxseSB3YW50IHRvIHVzZSB0aGUgdHdvCiAgZnVuY3Rpb25zIG1lbnRpb25lZCBhYm92ZSAhISEKCiAgSSBjYW4ndCBzYXkgSSB0aGluayB0aGlzIGlzIGEgdmVyeSBiZWF1dGlmdWwgc29sdXRpb24sIGJ1dCBhcyBPcGVuU1NMCiAgaW5zaXN0cyBvbiBtYWtpbmcgbG90cyBvZiBzdHVmZiBvbiBhICJnbG9iYWwiIHNjb3BlLCB3ZSdyZSBmb3JjZWQgdG8gd2FsawogIHRoZSBwYXRoIHRoZXkgcG9pbnQgdXMgdG8uCgotIE1vdmluZyBtb3JlIHRlc3QgY2FzZXMgaW50byB0aGUgbmV3IGZpbGUgZm9ybWF0LgoKVmVyc2lvbiA3LjcuNC1wcmUzCgpEYW5pZWwgKDIzIE1heSAyMDAxKQotIEludHJvZHVjZWQgYSBuZXcgZmlsZSBmb3JtYXQgZm9yIHN0b3JpbmcgdGVzdCBjYXNlcywgYW5kIHRodXMgSSBoYWQgdG8KICBtb2RpZnkgYWxsIHRoZSBwZXJsIHRlc3Qgc2NyaXB0cyBhbmQgbW9yZSAoSSBhZGRlZCBhIG5ldyBvbmUpLiBJIGhhdmUgbm90CiAgInBvcnRlZCIgYWxsIHRoZSBvbGQgdGVzdCBjYXNlcyB0byB0aGUgbmV3IGZvcm1hdCB5ZXQsIGJ1dCBpdCdsbCBjb21lLgoKICBUaGUgbWFpbiBhZHZhbnRhZ2Ugb2YgdGhpcyBuZXcgZm9ybWF0IGlzIHRoYXQgYWxsIHRlc3QgZGF0YSBmb3IgZWFjaCB0ZXN0CiAgY2FzZSBpcyBzdG9yZWQgaW4gYSBzaW5nbGUgZmlsZS4gSXQgZ2l2ZXMgYSBiZXR0ZXIgb3ZlcnZpZXcgZm9yIGVhY2ggdGVzdAogIGNhc2UgYW5kIGEgbG90IGxlc3MgZmlsZXMuCgotIEFuZHLpcyBHYXJj7WEgYnJvdWdodCBhIGZpeCBmb3IgdGhlIG5ldHNjYXBlL21vemlsbGEgY29va2llIGZpbGUgcGFyc2luZwogIGZ1bmN0aW9uLCBhcyBpdCB0dXJucyBvdXQgaXQgZG9lc24ndCBhbHdheXMgc3RvcmUgdGhlIHBhdGghCgpEYW5pZWwgKDIyIE1heSAyMDAxKQotIEFzIHdhcyByZXBvcnRlZCBhbm9ueW1vdXNseSwgd2hlbiBGQUlMT05FUlJPUiB3YXMgdXNlZCwgdGhlIGh0dHBjb2RlIHdhcwogIG5vdCBzdG9yZWQgcHJvcGVybHkgYW5kIHRodXMgd2Fzbid0IHBvc3NpYmx5IHRvIHJlYWQgYWZ0ZXIgYSB0cmFuc2ZlciB3aXRoCiAgdGhlIGN1cmxfZWFzeV9nZXRpbmZvKCkgZnVuY3Rpb24uIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KCi0gSW5zdGFsbGVkIGFuZCBtYWRlIHVzZSBvZiB0aGUgZm9sbG93aW5nIHRvb2wgdmVyc2lvbnM6CiAgICBhdXRvY29uZiAyLjUwCiAgICBsaWJ0b29sIDEuNAogICAgYXV0b21ha2UgMS40LXAxCgogIEkgd291bGRuJ3QgcmVjb21tZW5kIGFueSBkZXZlbG9wZXIgdG8gdHJ5IHRvIGdlbmVyYXRlIHRoaW5ncyB3aXRoIG9sZGVyCiAgdmVyc2lvbnMgdGhhbiB0aGVzZS4gQnVpbGRpbmcgZnJvbSBDVlMgd2lsbCBwcm9iYWJseSBtb3JlIG9yIGxlc3MgcmVxdWlyZQogIGF0IGxlYXN0IHRoZXNlIHZlcnNpb25zLgoKICBBcyBhIHJlc3VsdCBvZiB0aGlzLCB0aGUgY29uZmlndXJlIHNjcmlwdCBncmV3IHRvIG1vcmUgdGhhbiBkb3VibGUgaXRzCiAgcHJldmlvdXMgc2l6ZSEKCiAgQXJrYWRpdXN6IE1pc2tpZXdpY3ogaGVscGVkIG1lIGJ5IHBvaW50aW5nIG91dCBJIGhhZCB0byByZW1vdmUgbXkKICBhY2luY2x1ZGUubTQgZmlsZSBiZWZvcmUgSSBjb3VsZCBnZXQgaXQgd29ya2luZyEKCkRhbmllbCAoMjEgTWF5IDIwMDEpCi0gSSBtYWRlIGZ0cHM6Ly8gd29yay4gQWRkZWQgdGVzdCBjYXNlIDQwMCB0byB0aGUgcmVsZWFzZSBhcmNoaXZlLCBhcyB0aGUKICBmaXJzdCBmdHBzOi8vIHRlc3QgY2FzZS4gUmVxdWlyZXMgc3R1bm5lbC4KCi0gQWxzbyBtYWRlIHRoZSB0ZXN0IGNhc2VzIHRoYXQgcnVucyBzc2wgdGVzdHMgbm90IHJ1biBpZiBsaWJjdXJsIGlzbid0IGJ1aWx0CiAgd2l0aCBzc2wgc3VwcG9ydC4KCkRhbmllbCAoMTkgTWF5IDIwMDEpCi0gTWFkZSB0aGUgY29uZmlndXJlIG5vdCBhZGQgYW55IGV4dHJhIC1MIExERkxBR1Mgb3IgLUkgQ1BQRkxBR1MgdW5sZXNzIHRoZXkKICBhcmUgYWN0dWFsbHkgbmVlZGVkLiBBbGJlcnQgQ2hpbidzIGFuZCBEb21lbmljbyBBbmRyZW9saSdzIHN1Z2dlc3Rpb25zCiAgaGVscGVkIG91dC4KClZlcnNpb24gNy43LjQtcHJlMgoKRGFuaWVsICgxOCBNYXkgMjAwMSkKLSBOaWNlciBjb25maWd1cmUtY2hlY2sgZm9yIHRoZSBPcGVuU1NMIGhlYWRlcnMsIHdoaWNoIHRoZW4gc2V0cyB0aGUgcHJvcGVyCiAgdmFyaWFibGUgdG8gaGF2ZSBjdXJsLWNvbmZpZyBiZSBnb29kLiAoQWxiZXJ0IENoaW4gcHJvdmlkZWQgdGhlIGZpeCkKCi0gRm9yIHN5c3RlbXMgdGhhdCBkb24ndCBoYXZlIHRoZWl3IG93biAnc3RybGNhdCgpJyBsaWJjdXJsIHByb3ZpZGVzIGl0cyBvd24uCiAgSXQgd2FzIG5vdyByZW5hbWVkIHRvIHByZXZlbnQgY29sbGlkZXMgd2l0aCBvdGhlciBsaWJzLiAoQWZ0ZXIgZGlzY3Vzc2lvbnMKICB3aXRoIFN0ZXJsaW5nIEh1Z2hlcyBhbmQgdGhlIGltcGxpY2F0aW9ucyB0aGlzIGhhZCBvbiBQSFAgYnVpbGRzLikKCkRhbmllbCAoMTcgTWF5IDIwMDEpCi0gQ29sbSBCdWNrbGV5IHBvc3RlZCBhIGRldGFpbGVkIGJ1ZyByZXBvcnQgb24gKHRoZSBkZWJpYW5pemVkKSA3LjcuMywgdGhhdAogIHR1cm5lZCBvdXQgdG8gYmUgYSBwcm9ibGVtIHdpdGggdGhlIGRlYmlhbi1idWlsdCA3LjcuMy1wYWNrYWdlIHRoYXQKICBjb250YWluZWQgZmlsZXMgZnJvbSB0aGUgNy43LjIgcmVsZWFzZSEKCi0gSSBhZGRlZCB0aGUgQ1VSTEVfQUxSRUFEWV9DT01QTEVURSBhZ2FpbiwgYnV0IHdpdGggYSBmYWtlIHZhbHVlLCBqdXN0IHRvCiAgbWFrZSBwcm9ncmFtcyB0aGF0IHVzZSBpdCwgbm90IGZhaWwgd2hlbiBjb21waWxpbmcgYWdhaW5zdCB0aGlzIHZlcnNpb24gb2YKICBsaWJjdXJsLgoKRGFuaWVsICgxNCBNYXkgMjAwMSkKLSBQYXdlbCBBLiBHYWpkYSBmaXhlZCBhIHByb2JsZW0gd2l0aCByZXN1bWVkIHRyYW5zZmVycyBvbiByZS11c2VkIHBlcnNpc3RlbnQKICBjb25uZWN0aW9ucy4KClZlcnNpb24gNy43LjQtcHJlMQoKRGFuaWVsICgxNCBNYXkgMjAwMSkKLSBKdW4taWNoaXJvIGl0b2p1biBIYWdpbm8gZml4ZWQgRlRQIFBPUlQgZm9yIElQdjYtZW5hYmxlZCBsaWJjdXJsLgoKLSBBZGRlZCB0aGUgZmlyc3QgSFRUUFMgdGVzdCB0byB0aGUgdGVzdCBzdWl0ZSBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKRGFuaWVsICgxMiBNYXkgMjAwMSkKLSBKdWtrYSBQaWhsIHN1Z2dlc3RlZCB0aGF0IGlmIChsaWIpY3VybCBpcyB0b2xkIHRvIHZlcmlmeSB0aGUgcGVlcidzCiAgY2VydGlmaWNhdGUgYW5kIHRoZSBwZWVyIGNhbid0IGJlIHZlcmlmaWVkLCBpdCBzaG91bGQgZmFpbCBhbmQgcmV0dXJuIGEKICBwcm9wZXIgZXJyb3IgY29kZS4gSSBhZGRlZCBhIGJyYW5kIG5ldyBlcnJvciBjb2RlIG5hbWVkCiAgQ1VSTEVfU1NMX1BFRVJfQ0VSVElGSUNBVEUgZm9yIHRoaXMgcHVycG9zZS4KCkRhbmllbCAoMTEgTWF5IDIwMDEpCi0gQXMgd2FzIGRpc2N1c3NlZCB3aXRoIEZyZWRlcmljIExlcGllZCBhIHdoaWxlIGFnbywgSSBub3cgbWFkZSBsaWJjdXJsIG5vdAogIHJldHVybiBlcnJvciBldmVuIHRob3VnaCBubyBkYXRhIHdhcyB0cmFuc2ZlcmVkIG9uIHVwbG9hZC9kb3dubG9hZCByZXN1bWUKICB3aGVuIHRoZSBubyB0cmFuc2ZlciBpcyBuZWVkZWQuIFRoZSBDVVJMRV9BTFJFQURZX0NPTVBMRVRFIGVycm9yIHdhcyByZW1vdmVkCiAgZnJvbSB0aGUgaGVhZGVyIGZpbGUgdG8gbWFrZSBhbnkgaW1wbGVtZW5hdG9yIHRoYXQgdXNlcyB0aGF0IHRvIGJlIGF3YXJlIG9mCiAgdGhlIGZhY3QgdGhhdCBpdCBjYW4ndCBiZSByZXR1cm5lZCBhbnltb3JlIQoKLSBJbXByb3ZlZCBnZW5lcmFsIGhlYWRlci1wYXJzaW5nIHRvIGJldHRlciBhbGxvdyB3aGl0ZSBzcGFjZXMgYW5kIG1vcmUuCgotIFJvZG5leSBTaW1tb25zIHByb3ZlZCB0aGUgZml4IEkgZGlkIHllc3RlcmRheSB3YXMgYmFkIGFuZCBJIGhhZCB0byBwb3N0CiAgYW5vdGhlciBvbmUuCgotIEluZ28gV2lsa2VuIHBhdGNoZWQgYXdheSB0d28gcmVkaXJlY3QgcHJvYmxlbXMgbW9yZSEKICAKRGFuaWVsICgxMCBNYXkgMjAwMSkKLSBDcmlzIEJhaWxpZmYgY29ycmVjdGx5IG5vdGVkIHRoYXQgdGhlIHNwYWNlLWFmdGVyLWhlYWRlciBwcm9ibGVtIHdpdGgKICBMb2NhdGlvbjogaXMgcHJlc2VudCBvbiBzZXZlcmFsIG90aGVyIHBsYWNlcyBpbiB0aGUgbGliY3VybCBzb3VyY2VzLgoKLSBJbmdvIFdpbGtlbiBwYXRjaGVkIGF3YXkgYSBwcm9ibGVtIGxpYmN1cmwgaGFkIHdoZW4gZm9sbG93aW5nIExvY2F0aW9uOgogIGhlYWRlcnMgd2l0aCBhbiBleHRyYSBzcGFjZSBhZnRlciB0aGUgY29sb24uCgotIFJvZG5leSBTaW1tb25zIGZvdW5kIG91dCB0aGF0IG11bHRpcGxlIEZUUCB0cmFuc2ZlcnMgZGlkIG5vdCB0cmVhdCByZWxhdGl2ZQogIGRpcmVjdG9yaWVzIGNvcnJlY3RseS4KCkRhbmllbCAoOSBNYXkgMjAwMSkKLSBHZXR0aW5nIGFuIEZUUCBmaWxlIHdpdGggQ1VSTE9QVF9OT0JPRFkgc2V0IChvciAtSSBmcm9tIHRoZSBjb21tYW5kIGxpbmUpLAogIG1ha2VzIGN1cmwgdXNlIHRoZSBub24tc3RhbmRhcmQgZnRwIGNvbW1hbmQgIlNJWkUiLiBJZiBpdCBmYWlsZWQsIGxpYmN1cmwKICByZXR1cm5lZCBlcnJvci4gU3RhcnRpbmcgbm93LCBpdCBqdXN0IGRvbid0IG91dHB1dCB0aGUgZmlsZSBzaXplIGluc3RlYWQuCiAgQW5vbnltb3VzIGJ1ZyByZXBvcnQuCgotIHN0dW5uZWwucG0gd2FzIGFjY2lkZW50YWxseSBsZWZ0IG91dCBmcm9tIHRoZSByZWxlYXNlIGFyY2hpdmUsIGl0IGlzIG5vdwogIGFkZGVkIChzdHVubmVsIGlzIG5lZWRlZCB0byBydW4gdGhlIGh0dHBzLXRlc3RzIGluIHRoZSB0ZXN0IHN1aXRlKQogIApEYW5pZWwgKDcgTWF5IDIwMDEpCi0gQ29ycmVjdGVkIHR3byBtaW5vciBjb21waWxlciB3YXJuaW5ncyBkdWUgdG8gdGhlIEZJTEUgKiB0byB2b2lkICogY29udmVyc2lvbgogIHRoYXQgSSBtaXNzZWQgYXQgdHdvIHBsYWNlcy4gSvZybiBIYXJ0cm90aCBicm91Z2h0IG1lIHBhdGNoZXMuIFNhbmRlciBHYXRlcwogIGZpbGVkIGEgYnVnIHJlcG9ydCBvbiB0aGlzLgoKVmVyc2lvbiA3LjcuMwoKRGFuaWVsICg0IE1heSAyMDAxKQotIEFsbCBjYWxsYmFjayBmdW5jdGlvbnMgbm93IHRha2UgJ3ZvaWQgKicgaW5zdGVhZCBvZiAnRklMRSAqJy4gVGhpcyBpcyBtYWRlCiAgdGhpcyB3YXkgdG8gbWFrZSBpdCBtb3JlIG9idmlvdXMgdG8gcGVvcGxlIHRoYXQgYW55dGhpbmcgY2FuIGJlIHBhc3NlZCB0bwogIHRoZW0gKGJ5IHVzaW5nIHRoZSBhcHJvcHJpYXRlIG9wdGlvbikuIEFmdGVyIGRpc2N1c3Npb25zIHdpdGggU3RlcmxpbmcKICBIdWdoZXMuCgpEYW5pZWwgKDMgTWF5IDIwMDEpCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIGEgY2h1bmtlZCB0cmFuc2ZlciBlbmNvZGluZyBwcm9ibGVtIHdpdGggcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gdGhhdCBtYWRlIGxpYmN1cmwgZmFpbCBpZiB0aGUgcGVyc2lzdGVudCBjb25uZWN0aW9uIHVzZWQgbWl4ZWQKICBjaHVua2VkIGFuZCBub24tY2h1bmtlZCB0cmFuc2ZlcnMuCgotIENyaXMgQmFpbGlmZiBmaXhlZCBhIGJhZCB0cmVhdG1lbnQgb2YgMzA0LXJlcGxpZXMsIGFzIHRoZXkgd291bGQgbm90IGJlCiAgdHJlYXRlZCBhcyBjb250ZW50LWxlbmd0aCAwIHJlcGxpZXMgYnV0IHdvdWxkIGNhdXNlIGEgImhhbmciIHVudGlsIHRoZQogIHNlcnZlciB0aW1lZC1vdXQgYW5kIGNsb3NlZCB0aGUgY29ubmVjdGlvbi4KCi0gQnJhZCBCdXJkaWNrIGZvdW5kIGEgbWlub3IgcHJvYmxlbSBpbiB0aGUgZG9jcy9leGFtcGxlcy9NYWtlZmlsZS5hbQoKRGFuaWVsICgyNyBBcHJpbCAyMDAxKQotIFVwZGF0ZWQgdGhlIElOVEVSQUxTIGRvY3VtZW50IGFnYWluLiBJdCB3YXMgbGFnZ2luZyBhIGJpdC4gSSB0aGluayBJIG1hZGUgaXQKICBtb3JlIGVhc3kgdG8gZm9sbG93IG5vdyBhcyB3ZWxsLgoKLSBCcmFkIEJ1cmRpY2sgZm91bmQgYSBwcm9ibGVtIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuIGN1cmwgcmVjZWl2ZWQKICBhICJDb250ZW50LUxlbmd0aDogMCIgaGVhZGVyLgoKLSBHaXVzZXBwZSBEJ0FtYnJvc2lvIHdhcyBmaXJzdCBvdXQgdG8gcmVwb3J0IHRoYXQgVEVMTkVUIGRvZXNuJ3Qgd29yayBpbiBjdXJsCiAgY29tcGlsZWQvYnVpbHQgb24gd2luMzIuIEl0IHNlZW1zIHRvIHdvcmsgZm9yIHVuaXhlcyB0aG91Z2ghCgotIERhdmUgSGFtaWx0b24gcmVwb3J0ZWQgd2VpcmQgcHJvYmxlbXMgd2l0aCBDVVJML1BIUCB0aGF0IEkgcmVhbGx5IGNhbid0CiAgZXhwbGFpbiBhdCB0aGUgbW9tZW50LiBJJ20gaG9waW5nIG9uIHNvbWUgaGVscCBmcm9tIHRoZSBQSFAgY3Jldy4KCkRhbmllbCAoMjYgQXByaWwgMjAwMSkKLSBJIHJld3JvdGUgdGhlIEZUUCBjb21tYW5kIHJlc3BvbnNlIGZ1bmN0aW9uLiBJIGhhZCB0byBkbyBpdCB0byBtYWtlIGZ0cHMKICB3b3JrLCBhcyB0aGUgT3BlblNTTCByZWFkKCktZnVuY3Rpb24gZGlkbid0IHdvcmsgdGhlIHNhbWUgd2F5IHRoZSBub3JtYWwKICB1bml4IHJlYWQoKSBkb2VzLCBidXQgaXQgd2FzIGFsc28gYSBodWdlIHBlcmZvcm1hbmNlIGJvb3N0LiBQcmV2aW91c2x5IHRoZQogIGZ1bmN0aW9uIHJlYWQgb25lIGJ5dGUgYXQgYSB0aW1lLCBub3cgaXQgcmVhZHMgdmVyeSBsYXJnZSBjaHVua3MsIGFuZCBpdAogIG1ha2VzIGEgbm90YWJsZSBzcGVlZCBkaWZmZXJlbmNlLgoKRGFuaWVsICgyNSBBcHJpbCAyMDAxKQotIENvbm5lY3Rpb24gcmUtdXNlIHdoZW4gbm90IHVzaW5nIGEgcHJveHkgZGlkbid0IHdvcmsgcHJvcGVybHkgZm9yCiAgbm9uLWRlZmF1bHQgcG9ydCBudW1iZXJzLgoKRGFuaWVsICgyNCBBcHJpbCAyMDAxKQotIEkndmUgbm90aWNlZCB0aGF0IEZUUFMgZG9lc24ndCB3b3JrLiBXZSBhdHRlbXB0IHRvIHVzZSBzc2wgZXZlbiBmb3IgdGhlCiAgZGF0YSB0cmFuc2Zlciwgd2hpY2ggY2F1c2VzIHRoZSB0cmFuc2ZlciB0byAnaGFuZycuLi4gV2UgbmVlZCB0byBmaXggdGhpcy4KCi0gSW1wcm92ZWQgdGhlIHRlc3Qgc3VpdGUgdG8gdXNlICdzdHVubmVsJyB0byBkbyBIVFRQUyBhbmQgRlRQUyB0ZXN0aW5nIG9uCiAgdGhlIGFscmVkeSB3cml0dGVuIHBlcmwgc2VydmVycyBlYXNpbHkuCgpEYW5pZWwgKDIzIEFwcmlsIDIwMDEpCi0gVGhlIE9wZW5TU0wgdmVyc2lvbiBzdHJpbmcgcmVjZW50bHkgbW9kaWZpZWQgZGlkbid0IHplcm8gdGVybWluYXRlIG9uZQogIG9mIHRoZSBnZW5lcmF0ZWQgc3RyaW5ncyBwcm9wZXJseSwgd2hpY2ggY291bGQgbGVhZCB0byBhIGNyYXNoIG9yIHNpbXBseQogIHdlaXJkIHZlcnNpb24gc3RyaW5nIG91dHB1dCEKClZlcnNpb24gNy43LjIKCkRhbmllbCAoMjIgQXByaWwgMjAwMSkKLSBSb3NpbWlsZG8gZGEgU2lsdmEgdXBkYXRlZCB0aGUgTWFrZWZpbGVzIGZvciBCb3JsYW5kL1dpbmRvd3MuCgotIEVyaWMgUmF1dG1hbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBwZXJzaXN0ZW50IGNvbm5lY3Rpb25zIHRoYXQgd291bGQKICBsZWFkIHRvIGJyb2tlbiBIb3N0OiBoZWFkZXJzIGluIHRoZSBzZWNvbmQgSFRUUCByZXF1ZXN0LgoKRGFuaWVsICgyMCBBcHJpbCAyMDAxKQotIEFkZGVkIG1hbiBwYWdlcyBmb3IgdGhlIGN1cmxfc3RyZXF1YWwoKSBhbmQgY3VybF9tcHJpbnRmKCkgZmFtaWxpZXMuIFdyb3RlCiAgYSAnbGliY3VybCBvdmVydmlldycgbWFuIHBhZ2UuCgotIFNwZWxsLWZpeGVkIHNvbWUgZG9jdW1lbnRzLgoKLSBTLiBNb29uZXNhbXkgY29ycmVjdGVkIG1pc3Rha2VzIGluIHRoZSBtYW4gcGFnZS4KCi0gQ3JpcyBCYWlsaWZmIGZpeGVkIHRoZSBjdXJsX3NsaXN0cyBvcHRpb25zIGluIHRoZSBwZXJsIGludGVyZmFjZSwgcHJlc2VudAogIHNlcGFyYXRlbHkgaW4gdGhlIEN1cmw6OmVhc3kgMS4xLjQgcGFja2FnZS4KCkRhbmllbCAoMTkgQXByaWwgMjAwMSkKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIHJlbW92ZWQgdGhlIGRlY2ltYWxzIGZyb20gdGhlIHNpemUgdmFyaWFibGVzIGluIHRoZQogIC0td3JpdGUtb3V0IG91dHB1dC4gV2UgaGFyZGx5IGV2ZXIgZ2V0IGZyYWN0aW9uIG9mIGJ5dGVzISA6LSkKClZlcnNpb24gNy43LjItcHJlMQoKRGFuaWVsICgxOSBBcHJpbCAyMDAxKQoKLSBBbGJlcnQgQ2hpbiBwcm92aWRlZCBhIGNvbmZpZ3VyZSBwYXRjaCBmb3IgdGhlIEFDX1NZU19MQVJHRUZJTEUgbWFjcm8uCgpEYW5pZWwgKDE4IEFwcmlsIDIwMDEpCi0gSW5wdXQgZnJvbSBNaWNoYWVsIE1lYWxsaW5nIG1hZGUgbWUgYWRkIC0tZmVhdHVyZSB0byBjdXJsLWNvbmZpZy4gSXQKICBkaXNwbGF5cyBhIGxpc3Qgb2YgZmVhdHVyZXMgdGhhdCBoYXZlIGJlZW4gYnVpbHQtaW4gaW4gdGhlIGN1cnJlbnQKICBsaWJjdXJsLiBUaGUgY3VycmVudGx5IGF2YWlsYWJsZSBmZWF0dXJlcyB0aGF0IGNhbiBiZSBsaXN0ZWQgYXJlOiBTU0wsIEtSQjQKICBhbmQgSVB2Ni4KCi0gSSBjb21taXR0ZWQgQ3JpcyBhbmQgR2VvcmcncyBwZXJsIGludGVyZmFjZSB3b3JrLiBUaGV5J3ZlIGdvdCBjYWxsYmFja3MKICB3b3JraW5nIGFuZCBvcHRpb25zIHRoYXQgcmVjZWl2ZXMgdGhvc2Ugc2xpc3QgcG9pbnRlcnMuCgotIFB1bmVldCBQYXdhaWEgZGV0ZWN0ZWQgYSBwcm9ibGVtIHdpdGggcmVzdW1lZCBkb3dubG9hZHMgdGhhdCB1c2UgcGVyc2lzdGVudAogIGNvbm5lY3Rpb25zIGFuZCBJIG1hZGUgYSByYXRoZXIgbGFyZ2Ugd3JpdGV1cCB0byBjb3JyZWN0IHRoaXMuIEl0IGlzCiAgaW1wb3J0YW50IHRoYXQgYWxsIHNlc3Npb24tZGF0YSBpcyBzdG9yZWQgaW4gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdCBhbmQgbm90CiAgaW4gdGhlIG1haW4gc3RydWN0IGFzIHRoaXMgcHJldmlvdXNseSBkaWQuCgpEYW5pZWwgKDE3IEFwcmlsIDIwMDEpCi0gRnJlZGVyaWMgTGVwaWVkIGZpeGVkIGEgZnRwIHJlc3VtZWQgZG93bmxvYWQgcHJvYmxlbSBhbmQgaW50cm9kdWNlZCBhIG5ldwogIGVycm9yIGNvZGUgdGhhdCBsZXRzIGFwcGxpY2F0aW9ucyBiZSBhYmxlIHRvIGRldGVjdCB3aGVuIGEgcmVzdW1lZCBkb3dubG9hZAogIGFjdHVhbGx5IGRpZG4ndCBkb3dubG9hZCBhbnl0aGluZyBzaW5jZSB0aGUgd2hvbGUgZmlsZSBpcyBhbHJlYWR5IHByZXNlbnQuCiAgU2hvdWxkIHRoaXMgcmV0dXJuIE9LIGluc3RlYWQ/CgotIEkgYWRkZWQgJ2N1cmwtY29uZmlnLmluJyB0byB0aGUgcm9vdCBkaXIgYW5kIGNvbmZpZ3VyZSBzY3JpcHQuIE5vdywgYQogIGN1cmwtY29uZmlnIHNjcmlwdCBpcyBtYWRlIHdoZW4gY3VybCBpcyBidWlsdC4gVGhlIHNjcmlwdCBjYW4gYmUgdXNlZCB0bwogIGZpZ3VyZSBvdXQgY29tcGlsZSB0aW1lIG9wdGlvbnMgdXNlZCB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0LCB3aGljaCBpbiB0dXJuCiAgc2hvdWxkIGJlIG9wdGlvbnMgWU9VIHNob3VsZCB1c2UgdG8gYnVpbGQgYXBwbGljYXRpb25zIHRoYXQgdXNlIGxpYmN1cmwuCgogIFRoaXMgKi1jb25maWcgc3R5bGUgaXMgbm90IGEgbmV3IGlkZWEsIGJ1dCBzb21ldGhpbmcgdGhhdCBoYXMgYmVlbiB1c2VkCiAgc3VjY2Vzc2Z1bGx5IGluIG90aGVyIChsaWJyYXJ5IGJhc2VkKSBwcm9qZWN0cy4KCi0gUGhpbCBLYXJuIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCB3cm9uZ2x5IGRpZCBub3QgYWx3YXlzIHVzZSBHTVQgdGltZSB6b25lCiAgZm9yIHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBzdHlsZSBoZWFkZXJzLgoKLSBHZW9yZyBTY2h3YXJ6IHBvaW50ZWQgb3V0IGFuIGV4dHJhIG5lZWRlZCAjaW5jbHVkZSBmaWxlIG5lZWRlZCBpbiBzcmMvbWFpbi5jCiAgZm9yIGN1cmwgdG8gYnVpbGQgb24gVWx0cml4LgoKRGFuaWVsICgxMSBBcHJpbCAyMDAxKQotIENyaXMgQmFpbGlmZiBwb2ludGVkIG91dCB0d28gcHJvYmxlbXMgdGhhdCBJIGNvcnJlY3RlZC4gRmlyc3QsIGxpYmN1cmwncyB1c2UKICBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgSFRUUF9QUk9YWSBpbiB1cHBlcmNhc2UgbWF5IGJlY29tZSBhIHNlY3VyaXR5CiAgaGF6YXJkIHdoZW4gcGVvcGxlIHVzZSBsaWJjdXJsIGluIGEgc2VydmVyL2NnaSBzaXR1YXRpb24gd2hlcmUgdGhlIHNlcnZlcgogIHNldHMgdGhlIEhUVFBfKi12YXJpYWJsZXMgYWNjb3JkaW5nIHRvIGluY29taW5nIGhlYWRlcnMgaW4gdGhlIEhUVFAKICByZXF1ZXN0LiBUaHVzLCBhICJQcm94eToiLWhlYWRlciB3b3VsZCBzZXQgdGhhdCBlbnZpcm9ubWVudCB2YXJpYWJsZSEKCiAgVGhlbiwgaW52b2tpbmcgY3VybF9lYXN5X3BlcmZvcm0oKSB3aXRob3V0IGhhdmluZyBhbiBVUkwgc2V0IGNhdXNlZCBhIGNyYXNoLgoKLSBTLiBNb29uZXNhbXkgYnJvdWdodCBhIHBhdGNoIHRoYXQgbWFrZSBjdXJsIHVzZSBub24tYmxvY2tpbmcgY29ubmVjdHMgb24KICB3aW5kb3dzIHdoZW4gY29ubmVjdGlvbiB0aW1lb3V0IGlzIHNldCwgYXMgaXQgYWxsb3dzIHdpbmRvd3MgdXNlcnMgdG8gc2V0CiAgdGhhdCB0aW1lb3V0IQoKLSBIaXJvdGFrYSBNYXRzdXl1a2kgd3JvdGUgYSBSdWJ5IGludGVyZmFjZSB0byBsaWJjdXJsIQoKLSBDcmlzIEJhaWxpZmYsIEZvcnJlc3QgQ2Fob29uIGFuZCBHZW9yZyBIb3JuIHdvcmsgb24gdGhlIFBlcmwgaW50ZXJmYWNlLgoKLSBJJ3ZlIHdyaXR0ZW4gYSBmaXJzdCBzaG90IGF0IGEgSmF2YSBpbnRlcmZhY2UgdG8gbGliY3VybC4gTWFueSB0aGFua3MgdG8KICBEYW5pZWwgTWFyZWxsIGZvciB0aXJlbGVzc2x5IGFuc3dlcmluZyB0byBhbGwgbXkgYmFzaWMgSmF2YSBxdWVzdGlvbnMuIEl0CiAgd29ya3MsIGJ1dCBpdCBpcyBzdGlsbCB2ZXJ5IGJhc2ljLgoKRGFuaWVsICgxMCBBcHJpbCAyMDAxKQotIFRoZSBwcm9ncmVzcyBkaXNwbGF5IGNvdWxkIGdldCBzaWxseSB3aGVuIGRvaW5nIG11bHRpcGxlIGZpbGUgdHJhbnNmZXJzLCBhcwogIGl0IHdhc24ndCBwcm9wZXJseSByZXNldCBiZXR3ZWVuIHRyYW5zZmVycyEKCi0gRGlzY3Vzc2lvbnMgd2l0aCBDcmlzIEJhaWxpZmYgd2hvIHdyaXRlcyBhIFBlcmwgaW50ZXJmYWNlIHRvIGxpYmN1cmwsIG1hZGUKICBtZSBhZGQgQ1VSTE9QVF9IRUFERVJGVU5DVElPTi4gSXQgY2FuIGJlIHVzZWQgdG8gc2V0IGEgc2VwYXJhdGUgY2FsbGJhY2sKICBmdW5jdGlvbiBmb3Igd3JpdGluZyBoZWFkZXJzLiBQcmV2aW91c2x5IHlvdSBjb3VsZCBvbmx5IHNldCBhIGRpZmZlcmVudCBGSUxFCiAgKiB3aGVuIGhlYWRlcnMgYXJlIHdyaXR0ZW4gZnJvbSB3aXRoaW4gbGliY3VybC4KCkRhbmllbCAoNyBBcHJpbCAyMDAxKQotIEFuZHLpcyBHYXJj7WEgZml4ZWQgYSBwcm9ibGVtIGluIGN1cmxfZXNjYXBlKCkgYW5kIHBvaW50ZWQgb3V0IGEgZmxhdyBpbgogIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlLgoKRGFuaWVsICg2IEFwcmlsIDIwMDEpCi0gQWRqdXN0ZWQgdGhlIHZlcnNpb24gY29kZSB0byBwcm9wZXJseSBkaXNwbGF5IE9wZW5TU0wgMC45LjZhLiBUaGV5IHN1cmUKICBjaGFuZ2UgdGhlaXIgdmVyc2lvbiBkZWZpbmUgZm9ybWF0IG9mdGVuLi4uCgotIGN1cmxfZm9ybWZyZWUoKSBub3cgYWNjZXB0cyBhIE5VTEwgcG9pbnRlciB3aXRob3V0IGNyYXNoaW5nIQoKVmVyc2lvbiA3LjcuMQoKRGFuaWVsICgzIEFwcmlsIDIwMDEpCi0gUHVuZWV0IFBhd2FpYSBwb2ludGVkIG91dCB0d28gc2VyaW91cyBwcm9ibGVtcy4gTGliY3VybCB3b3VsZCBhdHRlbXB0IHRvCiAgcmVhZCBiYWQgbWVtb3J5IGR1cmluZyBzaXR1YXRpb25zIHdoZW4gYW4gKGZ0cCkgY29ubmVjdGlvbiBhdHRlbXB0IGZhaWxlZC4KICBBbHNvLCB0aGUgbGliL01ha2VmaWxlLnZjNiB3YXMgY29ycmVjdGVkLgoKLSBNb3JlIGludmVzdGlnYXRpb25zIGluIHRoZSBMb2NhdGlvbjogZm9sbG93aW5nIGNvZGUgbWFkZSBtZSByZWFsaXplIHRoYXQKICBpdCB3YXMgbm90IGNsZWFuIGVub3VnaCB0byB3b3JrIHRyYW5zcGFyYW50bHkgd2l0aCBwZXJzaXN0ZW50IGFuZCBub24tCiAgcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gSSB0aGluayBJJ3ZlIGZpeGVkIGl0IG5vdy4KCkRhbmllbCAoMjkgTWFyY2ggMjAwMSkKLSBHZW9yZyBIb3JuIG1haWxlZCBtZSBzb21lIGNvcnJlY3Rpb25zIGZvciB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZS4KCi0gRXhwZXJpbWVudGFsIGZ0cHM6Ly8gc3VwcG9ydCBhZGRlZC4gSXQgaXMgYmFzaWNhbGx5IEZUUCBvdmVyIFNTTCBmb3IgdGhlCiAgY29udHJvbCBjb25uZWN0aW9uLiBJdCBzdGlsbCBtYWtlcyBhbGwgZGF0YSB0cmFuc2ZlcnMgZ29pbmcgb3ZlciB1bmVuY3J5cHRlZAogIGNvbm5lY3Rpb25zLiBSYWluZXIgV2Vpa3VzYXQncyBmdHBkLXNzbCBzZXJ2ZXIgaGFjayBzdXBwb3J0cyB0aGlzIGFuZCBJIHVzZWQKICB0aGF0IHRvIHZlcmlmeSB0aGUgZnVuY3Rpb25hbGl0eS4KCkRhbmllbCAoMjcgTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiBkaXNjb3ZlcmVkIHRoYXQgaWYgeW91IHNldCBhIENVUkxPUFRfVElNRU9VVCBhbmQgdGhlbiB0cmllZAogIHRvIGdldCBhIGZpbGUgZnJvbSBhIHNpdGUgYW5kIGl0IGZhaWxzLCB0aGUgU0lHQUxSTSB3b3VsZCBzdGlsbCBiZSBzZW50CiAgYWZ0ZXIgdGhlIHRpbWVvdXQtdGltZSwgcXVpdGUgaW5leHBlY3RlZGx5IQoKLSBJIGFkZGVkIGFuIGZ0cCB0cmFuc2ZlciBleGFtcGxlIHRvIGRvY3MvZXhhbXBsZXMvIGFuZCBJIGFsc28gd3JvdGUgYSB0aW55CiAgZXhhbXBsZSBtYWtlZmlsZSB0aGF0IGNhbiBiZSB1c2VkIGFzIGEgc3RhcnQgd2hlbiBidWlsZGluZyBvbmUgb2YgdGhlCiAgZXhhbXBsZXMuCgpWZXJzaW9uIDcuNy4xLWJldGExCgpEYW5pZWwgKDI2IE1hcmNoIDIwMDEpCi0gTW9oYW1lZCBMcmhhemkgcmVwb3J0ZWQgcHJvYmxlbXMgd2l0aCA3LjYuMSBhbmQgcGVyc2lzdGVudCBIVFRQLzEuMAogIGNvbm5lY3Rpb25zICh3aGVuIHRoZSBzZXJ2ZXIgcmVwbGllZCBhIENvbm5lY3Rpb246IEtlZXAtQWxpdmUpIGFuZCB0aGlzCiAgcHJvYmxlbSB3YXMgbm90IHByb3Blcmx5IGRlYWx0IHdpdGggaW4gNy43IGVpdGhlci4gQSBwYXRjaCB3YXMgcG9zdGVkIHRvIHRoZQogIGN1cmwtYW5kLXBocCBtYWlsaW5nIGxpc3QuCgpEYW5pZWwgKDI0IE1hcmNoIDIwMDEpCi0gQ29saW4gV2F0c29uIHJlcG9ydGVkIGFib3V0IGEgcHJvYmxlbSBhbmQgYnJvdWdodCBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGl0LAogIHdoaWNoIHdhcyBhYm91dCB0aGUgbWFuIHBhZ2UgYW5kIGxpbmVzIHN0YXJ0aW5nIHdpdGggYSBzaW5nbGUgcXVvdGUgKCcpIGluIGEKICB3YXkgdGhhdCBnbnJvZmYgZG9lc24ndCBsaWtlLgoKRGFuaWVsICgyMyBNYXJjaCAyMDAxKQotIFBldGVyIEJyYXkgcmVwb3J0ZWQgY29ycmVjdGx5IHRoYXQgdGhlIHJvb3QgbWFrZWZpbGUgdXNlZCBtYWtlIGluc3RlYWQgb2YKICAkKE1BS0UpIGZvciB0aGUgdGVzdCB0YXJnZXQuCgotIENvcnJlY3RlZCB0aGUgQ3VybDo6ZWFzeSBwZXJsIGludGVyZmFjZSB0byB1c2UgY3VybF9lYXN5X3NldG9wdCgpIGFuZCBub3QKICBjdXJsX3NldG9wdCgpIHdoaWNoIHdhcyByZW1vdmVkIGluIDcuNyEKCi0gUy4gTW9vbmVzYW15IHByb3ZpZGVkIHVwZGF0ZXMgb24gdGhyZWUgZG9jdW1lbnRzIChNQU5VQUwsIElOU1RBTEwgYW5kIEZBUSkuCgotIFdoZW4gZm9sbG93aW5nIGEgTG9jYXRpb246LCBsaWJjdXJsIHdvdWxkIHNvbWV0aW1lcyB3cml0ZSB0byB0aGUgVVJMIHN0cmluZwogIGluIGEgd2F5IGl0IHNob3VsZG4ndC4gQXMgdGhlIHBvaW50ZXIgaXMgcGFzc2VkLWluIHRvIGxpYmN1cmwgZnJvbSBhbgogIGFwcGxpY2F0aW9uLCB3ZSBjYW4ndCBiZSBhbGxvd2VkIHRvIHdyaXRlIHRvIGl0LiBUaGUgcGFydGljdWxhciBidWcgcmVwb3J0CiAgZnJvbSAnbmsnIHRoYXQgYnJvdWdodCB0aGlzIHVwIHdhcyBiZWNhdXNlIGhlIGhhZCBhIHJlYWQtb25seSBVUkwgdGhhdCB0aGVuCiAgY2F1c2VkIGEgbGliY3VybCBjcmFzaCEKCi0gTm8gbG9uZ2VyIHJlYWRzIEhFQUQgcmVzcG9uc2VzIGxvbmdlciB0aGFuIHRvIHRoZSBsYXN0IGhlYWRlci4gUHJldmlvdXNseSwKICBjdXJsIHdvdWxkIHJlYWQgdGhlIGZ1bGwgcmVwbHkgaWYgdGhlIGNvbm5lY3Rpb24gd2FzIGEgImNsb3NlIiBvbmUuCgotIGxpYmN1cmwgZGlkIHJlLXVzZSBjb25uZWN0aW9ucyB3YXkgdG9vIG11Y2guIERvaW5nICJjdXJsCiAgaHR0cDovL3d3dy57bWljcm9zb2Z0LGlibX0uY29tIiB3b3VsZCBtYWtlIGl0IHJlLXVzZSB0aGUgY29ubmVjdGlvbiB3aGljaAogIG1hZGUgdGhlIHNlY29uZCByZXF1ZXN0IHJldHVybiB2ZXJ5IG9kZCByZXN1bHRzLgoKRGFuaWVsICgyMiBNYXJjaCAyMDAxKQotIEVkaW4gS2FkcmliYXNpYyBtYWRlIG1lIGF3YXJlIHRoYXQgY3VybCBzaG91bGQgbm90IHJlLXNlbmQgUE9TVCByZXF1ZXN0cwogIHdoZW4gZm9sbG93aW5nIDMwMi1yZWRpcmVjdHMuIEkgbWFkZSAzMDIgd29yayBsaWtlIDMwMyB3aGljaCBtZWFucyBjdXJsIHVzZXMKICBHRVQgaW4gdGhlIGZvbGxvd2luZyByZXF1ZXN0KHMpLgoKLSBsaWJjdXJsIG5vdyByZXNldCB0aGUgImZvbGxvd2VkLWxvY2F0aW9uIiBjb3VudGVyIG9uIGVhY2ggaW52b2tlIG9mCiAgY3VybF9lYXN5X3BlcmZvcm0oKSBhcyBpdCBvdGhlcndpc2Ugd291bGQgc3VtIHVwIGFsbCByZWRpcmVjdHMgb24gdGhlIHNhbWUKICBjb25uZWN0aW9uIGFuZCB0aHVzIGNvdWxkIHJlYWNoIHRoZSBtYXhyZWRpcnMgY291bnRlciB3cm9uZ2x5LgoKLSBKaW0gRHJhc2ggc3VnZ2VzdGVkIGN1cmxfZXNjYXBlKCkgc2hvdWxkIG5vdCByZS1lbmNvZGUgd2hhdCBhbHJlYWR5IGxvb2tzCiAgbGlrZSBhbiBlbmNvZGVkIHNlcXVlbmNlIGFuZCBJIHRoaW5rIHRoYXQncyBhIGZhaXIgc3VnZ2VzdGlvbi4KClZlcnNpb24gNy43CgpEYW5pZWwgKDIyIE1hcmNoIDIwMDEpCi0gVGhlIGNvbmZpZ3VyZSBzY3JpcHQgbm93IGZhaWxzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBnZXRob3N0YnluYW1lX3IoKSBpcwogIGRldGVjdGVkIGJ1dCBpdCBjb3VsZG4ndCBmaWd1cmUgb3V0IGhvdyB0byBpbnZva2UgaXQgKHdoYXQgYW1vdW50IG9mCiAgYXJndW1lbnRzIGl0IGlzIHN1cHBvc2VkIHRvIGdldCkuIFJlcG9ydHMgZnJvbSBBbmRy6XMgR2FyY+1hIG1hZGUgbWUgYXdhcmUKICBvZiB0aGlzIG5lZWQuCgotIFRhbGtpbmcgd2l0aCBKaW0gRHJhc2ggbWFkZSBtZSBmaW5hbGx5IHB1dCB0aGUgY3VybF9lc2NhcGUgYW5kIGN1cmxfdW5lc2NhcGUKICBmdW5jdGlvbnMgaW4gdGhlIGN1cmwuaCBpbmNsdWRlIGZpbGUgYW5kIHdyaXRlIG1hbiBwYWdlcyBmb3IgdGhlbS4gVGhlCiAgZXNjYXBlIGZ1bmN0aW9uIHdhcyBtb2RpZmllZCB0byB1c2UgdGhlIHNhbWUgaW50ZXJmYWNlIGFzIHRoZSB1bmVzY2FwZSBvbmUKICBoYWQuCgotIE5vIGJ1ZyByZXBvcnRzIGF0IGFsbCBvbiB0aGUgbGF0ZXN0IGJldGFzLiBSZWxlYXNlIHRpbWUgY29taW5nIHVwLgoKVmVyc2lvbiA3LjctYmV0YTUKCkRhbmllbCAoMTkgTWFyY2ggMjAwMSkKLSBHZW9yZyBPdHRpbmdlciByZXBvcnRlZCBwcm9ibGVtcyB3aXRoIHVzaW5nIC1DIHRvZ2V0aGVyIHdpdGggLUwgaW4gdGhlIHNlbnNlCiAgdGhhdCB0aGUgLUMgaW5mbyBnb3QgbG9zdCB3aGVuIGl0IHdhcyByZWRpcmVjdGVkLiBJIGNvdWxkIG5vdCByZXBlYXQgdGhpcwogIHByb2JsZW0gb24gdGhlIDcuNyBicmFuY2ggd2h5IEkgbGVhdmUgdGhpcyBmb3IgdGhlIG1vbWVudC4gVGVzdCBjYXNlIDM5IHdhcwogIGFkZGVkIHRvIGRvIGV4YWN0bHkgdGhpcywgYW5kIGl0IHNlZW1zIHRvIGRvIHJpZ2h0LgoKLSBDaHJpc3RpYW4gUm9ib3R0b20gUmVpcyByZXBvcnRlZCBob3cgaGlzIDcuNyBiZXRhIGRpZG4ndCBzdWNjZXNzZnVsbHkgZG8KICBmb3JtIHBvc3RzIGFzIGVsZWdhbnRseSBhcyA3LjYuMSBkaWQuIEluZGVlZCwgdGhpcyB3YXMgYSBmbGF3IGluIHRoZSBoZWFkZXIKICBlbmdpbmUsIGFzIEhUVFAgMS4xIGhhcyBpbnRyb2R1Y2VkIGEgbmV3IDEwMCAidHJhbnNpZW50IiByZXR1cm4gY29kZSBmb3IgUFVUCiAgYW5kIFBPU1Qgb3BlcmF0aW9ucyB0aGF0IEkgbmVlZCB0byBhZGQgc3VwcG9ydCBmb3IuIFNlY3Rpb24gOC4yLjMgaW4gUkZDMjYxNgogIGhhcyBhbGwgdGhlIGRldGFpbHMuIFNlZW1zIHRvIHdvcmsgbm93IQoKRGFuaWVsICgxNiBNYXJjaCAyMDAxKQotIEFmdGVyIGhhdmluZyBleHBlcmllbmNlZCBhbm90aGVyIG1hY2hpbmUgYnJlYWstZG93biwgd2UncmUgYmFjay4KCi0gR2VvcmcgSG9ybidzIHBlcmwgaW50ZXJmYWNlIEN1cmw6OmVhc3kgaXMgbm93IGluY2x1ZGVkIGluIHRoZSBjdXJsIHJlbGVhc2UKICBhcmNoaXZlLiBUaGUgcGVybC8gZGlyZWN0b3J5IGlzIG5vdyBwcmVzZW50LiBQbGVhc2UgaGVscCBtZSB3aXRoIGRvY3MsCiAgZXhhbXBsZXMgYW5kIHVwZGF0ZXMgeW91IHRoaW5rIGZpdC4KCi0gTWFkZSBhIG5ldyBwaHAvIGRpcmVjdG9yeSBpbiB0aGUgcmVsZWFzZSBhcmNoaXZlIGFuZCBtb3ZlZCB0aGUgUEhQIGV4YW1wbGVzCiAgaW50byBhIHN1YmRpcmVjdG9yeSBpbiB0aGVyZS4gTm90IG11Y2ggUEhQIGluZm8geWV0LCBidXQgSSBwbGFuIHRvLiBQbGVhc2UKICBoZWxwIG1lIGhlcmUgYXMgd2VsbCEKCi0gTWFkZSBsaWJjdXJsIHJldHVybiBlcnJvciBpZiBhIHRyYW5zZmVyIGlzIGFib3J0ZWQgaW4gdGhlIG1pZGRsZSBvZiBhCiAgImNodW5rIi4gSXQgYWN0dWFsbHkgZW5hYmxlcyBsaWJjdXJsIHRvIGRpc2NvdmVyIHByZW1hdHVyZSB0cmFuc2ZlciBhYm9ydHMKICBldmVuIGlmIHRoZSBDb250ZW50LUxlbmd0aDogc2l6ZSBpcyB1bmtub3duLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAxKQotIEFkZGVkIC0tY29ubmVjdC10aW1lb3V0IHRvIGN1cmwsIHdoaWNoIHNldHMgdGhlIG5ldyBDVVJMT1BUX0NPTk5FQ1RUSU1FT1VUCiAgb3B0aW9uIGluIGxpYmN1cmwuIEl0IGxpbWl0cyB0aGUgdGltZSBjdXJsIGlzIGFsbG93ZWQgdG8gc3BlbmQgaW4gdGhlCiAgY29ubmVjdGlvbiBwaGFzZS4gVGhpcyBkaWZmZXJzIGZyb20gLW0vLS1tYXgtdGltZSB0aGF0IGxpbWl0cyB0aGUgZW50aXJlCiAgZmlsZSB0cmFuc2ZlciBvcGVyYXRpb24uIFJlcXVlc3RlZCBieSBMYXJyeSBGYWhub2UgYW5kIG90aGVycy4KCiAgSSBhbHNvIHVwZGF0ZWQgdGhlIGN1cmwuMSBhbmQgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlcyBhbmQgcmVtb3ZlZCB0aGUKICBpdGVtIGZyb20gdGhlIFRPRE8uCgpWZXJzaW9uIDcuNy1iZXRhNAoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIE1hZGUgY3VybCBncm9rIElQdjYgd2l0aCBIVFRQIHByb3hpZXMgYW5kIGdvdCBldmVyeXRoaW5nIHRvIGNvbXBpbGUgbmljZWx5CiAgYWdhaW4gd2hlbiBFTkFCTEVfSVBWNiBpcyBzZXQuCgogIEkgbmVlZCB0byByZW1ha2UgdGhpbmdzIGluIHRoZSB0ZXN0IHN1aXRlLiBJIGNhbid0IHRlc3QgdGhlIEZUUCBwYXJ0cyB3aXRoCiAgY3VybCBidWlsdCBmb3IgSVB2NiBhcyBpdCB1c2VzIGEgZGlmZmVyZW50IHNldCBvZiBGVFAgY29tbWFuZHMgdGhlbiEKCi0gSSBmZWxsIG9udG8gYSBidWcgcmVwb3J0IG9uIHBocC5uZXQgKHBvc3RlZCBieSBMYXJzIFRvcmJlbiBXaWxzb24pIHRoYXQgd2FzCiAgYSByZXBvcnQgbWVhbnQgZm9yIG91ciBwcm9qZWN0LiBBbnl3YXksIGl0IHNhaWQgdGhlIC5uZXRyYyBwYXJzaW5nIGRpZG4ndAogIHdvcmsgYXMgc3VwcG9zZWQsIGFuZCBhcyBJIGFncmVlZCB3aXRoIExhcnMsIEkgbWFkZSB0aGUgbmV0cmMgcGFyc2VyIHVzZQogIGdldHB3dWlkKCkgdG8gZmlndXJlIG91dCB0aGUgaG9tZSBkaXJlY3Rvcnkgb2YgdGhlIGVmZmVjdGl2ZSB1c2VyIGFuZCB0cnkKICB0aGF0IG5ldHJjLiBJdCBzdGlsbCB1c2VzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBIT01FIGZvciB0aG9zZSB0aGF0IGRvbid0CiAgaGF2ZSB0aGF0IGZ1bmN0aW9uIG9yIGlmIHRoZSB1c2VyIGRvZXNuJ3QgcmV0dXJuIHZhbGlkIHB3ZCBpbmZvLgoKLSBFZGluIEthZHJpYmFpYyBwb3N0ZWQgYSBidWcgcmVwb3J0IHdoZXJlIGhlIGdvdCBhIGNyYXNoIHdoZW4gYSBmZXRjaCB3aXRoCiAgdXNlcitwYXNzd29yZCBpbiB0aGUgVVJMIGZvbGxvd2VkIGEgTG9jYXRpb246IHRvIGEgc2Vjb25kIFVSTCAoYWJzb2x1dGUsCiAgd2l0aG91dCBuYW1lK3Bhc3N3b3JkKS4gVGhpcyBidWcgaGFzIGJlZW4gYXJvdW5kIGZvciBhIGxvbmcgd2hpbGUgYW5kCiAgY3Jhc2hlcyBkdWUgdG8gYSByZWFkIGF0IGFkZHJlc3MgemVyby4gRml4ZWQgbm93LiBXcm90ZSB0ZXN0IGNhc2UgMzgsIHRoYXQKICB0ZXN0cyB0aGlzLgoKLSBNb2RpZmllZCB0aGUgdGVzdCBzdWl0ZSdzIGh0dHBzZXJ2ZXIgc2xpZ2h0bHkgdG8gYXBwZW5kIGFsbCBjbGllbnQgcmVxdWVzdAogIGRhdGEgdG8gaXRzIGxvZyBmaWxlIHNvIHRoYXQgdGhlIHRlc3Qgc2NyaXB0IG5vdyBiZXR0ZXIgY2FuIHZlcmlmeSBhIHJhbmdlCiAgb2YgcmVxdWVzdHMgYW5kIG5vdCBvbmx5IHRoZSBsYXN0IG9uZSwgYXMgaXQgZGlkIHByZXZpb3VzbHkuCgotIFVwZGF0ZWQgdGhlIGN1cmwgbWFuIHBhZ2Ugd2l0aCAtLXJhbmRvbS1maWxlIGFuZCAtLWVnZC1maWxlIGRldGFpbHMuCgpWZXJzaW9uIDcuNy1iZXRhMwoKRGFuaWVsICgxNCBNYXJjaCAyMDAxKQotIEJq9nJuIFN0ZW5iZXJnIHByb3ZpZGVkIHNpbWlsYXIgZml4ZXMgYXMgSvZybiBkaWQgYW5kIHNvbWUgYWRkaXRpb25hbCBwYXRjaGVzCiAgZm9yIG5vbi1TU0wgY29tcGlsZXMuCgotIEkgaW5jcmVhc2VkIHRoZSBpbnRlcmZhY2UgbnVtYmVyIGZvciBsaWJjdXJsIGFzIEkndmUgcmVtb3ZlZCB0aGUgbG93IGxldmVsCiAgZnVuY3Rpb25zIGZyb20gdGhlIGludGVyZmFjZS4gSSBhbHNvIHRvb2sgdGhpcyBvcHBvcnR1bml0eSB0byByZW5hbWUgdGhlCiAgQ3VybF9zdHJlcXVhbCBmdW5jdGlvbiB0byBjdXJsX3N0cmVxdWFsIGFuZCBDdXJsX3N0cm5lcXVhbCB0bwogIGN1cmxfc3RybmVxdWFsLCBhcyB0aGV5J3JlIHB1YmxpYyBsaWJjdXJsIGZ1bmN0aW9ucyAoZXZlbiBpZiB0aGV5J3JlIHN0aWxsCiAgdW5kb2N1bWVudGVkKS4KCiAgVGhpcyB3aWxsIG1ha2Ugb2xkZXIgcHJvZ3JhbXMgbm90IGNhcGFibGUgb2YgdXNpbmcgdGhlIG5ldyBsaWJjdXJsIHdpdGgKICBqdXN0IGEgZHJvcC1pbiByZXBsYWNlbWVudC4KCi0gSvZybiBIYXJ0cm90aCB1cGRhdGVkIHN0dWZmIGZvciB3aW4zMiBjb21waWxlczoKICBvIGNvbmZpZy13aW4zMi5oIHdhcyBmaXhlZCBmb3Igc29ja2xlbl90CiAgbyBsaWIvc3NsdXNlLmMgaGFkIGEgYmFkICNlbmRpZiBwbGFjZW1lbnQKICBvIGxpYi9maWxlLmMgd2FzIG1hZGUgdG8gY29tcGlsZSBvbiB3aW4zMiBhZ2FpbgogIG8gbGliL01ha2VmaWxlLm0zMiB3YXMgdXBkYXRlZCB3aXRoIHRoZSBuZXcgZmlsZXMKICBvIGxpYi9saWJjdXJsLmRlZiBtYXRjaGVzIHRoZSBjdXJyZW50IGludGVyZmFjZSBzdGF0ZQoKRGFuaWVsICgxMyBNYXJjaCAyMDAxKQotIEl0IG9ubHkgdG9vayBhbiBob3VyIG9yIHNvIGJlZm9yZSBK9nJuIEhhcnRyb3RoIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUKICBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nLiBHaXZlbiBoaXMgZmluZSBleGFtcGxlLXNpdGUsIEkgY291bGQgZWFzaWx5IHNwb3QKICB0aGUgcHJvYmxlbSBhbmQgd2hlbiBJIHJlLXJlYWQgdGhlIHNwZWMgKHRoZSBwYXJ0IEkgaGF2ZSBwYXN0ZWQgaW4gdGhlIHRvcAogIG9mIHRoZSBodHRwX2NodW5rcy5oIGZpbGUpLCBJIHJlYWxpemVkIEkgaGFkIG1hZGUgbXkgc3RhdGUtbWFjaGluZSBzbGlnaHRseQogIHdyb25nIGFuZCBkaWRuJ3QgZXhwZWN0L2hhbmRsZSB0aGUgdHJhaWxpbmcgQ1JMRiB0aGF0IGNvbWVzIGFmdGVyIHRoZSBkYXRhCiAgaW4gZWFjaCBjaHVuayAoYW5kIHRob3NlIGV4dHJhIHR3byBieXRlcyBzdXJlIGZlZWwgd2FzdGVkKS4KCiAgSGFkIHRvIG1vZGlmeSB0ZXN0IGNhc2UgMzQgdG8gbWF0Y2ggdGhpcyBhcyB3ZWxsLgoKVmVyc2lvbiA3LjctYmV0YTIKCkRhbmllbCAoMTMgTWFyY2ggMjAwMSkKLSBBZGRlZCB0aGUgcG9saWN5IHN0dWZmIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0IG1hbiBwYWdlIGZvciB0aGUgdHdvIHN1cHBvcnRlZAogIHBvbGljaWVzLgoKLSBJbXBsZW1lbnRlZCBzb21lIHN1cHBvcnQgZm9yIHRoZSBDVVJMT1BUX0NMT1NFUE9MSUNZIG9wdGlvbi4gVGhlIHBvbGljaWVzCiAgQ1VSTENMT1NFUE9MSUNZX0xFQVNUX1JFQ0VOVExZX1VTRUQgYW5kIENVUkxDTE9TRVBPTElDWV9PTERFU1QgYXJlIG5vdwogIHN1cHBvcnRlZCwgYW5kIHRoZSAibGVhc3QgcmVjZW50bHkgdXNlZCIgaXMgdXNlZCBhcyBkZWZhdWx0IGlmIG5vIHBvbGljeQogIGlzIGNob3Nlbi4KCkRhbmllbCAoMTIgTWFyY2ggMjAwMSkKLSBBZGRlZCBDVVJMT1BUX1JBTkRPTV9GSUxFIGFuZCBDVVJMT1BUX0VHRFNPQ0tFVCB0byBsaWJjdXJsIGZvciBzZWVkaW5nIHRoZQogIFNTTCByYW5kb20gZW5naW5lLiBUaGUgcmFuZG9tIHNlZWRpbmcgc3VwcG9ydCB3YXMgYWxzbyBicm91Z2h0IHRvIHRoZSBjdXJsCiAgY2xpZW50IHdpdGggdGhlIG5ldyBvcHRpb25zIC0tcmFuZG9tLWZpbGUgPGZpbGU+IGFuZCAtLWVnZC1maWxlIDxmaWxlPi4gSQogIG5lZWQgc29tZSBwZW9wbGUgdG8gcmVhbGx5IHRlc3QgdGhpcyB0byBrbm93IHRoZXkgd29yayBhcyBzdXBwb3NlZC4gUmVtZW1iZXIKICB0aGF0IGxpYmN1cmwgbm93IGluZm9ybXMgKGlmIHZlcmJvc2UgaXMgb24pIGlmIHRoZSByYW5kb20gc2VlZCBpcyBjb25zaWRlcmVkCiAgd2VhayAoSFRUUFMgY29ubmVjdGlvbnMpLgoKLSBNYWRlIHRoZSBjaHVua2VkIHRyYW5zZmVyLWVuY29kaW5nIGVuZ2luZSBkZXRlY3RlZCBiYWQgZm9ybWF0dGVkIGRhdGEgbGVuZ3RoCiAgYW5kIHJldHVybiBlcnJvciBpZiBzbyAod2UgY2FuJ3QgcG9zc2libHkgZXh0cmFjdCBzZW5zaWJsZSBkYXRhIGlmIHRoaXMgaXMKICB0aGUgY2FzZSkuIEFkZGVkIGEgdGVzdCBjYXNlIHRoYXQgZGV0ZWN0cyB0aGlzLiBOdW1iZXIgMzYuIE5vdyB0aGVyZSBhcmUgNjAKICB0ZXN0IGNhc2VzLgoKLSBBZGRlZCA1IG5ldyBsaWJjdXJsIG9wdGlvbnMgdG8gY3VybC9jdXJsLmggdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZQogIHBlcnNpc3RlbnQgY29ubmVjdGlvbiBzdXBwb3J0IGluIGxpYmN1cmwuIFRoZXkncmUgYWxzbyBkb2N1bWVudGVkIChmYWlybHkKICB0aG9yb3VnaGx5KSBpbiB0aGUgY3VybF9lYXN5X3NldG9wdC4zIG1hbiBwYWdlLiBUaHJlZSBvZiB0aGVtIGFyZSBub3cKICBpbXBsZW1lbnRlZCwgYWx0aG91Z2ggbm90IHJlYWxseSB0ZXN0ZWQgYXQgdGhpcyBwb2ludC4uLiBBbnl3YXksIHRoZSBuZXcKICBpbXBsZW1lbnRlZCBvcHRpb25zIGFyZSBuYW1lZCBDVVJMT1BUX01BWENPTk5FQ1RTLCBDVVJMT1BUX0ZSRVNIX0NPTk5FQ1QsCiAgQ1VSTE9QVF9GT1JCSURfUkVVU0UuIFRoZSBvbmVzIHN0aWxsIGxlZnQgdG8gd3JpdGUgY29kZSBmb3IgYXJlOgogIENVUkxPUFRfQ0xPU0VQT0xJQ1kgYW5kIGl0cyByZWxhdGVkIG9wdGlvbiBDVVJMT1BUX0NMT1NFRlVOQ1RJT04uCgotIE1hZGUgY3VybCAodGhlIGFjdHVhbCBjb21tYW5kIGxpbmUgdG9vbCkgdXNlIHRoZSBuZXcgbGliY3VybCA3LjcgcGVyc2lzdGVudAogIGNvbm5lY3Rpb24gc3VwcG9ydCBieSByZS11c2luZyB0aGUgc2FtZSBjdXJsIGhhbmRsZSBmb3IgZXZlcnkgc3BlY2lmaWVkIGZpbGUKICB0cmFuc2ZlciBhbmQgYWZ0ZXIgc29tZSBtb3JlIHRlc3QgY2FzZSB0d2Vha2luZyB3ZSBoYXZlIDEwMCUgdGVzdCBjYXNlIE9LLgogIEkgbWFkZSBzb21lIHRlc3QgY2FzZXMgcmV0dXJuIEhUVFAvMS4wIG5vdyB0byBtYWtlIHN1cmUgdGhhdCB3b3JrcyBhcyB3ZWxsLgoKLSBIYWQgdG8gYWRkICdDb25uZWN0aW9uOiBjbG9zZScgdG8gdGhlIGhlYWRlcnMgb2YgYSBidW5jaCBvZiB0ZXN0IGNhc2VzIHNvCiAgdGhhdCBjdXJsIGJlaGF2ZXMgIm9sZC1zdHlsZSIgc2luY2UgdGhlIHRlc3QgaHR0cCBzZXJ2ZXIgZG9lc24ndCBkbyBtdWx0aXBsZQogIGNvbm5lY3Rpb25zLi4uIE5vdyBJIGdldCAxMDAlIHRlc3QgY2FzZSBPSy4KCi0gVGhlIGN1cmwuaGF4eC5zZSBzaXRlLCB0aGUgbWFpbiBjdXJsIG1haWxpbmcgbGlzdCBhbmQgbXkgcGVyc29uYWwgZW1haWwgYXJlCiAgYWxsIGRlYWQgdG9kYXkgZHVlIHRvIHBvd2VyIGJsYWNrb3V0IGluIHRoZSBhcmVhIHdoZXJlIHRoZSBtYWluIHNlcnZlcnMgYXJlCiAgbG9jYXRlZC4gSG9ycmlibGUuCgotIEkndmUgbWFkZSBwZXJzaXN0YW5jZSB3b3JrIG92ZXIgYSBzcXVpZCBIVFRQIHByb3h5LiBJIGZpbmQgaXQgZGlzdHVyYmluZwogIHRoYXQgaXQgdXNlcyBoZWFkZXJzIHRoYXQgYXJlbid0IHByZXNlbnQgaW4gYW55IEhUVFAgc3RhbmRhcmQgdGhvdWdoCiAgKFByb3h5LUNvbm5lY3Rpb246KSBhbmQgdGhhdCBtYWtlcyBtZSBmZWVsIHRoYXQgSSdtIG5vdyBvbiB0aGUgZWRnZSBvZiB3aGF0CiAgdGhlIHN0YW5kYXJkIGFjdHVhbGx5IGRlZmluZXMuIEkgbmVlZCB0byBnZXQgdGhpcyBjb2RlIGV4Y2VyY2lzZWQgb24gYSBsb3QKICBvZiBkaWZmZXJlbnQgSFRUUCBwcm94aWVzIGJlZm9yZSBJIGZlZWwgc2FmZS4KCiAgTm93IEknbSBmYWNpbmcgdGhlIHByb2JsZW0gd2l0aCBteSB0ZXN0IHN1aXRlIHNlcnZlcnMgKGJvdGggRlRQIGFuZCBIVFRQKQogIG5vdCBzdXBwb3J0aW5nIHBlcnNpc3RlbnQgY29ubmVjdGlvbnMgYW5kIGxpYmN1cmwgaXMgZG9pbmcgdGhlbSBub3cuIEkgaGF2ZQogIHRvIGZpeCB0aGUgdGVzdCBzZXJ2ZXJzIHRvIGdldCBhbGwgdGhlIHRlc3QgY2FzZXMgZG8gT0suCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSBHdWVub2xlIEJlc2NvbiByZXBvcnRlZCB0aGF0IGxpYmN1cmwgZGlkIG91dHB1dCBlcnJvcnMgdG8gc3RkZXJyIGV2ZW4gaWYKICBNVVRFIGFuZCBOT1BST0dSRVNTIHdhcyBzZXQuIEl0IHR1cm5lZCBvdXQgdG8gYmUgYSBidWcgYW5kIGhhcHBlbnMgaWYKICB0aGVyZSdzIGFuIGVycm9yIGFuZCBubyBFUlJPUkJVRkZFUiBpcyBzZXQuIFRoaXMgaXMgbm93IGNvcnJlY3RlZC4KClZlcnNpb24gNy43LWJldGExCgpEYW5pZWwgKDggTWFyY2ggMjAwMSkKLSAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIGlzIG5vIGxvbmdlciBhbnkgdHJvdWJsZSBmb3IgbGliY3VybC4gSSd2ZQogIGFkZGVkIHR3byBzb3VyY2UgZmlsZXMgYW5kIEkndmUgcnVuIHNvbWUgdGVzdCBkb3dubG9hZHMgdGhhdCBsb29rIGZpbmUuCgotIEhUVFAgSEVBRCB3b3JrcyB0b28sIGV2ZW4gb24gMS4xIHNlcnZlcnMuCgpEYW5pZWwgKDUgTWFyY2ggMjAwMSkKLSBUaGUgY3VycmVudCA1NyB0ZXN0IGNhc2VzIG5vdyBwYXNzIE9LLiBJdCB3b3VsZCBzdWdnZXN0IHRoYXQgbGliY3VybCB3b3JrcwogIHVzaW5nIHRoZSBvbGQtc3R5bGUgd2l0aCBvbmUgY29ubmVjdGlvbiBwZXIgaGFuZGxlLiBUaGUgdGVzdCBzdWl0ZSBkb2Vzbid0CiAgaGFuZGxlIG11bHRpcGxlIGNvbm5lY3Rpb25zIHlldCBzbyB0aGVyZSBhcmUgbm8gdGVzdCBjYXNlcyBmb3IgdGhpcy4KCi0gSSBwYXRjaGVkIHRoZSB0ZWxuZXQuYyBoZWF2aWx5IHRvIG5vdCB1c2UgYW55IGdsb2JhbCB2YXJpYWJsZXMgYW55bW9yZS4gSXQKICBzaG91bGQgbWFrZSBpdCBhIGxvdCBuaWNlciBsaWJyYXJ5LXdpc2UuCgotIFRoZSBmaWxlOi8vIHN1cHBvcnQgd2FzIG1vZGlmaWVkIHNsaWdodGx5IHRvIHVzZSB0aGUgaW50ZXJuYWwgY29ubmVjdC1maXJzdC0KICB0aGVuLWRvIGFwcHJvYWNoLgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTW9yZSBidWdzIGVyYXNlZC4KClZlcnNpb24gNy43LWFscGhhMgoKRGFuaWVsICg0IE1hcmNoIDIwMDEpCi0gTm93LCB0aGVyZSdzIGV2ZW4gYSBiYXNpYyBjaGVjayB0aGF0IGEgcmUtdXNlZCBjb25uZWN0aW9uIGlzIHN0aWxsIGFsaXZlCiAgYmVmb3JlIGl0IGlzIGFzc3VtZWQgc28uIEEgZmV3IGZpcnN0IHRlc3RzIGhhdmUgcHJvdmVuIHRoYXQgbGliY3VybCB3aWxsCiAgdGhlbiByZS1jb25uZWN0IGluc3RlYWQgb2YgcmUtdXNlIHRoZSBkZWFkIGNvbm5lY3Rpb24hCgpEYW5pZWwgKDIgTWFyY2ggMjAwMSkKLSBOb3cgdGhleSB3b3JrIGludGVybWl4ZWQgYXMgd2VsbC4gTWFqb3IgY29vbG5lc3MhCgotIE1vcmUgZmlkZGxpbmcgYXJvdW5kLCBteSAndGlueScgY2xpZW50IEkgaGF2ZSBmb3IgdGVzdGluZyBwdXJwb3NlcyBub3cgaGFzCiAgcHJvdmVkIHRvIGRvd25sb2FkIGJvdGggRlRQIGFuZCBIVFRQIHdpdGggcGVyc2lzdGVudCBjb25uZWN0aW9ucy4gVGhleSBkbwogIG5vdCB3b3JrIGludGVybWl4ZWQgeWV0IHRob3VnaC4KCkRhbmllbCAoMSBNYXJjaCAyMDAxKQotIFdpbGZyZWRvIFNhbmNoZXogcG9pbnRlZCBvdXQgYSBtaW5vciBzcGVsbGluZyBtaXN0YWtlIGluIGEgbWFuIHBhZ2UgYW5kIHRoYXQKICBjdXJsX3NsaXN0X2FwcGVuZCgpIHNob3VsZCB0YWtlIGEgY29uc3QgY2hhciAqIGFzIHNlY29uZCBhcmd1bWVudC4gSXQgZG9lcwogIG5vdy4KCkRhbmllbCAoMjIgRmVicnVhcnkgMjAwMSkKLSBUaGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzdGFydCB0byBsb29rIGdvb2QgZm9yIEhUVFAuIE9uIGEgc3Vic2VxdWVudAogIHJlcXVlc3QsIGl0IHNlZW1zIHRoYXQgbGliY3VybCBub3cgY2FuIHBpY2sgYW4gYWxyZWFkeSBleGlzdGluZyBjb25uZWN0aW9uCiAgaWYgYSBzdWl0YWJsZSBvbmUgZXhpc3RzLCBvciBpdCBvcGVucyBhIG5ldyBvbmUuCgotIERvdWdsYXMgUi4gSG9ybmVyIG1haWxlZCBtZSBjb3JyZWN0aW9ucyB0byB0aGUgY3VybF9mb3JtcGFyc2UoKSBtYW4gcGFnZQogIHRoYXQgSSBhcHBsaWVkLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDAxKQotIEFkZGVkIHRoZSBkb2NzL2V4YW1wbGVzL3dpbjMyc29ja2V0cy5jIGZpbGUgZm9yIG91ciB3aW5kb3dzIGZyaWVuZHMuCgotIExpbnVzIE5pZWxzZW4gRmVsdHppbmcgcHJvdmlkZWQgYnJhbmQgbmV3IFRFTE5FVCBmdW5jdGlvbmFsaXR5IGFuZAogIGltcHJvdmVtZW50czoKCiAgKiBOZWdvdGlhdGlvbiBpcyBub3cgcGFzc2l2ZS4gQ3VybCBkb2VzIG5vdCBuZWdvdGlhdGUgdW50aWwgdGhlIHBlZXIgZG9lcy4KICAqIFBvc3NpYmlsaXR5IHRvIHNldCBuZWdvdGlhdGlvbiBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUsIGN1cnJlbnRseSBvbmx5CiAgICBYRElTUExPQywgVFRZUEUgYW5kIE5FV19FTlZJUk9OIChjYWxsZWQgTkVXX0VOVikuCiAgKiBOb3cgc2VuZHMgdGhlIFVTRVIgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgdGhlIC11IHN3aXRjaCBpcyB1c2VkLgogICogVXNlIC10IHRvIHNldCB0ZWxuZXQgb3B0aW9ucyAoTGludXMgZXZlbiB1cGRhdGVkIHRoZSBtYW4gcGFnZSwgYXdlc29tZSEpCgotIEhhdmVuJ3QgZG9uZSB0aGlzIGJpZyBjaGFuZ2VzIHRvIGN1cmwgZm9yIGEgd2hpbGUuIE1vdmVkIGFyb3VuZCBhIGxvdCBvZgogIHN0cnVjdCBmaWVsZHMgYW5kIHN0dWZmIHRvIG1ha2UgbXVsdGlwbGUgY29ubmVjdGlvbnMgZ2V0IGNvbm5lY3Rpb24gc3BlY2lmaWMKICBkYXRhIGluIHNlcGFyYXRlIHN0cnVjdHMgc28gdGhhdCB0aGV5IGNhbiBjby1leGlzdCBpbiBhIG5pY2Ugd2F5LiBTZWUgdGhlCiAgbWFpbGluZyBsaXN0cyBmb3IgZGlzY3Vzc2lvbnMgYXJvdW5kIGhvdyB0aGlzIGlzIGdvbm5hIGJlIGltcGxlbWVudGVkLiBEb2NzCiAgYW5kIG1vcmUgd2lsbCBmb2xsb3cuCgogIFN0dWRpZWQgdGhlIEhUVFAgUkZDIHRvIGZpbmQgb3V0IGJldHRlciBob3cgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBzaG91bGQKICB3b3JrLiBTZWVtcyBjb29sIGVub3VnaC4KCkRhbmllbCAoMTkgRmVicnVhcnkgMjAwMSkKLSBCb2IgU2NoYWRlciBicm91Z2h0IG1lIHR3byBmaWxlcyB0aGF0IGhlbHAgc2V0IHVwIGEgTVMgVkMrKyBsaWJjdXJsIHByb2plY3QKICBlYXNpZXIuIEhlIGFsc28gcHJvdmlkZWQgbWUgd2l0aCBhbiB1cC10by1kYXRlIGxpYmN1cmwuZGVmIGZpbGUuCgotIEkgbW92ZWQgYSBidW5jaCBvZiBwcm90b3R5cGVzIGZyb20gdGhlIHB1YmxpYyA8Y3VybC9jdXJsLmg+IGZpbGUgdG8gdGhlCiAgbGlicmFyeSBwcml2YXRlIHVybGRhdGEuaC4gVGhpcyBpcyBiZWNhdXNlIG9mIHRoZSB1cGNvbWluZyBjaGFuZ2VzLiBUaGUKICBsb3cgbGV2ZWwgaW50ZXJmYWNlIGlzIG5vIGxvbmdlciBiZWluZyBwbGFubmVkIHRvIGJlY29tZSByZWFsaXR5LgoKRGFuaWVsICgxNSBGZWJydWFyeSAyMDAxKQotIENVUkxPUFRfUE9TVCBpcyBub3QgcmVxdWlyZWQgYW55bW9yZS4gSnVzdCBzZXR0aW5nIHRoZSBQT1NUIHN0cmluZyB3aXRoCiAgQ1VSTE9QVF9QT1NURklFTERTIHdpbGwgc3dpdGNoIG9uIHRoZSBIVFRQIFBPU1QuIE1vc3Qgb3RoZXIgdGhpbmdzIGluCiAgbGliY3VybCBhbHJlYWR5IHdvcmtzIHRoaXMgd2F5LCBpLmUgdGhleSByZXF1aXJlIG9ubHkgdGhlIHBhcmFtZXRlciB0bwogIHN3aXRjaCBvbiBhIGZlYXR1cmUgc28gSSB0aGluayB0aGlzIHdvcmtzIHdlbGwgd2l0aCB0aGUgcmVzdC4gU2V0dGluZyBhIE5VTEwKICBzdHJpbmcgc3dpdGNoZXMgb2ZmIHRoZSBQT1NUIGFnYWluLgoKLSBFeGNlbGxlbnQgc3VnZ2VzdGlvbnMgZnJvbSBSaWNoIEdyYXksIFJpY2sgSm9uZXMsIEpvaGFuIE5pbHNzb24gYW5kIEJqb3JuCiAgUmVlc2UgaGVscGVkIG1lIGRlZmluZSBhIHdheSBob3cgdG8gaW5jb3Jwb3JhdGUgcGVyc2lzdGVudCBjb25uZWN0aW9ucyBpbnRvCiAgbGliY3VybCBpbiBhIHZlcnkgc21vb3RoIHdheS4gSWYgZG9uZSByaWdodCwgbm8gY2hhbmdlIG1heSBoYXZlIHRvIGJlIG1hZGUKICB0byBvbGRlciBwcm9ncmFtcyBhbmQgdGhleSB3aWxsIGp1c3Qgc3RhcnQgdXNpbmcgcGVyc2lzdGVudCBjb25uZWN0aW9ucyB3aGVuCiAgYXBwbGljYWJsZSEKCkRhbmllbCAoMTMgRmVicnVhcnkgMjAwMSkKLSBDaGFuZ2VkIHRoZSB3b3JkICd0aW1lb3V0ZWQnIHRvICd0aW1lZCBvdXQnIGluIHR3byBkaWZmZXJlbnQgZXJyb3IgbWVzc2FnZXMuCiAgU3VnZ2VzdGVkIGJ5IExhcnJ5IEZhaG5vZS4KClZlcnNpb24gNy42LjEKCkRhbmllbCAoOSBGZWJydWFyeSAyMDAxKQotIEZyYW5rIFJlaWQgYW5kIENhaW4gSG9wd29vZCBwcm92aWRlZCBpbmZvcm1hdGlvbiBhbmQgcmVzZWFyY2ggYXJvdW5kIGEgSFRUUFMKICBQVVQvdXBsb2FkIHByb2JsZW0gd2Ugc2VlbSB0byBoYXZlLiBObyBzb2x1dGlvbiBmb3VuZCB5ZXQuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwMSkKLSBBbiBpbnRlcmVzdGluZyBkaXNjdXNzaW9uIGlzIGhvdyB0byBzcGVjaWZ5IGFuIGVtcHR5IHBhc3N3b3JkIHdpdGhvdXQgaGF2aW5nCiAgY3VybCBhc2sgZm9yIGl0IGludGVyYWN0aXZlbHk/IFRoZSBjdXJyZW50IGltcGxtZW50YXRpb24gdGFrZXMgYW4gZW1wdHkKICBwYXNzd29yZCBhcyBhIHJlcXVlc3QgZm9yIGEgcGFzc3dvcmQgcHJvbXB0LiBIb3dldmVyLCBJIHN0aWxsIHdhbnQgdG8KICBzdXBwb3J0IGEgYmxhbmsgdXNlciBmaWVsZC4gVGh1cywgdG9kYXkgaWYgeW91IGVudGVyICItdSA6IiAod2l0aG91dCB1c2VyCiAgYW5kIHBhc3N3b3JkKSBjdXJsIHdpbGwgcHJvbXB0IGZvciB0aGUgcGFzc3dvcmQuIFRyaWNreS4gSG93IHdvdWxkIHlvdQogIHNwZWNpZnkgeW91IHdhbnQgdGhlIHByb21wdCBvdGhlcndpc2U/CgotIE1hZGUgdGhlIG5ldHJjIHBhcnNlIHJlc3VsdCBwb3NzaWJsZSB0byB1c2UgZm9yIG90aGVyIHByb3RvY29scyB0aGFuIEZUUCBhbmQKICBIVFRQIChzdWNoIGFzIHRoZSB1cGNvbWluZyBURUxORVQgZml4ZXMpLgoKLSBUaGUgcHJldmlvdXNseSBtZW50aW9uZWQgIk1TVkMrKyBwcm9ibGVtcyIgdHVybmVkIG91dCB0byBiZSBhIG5vbi1pc3N1ZS4KCi0gQWRkZWQgYSBIVFRQIGZpbGUgdXBsb2FkIGNvZGUgZXhhbXBsZSBpbiB0aGUgZG9jcy9leGFtcGxlcy8gc2VjdGlvbiBvbgogIHJlcXVlc3QuCgotIEFkanVzdGVkIHRoZSBGVFAgcmVzcG9uc2UgZml4IHNsaWdodGx5LgoKVmVyc2lvbiA3LjYuMS1wcmUzCgpEYW5pZWwgKDcgRmVicnVhcnkgMjAwMSkKLSBTLiBNb29uZXNhbXkgZm91bmQgYSBmbGF3IGluIHRoZSByZXNwb25zZSByZWFkaW5nIGZ1bmN0aW9uIGZvciBGVFAgdGhhdAogIGNvdWxkIG1ha2UgbGliY3VybCBub3QgZ2V0IG91dCBvZiB0aGUgbG9vcCBwcm9wZXJseSB3aGVuIGl0IHNob3VsZCwgaWYKICBsaWJjdXJsIGdvdCAtMSByZXR1cm5lZCB3aGVuIHJlYWRpbmcgdGhlIHNvY2tldC4KCi0gSSBmb3VuZCBhIHNpbWlsYXIgbWlzdGFrZSBpbiBodHRwLmMgd2hlbiB1c2luZyBhIHByb3h5IGFuZCByZWFkaW5nIHRoZQogIHJlc3VsdHMgZnJvbSB0aGUgcHJveHkgY29ubmVjdGlvbi4KCkRhbmllbCAoNiBGZWJydWFyeSAyMDAxKQotIFMuIE1vb25lc2FteSBwb2ludGVkIG91dCB0aGF0IHRoZSBWQyBtYWtlZmlsZSBpbiBzcmMvIG5lZWRlZCB0aGUgbGlicGF0aCBzZXQKICBmb3IgdGhlIGRlYnVnIGJ1aWxkIHRvIHdvcmsuCgotIERhbmllbCBHZWhyaWdlciBzdGVwcGVkIGluIHRvIGFzc2lzdCB3aXRoIHRoZSBWQysrIHN0dWZmIFJvYmVydCBXZWF2ZXIKICBicm91Z2h0IHVwIHllc3RlcmRheS4KCkRhbmllbCAoNSBGZWJydWFyeSAyMDAxKQotIEp1bi1pY2hpcm8gaXRvanVuIEhhZ2lubyBicm91Z2h0IGEgYmlnIHBhdGNoIHRoYXQgYnJpbmdzIElQdjYtYXdhcmVuZXNzIHRvCiAgYSBidW5jaCBvZiBkaWZmZXJlbnQgYXJlYXMgd2l0aGluIGxpYmN1cmwuCgotIFJvYmVydCBXZWF2ZXIgdG9sZCBtZSBhYm91dCB0aGUgcHJvYmxlbXMgdGhlIE1TIFZDKysgNi4wIGNvbXBpbGVyIGhhcyB3aXRoCiAgdGhlICdzdGF0aWMnIGtleXdvcmQgb24gYSBudW1iZXIgb2YgbGliY3VybCBmdW5jdGlvbnMuIEkgbWlnaHQgbmVlZCB0byBhZGQgYQogIHBhdGNoIHRoYXQgcmVkZWZpbmVzIHN0YXRpYyB3aGVuIGxpYmN1cmwgaXMgY29tcGlsZWQgd2l0aCB0aGF0IGNvbXBpbGVyLgogIEhvdyBkbyBJIGtub3cgd2hlbiBWQysrIGNvbXBpbGVzLCBhbnlvbmU/CgpEYW5pZWwgKDQgRmVicnVhcnkgMjAwMSkKLSBjdXJsX2dldGluZm8oKSB3YXMgZXh0ZW5kZWQgd2l0aCB0d28gbmV3IG9wdGlvbnM6CiAgQ1VSTElORk9fQ09OVEVOVF9MRU5HVEhfRE9XTkxPQUQgYW5kIENVUkxJTkZPX0NPTlRFTlRfTEVOR1RIX1VQTE9BRC4gVGhleQogIHJldHVybiB0aGUgZnVsbCBhc3N1bWVkIGNvbnRlbnQgbGVuZ3RoIG9mIHRoZSB0cmFuc2ZlciBpbiB0aGUgZ2l2ZW4KICBkaXJlY3Rpb24uIFRoZSBDVVJMSU5GT19DT05URU5UX0xFTkdUSF9ET1dOTE9BRCB3aWxsIGJlIHRoZSBDb250ZW50LUxlbmd0aDoKICBzaXplIG9mIGEgSFRUUCBkb3dubG9hZC4gQWRkZWQgZGVzY3JpcHRpb25zIHRvIHRoZSBtYW4gcGFnZSBhcyB3ZWxsLiBUaGlzCiAgd2FzIGRvbmUgYWZ0ZXIgZGlzY3Vzc2lvbnMgd2l0aCBCb2IgU2NoYWRlci4KCkRhbmllbCAoMyBGZWJydWFyeSAyMDAxKQotIEluZ28gUmFsZiBCbHVtIHByb3ZpZGVkIGFub3RoZXIgZml4IHRoYXQgbWFrZXMgY3VybCBidWlsZCB1bmRlciB0aGUgbW9yZQogIHJlY2VudCBjeWd3aW4gaW5zdGFsbGF0aW9ucy4gSXQgc2VlbXMgdGhleSd2ZSBjaGFuZ2VkIHRoZSBwcmVzZXQgZGVmaW5lcyB0bwogIG5vdCBpbmNsdWRlIFdJTjMyIGFueW1vcmUuCgpWZXJzaW9uIDcuNi4xLXByZTIKCkRhbmllbCAoMzEgSmFudWFyeSAyMDAxKQotIEN1cmxfcmVhZCgpIGFuZCBjdXJsX3JlYWQoKSBub3cgcmV0dXJuIGEgc3NpemVfdCBmb3IgdGhlIHNpemUsIGFzIGl0IGhhZCB0bwogIGJlIGFibGUgdG8gcmV0dXJuIC0xLiBUaGUgdGVsbmV0IHN1cHBvcnQgY3Jhc2hlZCBkdWUgdG8gdGhpcyBhbmQgdGhlcmUgd2FzIGEKICBwb3NzaWJpbGl0eSB0byB3ZWlyZCBiZWhhdmlvciBhbGwgb3Zlci4gTGludXMgTmllbHNlbiBGZWx0emluZyBoZWxwZWQgbWUKICBmaW5kIHRoaXMuCgotIEFkZGVkIGEgY29uZmlndXJlLmluIGNoZWNrIGZvciBhIHdvcmtpbmcgZ2V0YWRkcmluZm8oKSBpZiBJUHY2IGlzIHJlcXVlc3RlZC4KICBJIGFsc28gbWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmZWF0dXJlIC0tZW5hYmxlLWRlYnVnIHdoaWNoIHNldHMgYSBjb3VwbGUKICBvZiBjb21waWxlciBvcHRpb25zIHdoZW4gdXNlZC4gSXQgYXNzdW1lcyBnY2MuCgpEYW5pZWwgKDMwIEphbnVhcnkgMjAwMSkKLSBJIGZpbmFsbHkgdG9vayBhIHN0YWIgYXQgdGhlIGxvbmctdGVybSBGSVhNRSBpdGVtIEkndmUgaGFkIG9uIG15c2VsZiwgYW5kCiAgbm93IGxpYmN1cmwgd2lsbCBwcm9wZXJseSB3b3JrIHdoZW4gZG9pbmcgYSBIVFRQIHJhbmdlLXJlcXVlc3QgdGhhdCBmb2xsb3dzCiAgYSBMb2NhdGlvbjouIFByZXZpb3VzbHkgdGhhdCB3b3VsZCBtYWtlIGxpYmN1cmwgZmFpbCBzYXlpbmcgdGhhdCB0aGUgc2VydmVyCiAgZG9lc24ndCBzZWVtIHRvIHN1cHBvcnQgcmFuZ2UgcmVxdWVzdHMuCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwMSkKLSBJIGFkZGVkIGEgdGVzdCBjYXNlIGZvciB0aGUgSFRUUCBQVVQgcmVzdW1lIHRoaW5nICh0ZXN0IGNhc2UgMzMpLgoKVmVyc2lvbiA3LjYuMS1wcmUxCgpEYW5pZWwgKDI5IEphbnVhcnkgMjAwMSkKLSBZZXQgYW5vdGhlciBDb250ZW50LVJhbmdlIGNoYW5nZS4gT2sgbm93PyBCb2IgU2NoYWRlciBjaGVja3MgZnJvbSBoaXMgZW5kIAogIGFuZCBpdCB3b3JrcyBmb3IgaGltLgoKRGFuaWVsICgyNyBKYW51YXJ5IDIwMDEpCi0gU28gdGhlIEhUVFAgUFVUIHJlc3VtZSBmaXggd2Fzbid0IGdvb2QuIFRoZXJlIHNob3VsZCBhcHBlYXJhbnRseSBiZSBhCiAgQ29udGVudC1SYW5nZSBoZWFkZXIgd2hlbiByZXN1bWluZyBhIFBVVC4KCi0gSSBub3RpY2VkIEkgYnJva2UgdGhlIGRvd25sb2FkLWNoZWNrIHRoYXQgdmVyaWZpZXMgdGhhdCBhIHJlc3VtZWQgSFRUUAogIGRvd25sb2FkIGlzIGFjdHVhbGx5IHJlc3VtZWQuIEl0IGdvdCBicm9rZSBiZWNhdXNlIG15IG5ldyAnaHR0cHJlcScgZmllbGQKICBpbiB0aGUgbWFpbiBjdXJsIHN0cnVjdC4gSSBzaG91bGQgZ2V0IHNsYXBwZWQuIEkgYWRkZWQgYSB0ZXN0IGNhc2UgZm9yCiAgdGhpcyBub3csIHNvIEkgd29uJ3QgYmUgYWJsZSB0byBydWluIHRoaXMgYWdhaW4gd2l0aG91dCBub3RpY2luZy4KCi0gQWRkZWQgYSB0ZXN0IGNhc2UgZm9yIGNvbnRlbnQtbGVuZ3RoIHZlcmlmeWluZyB3aGVuIGRvd25sb2FkaW5nIEhUVFAuCgotIE1hZGUgdGhlIHByb2dyZXNzIG1ldGVyIHRpdGxlIHNheSBpZiB0aGUgdHJhbnNmZXIgaXMgYmVpbmcgdHJhbnNmZXJlZC4gSXQKICBtYWtlcyB0aGUgb3V0cHV0IHNsaWdodGx5IGJldHRlciBmb3IgcmVzdW1lcy4KCi0gV2hlbiBkZWFsaW5nIHdpdGggTG9jYXRpb246IGFuZCBIVFRQIHJldHVybiBjb2RlcywgbGliY3VybCB3aWxsIG5vdCBhdHRlbXB0CiAgdG8gZm9sbG93IHRoZSBzcGlyaXQgb2YgUkZDMjYxNiBiZXR0ZXIuIEl0IG1lYW5zIHRoYXQgd2hlbiBQT1NUaW5nIHRvIGEKICBVUkwgdGhhdCBpcyBiZWluZyBmb2xsb3dpbmcgdG8gYSBzZWNvbmQgcGxhY2UsIHRoZSBzdGFuZGFyZCB3aWxsIGp1ZGdlIG9uCiAgd2hhdCB0byBkby4gQWxsIEhUVFAgY29kZXMgZXhjZXB0IDMwMyBhbmQgMzA1IHdpbGwgY2F1c2UgY3VybCB0byBtYWtlIGEKICBzZWNvbmQgUE9TVCBvcGVyYXRpb24uIDMwMyB3aWxsIG1ha2UgYSBHRVQgYW5kIDMwNSBpcyBub3QgeWV0IHN1cHBvcnRlZC4KCiAgSSBhbHNvIHdyb3RlIHR3byB0ZXN0IGNhc2VzIGZvciB0aGlzIFBPU1QvR0VUL0xvY2F0aW9uIHN0dWZmLgoKVmVyc2lvbiA3LjYKCkRhbmllbCAoMjYgSmFudWFyeSAyMDAxKQotIExvdHMgb2YgbWFpbHMgYmFjayBhbmQgZm9ydGggd2l0aCBCb2IgU2NoYWRlciBmaW5hbGx5IG1hZGUgbWUgYWRkIGEgc21hbGwKICBwaWVjZSBvZiBjb2RlIGluIHRoZSBIVFRQIGVuZ2luZSBzbyB0aGF0IEhUVFAgdXBsb2FkIHJlc3VtZSB3b3Jrcy4gWW91IGNhbgogIG5vdyBkbyBhbiBvcGVyYXRpb24gbGlrZSAnY3VybCAtVCBmaWxlIC1DIDxvZmZzZXQ+IDxVUkw+JyBhbmQgY3VybCB3aWxsIFBVVAogIHRoZSBlbmRpbmcgcGFydCBvZiB0aGUgZmlsZSBzdGFydGluZyBhdCBnaXZlbiBvZmZldCB0byB0aGUgc3BlY2lmaWVkIFVSTC4KClZlcnNpb24gNy42LXByZTQKCkRhbmllbCAoMjUgSmFudWFyeSAyMDAxKQotIEkgdG9vayBob2xkIG9mIFJpY2sgSm9uZXMnIHF1ZXN0aW9uIHdoeSB3ZSBkb24ndCB1c2UgcmVjdigpIGFuZCBzZW5kKCkgZm9yCiAgcmVhZGluZy93cml0aW5nIHRvIHRoZSBzb2NrZXRzIGFuZCBJJ3ZlIG5vdyBtb2RpZmllZCB0aGUgc3JlYWQoKSBhbmQKICBzd3JpdGUoKSBtYWNyb3MgdG8gdXNlIHRoZW0gaW5zdGVhZC4gSWYgbm90aGluZyBlbHNlLCB0aGV5IGNvdWxkIGJlIHRlc3RlZAogIGluIHRoZSBuZXh0IGJldGEtcm91bmQgY29taW5nIHJpZ2h0IHVwLgoKLSBKZWZmIE1vcnJvdyBmb3VuZCBhIHByb2JsZW0gd2l0aCBsaWJjdXJsJ3MgdXNhZ2Ugb2YgU1NMX3JlYWQoKSBhbmQgc3VwcGxpZWQKICBoaXMgcmVzZWFyY2ggcmVzdWx0cyBpbiBob3cgdG8gZml4IHRoaXMuIEl0IHR1cm5zIG91dCB3ZSBoYXZlIHRvIGludm9rZSB0aGUKICBmdW5jdGlvbiBzZXZlcmFsIHRpbWVzIGluIHNvbWUgY2FzZXMuIFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBTU0xfd3JpdGUoKS4KCiAgSSBtYWRlIHNvbWUgcmF0aGVyIGRyYXN0aWMgY2hhbmdlcyBhbGwgb3ZlciBsaWJjdXJsIHRvIG1ha2UgYWxsIHdyaXRlcyBhbmQKICByZWFkcyBnZXQgZG9uZSBvbiBvbmUgc2luZ2xlIHBsYWNlIHNvIHRoYXQgdGhpcyByZXBlYXRlZC1hdHRlbXB0cyB0aGluZwogIHdvdWxkIG9ubHkgaGF2ZSB0byBiZSBpbXBsZW1lbnRlZCBhdCBvbmUgcG9pbnQuCgotIFJpY2sgSm9uZXMgc3BvdHRlZCB0aGF0IHRoZSAndG90YWwgdGltZScgY291bnRlciByZWFsbHkgZGlkbid0IG1lYXN1cmUgdGhlCiAgdG90YWwgdGltZSB2ZXJ5IGFjY3VyYXRlIG9uIHN1YnNlY29uZCBsZXZlbHMuCgotIEpvaGFuIE5pbHNzb24gcG9pbnRlZCBvdXQgdGhlIG5lZWQgdG8gbW9yZSBjbGVhcmx5IHNwZWNpZnkgdGhhdCB0aGUgdGltZW91dAogIHZhbHVlIHlvdSBzZXQgZm9yIGEgZG93bmxvYWQgaXMgZm9yIHRoZSAqZW50aXJlKiBkb3dubG9hZC4gVGhlcmUncyBjdXJyZW50bHkKICBubyBvcHRpb24gYXZhaWxhYmxlIHRoYXQgc2V0cyBhIHRpbWVvdXQgZm9yIHRoZSBjb25uZWN0aW9uIHBoYXNlIG9ubHkuCgpEYW5pZWwgKDI0IEphbnVhcnkgMjAwMSkKLSBJbmdvIFJhbGYgQmx1bSBzdWJtaXR0ZWQgYSBzZXJpZXMgb2YgcGF0Y2hlcyByZXF1aXJlZCB0byBnZXQgY3VybCB0byBjb21waWxlCiAgcHJvcGVybHkgd2l0aCBjeWd3aW4uCgotIFJvYmVydCBXZWF2ZXIgcG9zdGVkIGEgZml4IGZvciB0aGUgd2luMzIgc2VjdGlvbiBvZiB0aGUgY3VybF9nZXRlbnYoKSBjb2RlCiAgdGhhdCBjb3JyZWN0ZWQgYSBwb3RlbnRpYWwgbWVtb3J5IGxlYWsuCgotIEFkZGVkIGNvbW1lbnRzIGluIGEgZmV3IGZpbGVzIGluIGEgc3VkZGVuIGF0dGVtcHQgdG8gbWFrZSB0aGUgc291cmNlcyBtb3JlCiAgZWFzeSB0byByZWFkIGFuZCB1bmRlcnN0YW5kIQoKRGFuaWVsICgyMyBKYW51YXJ5IDIwMDEpCi0gQWRkZWQgc2ltcGxlIElQdjYgZGV0ZWN0aW9uIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IGFuZCBtYWRlIHRoZSB2ZXJzaW9uCiAgc3RyaW5nIGFkZCAnaXB2NicgdG8gdGhlIGVuYWJsZSBzZWN0aW9uIGluIHRoYXQgY2FzZS4gRU5BQkxFX0lQVjYgd2lsbCBiZQogIHNldCBpZiBjdXJsIGlzIGNvbXBpbGVkIHdpdGggSVB2NiBzdXBwb3J0IGVuYWJsZWQuCgotIEFkZGVkIGEgcGFyc2VyIGZvciBJUHY2LXN0eWxlIHNwZWNpZmllZCBJUC1hZGRyZXNzZXMgaW4gYSBVUkwuIFRodXMsIHdoZW4KICBJUHY2IGdldHMgZW5hYmxlZCBzb29uLCB3ZSBjYW4gdXNlIFVSTHMgbGlrZSAnWzA6OjFdOjgwJy4uLgoKLSBNYWRlIHRoZSBVUkwgZ2xvYmJpbmcgaW4gdGhlIGNsaWVudCBwb3NzaWJsZSB0byBmYWlsIHNpbGVudGx5IGlmIHRoZXJlJ3MgYW4KICBlcnJvciBpbiB0aGUgZ2xvYmJpbmcuIEl0IG1ha2VzIGl0IGFsbW9zdCBpbnR1aXRpdmUsIHNvIHdoZW4geW91IGRvbid0CiAgZm9sbG93IHRoZSBzeW50YXggcnVsZXMsIGdsb2JiaW5nIGlzIHNpbXBseSBzd2l0Y2hlZCBvZmYgYW5kIHRoZSByYXcgc3RyaW5nCiAgaXMgdXNlZCBpbnN0ZWFkLgoKICBJIHN0aWxsIHRoaW5rIHdlJ2xsIGdldCBwcm9ibGVtcyB3aXRoIElQdjYtc3R5bGUgSVAtYWRkcmVzc2VzIHdoZW4gd2UgKndhbnQqCiAgZ2xvYmJpbmcgb24gcGFydHMgb2YgdGhlIFVSTCBhcyB0aGUgaW5pdGlhbCBwYXJ0IG9mIHRoZSBVUkwgd2lsbCBmb3Igc3VyZQogIHNlcmlvdXNseSBjb25mdXNlIHRoZSBnbG9iYmVyLgoKRGFuaWVsICgyMiBKYW51YXJ5IDIwMDEpCi0gQmr2cm4gU3RlbmJlcmcgc3VwcGxpZWQgYSBwcm9ncmVzcyBtZXRlciBwYXRjaCB0aGF0IG1ha2VzIGl0IGxvb2sgYmV0dGVyIGV2ZW4KICBkdXJpbmcgc2xvdyBzdGFydHMuIFByZXZpb3VzbHkgaXQgbWFkZSBzb21lIHNpbGx5IGFzc3VtcHRpb25zLi4uCgotIEFkZGVkIHR3byBGVFAgdGVzdHMgZm9yIC1RIGFuZCAtUSAtIHN0dWZmIHNpbmNlIGl0IHdhcyBiZWluZyBkaXNjdXNzZWQgb24KICB0aGUgbWFpbGluZyBsaXN0LiBIYWQgdG8gY29ycmVjdCB0aGUgZnRwc2VydmVyLnBsIHRvbyBhcyBpdCBidWdnZWQgc2xpZ2h0bHkuCgpEYW5pZWwgKDE5IEphbnVhcnkgMjAwMSkKLSBNYWRlIHRoZSBMb2NhdGlvbjogcGFyc2VycyBkZWFsIHdpdGggYW55LWxlbmd0aCBVUkxzLiBUaHVzIEkgcmVtb3ZlZCB0aGUgbGFzdAogIGNvZGUgdGhhdCByZXN0cmljdHMgdGhlIGxlbmd0aCBvZiBVUkxzIHRoYXQgY3VybCBzdXBwb3J0cy4KCi0gQWRkZWQgYSAtLWdsb2JvZmYgdGVzdCBjYXNlICgjMjgpIGFuZCBpdCBxdWlja2x5IGlkZW50aWZpZWQgYSBtZW1vcnkgcHJvYmxlbQogIGluIHNyYy9tYWluLmMgdGhhdCBJIHRvb2sgY2FyZSBvZi4KClZlcnNpb24gNy42LXByZTMKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAxKQotIE1hZGUgdGhlIHR3byBmb3JtZXIgZmlsZXMgbGliL2Rvd25sb2FkLmMgYW5kIGxpYi9oaWdobGV2ZWwuYyBiZWNvbWUgdGhlIG5ldwogIGxpYi90cmFuc2Zlci5jIHdoaWNoIG1ha2VzIG1vcmUgc2Vuc2UuIEkgYWxzbyBkaWQgdGhlIHJlbmFtZSBmcm9tIFRyYW5zZmVyKCkKICB0byBDdXJsX1RyYW5zZmVyKCkgaW4gdGhlIG90aGVyIHNvdXJjZSBmaWxlcyB0aGF0IHVzZSB0aGUgdHJhbnNmZXIgZnVuY3Rpb24KICBpbiB0aGUgc3Bpcml0IG9mIHVzaW5nIEN1cmxfIHByZWZpeCBmb3IgbGlicmFyeS1zY29wZWQgZ2xvYmFsIHN5bWJvbHMuCgpEYW5pZWwgKDExIEphbnVhcnkgMjAwMSkKLSBBZGRlZCAtZy8tLWdsb2JvZmYgdGhhdCBzd2l0Y2hlcyBPRkYgdGhlIFVSTCBnbG9iYmluZyBhbmQgdGh1cyBlbmFibGVzIHt9W10KICBsZXR0ZXJzIHRvIGJlIHBhcnQgb2YgdGhlIFVSTC4gRG8gbm90ZSB0aGF0IFJGQzIzOTYgc2VjdGlvbiAyLjQuMyBleHBsaWNpdGx5CiAgbWVudGlvbiB0aGVzZSBsZXR0ZXJzIHRvIGJlIGVzY2FwZWQuIFRoaXMgd2FzIHBvc3RlZCBhcyBhIGZlYXR1cmUgcmVxdWVzdCBieQogIEpvcmdlIEd1dGllcnJleiBhbmQgYXMgYSBidWcgYnkgVGVycnkuCgotIFNob3J0IG9wdGlvbnMgdG8gY3VybCB0aGF0IHJlcXVpcmVzIHBhcmFtZXRlcnMgY2FuIG5vdyBiZSBzcGVjaWZpZWQgd2l0aG91dAogIGhhdmluZyB0aGUgb3B0aW9uIGFuZCBpdHMgcGFyYW1ldGVyIHNwYWNlIHNlcGFyYXRlZC4gLW9maWxlIHdvcmtzIGFzIGdvb2QgYXMKICAtbyBmaWxlLiAtbTIwIGlzIGVxdWFsIHRvIC1tIDIwLiBEbyBub3RlIHRoYXQgdGhpcyBnb2VzIGZvciBzaW5nbGUtbGV0dGVyCiAgb3B0aW9ucyBvbmx5LCB2ZXJib3NlIC0tbG9uZy1zdHlsZSBvcHRpb25zIHN0aWxsIG11c3QgYmUgc2VwYXJhdGVkIHdpdGgKICBzcGFjZSBmcm9tIHRoZWlyIHBhcmFtZXRlcnMuCgpEYW5pZWwgKDggSmFudWFyeSAyMDAxKQotIEZyYW5jaXMgRGFnZW5haXMgcmVwb3J0ZWQgdGhhdCB0aGUgU0NPIGNvbXBpbGVyIHN0aWxsIGZhaWxzIHdoZW4gY29tcGlsaW5nCiAgY3VybCBkdWUgdG8gdGhhdCBnZXRwYXNzX3IoKSBwcm90b3R5cGUuIEkndmUgbm93IHB1dCBpdCBhcm91bmQgI2lmbmRlZgogIEhBVkVfR0VUUEFTU19SIGluIGFuIGF0dGVtcHQgdG8gcGxlYXNlIHRoZSBTQ08gc3lzdGVtcy4KCi0gTWFkZSBzb21lIG1pbm9yIGNvcnJlY3Rpb25zIHRvIGdldCB0aGUgY2xpZW50IHRvIGNsZWFudXAgcHJvcGVybHkgYW5kIEkgbWFkZQogIHRoZSBzZXBhcmF0b3Igd29yayBhZ2FpbiB3aGVuIGdldHRpbmcgbXVsdGlwbGUgZ2xvYmJlZCBVUkxzIHRvIHN0ZG91dC4KCi0gV29ya2VkIHdpdGggTG9pYyBEYWNoYXJ5IHRvIGdldCB0aGUgbWFrZSBkaXN0IGFuZCBtYWtlIGRpc3RjaGVjayB3b3JrCiAgY29ycmVjdGx5LiBUaGUgJ21ha2V0Z3onIHNjcmlwdCBpcyBub3cgdXNpbmcgdGhlIGF1dG9tYWtlIGdlbmVyYXRlZCAnbWFrZQogIGRpc3QnIHdoZW4gY3JlYXRpbmcgcmVsZWFzZSBhcmNoaXZlcy4gTG9pYyBzdWNjZXNzZnVsbHkgbWFkZSAnbWFrZSBycG1zJwogIGF1dG9tYXRpY2FsbHkgYnVpbGQgUlBNcyEKCkxvaWMgRGFjaGFyeSAoNiBKYW51YXJ5IDIwMDEpCi0gQXV0b21hdGVkIGdlbmVyYXRpb24gb2YgcnBtIHBhY2thZ2VzLCBubyBuZWVkIHRvIGJlIHJvb3QuCgotIG1ha2UgZGlzdGNoZWNrIGdlbmVyYXRlcyBhIHByb3BlciBkaXN0cmlidXRpb24gKEVYVFJBX0RJU1QKICBpbiBhbGwgTWFrZWZpbGUuYW0gbW9kaWZpZWQgdG8gbWF0Y2ggRklMRVMpLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwMSkKLSBIdWdlIGNsaWVudC1zaWRlIGhhY2s6IG5vdyBtdWx0aXBsZSBVUkxzIGFyZSBzdXBwb3J0ZWQuIEFueSBudW1iZXIgb2YgVVJMcwogIGNhbiBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYW5kIHRoZXknbGwgYWxsIGJlIGRvd25sb2FkZWQuIFRoZXJlCiAgbXVzdCBiZSBhIGNvcnJlc3BvbmRpbmcgLW8gb3IgLU8gZm9yIGVhY2ggVVJMIG9yIHRoZSBkYXRhIHdpbGwgYmUgd3JpdHRlbiB0bwogIHN0ZG91dC4gVGhpcyBuZWVkcyBtb3JlIHRlc3RpbmcsIHRpbWUgdG8gcmVsZWFzZSBhIDcuNi1wcmUgcGFja2FnZS4KCi0gVGhlIGtyYjQgc3VwcG9ydCB3YXMgYnJva2VuIGluIHRoZSByZWxlYXNlLiBGaXhlZCBub3cuCgotIEh1Z2UgaW50ZXJuYWwgc3ltYm9sIHJlbmFtZSBvcGVyYXRpb24uIEFsbCBub24tc3RhdGljIGJ1dCBzdGlsbCBsaWItaW50ZXJuYWwKICBzeW1ib2xzIHNob3VsZCBub3cgYmUgcHJlZml4ZWQgd2l0aCAnQ3VybF8nIHRvIHByZXZlbnQgY29sbGlzaW9ucyB3aXRoIG90aGVyCiAgbGlicy4gQWxsIHB1YmxpYyBzeW1ib2xzIHNob3VsZCBiZSBwcmVmaXhlZCB3aXRoICdjdXJsXycgYW5kIHRoZSByZXN0IHNob3VsZAogIGJlIHN0YXRpYyBhbmQgdGh1cyBpbnZpc2libGUgdG8gdGhlIG91dHNpZGUgd29ybGQuIEkgdXBkYXRlZCB0aGUgSU5URVJOQUxTCiAgZG9jdW1lbnQgdG8gc2F5IHRoaXMgYXMgd2VsbC4KClZlcnNpb24gNy41LjIKCkRhbmllbCAoNCBKYW51YXJ5IDIwMDEpCi0gQXMgS2V2aW4gUCBSb3RoIHN1Z2dlc3RlZCwgSSd2ZSBhZGRlZCB0ZXh0IHRvIHRoZSBtYW4gcGFnZSBmb3IgZXZlcnkgY29tbWFuZAogIGxpbmUgb3B0aW9uIGFuZCB3aGF0IGhhcHBlbnMgd2hlbiB5b3Ugc3BlY2lmeSB0aGF0IG9wdGlvbiBtb3JlIHRoYW4KICBvbmNlLiBUaGF0IGhhc24ndCBiZWVuIGV4YWN0bHkgY3J5c3RhbCBjbGVhciBiZWZvcmUuCgotIE1hZGUgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgcG9zc2libGUgdG8gcnVuIGZyb20gb3V0c2lkZSB0aGUgc291cmNlLXRyZWUuIEZvcgogIG9kZCByZWFzb25zIEkgY2FuJ3QgYnVpbGQgY3VybCBwcm9wZXJseSBvdXRzaWRlIHRob3VnaC4gSXQgaGFzIHRvIGRvIHdpdGgKICBjdXJsJ3MgZGVwZW5kZW5jaWVzIG9uIGxpYmN1cmwuLi4KCi0gQ3V0IG9mZiBhbGwgb2xkZXIgKGRhdGVkIDE5OTkgYW5kIGVhcmxpZXIpIENIQU5HRVMgZW50cmllcyBmcm9tIHRoaXMgZmlsZS4KICBUaGUgb2xkZXIgcGllY2UgaXMgbmFtZWQgQ0hBTkdFUy4wIGFuZCBpcyBhZGRlZCB0byB0aGUgQ1ZTIHJlcG9zaXRvcnkgaW4KICBjYXNlIGFueW9uZSB3b3VsZCBuZWVkIGl0LgoKLSBJIGFkZGVkIGFub3RoZXIgZmlsZSAnQ1ZTLUlORk8nIHRvIHRoZSBDVlMuIEl0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0CiAgZmlsZXMgaW4gdGhlIENWUyB0aGF0IGFyZW4ndCBpbmNsdWRlZCBpbiByZWxlYXNlIGFyY2hpdmVzIGFuZCBob3cgdG8gYnVpbGQKICBjdXJsIHdoZW4geW91IGdldCB0aGUgc291cmNlcyBvZmYgQ1ZTLgoKLSBVcGRhdGVkIENPTlRSSUJVVEUgYW5kIEZBUSBkdWUgdG8gdGhlIG5ldyBsaWNlbnNlLgoKRGFuaWVsICgzIEphbnVhcnkgMjAwMSkKLSBSZW5hbWVkIFJFQURNRS5saWJjdXJsIHRvIExJQkNVUkwKCi0gQ2hhbmdlZCBoZWFkZXJzIGluIGFsbCBzb3VyY2VzIGZpbGVzIHRvIHRoZSBuZXcgZHVhbCBsaWNlbnNlIGNvbmNlcHQgb2YKICBjdXJsOiB1c2UgdGhlIE1JVC9YIGRlcml2YXRlIGxpY2Vuc2UgKm9yKiBNUEwuIFRoZSBMRUdBTCBmaWxlIHdhcyB1cGRhdGVkCiAgYWNjb3JkaW5nbHkgYW5kIHRoZSBNUEwgMS4xIGFuZCBNSVQvWCBkZXJpdmF0ZSBsaWNlbnNlcyBhcmUgbm93IHBhcnQgb2YgdGhlCiAgcmVsZWFzZSBhcmNoaXZlLgpEYW5pZWwgKDMwIERlY2VtYmVyIDIwMDApCi0gTWFkZSBhbGwgRlRQIGNvbW1hbmRzIGdldCBzZW50IHdpdGggdGhlIHRyYWlsaW5nIENSTEYgaW4gb25lIHNpbmdsZSB3cml0ZSgpCiAgYXMgc3BsaXR0aW5nIHRoZW0gdXAgc2VlbXMgdG8gY29uZnVzZSBhdCBsZWFzdCBzb21lIGZpcmV3YWxscyAoRlctMSBiZWluZwogIG9uZSBtYWpvcikuCgpEYW5pZWwgKDE5IERlY2VtYmVyIDIwMDApCi0gQWRkZWQgZmlsZSBkZXNyY2lwdG9yIGFuZCBGSUxFIGhhbmRsZSBsZWFrIGRldGVjdGlvbiB0byB0aGUgbWVtZGVidWcgc3lzdGVtCiAgYW5kIHRodXMgSSBmb3VuZCBhbmQgcmVtb3ZlZCBhIGZpbGUgZGVzY3JpcHRvciBsZWFrYWdlIGluIHRoZSBmdHAgcGFydHMKICB0aGF0IGhhcHBlbmVkIHdoZW4geW91IGRpZCBQT1JUZWQgZG93bmxvYWRzLgoKLSBBZGRlZCBhbiBpbmNsdWRlIDxzdGRpby5oPiBpbiA8Y3VybC9jdXJsLmg+IHNpbmNlIGl0IHVzZXMgRklMRSAqLgoKRGFuaWVsICgxMiBEZWNlbWJlciAyMDAwKQotIE11bHRpcGxlIFVSTCBkb3dubG9hZHMgd2l0aCAtTyB3YXMgc3RpbGwgYnVnZ2luZy4gTm90IGFueW1vcmUgSSB0aGluayBvcgogIGhvcGUsIG9yIGF0IGxlYXN0IEkndmUgdHJpZWQuLi4gOi1PCgotIEZyYW5jb2lzIFBldGl0amVhbiBmaXhlZCBhbm90aGVyIC1PIHByb2JsZW0KClZlcnNpb24gNy41LjEKCkRhbmllbCAoMTEgRGVjZW1iZXIgMjAwMCkKLSBDbGVhbmVkIHVwIGEgZmV3IG9mIHRoZSBtYWtlZmlsZXMgdG8gdXNlIHVuaXgtc3R5bGUgbmV3bGluZXMgb25seS4gQXMgS2V2aW4KICBQIFJvdGggZm91bmQgb3V0LCBhdCBsZWFzdCBvbmUgQ1ZTIGNsaWVudCBiZWhhdmVkIHdyb25nbHkgd2hlbiBpdCBmb3VuZAogIGRpZmZlcmVudCBuZXdsaW5lIGNvbnZlbnRpb25zIHdpdGhpbiB0aGUgc2FtZSBmaWxlLgoKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIGNvcnJlY3RlZCB0aGUgTERGTEFHUyB1c2UgaW4gdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZm9yCiAgdGhlIFNTTCBzdHVmZi4KCkRhbmllbCAoNiBEZWNlbWJlciAyMDAwKQotIE1hc3NpbW8gU3F1aWxsYWNlIGNvcnJlY3RseSBkZXNjcmliZWQgaG93IGxpYmN1cmwgY291bGQgdXNlIHNlc3Npb24gaWRzIHdoZW4KICBkb2luZyBTU0wgY29ubmVjdGlvbnMuCgotIEphbWVzIEdyaWZmaXRocyBmb3VuZCBvdXQgdGhhdCBjdXJsIHdvdWxkIGNyYXNoIGlmIHRoZSBmaWxlIHlvdSBzcGVjaWZ5IHdpdGgKICAtbyBpcyBzaG9ydGVyIHRoYW4gdGhlIFVSTCEgVGhpcyB0b29rIHNvbWUgaG91cnMgdG8gZnVsbHkgaHVudCBkb3duLCBidXQgaXQKICBpcyBmaXhlZCBub3cuCgpEYW5pZWwgKDUgRGVjZW1iZXIgMjAwMCkKLSBKYWVwaWwgS2ltIHNlbnQgdXMgbWFrZWZpbGVzIHRoYXQgYnVpbGQgY3VybCB1c2luZyB0aGUgZnJlZSB3aW5kb3dzIGJvcmxhbmQKICBjb21waWxlci4gVGhlIHJvb3QgbWFrZWZpbGUgbm93IGFjY2VwdHMgJ21ha2UgYm9ybGFuZCcgdG8gYnVpbGQgY3VybCB3aXRoCiAgdGhhdCBjb21waWxlci4KCi0gU3RlZmFuIFJhZG1hbiBwb2ludGVkIG91dCB0aGF0IHRoZSB0ZXN0IG1ha2VmaWxlcyBkaWRuJ3QgdXNlIHRoZSBQRVJMCiAgdmFyaWFibGUgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdHMgZmlndXJlIG91dC4gQWN0dWFsbHksIHlvdSBzdGlsbCBuZWVkCiAgcGVybCBpbiB0aGUgcGF0aCBmb3IgdGhlIHRlc3Qgc3VpdGUgdG8gcnVuIG9rLgoKLSBSaWNoIEdyYXkgZm91bmQgbnVtZXJvdXMgcG9ydGFiaWxpdHkgcHJvYmxlbXM6CiAgKiBUaGUgU0NPIGNvbXBpbGVyIGdvdCBhbiBlcnJvciBvbiB0aGUgZ2V0cGFzc19yKCkgcHJvdG90eXBlIGluIGdldHBhc3MuaAogICAgc2luY2UgdGhlIGN1cmwgb25lIGRpZmZlcmVkIGZyb20gdGhlIFNDTyBvbmUKICAqIFRoZSBIUFVYIGNvbXBpbGVyIGdvdCBhbiBlcnJvciBiZWNhdXNlIG9mIGhvdyBjdXJsIGRpZCB0aGUgc2lnYWN0aW9uCiAgICBzdHVmZiBhbmQgdXNlZCBhIGRlZmluZSBIUFVYIGRvZXNuJ3QgaGF2ZSAob3IgbmVlZCkuCiAgKiBBIGZldyBtb3JlIHByb2JsZW1zIHJlbWFpbiB0byBiZSByZXNlYXJjaGVkLgoKLSBQYXVsIEhhcnJpbmd0b24gZXhwZXJpZW5jZWQgYSBjb3JlIGR1bXAgdXNpbmcgaHR0cHMuIE5vdCBtdWNoIGRldGFpbHMgeWV0LgoKRGFuaWVsICg0IERlY2VtYmVyIDIwMDApCi0gSvZybiBIYXJ0cm90aCBmaXhlZCBhIHByb2JsZW0gd2l0aCBtdWx0aXBsZSBVUkxzIGFuZCAtby8tTy4KClZlcnNpb24gNy41CgpEYW5pZWwgKDEgRGVjZW1iZXIgMjAwMCkKLSBDcmFpZyBEYXZpc29uIGdhdmUgdXMgaGlzIHVwZGF0ZXMgb24gdGhlIFZDKysgbWFrZWZpbGVzLCBzbyBub3cgY3VybCBzaG91bGQKICBidWlsZCBmaW5lIHdpdGggdGhlIE1pY3Jvc29mdCBjb21waWxlciBvbiB3aW5kb3dzIHRvby4KCi0gRml4ZWQgdGhlIGxpYmN1cmwgdmVyc2lvbmluZyBzbyB0aGF0IHdlIGRvbid0IHJ1aW4gb2xkIHByb2dyYW1zIHdoZW4KICByZWxlYXNpbmcgbmV3IHNoYXJlZCBsaWJyYXJ5IGludGVyZmFjZXMuCgpEYW5pZWwgKDMwIE5vdmVtYmVyIDIwMDApCi0gUmVuYW1lZCBkb2NzL1JFQURNRS5jdXJsIHRvIGRvY3MvTUFOVUFMIHRvIGJldHRlciByZWZsZWN0IHdoYXQgdGhlIGRvY3VtZW50CiAgYWN0dWFsbHkgY29udGFpbnMuCgpEYW5pZWwgKDI5IE5vdmVtYmVyIDIwMDApCi0gSSByZW1vdmVkIGEgYnVuY2ggb2YgJyNpZiAwJyBzZWN0aW9ucyBmcm9tIHRoZSBjb2RlLiBUaGV5IG9ubHkgbWFrZSB0aGluZ3MKICBoYXJkZXIgdG8gZm9sbG93LiBBZnRlciBhbGwsIHdlIGRvIGhhdmUgYWxsIG9sZGVyIHZlcnNpb25zIGluIHRoZSBDVlMuCgpWZXJzaW9uIDcuNS1wcmU1CgpEYW5pZWwgKDI4IE5vdmVtYmVyIDIwMDApCi0gSSBmaWxsZWQgaW4gbW9yZSBlcnJvciBjb2RlcyBpbiB0aGUgbWFuIHBhZ2UgZXJyb3IgY29kZSBsaXN0IHRoYXQgaGFkIGJlZW4KICBsYWdnaW5nLgoKLSBKYW1lcyBHcmlmZml0aHMgbWFpbGVkIG1lIGEgZmluZSBwYXRjaCB0aGF0IGludHJvZHVjZXMgdGhlIENVUkxPUFRfTUFYUkVESVJTCiAgbGliY3VybCBvcHRpb24uIFdoZW4gdXNlZCwgaXQnbGwgcHJldmVudCBsb2NhdGlvbiBmb2xsb3dpbmcgbW9yZSB0aGFuIHRoZQogIHNldCBudW1iZXIgb2YgdGltZXMuIEl0IGlzIHVzZWZ1bCB0byBicmVhayBvdXQgb2YgZW5kbGVzcyByZWRpcmVjdC1sb29wcy4KCkRhbmllbCAoMjcgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0d28gdGVzdCBjYXNlcyBmb3IgZmlsZTovLy4KCkRhbmllbCAoMjIgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCB0aGUgbGliY3VybCBDVVJMT1BUX0ZJTEVUSU1FIHNldG9wdCwgd2hlbiBzZXQgaXQgdHJpZXMgdG8gZ2V0IHRoZQogIG1vZGlmaWVkIHRpbWUgb2YgdGhlIHJlbW90ZSBkb2N1bWVudC4gVGhpcyBpcyBhIHNwZWNpYWwgb3B0aW9uIHNpbmNlIGl0CiAgaW52b2x2ZXMgYW4gZXh0cmEgc2V0IG9mIGNvbW1hbmRzIG9uIEZUUCBzZXJ2ZXJzLiAoVXNpbmcgdGhlIE1EVE0gY29tbWFuZAogIHdoaWNoIGlzIG5vdCBpbiB0aGUgUkZDOTU5KQoKICBjdXJsX2Vhc3lfZ2V0aW5mbygpIGdvdCBhIGNvcnJlc3BvbmRpbmcgQ1VSTElORk9fRklMRVRJTUUgdG8gZ2V0IHRoZSB0aW1lCiAgYWZ0ZXIgYSB0cmFuc2Zlci4gSXQnbGwgcmV0dXJuIGEgemVybyBpZiBDVVJMT1BUX0ZJTEVUSU1FIHdhc24ndCB1c2VkIG9yIGlmCiAgdGhlIHRpbWUgd2Fzbid0IHBvc3NpYmxlIHRvIGdldC4KCiAgLS1oZWFkLy1JIHVzZWQgb24gYSBGVFAgc2VydmVyIHdpbGwgbm93IHByZXNlbnQgYSAnTGFzdC1Nb2RpZmllZDonIGhlYWRlcgogIGlmIGN1cmwgY291bGQgZ2V0IHRoZSB0aW1lIG9mIHRoZSBzcGVjaWZpZWQgZmlsZS4KCi0gQWRkZWQgdGhlIG9wdGlvbiAnLS1jYWNlcnQgW2ZpbGVdJyB0byBjdXJsLCB3aGljaCBhbGxvd3MgYSBzcGVjaWZpZWQgUEVNCiAgZmlsZSB0byBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgcGVlcidzIGNlcnRpZmljYXRlIHdoZW4gZG9pbmcgSFRUUFMKICBjb25uZWN0aW9ucy4gVGhpcyBoYXMgYmVlbiByZXF1ZXN0ZWQsIHJhdGhlciByZWNlbnRseSBieSBIdWxrYSBCb2h1c2xhdiBidXQKICBvdGhlcnMgaGF2ZSBhc2tlZCBmb3IgaXQgYmVmb3JlIGFzIHdlbGwuCgpEYW5pZWwgKDIxIE5vdmVtYmVyIDIwMDApCi0gTnVtZXJvdXMgZml4ZXMgdGhlIHRlc3Qgc3VpdGUgaGFzIGJyb3VnaHQgaW50byB0aGUgZGF5bGlnaHQ6CgogICAqIGN1cmxfdW5lc2NhcGUoKSBjb3VsZCByZXR1cm4gYSB0b28gbG9uZyBzdHJpbmcKICAgKiBvbiBmdHAgdHJhbnNmZXIgZmFpbHVyZXMsIHRoZXJlIGNvdWxkIGJlIG1lbW9yeSBsZWFrcwogICAqIGZ0cCBDV0QgY291bGQgdXNlIGJhZCBkaXJlY3RvcnkgbmFtZXMKICAgKiBtZW1kZWJ1ZyBub3cgdXNlcyB0aGUgbXByaW50ZigpIHJvdXRpbmVzIGZvciBiZXR0ZXIgcG9ydGFiaWxpdHkKICAgKiBmcmVlKE5VTEwpIHJlbW92ZWQgd2hlbiBkb2luZyByZXN1bWVkIHRyYW5zZmVycwoKLSBBZGRlZCBhIGJ1bmNoIG9mIHRlc3QgY2FzZXMgZm9yIEZUUC4KCi0gR2VuZXJhbCBjbGVhbnVwcyB0byBtYWtlIGxlc3Mgd2FybmluZ3Mgd2l0aCBnY2MgLVdhbGwgLXBlZGFudGljLgoKLSBJIG1hZGUgdGhlIHRlc3RzL2Z0cHNlcnZlci5wbCB3b3JrIHdpdGggdGhlIG1vc3QgY29tbW9ubHkgdXNlZCBmdHAKICBvcGVyYXRpb25zLiBQT1JULCBQQVNWLCBSRVRSLCBTVE9SLCBMSVNULCBTSVpFLCBVU0VSLCBQQVNTIGFsbCB3b3JrIG5vdy4gTm93CiAgYWxsIEkgaGF2ZSB0byBkbyBpcyBpbnRlZ3JhdGUgdGhlIGZ0cCBzZXJ2ZXIgZG9pbmdzIGluIHRoZSBydW50ZXN0cy5wbAogIHNjcmlwdCBzbyB0aGF0IGZ0cCB0ZXN0cyBjYW4gYmUgcnVuIHRoZSBzYW1lIHdheSBodHRwIHRlc3RzIGFscmVhZHkgcnVuLgoKRGFuaWVsICgyMCBOb3ZlbWJlciAyMDAwKQotIE1hZGUgbGliY3VybCBjYXBhYmxlIG9mIGRlYWxpbmcgd2l0aCBhbnktbGVuZ3RoIFVSTHMuIFRoZSBmb3JtZXIgbGltaXQgb2YKICA0MDk2IGJ5dGVzIHdhcyBhIGJpdCBhbm5veWluZyB3aGVuIHBlb3BsZSB3YW50ZWQgdG8gdXNlIGN1cmwgdG8gcmVhbGx5IG1ha2UKICBsaWZlIHRvdWdoIG9uIGEgd2ViIHNlcnZlci4gTm93LCB0aGUgY29tbWFuZCBsaW5lIGxpbWl0IGlzIHRoZSBtb3N0IGFubm95aW5nCiAgYnV0IHRoYXQgY2FuIGJlIGNpcmN1bXZlbnRlZCBieSB1c2luZyBhIGNvbmZpZyBmaWxlLgoKICBOT1RFOiB0aGVyZSBpcyBzdGlsbCBhIDQwOTYtYnl0ZSBsaW1pdCBvbiBVUkxzIGV4dHJhY3RlZCBmcm9tIExvY2F0aW9uOgogIGhlYWRlcnMuCgotIENvcnJlY3RlZCB0aGUgc3BlbGxpbmcgb2YgJ3Jlc29sdmUnIGluIHR3byBlcnJvciBtZXNzYWdlcy4KCi0gQWxleGFuZGVyIEtvdXJha29zIHBvc3RlZCBhIGJ1ZyByZXBvcnQgYW5kIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgaXQhIEl0CiAgdHVybmVkIG91dCB0aGF0IGx5bnggYW5kIHdnZXQgc3VwcG9ydCBsb3dlcmNhc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgbmFtZXMKICB3aGVyZSBjdXJsIG9ubHkgbG9va2VkIGZvciB0aGUgdXBwZXJjYXNlIHZlcnNpb25zLiBOb3cgY3VybCB3aWxsIHVzZSB0aGUKICBsb3dlcmNhc2UgdmVyc2lvbnMgaWYgdGhleSBleGlzdCwgYnV0IGlmIHRoZXkgZG9uJ3QsIGl0J2xsIHVzZSB0aGUgdXBwZXJjYXNlCiAgdmVyc2lvbnMuCgpEYW5pZWwgKDE3IE5vdmVtYmVyIDIwMDApCi0gY3VybF9mb3JtZnJlZSgpIHdhcyBhZGRlZC4gSG93IGNvbWUgbm8gb25lIG1pc3NlZCB0aGF0IG9uZSBiZWZvcmU/IEkgcmFuIHRoZQogIHRlc3Qgc3VpdGUgd2l0aCB0aGUgbWFsbG9jIGRlYnVnIGVuYWJsZWQgYW5kIGdvdCBsb3RzIG9mICJuaWNlIiB3YXJuaW5ncyBvbgogIG1lbW9yeSBsZWFrcy4gVGhlIG1vc3Qgc2VyaW91cyBvbmUgd2FzIHRoaXMuIFRoZXJlIHdlcmUgYWxzbyBsZWFrcyBpbiB0aGUKICBjb29raWUgaGFuZGxpbmcsIGFuZCBhIGZldyBlcnJvcnMgd2hlbiBjdXJsIGZhaWxlZCB0byBjb25uZWN0IGFuZCBzaW1pbGFyCiAgdGhpbmdzLiBNb3JlIHRlc3RzIGNhc2VzIHdlcmUgYWRkZWQgdG8gY292ZXIgdXAgYW5kIHRvIHZlcmlmeSB0aGF0IHRoZXNlCiAgcHJvYmxlbXMgaGF2ZSBiZWVuIHJlbW92ZWQuCgotIE11Y2hvIHVwZGF0ZWQgY29uZmlnIGZpbGUgcGFyc2VyIChJJ20gZGVhZCB0aXJlZCBvZiBhbGwgdGhlIGJ1ZyByZXBvcnRzIGFuZAogIHdlaXJkIGJlaGF2aW91ciBJIGdldCBvbiB0aGUgZm9ybWVyIG9uZSkuIEl0IHdvcmtzIHNsaWdodGx5IGRpZmZlcmVudGx5IG5vdywKICBhbHRob3VnaCBJIGRvdWJ0IG1hbnkgcGVvcGxlIHdpbGwgbm90aWNlIHRoZSBkaWZmZXJlbmNlcy4gVGhlIG1haW4KICBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgaWYgeW91IHVzZSBvcHRpb25zIHRoYXQgcmVxdWlyZSBwYXJhbWV0ZXJzLCB0aGV5IG11c3QKICBib3RoIGJlIHNwZWNpZmllZCBvbiB0aGUgc2FtZSBsaW5lLiBXaXRoIHRoaXMgbmV3IHBhcnNlciwgeW91IGNhbiBhbHNvCiAgc3BlY2lmeSBsb25nIG9wdGlvbnMgd2l0aG91dCAnLS0nIGFuZCB5b3UgbWF5IHNlcGFyYXRlIG9wdGlvbnMgYW5kCiAgcGFyYW1ldGVycyB3aXRoIDogb3IgPS4gSXQgbWFrZXMgYSBjb25maWcgZmlsZSBsaW5lIGNvdWxkIGxvb2sgbGlrZToKCiAgICAgICAgdXNlci1hZ2VudCA9ICJmb29iYXIgYW5kIHNvbWV0aGluZyIKCiAgUGFyYW1ldGVycyB3aXRoaW4gcXVvdGVzIG1heSBjb250YWluIHNwYWNlcy4gV2l0aG91dCBxdW90ZXMsIHRoZXkncmUKICBleHBlY3RlZCB0byBiZSBhIHNpbmdsZSBub24tc3BhY2Ugd29yZC4KCiAgSGFkIHRvIHBhdGNoIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcGFyc2VyIGEgbGl0dGxlIHRvIG1ha2UgdGhpcyB3b3JrLgoKLSBBZGRlZCAtLXVybCBhcyBhbiBvcHRpb24gdG8gYWxsb3cgdGhlIFVSTCB0byBiZSBzcGVjaWZpZWQgdGhpcyB3YXkuIEl0IG1ha2VzCiAgd2F5IG5pY2VyIGNvbmZpZyBmaWxlcy4gVGhlIHByZXZpb3VzIHdheSBvZiBzcGVjaWZ5aW5nIFVSTHMgaW4gdGhlIGNvbmZpZwogIGZpbGUgZG9lc24ndCB3b3JrIGFueW1vcmUuCgpEYW5pZWwgKDE1IE5vdmVtYmVyIDIwMDApCi0gVXNpbmcgY2VydGFpbiBjaGFyYWN0ZXJzIGluIHVzZXJuYW1lcyBvciBwYXNzd29yZHMgZm9yIEhUVFAgYXV0aGVudGljYXRpb24KICBmYWlsZWQuIFRoaXMgd2FzIGR1ZSB0byB0aGUgbXByaW50ZigpIHRoYXQgaGFkIGEgc2lsbHkgY2hlY2sgZm9yIGxldHRlcnMsCiAgYW5kIGlmIHRoZXkgd2VyZW4ndCBpc3ByaW50KCkgdGhleSB3ZXJlbid0IG91dHB1dGVkICJhcy1pcyIuIFRoaXMgY2F1c2VkCiAgcGFzc3dvcmRzIGFuZCB1c2VybmFtZXMgdXNpbmcgJ6cnIChmb3IgZXhhbXBsZSkgdG8gZmFpbC4KClZlcnNpb24gNy40LjIKCkRhbmllbCAoMTUgTm92ZW1iZXIgMjAwMCkKLSAndGVzdHMvcnVudGVzdHMucGwnIG5vdyBzb3J0cyB0aGUgdGVzdCBjYXNlcyBwcm9wZXJseSB3aGVuICdhbGwnIGlzIHVzZWQuCgpEYW5pZWwgKDE0IE5vdmVtYmVyIDIwMDApCi0gSSBmZWxsIG92ZXIgdGhlIGRyYWZ0LWlldGYtZnRwZXh0LW1sc3QtMTIudHh0IEludGVybmV0IERyYWZ0IHRpdGxlZAogICJFeHRlbnNpb25zIHRvIEZUUCIgdGhhdCBjb250YWlucyBhIGRlZmluZWQgd2F5IGhvdyB0aGUgZnRwIGNvbW1hbmQgU0laRQogIGNvdWxkIGJlIGFzc3VtZWQgdG8gd29yay4KCi0gTGF1cmVudCBQYXBpZXIgcG9zdGVkIGEgYnVnIHJlcG9ydCBhYm91dCB1c2luZyAiLUMgLSIgYW5kIEZUUCB1cGxvYWRpbmcgYQogIGZpbGUgdGhhdCBpc24ndCBwcnNlbnQgb24gdGhlIHNlcnZlci4gVGhlIHNlcnZlciBtaWdodCB0aGVuIHJldHVybiBhIDU1MCBhbmQKICBjdXJsIHdpbGwgZmFpbC4gU2hvdWxkIGl0IGluc3RlYWQgYXMgTGF1cmVudCBQYXBpZXIgc3VnZ2VzdHMsIHN0YXJ0CiAgdXBsb2FkaW5nIGZyb20gdGhlIGJlZ2lubmluZyBhcyBhIG5vcm1hbCB1cGxvYWQ/CgpEYW5pZWwgKDEzIE5vdmVtYmVyIDIwMDApCi0gRml4ZWQgYSBjcmFzaCB3aXRoIHRoZSBmb2xsb3dsb2NhdGlvbiBjb3VudGVyLgoKLSBXaGlsZSB3cml0aW5nIHRlc3QgY2FzZXMgZm9yIHRoZSB0ZXN0IHN1aXRlLCBJIGRpc2NvdmVyZWQgYW4gb2xkIGxpbWl0YXRpb24KICB0aGF0IHByZXZlbnRlZCAtbyBhbmQgLVQgdG8gYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lLiBJIHJlbW92ZWQgdGhpcwogIGltbWVkaWF0ZWx5IGFzIHRoaXMgaGFzIG5vIHJlbGV2YW5jZSBpbiB0aGUgY3VycmVudCBsaWJjdXJsLgogIAotIENocmlzIEZhaGVydHkgZml4ZWQgYSBmcmVlLXR3aWNlIHByb2JsZW0gaW4gbGliL2ZpbGUuYwoKLSBJIGZpeGVkIHRoZSBwZXJsIGh0dHAgc2VydmVyIHByb2JsZW0gaW4gdGhlIHRlc3Qgc3VpdGUuCgpWZXJzaW9uIDcuNC4yIHByZTQKCkRhbmllbCAoMTAgTm92ZW1iZXIgMjAwMCkKLSBJJ3ZlIChmaW5hbGx5KSBzdGFydGVkIHdvcmtpbmcgb24gdGhlIGN1cmwgdGVzdCBzdWl0ZS4gSXQgaXMgaW4gdGhlIG5ldwogIHRlc3RzLyBkaXJlY3RvcnkuIEl0IHJlcXVpcmVzIHNoIGFuZCBwZXJsLiBUaGVyZSdzIGEgVENQIHNlcnZlciBpbiBwZXJsIGFuZAogIG1vc3Qgb2YgdGhlIG90aGVyIHN0dWZmIHJ1bm5pbmcgYSBwcmV0dHkgc2ltcGxlIHNoZWxsIHNjcmlwdC4KCiAgSSd2ZSBvbmx5IG1hZGUgZm91ciB0ZXN0IGNhc2VzIHNvIGZhciwgYnV0IGl0IHByb3ZlcyB0aGUgc3lzdGVtIGNhbiB3b3JrLgoKLSBMYXVyZW50IFBhcGllciBub3RpY2VkIHRoYXQgY3VybCBkaWRuJ3Qgc2V0IFRZUEUgd2hlbiBkb2luZyAtLWhlYWQgY2hlY2tzCiAgZm9yIHNpemVzIG9uIEZUUCBzZXJ2ZXJzLiBTb21lIHNlcnZlcnMgc2VlbSB0byByZXR1cm4gZGlmZmVyZW50IHNpemVzCiAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgQVNDSUkgb3IgQklOQVJZIGlzIHVzZWQhCgotIExhdXJlbnQgUGFwaWVyIGRldGVjdGVkIHRoYXQgaWYgeW91IGFwcGVuZGVkIGEgRlRQIHVwbG9hZCBhbmQgZXZlcnl0aGluZyB3YXMKICBhbHJlYWR5IHVwbG9hZGVkLCBjdXJsIHdvdWxkIGhhbmcuCgotIEFuZ3VzIE1hY2theSdzIGdldHBhc3NfcigpIGluIGxpYi9nZXRwYXNzLmMgaXMgbm93IGNvbXBsaWFudCB3aXRoIHRoZQogIGdldHBhc3NfcigpIGZ1bmN0aW9uIGl0IHNlZW1zIHNvbWUgc3lzdGVtcyBhY3R1YWxseSBoYXZlLgogIAotIFZlbmthdGFyYW1hbmEgTW9ra2FwYXRpIGRldGVjdGVkIGEgYnVnIGluIHRoZSBjb29raWUgcGFyc2VyIGFuZCBjb3JyZWN0ZWQKICBpdC4gIElmIHRoZSBjb29raWUgd2FzIHNldCBmb3IgdGhlIGZ1bGwgaG9zdCBuYW1lIChkb21haW49ZnVsbC5ob3N0LmNvbSksCiAgdGhlIGNvb2tpZSB3YXMgbmV2ZXIgc2VudCBiYWNrIGJlY2F1c2Ugb2YgYSBmYXVsdHkgbGVuZ3RoIGNvbXBhcmlzb24gYmV0d2VlbgogIHRoZSBzZXQgZG9tYWluIGxlbmd0aCBhbmQgdGhlIGN1cnJlbnQgaG9zdCBuYW1lLgoKRGFuaWVsICg5IE5vdmVtYmVyIDIwMDApCi0gQWRkZWQgYSBjb25maWd1cmUgY2hlY2sgZm9yIGdldGhvc3RieW5hbWUgaW4gLWxzb2NrZXQgKE9TLzIgc2VlbXMgdG8gbmVlZAogIGl0KS4gQWRkZWQgYSBjaGVjayBmb3IgUlNBZ2x1ZS9yc2FyZWYgZm9yIHRoZSBjYXNlcyB3aGVyZSBsaWJjcnlwdG8gaXMgZm91bmQKICBidXQgbGlic3NsIGlzbid0LiBJIGhhdmVuJ3QgdmVyaWZpZWQgdGhpcyBmaXggeWV0IHRob3VnaCwgYXMgSSBoYXZlIG5vCiAgc3lzdGVtIHRoYXQgcmVxdWlyZXMgdGhvc2UgbGlicyB0byBidWlsZC4KICAKVmVyc2lvbiA3LjQuMiBwcmUzCgpEYW5pZWwgKDcgTm92ZW1iZXIgMjAwMCkKLSBSZW1vdmVkIHBlcnJvcigpIG91dHB1dHMgZnJvbSBnZXRwYXNzLmMuIEFuZ3VzIE1hY2theSBhbHNvIGFncmVlZCB0byBhCiAgc2xpZ2h0bHkgbW9kaWZpZWQgbGljZW5zZSBvZiB0aGUgZ2V0cGFzcy5jIGZpbGUgYXMgdGhlIHByb3RvdHlwZSB3YXMgY2hhbmdlZC4KCkRhbmllbCAoNiBOb3ZlbWJlciAyMDAwKQotIEFkZGVkIHBvc3NpYmlsaXR5IHRvIHNldCBhIHBhc3N3b3JkIGNhbGxiYWNrIHRvIHVzZSBpbnN0ZWFkIG9mIHRoZSBidWlsdC1pbi4KICBUaGV5J3JlIGNvbnRyb2xlZCB3aXRoIGN1cmxfZWFzeV9zZXRvcHQoKSBvZiBjb3Vyc2UsIHRoZSB0YWdzIGFyZQogIENVUkxPUFRfUEFTU1dERlVOQ1RJT04gYW5kIENVUkxPUFRfUEFTU1dEREFUQS4KCi0gVXNlZCBULiBCaGFyYXRoJ3MgdGhpbmtpbmcgYW5kIGZpeGVkIHRoZSB0aW1lcnMgdGhhdCBzaG93ZWQgdGVycmlibHkgd3JvbmcKICB0aW1lcyB3aGVuIGxvY2F0aW9uOiBoZWFkZXJzIHdlcmUgZm9sbG93ZWQuCgotIEVtbWFudWVsIFR5Y2hvbiBkaXNjb3ZlcmVkIHRoYXQgY3VybCBkaWRuJ3QgcmVhbGx5IGxpa2UgdXNlciBuYW1lcyBvbmx5IGluCiAgdGhlIFVSTC4gSSBjb3JyZWN0ZWQgdGhpcyBhbmQgSSBhbHNvIGZpeGVkIHRoZSBzaW5jZSBsb25nIGxpdmluZyBwcm9ibGVtCiAgd2l0aCBVUkwgZW5jb2RlZCB1c2VyIG5hbWVzIGFuZCBwYXNzd29yZHMgaW4gdGhlIFVSTHMuIFRoZXkgc2hvdWxkIHdvcmsgbm93LgogIApEYW5pZWwgKDIgTm92ZW1iZXIgMjAwMCkKLSBXaGVuIEkgYWRkZWQgLS1pbnRlcmZhY2UsIHRoZSBuZXcgZXJyb3IgY29kZSB0aGF0IHdhcyBhZGRlZCB3aXRoIGl0IHdhcwogIGluc2VydGVkIGluIHRoZSB3cm9uZyBwbGFjZSBhbmQgdGh1cyBhbGwgZXJyb3IgY29kZXMgZnJvbSAzNSBhbmQgdXB3YXJkcyBnb3QKICBpbmNyZWFzZWQgb25lIHN0ZXAuIFRoaXMgaXMgbm93IGNvcnJlY3RlZCwgd2UncmUgYmFjayBhdCB0aGUgcHJldmlvdXMKICBudW1iZXJzLiBBbGwgbmV3IGV4aXQgY29kZXMgc2hvdWxkIGJlIGFkZGVkIGF0IHRoZSBlbmQuCgpEYW5pZWwgKDEgTm92ZW1iZXIgMjAwMCkKLSBBZGRlZCBhIGNoZWNrIGZvciBzaWduYWwoKSBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBzbyB0aGF0IGlmIHNpZ2FjdGlvbigpCiAgaXNuJ3QgcHJlc2VudCwgd2UgY2FuIHVzZSBzaWduYWwoKSBpbnN0ZWFkLgoKLSBJJ20gaGF2aW5nIGEgbGljZW5zZSBkaXNjdXNzaW9uIGdvaW5nIG9uIHByaXZhdGVseS4gVGhlIGlzc3VlIGlzIHlldCBhZ2FpbgogIEdQTC1saWNlbnNlZCBwcm9ncmFtcyB0aGF0IGhhdmUgcHJvYmxlbXMgd2l0aCBNUEwuIEkgYW0gbGVhbmluZyB0b3dhcmRzCiAgbWFraW5nIGEga2luZCBvZiBkdWFsLWxpY2Vuc2UgdGhhdCB3aWxsIHNvbHZlIHRoaXMgb25jZSBhbmQgZm9yIGFsbC4uLgoKRGFuaWVsICgzMSBPY3RvYmVyIDIwMDApCi0gQWRkZWQgdGhlIHBhY2thZ2VzLyBkaXJlY3RvcnkuIEkgaW50ZW5kIHRvIGxldCB0aGlzIGNvbnRhaW4gc29tZSBkb2NzIGFuZAogIHRlbXBsYXRlcyBvbiBob3cgdG8gZ2VuZXJhdGUgY3VzdG9tLWZvcm1hdCBwYWNrYWdlcyBmb3IgdmFyaW91cyBwbGF0Zm9ybXMuCiAgSSd2ZSBub3cgcmVtb3ZlZCB0aGUgUlBNIHJlbGF0ZWQgY3VybC5zcGVjIGZpbGVzIGZyb20gdGhlIGFyY2hpdmUgcm9vdC4KCkRhbmllbCAoMzAgT2N0b2JlciAyMDAwKQotIFQuIEJoYXJhdGggYnJvdWdodCBhIHNldCBvZiBwYXRjaGVzIHRoYXQgYnJpbmcgbmV3IGZ1bmN0aW9uYWxpdHkgdG8KICBjdXJsX2Vhc3lfZ2V0aW5mbygpIGFuZCBjdXJsX2Vhc3lfc2V0b3B0KCkuIE5vdyB5b3UgY2FuIHJlcXVlc3QgcGVlcgogIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiB3aXRoIHRoZSAqc2V0b3B0KCkgQ1VSTE9QVF9TU0xfVkVSSUZZUEVFUiBvcHRpb24KICBhbmQgdGhlbiB1c2UgdGhlIENVUkxPUFRfQ0FJTkZPIHRvIHNldCB0aGUgY2VydGlmaWNhdGUgdG8gdmVyaWZ5IHRoZSByZW1vdGUKICBwZWVyIGFnYWluc3QuIEFmdGVyIGFuIHN1Y2ggYW4gb3BlcmF0aW9uIHdpdGggYSB2ZXJpZmljYXRpb24gcmVxdWVzdCwgdGhlCiAgKl9nZXRpbmZvKCkgb3B0aW9uIENVUkxJTkZPX1NTTF9WRVJJRllSRVNVTFQgd2lsbCByZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQKICB3aGV0aGVyIHRoZSB2ZXJpZmljYXRpb24gc3VjY2VlZGVkIG9yIG5vdC4gIAoKRGFuaWVsICgyNyBPY3RvYmVyIDIwMDApCi0gR2VvcmcgSG9ybiBicm91Z2h0IHVzIGEgc3BsZW5kaWQgcGF0Y2ggdGhhdCBzb2x2ZXMgdGhlIGxvbmctc3RhbmRpbmcKICBhbm5veWluZyBwcm9ibGVtIHdpdGggdGltZW91dHMgdGhhdCBtYWRlIGN1cmwgZXhpdCB3aXRoIHNpbGx5IGV4aXQgY29kZXMKICAod2hpY2ggYXMgYmVlbiBjb21tZW50ZWQgb3V0IGxhdGVseSkuIFRoaXMgc29sdXRpb24gaXMgc2lnYWN0aW9uKCkgYmFzZWQgYW5kCiAgb2YgY291cnNlIHRoZW4gb25seSB3b3JrcyBmb3IgdW5peGVzIChhbmQgb25seSB0aG9zZSB1bml4ZXMgdGhhdCBhY3R1YWxseQogIGhhdmUgdGhlIHNpZ2FjdGlvbigpIGZ1bmN0aW9uKS4KCkRhbmllbCAoMjYgT2N0b2JlciAyMDAwKQotIEJq9nJuIFN0ZW5iZXJnIHN1cHBsaWVkIGEgcGF0Y2ggdGhhdCBmaXhlZCB0aGUgZmxhdyBtZW50aW9uZWQgYnkgS2V2aW4gUm90aAogIHRoYXQgbWFkZSB0aGUgcGFzc3dvcmQgZ2V0IGVjaG9lZCB3aGVuIHByb21wdGVkIGZvciBpbnRlcmFjdGl2ZWx5LiBUaGUKICBnZXRwYXNzKCkgZnVuY3Rpb24gKG5vdyBrbm93biBhcyBteV9nZXRwYXNzKCkpIHdhcyBhbHNvIGZpeGVkIHRvIG5vdCB1c2UgYW55CiAgc3RhdGljIGJ1ZmZlcnMuIFRoaXMgYWxzbyBtZWFucyB3ZSBjYW5ub3QgdXNlIHRoZSAic3RhbmRhcmQiIGdldHBhc3MoKQogIGZ1bmN0aW9uIGV2ZW4gZm9yIHRob3NlIHN5c3RlbXMgdGhhdCBoYXZlIGl0LCBzaW5jZSBpdCBpc24ndCB0aHJlYWQtc2FmZS4KICAKLSBLZXZpbiBSb3RoIGZvdW5kIG91dCB0aGF0IGlmIHlvdSdkIHdyaXRlIGEgY29uZmlnIGZpbGUgd2l0aCAnLXYgdXJsJywgdGhlCiAgdXJsIHdvdWxkIG5vdCBiZSB1c2VkIGFzICJkZWZhdWx0IFVSTCIgYXMgZG9jdW1lbnRlZCwgYWx0aG91Z2ggaWYgeW91IHdyb3RlCiAgaXQgJ3VybCAtdicgaXQgd29ya2VkISBUaGlzIGhhcyBiZWVuIGNvcnJlY3RlZCBub3cuCgotIEtldmluIFJvdGgncyBpZGVhIG9mIHVzaW5nIG11bHRpcGxlIC1kIG9wdGlvbnMgb24gdGhlIHNhbWUgY29tbWFuZCBsaW5lIHdhcwogIGp1c3QgYnJpbGxpYW50LCBhbmQgSSBjb3VsZG4ndCByZWFsbHkgdGhpbmsgb2YgYW55IHJlYXNvbiB3aHkgd2Ugc2hvdWxkbid0CiAgc3VwcG9ydCBpdCEgVGhlIGFwcGVuZCBmdW5jdGlvbiBhbHdheXMgYXBwZW5kICcmJyBhbmQgdGhlbiB0aGUgbmV3IC1kCiAgY2h1bmsuIFRoaXMgZW5hYmxlcyBjb25zdHJ1Y3RzIGxpa2UgdGhlIGZvbGxvd2luZzoKCiAgICAgICAgY3VybCAtZCBuYW1lPWRhbmllbCAtZCBhZ2U9dW5rbm93biBmb29iYXJzaXRlLmNvbQoKRGFuaWVsICgyNCBPY3RvYmVyIDIwMDApCi0gSSBmaXhlZCB0aGUgbGliL21lbWRlYnVnLmMgc291cmNlIHNvIHRoYXQgaXQgY29tcGlsZXMgb24gTGludXggYW5kIG90aGVyCiAgc3lzdGVtcy4gSXQgd2lsbCBiZSB1c2VmdWwgb25lIGRheSB3aGVuIHNvbWVvbmUgZWxzZSBidXQgbWUgd2FudHMgdG8gcnVuIHRoZQogIG1lbW9yeSBkZWJ1Z2dpbmcgc3lzdGVtLgoKRGFuaWVsICgyMyBPY3RvYmVyIDIwMDApCi0gSSBtb2RpZmllZCB0aGUgbWFrZXRneiBhbmQgY29uZmlndXJlIHNjcmlwdHMsIHNvIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQKICB3aWxsIGZldGNoIHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIHRoZSBpbmNsdWRlL2N1cmwvY3VybC5oIGhlYWRlciBmaWxlcywgYW5kCiAgdGhlbiB0aGUgbWFrZXRneiBkb2Vzbid0IGhhdmUgdG8gcmVidWlsZCB0aGUgY29uZmlndXJlIHNjcmlwdCB3aGVuIEkgYnVpbGQKICByZWxlYXNlLWFyY2hpdmVzLgoKLSBCavZybiBTdGVuYmVyZyBhbmQgTGludXMgTmllbHNlbiBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIHdhcyBzaWxseQogIGVub3VnaCB0byBub3QgYWxsb3cgQC1sZXR0ZXJzIGluIHBhc3N3b3JkcyB3aGVuIHRoZXkgd2VyZSBzcGVjaWZpZWQgd2l0aCB0aGUKICAtdSBvciAtVSBmbGFncyAoQ1VSTE9QVF9VU0VSUFdEIGFuZCBDVVJMT1BUX1BST1hZVVNFUlBXRCkuIFRoaXMgYWxzbwogIHN1Z2dlc3RzIHRoYXQgY3VybCBwcm9iYWJseSBzaG91bGQgdXJsLWRlY29kZSB0aGUgcGFzc3dvcmQgcGllY2Ugb2YgYW4gVVJMCiAgc28gdGhhdCB5b3UgY291bGQgcGFzcyBhbiBlbmNvZGVkIEAtbGV0dGVyIHRoZXJlLi4uCiAgCkRhbmllbCAoMjAgT2N0b2JlciAyMDAwKQotIFlldCBhbm90aGVyIGh0dHAgc2VydmVyIGJhcmZlZCBvbiBjdXJsJ3MgcmVxdWVzdCB0aGF0IGluY2x1ZGUgdGhlIHBvcnQKICBudW1iZXIgaW4gdGhlIEhvc3Q6IGhlYWRlciBhbHdheXMuIEkgbm93IG9ubHkgaW5jbHVkZSB0aGUgcG9ydCBudW1iZXIgaWYgaXQKICBpc24ndCB0aGUgZGVmYXVsdCAoODAgZm9yIEhUVFAsIDQ0MyBmb3IgSFRUUFMpLiB3d3cucGVybC5jb20gdHVybmVkIG91dCB0bwogIHJ1biBvbmUgb2YgdGhvc2UgbmFzdHkgc2VydmVycy4KCi0gVGhlIFBIUDQgbW9kdWxlIGZvciBjdXJsIGhhZCBwcm9ibGVtcyB3aXRoIHJlZmVyZXIgdGhhdCBzZWVtcyB0byBoYXZlIGJlZW4KICBjb3JyZWN0ZWQganVzdCB5ZXN0ZXJkYXkuIChTdGVybGluZyBIdWdoZXMgb2YgdGhlIFBIUCB0ZWFtIGNvbmZpcm1lZCB0aGlzKQoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDApCi0gVmxhZGltaXIgT2Jsb21vdiByZXBvcnRlZCB0aGF0IHRoZSAtWSBhbmQgLXkgb3B0aW9ucyBkaWRuJ3Qgd29yay4gVGhleQogIGRpZG4ndCB3b3JrIGZvciBtZSBlaXRoZXIuIFRoaXMgb25jZSBhZ2FpbiBwcm92ZXMgd2Ugc2hvdWxkIGhhdmUgdGhhdCB0ZXN0CiAgc3VpdGUuLi4KICAKLSBJIGZpbmFsbHkgY2hhbmdlZCB0aGUgZXJyb3IgbWVzc2FnZSBsaWJjdXJsIHJldHVybnMgaWYgeW91IHRyeSBhIGh0dHBzOi8vCiAgVVJMIHdoZW4gdGhlIGxpYnJhcnkgd2Fzbid0IGJ1aWxkIHdpdGggU1NMIGVuYWJsZWQuIEl0IHdpbGwgbm93IHJldHVybiB0aGlzCiAgZXJyb3I6CiAgICAgICAgImxpYmN1cmwgd2FzIGJ1aWx0IHdpdGggU1NMIGRpc2FibGVkLCBodHRwczogbm90IHN1cHBvcnRlZCEiCgogIEkgcmVhbGx5IGhvcGUgaXQgd2lsbCBtYWtlIGl0IGEgYml0IGNsZWFyZXIgdG8gdXNlcnMgd2hlcmUgdGhlIGFjdHVhbAogIHByb2JsZW0gbGllcy4KClZlcnNpb24gNy40LjEKCkRhbmllbCAoMTYgT2N0b2JlciAyMDAwKQotIEkgZm9yZ290IHRvIHJlbW92ZSBzb21lIG9mIHRoZSBtYWxsb2MgZGVidWcgZGVmaW5lcyBmcm9tIHRoZSBtYWtlZmlsZXMgaW4KICB0aGUgcmVsZWFzZSBhcmNoaXZlIChvZiBjb3Vyc2UpLgoKVmVyc2lvbiA3LjQKCkRhbmllbCAoMTYgT2N0b2JlciAyMDAwKQotIFRoZSBidWZmZXIgb3ZlcmZsb3cgbWVudGlvbmVkIGJlbG93IHdhcyBwb3N0ZWQgdG8gYnVndHJhcSBvbiBGcmlkYXkgMTN0aC4KCkRhbmllbCAoMTIgT2N0b2JlciAyMDAwKQotIENvbGluIFJvYmVydCBQaGlwcHMgZWxlZ2FudGx5IGNvcnJlY3RlZCBhIGJ1ZmZlciBvdmVyZmxvdy4gSXQgY291bGQgYmUgdXNlZAogIGJ5IGFuIGV2aWwgZnRwIHNlcnZlciB0byBjcmFzaCBjdXJsLiBJIHRvb2sgdGhlIG9wcG9ydHVuaXR5IG9mIHJlcGxhY2luZyBhCiAgZmV3IG90aGVyIHNwcmludGYoKXMgaW50byBzbnByaW50ZigpcyBhcyB3ZWxsLgoKRGFuaWVsICgxMSBPY3RvYmVyIDIwMDApCi0gRm91bmQgc29tZSBtb3JlIG1lbW9yeSBsZWFrcy4gVGhpcyBuZXcgc2ltcGxlIG1lbW9yeSBkZWJ1Z2dlciBoYXMgdHVybmVkIG91dAogIHJlYWxseSB1c2VmdWwhCgpWZXJzaW9uIDcuNCBwcmU2CgpEYW5pZWwgKDkgT2N0b2JlciAyMDAwKQotIEZsb3JpYW4gS29lbmlnIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGJvb2wgdHlwZWRlZiBpbiB0aGUgY3VybC9jdXJsLmggaW5jbHVkZQogIGZpbGUgd2FzIGJyZWFraW5nIFBIUCA0LjAuMyBjb21waWxpbmcuIFRoZSBib29sIHR5cGVkZWYgaXMgbm90IHVzZWQgaW4gdGhlCiAgcHVibGljIGludGVyZmFjZSBhbmQgd2FzIHdyb25nbHkgaW5zZXJ0ZWQgaW4gdGhhdCBoZWFkZXIgZmlsZS4KCi0gSvZyZyBIYXJ0cm90aCBjb3JyZWN0ZWQgYSBtaW5vciBtZW1vcnkgbGVhayBpbiB0aGUgc3JjL3VybGdsb2IuYyBzdHVmZi4gSXQKICBkaWRuJ3QgaGFybSBhbnlvbmUgc2luY2UgdGhlIG1lbW9yeSBpcyBmcmVlKCllZCBvbiBleGl0IGFueXdheS4KCi0gQ29ycmVjdGVkIHRoZSBzcmMvbWFpbi5jLiBXZSB1c2UgdGhlIF9NUFJJTlRGX1JFUExBQ0UgI2RlZmluZSB0byB1c2Ugb3VyCiAgbGliY3VybC1wcmludGYoKSBmdW5jdGlvbnMuIFRoaXMgZ2l2ZXMgdXMgc25wcmludGYoKSBldCBhbCBvbiBhbGwKICBwbGF0Zm9ybXMuIEkgY29udmVydGVkIHRoZSBhbGxvY2F0ZWQgdXNlcmFnZW50IHN0cmluZyB0byBvbmUgdGhhdCB1c2VzIGEKICBsb2NhbCBidWZmZXIuCgotIEkndmUgc2V0IGFuICNpZiAwIHNlY3Rpb24gYXJvdW5kIHRoZSBDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIGhlYWRlcgogIGdlbmVyYXRlZCBpbiBsaWIvZm9ybWRhdGEuYy4gVGhpcyB3aWxsIGhvcGVmdWxseSBtYWtlIGN1cmwgZG8gbW9yZQogIFBIUC1mcmllbmRseSBtdWx0aS1wYXJ0IHBvc3RzLgoKVmVyc2lvbiA3LjQgcHJlNQoKRGFuaWVsICg5IE9jdG9iZXIgMjAwMCkKLSBOaWNvIEJhZ2d1cyBmb3VuZCBvdXQgdGhhdCBjdXJsJ3MgYWJpbGl0eSB0byBmb3JjZSBhIEFTQ0lJIGRvd25sb2FkIHdoZW4KICB1c2luZyBGVFAgd2FzIG5vIGxvbmdlciB3b3JraW5nISBJIGNvcnJlY3RlZCB0aGlzLiBUaGlzIHByb2JsZW0gd2FzIHByb2JhYmx5CiAgaW50cm9kdWNlZCB3aGVuIEkgcmVkZXNpZ25lZCBsaWJjdXJsIGZvciB2ZXJzaW9uIDcuCgotIEdlb3JnIEhvcm4gcHJvdmlkZWQgYSBzb3VyY2UgZXhhbXBsZSB0aGF0IHByb3ZlZCBhIG1lbW9yeSBsZWFrIGluIGxpYmN1cmwuCiAgSSBhZGRlZCBzaW1wbGUgbWVtb3J5IGRlYnVnZ2luZyBmYWNpbGl0aWVzIGFuZCBub3cgd2UgY2FuIG1ha2UgbGliY3VybCBsb2cKICBhbGwgbWVtb3J5IGZpZGRsaW5nIGZ1bmN0aW9ucy4gQW4gYWRkaXRpb25hbCBwZXJsIHNjcmlwdCBpcyB1c2VkIHRvIGFuYWx5emUKICB0aGUgb3V0cHV0IGxvZ2ZpbGUgYW5kIHRvIG1hdGNoIG1hbGxvYygpcyB3aXRoIGZyZWUoKXMgZXRjLiBUaGUgbWVtb3J5IGxlYWsKICBHZW9yZyBmb3VuZCB0dXJuZWQgb3V0IHRvIGJlIHRoZSBtYWluIGNvb2tpZSBzdHJ1Y3QgdGhhdCBjb29raWVfY2xlYW51cCgpCiAgZGlkbid0IGZyZWUhIFRoZSBwZXJsIHNjcmlwdCBpcyBuYW1lZCBtZW1hbmFseXplLnBsIGFuZCBpdCBpcyBhdmFpbGFibGUgaW4KICB0aGUgQ1ZTIHJlc3Bvc2l0b3J5LCBub3QgaW4gdGhlIHJlbGVhc2UgYXJjaGl2ZS4KCkRhbmllbCAoOCBPY3RvYmVyIDIwMDApCi0gR2VvcmcgSG9ybiBmb3VuZCBhIEdldEhvc3QoKSBwcm9ibGVtLiBJdCB0dXJuZWQgb3V0IGl0IG5ldmVyIGFzc2lnbmVkIHRoZQogIHBvaW50ZXIgaW4gdGhlIHRoaXJkIGFyZ3VtZW50IHByb3Blcmx5ISBUaGlzIGNvdWxkIG1ha2UgYSBjcmFzaCwgb3IgYXQgYmVzdAogIGEgbWVtb3J5IGxlYWshCgpWZXJzaW9uIDcuNCBwcmU0CgpEYW5pZWwgKDYgT2N0b2JlciAyMDAwKQotIElzIHRoZSAtRiBwb3N0IGZvbGxvd2luZyB0aGUgUkZDIDE4Njcgc3BlYz8gV2UgaGFkIHRoaXMgZGljdXNzaW9uIG9uIHRoZQogIG1haWxpbmcgbGlzdCBzaW5jZSBpdCBhcHBlYXJzIGN1cmwgY2FuJ3QgcG9zdCAtRiBmb3JtIHBvc3RzIHRvIGEgUEhQCiAgcmVjZWl2ZXIuLi4gSSd2ZSBiZWVuIGluIHRvdWNoIHdpdGggdGhlIFBIUCBkZXZlbG9wZXJzIGFib3V0IHRoaXMuCgotIERvbWVuaWNvIEFuZHJlb2xpIGZvdW5kIG91dCB0aGF0IHRoZSBsb25nIG9wdGlvbiAnLS1wcm94eScgd2Fzbid0IHdvcmtpbmcKICBhbnltb3JlISBUaGUgb3B0aW9uIHBhcnNlciBnb3QgY29uZnVzZWQgd2hlbiBJIGFkZGVkIHRoZSAtLXByb3h5dHVubmVsIGZvcgogIDcuMy4gVGhpcyB3YXMgaW5kZWVkIGEgdmVyeSBvbGQgZmxhdyB0aGF0IGhhc24ndCB0dXJuZWQgdXAgdW50aWwgbm93Li4uCgotIEr2cm4gSGFydHJvdGggcHJvdmlkZWQgcGF0Y2hlcywgdXBkYXRlZCBtYWtlZmlsZXMgYW5kIHR3byBuZXcgZmlsZXMgZm9yIERMTAogIHN0dWZmIG9uIHdpbjMyLiBIZSBhbHNvIHBvaW50ZWQgb3V0IHRoYXQgbGliIHNvdXJjZSBmaWxlcyB3ZXJlIGNvbXBpbGVkIHdpdGgKICAtSS4uL3NyYyB3aGljaCBpc24ndCBvbmx5IHdyb25nIGJ1dCBwbGFpbiBzdHVwaWQhCgotIFRyb2VscyBXYWxzdGVkIEhhbnNlbiBmaXhlZCBhIHByb2JsZW0gd2l0aCBIVFRQIHJlc3VtZS4gQ3VybCBwcmV2aW91c2x5IHVzZWQKICBhIGxvY2FsIHZhcmlhYmxlIGJhZGx5LCB0aGF0IGNvdWxkIGxlYWQgdG8gY3Jhc2hlcy4KClZlcnNpb24gNy40IHByZTMKCkRhbmllbCAoNCBPY3RvYmVyIDIwMDApCi0gTW9yZSBkb2NzIHdyaXR0ZW4uIFRoZSBjdXJsX2Vhc3lfZ2V0aW5mby4zIG1hbiBwYWdlIGlzIG5vdyBwcmV0dHkgYWNjdXJhdGUsCiAgYXMgaXMgdGhlIC13IHNlY3Rpb24gaW4gY3VybC4xLiBJIGFkZGVkIHR3byBvcHRpb25zIHRvIGVuYWJsZSB0aGUgdXNlciB0bwogIGdldCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVjZWl2ZWQgaGVhZGVycycgc2l6ZSBhbmQgdGhlIHNpemUgb2YgdGhlIEhUVFAKICByZXF1ZXN0LiBULiBCaGFyYXRoIHJlcXVlc3RlZCB0aGVtLgogIApEYW5pZWwgKDMgT2N0b2JlciAyMDAwKQotIENvcnJlY3RlZCBhIHNldmVyIGZyZWUoKSBiZWZvcmUgdXNlIGluIHRoZSBuZXcgYWRkX2J1ZmZlcl9zZW5kKCkhIDstKQoKVmVyc2lvbiA3LjQgcHJlMgoKRGFuaWVsICgzIE9jdG9iZXIgMjAwMCkKLSBKYXNvbiBTLiBQcmllYmUgc2VudCBtZSBwYXRjaGVzIHRoYXQgY2hhbmdlZCB0aGUgd2F5IGN1cmwgaXNzdWVzIEhUVFAKICByZXF1ZXN0cy4gVGhlIGVudGlyZSByZXF1ZXN0IGlzIG5vdyBpc3N1ZWQgaW4gb25lIHNpbmdsZSBzaG90LiBJdCBkaWRuJ3QgZG8KICB0aGlzIHByZXZpb3VzbHksIGFuZCBpdCBoYXMgdHVybmVkIG91dCB0aGF0IHNpbmNlIHRoZSBjb21tb24gYnJvd3NlcnMgZG8gaXQKICB0aGlzIHdheSwgc29tZSBzaXRlcyBoYXZlIHR1cm5lZCBvdXQgdG8gd29yayB3aXRoIGJyb3dzZXJzIGJ1dCBub3Qgd2l0aAogIGN1cmwhIEFsdGhvdWdoIHRoaXMgaXMgbm90IGEgY2xpZW50LXNpZGUgcHJvYmxlbSwgd2Ugd2FudCB0byBiZSBhYmxlIHRvCiAgZnVsbHkgZW11bGF0ZSBicm93c2VycywgYW5kIHRodXMgd2UgaGF2ZSBub3cgYWRqdXN0ZWQgdGhlIG5ldHdvcmtpbmcgbGF5ZXIKICB0byBzbGlnaHRseSBtb3JlIGFwcGVhciBhcyBhIGJyb3dzZXIuIEkgYWRqdXN0ZWQgSmFzb24ncyBwYXRjaCwgdGhlIGZhdWx0cwogIGFyZSBwcm9iYWJseSBtaW5lLgoKRGFuaWVsICgyIE9jdG9iZXIgMjAwMCkKLSBBbnlvbmUgd2hvIGV2ZXIgdXBsb2FkZWQgZGF0YSB3aXRoIGN1cmwgb24gYSBzbG93IGxpbmsgaGFzIG5vdGljZWQgdGhhdCB0aGUKICBwcm9nZXNzIG1ldGVyIGlzIHVwZGF0ZWQgdmVyeSBpbmZyZXF1ZW50bHkuIFRoYXQgaXMgZHVlIHRvIHRoZSBsYXJnZSBidWZmZXIKICBzaXplIGN1cmwgaXMgdXNpbmcuIEl0IHJlYWRzIDUwS2IgYW5kIHNlbmRzIGl0LCB1cGRhdGVzIHRoZSBwcm9ncmVzcyBtZXRlcgogIGFuZCBsb29wcy4gNTBLYiBpcyB2ZXJ5IG11Y2ggb24gYSBzbG93IGxpbmssIGFsdGhvdWdoIGl0IGlzIHByZXR0eSBuZWF0IHRvCiAgdXNlIG9uIGEgZmFzdCBvbmUuCgogIEkndmUgbm93IG1hZGUgYW4gYWRqdXN0bWVudCB0aGF0IG1ha2VzIGN1cmwgdXNlIGEgMktiIGJ1ZmZlciBmb3IgdXBsb2FkcyB0bwogIHN0YXJ0IHdpdGguIElmIGN1cmwncyBhdmVyYWdlIHVwbG9hZCBzcGVlZCBpcyBmYXN0ZXIgdGhhbiBidWZmZXIgc2l6ZSBieXRlcwogIHBlciBzZWNvbmQsIGN1cmwgd2lsbCBpbmNyZWFzZSB0aGUgdXNlZCBidWZmZXIgc2l6ZSB1cCB0byBtYXggNTBLYi4gSXQKICBzaG91bGQgbWFrZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd29yayBiZXR0ZXIuCiAgClZlcnNpb24gNy40IHByZTEKCkRhbmllbCAoMjkgU2VwdGVtYmVyIDIwMDApCi0gUmlwcGVkIG91dCB0aGUgLXcgc3R1ZmYgZnJvbSB0aGUgbGlicmFyeSBhbmQgcHV0IGluIHRoZSBjdXJsIHRvb2wuIEl0IGdldHMKICBhbGwgdGhlIHJlbGV2YW50IGluZm8gZnJvbSB0aGUgbGlicmFyeSB1c2luZyB0aGUgbmV3IGN1cmxfZWFzeV9nZXRpbmZvKCkKICBmdW5jdGlvbi4KCi0gYnJhZCBhdCBvcGVuYnNkLm9yZyBtYWlsZWQgbWUgYSBwYXRjaCB0aGF0IGNvcnJlY3RlZCBteSBrZXJiZXJvcyBtaXN0YWtlIGFuZAogIHJlbW92ZWQgYSBjb21waWxlciB3YXJuaW5nIGZyb20gaG9zdGlwLmMgdGhhdCBPcGVuQlNEIHBlb3BsZSBnZXQuCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAwKQotIE9mIGNvdXJzZSAoSSBzaG91bGQgcHJvYmFibHkgZ2V0IHB1bmlzaGVkIHNvbWVob3cpIEkgZGlkbid0IHByb3Blcmx5IGNvcnJlY3QKICB0aGUgI2luY2x1ZGUgbGluZXMgZm9yIHRoZSBiYXNlNjQgc3R1ZmYgaW4gdGhlIGtlcmJlcm9zIHNvdXJjZXMgaW4gdGhlIGp1c3QKICByZWxlYXNlZCA3LjMgcGFja2FnZS4gVGhleSBzdGlsbCBpbmNsdWRlIHRoZSAqX2tyYi5oIGZpbGVzISBOb3csIHRoZSBlcnJvcgogIGlzIHNvb28gdmVyeSBlYXN5IHRvIHNwb3QgYW5kIGZpeCBzbyBJIHdvbid0IGJvdGhlciB3aXRoIGEgcXVpY2sgYnVnIGZpeAogIHJlbGVhc2UuIEknbGwgcG9zdCBhIHBhdGNoIHdoZW5ldmVyIG9uZSBpcyBuZWVkZWQgaW5zdGVhZC4gSXQnbGwgYmUKICBhdmFpbGFibGUgaW4gdGhlIENWUyBpbiBhIGZldyBtaW51dGVzIGFueXdheS4KClZlcnNpb24gNy4zCgpEYW5pZWwgKDI4IFNlcHRlbWJlciAyMDAwKQotIFJlbW92ZWQgdGhlIGJhc2U2NF9rcmIuW2NoXSBmaWxlcy4gVGhleSd2ZSBub3cgcmVwbGFjZWQgdGhlIGZvcm1lcgogIGJhc2U2NC5bY2hdIGZpbGVzLgoKRGFuaWVsICgyNiBTZXB0ZW1iZXIgMjAwMCkKLSBVcGRhdGVkIHNvbWUgZG9jcy4KCi0gSSBjaGFuZ2VkIHRoZSBPcGVuU1NMIGZpeCB0byB3b3JrIHdpdGggb2xkZXIgdmVyc2lvbnMgYXMgd2VsbC4gVGhlIHBvc3RlZAogIHBhdGNoIHdhcyBvbmx5IHdvcmtpbmcgd2l0aCAwLjkuNiBhbmQgbm8gb2xkZXIgb25lcy4KICAKVmVyc2lvbiA3LjMtcHJlOAoKRGFuaWVsICgyNSBTZXB0ZW1iZXIgMjAwMCkKLSBFcmRtdXQgUGZlaWZlciBpbmZvcm1lZCB1cyB0aGF0IGN1cmwgZGlkbid0IGJ1aWxkIHdpdGggT3BlblNTTCAwLjkuNiBhbmQKICBzaG93ZWQgdXMgd2hhdCBuZWVkZWQgdG8gZ2V0IHBhdGNoZWQgaW4gb3JkZXIgdG8gbWFrZSBpdCBidWlsZCBwcm9wZXJseQogIGFnYWluLgoKLSBEaXJrIEtydXNjaGV3c2tpIGZvdW5kIGEgYnVnIGluIHRoZSBjb29raWUgcGFyc2VyLiBJIG1hZGUgYW4gYWx0ZXJuYXRpdmUKICBhcHByb2FjaCB0byB0aGUgc29sdXRpb24gRGlyayBoaW1zZWxmIHN1Z2dlc3RlZC4gVGhlIGJ1ZyBtYWRlIGEgY29va2llCiAgaGVhZGVyIHRoYXQgZGlkbid0IGVuZCB3aXRoIGEgdHJhaWxpbmcgc2VtaWNvbG9uIHRvIG5vdCBnZXQgcGFyc2VkLgoKLSBJJ3ZlIG1hcmtlZCAtYyBhbmQgLXQgZGVwcmVjYXRlZCBub3cuIElmIHlvdSB1c2UgYW55IG9mIHRoZW0sIGN1cmwgd2lsbCB0ZWxsCiAgeW91IHRvIHVzZSAiLUMgLSIgb3IgIi1UIC0iIGluc3RlYWQuIEkgZG9uJ3QgdGhpbmsgb2NjdXB5aW5nIHR3byBsZXR0ZXJzIGZvcgogIG5lYXJseSBpZGVudGljYWwgZnVuY3Rpb25zIGlzIGdvb2QgdXNlLiBBbHNvLCAtVCAtIGtpbmQgb2YgZm9sbG93cyB0aGUgY3VybAogIHRyYWRpdGlvbiBvZiB1c2luZyAtIGZvciBzdGRpbiB3aGVyZSBhIGZpbGUgbmFtZSBpcyBleHBlY3RlZC4KCkRhbmllbCAoMjMgU2VwdGVtYmVyIDIwMDApCi0gTWFydGluIEhlZGVuZmFsayBwcm92aWRlZCB0aGUgcGF0Y2ggdGhhdCBmaW5hbGx5IG1hZGUgdGhlIGtyYjQgZnRwIHVwbG9hZAogIHdvcmshCgpEYW5pZWwgKDIxIFNlcHRlbWJlciAyMDAwKQotIFRoZSBrZXJiZXJvcyBjb2RlIGlzIG5vdCBxdWl0ZSB0aHJlYWQtc2FmZSB5ZXQuIFRoZXJlIGFyZSBhIGZldyBtb3JlIGdsb2JhbHMKICB0aGF0IG5lZWQgdG8gYmUgdGFrZSBjYXJlIG9mLiBMZXQncyBnZXQgdGhlIHVwbG9hZCB3b3JraW5nIGZpcnN0IQoKRGFuaWVsICgyMCBTZXB0ZW1iZXIgMjAwMCkKLSBSaWNoYXJkIFByZXNjb3R0IHNvbHZlZCBhbm90aGVyIG5hbWUgbG9va3VwIGJ1ZmZlciBzaXplIHByb2JsZW0uIEkgdG9vayB0aGlzCiAgb3Bwb3J0dW5pdHkgdG8gcmV3cml0ZSB0aGUgR2V0SG9zdCgpIGZ1bmN0aW9uLiBXaXRoIHRoZXNlIGxhcmdlIGJ1ZmZlcgogIHNpemVzLCBJIHRoaW5rIGtlZXBpbmcgdGhlbSBhcyBsb2NhbCBhcnJheXMgcXVpY2tseSB0dXJuIHVnbHkuIEkgbm93IHVzZQogIG1hbGxvYygpIHRvIGdldCB0aGUgYnVmZmVyIG1lbW9yeS4gVGhhbmtzIHRvIHRoaXMsIEkgbm93IGNhbiByZWFsbG9jKCkgdG8gYQogIGxhcmdlIGJ1ZmZlciBpbiBjYXNlIG9mIGRlbWFuZCAoZXJybm8gPT0gRVJBTkdFKSBpbiBjYXNlIGEgc29sdXRpb24gbGlrZQogIHRoYXQgd291bGQgYmVjb21lIG5lY2Vzc2FyeS4gSSBzdGlsbCB3YW50IHRvIGF2b2lkIHRoYXQga2luZCBvZiBuYXN0aW5lc3MuCgotIFRyaWVkIHRvIGNvbXBpbGUgYW5kIHJ1biBjdXJsIG9uIExpbnV4IGZvciBhbHBoYSBhbmQgRnJlZUJTRCBmb3IgYWxwaGEuIFdlbnQKICBhcyBzbW9vdGggYXMgaXQgY291bGQuCgotIEFkZGVkIGEgZG9jcy9leGFtcGxlcyBkaXJlY3Rvcnkgd2l0aCB0d28gdGlueSBleGFtcGxlIHNvdXJjZXMgdGhhdCBzaG93IGhvdwogIHRvIHVzZSBsaWJjdXJsLiBJIGhvcGUgdXNlcnMgd2lsbCBzdXBwbHkgbWUgd2l0aCBtb3JlIHVzZWZ1bCBleGFtcGxlcwogIGZ1cnRoZXIgb24uCgotIEFwcGxpZWQgYSBwYXRjaCBieSBK9nJuIEhhcnRyb3RoIHRvIG5vIGxvbmdlciB1c2UgdGhlIHdvcmQgJ2ludGVmYWNlJyBpbiB0aGUKICBjb25maWcgc3RydWN0IGluIHRoZSBzcmMvbWFpbi5jIGZpbGUgc2luY2UgY2VydGFpbiBjb21waWxlcnMgaGF2ZSB0aGF0IHdvcmQKICAicmVzZXJ2ZXJlZCIuICBJIGZpZ3VyZSB0aGF0IGlzIHNvbWUga2luZCBvZiBDKysgZGVjZWFzZS4KCi0gVXBkYXRlZCB0aGUgY3VybC4xIG1hbiBwYWdlIHdpdGggLS1pbnRlcmZhY2UgYW5kIC0ta3JiNC4KCi0gTW9kaWZpZWQgdGhlIGJhc2U2NEVuY29kZSgpIGZ1bmN0aW9uIHRvIHdvcmsgbGlrZSB0aGUga2VyYmVyb3Mgb25lLCBzbyB0aGF0CiAgSSBjb3VsZCByZW1vdmUgdGhlIHVzZSBvZiB0aGF0LiBUaGVyZSBpcyBubyBuZWVkIGZvciAqdHdvKiBiYXNlNjQgZW5jb2RpbmcKICBmdW5jdGlvbnMhIDstKQoKVmVyc2lvbiA3LjNwcmU1CgpEYW5pZWwgKDE5IFNlcHRlbWJlciAyMDAwKQotIFRoZSBrZXJiZXJvczQtbGF5ZXIgc291cmNlIGNvZGUgdGhhdCBpcyBtdWNoICJpbmZsdWVuY2VkIiBieSB0aGUgb3JpZ2luYWwKICBrcmI0IHNvdXJjZSBjb2RlLCB0aHJvdWdoIHlhZmMgaW50byBjdXJsLCB3YXMgdXNpbmcgcXVpdGUgYSBsb3Qgb2YgZ2xvYmFsCiAgdmFyaWFibGVzLiBsaWJjdXJsIGNhbid0IHdvcmsgcHJvcGVybHkgd2l0aCBnbG9iYWxzIGxpa2UgdGhhdCB3aHkgSSBoYWQgdG8KICBjbGVhbiB1cCBhbG1vc3QgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIG5ldyBzZWN1cml0eS5jIHRvIG1ha2UgdGhlbSB1c2UKICBjb25uZWN0aW9uIHNwZWNpZmljIHZhcmlhYmxlcyBpbnN0ZWFkIG9mIHRoZSBnbG9iYWxzLiBJIGp1c3QgaG9wZSBJIGRpZG4ndAogIGRlc3Ryb3kgYW55dGhpbmcgbm93Li4uIDotKSBjb25maWd1cmUgdXBkYXRlZCwgdmVyc2lvbiBzdHJpbmcgbm93IHJlZmxlY3RzCiAga3JiNCBidWlsdC1pbi4gSXQgYWxtb3N0IHdvcmtzIG5vdy4gT25seSB1cGxvYWRzIGFyZSBzdGlsbCBiZWluZyBuYXVnaHR5LgoKVmVyc2lvbiA3LjNwcmUzCgpEYW5pZWwgKDE4IFNlcHRlbWJlciAyMDAwKQotIE1hcnRpbiBIZWRlbmZhbGsgc3VwcGxpZWQgYSBtYWpvciBwYXRjaCB0aGF0IGludHJvZHVjZXMga3JiNC1mdHAgc3VwcG9ydCB0bwogIGN1cmwuIE1hcnRpbiBpcyB0aGUgcHJpbWFyeSBhdXRob3Igb2YgdGhlIGZ0cCBjbGllbnQgbmFtZWQgeWFmYyBhbmQgaGUgZGlkCiAgbm90IGhlc2l0YXRlIHRvIGhlbHAgdXMgaW1wbGVtZW50IHRoaXMgd2hlbiBJIGFza2VkIGhpbS4gTWFueSBhbmQgc2luY2VyZQogIHRoYW5rcyB0byBhIHNwbGVuZGlkIGVmZm9ydC4gSXQgZGlkbid0IGV2ZW4gdGFrZSBtYW55IGhvdXJzIQoKLSBTdGVwaGVuIEtpY2sgc3VwcGxpZWQgYSBiaWcgcGF0Y2ggdGhhdCBpbnRyb2R1Y2VzIHRoZSAtLWludGVyZmFjZSBmbGFnIHRvCiAgdGhlIGN1cmwgdG9vbCBhbmQgQ1VSTE9QVF9JTlRFUkZBQ0UgZm9yIGxpYmN1cmwuIEl0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhbgogIG91dGdvaW5nIGludGVyZmFjZSB0byB1c2UgZm9yIHlvdXIgcmVxdWVzdC4gVGhpcyBtYXkgbm90IHdvcmsgb24gYWxsCiAgcGxhdGZvcm1zLiBUaGlzIG5lZWRzIHRlc3RpbmcuCgotIFJpY2hhcmQgUHJlc2NvdHQgbm90aWNlZCB0aGF0IGN1cmwgb24gVHJ1NjQgdW5peCBjb3VsZCBjb3JlIGR1bXBlZCBpZiB0aGUKICBuYW1lIGRpZG4ndCByZXNvbHZlIHByb3Blcmx5LiBUaGlzIHdhcyBkdWUgdG8gdGhlIEdldEhvc3QoKSBmdW5jdGlvbiBub3QKICByZXR1cm5pbmcgYW4gZXJyb3IgZXZlbiB0aG91Z2ggaXQgZmFpbGVkIG9uIHNvbWUgcGxhdGZvcm1zIQoKRGFuaWVsICgxNSBTZXB0ZW1iZXIgMjAwMCkKLSBVcGRhdGVkIGFsbCBzb3J0cyBvZiBkb2N1bWVudHMgaW4gcmVnYXJkcyB0byB0aGUgbmV3IHByb3h5dHVubmVsIHN1cHBvcnQuCgpWZXJzaW9uIDcuM3ByZTIKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gS2FpLVV3ZSBSb21tZWwgcG9pbnRlZCBvdXQgYSBwcm9ibGVtIGluIHRoZSBodHRwcHJveHl0dW5uZWwgc3R1ZmYgZm9yIGZ0cC4KICBBZGp1c3RlZCBpdC4gQWRkZWQgYmV0dGVyIGluZm8gbWVzc2FnZSB3aGVuIHNldHRpbmcgdXAgdGhlIHR1bm5lbCBhbmQgdGhlCiAgcGFzdiBtZXNzYWdlIHdoZW4gZG9pbmcgdGhlIHNlY29uZCBjb25uZWN0LgogIApWZXJzaW9uIDcuM3ByZTEKCkRhbmllbCAoMTUgU2VwdGVtYmVyIDIwMDApCi0gbGliY3VybCBub3cgYWxsb3dzICJodHRwcHJveHl0dW5uZWwiIHRvIGFuIGFyYml0cmFyeSBob3N0IGFuZCBwb3J0IG5hbWUuIFRoZQogIHNlY29uZCBjb25uZWN0aW9uIG9uIGZ0cCBuZWVkZWQgdGhhdC4KCi0gVGhlQXJ0T2ZIVFRQU2NyaXB0aW5nIHdhcyBjb3JyZWN0ZWQgYWxsIG92ZXIuIEkgYm90aCB0eXBlIGFuZCBzcGVsbCByZWFsbHkKICBiYWQgYXQgdGltZXMhCiAgCkRhbmllbCAoMTQgU2VwdGVtYmVyIDIwMDApCi0gLXAvLS1wcm94eXR1bm5lbCB3YXMgYWRkZWQgdG8gJ2N1cmwnLiBJdCB1c2VzIHRoZSBuZXcKICBDVVJMT1BUX0hUVFBQUk9YWVRVTk5FTCBsaWJjdXJsIG9wdGlvbiB0aGF0IGFsbG93cyAiYW55IiBwcm90b2NvbCB0byB0dW5uZWwKICB0aHJvdWdoIHRoZSBzcGVjaWZpZWQgaHR0cCBwcm94eS4gQXQgdGhlIG1vbWVudCwgdGhpcyBzaG91bGQgd29yayB3aXRoIGZ0cC4KCkRhbmllbCAoMTMgU2VwdGVtYmVyIDIwMDApCi0gSm9jaGVuIFNjaGFldWJsZSBmb3VuZCB0aGF0IGZpbGU6Ly8gZGlkbid0IHdvcmsgYXMgZXhwZWN0ZWQuIENvcnJlY3RlZCB0aGlzCiAgYW5kIG1haWxlZCB0aGUgcGF0Y2ggdG8gdGhlIG1haWxpbmcgbGlzdC4KCkRhbmllbCAoNyBTZXB0ZW1iZXIgMjAwMCkKLSBJIGNoYW5nZWQgdGhlICNkZWZpbmUgVCgpIGluIGN1cmwuaCBzaW5jZSBpdCB0dXJuZWQgb3V0IGl0IHdhc24ndCByZWFsbHkKICBhIGdvb2Qgc3ltYm9sIHRvIHVzZSAod2hlbiB5b3UgY29tcGlsZWQgUEhQIHdpdGggY3VybCBhcyBhIG1vZHVsZSwgdGhhdAogIGRlZmluZSBjb2xsaWRlZCB3aXRoIHNvbWUgSU1BUCBkZWZpbmUgb3Igc29tZXRoaW5nKS4gVGhpcyB3YXMgcG9zdGVkIHRvIHRoZQogIFBIUCBidWcgdHJhY2tlci4KCi0gSSBhZGRlZCBleHRlcm4gIkMiIHN0dWZmIGluIHR3byBoZWFkZXIgZmlsZXMgdG8gYmV0dGVyIGFsbG93IGxpYmN1cmwgdXNhZ2UKICBpbiBDKysgc29yY2VzLiBEaXNjdXNzaW9ucyBvbiB0aGUgbGliY3VybCBsaXN0IHdpdGggRGFubnkgSG9yc3dlbGwgbGVhZCB0bwogIHRoaXMuCgpWZXJzaW9uIDcuMi4xCgpEYW5pZWwgKDMxIEF1Z3VzdCAyMDAwKQotIEFsYmVydCBDaGluLUEtWW91bmcgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgKmFnYWluKiBhbmQgbm93IGl0IHNlZW1zIHRvCiAgZGV0ZWN0IExpbnV4IG5hbWUgcmVzb2x2aW5nIHByb3Blcmx5ISAoaGVhcmQgdGhhdCBiZWZvcmU/KQoKLSBUcm9lbHMgV2Fsc3RlZCBIYW5zZW4gcG9pbnRlZCBvdXQgdGhhdCBkb3dubG9hZGluZyBhIGZpbGUgY29udGFpbmluZyB0aGUKICBsZXR0ZXIgJysnIGZyb20gYW4gZnRwIHNlcnZlciBkaWRuJ3Qgd29yay4gSXQgZGlkIHdvcmsgZnJvbSBIVFRQIHRob3VnaCBhbmQKICB0aGUgcmVhc29uIHdhcyBteSBsYW1lIFVSTCBkZWNvZGVyLgoKLSBJIGhhcHBlbmVkIHRvIG5vdGljZSB0aGF0IC1JIGRpZG4ndCBhdCBhbGwgd29yayBvbiBmdHAgYW55bW9yZS4gSSBjb3JyZWN0ZWQKICB0aGF0LgoKVmVyc2lvbiA3LjIKCkRhbmllbCAoMzAgQXVndXN0IDIwMDApCi0gVW5kZXJzdGFuZGluZyBBSVggaXMgYSBoYXJkIHRhc2suIEkgYmVsaWV2ZSBJJ2xsIG5ldmVyIGZpZ3VyZSBvdXQgd2h5IHRoZXkKICBzb2x2ZSB0aGluZ3Mgc28gZGlmZmVyZW50bHkgZnJvbSB0aGUgb3RoZXIgdW5peGVzLiBOb3csIEknbSBsZWZ0IHdpdGggdGhlCiAgQUlYIDQuMyBydW4tdGltZSB3YXJuaW5ncyBhYm91dCBkdXBsaWNhdGUgc3ltYm9scyB0aGF0IGFjY29yZGluZyB0byB0aGlzCiAgYXJ0aWNsZSAoaHR0cDovL3d3dy5nZW9jcmF3bGVyLmNvbS9hcmNoaXZlcy8zLzQwNS8xOTk5LzkvMC8yNTkzNDI4LykgaXMgYQogIGxpYnRvb2wgZmxhdy4gSSB0cmllZCB0aGUgbWVudGlvbmVkIHBhdGNoLCBhbHRob3VnaCB0aGF0IHN0b3BzIHRoZSBsaW5raW5nCiAgY29tcGxldGVseS4KCiAgU28sIGlmIEkgc2VsZWN0IHRvIGlnbm9yZSB0aGUgbGQgd2FybmluZ3MgdGhlcmUgYXJlIGNvbXBpbGVyIHdhcm5pbmdzIHRoYXQKICBmaWxsIHRoZSBzY3JlZW4gcHJldHR5IGJhZCB3aGVuIGN1cmwgY29tcGlsZXMuIEl0IHR1cm5zIG91dCB0aGF0IGlmIEkgd2FudAogIHRvICcjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+JywgSSBjYW4gZ2V0IHRpZCBvZiB0aGUgd2FybmluZ3MgYnkgaW5jbHVkZSB0aGUKICBmb2xsb3dpbmcgdGhyZWUgaW5jbHVkZSBmaWxlcyBiZWZvcmUgdGhhdCBvbmU6CgogICAgICAgICNpbmNsdWRlIDxuZXQvaWZfZGwuaD4KICAgICAgICAjaW5jbHVkZSA8c3lzL21idWYuaD4KICAgICAgICAjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgoKICBOb3csIGlzIGl0IHJlYWxseSBzYW5lIHRvIGFkZCB0aG9zZSBpbmNsdWRlIGZpbGVzIGJlZm9yZSBhcnBhL2luZXQuaCBpbiBhbGwKICB0aGUgc291cmNlIGZpbGVzIHRoYXQgaW5jbHVkZSBpdD8KCiAgVGhhbmtzIHRvIEFsYmVydCBDaGluLUEtWW91bmcgYXQgdGhld3JpdHRlbndvcmQuY29tIHdobyBnYXZlIG1lIHRoZSBBSVgKICBsb2dpbiB0byB0cnkgZXZlcnl0aGluZyBvbi4KCkRhbmllbCAoMjQgQXVndXN0IDIwMDApCi0gSmFuIFNjaG1pZHQgc3VwcGxpZWQgdXMgYSBuZXcgVkM2IG1ha2VmaWxlIGZvciBXaW5kb3dzIGFzIHRoZSBwcmV2aW91cyBvbmUKICB3YXMgbm90IHVwIHRvIGRhdGUgYnV0IGxhY2tlZCBzZXZlcmFsIG9iamVjdCBmaWxlcy4KCi0gTW9yZSB3b3JrIG9uIHRoZSBuYW1pbmcuCgotIEFsYmVydCBDaGluLUEtWW91bmcgcHJvdmlkZWQgYSBjb25maWd1cmUtY2hlY2sgZm9yIGxhcmdlIGZpbGUgc3VwcG9ydCwgYXMKICBzb21lIHN5c3RlbXMgc2VlbSB0byBuZWVkIHRoYXQgZm9yIHRoZW0gdG8gd29yay4gSGFkIHRvIGNoYW5nZSB0aGUgcG9zaXRpb24KICBmb3IgdGhlIGNvbmZpZy5oIGluY2x1ZGUgZmlsZSBpbiBldmVyeSAuYyBmaWxlIGluIHRoZSBsaWJjdXJsIGRpci4uLgoKLSBBcyBzdWdnZXN0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCAoYnkgVHJveSBFbmdlbCksIEkgZGlkIHVzZSBhIC0tZGF0YS1iaW5hcnkKICBvcHRpb24gaW5zdGVhZCBvZiB0aGUgbWVzc3kgd2F5IEkndmUgbGVmdCBkZXNjcmliZWQgYmVsb3cuIEl0IHNlZW1zIHRvCiAgd29yay4gVGhlIGxpYmN1cmwgZml4IHJlbWFpbmVkIHRoZSBzYW1lIGFzIHllc3RlcmRheS4KCkRhbmllbCAoMjMgQXVndXN0IDIwMDApCi0gQmFjayBvbiB0aGUgLWQgc3RyaXBwaW5nIG5ld2xpbmVzIHRoaW5nLiBUaGUgJ3BsYWluIHBvc3QnIHRoaW5nIHdhcyBhZGRlZAogIHdoZW4gSSBoYWQgbm8gdGhvdWdodCBvZiB0aGF0IG9uZSBjb3VsZCBhY3R1YWxseSBwb3N0IGJpbmFyeSBkYXRhIHdpdGgKICBpdC4gTm93LCBJIGhhdmUgdG8gYWRkIHRoaXMgZnVuY3Rpb25hbGl0eSBpbiBhIGdyYWNlZnVsIG1hbm5lciBhbmQgSSB0aGluawogIEkndmUgbWFuYWdlZCB0byBjb21lIHVwIHdpdGggYSB3YXk6ICctZCBAZmlsZTtiaW5hcnknIHdpbGwgdGh1cyBwb3N0IHRoZQogIGZpbGUgYmluYXJ5LCBleGFjdGx5IGFzIGl0cyBjb250ZW50cyBhcmUuIEl0IGlzIGltcGxlbWVudGVkIHdpdGggYSBuZXcKICAqc2V0b3B0KCkgb3B0aW9uIChDVVJMT1BUX1BPU1RGSUVMRFNJWkUpIHRvIHNldCB0aGUgcG9zdGZpZWxkIHNpemUsIHNpbmNlCiAgbGliY3VybCBjYW4ndCBzdHJsZW4oKSB0aGUgZGF0YSBpbiB0aGVzZSBjYXNlcy4KCi0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBtYWRlIHNvbWUgdmVyeSBzZXJpb3VzIGVmZm9ydHMgYW5kIGFsbCB0aGUgbmFtZQogIHJlc29sdmluZyBwcm9ibGVtcyBzZWVtIHRvIGhhdmUgYmVlbiBzb3J0ZWQgb3V0IG5vdyBvbiBhbGwgdGhlIHBsYXRmb3JtcwogIHRoYXQgcHJldmlvdXNseSBzaG93ZWQgdGhlbS4gSSdsbCBtYWtlIGFub3RoZXIgcmVsZWFzZSBub3cgYW55ZGF5IGJlY2F1c2Ugb2YKICB0aGlzLgoKLSBUaGUgRkFRIHdhcyBtdWNoIGVuaGFuY2VkIHdoZW4gaXQgY29tZXMgdG8gdGhlIGxpY2Vuc2luZyBpc3N1ZXMgdGhhbmtzIHRvCiAgQmpvcm4gUmVlc2UuCgpEYW5pZWwgKDIxIEF1Z3VzdCAyMDAwKQotIFJpY2sgV2VseWtvY2h5IHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aGVuIHlvdSB1c2UgLWQgdG8gcG9zdCBhbmQgeW91IHdhbnQgdG8KICBrZWVwIHRoZSBuZXdsaW5lcywgYXMgY3VybCBzdHJpcHMgdGhlbSBvZmYgYXMgYSBib251cyBiZWZvcmUgcG9zdGluZy4uLgogIFRoaXMgbmVlZHMgdG8gYmUgYWRkcmVzc2VkLgoKVmVyc2lvbiA3LjEuMQoKRGFuaWVsICgyMSBBdWd1c3QgMjAwMCkKLSBHb3QgbW9yZSBwZW9wbGUgaW52b2x2ZWQgaW4gdGhlIGdldGhvc3RieW5hbWVfcigpIG1lc3MuIENhb2xhbiBNY05hbWFyYSBzZW50CiAgbWUgY29uZmlndXJlLWNvZGUgdGhhdCB0dXJuZWQgb3V0IHRvIGJlIHZlcnkgc2ltaWxhciB0byBteSBleGlzdGluZyB0ZXN0cwogIHdoaWNoIG9ubHkgbWFrZSBtZSBtb3JlIHN1cmUgSSdtIG9uIHRoZSByaWdodCBwYXRoLiBJIGNoYW5nZWQgdGhlIG9yZGVyIG9mCiAgdGhlIHRlc3RzIHNsaWdodGx5LCBhcyBpdCBzZWVtcyB0aGF0IHNvbWUgY29tcGlsZXJzIGRvbid0IHllbGwgZXJyb3IgaWYgYQogIGZ1bmN0aW9uIGlzIHVzZWQgd2l0aCB0b28gbWFueSBwYXJhbWV0ZXJzLiBUaHVzLCB0aGUgZmlyc3QgdGVzdGVkIGZ1bmN0aW9uCiAgd2lsbCBzZWVtIG9rLi4uIExldCdzIGhvcGUgbW9yZSBjb21waWxlcnMgdGhpbmsgb2YgdG9vLWZldyBwYXJhbWV0ZXJzIGFzIGJhZAogIG1hbm5lcnMsIGFzIHdlJ3JlIG5vdyB0cnlpbmcgdGhlIGZ1bmN0aW9ucyBpbiB0aGF0IG9yZGVyOyBmZXdlciBmaXJzdC4gSQogIHNob3VsZCBhbHNvIGFkZCB0aGF0IExhcnMgSGVja2luZyBtYWlsZWQgbWUgYW5kIHZvbHVudGVlcmVkIHRvIHJ1biB0ZXN0cyBvbgogIGEgZmV3IG9kZCBzeXN0ZW1zLiBDb2FsYW4gaXMga2VlcGluZyBoaXMgd29yayBvdmVyIGF0CiAgaHR0cDovL3d3dy5jc24udWwuaWUvfmNhb2xhbi9wdWJsaW5rL2dldGhvc3RieW5hbWVfci8uIE1pZ2h0IGJlIGhhbmR5IGluIHRoZQogIGZ1dHVyZSBhcyB3ZWxsLgoKRGFuaWVsICgxOCBBdWd1c3QgMjAwMCkKLSBJIG5vdGljZWQgSSBoYWRuJ3QgaW5jcmVhc2VkIHRoZSBuYW1lIGxvb2t1cCBidWZmZXIgaW4gbGliL2Z0cC5jLiBJIGRvbid0CiAgdGhpbmsgdGhpcyBpcyB0aGUgcmVhc29uIGZvciB0aGUgY29udGludWVkIHRyb3VibGUgdGhvdWdoLgoKRGFuaWVsICgxNyBBdWd1c3QgMjAwMCkKLSBGcmVkIE5veiBjb3JyZWN0ZWQgbXkgc3R1cGlkIG1pc3Rha2VzIGluIHRoZSBnZXRob3N0YnluYW1lX3IoKSBmbHVmZi4gSXQKICBzaG91bGQgYWZmZWN0IHNvbWUgQUlYLCBEaWdpdGFsIFVuaXggYW5kIEhQVVggMTAgc3lzdGVtcy4KCkRhbmllbCAoMTUgQXVndXN0IDIwMDApCi0gTWF0aGlldSBMZWdhcmUgY29tcGlsZWQgYW5kIGJ1aWxkIDcuMSB3aXRob3V0IGVycm9ycyBvbiBib3RoIEFJWCA0LjIgYXMgd2VsbAogIGFzIEFJWCA0LjMuIE5vdyB3aHkgZGlkIHByb2JsZW1zIG9jY3VyIGJlZm9yZT8KCi0gRnJlZCBOb3ogcmVwb3J0ZWQgYSAtdy8tLXdyaXRlLW91dCBidWcgdGhhdCBjYXVzZWQgaXQgdG8gbWFsZnVuY3Rpb24gd2hlbgogIHVzZWQgY29tYmluZWQgd2l0aCBtdWx0aXBsZSBVUkwgcmV0cmlldmFsZXMuIEFsbCBidXQgdGhlIGZpcnN0IGRpc3BsYXkgZ290CiAgc2NyZXdlZCB1cCEKCkRhbmllbCAoMTEgQXVndXN0IDIwMDApCi0gSmFzb24gUHJpZWJlIGFuZCBhbiBhbm9ueW1vdXMgZnJpZW5kIGZvdW5kIHNvbWUgaG9zdCBuYW1lcyB0aGUgTGludXggdmVyc2lvbgogIG9mIGN1cmwgY291bGQgbm90IHJlc29sdmUuIEl0IHR1cm5lZCBvdXQgdGhlIGJ1ZmZlciB1c2VkIHRvIHJldHJpZXZlIHRoYXQKICBpbmZvcm1hdGlvbiB3YXMgdG9vIHNtYWxsLiBGaXhlZC4gT25lIGNvdWxkIGFyZ3VlIGFib3V0IHRoZSB1c2VmdWxuZXNzIG9mCiAgbm90IGhhdmluZyB0aGUgc2xpZ2h0ZXN0IHRyYWNlIG9mIGEgbWFuIHBhZ2UgZm9yIGdldGhvc3RieW5hbWVfcigpIG9uIG15CiAgTGludXggUmVkaGF0IGluc3RhbGxhdGlvbi4uLgoKRGFuaWVsICgxMCBBdWd1c3QgMjAwMCkKLSBCYWxhamkgUyBSYW8gd2FzIGZpcnN0IGluIGxpbmUgdG8gbm90ZSB0aGUgbWlzc2luZyBwb3NzaWJpbGl0eSB0byByZXBsYWNlCiAgdGhlIENvbnRlbnQtVHlwZTogYW5kIENvbnRlbnQtTGVuZ3RoOiBoZWFkZXJzIHdoZW4gZG9pbmcgLWQgcG9zdHMuIEkgYWRkZWQKICB0aGUgcG9zc2liaWxpdHkganVzdCBub3cuIEl0IHNlZW1zIHNvbWUgcGVvcGxlIHdhbnRzIHRvIGRvIHN0YW5kYXJkIHBvc3RzCiAgdXNpbmcgY3VzdG9tIENvbnRlbnQtVHlwZXMuCgpEYW5pZWwgKDggQXVndXN0IDIwMDApCi0gTWlrZSBEb3dlbGwgY29ycmVjdGx5IGRpc2NvdmVyZWQgdGhhdCBjdXJsIGRpZCBub3QgYXBwcm92ZSBvZiBVUkxzIHdpdGggbm8KICB1c2VyIG5hbWUgYnV0IHBhc3N3b3JkLiBBcyBpbiAnaHR0cDovLzpmb29AaGF4eC5zZScuIEkgY29ycmVjdGVkIHRoaXMuCgpWZXJzaW9uIDcuMQoKRGFuaWVsICg3IEF1Z3VzdCAyMDAwKQotIE15IEFJWCA0IGZpeCBkb2VzIG5vdCB3b3JrLiBJIG5lZWQgaGVscCBmcm9tIGEgQUlYIDQgaGFja2VyLgoKLSBJIGFkZGVkIG15IG5ldyBkb2N1bWVudCBpbiB0aGUgZG9jcyBkaXJlY3RvcnkuIEl0IGlzIGFpbWVkIHRvIGJlY29tZSBhIHNvcnQKICBvZiB0dXRvcmlhbCBvbiBob3cgdG8gZG8gSFRUUCBzY3JpcHRpbmcgd2l0aCBjdXJsLgoKRGFuaWVsICg0IEF1Z3VzdCAyMDAwKQotIFdvcmtpbmcgd2l0aCBSaWNoIEdyYXkgb24gY29tcGlsaW5nIGN1cmwgZm9yIGxvdHMgb2YgZGlmZmVyZW50IHBsYXRmb3Jtcy4KICBNeSBmaXggZm9yIEFJWCAzLjIgd2FzIG5vdCBnb29kIGVub3VnaCBhbmQgd2FzIHNsaWdodGx5IGNoYW5nZWQsIEkgaGFkIHRvCiAgbW92ZSBhbiBpbmNsdWRlIGZpbGUgYmVmb3JlIGFub3RoZXIsIGFzIGlzIG5vdyBkZXNjcmliZWQgaW4gdGhlIHNvdXJjZS4KCiAgQUlYIDQuMiAoNC5YPykgaGFzIGRpZmZlcmVudCBnZXRob3N0YnluYW1lX3IoKSBhbmQgZ2V0aG9zdGJ5YWRkcl9yKCkKICBmdW5jdGlvbnMgdGhhdCB0aGUgY29uZmlndXJlIHNjcmlwdCBkaWRuJ3QgY2hlY2sgZm9yIGFuZCB0aHVzIHRoZSBjb21waWxlCiAgYnJva2Ugd2l0aCBhbiBlcnJvci4gSSBoYXZlIG5vdyBjaGFuZ2VkIHRoZSBnZXRob3N0YnluYW1lX3IoKSBjaGVjayBpbiB0aGUKICBjb25maWd1cmUgZmlsZSB0byBzdXBwb3J0IGFsbCB0aHJlZSB2ZXJzaW9ucyBvZiBib3RoIHRoZXNlIGZ1bmN0aW9ucy4gTXkKICBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMgdGhlIEFJWC1zdHlsZSBpcyB0aG91Z2ggbm90IHlldCB2ZXJpZmllZCBhbmQgSSBtYXkKICBnZXQgcHJvYmxlbXMgdG8gZml4IGl0IGlmIGl0IHR1cm5zIG91dCB0byBidWcgc2luY2UgSSBkb24ndCBoYXZlIGFjY2VzcyB0bwogIGFueSBzeXN0ZW0gdXNpbmcgdGhhdC4KCiAgRm9yIHByb2JsZW1zIGxpa2UgdGhhdCwgSSBtYWRlIHRoZSBjb25maWd1cmUgc2NyaXB0IGFsbG93IC0tZGlzYWJsZS10aHJlYWQKICB0byBjb21wbGV0ZWx5IHN3aXRjaCBvZmYgdGhlIGNoZWNrIGZvciB0aHJlYWRzYWZlIHZlcnNpb25zIG9mIGEgZmV3CiAgZnVuY3Rpb25zIGFuZCB0aHVzIGdvIHdpdGggdGhlICJnb29kIG9sZCB2ZXJzaW9ucyIgdGhhdCB0ZW5kIHRvIHdvcmsKICBhbHRob3VnaCB3aWxsIGJyZWFrIHRocmVhZC1zYWZlbmVzcyBmb3IgbGliY3VybC4gTW9zdCBwZW9wbGUgd29uJ3QgdXNlCiAgbGliY3VybCBmb3Igb3RoZXIgdGhpbmdzIHRoYW4gY3VybCB0aG91Z2gsIGFuZCBjdXJsIGRvZXNuJ3QgbmVlZCBhCiAgdGhyZWFkLXNhZmUgbGliLgoKLSBXb3JraW5nIG9uIG15IGJpZyB0dXRvcmlhbCBhYm91dCBIVFRQIHNjcmlwdGluZyB3aXRoIGN1cmwuCgpEYW5pZWwgKDEgQXVndXN0IDIwMDApCi0gUmljaCBHcmF5IHNwb3R0ZWQgYSBwcm9ibGVtIGluIHNyYy9zZXR1cC5oIGNhdXNlZCBieSBhICNkZWZpbmUgc3RyZXF1YWwoKQogIHRoYXQgd2FzIGp1c3QgYSBsZWZ0LW92ZXIgZnJvbSBwYXNzZWQgdGltZXMuIFRoZSBzdHJlcXVhbCgpIGlzIG5vdyBhIHRydWUKICBmdW5jdGlvbiBzdXBwbGllZCBieSBsaWJjdXJsIGZvciBhIHBvcnRhYmxlIGNhc2UgaW5zZW5zaXRpdmUgc3RyaW5nCiAgY29tcGFyaXNvbi4gSSBhZGRlZCB0aGUgcHJvdG90eXBlcyBpbiBpbmNsdWRlL2N1cmwuaCBhbmQgcmVtb3ZlZCB0aGUKICBub3cgb2Jzb2xldGUgI2RlZmluZS4KCi0gSWdvciBLaHJpc3RvcGhvcm92IG1hZGUgYSBmaXggdG8gYWxsb3cgcmVzdW1lZCBkb3dubG9hZCBmcm9tIFN1bidzCiAgSmF2YVdlYlNlcnZlci8xLjEuMS4gSXQgc2VlbXMgdGhhdCB0aGVpciBzZXJ2ZXIgc2VuZHMgYmFkIENvbnRlbnQtUmFuZ2UKICBoZWFkZXJzLgoKLSBUaGUgbWFrZWZpbGVzIGZvcmNlZCBhIHN0YXRpYyBsaWJyYXJ5IGJ1aWxkLCB3aGljaCBpcyBiYWQgc2luY2Ugd2Ugbm93IHVzZQogIGxpYnRvb2wgYW5kIHRodXMgaGF2ZSBleGNlbGxlbnQgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCEgQWxiZXJ0IENoaW4tQS1Zb3VuZwogIGZvdW5kIG91dC4KClZlcnNpb24gNy4wLjExYmV0YQoKRGFuaWVsICgxIEF1Z3VzdCAyMDAwKQotIEFsYmVydCBDaGluLUEtWW91bmcgcG9pbnRlZCBvdXQgdGhhdCAnbWFrZSBpbnN0YWxsJyBkaWQgbm90IHByb3Blcmx5IGNyZWF0ZQogIHRoZSBoZWFkZXIgaW5jbHVkZSBkaXJlY3RvcnksIHdoeSBpdCBmYWlsZWQgdG8gaW5zdGFsbCB0aGUgaGVhZGVyIGZpbGVzIGFzCiAgaXQgc2hvdWxkLiBBdXRvbWFrZSBpc24ndCByZWFsbHkgZXF1aXBwZWQgdG8gZGVhbCB3aXRoIHN1YmRpcmVjdG9yaWVzCiAgd2l0aG91dCBNYWtlZmlsZXMgaW4gYW55IG5pY2Ugd2F5LiBJIGhhZCB0byBydW4gYWhlYWQgYW5kIGFkZCBNYWtlZmlsZXMgaW4KICBib3RoIGluY2x1ZGUgYW5kIGluY2x1ZGUvY3VybCBiZWZvcmUgSSBtYW5hZ2VkIHRvIGNyZWF0ZSBhIHRvcC1sZXZlbAogIG1ha2VmaWxlIHRoYXQgc3VjY2VlZHMgaW4gaW5zdGFsbCBldmVyeXRoaW5nIHByb3Blcmx5IQoKLSBPaywgbm8gbW9yZSAiZmVhdHVyZXMiIGFkZGVkIG5vdy4gTGV0J3MganVzdCB2ZXJpZnkgdGhhdCB0aGVyZSdzIG5vIG1ham9yCiAgZmxhd3MgYWRkZWQgbm93LgoKRGFuaWVsICgzMSBKdWx5IDIwMDApCi0gQm90aCBKZWZmIFNjaGFzbnkgYW5kIEtldGlsIEZyb3luIGFza2VkIG1lIGhvdyB0byB0ZWxsIGN1cmwgbm90IHRvIHNlbmQgb25lCiAgb2YgdGhvc2UgaW50ZXJuYWxseSBnZW5lcmF0ZWQgaGVhZGVycy4gVGhleSBkaWRuJ3Qgc2V0dGxlIHdpdGggdGhlIGJsYW5rCiAgb25lcyB5b3UgY291bGQgdGVsbCBjdXJsIHRvIHVzZS4gSSByZXdyb3RlIHRoZSBoZWFkZXItcmVwbGFjZSBzdHVmZiBhCiAgbGl0dGxlLiBOb3csIGlmIHlvdSByZXBsYWNlIGFuIGludGVybmFsIGhlYWRlciB3aXRoIHlvdXIgb3duIGFuZCB0aGF0IG5ldwogIG9uZSBpcyBhIGJsYW5rIGhlYWRlciB5b3Ugd2lsbCBvbmx5IHJlbW92ZSB0aGUgaW50ZXJuYWwgb25lIGFuZCBub3QgZ2V0IGFueQogIGJsYW5rLiBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgYW55IGNhc2Ugd2hlbiB5b3Ugd2FudCB0aGF0IGJsYW5rIGhlYWRlci4KCkRhbmllbCAoMjkgSnVseSAyMDAwKQotIEl0IHN0cnVjayBtZSB0aGF0IHRoZSBsaWIgdXNlZCBsb2NhbHRpbWUoKSB3aGljaCBpcyBub3QgdGhyZWFkLXNhZmUsIHNvIG5vdwogIEkgdXNlIGxvY2FsdGltZV9yKCkgaW4gdGhlIHN5c3RlbXMgdGhhdCBoYXMgaXQuCgotIEkgd2VudCB0aHJvdWdoIHRoaXMgZW50aXJlIGRvY3VtZW50IGFuZCByZW1vdmVkIGFsbCBlbWFpbCBhZGRyZXNzZXMgYW5kIGxlZnQKICBuYW1lcyBvbmx5LiBJJ3ZlIHJlYWxseSBtYWRlIGFuIGVmZm9ydCB0byBhbHdheXMgbm90ZSB3aG8gYnJvdWdodCBiZSBidWcKICByZXBvcnRzIG9yIGZpeGVzLCBidXQgbW9yZSBhbmQgbW9yZSBwZW9wbGUgYXNrIG1lIHRvIHJlbW92ZSB0aGUgZW1haWwKICBhZGRyZXNzZXMgc2luY2UgdGhleSBiZWNvbWUgdmljdGltcyBmb3Igc3BhbXMgdGhpcyB3YXkuIEdvcmRvbiBCZWF0b24gZ290IG1lCiAgd29ya2luZyBvbiB0aGlzLgoKRGFuaWVsICgyNyBKdWx5IDIwMDApCi0gSvZybiBIYXJ0cm90aCBmb3VuZCBvdXQgdGhhdCB3aGVuIHlvdSBzcGVjaWZpZWQgYSBIVFRQIHByb3h5IGluIGFuCiAgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIHVzZWQgLUwsIGN1cmwgZmFpbGVkIGluIHRoZSBzZWNvbmQgZmV0Y2guIEkKICBjb3JyZWN0ZWQgdGhpcyBwcm9ibGVtIGFuZCBwb3N0ZWQgYSBwYXRjaCB0byB0aGUgbGlzdC4gTm8gbmVlZCBmb3IgYW4gZXh0cmEKICBiZXRhIHJlbGVhc2UganVzdCBmb3IgdGhpcy4KClZlcnNpb24gNy4wLjEwYmV0YQoKRGFuaWVsICgyNyBKdWx5IDIwMDApCi0gU28sIGxpYnRvb2wgcmVwbGFjZWQgdHdvIG9mIG15IGZpbGVzIHdpdGggc3ltYm9saWMgbGlua3MgYW5kIEkgZm9yZ290IHRvIGFkZAogIHRoZSB0d28gbmV3IGxpYnRvb2wgZmlsZXMgdG8gdGhlIHJlbGVhc2UgYXJjaGl2ZSAoYW5kIHRoZXkgd2VyZSBhZGRlZCBhcwogIHN5bWxpbmtzIGFzIHdlbGwhKSBUaGlzIG9mIGNvdXJzZSBsZWFkIHRvIHRoYXQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZmFpbGVkCiAgb24gNy4wLjkuLi4KClZlcnNpb24gNy4wLjliZXRhCgpEYW5pZWwgKDI1IEp1bHkgMjAwMCkKLSBLcmlzdGlhbiBL9mhudG9wcCA8a3JpcyBhdCBrb2VobnRvcHAuZGU+IGJyb3VnaHQgYSBmaXggdGhhdCBtYWtlcyBsaWJjdXJsCiAgbGlidG9vbGlmaWVkLCBqdXN0IGFzIHdlJ3ZlIHdhbnRlZCBmb3IgYSB3aGlsZSBub3cuIEhlIGFsc28gbWFkZSB0aGUKICByZWNlbnRseSBhZGRlZCBtYW4gcGFnZXMgZ2V0IGluc3RhbGxlZCBwcm9wZXJseSBvbiAnbWFrZSBpbnN0YWxsJyBhbmQgc29tZQogIG90aGVyIG5pY2UgY2xlYW51cHMuCgotIEluIGEgZGlzY3Vzc2lvbiB3aXRoIEVldHUgT2phbmVuIGl0IHN0cnVjayBtZSB0aGF0IGlmIHdlIHVzZSBjdXJsIHRvIGdldCBhCiAgcGFnZSB1c2luZyBhIHBhc3N3b3JkLCBhbmQgdGhhdCBwYWdlIHRoZW4gc2VuZHMgYSBMb2NhdGlvbjogdG8gYW5vdGhlcgogIHNlcnZlciB0aGF0IGN1cmwgZm9sbG93cywgY3VybCB3aWxsIHNlbmQgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQgdG8gdGhhdAogIHNlcnZlciBhcyB3ZWxsLgoKICBOb3csIEknbGwgbmV2ZXIgYmUgYWJsZSB0byBtYWtlIGN1cmwgZG8gTG9jYXRpb246IGZvbGxvd2luZyBhbGwgdGhhdCBwZXJmZWN0CiAgYW5kIHlvdSdyZSBhbGwgc29vbmVyIG9yIGxhdGVyIHJlcXVpcmVkIHRvIHdyaXRlIGEgc2NyaXB0IHRvIGRvIHNldmVyYWwKICBmZXRjaGVzIHdoZW4geW91J3JlIGRvaW5nIGFkdmFuY2VkIHN0dWZmLCBidXQgbm93IEkndmUgbW9kaWZpZWQgY3VybCB0byBhdAogIGxlYXN0ICpvbmx5KiBzZW5kIHRoZSB1c2VyIG5hbWUgYW5kIHBhc3N3b3JkIHRvIHRoZSBvcmlnaW5hbCBzZXJ2ZXIuIFdoaWNoCiAgbWVhbnMgdGhhdCBpZiBnZXQgYSBwYWdlIGZyb20gc2VydmVyIEEgd2l0aCBhIHBhc3N3b3JkLCB0aGF0IGZvcndhcmRzIGN1cmwKICB0byBzZXJ2ZXIgQiwgY3VybCB3b24ndCB1c2UgdGhlIHBhc3N3b3JkIHRoZXJlLiBJZiBzZXJ2ZXIgQiB0aGVuIGZvcndhcmRzCiAgY3VybCBiYWNrIHRvIHNlcnZlciBBIGFnYWluLCB0aGUgcGFzc3dvcmQgd2lsbCBiZSB1c2VkIGFnYWluLgoKICBUaGlzIGlzIG5vdCBhIHBlcmZlY3QgaW1wbGVtZW50YXRpb24sIGFzIGluIGEgYnJvd3NlciBjYXNlIGl0IHdvdWxkIG9ubHkgdXNlCiAgdGhlIHBhc3N3b3JkIGlmIHRoZSBsZWZ0LXByZWZpeCBvZiB0aGUgZmlyc3QgcGF0aCBpcyB0aGUgc2FtZS4gSSBqdXN0IHRoaW5rCiAgdGhhdCB0aGlzIGZpeCBwcmV2ZW50cyBhIHNvbWV3aGF0IGx1cmt5ICJzZWN1cml0eSBob2xlIi4KCiAgQXMgYSBzaWRlLW5vdGUgaW4gdGhpcyBzdWJqZWN0OiBIVFRQIHBhc3N3b3JkcyBhcmUgc2VudCBpbiBjbGVhcnRleHQgYW5kCiAgd2lsbCBuZXZlciBiZSBjb25zaWRlcmVkIHRvIGJlIHNhZmUgb3Igc2VjdXJlLiBVc2UgSFRUUFMgZm9yIHRoYXQuCgotIEFzIGRpc2N1c3NlZCBvbiB0aGUgbWFpbGluZyBsaXN0LCBJIGNvbnZlcnRlZCB0aGUgRlRQIHJlc3BvbnNlIHJlYWRpbmcKICBmdW5jdGlvbiBpbnRvIHVzaW5nIHNlbGVjdCgpIHdoaWNoIHRoZW4gYWxsb3dzIHRpbWVvdXRzIChldmVuIHVuZGVyIHdpbjMyISkKICBpZiB0aGUgY29tbWFuZC1yZXBseSBzZXNzaW9uIGdldHMgdG9vIHNsb3cgb3IgZGllcyBjb21wbGV0ZWx5LiBJIG1hZGUgYQogIGRlZmF1bHQgdGltZW91dCBvbiAzNjAwIHNlY29uZHMgdW5sZXNzIGFueXRoaW5nIGVsc2UgaXMgc3BlY2lmaWVkLCBzaW5jZSBJCiAgZG9uJ3QgdGhpbmsgYW55b25lIHdhbnRzIHRvIHdhaXQgbW9yZSB0aGFuIHRoYXQgZm9yIGEgc2luZ2xlIGNoYXJhY3RlciB0bwogIGdldCByZWNlaXZlZC4uLgoKLSBUb3JzdGVuIEZvZXJ0c2NoIDx0b3JzdGVuLmZvZXJ0c2NoIGF0IGdteC5uZXQ+IGJyb3VnaHQgYSBzZXQgb2YgZml4ZXMgZm9yCiAgdGhlIHJmYzE4NjcgZm9ybSBwb3N0cy4gSGUgaW50cm9kdWNlZCAnbmFtZT08ZmlsZScgd2hpY2ggYnJpbmdzIGEgbWVhbnMgdG8KICBzdXVwbHkgdmVyeSBsYXJnZSB0ZXh0IGNodW5rcyByZWFkIGZyb20gdGhlIGdpdmVuIGZpbGUgbmFtZS4gSXQgZGlmZmVycyBmcm9tCiAgJ25hbWU9QGZpbGUnIGluIHRoZSB3YXkgdGhhdCB0aGlzIGxhdHRlciB0aGluZyBpcyBtYXJrZWQgaW4gdGhlIHVwbG9hZGVkCiAgY29udGVudHMgYXMgYSBmaWxlIHVwbG9hZCwgd2hpbGUgdGhlIGZpcnN0IGlzIGp1c3QgdGV4dCAoYXMgaW4gYSBpbnB1dCBvcgogIHRleHRhcmVhIGZpZWxkKS4gVG9yc3RlbiBhbHNvIGNvcnJlY3RlZCBhIGJ1ZyB0aGF0IHdvdWxkIGhhcHBlbiBpZiB5b3UgdXNlZAogICVzIG9yIHNpbWlsYXIgaW4gYSAtRiBmaWxlIG5hbWUuCgotIEFzIGRpc2NvdmVyZWQgYnkgTmljbyBCYWdndXMgPE5pY28uQmFnZ3VzIGF0IG1haWwuaW5nLm5sPiwgd2hlbiB0cmFuc2ZlcnJpbmcKICBmaWxlcyB0by9mcm9tIEZUUCB1c2luZyB0eXBlIEFTQ0lJIGN1cmwgc2hvdWxkIG5vdCBleHBlY3QgdGhlIHRyYW5zZmVyIHRvIGJlCiAgdGhlIGV4YWN0IHNpemUgcmVwb3J0ZWQgYnkgdGhlIHNlcnZlciBhcyB0aGUgZmlsZSBzaXplLiBTaW5jZSBBU0NJSSBtYXkgdmVyeQogIHdlbGwgbWVhbiB0aGF0IHRoZSBjb250ZW50IGlzIHRyYW5zbGF0ZWQgd2hpbGUgdHJhbnNmZXJlZCwgdGhlIGZpbmFsIHNpemUKICBtYXkgdmVyeSB3ZWxsIGRpZmZlci4gVGhlcmVmb3IsIGN1cmwgbm93IGlnbm9yZXMgdGhlIGZpbGUgc2l6ZSB3aGVuIGRvaW5nCiAgQVNDSUkgdHJhbnNmZXJzIGluIEZUUC4KCkRhbmllbCAoMjQgSnVseSAyMDAwKQotIEFkZGVkIENVUkxPUFRfUFJPWFlQT1JUIHRvIHRoZSBjdXJsX2Vhc3lfc2V0b3B0KCkgY2FsbCB0byBhbGxvdyB0aGUgcHJveHkKICBwb3J0IG51bWJlciB0byBiZSBzZXQgc2VwYXJhdGVseSBmcm9tIHRoZSBwcm94eSBob3N0IG5hbWUuCgotIEFuZHJldyA8YW5kcmV3IGF0IHVnaC5uZXQuYXU+IHBvaW50ZWQgb3V0IGEgbmV0cmMgbWFudWFsIGJ1Zy4KCi0gVGhlIEZUUCB0cmFuc2ZlciBjb2RlIG5vdyBhY2NlcHRzIGEgMjUwLWNvZGUgYXMgd2VsbCBhcyB0aGUgcHJldmlvdXNseQogIGFjY2VwdGVkIDIyNiwgYWZ0ZXIgYSBzdWNjZXNzZnVsIGZpbGUgdHJhbnNmZXIuIE1vaGFuIDxtbmFpciBhdAogIGV2ZXJncmVlbi1mdW5kcy5jb20+IHBvaW50ZWQgdGhpcyBvdXQuCgotIFRoZSBjaGVjayBmb3IgKmJvdGgqIG5zbCBhbmQgc29ja2V0IHdhcyBuZXZlciBhZGRlZCBpbiB0aGUgdjcgY29uZmlndXJlLmluCiAgd2hlbiBJIG1vdmVkIHRoZSBtYWluIGJyYW5jaC4gSSByZS1hZGRlZCB0aGF0IGNoZWNrIHRvIGNvbmZpZ3VyZS5pbi4gVGhpcyB3YXMKICBkaXNjb3ZlcmVkIGJ5IFJpY2ggR3JheS4KCi0gSG93YXJkLCBCbGFpc2UgPEJsYWlzZS5Ib3dhcmQgYXQgZmFjdGl2YS5jb20+IHBvaW50ZWQgb3V0IGEgbWlzc2luZyBmcmVlKCkgaW4KICBjdXJsX2Rpc2Nvbm5lY3QoKSB3aGljaCBvZiBjb3Vyc2UgbWVhbnQgbGliY3VybCBhdGUgbWVtb3J5LgoKLSBCcmlhbiBFLiBHYWxsZXcgbm90ZWQgdGhhdCB0aGUgSFRUUCAnSG9zdDonIGhlYWRlciBjdXJsIHNlbnQgZGlkIG5vdAogIHByb3Blcmx5IGluY2x1ZGUgdGhlIHBvcnQgbnVtYmVyIGlmIG5vbi1kZWZhdWx0IHBvcnRzIHdlcmUgdXNlZC4gVGhpcyBzaG91bGQKICBub3cgaGF2ZSBiZWVuIGZpeGVkLgoKLSBIVFRQIGNvbm5lY3QgZXJyb3JzIG5vdyByZXR1cm4gZXJyb3JzIGVhcmxpZXIuIFRoaXMgd2FzIG1vc3Qgbm90YWJseSBjYXVzaW5nCiAgcHJvYmxlbXMgd2hlbiB0aGUgSFRUUFMgY2VydGlmaWNhdGUgaGFkIHByb2JsZW1zIGFuZCBsYXRlciBjYXVzZWQgYSBjcmFzaC4KICBNYW55IHRoYW5rcyB0byBHcmVnb3J5IE5pY2hvbGxzIDxnbmljaG9sbHMgYXQgbGV2ZWw4LmNvbT4gZm9yIGRpc2NvdmVyaW5nCiAgYW5kIHN1Z2dlc3RpbmcgYSBmaXguLi4KCkRhbmllbCAoMjEgSnVuZSAyMDAwKQotIEFmdGVyIGEgImJ1ZyByZXBvcnQiIEkgcmVjZWl2ZWQgd2hlcmUgdGhlIHVzZXIgd2FzIHVzaW5nIGJvdGggLUYgYW5kIC1JIGluIGEKICBIVFRQIHJlcXVlc3QgKGl0IHNldmVybHkgY29uZnVzZWQgdGhlIGxpYnJhcnkgSSBzaG91bGQgYWRkKSwgSSBhZGRlZCBzb21lCiAgY2hlY2tzIHRvIHNyYy9tYWluLmMgdGhhdCBwcmV2ZW50cyBzZXR0aW5nIG1vcmUgdGhhbiBvbmUgSFRUUCByZXF1ZXN0CiAgY29tbWFuZCwgbm8gbWF0dGVyIHdoYXQgdGhlIHVzZXIgd2FudHMhIDstKQoKVmVyc2lvbiA3LjAuOGJldGEKCkRhbmllbCAoMjAgSnVuZSAyMDAwKQotIEkgZGlkIGEgbWFqb3IgcmVwbGFjZSBpbiBtYW55IGZpbGVzIHRvIHVzZSB0aGUgbmV3IGN1cmwgZG9tYWluIGhheHguc2UKICBpbnN0ZWFkIG9mIHRoZSBwcmV2aW91cyBvbmUuCgotIEFzIEVldHUgT2phbmVuIHN1Z2dlc3RlZCwgSSBmaW5hbGx5IHRvb2sgdGhlIHN0ZXAgYW5kIG5vdyBsaWJjdXJsIG5vIGxvbmdlcgogIG1ha2VzIGEgUE9TVCBhZnRlciBpdCBoYXMgZm9sbG93ZWQgYSBsb2NhdGlvbi4gV2hlbiB0aGUgaW5pdGlhbCBQT1NUIGhhcwogIGJlZW4gZG9uZSwgaXQnbGwgdHVybmVkIGludG8gYSBHRVQgZm9yIHRoZSBmdXJ0aGVyIHJlcXVlc3RzLiBUaGlzIGlzIG9ubHkKICBpbnRlcmVzdGluZyB3aGVuIHVzaW5nIC1MLy0tbG9jYXRpb24gKmFuZCogZG9pbmcgYSBQT1NUIGF0IHRoZSBzYW1lIHRpbWUuCgogIFdoaWxlIG1lc3Npbmcgd2l0aCB0aGlzLCBJIGFkZGVkIGFub3RoZXIgd2VpcmQgZmVhdHVyZSBJIGNhbGwgJ2F1dG8KICByZWZlcmVyJy4gSWYgeW91IGFwcGVuZCAnO2F1dG8nIHRvIHRoZSByaWdodCBvZiBhIGdpdmVuIHJlZmVyZXIgc3RyaW5nIChvcgogIG9ubHkgdXNlIHRoYXQgc3RyaW5nIGFzIHJlZmVyZXIpLCBsaWJjdXJsIHdpbGwgYXV0b21hdGljYWxseSBzZXQgdGhlCiAgcHJldmlvdWQgVVJMIGFzIHJlZmVyZWQgd2hlbiBpdCBmb2xsb3dzIGEgTG9jYXRpb246IGFuZCBnZXRzIGEgc3VjY2VlZGluZwogIGRvY3VtZW50LgoKLSBNeSBoZXJvIFJpY2ggR3JheSBmb3VuZCB0aGUgdmVyeSBvYnNjdXJlIEZUUCBidWcgdGhhdCBoYXBwZW5lZCB0byBoaW0gb25seQogIHdoZW4gcGFzc2luZyB0aHJvdWdoIGEgcGFydGljdWxhciBmaXJld2FsbCBhbmQgdXNpbmcgdGhlIFBPUlQgY29tbWFuZC4gSXQKICB0dXJuZWQgb3V0IHRoYXQgUE9SVCB3YXMgdGhlIG9ubHkgY29tbWFuZCBpbiB0aGUgbGliL2Z0cC5jIHNvdXJjZSB0aGF0CiAgZGlkbid0IHNlbmQgYSBwcm9wZXIgXHJcbiBzZXF1ZW5jZSBidXQgaW5zdGVhZCB1c2VkIHRoZSBmYXVsdHkgXG4gd2hpY2ggYXMKICBpdCBzZWVtZWQgaXMgc3VwcG9ydGVkIGJ5IG1vc3QgbWFqb3IgZnRwIHNlcnZlcnMuLi4gOi1PCgpWZXJzaW9uIDcuMC43YmV0YQoKRGFuaWVsICgxNiBKdW5lIDIwMDApCi0gSSBoYWQgYXZvaWRlZCB0aGlzIGxvbmcgZW5vdWdoIG5vdywgc28gSSBtb3ZlZCB0aGUgYWx0ZXJuYXRpdmUgcHJvZ3Jlc3MgYmFyCiAgc3R1ZmYgZnJvbSB0aGUgbGliIGFuZCBhZGRlZCBpdCB0byB0aGUgY2xpZW50IGNvZGUuIFRoaXMgaXMgbm93IHVzaW5nIHRoZQogIHJlY2VudGx5IGFkZGVkIHByb2dyZXNzIGNhbGxiYWNrIGFuZCBpdCBzZWVtcyB0byB3b3JrIHByZXR0eSBtdWNoIGxpa2UKICBiZWZvcmUuIFNpbmNlIGl0IGlzIG9ubHkgb25lIHByb2dyZXNzIGJhciBhbmQgeW91IGFuZCBkb3dubG9hZCBhbmQgdXBsb2FkIGF0CiAgdGhlIHNhbWUgdGltZSwgdGhpcyBiYXIgc2hvd3MgdGhlIGNvbWJpbmVkIHByb2dyZXNzIG9mIGJvdGggZGlyZWN0aW9ucy4gVGhpcwogIGNvZGUgd2FzIGp1c3QgcG9ydGVkIGZyb20gdGhlIG9sZCBwbGFjZSB0byB0aGlzLCBMYXJzIGlzIHN0aWxsIG91ciBzYXZpb3VyIQogIDstKSBUaGlzIGFsc28gbWFkZSB0aGUgZG9jdW1lbnRhdGlvbiBtb3JlIGFjY3VyYXRlIHNpbmNlIEkgbmV2ZXIgcmVtb3ZlZAogIHRoaXMgZnVuY3Rpb24gZnJvbSBhbnkgZG9jcyEgQWx0aG91Z2ggSSBub3cgcmVtb3ZlZCB0aGUgQ1VSTE9QVF9QUk9HUkVTU01PREUKICBmcm9tIHRoZSBsaWJyYXJ5IHNpbmNlIHRoZSBsaWIgaGFzIG9ubHkgb25lIGludGVybmFsIHByb2dyZXNzIG1ldGVyIGFuZCBpdAogIHdpbGwgbmV2ZXIgZ2V0IGFub3RoZXIuIEl0IGlzIGFsdGhvdWdoIGxpa2VseSB0aGF0IHRoZSBpbnRlcm5hbCBvbmUgYWxzbwogIHdpbGwgYmUgbW92ZWQgdG8gdGhlIGNsaWVudCBjb2RlIGluIHRoZSBmdXR1cmUgKHdoZW4gSSBoYXZlIG90aGVyIG1lYW5zIG9mCiAgZ2V0dGluZyB0aGUgd3JpdGVvdXQgZGF0YSBhbmQgbW92ZSB0aGF0IHRvbyB0byB0aGUgY2xpZW50KS4KCi0gSSB0b29rIHRoZSBvcHBvcnR1bml0eSB0byB2ZXJpZnkgdGhhdCBzdGFuZGFyZCBwcm9ncmVzcyBtZXRlciB3b3JrcyBhbmQgSQogIGZvdW5kIG91dCBpdCBkaWRuJ3QgZ2V0IGluaXRlZCBwcm9wZXJseS4gR3Jyci4gSSBjb3JyZWN0ZWQgdGhhdCBhcyB3ZWxsLgoKRGFuaWVsICgxNSBKdW5lIDIwMDApCi0gSSB0aG91Z2h0IEknZCBiZXR0ZXIgdmVyaWZ5IHRoYXQgdGhlIC1GIG9wdGlvbiBzdGlsbCB3b3JrcyBpbiB2NyBhbmQgb2YKICBjb3Vyc2UgaXQgZGlkbid0Li4uIDotLyBBbnl3YXksIEkgaGFkIHRoZSBwcm9ibGVtcyBJIGNvdWxkIGRpc2NvdmVyCiAgY29ycmVjdGVkLiBBYm91dCBvbmUgbW9udGggb2YgYmV0YSB0ZXN0aW5nIGFuZCBub3QgYSBzaW5nbGUgcGVyc29uIGhhcyB1c2VkCiAgdGhpcyBmZWF0dXJlIHdpdGggdjc/CgotIEJq9nJuIGNvcnJlY3RseSBwb2ludGVkIG91dCB0aGF0IHRoZSAtLXByb2dyZXNzLWJhciBzdGlsbCBkb2Vzbid0IHdvcmsgaW4KICB2Ny4gSG0uCgpEYW5pZWwgKDE0IEp1bmUgMjAwMCkKLSBUaW0gVGFzc29uaXMgZGlzY292ZXJlZCB0aGF0IGN1cmwgNyBkaWRuJ3QgaGFuZGxlIG5vcm1hbCBodHRwIFBPU1QgYXMgaXQKICBzaG91bGQuIEkgY29ycmVjdGVkIHRoaXMuCgpWZXJzaW9uIDcuMC42YmV0YQoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gQmr2cm4gU3RlbmJlcmcgcG9pbnRlZCBvdXQgc2V2ZXJhbCBwcm9ibGVtcyAocmVsYXRlZCB0byB3aW4zMiBjb21waWxpbmcpOgogIGxpYi9zdHJlcXVhbC5jIGhhZCBhIGJhZCAjaWZkZWYgZm9yIG9uZSBvZiB0aGUgc3RyaW5nIGNvbXBhcmlzb25zICh3aW4zMikKICBzcmMvbWFpbi5jIGhhZCBzZXZlcmFsIG1pbm9yIHByb2JsZW1zCiAgbGliL21ha2VmaWxlLm0zMiBoYWQgZ2V0cGFzcy5bY29dIHR3aWNlCiAgc3JjL2NvbmZpZy13aW4zMi5oIGxhY2tlZCB0aGUgSEFWRV9GQ05UTF9IIGRlZmluZQogIGJvdGggY29uZmlnLXdpbjMyLmggZmlsZXMgbm93IG9ubHkgc2V0IHRoZSBIQVZFX1VOSVNURF9IIGRlZmluZSBpZiB0aGUKICBkZWZpbmUgTUlOR1czMiBpcyBzZXQsIGFuZCBJIG1vZGlmaWVkIHNyYy9tYWtlZmlsZS5tMzIgYW5kIGxpYi9tYWtlZmlsZS5tMzIKICB0byBzZXQgaXQuCgpWZXJzaW9uIDcuMC41YmV0YQoKRGFuaWVsICgxNCBKdW5lIDIwMDApCi0gQXBwbGllZCBMdW9uZyBEaW5oIER1bmcncyBjb21tZW50cyBhYm91dCBhIGZldyB3aW4zMiBjb21waWxlIHByb2JsZW1zLgoKLSBBcHBsaWVkIEJq9nJuIFN0ZW5iZXJnJ3Mgc3VnZ2VzdGVkIGZpeCB0aGF0IHR1cm5zIHRoZSB3aW4zMiBzdGRvdXQgdG8KICBiaW5hcnkuIEl0IHdvbid0IGRvIGl0IGlmIHRoZSAtQiAvIC0tdXNlLWFzY2lpIG9wdGlvbiBpcyB1c2VkLiBUaGF0IG9wdGlvbgogIGlzIG5vdyBhbiBleHRlbmRlZCB2ZXJzaW9uIG9mIHRoZSBwcmV2aW91cyAtQiAvLS1mdHAtLWFzY2lpLiBUaGUgZmxhZyB3YXMKICBhbHJlYWR5IGluIHVzZSBiZSB0aGUgbGRhcCBhcyB3ZWxsIHNvIHRoZSBuZXcgbmFtZSBmaXRzIHByZXR0eSBnb29kLiBUaGUKICBsaWJjeXJsIENVUkxPUFRfVFJBTlNGRVJURVhUIHdhcyBhbHNvIGludHJvZHVjZWQgYXMgYW4gYWxpYXMgdG8gdGhlIG5vdwogIG9ic29sZXRlIENVUkxPUFRfRlRQQVNDSUkuIENhbid0IHZlcmlmeSB0aGlzIGZpeCBteXNlbGYgYXMgSSBoYXZlIG5vIHdpbjMyCiAgY29tcGlsZXIgYXJvdW5kLgoKRGFuaWVsICgxMyBKdW5lIDIwMDApCi0gTHVvbmcgRGluaCBEdW5nIDxkdW5nIGF0IHNjaC5ibWUuaHU+IGZvdW5kIGEgcHJvYmxlbSBpbiBjdXJsX2Vhc3lfY2xlYW51cCgpCiAgc2luY2UgaXQgZnJlZSgpZWQgdGhlIG1haW4gY3VybCBzdHJ1Y3QgKnR3aWNlKi4gVGhpcyBpcyBub3cgY29ycmVjdGVkLgoKRGFuaWVsICg5IEp1bmUgMjAwMCkKLSBVcGRhdGVkIHRoZSBSRVNPVVJDRVMgZmlsZSwgYWRkZWQgYSBSRUFETUUud2luMzIgZmlsZS4KCkRhbmllbCAoOCBKdW5lIDIwMDApCi0gU28gSSBmaW5hbGx5IGFkZGVkIHRoZSBwcm9ncmVzcyBjYWxsYmFjayB0byB0aGUgKnNldG9wdCgpIG9wdGlvbnMgYW5kIGl0CiAgc2hvdWxkIHdvcmsgbm93LiBJIGRvbid0IGhhdmUgdGhlIGVuZXJneSB0byB3cml0ZSBhbnkgdGVzdCBwcm9ncmFtIGZvciBpdAogIHJpZ2h0IG5vdy4KLSBNYWRlIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0eXBlZGVmcyBwdWJsaWMgaW4gY3VybC9jdXJsLmggZm9yIGNvbWZvcnQuIEp1c3QKICBpbiBjYXNlIGFueW9uZSB3YW5uYSBmaWRkbGUgd2l0aCBzdWNoIHBvaW50ZXJzLgotIFVwZGF0ZWQgdGhlIGN1cmxfZWFzeV9zZXRvcHQoKSBtYW4gcGFnZSBhY2NvcmRpbmdseS4KClZlcnNpb24gNy4wLjRiZXRhCgpEYW5pZWwgKDIgSnVuZSAyMDAwKQotIEkgbm90aWNlZCB0aGF0IHdoZW4gZG9pbmcgTG9jYXRpb246IGZvbGxvd2luZywgd2UgbG9zdCBjdXN0b20gaGVhZGVycyBpbiBhbGwKICBidXQgdGhlIGZpcnN0IHJlcXVlc3QuCi0gUmVtb3ZlZCB0aGUgJ0h0dHBQb3N0JyBzdHJ1Y3QgYW5kIG1vdmVkIHRoZSBoZWFkZXIgc3R1ZmYgdG8gdGhlIG1vcmUgZ2VuZXJpYwogIGN1cmxfc2xpc3QuCi0gQWRkZWQgc29tZSBiZXR0ZXIgc2xpc3QtY2xlYW51cHMgaW4gc3JjL21haW4uYwoKVmVyc2lvbiA3LjAuM2JldGEKCkRhbmllbCAoMzEgTWF5IDIwMDApCi0gU28gSSBkaXNjb3ZlcmVkIHRoYXQgSSByZWxlYXNlZCB0aGUgNy4wLjJiZXRhIHdpdGhvdXQgaXQgYmVpbmcgYWJsZSB0bwogIGNvbXBpbGUgdW5kZXIgTGludXguIGdldGhvc3RieW5hbWVfcigpIGFuZCBnZXRob3N0YnlhZGRyX3IoKSB0dXJuZWQgb3V0IHRvCiAgZmVhdHVyZSBhIGRpZmZlcmVudCBhbW91bnQgb2YgYXJndW1lbnRzIG9uIGRpZmZlcmVudCBzeXN0ZW1zIHNvIEkgaGFkIHRvIGFkZAogIGEgY29uZmlndXJlIGNoZWNrIGZvciB0aGlzIGFuZCBhZGp1c3QgdGhlIGNvZGUgc2xpZ2h0bHkuCgpWZXJzaW9uIDcuMC4yYmV0YQoKRGFuaWVsICgyOSBNYXkgMjAwMCkKLSBDb3JyZWN0ZWQgdGhlIGJpdHMuKiBhc3NpZ25tZW50cyB3aGVuIHVzaW5nIENVUkxPUFQgb3B0aW9ucyB0aGF0IG9ubHkKICB0b2dnbGVzIG9uZSBvZiB0aG9zZSBiaXRzLgoKLSBBcHBsaWVkIHRoZSBodWdlIHBhdGNoZXMgZnJvbSBEYXZpZCBMZUJsYW5jIDxkbGVibGFuYyBhdCBxbnguY29tPiB0aGF0IGFkZAogIHVzYWdlIG9mIHRoZSBnZXRob3N0YnluYW1lX3IoKSBhbmQgc2ltaWxhciBmdW5jdGlvbnMgaW4gY2FzZSB0aGV5J3JlIGFyb3VuZCwKICBzaW5jZSB0aGF0IG1ha2UgbGliY3VybCBtdWNoIGJldHRlciB0aHJlYWRzYWZlIGluIG1hbnkgc3lzdGVtcyAoc3VjaCBhcwogIHNvbGFyaXMpLiBJIGFkZGVkIHRoZSBjaGVja3MgZm9yIHRoZXNlIGZ1bmN0aW9ucyB0byB0aGUgY29uZmlndXJlIHNjcmlwdC4KCiAgSSBjYW4ndCBleHBsYWluIHdoeSwgYnV0IHRoZSBpbmV0X250b2FfcigpIGZ1bmN0aW9uIGRpZCBub3QgYXBwZWFyIGluIG15CiAgU29sYXJpcyBpbmNsdWRlIGZpbGVzLCBJIGhhZCB0byBhZGQgbXkgb3duIGluY2x1ZGUgZmlsZSBmb3IgdGhpcyBmb3Igbm93LgoKRGFuaWVsICgyMiBNYXkgMjAwMCkKLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgbWUgZml4ZXMgdG8gbWFrZSB0aGUgd2luMzIgdmVyc2lvbiBjb21waWxlIHByb3Blcmx5IGFzCiAgd2VsbCBhcyBhIHJlbmFtZSBvZiB0aGUgJ2ludGVyZmFjZScgZmllbGQgaW4gdGhlIHVybGRhdGEgc3RydWN0LCBhcyBpdCBzZWVtcwogIHRvIGJlIHJlc2VydmVkIGluIHNvbWUgZ2NjIHZlcnNpb25zIQoKLSBSaWNoIEdyYXkgc3RydWNrIGJhY2sgd2l0aCB5ZXQgc29tZSBwb3J0YWJpbGl0eSByZXBvcnRzLiBEYXRhIEdlbmVyYWwgREcvVVgKICBuZWVkZWQgYSBsaXR0bGUgZml4IGluIGxpYi9sZGFwLmMgc2luY2UgaXQgZG9lc24ndCBoYXZlIFJUTERfR0xPQkFMIGRlZmluZWQuCiAgTW9yZSBmaXhlcyBhcmUgZXhwZWN0ZWQgYXMgYSByZXN1bHQgb2YgUmljaGllcyB2ZXJ5IGhlbHBmdWwgd29yay4KClZlcnNpb24gNy4wLjFiZXRhCgpEYW5pZWwgKDIxIE1heSAyMDAwKQotIFVwZGF0ZWQgbG90cyBvZiAjZGVmaW5lcywgZW51bXMgYW5kIHZhcmlhYmxlIHR5cGUgbmFtZXMgaW4gdGhlIGxpYnJhcnkuIE5vCiAgbW9yZSB3ZWlyZCBVUkcgb3IgVVJMVEFHIHByZWZpeGVzLiBBbGwgdHlwZXMgYW5kIG5hbWVzIHNob3VsZCBiZSBjdXJsLQogIHByZWZpeGVkIHRvIGF2b2lkIG5hbWUgc3BhY2UgY2xhc2hlcy4gVGhlIEZMQUdTLXBhcmFtZXRlciB0byB0aGUgZm9ybWVyCiAgY3VybF91cmxnZXQoKSBoYXMgYmVlbiBjb252ZXJ0ZWQgaW50byBhIGJ1bmNoIG9mIGZsYWdzIHRvIHVzZSBpbiBzZXBhcmF0ZQogIHNldG9wdCBjYWxscy4gSSdtIHN0aWxsIGZvY3VzaW5nIG9uIHRoZSBlYXN5LWludGVyZmFjZSwgYXMgdGhlIGN1cmwgdG9vbCBpcwogIG5vdyB1c2luZyB0aGF0LgoKLSBCam9ybiBSZWVzZSBoYXMgcHJvdmlkZWQgbWUgd2l0aCBhbiBhc3luY2hyb25vdXMgbmFtZSByZXNvbHZlciB0aGF0IEkgcGxhbgogIHRvIHVzZSBpbiB1cGNvbWluZyB2ZXJzaW9ucyBvZiBjdXJsIHRvIGJlIGFibGUgdG8gZ3JhY2VmdWxseSB0aW1lb3V0IG5hbWUKICBsb29rdXBzLgoKVmVyc2lvbiA3LjBiZXRhCgpEYW5pZWwgKDE4IE1heSAyMDAwKQotIEludHJvZHVjZWQgTElCQ1VSTF9WRVJTSU9OX05VTSB0byB0aGUgY3VybC5oIGluY2x1ZGUgZmlsZSB0byBiZXR0ZXIgYWxsb3cKICBzb3VyY2UgY29kZXMgdG8gYmUgZGVwZW5kZW50IG9uIHRoZSBsaWIgdmVyc2lvbi4gVGhpcyBkZWZpbmUgaXMgbm93IHNldCB0bwogIGEgZGV4YWRlY2ltYWwgbnVtYmVyLCB3aXRoIDggYml0cyBlYWNoIGZvciBtYWpvciBudW1iZXIsIG1pbm9yIG51bWJlciBhbmQKICBwYXRjaCBudW1iZXIuIEluIG90aGVyIHdvcmRzLCB2ZXJzaW9uIDEuMi4zIHdvdWxkIG1ha2UgaXQgMHgwMTAyMDMuIEl0IGFsc28KICBtYWtlcyBhIGxhcmdlciBudW1iZXIgYSBuZXdlciB2ZXJzaW9uLgoKRGFuaWVsICgxNyBNYXkgMjAwMCkKLSBNYXJ0aW4gS2FtbWVyaG9mZXIgY29ycmVjdGx5IHBvaW50ZWQgb3V0IHNldmVyYWwgZmxhd3MgaW4gdGhlIEZUUCByYW5nZQogIG9wdGlvbi4gSSBjb3JyZWN0ZWQgdGhlbS4KLSBSZW1vdmVkIHRoZSB3aW4zMiB3aW5zb2NrIGluaXQgY3JhcCBmcm9tIHRoZSBsaWIgdG8gdGhlIHNyYy9tYWluLmMgZmlsZQogIGluIHRoZSBhcHBsaWNhdGlvbiBpbnN0ZWFkLiBUaGV5IGNhbid0IGJlIGluIHRoZSBsaWIsIGVzcGVjaWFsbHkgbm90IGZvcgogIG11bHRpdGhyZWFkZWQgcHVycG9zZXMuCgpEYW5pZWwgKDE2IE1heSAyMDAwKQotIFJld3JvdGUgdGhlIHNyYy9tYWluLmMgc291cmNlIHRvIHVzZSB0aGUgbmV3IGVhc3ktaW50ZXJmYWNlIHRvIGxpYmN1cmwgNy4KICBUaGVyZSBpcyBzdGlsbCBtb3JlIHdvcmsgdG8gZG8sIGJ1dCB0aGUgZmlyc3Qgc3RlcCBpcyBub3cgdGFrZW4uCiAgPGN1cmwvZWFzeS5oPiBpcyB0aGUgaW5jbHVkZSBmaWxlIHRvIHVzZS4KCkRhbmllbCAoMTQgTWF5IDIwMDApCi0gRlRQIFVSTHMgYXJlIG5vdyB0cmVhdGVkIHNsaWdodGx5IGRpZmZlcmVudCwgbW9yZSBhY2NvcmRpbmcgdG8gUkZDIDE3MzguCi0gRlRQIHNlc3Npb25zIGFyZSBub3cgcGVyZm9ybWVkIGRpZmZlcmVudGx5LCB3aXRoIENXRCBjb21tYW5kcyB0byBjaGFuZ2UKICBkaXJlY3RvcnkgaW5zdGVhZCBvZiBSRVRSL1NUT1IvTElTVCB3aXRoIHRoZSBmdWxsIHBhdGguIERpc2N1c3Npb25zIHdpdGgKICBSaWNoIEdyYXkgbWFkZSBtZSBub3RpY2UgdGhlc2UgcHJvYmxlbXMuCi0gSmFubmUgSm9oYW5zc29uIGRpc2NvdmVyZWQgYW5kIGNvcnJlY3RlZCBhIGJ1ZmZlciBvdmVyZmxvdyBpbiB0aGUKICBzcmMvdXNyZ2xvYi5jIGZpbGUuCi0gSSBoYWQgdG8gYWRkIGEgbGliL3N0cmVxdWFsLmMgZmlsZSBmb3IgZG9pbmcgY2FzZSBpbnNlbnNpdGl2ZSBzdHJpbmcKICBjb21wYXJlcyBvbiBhbGwgcGxhdGZvcm1zLgoKRGFuaWVsICg4IE1heSAyMDAwKToKLSBCZWVuIHdvcmtpbmcgbG90cyBvbiB0aGUgbmV3IGxpYi4KLSBUb2dldGhlciB3aXRoIFJpY2ggR3JheSwgSSd2ZSB0cmllZCB0byBhZGp1c3QgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gd29yawogIGJldHRlciBvbiB0aGUgTkNSIE1QLVJBUyBVbml4LgoKRGFuaWVsICgyIE1heSAyMDAwKToKLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIHBvaW50ZWQgb3V0IHRoYXQgSSBoYWQgYSBmZXcgdG9vIG1hbnkgaW5zdHJ1Y3Rpb25zIGluCiAgY29uZmlndXJlLmluIHRoYXQgZGlkbid0IGRvIGFueSBnb29kLgoKRGFuaWVsICgyNCBBcHJpbCAyMDAwKToKLSBBZGRlZCBhIG5ldyBwYXJhZ3JhcGggdG8gdGhlIEZBUSBhYm91dCB3aGF0IHRvIGRvIHdoZW4gY29uZmlndXJlIGNhbid0CiAgZmluZCBPcGVuU1NMIGV2ZW4gdGhvdWdoIGl0IGlzIGluc3RhbGxlZC4gU3VwcGxpZWQgYnkgQm9iIEFsbGlzb24KCkRhbmllbCAoMTIgQXByaWwgMjAwMCk6Ci0gU3RhcnRlZCBtZXNzaW5nIGFyb3VuZCBiaWctdGltZSB0byBjb252ZXJ0IHRoZSBvbGQgbGlicmFyeSBpbnRlcmZhY2UgdG8gYQogIGJldHRlciBvbmUuLi4KCkRhbmllbCAoOCBBcHJpbCAyMDAwKToKLSBNYWRlIHRoZSBwcm9ncmVzcyBiYXIgbG9vayBiZXR0ZXIgZm9yIGZpbGUgc2l6ZXMgYmV0d2VlbiA5OTk5IGtpbG9ieXRlcwogIGFuZCAxMDAgbWVnYWJ5dGVzLiBUaGV5J3JlIG5vdyBkaXNwbGF5ZWQgWFguWE0uCi0gSSBhbHNvIG5vdGljZWQgdGhhdCBmdHAgZmV0Y2hlcyB0aHJvdWdoIEhUVFAgcHJveGllcyBkaWRuJ3QgYWRkIHRoZSB1c2VyCiAgYWdlbnQgc3RyaW5nLiBJdCBkb2VzIG5vdy4KLSBIYWJpYmllIDxoYWJpYmllIGF0IE1haWxhbmROZXdzLmNvbT4gc3VwcGxpZWQgYSBwcmV0dHkgZ29vZCB3YXkgdG8gYnVpbGQgUlBNcwogIG9uIGEgTGludXggbWFjaGluZS4gSXQgc3RpbGwgYSkgcmVxdWlyZXMgbWUgdG8gYmUgcm9vdCB0byBkbyBpdCwgYikgbGVhdmVzCiAgdGhlIHJwbSBwYWNrYWdlcyBsYXlpbmcgYXQgc29tZSBvZGQgcGxhY2Ugb24gbXkgZGlzayBjKSBkb2Vzbid0IHdvcmsgdG8KICBidWlsZCB0aGUgc3NsIHZlcnNpb24gb2YgY3VybCBzaW5jZSBJIGRpZG4ndCBpbnN0YWxsIG9wZW5zc2wgZnJvbSBhbiBycG0KICBwYWNrYWdlIHNvIG5vdyB0aGUgcnBtIGNyYXAgdGhpbmtzIEkgZG9uJ3QgaGF2ZSBvcGVuc3NsIGFuZCByZWZ1c2VzIHRvIGJ1aWxkCiAgYSBwYWNrYWdlIHRoYXQgZGVwZW5kcyBvbiBzc2wuLi4gRGlkIEkgbWVudGlvbiBJIGRvbid0IGdldCBhbG9uZyB3aXRoIFJQTT8KLSBPbmNlIGFnYWluIEkgcmVjZWl2ZWQgYSBidWcgcmVwb3J0IGFib3V0IGF1dG9jb25mIG5vdCBzZXR0aW5nIC1MIHByaW9yIHRvIC1sCiAgb24gdGhlIGNvbW1hbmQgbGluZSB3aGVuIGNoZWNraW5nIGZvciBsaWJzLiBJbiB0aGlzIGNhc2UgaXQgbWFkZSB0aGUgbmF0aXZlCiAgY2MgY29tcGlsZXIgb24gU29sYXJpcyA3IHRvIGZhaWwgdGhlIE9wZW5TU0wgY2hlY2suIFRoaXMgaGFzIHByZXZpb3VzbHkgYmVlbgogIHJlcG9ydGVkIHRvIGNhdXNlIHByb2JsZW1zIG9uIEhQLVVYIGFuZCBpcyBhIGtub3duIGZsYXcgaW4gYXV0b2NvbmYgMi4xMy4gSXQKICBpcyBhIHBpdHkgdGhlcmUncyBubyBuZXdlciByZWxlYXNlIGFyb3VuZC4uLgoKRGFuaWVsICg0IEFwcmlsIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIHN1cHBsaWVkIG1lIHdpdGggdHdvIGZpeGVzIHRoYXQKICBhcHBlYXJhbnRseSBtYWtlcyB0aGUgT1MvMiBwb3J0IHdvcmsgYmV0dGVyIHdpdGggbXVsdGlwbGUgVVJMcy4KCkRhbmllbCAoMiBBcHJpbCAyMDAwKToKLSBBbm90aGVyIExvY2F0aW9uOiBmaXguIFRoaXMgdGltZSwgd2hlbiBjdXJsIGNvbm5lY3RlZCB0byBhIHBvcnQgYW5kIHRoZW4KICBmb2xsb3dlZCBhIGxvY2F0aW9uIHdpdGggYW4gYWJzb2x1dGUgVVJMIHRvIGFub3RoZXIgcG9ydCwgaXQgbWlzYmVoYXZlZC4KCkRhbmllbCAoMjcgTWFyY2ggMjAwMCk6Ci0gSC4gRGFwaG5lIEx1b25nIHBvaW50ZWQgb3V0IHRoYXQgY3VybCB3YXMgd3JvbmdseQogIG1lc3NpbmcgdXAgdGhlIHByb3h5IHN0cmluZyB3aGVuIGZldGNoaW5nIGEgZG9jdW1lbnQgdGhyb3VnaCBhIGh0dHAgcHJveHksCiAgd2hpY2ggc2NyZXdlZCB1cCBtdWx0aXBsZSBmZXRjaGVzIHN1Y2ggYXMgaW4gbG9jYXRpb246IGZvbGxvd2luZ3MuCgpEYW5pZWwgKDIzIE1hcmNoIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIGNvcnJlY3RlZCBteSBiYWRseSBhcHBsaWVkIHBhdGNoIGhlCiAgYWN0dWFsbHkgYWxyZWFkeSB0b2xkIG1lIGFib3V0IQoKLSBILiBEYXBobmUgTHVvbmcgYnJvdWdodCBtZSBhIGZpeCB0aGF0IG5vdyBtYWtlcyBjdXJsCiAgaWdub3JlIHNlbGVjdCgpIGVycm9ycyBpbiB0aGUgZG93bmxvYWQgaWYgZXJybm8gaXMgRUlOVFIsIHdoaWNoIHR1cm5zIG91dCB0bwogIGhhcHBlbiBldmVyeSBub3cgYW5kIHRoZW4gd2hlbiB1c2luZyBsaWJjdXJsIG11bHRpLXRocmVhZGVkLi4uCgpEYW5pZWwgKDIyIE1hcmNoIDIwMDApOgotIFdoYW0gQmFuZyBzdXBwbGllZCBhIGNvdXBsZSBvZiB3aW4zMiBmaXhlcy4gSEFWRV9VTkFNRQogIHdhcyBhY2NpZGVudGFsbHkgI2RlZmluZWQgaW4gY29uZmlnLXdpbjMyLmgsIHdoaWNoIGl0IHNob3VsZG4ndCBoYXZlIGJlZW4uCiAgVGhlIEhBVkVfVU5JU1REX0ggaXMgbm90IGRlZmluZWQgd2hlbiBjb21waWxpbmcgd2l0aCB0aGUgTWFrZWZpbGUudmM2CiAgbWFrZWZpbGUgZm9yIE1TIFZDKysuCgpEYW5pZWwgKDIxIE1hcmNoIDIwMDApOgotIEkgcmVtb3ZlZCB0aGUgQUNfUFJPR19JTlNUQUxMIG1hY3JvIGZyb20gY29uZmlndXJlLmluLCBzaW5jZSBpdCBhcHBlYXJzIHRoYXQKICBvbmUgb2YgdGhlIEFNXyogbWFjcm9zIHNlYXJjaGVzIGZvciBhIEJTRCBjb21wYXRpYmxlIGluc3RhbGwgYWxyZWFkeS4gSmFubmUKICBKb2hhbnNzb24gbWFkZSBtZSBhd2FyZSBvZiB0aGlzLgoKVmVyc2lvbiA2LjUuMgoKRGFuaWVsICgyMSBNYXJjaCAyMDAwKToKLSBQYXVsIEhhcnJpbmd0b24gcXVpY2tseSBwb2ludGVkIG91dCB0byBtZSB0aGF0IDYuNS4xCiAgY3Jhc2hlcyBoYXJkLiBJIHVwbG9hZCA2LjUuMiBub3cgYXMgcXVpY2tseSBhcyBwb3NzaWJsZSEgVGhlIHByb2JsZW0gd2FzCiAgdGhlIC1EIGFkanVzdG1lbnRzIGluIHNyYy9tYWluLmMuCgpWZXJzaW9uIDYuNS4xCgpEYW5pZWwgKDIwIE1hcmNoIDIwMDApOgotIEFuIGFub255bW91cyBwb3N0IG9uIHNvdXJjZWZvcmdlIGNvcnJlY3RseSBwb2ludGVkIG91dCBhIHBvc3NpYmxlIGJ1ZmZlcgogIG92ZXJmbG93IGluIHRoZSBjdXJsX3VuZXNjYXBlKCkgZnVuY3Rpb24gZm9yIFVSTCBjb252ZXJzaW9ucy4gVGhlIG1haW4KICBwcm9ibGVtIHdpdGggdGhpcyBidWcgaXMgdGhhdCB0aGUgZnRwIGRvd25sb2FkIHVzZXMgdGhhdCBmdW5jdGlvbiBhbmQgdGhpcwogIHNpbmdsZS0gYnl0ZSBvdmVyZmxvdyBjb3VsZCBsZWFkIHRvIHZlcnkgb2RkIGJ1Z3MgKGFzIG9uZSByZXBvcnRlZCBieSBKYW5uZQogIEpvaGFuc3NvbikuCgpEYW5pZWwgKDE5IE1hcmNoIDIwMDApOgotIE1hcmNvIEcuIFNhbHZhZ25vIHN1cHBsaWVkIG1lIHdpdGggYSBzZXJpZXMgb2YgcGF0Y2hlcwogIHRoYXQgbm93IGFsbG93cyBjdXJsIHRvIGdldCBjb21waWxlZCBvbiBPUy8yLiBJdCBldmVuIGluY2x1ZGVzIGEgc2VjdGlvbiBpbgogIHRoZSBJTlNUQUxMIGZpbGUuIFZlcnkgbmljZSBqb2IhCgpEYW5pZWwgKDE3IE1hcmNoIDIwMDApOgotIFdoYW0gQmFuZyBzdXBwbGllZCBhIHBhdGNoIGZvciB0aGUgbGliL01ha2VmaWxlLnZjNgogIGZpbGUuIFdlIHN0aWxsIG5lZWQgc29tZSBmaXhlcyBmb3IgdGhlIGNvbmZpZy13aW4zMi5oIHNpbmNlIGl0IGFwcGVhcnMgdGhhdAogIFZDKysgYW5kIG1pbmd3MzIgaGF2ZSBkaWZmZXJlbnQgb3BpbmlvbnMgYWJvdXQgKGF0IGxlYXN0KSB1bmlzdGQuaCdzCiAgZXhpc3RlbmNlLgoKRGFuaWVsICgxNSBNYXJjaCAyMDAwKToKLSBJIG1vZGlmaWVkIHRoZSAtRC8tLWR1bXAtaGVhZGVyIHdvcmtpbmdzIHNvIHRoYXQgaXQgZG9lc24ndCB3cml0ZSBhbnl0aGluZwogIHRvIHRoZSBmaWxlIHVudGlsIGl0IG5lZWRzIHRvLiBUaGlzIHdheSwgeW91IGNhbiBhY3R1YWxseSB1c2UgLWIgYW5kIC1ECiAgb24gdGhlIHNhbWUgZmlsZSBpZiB5b3Ugd2FudCByZXBlYXRlZCBpbnZva2VzIHRvIHN0b3JlIGFuZCByZWFkIHRoZSBjb29raWVzCiAgaW4gdGhhdCBvbmUgc2luZ2xlIGZpbGUuCgotIFBva2VkIGFyb3VuZCBpbiBsb3RzIG9mIHRleHRzLiBBZGRlZCB0aGUgQlVHUyBmaWxlIGZvciBidWcgcmVwb3J0aW5nIHN0dWZmLgogIEFkZGVkIHRoZSBjbGFzc2ljIEhUVFAgUE9TVCBxdWVzdGlvbiB0byB0aGUgRkFRLCByZW1vdmVkIHNvbWUgI2lmZGVmIFdJTjMyCiAgc3R1ZmYgZnJvbSB0aGUgc291cmNlcyAodGhleSdyZSBjb3ZlcmVkIGJ5IHRoZSBjb25maWctd2luMzIuaCBub3cpLgoKLSBQYXNjYWwgR2F1ZGV0dGUgZml4ZWQgYSBtaXNzaW5nIGxkYXAuYyBwcm9ibGVtIGluIHRoZQogIE1ha2VmaWxlLnZjNiBmaWxlLiBIZSBhbHNvIGFkZHJlc3NlZCBhIHByb2JsZW0gaW4gc3JjL2NvbmZpZy13aW4zMi5oLgoKRGFuaWVsICgxNCBNYXJjaCAyMDAwKToKLSBQYXVsIEhhcnJpbmd0b24gcG9pbnRlZCBvdXQgdGhhdCB0aGUgJ2h0dHBfY29kZScgdmFyaWFibGUgaW4gdGhlIC13IG91dHB1dAogIHdhcyBuZXZlciB3cml0dGVuLiBJIGZpeGVkIGl0IG5vdy4KCi0gSmFubmUgSm9oYW5zc29uIHJlcG9ydGVkIHRoZSBjb21wbGFpbnRzIHRoYXQgT3BlbkJTRCBkb2VzCiAgd2hlbiBnZXRkYXRlLmMgI2luY2x1ZGVzIG1hbGxvYy5oLiBJdCBjbGFpbXMgc3RkbGliLmggc2hvdWxkIGJlIGluY2x1ZGVkCiAgaW5zdGVhZC4gSSBhZGRlZCAjaWZkZWYgSEFWRV9NQUxMT0NfSCBjb2RlIGluIGdldGRhdGUueSBhbmQgdHdvIGNoZWNrcyBpbgogIHRoZSBjb25maWd1cmUuaW4gZm9yIG1hbGxvYy5oIGFuZCBzdGRsaWIuaC4KClZlcnNpb24gNi41CgpEYW5pZWwgKDEzIE1hcmNoIDIwMDApOgotIDxjdXJsIGF0IHNwYW0ud29sdmVzYmFuZS5uZXQ+IHBvaW50ZWQgb3V0IHRoYXQgdGhlIHdheSBjdXJsIHNlbnQgY29va2llcyBpbiBhCiAgc2luZ2xlIGxpbmUgd2Fzbid0IGVuam95ZWQgYnkgSUlTNC4wIHNlcnZlcnMuIEluIG15IHZpZXcsIHRoYXQgaXMgbm90IHdoYXQKICB0aGUgc3RhbmRhcmRzIHNheSwgYnV0IEkgYWRkZWQgYSB3aGl0ZSBzcGFjZSBiZXR3ZWVuIHRoZSBuYW1lL3ZhbHVlIHBhaXJzIHRvCiAgcGVyaGFwcyBtYWtlIHRoZW0gd29yayBiZXR0ZXIuCgotIEFkZGVkIHRoZSBwZXJsIGNoZWNrIGJhY2sgaW4gdGhlIGNvbmZpZ3VyZS5pbiBhZ2FpbiBzaW5jZSB0aGUgbWtoZWxwLnBsCiAgc2NyaXB0IG5lZWRzIGl0IQoKLSBNYWRlIHNvbWUgYmVhdXRpZmljYXRpb25zIGluIHRoZSBjdXJsIG1hbiBwYWdlLgoKRGFuaWVsICgzIE1hcmNoIDIwMDApOgotIEr2cm4gaGVscGVkIG1lIHVwZGF0ZSB0aGUgY29uZmlnLXdpbjMyLmggZmlsZXMgd2l0aCBIQVZFX1NFVFZCVUYgYW5kCiAgSEFWRV9TVFJEVVAuCgpEYW5pZWwgKDMgTWFyY2ggMjAwMCk6Ci0gVXBsb2FkZWQgdGhlIDYuNXByZTIgcGFja2FnZS4KCkRhbmllbCAoMiBNYXJjaCAyMDAwKToKLSBSZW1vdmVkIHRoZSBwZXJsLXByb2dyYW1zIGZyb20gdGhlIGRpc3RyaWJ1dGlvbiwgdGhleSBuZXZlciBtYWRlIG1hbnkgcGVvcGxlCiAgaGFwcHkgYW5kIEknbGwgc3RpbGwga2VlcCB0aGVtIGF2YWlsYWJsZSBvbiB0aGUgd2ViLgoKLSBBZGRlZCB0aGUgLXcgYW5kIC1OIHN0dWZmIHRvIHRoZSBtYW4gcGFnZS4gRG9jdW1lbnRlZCB0aGUgbmV3IHByb2dyZXNzIG1ldGVyCiAgZGlzcGxheSBpbiBSRUFETUUuY3VybC4KCi0gSvZybiBIYXJ0cm90aCwgQ2hyaXMgPGNiYXlsaXNzIGF0IGNzYy5jb21lPiBhbmQgVWxmCiAgTfZsbGVyIGZyb20gdGhlIG9wZW5zc2wgZGV2ZWxvcG1lbnQgdGVhbSBoZWxwZWQgYnJpbmdpbmcgbWUgdGhlIGRldGFpbHMgZm9yCiAgZml4aW5nIGFuIE9wZW5TU0wgdXNhZ2UgZmxhdy4gSXQgYmVjYW1lIGFwcGFyZW50IHdoZW4gdGhleSByZWxlYXNlZCBvcGVuc3NsCiAgMC45LjUgc2luY2UgdGhhdCBiYXJmZWQgb24gY3VybCdzIGJhZCBiZWhhdmlvciAobm90IHNlZWRpbmcgYSByYW5kb20gbnVtYmVyCiAgdGhpbmcpLgoKLSBZZXQgYW5vdGhlciBvcHRpb246IC1OLy0tbm8tYnVmZmVyIGRpc2FibGVzIGJ1ZmZlcmluZyBpbiB0aGUgb3V0cHV0IHN0cmVhbS4KICBQcm9iYWJseSBtb3N0IHVzZWZ1bCBmb3IgdmVyeSBzbG93IHRyYW5zZmVycyB3aGVuIHlvdSByZWFsbHkgd2FudCB0byBnZXQKICBldmVyeSBieXRlIGN1cmwgcmVjZWl2ZXMgd2l0aGluIHNvbWUgcHJlZmVycmVkIHRpbWUuIEFuZHJldyA8dG1yIGF0IGdjaS5uZXQ+CiAgc3VnZ2VzdGVkIHRoaXMuCgotIERhbWllbiBBZGFudCBtYWlsZWQgbWUgaGlzIGZpeGVzIGZvciBtYWtpbmcgY3VybCBjb21waWxlIG9uIFVsdHJpeC4KCkRhbmllbCAoMjQgRmVicnVhcnkgMjAwMCk6Ci0gQXBwbGllZCBK9nJuIEhhcnRyb3RoJ3MgZml4ZXMgZm9yIGNvbmZpZy13aW4zMi5oIGFuZCBsaWIvTWFrZWZpbGUudzMyLgoKICBJIHNob3VsZCBhbHNvIG1ha2UgYSBub3RlIGhlcmUsIGlmIG5vdGhpbmcgZWxzZSB0byBteXNlbGYsIHRoYXQgd2hlbiB1c2luZwogIHRoZSAlLXN5bnRheCBmb3IgdmFyaWFibGVzIGluIERPUyBjb21tYW5kIHByb21wdHMsIHlvdSBtdXN0IHVzZSB0d28gJS0KICBsZXR0ZXJzIGZvciBlYWNoIG9uZSBzaW5jZSB0aGF0IGlzIGFuIGVzY2FwZSBsZXR0ZXIgdGhlcmUhIE1heWJlIEkgc2hvdWxkCiAgdXNlIGFub3RoZXIgbGV0dGVyIGluc3RlYWQhCgotIEFkZGVkIG1vcmUgdmFyaWFibGVzIHRvIC13OgoKICAnaHR0cF9jb2RlJwogICd0aW1lX25hbWVsb29rdXAnCiAgJ3RpbWVfY29ubmVjdCcKICAndGltZV9wcmV0cmFuc2ZlcicKICAndXJsX2VmZmVjdGl2ZScKCi0gTWFkZSAtd0BmaWxlbmFtZSByZWFkIHRoZSBzeW50YXggZnJvbSBhIGZpbGUgYW5kIC13QC0gcmVhZHMgdGhlIHN5bnRheCBmcm9tCiAgc3RkaW4gaW4gdGhlIGdvb2Qgb2xkICJzdGFuZGFyZCIgY3VybCB3YXkuCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDApOgotIFJlbGVhc2VkIGEgNi41cHJlMSB2ZXJzaW9uIHRvIGdldCBzb21lIHRlc3QgYW5kIHVzZXIgZmVlZGJhY2suCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDApOgoKLSBJIGFkZGVkIHRoZSAtdy8tLXdyaXRlLW91dCBmbGFnIGFuZCBzb21lIHZhcmlhYmxlcyB0byBnbyB3aXRoIGl0LiAtdyBpcyBhCiAgc2luZ2xlIHN0cmluZywgd2hhdGV2ZXIgeW91IGVudGVyIHRoZXJlIHdpbGwgYmUgd3JpdHRlbiBvdXQgd2hlbiBjdXJsIGhhcwogIGNvbXBsZXRlZCBhIHN1Y2Nlc3NmdWwgcmVxdWVzdC4gVGhlcmUgYXJlIHNvbWUgdmFyaWFibGUgc3Vic3RpdHV0aW9ucyBhbmQKICB0aGV5IGFyZSBzcGVjaWZpZWQgYXMgJyV7dmFyaWFibGV9JyAod2l0aG91dCB0aGUgcXVvdGVzKS4gVmFyaWFibGVzIHRoYXQKICBleGlzdCBhcyBvZiB0aGlzIG1vbWVudCBhcmU6CgogICAgICAgIHRvdGFsX3RpbWUgICAgIC0gdG90YWwgdHJhbnNmZXIgdGltZSBpbiBzZWNvbmRzICh3aXRoIDIgZGVjaW1hbHMpCiAgICAgICAgc2l6ZV9kb3dubG9hZCAgLSB0b3RhbCBkb3dubG9hZGVkIGFtb3VudCBvZiBieXRlcwogICAgICAgIHNpemVfdXBsb2FkICAgIC0gdG90YWwgdXBsb2FkZWQgYW1vdW50IG9mIGJ5dGVzCiAgICAgICAgc3BlZWRfZG93bmxvYWQgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIGRvd25sb2FkCiAgICAgICAgc3BlZWRfdXBsb2FkICAgLSB0aGUgYXZlcmFnZSBzcGVlZCBvZiB0aGUgZW50aXJlIHVwbG9hZAoKICBJIHdpbGwgb2YgY291cnNlIGFkZCBtb3JlIHZhcmlhYmxlcywgYnV0IEkgbmVlZCBpbnB1dCBvbiB0aGVzZSBhbmQgb3RoZXJzLgoKLSBJdCBzdHJ1Y2sgbWUgdGhhdCB0aGUgLSMgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgaGFyZCB0byBqdXN0IGFwcGx5IG9uIHRoZSBuZXcKICBwcm9ncmVzcyBiYXIgY29uY2VwdC4gSSBuZWVkIHNvbWUgZmVlZGJhY2sgb24gdGhpcyBiZWZvcmUgdGhhdCdsbCBnZXQgcmUtCiAgaW50cm9kdWNlZCEgOi0vCgpEYW5pZWwgKDE2IEZlYnJ1YXJ5IDIwMDApOgotIEr2cm4gSGFydHJvdGggYnJvdWdodCBtZSBzb21lIGZpeGVzIGZvciB0aGUgcHJvZ3Jlc3MgbWV0ZXIgYW5kIEkgY29udGludWVkCiAgd29ya2luZyBvbiBpdC4gSXQgc2VlbXMgdG8gd29yayBmb3IgaHR0cCBkb3dubG9hZCwgaHR0cCBwb3N0LCBmdHAgZG93bmxvYWQKICBhbmQgZnRwIHVwbG9hZC4gSXQgc2hvdWxkIGJlIGEgcHJldHR5IGdvb2QgdGVzdCBpdCB3b3JrcyBnZW5lcmFsbHkgZ29vZC4KCi0gU3RpbGwgbmVlZCB0byBhZGQgdGhlIC0jIHByb2dyZXNzIGJhciBpbnRvIHRoZSBuZXcgc3R5bGUgcHJvZ3Jlc3MgaW50ZXJmYWNlLgoKLSBHb25uYSBoYXZlIGEgZ28gYXQgbXkgbmV3IG91dHB1dCBvcHRpb24gcGFyYW1ldGVyIG5leHQuCgpEYW5pZWwgKDE1IEZlYnJ1YXJ5IDIwMDApOgotIFRoZSBwcm9ncmVzcyBtZXRlciBzdHVmZiBpcyBzbG93bHkgdGFraW5nIHBsYWNlLiBUaGVyZSdzIG1vcmUgbGVmdCBiZWZvcmUgaXQKICBpcyB3b3JraW5nIG9rIGFuZCBldmVyeXRoaW5nIGlzIHRlc3RlZCwgYnV0IHdlJ3JlIHJlYWNoaW5nIHRoZXJlLiBTbG93bHkhCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDApOgotIFBhdWwgTWFycXVpcyBmaXhlZCB0aGUgY29uZmlnIGZpbGUgcGFyc2luZyBvZiBjdXJsIHRvCiAgZGVhbCB3aXRoIGFueS1sZW5ndGggbGluZXMsIHJlbW92aW5nIHRoZSBwcmV2aW91cyBsaW1pdCBvZiA0Sy4KCi0gRWV0dSBPamFuZW4ncyBzdWdnZXN0aW9uIG9mIHN1cHBvcnRpbmcgdGhlIEAtc3R5bGUgZm9yIC1iCiAgaXMgaW1wbGVtZW50ZWQuIE5vdyAtYkA8ZmlsZW5hbWU+IHdvcmtzIGFzIHdlbGwgYXMgdGhlIG9sZCBzdHlsZS4gLWJALSBhbHNvCiAgc2ltaWxhcmx5IHJlYWRzIHRoZSBjb29raWVzIGZyb20gc3RkaW4uCgotIFJlbWluZGVyOiAtRCBzaG91bGQgbm90IHdyaXRlIHRvIHRoZSBmaWxlIHVudGlsIGl0IG5lZWRzIHRvLCBpbiB0aGUgc2FtZSB3YXkKICAtbyBkb2VzLiBUaGF0IHdvdWxkIGVuYWJsZSBjdXJsIHRvIHVzZSAtYiBhbmQgLUQgb24gdGhlIHNhbWUgZmlsZS4uLgoKLSBFbGxpcyBQcml0Y2hhcmQgbWFkZSBnZXRkYXRlLnkgd29yayBmb3IgTWFjT1MgWC4KCi0gUGF1bCBIYXJyaW5ndG9uIGhlbHBlZCBtZSBvdXQgZmluZGluZyB0aGUgY3Jhc2ggaW4gdGhlCiAgY29va2llIHBhcnNlci4gSGUgYWxzbyBwb2ludGVkIG91dCBjdXJsJ3MgaGFiaXQgb2Ygc2VuZGluZyBlbXB0eSBjb29raWVzIHRvCiAgdGhlIHNlcnZlci4KCkRhbmllbCAoOCBGZWJydWFyeSAyMDAwKToKIC0gUm9uIFphcHAgY29ycmVjdGVkIGEgcHJvYmxlbSBpbiBzcmMvdXJsZ2xvYi5jIHRoYXQKICAgcHJldmVudGVkIGN1cmwgZnJvbSBnZXR0aW5nIGNvbXBpbGVkIG9uIHN1bm9zIDQuIFRoZSBwcm9ibGVtIGhhZCB0byBkbwogICB3aXRoIHRoZSBkaWZmZXJlbmNlIGluIHNwcmludGYoKSByZXR1cm4gY29kZSB0eXBlcy4KCiAtIFRyYW5zZmVyKCkgc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGRvd25sb2FkIGFuZCB1cGxvYWQgc2ltdWx0YW5lb3VzbHkuIExldCdzCiAgIGRvIHNvbWUgcHJvZ3Jlc3MgbWV0ZXIgZml4ZXMgbGF0ZXIgdGhpcyB3ZWVrLgoKRGFuaWVsICgzMSBKYW51YXJ5IDIwMDApOgogLSBQYXVsIEhhcnJpbmd0b24gZm91bmQgYW5vdGhlciBjb3JlIGR1bXAgaW4gdGhlIGNvb2tpZQogICBwYXJzZXIuIEN1cmwgZG9lc24ndCBwcm9wZXJseSByZWNvZ25pemUgdGhlICd2ZXJzaW9uJyBrZXl3b3JkIGFuZCBJIHRoaW5rCiAgIHRoYXQgaXMgd2hhdCBjYXVzZWQgdGhpcy4gSSBuZWVkIHRvIHJlZnJlc2ggc29tZSBzcGVjcyBvbiBjb29raWVzIGFuZCBzZWUKICAgd2hhdCBlbHNlIGN1cmwgbGFja3MgdG8gaW1wcm92ZSB0aGlzIGEgYml0IG1vcmUgb25jZSBhbmQgZm9yIGFsbC4KCiAgIFJGQyAyMTA5IGNsZWFybHkgc3BlY2lmaWVzIGhvdyBjb29raWVzIHNob3VsZCBiZSBkZWFsdCB3aXRoIHdoZW4gdGhleSBhcmUKICAgY29tcGxpYW50IHdpdGggdGhhdCBzcGVjLiBJIGRvbid0IHRoaW5rIG1hbnkgc2VydmVycyBhcmUgdGhvdWdoLi4uCgogLSBNYXJrIFcuIEVpY2hpbiBmb3VuZCB0aGF0IHdoaWxlIGN1cmwgaXMgdXBsb2FkaW5nIGEgZm9ybQogICB0byBhIHdlYiBzaXRlLCBpdCBkb2Vzbid0IHJlYWQgaW5jb21pbmcgZGF0YSB3aHkgaXQnbGwgaGFuZyBhZnRlciBhIHdoaWxlCiAgIHNpbmNlIHRoZSBzb2NrZXQgInBpcGUiIGJlY29tZXMgZnVsbC4KCiAgIEl0IHRvb2sgbWUgdHdvIGhvdXJzIHRvIHJld3JpdGUgRG93bmxvYWQoKSBhbmQgVXBsb2FkKCkgaW50byB0aGUgbmV3CiAgIHNpbmdsZSBmdW5jdGlvbiBUcmFuc2ZlcigpLiBJdCBldmVuIHNlZW1zIHRvIHdvcmshIE1vcmUgdGVzdGluZyBpcyByZXF1aXJlZAogICBvZiBjb3Vyc2UuLi4gSSBzaG91bGQgZ2V0IHRoZSBoZWFkZXItc2VuZGluZyB0b2dldGhlciBpbiBhIGtpbmQgb2YgcXVldWUKICAgYW5kIGxldCB0aGVtIGdldCAidXBsb2FkZWQiIGluIFRyYW5zZmVyKCkgYXMgd2VsbC4KCiAtIFpoaWJpYW8gV3UgcG9pbnRlZCBvdXQgYSBjdXJsIGJ1ZyBpbiB0aGUgbG9jYXRpb246IGFyZWEsCiAgIGFsdGhvdWdoIEkgZGlkIG5vdCBnZXQgYSByZXByb2R1Y2libGUgd2F5IHRvIGRvIHRoaXMgd2h5IEkgaGF2ZSB0byB3YWl0CiAgIHdpdGggZml4aW5nIGFueXRoaW5nLgoKIC0gQm9iIFNjaGFkZXIgc3VnZ2VzdGVkIEkgc2hvdWxkIGltcGxlbWVudCByZXN1bWUKICAgc3VwcG9ydCBmb3IgdGhlIEhUVFAgUFVUIG9wZXJhdGlvbiwgYW5kIGFzIEkgdGhpbmsgaXQgaXMgYSB2YWxpZCBzdWdnZXN0aW9uCiAgIEknbGwgd29yayBvbiBpdC4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDAwKToKIC0gTSBUcmF2aXMgT2JlbmhhdXMgcG9pbnRlZCBvdXQgYSBtYW51YWwgbWl4dXAgd2l0aCAteSBhbmQgLVkgdGhhdCB3YXMKICAgY29ycmVjdGVkLgoKIC0gSmVucyBTY2hsZXVzZW5lciBwb2ludGVkIG91dCBhIHByb2JsZW0gdG8gY29tcGlsZQogICBjdXJsIG9uIEFJWCA0LjEuNCBhbmQgZ2F2ZSBtZSBhIHNvbHV0aW9uLiBUaGlzIHByb2JsZW0gd2FzIGFscmVhZHkgZml4ZWQKICAgYnkgSvZybidzIHJlY2VudCAjaW5jbHVkZSBtb2RpZmljYXRpb25zIQoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDApOgogLSBPc2thciBMaWxqZWJsYWQgcG9pbnRlZCBvdXQgYW5kIGNvcnJlY3RlZCBhIHByb2JsZW0KICAgaW4gdGhlIExvY2F0aW9uOiBmb2xsb3dpbmcgc3lzdGVtIHRoYXQgbWFkZSBjdXJsIGZvbGxvd2luZyBhIGxvY2F0aW9uOiB0byBhCiAgIGRpZmZlcmVudCBwcm90b2NvbCB0byBmYWlsLgoKICAgQXQgSmFudWFyeSAzMXN0IEkgcmUtY29uc2lkZXJlZCB0aGlzIGZpeCBhbmQgdGhlIHN1cnJvdW5kaW5nIHNvdXJjZSBjb2RlLiBJCiAgIGNvdWxkIG5vdCByZWFsbHkgc2VlIHRoYXQgdGhlIHBhdGNoIGRpZCBhbnkgZGlmZmVyZW5jZSwgd2h5IEkgcmVtb3ZlZCBpdAogICBhZ2FpbiBmb3IgZnVydGhlciByZXNlYXJjaCBhbmQgZGVidWdnaW5nLiAoSXQgZGlzYWJsZWQgbG9jYXRpb246IGZvbGxvd2luZwogICBvbiBzZXJ2ZXIgbm90IHJ1bm5pbmcgb24gZGVmYXVsdCBwb3J0cy4pCgogLSBK9nJuIEhhcnRyb3RoIGJyb3VnaHQgYSBmaXggdGhhdCBvbmNlIGFnYWluCiAgIG1hZGUgaXQgcG9zc2libGUgdG8gc2VsZWN0IHByb2dyZXNzIGJhci4KCiAtIEr2cm4gYWxzbyBmaXhlZCBhIGZldyBpbmNsdWRlIHByb2JsZW1zLgoKVmVyc2lvbiA2LjQKCkRhbmllbCAoMTcgSmFudWFyeSAyMDAwKToKIC0gQmFzZWQgb24gc3VnZ2VzdGlvbnMgZnJvbSBCavZybiBTdGVuYmVyZywgSSBtYWRlIHRoZQogICBwcm9ncmVzcyBkZWFsIGJldHRlciB3aXRoIGxhcmdlciBmaWxlcyBhbmQgYWRkZWQgYSAiVGltZSIgZmllbGQgd2hpY2ggc2hvd3MKICAgdGhlIHRpbWUgc3BlbnQgb24gdGhlIGRvd25sb2FkIHNvIGZhci4KIC0gSSdtIG5vdyB1c2luZyB0aGUgQ1ZTIHJlcG9zaXRvcnkgb24gc291cmNlZm9yZ2UubmV0LCB3aGljaCBhbHNvIGFsbG93cyB3ZWIKICAgYnJvd3NpbmcuIFNlZSBodHRwOi8vY3VybC5oYXh4Lm51LgoKRGFuaWVsICgxMCBKYW51YXJ5IDIwMDApOgogLSBSZW51bWJlcmVkIHNvbWUgZW51bXMgaW4gY3VybC9jdXJsLmggc2luY2UgdGFnIG51bWJlciAzNSB3YXMgdXNlZCB0d2ljZSEKIC0gQWRkZWQgInBvc3RxdW90ZSIgc3VwcG9ydCB0byB0aGUgZnRwIHNlY3Rpb24gdGhhdCBlbmFibGVzIHBvc3QtZnRwLXRyYW5zZmVyCiAgIHF1b3RlIGNvbW1hbmRzLgogLSBOb3cgbWFkZSB0aGUgLVEvLS1xdW90ZSBwYXJhbWV0ZXIgcmVjb2duaXplICctJyBhcyBhIHByZWZpeCwgd2hpY2ggbWVhbnMKICAgdGhhdCBjb21tYW5kIHdpbGwgYmUgaXNzdWVkIEFGVEVSIGEgc3VjY2Vzc2Z1bCBmdHAgdHJhbnNmZXIuIFRoaXMgY2FuIG9mCiAgIGNvdXJzZSBiZSB1c2VkIHRvIGRlbGV0ZSBvciByZW5hbWUgYSBmaWxlIGFmdGVyIGl0IGhhcyBiZWVuIHVwbG9hZGVkIG9yCiAgIGRvd25sb2FkZWQuIFVzZSB5b3VyIGltYWdpbmF0aW9uISA7LSkKIC0gU2luY2UgSSBkbyB0aGUgbWFpbiBkZXZlbG9wbWVudCBvbiBzb2xhcmlzIDIuNiBub3csIEkgaGFkIHRvIGRvd25sb2FkIGFuZAogICBpbnN0YWxsIEdOVSBncm9mZiB0byBnZW5lcmF0ZSB0aGUgaHVnZWhlbHAuYyBmaWxlLiBUaGUgc29sYXJpcyBucm9mZiBjb3JlcwogICBvbiB0aGUgbWFuIHBhZ2UhIFNvLCBpbiBvcmRlciB0byBtYWtlIHRoZSBzb2xhcmlzIGNvbmZpZ3VyZSBzY3JpcHQgZmluZCBhCiAgIGJldHRlciByZXN1bHQgSSBtYWRlIGducm9mZiBnZXQgY2hlY2tlZCBwcmlvciB0byB0aGUgcmVndWxhciBucm9mZi4KIC0gQWRkZWQgYWxsIHRoZSBjdXJsIGV4aXQgY29kZXMgdG8gdGhlIG1hbiBwYWdlLgogLSBKaW0gR2FsbGFnaGVyIHByb3Blcmx5IHRyYWNrZWQgZG93biBhIGJ1ZyBpbiBhdXRvY29uZgogICAyLjEzLiBUaGUgQUNfQ0hFQ0tfTElCKCkgbWFjcm8gd3JvbmdmdWxseSB1c2VzIHRoZSAtbCBmbGFnIGJlZm9yZSB0aGUgLUwKICAgZmxhZyB0byAnbGQnIHdoaWNoIGNhdXNlcyB0aGUgSFAtVVggMTAuMjAgZmxhdm91ciB0byBmYWlsIG9uIGFsbCBsaWJjaGVja3MKICAgYW5kIHRoZXJlZm9yZSB5b3UgY2FuJ3QgbWFrZSB0aGUgY29uZmlndXJlIHNjcmlwdCBmaW5kIHRoZSBvcGVuc3NsIGxpYnMhCgpEYW5pZWwgKDI4IERlY2VtYmVyIDE5OTkpOgogLSBUaW0gVmVyaG9ldmVuIGNvcnJlY3RseSBpZGVudGlmaWVkIHRoYXQgY3VybAogICBkb2Vzbid0IHN1cHBvcnQgVVJMIGZvcm1hdHRlZCBmaWxlIG5hbWVzIHdoZW4gZ2V0dGluZyBmdHAuIE5vdywgdGhlcmUncyBhCiAgIHByb2JsZW0gd2l0aCBnZXR0aW5nIHZlcnkgd2VpcmQgZmlsZSBuYW1lcyBvZmYgRlRQIHNlcnZlcnMuIFJGQyA5NTkgZGVmaW5lcwogICB0aGF0IHRoZSBmaWxlIG5hbWUgc3ludGF4IHRvIHVzZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgaW4gdGhlIG5hdGl2ZSBPUyBvZgogICB0aGUgc2VydmVyLiBTaW5jZSB3ZSBkb24ndCBrbm93IHRoZSBwZWVyIHNlcnZlciBzeXN0ZW0gd2UgY3VycmVudGx5IGp1c3QKICAgdHJhbnNsYXRlIHRoZSBVUkwgc3ludGF4IGludG8gcGxhaW4gbGV0dGVycy4gSXQgaXMgc3RpbGwgYmV0dGVyIGFuZCB3aXRoCiAgIHRoZSBzb2xhcmlzIDIuNi1zdXBwbGllZCBmdHAgc2VydmVyIGl0IHdvcmtzIHdpdGggc3BhY2VzIGluIHRoZSBmaWxlIG5hbWVzLgoKRGFuaWVsICgyNyBEZWNlbWJlciAxOTk5KToKIC0gV2hlbiBjdXJsIHBhcnNlZCBjb29raWVzIHN0cmFpZ2h0IG9mZiBhIHJlbW90ZSBzaXRlLCBpdCBjb3JydXB0ZWQgdGhlIGlucHV0CiAgIGRhdGEsIHdoaWNoLCBpZiB0aGUgZG93bmxvYWRlZCBoZWFkZXJzIHdlcmUgc3RvcmVkIG1hZGUgdmVyeSBvZGQgY2hhcmFjdGVycwogICBpbiB0aGUgc2F2ZWQgZGF0YS4gQ29ycmVjdGx5IGlkZW50aWZpZWQgYW5kIHJlcG9ydGVkIGJ5IFBhdWwgSGFycmluZ3Rvbi4KCkRhbmllbCAoMTMgRGVjZW1iZXIgMTk5OSk6CiAtIEdlbmVyYWwgY2xlYW51cHMgaW4gdGhlIGxpYnJhcnkgaW50ZXJmYWNlLiBUaGVyZSBoYWQgYmVlbiBzb21lIGJhZCBrbHVkZ2VzCiAgIGFkZGVkIGR1cmluZyB0aW1lcyBvZiBzdHJlc3MgYW5kIEkgZGlkIG15IGJlc3QgdG8gY2xlYW4gdGhlbSBvZmYuIEl0IHdhcwogICBib3RoIHJlZ2FyZGluZyB0aGUgbGliIEFQSSBhcyB3ZWxsIGFzIGluY2x1ZGUgZmlsZSBjb25mdXNpb25zLgoKRGFuaWVsICgzIERlY2VtYmVyIDE5OTkpOgogLSBBIHNtYWxsIC0tc3RkZXJyIGJ1ZyB3YXMgcmVwb3J0ZWQgYnkgRWV0dSBPamFuZW4uLi4KCiAtIHdobyBhbHNvIGJyb3VnaHQgdGhlIHN1Z2dlc3Rpb24gb2YgZXh0ZW5kaW5nIHRoZSAtWCBmbGFnIHRvIGZ0cCBsaXN0IGFzCiAgIHdlbGwuIFNvLCBub3cgaXQgaXMgYW5kIHRoZSBsb25nIG9wdGlvbiBpcyBub3cgLS1yZXF1ZXN0IGluc3RlYWQuIEl0IGlzCiAgIG9ubHkgZm9yIGZ0cCBsaXN0IGZvciBub3cgKGFuZCB0aGUgZm9ybWVyIGh0dHAgc3R1ZmYgdG9vIG9mIGNvdXJzZSkuCgpMYXJzIEouIEFhcyAoMjQgTm92ZW1iZXIgMTk5OSk6CiAtIFBhdGNoZWQgY3VybCB0byBjb21waWxlIGFuZCBidWlsZCB1bmRlciBCZU9TLiBEb2Vzbid0IHdvcmsgeWV0IHRob3VnaCEKCiAtIENvcnJlY3RlZCB0aGUgTWFrZWZpbGUuYW0gZmlsZXMgdG8gYWxsb3cgcHV0dGluZyBvYmplY3QgZmlsZXMgaW4KICAgZGlmZmVyZW50IGRpcmVjdG9yaWVzIHRoYW4gdGhlIHNvdXJjZXMuCgpWZXJzaW9uIDYuMy4xCgpEYW5pZWwgKDIzIE5vdmVtYmVyIDE5OTkpOgogLSBJJ3ZlIGhhZCB0aGlzIG1ham9yIGRpc2sgY3Jhc2guIE15IGdvb2Qgb2xkIHRydXN0LXdvcnRoeSBzb3VyY2UgZGlzayBkaWVkCiAgIGFsb25nIHdpdGggdGhlIG1hY2hpbmUgdGhhdCBob3N0ZWQgaXQuIFRoYW5rIGdvb2RuZXNzIG1vc3Qgb2YgYWxsIHRoZQogICB0aGluZ3MgSSd2ZSBkb25lIGFyZSBlaXRoZXIgYmFja2VkIHVwIGVsc2V3aGVyZSBvciBzdG9yZWQgaW4gdGhpcyBDVlMKICAgc2VydmVyIQoKIC0gTWljaGFlbCBTLiBTdGV1ZXIgcG9pbnRlZCBvdXQgYSBidWcgaW4gdGhlIC1GIGhhbmRsaW5nCiAgIHRoYXQgbWFkZSBjdXJsIGhhbmcgaWYgeW91IHBvc3RlZCBhbiBlbXB0eSB2YXJpYWJsZSBzdWNoIGFzICctRiBuYW1lPScuIEl0CiAgIHdhcyBvbmUgb2YgdGhvc2Ugb2xkIGJ1Z3MgdGhhdCBuZXZlciBoYXZlIHdvcmtlZCBwcm9wZXJseS4uLgoKIC0gSmFzb24gQmFpZXR0byBwb2ludGVkIG91dCBhIGdlbmVyYWwgZmxhdyBpbiB0aGUgSFRUUAogICBkb3dubG9hZC4gQ3VybCBkaWRuJ3QgY29tcGxhaW4gaWYgaXQgd2FzIHByZW1hdHVyZWx5IGFib3J0ZWQgYmVmb3JlIHRoZQogICBlbnRpcmUgZG93bmxvYWQgd2FzIGNvbXBsZXRlZC4gSXQgZG9lcyBub3cuCgpEYW5pZWwgKDE5IE5vdmVtYmVyIDE5OTkpOgogLSBDaHJpcyBNYWx0YnkgdmVyeSBhY2N1cmF0ZWx5IGNyaXRpY2l6ZWQgdGhlIGxhY2sgb2YKICAgcmV0dXJuIGNvZGUgY2hlY2tzIG9uIHRoZSBmd3JpdGUoKSBjYWxscy4gSSBkaWQgYSB0aG9yb3VnaCBjaGVjayBmb3IgYWxsCiAgIG9jY3VycmVuY2VzIGFuZCBjb3JyZWN0ZWQgdGhpcy4KCkRhbmllbCAoMTcgTm92ZW1iZXIgMTk5OSk6CiAtIFBhdWwgSGFycmluZ3RvbiBwb2ludGVkIG91dCB0aGF0IHRoZSAtbS8tLW1heC10aW1lIG9wdGlvbgogICBkb2Vzbid0IHdvcmsgZm9yIHRoZSBzbG93IHN5c3RlbSBjYWxscyBsaWtlIGdldGhvc3RieW5hbWUoKS4uLiBJIGRvbid0IGhhdmUKICAgYW55IGdvb2QgZml4IHlldCwganVzdCBhIHNsaWdodGx5IGxlc3MgYmFkIG9uZSB0aGF0IG1ha2VzIGN1cmwgZXhpdCBoYXJkCiAgIHdoZW4gdGhlIHRpbWVvdXQgaXMgcmVhY2hlZC4KCiAtIEJqb3JuIFJlZXNlIGhlbHBlZCBtZSBwb2ludCBvdXQgYSBwb3NzaWJsZSBwcm9ibGVtIHRoYXQgbWlnaHQgYmUgdGhlIHJlYXNvbgogICB3aHkgVGhvbWFzIEh1cnN0IGV4cGVyaWVuY2UgcHJvYmxlbXMgaW4gaGlzIEFtaWdhIHZlcnNpb24uCgogRGFuaWVsICgxMiBOb3ZlbWJlciAxOTk5KToKIC0gSSBmb3VuZCBhIGNyYXNoIGluIHRoZSBuZXcgY29va2llIGZpbGUgcGFyc2VyLiBJdCBjcmFzaGVkIHdoZW4geW91IGdhdmUKICAgYSBwbGFpbiBodHRwIGhlYWRlciBmaWxlIGFzIGlucHV0Li4uCgpWZXJzaW9uIDYuMwoKIERhbmllbCAoMTAgTm92ZW1iZXIgMTk5OSk6CiAtIEkga2luZCBvZiBmb3VuZCBvdXQgdGhhdCB0aGUgSFRUUCB0aW1lLWNvbmRpdGlvbmFsIEdFVHMgKC16KSBhcmVuJ3QgYWx3YXlzCiAgIHJlc3BlY3RlZCBieSB0aGUgd2ViIHNlcnZlciBhbmQgdGhlIGRvY3VtZW50IGlzIHRoZXJlZm9yZSBzZW50IGluIHdob2xlCiAgIGFnYWluLCBldmVuIHRob3VnaCBpdCBkb2Vzbid0IG1hdGNoIHRoZSByZXF1ZXN0ZWQgY29uZGl0aW9uLiBBZnRlciByZWFkaW5nCiAgIHNlY3Rpb24gMTMuMy40IG9mIFJGQyAyNjE2LCBJIHRoaW5rIEknbSBkb2luZyB0aGUgcmlnaHQgdGhpbmcgbm93IHdoZW4gSSBkbwogICBteSBvd24gY2hlY2sgYXMgd2VsbC4gSWYgY3VybCB0aGlua3MgdGhlIGNvbmRpdGlvbiBpc24ndCBtZXQsIHRoZSB0cmFuc2ZlcgogICBpcyBhYm9ydGVkIHByZW1hdHVyZWx5IChhZnRlciBhbGwgdGhlIGhlYWRlcnMgaGF2ZSBiZWVuIHJlY2VpdmVkKS4KCiAtIEFmdGVyIGNvbW1lbnRzIGZyb20gUm9iZXJ0IExpbmRlbiBJIGFsc28gcmV3cm90ZSBzb21lIHBhcnRzIG9mIHRoZSBtYW4gcGFnZQogICB0byBiZXR0ZXIgZGVzY3JpYmUgaG93IHRoZSAtRiB3b3Jrcy4KCiAtIE1pY2hhZWwgQW50aSBwdXQgdXAgYSBuZXcgY3VybCBkb3dubG9hZCBtaXJyb3IgaW4KICAgQ2hpbmE6ICBodHRwOi8vd3d3LnBzaG93aW5nLmNvbS9jdXJsLwoKIC0gSSBhZGRlZCB0aGUgbGlzdCBvZiBkb3dubG9hZCBtaXJyb3JzIHRvIHRoZSBSRUFETUUgZmlsZQoKIC0gSSBkaWQgYWRkIG1vcmUgZXhwbGFuYXRpb25zIHRvIHRoZSBtYW4gcGFnZQoKIERhbmllbCAoOCBOb3ZlbWJlciAxOTk5KToKIC0gSSBtYWRlIHRoZSAtYi8tLWNvb2tpZSBvcHRpb24gY2FwYWJsZSBvZiByZWFkaW5nIG5ldHNjYXBlIGZvcm1hdHRlZCBjb29raWUKICAgZmlsZXMgYXMgd2VsbCBhcyBub3JtYWwgaHR0cC1oZWFkZXIgZmlsZXMuIEl0IHNob3VsZCBiZSBhYmxlIHRvCiAgIHRyYW5zcGFyZW50bHkgZmlndXJlIG91dCB3aGF0IGtpbmQgb2YgZmlsZSBpdCBnb3QgYXMgaW5wdXQuCgogRGFuaWVsICgyOSBPY3RvYmVyIDE5OTkpOgogLSBBbm90aGVyIG9uZSBvZiBTZWJhc3RpYWFuIHZhbiBFcmsncyBpZGVhcyAodGhhdCBoYXMgYmVlbiByZXF1ZXN0ZWQgYmVmb3JlCiAgIGJ1dCBJIHNlZW0gdG8gaGF2ZSBmb3Jnb3R0ZW4gd2hvIGl0IHdhcyksIGlzIHRvIGFkZCBzdXBwb3J0IGZvciByYW5nZXMgaW4KICAgRlRQIGRvd25sb2Fkcy4gQXMgdXN1YWwsIG9uZSByZXF1ZXN0IGlzIGp1c3QgYSByZXF1ZXN0LCB3aGVuIHRoZXkncmUgdHdvCiAgIGl0IGlzIGEgZGVtYW5kLiBJJ3ZlIGFkZGVkIHNpbXBsZSBzdXBwb3J0IGZvciBYLVkgc3R5bGUgZmV0Y2hlcy4gWCBoYXMgdG8KICAgYmUgdGhlIGxvd2VyIG51bWJlciwgdGhvdWdoIHlvdSBtYXkgb21pdCBvbmUgb2YgdGhlIG51bWJlcnMuIFVzZSB0aGUgLXIvCiAgIC0tcmFuZ2Ugc3dpdGNoIChwcmV2aW91c2x5IEhUVFAtb25seSkuCgogLSBTZWJhc3RpYWFuIHZhbiBFcmsgc3VnZ2VzdGVkIHRoYXQgY3VybCBzaG91bGQgYmUKICAgYWJsZSB0byBzaG93IHRoZSBmaWxlIHNpemUgb2YgYSBzcGVjaWZpZWQgZmlsZS4gSSB0aGluayB0aGlzIGlzIGEgc3BsZW5kaWQKICAgaWRlYSBhbmQgdGhlIC1JIGZsYWcgaXMgbm93IHdvcmtpbmcgZm9yIEZUUC4gSXQgZGlzcGxheXMgdGhlIGZpbGUgc2l6ZSBpbgogICB0aGlzIG1hbm5lcjoKICAgICAgICBDb250ZW50LUxlbmd0aDogWFhYWAogICBBcyBpdCByZXNlbWJsZXMgbm9ybWFsIGhlYWRlcnMsIGFuZCBsZWF2ZXMgdXMgdGhlIG9wcG9ydHVuaXR5IHRvIGFkZCBtb3JlCiAgIGluZm8gaW4gdGhhdCBkaXNwbGF5IGlmIHdlIGNhbiBjb21lIHVwIHdpdGggbW9yZSBpbiB0aGUgZnV0dXJlISBJdCBhbHNvCiAgIG1ha2VzIHNlbnNlIHNpbmNlIGlmIHlvdSBhY2Nlc3MgZnRwIHRocm91Z2ggYSBIVFRQIHByb3h5LCB5b3UnZCBnZXQgdGhlCiAgIGZpbGUgc2l6ZSB0aGUgc2FtZSB3YXkuCgogICBJIGNoYW5nZWQgdGhlIG9yZGVyIG9mIHRoZSBRVU9URSBjb21tYW5kIGV4ZWN1dGlvbnMuIFRoZXkncmUgbm93IGV4ZWN1dGVkCiAgIGp1c3QgYWZ0ZXIgdGhlIGxvZ2luIGFuZCBiZWZvcmUgYW55IG90aGVyIGNvbW1hbmQuIEkgbWFkZSB0aGlzIHRvIGVuYWJsZQogICBxdW90ZSBjb21tYW5kcyB0byBydW4gYmVmb3JlIHRoZSAtSSBzdHVmZiBpcyBkb25lIHRvby4KCiAtIEkgZm91bmQgb3V0IHRoYXQgLUQvLS1kdW1wLWhlYWRlciBhbmQgLVYvLS12ZXJzaW9uIHdlcmVuJ3QgZG9jdW1lbnRlZCBpbgogICB0aGUgbWFuIHBhZ2UuCgogLSBNYW55IEhUVFAvMS4xIHNlcnZlcnMgZG8gbm90IHN1cHBvcnQgcmFuZ2VzLiBEb24ndCBhc2sgbWUgd2h5LiBJIGRpZCBhZGQKICAgc29tZSB0ZXh0IGFib3V0IHRoaXMgaW4gdGhlIG1hbiBwYWdlIGZvciB0aGUgcmFuZ2Ugb3B0aW9uLiBUaGUgdGhyZWFkIGluCiAgIHRoZSBtYWlsaW5nIGxpc3QgdGhhdCBzdGFydGVkIHRoaXMgd2FzIGluaXRpYXRlZCBieSBNaWNoYWVsIEFudGkuCgogLSBJIGdldCByZXBvcnRzIGFib3V0IG5yb2ZmIGNyYXNoZXMgb24gc29sYXJpcyAyLjYrIHdoZW4gZGlzcGxheWluZyB0aGUgY3VybAogICBtYW4gcGFnZS4gU3dpdGNoIHRvIGducm9mZiBpbnN0ZWFkLCBpdCBpcyByZXBvcnRlZCB0byB3b3JrKCEpLiBBZGFtIEJhcmNsYXkKICAgcmVwb3J0ZWQgYW5kIGJyb3VnaHQgdGhlIHN1Z2dlc3Rpb24uCgogLSBJbiBhIGRpYWxvZ3VlIHdpdGggSm9oYW5uZXMgRy4gS3Jpc3RpbnNzb24gd2UgY2FtZQogICB1cCB3aXRoIHRoZSBpZGVhIHRvIGxldCAtSC8tLWhlYWRlciBzcGVjaWZpZWQgaGVhZGVycyByZXBsYWNlIHRoZQogICBpbnRlcm5hbGx5IGdlbmVyYXRlZCBoZWFkZXJzLCBpZiB5b3UgaGFwcGVuZWQgdG8gc2VsZWN0IHRvIGFkZCBhIGhlYWRlcgogICB0aGF0IGN1cmwgbm9ybWFsbHkgdXNlcyBieSBpdHNlbGYuIFRoZSBhZHZhbnRhZ2Ugd2l0aCB0aGlzIGlzIG5vdCBlbnRpcmVseQogICBvYnZpb3VzLCBidXQgaW4gSm9oYW5uZXMnIGNhc2UgaXQgbWVhbnMgdGhhdCBoZSBjYW4gdXNlIGFub3RoZXIgSG9zdDogdGhhbgogICB0aGUgb25lIGN1cmwgd291bGQgc2V0LgoKIERhbmllbCAoMjcgT2N0b2JlciAxOTk5KToKIC0gSm9uZ2tpIFN1d2FuZGkgYnJvdWdodCBhIG5pY2UgcGF0Y2ggZm9yICh5ZXQgYW5vdGhlcikgY3Jhc2ggd2hlbiBmb2xsb3dpbmcKICAgYSBsb2NhdGlvbjouIFRoaXMgdGltZSB5b3UgaGFkIHRvIGZvbGxvdyBhIGh0dHBzOi8vIHNlcnZlcidzIHJlZGlyZWN0IHRvCiAgIGdldCB0aGUgY29yZS4KClZlcnNpb24gNi4yCgogRGFuaWVsICgyMSBPY3RvYmVyIDE5OTkpOgogLSBJIHRoaW5rIEkgbWFuYWdlZCB0byByZW1vdmUgdGhlIHN1c3BpY2lvdXMgKG5pbCkgdGhhdCBoYXMgYmVlbiBzZWVuIGp1c3QKICAgYmVmb3JlIHRoZSAiSG9zdDoiIGluIEhUVFAgcmVxdWVzdHMgd2hlbiAtdiB3YXMgdXNlZC4KIC0gSSBmb3VuZCBvdXQgdGhhdCBpZiB5b3UgZm9sbG93ZWQgYSBsb2NhdGlvbjogd2hlbiB1c2luZyBhIHByb3h5LCB3aXRob3V0CiAgIGhhdmluZyBzcGVjaWZpZWQgaHR0cDovLyBpbiB0aGUgVVJMLCB0aGUgcHJvdG9jb2wgcGFydCB3YXMgYWRkZWQgb25jZSBhZ2FpbgogICB3aGVuIG1vdmluZyB0byB0aGUgbmV4dCBVUkwhIChUaGUgcHJvdG9jb2wgcGFydCBoYXMgdG8gYmUgYWRkZWQgdG8gdGhlCiAgIFVSTCB3aGVuIGdvaW5nIHRocm91Z2ggYSBwcm94eSBzaW5jZSBpdCBoYXMgbm8gcHJvdG9jb2wtZ3Vlc3Npbmcgc3lzdGVtCiAgIHN1Y2ggYXMgY3VybCBoYXMuKQogLSBCZW5qYW1pbiBSaXRjZXkgcmVwb3J0ZWQgYSBjb3JlIGR1bXAgdW5kZXIgc29sYXJpcyAyLjYKICAgd2l0aCBPcGVuU1NMIDAuOS40LiBJdCB0dXJuZWQgb3V0IHRoaXMgd2FzIGR1ZSB0byBhIGJhZCBmcmVlKCkgaW4gbWFpbi5jCiAgIHRoYXQgb2NjdXJyZWQgYWZ0ZXIgdGhlIGRvd25sb2FkIHdhcyBkb25lIGFuZCBjb21wbGV0ZWQuCiAtIEJlbmphbWluIGZvdW5kIGZ0cCBkb3dubG9hZHMgdG8gc2hvdyB0aGUgZmlyc3QgbGluZSBvZiB0aGUgZG93bmxvYWQgbWV0ZXIKICAgdG8gZ2V0IHdyaXR0ZW4gdHdpY2UsIGFuZCBJIHJlbW92ZWQgdGhhdCBwcm9ibGVtLiBJdCB3YXMgaW50cm9kdWNlZCB3aXRoCiAgIHRoZSBtdWx0aXBsZSBVUkwgc3VwcG9ydC4KIC0gRGFuIFppdHRlciBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIDYuMSBhbmQgZWFybGllciB2ZXJzaW9ucyBkaWRuJ3QKICAgaG9ub3IgUkZDIDI2MTYgY2hhcHRlciA0IHNlY3Rpb24gMiwgIk1lc3NhZ2UgSGVhZGVycyI6ICIuLi5GaWVsZCBuYW1lcyBhcmUKICAgY2FzZS1pbnNlbnNpdGl2ZS4uLiIgIEhUVFAgaGVhZGVyIHBhcnNpbmcgYXNzdW1lZCBhIGNlcnRhaW4gY2FzaW5nLiBEYW4KICAgYWxzbyBwcm92aWRlZCBtZSB3aXRoIGEgcGF0Y2ggdGhhdCBjb3JyZWN0ZWQgdGhpcywgd2hpY2ggSSB0b29rIHRoZSBsaWJlcnR5CiAgIG9mIGVkaXRpbmcgc2xpZ2h0bHkuCiAtIERhbiBaaXR0ZXIgYWxzbyBwcm92aWRlZCBhIG5pY2UgcGF0Y2ggZm9yIGNvbmZpZy5ndWVzcyB0byBiZXR0ZXIgcmVjb2duaXplCiAgIHRoZSBNYWMgT1MgWAogLSBEYW4gYWxzbyBjb3JyZWN0ZWQgYSBtaW5vciBwcm9ibGVtIGluIHRoZSBsaWIvTWFrZWZpbGUgdGhhdCBjYXVzZWQgbGlua2luZwogICB0byBmYWlsIG9uIE9TIFguCgogRGFuaWVsICgxOSBPY3RvYmVyIDE5OTkpOgogLSBMZW4gTWFyaW5hY2NpbyBjYW1lIHVwIHdpdGggc29tZSBwcm9ibGVtcyB3aXRoIGN1cmwuICBTaW5jZSBXaW5kb3dzIGhhcyBhCiAgIGNyaXBwbGVkIHNoZWxsLCBpdCBjYW4ndCByZWRpcmVjdCBzdGRlcnIgYW5kIHRoYXQgY2F1c2VzIHRyb3VibGUuIEkgYWRkZWQKICAgLS1zdGRlcnIgdG9kYXkgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvIHJlZGlyZWN0IHRoZSBzdGRlcnIgc3RyZWFtIHRvIGEKICAgZmlsZSBvciBzdGRvdXQuCgogRGFuaWVsICgxOCBPY3RvYmVyIDE5OTkpOgogLSBUaGUgY29uZmlndXJlIHNjcmlwdCBub3cgdW5kZXJzdGFuZHMgdGhlICctLXdpdGhvdXQtc3NsJyBmbGFnLCB3aGljaCBub3cKICAgdG90YWxseSBkaXNhYmxlIFNTTC9odHRwcyBzdXBwb3J0LiBQcmV2aW91c2x5IGl0IHdhc24ndCBwb3NzaWJsZSB0byBmb3JjZQogICB0aGUgY29uZmlndXJlIHNjcmlwdCB0byBsZWF2ZSBTU0wgYWxvbmUuIFRoZSBwcmV2aW91cyBmdW5jdGlvbmFsaXR5IGhhcwogICBiZWVuIHJldGFpbmVkLiBUcm95IEVuZ2VsIGhlbHBlZCB0ZXN0IHRoaXMgbmV3IG9uZS4KClZlcnNpb24gNi4xCgogRGFuaWVsICgxNyBPY3RvYmVyIDE5OTkpOgogLSBJIGlmZGVmJ2VkIG9yIGNvbW1lbnRlZCBhbGwgdGhlIHpsaWIgc3R1ZmYgaW4gdGhlIHNvdXJjZXMgYW5kIGNvbmZpZ3VyZQogICBzY3JpcHQuIEl0IHR1cm5lZCBvdXQgd2UgbmVlZGVkIHRvIG1vY2sgbW9yZSB3aXRoIHpsaWIgdGhhbiBJIGluaXRpYWxseQogICB0aG91Z2h0LCB0byBtYWtlIGl0IGNhcGFibGUgb2YgZG93bmxvYWRpbmcgY29tcHJlc3NlZCBIVFRQIGRvY3VtZW50cyBhbmQKICAgdW5jb21wcmVzcyB0aGVtIG9uIHRoZSBmbHkuIEkgZGlkbid0IG1lYW4gdGhlIHpsaWIgcGFydHMgb2YgY3VybCB0byBiZWNvbWUKICAgbW9yZSB0aGFuIG1pbm9yIHNvIHRoaXMgbWVhbnMgSSBoYWx0IHRoZSB6bGliIGV4cGVkaXRpb24gZm9yIG5vdyBhbmQgd2FpdAogICB1bnRpbCBzb21lb25lIGVpdGhlciB3cml0ZXMgdGhlIGNvZGUgb3IgemxpYiBnZXRzIHVwZGF0ZWQgYW5kIGJldHRlcgogICBhZGp1c3RlZCBmb3IgdGhpcyBraW5kIG9mIHVzYWdlLiAgSSB3b24ndCBnZXQgaW50byBkZXRhaWxzIGhlcmUsIGJ1dCBhCiAgIHNob3J0IGEgc3VtbWFyeSBpcyBzdWl0YWJsZToKICAgLSB6bGliIGNhbid0IGF1dG9tYXRpY2FsbHkgZGV0ZWN0IHdoZXRoZXIgdG8gdXNlIHpsaWIgb3IgZ3ppcAogICAgIGRlY29tcHJlc3Npb24gbWV0aG9kcy4KICAgLSB6bGliIGlzIHZlcnkgbmVhdCBmb3IgcmVhZGluZyBnemlwcGVkIGZpbGVzIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IsCiAgICAgYWx0aG91Z2ggbm90IGFzIG5pY2UgZm9yIHJlYWRpbmcgYnVmZmVyLWJhc2VkIGRhdGEgc3VjaCBhcyB3ZSB3b3VsZAogICAgIHdhbnQgaXQuCiAgIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgcHJvYmxlbXMgd2l0aCB0aGUgd2luMzIgdmVyc2lvbiB3aGVuIHJlYWRpbmcgZnJvbQogICAgIGEgZmlsZSBkZXNjcmlwdG9yIGlmIHRoYXQgaXMgYSBzb2NrZXQKCiBEYW5pZWwgKDE0IE9jdG9iZXIgMTk5OSk6CiAtIE1vdmVkIHRoZSAoZXh0ZXJuYWwpIGluY2x1ZGUgZmlsZXMgZm9yIGxpYmN1cmwgaW50byBhIHN1YmRpcmVjdG9yeSBuYW1lZAogICBjdXJsIGFuZCBhZGp1c3RlZCBhbGwgI2luY2x1ZGUgbGluZXMgdG8gdXNlIDxjdXJsL1hYWFg+IHRvIG1haW50YWluIGEKICAgYmV0dGVyIG5hbWUgc3BhY2UgYW5kIGNvbnRyb2wgb2YgdGhlIGhlYWRlcnMuIFRoaXMgaGFzIGJlZW4gcmVxdWVzdGVkLgoKIERhbmllbCAoMTIgT2N0b2JlciAxOTk5KToKIC0gSSBtb2RpZmllZCB0aGUgJ21ha2V0Z3onIHNjcmlwdCB0byBwZXJmb3JtIGEgJ21ha2UnIHRvbyBiZWZvcmUgYSByZWxlYXNlCiAgIGFyY2hpdmUgaXMgcHV0IHRvZ2V0aGVyIGluIGFuIGF0dGVtcHQgdG8gbWFrZSB0aGUgdGltZSBzdGFtcHMgYmV0dGVyIGFuZAogICBob3BlZnVsbHkgYXZvaWQgdGhlIGRvdWJsZSBjb25maWd1cmUtcnVubmluZyB0aGF0IHVzZSB0byBvY2N1ci4KCiBEYW5pZWwgKDExIE9jdG9iZXIgMTk5OSk6CiAtIEFwcGxpZWQgSvZybidzIHBhdGNoZXMgdGhhdCBmaXhlcyB6bGliIGZvciBtaW5ndzMyIGNvbXBpbGVzIGFzIHdlbGwgYXMKICAgc29tZSBvdGhlciBtaXNzaW5nIHpsaWIgI2lmZGVmIGFuZCBtb3JlIHRleHQgb24gdGhlIG11bHRpcGxlIFVSTCBkb2NzIGluCiAgIHRoZSBtYW4gcGFnZS4KClZlcnNpb24gNi4xYmV0YQoKIERhbmllbCAoNiBPY3RvYmVyIDE5OTkpOgogLSBEb3VnbGFzIEUuIFdlZ3NjaGVpZCBzZW50IG1lIGEgcGF0Y2ggdGhhdCBtYWRlIHRoZSBleGFjdCBzYW1lIHRoaW5nIGFzIEkKICAganVzdCBtYWRlOiB0aGUgLWQgc3dpdGNoIGlzIG5vdyBjYXBhYmxlIG9mIHJlYWRpbmcgcG9zdCBkYXRhIGZyb20gYSBuYW1lZAogICBmaWxlIG9yIHN0ZGluLiAgVXNlIGl0IHNpbWlsYXJseSB0byB0aGUgLUYuIFRvIHJlYWQgdGhlIHBvc3QgZGF0YSBmcm9tIGEKICAgZ2l2ZW4gZmlsZToKCiAgICAgICAgY3VybCAtZCBAcGF0aC90by9maWxlbmFtZSB3d3cucG9zdHNpdGUuY29tCgogICBvciBsZXQgY3VybCByZWFkIGl0IG91dCBmcm9tIHN0ZGluOgoKICAgICAgICBjdXJsIC1kIEAtIHd3dy5wb3N0aXQuY29tCgogSvZybiBIYXJ0cm90aCAoMyBPY3RvYmVyIDE5OTkpOgogLSBCcm91Z2h0IHNvbWUgbW9yZSBwYXRjaGVzIGZvciBtdWx0aXBsZSBVUkwgZnVuY3Rpb25hbGl0eS4gVGhlIE1JTUUKICAgc2VwYXJhdGlvbiBpZGVhcyBhcmUgYWxtb3N0IHNjcmFwcGVkIG5vdywgYW5kIGEgY3VzdG9tIHNlcGFyYXRvciBpcyBiZWluZwogICB1c2VkIGluc3RlYWQuIFRoaXMgaXMgc3RpbGwgY29tcGlsZS10aW1lICJmbGFnZ2VkIi4KCiBEYW5pZWwKIC0gVXBkYXRlZCBjdXJsLjEgd2l0aCBtdWx0aXBsZSBVUkwgaW5mby4KCiBEYW5pZWwgKDMwIFNlcHRlbWJlciAxOTk5KToKIC0gRmVsaXggdm9uIExlaXRuZXIgYnJvdWdodCBvcGVuc3NsLWNoZWNrIGZpeGVzIGZvciBjb25maWd1cmUuaW4gdG8gd29yawogICBvdXQtb2YtdGhlLWJveCB3aGVuIHRoZSBvcGVuc3NsIGZpbGVzIGFyZSBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbSBkZWZhdWx0CiAgIGRpcnMuCgogRGFuaWVsICgyOCBTZXB0ZW1iZXIgMTk5OSkKIC0gQWRkZWQgbGlieiBmdW5jdGlvbmFsaXR5LiBUaGlzIHNob3VsZCBlbmFibGUgZGVjb21wcmVzc2luZyBnemlwLCBjb21wcmVzcwogICBvciBkZWZsYXRlIGVuY29kaW5nIEhUVFAgZG9jdW1lbnRzLiBJdCBhbHNvIG1ha2VzIGN1cmwgc2VuZCBhbiBhY2NlcHQgdGhhdAogICBpdCBhY2NlcHRzIHRoYXQga2luZCBvZiBlbmNvZGluZy4gQ29tcHJlc3NlZCBjb250ZW50cyB1c3VhbGx5IHNob3J0ZW5zCiAgIGRvd25sb2FkIHRpbWUuIEkgKm5lZWQqIHNvbWVvbmUgdG8gdGVsbCBtZSBhIHNpdGUgdGhhdCB1c2VzIGNvbXByZXNzZWQgSFRUUAogICBkb2N1bWVudHMgc28gdGhhdCBJIGNhbiB0ZXN0IHRoaXMgb3V0IHByb3Blcmx5LgoKIC0gQXMgYSByZXN1bHQgb2YgdGhlIGFkZGluZyBvZiB6bGliIGF3YXJlbmVzcywgSSBjaGFuZ2VkIHRoZSB2ZXJzaW9uIHN0cmluZwogICBhIGxpdHRsZS4gSSBwbGFuIHRvIGFkZCBvcGVubGRhcCB2ZXJzaW9uIHJlcG9ydGluZyBpbiB0aGVyZSB0b28uCgogRGFuaWVsICgxNyBTZXB0ZW1iZXIgMTk5OSkKIC0gTWFkZSB0aGUgLUYgb3B0aW9uIGFsbG93IHN0ZGluIHdoZW4gc3BlY2lmeWluZyBmaWxlcy4gQnkgdXNpbmcgJy0nIGluc3RlYWQKICAgb2YgZmlsZSBuYW1lLCB0aGUgZGF0YSB3aWxsIGJlIHJlYWQgZnJvbSBzdGRpbi4KClZlcnNpb24gNi4wCgogRGFuaWVsICgxMyBTZXB0ZW1iZXIgMTk5OSkKIC0gQWRkZWQgLVgvLS1odHRwLXJlcXVlc3QgPHJlcXVlc3Q+IHRvIGVuYWJsZSBhbnkgSFRUUCBjb21tYW5kIHRvIGJlIHNlbnQuCiAgIERvIG5vdCB0aGF0IHlvdXIgc2VydmVyIGhhcyB0byBzdXBwb3J0IHRoZSBleGFjdCBzdHJpbmcgeW91IGVudGVyLiBUaGlzCiAgIHNob3VsZCBwb3NzaWJseSBhIHN0cmluZyBsaWtlIERFTEVURSBvciBUUkFDRS4KCiAtIEFwcGxpZWQgRG91Z2xhcycgbWluZ3czMi1maXhlcyBmb3IgdGhlIG1ha2VmaWxlcy4KCiBEYW5pZWwgKDEwIFNlcHRlbWJlciAxOTk5KQogLSBEb3VnbGFzIEUuIFdlZ3NjaGVpZCBwb2ludGVkIG91dCBhIHByb2JsZW0uIEN1cmwgZGlkbid0IGNoZWNrIHRoZSBGVFAKICAgc2VydmVycyByZXR1cm4gY29kZSBwcm9wZXJseSBhZnRlciB0aGUgLS1xdW90ZSBjb21tYW5kcyB3ZXJlIGlzc3VlZC4gSXQKICAgdG9vayBhbnl0aGluZyBub24gMjAwIGFzIGFuIGVycm9yLCB3aGVuIGFsbCAyWFggY29kZXMgc2hvdWxkIGJlIGFjY2VwdGVkIGFzCiAgIE9LLgoKIC0gU2VuZGluZyBjb29raWVzIHRvIHRoZSBzYW1lIHNpdGUgaW4gbXVsdGlwbGUgbGluZXMgbGlrZSBjdXJsIHVzZWQgdG8gZG8KICAgdHVybmVkIG91dCB0byBiZSBiYWQgYW5kIGJyZWFraW5nIHRoZSBjb29raWUgc3BlY3MuIEN1cmwgbm93IHNlbmRzIGFsbAogICBjb29raWVzIG9uIGEgc2luZ2xlIENvb2tpZTogbGluZS4gQ3VybCBpcyBub3QgeWV0IFJGQyAyMTA5IGNvbXBsaWFudCwgYnV0IEkKICAgZG91YnQgdGhhdCBtYW55IHNlcnZlcnMgZG8gdXNlIHRoYXQgc3ludGF4ICh5ZXQpLgoKIERhbmllbCAoOCBTZXB0ZW1iZXIgMTk5OSkKIC0gSvZybiBoZWxwZWQgbWUgbWFrZSBzdXJlIGl0IHN0aWxsIGNvbXBpbGVzIG5pY2VseSB3aXRoIG1pbmd3MzIgdW5kZXIgd2luMzIuCgogRGFuaWVsICg3IFNlcHRlbWJlciAxOTk5KQogLSBGVFAgdXBsb2FkIHRocm91Z2ggcHJveHkgaXMgbm93IHR1cm5lZCBpbnRvIGEgSFRUUCBQVVQuIFJlcXVlc3RlZCBieQogICBTdGVmYW4gS2FudGhhay4KCiAtIEFkZGVkIHRoZSBsZGFwIGZpbGVzIHRvIHRoZSAubTMyIG1ha2VmaWxlLgoKIERhbmllbCAoMyBTZXB0ZW1iZXIgMTk5OSkKIC0gTWFkZSBjb29raWUgbWF0Y2hpbmcgd29yayB3aGlsZSB1c2luZyBIVFRQIHByb3h5LgoKIEJqb3JuIFJlZXNlICgzMSBBdWd1c3QgMTk5OSkKIC0gUGFzc2VkIGhpcyBsZGFwOi8vIHBhdGNoLiBOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyB0aGUgb3BlbmxkYXAgc2hhcmVkCiAgIGxpYnJhcnkgdG8gYmUgaW5zdGFsbGVkIGFuZCB0aGF0IExEX0xJQlJBUllfUEFUSCBwb2ludHMgdG8gdGhlCiAgIGRpcmVjdG9yeSB3aGVyZSB0aGUgbGliIHdpbGwgYmUgZm91bmQgd2hlbiBjdXJsIGlzIHJ1biB3aXRoIGEKICAgbGRhcDovLyBVUkwuCgogSvZybiBIYXJ0cm90aCAoMzEgQXVndXN0IDE5OTkpCiAtIE1hZGUgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGludG8gc2luZ2xlIGZpbGVzLgogLSBNYWRlIGZpbGU6Ly8gd29yayBmb3IgV2luMzIuIFRoZSBzYW1lIGNvZGUgaXMgbm93IHVzZWQgZm9yIHVuaXggYXMgd2VsbCBmb3IKICAgcGVyZm9ybWFuY2UgcmVhc29ucy4KCiBEb3VnbGFzIEUuIFdlZ3NjaGVpZCAoMzAgQXVndXN0IDE5OTkpCiAtIFBhdGNoZWQgdGhlIE1pbmd3MzIgbWFrZWZpbGVzIGZvciBTU0wgYnVpbGRzLgoKIE1hdHRoZXcgQ2xhcmtlICgzMCBBdWd1c3QgMTk5OSkKIC0gTWFkZSBhIGNvb2wgcGF0Y2ggZm9yIGNvbmZpZ3VyZS5pbiB0byBhbGxvdyAtLXdpdGgtc3NsIHRvIHNwZWNpZnkgdGhlCiAgIHJvb3QgZGlyIG9mIHRoZSBvcGVuc3NsIGluc3RhbGxhdGlvbiwgYXMgaW4KCiAgICAgICAgLi9jb25maWd1cmUgLS13aXRoLXNzbD0vdXNyL3NzbF9oZXJlCgogLSBDb3JyZWN0ZWQgdGhlICdyZWNvbmYnIHNjcmlwdCB0byB3b3JrIGJldHRlciB3aXRoIHNvbWUgc2hlbGxzLgoKIEr2cm4gSGFydHJvdGggKDI2IEF1Z3VzdCAxOTk5KQogLSBGaXhlZCB0aGUgTWluZ3czMiBtYWtlZmlsZXMgaW4gbGliLyBhbmQgY29ycmVjdGVkIHRoZSBmaWxlLmMgZm9yIHdpbjMyCiAgIGNvbXBpbGVzLgoKVmVyc2lvbiA1LjExCgogRGFuaWVsICgyNSBBdWd1c3QgMTk5OSkKIC0gSm9obiBXZWlzbWlsbGVyIHBvaW50ZWQgb3V0IGEgYnVnIGluIHRoZSBoZWFkZXItbGluZQogICByZWFsbG9jKCkgc3lzdGVtIGluIGRvd25sb2FkLmMuCgogLSBJIGFkZGVkIGxpYi9maWxlLltjaF0gdG8gb2ZmZXIgYSBmaXJzdCwgc2ltcGxlLCBmaWxlOi8vIHN1cHBvcnQuIEl0CiAgIHByb2JhYmx5IHdvbid0IGRvIG11Y2ggZ29vZCBvbiB3aW4zMiBzeXN0ZW0gYXQgdGhpcyBwb2ludCwgYnV0IEkgc2VlIGl0CiAgIGFzIGEgc3RhcnQuCgogLSBNYWRlIHRoZSByZWxlYXNlIGFyY2hpdmVzIGdldCBhIE1ha2VmaWxlIGluIHRoZSByb290IGRpciwgd2hpY2ggY2FuIGJlCiAgIHVzZWQgdG8gc3RhcnQgdGhlIGNvbXBpbGluZy9idWlsZGluZyBwcm9jZXNzIGVhc2llci4gSSBoYXZlbid0IHJlYWxseQogICBjaGFuZ2VkIGFueSBJTlNUQUxMIHRleHQgeWV0LCBJIHdhbnRlZCB0byBnZXQgc29tZSBmZWVkLWJhY2sgb24gdGhpcwogICBmaXJzdC4KCiBEYW5pZWwgKDE3IEF1Z3VzdCAxOTk5KQogLSBBbm90aGVyIExvY2F0aW9uOiBidWcuIEN1cmwgZGlkbid0IGRvIHByb3BlciByZWxhdGl2ZSBsb2NhdGlvbnMgaWYgdGhlCiAgIG9yaWdpbmFsIFVSTCBoYWQgY2dpLXBhcmFtZXRlcnMgdGhhdCBjb250YWluZWQgYSBzbGFzaC4gTnVzdSdzIHBhZ2UKICAgYWdhaW4uCgogLSBDb3JyZWN0ZWQgdGhlIE5PX1BST1hZIHVzYWdlLiBJdCBpcyBhIGxpc3Qgb2Ygc3Vic3RyaW5ncyB0aGF0IGlmIG9uZSBvZgogICB0aGVtIG1hdGNoZXMgdGhlIHRhaWwgb2YgdGhlIGhvc3QgbmFtZSBpdCBzaG91bGQgY29ubmVjdCB0bywgY3VybCBzaG91bGQKICAgbm90IHVzZSBhIHByb3h5IHRvIGNvbm5lY3QgdGhlcmUuIFBvaW50ZWQgb3V0IHRvIG1lIGJ5IERvdWdsYXMKICAgRS4gV2Vnc2NoZWlkLiAgSSBhbHNvIGNoYW5nZWQgdGhlIFJFQURNRSB0ZXh0IGEgbGl0dGxlIHJlZ2FyZGluZyB0aGlzLgoKIERhbmllbCAoMTYgQXVndXN0IDE5OTkpCiAtIEZpeGVkIGEgbWVtb3J5IGJ1ZyB3aXRoIGh0dHAtc2VydmVycyB0aGF0IHNlbnQgTG9jYXRpb246IHRvIGEgTG9jYXRpb246CiAgIHBhZ2UuIE51c3UncyBwYWdlIHNob3dlZCB0aGlzIHRvby4KCiAtIE1hZGUgY29va2llcyB3b3JrIGEgbG90IGJldHRlci4gU2V0dGluZyB0aGUgc2FtZSBjb29raWUgbmFtZSBzZXZlcmFsIHRpbWVzCiAgIHVzZWQgdG8gYWRkIG1vcmUgY29va2llcyBpbnN0ZWFkIG9mIHJlcGxhY2luZyB0aGUgZm9ybWVyIG9uZSB3aGljaCBpdAogICBzaG91bGQndmUuIE51c3UgPG51cyBhdCBpbnRlcmdvcmoucm8+IGJyb3VnaHQgbWUgYW4gVVJMIHRoYXQgbWFkZSB0aGlzCiAgIHBhaW5mdWxseSB2aXNpYmxlLi4uCgogVHJveSAoMTUgQXVndXN0IDE5OTkpCiAtIEJyb3VnaHQgbmV3IC5zcGVjIGZpbGVzIGFzIHdlbGwgYXMgYSBwYXRjaCBmb3IgY29uZmlndXJlLmluIHRoYXQgbGV0cyB0aGUKICAgY29uZmlndXJlIHNjcmlwdCBmaW5kIHRoZSBvcGVuc3NsIGZpbGVzIGJldHRlciwgZXZlbiB3aGVuIHRoZSBpbmNsdWRlCiAgIGZpbGVzIGFyZSBpbiAvdXNyL2luY2x1ZGUvb3BlbnNzbAoKVmVyc2lvbiA1LjEwCgogRGFuaWVsICgxMyBBdWd1c3QgMTk5OSkKIC0gU1NMX0NUWF9zZXRfZGVmYXVsdF9wYXNzd2RfY2IoKSBoYXMgYmVlbiBtb2RpZmllZCBpbiB0aGUgMC45LjQgdmVyc2lvbiBvZgogICBPcGVuU1NMLiBOb3cgd2h5IGNvdWxkbid0IHRoZXkgc2ltcGx5IGFkZCBhICpuZXcqIGZ1bmN0aW9uIGluc3RlYWQgb2YKICAgbW9kaWZ5aW5nIHRoZSBwYXJhbWV0ZXJzIG9mIGFuIGFscmVhZHkgZXhpc3RpbmcgZnVuY3Rpb24/IFRoaXMgd2F5LCB3ZSBnZXQKICAgYSBjb21waWxlciB3YXJuaW5nIGlmIGNvbXBpbGluZyB3aXRoIDAuOS40IGJ1dCBub3Qgd2l0aCBlYXJsaWVyLiBTbywgSSBoYWQKICAgdG8gY29tZSB1cCB3aXRoIGEgI2lmIGNvbnN0cnVjdGlvbiB0aGF0IGRlYWxzIHdpdGggdGhpcy4uLgoKIC0gTWFkZSBjdXJsIG91dHB1dCB0aGUgU1NMIHZlcnNpb24gbnVtYmVyIGdldCBkaXNwbGF5ZWQgcHJvcGVybHkgd2l0aCAwLjkuNC4KCiBUcm95ICgxMiBBdWd1c3QgMTk5OSkKIC0gQWRkZWQgTWluZ1czMiAoR0NDLTIuOTUpIHN1cHBvcnQgdW5kZXIgV2luMzIuIFRoZSBJTlNUQUxMIGZpbGUgd2FzIGFsc28KICAgYSBiaXQgcmVhcnJhbmdlZC4KIAogRGFuaWVsICgxMiBBdWd1c3QgMTk5OSkKIC0gSSBoYWQgdG8gY29weSBhIGdvb2QgPGFycGEvdGVsbmV0Lmg+IGluY2x1ZGUgZmlsZSBpbnRvIHRoZSBjdXJsIHNvdXJjZQogICB0cmVlIHRvIGVuYWJsZSB0aGUgc2lsbHkgd2luMzIgc3lzdGVtcyB0byBjb21waWxlLiBUaGUgZGlzdHJpYnV0aW9uIHJpZ2h0cwogICBhbGxvd3MgdXMgdG8gZG8gdGhhdCBhcyBsb25nIGFzIHRoZSBmaWxlIHJlbWFpbnMgdW5tb2RpZmllZC4KCiAtIEkgY29ycmVjdGVkIGEgZmV3IG1pbm9yIHRoaW5ncyB0aGF0IG1hZGUgdGhlIGNvbXBpbGVyIGNvbXBsYWluIHdoZW4KICAgLVdhbGwgLXBlZGFudGljIHdhcyB1c2VkLgoKIC0gSSdtIG1vdmluZyB0aGUgb2ZmaWNpYWwgY3VybCB3ZWIgcGFnZSB0byBodHRwOi8vY3VybC5oYXh4Lm51LiBJIHRoaW5rIGl0CiAgIHdpbGwgbWFrZSBpdCBlYXNpZXIgdG8gcmVtZW1iZXIgYXMgaXQgaXMgYSBsb3Qgc2hvcnRlciBhbmQgbGVzcyBjcnlwdGljLgogICBUaGUgb2xkIG9uZSBzdGlsbCB3b3JrcyBhbmQgc2hvd3MgdGhlIHNhbWUgaW5mby4KCiBEYW5pZWwgKDExIEF1Z3VzdCAxOTk5KQogLSBBbGJlcnQgQ2hpbi1BLVlvdW5nIG1haWxlZCBtZSBhbm90aGVyIGNvcnJlY3Rpb24gZm9yIE5ST0ZGIGluIHRoZQogICBjb25maWd1cmUuaW4gdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBiZXR0ZXIgZm9yIElSSVggdXNlcnMuCgogRGFuaWVsICgxMCBBdWd1c3QgMTk5OSkKIC0gQWxiZXJ0IENoaW4tQS1Zb3VuZyBoZWxwZWQgbWUgd2l0aCBzb21lIHN0dXBpZCBNYWtlZmlsZSB0aGluZ3MsIGFzIHdlbGwgYXMKICAgc29tZSBmaWRkbGluZyB3aXRoIHRoZSBnZXRkYXRlLmMgc3R1ZmYgdGhhdCBoZSBoYWQgcHJvYmxlbXMgd2l0aCB1bmRlcgogICBIUC1VWCB2MTAuIGdldGRhdGUueSB3aWxsIG5vdyBiZSBjb21waWxlZCBpbnRvIGdldGRhdGUuYyBpZiB0aGUgYXBwcm9wcmlhdGUKICAgeWFjYyBvciBiaXNvbiBpcyBmb3VuZCBieSB0aGUgY29uZmlndXJlIHNjcmlwdC4gU2luY2UgdGhpcyBpcyBzbGlnaHRseSBuZXcsCiAgIHdlIG5lZWQgdG8gdGVzdCB0aGUgb3V0cHV0IGdldGRhdGUuYyB3aXRoIHdpbjMyIHN5c3RlbXMgdG8gbWFrZSBzdXJlIGl0CiAgIHN0aWxsIGNvbXBpbGVzIHRoZXJlLgoKIERhbmllbCAoNSBBdWd1c3QgMTk5OSkKIC0gSSd2ZSBqdXN0IHNldHVwIGEgbmV3IG1haWxpbmcgbGlzdCB3aXRoIHRoZSBpbnRlbnRpb24gdG8ga2VlcCBkaXNjdXNzaW9ucwogICBhcm91bmQgbGliY3VybCBkZXZlbG9wbWVudCBpbiBpdC4gSSBtYWlubHkgZXhwZWN0IGl0IHRvIGJlIGZvciB0aG91Z2h0cyBhbmQKICAgYnJhaW5zdG9ybWluZyBhcm91bmQgYSAibmV4dCBnZW5lcmF0aW9uIiBsaWJyYXJ5LCByYXRoZXIgdGhhbiBuaXRwaWNraW5nCiAgIGFib3V0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9yIGRldGFpbHMgaW4gdGhlIGN1cnJlbnQgbGliY3VybC4KCiAgIFRvIGpvaW4gb3VyIGhhcHB5IGJ1bmNoIG9mIGZ1dHVyZS1sb29raW5nIGdlZWtzLCBlbnRlciAnc3Vic2NyaWJlCiAgIDxhZGRyZXNzPicgaW4gdGhlIGJvZHkgb2YgYSBtYWlsIGFuZCBzZW5kIGl0IHRvCiAgIGxpYmN1cmwtcmVxdWVzdEBsaXN0c2Vydi5mdHMuZnJvbnRlYy5zZS4gIEN1cmwgYnVnIHJlcG9ydHMsIHRoZSB1c3VhbCBjdXJsCiAgIHRhbGsgYW5kIGV2ZXJ5dGhpbmcgZWxzZSBzaG91bGQgc3RpbGwgYmUga2VwdCBpbiB0aGlzIG1haWxpbmcgbGlzdC4gSSd2ZQogICBzdGFydGVkIHRvIGFyY2hpdmUgdGhpcyBtYWlsaW5nIGxpc3QgYW5kIGhhdmUgcHV0IHRoZSBsaWJjdXJsIHdlYiBwYWdlIGF0CiAgIHd3dy5mdHMuZnJvbnRlYy5zZS9+ZGFzdC9saWJjdXJsLy4KCiAtIFN0ZWZhbiBLYW50aGFrIGNvbnRhY3RlZCBtZSByZWdhcmRpbmcgYSBmZXcgcHJvYmxlbXMgaW4gdGhlIGNvbmZpZ3VyZQogICBzY3JpcHQgd2hpY2ggaGUgZGlzY292ZXJlZCB3aGVuIHRyeWluZyB0byBtYWtlIGN1cmwgY29tcGlsZSBhbmQgYnVpbGQgdW5kZXIKICAgU2llbWVucyBTSU5JWC1aIFY1LjQyQjIwMDQhCgogLSBNYXJjdXMgS2xlaW4gdmVyeSBhY2N1cmF0ZWx5IGluZm9ybWVkIG1lIHRoYXQgc3JjL3ZlcnNpb24uaCB3YXMgbm90IHByZXNlbnQKICAgaW4gdGhlIENWUyByZXBvc2l0b3J5LiBPaCwgaG93IHNpbGx5Li4uCgogLSBMaW51cyBOaWVsc2VuIHJld3JvdGUgdGhlIHRlbG5ldDovLyBwYXJ0IGFuZCBub3cgY3VybCBvZmZlcnMgbGltaXRlZCB0ZWxuZXQKICAgc3VwcG9ydC4gSWYgeW91IHJ1biBjdXJsIGxpa2UgJ2N1cmwgdGVsbmV0Oi8vaG9zdCcgeW91J2xsIGdldCBhbGwgb3V0cHV0IG9uCiAgIHRoZSBzY3JlZW4gYW5kIGN1cmwgd2lsbCByZWFkIGlucHV0IGZyb20gc3RkaW4uIFlvdSdsbCBiZSBhYmxlIHRvIGxvZ2luIGFuZAogICBydW4gY29tbWFuZHMgZXRjLCBidXQgc2luY2UgdGhlIG91dHB1dCBpcyBidWZmZXJlZCwgZXhwZWN0IHRvIGdldCBhIGxpdHRsZQogICB3ZWlyZCBvdXRwdXQuCgogICBUaGlzIGlzIHN0aWxsIGluIGl0cyBpbmZhbmN5IGFuZCBpdCBtaWdodCBnZXQgY2hhbmdlZC4gV2UgbmVlZCB5b3VyCiAgIGZlZWQtYmFjayBhbmQgaW5wdXQgaW4gaG93IHRoaXMgaXMgYmVzdCBkb25lLgoKICAgV0lOMzIgTk9URTogSSBiZXQgd2UnbGwgZ2V0IHByb2JsZW1zIHdoZW4gdHJ5aW5nIHRvIGNvbXBpbGUgdGhlIGN1cnJlbnQKICAgbGliL3RlbG5ldC5jIG9uIHdpbjMyLCBidXQgSSB0aGluayB3ZSBjYW4gc29ydCB0aGVtIG91dCBpbiB0aW1lLgoKIC0gRGF2aWQgU2FuZGVyc29uIHJlcG9ydGVkIHRoYXQgRk9SQ0VfQUxMT0NBX0ggb3IgSEFWRV9BTExPQ0FfSCBtdXN0IGJlCiAgIGRlZmluZWQgZm9yIGdldGRhdGUuYyB0byBjb21waWxlIHByb3Blcmx5IG9uIEhQLVVYIDExLjAuIEkgdXBkYXRlZCB0aGUKICAgY29uZmlndXJlIHNjcmlwdCB0byBjaGVjayBmb3IgYWxsb2NhLmggd2hpY2ggc2hvdWxkIG1ha2UgaXQuCgogRGFuaWVsICg0IEF1Z3VzdCAxOTk5KQogLSBJIGZpbmFsbHkgZ290IHRvIHVuZGVyc3RhbmQgTWFyY3VzIEtsZWluJ3MgZnRwIGRvd25sb2FkIHJlc3VtZSBwcm9ibGVtLAogICB3aGljaCB0dXJucyBvdXQgdG8gYmUgZHVlIHRvIGRpZmZlcmVudCBvdXRwdXRzIGZyb20gZGlmZmVyZW50IGZ0cAogICBzZXJ2ZXJzLiBJdCBtYWtlcyBmdHAgZG93bmxvYWQgcmVzdW1pbmcgYSBsaXR0bGUgdHJpY2tpZXIsIGJ1dCBJJ3ZlIG1hZGUKICAgc29tZSBtb2RpZmljYXRpb25zIEkgcmVhbGx5IGJlbGlldmUgd2lsbCB3b3JrIGZvciBtb3N0IGZ0cCBzZXJ2ZXJzIGFuZCBJIGRvCiAgIGhvcGUgeW91IHJlcG9ydCBpZiB5b3UgaGF2ZSBwcm9ibGVtcyB3aXRoIHRoaXMhCgogLSBBZGRlZCB0ZXh0IGFib3V0IGZpbGUgdHJhbnNmZXIgcmVzdW1pbmcgdG8gUkVBRE1FLmN1cmwuCgogRGFuaWVsICgyIEF1Z3VzdCAxOTk5KQogLSBBcHBsaWVkIGEgcHJvZ3Jlc3MtYmFyIHBhdGNoIGZyb20gTGFycyBKLiBBYXMuIEl0IG9mZmVycwogICBhIG5ldyBzdHlsZWQgcHJvZ3Jlc3MgYmFyIGVuYWJsZWQgd2l0aCAtIy8tLXByb2dyZXNzLWJhci4gCgogVC4gWWFtYWRhIDx0YWkgYXQgaW1hc3kub3IuanA+ICgzMCBKdWx5IDE5OTkpCiAtIEl0IGJyZWFrcyB3aXRoIHNlZ2ZhdWx0IHdoZW4gMSkgY3VybCBpcyB1c2luZyAubmV0cmMgdG8gb2J0YWluCiAgIHVzZXJuYW1lL3Bhc3N3b3JkIChvcHRpb24gJy1uJyksIGFuZCAyKSBpcyBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0ZWQgdG8KICAgYW5vdGhlciBsb2NhdGlvbiAob3B0aW9uICctTCcpLgoKICAgVGhlcmUgaXMgYSBzbWFsbCBidWcgaW4gbGliL3VybC5jIChibG9jayBzdGFydGluZyBmcm9tIGxpbmUgNjQxKSwgd2hpY2gKICAgdHJpZXMgdG8gdGFrZSBvdXQgdXNlcm5hbWUvcGFzc3dvcmQgZnJvbSB1c2VyLSBzdXBwbGllZCBjb21tYW5kLWxpbmUKICAgYXJndW1lbnQgKCctdScgb3B0aW9uKS4gVGhpcyBibG9jayBpcyBuZXZlciBleGVjdXRlZCBvbiBmaXJzdCBhdHRlbXB0IHNpbmNlCiAgIENPTkZfVVNFUlBXRCBiaXQgaXNuJ3Qgc2V0IGF0IGZpcnN0LCBidXQgY3VybCBsYXRlciB0dXJucyBpdCBvbiB3aGVuIGl0CiAgIGNoZWNrcyBmb3IgQ09ORl9ORVRSQyBiaXQuIFNvIHdoZW4gY3VybCB0cmllcyB0byByZWRvIGV2ZXJ5dGhpbmcgZHVlIHRvCiAgIHJlZGlyZWN0aW9uLCBpdCBzZWdmYXVsdHMgdHJ5aW5nIHRvIGFjY2VzcyAqZGF0YS0+dXNlcnB3ZC4KClZlcnNpb24gNS45LjEKCiBEYW5pZWwgKDMwIEp1bHkgMTk5OSkKIC0gU3RldmUgV2FsY2ggcG9pbnRlZCBvdXQgdGhhdCB0aGVyZSBpcyBhIG1lbW9yeSBsZWFrIGluIHRoZSBmb3JtZGF0YQogICBmdW5jdGlvbnMuIEkgYWRkZWQgYSBGb3JtRnJlZSgpIGZ1bmN0aW9uIHRoYXQgaXMgbm93IHVzZWQgYW5kIHN1cHBvc2VkIHRvCiAgIGNvcnJlY3QgdGhpcyBmbGF3LgoKIC0gTWFyayBXb3R0b24gcmVwb3J0ZWQ6CiAgICdjdXJsIC1MIGh0dHBzOi8vd3d3LmN3YS5jb20uYXUvJyBjb3JlIGR1bXBzLiAgSSBtYW5hZ2VkIHRvIGN1cmUgdGhpcyBieQogICBjb3JyZWN0aW5nIHRoZSBjbGVhbnVwIHByb2NlZHVyZS4gVGhlIGJ1ZyBzZWVtcyB0byBiZSBnb25lIHdpdGggbXkgT3BlblNTTAogICAwLjkuMmIsIGFsdGhvdWdoIHN0aWxsIG9jY3VycyB3aGVuIEkgcnVuIHRoZSB+MTAwIHllYXJzIG9sZCBTU0xlYXkgMC44LjAuIEkKICAgZG9uJ3Qga25vdyB3aGV0aGVyIGl0IGlzIGN1cmwgb3IgU1NMZWF5IHRoYXQgaXMgdG8gYmxhbWUgZm9yIHRoYXQuCgogLSBNYXJjdXMgS2xlaW46CiAgIFJlcG9ydGVkIGFuIEZUUCB1cGxvYWQgcmVzdW1lIGJ1ZyB0aGF0IEkgcmVhbGx5IGNhbid0IHJlcGVhdCBub3IgdW5kZXJzdGFuZC4KICAgSSBsZWF2ZSBpdCBoZXJlIHNvIHRoYXQgaXQgd29uJ3QgYmUgZm9yZ290dGVuLgoKIERhbmllbCAoMjkgSnVseSAxOTk5KQogLSBDb3N0eWEgU2h1bHl1cGluIHN1Z2dlc3RlZCBzdXBwb3J0IGZvciBsb25nZXIgVVJMcyB3aGVuIGZvbGxvd2luZyBMb2NhdGlvbjoKICAgYW5kIEkgY291bGQgb25seSBhZ3JlZSBhbmQgZml4IGl0IQoKIC0gTGVpZ2ggUHVyZGllIGZvdW5kIGEgcHJvYmxlbSBpbiB0aGUgdXBsb2FkL1BPU1QgZGVwYXJ0bWVudC4gSXQgdHVybmVkIG91dAogICB0aGF0IGh0dHAuYyBhY2NpZGVudGFseSBjbGVhcmVkIHRoZSBwb2ludGVyIGluc3RlYWQgb2YgdGhlIGJ5dGUgY291bnRlcgogICB3aGVuIHN1cHBvc2VkIHRvLgoKIC0gQ29zdHlhIFNodWx5dXBpbiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2l0aCBwb3J0IG51bWJlcnMgYW5kIExvY2F0aW9uOi4gSWYKICAgeW91IGhhZCBhIHNlcnZlciBhdCBhIG5vbi1zdGFuZGFyZCBwb3J0IHRoYXQgcmVkaXJlY3RlZCB0byBhbiBVUkwgdXNpbmcgYQogICBzdGFuZGFyZCBwb3J0IG51bWJlciwgY3VybCBzdGlsbCB1c2VkIHRoYXQgZmlyc3QgcG9ydCBudW1iZXIuCgogLSBSYWxwaCBCZWNrbWFubiBwb2ludGVkIG91dCBhIHByb2JsZW0gd2hlbiB1c2luZyBib3RoIENPTkZfRk9MTE9XTE9DQVRJT04KICAgYW5kIENPTkZfRkFJTE9ORVJST1Igc2ltdWx0YW5lb3VzbHkuIFNpbmNlIHRoZSBDT05GX0ZBSUxPTkVSUk9SIGV4aXRzIG9uCiAgIHRoZSAzMDItY29kZSB0aGF0IHRoZSBmb2xsb3cgbG9jYXRpb24gaGVhZGVyIG91dHB1dHMgaXQgd2lsbCBuZXZlciBzaG93IGFueQogICBodG1sIG9uIGxvY2F0aW9uOiBwYWdlcy4gSSBoYXZlIG5vdyBtYWRlIGl0IGxvb2sgZm9yID49NDAwIGNvZGVzIGlmCiAgIENPTkZfRk9MTE9XTE9DQVRJT04gaXMgc2V0LgoKIC0gJ3N0cnVjdCBzbGlzdCcgaXMgbm93IHJlbmFtZWQgdG8gJ3N0cnVjdCBjdXJsX3NsaXN0JyAoYXMgc3VnZ2VzdGVkIGJ5IFJhbHBoCiAgIEJlY2ttYW5uKS4KCiAtIEpvc2h1YSBTd2luayBhbmQgUmljayBXZWx5a29jaHkgd2VyZSB0aGUgZmlyc3QgdG8gcG9pbnQgb3V0IHRvIG1lIHRoYXQgdGhlCiAgIGxhdGVzdCBPcGVuU1NMIHBhY2thZ2Ugbm93IGhhdmUgbW92ZWQgdGhlIHN0YW5kYXJkIGluY2x1ZGUgcGF0aC4gSXQgaXMgbm93CiAgIGluIC91c3IvbG9jYWwvc3NsL2luY2x1ZGUvb3BlbnNzbCBhbmQgSSBoYXZlIG5vdyBtb2RpZmllZCB0aGUgLS1lbmFibGUtc3NsCiAgIG9wdGlvbiBmb3IgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gdXNlIHRoYXQgYXMgdGhlIHByaW1hcnkgcGF0aCwgYW5kIEkKICAgbGVhdmUgdGhlIGZvcm1lciBwYXRoIHRvbyB0byB3b3JrIHdpdGggb2xkZXIgcGFja2FnZXMgb2YgT3BlblNTTCB0b28uCgogRGFuaWVsICg5IEp1bmUgMTk5OSkKIC0gSSBmaW5hbGx5IHVuZGVyc3Rvb2QgdGhlIElSSVggcHJvYmxlbSBhbmQgbm93IGl0IHNlZW0gdG8gY29tcGlsZSBvbiBpdCEKICAgSSBhbSBnb25uYSByZW1vdmUgdGhvc2UgI2RlZmluZSBzdHJjYXNlY21wKCkgdGhpbmdzIG9uY2UgYW5kIGZvciBhbGwgbm93LgoKIERhbmllbCAoNCBKdW5lIDE5OTkpCiAtIEkgYWRqdXN0ZWQgdGhlIEZUUCByZXBseSAyMjcgcGFyc2VyIHRvIG1ha2UgdGhlIFBBU1YgY29tbWFuZCB3b3JrIGJldHRlcgogICB3aXRoIG1vcmUgZnRwIHNlcnZlcnMuIEFwcGVhcmFudGx5IHRoZSBSb3hlbiBDaGFsbGFuZ2VyIHNlcnZlciByZXBsaWVkCiAgIHNvbWV0aGluZyBjdXJsIDUuOSBjb3VsZCBkZWFsIHdpdGghIDotKCBSZXBvcnRlZCBieSBBc2hsZXkgUmVpZC1Nb250YW5hcm8KICAgYW5kIE1hcmsgQnV0bGVyIGJyb3VnaHQgYSBzb2x1dGlvbiBmb3IgaXQuCgogRGFuaWVsICgyNiBNYXkgMTk5OSkKIC0gUmVhcnJhbmdlZC4gUkVBRE1FIGlzIG5ldywgdGhlIG9sZCBvbmUgaXMgbm93IFJFQURNRS5jdXJsIGFuZCBJIGFkZGVkIGEKICAgUkVBRE1FLmxpYmN1cmwgd2l0aCB0ZXh0IEkgZ290IGZyb20gUmFscGggQmVja21hbm4uCgogLSBJIGFsc28gdXBkYXRlZCB0aGUgSU5TVEFMTCB0ZXh0LgoKIERhbmllbCAoMjUgTWF5IDE5OTkpCiAtIERhdmlkIEpvbmF0aGFuIExvd3NreSBjb3JyZWN0bHkgcG9pbnRlZCBvdXQgdGhhdCBjdXJsIGRpZG4ndCBwcm9wZXJseSBkZWFsCiAgIHdpdGggZm9ybSBwb3N0aW5nIHdoZXJlIHRoZSB2YXJpYWJsZSBzaG91bGRuJ3QgaGF2ZSBhbnkgY29udGVudCwgYXMgaW4gY3VybAogICAtRiAiZm9ybT0iIHd3dy5zaXRlLmNvbS4gSXQgd2FzIG5vdyBmaXhlZC4KClZlcnNpb24gNS45CgogRGFuaWVsICgyMiBNYXkgMTk5OSkKIC0gSSd2ZSBnb3QgYSBidWcgcmVwb3J0IGZyb20gQWFyb24gU2NhcmlzYnJpY2sgaW4gd2hpY2ggaGUgc3RhdGVzIGhlIGhhcyBzb21lCiAgIHByb2JsZW1zIHdpdGggLUwgdW5kZXIgRnJlZUJTRCAzLjAuIEkgaGF2ZSBwcmV2aW91c2x5IGdvdCBhbm90aGVyIGJ1ZwogICByZXBvcnQgZnJvbSBTdGVmYW4gR3JldGhlciB3aGljaCBwb2ludHMgYXQgYW4gZXJyb3Igd2l0aCBzaW1pbGFyIHN5bXB0aG9tcwogICB3aGVuIHVzaW5nIHdpbjMyLiBJIG1hZGUgdGhlIGFsbG9jYXRpb24gb2YgdGhlIG5ldyB1cmwgc3RyaW5nIGEgYml0IGZhc3RlcgogICBhbmQgZGlmZmVyZW50LCBkb24ndCBrbm93IGlmIGl0IGFjdHVhbGx5IGltcHJvdmVzIGFueXRoaW5nIHRob3VnaC4uLgoKIERhbmllbCAoMjAgTWF5IDE5OTkpCiAtIE1hZGUgdGhlIGNvb2tpZSBwYXJzZXIgZGVhbCB3aXRoIENSTEYgbmV3bGluZXMgdG9vLgoKIERhbmllbCAoMTkgTWF5IDE5OTkpCiAtIERvd25sb2FkKCkgZGlkbid0IHByb3Blcmx5IGRlYWwgd2l0aCBmYWlsaW5nIHJldHVybiBjb2RlcyBmcm9tIHRoZSBzcmVhZCgpCiAgIGZ1bmN0aW9uLiBBZGFtIENveW5lIGZvdW5kIHRoZSBwcm9ibGVtIGluIHRoZSB3aW4zMiB2ZXJzaW9uLCBhbmQgVHJveSBFbmdlbAogICBoZWxwZWQgbWUgb3V0IGlzb2xhdGluZyBpdC4KCiBEYW5pZWwgKDE2IE1heSAxOTk5KQogLSBSaWNoYXJkIEFkYW1zIHBvaW50ZWQgb3V0IGEgYnVnIEkgaW50cm9kdWNlZCBpbiA1LjguIC0tZHVtcC1oZWFkZXIgZG9lc24ndAogICB3b3JrIGFueW1vcmUhIDotLyBJIGZpeGVkIGl0IG5vdy4KCiAtIEFmdGVyIGEgc3VnZ2VzdGlvbiBieSBKb3NodWEgU3dpbmsgSSBhZGRlZCAtUyAvIC0tc2hvdy1lcnJvciB0byBmb3JjZSBjdXJsCiAgIHRvIGRpc3BsYXkgdGhlIGVycm9yIG1lc3NhZ2UgaW4gY2FzZSBvZiBhbiBlcnJvciwgZXZlbiBpZiAtcy8tLXNpbGVudCB3YXMKICAgdXNlZC4KCiBEYW5pZWwgKDEwIE1heSAxOTk5KQogLSBJIG1vdmVkIHRoZSBzdHVmZiBjb25jZXJuaW5nIEhUVFAsIERJQ1QgYW5kIFRFTE5FVCBpdCB0aGVpciBvd24gc291cmNlCiAgIGZpbGVzIG5vdy4gSXQgaXMgYSBiZWdpbm5pbmcgb24gbXkgY2xlYW4tdXAgb2YgdGhlIHNvdXJjZXMgdG8gbWFrZSB0aGVtCiAgIGxheWVyIGFsbCB0aG9zZSBwcm90b2NvbHMgYmV0dGVyIHRvIGVuYWJsZSBtb3JlIHRvIGJlIGFkZGVkIGVhc2llciBpbiB0aGUKICAgZnV0dXJlIQoKIC0gTGVvbiBCcmVlZHQgc2VudCBtZSBzb21lIGZpbGVzIEkndmUgbm90IHB1dCBpbnRvIHRoZSBtYWluIGN1cmwKICAgYXJjaGl2ZS4gVGhleSdyZSBmb3IgY3JlYXRpbmcgdGhlIERlYmlhbiBwYWNrYWdlIHRoaW5naWUuIEhlIGFsc28gc2VudCBtZSBhCiAgIGRlYmlhbiBwYWNrYWdlIHRoYXQgSSd2ZSBtYWRlIGF2YWlsYWJsZSBmb3IgZG93bmxvYWQgYXQgdGhlIHdlYiBwYWdlCgogRGFuaWVsICg5IE1heSAxOTk5KQogLSBNYWRlIGl0IGNvbXBpbGUgb24gY3lnd2luIHRvby4KCiBUcm95IEVuZ2VsICg3IE1heSAxOTk5KQogLSBCcm91Z2h0IGEgc2VyaWVzIG9mIHBhdGNoZXMgdG8gYWxsb3cgY3VybCB0byBjb21waWxlIHNtb290aGx5IG9uIE1TVkMrKyA2CiAgIGFnYWluIQoKIERhbmllbCAoNiBNYXkgMTk5OSkKIC0gSSBjaGFuZ2VkIHRoZSAjaWZkZWYgSEFWRV9TVFJGVElNRSBwbGFjZW1lbnQgZm9yIHRoZSAteiBjb2RlIHNvIHRoYXQgaXQKICAgd2lsbCBiZSBlYXNpZXIgdG8gZGlzY292ZXIgc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgdGhhdCBmdW5jdGlvbiBhbmQgdGh1cwogICBjYW4ndCB1c2UgLXogc3VjY2Vzc2Z1bGx5LiBNYWRlIHRoZSBzdHJmdGltZSgpIGdldCB1c2VkIGlmIFdJTjMyIGlzIGRlZmluZWQKICAgdG9vLgoKVmVyc2lvbiA1LjgKCiBEYW5pZWwgKDUgTWF5IDE5OTkpCiAtIEkndmUgaGFkIGl0IHdpdGggdGhpcyBhdXRvY29uZi9hdXRvbWFrZSBtZXNzLiBJdCBzZWVtcyB0byB3b3JrIGFsbHJpZ2h0CiAgIGZvciBtb3N0IHBlb3BsZSB3aG8gZG9uJ3QgaGF2ZSBhdXRvbWFrZSBpbnN0YWxsZWQsIGJ1dCBmb3IgdGhvc2Ugd2hvIGhhdmUKICAgdGhlcmUgYXJlIHByb2JsZW1zIGFsbCBvdmVyLgoKICAgSSd2ZSBnb3QgbGlrZSBmaXZlIGRpZmZlcmVudCBidWcgcmVwb3J0cyBvbiB0aGlzIG9ubHkgdGhlIGxhc3QKICAgd2Vlay4uLiBDbGF1ZGlvIE5ldmVzIGFuZCBGZWRlcmljbyBCaWFuY2hpIGFuZCByb290IDxkdWdnZXJqMDAxIGF0CiAgIGhhd2FpaS5yci5jb20+IGFyZSBzb21lIG9mIHRoZW0gcmVwb3J0aW5nIHRoaXMuCgogICBDdXJyZW50bHksIEkgaGF2ZSBubyByZWFsbHkgZ29vZCBmaXggc2luY2UgSSB3YW50IHRvIHVzZSBhdXRvbWFrZSBteXNlbGYgdG8KICAgZ2VuZXJhdGUgdGhlIE1ha2VmaWxlLmluIGZpbGVzLiBJJ3ZlIGZvdW5kIG91dCB0aGF0IHRoZSBAU0hFTExALXByb2JsZW1zCiAgIGNhbiBvZnRlbiBiZSBmaXhlZCBieSBtYW51YWxseSBpbnZva2luZyAnYXV0b21ha2UnIGluIHRoZSBhcmNoaXZlIHJvb3QKICAgYmVmb3JlIHlvdSBydW4gLi9jb25maWd1cmUuLi4gSSd2ZSBoYWNrZWQgbXkgbWFrZXRneiBzY3JpcHQgbm93IHRvIGZpZGRsZQogICBhIGJpdCB3aXRoIHRoaXMgYW5kIG15IHRlc3RzIHNlZW0gdG8gd29yayBiZXR0ZXIgdGhhbiBiZWZvcmUgYXQgbGVhc3QhCgogRGFuaWVsICg0IE1heSAxOTk5KQogLSBta2hlbHAucGwgaGFzIGJlZW4gZG9pbmcgYmFkbHkgbGF0ZWx5LiBJIGNvcnJlY3RlZCBhIGNhc2UgcHJvYmxlbSBpbgogICB0aGUgcmVnZXhlcy4KCiAtIEkndmUgbm93IHJlbWFkZSB0aGUgLW8gb3B0aW9uIHRvIG5vdCB0b3VjaCB0aGUgZmlsZSB1bmxlc3MgaXQgbmVlZHMgdG8uCiAgIEkgaGFkIHRvIGRvIHRoaXMgdG8gbWFrZSAteiBvcHRpb24gcmVhbGx5IGZpbmUsIHNpbmNlIG5vdyB5b3UgY2FuIG1ha2UgYQogICBjdXJsIGZldGNoIGFuZCB1c2UgYSBsb2NhbCBjb3B5J3MgdGltZSB3aGVuIGRvd25sb2FkaW5nIHRvIHRoYXQgZmlsZSwgYXMKICAgaW46CgogICAgICAgIGN1cmwgLXogZHVtcCAtbyBkdW1wIHJlbW90ZS5zaXRlLmNvbS9maWxlLmh0bWwKCiAgIFRoaXMgd2lsbCBvbmx5IGdldCB0aGUgZmlsZSBpZiB0aGUgcmVtb3RlIG9uZSBpcyBuZXdlciB0aGFuIHRoZSBsb2NhbC4KICAgSSdtIGF3YXJlIHRoYXQgdGhpcyBhbHRlcnMgcHJldmlvdXMgYmVoYXZpb3VyIGEgbGl0dGxlLiBTb21lIHNjcmlwdHMgb3V0CiAgIHRoZXJlIG1heSBkZXBlbmQgb24gdGhhdCB0aGUgZmlsZSBpcyBhbHdheXMgdG91Y2hlZC4uLgoKIC0gQ29ycmVjdGVkIGEgYnVnIGluIHRoZSBTU0x2Mi92MyBzZWxlY3Rpb24uCgogLSBGZWxpeCB2b24gTGVpdG5lciByZXF1ZXN0ZWQgdGhhdCBjdXJsIHNob3VsZCBiZSBhYmxlIHRvIHNlbmQKICAgIklmLU1vZGlmaWVkLVNpbmNlIiBoZWFkZXJzLCB3aGljaCBpbmRlZWQgaXMgYSBmYWlyIGlkZWEuICBJIGltcGxlbWVudGVkIGl0CiAgIHJpZ2h0IGF3YXkhIFRyeSAteiA8ZXhwcmVzc2lvbj4gd2hlcmUgZXhwcmVzc2lvbiBpcyBhIGZ1bGwgR05VIGRhdGUKICAgZXhwcmVzc2lvbiBvciBhIGZpbGUgbmFtZSB0byBnZXQgdGhlIGRhdGUgZnJvbSEKCiBTdGVwaGFuIExhZ2VyaG9sbSAoMzAgQXByIDE5OTkpCiAtIFBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIHRoZSBzcmMvTWFrZWZpbGUgZm9yIEZyZWVCU0QuIFRoZSBSTSB2YXJpYWJsZQogICBpc24ndCBzZXQgYW5kIGNhdXNlcyB0aGUgbWFrZSB0byBmYWlsLgoKIERhbmllbCAoMjYgQXByaWwgMTk5OSkKIC0gQW0gSSBzaWxseSBvciB3aGF0PyBJcnZpbmcgV29sZmUgcG9pbnRlZCBvdXQgdG8gbWUgdGhhdCB0aGUgY3VybCB2ZXJzaW9uCiAgIG51bWJlciB3YXMgbm90IHNldCBwcm9wZXJseS4gSGFzbid0IGJlZW4gc2luY2UgNS42LiBUaGlzIHdhcyBkdWUgdG8gYSBidWcKICAgaW4gbXkgbWFrZXRneiBzY3JpcHQhCgogRGF2aWQgRXJpa3Nzb24gKDI1IEFwciAxOTk5KQogLSBGb3VuZCBhIGJ1ZyBpbiBjb29raWVzLmMgdGhhdCBtYWRlIGl0IGNyYXNoIGF0IHRpbWVzLgoKVmVyc2lvbiA1LjcuMQoKIERvdWcgS2F1Zm1hbiAoMjMgQXByIDE5OTkpCiAtIEJyb3VnaHQgdHdvIHN1bm9zIDQgZml4ZXMuIE9uZSBvZiB0aGVtIGJlaW5nIHRoZSBob3N0aXAuYyBmaXggbWVudGlvbmVkCiAgIGJlbG93IGFuZCB0aGUgb3RoZXIgb25lIGEgY29ycmVjdGlvbiBpbiBpbmNsdWRlL3N0ZGNoZWFkZXJzLmgKCiAtIEFkZGVkIGEgcGFyYWdyYXBoIGFib3V0IGNvbXBpbGluZyB3aXRoIHRoZSBVUy12ZXJzaW9uIG9mIG9wZW5zc2wgdG8gdGhlCiAgIElOU1RBTEwgZmlsZS4KCiBEYW5pZWwKIC0gTmV3IG1haWxpbmcgbGlzdCBhZGRyZXNzLiBJbmZvIHVwZGF0ZWQgb24gdGhlIHdlYiBwYWdlIGFzIHdlbGwgYXMgaW4gdGhlCiAgIFJFQURNRSBmaWxlCgogR3JlZyBPbnVmZXIgKDIwIEFwciAxOTk5KQogLSBob3N0aXAuYyBkaWRuJ3QgY29tcGlsZSBwcm9wZXJseSBvbiBTdW5PUyA1LjUuMS4KICAgSXQgbmVlZHMgYW4gI2luY2x1ZGUgPHN5cy90eXBlcy5oPgoKVmVyc2lvbiA1LjcKCiBEYW5pZWwgKEFwciAyMCAxOTk5KQogLSBEZWNpZGVkIHRvIHVwbG9hZCBhIG5vbi1iZXRhIHZlcnNpb24gcmlnaHQgbm93IQoKIC0gTWFkZSBjdXJsIHN1cHBvcnQgYW55LWxlbmd0aCBIVFRQIGhlYWRlcnMuIFRoZSBkZXN0aW5hdGlvbiBidWZmZXIgaXMgbm93CiAgIHNpbXBseSBlbmxhcmdlZCBldmVyeSB0aW1lIGl0IHR1cm5zIG91dCB0byBiZSB0b28gc21hbGwhCgogLSBBZGRlZCB0aGUgRkFRIGZpbGUgdG8gdGhlIGFyY2hpdmUuIFN0aWxsIGEgYml0IHNtYWxsaXNoLCBidXQgaXQgaXMgYQogICBzdGFydC4KCiBFcmljIFRoZWxpbiAoMTUgQXByIDE5OTkpCiAtIE1hZGUgLUQgYWNjZXB0ICctJyBpbnN0ZWFkIG9mIGZpbGVuYW1lIHRvIHdyaXRlIHRvIHN0ZG91dC4KClZlcnNpb24gNS42LjNiZXRhCgogRGFuaWVsIChBcHIgMTIgMTk5OSkKCiAtIENoYW5nZWQgdHdvICNpZmRlZiBXSU4zMiB0byBiZXR0ZXIgI2lmZGVmIDxlcnJvcmNvZGU+IHdoZW4gY29ubmVjdCgpaW5nCiAgIGluIHVybC5jIGFuZCBmdHAuYy4gTWFrZXMgY3lnd2luMzIgZGVhbCB3aXRoIHRoZW0gYmV0dGVyIHRvby4gV2Ugc2hvdWxkCiAgIHRyeSB0byBnZXQgc29tZSBkZWNlbnQgd2luMzItcmVwbGFjZW1lbnQgdGhlcmUuIEFueW9uZT8KCiAtIFRoZSBvbGQgLTMvLS1jcmxmIG9wdGlvbiBpcyBub3cgT05MWSAtLWNybGYhCgogLSBJIGNoYW5nZWQgdGhlICJTU0wgZml4IiB0byBhIG1vcmUgbGFtZSBvbmUsIGJ1dCB0aGF0IGRvZXNuJ3QgcmVtb3ZlIGFzCiAgIG11Y2ggZnVuY3Rpb25hbGl0eS4gTm93IEkndmUgZW5hYmxlZCB0aGUgbGliIHRvIHNlbGVjdCB3aGF0IFNTTCB2ZXJzaW9uIGl0CiAgIHNob3VsZCB0cnkgZmlyc3QuIEFwcGVhcmFudGx5IHNvbWUgb2xkZXIgU1NMLXNlcnZlcnMgZG9uJ3QgbGlrZSB3aGVuIHlvdQogICB0YWxrIHYzIHdpdGggdGhlbSBzbyB5b3UgbmVlZCB0byBiZSBhYmxlIHRvIGZvcmNlIGN1cmwgdG8gdGFsayB2MiBmcm9tIHRoZQogICBzdGFydC4gVGhlIGZpeCBkYXRlZCBBcHJpbCA2IGFuZCBwb3N0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCBmb3JjZWQgY3VybCB0bwogICB1c2UgdjIgYXQgYWxsIHRpbWVzIHVzaW5nIGEgbW9kZXJuIE9wZW5TU0wgdmVyc2lvbiwgYnV0IHdlIGRvbid0IHJlYWxseQogICB3YW50IHN1Y2ggYSBjcmlwcGxlZCBzb2x1dGlvbi4KIAogLSBNYXJjIEJvdWNoZXIgc2VudCBtZSBhIHBhdGNoIHRoYXQgY29ycmVjdGVkIGEgbWF0aCBlcnJvciBmb3IgdGhlCiAgICJDdXJyLlNwZWVkIiBwcm9ncmVzcyBtZXRlci4KCiAtIEVyaWMgVGhlbGluIHNlbnQgbWUgYSBwYXRjaCB0aGF0IGVuYWJsZXMgJy1LIC0nIHRvIHJlYWQgYSBjb25maWcgZmlsZSBmcm9tCiAgIHN0ZGluLgoKIC0gSSBmb3VuZCBvdXQgd2UgZGlkbid0IGNsb3NlIHRoZSBmaWxlIHByb3Blcmx5IGJlZm9yZSBzbyBJIGFkZGVkIGl0IQoKIERhbmllbCAoQXByIDkgMTk5OSkKIC0gWXUgWGluIHBvaW50ZWQgb3V0IGEgcHJvYmxlbSB3aXRoIGZ0cCBkb3dubG9hZCByZXN1bWUuICBJdCBkaWRuJ3Qgd29yayBhdAogICBhbGwhIDstTwoKIERhbmllbCAoQXByIDYgMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSB2ZXJzaW9uIHN0cmluZyBwYXJ0IGdlbmVyYXRlZCBmb3IgdGhlIFNTTCB2ZXJzaW9uLgoKIC0gSSBmb3VuZCBhIHdheSB0byBtYWtlIHNvbWUgb3RoZXIgU1NMIHBhZ2Ugd29yayB3aXRoIG9wZW5zc2wgMC45LjErIHRoYXQKICAgcHJldmlvdXNseSBkaWRuJ3QgKHNzbGVheSAwLjguMCB3b3JrcyB3aXRoIGl0IHRob3VnaCEpLiBUcnlpbmcgdG8gZ2V0CiAgIHNvbWUgcmVhbCBpbmZvIGZyb20gdGhlIE9wZW5TU0wgZ3V5cyB0byBzZWUgaG93IEkgc2hvdWxkIGRvIHRvIGJlaGF2ZSB0aGUKICAgYmVzdCB3YXkuIFNTTGVheSAwLjguMCBzaG91bGRuJ3QgYmUgdGhhdCBtdWNoIGluIHVzZSBhbnl3YXkgdGhlc2UgZGF5cyEKClZlcnNpb24gNS42LjJiZXRhCgogRGFuaWVsIChBcHIgNCAxOTk5KQogLSBGaW5hbGx5IGhhdmUgY3VybCBtb3JlIGNvb2tpZSAiYXdhcmUiLiBOb3cgcmVhZCBjYXJlZnVsbHkuIFRoaXMgaXMgaG93CiAgIGl0IHdvcmtzLgogICBUbyBtYWtlIGN1cmwgcmVhZCBjb29raWVzIGZyb20gYW4gYWxyZWFkeSBleGlzdGluZyBmaWxlLCBpbiBwbGFpbiBoZWFkZXItCiAgIGZvcm1hdCAobGlrZSBmcm9tIHRoZSBoZWFkZXJzIG9mIGEgcHJldmlvdXMgZmV0Y2gpIGludm9rZSBjdXJsIHdpdGggdGhlCiAgIC1iIGZsYWcgbGlrZToKCiAgICAgICAgY3VybCAtYiBmaWxlIGh0dHA6Ly9zaXRlL2Zvby5odG1sCgogICBDdXJsIHdpbGwgdGhlbiB1c2UgYWxsIGNvb2tpZXMgaXQgZmluZHMgbWF0Y2hpbmcuIFRoZSBvbGQgc3R5bGUgdGhhdCBzZXRzCiAgIGEgc2luZ2xlIGNvb2tpZSB3aXRoIC1iIGlzIHN0aWxsIHN1cHBvcnRlZCBhbmQgaXMgdXNlZCBpZiB0aGUgc3RyaW5nCiAgIGZvbGxvd2luZyAtYiBpbmNsdWRlcyBhICc9JyBsZXR0ZXIsIGFzIGluICItYiBuYW1lPWRhbmllbCIuCgogICBUbyBtYWtlIGN1cmwgcmVhZCB0aGUgY29va2llcyBzZW50IGluIGNvbWJpbmF0aW9uIHdpdGggYSBsb2NhdGlvbjogKHdoaWNoCiAgIHNpdGVzIG9mdGVuIGRvKSBwb2ludCBjdXJsIHRvIHJlYWQgYSBub24tZXhpc3RpbmcgZmlsZSBhdCBmaXJzdCAoaS5lCiAgIHRvIHN0YXJ0IHdpdGggbm8gZXhpc3RpbmcgY29va2llcyksIGxpa2U6CgogICAgICAgIGN1cmwgLWIgbm93aGVyZSBodHRwOi8vc2l0ZS9zZXRjb29raWVhbmRyZWxvY2F0ZS5odG1sCgogLSBBZGRlZCBhIHBhcmFncmFwaCBpbiB0aGUgVE9ETyBmaWxlIGFib3V0IHRoZSBTU0wgcHJvYmxlbXMgcmVjZW50bHkKICAgcmVwb3J0ZWQuIEV2aWRlbnRseSwgc29tZSBraW5kIG9mIFNTTC1wcm9ibGVtIGN1cmwgbWF5IG5lZWQgdG8gYWRkcmVzcy4KCiAtIEJldHRlciAiTG9jYXRpb246IiBmb2xsb3dpbmcuCgogRG91Z2xhcyBFLiBXZWdzY2hlaWQgKFR1ZSwgMzAgTWFyIDE5OTkpCiAtIEEgc3Vic2Vjb25kIGRpc3BsYXkgcGF0Y2guCgogRGFuaWVsIChNYXIgMTQgMTk5OSkKIC0gSSd2ZSBzZXBhcmF0ZWQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIGxpYmN1cmwgYW5kIGN1cmwgbm93LiBUbyBtYWtlCiAgIHRoaW5ncyBhIGxpdHRsZSBlYXNpZXIsIEkgZGVjaWRlZCB0byBzdGFydCB0aGUgY3VybCBudW1iZXJpbmcgZnJvbQogICA1LjYgYW5kIHRoZSBmb3JtZXIgdmVyc2lvbiBudW1iZXIga25vd24gYXMgImN1cmwiIGlzIG5vdyB0aGUgb25lCiAgIHNldCBmb3IgbGliY3VybC4KCiAtIFJlbW92ZWQgdGhlICdlbmFibGUtbm8tcGFzcycgZnJvbSBjb25maWd1cmUsIEkgZG91YnQgYW55b25lIHdhbnRlZAogICB0aGF0LgoKIC0gTWFkZSBsb3RzIG9mIHRpbnkgYWRqdXN0bWVudHMgdG8gY29tcGlsZSBzbW9vdGhseSB3aXRoIGN5Z3dpbiB1bmRlcgogICB3aW4zMi4gSXQncyBhIGtpbGxlciBmb3IgcG9ydGluZyB0aGlzIHRvIHdpbjMyLCBieWUgYnllIFZDKyshIDstKQogICBDb21waWxlcyBhbmQgYnVpbGRzIG91dC1vZi10aGUtYm94IG5vdy4gU2VlIHRoZSBuZXcgd29yZGluZ3MgaW4KICAgSU5TVEFMTCBmb3IgZGV0YWlscy4KCiAtIEJlZ2lubmluZyBleHBlcmltZW50cyB3aXRoIGRvd25sb2FkaW5nIG11bHRpcGxlIGRvY3VtZW50IGZyb20gYSBodHRwCiAgIHNlcnZlciB3aGlsZSByZW1haW5pbmcgY29ubmVjdGVkLgoKVmVyc2lvbiA1LjZiZXRhCgogRGFuaWVsIChNYXIgMTMgMTk5OSkKIC0gU2luY2UgSSd2ZSBjaGFuZ2VkIHNvIG11Y2gsIEkgdGhvdWdodCBJJ2QganVzdCBnbyBhaGVhZCBhbmQgaW1wbGVtZW50IHRoZQogICBzdWdnZXN0aW9uIGZyb20gRG91Z2xhcyBFLiBXZWdzY2hlaWQuIC1EIG9yIC0tZHVtcC1oZWFkZXIgaXMgbm93IHN0b3JpbmcKICAgSFRUUCBoZWFkZXJzIHNlcGFyYXRlbHkgaW4gdGhlIHNwZWNpZmllZCBmaWxlLgoKIC0gQWRkZWQgbmV3IHRleHQgdG8gSU5TVEFMTCBvbiB3aGF0IHRvIGRvIHRvIGJ1aWxkIHRoaXMgb24gd2luMzIgbm93LgoKIC0gQWFhcmdoLiBJIGhhZCB0byB0YWtlIGEgc3RlcCBiYWNrIGFuZCBwcmVmaXggdGhlIHNoYXJlZCAjaW5jbHVkZSBmaWxlcwogICBpbiB0aGUgc291cmNlcyB3aXRoICIuLi9pbmNsdWRlLyIgdG8gcGxlYXNlIFZDKysuLi4KCiBEYW5pZWwgKE1hciAxMiAxOTk5KQogLSBTcGxpdCB0aGUgdXJsLmMgc291cmNlIGludG8gbWFueSB0aW55IHNvdXJjZXMgZm9yIGJldHRlciByZWFkYWJpbGl0eQogICBhbmQgc21hbGxlciBzaXplLgoKIERhbmllbCAoTWFyIDExIDE5OTkpCiAtIFN0YXJ0ZWQgdG8gY2hhbmdlIHN0dWZmIGZvciBhIG1vdmUgdG8gbWFrZSBsaWJjdXJsIGFuZCBhIG1vcmUgc2VwYXJhdGUKICAgY3VybCBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgdGhlIGxpYmN1cmwuIE1hZGUgdGhlIGxpYmN1cmwgc291cmNlcyBpbnRvCiAgIHRoZSBuZXcgbGliIGRpcmVjdG9yeSB3aGlsZSB0aGUgY3VybCBhcHBsaWNhdGlvbiB3aWxsIHJlbWFpbiBpbiBzcmMgYXMKICAgYmVmb3JlLiBOZXcgbWFrZWZpbGVzLCBhZGp1c3RlZCBjb25maWd1cmUgc2NyaXB0IGFuZCBzby4KCiAgIGxpYmN1cmwuYSBidWlsdCBxdWlja2x5IGFuZCBlYXNpbHkuIEkgYmV0dGVyIG1ha2UgYSBiZXR0ZXIgaW50ZXJmYWNlIHRvCiAgIHRoZSBsaWIgZnVuY3Rpb25zIHRob3VnaC4KCiAgIFRoZSBuZXcgcm9vdCBkaXIgaW5jbHVkZS8gaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0aGUgcHVibGljIGluZm9ybWF0aW9uCiAgIGFib3V0IHRoZSBuZXcgbGliY3VybC4gSXQgaXMgYSBsaXR0bGUgdWdseSBzbyBmYXIgOi0pCgoKIERhbmllbCAoTWFyIDEgMTk5OSkKIC0gVG9kZCBLYXVmbWFubiBzZW50IG1lIGEgZ29vZCBsaW5rIHRvIE5ldHNjYXBlJ3MgY29va2llIHNwZWMgYXMgd2VsbCBhcyB0aGUKICAgaW5mbyB0aGF0IFJGQyAyMTA5IHNwZWNpZmllcyBob3cgdG8gdXNlIHRoZW0uICBUaGUgbGluayBpcyBub3cgaW4gdGhlCiAgIFJFQURNRSBhbmQgdGhlIFJGQyBpbiB0aGUgUkVTT1VSQ0VTLgoKIERhbmllbCAoRmViIDIzIDE5OTkpCiAtIEZpbmFsbHkgbWFkZSBjb25maWd1cmUgYWNjZXB0IC0td2l0aC1zc2wgdG8gbG9vayBmb3IgU1NMIGxpYnMgYW5kIGluY2x1ZGVzCiAgIGluIHRoZSAic3RhbmRhcmQiIHBsYWNlIC91c3IvbG9jYWwvc3NsLi4uCgogRGFuaWVsIChGZWIgMjIgMTk5OSkKIC0gVmVyaWZpZWQgdGhhdCBjdXJsIGxpbmtlZCBmaW5lIHdpdGggT3BlblNTTCAwLjkuMWMgd2hpY2ggc2VlbXMgdG8gYmUKICAgdGhlIG1vc3QgcmVjZW50LgoKIEhlbnJpIEdvbWV6IChGcmkgRmViICA1IDE5OTkpCiAtIFNlbnQgaW4gYW4gdXBkYXRlZCBjdXJsLXNzbC5zcGVjLiBJIHN0aWxsIG1pc3MgdGhlIHNjcmlwdCB0aGF0IGJ1aWxkcyBhbgogICBSUE0gYXV0b21hdGljYWxseS4uLgoKVmVyc2lvbiA1LjUuMQoKIE1hcmsgQnV0bGVyICgyNyBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHByb2JsZW1zIGluIERvd25sb2FkKCkuCgogRGFuaXRlbCBTdGVuYmVyZyAoMjUgSmFuIDE5OTkpCiAtIEplcmVtaWUgUGV0aXQgcG9pbnRlZCBvdXQgYSBmZXcgZmxhd3MgaW4gdGhlIHNvdXJjZSB0aGF0IHByZXZlbnRlZCBpdCBmcm9tCiAgIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhlIG5hdGl2ZSBjb21waWxlciB1bmRlciBEaWdpdGFsIFVuaXggdjQuMGQuCgpWZXJzaW9uIDUuNQoKIERhbmllbCBTdGVuYmVyZyAoMTUgSmFuIDE5OTkpCiAtIEFkZGVkIEJqb3JucyBzbWFsbCB0ZXh0IHRvIHRoZSBSRUFETUUgYWJvdXQgdGhlIERJQ1QgcHJvdG9jb2wuCgogRGFuaWVsIFN0ZW5iZXJnICgxMSBKYW4gMTk5OSkKIC0gPGpzd2luayBhdCBzb2Z0Y29tLm5ldD4gcmVwb3J0ZWQgYWJvdXQgdGhlIHdpbjMyLXZlcnNpb2luOiAiRG9lc24ndCB1c2UKICAgQUxMX1BST1hZIGVudmlyb25tZW50IHZhcmlhYmxlIi4gVHVybmVkIG91dCB0byBiZSBiZWNhdXNlIG9mIHRoZSBzdGF0aWMtCiAgIGJ1ZmZlciBuYXR1cmUgb2YgdGhlIHdpbjMyIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbGxzIQoKIEJqb3JuIFJlZXNlICgxMCBKYW4gMTk5OSkKIC0gSSBoYXZlIGF0dGFjaGVkIGEgc2ltcGxlIGFkZGl0aW9uIGZvciB0aGUgRElDVCBwcm90b2NvbCAoUkZDIDIyMjkpLgogICBJdCBwZXJmb3JtcyBkaWN0aW9uYXJ5IGxvb2t1cHMuIFRoZSBvdXRwdXQgc3RpbGwgbmVlZHMgdG8gYmUgYmV0dGVyCiAgIGZvcm1hdHRlZC4KCiAgIFRvIHRlc3QgaXQgdHJ5ICh0aGUgZXhhY3QgZm9ybWF0LCBhbmQgbW9yZSBleGFtcGxlcyBhcmUgZGVzY3JpYmVkIGluCiAgIHRoZSBSRkMpCgogICAgICAgIGRpY3Q6Ly9kaWN0Lm9yZy9tOmhlbGxvCiAgICAgICAgZGljdDovL2RpY3Qub3JnL206aGVsbG86OnNvdW5kZXgKCgogVmljZW50ZSBHYXJjaWEgKDEwIEphbiAxOTk5KQogLSBDb3JyZWN0ZWQgdGhlIHByb2dyZXNzIG1ldGVyIGZvciBmaWxlcyBsYXJnZXIgdGhhbiAyME1CLgoKIERhbmllbCBTdGVuYmVyZyAoNyBKYW4gMTk5OSkKIC0gQ29ycmVjdGVkIHRoZSAtdCBhbmQgLVQgaGVscCB0ZXh0cy4gVGhleSBjbGFpbWVkIHRvIGJlIEZUUCBvbmx5LgoKVmVyc2lvbiA1LjQKCiBEYW5pZWwgU3RlbmJlcmcKICg3IEphbiAxOTk5KQogLSBJcnZpbmcgV29sZmUgcmVwb3J0ZWQgdGhhdCBjdXJsIC1zIGRpZG4ndCBhbHdheXMgc3VwcmVzcyB0aGUgcHJvZ3Jlc3MKICAgcmVwb3J0aW5nLiBJdCB3YXMgdGhlIGZvcm0gcG9zdCB0aGF0IGF1dG9hbXRpY2FsbHkgYWx3YXlzIHN3aXRjaGVkIGl0IG9uCiAgIGFnYWluLiBUaGlzIGlzIG5vdyBjb3JyZWN0ZWQhCgogKDQgSmFuIDE5OTkpCiAtIEFuZHJlYXMgS29zdHlya2Egc3VnZ2VzdGVkIEknZCBhZGQgUFVUIGFuZCBoZSBoZWxwZWQgbWUgb3V0IHRvIHRlc3QgaXQuIElmCiAgIHlvdSB1c2UgLXQgb3IgLVQgbm93IG9uIGEgaHR0cCBvciBodHRwcyBzZXJ2ZXIsIFBVVCB3aWxsIGJlIHVzZWQgZm9yIGZpbGUKICAgdXBsb2FkLgoKICAgSSByZW1vdmVkIHRoZSBmb3JtZXIgdXNlIG9mIC1UIHdpdGggSFRUUC4gSSBkb3VidCBhbnlvbmUgZXZlciByZWFsbHkgdXNlZAogICB0aGF0LgoKICg0IEphbiAxOTk5KQogLSBFcmlrIEphY29ic2VuIGZvdW5kIGEgd2lkdGggYnVnIGluIHRoZSBtcHJpbnRmKCkgZnVuY3Rpb24uICBJIGNvcnJlY3RlZCBpdAogICBub3cuCgogKDQgSmFuIDE5OTkpCiAtIEFzIEpvaG4gVi4gQ2hvdyBwb2ludGVkIG91dCB0byBtZSwgY3VybCBhY2NlcHRlZCB2ZXJ5IGxpbWl0ZWQgVVJMIHNpemVzLiBJdAogICBzaG91bGQgbm93IGFjY2VwdCBwYXRoIHBhcnRzIHRoYXQgYXJlIHVwIHRvIGF0IGxlYXN0IDQwOTYgYnl0ZXMuCgogLSBTb21laG93IEkgc2NyZXdlZCB1cCB3aGVuIGFwcGx5aW5nIHRoZSBBSVggZml4IGZyb20gR2lsYmVydCBSYW1pcmV6LCBzbwogICBJIHJlZGlkIHRoYXQgbm93LgoKVmVyc2lvbiA1LjNhICh3aW4zMiBvbmx5KQoKIFRyb3kgRW5nZWwKIC0gQ29ycmVjdGVkIGEgd2luMzIgYnVnIGluIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBwYXJ0LgoKVmVyc2lvbiA1LjMKCiBHaWxiZXJ0IFJhbWlyZXogSnIuICgyMSBEZWMgMTk5OCkKIC0gSSBoYXZlIGltcGxlbWVudGVkIHRoZSAicXVvdGUiIGZ1bmN0aW9uIG9mIEZUUCBjbGllbnRzLiBJdCBhbGxvd3MgeW91IHRvCiAgIHNlbmQgYXJiaXRyYXJ5IGNvbW1hbmRzIHRvIHRoZSByZW1vdGUgRlRQIHNlcnZlci4gSSBjaG9zZSB0aGUgLVEvLS1xdW90ZQogICBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgoKICAgWW91IGNhbiBoYXZlIG1vcmUgdGhhbiBvbmUgcXVvdGVkIHN0cmluZywgYW5kIGN1cmwgd2lsbCBhcHBseSB0aGVtIGluCiAgIG9yZGVyLiAgVGhpcyBpcyB3aGF0IEkgdXNlIGZvciBteSBNVlMgdXBsb2FkOgoKICBjdXJsIC1CIC0tY3JsZiAtUSAic2l0ZSBscmVjbD04MCIgLVEgInNpdGUgYmxrPTgwMDAiIC1UIGZpbGUgZnRwOi8vb3MzOTAvdGVzdAoKICAgQ3VybCB3aWxsIHNlbmQgdGhlIHR3byBxdW90ZWQgInNpdGUiIGNvbW1hbmRzIGluIHRoZSBwcm9wZXIgb3JkZXIuCgogLSBNYWRlIGl0IGNvbXBpbGUgc21vb3RobHkgb24gQUlYLgoKIEdpbGJlcnQgUmFtaXJleiBKci4gKDE4IERlYyAxOTk4KQogLSBCcm91Z2h0IGFuIE1WUyBwYXRjaDogLTMvLS1tdnMsIGZvciBmdHAgdXBsb2FkIHRvIHRoZSBNVlMgZnRwIHNlcnZlci4KCiBUcm95IEVuZ2VsICgxNyBEZWMgMTk5OCkKIC0gQnJvdWdodCBhIGNvcnJlY3Rpb24gdGhhdCBmaXhlcyB0aGUgd2luMzIgY3VybCBidWcuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIEEgYnVnLCBwb2ludGVkIG91dCB0byBtZSBieSBEciBILiBULiBMZXVuZywgY2F1c2VkIGN1cmwgdG8gY3Jhc2ggb24gdGhlIC1BCiAgIGZsYWcgb24gY2VydGFpbiBzeXN0ZW1zLiBBY3R1YWxseSwgYWxsIHN5c3RlbXMgc2hvdWxkJ3ZlIQoKIC0gQWRkZWQgYSBmZXcgZGVmaW5lcyB0byBtYWtlIGRpcmVjdG9yaWVzL2ZpbGUgbmFtZXMgZ2V0IGJ1aWxkIG5pY2VyICh3aXRoIF8KICAgaW5zdGVhZCBvZiAuIGFuZCBcIGluc3RlYWQgb2YgLyBpbiB3aW4zMikuCgogLSBzdGV2ZSA8ZmlzayBhdCBwb2xhci5ib3dkb2luLmVkdT4gcmVwb3J0ZWQgYSB3ZWlyZCBidWcgdGhhdCBvY2N1cmVkIGlmIHRoZQogICBmdHAgc2VydmVyIHJlc3BvbnNlIGxpbmUgaGFkIGEgcGFyZW50aGVzaXMgb24gdGhlIGxpbmUgYmVmb3JlIHRoZSAoc2l6ZSkKICAgaW5mby4gSSBob3BlIGl0IHdvcmtzIGJldHRlciBub3chCgpWZXJzaW9uIDUuMi4xCgogU3RldmVuIEcuIEpvaG5zb24gKERlYyAxNCwgMTk5OCkKIC0gQnJvdWdodCBhIGZpeCB0aGF0IGNvcnJlY3RlZCBhIGNyYXNoIGluIDUuMiBkdWUgdG8gYmFkIHRyZWF0bWVudCBvZiB0aGUKICAgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoKVmVyc2lvbiA1LjIKCiBEYW5pZWwgU3RlbmJlcmcgKERlYyAxNCwgMTk5OCkKIC0gUmV3cm90ZSB0aGUgbWtoZWxwIHNjcmlwdCBhbmQgbm93LCB0aGUgbWtoZWxwLnBsIHNjcmlwdCBnZW5lcmF0ZXMgdGhlCiAgIGh1Z2VoZWxwLmMgZmlsZSBmcm9tIHRoZSBSRUFETUUgKmFuZCogdGhlIG1hbiBwYWdlIGZpbGUgY3VybC4xLiBCeSB1c2luZwogICBib3RoIGZpbGVzLCBJIG5vIGxvbmdlciBuZWVkIHRvIGhhdmUgZG91YmxlIGluZm9ybWF0aW9uIGluIGJvdGggdGhlIG1hbgogICBwYWdlIGFuZCB0aGUgUkVBRE1FIGFzIHdlbGwuIFNvLCB3aW4zMi11c2VycyB3aWxsIG9ubHkgaGF2ZSB0aGUgaHVnZWhlbHAuYwogICBmaWxlIGZvciBhbGwgaW5mbywgYnV0IHRoZW4sIHRoZXkgZG93bmxvYWQgdGhlIHBsYWluIGJpbmFyeSBtb3N0IHRpbWVzCiAgIGFueXdheS4KCiAtIGdjYzIuOC4xIHdpdGggdGhlIC1XYWxsIGZsYWcgY29tcGxhaW50cyBhIGxvdCBvbiBzdWJzY3JpcHQgaGFzIHR5cGUgYGNoYXInCiAgIGlmIEkgZG9uJ3QgZXhwbGljaXRseSB0eXBlY2FzdCB0aGUgYXJndW1lbnQgdG8gaXNkaWdpdCgpIG9yIGlzc3BhY2UoKSB0bwogICBpbnQuIFNvIEkgZGlkIHRvIGNvbXBpbGUgd2FybmluZyBmcmVlIHdpdGggdGhhdCB0b28uCgogLSBBZGRlZCBjaGVja3MgZm9yICdsb25nIGRvdWJsZScgYW5kICdsb25nIGxvbmcnIGluIHRoZSBjb25maWd1cmUgc2NyaXB0LiBJCiAgIG5lZWQgdGhvc2UgZm9yIHRoZSBtcHJpbnRmLmMgc291cmNlIHRvIGNvbXBpbGUgd2VsbCBvbiBub24gbG9uZyBsb25nCiAgIGNvbWZvcm1pbmcgc3lzdGVtcyEKClZlcnNpb24gNS4xIChub3QgcHVibGljbHkgcmVsZWFzZWQpCgogRGFuaWVsIFN0ZW5iZXJnIChEZWMgMTAsIDE5OTgpCiAtIEkgZ290IGEgcmVxdWVzdCBmb3IgYSBwcmUtY29tcGlsZWQgTlQgQWxwaGEgdmVyc2lvbi4gQW55b25lPwoKIC0gQWRkZWQgTHlueC9DRVJOIHd3dyBsaWIgcHJveHkgZW52aXJvbm1lbnQgdmFyaWFibGUgc3VwcG9ydC4gVGhhdCBtZWFucyBjdXJsCiAgIG5vdyByZWFkcyBhbmQgdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXM6CgoJSFRUUF9QUk9YWSwgSFRUUFNfUFJPWFksIEZUUF9QUk9YWSwgR09QSEVSX1BST1hZCgogICBUaGV5IHNob3VsZCBiZSBzZXQgZm9yIHByb3RvY29sLXNwZWNpZmljIHByb3hpZXMuIEdlbmVyYWwgcHJveHkgc2hvdWxkIGJlCiAgIHNldCB3aXRoCgkKCUFMTF9QUk9YWQoKICAgQW5kIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgaG9zdCBuYW1lcyB0aGF0IHNob3VsZG4ndCBnbyB0aHJvdWdoIGFueQogICBwcm94eSBpcyBzZXQgaW4gKG9ubHkgYW4gYXN0ZXJpc2ssICcqJyBtYXRjaGVzIGFsbCBob3N0cykuCgoJTk9fUFJPWFkKCiAgIFRoZSB1c2FnZSBvZiB0aGUgLXgvLS1wcm94eSBmbGFnIG92ZXJyaWRlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzLgoKIC0gUHJveHkgY2FuIG5vdyBiZSBzcGVjaWZpZWQgd2l0aCBhIHByb2NvdG9sOi8vIHByZWZpeC4KCiAtIFdyb3RlIHRoZSBjdXJsLjEgbWFuIHBhZ2UuCgogLSBJbnRyb2R1Y2VkIGEgd2hvbGUgbmV3IGR5bmFtaWMgYnVmZmVyIHN5c3RlbSBmb3IgYWxsIHNwcmludGYoKXMuIEl0IGlzCiAgIGJhc2VkIG9uIHRoZSAqcHJpbnRmKCkgcGFja2FnZSBieSB5b3VycyB0cnVseSBhbmQgQmpvcm4gUmVlc2UuIEhvcGVmdWxseSwKICAgdGhlcmUgYXJlbid0IHRoYXQgbWFueSBidWZmZXIgb3ZlcmZsb3cgcmlza3MgbGVmdCBub3cuCgogLSBBaCwgSSBzaG91bGQgbWVudGlvbiBJJ3ZlIGNvbXBpbGVkIGFuZCBidWlsdCBjdXJsIHN1Y2Nlc3NmdWxseSB1bmRlcgogICBzb2xhcmlzIDIuNiB3aXRoIGdjYyBub3csIGdjYyAyLjcuMiB3b24ndCB3b3JrIGJ1dCAyLjguMSBkaWQgb2suCgogT3JlbiBUaXJvc2ggKERlYyAzLCAxOTk4KQogLSBCcm91Z2h0IHR3byAuc3BlYyBmaWxlcywgdG8gdXNlIHdoZW4gY3JlYXRpbmcgKExpbnV4KSBSZWRoYXQgc3R5bGUgUlBNCiAgIHBhY2thZ2VzLiBUaGV5J3JlIG5hbWVkIGN1cmwuc3BlYyBhbmQgY3VybC1zc2wuc3BlYy4KCiBUcm95IEVuZ2VsCiAtIFN1cHBsaWVkIHRoZSBzcmMvTWFrZWZpbGUudmM2IGZvciBlYXN5IGNvbXBpbGluZyB3aXRoIFZDKysgdW5kZXIgV2luMzIuCgpWZXJzaW9uIDUuMAoKIERhbmllbCBTdGVuYmVyZyAoRGVjIDEsIDE5OTgpCiAtIE5vdCBhIHNpbmdsZSBidWcgcmVwb3J0IGluIGFnZXMuCiAtIENvcnJlY3RlZCBnZXRwYXNzLmMgYW5kIG1haW4uYyB0byBjb21waWxlIHdhcm5pbmcgYW5kIGVycm9yIGZyZWUgd2l0aCB0aGUKICAgV2luMzIgVkMrKyBjcmFwLgoKVmVyc2lvbiA1LjAgYmV0YSAyNAoKIERhbmllbCBTdGVuYmVyZyAoTm92IDIwLCAxOTk4KQoKIEhPVyBUTyBCVUlMRCBBIFJFTEVBU0UgQVJDSElWRToKCiAqIFByZS1yZXF1aXNpdGUgc29mdHdhcmU6CiAgIFdoYXQJCSAgICAgVG8gYnVpbGQgd2hhdCAgICAgICAgICAgICBSZWFkcyBkYXRhIGZyb20KICAgPT09PSAgICAgICAgICAgICAgPT09PT09PT09PT09PSAgICAgICAgICAgICA9PT09PT09PT09PT09PT0KICAgR05VIGF1dG9tYWtlICAgICAgTWFrZWZpbGUuaW4sIGFjbG9jYWwubTQgICBjb25maWd1cmUuaW4KICAgICBHTlUgbWFrZSgxKSAgICAgIC0gIiAtCiAgICAgR05VIGdjYygxKSAgICAgICAtICIgLQogICBHTlUgYXV0b2NvbmYgICAgICBjb25maWd1cmUgICAgICAgICAgICAgICAgIGNvbmZpZ3VyZS5pbgogICBHTlUgYXV0b2hlYWRlcigyKSBjb25maWcuaC5pbgkgICAgICAgY29uZmlndXJlLmluLCBhY2NvbmZpZy5oCgogKiBNYWtlIHN1cmUgYWxsIGZpbGVzIHRoYXQgc2hvdWxkIGJlIHBhcnQgb2YgdGhlIGFyY2hpdmUgYXJlIHB1dCBpbiBGSUxFUy4KCiAqIFJ1biAnLi9tYWtldGd6JyBhbmQgZW50ZXIgdmVyc2lvbiBudW1iZXIgb2YgdGhlIG5ldyB0byBiZWNvbWUgYXJjaGl2ZS4KCiAgIG1ha2V0Z3ogZG9lczoKCiAgIC0gRW50ZXJzIHRoZSBuZXdseSBjcmVhdGVkIHZlcnNpb24gbnVtYmVyIGluIHVybC5oLgogICAtIChJZiB5b3UgZG9uJ3QgaGF2ZSBhdXRvbWFrZSwgdGhpcyBzY3JpcHQgd2lsbCB3YXJuIGFib3V0IHRoYXQsIGJ1dCB1bmxlc3MKICAgICB5b3UgaGF2ZSBjaGFuZ2VkIHRoZSBNYWtlZmlsZS5hbSBmaWxlcywgdGhhdCBpcyBub3RoaW5nIHRvIGNhcmUgYWJvdXQuKQogICAgIElmIHlvdSBoYXZlIGl0LCBpdCdsbCBydW4gaXQuCiAgIC0gSWYgeW91IGhhdmUgYXV0b2NvbmYsIHRoZSBjb25maWd1cmUuaW4gd2lsbCBiZSBlZGl0ZWQgdG8gZ2V0IHRoZSBuZXdseQogICAgIGNyZWF0ZWQgdmVyc2lvbiBudW1iZXIgYW5kIGF1dG9jb25mIHdpbGwgYmUgcnVuLgogICAtIENyZWF0ZXMgYSBuZXcgZGlyZWN0b3J5IG5hbWVkIGN1cmwtPHZlcnNpb24+LiAoQWN0dWFsbHksIGl0IHVzZXMgdGhlIGJhc2UKICAgICBuYW1lIG9mIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB1cCB0byB0aGUgZmlyc3QgJy0nLikKICAgLSBDb3BpZXMgYWxsIGZpbGVzIG1lbnRpb25lZCBpbiBGSUxFUyB0byB0aGUgbmV3IGRpcmVjdG9yeS4gU2F2aW5nCiAgICAgcGVybWlzc2lvbnMgYW5kIGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCiAgIC0gVXNlcyB0YXIgdG8gY3JlYXRlIGFuIGFyY2hpdmUgb2YgaXQgYWxsLCBuYW1lZCBjdXJsLTx2ZXJzaW9uPi50YXIuZ3oKICAgLSBnemlwcyB0aGUgYXJjaGl2ZQogICAtIFJlbW92ZXMgdGhlIG5ldyBkaXJlY3RvcnkgYW5kIGFsbCBpdHMgY29udGVudHMuCgogKiBXaGVuIGRvbmUsIHlvdSBoYXZlIGFuIGFyY2hpdmUgc3RvcmVkIGluIHlvdXIgZGlyZWN0b3J5IG5hbWVkCiAgIGN1cmwtPHZlcnNpb24+LnRhci5nei4KCiAgIERvbmUhCgogICAoMSkgVGhleSdyZSByZXF1aXJlZCB0byBtYWtlIGF1dG9tYWtlIHJ1biBwcm9wZXJseS4KICAgKDIpIEl0IGlzIGRpc3RyaWJ1dGVkIGFzIGEgcGFydCBvZiB0aGUgR05VIGF1dG9jb25mIGFyY2hpdmUuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTgsIDE5OTgpCiAtIEkgY2hhbmdlZCB0aGUgVEFHLXN5c3RlbS4gSWYgeW91IGV2ZXIgdXNlZCB1cmxnZXQoKSBmcm9tIHRoaXMgcGFja2FnZSBpbgogICBhbm90aGVyIHByb2R1Y3QsIHlvdSBuZWVkIHRvIHJlY29tcGlsZSB3aXRoIHRoZSBuZXcgaGVhZGVycy4gSSBkaWQgdGhpcwogICBuZXcgc3R1ZmYgdG8gYmV0dGVyIGRlYWwgd2l0aCBkaWZmZXJlbnQgY29tcGlsZXJzIGFuZCBzeXN0ZW0gd2l0aCBkaWZmZXJlbnQKICAgdmFyaWFibGUgc2l6ZXMuIEkgdGhpbmsgaXQgbWFrZXMgaXQgYSBsaXR0bGUgbW9yZSBwb3J0YWJsZS4gVGhpcyBwcm92ZXMKICAgdG8gY29tcGlsZSB3YXJuaW5nIGZyZWUgd2l0aCB0aGUgcHJvYmxlbWF0aWMgSVJJWCBjb21waWxlciEKIC0gV2luMzIgY29tcGlsZWQgd2l0aCBhIHNpbGx5IGVycm9yLiBDb3JyZWN0ZWQgbm93LgogLSBCcmlhbiBDaGFwbGluIHJlcG9ydGVkIHlldCBhbm90aGVyIHByb2JsZW0gaW4KICAgbXVsdGlsaW5lIEZUUCByZXNwb25zZXMuIEkndmUgdHJpZWQgdG8gY29ycmVjdCBpdC4gSSBtYWlsZWQgaGltIGEgbmV3CiAgIHZlcnNpb24gYW5kIEkgaG9wZSBoZSBnZXRzIGJhY2sgc29vbiB3aXRoIHBvc2l0aXZlIGZlZWRiYWNrIQogLSBJbXByb3ZlZCB0aGUgJ21ha2V0Z3onIHRvIGNyZWF0ZSBhIHRlbXBvcmFyeSBkaXJlY3RvcnkgdHJlZSB3aGljaCBpdCBtYWtlcwogICBhbiBhcmNoaXZlIGZyb20gaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgcmVuYW1pbmcgb2YgdGhlIGN1cnJlbnQgb25lLgogLSBNYWlsaW5nIGxpc3Qgb3BlbmVkIChzZWUgUkVBRE1FKS4KIC0gTWFkZSAtdiBtb3JlIHZlcmJvc2Ugb24gdGhlIFBBU1Ygc2VjdGlvbiBvZiBmdHAgdHJhbnNmZXJzLiBOb3cgaXQgdGVsbHMKICAgaG9zdCBuYW1lIGFuZCBJUCBvZiB0aGUgbmV3IGhvc3QgKGFuZCBwb3J0IG51bWJlcikuIEkgYWxzbyBhZGRlZCBhIHNlY3Rpb24KICAgYWJvdXQgUE9SVCB2cyBQQVNWIGluIHRoZSBSRUFETUUuCgpWZXJzaW9uIDUuMCBiZXRhIDIxCgogQW5ndXMgTWFja2F5IChOb3YgMTUsIDE5OTgpCiAtIEludHJvZHVjZWQgYXV0b21ha2Ugc3R1ZmYuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTMsIDE5OTgpCiAtIEp1c3QgbWFkZSBhIHN1Y2Nlc3NmdWwgR0VUIG9mIGEgZG9jdW1lbnQgZnJvbSBhbiBTU0wtc2VydmVyIHVzaW5nIG15IG93bgogICBwcml2YXRlIGNlcnRpZmljYXRlIGZvciBhdXRoZW50aWNhdGlvbiEgVGhlIGNlcnRpZmljYXRlIGhhcyB0byBiZSBpbiBQRU0KICAgZm9ybWF0LiBZb3UgZG8gdGhhdCB0aGUgZWFzaWVzdCB3YXkgKGFsdGhvdWdoIG5vdCAqdGhhdCogZWFzeSkgYnkKICAgZG93bmxvYWRpbmcgdGhlIFNTTHllYXkgUEtDUyMxMi1wYXRjaCBieSBEciBTdGVwaGVuIE4uIEhlbnNvbiBmcm9tIGhpcyBzaXRlCiAgIGF0OiBodHRwOi8vd3d3LmRyaC1jb25zdWx0YW5jeS5kZW1vbi5jby51ay8uIFVzaW5nIGhpcyB0b29sLCB5b3UgY2FuCiAgIGNvbnZlcnQgYW55IG1vZGVybiBOZXRzY2FwZSBvciAoZXZlbikgTVNJRSBjZXJ0aWZpY2F0ZSB0byBQRU0tZm9ybWF0LiAgVXNlCiAgIGl0IHdpdGggJ2N1cmwgLUUgPGNlcnRpZmljYXRlOnBhc3N3b3JkPiBodHRwczovL3NpdGUuY29tJy4gIElmIHRoaXMgaXNuJ3QgYQogICBjb29sIGZlYXR1cmUsIHRoZW4gSSBkb24ndCBrbm93IHdoYXQgY29vbCBmZWF0dXJlcyBsb29rIGxpa2UhIDstKQogLSBXb3JraW5nIHNsb3dseSBvbiB0ZWxuZXQgY29ubmVjdGlvbnMuICNkZWZpbmUgVFJZX1RFTE5FVCB0byB0cnkgaXQgb3V0LgogICAoY3VybCAtdSB1c2VyOnBhc3N3ZCAidGVsbmV0Oi8vaG9zdC5jb20vY2F0IC5sb2dpbiIgaXMgb25lIGV4YW1wbGUpIEkgZG8KICAgaGF2ZSBwcm9ibGVtIHRvIGRlZmluZSBob3cgaXQgc2hvdWxkIHdvcmsuIFRoZSBwcmltZSBwdXJwb3NlIGZvciB0aGlzIG11c3QKICAgYmUgdG8gZ2V0ICg4Yml0IGNsZWFuKSBmaWxlcyB2aWEgdGVsbmV0LCBhbmQgaXQgcmVhbGx5IGlzbid0IHRoYXQgZWFzeSB0bwogICBnZXQgZmlsZXMgdGhpcyB3YXkuIFN0aWxsIGhhdmluZyBwcm9ibGVtcyB3aXRoIFxuIGJlaW5nIGNvbnZlcnRlZCB0byBcclxuLgoKIEFuZ3VzIE1hY2theSAoTm92IDEyLCAxOTk4KQogLSBDb3JyZWN0ZWQgYW5vdGhlciBidWcgaW4gdGhlIGxvbmcgcGFyYW1ldGVyIG5hbWUgcGFyc2VyLgogLSBNb2RpZmllZCBnZXRwYXNzLmMgKE5PVEU6IHNlZSB0aGUgc3BlY2lhbCBsaWNlbnNpbmcgaW4gdGhlIHRvcCBvZiB0aGF0CiAgIHNvdXJjZSBmaWxlKS4KCiBEYW5pZWwgU3RlbmJlcmcgKE5vdiAxMiwgMTk5OCkKIC0gV2UgbWF5IGhhdmUgcmVtb3ZlZCB0aGUgc2lsbHkgd2FybmluZ3MgZnJvbSB1cmwuYyB3aGVuIGNvbXBpbGVkIHVuZGVyIElSSVguCiAgIFRoYW5rcyBhZ2FpbiB0byBCam9ybiBSZWVzZSBhbmQgTWFydGluIFN0YWFlbC4KIC0gV3JvdGUgZm9ybWZpbmQucGwgd2hpY2ggaXMgYSBuZXcgcGVybCBzY3JpcHQgaW50ZW5kZWQgdG8gaGVscCB5b3UgZmluZCBvdXQKICAgaG93IGEgRk9STSBzdWJtaXNzaW9uIHNob3VsZCBiZSBkb25lLiBUaGlzIG5lZWRzIGEgbGl0dGxlIG1vcmUgd29yayB0byBnZXQKICAgcmVhbGx5IGdvb2QuCgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgMTEsIDE5OTgpCiAtIE1hZGUgdGhlIEhUVFAgaGVhZGVyLWNoZWNrZXIgYWNjZXB0IHdoaXRlIHNwYWNlcyBiZWZvcmUgdGhlIEhUVFAvMS4/IGxpbmUuCiAgIEFwcGVhcmFudGx5IHNvbWUgcHJveGllcy9zaXRlcyBhZGQgc3VjaCBhdCB0aW1lcyAobXkgdGVzdCBwcm94eSBkaWQgd2hlbiBJCiAgIGRvd25sb2FkZWQgYSBnb3BoZXIgcGFnZSB3aXRoIGl0KSEKIC0gTW92ZWQgdGhlIGZvcm1lciAtaCB0byAtTSBhbmQgbWFkZSAtaCBzaG93IHRoZSBzaG9ydCBoZWxwIHRleHQgaW5zdGVhZC4gSQogICBoYWQgdG8gZW5hYmxlIGEgZm9yY2VkIGhlbHAgdGV4dCBvcHRpb24uIE5vdyBhbiBldmVuIHNob3J0ZXIgaGVscCB0ZXh0IHdpbGwKICAgYmUgcHJlc2VudGVkIHdoZW4gYW4gdW5rbm93biBvcHRpb24gYW5kIHNpbWlsYXIsIGlzIHVzZWQuCiAtIHN0ZGNoZWFkZXJzLmggZGlkbid0IHdvcmsgd2l0aCBJUklYIDYuNCBuYXRpdmUgY2MgY29tcGlsZXIuIEkgaG9wZSBteQogICBjaGFuZ2VzIGRvbid0IG1ha2Ugb3RoZXIgdmVyc2lvbnMgZ28gbnV0cyBpbnN0ZWFkLgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDEwLCAxOTk4KQogLSBBZGRlZCBhIHdlaXJkIGNoZWNrIGluIHRoZSBjb25maWd1cmUgc2NyaXB0IHRvIGNoZWNrIGZvciB0aGUgc2lsbHkgQUlYCiAgIHdhcm5pbmdzIGFib3V0IG15ICNkZWZpbmUgc3RyY2FzZWNtcCgpIHN0dWZmLiBJIGRvIHRoYXQgZGVmaW5lIHRvIHByZXZlbnQKICAgbWUgYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyB0byBhY2NpZGVudGFseSB1c2UgdGhhdCBmdW5jdGlvbiBuYW1lIGluc3RlYWQKICAgb2Ygc3RyZXF1YWwoKS4uLgogLSBJIGJ1Z2ZpeGVkIEFuZ3VzJ3MgZ2V0cGFzcy5jIHZlcnkgbGl0dGxlLgogLSBGaXhlZCB0aGUgdmVyYm9zZSBmbGFnIG5hbWVzIHRvIGdldG9wdC1zdHlsZSwgaS5lICdjdXJsIC0tbG9jJyB3aWxsIGJlCiAgIHN1ZmZpY2llbnQgaW5zdGVhZCBvZiAtLWxvY2F0aW9uIGFzICJsb2MiIGlzIGEgdW5pcXVlIHByZWZpeC4gQWxzbywgYW55dGhpbmcKICAgYWZ0ZXIgYSAnLS0nIGlzIHRyZWF0ZWQgYXMgYW4gVVJMLiBTbyBpZiB5b3UgZG8gaGF2ZSBhIGhvc3Qgd2l0aCBhIHdlZWVpcmQKICAgbmFtZSB5b3UgY2FuIGRvICdjdXJsIC0tIC1ob3N0LmNvbScuCiAtIEFub3RoZXIgZ2V0b3B0LWFkanVzdDsgY3VybCBub3cgYWNjZXB0cyBmbGFncyBhZnRlciB0aGUgVVJMIG9uIHRoZSBjb21tYW5kCiAgIGxpbmUuICdjdXJsIHd3dy5mb28uY29tIC1PJyBpcyBwZXJmZWN0bHkgdmFsaWQuCiAtIENvcnJlY3RlZCB0aGUgLmN1cmxyYyBwYXJzZXIgc28gdGhhdCBzdHJ0b2soKSBpcyBubyBsb25nZXIgdXNlZCBhbmQgSQogICBiZWxpZXZlIGl0IHdvcmtzIGJldHRlci4gRXZlbiBVUkxzIGNhbiBiZSBzcGVjaWZpZWQgaW4gaXQgbm93LgoKIEFuZ3VzIE1hY2theSAoTm92IDksIDE5OTgpCiAtIFJlcGxhY2VkIGdldHBhc3MuYyB3aXRoIGEgbmV3bHkgd3JpdHRlbiBvbmUsIG5vdCB1bmRlciBHUEwgbGljZW5zZQogLSBDaGFuZ2VkIE9TIHRvIGEgI2RlZmluZSBpbiBjb25maWcuaCBpbnN0ZWFkIG9mIGNvbXBpbGVyIGZsYWcKIC0gTWFrZWZpbGUgbm93IHVzZXMgLURIQVZFX0NPTkZJR19ICgogRGFuaWVsIFN0ZW5iZXJnIChOb3YgOSwgMTk5OCkKIC0gT2ssIEkgZXhwYW5kZWQgdGhlIHRnei10YXJnZXQgdG8gdXBkYXRlIHRoZSB2ZXJzaW9uIHN0cmluZyBvbiBlYWNoIG9jY2F0aW9uCiAgIEkgYnVpbGQgYSByZWxlYXNlIGFyY2hpdmUhCiAtIEkgcmVhY3RlZCBvbiBBbmd1cyBNYWNrYXkncyBpbml0aWF0aXZlIGFuZCByZW1hZGUgdGhlIHBhcmFtZXRlciBwYXJzZXIgdG8KICAgYmUgbW9yZSBnZXRvcHQgY29tcGxpYW50LiBDdXJsIG5vdyBzdXBwb3J0cyAibWVyZ2VkIiBmbGFncyBhcyBpbiAKCWN1cmwgLWxzdiBmdHAuc2l0ZS5jb20KICAgRG8gbm90ZSB0aGF0IEkgaGFkIHRvIG1vdmUgdGhyZWUgc2hvcnQtbmFtZXMgb2YgdGhlIG9wdGlvbnMuIFBhcmFtZXRlcnMKICAgdGhhdCBuZWVkcyBhbiBhZGRpdGlvbmFsIHN0cmluZyBzdWNoIGFzIC14IG11c3QgYmUgc3RhbmQtYWxvbmUgb3IgdGhlCiAgIGxhc3QgaW4gYSBtZXJnZWQgc2VxdWVuY2U6CgljdXJsIC1sc3ggbXktcHJveHkgZnRwLnNpdGUuY29tCiAgIGlzIG9rLCBidXQgdXNpbmcgdGhlIGZsYWdzIGluIGEgZGlmZmVyZW50IG9yZGVyIGxpa2UgJy1seHMnIHdvdWxkIGNhdXNlCiAgIHVuZXhwZWN0ZWQgcmVzdWx0cyAoYXMgdGhlICdzJyBvcHRpb24gd291bGQgYmUgc2tpcHBlZCkuCiAtIEkndmUgY2hhbmdlZCB0aGUgaGVhZGVycyBpbiBhbGwgZmlsZXMgdGhhdCBhcmUgc3ViamVjdCB0byB0aGUgTW96UEwKICAgbGljZW5zZSwgYXMgdGhleSBhcmUgc3VwcG9zZWQgdG8gbG9vayBsaWtlIHdoZW4gY29uZm9ybWluZy4KIC0gTWFkZSB0aGUgY29uZmlndXJlIHNjcmlwdCBtYWtlIHRoZSBjb25maWcuaC4gVGhlIGZvcm1lciBjb25maWcuaCBpcyBub3cKICAgc2V0dXAuaC4KIC0gVGhlIFJFU09VUkNFUyBhbmQgVE9ETyBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIGFyY2hpdmUuCgogQW5ndXMgTWFja2F5IChOb3YgNSwgMTk5OCkKIC0gRml4ZWQgZ2V0cGFzcy5jIGFuZCB2YXJpb3VzIGNvbmZpZ3VyZSBzdHVmZgoKIERhbmllbCBTdGVuYmVyZyAoTm92IDMsIDE5OTgpCiAtIFVzZSAtSC8tLWhlYWRlciBmb3IgY3VzdG9tIEhUVFAtaGVhZGVycy4gTGV0cyB5b3UgcGFzcyBvbiB5b3VyIG93bgogICBzcGVjaWZpZWQgaGVhZGVycyB0byB0aGUgcmVtb3RlIHNlcnZlci4gSSB3b3VsZG4ndCByZWNvbW1lbmQgdHJ5aW5nIHRvIHVzZQogICBhIGhlYWRlciB3aXRoIGEgZGVmaW5lZCB1c2FnZSBhY2NvcmRpbmcgdG8gc3RhbmRhcmRzLiBVc2UgdGhpcyBmbGFnIG9uY2UKICAgZm9yIGV2ZXJ5IGN1c3RvbSBoZWFkZXIgeW91IHdhbnQgdG8gYWRkLgogLSBVc2UgLUIvLS1mdHAtYXNjaWkgdG8gZm9yY2UgZnRwIHRvIHVzZSBBU0NJSSBtb2RlIHdoZW4gdHJhbnNmZXJpbmcgZmlsZXMuCiAtIENvcnJlY3RlZCB0aGUgJ2dldGxpbmtzLnBsJyBzY3JpcHQsIEkgYWNjaWRlbnRhbGx5IGxlZnQgbXkgc2lsbHkgcHJveHkKICAgdXNhZ2UgaW4gdGhlcmUhIFNpbmNlIHRoZSBpbnRyb2R1Y3Rpb24gb2YgdGhlIC5jdXJscmMgZmlsZSwgaXQgaXMgZWFzaWVyIHRvCiAgIHdyaXRlIHNjcmlwdHMgdGhhdCB1c2UgY3VybCBzaW5jZSBwcm94aWVzIGFuZCBzdHVmZiBzaG91bGQgYmUgaW4gdGhlCiAgIC5jdXJscmMgZmlsZSBhbnl3YXkuCiAtIEludHJvZHVjaW5nIHRoZSBuZXcgLUYgZmxhZyBmb3IgSFRUUCBQT1NULiBJdCBzdXBwb3J0cyBtdWx0aXBhcnQvZm9ybS1kYXRhCiAgIHdoaWNoIG1lYW5zIGl0IGlzIGdvbm5hIGJlIHBvc3NpYmxlIHRvIHVwbG9hZCBmaWxlcyBldGMgdGhyb3VnaCBIVFRQIFBPU1QuCiAgIFNoaXJheiBLYW5nYSBhc2tlZCBmb3IgdGhlIGZlYXR1cmUgYW5kIG15IGJyb3RoZXIsCiAgIEJq9nJuIFN0ZW5iZXJnIGhlbHBlZCBtZSBkZXNpZ24gdGhlIHVzZXIKICAgaW50ZXJmYWNlIGZvciB0aGlzIGJlYXN0LiAgVGhpcyBmZWF0dXJlIHJlcXVpcmVzIHF1aXRlIHNvbWUgZG9jcywKICAgc2luY2UgaXQgaGFzIHR1cm5lZCBvdXQgbm90IG9ubHkgcXVpdGUgY2FwYWJsZSwgYnV0IGFsc28gY29tcGxpY2F0ZWQhIDotKQogLSBBIG5vdGUgaGVyZSwgc2luY2UgSSd2ZSByZWNlaXZlZCBtYWlsIGFib3V0IGl0LiBTU0xlYXkgdmVyc2lvbnMgcHJpb3IgdG8KICAgMC44IHdpbGwgKm5vdCogd29yayB3aXRoIGN1cmwhCiAtIFdpbCBMYW5nZm9yZCByZXBvcnRlZCBhIGJ1ZyB0aGF0IG9jY3VycmVkIHNpbmNlIGN1cmwKICAgZGlkIG5vdCBwcm9wZXJseSB1c2UgQ1JMRiB3aGVuIGlzc3VpbmcgZnRwIGNvbW1hbmRzLiBJIGZpeGVkIGl0LgogLSBSZWFycmFuZ2VkIHRoZSBvcmRlciBjb25maWcgZmlsZXMgYXJlIHJlYWQuIC5jdXJscmMgaXMgbm93ICphbHdheXMqIHJlYWQKICAgZmlyc3QgYW5kIGJlZm9yZSB0aGUgY29tbWFuZCBsaW5lIGZsYWdzLiAtSyBjb25maWcgZmlsZXMgdGhlbiBhY3QgYXMKICAgYWRkaXRpb25hbCBjb25maWcgaXRlbXMuCiAtIFVzZSAtcSBBUyBUSEUgRklSU1QgT1BUSU9OIHNwZWNpZmllZCB0byBwcmV2ZW50IC5jdXJscmMgZnJvbSBiZWluZyByZWFkLgogLSBZb3UgY2FuIG5vdyBkaXNhYmxlIGEgcHJveHkgYnkgdXNpbmcgLXggIiIuIFVzZWZ1bCBpZiB0aGUgLmN1cmxyYyBmaWxlCiAgIHNwZWNpZmllcyBhIHByb3h5IGFuZCB5b3Ugd2FubmEgZmV0Y2ggc29tZXRoaW5nIHdpdGhvdXQgZ29pbmcgdGhyb3VnaAogICB0aGF0LgogLSBJJ20gdGhpbmtpbmcgb2YgZHJvcHBpbmcgdGhlIC1wIHN1cHBvcnQuIEl0cyByZWFsbHkgbm90IHVzZWZ1bCBzaW5jZSBwb3J0cwogICBjb3VsZCAoYW5kIHNob3VsZD8pIGJlIHNwZWNpZmllZCBhcyA6PHBvcnQ+IGFwcGVuZGVkIG9uIHRoZSBob3N0IG5hbWUKICAgaW5zdGVhZCwgYm90aCBpbiBVUkxzIGFuZCB0byBwcm94eSBob3N0IG5hbWVzLgogLSBNYXJ0aW4gU3RhYWVsIHJlcG9ydHMgY3VybCAtTCBidWdzIHVuZGVyIFdpbmRvd3MgTlQKICAgKHRlc3Qgd2l0aCBVUkwgaHR0cDovL2NvbWUudG8vc2NzZGUpLiBUaGlzIGJ1ZyBpcyBub3QgcHJlc2VudCBpbiB0aGlzCiAgIHZlcnNpb24gYW55bW9yZS4KIC0gQWRkZWQgc3VwcG9ydCBmb3IgdGhlIHdlaXJkIEZUUCBVUkwgdHlwZT0gdGhpbmcuIFlvdSBjYW4gZG93bmxvYWQgYSBmaWxlCiAgIHVzaW5nIEFTQ0lJIHRyYW5zZmVyIGJ5IGFwcGVuZGluZyAiO3R5cGU9QSIgdG8gdGhlIHJpZ2h0IG9mIGl0LiBPdGhlcgogICBhdmFpbGFibGUgdHlwZXMgYXJlIHR5cGU9RCBmb3IgZGlyLWxpc3QgKE5MU1QpIGFuZCB0eXBlPUkgZm9yIGJpbmFyeQogICB0cmFuc2Zlci4gSSBjYW4ndCBzYXkgSSd2ZSBldmVyIHNlZW4gYW55b25lIHVzZSB0aGlzIGtpbmQgb2YgVVJMIHRob3VnaCEKICAgOi0pCiAtIFRyb3kgRW5nZWwgcG9pbnRlZCBvdXQgYSBidWcgaW4gbXkgZ2V0ZW52KCJIT01FIikKICAgdXNhZ2UgZm9yIHdpbjMyIHN5c3RlbXMuIEkgaW50cm9kdWNlIGdldGVudi5jIHRvIGJldHRlciBjb3BlIHdpdGgKICAgdGhpcy4gTXIgRW5nZWwgaGVscHMgbWUgd2l0aCB0aGUgZGV0YWlscyBhcm91bmQgdGhhdC4uLgogLSBBIGxpdHRsZSBub3RlIHRvIG15c2VsZiBhbmQgb3RoZXJzLCBJIHNob3VsZCBtYWtlIHRoZSB3aW4zMi1iaW5hcnkgYnVpbHQKICAgd2l0aCBTU0wgc3VwcG9ydC4uLgogLSBSeWFuIE5lbHNvbiBzZW50IG1lIGNvbW1lbnRzIGFib3V0IGJ1aWxkaW5nIGN1cmwKICAgd2l0aCBTU0wgdW5kZXIgRnJlZUJTRC4gU2VlIHRoZSBNYWtlZmlsZSBmb3IgZGV0YWlscy4gVXNpbmcgdGhlIGNvbmZpZ3VyZQogICBzY3JpcHQsIGl0IHNob3VsZCB3b3JrIGJldHRlciBhbmQgYXV0b21hdGljYWxseSBub3cuLi4KIC0gQ2xlYW5lZCB1cCBpbiB0aGUgcG9ydCBudW1iZXIgbWVzcyBpbiB0aGUgc291cmNlLiBObyBsb25nZXIgc3RvcmVzIGFuZCB1c2VzCiAgIHByb3h5IHBvcnQgbnVtYmVyIHNlcGFyYXRlIGZyb20gbm9ybWFsIHBvcnQgbnVtYmVyLgogLSAnY29uZmlndXJlJyBzY3JpcHQgd29ya2luZy4gQ29uZmlybWVkIGNvbXBpbGVzIG9uOgogICAgSG9zdCAgICAgICAgIFNTTCAgQ29tcGlsZXIKICAgIFN1bk9TIDUuNSAgICBubyAgIGdjYwogICAgU3VuT1MgNS41LjEgIHllcyAgZ2NjCiAgICBTdW5PUyA1LjYgICAgbm8gICBjYyAgKHdpdGggZ2NjLCBpdCBoYXMgdGhlICJnY2MgaW5jbHVkZSBmaWxlcyIgcHJvYmxlbSkKICAgIFN1bk9TIDQuMS4zICBubyAgIGdjYyAod2l0aG91dCBBTlNJIEMgaGVhZGVycykKICAgIFN1bk9TIDQuMS4yICBubyAgIGdjYyAobmF0aXZlIGNvbXBpbGVyIGZhaWxlZCkKICAgIExpbnV4IDIuMC4xOCBubyAgIGdjYwogICAgTGludXggMi4wLjMyIHllcyAgZ2NjCiAgICBMaW51eCAyLjAuMzUgbm8gICBnY2MgKHdpdGggZ2xpYmMpCiAgICBJUklYIDYuMiAgICAgbm8gICBnY2MgKGNjIGNvbXBpbGVzIGdlbmVyYXRlIGEgZmV3IHdhcm5pbmdzKQogICAgSVJJWCA2LjQgICAgIG5vICAgY2MgIChnZW5lcmF0ZWQgd2FybmluZ3MgdGhvdWdoKQogICAgV2luMzIgICAgICAgIG5vICAgQm9ybGFuZAogICAgT1NGNC4wCSBubyAgID8KCiAtIE9vb3BzLiBUaGUgNWJldGEgKGFuZCA0LjEwKSB1bmRlciB3aW4zMiBmYWlsZWQgaWYgdGhlIEhPTUUgdmFyaWFibGUgd2Fzbid0CiAgIHNldC4KIC0gV2hlbiB1c2luZyBhIHByb3h5LCBjdXJsIG5vdyBndWVzc2VzIGFuZCB1c2VzIHRoZSBwcm90b2NvbCBwYXJ0IGluIGNhc2VzCiAgIGxpa2U6CgljdXJsIC14IHByb3h5OjgwIHd3dy5zaXRlLmNvbQogICBQcm94aWVzIG5vcm1hbGx5IGdvIG51dHMgdW5sZXNzIGh0dHA6Ly8gaXMgcHJlcGVuZGVkIHRvIHRoZSBob3N0IG5hbWUsIHNvCiAgIGlmIGN1cmwgaXMgdXNlZCBsaWtlIHRoaXMsIGl0IGd1ZXNzZXMgcHJvdG9jb2wgYW5kIGFwcGVuZHMgdGhlIHByb3RvY29sCiAgIHN0cmluZyBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGUgcHJveHkuIEl0IGFscmVhZHkgZGlkIHRoaXMgd2hlbiB1c2VkCiAgIHdpdGhvdXQgcHJveHkuCiAtIEJldHRlciBwb3J0IHVzYWdlIHdpdGggU1NMIHRocm91Z2ggcHJveHkgbm93LiBJZiB5b3Ugc3BlY2lmaWVkIGEgZGlmZmVyZW50CiAgIGh0dHBzLXBvcnQgd2hlbiBhY2Nlc3NpbmcgdGhyb3VnaCBhIHByb3h5LCBpdCBkaWRuJ3QgdXNlIHRoYXQgbnVtYmVyCiAgIGNvcnJlY3RseS4gSSBhbHNvIHJld3JvdGUgdGhlIGNvZGUgdGhhdCBwYXJzZXMgdGhlIHN0dWZmIHJlYWQgZnJvbSB0aGUKICAgcHJveHkgd2hlbiB5b3Ugd2FubmEgY29ubmVjdCB0aHJvdWdoIGl0IHdpdGggU1NMLgogLSBCam9ybiBSZWVzZSBoZWxwZWQgbWUgd29yayBhcm91bmQgb25lIG9mIHRoZSBjb21waWxlcgogICB3YXJuaW5ncyBvbiBJUklYIG5hdGl2ZSBjYyBjb21waWxlcy4KClZlcnNpb24gNC4xMCAoT2N0IDI2LCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIEpvaG4gQS4gQnJpc3RvciBzdWdnZXN0ZWQgYSBjb25maWcgZmlsZSBzd2l0Y2gsCiAgIGFuZCBzaW5jZSBJJ3ZlIGJlZW4gaGF2aW5nIHRoYXQgaWRlYSBraW5kIG9mIGluIHRoZSBiYWNrZ3JvdW5kIGZvciBhIGxvbmcKICAgdGltZSBJIHJld3JvdGUgdGhlIHBhcmFtZXRlciBwYXJzaW5nIGZ1bmN0aW9uIGEgbGl0dGxlIGFuZCBub3cgSSBpbnRyb2R1Y2UKICAgdGhlIC1LLy0tY29uZmlnIGZsYWcuIEkgYWxzbyBtYWRlIGN1cmwgKmFsd2F5cyogKHVubGVzcyAtSyBpcyB1c2VkKSB0cnkgdG8KICAgbG9hZCB0aGUgLmN1cmxyYyBmaWxlIGZvciBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4gVGhlIHN5bnRheCBmb3IgdGhlCiAgIGNvbmZpZyBmaWxlIGlzIHRoZSBzdGFuZGFyZCBjb21tYW5kIGxpbmUgYXJndW1lbnQgc3R5bGUuIERldGFpbHMgaW4gJ2N1cmwKICAgLWgnIG9yIHRoZSBSRUFETUUuCiAtIEkgcmVtb3ZlZCB0aGUgLWsgb3B0aW9uLiBLZWVwLWFsaXZlIGlzbid0IHJlYWxseSBhbnl0aGluZyBhbnlvbmUgd291bGQKICAgd2FudCB0byBlbmFibGUgd2l0aCBjdXJsIGFueXdheS4KIC0gTWFydGluIFN0YWFlbCBoZWxwZWQgbWUgYWRkIHRoZSAnaXJpeCcgdGFyZ2V0LiBOb3cKICAgIm1ha2UgaXJpeCIgc2hvdWxkIGJ1aWxkIGN1cmwgc3VjY2Vzc2Z1bGx5IG9uIG5vbi1nY2MgU0dJIG1hY2hpbmVzLgogLSBTaW5nbGUgc3dpdGNoZXMgbm93IHRvZ2dsZSBiZWhhdmlvdXJzLiBJLmUgaWYgeW91IHVzZSAtdiAtdiB0aGUgc2Vjb25kCiAgIHdpbGwgc3dpdGNoIG9mZiB0aGUgdmVyYm9zZSBtb2RlIHRoZSBmaXJzdCBvbmUgZW5hYmxlZC4gVGhpcyBpcyBzbyB0aGF0CiAgIHlvdSBjYW4gZGlzYWJsZSBhIGRlZmF1bHQgc2V0dGluZyBhIC5jdXJscmMgZmlsZSBlbmFibGVzIGV0Yy4KClZlcnNpb24gNC45IChPY3QgNywgMTk5OCkKIERhbmllbCBTdGVuYmVyZwogLSBNYXJ0aW4gU3RhYWVsIHN1Z2dlc3RlZCBjdXJsIHdvdWxkIHN1cHBvcnQgY29va2llcy4KICAgSSBhZGRlZCAtYi8tLWNvb2tpZSB0byBlbmFibGUgZnJlZS10ZXh0IGNvb2tpZSBkYXRhIHRvIGJlIHBhc3NlZC4gVGhlcmUncwogICBhbHNvIGEgbGl0dGxlIGJsdXJiIGFib3V0IGdlbmVyYWwgY29va2llIHN0dWZmIGluIHRoZSBSRUFETUUvaGVscCB0ZXh0LgogLSBkbWggPGRtaCBhdCBqZXQuZXM+IHN1Z2dlc3RlZCBIVFRQIHJlc3VtZSBjYXBhYmlsaXRpZXMuIEFsdGhvdWdoIHlvdSBjb3VsZAogICBtYW51YWxseSBnZXQgY3VybCB0byByZXN1bWUgSFRUUCBkb2N1bWVudHMsIEkgbWFkZSB0aGUgLWMgcmVzdW1lIGZsYWcgd29yawogICBmb3IgSFRUUCB0b28gKHVubGVzcyAtciBpcyB1c2VkIHRvbywgd2hpY2ggd291bGQgYmUgdmVyeSBvZGQgYW55d2F5KS4KIC0gQWRkZWQgY2hlY2tsaW5rcy5wbCB0byB0aGUgYXJjaGl2ZS4gSXQgaXMgYSBzdGlsbCBleHBlcmltZW50YWwgcGVybCBzY3JpcHQKICAgdGhhdCBjaGVja3MgYWxsIGxpbmtzIG9mIGEgd2ViIHBhZ2UgYnkgdXNpbmcgY3VybC4KIC0gUmVhcnJhbmdlZCB0aGUgYXJjaGl2ZSBoaWVyYXJjaHkgYSBsaXR0bGUuIEJ1aWxkIHRoZSBleGVjdXRhYmxlIGluIHRoZQogICBzcmMvIGRpciBmcm9tIG5vdyBvbiEKIC0gVmVyc2lvbiA0LjkgYW5kIGhlcmVhZnRlciwgaXMgbm8gbG9uZ2VyIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgbGljZW5zZS4KICAgSSBoYXZlIG5vdyB1cGRhdGVkIHRoZSBMRUdBTCBmaWxlIGV0YyBhbmQgbm93IHRoaXMgaXMgcmVsZWFzZWQgdXNpbmcgdGhlCiAgIE1vemlsbGEgUHVibGljIExpY2Vuc2UgdG8gYXZvaWQgdGhlIHBsYWd1ZSBrbm93biBhcyAidGhlIEdQTCB2aXJ1cyIuIFlvdQogICBtdXN0IG1ha2UgdGhlIHNvdXJjZSBhdmFpbGFibGUgaWYgeW91IGRlY2lkZSB0byBjaGFuZ2UgYW5kL29yIHJlZGlzdHJpYnV0ZQogICBjdXJsLCBidXQgaWYgeW91IGRlY2lkZSB0byB1c2UgY3VybCB3aXRoaW4gc29tZXRoaW5nIGVsc2UgeW91IGRvIG5vdCBuZWVkCiAgIHRvIG9mZmVyIHRoZSB3b3JsZCB0aGUgc291cmNlIHRvIHRoYXQgdG9vLgogLSBDdXJsIGRpZCBub3QgbGlrZSBIVFRQIHNlcnZlcnMgdGhhdCBzZW50IG5vIGhlYWRlcnMgYXQgYWxsIG9uIGEgR0VUCiAgIHJlcXVlc3QuICBJdCBpcyBhIHZpb2xhdGlvbiBvZiBSRkMyMDY4IGJ1dCBhcHBlYXJhbnRseSBzb21lIHNlcnZlcnMgZG8KICAgdGhhdCBhbnl3YXkuICBUaGFua3MgdG8gR29yZG9uIEJlYXRvbiBmb3IgdGhlIHJlcG9ydCEKIC0gLUwvLS1sb2NhdGlvbiB3YXMgYWRkZWQgYWZ0ZXIgYSBzdWdnZXN0aW9uIGZyb20gTWFydGluIFN0YWFlbC4gVGhpcyBtYWtlcwogICBjdXJsIEFUVEVNUFQgdG8gZm9sbG93IHRoZSBMb2NhdGlvbjogcmVkaXJlY3QgaWYgb25lIGlzIHByZXNlbnQgaW4gdGhlIEhUVFAKICAgaGVhZGVycy4gSWYgLWkgb3IgLUkgaXMgdXNlZCB3aXRoIHRoaXMgZmxhZywgeW91IHdpbGwgc2VlIGhlYWRlcnMgZnJvbSBhbGwKICAgc2l0ZXMgdGhlIExvY2F0aW9uOiBwb2ludHMgdG8uIERvIG5vdGUgdGhhdCB0aGUgZmlyc3Qgc2VydmVyIGNhbiBwb2ludCB0byBhCiAgIHNlY29uZCB0aGF0IHBvaW50cyB0byBhIHRoaXJkIGV0Yy4gSXQgc2VlbXMgdGhlIExvY2F0aW9uOiBwYXJhbWV0ZXIgKHNhaWQKICAgdG8gYmUgYW4gQWJzb2x1dGVVUkkgaW4gUkZDMjA2OCkgaXNuJ3QgYWx3YXlzIGFic29sdXRlLi4gOi0vIEFueXdheSwgSSd2ZQogICBtYWRlIGN1cmwgQVRURU1QVCB0byBkbyB0aGUgYmVzdCBpdCBjYW4gdG8gZGVhbCB3aXRoIHRoZSByZWFsaXR5LgogLSBBZGRlZCBnZXRsaW5rcy5wbCB0byB0aGUgYXJjaGl2ZS4gZ2V0bGlua3MucGwgc2VsZWN0aXZlbHkgZG93bmxvYWRzCiAgIGZpbGVzIHRoYXQgYSB3ZWIgcGFnZSBsaW5rcyB0by4KClZlcnNpb24gNC44LjQKIERhbmllbCBTdGVuYmVyZwogLSBBcyBKdWxpYW4gUm9tZXJvIE5pZXRvIHJlcG9ydGVkLCBjdXJsIHJlcG9ydGVkIHdyb25nIHZlcnNpb24gbnVtYmVyLgogLSBBcyBUZWVtdSBZbGktRWxzaWxhIHBvaW50ZWQgb3V0LCB0aGUgd2luMzIgdmVyc2lvbiBvZiA0LjggKGFuZCBwcm9iYWJseSBhbGwKICAgb3RoZXIgdmVyc2lvbnMgZm9yIHdpbjMyKSBkaWRuJ3Qgd29yayB3aXRoIGJpbmFyeSBmaWxlcyBzaW5jZSBJJ20gdG9vIHVzZWQKICAgdG8gdGhlIFVOSVggc3R5bGUgZm9wZW4oKSB3aGVyZSBiaW5hcnkgYW5kIHRleHQgZG9uJ3QgZGlmZmVyLi4uCiAtIFJhbHBoIEJlY2ttYW5uIGJyb3VnaHQgbWUgc29tZSBjaGFuZ2VzIHRoYXQgbGV0cyBjdXJsIGNvbXBpbGUgZXJyb3IgYW5kCiAgIHdhcm5pbmcgZnJlZSB3aXRoIC1XYWxsIC1wZWRhbnRpYyB3aXRoIGcrKy4gSSBhbHNvIHRvb2sgdGhlIG9wcG9ydHVuaXR5IHRvCiAgIGNsZWFuIG9mZiBzb21lIHVudXNlZCB2YXJpYWJsZXMgYW5kIHNpbWlsYXIuCiAtIFJhbHBoIEJlY2ttYW5uIG1hZGUgbWUgYXdhcmUgb2YgYSByZWFsbHkgb2RkIGJ1ZyBub3cgY29ycmVjdGVkLiBXaGVuIGN1cmwKICAgcmVhZCBhIHNldCBvZiBoZWFkZXJzIGZyb20gYSBIVFRQIHNlcnZlciwgZGl2aWRlZCBpbnRvIG1vcmUgdGhhbiBvbmUgcmVhZAogICBhbmQgdGhlIGZpcnN0IHJlYWQgc2hvd2VkIGEgZnVsbCBsaW5lICpleGFjdGx5KiAoaS5lIGVuZGluZyB3aXRoIGEKICAgbmV3bGluZSksIGN1cmwgZGlkIG5vdCBiZWhhdmUgd2VsbC4KClZlcnNpb24gNC44LjMKIERhbmllbCBTdGVuYmVyZwogLSBJIHdhcyB0b28gcXVpY2sgdG8gcmVsZWFzZSA0LjguMiB3aXRoIHRvbyBsaXR0bGUgdGVzdGluZy4gT25lIG9mIHRoZQogICBjaGFuZ2VzIGlzIG5vdyByZXZlcnRlZCBzbGlnaHRseSB0byB0aGUgNC44LjEgd2F5IHNpbmNlIDQuOC4yIGNvdWxkbid0CiAgIHVwbG9hZCBmaWxlcy4gSSBzdGlsbCB0aGluayBib3RoIHByb2JsZW1zIGNvcnJlY3RlZCBpbiA0LjguMiByZW1haW4KICAgY29ycmVjdGVkLiAgUmVwb3J0ZWQgYnkgSnVsaWFuIFJvbWVybyBOaWV0by4KClZlcnNpb24gNC44LjIKIERhbmllbCBTdGVuYmVyZwogLSBCZXJuaGFyZCBJc2VsYm9ybiByZXBvcnRlZCB0d28gRlRQIHByb3RvY29sIGVycm9ycyBjdXJsIGRpZC4gVGhleSdyZSBub3cKICAgY29ycmVjdGVkLiBCb3RoIGFwcGVhcmVkIHdoZW4gZ2V0dGluZyBmaWxlcyBmcm9tIGEgTVMgRlRQIHNlcnZlciEgOi0pCgpWZXJzaW9uIDQuOC4xCiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgYSBsYXN0IHVwZGF0ZSBvZiB0aGUgcHJvZ3Jlc3MgbWV0ZXIgd2hlbiB0aGUgdHJhbnNmZXIgaXMgZG9uZS4gVGhlCiAgIGZpbmFsIG91dHB1dCBvbiB0aGUgc2NyZWVuIGRpZG4ndCBoYXZlIHRvIGJlIHRoZSBmaW5hbCBzaXplIHRyYW5zZmVyZWQKICAgd2hpY2ggbWFkZSBpdCBzb21ldGltZXMgbG9vayBvZGQuCiAtIFRoYW5rcyB0byBEYXZpZCBMb25nIEkgZ290IHJpZCBvZiBhIHNpbGx5IGJ1ZyB0aGF0IGhhcHBlbmVkIGlmIGEgSFRUUC1wYWdlCiAgIGhhZCBub3RoaW5nIGJ1dCBoZWFkZXIuIEFwcGVhcmFudGx5IFNvbGFyaXMgZGVhbHMgd2l0aCBuZWdhdGl2ZSBzaXplcyBpbgogICBmd3JpdGUoKSBjYWxscyBhIGxvdCBiZXR0ZXIgdGhhbiBMaW51eCBkb2VzLi4uID1CLV0KClZlcnNpb24gNC44CiBEYW5pZWwgU3RlbmJlcmcKIC0gQ29udGludWUgRlRQIGZpbGUgdHJhbnNmZXIuIC1jIGlzIHRoZSBzd2l0Y2guIE5vdGUgdGhhdCB5b3UgbmVlZCB0bwogICBzcGVjaWZ5IGEgZmlsZSBuYW1lIGlmIHlvdSB3YW5uYSByZXN1bWUgYSBkb3dubG9hZCAoeW91IGNhbid0IHJlc3VtZSBhCiAgIGRvd25sb2FkIHNlbnQgdG8gc3Rkb3V0KS4gUmVzdW1pbmcgdXBsb2FkIG1heSBiZSBsaW1pdGVkIGJ5IHRoZSBzZXJ2ZXIKICAgc2luY2UgY3VybCBpcyB0aGVuIHVzaW5nIHRoZSBub24tUkZDOTU5IGNvbW1hbmQgU0laRSB0byBnZXQgdGhlIHNpemUgb2YKICAgdGhlIHRhcmdldCBmaWxlIGJlZm9yZSB1cGxvYWQgYmVnaW5zICh0byBmaWd1cmUgb3V0IHdoaWNoIG9mZnNldCB0bwogICB1c2UpLiBVc2UgLUMgdG8gc3BlY2lmeSB0aGUgb2Zmc2V0IHlvdXJzZWxmISAtQyBpcyBoYW5keSBpZiB5b3UncmUgZG9pbmcKICAgdGhlIG91dHB1dCB0byBzb21ldGhpbmcgZWxzZSBidXQgYSBwbGFpbiBmaWxlIG9yIHdoZW4geW91IGp1c3Qgd2FudCB0byBnZXQKICAgdGhlIGVuZCBvZiBhIGZpbGUuCiAtIHJlY3Vyc2l2ZWZ0cGdldC5wbCBub3cgZmVhdHVyZXMgYSBtYXhpbXVtIHJlY3Vyc2l2ZSBsZXZlbCBhcmd1bWVudC4KClZlcnNpb24gNC43CiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgc3VwcG9ydCB0byBhYm9ydCBhIGRvd25sb2FkIGlmIHRoZSBzcGVlZCBpcyBiZWxvdyBhIGNlcnRhaW4gYW1vdW50CiAgIChzcGVlZC1saW1pdCkgYnl0ZXMgcGVyIHNlY29uZCBmb3IgYSBjZXJ0YWluIChzcGVlZC10aW1lKSB0aW1lLgogLSBXcm90ZSBhIHBlcmwgc2NyaXB0ICdyZWN1cnNpdmVmdHBnZXQucGwnIHRvIHJlY3Vyc2l2ZWx5IHVzZSBjdXJsIHRvIGdldCBhCiAgIHdob2xlIGZ0cCBkaXJlY3RvcnkgdHJlZS4gSXQgaXMgbWVhbnQgYXMgYW4gZXhhbXBsZSBvZiBob3cgY3VybCBjYW4gYmUKICAgdXNlZC4gIEkgYWdyZWUgaXQgaXNuJ3QgdGhlIHdpc2VzdCB0aGluZyB0byBkbyB0byBtYWtlIGEgc2VwYXJhdGUgbmV3CiAgIGNvbm5lY3Rpb24gZm9yIGVhY2ggZmlsZSBhbmQgZGlyZWN0b3J5IGZvciB0aGlzLgoKVmVyc2lvbiA0LjYKIERhbmllbCBTdGVuYmVyZwogLSBBZGRlZCBhIGZpcnN0IGF0dGVtcHQgdG8gb3B0aW9uYWxseSBwYXJzZSB0aGUgLm5ldHJjIGZpbGUgZm9yIGxvZ2luIHVzZXIKICAgYW5kIHBhc3N3b3JkLiBJZiB1c2VkIHdpdGggaHR0cCwgaXQgZW5hYmxlcyB1c2VyIGF1dGhlbnRpY2F0aW9uLiAtbiBpcwogICB0aGUgbmV3IHN3aXRjaC4KIC0gUmVtb3ZlZCB0aGUgZXh0cmEgbmV3bGluZXMgb24gdGhlIGRlZmF1bHQgdXNlci1hZ2VudCBzdHJpbmcuCiAtIENvcnJlY3RlZCB0aGUgbWlzc2luZyBmdHAgdXBsb2FkIGVycm9yIG1lc3NhZ2VzIHdoZW4gaXQgZmFpbGVkIHdpdGhvdXQgdGhlCiAgIHZlcmJvc2UgZmxhZyBzZXQuIEdhcnkgVy4gU3dlYXJpbmdlbiBmb3VuZCBpdC4KIC0gTm93IHVzaW5nIGFsYXJtKCkgdG8gZW5hYmxlIHNlY29uZC1wcmVjaXNpb24gdGltZW91dCBldmVuIG9uIHRoZSBuYW1lCiAgIHJlc29sdmluZy9jb25uZWN0aW5nIHBoYXNlLiBUaGUgdGltZW91dCBpcyBhbHRob3VnaCByZXNldCBhZnRlciB0aGF0IGZpcnN0CiAgIHNlcXVlbmNlLiAoVGhpcyBzaG91bGQgYmUgY29ycmVjdGVkLikgR2FyeSBXLiBTd2VhcmluZ2VuIHJlcG9ydGVkLgogLSBOb3cgc3BlbGxzICJVbmtub3duIiBwcm9wZXJseSwgYXMgaW4gIlVua25vd24gb3B0aW9uICd6JyIuLi4gOi0pCiAtIEFkZGVkIGJ1ZyByZXBvcnQgZW1haWwgYWRkcmVzcyBpbiB0aGUgUkVBRE1FLgogLSBBZGRlZCBhICJjdXJyZW50IHNwZWVkIiBmaWVsZCB0byB0aGUgcHJvZ3Jlc3MgbWV0ZXIuIEl0IHNob3dzIHRoZSBhdmVyYWdlCiAgIHNwZWVkIHRoZSBsYXN0IDUgc2Vjb25kcy4gVGhlIG90aGVyIHNwZWVkIGZpZWxkIHNob3dzIHRoZSBhdmVyYWdlIHNwZWVkIG9mCiAgIHRoZSBlbnRpcmUgdHJhbnNmZXIgc28gZmFyLgoKVmVyc2lvbiA0LjUuMQogTGluYXMgVmVwc3RhcwogLSBTU0wgdGhyb3VnaCBwcm94eSBmaXgKIC0gQWRkZWQgLUEgdG8gYWxsb3cgVXNlci1BZ2VudDogY2hhbmdlcwoKIERhbmllbCBTdGVuYmVyZyAKIC0gTWFkZSB0aGUgLUEgd29yayB3aGVuIFNTTC10aHJvdWdoLXByb3h5LgoKVmVyc2lvbiA0LjUKIExpbmFzIFZlcHN0YXMKIC0gTW9yZSBTU0wgY29ycmVjdGlvbnMKIC0gSSd2ZSBhZGRlZCBhIHBvcnQgdG8gQUlYLgogLSBydW5uaW5nIFNTTCB0aHJvdWdoIGEgcHJveHkgY2F1c2VzIGEgY2h1bmsgb2YgY29kZSB0byBiZSBleGVjdXRyZWQgdHdpY2UuCiAgIG9uZSBvZiB0aG9zZSBibG9ja3MgbmVlZHMgdG8gYmUgZGVsZXRlZC4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gTWFkZSAtaSBhbmQgLUkgd29yayBhZ2FpbgoKVmVyc2lvbiA0LjQKIExpbmFzIFZlcHN0YXMKIC0gLXggY2FuIG5vdyBhbHNvIHNwZWNpZnkgcHJveHlwb3J0IHdoZW4gdXNlZCBhcyBpbiAncHJveHlob3N0OnByb3h5cG9ydCcKIC0gU1NMIGZpeGVzCgpWZXJzaW9uIDQuMwogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkanVzdGVkIHRvIGNvbXBpbGUgdW5kZXIgd2luMzIgKFZpc3VhbEMrKyA1KS4gVGhlIC1QIHN3aXRjaCBkb2VzIG5vdAogICBzdXBwb3J0IG5ldHdvcmsgaW50ZXJmYWNlIG5hbWVzIGluIHdpbjMyLiBJIGNvdWxkbid0IGZpZ3VyZSBvdXQgaG93IQoKVmVyc2lvbiA0LjIKIExpbmFzIFZlcHN0YXMgLyBTYW1wbyBLZWxsb21ha2kKIC0gQWRkZWQgU1NMIC8gU1NMZWF5IHN1cHBvcnQgKGh0dHBzOi8vKQogLSBBZGRlZCB0aGUgLVQgdXNhZ2UgZm9yIEhUVFAgUE9TVC4KCiBEYW5pZWwgU3RlbmJlcmcKIC0gQnVnZml4ZWQgdGhlIFNTTCBpbXBsZW1lbnRhdGlvbi4KIC0gTWFkZSAtUCBhIGxvdCBiZXR0ZXIgdG8gdXNlIG90aGVyIElQIGFkZHJlc3Nlcy4gSXQgbm93IGFjY2VwdHMgYSBmb2xsb3dpbmcKICAgcGFyYW1ldGVyIHRoYXQgY2FuIGJlIGVpdGhlcgogICAgICAgIGludGVyZmFjZSAtIGkuZSAiZXRoMCIgdG8gc3BlY2lmeSB3aGljaCBpbnRlcmZhY2UncyBJUCBhZGRyZXNzIHlvdQogICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gdXNlCiAgICAgICAgSVAgYWRkcmVzcyAtIGkuZSAiMTkyLjE2OC4xMC4xIiB0byBzcGVjaWZ5IGV4YWN0IElQIG51bWJlcgogICAgICAgIGhvc3QgbmFtZSAtIGkuZSAibXkuaG9zdC5kb21haW4iIHRvIHNwZWNpZnkgbWFjaGluZQogICAgICAgICItIiAgICAgICAtIChhbnkgc2luZ2xlLWxldHRlciBzdHJpbmcpIHRvIG1ha2UgaXQgcGljayB0aGUgbWFjaGluZSdzCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdAogLSBUaGUgTWFrZWZpbGUgaXMgbm93IHJlYWR5IHRvIGNvbXBpbGUgZm9yIHNvbGFyaXMsIHN1bm9zNCBhbmQgbGludXggcmlnaHQKICAgb3V0IG9mIHRoZSBib3guCiAtIEJldHRlciBnZW5lcmF0ZWQgdmVyc2lvbiBzdHJpbmcgc2VlbiB3aXRoICdjdXJsIC1WJwoKVmVyc2lvbiA0LjEKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgSVAgbnVtYmVyIHJldHVybmVkIGJ5IHRoZSBmdHAgc2VydmVyIGFzIGEgcmVwbHkgdG8gUEFTViBkb2VzIG5vIGxvbmdlcgogICBoYXZlIHRvIEROUyByZXNvbHZlLiBJbiBmYWN0LCBubyBJUC1udW1iZXItb25seSBhZGRyZXNzZXMgaGF2ZSB0byBhbnltb3JlLgogLSBCaW5kcyBiZXR0ZXIgdG8gYXZhaWxhYmxlIHBvcnQgd2hlbiAtUCBpcyB1c2VkLgogLSBOb3cgTElTVHMgLi8gaW5zdGVhZCBvZiAvIHdoZW4gdXNlZCBhcyBpbiBmdHA6Ly9mdHAuZnVuZXQuZmkvLiBUaGUgcmVhc29uCiAgIGZvciB0aGlzIGlzIHRoYXQgZXhhY3RseSB0aGF0IHNpdGUsIGZ0cC5mdW5ldC5maSwgZG9lcyBub3QgYWxsb3cgTElTVCAvCiAgIHdoaWxlIExJU1QgLi8gaXMgZmluZS4gQW55IG9iamVjdGlvbnM/CgpWZXJzaW9uIDQgKDE5OTgtMDMtMjApCiBEYW5pZWwgU3RlbmJlcmcKIC0gSSB0b29rIGFub3RoZXIgaHVnZSBzdGVwIGFuZCBjaGFuZ2VkIGJvdGggdmVyc2lvbiBudW1iZXIgYW5kIHByb2plY3QgbmFtZSEKICAgVGhlIHJlYXNvbiBmb3IgdGhlIG5ldyBuYW1lIGlzIHRoYXQgdGhlcmUgYXJlIGp1c3Qgb25lIHRvbyBtYW55IHByb2dyYW1zCiAgIG5hbWVkIHVybGdldCBhbHJlYWR5IGFuZCB0aGlzIHByb2dyYW0gYWxyZWFkeSBjYW4gYSBsb3QgbW9yZSB0aGFuIG1lcmVseQogICBnZXR0aW5nIFVSTHMsIGFuZCB0aGUgcmVhc29uIGZvciB0aGUgdmVyc2lvbiBudW1iZXIgaXMgdGhhdCBJIGRpZCBhZGQgdGhlCiAgIHByZXR0eSBiaWcgY2hhbmdlIGluIC1QIGFuZCBzaW5jZSBJIGNoYW5nZWQgbmFtZSBJIHdhbnRlZCB0byBzdGFydCB3aXRoCiAgIHNvbWV0aGluZyBmcmVzaCEKIC0gVGhlIC0tc3R5bGUgZmxhZ3MgYXJlIHdvcmtpbmcgYmV0dGVyIG5vdy4KIC0gTGlzdGluZyBkaXJlY3RvcmllcyB3aXRoIEZUUCBvZnRlbiByZXBvcnRlZCB0aGF0IHRoZSBmaWxlIHRyYW5zZmVyIHdhcwogICBpbmNvbXBsZXRlLiBXcm9uZyBhc3N1bXB0aW9ucyB3ZXJlIHRvbyBjb21tb24gZm9yIGRpcmVjdG9yaWVzLCB3aHkgbm8KICAgc2l6ZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBnZXQgY29tcGFyZWQgb24gdGhlbSBmcm9tIG5vdyBvbi4KIC0gSW1wbGVtZW50ZWQgdGhlIC1QIGZsYWcgdGhhdCBsZXQncyB0aGUgZnRwIGNvbnRyb2wgaXNzdWUgYSBQT1JUIGNvbW1hbmQKICAgaW5zdGVhZCBvZiB0aGUgc3RhbmRhcmQgUEFTVi4KIC0gLWEgZm9yIGFwcGVuZGluZyBGVFAgdXBsb2FkcyB3b3Jrcy4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKVmVyc2lvbiAzLjEyICgxNCBNYXJjaCAxOTk4KQogRGFuaWVsIFN0ZW5iZXJnCiAtIEVuZC1vZi1oZWFkZXIgdHJhY2tpbmcgc3RpbGwgbGFja2VkIHN1cHBvcnQgZm9yIFxyXG4gb3IganVzdCBcbiBhdCB0aGUKICAgZW5kIG9mIHRoZSBsYXN0IGhlYWRlciBsaW5lLgogU2VyZ2lvIEJhcnJlc2kKIC0gQWRkZWQgUFJPWFkgYXV0aGVudGljYXRpb24uCiBSYWZhZWwgU2FndWxhCiAtIEZpeGVkIHNvbWUgbGl0dGxlIGJ1Z3MuCgpWZXJzaW9uIDMuMTEKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgaGVhZGVyIHBhcnNpbmcgd2FzIHN0aWxsIG5vdCBjb3JyZWN0IHNpbmNlIHRoZSAzLjIgbW9kaWZpY2F0aW9uLi4uCgpWZXJzaW9uIDMuMTAKIERhbmllbCBTdGVuYmVyZwogLSAzLjcgYW5kIDMuOSB3ZXJlIHNpbXVsdGFuZW91c2x5IGRldmVsb3BlZCBhbmQgbWVyZ2VkIGludG8gdGhpcyB2ZXJzaW9uLgogLSBGVFAgdXBsb2FkIGRpZCBub3Qgd29yayBjb3JyZWN0bHkgc2luY2UgMy4yLgoKVmVyc2lvbiAzLjkKIFJhZmFlbCBTYWd1bGEKIC0gQWRkZWQgdGhlICItZSA8dXJsPiAvIC0tcmVmZXJlciA8dXJsPiIgb3B0aW9uIHdoZXJlIHdlIGNhbiBzcGVjaWZ5CiAgIHRoZSByZWZlcmVyIHBhZ2UuIE9idmlvdXNseSwgdGhpcyBpcyBuZWNlc3Nhcnkgb25seSB0byBmb29sIHRoZQogICBzZXJ2ZXIsIGJ1dC4uLgoKVmVyc2lvbiAzLjcKIERhbmllbCBTdGVuYmVyZwogLSBOb3cgY2hlY2tzIHRoZSBsYXN0IGVycm9yIGNvZGUgc2VudCBmcm9tIHRoZSBmdHAgc2VydmVyIGFmdGVyIGEgZmlsZSBoYXMKICAgYmVlbiByZWNlaXZlZCBvciB1cGxvYWRlZC4gV2Fzbid0IGRvbmUgcHJldmlvdXNseS4KIC0gV2hlbiAndXJsZ2V0IDxob3N0PicgaXMgdXNlZCB3aXRob3V0IGEgJ3Byb3RvY29sOi8vJyBmaXJzdCBpbiB0aGUgaG9zdCBwYXJ0LAogICBpdCBub3cgY2hlY2tzIGZvciBob3N0IG5hbWVzIHN0YXJ0aW5nIHdpdGggZnRwIG9yIGdvcGhlciBhbmQgaWYgaXQgZG9lcywKICAgaXQgdXNlcyB0aGF0IHByb3RvY29sIGJ5IGRlZmF1bHQgaW5zdGVhZCBvZiBodHRwLgoKVmVyc2lvbiAzLjYKIERhbmllbCBTdGVuYmVyZwogLSBTaWxseSBtaXN0YWtlIG1hZGUgdGhlIFBPU1QgYnVnLiBUaGlzIGhhcyBub3cgYWxzbyBiZWVuIHRlc3RlZCB0byB3b3JrIHdpdGgKICAgcHJveHkuCgpWZXJzaW9uIDMuNQogRGFuaWVsIFN0ZW5iZXJnCiAtIEhpZ2hseSBpbnNwaXJlZCBieSBSYWZhZWwgU2FndWxhJ3MgY2hhbmdlcyB0byB0aGUgMy4xIHRoYXQgYWRkZWQgYW4gYWxtb3N0CiAgIGZ1bmN0aW9uYWwgUE9TVCwgSSBhcHBsaWVkIGhpcyBjaGFuZ2VzIGludG8gdGhpcyB2ZXJzaW9uIGFuZCBtYWRlIHRoZW0gd29yay4KICAgKEl0IHNlZW1zIFBPU1QgcmVxdWlyZXMgdGhlIENvbnRlbnQtVHlwZSBhbmQgQ29udGVudC1MZW5ndGggaGVhZGVycy4pIEl0IGlzCiAgIG5vdyB1c2FibGUgd2l0aCB0aGUgLWQgc3dpdGNoLgoKVmVyc2lvbiAzLjMgLSAzLjQKIFBhc3NlZCB0byBhdm9pZCBjb25mdXNpb25zCgpWZXJzaW9uIDMuMgogRGFuaWVsIFN0ZW5iZXJnCiAtIE1ham9yIHJld3JpdGUgb2YgdHdvIGNydWNpYWwgcGFydHMgb2YgdGhpcyBjb2RlOiB1cGxvYWQgYW5kIGRvd25sb2FkLgogICBUaGV5IGFyZSBib3RoIG5vdyB1c2luZyBhIHNlbGVjdCgpIHN3aXRjaCwgdGhhdCBhbGxvd3MgbXVjaCBiZXR0ZXIKICAgcHJvZ3Jlc3MgbWV0ZXIgYW5kIHRpbWUgY29udHJvbC4gCiAtIGFsYXJtKCkgdXNhZ2UgcmVtb3ZlZCBjb21wbGV0ZWx5CiAtIEZUUCBnZXQgY2FuIG5vdyBsaXN0IGRpcmVjdG9yeSBjb250ZW50cyBpZiB0aGUgcGF0aCBlbmRzIHdpdGggYSBzbGFzaCAnLycuCiAgIFVybGdldCBvbiBhIGZ0cC1wYXRoIHRoYXQgZG9lc24ndCBlbmQgd2l0aCBhIHNsYXNoIG1lYW5zIHVybGdldCB3aWxsCiAgIGF0dGVtcHQgZ2V0dGluZyBpdCBhcyBhIGZpbGUgbmFtZS4KIC0gRlRQIGRpcmVjdG9yeSB2aWV3IHN1cHBvcnRzIC1sIGZvciAibGlzdC1vbmx5IiB3aGljaCBsaXN0cyB0aGUgZmlsZSBuYW1lcwogICBvbmx5LgogLSBBbGwgb3BlcmF0aW9ucyBzdXBwb3J0IC1tIGZvciBtYXggdGltZSB1c2FnZSBpbiBzZWNvbmRzIGFsbG93ZWQuCiAtIEZUUCB1cGxvYWQgbm93IGFsbG93cyB0aGUgc2l6ZSBvZiB0aGUgdXBsb2FkZWQgZmlsZSB0byBiZSBwcm92aWRlZCwgYW5kCiAgIHRodXMgaXQgY2FuIGJldHRlciBjaGVjayBpdCBhY3R1YWxseSB1cGxvYWRlZCB0aGUgd2hvbGUgZmlsZS4gSXQgYWxzbwogICBtYWtlcyB0aGUgcHJvZ3Jlc3MgbWV0ZXIgZm9yIHVwbG9hZHMgbXVjaCBiZXR0ZXIhCiAtIE1hZGUgdGhlIHBhcmFtZXRlciBwYXJzaW5nIGZhaWwgaW4gY2FzZXMgbGlrZSAndXJsZ2V0IC1yIDkwMCcgd2hpY2gKICAgcHJldmlvdXNseSB0cmllZCB0byBjb25uZWN0IHRvIHRoZSBob3N0IG5hbWVkICc5MDAnLgoKVmVyc2lvbiAzLjEKIEtqZWxsIEVyaWNzb24KIC0gUG9pbnRlZCBvdXQgaG93IHRvIGNvcnJlY3QgdGhlIDMgd2FybmluZ3MgaW4gd2luMzItY29tcGlsZXMuCgogRGFuaWVsIFN0ZW5iZXJnCiAtIFJlbW92ZWQgYWxsIGNhbGxzIHRvIGV4aXQoKS4KIC0gTWFkZSB0aGUgc2hvcnQgaGVscCB0ZXh0IGdldCB3cml0dGVuIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIHN0ZGVyci4KIC0gTWFkZSB0aGlzIGZpbGUgaW5zdGVhZCBvZiBrZWVwaW5nIHRoZXNlIGNvbW1lbnRzIGluIHRoZSBzb3VyY2UuCiAtIE1hZGUgdHdvIGNhbGxiYWNrIGhvb2tzLCB0aGF0IGVuYWJsZSBleHRlcm5hbCBwcm9ncmFtcyB0byB1c2UgdXJsZ2V0KCkKICAgZWFzaWVyIGFuZCB0byBncmFiIHRoZSBvdXRwdXQvb2ZmZXIgdGhlIGlucHV0IGVhc2llci4KIC0gSXQgaXMgZXZpZGVudCB0aGF0IFdpbjMyLWNvbXBpbGVzIGFyZSBwYWluZnVsLiBJIHdhdGNoZWQgdGhlIG91dHB1dCBmcm9tCiAgIHRoZSBCb3JsYW5kIEMrKyB2NSBhbmQgaXQgd2FzIGF3ZnVsLiBKdXN0IGlnbm9yZSBhbGwgdGhvc2Ugd2FybmluZ3MuCgpWZXJzaW9uIDMuMAogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkZGVkIEZUUCB1cGxvYWQgY2FwYWJpbGl0aWVzLiBUaGUgbmFtZSB1cmxnZXQgZ2V0cyBhIGJpdCBzaWxseSBub3cKICAgd2hlbiB3ZSBjYW4gcHV0IHRvby4uLiA9KQogLSBSZXN0cnVjdHVyZWQgdGhlIHNvdXJjZSBxdWl0ZSBhIGxvdC4KICAgQ2hhbmdlZCB0aGUgdXJsZ2V0KCkgaW50ZXJmYWNlLiBUaGlzIHdheSwgd2Ugd2lsbCBzdXJ2aXZlIGNoYW5nZXMgbXVjaAogICBiZXR0ZXIuIE5ldyBmZWF0dXJlcyBjYW4gY29tZSBhbmQgb2xkIGNhbiBiZSByZW1vdmVkIHdpdGhvdXQgdXMgbmVlZGluZwogICB0byBjaGFuZ2UgdGhlIGludGVyZmFjZS4gSSd2ZSB3cml0dGVuIGEgc21hbGwgZXhwbGFuYXRpb24gaW4gdXJsZ2V0LmgKICAgdGhhdCBleHBsYWlucyBpdC4KIC0gTmV3IGZsYWdzIGluY2x1ZGUgLXQsIC1ULCAtTyBhbmQgLWguIFRoZSAtaCB0ZXh0IGlzIGdlbmVyYXRlZCBieSB0aGUgbmV3CiAgIG1raGVscCBzY3JpcHQuCgpWZXJzaW9uIDIuOQogUmVtY28gdmFuIEhvb2ZmCiAtIEFkZGVkIGEgZml4IHRvIG1ha2UgaXQgY29tcGlsZSBzbW9vdGhseSBvbiBBbWlnYSB1c2luZyB0aGUgU0FTL0MKICAgY29tcGlsZXIuCiAgCiBEYW5pZWwgU3RlbmJlcmcKIC0gQmVsaWV2ZSBpdCBvciBub3QsIGJ1dCB0aGUgU1RVUElEIE5vdmVsbCB3ZWIgc2VydmVyIHNlZW1zIHRvIHJlcXVpcmUKICAgdGhhdCB0aGUgSG9zdDoga2V5d29yZCBpcyB1c2VkLCBzbyB3ZWxsIEkgdXNlIGl0IGFuZCBJIChyZS1pbnRyb2R1Y2UpIHRoZQogICB1cmxnZXQgVXNlci1BZ2VudDouIEkgc3RpbGwgaGF2ZSB0byBjaGVjayB0aGF0IHRoaXMgSG9zdDogdXNhZ2Ugd29ya3Mgd2l0aAogICBwcm94aWVzLi4uICdIb3N0OicgaXMgcmVxdWlyZWQgZm9yIEhUVFAvMS4xIEdFVCBhY2NvcmRpbmcgdG8gUkZDMjA2OC4KClZlcnNpb24gMi44CiBSYWZhZWwgU2FndWxhCiAtIHNvbWUgbGl0dGxlIG1vZGlmaWNhdGlvbnMKClZlcnNpb24gMi43CiBEYW5pZWwgU3RlbmJlcmcKIC0gUmVtb3ZlZCB0aGUgLWwgb3B0aW9uIGFuZCBpbnRyb2R1Y2VkIHRoZSAtZiBvcHRpb24gaW5zdGVhZC4gTm93IEknbGwKICAgcmV3cml0ZSB0aGUgZm9ybWVyIC1sIGtsdWRnZSBpbiBhbiBleHRlcm5hbCBzY3JpcHQgdGhhdCdsbCB1c2UgdXJsZ2V0IHRvCiAgIGZldGNoIG11bHRpcGFydCBmaWxlcyBsaWtlIHRoYXQuCiAtICctZicgaXMgaW50cm9kdWNlZCwgaXQgbWVhbnMgRmFpbCB3aXRob3V0IG91dHB1dCBpbiBjYXNlIG9mIEhUVFAgc2VydmVyCiAgIGVycm9ycyAocmV0dXJuIGNvZGUgPj0zMDApLgogLSBBZGRlZCBzdXBwb3J0IGZvciAtciwgcmFuZ2VzLiBTcGVjaWZ5IHdoaWNoIHBhcnQgb2YgYSBkb2N1bWVudCB5b3UgCiAgIHdhbnQsIGFuZCBvbmx5IHRoYXQgcGFydCBpcyByZXR1cm5lZC4gT25seSB3aXRoIEhUVFAvMS4xLXNlcnZlcnMuCiAtIFNwbGl0IHVwIHRoZSBzb3VyY2UgaW4gMyBwYXJ0cy4gTm93IGFsbCBwdXJlIFVSTCBmdW5jdGlvbnMgYXJlIGluCiAgIHVybGdldC5jIGFuZCBzdHVmZiB0aGF0IGRlYWxzIHdpdGggdGhlIHN0YW5kLWFsb25lIHByb2dyYW0gaXMgaW4gbWFpbi5jLgogLSBJIHRvb2sgYSBmZXcgbWludXRlcyBhbmQgd3JvdGUgYW4gZW1icnlvIG9mIGEgUkVBRE1FIGZpbGUgdG8gZXhwbGFpbgogICBhIGZldyB0aGluZ3MuCgpWZXJzaW9uIDIuNgogRGFuaWVsIFN0ZW5iZXJnCiAtIE1hZGUgdGhlIC1sIChsb29wKSB0aGluZyB1c2UgdGhlIG5ldyBDT05GX0ZBSUxPTkVSUk9SIHdoaWNoIG1ha2VzCiAgIHVybGdldCgpIHJldHVybiBlcnJvciBjb2RlIGlmIG5vbi1zdWNjZXNzZnVsLiBJdCBhbHNvIHdvbid0IG91dHB1dCBhbnl0aGluZwogICB0aGVuLiBOb3cgZmluYWxseSByZW1vdmVkIHRoZSBIVFRQIDEuMCBhbmQgZXJyb3IgNDA0IGRlcGVuZGVuY2llcy4KIC0gQWRkZWQgLUkgd2hpY2ggdXNlcyB0aGUgSEVBRCByZXF1ZXN0IHRvIGdldCB0aGUgaGVhZGVyIG9ubHkgZnJvbSBhCiAgIGh0dHAtc2VydmVyLgoKVmVyc2lvbiAyLjUKIFJhZmFlbCBTYWd1bGEKIC0gTWFkZSB0aGUgcHJvZ3Jlc3MgbWV0ZXIgdXNlIEhISDpNTTpTUyBpbnN0ZWFkIG9mIG9ubHkgc2Vjb25kcy4KClZlcnNpb24gMi40CiBEYW5pZWwgU3RlbmJlcmcKIC0gQWRkZWQgcHJvZ3Jlc3MgbWV0ZXIuIEl0IGFwcGVhcnMgd2hlbiBkb3dubG9hZGluZyA+IEJVRkZFUiBTSVpFIGFuZAogICBtdXRlIGlzIG5vdCBzZWxlY3RlZC4gSSBmb3VuZCBvdXQgdGhhdCB3aGVuIGRvd25sb2FkaW5nIGxhcmdlIGZpbGVzIGZyb20KICAgcmVhbGx5IHJlYWxseSBzbG93IHNpdGVzLCBpdCBpcyBkZXNpcmFibGUgdG8ga25vdyB0aGUgc3RhdHVzIG9mIHRoZQogICBkb3dubG9hZC4gRG8gbm90ZSB0aGF0IHNvbWUgZG93bmxvYWRzIGFyZSBkb25lIHVuYXdhcmluZyBvZiB0aGUgc2l6ZSwgd2hpY2gKICAgbWFrZXMgdGhlIHByb2dyZXNzIG1ldGVyIGxlc3MgdGhyaWxsaW5nIDspIElmIHRoZSBvdXRwdXQgaXMgc2VudCB0byBhIHR0eSwKICAgdGhlIHByb2dyZXNzIG1ldGVyIGlzIHNodXQgb2ZmLgogLSBJbmNyZWFzZWQgYnVmZmVyIHNpemUgdXNlZCBmb3IgcmVhZGluZy4KIC0gQWRkZWQgbGVuZ3RoIGNoZWNrcyBpbiB0aGUgdXNlcitwYXNzd2QgcGFyc2luZy4KIC0gTWFkZSBpdCBncm9rIHVzZXIrcGFzc3dkIGZvciBIVFRQIGZldGNoZXMuIFRoZSB0cmljayBpcyB0byBiYXNlNjQKICAgZW5jb2RlIHRoZSB1c2VyK3Bhc3N3ZCBhbmQgc2VuZCBhbiBleHRyYSBoZWFkZXIgbGluZS4gUmVhZCBjaGFwdGVyIDExLjEgaW4KICAgUkZDMjA2OCBmb3IgZGV0YWlscy4gSSBhZGRlZCBpdCB0byBiZSB1c2VkIGp1c3QgbGlrZSB0aGUgZnRwIG9uZS4gIFRvIGdldCBhCiAgIGh0dHAgZG9jdW1lbnQgZnJvbSBhIHBsYWNlIHRoYXQgcmVxdWlyZXMgdXNlciBhbmQgcGFzc3dvcmQsIHVzZSBhbiBVUkwKICAgbGlrZToKCiAgICAgICAgaHR0cDovL3VzZXI6cGFzc3dkQHd3dy5zaXRlLnRvLmxlYWNoL2RvYy5odG1sCgogICBJIGFsc28gYWRkZWQgdGhlIC11IGZsYWcsIHNpbmNlIFdIRU4gVVNJTkcgQSBQUk9YWSBZT1UgQ0FOJ1QgU1BFQ0lGWSBUSEUKICAgVVNFUiBBTkQgUEFTU1dPUkQgV0lUSCBIVFRQIExJS0UgVEhBVC4gVGhlIC11IGZsYWcgd29ya3MgZm9yIGZ0cCB0b28sIGJ1dAogICBub3QgaWYgdXNlZCB3aXRoIHByb3h5LiBUbyBkbyB0aGUgc2FtZSBhcyB0aGUgYWJvdmUgb25lLCB5b3UgY2FuIGludm9rZToKCiAgICAgICAgdXJsZ2V0IC11IHVzZXI6cGFzc3dkIGh0dHA6Ly93d3cuc2l0ZS50by5sZWFjaC9kb2MuaHRtbAoKVmVyc2lvbiAyLjMKIFJhZmFlbCBTYWd1bGEKIC0gQWRkZWQgIi1vIiBvcHRpb24gKG91dHB1dCBmaWxlKQogLSBBZGRlZCBVUkdfSFRUUF9OT1RfRk9VTkQgcmV0dXJuIGNvZGUuCiAgIChEYW5pZWwncyBub3RlOikKICAgUGVyaGFwcyB3ZSBzaG91bGQgZGV0ZWN0IGFsbCBraW5kcyBvZiBlcnJvcnMgYW5kIGluc3RlYWQgb2Ygd3JpdGluZyB0aGF0CiAgIGN1c3RvbSBzdHJpbmcgZm9yIHRoZSBwYXJ0aWN1bGFyIDQwNC1lcnJvciwgdXNlIHRoZSBlcnJvciB0ZXh0IHdlIGFjdHVhbGx5CiAgIGdldCBmcm9tIHRoZSBzZXJ2ZXIuIFNlZSBmdXJ0aGVyIGRldGFpbHMgaW4gUkZDMjA2OCAoSFRUUCAxLjEKICAgZGVmaW5pdGlvbikuIFRoZSBjdXJyZW50IHdheSBhbHNvIHJlbGllcyBvbiBhIEhUVFAvMS4wIHJlcGx5LCB3aGljaCBuZXdlcgogICBzZXJ2ZXJzIG1pZ2h0IG5vdCBkby4KIC0gTG9vcGluZyBtb2RlICgiLWwiIG9wdGlvbikuIEl0J3MgZWFzaWVyIHRvIGdldCB2YXJpb3VzIHNwbGl0IGZpbGVzLgogICAoRGFuaWVsJ3Mgbm90ZTopCiAgIFVzZSBpdCBsaWtlICd1cmxnZXQgLWwgMSBodHRwOi8vZnJvbS50aGlzLnNpdGUvZmlsZSVkLmh0bWwnLCB3aGljaCB3aWxsCiAgIG1ha2UgdXJsZ2V0IHRvIGF0dGVtcHQgdG8gZmV0Y2ggYWxsIGZpbGVzIG5hbWVkIGZpbGUxLmh0bWwsIGZpbGUyLmh0bWwgZXRjCiAgIHVudGlsIG5vIG1vcmUgZmlsZXMgYXJlIGZvdW5kLiBUaGlzIGlzIG9ubHkgYSBtb2RpZmljYXRpb24gb2YgdGhlCiAgIFNUQU5EX0FMT05FIHBhcnQsIG5vdGhpbmcgaW4gdGhlIHVybGdldCgpIGZ1bmN0aW9uIHdhcyBtb2RmaWZpZWQgZm9yIHRoaXMuCiBEYW5pZWwgU3RlbmJlcmcKIC0gQ2hhbmdlZCB0aGUgLWggdG8gYmUgLWkgaW5zdGVhZC4gLWggc2hvdWxkIGJlIHByZXNlcnZlZCB0byBoZWxwIHVzZS4KIC0gQmpvcm4gUmVlc2UgaW5kaWNhdGVkIHRoYXQgQm9ybGFuZCBfbWlnaHRfIHVzZSAnX1dJTjMyJyBpbnN0ZWFkIG9mIHRoZQogICBWQysrIFdJTjMyIGRlZmluZSBhbmQgdGhlcmVmb3JlIEkgYWRkZWQgYSBsaXR0bGUgZml4IGZvciB0aGF0LgoKVmVyc2lvbiAyLjIKIEpvaGFuIEFuZGVyc3NvbgogLSBUaGUgdXJsZ2V0IGZ1bmN0aW9uIGRpZG4ndCBzZXQgdGhlIHBhdGggdG8gdXJsIHdoZW4gdXNpbmcgcHJveHkuCiAtIEZpeGVkIGJ1ZyB3aXRoIElNQyBwcm94eS4gTm93IHVzaW5nIChhbG1vc3QpIGNvbXBsZXRlIEdFVCBjb21tYW5kLgogIAogRGFuaWVsIFN0ZW5iZXJnCiAtIE1hZGUgaXQgY29tcGlsZSBvbiBTb2xhcmlzLiBIYWQgdG8gcmVvcmdhbml6ZSB0aGUgaW5jbHVkZXMgYSBiaXQuCiAgIChzbyBXaW4zMiwgTGludXgsIFN1bk9TIDQgYW5kIFNvbGFyaXMgMiBjb21waWxlIGZpbmUuKQogLSBNYWRlIEpvaGFuJ3Mga2VlcGFsaXZlIGtleXdvcmQgb3B0aW9uYWwgd2l0aCB0aGUgLWsgZmxhZyAoc2luY2UgaXQKICAgbWFrZXMgYSBsb3Qgb2YgdXJsZ2V0cyB0YWtlIGEgbG90IGxvbmdlciB0aW1lKS4KIC0gTWFkZSBhICctaCcgc3dpdGNoIGluIGNhc2UgeW91IHdhbnQgdGhlIEhUVFAtaGVhZGVyIGluIHRoZSBvdXRwdXQuCgpWZXJzaW9uIDIuMQogRGFuaWVsIFN0ZW5iZXJnIGFuZCBLamVsbCBFcmljc29uCiAtIFdpbjMyLWNvbXBpbGFibGUKIC0gTm8gbW9yZSBnbG9iYWwgdmFyaWFibGVzCiAtIE11dGUgb3B0aW9uIChubyBvdXRwdXQgYXQgYWxsIHRvIHN0ZGVycikKIC0gRnVsbCByYW5nZSBvZiByZXR1cm4gY29kZXMgZnJvbSB1cmxnZXQoKSwgd2hpY2ggaXMgbm93IHdyaXR0ZW4gdG8gYmUgYQogICBmdW5jdGlvbiBmb3IgZWFzeS10by11c2UgaW4gW290aGVyXSBwcm9ncmFtcy4KIC0gRGVmaW5lIFNUQU5EX0FMT05FIHRvIGNvbXBpbGUgdGhlIHN0YW5kIGFsb25lIHVybGdldCBwcm9ncmFtCiAtIE5vdyBjb21waWxlcyB3aXRoIGdjYyBvcHRpb25zIC1hbnNpIC1XYWxsIC1wZWRhbnRpYyA7KQoKVmVyc2lvbiAyLjAKIC0gSW50cm9kdWNpbmcgZnRwIEdFVCBzdXBwb3J0LiBUaGUgRlRQIFVSTCB0eXBlIGlzIHJlY29nbml6ZWQgYW5kIHVzZWQuCiAtIFJlbmFtZWQgdGhlIHByb2plY3QgdG8gJ3VybGdldCcuCiAtIFN1cHBvcnRzIHRoZSB1c2VyK3Bhc3N3ZCBpbiB0aGUgRlRQIFVSTCAob3RoZXJ3aXNlIGl0IHRyaWVzIGFub255bW91cwogICBsb2dpbiB3aXRoIGEgd2VpcmQgZW1haWwgYWRkcmVzcyBhcyBwYXNzd29yZCkuCgpWZXJzaW9uIDEuNQogRGFuaWVsIFN0ZW5iZXJnCiAtIFRoZSBza2lwX2hlYWRlcigpIGNyYXAgbWVzc2VkIGl0IHVwIGJpZy10aW1lLiBCeSBzaW1wbHkgcmVtb3ZpbmcgdGhhdAogICBvbmUgd2UgY2FuIGFsbCBvZiBhIHN1ZGRlbiBkb3dubG9hZCBhbnl0aGluZyA7KQogLSBObyBsb25nZXIgcmVxdWlyZXMgYSB0cmFpbGluZyBzbGFzaCBvbiB0aGUgVVJMcy4KIC0gSWYgdGhlIGdpdmVuIFVSTCBpc24ndCBwcmVmaXhlZCB3aXRoICdodHRwOi8vJywgSFRUUCBpcyBhc3N1bWVkIGFuZAogICBnaXZlbiBhIHRyeSEKIC0gJ3ZvaWQgbWFpbigpJyBpcyBoaXN0b3J5LgoKVmVyc2lvbiAxLjQKIERhbmllbCBTdGVuYmVyZwogLSBUaGUgZ29waGVyIHNvdXJjZSB1c2VkIHRoZSBwcGF0aCB2YXJpYWJsZSBpbnN0ZWFkIG9mIHBhdGggd2hpY2ggY291bGQKICAgbGVhZCB0byBkaXNhc3Rlci4KClZlcnNpb24gMS4zCiBEYW5pZWwgU3RlbmJlcmcKIC0gV2VsbCwgSSBhZGRlZCBhIGxhbWUgdGV4dCBhYm91dCB0aGUgdGltZSBpdCB0b29rIHRvIGdldCB0aGUgZGF0YS4gSSBhbHNvCiAgIGZvdWdodCBhZ2FpbnN0IEpvaGFuIHRvIHByZXZlbnQgaGlzIC1mIG9wdGlvbiAodG8gc3BlY2lmeSBhIGZpbGUgbmFtZQogICB0aGF0IHNob3VsZCBiZSB3cml0dGVuIGluc3RlYWQgb2Ygc3Rkb3V0KSEgPSkKIC0gTWFkZSBpdCB3cml0ZSAnY29ubmVjdGlvbiByZWZ1c2VkJyBmb3IgdGhhdCBwYXJ0aWN1bGFyIGNvbm5lY3QoKQogICBwcm9ibGVtLgogLSBSZW51bWJlcmVkIHRoZSB2ZXJzaW9uLiBMZXQncyBub3QgbWFrZSBzaWxseSAxLjAuWCB2ZXJzaW9ucywgdGhpcyBpcwogICBhIHBsYWluIDEuMyBpbnN0ZWFkLgoKVmVyc2lvbiAxLjIKIEpvaGFuIEFuZGVyc3NvbgogLSBEaXNjb3ZlcmVkIGFuZCBmaXhlZCB0aGUgcHJvYmxlbSB3aXRoIGdldHRpbmcgYmluYXJ5IGZpbGVzLiBwdXRzKCkgaXMKICAgbm93IHJlcGxhY2VkIHdpdGggZndyaXRlKCkuIChEYW5pZWwncyBub3RlOiB0aGlzIGFsc28gZml4ZWQgdGhlIGJ1ZmZlcgogICBvdmVyd3JpdGUgcHJvYmxlbSBJIGZvdW5kIGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uLikKCiBSYWZhZWwgU2FndWxhCiAtIExldCAiLXAiIGJlZm9yZSAiLXgiLgoKIERhbmllbCBTdGVuYmVyZwogLSBCdWdmaXhlZCB0aGUgcHJveHkgdXNhZ2UuIEl0IHNob3VsZCAqTk9UKiB1c2Ugbm9yIHN0cmlwIHRoZSBwb3J0IG51bWJlcgogICBmcm9tIHRoZSBVUkwgYnV0IHNpbXBseSBwYXNzIHRoYXQgaW5mb3JtYXRpb24gdG8gdGhlIHByb3h5LiBUaGlzIGFsc28KICAgbWFkZSB0aGUgdXNlci9wYXNzd29yZCBmaWVsZHMgcG9zc2libGUgdG8gdXNlIGluIHByb3h5IFtmdHAtXSBVUkxzLgogICAobGlrZSBpbiBmdHA6Ly91c2VyOnBhc3N3b3JkQGZ0cC5teS5zaXRlOjgwMjEvUkVBRE1FKQoKIEpvaGFuIEFuZGVyc3NvbgogLSBJbXBsZW1lbnRlZCBIVFRQIHByb3h5IHN1cHBvcnQuCiAtIFJlY2VpdmUgYnl0ZSBjb3VudGVyIGFkZGVkLgoKIEJqb3JuIFJlZXNlCiAtIEltcGxlbWVudGVkIFVSTHMgKGFuZCBza2lwcGVkIHRoZSBvbGQgc3ludGF4KS4KIC0gT3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3Rkb3V0LCBzbyB0byBhY2hpZXZlIHRoZSBhYm92ZSBleGFtcGxlLCBkbzoKICAgaHR0cGdldCBodHRwOi8vMTQzLjU0LjEwLjYvaW5mb19sb2dvLmdpZiA+IHRlc3QuZ2lmCgpWZXJzaW9uIDEuMQogRGFuaWVsIFN0ZW5iZXJnCiAtIEFkanVzdGVkIGl0IHNsaWdodGx5IHRvIGFjY2VwdCBuYW1lZCBob3N0cyBvbiB0aGUgY29tbWFuZCBsaW5lLiBXZQogICB3b3VsZG4ndCB3YW5uYSB1c2UgSVAgbnVtYmVycyBmb3IgdGhlIHJlc3Qgb2Ygb3VyIGxpZmVzLCB3b3VsZCB3ZT8KClZlcnNpb24gMS4wCiAgUmFmYWVsIFNhZ3VsYQogIC0gV3JvdGUgdGhlIGluaXRpYWwgaHR0cGdldCwgd2hpY2ggc3RhcnRlZCBhbGwgdGhpcyEK