IFRoZSBmaWxlIGZvcm1hdCBvZiB0aGUgdGVzdCBzdWl0ZSBpcyBhIHZlcnkgc2ltcGxlIGFuZCBleHRlbmRhYmxlIGZvcm1hdC4gQWxsCmRhdGEgZm9yIGEgc2luZ2xlIHRlc3QgY2FzZSByZXNpZGVzIGluIGEgc2luZ2xlIEFTQ0lJIGZpbGUuIExhYmVscyBtYXJrIHRoZQpiZWdpbm5pbmcgYW5kIHRoZSBlbmQgb2YgYWxsIHNlY3Rpb25zLiBFYWNoIGxhYmVsIG11c3QgYmUgd3JpdHRlbiBpbiBpdHMgb3duCmxpbmUgYW5kIGlzIHJlc2VtYmxpbmcgWE1ML0hUTUwuCgogRWFjaCBmaWxlIGlzIHNwbGl0IHVwIGluIHRocmVlIG1haW4gc2VjdGlvbnM6IHJlcGx5LCBjbGllbnQgYW5kIHZlcmlmeS4gVGhlCnJlcGx5IHNlY3Rpb24gaXMgdXNlZCBmb3IgdGhlIHNlcnZlciB0byBrbm93IHdoYXQgdG8gc2VuZCBhcyBhIHJlcGx5IGZvciB0aGUKcmVxdWVzdHMgY3VybCBzZW5kcywgdGhlIGNsaWVudCBzZWN0aW9uIGRlZmluZXMgaG93IHRoZSBjbGllbnQgc2hvdWxkIGJlaGF2ZQp3aGlsZSB0aGUgdmVyaWZ5IHNlY3Rpb24gZGVmaW5lcyBob3cgdG8gdmVyaWZ5IHRoYXQgdGhlIGRhdGEgc3RvcmVkIGFmdGVyIGEKY29tbWFuZCBoYXMgYmVlbiBydW4gZW5kZWQgdXAgY29ycmVjdGx5LgoKIEVhY2ggbWFpbiBzZWN0aW9uIGhhcyBhIG51bWJlciBvZiBhdmFpbGFibGUgc3Vic2VjdGlvbnMgdGhhdCBjYW4gYmUKc3BlY2lmaWVkLCB0aGF0IHdpbGwgYmUgY2hlY2tlZC91c2VkIGlmIHNwZWNpZmllZC4gVGhpcyBkb2N1bWVudCBpbmNsdWRlcyBhbGwKdGhlIHN1YnNlY3Rpb25zIGN1cnJlbnRseSBzdXBwb3J0ZWQuCgpNYWluIHNlY3Rpb25zIGFyZSAnaW5mbycsICdyZXBseScsICdjbGllbnQnIGFuZCAndmVyaWZ5Jy4KCjxpbmZvPgo8a2V5d29yZHM+CkEgbmV3bGluZS1zZXBhcmF0ZWQgbGlzdCBvZiBrZXl3b3JkcyBkZXNjcmliaW5nIHdoYXQgdGhpcyB0ZXN0IGNhc2UgdXNlcyBhbmQKdGVzdHMuIFRyeSB0byB1c2UgYW4gYWxyZWFkeSB1c2VkIGtleXdvcmQuIFRoZXNlIGtleXdvcmRzIHdpbGwgYmUgdXNlZCBmb3IKc3RhdGlzdGljYWwvaW5mb3JtYXRpb25hbCBwdXJwb3Nlcy4KPC9rZXl3b3Jkcz4KPC9pbmZvPgoKPHJlcGx5Pgo8ZGF0YSBbbm9jaGVjaz0xXSBbc2VuZHplcm89eWVzXSBbYmFzZTY0PXllc10+CqdkYXRhIHRvIHNlbnQgdG8gdGhlIGNsaWVudCBvbiBpdHMgcmVxdWVzdCBhbmQgbGF0ZXIgdmVyaWZpZWQgdGhhdCBpdCBhcnJpdmVkCnNhZmVseS4gU2V0IHRoZSBub2NoZWNrPTEgdG8gcHJldmVudCB0aGUgdGVzdCBzY3JpcHQgdG8gdmVyaWZ5IHRoZSBhcnJpdmFsCm9mIHRoaXMgZGF0YS4KCklmIHRoZSBkYXRhIGNvbnRhaW5zICdzd3NjbG9zZScgYW55d2hlcmUgd2l0aGluIHRoZSBzdGFydCBhbmQgZW5kIHRhZywgYW5kCnRoaXMgaXMgYSBIVFRQIHRlc3QsIHRoZW4gdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbG9zZWQgYnkgdGhlIHNlcnZlciBhZnRlcgp0aGlzIHJlc3BvbnNlIGlzIHNlbnQuIElmIG5vdCwgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBrZXB0IHBlcnNpc3RhbnQuCgpJZiB0aGUgZGF0YSBjb250YWlucyAnc3dzYm91bmNlJyBhbnl3aGVyZSB3aXRoaW4gdGhlIHN0YXJ0IGFuZCBlbmQgdGFnLCB0aGUKSFRUUCBzZXJ2ZXIgd2lsbCBkZXRlY3QgaWYgdGhpcyBpcyBhIHNlY29uZCByZXF1ZXN0IHVzaW5nIHRoZSBzYW1lIHRlc3QgYW5kCnBhcnQgbnVtYmVyIGFuZCB3aWxsIHRoZW4gaW5jcmVhc2UgdGhlIHBhcnQgbnVtYmVyIHdpdGggb25lLiBUaGlzIGlzIHVzZWZ1bApmb3IgYXV0aCB0ZXN0cyBhbmQgc2ltaWxhci4KCidzZW5kemVybycgc2V0IHRvIHllcyBtZWFucyB0aGF0IHRoZSAoRlRQKSBzZXJ2ZXIgd2lsbCAic2VuZCIgdGhlIGRhdGEgZXZlbiBpZgp0aGUgc2l6ZSBpcyB6ZXJvIGJ5dGVzLiBVc2VkIHRvIHZlcmlmeSBjdXJsJ3MgYmVoYXZpb3VyIG9uIHplcm8gYnl0ZXMKdHJhbnNmZXJzLgoKJ2Jhc2U2NCcgc2V0IHRvIHllcyBtZWFucyB0aGF0IHRoZSBkYXRhIHByb3ZpZGVkIGluIHRoZSB0ZXN0LWZpbGUgaXMgYSBjaHVuawpvZiBkYXRhIGVuY29kZWQgd2l0aCBiYXNlNjQuIEl0IGlzIHRoZSBvbmx5IHdheSBhIHRlc3QgY2FzZSBjYW4gY29udGFpbiBiaW5hcnkKZGF0YS4gKFRoaXMgYXR0cmlidXRlIGNhbiBpbiBmYWN0IGJlIHVzZWQgb24gYW55IHNlY3Rpb24sIGJ1dCBpdCBkb2Vzbid0IG1ha2UKbXVjaCBzZW5zZSBmb3Igb3RoZXIgc2VjdGlvbnMgdGhhbiAiZGF0YSIpLgo8L2RhdGE+CjxkYXRhTlVNPgpTZW5kIGJhY2sgdGhpcyBjb250ZW50cyBpbnN0ZWFkIG9mIHRoZSA8ZGF0YT4gb25lLiBUaGUgbnVtIGlzIHNldCBieToKQSkgVGhlIHRlc3QgbnVtYmVyIGluIHRoZSByZXF1ZXN0IGxpbmUgaXMgPjEwMDAwIGFuZCB0aGlzIGlzIHRoZSByZW1haW5kZXIKb2YgW3Rlc3QgY2FzZSBudW1iZXJdJTEwMDAwLgpCKSBUaGUgcmVxdWVzdCB3YXMgSFRUUCBhbmQgaW5jbHVkZWQgZGlnZXN0IGRldGFpbHMsIHdoaWNoIGFkZHMgMTAwMCB0byBOVU0KQykgSWYgYSBIVFRQIHJlcXVlc3QgaXMgTlRMTSB0eXBlLTEsIGl0IGFkZHMgMTAwMSB0byBudW0KRCkgSWYgYSBIVFRQIHJlcXVlc3QgaXMgTlRMTSB0eXBlLTMsIGl0IGFkZHMgMTAwMiB0byBudW0KPC9kYXRhTlVNPgo8ZGF0YWNoZWNrIFtub25ld2xpbmU9eWVzXT4KaWYgdGhlIGRhdGEgaXMgc2VudCBidXQgdGhpcyBpcyB3aGF0IHNob3VsZCBiZSBjaGVja2VkIGFmdGVyd2FyZHMuIElmCidub25ld2xpbmUnIGlzIHNldCwgd2Ugd2lsbCBjdXQgb2ZmIHRoZSB0cmFpbGluZyBuZXdsaW5lIG9mIHRoaXMgZ2l2ZW4gZGF0YQpiZWZvcmUgY29tcGFyaW5nIHdpdGggdGhlIG9uZSBhY3R1YWxseSByZWNlaXZlZCBieSB0aGUgY2xpZW50CjwvZGF0YWNoZWNrPgo8c2l6ZT4KbnVtYmVyIHRvIHJldHVybiBvbiBhIGZ0cCBTSVpFIGNvbW1hbmQgKHNldCB0byAtMSB0byBtYWtlIHRoaXMgY29tbWFuZCBmYWlsKQo8L3NpemU+CjxtZHRtPgp3aGF0IHRvIHNlbmQgYmFjayBpZiB0aGUgY2xpZW50IHNlbmRzIGEgKEZUUCkgTURUTSBjb21tYW5kLCBzZXQgdG8gLTEgdG8KaGF2ZSBpdCByZXR1cm4gdGhhdCB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0CjwvbWR0bT4KPHBvc3RjbWQ+CnNwZWNpYWwgcHVycG9zZSBzZXJ2ZXItY29tbWFuZCB0byBjb250cm9sIGl0cyBiZWhhdmlvciAqYWZ0ZXIqIHRoZQpyZXBseSBpcyBzZW50CjwvcG9zdGNtZD4KPHNlcnZlcmNtZD4KU3BlY2lhbC1jb21tYW5kcyBmb3IgdGhlIHNlcnZlci4KRm9yIEZUUCwgdGhlc2UgYXJlIHN1cHBvcnRlZDoKUkVQTFkKQ09VTlQKREVMQVkKUkVUUldFSVJETwpSRVRSTk9TSVpFCk5PU0FWRQpTTE9XRE9XTgoKRm9yIEhUVFAsIG9uZSBzcGVjaWZpZWQgY29tbWFuZCBpcyBzdXBwb3J0ZWQ6CiAiYXV0aF9yZXF1aXJlZCIgLSBpZiB0aGlzIGlzIHNldCBhbmQgYSBQT1NUL1BVVCBpcyBtYWRlIHdpdGhvdXQgYXV0aCwgdGhlCiBzZXJ2ZXIgd2lsbCBOT1Qgd2FpdCBmb3IgdGhlIGZ1bGwgcmVxdWVzdCBib2R5IHRvIGdldCBzZW50Cjwvc2VydmVyY21kPgo8L3JlcGx5PgoKPGNsaWVudD4KCjxzZXJ2ZXI+CldoYXQgc2VydmVyKHMpIHRoaXMgdGVzdCBjYXNlIHJlcXVpcmVzL3VzZXM6CidodHRwJyAnZnRwJywgJ2h0dHBzJywgJ2Z0cHMnLCAnaHR0cC1pcHY2Jy4gR2l2ZSBvbmx5IG9uZSBwZXIgbGluZS4KPC9zZXJ2ZXI+Cgo8ZmVhdHVyZXM+CkEgbGlzdCBvZiBmZWF0dXJlcyB0aGF0IE1VU1QgYmUgcHJlc2VudCBpbiB0aGUgY2xpZW50L2xpYnJhcnkgZm9yIHRoaXMgdGVzdCB0bwpiZSBhYmxlIHRvIHJ1biAoaWYgdGhlc2UgZmVhdHVyZXMgYXJlIG5vdCBwcmVzZW50LCB0aGUgdGVzdCB3aWxsIGJlClNLSVBQRUQpLiBGZWF0dXJlcyB0ZXN0YWJsZSBoZXJlIGFyZToKClNTTApuZXRyY19kZWJ1ZwpsYXJnZV9maWxlCmlkbgpnZXRybGltaXQKaXB2NgpsaWJ6CjwvZmVhdHVyZXM+Cgo8a2lsbHNlcnZlcj4KVXNpbmcgdGhlIHNhbWUgc3ludGF4IGFzIGluIDxzZXJ2ZXI+IGJ1dCB3aGVuIG1lbnRpb25lZCBoZXJlIHRoZXNlIHNlcnZlcnMKYXJlIGV4cGxpY2l0bHkgS0lMTEVEIHdoZW4gdGhpcyB0ZXN0IGNhc2UgaXMgY29tcGxldGVkLiBPbmx5IHVzZSB0aGlzIGlmIHRoZXJlCmlzIG5vIG90aGVyIGFsdGVybmF0aXZlcy4gVXNpbmcgdGhpcyBvZiBjb3Vyc2UgcmVxdWlyZXMgc3Vic2VxdWVudCB0ZXN0cyB0bwpyZXN0YXJ0IHNlcnZlcnMuCjwva2lsbHNlcnZlcj4KCjxwcmVjaGVjaz4KQSBjb21tYW5kIGxpbmUgdGhhdCBpZiBzZXQgZ2V0cyBydW4gYnkgdGhlIHRlc3Qgc2NyaXB0IGJlZm9yZSB0aGUgdGVzdC4gSWYgYW4Kb3V0cHV0IGlzIGRpc3BsYXllZCBieSB0aGUgY29tbWFuZCBsaW5lLCB0aGUgdGVzdCB3aWxsIGJlIHNraXBwZWQgYW5kIHRoZQooc2luZ2xlLWxpbmUpIG91dHB1dCB3aWxsIGJlIGRpc3BsYXllZCBhcyByZWFzb24gZm9yIG5vdCBydW5uaW5nIHRoZSB0ZXN0Lgo8L3ByZWNoZWNrPgoKPHRvb2w+Ck5hbWUgb2YgdG9vbCB0byB1c2UgaW5zdGVhZCBvZiAiY3VybCIuIFRoaXMgdG9vbCBtdXN0IGJlIGJ1aWx0IGFuZCBleGlzdAppbiB0aGUgbGlidGVzdC8gZGlyZWN0b3J5Lgo8L3Rvb2w+Cgo8bmFtZT4KdGVzdCBjYXNlIGRlc2NyaXB0aW9uCjwvbmFtZT4KCjxzZXRlbnY+CnZhcmlhYmxlMT1jb250ZW50czEKdmFyaWFibGUyPWNvbnRlbnRzMgoKU2V0IHRoZSBnaXZlbiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBiZWZvcmUgdGhlIGFjdHVhbApjb21tYW5kIGlzIHJ1biwgdGhleSBhcmUgY2xlYXJlZCBhZ2FpbiBhZnRlciB0aGUgY29tbWFuZCBoYXMgYmVlbiBydW4uCjwvc2V0ZW52PgoKPGNvbW1hbmQgW29wdGlvbj1uby1vdXRwdXRdPgpjb21tYW5kIGxpbmUgdG8gcnVuLCB0aGVyZSdzIGEgYnVuY2ggb2YgJXZhcmlhYmxlcyB0aGF0IGdldCByZXBsYWNlZAphY2NvcmRpbmdseS4KCk5vdGUgdGhhdCB0aGUgVVJMIHRoYXQgZ2V0cyBwYXNzZWQgdG8gdGhlIHNlcnZlciBhY3R1YWxseSBjb250cm9scyB3aGF0IGRhdGEKdGhhdCBpcyByZXR1cm5lZC4gVGhlIGxhc3Qgc2xhc2ggaW4gdGhlIFVSTCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEgbnVtYmVyLiBUaGF0Cm51bWJlciAoTikgd2lsbCBiZSB1c2VkIGJ5IHRoZSB0ZXN0LXNlcnZlciB0byBsb2FkIHRlc3QgY2FzZSBOIGFuZCByZXR1cm4gdGhlCmRhdGEgdGhhdCBpcyBkZWZpbmVkIHdpdGhpbiB0aGUgPHJlcGx5PjxkYXRhPjwvZGF0YT48L3JlcGx5PiBzZWN0aW9uLgoKSWYgYSBDT05ORUNUIGlzIHVzZWQgdG8gdGhlIHNlcnZlciAodG8gZW11bGF0ZSBIVFRQUyBldGMgb3ZlciBwcm94eSksIHRoZSBwb3J0Cm51bWJlciBnaXZlbiBpbiB0aGUgQ09OTkVDVCByZXF1ZXN0IHdpbGwgYmUgdXNlZCB0byBpZGVudGlmeSB3aGljaCB0ZXN0IHRoYXQKaXMgYmVpbmcgcnVuLCBpZiB0aGUgcHJveHkgaG9zdCBuYW1lIGlzIHNhaWQgdG8gc3RhcnQgd2l0aCAndGVzdCcuCgpTZXQgJ29wdGlvbj1uby1vdXRwdXQnIHRvIHByZXZlbnQgdGhlIHRlc3Qgc2NyaXB0IHRvIHNsYXAgb24gdGhlIC0tb3V0cHV0CmFyZ3VtZW50IHRoYXQgZGlyZWN0cyB0aGUgb3V0cHV0IHRvIGEgZmlsZS4gVGhlIC0tb3V0cHV0IGlzIGFsc28gbm90IGFkZGVkIGlmCnRoZSBjbGllbnQvc3Rkb3V0IHNlY3Rpb24gaXMgdXNlZC4KCkF2YWlsYWJsZSBzdWJzdGl0dXRlIHZhcmlhYmxlcyBpbmNsdWRlOgolSE9TVElQICAgIC0gSVAgYWRkcmVzcyBvZiB0aGUgaG9zdCBydW5uaW5nIHRoaXMgdGVzdAolSE9TVFBPUlQgIC0gUG9ydCBudW1iZXIgb2YgdGhlIEhUVFAgc2VydmVyCiVIVFRQU1BPUlQgLSBQb3J0IG51bWJlciBvZiB0aGUgSFRUUFMgc2VydmVyCiVGVFBQT1JUICAgLSBQb3J0IG51bWJlciBvZiB0aGUgRlRQIHNlcnZlcgolRlRQU1BPUlQgIC0gUG9ydCBudW1iZXIgb2YgdGhlIEZUUFMgc2VydmVyCiVTUkNESVIgICAgLSBGdWxsIHBhdGggdG8gdGhlIHNvdXJjZSBkaXIKJVBXRCAgICAgICAtIEN1cnJlbnQgZGlyZWN0b3J5CjwvY29tbWFuZD4KCjxmaWxlIG5hbWU9ImxvZy9maWxlbmFtZSI+CnRoaXMgY3JlYXRlcyB0aGUgbmFtZWQgZmlsZSB3aXRoIHRoaXMgY29udGVudCBiZWZvcmUgdGhlIHRlc3QgY2FzZSBpcyBydW4Kd2hpY2ggaXMgdXNlZnVsIGlmIHRoZSB0ZXN0IGNhc2UgbmVlZHMgYSBmaWxlIHRvIGFjdCBvbi4KPC9maWxlPgoKPHN0ZGluPgpQYXNzIHRoaXMgZ2l2ZW4gZGF0YSBvbiBzdGRpbiB0byB0aGUgdG9vbC4KPC9zdGRpbj4KCjwvY2xpZW50PgoKPHZlcmlmeT4KPGVycm9yY29kZT4KbnVtZXJpY2FsIGVycm9yIGNvZGUgY3VybCBpcyBzdXBwb3NlZCB0byByZXR1cm4uIFNwZWNpZnkgYSBsaXN0IG9mIGFjY2VwdGVkCmVycm9yIGNvZGVzIGJ5IHNlcGFyYXRpbmcgbXVsdGlwbGUgbnVtYmVycyB3aXRoIGNvbW1hLiBTZWUgdGVzdCAyMzcgZm9yIGFuCmV4YW1wbGUuCjwvZXJyb3Jjb2RlPgo8c3RyaXA+Ck9uZSByZWdleCBwZXIgbGluZSB0aGF0IGlzIHJlbW92ZWQgZnJvbSB0aGUgcHJvdG9jb2wgZHVtcHMgYmVmb3JlIHRoZQpjb21wYXJpc29uIGlzIG1hZGUuIFRoaXMgaXMgdmVyeSB1c2VmdWwgdG8gcmVtb3ZlIGRlcGVuZGVuY2llcyBvbiBkeW5hbWljbHkKY2hhbmdpbmcgcHJvdG9jb2wgZGF0YSBzdWNoIGFzIHBvcnQgbnVtYmVycyBvciB1c2VyLWFnZW50IHN0cmluZ3MuCjwvc3RyaXA+CjxzdHJpcHBhcnQ+Ck9uZSBwZXJsIG9wIHBlciBsaW5lIHRoYXQgb3BlcmF0ZXMgb24gdGhlIHByb3RvY29sIGR1bXAuIFRoaXMgaXMgcHJldHR5CmFkdmFuY2VkLiBFeGFtcGxlOiAicy9eRVBSVCAuKi9FUFJUIHN0cmlwcGVkLyIKPC9zdHJpcHBhcnQ+Cjxwcm90b2NvbCBbbm9uZXdsaW5lPXllc10+CnRoZSBwcm90b2NvbCBkdW1wIGN1cmwgc2hvdWxkIHRyYW5zbWl0LCBpZiAnbm9uZXdsaW5lJyBpcyBzZXQsIHdlIHdpbGwgY3V0Cm9mZiB0aGUgdHJhaWxpbmcgbmV3bGluZSBvZiB0aGlzIGdpdmVuIGRhdGEgYmVmb3JlIGNvbXBhcmluZyB3aXRoIHRoZSBvbmUKYWN0dWFsbHkgc2VudCBieSB0aGUgY2xpZW50CjwvcHJvdG9jb2w+CjxzdGRvdXQ+ClRoaXMgdmVyZmllcyB0aGF0IHRoaXMgZGF0YSB3YXMgcGFzc2VkIHRvIHN0ZG91dC4KPC9zdGRvdXQ+CjxmaWxlIG5hbWU9ImxvZy9maWxlbmFtZSI+CnRoZSBmaWxlJ3MgY29udGVudHMgbXVzdCBiZSBpZGVudGljYWwgdG8gdGhpcwo8L2ZpbGU+CjxzdHJpcGZpbGU+Ck9uZSBwZXJsIG9wIHBlciBsaW5lIHRoYXQgb3BlcmF0ZXMgb24gdGhlIGZpbGUgYmVmb3JlIGJlaW5nIGNvbXBhcmVkLiBUaGlzIGlzCnByZXR0eSBhZHZhbmNlZC4gRXhhbXBsZTogInMvXkVQUlQgLiovRVBSVCBzdHJpcHBlZC8iCjwvc3RyaXBmaWxlPgo8dXBsb2FkPgp0aGUgY29udGVudHMgb2YgdGhlIHVwbG9hZCBkYXRhIGN1cmwgc2hvdWxkIGhhdmUgc2VudAo8L3VwbG9hZD4KPHZhbGdyaW5kPgpkaXNhYmxlIC0gZGlzYWJsZXMgdGhlIHZhbGdyaW5kIGxvZyBjaGVjayBmb3IgdGhpcyB0ZXN0CjwvdmFsZ3JpbmQ+CjwvdmVyaWZ5Pgo=