ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8gICBfIF9fX18gIF8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19ffCB8IHwgfCAgXyBcfCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBfX3wgfCB8IHwgfF8pIHwgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoX198IHxffCB8ICBfIDx8IHxfX18KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcX19ffFxfX18vfF98IFxfXF9fX19ffAoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZWxvZwoKRGFuaWVsICgyOSBKYW51YXJ5IDIwMDcpCi0gTWljaGFlbCBXYWxsbmVyIHJlcG9ydGVkIHRoYXQgd2hlbiBkb2luZyBhIENPTk5FQ1Qgd2l0aCBhIGN1c3RvbSBVc2VyLUFnZW50CiAgaGVhZGVyLCB5b3UgZ290IF90d29fIFVzZXItQWdlbnQgaGVhZGVycyBpbiB0aGUgQ09OTkVDVCByZXF1ZXN0Li4uISBBZGRlZAogIHRlc3QgY2FzZSAyODcgdG8gdmVyaWZ5IHRoZSBmaXguCgpEYW5pZWwgKDI4IEphbnVhcnkgMjAwNykKLSBjdXJsX2Vhc3lfcmVzZXQoKSBub3cgcmVzZXRzIHRoZSBDQSBidW5kbGUgcGF0aCBjb3JyZWN0bHkuCgotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIHRoZSBDdXJsIGNvbW1hbmQgbGluZSB0b29sIGZvciBIVFRQIG9uIG5vbi1BU0NJSQogIHBsYXRmb3Jtcy4KCkRhbmllbCAoMjUgSmFudWFyeSAyMDA3KQotIEFkZGVkIHRoZSAtLWxpYmN1cmwgW2ZpbGVdIG9wdGlvbiB0byBjdXJsLiBBcHBlbmQgdGhpcyBvcHRpb24gdG8gYW55CiAgb3JkaW5hcnkgY3VybCBjb21tYW5kIGxpbmUsIGFuZCB5b3Ugd2lsbCBnZXQgYSBsaWJjdXJsLXVzaW5nIHNvdXJjZSBjb2RlCiAgd3JpdHRlbiB0byB0aGUgZmlsZSB0aGF0IGRvZXMgdGhlIGVxdWl2YWxlbnQgb3BlcmF0aW9uIG9mIHdoYXQgeW91ciBjb21tYW5kCiAgbGluZSBvcGVyYXRpb24gZG9lcyEKCkRhbiBGICgyNCBKYW51YXJ5IDIwMDcpCi0gRml4ZWQgYSBkYW5nbGluZyBwb2ludGVyIHByb2JsZW0gdGhhdCBwcmV2ZW50ZWQgdGhlIGh0dHBfcHJveHkgZW52aXJvbm1lbnQKICB2YXJpYWJsZSBmcm9tIGJlaW5nIHByb3Blcmx5IHVzZWQgaW4gbWFueSBjYXNlcyAoYW5kIGNhdXNlZCB0ZXN0IGNhc2UgNjMKICB0byBmYWlsKS4KCkRhbmllbCAoMjMgSmFudWFyeSAyMDA3KQotIERhdmlkIE1jQ3JlZWR5IGRpZCBOVExNIGNoYW5nZXMgbWFpbmx5IGZvciBub24tQVNDSUkgcGxhdGZvcm1zOgoKICAjMQogIFRoZXJlJ3MgYSBjb21waWxhdGlvbiBlcnJvciBpbiBodHRwX250bG0uYyBpZiBVU0VfTlRMTTJTRVNTSU9OIGlzIE5PVAogIGRlZmluZWQuICBJIG5vdGljZWQgdGhpcyB3aGlsZSB0ZXN0aW5nIHZhcmlvdXMgY29uZmlndXJhdGlvbnMuICBMaW5lIDg2NyBvZgogIHRoZSBjdXJyZW50IGh0dHBfbnRsbS5jIGlzIGEgY2xvc2luZyBicmFja2V0IGZvciBhbiBpZi9lbHNlIHBhaXIgdGhhdCBvbmx5CiAgZ2V0cyBjb21waWxlZCBpbiBpZiBVU0VfTlRMTTJTRVNTSU9OIGlzIGRlZmluZWQuICBCdXQgdGhpcyBjbG9zaW5nIGJyYWNrZXQKICB3YXNuJ3QgaW4gYW4gI2lmZGVmIHNvIHRoZSBjb2RlIGZhaWxzIHRvIGNvbXBpbGUgdW5sZXNzIFVTRV9OVExNMlNFU1NJT04gd2FzCiAgZGVmaW5lZC4gIExpbmVzIDE5OCBhbmQgMTQwIG9mIG15IHBhdGNoIHdyYXBzIHRoYXQgY2xvc2luZyBicmFja2V0IGluIGFuCiAgI2lmZGVmIFVTRV9OVExNMlNFU1NJT04uCgogICMyCiAgSSBub3RpY2VkIHNldmVyYWwgcGlja3kgY29tcGlsZXIgd2FybmluZ3Mgd2hlbiBERUJVR19NRSBpcyBkZWZpbmVkLiAgSSd2ZQogIGZpeGVkIHRoZW0gd2l0aCBjYXN0aW5nLiAgQnkgdGhlIHdheSwgREVCVUdfTUUgd2FzIGEgaHVnZSBoZWxwIGluCiAgdW5kZXJzdGFuZGluZyB0aGlzIGNvZGUuCgogICMzCiAgSG9wZWZ1bGx5IHRoZSBsYXN0IG5vbi1BU0NJSSBjb252ZXJzaW9uIHBhdGNoIGZvciBsaWJjdXJsIGluIGEgd2hpbGUuICBJCiAgY2hhbmdlZCB0aGUgIk5UTE1TU1AiIGxpdGVyYWwgdG8gaGV4IHNpbmNlIHRoaXMgc2lnbmF0dXJlIG11c3QgYWx3YXlzIGJlIGluCiAgQVNDSUkuCgogIENvbnZlcnNpb24gY29kZSB3YXMgc3RyYXRlZ2ljYWxseSBhZGRlZCB3aGVyZSBuZWNlc3NhcnkuICBBbmQgdGhlCiAgQ3VybF9iYXNlNjRfZW5jb2RlIGNhbGxzIHdlcmUgY2hhbmdlZCBzbyB0aGUgYmluYXJ5ICJibG9icyIgaHR0cF9udGxtLmMKICBjcmVhdGVzIGFyZSBOT1QgdHJhbnNsYXRlZCBvbiBub24tQVNDSUkgcGxhdGZvcm1zLgoKRGFuIEYgKDIyIEphbnVhcnkgMjAwNykKLSBDb252ZXJ0ZWQgKG1vc3Qgb2YpIHRoZSB0ZXN0IGRhdGEgZmlsZXMgaW50byBnZW51aW5lIFhNTC4gIEEgaGFuZGZ1bCBzdGlsbAogIGFyZSBub3QsIGR1ZSBtYWlubHkgdG8gdGhlIGxhY2sgb2Ygc3VwcG9ydCBmb3IgWE1MIGNoYXJhY3RlciBlbnRpdGllcwogIChlLmcuICYgPT4gJmFtcDsgKS4gIFRoaXMgd2lsbCBtYWtlIGl0IGVhc2llciB0byB2YWxpZGF0ZSB0ZXN0IGZpbGVzIHVzaW5nCiAgdG9vbHMgbGlrZSB4bWxsaW50LCBhcyB3ZWxsIGFzIHRvIGVkaXQgYW5kIHZpZXcgdGhlbSB1c2luZyBYTUwgdG9vbHMuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNykKLSBBcm1lbCBBc3NlbGluIGltcHJvdmVkIGxpYmN1cmwgdG8gYmVoYXZlIGEgbG90IGJldHRlciB3aGVuIGFuIGVhc3kgaGFuZGxlCiAgZG9pbmcgYW4gRlRQIHRyYW5zZmVyIGlzIHJlbW92ZWQgZnJvbSBhIG11bHRpIGhhbmRsZSBiZWZvcmUgY29tcGxldGlvbi4gVGhlCiAgZml4IGFsc28gZml4ZWQgdGhlICJhbGl2ZSBjb3VudGVyIiB0byBiZSBjb3JyZWN0IG9uICJwcmVtYXR1cmUgcmVtb3ZhbCIgZm9yCiAgYWxsIHByb3RvY29scy4KCkRhbiBGICgxNiBKYW51YXJ5IDIwMDcpCi0gRml4ZWQgYSBzbWFsbCBtZW1vcnkgbGVhayBpbiB0ZnRwIHVwbG9hZHMgZGlzY292ZXJlZCBieSBjdXJsJ3MgbWVtb3J5IGxlYWsKICBkZXRlY3Rvci4gIEFsc28gY2hhbmdlZCB0ZnRwIGRvd25sb2FkcyB0byBVUkwtdW5lc2NhcGUgdGhlIGRvd25sb2FkZWQKICBmaWxlIG5hbWUuCgpEYW5pZWwgKDE0IEphbnVhcnkgMjAwNykKLSBEYXZpZCBNY0NyZWVkeSBwcm92aWRlZCBsaWJjdXJsIGNoYW5nZXMgZm9yIGRvaW5nIEhUVFAgY29tbXVuaWNhdGlvbiBvbgogIG5vbi1BU0NJSSBwbGF0Zm9ybXMuIEl0IGRvZXMgYWRkIHNvbWUgY29tcGxleGl0eSwgbW9zdCBub3RhYmx5IHdpdGggbW9yZQogICNpZmRlZnMsIGJ1dCBJIHdhbnQgdG8gc2VlIHRoaXMgc3VwcG9ydGVkIGFkZGVkIGFuZCBJIGNhbid0IHNlZSBob3cgd2UgY2FuCiAgYWRkIGl0IHdpdGhvdXQgdGhlIGV4dHJhIHN0dWZmIGFkZGVkLgoKLSBTZXR0aW5nIENVUkxPUFRfQ09PS0lFTElTVCB0byAiQUxMIiB3aGVuIG5vIGNvb2tpZXMgYXQgYWxsIHdhcyBwcmVzZW50LAogIGxpYmN1cmwgd291bGQgY3Jhc2ggd2hlbiB0cnlpbmcgdG8gcmVhZCBhIE5VTEwgcG9pbnRlci4KCkRhbmllbCAoMTIgSmFudWFyeSAyMDA3KQotIFRvYnkgUGV0ZXJzb24gZm91bmQgYSBuYXN0eSBidWcgdGhhdCBwcmV2ZW50ZWQgKGxpYiljdXJsIGZyb20gcHJvcGVybHkKICBkb3dubG9hZGluZyAobW9zdCkgdGhpbmdzIHRoYXQgd2VyZSBsYXJnZXIgdGhhbiA0R0Igb24gMzIgYml0IHN5c3RlbXMuICBNYXR0CiAgV2l0aGVyc3Bvb24gaGVscGVkIGFzIG5hcnJvdyBkb3duIHRoZSBwcm9ibGVtLgoKRGFuaWVsICg1IEphbnVhcnkgMjAwNykKLSBMaW51cyBOaWVsc2VuIEZlbHR6aW5nIGludHJvZHVjZWQgdGhlIC0tZnRwLXNzbC1jY2MgY29tbWFuZCBsaW5lIG9wdGlvbiB0bwogIGN1cmwgdGhhdCB1c2VzIHRoZSBuZXcgQ1VSTE9QVF9GVFBfU1NMX0NDQyBvcHRpb24gaW4gbGliY3VybC4gSWYgZW5hYmxlZCwgaXQKICB3aWxsIG1ha2UgbGliY3VybCBzaHV0ZG93biBTU0wvVExTIGFmdGVyIHRoZSBhdXRoZW50aWNhdGlvbiBpcyBkb25lIG9uIGEKICBGVFAtU1NMIG9wZXJhdGlvbi4KCkRhbmllbCAoNCBKYW51YXJ5IDIwMDcpCi0gRGF2aWQgTWNDcmVlZHkgbWFkZSBjaGFuZ2VzIHRvIGFsbG93IGJhc2U2NCBlbmNvZGluZy9kZWNvZGluZyB0byB3b3JrIG9uCiAgbm9uLUFTQ0lJIHBsYXRmb3Jtcy4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDcpCi0gTWF0dCBXaXRoZXJzcG9vbiBmaXhlZCB0aGUgZmxhdyB3aGljaCBtYWRlIGxpYmN1cmwgNy4xNi4wIGFsd2F5cyBzdG9yZQogIGRvd25sb2FkZWQgZGF0YSBpbiB0d28gYnVmZmVycywganVzdCB0byBiZSBhYmxlIHRvIGRlYWwgd2l0aCBhIHNwZWNpYWwgSFRUUAogIHBpcGVsaW5pbmcgY2FzZS4gVGhhdCBpcyBub3cgb25seSBhY3RpdmF0ZWQgZm9yIHBpcGVsaW5lZCB0cmFuc2ZlcnMuIEluCiAgTWF0dCdzIGNhc2UsIGl0IHNob3dlZCBhcyBhIGNvbnNpZGVyYWJsZSBwZXJmb3JtYW5jZSBkaWZmZXJlbmNlLAoKRGFuaWVsICgyIEphbnVhcnkgMjAwNykKLSBWaWN0b3IgU25lemhrbyBoZWxwZWQgdXMgZml4IGJ1ZyByZXBvcnQgIzE2MDM3MTIKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwMzcxMikgKGtub3duIGJ1ZyAjMzYpIC0tbGltaXQtcmF0ZQogIChDVVJMT1BUX01BWF9TRU5EX1NQRUVEX0xBUkdFIGFuZCBDVVJMT1BUX01BWF9SRUNWX1NQRUVEX0xBUkdFKSBhcmUgYnJva2VuCiAgb24gV2luZG93cyAoc2luY2UgNy4xNi4wLCBidXQgdGhhdCdzIHdoZW4gdGhleSB3ZXJlIGludHJvZHVjZWQgYXMgcHJldmlvdXMKICB0byB0aGF0IHRoZSBsaW1pdGluZyBsb2dpYyB3YXMgbWFkZSBpbiB0aGUgYXBwbGljYXRpb24gb25seSBhbmQgbm90IGluIHRoZQogIGxpYnJhcnkpLiBJdCB3YXMgYWN0dWFsbHkgYWxzbyBicm9rZW4gb24gc2VsZWN0KCktYmFzZWQgc3lzdGVtcyAoYXMgYXBwb3NlZAogIHRvIHBvbGwoKSkgYnV0IHdlIGhhdmVuJ3QgaGFkIGFueSBzdWNoIHJlcG9ydHMuIFdlIG5vdyB1c2Ugc2VsZWN0KCksIFNsZWVwKCkKICBvciBkZWxheSgpIHByb3Blcmx5IHRvIHNsZWVwIGEgd2hpbGUgd2l0aG91dCB3YWl0aW5nIGZvciBhbnl0aGluZyBpbnB1dCBvcgogIG91dHB1dCB3aGVuIHRoZSByYXRlIGxpbWl0aW5nIGlzIGFjdGl2YXRlZCB3aXRoIHRoZSBlYXN5IGludGVyZmFjZS4KCi0gTW9kaWZpZWQgbGliY3VybC5wYy5pbiB0byB1c2UgTGlicy5wcml2YXRlIGZvciB0aGUgbGlicyBsaWJjdXJsIGl0c2VsZiBuZWVkcwogIHRvIGdldCBidWlsdCBzdGF0aWMuIEl0IGhhcyBiZWVuIG1lbnRpb25lZCBiZWZvcmUgYW5kIHdhcyBhZ2FpbiBicm91Z2h0IHRvCiAgb3VyIGF0dGVudGlvbiBieSBOYXRoYW5hZWwgTmVyb2RlIHdobyBmaWxlZCBkZWJpYW4gYnVnIHJlcG9ydCAjNDA1MjI2CiAgKGh0dHA6Ly9idWdzLmRlYmlhbi5vcmcvY2dpLWJpbi9idWdyZXBvcnQuY2dpP2J1Zz00MDUyMjYpLgoKRGFuaWVsICgyOSBEZWNlbWJlciAyMDA2KQotIE1ha2UgY3VybF9lYXN5X2R1cGhhbmRsZSgpIHNldCB0aGUgbWFnaWMgbnVtYmVyIGluIHRoZSBuZXcgaGFuZGxlLgoKRGFuaWVsICgyMiBEZWNlbWJlciAyMDA2KQotIFJvYmVydCBGb3JlbWFuIHByb3ZpZGVkIGEgcHJpbWUgZXhhbXBsZSBzbmlwcGV0IHNob3dpbmcgaG93IGxpYmN1cmwgd291bGQKICBnZXQgY29uZnVzZWQgYW5kIG5vdCBhY2tub3dsZWRnZSB0aGUgJ25vX3Byb3h5JyB2YXJpYWJsZSBwcm9wZXJseSBvbmNlIGl0CiAgaGFkIHVzZWQgdGhlIHByb3h5IGFuZCB5b3UgcmUtdXNlZCB0aGUgc2FtZSBlYXN5IGhhbmRsZS4gSSBtYWRlIHN1cmUgdGhlCiAgcHJveHkgbmFtZSBpcyBwcm9wZXJseSBzdG9yZWQgaW4gdGhlIGNvbm5lY3Qgc3RydWN0IHJhdGhlciB0aGFuIHRoZQogIHNlc3Npb25oYW5kbGUvZWFzeSBzdHJ1Y3QuCgotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIGEgYmFkIGNhbGwgdG8gZ2V0c29ja25hbWUoKSB0aGF0IHdyb25nbHkgdXNlZCBhIHNpemVfdAogIHZhcmlhYmxlIHRvIHBvaW50IHRvIHdoZW4gaXQgc2hvdWxkIGJlIGEgc29ja2xlbl90LgoKLSBXaGVuIHNldHRpbmcgYSBwcm94eSB3aXRoIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgKGZvciBleGFtcGxlKSBydW5uaW5nCiAgJ2N1cmwgW1VSTF0nIHdpdGggYSBVUkwgd2l0aG91dCBhIHByb3RvY29sIHByZWZpeCwgY3VybCB3b3VsZCBub3Qgc2VuZCBhCiAgY29ycmVjdCByZXF1ZXN0IGFzIGl0IGZhaWxlZCB0byBhZGQgdGhlIHByb3RvY29sIHByZWZpeC4KCkRhbmllbCAoMjEgRGVjZW1iZXIgMjAwNikKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIHJlcG9ydGVkIGJ1ZyAjMTYxODM1OQogIChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNjE4MzU5KSBhbmQgc3Vic2VxdWVudGx5IHByb3ZpZGVkIGEKICBwYXRjaCBmb3IgaXQ6IHdoZW4gZG93bmxvYWRpbmcgMiB6ZXJvIGJ5dGUgZmlsZXMgaW4gYSByb3csIGN1cmwgNy4xNi4wCiAgZW50ZXJzIGFuIGluZmluaXRlIGxvb3AsIHdoaWxlIGN1cmwgNy4xNi4xLTIwMDYxMjE4IGRvZXMgb25lIGFkZGl0aW9uYWwKICB1bm5lY2Vzc2FyeSByZXF1ZXN0LgoKICBGaXg6IER1cmluZyB0aGUgIk1ham9yIG92ZXJoYXVsIGludHJvZHVjaW5nIGh0dHAgcGlwZWxpbmluZyBzdXBwb3J0IGFuZAogIHNoYXJlZCBjb25uZWN0aW9uIGNhY2hlIHdpdGhpbiB0aGUgbXVsdGkgaGFuZGxlLiIgY2hhbmdlLCBoZWFkZXJieXRlY291bnQKICB3YXMgbW92ZWQgdG8gbGl2ZSBpbiB0aGUgQ3VybF90cmFuc2Zlcl9rZWVwZXIgc3RydWN0dXJlLiBCdXQgdGhhdCBzdHJ1Y3R1cmUKICBpcyByZXNldCBpbiB0aGUgVHJhbnNmZXIgbWV0aG9kLCBsb3NpbmcgdGhlIGluZm9ybWF0aW9uIHRoYXQgd2UgaGFkIGFib3V0CiAgdGhlIGhlYWRlciBzaXplLiBUaGlzIHBhdGNoIG1vdmVzIGl0IGJhY2sgdG8gdGhlIGNvbm5lY3RkYXRhIHN0cnVjdC4KCkRhbmllbCAoMTYgRGVjZW1iZXIgMjAwNikKLSBCcmVuZGFuIEp1cmQgcHJvdmlkZWQgYSBmaXggdGhhdCBub3cgcHJldmVudHMgbGliY3VybCBmcm9tIGdldHRpbmcgYSBTSUdQSVBFCiAgZHVyaW5nIGNlcnRhaW4gY29uZGl0aW9ucyB3aGVuIEdudVRMUyBpcyB1c2VkLgoKRGFuaWVsICgxMSBEZWNlbWJlciAyMDA2KQotIEFsZXhleSBTaW1hayBmb3VuZCBvdXQgdGhhdCB3aGVuIGRvaW5nIEZUUCB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UgYW5kCiAgc29tZXRoaW5nIHdlbnQgd3JvbmcgbGlrZSBpdCBnb3QgYSBiYWQgcmVzcG9uc2UgY29kZSBiYWNrIGZyb20gdGhlIHNlcnZlciwKICBsaWJjdXJsIHdvdWxkIGxlYWsgbWVtb3J5LiBBZGRlZCB0ZXN0IGNhc2UgNTM4IHRvIHZlcmlmeSB0aGUgZml4LgoKICBJIGFsc28gbm90ZWQgdGhhdCB0aGUgY29ubmVjdGlvbiB3b3VsZCBnZXQgY2FjaGVkIGluIHRoYXQgY2FzZSwgd2hpY2gKICBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2luY2UgaXQgY2Fubm90IGJlIHJlLXVzZSB3aGVuIHRoZSBhdXRoZW50aWNhdGlvbiBoYXMKICBmYWlsZWQuIEkgZml4ZWQgdGhhdCBpc3N1ZSB0b28gYXQgdGhlIHNhbWUgdGltZSwgYW5kIGFsc28gdGhhdCB0aGUgcGF0aAogIHdvdWxkIGJlICJyZW1lbWJlcmVkIiBpbiB2YWluIGZvciBjYXNlcyB3aGVyZSB0aGUgY29ubmVjdGlvbiB3YXMgYWJvdXQgdG8KICBnZXQgY2xvc2VkLgoKRGFuaWVsICg2IERlY2VtYmVyIDIwMDYpCi0gU2ViYXN0aWVuIFdpbGxlbWlqbnMgcmVwb3J0ZWQgYnVnICMxNjAzNzEyCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MDM3MTIpIHdoaWNoIGlzIGFib3V0IGNvbm5lY3Rpb25zCiAgZ2V0dGluZyBjdXQgb2ZmIHByZW1hdHVyZWx5IHdoZW4gLS1saW1pdC1yYXRlIGlzIHVzZWQuIFdoaWxlIEkgZm91bmQgbm8gc3VjaAogIHByb2JsZW1zIGluIG15IHRlc3RzIG5vciBpbiBteSByZWFkaW5nIG9mIHRoZSBjb2RlLCBJIGZvdW5kIHRoYXQgdGhlCiAgLS1saW1pdC1yYXRlIGNvZGUgd2FzIHNldmVybHkgZmxhd2VkIChzaW5jZSBpdCB3YXMgbW92ZWQgaW50byB0aGUgbGliLCBzaW5jZQogIDcuMTUuNSkgd2hlbiB1c2VkIHdpdGggdGhlIGVhc3kgaW50ZXJmYWNlIGFuZCBpdCBkaWRuJ3Qgd29yayBhcyBkb2N1bWVudGVkCiAgc28gSSByZXdvcmtlZCBpdCBzb21ld2hhdCBhbmQgbm93IGl0IHdvcmtzIGZvciBteSB0ZXN0cy4KCkRhbmllbCAoNSBEZWNlbWJlciAyMDA2KQotIFN0ZWZhbiBLcmF1c2UgcG9pbnRlZCBvdXQgYSBjb21waWxlciB3YXJuaW5nIHdpdGggYSBwaWNreSBNU0NWIGNvbXBpbGVyIHdoZW4KICBwYXNzaW5nIGEgY3VybF9vZmZfdCBhcmd1bWVudCB0byB0aGUgQ3VybF9yZWFkX3Jld2luZCgpIGZ1bmN0aW9uIHdoaWNoIHRha2VzCiAgYW4gc2l6ZV90IGFyZ3VtZW50LiBDdXJsX3JlYWRfcmV3aW5kKCkgYWxzbyBoYWQgZGVidWcgY29kZSBsZWZ0IGluIGl0IGFuZCBpdAogIHdhcyBwdXQgaW4gYSBkaWZmZXJlbnQgc291cmNlIGZpbGUgd2l0aCBubyBnb29kIHJlYXNvbiB3aGVuIG9ubHkgdXNlZCBmcm9tCiAgb25lIHNpbmdsZSBzcG90LgoKLSBTaCBEaWFvIHJlcG9ydGVkIHRoYXQgQ1VSTE9QVF9DTE9TRVBPTElDWSBkb2Vzbid0IHdvcmssIGFuZCBpbmRlZWQsIHRoZXJlIGlzCiAgbm8gY29kZSBwcmVzZW50IGluIHRoZSBsaWJyYXJ5IHRoYXQgcmVjZWl2ZXMgdGhlIG9wdGlvbi4gU2luY2UgaXQgd2FzIG5vdAogIHBvc3NpYmxlIHRvIHVzZSwgd2Uga25vdyB0aGF0IG5vIGN1cnJlbnQgdXNlcnMgZXhpc3QgYW5kIHRodXMgd2Ugc2ltcGx5CiAgcmVtb3ZlZCBpdCBmcm9tIHRoZSBkb2NzIGFuZCBtYWRlIHRoZSBjb2RlIGFsd2F5cyB1c2UgdGhlIGRlZmF1bHQgcGF0aCBvZgogIHRoZSBjb2RlLgoKLSBKYXJlZCBMdW5kZWxsIGZpbGVkIGJ1ZyByZXBvcnQgIzE2MDQ5NTYKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTYwNDk1Nikgd2hpY2ggaWRlbnRpZmllZCBzZXR0aW5nCiAgQ1VSTE9QVF9NQVhDT05ORUNUUyB0byB6ZXJvIGNhdXNlZCBsaWJjdXJsIHRvIFNJR1NFR1YuIFN0YXJ0aW5nIG5vdywgbGliY3VybAogIHdpbGwgYWx3YXlzIGludGVybmFsbHkgdXNlIG5vIGxlc3MgdGhhbiAxIGVudHJ5IGluIHRoZSBjb25uZWN0aW9uIGNhY2hlLgoKLSBTaCBEaWFvIHJlcG9ydGVkIHRoYXQgQ1VSTE9QVF9GT1JCSURfUkVVU0Ugbm8gd29ya3MsIGFuZCBpbmRlZWQgaXQgYnJva2UgaW4KICB0aGUgNy4xNi4wIHJlbGVhc2UuCgotIE1hcnRpbiBTa2lubmVyIGJyb3VnaHQgYmFjayBidWcgcmVwb3J0ICMxMjMwMTE4IHRvIGhhdW50IHVzIG9uY2UgYWdhaW4uCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTEyMzAxMTgpIGN1cmxfZ2V0ZGF0ZSgpIGRpZCBub3Qgd29yawogIHByb3Blcmx5IGZvciBhbGwgaW5wdXQgZGF0ZXMgb24gV2luZG93cy4gSXQgd2FzIG1vc3RseSBzZWVuIG9uIHNvbWUgVFogdGltZQogIHpvbmVzIHVzaW5nIERTVC4gTHVja2lseSwgTWFydGluIGFsc28gcHJvdmlkZWQgYSBmaXguCgotIEFsZXhleSBTaW1hayBmaWxlZCBidWcgcmVwb3J0ICMxNjAwNDQ3CiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE2MDA0NDcpIGluIHdoaWNoIGhlIG5vdGVkIHRoYXQgYWN0aXZlCiAgRlRQIGNvbm5lY3Rpb25zIGRvbid0IHdvcmsgd2l0aCB0aGUgbXVsdGkgaW50ZXJmYWNlLiBUaGUgcHJvYmxlbSBpcyBoZXJlCiAgdGhhdCB0aGUgbXVsdGkgaW50ZXJmYWNlIHN0YXRlIG1hY2hpbmUgaGFzIGEgc3RhdGUgZHVyaW5nIHdoaWNoIGl0IGNhbiB3YWl0CiAgZm9yIHRoZSBkYXRhIGNvbm5lY3Rpb24gdG8gY29ubmVjdCwgYnV0IHRoZSBhY3RpdmUgY29ubmVjdGlvbiBpcyBub3QgZG9uZSBpbgogIHRoZSBzYW1lIHN0ZXAgaW4gdGhlIHNlcXVlbmNlIGFzIHRoZSBwYXNzaXZlIG9uZSBpcyBzbyBpdCBkb2Vzbid0IHF1aXRlIHdvcmsKICBmb3IgYWN0aXZlLiBUaGUgYWN0aXZlIEZUUCBjb2RlIHN0aWxsIHVzZSBhIGJsb2NraW5nIGZ1bmN0aW9uIHRvIGFsbG93IHRoZQogIHJlbW90ZSBzZXJ2ZXIgdG8gY29ubmVjdC4KCiAgVGhlIGZpeCAod29yay1hcm91bmQgaXMgYSBiZXR0ZXIgd29yZCkgZm9yIHRoaXMgcHJvYmxlbSBpcyB0byBzZXQgdGhlCiAgYm9vbGVhbiBwcmVtYXR1cmVseSB0aGF0IHRoZSBkYXRhIGNvbm5lY3Rpb24gaXMgY29tcGxldGVkLCBzbyB0aGF0IHRoZSAid2FpdAogIGZvciBjb25uZWN0IiBwaGFzZSBlbmRzIGF0IG9uY2UuCgogIFRoZSBwcm9wZXIgZml4LCBsZWZ0IGZvciB0aGUgZnV0dXJlLCBpcyBvZiBjb3Vyc2UgdG8gbWFrZSB0aGUgYWN0aXZlIEZUUAogIGNhc2UgdG8gYWN0IGluIGEgbm9uLWJsb2NraW5nIHdheSB0b28uCgotIE1hdHQgV2l0aGVyc3Bvb24gZml4ZWQgYSBwcm9ibGVtIGNhc2Ugd2hlbiB0aGUgQ1BVIGxvYWQgd2VudCB0byAxMDAlIHdoZW4gYQogIEhUVFAgdXBsb2FkIHdhcyBkaXNjb25uZWN0ZWQ6CgogICJXaGF0IGFwcGVhcnMgdG8gYmUgaGFwcGVuaW5nIGlzIHRoYXQgbXkgc3lzdGVtIChMaW51eCAyLjYuMTcgYW5kIDIuNi4xMykgaXMKICBzZXR0aW5nICpvbmx5KiBQT0xMSFVQIG9uIHBvbGwoKSB3aGVuIHRoZSBjb25kaXRpb25zIGluIG15IHByZXZpb3VzIG1haWwKICBvY2N1ci4gQXMgeW91IGNhbiBzZWUsIHNlbGVjdC5jOkN1cmxfc2VsZWN0KCkgZG9lcyBub3QgY2hlY2sgZm9yIFBPTExIVVAuIFNvCiAgYmFzaWNhbGx5IHdoYXQgd2FzIGhhcHBlbmluZywgaXMgcG9sbCgpIHdhcyByZXR1cm5pbmcgaW1tZWRpYXRlbHkgKHdpdGgKICBQT0xMSFVQIHNldCksIGJ1dCB3aGVuIEN1cmxfc2VsZWN0KCkgbG9va2VkIGF0IHRoZSBiaXRzLCBuZWl0aGVyIFBPTExFUlIgb3IKICBQT0xMT1VUIHdhcyBzZXQuIFRoaXMgc3RpbGwgY2F1c2VkIEN1cmxfcmVhZHdyaXRlKCkgdG8gYmUgY2FsbGVkLCB3aGljaAogIHF1aWNrbHkgcmV0dXJuZWQuIFRoZW4gdGhlIHRyYW5zZmVyKCkgbG9vcCBrZXB0IGNvbnRpbnVpbmcgYXQgZnVsbCBzcGVlZAogIGZvcmV2ZXIuIgoKRGFuaWVsICgxIERlY2VtYmVyIDIwMDYpCi0gVG9vbiBWZXJ3YWVzdCByZXBvcnRlZCB0aGF0IHRoZXJlIGFyZSBzZXJ2ZXJzIHRoYXQgc2VuZCB0aGUgQ29udGVudC1SYW5nZToKICBoZWFkZXIgaW4gYSB0aGlyZCwgbm90IHN1cHBwb3J0ZWQgYnkgbGliY3VybCwgZm9ybWF0IGFuZCB3ZSBhZ3JlZWQgdGhhdCB3ZQogIGNvdWxkIG1ha2UgdGhlIHBhcnNlciBtb3JlIGZvcmdpdmluZyB0byBhY2NlcHQgYWxsIHRoZSB0aHJlZSBmb3VuZAogIHZhcmlhdGlvbnMuCgpEYW5pZWwgKDI1IE5vdmVtYmVyIDIwMDYpCi0gVmVua2F0IEFrZWxsYSBmb3VuZCBvdXQgdGhhdCBsaWJjdXJsIGRpZCBub3QgbGlrZSBIVFRQIHJlc3BvbnNlcyB0aGF0IHNpbXBseQogIHJlc3BvbmRlZCB3aXRoIGEgc2luZ2xlIHN0YXR1cyBsaW5lIGFuZCBubyBoZWFkZXJzIG5vciBib2R5LiBTdGFydGluZyBub3csIGEKICBIVFRQIHJlc3BvbnNlIG9uIGEgcGVyc2lzdGVudCBjb25uZWN0aW9uIChpLmUgbm90IHNldCB0byBiZSBjbG9zZWQgYWZ0ZXIgdGhlCiAgcmVzcG9uc2UgaGFzIGJlZW4gdGFrZW4gY2FyZSBvZikgbXVzdCBoYXZlIENvbnRlbnQtTGVuZ3RoIG9yIGNodW5rZWQKICBlbmNvZGluZyBzZXQsIG9yIGxpYmN1cmwgd2lsbCBzaW1wbHkgYXNzdW1lIHRoYXQgdGhlcmUgaXMgbm8gYm9keS4KCiAgVG8gbXkgaG9ycm9yIEkgbGVhcm5lZCB0aGF0IHdlIGhhZCBubyBsZXNzIHRoYW4gNTcoISkgdGVzdCBjYXNlcyB0aGF0IGRpZCBiYWQKICBIVFRQIHJlc3BvbnNlcyBsaWtlIHRoaXMsIGFuZCBldmVuIHRoZSB0ZXN0IGh0dHAgc2VydmVyIChzd3MpIHJlc3BvbmRlZCBiYWRseQogIHdoZW4gcXVlcmllZCBieSB0aGUgdGVzdCBzeXN0ZW0gaWYgaXQgaXMgdGhlIHRlc3Qgc3lzdGVtLiBTbyBhbHRob3VnaCB0aGUKICBhY3R1YWwgZml4IGZvciB0aGUgcHJvYmxlbSB3YXMgdGlueSwgZ29pbmcgdGhyb3VnaCBhbGwgdGhlIG5ld2x5IGZhaWxpbmcgdGVzdAogIGNhc2VzIGdvdCByZWFsbHkgcGFpbmZ1bCBhbmQgYm9yaW5nLgoKRGFuaWVsICgyNCBOb3ZlbWJlciAyMDA2KQotIEphbWVzIEhvdXNsZXkgZGlkIGxvdHMgb2Ygd29yayBhbmQgaW50cm9kdWNlZCBTRlRQIGRvd25sb2Fkcy4KCkRhbmllbCAoMTMgTm92ZW1iZXIgMjAwNikKLSBSb24gaW4gYnVnICMxNTk1MzQ4IChodHRwOi8vY3VybC5oYXh4LnNlL2J1Zy92aWV3LmNnaT9pZD0xNTk1MzQ4KSBwb2ludGVkCiAgb3V0IGEgc3RhY2sgb3ZlcndyaXRlIChhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZml4KSBvbiA2NGJpdCBXaW5kb3dzIHdoZW4KICBkZWFsaW5nIHdpdGggSFRUUCBjaHVua2VkIGVuY29kaW5nLgoKRGFuaWVsICg5IE5vdmVtYmVyIDIwMDYpCi0gTmlyIFNvZmZlciB1cGRhdGVkIGxpYmN1cmwuZnJhbWV3b3JrLm1ha2U6CiAgbyBmaXggc3ltbGlua3MsIHNob3VsZCBsaW5rIHRvIFZlcnNpb25zLCBub3QgdG8gLi9WZXJzaW9ucwogIG8gaW5kZW50YXRpb24gaW1wcm92bWVudHMKCi0gRG1pdHJpeSBTZXJnZXlldiBmb3VuZCBhIFNJR1NFR1Ygd2l0aCBoaXMgdGVzdDA0LmMgZXhhbXBsZSBwb3N0ZWQgb24gNyBOb3YKICAyMDA2LiBJdCB0dXJuZWQgb3V0IHdlIHdyb25nbHkgYXNzdW1lZCB0aGF0IHRoZSBjb25uZWN0aW9uIGNhY2hlIHdhcyBwcmVzZW50CiAgd2hlbiB0ZWFyaW5nIGRvd24gYSBjb25uZWN0aW9uLgoKLSBDaXByaWFuIEJhZGVzY3UgZm91bmQgYSBTSUdTRUdWIHdoZW4gZG9pbmcgbXVsdGlwbGUgVEZUUCB0cmFuc2ZlcnMgdXNpbmcgdGhlCiAgbXVsdGkgaW50ZXJmYWNlLCBidXQgSSBjb3VsZCBhbHNvIHJlcGVhdCBpdCBkb2luZyBtdWx0aXBsZSBzZXF1ZW50aWFsIG9uZXMKICB3aXRoIHRoZSBlYXN5IGludGVyZmFjZS4gVXNpbmcgQ2lwcmlhbidzIHRlc3QgY2FzZSwgSSBjb3VsZCBmaXggaXQuCgpEYW5pZWwgKDggTm92ZW1iZXIgMjAwNikKLSBCcmFkZm9yZCBCcnVjZSByZXBvcnRlZCB0aGF0IHdoZW4gc2V0dGluZyBDVVJMT1BUX0RFQlVHRlVOQ1RJT04gd2l0aG91dAogIENVUkxPUFRfVkVSQk9TRSBzZXQgdG8gbm9uLXplcm8sIHlvdSBzdGlsbCBnb3QgYSBmZXcgZGVidWcgbWVzc2FnZXMgZnJvbSB0aGUKICBTU0wgaGFuZHNoYWtlLiBUaGlzIGlzIG5vdyBzdG9wcGVkLgoKRGFuaWVsICg3IE5vdmVtYmVyIDIwMDYpCi0gT2xhZiBmaXhlZCBhIGxlZnRvdmVyIHByb2JsZW0gd2l0aCB0aGUgQ09OTkVDVCBmaXggb2YgaGlzIHRoYXQgd291bGQgbGVhdmUgYQogIHdyb25nIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGVycm9yIG1lc3NhZ2UgYnVmZmVyLgoKRGFuaWVsICgzIE5vdmVtYmVyIDIwMDYpCi0gT2xhZiBTdHVlYmVuIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBJIGVkaXRlZCBzbGlnaHRseS4gSXQgZml4ZXMgdGhlIG5vdG9yaW91cwogIEtOT1dOX0JVR1MgIzI1LCB3aGljaCBoYXBwZW5zIHdoZW4gYSBwcm94eSBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gd2hlbgogIGxpYmN1cmwgaGFzIHNlbnQgQ09OTkVDVCwgYXMgcGFydCBvZiBhbiBhdXRoZW50aWNhdGlvbiBuZWdvdGlhdGlvbi4gU3RhcnRpbmcKICBub3csIGxpYmN1cmwgd2lsbCByZS1jb25uZWN0IGFjY29yZGluZ2x5IGFuZCBjb250aW51ZSB0aGUgYXV0aGVudGljYXRpb24gYXMKICBpdCBzaG91bGQuCgpEYW5pZWwgKDIgTm92ZW1iZXIgMjAwNikKLSBKYW1lcyBIb3VzbGV5IGJyb3VnaHQgc3VwcG9ydCBmb3IgU0NQIHRyYW5zZmVycywgYmFzZWQgb24gdGhlIGxpYnNzaDIgbGlicmFyeQogIGZvciB0aGUgYWN0dWFsIG5ldHdvcmsgcHJvdG9jb2wgc3R1ZmYuCgogIEFkZGVkIHRoZXNlIG5ldyBjdXJsX2Vhc3lfc2V0b3B0KCkgb3B0aW9uczoKCiAgICBDVVJMT1BUX1NTSF9BVVRIX1RZUEVTCiAgICBDVVJMT1BUX1NTSF9QVUJMSUNfS0VZRklMRQogICAgQ1VSTE9QVF9TU0hfUFJJVkFURV9LRVlGSUxFCgpWZXJzaW9uIDcuMTYuMCAoMzAgT2N0b2JlciAyMDA2KQoKRGFuaWVsICgyNSBPY3RvYmVyIDIwMDYpCi0gRml4ZWQgQ1VSTE9QVF9GQUlMT05FUlJPUiB0byByZXR1cm4gQ1VSTEVfSFRUUF9SRVRVUk5FRF9FUlJPUiBldmVuIGZvciB0aGUKICBjYXNlIHdoZW4gNDAxIG9yIDQwNyBhcmUgcmV0dXJuZWQsICpJRiogbm8gYXV0aCBjcmVkZW50aWFscyBoYXZlIGJlZW4gZ2l2ZW4uCiAgVGhlIENVUkxPUFRfRkFJTE9ORVJST1Igb3B0aW9uIGlzIG5vdCBwb3NzaWJsZSB0byBtYWtlIGZvb2wtcHJvb2YgZm9yIDQwMQogIGFuZCA0MDcgY2FzZXMgd2hlbiBhdXRoIGNyZWRlbnRpYWxzIGlzIGdpdmVuLCBidXQgd2UndmUgbm93IGNvdmVyZWQgdGhpcwogIHNvbWV3aGF0IG1vcmUuCgogIFlvdSBtaWdodCBnZXQgc29tZSBhbW91bnRzIG9mIGhlYWRlcnMgdHJhbnNmZXJyZWQgYmVmb3JlIHRoaXMgc2l0dWF0aW9uIGlzCiAgZGV0ZWN0ZWQsIGxpa2UgZm9yIHdoZW4gYSAiMTAwLWNvbnRpbnVlIiBpcyByZWNlaXZlZCBhcyBhIHJlc3BvbnNlIHRvIGEKICBQT1NUL1BVVCBhbmQgYSA0MDEgb3IgNDA3IGlzIHJlY2VpdmVkIGltbWVkaWF0ZWx5IGFmdGVyd2FyZHMuCgogIEFkZGVkIHRlc3QgMjgxIHRvIHZlcmlmeSB0aGlzIGNoYW5nZS4KCkRhbmllbCAoMjMgT2N0b2JlciAyMDA2KQotIFJhdmkgUHJhdGFwIHByb3ZpZGVkIGEgbWFqb3IgdXBkYXRlIHdpdGggcGlwZWxpbmluZyBmaXhlcy4gV2UgYWxzbyBubyBsb25nZXIKICByZS11c2UgY29ubmVjdGlvbnMgKGZvciBwaXBlbGluaW5nKSBiZWZvcmUgdGhlIG5hbWUgcmVzb2x2aW5nIGlzIGRvbmUuCgpEYW5pZWwgKDIxIE9jdG9iZXIgMjAwNikKLSBOaXIgU29mZmVyIG1hZGUgdGhlIHRlc3RzL2xpYnRlc3QvTWFrZWZpbGUuYW0gdXNlIGEgcHJvcGVyIHZhcmlhYmxlIGZvciBhbGwKICB0aGUgc2luZ2xlIHRlc3QgYXBwbGljYXRpb25zJyBsaW5rIGFuZCBkZXBlbmRlbmNlcywgc28gdGhhdCB5b3UgZWFzaWVyIGNhbgogIG92ZXJyaWRlIHRob3NlIGZyb20gdGhlIGNvbW1hbmQgbGluZSB3aGVuIHVzaW5nIG1ha2UuCgotIEFybWVsIEFzc2VsaW4gc2VwYXJhdGVkIENBIGNlcnQgdmVyaWZpY2F0aW9uIHByb2JsZW1zIGZyb20gcHJvYmxlbXMgd2l0aAogIHJlYWRpbmcgdGhlIChsb2NhbCkgQ0EgY2VydCBmaWxlIHRvIGxldCB1c2VycyBlYXNpZXIgcGlucG9pbnQgdGhlIGFjdHVhbAogIHByb2JsZW0uIENVUkxFX1NTTF9DQUNFUlRfQkFERklMRSAoNzcpIGlzIHRoZSBuZXcgbGliY3VybCBlcnJvciBjb2RlLgoKRGFuaWVsICgxOCBPY3RvYmVyIDIwMDYpCi0gUmVtb3ZlZCB0aGUgInByb3RvY29sLWd1ZXNzaW5nIiBmb3IgVVJMcyB3aXRoIGhvc3QgbmFtZXMgc3RhcnRpbmcgd2l0aCBGVFBTCiAgb3IgVEVMTkVUIHNpbmNlIHRoZXkgYXJlIHByYWN0aWNhbGx5IG5vbi1leGlzdGFudC4gVGhpcyBsZWF2ZXMgdXMgd2l0aCBvbmx5CiAgdGhyZWUgZGlmZmVyZW50IHByZWZpeGVzIHRoYXQgd291bGQgYXNzdW1lIHRoZSBwcm90b2NvbCBpcyBhbnl0aGluZyBidXQKICBIVFRQLCBhbmQgdGhleSBhcmUgaG9zdCBuYW1lcyBzdGFydGluZyB3aXRoICJmdHAuIiwgImRpY3QuIiBvciAibGRhcC4iLgoKRGFuaWVsICgxNyBPY3RvYmVyIDIwMDYpCi0gQnVnIHJlcG9ydCAjMTU3OTE3MSBwb2ludGVkIG91dCBjb2RlIGZsYXdzIGRldGVjdGVkIHdpdGggInByZWZhc3QiLCBhbmQgdGhleQogIHdlcmUgMSAtIGEgdG9vIHNtYWxsIG1lbW9yeSBjbGVhciB3aXRoIG1lbXNldCgpIGluIHRoZSB0aHJlYWRlZCByZXNvbHZlciBhbmQKICAyIC0gYSByYW5nZSBvZiBwb3RlbnRpYWxseSBiYWQgdXNlcyBvZiB0aGUgY3R5cGUgZmFtaWx5IG9mIGlzKigpIGZ1bmN0aW9ucwogIHN1Y2ggYXMgaXNkaWdpdCgpLCBpc2FsbnVtKCksIGlzcHJpbnQoKSBhbmQgbW9yZS4gVGhlIGxhdHRlciBtYWRlIG1lIHN3aXRjaAogIHRvIHVzaW5nIG91ciBvd24gc2V0IG9mIHRoZXNlIGZ1bmN0aW9ucy9tYWNyb3MgdXNpbmcgdXBwZXJjYXNlIGxldHRlcnMsIGFuZAogIHdpdGggc29tZSBleHRyYSBzZXQgb2YgY3JhenkgdHlwZWNhc3RzIHRvIGF2b2lkIG1pc3Rha2luZ2x5IHBhc3NpbmcgaW4KICBuZWdhdGl2ZSBudW1iZXJzIHRvIHRoZSB1bmRlcmx5aW5nIGlzKigpIGZ1bmN0aW9ucy4KCi0gV2l0aCBKZWZmIFBvaGxtZXllcidzIGhlbHAsIEkgZml4ZWQgdGhlIGV4cGlyZSB0aW1lciB3aGVuIHVzaW5nCiAgY3VybF9tdWx0aV9zb2NrZXQoKSBkdXJpbmcgbmFtZSByZXNvbHZlcyB3aXRoIGMtYXJlcyBhbmQgdGhlIExPV19TUEVFRAogIG9wdGlvbnMgbm93IHdvcmsgZmluZSB3aXRoIGN1cmxfbXVsdGlfc29ja2V0KCkgYXMgd2VsbC4KCkRhbmllbCAoMTYgT2N0b2JlciAyMDA2KQotIEFkZGVkIGEgY2hlY2sgaW4gY29uZmlndXJlIHRoYXQgc2ltcGx5IHRyaWVzIHRvIHJ1biBhIHByb2dyYW0gKG5vdCB3aGVuCiAgY3Jvc3MtY29tcGlsaW5nKSBpbiBvcmRlciB0byBkZXRlY3QgcHJvYmxlbXMgd2l0aCBydW4tdGltZSBsaWJyYXJpZXMgdGhhdAogIG90aGVyd2lzZSB3b3VsZCBvY2N1ciB3aGVuIHRoZSBzaXplb2YgdGVzdHMgZm9yIGN1cmxfb2ZmX3Qgd291bGQgcnVuIGFuZAogIHRodXMgYmUgbXVjaCBtb3JlIGNvbmZ1c2luZyB0byB1c2Vycy4gVGhlIGNoZWNrIG9mIGNvdXJzZSBzaG91bGQgcnVuIGFmdGVyCiAgYWxsIGxpYi1jaGVja3MgYXJlIGRvbmUgYW5kIGJlZm9yZSBhbnkgb3RoZXIgdGVzdCBpcyB1c2VkIHRoYXQgd291bGQgcnVuIGFuCiAgZXhlY3V0YWJsZSBidWlsdCBmb3IgdGVzdGluZy1wdXJwb3Nlcy4KCkRhbiBGICgxMyBPY3RvYmVyIDIwMDYpCi0gVGhlIHRhZ2dpbmcgb2YgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIFBPU1QgYm9keSBkYXRhIHNlbnQKICB0byB0aGUgQ1VSTE9QVF9ERUJVR0ZVTkNUSU9OIGNhbGxiYWNrIGhhcyBiZWVuIGZpeGVkIChpdCB3YXMgZXJyb25lb3VzbHkKICBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBoZWFkZXIpLiAgQSBtZXNzYWdlIHdhcyBhbHNvIGFkZGVkIHRvIHRoZQogIGNvbW1hbmQgbGluZSB0b29sIHRvIHNob3cgd2hlbiBkYXRhIGlzIGJlaW5nIHNlbnQsIGVuYWJsZWQgd2hlbgogIC0tdmVyYm9zZSBpcyB1c2VkLgoKRGFuaWVsICgxMiBPY3RvYmVyIDIwMDYpCi0gU3RhcnRpbmcgbm93LCBhZGRpbmcgYW4gZWFzeSBoYW5kbGUgdG8gYSBtdWx0aSBzdGFjayB0aGF0IHdhcyBhbHJlYWR5IGFkZGVkCiAgdG8gYSBtdWx0aSBzdGFjayB3aWxsIGNhdXNlIENVUkxNX0JBRF9FQVNZX0hBTkRMRSB0byBnZXQgcmV0dXJuZWQuCgotIEplZmYgUG9obG1leWVyIGhhcyBiZWVuIHdvcmtpbmcgd2l0aCB0aGUgaGlwZXJmaWZvLmMgZXhhbXBsZSBzb3VyY2UgY29kZSwKICBhbmQgd2hpbGUgZG9pbmcgc28gaXQgYmVjYW1lIGFwcGFyZW50IHRoYXQgdGhlIGN1cnJlbnQgdGltZW91dCBzeXN0ZW0gZm9yCiAgdGhlIHNvY2tldCBBUEkgcmVhbGx5IHdhcyBhIGJpdCBhd2t3YXJkIHNpbmNlIGl0IGJlY29tZSBxdWl0ZSBzb21lIHdvcmsgdG8KICBiZSBzdXJlIHdlIGhhdmUgdGhlIGNvcnJlY3QgdGltZW91dCBzZXQuCgogIEplZmYgdGhlbiBwcm92aWRlZCB0aGUgbmV3IENVUkxNT1BUX1RJTUVSRlVOQ1RJT04gdGhhdCBpcyB5ZXQgYW5vdGhlcgogIGNhbGxiYWNrIHRoZSBhcHAgY2FuIHNldCB0byBnZXQgdG8ga25vdyB3aGVuIHRoZSBnZW5lcmFsIHRpbWVvdXQgdGltZQogIGNoYW5nZXMgYW5kIHRodXMgZm9yIGFuIGFwcGxpY2F0aW9uIGxpa2UgaGlwZXJmaWZvLmMgaXQgbWFrZXMgZXZlcnl0aGluZyBhCiAgbG90IGVhc2llciBhbmQgbmljZXIuIFRoZXJlJ3MgYSBDVVJMTU9QVF9USU1FUkRBVEEgb3B0aW9uIHRvbyBvZiBjb3Vyc2UgaW4KICBnb29kIG9sZCBsaWJjdXJsIHRyYWRpdGlvbi4KCiAgSmVmZiBoYXMgYWxzbyB1cGRhdGVkIHRoZSBoaXBlcmZpZm8uYyBleGFtcGxlIGNvZGUgdG8gdXNlIHRoaXMgbmV3cy4KCkRhbmllbCAoOSBPY3RvYmVyIDIwMDYpCi0gQm9nZGFuIE5pY3VsYSdzIHNlY29uZCB0ZXN0IGNhc2UgKHBvc3RlZCBTdW4sIDA4IE9jdCAyMDA2KSBjb252ZXJ0ZWQgdG8gdGVzdAogIGNhc2UgNTM1IGFuZCBpdCBub3cgcnVucyBmaW5lLiBBZ2FpbiBhIHByb2JsZW0gd2l0aCB0aGUgcGlwZWxpbmluZyBjb2RlIG5vdAogIHRha2luZyBhbGwgcG9zc2libGUgKGVycm9yKSBjb25kaXRpb25zIGludG8gYWNjb3VudC4KCkRhbmllbCAoNiBPY3RvYmVyIDIwMDYpCi0gQm9nZGFuIE5pY3VsYSdzIGhhbmdpbmcgdGVzdCBjYXNlIChwb3N0ZWQgV2VkLCAwNCBPY3QgMjAwNikgd2FzIGNvbnZlcnRlZCB0bwogIHRlc3QgY2FzZSA1MzMgYW5kIHRoZSB0ZXN0IG5vdyBydW5zIGZpbmUuCgpEYW5pZWwgKDQgT2N0b2JlciAyMDA2KQotIERtaXRyaXkgU2VyZ2V5ZXYgcHJvdmlkZWQgYW4gZXhhbXBsZSBzb3VyY2UgY29kZSB0aGF0IGNyYXNoZWQgQ1ZTIGxpYmN1cmwKICBidXQgdGhhdCB3b3JrZWQgbmljZWx5IGluIDcuMTUuNS4gSSBjb252ZXJ0ZWQgaXQgaW50byB0ZXN0IGNhc2UgNTMyIGFuZAogIGZpeGVkIHRoZSBwcm9ibGVtLgoKRGFuaWVsICgyOSBTZXB0ZW1iZXIgMjAwNikKLSBSZW1vdmVkIGEgZmV3IG90aGVyIG5vLWxvbmdlciBwcmVzZW50IG9wdGlvbnMgZnJvbSB0aGUgaGVhZGVyIGZpbGUuCgotIFN1cHBvcnQgZm9yIEZUUCB0aGlyZCBwYXJ0eSB0cmFuc2ZlcnMgd2FzIHJlbW92ZWQuIEhlcmUncyB3aHk6CgogIG8gVGhlIHJlY2VudCBtdWx0aSBpbnRlcmZhY2UgY2hhbmdlcyBicm9rZSBpdCBhbmQgdGhlIGRlc2lnbiBvZiB0aGUgM3JkIHBhcnR5CiAgICB0cmFuc2ZlcnMgbWFkZSBpdCB2ZXJ5IGhhcmQgdG8gZml4IHRoZSBwcm9ibGVtcwogIG8gSXQgd2FzIHN0aWxsIGJsb2NraW5nIGFuZCB0aHVzIG5hc3R5IGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgbyBJdCB3YXMgYSBsb3Qgb2YgZXh0cmEgY29kZSBmb3IgYSB2ZXJ5IHJhcmVseSB1c2VkIGZlYXR1cmUKICBvIEl0IGRpZG4ndCB1c2UgdGhlIHNhbWUgY29kZSBhcyBmb3IgInBsYWluIiBGVFAgdHJhbnNmZXJzLCBzbyBpdCBkaWRuJ3Qgd29yawogICAgZmluZSBmb3IgSVB2NiBhbmQgaXQgZGlkbid0IHByb3Blcmx5IHJlLXVzZSBjb25uZWN0aW9ucyBhbmQgbW9yZQogIG8gVGhlcmUncyBub2JvZHkgYXJvdW5kIHdobydzIHdpbGxpbmcgdG8gd29yayBvbiBhbmQgaW1wcm92ZSB0aGUgZXhpc3RpbmcKICAgIGNvZGUKCiAgVGhpcyBkb2VzIG5vdCBtZWFuIHRoYXQgdGhpcmQgcGFydHkgdHJhbnNmZXJzIGFyZSBiYW5uZWQgZm9yZXZlciwgb25seSB0aGF0CiAgdGhleSBuZWVkIHRvIGJlIGRvbmUgYmV0dGVyIGlmIHRoZXkgYXJlIHRvIGJlIHJlLWFkZGVkIGluIHRoZSBmdXR1cmUuCgogIFRoZSBDVVJMT1BUX1NPVVJDRV8qIG9wdGlvbnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgbGliIGFuZCBzbyBhcmUgdGhlIC0tM3AqCiAgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgdG9vbC4gRm9yIHRoaXMgcmVhc29uLCBJIGFsc28gYnVtcGVkIHRoZQogIHZlcnNpb24gaW5mbyBmb3IgdGhlIGxpYi4KCkRhbmllbCAoMjggU2VwdGVtYmVyIDIwMDYpCi0gUmVwb3J0ZWQgaW4gIzE1NjE0NzAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1NjE0NzApLCBsaWJjdXJsCiAgd291bGQgY3Jhc2ggaWYgYSBiYWQgZnVuY3Rpb24gc2VxdWVuY2Ugd2FzIHVzZWQgd2hlbiBzaHV0dGluZyBkb3duIGFmdGVyCiAgdXNpbmcgdGhlIG11bHRpIGludGVyZmFjZSAoaS5lIHVzaW5nIGVhc3lfY2xlYW51cCBhZnRlciBtdWx0aV9jbGVhbnVwKSBzbwogIHByZWNhdXRpb25zIGhhdmUgYmVlbiBhZGRlZCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBhbnkgbW9yZSAtIHRlc3QgY2FzZSA1MjkKICB3YXMgYWRkZWQgdG8gdmVyaWZ5LgoKRGFuaWVsICgyNyBTZXB0ZW1iZXIgMjAwNikKLSBUaGUgVVJMIGluIHRoZSBjb29raWUgamFyIGZpbGUgaXMgbm93IGNoYW5nZWQgc2luY2UgaXQgd2FzIGdpdmluZyBhIDQwNC4KICBSZXBvcnRlZCBieSBUaW1vdGh5IFN0b25lLiBUaGUgbmV3IFVSTCB3aWxsIHRha2UgdGhlIHZpc2l0b3IgdG8gYSBjdXJsIHdlYgogIHNpdGUgbWlycm9yIHdpdGggdGhlIGRvY3VtZW50LgoKRGFuaWVsICgyNCBTZXB0ZW1iZXIgMjAwNikKLSBCZXJuYXJkIExlYWsgZml4ZWQgY29uZmlndXJlIC0td2l0aC1nc3NhcGktbGlicy4KCi0gQ29yeSBOZWxzb24gbWFkZSBsaWJjdXJsIHVzZSB0aGUgV1NBUG9sbCgpIGZ1bmN0aW9uIGlmIGJ1aWx0IGZvciBXaW5kb3dzCiAgVmlzdGEgKF9XSU4zMl9XSU5OVCA+PSAweDA2MDApCgpEYW5pZWwgKDIzIFNlcHRlbWJlciAyMDA2KQotIE1pa2UgUHJvdHRzIGFkZGVkIC0tZnRwLXNzbC1jb250cm9sIHRvIG1ha2UgY3VybCB1c2UgRlRQLVNTTCwgYnV0IG9ubHkKICBlbmNyeXB0IHRoZSBjb250cm9sIGNvbm5lY3Rpb24gYW5kIHVzZSB0aGUgZGF0YSBjb25uZWN0aW9uICJwbGFpbiIuCgotIERtaXRyaXkgU2VyZ2V5ZXYgcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1hZGUgdGhlIFNPQ0tTWzQ1XSBjb2RlIHdvcmsgYmV0dGVyCiAgYXMgaXQgbm93IHdpbGwgcmVhZCB0aGUgZnVsbCBkYXRhIHNlbnQgZnJvbSBzZXJ2ZXJzLiBUaGUgU09DS1MtcmVsYXRlZCBjb2RlCiAgd2FzIGFsc28gbW92ZWQgdG8gdGhlIG5ldyBsaWIvc29ja3MuYyBzb3VyY2UgZmlsZS4KCkRhbmllbCAoMjEgU2VwdGVtYmVyIDIwMDYpCi0gQWRkZWQgdGVzdCBjYXNlIDUzMSBpbiBhbiBhdHRlbXB0IHRvIHJlcGVhdCBidWcgcmVwb3J0ICMxNTYxNDcwCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1NjE0NzApIHRoYXQgaXMgc2FpZCB0byBjcmFzaCB3aGVuIGFuCiAgRlRQIHVwbG9hZCBmYWlscyB3aXRoIHRoZSBtdWx0aSBpbnRlcmZhY2UuIEl0IGRpZCBub3QsIGJ1dCBJIG1hZGUgYSBmYWlsZWQKICB1cGxvYWQgc3RpbGwgYXNzdW1lIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gdG8gYmUgZmluZS4KCkRhbmllbCAoMjAgU2VwdGVtYmVyIDIwMDYpCi0gQXJtZWwgQXNzZWxpbiBmaXhlZCBwcm9ibGVtcyB3aGVuIHlvdSBnYXZlIGEgcHJveHkgVVJMIHdpdGggdXNlciBuYW1lIGFuZAogIGVtcHR5IHBhc3N3b3JkIG9yIG5vIHBhc3N3b3JkIGF0IGFsbC4gVGVzdCBjYXNlIDI3OCBhbmQgMjc5IHdlcmUgYWRkZWQgdG8KICB2ZXJpZnkuCgpEYW5pZWwgKDEyIFNlcHRlbWJlciAyMDA2KQotIEFkZGVkIGRvY3MvZXhhbXBsZXMvMTAtYXQtYS10aW1lLmMgYnkgTWljaGFlbCBXYWxsbmVyCgotIEFkZGVkIGRvY3MvZXhhbXBsZXMvaGlwZXJmaWZvLmMgYnkgSmVmZiBQb2hsbWV5ZXIKCkRhbmllbCAoMTEgU2VwdGVtYmVyIDIwMDYpCi0gRml4ZWQgbXkgYnJlYWthZ2UgZnJvbSBlYXJsaWVyIHRvZGF5IHNvIHRoYXQgZG9pbmcgY3VybF9lYXN5X2NsZWFudXAoKSBvbiBhCiAgaGFuZGxlIHRoYXQgaXMgcGFydCBvZiBhIG11bHRpIGhhbmRsZSBmaXJzdCByZW1vdmVzIHRoZSBoYW5kbGUgZnJvbSB0aGUKICBzdGFjay4KCi0gQWRkZWQgQ1VSTE9QVF9TU0xfU0VTU0lPTklEX0NBQ0hFIGFuZCAtLW5vLXNlc3Npb25pZCB0byBkaXNhYmxlIFNTTAogIHNlc3Npb24tSUQgcmUtdXNlIG9uIGRlbWFuZCBzaW5jZSB0aGVyZSBvYnZpb3VzbHkgYXJlIGJyb2tlbiBzZXJ2ZXJzIG91dAogIHRoZXJlIHRoYXQgbWlzYmVoYXZlIHdpdGggc2Vzc2lvbi1JRHMgdXNlZC4KCi0gSmVmZiBQb2hsbWV5ZXIgcHJlc2VudGVkIGEgKm11bHRpX3NvY2tldCgpLXVzaW5nIHByb2dyYW0gdGhhdCBleHBvc2VkIGEKICBwcm9ibGVtIHdpdGggaXQgKFNJR1NFR1Ytc3R5bGUpLiBJdCBjbGVhcmx5IHNob3dlZCB0aGF0IHRoZSBleGlzdGluZwogIHNvY2tldC1zdGF0ZSBhbmQgc3RhdGUtZGlmZmVyZW5jZSBmdW5jdGlvbiB3YXNuJ3QgZ29vZCBlbm91Z2ggc28gSSByZXdyb3RlCiAgaXQgYW5kIGNvdWxkIHRoZW4gcmUtcnVuIEplZmYncyBwcm9ncmFtIHdpdGhvdXQgYW55IGNyYXNoLiBUaGUgcHJldmlvdXMKICB2ZXJzaW9uIGNsZWFybHkgY291bGQgbWlzcyB0byB0ZWxsIHRoZSBhcHBsaWNhdGlvbiB3aGVuIGEgaGFuZGxlIGNoYW5nZWQKICBmcm9tIHVzaW5nIG9uZSBzb2NrZXQgdG8gdXNpbmcgYW5vdGhlci4KCiAgV2hpbGUgSSB3YXMgYXQgaXQgKGFzIEkgY291bGQgdXNlIHRoaXMgYXMgYSBtZWFucyB0byB0cmFjayB0aGlzIHByb2JsZW0KICBkb3duKSwgSSd2ZSBub3cgYWRkZWQgYSAnbWFnaWMnIG51bWJlciB0byB0aGUgZWFzeSBoYW5kbGUgc3RydWN0IHRoYXQgaXMKICBpbml0ZWQgYXQgY3VybF9lYXN5X2luaXQoKSB0aW1lIGFuZCBjbGVhcmVkIGF0IGN1cmxfZWFzeV9jbGVhbnVwKCkgdGltZSB0aGF0CiAgd2UgY2FuIHVzZSBpbnRlcm5hbGx5IHRvIGRldGVjdCB0aGF0IGFuIGVhc3kgaGFuZGxlIHNlZW1zIHRvIGJlIGZpbmUsIG9yIGF0CiAgbGVhc3Qgbm90IGNsb3NlZCBvciBmcmVlZCAoZnJlZWluZyBpbiBkZWJ1ZyBidWlsZHMgZmlsbCB0aGUgYXJlYSB3aXRoIDB4MTMKICBieXRlcyBidXQgaW4gbm9ybWFsIGJ1aWxkcyB3ZSBjYW4gb2YgY291cnNlIG5vdCBhc3N1bWUgYW55IHBhcnRpY3VsYXIgZGF0YQogIGluIHRoZSBmcmVlZCBhcmVhcykuCgpEYW5pZWwgKDkgU2VwdGVtYmVyIDIwMDYpCi0gTWljaGVsZSBCaW5pIGZpeGVkIGhvdyB0aGUgaG9zdG5hbWUgaXMgcHV0IGluIE5UTE0gcGFja2FnZXMuIEFzIHNlcnZlcnMKICBkb24ndCBleHBlY3QgZnVsbHkgcXVhbGlmaWVkIG5hbWVzIHdlIG5lZWQgdG8gY3V0IHRoZW0gb2ZmIGF0IHRoZSBmaXJzdCBkb3QuCgotIFBldGVyIFN5bHZlc3RlciBjbGVhbmVkIHVwIGFuZCBmaXhlZCB0aGUgZ2V0c29ja25hbWUoKSB1c2VzIGluIGZ0cC5jLiBTb21lCiAgb2YgdGhlbSBjYW4gYmUgY29tcGxldGV0bHkgcmVtb3ZlZCB0aG91Z2guLi4KCkRhbmllbCAoNiBTZXB0ZW1iZXIgMjAwNikKLSBSYXZpIFByYXRhcCBhbmQgSSBoYXZlIGltcGxlbWVudGVkIEhUVFAgUGlwZWxpbmluZyBzdXBwb3J0LiBFbmFibGUgaXQgZm9yIGEKICBtdWx0aSBoYW5kbGUgdXNpbmcgQ1VSTE1PUFRfUElQRUxJTklORyBhbmQgYWxsIEhUVFAgY29ubmVjdGlvbnMgZG9uZSBvbiB0aGF0CiAgaGFuZGxlIHdpbGwgYmUgYXR0ZW1wdGVkIHRvIGdldCBwaXBlbGluZWQgaW5zdGVhZCBvZiBkb25lIGluIHBhcmFsbGVsbCBhcwogIHRoZXkgYXJlIHBlcmZvcm1lZCBvdGhlcndpc2UuCgogIEFzIGEgc2lkZS1lZmZlY3QgZnJvbSB0aGlzIHdvcmssIGNvbm5lY3Rpb25zIGFyZSBub3cgc2hhcmVkIGJldHdlZW4gYWxsIGVhc3kKICBoYW5kbGVzIHdpdGhpbiBhIG11bHRpIGhhbmRsZSwgc28gaWYgeW91IHVzZSBOIGVhc3kgaGFuZGxlcyBmb3IgdHJhbnNmZXJzLAogIGVhY2ggb2YgdGhlbSBjYW4gcGljayB1cCBhbmQgcmUtdXNlIGEgY29ubmVjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IHVzZWQgYnkKICBhbnkgb2YgdGhlIGhhbmRsZXMsIGJlIGl0IHRoZSBzYW1lIG9yIG9uZSBvZiB0aGUgb3RoZXJzLgoKICBUaGlzIHNlcGFyYXRpb24gb2YgdGhlIHRpZ2h0IHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNvbm5lY3Rpb25zIGFuZCBlYXN5CiAgaGFuZGxlcyBpcyBtb3N0IG5vdGljYWJsZSB3aGVuIHlvdSBjbG9zZSBlYXN5IGhhbmRsZXMgdGhhdCBoYXZlIGJlZW4gdXNlZCBpbgogIGEgbXVsdGkgaGFuZGxlIGFuZCBjaGVjayBhbW91bnQgb2YgdXNlZCBtZW1vcnkgb3Igd2F0Y2ggdGhlIGRlYnVnIG91dHB1dCwgYXMKICB0aGVyZSBhcmUgdGltZXMgd2hlbiBsaWJjdXJsIHdpbGwga2VlcCB0aGUgZWFzeSBoYW5kbGUgYXJvdW5kIGZvciBhIHdoaWxlCiAgbG9uZ2VyIHRvIGJlIGFibGUgdG8gY2xvc2UgaXQgcHJvcGVybHkuIExpa2UgZm9yIHNlbmRpbmcgUVVJVCB0byBjbG9zZSBkb3duCiAgYW4gRlRQIGNvbm5lY3Rpb24uCgogIFRoaXMgaXMgYSBtYWpvciBjaGFuZ2UuCiAgCkRhbmllbCAoNCBTZXB0ZW1iZXIgMjAwNikKLSBEbWl0cnkgUmVjaGtpbiAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTU1MTQxMikgcHJvdmlkZWQgYQogIHBhdGNoIHRoYXQgd2hpbGUgbm90IGZpeGluZyB0aGluZ3MgdmVyeSBuaWNlbHksIGl0IGRvZXMgbWFrZSB0aGUgU09DS1M1CiAgcHJveHkgY29ubmVjdGlvbiBzbGlnaHRseSBiZXR0ZXIgYXMgaXQgbm93IGFja25vd2xlZGdlcyB0aGUgdGltZW91dCBmb3IKICBjb25uZWN0aW9uIGFuZCBpdCBubyBsb25nZXIgc2VnZmF1bHRzIGluIHRoZSBjYXNlIHdoZW4gU09DS1MgcmVxdWlyZXMKICBhdXRoZW50aWNhdGlvbiBhbmQgeW91IGRpZCBub3Qgc3BlY2lmeSB1c2VybmFtZTpwYXNzd29yZC4KCkRhbmllbCAoMzEgQXVndXN0IDIwMDYpCi0gRG1pdHJpeSBTZXJnZXlldiBmb3VuZCBhbmQgZml4ZWQgYSBtdWx0aSBpbnRlcmZhY2UgZmxhdyB3aGVuIHVzaW5nIGFzeW5jaAogIG5hbWUgcmVzb2x2ZXMuIEl0IGNvdWxkIGdldCBzdHVjayBpbiB0aGUgd3Jvbmcgc3RhdGUuCgpHaXNsZSAoMjkgQXVndXN0IDIwMDYpCi0gQWRkZWQgc3VwcG9ydCBmb3Igb3RoZXIgTVMtRE9TIGNvbXBpbGVycyAoZGVzaWRlcyBkamdwcCkuIEFsbCBNUy1ET1MKICBjb21waWxlciBub3cgdXNlcyB0aGUgc2FtZSBjb25maWcuZG9zIGZpbGUgKHJlbmFtZWQgdG8gY29uZmlnLmggYnkKICBtYWtlKS4gbGliY3VybCBub3cgYnVpbGRzIGZpbmUgdXNpbmcgV2F0Y29tIGFuZCBNZXRhd2FyZSdzIEhpZ2gtQwogIHVzaW5nIHRoZSBXYXR0LTMyIHRjcC9pcC1zdGFjay4KCkRhbmllbCAoMjkgQXVndXN0IDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgYWRkZWQgQ1VSTE9QVF9TT0NLT1BURlVOQ1RJT04gYW5kIENVUkxPUFRfU09DS09QVERBVEEgdG8KICBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gc2V0IHRoZWlyIG93biBzb2NrZXQgb3B0aW9ucy4KCkRhbmllbCAoMjUgQXVndXN0IDIwMDYpCi0gQXJtZWwgQXNzZWxpbiByZXBvcnRlZCB0aGF0IHRoZSAncnVubmluZ19oYW5kbGVzJyBjb3VudGVyIHdhc24ndCB1cGRhdGVkCiAgcHJvcGVybHkgaWYgeW91IHJlbW92ZWQgYSAibGl2ZSIgaGFuZGxlIGZyb20gYSBtdWx0aSBoYW5kbGUgd2l0aAogIGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSgpLgoKRGFuaWVsICgyMiBBdWd1c3QgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIHJlbWFpbmluZyBtaXN0YWtlIGZyb20gdGhlIEF1Z3VzdCAxOSBUWVBFIGNoYW5nZS4KCi0gUGV0ZXIgU3lsdmVzdGVyIHBvaW50ZWQgb3V0IGEgZmxhdyBpbiB0aGUgQWxsb3dTZXJ2ZXJDb25uZWN0KCkgaW4gdGhlIEZUUAogIGNvZGUgd2hlbiBkb2luZyBwdXJlIGlwdjYgRVBSVCBjb25uZWN0aW9ucy4KCkRhbmllbCAoMTkgQXVndXN0IDIwMDYpCi0gQmFzZWQgb24gYSBwYXRjaCBieSBBcm1lbCBBc3NlbGluLCB0aGUgRlRQIGNvZGUgbm8gbG9uZ2VyIHJlLWlzc3VlcyB0aGUgVFlQRQogIGNvbW1hbmQgb24gc3Vic2VxdWVudCByZXF1ZXN0cyBvbiBhIHJlLXVzZWQgY29ubmVjdGlvbiB1bmxlc3MgaXQgaGFzIHRvLgoKLSBBcm1lbCBBc3NlbGluIGZpeGVkIGEgY3Jhc2ggaW4gdGhlIEZUUCBjb2RlIHdoZW4gdXNpbmcgU0lOR0xFQ1dEIG1vZGUgYW5kCiAgZmlsZXMgaW4gdGhlIHJvb3QgZGlyZWN0b3J5LgoKLSBBbmRyZXcgQmlnZ3MgcG9pbnRlZCBvdXQgYSAiRXhwZWN0OiAxMDAtY29udGludWUiIGZsYXcgd2hlcmUgbGliY3VybCBkaWRuJ3QKICBzZW5kIHRoZSB3aG9sZSByZXF1ZXN0IGF0IG9uY2UsIGV2ZW4gdGhvdWdoIHRoZSBFeHBlY3Q6IGhlYWRlciB3YXMgZGlzYWJsZWQKICBieSB0aGUgYXBwbGljYXRpb24uIEFuIGVmZmVjdCBvZiB0aGlzIGNoYW5nZSBpcyBhbHNvIHRoYXQgc21hbGwgKDwgMTAyNAogIGJ5dGVzKSBQT1NUcyBhcmUgbm93IGFsd2F5cyBzZW50IHdpdGhvdXQgRXhwZWN0OiBoZWFkZXIgc2luY2Ugd2UgZGVlbSBpdAogIG1vcmUgY29zdGx5IHRvIGJvdGhlciBhYm91dCB0aGF0IHRoYW4gdGhlIHJpc2sgdGhhdCB3ZSBzZW5kIHRoZSBkYXRhIGluCiAgdmFpbi4KCkRhbmllbCAoOSBBdWd1c3QgMjAwNikKLSBBcm1lbCBBc3NlbGluIG1hZGUgdGhlIENVUkxPUFRfUFJFUVVPVEUgb3B0aW9uIHdvcmsgZmluZSBldmVuIHdoZW4KICBDVVJMT1BUX05PQk9EWSBpcyBzZXQgdHJ1ZS4gUFJFUVVPVEUgaXMgdGhlbiBydW4gcm91Z2hseSBhdCB0aGUgc2FtZSBwbGFjZQogIGluIHRoZSBjb21tYW5kIHNlcXVlbmNlIGFzIGl0IHdvdWxkIGhhdmUgcnVuIGlmIHRoZXJlIHdvdWxkJ3ZlIGJlZW4gYQogIHRyYW5zZmVyLgoKRGFuaWVsICg4IEF1Z3VzdCAyMDA2KQotIEZpeGVkIGEgZmxhdyBpbiB0aGUgIkV4cGVjdDogMTAwLWNvbnRpbnVlIiB0cmVhdG1lbnQuIElmIHlvdSBkaWQgdHdvIFBPU1RzCiAgb24gYSBwZXJzaXN0ZW50IGNvbm5lY3Rpb24gYW5kIGFsbG93ZWQgdGhlIGZpcnN0IHRvIHVzZSB0aGF0IGhlYWRlciwgeW91CiAgY291bGQgbm90IGRpc2FibGUgaXQgZm9yIHRoZSBzZWNvbmQgcmVxdWVzdC4KCkRhbmllbCAoNyBBdWd1c3QgMjAwNikKLSBEb21lbmljbyBBbmRyZW9sZm91bmQgYSBxdWljayBidWlsZCBlcnJvciB3aGljaCBoYXBwZW5lZCBiZWNhdXNlCiAgc3JjL2NvbmZpZy5oLmluIHdhcyBub3QgYSBwcm9wZXIgZHVwbGNhdGUgb2YgbGliL2NvbmZpZy5oLmluIHdoaWNoIGl0CiAgc2hvdWxkJ3ZlIGJlZW4gYW5kIHRoaXMgd2FzIGR1ZSB0byB0aGUgbWFrZXRneiBzY3JpcHQgbm90IGRvaW5nIHRoZSBjcAogIHByb3Blcmx5LgoKVmVyc2lvbiA3LjE1LjUgKDcgQXVndXN0IDIwMDYpCgpEYW5pZWwgKDIgQXVndXN0IDIwMDYpCi0gTWFyayBMZW50Y3puZXIgZml4ZWQgaG93IGxpYmN1cmwgd2FzIG5vdCBwcm9wZXJseSBkb2luZyBjaHVua2VkIGVuY29kaW5nCiAgaWYgdGhlIGhlYWRlciAiVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWQiIHdhcyBzZXQgYnkgdGhlIGFwcGxpY2F0aW9uLgogIGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE1MzE4MzgKCkRhbmllbCAoMSBBdWd1c3QgMjAwNikKLSBNYWNpZWogS2FycGl1ayBmaXhlZCBhIGNyYXNoIHRoYXQgd291bGQgb2NjdXIgaWYgd2UgcGFzc2VkIEN1cmxfc3RyZXJyb3IoKQogIGFuIHVua25vd24gZXJyb3IgbnVtYmVyIG9uIGdsaWJjIHN5c3RlbXMuCiAgaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTUzMjI4OQoKRGFuaWVsICgzMSBKdWx5IDIwMDYpCi0gKkFMRVJUKiBjdXJsX211bHRpX3NvY2tldCgpIGFuZCBjdXJsX211bHRpX3NvY2tldF9hbGwoKSBnb3QgbW9kaWZpZWQKICBwcm90b3R5cGVzOiB0aGV5IGJvdGggbm93IHByb3ZpZGUgdGhlIG51bWJlciBvZiBydW5uaW5nIGhhbmRsZXMgYmFjayB0byB0aGUKICBjYWxsaW5nIGZ1bmN0aW9uLiBJdCBtYWtlcyB0aGUgZnVuY3Rpb25zIHJlc2VtYmxlIHRoZSBnb29kIG9sZAogIGN1cmxfbXVsdGlfcGVyZm9ybSgpIG1vcmUgYW5kIHByb3ZpZGVzIGEgbmljZSB3YXkgdG8ga25vdyB3aGVuIHRoZSBtdWx0aQogIGhhbmRsZSBnb2VzIGVtcHR5LgoKICBBTEVSVDI6IGRvbid0IHVzZSB0aGUgY3VybF9tdWx0aV9zb2NrZXQqKCkgZnVuY3Rpb25hbGl0eSBpbiBhbnl0aGluZwogIHByb2R1Y3Rpb24tbGlrZSB1bnRpbCBJIHNheSBpdCdzIHNvbWV3aGF0IHNldHRsZWQsIGFzIEkgc3VzcGVjdCB0aGVyZSBtaWdodAogIGJlIHNvbWUgZnVydGhlciBBUEkgY2hhbmdlcyBiZWZvcmUgSSdtIGRvbmUuLi4KCkRhbmllbCAoMjggSnVseSAyMDA2KQotIFl2ZXMgTGVqZXVuZSBmaXhlZCBzbyB0aGF0IHJlcGxhY2luZyBDb250ZW50LVR5cGU6IHdoZW4gZG9pbmcgbXVsdGlwYXJ0CiAgZm9ybXBvc3RzIHdvcmsgZXhhY3RseSB0aGUgd2F5IHlvdSB3YW50IGl0IChhbmQgdGhlIHdheSB5b3UnZCBhc3N1bWUgaXQKICB3b3JrcykuCgpEYW5pZWwgKDI3IEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBhZGRlZCAtLWZ0cC1zc2wtcmVxZCB3aGljaCBtYWtlcyBjdXJsICpyZXF1aXJlKiBTU0wgZm9yIGJvdGgKICBjb250cm9sIGFuZCBkYXRhIGNvbm5lY3Rpb24sIGFzIHRoZSBleGlzdGluZyAtLWZ0cC1zc2wgb3B0aW9uIG9ubHkgcmVxdWVzdHMKICBpdC4KCi0gW0hpcGVyLXJlbGF0ZWQgd29ya10gQWRkZWQgYSBmdW5jdGlvbiBjYWxsZWQgY3VybF9tdWx0aV9hc3NpZ24oKSB0aGF0IHdpbGwKICBzZXQgYSBwcml2YXRlIHBvaW50ZXIgYWRkZWQgdG8gdGhlIGludGVybmFsIGxpYmN1cmwgaGFzaCB0YWJsZSBmb3IgdGhlCiAgcGFydGljdWxhciBzb2NrZXQgcGFzc2VkIGluIHRvIHRoaXMgZnVuY3Rpb246CgogIENVUkxNY29kZSBjdXJsX211bHRpX2Fzc2lnbihDVVJMTSAqbXVsdGlfaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJsX3NvY2tldF90IHNvY2tmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqc29ja3ApOwoKICAnc29ja3AnIGJlaW5nIGEgY3VzdG9tIHBvaW50ZXIgc2V0IGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBiZSBhc3NvY2lhdGVkIHdpdGgKICB0aGlzIHNvY2tldC4gVGhlIHNvY2tldCBoYXMgdG8gYmUgYWxyZWFkeSBleGlzdGluZyBhbmQgaW4tdXNlIGJ5IGxpYmN1cmwsCiAgbGlrZSBoYXZpbmcgYWxyZWFkeSBjYWxsZWQgdGhlIGNhbGxiYWNrIHRlbGxpbmcgYWJvdXQgaXRzIGV4aXN0YW5jZS4KCiAgVGhlIHNldCBoYXNocCBwb2ludGVyIHdpbGwgdGhlbiBiZSBwYXNzZWQgb24gdG8gdGhlIGNhbGxiYWNrIGluIHVwY29taW5nCiAgY2FsbHMgd2hlbiB0aGlzIHNhbWUgc29ja2V0IGlzIHVzZWQgKGluIHRoZSBicmFuZCBuZXcgJ3NvY2tldHAnIGFyZ3VtZW50KS4KCkRhbmllbCAoMjYgSnVseSAyMDA2KQotIERhbiBOZWxzb24gYWRkZWQgdGhlIENVUkxPUFRfRlRQX0FMVEVSTkFUSVZFX1RPX1VTRVIgbGliY3VybCBvcHRpb24gYW5kIGN1cmwKICB0b29sIG9wdGlvbiBuYW1lZCAtLWZ0cC1hbHRlcm5hdGl2ZS10by11c2VyLiBJdCBwcm92aWRlcyBhIG1lYW4gdG8gc2VuZCBhCiAgcGFydGljdWxhciBjb21tYW5kIGlmIHRoZSBub3JtYWwgVVNFUi9QQVNTIGFwcHJvYWNoIGZhaWxzLgoKLSBNaWNoYWVsIEplcnJpcyBhZGRlZCBtYWdpYyB0aGF0IGJ1aWxkcyBsaWIvY3VybGxpYi52Y3Byb2ogYXV0b21hdGljYWxseSBmb3IKICBuZXdlciBNU1ZDLgoKRGFuaWVsICgyNSBKdWx5IDIwMDYpCi0gR2VvcmcgSG9ybiBtYWRlIHRoZSB0cmFuc2ZlciB0aW1lb3V0IGVycm9yIG1lc3NhZ2UgaW5jbHVkZSBtb3JlIGRldGFpbHMuCgpEYW5pZWwgKDIwIEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIGJ1aWxkIGVycm9yIHdoZW4gYnVpbGRpbmcgbGliY3VybCB3aXRoIEhUVFAgZGlzYWJsZWQsCiAgcHJvYmxlbSBhZGRlZCB3aXRoIHRoZSBjdXJsX2Zvcm1nZXQoKSBwYXRjaC4KCkRhbmllbCAoMTcgSnVseSAyMDA2KQotIEphcmkgU3VuZGVsbCBkaWQgc29tZSBleGNlbGxlbnQgcmVzZWFyY2ggYW5kIGJ1ZyB0cmFja2luZywgZmlndXJlZCBvdXQgdGhhdAogIHdlIGRpZCB3cm9uZyBhbmQgcGF0Y2hlZCBpdDogV2hlbiBub2RlcyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgc3BsYXkgdHJlZSwKICBhbmQgd2UgZGlkbid0IHByb3Blcmx5IHJlbW92ZSBpdCBmcm9tIHRoZSBzcGxheSB0cmVlIHdoZW4gYW4gZWFzeSBoYW5kbGUgd2FzCiAgcmVtb3ZlZCBmcm9tIGEgbXVsdGkgc3RhY2sgYW5kIHRodXMgd2UgY291bGQgd3JvbmdseSBsZWF2ZSBhIG5vZGUgaW4gdGhlCiAgc3BsYXkgdHJlZSBwb2ludGluZyB0byAoYmFkKSBtZW1vcnkuCgpEYW5pZWwgKDE0IEp1bHkgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSBmaXhlZCBhIGZsYXcgd2hlcmUgdGhlIENSTEYgY291bnRlciB3YXNuJ3QgcHJvcGVybHkgY2xlYXJlZAogIGZvciBGVFAgQVNDSUkgdHJhbnNmZXJzLgoKRGFuaWVsICg4IEp1bHkgMjAwNikKLSBBdGVzIEdvcmFsIHBvaW50ZWQgb3V0IHRoYXQgbGliY3VybCdzIGNvb2tpZSBwYXJzZXIgZGlkIGNhc2UgaW5zZW5zaXRpdmUKICBzdHJpbmcgY29tcGFyaXNvbnMgb24gdGhlIHBhdGggd2hpY2ggaXMgaW5jb3JyZWN0IGFuZCBwcm92aWRlZCBhIHBhdGNoIHRoYXQKICBmaXhlcyB0aGlzLiBJIGVkaXRlZCB0ZXN0IGNhc2UgOCB0byBpbmNsdWRlIGRldGFpbHMgdGhhdCB0ZXN0IGZvciB0aGlzLgoKLSBJbmdtYXIgUnVuZ2UgcHJvdmlkZWQgYSBzb3VyY2Ugc25pcHBldCB0aGF0IGNhdXNlZCBhIGNyYXNoLiBUaGUgcmVhc29uIGZvcgogIHRoZSBjcmFzaCB3YXMgdGhhdCBsaWJjdXJsIGludGVybmFsbHkgd2FzIGEgYml0IGNvbmZ1c2VkIGFib3V0IHdobyBvd25lZCB0aGUKICBETlMgY2FjaGUgYXQgYWxsIHRpbWVzIHNvIGlmIHlvdSBjcmVhdGVkIGFuIGVhc3kgaGFuZGxlIHRoYXQgdXNlcyBhIHNoYXJlZAogIEROUyBjYWNoZSBhbmQgYWRkZWQgdGhhdCB0byBhIG11bHRpIGhhbmRsZSBpdCB3b3VsZCBjcmFzaC4gTm93IHdlIGtlZXAgbW9yZQogIGNhcmVmdWwgaW50ZXJuYWwgdHJhY2sgb2YgZXhhY3RseSB3aGF0IGtpbmQgb2YgRE5TIGNhY2hlIGVhY2ggZWFzeSBoYW5kbGUKICB1c2VzOiBOb25lLCBQcml2YXRlIChhbGxvY2F0ZWQgZm9yIGFuZCB1c2VkIG9ubHkgYnkgdGhpcyBzaW5nbGUgaGFuZGxlKSwKICBTaGFyZWQgKHBvaW50cyB0byBhIGNhY2hlIGhlbGQgYnkgYSBzaGFyZWQgb2JqZWN0KSwgR2xvYmFsIChwb2ludHMgdG8gdGhlCiAgZ2xvYmFsIGNhY2hlKSBvciBNdWx0aSAocG9pbnRzIHRvIHRoZSBjYWNoZSB3aXRoaW4gdGhlIG11bHRpIGhhbmRsZSB0aGF0IGlzCiAgYXV0b21hdGljYWxseSBzaGFyZWQgYmV0d2VlbiBhbGwgZWFzeSBoYW5kbGVzIHRoYXQgYXJlIGFkZGVkIHdpdGggcHJpdmF0ZQogIGNhY2hlcykuCgpEYW5pZWwgKDQgSnVseSAyMDA2KQotIFRvc2hpeXVraSBNYWV6YXdhIGZpeGVkIGEgcHJvYmxlbSB3aGVyZSB5b3UgY291bGRuJ3Qgb3ZlcnJpZGUgdGhlCiAgUHJveHktQ29ubmVjdGlvbjogaGVhZGVyIHdoZW4gdXNpbmcgYSBwcm94eSBhbmQgbm90IGRvaW5nIENPTk5FQ1QuCgpEYW5pZWwgKDI0IEp1bmUgMjAwNikKLSBNaWNoYWVsIFdhbGxuZXIgYWRkZWQgY3VybF9mb3JtZ2V0KCksIHdoaWNoIGFsbG93cyBhbiBhcHBsaWNhdGlvbiB0byBleHRyYWN0CiAgKHNlcmlhbGlzZSkgYSBwcmV2aW91c2x5IGJ1aWx0IGZvcm1wb3N0IChhcyB3aXRoIGN1cmxfZm9ybWFkZCgpKS4KCkRhbmllbCAoMjMgSnVuZSAyMDA2KQotIEFydmUgS251ZHNlbiBmb3VuZCBhIGZsYXcgaW4gY3VybF9tdWx0aV9mZHNldCgpIGZvciBzeXN0ZW1zIHdoZXJlCiAgY3VybF9zb2NrZXRfdCBpcyB1bnNpZ25lZCAobGlrZSBXaW5kb3dzKSB0aGF0IGNvdWxkIGNhdXNlIGl0IHRvIHdyb25nbHkKICByZXR1cm4gYSBtYXggZmQgb2YgLTEuCgpEYW5pZWwgKDIwIEp1bmUgMjAwNikKLSBQZXRlciBTaWx2YSBpbnRyb2R1Y2VkIENVUkxPUFRfTUFYX1NFTkRfU1BFRURfTEFSR0UgYW5kCiAgQ1VSTE9QVF9NQVhfUkVDVl9TUEVFRF9MQVJHRSB0aGF0IGxpbWl0IHRoYSBtYXhpbXVtIHJhdGUgbGliY3VybCBpcyBhbGxvd2VkCiAgdG8gc2VuZCBvciByZWNlaXZlIGRhdGEuIFRoaXMga2luZCBvZiBhZGRzIHRoZSB0aGUgY29tbWFuZCBsaW5lIHRvb2wncwogIG9wdGlvbiAtLWxpbWl0LXJhdGUgdG8gdGhlIGxpYnJhcnkuCgogIFRoZSByYXRlIGxpbWl0aW5nIGxvZ2ljIGluIHRoZSBjdXJsIGFwcCBpcyBub3cgcmVtb3ZlZCBhbmQgaXMgaW5zdGVhZAogIHByb3ZpZGVkIGJ5IGxpYmN1cmwgaXRzZWxmLiBUcmFuc2ZlciByYXRlIGxpbWl0aW5nIHdpbGwgbm93IGFsc28gd29yayBmb3IgLWQKICBhbmQgLUYsIHdoaWNoIGl0IGRpZG4ndCBiZWZvcmUuCgpEYW5pZWwgKDE5IEp1bmUgMjAwNikKLSBNYWRlIC1LIG9uIGEgZmlsZSB0aGF0IGNvdWxkbid0IGJlIHJlYWQgY2F1c2UgYSB3YXJuaW5nIHRvIGJlIGRpc3BsYXllZC4KCkRhbmllbCAoMTMgSnVuZSAyMDA2KQotIERhbiBGYW5kcmljaCBpbXBsZW1lbnRlZCAtLWVuYWJsZS1oaWRkZW4tc3ltYm9scyBjb25maWd1cmUgb3B0aW9uIHRvIGVuYWJsZQogIC1mdmlzaWJpbGl0eT1oaWRkZW4gb24gZ2NjID49IDQuMC4gIFRoaXMgcmVkdWNlcyB0aGUgc2l6ZSBvZiB0aGUgbGliY3VybAogIGJpbmFyeSBhbmQgc3BlZWRzIHVwIGR5bmFtaWMgbGlua2luZyBieSBoaWRpbmcgYWxsIHRoZSBpbnRlcm5hbCBzeW1ib2xzIGZyb20KICB0aGUgc3ltYm9sIHRhYmxlLgoKVmVyc2lvbiA3LjE1LjQgKDEyIEp1bmUgMjAwNikKCkRhbmllbCAoOCBKdW5lIDIwMDYpCi0gQnJpYW4gRGVzc2VudCBmaXhlZCB0aGUgY29kZSBmb3IgY3lnd2luIGluIHRocmVlIGRpc3RpbmN0IHdheXM6CgogIFRoZSBmaXJzdCBtb2RpZmllcyB7bGliLHNyY30vc2V0dXAuaCB0byBub3QgaW5jbHVkZSB0aGUgd2luc29jayBoZWFkZXJzCiAgdW5kZXIgQ3lnd2luLiAgVGhpcyBmaXhlcyB0aGUgcmVwb3J0ZWQgYnVpbGQgcHJvYmxlbS4gIEN5Z3dpbiBhdHRlbXB0cyBhcwogIG11Y2ggYXMgcG9zc2libGUgdG8gZW11bGF0ZSBhIHBvc2l4IGVudmlyb25tZW50IHVuZGVyIFdpbmRvd3MuICBUaGlzIG1lYW5zCiAgdGhhdCBXSU4zMiBpcyAqbm90KiAjZGVmaW5lZCBhbmQgKHRvIHRoZSBleHRlbnQgcG9zc2libGUpIGV2ZXJ5dGhpbmcgaXMgZG9uZQogIGFzIGl0IHdvdWxkIGJlIG9uIGEgKml4IHR5cGUgc3lzdGVtLiAgVGh1cyA8c3lzL3NvY2tldC5oPiBpcyB0aGUgcHJvcGVyCiAgaW5jbHVkZSwgYW5kIGV2ZW4gdGhvdWdoIHdpbnNvY2syLmggaXMgcHJlc2VudCwgaW5jbHVkaW5nIGl0IGp1c3QgaW50cm9kdWNlcwogIGEgd2hvbGUgYnVuY2ggb2YgaW5jb21wYXRpYmxlIHNvY2tldCBBUEkgc3R1ZmYuCgogIFRoZSBzZWNvbmQgaXMgYSBwYXRjaCBJJ3ZlIGluY2x1ZGVkIGluIHRoZSBDeWd3aW4gYmluYXJ5IHBhY2thZ2VzIGZvciBhCiAgd2hpbGUuICBJdCBza2lwcyB0d28gdW5uZWNlc3NhcnkgbGlicmFyeSBjaGVja3MgKC1sd2lubW0gYW5kIC1sZ2RpMzIpLiAgVGhlCiAgY2hlY2tzIGFyZSBpbm5vY3VvdXMgYW5kIHRoZXkgZG8gc3VjY2VlZCwgYnV0IHRoZXkgcG9sbHV0ZSBMSUJTIHdpdGgKICB1bm5lY2Vzc2FyeSBzdHVmZiB3aGljaCBnZXRzIHJlY29yZGVkIGFzIHN1Y2ggaW4gdGhlIGxpYmN1cmwubGEgZmlsZSwgd2hpY2gKICBicmluZ3MgdGhlbSBpbnRvIHRoZSBidWlsZCBvZiBhbnkgbGliY3VybC1kb3duc3RyZWFtLiAgQXMgZmFyIGFzIEkga25vdwogIHRoZXNlIGxpYnMgYXJlIHJlYWxseSBvbmx5IG5lY2Vzc2FyeSBmb3IgbWluZ3csIHNvIGFsdGVybmF0aXZlbHkgdGhleSBjb3VsZAogIGJlIGRlc2lnbmVkIHRvIG9ubHkgcnVuIGlmICRob3N0IG1hdGNoZXMgKi0qLW1pbmd3KiBidXQgSSB0b29rIHRoZSBzYWZlcgogIHJvdXRlIG9mIHNraXBwaW5nIHRoZW0gZm9yICotKi1jeWd3aW4qLgoKICBUaGUgdGhpcmQgcGF0Y2ggcmVwbGFjZXMgYWxsIHVzZXMgb2YgdGhlIGFuY2llbnQgYW5kIG9ic29sZXRlIF9fQ1lHV0lOMzJfXwogIHdpdGggX19DWUdXSU5fXy4gUmVmOiA8aHR0cDovL2N5Z3dpbi5jb20vbWwvY3lnd2luLzIwMDMtMDkvbXNnMDE1MjAuaHRtbD4uCgpEYW5pZWwgKDcgSnVuZSAyMDA2KQotIE1pa2FlbCBTZW5uZXJob2xtIHByb3ZpZGVkIGEgcGF0Y2ggdGhhdCBhZGRlZCBOVExNMiBzZXNzaW9uIHJlc3BvbnNlIHN1cHBvcnQKICB0byBsaWJjdXJsLiBUaGUgMjEgTlRMTSB0ZXN0IGNhc2VzIHdlcmUgYWdhaW4gbW9kaWZpZWQgdG8gY29tcGx5Li4uCgpEYW5pZWwgKDI3IE1heSAyMDA2KQotINNzY2FyIE1vcmFsZXMgVml28yB1cGRhdGVkIHRoZSBsaWJjdXJsLmZyYW1ld29yay5tYWtlIGZpbGUuCgpEYW5pZWwgKDI2IE1heSAyMDA2KQotIE9sYWYgU3T8YmVuIGZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIERpZ2VzdCBhdXRoZW50aWNhdGlvbiB3aXRoIG1kNS1zZXNzIHRvCiAgZmFpbC4gV2hlbiB1c2luZyB0aGUgbWQ1LXNlc3MsIHRoZSByZXN1bHQgd2FzIG5vdCBNZDUgZW5jb2RlZCBhbmQgQmFzZTY0CiAgdHJhbnNmb3JtZWQuCgpEYW5pZWwgKDI1IE1heSAyMDA2KQotIE1pY2hhZWwgV2FsbG5lciBwcm92aWRlZCBhIHBhdGNoIHRoYXQgYWxsb3dzICJTRVNTIiB0byBiZSBzZXQgd2l0aAogIENVUkxPUFRfQ09PS0lFTElTVCwgd2hpY2ggdGhlbiBtYWtlcyBhbGwgc2Vzc2lvbiBjb29raWVzIGdldCBjbGVhcmVkLgoKRGFuaWVsICgyNCBNYXkgMjAwNikKLSBUb3IgQXJudHNlbiBtYWRlIHRlc3QgMjcxIHJ1biBmaW5lIGFnYWluIHNpbmNlIHRoZSBURlRQIHBhdGggZml4LgoKRGFuaWVsICgyMyBNYXkgMjAwNikKLSBNYXJ0aW4gTWljaGxtYXlyIGZpbGVkIGRlYmlhbiBidWcgcmVwb3J0ICMzNjc5NTQsIGJ1dCB0aGUgc2FtZSBlcnJvciBhbHNvCiAgc2hvd2VkIHVwIGluIHRoZSBhdXRvYnVpbGRzLiBJdCBzZWVtcyBhIHJhdGhlciBsb25nLXNpbmNlIGludHJvZHVjZWQgc2hlbGwKICBzY3JpcHQgZmxhdyBpbiB0aGUgY29uZmlndXJlIHNjcmlwdCBzdWRkZW5seSB3YXMgZGV0ZWN0ZWQgYnkgdGhlIGJhc2gKICB2ZXJzaW9uIGluIERlYmlhbiBVbnN0YWJsZS4gSXQgaGFkIHByZXZpb3VzbHkgcGFzc2VkIHVuZGV0ZWN0ZWQgYnkgYWxsCiAgc2hlbGxzIHVzZWQgc28gZmFyLi4uCgotIERhdmlkIE1jQ3JlZWR5IHVwZGF0ZWQgbGliL2NvbmZpZy10cGYuaAoKRGFuaWVsICgxMSBNYXkgMjAwNikKLSBGaXhlZCB0aGUgY29uZmlndXJlJ3MgY2hlY2sgZm9yIG9sZC1zdHlsZSBTU0xlYXkgaGVhZGVycyBzaW5jZSBJIGZlbGwgb3ZlciBhCiAgY2FzZSB3aXRoIGEgZHVwbGljYXRlIGZpbGUgbmFtZSAoYSBrcmI0IGltcGxlbWVudGF0aW9uIHdpdGggYW4gZXJyLmgKICBmaWxlKS4gSSBjb252ZXJ0ZWQgdGhlIGNoZWNrIHRvIG1hbnVhbGx5IG1ha2Ugc3VyZSB0aHJlZSBvZiB0aGUgaGVhZGVycyBhcmUKICBwcmVzZW50IGJlZm9yZSBjb25zaWRlcmluZyB0aGVtIGZpbmUuCgotIERhdmlkIE1jQ3JlZWR5IHByb3ZpZGVkIGEgZml4IGZvciBDVVJMSU5GT19MQVNUU09DS0VUIHRoYXQgZG9lcyBleHRlbmRlZAogIGNoZWNrcyBvbiB0aGUgdG8tYmUtcmV0dXJuZWQgc29ja2V0IHRvIG1ha2Ugc3VyZSBpdCB0cnVseSBzZWVtcyB0byBiZSBhbGl2ZQogIGFuZCB3ZWxsLiBGb3IgU1NMIGNvbm5lY3Rpb24gaXQgKG9ubHkpIHVzZXMgT3BlblNTTCBmdW5jdGlvbnMuCgpEYW5pZWwgKDEwIE1heSAyMDA2KQotIEZpeGVkIERJQ1QgaW4gdHdvIGFzcGVjdHM6CgogIDEgLSBhbGxvdyBwcm9wZXJseSBVUkwtZXNjYXBlZCB3b3JkcywgbGlrZSB1c2luZyAlMjAgZm9yIHNwYWNlcwoKICAyIC0gcHJvcGVybHkgZXNjYXBlIGNlcnRhaW4gbGV0dGVycyB3aXRoaW4gYSB3b3JkIHRvIGNvbXBseSB0byB0aGUgUkZDMjIyOQoKRGFuaWVsICg5IE1heSAyMDA2KQotIEFuZHJlYXMgTnRhZmxvcyByZXBvcnRlZCBhIGJ1ZyBpbiBsaWJjdXJsLm00OiBXaGVuIGNvbmZpZ3VyaW5nIG15IEdOVQogIGF1dG90b29scyBwcm9qZWN0LCB3aGljaCBvcHRpb25hbGx5IChkZWZhdWx0PXllcykgdXNlcyBsaWJjdXJsIG9uIGEgc3lzdGVtCiAgd2l0aG91dCBhICh1c2FibGUpIGxpYmN1cmwgaW5zdGFsbGF0aW9uLCBidXQgbm90IHNwZWNpZnlpbmcKICBgLS13aXRob3V0LWxpYmN1cmwnLCBjb25maWd1cmUgZGV0ZXJtaW5lcyBjb3JyZWN0bHkgdGhhdCBubyBsaWJjdXJsIGlzCiAgYXZhaWxhYmxlLCBob3dldmVyLCB0aGUgTElCQ1VSTCB2YXJpYWJsZSBnZXRzIGV4cGFuZGVkIHRvIGBMSUJDVVJMID0gLWxjdXJsJwogIGluIHRoZSByZXN1bHRpbmcgTWFrZWZpbGVzLgoKICBEYXZpZCBTaGF3IGZpeGVkIHRoZSBmbGF3LgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpeGVkIHR3byBwcm9ibGVtcyBpbiB0aGUgcmVjZW50bHkgYWRkZWQgbm9uLWJsb2NraW5nIFNTTAogIGNvbm5lY3RzLiBUaGUgc3RhdGUgbWFjaGluZSB3YXMgbm90IHJlc2V0IHByb3Blcmx5IHNvIHRoYXQgc3Vic2VxdWVudAogIGNvbm5lY3RzIHVzaW5nIHRoZSBzYW1lIGhhbmRsZSB3b3VsZCBmYWlsLCBhbmQgdGhlcmUgd2VyZSB0d28gbWVtb3J5IGxlYWtzLgoKLSBSb2Jzb24gQnJhZ2EgQXJhdWpvIGZpeGVkIGEgbWVtb3J5IGxlYWsgd2hlbiB5b3UgYWRkZWQgYW4gZWFzeSBoYW5kbGUgdG8gYQogIG11bHRpIHN0YWNrIGFuZCB0aGF0IGVhc3kgaGFuZGxlIGhhZCBhbHJlYWR5IGJlZW4gdXNlZCB0byBkbyBvbmUgb3IgbW9yZQogIGVhc3kgaW50ZXJmYWNlIHRyYW5zZmVycywgYXMgdGhlbiB0aGUgY29kZSB0aHJldyBhd2F5IHRoZSBwcmV2aW91c2x5IHVzZWQKICBETlMgY2FjaGUgd2l0aG91dCBwcm9wZXJseSBmcmVlaW5nIGl0LgoKRGFuaWVsICg4IE1heSAyMDA2KQotIERhbiBGYW5kcmljaCB3ZW50IG92ZXIgdGhlIFRGVFAgY29kZSBhbmQgaGUgcG9pbnRlZCBvdXQgYW5kIGZpeGVkIG51bWVyb3VzCiAgcHJvYmxlbXM6CgogICogVGhlIHJlY2VpdmVkIGZpbGUgaXMgY29ycnVwdGVkIHdoZW4gYSBwYWNrZXQgaXMgbG9zdCBhbmQgcmV0cmFuc21pdHRlZAogICAgKHRoaXMgaXMgYSBzZXJpb3VzIHByb2JsZW0hKQoKICAqIFRyYW5zbWl0dGluZyBhIGZpbGUgYWJvcnRzIGlmIGEgYmxvY2sgaXMgbG9zdCBhbmQgcmV0cmFuc21pdHRlZAoKICAqIERhdGEgaXMgc3RvcmVkIGluIHRoZSB3cm9uZyBsb2NhdGlvbiBpbiB0aGUgYnVmZmVyIGZvciB1cGxvYWRzLCBzbyB1cGxvYWRzCiAgICBhbHdheXMgZmFpbCAoSSBkb24ndCBzZWUgaG93IGl0IGNvdWxkIGhhdmUgZXZlciB3b3JrZWQsIGJ1dCBpdCBkaWQgb24geDg2CiAgICBhdCBsZWFzdCkKCiAgKiBBIG51bWJlciBvZiBjYWxscyBhcmUgbWFkZSB0byBzdHJlcnJvciBpbnN0ZWFkIG9mIEN1cmxfc3RyZXJyb3IsIG1ha2luZwogICAgdGhlIGNvZGUgbm90IHRocmVhZCBzYWZlCgogICogVGhlcmUgYXJlIHJlZmVyZW5jZXMgdG8gZXJybm8gaW5zdGVhZCBvZiBDdXJsX3NvY2tlcnJubygpLCBjYXVzaW5nCiAgICBpbmNvcnJlY3QgZXJyb3IgbWVzc2FnZXMgb24gV2luZG93cwoKICAqIFRoZSBmaWxlIG5hbWUgaW5jbHVkZXMgYSBsZWFkaW5nIC8gd2hpY2ggdmlvbGF0ZXMgUkZDMzYxNy4gRG9pbmcgc29tZXRoaW5nCiAgICBzaW1pbGFyIHRvIGZ0cCwgd2hlcmUgdHdvIHNsYXNoZXMgYWZ0ZXIgdGhlIGhvc3QgbmFtZSBtZWFucyBhbiBhYnNvbHV0ZQogICAgcmVmZXJlbmNlIHNlZW1zIGEgcmVhc29uYWJsZSBleHRlbnNpb24gdG8gZml4IHRoaXMuCgogICogRmFpbHVyZXMgaW4gRUJDRElDIGNvbnZlcnNpb24gYXJlIG5vdCBwcm9wYWdhdGVkIHVwIHRvIHRoZSBjYWxsZXIgYnV0IGFyZQogICAgc2lsZW50bHkgaWdub3JlZAoKLSBGaXhlZCBrbm93biBidWcgIzI4LiBUaGUgVEZUUCBjb2RlIG5vIGxvbmdlciBhc3N1bWVzIGEgcGFja2VkIHN0cnVjdCBhbmQKICB0aHVzIHdvcmtzIHJlbGlhYmx5IG9uIG1vcmUgcGxhdGZvcm1zLgoKRGFuaWVsICg1IE1heSAyMDA2KQotIFJvbGFuZCBCbG9tIGZpbGVkIGJ1ZyByZXBvcnQgIzE0ODEyMTcKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQ4MTIxNyksIHdpdGggZm9sbG93LXVwcyBieSBNaWNoZWxlCiAgQmluaSBhbmQgRGF2aWQgQnlyb24uIGxpYmN1cmwgcHJldmlvdXNseSB3cm9uZ2x5IHVzZWQgR2V0TGFzdEVycm9yKCkgb24KICB3aW5kb3dzIHRvIGdldCBlcnJvciBkZXRhaWxzIGFmdGVyIHNvY2tldC1yZWxhdGVkIGZ1bmN0aW9uIGNhbGxzLCB3aGVuIGl0CiAgcmVhbGx5IHNob3VsZCB1c2UgV1NBR2V0TGFzdEVycm9yKCkgaW5zdGVhZC4KCiAgV2hlbiBjaGFuZ2luZyB0byB0aGlzLCB0aGUgZm9ybWVyIGZ1bmN0aW9uIEN1cmxfb3VyZXJybm8oKSBpcyBub3cgaW5zdGVhZAogIGNhbGxlZCBDdXJsX3NvY2tlcnJubygpIGFzIGl0IGlzIG5lY2Vzc2FyeSB0byBvbmx5IHVzZSBpdCB0byBnZXQgZXJybm8gZnJvbQogIHNvY2tldC1yZWxhdGVkIGZ1bmN0aW9ucyBhcyBvdGhlcndpc2UgaXQgd29uJ3Qgd29yayBhcyBpbnRlbmRlZCBvbiBXaW5kb3dzLgoKRGFuaWVsICg0IE1heSAyMDA2KQotIE1hcmsgRWljaGluIHN1Ym1pdHRlZCBidWcgcmVwb3J0ICMxNDgwODIxCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0ODA4MjEpIEhlIGZvdW5kIGFuZCBpZGVudGlmaWVkIGEKICBwcm9ibGVtIHdpdGggaG93IGxpYmN1cmwgZGVhbHQgd2l0aCBHbnVUTFMgYW5kIGEgY2FzZSB3aGVyZSBnbnV0bHMgcmV0dXJuZWQKICBHTlVUTFNfRV9BR0FJTiBpbmRpY2F0aW5nIGl0IHdvdWxkIGJsb2NrLiBJdCB3b3VsZCB0aGVuIHJldHVybiBhbiB1bmV4cGVjdGVkCiAgcmV0dXJuIGNvZGUsIG1ha2luZyBDdXJsX3NzbF9zZW5kKCkgY29uZnVzZSB0aGUgdXBwZXIgbGF5ZXIgLSBjYXVzaW5nIHJhbmRvbQogIDI4IGJ5dGVzIHRyYXNoIGRhdGEgdG8gZ2V0IGluc2VydGVkIGluIHRoZSB0cmFuc2ZlcmVkIHN0cmVhbS4KCiAgVGhlIHByb3BlciBmaXggd2FzIHRvIG1ha2UgdGhlIEN1cmxfZ3Rsc19zZW5kKCkgZnVuY3Rpb24gcmV0dXJuIHRoZSBwcm9wZXIKICByZXR1cm4gY29kZXMgdGhhdCB0aGUgY2FsbGVycyB3b3VsZCBleHBlY3QuIFRoZSBDdXJsX29zc2xfc2VuZCgpIGZ1bmN0aW9uCiAgYWxyZWFkeSBkaWQgdGhpcy4KCkRhbmllbCAoMiBNYXkgMjAwNikKLSBBZGRlZCBhIC0tY2hlY2tmb3Igb3B0aW9uIHRvIGN1cmwtY29uZmlnIHRvIGFsbG93IHVzZXJzIHRvIGVhc2llcgogIHdyaXRlIGZvciBleGFtcGxlIHNoZWxsIHNjcmlwdHMgdGhhdCB0ZXN0IGZvciB0aGUgcHJlc2VuY2Ugb2YgYQogIG5ldy1lbm91Z2ggbGliY3VybCB2ZXJzaW9uLiBJZiAtLWNoZWNrZm9yIGlzIGdpdmVuIGEgdmVyc2lvbiBzdHJpbmcKICBuZXdlciB0aGFuIHdoYXQgaXMgY3VycmVudGx5IGluc3RhbGxlZCwgY3VybC1jb25maWcgd2lsbCByZXR1cm4gYQogIG5vbi16ZXJvIGV4aXQgY29kZSBhbmQgb3V0cHV0IGEgc3RyaW5nIGFib3V0IHRoZSB1bmZ1bGZpbGxlZAogIHJlcXVpcmVtZW50LgoKRGFuaWVsICgyNiBBcHJpbCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGJyb3VnaHQgaW5pdGlhbCBsaW5lIGVuZCBjb252ZXJzaW9ucyB3aGVuIGRvaW5nIEZUUCBBU0NJSQogIHRyYW5zZmVycy4gVGhleSBhcmUgZG9uZSBvbiBub24td2luZG93cyBzeXN0ZW1zIGFuZCB0cmFuc2xhdGUgQ1JMRiB0byBMRi4KCiAgSSBtb2RpZmllZCB0aGUgMTUgTElTVC11c2luZyB0ZXN0IGNhc2VzIGFjY29yZGluZ2x5LiBUaGUgZG93bnNpZGUgaXMgdGhhdCBub3cKICB3ZSdsbCBoYXZlIGV2ZW4gbW9yZSB0cm91YmxlIHRvIGdldCB0aGUgdGVzdHMgdG8gcnVuIG9uIFdpbmRvd3Mgc2luY2UgdGhleQogIHNob3VsZCBnZXQgQ1JMRiBuZXdsaW5lcyBsZWZ0IGludGFjdCB3aGljaCB0aGUgKm5peCB2ZXJzaW9ucyBkb24ndC4gSSBmaWd1cmUKICB0aGUgb25seSBzYW5lIHRoaW5nIHRvIGRvIGlzIHRvIGFkZCBzb21lIGtpbmQgb2YgW25ld2xpbmVdIG1hY3JvIGZvciB0aGUgdGVzdAogIGNhc2UgZmlsZXMgYW5kIGhhdmUgdGhlbSBleHBhbmRlZCB0byB0aGUgcHJvcGVyIG5hdGl2ZSBsaW5lIGVuZGluZyB3aGVuIHRoZQogIHRlc3QgY2FzZXMgYXJlIHJ1bi4gVGhpcyBpcyBob3dldmVyIGxlZnQgdG8gaW1wbGVtZW50LgoKRGFuaWVsICgyNSBBcHJpbCAyMDA2KQotIFBhdWwgUXVlcm5hIGZpeGVkIGxpYmN1cmwgdG8gYmV0dGVyIGRlYWwgd2l0aCBkZWZsYXRlIGNvbnRlbnQgZW5jb2RpbmcKICB3aGVuIHRoZSBzdHJlYW0gKHdyb25nbHkpIGxhY2tzIGEgcHJvcGVyIHpsaWIgaGVhZGVyLiBUaGlzIHNlZW1zIHRvIGJlIHRoZQogIGNhc2Ugb24gdG9vIG1hbnkgYWN0dWFsIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMuCgpEYW5pZWwgKDIxIEFwcmlsIDIwMDYpCi0gQWxlIFZlc2VseSBmaXhlZCBDVVJMT1BUX0lOVEVSRkFDRSB3aGVuIHVzaW5nIGEgaG9zdG5hbWUuCgpEYW5pZWwgKDE5IEFwcmlsIDIwMDYpCi0gQmFzZWQgb24gcHJldmlvdXMgaW5mbyBmcm9tIFRvciBBcm50c2VuLCBJIG1hZGUgY29uZmlndXJlIGRldGVjdCB0aGUgSW50ZWwKICBJQ0MgY29tcGlsZXIgdG8gYWRkIGEgY29tcGlsZXIgb3B0aW9uIGZvciBpdCwgaW4gb3JkZXIgZm9yIGNvbmZpZ3VyZSB0bwogIHByb3Blcmx5IGJlIGFibGUgdG8gZGV0ZWN0IGZ1bmN0aW9uIHByb3RvdHlwZXMuCgotIFJvYnNvbiBCcmFnYSBBcmF1am8gcHJvdmlkZWQgYSBwYXRjaCB0aGF0IG1ha2VzIGxpYmN1cmwgbGVzcyBlYWdlciB0byBjbG9zZQogIHRoZSBjb250cm9sIGNvbm5lY3Rpb24gd2hlbiB1c2luZyBGVFAsIGZvciBleGFtcGxlIHdoZW4geW91IHJlbW92ZSBhbiBlYXN5CiAgaGFuZGxlIGZyb20gYSBtdWx0aSBzdGFjay4KCi0gQXBwbGllZCBhIHBhdGNoIGJ5IEF0ZXMgR29yYWwgYW5kIEthdGllIFdhbmcgdGhhdCBjb3JyZWN0ZWQgbXkgYmFkIGZpeAogIGF0dGVtcHQgZnJvbSBBcHJpbCAxMC4KCkRhbmllbCAoMTEgQXByaWwgMjAwNikKLSAjMTQ2ODMzMCAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQ2ODMzMCkgcG9pbnRlZCBvdXQgYSBiYWQKICB0eXBlY2FzdCBpbiB0aGUgY3VybCB0b29sIGxlYWRpbmcgdG8gYSBjcmFzaCB3aXRoICg2NGJpdD8pIFZTMjAwNSAoYXQgbGVhc3QpCiAgc2luY2UgdGhlIHN0cnVjdCB0aW1ldmFsIGZpZWxkIHR2X3NlYyBpcyBhbiBpbnQgd2hpbGUgdGltZV90IGlzIDY0Yml0LgoKRGFuaWVsICgxMCBBcHJpbCAyMDA2KQotIEF0ZXMgR29yYWwgZm91bmQgb3V0IHRoYXQgaWYgeW91IHNwZWNpZmllZCBib3RoIENVUkxPUFRfQ09OTkVDVFRJTUVPVVQgYW5kCiAgQ1VSTE9QVF9USU1FT1VULCB0aGUgX2xvbmdlcl8gdGltZSB3b3VsZCB3cm9uZ2x5IGJlIHVzZWQgZm9yIHRoZSBTU0wKICBjb25uZWN0aW9uIHRpbWUtb3V0IQoKLSBJIG1lcmdlZCBteSBoaXBlciBwYXRjaCAoaHR0cDovL2N1cmwuaGF4eC5zZS9saWJjdXJsL2hpcGVyLykgaW50byB0aGUgbWFpbgogIHNvdXJjZXMuIFNlZSB0aGUgbGliL1JFQURNRS5tdWx0aV9zb2NrZXQgZm9yIGltcGxlbWVudGF0aW9uIHN0b3J5IHdpdGgKICBkZXRhaWxzLiBEb24ndCBleHBlY3QgaXQgdG8gd29yayBmdWxseSB5ZXQuIEkgZG9uJ3QgaW50ZW5kIHRvIGJsb3cgYW55CiAgd2hpc3RsZXMgb3IgcmluZyBhbnkgYmVsbHMgYWJvdXQgaXQgdW50aWwgSSdtIG1vcmUgY29udmluY2VkIGl0IHdvcmtzIGF0CiAgbGVhc3Qgc29tZXdoYXQgcmVsaWFibHkuCgpEYW5pZWwgKDcgQXByaWwgMjAwNikKLSBEYXZpZCBNY0NyZWVkeSdzIEVCQ0RJQyBhbmQgVFBGIGNoYW5nZXMuIFRocmVlIG5ldyBjdXJsX2Vhc3lfc2V0b3B0KCkKICBvcHRpb25zIChjYWxsYmFja3MpIHdlcmUgYWRkZWQ6CgogIENPTlZfRlJPTV9ORVRXT1JLX0ZVTkNUSU9OCiAgQ09OVl9UT19ORVRXT1JLX0ZVTkNUSU9OCiAgQ09OVl9GUk9NX1VURjhfRlVOQ1RJT04KCkRhbmllbCAoNSBBcHJpbCAyMDA2KQotIE1pY2hlbGUgQmluaSBtb2RpZmllZCB0aGUgTlRMTSBjb2RlIHRvIHdvcmsgZm9yIGhpcyAid2VpcmQgSUlTIGNhc2UiCiAgKGh0dHA6Ly9jdXJsLmhheHguc2UvbWFpbC9saWItMjAwNi0wMi8wMTU0Lmh0bWwpIGJ5IGFkZGluZyB0aGUgTlRMTSBoYXNoCiAgZnVuY3Rpb24gaW4gYWRkaXRpb24gdG8gdGhlIExNIG9uZSBhbmQgbWFraW5nIHNvbWUgb3RoZXIgYWRqdXN0bWVudHMgaW4gdGhlCiAgb3JkZXIgdGhlIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgZGF0YSBibG9jayBhcmUgc2VudCBpbiB0aGUgVHlwZS0yIHJlcGx5LgogIEluc3BpcmF0aW9uIGZvciB0aGlzIHdvcmsgd2FzIHRha2VuIGZyb20gdGhlIEZpcmVmb3ggTlRMTSBpbXBsZW1lbnRhdGlvbi4KCiAgSSBlZGl0ZWQgdGhlIGV4aXN0aW5nIDIxKCEpIE5UTE0gdGVzdCBjYXNlcyB0byBydW4gZmluZSB3aXRoIHRoZXNlIG5ld3MuIER1ZQogIHRvIHRoZSBmYWN0IHRoYXQgd2Ugbm93IHByb3Blcmx5IGluY2x1ZGUgdGhlIGhvc3QgbmFtZSBpbiB0aGUgVHlwZS0yIG1lc3NhZ2UKICB0aGUgdGVzdCBjYXNlcyBub3cgb25seSBjb21wYXJlIHBhcnRzIG9mIHRoYXQgY2h1bmsuCgpEYW5pZWwgKDI4IE1hcmNoIDIwMDYpCi0gIzE0NTE5MjkgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0NTE5MjkpIGRldGFpbGVkIGEgYnVnIHRoYXQKICBvY2N1cnJlZCB3aGVuIGFza2luZyBsaWJjdXJsIHRvIGZvbGxvdyBIVFRQIHJlZGlyZWN0cyBhbmQgdGhlIG9yaWdpbmFsIFVSTAogIGhhZCBtb3JlIHRoYW4gb25lIHF1ZXN0aW9uIG1hcmsgKD8pLiBBZGRlZCB0ZXN0IGNhc2UgMjc2IHRvIHZlcmlmeS4KCkRhbmllbCAoMjcgTWFyY2ggMjAwNikKLSBEYXZpZCBCeXJvbiBmb3VuZCBhIHByb2JsZW0gbXVsdGlwbGUgLWQgb3B0aW9ucyB3aGVuIGxpYmN1cmwgd2FzIGJ1aWx0IHdpdGgKICAtLWVuYWJsZS1kZWJ1ZywgYXMgdGhlbiBjdXJsIHVzZWQgZnJlZSgpIG9uIG1lbW9yeSBhbGxvY2F0ZWQgYm90aCB3aXRoCiAgbm9ybWFsIG1hbGxvYygpIGFuZCB3aXRoIGxpYmN1cmwtcHJvdmlkZWQgZnVuY3Rpb25zLCB3aGVuIHRoZSBsYXR0ZXIgTVVTVCBiZQogIGZyZWVkIHdpdGggY3VybF9mcmVlKCkgaW4gZGVidWcgYnVpbGRzLgoKRGFuaWVsICgyNiBNYXJjaCAyMDA2KQotIFRvciBBcm50c2VuIGZpZ3VyZWQgb3V0IHRoYXQgVEZUUCB3YXMgYnJva2VuIG9uIGEgbG90IG9mIHN5c3RlbXMgc2luY2Ugd2UKICBjYWxsZWQgYmluZCgpIHdpdGggYSB0b28gYmlnIGFyZ3VtZW50IGluIHRoZSAzcmQgcGFyYW1ldGVyIGFuZCBhdCBsZWFzdAogIFRydTY0LCBBSVggYW5kIElSSVggc2VlbSB0byBiZSB2ZXJ5IHBpY2t5IGFib3V0IGl0LgoKRGFuaWVsICgyMSBNYXJjaCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGFkZGVkIENVUkxJTkZPX0ZUUF9FTlRSWV9QQVRILgoKLSBYYXZpZXIgQm91Y2hvdXggbWFkZSB0aGUgU1NMIGNvbm5lY3Rpb24gbm9uLWJsb2NraW5nIGZvciB0aGUgbXVsdGkgaW50ZXJmYWNlCiAgKHdoZW4gdXNpbmcgT3BlblNTTCkuCgotIFRvciBBcm50c2VuIGZpeGVkIHRoZSBBSVggVG9vbGJveCBSUE0gc3BlYwoKRGFuaWVsICgyMCBNYXJjaCAyMDA2KQotIERhdmlkIE1jQ3JlZWR5IGZpeGVkIGxpYmN1cmwgdG8gbm8gbG9uZ2VyIGlnbm9yZSBBVVRIIGZhaWx1cmVzIGFuZCBub3cgaXQKICByZWFjdHMgcHJvcGVybHkgYWNjb3JkaW5nIHRvIHRoZSBDVVJMT1BUX0ZUUF9TU0wgc2V0dGluZy4KCi0gRGFuIEZhbmRyaWNoIGZpeGVkIHR3byBURlRQIHByb2JsZW1zOiBGaXhlZCBhIGJ1ZyB3aGVyZWJ5IGEgcmVjZWl2ZWQgZmlsZQogIHdob3NlIGxlbmd0aCB3YXMgYSBtdWx0aXBsZSBvZiA1MTIgYnl0ZXMgY291bGQgaGF2ZSByYW5kb20gZ2FyYmFnZQogIGFwcGVuZGVkLiBBbHNvLCBzdG9wIHByb2Nlc3NpbmcgVEZUUCBwYWNrZXRzIHdoaWNoIGFyZSB0b28gc2hvcnQgdG8gYmUKICBsZWdhbC4KCi0gSWxqYSB2YW4gU3BydW5kZWwgcmVwb3J0ZWQgYSBwb3NzaWJsZSBjcmFzaCBpbiB0aGUgY3VybCB0b29sIHdoZW4gdXNpbmcKICAiY3VybCBob3N0d2l0aG91dHNsYXNoIC1kIGRhdGEgLUciCgpWZXJzaW9uIDcuMTUuMyAoMjAgTWFyY2ggMjAwNikKCkRhbmllbCAoMjAgTWFyY2ggMjAwNikKLSBWVUxORVJBQklMSVRZIHJlcG9ydGVkIHRvIHVzIGJ5IFVsZiBIYXJuaGFtbWFyLgoKICBsaWJjdXJsIHVzZXMgdGhlIGdpdmVuIGZpbGUgcGFydCBvZiBhIFRGVFAgVVJMIGluIGEgbWFubmVyIHRoYXQgYWxsb3dzIGEKICBtYWxpY2lvdXMgdXNlciB0byBvdmVyZmxvdyBhIGhlYXAtYmFzZWQgbWVtb3J5IGJ1ZmZlciBkdWUgdG8gdGhlIGxhY2sgb2YKICBib3VuZGFyeSBjaGVjay4KCiAgVGhpcyBvdmVyZmxvdyBoYXBwZW5zIGlmIHlvdSBwYXNzIGluIGEgVVJMIHdpdGggYSBURlRQIHByb3RvY29sIHByZWZpeAogICgidGZ0cDovLyIpLCB1c2luZyBhIHZhbGlkIGhvc3QgYW5kIGEgcGF0aCBwYXJ0IHRoYXQgaXMgbG9uZ2VyIHRoYW4gNTEyCiAgYnl0ZXMuCgogIFRoZSBhZmZlY3RlZCBmbGF3IGNhbiBiZSB0cmlnZ2VyZWQgYnkgYSByZWRpcmVjdCwgaWYgY3VybC9saWJjdXJsIGlzIHRvbGQgdG8KICBmb2xsb3cgcmVkaXJlY3RzIGFuZCBhbiBIVFRQIHNlcnZlciBwb2ludHMgdGhlIGNsaWVudCB0byBhIHRmdHAgVVJMIHdpdGggdGhlCiAgY2hhcmFjdGVyaXN0aWNzIGRlc2NyaWJlZCBhYm92ZS4KCiAgVGhlIENvbW1vbiBWdWxuZXJhYmlsaXRpZXMgYW5kIEV4cG9zdXJlcyAoQ1ZFKSBwcm9qZWN0IGhhcyBhc3NpZ25lZCB0aGUgbmFtZQogIENWRS0yMDA2LTEwNjEgdG8gdGhpcyBpc3N1ZS4KCkRhbmllbCAoMTYgTWFyY2ggMjAwNikKLSBUb3IgQXJudHNlbiBwcm92aWRlZCBhIFJQTSBzcGVjIGZpbGUgZm9yIEFJWCBUb29sYm94LCB0aGF0IG5vdyBpcyBpbmNsdWRlZAogIGluIHRoZSByZWxlYXNlIGFyY2hpdmUuCgpEYW5pZWwgKDE0IE1hcmNoIDIwMDYpCi0gRGF2aWQgTWNDcmVlZHkgZml4ZWQ6CgogIGEgYmFkIFNTTCBlcnJvciBtZXNzYWdlIHdoZW4gT3BlblNTTCBjZXJ0aWZpY2F0ZXMgYXJlIHZlcmlmaWVkIGZpbmUuCgogIGEgbWlzc2luZyByZXR1cm4gY29kZSBhc3NpZ25tZW50IGluIHRoZSBGVFAgY29kZQoKRGFuaWVsICg3IE1hcmNoIDIwMDYpCi0gTWFya3VzIEtvZXR0ZXIgZmlsZWQgZGViaWFuIGJ1ZyByZXBvcnQgIzM1NTcxNSB3aGljaCBpZGVudGlmaWVkIGEgcHJvYmxlbQogIHdpdGggdGhlIG11bHRpIGludGVyZmFjZSBhbmQgbXVsdGktcGFydCBmb3JtcG9zdHMuIFRoZSBmaXggZnJvbSBGZWJydWFyeQogIDIybmQgY291bGQgbWFrZSB0aGUgQ3VybF9kb25lKCkgZnVuY3Rpb24gZ2V0IGNhbGxlZCB0d2ljZSBvbiB0aGUgc2FtZQogIGNvbm5lY3Rpb24gYW5kIGl0IHdhcyBub3QgZGVzaWduZWQgZm9yIHRoYXQgYW5kIHRodXMgdHJpZWQgdG8gY2FsbCBmcmVlKCkgb24KICBhbiBhbHJlYWR5IGZyZWVkIG1lbW9yeSBhcmVhIQoKLSBQZXRlciBIZXVjaGVydCBtYWRlIHN1cmUgdGhlIENVUkxGVFBTU0xfQ09OVFJPTCBzZXR0aW5nIGZvciBDVVJMT1BUX0ZUUF9TU0wKICBpcyB1c2VkIHByb3Blcmx5LgoKRGFuaWVsICg2IE1hcmNoIDIwMDYpCi0gTG90cyBvZiB1c2VycyBvbiBXaW5kb3dzIGhhdmUgcmVwb3J0ZWQgZ2V0dGluZyB0aGUgIlNTTDogY291bGRuJ3Qgc2V0CiAgY2FsbGJhY2siIGVycm9yIG1lc3NhZ2Ugc28gSSd2ZSBub3cgbWFkZSB0aGUgc2V0dGluZyBvZiB0aGF0IGNhbGxiYWNrIG5vdCBiZQogIGFzIGNyaXRpY2FsIGFzIGJlZm9yZS4gVGhlIGZ1bmN0aW9uIGlzIG9ubHkgdXNlZCBmb3IgYWRkaXRpb25hbCBsb2dnZ2luZy8KICB0cmFjZSBhbnl3YXkgc28gYSBmYWlsdXJlIGp1c3QgbWVhbnMgc2xpZ2h0bHkgbGVzcyBkYXRhLiBJdCBzaG91bGQgc3RpbGwgYmUKICBhYmxlIHRvIHByb2NlZWQgYW5kIGNvbm5lY3QgZmluZSB0byB0aGUgc2VydmVyLgoKRGFuaWVsICg0IE1hcmNoIDIwMDYpCi0gVGhvbWFzIEtsYXVzbmVyIHByb3ZpZGVkIGEgcGF0Y2ggd3JpdHRlbiBieSBUb2RkIFZpZXJsaW5nIGluIGJ1ZyByZXBvcnQKICAjMTQ0MjQ3MSB0aGF0IGZpeGVzIGEgYnVpbGQgcHJvYmxlbSBvbiBJbnRlcml4LgoKRGFuaWVsICgyIE1hcmNoIDIwMDYpCi0gRlRQIHVwbG9hZCB3aXRob3V0IGEgZmlsZSBuYW1lIHBhcnQgaW4gdGhlIFVSTCBub3cgY2F1c2VzCiAgY3VybF9lYXN5X3BlcmZvcm0oKSB0byByZXR1cm4gQ1VSTEVfVVJMX01BTEZPUk1BVC4gUHJldmlvdXNseSBpdCBhbGxvd2VkIHRoZQogIHVwbG9hZCBidXQgbmFtZWQgdGhlIGZpbGUgIihuaWwpIiAod2l0aG91dCB0aGUgcXVvdGVzKS4gVGVzdCBjYXNlIDUyNAogIHZlcmlmaWVzLgoKLSBBZGRlZCBhIGNoZWNrIGZvciBnZXRwcm90b2J5bmFtZSBpbiBjb25maWd1cmUgc28gdGhhdCBpdCdsbCBiZSB1c2VkLCB0aGFua3MKICB0byBHaXNsZSBWYW5lbSdzIGNoYW5nZSB0aGUgb3RoZXIgZGF5LgoKRGFuaWVsICgyOCBGZWJydWFyeSAyMDA2KQotIERhbiBGYW5kcmljaCBwcmV2ZW50ZWQgY3VybCBmcm9tIGdldHRpbmcgc3R1Y2sgaW4gYW4gZW5kbGVzcyBsb29wIGluIGNhc2Ugd2UKICBhcmUgb3V0IG9mIGZpbGUgaGFuZGxlcyB2ZXJ5IGVhcmx5IGluIGN1cmwncyBjb2RlIHdoZXJlIGl0IG1ha2VzIHN1cmUgdGhhdAogIDAsIDEgYW5kIDIgYXJlbid0IGdvbm5hIGJlIHVzZWQgYnkgdGhlIGxpYiBmb3IgdHJhbnNmZXJzLgoKRGFuaWVsICgyNyBGZWJydWFyeSAyMDA2KQotIE1hcnR5IEt1aHJ0IHBvaW50ZWQgb3V0IHRoYXQgdGhlcmUgd2VyZSB0d28gVk1TLXNwZWNpZmljIGZpbGVzIG1pc3NpbmcgaW4KICB0aGUgcmVsZWFzZSBhcmNoaXZlLgoKVmVyc2lvbiA3LjE1LjIgKDI3IEZlYnJ1YXJ5IDIwMDYpCgpEYW5pZWwgKDIyIEZlYnJ1YXJ5IDIwMDYpCi0gTG90cyBvZiB3b3JrIGFuZCBhbmFseXNpcyBieSAieGJ4X19fIiBpbiBidWcgIzE0MzE3NTAKICAoaHR0cDovL2N1cmwuaGF4eC5zZS9idWcvdmlldy5jZ2k/aWQ9MTQzMTc1MCkgaGVscGVkIG1lIGlkZW50aWZ5IGFuZCBmaXggdHdvCiAgZGlmZmVyZW50IGJ1dCByZWxhdGVkIGJ1Z3M6CgogIDEpIFJlbW92aW5nIGFuIGVhc3kgaGFuZGxlIGZyb20gYSBtdWx0aSBoYW5kbGUgYmVmb3JlIHRoZSB0cmFuc2ZlciBpcyBkb25lCiAgICAgY291bGQgbGVhdmUgYSBjb25uZWN0aW9uIGluIHRoZSBjb25uZWN0aW9uIGNhY2hlIGZvciB0aGF0IGhhbmRsZSB0aGF0IGlzCiAgICAgaW4gYSBzdGF0ZSB0aGF0IGlzbid0IHN1aXRhYmxlIGZvciByZS11c2UuIEEgc3Vic2VxdWVudCByZS11c2UgY291bGQgdGhlbgogICAgIHJlYWQgZnJvbSBhIE5VTEwgcG9pbnRlciBhbmQgc2VnZmF1bHQuCgogIDIpIFdoZW4gYW4gZWFzeSBoYW5kbGUgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbXVsdGkgaGFuZGxlLCB0aGVyZSBjb3VsZCBiZSBhbgogICAgIG91dHN0YW5kaW5nIGMtYXJlcyBETlMgbmFtZSByZXNvbHZlIHJlcXVlc3QuIFdoZW4gdGhlIHJlc3BvbnNlIGFycml2ZWQsCiAgICAgaXQgY2F1c2VkIGhhdm9jIHNpbmNlIHRoZSBjb25uZWN0aW9uIHN0cnVjdCBpdCAiYmVsb25nZWQiIHRvIGNvdWxkJ3ZlCiAgICAgYmVlbiBmcmVlZCBhbHJlYWR5LgoKICBOb3cgQ3VybF9kb25lKCkgaXMgY2FsbGVkIHdoZW4gYW4gZWFzeSBoYW5kbGUgaXMgcmVtb3ZlZCBmcm9tIGEgbXVsdGkgaGFuZGxlCiAgcHJlLW1hdHVyZWx5ICh0aGF0IGlzLCBiZWZvcmUgdGhlIHRyYW5zZmVyIHdhcyBjb21wbHRldGVkKS4gQ3VybF9kb25lKCkgYWxzbwogIG1ha2VzIHN1cmUgdG8gY2FuY2VsIGFsbCAoaWYgYW55KSBvdXRzdGFuZGluZyBjLWFyZXMgcmVxdWVzdHMuCgpEYW5pZWwgKDIxIEZlYnJ1YXJ5IDIwMDYpCi0gUGV0ZXIgU3UgYWRkZWQgc3VwcG9ydCBmb3IgU09DS1M0IHByb3hpZXMuIEVuYWJsZSB0aGlzIGJ5IHNldHRpbmcgdGhlIHByb3h5CiAgdHlwZSB0byB0aGUgYWxyZWFkeSBwcm92aWRlZCB0eXBlIENVUkxQUk9YWV9TT0NLUzQuCgogIEkgYWRkZWQgYSAtLXNvY2tzNCBvcHRpb24gdGhhdCB3b3JrcyBsaWtlIHRoZSBjdXJyZW50IC0tc29ja3M1IG9wdGlvbiBidXQKICBpbnN0ZWFkIHVzZSB0aGUgc29ja3M0IHByb3RvY29sLgoKRGFuaWVsICgyMCBGZWJydWFyeSAyMDA2KQotIFNobXVsaWsgUmVnZXYgZml4ZWQgYW4gaXNzdWUgd2l0aCBtdWx0aS1wYXNzIGF1dGhlbnRpY2F0aW9uIGFuZCBjb21wcmVzc2VkCiAgY29udGVudCB3aGVuIGxpYmN1cmwgZGlkbid0IGhvbm9yIHRoZSBpbnRlcm5hbCBpZ25vcmVib2R5IGZsYWcuCgpEYW5pZWwgKDE4IEZlYnJ1YXJ5IDIwMDYpCi0gVWxmIEjkcm5oYW1tYXIgZml4ZWQgYSBmb3JtYXQgc3RyaW5nIChwcmludGYgc3R5bGUpIHByb2JsZW0gaW4gdGhlIE5lZ290aWF0ZQogIGNvZGUuIEl0IHNob3VsZCBob3dldmVyIG5vdCBiZSB0aGUgY2F1c2Ugb2YgYW55IHRyb3VibGVzLiBIZSBhbHNvIGZpeGVkIGEKICBmZXcgc2ltaWxhciBwcm9ibGVtcyBpbiB0aGUgSFRUUCB0ZXN0IHNlcnZlciBjb2RlLgoKRGFuaWVsICgxNyBGZWJydWFyeSAyMDA2KQotIFNobXVsaWsgUmVnZXYgcHJvdmlkZWQgYSBmaXggZm9yIHRoZSBETlMgY2FjaGUgd2hlbiB1c2luZyBzaG9ydCBsaWZlIHRpbWVzLAogIGFzIHByZXZpb3VzbHkgaXQgY291bGQgYmUgaG9sZGluZyBvbiB0byBvbGQgY2FjaGVkIGVudHJpZXMgbG9uZ2VyIHRoYW4KICByZXF1ZXN0ZWQuCgpEYW5pZWwgKDExIEZlYnJ1YXJ5IDIwMDYpCi0gS2FybCBNb2VyZGVyIGFkZGVkIHRoZSBDVVJMT1BUX0NPTk5FQ1RfT05MWSBhbmQgQ1VSTElORk9fTEFTVFNPQ0tFVCBvcHRpb25zCiAgdGhhdCBhbiBhcHAgY2FuIHVzZSB0byBsZXQgbGliY3VybCBvbmx5IGNvbm5lY3QgdG8gYSByZW1vdGUgaG9zdCBhbmQgdGhlbgogIGV4dHJhY3QgdGhlIHNvY2tldCBmcm9tIGxpYmN1cmwuIGxpYmN1cmwgd2lsbCB0aGVuIG5vdCBhdHRlbXB0IHRvIGRvIGFueQogIHRyYW5zZmVyIGF0IGFsbCBhZnRlciB0aGUgY29ubmVjdCBpcyBkb25lLgoKLSBLZW50IEJvb3J0eiBpbXByb3ZlZCB0aGUgY29uZmlndXJlIGNoZWNrIGZvciBHbnVUTFMgdG8gcHJvcGVybHkgc2V0IExJQlMKICBpbnN0ZWFkIG9mIExERkxBR1MuCgpEYW5pZWwgKDggRmVicnVhcnkgMjAwNikKLSBQaGlsaXBwZSBWYXVjaGVyIHByb3ZpZGVkIGEgYnJpbGxpYW50IHBpZWNlIG9mIHRlc3QgY29kZSB0aGF0IHNob3cgYSBwcm9ibGVtCiAgd2l0aCByZS11c2VkIEZUUCBjb25uZWN0aW9ucy4gSWYgdGhlIHNlY29uZCByZXF1ZXN0IG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24KICB3YXMgc2V0IG5vdCB0byBmZXRjaCBhICJib2R5IiwgbGliY3VybCBjb3VsZCBnZXQgY29uZnVzZWQgYW5kIGNvbnNpZGVyIGl0IGFuCiAgYXR0ZW1wdCB0byB1c2UgYSBkZWFkIGNvbm5lY3Rpb24gYW5kIHdvdWxkIGdvIGFjdGluZyBtaWdodHkgc3RyYW5nZS4KCkRhbmllbCAoMiBGZWJydWFyeSAyMDA2KQotIE1ha2UgLS1saW1pdC1yYXRlIFtudW1dIG1lYW4gYnl0ZXMuIEl0IHVzZWQgdG8gYmUgdGhhdCBidXQgaXQgYnJva2UgaW4gbXkKICBjaGFuZ2UgZG9uZSBpbiBOb3ZlbWJlciAyMDA1LgoKRGFuaWVsICgzMCBKYW51YXJ5IDIwMDYpCi0gQWRkZWQgQ1VSTE9QVF9MT0NBTFBPUlQgYW5kIENVUkxPUFRfTE9DQUxQT1JUUkFOR0UgdG8gbGliY3VybC4gU2V0IHdpdGggdGhlCiAgY3VybCB0b29sIHdpdGggLS1sb2NhbC1wb3J0LiBQbGFpbiBhbmQgc2ltcGx5IHNldCB0aGUgcmFuZ2Ugb2YgcG9ydHMgdG8gYmluZAogIHRoZSBsb2NhbCBlbmQgb2YgY29ubmVjdGlvbnMgdG8uIEltcGxlbWVudGVkIG9uIHRvIHBvcHVsYXIgZGVtYW5kLgoKLSBCYXNlZCBvbiBhbiBlcnJvciByZXBvcnQgYnkgUGhpbGlwcGUgVmF1Y2hlciwgd2Ugbm8gbG9uZ2VyIGNvdW50IGEgcmV0cmllZAogIGNvbm5lY3Rpb24gc2V0dXAgYXMgYSBmb2xsb3ctcmVkaXJlY3QuIEl0IHR1cm5zIG91dCAxKSB0aGlzIGZhaWxzIHdoZW4gYSBGVFAKICBjb25uZWN0aW9uIGlzIHJlLXNldHVwIGFuZCAyKSBpdCBkb2VzIG1ha2UgdGhlIG1heC1yZWRpcnMgY291bnRlciBiZWhhdmUKICB3cm9uZy4KCkRhbmllbCAoMjQgSmFudWFyeSAyMDA2KQotIE1pY2hhbCBNYXJlayBwcm92aWRlZCBhIHBhdGNoIGZvciBGVFAgdGhhdCBtYWtlcyBsaWJjdXJsIGNvbnRpbnVlIHRvIHRyeQogIFBBU1YgZXZlbiBhZnRlciBFUFNWIHJldHVybmVkIGEgcG9zaXRpdmUgcmVzcG9uc2UgY29kZSwgaWYgbGliY3VybCBmYWlsZWQgdG8KICBjb25uZWN0IHRvIHRoZSBwb3J0IG51bWJlciB0aGUgRVBTViByZXNwb25zZSBzYWlkLiBPYnZpb3VzbHkgc29tZSBwZW9wbGUgYXJlCiAgZ29pbmcgdGhyb3VnaCBwcm90b2NvbC1zZW5zaXRpdmUgZmlyZXdhbGxzIChvciBzaW1pbGFyKSB0aGF0IGRvbid0CiAgdW5kZXJzdGFuZCBFUFNWIGFuZCB0aGVuIHRoZXkgZG9uJ3QgYWxsb3cgdGhlIHNlY29uZCBjb25uZWN0aW9uIHVubGVzcyBQQVNWCiAgd2FzIHVzZWQuIFRoaXMgYWxzbyBjYWxsZWQgZm9yIGEgbWlub3IgZml4IG9mIHRlc3QgY2FzZSAyMzguCgpEYW5pZWwgKDIwIEphbnVhcnkgMjAwNikKLSBEdWFuZSBDYXRoZXkgd2FzIG9uZSBvZiBvdXIgZnJpZW5kcyB3aG8gcmVwb3J0ZWQgdGhhdCBjdXJsIC1QIFtJUF0KICAoQ1VSTE9QVF9GVFBQT1JUKSBkaWRuJ3Qgd29yayBmb3IgaXB2Ni1lbmFiZWQgY3VybHMgaWYgdGhlIElQIHdhc24ndCBhCiAgIm5hdGl2ZSIgSVAgd2hpbGUgaXQgd29ya3MgZmluZSBmb3IgaXB2Ni1kaXNhYmxlZCBidWlsZHMhCgogIEluIHRoZSBwcm9jZXNzIG9mIGZpeGluZyB0aGlzLCBJIHJlbW92ZWQgdGhlIHN1cHBvcnQgZm9yIExQUlQgc2luY2UgSSBjYW4ndAogIHRoaW5rIG9mIG1hbnkgcmVhc29ucyB0byBrZWVwIGRvaW5nIGl0IGFuZCBhc2tpbmcgb24gdGhlIG1haWxpbmcgbGlzdCBkaWRuJ3QKICByZXZlYWwgYW55b25lIGVsc2UgdGhhdCBjb3VsZCBlaXRoZXIuIFRoZSBjb2RlIHRoYXQgc2VuZHMgRVBSVCBhbmQgUE9SVCBpcwogIG5vdyBhbHNvIGEgbG90IHNpbXBsZXIgdGhhbiBiZWZvcmUgKElNSE8pLgoKRGFuaWVsICgxOSBKYW51YXJ5IDIwMDYpCi0gSm9uIFR1cm5lciBwb2ludGVkIG91dCB0aGF0IGRvaW5nIC1QIFtob3N0bmFtZV0gKENVUkxPUFRfRlRQUE9SVCkgd2l0aCBjdXJsCiAgKGJ1aWx0IGlwdjQtb25seSkgZGlkbid0IHdvcmsuCgpEYW5pZWwgKDE4IEphbnVhcnkgMjAwNikKLSBBcyByZXBvcnRlZCBpbiBidWcgIzE0MDg3NDIgKGh0dHA6Ly9jdXJsLmhheHguc2UvYnVnL3ZpZXcuY2dpP2lkPTE0MDg3NDIpLAogIHRoZSBjb25maWd1cmUgc2NyaXB0IGNvbXBsYWluZWQgYWJvdXQgYSBtaXNzaW5nICJtaXNzaW5nIiBzY3JpcHQgaWYgeW91IHJhbgogIGNvbmZpZ3VyZSB3aXRoaW4gYSBwYXRoIHdob3NlIG5hbWUgaW5jbHVkZWQgb25lIG9yIG1vcmUgc3BhY2VzLiBUaGlzIGlzIGR1ZQogIHRvIGEgZmxhdyBpbiBhdXRvbWFrZSAoMS45LjYgYW5kIGVhcmxpZXIpLiBJJ3ZlIG5vdyB3b3JrZWQgYXJvdW5kIGl0IGJ5CiAgaW5jbHVkaW5nIGFuICJvdmVybG9hZGVkIiB2ZXJzaW9uIG9mIHRoZSBBTV9NSVNTSU5HX0hBU19SVU4gc2NyaXB0IHRoYXQnbGwKICBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIG9uZSBhdXRvbWFrZSBzaGlwcyB3aXRoLiBUaGlzIGtsdWRnZSBuZWVkcyB0byBiZQogIHJlbW92ZWQgb25jZSB3ZSBnZXQgYW4gYXV0b21ha2UgdmVyc2lvbiB3aXRoIHRoaXMgcHJvYmxlbSBjb3JyZWN0ZWQuCiAgUG9zc2libHkgd2UnbGwgdGhlbiBuZWVkIHRvIGNvbnZlcnQgdGhpcyBpbnRvIGEga2x1ZGdlIGRlcGVuZGluZyBvbiB3aGF0CiAgYXV0b21ha2UgdmVyc2lvbiB0aGF0IGlzIHVzZWQgYW5kIHRoYXQgaXMgZ29ubmEgYmUgcGFpbmZ1bCBhbmQgSSBkb24ndCBldmVuCiAgd2FudCB0byB0aGluayBhYm91dCB0aGF0IG5vdy4uLiEKCkRhbmllbCAoMTcgSmFudWFyeSAyMDA2KQotIERhdmlkIFNoYXc6IEhlcmUgaXMgdGhlIGxhdGVzdCBsaWJjdXJsLm00IGF1dG9jb25mIHRlc3RzLiBJdCBpcyB1cGRhdGVkIHdpdGgKICB0aGUgbGF0ZXN0IGZlYXR1cmVzIGFuZCBwcm90b2NvbHMgdGhhdCBsaWJjdXJsIHN1cHBvcnRzIGFuZCBoYXMgYSBtaW5vciBmaXgKICB0byBiZXR0ZXIgZGVhbCB3aXRoIHRoZSBvYnNjdXJlIGNhc2Ugd2hlcmUgc29tZW9uZSBoYXMgbW9yZSB0aGFuIG9uZSBsaWJjdXJsCiAgaW5zdGFsbGVkIGF0IHRoZSBzYW1lIHRpbWUuCgpEYW5pZWwgKDE2IEphbnVhcnkgMjAwNikKLSBEYXZpZCBTaGF3IGZpbmFsbHkgcmVtb3ZlZCBhbGwgdHJhY2VzIG9mIEdvcGhlciBhbmQgd2UgYXJlIG5vdyBvZmZpY2lhbGx5CiAgbm90IHN1cHBvcnRpbmcgaXQuIEl0IGhhc24ndCBiZWVuIGZ1bmN0aW9uaW5nIGZvciB5ZWFycyBhbnl3YXksIHNvIHRoaXMgaXMKICBqdXN0IGZpbmFsbHkgc3RhdGluZyB3aGF0IGFscmVhZHkgd2FzIHRydWUuIEFuZCBhIGNsZWFudXAgYXQgdGhlIHNhbWUgdGltZS4KCi0gQnJ5YW4gSGVuZGVyc29uIHR1cm5lZCB0aGUgJ2luaXRpYWxpemVkJyB2YXJpYWJsZSBmb3IgY3VybF9nbG9iYWxfaW5pdCgpCiAgaW50byBhIGNvdW50ZXIsIGFuZCB0aHVzIHlvdSBjYW4gbm93IGRvIG11bHRpcGxlIGN1cmxfZ2xvYmFsX2luaXQoKSBhbmQgeW91CiAgYXJlIHRoZW4gc3VwcG9zZWQgdG8gZG8gdGhlIHNhbWUgYW1vdW50IG9mIGNhbGxzIHRvIGN1cmxfZ2xvYmFsX2NsZWFudXAoKS4KICBCcnlhbiBoYXMgYWxzbyB1cGRhdGVkIHRoZSBkb2NzIGFjY29yZGluZ2x5LgoKRGFuaWVsICgxMyBKYW51YXJ5IDIwMDYpCi0gQW5kcmV3IEJlbmhhbSBmaXhlZCBhIHJhY2UgY29uZGl0aW9uIGluIHRoZSB0ZXN0IHN1aXRlIHRoYXQgY291bGQgY2F1c2UgdGhlCiAgdGVzdCBzY3JpcHQgdG8ga2lsbCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBjdXJyZW50IHByb2Nlc3MgZ3JvdXAhCgpEYW5pZWwgKDEyIEphbnVhcnkgMjAwNikKLSBNaWNoYWVsIEphaG46CgogIEZpeGVkIEZUUF9TS0lQX1BBU1ZfSVAgYW5kIEZUUF9VU0VfRVBTViB0byAiZG8gcmlnaHQiIHdoZW4gdXNlZCBvbiBGVFAgdGhydQogIEhUVFAgcHJveHkuCgogIEZpeGVkIFBST1hZVFVOTkVMIHRvIHdvcmsgZmluZSB3aGVuIHlvdSBkbyBmdHAgdGhyb3VnaCBhIHByb3h5LiAgSXQgd291bGQKICBwcmV2aW91c2x5IG92ZXJ3cml0ZSBpbnRlcm5hbCBtZW1vcnkgYW5kIGNhdXNlIHVucHJlZGljdGVkIGJlaGF2aW91ciEKCkRhbmllbCAoMTEgSmFudWFyeSAyMDA2KQotIEkgZGVjaWRlZCB0byBkb2N1bWVudCB0aGUgInNlY3JldCBvcHRpb24iIGhlcmUgbm93LCBhcyBJJ3ZlIHJlY2VpdmVkICpOTyoKICBmZWVkYmFjayBhdCBhbGwgb24gbXkgbWFpbGluZyBsaXN0IHJlcXVlc3RzIGZyb20gTm92ZW1iZXIgMjAwNToKCiAgSSdtIGxvb2tpbmcgZm9yIGZlZWRiYWNrIGFuZCBjb21tZW50cy4gSSBhZGRlZCBzb21lIGV4cGVyaW1lbnRhbCBjb2RlIHRoZQogIG90aGVyIGRheSwgdGhhdCBhbGxvd3MgYSBsaWJjdXJsIHVzZXIgdG8gc2VsZWN0IHdoYXQgbWV0aG9kIGxpYmN1cmwgc2hvdWxkCiAgdXNlIHRvIHJlYWNoIGEgZmlsZSBvbiBhIEZUUChTKSBzZXJ2ZXIuCgogIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgaW4gQ1ZTIGNvZGUgYW5kIGluIHJlY2VudCBkYWlseSBzbmFwc2hvdHMuCgogIExldCBtZSBleHBsYWluLi4uCgogIFRoZSBjdXJyZW50IG5hbWUgZm9yIHRoZSBvcHRpb24gaXMgQ1VSTE9QVF9GVFBfRklMRU1FVEhPRCAoLS1mdHAtbWV0aG9kIGZvcgogIHRoZSBjb21tYW5kIGxpbmUgdG9vbCkgYW5kIHlvdSBzZXQgaXQgdG8gYSBsb25nICh0aGVyZSBhcmUgY3VycmVubHkgbm8KICBkZWZpbmVzIGZvciB0aGUgYXJndW1lbnQgdmFsdWVzLCBqdXN0IHBsYWluIG51bWVyaWNhbHMpLiBZb3UgY2FuIHNldCB0aHJlZQogIGRpZmZlcmVudCAibWV0aG9kcyIgdGhhdCBkbyB0aGlzOgoKICAxIG11bHRpY3dkIC0gbGlrZSB0b2RheSwgY3VybCB3aWxsIGRvIGEgc2luZ2xlIENXRCBvcGVyYXRpb24gZm9yIGVhY2ggcGF0aAogICAgICAgICAgIHBhcnQgaW4gdGhlIGdpdmVuIFVSTC4gRm9yIGRlZXAgaGllcmFyY2hpZXMgdGhpcyBtZWFucyB2ZXJ5IG1hbnkKICAgICAgICAgICBjb21tYW5kcy4gVGhpcyBpcyBob3cgUkZDMTczOCBzYXlzIGl0IHNob3VsZCBiZSBkb25lLiBUaGlzIGlzIHRoZQogICAgICAgICAgIGRlZmF1bHQuCgogIDIgbm9jd2QgLSBubyBDV0QgYXQgYWxsIGlzIGRvbmUsIGN1cmwgd2lsbCBkbyBTSVpFLCBSRVRSLCBTVE9SIGV0YyBhbmQgZ2l2ZQogICAgICAgICAgIGEgZnVsbCBwYXRoIHRvIHRoZSBzZXJ2ZXIuCgogIDMgc2luZ2xlY3dkIC0gbWFrZSBvbmUgQ1dEIHdpdGggdGhlIGZ1bGwgdGFyZ2V0IGRpcmVjdG9yeSBhbmQgdGhlbiBvcGVyYXRlCiAgICAgICAgICAgIG9uIHRoZSBmaWxlICJub3JtYWxseSIuCgogIChXaXRoIHRoZSBjb21tYW5kIGxpbmUgdG9vbCB5b3UgZG8gLS1mdHAtbWV0aG9kIFtNRVRIT0RdLCB3aGVyZSBbTUVUSE9EXSBpcwogIG9uZSBvZiAibXVsdGljd2QiLCAibm9jd2QiIG9yICJzaW5nbGVjd2QiLikKCiAgV2hhdCBmZWVkYmFjayBJJ20gaW50ZXJlc3RlZCBpbjoKCiAgMSAtIERvIHRoZXkgd29yayBhdCBhbGw/IERvIHlvdSBmaW5kIHNlcnZlcnMgd2hlcmUgb25lIG9mIHRoZXNlIGRvbid0IHdvcms/CgogIDIgLSBXaGF0IHdvdWxkIHByb3BlciBuYW1lcyBmb3IgdGhlIG9wdGlvbiBhbmQgaXRzIGFyZ3VtZW50cyBiZSwgaWYgd2UKICAgICAgY29uc2lkZXIgdGhpcyBmZWF0dXJlIGdvb2QgZW5vdWdoIHRvIGdldCBpbmNsdWRlZCBhbmQgZG9jdW1lbnRlZCBpbgogICAgICB1cGNvbWluZyByZWxlYXNlcz8KCiAgMyAtIFNob3VsZCB3ZSBtYWtlIGxpYmN1cmwgYWJsZSB0byAid2FsayB0aHJvdWdoIiB0aGVzZSBvcHRpb25zIGluIGNhc2Ugb2YKICAgICAgKHBhdGggcmVsYXRlZCkgZmFpbHVyZXMsIG9yIHNob3VsZCBpdCBmYWlsIGFuZCBsZXQgdGhlIHVzZXIgcmVkbyBhbnkKICAgICAgcG9zc2libGUgcmV0cmllcz8KCiAgKFRoaXMgb3B0aW9uIGlzIG5vdCBkb2N1bWVudGVkIGluIGFueSBtYW4gcGFnZSBqdXN0IHlldCBzaW5jZSBJJ20gbm90IHN1cmUKICB0aGVzZSBuYW1lcyB3aWxsIGJlIHVzZWQgb3IgaWYgdGhlIGZ1bmN0aW9uYWxpdHkgd2lsbCBlbmQgdXAgZXhhY3RseSBsaWtlCiAgdGhpcy4gIEFuZCBmb3IgdGhlIHNhbWUgcmVhc29ucyB3ZSBoYXZlIG5vIHRlc3QgY2FzZXMgZm9yIHRoZXNlIHlldC4pCgpEYW5pZWwgKDEwIEphbnVhcnkgMjAwNikKLSBXaGVuIHVzaW5nIGEgYmFkIHBhdGggb3ZlciBGVFAsIGFzIGluIHdoZW4gbGliY3VybCBjb3VsZG4ndCBDV0QgaW50byBhbGwKICBnaXZlbiBzdWJkaXJzLCBsaWJjdXJsIHdvdWxkIHN0aWxsICJyZW1lbWJlciIgdGhlIGZ1bGwgcGF0aCBhcyBpZiBpdCBpcyB0aGUKICBjdXJyZW50IGRpcmVjdG9yeSBsaWJjdXJsIGlzIGluIHNvIHRoYXQgdGhlIG5leHQgY3VybF9lYXN5X3BlcmZvcm0oKSB3b3VsZAogIGdldCByZWFsbHkgY29uZnVzZWQgaWYgaXQgdHJpZWQgdGhlIHNhbWUgcGF0aCBhZ2FpbiAtIGFzIGl0IHdvdWxkIG5vdCBpc3N1ZQogIGFueSBDV0QgY29tbWFuZHMgYXQgYWxsLCBhc3N1bWluZyBpdCBpcyBhbHJlYWR5IGluIHRoZSAicHJvcGVyIiBkaXIuCgogIFN0YXJ0aW5nIG5vdywgYSBmYWlsZWQgQ1dEIGNvbW1hbmQgc2V0cyBhIGZsYWcgdGhhdCBwcmV2ZW50cyB0aGUgcGF0aCB0byBiZQogICJyZW1lbWJlcmVkIiBhZnRlciByZXR1cm5pbmcuCgpEYW5pZWwgKDcgSmFudWFyeSAyMDA2KQotIE1pY2hhZWwgSmFobiBmaXhlZCBzbyB0aGF0IHRoZSBzZWNvbmQgQ09OTkVDVCB3aGVuIGRvaW5nIEZUUCBvdmVyIGEgSFRUUAogIHByb3h5IGFjdHVhbGx5IHVzZWQgYSBuZXcgY29ubmVjdGlvbiBhbmQgbm90IHNlbnQgdGhlIHNlY29uZCByZXF1ZXN0IG9uIHRoZQogIGZpcnN0IHNvY2tldCEKCkRhbmllbCAoNiBKYW51YXJ5IDIwMDYpCi0gQWxleGFuZGVyIExhemljIG1hZGUgdGhlIGJ1aWxkY29uZiBydW4gdGhlIGJ1aWxkY29uZiBpbiB0aGUgYXJlcyBkaXIgaWYgdGhhdAogIGlzIHByZXNlbnQgaW5zdGVhZCBvZiB0cnlpbmcgdG8gbWltaWMgdGhhdCBzY3JpcHQgaW4gY3VybCdzIGJ1aWxkY29uZgogIHNjcmlwdC4KCkRhbmllbCAoMyBKYW51YXJ5IDIwMDYpCi0gQW5kcmVzIEdhcmNpYSBtYWRlIHRoZSBURlRQIHRlc3Qgc2VydmVyIGJ1aWxkIHdpdGggbWluZ3cuCg==