ClVzaW5nIFNwYW1Bc3Nhc3NpbiBXaXRoIEFuIExEQVAgU2VydmVyCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpTcGFtQXNzYXNzaW4gY2FuIG5vdyBsb2FkIHVzZXJzJyBzY29yZSBmaWxlcyBmcm9tIGFuIExEQVAgc2VydmVyLiAgVGhlIGNvbmNlcHQKaGVyZSBpcyB0byBoYXZlIGEgd2ViIGFwcGxpY2F0aW9uIChQSFAvcGVybC9BU1AvZXRjLikgdGhhdCB3aWxsIGFsbG93IHVzZXJzIHRvCmJlIGFibGUgdG8gdXBkYXRlIHRoZWlyIGxvY2FsIHByZWZlcmVuY2VzIG9uIGhvdyBTcGFtQXNzYXNzaW4gd2lsbCBmaWx0ZXIgdGhlaXIKZS1tYWlsLiAgVGhlIG1vc3QgY29tbW9uIHVzZSBmb3IgYSBzeXN0ZW0gbGlrZSB0aGlzIHdvdWxkIGJlIGZvciB1c2VycyB0byBiZQphYmxlIHRvIHVwZGF0ZSB0aGUgd2hpdGUgbGlzdCBvZiBhZGRyZXNzZXMgKHdoaXRlbGlzdF9mcm9tKSB3aXRob3V0IHRoZSBuZWVkCmZvciB0aGVtIHRvIHVwZGF0ZSB0aGVpciAkSE9NRS8uc3BhbWFzc2Fzc2luL3VzZXJfcHJlZnMgZmlsZS4gIEl0IGlzIGFsc28gcXVpdGUKY29tbW9uIGZvciB1c2VycyBsaXN0ZWQgaW4gL2V0Yy9wYXNzd2QgdG8gbm90IGhhdmUgYSBob21lIGRpcmVjdG9yeSwKdGhlcmVmb3JlLCB0aGUgb25seSB3YXkgdG8gaGF2ZSB0aGVpciBvd24gbG9jYWwgc2V0dGluZ3Mgd291bGQgYmUgdGhyb3VnaCBhCmRhdGFiYXNlIG9yIExEQVAgc2VydmVyLgoKU3BhbUFzc2Fzc2luIHdpbGwgY2hlY2sgdGhlIGdsb2JhbCBjb25maWd1cmF0aW9uIGZpbGUgKGllLiBhbnkgZmlsZSBtYXRjaGluZwovZXRjL21haWwvc3BhbWFzc2Fzc2luLyouY2YpIGZvciB0aGUgZm9sbG93aW5nIHNldHRpbmdzOgoKICB1c2VyX3Njb3Jlc19kc24gbGRhcDovL2hvc3Q6cG9ydC9kYz1iYXNlZG4sZGM9ZGU/YXR0cj9zY29wZT91aWQ9X19VU0VSTkFNRV9fCiAgdXNlcl9zY29yZXNfbGRhcF91c2VybmFtZQliaW5kIGRuCiAgdXNlcl9zY29yZXNfbGRhcF9wYXNzd29yZAlwYXNzd29yZAoKVGhlIGZpcnN0IG9wdGlvbiwgdXNlcl9zY29yZXNfZHNuLCBkZXNjcmliZXMgdGhlIGRhdGEgc291cmNlIG5hbWUgdGhhdCB3aWxsIGJlCnVzZWQgdG8gY3JlYXRlIHRoZSBjb25uZWN0aW9uIHRvIHlvdXIgTERBUCBzZXJ2ZXIuIFlvdSBoYXZlIHRvIHdyaXRlIHRoZSBEU04gYXMKYW4gTERBUCBVUkwsIHRoZSBjb21wb25lbnRzIGJlaW5nIHRoZSBob3N0IGFuZCBwb3J0IHRvIGNvbm5lY3QgdG8sIHRoZSBiYXNlIEROCmZvciB0aGUgc2VhcmNoLCB0aGUgc2NvcGUgb2YgdGhlIHNlYXJjaCAoYmFzZSwgb25lIG9yIHN1YiksIHRoZSBzaW5nbGUKYXR0cmlidXRlIGJlaW5nIHRoZSBtdWx0aXZhbHVlZCBhdHRyaWJ1dGUgdXNlZCB0byBob2xkIHRoZSBjb25maWd1cmF0aW9uIGRhdGEKKHNwYWNlIHNlcGFyYXRlZCBwYWlycyBvZiBrZXkgYW5kIHZhbHVlLCBqdXN0IGFzIGluIGEgZmlsZSkgYW5kIGZpbmFsbHkgdGhlCmZpbHRlciBiZWluZyB0aGUgZXhwcmVzc2lvbiB1c2VkIHRvIGZpbHRlciBvdXQgdGhlIHdhbnRlZCB1c2VybmFtZS4gTm90ZSB0aGF0CnRoZSBmaWx0ZXIgZXhwcmVzc2lvbiB1c2VzIHRoZSBsaXRlcmFsIHRleHQgX19VU0VSTkFNRV9fIGFzIGEgcGxhY2Vob2xkZXIgZm9yCnRoZSB1c2VybmFtZSAoU3BhbUFzc2Fzc2luIHdpbGwgdXNlIGEgcy8vL2cgc3RhdGVtZW50IHRvIHJlcGxhY2UgaXQgd2l0aCB0aGUKYWN0dWFsIHVzZXJuYW1lKS4KCkV4YW1wbGVzOgoKICBsZGFwOi8vbG9jYWxob3N0OjM4OS9kYz1rb2VobnRvcHAsZGM9ZGU/c3BhbWFzc2Fzc2luP3N1Yj91aWQ9X19VU0VSTkFNRV9fCiAgbGRhcDovL2xvY2FsaG9zdDozODkvbz1zdG9vZ2VzP3NwYW1hc3Nhc3Npbj9zdWI/dWlkPV9fVVNFUk5BTUVfXwoKCklmIHRoZSB1c2VyX3Njb3Jlc19kc24gb3B0aW9uIGRvZXMgbm90IGV4aXN0LCBTcGFtQXNzYXNzaW4gd2lsbCBub3QgYXR0ZW1wdAp0byB1c2UgYW4gTERBUCBzZXJ2ZXIgZm9yIHJldHJpZXZpbmcgdXNlcnMnIHByZWZlcmVuY2VzLiBOb3RlIHRoYXQgdGhpcyB3aWxsCk5PVCBsb29rIGZvciB0ZXN0IHJ1bGVzLCBvbmx5IGxvY2FsIHNjb3Jlcywgd2hpdGVsaXN0X2Zyb20ocyksIGFuZApyZXF1aXJlZF9zY29yZS4KClJlcXVpcmVtZW50cwotLS0tLS0tLS0tLS0KCkluIG9yZGVyIGZvciBTcGFtQXNzYXNzaW4gdG8gd29yayB3aXRoIHlvdXIgTERBUCBkYXRhYmFzZSwgeW91IG11c3QgaGF2ZQp0aGUgcGVybCBOZXQ6OkxEQVAgbW9kdWxlIGluc3RhbGxlZC4gWW91J2xsIGFsc28gbmVlZCB0aGUgVVJJIG1vZHVsZS4KCkluIG9yZGVyIGZvciBzcGFtZCB0byB1c2UgdGhlIExEQVAgZHJpdmVyLCB5b3Ugd2lsbCBoYXZlIHRvIHN0YXJ0IHNwYW1kCndpdGggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVycyAnLS1sZGFwLWNvbmZpZyAteCcuCgpFYWNoIHVzZXIgdGhhdCB3YW50cyB0byB1dGlsaXNlIHRoZSBTcGFtQXNzYXNzaW4gTERBUCBkcml2ZXIgbXVzdCBhZGQKdGhlICdzcGFtYXNzYXNzaW4nIGF0dHJpYnV0ZSBpbiB0aGVpciBvYmplY3QgKGVpdGhlciBtYW51YWxseSBvciB2aWEgdGhlCndlYiBpbnRlcmZhY2Ugb2YgeW91ciBtYWtpbmcvY2hvaWNlKSBsaWtlIHRoaXMgKHNlZSB0aGUgZmlsZSBzYV90ZXN0LmxkaWYKaW4gdGhpcyBkaXJlY3RvcnkgZm9yIGEgZnVsbCBkYXRhYmFzZSBleGFtcGxlKToKCiAgc3BhbWFzc2Fzc2luOiBhZGRfaGVhZGVyIGFsbCBGb28gTERBUCByZWFkCgpEYXRhYmFzZSBTY2hlbWEKLS0tLS0tLS0tLS0tLS0tCgpZb3UgY2FuIHVzZSBhbnkgc2NoZW1hIGV4dGVuc2lvbiB0byB5b3VyIHVzZXIgZW50cmllcyB3aXRoIFNwYW1Bc3Nhc3NpbiwKYXMgbG9uZyBhcyB0aGUgYXR0cmlidXRlIGlzIG11bHRpdmFsdWVkIGFuZCBjb3JyZWN0bHkgbmFtZWQgaW4geW91ciBMREFQIHVybC4KV2UgYXJlIGN1cnJlbnRseSB1c2luZyBhIDxjdXN0b21lcm5hbWU+c3BhbWFzc2Fzc2luIGZpZWxkIHRoYXQgaXMgcGFydCBvZgpvdXIgaW5ldE9yZ1BlcnNvbiBzdWJjbGFzcy4KCkhlcmUncyBhbiBleGFtcGxlIGZvciBvcGVubGRhcCdzIC9ldGMvb3BlbmxkYXAvc2NoZW1hL2luZXRvcmdwZXJzb24uc2NoZW1hIDoKCiAgIyBTcGFtQXNzYXNzaW4KICAjIHNlZSBodHRwOi8vU3BhbUFzc2Fzc2luLm9yZy8gLgogIGF0dHJpYnV0ZXR5cGUgKCAyLjE2Ljg0MC4xLjExMzczMC4zLjEuMjE3CiAgICAgICAgICBOQU1FICdzcGFtYXNzYXNzaW4nCiAgICAgICAgICBERVNDICdTcGFtQXNzYXNzaW4gdXNlciBwcmVmZXJlbmNlcyBzZXR0aW5ncycKCSAgRVFVQUxJVFkgY2FzZUV4YWN0TWF0Y2gKCSAgU1lOVEFYIDEuMy42LjEuNC4xLjE0NjYuMTE1LjEyMS4xLjE1ICkKCihkb24ndCBmb3JnZXQgdG8gYWRkICIkIHNwYW1hc3Nhc3NpbiIgdG8gdGhlIG9iamVjdGNsYXNzIE1BWSBjbGF1c2UuKQoKClRlc3RpbmcgU3BhbUFzc2Fzc2luL0xEQVAKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVG8gdGVzdCB5b3VyIExEQVAgc2V0dXAsIGFuZCBkZWJ1ZyBhbnkgcG9zc2libGUgcHJvYmxlbXMsIHlvdSBzaG91bGQgc3RhcnQKc3BhbWQgd2l0aCB0aGUgLUQgb3B0aW9uLCB3aGljaCB3aWxsIGtlZXAgc3BhbWQgaW4gdGhlIGZvcmVncm91bmQsIGFuZCB3aWxsCm91dHB1dCBkZWJ1ZyBtZXNzYWdlIHRvIHRoZSB0ZXJtaW5hbC4gWW91IHNob3VsZCB0aGVuIHRlc3Qgc3BhbWQgd2l0aCBhCm1lc3NhZ2UgYnkgY2FsbGluZyBzcGFtYy4gIFlvdSBjYW4gdXNlIHRoZSBzYW1wbGUtc3BhbS50eHQgZmlsZSB3aXRoIHRoZQpmb2xsb3dpbmcgY29tbWFuZDoKCiAgY2F0IHNhbXBsZS1zcGFtLnR4dCB8IHNwYW1jCgpXYXRjaCB0aGUgZGVidWcgb3V0cHV0IGZyb20gc3BhbWQgYW5kIGxvb2sgZm9yIHRoZSBmb2xsb3dpbmcgZGVidWcgbGluZToKCiAgcmV0cmlldmluZyBMREFQIHByZWZzIGZvciA8dXNlcm5hbWU+OiA8dmFsdWU+CgpJZiB5b3UgZG8gbm90IHNlZSB0aGUgYWJvdmUgdGV4dCwgdGhlbiB0aGUgTERBUCBxdWVyeSB3YXMgbm90IHN1Y2Nlc3NmdWwsIGFuZAp5b3Ugc2hvdWxkIHNlZSBhbnkgZXJyb3IgbWVzc2FnZXMgcmVwb3J0ZWQuIDx1c2VybmFtZT4gc2hvdWxkIGJlIHRoZSB1c2VyCnRoYXQgd2FzIHBhc3NlZCB0byBzcGFtZCBhbmQgaXMgdXN1YWxseSB0aGUgdXNlciBleGVjdXRpbmcgc3BhbWMuCgpJZiB5b3UgbmVlZCB0byBzZXQgdXAgTERBUCwgYSBnb29kIGd1aWRlIGlzIGhlcmU6Cmh0dHA6Ly95b2xpbnV4LmNvbS9UVVRPUklBTFMvTGludXhUdXRvcmlhbExEQVAuaHRtbAoKVG8gdGVzdCBMREFQIHN1cHBvcnQgdXNpbmcgdGhlIFNwYW1Bc3Nhc3NpbiB0ZXN0IHN1aXRlLCB5b3UgbmVlZCB0bwpwZXJmb3JtIGEgbGl0dGxlIGJpdCBvZiBtYW51YWwgY29uZmlndXJhdGlvbiBmaXJzdC4gIFNlZSB0aGUgZmlsZQoibGRhcC9SRUFETUUudGVzdGluZyIgZm9yIGRldGFpbHMuCgoKKioqKioqCk5COiAgVGhpcyBzaG91bGQgYmUgY29uc2lkZXJlZCBCRVRBLCBhbmQgdGhlIGludGVyZmFjZSBvciBvdmVyYWxsCm9wZXJhdGlvbiBvZiBMREFQIHN1cHBvcnQgbWF5IGNoYW5nZSBhdCBhbnkgdGltZSB3aXRoIGZ1dHVyZSByZWxlYXNlcyBvZiBTQS4KKioqKioqCgpQbGVhc2Ugc2VuZCBhbnkgY29tbWVudHMgdG8gPGtyaXMgYXQga29laG50b3BwLmRlPiBhbmQgZmlsZSBidWdzIHZpYQo8aHR0cDovL2lzc3Vlcy5hcGFjaGUub3JnL1NwYW1Bc3Nhc3Npbi8+LgoKS3Jpc3RpYW4gS/ZobnRvcHAK