ICBDaGFuZ2Vsb2cgZm9yIHRoZSBjLWFyZXMgcHJvamVjdAoKVmVyc2lvbiAxLjUuMiAoTWF5IDI5LCAyMDA4KQoKKiBNYXkgMTMgMjAwOCAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBJbnRyb2R1Y2luZyBtaWxsaXNlY29uZCByZXNvbHV0aW9uIHN1cHBvcnQgZm9yIHRoZSB0aW1lb3V0IG9wdGlvbi4gU2VlCiAgYXJlc19pbml0X29wdGlvbnMoKSdzIEFSRVNfT1BUX1RJTUVPVVRNUy4KCiogTWF5IDkgMjAwOCAoWWFuZyBUc2UpCgotIFVzZSBtb25vdG9uaWMgdGltZSBzb3VyY2UgaWYgYXZhaWxhYmxlLCBmb3IgcHJpdmF0ZSBmdW5jdGlvbiBhcmVzX190dm5vdygpCgoqIE1heSA3IDIwMDggKERhbmllbCBTdGVuYmVyZykKCi0gU2ViYXN0aWFuIG1hZGUgYy1hcmVzIGFibGUgdG8gcmV0dXJuIGFsbCBQVFItcmVjb3JkcyB3aGVuIGRvaW5nIHJldmVyc2UKICBsb29rdXBzLiBJdCBpcyBub3QgY29tbW9uIHByYWN0aWNlIHRvIGhhdmUgbXVsdGlwbGUgUFRSLVJlY29yZHMgZm9yIGEgc2luZ2xlCiAgSVAsIGJ1dCBpdHMgcGVyZmVjdGx5IGxlZ2FsIGFuZCBzb21lIHNpdGVzIGhhdmUgdGhvc2UuCgotIERvdWcgR29sZHN0ZWluIHByb3ZpZGVkIGEgY29uZmlndXJlIHBhdGNoOiB1cGRhdGVzIGF1dG9jb25mIDIuMTMgdXNhZ2UgdG8KICBhdXRvY29uZiAyLjU3IHVzYWdlICh3aGljaCBpcyB0aGUgdmVyc2lvbiB5b3UgaGF2ZSBzcGVjaWZpZWQgYXMgdGhlIG1pbmltdW0KICB2ZXJzaW9uKS4gSXQncyBhIG1pbm9yIGNoYW5nZSBidXQgaXQgZG9lcyBjbGVhbiB1cCBzb21lIHdhcm5pbmdzIHdpdGggbmV3ZXIKICBhdXRvY29uZiAoc3BlY2lmaWNhbGx5IDIuNjIpLgoKKiBNYXkgNSAyMDA4IChZYW5nIFRzZSkKCi0gSW1wcm92ZWQgcGFyc2luZyBvZiByZXNvbHZlciBjb25maWd1cmF0aW9uIGZpbGVzLgoKKiBBcHJpbCA0IDIwMDggKERhbmllbCBTdGVuYmVyZykKCi0gRWlubyBUdW9taW5lbiBpbXByb3ZlZCB0aGUgY29kZSB3aGVuIGEgZmlsZSBpcyB1c2VkIHRvIHNlZWQgdGhlIHJhbmRvbWl6ZXIuCgotIEFsZXhleSBTaW1hayBtYWRlIGFkaWcgc3VwcG9ydCBOQVBUUiByZWNvcmRzCgotIEFsZXhleSBTaW1hayBmaXhlZCB0aGUgVkMgZHNwIGZpbGUgYnkgYWRkaW5nIHRoZSBtaXNzaW5nIHNvdXJjZSBmaWxlCiAgYXJlc19leHBhbmRfc3RyaW5nLmMKCiogRGVjZW1iZXIgMTEgMjAwNyAoR2lzbGUgVmFuZW0pCgotIEFkZGVkIGFub3RoZXIgc2FtcGxlIGFwcGxpY2F0aW9uOyBhY291bnRyeS5jIHdoaWNoIGNvbnZlcnRzIGFuCiAgSVB2NC1hZGRyZXNzKGVzKSBhbmQvb3IgaG9zdC1uYW1lKHMpIHRvIGNvdW50cnktbmFtZSBhbmQgY291bnRyeS1jb2RlLgogIFRoaXMgdXNlcyB0aGUgc2VydmljZSBvZiB0aGUgRE5TQkwgYXQgY291bnRyaWVzLm5lcmQuZGsuCgoqIERlY2VtYmVyIDMgMjAwNyAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBCcmFkIFNwZW5jZXIgZml4ZWQgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgdG8gYXNzdW1lIHRoYXQgdGhlcmUncyBubwogIC9kZXYvdXJhbmRvbSB3aGVuIGJ1aWx0IGNyb3NzLWNvbXBpbGVkIGFzIHRoZW4gdGhlIHNjcmlwdCBjYW5ub3QgY2hlY2sgZm9yCiAgaXQuCgotIEVyaWsgS2xpbmUgY2xlYW5lZCB1cCBhcmVzX2dldGhvc3RieWFkZHIuYzpuZXh0X2xvb2t1cCgpIHNvbWV3aGF0CgpWZXJzaW9uIDEuNS4xIChOb3YgMjEsIDIwMDcpCgoqIE5vdmVtYmVyIDIxIDIwMDcgKERhbmllbCBTdGVuYmVyZykKCi0gUm9iaW4gQ29ybmVsaXVzIHBvaW50ZWQgb3V0IHRoYXQgYXJlc19sbGlzdC5oIHdhcyBtaXNzaW5nIGluIHRoZSByZWxlYXNlCiAgYXJjaGl2ZSBmb3IgMS41LjAKClZlcnNpb24gMS41LjAgKE5vdiAyMSwgMjAwNykKCiogT2N0b2JlciAyIDIwMDcgKERhbmllbCBTdGVuYmVyZykKCi0gYXJlc19zdHJlcnJvcigpIHNlZ2ZhdWx0ZWQgaWYgdGhlIGlucHV0IGVycm9yIG51bWJlciB3YXMgb3V0IG9mIHRoZSBjdXJyZW50bHkKICBzdXBwb3J0ZWQgcmFuZ2UuCgotIFlhbmcgVHNlOiBBdm9pZCBhIHNlZ2ZhdWx0IHdoZW4gZ2VuZXJhdGluZyBhIEROUyAiVHJhbnNhY3Rpb24gSUQiIGluCiAgaW50ZXJuYWwgZnVuY3Rpb24gaW5pdF9pZF9rZXkoKSB1bmRlciBsb3cgbWVtb3J5IGNvbmRpdGlvbnMuCgoqIFNlcHRlbWJlciAyOCAyMDA3IChEYW5pZWwgU3RlbmJlcmcpCgotIEJ1bXBlZCB2ZXJzaW9uIHRvIDEuNS4wIGZvciBuZXh0IHJlbGVhc2UgYW5kIHNvbmFtZSBidW1wZWQgdG8gMiBkdWUgdG8gQUJJCiAgYW5kIEFQSSBjaGFuZ2VzIGluIHRoZSBwcm9ncmVzcyBjYWxsYmFjayAoYW5kIHBvc3NpYmx5IG1vcmUgY29taW5nIHVwIGZyb20KICBTdGVpbmFyKQoKKiBTZXB0ZW1iZXIgMjggMjAwNyAoU3RlaW5hciBILiBHdW5kZXJzb24pCgotIERvbid0IHNraXAgYSBzZXJ2ZXIgaWYgaXQncyB0aGUgb25seSBvbmUuIChCdWdmaXggZnJvbSB0aGUgR29vZ2xlIHRyZWUuKQoKLSBNYWRlIHRoZSBxdWVyeSBjYWxsYmFja3MgcmVjZWl2ZSB0aGUgbnVtYmVyIG9mIHRpbWVvdXRzIHRoYXQgaGFwcGVuZWQgZHVyaW5nCiAgdGhlIGV4ZWN1dGlvbiBvZiBhIHF1ZXJ5LCBhbmQgdXBkYXRlZCBkb2N1bWVudGF0aW9uIGFjY29yZGluZ2x5LiAoUGF0Y2ggZnJvbQogIHRoZSBHb29nbGUgdHJlZS4pCgotIFN1cHBvcnQgYSBmZXcgbW9yZSBzb2NrZXQgb3B0aW9uczogQVJFU19PUFRfU09DS19TTkRCVUYgYW5kCiAgQVJFU19PUFRfU09DS19SQ1ZCVUYKCi0gQWx3YXlzIHJlZ2lzdGVyIGZvciBUQ1AgZXZlbnRzIGV2ZW4gaWYgdGhlcmUgYXJlIG5vIG91dHN0YW5kaW5nIHF1ZXJpZXMsIGFzCiAgdGhlIG90aGVyIHNpZGUgY291bGQgYWx3YXlzIGNsb3NlIHRoZSBjb25uZWN0aW9uLCB3aGljaCBpcyBhIHZhbGlkIGV2ZW50CiAgd2hpY2ggc2hvdWxkIGJlIHJlc3BvbmRlZCB0by4KCiogU2VwdGVtYmVyIDIyIDIwMDcgKERhbmllbCBTdGVuYmVyZykKCi0gU3RlaW5hciBILiBHdW5kZXJzb24gZml4ZWQ6IENvcnJlY3RseSBjbGVhciBzb2NrZXRzIGZyb20gdGhlIGZkX3NldCBvbiBpbgogIHNldmVyYWwgZnVuY3Rpb25zICh3cml0ZV90Y3BfZGF0YSwgcmVhZF90Y3BfZGF0YSwgcmVhZF91ZHBfcGFja2V0cykgc28gdGhhdAogIGlmIGl0IGZhaWxzIGFuZCB0aGUgc29ja2V0IGlzIGNsb3NlZCB0aGUgZm9sbG93aW5nIGNvZGUgZG9lc24ndCB0cnkgdG8gdXNlCiAgdGhlIGZpbGUgZGVzY3JpcHRvci4KCi0gU3RlaW5hciBILiBHdW5kZXJzb24gbW9kaWZpZWQgYy1hcmVzIHRvIG5vdyBhbHNvIGRvIHRvIEROUyByZXRyaWVzIGV2ZW4gd2hlbgogIFRDUCBpcyB1c2VkIHNpbmNlIHRoZXJlIGFyZSBzZXZlcmFsIGVkZ2UgY2FzZXMgd2hlcmUgaXQgc3RpbGwgbWFrZXMgc2Vuc2UuCgotIEJyYWQgSG91c2UgcHJvdmlkZWQgYSBmaXggZm9yIGFyZXNfc2F2ZV9vcHRpb25zKCk6CgogIEFwcGFyZW50bHkgSSBvdmVybG9va2VkIHNvbWV0aGluZyB3aXRoIHRoZSBhcmVzX3NhdmVfb3B0aW9ucygpIHdoZXJlIGl0CiAgd291bGQgdHJ5IHRvIGRvIGEgbWFsbG9jKDApIHdoZW4gbm8gb3B0aW9ucyBvZiB0aGF0IHR5cGUgbmVlZGVkIHRvIGJlIHNhdmVkLgogIE9uIG1vc3QgcGxhdGZvcm1zLCB0aGlzIHdhcyBmaW5lIGJlY2F1c2UgbWFsbG9jKDApIGRvZXNuJ3QgYWN0dWFsbHkgcmV0dXJuCiAgTlVMTCwgYnV0IG9uIEFJWCBpdCBkb2VzLCBzbyBhcmVzX3NhdmVfb3B0aW9ucyB3b3VsZCByZXR1cm4gQVJFU19FTk9NRU0uCgoqIEp1bHkgMTQgMjAwNyAoRGFuaWVsIFN0ZW5iZXJnKQoKLSBWbGFkIERpbnVsZXNjdSBmaXhlZCB0d28gb3V0c3RhbmRpbmcgdmFsZ3JpbmQgcmVwb3J0czoKCiAgMS4gSW4gYXJlc19xdWVyeS5jICwgaW4gZmluZF9xdWVyeV9ieV9pZCB3ZSBjb21wYXJlIHEtPnFpZCAod2hpY2ggaXMgYSBzaG9ydAogIGludCB2YXJpYWJsZSkgd2l0aCBxaWQsIHdoaWNoIGlzIGRlY2xhcmVkIGFzIGFuIGludCB2YXJpYWJsZS4gIE1vcmVvdmVyLAogIEROU19IRUFERVJfU0VUX1FJRCBpcyB1c2VkIHRvIHNldCB0aGUgdmFsdWUgb2YgcWlkLCBidXQgRE5TX0hFQURFUl9TRVRfUUlECiAgc2V0cyBvbmx5IHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgcWlkLiBJIHRoaW5rIHRoYXQgcWlkIHNob3VsZCBiZSBkZWNsYXJlZCBhcwogICJ1bnNpZ25lZCBzaG9ydCIgaW4gdGhpcyBmdW5jdGlvbi4KCiAgMi4gVGhlIHNhbWUgcHJvYmxlbSBvY2N1cnMgaW4gYXJlc19wcm9jZXNzLmMsIHByb2Nlc3NfYW5zd2VyKCkgLiAgcXVlcnktPnFpZAogIChhbiB1bnNpZ25lZCBzaG9ydCBpbnRlZ2VyIHZhcmlhYmxlKSBpcyBjb21wYXJlZCB3aXRoIGlkLCB3aGljaCBpcyBhbgogIGludGVnZXIgdmFyaWFibGUuIE1vcmVvdmVyLCBpZCBpcyBpbml0aWFsaXplZCBmcm9tIEROU19IRUFERVJfUUlEIHdoaWNoIHNldHMKICBvbmx5IHRoZSBmaXJzdCB0d28gYnl0ZXMgb2YgaWQuIEkgdGhpbmsgdGhhdCB0aGUgaWQgdmFyaWFibGUgc2hvdWxkIGJlCiAgZGVjbGFyZWQgYXMgInVuc2lnbmVkIHNob3J0IiBpbiB0aGlzIGZ1bmN0aW9uLgoKICBFdmVuIGFmdGVyIGRlY2xhcmluZyB0aGVzZSB2YXJpYWJsZXMgYXMgInVuc2lnbmVkIHNob3J0IiwgdGhlIHZhbGdyaW5kCiAgZXJyb3JzIGFyZSBzdGlsbCB0aGVyZS4gV2hpY2ggYnJpbmdzIHVzIHRvIHRoZSB0aGlyZCBwcm9ibGVtLgoKICAzLiBUaGUgdGhpcmQgcHJvYmxlbSBpcyB0aGF0IFZhbGdyaW5kIGFzc3VtZXMgdGhhdCBxdWVyeS0+cWlkIGlzIG5vdAogIGluaXRpYWxpc2VkIGNvcnJlY3RseS4gQW5kIGl0IGRvZXMgdGhhdCBiZWNhdXNlIHF1ZXJ5LT5xaWQgaXMgc2V0IGZyb20KICBETlNfSEVBREVSX1FJRChxYnVmKTsgVmFsZ3JpbmQgc2F5cyB0aGF0IHFidWYgaGFzIHVuaXRpYWxpc2VkIGJ5dGVzLiBBbmQKICBxYnVmIGhhcyB1bmluaXRpYWxpc2VkIGJ5dGVzIGJlY2F1c2Ugb2YgY2hhbm5lbC0+bmV4dF9pZCAuIEFuZCBuZXh0X2lkIGlzCiAgc2V0IGJ5IGFyZXNfaW5pdC5jOmFyZXNfX2dlbmVyYXRlX25ld19pZCgpIC4gSSBmb3VuZCB0aGF0IHB1dHRpbmcgc2hvcnQgcj0wCiAgaW4gdGhpcyBmdW5jdGlvbiAoaW5zdGVhZCBvZiBzaG9ydCByKSBtYWtlcyBhbGwgVmFsZ3JpbmQgd2FybmluZ3MgZ28gYXdheS4KICBJIGhhdmUgc3R1ZGllZCBhcmVzX19yYzQoKSB0b28sIGFuZCB0aGlzIGlzIHRoZSBvZmZlbmRpbmcgbGluZToKCiAgICAgICAgYnVmZmVyX3B0cltjb3VudGVyXSBePSBzdGF0ZVt4b3JJbmRleF07ICAgKGFyZXNfcXVlcnkuYzo2MikKCiAgVGhpcyBpcyB3aGF0IHRyaWdnZXJzIFZhbGdyaW5kLi4gYnVmZmVyX3B0ciBpcyB1bml0aWFsaXNlZCBpbiB0aGlzIGZ1bmN0aW9uLAogIGFuZCBieSBhcHBseWluZyBePSBvbiBpdCwgaXQgcmVtYWlucyB1bml0aWFsaXNlZC4KClZlcnNpb24gMS40LjAgKEp1bmUgOCwgMjAwNykKCiogSnVuZSA0IDIwMDcgKERhbmllbCBTdGVuYmVyZykKCi0gSmFtZXMgQnVyc2EgcmVwb3J0ZWQgYSBtYWpvciBtZW1vcnkgcHJvYmxlbSB3aGVuIHJlc29sdmluZyBtdWx0aS1JUCBuYW1lcwogIGFuZCBJIGZvdW5kIGFuZCBmaXhlZCB0aGUgcHJvYmxlbS4gSXQgd2FzIGFkZGVkIGJ5IEFzaGlzaCBTaGFybWEncyBwYXRjaAogIHR3byBkYXlzIGFnby4KCiAgV2hlbiBJIHRoZW4gdHJpZWQgdG8gdmVyaWZ5IG11bHRpcGxlIGVudHJpZXMgaW4gL2V0Yy9ob3N0cyBhZnRlciBteSBmaXgsIEkKICBnb3QgYW5vdGhlciBzZWdmYXVsdCBhbmQgZGVjaWRlZCB0aGlzIGNvZGUgd2FzIG5vdCByaXBlIGZvciBpbmNsdXNpb24gYW5kIEkKICByZXZlcnRlZCB0aGUgcGF0Y2guCgoqIEp1bmUgMiAyMDA3CgotIEJyYWQgU3BlbmNlciBmb3VuZCBhbmQgZml4ZWQgdGhyZWUgZmxhd3MgaW4gdGhlIGNvZGUsIGZvdW5kIHdpdGggdGhlIG5ldwogIGdjYyA0LjIuMCB3YXJuaW5nOiAtV2FkZHJlc3MKCi0gQnJhZCBIb3VzZSBmaXhlZCBWUzIwMDUgY29tcGlsZXIgd2FybmluZ3MgZHVlIHRvIHRpbWVfdCBiZWluZyA2NGJpdC4KICBIZSBhbHNvIG1hZGUgcmVjZW50IE1pY3Jvc29mdCBjb21waWxlcnMgdXNlIF9zdHJkdXAoKSBpbnN0ZWFkIG9mIHN0cmR1cCgpLgoKLSBCcmFkIEhvdXNlJ3MgbWFuIHBhZ2VzIGZvciBhcmVzX3NhdmVfb3B0aW9ucygpIGFuZCBhcmVzX2Rlc3Ryb3lfb3B0aW9ucygpCiAgd2VyZSBhZGRlZC4KCi0gQXNoaXNoIFNoYXJtYSBwcm92aWRlZCBhIHBhdGNoIGZvciBzdXBwb3J0aW5nIG11bHRpcGxlIGVudHJpZXMgaW4gdGhlCiAgL2V0Yy9ob3N0cyBmaWxlLiBQYXRjaCBlZGl0ZWQgZm9yIGNvZGluZyBzdHlsZSBhbmQgZnVuY3Rpb25hbGl0eSBieSBtZQogIChEYW5pZWwpLgoKKiBNYXkgMzAgMjAwNwoKLSBTaG11bGlrIFJlZ2V2IGJyb3VnaHQgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlIHRyYW5zYWN0aW9uIElEczoKCiAgVGhlIGMtYXJlcyBsaWJyYXJ5IGltcGxlbWVudGF0aW9uIHVzZXMgYSBETlMgIlRyYW5zYWN0aW9uIElEIiBmaWVsZCB0aGF0IGlzCiAgc2VlZGVkIHdpdGggYSBwc2V1ZG8gcmFuZG9tIG51bWJlciAoYmFzZWQgb24gZ2V0dGltZW9mZGF5KSB3aGljaCBpcwogIGluY3JlbWVudGVkICgrKykgYmV0d2VlbiBjb25zZWN1dGl2ZSBjYWxscyBhbmQgaXMgdGhlcmVmb3JlIHJhdGhlcgogIHByZWRpY3RhYmxlLiBJbiBnZW5lcmFsLCBwcmVkaWN0YWJpbGl0eSBvZiBETlMgVHJhbnNhY3Rpb24gSUQgaXMgYSB3ZWxsCiAga25vd24gc2VjdXJpdHkgcHJvYmxlbSAoZS5nLgogIGh0dHA6Ly9iYWsuc3BjLm9yZy9kbXMvYXJjaGl2ZS9kbnNfaWRfYXR0YWNrLnR4dCkgYW5kIG1ha2VzIGEgYy1hcmVzIGJhc2VkCiAgaW1wbGVtZW50YXRpb24gdnVsbmVyYWJsZSB0byBETlMgcG9pc29uaW5nLiBDcmVkaXQgZ29lcyB0byBBbWl0IEtsZWluCiAgKFRydXN0ZWVyKSBmb3IgaWRlbnRpZnlpbmcgdGhpcyBwcm9ibGVtLgoKICBUaGUgcGF0Y2ggSSB3cm90ZSBjaGFuZ2VzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB1c2UgYSBtb3JlIHNlY3VyZSB3YXkgb2YKICBnZW5lcmF0aW5nIHVuaXF1ZSBJRHMuIEl0IHN0YXJ0cyBieSBvYnRhaW5pbmcgYSBrZXkgd2l0aCByZWFzb25hYmxlIGVudHJvcHkKICB3aGljaCBpcyB1c2VkIHdpdGggYW4gUkM0IHN0cmVhbSB0byBnZW5lcmF0ZSB0aGUgY3J5cHRvZ3JhcGhpY2FsbHkgc2VjdXJlCiAgdHJhbnNhY3Rpb24gSURzLgoKICBOb3RlIHRoYXQgdGhlIGtleSBnZW5lcmF0aW9uIGNvZGUgKGluIGFyZXNfaW5pdDpyYW5kb21pemVfa2V5KSBoYXMgdHdvCiAgdmVyc2lvbnMsIHRoZSBXaW5kb3dzIHNwZWNpZmljIG9uZSB1c2VzIGEgY3J5cHRvZ3JhcGhpY2FsbHkgc2FmZSBmdW5jdGlvbgogIHByb3ZpZGVkIChidXQgdW5kb2N1bWVudGVkIDopIGJ5IHRoZSBvcGVyYXRpbmcgc3lzdGVtIChkZXNjcmliZWQgYXQKICBodHRwOi8vYmxvZ3MubXNkbi5jb20vbWljaGFlbF9ob3dhcmQvYXJjaGl2ZS8yMDA1LzAxLzE0LzM1MzM3OS5hc3B4KS4gIFRoZQogIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgYSBiaXQgbmFpdmUgYW5kIHVzZXMgdGhlIHN0YW5kYXJkICdyYW5kJwogIGZ1bmN0aW9uLiBTdXJlbHkgYSBiZXR0ZXIgd2F5IHRvIGdlbmVyYXRlIHJhbmRvbSBrZXlzIGV4aXN0cyBmb3Igb3RoZXIKICBwbGF0Zm9ybXMuCgogIFRoZSBwYXRjaCBjYW4gYmUgdGVzdGVkIGJ5IHVzaW5nIHRoZSBhZGlnIHV0aWxpdHkgYW5kIHVzaW5nIHRoZSAnLXMnIG9wdGlvbi4KCi0gQnJhZCBIb3VzZSBhZGRlZCBhcmVzX3NhdmVfb3B0aW9ucygpIGFuZCBhcmVzX2Rlc3Ryb3lfb3B0aW9ucygpIHRoYXQgY2FuIGJlCiAgdXNlZCB0byBrZWVwIG9wdGlvbnMgZm9yIGxhdGVyIHJlLXVzYWwgd2hlbiBhcmVzX2luaXRfb3B0aW9ucygpIGlzIHVzZWQuCgogIFByb2JsZW06IENhbGxpbmcgYXJlc19pbml0KCkgZm9yIGVhY2ggbG9va3VwIGNhbiBiZSB1bm5lY2Vzc2FyaWx5IHJlc291cmNlCiAgICAgICAgIGludGVuc2l2ZS4gIE9uIHdpbmRvd3MsIGl0IG11c3QgTG9hZExpYnJhcnkoKSBvciBzZWFyY2ggdGhlIHJlZ2lzdHJ5CiAgICAgICAgIG9uIGVhY2ggY2FsbCB0byBhcmVzX2luaXQoKS4gIE9uIHVuaXgsIGl0IG11c3QgcmVhZCBhbmQgcGFyc2UKICAgICAgICAgbXVsdGlwbGUgZmlsZXMgdG8gb2J0YWluIHRoZSBuZWNlc3NhcnkgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gIEluCiAgICAgICAgIGEgc2luZ2xlLXRocmVhZGVkIGVudmlyb25tZW50LCBpdCB3b3VsZCBtYWtlIHNlbnNlIHRvIG9ubHkKICAgICAgICAgYXJlc19pbml0KCkgb25jZSwgYnV0IGluIGEgaGVhdmlseSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudCwgaXQgaXMKICAgICAgICAgdW5kZXNpcmFibGUgdG8gYXJlc19pbml0KCkgYW5kIGFyZXNfZGVzdHJveSgpIGZvciBlYWNoIHRocmVhZCBjcmVhdGVkCiAgICAgICAgIGFuZCB0cmFjayB0aGF0LgoKICBTb2x1dGlvbjogQ3JlYXRlIGFyZXNfc2F2ZV9vcHRpb25zKCkgYW5kIGFyZXNfZGVzdHJveV9vcHRpb25zKCkgZnVuY3Rpb25zIHRvCiAgICAgICAgIHJldHJpZXZlIGFuZCBmcmVlIG9wdGlvbnMgb2J0YWluZWQgZnJvbSBhbiBpbml0aWFsaXplZCBjaGFubmVsLiAgVGhlCiAgICAgICAgIG9wdGlvbnMgcG9wdWxhdGVkIGNhbiBiZSB1c2VkIHRvIHBhc3MgYmFjayBpbnRvIGFyZXNfaW5pdF9vcHRpb25zKCksCiAgICAgICAgIGl0IHNob3VsZCBwb3B1bGF0ZSBhbGwgbmVlZGVkIGZpZWxkcyBhbmQgbm90IHJldHJpZXZlIGFueSBpbmZvcm1hdGlvbgogICAgICAgICBmcm9tIHRoZSBzeXN0ZW0uICBQcm9iYWJseSB3aXNlIHRvIGRlc3Ryb3kgdGhlIGNhY2hlIGV2ZXJ5IG1pbnV0ZSBvcgogICAgICAgICBzbyB0byBwcmV2ZW50IHRoZSBkYXRhIGZyb20gYmVjb21pbmcgc3RhbGUuCgotIERhbmllbCBTIGFkZGVkIGFyZXNfcHJvY2Vzc19mZCgpIHRvIGFsbG93IGFwcGxpY2F0aW9ucyB0byBhc2sgZm9yIHByb2Nlc3NpbmcKICBvbiBzcGVjaWZpYyBzb2NrZXRzIGFuZCB0aHVzIGF2b2lkaW5nIHNlbGVjdCgpIGFuZCBhc3NvY2lhdGVkCiAgZnVuY3Rpb25zL21hY3Jvcy4gIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIGJ5IHVwY29taW5nIGxpYmN1cmwgcmVsZWFzZXMKICBmb3IgdGhpcyB2ZXJ5IHJlYXNvbi4gSXQgYWxzbyBtYWRlIG1lIGV4cG9ydCB0aGUgYXJlc19zb2NrZXRfdCB0eXBlIGluIHRoZQogIHB1YmxpYyBhcmVzLmggaGVhZGVyIGZpbGUsIHNpbmNlIGFyZXNfcHJvY2Vzc19mZCgpIHVzZXMgdGhhdCB0eXBlIGZvciB0d28gb2YKICB0aGUgYXJndW1lbnRzLgoKKiBNYXkgMjUgMjAwNwoKLSBSYXZpIFByYXRhcCBmaXhlZCBhIGZsYXcgaW4gdGhlIGluaXRfYnlfcmVzb2x2X2NvbmYoKSBmdW5jdGlvbiBmb3Igd2luZG93cwogIHRoYXQgY291bGQgY2F1c2UgaXQgdG8gcmV0dXJuIGEgYmFkIHJldHVybiBjb2RlLgoKKiBBcHJpbCAxNiAyMDA3CgotIFlhbmcgVHNlOiBQcm92aWRlIGFyZXNfZ2V0b3B0KCkgY29tbWFuZC1saW5lIHBhcnNlciBmdW5jdGlvbiBhcyBhIHNvdXJjZQogIGNvZGUgaGVscGVyIGZ1bmN0aW9uLCBub3QgYmVsb25naW5nIHRvIHRoZSBhY3R1YWwgYy1hcmVzIGxpYnJhcnkuCgoqIEZlYnJ1YXJ5IDE5IDIwMDcKCi0gVmxhZCBEaW51bGVzY3UgYWRkZWQgYXJlc19wYXJzZV9uc19yZXBseSgpLgoKKiBGZWJydWFyeSAxMyAyMDA3CgotIFlhbmcgVHNlOiBGaXggZmFpbHVyZSB0byBnZXQgdGhlIHNlYXJjaCBzZXF1ZW5jZSBvZiAvZXRjL2hvc3RzIGFuZAogIEROUyBmcm9tIC9ldGMvbnNzd2l0Y2guY29uZiwgL2V0Yy9ob3N0LmNvbmYgb3IgL2V0Yy9zdmMuY29uZiB3aGVuCiAgL2V0Yy9yZXNvbHYuY29uZiBkaWQgbm90IGV4aXN0IG9yIHdhcyB1bmFibGUgdG8gcmVhZCBpdC4KCiogTm92ZW1iZXIgMjIgMjAwNgoKLSBJbnN0YWxsIGFyZXNfZG5zLmggdG9vCgotIE1pY2hhZWwgV2FsbG5lciBmaXhlZCB0aGlzIHByb2JsZW06IFdoZW4gSSBzZXQgZG9tYWlucyBpbiB0aGUgb3B0aW9ucwogIHN0cnVjdCwgYW5kIHRoZXJlIGFyZSBkb21haW4vc2VhcmNoIGVudHJpZXMgaW4gL2V0Yy9yZXNvbHYuY29uZiwgdGhlIGRvbWFpbnMKICBvZiB0aGUgb3B0aW9ucyBzdHJ1Y3Qgd2lsbCBiZSBvdmVycmlkZGVuLgoKKiBOb3ZlbWJlciA2IDIwMDYKCi0gWWFuZyBUc2UgcmVtb3ZlZCBhIGNvdXBsZSBvZiBwb3RlbnRpYWwgemVybyBzaXplIG1lbW9yeSBhbGxvY2F0aW9ucy4KCi0gQW5kcmVhcyBSaWVrZSBmaXhlZCB0aGUgbGluZSBlbmRpbmdzIGluIHRoZSBhcmVzbGliLmRzcCBmaWxlIHRoYXQgSSAoRGFuaWVsKQogIGJyb2tlIGluIHRoZSAxLjMuMiByZWxlYXNlLiBXZSBzaG91bGQgc3dpdGNoIHRvIGEgc3lzdGVtIHdoZXJlIHRoYXQgZmlsZSBpcwogIGF1dG8tZ2VuZXJhdGVkLiBXZSBjb3VsZCByaXAgc29tZSBjb2RlIGZvciB0aGF0IGZyb20gY3VybC4uLgoKVmVyc2lvbiAxLjMuMiAoTm92ZW1iZXIgMywgMjAwNikKCiogT2N0b2JlciAxMiAyMDA2CgotIFByZXZlbnQgYXJlc19nZXRzb2NrKCkgdG8gb3ZlcmZsb3cgaWYgbW9yZSB0aGFuIDE2IHNvY2tldHMgYXJlIHVzZWQuCgoqIFNlcHRlbWJlciAxMSAyMDA2CgotIEd1aWxoZXJtZSBCYWxlbmEgVmVyc2lhbmk6IEkgbm90ZWQgYSBzdHJhbmdlIEJVRyBpbiBXaW4zMiBwb3J0CiAgKGFyZXNfaW5pdC5jL2dldF9pcGhscGFwaV9kbnNfaW5mbygpIGZ1bmN0aW9uKTogd2hlbiBJIGRpc2FibGUgdGhlIG5ldHdvcmsKICBieSBoYW5kIG9yIGRpc2Nvbm5lY3QgdGhlIG5ldHdvcmsgY2FibGUgaW4gV2luZG93cyAyMDAwIG9yIFdpbmRvd3MgWFAsIG15CiAgYXBwbGljYXRpb24gZ2V0cyAxMjcuMC4wLjEgYXMgdGhlIG9ubHkgbmFtZSBzZXJ2ZXIuIFRoZSBwcm9ibGVtIGNvbWVzIGZyb20KICAnR2V0TmV0d29ya1BhcmFtcycgZnVuY3Rpb24sIHRoYXQgcmV0dXJucyB0aGUgZW1wdHkgc3RyaW5nICIiIGFzIHRoZSBvbmx5CiAgbmFtZSBzZXJ2ZXIgaW4gdGhhdCBjYXNlLiBNb3Jlb3ZlciwgdGhlIFdpbmRvd3MgaW1wbGVtZW50YXRpb24gb2YKICBpbmV0X2FkZHIoKSByZXR1cm5zIElOQUREUl9MT09QQkFDSyBpbnN0ZWFkIG9mIElOQUREUl9OT05FLgoKKiBBdWd1c3QgMjkgMjAwNgoKLSBCcmFkIFNwZW5jZXIgZGlkCgogIG8gbWFkZSBhcmVzX3ZlcnNpb24uaCB1c2UgZXh0ZXJuICJDIiBmb3IgYysrIGNvbXBpbGVycwogIG8gZml4ZWQgY29tcGlsZXIgd2FybmluZ3MgaW4gYXJlc19nZXRuYW1laW5mby5jCiAgbyBmaXhlZCBhIGJ1ZmZlciBwb3NpdGlvbiBpbml0IGZvciBUQ1AgcmVhZHMKCiogQXVndXN0IDMgMjAwNgoKLSBSYXZpIFByYXRhcCBmaXhlZCBhcmVzX2dldHNvY2soKSB0byBhY3R1YWxseSByZXR1cm4gdGhlIHByb3BlciBiaXRtYXAgYW5kCiAgbm90IGFsd2F5cyB6ZXJvIQoKVmVyc2lvbiAxLjMuMSAoSnVuZSAyNCwgMjAwNikKCiogSnVseSAyMywgMjAwNgoKLSBHaXNsZSBWYW5lbSBhZGRlZCBnZXRvcHQoKSB0byB0aGUgYWhvc3QgcHJvZ3JhbS4gQ3VycmVudGx5IGFjY2VwdHMKICBvbmx5IFstdCB7YXxhYWFhfV0gdG8gc3BlY2lmeSBhZGRyZXNzIGZhbWlseSBpbiBhcmVzX2dldGhvc3RieW5hbWUoKS4KCiogSnVuZSAxOSwgMjAwNgoKLSAod2FoZXJuKSBSZW1vdmVkICJiaWcgZW5kaWFuIiBETlMgc2VjdGlvbiBhbmQgUlIgZGF0YSBpbnRlZ2VyIHBhcnNlcgogIG1hY3JvcyBmcm9tIGFyZXNfZG5zLmgsIHdoaWNoIGJyZWFrIGMtYXJlcyBvbiBteSBTcGFyYzY0LiBCaXQtd2lzZQogIG9wZXJhdGlvbnMgaW4gQyBvcGVyYXRlIG9uIGxvZ2ljYWwgdmFsdWVzLiBBbmQgaW4gYW55IGV2ZW50IHRoZSBvY3RldHMgYXJlCiAgYWxyZWFkeSBpbiBiaWctZW5kaWFuIChha2EgbmV0d29yaykgYnl0ZSBvcmRlciBzbyB0aGV5J3JlIGJlaW5nIHJldmVyc2VkCiAgKHRodXMgdGhlIHNvdXJjZSBvZiB0aGUgYnJlYWthZ2UpLgoKKiBKdW5lIDE4LCAyMDA2CgotIFdpbGxpYW0gQWhlcm4gaGFuZGxlcyBFQUdBSU4vRVdPVUxEQkxPQ0sgZXJyb3JzIGluIG1vc3Qgb2YgdGhlIEkvTyBjYWxscwogIGZyb20gYXJlYV9wcm9jZXNzLmMuCgogIFRPRE86IEhhbmRsZSBvbmUgbGFzdCBFQUdBSU4gZm9yIGEgVURQIHNvY2tldCBzZW5kKDIpIGluCiAgYXJlc19fc2VuZF9xdWVyeSgpLgoKKiBNYXkgMTAsIDIwMDYKCi0gQnJhbSBNYXR0aHlzIGJyb3VnaHQgbXkgYXR0ZW50aW9uIHRvIGEgbGlidG9vbCBwZWN1bGlhcml0eSB3aGVyZSBkZXRlY3RpbmcKICB0aGluZ3Mgc3VjaCBhcyBDKysgY29tcGlsZXIgYWN0dWFsbHkgaXMgYSBiYWQgdGhpbmcgYW5kIHNpbmNlIHdlIGRvbid0IG5lZWQKICB0aGF0IGRldGVjdGlvbiBJIGFkZGVkIGEgd29yay1hcm91bmQsIG11Y2ggaW5zcGlyZWQgYnkgYSBwcmV2aW91cyBwYXRjaCBieQogIFBhb2xvIEJvbnppbmkuIFRoaXMgYWxzbyBzaG9ydGVucyB0aGUgY29uZmlndXJlIHNjcmlwdCBxdWl0ZSBhIGxvdC4KCiogTWF5IDMsIDIwMDYKCi0gTmljayBNYXRoZXdzb24gYWRkZWQgdGhlIEFSRVNfT1BUX1NPQ0tfU1RBVEVfQ0Igb3B0aW9uIHRoYXQgd2hlbiBzZXQgbWFrZXMKICBjLWFyZXMgY2FsbCBhIGNhbGxiYWNrIG9uIHNvY2tldCBzdGF0ZSBjaGFuZ2VzLiBBIGJldHRlciB3YXkgdGhhbiB0aGUKICBhcmVzX2dldHNvY2soKSB0byBnZXQgZnVsbCBjb250cm9sIG92ZXIgdGhlIHNvY2tldCBzdGF0ZS4KCiogSmFudWFyeSA5LCAyMDA2CgotIEFsZXhhbmRlciBMYXppYyBpbXByb3ZlZCB0aGUgZ2V0c2VydmJ5cG9ydF9yKCkgY29uZmlndXJlIGNoZWNrLgoKKiBKYW51YXJ5IDYsIDIwMDYKCi0gQWxleGFuZGVyIExhemljIHBvaW50ZWQgb3V0IHRoYXQgdGhlIGJ1aWxkY29uZiBzaG91bGQgdXNlIHRoZSBBQ0xPQ0FMX0ZMQUdTCiAgdmFyaWFibGUgZm9yIGVhc2llciBjb250cm9sbGluZyB3aGF0IGl0IGRvZXMgYW5kIGhvdyBpdCBydW5zLgoKKiBKYW51YXJ5IDUsIDIwMDYKCi0gSmFtZXMgQnVyc2EgZml4ZWQgYy1hcmVzIHRvIGZpbmQgdGhlIGhvc3RzIGZpbGUgb24gUklTQyBPUywgYW5kIG1hZGUgaXQKICBidWlsZCB3aXRoIG5ld2VyIGdjYyB2ZXJzaW9ucyB0aGF0IG5vIGxvbmdlciBkZWZpbmVzICJyaXNjb3MiLgoKKiBEZWNlbWJlciAyMgoKLSBEYW5pZWwgU3RlbmJlcmcgYWRkZWQgYXJlc19nZXRzb2NrKCkgdGhhdCBleHRyYWN0cyB0aGUgc2V0IG9mIHNvY2tldHMgdG8KICB3YWl0IGZvciBhY3Rpb24gb24uIFNpbWlsYXIgdG8gYXJlc19mZHMoKSBidXQgbm90IHJlc3RyaWN0ZWQgdG8gdXNpbmcKICBzZWxlY3QoKSBmb3IgdGhlIHdhaXRpbmcuCgoqIE5vdmVtYmVyIDI1CgotIFlhbmcgVHNlIGZpeGVkIHNvbWUgc2VuZCgpIC8gcmVjdigpIGNvbXBpbGVyIHdhcm5pbmdzCgoqIFNlcHRlbWJlciAxOAoKLSBBZGRlZCBjb25zdGFudHMgdGhhdCB3aWxsIGJlIHVzZWQgYnkgYXJlc19nZXRhZGRyaW5mbwoKLSBNYWRlIGFyZXNfZ2V0bmFtZWluZm8gdXNlIHRoZSByZWVudHJhbnQgZ2V0c2VydmJ5cG9ydCAoZ2V0c2VydmJ5cG9ydF9yKSBpZiBpdAogIGlzIGF2YWlsYWJsZSB0byBlbnN1cmUgaXQgd29ya3MgcHJvcGVybHkgaW4gYSB0aHJlYWRlZCBlbnZpcm9ubWVudC4KCiogU2VwdGVtYmVyIDEwCgotIGNvbmZpZ3VyZSBmaXggZm9yIGRldGVjdGluZyBhIG1lbWJlciBpbiB0aGUgc29ja2FkZHJfaW42IHN0cnVjdCB3aGljaCBmYWlsZWQKICBvbiBpcHY2LWVuYWJsZWQgSFAtVVggMTEuMDAKClZlcnNpb24gMS4zLjAgKEF1Z3VzdCAyOSwgMjAwNSkKCiogQXVndXN0IDIxCgotIEFsZnJlZG8gVHVwb25lIHByb3ZpZGVkIGEgZml4IGZvciB0aGUgV2luZG93cyBjb2RlIGluIGdldF9pcGhscGFwaV9kbnNfaW5mbygpCiAgd2hlbiBnZXR0aW5nIHRoZSBETlMgc2VydmVyIGV0Yy4KCiogSnVuZSAxOQoKLSBBZGRlZCBzb21lIGNoZWNrcyBmb3IgdGhlIGFkZHJpbmZvIHN0cnVjdHVyZS4KCiogSnVuZSAyCgotIFdpbGxpYW0gQWhlcm46CgogIE1ha2UgVURQIHNvY2tldHMgbm9uLWJsb2NraW5nLiBJJ3ZlIGNvbmZpcm1lZCB0aGF0IGF0IGxlYXN0IG9uIExpbnV4IDIuNCBhCiAgcmVhZCBldmVudCBjYW4gY29tZSBiYWNrIGZyb20gcG9sbCgpIG9uIGEgdmFsaWQgU09DS19ER1JBTSBzb2NrZXQgYnV0CiAgcmVjdigyKSB3aWxsIHN0aWxsIGJsb2NrLiBUaGlzIHBhdGNoIGRvZXNuJ3QgaWdub3JlIEVBR0FJTiBpbgogIHJlYWRfdWRwX3BhY2tldHMoKSwgdGhvdWdoIG1heWJlIGl0IHNob3VsZC4gKFRoaXMgcGF0Y2ggd2FzIGVkaXRlZCBieSBEYW5pZWwKICBTdGVuYmVyZyBhbmQgYSBuZXcgY29uZmlndXJlIHRlc3Qgd2FzIGFkZGVkIChpbXBvcnRlZCBmcm9tIGN1cmwncyBjb25maWd1cmUpCiAgdG8gcHJvcGVybHkgZGV0ZWN0IHdoYXQgbm9uLWJsb2NraW5nIHNvY2tldCBhcHByb2FjaCB0byB1c2UuKQoKICBJJ20gbm90IHF1aXRlIHN1cmUgaG93IHRoaXMgd2FzIGhhcHBlbmluZywgYnV0IEkndmUgYmVlbiBzZWVpbmcgUFRSIHF1ZXJpZXMKICB3aGljaCBzZWVtIHRvIHJldHVybiBlbXB0eSByZXNwb25zZXMuIEF0IGxlYXN0LCB0aGV5IHdlcmUgZW1wdHkgd2hlbiBjYWxsaW5nCiAgYXJlc19leHBhbmRfbmFtZSgpIG9uIHRoZSByZWNvcmQuIEhlcmUncyBhIHBhdGNoIHdoaWNoIGd1YXJhbnRlZXMgdG8KICBOVUwtdGVybWluYXRlIHRoZSBleHBhbmRlZCBuYW1lLiBUaGUgb2xkIGJlaGF2aW9yIGZhaWxlZCB0byBOVUwtdGVybWluYXRlIGlmCiAgbGVuIHdhcyAwLCBhbmQgdGhpcyB3YXMgY2F1c2luZyBzdHJsZW4oKSB0byBydW4gcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIKICBhZnRlciBjYWxsaW5nIGFyZXNfZXhwYW5kX25hbWUoKSBhbmQgZ2V0dGluZyBBUkVTX1NVQ0NFU1MgYXMgdGhlIHJldHVybgogIHZhbHVlLiBJZiBxIGlzIG5vdCBncmVhdGVyIHRoYW4gKnMgdGhlbiBpdCdzIGVxdWFsIGFuZCAqcyBpcyBhbHdheXMKICBhbGxvY2F0ZWQgd2l0aCBhdCBsZWFzdCBvbmUgYnl0ZS4KCiogTWF5IDE2CgotIEFkZGVkIGFyZXNfZ2V0bmFtZWluZm8gd2hpY2ggbWltaWNzIHRoZSBnZXRuYW1laW5mbyBBUEkgKGFub3RoZXIgZmVhdHVyZQogIHRoYXQgY291bGQgdXNlIHRlc3RpbmcpLgoKKiBNYXkgMTQKCi0gQWRkZWQgYW4gaW5ldF9udG9wIGZ1bmN0aW9uIGZyb20gQklORCBmb3Igc3lzdGVtcyB0aGF0IGRvIG5vdCBoYXZlIGl0LgoKKiBBcHJpbCA5CgotIE1hZGUgc29ydGxpc3Qgc3VwcG9ydCBJUHY2ICh0aGlzIGNhbiBwcm9iYWJseSB1c2Ugc29tZSB0ZXN0aW5nKS4KCi0gTWFkZSBzb3J0bGlzdCBzdXBwb3J0IENJRFIgbWF0Y2hpbmcgZm9yIElQdjQuCgoqIEFwcmlsIDgKCi0gQWRkZWQgcHJlbGltaW5hcnkgSVB2NiBzdXBwb3J0IHRvIGFyZXNfZ2V0aG9zdGJ5bmFtZS4gQ3VycmVudGx5LCBzb3J0bGlzdAogIGRvZXMgbm90IHdvcmsgd2l0aCBJUHY2LiBBbHNvIHByb3ZpZGVkIGFuIGltcGxlbWVudGF0aW9uIG9mIGJpdG5jbXAgZnJvbQogIEJJTkQgZm9yIHN5c3RlbXMgdGhhdCBkbyBub3Qgc3VwcGx5IHRoaXMgZnVuY3Rpb24uIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGFkZAogIElQdjYgc3VwcG9ydCB0byBzb3J0bGlzdC4KCi0gTWFkZSBhcmVzX2dldGhvc3RieWFkZHIgc3VwcG9ydCBJUHY2IGJ5IHNwZWNpZnlpbmcgQUZfSU5FVDYgYXMgdGhlIGZhbWlseS4KICBUaGUgZnVuY3Rpb24gY2FuIGxvb2t1cCBJUHY2IGFkZHJlc3NlcyBib3RoIGZyb20gZmlsZXMgKC9ldGMvaG9zdHMpIGFuZAogIEROUyBsb29rdXBzLgoKKiBBcHJpbCA3CgotIFR1cG9uZSBBbGZyZWRvIGZpeGVkIGluY2x1ZGVzIG9mIGFycGEvbmFtZXNlcl9jb21wYXQuaCB0byBidWlsZCBmaW5lIG9uIE1hYwogIE9TIFguCgoqIEFwcmlsIDUKCi0gRG9taW5pY2sgTWVnbGlvOiBQcm92aWRlZCBpbXBsZW1lbnRhdGlvbnMgb2YgaW5ldF9uZXRfcHRvbiBhbmQgaW5ldF9wdG9uCiAgZnJvbSBCSU5EIGZvciBzeXN0ZW1zIHRoYXQgZG8gbm90IGluY2x1ZGUgdGhlc2UgZnVuY3Rpb25zLgoKKiBNYXJjaCAxMSwgMjAwNQoKLSBEb21pbmljayBNZWdsaW8gYWRkZWQgYXJlc19wYXJzZV9hYWFhX3JlcGx5LmMgYW5kIGRpZCB2YXJpb3VzCiAgYWRqdXN0bWVudHMuIFRoZSBmaXJzdCBsaXR0bGUgc3RlcHMgdG93YXJkcyBJUHY2IHN1cHBvcnQhCgoqIE5vdmVtYmVyIDcKCi0gRml4ZWQgdGhlIFZDIHByb2plY3QgYW5kIG1ha2VmaWxlIHRvIHVzZSBhcmVzX2NhbmNlbCBhbmQgYXJlc192ZXJzaW9uCgoqIE9jdG9iZXIgMjQKCi0gVGhlIHJlbGVhc2VkIGFyZXNfdmVyc2lvbi5oIGZyb20gMS4yLjEgc2F5cyAxLjIuMCBkdWUgdG8gYSBtYWtldGd6IGZsYXcuCiAgVGhpcyBpcyBub3cgZml4ZWQuCgpWZXJzaW9uIDEuMi4xIChPY3RvYmVyIDIwLCAyMDA0KQoKKiBTZXB0ZW1iZXIgMjkKCi0gSGVucmlrIFN0b2VybmVyIGZpeDogZ290IGEgcmVwb3J0IHRoYXQgVHJ1NjQgVW5peCAodGhlIHVuaXggZnJvbSBEaWdpdGFsCiAgd2hlbiB0aGV5IG1hZGUgQWxwaGEncykgdXNlcyAvZXRjL3N2Yy5jb25mIGZvciB0aGUgcHVycG9zZSBmaXhlZCBiZWxvdyBmb3IKICBvdGhlciBPU2VzLiBIZSBtYWRlIGMtYXJlcyBjaGVjayBmb3IgYW5kIHVuZGVyc3RhbmQgaXQgaWYgcHJlc2VudC4KCi0gTm93IGMtYXJlcyB3aWxsIHVzZSBsb2NhbCBob3N0IG5hbWUgbG9va3VwIF9iZWZvcmVfIEROUyByZXNvbHZpbmcgYnkgZGVmYXVsdAogIGlmIG5vdGhpbmcgZWxzZSBpcyB0b2xkLgoKKiBTZXB0ZW1iZXIgMjYKCi0gSGVucmlrIFN0b2VybmVyOiBmb3VuZCBvdXQgdGhhdCBjLWFyZXMgZG9lcyBub3QgbG9vayBhdCB0aGUgL2V0Yy9ob3N0LmNvbmYKICBmaWxlIHRvIGRldGVybWluZSB0aGUgc2VxdWVuY2UgaW4gd2hpY2ggdG8gc2VhcmNoIC9ldGMvaG9zdHMgYW5kIEROUy4gIFNvIG9uCiAgc3lzdGVtcyB3aGVyZSB0aGlzIG9yZGVyIGlzIGRlZmluZWQgYnkgL2V0Yy9ob3N0LmNvbmYgaW5zdGVhZCBvZiBhICJsb29rdXAiCiAgZW50cnkgaW4gL2V0Yy9yZXNvbHYuY29uZiwgYy1hcmVzIHdpbGwgYWx3YXlzIGRlZmF1bHQgdG8gbG9va2luZyBpbiBETlMKICBmaXJzdCwgYW5kIC9ldGMvaG9zdHMgc2Vjb25kLgoKICBjLWFyZXMgbm93IGxvb2tzIGF0CgogIDEpIHJlc29sdi5jb25mIChmb3IgdGhlICJsb29rdXAiIGxpbmUpOwogIDIpIG5zc3dpdGNoLmZvbiAoZm9yIHRoZSAiaG9zdHM6IiBsaW5lKTsKICAzKSBob3N0LmNvbmYgKGZvciB0aGUgIm9yZGVyIiBsaW5lKS4KCiAgRmlyc3QgbWF0Y2ggd2lucy4KCi0gRG9taW5pY2sgTWVnbGlvIHBhdGNoZWQ6IEMtYXJlcyBvbiBXaW5kb3dzIGFzc3VtZWQgdGhhdCB0aGUgSE9TVFMgZmlsZSBpcwogIGxvY2F0ZWQgaW4gYSBzdGF0aWMgbG9jYXRpb24uIEl0IGFzc3VtZWQKICBDOlxXaW5kb3dzXFN5c3RlbTMyXERyaXZlcnNcRXRjLiBUaGlzIGlzIGEgcG9vciBhc3N1bXB0aW9uIHRvIG1ha2UuIEluIGZhY3QsCiAgdGhlIGxvY2F0aW9uIG9mIHRoZSBIT1NUUyBmaWxlIGNhbiBiZSBjaGFuZ2VkIHZpYSBhIHJlZ2lzdHJ5IHNldHRpbmcuCgogIFRoZXJlIGlzIGEga2V5IGNhbGxlZCBEYXRhYmFzZVBhdGggd2hpY2ggc3BlY2lmaWVzIHRoZSBwYXRoIHRvIHRoZSBIT1NUUwogIGZpbGU6CiAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3RlY2huZXQvaXRzb2x1dGlvbnMvbmV0d29yay9kZXBsb3kvZGVwb3ZnL3RjcGlwMmsubXNweAoKICBUaGUgcGF0Y2ggd2lsbCBtYWtlIGMtYXJlcyBjb3JyZWN0bHkgY29uc3VsdCB0aGUgcmVnaXN0cnkgZm9yIHRoZSBsb2NhdGlvbgogIG9mIHRoaXMgZmlsZS4KCiogQXVndXN0IDI5CgotIEdpc2xlIFZhbmVtIGZpeGVkIHRoZSBNU1ZDIGJ1aWxkIGZpbGVzLgoKKiBBdWd1c3QgMjAKCi0gR2lzbGUgVmFuZW0gbWFkZSBjLWFyZXMgYnVpbGQgYW5kIHdvcmsgd2l0aCBoaXMgV2F0dC0zMiBUQ1AvSVAgc3RhY2suCgoqIEF1Z3VzdCAxMwoKLSBIYXJzaGFsIFByYWRoYW4gbWFkZSBhIG1pbm9yIHN5bnRheCBjaGFuZ2UgaW4gYXJlc19pbml0LmMgdG8gbWFrZSBpdCBidWlsZAogIGZpbmUgd2l0aCBNU1ZDIDcuMQoKKiBKdWx5IDI0CgotIE1hZGUgdGhlIGxpYiBnZXQgYnVpbHQgc3RhdGljIG9ubHkgaWYgLS1lbmFibGUtZGVidWcgaXMgdXNlZC4KCi0gR2lzbGUgVmFuZW0gZml4ZWQ6CgogIEJhc2ljYWxseSBpbiBsb29wcyBsaWtlIGhhbmRsZV9lcnJvcnMoKSwgJ3F1ZXJ5LT5uZXh0JyB3YXMgYXNzaWduZWQgYSBsb2NhbAogIHZhcmlhYmxlIGFuZCB0aGVuIHF1ZXJ5IHdhcyByZWZlcmVuY2VkIGFmdGVyIHRoZSBtZW1vcnkgd2FzIGZyZWVkIGJ5CiAgbmV4dF9zZXJ2ZXIoKS4gSSd2ZSBjaGFuZ2VkIHRoYXQgc28gbmV4dF9zZXJ2ZXIoKSBhbmQgZW5kX3F1ZXJ5KCkgcmV0dXJucwogIHRoZSBuZXh0IHF1ZXJ5LiBTbyBjYWxsZXJzIHNob3VsZCB1c2UgdGhpcyByZXQtdmFsdWUuCgogIFRoZSBuZXh0IHByb2JsZW0gd2FzIHRoYXQgJ3NlcnZlci0+dGNwX2J1ZmZlcl9wb3MnIGhhZCBhIHJhbmRvbSB2YWx1ZSBhdAogIGVudHJ5IHRvIDFzdCByZWN2KCkgKGx1Y2tpbHkgY2F1c2luZyBXaW5zb2NrIHRvIHJldHVybiBFTk9CVUZTKS4KCiAgSSd2ZSBhbHNvIGFkZGVkIGEgYXJlc193cml0ZXYoKSBmb3IgV2luZG93cyB0byBzdHJlYW1saW5lIHRoZSBjb2RlIGEgYml0CiAgbW9yZS4KCiogSnVseSAyMAotIEZpeGVkIGEgZmV3IHZhcmlhYmxlIHJldHVybiB0eXBlcyBmb3Igc29tZSBzeXN0ZW0gY2FsbHMuIE1hZGUgY29uZmlndXJlCiAgY2hlY2sgZm9yIHNzaXplX3QgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byB1c2UgdGhhdCB3aGVuIHJlY2VpdmluZyB0aGUgc2VuZCgpCiAgZXJyb3IgY29kZS4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gcHJldmVudCBjb21waWxlciB3YXJuaW5ncyBvbiBzb21lIHN5c3RlbXMuCgotIE1hZGUgY29uZmlndXJlIGNyZWF0ZSBjb25maWcuaCwgYW5kIGFsbCBzb3VyY2UgZmlsZXMgbm93IGluY2x1ZGUgc2V0dXAuaCB0aGF0CiAgbWlnaHQgaW5jbHVkZSB0aGUgcHJvcGVyIGNvbmZpZy5oIChvciBhIGhhbmRpY3JhZnRlZCBhbHRlcm5hdGl2ZSkuCgotIFN3aXRjaGVkIHRvICdhcmVzX3NvY2tldF90JyB0eXBlIGZvciBzb2NrZXRzIGluIGFyZXMsIHNpbmNlIFdpbmRvd3MgZG9uJ3QKICB1c2UgJ2ludCcgZm9yIHRoYXQuCgotIGF1dG9tYWtlLWlmaWVkIGFuZCBsaWJvb2wtaWZpZWQgYy1hcmVzLiBOb3cgaXQgYnVpbGRzIGxpYmNhcmVzIGFzIGEgc2hhcmVkCiAgbGliIG9uIG1vc3QgcGxhdGZvcm1zIGlmIHdhbnRlZC4gKFRoaXMgYmxvYXRlZCB0aGUgc2l6ZSBvZiB0aGUgcmVsZWFzZQogIGFyY2hpdmUgd2l0aCBhbm90aGVyIDIwMEshKQoKLSBNYWtlZmlsZS5hbSBub3cgdXNlcyBNYWtlZmlsZS5pbmMgZm9yIHRoZSBjIHNvdXJjZXMsIGggaGVhZGVycyBhbmQgbWFuCiAgcGFnZXMsIHRvIG1ha2UgaXQgZWFzaWVyIGZvciBvdGhlciBtYWtlZmlsZXMgdG8gdXNlIHRoZSBleGFjdCBzYW1lIHNldCBvZgogIGZpbGVzLgoKLSBBZGp1c3RlZCAnbWFrZXRneicgdG8gdXNlIHRoZSBuZXcgYXV0b21ha2UgbWFnaWMgd2hlbiBidWlsZGluZyBkaXN0cmlidXRpb24KICBhcmNoaXZlcy4KCi0gQW55b25lIGRlc2lyZXMgSFRNTCBhbmQvb3IgUERGIHZlcnNpb25zIG9mIHRoZSBtYW4gcGFnZXMgaW4gdGhlIHJlbGVhc2UKICBhcmNoaXZlcz8KCiogSnVseSAzCi0gR/xudGVyIEtuYXVmIG1hZGUgYy1hcmVzIGJ1aWxkIGFuZCBydW4gb24gTm92ZWxsIE5ldHdhcmUuCgoqIEp1bHkgMQotIEdpc2xlIFZhbmVtIHByb3ZpZGVkIE1ha2VmaWxlLmRqIHRvIGJ1aWxkIHdpdGggZGpncHAsIGFkZGVkIGEgZmV3IG1vcmUgZGpncHAKICBmaXhlcyBhbmQgbWFkZSBhcmVzIG5vdCB1c2UgJ2Vycm5vJyB0byBwcm92aWRlIGZ1cnRoZXIgaW5mbyBvbiBXaW5kb3dzLgoKKiBKdW5lIDMwCi0gR2lzbGUgVmFuZW0gbWFkZSBpdCBidWlsZCB3aXRoIGRqZ3BwIGFuZCBydW4gZmluZSB3aXRoIHRoZSBXYXR0LTMyIHN0YWNrLgoKKiBKdW5lIDEwCi0gR2lzbGUgVmFuZW0ncyBpbml0IHBhdGNoIGZvciBXaW5kb3dzOgoKICBUaGUgaW5pdF9ieV9yZXNvbHZfY29uZigpIGZ1bmN0aW9uIGZldGNoZXMgdGhlIEROUy1zZXJ2ZXIocykKICBmcm9tIGEgc2VyaWVzIG9mIHJlZ2lzdHJ5IGJyYW5jaGVzLgoKICBUaGlzIGNhbiBiZSB3cm9uZyBpbiB0aGUgY2FzZSB3aGVyZSBESENQIGhhcyBhc3NpZ25lZCBuYW1lc2VydmVycywgYnV0IHRoZQogIHVzZXIgaGFzIG92ZXJyaWRkZW4gdGhlc2Ugc2VydmVycyB3aXRoIG90aGVyIHByZWZlcmVkIHNldHRpbmdzLiBUaGVuIGl0J3MKICB3cm9uZyB0byB1c2UgdGhlIERIQ1BOQU1FU0VSVkVSIHNldHRpbmcgaW4gcmVnaXN0cnkuCgogIEluIHRoZSBjYXNlIG9mIG5vIGdsb2JhbCBESENQLWFzc2lnbmVkIG9yIGZpeGVkIHNlcnZlcnMsIGJ1dCBETlMgc2VydmVyKHMpCiAgcGVyIGFkYXB0ZXIsIG9uZSBoYXMgdG8gcXVlcnkgdGhlIGFkYXB0ZXIgYnJhbmNoZXMuICBCdXQgaG93IGNhbiBjLWFyZXMga25vdwogIHdoaWNoIGFkYXB0ZXIgaXMgdmFsaWQgZm9yIHVzZT8gQUZBSUNTIGl0IGNhbid0LiBUaGVyZSBjb3VsZCBiZSBvbmUgYWRhcHRlcgogIHRoYXQgaXMgZG93biAoZS5nLiBhIFZQTiBhZGFwdGVyKS4KCiAgU28gaXQncyBiZXR0ZXIgdG8gbGVhdmUgdGhpcyB0byB0aGUgSVAgSGVscGVyIEFQSSAoaXBobGFwaSkgYXZhaWxhYmxlIGluCiAgV2luLTk4LzIwMDAgYW5kIGxhdGVyLiBNeSBwYXRjaCBmYWxscy1iYWNrIHRvIHRoZSBvbGQgd2F5IGlmIG5vdCBhdmFpbGFibGUuCgoqIEp1bmUgOAotIEphbWVzIEJ1cnNhIGZpeGVkIGFuIGluaXQgaXNzdWUgZm9yIFJJU0MgT1MuCgoqIE1heSAxMQotIE5pY28gU3RhcHBlbmJlbHQgcmVwb3J0ZWQgdGhhdCB3aGVuIHByb2Nlc3NpbmcgZG9tYWluIGFuZCBzZWFyY2ggbGluZXMgaW4KICB0aGUgcmVzb2x2LmNvbmYgZmlsZSwgdGhlIGZpcnN0IGVudHJ5IGVuY291bnRlcmVkIGlzIHByb2Nlc3NlZCBhbmQgdXNlZCBhcwogIHRoZSBzZWFyY2ggbGlzdC4gQWNjb3JkaW5nIHRvIHRoZSBtYW51YWwgcGFnZXMgZm9yIGJvdGggTGludXgsIFNvbGFyaXMgYW5kCiAgVHJ1NjQsIHRoZSBsYXN0IGVudHJ5IG9mIGVpdGhlciBhIGRvbWFpbiBvciBhIHNlYXJjaCBmaWVsZCBpcyB1c2VkLgoKICBUaGlzIGlzIG5vdyBhZGp1c3RlZCBpbiB0aGUgY29kZQoKVmVyc2lvbiAxLjIuMCAoQXByaWwgMTMsIDIwMDQpCgoqIEFwcmlsIDIsIDIwMDQKLSBVcGRhdGVkIHZhcmlvdXMgbWFuIHBhZ2VzIHRvIGxvb2sgbmljZXIgd2hlbiBjb252ZXJ0ZWQgdG8gSFRNTCBvbiB0aGUgd2ViCiAgc2l0ZS4KCiogQXByaWwgMSwgMjAwNAotIERpcmsgTWFuc2tlIHByb3ZpZGVkIGEgbmV3IGZ1bmN0aW9uIHRoYXQgaXMgbm93IG5hbWVkIGFyZXNfY2FuY2VsKCkuIEl0IGlzCiAgdXNlZCB0byBjYW5jZWwvY2xlYW51cCBhIHJlc29sdmUvcmVxdWVzdCBtYWRlIHVzaW5nIGFyZXMgZnVuY3Rpb25zIG9uIHRoZQogIGdpdmVuIGFyZXMgY2hhbm5lbC4gSXQgZG9lcyBub3QgZGVzdHJveS9raWxsIHRoZSBhcmVzIGNoYW5uZWwgaXRzZWxmLgoKLSBEb21pbmljayBNZWdsaW8gY2xlYW5lZCB1cCB0aGUgZm9ybWF0dGluZyBpbiBzZXZlcmFsIG1hbiBwYWdlcy4KCiogTWFyY2ggMzAsIDIwMDQKLSBEb21pbmljayBNZWdsaW8ncyBuZXcgYXJlc19leHBhbmRfc3RyaW5nLiBBIGhlbHBlciBmdW5jdGlvbiB3aGVuIGRlY29kaW5nCiAgaW5jb21pbmcgRE5TIHBhY2thZ2VzLgoKLSBEYW5pZWwgU3RlbmJlcmcgbW9kaWZpZWQgdGhlIE1ha2VmaWxlLmluIHRvIHVzZSBhIGZvciBsb29wIGZvciB0aGUgbWFuIHBhZ2UKICBpbnN0YWxsYXRpb24gdG8gaW1wcm92ZSBvdmVydmlldyBhbmQgbWFrZSBpdCBlYXNpZXIgdG8gYWRkIG1hbiBwYWdlcy4KClZlcnNpb24gMS4xLjAgKE1hcmNoIDExLCAyMDA0KQoKKiBNYXJjaCA5LCAyMDA0Ci0gR2lzbGUgVmFuZW0gaW1wcm92ZWQgYnVpbGQgb24gV2luZG93cy4KCiogRmVicnVhcnkgMjUsIDIwMDQKLSBEYW4gRmFuZHJpY2ggZm91bmQgYSBmbGF3IGluIHRoZSBGZWIgMjIgZml4LgoKLSBBZGRlZCBiZXR0ZXIgY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIGxvZ2ljICh0YWtlbiBmcm9tIHRoZSBjdXJsIGNvbmZpZ3VyZQogIHNjcmlwdCkuIEFkZGVkIGFjaW5jbHVkZS5tNCB0byB0aGUgdGFyYmFsbC4KCiogRmVicnVhcnkgMjMsIDIwMDQKLSBSZW1vdmVkIGFyZXNfZnJlZV9lcnJtZW0oKSwgdGhlIGZ1bmN0aW9uLCB0aGUgZmlsZSBhbmQgdGhlIG1hbiBwYWdlLiBJdCB3YXMKICBub3QgdXNlZCBhbmQgaXQgZGlkIG5vdGhpbmcuCgotIEZpeGVkIGEgbG90IG9mIGNvZGUgdGhhdCB3YXNuJ3QgIjY0Yml0IGNsZWFuIiBhbmQgdGh1cyBjYXVzZWQgYSBsb3Qgb2YKICBjb21waWxlciB3YXJuaW5ncyBvbiBwaWNreSBjb21waWxlcnMuCgoqIEZlYnJ1YXJ5IDIyLCAyMDA0Ci0gRG9taW5pY2sgTWVnbGlvIG1hZGUgYXJlcyBpbml0IHN1cHBvcnQgbXVsdGlwbGUgbmFtZSBzZXJ2ZXJzIGluIHRoZQogIE5hbWVTZXJ2ZXIga2V5IG9uIFdpbmRvd3MuCgoqIEZlYnJ1YXJ5IDE2LCAyMDA0Ci0gTW9kaWZpZWQgYXJlc19wcml2YXRlLmggdG8gaW5jbHVkZSBsaWJjdXJsJ3MgbWVtb3J5IGRlYnVnIGhlYWRlciBpZgogIENVUkxERUJVRyBpcyBzZXQuIFRoaXMgbWFrZXMgYWxsIHRoZSBhcmVzLWZ1bmN0aW9ucyBzdXBlcnZpc2VkIHByb3Blcmx5IGJ5CiAgdGhlIGN1cmwgdGVzdCBzdWl0ZS4gVGhpcyBhbHNvIGZvcmNlZCBtZSB0byBhZGQgaW5jbHVzaW9uIG9mIHRoZQogIGFyZXNfcHJpdmF0ZS5oIGhlYWRlciBpbiBhIGZldyBtb3JlIGZpbGVzIHRoYXQgYXJlIHVzaW5nIHNvbWUga2luZCBvZgogIG1lbW9yeS1yZWxhdGVkIHJlc291cmNlcy4KCi0gTWFkZSB0aGUgbWFrZWZpbGUgb25seSBidWlsZCBhaG9zdCBhbmQgYWRpZyBpZiAnbWFrZSBkZW1vcycgaXMgdXNlZC4KCiogRmVicnVhcnkgMTAsIDIwMDQKLSBEaXJrIE1hbnNrZSBtYWRlIGFyZXNfdmVyc2lvbi5oIGluc3RhbGxlZCB3aXRoICdtYWtlIGluc3RhbGwnCgoqIEZlYnJ1YXJ5IDQsIDIwMDQKLSBhcmVzX2ZyZWVfZXJybWVtKCkgaXMgc3ViamVjdCBmb3IgcmVtb3ZhbCwgaXQgaXMgc2ltcGx5IHByZXNlbnQgZm9yIGZ1dHVyZQogIHB1cnBvc2VzLCBhbmQgc2luY2Ugd2UgcmVtb3ZlZCB0aGUgZXh0cmEgcGFyYW1ldGVyIGluIHN0cmVycm9yKCkgaXQgd29uJ3QKICBiZSB1c2VkIGJ5IGMtYXJlcyEKLSBjb25maWd1cmUgLS1lbmFibGUtZGVidWcgbm93IGVuYWJsZXMgcGlja3kgY29tcGlsZXIgb3B0aW9ucyBpZiBnY2MgaXMgdXNlZAotIGZpeGVkIHNldmVyYWwgY29tcGlsZXIgd2FybmluZ3MgLS1lbmFibGUtZGVidWcgc2hvd2VkIGFuZCBKb2VyZyBNdWVsbGVyLVRvbGsKICByZXBvcnRlZAoKVmVyc2lvbiAxLjAuMCAoRmVicnVhcnkgMywgMjAwNCkKCiogRmVicnVhcnkgMywgMjAwNAotIG5vdyB3ZSBwcm9kdWNlIHRoZSBsaWJjYXJlcy5hIGxpYnJhcnkgaW5zdGVhZCBvZiB0aGUgcHJldmlvdXMgbGliYXJlcy5hCiAgc2luY2Ugd2UgYXJlIG5vIGxvbmdlciBjb21wYXRpYmxlCgoqIEZlYnJ1YXJ5IDIsIDIwMDQKCi0gYXJlc19zdHJlcnJvcigpIGhhcyBvbmUgYXJndW1lbnQgbGVzcy4gVGhpcyBpcyB0aGUgZmlyc3Qgb2ZmaWNpYWwKICBtb2RpZmljYXRpb24gb2YgdGhlIGV4aXN0aW5nIHByb3ZpZGVkIGFyZXMgQVBJLgoKKiBKYW51YXJ5IDI5LCAyMDA0CgotIERpcmsgTWFuc2tlIGZpeGVkIGhvdyB0aGUgc29ja2V0IGlzIHNldCBub24tYmxvY2tpbmcuCgoqIEphbnVhcnkgNCwgMjAwNAoKLSBEb21pbmljayBNZWdsaW8gbWFkZSB0aGUgcHJpdmF0ZSBnZXR0aW1lb2ZkYXkoKSBiZWNvbWUgYXJlc19nZXR0aW1lb2ZkYXkoKQogIGluc3RlYWQgaW4gb3JkZXIgdG8gbm90IHBvbGx1dGUgdGhlIG5hbWUgc3BhY2UgYW5kIHJpc2sgY29sbGlkaW5nIHdpdGgKICBvdGhlciBsaWJyYXJpZXMnIHZlcnNpb25zIG9mIHRoaXMgZnVuY3Rpb24uCgoqIE9jdG9iZXIgMjQsIDIwMDMuIERhbmllbCBTdGVuYmVyZwoKICBBZGRlZCBhcmVzX3ZlcnNpb24oKS4KClZlcnNpb24gMS4wLXByZTEgKDggT2N0b2JlciAyMDAzKQoKLSBKYW1lcyBCdXJzYSBtYWRlIGl0IHJ1biBvbiBSSVNDIE9TCgotIERvbWluaWNrIE1lZ2xpbyBtYWRlIGl0IHJ1biBmaW5lIG9uIE5UNAoKLSBEdW5jYW4gV2lsY294IG1hZGUgaXQgd29yayBmaW5lIG9uIE1hYyBPUyBYCgotIERhbmllbCBTdGVuYmVyZyBhZGp1c3RlZCB0aGUgd2luZG93cyBwb3J0CgotIGxpcmVuIGF0IHZpdmlzaW1vLmNvbSBtYWRlIHRoZSBpbml0aWFsIHdpbmRvd3MgcG9ydAoKKiBJbXBvcnRlZCB0aGUgc291cmNlcyBmcm9tIGFyZXMgMS4xLjEK