LyohXHBhZ2UgZW5jb2Rlcl9ndWlkZSBBVjEgRU5DT0RFUiBHVUlERQoKXHRhYmxlb2Zjb250ZW50cwoKXHNlY3Rpb24gYXJjaGl0ZWN0dXJlX2ludHJvZHVjdGlvbiBJbnRyb2R1Y3Rpb24KClRoaXMgZG9jdW1lbnQgcHJvdmlkZXMgYW4gYXJjaGl0ZWN0dXJhbCBvdmVydmlldyBvZiB0aGUgbGliYW9tIEFWMSBlbmNvZGVyLgoKSXQgaXMgaW50ZW5kZWQgYXMgYSBoaWdoIGxldmVsIHN0YXJ0aW5nIHBvaW50IGZvciBhbnlvbmUgd2lzaGluZyB0byBjb250cmlidXRlCnRvIHRoZSBwcm9qZWN0LCB0aGF0IHdpbGwgaGVscCB0aGVtIHRvIG1vcmUgcXVpY2tseSB1bmRlcnN0YW5kIHRoZSBzdHJ1Y3R1cmUKb2YgdGhlIGVuY29kZXIgYW5kIGZpbmQgdGhlaXIgd2F5IGFyb3VuZCB0aGUgY29kZWJhc2UuCgpJdCBzdGFuZHMgYWJvdmUgYW5kIHdpbGwgd2hlcmUgbmVjZXNzYXJ5IGxpbmsgdG8gbW9yZSBkZXRhaWxlZCBmdW5jdGlvbgpsZXZlbCBkb2N1bWVudHMuCgpcc3Vic2VjdGlvbiAgYXJjaGl0ZWN0dXJlX2dlbmNvZGVjcyBHZW5lcmljIEJsb2NrIFRyYW5zZm9ybSBCYXNlZCBDb2RlY3MKCk1vc3QgbW9kZXJuIHZpZGVvIGVuY29kZXJzIGluY2x1ZGluZyBWUDgsIEguMjY0LCBWUDksIEhFVkMgYW5kIEFWMQooaW4gaW5jcmVhc2luZyBvcmRlciBvZiBjb21wbGV4aXR5KSBzaGFyZSBhIGNvbW1vbiBiYXNpYyBwYXJhZGlnbS4gVGhpcwpjb21wcmlzZXMgc2VwYXJhdGluZyBhIHN0cmVhbSBvZiByYXcgdmlkZW8gZnJhbWVzIGludG8gYSBzZXJpZXMgb2YgZGlzY3JldGUKYmxvY2tzIChvZiBvbmUgb3IgbW9yZSBzaXplcyksIHRoZW4gY29tcHV0aW5nIGEgcHJlZGljdGlvbiBzaWduYWwgYW5kIGEKcXVhbnRpemVkLCB0cmFuc2Zvcm0gY29kZWQsIHJlc2lkdWFsIGVycm9yIHNpZ25hbC4gVGhlIHByZWRpY3Rpb24gYW5kIHJlc2lkdWFsCmVycm9yIHNpZ25hbCwgYWxvbmcgd2l0aCBhbnkgc2lkZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgdGhlIGRlY29kZXIsIGFyZSB0aGVuCmVudHJvcHkgY29kZWQgYW5kIHBhY2tlZCB0byBmb3JtIHRoZSBlbmNvZGVkIGJpdHN0cmVhbS4gU2VlIEZpZ3VyZSAxOiBiZWxvdywKd2hlcmUgdGhlIGJsdWUgYmxvY2tzIGFyZSwgdG8gYWxsIGludGVudHMgYW5kIHB1cnBvc2VzLCB0aGUgbG9zc2xlc3MgcGFydHMgb2YKdGhlIGVuY29kZXIgYW5kIHRoZSByZWQgYmxvY2sgaXMgdGhlIGxvc3N5IHBhcnQuCgpUaGlzIGlzIG9mIGNvdXJzZSBhIGdyb3NzIG92ZXJzaW1wbGlmaWNhdGlvbiwgZXZlbiBpbiByZWdhcmQgdG8gdGhlIHNpbXBsZXN0Cm9mIHRoZSBhYm92ZSBjb2RlY3MuICBGb3IgZXhhbXBsZSwgYWxsIG9mIHRoZW0gYWxsb3cgZm9yIGJsb2NrIGJhc2VkCnByZWRpY3Rpb24gYXQgbXVsdGlwbGUgZGlmZmVyZW50IHNjYWxlcyAoaS5lLiBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMpIGFuZCBtYXkKdXNlIHByZXZpb3VzbHkgY29kZWQgcGl4ZWxzIGluIHRoZSBjdXJyZW50IGZyYW1lIGZvciBwcmVkaWN0aW9uIG9yIHBpeGVscyBmcm9tCm9uZSBvciBtb3JlIHByZXZpb3VzbHkgZW5jb2RlZCBmcmFtZXMuIEZ1cnRoZXIsIHRoZXkgbWF5IHN1cHBvcnQgbXVsdGlwbGUKZGlmZmVyZW50IHRyYW5zZm9ybXMgYW5kIHRyYW5zZm9ybSBzaXplcyBhbmQgcXVhbGl0eSBvcHRpbWl6YXRpb24gdG9vbHMgbGlrZQpsb29wIGZpbHRlcmluZy4KClxpbWFnZSBodG1sIGdlbmVyaWNjb2RlY2Zsb3cucG5nICIiIHdpZHRoPTcwJQoKXHN1YnNlY3Rpb24gYXJjaGl0ZWN0dXJlX2F2MV9zdHJ1Y3R1cmUgQVYxIFN0cnVjdHVyZSBhbmQgQ29tcGxleGl0eQoKQXMgcHJldmlvdXNseSBzdGF0ZWQsIEFWMSBhZG9wdHMgdGhlIHNhbWUgdW5kZXJseWluZyBwYXJhZGlnbSBhcyBvdGhlciBibG9jawp0cmFuc2Zvcm0gYmFzZWQgY29kZWNzLiBIb3dldmVyLCBpdCBpcyBtdWNoIG1vcmUgY29tcGxpY2F0ZWQgdGhhbiBwcmV2aW91cwpnZW5lcmF0aW9uIGNvZGVjcyBhbmQgc3VwcG9ydHMgbWFueSBtb3JlIGJsb2NrIHBhcnRpdGlvbmluZywgcHJlZGljdGlvbiBhbmQKdHJhbnNmb3JtIG9wdGlvbnMuCgpBVjEgc3VwcG9ydHMgYmxvY2sgcGFydGl0aW9ucyBvZiB2YXJpb3VzIHNpemVzIGZyb20gMTI4eDEyOCBwaXhlbHMgZG93biB0byA0eDQKcGl4ZWxzIHVzaW5nIGEgbXVsdGktbGF5ZXIgcmVjdXJzaXZlIHRyZWUgc3RydWN0dXJlIGFzIGlsbHVzdHJhdGVkIGluIGZpZ3VyZSAyCmJlbG93LgoKXGltYWdlIGh0bWwgYXYxcGFydGl0aW9ucy5wbmcgIiIgd2lkdGg9NzAlCgpBVjEgYWxzbyBwcm92aWRlcyA3MSBiYXNpYyBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzLCA1NiBzaW5nbGUgZnJhbWUgaW50ZXIgcHJlZGljdGlvbgptb2RlcyAoNyByZWZlcmVuY2UgZnJhbWVzIHggNCBtb2RlcyB4IDIgZm9yIE9CTUMgKG92ZXJsYXBwZWQgYmxvY2sgbW90aW9uCmNvbXBlbnNhdGlvbikpLCAxMjc2OCBjb21wb3VuZCBpbnRlciBwcmVkaWN0aW9uIG1vZGVzICh0aGF0IGNvbWJpbmUgaW50ZXIKcHJlZGljdG9ycyBmcm9tIHR3byByZWZlcmVuY2UgZnJhbWVzKSBhbmQgMzY3MDggY29tcG91bmQgaW50ZXIgLyBpbnRyYQpwcmVkaWN0aW9uIG1vZGVzLiBGdXJ0aGVybW9yZSwgaW4gYWRkaXRpb24gdG8gc2ltcGxlIGludGVyIG1vdGlvbiBlc3RpbWF0aW9uLApBVjEgYWxzbyBzdXBwb3J0cyB3YXJwZWQgbW90aW9uIHByZWRpY3Rpb24gdXNpbmcgYWZmaW5lIHRyYW5zZm9ybXMuCgpJbiB0ZXJtcyBvZiB0cmFuc2Zvcm0gY29kaW5nLCBpdCBoYXMgMTYgc2VwYXJhYmxlIDItRCB0cmFuc2Zvcm0ga2VybmVscwp7IERDVCwgQURTVCwgZkFEU1QsIElEVFggfTIgdGhhdCBjYW4gYmUgYXBwbGllZCBhdCB1cCB0byAxOSBkaWZmZXJlbnQgc2NhbGVzCmZyb20gNjR4NjQgZG93biB0byA0eDQgcGl4ZWxzLgoKV2hlbiBjb21iaW5lZCB0b2dldGhlciwgdGhpcyBtZWFucyB0aGF0IGZvciBhbnkgb25lIDh4OCBwaXhlbCBibG9jayBpbiBhCnNvdXJjZSBmcmFtZSwgdGhlcmUgYXJlIGFwcHJveGltYXRlbHkgNDUsMDAwLDAwMCBkaWZmZXJlbnQgd2F5cyB0aGF0IGl0IGNhbgpiZSBlbmNvZGVkLgoKQ29uc2VxdWVudGx5LCBBVjEgcmVxdWlyZXMgY29tcGxleCBjb250cm9sIHByb2Nlc3Nlcy4gV2hpbGUgbm90IG5lY2Vzc2FyaWx5CmEgbm9ybWF0aXZlIHBhcnQgb2YgdGhlIGJpdHN0cmVhbSwgdGhlc2UgYXJlIHRoZSBhbGdvcml0aG1zIHRoYXQgdHVybiBhIHNldApvZiBjb21wcmVzc2lvbiB0b29scyBhbmQgYSBiaXRzdHJlYW0gZm9ybWF0IHNwZWNpZmljYXRpb24sIGludG8gYSBjb2hlcmVudAphbmQgdXNlZnVsIGNvZGVjIGltcGxlbWVudGF0aW9uLiBUaGVzZSBtYXkgaW5jbHVkZSBidXQgYXJlIG5vdCBsaW1pdGVkIHRvCnRoaW5ncyBsaWtlIDotCgotIFJhdGUgZGlzdG9ydGlvbiBvcHRpbWl6YXRpb24gKFRoZSBwcm9jZXNzIG9mIHRyeWluZyB0byBjaG9vc2UgdGhlIG1vc3QKICBlZmZpY2llbnQgY29tYmluYXRpb24gb2YgYmxvY2sgc2l6ZSwgcHJlZGljdGlvbiBtb2RlLCB0cmFuc2Zvcm0gdHlwZQogIGV0Yy4pCi0gUmF0ZSBjb250cm9sIChyZWd1bGF0aW9uIG9mIHRoZSBvdXRwdXQgYml0cmF0ZSkKLSBFbmNvZGVyIHNwZWVkIHZzIHF1YWxpdHkgdHJhZGUgb2Zmcy4KLSBGZWF0dXJlcyBzdWNoIGFzIHR3byBwYXNzIGVuY29kaW5nIG9yIG9wdGltaXphdGlvbiBmb3IgbG93IGRlbGF5CiAgZW5jb2RpbmcuCgpGb3IgYSBtb3JlIGRldGFpbGVkIG92ZXJ2aWV3IG9mIEFWMSdzIGVuY29kaW5nIHRvb2xzIGFuZCBhIGRpc2N1c3Npb24gb2Ygc29tZQpvZiB0aGUgZGVzaWduIGNvbnNpZGVyYXRpb25zIGFuZCBoYXJkd2FyZSBjb25zdHJhaW50cyB0aGF0IGhhZCB0byBiZQphY2NvbW1vZGF0ZWQsIHBsZWFzZSByZWZlciB0byAoVE9ETyBSRUYpIDxiPkEgVGVjaG5pY2FsIE92ZXJ2aWV3IG9mIHRoZSBBVjEKU3RhbmRhcmQ8L2I+IChUT0RPIGFkZCBsaW5rIHRvIEppbmduaW5nJ3MgQVYxIG92ZXJ2aWV3IHBhcGVyKS4KCkZpZ3VyZSAzIHByb3ZpZGVzIGEgc2xpZ2h0bHkgZXhwYW5kZWQgYnV0IHN0aWxsIHNpbXBsaXN0aWMgdmlldyBvZiB0aGUKQVYxIGVuY29kZXIgYXJjaGl0ZWN0dXJlIHdpdGggYmxvY2tzIHRoYXQgcmVsYXRlIHRvIHNvbWUgb2YgdGhlIHN1YnNlcXVlbnQKc2VjdGlvbnMgb2YgdGhpcyBkb2N1bWVudC4gSW4gdGhpcyBkaWFncmFtLCB0aGUgcmF3IHVuY29tcHJlc3NlZCBmcmFtZSBidWZmZXJzCmFyZSBzaG93biBpbiBkYXJrIGdyZWVuIGFuZCB0aGUgcmVjb25zdHJ1Y3RlZCBmcmFtZSBidWZmZXJzIHVzZWQgZm9yCnByZWRpY3Rpb24gaW4gbGlnaHQgZ3JlZW4uIFJlZCBpbmRpY2F0ZXMgdGhvc2UgcGFydHMgb2YgdGhlIGNvZGVjIHRoYXQgYXJlCihvciBtYXkgYmUpIGxvc3N5LCB3aGVyZSBmaWRlbGl0eSBjYW4gYmUgdHJhZGVkIG9mZiBhZ2FpbnN0IGNvbXByZXNzaW9uCmVmZmljaWVuY3ksIHdoaWxzdCBsaWdodCBibHVlIHNob3dzIGFsZ29yaXRobXMgb3IgY29kaW5nIHRvb2xzIHRoYXQgYXJlCmxvc3NsZXNzLiBUaGUgeWVsbG93IGJsb2NrcyByZXByZXNlbnQgbm9uLWJpdHN0cmVhbSBub3JtYXRpdmUgY29uZmlndXJhdGlvbgphbmQgY29udHJvbCBhbGdvcml0aG1zLgoKXGltYWdlIGh0bWwgYXYxZW5jb2RlcmZsb3cucG5nICIiIHdpZHRoPTcwJQoKXHNlY3Rpb24gYXJjaGl0ZWN0dXJlX2NvbW1hbmRfbGluZSBUaGUgTGliYW9tIENvbW1hbmQgTGluZSBJbnRlcmZhY2UKCiBBZGQgZGV0YWlscyBvciBsaW5rcyBoZXJlOiBUT0RPID8gZWxsaW90a0AKClxzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfZGF0YV9zdHJ1Y3R1cmVzIE1haW4gRW5jb2RlciBEYXRhIFN0cnVjdHVyZXMKClRoZSBmb2xsb3dpbmcgYXJlIHRoZSBtYWluIGhpZ2ggbGV2ZWwgZGF0YSBzdHJ1Y3R1cmVzIHVzZWQgYnkgdGhlIGxpYmFvbSBBVjEKZW5jb2RlciBhbmQgcmVmZXJlbmNlZCBlbHNld2hlcmUgaW4gdGhpcyBvdmVydmlldyBkb2N1bWVudDoKCi0gXHJlZiBBVjFfQ09NUAogICAgLSBccmVmIEFWMV9DT01QLm94Y2YgKFxyZWYgQVYxRW5jb2RlckNvbmZpZykKICAgIC0gXHJlZiBBVjFfQ09NUC5hbHRfcmVmX2J1ZmZlciAoXHJlZiB5djEyX2J1ZmZlcl9jb25maWcpCiAgICAtIFxyZWYgQVYxX0NPTVAucmMgKFxyZWYgUkFURV9DT05UUk9MKQogICAgLSBccmVmIEFWMV9DT01QLnR3b3Bhc3MgKFxyZWYgVFdPX1BBU1MpCiAgICAtIFxyZWYgQVYxX0NPTVAuZ2ZfZ3JvdXAgKFxyZWYgR0ZfR1JPVVApCiAgICAtIFxyZWYgQVYxX0NPTVAuc3BlZWQKICAgIC0gXHJlZiBBVjFfQ09NUC5zZiAoXHJlZiBTUEVFRF9GRUFUVVJFUykKICAgIC0gXHJlZiBBVjFfQ09NUC5sYXBfZW5hYmxlZAoKLSBccmVmIEFWMUVuY29kZXJDb25maWcgKEVuY29kZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzKQogICAgLSBccmVmIEFWMUVuY29kZXJDb25maWcucGFzcwogICAgLSBccmVmIEFWMUVuY29kZXJDb25maWcuYWxnb19jZmcgKFxyZWYgQWxnb0NmZykKICAgIC0gXHJlZiBBVjFFbmNvZGVyQ29uZmlnLmtmX2NmZyAoXHJlZiBLZXlGcmFtZUNmZykKICAgIC0gXHJlZiBBVjFFbmNvZGVyQ29uZmlnLnJjX2NmZyAoXHJlZiBSYXRlQ29udHJvbENmZykKCi0gXHJlZiBBbGdvQ2ZnIChBbGdvcml0aG0gcmVsYXRlZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMpCiAgICAtIFxyZWYgQWxnb0NmZy5hcm5yX21heF9mcmFtZXMKICAgIC0gXHJlZiBBbGdvQ2ZnLmFybnJfc3RyZW5ndGgKCi0gXHJlZiBLZXlGcmFtZUNmZyAoS2V5ZnJhbWUgY29kaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycykKICAgIC0gXHJlZiBLZXlGcmFtZUNmZy5lbmFibGVfa2V5ZnJhbWVfZmlsdGVyaW5nCgotIFxyZWYgUmF0ZUNvbnRyb2xDZmcgKFJhdGUgY29udHJvbCBjb25maWd1cmF0aW9uKQogICAgLSBccmVmIFJhdGVDb250cm9sQ2ZnLm1vZGUKICAgIC0gXHJlZiBSYXRlQ29udHJvbENmZy50YXJnZXRfYmFuZHdpZHRoCiAgICAtIFxyZWYgUmF0ZUNvbnRyb2xDZmcuYmVzdF9hbGxvd2VkX3EKICAgIC0gXHJlZiBSYXRlQ29udHJvbENmZy53b3JzdF9hbGxvd2VkX3EKICAgIC0gXHJlZiBSYXRlQ29udHJvbENmZy5jcV9sZXZlbAogICAgLSBccmVmIFJhdGVDb250cm9sQ2ZnLnVuZGVyX3Nob290X3BjdAogICAgLSBccmVmIFJhdGVDb250cm9sQ2ZnLm92ZXJfc2hvb3RfcGN0CiAgICAtIFxyZWYgUmF0ZUNvbnRyb2xDZmcubWF4aW11bV9idWZmZXJfc2l6ZV9tcwogICAgLSBccmVmIFJhdGVDb250cm9sQ2ZnLnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbF9tcwogICAgLSBccmVmIFJhdGVDb250cm9sQ2ZnLm9wdGltYWxfYnVmZmVyX2xldmVsX21zCiAgICAtIFxyZWYgUmF0ZUNvbnRyb2xDZmcudmJyYmlhcwogICAgLSBccmVmIFJhdGVDb250cm9sQ2ZnLnZicm1pbl9zZWN0aW9uCiAgICAtIFxyZWYgUmF0ZUNvbnRyb2xDZmcudmJybWF4X3NlY3Rpb24KCi0gXHJlZiBSQVRFX0NPTlRST0wgKFJhdGUgY29udHJvbCBzdGF0dXMpCiAgICAtIFxyZWYgUkFURV9DT05UUk9MLmludGVydmFsc190aWxsX2dmX2NhbGN1bGF0ZV9kdWUKICAgIC0gXHJlZiBSQVRFX0NPTlRST0wuZ2ZfaW50ZXJ2YWxzW10KICAgIC0gXHJlZiBSQVRFX0NPTlRST0wuY3VyX2dmX2luZGV4CiAgICAtIFxyZWYgUkFURV9DT05UUk9MLmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUKICAgIC0gXHJlZiBSQVRFX0NPTlRST0wuZnJhbWVzX3RvX2tleQoKLSBccmVmIFRXT19QQVNTIChUd28gcGFzcyBzdGF0dXMgYW5kIGNvbnRyb2wgZGF0YSkKCi0gXHJlZiBHRl9HUk9VUCAoRGF0YSByZWxhdGluZyB0byB0aGUgY3VycmVudCBHRi9BUkYgZ3JvdXApCgotIFxyZWYgRklSU1RQQVNTX1NUQVRTIChEZWZpbmVzIGVudHJpZXMgaW4gdGhlIGZpcnN0IHBhc3Mgc3RhdHMgYnVmZmVyKQogICAgLSBccmVmIEZJUlNUUEFTU19TVEFUUy5jb2RlZF9lcnJvcgoKLSBccmVmIFNQRUVEX0ZFQVRVUkVTIChFbmNvZGUgc3BlZWQgdnMgcXVhbGl0eSB0cmFkZW9mZiBwYXJhbWV0ZXJzKQogICAgLSBccmVmIFNQRUVEX0ZFQVRVUkVTLmhsX3NmIChccmVmIEhJR0hfTEVWRUxfU1BFRURfRkVBVFVSRVMpCgotIFxyZWYgSElHSF9MRVZFTF9TUEVFRF9GRUFUVVJFUwogICAgLSBccmVmIEhJR0hfTEVWRUxfU1BFRURfRkVBVFVSRVMucmVjb2RlX2xvb3AKICAgIC0gXHJlZiBISUdIX0xFVkVMX1NQRUVEX0ZFQVRVUkVTLnJlY29kZV90b2xlcmFuY2UKCi0gXHJlZiBUcGxQYXJhbXMKClxzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfdXNlX2Nhc2VzIEVuY29kZXIgVXNlIENhc2VzCgpUaGUgbGliYW9tIEFWMSBlbmNvZGVyIGlzIGNvbmZpZ3VyYWJsZSB0byBzdXBwb3J0IGEgbnVtYmVyIG9mIGRpZmZlcmVudCB1c2UKY2FzZXMgYW5kIHJhdGUgY29udHJvbCBzdHJhdGVnaWVzLgoKVGhlIHByaW5jaXBsZSB1c2UgY2FzZXMgZm9yIHdoaWNoIGl0IGlzIG9wdGltaXNlZCBhcmUgYXMgZm9sbG93czoKCiAtIDxiPlZpZGVvIG9uIERlbWFuZCAvIFN0cmVhbWluZzwvYj4KIC0gPGI+TG93IERlbGF5IG9yIExpdmUgU3RyZWFtaW5nPC9iPgogLSA8Yj5WaWRlbyBDb25mZXJlbmNpbmcgLyBSZWFsIFRpbWUgQ29kaW5nIChSVEMpPC9iPgogLSA8Yj5GaXhlZCBRdWFsaXR5IC8gVGVzdGluZzwvYj4KCk90aGVyIGV4YW1wbGVzIG9mIHVzZSBjYXNlcyBmb3Igd2hpY2ggdGhlIGVuY29kZXIgY291bGQgYmUgY29uZmlndXJlZCBidXQgZm9yCndoaWNoIHRoZXJlIGlzIGxlc3MgYnkgd2F5IG9mIHNwZWNpZmljIG9wdGltaXphdGlvbnMgaW5jbHVkZToKCiAtIDxiPkRvd25sb2FkIGFuZCBQbGF5PC9iPgogLSA8Yj5EaXNrIFBsYXliYWNrPC9iPj4KIC0gPGI+U3RvcmFnZTwvYj4KIC0gPGI+RWRpdGluZzwvYj4KIC0gPGI+QnJvYWRjYXN0IHZpZGVvPC9iPgoKU3BlY2lmaWMgdXNlIGNhc2VzIG1heSBoYXZlIHBhcnRpY3VsYXIgcmVxdWlyZW1lbnRzIG9yIGNvbnN0cmFpbnRzLiBGb3IKZXhhbXBsZToKCjxiPlZpZGVvIENvbmZlcmVuY2luZzo8L2I+ICBJbiBhIHZpZGVvIGNvbmZlcmVuY2Ugd2UgbmVlZCB0byBlbmNvZGUgdGhlIHZpZGVvCmluIHJlYWwgdGltZSBhbmQgdG8gYXZvaWQgYW55IGNvZGluZyB0b29scyB0aGF0IGNvdWxkIGluY3JlYXNlIGxhdGVuY3ksIHN1Y2gKYXMgZnJhbWUgbG9vayBhaGVhZC4KCjxiPkxpdmUgU3RyZWFtczo8L2I+IEluIGNhc2VzIHN1Y2ggYXMgbGl2ZSBzdHJlYW1pbmcgb2YgZ2FtZXMgb3IgZXZlbnRzLCBpdAptYXkgYmUgcG9zc2libGUgdG8gYWxsb3cgc29tZSBsaW1pdGVkIGJ1ZmZlcmluZyBvZiB0aGUgdmlkZW8gYW5kIHVzZSBvZgpsb29rYWhlYWQgY29kaW5nIHRvb2xzIHRvIGltcHJvdmUgZW5jb2RpbmcgcXVhbGl0eS4gSG93ZXZlciwgIHdoaWxzdCBhIGxhZyBvZgphIHNlY29uZCBvciB0d28gbWF5IGJlIGZpbmUgZ2l2ZW4gdGhlIG9uZSB3YXkgbmF0dXJlIG9mIHRoaXMgdHlwZSBvZiB2aWRlbywKaXQgaXMgY2xlYXJseSBub3QgcG9zc2libGUgdG8gdXNlIHRvb2xzIHN1Y2ggYXMgdHdvIHBhc3MgY29kaW5nLgoKPGI+QnJvYWRjYXN0OjwvYj4gQnJvYWRjYXN0IHZpZGVvIChlLmcuIGRpZ2l0YWwgVFYgb3ZlciBzYXRlbGxpdGUpIG1heSBoYXZlCnNwZWNpZmljIHJlcXVpcmVtZW50cyBzdWNoIGFzIGZyZXF1ZW50IGFuZCByZWd1bGFyIGtleSBmcmFtZXMgKGUuZy4gb25jZSBwZXIKc2Vjb25kIG9yIG1vcmUpIGFzIHRoZXNlIGFyZSBpbXBvcnRhbnQgYXMgZW50cnkgcG9pbnRzIHRvIHVzZXJzIHdoZW4gc3dpdGNoaW5nCmNoYW5uZWxzLiBUaGVyZSBtYXkgYWxzbyBiZSAgc3RyaWN0IHVwcGVyIGxpbWl0cyBvbiBiYW5kd2lkdGggb3ZlciBhIHNob3J0CndpbmRvdyBvZiB0aW1lLgoKPGI+RG93bmxvYWQgYW5kIFBsYXk6PC9iPiBEb3dubG9hZCBhbmQgcGxheSBhcHBsaWNhdGlvbnMgbWF5IGhhdmUgbGVzcyBzdHJpY3QKcmVxdWlyZW1lbnRzIGluIHRlcm1zIG9mIGxvY2FsIGZyYW1lIGJ5IGZyYW1lIHJhdGUgY29udHJvbCBidXQgdGhlcmUgbWF5IGJlIGEKcmVxdWlyZW1lbnQgdG8gYWNjdXJhdGVseSBoaXQgYSBmaWxlIHNpemUgdGFyZ2V0IGZvciB0aGUgdmlkZW8gY2xpcCBhcyBhCndob2xlLiBTaW1pbGFyIGNvbnNpZGVyYXRpb25zIG1heSBhcHBseSB0byBwbGF5YmFjayBmcm9tIG1hc3Mgc3RvcmFnZSBkZXZpY2VzCnN1Y2ggYXMgRFZEIG9yIGRpc2sgZHJpdmVzLgoKPGI+RWRpdGluZzo8L2I+IEluIGNlcnRhaW4gc3BlY2lhbCB1c2UgY2FzZXMgc3VjaCBhcyBvZmZsaW5lIGVkaXRpbmcsIGl0IG1heQpiZSBkZXNpcmFibGUgdG8gaGF2ZSB2ZXJ5IGhpZ2ggcXVhbGl0eSBhbmQgZGF0YSByYXRlIGJ1dCBhbHNvIHZlcnkgZnJlcXVlbnQKa2V5IGZyYW1lcyBvciBpbmRlZWQgdG8gZW5jb2RlIHRoZSB2aWRlbyBleGNsdXNpdmVseSBhcyBrZXkgZnJhbWVzLiBMb3NzbGVzcwp2aWRlbyBlbmNvZGluZyBtYXkgYWxzbyBiZSByZXF1aXJlZCBpbiB0aGlzIHVzZSBjYXNlLgoKPGI+Vk9EIC8gU3RyZWFtaW5nOjwvYj4gT25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBhbmQgY29tbW9uIHVzZSBjYXNlcyBmb3IgQVYxCmlzIHZpZGVvIG9uIGRlbWFuZCBvciBzdHJlYW1pbmcsIGZvciBzZXJ2aWNlcyBzdWNoIGFzIFlvdVR1YmUgYW5kIE5ldGZsaXguIEluCnRoaXMgdXNlIGNhc2UgaXQgaXMgcG9zc2libGUgdG8gZG8gdHdvIG9yIGV2ZW4gbXVsdGktcGFzcyBlbmNvZGluZyB0byBpbXByb3ZlCmNvbXByZXNzaW9uIGVmZmljaWVuY3kuIFN0cmVhbWluZyBzZXJ2aWNlcyB3aWxsIG9mdGVuIHN0b3JlIG1hbnkgZW5jb2RlZApjb3BpZXMgb2YgYSB2aWRlbyBhdCBkaWZmZXJlbnQgcmVzb2x1dGlvbnMgYW5kIGRhdGEgcmF0ZXMgdG8gc3VwcG9ydCB1c2Vycwp3aXRoIGRpZmZlcmVudCB0eXBlcyBvZiBwbGF5YmFjayBkZXZpY2UgYW5kIGJhbmR3aWR0aCBsaW1pdGF0aW9ucy4KRnVydGhlcm1vcmUsIHRoZXNlIHNlcnZpY2VzIHN1cHBvcnQgZHluYW1pYyBzd2l0Y2hpbmcgYmV0d2VlbiBtdWx0aXBsZQpzdHJlYW1zLCBzbyB0aGF0IHRoZXkgY2FuIHJlc3BvbmQgdG8gY2hhbmdpbmcgbmV0d29yayBjb25kaXRpb25zLgoKRXhhY3QgcmF0ZSBjb250cm9sIHdoZW4gZW5jb2RpbmcgZm9yIGEgc3BlY2lmaWMgZm9ybWF0IChlLmcgMzYwUCBvciAxMDgwUCBvbgpZb3VUdWJlKSBtYXkgbm90IGJlIGNyaXRpY2FsLCBwcm92aWRlZCB0aGF0IHRoZSB2aWRlbyBiYW5kd2lkdGggcmVtYWlucyB3aXRoaW4KYWxsb3dlZCBsaW1pdHMuIFdoaWxzdCBhIGZvcm1hdCBtYXkgaGF2ZSBhIG5vbWluYWwgdGFyZ2V0IGRhdGEgcmF0ZSwgdGhpcyBjYW4KYmUgY29uc2lkZXJlZCBtb3JlIGFzIHRoZSBkZXNpcmVkIGF2ZXJhZ2UgZWdyZXNzIHJhdGUgb3ZlciB0aGUgdmlkZW8gY29ycHVzCnJhdGhlciB0aGFuIGEgc3RyaWN0IHJlcXVpcmVtZW50IGZvciBhbnkgaW5kaXZpZHVhbCBjbGlwLiBJbmRlZWQsIGluIG9yZGVyCnRvIG1haW50YWluIG9wdGltYWwgcXVhbGl0eSBvZiBleHBlcmllbmNlIGZvciB0aGUgZW5kIHVzZXIsIGl0IG1heSBiZQpkZXNpcmFibGUgdG8gZW5jb2RlIHNvbWUgZWFzaWVyIHZpZGVvcyBvciBzZWN0aW9ucyBvZiB2aWRlbyBhdCBhIGxvd2VyIGRhdGEKcmF0ZSBhbmQgaGFyZGVyIHZpZGVvcyBvciBzZWN0aW9ucyBhdCBhIGhpZ2hlciByYXRlLgoKVk9EIC8gc3RyZWFtaW5nIGRvZXMgbm90IHVzdWFsbHkgcmVxdWlyZSB2ZXJ5IGZyZXF1ZW50IGtleSBmcmFtZXMgKGFzIGluIHRoZQpicm9hZGNhc3QgY2FzZSkgYnV0IGtleSBmcmFtZXMgYXJlIGltcG9ydGFudCBpbiB0cmljayBwbGF5IChzY2FubmluZyBiYWNrIGFuZApmb3J0aCB0byBkaWZmZXJlbnQgcG9pbnRzIGluIGEgdmlkZW8pIGFuZCBmb3IgYWRhcHRpdmUgc3RyZWFtIHN3aXRjaGluZy4gQXMKc3VjaCwgaW4gYSB1c2UgY2FzZSBsaWtlIFlvdVR1YmUsIHRoZXJlIGlzIG5vcm1hbGx5IGFuIHVwcGVyIGxpbWl0IG9uIHRoZQptYXhpbXVtIHRpbWUgYmV0d2VlbiBrZXkgZnJhbWVzIG9mIGEgZmV3IHNlY29uZHMsIGJ1dCB3aXRoaW4gY2VydGFpbiBsaW1pdHMKdGhlIGVuY29kZXIgY2FuIHRyeSB0byBhbGlnbiBrZXkgZnJhbWVzIHdpdGggcmVhbCBzY2VuZSBjdXRzLgoKV2hpbHN0IGVuY29kZXIgc3BlZWQgbWF5IG5vdCBzZWVtIHRvIGJlIGFzIGNyaXRpY2FsIGluIHRoaXMgdXNlIGNhc2UsIGZvcgpzZXJ2aWNlcyBzdWNoIGFzIFlvdVR1YmUsIHdoZXJlIG1pbGxpb25zIG9mIG5ldyB2aWRlb3MgaGF2ZSB0byBiZSBlbmNvZGVkCmV2ZXJ5IGRheSwgZW5jb2RlciBzcGVlZCBpcyBzdGlsbCBpbXBvcnRhbnQsIHNvIGxpYmFvbSBhbGxvd3MgY29tbWFuZCBsaW5lCmNvbnRyb2wgb2YgdGhlIGVuY29kZSBzcGVlZCB2cyBxdWFsaXR5IHRyYWRlIG9mZi4KCjxiPkZpeGVkIFF1YWxpdHkgLyBUZXN0aW5nIE1vZGU6PC9iPiBMaWJhb20gYWxzbyBoYXMgYSBmaXhlZCBxdWFsaXR5IGVuY29kZXIKcGF0aHdheSBkZXNpZ25lZCBmb3IgdGVzdGluZyB1bmRlciBoaWdobHkgY29uc3RyYWluZWQgY29uZGl0aW9ucy4KClxzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfc3BlZWRfcXVhbGl0eSBTcGVlZCB2cyBRdWFsaXR5IFRyYWRlIE9mZgoKSW4gYW55IG1vZGVybiB2aWRlbyBlbmNvZGVyIHRoZXJlIGFyZSB0cmFkZSBvZmZzIHRoYXQgY2FuIGJlIG1hZGUgaW4gcmVnYXJkIHRvCnRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBlbmNvZGluZyBhIHZpZGVvIG9yIHZpZGVvIGZyYW1lIHZzIHRoZSBxdWFsaXR5IG9mIHRoZQpmaW5hbCBlbmNvZGUuCgpUaGVzZSB0cmFkZSBvZmZzIHR5cGljYWxseSBsaW1pdCB0aGUgc2NvcGUgb2YgdGhlIHNlYXJjaCBmb3IgYW4gb3B0aW1hbApwcmVkaWN0aW9uIC8gdHJhbnNmb3JtIGNvbWJpbmF0aW9uIHdpdGggZmFzdGVyIGVuY29kZSBtb2RlcyBkb2luZyBmZXdlcgpwYXJ0aXRpb24sIHJlZmVyZW5jZSBmcmFtZSwgcHJlZGljdGlvbiBtb2RlIGFuZCB0cmFuc2Zvcm0gc2VhcmNoZXMgYXQgdGhlIGNvc3QKb2Ygc29tZSByZWR1Y3Rpb24gaW4gY29kaW5nIGVmZmljaWVuY3kuCgpUaGUgcHJ1bmluZyBvZiB0aGUgc2l6ZSBvZiB0aGUgc2VhcmNoIHRyZWUgaXMgdHlwaWNhbGx5IGJhc2VkIG9uIGFzc3VtcHRpb25zCmFib3V0IHRoZSBsaWtlbGlob29kIG9mIGRpZmZlcmVudCBzZWFyY2ggbW9kZXMgYmVpbmcgc2VsZWN0ZWQgYmFzZWQgb24gd2hhdApoYXMgZ29uZSBiZWZvcmUgYW5kIGZlYXR1cmVzIHN1Y2ggYXMgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIHZpZGVvIGZyYW1lcyBhbmQKdGhlIFEgdmFsdWUgc2VsZWN0ZWQgZm9yIGVuY29kaW5nIHRoZSBmcmFtZS4gRm9yIGV4YW1wbGUgY2VydGFpbiBpbnRyYSBtb2RlcwphcmUgbGVzcyBsaWtlbHkgdG8gYmUgY2hvc2VuIGF0IGhpZ2ggUSBidXQgbWF5IGJlIG1vcmUgbGlrZWx5IGlmIHNpbWlsYXIKbW9kZXMgd2VyZSB1c2VkIGZvciB0aGUgcHJldmlvdXNseSBjb2RlZCBibG9ja3MgYWJvdmUgYW5kIHRvIHRoZSBsZWZ0IG9mIHRoZQpjdXJyZW50IGJsb2NrLgoKVGhlIHNwZWVkIHNldHRpbmdzIGRlcGVuZCBib3RoIG9uIHRoZSB1c2UgY2FzZSAoZS5nLiBSZWFsIFRpbWUgZW5jb2RpbmcpIGFuZAphbiBleHBsaWNpdCBzcGVlZCBjb250cm9sIHBhc3NlZCBpbiBvbiB0aGUgY29tbWFuZCBsaW5lIGFzIDxiPi0tY3B1LXVzZWQ8L2I+CmFuZCBzdG9yZWQgaW4gdGhlIFxyZWYgQVYxX0NPTVAuc3BlZWQgZmllbGQgb2YgdGhlIG1haW4gY29tcHJlc3NvciBpbnN0YW5jZQpkYXRhIHN0cnVjdHVyZSAoPGI+Y3BpPC9iPikuCgpUaGUgY29udHJvbCBmbGFncyBmb3IgdGhlIHNwZWVkIHRyYWRlIG9mZiBhcmUgc3RvcmVkIHRoZSBccmVmIEFWMV9DT01QLnNmCmZpZWxkIG9mIHRoZSBjb21wcmVzc29yIGluc3RhbmN2ZSBhbmQgYXJlIHNldCBpbiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczotCgotIFxyZWYgYXYxX3NldF9zcGVlZF9mZWF0dXJlc19mcmFtZXNpemVfaW5kZXBlbmRlbnQoKQotIFxyZWYgYXYxX3NldF9zcGVlZF9mZWF0dXJlc19mcmFtZXNpemVfZGVwZW5kZW50KCkKLSBccmVmIGF2MV9zZXRfc3BlZWRfZmVhdHVyZXNfcWluZGV4X2RlcGVuZGVudCgpCgpBIHNlY29uZCBmYWN0b3IgaW1wYWN0aW5nIHRoZSBzcGVlZCBvZiBlbmNvZGUgaXMgcmF0ZSBkaXN0b3J0aW9uIG9wdGltaXNhdGlvbgooPGI+cmQgdnMgbm9uLXJkPC9iPiBlbmNvZGluZykuCgpXaGVuIHJhdGUgZGlzdG9ydGlvbiBvcHRpbWl6YXRpb24gaXMgZW5hYmxlZCBlYWNoIGNhbmRpZGF0ZSBjb21iaW5hdGlvbiBvZgphIHByZWRpY3Rpb24gbW9kZSBhbmQgdHJhbnNmb3JtIGNvZGluZyBzdHJhdGVneSBpcyBmdWxseSBlbmNvZGVkIGFuZCB0aGUKcmVzdWx0aW5nIGVycm9yIChvciBkaXN0b3J0aW9uKSBhcyBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwgc291cmNlIGFuZCB0aGUKbnVtYmVyIG9mIGJpdHMgdXNlZCwgYXJlIHBhc3NlZCB0byBhIHJhdGUgZGlzdG9ydGlvbiBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbgpjb252ZXJ0cyB0aGUgZGlzdG9ydGlvbiBhbmQgY29zdCBpbiBiaXRzIHRvIGEgc2luZ2xlIDxiPlJEPC9iPiB2YWx1ZSAod2hlcmUKbG93ZXIgaXMgYmV0dGVyKS4gVGhpcyA8Yj5SRDwvYj4gdmFsdWUgaXMgdXNlZCB0byBkZWNpZGUgYmV0d2VlbiBkaWZmZXJlbnQKZW5jb2Rpbmcgc3RyYXRlZ2llcyBmb3IgdGhlIGN1cnJlbnQgYmxvY2sgd2hlcmUsIGZvciBleGFtcGxlLCBhIG9uZSBtYXkKcmVzdWx0IGluIGEgbG93ZXIgZGlzdG9ydGlvbiBidXQgYSBsYXJnZXIgbnVtYmVyIG9mIGJpdHMuCgpUaGUgY2FsY3VsYXRpb24gb2YgdGhpcyA8Yj5SRDwvYj4gdmFsdWUgaXMgYnJvYWRseSBzcGVha2luZyBhcyBmb2xsb3dzOgoKXGZbCiAgUkQgPSAoJmxhbWJkYTsgKiBSYXRlKSArIERpc3RvcnRpb24KXGZdCgpUaGlzIGFzc3VtZXMgYSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgYW5kCmRpc3RvcnRpb24gKHJlcHJlc2VudGVkIGJ5IHRoZSByYXRlIG11bHRpcGxpZXIgdmFsdWUgPGI+JmxhbWJkYTs8L2I+KSB3aGljaCBpcwpub3QgYWN0dWFsbHkgdmFsaWQgYWNyb3NzIGEgYnJvYWQgcmFuZ2Ugb2YgcmF0ZSBhbmQgZGlzdG9ydGlvbiB2YWx1ZXMuClR5cGljYWxseSwgd2hlcmUgZGlzdG9ydGlvbiBpcyBoaWdoLCBleHBlbmRpbmcgYSBzbWFsbCBudW1iZXIgb2YgZXh0cmEgYml0cwp3aWxsIHJlc3VsdCBpbiBhIGxhcmdlIGNoYW5nZSBpbiBkaXN0b3J0aW9uLiBIb3dldmVyLCBhdCBsb3dlciB2YWx1ZXMgb2YKZGlzdG9ydGlvbiB0aGUgY29zdCBpbiBiaXRzIG9mIGVhY2ggaW5jcmVtZW50YWwgaW1wcm92ZW1lbnQgaXMgbGFyZ2UuCgpUbyBkZWFsIHdpdGggdGhpcyB3ZSBzY2FsZSB0aGUgdmFsdWUgb2YgPGI+JmxhbWJkYTs8L2I+IGJhc2VkIG9uIHRoZSBxdWFudGl6ZXIKdmFsdWUgY2hvc2VuIGZvciB0aGUgZnJhbWUuIFRoaXMgaXMgYXNzdW1lZCB0byBiZSBhIHByb3h5IGZvciBvdXIgYXBwcm94aW1hdGUKcG9zaXRpb24gb24gdGhlIHRydWUgcmF0ZSBkaXN0b3J0aW9uIGN1cnZlIGFuZCBpdCBpcyBmdXJ0aGVyIGFzc3VtZWQgdGhhdCBvdmVyCmEgbGltaXRlZCByYW5nZSBvZiBkaXN0b3J0aW9uIHZhbHVlcywgYSBsaW5lYXIgcmVsYXRpb25zaGlwIGJldHdlZW4gZGlzdG9ydGlvbgphbmQgcmF0ZSBpcyBhIHZhbGlkIGFwcHJveGltYXRpb24uCgpEb2luZyBhIHJhdGUgZGlzdG9ydGlvbiB0ZXN0IG9uIGVhY2ggY2FuZGlkYXRlIHByZWRpY3Rpb24gLyB0cmFuc2Zvcm0KY29tYmluYXRpb24gaXMgZXhwZW5zaXZlIGluIHRlcm1zIG9mIGNwdSBjeWNsZXMuIEhlbmNlLCBmb3IgY2FzZXMgd2hlcmUgZW5jb2RlCnNwZWVkIGlzIGNyaXRpY2FsLCBsaWJhb20gaW1wbGVtZW50cyBhIG5vbi1yZCBwYXRod2F5IHdoZXJlIHRoZSA8Yj5SRDwvYj4KdmFsdWUgaXMgZXN0aW1hdGVkIGJhc2VkIG9uIHRoZSBwcmVkaWN0aW9uIGVycm9yIGFuZCBxdWFudGl6ZXIgc2V0dGluZy4KClxzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfc3JjX3Byb2MgU291cmNlIEZyYW1lIFByb2Nlc3NpbmcKClxzdWJzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfZnJhbWVfcHJvY19kYXRhIE1haW4gRGF0YSBTdHJ1Y3R1cmVzCgpUaGUgZm9sbG93aW5nIGFyZSB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZXMgcmVmZXJlbmNlZCBpbiB0aGlzIHNlY3Rpb24KKHNlZSBhbHNvIFxyZWYgYXJjaGl0ZWN0dXJlX2VuY19kYXRhX3N0cnVjdHVyZXMpOgoKLSBccmVmIEFWMV9DT01QIGNwaSAodGhlIG1haW4gY29tcHJlc3NvciBpbnN0YW5jZSBkYXRhIHN0cnVjdHVyZSkKICAgIC0gXHJlZiBBVjFfQ09NUC5veGNmIChccmVmIEFWMUVuY29kZXJDb25maWcpCiAgICAtIFxyZWYgQVYxX0NPTVAuYWx0X3JlZl9idWZmZXIgKFxyZWYgeXYxMl9idWZmZXJfY29uZmlnKQoKLSBccmVmIEFWMUVuY29kZXJDb25maWcgKEVuY29kZXIgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzKQogICAgLSBccmVmIEFWMUVuY29kZXJDb25maWcuYWxnb19jZmcgKFxyZWYgQWxnb0NmZykKICAgIC0gXHJlZiBBVjFFbmNvZGVyQ29uZmlnLmtmX2NmZyAoXHJlZiBLZXlGcmFtZUNmZykKCi0gXHJlZiBBbGdvQ2ZnIChBbGdvcml0aG0gcmVsYXRlZCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMpCiAgICAtIFxyZWYgQWxnb0NmZy5hcm5yX21heF9mcmFtZXMKICAgIC0gXHJlZiBBbGdvQ2ZnLmFybnJfc3RyZW5ndGgKCi0gXHJlZiBLZXlGcmFtZUNmZyAoS2V5ZnJhbWUgY29kaW5nIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycykKICAgIC0gXHJlZiBLZXlGcmFtZUNmZy5lbmFibGVfa2V5ZnJhbWVfZmlsdGVyaW5nCgpcc3Vic2VjdGlvbiBhcmNoaXRlY3R1cmVfZW5jX2ZyYW1lX3Byb2NfaW5nZXN0IEZyYW1lIEluZ2VzdCAvIENvZGluZyBQaXBlbGluZQoKIFRvIGVuY29kZSBhIGZyYW1lLCBmaXJzdCBjYWxsIFxyZWYgYXYxX3JlY2VpdmVfcmF3X2ZyYW1lKCkgdG8gb2J0YWluIHRoZSByYXcKIGZyYW1lIGRhdGEuIFRoZW4gY2FsbCBccmVmIGF2MV9nZXRfY29tcHJlc3NlZF9kYXRhKCkgdG8gZW5jb2RlIHJhdyBmcmFtZSBkYXRhCiBpbnRvIGNvbXByZXNzZWQgZnJhbWUgZGF0YS4gVGhlIG1haW4gYm9keSBvZiBccmVmIGF2MV9nZXRfY29tcHJlc3NlZF9kYXRhKCkKIGlzIFxyZWYgYXYxX2VuY29kZV9zdHJhdGVneSgpLCB3aGljaCBkZXRlcm1pbmVzIGhpZ2gtbGV2ZWwgZW5jb2RlIHN0cmF0ZWd5CiAoZnJhbWUgdHlwZSwgZnJhbWUgcGxhY2VtZW50LCBldGMuKSBhbmQgdGhlbiBlbmNvZGVzIHRoZSBmcmFtZSBieSBjYWxsaW5nCiBccmVmIGF2MV9lbmNvZGUoKS4gSW4gXHJlZiBhdjFfZW5jb2RlKCksIFxyZWYgYXYxX2ZpcnN0X3Bhc3MoKSB3aWxsIGV4ZWN1dGUKIHRoZSBmaXJzdF9wYXNzIG9mIHR3by1wYXNzIGVuY29kaW5nLCB3aGlsZSBccmVmIGVuY29kZV9mcmFtZV90b19kYXRhX3JhdGUoKQogd2lsbCBwZXJmb3JtIHRoZSBmaW5hbCBwYXNzIGZvciBlaXRoZXIgb25lLXBhc3Mgb3IgdHdvLXBhc3MgZW5jb2RpbmcuCgogVGhlIG1haW4gYm9keSBvZiBccmVmIGVuY29kZV9mcmFtZV90b19kYXRhX3JhdGUoKSBpcwogXHJlZiBlbmNvZGVfd2l0aF9yZWNvZGVfbG9vcF9hbmRfZmlsdGVyKCksIHdoaWNoIGhhbmRsZXMgZW5jb2RpbmcgYmVmb3JlCiBpbi1sb29wIGZpbHRlcnMgKHdpdGggcmVjb2RlIGxvb3BzIFxyZWYgZW5jb2RlX3dpdGhfcmVjb2RlX2xvb3AoKSwgb3IKIHdpdGhvdXQgYW55IHJlY29kZSBsb29wIFxyZWYgZW5jb2RlX3dpdGhvdXRfcmVjb2RlKCkpLCBmb2xsb3dlZCBieSBpbi1sb29wCiBmaWx0ZXJzIChkZWJsb2NraW5nIGZpbHRlcnMgXHJlZiBsb29wZmlsdGVyX2ZyYW1lKCksIENERUYgZmlsdGVycyBhbmQKIHJlc3RvcmF0aW9uIGZpbHRlcnMgXHJlZiBjZGVmX3Jlc3RvcmF0aW9uX2ZyYW1lKCkpLgoKIEV4Y2VwdCBmb3IgcmF0ZS9xdWFsaXR5IGNvbnRyb2wsIGJvdGggXHJlZiBlbmNvZGVfd2l0aF9yZWNvZGVfbG9vcCgpIGFuZAogXHJlZiBlbmNvZGVfd2l0aG91dF9yZWNvZGUoKSBjYWxsIFxyZWYgYXYxX2VuY29kZV9mcmFtZSgpIHRvIG1hbmFnZSB0aGUKIHJlZmVyZW5jZSBmcmFtZSBidWZmZXJzIGFuZCBccmVmIGVuY29kZV9mcmFtZV9pbnRlcm5hbCgpIHRvIHBlcmZvcm0gdGhlCiByZXN0IG9mIGVuY29kaW5nIHRoYXQgZG9lcyBub3QgcmVxdWlyZSBhY2Nlc3MgdG8gZXh0ZXJuYWwgZnJhbWVzLgogXHJlZiBlbmNvZGVfZnJhbWVfaW50ZXJuYWwoKSBpcyB0aGUgc3RhcnRpbmcgcG9pbnQgZm9yIHRoZSBwYXJ0aXRpb24gc2VhcmNoCiAoc2VlIFxyZWYgYXJjaGl0ZWN0dXJlX2VuY19wYXJ0aXRpb25zKS4KClxzdWJzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfZnJhbWVfcHJvY190ZiBUZW1wb3JhbCBGaWx0ZXJpbmcKClxzdWJzdWJzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfZnJhbWVfcHJvY190Zl9vdmVydmlldyBPdmVydmlldwoKVmlkZW8gY29kZWNzIGV4cGxvaXQgdGhlIHNwYXRpYWwgYW5kIHRlbXBvcmFsIGNvcnJlbGF0aW9ucyBpbiB2aWRlbyBzaWduYWxzIHRvCmFjaGlldmUgY29tcHJlc3Npb24gZWZmaWNpZW5jeS4gVGhlIG5vaXNlIGZhY3RvciBpbiB0aGUgc291cmNlIHNpZ25hbAphdHRlbnVhdGVzIHN1Y2ggY29ycmVsYXRpb24gYW5kIGltcGVkZXMgdGhlIGNvZGVjIHBlcmZvcm1hbmNlLiBEZW5vaXNpbmcgdGhlCnZpZGVvIHNpZ25hbCBpcyBwb3RlbnRpYWxseSBhIHByb21pc2luZyBzb2x1dGlvbi4KCk9uZSBzdHJhdGVneSBmb3IgZGVub2lzaW5nIGEgc291cmNlIGlzIG1vdGlvbiBjb21wZW5zYXRlZCB0ZW1wb3JhbCBmaWx0ZXJpbmcuClVubGlrZSBpbWFnZSBkZW5vaXNpbmcsIHdoZXJlIG9ubHkgdGhlIHNwYXRpYWwgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLAp2aWRlbyBkZW5vaXNpbmcgY2FuIGxldmVyYWdlIGEgY29tYmluYXRpb24gb2YgdGhlIHNwYXRpYWwgYW5kIHRlbXBvcmFsCmluZm9ybWF0aW9uLiBTcGVjaWZpY2FsbHksIGluIHRoZSB0ZW1wb3JhbCBkb21haW4sIHNpbWlsYXIgcGl4ZWxzIGNhbiBvZnRlbiBiZQp0cmFja2VkIGFsb25nIHRoZSBtb3Rpb24gdHJhamVjdG9yeSBvZiBtb3Zpbmcgb2JqZWN0cy4gTW90aW9uIGVzdGltYXRpb24gaXMKYXBwbGllZCB0byBuZWlnaGJvcmluZyBmcmFtZXMgdG8gZmluZCBzaW1pbGFyIHBhdGNoZXMgb3IgYmxvY2tzIG9mIHBpeGVscyB0aGF0CmNhbiBiZSBjb21iaW5lZCB0byBjcmVhdGUgYSB0ZW1wb3JhbGx5IGZpbHRlcmVkIG91dHB1dC4KCkFWMSwgaW4gY29tbW9uIHdpdGggVlA4IGFuZCBWUDksIHVzZXMgYW4gaW4tbG9vcCBtb3Rpb24gY29tcGVuc2F0ZWQgdGVtcG9yYWwKZmlsdGVyIHRvIGdlbmVyYXRlIHdoYXQgYXJlIHJlZmVycmVkIHRvIGFzIGFsdGVybmF0ZSByZWZlcmVuY2UgZnJhbWVzIChvciBBUkYKZnJhbWVzKS4gVGhlc2UgY2FuIGJlIGVuY29kZWQgaW4gdGhlIGJpdHN0cmVhbSBhbmQgc3RvcmVkIGFzIGZyYW1lIGJ1ZmZlcnMgZm9yCnVzZSBpbiB0aGUgcHJlZGljdGlvbiBvZiBzdWJzZXF1ZW50IGZyYW1lcywgYnV0IGFyZSBub3QgdXN1YWxseSBkaXJlY3RseQpkaXNwbGF5ZWQgKGhlbmNlIHRoZXkgYXJlIHNvbWV0aW1lcyByZWZlcnJlZCB0byBhcyBub24tZGlzcGxheSBmcmFtZXMpLgoKVGhlIGZvbGxvd2luZyBjb21tYW5kIGxpbmUgcGFyYW1ldGVycyBzZXQgdGhlIHN0cmVuZ3RoIG9mIHRoZSBmaWx0ZXIsIHRoZQpudW1iZXIgb2YgZnJhbWVzIHVzZWQgYW5kIGRldGVybWluZSB3aGV0aGVyIGZpbHRlcmluZyBpcyBhbGxvd2VkIGZvciBrZXkKZnJhbWVzLgoKLSA8Yj4tLWFybnItc3RyZW5ndGg8L2I+IChccmVmIEFsZ29DZmcuYXJucl9zdHJlbmd0aCkKLSA8Yj4tLWFybnItbWF4ZnJhbWVzPC9iPiAoXHJlZiBBbGdvQ2ZnLmFybnJfbWF4X2ZyYW1lcykKLSA8Yj4tLWVuYWJsZS1rZXlmcmFtZS1maWx0ZXJpbmc8L2I+CiAgKFxyZWYgS2V5RnJhbWVDZmcuZW5hYmxlX2tleWZyYW1lX2ZpbHRlcmluZykKCk5vdGUgdGhhdCBpbiBBVjEsIHRoZSB0ZW1wb3JhbCBmaWx0ZXJpbmcgc2NoZW1lIGlzIGRlc2lnbmVkIGFyb3VuZCB0aGUKaGllcmFyY2hpY2FsIEFSRiBiYXNlZCBweXJhbWlkIGNvZGluZyBzdHJ1Y3R1cmUuIFdlIHR5cGljYWxseSBhcHBseSBkZW5vaXNpbmcKb25seSBvbiBrZXkgZnJhbWUgYW5kIEFSRiBmcmFtZXMgYXQgdGhlIGhpZ2hlc3QgKGFuZCBzb21ldGltZXMgdGhlIHNlY29uZApoaWdoZXN0KSBsYXllciBpbiB0aGUgaGllcmFyY2hpY2FsIGNvZGluZyBzdHJ1Y3R1cmUuCgpcc3Vic3Vic2VjdGlvbiBhcmNoaXRlY3R1cmVfZW5jX2ZyYW1lX3Byb2NfdGZfYWxnbyBUZW1wb3JhbCBGaWx0ZXJpbmcgQWxnb3JpdGhtCgpPdXIgbWV0aG9kIGRpdmlkZXMgdGhlIGN1cnJlbnQgZnJhbWUgaW50byAiTXhNIiBibG9ja3MuIEZvciBlYWNoIGJsb2NrLCBhCm1vdGlvbiBzZWFyY2ggaXMgYXBwbGllZCBvbiBmcmFtZXMgYmVmb3JlIGFuZCBhZnRlciB0aGUgY3VycmVudCBmcmFtZS4gT25seQp0aGUgYmVzdCBtYXRjaGluZyBwYXRjaCB3aXRoIHRoZSBzbWFsbGVzdCBtZWFuIHNxdWFyZSBlcnJvciAoTVNFKSBpcyBrZXB0IGFzIGEKY2FuZGlkYXRlIHBhdGNoIGZvciBhIG5laWdoYm91ciBmcmFtZS4gVGhlIGN1cnJlbnQgYmxvY2sgaXMgYWxzbyBhIGNhbmRpZGF0ZQpwYXRjaC4gQSB0b3RhbCBvZiBOIGNhbmRpZGF0ZSBwYXRjaGVzIGFyZSBjb21iaW5lZCB0byBnZW5lcmF0ZSB0aGUgZmlsdGVyZWQKb3V0cHV0LgoKTGV0IGYoaSkgcmVwcmVzZW50IHRoZSBmaWx0ZXJlZCBzYW1wbGUgdmFsdWUgYW5kIFxmJHBfe2p9KGkpXGYkIHRoZSBzYW1wbGUKdmFsdWUgb2YgdGhlIGotdGggcGF0Y2guIFRoZSBmaWx0ZXJpbmcgcHJvY2VzcyBpczoKClxmWwogIGYoaSkgPSBcZnJhY3twX3swfShpKSArIFxzdW1fe2o9MX1ee059ICZvbWVnYTtfe2p9KGkpLnBfe2p9KGkpfQogICAgICAgICAgICAgIHsxICsgXHN1bV97aj0xfV57Tn0gJm9tZWdhO197an0oaSl9ClxmXQoKd2hlcmUgXGYkICZvbWVnYTtfe2p9KGkpIFxmJCBpcyB0aGUgd2VpZ2h0IG9mIHRoZSBqLXRoIHBhdGNoIGZyb20gYSB0b3RhbCBvZgpOIHBhdGNoZXMuIFRoZSB3ZWlnaHQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgcGF0Y2ggZGlmZmVyZW5jZSBhczoKClxmWwogICZvbWVnYTtfe2p9KGkpID0gZXhwKC1cZnJhY3tEX3tqfShpKX17aF4yfSkKXGZdCgp3aGVyZSBcZiQgRF97an0oaSkgXGYkIGlzIHRoZSBzdW0gb2Ygc3F1YXJlZCBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIGN1cnJlbnQKYmxvY2sgYW5kIHRoZSBqLXRoIGNhbmRpZGF0ZSBwYXRjaDoKClxmWwogIERfe2p9KGkpID0gXHN1bV97a1xpbiZPbWVnYTtfe2l9fXx8cF97MH0oaykgLSBwX3tqfShrKXx8X3syfQpcZl0KCndoZXJlOgotIFxmJHBfezB9XGYkIHJlZmVycyB0byB0aGUgY3VycmVudCBmcmFtZS4KLSBcZiQmT21lZ2E7X3tpfVxmJCBpcyB0aGUgcGF0Y2ggd2luZG93LCBhbiAiTHhMIiBwaXhlbCBzcXVhcmUuCi0gaCBpcyBhIGNyaXRpY2FsIHBhcmFtZXRlciB0aGF0IGNvbnRyb2xzIHRoZSBkZWNheSBvZiB0aGUgd2VpZ2h0cyBtZWFzdXJlZCBieQogIHRoZSBFdWNsaWRlYW4gZGlzdGFuY2UuIEl0IGlzIGRlcml2ZWQgZnJvbSBhbiBlc3RpbWF0ZSBvZiBub2lzZSBhbXBsaXR1ZGUgaW4KICB0aGUgc291cmNlLiBUaGlzIGFsbG93cyB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyB0byBhZGFwdCBmb3IgdmlkZW9zIHdpdGgKICBkaWZmZXJlbnQgbm9pc2UgY2hhcmFjdGVyaXN0aWNzLgotIFVzdWFsbHksIE0gPSAzMiwgTiA9IDcsIGFuZCBMID0gNSwgYnV0IHRoZXkgY2FuIGJlIGFkanVzdGVkLgoKSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB0aGUgcmVhZGVyIHJlZmVycyB0byB0aGUgY29kZSBmb3IgbW9yZSBkZXRhaWxzLgoKXHN1YnN1YnNlY3Rpb24gYXJjaGl0ZWN0dXJlX2VuY19mcmFtZV9wcm9jX3RmX2Z1bmNzIFRlbXBvcmFsIEZpbHRlciBGdW5jdGlvbnMKClRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0ZW1wb3JhbCBmaWx0ZXJpbmcgaXMgXHJlZiBhdjFfdGVtcG9yYWxfZmlsdGVyKCkuClRoaXMgZnVuY3Rpb24gcmV0dXJucyAxIGlmIHRlbXBvcmFsIGZpbHRlcmluZyBpcyBzdWNjZXNzZnVsLCBvdGhlcndpc2UgMC4KV2hlbiB0ZW1wb3JhbCBmaWx0ZXJpbmcgaXMgYXBwbGllZCwgdGhlIGZpbHRlcmVkIGZyYW1lIHdpbGwgYmUgaGVsZCBpbgp0aGUgZnJhbWUgYnVmZmVyIFxyZWYgQVYxX0NPTVAuYWx0X3JlZl9idWZmZXIsIHdoaWNoIGlzIHRoZSBmcmFtZSB0byBiZQplbmNvZGVkIGluIHRoZSBmb2xsb3dpbmcgZW5jb2RpbmcgcHJvY2Vzcy4KCkFsbW9zdCBhbGwgdGVtcG9yYWwgZmlsdGVyIHJlbGF0ZWQgY29kZSBpcyBpbiBhdjEvZW5jb2Rlci90ZW1wb3JhbF9maWx0ZXIuYwphbmQgYXYxL2VuY29kZXIvdGVtcG9yYWxfZmlsdGVyLmguCgpJbnNpZGUgXHJlZiBhdjFfdGVtcG9yYWxfZmlsdGVyKCksIHRoZSByZWFkZXIncyBhdHRlbnRpb24gaXMgZGlyZWN0ZWQgdG8KXHJlZiB0Zl9zZXR1cF9maWx0ZXJpbmdfYnVmZmVyKCkgYW5kIFxyZWYgdGZfZG9fZmlsdGVyaW5nKCkuCgotIFxyZWYgdGZfc2V0dXBfZmlsdGVyaW5nX2J1ZmZlcigpOiBzZXRzIHVwIHRoZSBmcmFtZSBidWZmZXIgZm9yCiAgdGVtcG9yYWwgZmlsdGVyaW5nLCBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIGJlIHVzZWQsIGFuZAogIGNhbGN1bGF0ZXMgdGhlIG5vaXNlIGxldmVsIG9mIGVhY2ggZnJhbWUuCgotIFxyZWYgdGZfZG9fZmlsdGVyaW5nKCk6IHRoZSBtYWluIGZ1bmN0aW9uIGZvciB0aGUgdGVtcG9yYWwKICBmaWx0ZXJpbmcgYWxnb3JpdGhtLiBJdCBicmVha3MgZWFjaCBmcmFtZSBpbnRvICJNeE0iIGJsb2Nrcy4gRm9yIGVhY2gKICBibG9jayBhIG1vdGlvbiBzZWFyY2ggXHJlZiB0Zl9tb3Rpb25fc2VhcmNoKCkgaXMgYXBwbGllZCB0byBmaW5kCiAgdGhlIG1vdGlvbiB2ZWN0b3IgZnJvbSBvbmUgbmVpZ2hib3JpbmcgZnJhbWUuIHRmX2J1aWxkX3ByZWRpY3RvcigpIGlzIHRoZW4KICBjYWxsZWQgdG8gYnVpbGQgdGhlIG1hdGNoaW5nIHBhdGNoIGFuZCBccmVmIGF2MV9hcHBseV90ZW1wb3JhbF9maWx0ZXJfYygpIChzZWUKICBhbHNvIG9wdGltaXNlZCBTSU1EIHZlcnNpb25zKSB0byBhcHBseSB0ZW1wb3JhbCBmaWx0ZXJpbmcuIFRoZSB3ZWlnaHRlZAogIGF2ZXJhZ2Ugb3ZlciBlYWNoIHBpeGVsIGlzIGFjY3VtdWxhdGVkIGFuZCBmaW5hbGx5IG5vcm1hbGl6ZWQgaW4KICBccmVmIHRmX25vcm1hbGl6ZV9maWx0ZXJlZF9mcmFtZSgpIHRvIGdlbmVyYXRlIHRoZSBmaW5hbCBmaWx0ZXJlZCBmcmFtZS4KCi0gXHJlZiBhdjFfYXBwbHlfdGVtcG9yYWxfZmlsdGVyX2MoKTogdGhlIGNvcmUgZnVuY3Rpb24gb2Ygb3VyIHRlbXBvcmFsCiAgZmlsdGVyaW5nIGFsZ29yaXRobSAoc2VlIGFsc28gb3B0aW1pc2VkIFNJTUQgdmVyc2lvbnMpLgoKXHN1YnNlY3Rpb24gYXJjaGl0ZWN0dXJlX2VuY19mcmFtZV9wcm9jX2ZpbG0gRmlsbSBHcmFpbiBNb2RlbGxpbmcKCiBBZGQgZGV0YWlscyBoZXJlLgoKXHNlY3Rpb24gYXJjaGl0ZWN0dXJlX2VuY19yYXRlX2N0cmwgUmF0ZSBDb250cm9sCgpcc3Vic2VjdGlvbiBhcmNoaXRlY3R1cmVfZW5jX3JhdGVfY3RybF9kYXRhIE1haW4gRGF0YSBTdHJ1Y3R1cmVzCgpUaGUgZm9sbG93aW5nIGFyZSB0aGUgbWFpbiBkYXRhIHN0cnVjdHVyZXMgcmVmZXJlbmNlZCBpbiB0aGlzIHNlY3Rpb24KKHNlZSBhbHNvIFxyZWYgYXJjaGl0ZWN0dXJlX2VuY19kYXRhX3N0cnVjdHVyZXMpOgoKIC0gXHJlZiBBVjFfQ09NUCBjcGkgKHRoZSBtYWluIGNvbXByZXNzb3IgaW5zdGFuY2UgZGF0YSBzdHJ1Y3R1cmUpCiAgICAtIFxyZWYgQVYxX0NPTVAub3hjZiAoXHJlZiBBVjFFbmNvZGVyQ29uZmlnKQogICAgLSBccmVmIEFWMV9DT01QLnJjIChccmVmIFJBVEVfQ09OVFJPTCkKICAgIC0gXHJlZiBBVjFfQ09NUC50d29wYXNzIChccmVmIFRXT19QQVNTKQogICAgLSBccmVmIEFWMV9DT01QLnNmIChccmVmIFNQRUVEX0ZFQVRVUkVTKQoKIC0gXHJlZiBBVjFFbmNvZGVyQ29uZmlnIChFbmNvZGVyIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycykKICAgIC0gXHJlZiBBVjFFbmNvZGVyQ29uZmlnLnJjX2NmZyAoXHJlZiBSYXRlQ29udHJvbENmZykKCiAtIFxyZWYgRklSU1RQQVNTX1NUQVRTICpmcmFtZV9zdGF0c19idWYgKHVzZWQgdG8gc3RvcmUgcGVyIGZyYW1lIGZpcnN0CiAgIHBhc3Mgc3RhdHMpCgogLSBccmVmIFNQRUVEX0ZFQVRVUkVTIChFbmNvZGUgc3BlZWQgdnMgcXVhbGl0eSB0cmFkZW9mZiBwYXJhbWV0ZXJzKQogICAgLSBccmVmIFNQRUVEX0ZFQVRVUkVTLmhsX3NmIChccmVmIEhJR0hfTEVWRUxfU1BFRURfRkVBVFVSRVMpCgpcc3Vic2VjdGlvbiBhcmNoaXRlY3R1cmVfZW5jX3JhdGVfY3RybF9vcHRpb25zIFN1cHBvcnRlZCBSYXRlIENvbnRyb2wgT3B0aW9ucwoKRGlmZmVyZW50IHVzZSBjYXNlcyAoXHJlZiBhcmNoaXRlY3R1cmVfZW5jX3VzZV9jYXNlcykgbWF5IGhhdmUgZGlmZmVyZW50CnJlcXVpcmVtZW50cyBpbiB0ZXJtcyBvZiBkYXRhIHJhdGUgY29udHJvbC4KClRoZSBicm9hZCByYXRlIGNvbnRyb2wgc3RyYXRlZ3kgaXMgc2VsZWN0ZWQgdXNpbmcgdGhlIDxiPi0tZW5kLXVzYWdlPC9iPgpwYXJhbWV0ZXIgb24gdGhlIGNvbW1hbmQgbGluZSwgd2hpY2ggbWFwcyBvbnRvIHRoZSBmaWVsZApccmVmIGFvbV9jb2RlY19lbmNfY2ZnX3QucmNfZW5kX3VzYWdlIGluIFxyZWYgYW9tX2VuY29kZXIuaC4KClRoZSBmb3VyIHN1cHBvcnRlZCBvcHRpb25zIGFyZTotCgotIDxiPlZCUjwvYj4gKFZhcmlhYmxlIEJpdHJhdGUpCi0gPGI+Q0JSPC9iPiAoQ29uc3RhbnQgQml0cmF0ZSkKLSA8Yj5DUTwvYj4gKENvbnN0cmFpbmVkIFF1YWxpdHkgbW9kZSA7IEEgY29uc3RyYWluZWQgdmFyaWFudCBvZiBWQlIpCi0gPGI+Rml4ZWQgUTwvYj4gKENvbnN0YW50IHF1YWxpdHkgb2YgUSBtb2RlKQoKVGhlIHZhbHVlIG9mIFxyZWYgYW9tX2NvZGVjX2VuY19jZmdfdC5yY19lbmRfdXNhZ2UgaXMgaW4gdHVybiBjb3BpZWQgb3ZlcgppbnRvIHRoZSBlbmNvZGVyIHJhdGUgY29udHJvbCBjb25maWd1cmF0aW9uIGRhdGEgc3RydWN0dXJlIGFzClxyZWYgUmF0ZUNvbnRyb2xDZmcubW9kZS4KCkluIHJlZ2FyZHMgdG8gdGhlIG1vc3QgaW1wb3J0YW50IHVzZSBjYXNlcyBhYm92ZSwgVmlkZW8gb24gZGVtYW5kIHVzZXMgZWl0aGVyClZCUiBvciBDUSBtb2RlLiBDQlIgaXMgdGhlIHByZWZlcnJlZCByYXRlIGNvbnRyb2wgbW9kZWwgZm9yIFJUQyBhbmQgTGl2ZQpzdHJlYW1pbmcgYW5kIEZpeGVkIFEgaXMgb25seSB1c2VkIGluIHRlc3RpbmcuCgpUaGUgYmVoYXZpb3VyIG9mIGVhY2ggb2YgdGhlc2UgbW9kZXMgaXMgcmVndWxhdGVkIGJ5IGEgc2VyaWVzIG9mIHNlY29uZGFyeQpjb21tYW5kIGxpbmUgcmF0ZSBjb250cm9sIG9wdGlvbnMgYnV0IGFsc28gZGVwZW5kcyBzb21ld2hhdCBvbiB0aGUgc2VsZWN0ZWQKdXNlIGNhc2UsIHdoZXRoZXIgMi1wYXNzIGNvZGluZyBpcyBlbmFibGVkIGFuZCB0aGUgc2VsZWN0ZWQgZW5jb2RlIHNwZWVkIHZzCnF1YWxpdHkgdHJhZGUgb2ZmcyAoXHJlZiBBVjFfQ09NUC5zcGVlZCBhbmQgXHJlZiBBVjFfQ09NUC5zZikuCgpUaGUgbGlzdCBiZWxvdyBnaXZlcyB0aGUgbmFtZXMgb2YgdGhlIG1haW4gcmF0ZSBjb250cm9sIGNvbW1hbmQgbGluZQpvcHRpb25zIHRvZ2V0aGVyIHdpdGggdGhlIG5hbWVzIG9mIHRoZSBjb3JyZXNwb25kaW5nIGZpZWxkcyBpbiB0aGUgcmF0ZQpjb250cm9sIGNvbmZpZ3VyYXRpb24gZGF0YSBzdHJ1Y3R1cmVzLgoKLSA8Yj4tLXRhcmdldC1iaXRyYXRlPC9iPiAoXHJlZiBSYXRlQ29udHJvbENmZy50YXJnZXRfYmFuZHdpZHRoKQotIDxiPi0tbWluLXE8L2I+IChccmVmIFJhdGVDb250cm9sQ2ZnLmJlc3RfYWxsb3dlZF9xKQotIDxiPi0tbWF4LXE8L2I+IChccmVmIFJhdGVDb250cm9sQ2ZnLndvcnN0X2FsbG93ZWRfcSkKLSA8Yj4tLWNxLWxldmVsPC9iPiAoXHJlZiBSYXRlQ29udHJvbENmZy5jcV9sZXZlbCkKLSA8Yj4tLXVuZGVyc2hvb3QtcGN0PC9iPiAoXHJlZiBSYXRlQ29udHJvbENmZy51bmRlcl9zaG9vdF9wY3QpCi0gPGI+LS1vdmVyc2hvb3QtcGN0PC9iPiAoXHJlZiBSYXRlQ29udHJvbENmZy5vdmVyX3Nob290X3BjdCkKClRoZSBmb2xsb3dpbmcgY29udHJvbCBhc3BlY3RzIG9mIHZiciBlbmNvZGluZwoKLSA8Yj4tLWJpYXMtcGN0PC9iPiAoXHJlZiBSYXRlQ29udHJvbENmZy52YnJiaWFzKQotIDxiPi0tbWluc2VjdGlvbi1wY3Q8L2I+ICgoXHJlZiBSYXRlQ29udHJvbENmZy52YnJtaW5fc2VjdGlvbikKLSA8Yj4tLW1heHNlY3Rpb24tcGN0PC9iPiAoKFxyZWYgUmF0ZUNvbnRyb2xDZmcudmJybWF4X3NlY3Rpb24pCgpUaGUgZm9sbG93aW5nIHJlbGF0ZSB0byBidWZmZXIgYW5kIGRlbGF5IG1hbmFnZW1lbnQgaW4gb25lIHBhc3MgbG93IGRlbGF5IGFuZApyZWFsIHRpbWUgY29kaW5nCgotIDxiPi0tYnVmLXN6PC9iPiAoXHJlZiBSYXRlQ29udHJvbENmZy5tYXhpbXVtX2J1ZmZlcl9zaXplX21zKQotIDxiPi0tYnVmLWluaXRpYWwtc3o8L2I+IChccmVmIFJhdGVDb250cm9sQ2ZnLnN0YXJ0aW5nX2J1ZmZlcl9sZXZlbF9tcykKLSA8Yj4tLWJ1Zi1vcHRpbWFsLXN6PC9iPiAoXHJlZiBSYXRlQ29udHJvbENmZy5vcHRpbWFsX2J1ZmZlcl9sZXZlbF9tcykKClxzdWJzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfdmJyIFZhcmlhYmxlIEJpdHJhdGUgKFZCUikgRW5jb2RpbmcKCkZvciBzdHJlYW1lZCBWT0QgY29udGVudCB0aGUgbW9zdCBjb21tb24gcmF0ZSBjb250cm9sIHN0cmF0ZWd5IGlzIFZhcmlhYmxlCkJpdHJhdGUgKFZCUikgZW5jb2RpbmcuIFRoZSBDUSBtb2RlIG1lbnRpb25lZCBhYm92ZSBpcyBhIHZhcmlhbnQgb2YgdGhpcwp3aGVyZSBhZGRpdGlvbmFsIHF1YW50aXplciBhbmQgcXVhbGl0eSBjb25zdHJhaW50cyBhcmUgYXBwbGllZC4gIFZCUgplbmNvZGluZyBtYXkgaW4gdGhlb3J5IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBlaXRoZXIgMS1wYXNzIG9yIDItcGFzcwplbmNvZGluZy4KClZCUiBlbmNvZGluZyB2YXJpZXMgdGhlIG51bWJlciBvZiBiaXRzIGdpdmVuIHRvIGVhY2ggZnJhbWUgb3IgZ3JvdXAgb2YgZnJhbWVzCmFjY29yZGluZyB0byB0aGUgZGlmZmljdWx0eSBvZiB0aGF0IGZyYW1lIG9yIGdyb3VwIG9mIGZyYW1lcywgc3VjaCB0aGF0IGVhc2llcgpmcmFtZXMgYXJlIGFsbG9jYXRlZCBmZXdlciBiaXRzIGFuZCBoYXJkZXIgZnJhbWVzIGFyZSBhbGxvY2F0ZWQgbW9yZSBiaXRzLiBUaGUKaW50ZW50IGhlcmUgaXMgdG8gZXZlbiBvdXQgdGhlIHF1YWxpdHkgYmV0d2VlbiBmcmFtZXMuIFRoaXMgY29udHJhc3RzIHdpdGgKQ29uc3RhbnQgQml0cmF0ZSAoQ0JSKSBlbmNvZGluZyB3aGVyZSBlYWNoIGZyYW1lIGlzIGFsbG9jYXRlZCB0aGUgc2FtZSBudW1iZXIKb2YgYml0cy4KCldoaWxzdCBmb3IgYW55IGdpdmVuIGZyYW1lIG9yIGdyb3VwIG9mIGZyYW1lcyB0aGUgZGF0YSByYXRlIG1heSB2YXJ5LCB0aGUgVkJSCmFsZ29yaXRobSBhdHRlbXB0cyB0byBkZWxpdmVyIGEgZ2l2ZW4gYXZlcmFnZSBiaXRyYXRlIG92ZXIgYSB3aWRlciB0aW1lCmludGVydmFsLiBJbiBzdGFuZGFyZCBWQlIgZW5jb2RpbmcsIHRoZSB0aW1lIGludGVydmFsIG92ZXIgd2hpY2ggdGhlIGRhdGEgcmF0ZQppcyBhdmVyYWdlZCBpcyB1c3VhbGx5IHRoZSBkdXJhdGlvbiBvZiB0aGUgdmlkZW8gY2xpcC4gIEFuIGFsdGVybmF0aXZlCmFwcHJvYWNoIGlzIHRvIHRhcmdldCBhbiBhdmVyYWdlIFZCUiBiaXRyYXRlIG92ZXIgdGhlIGVudGlyZSB2aWRlbyBjb3JwdXMgZm9yCmEgcGFydGljdWxhciB2aWRlbyBmb3JtYXQgKGNvcnB1cyBWQlIpLgoKXHN1YnN1YnNlY3Rpb24gYXJjaGl0ZWN0dXJlX2VuY18xcGFzc192YnIgMSBQYXNzIFZCUiBFbmNvZGluZwoKVGhlIGNvbW1hbmQgbGluZSBmb3IgbGliYW9tIGRvZXMgYWxsb3cgMSBQYXNzIFZCUiwgYnV0IHRoaXMgaGFzIG5vdCBiZWVuCnByb3Blcmx5IG9wdGltaXNlZCBhbmQgYmVoYXZlcyBtdWNoIGxpa2UgMSBwYXNzIENCUiBpbiBtb3N0IHJlZ2FyZHMsIHdpdGggYml0cwphbGxvY2F0ZWQgdG8gZnJhbWVzIGJ5IHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKLSBccmVmIGF2MV9jYWxjX2lmcmFtZV90YXJnZXRfc2l6ZV9vbmVfcGFzc192YnIoKQotIFxyZWYgYXYxX2NhbGNfcGZyYW1lX3RhcmdldF9zaXplX29uZV9wYXNzX3ZicigpCgpcc3Vic3Vic2VjdGlvbiBhcmNoaXRlY3R1cmVfZW5jXzJwYXNzX3ZiciAyIFBhc3MgVkJSIEVuY29kaW5nCgpUaGUgbWFpbiBmb2N1cyBoZXJlIHdpbGwgYmUgb24gMi1wYXNzIFZCUiBlbmNvZGluZyAoYW5kIHRoZSByZWxhdGVkIENRIG1vZGUpCmFzIHRoZXNlIGFyZSB0aGUgbW9kZXMgbW9zdCBjb21tb25seSB1c2VkIGZvciBWT0QgY29udGVudC4KCjItcGFzcyBlbmNvZGluZyBpcyBzZWxlY3RlZCBvbiB0aGUgY29tbWFuZCBsaW5lIGJ5IHNldHRpbmcgLS1wYXNzZXM9Mgoob3IgLXAgMikuCgpHZW5lcmFsbHkgc3BlYWtpbmcsIGluIDItcGFzcyBlbmNvZGluZywgYW4gZW5jb2RlciB3aWxsIGZpcnN0IGVuY29kZSBhIHZpZGVvCnVzaW5nIGEgZGVmYXVsdCBzZXQgb2YgcGFyYW1ldGVycyBhbmQgYXNzdW1wdGlvbnMuIERlcGVuZGluZyBvbiB0aGUgb3V0Y29tZQpvZiB0aGF0IGZpcnN0IGVuY29kZSwgdGhlIGJhc2VsaW5lIGFzc3VtcHRpb25zIGFuZCBwYXJhbWV0ZXJzIHdpbGwgYmUgYWRqdXN0ZWQKdG8gb3B0aW1pemUgdGhlIG91dHB1dCBkdXJpbmcgdGhlIHNlY29uZCBwYXNzLiAgSW4gZXNzZW5jZSB0aGUgZmlyc3QgcGFzcyBpcyBhCmZhY3QgZmluZGluZyBtaXNzaW9uIHRvIGVzdGFibGlzaCB0aGUgY29tcGxleGl0eSBhbmQgdmFyaWFiaWxpdHkgb2YgdGhlIHZpZGVvLAppbiBvcmRlciB0byBhbGxvdyBhIGJldHRlciBhbGxvY2F0aW9uIG9mIGJpdHMgaW4gdGhlIHNlY29uZCBwYXNzLgoKVGhlIGxpYmFvbSAyLXBhc3MgYWxnb3JpdGhtIGlzIHVudXN1YWwgaW4gdGhhdCB0aGUgZmlyc3QgcGFzcyBpcyBub3QgYSBmdWxsCmVuY29kZSBvZiB0aGUgdmlkZW8uIFJhdGhlciBpdCB1c2VzIGEgbGltaXRlZCBzZXQgb2YgcHJlZGljdGlvbiBhbmQgdHJhbnNmb3JtCm9wdGlvbnMgYW5kIGEgZml4ZWQgcXVhbnRpemVyLCAgdG8gZ2VuZXJhdGUgc3RhdGlzdGljcyBhYm91dCBlYWNoIGZyYW1lLiBObwpvdXRwdXQgYml0c3RyZWFtIGlzIGNyZWF0ZWQgYW5kIHRoZSBwZXIgZnJhbWUgZmlyc3QgcGFzcyBzdGF0aXN0aWNzIGFyZSBzdG9yZWQKZW50aXJlbHkgaW4gdm9sYXRpbGUgbWVtb3J5LiBUaGlzIGhhcyBzb21lIGRpc2FkdmFudGFnZXMgd2hlbiBjb21wYXJlZCB0byBhCmZ1bGwgZmlyc3QgcGFzcyBlbmNvZGUsIGJ1dCBhdm9pZHMgdGhlIG5lZWQgZm9yIGZpbGUgSS9PIGFuZCBpbXByb3ZlcyBzcGVlZC4KCkZvciB0d28gcGFzcyBlbmNvZGluZywgdGhlIGZ1bmN0aW9uIFxyZWYgYXYxX2VuY29kZSgpIHdpbGwgZmlyc3QgYmUgY2FsbGVkCmZvciBlYWNoIGZyYW1lIGluIHRoZSB2aWRlbyB3aXRoIHRoZSB2YWx1ZSBccmVmIEFWMUVuY29kZXJDb25maWcucGFzcyA9IDEuClRoaXMgd2lsbCByZXN1bHQgaW4gY2FsbHMgdG8gXHJlZiBhdjFfZmlyc3RfcGFzcygpLgoKU3RhdGlzdGljcyBmb3IgZWFjaCBmcmFtZSBhcmUgc3RvcmVkIGluIFxyZWYgRklSU1RQQVNTX1NUQVRTIGZyYW1lX3N0YXRzX2J1Zi4KCkFmdGVyIGNvbXBsZXRpb24gb2YgdGhlIGZpcnN0IHBhc3MsIFxyZWYgYXYxX2VuY29kZSgpIHdpbGwgYmUgY2FsbGVkIGFnYWluIGZvcgplYWNoIGZyYW1lIHdpdGggXHJlZiBBVjFFbmNvZGVyQ29uZmlnLnBhc3MgPSAyLiAgVGhlIGZyYW1lcyBhcmUgdGhlbiBlbmNvZGVkIGluCmFjY29yZGFuY2Ugd2l0aCB0aGUgc3RhdGlzdGljcyBnYXRoZXJlZCBkdXJpbmcgdGhlIGZpcnN0IHBhc3MgYnkgY2FsbHMgdG8KXHJlZiBlbmNvZGVfZnJhbWVfdG9fZGF0YV9yYXRlKCkgd2hpY2ggaW4gdHVybiBjYWxscwogXHJlZiBhdjFfZ2V0X3NlY29uZF9wYXNzX3BhcmFtcygpLgoKSW4gc3VtbWFyeSB0aGUgc2Vjb25kIHBhc3MgY29kZSA6LQoKLSBTZWFyY2hlcyBmb3Igc2NlbmUgY3V0cyAoaWYgYXV0byBrZXkgZnJhbWUgZGV0ZWN0aW9uIGlzIGVuYWJsZWQpLgotIERlZmluZXMgdGhlIGxlbmd0aCBvZiBhbmQgaGllcmFyY2hpY2FsIHN0cnVjdHVyZSB0byBiZSB1c2VkIGluIGVhY2gKICBBUkYvR0YgZ3JvdXAuCi0gQWxsb2NhdGVzIGJpdHMgYmFzZWQgb24gdGhlIHJlbGF0aXZlIGNvbXBsZXhpdHkgb2YgZWFjaCBmcmFtZSwgdGhlIHF1YWxpdHkKICBvZiBmcmFtZSB0byBmcmFtZSBwcmVkaWN0aW9uIGFuZCB0aGUgdHlwZSBvZiBmcmFtZSAoZS5nLiBrZXkgZnJhbWUsIEFSRgogIGZyYW1lLCBnb2xkZW4gZnJhbWUgb3Igbm9ybWFsIGxlYWYgZnJhbWUpLgotIFN1Z2dlc3RzIGEgbWF4aW11bSBRIChxdWFudGl6ZXIgdmFsdWUpIGZvciBlYWNoIEFSRi9HRiBncm91cCwgYmFzZWQgb24KICBlc3RpbWF0ZWQgY29tcGxleGl0eSBhbmQgcmVjZW50IHJhdGUgY29udHJvbCBjb21wbGlhbmNlCiAgKFxyZWYgUkFURV9DT05UUk9MLmFjdGl2ZV93b3JzdF9xdWFsaXR5KQotIFRyYWNrcyBhZGhlcmVuY2UgdG8gdGhlIG92ZXJhbGwgcmF0ZSBjb250cm9sIG9iamVjdGl2ZXMgYW5kIGFkanVzdHMKICBoZXVyaXN0aWNzLgoKVGhlIG1haW4gdHdvIHBhc3MgZnVuY3Rpb25zIGluIHJlZ2FyZCB0byB0aGUgYWJvdmUgaW5jbHVkZTotCgotIFxyZWYgZmluZF9uZXh0X2tleV9mcmFtZSgpCi0gXHJlZiBkZWZpbmVfZ2ZfZ3JvdXAoKQotIFxyZWYgY2FsY3VsYXRlX3RvdGFsX2dmX2dyb3VwX2JpdHMoKQotIFxyZWYgZ2V0X3R3b3Bhc3Nfd29yc3RfcXVhbGl0eSgpCi0gXHJlZiBhdjFfZ29wX3NldHVwX3N0cnVjdHVyZSgpCi0gXHJlZiBhdjFfZ29wX2JpdF9hbGxvY2F0aW9uKCkKLSBccmVmIGF2MV90d29wYXNzX3Bvc3RlbmNvZGVfdXBkYXRlKCkKCkZvciBlYWNoIGZyYW1lLCB0aGUgdHdvIHBhc3MgYWxnb3JpdGhtIGRlZmluZXMgYSB0YXJnZXQgbnVtYmVyIG9mIGJpdHMKXHJlZiBSQVRFX0NPTlRST0wuYmFzZV9mcmFtZV90YXJnZXQsICB3aGljaCBpcyB0aGVuIGFkanVzdGVkIGlmIG5lY2Vzc2FyeSB0bwpyZWZsZWN0IGFueSB1bmRlcnNob290IG9yIG92ZXJzaG9vdCBvbiBwcmV2aW91cyBmcmFtZXMgdG8gZ2l2ZQpccmVmIFJBVEVfQ09OVFJPTC50aGlzX2ZyYW1lX3RhcmdldC4KCkFzIHdlbGwgYXMgXHJlZiBSQVRFX0NPTlRST0wuYWN0aXZlX3dvcnN0X3F1YWxpdHksIHRoZSB0d28gcGFzcyBjb2RlIGFsc28KbWFpbnRhaW5zIGEgcmVjb3JkIG9mIHRoZSBhY3R1YWwgUSB2YWx1ZSB1c2VkIHRvIGVuY29kZSBwcmV2aW91cyBmcmFtZXMKYXQgZWFjaCBsZXZlbCBpbiB0aGUgY3VycmVudCBweXJhbWlkIGhpZXJhcmNoeQooXHJlZiBSQVRFX0NPTlRST0wuYWN0aXZlX2Jlc3RfcXVhbGl0eSkuIFRoZSBmdW5jdGlvbgpccmVmIHJjX3BpY2tfcV9hbmRfYm91bmRzKCksIHVzZXMgdGhlc2UgdmFsdWVzIHRvIHNldCBhIHBlcm1pdHRlZCBRIHJhbmdlCmZvciBlYWNoIGZyYW1lLgoKXHN1YnN1YnNlY3Rpb24gYXJjaGl0ZWN0dXJlX2VuY18xcGFzc19sYWdnZWQgMSBQYXNzIExhZ2dlZCBWQlIgRW5jb2RpbmcKCjEgcGFzcyBsYWdnZWQgZW5jb2RlIGZhbGxzIGJldHdlZW4gc2ltcGxlIDEgcGFzcyBlbmNvZGluZyBhbmQgZnVsbCB0d28gcGFzcwplbmNvZGluZyBhbmQgaXMgdXNlZCBmb3IgY2FzZXMgd2hlcmUgaXQgaXMgbm90IHBvc3NpYmxlIHRvIGRvIGEgZnVsbCBmaXJzdApwYXNzIHRocm91Z2ggdGhlIGVudGlyZSB2aWRlbyBjbGlwLCBidXQgd2hlcmUgc29tZSBkZWxheSBpcyBwZXJtaXNzaWJsZS4gRm9yCmV4YW1wbGUgbmVhciBsaXZlIHN0cmVhbWluZyB3aGVyZSB0aGVyZSBpcyBhIGRlbGF5IG9mIHVwIHRvIGEgZmV3IHNlY29uZHMuIEluCnRoaXMgY2FzZSB0aGUgZmlyc3QgcGFzcyBhbmQgc2Vjb25kIHBhc3MgYXJlIGluIGVmZmVjdCBjb21iaW5lZCBzdWNoIHRoYXQgdGhlCmZpcnN0IHBhc3Mgc3RhcnRzIGVuY29kaW5nIHRoZSBjbGlwIGFuZCB0aGUgc2Vjb25kIHBhc3MgbGFncyBiZWhpbmQgaXQgYnkgYQpmZXcgZnJhbWVzLiAgV2hlbiB1c2luZyB0aGlzIG1ldGhvZCwgZnVsbCBzZXF1ZW5jZSBsZXZlbCBzdGF0aXN0aWNzIGFyZSBub3QKYXZhaWxhYmxlLCBidXQgaXQgaXMgcG9zc2libGUgdG8gY29sbGVjdCBhbmQgdXNlIGZyYW1lIG9yIGdyb3VwIG9mIGZyYW1lIGxldmVsCmRhdGEgdG8gaGVscCBpbiB0aGUgYWxsb2NhdGlvbiBvZiBiaXRzIGFuZCBpbiBkZWZpbmluZyBBUkYvR0YgY29kaW5nCmhpZXJhcmNoaWVzLiAgVGhlIHJlYWRlciBpcyByZWZlcnJlZCB0byB0aGUgXHJlZiBBVjFfQ09NUC5sYXBfZW5hYmxlZCBmaWVsZAppbiB0aGUgbWFpbiBjb21wcmVzc29yIGluc3RhbmNlICh3aGVyZSA8Yj5sYXA8L2I+IHN0YW5kcyBmb3IKPGI+bG9vayBhaGVhZCBwcm9jZXNzaW5nPC9iPikuIFRoaXMgZW5jb2RpbmcgbW9kZSBmb3IgdGhlIG1vc3QgcGFydCB1c2VzIHRoZQpzYW1lIHJhdGUgY29udHJvbCBwYXRod2F5cyBhcyB0d28gcGFzcyBWQlIgZW5jb2RpbmcuCgpcc3Vic2VjdGlvbiBhcmNoaXRlY3R1cmVfZW5jX3JjX2xvb3AgVGhlIE1haW4gUmF0ZSBDb250cm9sIExvb3AKCkhhdmluZyBlc3RhYmxpc2hlZCBhIHRhcmdldCByYXRlIGZvciBhIGdpdmVuIGZyYW1lIGFuZCBhbiBhbGxvd2VkIHJhbmdlIG9mIFEKdmFsdWVzLCB0aGUgZW5jb2RlciB0aGVuIHRyaWVzIHRvIGVuY29kZSB0aGUgZnJhbWUgYXQgYSByYXRlIHRoYXQgaXMgYXMgY2xvc2UKYXMgcG9zc2libGUgdG8gdGhlIHRhcmdldCB2YWx1ZSwgZ2l2ZW4gdGhlIFEgcmFuZ2UgY29uc3RyYWludHMuCgpUaGVyZSBhcmUgdHdvIG1haW4gbWVjaGFuaXNtcyBieSB3aGljaCB0aGlzIGlzIGFjaGlldmVkLgoKVGhlIGZpcnN0IHNlbGVjdHMgYSBmcmFtZSBsZXZlbCBRLCB1c2luZyBhbiBhZGFwdGl2ZSBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mCmJpdHMgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCB3aGVuIHRoZSBmcmFtZSBpcyBlbmNvZGVkIGF0IGFueSBnaXZlbiBRLgpGdW5kYW1lbnRhbGx5IHRoaXMgbWVjaGFuaXNtIGlzIGNvbW1vbiB0byBWQlIsIENCUiBhbmQgdG8gdXNlIGNhc2VzIHN1Y2ggYXMKUlRDIHdpdGggc21hbGwgYWRqdXN0bWVudHMuCgpBcyB0aGUgUSB2YWx1ZSBtYWlubHkgYWRqdXN0cyB0aGUgcHJlY2lzaW9uIG9mIHRoZSByZXNpZHVhbCBzaWduYWwsIGl0IGlzIG5vdAphY3R1YWxseSBhIHJlbGlhYmxlIGJhc2lzIGZvciBhY2N1cmF0ZWx5IHByZWRpY3RpbmcgdGhlIG51bWJlciBvZiBiaXRzIHRoYXQKd2lsbCBiZSBnZW5lcmF0ZWQgYWNyb3NzIGFsbCBjbGlwcy4gQSB3ZWxsIHByZWRpY3RlZCBjbGlwLCBmb3IgZXhhbXBsZSwgbWF5CmhhdmUgYSBtdWNoIHNtYWxsZXIgZXJyb3IgcmVzaWR1YWwgYWZ0ZXIgcHJlZGljdGlvbi4gIFRoZSBhbGdvcml0aG0gY29wZXMgd2l0aAp0aGlzIGJ5IGFkYXB0aW5nIGl0cyBwcmVkaWN0aW9ucyBvbiB0aGUgZmx5IHVzaW5nIGEgZmVlZGJhY2sgbG9vcCBiYXNlZCBvbiBob3cKd2VsbCBpdCBkaWQgdGhlIHByZXZpb3VzIHRpbWUgYXJvdW5kLgoKVGhlIG1haW4gZnVuY3Rpb25zIHJlc3BvbnNpYmxlIGZvciB0aGUgcHJlZGljdGlvbiBvZiBRIGFuZCB0aGUgYWRhcHRhdGlvbiBvdmVyCnRpbWUsIGZvciB0aGUgdHdvIHBhc3MgZW5jb2RpbmcgcGlwZWxpbmUgYXJlOgoKLSBccmVmIHJjX3BpY2tfcV9hbmRfYm91bmRzKCkKICAgIC0gXHJlZiBnZXRfcSgpCiAgICAgICAgLSBccmVmIGF2MV9yY19yZWd1bGF0ZV9xKCkKICAgICAgICAtIFxyZWYgZ2V0X3JhdGVfY29ycmVjdGlvbl9mYWN0b3IoKQogICAgICAgIC0gXHJlZiBzZXRfcmF0ZV9jb3JyZWN0aW9uX2ZhY3RvcigpCiAgICAgICAgLSBccmVmIGZpbmRfY2xvc2VzdF9xaW5kZXhfYnlfcmF0ZSgpCi0gXHJlZiBhdjFfdHdvcGFzc19wb3N0ZW5jb2RlX3VwZGF0ZSgpCiAgICAtIFxyZWYgYXYxX3JjX3VwZGF0ZV9yYXRlX2NvcnJlY3Rpb25fZmFjdG9ycygpCgpBIHNlY29uZCBtZWNoYW5pc20gZm9yIGNvbnRyb2wgY29tZXMgaW50byBwbGF5IGlmIHRoZXJlIGlzIGEgbGFyZ2UgcmF0ZSBtaXNzCmZvciB0aGUgY3VycmVudCBmcmFtZSAobXVjaCB0b28gYmlnIG9yIHRvbyBzbWFsbCkuIFRoaXMgaXMgYSByZWNvZGUgbWVjaGFuaXNtCndoaWNoIGFsbG93cyB0aGUgY3VycmVudCBmcmFtZSB0byBiZSByZS1lbmNvZGVkIG9uZSBvciBtb3JlIHRpbWVzIHdpdGggYQpyZXZpc2VkIFEgdmFsdWUuIFRoaXMgb2J2aW91c2x5IGhhcyBzaWduaWZpY2FudCBpbXBsaWNhdGlvbnMgZm9yIGVuY29kZSBzcGVlZAphbmQgaW4gdGhlIGNhc2Ugb2YgUlRDIGxhdGVuY3kgKGhlbmNlIGl0IGlzIG5vdCB1c2VkIGZvciB0aGUgUlRDIHBhdGh3YXkpLgoKV2hldGhlciBvciBub3QgYSByZWNvZGUgaXMgYWxsb3dlZCBmb3IgYSBnaXZlbiBmcmFtZSBkZXBlbmRzIG9uIHRoZSBzZWxlY3RlZAplbmNvZGUgc3BlZWQgdnMgcXVhbGl0eSB0cmFkZSBvZmYuIFRoaXMgaXMgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUgdXNpbmcgdGhlCi0tY3B1LXVzZWQgcGFyYW1ldGVyIHdoaWNoIG1hcHMgb250byB0aGUgXHJlZiBBVjFfQ09NUC5zcGVlZCBmaWVsZCBpbiB0aGUgbWFpbgpjb21wcmVzc29yIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlLgoKVGhlIHZhbHVlIG9mIFxyZWYgQVYxX0NPTVAuc3BlZWQsIGNvbWJpbmVkIHdpdGggdGhlIHVzZSBjYXNlLCBpcyB1c2VkIHRvCnBvcHVsYXRlIHRoZSBzcGVlZCBmZWF0dXJlcyBkYXRhIHN0cnVjdHVyZSBBVjFfQ09NUC5zZi4gSW4gcGFydGljdWxhcgpccmVmIEhJR0hfTEVWRUxfU1BFRURfRkVBVFVSRVMucmVjb2RlX2xvb3AgZGV0ZXJtaW5lcyB0aGUgdHlwZXMgb2YgZnJhbWVzIHRoYXQKbWF5IGJlIHJlY29kZWQgYW5kIFxyZWYgSElHSF9MRVZFTF9TUEVFRF9GRUFUVVJFUy5yZWNvZGVfdG9sZXJhbmNlIGlzIGEgcmF0ZQplcnJvciB0cmlnZ2VyIHRocmVzaG9sZC4KCkZvciBtb3JlIGluZm9ybWF0aW9uIHRoZSByZWFkZXIgaXMgZGlyZWN0ZWQgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgotIFxyZWYgZW5jb2RlX3dpdGhfcmVjb2RlX2xvb3AoKQotIFxyZWYgZW5jb2RlX3dpdGhvdXRfcmVjb2RlKCkKLSBccmVmIHJlY29kZV9sb29wX3VwZGF0ZV9xKCkKLSBccmVmIHJlY29kZV9sb29wX3Rlc3QoKQotIFxyZWYgYXYxX3NldF9zcGVlZF9mZWF0dXJlc19mcmFtZXNpemVfaW5kZXBlbmRlbnQoKQotIFxyZWYgYXYxX3NldF9zcGVlZF9mZWF0dXJlc19mcmFtZXNpemVfZGVwZW5kZW50KCkKClxzdWJzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfZml4ZWRfcSBGaXhlZCBRIE1vZGUKClRoZXJlIGFyZSB0d28gbWFpbiBmaXhlZCBRIGNhc2VzOgotIyBGaXhlZCBRIHdpdGggYWRhcHRpdmUgcXAgb2Zmc2V0czogc2FtZSBxcCBvZmZzZXQgZm9yIGVhY2ggcHlyYW1pZCBsZXZlbAogICBpbiBhIGdpdmVuIHZpZGVvLCBidXQgdGhlc2Ugb2Zmc2V0cyBhcmUgYWRhcHRpdmUgYmFzZWQgb24gdmlkZW8gY29udGVudC4KLSMgRml4ZWQgUSB3aXRoIGZpeGVkIHFwIG9mZnNldHM6IGNvbnRlbnQtaW5kZXBlbmRlbnQgZml4ZWQgcXAgb2Zmc2V0cyBmb3IKICAgZWFjaCBweXJhbWlkIGxldmVsLiAoc2VlIFxyZWYgZ2V0X3FfdXNpbmdfZml4ZWRfb2Zmc2V0cygpKS4KClRoZSByZWFkZXIgaXMgYWxzbyByZWZlcmVkIHRvIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgotIFxyZWYgYXYxX3JjX3BpY2tfcV9hbmRfYm91bmRzKCkKLSBccmVmIHJjX3BpY2tfcV9hbmRfYm91bmRzX25vX3N0YXRzX2NicigpCi0gXHJlZiByY19waWNrX3FfYW5kX2JvdW5kc19ub19zdGF0cygpCi0gXHJlZiByY19waWNrX3FfYW5kX2JvdW5kcygpCgpcc2VjdGlvbiBhcmNoaXRlY3R1cmVfZW5jX2ZyYW1lX2dyb3VwcyBHRi8gQVJGIEZyYW1lIEdyb3VwcyAmIEhpZXJhcmNoaWNhbCBDb2RpbmcKClxzdWJzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfZnJhbWVfZ3JvdXBzX2RhdGEgTWFpbiBEYXRhIFN0cnVjdHVyZXMKClRoZSBmb2xsb3dpbmcgYXJlIHRoZSBtYWluIGRhdGEgc3RydWN0dXJlcyByZWZlcmVuY2VkIGluIHRoaXMgc2VjdGlvbgooc2VlIGFsc28gXHJlZiBhcmNoaXRlY3R1cmVfZW5jX2RhdGFfc3RydWN0dXJlcyk6CgotIFxyZWYgQVYxX0NPTVAgY3BpICh0aGUgbWFpbiBjb21wcmVzc29yIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlKQogICAgLSBccmVmIEFWMV9DT01QLnJjIChccmVmIFJBVEVfQ09OVFJPTCkKCi0gXHJlZiBGSVJTVFBBU1NfU1RBVFMgKmZyYW1lX3N0YXRzX2J1ZiAodXNlZCB0byBzdG9yZSBwZXIgZnJhbWUgZmlyc3QgcGFzcwpzdGF0cykKClxzdWJzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfZnJhbWVfZ3JvdXBzX2dyb3VwcyBGcmFtZSBHcm91cHMKClRvIHByb2Nlc3MgYSBzZXF1ZW5jZS9zdHJlYW0gb2YgdmlkZW8gZnJhbWVzLCB0aGUgZW5jb2RlciBkaXZpZGVzIHRoZSBmcmFtZXMKaW50byBncm91cHMgYW5kIGVuY29kZXMgdGhlbSBzZXF1ZW50aWFsbHkgKHBvc3NpYmx5IGRlcGVuZGVudCBvbiBwcmV2aW91cwpncm91cHMpLiBJbiBBVjEgc3VjaCBhIGdyb3VwIGlzIHVzdWFsbHkgcmVmZXJyZWQgdG8gYXMgYSBnb2xkZW4gZnJhbWUgZ3JvdXAKKEdGIGdyb3VwKSBvciBzb21ldGltZXMgYW4gQWx0LVJlZiAoQVJGKSBncm91cCBvciBhIGdyb3VwIG9mIHBpY3R1cmVzIChHT1ApLgpBIEdGIGdyb3VwIGRldGVybWluZXMgYW5kIHN0b3JlcyB0aGUgY29kaW5nIHN0cnVjdHVyZSBvZiB0aGUgZnJhbWVzIChmb3IKZXhhbXBsZSwgZnJhbWUgdHlwZSwgdXNhZ2Ugb2YgdGhlIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUsIHVzYWdlIG9mIG92ZXJsYXkKZnJhbWVzLCBldGMuKSBhbmQgY2FuIGJlIGNvbnNpZGVyZWQgYXMgdGhlIGJhc2UgdW5pdCB0byBwcm9jZXNzIHRoZSBmcmFtZXMsCnRoZXJlZm9yZSBwbGF5aW5nIGFuIGltcG9ydGFudCByb2xlIGluIHRoZSBlbmNvZGVyLgoKVGhlIGxlbmd0aCBvZiBhIHNwZWNpZmljIEdGIGdyb3VwIGlzIGFyZ3VhYmx5IHRoZSBtb3N0IGltcG9ydGFudCBhc3BlY3Qgd2hlbgpkZXRlcm1pbmluZyBhIEdGIGdyb3VwLiBUaGlzIGlzIGJlY2F1c2UgbW9zdCBHRiBncm91cCBsZXZlbCBkZWNpc2lvbnMgYXJlCmJhc2VkIG9uIHRoZSBmcmFtZSBjaGFyYWN0ZXJpc3RpY3MsIGlmIG5vdCBvbiB0aGUgbGVuZ3RoIGl0c2VsZiBkaXJlY3RseS4KTm90ZSB0aGF0IHRoZSBHRiBncm91cCBpcyBhbHdheXMgYSBncm91cCBvZiBjb25zZWN1dGl2ZSBmcmFtZXMsIHdoaWNoIG1lYW5zCnRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBncm91cCAoc28gYWdhaW4sIHRoZSBsZW5ndGggb2YgaXQpIGRldGVybWluZXMgd2hpY2gKZnJhbWVzIGFyZSBpbmNsdWRlZCBpbiBpdCBhbmQgaGVuY2UgZGV0ZXJtaW5lcyB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBHRgpncm91cC4gVGhlcmVmb3JlLCBpbiB0aGlzIGRvY3VtZW50IHdlIHdpbGwgZmlyc3QgZGlzY3VzcyB0aGUgR0YgZ3JvdXAgbGVuZ3RoCmRlY2lzaW9uIGluIExpYmFvbSwgZm9sbG93ZWQgYnkgZnJhbWUgc3RydWN0dXJlIGRlY2lzaW9ucyB3aGVuIGRlZmluaW5nIGEgR0YKZ3JvdXAgd2l0aCBhIGNlcnRhaW4gbGVuZ3RoLgoKXHN1YnNlY3Rpb24gYXJjaGl0ZWN0dXJlX2VuY19nZl9sZW5ndGggR0YgLyBBUkYgR3JvdXAgTGVuZ3RoIERldGVybWluYXRpb24KClRoZSBiYXNpYyBpbnR1aXRpb24gb2YgZGV0ZXJtaW5pbmcgdGhlIEdGIGdyb3VwIGxlbmd0aCBpcyB0aGF0IGl0IGlzIHVzdWFsbHkKZGVzaXJhYmxlIHRvIGdyb3VwIHRvZ2V0aGVyIGZyYW1lcyB0aGF0IGFyZSBzaW1pbGFyLiBIZW5jZSwgd2UgbWF5IGNob29zZQpsb25nZXIgZ3JvdXBzIHdoZW4gY29uc2VjdXRpdmUgZnJhbWVzIGFyZSB2ZXJ5IGFsaWtlIGFuZCBzaG9ydGVyIG9uZXMgd2hlbgp0aGV5IGFyZSB2ZXJ5IGRpZmZlcmVudC4KClRoZSBkZXRlcm1pbmF0aW9uIG9mIHRoZSBHRiBncm91cCBsZW5ndGggaXMgZG9uZSBpbiBmdW5jdGlvbiBccmVmCmNhbGN1bGF0ZV9nZl9sZW5ndGgoKS4gVGhlIGZvbGxvd2luZyBlbmNvZGVyIHVzZSBjYXNlcyBhcmUgc3VwcG9ydGVkOgoKPHVsPgogIDxsaT48Yj5TaW5nbGUgcGFzcyB3aXRoIGxvb2stYWhlYWQgZGlzYWJsZWQoXHJlZiBoYXNfbm9fc3RhdHNfc3RhZ2UoKSk6CiAgPC9iPiBpbiB0aGlzIGNhc2UgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24gYXZhaWxhYmxlIG9uIHRoZSBmb2xsb3dpbmcgc3RyZWFtCiAgb2YgZnJhbWVzLCB0aGVyZWZvcmUgdGhlIGZ1bmN0aW9uIHdpbGwgc2V0IHRoZSBHRiBncm91cCBsZW5ndGggZm9yIHRoZQogIGN1cnJlbnQgYW5kIHRoZSBmb2xsb3dpbmcgR0YgZ3JvdXBzIChhIHRvdGFsIG51bWJlciBvZiBNQVhfTlVNX0dGX0lOVEVSVkFMUwogIGdyb3VwcykgdG8gYmUgdGhlIG1heGltdW0gdmFsdWUgYWxsb3dlZC48L2xpPgoKICA8bGk+PGI+U2luZ2xlIHBhc3Mgd2l0aCBsb29rLWFoZWFkIGVuYWJsZWQgKFxyZWYgQVYxX0NPTVAubGFwX2VuYWJsZWQpOjwvYj4KICBsb29rLWFoZWFkIHByb2Nlc3NpbmcgaXMgZW5hYmxlZCBmb3Igc2luZ2xlIHBhc3MsIHRoZXJlZm9yZSB0aGVyZSBpcyBhCiAgbGltaXRlZCBhbW91bnQgb2YgaW5mb3JtYXRpb24gYXZhaWxhYmxlIHJlZ2FyZGluZyBmdXR1cmUgZnJhbWVzLiBJbiB0aGlzCiAgY2FzZSB0aGUgZnVuY3Rpb24gd2lsbCBkZXRlcm1pbmUgdGhlIGxlbmd0aCBiYXNlZCBvbiBccmVmIEZJUlNUUEFTU19TVEFUUwogICh3aGljaCBpcyBnZW5lcmF0ZWQgd2hlbiBwcm9jZXNzaW5nIHRoZSBsb29rLWFoZWFkIGJ1ZmZlcikgZm9yIG9ubHkgdGhlCiAgY3VycmVudCBHRiBncm91cC48L2xpPgoKICA8bGk+PGI+VHdvIHBhc3M6PC9iPiB0aGUgZmlyc3QgcGFzcyBpbiB0d28tcGFzcyBlbmNvZGluZyBjb2xsZWN0cyB0aGUgc3RhdHMKICBhbmQgd2lsbCBub3QgY2FsbCB0aGUgZnVuY3Rpb24uIEluIHRoZSBzZWNvbmQgcGFzcywgdGhlIGZ1bmN0aW9uIHRyaWVzIHRvCiAgZGV0ZXJtaW5lIHRoZSBHRiBncm91cCBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYW5kIHRoZSBmb2xsb3dpbmcgR0YgZ3JvdXBzIChhCiAgdG90YWwgbnVtYmVyIG9mIE1BWF9OVU1fR0ZfSU5URVJWQUxTIGdyb3VwcykgYmFzZWQgb24gdGhlIGZpcnN0LXBhc3MKICBzdGF0aXN0aWNzLiBOb3RlIHRoYXQgYXMgd2Ugd2lsbCBiZSBkaXNjdXNzaW5nIGxhdGVyLCBzdWNoIGRlY2lzaW9ucyBtYXkgbm90CiAgYmUgYWNjdXJhdGUgYW5kIGNhbiBiZSBjaGFuZ2VkIGxhdGVyLjwvbGk+CjwvdWw+CgpFeGNlcHQgZm9yIHRoZSBmaXJzdCB0cml2aWFsIGNhc2Ugd2hlcmUgdGhlcmUgaXMgbm8gcHJpb3Iga25vd2xlZGdlIG9mIHRoZQpmb2xsb3dpbmcgZnJhbWVzLCB0aGUgZnVuY3Rpb24gXHJlZiBjYWxjdWxhdGVfZ2ZfbGVuZ3RoKCkgdHJpZXMgdG8KZGV0ZXJtaW5lIHRoZSBHRiBncm91cCBsZW5ndGggYmFzZWQgb24gdGhlIGZpcnN0IHBhc3Mgc3RhdGlzdGljcy4gQXMgc2hvd24KaW4gZmlndXJlIFtUT0RPIEJvaGFsTGlAXSwgdGhlIGRldGVybWluYXRpb24gaXMgZGl2aWRlZCBpbnRvIHR3byBwYXJ0czoKCjxvbD4KICAgPGxpPkJhc2VsaW5lIGRlY2lzaW9uIGJhc2VkIG9uIGFjY3VtdWxhdGVkIHN0YXRpc3RpY3M6IHRoaXMgcGFydCBvZiB0aGUgZnVuY3Rpb24KICAgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgZmlyc3RwYXNzIHN0YXRpc3RpY3Mgb2YgdGhlIGZvbGxvd2luZyBmcmFtZXMgYW5kCiAgIGFjY3VtdWxhdGVzIHRoZSBzdGF0aXN0aWNzIHdpdGggZnVuY3Rpb24gYWNjdW11bGF0ZV9uZXh0X2ZyYW1lX3N0YXRzLgogICBUaGUgYWNjdW11bGF0ZWQgc3RhdGlzdGljcyBhcmUgdGhlbiB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZQogICBjb3JyZWxhdGlvbiBpbiB0aGUgR0YgZ3JvdXAgaGFzIGRyb3BwZWQgdG9vIG11Y2ggaW4gZnVuY3Rpb24gZGV0ZWN0X2dmX2N1dC4KICAgSWYgZGV0ZWN0X2dmX2N1dCByZXR1cm5zIG5vbi16ZXJvLCBvciBpZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YKICAgZmlyc3QtcGFzcyBzdGF0aXN0aWNzLCB0aGUgYmFzZWxpbmUgZGVjaXNpb24gaXMgc2V0IGF0IHRoZSBjdXJyZW50IHBvaW50LjwvbGk+CgogICA8bGk+SWYgd2UgYXJlIG5vdCBhdCB0aGUgZW5kIG9mIHRoZSBmaXJzdC1wYXNzIHN0YXRpc3RpY3MsIHRoZSBuZXh0IHBhcnQgd2lsbAogICB0cnkgdG8gcmVmaW5lIHRoZSBiYXNlbGluZSBkZWNpc2lvbi4gVGhlIGFsZ29yaXRobSBpcyBiYXNlZCBvbgogICBccmVmIEZJUlNUUEFTU19TVEFUUy5jb2RlZF9lcnJvci4gSXQgdHJpZXMgdG8gbGFiZWwgdGhlIGZyYW1lcyBpbiB0aGUKICAgYmFzZWxpbmUgZ3JvdXAgaW50byB0d28gY2xhc3NlczogaGlnaC1lcnJvciBhbmQgbG93LWVycm9yLCBhbmQgY3V0cyB0aGUgR0YKICAgZ3JvdXAgYXQgdGhlIGZ1cnRoZXN0IGxvY2F0aW9uIHRoYXQgaXMgYWxzbyBvZiB0aGUgbG93LWVycm9yIGNsYXNzLgogICBEZXRhaWxlZCBhbGdvcml0aG0gZGVzY3JpcHRpb24gaXMgaW50cm9kdWNlZCBoZXJlIFtUT0RPXS48L2xpPgo8L29sPgoKQXMgbWVudGlvbmVkLCBmb3IgdHdvLXBhc3MgZW5jb2RpbmcsIHRoZSBmdW5jdGlvbiBccmVmCmNhbGN1bGF0ZV9nZl9sZW5ndGgoKSB0cmllcyB0byBkZXRlcm1pbmUgdGhlIGxlbmd0aCBvZiBhcyBtYW55IGFzCk1BWF9OVU1fR0ZfSU5URVJWQUxTIGdyb3Vwcy4gVGhlIGRlY2lzaW9ucyBhcmUgc3RvcmVkIGluClxyZWYgUkFURV9DT05UUk9MLmdmX2ludGVydmFsc1tdLiBUaGUgdmFyaWFibGVzClxyZWYgUkFURV9DT05UUk9MLmludGVydmFsc190aWxsX2dmX2NhbGN1bGF0ZV9kdWUgYW5kClxyZWYgUkFURV9DT05UUk9MLmN1cl9nZl9pbmRleCBoZWxwIHdpdGggbWFuYWdpbmcgYW5kIHVwZGF0aW5nIHRoZSBzdG9yZWQKZGVjaXNpb25zLiBJbiB0aGUgZnVuY3Rpb24gXHJlZiBkZWZpbmVfZ2ZfZ3JvdXAoKSwgdGhlIGNvcnJlc3BvbmRpbmcKc3RvcmVkIGxlbmd0aCBkZWNpc2lvbiB3aWxsIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBjdXJyZW50IEdGIGdyb3VwLgoKV2hlbiB0aGUgbWF4aW11bSBHRiBncm91cCBsZW5ndGggaXMgbGFyZ2VyIG9yIGVxdWFsIHRvIDMyLCB0aGUgZW5jb2RlciB3aWxsCmVuZm9yY2UgYW4gZXh0cmEgbGF5ZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIG1heGltdW0gR0YgbGVuZ3RoIG9mIDMyCm9yIDE2IGZvciBldmVyeSBHRiBncm91cC4gSW4gc3VjaCBhIGNhc2UsIFxyZWYgY2FsY3VsYXRlX2dmX2xlbmd0aCgpIGlzCmZpcnN0IGNhbGxlZCB3aXRoIHRoZSBvcmlnaW5hbCBtYXhpbXVtIGxlbmd0aCAoPj0zMikuIEFmdGVyd2FyZHMsClxyZWYgYXYxX3RwbF9zZXR1cF9zdGF0cygpIGlzIGNhbGxlZCB0byBhbmFseXplIHRoZSBkZXRlcm1pbmVkIEdGIGdyb3VwCmFuZCBjb21wYXJlIHRoZSByZWZlcmVuY2UgdG8gdGhlIGxhc3QgZnJhbWUgYW5kIHRoZSBtaWRkbGUgZnJhbWUuIElmIGl0IGlzCmRlY2lkZWQgdGhhdCB3ZSBzaG91bGQgdXNlIGEgbWF4aW11bSBHRiBsZW5ndGggb2YgMTYsIHRoZSBmdW5jdGlvbgpccmVmIGNhbGN1bGF0ZV9nZl9sZW5ndGgoKSBpcyBjYWxsZWQgYWdhaW4gd2l0aCB0aGUgdXBkYXRlZCBtYXhpbXVtCmxlbmd0aCwgYW5kIGl0IG9ubHkgc2V0cyB0aGUgbGVuZ3RoIGZvciBhIHNpbmdsZSBHRiBncm91cAooXHJlZiBSQVRFX0NPTlRST0wuaW50ZXJ2YWxzX3RpbGxfZ2ZfY2FsY3VsYXRlX2R1ZSBpcyBzZXQgdG8gMSkuIFRoaXMgcHJvY2VzcwppcyBzaG93biBpbiBbVE9ETyBCb2hhbExpQF0uCgpCZWZvcmUgZW5jb2RpbmcgZWFjaCBmcmFtZSwgdGhlIGVuY29kZXIgY2hlY2tzClxyZWYgUkFURV9DT05UUk9MLmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUuIElmIGl0IGlzIHplcm8sIGluZGljYXRpbmcKcHJvY2Vzc2luZyBvZiB0aGUgY3VycmVudCBHRiBncm91cCBpcyBkb25lLCB0aGUgZW5jb2RlciB3aWxsIGNoZWNrIHdoZXRoZXIKXHJlZiBSQVRFX0NPTlRST0wuaW50ZXJ2YWxzX3RpbGxfZ2ZfY2FsY3VsYXRlX2R1ZSBpcyB6ZXJvLiBJZiBpdCBpcywgYXMKZGlzY3Vzc2VkIGFib3ZlLCBccmVmIGNhbGN1bGF0ZV9nZl9sZW5ndGgoKSBpcyBjYWxsZWQgd2l0aCBvcmlnaW5hbAptYXhpbXVtIGxlbmd0aC4gSWYgaXQgaXMgbm90IHplcm8sIHRoZW4gdGhlIEdGIGdyb3VwIGxlbmd0aCB2YWx1ZSBzdG9yZWQKaW4gXHJlZiBSQVRFX0NPTlRST0wuZ2ZfaW50ZXJ2YWxzW1xyZWYgUkFURV9DT05UUk9MLmN1cl9nZl9pbmRleF0gaXMgdXNlZAooc3ViamVjdCB0byBjaGFuZ2UgYXMgZGlzY3Vzc2VkIGFib3ZlKS4KClxzdWJzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfZ2Zfc3RydWN0dXJlIERlZmluaW5nIGEgR0YgR3JvdXAncyBTdHJ1Y3R1cmUKClRoZSBmdW5jdGlvbiBccmVmIGRlZmluZV9nZl9ncm91cCgpIGRlZmluZXMgdGhlIGZyYW1lIHN0cnVjdHVyZSBhcyB3ZWxsCmFzIG90aGVyIEdGIGdyb3VwIGxldmVsIHBhcmFtZXRlcnMgKGUuZy4gYml0IGFsbG9jYXRpb24pIG9uY2UgdGhlIGxlbmd0aCBvZgp0aGUgY3VycmVudCBHRiBncm91cCBpcyBkZXRlcm1pbmVkLgoKVGhlIGZ1bmN0aW9uIGZpcnN0IGl0ZXJhdGVzIHRocm91Z2ggdGhlIGZpcnN0IHBhc3Mgc3RhdGlzdGljcyBpbiB0aGUgR0YgZ3JvdXAKdG8gYWNjdW11bGF0ZSB2YXJpb3VzIHN0YXRzLCB1c2luZyAoVE9ETyBSRUYpIGFjY3VtdWxhdGVfdGhpc19mcmFtZV9zdGF0cygpCmFuZCAoVE9ETyBSRUYpYWNjdW11bGF0ZV9uZXh0X2ZyYW1lX3N0YXRzKCkuIFRoZSBhY2N1bXVsYXRlZCBzdGF0aXN0aWNzIGFyZQp0aGVuIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSB1c2Ugb2YgdGhlIHVzZSBvZiBBTFRSRUYgZnJhbWUgYWxvbmcgd2l0aCBvdGhlcgpwcm9wZXJ0aWVzIG9mIHRoZSBHRiBncm91cC4gVGhlIHZhbHVlcyBvZiBccmVmIFJBVEVfQ09OVFJPTC5jdXJfZ2ZfaW5kZXgsClxyZWYgUkFURV9DT05UUk9MLmludGVydmFsc190aWxsX2dmX2NhbGN1bGF0ZV9kdWUgYW5kClxyZWYgUkFURV9DT05UUk9MLmZyYW1lc190aWxsX2dmX3VwZGF0ZV9kdWUgYXJlIGFsc28gdXBkYXRlZCBhY2NvcmRpbmdseS4KClRoZSBmdW5jdGlvbiBccmVmIGF2MV9nb3Bfc2V0dXBfc3RydWN0dXJlKCkgaXMgY2FsbGVkIGF0IHRoZSBlbmQgdG8KZGV0ZXJtaW5lIHRoZSBmcmFtZSBsYXllcnMgYW5kIHJlZmVyZW5jZSBtYXBzIGluIHRoZSBHRiBncm91cCwgYXMgc2hvd24gaW4KW1RPRE8gQm9oYWxMaUBdLiBUaGUgKFRPRE8gUkVGKSBjb25zdHJ1Y3RfbXVsdGlfbGF5ZXJfZ2Zfc3RydWN0dXJlKCkKZnVuY3Rpb24gc2V0cyB0aGUgZnJhbWUgdXBkYXRlIHR5cGVzIGZvciBlYWNoIGZyYW1lIGFuZCB0aGUgZ3JvdXAgc3RydWN0dXJlLgoKLSBJZiBBTFRSRUYgZnJhbWVzIGFyZSBhbGxvd2VkIGZvciB0aGUgR0YgZ3JvdXA6IHRoZSBmaXJzdCBmcmFtZSBpcyBzZXQgdG8KICBLRl9VUERBVEUsIE9WRVJMQVlfVVBEQVRFIG9yIEdGX1VQREFURSBiYXNlZCBvbiB0aGUgcHJldmlvdXMgR0YgZ3JvdXAKICAoaWYgaXQgZXhpc3RzKS4gVGhlIGxhc3QgZnJhbWUgb2YgdGhlIEdGIGdyb3VwIGlzIHNldCB0byBBUkZfVVBEQVRFLgogIFRoZW4gaW4gKFRPRE8gUkVGKSBzZXRfbXVsdGlfbGF5ZXJfcGFyYW1zKCksIGZyYW1lIHVwZGF0ZSB0eXBlcyBhcmUKICBkZXRlcm1pbmVkIHJlY3Vyc2l2ZWx5IGluIGEgYmluYXJ5IHRyZWUgZmFzaGlvbiwgYW5kIGFzc2lnbmVkIHRvIGdpdmUKICB0aGUgZmluYWwgSUJCQiBzdHJ1Y3R1cmUgZm9yIHRoZSBncm91cC4KICAgIC0gSWYgdGhlIGN1cnJlbnQgYnJhbmNoIGhhcyBtb3JlIHRoYW4gMiBmcmFtZXMgYW5kIHdlIGhhdmUgbm90IHJlYWNoZWQKICAgICAgbWF4aW11bSBsYXllciBkZXB0aCwgdGhlbiB0aGUgbWlkZGxlIGZyYW1lIGlzIHNldCBhcyBJTlROTF9BUkZfVVBEQVRFLAogICAgICBhbmQgdGhlIGxlZnQgYW5kIHJpZ2h0IGJyYW5jaGVzIGFyZSBwcm9jZXNzZWQgcmVjdXJzaXZlbHkuCiAgICAtIElmIHRoZSBjdXJyZW50IGJyYW5jaCBoYXMgbGVzcyB0aGFuIDMgZnJhbWVzLCBvciB3ZSBoYXZlIHJlYWNoZWQgbWF4aW11bQogICAgICBsYXllciBkZXB0aCwgdGhlbiBldmVyeSBmcmFtZSBpbiB0aGUgYnJhbmNoIGlzIHNldCB0byBMRl9VUERBVEUuCi0gSWYgQUxUUkVGIGZyYW1lIGlzIG5vdCBhbGxvd2VkIGZvciB0aGUgR0YgZ3JvdXA6IHRoZSBmaXJzdCBmcmFtZSBpcyBzZXQgdG8KICBLRl9VUERBVEUsIE9WRVJMQVlfVVBEQVRFIG9yIEdGX1VQREFURSwgYW5kIHRoZSByZXN0IG9mIHRoZW0gYXJlIHNldCBhcwogIExGX1VQREFURS4gVGhpcyBiYXNpY2FsbHkgZm9ybXMgYW4gSVBQUCBHRiBncm91cCBzdHJ1Y3R1cmUuCgpUaGUgZW5jb2RlciBtYXkgdXNlIFRlbXBvcmFsIGRlcGVuZGFuY3kgbW9kZWxsaW5nIChUUEwgLSBzZWUKXHJlZiBhcmNoaXRlY3R1cmVfZW5jX3RwbCkgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIHVzZSBhIG1heGltdW0gbGVuZ3RoCm9mIDMyIG9yIDE2IGZvciB0aGUgY3VycmVudCBHRiBncm91cC4gVGhpcyByZXF1aXJlcyBjYWxscyB0bwpccmVmIGRlZmluZV9nZl9ncm91cCgpIGJ1dCBzaG91bGQgbm90IGNoYW5nZSBvdGhlciBzZXR0aW5ncyAoc2luY2UgaXQgaXMgaW4KZXNzZW5jZSBhIHRyaWFsKS4gVGhpcyBzcGVjaWFsIGNhc2UgaXMgaW5kaWNhdGVkIGJ5IHRoZSBzZXR0aW5nIHBhcmFtZXRlcgo8Yj5pc19maW5hbF9wYXNzPC9iPiBmb3IgdG8gemVyby4KCkZvciBzaW5nbGUgcGFzcyBlbmNvZGVzIHdoZXJlIGxvb2stYWhlYWQgcHJvY2Vzc2luZyBpcyBkaXNhYmxlZAooXHJlZiBBVjFfQ09NUC5sYXBfZW5hYmxlZCA9IDApLCBccmVmIGRlZmluZV9nZl9ncm91cF9wYXNzMCgpIGlzIHVzZWQKaW5zdGVhZCBvZiBccmVmIGRlZmluZV9nZl9ncm91cCgpLgoKXHN1YnNlY3Rpb24gYXJjaGl0ZWN0dXJlX2VuY19rZl9ncm91cHMgS2V5IEZyYW1lIEdyb3VwcwoKQSBzcGVjaWFsIGNvbnN0cmFpbnQgZm9yIEdGIGdyb3VwIGxlbmd0aCBpcyB0aGUgbG9jYXRpb24gb2YgdGhlIG5leHQga2V5ZnJhbWUKKEtGKS4gVGhlIGZyYW1lcyBiZXR3ZWVuIHR3byBLRnMgYXJlIHJlZmVycmVkIHRvIGFzIGEgS0YgZ3JvdXAuIEVhY2ggS0YgZ3JvdXAKY2FuIGJlIGVuY29kZWQgYW5kIGRlY29kZWQgaW5kZXBlbmRlbnRseS4gQmVjYXVzZSBvZiB0aGlzLCBhIEdGIGdyb3VwIGNhbm5vdApzcGFuIGJleW9uZCBhIEtGIGFuZCB0aGUgbG9jYXRpb24gb2YgdGhlIG5leHQgS0YgaXMgc2V0IGFzIGEgaGFyZCBib3VuZGFyeQpmb3IgR0YgZ3JvdXAgbGVuZ3RoLgoKPHVsPgogICA8bGk+Rm9yIHR3by1wYXNzIGVuY29kaW5nIFxyZWYgUkFURV9DT05UUk9MLmZyYW1lc190b19rZXkgY29udHJvbHMgd2hlbiB0bwogICBlbmNvZGUgYSBrZXkgZnJhbWUuIFdoZW4gaXQgaXMgemVybywgdGhlIGN1cnJlbnQgZnJhbWUgaXMgYSBrZXlmcmFtZSBhbmQKICAgdGhlIGZ1bmN0aW9uIFxyZWYgZmluZF9uZXh0X2tleV9mcmFtZSgpIGlzIGNhbGxlZC4gVGhpcyBpbiB0dXJuIGNhbGxzCiAgIFxyZWYgZGVmaW5lX2tmX2ludGVydmFsKCkgdG8gd29yayBvdXQgd2hlcmUgdGhlIG5leHQga2V5IGZyYW1lIHNob3VsZAogICBiZSBwbGFjZWQuPC9saT4KCiAgIDxsaT5Gb3Igc2luZ2xlLXBhc3Mgd2l0aCBsb29rLWFoZWFkIGVuYWJsZWQsIFxyZWYgZGVmaW5lX2tmX2ludGVydmFsKCkKICAgaXMgY2FsbGVkIHdoZW5ldmVyIGEgR0YgZ3JvdXAgdXBkYXRlIGlzIG5lZWRlZCAod2hlbgogICBccmVmIFJBVEVfQ09OVFJPTC5mcmFtZXNfdGlsbF9nZl91cGRhdGVfZHVlIGlzIHplcm8pLiBUaGlzIGlzIGJlY2F1c2UKICAgZ2VuZXJhbGx5IEtGcyBhcmUgbW9yZSB3aWRlbHkgc3BhY2VkIGFuZCB0aGUgbG9vay1haGVhZCBidWZmZXIgaXMgdXN1YWxseQogICBub3QgbG9uZyBlbm91Z2guPC9saT4KCiAgIDxsaT5Gb3Igc2luZ2xlLXBhc3Mgd2l0aCBsb29rLWFoZWFkIGRpc2FibGVkLCB0aGUgS0ZzIGFyZSBwbGFjZWQgYWNjb3JkaW5nCiAgIHRvIHRoZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyIDxiPi0ta2YtbWF4LWRpc3Q8L2I+IChUaGUgYWJvdmUgdHdvIGNhc2VzIGFyZQogICBhbHNvIHN1YmplY3QgdG8gdGhpcyBjb25zdHJhaW50KS48L2xpPgo8L3VsPgoKVGhlIGZ1bmN0aW9uIFxyZWYgZGVmaW5lX2tmX2ludGVydmFsKCkgdHJpZXMgdG8gZGV0ZWN0IGEgc2NlbmVjdXQuCklmIGEgc2NlbmVjdXQgd2l0aGluIGtmLW1heC1kaXN0IGlzIGRldGVjdGVkLCB0aGVuIGl0IGlzIHNldCBhcyB0aGUgbmV4dAprZXlmcmFtZS4gT3RoZXJ3aXNlIHRoZSBnaXZlbiBtYXhpbXVtIHZhbHVlIGlzIHVzZWQuCgpcc2VjdGlvbiBhcmNoaXRlY3R1cmVfZW5jX3RwbCBUZW1wb3JhbCBEZXBlbmRlbmN5IE1vZGVsbGluZwoKVGhlIHRlbXBvcmFsIGRlcGVuZGVuY3kgbW9kZWwgcnVucyBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggR09QLiBJdCBidWlsZHMgdGhlCm1vdGlvbiB0cmFqZWN0b3J5IHdpdGhpbiB0aGUgR09QIGluIHVuaXRzIG9mIDE2eDE2IGJsb2Nrcy4gVGhlIHRlbXBvcmFsCmRlcGVuZGVuY3kgb2YgYSAxNngxNiBibG9jayBpcyBldmFsdWF0ZWQgYXMgdGhlIHByZWRpY3RpdmUgY29kaW5nIGdhaW5zIGl0CmNvbnRyaWJ1dGVzIHRvIGl0cyB0cmFpbGluZyBtb3Rpb24gdHJhamVjdG9yeS4gVGhpcyB0ZW1wb3JhbCBkZXBlbmRlbmN5IG1vZGVsCnJlZmxlY3RzIGhvdyBpbXBvcnRhbnQgYSBjb2RpbmcgYmxvY2sgaXMgZm9yIHRoZSBjb2RpbmcgZWZmaWNpZW5jeSBvZiB0aGUKb3ZlcmFsbCBHT1AuIEl0IGlzIGhlbmNlIHVzZWQgdG8gc2NhbGUgdGhlIExhZ3JhbmdpYW4gbXVsdGlwbGllciB1c2VkIGluIHRoZQpyYXRlLWRpc3RvcnRpb24gb3B0aW1pemF0aW9uIGZyYW1ld29yay4KClxzdWJzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfdHBsX2NvbmZpZyBDb25maWd1cmF0aW9ucwoKVGhlIHRlbXBvcmFsIGRlcGVuZGVuY3kgbW9kZWwgYW5kIGl0cyBhcHBsaWNhdGlvbnMgYXJlIGJ5IGRlZmF1bHQgdHVybmVkIG9uIGluCmxpYmFvbSBlbmNvZGVyIGZvciB0aGUgVm9EIHVzZSBjYXNlLiBUbyBkaXNhYmxlIGl0LCB1c2UgLS10cGwtbW9kZWw9MCBpbiB0aGUKYW9tZW5jIGNvbmZpZ3VyYXRpb24uCgpcc3Vic2VjdGlvbiBhcmNoaXRlY3R1cmVfZW5jX3RwbF9hbGdvcml0bXMgQWxnb3JpdGhtcwoKVGhlIHNjaGVtZSB3b3JrcyBpbiB0aGUgcmV2ZXJzZSBmcmFtZSBwcm9jZXNzaW5nIG9yZGVyIG92ZXIgdGhlIHNvdXJjZSBmcmFtZXMsCnByb3BhZ2F0aW5nIGluZm9ybWF0aW9uIGZyb20gZnV0dXJlIGZyYW1lcyBiYWNrIHRvIHRoZSBjdXJyZW50IGZyYW1lLiBGb3IgZWFjaApmcmFtZSwgYSBwcm9wYWdhdGlvbiBzdGVwIGlzIHJ1biBmb3IgZWFjaCBNQi4gaXQgb3BlcmF0ZXMgYXMgZm9sbG93czoKCjx1bD4KICAgPGxpPiBFc3RpbWF0ZSB0aGUgaW50cmEgcHJlZGljdGlvbiBjb3N0IGluIHRlcm1zIG9mIHN1bSBvZiBhYnNvbHV0ZSBIYWRhbWFyZAogICB0cmFuc2Zvcm0gZGlmZmVyZW5jZSAoU0FURCkgbm90ZWQgYXMgaW50cmFfY29zdC4gSXQgYWxzbyBsb2FkcyB0aGUgbW90aW9uCiAgIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBmcm9tIHRoZSBmaXJzdC1wYXNzIGVuY29kZSBhbmQgZXN0aW1hdGVzIHRoZSBpbnRlcgogICBwcmVkaWN0aW9uIGNvc3QgYXMgaW50ZXJfY29zdC4gRHVlIHRvIHRoZSB1c2Ugb2YgaHlicmlkIGludGVyL2ludHJhCiAgIHByZWRpY3Rpb24gbW9kZSwgdGhlIGludGVyX2Nvc3QgdmFsdWUgaXMgZnVydGhlciB1cHBlciBib3VuZGVkIGJ5CiAgIGludHJhX2Nvc3QuIEEgcHJvcGFnYXRpb24gY29zdCB2YXJpYWJsZSBpcyB1c2VkIHRvIGNvbGxlY3QgYWxsIHRoZQogICBpbmZvcm1hdGlvbiBmbG93ZWQgYmFjayBmcm9tIGZ1dHVyZSBwcm9jZXNzaW5nIGZyYW1lcy4gSXQgaXMgaW5pdGlhbGl6ZWQgYXMKICAgMCBmb3IgYWxsIHRoZSBibG9ja3MgaW4gdGhlIGxhc3QgcHJvY2Vzc2luZyBmcmFtZSBpbiBhIGdyb3VwIG9mIHBpY3R1cmVzCiAgIChHT1ApLjwvbGk+CgogICA8bGk+IFRoZSBmcmFjdGlvbiBvZiBpbmZvcm1hdGlvbiBmcm9tIGEgY3VycmVudCBibG9jayB0byBiZSBwcm9wYWdhdGVkIHRvd2FyZHMKICAgaXRzIHJlZmVyZW5jZSBibG9jayBpcyBlc3RpbWF0ZWQgYXM6ClxmWwogICBwcm9wYWdhdGlvblxfZnJhY3Rpb24gPSAoMSAtIGludGVyXF9jb3N0L2ludHJhXF9jb3N0KQpcZl0KICAgSXQgcmVmbGVjdHMgaG93IG11Y2ggdGhlIG1vdGlvbiBjb21wZW5zYXRlZCByZWZlcmVuY2Ugd291bGQgcmVkdWNlIHRoZQogICBwcmVkaWN0aW9uIGVycm9yIGluIHBlcmNlbnRhZ2UuPC9saT4KCiAgIDxsaT4gVGhlIHRvdGFsIGFtb3VudCBvZiBpbmZvcm1hdGlvbiB0aGUgY3VycmVudCBibG9jayBjb250cmlidXRlcyB0byB0aGUgR09QCiAgIGlzIGVzdGltYXRlZCBhcyBpbnRyYV9jb3N0ICsgcHJvcGFnYXRpb25fY29zdC4gVGhlIGluZm9ybWF0aW9uIHRoYXQgaXQKICAgcHJvcGFnYXRlcyB0b3dhcmRzIGl0cyByZWZlcmVuY2UgYmxvY2sgaXMgY2FwdHVyZWQgYnk6CgpcZlsKICAgcHJvcGFnYXRpb25cX2Ftb3VudCA9CiAgIChpbnRyYVxfY29zdCArIHByb3BhZ2F0aW9uXF9jb3N0KSAqIHByb3BhZ2F0aW9uXF9mcmFjdGlvbgpcZl08L2xpPgoKICAgPGxpPiBOb3RlIHRoYXQgdGhlIHJlZmVyZW5jZSBibG9jayBtYXkgbm90IG5lY2Vzc2FyaWx5IHNpdCBvbiB0aGUgZ3JpZCBvZgogICAxNngxNiBibG9ja3MuIFRoZSBwcm9wYWdhdGlvbiBhbW91bnQgaXMgaGVuY2UgZGlzcGVuc2VkIHRvIGFsbCB0aGUgYmxvY2tzCiAgIHRoYXQgb3ZlcmxhcCB3aXRoIHRoZSByZWZlcmVuY2UgYmxvY2suIFRoZSBjb3JyZXNwb25kaW5nIGJsb2NrIGluIHRoZQogICByZWZlcmVuY2UgZnJhbWUgYWNjdW11bGF0ZXMgaXRzIG93biBwcm9wYWdhdGlvbiBjb3N0IGFzIGl0IHJlY2VpdmVzIGJhY2sKICAgcHJvcGFnYXRpb24uCgpcZlsKICAgcHJvcGFnYXRpb25cX2Nvc3QgPSBwcm9wYWdhdGlvblxfY29zdCArCiAgICAgICAgICAgICAgICAgICAgICAgKFxmcmFje292ZXJsYXBcX2FyZWF9eygxNioxNil9ICogcHJvcGFnYXRpb25cX2Ftb3VudCkKXGZdPC9saT4KCiAgIDxsaT4gSW4gdGhlIGZpbmFsIGVuY29kaW5nIHN0YWdlLCB0aGUgZGlzdG9ydGlvbiBwcm9wYWdhdGlvbiBmYWN0b3Igb2YgYSBibG9jawogICBpcyBldmFsdWF0ZWQgYXMgXGYkKDEgKyBcZnJhY3twcm9wYWdhdGlvblxfY29zdH17aW50cmFcX2Nvc3R9KVxmJCwgd2hlcmUgdGhlIHNlY29uZCB0ZXJtCiAgIGNhcHR1cmVzIGl0cyBpbXBhY3Qgb24gbGF0ZXIgZnJhbWVzIGluIGEgR09QLjwvbGk+CgogICA8bGk+IFRoZSBMYWdyYW5naWFuIG11bHRpcGxpZXIgaXMgYWRhcHRlZCBhdCB0aGUgNjR4NjQgYmxvY2sgbGV2ZWwuIEZvciBldmVyeQogICA2NHg2NCBibG9jayBpbiBhIGZyYW1lLCB3ZSBoYXZlIGEgZGlzdG9ydGlvbiBwcm9wYWdhdGlvbiBmYWN0b3I6CgpcZlsKICBkaXN0XF9wcm9wW2ldID0gMSArIFxmcmFje3Byb3BhZ2F0aW9uXF9jb3N0W2ldfXtpbnRyYVxfY29zdFtpXX0KXGZdCgogICB3aGVyZSBpIGRlbm90ZXMgdGhlIGJsb2NrIGluZGV4IGluIHRoZSBmcmFtZS4gV2UgYWxzbyBoYXZlIHRoZSBmcmFtZSBsZXZlbAogICBkaXN0b3J0aW9uIHByb3BhZ2F0aW9uIGZhY3RvcjoKClxmWwogIGRpc3RcX3Byb3AgPSAxICsKICBcZnJhY3tcc3VtX3tpfXByb3BhZ2F0aW9uXF9jb3N0W2ldfXtcc3VtX3tpfWludHJhXF9jb3N0W2ldfQpcZl0KCiAgIHdoaWNoIGlzIHVzZWQgdG8gbm9ybWFsaXplIHRoZSBwcm9wYWdhdGlvbiBmYWN0b3IgYXQgdGhlIDY0eDY0IGJsb2NrIGxldmVsLiBUaGUKICAgTGFncmFuZ2lhbiBtdWx0aXBsaWVyIGlzIGhlbmNlIGFkYXB0ZWQgYXM6CgpcZlsKICAmbGFtYmRhO1tpXSA9ICZsYW1iZGE7WzBdICogXGZyYWN7ZGlzdFxfcHJvcH17ZGlzdFxfcHJvcFtpXX0KXGZdCgogICB3aGVyZSAmbGFtYmRhOzAgaXMgdGhlIG11bHRpcGxpZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSBmcmFtZSBsZXZlbCBRUC4gVGhlCiAgIDY0eDY0IGJsb2NrIGxldmVsIFFQIGlzIHNjYWxlZCBhY2NvcmRpbmcgdG8gdGhlIExhZ3JhbmdpYW4gbXVsdGlwbGllci4KPC91bD4KClxzdWJzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfdHBsX2tleWZ1biBLZXkgRnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXMKClRoZSByZWFkZXIgaXMgYWxzbyByZWZlcmVkIHRvIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFuZCBkYXRhIHN0cnVjdHVyZXM6CgotIFxyZWYgVHBsUGFyYW1zCi0gXHJlZiBhdjFfdHBsX3NldHVwX3N0YXRzKCkgYnVpbGRzIHRoZSBUUEwgbW9kZWwuCi0gXHJlZiBzZXR1cF9kZWx0YV9xKCkgQXNzaWduIGRpZmZlcmVudCBxdWFudGl6YXRpb24gcGFyYW1ldGVycyB0byBlYWNoIHN1cGVyCiAgYmxvY2sgYmFzZWQgb24gaXRzIFRQTCB3ZWlnaHQuCgpcc2VjdGlvbiBhcmNoaXRlY3R1cmVfZW5jX3BhcnRpdGlvbnMgQmxvY2sgUGFydGl0aW9uIFNlYXJjaAoKIEEgZnJhbWUgaXMgZmlyc3Qgc3BsaXQgaW50byB0aWxlcyBpbiBccmVmIGVuY29kZV90aWxlcygpLCB3aXRoIGVhY2ggdGlsZQogY29tcHJlc3NlZCBieSBhdjFfZW5jb2RlX3RpbGUoKS4gVGhlbiBhIHRpbGUgaXMgcHJvY2Vzc2VkIGluIHN1cGVyYmxvY2sgcm93cwogdmlhIFxyZWYgYXYxX2VuY29kZV9zYl9yb3coKSBhbmQgdGhlbiBccmVmIGVuY29kZV9zYl9yb3coKS4KCiBUaGUgcGFydGl0aW9uIHNlYXJjaCBwcm9jZXNzZXMgc3VwZXJibG9ja3Mgc2VxdWVudGlhbGx5IGluIFxyZWYKIGVuY29kZV9zYl9yb3coKS4gVHdvIHNlYXJjaCBtb2RlcyBhcmUgc3VwcG9ydGVkLCBkZXBlbmRpbmcgdXBvbiB0aGUgZW5jb2RpbmcKIGNvbmZpZ3VyYXRpb24sIFxyZWYgZW5jb2RlX25vbnJkX3NiKCkgaXMgZm9yIDEtcGFzcyBhbmQgcmVhbC10aW1lIG1vZGVzLAogd2hpbGUgXHJlZiBlbmNvZGVfcmRfc2IoKSBwZXJmb3JtcyBtb3JlIGV4aGF1c3RpdmUgcmF0ZSBkaXN0b3J0aW9uIGJhc2VkCiBzZWFyY2hlcy4KCiBQYXJ0aXRpb24gc2VhcmNoIG92ZXIgdGhlIHJlY3Vyc2l2ZSBxdWFkLXRyZWUgc3BhY2UgaXMgaW1wbGVtZW50ZWQgYnkKIHJlY3Vyc2l2ZSBjYWxscyB0byBccmVmIGF2MV9ub25yZF91c2VfcGFydGl0aW9uKCksCiBccmVmIGF2MV9yZF91c2VfcGFydGl0aW9uKCksIG9yIGF2MV9yZF9waWNrX3BhcnRpdGlvbigpIGFuZCByZXR1cm5pbmcgYmVzdAogb3B0aW9ucyBmb3Igc3ViLXRyZWVzIHRvIHRoZWlyIHBhcmVudCBwYXJ0aXRpb25zLgoKIEluIGxpYmFvbSwgdGhlIHBhcnRpdGlvbiBzZWFyY2ggbGF5cyBvbiB0b3Agb2YgdGhlIG1vZGUgc2VhcmNoIChwcmVkaWN0b3IsCiB0cmFuc2Zvcm0sIGV0Yy4pLCBpbnN0ZWFkIG9mIGJlaW5nIGEgc2VwYXJhdGUgbW9kdWxlLiBUaGUgaW50ZXJmYWNlIG9mIG1vZGUKIHNlYXJjaCBpcyBccmVmIHBpY2tfc2JfbW9kZXMoKSwgd2hpY2ggY29ubmVjdHMgdGhlIHBhcnRpdGlvbl9zZWFyY2ggd2l0aAogXHJlZiBhcmNoaXRlY3R1cmVfZW5jX2ludGVyX21vZGVzIGFuZCBccmVmIGFyY2hpdGVjdHVyZV9lbmNfaW50cmFfbW9kZXMuIFRvCiBtYWtlIGdvb2QgZGVjaXNpb25zLCByZWNvbnN0cnVjdGlvbiBpcyBhbHNvIHJlcXVpcmVkIGluIG9yZGVyIHRvIGJ1aWxkCiByZWZlcmVuY2VzIGFuZCBjb250ZXh0cy4gVGhpcyBpcyBpbXBsZW1lbnRlZCBieSBccmVmIGVuY29kZV9zYigpIGF0IHRoZQogc3ViLXRyZWUgbGV2ZWwgYW5kIFxyZWYgZW5jb2RlX2IoKSBhdCBjb2RpbmcgYmxvY2sgbGV2ZWwuCgogU2VlIGFsc28gXHJlZiBwYXJ0aXRpb25fc2VhcmNoCgpcc2VjdGlvbiBhcmNoaXRlY3R1cmVfZW5jX2ludHJhX21vZGVzIEludHJhIE1vZGUgU2VhcmNoCgpBVjEgYWxzbyBwcm92aWRlcyA3MSBkaWZmZXJlbnQgaW50cmEgcHJlZGljdGlvbiBtb2RlcywgaS5lLiBtb2RlcyB0aGF0IHByZWRpY3QKb25seSBiYXNlZCB1cG9uIGluZm9ybWF0aW9uIGluIHRoZSBjdXJyZW50IGZyYW1lIHdpdGggbm8gZGVwZW5kZW5jeSBvbgpwcmV2aW91cyBvciBmdXR1cmUgZnJhbWVzLiBGb3Iga2V5IGZyYW1lcywgd2hlcmUgdGhpcyBpbmRlcGVuZGVuY2UgZnJvbSBhbnkKb3RoZXIgZnJhbWUgaXMgYSBkZWZpbmluZyByZXF1aXJlbWVudCBhbmQgZm9yIG90aGVyIGNhc2VzIHdoZXJlIGludHJhIG9ubHkKZnJhbWVzIGFyZSByZXF1aXJlZCwgdGhlIGVuY29kZXIgbmVlZCBvbmx5IGNvbnNpZGVycyB0aGVzZSBtb2RlcyBpbiB0aGUgcmF0ZQpkaXN0b3J0aW9uIGxvb3AuCgpFdmVuIHNvLCBpbiBtb3N0IHVzZSBjYXNlcywgc2VhcmNoaW5nIGFsbCBwb3NzaWJsZSBpbnRyYSBwcmVkaWN0aW9uIG1vZGVzIGZvcgpldmVyeSBibG9jayBhbmQgcGFydGl0aW9uIHNpemUgaXMgbm90IHByYWN0aWNhbCBhbmQgc29tZSBwcnVuaW5nIG9mIHRoZSBzZWFyY2gKdHJlZSBpcyBuZWNlc3NhcnkuCgpGb3IgdGhlIFJhdGUgZGlzdG9ydGlvbiBvcHRpbWl6ZWQgY2FzZSwgdGhlIG1haW4gdG9wIGxldmVsIGZ1bmN0aW9uCnJlc3BvbnNpYmxlIGZvciBzZWxlY3RpbmcgdGhlIGludHJhIHByZWRpY3Rpb24gbW9kZSBmb3IgYSBnaXZlbiBibG9jayBpcwpccmVmIGF2MV9yZF9waWNrX2ludHJhX21vZGVfc2IoKS4gVGhlIHJlYWRlcnMgYXR0ZW50aW9uIGlzIGFsc28gZHJhd24gdG8gdGhlCmZ1bmN0aW9ucyBccmVmIGh5YnJpZF9pbnRyYV9tb2RlX3NlYXJjaCgpIGFuZCBccmVmIGF2MV9ub25yZF9waWNrX2ludHJhX21vZGUoKQp3aGljaCBtYXkgYmUgdXNlZCB3aGVyZSBlbmNvZGUgc3BlZWQgaXMgY3JpdGljYWwuIFRoZSBjaG9pY2UgYmV0d2VlbiB0aGUKcmQgcGF0aCBhbmQgdGhlIG5vbiByZCBvciBoeWJyaWQgcGF0aHMgZGVwZW5kcyBvbiB0aGUgZW5jb2RlciB1c2UgY2FzZSBhbmQgdGhlClxyZWYgQVYxX0NPTVAuc3BlZWQgcGFyYW1ldGVyLiBGdXJ0aGVyIGZpbmUgY29udHJvbCBvZiB0aGUgc3BlZWQgdnMgcXVhbGl0eQp0cmFkZSBvZmYgaXMgcHJvdmlkZWQgYnkgbWVhbnMgb2YgZmllbGRzIGluIFxyZWYgQVYxX0NPTVAuc2YgKHdoaWNoIGhhcyB0eXBlClxyZWYgU1BFRURfRkVBVFVSRVMpLgoKTm90ZSB0aGF0IHNvbWUgaW50cmEgbW9kZXMgYXJlIG9ubHkgY29uc2lkZXJlZCBmb3Igc3BlY2lmaWMgdXNlIGNhc2VzIG9yCnR5cGVzIG9mIHZpZGVvLiBGb3IgZXhhbXBsZSB0aGUgcGFsZXR0ZSBiYXNlZCBwcmVkaWN0aW9uIG1vZGVzIGFyZSBvZnRlbgp2YWx1ZWFibGUgZm9yIGdyYXBoaWNzIG9yIHNjcmVlbiBzaGFyZSBjb250ZW50IGJ1dCBub3QgZm9yIG5hdHVyYWwgdmlkZW8uCihTZWUgXHJlZiBhdjFfc2VhcmNoX3BhbGV0dGVfbW9kZSgpKQoKU2VlIGFsc28gXHJlZiBpbnRyYV9tb2RlX3NlYXJjaCBmb3IgbW9yZSBkZXRhaWxzLgoKXHNlY3Rpb24gYXJjaGl0ZWN0dXJlX2VuY19pbnRlcl9tb2RlcyBJbnRlciBQcmVkaWN0aW9uIE1vZGUgU2VhcmNoCgpGb3IgaW50ZXIgZnJhbWVzLCB3aGVyZSB3ZSBhbHNvIGFsbG93IHByZWRpY3Rpb24gdXNpbmcgb25lIG9yIG1vcmUgcHJldmlvdXNseQpjb2RlZCBmcmFtZXMgKHdoaWNoIG1heSBjaHJvbm9sb2dpY2FsbHkgc3BlYWtpbmcgYmUgcGFzdCBvciBmdXR1cmUgZnJhbWVzIG9yCm5vbi1kaXNwbGF5IHJlZmVyZW5jZSBidWZmZXJzIHN1Y2ggYXMgQVJGIGZyYW1lcyksIHRoZSBzaXplIG9mIHRoZSBzZWFyY2ggdHJlZQp0aGF0IG5lZWRzIHRvIGJlIHRyYXZlcnNlZCwgdG8gc2VsZWN0IGEgcHJlZGljdGlvbiBtb2RlLCBpcyBjb25zaWRlcmFibHkgbW9yZQptYXNzaXZlLgoKSW4gYWRkaXRpb24gdG8gdGhlIDcxIHBvc3NpYmxlIGludHJhIG1vZGVzIHdlIGFsc28gbmVlZCB0byBjb25zaWRlciA1NiBzaW5nbGUKZnJhbWUgaW50ZXIgcHJlZGljdGlvbiBtb2RlcyAoNyByZWZlcmVuY2UgZnJhbWVzIHggNCBtb2RlcyB4IDIgZm9yIE9CTUMKKG92ZXJsYXBwZWQgYmxvY2sgbW90aW9uIGNvbXBlbnNhdGlvbikpLCAxMjc2OCBjb21wb3VuZCBpbnRlciBwcmVkaWN0aW9uIG1vZGVzCih0aGVzZSBhcmUgbW9kZXMgdGhhdCBjb21iaW5lIGludGVyIHByZWRpY3RvcnMgZnJvbSB0d28gcmVmZXJlbmNlIGZyYW1lcykgYW5kCjM2NzA4IGNvbXBvdW5kIGludGVyIC8gaW50cmEgcHJlZGljdGlvbiBtb2Rlcy4KCkFzIHdpdGggdGhlIGludHJhIG1vZGUgc2VhcmNoLCBsaWJhb20gc3VwcG9ydHMgYW4gUkQgYmFzZWQgcGF0aHdheSBhbmQgYSBub24KcmQgcGF0aHdheSBmb3Igc3BlZWQgY3JpdGljYWwgdXNlIGNhc2VzLiAgVGhlIGVudHJ5IHBvaW50cyBmb3IgdGhlc2UgdHdvIGNhc2VzCmFyZSBccmVmIGF2MV9yZF9waWNrX2ludGVyX21vZGVfc2IoKSBhbmQgXHJlZiBhdjFfbm9ucmRfcGlja19pbnRlcl9tb2RlX3NiKCkKcmVzcGVjdGl2ZWx5LgoKVmFyaW91cyBoZXVyaXN0aWNzIGFuZCBwcmVkaWN0aXZlIHN0cmF0ZWdpZXMgYXJlIHVzZWQgdG8gcHJ1bmUgdGhlIHNlYXJjaCB0cmVlCndpdGggZmluZSBjb250cm9sIHByb3ZpZGVkIHRocm91Z2ggdGhlIHNwZWVkIGZlYXR1cmVzIHBhcmFtZXRlciBpbiB0aGUgbWFpbgpjb21wcmVzc29yIGluc3RhbmNlIGRhdGEgc3RydWN0dXJlIFxyZWYgQVYxX0NPTVAuc2YuCgpJdCBpcyB3b3J0aCBub3RpbmcsIHRoYXQgc29tZSBwcmVkaWN0aW9uIG1vZGVzIGluY3VyciBhIG11Y2ggbGFyZ2VyIHJhdGUgY29zdAp0aGFuIG90aGVycyAoaWdub3JpbmcgZm9yIG5vdyB0aGUgY29zdCBvZiBjb2RpbmcgdGhlIGVycm9yIHJlc2lkdWFsKS4gRm9yCmV4YW1wbGUsIGEgY29tcG91bmQgbW9kZSB0aGF0IHJlcXVpcmVzIHRoZSBlbmNvZGVyIHRvIHNwZWNpZnkgdHdvIHJlZmVyZW5jZQpmcmFtZXMgYW5kIHR3byBuZXcgbW90aW9uIHZlY3RvcnMgd2lsbCBhbG1vc3QgaW5ldml0YWJsZSBoYXZlIGEgaGlnaGVyIHJhdGUKY29zdCB0aGFuIGEgc2ltcGxlIGludGVyIHByZWRpY3Rpb24gbW9kZSB0aGF0IHVzZXMgYSBwcmVkaWN0ZWQgb3IgMCwwIG1vdGlvbgp2ZWN0b3IuIEFzIHN1Y2gsIGlmIHdlIGhhdmUgYWxyZWFkeSBmb3VuZCBhIG1vZGUgZm9yIHRoZSBjdXJyZW50IGJsb2NrIHRoYXQKaGFzIGEgbG93IFJEIGNvc3QsIHdlIGNhbiBza2lwIGEgbGFyZ2UgbnVtYmVyIG9mIHRoZSBwb3NzaWJsZSBtb2RlcyBvbiB0aGUKYmFzaXMgdGhhdCBldmVuIGlmIHRoZSBlcnJvciByZXNpZHVhbCBpcyAwIHRoZSBpbmhlcmVudCByYXRlIGNvc3Qgb2YgdGhlCm1vZGUgaXRzZWxmIHdpbGwgZ2FyYXVudGVlIHRoYXQgaXQgaXMgbm90IGNob3Nlbi4KClNlZSBhbHNvIFxyZWYgaW50ZXJfbW9kZV9zZWFyY2ggZm9yIG1vcmUgZGV0YWlscy4KClxzZWN0aW9uIGFyY2hpdGVjdHVyZV9lbmNfdHhfc2VhcmNoIFRyYW5zZm9ybSBTZWFyY2gKCkFWMSBpbXBsZW1lbnRzIHRoZSB0cmFuc2Zvcm0gc3RhZ2UgdXNpbmcgNCBzZXBlcmFibGUgMS1kIHRyYW5zZm9ybXMgd2hpY2gKY2FuIGJlIGNvbWJpbmVkIHRvIGdpdmUgMTYgMi1kIGNvbWJpbmF0aW9ucy4gVGhlc2UgYXJlIERDVCwgQURTVCwgRkxJUEFEU1QKYW5kIElEVFgsIHdoZXJlIEZMSVBBRFNUIGlzIHRoZSByZXZlcnNlZCB2ZXJzaW9uIG9mIEFEU1QgYW5kIElEVFggaXMgdGhlCmlkZW50aXR5IHRyYW5zZm9ybS4KClRoZXNlIGNvbWJpbmF0aW9ucyBjYW4gYmUgYXBwbGllZCBhdCAxOSBkaWZmZXJlbnQgc2NhbGVzIGZyb20gNjR4NjQgcGl4ZWxzCmRvd24gdG8gNHg0IHBpeGVscy4KClRoaXMgZ2l2ZXMgcmlzZSB0byBhIGxhcmdlIG51bWJlciBvZiBwb3NzaWJsZSBjYW5kaWRhdGUgdHJhbnNmb3JtIG9wdGlvbnMKZm9yIGNvZGluZyB0aGUgcmVzaWR1YWwgZXJyb3IgYWZ0ZXIgcHJlZGljdGlvbi4gQW4gZXhoYXVzdGl2ZSByYXRlLWRpc3RvcnRpb24KYmFzZWQgZXZhbHVhdGlvbiBvZiBhbGwgY2FuZGlkYXRlcyB3b3VsZCBub3QgYmUgcHJhY3RpY2FsIGZyb20gYSBzcGVlZApwZXJzcGVjdGl2ZSBpbiBhIHByb2R1Y3Rpb24gZW5jb2RlciBpbXBsZW1lbnRhdGlvbi4gSGVuY2UgbGliYW9tIGFkZG9wdHMgYQpudW1iZXIgb2Ygc3RyYXRlZ2llcyB0byBwcnVuZSB0aGUgc2VsZWN0aW9uIG9mIGJvdGggdGhlIHRyYW5zZm9ybSBzaXplIGFuZAp0cmFuc2Zvcm0gdHlwZS4KClRoZXJlIGFyZSBhIG51bWJlciBvZiBzdHJhdGVnaWVzIHRoYXQgaGF2ZSBiZWVuIHRlc3RlZCBhbmQgaW1wbGVtZW1udGVkIGluCmxpYmFvbSBpbmNsdWRpbmc6CgotIEEgc3RhdGlzdGljcyBiYXNlZCBhcHByb2FjaCB0aGF0IGxvb2tzIGF0IHRoZSBmcmVxdWVuY3kgd2l0aCB3aGljaCBjZXJ0YWluCiAgY29tYmluYXRpb25zIGFyZSB1c2VkIGluIGEgZ2l2ZW4gY29udGV4dCBhbmQgcHJ1bmVzIG91dCB2ZXJ5IHVubGlrZWx5CiAgY2FuZGlkYXRlcy4gSXQgaXMgd29ydGggbm90aW5nIGhlcmUgdGhhdCBzb21lIHNpemUgY2FuZGlkYXRlcyBjYW4gYmUgcHJ1bmVkCiAgb3V0IGltbWVkaWF0ZWx5IGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBwcmVkaWN0aW9uIHBhcnRpdGlvbi4gRm9yIGV4YW1wbGUgaXQKICBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIHVzZSBhIHRyYW5zZm9ybSBzaXplIHRoYXQgaXMgbGFyZ2VyIHRoYW4gdGhlCiAgcHJlZGljdGlvbiBwYXJ0aXRpb24gc2l6ZSBidXQgYWxzbyBhIHZlcnkgbGFyZ2UgcHJlZGljdGlvbiBwYXJ0aXRpb24gc2l6ZSBpcwogIHVubGlrZWx5IHRvIGJlIG9wdGltYWxseSBwYXJlZCB3aXRoIHNtYWxsIHRyYW5zZm9ybXMuCgotIEEgTWFjaGluZSBsZWFybmluZyBiYXNlZCBtb2RlbAoKLSBBIG1ldGhvZCB0aGF0IGluaXRpYWxseSB0ZXN0cyBjYW5kaWRhdGVzIHVzaW5nIGEgZmFzdCBhbGdvcml0aG0gdGhhdCBza2lwcwogIGVudHJvcHkgZW5jb2RpbmcgYW5kIHVzZXMgYW4gZXN0aW1hdGVkIGNvc3QgbW9kZWwgdG8gY2hvb3NlIGEgcmVkdWNlZCBzdWJzZXQKICBmb3IgZnVsbCBSRCBhbmFseXNpcy4gVGhpcyBzdWJqZWN0IGlzIGNvdmVyZWQgbW9yZSBmdWxseSBpbiBhIHBhcGVyIGF1dGhvcmVkCiAgYnkgQm9oYW4gTGksIEppbmduaW5nIEhhbiwgYW5kIFlhb3d1IFh1IHRpdGxlZDogPGI+RmFzdCBUcmFuc2Zvcm0gVHlwZQogIFNlbGVjdGlvbiBVc2luZyBDb25kaXRpb25hbCBMYXBsYWNlIERpc3RyaWJ1dGlvbiBCYXNlZCBSYXRlIEVzdGltYXRpb248L2I+Cgo8Yj5UT0RPIEFkZCBsaW5rIHRvIHBhcGVyIHdoZW4gYXZhaWxhYmxlPC9iPgoKU2VlIGFsc28gXHJlZiB0cmFuc2Zvcm1fc2VhcmNoIGZvciBtb3JlIGRldGFpbHMuCgpcc2VjdGlvbiBhcmNoaXRlY3R1cmVfcG9zdF9lbmNfZmlsdCBQb3N0IEVuY29kZSBMb29wIEZpbHRlcmluZwoKQVYxIHN1cHBvcnRzIHRocmVlIHR5cGVzIG9mIHBvc3QgZW5jb2RlIDxiPmluIGxvb3A8L2I+IGZpbHRlcmluZyB0byBpbXByb3ZlCnRoZSBxdWFsaXR5IG9mIHRoZSByZWNvbnN0cnVjdGVkIHZpZGVvLgoKLSA8Yj5EZWJsb2NraW5nIEZpbHRlcjwvYj4gVGhlIGZpcnN0IG9mIHRoZXNlIGlzIGEgZmFyaWx5IHRyYWRpdGlvbmFsIGJvdW5kYXJ5CiAgZGVibG9ja2luZyBmaWx0ZXIgdGhhdCBhdHRlbXB0cyB0byBzbW9vdGggZGlzY29udGludWl0aWVzIHRoYXQgbWF5IG9jY3VyIGF0CiAgdGhlIGJvdW5kYXJpZXMgYmV0d2VlbiBibG9ja3MuIFNlZSBhbHNvIFxyZWYgaW5fbG9vcF9maWx0ZXIuCgotIDxiPkNERUYgRmlsdGVyPC9iPiBUaGUgY29uc3RyYWluZWQgZGlyZWN0aW9uYWwgZW5oYW5jZW1lbnQgZmlsdGVyIChDREVGKQogIGFsbG93cyB0aGUgY29kZWMgdG8gYXBwbHkgYSBub24tbGluZWFyIGRlcmluZ2luZyBmaWx0ZXIgYWxvbmcgY2VydGFpbgogIChwb3RlbnRpYWxseSBvYmxpcXVlKSBkaXJlY3Rpb25zLiBBIHByaW1hcnkgZmlsdGVyIGlzIGFwcGxpZWQgYWxvbmcgdGhlCiAgc2VsZWN0ZWQgZGlyZWN0aW9uLCB3aGlsc3QgYSBzZWNvbmRhcnkgZmlsdGVyIGlzIGFwcGxpZWQgYXQgNDWwIHRvIHRoZQogIHByaW1hcnkgZGlyZWN0aW9uLiAoU2VlIGFsc28gXHJlZiBpbl9sb29wX2NkZWYgYW5kIChUT0RPIFJFRikKICA8Yj5BIFRlY2huaWNhbCBPdmVydmlldyBvZiB0aGUgQVYxIFN0YW5kYXJkPC9iPiAoVE9ETyBhZGQgbGluayB0bwogIEppbmduaW5nJ3MgQVYxIG92ZXJ2aWV3IHBhcGVyKS4KCi0gPGI+TG9vcCBSZXN0b3JhdGlvbiBGaWx0ZXI8L2I+IFRoZSBsb29wIHJlc3RvcmF0aW9uIGZpbHRlciBpcyBhcHBsaWVkIGFmdGVyCiAgYW55IHByaW9yIHBvc3QgZmlsdGVyaW5nIHN0YWdlcy4gSXQgYWN0cyBvbiB1bml0cyBvZiBlaXRoZXIgNjQg1yA2NCwKICAxMjgg1yAxMjgsIG9yIDI1NiDXIDI1NiBwaXhlbCBibG9ja3MsIHJlZmVyZWQgdG8gYXMgbG9vcCByZXN0b3JhdGlvbiB1bml0cy4KICBFYWNoIHVuaXQgY2FuIGluZGVwZW5kZW50bHkgc2VsZWN0IGVpdGhlciB0byBieXBhc3MgZmlsdGVyaW5nLCB1c2UgYSBXaWVuZXIKICBmaWx0ZXIsIG9yIHVzZSBhIHNlbGYtZ3VpZGVkIGZpbHRlci4gKFNlZSBhbHNvIFxyZWYgaW5fbG9vcF9yZXN0b3JhdGlvbiBhbmQKICAoVE9ETyBSRUYpIDxiPkEgVGVjaG5pY2FsIE92ZXJ2aWV3IG9mIHRoZSBBVjEgU3RhbmRhcmQ8L2I+IChUT0RPIGFkZCBsaW5rCiAgdG8gSmluZ25pbmcncyBBVjEgb3ZlcnZpZXcgcGFwZXIpLgoKXHNlY3Rpb24gYXJjaGl0ZWN0dXJlX2VudHJvcHkgRW50cm9weSBDb2RpbmcKCiBBZGQgZGV0YWlscyBoZXJlLgoKKi8KCi8qIVxkZWZncm91cCBlbmNvZGVyX2FsZ28gRW5jb2RlciBBbGdvcml0aG0KICoKICogVGhlIGVuY29kZXIgYWxnb3JpdGhtIGRlc2NyaWJlcyBob3cgYSBzZXF1ZW5jZSBpcyBlbmNvZGVkLCBpbmNsdWRpbmcgaGlnaAogKiBsZXZlbCBkZWNpc2lvbiBhcyB3ZWxsIGFzIGFsZ29yaXRobSB1c2VkIGF0IGV2ZXJ5IGVuY29kaW5nIHN0YWdlLgogKi8KCi8qIVxkZWZncm91cCBoaWdoX2xldmVsX2FsZ28gSGlnaC1sZXZlbCBBbGdvcml0aG0KICogXGluZ3JvdXAgZW5jb2Rlcl9hbGdvCiAqIFRoaXMgbW9kdWxlIGRlc2NyaWJlcyBzZXF1ZW5jZSBsZXZlbC9mcmFtZSBsZXZlbCBhbGdvcml0aG0gaW4gQVYxLgogKiBNb3JlIGRldGFpbHMgd2lsbCBiZSBhZGRlZC4KICogQHsKICovCgovKiFcZGVmZ3JvdXAgc3BlZWRfZmVhdHVyZXMgU3BlZWQgdnMgUXVhbGl0eSBUcmFkZSBPZmYKICogXGluZ3JvdXAgaGlnaF9sZXZlbF9hbGdvCiAqIFRoaXMgbW9kdWxlIGRlc2NyaWJlcyB0aGUgZW5jb2RlIHNwZWVkIHZzIHF1YWxpdHkgdHJhZGVvZmYKICogQHsKICovCi8qISBAfSAtIGVuZCBkZWZncm91cCBzcGVlZF9mZWF0dXJlcyAqLwoKLyohXGRlZmdyb3VwIHNyY19mcmFtZV9wcm9jIFNvdXJjZSBGcmFtZSBQcm9jZXNzaW5nCiAqIFxpbmdyb3VwIGhpZ2hfbGV2ZWxfYWxnbwogKiBUaGlzIG1vZHVsZSBkZXNjcmliZXMgYWxnb3JpdGhtcyBpbiBBVjEgYXNzb3NjaWF0ZWQgd2l0aCB0aGUKICogcHJlLXByb2Nlc3Npbmcgb2Ygc291cmNlIGZyYW1lcy4gU2VlIGFsc28gXHJlZiBhcmNoaXRlY3R1cmVfZW5jX3NyY19wcm9jCiAqCiAqIEB7CiAqLwovKiEgQH0gLSBlbmQgZGVmZ3JvdXAgc3JjX2ZyYW1lX3Byb2MgKi8KCi8qIVxkZWZncm91cCByYXRlX2NvbnRyb2wgUmF0ZSBDb250cm9sCiAqIFxpbmdyb3VwIGhpZ2hfbGV2ZWxfYWxnbwogKiBUaGlzIG1vZHVsZSBkZXNjcmliZXMgcmF0ZSBjb250cm9sIGFsZ29yaXRobSBpbiBBVjEuCiAqICBTZWUgYWxzbyBccmVmIGFyY2hpdGVjdHVyZV9lbmNfcmF0ZV9jdHJsCiAqIEB7CiAqLwovKiEgQH0gLSBlbmQgZGVmZ3JvdXAgcmF0ZV9jb250cm9sICovCgovKiFcZGVmZ3JvdXAgdHBsX21vZGVsbGluZyBUZW1wb3JhbCBEZXBlbmRlbmN5IE1vZGVsbGluZwogKiBcaW5ncm91cCBoaWdoX2xldmVsX2FsZ28KICogVGhpcyBtb2R1bGUgaW5jbHVkZXMgYWxnb3JpdGhtcyB0byBpbXBsZW1lbnQgdGVtcG9yYWwgZGVwZW5kZW5jeSBtb2RlbGxpbmcuCiAqICBTZWUgYWxzbyBccmVmIGFyY2hpdGVjdHVyZV9lbmNfdHBsCiAqIEB7CiAqLwovKiEgQH0gLSBlbmQgZGVmZ3JvdXAgdHBsX21vZGVsbGluZyAqLwoKLyohXGRlZmdyb3VwIHR3b19wYXNzX2FsZ28gVHdvIFBhc3MgTW9kZQogICBcaW5ncm91cCBoaWdoX2xldmVsX2FsZ28KCiBJbiB0d28gcGFzcyBtb2RlLCB0aGUgaW5wdXQgZmlsZSBpcyBwYXNzZWQgaW50byB0aGUgZW5jb2RlciBmb3IgYSBxdWljawogZmlyc3QgcGFzcywgd2hlcmUgc3RhdGlzdGljcyBhcmUgZ2F0aGVyZWQuIFRoZXNlIHN0YXRpc3RpY3MgYW5kIHRoZSBpbnB1dAogZmlsZSBhcmUgdGhlbiBwYXNzZWQgYmFjayBpbnRvIHRoZSBlbmNvZGVyIGZvciBhIHNlY29uZCBwYXNzLiBUaGUgc3RhdGlzdGljcwogaGVscCB0aGUgZW5jb2RlciByZWFjaCB0aGUgZGVzaXJlZCBiaXRyYXRlIHdpdGhvdXQgYXMgbXVjaCBvdmVyc2hvb3Rpbmcgb3IKIHVuZGVyc2hvb3RpbmcuCgogRHVyaW5nIHRoZSBmaXJzdCBwYXNzLCB0aGUgY29kZWMgd2lsbCByZXR1cm4gInN0YXRzIiBwYWNrZXRzIHRoYXQgY29udGFpbgogaW5mb3JtYXRpb24gdXNlZnVsIGZvciB0aGUgc2Vjb25kIHBhc3MuIFRoZSBjYWxsZXIgc2hvdWxkIGNvbmNhdGVuYXRlIHRoZXNlCiBwYWNrZXRzIGFzIHRoZXkgYXJlIHJlY2VpdmVkLiBJbiB0aGUgc2Vjb25kIHBhc3MsIHRoZSBjb25jYXRlbmF0ZWQgcGFja2V0cwogYXJlIHBhc3NlZCBpbiwgYWxvbmcgd2l0aCB0aGUgZnJhbWVzIHRvIGVuY29kZS4gRHVyaW5nIHRoZSBzZWNvbmQgcGFzcywKICJmcmFtZSIgcGFja2V0cyBhcmUgcmV0dXJuZWQgdGhhdCByZXByZXNlbnQgdGhlIGNvbXByZXNzZWQgdmlkZW8uCgogQSBjb21wbGV0ZSBleGFtcGxlIGNhbiBiZSBmb3VuZCBpbiBgZXhhbXBsZXMvdHdvcGFzc19lbmNvZGVyLmNgLiBQc2V1ZG9jb2RlCiBpcyBwcm92aWRlZCBiZWxvdyB0byBpbGx1c3RyYXRlIHRoZSBjb3JlIHBhcnRzLgoKIER1cmluZyB0aGUgZmlyc3QgcGFzcywgdGhlIHVuY29tcHJlc3NlZCBmcmFtZXMgYXJlIHBhc3NlZCBpbiBhbmQgc3RhdHMKIGluZm9ybWF0aW9uIGlzIGFwcGVuZGVkIHRvIGEgYnl0ZSBhcnJheS4KCn5+fn5+fn5+fn5+fn5+fnsuY30KLy8gRm9yIHNpbXBsaWNpdHksIGFzc3VtZSB0aGF0IHRoZXJlIGlzIGVub3VnaCBtZW1vcnkgaW4gdGhlIHN0YXRzIGJ1ZmZlci4KLy8gQWN0dWFsIGNvZGUgd2lsbCB3YW50IHRvIHVzZSBhIHJlc2l6YWJsZSBhcnJheS4gc3RhdHNfbGVuIHJlcHJlc2VudHMKLy8gdGhlIGxlbmd0aCBvZiBkYXRhIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgYnVmZmVyLgp2b2lkIGdldF9zdGF0c19kYXRhKGFvbV9jb2RlY19jdHhfdCAqZW5jb2RlciwgY2hhciAqc3RhdHMsCiAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpzdGF0c19sZW4sIGJvb2wgKmdvdF9kYXRhKSB7CiAgY29uc3QgYW9tX2NvZGVjX2N4X3BrdF90ICpwa3Q7CiAgYW9tX2NvZGVjX2l0ZXJfdCBpdGVyID0gTlVMTDsKICB3aGlsZSAoKHBrdCA9IGFvbV9jb2RlY19nZXRfY3hfZGF0YShlbmNvZGVyLCAmaXRlcikpKSB7CiAgICAqZ290X2RhdGEgPSB0cnVlOwogICAgaWYgKHBrdC0+a2luZCAhPSBBT01fQ09ERUNfU1RBVFNfUEtUKSBjb250aW51ZTsKICAgIG1lbWNweShzdGF0cyArICpzdGF0c19sZW4sIHBrdC0+ZGF0YS50d29wYXNzX3N0YXRzLmJ1ZiwKICAgICAgICAgICBwa3QtPmRhdGEudHdvcGFzc19zdGF0cy5zeik7CiAgICAqc3RhdHNfbGVuICs9IHBrdC0+ZGF0YS50d29wYXNzX3N0YXRzLnN6OwogIH0KfQoKdm9pZCBmaXJzdF9wYXNzKGNoYXIgKnN0YXRzLCBzaXplX3QgKnN0YXRzX2xlbikgewogIHN0cnVjdCBhb21fY29kZWNfZW5jX2NmZyBmaXJzdF9wYXNzX2NmZzsKICAuLi4gLy8gSW5pdGlhbGl6ZSB0aGUgY29uZmlnIGFzIG5lZWRlZC4KICBmaXJzdF9wYXNzX2NmZy5nX3Bhc3MgPSBBT01fUkNfRklSU1RfUEFTUzsKICBhb21fY29kZWNfY3R4X3QgZmlyc3RfcGFzc19lbmNvZGVyOwogIC4uLiAvLyBJbml0aWFsaXplIHRoZSBlbmNvZGVyLgoKICB3aGlsZSAoZnJhbWVfYXZhaWxhYmxlKSB7CiAgICAvLyBSZWFkIGluIHRoZSB1bmNvbXByZXNzZWQgZnJhbWUsIHVwZGF0ZSBmcmFtZV9hdmFpbGFibGUKICAgIGFvbV9pbWFnZV90ICpmcmFtZV90b19lbmNvZGUgPSAuLi47CiAgICBhb21fY29kZWNfZW5jb2RlKCZmaXJzdF9wYXNzX2VuY29kZXIsIGltZywgcHRzLCBkdXJhdGlvbiwgZmxhZ3MpOwogICAgZ2V0X3N0YXRzX2RhdGEoJmZpcnN0X3Bhc3NfZW5jb2Rlciwgc3RhdHMsIHN0YXRzX2xlbik7CiAgfQogIC8vIEFmdGVyIGFsbCBmcmFtZXMgaGF2ZSBiZWVuIHByb2Nlc3NlZCwgY2FsbCBhb21fY29kZWNfZW5jb2RlIHdpdGgKICAvLyBhIE5VTEwgcHRyIHJlcGVhdGVkbHksIHVudGlsIG5vIG1vcmUgZGF0YSBpcyByZXR1cm5lZC4gVGhlIE5VTEwKICAvLyBwdHIgdGVsbHMgdGhlIGVuY29kZXIgdGhhdCBubyBtb3JlIGZyYW1lcyBhcmUgYXZhaWxhYmxlLgogIGJvb2wgZ290X2RhdGE7CiAgZG8gewogICAgZ290X2RhdGEgPSBmYWxzZTsKICAgIGFvbV9jb2RlY19lbmNvZGUoJmZpcnN0X3Bhc3NfZW5jb2RlciwgTlVMTCwgcHRzLCBkdXJhdGlvbiwgZmxhZ3MpOwogICAgZ2V0X3N0YXRzX2RhdGEoJmZpcnN0X3Bhc3NfZW5jb2Rlciwgc3RhdHMsIHN0YXRzX2xlbiwgJmdvdF9kYXRhKTsKICB9IHdoaWxlIChnb3RfZGF0YSk7CgogIGFvbV9jb2RlY19kZXN0cm95KCZmaXJzdF9wYXNzX2VuY29kZXIpOwp9Cn5+fn5+fn5+fn5+fn5+fgoKIER1cmluZyB0aGUgc2Vjb25kIHBhc3MsIHRoZSB1bmNvbXByZXNzZWQgZnJhbWVzIGFuZCB0aGUgc3RhdHMgYXJlCiBwYXNzZWQgaW50byB0aGUgZW5jb2Rlci4KCn5+fn5+fn5+fn5+fn5+fnsuY30KLy8gV3JpdGUgb3V0IGVhY2ggZW5jb2RlZCBmcmFtZSB0byB0aGUgZmlsZS4Kdm9pZCBnZXRfY3hfZGF0YShhb21fY29kZWNfY3R4X3QgKmVuY29kZXIsIEZJTEUgKmZpbGUsCiAgICAgICAgICAgICAgICAgYm9vbCAqZ290X2RhdGEpIHsKICBjb25zdCBhb21fY29kZWNfY3hfcGt0X3QgKnBrdDsKICBhb21fY29kZWNfaXRlcl90IGl0ZXIgPSBOVUxMOwogIHdoaWxlICgocGt0ID0gYW9tX2NvZGVjX2dldF9jeF9kYXRhKGVuY29kZXIsICZpdGVyKSkpIHsKICAgKmdvdF9kYXRhID0gdHJ1ZTsKICAgaWYgKHBrdC0+a2luZCAhPSBBT01fQ09ERUNfQ1hfRlJBTUVfUEtUKSBjb250aW51ZTsKICAgZndyaXRlKHBrdC0+ZGF0YS5mcmFtZS5idWYsIDEsIHBrdC0+ZGF0YS5mcmFtZS5zeiwgZmlsZSk7CiAgfQp9Cgp2b2lkIHNlY29uZF9wYXNzKGNoYXIgKnN0YXRzLCBzaXplX3Qgc3RhdHNfbGVuKSB7CiAgc3RydWN0IGFvbV9jb2RlY19lbmNfY2ZnIHNlY29uZF9wYXNzX2NmZzsKICAuLi4gLy8gSW5pdGlhbGl6ZSB0aGUgY29uZmlnIGZpbGUgYXMgbmVlZGVkLgogIHNlY29uZF9wYXNzX2NmZy5nX3Bhc3MgPSBBT01fUkNfTEFTVF9QQVNTOwogIGNmZy5yY190d29wYXNzX3N0YXRzX2luLmJ1ZiA9IHN0YXRzOwogIGNmZy5yY190d29wYXNzX3N0YXRzX2luLnN6ID0gc3RhdHNfbGVuOwogIGFvbV9jb2RlY19jdHhfdCBzZWNvbmRfcGFzc19lbmNvZGVyOwogIC4uLiAvLyBJbml0aWFsaXplIHRoZSBlbmNvZGVyIGZyb20gdGhlIGNvbmZpZy4KCiAgRklMRSAqb3V0cHV0ID0gZm9wZW4oIm91dHB1dC5vYnUiLCAid2IiKTsKICB3aGlsZSAoZnJhbWVfYXZhaWxhYmxlKSB7CiAgICAvLyBSZWFkIGluIHRoZSB1bmNvbXByZXNzZWQgZnJhbWUsIHVwZGF0ZSBmcmFtZV9hdmFpbGFibGUKICAgIGFvbV9pbWFnZV90ICpmcmFtZV90b19lbmNvZGUgPSAuLi47CiAgICBhb21fY29kZWNfZW5jb2RlKCZzZWNvbmRfcGFzc19lbmNvZGVyLCBpbWcsIHB0cywgZHVyYXRpb24sIGZsYWdzKTsKICAgIGdldF9jeF9kYXRhKCZzZWNvbmRfcGFzc19lbmNvZGVyLCBvdXRwdXQpOwogIH0KICAvLyBQYXNzIGluIE5VTEwgdG8gZmx1c2ggdGhlIGVuY29kZXIuCiAgYm9vbCBnb3RfZGF0YTsKICBkbyB7CiAgICBnb3RfZGF0YSA9IGZhbHNlOwogICAgYW9tX2NvZGVjX2VuY29kZSgmc2Vjb25kX3Bhc3NfZW5jb2RlciwgTlVMTCwgcHRzLCBkdXJhdGlvbiwgZmxhZ3MpOwogICAgZ2V0X2N4X2RhdGEoJnNlY29uZF9wYXNzX2VuY29kZXIsIG91dHB1dCwgJmdvdF9kYXRhKTsKICB9IHdoaWxlIChnb3RfZGF0YSk7CgogIGFvbV9jb2RlY19kZXN0cm95KCZzZWNvbmRfcGFzc19lbmNvZGVyKTsKfQp+fn5+fn5+fn5+fn5+fn4KICovCgogLyohXGRlZmdyb3VwIGxvb2tfYWhlYWRfYnVmZmVyIFRoZSBMb29rLUFoZWFkIEJ1ZmZlcgogICAgXGluZ3JvdXAgaGlnaF9sZXZlbF9hbGdvCgogQSBwcm9ncmFtIHNob3VsZCBjYWxsIFxyZWYgYW9tX2NvZGVjX2VuY29kZSgpIGZvciBlYWNoIGZyYW1lIHRoYXQgbmVlZHMKIHByb2Nlc3NpbmcuIFRoZXNlIGZyYW1lcyBhcmUgaW50ZXJuYWxseSBjb3BpZWQgYW5kIHN0b3JlZCBpbiBhIGZpeGVkLXNpemUKIGNpcmN1bGFyIGJ1ZmZlciwga25vd24gYXMgdGhlIGxvb2stYWhlYWQgYnVmZmVyLiBPdGhlciBwYXJ0cyBvZiB0aGUgY29kZQogd2lsbCB1c2UgZnV0dXJlIGZyYW1lIGluZm9ybWF0aW9uIHRvIGluZm9ybSBjdXJyZW50IGZyYW1lIGRlY2lzaW9uczsKIGV4YW1wbGVzIGluY2x1ZGUgdGhlIGZpcnN0LXBhc3MgYWxnb3JpdGhtLCBUUEwgbW9kZWwsIGFuZCB0ZW1wb3JhbCBmaWx0ZXIuCiBOb3RlIHRoYXQgdGhpcyBidWZmZXIgYWxzbyBrZWVwcyBhIHJlZmVyZW5jZSB0byB0aGUgbGFzdCBzb3VyY2UgZnJhbWUuCgogVGhlIGxvb2stYWhlYWQgYnVmZmVyIGlzIGRlZmluZWQgaW4gXHJlZiBhdjEvZW5jb2Rlci9sb29rYWhlYWQuaC4gSXQgYWN0cyBhcyBhbgogb3BhcXVlIHN0cnVjdHVyZSwgd2l0aCBhbiBpbnRlcmZhY2UgdG8gY3JlYXRlIGFuZCBmcmVlIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGgKIGl0LiBJdCBzdXBwb3J0cyBwdXNoaW5nIGFuZCBwb3BwaW5nIGZyYW1lcyBvbnRvIHRoZSBzdHJ1Y3R1cmUgaW4gYSBGSUZPCiBmYXNoaW9uLiBJdCBhbHNvIGFsbG93cyBsb29rLWFoZWFkIHdoZW4gdXNpbmcgdGhlIFxyZWYgYXYxX2xvb2thaGVhZF9wZWVrKCkKIGZ1bmN0aW9uIHdpdGggYSBub24tbmVnYXRpdmUgbnVtYmVyLCBhbmQgbG9vay1iZWhpbmQgd2hlbiAtMSBpcyBwYXNzZWQgaW4gKGZvcgogdGhlIGxhc3Qgc291cmNlIGZyYW1lOyBlLmcuLCBmaXJzdHBhc3Mgd2lsbCB1c2UgdGhpcyBmb3IgbW90aW9uIGVzdGltYXRpb24pLgogVGhlIFxyZWYgYXYxX2xvb2thaGVhZF9kZXB0aCgpIGZ1bmN0aW9uIHJldHVybnMgdGhlIGN1cnJlbnQgbnVtYmVyIG9mIGZyYW1lcwogc3RvcmVkIGluIGl0LiBOb3RlIHRoYXQgXHJlZiBhdjFfbG9va2FoZWFkX3BvcCgpIGlzIGEgYml0IG9mIGEgbWlzbm9tZXIgLSBpdAogb25seSBwb3BzIGlmIGVpdGhlciB0aGUgImZsdXNoIiB2YXJpYWJsZSBpcyBzZXQsIG9yIHRoZSBidWZmZXIgaXMgYXQgbWF4aW11bQogY2FwYWNpdHkuCgogVGhlIGJ1ZmZlciBpcyBzdG9yZWQgaW4gdGhlIFxyZWYgQVYxX0NPTVA6Omxvb2thaGVhZCBmaWVsZC4KIEl0IGlzIGluaXRpYWxpemVkIGluIHRoZSBmaXJzdCBjYWxsIHRvIFxyZWYgYW9tX2NvZGVjX2VuY29kZSgpLCBpbiB0aGUKIFxyZWYgYXYxX3JlY2VpdmVfcmF3X2ZyYW1lKCkgc3ViLXJvdXRpbmUuIFRoZSBidWZmZXIgc2l6ZSBpcyBkZWZpbmVkIGJ5CiB0aGUgZ19sYWdfaW5fZnJhbWVzIHBhcmFtZXRlciBzZXQgaW4gdGhlCiBccmVmIGFvbV9jb2RlY19lbmNfY2ZnX3Q6OmdfbGFnX2luX2ZyYW1lcyBzdHJ1Y3QuCiBUaGlzIGNhbiBiZSBtb2RpZmllZCBtYW51YWxseSBidXQgc2hvdWxkIG9ubHkgYmUgc2V0IG9uY2UuIE9uIHRoZSBjb21tYW5kCiBsaW5lLCB0aGUgZmxhZyAiLS1sYWctaW4tZnJhbWVzIiBjb250cm9scyBpdC4gVGhlIGRlZmF1bHQgc2l6ZSBpcyAxOSBmb3IKIG5vbi1yZWFsdGltZSB1c2FnZSBhbmQgMSBmb3IgcmVhbHRpbWUuIE5vdGUgdGhhdCBhIG1heGltdW0gdmFsdWUgb2YgMzUgaXMKIGVuZm9yY2VkLgoKIEEgZnJhbWUgd2lsbCBzdGF5IGluIHRoZSBidWZmZXIgYXMgbG9uZyBhcyBwb3NzaWJsZS4gQXMgbWVudGlvbmVkIGFib3ZlLAogdGhlIFxyZWYgYXYxX2xvb2thaGVhZF9wb3AoKSBvbmx5IHJlbW92ZXMgYSBmcmFtZSB3aGVuIGVpdGhlciBmbHVzaCBpcyBzZXQsCiBvciB0aGUgYnVmZmVyIGlzIGZ1bGwuIE5vdGUgdGhhdCBlYWNoIGNhbGwgdG8gXHJlZiBhb21fY29kZWNfZW5jb2RlKCkgaW5zZXJ0cwogYW5vdGhlciBmcmFtZSBpbnRvIHRoZSBidWZmZXIsIGFuZCBwb3AgaXMgY2FsbGVkIGJ5IHRoZSBzdWItZnVuY3Rpb24KIFxyZWYgYXYxX2VuY29kZV9zdHJhdGVneSgpLiBUaGUgYnVmZmVyIGlzIHRvbGQgdG8gZmx1c2ggd2hlbgogXHJlZiBhb21fY29kZWNfZW5jb2RlKCkgaXMgcGFzc2VkIGEgTlVMTCBpbWFnZSBwb2ludGVyLiBOb3RlIHRoYXQgdGhlIGNhbGxlcgogbXVzdCByZXBlYXRlZGx5IGNhbGwgXHJlZiBhb21fY29kZWNfZW5jb2RlKCkgd2l0aCBhIE5VTEwgaW1hZ2UgcG9pbnRlciwgdW50aWwKIG5vIG1vcmUgcGFja2V0cyBhcmUgYXZhaWxhYmxlLCBpbiBvcmRlciB0byBmdWxseSBmbHVzaCB0aGUgYnVmZmVyLgoKICovCgovKiEgQH0gLSBlbmQgZGVmZ3JvdXAgaGlnaF9sZXZlbF9hbGdvICovCgovKiFcZGVmZ3JvdXAgcGFydGl0aW9uX3NlYXJjaCBQYXJ0aXRpb24gU2VhcmNoCiAqIFxpbmdyb3VwIGVuY29kZXJfYWxnbwogKiBGb3IgYW5kIG92ZXJ2aWV3IG9mIHRoZSBwYXJ0aXRpb24gc2VhcmNoIHNlZSBccmVmIGFyY2hpdGVjdHVyZV9lbmNfcGFydGl0aW9ucwogKiBAewogKi8KCi8qISBAfSAtIGVuZCBkZWZncm91cCBwYXJ0aXRpb25fc2VhcmNoICovCgovKiFcZGVmZ3JvdXAgaW50cmFfbW9kZV9zZWFyY2ggSW50cmEgTW9kZSBTZWFyY2gKICogXGluZ3JvdXAgZW5jb2Rlcl9hbGdvCiAqIFRoaXMgbW9kdWxlIGRlc2NyaWJlcyBpbnRyYSBtb2RlIHNlYXJjaCBhbGdvcml0aG0gaW4gQVYxLgogKiBNb3JlIGRldGFpbHMgd2lsbCBiZSBhZGRlZC4KICogQHsKICovCi8qISBAfSAtIGVuZCBkZWZncm91cCBpbnRyYV9tb2RlX3NlYXJjaCAqLwoKLyohXGRlZmdyb3VwIGludGVyX21vZGVfc2VhcmNoIEludGVyIE1vZGUgU2VhcmNoCiAqIFxpbmdyb3VwIGVuY29kZXJfYWxnbwogKiBUaGlzIG1vZHVsZSBkZXNjcmliZXMgaW50ZXIgbW9kZSBzZWFyY2ggYWxnb3JpdGhtIGluIEFWMS4KICogTW9yZSBkZXRhaWxzIHdpbGwgYmUgYWRkZWQuCiAqIEB7CiAqLwovKiEgQH0gLSBlbmQgZGVmZ3JvdXAgaW50ZXJfbW9kZV9zZWFyY2ggKi8KCi8qIVxkZWZncm91cCBwYWxldHRlX21vZGVfc2VhcmNoIFBhbGV0dGUgTW9kZSBTZWFyY2gKICogXGluZ3JvdXAgaW50cmFfbW9kZV9zZWFyY2gKICogVGhpcyBtb2R1bGUgZGVzY3JpYmVzIHBhbGV0dGUgbW9kZSBzZWFyY2ggYWxnb3JpdGhtIGluIEFWMS4KICogTW9yZSBkZXRhaWxzIHdpbGwgYmUgYWRkZWQuCiAqIEB7CiAqLwovKiEgQH0gLSBlbmQgZGVmZ3JvdXAgcGFsZXR0ZV9tb2RlX3NlYXJjaCAqLwoKLyohXGRlZmdyb3VwIHRyYW5zZm9ybV9zZWFyY2ggVHJhbnNmb3JtIFNlYXJjaAogKiBcaW5ncm91cCBlbmNvZGVyX2FsZ28KICogVGhpcyBtb2R1bGUgZGVzY3JpYmVzIHRyYW5zZm9ybSBzZWFyY2ggYWxnb3JpdGhtIGluIEFWMS4KICogQHsKICovCi8qISBAfSAtIGVuZCBkZWZncm91cCB0cmFuc2Zvcm1fc2VhcmNoICovCgovKiFcZGVmZ3JvdXAgY29lZmZpY2llbnRfY29kaW5nIFRyYW5zZm9ybSBDb2VmZmljaWVudCBDb2RpbmcgYW5kIE9wdGltaXphdGlvbgogKiBcaW5ncm91cCBlbmNvZGVyX2FsZ28KICogVGhpcyBtb2R1bGUgZGVzY3JpYmVzIHRoZSBhbGdvcml0aG1zIG9mIHRyYW5zZm9ybSBjb2VmZmljaWVudCBjb2RpbmcgYW5kIG9wdGltaXphdGlvbiBpbiBBVjEuCiAqIE1vcmUgZGV0YWlscyB3aWxsIGJlIGFkZGVkLgogKiBAewogKi8KLyohIEB9IC0gZW5kIGRlZmdyb3VwIGNvZWZmaWNpZW50X2NvZGluZyAqLwoKLyohXGRlZmdyb3VwIGluX2xvb3BfZmlsdGVyIEluLWxvb3AgRmlsdGVyCiAqIFxpbmdyb3VwIGVuY29kZXJfYWxnbwogKiBUaGlzIG1vZHVsZSBkZXNjcmliZXMgaW4tbG9vcCBmaWx0ZXIgYWxnb3JpdGhtIGluIEFWMS4KICogTW9yZSBkZXRhaWxzIHdpbGwgYmUgYWRkZWQuCiAqIEB7CiAqLwovKiEgQH0gLSBlbmQgZGVmZ3JvdXAgaW5fbG9vcF9maWx0ZXIgKi8KCi8qIVxkZWZncm91cCBpbl9sb29wX2NkZWYgQ0RFRgogKiBcaW5ncm91cCBlbmNvZGVyX2FsZ28KICogVGhpcyBtb2R1bGUgZGVzY3JpYmVzIHRoZSBDREVGIHBhcmFtZXRlciBzZWFyY2ggYWxnb3JpdGhtCiAqIGluIEFWMS4gTW9yZSBkZXRhaWxzIHdpbGwgYmUgYWRkZWQuCiAqIEB7CiAqLwovKiEgQH0gLSBlbmQgZGVmZ3JvdXAgaW5fbG9vcF9yZXN0b3JhdGlvbiAqLwoKLyohXGRlZmdyb3VwIGluX2xvb3BfcmVzdG9yYXRpb24gTG9vcCBSZXN0b3JhdGlvbgogKiBcaW5ncm91cCBlbmNvZGVyX2FsZ28KICogVGhpcyBtb2R1bGUgZGVzY3JpYmVzIHRoZSBsb29wIHJlc3RvcmF0aW9uIHNlYXJjaAogKiBhbmQgZXN0aW1hdGlvbiBhbGdvcml0aG0gaW4gQVYxLgogKiBNb3JlIGRldGFpbHMgd2lsbCBiZSBhZGRlZC4KICogQHsKICovCi8qISBAfSAtIGVuZCBkZWZncm91cCBpbl9sb29wX3Jlc3RvcmF0aW9uICovCgovKiFcZGVmZ3JvdXAgY3ljbGljX3JlZnJlc2ggQ3ljbGljIFJlZnJlc2gKICogXGluZ3JvdXAgZW5jb2Rlcl9hbGdvCiAqIFRoaXMgbW9kdWxlIGRlc2NyaWJlcyB0aGUgY3ljbGljIHJlZnJlc2ggKGFxLW1vZGU9MykgaW4gQVYxLgogKiBNb3JlIGRldGFpbHMgd2lsbCBiZSBhZGRlZC4KICogQHsKICovCi8qISBAfSAtIGVuZCBkZWZncm91cCBjeWNsaWNfcmVmcmVzaCAqLwoKLyohXGRlZmdyb3VwIFNWQyBTY2FsYWJsZSBWaWRlbyBDb2RpbmcKICogXGluZ3JvdXAgZW5jb2Rlcl9hbGdvCiAqIFRoaXMgbW9kdWxlIGRlc2NyaWJlcyBzY2FsYWJsZSB2aWRlbyBjb2RpbmcgYWxnb3JpdGhtIGluIEFWMS4KICogTW9yZSBkZXRhaWxzIHdpbGwgYmUgYWRkZWQuCiAqIEB7CiAqLwovKiEgQH0gLSBlbmQgZGVmZ3JvdXAgU1ZDICovCi8qIVxkZWZncm91cCB2YXJpYW5jZV9wYXJ0aXRpb24gVmFyaWFuY2UgUGFydGl0aW9uCiAqIFxpbmdyb3VwIGVuY29kZXJfYWxnbwogKiBUaGlzIG1vZHVsZSBkZXNjcmliZXMgdmFyaWFuY2UgcGFydGl0aW9uIGFsZ29yaXRobSBpbiBBVjEuCiAqIE1vcmUgZGV0YWlscyB3aWxsIGJlIGFkZGVkLgogKiBAewogKi8KLyohIEB9IC0gZW5kIGRlZmdyb3VwIHZhcmlhbmNlX3BhcnRpdGlvbiAqLwovKiFcZGVmZ3JvdXAgbm9ucmRfbW9kZV9zZWFyY2ggTm9uUkQgT3B0aW1pemVkIE1vZGUgU2VhcmNoCiAqIFxpbmdyb3VwIGVuY29kZXJfYWxnbwogKiBUaGlzIG1vZHVsZSBkZXNjcmliZXMgTm9uUkQgT3B0aW1pemVkIE1vZGUgU2VhcmNoIHVzZWQgaW4gUmVhbC1UaW1lIG1vZGUuCiAqIE1vcmUgZGV0YWlscyB3aWxsIGJlIGFkZGVkLgogKiBAewogKi8KLyohIEB9IC0gZW5kIGRlZmdyb3VwIG5vbnJkX21vZGVfc2VhcmNoICovCg==