ICBDaGFuZ2Vsb2cgZm9yIHRoZSBjLWFyZXMgcHJvamVjdAoKKiBOb3ZlbWJlciAyMgoKLSBJbnN0YWxsIGFyZXNfZG5zLmggdG9vCgotIE1pY2hhZWwgV2FsbG5lciBmaXhlZCB0aGlzIHByb2JsZW06IFdoZW4gSSBzZXQgZG9tYWlucyBpbiB0aGUgb3B0aW9ucwogIHN0cnVjdCwgYW5kIHRoZXJlIGFyZSBkb21haW4vc2VhcmNoIGVudHJpZXMgaW4gL2V0Yy9yZXNvbHYuY29uZiwgdGhlIGRvbWFpbnMKICBvZiB0aGUgb3B0aW9ucyBzdHJ1Y3Qgd2lsbCBiZSBvdmVycmlkZGVuLgoKKiBOb3ZlbWJlciA2CgotIFlhbmcgVHNlIHJlbW92ZWQgYSBjb3VwbGUgb2YgcG90ZW50aWFsIHplcm8gc2l6ZSBtZW1vcnkgYWxsb2NhdGlvbnMuCgotIEFuZHJlYXMgUmlla2UgZml4ZWQgdGhlIGxpbmUgZW5kaW5ncyBpbiB0aGUgYXJlc2xpYi5kc3AgZmlsZSB0aGF0IEkgKERhbmllbCkKICBicm9rZSBpbiB0aGUgMS4zLjIgcmVsZWFzZS4gV2Ugc2hvdWxkIHN3aXRjaCB0byBhIHN5c3RlbSB3aGVyZSB0aGF0IGZpbGUgaXMKICBhdXRvLWdlbmVyYXRlZC4gV2UgY291bGQgcmlwIHNvbWUgY29kZSBmb3IgdGhhdCBmcm9tIGN1cmwuLi4KClZlcnNpb24gMS4zLjIgKE5vdmVtYmVyIDMsIDIwMDYpCgoqIE9jdG9iZXIgMTIgMjAwNgoKLSBQcmV2ZW50IGFyZXNfZ2V0c29jaygpIHRvIG92ZXJmbG93IGlmIG1vcmUgdGhhbiAxNiBzb2NrZXRzIGFyZSB1c2VkLgoKKiBTZXB0ZW1iZXIgMTEgMjAwNgoKLSBHdWlsaGVybWUgQmFsZW5hIFZlcnNpYW5pOiBJIG5vdGVkIGEgc3RyYW5nZSBCVUcgaW4gV2luMzIgcG9ydAogIChhcmVzX2luaXQuYy9nZXRfaXBobHBhcGlfZG5zX2luZm8oKSBmdW5jdGlvbik6IHdoZW4gSSBkaXNhYmxlIHRoZSBuZXR3b3JrCiAgYnkgaGFuZCBvciBkaXNjb25uZWN0IHRoZSBuZXR3b3JrIGNhYmxlIGluIFdpbmRvd3MgMjAwMCBvciBXaW5kb3dzIFhQLCBteQogIGFwcGxpY2F0aW9uIGdldHMgMTI3LjAuMC4xIGFzIHRoZSBvbmx5IG5hbWUgc2VydmVyLiBUaGUgcHJvYmxlbSBjb21lcyBmcm9tCiAgJ0dldE5ldHdvcmtQYXJhbXMnIGZ1bmN0aW9uLCB0aGF0IHJldHVybnMgdGhlIGVtcHR5IHN0cmluZyAiIiBhcyB0aGUgb25seQogIG5hbWUgc2VydmVyIGluIHRoYXQgY2FzZS4gTW9yZW92ZXIsIHRoZSBXaW5kb3dzIGltcGxlbWVudGF0aW9uIG9mCiAgaW5ldF9hZGRyKCkgcmV0dXJucyBJTkFERFJfTE9PUEJBQ0sgaW5zdGVhZCBvZiBJTkFERFJfTk9ORS4KCiogQXVndXN0IDI5IDIwMDYKCi0gQnJhZCBTcGVuY2VyIGRpZAoKICBvIG1hZGUgYXJlc192ZXJzaW9uLmggdXNlIGV4dGVybiAiQyIgZm9yIGMrKyBjb21waWxlcnMKICBvIGZpeGVkIGNvbXBpbGVyIHdhcm5pbmdzIGluIGFyZXNfZ2V0bmFtZWluZm8uYwogIG8gZml4ZWQgYSBidWZmZXIgcG9zaXRpb24gaW5pdCBmb3IgVENQIHJlYWRzCgoqIEF1Z3VzdCAzIDIwMDYKCi0gUmF2aSBQcmF0YXAgZml4ZWQgYXJlc19nZXRzb2NrKCkgdG8gYWN0dWFsbHkgcmV0dXJuIHRoZSBwcm9wZXIgYml0bWFwIGFuZAogIG5vdCBhbHdheXMgemVybyEKClZlcnNpb24gMS4zLjEgKEp1bmUgMjQsIDIwMDYpCgoqIEp1bHkgMjMsIDIwMDYKCi0gR2lzbGUgVmFuZW0gYWRkZWQgZ2V0b3B0KCkgdG8gdGhlIGFob3N0IHByb2dyYW0uIEN1cnJlbnRseSBhY2NlcHRzCiAgb25seSBbLXQge2F8YWFhYX1dIHRvIHNwZWNpZnkgYWRkcmVzcyBmYW1pbHkgaW4gYXJlc19nZXRob3N0YnluYW1lKCkuCgoqIEp1bmUgMTksIDIwMDYKCi0gKHdhaGVybikgUmVtb3ZlZCAiYmlnIGVuZGlhbiIgRE5TIHNlY3Rpb24gYW5kIFJSIGRhdGEgaW50ZWdlciBwYXJzZXIKICBtYWNyb3MgZnJvbSBhcmVzX2Rucy5oLCB3aGljaCBicmVhayBjLWFyZXMgb24gbXkgU3BhcmM2NC4gQml0LXdpc2UKICBvcGVyYXRpb25zIGluIEMgb3BlcmF0ZSBvbiBsb2dpY2FsIHZhbHVlcy4gQW5kIGluIGFueSBldmVudCB0aGUgb2N0ZXRzIGFyZQogIGFscmVhZHkgaW4gYmlnLWVuZGlhbiAoYWthIG5ldHdvcmspIGJ5dGUgb3JkZXIgc28gdGhleSdyZSBiZWluZyByZXZlcnNlZAogICh0aHVzIHRoZSBzb3VyY2Ugb2YgdGhlIGJyZWFrYWdlKS4KCiogSnVuZSAxOCwgMjAwNgoKLSBXaWxsaWFtIEFoZXJuIGhhbmRsZXMgRUFHQUlOL0VXT1VMREJMT0NLIGVycm9ycyBpbiBtb3N0IG9mIHRoZSBJL08gY2FsbHMKICBmcm9tIGFyZWFfcHJvY2Vzcy5jLgoKICBUT0RPOiBIYW5kbGUgb25lIGxhc3QgRUFHQUlOIGZvciBhIFVEUCBzb2NrZXQgc2VuZCgyKSBpbgogIGFyZXNfX3NlbmRfcXVlcnkoKS4KCiogTWF5IDEwLCAyMDA2CgotIEJyYW0gTWF0dGh5cyBicm91Z2h0IG15IGF0dGVudGlvbiB0byBhIGxpYnRvb2wgcGVjdWxpYXJpdHkgd2hlcmUgZGV0ZWN0aW5nCiAgdGhpbmdzIHN1Y2ggYXMgQysrIGNvbXBpbGVyIGFjdHVhbGx5IGlzIGEgYmFkIHRoaW5nIGFuZCBzaW5jZSB3ZSBkb24ndCBuZWVkCiAgdGhhdCBkZXRlY3Rpb24gSSBhZGRlZCBhIHdvcmstYXJvdW5kLCBtdWNoIGluc3BpcmVkIGJ5IGEgcHJldmlvdXMgcGF0Y2ggYnkKICBQYW9sbyBCb256aW5pLiBUaGlzIGFsc28gc2hvcnRlbnMgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgcXVpdGUgYSBsb3QuCgoqIE1heSAzLCAyMDA2CgotIE5pY2sgTWF0aGV3c29uIGFkZGVkIHRoZSBBUkVTX09QVF9TT0NLX1NUQVRFX0NCIG9wdGlvbiB0aGF0IHdoZW4gc2V0IG1ha2VzCiAgYy1hcmVzIGNhbGwgYSBjYWxsYmFjayBvbiBzb2NrZXQgc3RhdGUgY2hhbmdlcy4gQSBiZXR0ZXIgd2F5IHRoYW4gdGhlCiAgYXJlc19nZXRzb2NrKCkgdG8gZ2V0IGZ1bGwgY29udHJvbCBvdmVyIHRoZSBzb2NrZXQgc3RhdGUuCgoqIEphbnVhcnkgOSwgMjAwNgoKLSBBbGV4YW5kZXIgTGF6aWMgaW1wcm92ZWQgdGhlIGdldHNlcnZieXBvcnRfcigpIGNvbmZpZ3VyZSBjaGVjay4KCiogSmFudWFyeSA2LCAyMDA2CgotIEFsZXhhbmRlciBMYXppYyBwb2ludGVkIG91dCB0aGF0IHRoZSBidWlsZGNvbmYgc2hvdWxkIHVzZSB0aGUgQUNMT0NBTF9GTEFHUwogIHZhcmlhYmxlIGZvciBlYXNpZXIgY29udHJvbGxpbmcgd2hhdCBpdCBkb2VzIGFuZCBob3cgaXQgcnVucy4KCiogSmFudWFyeSA1LCAyMDA2CgotIEphbWVzIEJ1cnNhIGZpeGVkIGMtYXJlcyB0byBmaW5kIHRoZSBob3N0cyBmaWxlIG9uIFJJU0MgT1MsIGFuZCBtYWRlIGl0CiAgYnVpbGQgd2l0aCBuZXdlciBnY2MgdmVyc2lvbnMgdGhhdCBubyBsb25nZXIgZGVmaW5lcyAicmlzY29zIi4KCiogRGVjZW1iZXIgMjIKCi0gRGFuaWVsIFN0ZW5iZXJnIGFkZGVkIGFyZXNfZ2V0c29jaygpIHRoYXQgZXh0cmFjdHMgdGhlIHNldCBvZiBzb2NrZXRzIHRvCiAgd2FpdCBmb3IgYWN0aW9uIG9uLiBTaW1pbGFyIHRvIGFyZXNfZmRzKCkgYnV0IG5vdCByZXN0cmljdGVkIHRvIHVzaW5nCiAgc2VsZWN0KCkgZm9yIHRoZSB3YWl0aW5nLgoKKiBOb3ZlbWJlciAyNQoKLSBZYW5nIFRzZSBmaXhlZCBzb21lIHNlbmQoKSAvIHJlY3YoKSBjb21waWxlciB3YXJuaW5ncwoKKiBTZXB0ZW1iZXIgMTgKCi0gQWRkZWQgY29uc3RhbnRzIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGFyZXNfZ2V0YWRkcmluZm8KCi0gTWFkZSBhcmVzX2dldG5hbWVpbmZvIHVzZSB0aGUgcmVlbnRyYW50IGdldHNlcnZieXBvcnQgKGdldHNlcnZieXBvcnRfcikgaWYgaXQKICBpcyBhdmFpbGFibGUgdG8gZW5zdXJlIGl0IHdvcmtzIHByb3Blcmx5IGluIGEgdGhyZWFkZWQgZW52aXJvbm1lbnQuCgoqIFNlcHRlbWJlciAxMAoKLSBjb25maWd1cmUgZml4IGZvciBkZXRlY3RpbmcgYSBtZW1iZXIgaW4gdGhlIHNvY2thZGRyX2luNiBzdHJ1Y3Qgd2hpY2ggZmFpbGVkCiAgb24gaXB2Ni1lbmFibGVkIEhQLVVYIDExLjAwCgpWZXJzaW9uIDEuMy4wIChBdWd1c3QgMjksIDIwMDUpCgoqIEF1Z3VzdCAyMQoKLSBBbGZyZWRvIFR1cG9uZSBwcm92aWRlZCBhIGZpeCBmb3IgdGhlIFdpbmRvd3MgY29kZSBpbiBnZXRfaXBobHBhcGlfZG5zX2luZm8oKQogIHdoZW4gZ2V0dGluZyB0aGUgRE5TIHNlcnZlciBldGMuCgoqIEp1bmUgMTkKCi0gQWRkZWQgc29tZSBjaGVja3MgZm9yIHRoZSBhZGRyaW5mbyBzdHJ1Y3R1cmUuCgoqIEp1bmUgMgoKLSBXaWxsaWFtIEFoZXJuOgoKICBNYWtlIFVEUCBzb2NrZXRzIG5vbi1ibG9ja2luZy4gSSd2ZSBjb25maXJtZWQgdGhhdCBhdCBsZWFzdCBvbiBMaW51eCAyLjQgYQogIHJlYWQgZXZlbnQgY2FuIGNvbWUgYmFjayBmcm9tIHBvbGwoKSBvbiBhIHZhbGlkIFNPQ0tfREdSQU0gc29ja2V0IGJ1dAogIHJlY3YoMikgd2lsbCBzdGlsbCBibG9jay4gVGhpcyBwYXRjaCBkb2Vzbid0IGlnbm9yZSBFQUdBSU4gaW4KICByZWFkX3VkcF9wYWNrZXRzKCksIHRob3VnaCBtYXliZSBpdCBzaG91bGQuIChUaGlzIHBhdGNoIHdhcyBlZGl0ZWQgYnkgRGFuaWVsCiAgU3RlbmJlcmcgYW5kIGEgbmV3IGNvbmZpZ3VyZSB0ZXN0IHdhcyBhZGRlZCAoaW1wb3J0ZWQgZnJvbSBjdXJsJ3MgY29uZmlndXJlKQogIHRvIHByb3Blcmx5IGRldGVjdCB3aGF0IG5vbi1ibG9ja2luZyBzb2NrZXQgYXBwcm9hY2ggdG8gdXNlLikKCiAgSSdtIG5vdCBxdWl0ZSBzdXJlIGhvdyB0aGlzIHdhcyBoYXBwZW5pbmcsIGJ1dCBJJ3ZlIGJlZW4gc2VlaW5nIFBUUiBxdWVyaWVzCiAgd2hpY2ggc2VlbSB0byByZXR1cm4gZW1wdHkgcmVzcG9uc2VzLiBBdCBsZWFzdCwgdGhleSB3ZXJlIGVtcHR5IHdoZW4gY2FsbGluZwogIGFyZXNfZXhwYW5kX25hbWUoKSBvbiB0aGUgcmVjb3JkLiBIZXJlJ3MgYSBwYXRjaCB3aGljaCBndWFyYW50ZWVzIHRvCiAgTlVMLXRlcm1pbmF0ZSB0aGUgZXhwYW5kZWQgbmFtZS4gVGhlIG9sZCBiZWhhdmlvciBmYWlsZWQgdG8gTlVMLXRlcm1pbmF0ZSBpZgogIGxlbiB3YXMgMCwgYW5kIHRoaXMgd2FzIGNhdXNpbmcgc3RybGVuKCkgdG8gcnVuIHBhc3QgdGhlIGVuZCBvZiB0aGUgYnVmZmVyCiAgYWZ0ZXIgY2FsbGluZyBhcmVzX2V4cGFuZF9uYW1lKCkgYW5kIGdldHRpbmcgQVJFU19TVUNDRVNTIGFzIHRoZSByZXR1cm4KICB2YWx1ZS4gSWYgcSBpcyBub3QgZ3JlYXRlciB0aGFuICpzIHRoZW4gaXQncyBlcXVhbCBhbmQgKnMgaXMgYWx3YXlzCiAgYWxsb2NhdGVkIHdpdGggYXQgbGVhc3Qgb25lIGJ5dGUuCgoqIE1heSAxNgoKLSBBZGRlZCBhcmVzX2dldG5hbWVpbmZvIHdoaWNoIG1pbWljcyB0aGUgZ2V0bmFtZWluZm8gQVBJIChhbm90aGVyIGZlYXR1cmUKICB0aGF0IGNvdWxkIHVzZSB0ZXN0aW5nKS4KCiogTWF5IDE0CgotIEFkZGVkIGFuIGluZXRfbnRvcCBmdW5jdGlvbiBmcm9tIEJJTkQgZm9yIHN5c3RlbXMgdGhhdCBkbyBub3QgaGF2ZSBpdC4KCiogQXByaWwgOQoKLSBNYWRlIHNvcnRsaXN0IHN1cHBvcnQgSVB2NiAodGhpcyBjYW4gcHJvYmFibHkgdXNlIHNvbWUgdGVzdGluZykuCgotIE1hZGUgc29ydGxpc3Qgc3VwcG9ydCBDSURSIG1hdGNoaW5nIGZvciBJUHY0LgoKKiBBcHJpbCA4CgotIEFkZGVkIHByZWxpbWluYXJ5IElQdjYgc3VwcG9ydCB0byBhcmVzX2dldGhvc3RieW5hbWUuIEN1cnJlbnRseSwgc29ydGxpc3QKICBkb2VzIG5vdCB3b3JrIHdpdGggSVB2Ni4gQWxzbyBwcm92aWRlZCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBiaXRuY21wIGZyb20KICBCSU5EIGZvciBzeXN0ZW1zIHRoYXQgZG8gbm90IHN1cHBseSB0aGlzIGZ1bmN0aW9uLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBhZGQKICBJUHY2IHN1cHBvcnQgdG8gc29ydGxpc3QuCgotIE1hZGUgYXJlc19nZXRob3N0YnlhZGRyIHN1cHBvcnQgSVB2NiBieSBzcGVjaWZ5aW5nIEFGX0lORVQ2IGFzIHRoZSBmYW1pbHkuCiAgVGhlIGZ1bmN0aW9uIGNhbiBsb29rdXAgSVB2NiBhZGRyZXNzZXMgYm90aCBmcm9tIGZpbGVzICgvZXRjL2hvc3RzKSBhbmQKICBETlMgbG9va3Vwcy4KCiogQXByaWwgNwoKLSBUdXBvbmUgQWxmcmVkbyBmaXhlZCBpbmNsdWRlcyBvZiBhcnBhL25hbWVzZXJfY29tcGF0LmggdG8gYnVpbGQgZmluZSBvbiBNYWMKICBPUyBYLgoKKiBBcHJpbCA1CgotIERvbWluaWNrIE1lZ2xpbzogUHJvdmlkZWQgaW1wbGVtZW50YXRpb25zIG9mIGluZXRfbmV0X3B0b24gYW5kIGluZXRfcHRvbgogIGZyb20gQklORCBmb3Igc3lzdGVtcyB0aGF0IGRvIG5vdCBpbmNsdWRlIHRoZXNlIGZ1bmN0aW9ucy4KCiogTWFyY2ggMTEsIDIwMDUKCi0gRG9taW5pY2sgTWVnbGlvIGFkZGVkIGFyZXNfcGFyc2VfYWFhYV9yZXBseS5jIGFuZCBkaWQgdmFyaW91cwogIGFkanVzdG1lbnRzLiBUaGUgZmlyc3QgbGl0dGxlIHN0ZXBzIHRvd2FyZHMgSVB2NiBzdXBwb3J0IQoKKiBOb3ZlbWJlciA3CgotIEZpeGVkIHRoZSBWQyBwcm9qZWN0IGFuZCBtYWtlZmlsZSB0byB1c2UgYXJlc19jYW5jZWwgYW5kIGFyZXNfdmVyc2lvbgoKKiBPY3RvYmVyIDI0CgotIFRoZSByZWxlYXNlZCBhcmVzX3ZlcnNpb24uaCBmcm9tIDEuMi4xIHNheXMgMS4yLjAgZHVlIHRvIGEgbWFrZXRneiBmbGF3LgogIFRoaXMgaXMgbm93IGZpeGVkLgoKVmVyc2lvbiAxLjIuMSAoT2N0b2JlciAyMCwgMjAwNCkKCiogU2VwdGVtYmVyIDI5CgotIEhlbnJpayBTdG9lcm5lciBmaXg6IGdvdCBhIHJlcG9ydCB0aGF0IFRydTY0IFVuaXggKHRoZSB1bml4IGZyb20gRGlnaXRhbAogIHdoZW4gdGhleSBtYWRlIEFscGhhJ3MpIHVzZXMgL2V0Yy9zdmMuY29uZiBmb3IgdGhlIHB1cnBvc2UgZml4ZWQgYmVsb3cgZm9yCiAgb3RoZXIgT1Nlcy4gSGUgbWFkZSBjLWFyZXMgY2hlY2sgZm9yIGFuZCB1bmRlcnN0YW5kIGl0IGlmIHByZXNlbnQuCgotIE5vdyBjLWFyZXMgd2lsbCB1c2UgbG9jYWwgaG9zdCBuYW1lIGxvb2t1cCBfYmVmb3JlXyBETlMgcmVzb2x2aW5nIGJ5IGRlZmF1bHQKICBpZiBub3RoaW5nIGVsc2UgaXMgdG9sZC4KCiogU2VwdGVtYmVyIDI2CgotIEhlbnJpayBTdG9lcm5lcjogZm91bmQgb3V0IHRoYXQgYy1hcmVzIGRvZXMgbm90IGxvb2sgYXQgdGhlIC9ldGMvaG9zdC5jb25mCiAgZmlsZSB0byBkZXRlcm1pbmUgdGhlIHNlcXVlbmNlIGluIHdoaWNoIHRvIHNlYXJjaCAvZXRjL2hvc3RzIGFuZCBETlMuICBTbyBvbgogIHN5c3RlbXMgd2hlcmUgdGhpcyBvcmRlciBpcyBkZWZpbmVkIGJ5IC9ldGMvaG9zdC5jb25mIGluc3RlYWQgb2YgYSAibG9va3VwIgogIGVudHJ5IGluIC9ldGMvcmVzb2x2LmNvbmYsIGMtYXJlcyB3aWxsIGFsd2F5cyBkZWZhdWx0IHRvIGxvb2tpbmcgaW4gRE5TCiAgZmlyc3QsIGFuZCAvZXRjL2hvc3RzIHNlY29uZC4KCiAgYy1hcmVzIG5vdyBsb29rcyBhdAoKICAxKSByZXNvbHYuY29uZiAoZm9yIHRoZSAibG9va3VwIiBsaW5lKTsKICAyKSBuc3N3aXRjaC5mb24gKGZvciB0aGUgImhvc3RzOiIgbGluZSk7CiAgMykgaG9zdC5jb25mIChmb3IgdGhlICJvcmRlciIgbGluZSkuCgogIEZpcnN0IG1hdGNoIHdpbnMuCgotIERvbWluaWNrIE1lZ2xpbyBwYXRjaGVkOiBDLWFyZXMgb24gV2luZG93cyBhc3N1bWVkIHRoYXQgdGhlIEhPU1RTIGZpbGUgaXMKICBsb2NhdGVkIGluIGEgc3RhdGljIGxvY2F0aW9uLiBJdCBhc3N1bWVkCiAgQzpcV2luZG93c1xTeXN0ZW0zMlxEcml2ZXJzXEV0Yy4gVGhpcyBpcyBhIHBvb3IgYXNzdW1wdGlvbiB0byBtYWtlLiBJbiBmYWN0LAogIHRoZSBsb2NhdGlvbiBvZiB0aGUgSE9TVFMgZmlsZSBjYW4gYmUgY2hhbmdlZCB2aWEgYSByZWdpc3RyeSBzZXR0aW5nLgoKICBUaGVyZSBpcyBhIGtleSBjYWxsZWQgRGF0YWJhc2VQYXRoIHdoaWNoIHNwZWNpZmllcyB0aGUgcGF0aCB0byB0aGUgSE9TVFMKICBmaWxlOgogIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS90ZWNobmV0L2l0c29sdXRpb25zL25ldHdvcmsvZGVwbG95L2RlcG92Zy90Y3BpcDJrLm1zcHgKCiAgVGhlIHBhdGNoIHdpbGwgbWFrZSBjLWFyZXMgY29ycmVjdGx5IGNvbnN1bHQgdGhlIHJlZ2lzdHJ5IGZvciB0aGUgbG9jYXRpb24KICBvZiB0aGlzIGZpbGUuCgoqIEF1Z3VzdCAyOQoKLSBHaXNsZSBWYW5lbSBmaXhlZCB0aGUgTVNWQyBidWlsZCBmaWxlcy4KCiogQXVndXN0IDIwCgotIEdpc2xlIFZhbmVtIG1hZGUgYy1hcmVzIGJ1aWxkIGFuZCB3b3JrIHdpdGggaGlzIFdhdHQtMzIgVENQL0lQIHN0YWNrLgoKKiBBdWd1c3QgMTMKCi0gSGFyc2hhbCBQcmFkaGFuIG1hZGUgYSBtaW5vciBzeW50YXggY2hhbmdlIGluIGFyZXNfaW5pdC5jIHRvIG1ha2UgaXQgYnVpbGQKICBmaW5lIHdpdGggTVNWQyA3LjEKCiogSnVseSAyNAoKLSBNYWRlIHRoZSBsaWIgZ2V0IGJ1aWx0IHN0YXRpYyBvbmx5IGlmIC0tZW5hYmxlLWRlYnVnIGlzIHVzZWQuCgotIEdpc2xlIFZhbmVtIGZpeGVkOgoKICBCYXNpY2FsbHkgaW4gbG9vcHMgbGlrZSBoYW5kbGVfZXJyb3JzKCksICdxdWVyeS0+bmV4dCcgd2FzIGFzc2lnbmVkIGEgbG9jYWwKICB2YXJpYWJsZSBhbmQgdGhlbiBxdWVyeSB3YXMgcmVmZXJlbmNlZCBhZnRlciB0aGUgbWVtb3J5IHdhcyBmcmVlZCBieQogIG5leHRfc2VydmVyKCkuIEkndmUgY2hhbmdlZCB0aGF0IHNvIG5leHRfc2VydmVyKCkgYW5kIGVuZF9xdWVyeSgpIHJldHVybnMKICB0aGUgbmV4dCBxdWVyeS4gU28gY2FsbGVycyBzaG91bGQgdXNlIHRoaXMgcmV0LXZhbHVlLgoKICBUaGUgbmV4dCBwcm9ibGVtIHdhcyB0aGF0ICdzZXJ2ZXItPnRjcF9idWZmZXJfcG9zJyBoYWQgYSByYW5kb20gdmFsdWUgYXQKICBlbnRyeSB0byAxc3QgcmVjdigpIChsdWNraWx5IGNhdXNpbmcgV2luc29jayB0byByZXR1cm4gRU5PQlVGUykuCgogIEkndmUgYWxzbyBhZGRlZCBhIGFyZXNfd3JpdGV2KCkgZm9yIFdpbmRvd3MgdG8gc3RyZWFtbGluZSB0aGUgY29kZSBhIGJpdAogIG1vcmUuCgoqIEp1bHkgMjAKLSBGaXhlZCBhIGZldyB2YXJpYWJsZSByZXR1cm4gdHlwZXMgZm9yIHNvbWUgc3lzdGVtIGNhbGxzLiBNYWRlIGNvbmZpZ3VyZQogIGNoZWNrIGZvciBzc2l6ZV90IHRvIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlIHRoYXQgd2hlbiByZWNlaXZpbmcgdGhlIHNlbmQoKQogIGVycm9yIGNvZGUuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3Mgb24gc29tZSBzeXN0ZW1zLgoKLSBNYWRlIGNvbmZpZ3VyZSBjcmVhdGUgY29uZmlnLmgsIGFuZCBhbGwgc291cmNlIGZpbGVzIG5vdyBpbmNsdWRlIHNldHVwLmggdGhhdAogIG1pZ2h0IGluY2x1ZGUgdGhlIHByb3BlciBjb25maWcuaCAob3IgYSBoYW5kaWNyYWZ0ZWQgYWx0ZXJuYXRpdmUpLgoKLSBTd2l0Y2hlZCB0byAnYXJlc19zb2NrZXRfdCcgdHlwZSBmb3Igc29ja2V0cyBpbiBhcmVzLCBzaW5jZSBXaW5kb3dzIGRvbid0CiAgdXNlICdpbnQnIGZvciB0aGF0LgoKLSBhdXRvbWFrZS1pZmllZCBhbmQgbGlib29sLWlmaWVkIGMtYXJlcy4gTm93IGl0IGJ1aWxkcyBsaWJjYXJlcyBhcyBhIHNoYXJlZAogIGxpYiBvbiBtb3N0IHBsYXRmb3JtcyBpZiB3YW50ZWQuIChUaGlzIGJsb2F0ZWQgdGhlIHNpemUgb2YgdGhlIHJlbGVhc2UKICBhcmNoaXZlIHdpdGggYW5vdGhlciAyMDBLISkKCi0gTWFrZWZpbGUuYW0gbm93IHVzZXMgTWFrZWZpbGUuaW5jIGZvciB0aGUgYyBzb3VyY2VzLCBoIGhlYWRlcnMgYW5kIG1hbgogIHBhZ2VzLCB0byBtYWtlIGl0IGVhc2llciBmb3Igb3RoZXIgbWFrZWZpbGVzIHRvIHVzZSB0aGUgZXhhY3Qgc2FtZSBzZXQgb2YKICBmaWxlcy4KCi0gQWRqdXN0ZWQgJ21ha2V0Z3onIHRvIHVzZSB0aGUgbmV3IGF1dG9tYWtlIG1hZ2ljIHdoZW4gYnVpbGRpbmcgZGlzdHJpYnV0aW9uCiAgYXJjaGl2ZXMuCgotIEFueW9uZSBkZXNpcmVzIEhUTUwgYW5kL29yIFBERiB2ZXJzaW9ucyBvZiB0aGUgbWFuIHBhZ2VzIGluIHRoZSByZWxlYXNlCiAgYXJjaGl2ZXM/CgoqIEp1bHkgMwotIEf8bnRlciBLbmF1ZiBtYWRlIGMtYXJlcyBidWlsZCBhbmQgcnVuIG9uIE5vdmVsbCBOZXR3YXJlLgoKKiBKdWx5IDEKLSBHaXNsZSBWYW5lbSBwcm92aWRlZCBNYWtlZmlsZS5kaiB0byBidWlsZCB3aXRoIGRqZ3BwLCBhZGRlZCBhIGZldyBtb3JlIGRqZ3BwCiAgZml4ZXMgYW5kIG1hZGUgYXJlcyBub3QgdXNlICdlcnJubycgdG8gcHJvdmlkZSBmdXJ0aGVyIGluZm8gb24gV2luZG93cy4KCiogSnVuZSAzMAotIEdpc2xlIFZhbmVtIG1hZGUgaXQgYnVpbGQgd2l0aCBkamdwcCBhbmQgcnVuIGZpbmUgd2l0aCB0aGUgV2F0dC0zMiBzdGFjay4KCiogSnVuZSAxMAotIEdpc2xlIFZhbmVtJ3MgaW5pdCBwYXRjaCBmb3IgV2luZG93czoKCiAgVGhlIGluaXRfYnlfcmVzb2x2X2NvbmYoKSBmdW5jdGlvbiBmZXRjaGVzIHRoZSBETlMtc2VydmVyKHMpCiAgZnJvbSBhIHNlcmllcyBvZiByZWdpc3RyeSBicmFuY2hlcy4KCiAgVGhpcyBjYW4gYmUgd3JvbmcgaW4gdGhlIGNhc2Ugd2hlcmUgREhDUCBoYXMgYXNzaWduZWQgbmFtZXNlcnZlcnMsIGJ1dCB0aGUKICB1c2VyIGhhcyBvdmVycmlkZGVuIHRoZXNlIHNlcnZlcnMgd2l0aCBvdGhlciBwcmVmZXJlZCBzZXR0aW5ncy4gVGhlbiBpdCdzCiAgd3JvbmcgdG8gdXNlIHRoZSBESENQTkFNRVNFUlZFUiBzZXR0aW5nIGluIHJlZ2lzdHJ5LgoKICBJbiB0aGUgY2FzZSBvZiBubyBnbG9iYWwgREhDUC1hc3NpZ25lZCBvciBmaXhlZCBzZXJ2ZXJzLCBidXQgRE5TIHNlcnZlcihzKQogIHBlciBhZGFwdGVyLCBvbmUgaGFzIHRvIHF1ZXJ5IHRoZSBhZGFwdGVyIGJyYW5jaGVzLiAgQnV0IGhvdyBjYW4gYy1hcmVzIGtub3cKICB3aGljaCBhZGFwdGVyIGlzIHZhbGlkIGZvciB1c2U/IEFGQUlDUyBpdCBjYW4ndC4gVGhlcmUgY291bGQgYmUgb25lIGFkYXB0ZXIKICB0aGF0IGlzIGRvd24gKGUuZy4gYSBWUE4gYWRhcHRlcikuCgogIFNvIGl0J3MgYmV0dGVyIHRvIGxlYXZlIHRoaXMgdG8gdGhlIElQIEhlbHBlciBBUEkgKGlwaGxhcGkpIGF2YWlsYWJsZSBpbgogIFdpbi05OC8yMDAwIGFuZCBsYXRlci4gTXkgcGF0Y2ggZmFsbHMtYmFjayB0byB0aGUgb2xkIHdheSBpZiBub3QgYXZhaWxhYmxlLgoKKiBKdW5lIDgKLSBKYW1lcyBCdXJzYSBmaXhlZCBhbiBpbml0IGlzc3VlIGZvciBSSVNDIE9TLgoKKiBNYXkgMTEKLSBOaWNvIFN0YXBwZW5iZWx0IHJlcG9ydGVkIHRoYXQgd2hlbiBwcm9jZXNzaW5nIGRvbWFpbiBhbmQgc2VhcmNoIGxpbmVzIGluCiAgdGhlIHJlc29sdi5jb25mIGZpbGUsIHRoZSBmaXJzdCBlbnRyeSBlbmNvdW50ZXJlZCBpcyBwcm9jZXNzZWQgYW5kIHVzZWQgYXMKICB0aGUgc2VhcmNoIGxpc3QuIEFjY29yZGluZyB0byB0aGUgbWFudWFsIHBhZ2VzIGZvciBib3RoIExpbnV4LCBTb2xhcmlzIGFuZAogIFRydTY0LCB0aGUgbGFzdCBlbnRyeSBvZiBlaXRoZXIgYSBkb21haW4gb3IgYSBzZWFyY2ggZmllbGQgaXMgdXNlZC4KCiAgVGhpcyBpcyBub3cgYWRqdXN0ZWQgaW4gdGhlIGNvZGUKClZlcnNpb24gMS4yLjAgKEFwcmlsIDEzLCAyMDA0KQoKKiBBcHJpbCAyLCAyMDA0Ci0gVXBkYXRlZCB2YXJpb3VzIG1hbiBwYWdlcyB0byBsb29rIG5pY2VyIHdoZW4gY29udmVydGVkIHRvIEhUTUwgb24gdGhlIHdlYgogIHNpdGUuCgoqIEFwcmlsIDEsIDIwMDQKLSBEaXJrIE1hbnNrZSBwcm92aWRlZCBhIG5ldyBmdW5jdGlvbiB0aGF0IGlzIG5vdyBuYW1lZCBhcmVzX2NhbmNlbCgpLiBJdCBpcwogIHVzZWQgdG8gY2FuY2VsL2NsZWFudXAgYSByZXNvbHZlL3JlcXVlc3QgbWFkZSB1c2luZyBhcmVzIGZ1bmN0aW9ucyBvbiB0aGUKICBnaXZlbiBhcmVzIGNoYW5uZWwuIEl0IGRvZXMgbm90IGRlc3Ryb3kva2lsbCB0aGUgYXJlcyBjaGFubmVsIGl0c2VsZi4KCi0gRG9taW5pY2sgTWVnbGlvIGNsZWFuZWQgdXAgdGhlIGZvcm1hdHRpbmcgaW4gc2V2ZXJhbCBtYW4gcGFnZXMuCgoqIE1hcmNoIDMwLCAyMDA0Ci0gRG9taW5pY2sgTWVnbGlvJ3MgbmV3IGFyZXNfZXhwYW5kX3N0cmluZy4gQSBoZWxwZXIgZnVuY3Rpb24gd2hlbiBkZWNvZGluZwogIGluY29taW5nIEROUyBwYWNrYWdlcy4KCi0gRGFuaWVsIFN0ZW5iZXJnIG1vZGlmaWVkIHRoZSBNYWtlZmlsZS5pbiB0byB1c2UgYSBmb3IgbG9vcCBmb3IgdGhlIG1hbiBwYWdlCiAgaW5zdGFsbGF0aW9uIHRvIGltcHJvdmUgb3ZlcnZpZXcgYW5kIG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBtYW4gcGFnZXMuCgpWZXJzaW9uIDEuMS4wIChNYXJjaCAxMSwgMjAwNCkKCiogTWFyY2ggOSwgMjAwNAotIEdpc2xlIFZhbmVtIGltcHJvdmVkIGJ1aWxkIG9uIFdpbmRvd3MuCgoqIEZlYnJ1YXJ5IDI1LCAyMDA0Ci0gRGFuIEZhbmRyaWNoIGZvdW5kIGEgZmxhdyBpbiB0aGUgRmViIDIyIGZpeC4KCi0gQWRkZWQgYmV0dGVyIGNvbmZpZ3VyZSAtLWVuYWJsZS1kZWJ1ZyBsb2dpYyAodGFrZW4gZnJvbSB0aGUgY3VybCBjb25maWd1cmUKICBzY3JpcHQpLiBBZGRlZCBhY2luY2x1ZGUubTQgdG8gdGhlIHRhcmJhbGwuCgoqIEZlYnJ1YXJ5IDIzLCAyMDA0Ci0gUmVtb3ZlZCBhcmVzX2ZyZWVfZXJybWVtKCksIHRoZSBmdW5jdGlvbiwgdGhlIGZpbGUgYW5kIHRoZSBtYW4gcGFnZS4gSXQgd2FzCiAgbm90IHVzZWQgYW5kIGl0IGRpZCBub3RoaW5nLgoKLSBGaXhlZCBhIGxvdCBvZiBjb2RlIHRoYXQgd2Fzbid0ICI2NGJpdCBjbGVhbiIgYW5kIHRodXMgY2F1c2VkIGEgbG90IG9mCiAgY29tcGlsZXIgd2FybmluZ3Mgb24gcGlja3kgY29tcGlsZXJzLgoKKiBGZWJydWFyeSAyMiwgMjAwNAotIERvbWluaWNrIE1lZ2xpbyBtYWRlIGFyZXMgaW5pdCBzdXBwb3J0IG11bHRpcGxlIG5hbWUgc2VydmVycyBpbiB0aGUKICBOYW1lU2VydmVyIGtleSBvbiBXaW5kb3dzLgoKKiBGZWJydWFyeSAxNiwgMjAwNAotIE1vZGlmaWVkIGFyZXNfcHJpdmF0ZS5oIHRvIGluY2x1ZGUgbGliY3VybCdzIG1lbW9yeSBkZWJ1ZyBoZWFkZXIgaWYKICBDVVJMREVCVUcgaXMgc2V0LiBUaGlzIG1ha2VzIGFsbCB0aGUgYXJlcy1mdW5jdGlvbnMgc3VwZXJ2aXNlZCBwcm9wZXJseSBieQogIHRoZSBjdXJsIHRlc3Qgc3VpdGUuIFRoaXMgYWxzbyBmb3JjZWQgbWUgdG8gYWRkIGluY2x1c2lvbiBvZiB0aGUKICBhcmVzX3ByaXZhdGUuaCBoZWFkZXIgaW4gYSBmZXcgbW9yZSBmaWxlcyB0aGF0IGFyZSB1c2luZyBzb21lIGtpbmQgb2YKICBtZW1vcnktcmVsYXRlZCByZXNvdXJjZXMuCgotIE1hZGUgdGhlIG1ha2VmaWxlIG9ubHkgYnVpbGQgYWhvc3QgYW5kIGFkaWcgaWYgJ21ha2UgZGVtb3MnIGlzIHVzZWQuCgoqIEZlYnJ1YXJ5IDEwLCAyMDA0Ci0gRGlyayBNYW5za2UgbWFkZSBhcmVzX3ZlcnNpb24uaCBpbnN0YWxsZWQgd2l0aCAnbWFrZSBpbnN0YWxsJwoKKiBGZWJydWFyeSA0LCAyMDA0Ci0gYXJlc19mcmVlX2Vycm1lbSgpIGlzIHN1YmplY3QgZm9yIHJlbW92YWwsIGl0IGlzIHNpbXBseSBwcmVzZW50IGZvciBmdXR1cmUKICBwdXJwb3NlcywgYW5kIHNpbmNlIHdlIHJlbW92ZWQgdGhlIGV4dHJhIHBhcmFtZXRlciBpbiBzdHJlcnJvcigpIGl0IHdvbid0CiAgYmUgdXNlZCBieSBjLWFyZXMhCi0gY29uZmlndXJlIC0tZW5hYmxlLWRlYnVnIG5vdyBlbmFibGVzIHBpY2t5IGNvbXBpbGVyIG9wdGlvbnMgaWYgZ2NjIGlzIHVzZWQKLSBmaXhlZCBzZXZlcmFsIGNvbXBpbGVyIHdhcm5pbmdzIC0tZW5hYmxlLWRlYnVnIHNob3dlZCBhbmQgSm9lcmcgTXVlbGxlci1Ub2xrCiAgcmVwb3J0ZWQKClZlcnNpb24gMS4wLjAgKEZlYnJ1YXJ5IDMsIDIwMDQpCgoqIEZlYnJ1YXJ5IDMsIDIwMDQKLSBub3cgd2UgcHJvZHVjZSB0aGUgbGliY2FyZXMuYSBsaWJyYXJ5IGluc3RlYWQgb2YgdGhlIHByZXZpb3VzIGxpYmFyZXMuYQogIHNpbmNlIHdlIGFyZSBubyBsb25nZXIgY29tcGF0aWJsZQoKKiBGZWJydWFyeSAyLCAyMDA0CgotIGFyZXNfc3RyZXJyb3IoKSBoYXMgb25lIGFyZ3VtZW50IGxlc3MuIFRoaXMgaXMgdGhlIGZpcnN0IG9mZmljaWFsCiAgbW9kaWZpY2F0aW9uIG9mIHRoZSBleGlzdGluZyBwcm92aWRlZCBhcmVzIEFQSS4KCiogSmFudWFyeSAyOSwgMjAwNAoKLSBEaXJrIE1hbnNrZSBmaXhlZCBob3cgdGhlIHNvY2tldCBpcyBzZXQgbm9uLWJsb2NraW5nLgoKKiBKYW51YXJ5IDQsIDIwMDQKCi0gRG9taW5pY2sgTWVnbGlvIG1hZGUgdGhlIHByaXZhdGUgZ2V0dGltZW9mZGF5KCkgYmVjb21lIGFyZXNfZ2V0dGltZW9mZGF5KCkKICBpbnN0ZWFkIGluIG9yZGVyIHRvIG5vdCBwb2xsdXRlIHRoZSBuYW1lIHNwYWNlIGFuZCByaXNrIGNvbGxpZGluZyB3aXRoCiAgb3RoZXIgbGlicmFyaWVzJyB2ZXJzaW9ucyBvZiB0aGlzIGZ1bmN0aW9uLgoKKiBPY3RvYmVyIDI0LCAyMDAzLiBEYW5pZWwgU3RlbmJlcmcKCiAgQWRkZWQgYXJlc192ZXJzaW9uKCkuCgpWZXJzaW9uIDEuMC1wcmUxICg4IE9jdG9iZXIgMjAwMykKCi0gSmFtZXMgQnVyc2EgbWFkZSBpdCBydW4gb24gUklTQyBPUwoKLSBEb21pbmljayBNZWdsaW8gbWFkZSBpdCBydW4gZmluZSBvbiBOVDQKCi0gRHVuY2FuIFdpbGNveCBtYWRlIGl0IHdvcmsgZmluZSBvbiBNYWMgT1MgWAoKLSBEYW5pZWwgU3RlbmJlcmcgYWRqdXN0ZWQgdGhlIHdpbmRvd3MgcG9ydAoKLSBsaXJlbiBhdCB2aXZpc2ltby5jb20gbWFkZSB0aGUgaW5pdGlhbCB3aW5kb3dzIHBvcnQKCiogSW1wb3J0ZWQgdGhlIHNvdXJjZXMgZnJvbSBhcmVzIDEuMS4xCg==