CiBPcGVuU1NMIENIQU5HRVMKIF9fX19fX19fX19fX19fXwoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMiBhbmQgMS4xLjAgIFt4eCBYWFggeHh4eF0KCiAgKikgQWRkZWQgSFRUUCBHRVQgc3VwcG9ydCB0byB0aGUgb2NzcCBjb21tYW5kLgogICAgIFtSaWNoIFNhbHpdCgogICopIFJBTkRfcHNldWRvX2J5dGVzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZXJzIHNob3VsZCB1c2UgUkFORCBieXRlcyBpbnN0ZWFkLgoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBUTFMgZXh0ZW5kZWQgbWFzdGVyIHNlY3JldCBmcm9tCiAgICAgZHJhZnQtaWV0Zi10bHMtc2Vzc2lvbi1oYXNoLTAzLnR4dC4gVGhhbmtzIGZvciBBbGZyZWRvIFBpcm9udGkgZm9yIGFuCiAgICAgaW5pdGlhbCBwYXRjaCB3aGljaCB3YXMgYSBncmVhdCBoZWxwIGR1cmluZyBkZXZlbG9wbWVudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGwgbGlic3NsIGludGVybmFsIHN0cnVjdHVyZXMgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcHVibGljIGhlYWRlcgogICAgIGZpbGVzLCBhbmQgdGhlIE9QRU5TU0xfTk9fU1NMX0lOVEVSTiBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZCAoc2luY2UgaXQgaXMKICAgICBub3cgcmVkdW5kYW50KS4gVXNlcnMgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGFjY2VzcyBpbnRlcm5hbCBzdHJ1Y3R1cmVzCiAgICAgZGlyZWN0bHkuIEluc3RlYWQgdGhleSBzaG91bGQgdXNlIHRoZSBwcm92aWRlZCBBUEkgZnVuY3Rpb25zLgogICAgIFtNYXR0IENhc3dlbGxdCgogICopIGNvbmZpZyBoYXMgYmVlbiBjaGFuZ2VkIHNvIHRoYXQgYnkgZGVmYXVsdCBPUEVOU1NMX05PX0RFUFJFQ0FURUQgaXMgdXNlZC4KICAgICBBY2Nlc3MgdG8gZGVwcmVjYXRlZCBmdW5jdGlvbnMgY2FuIGJlIHJlLWVuYWJsZWQgYnkgcnVubmluZyBjb25maWcgd2l0aAogICAgICJlbmFibGUtZGVwcmVjYXRlZCIuIEluIGFkZGl0aW9uIGFwcGxpY2F0aW9ucyB3aXNoaW5nIHRvIHVzZSBkZXByZWNhdGVkCiAgICAgZnVuY3Rpb25zIG11c3QgZGVmaW5lIE9QRU5TU0xfVVNFX0RFUFJFQ0FURUQuIE5vdGUgdGhhdCB0aGlzIG5ldyBiZWhhdmlvdXIKICAgICB3aWxsLCBieSBkZWZhdWx0LCBkaXNhYmxlIHNvbWUgdHJhbnNpdGl2ZSBpbmNsdWRlcyB0aGF0IHByZXZpb3VzbHkgZXhpc3RlZAogICAgIGluIHRoZSBoZWFkZXIgZmlsZXMgKGUuZy4gZWMuaCB3aWxsIG5vIGxvbmdlciwgYnkgZGVmYXVsdCwgaW5jbHVkZSBibi5oKQogICAgIFtNYXR0IENhc3dlbGxdCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIE9DQiBtb2RlLiBPcGVuU1NMIGhhcyBiZWVuIGdyYW50ZWQgYSBwYXRlbnQgbGljZW5zZQogICAgIGNvbXBhdGlibGUgd2l0aCB0aGUgT3BlblNTTCBsaWNlbnNlIGZvciB1c2Ugb2YgT0NCLiBEZXRhaWxzIGFyZSBhdmFpbGFibGUKICAgICBhdCBodHRwczovL3d3dy5vcGVuc3NsLm9yZy9kb2NzL21pc2MvT0NCLXBhdGVudC1ncmFudC1PcGVuU1NMLnBkZi4gU3VwcG9ydAogICAgIGZvciBPQ0IgY2FuIGJlIHJlbW92ZWQgYnkgY2FsbGluZyBjb25maWcgd2l0aCBuby1vY2IuCiAgICAgW01hdHQgQ2Fzd2VsbF0KCiAgKikgU1NMdjIgc3VwcG9ydCBoYXMgYmVlbiByZW1vdmVkLiAgSXQgc3RpbGwgc3VwcG9ydHMgcmVjZWl2aW5nIGEgU1NMdjIKICAgICBjb21wYXRpYmxlIGNsaWVudCBoZWxsby4KICAgICBbS3VydCBSb2Vja3hdCgogICopIEluY3JlYXNlZCB0aGUgbWluaW1hbCBSU0Ega2V5c2l6ZSBmcm9tIDI1NiB0byA1MTIgYml0cyBbUmljaCBTYWx6XSwKICAgICBkb25lIHdoaWxlIGZpeGluZyB0aGUgZXJyb3IgY29kZSBmb3IgdGhlIGtleS10b28tc21hbGwgY2FzZS4KICAgICBbQW5uaWUgWW91c2FyIDxhLnlvdXNhckBpbmZvcm1hdGlrLmh1LWJlcmxpbi5kZT5dCgogICopIENBLnNoIGhhcyBiZWVuIHJlbW92bWVkOyB1c2UgQ0EucGwgaW5zdGVhZC4KICAgICBbUmljaCBTYWx6XQoKICAqKSBSZW1vdmVkIG9sZCBERVMgQVBJLgogICAgIFtSaWNoIFNhbHpdCgogICopIFJlbW92ZSB2YXJpb3VzIHVuc3VwcG9ydGVkIHBsYXRmb3JtczoKICAgICAgICBTb255IE5FV1M0CiAgICAgICAgQkVPUyBhbmQgQkVPU19SNQogICAgICAgIE5lWFQKICAgICAgICBTVU5PUwogICAgICAgIE1QRS9pWAogICAgICAgIFNpbml4L1JlbGlhbnRVTklYIFJNNDAwCiAgICAgICAgREdVWAogICAgICAgIE5DUgogICAgICAgIFRhbmRlbQogICAgICAgIENyYXkKICAgICAgICAxNi1iaXQgcGxhdGZvcm1zIHN1Y2ggYXMgV0lOMTYKICAgICBbUmljaCBTYWx6XQoKICAqKSBDbGVhbiB1cCBPUEVOU1NMX05PX3h4eCAjZGVmaW5lJ3MKICAgICAgICBVc2Ugc2V0YnVmKCkgYW5kIHJlbW92ZSBPUEVOU1NMX05PX1NFVFZCVUZfSU9OQkYKICAgICAgICBSZW5hbWUgT1BFTlNTTF9TWVNOQU1FX3h4eCB0byBPUEVOU1NMX1NZU194eHgKICAgICAgICBPUEVOU1NMX05PX0VDe0RILERTQX0gbWVyZ2VkIGludG8gT1BFTlNTTF9OT19FQwogICAgICAgIE9QRU5TU0xfTk9fUklQRU1EMTYwLCBPUEVOU1NMX05PX1JJUEVNRCBtZXJnZWQgaW50byBPUEVOU1NMX05PX1JNRDE2MAogICAgICAgIE9QRU5TU0xfTk9fRlBfQVBJIG1lcmdlZCBpbnRvIE9QRU5TU0xfTk9fU1RESU8KICAgICAgICBSZW1vdmUgT1BFTlNTTF9OT19CSU8gT1BFTlNTTF9OT19CVUZGRVIgT1BFTlNTTF9OT19DSEFJTl9WRVJJRlkKICAgICAgICBPUEVOU1NMX05PX0VWUCBPUEVOU1NMX05PX0ZJUFNfRVJSIE9QRU5TU0xfTk9fSEFTSF9DT01QCiAgICAgICAgT1BFTlNTTF9OT19MSEFTSCBPUEVOU1NMX05PX09CSkVDVCBPUEVOU1NMX05PX1NQRUVEIE9QRU5TU0xfTk9fU1RBQ0sKICAgICAgICBPUEVOU1NMX05PX1g1MDkgT1BFTlNTTF9OT19YNTA5X1ZFUklGWQogICAgICAgIFJlbW92ZSBNU19TVEFUSUM7IGl0J3MgYSByZWxpYyBmcm9tIHBsYXRmb3JtcyA8MzIgYml0cy4KICAgICBbUmljaCBTYWx6XQoKICAqKSBDbGVhbmVkIHVwIGRlYWQgY29kZQogICAgICAgIFJlbW92ZSBhbGwgYnV0IG9uZSAnI2lmZGVmIHVuZGVmJyB3aGljaCBpcyB0byBiZSBsb29rZWQgYXQuCiAgICAgW1JpY2ggU2Fsel0KCiAgKikgQ2xlYW4gdXAgY2FsbGluZyBvZiB4eHhfZnJlZSByb3V0aW5lcy4KICAgICAgICBKdXN0IGxpa2UgZnJlZSgpLCBmaXggbW9zdCBvZiB0aGUgeHh4X2ZyZWUgcm91dGluZXMgdG8gYWNjZXB0CiAgICAgICAgTlVMTC4gIFJlbW92ZSB0aGUgbm9uLW51bGwgY2hlY2tzIGZyb20gY2FsbGVycy4gIFNhdmUgbXVjaCBjb2RlLgogICAgIFtSaWNoIFNhbHpdCgogICopIEV4cGVyaW1lbnRhbCBzdXBwb3J0IGZvciBhIG5ldywgZmFzdCwgdW5iaWFzZWQgcHJpbWUgY2FuZGlkYXRlIGdlbmVyYXRvciwKICAgICBibl9wcm9iYWJsZV9wcmltZV9kaF9jb3ByaW1lKCkuIE5vdCBjdXJyZW50bHkgdXNlZCBieSBhbnkgcHJpbWUgZ2VuZXJhdG9yLgogICAgIFtGZWxpeCBMYXVyaWUgdm9uIE1hc3NlbmJhY2ggPGZlbGl4QGVyYnJpZGdlLmNvLnVrPl0KCiAgKikgTmV3IG91dHB1dCBmb3JtYXQgTlNTIGluIHRoZSBzZXNzX2lkIGNvbW1hbmQgbGluZSB0b29sLiBUaGlzIGFsbG93cwogICAgIGV4cG9ydGluZyB0aGUgc2Vzc2lvbiBpZCBhbmQgdGhlIG1hc3RlciBrZXkgaW4gTlNTIGtleWxvZyBmb3JtYXQuCiAgICAgW01hcnRpbiBLYWlzZXIgPG1hcnRpbkBrYWlzZXIuY3g+XQoKICAqKSBIYXJtb25pemUgdmVyc2lvbiBhbmQgaXRzIGRvY3VtZW50YXRpb24uIC1mIGZsYWcgaXMgdXNlZCB0byBkaXNwbGF5CiAgICAgY29tcGlsYXRpb24gZmxhZ3MuCiAgICAgW21hbmNoYSA8bWFuY2hhMUB6b2hvLmNvbT5dCgogICopIEZpeCBlY2tleV9wcml2X2VuY29kZSBzbyBpdCBpbW1lZGlhdGVseSByZXR1cm5zIGFuIGVycm9yIHVwb24gYSBmYWlsdXJlCiAgICAgaW4gaTJkX0VDUHJpdmF0ZUtleS4KICAgICBbbWFuY2hhIDxtYW5jaGExQHpvaG8uY29tPl0KCiAgKikgRml4IHNvbWUgZG91YmxlIGZyZWVzLiBUaGVzZSBhcmUgbm90IHRob3VnaHQgdG8gYmUgZXhwbG9pdGFibGUuCiAgICAgW21hbmNoYSA8bWFuY2hhMUB6b2hvLmNvbT5dCgogICopIEEgbWlzc2luZyBib3VuZHMgY2hlY2sgaW4gdGhlIGhhbmRsaW5nIG9mIHRoZSBUTFMgaGVhcnRiZWF0IGV4dGVuc2lvbgogICAgIGNhbiBiZSB1c2VkIHRvIHJldmVhbCB1cCB0byA2NGsgb2YgbWVtb3J5IHRvIGEgY29ubmVjdGVkIGNsaWVudCBvcgogICAgIHNlcnZlci4KCiAgICAgVGhhbmtzIGZvciBOZWVsIE1laHRhIG9mIEdvb2dsZSBTZWN1cml0eSBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcgYW5kIHRvCiAgICAgQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPiBhbmQgQm9kbyBNb2VsbGVyIDxibW9lbGxlckBhY20ub3JnPiBmb3IKICAgICBwcmVwYXJpbmcgdGhlIGZpeCAoQ1ZFLTIwMTQtMDE2MCkKICAgICBbQWRhbSBMYW5nbGV5LCBCb2RvIE1vZWxsZXJdCgogICopIEZpeCBmb3IgdGhlIGF0dGFjayBkZXNjcmliZWQgaW4gdGhlIHBhcGVyICJSZWNvdmVyaW5nIE9wZW5TU0wKICAgICBFQ0RTQSBOb25jZXMgVXNpbmcgdGhlIEZMVVNIK1JFTE9BRCBDYWNoZSBTaWRlLWNoYW5uZWwgQXR0YWNrIgogICAgIGJ5IFl1dmFsIFlhcm9tIGFuZCBOYW9taSBCZW5nZXIuIERldGFpbHMgY2FuIGJlIG9idGFpbmVkIGZyb206CiAgICAgaHR0cDovL2VwcmludC5pYWNyLm9yZy8yMDE0LzE0MAoKICAgICBUaGFua3MgdG8gWXV2YWwgWWFyb20gYW5kIE5hb21pIEJlbmdlciBmb3IgZGlzY292ZXJpbmcgdGhpcwogICAgIGZsYXcgYW5kIHRvIFl1dmFsIFlhcm9tIGZvciBzdXBwbHlpbmcgYSBmaXggKENWRS0yMDE0LTAwNzYpCiAgICAgW1l1dmFsIFlhcm9tIGFuZCBOYW9taSBCZW5nZXJdCgogICopIFVzZSBhbGdvcml0aG0gc3BlY2lmaWMgY2hhaW5zIGluIFNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoKToKICAgICB0aGlzIGZpeGVzIGEgbGltaXRhdGlvbiBpbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBPcGVuU1NMLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4cGVyaW1lbnRhbCBlbmNyeXB0LXRoZW4tbWFjIHN1cHBvcnQuCiAgICAKICAgICBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3IgZW5jcnlwdCB0aGVuIG1hYyBmcm9tCiAgICAgZHJhZnQtZ3V0bWFubi10bHMtZW5jcnlwdC10aGVuLW1hYy0wMi50eHQKCiAgICAgVG8gZW5hYmxlIGl0IHNldCB0aGUgYXBwcm9wcmlhdGUgZXh0ZW5zaW9uIG51bWJlciAoMHg0MiBmb3IgdGhlIHRlc3QKICAgICBzZXJ2ZXIpIHVzaW5nIGUuZy4gLURUTFNFWFRfVFlQRV9lbmNyeXB0X3RoZW5fbWFjPTB4NDIKIAogICAgIEZvciBub24tY29tcGxpYW50IHBlZXJzIChpLmUuIGp1c3QgYWJvdXQgZXZlcnl0aGluZykgdGhpcyBzaG91bGQgaGF2ZSBubwogICAgIGVmZmVjdC4KCiAgICAgV0FSTklORzogRVhQRVJJTUVOVEFMLCBTVUJKRUNUIFRPIENIQU5HRS4KCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEVWUCBzdXBwb3J0IGZvciBrZXkgd3JhcHBpbmcgYWxnb3JpdGhtcywgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aAogICAgIGV4aXN0aW5nIGNvZGUgdGhlIGZsYWcgRVZQX0NJUEhFUl9DVFhfV1JBUF9BTExPVyBoYXMgdG8gYmUgc2V0IGluCiAgICAgdGhlIEVWUF9DSVBIRVJfQ1RYIG9yIGFuIGVycm9yIGlzIHJldHVybmVkLiBBZGQgQUVTIGFuZCBERVMzIHdyYXAKICAgICBhbGdvcml0aG1zIGFuZCBpbmNsdWRlIHRlc3RzIGNhc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCBDTVMgY29kZSB0byBzdXBwb3J0IFJTQS1QU1Mgc2lnbmF0dXJlcyBhbmQgUlNBLU9BRVAgZm9yCiAgICAgZW52ZWxvcGVkIGRhdGEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kZWQgUlNBIE9BRVAgc3VwcG9ydCB2aWEgRVZQX1BLRVkgQVBJLiBPcHRpb25zIHRvIHNwZWNpZnkgZGlnZXN0LAogICAgIE1HRjEgZGlnZXN0IGFuZCBPQUVQIGxhYmVsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugb3BlbnNzbCB2ZXJpZnkgcmV0dXJuIGVycm9ycy4KICAgICBbQ2hyaXMgUGFsbWVyIDxwYWxtZXJAZ29vZ2xlLmNvbT4gYW5kIEJlbiBMYXVyaWVdCgogICopIE5ldyBmdW5jdGlvbiBBU04xX1RJTUVfZGlmZiB0byBjYWxjdWxhdGUgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28KICAgICBBU04xX1RJTUUgc3RydWN0dXJlcyBvciBvbmUgc3RydWN0dXJlIGFuZCB0aGUgY3VycmVudCB0aW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBmaXBzX3Rlc3Rfc3VpdGUgdG8gc3VwcG9ydCBtdWx0aXBsZSBjb21tYW5kIGxpbmUgb3B0aW9ucy4gTmV3CiAgICAgdGVzdCB0byBpbmR1Y2UgYWxsIHNlbGYgdGVzdCBlcnJvcnMgaW4gc2VxdWVuY2UgYW5kIGNoZWNrIGV4cGVjdGVkCiAgICAgZmFpbHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEZJUFNfe3JzYSxkc2EsZWNkc2F9X3tzaWduLHZlcmlmeX0gZnVuY3Rpb25zIHdoaWNoIGRpZ2VzdCBhbmQKICAgICBzaWduIG9yIHZlcmlmeSBhbGwgaW4gb25lIG9wZXJhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZmlwc19hbGd2czogYSBtdWx0aWNhbGwgZmlwcyB1dGlsaXR5IGluY29ycG9yYXRpbmcgYWxsIHRoZSBhbGdvcml0aG0KICAgICB0ZXN0IHByb2dyYW1zIGFuZCBmaXBzX3Rlc3Rfc3VpdGUuIEluY2x1ZGVzIGZ1bmN0aW9uYWxpdHkgdG8gcGFyc2UKICAgICB0aGUgbWluaW1hbCBzY3JpcHQgb3V0cHV0IG9mIGZpcHNhbGdlc3QucGwgZGlyZWN0bHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGF1dGhvcmlzYXRpb24gcGFyYW1ldGVyIHRvIEZJUFNfbW9kdWxlX21vZGVfc2V0KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEZJUFMgc2VsZnRlc3QgZm9yIEVDREggYWxnb3JpdGhtIHVzaW5nIFAtMjI0IGFuZCBCLTIzMyBjdXJ2ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIHNlcGFyYXRlIERSQkcgZmllbGRzIGZvciBpbnRlcm5hbCBhbmQgZXh0ZXJuYWwgZmxhZ3MuIE5ldyBmdW5jdGlvbgogICAgIEZJUFNfZHJiZ19oZWFsdGhfY2hlY2soKSB0byBwZXJmb3JtIG9uIGRlbWFuZCBoZWFsdGggY2hlY2tpbmcuIEFkZAogICAgIGdlbmVyYXRpb24gdGVzdHMgdG8gZmlwc190ZXN0X3N1aXRlIHdpdGggcmVkdWNlZCBoZWFsdGggY2hlY2sgaW50ZXJ2YWwgdG8gCiAgICAgZGVtb25zdHJhdGUgcGVyaW9kaWMgaGVhbHRoIGNoZWNraW5nLiBBZGQgIm5vZGgiIG9wdGlvbiB0bwogICAgIGZpcHNfdGVzdF9zdWl0ZSB0byBza2lwIHZlcnkgc2xvdyBESCB0ZXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBGSVBTX2dldF9jaXBoZXJieW5pZCgpIHRvIGxvb2t1cCBGSVBTIHN1cHBvcnRlZCBjaXBoZXJzCiAgICAgYmFzZWQgb24gTklELgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vcmUgZXh0ZW5zaXZlIGhlYWx0aCBjaGVjayBmb3IgRFJCRyBjaGVja2luZyBtYW55IG1vcmUgZmFpbHVyZSBtb2Rlcy4KICAgICBOZXcgZnVuY3Rpb24gRklQU19zZWxmdGVzdF9kcmJnX2FsbCgpIHRvIGhhbmRsZSBldmVyeSBwb3NzaWJsZSBEUkJHCiAgICAgY29tYmluYXRpb246IGNhbGwgdGhpcyBpbiBmaXBzX3Rlc3Rfc3VpdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIER1YWwgRUMgRFJCRyBmcm9tIFNQODAwLTkwLiBVcGRhdGUgRFJCRyBhbGdvcml0aG0gdGVzdAogICAgIGFuZCBQT1NUIHRvIGhhbmRsZSBEdWFsIEVDIGNhc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBjYW5vbmljYWwgZ2VuZXJhdGlvbiBvZiBEU0EgcGFyYW1ldGVyICdnJy4gU2VlIAogICAgIEZJUFMgMTg2LTMgQS4yLjMuCgogICopIEFkZCBzdXBwb3J0IGZvciBITUFDIERSQkcgZnJvbSBTUDgwMC05MC4gVXBkYXRlIERSQkcgYWxnb3JpdGhtIHRlc3QgYW5kCiAgICAgUE9TVCB0byBoYW5kbGUgSE1BQyBjYXNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVuY3Rpb25zIEZJUFNfbW9kdWxlX3ZlcnNpb24oKSBhbmQgRklQU19tb2R1bGVfdmVyc2lvbl90ZXh0KCkKICAgICB0byByZXR1cm4gbnVtZXJpY2FsIGFuZCBzdHJpbmcgdmVyc2lvbnMgb2YgdGhlIEZJUFMgbW9kdWxlIG51bWJlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW5hbWUgRklQU19tb2RlX3NldCBhbmQgRklQU19tb2RlIHRvIEZJUFNfbW9kdWxlX21vZGVfc2V0IGFuZAogICAgIEZJUFNfbW9kdWxlX21vZGUuIEZJUFNfbW9kZSBhbmQgRklQU19tb2RlX3NldCB3aWxsIGJlIGltcGxlbWVudGVkCiAgICAgb3V0c2lkZSB0aGUgdmFsaWRhdGVkIG1vZHVsZSBpbiB0aGUgRklQUyBjYXBhYmxlIE9wZW5TU0wuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWlub3IgY2hhbmdlIHRvIERSQkcgZW50cm9weSBjYWxsYmFjayBzZW1hbnRpY3MuIEluIHNvbWUgY2FzZXMKICAgICB0aGVyZSBpcyBubyBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgbGVuZ3RoIGJldHdlZW4gbWluX2xlbiBhbmQKICAgICBtYXhfbGVuLiBBbGxvdyB0aGUgY2FsbGJhY2sgdG8gcmV0dXJuIG1vcmUgdGhhbiBtYXhfbGVuIGJ5dGVzCiAgICAgb2YgZW50cm9weSBidXQgZGlzY2FyZCBhbnkgZXh0cmE6IGl0IGlzIHRoZSBjYWxsYmFjaydzIHJlc3BvbnNpYmlsaXR5CiAgICAgdG8gZW5zdXJlIHRoYXQgdGhlIGV4dHJhIGRhdGEgZGlzY2FyZGVkIGRvZXMgbm90IGltcGFjdCB0aGUKICAgICByZXF1ZXN0ZWQgYW1vdW50IG9mIGVudHJvcHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIFBSTkcgc2VjdXJpdHkgc3RyZW5ndGggY2hlY2tzIHRvIFJTQSwgRFNBIGFuZCBFQ0RTQSB1c2luZyAKICAgICBpbmZvcm1hdGlvbiBpbiBGSVBTMTg2LTMsIFNQODAwLTU3IGFuZCBTUDgwMC0xMzFBLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENDTSBzdXBwb3J0IHZpYSBFVlAuIEludGVyZmFjZSBpcyB2ZXJ5IHNpbWlsYXIgdG8gR0NNIGNhc2UgZXhjZXB0IHdlCiAgICAgbXVzdCBzdXBwbHkgYWxsIGRhdGEgaW4gb25lIGNodW5rIChpLmUuIG5vIHVwZGF0ZSwgZmluYWwpIGFuZCB0aGUKICAgICBtZXNzYWdlIGxlbmd0aCBtdXN0IGJlIHN1cHBsaWVkIGlmIEFBRCBpcyB1c2VkLiBBZGQgYWxnb3JpdGhtIHRlc3QKICAgICBzdXBwb3J0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgdmVyc2lvbiBvZiBQT1NUIG92ZXJoYXVsLiBBZGQgUE9TVCBjYWxsYmFjayB0byBhbGxvdyB0aGUgc3RhdHVzCiAgICAgb2YgUE9TVCB0byBiZSBtb25pdG9yZWQgYW5kL29yIGZhaWx1cmVzIGluZHVjZWQuIE1vZGlmeSBmaXBzX3Rlc3Rfc3VpdGUKICAgICB0byB1c2UgY2FsbGJhY2suIEFsd2F5cyBydW4gYWxsIHNlbGZ0ZXN0cyBldmVuIGlmIG9uZSBmYWlscy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBYVFMgc3VwcG9ydCBpbmNsdWRpbmcgYWxnb3JpdGhtIHRlc3QgZHJpdmVyIGluIHRoZSBmaXBzX2djbXRlc3QgcHJvZ3JhbS4KICAgICBOb3RlOiB0aGlzIGRvZXMgaW5jcmVhc2UgdGhlIG1heGltdW0ga2V5IGxlbmd0aCBmcm9tIDMyIHRvIDY0IGJ5dGVzIGJ1dAogICAgIHRoZXJlIHNob3VsZCBiZSBubyBiaW5hcnkgY29tcGF0aWJpbGl0eSBpc3N1ZXMgYXMgZXhpc3RpbmcgYXBwbGljYXRpb25zCiAgICAgd2lsbCBuZXZlciB1c2UgWFRTIG1vZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5zaXZlIHJlb3JnYW5pc2F0aW9uIG9mIEZJUFMgUFJORyBiZWhhdmlvdXIuIFJlbW92ZSBhbGwgZGVwZW5kZW5jaWVzCiAgICAgdG8gT3BlblNTTCBSQU5EIGNvZGUgYW5kIHJlcGxhY2Ugd2l0aCBhIHRpbnkgRklQUyBSQU5EIEFQSSB3aGljaCBhbHNvCiAgICAgcGVyZm9ybXMgYWxnb3JpdGhtIGJsb2NraW5nIGZvciB1bmFwcHJvdmVkIFBSTkcgdHlwZXMuIEFsc28gZG8gbm90CiAgICAgc2V0IFBSTkcgdHlwZSBpbiBGSVBTX21vZGVfc2V0KCk6IGxlYXZlIHRoaXMgdG8gdGhlIGFwcGxpY2F0aW9uLgogICAgIEFkZCBkZWZhdWx0IE9wZW5TU0wgRFJCRyBoYW5kbGluZzogc2V0cyB1cCBGSVBTIFBSTkcgYW5kIHNlZWRzIHdpdGgKICAgICB0aGUgc3RhbmRhcmQgT3BlblNTTCBQUk5HOiBzZXQgYWRkaXRpb25hbCBkYXRhIHRvIGEgZGF0ZSB0aW1lIHZlY3Rvci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW5hbWUgb2xkIFg5LjMxIFBSTkcgZnVuY3Rpb25zIG9mIHRoZSBmb3JtIEZJUFNfcmFuZCogdG8gRklQU194OTMxKi4KICAgICBUaGlzIHNob3VsZG4ndCBwcmVzZW50IGFueSBpbmNvbXBhdGliaWxpdHkgcHJvYmxlbXMgYmVjYXVzZSBhcHBsaWNhdGlvbnMKICAgICBzaG91bGRuJ3QgYmUgdXNpbmcgdGhlc2UgZGlyZWN0bHkgYW5kIGFueSB0aGF0IGFyZSB3aWxsIG5lZWQgdG8gcmV0aGluawogICAgIGFueXdheSBhcyB0aGUgWDkuMzEgUFJORyBpcyBub3cgZGVwcmVjYXRlZCBieSBGSVBTIDE0MC0yCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5zaXZlIHNlbGYgdGVzdHMgYW5kIGhlYWx0aCBjaGVja2luZyByZXF1aXJlZCBieSBTUDgwMC05MCBEUkJHLgogICAgIFJlbW92ZSBzdHJlbmd0aCBwYXJhbWV0ZXIgZnJvbSBGSVBTX2RyYmdfaW5zdGFudGlhdGUgYW5kIGFsd2F5cwogICAgIGluc3RhbnRpYXRlIGF0IG1heGltdW0gc3VwcG9ydGVkIHN0cmVuZ3RoLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBFQ0RIIGNvZGUgdG8gZmlwcyBtb2R1bGUgYW5kIGZpcHNfZWNkaHZzIGZvciBwcmltaXRpdmVzIG9ubHkgdGVzdGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgYWxnb3JpdGhtIHRlc3QgcHJvZ3JhbSBmaXBzX2RodnMgdG8gaGFuZGxlIERIIHByaW1pdGl2ZXMgb25seSB0ZXN0aW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBESF9jb21wdXRlX2tleV9wYWRkZWQoKSB0byBjb21wdXRlIGEgREgga2V5IGFuZCBwYWQgd2l0aAogICAgIGxlYWRpbmcgemVyb2VzIGlmIG5lZWRlZDogdGhpcyBjb21wbGllcyB3aXRoIFNQODAwLTU2QSBldCBhbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGltcGxlbWVudGF0aW9uIG9mIFNQODAwLTkwIERSQkdzIGZvciBIYXNoIGFuZCBDVFIuIE5vdCB1c2VkIGJ5CiAgICAgYW55dGhpbmcsIGluY29tcGxldGUsIHN1YmplY3QgdG8gY2hhbmdlIGFuZCBsYXJnZWx5IHVudGVzdGVkIGF0IHByZXNlbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGZpcHNjYW5pc3Rlcm9ubHkgYnVpbGQgb3B0aW9uIHRvIG9ubHkgYnVpbGQgdGhlIG5lY2Vzc2FyeSBvYmplY3QKICAgICBmaWxlcyBieSBmaWx0ZXJpbmcgRklQU19FWF9PQkogdGhyb3VnaCBhIHBlcmwgc2NyaXB0IGluIGNyeXB0by9NYWtlZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZXhwZXJpbWVudGFsIG9wdGlvbiBGSVBTU1lNUyB0byBnaXZlIGFsbCBzeW1ib2xzIGluCiAgICAgZmlwc2NhbmlzdGVyLm8gYW5kIEZJUFMgb3IgZmlwcyBwcmVmaXguIFRoaXMgd2lsbCBhdm9pZAogICAgIGNvbmZsaWN0cyB3aXRoIGZ1dHVyZSB2ZXJzaW9ucyBvZiBPcGVuU1NMLiBBZGQgcGVybCBzY3JpcHQKICAgICB1dGlsL2ZpcHNhcy5wbCB0byBwcmVwcm9jZXNzIGFzc2VtYmx5IGxhbmd1YWdlIHNvdXJjZSBmaWxlcwogICAgIGFuZCByZW5hbWUgYW55IGFmZmVjdGVkIHN5bWJvbHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNlbGZ0ZXN0IGNoZWNrcyBhbmQgYWxnb3JpdGhtIGJsb2NrIG9mIG5vbi1maXBzIGFsZ29yaXRobXMgaW4KICAgICBGSVBTIG1vZGUuIFJlbW92ZSBERVMyIGZyb20gc2VsZnRlc3RzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBFQ0RTQSBjb2RlIHRvIGZpcHMgbW9kdWxlLiBBZGQgdGlueSBmaXBzX2VjZHNhX2NoZWNrIHRvIGp1c3QKICAgICByZXR1cm4gaW50ZXJuYWwgbWV0aG9kIHdpdGhvdXQgYW55IEVOR0lORSBkZXBlbmRlbmNpZXMuIEFkZCBuZXcKICAgICB0aW55IGZpcHMgc2lnbiBhbmQgdmVyaWZ5IGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgYnVpbGQgb3B0aW9uIG5vLWVjMm0gdG8gZGlzYWJsZSBjaGFyYWN0ZXJpc3RpYyAyIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGJ1aWxkIG9wdGlvbiAiZmlwc2NhbmlzdGVyb25seSIuIFRoaXMgb25seSBidWlsZHMgZmlwc2NhbmlzdGVyLm8KICAgICBhbmQgKGN1cnJlbnRseSkgYXNzb2NpYXRlZCBmaXBzIHV0aWxpdGllcy4gVXNlcyB0aGUgZmlsZSBNYWtlZmlsZS5maXBzCiAgICAgaW5zdGVhZCBvZiBNYWtlZmlsZS5vcmcgYXMgdGhlIHByb3RvdHlwZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc29tZSBGSVBTIG1vZGUgcmVzdHJpY3Rpb25zIHRvIEdDTS4gQWRkIGludGVybmFsIElWIGdlbmVyYXRvci4KICAgICBVcGRhdGUgZmlwc19nY210ZXN0IHRvIHVzZSBJViBnZW5lcmF0b3IuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCwgZXhwZXJpbWVudGFsIEVWUCBzdXBwb3J0IGZvciBBRVMtR0NNLiBBQUQgY2FuIGJlIGlucHV0IGJ5CiAgICAgc2V0dGluZyBvdXRwdXQgYnVmZmVyIHRvIE5VTEwuIFRoZSAqRmluYWwgZnVuY3Rpb24gbXVzdCBiZQogICAgIGNhbGxlZCBhbHRob3VnaCBpdCB3aWxsIG5vdCByZXRyaWV2ZSBhbnkgYWRkaXRpb25hbCBkYXRhLiBUaGUgdGFnCiAgICAgY2FuIGJlIHNldCBvciByZXRyaWV2ZWQgd2l0aCBhIGN0cmwuIFRoZSBJViBsZW5ndGggaXMgYnkgZGVmYXVsdCAxMgogICAgIGJ5dGVzICg5NiBiaXRzKSBidXQgY2FuIGJlIHNldCB0byBhbiBhbHRlcm5hdGl2ZSB2YWx1ZS4gSWYgdGhlIElWCiAgICAgbGVuZ3RoIGV4Y2VlZHMgdGhlIG1heGltdW0gSVYgbGVuZ3RoIChjdXJyZW50bHkgMTYgYnl0ZXMpIGl0IGNhbm5vdCBiZQogICAgIHNldCBiZWZvcmUgdGhlIGtleS4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZsYWcgaW4gY2lwaGVyczogRVZQX0NJUEhfRkxBR19DVVNUT01fQ0lQSEVSLiBUaGlzIG1lYW5zIHRoZQogICAgIHVuZGVybHlpbmcgZG9fY2lwaGVyIGZ1bmN0aW9uIGhhbmRsZXMgYWxsIGNpcGhlciBzZW1hbnRpY3MgaXRzZWxmCiAgICAgaW5jbHVkaW5nIHBhZGRpbmcgYW5kIGZpbmFsaXNhdGlvbi4gVGhpcyBpcyB1c2VmdWwgaWYgKGZvciBleGFtcGxlKQogICAgIGFuIEVOR0lORSBjaXBoZXIgaGFuZGxlcyBibG9jayBwYWRkaW5nIGl0c2VsZi4gVGhlIGJlaGF2aW91ciBvZgogICAgIGRvX2NpcGhlciBpcyBzdWJ0bHkgY2hhbmdlZCBpZiB0aGlzIGZsYWcgaXMgc2V0OiB0aGUgcmV0dXJuIHZhbHVlCiAgICAgaXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBidWZmZXIgKHplcm8gaXMKICAgICBubyBsb25nZXIgYW4gZXJyb3IgY29kZSkgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLiBBbHNvIGlmIHRoZQogICAgIGlucHV0IGJ1ZmZlciBpcyBOVUxMIGFuZCBsZW5ndGggMCBmaW5hbGlzYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJZiBhIGNhbmRpZGF0ZSBpc3N1ZXIgY2VydGlmaWNhdGUgaXMgYWxyZWFkeSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZAogICAgIHBhdGggaWdub3JlIGl0OiBuZXcgZGVidWcgbm90aWZpY2F0aW9uIFg1MDlfVl9FUlJfUEFUSF9MT09QIGZvciB0aGlzIGNhc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wcm92ZSBmb3J3YXJkLXNlY3VyaXR5IHN1cHBvcnQ6IGFkZCBmdW5jdGlvbnMKCiAgICAgICB2b2lkIFNTTF9DVFhfc2V0X25vdF9yZXN1bWFibGVfc2Vzc2lvbl9jYWxsYmFjayhTU0xfQ1RYICpjdHgsIGludCAoKmNiKShTU0wgKnNzbCwgaW50IGlzX2ZvcndhcmRfc2VjdXJlKSkKICAgICAgIHZvaWQgU1NMX3NldF9ub3RfcmVzdW1hYmxlX3Nlc3Npb25fY2FsbGJhY2soU1NMICpzc2wsIGludCAoKmNiKShTU0wgKnNzbCwgaW50IGlzX2ZvcndhcmRfc2VjdXJlKSkKCiAgICAgZm9yIHVzZSBieSBTU0wvVExTIHNlcnZlcnM7IHRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhCiAgICAgbmV3IHNlc3Npb24gaXMgY3JlYXRlZCwgYW5kIGdldHMgdG8gZGVjaWRlIHdoZXRoZXIgdGhlIHNlc3Npb24gbWF5IGJlCiAgICAgY2FjaGVkIHRvIG1ha2UgaXQgcmVzdW1hYmxlIChyZXR1cm4gMCkgb3Igbm90IChyZXR1cm4gMSkuICAoQXMgYnkgdGhlCiAgICAgU1NML1RMUyBwcm90b2NvbCBzcGVjaWZpY2F0aW9ucywgdGhlIHNlc3Npb25faWQgc2VudCBieSB0aGUgc2VydmVyIHdpbGwgYmUKICAgICBlbXB0eSB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzZXNzaW9uIGlzIG5vdCByZXN1bWFibGU7IGFsc28sIHRoZSBzZXJ2ZXIgd2lsbAogICAgIG5vdCBnZW5lcmF0ZSBSRkMgNDUwNyAoUkZDIDUwNzcpIHNlc3Npb24gdGlja2V0cy4pCgogICAgIEEgc2ltcGxlIHJlYXNvbmFibGUgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24gaXMgdG8gcmV0dXJuIGlzX2ZvcndhcmRfc2VjdXJlLgogICAgIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUgc2V0IHRvIDEgb3IgMCBkZXBlbmRpbmcgb24gdGhlIGNpcGhlcnN1aXRlIHNlbGVjdGVkCiAgICAgYnkgdGhlIFNTTC9UTFMgc2VydmVyIGxpYnJhcnksIGluZGljYXRpbmcgd2hldGhlciBpdCBjYW4gcHJvdmlkZSBmb3J3YXJkCiAgICAgc2VjdXJpdHkuCiAgICAgW0VtaWxpYSBL5HNwZXIgPGVtaWxpYS5rYXNwZXJAZXNhdC5rdWxldXZlbi5iZT4gKEdvb2dsZSldCgogICopIE5ldyAtdmVyaWZ5X25hbWUgb3B0aW9uIGluIGNvbW1hbmQgbGluZSB1dGlsaXRpZXMgdG8gc2V0IHZlcmlmaWNhdGlvbgogICAgIHBhcmFtZXRlcnMgYnkgbmFtZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIENNQUMgaW1wbGVtZW50YXRpb24uIFdBUk5JTkc6IEVYUEVSSU1FTlRBTCwgQVBJIE1BWSBDSEFOR0UuCiAgICAgQWRkIENNQUMgcGtleSBtZXRob2RzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4cGVyaW1lbnRhbCByZW5lZ290aWF0aW9uIGluIHNfc2VydmVyIC13d3cgbW9kZS4gSWYgdGhlIGNsaWVudCAKICAgICBicm93c2VzIC9yZW5lZyBjb25uZWN0aW9uIGlzIHJlbmVnb3RpYXRlZC4gSWYgL3JlbmVnY2VydCBpdCBpcwogICAgIHJlbmVnb3RpYXRlZCByZXF1ZXN0aW5nIGEgY2VydGlmaWNhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGFuICJleHRlcm5hbCIgc2Vzc2lvbiBjYWNoZSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIHRvIHNfc2VydmVyLiBUaGlzCiAgICAgc2hvdWxkIGhlbHAgdHJhY2UgaXNzdWVzIHdoaWNoIG5vcm1hbGx5IGFyZSBvbmx5IGFwcGFyZW50IGluIGRlcGxveWVkCiAgICAgbXVsdGktcHJvY2VzcyBzZXJ2ZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuc2l2ZSBhdWRpdCBvZiBsaWJjcnlwdG8gd2l0aCBERUJVR19VTlVTRUQuIEZpeCBtYW55IGNhc2VzIHdoZXJlCiAgICAgcmV0dXJuIHZhbHVlIGlzIGlnbm9yZWQuIE5CLiBUaGUgZnVuY3Rpb25zIFJBTkRfYWRkKCksIFJBTkRfc2VlZCgpLAogICAgIEJJT19zZXRfY2lwaGVyKCkgYW5kIHNvbWUgb2JzY3VyZSBQRU0gZnVuY3Rpb25zIHdlcmUgY2hhbmdlZCBzbyB0aGV5CiAgICAgY2FuIG5vdyByZXR1cm4gYW4gZXJyb3IuIFRoZSBSQU5EIGNoYW5nZXMgcmVxdWlyZWQgYSBjaGFuZ2UgdG8gdGhlCiAgICAgUkFORF9NRVRIT0Qgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBtYWNybyBfX293dXIgZm9yICJPcGVuU1NMIFdhcm4gVW51c2VkIFJlc3VsdCIuIFRoaXMgbWFrZXMgdXNlIG9mCiAgICAgYSBnY2MgYXR0cmlidXRlIHRvIHdhcm4gaWYgdGhlIHJlc3VsdCBvZiBhIGZ1bmN0aW9uIGlzIGlnbm9yZWQuIFRoaXMKICAgICBpcyBlbmFibGUgaWYgREVCVUdfVU5VU0VEIGlzIHNldC4gQWRkIHRvIHNldmVyYWwgZnVuY3Rpb25zIGluIGV2cC5oCiAgICAgd2hvc2UgcmV0dXJuIHZhbHVlIGlzIG9mdGVuIGlnbm9yZWQuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4yIGFuZCAxLjAuMmEgW3h4IFhYWCB4eHh4XQoKICAqKSBDbGllbnRIZWxsbyBzaWdhbGdzIERvUyBmaXgKCiAgICAgSWYgYSBjbGllbnQgY29ubmVjdHMgdG8gYW4gT3BlblNTTCAxLjAuMiBzZXJ2ZXIgYW5kIHJlbmVnb3RpYXRlcyB3aXRoIGFuCiAgICAgaW52YWxpZCBzaWduYXR1cmUgYWxnb3JpdGhtcyBleHRlbnNpb24gYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2Ugd2lsbAogICAgIG9jY3VyLiBUaGlzIGNhbiBiZSBleHBsb2l0ZWQgaW4gYSBEb1MgYXR0YWNrIGFnYWluc3QgdGhlIHNlcnZlci4KCiAgICAgVGhpcyBpc3N1ZSB3YXMgd2FzIHJlcG9ydGVkIHRvIE9wZW5TU0wgYnkgRGF2aWQgUmFtb3Mgb2YgU3RhbmZvcmQKICAgICBVbml2ZXJzaXR5LgogICAgIChDVkUtMjAxNS0wMjkxKQogICAgIFtTdGVwaGVuIEhlbnNvbiBhbmQgTWF0dCBDYXN3ZWxsXQoKICAqKSBNdWx0aWJsb2NrIGNvcnJ1cHRlZCBwb2ludGVyIGZpeAoKICAgICBPcGVuU1NMIDEuMC4yIGludHJvZHVjZWQgdGhlICJtdWx0aWJsb2NrIiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudC4gVGhpcwogICAgIGZlYXR1cmUgb25seSBhcHBsaWVzIG9uIDY0IGJpdCB4ODYgYXJjaGl0ZWN0dXJlIHBsYXRmb3JtcyB0aGF0IHN1cHBvcnQgQUVTCiAgICAgTkkgaW5zdHJ1Y3Rpb25zLiBBIGRlZmVjdCBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgIm11bHRpYmxvY2siIGNhbiBjYXVzZQogICAgIE9wZW5TU0wncyBpbnRlcm5hbCB3cml0ZSBidWZmZXIgdG8gYmVjb21lIGluY29ycmVjdGx5IHNldCB0byBOVUxMIHdoZW4KICAgICB1c2luZyBub24tYmxvY2tpbmcgSU8uIFR5cGljYWxseSwgd2hlbiB0aGUgdXNlciBhcHBsaWNhdGlvbiBpcyB1c2luZyBhCiAgICAgc29ja2V0IEJJTyBmb3Igd3JpdGluZywgdGhpcyB3aWxsIG9ubHkgcmVzdWx0IGluIGEgZmFpbGVkIGNvbm5lY3Rpb24uCiAgICAgSG93ZXZlciBpZiBzb21lIG90aGVyIEJJTyBpcyB1c2VkIHRoZW4gaXQgaXMgbGlrZWx5IHRoYXQgYSBzZWdtZW50YXRpb24KICAgICBmYXVsdCB3aWxsIGJlIHRyaWdnZXJlZCwgdGh1cyBlbmFibGluZyBhIHBvdGVudGlhbCBEb1MgYXR0YWNrLgoKICAgICBUaGlzIGlzc3VlIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIGJ5IERhbmllbCBEYW5uZXIgYW5kIFJhaW5lciBNdWVsbGVyLgogICAgIChDVkUtMjAxNS0wMjkwKQogICAgIFtNYXR0IENhc3dlbGxdCgogICopIFNlZ21lbnRhdGlvbiBmYXVsdCBpbiBEVExTdjFfbGlzdGVuIGZpeAoKICAgICBUaGUgRFRMU3YxX2xpc3RlbiBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSBzdGF0ZWxlc3MgYW5kIHByb2Nlc3NlcyB0aGUKICAgICBpbml0aWFsIENsaWVudEhlbGxvIGZyb20gbWFueSBwZWVycy4gSXQgaXMgY29tbW9uIGZvciB1c2VyIGNvZGUgdG8gbG9vcAogICAgIG92ZXIgdGhlIGNhbGwgdG8gRFRMU3YxX2xpc3RlbiB1bnRpbCBhIHZhbGlkIENsaWVudEhlbGxvIGlzIHJlY2VpdmVkIHdpdGgKICAgICBhbiBhc3NvY2lhdGVkIGNvb2tpZS4gQSBkZWZlY3QgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIERUTFN2MV9saXN0ZW4gbWVhbnMKICAgICB0aGF0IHN0YXRlIGlzIHByZXNlcnZlZCBpbiB0aGUgU1NMIG9iamVjdCBmcm9tIG9uZSBpbnZvY2F0aW9uIHRvIHRoZSBuZXh0CiAgICAgdGhhdCBjYW4gbGVhZCB0byBhIHNlZ21lbnRhdGlvbiBmYXVsdC4gRXJyb3JzIHByb2Nlc3NpbmcgdGhlIGluaXRpYWwKICAgICBDbGllbnRIZWxsbyBjYW4gdHJpZ2dlciB0aGlzIHNjZW5hcmlvLiBBbiBleGFtcGxlIG9mIHN1Y2ggYW4gZXJyb3IgY291bGQgYmUKICAgICB0aGF0IGEgRFRMUzEuMCBvbmx5IGNsaWVudCBpcyBhdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gYSBEVExTMS4yIG9ubHkKICAgICBzZXJ2ZXIuCgogICAgIFRoaXMgaXNzdWUgd2FzIHJlcG9ydGVkIHRvIE9wZW5TU0wgYnkgUGVyIEFsbGFuc3Nvbi4KICAgICAoQ1ZFLTIwMTUtMDIwNykKICAgICBbTWF0dCBDYXN3ZWxsXQoKICAqKSBTZWdtZW50YXRpb24gZmF1bHQgaW4gQVNOMV9UWVBFX2NtcCBmaXgKCiAgICAgVGhlIGZ1bmN0aW9uIEFTTjFfVFlQRV9jbXAgd2lsbCBjcmFzaCB3aXRoIGFuIGludmFsaWQgcmVhZCBpZiBhbiBhdHRlbXB0IGlzCiAgICAgbWFkZSB0byBjb21wYXJlIEFTTi4xIGJvb2xlYW4gdHlwZXMuIFNpbmNlIEFTTjFfVFlQRV9jbXAgaXMgdXNlZCB0byBjaGVjawogICAgIGNlcnRpZmljYXRlIHNpZ25hdHVyZSBhbGdvcml0aG0gY29uc2lzdGVuY3kgdGhpcyBjYW4gYmUgdXNlZCB0byBjcmFzaCBhbnkKICAgICBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gb3BlcmF0aW9uIGFuZCBleHBsb2l0ZWQgaW4gYSBEb1MgYXR0YWNrLiBBbnkKICAgICBhcHBsaWNhdGlvbiB3aGljaCBwZXJmb3JtcyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gaXMgdnVsbmVyYWJsZSBpbmNsdWRpbmcKICAgICBPcGVuU1NMIGNsaWVudHMgYW5kIHNlcnZlcnMgd2hpY2ggZW5hYmxlIGNsaWVudCBhdXRoZW50aWNhdGlvbi4KICAgICAoQ1ZFLTIwMTUtMDI4NikKICAgICBbU3RlcGhlbiBIZW5zb25dCgogICopIFNlZ21lbnRhdGlvbiBmYXVsdCBmb3IgaW52YWxpZCBQU1MgcGFyYW1ldGVycyBmaXgKCiAgICAgVGhlIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gcm91dGluZXMgd2lsbCBjcmFzaCB3aXRoIGEgTlVMTCBwb2ludGVyCiAgICAgZGVyZWZlcmVuY2UgaWYgcHJlc2VudGVkIHdpdGggYW4gQVNOLjEgc2lnbmF0dXJlIHVzaW5nIHRoZSBSU0EgUFNTCiAgICAgYWxnb3JpdGhtIGFuZCBpbnZhbGlkIHBhcmFtZXRlcnMuIFNpbmNlIHRoZXNlIHJvdXRpbmVzIGFyZSB1c2VkIHRvIHZlcmlmeQogICAgIGNlcnRpZmljYXRlIHNpZ25hdHVyZSBhbGdvcml0aG1zIHRoaXMgY2FuIGJlIHVzZWQgdG8gY3Jhc2ggYW55CiAgICAgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIG9wZXJhdGlvbiBhbmQgZXhwbG9pdGVkIGluIGEgRG9TIGF0dGFjay4gQW55CiAgICAgYXBwbGljYXRpb24gd2hpY2ggcGVyZm9ybXMgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uIGlzIHZ1bG5lcmFibGUgaW5jbHVkaW5nCiAgICAgT3BlblNTTCBjbGllbnRzIGFuZCBzZXJ2ZXJzIHdoaWNoIGVuYWJsZSBjbGllbnQgYXV0aGVudGljYXRpb24uCgogICAgIFRoaXMgaXNzdWUgd2FzIHdhcyByZXBvcnRlZCB0byBPcGVuU1NMIGJ5IEJyaWFuIENhcnBlbnRlci4KICAgICAoQ1ZFLTIwMTUtMDIwOCkKICAgICBbU3RlcGhlbiBIZW5zb25dCgogICopIEFTTi4xIHN0cnVjdHVyZSByZXVzZSBtZW1vcnkgY29ycnVwdGlvbiBmaXgKCiAgICAgUmV1c2luZyBhIHN0cnVjdHVyZSBpbiBBU04uMSBwYXJzaW5nIG1heSBhbGxvdyBhbiBhdHRhY2tlciB0byBjYXVzZQogICAgIG1lbW9yeSBjb3JydXB0aW9uIHZpYSBhbiBpbnZhbGlkIHdyaXRlLiBTdWNoIHJldXNlIGlzIGFuZCBoYXMgYmVlbgogICAgIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkIGFuZCBpcyBiZWxpZXZlZCB0byBiZSByYXJlLgoKICAgICBBcHBsaWNhdGlvbnMgdGhhdCBwYXJzZSBzdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgQ0hPSUNFIG9yIEFOWSBERUZJTkVEIEJZCiAgICAgY29tcG9uZW50cyBtYXkgYmUgYWZmZWN0ZWQuIENlcnRpZmljYXRlIHBhcnNpbmcgKGQyaV9YNTA5IGFuZCByZWxhdGVkCiAgICAgZnVuY3Rpb25zKSBhcmUgaG93ZXZlciBub3QgYWZmZWN0ZWQuIE9wZW5TU0wgY2xpZW50cyBhbmQgc2VydmVycyBhcmUKICAgICBub3QgYWZmZWN0ZWQuCiAgICAgKENWRS0yMDE1LTAyODcpCiAgICAgW1N0ZXBoZW4gSGVuc29uXQoKICAqKSBQS0NTNyBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2VzIGZpeAoKICAgICBUaGUgUEtDUyM3IHBhcnNpbmcgY29kZSBkb2VzIG5vdCBoYW5kbGUgbWlzc2luZyBvdXRlciBDb250ZW50SW5mbwogICAgIGNvcnJlY3RseS4gQW4gYXR0YWNrZXIgY2FuIGNyYWZ0IG1hbGZvcm1lZCBBU04uMS1lbmNvZGVkIFBLQ1MjNyBibG9icyB3aXRoCiAgICAgbWlzc2luZyBjb250ZW50IGFuZCB0cmlnZ2VyIGEgTlVMTCBwb2ludGVyIGRlcmVmZXJlbmNlIG9uIHBhcnNpbmcuCgogICAgIEFwcGxpY2F0aW9ucyB0aGF0IHZlcmlmeSBQS0NTIzcgc2lnbmF0dXJlcywgZGVjcnlwdCBQS0NTIzcgZGF0YSBvcgogICAgIG90aGVyd2lzZSBwYXJzZSBQS0NTIzcgc3RydWN0dXJlcyBmcm9tIHVudHJ1c3RlZCBzb3VyY2VzIGFyZQogICAgIGFmZmVjdGVkLiBPcGVuU1NMIGNsaWVudHMgYW5kIHNlcnZlcnMgYXJlIG5vdCBhZmZlY3RlZC4KCiAgICAgVGhpcyBpc3N1ZSB3YXMgcmVwb3J0ZWQgdG8gT3BlblNTTCBieSBNaWNoYWwgWmFsZXdza2kgKEdvb2dsZSkuCiAgICAgKENWRS0yMDE1LTAyODkpCiAgICAgW0VtaWxpYSBL5HNwZXJdCgogICopIERvUyB2aWEgcmVhY2hhYmxlIGFzc2VydCBpbiBTU0x2MiBzZXJ2ZXJzIGZpeAoKICAgICBBIG1hbGljaW91cyBjbGllbnQgY2FuIHRyaWdnZXIgYW4gT1BFTlNTTF9hc3NlcnQgKGkuZS4sIGFuIGFib3J0KSBpbgogICAgIHNlcnZlcnMgdGhhdCBib3RoIHN1cHBvcnQgU1NMdjIgYW5kIGVuYWJsZSBleHBvcnQgY2lwaGVyIHN1aXRlcyBieSBzZW5kaW5nCiAgICAgYSBzcGVjaWFsbHkgY3JhZnRlZCBTU0x2MiBDTElFTlQtTUFTVEVSLUtFWSBtZXNzYWdlLgoKICAgICBUaGlzIGlzc3VlIHdhcyBkaXNjb3ZlcmVkIGJ5IFNlYW4gQnVyZm9yZCAoR29vZ2xlKSBhbmQgRW1pbGlhIEvkc3BlcgogICAgIChPcGVuU1NMIGRldmVsb3BtZW50IHRlYW0pLgogICAgIChDVkUtMjAxNS0wMjkzKQogICAgIFtFbWlsaWEgS+RzcGVyXQoKICAqKSBFbXB0eSBDS0Ugd2l0aCBjbGllbnQgYXV0aCBhbmQgREhFIGZpeAoKICAgICBJZiBjbGllbnQgYXV0aCBpcyB1c2VkIHRoZW4gYSBzZXJ2ZXIgY2FuIHNlZyBmYXVsdCBpbiB0aGUgZXZlbnQgb2YgYSBESEUKICAgICBjaXBoZXJzdWl0ZSBiZWluZyBzZWxlY3RlZCBhbmQgYSB6ZXJvIGxlbmd0aCBDbGllbnRLZXlFeGNoYW5nZSBtZXNzYWdlCiAgICAgYmVpbmcgc2VudCBieSB0aGUgY2xpZW50LiBUaGlzIGNvdWxkIGJlIGV4cGxvaXRlZCBpbiBhIERvUyBhdHRhY2suCiAgICAgKENWRS0yMDE1LTE3ODcpCiAgICAgW01hdHQgQ2Fzd2VsbF0KCiAgKikgSGFuZHNoYWtlIHdpdGggdW5zZWVkZWQgUFJORyBmaXgKCiAgICAgVW5kZXIgY2VydGFpbiBjb25kaXRpb25zIGFuIE9wZW5TU0wgMS4wLjIgY2xpZW50IGNhbiBjb21wbGV0ZSBhIGhhbmRzaGFrZQogICAgIHdpdGggYW4gdW5zZWVkZWQgUFJORy4gVGhlIGNvbmRpdGlvbnMgYXJlOgogICAgIC0gVGhlIGNsaWVudCBpcyBvbiBhIHBsYXRmb3JtIHdoZXJlIHRoZSBQUk5HIGhhcyBub3QgYmVlbiBzZWVkZWQKICAgICBhdXRvbWF0aWNhbGx5LCBhbmQgdGhlIHVzZXIgaGFzIG5vdCBzZWVkZWQgbWFudWFsbHkKICAgICAtIEEgcHJvdG9jb2wgc3BlY2lmaWMgY2xpZW50IG1ldGhvZCB2ZXJzaW9uIGhhcyBiZWVuIHVzZWQgKGkuZS4gbm90CiAgICAgU1NMX2NsaWVudF9tZXRob2R2MjMpCiAgICAgLSBBIGNpcGhlcnN1aXRlIGlzIHVzZWQgdGhhdCBkb2VzIG5vdCByZXF1aXJlIGFkZGl0aW9uYWwgcmFuZG9tIGRhdGEgZnJvbQogICAgIHRoZSBQUk5HIGJleW9uZCB0aGUgaW5pdGlhbCBDbGllbnRIZWxsbyBjbGllbnQgcmFuZG9tIChlLmcuIFBTSy1SQzQtU0hBKS4KCiAgICAgSWYgdGhlIGhhbmRzaGFrZSBzdWNjZWVkcyB0aGVuIHRoZSBjbGllbnQgcmFuZG9tIHRoYXQgaGFzIGJlZW4gdXNlZCB3aWxsCiAgICAgaGF2ZSBiZWVuIGdlbmVyYXRlZCBmcm9tIGEgUFJORyB3aXRoIGluc3VmZmljaWVudCBlbnRyb3B5IGFuZCB0aGVyZWZvcmUgdGhlCiAgICAgb3V0cHV0IG1heSBiZSBwcmVkaWN0YWJsZS4KCiAgICAgRm9yIGV4YW1wbGUgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21tYW5kIHdpdGggYW4gdW5zZWVkZWQgb3BlbnNzbCB3aWxsCiAgICAgc3VjY2VlZCBvbiBhbiB1bnBhdGNoZWQgcGxhdGZvcm06CgogICAgIG9wZW5zc2wgc19jbGllbnQgLXBzayAxYTJiM2M0ZCAtdGxzMV8yIC1jaXBoZXIgUFNLLVJDNC1TSEEKICAgICAoQ1ZFLTIwMTUtMDI4NSkKICAgICBbTWF0dCBDYXN3ZWxsXQoKICAqKSBVc2UgQWZ0ZXIgRnJlZSBmb2xsb3dpbmcgZDJpX0VDUHJpdmF0ZWtleSBlcnJvciBmaXgKCiAgICAgQSBtYWxmb3JtZWQgRUMgcHJpdmF0ZSBrZXkgZmlsZSBjb25zdW1lZCB2aWEgdGhlIGQyaV9FQ1ByaXZhdGVLZXkgZnVuY3Rpb24KICAgICBjb3VsZCBjYXVzZSBhIHVzZSBhZnRlciBmcmVlIGNvbmRpdGlvbi4gVGhpcywgaW4gdHVybiwgY291bGQgY2F1c2UgYSBkb3VibGUKICAgICBmcmVlIGluIHNldmVyYWwgcHJpdmF0ZSBrZXkgcGFyc2luZyBmdW5jdGlvbnMgKHN1Y2ggYXMgZDJpX1ByaXZhdGVLZXkKICAgICBvciBFVlBfUEtDUzgyUEtFWSkgYW5kIGNvdWxkIGxlYWQgdG8gYSBEb1MgYXR0YWNrIG9yIG1lbW9yeSBjb3JydXB0aW9uCiAgICAgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IHJlY2VpdmUgRUMgcHJpdmF0ZSBrZXlzIGZyb20gdW50cnVzdGVkCiAgICAgc291cmNlcy4gVGhpcyBzY2VuYXJpbyBpcyBjb25zaWRlcmVkIHJhcmUuCgogICAgIFRoaXMgaXNzdWUgd2FzIGRpc2NvdmVyZWQgYnkgdGhlIEJvcmluZ1NTTCBwcm9qZWN0IGFuZCBmaXhlZCBpbiB0aGVpcgogICAgIGNvbW1pdCA1MTcwNzNjZDRiLgogICAgIChDVkUtMjAxNS0wMjA5KQogICAgIFtNYXR0IENhc3dlbGxdCgogICopIFg1MDlfdG9fWDUwOV9SRVEgTlVMTCBwb2ludGVyIGRlcmVmIGZpeAoKICAgICBUaGUgZnVuY3Rpb24gWDUwOV90b19YNTA5X1JFUSB3aWxsIGNyYXNoIHdpdGggYSBOVUxMIHBvaW50ZXIgZGVyZWZlcmVuY2UgaWYKICAgICB0aGUgY2VydGlmaWNhdGUga2V5IGlzIGludmFsaWQuIFRoaXMgZnVuY3Rpb24gaXMgcmFyZWx5IHVzZWQgaW4gcHJhY3RpY2UuCgogICAgIFRoaXMgaXNzdWUgd2FzIGRpc2NvdmVyZWQgYnkgQnJpYW4gQ2FycGVudGVyLgogICAgIChDVkUtMjAxNS0wMjg4KQogICAgIFtTdGVwaGVuIEhlbnNvbl0KCiAgKikgUmVtb3ZlZCB0aGUgZXhwb3J0IGNpcGhlcnMgZnJvbSB0aGUgREVGQVVMVCBjaXBoZXJzCiAgICAgW0t1cnQgUm9lY2t4XQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWwgYW5kIDEuMC4yIFsyMiBKYW4gMjAxNV0KCiAgKikgRmFjaWxpdGF0ZSAidW5pdmVyc2FsIiBBUk0gYnVpbGRzIHRhcmdldGluZyByYW5nZSBvZiBBUk0gSVNBcywgZS5nLgogICAgIEFSTXY1IHRocm91Z2ggQVJNdjgsIGFzIG9wcG9zaXRlIHRvICJsb2NraW5nIiBpdCB0byBzaW5nbGUgb25lLgogICAgIFNvIGZhciB0aG9zZSB3aG8gaGF2ZSB0byB0YXJnZXQgbXVsdGlwbGUgcGxhZm9ybXMgd291bGQgY29tcHJvbWlzZQogICAgIGFuZCBhcmd1ZSB0aGF0IGJpbmFyeSB0YXJnZXRpbmcgc2F5IEFSTXY1IHdvdWxkIHN0aWxsIGV4ZWN1dGUgb24KICAgICBBUk12OC4gIlVuaXZlcnNhbCIgYnVpbGQgcmVzb2x2ZXMgdGhpcyBjb21wcm9taXNlIGJ5IHByb3ZpZGluZwogICAgIG5lYXItb3B0aW1hbCBwZXJmb3JtYW5jZSBldmVuIG9uIG5ld2VyIHBsYXRmb3Jtcy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWNjZWxlcmF0ZWQgTklTVCBQLTI1NiBlbGxpcHRpYyBjdXJ2ZSBpbXBsZW1lbnRhdGlvbiBmb3IgeDg2XzY0CiAgICAgKG90aGVyIHBsYXRmb3JtcyBwZW5kaW5nKS4KICAgICBbU2hheSBHdWVyb24gJiBWbGFkIEtyYXNub3YgKEludGVsIENvcnApLCBBbmR5IFBvbHlha292XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdGhlIFNpZ25lZENlcnRpZmljYXRlVGltZXN0YW1wTGlzdCBjZXJ0aWZpY2F0ZSBhbmQKICAgICBPQ1NQIHJlc3BvbnNlIGV4dGVuc2lvbnMgZnJvbSBSRkM2OTYyLgogICAgIFtSb2IgU3RyYWRsaW5nXQoKICAqKSBGaXggZWNfR0ZwX3NpbXBsZV9wb2ludHNfbWFrZV9hZmZpbmUgKHRodXMsIEVDX1BPSU5Uc19tdWwgZXRjLikKICAgICBmb3IgY29ybmVyIGNhc2VzLiAoQ2VydGFpbiBpbnB1dCBwb2ludHMgYXQgaW5maW5pdHkgY291bGQgbGVhZCB0bwogICAgIGJvZ3VzIHJlc3VsdHMsIHdpdGggbm9uLWluZmluaXR5IGlucHV0cyBtYXBwZWQgdG8gaW5maW5pdHkgdG9vLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIFBvd2VySVNBIDIuMC43LCBmaXJzdCBpbXBsZW1lbnRlZCBpbiBQT1dFUjguCiAgICAgVGhpcyBjb3ZlcnMgQUVTLCBTSEEyNTYvNTEyIGFuZCBHSEFTSC4gIkluaXRpYWwiIG1lYW5zIHRoYXQgbW9zdAogICAgIGNvbW1vbiBjYXNlcyBhcmUgb3B0aW1pemVkIGFuZCB0aGVyZSBzdGlsbCBpcyByb29tIGZvciBmdXJ0aGVyCiAgICAgaW1wcm92ZW1lbnRzLiBWZWN0b3IgUGVybXV0YXRpb24gQUVTIGZvciBBbHRpdmVjIGlzIGFsc28gYWRkZWQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBzdXBwb3J0IGZvciBsaXR0bGUtZW5kaWFuIHBwYzY0IExpbnV4IHRhcmdldC4KICAgICBbTWFyY2VsbyBDZXJyaSAoSUJNKV0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBBTVJ2OCBJU0EgY3J5cHRvIGV4dGVuc2lvbnMuIFRoaXMgY292ZXJzIEFFUywKICAgICBTSEExLCBTSEEyNTYgYW5kIEdIQVNILiAiSW5pdGlhbCIgbWVhbnMgdGhhdCBtb3N0IGNvbW1vbiBjYXNlcwogICAgIGFyZSBvcHRpbWl6ZWQgYW5kIHRoZXJlIHN0aWxsIGlzIHJvb20gZm9yIGZ1cnRoZXIgaW1wcm92ZW1lbnRzLgogICAgIEJvdGggMzItIGFuZCA2NC1iaXQgbW9kZXMgYXJlIHN1cHBvcnRlZC4KICAgICBbQW5keSBQb2x5YWtvdiwgQXJkIEJpZXNoZXV2ZWwgKExpbmFybyldCgogICopIEltcHJvdmVkIEFSTXY3IE5FT04gc3VwcG9ydC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgU3VwcG9ydCBmb3IgU1BBUkMgQXJjaGl0ZWN0dXJlIDIwMTEgY3J5cHRvIGV4dGVuc2lvbnMsIGZpcnN0CiAgICAgaW1wbGVtZW50ZWQgaW4gU1BBUkMgVDQuIFRoaXMgY292ZXJzIEFFUywgREVTLCBDYW1lbGxpYSwgU0hBMSwKICAgICBTSEEyNTYvNTEyLCBNRDUsIEdIQVNIIGFuZCBtb2R1bGFyIGV4cG9uZW50aWF0aW9uLgogICAgIFtBbmR5IFBvbHlha292LCBEYXZpZCBNaWxsZXJdCgogICopIEFjY2VsZXJhdGVkIG1vZHVsYXIgZXhwb25lbnRpYXRpb24gZm9yIEludGVsIHByb2Nlc3NvcnMsIGEuay5hLgogICAgIFJTQVouCiAgICAgW1NoYXkgR3Vlcm9uICYgVmxhZCBLcmFzbm92IChJbnRlbCBDb3JwKV0KCiAgKikgU3VwcG9ydCBmb3IgbmV3IGFuZCB1cGNvbWluZyBJbnRlbCBwcm9jZXNzb3JzLCBpbmNsdWRpbmcgQVZYMiwKICAgICBCTUkgYW5kIFNIQSBJU0EgZXh0ZW5zaW9ucy4gVGhpcyBpbmNsdWRlcyBhZGRpdGlvbmFsICJzdGl0Y2hlZCIKICAgICBpbXBsZW1lbnRhdGlvbnMsIEFFU05JLVNIQTI1NiBhbmQgR0NNLCBhbmQgbXVsdGktYnVmZmVyIHN1cHBvcnQKICAgICBmb3IgVExTIGVuY3J5cHQuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEludGVsIENvcnAuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIFN1cHBvcnQgZm9yIERUTFMgMS4yLiBUaGlzIGFkZHMgdHdvIHNldHMgb2YgRFRMUyBtZXRob2RzOiBEVExTXypfbWV0aG9kKCkKICAgICBzdXBwb3J0cyBib3RoIERUTFMgMS4yIGFuZCAxLjAgYW5kIHNob3VsZCB1c2Ugd2hhdGV2ZXIgdmVyc2lvbiB0aGUgcGVlcgogICAgIHN1cHBvcnRzIGFuZCBEVExTdjFfMl8qX21ldGhvZCgpIHdoaWNoIHN1cHBvcnRzIERUTFMgMS4yIG9ubHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIGFsZ29yaXRobSBzcGVjaWZpYyBjaGFpbnMgaW4gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSgpOgogICAgIHRoaXMgZml4ZXMgYSBsaW1pYXRpb24gaW4gcHJldmlvdXMgdmVyc2lvbnMgb2YgT3BlblNTTC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbmRlZCBSU0EgT0FFUCBzdXBwb3J0IHZpYSBFVlBfUEtFWSBBUEkuIE9wdGlvbnMgdG8gc3BlY2lmeSBkaWdlc3QsCiAgICAgTUdGMSBkaWdlc3QgYW5kIE9BRVAgbGFiZWwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIEVWUCBzdXBwb3J0IGZvciBrZXkgd3JhcHBpbmcgYWxnb3JpdGhtcywgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aAogICAgIGV4aXN0aW5nIGNvZGUgdGhlIGZsYWcgRVZQX0NJUEhFUl9DVFhfV1JBUF9BTExPVyBoYXMgdG8gYmUgc2V0IGluCiAgICAgdGhlIEVWUF9DSVBIRVJfQ1RYIG9yIGFuIGVycm9yIGlzIHJldHVybmVkLiBBZGQgQUVTIGFuZCBERVMzIHdyYXAKICAgICBhbGdvcml0aG1zIGFuZCBpbmNsdWRlIHRlc3RzIGNhc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdW5jdGlvbnMgdG8gYWxsb2NhdGUgYW5kIHNldCB0aGUgZmllbGRzIG9mIGFuIEVDRFNBX01FVEhPRAogICAgIHN0cnVjdHVyZS4KICAgICBbRG91Z2xhcyBFLiBFbmdlcnQsIFN0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBPUEVOU1NMX2dtdGltZV9kaWZmIGFuZCBBU04xX1RJTUVfZGlmZiB0byBmaW5kIHRoZQogICAgIGRpZmZlcmVuY2UgaW4gZGF5cyBhbmQgc2Vjb25kcyBiZXR3ZWVuIHR3byB0bSBvciBBU04xX1RJTUUgc3RydWN0dXJlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgLXJldiB0ZXN0IG9wdGlvbiB0byBzX3NlcnZlciB0byBqdXN0IHJldmVyc2Ugb3JkZXIgb2YgY2hhcmFjdGVycwogICAgIHJlY2VpdmVkIGJ5IGNsaWVudCBhbmQgc2VuZCBiYWNrIHRvIHNlcnZlci4gQWxzbyBwcmludHMgYW4gYWJicmV2aWF0ZWQKICAgICBzdW1tYXJ5IG9mIHRoZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbiAtYnJpZWYgZm9yIHNfY2xpZW50IGFuZCBzX3NlcnZlciB0byBwcmludCBvdXQgYSBicmllZiBzdW1tYXJ5CiAgICAgb2YgY29ubmVjdGlvbiBwYXJhbWV0ZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjYWxsYmFja3MgZm9yIGFyYml0cmFyeSBUTFMgZXh0ZW5zaW9ucy4KICAgICBbVHJldm9yIFBlcnJpbiA8dHJldnBAdHJldnAubmV0PiBhbmQgQmVuIExhdXJpZV0KCiAgKikgTmV3IG9wdGlvbiAtY3JsX2Rvd25sb2FkIGluIHNldmVyYWwgb3BlbnNzbCB1dGlsaXRpZXMgdG8gZG93bmxvYWQgQ1JMcwogICAgIGZyb20gQ1JMRFAgZXh0ZW5zaW9uIGluIGNlcnRpZmljYXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9ucyAtQ1JMIGFuZCAtQ1JMZm9ybSBmb3Igc19jbGllbnQgYW5kIHNfc2VydmVyIGZvciBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X0NSTF9kaWZmIHRvIGdlbmVyYXRlIGEgZGVsdGEgQ1JMIGZyb20gdGhlIGRpZmZlcmVuY2UKICAgICBvZiB0d28gZnVsbCBDUkxzLiBBZGQgc3VwcG9ydCB0byAiY3JsIiB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgdG8gc2V0IGxvb2t1cF9jcmxzIGZ1bmN0aW9uIGFuZCB0byByZXRyaWV2ZQogICAgIFg1MDlfU1RPUkUgZnJvbSBYNTA5X1NUT1JFX0NUWC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQcmludCBvdXQgZGVwcmVjYXRlZCBpc3N1ZXIgYW5kIHN1YmplY3QgdW5pcXVlIElEIGZpZWxkcyBpbgogICAgIGNlcnRpZmljYXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbmQgT0NTUCBJL08gZnVuY3Rpb25zIHNvIHRoZXkgY2FuIGJlIHVzZWQgZm9yIHNpbXBsZSBnZW5lcmFsIHB1cnBvc2UKICAgICBIVFRQIGFzIHdlbGwgYXMgT0NTUC4gTmV3IHdyYXBwZXIgZnVuY3Rpb24gd2hpY2ggY2FuIGJlIHVzZWQgdG8gZG93bmxvYWQKICAgICBDUkxzIHVzaW5nIHRoZSBPQ1NQIEFQSS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEZWxlZ2F0ZSBjb21tYW5kIGxpbmUgaGFuZGxpbmcgaW4gc19jbGllbnQvc19zZXJ2ZXIgdG8gU1NMX0NPTkYgQVBJcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTU0xfQ09ORiogZnVuY3Rpb25zLiBUaGVzZSBwcm92aWRlIGEgY29tbW9uIGZyYW1ld29yayBmb3IgYXBwbGljYXRpb24KICAgICBjb25maWd1cmF0aW9uIHVzaW5nIGNvbmZpZ3VyYXRpb24gZmlsZXMgb3IgY29tbWFuZCBsaW5lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTU0wvVExTIHRyYWNpbmcgY29kZS4gVGhpcyBwYXJzZXMgb3V0IFNTTC9UTFMgcmVjb3JkcyB1c2luZyB0aGUKICAgICBtZXNzYWdlIGNhbGxiYWNrIGFuZCBwcmludHMgdGhlIHJlc3VsdHMuIE5lZWRzIGNvbXBpbGUgdGltZSBvcHRpb24KICAgICAiZW5hYmxlLXNzbC10cmFjZSIuIE5ldyBvcHRpb25zIHRvIHNfY2xpZW50IGFuZCBzX3NlcnZlciB0byBlbmFibGUKICAgICB0cmFjaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBjdHJsIGFuZCBtYWNybyB0byByZXRyaWV2ZSBzdXBwb3J0ZWQgcG9pbnRzIGV4dGVuc2lvbnMuCiAgICAgUHJpbnQgb3V0IGV4dGVuc2lvbiBpbiBzX3NlcnZlciBhbmQgc19jbGllbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyB0byByZXRyaWV2ZSBjZXJ0aWZpY2F0ZSBzaWduYXR1cmUgYW5kIHNpZ25hdHVyZQogICAgIE9JRCBOSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9ucyB0byByZXRyaWV2ZSBhbmQgbWFuaXB1bGF0ZSB0aGUgcmF3IGNpcGhlcmxpc3Qgc2VudCBieSBhCiAgICAgY2xpZW50IHRvIE9wZW5TU0wuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IFN1aXRlIEIgbW9kZXMgZm9yIFRMUyBjb2RlLiBUaGVzZSB1c2UgYW5kIGVuZm9yY2UgdGhlIHJlcXVpcmVtZW50cwogICAgIG9mIFJGQzY0NjA6IHJlc3RyaWN0IGNpcGhlcnN1aXRlcywgb25seSBwZXJtaXQgU3VpdGUgQiBhbGdvcml0aG1zIGFuZAogICAgIG9ubHkgdXNlIFN1aXRlIEIgY3VydmVzLiBUaGUgU3VpdGUgQiBtb2RlcyBjYW4gYmUgc2V0IGJ5IHVzaW5nIHRoZQogICAgIHN0cmluZ3MgIlNVSVRFQjEyOCIsICJTVUlURUIxOTIiIG9yICJTVUlURUIxMjhPTkxZIiBmb3IgdGhlIGNpcGhlcnN0cmluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgY2hhaW4gdmVyaWZpY2F0aW9uIGZsYWdzIGZvciBTdWl0ZSBCIGxldmVscyBvZiBzZWN1cml0eS4gQ2hlY2sKICAgICBhbGdvcml0aG1zIGFyZSBhY2NlcHRhYmxlIHdoZW4gZmxhZ3MgYXJlIHNldCBpbiBYNTA5X3ZlcmlmeV9jZXJ0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgdGxzMV9jaGVja19jaGFpbiByZXR1cm4gYSBzZXQgb2YgZmxhZ3MgaW5kaWNhdGluZyBjaGVja3MgcGFzc2VkCiAgICAgYnkgYSBjZXJ0aWZpY2F0ZSBjaGFpbi4gQWRkIGFkZGl0aW9uYWwgdGVzdHMgdG8gaGFuZGxlIGNsaWVudAogICAgIGNlcnRpZmljYXRlczogY2hlY2tzIGZvciBtYXRjaGluZyBjZXJ0aWZpY2F0ZSB0eXBlIGFuZCBpc3N1ZXIgbmFtZQogICAgIGNvbXBhcmlzb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHVzZSBhIHNpZ25hdHVyZSBhbGdvcml0aG0gbm90IGluIHRoZSBwZWVyCiAgICAgcHJlZmVyZW5jZSBsaXN0IGFib3J0IHRoZSBoYW5kc2hha2UuIElmIGNsaWVudCBoYXMgbm8gc3VpdGFibGUKICAgICBzaWduYXR1cmUgYWxnb3JpdGhtcyBpbiByZXNwb25zZSB0byBhIGNlcnRpZmljYXRlIHJlcXVlc3QgZG8gbm90CiAgICAgdXNlIHRoZSBjZXJ0aWZpY2F0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJZiBzZXJ2ZXIgRUMgdG1wIGtleSBpcyBub3QgaW4gY2xpZW50IHByZWZlcmVuY2UgbGlzdCBhYm9ydCBoYW5kc2hha2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIHN0b3JlcyBpbiBDRVJUIHN0cnVjdHVyZS4gVGhpcyBtYWtlcyBpdAogICAgIHBvc3NpYmxlIHRvIGhhdmUgZGlmZmVyZW50IHN0b3JlcyBwZXIgU1NMIHN0cnVjdHVyZSBvciBvbmUgc3RvcmUgaW4KICAgICB0aGUgcGFyZW50IFNTTF9DVFguIEluY2x1ZGUgZGlzdGludCBzdG9yZXMgZm9yIGNlcnRpZmljYXRlIGNoYWluCiAgICAgdmVyaWZpY2F0aW9uIGFuZCBjaGFpbiBidWlsZGluZy4gTmV3IGN0cmwgU1NMX0NUUkxfQlVJTERfQ0VSVF9DSEFJTgogICAgIHRvIGJ1aWxkIGFuZCBzdG9yZSBhIGNlcnRpZmljYXRlIGNoYWluIGluIENFUlQgc3RydWN0dXJlOiByZXR1cmluZwogICAgIGFuIGVycm9yIGlmIHRoZSBjaGFpbiBjYW5ub3QgYmUgYnVpbHQ6IHRoaXMgd2lsbCBhbGxvdyBhcHBsaWNhdGlvbnMKICAgICB0byB0ZXN0IGlmIGEgY2hhaW4gaXMgY29ycmVjdGx5IGNvbmZpZ3VyZWQuCgogICAgIE5vdGU6IGlmIHRoZSBDRVJUIGJhc2VkIHN0b3JlcyBhcmUgbm90IHNldCB0aGVuIHRoZSBwYXJlbnQgU1NMX0NUWAogICAgIHN0b3JlIGlzIHVzZWQgdG8gcmV0YWluIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBiZWhhdmlvdXIuCgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBzc2xfc2V0X2NsaWVudF9kaXNhYmxlZCB0byBzZXQgYSBjaXBoZXJzdWl0ZSBkaXNhYmxlZAogICAgIG1hc2sgYmFzZWQgb24gdGhlIGN1cnJlbnQgc2Vzc2lvbiwgY2hlY2sgbWFzayB3aGVuIHNlbmRpbmcgY2xpZW50CiAgICAgaGVsbG8gYW5kIGNoZWNraW5nIHRoZSByZXF1ZXN0ZWQgY2lwaGVyc3VpdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGN0cmxzIHRvIHJldHJpZXZlIGFuZCBzZXQgY2VydGlmaWNhdGUgdHlwZXMgaW4gYSBjZXJ0aWZpY2F0ZQogICAgIHJlcXVlc3QgbWVzc2FnZS4gUHJpbnQgb3V0IHJlY2VpdmVkIHZhbHVlcyBpbiBzX2NsaWVudC4gSWYgY2VydGlmaWNhdGUKICAgICB0eXBlcyBpcyBub3Qgc2V0IHdpdGggY3VzdG9tIHZhbHVlcyBzZXQgc2Vuc2libGUgdmFsdWVzIGJhc2VkIG9uCiAgICAgc3VwcG9ydGVkIHNpZ25hdHVyZSBhbGdvcml0aG1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIGRpc3RpbmN0IGNsaWVudCBhbmQgc2VydmVyIHN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY2VydGlmaWNhdGUgY2FsbGJhY2suIElmIHNldCB0aGlzIGlzIGNhbGxlZCB3aGVuZXZlciBhIGNlcnRpZmljYXRlCiAgICAgaXMgcmVxdWlyZWQgYnkgY2xpZW50IG9yIHNlcnZlci4gQW4gYXBwbGljYXRpb24gY2FuIGRlY2lkZSB3aGljaAogICAgIGNlcnRpZmljYXRlIGNoYWluIHRvIHByZXNlbnQgYmFzZWQgb24gYXJiaXRyYXJ5IGNyaXRlcmlhOiBmb3IgZXhhbXBsZQogICAgIHN1cHBvcnRlZCBzaWduYXR1cmUgYWxnb3JpdGhtcy4gQWRkIHZlcnkgc2ltcGxlIGV4YW1wbGUgdG8gc19zZXJ2ZXIuCiAgICAgVGhpcyBmaXhlcyBtYW55IG9mIHRoZSBwcm9ibGVtcyBhbmQgcmVzdHJpY3Rpb25zIG9mIHRoZSBleGlzdGluZyBjbGllbnQKICAgICBjZXJ0aWZpY2F0ZSBjYWxsYmFjazogZm9yIGV4YW1wbGUgeW91IGNhbiBub3cgY2xlYXIgYW4gZXhpc3RpbmcKICAgICBjZXJ0aWZpY2F0ZSBhbmQgc3BlY2lmeSB0aGUgd2hvbGUgY2hhaW4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyAidmFsaWRfZmxhZ3MiIGZpZWxkIHRvIENFUlRfUEtFWSBzdHJ1Y3R1cmUgd2hpY2ggZGV0ZXJtaW5lcyB3aGF0CiAgICAgdGhlIGNlcnRpZmljYXRlIGNhbiBiZSB1c2VkIGZvciAoaWYgYW55dGhpbmcpLiBTZXQgdmFsaWRfZmxhZ3MgZmllbGQgCiAgICAgaW4gbmV3IHRsczFfY2hlY2tfY2hhaW4gZnVuY3Rpb24uIFNpbXBsaWZ5IHNzbF9zZXRfY2VydF9tYXNrcyB3aGljaCB1c2VkCiAgICAgdG8gaGF2ZSBzaW1pbGFyIGNoZWNrcyBpbiBpdC4KCiAgICAgQWRkIG5ldyAiY2VydF9mbGFncyIgZmllbGQgdG8gQ0VSVCBzdHJ1Y3R1cmUgYW5kIGluY2x1ZGUgYSAic3RyaWN0IG1vZGUiLgogICAgIFRoaXMgZW5mb3JjZXMgc29tZSBUTFMgY2VydGlmaWNhdGUgcmVxdWlyZW1lbnRzIChzdWNoIGFzIG9ubHkgcGVybWl0dGluZwogICAgIGNlcnRpZmljYXRlIHNpZ25hdHVyZSBhbGdvcml0aG1zIGNvbnRhaW5lZCBpbiB0aGUgc3VwcG9ydGVkIGFsZ29yaXRobXMKICAgICBleHRlbnNpb24pIHdoaWNoIHNvbWUgaW1wbGVtZW50YXRpb25zIGlnbm9yZTogdGhpcyBvcHRpb24gc2hvdWxkIGJlIHVzZWQKICAgICB3aXRoIGNhdXRpb24gYXMgaXQgY291bGQgY2F1c2UgaW50ZXJvcGVyYWJpbGl0eSBpc3N1ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIGFuZCB0aWR5IHNpZ25hdHVyZSBhbGdvcml0aG0gZXh0ZW5zaW9uIHByb2Nlc3NpbmcuIFdvcmsgb3V0CiAgICAgc2hhcmVkIHNpZ25hdHVyZSBhbGdvcml0aG1zIGJhc2VkIG9uIHByZWZlcmVuY2VzIGFuZCBwZWVyIGFsZ29yaXRobXMKICAgICBhbmQgcHJpbnQgdGhlbSBvdXQgaW4gc19jbGllbnQgYW5kIHNfc2VydmVyLiBBYm9ydCBoYW5kc2hha2UgaWYgbm8KICAgICBzaGFyZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbnMgdG8gYWxsb3cgY3VzdG9taXNlZCBzdXBwb3J0ZWQgc2lnbmF0dXJlIGFsZ29yaXRobXMKICAgICBmb3IgU1NMIGFuZCBTU0xfQ1RYIHN0cnVjdHVyZXMuIEFkZCBvcHRpb25zIHRvIHNfY2xpZW50IGFuZCBzX3NlcnZlcgogICAgIHRvIHN1cHBvcnQgdGhlbS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gU1NMX2NlcnRzX2NsZWFyKCkgdG8gZGVsZXRlIGFsbCByZWZlcmVuY2VzIHRvIGNlcnRpZmljYXRlcwogICAgIGZyb20gYW4gU1NMIHN0cnVjdHVyZS4gQmVmb3JlIHRoaXMgb25jZSBhIGNlcnRpZmljYXRlIGhhZCBiZWVuIGFkZGVkCiAgICAgaXQgY291bGRuJ3QgYmUgcmVtb3ZlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbnRlZ3JhdGUgaG9zdG5hbWUsIGVtYWlsIGFkZHJlc3MgYW5kIElQIGFkZHJlc3MgY2hlY2tpbmcgd2l0aCBjZXJ0aWZpY2F0ZQogICAgIHZlcmlmaWNhdGlvbi4gTmV3IHZlcmlmeSBvcHRpb25zIHN1cHBvcnRpbmcgY2hlY2tpbmcgaW4gb3BlbnNsIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgYW5kIHdpbGRjYXJkIG1hdGNoaW5nIHN1cHBvcnQgdG8gaG9zdG5hbWUgYW5kIGVtYWlsIGNoZWNraW5nCiAgICAgZnVuY3Rpb25zLiBBZGQgbWFudWFsIHBhZ2UuCiAgICAgW0Zsb3JpYW4gV2VpbWVyIChSZWQgSGF0IFByb2R1Y3QgU2VjdXJpdHkgVGVhbSldCgogICopIE5ldyBmdW5jdGlvbnMgdG8gY2hlY2sgYSBob3N0bmFtZSBlbWFpbCBvciBJUCBhZGRyZXNzIGFnYWluc3QgYQogICAgIGNlcnRpZmljYXRlLiBBZGQgb3B0aW9ucyB4NTA5IHV0aWxpdHkgdG8gcHJpbnQgcmVzdWx0cyBvZiBjaGVja3MgYWdhaW5zdAogICAgIGEgY2VydGlmaWNhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IE9DU1AgY2hlY2tpbmcuCiAgICAgW1JvYiBTdHJhZGxpbmcgPHJvYi5zdHJhZGxpbmdAY29tb2RvLmNvbT4gYW5kIEJlbiBMYXVyaWVdCgogICopIEluaXRpYWwgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGV4cGxpY2l0bHkgdHJ1c3RlZCBub24tcm9vdCBDQXMuIAogICAgIE9wZW5TU0wgc3RpbGwgdHJpZXMgdG8gYnVpbGQgYSBjb21wbGV0ZSBjaGFpbiB0byBhIHJvb3QgYnV0IGlmIGFuCiAgICAgaW50ZXJtZWRpYXRlIENBIGhhcyBhIHRydXN0IHNldHRpbmcgaW5jbHVkZWQgdGhhdCBpcyB1c2VkLiBUaGUgZmlyc3QKICAgICBzZXR0aW5nIGlzIHVzZWQ6IHdoZXRoZXIgdG8gdHJ1c3QgKGUuZy4sIC1hZGR0cnVzdCBvcHRpb24gdG8gdGhlIHg1MDkKICAgICB1dGlsaXR5KSBvciByZWplY3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIC10cnVzdGVkX2ZpcnN0IG9wdGlvbiB3aGljaCBhdHRlbXB0cyB0byBmaW5kIGNlcnRpZmljYXRlcyBpbiB0aGUKICAgICB0cnVzdGVkIHN0b3JlIGV2ZW4gaWYgYW4gdW50cnVzdGVkIGNoYWluIGlzIGFsc28gc3VwcGxpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTUlQUyBhc3NlbWJseSBwYWNrIHVwZGF0ZXM6IHN1cHBvcnQgZm9yIE1JUFMzMnIyIGFuZCBTbWFydE1JUFMgQVNFLAogICAgIHBsYXRmb3JtIHN1cHBvcnQgZm9yIExpbnV4IGFuZCBBbmRyb2lkLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBTdXBwb3J0IGZvciBsaW51eC14MzIsIElMUDMyIGVudmlyb25tZW50IGluIHg4Nl82NCBmcmFtZXdvcmsuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEV4cGVyaW1lbnRhbCBtdWx0aS1pbXBsZW1lbnRhdGlvbiBzdXBwb3J0IGZvciBGSVBTIGNhcGFibGUgT3BlblNTTC4KICAgICBXaGVuIGluIEZJUFMgbW9kZSB0aGUgYXBwcm92ZWQgaW1wbGVtZW50YXRpb25zIGFyZSB1c2VkIGFzIG5vcm1hbCwKICAgICB3aGVuIG5vdCBpbiBGSVBTIG1vZGUgdGhlIGludGVybmFsIHVuYXBwcm92ZWQgdmVyc2lvbnMgYXJlIHVzZWQgaW5zdGVhZC4KICAgICBUaGlzIG1lYW5zIHRoYXQgdGhlIEZJUFMgY2FwYWJsZSBPcGVuU1NMIGlzbid0IGZvcmNlZCB0byB1c2UgdGhlCiAgICAgKG9mdGVuIGxvd2VyIHBlcmZvcm1hbmNlKSBGSVBTIGltcGxlbWVudGF0aW9ucyBvdXRzaWRlIEZJUFMgbW9kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUcmFuc3BhcmVudGx5IHN1cHBvcnQgWDkuNDIgREggcGFyYW1ldGVycyB3aGVuIGNhbGxpbmcKICAgICBQRU1fcmVhZF9iaW9fREhwYXJhbWV0ZXJzLiBUaGlzIG1lYW5zIGV4aXN0aW5nIGFwcGxpY2F0aW9ucyBjYW4gaGFuZGxlCiAgICAgdGhlIG5ldyBwYXJhbWV0ZXIgZm9ybWF0IGF1dG9tYXRpY2FsbHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBleHBlcmltZW50YWwgc3VwcG9ydCBmb3IgWDkuNDIgREggcGFyYW1ldGVyIGZvcm1hdDogbWFpbmx5CiAgICAgdG8gc3VwcG9ydCB1c2Ugb2YgJ3EnIHBhcmFtZXRlciBmb3IgUkZDNTExNCBwYXJhbWV0ZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBESCBwYXJhbWV0ZXJzIGZyb20gUkZDNTExNCBpbmNsdWRpbmcgdGVzdCBkYXRhIHRvIGRodGVzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBhdXRvbWF0aWMgRUMgdGVtcG9yYXJ5IGtleSBwYXJhbWV0ZXIgc2VsZWN0aW9uLiBJZiBlbmFibGVkCiAgICAgdGhlIG1vc3QgcHJlZmVycmVkIEVDIHBhcmFtZXRlcnMgYXJlIGF1dG9tYXRpY2FsbHkgdXNlZCBpbnN0ZWFkIG9mCiAgICAgaGFyZGNvZGVkIGZpeGVkIHBhcmFtZXRlcnMuIE5vdyBhIHNlcnZlciBqdXN0IGhhcyB0byBjYWxsOgogICAgIFNTTF9DVFhfc2V0X2VjZGhfYXV0byhjdHgsIDEpIGFuZCB0aGUgc2VydmVyIHdpbGwgYXV0b21hdGljYWxseQogICAgIHN1cHBvcnQgRUNESCBhbmQgdXNlIHRoZSBtb3N0IGFwcHJvcHJpYXRlIHBhcmFtZXRlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSBhbmQgdGlkeSBFQyBjdXJ2ZSBhbmQgcG9pbnQgZm9ybWF0IFRMUyBleHRlbnNpb24gY29kZS4gVXNlCiAgICAgc3RhdGljIHN0cnVjdHVyZXMgaW5zdGVhZCBvZiBhbGxvY2F0aW9uIGlmIGRlZmF1bHQgdmFsdWVzIGFyZSB1c2VkLgogICAgIE5ldyBjdHJscyB0byBzZXQgY3VydmVzIHdlIHdpc2ggdG8gc3VwcG9ydCBhbmQgdG8gcmV0cmlldmUgc2hhcmVkIGN1cnZlcy4KICAgICBQcmludCBvdXQgc2hhcmVkIGN1cnZlcyBpbiBzX3NlcnZlci4gTmV3IG9wdGlvbnMgdG8gc19zZXJ2ZXIgYW5kIHNfY2xpZW50CiAgICAgdG8gc2V0IGxpc3Qgb2Ygc3VwcG9ydGVkIGN1cnZlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgY3RybHMgdG8gcmV0cmlldmUgc3VwcG9ydGVkIHNpZ25hdHVyZSBhbGdvcml0aG1zIGFuZCAKICAgICBzdXBwb3J0ZWQgY3VydmUgdmFsdWVzIGFzIGFuIGFycmF5IG9mIE5JRHMuIEV4dGVuZCBvcGVuc3NsIHV0aWxpdHkKICAgICB0byBwcmludCBvdXQgcmVjZWl2ZWQgdmFsdWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgQVBJcyBFQ19jdXJ2ZV9uaXN0Mm5pZCBhbmQgRUNfY3VydmVfbmlkMm5pc3Qgd2hpY2ggY29udmVydAogICAgIGJldHdlZW4gTklEcyBhbmQgdGhlIG1vcmUgY29tbW9uIE5JU1QgbmFtZXMgc3VjaCBhcyAiUC0yNTYiLiBFbmhhbmNlCiAgICAgZWNwYXJhbSB1dGlsaXR5IGFuZCBFQ0MgbWV0aG9kIHRvIHJlY29nbmlzZSB0aGUgTklTVCBuYW1lcyBmb3IgY3VydmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgU1NML1RMUyBjZXJ0aWZpY2F0ZSBjaGFpbiBoYW5kbGluZyB0byBzdXBwb3J0IGRpZmZlcmVudAogICAgIGNoYWlucyBmb3IgZWFjaCBjZXJ0aWZpY2F0ZSBpbnN0ZWFkIG9mIG9uZSBjaGFpbiBpbiB0aGUgcGFyZW50IFNTTF9DVFguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgZml4ZWQgREggY2lwaGVyc3VpdGUgY2xpZW50IGF1dGhlbnRpY2F0aW9uOiB3aGVyZSBib3RoCiAgICAgc2VydmVyIGFuZCBjbGllbnQgdXNlIERIIGNlcnRpZmljYXRlcyB3aXRoIGNvbW1vbiBwYXJhbWV0ZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIGZpeGVkIERIIGNpcGhlcnN1aXRlczogdGhvc2UgcmVxdWlyaW5nIERIIHNlcnZlcgogICAgIGNlcnRpZmljYXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gaTJkX3JlX1g1MDlfdGJzIGZvciByZS1lbmNvZGluZyB0aGUgVEJTIHBvcnRpb24gb2YKICAgICB0aGUgY2VydGlmaWNhdGUuCiAgICAgTm90ZTogUmVsYXRlZCAxLjAuMi1iZXRhIHNwZWNpZmljIG1hY3JvcyBYNTA5X2dldF9jZXJ0X2luZm8sCiAgICAgWDUwOV9DSU5GX3NldF9tb2RpZmllZCwgWDUwOV9DSU5GX2dldF9pc3N1ZXIsIFg1MDlfQ0lORl9nZXRfZXh0ZW5zaW9ucyBhbmQKICAgICBYNTA5X0NJTkZfZ2V0X3NpZ25hdHVyZSB3ZXJlIHJldmVydGVkIHBvc3QgaW50ZXJuYWwgdGVhbSByZXZpZXcuCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xayBhbmQgMS4wLjFsIFsxNSBKYW4gMjAxNV0KCiAgKikgQnVpbGQgZml4ZXMgZm9yIHRoZSBXaW5kb3dzIGFuZCBPcGVuVk1TIHBsYXRmb3JtcwogICAgIFtNYXR0IENhc3dlbGwgYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFqIGFuZCAxLjAuMWsgWzggSmFuIDIwMTVdCgogICopIEZpeCBEVExTIHNlZ21lbnRhdGlvbiBmYXVsdCBpbiBkdGxzMV9nZXRfcmVjb3JkLiBBIGNhcmVmdWxseSBjcmFmdGVkIERUTFMKICAgICBtZXNzYWdlIGNhbiBjYXVzZSBhIHNlZ21lbnRhdGlvbiBmYXVsdCBpbiBPcGVuU1NMIGR1ZSB0byBhIE5VTEwgcG9pbnRlcgogICAgIGRlcmVmZXJlbmNlLiBUaGlzIGNvdWxkIGxlYWQgdG8gYSBEZW5pYWwgT2YgU2VydmljZSBhdHRhY2suIFRoYW5rcyB0bwogICAgIE1hcmt1cyBTdGVuYmVyZyBvZiBDaXNjbyBTeXN0ZW1zLCBJbmMuIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzU3MSkKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggRFRMUyBtZW1vcnkgbGVhayBpbiBkdGxzMV9idWZmZXJfcmVjb3JkLiBBIG1lbW9yeSBsZWFrIGNhbiBvY2N1ciBpbiB0aGUKICAgICBkdGxzMV9idWZmZXJfcmVjb3JkIGZ1bmN0aW9uIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucy4gSW4gcGFydGljdWxhciB0aGlzCiAgICAgY291bGQgb2NjdXIgaWYgYW4gYXR0YWNrZXIgc2VudCByZXBlYXRlZCBEVExTIHJlY29yZHMgd2l0aCB0aGUgc2FtZQogICAgIHNlcXVlbmNlIG51bWJlciBidXQgZm9yIHRoZSBuZXh0IGVwb2NoLiBUaGUgbWVtb3J5IGxlYWsgY291bGQgYmUgZXhwbG9pdGVkCiAgICAgYnkgYW4gYXR0YWNrZXIgaW4gYSBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2sgdGhyb3VnaCBtZW1vcnkgZXhoYXVzdGlvbi4KICAgICBUaGFua3MgdG8gQ2hyaXMgTXVlbGxlciBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE1LTAyMDYpCiAgICAgW01hdHQgQ2Fzd2VsbF0KCiAgKikgRml4IGlzc3VlIHdoZXJlIG5vLXNzbDMgY29uZmlndXJhdGlvbiBzZXRzIG1ldGhvZCB0byBOVUxMLiBXaGVuIG9wZW5zc2wgaXMKICAgICBidWlsdCB3aXRoIHRoZSBuby1zc2wzIG9wdGlvbiBhbmQgYSBTU0wgdjMgQ2xpZW50SGVsbG8gaXMgcmVjZWl2ZWQgdGhlIHNzbAogICAgIG1ldGhvZCB3b3VsZCBiZSBzZXQgdG8gTlVMTCB3aGljaCBjb3VsZCBsYXRlciByZXN1bHQgaW4gYSBOVUxMIHBvaW50ZXIKICAgICBkZXJlZmVyZW5jZS4gVGhhbmtzIHRvIEZyYW5rIFNjaG1pcmxlciBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1NjkpCiAgICAgW0t1cnQgUm9lY2t4XQoKICAqKSBBYm9ydCBoYW5kc2hha2UgaWYgc2VydmVyIGtleSBleGNoYW5nZSBtZXNzYWdlIGlzIG9taXR0ZWQgZm9yIGVwaGVtZXJhbAogICAgIEVDREggY2lwaGVyc3VpdGVzLgoKICAgICBUaGFua3MgdG8gS2FydGhpa2V5YW4gQmhhcmdhdmFuIG9mIHRoZSBQUk9TRUNDTyB0ZWFtIGF0IElOUklBIGZvcgogICAgIHJlcG9ydGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTcyKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSBub24tZXhwb3J0IGVwaGVtZXJhbCBSU0EgY29kZSBvbiBjbGllbnQgYW5kIHNlcnZlci4gVGhpcyBjb2RlCiAgICAgdmlvbGF0ZWQgdGhlIFRMUyBzdGFuZGFyZCBieSBhbGxvd2luZyB0aGUgdXNlIG9mIHRlbXBvcmFyeSBSU0Ega2V5cyBpbgogICAgIG5vbi1leHBvcnQgY2lwaGVyc3VpdGVzIGFuZCBjb3VsZCBiZSB1c2VkIGJ5IGEgc2VydmVyIHRvIGVmZmVjdGl2ZWx5CiAgICAgZG93bmdyYWRlIHRoZSBSU0Ega2V5IGxlbmd0aCB1c2VkIHRvIGEgdmFsdWUgc21hbGxlciB0aGFuIHRoZSBzZXJ2ZXIKICAgICBjZXJ0aWZpY2F0ZS4gVGhhbmtzIGZvciBLYXJ0aGlrZXlhbiBCaGFyZ2F2YW4gb2YgdGhlIFBST1NFQ0NPIHRlYW0gYXQKICAgICBJTlJJQSBvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTUtMDIwNCkKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlZCBpc3N1ZSB3aGVyZSBESCBjbGllbnQgY2VydGlmaWNhdGVzIGFyZSBhY2NlcHRlZCB3aXRob3V0IHZlcmlmaWNhdGlvbi4KICAgICBBbiBPcGVuU1NMIHNlcnZlciB3aWxsIGFjY2VwdCBhIERIIGNlcnRpZmljYXRlIGZvciBjbGllbnQgYXV0aGVudGljYXRpb24KICAgICB3aXRob3V0IHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZnkgbWVzc2FnZS4gVGhpcyBlZmZlY3RpdmVseSBhbGxvd3MgYSBjbGllbnQgdG8KICAgICBhdXRoZW50aWNhdGUgd2l0aG91dCB0aGUgdXNlIG9mIGEgcHJpdmF0ZSBrZXkuIFRoaXMgb25seSBhZmZlY3RzIHNlcnZlcnMKICAgICB3aGljaCB0cnVzdCBhIGNsaWVudCBjZXJ0aWZpY2F0ZSBhdXRob3JpdHkgd2hpY2ggaXNzdWVzIGNlcnRpZmljYXRlcwogICAgIGNvbnRhaW5pbmcgREgga2V5czogdGhlc2UgYXJlIGV4dHJlbWVseSByYXJlIGFuZCBoYXJkbHkgZXZlciBlbmNvdW50ZXJlZC4KICAgICBUaGFua3MgZm9yIEthcnRoaWtleWFuIEJoYXJnYXZhbiBvZiB0aGUgUFJPU0VDQ08gdGVhbSBhdCBJTlJJQSBvciByZXBvcnRpbmcKICAgICB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNS0wMjA1KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEVuc3VyZSB0aGF0IHRoZSBzZXNzaW9uIElEIGNvbnRleHQgb2YgYW4gU1NMIGlzIHVwZGF0ZWQgd2hlbiBpdHMKICAgICBTU0xfQ1RYIGlzIHVwZGF0ZWQgdmlhIFNTTF9zZXRfU1NMX0NUWC4KCiAgICAgVGhlIHNlc3Npb24gSUQgY29udGV4dCBpcyB0eXBpY2FsbHkgc2V0IGZyb20gdGhlIHBhcmVudCBTU0xfQ1RYLAogICAgIGFuZCBjYW4gdmFyeSB3aXRoIHRoZSBDVFguCiAgICAgW0FkYW0gTGFuZ2xleV0KCiAgKikgRml4IHZhcmlvdXMgY2VydGlmaWNhdGUgZmluZ2VycHJpbnQgaXNzdWVzLgoKICAgICBCeSB1c2luZyBub24tREVSIG9yIGludmFsaWQgZW5jb2RpbmdzIG91dHNpZGUgdGhlIHNpZ25lZCBwb3J0aW9uIG9mIGEKICAgICBjZXJ0aWZpY2F0ZSB0aGUgZmluZ2VycHJpbnQgY2FuIGJlIGNoYW5nZWQgd2l0aG91dCBicmVha2luZyB0aGUgc2lnbmF0dXJlLgogICAgIEFsdGhvdWdoIG5vIGRldGFpbHMgb2YgdGhlIHNpZ25lZCBwb3J0aW9uIG9mIHRoZSBjZXJ0aWZpY2F0ZSBjYW4gYmUgY2hhbmdlZAogICAgIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggc29tZSBhcHBsaWNhdGlvbnM6IGUuZy4gdGhvc2UgdXNpbmcgdGhlCiAgICAgY2VydGlmaWNhdGUgZmluZ2VycHJpbnQgZm9yIGJsYWNrbGlzdHMuCgogICAgIDEuIFJlamVjdCBzaWduYXR1cmVzIHdpdGggbm9uIHplcm8gdW51c2VkIGJpdHMuCgogICAgIElmIHRoZSBCSVQgU1RSSU5HIGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZSBoYXMgbm9uIHplcm8gdW51c2VkIGJpdHMgcmVqZWN0CiAgICAgdGhlIHNpZ25hdHVyZS4gQWxsIGN1cnJlbnQgc2lnbmF0dXJlIGFsZ29yaXRobXMgcmVxdWlyZSB6ZXJvIHVudXNlZCBiaXRzLgoKICAgICAyLiBDaGVjayBjZXJ0aWZpY2F0ZSBhbGdvcml0aG0gY29uc2lzdGVuY3kuCgogICAgIENoZWNrIHRoZSBBbGdvcml0aG1JZGVudGlmaWVyIGluc2lkZSBUQlMgbWF0Y2hlcyB0aGUgb25lIGluIHRoZQogICAgIGNlcnRpZmljYXRlIHNpZ25hdHVyZS4gTkI6IHRoaXMgd2lsbCByZXN1bHQgaW4gc2lnbmF0dXJlIGZhaWx1cmUKICAgICBlcnJvcnMgZm9yIHNvbWUgYnJva2VuIGNlcnRpZmljYXRlcy4KCiAgICAgVGhhbmtzIHRvIEtvbnJhZCBLcmFzemV3c2tpIGZyb20gR29vZ2xlIGZvciByZXBvcnRpbmcgdGhpcyBpc3N1ZS4KCiAgICAgMy4gQ2hlY2sgRFNBL0VDRFNBIHNpZ25hdHVyZXMgdXNlIERFUi4KCiAgICAgUmVlbmNvZGUgRFNBL0VDRFNBIHNpZ25hdHVyZXMgYW5kIGNvbXBhcmUgd2l0aCB0aGUgb3JpZ2luYWwgcmVjZWl2ZWQKICAgICBzaWduYXR1cmUuIFJldHVybiBhbiBlcnJvciBpZiB0aGVyZSBpcyBhIG1pc21hdGNoLgoKICAgICBUaGlzIHdpbGwgcmVqZWN0IHZhcmlvdXMgY2FzZXMgaW5jbHVkaW5nIGdhcmJhZ2UgYWZ0ZXIgc2lnbmF0dXJlCiAgICAgKHRoYW5rcyB0byBBbnR0aSBLYXJqYWxhaW5lbiBhbmQgVHVvbW8gVW50aW5lbiBmcm9tIHRoZSBDb2Rlbm9taWNvbiBDUk9TUwogICAgIHByb2dyYW0gZm9yIGRpc2NvdmVyaW5nIHRoaXMgY2FzZSkgYW5kIHVzZSBvZiBCRVIgb3IgaW52YWxpZCBBU04uMSBJTlRFR0VScwogICAgIChuZWdhdGl2ZSBvciB3aXRoIGxlYWRpbmcgemVyb2VzKS4KCiAgICAgRnVydGhlciBhbmFseXNpcyB3YXMgY29uZHVjdGVkIGFuZCBmaXhlcyB3ZXJlIGRldmVsb3BlZCBieSBTdGVwaGVuIEhlbnNvbgogICAgIG9mIHRoZSBPcGVuU1NMIGNvcmUgdGVhbS4KCiAgICAgKENWRS0yMDE0LTgyNzUpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgICopIENvcnJlY3QgQmlnbnVtIHNxdWFyaW5nLiBCaWdudW0gc3F1YXJpbmcgKEJOX3NxcikgbWF5IHByb2R1Y2UgaW5jb3JyZWN0CiAgICAgIHJlc3VsdHMgb24gc29tZSBwbGF0Zm9ybXMsIGluY2x1ZGluZyB4ODZfNjQuIFRoaXMgYnVnIG9jY3VycyBhdCByYW5kb20KICAgICAgd2l0aCBhIHZlcnkgbG93IHByb2JhYmlsaXR5LCBhbmQgaXMgbm90IGtub3duIHRvIGJlIGV4cGxvaXRhYmxlIGluIGFueQogICAgICB3YXksIHRob3VnaCBpdHMgZXhhY3QgaW1wYWN0IGlzIGRpZmZpY3VsdCB0byBkZXRlcm1pbmUuIFRoYW5rcyB0byBQaWV0ZXIKICAgICAgV3VpbGxlIChCbG9ja3N0cmVhbSkgd2hvIHJlcG9ydGVkIHRoaXMgaXNzdWUgYW5kIGFsc28gc3VnZ2VzdGVkIGFuIGluaXRpYWwKICAgICAgZml4LiBGdXJ0aGVyIGFuYWx5c2lzIHdhcyBjb25kdWN0ZWQgYnkgdGhlIE9wZW5TU0wgZGV2ZWxvcG1lbnQgdGVhbSBhbmQKICAgICAgQWRhbSBMYW5nbGV5IG9mIEdvb2dsZS4gVGhlIGZpbmFsIGZpeCB3YXMgZGV2ZWxvcGVkIGJ5IEFuZHkgUG9seWFrb3Ygb2YKICAgICAgdGhlIE9wZW5TU0wgY29yZSB0ZWFtLgogICAgICAoQ1ZFLTIwMTQtMzU3MCkKICAgICAgW0FuZHkgUG9seWFrb3ZdCgogICAqKSBEbyBub3QgcmVzdW1lIHNlc3Npb25zIG9uIHRoZSBzZXJ2ZXIgaWYgdGhlIG5lZ290aWF0ZWQgcHJvdG9jb2wKICAgICAgdmVyc2lvbiBkb2VzIG5vdCBtYXRjaCB0aGUgc2Vzc2lvbidzIHZlcnNpb24uIFJlc3VtaW5nIHdpdGggYSBkaWZmZXJlbnQKICAgICAgdmVyc2lvbiwgd2hpbGUgbm90IHN0cmljdGx5IGZvcmJpZGRlbiBieSB0aGUgUkZDLCBpcyBvZiBxdWVzdGlvbmFibGUKICAgICAgc2FuaXR5IGFuZCBicmVha3MgYWxsIGtub3duIGNsaWVudHMuCiAgICAgIFtEYXZpZCBCZW5qYW1pbiwgRW1pbGlhIEvkc3Blcl0KCiAgICopIFRpZ2h0ZW4gaGFuZGxpbmcgb2YgdGhlIENoYW5nZUNpcGhlclNwZWMgKENDUykgbWVzc2FnZTogcmVqZWN0CiAgICAgIGVhcmx5IENDUyBtZXNzYWdlcyBkdXJpbmcgcmVuZWdvdGlhdGlvbi4gKE5vdGUgdGhhdCBiZWNhdXNlCiAgICAgIHJlbmVnb3RpYXRpb24gaXMgZW5jcnlwdGVkLCB0aGlzIGVhcmx5IENDUyB3YXMgbm90IGV4cGxvaXRhYmxlLikKICAgICAgW0VtaWxpYSBL5HNwZXJdCgogICAqKSBUaWdodGVuIGNsaWVudC1zaWRlIHNlc3Npb24gdGlja2V0IGhhbmRsaW5nIGR1cmluZyByZW5lZ290aWF0aW9uOgogICAgICBlbnN1cmUgdGhhdCB0aGUgY2xpZW50IG9ubHkgYWNjZXB0cyBhIHNlc3Npb24gdGlja2V0IGlmIHRoZSBzZXJ2ZXIgc2VuZHMKICAgICAgdGhlIGV4dGVuc2lvbiBhbmV3IGluIHRoZSBTZXJ2ZXJIZWxsby4gUHJldmlvdXNseSwgYSBUTFMgY2xpZW50IHdvdWxkCiAgICAgIHJldXNlIHRoZSBvbGQgZXh0ZW5zaW9uIHN0YXRlIGFuZCB0aHVzIGFjY2VwdCBhIHNlc3Npb24gdGlja2V0IGlmIG9uZSB3YXMKICAgICAgYW5ub3VuY2VkIGluIHRoZSBpbml0aWFsIFNlcnZlckhlbGxvLgoKICAgICAgU2ltaWxhcmx5LCBlbnN1cmUgdGhhdCB0aGUgY2xpZW50IHJlcXVpcmVzIGEgc2Vzc2lvbiB0aWNrZXQgaWYgb25lCiAgICAgIHdhcyBhZHZlcnRpc2VkIGluIHRoZSBTZXJ2ZXJIZWxsby4gUHJldmlvdXNseSwgYSBUTFMgY2xpZW50IHdvdWxkCiAgICAgIGlnbm9yZSBhIG1pc3NpbmcgTmV3U2Vzc2lvblRpY2tldCBtZXNzYWdlLgogICAgICBbRW1pbGlhIEvkc3Blcl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFpIGFuZCAxLjAuMWogWzE1IE9jdCAyMDE0XQoKICAqKSBTUlRQIE1lbW9yeSBMZWFrLgoKICAgICBBIGZsYXcgaW4gdGhlIERUTFMgU1JUUCBleHRlbnNpb24gcGFyc2luZyBjb2RlIGFsbG93cyBhbiBhdHRhY2tlciwgd2hvCiAgICAgc2VuZHMgYSBjYXJlZnVsbHkgY3JhZnRlZCBoYW5kc2hha2UgbWVzc2FnZSwgdG8gY2F1c2UgT3BlblNTTCB0byBmYWlsCiAgICAgdG8gZnJlZSB1cCB0byA2NGsgb2YgbWVtb3J5IGNhdXNpbmcgYSBtZW1vcnkgbGVhay4gVGhpcyBjb3VsZCBiZQogICAgIGV4cGxvaXRlZCBpbiBhIERlbmlhbCBPZiBTZXJ2aWNlIGF0dGFjay4gVGhpcyBpc3N1ZSBhZmZlY3RzIE9wZW5TU0wKICAgICAxLjAuMSBzZXJ2ZXIgaW1wbGVtZW50YXRpb25zIGZvciBib3RoIFNTTC9UTFMgYW5kIERUTFMgcmVnYXJkbGVzcyBvZgogICAgIHdoZXRoZXIgU1JUUCBpcyB1c2VkIG9yIGNvbmZpZ3VyZWQuIEltcGxlbWVudGF0aW9ucyBvZiBPcGVuU1NMIHRoYXQKICAgICBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aCBPUEVOU1NMX05PX1NSVFAgZGVmaW5lZCBhcmUgbm90IGFmZmVjdGVkLgoKICAgICBUaGUgZml4IHdhcyBkZXZlbG9wZWQgYnkgdGhlIE9wZW5TU0wgdGVhbS4KICAgICAoQ1ZFLTIwMTQtMzUxMykKICAgICBbT3BlblNTTCB0ZWFtXQoKICAqKSBTZXNzaW9uIFRpY2tldCBNZW1vcnkgTGVhay4KCiAgICAgV2hlbiBhbiBPcGVuU1NMIFNTTC9UTFMvRFRMUyBzZXJ2ZXIgcmVjZWl2ZXMgYSBzZXNzaW9uIHRpY2tldCB0aGUKICAgICBpbnRlZ3JpdHkgb2YgdGhhdCB0aWNrZXQgaXMgZmlyc3QgdmVyaWZpZWQuIEluIHRoZSBldmVudCBvZiBhIHNlc3Npb24KICAgICB0aWNrZXQgaW50ZWdyaXR5IGNoZWNrIGZhaWxpbmcsIE9wZW5TU0wgd2lsbCBmYWlsIHRvIGZyZWUgbWVtb3J5CiAgICAgY2F1c2luZyBhIG1lbW9yeSBsZWFrLiBCeSBzZW5kaW5nIGEgbGFyZ2UgbnVtYmVyIG9mIGludmFsaWQgc2Vzc2lvbgogICAgIHRpY2tldHMgYW4gYXR0YWNrZXIgY291bGQgZXhwbG9pdCB0aGlzIGlzc3VlIGluIGEgRGVuaWFsIE9mIFNlcnZpY2UKICAgICBhdHRhY2suCiAgICAgKENWRS0yMDE0LTM1NjcpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVpbGQgb3B0aW9uIG5vLXNzbDMgaXMgaW5jb21wbGV0ZS4KCiAgICAgV2hlbiBPcGVuU1NMIGlzIGNvbmZpZ3VyZWQgd2l0aCAibm8tc3NsMyIgYXMgYSBidWlsZCBvcHRpb24sIHNlcnZlcnMKICAgICBjb3VsZCBhY2NlcHQgYW5kIGNvbXBsZXRlIGEgU1NMIDMuMCBoYW5kc2hha2UsIGFuZCBjbGllbnRzIGNvdWxkIGJlCiAgICAgY29uZmlndXJlZCB0byBzZW5kIHRoZW0uCiAgICAgKENWRS0yMDE0LTM1NjgpCiAgICAgW0FrYW1haSBhbmQgdGhlIE9wZW5TU0wgdGVhbV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRMU19GQUxMQkFDS19TQ1NWLgogICAgIENsaWVudCBhcHBsaWNhdGlvbnMgZG9pbmcgZmFsbGJhY2sgcmV0cmllcyBzaG91bGQgY2FsbAogICAgIFNTTF9zZXRfbW9kZShzLCBTU0xfTU9ERV9TRU5EX0ZBTExCQUNLX1NDU1YpLgogICAgIChDVkUtMjAxNC0zNTY2KQogICAgIFtBZGFtIExhbmdsZXksIEJvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGFkZGl0aW9uYWwgRGlnZXN0SW5mbyBjaGVja3MuCiAKICAgICBSZWVuY29kZSBEaWdlc3RJbnRvIGluIERFUiBhbmQgY2hlY2sgYWdhaW5zdCB0aGUgb3JpZ2luYWwgd2hlbgogICAgIHZlcmlmeWluZyBSU0Egc2lnbmF0dXJlOiB0aGlzIHdpbGwgcmVqZWN0IGFueSBpbXByb3Blcmx5IGVuY29kZWQKICAgICBEaWdlc3RJbmZvIHN0cnVjdHVyZXMuCgogICAgIE5vdGU6IHRoaXMgaXMgYSBwcmVjYXV0aW9uYXJ5IG1lYXN1cmUgYW5kIG5vIGF0dGFja3MgYXJlIGN1cnJlbnRseSBrbm93bi4KCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFoIGFuZCAxLjAuMWkgWzYgQXVnIDIwMTRdCgogICopIEZpeCBTUlAgYnVmZmVyIG92ZXJydW4gdnVsbmVyYWJpbGl0eS4gSW52YWxpZCBwYXJhbWV0ZXJzIHBhc3NlZCB0byB0aGUKICAgICBTUlAgY29kZSBjYW4gYmUgb3ZlcnJ1biBhbiBpbnRlcm5hbCBidWZmZXIuIEFkZCBzYW5pdHkgY2hlY2sgdGhhdAogICAgIGcsIEEsIEIgPCBOIHRvIFNSUCBjb2RlLgoKICAgICBUaGFua3MgdG8gU2VhbiBEZXZsaW4gYW5kIFdhdHNvbiBMYWRkIG9mIENyeXB0b2dyYXBoeSBTZXJ2aWNlcywgTkNDCiAgICAgR3JvdXAgZm9yIGRpc2NvdmVyaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MTIpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQSBmbGF3IGluIHRoZSBPcGVuU1NMIFNTTC9UTFMgc2VydmVyIGNvZGUgY2F1c2VzIHRoZSBzZXJ2ZXIgdG8gbmVnb3RpYXRlCiAgICAgVExTIDEuMCBpbnN0ZWFkIG9mIGhpZ2hlciBwcm90b2NvbCB2ZXJzaW9ucyB3aGVuIHRoZSBDbGllbnRIZWxsbyBtZXNzYWdlCiAgICAgaXMgYmFkbHkgZnJhZ21lbnRlZC4gVGhpcyBhbGxvd3MgYSBtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2tlciB0byBmb3JjZSBhCiAgICAgZG93bmdyYWRlIHRvIFRMUyAxLjAgZXZlbiBpZiBib3RoIHRoZSBzZXJ2ZXIgYW5kIHRoZSBjbGllbnQgc3VwcG9ydCBhCiAgICAgaGlnaGVyIHByb3RvY29sIHZlcnNpb24sIGJ5IG1vZGlmeWluZyB0aGUgY2xpZW50J3MgVExTIHJlY29yZHMuCgogICAgIFRoYW5rcyB0byBEYXZpZCBCZW5qYW1pbiBhbmQgQWRhbSBMYW5nbGV5IChHb29nbGUpIGZvciBkaXNjb3ZlcmluZyBhbmQKICAgICByZXNlYXJjaGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0zNTExKQogICAgIFtEYXZpZCBCZW5qYW1pbl0KCiAgKikgT3BlblNTTCBEVExTIGNsaWVudHMgZW5hYmxpbmcgYW5vbnltb3VzIChFQylESCBjaXBoZXJzdWl0ZXMgYXJlIHN1YmplY3QKICAgICB0byBhIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFjay4gQSBtYWxpY2lvdXMgc2VydmVyIGNhbiBjcmFzaCB0aGUgY2xpZW50CiAgICAgd2l0aCBhIG51bGwgcG9pbnRlciBkZXJlZmVyZW5jZSAocmVhZCkgYnkgc3BlY2lmeWluZyBhbiBhbm9ueW1vdXMgKEVDKURICiAgICAgY2lwaGVyc3VpdGUgYW5kIHNlbmRpbmcgY2FyZWZ1bGx5IGNyYWZ0ZWQgaGFuZHNoYWtlIG1lc3NhZ2VzLgoKICAgICBUaGFua3MgdG8gRmVsaXggR3L2YmVydCAoR29vZ2xlKSBmb3IgZGlzY292ZXJpbmcgYW5kIHJlc2VhcmNoaW5nIHRoaXMKICAgICBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUxMCkKICAgICBbRW1pbGlhIEvkc3Blcl0KCiAgKikgQnkgc2VuZGluZyBjYXJlZnVsbHkgY3JhZnRlZCBEVExTIHBhY2tldHMgYW4gYXR0YWNrZXIgY291bGQgY2F1c2Ugb3BlbnNzbAogICAgIHRvIGxlYWsgbWVtb3J5LiBUaGlzIGNhbiBiZSBleHBsb2l0ZWQgdGhyb3VnaCBhIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjay4KICAgICBUaGFua3MgdG8gQWRhbSBMYW5nbGV5IGZvciBkaXNjb3ZlcmluZyBhbmQgcmVzZWFyY2hpbmcgdGhpcyBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUwNykKICAgICBbQWRhbSBMYW5nbGV5XQoKICAqKSBBbiBhdHRhY2tlciBjYW4gZm9yY2Ugb3BlbnNzbCB0byBjb25zdW1lIGxhcmdlIGFtb3VudHMgb2YgbWVtb3J5IHdoaWxzdAogICAgIHByb2Nlc3NpbmcgRFRMUyBoYW5kc2hha2UgbWVzc2FnZXMuIFRoaXMgY2FuIGJlIGV4cGxvaXRlZCB0aHJvdWdoIGEKICAgICBEZW5pYWwgb2YgU2VydmljZSBhdHRhY2suCiAgICAgVGhhbmtzIHRvIEFkYW0gTGFuZ2xleSBmb3IgZGlzY292ZXJpbmcgYW5kIHJlc2VhcmNoaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MDYpCiAgICAgW0FkYW0gTGFuZ2xleV0KCiAgKikgQW4gYXR0YWNrZXIgY2FuIGZvcmNlIGFuIGVycm9yIGNvbmRpdGlvbiB3aGljaCBjYXVzZXMgb3BlbnNzbCB0byBjcmFzaAogICAgIHdoaWxzdCBwcm9jZXNzaW5nIERUTFMgcGFja2V0cyBkdWUgdG8gbWVtb3J5IGJlaW5nIGZyZWVkIHR3aWNlLiBUaGlzCiAgICAgY2FuIGJlIGV4cGxvaXRlZCB0aHJvdWdoIGEgRGVuaWFsIG9mIFNlcnZpY2UgYXR0YWNrLgogICAgIFRoYW5rcyB0byBBZGFtIExhbmdsZXkgYW5kIFdhbi1UZWggQ2hhbmcgZm9yIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZwogICAgIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MDUpCiAgICAgW0FkYW0gTGFuZ2xleV0KCiAgKikgSWYgYSBtdWx0aXRocmVhZGVkIGNsaWVudCBjb25uZWN0cyB0byBhIG1hbGljaW91cyBzZXJ2ZXIgdXNpbmcgYSByZXN1bWVkCiAgICAgc2Vzc2lvbiBhbmQgdGhlIHNlcnZlciBzZW5kcyBhbiBlYyBwb2ludCBmb3JtYXQgZXh0ZW5zaW9uIGl0IGNvdWxkIHdyaXRlCiAgICAgdXAgdG8gMjU1IGJ5dGVzIHRvIGZyZWVkIG1lbW9yeS4KCiAgICAgVGhhbmtzIHRvIEdhYm9yIFR5dWthc3ogKExvZ01lSW4gSW5jKSBmb3IgZGlzY292ZXJpbmcgYW5kIHJlc2VhcmNoaW5nIHRoaXMKICAgICBpc3N1ZS4KICAgICAoQ1ZFLTIwMTQtMzUwOSkKICAgICBbR2Fib3IgVHl1a2Fzel0KCiAgKikgQSBtYWxpY2lvdXMgc2VydmVyIGNhbiBjcmFzaCBhbiBPcGVuU1NMIGNsaWVudCB3aXRoIGEgbnVsbCBwb2ludGVyCiAgICAgZGVyZWZlcmVuY2UgKHJlYWQpIGJ5IHNwZWNpZnlpbmcgYW4gU1JQIGNpcGhlcnN1aXRlIGV2ZW4gdGhvdWdoIGl0IHdhcyBub3QKICAgICBwcm9wZXJseSBuZWdvdGlhdGVkIHdpdGggdGhlIGNsaWVudC4gVGhpcyBjYW4gYmUgZXhwbG9pdGVkIHRocm91Z2ggYQogICAgIERlbmlhbCBvZiBTZXJ2aWNlIGF0dGFjay4KCiAgICAgVGhhbmtzIHRvIEpvb25hcyBLdW9yaWxlaHRvIGFuZCBSaWt1IEhpZXRhbeRraSAoQ29kZW5vbWljb24pIGZvcgogICAgIGRpc2NvdmVyaW5nIGFuZCByZXNlYXJjaGluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC01MTM5KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEEgZmxhdyBpbiBPQkpfb2JqMnR4dCBtYXkgY2F1c2UgcHJldHR5IHByaW50aW5nIGZ1bmN0aW9ucyBzdWNoIGFzCiAgICAgWDUwOV9uYW1lX29uZWxpbmUsIFg1MDlfbmFtZV9wcmludF9leCBldCBhbC4gdG8gbGVhayBzb21lIGluZm9ybWF0aW9uCiAgICAgZnJvbSB0aGUgc3RhY2suIEFwcGxpY2F0aW9ucyBtYXkgYmUgYWZmZWN0ZWQgaWYgdGhleSBlY2hvIHByZXR0eSBwcmludGluZwogICAgIG91dHB1dCB0byB0aGUgYXR0YWNrZXIuCgogICAgIFRoYW5rcyB0byBJdmFuIEZyYXRyaWMgKEdvb2dsZSkgZm9yIGRpc2NvdmVyaW5nIHRoaXMgaXNzdWUuCiAgICAgKENWRS0yMDE0LTM1MDgpCiAgICAgW0VtaWxpYSBL5HNwZXIsIGFuZCBTdGV2ZSBIZW5zb25dCgogICopIEZpeCBlY19HRnBfc2ltcGxlX3BvaW50c19tYWtlX2FmZmluZSAodGh1cywgRUNfUE9JTlRzX211bCBldGMuKQogICAgIGZvciBjb3JuZXIgY2FzZXMuIChDZXJ0YWluIGlucHV0IHBvaW50cyBhdCBpbmZpbml0eSBjb3VsZCBsZWFkIHRvCiAgICAgYm9ndXMgcmVzdWx0cywgd2l0aCBub24taW5maW5pdHkgaW5wdXRzIG1hcHBlZCB0byBpbmZpbml0eSB0b28uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xZyBhbmQgMS4wLjFoIFs1IEp1biAyMDE0XQoKICAqKSBGaXggZm9yIFNTTC9UTFMgTUlUTSBmbGF3LiBBbiBhdHRhY2tlciB1c2luZyBhIGNhcmVmdWxseSBjcmFmdGVkCiAgICAgaGFuZHNoYWtlIGNhbiBmb3JjZSB0aGUgdXNlIG9mIHdlYWsga2V5aW5nIG1hdGVyaWFsIGluIE9wZW5TU0wKICAgICBTU0wvVExTIGNsaWVudHMgYW5kIHNlcnZlcnMuCgogICAgIFRoYW5rcyB0byBLSUtVQ0hJIE1hc2FzaGkgKExlcGlkdW0gQ28uIEx0ZC4pIGZvciBkaXNjb3ZlcmluZyBhbmQKICAgICByZXNlYXJjaGluZyB0aGlzIGlzc3VlLiAoQ1ZFLTIwMTQtMDIyNCkKICAgICBbS0lLVUNISSBNYXNhc2hpLCBTdGV2ZSBIZW5zb25dCgogICopIEZpeCBEVExTIHJlY3Vyc2lvbiBmbGF3LiBCeSBzZW5kaW5nIGFuIGludmFsaWQgRFRMUyBoYW5kc2hha2UgdG8gYW4KICAgICBPcGVuU1NMIERUTFMgY2xpZW50IHRoZSBjb2RlIGNhbiBiZSBtYWRlIHRvIHJlY3Vyc2UgZXZlbnR1YWxseSBjcmFzaGluZwogICAgIGluIGEgRG9TIGF0dGFjay4KCiAgICAgVGhhbmtzIHRvIEltcmUgUmFkIChTZWFyY2gtTGFiIEx0ZC4pIGZvciBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxNC0wMjIxKQogICAgIFtJbXJlIFJhZCwgU3RldmUgSGVuc29uXQoKICAqKSBGaXggRFRMUyBpbnZhbGlkIGZyYWdtZW50IHZ1bG5lcmFiaWxpdHkuIEEgYnVmZmVyIG92ZXJydW4gYXR0YWNrIGNhbgogICAgIGJlIHRyaWdnZXJlZCBieSBzZW5kaW5nIGludmFsaWQgRFRMUyBmcmFnbWVudHMgdG8gYW4gT3BlblNTTCBEVExTCiAgICAgY2xpZW50IG9yIHNlcnZlci4gVGhpcyBpcyBwb3RlbnRpYWxseSBleHBsb2l0YWJsZSB0byBydW4gYXJiaXRyYXJ5CiAgICAgY29kZSBvbiBhIHZ1bG5lcmFibGUgY2xpZW50IG9yIHNlcnZlci4KCiAgICAgVGhhbmtzIHRvIEr8cmkgQWVkbGEgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLiAoQ1ZFLTIwMTQtMDE5NSkKICAgICBbSvxyaSBBZWRsYSwgU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVnIGluIFRMUyBjb2RlIHdoZXJlIGNsaWVudHMgZW5hYmxlIGFub255bW91cyBFQ0RIIGNpcGhlcnN1aXRlcwogICAgIGFyZSBzdWJqZWN0IHRvIGEgZGVuaWFsIG9mIHNlcnZpY2UgYXR0YWNrLgoKICAgICBUaGFua3MgdG8gRmVsaXggR3L2YmVydCBhbmQgSXZhbiBGcmF0cmljIGF0IEdvb2dsZSBmb3IgZGlzY292ZXJpbmcKICAgICB0aGlzIGlzc3VlLiAoQ1ZFLTIwMTQtMzQ3MCkKICAgICBbRmVsaXggR3L2YmVydCwgSXZhbiBGcmF0cmljLCBTdGV2ZSBIZW5zb25dCgogICopIEhhcm1vbml6ZSB2ZXJzaW9uIGFuZCBpdHMgZG9jdW1lbnRhdGlvbi4gLWYgZmxhZyBpcyB1c2VkIHRvIGRpc3BsYXkKICAgICBjb21waWxhdGlvbiBmbGFncy4KICAgICBbbWFuY2hhIDxtYW5jaGExQHpvaG8uY29tPl0KCiAgKikgRml4IGVja2V5X3ByaXZfZW5jb2RlIHNvIGl0IGltbWVkaWF0ZWx5IHJldHVybnMgYW4gZXJyb3IgdXBvbiBhIGZhaWx1cmUKICAgICBpbiBpMmRfRUNQcml2YXRlS2V5LgogICAgIFttYW5jaGEgPG1hbmNoYTFAem9oby5jb20+XQoKICAqKSBGaXggc29tZSBkb3VibGUgZnJlZXMuIFRoZXNlIGFyZSBub3QgdGhvdWdodCB0byBiZSBleHBsb2l0YWJsZS4KICAgICBbbWFuY2hhIDxtYW5jaGExQHpvaG8uY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFmIGFuZCAxLjAuMWcgWzcgQXByIDIwMTRdCgogICopIEEgbWlzc2luZyBib3VuZHMgY2hlY2sgaW4gdGhlIGhhbmRsaW5nIG9mIHRoZSBUTFMgaGVhcnRiZWF0IGV4dGVuc2lvbgogICAgIGNhbiBiZSB1c2VkIHRvIHJldmVhbCB1cCB0byA2NGsgb2YgbWVtb3J5IHRvIGEgY29ubmVjdGVkIGNsaWVudCBvcgogICAgIHNlcnZlci4KCiAgICAgVGhhbmtzIGZvciBOZWVsIE1laHRhIG9mIEdvb2dsZSBTZWN1cml0eSBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcgYW5kIHRvCiAgICAgQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPiBhbmQgQm9kbyBNb2VsbGVyIDxibW9lbGxlckBhY20ub3JnPiBmb3IKICAgICBwcmVwYXJpbmcgdGhlIGZpeCAoQ1ZFLTIwMTQtMDE2MCkKICAgICBbQWRhbSBMYW5nbGV5LCBCb2RvIE1vZWxsZXJdCgogICopIEZpeCBmb3IgdGhlIGF0dGFjayBkZXNjcmliZWQgaW4gdGhlIHBhcGVyICJSZWNvdmVyaW5nIE9wZW5TU0wKICAgICBFQ0RTQSBOb25jZXMgVXNpbmcgdGhlIEZMVVNIK1JFTE9BRCBDYWNoZSBTaWRlLWNoYW5uZWwgQXR0YWNrIgogICAgIGJ5IFl1dmFsIFlhcm9tIGFuZCBOYW9taSBCZW5nZXIuIERldGFpbHMgY2FuIGJlIG9idGFpbmVkIGZyb206CiAgICAgaHR0cDovL2VwcmludC5pYWNyLm9yZy8yMDE0LzE0MAoKICAgICBUaGFua3MgdG8gWXV2YWwgWWFyb20gYW5kIE5hb21pIEJlbmdlciBmb3IgZGlzY292ZXJpbmcgdGhpcwogICAgIGZsYXcgYW5kIHRvIFl1dmFsIFlhcm9tIGZvciBzdXBwbHlpbmcgYSBmaXggKENWRS0yMDE0LTAwNzYpCiAgICAgW1l1dmFsIFlhcm9tIGFuZCBOYW9taSBCZW5nZXJdCgogICopIFRMUyBwYWQgZXh0ZW5zaW9uOiBkcmFmdC1hZ2wtdGxzLXBhZGRpbmctMDMKCiAgICAgV29ya2Fyb3VuZCBmb3IgdGhlICJUTFMgaGFuZyBidWciIChzZWUgRkFRIGFuZCBQUiMyNzcxKTogaWYgdGhlCiAgICAgVExTIGNsaWVudCBIZWxsbyByZWNvcmQgbGVuZ3RoIHZhbHVlIHdvdWxkIG90aGVyd2lzZSBiZSA+IDI1NSBhbmQKICAgICBsZXNzIHRoYXQgNTEyIHBhZCB3aXRoIGEgZHVtbXkgZXh0ZW5zaW9uIGNvbnRhaW5pbmcgemVyb2VzIHNvIGl0CiAgICAgaXMgYXQgbGVhc3QgNTEyIGJ5dGVzIGxvbmcuCgogICAgIFtBZGFtIExhbmdsZXksIFN0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFlIGFuZCAxLjAuMWYgWzYgSmFuIDIwMTRdCgogICopIEZpeCBmb3IgVExTIHJlY29yZCB0YW1wZXJpbmcgYnVnLiBBIGNhcmVmdWxseSBjcmFmdGVkIGludmFsaWQgCiAgICAgaGFuZHNoYWtlIGNvdWxkIGNyYXNoIE9wZW5TU0wgd2l0aCBhIE5VTEwgcG9pbnRlciBleGNlcHRpb24uCiAgICAgVGhhbmtzIHRvIEFudG9uIEpvaGFuc3NvbiBmb3IgcmVwb3J0aW5nIHRoaXMgaXNzdWVzLgogICAgIChDVkUtMjAxMy00MzUzKQoKICAqKSBLZWVwIG9yaWdpbmFsIERUTFMgZGlnZXN0IGFuZCBlbmNyeXB0aW9uIGNvbnRleHRzIGluIHJldHJhbnNtaXNzaW9uCiAgICAgc3RydWN0dXJlcyBzbyB3ZSBjYW4gdXNlIHRoZSBwcmV2aW91cyBzZXNzaW9uIHBhcmFtZXRlcnMgaWYgdGhleSBuZWVkCiAgICAgdG8gYmUgcmVzZW50LiAoQ1ZFLTIwMTMtNjQ1MCkKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgb3B0aW9uIFNTTF9PUF9TQUZBUklfRUNESEVfRUNEU0FfQlVHIChwYXJ0IG9mIFNTTF9PUF9BTEwpIHdoaWNoCiAgICAgYXZvaWRzIHByZWZlcnJpbmcgRUNESEUtRUNEU0EgY2lwaGVycyB3aGVuIHRoZSBjbGllbnQgYXBwZWFycyB0byBiZQogICAgIFNhZmFyaSBvbiBPUyBYLiAgU2FmYXJpIG9uIE9TIFggMTAuOC4uMTAuOC4zIGFkdmVydGlzZXMgc3VwcG9ydCBmb3IKICAgICBzZXZlcmFsIEVDREhFLUVDRFNBIGNpcGhlcnMsIGJ1dCBmYWlscyB0byBuZWdvdGlhdGUgdGhlbS4gIFRoZSBidWcKICAgICBpcyBmaXhlZCBpbiBPUyBYIDEwLjguNCwgYnV0IEFwcGxlIGhhdmUgcnVsZWQgb3V0IGJvdGggaG90IGZpeGluZwogICAgIDEwLjguLjEwLjguMyBhbmQgZm9yY2luZyB1c2VycyB0byB1cGdyYWRlIHRvIDEwLjguNCBvciBuZXdlci4KICAgICBbUm9iIFN0cmFkbGluZywgQWRhbSBMYW5nbGV5XQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMWQgYW5kIDEuMC4xZSBbMTEgRmViIDIwMTNdCgogICopIENvcnJlY3QgZml4IGZvciBDVkUtMjAxMy0wMTY5LiBUaGUgb3JpZ2luYWwgZGlkbid0IHdvcmsgb24gQUVTLU5JCiAgICAgc3VwcG9ydGluZyBwbGF0Zm9ybXMgb3Igd2hlbiBzbWFsbCByZWNvcmRzIHdlcmUgdHJhbnNmZXJyZWQuCiAgICAgW0FuZHkgUG9seWFrb3YsIFN0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjFjIGFuZCAxLjAuMWQgWzUgRmViIDIwMTNdCgogICopIE1ha2UgdGhlIGRlY29kaW5nIG9mIFNTTHYzLCBUTFMgYW5kIERUTFMgQ0JDIHJlY29yZHMgY29uc3RhbnQgdGltZS4KCiAgICAgVGhpcyBhZGRyZXNzZXMgdGhlIGZsYXcgaW4gQ0JDIHJlY29yZCBwcm9jZXNzaW5nIGRpc2NvdmVyZWQgYnkgCiAgICAgTmFkaGVtIEFsZmFyZGFuIGFuZCBLZW5ueSBQYXRlcnNvbi4gRGV0YWlscyBvZiB0aGlzIGF0dGFjayBjYW4gYmUgZm91bmQKICAgICBhdDogaHR0cDovL3d3dy5pc2cucmh1bC5hYy51ay90bHMvICAgICAKCiAgICAgVGhhbmtzIGdvIHRvIE5hZGhlbSBBbGZhcmRhbiBhbmQgS2VubnkgUGF0ZXJzb24gb2YgdGhlIEluZm9ybWF0aW9uCiAgICAgU2VjdXJpdHkgR3JvdXAgYXQgUm95YWwgSG9sbG93YXksIFVuaXZlcnNpdHkgb2YgTG9uZG9uCiAgICAgKHd3dy5pc2cucmh1bC5hYy51aykgZm9yIGRpc2NvdmVyaW5nIHRoaXMgZmxhdyBhbmQgQWRhbSBMYW5nbGV5IGFuZAogICAgIEVtaWxpYSBL5HNwZXIgZm9yIHRoZSBpbml0aWFsIHBhdGNoLgogICAgIChDVkUtMjAxMy0wMTY5KQogICAgIFtFbWlsaWEgS+RzcGVyLCBBZGFtIExhbmdsZXksIEJlbiBMYXVyaWUsIEFuZHkgUG9seWFrb3YsIFN0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGZsYXcgaW4gQUVTTkkgaGFuZGxpbmcgb2YgVExTIDEuMiBhbmQgMS4xIHJlY29yZHMgZm9yIENCQyBtb2RlCiAgICAgY2lwaGVyc3VpdGVzIHdoaWNoIGNhbiBiZSBleHBsb2l0ZWQgaW4gYSBkZW5pYWwgb2Ygc2VydmljZSBhdHRhY2suCiAgICAgVGhhbmtzIGdvIHRvIGFuZCB0byBBZGFtIExhbmdsZXkgPGFnbEBjaHJvbWl1bS5vcmc+IGZvciBkaXNjb3ZlcmluZwogICAgIGFuZCBkZXRlY3RpbmcgdGhpcyBidWcgYW5kIHRvIFdvbGZnYW5nIEV0dGxpbmdlcgogICAgIDx3b2xmZ2FuZy5ldHRsaW5nZXJAZ21haWwuY29tPiBmb3IgaW5kZXBlbmRlbnRseSBkaXNjb3ZlcmluZyB0aGlzIGlzc3VlLgogICAgIChDVkUtMjAxMi0yNjg2KQogICAgIFtBZGFtIExhbmdsZXldCgogICopIFJldHVybiBhbiBlcnJvciB3aGVuIGNoZWNraW5nIE9DU1Agc2lnbmF0dXJlcyB3aGVuIGtleSBpcyBOVUxMLgogICAgIFRoaXMgZml4ZXMgYSBEb1MgYXR0YWNrLiAoQ1ZFLTIwMTMtMDE2NikKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIG9wZW5zc2wgdmVyaWZ5IHJldHVybiBlcnJvcnMuCiAgICAgW0NocmlzIFBhbG1lciA8cGFsbWVyQGdvb2dsZS5jb20+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBDYWxsIE9DU1AgU3RhcGxpbmcgY2FsbGJhY2sgYWZ0ZXIgY2lwaGVyc3VpdGUgaGFzIGJlZW4gY2hvc2VuLCBzbwogICAgIHRoZSByaWdodCByZXNwb25zZSBpcyBzdGFwbGVkLiBBbHNvIGNoYW5nZSBTU0xfZ2V0X2NlcnRpZmljYXRlKCkKICAgICBzbyBpdCByZXR1cm5zIHRoZSBjZXJ0aWZpY2F0ZSBhY3R1YWxseSBzZW50LgogICAgIFNlZSBodHRwOi8vcnQub3BlbnNzbC5vcmcvVGlja2V0L0Rpc3BsYXkuaHRtbD9pZD0yODM2LgogICAgIFtSb2IgU3RyYWRsaW5nIDxyb2Iuc3RyYWRsaW5nQGNvbW9kby5jb20+XQoKICAqKSBGaXggcG9zc2libGUgZGVhZGxvY2sgd2hlbiBkZWNvZGluZyBwdWJsaWMga2V5cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEb24ndCB1c2UgVExTIDEuMCByZWNvcmQgdmVyc2lvbiBudW1iZXIgaW4gaW5pdGlhbCBjbGllbnQgaGVsbG8KICAgICBpZiByZW5lZ290aWF0aW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xYiBhbmQgMS4wLjFjIFsxMCBNYXkgMjAxMl0KCiAgKikgU2FuaXR5IGNoZWNrIHJlY29yZCBsZW5ndGggYmVmb3JlIHNraXBwaW5nIGV4cGxpY2l0IElWIGluIFRMUwogICAgIDEuMiwgMS4xIGFuZCBEVExTIHRvIGZpeCBEb1MgYXR0YWNrLgoKICAgICBUaGFua3MgdG8gQ29kZW5vbWljb24gZm9yIGRpc2NvdmVyaW5nIHRoaXMgaXNzdWUgdXNpbmcgRnV6ei1vLU1hdGljCiAgICAgZnV6emluZyBhcyBhIHNlcnZpY2UgdGVzdGluZyBwbGF0Zm9ybS4KICAgICAoQ1ZFLTIwMTItMjMzMykKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsaXNlIHRrZXlsZW4gcHJvcGVybHkgd2hlbiBlbmNyeXB0aW5nIENNUyBtZXNzYWdlcy4KICAgICBUaGFua3MgdG8gU29sYXIgRGVzaWduZXIgb2YgT3BlbndhbGwgZm9yIHJlcG9ydGluZyB0aGlzIGlzc3VlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIEZJUFMgbW9kZSBkb24ndCB0cnkgdG8gdXNlIGNvbXBvc2l0ZSBjaXBoZXJzIGFzIHRoZXkgYXJlIG5vdAogICAgIGFwcHJvdmVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xYSBhbmQgMS4wLjFiIFsyNiBBcHIgMjAxMl0KCiAgKikgT3BlblNTTCAxLjAuMCBzZXRzIFNTTF9PUF9BTEwgdG8gMHg4MDAwMEZGRkwgYW5kIE9wZW5TU0wgMS4wLjEgYW5kCiAgICAgMS4wLjFhIHNldCBTU0xfT1BfTk9fVExTdjFfMSB0byAweDAwMDAwNDAwTCB3aGljaCB3b3VsZCB1bmZvcnR1bmF0ZWx5CiAgICAgbWVhbiBhbnkgYXBwbGljYXRpb24gY29tcGlsZWQgYWdhaW5zdCBPcGVuU1NMIDEuMC4wIGhlYWRlcnMgc2V0dGluZwogICAgIFNTTF9PUF9BTEwgd291bGQgYWxzbyBzZXQgU1NMX09QX05PX1RMU3YxXzEsIHVuaW50ZW50aW9uYWxseSBkaXNhYmxuZwogICAgIFRMUyAxLjEgYWxzby4gRml4IHRoaXMgYnkgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIFNTTF9PUF9OT19UTFN2MV8xIHRvCiAgICAgMHgxMDAwMDAwMEwgQW55IGFwcGxpY2F0aW9uIHdoaWNoIHdhcyBwcmV2aW91c2x5IGNvbXBpbGVkIGFnYWluc3QKICAgICBPcGVuU1NMIDEuMC4xIG9yIDEuMC4xYSBoZWFkZXJzIGFuZCB3aGljaCBjYXJlcyBhYm91dCBTU0xfT1BfTk9fVExTdjFfMQogICAgIHdpbGwgbmVlZCB0byBiZSByZWNvbXBpbGVkIGFzIGEgcmVzdWx0LiBMZXR0aW5nIGJlIHJlc3VsdHMgaW4KICAgICBpbmFiaWxpdHkgdG8gZGlzYWJsZSBzcGVjaWZpY2FsbHkgVExTIDEuMSBhbmQgaW4gY2xpZW50IGNvbnRleHQsCiAgICAgaW4gdW5saWtlIGV2ZW50LCBsaW1pdCBtYXhpbXVtIG9mZmVyZWQgdmVyc2lvbiB0byBUTFMgMS4wIFtzZWUgYmVsb3ddLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIG9yZGVyIHRvIGVuc3VyZSBpbnRlcm9wZXJhYmlsdHkgU1NMX09QX05PX3Byb3RvY29sWCBkb2VzIG5vdAogICAgIGRpc2FibGUganVzdCBwcm90b2NvbCBYLCBidXQgYWxsIHByb3RvY29scyBhYm92ZSBYICppZiogdGhlcmUgYXJlCiAgICAgcHJvdG9jb2xzICpiZWxvdyogWCBzdGlsbCBlbmFibGVkLiBJbiBtb3JlIHByYWN0aWNhbCB0ZXJtcyBpdCBtZWFucwogICAgIHRoYXQgaWYgYXBwbGljYXRpb24gd2FudHMgdG8gZGlzYWJsZSBUTFMxLjAgaW4gZmF2b3Igb2YgVExTMS4xIGFuZAogICAgIGFib3ZlLCBpdCdzIG5vdCBzdWZmaWNpZW50IHRvIHBhc3MgU1NMX09QX05PX1RMU3YxLCBvbmUgaGFzIHRvIHBhc3MKICAgICBTU0xfT1BfTk9fVExTdjF8U1NMX09QX05PX1NTTHYzfFNTTF9PUF9OT19TU0x2Mi4gVGhpcyBhcHBsaWVzIHRvCiAgICAgY2xpZW50IHNpZGUuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4xIGFuZCAxLjAuMWEgWzE5IEFwciAyMDEyXQoKICAqKSBDaGVjayBmb3IgcG90ZW50aWFsbHkgZXhwbG9pdGFibGUgb3ZlcmZsb3dzIGluIGFzbjFfZDJpX3JlYWRfYmlvCiAgICAgQlVGX21lbV9ncm93IGFuZCBCVUZfbWVtX2dyb3dfY2xlYW4uIFJlZnVzZSBhdHRlbXB0cyB0byBzaHJpbmsgYnVmZmVyCiAgICAgaW4gQ1JZUFRPX3JlYWxsb2NfY2xlYW4uCgogICAgIFRoYW5rcyB0byBUYXZpcyBPcm1hbmR5LCBHb29nbGUgU2VjdXJpdHkgVGVhbSwgZm9yIGRpc2NvdmVyaW5nIHRoaXMKICAgICBpc3N1ZSBhbmQgdG8gQWRhbSBMYW5nbGV5IDxhZ2xAY2hyb21pdW0ub3JnPiBmb3IgZml4aW5nIGl0LgogICAgIChDVkUtMjAxMi0yMTEwKQogICAgIFtBZGFtIExhbmdsZXkgKEdvb2dsZSksIFRhdmlzIE9ybWFuZHksIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBEb24ndCBhbGxvdyBUTFMgMS4yIFNIQS0yNTYgY2lwaGVyc3VpdGVzIGluIFRMUyAxLjAsIDEuMSBjb25uZWN0aW9ucy4KICAgICBbQWRhbSBMYW5nbGV5XQoKICAqKSBXb3JrYXJvdW5kcyBmb3Igc29tZSBicm9rZW4gc2VydmVycyB0aGF0ICJoYW5nIiBpZiBhIGNsaWVudCBoZWxsbwogICAgIHJlY29yZCBsZW5ndGggZXhjZWVkcyAyNTUgYnl0ZXMuCgogICAgIDEuIERvIG5vdCB1c2UgcmVjb3JkIHZlcnNpb24gbnVtYmVyID4gVExTIDEuMCBpbiBpbml0aWFsIGNsaWVudAogICAgICAgIGhlbGxvOiBzb21lIChidXQgbm90IGFsbCkgaGFuZ2luZyBzZXJ2ZXJzIHdpbGwgbm93IHdvcmsuCiAgICAgMi4gSWYgd2Ugc2V0IE9QRU5TU0xfTUFYX1RMUzFfMl9DSVBIRVJfTEVOR1RIIHRoaXMgd2lsbCB0cnVuY2F0ZQoJdGhlIG51bWJlciBvZiBjaXBoZXJzIHNlbnQgaW4gdGhlIGNsaWVudCBoZWxsby4gVGhpcyBzaG91bGQgYmUKICAgICAgICBzZXQgdG8gYW4gZXZlbiBudW1iZXIsIHN1Y2ggYXMgNTAsIGZvciBleGFtcGxlIGJ5IHBhc3Npbmc6CiAgICAgICAgLURPUEVOU1NMX01BWF9UTFMxXzJfQ0lQSEVSX0xFTkdUSD01MCB0byBjb25maWcgb3IgQ29uZmlndXJlLgogICAgICAgIE1vc3QgYnJva2VuIHNlcnZlcnMgc2hvdWxkIG5vdyB3b3JrLgogICAgIDMuIElmIGFsbCBlbHNlIGZhaWxzIHNldHRpbmcgT1BFTlNTTF9OT19UTFMxXzJfQ0xJRU5UIHdpbGwgZGlzYWJsZQoJVExTIDEuMiBjbGllbnQgc3VwcG9ydCBlbnRpcmVseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggU0VHViBpbiBWZWN0b3IgUGVybXV0YXRpb24gQUVTIG1vZHVsZSBvYnNlcnZlZCBpbiBPcGVuU1NILgogICAgIFtBbmR5IFBvbHlha292XQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGggYW5kIDEuMC4xICBbMTQgTWFyIDIwMTJdCgogICopIEFkZCBjb21wYXRpYmlsaXR5IHdpdGggb2xkIE1EQzIgc2lnbmF0dXJlcyB3aGljaCB1c2UgYW4gQVNOMSBPQ1RFVAogICAgIFNUUklORyBmb3JtIGluc3RlYWQgb2YgYSBEaWdlc3RJbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBmb3JtYXQgdXNlZCBmb3IgTURDMiBSU0Egc2lnbmF0dXJlcyBpcyBpbmNvbnNpc3RlbnQgYmV0d2VlbiBFVlAKICAgICBhbmQgdGhlIFJTQV9zaWduL1JTQV92ZXJpZnkgZnVuY3Rpb25zLiBUaGlzIHdhcyBtYWRlIG1vcmUgYXBwYXJlbnQgd2hlbgogICAgIE9wZW5TU0wgdXNlZCBSU0Ffc2lnbi9SU0FfdmVyaWZ5IGZvciBzb21lIFJTQSBzaWduYXR1cmVzIGluIHBhcnRpY3VsYXIKICAgICB0aG9zZSB3aGljaCB3ZW50IHRocm91Z2ggRVZQX1BLRVlfTUVUSE9EIGluIDEuMC4wIGFuZCBsYXRlci4gRGV0ZWN0IAogICAgIHRoZSBjb3JyZWN0IGZvcm1hdCBpbiBSU0FfdmVyaWZ5IHNvIGJvdGggZm9ybXMgdHJhbnNwYXJlbnRseSB3b3JrLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNvbWUgc2VydmVycyB3aGljaCBzdXBwb3J0IFRMUyAxLjAgY2FuIGNob2tlIGlmIHdlIGluaXRpYWxseSBpbmRpY2F0ZQogICAgIHN1cHBvcnQgZm9yIFRMUyAxLjIgYW5kIGxhdGVyIHJlbmVnb3RpYXRlIHVzaW5nIFRMUyAxLjAgaW4gdGhlIFJTQQogICAgIGVuY3J5cHRlZCBwcmVtYXN0ZXIgc2VjcmV0LiBBcyBhIHdvcmthcm91bmQgdXNlIHRoZSBtYXhpbXVtIHBlcm1pdHRlZAogICAgIGNsaWVudCB2ZXJzaW9uIGluIGNsaWVudCBoZWxsbywgdGhpcyBzaG91bGQga2VlcCBzdWNoIHNlcnZlcnMgaGFwcHkKICAgICBhbmQgc3RpbGwgd29yayB3aXRoIHByZXZpb3VzIHZlcnNpb25zIG9mIE9wZW5TU0wuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRMUy9EVExTIGhlYXJ0YmVhdHMuCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4gPHNlZ2dlbG1hbm5AZmgtbXVlbnN0ZXIuZGU+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgU0NUUC4KICAgICBbUm9iaW4gU2VnZ2VsbWFubiA8c2VnZ2VsbWFubkBmaC1tdWVuc3Rlci5kZT5dCgogICopIEltcHJvdmVkIFBSTkcgc2VlZGluZyBmb3IgVk9TLgogICAgIFtQYXVsIEdyZWVuIDxQYXVsLkdyZWVuQHN0cmF0dXMuY29tPl0KCiAgKikgRXh0ZW5zaXZlIGFzc2VtYmxlciBwYWNrcyB1cGRhdGVzLCBtb3N0IG5vdGFibHk6CgoJLSB4ODZbXzY0XTogICAgIEFFUy1OSSwgUENMTVVMUURRLCBSRFJBTkQgc3VwcG9ydDsKCS0geDg2W182NF06ICAgICBTU1NFMyBzdXBwb3J0IChTSEExLCB2ZWN0b3ItcGVybXV0YXRpb24gQUVTKTsKCS0geDg2XzY0OiAgICAgICBiaXQtc2xpY2VkIEFFUyBpbXBsZW1lbnRhdGlvbjsKCS0gQVJNOiAgICAgICAgICBORU9OIHN1cHBvcnQsIGNvbnRlbXBvcmFyeSBwbGF0Zm9ybXMgb3B0aW1pemF0aW9uczsKCS0gczM5MHg6ICAgICAgICB6MTk2IHN1cHBvcnQ7CgktICo6ICAgICAgICAgICAgR0hBU0ggYW5kIEdGKDJebSkgbXVsdGlwbGljYXRpb24gaW1wbGVtZW50YXRpb25zOwoKICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTWFrZSBUTFMtU1JQIGNvZGUgY29uZm9ybWFudCB3aXRoIFJGQyA1MDU0IEFQSSBjbGVhbnVwCiAgICAgKHJlbW92YWwgb2YgdW5uZWNlc3NhcnkgY29kZSkKICAgICBbUGV0ZXIgU3lsdmVzdGVyIDxwZXRlci5zeWx2ZXN0ZXJAZWRlbHdlYi5mcj5dCgogICopIEFkZCBUTFMga2V5IG1hdGVyaWFsIGV4cG9ydGVyIGZyb20gUkZDIDU3MDUuCiAgICAgW0VyaWMgUmVzY29ybGFdCgogICopIEFkZCBEVExTLVNSVFAgbmVnb3RpYXRpb24gZnJvbSBSRkMgNTc2NC4KICAgICBbRXJpYyBSZXNjb3JsYV0KCiAgKikgQWRkIE5leHQgUHJvdG9jb2wgTmVnb3RpYXRpb24sCiAgICAgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtYWdsLXRscy1uZXh0cHJvdG9uZWctMDAuIENhbiBiZQogICAgIGRpc2FibGVkIHdpdGggYSBuby1ucG4gZmxhZyB0byBjb25maWcgb3IgQ29uZmlndXJlLiBDb2RlIGRvbmF0ZWQKICAgICBieSBHb29nbGUuCiAgICAgW0FkYW0gTGFuZ2xleSA8YWdsQGdvb2dsZS5jb20+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBBZGQgb3B0aW9uYWwgNjQtYml0IG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbnMgb2YgZWxsaXB0aWMgY3VydmVzIE5JU1QtUDIyNCwKICAgICBOSVNULVAyNTYsIE5JU1QtUDUyMSwgd2l0aCBjb25zdGFudC10aW1lIHNpbmdsZSBwb2ludCBtdWx0aXBsaWNhdGlvbiBvbgogICAgIHR5cGljYWwgaW5wdXRzLiBDb21waWxlciBzdXBwb3J0IGZvciB0aGUgbm9uc3RhbmRhcmQgdHlwZSBfX3VpbnQxMjhfdCBpcwogICAgIHJlcXVpcmVkIHRvIHVzZSB0aGlzIChwcmVzZW50IGluIGdjYyA0LjQgYW5kIGxhdGVyLCBmb3IgNjQtYml0IGJ1aWxkcykuCiAgICAgQ29kZSBtYWRlIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSB2ZXJzaW9uIDIuMC4KCiAgICAgU3BlY2lmeSAiZW5hYmxlLWVjX25pc3RwXzY0X2djY18xMjgiIG9uIHRoZSBDb25maWd1cmUgKG9yIGNvbmZpZykgY29tbWFuZAogICAgIGxpbmUgdG8gaW5jbHVkZSB0aGlzIGluIHlvdXIgYnVpbGQgb2YgT3BlblNTTCwgYW5kIHJ1biAibWFrZSBkZXBlbmQiIChvcgogICAgICJtYWtlIHVwZGF0ZSIpLiBUaGlzIGVuYWJsZXMgdGhlIGZvbGxvd2luZyBFQ19NRVRIT0RzOgoKICAgICAgICAgRUNfR0ZwX25pc3RwMjI0X21ldGhvZCgpCiAgICAgICAgIEVDX0dGcF9uaXN0cDI1Nl9tZXRob2QoKQogICAgICAgICBFQ19HRnBfbmlzdHA1MjFfbWV0aG9kKCkKCiAgICAgRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoKSB3aWxsIGF1dG9tYXRpY2FsbHkgdXNlIHRoZXNlICh3aGlsZQogICAgIEVDX0dST1VQX25ld19jdXJ2ZV9HRnAoKSBjdXJyZW50bHkgcHJlZmVycyB0aGUgbW9yZSBmbGV4aWJsZQogICAgIGltcGxlbWVudGF0aW9ucykuCiAgICAgW0VtaWxpYSBL5HNwZXIsIEFkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyIChHb29nbGUpXQoKICAqKSBVc2UgdHlwZSBvc3NsX3NzaXplX3QgaW5zdGFkIG9mIHNzaXplX3Qgd2hpY2ggaXNuJ3QgYXZhaWxhYmxlIG9uCiAgICAgYWxsIHBsYXRmb3Jtcy4gTW92ZSBzc2l6ZV90IGRlZmluaXRpb24gZnJvbSBlX29zLmggdG8gdGhlIHB1YmxpYwogICAgIGhlYWRlciBmaWxlIGVfb3MyLmggYXMgaXQgbm93IGFwcGVhcnMgaW4gcHVibGljIGhlYWRlciBmaWxlIGNtcy5oCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1zaWdvcHQgb3B0aW9uIHRvIHRoZSBjYSwgcmVxIGFuZCB4NTA5IHV0aWxpdGllcy4gQWRkaXRpb25hbAogICAgIHNpZ25hdHVyZSBwYXJhbWV0ZXJzIGNhbiBiZSBwYXNzZWQgdXNpbmcgdGhpcyBvcHRpb24gYW5kIGluCiAgICAgcGFydGljdWxhciBQU1MuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBSU0EgUFNTIHNpZ25pbmcgZnVuY3Rpb24uIFRoaXMgd2lsbCBnZW5lcmF0ZSBhbmQgc2V0IHRoZQogICAgIGFwcHJvcHJpYXRlIEFsZ29yaXRobUlkZW50aWZpZXJzIGZvciBQU1MgYmFzZWQgb24gdGhvc2UgaW4gdGhlCiAgICAgY29ycmVzcG9uZGluZyBFVlBfTURfQ1RYIHN0cnVjdHVyZS4gTm8gYXBwbGljYXRpb24gc3VwcG9ydCB5ZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgY29tcGFuaW9uIGFsZ29yaXRobSBzcGVjaWZpYyBBU04xIHNpZ25pbmcgcm91dGluZXMuCiAgICAgTmV3IGZ1bmN0aW9uIEFTTjFfaXRlbV9zaWduX2N0eCgpIHNpZ25zIGEgcHJlLWluaXRpYWxpc2VkCiAgICAgRVZQX01EX0NUWCBzdHJ1Y3R1cmUgYW5kIHNldHMgQWxnb3JpdGhtSWRlbnRpZmllcnMgYmFzZWQgb24KICAgICB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGFsZ29yaXRobSBzcGVjaWZpYyBBU04xIHZlcmlmaWNhdGlvbiBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbgogICAgIHRvIEVWUF9QS0VZX0FTTjFfTUVUSE9EOiB0aGlzIGlzIG5vdCBpbiBFVlBfUEtFWV9NRVRIT0Qgc2luY2UgdGhlIEFTTjEKICAgICBoYW5kbGluZyB3aWxsIGJlIHRoZSBzYW1lIG5vIG1hdHRlciB3aGF0IEVWUF9QS0VZX01FVEhPRCBpcyB1c2VkLgogICAgIEFkZCBhIFBTUyBoYW5kbGVyIHRvIHN1cHBvcnQgdmVyaWZpY2F0aW9uIG9mIFBTUyBzaWduYXR1cmVzOiBjaGVja2VkCiAgICAgYWdhaW5zdCBhIG51bWJlciBvZiBzYW1wbGUgY2VydGlmaWNhdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzaWduYXR1cmUgcHJpbnRpbmcgZm9yIFBTUy4gQWRkIFBTUyBPSURzLgogICAgIFtTdGV2ZSBIZW5zb24sIE1hcnRpbiBLYWlzZXIgPGxpc3RzQGthaXNlci5jeD5dCgogICopIEFkZCBhbGdvcml0aG0gc3BlY2lmaWMgc2lnbmF0dXJlIHByaW50aW5nLiBBbiBpbmRpdmlkdWFsIEFTTjEgbWV0aG9kCiAgICAgY2FuIG5vdyBwcmludCBvdXQgc2lnbmF0dXJlcyBpbnN0ZWFkIG9mIHRoZSBzdGFuZGFyZCBoZXggZHVtcC4gCgogICAgIE1vcmUgY29tcGxleCBzaWduYXR1cmVzIChlLmcuIFBTUykgY2FuIHByaW50IG91dCBtb3JlIG1lYW5pbmdmdWwKICAgICBpbmZvcm1hdGlvbi4gSW5jbHVkZSBEU0EgdmVyc2lvbiB0aGF0IHByaW50cyBvdXQgdGhlIHNpZ25hdHVyZQogICAgIHBhcmFtZXRlcnMgciwgcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQYXNzd29yZCBiYXNlZCByZWNpcGllbnQgaW5mbyBzdXBwb3J0IGZvciBDTVMgbGlicmFyeTogaW1wbGVtZW50aW5nCiAgICAgUkZDMzIxMS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTcGxpdCBwYXNzd29yZCBiYXNlZCBlbmNyeXB0aW9uIGludG8gUEJFUzIgYW5kIFBCS0RGMiBmdW5jdGlvbnMuIFRoaXMKICAgICBuZWF0bHkgc2VwYXJhdGVzIHRoZSBjb2RlIGludG8gY2lwaGVyIGFuZCBQQkUgc2VjdGlvbnMgYW5kIGlzIHJlcXVpcmVkCiAgICAgZm9yIHNvbWUgYWxnb3JpdGhtcyB0aGF0IHNwbGl0IFBCRVMyIGludG8gc2VwYXJhdGUgcGllY2VzIChzdWNoIGFzCiAgICAgcGFzc3dvcmQgYmFzZWQgQ01TKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTZXNzaW9uLWhhbmRsaW5nIGZpeGVzOgogICAgIC0gRml4IGhhbmRsaW5nIG9mIGNvbm5lY3Rpb25zIHRoYXQgYXJlIHJlc3VtaW5nIHdpdGggYSBzZXNzaW9uIElELAogICAgICAgYnV0IGFsc28gc3VwcG9ydCBTZXNzaW9uIFRpY2tldHMuCiAgICAgLSBGaXggYSBidWcgdGhhdCBzdXBwcmVzc2VkIGlzc3Vpbmcgb2YgYSBuZXcgdGlja2V0IGlmIHRoZSBjbGllbnQKICAgICAgIHByZXNlbnRlZCBhIHRpY2tldCB3aXRoIGFuIGV4cGlyZWQgc2Vzc2lvbi4KICAgICAtIFRyeSB0byBzZXQgdGhlIHRpY2tldCBsaWZldGltZSBoaW50IHRvIHNvbWV0aGluZyByZWFzb25hYmxlLgogICAgIC0gTWFrZSB0aWNrZXRzIHNob3J0ZXIgYnkgZXhjbHVkaW5nIGlycmVsZXZhbnQgaW5mb3JtYXRpb24uCiAgICAgLSBPbiB0aGUgY2xpZW50IHNpZGUsIGRvbid0IGlnbm9yZSByZW5ld2VkIHRpY2tldHMuCiAgICAgW0FkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyIChHb29nbGUpXQoKICAqKSBGaXggUFNLIHNlc3Npb24gcmVwcmVzZW50YXRpb24uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIFJDNC1NRDUgYW5kIEFFU05JLVNIQTEgInN0aXRjaGVkIiBpbXBsZW1lbnRhdGlvbnMuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEludGVsLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgR0NNIHN1cHBvcnQgdG8gVExTIGxpYnJhcnkuIFNvbWUgY3VzdG9tIGNvZGUgaXMgbmVlZGVkIHRvIHNwbGl0CiAgICAgdGhlIElWIGJldHdlZW4gdGhlIGZpeGVkIChmcm9tIFBSRikgYW5kIGV4cGxpY2l0IChmcm9tIFRMUyByZWNvcmQpCiAgICAgcG9ydGlvbnMuIFRoaXMgYWRkcyBhbGwgR0NNIGNpcGhlcnN1aXRlcyBzdXBwb3J0ZWQgYnkgUkZDNTI4OCBhbmQgCiAgICAgUkZDNTI4OS4gR2VuZXJhbGlzZSBzb21lIEFFUyogY2lwaGVyc3RyaW5ncyB0byBpbmNsdWRlIEdDTSBhbmQKICAgICBhZGQgYSBzcGVjaWFsIEFFU0dDTSBzdHJpbmcgZm9yIEdDTSBvbmx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4cGFuZCByYW5nZSBvZiBjdHJscyBmb3IgQUVTIEdDTS4gUGVybWl0IHNldHRpbmcgaW52b2NhdGlvbgogICAgIGZpZWxkIG9uIGRlY3J5cHQgYW5kIHJldHJpZXZhbCBvZiBpbnZvY2F0aW9uIGZpZWxkIG9ubHkgb24gZW5jcnlwdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgSE1BQyBFQ0MgY2lwaGVyc3VpdGVzIGZyb20gUkZDNTI4OS4gSW5jbHVkZSBTSEEzODQgUFJGIHN1cHBvcnQuCiAgICAgQXMgcmVxdWlyZWQgYnkgUkZDNTI4OSB0aGVzZSBjaXBoZXJzdWl0ZXMgY2Fubm90IGJlIHVzZWQgaWYgZm9yCiAgICAgdmVyc2lvbnMgb2YgVExTIGVhcmxpZXIgdGhhbiAxLjIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIEZJUFMgY2FwYWJsZSBPcGVuU1NMIGludGVycHJldCBhIE5VTEwgZGVmYXVsdCBwdWJsaWMga2V5IG1ldGhvZAogICAgIGFzIHVuc2V0IGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGRlZmF1bHQgYnV0IGRvICpub3QqIHNldCB0aGUgZGVmYXVsdC4KICAgICBUaGlzIG1lYW5zIHdlIGNhbiByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCBpbiBhcHBsaWNhdGlvbnMgdGhhdAogICAgIHN3aXRjaCBiZXR3ZWVuIEZJUFMgYW5kIG5vbi1GSVBTIG1vZGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZGlyZWN0IEhNQUMgYW5kIENNQUMgb3BlcmF0aW9ucyB0byBGSVBTIG1vZHVsZSBpbiBGSVBTIG1vZGUuIElmIGFuCiAgICAgRU5HSU5FIGlzIHVzZWQgdGhlbiB3ZSBjYW5ub3QgaGFuZGxlIHRoYXQgaW4gdGhlIEZJUFMgbW9kdWxlIHNvIHdlCiAgICAga2VlcCBvcmlnaW5hbCBjb2RlIGlmZiBub24tRklQUyBvcGVyYXRpb25zIGFyZSBhbGxvd2VkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtYXR0aW1lIG9wdGlvbiB0byBvcGVuc3NsIHV0aWxpdGllcy4KICAgICBbUGV0ZXIgRWNrZXJzbGV5IDxwZGVAZWZmLm9yZz4sIEJlbiBMYXVyaWUgYW5kIFN0ZXZlIEhlbnNvbl0KCiAgKikgUmVkaXJlY3QgRFNBIGFuZCBESCBvcGVyYXRpb25zIHRvIEZJUFMgbW9kdWxlIGluIEZJUFMgbW9kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWRpcmVjdCBFQ0RTQSBhbmQgRUNESCBvcGVyYXRpb25zIHRvIEZJUFMgbW9kdWxlIGluIEZJUFMgbW9kZS4gQWxzbyB1c2UKICAgICBGSVBTIEVDIG1ldGhvZHMgdW5jb25kaXRpb25hbGx5IGZvciBub3cuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGJ1aWxkIG9wdGlvbiBuby1lYzJtIHRvIGRpc2FibGUgY2hhcmFjdGVyaXN0aWMgMiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJhY2twb3J0IGxpYmNyeXB0byBhdWRpdCBvZiByZXR1cm4gdmFsdWUgY2hlY2tpbmcgZnJvbSAxLjEuMC1kZXY7IG5vdAogICAgIGFsbCBjYXNlcyBjYW4gYmUgY292ZXJlZCBhcyBzb21lIGludHJvZHVjZSBiaW5hcnkgaW5jb21wYXRpYmlsaXRpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVkaXJlY3QgUlNBIG9wZXJhdGlvbnMgdG8gRklQUyBtb2R1bGUgaW5jbHVkaW5nIGtleWdlbiwKICAgICBlbmNyeXB0LCBkZWNyeXB0LCBzaWduIGFuZCB2ZXJpZnkuIEJsb2NrIHVzZSBvZiBub24gRklQUyBSU0EgbWV0aG9kcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc2ltaWxhciBsb3cgbGV2ZWwgQVBJIGJsb2NraW5nIHRvIGNpcGhlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTG93IGxldmVsIGRpZ2VzdCBBUElzIGFyZSBub3QgYXBwcm92ZWQgaW4gRklQUyBtb2RlOiBhbnkgYXR0ZW1wdAogICAgIHRvIHVzZSB0aGVzZSB3aWxsIGNhdXNlIGEgZmF0YWwgZXJyb3IuIEFwcGxpY2F0aW9ucyB0aGF0ICpyZWFsbHkqIHdhbnQKICAgICB0byB1c2UgdGhlbSBjYW4gdXNlIHRoZSBwcml2YXRlXyogdmVyc2lvbiBpbnN0ZWFkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlZGlyZWN0IGNpcGhlciBvcGVyYXRpb25zIHRvIEZJUFMgbW9kdWxlIGZvciBGSVBTIGJ1aWxkcy4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVkaXJlY3QgZGlnZXN0IG9wZXJhdGlvbnMgdG8gRklQUyBtb2R1bGUgZm9yIEZJUFMgYnVpbGRzLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgYnVpbGQgc3lzdGVtIHRvIGFkZCAiZmlwcyIgZmxhZyB3aGljaCB3aWxsIGxpbmsgaW4gZmlwc2NhbmlzdGVyLm8KICAgICBmb3Igc3RhdGljIGFuZCBzaGFyZWQgbGlicmFyeSBidWlsZHMgZW1iZWRkaW5nIGEgc2lnbmF0dXJlIGlmIG5lZWRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBPdXRwdXQgVExTIHN1cHBvcnRlZCBjdXJ2ZXMgaW4gcHJlZmVyZW5jZSBvcmRlciBpbnN0ZWFkIG9mIG51bWVyaWNhbAogICAgIG9yZGVyLiBUaGlzIGlzIGN1cnJlbnRseSBoYXJkY29kZWQgZm9yIHRoZSBoaWdoZXN0IG9yZGVyIGN1cnZlcyBmaXJzdC4KICAgICBUaGlzIHNob3VsZCBiZSBjb25maWd1cmFibGUgc28gYXBwbGljYXRpb25zIGNhbiBqdWRnZSBzcGVlZCB2cyBzdHJlbmd0aC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgVExTIHYxLjIgc2VydmVyIHN1cHBvcnQgZm9yIGNsaWVudCBhdXRoZW50aWNhdGlvbi4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEZJUFMgbW9kZSBpbiBzc2wgbGlicmFyeTogZGlzYWJsZSBTU0x2Mywgbm9uLUZJUFMgY2lwaGVycwogICAgIGFuZCBlbmFibGUgTUQ1LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1bmN0aW9ucyBGSVBTX21vZGVfc2V0KCkgYW5kIEZJUFNfbW9kZSgpIHdoaWNoIGNhbGwgdGhlIHVuZGVybHlpbmcKICAgICBGSVBTIG1vZHVsZXMgdmVyc2lvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIFRMUyB2MS4yIGNsaWVudCBzaWRlIHN1cHBvcnQgZm9yIGNsaWVudCBhdXRoZW50aWNhdGlvbi4gS2VlcCBjYWNoZQogICAgIG9mIGhhbmRzaGFrZSByZWNvcmRzIGxvbmdlciBhcyB3ZSBkb24ndCBrbm93IHRoZSBoYXNoIGFsZ29yaXRobSB0byB1c2UKICAgICB1bnRpbCBhZnRlciB0aGUgY2VydGlmaWNhdGUgcmVxdWVzdCBtZXNzYWdlIGlzIHJlY2VpdmVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgVExTIHYxLjIgY2xpZW50IHN1cHBvcnQuIEFkZCBhIGRlZmF1bHQgc2lnbmF0dXJlIGFsZ29yaXRobXMKICAgICBleHRlbnNpb24gaW5jbHVkaW5nIGFsbCB0aGUgYWxnb3JpdGhtcyB3ZSBzdXBwb3J0LiBQYXJzZSBuZXcgc2lnbmF0dXJlCiAgICAgZm9ybWF0IGluIGNsaWVudCBrZXkgZXhjaGFuZ2UuIFJlbGF4IHNvbWUgRUNDIHNpZ25pbmcgcmVzdHJpY3Rpb25zIGZvcgogICAgIFRMUyB2MS4yIGFzIGluZGljYXRlZCBpbiBSRkM1MjQ2LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzZXJ2ZXIgc3VwcG9ydCBmb3IgVExTIHYxLjIgc2lnbmF0dXJlIGFsZ29yaXRobXMgZXh0ZW5zaW9uLiBTd2l0Y2gKICAgICB0byBuZXcgc2lnbmF0dXJlIGZvcm1hdCB3aGVuIG5lZWRlZCB1c2luZyBjbGllbnQgZGlnZXN0IHByZWZlcmVuY2UuCiAgICAgQWxsIHNlcnZlciBjaXBoZXJzdWl0ZXMgc2hvdWxkIG5vdyB3b3JrIGNvcnJlY3RseSBpbiBUTFMgdjEuMi4gTm8gY2xpZW50CiAgICAgc3VwcG9ydCB5ZXQgYW5kIG5vIHN1cHBvcnQgZm9yIGNsaWVudCBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBUTFMgdjEuMiBzdXBwb3J0LiBBZGQgbmV3IFNIQTI1NiBkaWdlc3QgdG8gc3NsIGNvZGUsIHN3aXRjaAogICAgIHRvIFNIQTI1NiBmb3IgUFJGIHdoZW4gdXNpbmcgVExTIHYxLjIgYW5kIGxhdGVyLiBBZGQgbmV3IFNIQTI1NiBiYXNlZAogICAgIGNpcGhlcnN1aXRlcy4gQXQgcHJlc2VudCBvbmx5IFJTQSBrZXkgZXhjaGFuZ2UgY2lwaGVyc3VpdGVzIHdvcmsgd2l0aAogICAgIFRMUyB2MS4yLiBBZGQgbmV3IG9wdGlvbiBmb3IgVExTIHYxLjIgcmVwbGFjaW5nIHRoZSBvbGQgYW5kIG9ic29sZXRlCiAgICAgU1NMX09QX1BLQ1MxX0NIRUNLIGZsYWdzIHdpdGggU1NMX09QX05PX1RMU3YxXzIuIE5ldyBUTFN2MS4yIG1ldGhvZHMKICAgICBhbmQgdmVyc2lvbiBjaGVja2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9uIE9QRU5TU0xfTk9fU1NMX0lOVEVSTi4gSWYgYW4gYXBwbGljYXRpb24gY2FuIGJlIGNvbXBpbGVkCiAgICAgd2l0aCB0aGlzIGRlZmluZWQgaXQgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkgYW55IGNoYW5nZXMgdG8gc3NsIGludGVybmFsCiAgICAgc3RydWN0dXJlcy4gQWRkIHNldmVyYWwgdXRpbGl0eSBmdW5jdGlvbnMgdG8gYWxsb3cgb3BlbnNzbCBhcHBsaWNhdGlvbgogICAgIHRvIHdvcmsgd2l0aCBPUEVOU1NMX05PX1NTTF9JTlRFUk4gZGVmaW5lZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgU1JQIHN1cHBvcnQuCiAgICAgW1RvbSBXdSA8dGp3QGNzLnN0YW5mb3JkLmVkdT4gYW5kIEJlbiBMYXVyaWVdCgogICopIEFkZCBmdW5jdGlvbnMgdG8gY29weSBFVlBfUEtFWV9NRVRIT0QgYW5kIHJldHJpZXZlIGZsYWdzIGFuZCBpZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQZXJtaXQgYWJicmV2aWF0ZWQgaGFuZHNoYWtlcyB3aGVuIHJlbmVnb3RpYXRpbmcgdXNpbmcgdGhlIGZ1bmN0aW9uCiAgICAgU1NMX3JlbmVnb3RpYXRlX2FiYnJldmlhdGVkKCkuCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4gPHNlZ2dlbG1hbm5AZmgtbXVlbnN0ZXIuZGU+XQoKICAqKSBBZGQgY2FsbCB0byBFTkdJTkVfcmVnaXN0ZXJfYWxsX2NvbXBsZXRlKCkgdG8KICAgICBFTkdJTkVfbG9hZF9idWlsdGluX2VuZ2luZXMoKSwgc28gc29tZSBpbXBsZW1lbnRhdGlvbnMgZ2V0IHVzZWQKICAgICBhdXRvbWF0aWNhbGx5IGluc3RlYWQgb2YgbmVlZGluZyBleHBsaWNpdCBhcHBsaWNhdGlvbiBzdXBwb3J0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBUTFMga2V5IGV4cG9ydGVyIGFzIGRlc2NyaWJlZCBpbiBSRkM1NzA1LgogICAgIFtSb2JpbiBTZWdnZWxtYW5uIDxzZWdnZWxtYW5uQGZoLW11ZW5zdGVyLmRlPiwgU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIFRMU3YxLjEgc3VwcG9ydC4gU2luY2UgVExTdjEuMSBpcyB2ZXJ5IHNpbWlsYXIgdG8gVExTIHYxLjAgb25seQogICAgIGEgZmV3IGNoYW5nZXMgYXJlIHJlcXVpcmVkOgoKICAgICAgIEFkZCBTU0xfT1BfTk9fVExTdjFfMSBmbGFnLgogICAgICAgQWRkIFRMU3YxXzEgbWV0aG9kcy4KICAgICAgIFVwZGF0ZSB2ZXJzaW9uIGNoZWNraW5nIGxvZ2ljIHRvIGhhbmRsZSB2ZXJzaW9uIDEuMS4KICAgICAgIEFkZCBleHBsaWNpdCBJViBoYW5kbGluZyAocG9ydGVkIGZyb20gRFRMUyBjb2RlKS4KICAgICAgIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9ucyB0byBzX2NsaWVudC9zX3NlcnZlci4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMGcgYW5kIDEuMC4waCBbMTIgTWFyIDIwMTJdCgogICopIEZpeCBNTUEgKEJsZWljaGVuYmFjaGVyJ3MgYXR0YWNrIG9uIFBLQ1MgIzEgdjEuNSBSU0EgcGFkZGluZykgd2Vha25lc3MKICAgICBpbiBDTVMgYW5kIFBLQ1M3IGNvZGUuIFdoZW4gUlNBIGRlY3J5cHRpb24gZmFpbHMgdXNlIGEgcmFuZG9tIGtleSBmb3IKICAgICBjb250ZW50IGRlY3J5cHRpb24gYW5kIGFsd2F5cyByZXR1cm4gdGhlIHNhbWUgZXJyb3IuIE5vdGU6IHRoaXMgYXR0YWNrCiAgICAgbmVlZHMgb24gYXZlcmFnZSAyXjIwIG1lc3NhZ2VzIHNvIGl0IG9ubHkgYWZmZWN0cyBhdXRvbWF0ZWQgc2VuZGVycy4gVGhlCiAgICAgb2xkIGJlaGF2aW91ciBjYW4gYmUgcmVlbmFibGVkIGluIHRoZSBDTVMgY29kZSBieSBzZXR0aW5nIHRoZQogICAgIENNU19ERUJVR19ERUNSWVBUIGZsYWc6IHRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3Rpbmcgd2hlcmUKICAgICBhbiBNTUEgZGVmZW5jZSBpcyBub3QgbmVjZXNzYXJ5LgogICAgIFRoYW5rcyB0byBJdmFuIE5lc3RsZXJvZGUgPGluZXN0bGVyb2RlQHVzLmlibS5jb20+IGZvciBkaXNjb3ZlcmluZwogICAgIHRoaXMgaXNzdWUuIChDVkUtMjAxMi0wODg0KQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBDVkUtMjAxMS00NjE5OiBtYWtlIHN1cmUgd2UgcmVhbGx5IGFyZSByZWNlaXZpbmcgYSAKICAgICBjbGllbnQgaGVsbG8gYmVmb3JlIHJlamVjdGluZyBtdWx0aXBsZSBTR0MgcmVzdGFydHMuIFRoYW5rcyB0bwogICAgIEl2YW4gTmVzdGxlcm9kZSA8aW5lc3RsZXJvZGVAdXMuaWJtLmNvbT4gZm9yIGRpc2NvdmVyaW5nIHRoaXMgYnVnLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wZiBhbmQgMS4wLjBnIFsxOCBKYW4gMjAxMl0KCiAgKikgRml4IGZvciBEVExTIERvUyBpc3N1ZSBpbnRyb2R1Y2VkIGJ5IGZpeCBmb3IgQ1ZFLTIwMTEtNDEwOS4KICAgICBUaGFua3MgdG8gQW50b25pbyBNYXJ0aW4sIEVudGVycHJpc2UgU2VjdXJlIEFjY2VzcyBSZXNlYXJjaCBhbmQKICAgICBEZXZlbG9wbWVudCwgQ2lzY28gU3lzdGVtcywgSW5jLiBmb3IgZGlzY292ZXJpbmcgdGhpcyBidWcgYW5kCiAgICAgcHJlcGFyaW5nIGEgZml4LiAoQ1ZFLTIwMTItMDA1MCkKICAgICBbQW50b25pbyBNYXJ0aW5dCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wZSBhbmQgMS4wLjBmIFs0IEphbiAyMDEyXQoKICAqKSBOYWRoZW0gQWxmYXJkYW4gYW5kIEtlbm55IFBhdGVyc29uIGhhdmUgZGlzY292ZXJlZCBhbiBleHRlbnNpb24KICAgICBvZiB0aGUgVmF1ZGVuYXkgcGFkZGluZyBvcmFjbGUgYXR0YWNrIG9uIENCQyBtb2RlIGVuY3J5cHRpb24KICAgICB3aGljaCBlbmFibGVzIGFuIGVmZmljaWVudCBwbGFpbnRleHQgcmVjb3ZlcnkgYXR0YWNrIGFnYWluc3QKICAgICB0aGUgT3BlblNTTCBpbXBsZW1lbnRhdGlvbiBvZiBEVExTLiBUaGVpciBhdHRhY2sgZXhwbG9pdHMgdGltaW5nCiAgICAgZGlmZmVyZW5jZXMgYXJpc2luZyBkdXJpbmcgZGVjcnlwdGlvbiBwcm9jZXNzaW5nLiBBIHJlc2VhcmNoCiAgICAgcGFwZXIgZGVzY3JpYmluZyB0aGlzIGF0dGFjayBjYW4gYmUgZm91bmQgYXQ6CiAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuaXNnLnJodWwuYWMudWsvfmtwL2R0bHMucGRmCiAgICAgVGhhbmtzIGdvIHRvIE5hZGhlbSBBbGZhcmRhbiBhbmQgS2VubnkgUGF0ZXJzb24gb2YgdGhlIEluZm9ybWF0aW9uCiAgICAgU2VjdXJpdHkgR3JvdXAgYXQgUm95YWwgSG9sbG93YXksIFVuaXZlcnNpdHkgb2YgTG9uZG9uCiAgICAgKHd3dy5pc2cucmh1bC5hYy51aykgZm9yIGRpc2NvdmVyaW5nIHRoaXMgZmxhdyBhbmQgdG8gUm9iaW4gU2VnZ2VsbWFubgogICAgIDxzZWdnZWxtYW5uQGZoLW11ZW5zdGVyLmRlPiBhbmQgTWljaGFlbCBUdWV4ZW4gPHR1ZXhlbkBmaC1tdWVuc3Rlci5kZT4KICAgICBmb3IgcHJlcGFyaW5nIHRoZSBmaXguIChDVkUtMjAxMS00MTA4KQogICAgIFtSb2JpbiBTZWdnZWxtYW5uLCBNaWNoYWVsIFR1ZXhlbl0KCiAgKikgQ2xlYXIgYnl0ZXMgdXNlZCBmb3IgYmxvY2sgcGFkZGluZyBvZiBTU0wgMy4wIHJlY29yZHMuCiAgICAgKENWRS0yMDExLTQ1NzYpCiAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKV0KCiAgKikgT25seSBhbGxvdyBvbmUgU0dDIGhhbmRzaGFrZSByZXN0YXJ0IGZvciBTU0wvVExTLiBUaGFua3MgdG8gR2VvcmdlCiAgICAgS2FkaWFuYWtpcyA8ZGVzbmFja2VkQGdtYWlsLmNvbT4gZm9yIGRpc2NvdmVyaW5nIHRoaXMgaXNzdWUgYW5kCiAgICAgQWRhbSBMYW5nbGV5IGZvciBwcmVwYXJpbmcgdGhlIGZpeC4gKENWRS0yMDExLTQ2MTkpCiAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKV0KCiAgKikgQ2hlY2sgcGFyYW1ldGVycyBhcmUgbm90IE5VTEwgaW4gR09TVCBFTkdJTkUuIChDVkUtMjAxMi0wMDI3KQogICAgIFtBbmRyZXkgS3VsaWtvdiA8YW1kZWljaEBnbWFpbC5jb20+XQoKICAqKSBQcmV2ZW50IG1hbGZvcm1lZCBSRkMzNzc5IGRhdGEgdHJpZ2dlcmluZyBhbiBhc3NlcnRpb24gZmFpbHVyZS4KICAgICBUaGFua3MgdG8gQW5kcmV3IENoaSwgQkJOIFRlY2hub2xvZ2llcywgZm9yIGRpc2NvdmVyaW5nIHRoZSBmbGF3CiAgICAgYW5kIFJvYiBBdXN0ZWluIDxzcmFAaGFjdHJuLm5ldD4gZm9yIGZpeGluZyBpdC4gKENWRS0yMDExLTQ1NzcpCiAgICAgW1JvYiBBdXN0ZWluIDxzcmFAaGFjdHJuLm5ldD5dCgogICopIEltcHJvdmVkIFBSTkcgc2VlZGluZyBmb3IgVk9TLgogICAgIFtQYXVsIEdyZWVuIDxQYXVsLkdyZWVuQHN0cmF0dXMuY29tPl0KCiAgKikgRml4IHNzbF9jaXBoLmMgc2V0LXVwIHJhY2UuCiAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKV0KCiAgKikgRml4IHNwdXJpb3VzIGZhaWx1cmVzIGluIGVjZHNhdGVzdC5jLgogICAgIFtFbWlsaWEgS+RzcGVyIChHb29nbGUpXQoKICAqKSBGaXggdGhlIEJJT19mX2J1ZmZlcigpIGltcGxlbWVudGF0aW9uICh3aGljaCB3YXMgbWl4aW5nIGRpZmZlcmVudAogICAgIGludGVycHJldGF0aW9ucyBvZiB0aGUgJy4uLl9sZW4nIGZpZWxkcykuCiAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKV0KCiAgKikgRml4IGhhbmRsaW5nIG9mIEJOX0JMSU5ESU5HOiBub3cgQk5fQkxJTkRJTkdfaW52ZXJ0X2V4IChyYXRoZXIgdGhhbgogICAgIEJOX0JMSU5ESU5HX2ludmVydF9leCkgY2FsbHMgQk5fQkxJTkRJTkdfdXBkYXRlLCBlbnN1cmluZyB0aGF0IGNvbmN1cnJlbnQKICAgICB0aHJlYWRzIHdvbid0IHJldXNlIHRoZSBzYW1lIGJsaW5kaW5nIGNvZWZmaWNpZW50cy4KCiAgICAgVGhpcyBhbHNvIGF2b2lkcyB0aGUgbmVlZCB0byBvYnRhaW4gdGhlIENSWVBUT19MT0NLX1JTQV9CTElORElORwogICAgIGxvY2sgdG8gY2FsbCBCTl9CTElORElOR19pbnZlcnRfZXgsIGFuZCBhdm9pZHMgb25lIHVzZSBvZgogICAgIEJOX0JMSU5ESU5HX3VwZGF0ZSBmb3IgZWFjaCBCTl9CTElORElORyBzdHJ1Y3R1cmUgKHByZXZpb3VzbHksCiAgICAgdGhlIGxhc3QgdXBkYXRlIGFsd2F5cyByZW1haW5lZCB1bnVzZWQpLgogICAgIFtFbWlsaWEgS+RzcGVyIChHb29nbGUpXQoKICAqKSBJbiBzc2wzX2NsZWFyLCBwcmVzZXJ2ZSBzMy0+aW5pdF9leHRyYSBhbG9uZyB3aXRoIHMzLT5yYnVmLgogICAgIFtCb2IgQnVja2hvbHogKEdvb2dsZSldCgogQ2hhbmdlcyBiZXR3ZWVuIDEuMC4wZCBhbmQgMS4wLjBlIFs2IFNlcCAyMDExXQoKICAqKSBGaXggYnVnIHdoZXJlIENSTHMgd2l0aCBuZXh0VXBkYXRlIGluIHRoZSBwYXN0IGFyZSBzb21ldGltZXMgYWNjZXB0ZWQKICAgICBieSBpbml0aWFsaXNpbmcgWDUwOV9TVE9SRV9DVFggcHJvcGVybHkuIChDVkUtMjAxMS0zMjA3KQogICAgIFtLYXNwYXIgQnJhbmQgPG9zc2xAdmVsb3guY2g+XQoKICAqKSBGaXggU1NMIG1lbW9yeSBoYW5kbGluZyBmb3IgKEVDKURIIGNpcGhlcnN1aXRlcywgaW4gcGFydGljdWxhcgogICAgIGZvciBtdWx0aS10aHJlYWRlZCB1c2Ugb2YgRUNESC4gKENWRS0yMDExLTMyMTApCiAgICAgW0FkYW0gTGFuZ2xleSAoR29vZ2xlKV0KCiAgKikgRml4IHg1MDlfbmFtZV9leF9kMmkgbWVtb3J5IGxlYWsgb24gYmFkIGlucHV0cy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW1vdmUgaGFyZCBjb2RlZCBlY2RzYVdpdGhTSEExIHNpZ25hdHVyZSB0ZXN0cyBpbiBzc2wgY29kZSBhbmQgY2hlY2sKICAgICBzaWduYXR1cmUgcHVibGljIGtleSBhbGdvcml0aG0gYnkgdXNpbmcgT0lEIHhyZWYgdXRpbGl0aWVzIGluc3RlYWQuCiAgICAgQmVmb3JlIHRoaXMgeW91IGNvdWxkIG9ubHkgdXNlIHNvbWUgRUNDIGNpcGhlcnN1aXRlcyB3aXRoIFNIQTEgb25seS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgcHJvdGVjdGlvbiBhZ2FpbnN0IEVDRFNBIHRpbWluZyBhdHRhY2tzIGFzIG1lbnRpb25lZCBpbiB0aGUgcGFwZXIKICAgICBieSBCaWxseSBCb2IgQnJ1bWxleSBhbmQgTmljb2xhIFR1dmVyaSwgc2VlOgoKCWh0dHA6Ly9lcHJpbnQuaWFjci5vcmcvMjAxMS8yMzIucGRmCgogICAgIFtCaWxseSBCb2IgQnJ1bWxleSBhbmQgTmljb2xhIFR1dmVyaV0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBjIGFuZCAxLjAuMGQgWzggRmViIDIwMTFdCgogICopIEZpeCBwYXJzaW5nIG9mIE9DU1Agc3RhcGxpbmcgQ2xpZW50SGVsbG8gZXh0ZW5zaW9uLiBDVkUtMjAxMS0wMDE0CiAgICAgW05lZWwgTWVodGEsIEFkYW0gTGFuZ2xleSwgQm9kbyBNb2VsbGVyIChHb29nbGUpXQoKICAqKSBGaXggYnVnIGluIHN0cmluZyBwcmludGluZyBjb2RlOiBpZiAqYW55KiBlc2NhcGluZyBpcyBlbmFibGVkIHdlIG11c3QKICAgICBlc2NhcGUgdGhlIGVzY2FwZSBjaGFyYWN0ZXIgKGJhY2tzbGFzaCkgb3IgdGhlIHJlc3VsdGluZyBzdHJpbmcgaXMKICAgICBhbWJpZ3VvdXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBiIGFuZCAxLjAuMGMgIFsyIERlYyAyMDEwXQoKICAqKSBEaXNhYmxlIGNvZGUgd29ya2Fyb3VuZCBmb3IgYW5jaWVudCBhbmQgb2Jzb2xldGUgTmV0c2NhcGUgYnJvd3NlcnMKICAgICBhbmQgc2VydmVyczogYW4gYXR0YWNrZXIgY2FuIHVzZSBpdCBpbiBhIGNpcGhlcnN1aXRlIGRvd25ncmFkZSBhdHRhY2suCiAgICAgVGhhbmtzIHRvIE1hcnRpbiBSZXggZm9yIGRpc2NvdmVyaW5nIHRoaXMgYnVnLiBDVkUtMjAxMC00MTgwCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZWQgSi1QQUtFIGltcGxlbWVudGF0aW9uIGVycm9yLCBvcmlnaW5hbGx5IGRpc2NvdmVyZWQgYnkKICAgICBTZWJhc3RpZW4gTWFydGluaSwgZnVydGhlciBpbmZvIGFuZCBjb25maXJtYXRpb24gZnJvbSBTdGVmYW4KICAgICBBcmVudHogYW5kIEZlbmcgSGFvLiBOb3RlIHRoYXQgdGhpcyBmaXggaXMgYSBzZWN1cml0eSBmaXguIENWRS0yMDEwLTQyNTIKICAgICBbQmVuIExhdXJpZV0KCiBDaGFuZ2VzIGJldHdlZW4gMS4wLjBhIGFuZCAxLjAuMGIgIFsxNiBOb3YgMjAxMF0KCiAgKikgRml4IGV4dGVuc2lvbiBjb2RlIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyB3aGljaCBjYW4gcmVzdWx0IGluIGEgYnVmZmVyCiAgICAgb3ZlcnJ1biB2dWxuZXJhYmlsaXR5OiByZXN1bWVkIHNlc3Npb25zIG11c3Qgbm90IGJlIG1vZGlmaWVkIGFzIHRoZXkgY2FuCiAgICAgYmUgc2hhcmVkIGJ5IG11bHRpcGxlIHRocmVhZHMuIENWRS0yMDEwLTM4NjQKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggV0lOMzIgYnVpbGQgc3lzdGVtIHRvIGNvcnJlY3RseSBsaW5rIGFuIEVOR0lORSBkaXJlY3RvcnkgaW50bwogICAgIGEgRExMLiAKICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAxLjAuMCBhbmQgMS4wLjBhICBbMDEgSnVuIDIwMTBdCgogICopIENoZWNrIHJldHVybiB2YWx1ZSBvZiBpbnRfcnNhX3ZlcmlmeSBpbiBwa2V5X3JzYV92ZXJpZnlyZWNvdmVyIAogICAgIChDVkUtMjAxMC0xNjMzKQogICAgIFtTdGV2ZSBIZW5zb24sIFBldGVyLU1pY2hhZWwgSGFnZXIgPGhhZ2VyQGRvcnRtdW5kLm5ldD5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44biBhbmQgMS4wLjAgIFsyOSBNYXIgMjAxMF0KCiAgKikgQWRkICJtaXNzaW5nIiBmdW5jdGlvbiBFVlBfQ0lQSEVSX0NUWF9jb3B5KCkuIFRoaXMgY29waWVzIGEgY2lwaGVyCiAgICAgY29udGV4dC4gVGhlIG9wZXJhdGlvbiBjYW4gYmUgY3VzdG9taXNlZCB2aWEgdGhlIGN0cmwgbWVjaGFuaXNtIGluCiAgICAgY2FzZSBFTkdJTkVzIHdhbnQgdG8gaW5jbHVkZSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVG9sZXJhdGUgeWV0IGFub3RoZXIgYnJva2VuIFBLQ1MjOCBrZXkgZm9ybWF0OiBwcml2YXRlIGtleSB2YWx1ZSBuZWdhdGl2ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IC1zdWJqZWN0X2hhc2hfb2xkIGFuZCAtaXNzdWVyX2hhc2hfb2xkIG9wdGlvbnMgdG8geDUwOSB1dGlsaXR5IHRvCiAgICAgb3V0cHV0IGhhc2hlcyBjb21wYXRpYmxlIHdpdGggb2xkZXIgdmVyc2lvbnMgb2YgT3BlblNTTC4KICAgICBbV2lsbHkgV2Vpc3ogPHdlaXN6QHZjcGMudW5pdmllLmFjLmF0Pl0KCiAgKikgRml4IGNvbXByZXNzaW9uIGFsZ29yaXRobSBoYW5kbGluZzogaWYgcmVzdW1pbmcgYSBzZXNzaW9uIHVzZSB0aGUKICAgICBjb21wcmVzc2lvbiBhbGdvcml0aG0gb2YgdGhlIHJlc3VtZWQgc2Vzc2lvbiBpbnN0ZWFkIG9mIGRldGVybWluaW5nCiAgICAgaXQgZnJvbSBjbGllbnQgaGVsbG8gYWdhaW4uIERvbid0IGFsbG93IHNlcnZlciB0byBjaGFuZ2UgYWxnb3JpdGhtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBsb2FkX2NybHMoKSBmdW5jdGlvbiB0byBhcHBzIHRpZHlpbmcgbG9hZF9jZXJ0cygpIHRvby4gQWRkIG9wdGlvbgogICAgIHRvIHZlcmlmeSB1dGlsaXR5IHRvIGFsbG93IGFkZGl0aW9uYWwgQ1JMcyB0byBiZSBpbmNsdWRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgT0NTUCByZXF1ZXN0IGNvZGUgdG8gcGVybWl0IGFkZGluZyBjdXN0b20gaGVhZGVycyB0byB0aGUgcmVxdWVzdDoKICAgICBzb21lIHJlc3BvbmRlcnMgbmVlZCB0aGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBmdW5jdGlvbiBFVlBfUEtFWV9zaWduKCkgcmV0dXJucyA8PTAgb24gZXJyb3I6IGNoZWNrIHJldHVybiBjb2RlCiAgICAgY29ycmVjdGx5LgogICAgIFtKdWxpYSBMYXdhbGwgPGp1bGlhQGRpa3UuZGs+XQoKICAqKSBVcGRhdGUgdmVyaWZ5IGNhbGxiYWNrIGNvZGUgaW4gYXBwcy9zX2NiLmMgYW5kIGFwcHMvdmVyaWZ5LmMsIGl0CiAgICAgbmVlZGxlc3NseSBkZXJlZmVyZW5jZWQgc3RydWN0dXJlcywgdXNlZCBvYnNvbGV0ZSBmdW5jdGlvbnMgYW5kCiAgICAgZGlkbid0IGhhbmRsZSBhbGwgdXBkYXRlZCB2ZXJpZnkgY29kZXMgY29ycmVjdGx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERpc2FibGUgTUQyIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gQklPX3BvcCgpIGFuZCBCSU9fcHVzaCgpIHVzZSB0aGUgY3RybCBhcmd1bWVudCAod2hpY2ggd2FzIE5VTEwpIHRvCiAgICAgaW5kaWNhdGUgdGhlIGluaXRpYWwgQklPIGJlaW5nIHB1c2hlZCBvciBwb3BwZWQuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUKICAgICB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgQklPIGlzIHRoZSBvbmUgZXhwbGljaXRseSBjYWxsZWQgb3IgYXMgYSByZXN1bHQKICAgICBvZiB0aGUgY3RybCBiZWluZyBwYXNzZWQgZG93biB0aGUgY2hhaW4uIEZpeCBCSU9fcG9wKCkgYW5kIFNTTCBCSU9zIHNvCiAgICAgaXQgaGFuZGxlcyByZWZlcmVuY2UgY291bnRzIGNvcnJlY3RseSBhbmQgZG9lc24ndCB6ZXJvIG91dCB0aGUgSS9PIGJpbwogICAgIHdoZW4gaXQgaXMgbm90IGJlaW5nIGV4cGxpY2l0bHkgcG9wcGVkLiBXQVJOSU5HOiBhcHBsaWNhdGlvbnMgd2hpY2gKICAgICBpbmNsdWRlZCB3b3JrYXJvdW5kcyBmb3IgdGhlIG9sZCBidWdneSBiZWhhdmlvdXIgd2lsbCBuZWVkIHRvIGJlIG1vZGlmaWVkCiAgICAgb3IgdGhleSBjb3VsZCBmcmVlIHVwIGFscmVhZHkgZnJlZWQgQklPcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbmQgdGhlIHVuaTJhc2MvYXNjMnVuaSA9PiBPUEVOU1NMX3VuaTJhc2MvT1BFTlNTTF9hc2MydW5pCiAgICAgcmVuYW1pbmcgdG8gYWxsIHBsYXRmb3JtcyAod2l0aGluIHRoZSAwLjkuOCBicmFuY2gsIHRoaXMgd2FzCiAgICAgZG9uZSBjb25kaXRpb25hbGx5IG9uIE5ldHdhcmUgcGxhdGZvcm1zIHRvIGF2b2lkIGEgbmFtZSBjbGFzaCkuCiAgICAgW0d1ZW50ZXIgPGxpc3RzQGdrbncubmV0Pl0KCiAgKikgQWRkIEVDREhFIGFuZCBQU0sgc3VwcG9ydCB0byBEVExTLgogICAgIFtNaWNoYWVsIFR1ZXhlbiA8dHVleGVuQGZoLW11ZW5zdGVyLmRlPl0KCiAgKikgQWRkIENIRUNLRURfU1RBQ0tfT0YgbWFjcm8gdG8gc2FmZXN0YWNrLmgsIG90aGVyd2lzZSBzYWZlc3RhY2sgY2FuJ3QKICAgICBiZSB1c2VkIG9uIEMrKy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgIm1pc3NpbmciIGZ1bmN0aW9uIEVWUF9NRF9mbGFncygpICh3aXRob3V0IHRoaXMgdGhlIG9ubHkgd2F5IHRvCiAgICAgcmV0cmlldmUgYSBkaWdlc3QgZmxhZ3MgaXMgYnkgYWNjZXNzaW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkuIFVwZGF0ZQogICAgIEVWUF9NRF9kb19hbGwqKCkgYW5kIEVWUF9DSVBIRVJfZG9fYWxsKigpIHRvIGluY2x1ZGUgdGhlIG5hbWUgYSBkaWdlc3QKICAgICBvciBjaXBoZXIgaXMgcmVnaXN0ZXJlZCBhcyBpbiB0aGUgImZyb20iIGFyZ3VtZW50LiBQcmludCBvdXQgYWxsCiAgICAgcmVnaXN0ZXJlZCBkaWdlc3RzIGluIHRoZSBkZ3N0IHVzYWdlIG1lc3NhZ2UgaW5zdGVhZCBvZiBtYW51YWxseSAKICAgICBhdHRlbXB0aW5nIHRvIHdvcmsgdGhlbSBvdXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgbm8gU1NMdjIgY2lwaGVycyBhcmUgdXNlZCBkb24ndCB1c2UgYW4gU1NMdjIgY29tcGF0aWJsZSBjbGllbnQgaGVsbG86CiAgICAgdGhpcyBhbGxvd3MgdGhlIHVzZSBvZiBjb21wcmVzc2lvbiBhbmQgZXh0ZW5zaW9ucy4gQ2hhbmdlIGRlZmF1bHQgY2lwaGVyCiAgICAgc3RyaW5nIHRvIHJlbW92ZSBTU0x2MiBjaXBoZXJzdWl0ZXMuIFRoaXMgZWZmZWN0aXZlbHkgYXZvaWRzIGFuY2llbnQgU1NMdjIKICAgICBieSBkZWZhdWx0IHVubGVzcyBhbiBhcHBsaWNhdGlvbiBjaXBoZXIgc3RyaW5nIHJlcXVlc3RzIGl0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsdGVyIG1hdGNoIGNyaXRlcmlhIGluIFBLQ1MxMl9wYXJzZSgpLiBJdCB1c2VkIHRvIHRyeSB0byB1c2UgbG9jYWwKICAgICBrZXkgaWRzIHRvIGZpbmQgbWF0Y2hpbmcgY2VydGlmaWNhdGVzIGFuZCBrZXlzIGJ1dCBzb21lIFBLQ1MjMTIgZmlsZXMKICAgICBkb24ndCBmb2xsb3cgdGhlIChzb21ld2hhdCB1bndyaXR0ZW4pIHJ1bGVzIGFuZCB0aGlzIHN0cmF0ZWd5IGZhaWxzLgogICAgIE5vdyBqdXN0IGdhdGhlciBhbGwgY2VydGlmaWNhdGVzIHRvZ2V0aGVyIGFuZCB0aGUgZmlyc3QgcHJpdmF0ZSBrZXkKICAgICB0aGVuIGxvb2sgZm9yIHRoZSBmaXJzdCBjZXJ0aWZpY2F0ZSB0aGF0IG1hdGNoZXMgdGhlIGtleS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IHVzZSBvZiByZWdpc3RlcmVkIGRpZ2VzdCBhbmQgY2lwaGVyIG5hbWVzIGZvciBkZ3N0IGFuZCBjaXBoZXIKICAgICBjb21tYW5kcyBpbnN0ZWFkIG9mIGhhdmluZyB0byBhZGQgZWFjaCBvbmUgYXMgYSBzcGVjaWFsIGNhc2UuIFNvIG5vdwogICAgIHlvdSBjYW4gZG86CgogICAgICAgIG9wZW5zc2wgc2hhMjU2IGZvbwoKICAgICBhcyB3ZWxsIGFzOgoKICAgICAgICBvcGVuc3NsIGRnc3QgLXNoYTI1NiBmb28KCiAgICAgYW5kIHRoaXMgd29ya3MgZm9yIEVOR0lORSBiYXNlZCBhbGdvcml0aG1zIHRvby4KCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIEdvc3QgRU5HSU5FIHRvIHN1cHBvcnQgcGFyYW1ldGVyIGZpbGVzLgogICAgIFtWaWN0b3IgQi4gV2FnbmVyIDx2aXR1c0BjcnlwdG9jb20ucnU+XQoKICAqKSBTdXBwb3J0IEdlbmVyYWxpemVkVGltZSBpbiBjYSB1dGlsaXR5LiAKICAgICBbT2xpdmVyIE1hcnRpbiA8b2xpdmVyQHZvbGF0aWxldm9pZC5uZXQ+LCBTdGV2ZSBIZW5zb25dCgogICopIEVuaGFuY2UgdGhlIGhhc2ggZm9ybWF0IHVzZWQgZm9yIGNlcnRpZmljYXRlIGRpcmVjdG9yeSBsaW5rcy4gVGhlIG5ldwogICAgIGZvcm0gdXNlcyB0aGUgY2Fub25pY2FsIGVuY29kaW5nIChtZWFuaW5nIGVxdWl2YWxlbnQgbmFtZXMgd2lsbCB3b3JrCiAgICAgZXZlbiBpZiB0aGV5IGFyZW4ndCBpZGVudGljYWwpIGFuZCB1c2VzIFNIQTEgaW5zdGVhZCBvZiBNRDUuIFRoaXMgZm9ybQogICAgIGlzIGluY29tcGF0aWJsZSB3aXRoIHRoZSBvbGRlciBmb3JtYXQgYW5kIGFzIGEgcmVzdWx0IGNfcmVoYXNoIHNob3VsZAogICAgIGJlIHVzZWQgdG8gcmVidWlsZCBzeW1ib2xpYyBsaW5rcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFBLQ1MjOCB0aGUgZGVmYXVsdCB3cml0ZSBmb3JtYXQgZm9yIHByaXZhdGUga2V5cywgcmVwbGFjaW5nIHRoZQogICAgIHRyYWRpdGlvbmFsIGZvcm1hdC4gVGhpcyBmb3JtIGlzIHN0YW5kYXJkaXNlZCwgbW9yZSBzZWN1cmUgYW5kIGRvZXNuJ3QKICAgICBpbmNsdWRlIGFuIGltcGxpY2l0IE1ENSBkZXBlbmRlbmN5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhICRnY2NfZGV2dGVhbV93YXJuIG9wdGlvbiB0byBDb25maWd1cmUuIFRoZSBpZGVhIGlzIHRoYXQgYW55IGNvZGUKICAgICBjb21taXR0ZWQgdG8gT3BlblNTTCBzaG91bGQgcGFzcyB0aGlzIGxvdCBhcyBhIG1pbmltdW0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNlc3Npb24gdGlja2V0IG92ZXJyaWRlIGZ1bmN0aW9uYWxpdHkgZm9yIHVzZSBieSBFQVAtRkFTVC4KICAgICBbSm91bmkgTWFsaW5lbiA8akB3MS5maT5dCgogICopIE1vZGlmeSBITUFDIGZ1bmN0aW9ucyB0byByZXR1cm4gYSB2YWx1ZS4gU2luY2UgdGhlc2UgY2FuIGJlIGltcGxlbWVudGVkCiAgICAgaW4gYW4gRU5HSU5FIGVycm9ycyBjYW4gb2NjdXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVHlwZS1jaGVja2VkIE9CSl9ic2VhcmNoX2V4LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBUeXBlLWNoZWNrZWQgT0JKX2JzZWFyY2guIEFsc28gc29tZSBjb25zdGlmaWNhdGlvbiBuZWNlc3NpdGF0ZWQKICAgICBieSB0eXBlLWNoZWNraW5nLiAgU3RpbGwgdG8gY29tZTogVFhUX0RCLCBic2VhcmNoKD8pLAogICAgIE9CSl9ic2VhcmNoX2V4LCBxc29ydCwgQ1JZUFRPX0VYX0RBVEEsIEFTTjFfVkFMVUUsIEFTTjFfU1RSSU5HLAogICAgIENPTkZfVkFMVUUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBmdW5jdGlvbiBPUEVOU1NMX2dtdGltZV9hZGooKSB0byBhZGQgYSBzcGVjaWZpYyBudW1iZXIgb2YgZGF5cyBhbmQKICAgICBzZWNvbmRzIHRvIGEgdG0gc3RydWN0dXJlIGRpcmVjdGx5LCBpbnN0ZWFkIG9mIGdvaW5nIHRocm91Z2ggT1MKICAgICBzcGVjaWZpYyBkYXRlIHJvdXRpbmVzLiBUaGlzIGF2b2lkcyBhbnkgaXNzdWVzIHdpdGggT1Mgcm91dGluZXMgc3VjaAogICAgIGFzIHRoZSB5ZWFyIDIwMzggYnVnLiBOZXcgKl9hZGooKSBmdW5jdGlvbnMgZm9yIEFTTjEgdGltZSBzdHJ1Y3R1cmVzCiAgICAgYW5kIFg1MDlfdGltZV9hZGpfZXgoKSB0byBjb3ZlciB0aGUgZXh0ZW5kZWQgcmFuZ2UuIFRoZSBleGlzdGluZwogICAgIFg1MDlfdGltZV9hZGooKSBpcyBzdGlsbCB1c2FibGUgYW5kIHdpbGwgbm8gbG9uZ2VyIGhhdmUgYW55IGRhdGUgaXNzdWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERlbHRhIENSTCBzdXBwb3J0LiBOZXcgdXNlIGRlbHRhcyBvcHRpb24gd2hpY2ggd2lsbCBhdHRlbXB0IHRvIGxvY2F0ZQogICAgIGFuZCBzZWFyY2ggYW55IGFwcHJvcHJpYXRlIGRlbHRhIENSTHMgYXZhaWxhYmxlLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgQ1JMcyBwYXJ0aXRpb25lZCBieSByZWFzb24gY29kZS4gUmVvcmdhbmlzZSBDUkwgcHJvY2Vzc2luZwogICAgIGNvZGUgYW5kIGFkZCBhZGRpdGlvbmFsIHNjb3JlIGVsZW1lbnRzLiBWYWxpZGF0ZSBhbHRlcm5hdGUgQ1JMIHBhdGhzCiAgICAgYXMgcGFydCBvZiB0aGUgQ1JMIGNoZWNraW5nIGFuZCBpbmRpY2F0ZSBhIG5ldyBlcnJvciAiQ1JMIHBhdGggdmFsaWRhdGlvbgogICAgIGVycm9yIiBpbiB0aGlzIGNhc2UuIEFwcGxpY2F0aW9ucyB3YW50aW5nIGFkZGl0aW9uYWwgZGV0YWlscyBjYW4gdXNlCiAgICAgdGhlIHZlcmlmeSBjYWxsYmFjayBhbmQgY2hlY2sgdGhlIG5ldyAicGFyZW50IiBmaWVsZC4gSWYgdGhpcyBpcyBub3QKICAgICBOVUxMIENSTCBwYXRoIHZhbGlkYXRpb24gaXMgdGFraW5nIHBsYWNlLiBFeGlzdGluZyBhcHBsaWNhdGlvbnMgd29udAogICAgIHNlZSB0aGlzIGJlY2F1c2UgaXQgcmVxdWlyZXMgZXh0ZW5kZWQgQ1JMIHN1cHBvcnQgd2hpY2ggaXMgb2ZmIGJ5CiAgICAgZGVmYXVsdC4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIGZyZXNoZXN0IENSTCBleHRlbnNpb24uCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGluZGlyZWN0IENSTCBzdXBwb3J0LiBDdXJyZW50bHkgb25seSBzdXBwb3J0ZWQgaW4gdGhlIENSTHMKICAgICBwYXNzZWQgZGlyZWN0bHkgYW5kIG5vdCB2aWEgbG9va3VwLiBQcm9jZXNzIGNlcnRpZmljYXRlIGlzc3VlcgogICAgIENSTCBlbnRyeSBleHRlbnNpb24gYW5kIGxvb2t1cCBDUkwgZW50cmllcyBieSBib3RoZXIgaXNzdWVyIG5hbWUKICAgICBhbmQgc2VyaWFsIG51bWJlci4gQ2hlY2sgYW5kIHByb2Nlc3MgQ1JMIGlzc3VlciBlbnRyeSBpbiBJRFAgZXh0ZW5zaW9uLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGRpc3RpbmN0IGNlcnRpZmljYXRlIGFuZCBDUkwgcGF0aHMuIFRoZSBDUkwgaXNzdWVyCiAgICAgY2VydGlmaWNhdGUgaXMgdmFsaWRhdGVkIHNlcGFyYXRlbHkgaW4gdGhpcyBjYXNlLiBPbmx5IGVuYWJsZWQgaWYKICAgICBhbiBleHRlbmRlZCBDUkwgc3VwcG9ydCBmbGFnIGlzIHNldDogdGhpcyBmbGFnIHdpbGwgZW5hYmxlIGFkZGl0aW9uYWwKICAgICBDUkwgZnVuY3Rpb25hbGl0eSBpbiBmdXR1cmUuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgcG9saWN5IG1hcHBpbmdzIGV4dGVuc2lvbi4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIHRvIHBhdGhsZW5ndGggY29uc3RyYWludCwgc2VsZiBpc3N1ZWQgY2VydGlmaWNhdGUgaGFuZGxpbmcsCiAgICAgcG9saWN5IHByb2Nlc3NpbmcgdG8gYWxpZ24gd2l0aCBSRkMzMjgwIGFuZCBQS0lUUyB0ZXN0cy4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIG5hbWUgY29uc3RyYWludHMgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLiBETiwgZW1haWwsIEROUwogICAgIGFuZCBVUkkgdHlwZXMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuCgogICAgIFRoaXMgd29yayB3YXMgc3BvbnNvcmVkIGJ5IEdvb2dsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUbyBjYXRlciBmb3Igc3lzdGVtcyB0aGF0IHByb3ZpZGUgYSBwb2ludGVyLWJhc2VkIHRocmVhZCBJRCByYXRoZXIKICAgICB0aGFuIG51bWVyaWMsIGRlcHJlY2F0ZSB0aGUgY3VycmVudCBudW1lcmljIHRocmVhZCBJRCBtZWNoYW5pc20gYW5kCiAgICAgcmVwbGFjZSBpdCB3aXRoIGEgc3RydWN0dXJlIGFuZCBhc3NvY2lhdGVkIGNhbGxiYWNrIHR5cGUuIFRoaXMKICAgICBtZWNoYW5pc20gYWxsb3dzIGEgbnVtZXJpYyAiaGFzaCIgdG8gYmUgZXh0cmFjdGVkIGZyb20gYSB0aHJlYWQgSUQgaW4KICAgICBlaXRoZXIgY2FzZSwgYW5kIG9uIHBsYXRmb3JtcyB3aGVyZSBwb2ludGVycyBhcmUgbGFyZ2VyIHRoYW4gJ2xvbmcnLAogICAgIG1peGluZyBpcyBkb25lIHRvIGhlbHAgZW5zdXJlIHRoZSBudW1lcmljICdoYXNoJyBpcyB1c2FibGUgZXZlbiBpZiBpdAogICAgIGNhbid0IGJlIGd1YXJhbnRlZWQgdW5pcXVlLiBUaGUgZGVmYXVsdCBtZWNoYW5pc20gaXMgdG8gdXNlICImZXJybm8iCiAgICAgYXMgYSBwb2ludGVyLWJhc2VkIHRocmVhZCBJRCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRocmVhZHMuCgogICAgIEFwcGxpY2F0aW9ucyB0aGF0IHdhbnQgdG8gcHJvdmlkZSB0aGVpciBvd24gdGhyZWFkIElEcyBzaG91bGQgbm93IHVzZQogICAgIENSWVBUT19USFJFQURJRF9zZXRfY2FsbGJhY2soKSB0byByZWdpc3RlciBhIGNhbGxiYWNrIHRoYXQgd2lsbCBjYWxsCiAgICAgZWl0aGVyIENSWVBUT19USFJFQURJRF9zZXRfbnVtZXJpYygpIG9yIENSWVBUT19USFJFQURJRF9zZXRfcG9pbnRlcigpLgoKICAgICBOb3RlIHRoYXQgRVJSX3JlbW92ZV9zdGF0ZSgpIGlzIG5vdyBkZXByZWNhdGVkLCBiZWNhdXNlIGl0IGlzIHRpZWQKICAgICB0byB0aGUgYXNzdW1wdGlvbiB0aGF0IHRocmVhZCBJRHMgYXJlIG51bWVyaWMuICBFUlJfcmVtb3ZlX3N0YXRlKDApCiAgICAgdG8gZnJlZSB0aGUgY3VycmVudCB0aHJlYWQncyBlcnJvciBzdGF0ZSBzaG91bGQgYmUgcmVwbGFjZWQgYnkKICAgICBFUlJfcmVtb3ZlX3RocmVhZF9zdGF0ZShOVUxMKS4KCiAgICAgKFRoaXMgbmV3IGFwcHJvYWNoIHJlcGxhY2VzIHRoZSBmdW5jdGlvbnMgQ1JZUFRPX3NldF9pZHB0cl9jYWxsYmFjaygpLAogICAgIENSWVBUT19nZXRfaWRwdHJfY2FsbGJhY2soKSwgYW5kIENSWVBUT190aHJlYWRfaWRwdHIoKSB0aGF0IGV4aXN0ZWQgaW4KICAgICBPcGVuU1NMIDAuOS45LWRldiBiZXR3ZWVuIEp1bmUgMjAwNiBhbmQgQXVndXN0IDIwMDguIEFsc28sIGlmIGFuCiAgICAgYXBwbGljYXRpb24gd2FzIHByZXZpb3VzbHkgcHJvdmlkaW5nIGEgbnVtZXJpYyB0aHJlYWQgY2FsbGJhY2sgdGhhdAogICAgIHdhcyBpbmFwcHJvcHJpYXRlIGZvciBkaXN0aW5ndWlzaGluZyB0aHJlYWRzLCB0aGVuIHVuaXF1ZW5lc3MgbWlnaHQKICAgICBoYXZlIGJlZW4gb2J0YWluZWQgd2l0aCAmZXJybm8gdGhhdCBoYXBwZW5lZCBpbW1lZGlhdGVseSBpbiB0aGUKICAgICBpbnRlcm1lZGlhdGUgZGV2ZWxvcG1lbnQgdmVyc2lvbnMgb2YgT3BlblNTTDsgdGhpcyBpcyBubyBsb25nZXIgdGhlCiAgICAgY2FzZSwgdGhlIG51bWVyaWMgdGhyZWFkIGNhbGxiYWNrIHdpbGwgbm93IG92ZXJyaWRlIHRoZSBhdXRvbWF0aWMgdXNlCiAgICAgb2YgJmVycm5vLikKICAgICBbR2VvZmYgVGhvcnBlLCB3aXRoIGhlbHAgZnJvbSBCb2RvIE1vZWxsZXJdCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgZGlmZmVyZW50IENSTCBpc3N1aW5nIGNlcnRpZmljYXRlcy4gVGhpcyBjb3ZlcnMgYQogICAgIHNpbXBsZSBjYXNlIHdoZXJlIHRoZSBzZWxmIGlzc3VlZCBjZXJ0aWZpY2F0ZXMgaW4gdGhlIGNoYWluIGV4aXN0IGFuZAogICAgIHRoZSByZWFsIENSTCBpc3N1ZXIgaXMgaGlnaGVyIGluIHRoZSBleGlzdGluZyBjaGFpbi4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgR29vZ2xlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZWQgZWZmZWN0aXZlbHkgZGVmdW5jdCBjcnlwdG8vc3RvcmUgZnJvbSB0aGUgYnVpbGQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFJldmFtcCBvZiBTVEFDSyB0byBwcm92aWRlIHN0cm9uZ2VyIHR5cGUtY2hlY2tpbmcuIFN0aWxsIHRvIGNvbWU6CiAgICAgVFhUX0RCLCBic2VhcmNoKD8pLCBPQkpfYnNlYXJjaCwgcXNvcnQsIENSWVBUT19FWF9EQVRBLCBBU04xX1ZBTFVFLAogICAgIEFTTjFfU1RSSU5HLCBDT05GX1ZBTFVFLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYSBuZXcgU1NMX01PREVfUkVMRUFTRV9CVUZGRVJTIG1vZGUgZmxhZyB0byByZWxlYXNlIHVudXNlZCBidWZmZXIKICAgICBSQU0gb24gU1NMIGNvbm5lY3Rpb25zLiAgVGhpcyBvcHRpb24gY2FuIHNhdmUgYWJvdXQgMzRrIHBlciBpZGxlIFNTTC4KICAgICBbTmljayBNYXRoZXdzb25dCgogICopIFJldmFtcCBvZiBMSEFTSCB0byBwcm92aWRlIHN0cm9uZ2VyIHR5cGUtY2hlY2tpbmcuIFN0aWxsIHRvIGNvbWU6CiAgICAgU1RBQ0ssIFRYVF9EQiwgYnNlYXJjaCwgcXNvcnQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgQ3J5cHRvZ3JhcGhpYyBNZXNzYWdlIFN5bnRheCAoYWthIENNUykgYmFzZWQKICAgICBvbiBSRkMzODUwLCBSRkMzODUxIGFuZCBSRkMzODUyLiBOZXcgY21zIGRpcmVjdG9yeSBhbmQgY21zIHV0aWxpdHksCiAgICAgc3VwcG9ydCBmb3IgZGF0YSwgc2lnbmVkRGF0YSwgY29tcHJlc3NlZERhdGEsIGRpZ2VzdGVkRGF0YSBhbmQKICAgICBlbmNyeXB0ZWREYXRhLCBlbnZlbG9wZWREYXRhIHR5cGVzIGluY2x1ZGVkLiBTY3JpcHRzIHRvIGNoZWNrIGFnYWluc3QKICAgICBSRkM0MTM0IGV4YW1wbGVzIGRyYWZ0IGFuZCBpbnRlcm9wIGFuZCBjb25zaXN0ZW5jeSBjaGVja3Mgb2YgbWFueQogICAgIGNvbnRlbnQgdHlwZXMgYW5kIHZhcmlhbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBvcHRpb25zIHRvIGVuYyB1dGlsaXR5IHRvIHN1cHBvcnQgdXNlIG9mIHpsaWIgY29tcHJlc3Npb24gQklPLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCBtazFtZiB0byBzdXBwb3J0IGltcG9ydGluZyBvZiBvcHRpb25zIGFuZCBhc3NlbWJseSBsYW5ndWFnZQogICAgIGZpbGVzIGZyb20gQ29uZmlndXJlIHNjcmlwdCwgY3VycmVudGx5IG9ubHkgaW5jbHVkZWQgaW4gVkMtV0lOMzIuCiAgICAgVGhlIGFzc2VtYmx5IGxhbmd1YWdlIHJ1bGVzIGNhbiBub3cgb3B0aW9uYWxseSBnZW5lcmF0ZSB0aGUgc291cmNlCiAgICAgZmlsZXMgZnJvbSB0aGUgYXNzb2NpYXRlZCBwZXJsIHNjcmlwdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IHJlbWFpbmluZyBmdW5jdGlvbmFsaXR5IG5lZWRlZCB0byBzdXBwb3J0IEdPU1QgY2lwaGVyc3VpdGVzLgogICAgIEludGVyb3AgdGVzdGluZyBoYXMgYmVlbiBwZXJmb3JtZWQgdXNpbmcgQ3J5cHRvUHJvIGltcGxlbWVudGF0aW9ucy4KICAgICBbVmljdG9yIEIuIFdhZ25lciA8dml0dXNAY3J5cHRvY29tLnJ1Pl0KCiAgKikgczM5MHggYXNzZW1ibGVyIHBhY2suCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFSTXY0IGFzc2VtYmxlciBwYWNrLiBBUk12NCByZWZlcnMgdG8gdjQgYW5kIGxhdGVyIElTQSwgbm90IENQVQogICAgICJmYW1pbHkuIgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBJbXBsZW1lbnQgT3BhcXVlIFBSRiBJbnB1dCBUTFMgZXh0ZW5zaW9uIGFzIHNwZWNpZmllZCBpbgogICAgIGRyYWZ0LXJlc2NvcmxhLXRscy1vcGFxdWUtcHJmLWlucHV0LTAwLnR4dC4gIFNpbmNlIHRoaXMgaXMgbm90IGFuCiAgICAgb2ZmaWNpYWwgc3BlY2lmaWNhdGlvbiB5ZXQgYW5kIG5vIGV4dGVuc2lvbiB0eXBlIGFzc2lnbm1lbnQgYnkKICAgICBJQU5BIGV4aXN0cywgdGhpcyBleHRlbnNpb24gKGZvciBub3cpIHdpbGwgaGF2ZSB0byBiZSBleHBsaWNpdGx5CiAgICAgZW5hYmxlZCB3aGVuIGJ1aWxkaW5nIE9wZW5TU0wgYnkgcHJvdmlkaW5nIHRoZSBleHRlbnNpb24gbnVtYmVyCiAgICAgdG8gdXNlLiAgRm9yIGV4YW1wbGUsIHNwZWNpZnkgYW4gb3B0aW9uCgogICAgICAgICAtRFRMU0VYVF9UWVBFX29wYXF1ZV9wcmZfaW5wdXQ9MHg5NTI3CgogICAgIHRvIHRoZSAiY29uZmlnIiBvciAiQ29uZmlndXJlIiBzY3JpcHQgdG8gZW5hYmxlIHRoZSBleHRlbnNpb24sCiAgICAgYXNzdW1pbmcgZXh0ZW5zaW9uIG51bWJlciAweDk1MjcgKHdoaWNoIGlzIGEgY29tcGxldGVseSBhcmJpdHJhcnkKICAgICBhbmQgdW5vZmZpY2lhbCBhc3NpZ25tZW50IGJhc2VkIG9uIHRoZSBNRDUgaGFzaCBvZiB0aGUgSW50ZXJuZXQKICAgICBEcmFmdCkuICBOb3RlIHRoYXQgYnkgZG9pbmcgc28sIHlvdSBwb3RlbnRpYWxseSBsb3NlCiAgICAgaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIFRMUyBpbXBsZW1lbnRhdGlvbnMgc2luY2UgdGhlc2UgbWlnaHQKICAgICBiZSB1c2luZyB0aGUgc2FtZSBleHRlbnNpb24gbnVtYmVyIGZvciBvdGhlciBwdXJwb3Nlcy4KCiAgICAgU1NMX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dChzc2wsIHNyYywgbGVuKSBpcyB1c2VkIHRvIHNldCB0aGUKICAgICBvcGFxdWUgUFJGIGlucHV0IHZhbHVlIHRvIHVzZSBpbiB0aGUgaGFuZHNoYWtlLiAgVGhpcyB3aWxsIGNyZWF0ZQogICAgIGFuIGludGVyYWwgY29weSBvZiB0aGUgbGVuZ3RoLSdsZW4nIHN0cmluZyBhdCAnc3JjJywgYW5kIHdpbGwKICAgICByZXR1cm4gbm9uLXplcm8gZm9yIHN1Y2Nlc3MuCgogICAgIFRvIGdldCBtb3JlIGNvbnRyb2wgYW5kIGZsZXhpYmlsaXR5LCBwcm92aWRlIGEgY2FsbGJhY2sgZnVuY3Rpb24KICAgICBieSB1c2luZwoKICAgICAgICAgIFNTTF9DVFhfc2V0X3Rsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2NhbGxiYWNrKGN0eCwgY2IpCiAgICAgICAgICBTU0xfQ1RYX3NldF90bHNleHRfb3BhcXVlX3ByZl9pbnB1dF9jYWxsYmFja19hcmcoY3R4LCBhcmcpCgogICAgIHdoZXJlCgogICAgICAgICAgaW50ICgqY2IpKFNTTCAqLCB2b2lkICpwZWVyaW5wdXQsIHNpemVfdCBsZW4sIHZvaWQgKmFyZyk7CiAgICAgICAgICB2b2lkICphcmc7CgogICAgIENhbGxiYWNrIGZ1bmN0aW9uICdjYicgd2lsbCBiZSBjYWxsZWQgaW4gaGFuZHNoYWtlcywgYW5kIGlzCiAgICAgZXhwZWN0ZWQgdG8gdXNlIFNTTF9zZXRfdGxzZXh0X29wYXF1ZV9wcmZfaW5wdXQoKSBhcyBhcHByb3ByaWF0ZS4KICAgICBBcmd1bWVudCAnYXJnJyBpcyBmb3IgYXBwbGljYXRpb24gcHVycG9zZXMgKHRoZSB2YWx1ZSBhcyBnaXZlbiB0bwogICAgIFNTTF9DVFhfc2V0X3Rsc2V4dF9vcGFxdWVfcHJmX2lucHV0X2NhbGxiYWNrX2FyZygpIHdpbGwgZGlyZWN0bHkKICAgICBiZSBwcm92aWRlZCB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24pLiAgVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgaGFzIHRvIHJldHVybiBub24temVybyB0byByZXBvcnQgc3VjY2VzczogdXN1YWxseSAxIHRvIHVzZSBvcGFxdWUKICAgICBQUkYgaW5wdXQganVzdCBpZiBwb3NzaWJsZSwgb3IgMiB0byBlbmZvcmNlIHVzZSBvZiB0aGUgb3BhcXVlIFBSRgogICAgIGlucHV0LiAgSW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgbGlicmFyeSB3aWxsIGFib3J0IHRoZSBoYW5kc2hha2UKICAgICBpZiBvcGFxdWUgUFJGIGlucHV0IGlzIG5vdCBzdWNjZXNzZnVsbHkgbmVnb3RpYXRlZC4KCiAgICAgQXJndW1lbnRzICdwZWVyaW5wdXQnIGFuZCAnbGVuJyBnaXZlbiB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICB3aWxsIGFsd2F5cyBiZSBOVUxMIGFuZCAwIGluIHRoZSBjYXNlIG9mIGEgY2xpZW50LiAgQSBzZXJ2ZXIgd2lsbAogICAgIHNlZSB0aGUgY2xpZW50J3Mgb3BhcXVlIFBSRiBpbnB1dCB0aHJvdWdoIHRoZXNlIHZhcmlhYmxlcyBpZgogICAgIGF2YWlsYWJsZSAoTlVMTCBhbmQgMCBvdGhlcndpc2UpLiAgTm90ZSB0aGF0IGlmIHRoZSBzZXJ2ZXIKICAgICBwcm92aWRlcyBhbiBvcGFxdWUgUFJGIGlucHV0LCB0aGUgbGVuZ3RoIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlCiAgICAgbGVuZ3RoIG9mIHRoZSBjbGllbnQncyBvcGFxdWUgUFJGIGlucHV0LgoKICAgICBOb3RlIHRoYXQgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiBjcmVhdGluZwogICAgIGEgbmV3IHNlc3Npb24gKHNlc3Npb24gcmVzdW1wdGlvbiBjYW4gcmVzdW1lIHdoYXRldmVyIHdhcwogICAgIHByZXZpb3VzbHkgbmVnb3RpYXRlZCksIGFuZCB3aWxsIG5vdCBiZSBjYWxsZWQgaW4gU1NMIDIuMAogICAgIGhhbmRzaGFrZXM7IHRodXMsIFNTTF9DVFhfc2V0X29wdGlvbnMoY3R4LCBTU0xfT1BfTk9fU1NMdjIpIG9yCiAgICAgU1NMX3NldF9vcHRpb25zKHNzbCwgU1NMX09QX05PX1NTTHYyKSBpcyBlc3BlY2lhbGx5IHJlY29tbWVuZGVkCiAgICAgZm9yIGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8gZW5mb3JjZSBvcGFxdWUgUFJGIGlucHV0LgoKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVcGRhdGUgc3NsIGNvZGUgdG8gc3VwcG9ydCBkaWdlc3RzIG90aGVyIHRoYW4gU0hBMStNRDUgZm9yIGhhbmRzaGFrZQogICAgIE1BQy4gCgogICAgIFtWaWN0b3IgQi4gV2FnbmVyIDx2aXR1c0BjcnlwdG9jb20ucnU+XQoKICAqKSBBZGQgUkZDNDUwNyBzdXBwb3J0IHRvIE9wZW5TU0wuIFRoaXMgaW5jbHVkZXMgdGhlIGNvcnJlY3Rpb25zIGluCiAgICAgUkZDNDUwN2Jpcy4gVGhlIGVuY3J5cHRlZCB0aWNrZXQgZm9ybWF0IGlzIGFuIGVuY3J5cHRlZCBlbmNvZGVkCiAgICAgU1NMX1NFU1NJT04gc3RydWN0dXJlLCB0aGF0IHdheSBuZXcgc2Vzc2lvbiBmZWF0dXJlcyBhcmUgYXV0b21hdGljYWxseQogICAgIHN1cHBvcnRlZC4KCiAgICAgSWYgYSBjbGllbnQgYXBwbGljYXRpb24gY2FjaGVzIHNlc3Npb24gaW4gYW4gU1NMX1NFU1NJT04gc3RydWN0dXJlCiAgICAgc3VwcG9ydCBpcyB0cmFuc3BhcmVudCBiZWNhdXNlIHRpY2tldHMgYXJlIG5vdyBzdG9yZWQgaW4gdGhlIGVuY29kZWQKICAgICBTU0xfU0VTU0lPTi4KICAgICAKICAgICBUaGUgU1NMX0NUWCBzdHJ1Y3R1cmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMga2V5cyBmb3IgdGlja2V0CiAgICAgcHJvdGVjdGlvbiBpbiBzZXJ2ZXJzIHNvIGFnYWluIHN1cHBvcnQgc2hvdWxkIGJlIHBvc3NpYmxlCiAgICAgd2l0aCBubyBhcHBsaWNhdGlvbiBtb2RpZmljYXRpb24uCgogICAgIElmIGEgY2xpZW50IG9yIHNlcnZlciB3aXNoZXMgdG8gZGlzYWJsZSBSRkM0NTA3IHN1cHBvcnQgdGhlbiB0aGUgb3B0aW9uCiAgICAgU1NMX09QX05PX1RJQ0tFVCBjYW4gYmUgc2V0LgoKICAgICBBZGQgYSBUTFMgZXh0ZW5zaW9uIGRlYnVnZ2luZyBjYWxsYmFjayB0byBhbGxvdyB0aGUgY29udGVudHMgb2YgYW55IGNsaWVudAogICAgIG9yIHNlcnZlciBleHRlbnNpb25zIHRvIGJlIGV4YW1pbmVkLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRmluYWwgY2hhbmdlcyB0byBhdm9pZCB1c2Ugb2YgcG9pbnRlciBwb2ludGVyIGNhc3RzIGluIE9wZW5TU0wuCiAgICAgT3BlblNTTCBzaG91bGQgbm93IGNvbXBpbGUgY2xlYW5seSBvbiBnY2MgNC4yCiAgICAgW1BldGVyIEhhcnRsZXkgPHBkaEB1dHRlci5jaGFvcy5vcmcudWs+LCBTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBTU0wgbGlicmFyeSB0byB1c2UgbmV3IEVWUF9QS0VZIE1BQyBBUEkuIEluY2x1ZGUgZ2VuZXJpYyBNQUMKICAgICBzdXBwb3J0IGluY2x1ZGluZyBzdHJlYW1pbmcgTUFDIHN1cHBvcnQ6IHRoaXMgaXMgcmVxdWlyZWQgZm9yIEdPU1QKICAgICBjaXBoZXJzdWl0ZSBzdXBwb3J0LgogICAgIFtWaWN0b3IgQi4gV2FnbmVyIDx2aXR1c0BjcnlwdG9jb20ucnU+LCBTdGV2ZSBIZW5zb25dCgogICopIEFkZCBvcHRpb24gLXN0cmVhbSB0byB1c2UgUEtDUyM3IHN0cmVhbWluZyBpbiBzbWltZSB1dGlsaXR5LiBOZXcKICAgICBmdW5jdGlvbiBpMmRfUEtDUzdfYmlvX3N0cmVhbSgpIGFuZCBQRU1fd3JpdGVfUEtDUzdfYmlvX3N0cmVhbSgpCiAgICAgdG8gb3V0cHV0IGluIEJFUiBhbmQgUEVNIGZvcm1hdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3IgdXNlIG9mIEhNQUMgdmlhIEVWUF9QS0VZIGludGVyZmFjZS4gVGhpcwogICAgIGFsbG93cyBITUFDIHRvIGJlIGhhbmRsZWQgdmlhIHRoZSBFVlBfRGlnZXN0U2lnbiooKSBpbnRlcmZhY2UuIFRoZQogICAgIEVWUF9QS0VZICJrZXkiIGluIHRoaXMgY2FzZSBpcyB0aGUgSE1BQyBrZXksIHBvdGVudGlhbGx5IGFsbG93aW5nCiAgICAgRU5HSU5FIHN1cHBvcnQgZm9yIEhNQUMga2V5cyB3aGljaCBhcmUgdW5leHRyYWN0YWJsZS4gTmV3IC1tYWMgYW5kCiAgICAgLW1hY29wdCBvcHRpb25zIHRvIGRnc3QgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9uIC1zaWdvcHQgdG8gZGdzdCB1dGlsaXR5LiBVcGRhdGUgZGdzdCB0byB1c2UKICAgICBFVlBfRGlnZXN0e1NpZ24sVmVyaWZ5fSouIFRoZXNlIHR3byBjaGFuZ2VzIG1ha2UgaXQgcG9zc2libGUgdG8gdXNlCiAgICAgYWx0ZXJuYXRpdmUgc2lnbmluZyBwYXJhbWF0ZXJzIHN1Y2ggYXMgWDkuMzEgb3IgUFNTIGluIHRoZSBkZ3N0IAogICAgIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHNzbF9jaXBoZXJfYXBwbHlfcnVsZSgpLCB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gdGhhdCBkb2VzCiAgICAgdGhlIHdvcmsgZWFjaCB0aW1lIGEgY2lwaGVyc3VpdGUgc3RyaW5nIHJlcXVlc3RzIGVuYWJsaW5nCiAgICAgKCJmb28rYmFyIiksIG1vdmluZyAoIitmb28rYmFyIiksIGRpc2FibGluZyAoIi1mb28rYmFyIiwgb3IKICAgICByZW1vdmluZyAoIiFmb28rYmFyIikgYSBjbGFzcyBvZiBjaXBoZXJzdWl0ZXM6IE5vdyBpdCBtYWludGFpbnMKICAgICB0aGUgb3JkZXIgb2YgZGlzYWJsZWQgY2lwaGVyc3VpdGVzIHN1Y2ggdGhhdCB0aG9zZSBjaXBoZXJzdWl0ZXMKICAgICB0aGF0IG1vc3QgcmVjZW50bHkgd2VudCBmcm9tIGVuYWJsZWQgdG8gZGlzYWJsZWQgbm90IG9ubHkgc3RheQogICAgIGluIG9yZGVyIHdpdGggcmVzcGVjdCB0byBlYWNoIG90aGVyLCBidXQgYWxzbyBoYXZlIGhpZ2hlciBwcmlvcml0eQogICAgIHRoYW4gb3RoZXIgZGlzYWJsZWQgY2lwaGVyc3VpdGVzIHRoZSBuZXh0IHRpbWUgY2lwaGVyc3VpdGVzIGFyZQogICAgIGVuYWJsZWQgYWdhaW4uCgogICAgIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIG5vdyBzYXksIGUuZy4sICJQU0s6LVBTSzpISUdIIiB0byBlbmFibGUKICAgICB0aGUgc2FtZSBjaXBoZXJzdWl0ZXMgYXMgd2l0aCAiSElHSCIgYWxvbmUsIGJ1dCBpbiBhIHNwZWNpZmljCiAgICAgb3JkZXIgd2hlcmUgdGhlIFBTSyBjaXBoZXJzdWl0ZXMgY29tZSBmaXJzdCAoc2luY2UgdGhleSBhcmUgdGhlCiAgICAgbW9zdCByZWNlbnRseSBkaXNhYmxlZCBjaXBoZXJzdWl0ZXMgd2hlbiAiSElHSCIgaXMgcGFyc2VkKS4KCiAgICAgQWxzbywgY2hhbmdlIHNzbF9jcmVhdGVfY2lwaGVyX2xpc3QoKSAodXNpbmcgdGhpcyBuZXcKICAgICBmdW5jaW9uYWxpdHkpIHN1Y2ggdGhhdCBiZXR3ZWVuIG90aGVyd2lzZSBpZGVudGljYWwKICAgICBjaWhwZXJzdWl0ZXMsIGVwaGVtZXJhbCBFQ0RIIGlzIHByZWZlcnJlZCBvdmVyIGVwaGVtZXJhbCBESCBpbgogICAgIHRoZSBkZWZhdWx0IG9yZGVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBzc2xfY3JlYXRlX2NpcGhlcl9saXN0KCkgc28gdGhhdCBpdCBhdXRvbWF0aWNhbGx5CiAgICAgYXJyYW5nZXMgdGhlIGNpcGhlcnN1aXRlcyBpbiByZWFzb25hYmxlIG9yZGVyIGJlZm9yZSBzdGFydGluZwogICAgIHRvIHByb2Nlc3MgdGhlIHJ1bGUgc3RyaW5nLiAgVGh1cywgdGhlIGRlZmluaXRpb24gZm9yICJERUZBVUxUIgogICAgIChTU0xfREVGQVVMVF9DSVBIRVJfTElTVCkgbm93IGlzIGp1c3QgIkFMTDohYU5VTEw6IWVOVUxMIiwgYnV0CiAgICAgcmVtYWlucyBlcXVpdmFsZW50IHRvICJBRVM6QUxMOiFhTlVMTDohZU5VTEw6K2FFQ0RIOitrUlNBOitSQzQ6QFNUUkVOR1RIIi4KICAgICBUaGlzIG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIGFycml2ZSBhdCBhIHJlYXNvbmFibGUgZGVmYXVsdCBvcmRlcgogICAgIGluIGFwcGxpY2F0aW9ucyBmb3Igd2hpY2ggYW5vbnltb3VzIGNpcGhlcnMgYXJlIE9LIChtZWFuaW5nCiAgICAgdGhhdCB5b3UgY2FuJ3QgYWN0dWFsbHkgdXNlIERFRkFVTFQpLgogICAgIFtCb2RvIE1vZWxsZXI7IHN1Z2dlc3RlZCBieSBWaWN0b3IgRHVjaG92bmldCgogICopIFNwbGl0IHRoZSBTU0wvVExTIGFsZ29yaXRobSBtYXNrIChhcyB1c2VkIGZvciBjaXBoZXJzdWl0ZSBzdHJpbmcKICAgICBwcm9jZXNzaW5nKSBpbnRvIG11bHRpcGxlIGludGVnZXJzIGluc3RlYWQgb2Ygc2V0dGluZwogICAgICJTU0xfTUtFWV9NQVNLIiBiaXRzLCAiU1NMX0FVVEhfTUFTSyIgYml0cywgIlNTTF9FTkNfTUFTSyIsCiAgICAgIlNTTF9NQUNfTUFTSyIsIGFuZCAiU1NMX1NTTF9NQVNLIiBiaXRzIGFsbCBpbiBhIHNpbmdsZSBpbnRlZ2VyLgogICAgIChUaGVzZSBtYXNrcyBhcyB3ZWxsIGFzIHRoZSBpbmRpdmlkdWFsIGJpdCBkZWZpbml0aW9ucyBhcmUgaGlkZGVuCiAgICAgYXdheSBpbnRvIHRoZSBub24tZXhwb3J0ZWQgaW50ZXJmYWNlIHNzbC9zc2xfbG9jbC5oLCBzbyB0aGlzCiAgICAgY2hhbmdlIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBTU0xfQ0lQSEVSIHN0cnVjdHVyZSBzaG91bGRuJ3QKICAgICBhZmZlY3QgYXBwbGljYXRpb25zLikgIFRoaXMgZ2l2ZSB1cyBtb3JlIGJpdHMgZm9yIGVhY2ggb2YgdGhlc2UKICAgICBjYXRlZ29yaWVzLCBzbyB0aGVyZSBpcyBubyBsb25nZXIgYSBuZWVkIHRvIGNvYWd1bGF0ZSBBRVMxMjggYW5kCiAgICAgQUVTMjU2IGludG8gYSBzaW5nbGUgYWxnb3JpdGhtIGJpdCwgYW5kIHRvIGNvYWd1bGF0ZSBDYW1lbGxpYTEyOAogICAgIGFuZCBDYW1lbGxpYTI1NiBpbnRvIGEgc2luZ2xlIGFsZ29yaXRobSBiaXQsIHdoaWNoIGhhcyBsZWQgdG8gYWxsCiAgICAga2luZHMgb2Yga2x1ZGdlcy4KCiAgICAgVGh1cywgYW1vbmcgb3RoZXIgdGhpbmdzLCB0aGUga2x1ZGdlIGludHJvZHVjZWQgaW4gMC45LjdtIGFuZAogICAgIDAuOS44ZSBmb3IgbWFza2luZyBvdXQgQUVTMjU2IGluZGVwZW5kZW50bHkgb2YgQUVTMTI4IG9yIG1hc2tpbmcKICAgICBvdXQgQ2FtZWxsaWEyNTYgaW5kZXBlbmRlbnRseSBvZiBBRVMyNTYgaXMgbm90IG5lZWRlZCBoZXJlIGluIDAuOS45LgoKICAgICBXaXRoIHRoZSBjaGFuZ2UsIHdlIGFsc28gaW50cm9kdWNlIG5ldyBjaXBoZXJzdWl0ZSBhbGlhc2VzIHRoYXQKICAgICBzbyBmYXIgd2VyZSBtaXNzaW5nOiAiQUVTMTI4IiwgIkFFUzI1NiIsICJDQU1FTExJQTEyOCIsIGFuZAogICAgICJDQU1FTExJQTI1NiIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGRzYS13aXRoLVNIQTIyNCBhbmQgZHNhLXdpdGgtU0hBMjU2LgogICAgIFVzZSB0aGUgbGVmdG1vc3QgTiBieXRlcyBvZiB0aGUgc2lnbmF0dXJlIGlucHV0IGlmIHRoZSBpbnB1dCBpcwogICAgIGxhcmdlciB0aGFuIHRoZSBwcmltZSBxICh3aXRoIE4gYmVpbmcgdGhlIHNpemUgaW4gYnl0ZXMgb2YgcSkuCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBWZXJ5ICp2ZXJ5KiBleHBlcmltZW50YWwgUEtDUyM3IHN0cmVhbWluZyBlbmNvZGVyIHN1cHBvcnQuIE5vdGhpbmcgdXNlcwogICAgIGl0IHlldCBhbmQgaXQgaXMgbGFyZ2VseSB1bnRlc3RlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdGhlIGVjZHNhLXdpdGgtU0hBMjI0LzI1Ni8zODQvNTEyIHNpZ25hdHVyZSB0eXBlcy4KICAgICBbTmlscyBMYXJzY2hdCgogICopIEluaXRpYWwgaW5jb21wbGV0ZSBjaGFuZ2VzIHRvIGF2b2lkIG5lZWQgZm9yIGZ1bmN0aW9uIGNhc3RzIGluIE9wZW5TU0wKICAgICBzb21lIGNvbXBpbGVycyAoZ2NjIDQuMiBhbmQgbGF0ZXIpIHJlamVjdCB0aGVpciB1c2UuIFNhZmVzdGFjayBpcwogICAgIHJlaW1wbGVtZW50ZWQuICBVcGRhdGUgQVNOMSB0byBhdm9pZCB1c2Ugb2YgbGVnYWN5IGZ1bmN0aW9ucy4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgV2luMzIvNjQgdGFyZ2V0cyBhcmUgbGlua2VkIHdpdGggV2luc29jazIuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBhbiBYNTA5X0NSTF9NRVRIT0Qgc3RydWN0dXJlIHRvIGFsbG93IENSTCBwcm9jZXNzaW5nIHRvIGJlIHJlZGlyZWN0ZWQKICAgICB0byBleHRlcm5hbCBmdW5jdGlvbnMuIFRoaXMgY2FuIGJlIHVzZWQgdG8gaW5jcmVhc2UgQ1JMIGhhbmRsaW5nIAogICAgIGVmZmljaWVuY3kgZXNwZWNpYWxseSB3aGVuIENSTHMgYXJlIHZlcnkgbGFyZ2UgYnkgKGZvciBleGFtcGxlKSBzdG9yaW5nCiAgICAgdGhlIENSTCByZXZva2VkIGNlcnRpZmljYXRlcyBpbiBhIGRhdGFiYXNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE92ZXJoYXVsIG9mIGJ5X2RpciBjb2RlLiBBZGQgc3VwcG9ydCBmb3IgZHluYW1pYyBsb2FkaW5nIG9mIENSTHMgc28KICAgICBuZXcgQ1JMcyBhZGRlZCB0byBhIGRpcmVjdG9yeSBjYW4gYmUgdXNlZC4gTmV3IGNvbW1hbmQgbGluZSBvcHRpb24KICAgICAtdmVyaWZ5X3JldHVybl9lcnJvciB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIuIFRoaXMgY2F1c2VzIHJlYWwgZXJyb3JzCiAgICAgdG8gYmUgcmV0dXJuZWQgYnkgdGhlIHZlcmlmeSBjYWxsYmFjayBpbnN0ZWFkIG9mIGNhcnJ5aW5nIG9uIG5vIG1hdHRlcgogICAgIHdoYXQuIFRoaXMgcmVmbGVjdHMgdGhlIHdheSBhICJyZWFsIHdvcmxkIiB2ZXJpZnkgY2FsbGJhY2sgd291bGQgYmVoYXZlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEdPU1QgZW5naW5lLCBzdXBwb3J0aW5nIHNldmVyYWwgR09TVCBhbGdvcml0aG1zIGFuZCBwdWJsaWMga2V5IGZvcm1hdHMuCiAgICAgS2luZGx5IGRvbmF0ZWQgYnkgQ3J5cHRvY29tLgogICAgIFtDcnlwdG9jb21dCgogICopIFBhcnRpYWwgc3VwcG9ydCBmb3IgSXNzdWluZyBEaXN0cmlidXRpb24gUG9pbnQgQ1JMIGV4dGVuc2lvbi4gQ1JMcwogICAgIHBhcnRpdGlvbmVkIGJ5IERQIGFyZSBoYW5kbGVkIGJ1dCBubyBpbmRpcmVjdCBDUkwgb3IgcmVhc29uIHBhcnRpdGlvbmluZwogICAgICh5ZXQpLiBDb21wbGV0ZSBvdmVyaGF1bCBvZiBDUkwgaGFuZGxpbmc6IG5vdyB0aGUgbW9zdCBzdWl0YWJsZSBDUkwgaXMKICAgICBzZWxlY3RlZCB2aWEgYSBzY29yaW5nIHRlY2huaXF1ZSB3aGljaCBoYW5kbGVzIElEUCBhbmQgQUtJRCBpbiBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBYNTA5X1NUT1JFX0NUWCBjYWxsYmFja3MgbG9va3VwX2NybHMoKSBhbmQgbG9va3VwX2NlcnRzKCkgd2hpY2gKICAgICB3aWxsIHVsdGltYXRlbHkgYmUgdXNlZCBmb3IgYWxsIHZlcmlmeSBvcGVyYXRpb25zOiB0aGlzIHdpbGwgcmVtb3ZlIHRoZQogICAgIFg1MDlfU1RPUkUgZGVwZW5kZW5jeSBvbiBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYW5kIGFsbG93IGFsdGVybmF0aXZlCiAgICAgbG9va3VwIG1ldGhvZHMuICBYNTA5X1NUT1JFIGJhc2VkIGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSB0d28gY2FsbGJhY2tzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IG11bHRpcGxlIENSTHMgdG8gZXhpc3QgaW4gYW4gWDUwOV9TVE9SRSB3aXRoIG1hdGNoaW5nIGlzc3VlciBuYW1lcy4KICAgICBNb2RpZnkgZ2V0X2NybCgpIHRvIGZpbmQgYSB2YWxpZCAodW5leHBpcmVkKSBDUkwgaWYgcG9zc2libGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfQ1JMX21hdGNoKCkgdG8gY2hlY2sgaWYgdHdvIENSTHMgYXJlIGlkZW50aWNhbC4gTm9ybWFsbHkKICAgICB0aGlzIHdvdWxkIGJlIGNhbGxlZCBYNTA5X0NSTF9jbXAoKSBidXQgdGhhdCBuYW1lIGlzIGFscmVhZHkgdXNlZCBieQogICAgIGEgZnVuY3Rpb24gdGhhdCBqdXN0IGNvbXBhcmVzIENSTCBpc3N1ZXIgbmFtZXMuIENhY2hlIHNldmVyYWwgQ1JMIAogICAgIGV4dGVuc2lvbnMgaW4gWDUwOV9DUkwgc3RydWN0dXJlIGFuZCBjYWNoZSBDUkxEUCBpbiBYNTA5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN0b3JlIGEgImNhbm9uaWNhbCIgcmVwcmVzZW50YXRpb24gb2YgWDUwOV9OQU1FIHN0cnVjdHVyZSAoQVNOMSBOYW1lKQogICAgIHRoaXMgbWFwcyBlcXVpdmFsZW50IFg1MDlfTkFNRSBzdHJ1Y3R1cmVzIGludG8gYSBjb25zaXN0ZW50IHN0cnVjdHVyZS4KICAgICBOYW1lIGNvbXBhcmlzb24gY2FuIHRoZW4gYmUgcGVyZm9ybWVkIHJhcGlkbHkgdXNpbmcgbWVtY21wKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTm9uLWJsb2NraW5nIE9DU1AgcmVxdWVzdCBwcm9jZXNzaW5nLiBBZGQgLXRpbWVvdXQgb3B0aW9uIHRvIG9jc3AgCiAgICAgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBkaWdlc3RzIHRvIHN1cHBseSB0aGVpciBvd24gbWljYWxnIHN0cmluZyBmb3IgUy9NSU1FIHR5cGUgdXNpbmcKICAgICB0aGUgY3RybCBFVlBfTURfQ1RSTF9NSUNBTEcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRHVyaW5nIFBLQ1M3IHNpZ25pbmcgcGFzcyB0aGUgUEtDUzcgU2lnbmVySW5mbyBzdHJ1Y3R1cmUgdG8gdGhlCiAgICAgRVZQX1BLRVlfTUVUSE9EIGJlZm9yZSBhbmQgYWZ0ZXIgc2lnbmluZyB2aWEgdGhlIEVWUF9QS0VZX0NUUkxfUEtDUzdfU0lHTgogICAgIGN0cmwuIEl0IGNhbiB0aGVuIGN1c3RvbWlzZSB0aGUgc3RydWN0dXJlIGJlZm9yZSBhbmQvb3IgYWZ0ZXIgc2lnbmluZwogICAgIGlmIG5lY2Vzc2FyeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gT0JKX2FkZF9zaWdpZCgpIHRvIGFsbG93IGFwcGxpY2F0aW9uIGRlZmluZWQgc2lnbmF0dXJlIE9JRHMKICAgICB0byBiZSBhZGRlZCB0byBPcGVuU1NMcyBpbnRlcm5hbCB0YWJsZXMuIE5ldyBmdW5jdGlvbiBPQkpfc2lnaWRfZnJlZSgpCiAgICAgdG8gZnJlZSB1cCBhbnkgYWRkZWQgc2lnbmF0dXJlIE9JRHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBFVlBfQ0lQSEVSX2RvX2FsbCgpLCBFVlBfQ0lQSEVSX2RvX2FsbF9zb3J0ZWQoKSwKICAgICBFVlBfTURfZG9fYWxsKCkgYW5kIEVWUF9NRF9kb19hbGxfc29ydGVkKCkgdG8gZW51bWVyYXRlIGludGVybmFsCiAgICAgZGlnZXN0IGFuZCBjaXBoZXIgdGFibGVzLiBOZXcgb3B0aW9ucyBhZGRlZCB0byBvcGVuc3NsIHV0aWxpdHk6CiAgICAgbGlzdC1tZXNzYWdlLWRpZ2VzdC1hbGdvcml0aG1zIGFuZCBsaXN0LWNpcGhlci1hbGdvcml0aG1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0aGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgYmluYXJ5IHBvbHlub21pYWxzOiB0aGUgbGlzdAogICAgIG9mIGRlZ3JlZXMgb2Ygbm9uLXplcm8gY29lZmZpY2llbnRzIGlzIG5vdyB0ZXJtaW5hdGVkIHdpdGggLTEuCiAgICAgUHJldmlvdXNseSBpdCB3YXMgdGVybWluYXRlZCB3aXRoIDAsIHdoaWNoIHdhcyBhbHNvIHBhcnQgb2YgdGhlCiAgICAgdmFsdWU7IHRodXMsIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiB3YXMgbm90IGFwcGxpY2FibGUgdG8KICAgICBwb2x5bm9taWFscyB3aGVyZSB0XjAgaGFzIGNvZWZmaWNpZW50IHplcm8uICBUaGlzIGNoYW5nZSBtYWtlcwogICAgIHRoZSBhcnJheSByZXByZXNlbnRhdGlvbiB1c2VmdWwgaW4gYSBtb3JlIGdlbmVyYWwgY29udGV4dC4KICAgICBbRG91Z2xhcyBTdGViaWxhXQoKICAqKSBWYXJpb3VzIG1vZGlmaWNhdGlvbnMgYW5kIGZpeGVzIHRvIFNTTC9UTFMgY2lwaGVyIHN0cmluZwogICAgIGhhbmRsaW5nLiAgRm9yIEVDQywgdGhlIGNvZGUgbm93IGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiBmaXhlZCBFQ0RICiAgICAgd2l0aCBSU0EgY2VydGlmaWNhdGVzIG9uIHRoZSBvbmUgaGFuZCBhbmQgd2l0aCBFQ0RTQSBjZXJ0aWZpY2F0ZXMKICAgICBvbiB0aGUgb3RoZXIgaGFuZCwgc2luY2UgdGhlc2UgYXJlIHNlcGFyYXRlIGNpcGhlcnN1aXRlcy4gIFRoZQogICAgIHVudXNlZCBjb2RlIGZvciBGb3J0ZXp6YSBjaXBoZXJzdWl0ZXMgaGFzIGJlZW4gcmVtb3ZlZC4KCiAgICAgRm9yIGNvbnNpc3RlbmN5IHdpdGggRURILCBlcGhlbWVyYWwgRUNESCBpcyBub3cgY2FsbGVkICJFRUNESCIKICAgICAobm90ICJFQ0RIRSIpLiAgRm9yIGNvbnNpc3RlbmN5IHdpdGggdGhlIGNvZGUgZm9yIERICiAgICAgY2VydGlmaWNhdGVzLCB1c2Ugb2YgRUNESCBjZXJ0aWZpY2F0ZXMgaXMgbm93IGNvbnNpZGVyZWQgRUNESAogICAgIGF1dGhlbnRpY2F0aW9uLCBub3QgUlNBIG9yIEVDRFNBIGF1dGhlbnRpY2F0aW9uICh0aGUgbGF0dGVyIGlzCiAgICAgbWVyZWx5IHRoZSBDQSdzIHNpZ25pbmcgYWxnb3JpdGhtIGFuZCBub3QgYWN0aXZlbHkgdXNlZCBpbiB0aGUKICAgICBwcm90b2NvbCkuCgogICAgIFRoZSB0ZW1wb3JhcnkgY2lwaGVyc3VpdGUgYWxpYXMgIkVDQ2RyYWZ0IiBpcyBubyBsb25nZXIKICAgICBhdmFpbGFibGUsIGFuZCBFQ0MgY2lwaGVyc3VpdGVzIGFyZSBubyBsb25nZXIgZXhjbHVkZWQgZnJvbSAiQUxMIgogICAgIGFuZCAiREVGQVVMVCIuICBUaGUgZm9sbG93aW5nIGFsaWFzZXMgbm93IGV4aXN0IGZvciBSRkMgNDQ5MgogICAgIGNpcGhlcnN1aXRlcywgbW9zdCBvZiB0aGVzZSBieSBhbmFsb2d5IHdpdGggdGhlIERIIGNhc2U6CgogICAgICAgICBrRUNESHIgICAtIEVDREggY2VydCwgc2lnbmVkIHdpdGggUlNBCiAgICAgICAgIGtFQ0RIZSAgIC0gRUNESCBjZXJ0LCBzaWduZWQgd2l0aCBFQ0RTQQogICAgICAgICBrRUNESCAgICAtIEVDREggY2VydCAoc2lnbmVkIHdpdGggZWl0aGVyIFJTQSBvciBFQ0RTQSkKICAgICAgICAga0VFQ0RIICAgLSBlcGhlbWVyYWwgRUNESAogICAgICAgICBFQ0RIICAgICAtIEVDREggY2VydCBvciBlcGhlbWVyYWwgRUNESAoKICAgICAgICAgYUVDREggICAgLSBFQ0RIIGNlcnQKICAgICAgICAgYUVDRFNBICAgLSBFQ0RTQSBjZXJ0CiAgICAgICAgIEVDRFNBICAgIC0gRUNEU0EgY2VydAoKICAgICAgICAgQUVDREggICAgLSBhbm9ueW1vdXMgRUNESAogICAgICAgICBFRUNESCAgICAtIG5vbi1hbm9ueW1vdXMgZXBoZW1lcmFsIEVDREggKGVxdWl2YWxlbnQgdG8gImtFRUNESDotQUVDREgiKQoKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYWRkaXRpb25hbCBTL01JTUUgY2FwYWJpbGl0aWVzIGZvciBBRVMgYW5kIEdPU1QgY2lwaGVycyBpZiBzdXBwb3J0ZWQuCiAgICAgVXNlIGNvcnJlY3QgbWljYWxnIHBhcmFtZXRlcnMgZGVwZW5kaW5nIG9uIGRpZ2VzdChzKSBpbiBzaWduZWQgbWVzc2FnZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZW5naW5lIHN1cHBvcnQgZm9yIEVWUF9QS0VZX0FTTjFfTUVUSE9ELiBBZGQgZnVuY3Rpb25zIHRvIHByb2Nlc3MKICAgICBhbiBFTkdJTkUgYXNuMSBtZXRob2QuIFN1cHBvcnQgRU5HSU5FIGxvb2t1cHMgaW4gdGhlIEFTTjEgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGVuZ2luZSBzdXBwb3J0IGZvciBFVlBfUEtFWV9NRVRIT0QuIE5ldyBmdW5jdGlvbnMgdG8gcGVybWl0CiAgICAgYW4gZW5naW5lIHRvIHJlZ2lzdGVyIGEgbWV0aG9kLiBBZGQgRU5HSU5FIGxvb2t1cHMgZm9yIG1ldGhvZHMgYW5kCiAgICAgZnVuY3Rpb25hbCByZWZlcmVuY2UgcHJvY2Vzc2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIEVWUF9EaWdlc3R7U2lnbixWZXJpZnkpKi4gVGhlc2UgYXJlIGVuY2hhbmNlIHZlcnNpb25zIG9mCiAgICAgRVZQX3tTaWduLFZlcmlmeX0qIHdoaWNoIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIGN1c3RvbWlzZSB0aGUgc2lnbmF0dXJlCiAgICAgcHJvY2Vzcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgLXJlc2lnbiBvcHRpb24gdG8gc21pbWUgdXRpbGl0eS4gVGhpcyBhZGRzIG9uZSBvciBtb3JlIHNpZ25lcnMKICAgICB0byBhbiBleGlzdGluZyBQS0NTIzcgc2lnbmVkRGF0YSBzdHJ1Y3R1cmUuIEFsc28gLW1kIG9wdGlvbiB0byB1c2UgYW4KICAgICBhbHRlcm5hdGl2ZSBtZXNzYWdlIGRpZ2VzdCBhbGdvcml0aG0gZm9yIHNpZ25pbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVGlkeSB1cCBQS0NTIzcgcm91dGluZXMgYW5kIGFkZCBuZXcgZnVuY3Rpb25zIHRvIG1ha2UgaXQgZWFzaWVyIHRvCiAgICAgY3JlYXRlIFBLQ1M3IHN0cnVjdHVyZXMgY29udGFpbmluZyBtdWx0aXBsZSBzaWduZXJzLiBVcGRhdGUgc21pbWUKICAgICBhcHBsaWNhdGlvbiB0byBzdXBwb3J0IG11bHRpcGxlIHNpZ25lcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1tYWNhbGcgb3B0aW9uIHRvIHBrY3MxMiB1dGlsaXR5IHRvIGFsbG93IHNldHRpbmcgb2YgYW4gYWx0ZXJuYXRpdmUKICAgICBkaWdlc3QgTUFDLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgUEtDUyM1IHYyLjAgUFJGcyBvdGhlciB0aGFuIGRlZmF1bHQgU0hBMSBITUFDLgogICAgIFJlb3JnYW5pemUgUEJFIGludGVybmFscyB0byBsb29rdXAgZnJvbSBhIHN0YXRpYyB0YWJsZSB1c2luZyBOSURzLAogICAgIGFkZCBzdXBwb3J0IGZvciBITUFDIFBCRSBPSUQgdHJhbnNsYXRpb24uIEFkZCBhIEVWUF9DSVBIRVIgY3RybDoKICAgICBFVlBfQ1RSTF9QQkVfUFJGX05JRCB0aGlzIGFsbG93cyBhIGNpcGhlciB0byBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlCiAgICAgUFJGIHdoaWNoIHdpbGwgYmUgYXV0b21hdGljYWxseSB1c2VkIHdpdGggUEJFUzIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVwbGFjZSB0aGUgYWxnb3JpdGhtIHNwZWNpZmljIGNhbGxzIHRvIGdlbmVyYXRlIGtleXMgaW4gInJlcSIgd2l0aCB0aGUKICAgICBuZXcgQVBJLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBQS0NTIzcgZW52ZWxvcGVkIGRhdGEgcm91dGluZXMgdG8gdXNlIG5ldyBBUEkuIFRoaXMgaXMgbm93CiAgICAgc3VwcG9ydGVkIGJ5IGFueSBwdWJsaWMga2V5IG1ldGhvZCBzdXBwb3J0aW5nIHRoZSBlbmNyeXB0IG9wZXJhdGlvbi4gQQogICAgIGN0cmwgaXMgYWRkZWQgdG8gYWxsb3cgdGhlIHB1YmxpYyBrZXkgYWxnb3JpdGhtIHRvIGV4YW1pbmUgb3IgbW9kaWZ5CiAgICAgdGhlIFBLQ1MjNyBSZWNpcGllbnRJbmZvIHN0cnVjdHVyZSBpZiBpdCBuZWVkcyB0bzogZm9yIFJTQSB0aGlzIGlzCiAgICAgYSBubyBvcC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBjdHJsIHRvIGFzbjEgbWV0aG9kIHRvIGFsbG93IGEgcHVibGljIGtleSBhbGdvcml0aG0gdG8gZXhwcmVzcwogICAgIGEgZGVmYXVsdCBkaWdlc3QgdHlwZSB0byB1c2UuIEluIG1vc3QgY2FzZXMgdGhpcyB3aWxsIGJlIFNIQTEgYnV0IHNvbWUKICAgICBhbGdvcml0aG1zIChzdWNoIGFzIEdPU1QpIG5lZWQgdG8gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZSBkaWdlc3QuIFRoZQogICAgIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgaG93IHN0cm9uZyB0aGUgcHJlZmVyZW5jZSBpcyAxIG1lYW5zIG9wdGlvbmFsIGFuZAogICAgIDIgaXMgbWFuZGF0b3J5ICh0aGF0IGlzIGl0IGlzIHRoZSBvbmx5IHN1cHBvcnRlZCB0eXBlKS4gTW9kaWZ5CiAgICAgQVNOMV9pdGVtX3NpZ24oKSB0byBhY2NlcHQgYSBOVUxMIGRpZ2VzdCBhcmd1bWVudCB0byBpbmRpY2F0ZSBpdCBzaG91bGQKICAgICB1c2UgdGhlIGRlZmF1bHQgbWQuIFVwZGF0ZSBvcGVuc3NsIHV0aWxpdGllcyB0byB1c2UgdGhlIGRlZmF1bHQgZGlnZXN0CiAgICAgdHlwZSBmb3Igc2lnbmluZyBpZiBpdCBpcyBub3QgZXhwbGljaXRseSBpbmRpY2F0ZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIE9JRCBjcm9zcyByZWZlcmVuY2UgdGFibGUgaW4gQVNOMV9zaWduKCkgYW5kIEFTTjFfdmVyaWZ5KCkuIE5ldyAKICAgICBFVlBfTUQgZmxhZyBFVlBfTURfRkxBR19QS0VZX01FVEhPRF9TSUdOQVRVUkUuIFRoaXMgdXNlcyB0aGUgcmVsZXZhbnQKICAgICBzaWduaW5nIG1ldGhvZCBmcm9tIHRoZSBrZXkgdHlwZS4gVGhpcyBlZmZlY3RpdmVseSByZW1vdmVzIHRoZSBsaW5rCiAgICAgYmV0d2VlbiBkaWdlc3RzIGFuZCBwdWJsaWMga2V5IHR5cGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhbiBPSUQgY3Jvc3MgcmVmZXJlbmNlIHRhYmxlIGFuZCB1dGlsaXR5IGZ1bmN0aW9ucy4gSXRzIHB1cnBvc2UgaXMgdG8KICAgICB0cmFuc2xhdGUgYmV0d2VlbiBzaWduYXR1cmUgT0lEcyBzdWNoIGFzIFNIQTFXaXRocnNhRW5jcnlwdGlvbiBhbmQgU0hBMSwKICAgICByc2FFbmNyeXB0aW9uLiBUaGlzIHdpbGwgYWxsb3cgc29tZSBvZiB0aGUgYWxnb3JpdGhtIHNwZWNpZmljIGhhY2tlcnkKICAgICBuZWVkZWQgdG8gdXNlIHRoZSBjb3JyZWN0IE9JRCB0byBiZSByZW1vdmVkLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgYWxnb3JpdGhtIHNwZWNpZmljIGRlcGVuZGVuY2llcyB3aGVuIHNldHRpbmcgUEtDUzdfU0lHTkVSX0lORk8KICAgICBzdHJ1Y3R1cmVzIGZvciBQS0NTN19zaWduKCkuIFRoZXkgYXJlIG5vdyBzZXQgdXAgYnkgdGhlIHJlbGV2YW50IHB1YmxpYwogICAgIGtleSBBU04xIG1ldGhvZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgcHJvdmlzaW9uYWwgRUMgcGtleSBtZXRob2Qgd2l0aCBzdXBwb3J0IGZvciBFQ0RTQSBhbmQgRUNESC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3Iga2V5IGRlcml2YXRpb24gKGFncmVlbWVudCkgaW4gdGhlIEFQSSwgREggbWV0aG9kIGFuZAogICAgIHBrZXl1dGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIERTQSBwa2V5IG1ldGhvZCBhbmQgREggcGtleSBtZXRob2RzLCBleHRlbmQgREggQVNOMSBtZXRob2QgdG8gc3VwcG9ydAogICAgIHB1YmxpYyBhbmQgcHJpdmF0ZSBrZXkgZm9ybWF0cy4gQXMgYSBzaWRlIGVmZmVjdCB0aGVzZSBhZGQgYWRkaXRpb25hbCAKICAgICBjb21tYW5kIGxpbmUgZnVuY3Rpb25hbGl0eSBub3QgcHJldmlvdXNseSBhdmFpbGFibGU6IERTQSBzaWduYXR1cmVzIGNhbiBiZQogICAgIGdlbmVyYXRlZCBhbmQgdmVyaWZpZWQgdXNpbmcgcGtleXV0bCBhbmQgREgga2V5IHN1cHBvcnQgYW5kIGdlbmVyYXRpb24gaW4KICAgICBwa2V5LCBnZW5wa2V5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJlT1Mgc3VwcG9ydC4KICAgICBbT2xpdmVyIFRhcHBlIDx6b29leUBoaXJzY2hrYWVmZXIuZGU+XQoKICAqKSBOZXcgbWFrZSB0YXJnZXQgImluc3RhbGxfaHRtbF9kb2NzIiBpbnN0YWxscyBIVE1MIHJlbmRpdGlvbnMgb2YgdGhlCiAgICAgbWFudWFsIHBhZ2VzLgogICAgIFtPbGl2ZXIgVGFwcGUgPHpvb2V5QGhpcnNjaGthZWZlci5kZT5dCgogICopIE5ldyB1dGlsaXR5ICJnZW5wa2V5IiB0aGlzIGlzIGFuYWxvZ291cyB0byAiZ2VucnNhIiBldGMgZXhjZXB0IGl0IGNhbgogICAgIGdlbmVyYXRlIGtleXMgZm9yIGFueSBhbGdvcml0aG0uIEV4dGVuZCBhbmQgdXBkYXRlIEVWUF9QS0VZX01FVEhPRCB0bwogICAgIHN1cHBvcnQga2V5IGFuZCBwYXJhbWV0ZXIgZ2VuZXJhdGlvbiBhbmQgYWRkIGluaXRpYWwga2V5IGdlbmVyYXRpb24KICAgICBmdW5jdGlvbmFsaXR5IGZvciBSU0EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9ucyBmb3IgbWFpbiBFVlBfUEtFWV9tZXRob2Qgb3BlcmF0aW9ucy4gVGhlIHVuZG9jdW1lbnRlZAogICAgIGZ1bmN0aW9ucyBFVlBfUEtFWV97ZW5jcnlwdCxkZWNyeXB0fSBoYXZlIGJlZW4gcmVuYW1lZCB0bwogICAgIEVWUF9QS0VZX3tlbmNyeXB0LGRlY3J5cHR9X29sZC4gCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBkZWZpbml0aW9ucyBmb3IgRVZQX1BLRVlfTUVUSE9ELiBUaGlzIHdpbGwgYmUgYSBoaWdoIGxldmVsIHB1YmxpYwogICAgIGtleSBBUEksIGRvZXNuJ3QgZG8gbXVjaCB5ZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEVWUF9QS0VZX2FzbjFfZ2V0MF9pbmZvKCkgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gYWJvdXQKICAgICBwdWJsaWMga2V5IGFsZ29yaXRobXMuIE5ldyBvcHRpb24gdG8gb3BlbnNzbCB1dGlsaXR5OgogICAgICJsaXN0LXB1YmxpYy1rZXktYWxnb3JpdGhtcyIgdG8gcHJpbnQgb3V0IGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IHRoZSBTdXBwb3J0ZWQgRWxsaXB0aWMgQ3VydmVzIEV4dGVuc2lvbiBmb3IKICAgICBFQ0MgY2lwaGVyc3VpdGVzIGZyb20gZHJhZnQtaWV0Zi10bHMtZWNjLTEyLnR4dC4KICAgICBbRG91Z2xhcyBTdGViaWxhXQoKICAqKSBEb24ndCBmcmVlIHVwIE9JRHMgaW4gT0JKX2NsZWFudXAoKSBpZiB0aGV5IGFyZSBpbiB1c2UgYnkgRVZQX01EIG9yCiAgICAgRVZQX0NJUEhFUiBzdHJ1Y3R1cmVzIHRvIGF2b2lkIGxhdGVyIHByb2JsZW1zIGluIEVWUF9jbGVhbnVwKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHV0aWxpdGllcyBwa2V5IGFuZCBwa2V5cGFyYW0uIFRoZXNlIGFyZSBzaW1pbGFyIHRvIGFsZ29yaXRobSBzcGVjaWZpYwogICAgIHV0aWxpdGllcyBzdWNoIGFzIHJzYSwgZHNhLCBkc2FwYXJhbSBldGMgZXhjZXB0IHRoZXkgcHJvY2VzcyBhbnkga2V5CiAgICAgdHlwZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUcmFuc2ZlciBwdWJsaWMga2V5IHByaW50aW5nIHJvdXRpbmVzIHRvIEVWUF9QS0VZX0FTTjFfTUVUSE9ELiBOZXcgCiAgICAgZnVuY3Rpb25zIEVWUF9QS0VZX3ByaW50X3B1YmxpYygpLCBFVlBfUEtFWV9wcmludF9wcml2YXRlKCksCiAgICAgRVZQX1BLRVlfcHJpbnRfcGFyYW0oKSB0byBwcmludCBwdWJsaWMga2V5IGRhdGEgZnJvbSBhbiBFVlBfUEtFWQogICAgIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIHBsdWdnYWJsZSBwdWJsaWMga2V5IEFTTjEuCiAgICAgRGUtc3BhZ2hldHRpZnkgdGhlIHB1YmxpYyBrZXkgQVNOMSBoYW5kbGluZy4gTW92ZSBwdWJsaWMgYW5kIHByaXZhdGUKICAgICBrZXkgQVNOMSBoYW5kbGluZyB0byBhIG5ldyBFVlBfUEtFWV9BU04xX01FVEhPRCBzdHJ1Y3R1cmUuIFJlbG9jYXRlCiAgICAgYWxnb3JpdGhtIHNwZWNpZmljIGhhbmRsaW5nIHRvIGEgc2luZ2xlIG1vZHVsZSB3aXRoaW4gdGhlIHJlbGV2YW50CiAgICAgYWxnb3JpdGhtIGRpcmVjdG9yeS4gQWRkIGZ1bmN0aW9ucyB0byBhbGxvdyAobmVhcikgb3BhcXVlIHByb2Nlc3NpbmcKICAgICBvZiBwdWJsaWMgYW5kIHByaXZhdGUga2V5IHN0cnVjdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IHRoZSBTdXBwb3J0ZWQgUG9pbnQgRm9ybWF0cyBFeHRlbnNpb24gZm9yCiAgICAgRUNDIGNpcGhlcnN1aXRlcyBmcm9tIGRyYWZ0LWlldGYtdGxzLWVjYy0xMi50eHQuCiAgICAgW0RvdWdsYXMgU3RlYmlsYV0KCiAgKikgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgUkZDIDQyNzkgUFNLIFRMUyBjaXBoZXJzdWl0ZXMuIEFkZCBtZW1iZXJzCiAgICAgZm9yIHRoZSBwc2sgaWRlbnRpdHkgW2hpbnRdIGFuZCB0aGUgcHNrIGNhbGxiYWNrIGZ1bmN0aW9ucyB0byB0aGUKICAgICBTU0xfU0VTU0lPTiwgU1NMIGFuZCBTU0xfQ1RYIHN0cnVjdHVyZS4KICAgICAKICAgICBOZXcgY2lwaGVyc3VpdGVzOgogICAgICAgICBQU0stUkM0LVNIQSwgUFNLLTNERVMtRURFLUNCQy1TSEEsIFBTSy1BRVMxMjgtQ0JDLVNIQSwKICAgICAgICAgUFNLLUFFUzI1Ni1DQkMtU0hBCiAKICAgICBOZXcgZnVuY3Rpb25zOgogICAgICAgICBTU0xfQ1RYX3VzZV9wc2tfaWRlbnRpdHlfaGludAogICAgICAgICBTU0xfZ2V0X3Bza19pZGVudGl0eV9oaW50CiAgICAgICAgIFNTTF9nZXRfcHNrX2lkZW50aXR5CiAgICAgICAgIFNTTF91c2VfcHNrX2lkZW50aXR5X2hpbnQKCiAgICAgW01pa2EgS291c2EgYW5kIFBhc2kgRXJvbmVuIG9mIE5va2lhIENvcnBvcmF0aW9uXQoKICAqKSBBZGQgUkZDIDMxNjEgY29tcGxpYW50IHRpbWUgc3RhbXAgcmVxdWVzdCBjcmVhdGlvbiwgcmVzcG9uc2UgZ2VuZXJhdGlvbgogICAgIGFuZCByZXNwb25zZSB2ZXJpZmljYXRpb24gZnVuY3Rpb25hbGl0eS4KICAgICBbWm9sdOFuIEds83ppayA8emdsb3ppa0BvcGVudHNhLm9yZz4sIFRoZSBPcGVuVFNBIFByb2plY3RdCgogICopIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIFRMUyBleHRlbnNpb25zLCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBzZXJ2ZXJfbmFtZQogICAgIGV4dGVuc2lvbiBzbyBmYXIuICBUaGUgU1NMX1NFU1NJT04sIFNTTF9DVFgsIGFuZCBTU0wgZGF0YSBzdHJ1Y3R1cmVzIG5vdwogICAgIGhhdmUgbmV3IG1lbWJlcnMgZm9yIGEgaG9zdCBuYW1lLiAgVGhlIFNTTCBkYXRhIHN0cnVjdHVyZSBoYXMgYW4KICAgICBhZGRpdGlvbmFsIG1lbWJlciBTU0xfQ1RYICppbml0aWFsX2N0eCBzbyB0aGF0IG5ldyBzZXNzaW9ucyBjYW4gYmUKICAgICBzdG9yZWQgaW4gdGhhdCBjb250ZXh0IHRvIGFsbG93IGZvciBzZXNzaW9uIHJlc3VtcHRpb24sIGV2ZW4gYWZ0ZXIgdGhlCiAgICAgU1NMIGhhcyBiZWVuIHN3aXRjaGVkIHRvIGEgbmV3IFNTTF9DVFggaW4gcmVhY3Rpb24gdG8gYSBjbGllbnQncwogICAgIHNlcnZlcl9uYW1lIGV4dGVuc2lvbi4KCiAgICAgTmV3IGZ1bmN0aW9ucyAoc3ViamVjdCB0byBjaGFuZ2UpOgoKICAgICAgICAgU1NMX2dldF9zZXJ2ZXJuYW1lKCkKICAgICAgICAgU1NMX2dldF9zZXJ2ZXJuYW1lX3R5cGUoKQogICAgICAgICBTU0xfc2V0X1NTTF9DVFgoKQoKICAgICBOZXcgQ1RSTCBjb2RlcyBhbmQgbWFjcm9zIChzdWJqZWN0IHRvIGNoYW5nZSk6CgogICAgICAgICBTU0xfQ1RSTF9TRVRfVExTRVhUX1NFUlZFUk5BTUVfQ0IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTU0xfQ1RYX3NldF90bHNleHRfc2VydmVybmFtZV9jYWxsYmFjaygpCiAgICAgICAgIFNTTF9DVFJMX1NFVF9UTFNFWFRfU0VSVkVSTkFNRV9BUkcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2FyZygpCiAgICAgICAgIFNTTF9DVFJMX1NFVF9UTFNFWFRfSE9TVE5BTUUgICAgICAgICAgIC0gU1NMX3NldF90bHNleHRfaG9zdF9uYW1lKCkKCiAgICAgb3BlbnNzbCBzX2NsaWVudCBoYXMgYSBuZXcgJy1zZXJ2ZXJuYW1lIC4uLicgb3B0aW9uLgoKICAgICBvcGVuc3NsIHNfc2VydmVyIGhhcyBuZXcgb3B0aW9ucyAnLXNlcnZlcm5hbWVfaG9zdCAuLi4nLCAnLWNlcnQyIC4uLicsCiAgICAgJy1rZXkyIC4uLicsICctc2VydmVybmFtZV9mYXRhbCcgKHN1YmplY3QgdG8gY2hhbmdlKS4gIFRoaXMgYWxsb3dzCiAgICAgdGVzdGluZyB0aGUgSG9zdE5hbWUgZXh0ZW5zaW9uIGZvciBhIHNwZWNpZmljIHNpbmdsZSBob3N0IG5hbWUgKCctY2VydCcKICAgICBhbmQgJy1rZXknIHJlbWFpbiBmYWxsYmFja3MgZm9yIGhhbmRzaGFrZXMgd2l0aG91dCBIb3N0TmFtZQogICAgIG5lZ290aWF0aW9uKS4gIElmIHRoZSB1bnJlY29nbml6ZWRfbmFtZSBhbGVydCBoYXMgdG8gYmUgc2VudCwgdGhpcyBieQogICAgIGRlZmF1bHQgaXMgYSB3YXJuaW5nOyBpdCBiZWNvbWVzIGZhdGFsIHdpdGggdGhlICctc2VydmVybmFtZV9mYXRhbCcKICAgICBvcHRpb24uCgogICAgIFtQZXRlciBTeWx2ZXN0ZXIsICBSZW15IEFsbGFpcywgQ2hyaXN0b3BoZSBSZW5vdV0KCiAgKikgV2hpcmxwb29sIGhhc2ggaW1wbGVtZW50YXRpb24gaXMgYWRkZWQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEJJR05VTSBjb2RlIG9uIDY0LWJpdCBTUEFSQ3Y5IHRhcmdldHMgaXMgc3dpdGNoZWQgZnJvbSBibig2NCw2NCkgdG8KICAgICBibig2NCwzMikuIEJlY2F1c2Ugb2YgaW5zdHJ1Y3Rpb24gc2V0IGxpbWl0YXRpb25zIGl0IGRvZXNuJ3QgaGF2ZQogICAgIGFueSBuZWdhdGl2ZSBpbXBhY3Qgb24gcGVyZm9ybWFuY2UuIFRoaXMgd2FzIGRvbmUgbW9zdGx5IGluIG9yZGVyCiAgICAgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBzaGFyZSBhc3NlbWJsZXIgbW9kdWxlcywgc3VjaCBhcyBibl9tdWxfbW9udAogICAgIGltcGxlbWVudGF0aW9ucywgYmV0d2VlbiAzMi0gYW5kIDY0LWJpdCBidWlsZHMgd2l0aG91dCBoYXNzbGUuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE1vdmUgY29kZSBwcmV2aW91c2x5IGV4aWxlZCBpbnRvIGZpbGUgY3J5cHRvL2VjL2VjMl9zbXB0LmMKICAgICB0byBlYzJfc21wbC5jLCBhbmQgbm8gbG9uZ2VyIHJlcXVpcmUgdGhlIE9QRU5TU0xfRUNfQklOX1BUX0NPTVAKICAgICBtYWNyby4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgY2FuZGlkYXRlIGZvciBCSUdOVU0gYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLCBibl9tdWxfbW9udCwKICAgICBkZWRpY2F0ZWQgTW9udGdvbWVyeSBtdWx0aXBsaWNhdGlvbiBwcm9jZWR1cmUsIGlzIGludHJvZHVjZWQuCiAgICAgQk5fTU9OVF9DVFggaXMgbW9kaWZpZWQgdG8gYWxsb3cgYm5fbXVsX21vbnQgdG8gcmVhY2ggZm9yIGhpZ2hlcgogICAgICI2NC1iaXQiIHBlcmZvcm1hbmNlIG9uIGNlcnRhaW4gMzItYml0IHRhcmdldHMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE5ldyBvcHRpb24gU1NMX09QX05PX0NPTVAgdG8gZGlzYWJsZSB1c2Ugb2YgY29tcHJlc3Npb24gc2VsZWN0aXZlbHkKICAgICBpbiBTU0wgc3RydWN0dXJlcy4gTmV3IFNTTCBjdHJsIHRvIHNldCBtYXhpbXVtIHNlbmQgZnJhZ21lbnQgc2l6ZS4gCiAgICAgU2F2ZSBtZW1vcnkgYnkgc2VldGluZyB0aGUgSS9PIGJ1ZmZlciBzaXplcyBkeW5hbWljYWxseSBpbnN0ZWFkIG9mCiAgICAgdXNpbmcgdGhlIG1heGltdW0gYXZhaWxhYmxlIHZhbHVlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb24gLVYgZm9yICdvcGVuc3NsIGNpcGhlcnMnLiBUaGlzIHByaW50cyB0aGUgY2lwaGVyc3VpdGUgY29kZQogICAgIGluIGFkZGl0aW9uIHRvIHRoZSB0ZXh0IGRldGFpbHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVmVyeSwgdmVyeSBwcmVsaW1pbmFyeSBFWFBFUklNRU5UQUwgc3VwcG9ydCBmb3IgcHJpbnRpbmcgb2YgZ2VuZXJhbAogICAgIEFTTjEgc3RydWN0dXJlcy4gVGhpcyBjdXJyZW50bHkgcHJvZHVjZXMgcmF0aGVyIHVnbHkgb3V0cHV0IGFuZCBkb2Vzbid0CiAgICAgaGFuZGxlIHNldmVyYWwgY3VzdG9taXNlZCBzdHJ1Y3R1cmVzIGF0IGFsbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbnRlZ3JhdGVkIHN1cHBvcnQgZm9yIFBWSyBmaWxlIGZvcm1hdCBhbmQgc29tZSByZWxhdGVkIGZvcm1hdHMgc3VjaAogICAgIGFzIE1TIFBVQkxJQ0tFWUJMT0IgYW5kIFBSSVZBVEVLRVlCTE9CLiBDb21tYW5kIGxpbmUgc3dpdGNoZXMgdG8gc3VwcG9ydAogICAgIHRoZXNlIGluIHRoZSAncnNhJyBhbmQgJ2RzYScgdXRpbGl0aWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIFBLQ1MjMSBSU0FQdWJsaWNLZXkgZm9ybWF0IG9uIHJzYSB1dGlsaXR5IGNvbW1hbmQgbGluZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgdGhlIGFuY2llbnQgQVNOMV9NRVRIT0QgY29kZS4gVGhpcyB3YXMgb25seSBldmVyIHVzZWQgaW4gb25lCiAgICAgcGxhY2UgZm9yIHRoZSAodmVyeSBvbGQpICJORVRTQ0FQRSIgZm9ybWF0IGNlcnRpZmljYXRlcyB3aGljaCBhcmUgbm93CiAgICAgaGFuZGxlZCB1c2luZyBuZXcgQVNOMSBjb2RlIGVxdWl2YWxlbnRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIExldCB0aGUgVExTdjFfbWV0aG9kKCkgZXRjLiBmdW5jdGlvbnMgcmV0dXJuIGEgJ2NvbnN0JyBTU0xfTUVUSE9ECiAgICAgcG9pbnRlciBhbmQgbWFrZSB0aGUgU1NMX01FVEhPRCBwYXJhbWV0ZXIgaW4gU1NMX0NUWF9uZXcsCiAgICAgU1NMX0NUWF9zZXRfc3NsX3ZlcnNpb24gYW5kIFNTTF9zZXRfc3NsX21ldGhvZCAnY29uc3QnLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgTW9kaWZ5IENSTCBkaXN0cmlidXRpb24gcG9pbnRzIGV4dGVuc2lvbiBjb2RlIHRvIHByaW50IG91dCBwcmV2aW91c2x5CiAgICAgdW5zdXBwb3J0ZWQgZmllbGRzLiBFbmhhbmNlIGV4dGVuc2lvbiBzZXR0aW5nIGNvZGUgdG8gYWxsb3cgc2V0dGluZyBvZgogICAgIGFsbCBmaWVsZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHByaW50IGFuZCBzZXQgc3VwcG9ydCBmb3IgSXNzdWluZyBEaXN0cmlidXRpb24gUG9pbnQgQ1JMIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgJ0NvbmZpZ3VyZScgc2NyaXB0IHRvIGVuYWJsZSBDYW1lbGxpYSBieSBkZWZhdWx0LgogICAgIFtOVFRdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44bSBhbmQgMC45LjhuIFsyNCBNYXIgMjAxMF0KCiAgKikgV2hlbiByZWplY3RpbmcgU1NML1RMUyByZWNvcmRzIGR1ZSB0byBhbiBpbmNvcnJlY3QgdmVyc2lvbiBudW1iZXIsIG5ldmVyCiAgICAgdXBkYXRlIHMtPnNlcnZlciB3aXRoIGEgbmV3IG1ham9yIHZlcnNpb24gbnVtYmVyLiAgQXMgb2YKICAgICAtIE9wZW5TU0wgMC45LjhtIGlmICdzaG9ydCcgaXMgYSAxNi1iaXQgdHlwZSwKICAgICAtIE9wZW5TU0wgMC45LjhmIGlmICdzaG9ydCcgaXMgbG9uZ2VyIHRoYW4gMTYgYml0cywKICAgICB0aGUgcHJldmlvdXMgYmVoYXZpb3IgY291bGQgcmVzdWx0IGluIGEgcmVhZCBhdHRlbXB0IGF0IE5VTEwgd2hlbgogICAgIHJlY2VpdmluZyBzcGVjaWZpYyBpbmNvcnJlY3QgU1NML1RMUyByZWNvcmRzIG9uY2UgcmVjb3JkIHBheWxvYWQKICAgICBwcm90ZWN0aW9uIGlzIGFjdGl2ZS4gIChDVkUtMjAxMC0wNzQwKQogICAgIFtCb2RvIE1vZWxsZXIsIEFkYW0gTGFuZ2xleSA8YWdsQGNocm9taXVtLm9yZz5dCgogICopIEZpeCBmb3IgQ1ZFLTIwMTAtMDQzMyB3aGVyZSBzb21lIGtlcmJlcm9zIGVuYWJsZWQgdmVyc2lvbnMgb2YgT3BlblNTTCAKICAgICBjb3VsZCBiZSBjcmFzaGVkIGlmIHRoZSByZWxldmFudCB0YWJsZXMgd2VyZSBub3QgcHJlc2VudCAoZS5nLiBjaHJvb3RlZCkuCiAgICAgW1RvbWFzIEhvZ2VyIDx0aG9nZXJAcmVkaGF0LmNvbT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44bCBhbmQgMC45LjhtIFsyNSBGZWIgMjAxMF0KCiAgKikgQWx3YXlzIGNoZWNrIGJuX3dleHBlbmQoKSByZXR1cm4gdmFsdWVzIGZvciBmYWlsdXJlLiAgKENWRS0yMDA5LTMyNDUpCiAgICAgW01hcnRpbiBPbHNzb24sIE5lZWwgTWVodGFdCgogICopIEZpeCBYNTA5X1NUT1JFIGxvY2tpbmc6IEV2ZXJ5ICdvYmpzJyBhY2Nlc3MgcmVxdWlyZXMgYSBsb2NrICh0bwogICAgIGFjY29tbW9kYXRlIGZvciBzdGFjayBzb3J0aW5nLCBhbHdheXMgYSB3cml0ZSBsb2NrISkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgT24gc29tZSB2ZXJzaW9ucyBvZiBXSU4zMiBIZWFwMzJOZXh0IGlzIHZlcnkgc2xvdy4gVGhpcyBjYW4gY2F1c2UKICAgICBleGNlc3NpdmUgZGVsYXlzIGluIHRoZSBSQU5EX3BvbGwoKTogb3ZlciBhIG1pbnV0ZS4gQXMgYSB3b3JrYXJvdW5kCiAgICAgaW5jbHVkZSBhIHRpbWUgY2hlY2sgaW4gdGhlIGlubmVyIEhlYXAzMk5leHQgbG9vcCB0b28uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVGhlIGNvZGUgdGhhdCBoYW5kbGVkIGZsdXNoaW5nIG9mIGRhdGEgaW4gU1NML1RMUyBvcmlnaW5hbGx5IHVzZWQgdGhlCiAgICAgQklPX0NUUkxfSU5GTyBjdHJsIHRvIHNlZSBpZiBhbnkgZGF0YSB3YXMgcGVuZGluZyBmaXJzdC4gVGhpcyBjYXVzZWQKICAgICB0aGUgcHJvYmxlbSBvdXRsaW5lZCBpbiBQUiMxOTQ5LiBUaGUgZml4IHN1Z2dlc3RlZCB0aGVyZSBob3dldmVyIGNhbgogICAgIHRyaWdnZXIgcHJvYmxlbXMgd2l0aCBidWdneSBCSU9fQ1RSTF9XUEVORElORyAoZS5nLiBzb21lIHZlcnNpb25zCiAgICAgb2YgQXBhY2hlKS4gU28gaW5zdGVhZCBzaW1wbGlmeSB0aGUgY29kZSB0byBmbHVzaCB1bmNvbmRpdGlvbmFsbHkuCiAgICAgVGhpcyBzaG91bGQgYmUgZmluZSBzaW5jZSBmbHVzaGluZyB3aXRoIG5vIGRhdGEgdG8gZmx1c2ggaXMgYSBubyBvcC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIYW5kbGUgVExTIHZlcnNpb25zIDIuMCBhbmQgbGF0ZXIgcHJvcGVybHkgYW5kIGNvcnJlY3RseSB1c2UgdGhlCiAgICAgaGlnaGVzdCB2ZXJzaW9uIG9mIFRMUy9TU0wgc3VwcG9ydGVkLiBBbHRob3VnaCBUTFMgPj0gMi4wIGlzIHNvbWUgd2F5CiAgICAgb2ZmIGFuY2llbnQgc2VydmVycyBoYXZlIGEgaGFiaXQgb2Ygc3RpY2tpbmcgYXJvdW5kIGZvciBhIHdoaWxlLi4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGNvbXByZXNzaW9uIGNvZGUgc28gaXQgZnJlZXMgdXAgc3RydWN0dXJlcyB3aXRob3V0IHVzaW5nIHRoZQogICAgIGV4X2RhdGEgY2FsbGJhY2tzLiBUaGlzIHdvcmtzIGFyb3VuZCBhIHByb2JsZW0gd2hlcmUgc29tZSBhcHBsaWNhdGlvbnMKICAgICBjYWxsIENSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCkgYmVmb3JlIGFwcGxpY2F0aW9uIGV4aXQgKGUuZy4gd2hlbgogICAgIHJlc3RhcnRpbmcpIHRoZW4gdXNlIGNvbXByZXNzaW9uIChlLmcuIFNTTCB3aXRoIGNvbXByZXNzaW9uKSBsYXRlci4KICAgICBUaGlzIHJlc3VsdHMgaW4gc2lnbmlmaWNhbnQgcGVyLWNvbm5lY3Rpb24gbWVtb3J5IGxlYWtzIGFuZAogICAgIGhhcyBjYXVzZWQgc29tZSBzZWN1cml0eSBpc3N1ZXMgaW5jbHVkaW5nIENWRS0yMDA4LTE2NzggYW5kCiAgICAgQ1ZFLTIwMDktNDM1NS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb25zdGlmeSBjcnlwdG8vY2FzdCAoaS5lLiwgPG9wZW5zc2wvY2FzdC5oPik6IGEgQ0FTVF9LRVkgZG9lc24ndAogICAgIGNoYW5nZSB3aGVuIGVuY3J5cHRpbmcgb3IgZGVjcnlwdGluZy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgb3B0aW9uIFNTTF9PUF9MRUdBQ1lfU0VSVkVSX0NPTk5FQ1Qgd2hpY2ggd2lsbCBhbGxvdyBjbGllbnRzIHRvCiAgICAgY29ubmVjdCBhbmQgcmVuZWdvdGlhdGUgd2l0aCBzZXJ2ZXJzIHdoaWNoIGRvIG5vdCBzdXBwb3J0IFJJLgogICAgIFVudGlsIFJJIGlzIG1vcmUgd2lkZWx5IGRlcGxveWVkIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgIm1pc3NpbmciIHNzbCBjdHJscyB0byBjbGVhciBvcHRpb25zIGFuZCBtb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIElmIGNsaWVudCBhdHRlbXB0cyB0byByZW5lZ290aWF0ZSBhbmQgZG9lc24ndCBzdXBwb3J0IFJJIHJlc3BvbmQgd2l0aAogICAgIGEgbm9fcmVuZWdvdGlhdGlvbiBhbGVydCBhcyByZXF1aXJlZCBieSBSRkM1NzQ2LiAgU29tZSByZW5lZ290aWF0aW5nCiAgICAgVExTIGNsaWVudHMgd2lsbCBjb250aW51ZSBhIGNvbm5lY3Rpb24gZ3JhY2VmdWxseSB3aGVuIHRoZXkgcmVjZWl2ZQogICAgIHRoZSBhbGVydC4gVW5mb3J0dW5hdGVseSBPcGVuU1NMIG1pc2hhbmRsZWQgdGhpcyBhbGVydCBhbmQgd291bGQgaGFuZwogICAgIHdhaXRpbmcgZm9yIGEgc2VydmVyIGhlbGxvIHdoaWNoIGl0IHdpbGwgbmV2ZXIgcmVjZWl2ZS4gTm93IHdlIHRyZWF0IGEKICAgICByZWNlaXZlZCBub19yZW5lZ290aWF0aW9uIGFsZXJ0IGFzIGEgZmF0YWwgZXJyb3IuIFRoaXMgaXMgYmVjYXVzZQogICAgIGFwcGxpY2F0aW9ucyByZXF1ZXN0aW5nIGEgcmVuZWdvdGlhdGlvbiBtaWdodCB3ZWxsIGV4cGVjdCBpdCB0byBzdWNjZWVkCiAgICAgYW5kIHdvdWxkIGhhdmUgbm8gY29kZSBpbiBwbGFjZSB0byBoYW5kbGUgdGhlIHNlcnZlciBkZW55aW5nIGl0IHNvIHRoZQogICAgIG9ubHkgc2FmZSB0aGluZyB0byBkbyBpcyB0byB0ZXJtaW5hdGUgdGhlIGNvbm5lY3Rpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGN0cmwgbWFjcm8gU1NMX2dldF9zZWN1cmVfcmVuZWdvdGlhdGlvbl9zdXBwb3J0KCkgd2hpY2ggcmV0dXJucyAxIGlmCiAgICAgcGVlciBzdXBwb3J0cyBzZWN1cmUgcmVuZWdvdGlhdGlvbiBhbmQgMCBvdGhlcndpc2UuIFByaW50IG91dCBwZWVyCiAgICAgcmVuZWdvdGlhdGlvbiBzdXBwb3J0IGluIHNfY2xpZW50L3Nfc2VydmVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlcGxhY2UgdGhlIGhpZ2hseSBicm9rZW4gYW5kIGRlcHJlY2F0ZWQgU1BLQUMgY2VydGlmaWNhdGlvbiBtZXRob2Qgd2l0aAogICAgIHRoZSB1cGRhdGVkIE5JRCBjcmVhdGlvbiB2ZXJzaW9uLiBUaGlzIHNob3VsZCBjb3JyZWN0bHkgaGFuZGxlIFVURjguCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IFJGQzU3NDYuIFJlLWVuYWJsZSByZW5lZ290aWF0aW9uIGJ1dCByZXF1aXJlIHRoZSBleHRlbnNpb24KICAgICBhcyBuZWVkZWQuIFVuZm9ydHVuYXRlbHksIFNTTDNfRkxBR1NfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OCiAgICAgdHVybnMgb3V0IHRvIGJlIGEgYmFkIGlkZWEuIEl0IGhhcyBiZWVuIHJlcGxhY2VkIGJ5CiAgICAgU1NMX09QX0FMTE9XX1VOU0FGRV9MRUdBQ1lfUkVORUdPVElBVElPTiB3aGljaCBjYW4gYmUgc2V0IHdpdGgKICAgICBTU0xfQ1RYX3NldF9vcHRpb25zKCkuIFRoaXMgaXMgcmVhbGx5IG5vdCByZWNvbW1lbmRlZCB1bmxlc3MgeW91CiAgICAga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCiAgICAgW0VyaWMgUmVzY29ybGEgPGVrckBuZXR3b3JrcmVzb25hbmNlLmNvbT4sIEJlbiBMYXVyaWUsIFN0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gc3RhdGVsZXNzIHNlc3Npb24gcmVzdW1wdGlvbiBoYW5kbGluZy4gVXNlIGluaXRpYWxfY3R4IHdoZW4KICAgICBpc3N1aW5nIGFuZCBhdHRlbXB0aW5nIHRvIGRlY3J5cHQgdGlja2V0cyBpbiBjYXNlIGl0IGhhcyBjaGFuZ2VkIGR1cmluZwogICAgIHNlcnZlcm5hbWUgaGFuZGxpbmcuIFVzZSBhIG5vbi16ZXJvIGxlbmd0aCBzZXNzaW9uIElEIHdoZW4gYXR0ZW1wdGluZwogICAgIHN0YXRlbGVzcyBzZXNzaW9uIHJlc3VtcHRpb246IHRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gZGV0ZXJtaW5lIGlmCiAgICAgYSByZXN1bXB0aW9uIGhhcyBvY2N1cnJlZCBpbW1lZGlhdGVseSBhZnRlciByZWNlaXZpbmcgc2VydmVyIGhlbGxvCiAgICAgKHNldmVyYWwgcGxhY2VzIGluIE9wZW5TU0wgc3VidGx5IGFzc3VtZSB0aGlzKSBpbnN0ZWFkIG9mIGxhdGVyIGluCiAgICAgdGhlIGhhbmRzaGFrZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUaGUgZnVuY3Rpb25zIEVOR0lORV9jdHJsKCksIE9QRU5TU0xfaXNzZXJ2aWNlKCksCiAgICAgQ01TX2dldDFfUmVjaXBpZW50UmVxdWVzdCgpIGFuZCBSQU5EX2J5dGVzKCkgY2FuIHJldHVybiA8PTAgb24gZXJyb3IKICAgICBmaXhlcyBmb3IgYSBmZXcgcGxhY2VzIHdoZXJlIHRoZSByZXR1cm4gY29kZSBpcyBub3QgY2hlY2tlZAogICAgIGNvcnJlY3RseS4KICAgICBbSnVsaWEgTGF3YWxsIDxqdWxpYUBkaWt1LmRrPl0KCiAgKikgQWRkIC0tc3RyaWN0LXdhcm5pbmdzIG9wdGlvbiB0byBDb25maWd1cmUgc2NyaXB0IHRvIGluY2x1ZGUgZGV2dGVhbQogICAgIHdhcm5pbmdzIGluIG90aGVyIGNvbmZpZ3VyYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciAtLWxpYmRpciBvcHRpb24gYW5kIExJQkRJUiB2YXJpYWJsZSBpbiBtYWtlZmlsZXMuIFRoaXMKICAgICBtYWtlcyBpdCBwb3NzaWJsZSB0byBpbnN0YWxsIG9wZW5zc2wgbGlicmFyaWVzIGluIGxvY2F0aW9ucyB3aGljaAogICAgIGhhdmUgbmFtZXMgb3RoZXIgdGhhbiAibGliIiwgZm9yIGV4YW1wbGUgIi91c3IvbGliNjQiIHdoaWNoIHNvbWUKICAgICBzeXN0ZW1zIG5lZWQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgYmFzZWQgb24gcGF0Y2ggZnJvbSBKZXJlbXkgVXRsZXldCgogICopIERvbid0IGFsbG93IHRoZSB1c2Ugb2YgbGVhZGluZyAweDgwIGluIE9JRHMuIFRoaXMgaXMgYSB2aW9sYXRpb24gb2YKICAgICBYNjkwIDguOS4xMiBhbmQgY2FuIHByb2R1Y2Ugc29tZSBtaXNsZWFkaW5nIHRleHR1YWwgb3V0cHV0IG9mIE9JRHMuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgRGFuIEthbWluc2t5XQoKICAqKSBEZWxldGUgTUQyIGZyb20gYWxnb3JpdGhtIHRhYmxlcy4gVGhpcyBmb2xsb3dzIHRoZSByZWNvbW1lbmRhdGlvbiBpbgogICAgIHNldmVyYWwgc3RhbmRhcmRzIHRoYXQgaXQgaXMgbm90IHVzZWQgaW4gbmV3IGFwcGxpY2F0aW9ucyBkdWUgdG8KICAgICBzZXZlcmFsIGNyeXB0b2dyYXBoaWMgd2Vha25lc3Nlcy4gRm9yIGJpbmFyeSBjb21wYXRpYmlsaXR5IHJlYXNvbnMKICAgICB0aGUgTUQyIEFQSSBpcyBzdGlsbCBjb21waWxlZCBpbiBieSBkZWZhdWx0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjb21wcmVzc2lvbiBpZCB0byB7ZDJpLGkyZH1fU1NMX1NFU1NJT04gc28gaXQgaXMgY29ycmVjdGx5IHNhdmVkCiAgICAgYW5kIHJlc3RvcmVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbmFtZSB1bmkyYXNjIGFuZCBhc2MydW5pIGZ1bmN0aW9ucyB0byBPUEVOU1NMX3VuaTJhc2MgYW5kCiAgICAgT1BFTlNTTF9hc2MydW5pIGNvbmRpdGlvbmFsbHkgb24gTmV0d2FyZSBwbGF0Zm9ybXMgdG8gYXZvaWQgYSBuYW1lCiAgICAgY2xhc2guCiAgICAgW0d1ZW50ZXIgPGxpc3RzQGdrbncubmV0Pl0KCiAgKikgRml4IHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgY2hhaW4gYnVpbGRpbmcgY29kZSB0byB1c2UgWDUwOV92ZXJpZnlfY2VydCgpLAogICAgIGl0IHVzZWQgdG8gaGF2ZSBhbiBhZC1ob2MgYnVpbGRlciB3aGljaCB3YXMgdW5hYmxlIHRvIGNvcGUgd2l0aCBhbnl0aGluZwogICAgIG90aGVyIHRoYW4gYSBzaW1wbGUgY2hhaW4uCiAgICAgW0RhdmlkIFdvb2Rob3VzZSA8ZHdtdzJAaW5mcmFkZWFkLm9yZz4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgRG9uJ3QgY2hlY2sgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgc2lnbmF0dXJlcyBpbiBYNTA5X3ZlcmlmeV9jZXJ0KCkKICAgICBieSBkZWZhdWx0IChhIGZsYWcgY2FuIG92ZXJyaWRlIHRoaXMpOiBpdCBqdXN0IHdhc3RlcyB0aW1lIHdpdGhvdXQKICAgICBhZGRpbmcgYW55IHNlY3VyaXR5LiBBcyBhIHVzZWZ1bCBzaWRlIGVmZmVjdCBzZWxmIHNpZ25lZCByb290IENBcwogICAgIHdpdGggbm9uLUZJUFMgZGlnZXN0cyBhcmUgbm93IHVzYWJsZSBpbiBGSVBTIG1vZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gZHRsczFfcHJvY2Vzc19vdXRfb2Zfc2VxX21lc3NhZ2UoKSB0aGUgY2hlY2sgaWYgdGhlIGN1cnJlbnQgbWVzc2FnZQogICAgIGlzIGFscmVhZHkgYnVmZmVyZWQgd2FzIG1pc3NpbmcuIEZvciBldmVyeSBuZXcgbWVzc2FnZSB3YXMgbWVtb3J5CiAgICAgYWxsb2NhdGVkLCBhbGxvd2luZyBhbiBhdHRhY2tlciB0byBwZXJmb3JtIGFuIGRlbmlhbCBvZiBzZXJ2aWNlIGF0dGFjawogICAgIHdpdGggc2VuZGluZyBvdXQgb2Ygc2VxIGhhbmRzaGFrZSBtZXNzYWdlcyB1bnRpbCB0aGVyZSBpcyBubyBtZW1vcnkKICAgICBsZWZ0LiBBZGRpdGlvbmFsbHkgZXZlcnkgZnV0dXJlIG1lc3NlZ2Ugd2FzIGJ1ZmZlcmVkLCBldmVuIGlmIHRoZQogICAgIHNlcXVlbmNlIG51bWJlciBtYWRlIG5vIHNlbnNlIGFuZCB3b3VsZCBiZSBwYXJ0IG9mIGFub3RoZXIgaGFuZHNoYWtlLgogICAgIFNvIG9ubHkgbWVzc2FnZXMgd2l0aCBzZXF1ZW5jZSBudW1iZXJzIGxlc3MgdGhhbiAxMCBpbiBhZHZhbmNlIHdpbGwgYmUKICAgICBidWZmZXJlZC4gIChDVkUtMjAwOS0xMzc4KQogICAgIFtSb2JpbiBTZWdnZWxtYW5uLCBkaXNjb3ZlcmVkIGJ5IERhbmllbCBNZW50el0gCQoKICAqKSBSZWNvcmRzIGFyZSBidWZmZXJlZCBpZiB0aGV5IGFycml2ZSB3aXRoIGEgZnV0dXJlIGVwb2NoIHRvIGJlCiAgICAgcHJvY2Vzc2VkIGFmdGVyIGZpbmlzaGluZyB0aGUgY29ycmVzcG9uZGluZyBoYW5kc2hha2UuIFRoZXJlIGlzCiAgICAgY3VycmVudGx5IG5vIGxpbWl0YXRpb24gdG8gdGhpcyBidWZmZXIgYWxsb3dpbmcgYW4gYXR0YWNrZXIgdG8gcGVyZm9ybQogICAgIGEgRE9TIGF0dGFjayB3aXRoIHNlbmRpbmcgcmVjb3JkcyB3aXRoIGZ1dHVyZSBlcG9jaHMgdW50aWwgdGhlcmUgaXMgbm8KICAgICBtZW1vcnkgbGVmdC4gVGhpcyBwYXRjaCBhZGRzIHRoZSBwcXVldWVfc2l6ZSgpIGZ1bmN0aW9uIHRvIGRldGVybWluZQogICAgIHRoZSBzaXplIG9mIGEgYnVmZmVyIGFuZCBsaW1pdHMgdGhlIHJlY29yZCBidWZmZXIgdG8gMTAwIGVudHJpZXMuCiAgICAgKENWRS0yMDA5LTEzNzcpCiAgICAgW1JvYmluIFNlZ2dlbG1hbm4sIGRpc2NvdmVyZWQgYnkgRGFuaWVsIE1lbnR6XSAJCgogICopIEtlZXAgYSBjb3B5IG9mIGZyYWctPm1zZ19oZWFkZXIuZnJhZ19sZW4gc28gaXQgY2FuIGJlIHVzZWQgYWZ0ZXIgdGhlCiAgICAgcGFyZW50IHN0cnVjdHVyZSBpcyBmcmVlZC4gIChDVkUtMjAwOS0xMzc5KQogICAgIFtEYW5pZWwgTWVudHpdIAkKCiAgKikgSGFuZGxlIG5vbi1ibG9ja2luZyBJL08gcHJvcGVybHkgaW4gU1NMX3NodXRkb3duKCkgY2FsbC4KICAgICBbRGFycnlsIE1pbGVzIDxkYXJyeWwtbWFpbGluZ2xpc3RzQG5ldGJhdWRzLm5ldD5dCgogICopIEFkZCAyLjUuNC4qIE9JRHMKICAgICBbSWx5YSBPLiA8dnJnaG9zdEBnbWFpbC5jb20+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGsgYW5kIDAuOS44bCAgWzUgTm92IDIwMDldCgogICopIERpc2FibGUgcmVuZWdvdGlhdGlvbiBjb21wbGV0ZWx5IC0gdGhpcyBmaXhlcyBhIHNldmVyZSBzZWN1cml0eQogICAgIHByb2JsZW0gKENWRS0yMDA5LTM1NTUpIGF0IHRoZSBjb3N0IG9mIGJyZWFraW5nIGFsbAogICAgIHJlbmVnb3RpYXRpb24uIFJlbmVnb3RpYXRpb24gY2FuIGJlIHJlLWVuYWJsZWQgYnkgc2V0dGluZwogICAgIFNTTDNfRkxBR1NfQUxMT1dfVU5TQUZFX0xFR0FDWV9SRU5FR09USUFUSU9OIGluIHMzLT5mbGFncyBhdAogICAgIHJ1bi10aW1lLiBUaGlzIGlzIHJlYWxseSBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdSBrbm93IHdoYXQKICAgICB5b3UncmUgZG9pbmcuCiAgICAgW0JlbiBMYXVyaWVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44aiBhbmQgMC45LjhrICBbMjUgTWFyIDIwMDldCgogICopIERvbid0IHNldCB2YWwgdG8gTlVMTCB3aGVuIGZyZWVpbmcgdXAgc3RydWN0dXJlcywgaXQgaXMgZnJlZWQgdXAgYnkKICAgICB1bmRlcmx5aW5nIGNvZGUuIElmIHNpemVvZih2b2lkICopID4gc2l6ZW9mKGxvbmcpIHRoaXMgY2FuIHJlc3VsdCBpbgogICAgIHplcm9pbmcgcGFzdCB0aGUgdmFsaWQgZmllbGQuIChDVkUtMjAwOS0wNzg5KQogICAgIFtQYW9sbyBHYW5jaSA8UGFvbG8uR2FuY2lAQWROb3Z1bS5DSD5dCgogICopIEZpeCBidWcgd2hlcmUgcmV0dXJuIHZhbHVlIG9mIENNU19TaWduZXJJbmZvX3ZlcmlmeV9jb250ZW50KCkgd2FzIG5vdAogICAgIGNoZWNrZWQgY29ycmVjdGx5LiBUaGlzIHdvdWxkIGFsbG93IHNvbWUgaW52YWxpZCBzaWduZWQgYXR0cmlidXRlcyB0bwogICAgIGFwcGVhciB0byB2ZXJpZnkgY29ycmVjdGx5LiAoQ1ZFLTIwMDktMDU5MSkKICAgICBbSXZhbiBOZXN0bGVyb2RlIDxpbmVzdGxlcm9kZUB1cy5pYm0uY29tPl0KCiAgKikgUmVqZWN0IFVuaXZlcnNhbFN0cmluZyBhbmQgQk1QU3RyaW5nIHR5cGVzIHdpdGggaW52YWxpZCBsZW5ndGhzLiBUaGlzCiAgICAgcHJldmVudHMgYSBjcmFzaCBpbiBBU04xX1NUUklOR19wcmludF9leCgpIHdoaWNoIGFzc3VtZXMgdGhlIHN0cmluZ3MgaGF2ZQogICAgIGEgbGVnYWwgbGVuZ3RoLiAoQ1ZFLTIwMDktMDU5MCkKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTZXQgUy9NSU1FIHNpZ25pbmcgYXMgdGhlIGRlZmF1bHQgcHVycG9zZSByYXRoZXIgdGhhbiBzZXR0aW5nIGl0IAogICAgIHVuY29uZGl0aW9uYWxseS4gVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIHRvIG92ZXJyaWRlIGl0IGF0IHRoZSBzdG9yZQogICAgIGxldmVsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBlcm1pdCByZXN0cmljdGVkIHJlY3Vyc2lvbiBvZiBBU04xIHN0cmluZ3MuIFRoaXMgaXMgbmVlZGVkIGluIHByYWN0aWNlCiAgICAgdG8gaGFuZGxlIHNvbWUgc3RydWN0dXJlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbXByb3ZlIGVmZmljaWVuY3kgb2YgbWVtX2dldHM6IGRvbid0IHNlYXJjaCB3aG9sZSBidWZmZXIgZWFjaCB0aW1lCiAgICAgZm9yIGEgJ1xuJwogICAgIFtKZXJlbXkgU2hhcGlybyA8am5zaGFwaXJAdXMuaWJtLmNvbT5dCgogICopIE5ldyAtaGV4IG9wdGlvbiBmb3Igb3BlbnNzbCByYW5kLgogICAgIFtNYXR0aGlldSBIZXJyYl0KCiAgKikgUHJpbnQgb3V0IFVURjhTdHJpbmcgYW5kIE51bWVyaWNTdHJpbmcgd2hlbiBwYXJzaW5nIEFTTjEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBOdW1lcmljU3RyaW5nIHR5cGUgZm9yIG5hbWUgY29tcG9uZW50cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBDQyBpbiB0aGUgZW52aXJvbm1lbnQgdG8gb3ZlcnJpZGUgdGhlIGF1dG9tYXRpY2FsbHkgY2hvc2VuCiAgICAgY29tcGlsZXIuIE5vdGUgdGhhdCBub3RoaW5nIGlzIGRvbmUgdG8gZW5zdXJlIGZsYWdzIHdvcmsgd2l0aCB0aGUKICAgICBjaG9zZW4gY29tcGlsZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44aSBhbmQgMC45LjhqICBbMDcgSmFuIDIwMDldCgogICopIFByb3Blcmx5IGNoZWNrIEVWUF9WZXJpZnlGaW5hbCgpIGFuZCBzaW1pbGFyIHJldHVybiB2YWx1ZXMKICAgICAoQ1ZFLTIwMDgtNTA3NykuCiAgICAgW0JlbiBMYXVyaWUsIEJvZG8gTW9lbGxlciwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIEVuYWJsZSBUTFMgZXh0ZW5zaW9ucyBieSBkZWZhdWx0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBbGxvdyB0aGUgQ0hJTCBlbmdpbmUgdG8gYmUgbG9hZGVkLCB3aGV0aGVyIHRoZSBhcHBsaWNhdGlvbiBpcwogICAgIG11bHRpdGhyZWFkZWQgb3Igbm90LiAoVGhpcyBkb2VzIG5vdCByZWxlYXNlIHRoZSBkZXZlbG9wZXIgZnJvbSB0aGUKICAgICBvYmxpZ2F0aW9uIHRvIHNldCB1cCB0aGUgZHluYW1pYyBsb2NraW5nIGNhbGxiYWNrcy4pCiAgICAgW1NhbmRlciBUZW1tZSA8c2FuZGVyQHRlbW1lLm5ldD5dCgogICopIFVzZSBjb3JyZWN0IGV4aXQgY29kZSBpZiB0aGVyZSBpcyBhbiBlcnJvciBpbiBkZ3N0IGNvbW1hbmQuCiAgICAgW1N0ZXZlIEhlbnNvbjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBSb2xhbmQgRGlybGV3YW5nZXJdCgogICopIFR3ZWFrIENvbmZpZ3VyZSBzbyB0aGF0IHlvdSBuZWVkIHRvIHNheSAiZXhwZXJpbWVudGFsLWpwYWtlIiB0byBlbmFibGUKICAgICBKUEFLRSwgYW5kIG5lZWQgdG8gdXNlIC1ET1BFTlNTTF9FWFBFUklNRU5UQUxfSlBBS0UgaW4gYXBwbGljYXRpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBleHBlcmltZW50YWwgSlBBS0Ugc3VwcG9ydCwgaW5jbHVkaW5nIGRlbW8gYXV0aGVudGljYXRpb24gaW4KICAgICBzX2NsaWVudCBhbmQgc19zZXJ2ZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFNldCB0aGUgY29tcGFyaXNvbiBmdW5jdGlvbiBpbiB2M19hZGRyX2Nhbm9uaXplKCkuCiAgICAgW1JvYiBBdXN0ZWluIDxzcmFAaGFjdHJuLm5ldD5dCgogICopIEFkZCBzdXBwb3J0IGZvciBYTVBQIFNUQVJUVExTIGluIHNfY2xpZW50LgogICAgIFtQaGlsaXAgUGFlcHMgPHBoaWxpcEBmcmVlYnNkLm9yZz5dCgogICopIENoYW5nZSB0aGUgc2VydmVyLXNpZGUgU1NMX09QX05FVFNDQVBFX1JFVVNFX0NJUEhFUl9DSEFOR0VfQlVHIGJlaGF2aW9yCiAgICAgdG8gZW5zdXJlIHRoYXQgZXZlbiB3aXRoIHRoaXMgb3B0aW9uLCBvbmx5IGNpcGhlcnN1aXRlcyBpbiB0aGUKICAgICBzZXJ2ZXIncyBwcmVmZXJlbmNlIGxpc3Qgd2lsbCBiZSBhY2NlcHRlZC4gIChOb3RlIHRoYXQgdGhlIG9wdGlvbgogICAgIGFwcGxpZXMgb25seSB3aGVuIHJlc3VtaW5nIGEgc2Vzc2lvbiwgc28gdGhlIGVhcmxpZXIgYmVoYXZpb3Igd2FzCiAgICAganVzdCBhYm91dCB0aGUgYWxnb3JpdGhtIGNob2ljZSBmb3Igc3ltbWV0cmljIGNyeXB0b2dyYXBoeS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhoIGFuZCAwLjkuOGkgIFsxNSBTZXAgMjAwOF0KCiAgKikgRml4IE5VTEwgcG9pbnRlciBkZXJlZmVyZW5jZSBpZiBhIERUTFMgc2VydmVyIHJlY2VpdmVkCiAgICAgQ2hhbmdlQ2lwaGVyU3BlYyBhcyBmaXJzdCByZWNvcmQgKENWRS0yMDA5LTEzODYpLgogICAgIFtQUiAjMTY3OV0KCiAgKikgRml4IGEgc3RhdGUgdHJhbnNpdGlvbiBpbiBzM19zcnZyLmMgYW5kIGQxX3NydnIuYwogICAgICh3YXMgdXNpbmcgU1NMM19TVF9DV19DTE5UX0hFTExPX0IsIHNob3VsZCBiZSAuLi5fU1RfU1dfU1JWUl8uLi4pLgogICAgIFtOYWdlbmRyYSBNb2RhZHVndV0KCiAgKikgVGhlIGZpeCBpbiAwLjkuOGMgdGhhdCBzdXBwb3NlZGx5IGdvdCByaWQgb2YgdW5zYWZlCiAgICAgZG91YmxlLWNoZWNrZWQgbG9ja2luZyB3YXMgaW5jb21wbGV0ZSBmb3IgUlNBIGJsaW5kaW5nLAogICAgIGFkZHJlc3NpbmcganVzdCBvbmUgbGF5ZXIgb2Ygd2hhdCB0dXJucyBvdXQgdG8gaGF2ZSBiZWVuCiAgICAgZG91Ymx5IHVuc2FmZSB0cmlwbGUtY2hlY2tlZCBsb2NraW5nLgoKICAgICBTbyBub3cgZml4IHRoaXMgZm9yIHJlYWwgYnkgcmV0aXJpbmcgdGhlIE1PTlRfSEVMUEVSIG1hY3JvCiAgICAgaW4gY3J5cHRvL3JzYS9yc2FfZWF5LmMuCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTWFyaXVzIFNjaGlsZGVyXQoKICAqKSBWYXJpb3VzIHByZWNhdXRpb25hcnkgbWVhc3VyZXM6CgogICAgIC0gQXZvaWQgc2l6ZV90IGludGVnZXIgb3ZlcmZsb3cgaW4gSEFTSF9VUERBVEUgKG1kMzJfY29tbW9uLmgpLgoKICAgICAtIEF2b2lkIGEgYnVmZmVyIG92ZXJmbG93IGluIGQyaV9TU0xfU0VTU0lPTigpIChzc2xfYXNuMS5jKS4KICAgICAgIChOQjogVGhpcyB3b3VsZCByZXF1aXJlIGtub3dsZWRnZSBvZiB0aGUgc2VjcmV0IHNlc3Npb24gdGlja2V0IGtleQogICAgICAgdG8gZXhwbG9pdCwgaW4gd2hpY2ggY2FzZSB5b3UnZCBiZSBTT0wgZWl0aGVyIHdheS4pCgogICAgIC0gQ2hhbmdlIGJuX25pc3QuYyBzbyB0aGF0IGl0IHdpbGwgcHJvcGVybHkgaGFuZGxlIGlucHV0IEJJR05VTXMKICAgICAgIG91dHNpZGUgdGhlIGV4cGVjdGVkIHJhbmdlLgoKICAgICAtIEVuZm9yY2UgdGhlICdudW0nIGNoZWNrIGluIEJOX2RpdigpIChibl9kaXYuYykgZm9yIG5vbi1CTl9ERUJVRwogICAgICAgYnVpbGRzLgoKICAgICBbTmVlbCBNZWh0YSwgQm9kbyBNb2VsbGVyXQoKICAqKSBBbGxvdyBlbmdpbmVzIHRvIGJlICJzb2Z0IGxvYWRlZCIgLSBpLmUuIG9wdGlvbmFsbHkgZG9uJ3QgZGllIGlmCiAgICAgdGhlIGxvYWQgZmFpbHMuIFVzZWZ1bCBmb3IgZGlzdHJvcy4KICAgICBbQmVuIExhdXJpZSBhbmQgdGhlIEZyZWVCU0QgdGVhbV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIExvY2FsIE1hY2hpbmUgS2V5c2V0IGF0dHJpYnV0ZSBpbiBQS0NTIzEyIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBCTl9HRjJtX21vZF9hcnIoKSB0b3AtYml0IGNsZWFudXAgY29kZS4KICAgICBbSHVhbmcgWWluZ10KCiAgKikgRXhwYW5kIEVOR0lORSB0byBzdXBwb3J0IGVuZ2luZSBzdXBwbGllZCBTU0wgY2xpZW50IGNlcnRpZmljYXRlIGZ1bmN0aW9ucy4KCiAgICAgVGhpcyB3b3JrIHdhcyBzcG9uc29yZWQgYnkgTG9naWNhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBDcnlwdG9BUEkgRU5HSU5FIHRvIHN1cHBvcnQgdXNlIG9mIFJTQSBhbmQgRFNBIGtleXMgaGVsZCBpbiBXaW5kb3dzCiAgICAga2V5c3RvcmVzLiBTdXBwb3J0IGZvciBTU0wvVExTIGNsaWVudCBhdXRoZW50aWNhdGlvbiB0b28uCiAgICAgTm90IGNvbXBpbGVkIHVubGVzcyBlbmFibGUtY2FwaWVuZyBzcGVjaWZpZWQgdG8gQ29uZmlndXJlLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBMb2dpY2EuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGJ1ZyBpbiBYNTA5X0FUVFJJQlVURSBjcmVhdGlvbjogZG9udCBzZXQgYXR0cmlidXRlIHVzaW5nCiAgICAgQVNOMV9UWVBFX3NldDEgaWYgTUJTVFJJTkcgZmxhZyBzZXQuIFRoaXMgYnVnIHdvdWxkIGNyYXNoIGNlcnRhaW4KICAgICBhdHRyaWJ1dGUgY3JlYXRpb24gcm91dGluZXMgc3VjaCBhcyBjZXJ0aWZjYXRlIHJlcXVlc3RzIGFuZCBQS0NTIzEyCiAgICAgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhnIGFuZCAwLjkuOGggIFsyOCBNYXkgMjAwOF0KCiAgKikgRml4IGZsYXcgaWYgJ1NlcnZlciBLZXkgZXhjaGFuZ2UgbWVzc2FnZScgaXMgb21pdHRlZCBmcm9tIGEgVExTCiAgICAgaGFuZHNoYWtlIHdoaWNoIGNvdWxkIGxlYWQgdG8gYSBjaWxlbnQgY3Jhc2ggYXMgZm91bmQgdXNpbmcgdGhlCiAgICAgQ29kZW5vbWljb24gVExTIHRlc3Qgc3VpdGUgKENWRS0yMDA4LTE2NzIpIAogICAgIFtTdGV2ZSBIZW5zb24sIE1hcmsgQ294XQoKICAqKSBGaXggZG91YmxlIGZyZWUgaW4gVExTIHNlcnZlciBuYW1lIGV4dGVuc2lvbnMgd2hpY2ggY291bGQgbGVhZCB0bwogICAgIGEgcmVtb3RlIGNyYXNoIGZvdW5kIGJ5IENvZGVub21pY29uIFRMUyB0ZXN0IHN1aXRlIChDVkUtMjAwOC0wODkxKSAKICAgICBbSm9lIE9ydG9uXQoKICAqKSBDbGVhciBlcnJvciBxdWV1ZSBpbiBTU0xfQ1RYX3VzZV9jZXJ0aWZpY2F0ZV9jaGFpbl9maWxlKCkKCiAgICAgQ2xlYXIgdGhlIGVycm9yIHF1ZXVlIHRvIGVuc3VyZSB0aGF0IGVycm9yIGVudHJpZXMgbGVmdCBmcm9tCiAgICAgb2xkZXIgZnVuY3Rpb24gY2FsbHMgZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZSBjb3JyZWN0IG9wZXJhdGlvbi4KICAgICBbTHV0eiBKYWVuaWNrZSwgRXJpayBkZSBDYXN0cm8gTG9wb10KCiAgKikgUmVtb3ZlIHJvb3QgQ0EgY2VydGlmaWNhdGVzIG9mIGNvbW1lcmNpYWwgQ0FzOgoKICAgICBUaGUgT3BlblNTTCBwcm9qZWN0IGRvZXMgbm90IHJlY29tbWVuZCBhbnkgc3BlY2lmaWMgQ0EgYW5kIGRvZXMgbm90CiAgICAgaGF2ZSBhbnkgcG9saWN5IHdpdGggcmVzcGVjdCB0byBpbmNsdWRpbmcgb3IgZXhjbHVkaW5nIGFueSBDQS4KICAgICBUaGVyZWZvcmUgaXQgZG9lcyBub3QgbWFrZSBhbnkgc2Vuc2UgdG8gc2hpcCBhbiBhcmJpdHJhcnkgc2VsZWN0aW9uCiAgICAgb2Ygcm9vdCBDQSBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgT3BlblNTTCBzb2Z0d2FyZS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgUlNBIE9BRVAgcGF0Y2hlcyB0byBmaXggdHdvIHNlcGFyYXRlIGludmFsaWQgbWVtb3J5IHJlYWRzLgogICAgIFRoZSBmaXJzdCBvbmUgaW52b2x2ZXMgaW5wdXRzIHdoZW4gJ2x6ZXJvJyBpcyBncmVhdGVyIHRoYW4KICAgICAnU0hBX0RJR0VTVF9MRU5HVEgnIChpdCB3b3VsZCByZWFkIGFib3V0IFNIQV9ESUdFU1RfTEVOR1RIIGJ5dGVzCiAgICAgYmVmb3JlIHRoZSBiZWdpbm5pbmcgb2YgZnJvbSkuIFRoZSBzZWNvbmQgb25lIGludm9sdmVzIGlucHV0cyB3aGVyZQogICAgIHRoZSAnZGInIHNlY3Rpb24gY29udGFpbnMgbm90aGluZyBidXQgemVyb2VzICh0aGVyZSBpcyBhIG9uZS1ieXRlCiAgICAgaW52YWxpZCByZWFkIGFmdGVyIHRoZSBlbmQgb2YgJ2RiJykuCiAgICAgW0l2YW4gTmVzdGxlcm9kZSA8aW5lc3RsZXJvZGVAdXMuaWJtLmNvbT5dCgogICopIFBhcnRpYWwgYmFja3BvcnQgZnJvbSAwLjkuOS1kZXY6CgogICAgIEludHJvZHVjZSBibl9tdWxfbW9udCAoZGVkaWNhdGVkIE1vbnRnb21lcnkgbXVsdGlwbGljYXRpb24KICAgICBwcm9jZWR1cmUpIGFzIGEgY2FuZGlkYXRlIGZvciBCSUdOVU0gYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLgogICAgIFdoaWxlIDAuOS45LWRldiB1c2VzIGFzc2VtYmxlciBmb3IgdmFyaW91cyBhcmNoaXRlY3R1cmVzLCBvbmx5CiAgICAgeDg2XzY0IGlzIGF2YWlsYWJsZSBieSBkZWZhdWx0IGhlcmUgaW4gdGhlIDAuOS44IGJyYW5jaCwgYW5kCiAgICAgMzItYml0IHg4NiBpcyBhdmFpbGFibGUgdGhyb3VnaCBhIGNvbXBpbGUtdGltZSBzZXR0aW5nLgoKICAgICBUbyB0cnkgdGhlIDMyLWJpdCB4ODYgYXNzZW1ibGVyIGltcGxlbWVudGF0aW9uLCB1c2UgQ29uZmlndXJlCiAgICAgb3B0aW9uICJlbmFibGUtbW9udGFzbSIgKHdoaWNoIGV4aXN0cyBvbmx5IGZvciB0aGlzIGJhY2twb3J0KS4KCiAgICAgQXMgImVuYWJsZS1tb250YXNtIiBmb3IgMzItYml0IHg4NiBkaXNjbGFpbXMgY29kZSBzdGFiaWxpdHkKICAgICBhbnl3YXksIGluIHRoaXMgY29uc3RlbGxhdGlvbiB3ZSBhY3RpdmF0ZSBhZGRpdGlvbmFsIGNvZGUKICAgICBiYWNrcG9ydGVkIGZyb20gMC45LjktZGV2IGZvciBmdXJ0aGVyIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cywKICAgICBuYW1lbHkgQk5fZnJvbV9tb250Z29tZXJ5X3dvcmQuICAoVG8gZW5hYmxlIHRoaXMgb3RoZXJ3aXNlLAogICAgIGUuZy4geDg2XzY0LCB0cnkgIi1ETU9OVF9GUk9NX1dPUkRfX19OT05fREVGQVVMVF8wXzlfOF9CVUlMRCIuKQoKICAgICBbQW5keSBQb2x5YWtvdiAoYmFja3BvcnQgcGFydGlhbGx5IGJ5IEJvZG8gTW9lbGxlcildCgogICopIEFkZCBUTFMgc2Vzc2lvbiB0aWNrZXQgY2FsbGJhY2suIFRoaXMgYWxsb3dzIGFuIGFwcGxpY2F0aW9uIHRvIHNldAogICAgIFRMUyB0aWNrZXQgY2lwaGVyIGFuZCBITUFDIGtleXMgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBoYXJkY29kZWQgZml4ZWQKICAgICB2YWx1ZXMuIFRoaXMgaXMgdXNlZnVsIGZvciBrZXkgcm9sbG92ZXIgZm9yIGV4YW1wbGUgd2hlcmUgc2V2ZXJhbCBrZXkKICAgICBzZXRzIG1heSBleGlzdCB3aXRoIGRpZmZlcmVudCBuYW1lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZXZlcnNlIEVOR0lORS1pbnRlcm5hbCBsb2dpYyBmb3IgY2FjaGluZyBkZWZhdWx0IEVOR0lORSBoYW5kbGVzLgogICAgIFRoaXMgd2FzIGJyb2tlbiB1bnRpbCBub3cgaW4gMC45LjggcmVsZWFzZXMsIHN1Y2ggdGhhdCB0aGUgb25seSB3YXkKICAgICBhIHJlZ2lzdGVyZWQgRU5HSU5FIGNvdWxkIGJlIHVzZWQgKGFzc3VtaW5nIGl0IGluaXRpYWxpc2VzCiAgICAgc3VjY2Vzc2Z1bGx5IG9uIHRoZSBob3N0KSB3YXMgdG8gZXhwbGljaXRseSBzZXQgaXQgYXMgdGhlIGRlZmF1bHQKICAgICBmb3IgdGhlIHJlbGV2YW50IGFsZ29yaXRobXMuIFRoaXMgaXMgaW4gY29udHJhZGljdGlvbiB3aXRoIDAuOS43CiAgICAgYmVoYXZpb3VyIGFuZCB0aGUgZG9jdW1lbnRhdGlvbi4gV2l0aCB0aGlzIGZpeCwgd2hlbiBhbiBFTkdJTkUgaXMKICAgICByZWdpc3RlcmVkIGludG8gYSBnaXZlbiBhbGdvcml0aG0ncyB0YWJsZSBvZiBpbXBsZW1lbnRhdGlvbnMsIHRoZQogICAgICd1cHRvZGF0ZScgZmxhZyBpcyByZXNldCBzbyB0aGF0IGF1dG8tZGlzY292ZXJ5IHdpbGwgYmUgdXNlZCBuZXh0CiAgICAgdGltZSBhIG5ldyBjb250ZXh0IGZvciB0aGF0IGFsZ29yaXRobSBhdHRlbXB0cyB0byBzZWxlY3QgYW4KICAgICBpbXBsZW1lbnRhdGlvbi4KICAgICBbSWFuIExpc3RlciAodHdlYWtlZCBieSBHZW9mZiBUaG9ycGUpXQoKICAqKSBCYWNrcG9ydCBvZiBDTVMgY29kZSB0byBPcGVuU1NMIDAuOS44LiBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgMC45LjkKICAgICBpbXBsZW1lbnRpb24gaW4gdGhlIGZvbGxvd2luZyB3YXlzOgoKICAgICBMYWNrIG9mIEVWUF9QS0VZX0FTTjFfTUVUSE9EIG1lYW5zIGFsZ29yaXRobSBwYXJhbWV0ZXJzIGhhdmUgdG8gYmUKICAgICBoYXJkIGNvZGVkLgoKICAgICBMYWNrIG9mIEJFUiBzdHJlYW1pbmcgc3VwcG9ydCBtZWFucyBvbmUgcGFzcyBzdHJlYW1pbmcgcHJvY2Vzc2luZyBpcwogICAgIG9ubHkgc3VwcG9ydGVkIGlmIGRhdGEgaXMgZGV0YWNoZWQ6IHNldHRpbmcgdGhlIHN0cmVhbWluZyBmbGFnIGlzCiAgICAgaWdub3JlZCBmb3IgZW1iZWRkZWQgY29udGVudC4KCiAgICAgQ01TIHN1cHBvcnQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBhbmQgbXVzdCBiZSBleHBsaWNpdGx5IGVuYWJsZWQKICAgICB3aXRoIHRoZSBlbmFibGUtY21zIGNvbmZpZ3VyYXRpb24gb3B0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSB0aGUgR01QIGVuZ2luZSBnbHVlIHRvIGRvIGRpcmVjdCBjb3BpZXMgYmV0d2VlbiBCSUdOVU0gYW5kCiAgICAgbXB6X3Qgd2hlbiBvcGVuc3NsIGFuZCBHTVAgdXNlIHRoZSBzYW1lIGxpbWIgc2l6ZS4gT3RoZXJ3aXNlIHRoZQogICAgIGV4aXN0aW5nICJjb252ZXJzaW9uIHZpYSBhIHRleHQgc3RyaW5nIGV4cG9ydCIgdHJpY2sgaXMgc3RpbGwgdXNlZC4KICAgICBbUGF1bCBTaGVlciA8cGF1bHNoZWVyQGdtYWlsLmNvbT5dCgogICopIFpsaWIgY29tcHJlc3Npb24gQklPLiBUaGlzIGlzIGEgZmlsdGVyIEJJTyB3aGljaCBjb21wcmVzc2VkIGFuZAogICAgIHVuY29tcHJlc3NlcyBhbnkgZGF0YSBwYXNzZWQgdGhyb3VnaCBpdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQUVTX3dyYXBfa2V5KCkgYW5kIEFFU191bndyYXBfa2V5KCkgZnVuY3Rpb25zIHRvIGltcGxlbWVudAogICAgIFJGQzMzOTQgY29tcGF0aWJsZSBBRVMga2V5IHdyYXBwaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB1dGlsaXR5IGZ1bmN0aW9ucyB0byBoYW5kbGUgQVNOMSBzdHJ1Y3R1cmVzLiBBU04xX1NUUklOR19zZXQwKCk6CiAgICAgc2V0cyBzdHJpbmcgZGF0YSB3aXRob3V0IGNvcHlpbmcuIFg1MDlfQUxHT1Jfc2V0MCgpIGFuZAogICAgIFg1MDlfQUxHT1JfZ2V0MCgpOiBzZXQgYW5kIHJldHJpZXZlIFg1MDlfQUxHT1IgKEFsZ29yaXRobUlkZW50aWZpZXIpCiAgICAgZGF0YS4gQXR0cmlidXRlIGZ1bmN0aW9uIFg1MDlhdF9nZXQwX2RhdGFfYnlfT0JKKCk6IHJldHJpZXZlcyBkYXRhCiAgICAgZnJvbSBhbiBYNTA5X0FUVFJJQlVURSBzdHJ1Y3R1cmUgb3B0aW9uYWxseSBjaGVja2luZyBpdCBvY2N1cnMgb25seQogICAgIG9uY2UuIEFTTjFfVFlQRV9zZXQxKCk6IHNldCBhbmQgQVNOMV9UWVBFIHN0cnVjdHVyZSBjb3B5aW5nIHN1cHBsaWVkCiAgICAgZGF0YS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggQk4gZmxhZyBoYW5kbGluZyBpbiBSU0FfZWF5X21vZF9leHAoKSBhbmQgQk5fTU9OVF9DVFhfc2V0KCkKICAgICB0byBnZXQgdGhlIGV4cGVjdGVkIEJOX0ZMR19DT05TVFRJTUUgYmVoYXZpb3IuCiAgICAgW0JvZG8gTW9lbGxlciAoR29vZ2xlKV0KICAKICAqKSBOZXR3YXJlIHN1cHBvcnQ6CgogICAgIC0gZml4ZWQgd3JvbmcgdXNhZ2Ugb2YgaW9jdGxzb2NrZXQoKSB3aGVuIGJ1aWxkIGZvciBMSUJDIEJTRCBzb2NrZXRzCiAgICAgLSBmaXhlZCBkb190ZXN0cy5wbCB0byBydW4gdGhlIHRlc3Qgc3VpdGUgd2l0aCBDTElCIGJ1aWxkcyB0b28gKENMSUJfT1BUKQogICAgIC0gYWRkZWQgc29tZSBtb3JlIHRlc3RzIHRvIGRvX3Rlc3RzLnBsCiAgICAgLSBmaXhlZCBSdW5uaW5nUHJvY2VzcyB1c2FnZSBzbyB0aGF0IGl0IHdvcmtzIHdpdGggbmV3ZXIgTElCQyBOREtzIHRvbwogICAgIC0gcmVtb3ZlZCB1c2FnZSBvZiBCTl9MTE9ORyBmb3IgQ0xJQiBidWlsZHMgdG8gYXZvaWQgcnVudGltZSBkZXBlbmRlbmN5CiAgICAgLSBhZGRlZCBuZXcgQ29uZmlndXJlIHRhcmdldHMgbmV0d2FyZS1jbGliLWJzZHNvY2ssIG5ldHdhcmUtY2xpYi1nY2MsCiAgICAgICBuZXR3YXJlLWNsaWItYnNkc29jay1nY2MsIG5ldHdhcmUtbGliYy1ic2Rzb2NrLWdjYwogICAgIC0gdmFyaW91cyBjaGFuZ2VzIHRvIG5ldHdhcmUucGwgdG8gZW5hYmxlIGdjYy1jcm9zcyBidWlsZHMgb24gV2luMzIKICAgICAgIHBsYXRmb3JtCiAgICAgLSBjaGFuZ2VkIGNyeXB0by9iaW8vYl9zb2NrLmMgdG8gd29yayB3aXRoIG1hY3JvIGZ1bmN0aW9ucyAoQ0xJQiBCU0QpCiAgICAgLSB2YXJpb3VzIGNoYW5nZXMgdG8gZml4IG1pc3NpbmcgcHJvdG90eXBlIHdhcm5pbmdzCiAgICAgLSBmaXhlZCB4ODZuYXNtLnBsIHRvIGNyZWF0ZSBjb3JyZWN0IGFzbSBmaWxlcyBmb3IgTkFTTSBDT0ZGIG91dHB1dAogICAgIC0gYWRkZWQgQUVTLCBXSElSTFBPT0wgYW5kIENQVUlEIGFzc2VtYmxlciBjb2RlIHRvIGJ1aWxkIGZpbGVzCiAgICAgLSBhZGRlZCBtaXNzaW5nIEFFUyBhc3NlbWJsZXIgbWFrZSBydWxlcyB0byBtazFtZi5wbAogICAgIC0gZml4ZWQgb3JkZXIgb2YgaW5jbHVkZXMgaW4gYXBwcy9vY3NwLmMgc28gdGhhdCBlX29zLmggc2V0dGluZ3MgYXBwbHkKICAgICBbR3VlbnRlciBLbmF1ZiA8ZWZsYXNoQGdteC5uZXQ+XQoKICAqKSBJbXBsZW1lbnQgY2VydGlmaWNhdGUgc3RhdHVzIHJlcXVlc3QgVExTIGV4dGVuc2lvbiBkZWZpbmVkIGluIFJGQzM1NDYuCiAgICAgQSBjbGllbnQgY2FuIHNldCB0aGUgYXBwcm9wcmlhdGUgcGFyYW1ldGVycyBhbmQgcmVjZWl2ZSB0aGUgZW5jb2RlZAogICAgIE9DU1AgcmVzcG9uc2UgdmlhIGEgY2FsbGJhY2suIEEgc2VydmVyIGNhbiBxdWVyeSB0aGUgc3VwcGxpZWQgcGFyYW1ldGVycwogICAgIGFuZCBzZXQgdGhlIGVuY29kZWQgT0NTUCByZXNwb25zZSBpbiB0aGUgY2FsbGJhY2suIEFkZCBzaW1wbGlmaWVkIGV4YW1wbGVzCiAgICAgdG8gc19jbGllbnQgYW5kIHNfc2VydmVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ZiBhbmQgMC45LjhnICBbMTkgT2N0IDIwMDddCgogICopIEZpeCB2YXJpb3VzIGJ1Z3M6CiAgICAgKyBCaW5hcnkgaW5jb21wYXRpYmlsaXR5IG9mIHNzbF9jdHhfc3Qgc3RydWN0dXJlCiAgICAgKyBEVExTIGludGVyb3BlcmF0aW9uIHdpdGggbm9uLWNvbXBsaWFudCBzZXJ2ZXJzCiAgICAgKyBEb24ndCBjYWxsIGdldF9zZXNzaW9uX2NiKCkgd2l0aG91dCBwcm9wb3NlZCBzZXNzaW9uCiAgICAgKyBGaXggaWE2NCBhc3NlbWJsZXIgY29kZQogICAgIFtBbmR5IFBvbHlha292LCBTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44ZSBhbmQgMC45LjhmICBbMTEgT2N0IDIwMDddCgogICopIERUTFMgSGFuZHNoYWtlIG92ZXJoYXVsLiBUaGVyZSB3ZXJlIGxvbmdzdGFuZGluZyBpc3N1ZXMgd2l0aAogICAgIE9wZW5TU0wgRFRMUyBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggd2VyZSBtYWtpbmcgaXQgaW1wb3NzaWJsZSBmb3IKICAgICBSRkMgNDM0NyBjb21wbGlhbnQgY2xpZW50IHRvIGNvbW11bmljYXRlIHdpdGggT3BlblNTTCBzZXJ2ZXIuCiAgICAgVW5mb3J0dW5hdGVseSBqdXN0IGZpeGluZyB0aGVzZSBpbmNvbXBhdGliaWxpdGllcyB3b3VsZCAiY3V0IG9mZiIKICAgICBwcmUtMC45LjhmIGNsaWVudHMuIFRvIGFsbG93IGZvciBoYXNzbGUgZnJlZSB1cGdyYWRlIHBvc3QtMC45LjhlCiAgICAgc2VydmVyIGtlZXBzIHRvbGVyYXRpbmcgbm9uIFJGQyBjb21wbGlhbnQgc3ludGF4LiBUaGUgb3Bwb3NpdGUgaXMKICAgICBub3QgdHJ1ZSwgMC45LjhmIGNsaWVudCBjYW4gbm90IGNvbW11bmljYXRlIHdpdGggZWFybGllciBzZXJ2ZXIuCiAgICAgVGhpcyB1cGRhdGUgZXZlbiBhZGRyZXNzZXMgQ1ZFLTIwMDctNDk5NS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQ2hhbmdlcyB0byBhdm9pZCBuZWVkIGZvciBmdW5jdGlvbiBjYXN0cyBpbiBPcGVuU1NMOiBzb21lIGNvbXBpbGVycwogICAgIChnY2MgNC4yIGFuZCBsYXRlcikgcmVqZWN0IHRoZWlyIHVzZS4KICAgICBbS3VydCBSb2Vja3ggPGt1cnRAcm9lY2t4LmJlPiwgUGV0ZXIgSGFydGxleSA8cGRoQHV0dGVyLmNoYW9zLm9yZy51az4sCiAgICAgIFN0ZXZlIEhlbnNvbl0KICAKICAqKSBBZGQgUkZDNDUwNyBzdXBwb3J0IHRvIE9wZW5TU0wuIFRoaXMgaW5jbHVkZXMgdGhlIGNvcnJlY3Rpb25zIGluCiAgICAgUkZDNDUwN2Jpcy4gVGhlIGVuY3J5cHRlZCB0aWNrZXQgZm9ybWF0IGlzIGFuIGVuY3J5cHRlZCBlbmNvZGVkCiAgICAgU1NMX1NFU1NJT04gc3RydWN0dXJlLCB0aGF0IHdheSBuZXcgc2Vzc2lvbiBmZWF0dXJlcyBhcmUgYXV0b21hdGljYWxseQogICAgIHN1cHBvcnRlZC4KCiAgICAgSWYgYSBjbGllbnQgYXBwbGljYXRpb24gY2FjaGVzIHNlc3Npb24gaW4gYW4gU1NMX1NFU1NJT04gc3RydWN0dXJlCiAgICAgc3VwcG9ydCBpcyB0cmFuc3BhcmVudCBiZWNhdXNlIHRpY2tldHMgYXJlIG5vdyBzdG9yZWQgaW4gdGhlIGVuY29kZWQKICAgICBTU0xfU0VTU0lPTi4KICAgICAKICAgICBUaGUgU1NMX0NUWCBzdHJ1Y3R1cmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMga2V5cyBmb3IgdGlja2V0CiAgICAgcHJvdGVjdGlvbiBpbiBzZXJ2ZXJzIHNvIGFnYWluIHN1cHBvcnQgc2hvdWxkIGJlIHBvc3NpYmxlCiAgICAgd2l0aCBubyBhcHBsaWNhdGlvbiBtb2RpZmljYXRpb24uCgogICAgIElmIGEgY2xpZW50IG9yIHNlcnZlciB3aXNoZXMgdG8gZGlzYWJsZSBSRkM0NTA3IHN1cHBvcnQgdGhlbiB0aGUgb3B0aW9uCiAgICAgU1NMX09QX05PX1RJQ0tFVCBjYW4gYmUgc2V0LgoKICAgICBBZGQgYSBUTFMgZXh0ZW5zaW9uIGRlYnVnZ2luZyBjYWxsYmFjayB0byBhbGxvdyB0aGUgY29udGVudHMgb2YgYW55IGNsaWVudAogICAgIG9yIHNlcnZlciBleHRlbnNpb25zIHRvIGJlIGV4YW1pbmVkLgoKICAgICBUaGlzIHdvcmsgd2FzIHNwb25zb3JlZCBieSBHb29nbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgVExTIGV4dGVuc2lvbnMsIHNwZWNpZmljYWxseSBmb3IgdGhlIHNlcnZlcl9uYW1lCiAgICAgZXh0ZW5zaW9uIHNvIGZhci4gIFRoZSBTU0xfU0VTU0lPTiwgU1NMX0NUWCwgYW5kIFNTTCBkYXRhIHN0cnVjdHVyZXMgbm93CiAgICAgaGF2ZSBuZXcgbWVtYmVycyBmb3IgYSBob3N0IG5hbWUuICBUaGUgU1NMIGRhdGEgc3RydWN0dXJlIGhhcyBhbgogICAgIGFkZGl0aW9uYWwgbWVtYmVyIFNTTF9DVFggKmluaXRpYWxfY3R4IHNvIHRoYXQgbmV3IHNlc3Npb25zIGNhbiBiZQogICAgIHN0b3JlZCBpbiB0aGF0IGNvbnRleHQgdG8gYWxsb3cgZm9yIHNlc3Npb24gcmVzdW1wdGlvbiwgZXZlbiBhZnRlciB0aGUKICAgICBTU0wgaGFzIGJlZW4gc3dpdGNoZWQgdG8gYSBuZXcgU1NMX0NUWCBpbiByZWFjdGlvbiB0byBhIGNsaWVudCdzCiAgICAgc2VydmVyX25hbWUgZXh0ZW5zaW9uLgoKICAgICBOZXcgZnVuY3Rpb25zIChzdWJqZWN0IHRvIGNoYW5nZSk6CgogICAgICAgICBTU0xfZ2V0X3NlcnZlcm5hbWUoKQogICAgICAgICBTU0xfZ2V0X3NlcnZlcm5hbWVfdHlwZSgpCiAgICAgICAgIFNTTF9zZXRfU1NMX0NUWCgpCgogICAgIE5ldyBDVFJMIGNvZGVzIGFuZCBtYWNyb3MgKHN1YmplY3QgdG8gY2hhbmdlKToKCiAgICAgICAgIFNTTF9DVFJMX1NFVF9UTFNFWFRfU0VSVkVSTkFNRV9DQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIFNTTF9DVFhfc2V0X3Rsc2V4dF9zZXJ2ZXJuYW1lX2NhbGxiYWNrKCkKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9TRVJWRVJOQU1FX0FSRwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gU1NMX0NUWF9zZXRfdGxzZXh0X3NlcnZlcm5hbWVfYXJnKCkKICAgICAgICAgU1NMX0NUUkxfU0VUX1RMU0VYVF9IT1NUTkFNRSAgICAgICAgICAgLSBTU0xfc2V0X3Rsc2V4dF9ob3N0X25hbWUoKQoKICAgICBvcGVuc3NsIHNfY2xpZW50IGhhcyBhIG5ldyAnLXNlcnZlcm5hbWUgLi4uJyBvcHRpb24uCgogICAgIG9wZW5zc2wgc19zZXJ2ZXIgaGFzIG5ldyBvcHRpb25zICctc2VydmVybmFtZV9ob3N0IC4uLicsICctY2VydDIgLi4uJywKICAgICAnLWtleTIgLi4uJywgJy1zZXJ2ZXJuYW1lX2ZhdGFsJyAoc3ViamVjdCB0byBjaGFuZ2UpLiAgVGhpcyBhbGxvd3MKICAgICB0ZXN0aW5nIHRoZSBIb3N0TmFtZSBleHRlbnNpb24gZm9yIGEgc3BlY2lmaWMgc2luZ2xlIGhvc3QgbmFtZSAoJy1jZXJ0JwogICAgIGFuZCAnLWtleScgcmVtYWluIGZhbGxiYWNrcyBmb3IgaGFuZHNoYWtlcyB3aXRob3V0IEhvc3ROYW1lCiAgICAgbmVnb3RpYXRpb24pLiAgSWYgdGhlIHVucmVjb2duaXplZF9uYW1lIGFsZXJ0IGhhcyB0byBiZSBzZW50LCB0aGlzIGJ5CiAgICAgZGVmYXVsdCBpcyBhIHdhcm5pbmc7IGl0IGJlY29tZXMgZmF0YWwgd2l0aCB0aGUgJy1zZXJ2ZXJuYW1lX2ZhdGFsJwogICAgIG9wdGlvbi4KCiAgICAgW1BldGVyIFN5bHZlc3RlciwgIFJlbXkgQWxsYWlzLCBDaHJpc3RvcGhlIFJlbm91LCBTdGV2ZSBIZW5zb25dCgogICopIEFkZCBBRVMgYW5kIFNTRTIgYXNzZW1ibHkgbGFuZ3VhZ2Ugc3VwcG9ydCB0byBWQysrIGJ1aWxkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1pdGlnYXRlIGF0dGFjayBvbiBmaW5hbCBzdWJ0cmFjdGlvbiBpbiBNb250Z29tZXJ5IHJlZHVjdGlvbi4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgRml4IGNyeXB0by9lYy9lY19tdWx0LmMgdG8gd29yayBwcm9wZXJseSB3aXRoIHNjYWxhcnMgb2YgdmFsdWUgMAogICAgICh3aGljaCBwcmV2aW91c2x5IGNhdXNlZCBhbiBpbnRlcm5hbCBlcnJvcikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgU3F1ZWV6ZSBhbm90aGVyIDEwJSBvdXQgb2YgSUdFIG1vZGUgd2hlbiBpbiAhPSBvdXQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFFUyBJR0UgbW9kZSBzcGVlZHVwLgogICAgIFtEZWFuIEdhdWRldCAoR29vZ2xlKV0KCiAgKikgQWRkIHRoZSBLb3JlYW4gc3ltbWV0cmljIDEyOC1iaXQgY2lwaGVyIFNFRUQgKHNlZQogICAgIGh0dHA6Ly93d3cua2lzYS5vci5rci9raXNhL3NlZWQvanNwL3NlZWRfZW5nLmpzcCkgYW5kCiAgICAgYWRkIFNFRUQgY2lwaGVyc3VpdGVzIGZyb20gUkZDIDQxNjI6CgogICAgICAgIFRMU19SU0FfV0lUSF9TRUVEX0NCQ19TSEEgICAgICA9ICAiU0VFRC1TSEEiCiAgICAgICAgVExTX0RIRV9EU1NfV0lUSF9TRUVEX0NCQ19TSEEgID0gICJESEUtRFNTLVNFRUQtU0hBIgogICAgICAgIFRMU19ESEVfUlNBX1dJVEhfU0VFRF9DQkNfU0hBICA9ICAiREhFLVJTQS1TRUVELVNIQSIKICAgICAgICBUTFNfREhfYW5vbl9XSVRIX1NFRURfQ0JDX1NIQSAgPSAgIkFESC1TRUVELVNIQSIKCiAgICAgVG8gbWluaW1pemUgY2hhbmdlcyBiZXR3ZWVuIHBhdGNobGV2ZWxzIGluIHRoZSBPcGVuU1NMIDAuOS44CiAgICAgc2VyaWVzLCBTRUVEIHJlbWFpbnMgZXhjbHVkZWQgZnJvbSBjb21waWxhdGlvbiB1bmxlc3MgT3BlblNTTAogICAgIGlzIGNvbmZpZ3VyZWQgd2l0aCAnZW5hYmxlLXNlZWQnLgogICAgIFtLSVNBLCBCb2RvIE1vZWxsZXJdCgogICopIE1pdGlnYXRlIGJyYW5jaCBwcmVkaWN0aW9uIGF0dGFja3MsIHdoaWNoIGNhbiBiZSBwcmFjdGljYWwgaWYgYQogICAgIHNpbmdsZSBwcm9jZXNzb3IgaXMgc2hhcmVkLCBhbGxvd2luZyBhIHNweSBwcm9jZXNzIHRvIGV4dHJhY3QKICAgICBpbmZvcm1hdGlvbi4gIEZvciBkZXRhaWxlZCBiYWNrZ3JvdW5kIGluZm9ybWF0aW9uLCBzZWUKICAgICBodHRwOi8vZXByaW50LmlhY3Iub3JnLzIwMDcvMDM5IChPLiBBY2lpY21leiwgUy4gR3Vlcm9uLAogICAgIEouLVAuIFNlaWZlcnQsICJOZXcgQnJhbmNoIFByZWRpY3Rpb24gVnVsbmVyYWJpbGl0aWVzIGluIE9wZW5TU0wKICAgICBhbmQgTmVjZXNzYXJ5IFNvZnR3YXJlIENvdW50ZXJtZWFzdXJlcyIpLiAgVGhlIGNvcmUgb2YgdGhlIGNoYW5nZQogICAgIGFyZSBuZXcgdmVyc2lvbnMgQk5fZGl2X25vX2JyYW5jaCgpIGFuZAogICAgIEJOX21vZF9pbnZlcnNlX25vX2JyYW5jaCgpIG9mIEJOX2RpdigpIGFuZCBCTl9tb2RfaW52ZXJzZSgpLAogICAgIHJlc3BlY3RpdmVseSwgd2hpY2ggYXJlIHNsb3dlciwgYnV0IGF2b2lkIHRoZSBzZWN1cml0eS1yZWxldmFudAogICAgIGNvbmRpdGlvbmFsIGJyYW5jaGVzLiAgVGhlc2UgYXJlIGF1dG9tYXRpY2FsbHkgY2FsbGVkIGJ5IEJOX2RpdigpCiAgICAgYW5kIEJOX21vZF9pbnZlcnNlKCkgaWYgdGhlIGZsYWcgQk5fRkxHX0NPTlNUVElNRSBpcyBzZXQgZm9yIG9uZQogICAgIG9mIHRoZSBpbnB1dCBCSUdOVU1zLiAgQWxzbywgQk5faXNfYml0X3NldCgpIGhhcyBiZWVuIGNoYW5nZWQgdG8KICAgICByZW1vdmUgYSBjb25kaXRpb25hbCBicmFuY2guCgogICAgIEJOX0ZMR19DT05TVFRJTUUgaXMgdGhlIG5ldyBuYW1lIGZvciB0aGUgcHJldmlvdXMKICAgICBCTl9GTEdfRVhQX0NPTlNUVElNRSBmbGFnLCBzaW5jZSBpdCBub3cgYWZmZWN0cyBtb3JlIHRoYW4ganVzdAogICAgIG1vZHVsYXIgZXhwb25lbnRpYXRpb24uICAoU2luY2UgT3BlblNTTCAwLjkuN2gsIHNldHRpbmcgdGhpcyBmbGFnCiAgICAgaW4gdGhlIGV4cG9uZW50IGNhdXNlcyBCTl9tb2RfZXhwX21vbnQoKSB0byB1c2UgdGhlIGFsdGVybmF0aXZlCiAgICAgaW1wbGVtZW50YXRpb24gaW4gQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSgpLikgIFRoZSBvbGQgbmFtZQogICAgIHJlbWFpbnMgYXMgYSBkZXByZWNhdGVkIGFsaWFzLgoKICAgICBTaW1pbGFyeSwgUlNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSBpcyByZXBsYWNlZCBieSBhIG1vcmUgZ2VuZXJhbAogICAgIFJTQV9GTEFHX05PX0NPTlNUVElNRSBmbGFnIHNpbmNlIHRoZSBSU0EgaW1wbGVtZW50YXRpb24gbm93IHVzZXMKICAgICBjb25zdGFudC10aW1lIGltcGxlbWVudGF0aW9ucyBmb3IgbW9yZSB0aGFuIGp1c3QgZXhwb25lbnRpYXRpb24uCiAgICAgSGVyZSB0b28gdGhlIG9sZCBuYW1lIGlzIGtlcHQgYXMgYSBkZXByZWNhdGVkIGFsaWFzLgoKICAgICBCTl9CTElORElOR19uZXcoKSB3aWxsIG5vdyB1c2UgQk5fZHVwKCkgZm9yIHRoZSBtb2R1bHVzIHNvIHRoYXQKICAgICB0aGUgQk5fQkxJTkRJTkcgc3RydWN0dXJlIGdldHMgYW4gaW5kZXBlbmRlbnQgY29weSBvZiB0aGUKICAgICBtb2R1bHVzLiAgVGhpcyBtZWFucyB0aGF0IHRoZSBwcmV2aW91cyAiQklHTlVNICptIiBhcmd1bWVudCB0bwogICAgIEJOX0JMSU5ESU5HX25ldygpIGFuZCB0byBCTl9CTElORElOR19jcmVhdGVfcGFyYW0oKSBub3cKICAgICBlc3NlbnRpYWxseSBiZWNvbWVzICJjb25zdCBCSUdOVU0gKm0iLCBhbHRob3VnaCB3ZSBjYW4ndCBhY3R1YWxseQogICAgIGNoYW5nZSB0aGlzIGluIHRoZSBoZWFkZXIgZmlsZSBiZWZvcmUgMC45LjkuICBJdCBhbGxvd3MKICAgICBSU0Ffc2V0dXBfYmxpbmRpbmcoKSB0byB1c2UgQk5fd2l0aF9mbGFncygpIG9uIHRoZSBtb2R1bHVzIHRvCiAgICAgZW5hYmxlIEJOX0ZMR19DT05TVFRJTUUuCgogICAgIFtNYXR0aGV3IEQgV29vZCAoSW50ZWwgQ29ycCldCgogICopIEluIHRoZSBTU0wvVExTIHNlcnZlciBpbXBsZW1lbnRhdGlvbiwgYmUgc3RyaWN0IGFib3V0IHNlc3Npb24gSUQKICAgICBjb250ZXh0IG1hdGNoaW5nICh3aGljaCBtYXR0ZXJzIGlmIGFuIGFwcGxpY2F0aW9uIHVzZXMgYSBzaW5nbGUKICAgICBleHRlcm5hbCBjYWNoZSBmb3IgZGlmZmVyZW50IHB1cnBvc2VzKS4gIFByZXZpb3VzbHksCiAgICAgb3V0LW9mLWNvbnRleHQgcmV1c2Ugd2FzIGZvcmJpZGRlbiBvbmx5IGlmIFNTTF9WRVJJRllfUEVFUiB3YXMKICAgICBzZXQuICBUaGlzIGRpZCBlbnN1cmUgc3RyaWN0IGNsaWVudCB2ZXJpZmljYXRpb24sIGJ1dCBtZWFudCB0aGF0LAogICAgIHdpdGggYXBwbGljYXRpb25zIHVzaW5nIGEgc2luZ2xlIGV4dGVybmFsIGNhY2hlIGZvciBxdWl0ZQogICAgIGRpZmZlcmVudCByZXF1aXJlbWVudHMsIGNsaWVudHMgY291bGQgY2lyY3VtdmVudCBjaXBoZXJzdWl0ZQogICAgIHJlc3RyaWN0aW9ucyBmb3IgYSBnaXZlbiBzZXNzaW9uIElEIGNvbnRleHQgYnkgc3RhcnRpbmcgYSBzZXNzaW9uCiAgICAgaW4gYSBkaWZmZXJlbnQgY29udGV4dC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbmNsdWRlICIhZU5VTEwiIGluIFNTTF9ERUZBVUxUX0NJUEhFUl9MSVNUIHRvIG1ha2Ugc3VyZSB0aGF0CiAgICAgYSBjaXBoZXJzdWl0ZSBzdHJpbmcgc3VjaCBhcyAiREVGQVVMVDpSU0EiIGNhbm5vdCBlbmFibGUKICAgICBhdXRoZW50aWNhdGlvbi1vbmx5IGNpcGhlcnN1aXRlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVcGRhdGUgdGhlIFNTTF9nZXRfc2hhcmVkX2NpcGhlcnMoKSBmaXggQ1ZFLTIwMDYtMzczOCB3aGljaCB3YXMKICAgICBub3QgY29tcGxldGUgYW5kIGNvdWxkIGxlYWQgdG8gYSBwb3NzaWJsZSBzaW5nbGUgYnl0ZSBvdmVyZmxvdwogICAgIChDVkUtMjAwNy01MTM1KSBbQmVuIExhdXJpZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhkIGFuZCAwLjkuOGUgIFsyMyBGZWIgMjAwN10KCiAgKikgU2luY2UgQUVTMTI4IGFuZCBBRVMyNTYgKGFuZCBzaW1pbGFybHkgQ2FtZWxsaWExMjggYW5kCiAgICAgQ2FtZWxsaWEyNTYpIHNoYXJlIGEgc2luZ2xlIG1hc2sgYml0IGluIHRoZSBsb2dpYyBvZgogICAgIHNzbC9zc2xfY2lwaC5jLCB0aGUgY29kZSBmb3IgbWFza2luZyBvdXQgZGlzYWJsZWQgY2lwaGVycyBuZWVkcyBhCiAgICAga2x1ZGdlIHRvIHdvcmsgcHJvcGVybHkgaWYgQUVTMTI4IGlzIGF2YWlsYWJsZSBhbmQgQUVTMjU2IGlzbid0CiAgICAgKG9yIGlmIENhbWVsbGlhMTI4IGlzIGF2YWlsYWJsZSBhbmQgQ2FtZWxsaWEyNTYgaXNuJ3QpLgogICAgIFtWaWN0b3IgRHVjaG92bmldCgogICopIEZpeCB0aGUgQklUIFNUUklORyBlbmNvZGluZyBnZW5lcmF0ZWQgYnkgY3J5cHRvL2VjL2VjX2FzbjEuYwogICAgICh3aXRoaW4gaTJkX0VDUHJpdmF0ZUtleSwgaTJkX0VDUEtQYXJhbWV0ZXJzLCBpMmRfRUNQYXJhbWV0ZXJzKToKICAgICBXaGVuIGEgcG9pbnQgb3IgYSBzZWVkIGlzIGVuY29kZWQgaW4gYSBCSVQgU1RSSU5HLCB3ZSBuZWVkIHRvCiAgICAgcHJldmVudCB0aGUgcmVtb3ZhbCBvZiB0cmFpbGluZyB6ZXJvIGJpdHMgdG8gZ2V0IHRoZSBwcm9wZXIgREVSCiAgICAgZW5jb2RpbmcuICAoQnkgZGVmYXVsdCwgY3J5cHRvL2FzbjEvYV9iaXRzdHIuYyBhc3N1bWVzIHRoZSBjYXNlCiAgICAgb2YgYSBOYW1lZEJpdExpc3QsIGZvciB3aGljaCB0cmFpbGluZyAwIGJpdHMgbmVlZCB0byBiZSByZW1vdmVkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBIYXZlIFNTTC9UTFMgc2VydmVyIGltcGxlbWVudGF0aW9uIHRvbGVyYXRlICJtaXNtYXRjaGVkIiByZWNvcmQKICAgICBwcm90b2NvbCB2ZXJzaW9uIHdoaWxlIHJlY2VpdmluZyBDbGllbnRIZWxsbyBldmVuIGlmIHRoZQogICAgIENsaWVudEhlbGxvIGlzIGZyYWdtZW50ZWQuICAoVGhlIHNlcnZlciBjYW4ndCBpbnNpc3Qgb24gdGhlCiAgICAgcGFydGljdWxhciBwcm90b2NvbCB2ZXJzaW9uIGl0IGhhcyBjaG9zZW4gYmVmb3JlIHRoZSBTZXJ2ZXJIZWxsbwogICAgIG1lc3NhZ2UgaGFzIGluZm9ybWVkIHRoZSBjbGllbnQgYWJvdXQgaGlzIGNob2ljZS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIFJGQyAzNzc5IHN1cHBvcnQuCiAgICAgW1JvYiBBdXN0ZWluIGZvciBBUklOLCBCZW4gTGF1cmllXQoKICAqKSBMb2FkIGVycm9yIGNvZGVzIGlmIHRoZXkgYXJlIG5vdCBhbHJlYWR5IHByZXNlbnQgaW5zdGVhZCBvZiB1c2luZyBhCiAgICAgc3RhdGljIHZhcmlhYmxlLiBUaGlzIGFsbG93cyB0aGVtIHRvIGJlIGNsZWFubHkgdW5sb2FkZWQgYW5kIHJlbG9hZGVkLgogICAgIEltcHJvdmUgaGVhZGVyIGZpbGUgZnVuY3Rpb24gbmFtZSBwYXJzaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIGV4dGVuZCBTTVRQIGFuZCBJTUFQIHByb3RvY29sIGVtdWxhdGlvbiBpbiBzX2NsaWVudCB0byB1c2UgRUhMTwogICAgIG9yIENBUEFCSUxJVFkgaGFuZHNoYWtlIGFzIHJlcXVpcmVkIGJ5IFJGQ3MuCiAgICAgW0dvZXR6IEJhYmluLUViZWxsXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGMgYW5kIDAuOS44ZCAgWzI4IFNlcCAyMDA2XQoKICAqKSBJbnRyb2R1Y2UgbGltaXRzIHRvIHByZXZlbnQgbWFsaWNpb3VzIGtleXMgYmVpbmcgYWJsZSB0bwogICAgIGNhdXNlIGEgZGVuaWFsIG9mIHNlcnZpY2UuICAoQ1ZFLTIwMDYtMjk0MCkKICAgICBbU3RldmUgSGVuc29uLCBCb2RvIE1vZWxsZXJdCgogICopIEZpeCBBU04uMSBwYXJzaW5nIG9mIGNlcnRhaW4gaW52YWxpZCBzdHJ1Y3R1cmVzIHRoYXQgY2FuIHJlc3VsdAogICAgIGluIGEgZGVuaWFsIG9mIHNlcnZpY2UuICAoQ1ZFLTIwMDYtMjkzNykgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBidWZmZXIgb3ZlcmZsb3cgaW4gU1NMX2dldF9zaGFyZWRfY2lwaGVycygpIGZ1bmN0aW9uLiAKICAgICAoQ1ZFLTIwMDYtMzczOCkgW1RhdmlzIE9ybWFuZHkgYW5kIFdpbGwgRHJld3J5LCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgRml4IFNTTCBjbGllbnQgY29kZSB3aGljaCBjb3VsZCBjcmFzaCBpZiBjb25uZWN0aW5nIHRvIGEKICAgICBtYWxpY2lvdXMgU1NMdjIgc2VydmVyLiAgKENWRS0yMDA2LTQzNDMpCiAgICAgW1RhdmlzIE9ybWFuZHkgYW5kIFdpbGwgRHJld3J5LCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgU2luY2UgMC45LjhiLCBjaXBoZXJzdWl0ZSBzdHJpbmdzIG5hbWluZyBleHBsaWNpdCBjaXBoZXJzdWl0ZXMKICAgICBtYXRjaCBvbmx5IHRob3NlLiAgQmVmb3JlIHRoYXQsICJBRVMyNTYtU0hBIiB3b3VsZCBiZSBpbnRlcnByZXRlZAogICAgIGFzIGEgcGF0dGVybiBhbmQgbWF0Y2ggIkFFUzEyOC1TSEEiIHRvbyAoc2luY2UgQUVTMTI4LVNIQSBnb3QKICAgICB0aGUgc2FtZSBzdHJlbmd0aCBjbGFzc2lmaWNhdGlvbiBpbiAwLjkuN2gpIGFzIHdlIGN1cnJlbnRseSBvbmx5CiAgICAgaGF2ZSBhIHNpbmdsZSBBRVMgYml0IGluIHRoZSBjaXBoZXJzdWl0ZSBkZXNjcmlwdGlvbiBiaXRtYXAuCiAgICAgVGhhdCBjaGFuZ2UsIGhvd2V2ZXIsIGFsc28gYXBwbGllZCB0byBjaXBoZXJzdWl0ZSBzdHJpbmdzIHN1Y2ggYXMKICAgICAiUkM0LU1ENSIgdGhhdCBpbnRlbnRpb25hbGx5IG1hdGNoZWQgbXVsdGlwbGUgY2lwaGVyc3VpdGVzIC0tCiAgICAgbmFtZWx5LCBTU0wgMi4wIGNpcGhlcnN1aXRlcyBpbiBhZGRpdGlvbiB0byB0aGUgbW9yZSBjb21tb24gb25lcwogICAgIGZyb20gU1NMIDMuMC9UTFMgMS4wLgoKICAgICBTbyB3ZSBjaGFuZ2UgdGhlIHNlbGVjdGlvbiBhbGdvcml0aG0gYWdhaW46IE5hbWluZyBhbiBleHBsaWNpdAogICAgIGNpcGhlcnN1aXRlIHNlbGVjdHMgdGhpcyBvbmUgY2lwaGVyc3VpdGUsIGFuZCBhbnkgb3RoZXIgc2ltaWxhcgogICAgIGNpcGhlcnN1aXRlIChzYW1lIGJpdG1hcCkgZnJvbSAqb3RoZXIqIHByb3RvY29sIHZlcnNpb25zLgogICAgIFRodXMsICJSQzQtTUQ1IiBhZ2FpbiB3aWxsIHByb3Blcmx5IHNlbGVjdCBib3RoIHRoZSBTU0wgMi4wCiAgICAgY2lwaGVyc3VpdGUgYW5kIHRoZSBTU0wgMy4wL1RMUyAxLjAgY2lwaGVyc3VpdGUuCgogICAgIFNpbmNlIFNTTCAyLjAgZG9lcyBub3QgaGF2ZSBhbnkgY2lwaGVyc3VpdGVzIGZvciB3aGljaCB0aGUKICAgICAxMjgvMjU2IGJpdCBkaXN0aW5jdGlvbiB3b3VsZCBiZSByZWxldmFudCwgdGhpcyB3b3JrcyBmb3Igbm93LgogICAgIFRoZSBwcm9wZXIgZml4IHdpbGwgYmUgdG8gdXNlIGRpZmZlcmVudCBiaXRzIGZvciBBRVMxMjggYW5kCiAgICAgQUVTMjU2LCB3aGljaCB3b3VsZCBoYXZlIGF2b2lkZWQgdGhlIHByb2JsZW1zIGZyb20gdGhlIGJlZ2lubmluZzsKICAgICBob3dldmVyLCBiaXRzIGFyZSBzY2FyY2UsIHNvIHdlIGNhbiBvbmx5IGRvIHRoaXMgaW4gYSBuZXcgcmVsZWFzZQogICAgIChub3QganVzdCBhIHBhdGNobGV2ZWwpIHdoZW4gd2UgY2FuIGNoYW5nZSB0aGUgU1NMX0NJUEhFUgogICAgIGRlZmluaXRpb24gdG8gc3BsaXQgdGhlIHNpbmdsZSAndW5zaWduZWQgbG9uZyBtYXNrJyBiaXRtYXAgaW50bwogICAgIG11bHRpcGxlIHZhbHVlcyB0byBleHRlbmQgdGhlIGF2YWlsYWJsZSBzcGFjZS4KCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjhiIGFuZCAwLjkuOGMgIFswNSBTZXAgMjAwNl0KCiAgKikgQXZvaWQgUEtDUyAjMSB2MS41IHNpZ25hdHVyZSBhdHRhY2sgZGlzY292ZXJlZCBieSBEYW5pZWwgQmxlaWNoZW5iYWNoZXIKICAgICAoQ1ZFLTIwMDYtNDMzOSkgIFtCZW4gTGF1cmllIGFuZCBHb29nbGUgU2VjdXJpdHkgVGVhbV0KCiAgKikgQWRkIEFFUyBJR0UgYW5kIGJpSUdFIG1vZGVzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDaGFuZ2UgdGhlIFVuaXggcmFuZG9tbmVzcyBlbnRyb3B5IGdhdGhlcmluZyB0byB1c2UgcG9sbCgpIHdoZW4KICAgICBwb3NzaWJsZSBpbnN0ZWFkIG9mIHNlbGVjdCgpLCBzaW5jZSB0aGUgbGF0dGVyIGhhcyBzb21lCiAgICAgdW5kZXNpcmFibGUgbGltaXRhdGlvbnMuCiAgICAgW0RhcnJ5bCBNaWxlcyB2aWEgUmljaGFyZCBMZXZpdHRlIGFuZCBCb2RvIE1vZWxsZXJdCgogICopIERpc2FibGUgIkVDQ2RyYWZ0IiBjaXBoZXJzdWl0ZXMgbW9yZSB0aG9yb3VnaGx5LiAgTm93IHNwZWNpYWwKICAgICB0cmVhdG1lbnQgaW4gc3NsL3NzbF9jaXBoLnMgbWFrZXMgc3VyZSB0aGF0IHRoZXNlIGNpcGhlcnN1aXRlcwogICAgIGNhbm5vdCBiZSBpbXBsaWNpdGx5IGFjdGl2YXRlZCBhcyBwYXJ0IG9mLCBlLmcuLCB0aGUgIkFFUyIgYWxpYXMuCiAgICAgSG93ZXZlciwgcGxlYXNlIHVwZ3JhZGUgdG8gT3BlblNTTCAwLjkuOVstZGV2XSBmb3IKICAgICBub24tZXhwZXJpbWVudGFsIHVzZSBvZiB0aGUgRUNDIGNpcGhlcnN1aXRlcyB0byBnZXQgVExTIGV4dGVuc2lvbgogICAgIHN1cHBvcnQsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBjdXJ2ZSBhbmQgcG9pbnQgZm9ybWF0IG5lZ290aWF0aW9uCiAgICAgdG8gYXZvaWQgcG90ZW50aWFsIGhhbmRzaGFrZSBwcm9ibGVtcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEaXNhYmxlIHJvZ3VlIGNpcGhlcnN1aXRlczoKCiAgICAgIC0gU1NMdjIgMHgwOCAweDAwIDB4ODAgKCJSQzQtNjQtTUQ1IikKICAgICAgLSBTU0x2My9UTFN2MSAweDAwIDB4NjEgKCJFWFAxMDI0LVJDMi1DQkMtTUQ1IikKICAgICAgLSBTU0x2My9UTFN2MSAweDAwIDB4NjAgKCJFWFAxMDI0LVJDNC1NRDUiKQoKICAgICBUaGUgbGF0dGVyIHR3byB3ZXJlIHB1cnBvcnRlZGx5IGZyb20KICAgICBkcmFmdC1pZXRmLXRscy01Ni1iaXQtY2lwaGVyc3VpdGVzLTBbMDFdLnR4dCwgYnV0IGRvIG5vdCByZWFsbHkKICAgICBhcHBlYXIgdGhlcmUuCgogICAgIEFsc28gZGVhY3RpdmF0ZSB0aGUgcmVtYWluaW5nIGNpcGhlcnN1aXRlcyBmcm9tCiAgICAgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wMS50eHQuICBUaGVzZSBhcmUganVzdCBhcwogICAgIHVub2ZmaWNpYWwsIGFuZCB0aGUgSUQgaGFzIGxvbmcgZXhwaXJlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggUlNBIGJsaW5kaW5nIEhlaXNlbmJ1ZyAocHJvYmxlbXMgc29tZXRpbWVzIG9jY3VyZWQgb24KICAgICBkdWFsLWNvcmUgbWFjaGluZXMpIGFuZCBvdGhlciBwb3RlbnRpYWwgdGhyZWFkLXNhZmV0eSBpc3N1ZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHRoZSBzeW1tZXRyaWMgY2lwaGVyIENhbWVsbGlhICgxMjgtYml0LCAxOTItYml0LCAyNTYtYml0IGtleQogICAgIHZlcnNpb25zKSwgd2hpY2ggaXMgbm93IGF2YWlsYWJsZSBmb3Igcm95YWx0eS1mcmVlIHVzZQogICAgIChzZWUgaHR0cDovL2luZm8uaXNsLm50dC5jby5qcC9jcnlwdC9lbmcvaW5mby9jaGl0ZWtpLmh0bWwpLgogICAgIEFsc28sIGFkZCBDYW1lbGxpYSBUTFMgY2lwaGVyc3VpdGVzIGZyb20gUkZDIDQxMzIuCgogICAgIFRvIG1pbmltaXplIGNoYW5nZXMgYmV0d2VlbiBwYXRjaGxldmVscyBpbiB0aGUgT3BlblNTTCAwLjkuOAogICAgIHNlcmllcywgQ2FtZWxsaWEgcmVtYWlucyBleGNsdWRlZCBmcm9tIGNvbXBpbGF0aW9uIHVubGVzcyBPcGVuU1NMCiAgICAgaXMgY29uZmlndXJlZCB3aXRoICdlbmFibGUtY2FtZWxsaWEnLgogICAgIFtOVFRdCgogICopIERpc2FibGUgdGhlIHBhZGRpbmcgYnVnIGNoZWNrIHdoZW4gY29tcHJlc3Npb24gaXMgaW4gdXNlLiBUaGUgcGFkZGluZwogICAgIGJ1ZyBjaGVjayBhc3N1bWVzIHRoZSBmaXJzdCBwYWNrZXQgaXMgb2YgZXZlbiBsZW5ndGgsIHRoaXMgaXMgbm90CiAgICAgbmVjZXNzYXJpbHkgdHJ1ZSBpZiBjb21wcmVzc3Npb24gaXMgZW5hYmxlZCBhbmQgY2FuIHJlc3VsdCBpbiBmYWxzZQogICAgIHBvc2l0aXZlcyBjYXVzaW5nIGhhbmRzaGFrZSBmYWlsdXJlLiBUaGUgYWN0dWFsIGJ1ZyB0ZXN0IGlzIGFuY2llbnQKICAgICBjb2RlIHNvIGl0IGlzIGhvcGVkIHRoYXQgaW1wbGVtZW50YXRpb25zIHdpbGwgZWl0aGVyIGhhdmUgZml4ZWQgaXQgYnkKICAgICBub3cgb3IgYW55IHdoaWNoIHN0aWxsIGhhdmUgdGhlIGJ1ZyBkbyBub3Qgc3VwcG9ydCBjb21wcmVzc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGEgYW5kIDAuOS44YiAgWzA0IE1heSAyMDA2XQoKICAqKSBXaGVuIGFwcGx5aW5nIGEgY2lwaGVyIHJ1bGUgY2hlY2sgdG8gc2VlIGlmIHN0cmluZyBtYXRjaCBpcyBhbiBleHBsaWNpdAogICAgIGNpcGhlciBzdWl0ZSBhbmQgb25seSBtYXRjaCB0aGF0IG9uZSBjaXBoZXIgc3VpdGUgaWYgaXQgaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTGluayBpbiBtYW5pZmVzdHMgZm9yIFZDKysgaWYgbmVlZGVkLgogICAgIFtBdXN0aW4gWmllZ2xlciA8aGFsb3N0YXR1ZUBnbWFpbC5jb20+XQoKICAqKSBVcGRhdGUgc3VwcG9ydCBmb3IgRUNDLWJhc2VkIFRMUyBjaXBoZXJzdWl0ZXMgYWNjb3JkaW5nIHRvCiAgICAgZHJhZnQtaWV0Zi10bHMtZWNjLTEyLnR4dCB3aXRoIHByb3Bvc2VkIGNoYW5nZXMgKGJ1dCB3aXRob3V0CiAgICAgVExTIGV4dGVuc2lvbnMsIHdoaWNoIGFyZSBzdXBwb3J0ZWQgc3RhcnRpbmcgd2l0aCB0aGUgMC45LjkKICAgICBicmFuY2gsIG5vdCBpbiB0aGUgT3BlblNTTCAwLjkuOCBicmFuY2gpLgogICAgIFtEb3VnbGFzIFN0ZWJpbGFdCgogICopIE5ldyBmdW5jdGlvbnMgRVZQX0NJUEhFUl9DVFhfbmV3KCkgYW5kIEVWUF9DSVBIRVJfQ1RYX2ZyZWUoKSB0byBzdXBwb3J0CiAgICAgb3BhcXVlIEVWUF9DSVBIRVJfQ1RYIGhhbmRsaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIGFuZCBlbmhhbmNlbWVudHMgdG8gemxpYiBjb21wcmVzc2lvbiBjb2RlLiBXZSBub3cgb25seSB1c2UKICAgICAiemxpYjEuZGxsIiBhbmQgdXNlIHRoZSBkZWZhdWx0IF9fY2RlY2wgY2FsbGluZyBjb252ZW50aW9uIG9uIFdpbjMyCiAgICAgdG8gY29uZm9ybSB3aXRoIHRoZSBzdGFuZGFyZHMgbWVudGlvbmVkIGhlcmU6CiAgICAgICAgICAgaHR0cDovL3d3dy56bGliLm5ldC9ETExfRkFRLnR4dAogICAgIFN0YXRpYyB6bGliIGxpbmtpbmcgbm93IHdvcmtzIG9uIFdpbmRvd3MgYW5kIHRoZSBuZXcgLS13aXRoLXpsaWItaW5jbHVkZQogICAgIC0td2l0aC16bGliLWxpYiBvcHRpb25zIHRvIENvbmZpZ3VyZSBjYW4gYmUgdXNlZCB0byBzdXBwbHkgdGhlIGxvY2F0aW9uCiAgICAgb2YgdGhlIGhlYWRlcnMgYW5kIGxpYnJhcnkuIEdyYWNlZnVsbHkgaGFuZGxlIGNhc2Ugd2hlcmUgemxpYiBsaWJyYXJ5CiAgICAgY2FuJ3QgYmUgbG9hZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNldmVyYWwgZml4ZXMgYW5kIGVuaGFuY2VtZW50cyB0byB0aGUgT0lEIGdlbmVyYXRpb24gY29kZS4gVGhlIG9sZCBjb2RlCiAgICAgc29tZXRpbWVzIGFsbG93ZWQgaW52YWxpZCBPSURzICgxLlggZm9yIFggPj0gNDAgZm9yIGV4YW1wbGUpLCBjb3VsZG4ndAogICAgIGhhbmRsZSBudW1iZXJzIGxhcmdlciB0aGFuIFVMT05HX01BWCwgdHJ1bmNhdGVkIHByaW50aW5nIGFuZCBoYWQgYQogICAgIG5vbiBzdGFuZGFyZCBPQkpfb2JqMnR4dCgpIGJlaGF2aW91ci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgYnVpbGRpbmcgb2YgZW5naW5lcyB1bmRlciBlbmdpbmUvIGFzIHNoYXJlZCBsaWJyYXJpZXMKICAgICB1bmRlciBWQysrIGJ1aWxkIHN5c3RlbS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb3JyZWN0ZWQgdGhlIG51bWVyb3VzIGJ1Z3MgaW4gdGhlIFdpbjMyIHBhdGggc3BsaXR0ZXIgaW4gRFNPLgogICAgIEhvcGVmdWxseSwgd2Ugd2lsbCBub3Qgc2VlIGFueSBmYWxzZSBjb21iaW5hdGlvbiBvZiBwYXRocyBhbnkgbW9yZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOCBhbmQgMC45LjhhICBbMTEgT2N0IDIwMDVdCgogICopIFJlbW92ZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiBTU0xfT1BfTVNJRV9TU0xWMl9SU0FfUEFERElORwogICAgIChwYXJ0IG9mIFNTTF9PUF9BTEwpLiAgVGhpcyBvcHRpb24gdXNlZCB0byBkaXNhYmxlIHRoZQogICAgIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgbWFuLWluLXRoZS1taWRkbGUgcHJvdG9jb2wtdmVyc2lvbgogICAgIHJvbGxiYWNrIGluIHRoZSBTU0wgMi4wIHNlcnZlciBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggaXMgYSBiYWQKICAgICBpZGVhLiAgKENWRS0yMDA1LTI5NjkpCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgWXV0YWthIE9pd2EgKFJlc2VhcmNoIENlbnRlcgogICAgIGZvciBJbmZvcm1hdGlvbiBTZWN1cml0eSwgTmF0aW9uYWwgSW5zdGl0dXRlIG9mIEFkdmFuY2VkIEluZHVzdHJpYWwKICAgICBTY2llbmNlIGFuZCBUZWNobm9sb2d5IFtBSVNUXSwgSmFwYW4pXQoKICAqKSBBZGQgdHdvIGZ1bmN0aW9uIHRvIGNsZWFyIGFuZCByZXR1cm4gdGhlIHZlcmlmeSBwYXJhbWV0ZXIgZmxhZ3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgS2VlcCBjaXBoZXJsaXN0cyBzb3J0ZWQgaW4gdGhlIHNvdXJjZSBpbnN0ZWFkIG9mIHNvcnRpbmcgdGhlbSBhdAogICAgIHJ1bnRpbWUsIHRodXMgcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIGEgbG9jay4KICAgICBbTmlscyBMYXJzY2hdCgogICopIEF2b2lkIHNvbWUgc21hbGwgc3ViZ3JvdXAgYXR0YWNrcyBpbiBEaWZmaWUtSGVsbG1hbi4KICAgICBbTmljayBNYXRoZXdzb24gYW5kIEJlbiBMYXVyaWVdCgogICopIEFkZCBmdW5jdGlvbnMgZm9yIHdlbGwta25vd24gcHJpbWVzLgogICAgIFtOaWNrIE1hdGhld3Nvbl0KCiAgKikgRXh0ZW5kZWQgV2luZG93cyBDRSBzdXBwb3J0LgogICAgIFtTYXRvc2hpIE5ha2FtdXJhIGFuZCBBbmR5IFBvbHlha292XQoKICAqKSBJbml0aWFsaXplIFNTTF9NRVRIT0Qgc3RydWN0dXJlcyBhdCBjb21waWxlIHRpbWUgaW5zdGVhZCBvZiBkdXJpbmcKICAgICBydW50aW1lLCB0aHVzIHJlbW92aW5nIHRoZSBuZWVkIGZvciBhIGxvY2suCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBQS0NTN19kZWNyeXB0KCkgd29yayBldmVuIGlmIG5vIGNlcnRpZmljYXRlIGlzIHN1cHBsaWVkIGJ5CiAgICAgYXR0ZW1wdGluZyB0byBkZWNyeXB0IGVhY2ggZW5jcnlwdGVkIGtleSBpbiB0dXJuLiBBZGQgc3VwcG9ydCB0bwogICAgIHNtaW1lIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdoIGFuZCAwLjkuOCAgWzA1IEp1bCAyMDA1XQoKICBbTkI6IE9wZW5TU0wgMC45LjdpIGFuZCBsYXRlciAwLjkuNyBwYXRjaCBsZXZlbHMgd2VyZSByZWxlYXNlZCBhZnRlcgogIE9wZW5TU0wgMC45LjguXQoKICAqKSBBZGQgbGliY3J5cHRvLnBjIGFuZCBsaWJzc2wucGMgZm9yIHRob3NlIHdobyBmZWVsIHRoZXkgbmVlZCB0aGVtLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSBDQS5zaCBhbmQgQ0EucGwgc28gdGhleSBkb24ndCBidW5kbGUgdGhlIENTUiBhbmQgdGhlIHByaXZhdGUKICAgICBrZXkgaW50byB0aGUgc2FtZSBmaWxlIGFueSBtb3JlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBpbml0aWFsIHN1cHBvcnQgZm9yIFdpbjY0LCBib3RoIElBNjQgYW5kIEFNRDY0L3g2NCBmbGF2b3JzLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgLXV0ZjggY29tbWFuZCBsaW5lIGFuZCBjb25maWcgZmlsZSBvcHRpb24gdG8gJ2NhJy4KICAgICBbU3RlZmFuIDxzdGZAdWRvbWEub3JnXQoKICAqKSBSZW1vdmVkIHRoZSBtYWNybyBkZXNfY3J5cHQoKSwgYXMgaXQgc2VlbXMgdG8gY29uZmxpY3Qgd2l0aCBzb21lCiAgICAgbGlicmFyaWVzLiAgVXNlIERFU19jcnlwdCgpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENvcnJlY3QgbmFtaW5nIG9mIHRoZSAnY2hpbCcgYW5kICc0NzU4Y2NhJyBFTkdJTkVzLiBUaGlzCiAgICAgaW52b2x2ZXMgcmVuYW1pbmcgdGhlIHNvdXJjZSBhbmQgZ2VuZXJhdGVkIHNoYXJlZC1saWJzIGZvcgogICAgIGJvdGguIFRoZSBlbmdpbmVzIHdpbGwgYWNjZXB0IHRoZSBjb3JyZWN0ZWQgb3IgbGVnYWN5IGlkcwogICAgICgnbmNpcGhlcicgYW5kICc0NzU4X2NjYScgcmVzcGVjdGl2ZWx5KSB3aGVuIGJpbmRpbmcuIE5CLAogICAgIHRoaXMgb25seSBhcHBsaWVzIHdoZW4gYnVpbGRpbmcgJ3NoYXJlZCcuCiAgICAgW0NvcmlubmEgVmluc2NoZW4gPHZpbnNjaGVuQHJlZGhhdC5jb20+IGFuZCBHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhdHRyaWJ1dGUgZnVuY3Rpb25zIHRvIEVWUF9QS0VZIHN0cnVjdHVyZS4gTW9kaWZ5CiAgICAgUEtDUzEyX2NyZWF0ZSgpIHRvIHJlY29nbml6ZSBhIENTUCBuYW1lIGF0dHJpYnV0ZSBhbmQKICAgICB1c2UgaXQuIE1ha2UgLUNTUCBvcHRpb24gd29yayBhZ2FpbiBpbiBwa2NzMTIgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGZ1bmN0aW9uYWxpdHkgdG8gdGhlIGJuIGJsaW5kaW5nIGNvZGU6CiAgICAgLSBhdXRvbWF0aWMgcmUtY3JlYXRpb24gb2YgdGhlIEJOX0JMSU5ESU5HIHBhcmFtZXRlcnMgYWZ0ZXIKICAgICAgIGEgZml4ZWQgbnVtYmVyIG9mIHVzZXMgKGN1cnJlbnRseSAzMikKICAgICAtIGFkZCBuZXcgZnVuY3Rpb24gZm9yIHBhcmFtZXRlciBjcmVhdGlvbgogICAgIC0gaW50cm9kdWNlIGZsYWdzIHRvIGNvbnRyb2wgdGhlIHVwZGF0ZSBiZWhhdmlvdXIgb2YgdGhlCiAgICAgICBCTl9CTElORElORyBwYXJhbWV0ZXJzCiAgICAgLSBoaWRlIEJOX0JMSU5ESU5HIHN0cnVjdHVyZQogICAgIEFkZCBhIHNlY29uZCBCTl9CTElORElORyBzbG90IHRvIHRoZSBSU0Egc3RydWN0dXJlIHRvIGltcHJvdmUKICAgICBwZXJmb3JtYW5jZSB3aGVuIGEgc2luZ2xlIFJTQSBvYmplY3QgaXMgc2hhcmVkIGFtb25nIHNldmVyYWwKICAgICB0aHJlYWRzLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIERUTFMuCiAgICAgW05hZ2VuZHJhIE1vZGFkdWd1IDxuYWdlbmRyYUBjcy5zdGFuZm9yZC5lZHU+IGFuZCBCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgREVSIGVuY29kZWQgcHJpdmF0ZSBrZXlzIChTU0xfRklMRVRZUEVfQVNOMSkKICAgICB0byBTU0xfQ1RYX3VzZV9Qcml2YXRlS2V5X2ZpbGUoKSBhbmQgU1NMX3VzZV9Qcml2YXRlS2V5X2ZpbGUoKQogICAgIFtXYWx0ZXIgR291bGV0XQoKICAqKSBSZW1vdmUgYnVnZ3kgYW5kIGluY29tcGxldGUgREggY2VydCBzdXBwb3J0IGZyb20KICAgICBzc2wvc3NsX3JzYS5jIGFuZCBzc2wvczNfYm90aC5jCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBVc2UgU0hBLTEgaW5zdGVhZCBvZiBNRDUgYXMgdGhlIGRlZmF1bHQgZGlnZXN0IGFsZ29yaXRobSBmb3IKICAgICB0aGUgYXBwcy9vcGVuc3NsIGFwcGxpY2F0aW9ucy4KICAgICBbTmlscyBMYXJzY2hdCgogICopIENvbXBpbGUgY2xlYW4gd2l0aCAiLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMKICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdlcnJvciIuIEN1cnJlbnRseQogICAgIERFQlVHX1NBRkVTVEFDSyBtdXN0IGFsc28gYmUgc2V0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDaGFuZ2UgLi9Db25maWd1cmUgc28gdGhhdCBjZXJ0YWluIGFsZ29yaXRobXMgY2FuIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuCiAgICAgVGhlIG5ldyBjb3VudGVycGllY2UgdG8gIm5vLXh4eCIgaXMgImVuYWJsZS14eHgiLgoKICAgICBUaGUgcGF0ZW50ZWQgUkM1IGFuZCBNREMyIGFsZ29yaXRobXMgd2lsbCBub3cgYmUgZGlzYWJsZWQgdW5sZXNzCiAgICAgImVuYWJsZS1yYzUiIGFuZCAiZW5hYmxlLW1kYzIiLCByZXNwZWN0aXZlbHksIGFyZSBzcGVjaWZpZWQuCgogICAgIChJREVBIHJlbWFpbnMgZW5hYmxlZCBkZXNwaXRlIGJlaW5nIHBhdGVudGVkLiAgVGhpcyBpcyBiZWNhdXNlIElERUEKICAgICBpcyBmcmVxdWVudGx5IHJlcXVpcmVkIGZvciBpbnRlcm9wZXJhYmlsaXR5LCBhbmQgdGhlcmUgaXMgbm8gbGljZW5zZQogICAgIGZlZSBmb3Igbm9uLWNvbW1lcmNpYWwgdXNlLiAgQXMgYmVmb3JlLCAibm8taWRlYSIgY2FuIGJlIHVzZWQgdG8KICAgICBhdm9pZCB0aGlzIGFsZ29yaXRobS4pCgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBwcm9jZXNzaW5nIG9mIHByb3h5IGNlcnRpZmljYXRlcyAoc2VlIFJGQyAzODIwKS4gIFRoaXMgd29yayB3YXMKICAgICBzcG9uc29yZWQgYnkgS1RIIChUaGUgUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kgaW4gU3RvY2tob2xtKSBhbmQKICAgICBFR0VFIChFbmFibGluZyBHcmlkcyBmb3IgRS1zY2llbmNlIGluIEV1cm9wZSkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUkM0IHBlcmZvcm1hbmNlIG92ZXJoYXVsIG9uIG1vZGVybiBhcmNoaXRlY3R1cmVzL2ltcGxlbWVudGF0aW9ucywgc3VjaAogICAgIGFzIEludGVsIFA0LCBJQS02NCBhbmQgQU1ENjQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE5ldyB1dGlsaXR5IGV4dHJhY3Qtc2VjdGlvbi5wbC4gVGhpcyBjYW4gYmUgdXNlZCBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlCiAgICAgc2VjdGlvbiBudW1iZXIgaW4gYSBwb2QgZmlsZSBpbnN0ZWFkIG9mIGhhdmluZyB0byB0cmVhdCBlYWNoIGZpbGUgYXMKICAgICBhIHNlcGFyYXRlIGNhc2UgaW4gTWFrZWZpbGUuIFRoaXMgY2FuIGJlIGRvbmUgYnkgYWRkaW5nIHR3byBsaW5lcyB0byB0aGUKICAgICBwb2QgZmlsZToKCiAgICAgPWZvciBjb21tZW50IG9wZW5zc2xfc2VjdGlvbjpYWFgKCiAgICAgVGhlIGJsYW5rIGxpbmUgaXMgbWFuZGF0b3J5LgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgYXJndW1lbnRzIC1jZXJ0Zm9ybSwgLWtleWZvcm0gYW5kIC1wYXNzIGZvciBzX2NsaWVudCBhbmQgc19zZXJ2ZXIKICAgICB0byBhbGxvdyBhbHRlcm5hdGl2ZSBmb3JtYXQga2V5IGFuZCBjZXJ0aWZpY2F0ZSBmaWxlcyBhbmQgcGFzc3BocmFzZQogICAgIHNvdXJjZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHN0cnVjdHVyZSBYNTA5X1ZFUklGWV9QQVJBTSB3aGljaCBjb21iaW5lcyBjdXJyZW50IHZlcmlmeSBwYXJhbWV0ZXJzLAogICAgIHVwZGF0ZSBhc3NvY2lhdGVkIHN0cnVjdHVyZXMgYW5kIGFkZCB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zLgoKICAgICBBZGQgbmV3IHBvbGljeSByZWxhdGVkIHZlcmlmeSBwYXJhbWV0ZXJzLCBpbmNsdWRlIHBvbGljeSBjaGVja2luZyBpbiAKICAgICBzdGFuZGFyZCB2ZXJpZnkgY29kZS4gRW5oYW5jZSAnc21pbWUnIGFwcGxpY2F0aW9uIHdpdGggZXh0cmEgcGFyYW1ldGVycwogICAgIHRvIHN1cHBvcnQgcG9saWN5IGNoZWNraW5nIGFuZCBwcmludCBvdXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IGVuZ2luZSB0byBzdXBwb3J0IFZJQSBQYWRMb2NrIEFDRSBleHRlbnNpb25zIGluIHRoZSBWSUEgQzMKICAgICBOZWhlbWlhaCBwcm9jZXNzb3JzLiBUaGVzZSBleHRlbnNpb25zIHN1cHBvcnQgQUVTIGVuY3J5cHRpb24gaW4gaGFyZHdhcmUKICAgICBhcyB3ZWxsIGFzIFJORyAodGhvdWdoIFJORyBzdXBwb3J0IGlzIGN1cnJlbnRseSBkaXNhYmxlZCkuCiAgICAgW01pY2hhbCBMdWR2aWcgPG1pY2hhbEBsb2dpeC5jej4sIHdpdGggaGVscCBmcm9tIEFuZHkgUG9seWFrb3ZdCgogICopIERlcHJlY2F0ZSBCTl9bZ2V0fHNldF1fcGFyYW1zKCkgZnVuY3Rpb25zICh0aGV5IHdlcmUgaWdub3JlZCBpbnRlcm5hbGx5KS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBOZXcgRklQUyAxODAtMiBhbGdvcml0aG1zLCBTSEEtMjI0Ly0yNTYvLTM4NC8tNTEyIGFyZSBpbXBsZW1lbnRlZC4KICAgICBbQW5keSBQb2x5YWtvdiBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgcGVvcGxlXQoKICAqKSBJbXByb3ZlZCBQb3dlclBDIHBsYXRmb3JtIHN1cHBvcnQuIE1vc3Qgbm90YWJseSBCSUdOVU0gYXNzZW1ibGVyCiAgICAgaW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgSUJNLgogICAgIFtTdXJlc2ggQ2hhcmksIFBldGVyIFdhbHRlbmJlcmcsIEFuZHkgUG9seWFrb3ZdCgogICopIFRoZSBuZXcgJ1JTQV9nZW5lcmF0ZV9rZXlfZXgnIGZ1bmN0aW9uIG5vdyB0YWtlcyBhIEJJR05VTSBmb3IgdGhlIHB1YmxpYwogICAgIGV4cG9uZW50IHJhdGhlciB0aGFuICd1bnNpZ25lZCBsb25nJy4gVGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIGNoYW5nZSB0bwogICAgIHRoZSBuZXcgJ3JzYV9rZXlnZW4nIGVsZW1lbnQgb2YgdGhlIFJTQV9NRVRIT0Qgc3RydWN0dXJlLgogICAgIFtKZWx0ZSBKYW5zZW4sIEdlb2ZmIFRob3JwZV0KCiAgKikgRnVuY3Rpb25hbGl0eSBmb3IgY3JlYXRpbmcgdGhlIGluaXRpYWwgc2VyaWFsIG51bWJlciBmaWxlIGlzIG5vdwogICAgIG1vdmVkIGZyb20gQ0EucGwgdG8gdGhlICdjYScgdXRpbGl0eSB3aXRoIGEgbmV3IG9wdGlvbiAtY3JlYXRlX3NlcmlhbC4KCiAgICAgKEJlZm9yZSBPcGVuU1NMIDAuOS43ZSwgQ0EucGwgdXNlZCB0byBpbml0aWFsaXplIHRoZSBzZXJpYWwKICAgICBudW1iZXIgZmlsZSB0byAxLCB3aGljaCBpcyBib3VuZCB0byBjYXVzZSBwcm9ibGVtcy4gIFRvIGF2b2lkCiAgICAgdGhlIHByb2JsZW1zIHdoaWxlIHJlc3BlY3RpbmcgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGRpZmZlcmVudCAwLjkuNwogICAgIHBhdGNobGV2ZWxzLCAwLjkuN2UgIGVtcGxveWVkICdvcGVuc3NsIHg1MDkgLW5leHRfc2VyaWFsJyBpbgogICAgIENBLnBsIGZvciBzZXJpYWwgbnVtYmVyIGluaXRpYWxpemF0aW9uLiAgV2l0aCB0aGUgbmV3IHJlbGVhc2UgMC45LjgsCiAgICAgd2UgY2FuIGZpeCB0aGUgcHJvYmxlbSBkaXJlY3RseSBpbiB0aGUgJ2NhJyB1dGlsaXR5LikKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWR1Y2VkIGhlYWRlciBpbnRlcmRlcGVuY2llcyBieSBkZWNsYXJpbmcgbW9yZSBvcGFxdWUgb2JqZWN0cyBpbgogICAgIG9zc2xfdHlwLmguIEFzIGEgY29uc2VxdWVuY2UsIGluY2x1ZGluZyBzb21lIGhlYWRlcnMgKGVnLiBlbmdpbmUuaCkgd2lsbAogICAgIGdpdmUgZmV3ZXIgcmVjdXJzaXZlIGluY2x1ZGVzLCB3aGljaCBjb3VsZCBicmVhayBsYXp5IHNvdXJjZSBjb2RlIC0gc28KICAgICB0aGlzIGNoYW5nZSBpcyBjb3ZlcmVkIGJ5IHRoZSBPUEVOU1NMX05PX0RFUFJFQ0FURUQgc3ltYm9sLiBBcyBhbHdheXMsCiAgICAgZGV2ZWxvcGVycyBzaG91bGQgZGVmaW5lIHRoaXMgc3ltYm9sIHdoZW4gYnVpbGRpbmcgYW5kIHVzaW5nIG9wZW5zc2wgdG8KICAgICBlbnN1cmUgdGhleSB0cmFjayB0aGUgcmVjb21tZW5kZWQgYmVoYXZpb3VyLCBpbnRlcmZhY2VzLCBbZXRjXSwgYnV0CiAgICAgYmFja3dhcmRzLWNvbXBhdGlibGUgYmVoYXZpb3VyIHByZXZhaWxzIHdoZW4gdGhpcyBpc24ndCBkZWZpbmVkLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X1BPTElDWV9OT0RFX3ByaW50KCkgd2hpY2ggcHJpbnRzIG91dCBwb2xpY3kgbm9kZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBFVlAgZnVuY3Rpb24gRVZQX0NJUEhFUl9DVFhfcmFuZF9rZXkgYW5kIGFzc29jaWF0ZWQgZnVuY3Rpb25hbGl0eS4KICAgICBUaGlzIHdpbGwgZ2VuZXJhdGUgYSByYW5kb20ga2V5IG9mIHRoZSBhcHByb3ByaWF0ZSBsZW5ndGggYmFzZWQgb24gdGhlIAogICAgIGNpcGhlciBjb250ZXh0LiBUaGUgRVZQX0NJUEhFUiBjYW4gcHJvdmlkZSBpdHMgb3duIHJhbmRvbSBrZXkgZ2VuZXJhdGlvbgogICAgIHJvdXRpbmUgdG8gc3VwcG9ydCBrZXlzIG9mIGEgc3BlY2lmaWMgZm9ybS4gVGhpcyBpcyB1c2VkIGluIHRoZSBkZXMgYW5kIAogICAgIDNkZXMgcm91dGluZXMgdG8gZ2VuZXJhdGUgYSBrZXkgb2YgdGhlIGNvcnJlY3QgcGFyaXR5LiBVcGRhdGUgUy9NSU1FCiAgICAgY29kZSB0byB1c2UgbmV3IGZ1bmN0aW9ucyBhbmQgaGVuY2UgZ2VuZXJhdGUgY29ycmVjdCBwYXJpdHkgREVTIGtleXMuCiAgICAgQWRkIEVWUF9DSEVDS19ERVNfS0VZICNkZWZpbmUgdG8gcmV0dXJuIGFuIGVycm9yIGlmIHRoZSBrZXkgaXMgbm90IAogICAgIHZhbGlkICh3ZWFrIG9yIGluY29ycmVjdCBwYXJpdHkpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGxvY2FsIHNldCBvZiBDUkxzIHRoYXQgY2FuIGJlIHVzZWQgYnkgWDUwOV92ZXJpZnlfY2VydCgpIGFzIHdlbGwKICAgICBhcyBsb29raW5nIHRoZW0gdXAuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHZlcmlmaWVkIHN0cnVjdHVyZSBtYXkgY29udGFpbgogICAgIENSTHMsIGZvciBleGFtcGxlIFBLQ1MjNyBzaWduZWREYXRhLiBNb2RpZnkgUEtDUzdfdmVyaWZ5KCkgdG8gdXNlIGFueSBDUkxzCiAgICAgcHJlc2VudCB1bmxlc3MgdGhlIG5ldyBQS0NTN19OT19DUkwgZmxhZyBpcyBhc3NlcnRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbmQgQVNOMSBvaWQgY29uZmlndXJhdGlvbiBtb2R1bGUuIEl0IG5vdyBhZGRpdGlvbmFsbHkgYWNjZXB0cyB0aGUKICAgICBzeW50YXg6CgogICAgIHNob3J0TmFtZSA9IHNvbWUgbG9uZyBuYW1lLCAxLjIuMy40CiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVpbXBsZW1lbnRlZCB0aGUgQk5fQ1RYIGltcGxlbWVudGF0aW9uLiBUaGVyZSBpcyBub3cgbm8gbW9yZSBzdGF0aWMKICAgICBsaW1pdGF0aW9uIG9uIHRoZSBudW1iZXIgb2YgdmFyaWFibGVzIGl0IGNhbiBoYW5kbGUgbm9yIHRoZSBkZXB0aCBvZiB0aGUKICAgICAic3RhY2siIGhhbmRsaW5nIGZvciBCTl9DVFhfc3RhcnQoKS9CTl9DVFhfZW5kKCkgcGFpcnMuIFRoZSBzdGFjawogICAgIGluZm9ybWF0aW9uIGNhbiBub3cgZXhwYW5kIGFzIHJlcXVpcmVkLCBhbmQgcmF0aGVyIHRoYW4gaGF2aW5nIGEgc2luZ2xlCiAgICAgc3RhdGljIGFycmF5IG9mIGJpZ251bXMsIEJOX0NUWCBub3cgdXNlcyBhIGxpbmtlZC1saXN0IG9mIHN1Y2ggYXJyYXlzCiAgICAgYWxsb3dpbmcgaXQgdG8gZXhwYW5kIG9uIGRlbWFuZCB3aGlsc3QgbWFpbnRhaW5pbmcgdGhlIHVzZWZ1bG5lc3Mgb2YKICAgICBCTl9DVFgncyAiYnVuZGxpbmciLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhIG1pc3NpbmcgQk5fQ1RYIHBhcmFtZXRlciB0byB0aGUgJ3JzYV9tb2RfZXhwJyBjYWxsYmFjayBpbiBSU0FfTUVUSE9ECiAgICAgdG8gYWxsb3cgYWxsIFJTQSBvcGVyYXRpb25zIHRvIGZ1bmN0aW9uIHVzaW5nIGEgc2luZ2xlIEJOX0NUWC4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBjZXJ0aWZpY2F0ZSBwb2xpY3kgZXZhbHVhdGlvbiBhbmQgY2hlY2tpbmcuIFRoaXMKICAgICBpcyBpbml0aWFsbHkgaW50ZW5kZWQgdG8gcGFzcyB0aGUgdGVzdHMgb3V0bGluZWQgaW4gIkNvbmZvcm1hbmNlIFRlc3RpbmcKICAgICBvZiBSZWx5aW5nIFBhcnR5IENsaWVudCBDZXJ0aWZpY2F0ZSBQYXRoIFByb2Nlc3NpbmcgTG9naWMiIHYxLjA3LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIGJuX2R1cF9leHBhbmQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBpdCB3YXMgaW50cm9kdWNlZCBpbiAwLjkuNyBhbmQKICAgICByZW1haW5lZCB1bnVzZWQgYW5kIG5vdCB0aGF0IHVzZWZ1bC4gQSB2YXJpZXR5IG9mIG90aGVyIGxpdHRsZSBiaWdudW0KICAgICB0d2Vha3MgYW5kIGZpeGVzIGhhdmUgYWxzbyBiZWVuIG1hZGUgY29udGludWluZyBvbiBmcm9tIHRoZSBhdWRpdCAoc2VlCiAgICAgYmVsb3cpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIENvbnN0aWZ5IGFsbCBvciBhbG1vc3QgYWxsIGQyaSwgYzJpLCBzMmkgYW5kIHIyaSBmdW5jdGlvbnMsIGFsb25nIHdpdGgKICAgICBhc3NvY2lhdGVkIEFTTjEsIEVWUCBhbmQgU1NMIGZ1bmN0aW9ucyBhbmQgb2xkIEFTTjEgbWFjcm9zLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEJOX3plcm8oKSBvbmx5IG5lZWRzIHRvIHNldCAndG9wJyBhbmQgJ25lZycgdG8gemVybyBmb3IgY29ycmVjdCByZXN1bHRzLAogICAgIGFuZCB0aGlzIHNob3VsZCBuZXZlciBmYWlsLiBTbyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIHVzZSBvZgogICAgIEJOX3NldF93b3JkKCkgKHdoaWNoIGNhbiBmYWlsIGR1ZSB0byBuZWVkbGVzcyBleHBhbnNpb24pIGlzIG5vdyBkZXByZWNhdGVkOwogICAgIGlmIE9QRU5TU0xfTk9fREVQUkVDQVRFRCBpcyBkZWZpbmVkLCBCTl96ZXJvKCkgaXMgYSB2b2lkIG1hY3JvLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEJOX0NUWF9nZXQoKSBzaG91bGQgcmV0dXJuIHplcm8tdmFsdWVkIGJpZ251bXMsIHByb3ZpZGluZyB0aGUgc2FtZQogICAgIGluaXRpYWxpc2VkIHZhbHVlIGFzIEJOX25ldygpLgogICAgIFtHZW9mZiBUaG9ycGUsIHN1Z2dlc3RlZCBieSBVbGYgTfZsbGVyXQoKICAqKSBTdXBwb3J0IGZvciBpbmhpYml0QW55UG9saWN5IGNlcnRpZmljYXRlIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbiBhdWRpdCBvZiB0aGUgQklHTlVNIGNvZGUgaXMgdW5kZXJ3YXksIGZvciB3aGljaCBkZWJ1Z2dpbmcgY29kZSBpcwogICAgIGVuYWJsZWQgd2hlbiBCTl9ERUJVRyBpcyBkZWZpbmVkLiBUaGlzIG1ha2VzIHN0cmljdGVyIGVuZm9yY2VtZW50cyBvbiB3aGF0CiAgICAgaXMgY29uc2lkZXJlZCB2YWxpZCB3aGVuIHByb2Nlc3NpbmcgQklHTlVNcywgYW5kIGNhdXNlcyBleGVjdXRpb24gdG8KICAgICBhc3NlcnQoKSB3aGVuIGEgcHJvYmxlbSBpcyBkaXNjb3ZlcmVkLiBJZiBCTl9ERUJVR19SQU5EIGlzIGRlZmluZWQsCiAgICAgZnVydGhlciBzdGVwcyBhcmUgdGFrZW4gdG8gZGVsaWJlcmF0ZWx5IHBvbGx1dGUgdW51c2VkIGRhdGEgaW4gQklHTlVNCiAgICAgc3RydWN0dXJlcyB0byB0cnkgYW5kIGV4cG9zZSBmYXVsdHkgY29kZSBmdXJ0aGVyIG9uLiBGb3Igbm93LCBvcGVuc3NsIHdpbGwKICAgICAoaW4gaXRzIGRlZmF1bHQgbW9kZSBvZiBvcGVyYXRpb24pIGNvbnRpbnVlIHRvIHRvbGVyYXRlIHRoZSBpbmNvbnNpc3RlbnQKICAgICBmb3JtcyB0aGF0IGl0IGhhcyB0b2xlcmF0ZWQgaW4gdGhlIHBhc3QsIGJ1dCBhdXRob3JzIGFuZCBwYWNrYWdlcnMgc2hvdWxkCiAgICAgY29uc2lkZXIgdHJ5aW5nIG9wZW5zc2wgYW5kIHRoZWlyIG93biBhcHBsaWNhdGlvbnMgd2hlbiBjb21waWxlZCB3aXRoCiAgICAgdGhlc2UgZGVidWdnaW5nIHN5bWJvbHMgZGVmaW5lZC4gSXQgd2lsbCBoZWxwIGhpZ2hsaWdodCBwb3RlbnRpYWwgYnVncyBpbgogICAgIHRoZWlyIG93biBjb2RlLCBhbmQgd2lsbCBpbXByb3ZlIHRoZSB0ZXN0IGNvdmVyYWdlIGZvciBPcGVuU1NMIGl0c2VsZi4gQXQKICAgICBzb21lIHBvaW50LCB0aGVzZSB0aWdodGVyIHJ1bGVzIHdpbGwgYmVjb21lIG9wZW5zc2wncyBkZWZhdWx0IHRvIGltcHJvdmUKICAgICBtYWludGFpbmFiaWxpdHksIHRob3VnaCB0aGUgYXNzZXJ0KClzIGFuZCBvdGhlciBvdmVyaGVhZHMgd2lsbCByZW1haW4gb25seQogICAgIGluIGRlYnVnZ2luZyBjb25maWd1cmF0aW9ucy4gU2VlIGJuLmggZm9yIG1vcmUgZGV0YWlscy4KICAgICBbR2VvZmYgVGhvcnBlLCBOaWxzIExhcnNjaCwgVWxmIE32bGxlcl0KCiAgKikgQk5fQ1RYX2luaXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBhcyBCTl9DVFggaXMgYW4gb3BhcXVlIHN0cnVjdHVyZQogICAgIHRoYXQgY2FuIG9ubHkgYmUgb2J0YWluZWQgdGhyb3VnaCBCTl9DVFhfbmV3KCkgKHdoaWNoIGltcGxpY2l0bHkKICAgICBpbml0aWFsaXNlcyBpdCkuIFRoZSBwcmVzZW5jZSBvZiB0aGlzIGZ1bmN0aW9uIG9ubHkgbWFkZSBpdCBwb3NzaWJsZQogICAgIHRvIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBzdHJ1Y3R1cmUgKGFuZCBjYXVzZSBtZW1vcnkgbGVha3MpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEJlY2F1c2Ugb2YgdGhlIGNhbGxiYWNrLWJhc2VkIGFwcHJvYWNoIGZvciBpbXBsZW1lbnRpbmcgTEhBU0ggYXMgYQogICAgIHRlbXBsYXRlIHR5cGUsIGxoX2luc2VydCgpIGFkZHMgb3BhcXVlIG9iamVjdHMgdG8gaGFzaC10YWJsZXMgYW5kCiAgICAgbGhfZG9hbGwoKSBvciBsaF9kb2FsbF9hcmcoKSBhcmUgdHlwaWNhbGx5IHVzZWQgd2l0aCBhIGRlc3RydWN0b3IgY2FsbGJhY2sKICAgICB0byBjbGVhbiB1cCB0aG9zZSBjb3JyZXNwb25kaW5nIG9iamVjdHMgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGhhc2ggdGFibGUKICAgICAoYW5kIGxvc2luZyB0aGUgb2JqZWN0IHBvaW50ZXJzKS4gU28gc29tZSBvdmVyLXplYWxvdXMgY29uc3RpZmljYXRpb25zIGluCiAgICAgTEhBU0ggaGF2ZSBiZWVuIHJlbGF4ZWQgc28gdGhhdCBsaF9pbnNlcnQoKSBkb2VzIG5vdCB0YWtlIChub3Igc3RvcmUpIHRoZQogICAgIG9iamVjdHMgYXMgImNvbnN0IiBhbmQgdGhlIGxoX2RvYWxsW19hcmddIGNhbGxiYWNrIHdyYXBwZXJzIGFyZSBub3QKICAgICBwcm90b3R5cGVkIHRvIGhhdmUgImNvbnN0IiByZXN0cmljdGlvbnMgb24gdGhlIG9iamVjdCBwb2ludGVycyB0aGV5IGFyZQogICAgIGdpdmVuIChhbmQgc28gYXJlbid0IHJlcXVpcmVkIHRvIGNhc3QgdGhlbSBhd2F5IGFueSBtb3JlKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBUaGUgdG1kaWZmLmggQVBJIHdhcyBzbyB1Z2x5IGFuZCBtaW5pbWFsIHRoYXQgb3VyIG93biB0aW1pbmcgdXRpbGl0eQogICAgIChzcGVlZCkgcHJlZmVycyB0byB1c2UgaXRzIG93biBpbXBsZW1lbnRhdGlvbi4gVGhlIHR3byBpbXBsZW1lbnRhdGlvbnMKICAgICBoYXZlbid0IGJlZW4gY29uc29saWRhdGVkIGFzIHlldCAodm9sdW50ZWVycz8pIGJ1dCB0aGUgdG1kaWZmIEFQSSBoYXMgaGFkCiAgICAgaXRzIG9iamVjdCB0eXBlIHByb3Blcmx5IGV4cG9zZWQgKE1TX1RNKSBpbnN0ZWFkIG9mIGNhc3RpbmcgdG8vZnJvbSAiY2hhcgogICAgICoiLiBUaGlzIG1heSBzdGlsbCBjaGFuZ2UgeWV0IGlmIHNvbWVvbmUgcmVhbGlzZXMgTVNfVE0gYW5kICJtc190aW1lXyoqKiIKICAgICBhcmVuJ3QgbmVjZXNzYXJpbHkgdGhlIGdyZWF0ZXN0IG5vbWVuY2xhdHVyZXMgLSBidXQgdGhpcyBpcyB3aGF0IHdhcyB1c2VkCiAgICAgaW50ZXJuYWxseSB0byB0aGUgaW1wbGVtZW50YXRpb24gc28gSSd2ZSB1c2VkIHRoYXQgZm9yIG5vdy4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBFbnN1cmUgdGhhdCBkZXByZWNhdGVkIGZ1bmN0aW9ucyBkbyBub3QgZ2V0IGNvbXBpbGVkIHdoZW4KICAgICBPUEVOU1NMX05PX0RFUFJFQ0FURUQgaXMgZGVmaW5lZC4gU29tZSAib3BlbnNzbCIgc3ViY29tbWFuZHMgYW5kIGEgZmV3IG9mCiAgICAgdGhlIHNlbGYtdGVzdHMgd2VyZSBzdGlsbCB1c2luZyBkZXByZWNhdGVkIGtleS1nZW5lcmF0aW9uIGZ1bmN0aW9ucyBzbwogICAgIHRoZXNlIGhhdmUgYmVlbiB1cGRhdGVkIGFsc28uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgUmVvcmdhbmlzZSBQS0NTIzcgY29kZSB0byBzZXBhcmF0ZSB0aGUgZGlnZXN0IGxvY2F0aW9uIGZ1bmN0aW9uYWxpdHkKICAgICBpbnRvIFBLQ1M3X2ZpbmRfZGlnZXN0KCksIGRpZ2VzdCBhZGRpdGlvbiBpbnRvIFBLQ1M3X2Jpb19hZGRfZGlnZXN0KCkuCiAgICAgTmV3IGZ1bmN0aW9uIFBLQ1M3X3NldF9kaWdlc3QoKSB0byBzZXQgdGhlIGRpZ2VzdCB0eXBlIGZvciBQS0NTIzcKICAgICBkaWdlc3RlZERhdGEgdHlwZS4gQWRkIGFkZGl0aW9uYWwgY29kZSB0byBjb3JyZWN0bHkgZ2VuZXJhdGUgdGhlCiAgICAgZGlnZXN0ZWREYXRhIHR5cGUgYW5kIGFkZCBzdXBwb3J0IGZvciB0aGlzIHR5cGUgaW4gUEtDUzcgaW5pdGlhbGl6YXRpb24KICAgICBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFBLQ1M3X3NldDBfdHlwZV9vdGhlcigpIHRoaXMgaW5pdGlhbGl6ZXMgYSBQS0NTNyAKICAgICBzdHJ1Y3R1cmUgb2YgdHlwZSAib3RoZXIiLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBwcmltZSBnZW5lcmF0aW9uIGxvb3AgaW4gY3J5cHRvL2JuL2JuX3ByaW1lLnBsIGJ5IG1ha2luZwogICAgIHN1cmUgdGhlIGxvb3AgZG9lcyBjb3JyZWN0bHkgc3RvcCBhbmQgYnJlYWtpbmcgKCJkaXZpc2lvbiBieSB6ZXJvIikKICAgICBtb2R1bHVzIG9wZXJhdGlvbnMgYXJlIG5vdCBwZXJmb3JtZWQuIFRoZSAocHJlLWdlbmVyYXRlZCkgcHJpbWUKICAgICB0YWJsZSBjcnlwdG8vYm4vYm5fcHJpbWUuaCB3YXMgYWxyZWFkeSBjb3JyZWN0LCBidXQgaXQgY291bGQgbm90IGJlCiAgICAgcmUtZ2VuZXJhdGVkIG9uIHNvbWUgcGxhdGZvcm1zIGJlY2F1c2Ugb2YgdGhlICJkaXZpc2lvbiBieSB6ZXJvIgogICAgIHNpdHVhdGlvbiBpbiB0aGUgc2NyaXB0LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBVcGRhdGUgc3VwcG9ydCBmb3IgRUNDLWJhc2VkIFRMUyBjaXBoZXJzdWl0ZXMgYWNjb3JkaW5nIHRvCiAgICAgZHJhZnQtaWV0Zi10bHMtZWNjLTAzLnR4dDogdGhlIEtERjEga2V5IGRlcml2YXRpb24gZnVuY3Rpb24gd2l0aAogICAgIFNIQS0xIG5vdyBpcyBvbmx5IHVzZWQgZm9yICJzbWFsbCIgY3VydmVzICh3aGVyZSB0aGUKICAgICByZXByZXNlbnRhdGlvbiBvZiBhIGZpZWxkIGVsZW1lbnQgdGFrZXMgdXAgdG8gMjQgYnl0ZXMpOyBmb3IKICAgICBsYXJnZXIgY3VydmVzLCB0aGUgZmllbGQgZWxlbWVudCByZXN1bHRpbmcgZnJvbSBFQ0RIIGlzIGRpcmVjdGx5CiAgICAgdXNlZCBhcyBwcmVtYXN0ZXIgc2VjcmV0LgogICAgIFtEb3VnbGFzIFN0ZWJpbGEgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIGNvZGUgZm9yIGtQK2xRIHRpbWluZ3MgdG8gY3J5cHRvL2VjL2VjdGVzdC5jLCBhbmQgYWRkIFNFQzIKICAgICBjdXJ2ZSBzZWNwMTYwcjEgdG8gdGhlIHRlc3RzLgogICAgIFtEb3VnbGFzIFN0ZWJpbGEgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBsb2FkIHN5bWJvbHMgZ2xvYmFsbHkgd2l0aCBEU08uCiAgICAgW0f2dHogQmFiaW4tRWJlbGwgPGJhYmluLWViZWxsQHRydXN0Y2VudGVyLmRlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZ1bmN0aW9ucyBFUlJfc2V0X21hcmsoKSBhbmQgRVJSX3BvcF90b19tYXJrKCkgZm9yIGJldHRlcgogICAgIGNvbnRyb2wgb2YgdGhlIGVycm9yIHN0YWNrLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBzdXBwb3J0IGZvciBTVE9SRSBpbiBFTkdJTkUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBTVE9SRSB0eXBlLiAgVGhlIGludGVudGlvbiBpcyB0byBwcm92aWRlIGEgY29tbW9uIGludGVyZmFjZQogICAgIHRvIGNlcnRpZmljYXRlIGFuZCBrZXkgc3RvcmVzLCBiZSB0aGV5IHNpbXBsZSBmaWxlLWJhc2VkIHN0b3Jlcywgb3IKICAgICBIU00tdHlwZSBzdG9yZSwgb3IgTERBUCBzdG9yZXMsIG9yLi4uCiAgICAgTk9URTogVGhlIGNvZGUgaXMgY3VycmVudGx5IFVOVEVTVEVEIGFuZCBpc24ndCByZWFsbHkgdXNlZCBhbnl3aGVyZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgYSBnZW5lcmljIHN0cnVjdHVyZSBjYWxsZWQgT1BFTlNTTF9JVEVNLiAgVGhpcyBjYW4gYmUgdXNlZCB0bwogICAgIHBhc3MgYSBsaXN0IG9mIGFyZ3VtZW50cyB0byBhbnkgZnVuY3Rpb24gYXMgd2VsbCBhcyBwcm92aWRlIGEgd2F5CiAgICAgZm9yIGEgZnVuY3Rpb24gdG8gcGFzcyBkYXRhIGJhY2sgdG8gdGhlIGNhbGxlci4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZ1bmN0aW9ucyBCVUZfc3RybmR1cCgpIGFuZCBCVUZfbWVtZHVwKCkuICBCVUZfc3RybmR1cCgpCiAgICAgd29ya3MgbGlrZSBCVUZfc3RyZHVwKCkgYnV0IGNhbiBiZSB1c2VkIHRvIGR1cGxpY2F0ZSBhIHBvcnRpb24gb2YKICAgICBhIHN0cmluZy4gIFRoZSBjb3B5IGdldHMgTlVMLXRlcm1pbmF0ZWQuICBCVUZfbWVtZHVwKCkgZHVwbGljYXRlcwogICAgIGEgbWVtb3J5IGFyZWEuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmdW5jdGlvbiBza19maW5kX2V4KCkgd2hpY2ggd29ya3MgbGlrZSBza19maW5kKCksIGJ1dCB3aWxsCiAgICAgcmV0dXJuIGFuIGluZGV4IHRvIGFuIGVsZW1lbnQgZXZlbiBpZiBhbiBleGFjdCBtYXRjaCBjb3VsZG4ndCBiZQogICAgIGZvdW5kLiAgVGhlIGluZGV4IGlzIGd1YXJhbnRlZWQgdG8gcG9pbnQgYXQgdGhlIGVsZW1lbnQgd2hlcmUgdGhlCiAgICAgc2VhcmNoZWQtZm9yIGtleSB3b3VsZCBiZSBpbnNlcnRlZCB0byBwcmVzZXJ2ZSBzb3J0aW5nIG9yZGVyLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZnVuY3Rpb24gT0JKX2JzZWFyY2hfZXgoKSB3aGljaCB3b3JrcyBsaWtlIE9CSl9ic2VhcmNoKCkgYnV0CiAgICAgdGFrZXMgYW4gZXh0cmEgZmxhZ3MgYXJndW1lbnQgZm9yIG9wdGlvbmFsIGZ1bmN0aW9uYWxpdHkuICBDdXJyZW50bHksCiAgICAgdGhlIGZvbGxvd2luZyBmbGFncyBhcmUgZGVmaW5lZDoKCglPQkpfQlNFQVJDSF9WQUxVRV9PTl9OT01BVENICglUaGlzIG9uZSBnZXRzIE9CSl9ic2VhcmNoX2V4KCkgdG8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKCWVsZW1lbnQgd2hlcmUgdGhlIGNvbXBhcmluZyBmdW5jdGlvbiByZXR1cm5zIGEgbmVnYXRpdmUgb3IgemVybwoJbnVtYmVyLgoKCU9CSl9CU0VBUkNIX0ZJUlNUX1ZBTFVFX09OX01BVENICglUaGlzIG9uZSBnZXRzIE9CSl9ic2VhcmNoX2V4KCkgdG8gcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZmlyc3QKCWVsZW1lbnQgd2hlcmUgdGhlIGNvbXBhcmluZyBmdW5jdGlvbiByZXR1cm5zIHplcm8uICBUaGlzIGlzIHVzZWZ1bAoJaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgZWxlbWVudCB3aGVyZSB0aGUgY29tcGFyaW5nIGZ1bmN0aW9uCglyZXR1cm5zIHplcm8uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBjcmVhdGUgc2VsZi1zaWduZWQgY2VydGlmaWNhdGVzIHdpdGggJ29wZW5zc2wgY2EnCiAgICAgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBiZWNvbWVzIHBhcnQgb2YgdGhlCiAgICAgQ0EgZGF0YWJhc2UgYW5kIHVzZXMgdGhlIHNhbWUgbWVjaGFuaXNtcyBmb3Igc2VyaWFsIG51bWJlciBnZW5lcmF0aW9uCiAgICAgYXMgYWxsIG90aGVyIGNlcnRpZmljYXRlIHNpZ25pbmcuICBUaGUgbmV3IGZsYWcgJy1zZWxmc2lnbicgZW5hYmxlcwogICAgIHRoaXMgZnVuY3Rpb25hbGl0eS4gIEFkYXB0IENBLnNoIGFuZCBDQS5wbC5pbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgZnVuY3Rpb25hbGl0eSB0byBjaGVjayB0aGUgcHVibGljIGtleSBvZiBhIGNlcnRpZmljYXRlIHJlcXVlc3QKICAgICBhZ2FpbnN0IGEgZ2l2ZW4gcHJpdmF0ZS4gIFRoaXMgaXMgdXNlZnVsIHRvIGNoZWNrIHRoYXQgYSBjZXJ0aWZpY2F0ZQogICAgIHJlcXVlc3QgY2FuIGJlIHNpZ25lZCBieSB0aGF0IGtleSAoc2VsZi1zaWduaW5nKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgYWN0aXZlIGNlcnRpZmljYXRlcyB3aXRoIHRoZSBzYW1lCiAgICAgc3ViamVjdCBpbiB0aGUgQ0EgaW5kZXggZmlsZS4gIFRoaXMgaXMgZG9uZSBvbmx5IGlmIHRoZSBrZXl3b3JkCiAgICAgJ3VuaXF1ZV9zdWJqZWN0JyBpcyBzZXQgdG8gJ25vJyBpbiB0aGUgbWFpbiBDQSBzZWN0aW9uIChkZWZhdWx0CiAgICAgaWYgJ0NBX2RlZmF1bHQnKSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhlIHZhbHVlIGlzIHNhdmVkCiAgICAgd2l0aCB0aGUgZGF0YWJhc2UgaXRzZWxmIGluIGEgc2VwYXJhdGUgaW5kZXggYXR0cmlidXRlIGZpbGUsCiAgICAgbmFtZWQgbGlrZSB0aGUgaW5kZXggZmlsZSB3aXRoICcuYXR0cicgYXBwZW5kZWQgdG8gdGhlIG5hbWUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgR2VuZXJhdGUgbXV0aSB2YWx1ZWQgQVZBcyB1c2luZyAnKycgbm90YXRpb24gaW4gY29uZmlnIGZpbGVzIGZvcgogICAgIHJlcSBhbmQgZGlyTmFtZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBuYW1lQ29uc3RyYWludHMgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIHBvbGljeUNvbnN0cmFpbnRzIGNlcnRpZmljYXRlIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBwb2xpY3lNYXBwaW5ncyBjZXJ0aWZpY2F0ZSBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBzdXJlIHRoZSBkZWZhdWx0IERTQV9NRVRIT0QgaW1wbGVtZW50YXRpb24gb25seSB1c2VzIGl0cwogICAgIGRzYV9tb2RfZXhwKCkgYW5kL29yIGJuX21vZF9leHAoKSBoYW5kbGVycyBpZiB0aGV5IGFyZSBub24tTlVMTCwKICAgICBhbmQgY2hhbmdlIGl0cyBvd24gaGFuZGxlcnMgdG8gYmUgTlVMTCBzbyBhcyB0byByZW1vdmUgdW5uZWNlc3NhcnkKICAgICBpbmRpcmVjdGlvbi4gVGhpcyBsZXRzIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9ucyBmYWxsYmFjayB0byB0aGUKICAgICBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG1vcmUgZWFzaWx5LgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFN1cHBvcnQgZm9yIGRpcmVjdG9yeU5hbWUgaW4gR2VuZXJhbE5hbWUgcmVsYXRlZCBleHRlbnNpb25zCiAgICAgaW4gY29uZmlnIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gbGluayBhcHBsaWNhdGlvbnMgdXNpbmcgTWFrZWZpbGUuc2hhcmVkLgogICAgIE1ha2UgdGhhdCBwb3NzaWJsZSBldmVuIHdoZW4gbGlua2luZyBhZ2FpbnN0IHN0YXRpYyBsaWJyYXJpZXMhCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgU3VwcG9ydCBmb3Igc2luZ2xlIHBhc3MgcHJvY2Vzc2luZyBmb3IgUy9NSU1FIHNpZ25pbmcuIFRoaXMgbm93CiAgICAgbWVhbnMgdGhhdCBTL01JTUUgc2lnbmluZyBjYW4gYmUgZG9uZSBmcm9tIGEgcGlwZSwgaW4gYWRkaXRpb24KICAgICBjbGVhcnRleHQgc2lnbmluZyAobXVsdGlwYXJ0L3NpZ25lZCB0eXBlKSBpcyBlZmZlY3RpdmVseSBzdHJlYW1pbmcKICAgICBhbmQgdGhlIHNpZ25lZCBkYXRhIGRvZXMgbm90IG5lZWQgdG8gYmUgYWxsIGhlbGQgaW4gbWVtb3J5LgoKICAgICBUaGlzIGlzIGRvbmUgd2l0aCBhIG5ldyBmbGFnIFBLQ1M3X1NUUkVBTS4gV2hlbiB0aGlzIGZsYWcgaXMgc2V0CiAgICAgUEtDUzdfc2lnbigpIG9ubHkgaW5pdGlhbGl6ZXMgdGhlIFBLQ1M3IHN0cnVjdHVyZSBhbmQgdGhlIGFjdHVhbCBzaWduaW5nCiAgICAgaXMgZG9uZSBhZnRlciB0aGUgZGF0YSBpcyBvdXRwdXQgKGFuZCBkaWdlc3RzIGNhbGN1bGF0ZWQpIGluCiAgICAgU01JTUVfd3JpdGVfUEtDUzcoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVsbCBzdXBwb3J0IGZvciAtcnBhdGgvLVIsIGJvdGggaW4gc2hhcmVkIGxpYnJhcmllcyBhbmQKICAgICBhcHBsaWNhdGlvbnMsIGF0IGxlYXN0IG9uIHRoZSBwbGF0Zm9ybXMgd2hlcmUgaXQncyBrbm93biBob3cKICAgICB0byBkbyBpdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbiBjcnlwdG8vZWMvZWNfbXVsdC5jLCBpbXBsZW1lbnQgZmFzdCBwb2ludCBtdWx0aXBsaWNhdGlvbiB3aXRoCiAgICAgcHJlY29tcHV0YXRpb24sIGJhc2VkIG9uIHdOQUYgc3BsaXR0aW5nOiBFQ19HUk9VUF9wcmVjb21wdXRlX211bHQoKQogICAgIHdpbGwgbm93IGNvbXB1dGUgYSB0YWJsZSBvZiBtdWx0aXBsZXMgb2YgdGhlIGdlbmVyYXRvciB0aGF0CiAgICAgbWFrZXMgc3Vic2VxdWVudCBpbnZvY2F0aW9ucyBvZiBFQ19QT0lOVHNfbXVsKCkgb3IgRUNfUE9JTlRfbXVsKCkKICAgICBmYXN0ZXIgKG5vdGFibHkgaW4gdGhlIGNhc2Ugb2YgYSBzaW5nbGUgcG9pbnQgbXVsdGlwbGljYXRpb24sCiAgICAgc2NhbGFyICogZ2VuZXJhdG9yKS4KICAgICBbTmlscyBMYXJzY2gsIEJvZG8gTW9lbGxlcl0KCiAgKikgSVB2NiBzdXBwb3J0IGZvciBjZXJ0aWZpY2F0ZSBleHRlbnNpb25zLiBUaGUgdmFyaW91cyBleHRlbnNpb25zCiAgICAgd2hpY2ggdXNlIHRoZSBJUDphLmIuYy5kIGNhbiBub3cgdGFrZSBJUHY2IGFkZHJlc3NlcyB1c2luZyB0aGUKICAgICBmb3JtYXRzIG9mIFJGQzE4ODQgMi4yIC4gSVB2NiBhZGRyZXNzZXMgYXJlIG5vdyBhbHNvIGRpc3BsYXllZAogICAgIGNvcnJlY3RseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBhbiBFTkdJTkUgdGhhdCBpbXBsZW1lbnRzIFJTQSBieSBwZXJmb3JtaW5nIHByaXZhdGUga2V5CiAgICAgZXhwb25lbnRpYXRpb25zIHdpdGggdGhlIEdNUCBsaWJyYXJ5LiBUaGUgY29udmVyc2lvbnMgdG8gYW5kIGZyb20KICAgICBHTVAncyBtcHpfdCBmb3JtYXQgYXJlbid0IG9wdGltaXNlZCBub3IgYXJlIGFueSBtb250Z29tZXJ5IGZvcm1zCiAgICAgY2FjaGVkLCBhbmQgb24geDg2IGl0IGFwcGVhcnMgT3BlblNTTCdzIG93biBwZXJmb3JtYW5jZSBoYXMgY2F1Z2h0IHVwLgogICAgIEhvd2V2ZXIgdGhlcmUgYXJlIGxpa2VseSB0byBiZSBvdGhlciBhcmNoaXRlY3R1cmVzIHdoZXJlIEdNUCBjb3VsZAogICAgIHByb3ZpZGUgYSBib29zdC4gVGhpcyBFTkdJTkUgaXMgbm90IGJ1aWx0IGluIGJ5IGRlZmF1bHQsIGJ1dCBpdCBjYW4gYmUKICAgICBzcGVjaWZpZWQgYXQgQ29uZmlndXJlIHRpbWUgYW5kIHNob3VsZCBiZSBhY2NvbXBhbmllZCBieSB0aGUgbmVjZXNzYXJ5CiAgICAgbGlua2VyIGFkZGl0aW9ucywgZWc7CiAgICAgICAgIC4vY29uZmlnIC1ET1BFTlNTTF9VU0VfR01QIC1sZ21wCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgIm9wZW5zc2wgZW5naW5lIiB3aWxsIG5vdCBkaXNwbGF5IEVOR0lORS9EU08gbG9hZCBmYWlsdXJlIGVycm9ycyB3aGVuCiAgICAgdGVzdGluZyBhdmFpbGFiaWxpdHkgb2YgZW5naW5lcyB3aXRoICItdCIgLSB0aGUgb2xkIGJlaGF2aW91ciBpcwogICAgIHByb2R1Y2VkIGJ5IGluY3JlYXNpbmcgdGhlIGZlYXR1cmUncyB2ZXJib3NpdHkgd2l0aCAiLXR0Ii4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBFQ0RTQSByb3V0aW5lczogdW5kZXIgY2VydGFpbiBlcnJvciBjb25kaXRpb25zIHVuaW5pdGlhbGl6ZWQgQk4gb2JqZWN0cwogICAgIGNvdWxkIGJlIGZyZWVkLiBTb2x1dGlvbjogbWFrZSBzdXJlIGluaXRpYWxpemF0aW9uIGlzIHBlcmZvcm1lZCBlYXJseQogICAgIGVub3VnaC4gKFJlcG9ydGVkIGFuZCBmaXggc3VwcGxpZWQgYnkgTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT4KICAgICB2aWEgUFIjNDU5KQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBLZXktZ2VuZXJhdGlvbiBjYW4gbm93IGJlIGltcGxlbWVudGVkIGluIFJTQV9NRVRIT0QsIERTQV9NRVRIT0QKICAgICBhbmQgREhfTUVUSE9EIChlZy4gYnkgRU5HSU5FIGltcGxlbWVudGF0aW9ucykgdG8gb3ZlcnJpZGUgdGhlIG5vcm1hbAogICAgIHNvZnR3YXJlIGltcGxlbWVudGF0aW9ucy4gRm9yIERTQSBhbmQgREgsIHBhcmFtZXRlciBnZW5lcmF0aW9uIGNhbgogICAgIGFsc28gYmUgb3ZlcnJpZGVuIGJ5IHByb3ZpZGluZyB0aGUgYXBwcm9wcmlhdGUgbWV0aG9kIGNhbGxiYWNrcy4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBDaGFuZ2UgdGhlICJwcm9ncmVzcyIgbWVjaGFuaXNtIHVzZWQgaW4ga2V5LWdlbmVyYXRpb24gYW5kCiAgICAgcHJpbWFsaXR5IHRlc3RpbmcgdG8gZnVuY3Rpb25zIHRoYXQgdGFrZSBhIG5ldyBCTl9HRU5DQiBwb2ludGVyIGluCiAgICAgcGxhY2Ugb2YgY2FsbGJhY2svYXJndW1lbnQgcGFpcnMuIFRoZSBuZXcgQVBJIGZ1bmN0aW9ucyBoYXZlICJfZXgiCiAgICAgcG9zdGZpeGVzIGFuZCB0aGUgb2xkZXIgZnVuY3Rpb25zIGFyZSByZWltcGxlbWVudGVkIGFzIHdyYXBwZXJzIGZvcgogICAgIHRoZSBuZXcgb25lcy4gVGhlIE9QRU5TU0xfTk9fREVQUkVDQVRFRCBzeW1ib2wgY2FuIGJlIHVzZWQgdG8gaGlkZQogICAgIGRlY2xhcmF0aW9ucyBvZiB0aGUgb2xkIGZ1bmN0aW9ucyB0byBoZWxwIChncmFjZWZ1bCkgYXR0ZW1wdHMgdG8KICAgICBtaWdyYXRlIHRvIHRoZSBuZXcgZnVuY3Rpb25zLiBBbHNvLCB0aGUgbmV3IGtleS1nZW5lcmF0aW9uIEFQSQogICAgIGZ1bmN0aW9ucyBvcGVyYXRlIG9uIGEgY2FsbGVyLXN1cHBsaWVkIGtleS1zdHJ1Y3R1cmUgYW5kIHJldHVybgogICAgIHN1Y2Nlc3MvZmFpbHVyZSByYXRoZXIgdGhhbiByZXR1cm5pbmcgYSBrZXkgb3IgTlVMTCAtIHRoaXMgaXMgdG8KICAgICBoZWxwIG1ha2UgImtleWdlbiIgYW5vdGhlciBtZW1iZXIgZnVuY3Rpb24gb2YgUlNBX01FVEhPRCBldGMuCgogICAgIEV4YW1wbGUgZm9yIHVzaW5nIHRoZSBuZXcgY2FsbGJhY2sgaW50ZXJmYWNlOgoKICAgICAgICAgIGludCAoKm15X2NhbGxiYWNrKShpbnQgYSwgaW50IGIsIEJOX0dFTkNCICpjYikgPSAuLi47CiAgICAgICAgICB2b2lkICpteV9hcmcgPSAuLi47CiAgICAgICAgICBCTl9HRU5DQiBteV9jYjsKCiAgICAgICAgICBCTl9HRU5DQl9zZXQoJm15X2NiLCBteV9jYWxsYmFjaywgbXlfYXJnKTsKCiAgICAgICAgICByZXR1cm4gQk5faXNfcHJpbWVfZXgoc29tZV9iaWdudW0sIEJOX3ByaW1lX2NoZWNrcywgTlVMTCwgJmNiKTsKICAgICAgICAgIC8qIEZvciB0aGUgbWVhbmluZyBvZiBhLCBiIGluIGNhbGxzIHRvIG15X2NhbGxiYWNrKCksIHNlZSB0aGUKICAgICAgICAgICAqIGRvY3VtZW50YXRpb24gb2YgdGhlIGZ1bmN0aW9uIHRoYXQgY2FsbHMgdGhlIGNhbGxiYWNrLgogICAgICAgICAgICogY2Igd2lsbCBwb2ludCB0byBteV9jYjsgbXlfYXJnIGNhbiBiZSByZXRyaWV2ZWQgYXMgY2ItPmFyZy4KICAgICAgICAgICAqIG15X2NhbGxiYWNrIHNob3VsZCByZXR1cm4gMSBpZiBpdCB3YW50cyBCTl9pc19wcmltZV9leCgpCiAgICAgICAgICAgKiB0byBjb250aW51ZSwgb3IgMCB0byBzdG9wLgogICAgICAgICAgICovCgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIENoYW5nZSB0aGUgWkxJQiBjb21wcmVzc2lvbiBtZXRob2QgdG8gYmUgc3RhdGVmdWwsIGFuZCBtYWtlIGl0CiAgICAgYXZhaWxhYmxlIHRvIFRMUyB3aXRoIHRoZSBudW1iZXIgZGVmaW5lZCBpbiAKICAgICBkcmFmdC1pZXRmLXRscy1jb21wcmVzc2lvbi0wNC50eHQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBBU04uMSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgZm9yIENlcnRpZmljYXRlUGFpciwgd2hpY2gKICAgICBpcyBkZWZpbmVkIGFzIGZvbGxvd3MgKGFjY29yZGluZyB0byBYLjUwOV80dGhFZGl0aW9uRHJhZnRWNi5wZGYpOgoKICAgICBDZXJ0aWZpY2F0ZVBhaXIgOjo9IFNFUVVFTkNFIHsKICAgICAgICBmb3J3YXJkCQlbMF0JQ2VydGlmaWNhdGUgT1BUSU9OQUwsCiAgICAgICAgcmV2ZXJzZQkJWzFdCUNlcnRpZmljYXRlIE9QVElPTkFMLAogICAgICAgIC0tIGF0IGxlYXN0IG9uZSBvZiB0aGUgcGFpciBzaGFsbCBiZSBwcmVzZW50IC0tIH0KCiAgICAgQWxzbyBpbXBsZW1lbnQgdGhlIFBFTSBmdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgY2VydGlmaWNhdGUKICAgICBwYWlycywgYW5kIGRlZmluZWQgdGhlIFBFTSB0YWcgYXMgIkNFUlRJRklDQVRFIFBBSVIiLgoKICAgICBUaGlzIG5lZWRlZCB0byBiZSBkZWZpbmVkLCBtb3N0bHkgZm9yIHRoZSBzYWtlIG9mIHRoZSBMREFQCiAgICAgYXR0cmlidXRlIGNyb3NzQ2VydGlmaWNhdGVQYWlyLCBidXQgbWF5IHByb3ZlIHVzZWZ1bCBlbHNld2hlcmUgYXMKICAgICB3ZWxsLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gaW5oaWJpdCBzeW1saW5raW5nIG9mIHNoYXJlZCBsaWJyYXJpZXMgaW4KICAgICBNYWtlZmlsZS5zaGFyZWQsIGZvciBDeWd3aW4ncyBzYWtlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEV4dGVuZCB0aGUgQklHTlVNIEFQSSBieSBjcmVhdGluZyBhIGZ1bmN0aW9uIAogICAgICAgICAgdm9pZCBCTl9zZXRfbmVnYXRpdmUoQklHTlVNICphLCBpbnQgbmVnKTsKICAgICBhbmQgYSBtYWNybyB0aGF0IGJlaGF2ZSBsaWtlCiAgICAgICAgICBpbnQgIEJOX2lzX25lZ2F0aXZlKGNvbnN0IEJJR05VTSAqYSk7CgogICAgIHRvIGF2b2lkIHRoZSBuZWVkIHRvIGFjY2VzcyAnYS0+bmVnJyBkaXJlY3RseSBpbiBhcHBsaWNhdGlvbnMuCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBJbXBsZW1lbnQgZmFzdCBtb2R1bGFyIHJlZHVjdGlvbiBmb3IgcHNldWRvLU1lcnNlbm5lIHByaW1lcwogICAgIHVzZWQgaW4gTklTVCBjdXJ2ZXMgKGNyeXB0by9ibi9ibl9uaXN0LmMsIGNyeXB0by9lYy9lY3BfbmlzdC5jKS4KICAgICBFQ19HUk9VUF9uZXdfY3VydmVfR0ZwKCkgd2lsbCBub3cgYXV0b21hdGljYWxseSB1c2UgdGhpcwogICAgIGlmIGFwcGxpY2FibGUuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgbmV3IGxvY2sgdHlwZSAoQ1JZUFRPX0xPQ0tfQk4pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSB0aGUgRU5HSU5FIGZyYW1ld29yayB0byBhdXRvbWF0aWNhbGx5IGxvYWQgZW5naW5lcwogICAgIGR5bmFtaWNhbGx5IGZyb20gc3BlY2lmaWMgZGlyZWN0b3JpZXMgdW5sZXNzIHRoZXkgY291bGQgYmUKICAgICBmb3VuZCB0byBhbHJlYWR5IGJlIGJ1aWx0IGluIG9yIGxvYWRlZC4gIE1vdmUgYWxsIHRoZQogICAgIGN1cnJlbnQgZW5naW5lcyBleGNlcHQgZm9yIHRoZSBjcnlwdG9kZXYgb25lIHRvIGEgbmV3CiAgICAgZGlyZWN0b3J5IGVuZ2luZXMvLgogICAgIFRoZSBlbmdpbmVzIGluIGVuZ2luZXMvIGFyZSBidWlsdCBhcyBzaGFyZWQgbGlicmFyaWVzIGlmCiAgICAgdGhlICJzaGFyZWQiIG9wdGlvbnMgd2FzIGdpdmVuIHRvIC4vQ29uZmlndXJlIG9yIC4vY29uZmlnLgogICAgIE90aGVyd2lzZSwgdGhleSBhcmUgaW5zZXJ0ZWQgaW4gbGliY3J5cHRvLmEuCiAgICAgL3Vzci9sb2NhbC9zc2wvZW5naW5lcyBpcyB0aGUgZGVmYXVsdCBkaXJlY3RvcnkgZm9yIGR5bmFtaWMKICAgICBlbmdpbmVzLCBidXQgdGhhdCBjYW4gYmUgb3ZlcnJpZGVuIGF0IGNvbmZpZ3VyZSB0aW1lIHRocm91Z2gKICAgICB0aGUgdXN1YWwgdXNlIG9mIC0tcHJlZml4IGFuZC9vciAtLW9wZW5zc2xkaXIsIGFuZCBhdCBydW4KICAgICB0aW1lIHdpdGggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIE9QRU5TU0xfRU5HSU5FUy4KICAgICBbR2VvZmYgVGhvcnBlIGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBNYWtlZmlsZS5zaGFyZWQsIGEgaGVscGVyIG1ha2VmaWxlIHRvIGJ1aWxkIHNoYXJlZAogICAgIGxpYnJhcmllcy4gIEFkYXB0IE1ha2VmaWxlLm9yZy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdmVyc2lvbiBpbmZvIHRvIFdpbjMyIERMTHMuCiAgICAgW1BldGVyICdMdW5hJyBSdW5lc3RpZyIgPHBldGVyQHJ1bmVzdGlnLmNvbT5dCgogICopIEFkZCBuZXcgJ21lZGl1bSBsZXZlbCcgUEtDUyMxMiBBUEkuIENlcnRpZmljYXRlcyBhbmQga2V5cwogICAgIGNhbiBiZSBhZGRlZCB1c2luZyB0aGlzIEFQSSB0byBjcmVhdGVkIGFyYml0cmFyeSBQS0NTIzEyCiAgICAgZmlsZXMgd2hpbGUgYXZvaWRpbmcgdGhlIGxvdyBsZXZlbCBBUEkuCgogICAgIE5ldyBvcHRpb25zIHRvIFBLQ1MxMl9jcmVhdGUoKSwga2V5IG9yIGNlcnQgY2FuIGJlIE5VTEwgYW5kCiAgICAgd2lsbCB0aGVuIGJlIG9taXR0ZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUuIFRoZSBlbmNyeXB0aW9uCiAgICAgYWxnb3JpdGhtIE5JRHMgY2FuIGJlIHNldCB0byAtMSBmb3Igbm8gZW5jcnlwdGlvbiwgdGhlIG1hYwogICAgIGl0ZXJhdGlvbiBjb3VudCBjYW4gYmUgc2V0IHRvIDAgdG8gb21pdCB0aGUgbWFjLgoKICAgICBFbmhhbmNlIHBrY3MxMiB1dGlsaXR5IGJ5IG1ha2luZyB0aGUgLW5va2V5cyBhbmQgLW5vY2VydHMKICAgICBvcHRpb25zIHdvcmsgd2hlbiBjcmVhdGluZyBhIFBLQ1MjMTIgZmlsZS4gTmV3IG9wdGlvbiAtbm9tYWMKICAgICB0byBvbWl0IHRoZSBtYWMsIE5PTkUgY2FuIGJlIHNldCBmb3IgYW4gZW5jcnlwdGlvbiBhbGdvcml0aG0uCiAgICAgTmV3IGNvZGUgaXMgbW9kaWZpZWQgdG8gdXNlIHRoZSBlbmhhbmNlZCBQS0NTMTJfY3JlYXRlKCkKICAgICBpbnN0ZWFkIG9mIHRoZSBsb3cgbGV2ZWwgQVBJLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCBBU04xIGVuY29kZXIgdG8gc3VwcG9ydCBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZAogICAgIGVuY29kaW5nLiBUaGlzIGNhbiBvdXRwdXQgc2VxdWVuY2VzIHRhZ3MgYW5kIG9jdGV0IHN0cmluZ3MgaW4KICAgICB0aGlzIGZvcm0uIE1vZGlmeSBwazdfYXNuMS5jIHRvIHN1cHBvcnQgaW5kZWZpbml0ZSBsZW5ndGgKICAgICBlbmNvZGluZy4gVGhpcyBpcyBleHBlcmltZW50YWwgYW5kIG5lZWRzIGFkZGl0aW9uYWwgY29kZSB0bwogICAgIGJlIHVzZWZ1bCwgc3VjaCBhcyBhbiBBU04xIGJpbyBhbmQgc29tZSBlbmhhbmNlZCBzdHJlYW1pbmcKICAgICBQS0NTIzcgY29kZS4KCiAgICAgRXh0ZW5kIHRlbXBsYXRlIGVuY29kZSBmdW5jdGlvbmFsaXR5IHNvIHRoYXQgdGFnZ2luZyBpcyBwYXNzZWQKICAgICBkb3duIHRvIHRoZSB0ZW1wbGF0ZSBlbmNvZGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIExldCAnb3BlbnNzbCByZXEnIGZhaWwgaWYgYW4gYXJndW1lbnQgdG8gJy1uZXdrZXknIGlzIG5vdAogICAgIHJlY29nbml6ZWQgaW5zdGVhZCBvZiB1c2luZyBSU0EgYXMgYSBkZWZhdWx0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBFQ0MtYmFzZWQgY2lwaGVyc3VpdGVzIGZyb20gZHJhZnQtaWV0Zi10bHMtZWNjLTAxLnR4dC4KICAgICBBcyB0aGVzZSBhcmUgbm90IG9mZmljaWFsLCB0aGV5IGFyZSBub3QgaW5jbHVkZWQgaW4gIkFMTCI7CiAgICAgdGhlICJFQ0NkcmFmdCIgY2lwaGVyc3VpdGUgZ3JvdXAgYWxpYXMgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHRoZW0uCiAgICAgW1ZpcHVsIEd1cHRhIGFuZCBTdW1pdCBHdXB0YSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgRUNESCBlbmdpbmUgc3VwcG9ydC4KICAgICBbTmlscyBHdXJhIGFuZCBEb3VnbGFzIFN0ZWJpbGEgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIEVDREggaW4gbmV3IGRpcmVjdG9yeSBjcnlwdG8vZWNkaC8uCiAgICAgW0RvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBMZXQgQk5fcmFuZF9yYW5nZSgpIGFib3J0IHdpdGggYW4gZXJyb3IgYWZ0ZXIgMTAwIGl0ZXJhdGlvbnMKICAgICB3aXRob3V0IHN1Y2Nlc3MgKHdoaWNoIGluZGljYXRlcyBhIGJyb2tlbiBQUk5HKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgQk5fbW9kX3NxcnQoKSBzbyB0aGF0IGl0IHZlcmlmaWVzIHRoYXQgdGhlIGlucHV0IHZhbHVlCiAgICAgaXMgcmVhbGx5IHRoZSBzcXVhcmUgb2YgdGhlIHJldHVybiB2YWx1ZS4gIChQcmV2aW91c2x5LAogICAgIEJOX21vZF9zcXJ0IHdvdWxkIHNob3cgR0lHTyBiZWhhdmlvdXIuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBuYW1lZCBlbGxpcHRpYyBjdXJ2ZXMgb3ZlciBiaW5hcnkgZmllbGRzIGZyb20gWDkuNjIsIFNFQ0csCiAgICAgYW5kIFdBUC9XVExTOyBhZGQgT0lEcyB0aGF0IHdlcmUgc3RpbGwgbWlzc2luZy4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEV4dGVuZCB0aGUgRUMgbGlicmFyeSBmb3IgZWxsaXB0aWMgY3VydmVzIG92ZXIgYmluYXJ5IGZpZWxkcwogICAgIChuZXcgZmlsZXMgZWMyX3NtcGwuYywgZWMyX3NtcHQuYywgZWMyX211bHQuYyBpbiBjcnlwdG8vZWMvKS4KICAgICBOZXcgRUNfTUVUSE9EOgoKICAgICAgICAgIEVDX0dGMm1fc2ltcGxlX21ldGhvZAoKICAgICBOZXcgQVBJIGZ1bmN0aW9uczoKCiAgICAgICAgICBFQ19HUk9VUF9uZXdfY3VydmVfR0YybQogICAgICAgICAgRUNfR1JPVVBfc2V0X2N1cnZlX0dGMm0KICAgICAgICAgIEVDX0dST1VQX2dldF9jdXJ2ZV9HRjJtCiAgICAgICAgICBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0KICAgICAgICAgIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybQogICAgICAgICAgRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0YybQoKICAgICBQb2ludCBjb21wcmVzc2lvbiBmb3IgYmluYXJ5IGZpZWxkcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGZvcgogICAgIHBhdGVudCByZWFzb25zIChjb21waWxlIHdpdGggT1BFTlNTTF9FQ19CSU5fUFRfQ09NUCBkZWZpbmVkIHRvCiAgICAgZW5hYmxlIGl0KS4KCiAgICAgQXMgYmluYXJ5IHBvbHlub21pYWxzIGFyZSByZXByZXNlbnRlZCBhcyBCSUdOVU1zLCB2YXJpb3VzIG1lbWJlcnMKICAgICBvZiB0aGUgRUNfR1JPVVAgYW5kIEVDX1BPSU5UIGRhdGEgc3RydWN0dXJlcyBjYW4gYmUgc2hhcmVkCiAgICAgYmV0d2VlbiB0aGUgaW1wbGVtZW50YXRpb25zIGZvciBwcmltZSBmaWVsZHMgYW5kIGJpbmFyeSBmaWVsZHM7CiAgICAgdGhlIGFib3ZlIC4uLl9HRjJtIGZ1bmN0aW9ucyAoZXhjZXB0IGZvciBFWF9HUk9VUF9uZXdfY3VydmVfR0YybSkKICAgICBhcmUgZXNzZW50aWFsbHkgaWRlbnRpY2FsIHRvIHRoZWlyIC4uLl9HRnAgY291bnRlcnBhcnRzLgogICAgIChGb3Igc2ltcGxpY2l0eSwgdGhlICcuLi5fR0ZwJyBwcmVmaXggaGFzIGJlZW4gZHJvcHBlZCBmcm9tCiAgICAgdmFyaW91cyBpbnRlcm5hbCBtZXRob2QgbmFtZXMuKQoKICAgICBBbiBpbnRlcm5hbCAnZmllbGRfZGl2JyBtZXRob2QgKHNpbWlsYXIgdG8gJ2ZpZWxkX211bCcgYW5kCiAgICAgJ2ZpZWxkX3NxcicpIGhhcyBiZWVuIGFkZGVkOyB0aGlzIGlzIHVzZWQgb25seSBmb3IgYmluYXJ5IGZpZWxkcy4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIE9wdGlvbmFsbHkgZGlzcGF0Y2ggRUNfUE9JTlRfbXVsKCksIEVDX1BPSU5UX3ByZWNvbXB1dGVfbXVsdCgpCiAgICAgdGhyb3VnaCBtZXRob2RzICgnbXVsJywgJ3ByZWNvbXB1dGVfbXVsdCcpLgoKICAgICBUaGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbnMgKG5vdyBpbnRlcm5hbGx5IGNhbGxlZCAnZWNfd05BRl9tdWwnCiAgICAgYW5kICdlY193TkFGX3ByZWNvbXB1dGVkX211bHQnKSByZW1haW4gdGhlIGRlZmF1bHQgaWYgdGhlc2UKICAgICBtZXRob2RzIGFyZSB1bmRlZmluZWQuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBOZXcgZnVuY3Rpb24gRUNfR1JPVVBfZ2V0X2RlZ3JlZSwgd2hpY2ggaXMgZGVmaW5lZCB0aHJvdWdoCiAgICAgRUNfTUVUSE9ELiAgRm9yIGN1cnZlcyBvdmVyIHByaW1lIGZpZWxkcywgdGhpcyByZXR1cm5zIHRoZSBiaXQKICAgICBsZW5ndGggb2YgdGhlIG1vZHVsdXMuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBOZXcgZnVuY3Rpb25zIEVDX0dST1VQX2R1cCwgRUNfUE9JTlRfZHVwLgogICAgIChUaGVzZSBzaW1wbHkgY2FsbCAuLi5fbmV3ICBhbmQgLi4uX2NvcHkpLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIGJpbmFyeSBwb2x5bm9taWFsIGFyaXRobWV0aWMgc29mdHdhcmUgaW4gY3J5cHRvL2JuL2JuX2dmMm0uYy4KICAgICBQb2x5bm9taWFscyBhcmUgcmVwcmVzZW50ZWQgYXMgQklHTlVNcyAod2hlcmUgdGhlIHNpZ24gYml0IGlzIG5vdAogICAgIHVzZWQpIGluIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIFttYWNyb3NdOiAgCgogICAgICAgICAgQk5fR0YybV9hZGQKICAgICAgICAgIEJOX0dGMm1fc3ViICAgICAgICAgICAgIFs9IEJOX0dGMm1fYWRkXQogICAgICAgICAgQk5fR0YybV9tb2QgICAgICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX2Fycl0KICAgICAgICAgIEJOX0dGMm1fbW9kX211bCAgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9tdWxfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2Rfc3FyICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX3Nxcl9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9pbnYKICAgICAgICAgIEJOX0dGMm1fbW9kX2V4cCAgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9leHBfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2Rfc3FydCAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX3NxcnRfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2Rfc29sdmVfcXVhZCAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX3NvbHZlX3F1YWRfYXJyXQogICAgICAgICAgQk5fR0YybV9jbXAgICAgICAgICAgICAgWz0gQk5fdWNtcF0KCiAgICAgKE5vdGUgdGhhdCBvbmx5IHRoZSAnbW9kJyBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGZvciBmaWVsZHMgR0YoMl5tKS4KICAgICBCTl9HRjJtX2FkZCgpIGlzIG1pc25vbWVyLCBidXQgdGhpcyBpcyBmb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3kuKQoKICAgICBGb3Igc29tZSBmdW5jdGlvbnMsIGFuIHRoZSBpcnJlZHVjaWJsZSBwb2x5bm9taWFsIGRlZmluaW5nIGEKICAgICBmaWVsZCBjYW4gYmUgZ2l2ZW4gYXMgYW4gJ3Vuc2lnbmVkIGludFtdJyB3aXRoIHN0cmljdGx5CiAgICAgZGVjcmVhc2luZyBlbGVtZW50cyBnaXZpbmcgdGhlIGluZGljZXMgb2YgdGhvc2UgYml0cyB0aGF0IGFyZSBzZXQ7CiAgICAgaS5lLiwgcFtdIHJlcHJlc2VudHMgdGhlIHBvbHlub21pYWwKICAgICAgICAgIGYodCkgPSB0XnBbMF0gKyB0XnBbMV0gKyAuLi4gKyB0XnBba10KICAgICB3aGVyZQogICAgICAgICAgcFswXSA+IHBbMV0gPiAuLi4gPiBwW2tdID0gMC4KICAgICBUaGlzIGFwcGxpZXMgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgogICAgICAgICAgQk5fR0YybV9tb2RfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9tdWxfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXJfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9pbnZfYXJyICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfaW52XQogICAgICAgICAgQk5fR0YybV9tb2RfZGl2X2FyciAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX2Rpdl0KICAgICAgICAgIEJOX0dGMm1fbW9kX2V4cF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX3NxcnRfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9zb2x2ZV9xdWFkX2FycgogICAgICAgICAgQk5fR0YybV9wb2x5MmFycgogICAgICAgICAgQk5fR0YybV9hcnIycG9seQoKICAgICBDb252ZXJzaW9uIGNhbiBiZSBwZXJmb3JtZWQgYnkgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgogICAgICAgICAgQk5fR0YybV9wb2x5MmFycgogICAgICAgICAgQk5fR0YybV9hcnIycG9seQoKICAgICBibnRlc3QuYyBoYXMgYWRkaXRpb25hbCB0ZXN0cyBmb3IgYmluYXJ5IHBvbHlub21pYWwgYXJpdGhtZXRpYy4KCiAgICAgVHdvIGltcGxlbWVudGF0aW9ucyBmb3IgQk5fR0YybV9tb2RfZGl2KCkgYXJlIGF2YWlsYWJsZS4KICAgICBUaGUgZGVmYXVsdCBhbGdvcml0aG0gc2ltcGx5IHVzZXMgQk5fR0YybV9tb2RfaW52KCkgYW5kCiAgICAgQk5fR0YybV9tb2RfbXVsKCkuICBUaGUgYWx0ZXJuYXRpdmUgYWxnb3JpdGhtIGlzIGNvbXBpbGVkIGluIG9ubHkKICAgICBpZiBPUEVOU1NMX1NVTl9HRjJNX0RJViBpcyBkZWZpbmVkIChwYXRlbnQgcGVuZGluZzsgcmVhZCB0aGUKICAgICBjb3B5cmlnaHQgbm90aWNlIGluIGNyeXB0by9ibi9ibl9nZjJtLmMgYmVmb3JlIGVuYWJsaW5nIGl0KS4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBuZXcgZXJyb3IgY29kZSAnRVJSX1JfRElTQUJMRUQnIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBzb21lCiAgICAgZnVuY3Rpb25hbGl0eSBpcyBkaXNhYmxlZCBhdCBjb21waWxlLXRpbWUuCiAgICAgW0RvdWdsYXMgU3RlYmlsYSA8ZG91Z2xhcy5zdGViaWxhQHN1bi5jb20+XQoKICAqKSBDaGFuZ2UgZGVmYXVsdCBiZWhhdmlvdXIgb2YgJ29wZW5zc2wgYXNuMXBhcnNlJyBzbyB0aGF0IG1vcmUKICAgICBpbmZvcm1hdGlvbiBpcyB2aXNpYmxlIHdoZW4gdmlld2luZywgZS5nLiwgYSBjZXJ0aWZpY2F0ZToKCiAgICAgTW9kaWZ5IGFzbjFfcGFyc2UyIChjcnlwdG8vYXNuMS9hc24xX3Bhci5jKSBzbyB0aGF0IGluIG5vbi0nZHVtcCcKICAgICBtb2RlIHRoZSBjb250ZW50IG9mIG5vbi1wcmludGFibGUgT0NURVQgU1RSSU5HcyBpcyBvdXRwdXQgaW4gYQogICAgIHN0eWxlIHNpbWlsYXIgdG8gSU5URUdFUnMsIGJ1dCB3aXRoICdbSEVYIERVTVBdJyBwcmVwZW5kZWQgdG8KICAgICBhdm9pZCB0aGUgYXBwZWFyYW5jZSBvZiBhIHByaW50YWJsZSBzdHJpbmcuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgJ2FzbjFfZmxhZycgYW5kICdhc24xX2Zvcm0nIG1lbWJlciB0byBFQ19HUk9VUCB3aXRoIGFjY2VzcwogICAgIGZ1bmN0aW9ucwogICAgICAgICAgRUNfR1JPVVBfc2V0X2FzbjFfZmxhZygpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfYXNuMV9mbGFnKCkKICAgICAgICAgIEVDX0dST1VQX3NldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0oKQogICAgICAgICAgRUNfR1JPVVBfZ2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybSgpCiAgICAgVGhlc2UgY29udHJvbCBBU04xIGVuY29kaW5nIGRldGFpbHM6CiAgICAgLSBDdXJ2ZXMgKGkuZS4sIGdyb3VwcykgYXJlIGVuY29kZWQgZXhwbGljaXRseSB1bmxlc3MgYXNuMV9mbGFnCiAgICAgICBoYXMgYmVlbiBzZXQgdG8gT1BFTlNTTF9FQ19OQU1FRF9DVVJWRS4KICAgICAtIFBvaW50cyBhcmUgZW5jb2RlZCBpbiB1bmNvbXByZXNzZWQgZm9ybSBieSBkZWZhdWx0OyBvcHRpb25zIGZvcgogICAgICAgYXNuMV9mb3IgYXJlIGFzIGZvciBwb2ludDJvY3QsIG5hbWVseQogICAgICAgICAgUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VECiAgICAgICAgICBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRAogICAgICAgICAgUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQKCiAgICAgQWxzbyBhZGQgJ3NlZWQnIGFuZCAnc2VlZF9sZW4nIG1lbWJlcnMgdG8gRUNfR1JPVVAgd2l0aCBhY2Nlc3MKICAgICBmdW5jdGlvbnMKICAgICAgICAgIEVDX0dST1VQX3NldF9zZWVkKCkKICAgICAgICAgIEVDX0dST1VQX2dldDBfc2VlZCgpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfc2VlZF9sZW4oKQogICAgIFRoaXMgaXMgdXNlZCBvbmx5IGZvciBBU04xIHB1cnBvc2VzIChzbyBmYXIpLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkICdmaWVsZF90eXBlJyBtZW1iZXIgdG8gRUNfTUVUSE9ELCB3aGljaCBob2xkcyB0aGUgTklECiAgICAgb2YgdGhlIGFwcHJvcHJpYXRlIGZpZWxkIHR5cGUgT0lELiAgVGhlIG5ldyBmdW5jdGlvbgogICAgIEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZSgpIHJldHVybnMgdGhpcyB2YWx1ZS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCBmdW5jdGlvbnMgCiAgICAgICAgICBFQ19QT0lOVF9wb2ludDJibigpCiAgICAgICAgICBFQ19QT0lOVF9ibjJwb2ludCgpCiAgICAgICAgICBFQ19QT0lOVF9wb2ludDJoZXgoKQogICAgICAgICAgRUNfUE9JTlRfaGV4MnBvaW50KCkKICAgICBwcm92aWRpbmcgdXNlZnVsIGludGVyZmFjZXMgdG8gRUNfUE9JTlRfcG9pbnQyb2N0KCkgYW5kCiAgICAgRUNfUE9JTlRfb2N0MnBvaW50KCkuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBDaGFuZ2UgaW50ZXJuYWxzIG9mIHRoZSBFQyBsaWJyYXJ5IHNvIHRoYXQgdGhlIGZ1bmN0aW9ucwogICAgICAgICAgRUNfR1JPVVBfc2V0X2dlbmVyYXRvcigpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfZ2VuZXJhdG9yKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9vcmRlcigpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfY29mYWN0b3IoKQogICAgIGFyZSBpbXBsZW1lbnRlZCBkaXJlY3RseSBpbiBjcnlwdG8vZWMvZWNfbGliLmMgYW5kIG5vdCBkaXNwYXRjaGVkCiAgICAgdG8gbWV0aG9kcywgd2hpY2ggd291bGQgbGVhZCB0byB1bm5lY2Vzc2FyeSBjb2RlIGR1cGxpY2F0aW9uIHdoZW4KICAgICBhZGRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGN1cnZlcy4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT4gd2l0aCBpbnB1dCBieSBCb2RvIE1vZWxsZXJdCgogICopIEltcGxlbWVudCBjb21wdXRlX3dOQUYgKGNyeXB0by9lYy9lY19tdWx0LmMpIHdpdGhvdXQgQklHTlVNCiAgICAgYXJpdGhtZXRpYywgYW5kIHN1Y2ggdGhhdCBtb2RpZmllZCB3TkFGcyBhcmUgZ2VuZXJhdGVkCiAgICAgKHdoaWNoIGF2b2lkIGxlbmd0aCBleHBhbnNpb24gaW4gbWFueSBjYXNlcykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGEgZnVuY3Rpb24gRUNfR1JPVVBfY2hlY2tfZGlzY3JpbWluYW50KCkgKGRlZmluZWQgdmlhCiAgICAgRUNfTUVUSE9EKSB0aGF0IHZlcmlmaWVzIHRoYXQgdGhlIGN1cnZlIGRpc2NyaW1pbmFudCBpcyBub24temVyby4KCiAgICAgQWRkIGEgZnVuY3Rpb24gRUNfR1JPVVBfY2hlY2soKSB0aGF0IG1ha2VzIHNvbWUgc2FuaXR5IHRlc3RzCiAgICAgb24gYSBFQ19HUk9VUCwgaXRzIGdlbmVyYXRvciBhbmQgb3JkZXIuICBUaGlzIGluY2x1ZGVzCiAgICAgRUNfR1JPVVBfY2hlY2tfZGlzY3JpbWluYW50KCkuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgRUNEU0EgaW4gbmV3IGRpcmVjdG9yeSBjcnlwdG8vZWNkc2EvLgoKICAgICBBZGQgYXBwbGljYXRpb25zICdvcGVuc3NsIGVjcGFyYW0nIGFuZCAnb3BlbnNzbCBlY2RzYScKICAgICAodGhlc2UgYXJlIGJhc2VkIG9uICdvcGVuc3NsIGRzYXBhcmFtJyBhbmQgJ29wZW5zc2wgZHNhJykuCgogICAgIEVDRFNBIHN1cHBvcnQgaXMgYWxzbyBpbmNsdWRlZCBpbiB2YXJpb3VzIG90aGVyIGZpbGVzIGFjcm9zcyB0aGUKICAgICBsaWJyYXJ5LiAgTW9zdCBub3RhYmx5LAogICAgIC0gJ29wZW5zc2wgcmVxJyBub3cgaGFzIGEgJy1uZXdrZXkgZWNkc2E6ZmlsZScgb3B0aW9uOwogICAgIC0gRVZQX1BLQ1M4MlBLRVkgKGNyeXB0by9ldnAvZXZwX3BrZXkuYykgbm93IGNhbiBoYW5kbGUgRUNEU0E7CiAgICAgLSBYNTA5X1BVQktFWV9nZXQgKGNyeXB0by9hc24xL3hfcHVia2V5LmMpIGFuZAogICAgICAgZDJpX1B1YmxpY0tleSAoY3J5cHRvL2FzbjEvZDJpX3B1LmMpIGhhdmUgYmVlbiBtb2RpZmllZCB0byBtYWtlCiAgICAgICB0aGVtIHN1aXRhYmxlIGZvciBFQ0RTQSB3aGVyZSBkb21haW4gcGFyYW1ldGVycyBtdXN0IGJlCiAgICAgICBleHRyYWN0ZWQgYmVmb3JlIHRoZSBzcGVjaWZpYyBwdWJsaWMga2V5OwogICAgIC0gRUNEU0EgZW5naW5lIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBJbmNsdWRlIHNvbWUgbmFtZWQgZWxsaXB0aWMgY3VydmVzLCBhbmQgYWRkIE9JRHMgZnJvbSBYOS42MiwKICAgICBTRUNHLCBhbmQgV0FQL1dUTFMuICBFYWNoIGN1cnZlIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBuZXcKICAgICBmdW5jdGlvbgogICAgICAgICAgRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoKSwKICAgICBhbmQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG5hbWVkIGN1cnZlcyBjYW4gYmUgb2J0YWluZWQgd2l0aAogICAgICAgICAgRUNfZ2V0X2J1aWx0aW5fY3VydmVzKCkuCiAgICAgQWxzbyBhZGQgYSAnY3VydmVfbmFtZScgbWVtYmVyIHRvIEVDX0dST1VQIG9iamVjdHMsIHdoaWNoIGNhbiBiZQogICAgIGFjY2Vzc2VkIHZpYQogICAgICAgICBFQ19HUk9VUF9zZXRfY3VydmVfbmFtZSgpCiAgICAgICAgIEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKCkKICAgICBbTmlscyBMYXJzY2ggPGxhcnNjaEB0cnVzdGNlbnRlci5kZSwgQm9kbyBNb2VsbGVyXQogCiAgKikgUmVtb3ZlIGEgZmV3IGNhbGxzIHRvIGJuX3dleHBhbmQoKSBpbiBCTl9zcXIoKSAodGhlIG9uZSBpbiB0aGVyZQogICAgIHdhcyBhY3R1YWxseSBuZXZlciBuZWVkZWQpIGFuZCBpbiBCTl9tdWwoKS4gIFRoZSByZW1vdmFsIGluIEJOX211bCgpCiAgICAgcmVxdWlyZWQgYSBzbWFsbCBjaGFuZ2UgaW4gYm5fbXVsX3BhcnRfcmVjdXJzaXZlKCkgYW5kIHRoZSBhZGRpdGlvbgogICAgIG9mIHRoZSBmdW5jdGlvbnMgYm5fY21wX3BhcnRfd29yZHMoKSwgYm5fc3ViX3BhcnRfd29yZHMoKSBhbmQKICAgICBibl9hZGRfcGFydF93b3JkcygpLCB3aGljaCBkbyB0aGUgc2FtZSB0aGluZyBhcyBibl9jbXBfd29yZHMoKSwKICAgICBibl9zdWJfd29yZHMoKSBhbmQgYm5fYWRkX3dvcmRzKCkgZXhjZXB0IHRoZXkgdGFrZSBhcnJheXMgd2l0aAogICAgIGRpZmZlcmluZyBzaXplcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2wgYW5kIDAuOS43bSAgWzIzIEZlYiAyMDA3XQoKICAqKSBDbGVhbnNlIFBFTSBidWZmZXJzIGJlZm9yZSBmcmVlaW5nIHRoZW0gc2luY2UgdGhleSBtYXkgY29udGFpbiAKICAgICBzZW5zaXRpdmUgZGF0YS4KICAgICBbQmVuamFtaW4gQmVubmV0dCA8YmVuQHBzYy5lZHU+XQoKICAqKSBJbmNsdWRlICIhZU5VTEwiIGluIFNTTF9ERUZBVUxUX0NJUEhFUl9MSVNUIHRvIG1ha2Ugc3VyZSB0aGF0CiAgICAgYSBjaXBoZXJzdWl0ZSBzdHJpbmcgc3VjaCBhcyAiREVGQVVMVDpSU0EiIGNhbm5vdCBlbmFibGUKICAgICBhdXRoZW50aWNhdGlvbi1vbmx5IGNpcGhlcnN1aXRlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTaW5jZSBBRVMxMjggYW5kIEFFUzI1NiBzaGFyZSBhIHNpbmdsZSBtYXNrIGJpdCBpbiB0aGUgbG9naWMgb2YKICAgICBzc2wvc3NsX2NpcGguYywgdGhlIGNvZGUgZm9yIG1hc2tpbmcgb3V0IGRpc2FibGVkIGNpcGhlcnMgbmVlZHMgYQogICAgIGtsdWRnZSB0byB3b3JrIHByb3Blcmx5IGlmIEFFUzEyOCBpcyBhdmFpbGFibGUgYW5kIEFFUzI1NiBpc24ndC4KICAgICBbVmljdG9yIER1Y2hvdm5pXQoKICAqKSBFeHBhbmQgc2VjdXJpdHkgYm91bmRhcnkgdG8gbWF0Y2ggMS4xLjEgbW9kdWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSByZWR1bmRhbnQgZmVhdHVyZXM6IGhhc2ggZmlsZSBzb3VyY2UsIGVkaXRpbmcgb2YgdGVzdCB2ZWN0b3JzCiAgICAgbW9kaWZ5IGZpcHNsZCB0byB1c2UgZXh0ZXJuYWwgZmlwc19wcmVtYWluLmMgc2lnbmF0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBwZXJsIHNjcmlwdCBta2ZpcHNzY3IucGwgdG8gY3JlYXRlIHNoZWxsIHNjcmlwdHMgb3IgYmF0Y2ggZmlsZXMgdG8KICAgICBydW4gYWxnb3JpdGhtIHRlc3QgcHJvZ3JhbXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBhbGdvcml0aG0gdGVzdCBwcm9ncmFtcyBtb3JlIHRvbGVyYW50IG9mIHdoaXRlc3BhY2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSGF2ZSBTU0wvVExTIHNlcnZlciBpbXBsZW1lbnRhdGlvbiB0b2xlcmF0ZSAibWlzbWF0Y2hlZCIgcmVjb3JkCiAgICAgcHJvdG9jb2wgdmVyc2lvbiB3aGlsZSByZWNlaXZpbmcgQ2xpZW50SGVsbG8gZXZlbiBpZiB0aGUKICAgICBDbGllbnRIZWxsbyBpcyBmcmFnbWVudGVkLiAgKFRoZSBzZXJ2ZXIgY2FuJ3QgaW5zaXN0IG9uIHRoZQogICAgIHBhcnRpY3VsYXIgcHJvdG9jb2wgdmVyc2lvbiBpdCBoYXMgY2hvc2VuIGJlZm9yZSB0aGUgU2VydmVySGVsbG8KICAgICBtZXNzYWdlIGhhcyBpbmZvcm1lZCB0aGUgY2xpZW50IGFib3V0IGhpcyBjaG9pY2UuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIExvYWQgZXJyb3IgY29kZXMgaWYgdGhleSBhcmUgbm90IGFscmVhZHkgcHJlc2VudCBpbnN0ZWFkIG9mIHVzaW5nIGEKICAgICBzdGF0aWMgdmFyaWFibGUuIFRoaXMgYWxsb3dzIHRoZW0gdG8gYmUgY2xlYW5seSB1bmxvYWRlZCBhbmQgcmVsb2FkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdrIGFuZCAwLjkuN2wgIFsyOCBTZXAgMjAwNl0KCiAgKikgSW50cm9kdWNlIGxpbWl0cyB0byBwcmV2ZW50IG1hbGljaW91cyBrZXlzIGJlaW5nIGFibGUgdG8KICAgICBjYXVzZSBhIGRlbmlhbCBvZiBzZXJ2aWNlLiAgKENWRS0yMDA2LTI5NDApCiAgICAgW1N0ZXZlIEhlbnNvbiwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQVNOLjEgcGFyc2luZyBvZiBjZXJ0YWluIGludmFsaWQgc3RydWN0dXJlcyB0aGF0IGNhbiByZXN1bHQKICAgICBpbiBhIGRlbmlhbCBvZiBzZXJ2aWNlLiAgKENWRS0yMDA2LTI5MzcpICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVmZmVyIG92ZXJmbG93IGluIFNTTF9nZXRfc2hhcmVkX2NpcGhlcnMoKSBmdW5jdGlvbi4gCiAgICAgKENWRS0yMDA2LTM3MzgpIFtUYXZpcyBPcm1hbmR5IGFuZCBXaWxsIERyZXdyeSwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIEZpeCBTU0wgY2xpZW50IGNvZGUgd2hpY2ggY291bGQgY3Jhc2ggaWYgY29ubmVjdGluZyB0byBhCiAgICAgbWFsaWNpb3VzIFNTTHYyIHNlcnZlci4gIChDVkUtMjAwNi00MzQzKQogICAgIFtUYXZpcyBPcm1hbmR5IGFuZCBXaWxsIERyZXdyeSwgR29vZ2xlIFNlY3VyaXR5IFRlYW1dCgogICopIENoYW5nZSBjaXBoZXJzdWl0ZSBzdHJpbmcgcHJvY2Vzc2luZyBzbyB0aGF0IGFuIGV4cGxpY2l0CiAgICAgY2lwaGVyc3VpdGUgc2VsZWN0cyB0aGlzIG9uZSBjaXBoZXJzdWl0ZSAoc28gdGhhdCAiQUVTMjU2LVNIQSIKICAgICB3aWxsIG5vIGxvbmdlciBpbmNsdWRlICJBRVMxMjgtU0hBIiksIGFuZCBhbnkgb3RoZXIgc2ltaWxhcgogICAgIGNpcGhlcnN1aXRlIChzYW1lIGJpdG1hcCkgZnJvbSAqb3RoZXIqIHByb3RvY29sIHZlcnNpb25zIChzbyB0aGF0CiAgICAgIlJDNC1NRDUiIHdpbGwgc3RpbGwgaW5jbHVkZSBib3RoIHRoZSBTU0wgMi4wIGNpcGhlcnN1aXRlIGFuZCB0aGUKICAgICBTU0wgMy4wL1RMUyAxLjAgY2lwaGVyc3VpdGUpLiAgVGhpcyBpcyBhIGJhY2twb3J0IGNvbWJpbmluZwogICAgIGNoYW5nZXMgZnJvbSAwLjkuOGIgYW5kIDAuOS44ZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2ogYW5kIDAuOS43ayAgWzA1IFNlcCAyMDA2XQoKICAqKSBBdm9pZCBQS0NTICMxIHYxLjUgc2lnbmF0dXJlIGF0dGFjayBkaXNjb3ZlcmVkIGJ5IERhbmllbCBCbGVpY2hlbmJhY2hlcgogICAgIChDVkUtMjAwNi00MzM5KSAgW0JlbiBMYXVyaWUgYW5kIEdvb2dsZSBTZWN1cml0eSBUZWFtXQoKICAqKSBDaGFuZ2UgdGhlIFVuaXggcmFuZG9tbmVzcyBlbnRyb3B5IGdhdGhlcmluZyB0byB1c2UgcG9sbCgpIHdoZW4KICAgICBwb3NzaWJsZSBpbnN0ZWFkIG9mIHNlbGVjdCgpLCBzaW5jZSB0aGUgbGF0dGVyIGhhcyBzb21lCiAgICAgdW5kZXNpcmFibGUgbGltaXRhdGlvbnMuCiAgICAgW0RhcnJ5bCBNaWxlcyB2aWEgUmljaGFyZCBMZXZpdHRlIGFuZCBCb2RvIE1vZWxsZXJdCgogICopIERpc2FibGUgcm9ndWUgY2lwaGVyc3VpdGVzOgoKICAgICAgLSBTU0x2MiAweDA4IDB4MDAgMHg4MCAoIlJDNC02NC1NRDUiKQogICAgICAtIFNTTHYzL1RMU3YxIDB4MDAgMHg2MSAoIkVYUDEwMjQtUkMyLUNCQy1NRDUiKQogICAgICAtIFNTTHYzL1RMU3YxIDB4MDAgMHg2MCAoIkVYUDEwMjQtUkM0LU1ENSIpCgogICAgIFRoZSBsYXR0ZXIgdHdvIHdlcmUgcHVycG9ydGVkbHkgZnJvbQogICAgIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMFswMV0udHh0LCBidXQgZG8gbm90IHJlYWxseQogICAgIGFwcGVhciB0aGVyZS4KCiAgICAgQWxzbyBkZWFjdGl2ZSB0aGUgcmVtYWluaW5nIGNpcGhlcnN1aXRlcyBmcm9tCiAgICAgZHJhZnQtaWV0Zi10bHMtNTYtYml0LWNpcGhlcnN1aXRlcy0wMS50eHQuICBUaGVzZSBhcmUganVzdCBhcwogICAgIHVub2ZmaWNpYWwsIGFuZCB0aGUgSUQgaGFzIGxvbmcgZXhwaXJlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggUlNBIGJsaW5kaW5nIEhlaXNlbmJ1ZyAocHJvYmxlbXMgc29tZXRpbWVzIG9jY3VyZWQgb24KICAgICBkdWFsLWNvcmUgbWFjaGluZXMpIGFuZCBvdGhlciBwb3RlbnRpYWwgdGhyZWFkLXNhZmV0eSBpc3N1ZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdpIGFuZCAwLjkuN2ogIFswNCBNYXkgMjAwNl0KCiAgKikgQWRhcHQgZmlwc2xkIGFuZCB0aGUgYnVpbGQgc3lzdGVtIHRvIGxpbmsgYWdhaW5zdCB0aGUgdmFsaWRhdGVkIEZJUFMKICAgICBtb2R1bGUgaW4gRklQUyBtb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeGVzIGZvciBWQysrIDIwMDUgYnVpbGQgdW5kZXIgV2luZG93cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IFdpbmRvd3MgYnVpbGQgdGFyZ2V0IFZDLTMyLUdNQUtFIGZvciBWQysrLiBUaGlzIHVzZXMgR05VIG1ha2UgCiAgICAgZnJvbSBhIFdpbmRvd3MgYmFzaCBzaGVsbCBzdWNoIGFzIE1TWVMuIEl0IGlzIGF1dG9kZXRlY3RlZCBmcm9tIHRoZQogICAgICJjb25maWciIHNjcmlwdCB3aGVuIHJ1biBmcm9tIGEgVkMrKyBlbnZpcm9ubWVudC4gTW9kaWZ5IHN0YW5kYXJkIFZDKysKICAgICBidWlsZCB0byB1c2UgZmlwc2NhbmlzdGVyLm8gZnJvbSB0aGUgR05VIG1ha2UgYnVpbGQuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43aCBhbmQgMC45LjdpICBbMTQgT2N0IDIwMDVdCgogICopIFdyYXBwZWQgdGhlIGRlZmluaXRpb24gb2YgRVZQX01BWF9NRF9TSVpFIGluIGEgI2lmZGVmIE9QRU5TU0xfRklQUy4KICAgICBUaGUgdmFsdWUgbm93IGRpZmZlcnMgZGVwZW5kaW5nIG9uIGlmIHlvdSBidWlsZCBmb3IgRklQUyBvciBub3QuCiAgICAgQkVXQVJFISAgQSBwcm9ncmFtIGxpbmtlZCB3aXRoIGEgc2hhcmVkIEZJUFNlZCBsaWJjcnlwdG8gY2FuJ3QgYmUKICAgICBzYWZlbHkgcnVuIHdpdGggYSBub24tRklQU2VkIGxpYmNyeXB0bywgYXMgaXQgbWF5IGNyYXNoIGJlY2F1c2Ugb2YKICAgICB0aGUgZGlmZmVyZW5jZSBpbmR1Y2VkIGJ5IHRoaXMgY2hhbmdlLgogICAgIFtBbmR5IFBvbHlha292XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2cgYW5kIDAuOS43aCAgWzExIE9jdCAyMDA1XQoKICAqKSBSZW1vdmUgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgU1NMX09QX01TSUVfU1NMVjJfUlNBX1BBRERJTkcKICAgICAocGFydCBvZiBTU0xfT1BfQUxMKS4gIFRoaXMgb3B0aW9uIHVzZWQgdG8gZGlzYWJsZSB0aGUKICAgICBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IG1hbi1pbi10aGUtbWlkZGxlIHByb3RvY29sLXZlcnNpb24KICAgICByb2xsYmFjayBpbiB0aGUgU1NMIDIuMCBzZXJ2ZXIgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIGEgYmFkCiAgICAgaWRlYS4gIChDVkUtMjAwNS0yOTY5KQoKICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IFl1dGFrYSBPaXdhIChSZXNlYXJjaCBDZW50ZXIKICAgICBmb3IgSW5mb3JtYXRpb24gU2VjdXJpdHksIE5hdGlvbmFsIEluc3RpdHV0ZSBvZiBBZHZhbmNlZCBJbmR1c3RyaWFsCiAgICAgU2NpZW5jZSBhbmQgVGVjaG5vbG9neSBbQUlTVF0sIEphcGFuKV0KCiAgKikgTWluaW1hbCBzdXBwb3J0IGZvciBYOS4zMSBzaWduYXR1cmVzIGFuZCBQU1MgcGFkZGluZyBtb2Rlcy4gVGhpcyBpcwogICAgIG1haW5seSBmb3IgRklQUyBjb21wbGlhbmNlIGFuZCBub3QgZnVsbHkgaW50ZWdyYXRlZCBhdCB0aGlzIHN0YWdlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZvciBEU0Egc2lnbmluZywgdW5sZXNzIERTQV9GTEFHX05PX0VYUF9DT05TVFRJTUUgaXMgc2V0LCBwZXJmb3JtCiAgICAgdGhlIGV4cG9uZW50aWF0aW9uIHVzaW5nIGEgZml4ZWQtbGVuZ3RoIGV4cG9uZW50LiAgKE90aGVyd2lzZSwKICAgICB0aGUgaW5mb3JtYXRpb24gbGVha2VkIHRocm91Z2ggdGltaW5nIGNvdWxkIGV4cG9zZSB0aGUgc2VjcmV0IGtleQogICAgIGFmdGVyIG1hbnkgc2lnbmF0dXJlczsgY2YuIEJsZWljaGVuYmFjaGVyJ3MgYXR0YWNrIG9uIERTQSB3aXRoCiAgICAgYmlhc2VkIGsuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgYSBuZXcgZml4ZWQtd2luZG93IG1vZF9leHAgaW1wbGVtZW50YXRpb24gdGhlIGRlZmF1bHQgZm9yCiAgICAgUlNBLCBEU0EsIGFuZCBESCBwcml2YXRlLWtleSBvcGVyYXRpb25zIHNvIHRoYXQgdGhlIHNlcXVlbmNlIG9mCiAgICAgc3F1YXJlcyBhbmQgbXVsdGlwbGllcyBhbmQgdGhlIG1lbW9yeSBhY2Nlc3MgcGF0dGVybiBhcmUKICAgICBpbmRlcGVuZGVudCBvZiB0aGUgcGFydGljdWxhciBzZWNyZXQga2V5LiAgVGhpcyB3aWxsIG1pdGlnYXRlCiAgICAgY2FjaGUtdGltaW5nIGFuZCBwb3RlbnRpYWwgcmVsYXRlZCBhdHRhY2tzLgoKICAgICBCTl9tb2RfZXhwX21vbnRfY29uc3R0aW1lKCkgaXMgdGhlIG5ldyBleHBvbmVudGlhdGlvbiBpbXBsZW1lbnRhdGlvbiwKICAgICBhbmQgdGhpcyBpcyBhdXRvbWF0aWNhbGx5IHVzZWQgYnkgQk5fbW9kX2V4cF9tb250KCkgaWYgdGhlIG5ldyBmbGFnCiAgICAgQk5fRkxHX0VYUF9DT05TVFRJTUUgaXMgc2V0IGZvciB0aGUgZXhwb25lbnQuICBSU0EsIERTQSwgYW5kIERICiAgICAgd2lsbCB1c2UgdGhpcyBCTiBmbGFnIGZvciBwcml2YXRlIGV4cG9uZW50cyB1bmxlc3MgdGhlIGZsYWcKICAgICBSU0FfRkxBR19OT19FWFBfQ09OU1RUSU1FLCBEU0FfRkxBR19OT19FWFBfQ09OU1RUSU1FLCBvcgogICAgIERIX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSwgcmVzcGVjdGl2ZWx5LCBpcyBzZXQuCgogICAgIFtNYXR0aGV3IEQgV29vZCAoSW50ZWwgQ29ycCksIHdpdGggc29tZSBjaGFuZ2VzIGJ5IEJvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSBjbGllbnQgaW1wbGVtZW50YXRpb24gZm9yIFNTTHYyM19tZXRob2QoKSBhbmQKICAgICBTU0x2MjNfY2xpZW50X21ldGhvZCgpIHNvIHRoYXQgaXMgdXNlcyB0aGUgU1NMIDMuMC9UTFMgMS4wCiAgICAgQ2xpZW50IEhlbGxvIG1lc3NhZ2UgZm9ybWF0IGlmIHRoZSBTU0xfT1BfTk9fU1NMdjIgb3B0aW9uIGlzIHNldC4KICAgICAoUHJldmlvdXNseSwgdGhlIFNTTCAyLjAgYmFja3dhcmRzIGNvbXBhdGlibGUgQ2xpZW50IEhlbGxvCiAgICAgbWVzc2FnZSBmb3JtYXQgd291bGQgYmUgdXNlZCBldmVuIHdpdGggU1NMX09QX05PX1NTTHYyLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igc21pbWUtdHlwZSBNSU1FIHBhcmFtZXRlciBpbiBTL01JTUUgbWVzc2FnZXMgd2hpY2ggc29tZQogICAgIGNsaWVudHMgbmVlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fTU9OVF9DVFhfc2V0X2xvY2tlZCgpIHRvIHNldCBtb250Z29tZXJ5IHBhcmFtZXRlcnMgaW4KICAgICBhIHRocmVhZHNhZmUgbWFubmVyLiBNb2RpZnkgcnNhIGNvZGUgdG8gdXNlIG5ldyBmdW5jdGlvbiBhbmQgYWRkIGNhbGxzCiAgICAgdG8gZHNhIGFuZCBkaCBjb2RlICh3aGljaCBoYWQgcmFjZSBjb25kaXRpb25zIGJlZm9yZSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5jbHVkZSB0aGUgZml4ZWQgZXJyb3IgbGlicmFyeSBjb2RlIGluIHRoZSBDIGVycm9yIGZpbGUgZGVmaW5pdGlvbnMKICAgICBpbnN0ZWFkIG9mIGZpeGluZyB0aGVtIHVwIGF0IHJ1bnRpbWUuIFRoaXMga2VlcHMgdGhlIGVycm9yIGNvZGUKICAgICBzdHJ1Y3R1cmVzIGNvbnN0YW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43ZiBhbmQgMC45LjdnICBbMTEgQXByIDIwMDVdCgogIFtOQjogT3BlblNTTCAwLjkuN2ggYW5kIGxhdGVyIDAuOS43IHBhdGNoIGxldmVscyB3ZXJlIHJlbGVhc2VkIGFmdGVyCiAgT3BlblNTTCAwLjkuOC5dCgogICopIEZpeGVzIGZvciBuZXdlciBrZXJiZXJvcyBoZWFkZXJzLiBOQjogdGhlIGNhc3RzIGFyZSBuZWVkZWQgYmVjYXVzZQogICAgIHRoZSAnbGVuZ3RoJyBmaWVsZCBpcyBzaWduZWQgb24gb25lIHZlcnNpb24gYW5kIHVuc2lnbmVkIG9uIGFub3RoZXIKICAgICB3aXRoIG5vICg/KSBvYnZpb3VzIHdheSB0byB0ZWxsIHRoZSBkaWZmZXJlbmNlLCB3aXRob3V0IHRoZXNlIFZDKysKICAgICBjb21wbGFpbnMuIEFsc28gdGhlICJkZWZpbml0aW9uIiBvZiBGQVIgKGJsYW5rKSBpcyBubyBsb25nZXIgaW5jbHVkZWQKICAgICBub3IgaXMgdGhlIGVycm9yIEVOT01FTS4gS1JCNV9QUklWQVRFIGhhcyB0byBiZSBzZXQgdG8gMSB0byBwaWNrIHVwCiAgICAgc29tZSBuZWVkZWQgZGVmaW5pdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVW5kbyBDeWd3aW4gY2hhbmdlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBwcm94eSBjZXJ0aWZpY2F0ZXMgYWNjb3JkaW5nIHRvIFJGQyAzODIwLgogICAgIEJlY2F1c2UgdGhleSBtYXkgYmUgYSBzZWN1cml0eSB0aHJlYWQgdG8gdW5hd2FyZSBhcHBsaWNhdGlvbnMsCiAgICAgdGhleSBtdXN0IGJlIGV4cGxpY2l0ZWx5IGFsbG93ZWQgaW4gcnVuLXRpbWUuICBTZWUKICAgICBkb2NzL0hPV1RPL3Byb3h5X2NlcnRpZmljYXRlcy50eHQgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdlIGFuZCAwLjkuN2YgIFsyMiBNYXIgMjAwNV0KCiAgKikgVXNlIChTU0xfUkFORE9NX1ZBTFVFIC0gNCkgYnl0ZXMgb2YgcHNldWRvIHJhbmRvbSBkYXRhIHdoZW4gZ2VuZXJhdGluZwogICAgIHNlcnZlciBhbmQgY2xpZW50IHJhbmRvbSB2YWx1ZXMuIFByZXZpb3VzbHkKICAgICAoU1NMX1JBTkRPTV9WQUxVRSAtIHNpemVvZih0aW1lX3QpKSB3b3VsZCBiZSB1c2VkIHdoaWNoIHdvdWxkIHJlc3VsdCBpbgogICAgIGxlc3MgcmFuZG9tIGRhdGEgd2hlbiBzaXplb2YodGltZV90KSA+IDQgKHNvbWUgNjQgYml0IHBsYXRmb3JtcykuCgogICAgIFRoaXMgY2hhbmdlIGhhcyBuZWdsaWdpYmxlIHNlY3VyaXR5IGltcGFjdCBiZWNhdXNlOgoKICAgICAxLiBTZXJ2ZXIgYW5kIGNsaWVudCByYW5kb20gdmFsdWVzIHN0aWxsIGhhdmUgMjQgYnl0ZXMgb2YgcHNldWRvIHJhbmRvbQogICAgICAgIGRhdGEuCgogICAgIDIuIFNlcnZlciBhbmQgY2xpZW50IHJhbmRvbSB2YWx1ZXMgYXJlIHNlbnQgaW4gdGhlIGNsZWFyIGluIHRoZSBpbml0aWFsCiAgICAgICAgaGFuZHNoYWtlLgoKICAgICAzLiBUaGUgbWFzdGVyIHNlY3JldCBpcyBkZXJpdmVkIHVzaW5nIHRoZSBwcmVtYXN0ZXIgc2VjcmV0ICg0OCBieXRlcyBpbgogICAgICAgIHNpemUgZm9yIHN0YXRpYyBSU0EgY2lwaGVyc3VpdGVzKSBhcyB3ZWxsIGFzIGNsaWVudCBzZXJ2ZXIgYW5kIHJhbmRvbQogICAgICAgIHZhbHVlcy4KCiAgICAgVGhlIE9wZW5TU0wgdGVhbSB3b3VsZCBsaWtlIHRvIHRoYW5rIHRoZSBVSyBOSVNDQyBmb3IgYnJpbmdpbmcgdGhpcyBpc3N1ZQogICAgIHRvIG91ciBhdHRlbnRpb24uIAoKICAgICBbU3RlcGhlbiBIZW5zb24sIHJlcG9ydGVkIGJ5IFVLIE5JU0NDXQoKICAqKSBVc2UgV2luZG93cyByYW5kb21uZXNzIGNvbGxlY3Rpb24gb24gQ3lnd2luLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggaGFuZyBpbiBFR0QvUFJOR0QgcXVlcnkgd2hlbiBjb21tdW5pY2F0aW9uIHNvY2tldCBpcyBjbG9zZWQKICAgICBwcmVtYXR1cmVseSBieSBFR0QvUFJOR0QuCiAgICAgW0RhcnJlbiBUdWNrZXIgPGR0dWNrZXJAemlwLmNvbS5hdT4gdmlhIEx1dHogSuRuaWNrZSwgcmVzb2x2ZXMgIzEwMTRdCgogICopIFByb21wdCBmb3IgcGFzcyBwaHJhc2VzIHdoZW4gYXBwcm9wcmlhdGUgZm9yIFBLQ1MxMiBpbnB1dCBmb3JtYXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQmFjay1wb3J0IG9mIHNlbGVjdGVkIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cyBmcm9tIGRldmVsb3BtZW50CiAgICAgYnJhbmNoLCBhcyB3ZWxsIGFzIGltcHJvdmVkIHN1cHBvcnQgZm9yIFBvd2VyUEMgcGxhdGZvcm1zLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgbG90cyBvZiBjaGVja3MgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUsIGVycm9yIGNvZGVzIHRvIGluZGljYXRlCiAgICAgZmFpbHVyZSBhbmQgZnJlZWluZyB1cCBtZW1vcnkgaWYgYSBmYWlsdXJlIG9jY3Vycy4KICAgICBbTmF1dGljdXMgTmV0d29ya3MgU1NMIFRlYW0gPG9wZW5zc2xAbmF1dGljdXNuZXQuY29tPiwgU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IC1wYXNzaW4gYXJndW1lbnQgdG8gZGdzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQZXJmb3JtIHNvbWUgY2hhcmFjdGVyIGNvbXBhcmlzb25zIG9mIGRpZmZlcmVudCB0eXBlcyBpbiBYNTA5X05BTUVfY21wOgogICAgIHRoaXMgaXMgbmVlZGVkIGZvciBzb21lIGNlcnRpZmljYXRlcyB0aGF0IHJlZW5jb2RlIEROcyBpbnRvIFVURjhTdHJpbmdzCiAgICAgKGluIHZpb2xhdGlvbiBvZiBSRkMzMjgwKSBhbmQgY2FuJ3Qgb3Igd29udCBpc3N1ZSBuYW1lIHJvbGxvdmVyCiAgICAgY2VydGlmaWNhdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgYW4gZXhwbGljaXQgY2hlY2sgZHVyaW5nIGNlcnRpZmljYXRlIHZhbGlkYXRpb24gdG8gc2VlIHRoYXQKICAgICB0aGUgQ0Egc2V0dGluZyBpbiBlYWNoIGNlcnRpZmljYXRlIG9uIHRoZSBjaGFpbiBpcyBjb3JyZWN0LiAgQXMgYQogICAgIHNpZGUgZWZmZWN0IGFsd2F5cyBkbyB0aGUgZm9sbG93aW5nIGJhc2ljIGNoZWNrcyBvbiBleHRlbnNpb25zLAogICAgIG5vdCBqdXN0IHdoZW4gdGhlcmUncyBhbiBhc3NvY2lhdGVkIHB1cnBvc2UgdG8gdGhlIGNoZWNrOgoKICAgICAgLSBpZiB0aGVyZSBpcyBhbiB1bmhhbmRsZWQgY3JpdGljYWwgZXh0ZW5zaW9uICh1bmxlc3MgdGhlIHVzZXIKICAgICAgICBoYXMgY2hvc2VuIHRvIGlnbm9yZSB0aGlzIGZhdWx0KQogICAgICAtIGlmIHRoZSBwYXRoIGxlbmd0aCBoYXMgYmVlbiBleGNlZWRlZCAoaWYgb25lIGlzIHNldCBhdCBhbGwpCiAgICAgIC0gdGhhdCBjZXJ0YWluIGV4dGVuc2lvbnMgZml0IHRoZSBhc3NvY2lhdGVkIHB1cnBvc2UgKGlmIG9uZSBoYXMKICAgICAgICBiZWVuIGdpdmVuKQogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43ZCBhbmQgMC45LjdlICBbMjUgT2N0IDIwMDRdCgogICopIEF2b2lkIGEgcmFjZSBjb25kaXRpb24gd2hlbiBDUkxzIGFyZSBjaGVja2VkIGluIGEgbXVsdGkgdGhyZWFkZWQgCiAgICAgZW52aXJvbm1lbnQuIFRoaXMgd291bGQgaGFwcGVuIGR1ZSB0byB0aGUgcmVvcmRlcmluZyBvZiB0aGUgcmV2b2tlZAogICAgIGVudHJpZXMgZHVyaW5nIHNpZ25hdHVyZSBjaGVja2luZyBhbmQgc2VyaWFsIG51bWJlciBsb29rdXAuIE5vdyB0aGUKICAgICBlbmNvZGluZyBpcyBjYWNoZWQgYW5kIHRoZSBzZXJpYWwgbnVtYmVyIHNvcnQgcGVyZm9ybWVkIHVuZGVyIGEgbG9jay4KICAgICBBZGQgbmV3IFNUQUNLIGZ1bmN0aW9uIHNrX2lzX3NvcnRlZCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBEZWx0YSBDUkwgdG8gdGhlIGV4dGVuc2lvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgZml4ZXMgdG8gczNfcGt0LmMgc28gYWxlcnRzIGFyZSBzZW50IHByb3Blcmx5LgogICAgIFtEYXZpZCBIb2xtZXMgPGQuaG9sbWVzQGY1LmNvbT5dCgogICopIFJlZHVjZSB0aGUgY2hhbmNlcyBvZiBkdXBsaWNhdGUgaXNzdWVyIG5hbWUgYW5kIHNlcmlhbCBudW1iZXJzIChpbgogICAgIHZpb2xhdGlvbiBvZiBSRkMzMjgwKSB1c2luZyB0aGUgT3BlblNTTCBjZXJ0aWZpY2F0ZSBjcmVhdGlvbiB1dGlsaXRpZXMuCiAgICAgVGhpcyBpcyBkb25lIGJ5IGNyZWF0aW5nIGEgcmFuZG9tIDY0IGJpdCB2YWx1ZSBmb3IgdGhlIGluaXRpYWwgc2VyaWFsCiAgICAgbnVtYmVyIHdoZW4gYSBzZXJpYWwgbnVtYmVyIGZpbGUgaXMgY3JlYXRlZCBvciB3aGVuIGEgc2VsZiBzaWduZWQKICAgICBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIHVzaW5nICdvcGVuc3NsIHJlcSAteDUwOScuIFRoZSBpbml0aWFsIHNlcmlhbAogICAgIG51bWJlciBmaWxlIGlzIGNyZWF0ZWQgdXNpbmcgJ29wZW5zc2wgeDUwOSAtbmV4dF9zZXJpYWwnIGluIENBLnBsCiAgICAgcmF0aGVyIHRoYW4gYmVpbmcgaW5pdGlhbGl6ZWQgdG8gMS4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2MgYW5kIDAuOS43ZCAgWzE3IE1hciAyMDA0XQoKICAqKSBGaXggbnVsbC1wb2ludGVyIGFzc2lnbm1lbnQgaW4gZG9fY2hhbmdlX2NpcGhlcl9zcGVjKCkgcmV2ZWFsZWQgICAgICAgICAgIAogICAgIGJ5IHVzaW5nIHRoZSBDb2Rlbm9taWNvbiBUTFMgVGVzdCBUb29sIChDVkUtMjAwNC0wMDc5KSAgICAgICAgICAgICAgICAgICAgCiAgICAgW0pvZSBPcnRvbiwgU3RldmUgSGVuc29uXSAgIAoKICAqKSBGaXggZmxhdyBpbiBTU0wvVExTIGhhbmRzaGFraW5nIHdoZW4gdXNpbmcgS2VyYmVyb3MgY2lwaGVyc3VpdGVzCiAgICAgKENWRS0yMDA0LTAxMTIpCiAgICAgW0pvZSBPcnRvbiwgU3RldmUgSGVuc29uXSAgIAoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGhhdmUgbXVsdGlwbGUgYWN0aXZlIGNlcnRpZmljYXRlcyB3aXRoIHRoZSBzYW1lCiAgICAgc3ViamVjdCBpbiB0aGUgQ0EgaW5kZXggZmlsZS4gIFRoaXMgaXMgZG9uZSBvbmx5IGlmIHRoZSBrZXl3b3JkCiAgICAgJ3VuaXF1ZV9zdWJqZWN0JyBpcyBzZXQgdG8gJ25vJyBpbiB0aGUgbWFpbiBDQSBzZWN0aW9uIChkZWZhdWx0CiAgICAgaWYgJ0NBX2RlZmF1bHQnKSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLiAgVGhlIHZhbHVlIGlzIHNhdmVkCiAgICAgd2l0aCB0aGUgZGF0YWJhc2UgaXRzZWxmIGluIGEgc2VwYXJhdGUgaW5kZXggYXR0cmlidXRlIGZpbGUsCiAgICAgbmFtZWQgbGlrZSB0aGUgaW5kZXggZmlsZSB3aXRoICcuYXR0cicgYXBwZW5kZWQgdG8gdGhlIG5hbWUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgWDUwOSB2ZXJpZnkgZml4ZXMuIERpc2FibGUgYnJva2VuIGNlcnRpZmljYXRlIHdvcmthcm91bmRzIHdoZW4gCiAgICAgWDUwOV9WX0ZMQUdTX1g1MDlfU1RSSUNUIGlzIHNldC4gQ2hlY2sgQ1JMIGlzc3VlciBoYXMgY1JMU2lnbiBzZXQgaWYKICAgICBrZXlVc2FnZSBleHRlbnNpb24gcHJlc2VudC4gRG9uJ3QgYWNjZXB0IENSTHMgd2l0aCB1bmhhbmRsZWQgY3JpdGljYWwKICAgICBleHRlbnNpb25zOiBzaW5jZSB2ZXJpZnkgY3VycmVudGx5IGRvZXNuJ3QgcHJvY2VzcyBDUkwgZXh0ZW5zaW9ucyB0aGlzCiAgICAgcmVqZWN0cyBhIENSTCB3aXRoICphbnkqIGNyaXRpY2FsIGV4dGVuc2lvbnMuIEFkZCBuZXcgdmVyaWZ5IGVycm9yIGNvZGVzCiAgICAgZm9yIHRoZXNlIGNhc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdoZW4gY3JlYXRpbmcgYW4gT0NTUCBub25jZSB1c2UgYW4gT0NURVQgU1RSSU5HIGluc2lkZSB0aGUgZXh0blZhbHVlLgogICAgIEEgY2xhcmlmaWNhdGlvbiBvZiBSRkMyNTYwIHdpbGwgcmVxdWlyZSB0aGUgdXNlIG9mIE9DVEVUIFNUUklOR3MgYW5kIAogICAgIHNvbWUgaW1wbGVtZW50YXRpb25zIGNhbm5vdCBoYW5kbGUgdGhlIGN1cnJlbnQgcmF3IGZvcm1hdC4gU2luY2UgT3BlblNTTAogICAgIGNvcGllcyBhbmQgY29tcGFyZXMgT0NTUCBub25jZXMgYXMgb3BhcXVlIGJsb2JzIHdpdGhvdXQgYW55IGF0dGVtcHQgYXQKICAgICBwYXJzaW5nIHRoZW0gdGhpcyBzaG91bGQgbm90IGNyZWF0ZSBhbnkgY29tcGF0aWJpbGl0eSBpc3N1ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG1kIGZsYWcgRVZQX01EX0NUWF9GTEFHX1JFVVNFIHRoaXMgYWxsb3dzIG1kX2RhdGEgdG8gYmUgcmV1c2VkIHdoZW4KICAgICBjYWxsaW5nIEVWUF9NRF9DVFhfY29weV9leCgpIHRvIGF2b2lkIGNhbGxpbmcgT1BFTlNTTF9tYWxsb2MoKS4gV2l0aG91dAogICAgIHRoaXMgSE1BQyAoYW5kIG90aGVyKSBvcGVyYXRpb25zIGFyZSBzZXZlcmFsIHRpbWVzIHNsb3dlciB0aGFuIE9wZW5TU0wKICAgICA8IDAuOS43LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFByaW50IG91dCBHZW5lcmFsaXplZFRpbWUgYW5kIFVUQ1RpbWUgaW4gQVNOMV9TVFJJTkdfcHJpbnRfZXgoKS4KICAgICBbUGV0ZXIgU3lsdmVzdGVyIDxQZXRlci5TeWx2ZXN0ZXJARWRlbFdlYi5mcj5dCgogICopIFVzZSB0aGUgY29ycmVjdCBjb250ZW50IHdoZW4gc2lnbmluZyB0eXBlICJvdGhlciIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdiIGFuZCAwLjkuN2MgIFszMCBTZXAgMjAwM10KCiAgKikgRml4IHZhcmlvdXMgYnVncyByZXZlYWxlZCBieSBydW5uaW5nIHRoZSBOSVNDQyB0ZXN0IHN1aXRlOgoKICAgICBTdG9wIG91dCBvZiBib3VuZHMgcmVhZHMgaW4gdGhlIEFTTjEgY29kZSB3aGVuIHByZXNlbnRlZCB3aXRoCiAgICAgaW52YWxpZCB0YWdzIChDVkUtMjAwMy0wNTQzIGFuZCBDVkUtMjAwMy0wNTQ0KS4KICAgICAKICAgICBGcmVlIHVwIEFTTjFfVFlQRSBjb3JyZWN0bHkgaWYgQU5ZIHR5cGUgaXMgaW52YWxpZCAoQ1ZFLTIwMDMtMDU0NSkuCgogICAgIElmIHZlcmlmeSBjYWxsYmFjayBpZ25vcmVzIGludmFsaWQgcHVibGljIGtleSBlcnJvcnMgZG9uJ3QgdHJ5IHRvIGNoZWNrCiAgICAgY2VydGlmaWNhdGUgc2lnbmF0dXJlIHdpdGggdGhlIE5VTEwgcHVibGljIGtleS4KCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1pZ25vcmVfZXJyIG9wdGlvbiBpbiBvY3NwIGFwcGxpY2F0aW9uIHRvIHN0b3AgdGhlIHNlcnZlcgogICAgIGV4aXRpbmcgb24gdGhlIGZpcnN0IGVycm9yIGluIGEgcmVxdWVzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBzc2wzX2FjY2VwdCgpIChzc2wvczNfc3J2ci5jKSBvbmx5IGFjY2VwdCBhIGNsaWVudCBjZXJ0aWZpY2F0ZQogICAgIGlmIHRoZSBzZXJ2ZXIgcmVxdWVzdGVkIG9uZTogYXMgc3RhdGVkIGluIFRMUyAxLjAgYW5kIFNTTCAzLjAKICAgICBzcGVjaWZpY2F0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBzc2wzX2dldF9jbGllbnRfaGVsbG8oKSAoc3NsL3MzX3NydnIuYyksIHRvbGVyYXRlIGFkZGl0aW9uYWwKICAgICBleHRyYSBkYXRhIGFmdGVyIHRoZSBjb21wcmVzc2lvbiBtZXRob2RzIG5vdCBvbmx5IGZvciBUTFMgMS4wCiAgICAgYnV0IGFsc28gZm9yIFNTTCAzLjAgKGFzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjaWZpY2F0aW9uKS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IE1hdHRoaWFzIExvZXBmZV0KCiAgKikgQ2hhbmdlIFg1MDlfY2VydGlmaWNhdGVfdHlwZSgpIHRvIG1hcmsgdGhlIGtleSBhcyBleHBvcnRlZC9leHBvcnRhYmxlCiAgICAgd2hlbiBpdCdzIDUxMiAqYml0cyogbG9uZywgbm90IDUxMiBieXRlcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgQUVTX2NiY19lbmNyeXB0KCkgc28gaXQgb3V0cHV0cyBleGFjdCBtdWx0aXBsZSBvZgogICAgIGJsb2NrcyBkdXJpbmcgZW5jcnlwdGlvbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBWYXJpb3VzIGZpeGVzIHRvIGJhc2U2NCBCSU8gYW5kIG5vbiBibG9ja2luZyBJL08uIE9uIHdyaXRlIAogICAgIGZsdXNoZXMgd2VyZSBub3QgaGFuZGxlZCBwcm9wZXJseSBpZiB0aGUgQklPIHJldHJpZWQuIE9uIHJlYWQKICAgICBkYXRhIHdhcyBub3QgYmVpbmcgYnVmZmVyZWQgcHJvcGVybHkgYW5kIGhhZCB2YXJpb3VzIGxvZ2ljIGJ1Z3MuCiAgICAgVGhpcyBhbHNvIGFmZmVjdHMgYmxvY2tpbmcgSS9PIHdoZW4gdGhlIGRhdGEgYmVpbmcgZGVjb2RlZCBpcyBhCiAgICAgY2VydGFpbiBzaXplLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgUy9NSU1FIGJ1Z2ZpeGVzIGFuZCBjb21wYXRpYmlsaXR5IGNoYW5nZXM6CiAgICAgb3V0cHV0IGNvcnJlY3QgYXBwbGljYXRpb24vcGtjczcgTUlNRSB0eXBlIGlmCiAgICAgUEtDUzdfTk9PTERNSU1FVFlQRSBpcyBzZXQuIFRvbGVyYXRlIHNvbWUgYnJva2VuIHNpZ25hdHVyZXMuCiAgICAgT3V0cHV0IENSK0xGIGZvciBFT0wgaWYgUEtDUzdfQ1JMRkVPTCBpcyBzZXQgKHRoaXMgbWFrZXMgb3BlbmluZwogICAgIG9mIGZpbGVzIGFzIC5lbWwgd29yaykuIENvcnJlY3RseSBoYW5kbGUgdmVyeSBsb25nIGxpbmVzIGluIE1JTUUKICAgICBwYXJzZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdhIGFuZCAwLjkuN2IgIFsxMCBBcHIgMjAwM10KCiAgKikgQ291bnRlcm1lYXN1cmUgYWdhaW5zdCB0aGUgS2xpbWEtUG9rb3JueS1Sb3NhIGV4dGVuc2lvbiBvZgogICAgIEJsZWljaGJhY2hlcidzIGF0dGFjayBvbiBQS0NTICMxIHYxLjUgcGFkZGluZzogdHJlYXQKICAgICBhIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIG1pc21hdGNoIGxpa2UgYSBkZWNyeXB0aW9uIGVycm9yCiAgICAgaW4gc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSAoc3NsL3MzX3NydnIuYykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVHVybiBvbiBSU0EgYmxpbmRpbmcgYnkgZGVmYXVsdCBpbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgIHRvIGF2b2lkIGEgdGltaW5nIGF0dGFjay4gQXBwbGljYXRpb25zIHRoYXQgZG9uJ3Qgd2FudCBpdCBjYW4gY2FsbAogICAgIFJTQV9ibGluZGluZ19vZmYoKSBvciB1c2UgdGhlIG5ldyBmbGFnIFJTQV9GTEFHX05PX0JMSU5ESU5HLgogICAgIFRoZXkgd291bGQgYmUgaWxsLWFkdmlzZWQgdG8gZG8gc28gaW4gbW9zdCBjYXNlcy4KICAgICBbQmVuIExhdXJpZSwgU3RldmUgSGVuc29uLCBHZW9mZiBUaG9ycGUsIEJvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIFJTQSBibGluZGluZyBjb2RlIHNvIHRoYXQgaXQgd29ya3Mgd2hlbiB0aGUgUFJORyBpcyBub3QKICAgICBzZWVkZWQgKGluIHRoaXMgY2FzZSwgdGhlIHNlY3JldCBSU0EgZXhwb25lbnQgaXMgYWJ1c2VkIGFzCiAgICAgYW4gdW5wcmVkaWN0YWJsZSBzZWVkIC0tIGlmIGl0IGlzIG5vdCB1bnByZWRpY3RhYmxlLCB0aGVyZQogICAgIGlzIG5vIHBvaW50IGluIGJsaW5kaW5nIGFueXdheSkuICBNYWtlIFJTQSBibGluZGluZyB0aHJlYWQtc2FmZQogICAgIGJ5IHJlbWVtYmVyaW5nIHRoZSBjcmVhdG9yJ3MgdGhyZWFkIElEIGluIHJzYS0+YmxpbmRpbmcgYW5kCiAgICAgaGF2aW5nIGFsbCBvdGhlciB0aHJlYWRzIHVzZSBsb2NhbCBvbmUtdGltZSBibGluZGluZyBmYWN0b3JzCiAgICAgKHRoaXMgcmVxdWlyZXMgbW9yZSBjb21wdXRhdGlvbiB0aGFuIHNoYXJpbmcgcnNhLT5ibGluZGluZywgYnV0CiAgICAgYXZvaWRzIGV4Y2Vzc2l2ZSBsb2NraW5nOyBhbmQgaWYgYW4gUlNBIG9iamVjdCBpcyBub3Qgc2hhcmVkCiAgICAgYmV0d2VlbiB0aHJlYWRzLCBibGluZGluZyB3aWxsIHN0aWxsIGJlIHZlcnkgZmFzdCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4ZWQgYSB0eXBvIGJ1ZyB0aGF0IHdvdWxkIGNhdXNlIEVOR0lORV9zZXRfZGVmYXVsdCgpIHRvIHNldCBhbgogICAgIEVOR0lORSBhcyBkZWZhdWx0cyBmb3IgYWxsIHN1cHBvcnRlZCBhbGdvcml0aG1zIGlycmVzcGVjdGl2ZSBvZgogICAgIHRoZSAnZmxhZ3MnIHBhcmFtZXRlci4gJ2ZsYWdzJyBpcyBub3cgaG9ub3VyZWQsIHNvIGFwcGxpY2F0aW9ucwogICAgIHNob3VsZCBtYWtlIHN1cmUgdGhleSBhcmUgcGFzc2luZyBpdCBjb3JyZWN0bHkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgVGFyZ2V0ICJtaW5ndyIgbm93IGFsbG93cyBuYXRpdmUgV2luZG93cyBjb2RlIHRvIGJlIGdlbmVyYXRlZCBpbgogICAgIHRoZSBDeWd3aW4gZW52aXJvbm1lbnQgYXMgd2VsbCBhcyB3aXRoIHRoZSBNaW5HVyBjb21waWxlci4KICAgICBbVWxmIE1vZWxsZXJdIAoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNyBhbmQgMC45LjdhICBbMTkgRmViIDIwMDNdCgogICopIEluIHNzbDNfZ2V0X3JlY29yZCAoc3NsL3MzX3BrdC5jKSwgbWluaW1pemUgaW5mb3JtYXRpb24gbGVha2VkCiAgICAgdmlhIHRpbWluZyBieSBwZXJmb3JtaW5nIGEgTUFDIGNvbXB1dGF0aW9uIGV2ZW4gaWYgaW5jb3JyZWN0CiAgICAgYmxvY2sgY2lwaGVyIHBhZGRpbmcgaGFzIGJlZW4gZm91bmQuICBUaGlzIGlzIGEgY291bnRlcm1lYXN1cmUKICAgICBhZ2FpbnN0IGFjdGl2ZSBhdHRhY2tzIHdoZXJlIHRoZSBhdHRhY2tlciBoYXMgdG8gZGlzdGluZ3Vpc2gKICAgICBiZXR3ZWVuIGJhZCBwYWRkaW5nIGFuZCBhIE1BQyB2ZXJpZmljYXRpb24gZXJyb3IuIChDVkUtMjAwMy0wMDc4KQoKICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEJyaWNlIENhbnZlbCAoRVBGTCksCiAgICAgQWxhaW4gSGlsdGdlbiAoVUJTKSwgU2VyZ2UgVmF1ZGVuYXkgKEVQRkwpLCBhbmQKICAgICBNYXJ0aW4gVnVhZ25vdXggKEVQRkwsIElsaW9uKV0KCiAgKikgTWFrZSB0aGUgbm8tZXJyIG9wdGlvbiB3b3JrIGFzIGludGVuZGVkLiAgVGhlIGludGVudGlvbiB3aXRoIG5vLWVycgogICAgIGlzIG5vdCB0byBoYXZlIHRoZSB3aG9sZSBlcnJvciBzdGFjayBoYW5kbGluZyByb3V0aW5lcyByZW1vdmVkIGZyb20KICAgICBsaWJjcnlwdG8sIGl0J3Mgb25seSBpbnRlbmRlZCB0byByZW1vdmUgYWxsIHRoZSBmdW5jdGlvbiBuYW1lIGFuZAogICAgIHJlYXNvbiB0ZXh0cywgdGhlcmVieSByZW1vdmluZyBzb21lIG9mIHRoZSBmb290cHJpbnQgdGhhdCBtYXkgbm90CiAgICAgYmUgaW50ZXJlc3RpbmcgaWYgdGhvc2UgZXJyb3JzIGFyZW4ndCBkaXNwbGF5ZWQgYW55d2F5LgoKICAgICBOT1RFOiBpdCdzIHN0aWxsIHBvc3NpYmxlIGZvciBhbnkgYXBwbGljYXRpb24gb3IgbW9kdWxlIHRvIGhhdmUgaXQncwogICAgIG93biBzZXQgb2YgZXJyb3IgdGV4dHMgaW5zZXJ0ZWQuICBUaGUgcm91dGluZXMgYXJlIHRoZXJlLCBqdXN0IG5vdAogICAgIHVzZWQgYnkgZGVmYXVsdCB3aGVuIG5vLWVyciBpcyBnaXZlbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRnJlZUJTRCBvbiBJQTY0LgogICAgIFtkaXJrLm1leWVyQGRpbm9leC5zdWIub3JnIHZpYSBSaWNoYXJkIExldml0dGUsIHJlc29sdmVzICM0NTRdCgogICopIEFkanVzdCBERVNfY2JjX2Nrc3VtKCkgc28gaXQgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZSBhcyB0aGUgTUlUCiAgICAgS2VyYmVyb3MgZnVuY3Rpb24gbWl0X2Rlc19jYmNfY2tzdW0oKS4gIEJlZm9yZSB0aGlzIGNoYW5nZSwKICAgICB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgREVTX2NiY19ja3N1bSgpIHdhcyBsaWtlIHRoZSBvbmUgZnJvbQogICAgIG1pdF9kZXNfY2JjX2Nrc3VtKCksIGV4Y2VwdCB0aGUgYnl0ZXMgd2VyZSBzd2FwcGVkLgogICAgIFtLZXZpbiBHcmVhbmV5IDxLZXZpbi5HcmVhbmV5QGhwLmNvbT4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWxsb3cgYW4gYXBwbGljYXRpb24gdG8gZGlzYWJsZSB0aGUgYXV0b21hdGljIFNTTCBjaGFpbiBidWlsZGluZy4KICAgICBCZWZvcmUgdGhpcyBhIHJhdGhlciBwcmltaXRpdmUgY2hhaW4gYnVpbGQgd2FzIGFsd2F5cyBwZXJmb3JtZWQgaW4KICAgICBzc2wzX291dHB1dF9jZXJ0X2NoYWluKCk6IGFuIGFwcGxpY2F0aW9uIGhhZCBubyB3YXkgdG8gc2VuZCB0aGUgCiAgICAgY29ycmVjdCBjaGFpbiBpZiB0aGUgYXV0b21hdGljIG9wZXJhdGlvbiBwcm9kdWNlZCBhbiBpbmNvcnJlY3QgcmVzdWx0LgoKICAgICBOb3cgdGhlIGNoYWluIGJ1aWxkZXIgaXMgZGlzYWJsZWQgaWYgZWl0aGVyOgoKICAgICAxLiBFeHRyYSBjZXJ0aWZpY2F0ZXMgYXJlIGFkZGVkIHZpYSBTU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0KCkuCgogICAgIDIuIFRoZSBtb2RlIGZsYWcgU1NMX01PREVfTk9fQVVUT19DSEFJTiBpcyBzZXQuCgogICAgIFRoZSByZWFzb25pbmcgYmVoaW5kIHRoaXMgaXMgdGhhdCBhbiBhcHBsaWNhdGlvbiB3b3VsZCBub3Qgd2FudCB0aGUKICAgICBhdXRvIGNoYWluIGJ1aWxkaW5nIHRvIHRha2UgcGxhY2UgaWYgZXh0cmEgY2hhaW4gY2VydGlmaWNhdGVzIGFyZQogICAgIHByZXNlbnQgYW5kIGl0IG1pZ2h0IGFsc28gd2FudCBhIG1lYW5zIG9mIHNlbmRpbmcgbm8gYWRkaXRpb25hbAogICAgIGNlcnRpZmljYXRlcyAoZm9yIGV4YW1wbGUgdGhlIGNoYWluIGhhcyB0d28gY2VydGlmaWNhdGVzIGFuZCB0aGUKICAgICByb290IGlzIG9taXR0ZWQpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gYnVpbGQgd2l0aG91dCB0aGUgRU5HSU5FIGZyYW1ld29yay4KICAgICBbU3RldmVuIFJlZGRpZSA8c21yQGVzc2VtZXIuY29tLmF1PiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBVbmRlciBXaW4zMiBnbXRpbWUoKSBjYW4gcmV0dXJuIE5VTEw6IGNoZWNrIHJldHVybiB2YWx1ZSBpbgogICAgIE9QRU5TU0xfZ210aW1lKCkuIEFkZCBlcnJvciBjb2RlIGZvciBjYXNlIHdoZXJlIGdtdGltZSgpIGZhaWxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERTQSByb3V0aW5lczogdW5kZXIgY2VydGFpbiBlcnJvciBjb25kaXRpb25zIHVuaW5pdGlhbGl6ZWQgQk4gb2JqZWN0cwogICAgIGNvdWxkIGJlIGZyZWVkLiBTb2x1dGlvbjogbWFrZSBzdXJlIGluaXRpYWxpemF0aW9uIGlzIHBlcmZvcm1lZCBlYXJseQogICAgIGVub3VnaC4gKFJlcG9ydGVkIGFuZCBmaXggc3VwcGxpZWQgYnkgSXZhbiBEIE5lc3RsZXJvZGUgPG5lc3RsZXJATUlULkVEVT4sCiAgICAgTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT4gdmlhIFBSIzQ1OSkKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQW5vdGhlciBmaXggZm9yIFNTTHYyIHNlc3Npb24gSUQgaGFuZGxpbmc6IHRoZSBzZXNzaW9uIElEIHdhcyBpbmNvcnJlY3RseQogICAgIGNoZWNrZWQgb24gcmVjb25uZWN0IG9uIHRoZSBjbGllbnQgc2lkZSwgdGhlcmVmb3JlIHNlc3Npb24gcmVzdW1wdGlvbgogICAgIGNvdWxkIHN0aWxsIGZhaWwgd2l0aCBhICJzc2wgc2Vzc2lvbiBpZCBpcyBkaWZmZXJlbnQiIGVycm9yLiBUaGlzCiAgICAgYmVoYXZpb3VyIGlzIG1hc2tlZCB3aGVuIFNTTF9PUF9BTEwgaXMgdXNlZCBkdWUgdG8KICAgICBTU0xfT1BfTUlDUk9TT0ZUX1NFU1NfSURfQlVHIGJlaW5nIHNldC4KICAgICBCZWhhdmlvdXIgb2JzZXJ2ZWQgYnkgQ3Jpc3BpbiBGbG93ZXJkYXkgPGNyaXNwaW5AZmxvd2VyZGF5LmN4PiBhcwogICAgIGZvbGxvd3VwIHRvIFBSICMzNzcuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIElBLTMyIGFzc2VtYmxlciBzdXBwb3J0IGVuaGFuY2VtZW50czogdW5pZmllZCBFTEYgdGFyZ2V0cywgc3VwcG9ydAogICAgIGZvciBTQ08vQ2FsZGVyYSBwbGF0Zm9ybXMsIGZpeCBmb3IgQ3lnd2luIHNoYXJlZCBidWlsZC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEZyZWVCU0Qgb24gc3BhcmM2NC4gIEFzIGEgY29uc2VxdWVuY2UsIHN1cHBvcnQgZm9yCiAgICAgRnJlZUJTRCBvbiBub24teDg2IHByb2Nlc3NvcnMgaXMgc2VwYXJhdGUgZnJvbSB4ODYgcHJvY2Vzc29ycyBvbgogICAgIHRoZSBjb25maWcgc2NyaXB0LCBtdWNoIGxpa2UgdGhlIE5ldEJTRCBzdXBwb3J0LgogICAgIFtSaWNoYXJkIExldml0dGUgJiBLcmlzIEtlbm5hd2F5IDxrcmlzQG9ic2VjdXJpdHkub3JnPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZoIGFuZCAwLjkuNyAgWzMxIERlYyAyMDAyXQoKICBbTkI6IE9wZW5TU0wgMC45LjZpIGFuZCBsYXRlciAwLjkuNiBwYXRjaCBsZXZlbHMgd2VyZSByZWxlYXNlZCBhZnRlcgogIE9wZW5TU0wgMC45LjcuXQoKICAqKSBGaXggc2Vzc2lvbiBJRCBoYW5kbGluZyBpbiBTU0x2MiBjbGllbnQgY29kZTogdGhlIFNFUlZFUiBGSU5JU0hFRAogICAgIGNvZGUgKDA2KSB3YXMgdGFrZW4gYXMgdGhlIGZpcnN0IG9jdGV0IG9mIHRoZSBzZXNzaW9uIElEIGFuZCB0aGUgbGFzdAogICAgIG9jdGV0IHdhcyBpZ25vcmVkIGNvbnNlcXVlbnRseS4gQXMgYSByZXN1bHQgU1NMdjIgY2xpZW50IHNpZGUgc2Vzc2lvbgogICAgIGNhY2hpbmcgY291bGQgbm90IGhhdmUgd29ya2VkIGR1ZSB0byB0aGUgc2Vzc2lvbiBJRCBtaXNtYXRjaCBiZXR3ZWVuCiAgICAgY2xpZW50IGFuZCBzZXJ2ZXIuCiAgICAgQmVoYXZpb3VyIG9ic2VydmVkIGJ5IENyaXNwaW4gRmxvd2VyZGF5IDxjcmlzcGluQGZsb3dlcmRheS5jeD4gYXMKICAgICBQUiAjMzc3LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBDaGFuZ2UgdGhlIGRlY2xhcmF0aW9uIG9mIG5lZWRlZCBLZXJiZXJvcyBsaWJyYXJpZXMgdG8gdXNlIEVYX0xJQlMKICAgICBpbnN0ZWFkIG9mIHRoZSBzcGVjaWFsIChhbmQgYmFkbHkgc3VwcG9ydGVkKSBMSUJLUkI1LiAgTElCS1JCNSBpcwogICAgIHJlbW92ZWQgZW50aXJlbHkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGhlIGh3X25jaXBoZXIuYyBlbmdpbmUgcmVxdWlyZXMgZHluYW1pYyBsb2Nrcy4gIFVuZm9ydHVuYXRlbHksIGl0CiAgICAgc2VlbXMgdGhhdCBpbiBzcGl0ZSBvZiBleGlzdGluZyBmb3IgbW9yZSB0aGFuIGEgeWVhciwgbWFueSBhcHBsaWNhdGlvbgogICAgIGF1dGhvciBoYXZlIGRvbmUgbm90aGluZyB0byBwcm92aWRlIHRoZSBuZWNlc3NhcnkgY2FsbGJhY2tzLCB3aGljaAogICAgIG1lYW5zIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIGVuZ2luZSB3aWxsIG5vdCB3b3JrIHByb3Blcmx5IGFueXdoZXJlLgogICAgIFRoaXMgaXMgYSB2ZXJ5IHVuZm9ydHVuYXRlIHNpdHVhdGlvbiB3aGljaCBmb3JjZXMgdXMsIGluIHRoZSBuYW1lCiAgICAgb2YgdXNhYmlsaXR5LCB0byBnaXZlIHRoZSBod19uY2lwaGVyLmMgYSBzdGF0aWMgbG9jaywgd2hpY2ggaXMgcGFydAogICAgIG9mIGxpYmNyeXB0by4KICAgICBOT1RFOiBUaGlzIGlzIGZvciB0aGUgMC45Ljcgc2VyaWVzIE9OTFkuICBUaGlzIGhhY2sgd2lsbCBuZXZlcgogICAgIGFwcGVhciBpbiAwLjkuOCBvciBsYXRlci4gIFdlIEVYUEVDVCBhcHBsaWNhdGlvbiBhdXRob3JzIHRvIGhhdmUKICAgICBkZWFsdCBwcm9wZXJseSB3aXRoIHRoaXMgd2hlbiAwLjkuOCBpcyByZWxlYXNlZCAodW5sZXNzIHdlIGFjdHVhbGx5CiAgICAgbWFrZSBzdWNoIGNoYW5nZXMgaW4gdGhlIGxpYmNyeXB0byBsb2NraW5nIGNvZGUgdGhhdCBjaGFuZ2VzIHdpbGwKICAgICBoYXZlIHRvIGJlIG1hZGUgYW55d2F5KS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbiBhc24xX2QyaV9yZWFkX2JpbygpIHJlcGVhdGVkbHkgY2FsbCBCSU9fcmVhZCgpIHVudGlsIGFsbCBjb250ZW50CiAgICAgb2N0ZXRzIGhhdmUgYmVlbiByZWFkLCBFT0Ygb3IgYW4gZXJyb3Igb2NjdXJzLiBXaXRob3V0IHRoaXMgY2hhbmdlCiAgICAgc29tZSB0cnVuY2F0ZWQgQVNOMSBzdHJ1Y3R1cmVzIHdpbGwgbm90IHByb2R1Y2UgYW4gZXJyb3IuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGlzYWJsZSBIZWltZGFsIHN1cHBvcnQsIHNpbmNlIGl0IGhhc24ndCBiZWVuIGZ1bGx5IGltcGxlbWVudGVkLgogICAgIFN0aWxsIGdpdmUgdGhlIHBvc3NpYmlsaXR5IHRvIGZvcmNlIHRoZSB1c2Ugb2YgSGVpbWRhbCwgYnV0IHdpdGgKICAgICB3YXJuaW5ncyBhbmQgYSByZXF1ZXN0IHRoYXQgcGF0Y2hlcyBnZXQgc2VudCB0byBvcGVuc3NsLWRldi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIFZDLUNFIHRhcmdldCwgaW50cm9kdWNlIHRoZSBXSU5DRSBzeXNuYW1lLCBhbmQgYWRkCiAgICAgSU5TVEFMTC5XQ0UgYW5kIGFwcHJvcHJpYXRlIGNvbmRpdGlvbmFscyB0byBtYWtlIGl0IGJ1aWxkLgogICAgIFtTdGV2ZW4gUmVkZGllIDxzbXJAZXNzZW1lci5jb20uYXU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSB0aGUgRExMIG5hbWVzIGZvciBDeWd3aW4gdG8gY3lnY3J5cHRvLXgueS56LmRsbCBhbmQKICAgICBjeWdzc2wteC55LnouZGxsLCB3aGVyZSB4LCB5IGFuZCB6IGFyZSB0aGUgbWFqb3IsIG1pbm9yIGFuZAogICAgIGVkaXQgbnVtYmVycyBvZiB0aGUgdmVyc2lvbi4KICAgICBbQ29yaW5uYSBWaW5zY2hlbiA8dmluc2NoZW5AcmVkaGF0LmNvbT4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW50cm9kdWNlIHNhZmUgc3RyaW5nIGNvcHkgYW5kIGNhdGVuYXRpb24gZnVuY3Rpb25zCiAgICAgKEJVRl9zdHJsY3B5KCkgYW5kIEJVRl9zdHJsY2F0KCkpLgogICAgIFtCZW4gTGF1cmllIChDSEFUUykgYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQXZvaWQgdXNpbmcgZml4ZWQtc2l6ZSBidWZmZXJzIGZvciBvbmUtbGluZSBETnMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIEJVRl9NRU1fZ3Jvd19jbGVhbigpIHRvIGF2b2lkIGluZm9ybWF0aW9uIGxlYWthZ2Ugd2hlbgogICAgIHJlc2l6aW5nIGJ1ZmZlcnMgY29udGFpbmluZyBzZWNyZXRzLCBhbmQgdXNlIHdoZXJlIGFwcHJvcHJpYXRlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEF2b2lkIHVzaW5nIGZpeGVkIHNpemUgYnVmZmVycyBmb3IgY29uZmlndXJhdGlvbiBmaWxlIGxvY2F0aW9uLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEF2b2lkIGZpbGVuYW1lIHRydW5jYXRpb24gZm9yIHZhcmlvdXMgQ0EgZmlsZXMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgVXNlIHNpemVvZiBpbiBwcmVmZXJlbmNlIHRvIG1hZ2ljIG51bWJlcnMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQXZvaWQgZmlsZW5hbWUgdHJ1bmNhdGlvbiBpbiBjZXJ0IHJlcXVlc3RzLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBhc3NlcnRpb25zIHRvIGNoZWNrIGZvciAoc3VwcG9zZWRseSBpbXBvc3NpYmxlKSBidWZmZXIKICAgICBvdmVyZmxvd3MuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRG9uJ3QgY2FjaGUgdHJ1bmNhdGVkIEROUyBlbnRyaWVzIGluIHRoZSBsb2NhbCBjYWNoZSAodGhpcyBjb3VsZAogICAgIHBvdGVudGlhbGx5IGxlYWQgdG8gYSBzcG9vZmluZyBhdHRhY2spLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEZpeCB2YXJpb3VzIGJ1ZmZlcnMgdG8gYmUgbGFyZ2UgZW5vdWdoIGZvciBoZXgvZGVjaW1hbAogICAgIHJlcHJlc2VudGF0aW9ucyBpbiBhIHBsYXRmb3JtIGluZGVwZW5kZW50IG1hbm5lci4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgQ1JZUFRPX3JlYWxsb2NfY2xlYW4oKSB0byBhdm9pZCBpbmZvcm1hdGlvbiBsZWFrYWdlIHdoZW4KICAgICByZXNpemluZyBidWZmZXJzIGNvbnRhaW5pbmcgc2VjcmV0cywgYW5kIHVzZSB3aGVyZSBhcHByb3ByaWF0ZS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgQklPX2luZGVudCgpIHRvIGF2b2lkIG11Y2ggc2xpZ2h0bHkgd29ycnlpbmcgY29kZSB0byBkbwogICAgIGluZGVudHMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQ29udmVydCBzcHJpbnRmKCkvQklPX3B1dHMoKSB0byBCSU9fcHJpbnRmKCkuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgYnVmZmVyX2dldHMoKSBjb3VsZCB0ZXJtaW5hdGUgd2l0aCB0aGUgYnVmZmVyIG9ubHkgaGFsZgogICAgIGZ1bGwuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBhc3NlcnRpb25zIHRvIHByZXZlbnQgdXNlci1zdXBwbGllZCBjcnlwdG8gZnVuY3Rpb25zIGZyb20KICAgICBvdmVyZmxvd2luZyBpbnRlcm5hbCBidWZmZXJzIGJ5IGhhdmluZyBsYXJnZSBibG9jayBzaXplcywgZXRjLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIE5ldyBPUEVOU1NMX2Fzc2VydCgpIG1hY3JvIChzaW1pbGFyIHRvIGFzc2VydCgpLCBidXQgZW5hYmxlZAogICAgIHVuY29uZGl0aW9uYWxseSkuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRWxpbWluYXRlIHVudXNlZCBjb3B5IG9mIGtleSBpbiBSQzQuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRWxpbWluYXRlIHVudXNlZCBhbmQgaW5jb3JyZWN0bHkgc2l6ZWQgYnVmZmVycyBmb3IgSVYgaW4gcGVtLmguCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRml4IG9mZi1ieS1vbmUgZXJyb3IgaW4gRUdEIHBhdGguCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgSWYgUkFOREZJTEUgcGF0aCBpcyB0b28gbG9uZywgaWdub3JlIGluc3RlYWQgb2YgdHJ1bmNhdGluZy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBpbmNvcnJlY3RseSBzaXplZCBYLjUwOSBzdHJ1Y3R1cmUKICAgICBDQkNQYXJhbWV0ZXIuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRWxpbWluYXRlIHVudXNlZCBhbmQgZGFuZ2Vyb3VzIGZ1bmN0aW9uIGtudW1iZXIoKS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBkYW5nZXJvdXMgc3RydWN0dXJlLCBLU1NMX0VSUi4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBQcm90ZWN0IGFnYWluc3Qgb3Zlcmxvbmcgc2Vzc2lvbiBJRCBjb250ZXh0IGxlbmd0aCBpbiBhbiBlbmNvZGVkCiAgICAgc2Vzc2lvbiBvYmplY3QuIFNpbmNlIHRoZXNlIGFyZSBsb2NhbCwgdGhpcyBkb2VzIG5vdCBhcHBlYXIgdG8gYmUKICAgICBleHBsb2l0YWJsZS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBDaGFuZ2UgZnJvbSBzZWN1cml0eSBwYXRjaCAoc2VlIDAuOS42ZSBiZWxvdykgdGhhdCBkaWQgbm90IGFmZmVjdAogICAgIHRoZSAwLjkuNiByZWxlYXNlIHNlcmllczoKCiAgICAgUmVtb3RlIGJ1ZmZlciBvdmVyZmxvdyBpbiBTU0wzIHByb3RvY29sIC0gYW4gYXR0YWNrZXIgY291bGQKICAgICBzdXBwbHkgYW4gb3ZlcnNpemVkIG1hc3RlciBrZXkgaW4gS2VyYmVyb3MtZW5hYmxlZCB2ZXJzaW9ucy4KICAgICAoQ1ZFLTIwMDItMDY1NykKICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBDaGFuZ2UgdGhlIFNTTCBrZXJiNSBjb2RlcyB0byBtYXRjaCBSRkMgMjcxMi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIC1uYW1lb3B0IHdvcmsgZnVsbHkgZm9yIHJlcSBhbmQgYWRkIC1yZXFvcHQgc3dpdGNoLgogICAgIFtNaWNoYWVsIEJlbGwgPG1pY2hhZWwuYmVsbEByei5odS1iZXJsaW4uZGU+LCBTdGV2ZSBIZW5zb25dCgogICopIFRoZSAiYmxvY2sgc2l6ZSIgZm9yIGJsb2NrIGNpcGhlcnMgaW4gQ0ZCIGFuZCBPRkIgbW9kZSBzaG91bGQgYmUgMS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBZbmd2ZSBOeXNhZXRlciBQZXR0ZXJzZW4gPHluZ3ZlQG9wZXJhLmNvbT5dCgogICopIE1ha2Ugc3VyZSB0ZXN0cyBjYW4gYmUgcGVyZm9ybWVkIGV2ZW4gaWYgdGhlIGNvcnJlc3BvbmRpbmcgYWxnb3JpdGhtcwogICAgIGhhdmUgYmVlbiByZW1vdmVkIGVudGlyZWx5LiAgVGhpcyB3YXMgYWxzbyB0aGUgbGFzdCBzdGVwIHRvIG1ha2UKICAgICBPcGVuU1NMIGNvbXBpbGFibGUgd2l0aCBESkdQUCB1bmRlciBhbGwgcmVhc29uYWJsZSBjb25kaXRpb25zLgogICAgIFtSaWNoYXJkIExldml0dGUsIERvdWcgS2F1Zm1hbiA8ZGthdWZtYW5AcmFodWwubmV0Pl0KCiAgKikgQWRkIGNpcGhlciBzZWxlY3Rpb24gcnVsZXMgQ09NUExFTUVOVE9GQUxMIGFuZCBDT01QTEVNRU5UT0ZERUZBVUxUCiAgICAgdG8gYWxsb3cgdmVyc2lvbiBpbmRlcGVuZGVudCBkaXNhYmxpbmcgb2Ygbm9ybWFsbHkgdW5zZWxlY3RlZCBjaXBoZXJzLAogICAgIHdoaWNoIG1heSBiZSBhY3RpdmF0ZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiBzZWxlY3RpbmcgYSBzaW5nbGUgY2lwaGVyLgoKICAgICAoRS5nLiwgY2lwaGVyIGxpc3Qgc3RyaW5nICJSU0EiIGVuYWJsZXMgY2lwaGVyc3VpdGVzIHRoYXQgYXJlIGxlZnQKICAgICBvdXQgb2YgIkFMTCIgYmVjYXVzZSB0aGV5IGRvIG5vdCBwcm92aWRlIHN5bW1ldHJpYyBlbmNyeXB0aW9uLgogICAgICJSU0E6IUNPTVBMRU1FTUVOVE9GQUxMIiBhdm9pZHMgdGhlc2UgdW5zYWZlIGNpcGhlcnN1aXRlcy4pCiAgICAgW0x1dHogSmFlbmlja2UsIEJvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGFwcHJvcHJpYXRlIHN1cHBvcnQgZm9yIHNlcGFyYXRlIHBsYXRmb3JtLWRlcGVuZGVudCBidWlsZAogICAgIGRpcmVjdG9yaWVzLiAgVGhlIHJlY29tbWVuZGVkIHdheSB0byBtYWtlIGEgcGxhdGZvcm0tZGVwZW5kZW50CiAgICAgYnVpbGQgZGlyZWN0b3J5IGlzIHRoZSBmb2xsb3dpbmcgKHRlc3RlZCBvbiBMaW51eCksIG1heWJlIHdpdGgKICAgICBzb21lIGxvY2FsIHR3ZWFrczoKCgkjIFBsYWNlIHlvdXJzZWxmIG91dHNpZGUgb2YgdGhlIE9wZW5TU0wgc291cmNlIHRyZWUuICBJbgoJIyB0aGlzIGV4YW1wbGUsIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBPUEVOU1NMX1NPVVJDRQoJIyBpcyBhc3N1bWVkIHRvIGNvbnRhaW4gdGhlIGFic29sdXRlIE9wZW5TU0wgc291cmNlIGRpcmVjdG9yeS4KCW1rZGlyIC1wIG9ianRyZWUvImB1bmFtZSAtc2AtYHVuYW1lIC1yYC1gdW5hbWUgLW1gIgoJY2Qgb2JqdHJlZS8iYHVuYW1lIC1zYC1gdW5hbWUgLXJgLWB1bmFtZSAtbWAiCgkoY2QgJE9QRU5TU0xfU09VUkNFOyBmaW5kIC4gLXR5cGUgZikgfCB3aGlsZSByZWFkIEY7IGRvCgkJbWtkaXIgLXAgYGRpcm5hbWUgJEZgCgkJbG4gLXMgJE9QRU5TU0xfU09VUkNFLyRGICRGCglkb25lCgogICAgIFRvIGJlIGFic29sdXRlbHkgc3VyZSBub3QgdG8gZGlzdHVyYiB0aGUgc291cmNlIHRyZWUsIGEgIm1ha2UgY2xlYW4iCiAgICAgaXMgYSBnb29kIHRoaW5nLiAgSWYgaXQgaXNuJ3Qgc3VjY2Vzc2Z1bGwsIGRvbid0IHdvcnJ5IGFib3V0IGl0LAogICAgIGl0IHByb2JhYmx5IG1lYW5zIHRoZSBzb3VyY2UgZGlyZWN0b3J5IGlzIHZlcnkgY2xlYW4uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBzdXJlIGFueSBFTkdJTkUgY29udHJvbCBjb21tYW5kcyBtYWtlIGxvY2FsIGNvcGllcyBvZiBzdHJpbmcKICAgICBwb2ludGVycyBwYXNzZWQgdG8gdGhlbSB3aGVuZXZlciBuZWNlc3NhcnkuIE90aGVyd2lzZSBpdCBpcyBwb3NzaWJsZQogICAgIHRoZSBjYWxsZXIgbWF5IGhhdmUgb3ZlcndyaXR0ZW4gKG9yIGRlYWxsb2NhdGVkKSB0aGUgb3JpZ2luYWwgc3RyaW5nCiAgICAgZGF0YSB3aGVuIGEgbGF0ZXIgRU5HSU5FIG9wZXJhdGlvbiB0cmllcyB0byB1c2UgdGhlIHN0b3JlZCB2YWx1ZXMuCiAgICAgW0f2dHogQmFiaW4tRWJlbGwgPGJhYmluZWJlbGxAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBJbXByb3ZlIGRpYWdub3N0aWNzIGluIGZpbGUgcmVhZGluZyBhbmQgY29tbWFuZC1saW5lIGRpZ2VzdHMuCiAgICAgW0JlbiBMYXVyaWUgYWlkZWQgYW5kIGFiZXR0ZWQgYnkgU29sYXIgRGVzaWduZXIgPHNvbGFyQG9wZW53YWxsLmNvbT5dCgogICopIEFkZCBBRVMgbW9kZXMgQ0ZCIGFuZCBPRkIgdG8gdGhlIG9iamVjdCBkYXRhYmFzZS4gIENvcnJlY3QgYW4KICAgICBlcnJvciBpbiBBRVMtQ0ZCIGRlY3J5cHRpb24uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmVtb3ZlIG1vc3QgY2FsbHMgdG8gRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgpIGluIGV2cF9lbmMuYywgdGhpcyAKICAgICBhbGxvd3MgZXhpc3RpbmcgRVZQX0NJUEhFUl9DVFggc3RydWN0dXJlcyB0byBiZSByZXVzZWQgYWZ0ZXIKICAgICBjYWxsaW5nIEVWUF8qRmluYWwoKS4gVGhpcyBiZWhhdmlvdXIgaXMgdXNlZCBieSBlbmNyeXB0aW9uCiAgICAgQklPcyBhbmQgc29tZSBhcHBsaWNhdGlvbnMuIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCB0aGF0CiAgICAgYXBwbGljYXRpb25zIG11c3QgZXhwbGljaXRseSBjbGVhbiB1cCBjaXBoZXIgY29udGV4dHMgd2l0aAogICAgIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoKSBvciB0aGV5IHdpbGwgbGVhayBtZW1vcnkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hlY2sgdGhlIHZhbHVlcyBvZiBkbmEgYW5kIGRuYiBpbiBibl9tdWxfcmVjdXJzaXZlIGJlZm9yZSBjYWxsaW5nCiAgICAgYm5fbXVsX2NvbWJhIChhIG5vbiB6ZXJvIHZhbHVlIG1lYW5zIHRoZSBhIG9yIGIgYXJyYXlzIGRvIG5vdCBjb250YWluCiAgICAgbjIgZWxlbWVudHMpIGFuZCBmYWxsYmFjayB0byBibl9tdWxfbm9ybWFsIGlmIGVpdGhlciBpcyBub3QgemVyby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZXNjYXBpbmcgb2Ygbm9uLUFTQ0lJIGNoYXJhY3RlcnMgd2hlbiB1c2luZyB0aGUgLXN1Ymogb3B0aW9uCiAgICAgb2YgdGhlICJvcGVuc3NsIHJlcSIgY29tbWFuZCBsaW5lIHRvb2wuIChSb2JlcnQgSm9vcCA8am9vcEBmb2t1cy5nbWQuZGU+KQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBNYWtlIG9iamVjdCBkZWZpbml0aW9ucyBjb21wbGlhbnQgdG8gTERBUCAoUkZDMjI1Nik6IFNOIGlzIHRoZSBzaG9ydAogICAgIGZvcm0gZm9yICJzdXJuYW1lIiwgc2VyaWFsTnVtYmVyIGhhcyBubyBzaG9ydCBmb3JtLgogICAgIFVzZSAibWFpbCIgYXMgdGhlIHNob3J0IG5hbWUgZm9yICJyZmM4MjJNYWlsYm94IiBhY2NvcmRpbmcgdG8gUkZDMjc5ODsKICAgICB0aGVyZWZvcmUgcmVtb3ZlICJtYWlsIiBzaG9ydCBuYW1lIGZvciAiaW50ZXJuZXQgNyIuCiAgICAgVGhlIE9JRCBmb3IgdW5pcXVlIGlkZW50aWZpZXJzIGluIFg1MDkgY2VydGlmaWNhdGVzIGlzCiAgICAgeDUwMFVuaXF1ZUlkZW50aWZpZXIsIG5vdCB1bmlxdWVJZGVudGlmaWVyLgogICAgIFNvbWUgbW9yZSBPSUQgYWRkaXRpb25zLiAoTWljaGFlbCBCZWxsIDxtaWNoYWVsLmJlbGxAcnouaHUtYmVybGluLmRlPikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIGFuICJpbml0IiBjb21tYW5kIHRvIHRoZSBFTkdJTkUgY29uZmlnIG1vZHVsZSBhbmQgYXV0byBpbml0aWFsaXplCiAgICAgRU5HSU5Fcy4gV2l0aG91dCBhbnkgImluaXQiIGNvbW1hbmQgdGhlIEVOR0lORSB3aWxsIGJlIGluaXRpYWxpemVkIAogICAgIGFmdGVyIGFsbCBjdHJsIGNvbW1hbmRzIGhhdmUgYmVlbiBleGVjdXRlZCBvbiBpdC4gSWYgaW5pdD0xIHRoZSAKICAgICBFTkdJTkUgaXMgaW5pdGFpbGl6ZWQgYXQgdGhhdCBwb2ludCAoY3RybHMgYmVmb3JlIHRoYXQgcG9pbnQgYXJlIHJ1bgogICAgIG9uIHRoZSB1bmluaXRpYWxpemVkIEVOR0lORSBhbmQgYWZ0ZXIgb24gdGhlIGluaXRpYWxpemVkIG9uZSkuIElmCiAgICAgaW5pdD0wIHRoZW4gdGhlIEVOR0lORSB3aWxsIG5vdCBiZSBpbmlhdGlhbGl6ZWQgYXQgYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgJ2FwcF92ZXJpZnlfY2FsbGJhY2snIGludGVyZmFjZSBzbyB0aGF0IHRoZSB1c2VyLWRlZmluZWQKICAgICBhcmd1bWVudCBpcyBhY3R1YWxseSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrOiBJbiB0aGUKICAgICBTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjaygpIHByb3RvdHlwZSwgdGhlIGNhbGxiYWNrCiAgICAgZGVjbGFyYXRpb24gaGFzIGJlZW4gY2hhbmdlZCBmcm9tCiAgICAgICAgICBpbnQgKCpjYikoKQogICAgIGludG8KICAgICAgICAgIGludCAoKmNiKShYNTA5X1NUT1JFX0NUWCAqLHZvaWQgKik7CiAgICAgaW4gc3NsX3ZlcmlmeV9jZXJ0X2NoYWluIChzc2wvc3NsX2NlcnQuYyksIHRoZSBjYWxsCiAgICAgICAgICBpPXMtPmN0eC0+YXBwX3ZlcmlmeV9jYWxsYmFjaygmY3R4KQogICAgIGhhcyBiZWVuIGNoYW5nZWQgaW50bwogICAgICAgICAgaT1zLT5jdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2soJmN0eCwgcy0+Y3R4LT5hcHBfdmVyaWZ5X2FyZykuCgogICAgIFRvIHVwZGF0ZSBhcHBsaWNhdGlvbnMgdXNpbmcgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2soKSwKICAgICBhIGR1bW15IGFyZ3VtZW50IGNhbiBiZSBhZGRlZCB0byB0aGVpciBjYWxsYmFjayBmdW5jdGlvbnMuCiAgICAgW0QuIEsuIFNtZXR0ZXJzIDxzbWV0dGVyc0BwYXJjLnhlcm94LmNvbT5dCgogICopIEFkZGVkIHRoZSAnNDc1OGNjYScgRU5HSU5FIHRvIHN1cHBvcnQgSUJNIDQ3NTggY2FyZHMuCiAgICAgW01hdXJpY2UgR2l0dGVucyA8bWF1cmljZUBnaXR0ZW5zLm5sPiwgdG91Y2h1cHMgYnkgR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYW5kIE9QRU5TU0xfTE9BRF9DT05GIGRlZmluZSB3aGljaCB3aWxsIGNhdXNlCiAgICAgT3BlblNTTF9hZGRfYWxsX2FsZ29yaXRobXMoKSB0byBsb2FkIHRoZSBvcGVuc3NsLmNuZiBjb25maWcgZmlsZS4KICAgICBUaGlzIGFsbG93cyBvbGRlciBhcHBsaWNhdGlvbnMgdG8gdHJhbnNwYXJlbnRseSBzdXBwb3J0IGNlcnRhaW4KICAgICBPcGVuU1NMIGZlYXR1cmVzOiBzdWNoIGFzIGNyeXB0byBhY2NlbGVyYXRpb24gYW5kIGR5bmFtaWMgRU5HSU5FIGxvYWRpbmcuCiAgICAgVHdvIG5ldyBmdW5jdGlvbnMgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfbm9jb25mKCkgd2hpY2ggd2lsbCBuZXZlcgogICAgIGxvYWQgdGhlIGNvbmZpZyBmaWxlIGFuZCBPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19jb25mKCkgd2hpY2ggd2lsbAogICAgIGFsd2F5cyBsb2FkIGl0IGhhdmUgYWxzbyBiZWVuIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgT0ZCLCBDRkIgYW5kIENUUiAoYWxsIHdpdGggMTI4IGJpdCBmZWVkYmFjaykgdG8gQUVTLgogICAgIEFkanVzdCBOSURzIGFuZCBFVlAgbGF5ZXIuCiAgICAgW1N0ZXBoZW4gU3BydW5rIDxzdGVwaGVuQHNwcnVuay5vcmc+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIENvbmZpZyBtb2R1bGVzIHN1cHBvcnQgaW4gb3BlbnNzbCB1dGlsaXR5LgoKICAgICBNb3N0IGNvbW1hbmRzIG5vdyBsb2FkIG1vZHVsZXMgZnJvbSB0aGUgY29uZmlnIGZpbGUsCiAgICAgdGhvdWdoIGluIGEgZmV3IChzdWNoIGFzIHZlcnNpb24pIHRoaXMgaXNuJ3QgZG9uZSAKICAgICBiZWNhdXNlIGl0IGNvdWxkbid0IGJlIHVzZWQgZm9yIGFueXRoaW5nLgoKICAgICBJbiB0aGUgY2FzZSBvZiBjYSBhbmQgcmVxIHRoZSBjb25maWcgZmlsZSB1c2VkIGlzCiAgICAgdGhlIHNhbWUgYXMgdGhlIHV0aWxpdHkgaXRzZWxmOiB0aGF0IGlzIHRoZSAtY29uZmlnCiAgICAgY29tbWFuZCBsaW5lIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuCiAgICAgYWx0ZXJuYXRpdmUgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3ZlIGRlZmF1bHQgYmVoYXZpb3VyIGZyb20gT1BFTlNTTF9jb25maWcoKS4gSWYgYXBwbmFtZSBpcyBOVUxMCiAgICAgdXNlICJvcGVuc3NsX2NvbmYiIGlmIGZpbGVuYW1lIGlzIE5VTEwgdXNlIGRlZmF1bHQgb3BlbnNzbCBjb25maWcgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYW4gYXJndW1lbnQgdG8gT1BFTlNTTF9jb25maWcoKSB0byBhbGxvdyB0aGUgdXNlIG9mIGFuIGFsdGVybmF0aXZlCiAgICAgY29uZmlnIHNlY3Rpb24gbmFtZS4gQWRkIGEgbmV3IGZsYWcgdG8gdG9sZXJhdGUgYSBtaXNzaW5nIGNvbmZpZyBmaWxlCiAgICAgYW5kIG1vdmUgY29kZSB0byBDT05GX21vZHVsZXNfbG9hZF9maWxlKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgY3J5cHRvIGFjY2VsZXJhdG9yIGNhcmRzIGZyb20gQWNjZWxlcmF0ZWQgRW5jcnlwdGlvbgogICAgIFByb2Nlc3NpbmcsIHd3dy5hZXAuaWUuICAoVXNlIGVuZ2luZSAnYWVwJykKICAgICBUaGUgc3VwcG9ydCB3YXMgY29waWVkIGZyb20gMC45LjZjIFtlbmdpbmVdIGFuZCBhZGFwdGVkL2NvcnJlY3RlZAogICAgIHRvIHdvcmsgd2l0aCB0aGUgbmV3IGVuZ2luZSBmcmFtZXdvcmsuCiAgICAgW0FFUCBJbmMuIGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIFN1cHBvcnQgZm9yIFN1cmVXYXJlIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcyBmcm9tIEJhbHRpbW9yZQogICAgIFRlY2hub2xvZ2llcy4gIChVc2UgZW5naW5lICdzdXJld2FyZScpCiAgICAgVGhlIHN1cHBvcnQgd2FzIGNvcGllZCBmcm9tIDAuOS42YyBbZW5naW5lXSBhbmQgYWRhcHRlZAogICAgIHRvIHdvcmsgd2l0aCB0aGUgbmV3IGVuZ2luZSBmcmFtZXdvcmsuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSGF2ZSB0aGUgQ0hJTCBlbmdpbmUgZm9yay1zYWZlIChhcyBkZWZpbmVkIGJ5IG5DaXBoZXIpIGFuZCBhY3R1YWxseQogICAgIG1ha2UgdGhlIG5ld2VyIEVOR0lORSBmcmFtZXdvcmsgY29tbWFuZHMgZm9yIHRoZSBDSElMIGVuZ2luZSB3b3JrLgogICAgIFtUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBwcm9kdWNlIHNoYXJlZCBsaWJyYXJpZXMgb24gUmVsaWFudFVOSVguCiAgICAgW1JvYmVydCBEYWhsZW0gPFJvYmVydC5EYWhsZW1AZmZtMi5zaWVtZW5zLmRlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGNvbmZpZ3VyYXRpb24gdGFyZ2V0IGRlYnVnLWxpbnV4LXBwcm8uCiAgICAgTWFrZSAnb3BlbnNzbCByc2EnIHVzZSB0aGUgZ2VuZXJhbCBrZXkgbG9hZGluZyByb3V0aW5lcwogICAgIGltcGxlbWVudGVkIGluIGFwcHMuYywgYW5kIG1ha2UgdGhvc2Ugcm91dGluZXMgYWJsZSB0bwogICAgIGhhbmRsZSB0aGUga2V5IGZvcm1hdCBGT1JNQVRfTkVUU0NBUEUgYW5kIHRoZSB2YXJpYW50CiAgICAgRk9STUFUX0lJU1NHQy4KICAgICBbVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogKikgRml4IGEgY3Jhc2hidWcgYW5kIGEgbG9naWMgYnVnIGluIGh3Y3Joa19sb2FkX3B1YmtleSgpLgogICAgIFtUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIC1rZXlmb3JtIHRvIHJzYXV0bCwgYW5kIGRvY3VtZW50IC1lbmdpbmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSwgaW5zcGlyZWQgYnkgVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+XQoKICAqKSBDaGFuZ2UgQklPX25ld19maWxlIChjcnlwdG8vYmlvL2Jzc19maWxlLmMpIHRvIHVzZSBuZXcKICAgICBCSU9fUl9OT19TVUNIX0ZJTEUgZXJyb3IgY29kZSByYXRoZXIgdGhhbiB0aGUgZ2VuZXJpYwogICAgIEVSUl9SX1NZU19MSUIgZXJyb3IgY29kZSBpZiBmb3BlbigpIGZhaWxzIHdpdGggRU5PRU5ULgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgbmV3IGZ1bmN0aW9ucwogICAgICAgICAgRVJSX3BlZWtfbGFzdF9lcnJvcgogICAgICAgICAgRVJSX3BlZWtfbGFzdF9lcnJvcl9saW5lCiAgICAgICAgICBFUlJfcGVla19sYXN0X2Vycm9yX2xpbmVfZGF0YS4KICAgICBUaGVzZSBhcmUgc2ltaWxhciB0bwogICAgICAgICAgRVJSX3BlZWtfZXJyb3IKICAgICAgICAgIEVSUl9wZWVrX2Vycm9yX2xpbmUKICAgICAgICAgIEVSUl9wZWVrX2Vycm9yX2xpbmVfZGF0YSwKICAgICBidXQgcmVwb3J0IG9uIHRoZSBsYXRlc3QgZXJyb3IgcmVjb3JkZWQgcmF0aGVyIHRoYW4gdGhlIGZpcnN0IG9uZQogICAgIHN0aWxsIGluIHRoZSBlcnJvciBxdWV1ZS4KICAgICBbQmVuIExhdXJpZSwgQm9kbyBNb2VsbGVyXQogICAgICAgIAogICopIGRlZmF1bHRfYWxnb3JpdGhtcyBvcHRpb24gaW4gRU5HSU5FIGNvbmZpZyBtb2R1bGUuIFRoaXMgYWxsb3dzIHRoaW5ncwogICAgIGxpa2U6CiAgICAgZGVmYXVsdF9hbGdvcml0aG1zID0gQUxMCiAgICAgZGVmYXVsdF9hbGdvcml0aG1zID0gUlNBLCBEU0EsIFJBTkQsIENJUEhFUlMsIERJR0VTVFMKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQcmVsaW1pbmFyeSBFTkdJTkUgY29uZmlnIG1vZHVsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZXhwZXJpbWVudGFsIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIEFFUyBjb2RlIHRvIGZvbGxvdyB0aGUgc2FtZSBuYW1lIHN0cnVjdHVyZSBhcyBhbGwgb3RoZXIKICAgICBzeW1tZXRyaWMgY2lwaGVycywgYW5kIGJlaGF2ZSB0aGUgc2FtZSB3YXkuICBNb3ZlIGV2ZXJ5dGhpbmcgdG8KICAgICB0aGUgZGlyZWN0b3J5IGNyeXB0by9hZXMsIHRoZXJlYnkgb2Jzb2xldGluZyBjcnlwdG8vcmlqbmRhZWwuCiAgICAgW1N0ZXBoZW4gU3BydW5rIDxzdGVwaGVuQHNwcnVuay5vcmc+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIFNFQ1VSSVRZOiByZW1vdmUgdW5zYWZlIHNldGptcC9zaWduYWwgaW50ZXJhY3Rpb24gZnJvbSB1aV9vcGVuc3NsLmMuCiAgICAgW0JlbiBMYXVyaWUgYW5kIFRoZW8gZGUgUmFhZHRdCgogICopIEFkZCBvcHRpb24gdG8gb3V0cHV0IHB1YmxpYyBrZXlzIGluIHJlcSBjb21tYW5kLgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSBtYWR3b2xmQG9wZW5jYS5vcmddCgogICopIFVzZSB3TkFGcyBpbiBFQ19QT0lOVHNfbXVsKCkgZm9yIGltcHJvdmVkIGVmZmljaWVuY3kKICAgICAodXAgdG8gYWJvdXQgMTAlIGJldHRlciB0aGFuIGJlZm9yZSBmb3IgUC0xOTIgYW5kIFAtMjI0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb25zL21hY3JvcwoKICAgICAgICAgIFNTTF9DVFhfc2V0X21zZ19jYWxsYmFjayhjdHgsIGNiKQogICAgICAgICAgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrX2FyZyhjdHgsIGFyZykKICAgICAgICAgIFNTTF9zZXRfbXNnX2NhbGxiYWNrKHNzbCwgY2IpCiAgICAgICAgICBTU0xfc2V0X21zZ19jYWxsYmFja19hcmcoc3NsLCBhcmcpCgogICAgIHRvIHJlcXVlc3QgY2FsbGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uCgogICAgICAgICAgdm9pZCBjYihpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZykKCiAgICAgd2hlbmV2ZXIgYSBwcm90b2NvbCBtZXNzYWdlIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVjZWl2ZWQKICAgICAod3JpdGVfcCA9PSAwKSBvciBzZW50ICh3cml0ZV9wID09IDEpLiAgSGVyZSAndmVyc2lvbicgaXMgdGhlCiAgICAgcHJvdG9jb2wgdmVyc2lvbiAgYWNjb3JkaW5nIHRvIHdoaWNoIHRoZSBTU0wgbGlicmFyeSBpbnRlcnByZXRzCiAgICAgdGhlIGN1cnJlbnQgcHJvdG9jb2wgbWVzc2FnZSAoU1NMMl9WRVJTSU9OLCBTU0wzX1ZFUlNJT04sIG9yCiAgICAgVExTMV9WRVJTSU9OKS4gICdjb250ZW50X3R5cGUnIGlzIDAgaW4gdGhlIGNhc2Ugb2YgU1NMIDIuMCwgb3IKICAgICB0aGUgY29udGVudCB0eXBlIGFzIGRlZmluZWQgaW4gdGhlIFNTTCAzLjAvVExTIDEuMCBwcm90b2NvbAogICAgIHNwZWNpZmljYXRpb24gKGNoYW5nZV9jaXBoZXJfc3BlYygyMCksIGFsZXJ0KDIxKSwgaGFuZHNoYWtlKDIyKSkuCiAgICAgJ2J1ZicgYW5kICdsZW4nIHBvaW50IHRvIHRoZSBhY3R1YWwgbWVzc2FnZSwgJ3NzbCcgdG8gdGhlCiAgICAgU1NMIG9iamVjdCwgYW5kICdhcmcnIGlzIHRoZSBhcHBsaWNhdGlvbi1kZWZpbmVkIHZhbHVlIHNldCBieQogICAgIFNTTFtfQ1RYXV9zZXRfbXNnX2NhbGxiYWNrX2FyZygpLgoKICAgICAnb3BlbnNzbCBzX2NsaWVudCcgYW5kICdvcGVuc3NsIHNfc2VydmVyJyBoYXZlIG5ldyAnLW1zZycgb3B0aW9ucwogICAgIHRvIGVuYWJsZSBhIGNhbGxiYWNrIHRoYXQgZGlzcGxheXMgYWxsIHByb3RvY29sIG1lc3NhZ2VzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSB0aGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBzbyBzaGFyZWQgbGlicmFyaWVzIGFyZSBidWlsdCBhcwogICAgIHNvb24gYXMgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIGxpYnJhcnkgaXMgZmluaXNoZWQsIGFuZCB0aGVyZWJ5IGdldAogICAgIG9wZW5zc2wgYW5kIHRoZSB0ZXN0IHByb2dyYW1zIGxpbmtlZCBhZ2FpbnN0IHRoZSBzaGFyZWQgbGlicmFyeS4KICAgICBUaGlzIHN0aWxsIG9ubHkgaGFwcGVucyB3aGVuIHRoZSBrZXl3b3JkICJzaGFyZCIgaGFzIGJlZW4gZ2l2ZW4gdG8KICAgICB0aGUgY29uZmlndXJhdGlvbiBzY3JpcHRzLgoKICAgICBOT1RFOiBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGlzIHN0aWxsIGFuIGV4cGVyaW1lbnRhbCB0aGluZywgYW5kCiAgICAgYmFja3dhcmQgYmluYXJ5IGNvbXBhdGliaWxpdHkgaXMgc3RpbGwgbm90IGd1YXJhbnRlZWQuCiAgICAgWyJNYWNpZWogVy4gUm96eWNraSIgPG1hY3JvQGRzMi5wZy5nZGEucGw+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBzdXBwb3J0IGZvciBTdWJqZWN0IEluZm9ybWF0aW9uIEFjY2VzcyBleHRlbnNpb24uCiAgICAgW1BldGVyIFN5bHZlc3RlciA8UGV0ZXIuU3lsdmVzdGVyQEVkZWxXZWIuZnI+XQoKICAqKSBNYWtlIEJVRl9NRU1fZ3JvdygpIGJlaGF2aW91ciBtb3JlIGNvbnNpc3RlbnQ6IEluaXRpYWxpc2UgdG8gemVybwogICAgIGFkZGl0aW9uYWwgYnl0ZXMgd2hlbiBuZXcgbWVtb3J5IGhhZCB0byBiZSBhbGxvY2F0ZWQsIG5vdCBqdXN0CiAgICAgd2hlbiByZXVzaW5nIGFuIGV4aXN0aW5nIGJ1ZmZlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgY29tbWFuZCBsaW5lIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbiAndXRmOCcgZm9yIHRoZSByZXEgY29tbWFuZC4KICAgICBUaGlzIGFsbG93cyBmaWVsZCB2YWx1ZXMgdG8gYmUgc3BlY2lmaWVkIGFzIFVURjggc3RyaW5ncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgLW11bHRpIGFuZCAtbXIgb3B0aW9ucyB0byAib3BlbnNzbCBzcGVlZCIgLSBnaXZpbmcgbXVsdGlwbGUgcGFyYWxsZWwKICAgICBydW5zIGZvciB0aGUgZm9ybWVyIGFuZCBtYWNoaW5lLXJlYWRhYmxlIG91dHB1dCBmb3IgdGhlIGxhdHRlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkICctbm9lbWFpbEROJyBvcHRpb24gdG8gJ29wZW5zc2wgY2EnLiAgVGhpcyBwcmV2ZW50cyBpbmNsdXNpb24KICAgICBvZiB0aGUgZS1tYWlsIGFkZHJlc3MgaW4gdGhlIEROIChpLmUuLCBpdCB3aWxsIGdvIGludG8gYSBjZXJ0aWZpY2F0ZQogICAgIGV4dGVuc2lvbiBvbmx5KS4gIFRoZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiAnZW1haWxfaW5fZG4gPSBubycKICAgICBoYXMgdGhlIHNhbWUgZWZmZWN0LgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSBtYWR3b2xmQG9wZW5jYS5vcmddCgogICopIENoYW5nZSBhbGwgZnVuY3Rpb25zIHdpdGggbmFtZXMgc3RhcnRpbmcgd2l0aCBkZXNfIHRvIGJlIHN0YXJ0aW5nCiAgICAgd2l0aCBERVNfIGluc3RlYWQuICBBZGQgd3JhcHBlcnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGxpYmRlcywKICAgICBidXQgYXJlIG5hbWVkIF9vc3NsX29sZF9kZXNfKi4gIEZpbmFsbHksIGFkZCBtYWNyb3MgdGhhdCBtYXAgdGhlCiAgICAgZGVzXyogc3ltYm9scyB0byB0aGUgY29ycmVzcG9uZGluZyBfb3NzbF9vbGRfZGVzXyogaWYgbGliZGVzCiAgICAgY29tcGF0aWJpbGl0eSBpcyBkZXNpcmVkLiAgSWYgT3BlblNTTCAwLjkuNmMgY29tcGF0aWJpbGl0eSBpcwogICAgIGRlc2lyZWQsIHRoZSBkZXNfKiBzeW1ib2xzIHdpbGwgYmUgbWFwcGVkIHRvIERFU18qLCB3aXRoIG9uZQogICAgIGV4Y2VwdGlvbi4KCiAgICAgU2luY2Ugd2UgcHJvdmlkZSB0d28gY29tcGF0aWJpbGl0eSBtYXBwaW5ncywgdGhlIHVzZXIgbmVlZHMgdG8KICAgICBkZWZpbmUgdGhlIG1hY3JvIE9QRU5TU0xfREVTX0xJQkRFU19DT01QQVRJQklMSVRZIGlmIGxpYmRlcwogICAgIGNvbXBhdGliaWxpdHkgaXMgZGVzaXJlZC4gIFRoZSBkZWZhdWx0IChpLmUuLCB3aGVuIHRoYXQgbWFjcm8KICAgICBpc24ndCBkZWZpbmVkKSBpcyBPcGVuU1NMIDAuOS42YyBjb21wYXRpYmlsaXR5LgoKICAgICBUaGVyZSBhcmUgYWxzbyBtYWNyb3MgdGhhdCBlbmFibGUgYW5kIGRpc2FibGUgdGhlIHN1cHBvcnQgb2Ygb2xkCiAgICAgZGVzIGZ1bmN0aW9ucyBhbHRvZ2V0aGVyLiAgVGhvc2UgYXJlIE9QRU5TU0xfRU5BQkxFX09MRF9ERVNfU1VQUE9SVAogICAgIGFuZCBPUEVOU1NMX0RJU0FCTEVfT0xEX0RFU19TVVBQT1JULiAgSWYgbm9uZSBvciBib3RoIG9mIHRob3NlCiAgICAgYXJlIGRlZmluZWQsIHRoZSBkZWZhdWx0IHdpbGwgYXBwbHk6IHRvIHN1cHBvcnQgdGhlIG9sZCBkZXMgcm91dGluZXMuCgogICAgIEluIGVpdGhlciBjYXNlLCBvbmUgbXVzdCBpbmNsdWRlIG9wZW5zc2wvZGVzLmggdG8gZ2V0IHRoZSBjb3JyZWN0CiAgICAgZGVmaW5pdGlvbnMuICBEbyBub3QgdHJ5IHRvIGp1c3QgaW5jbHVkZSBvcGVuc3NsL2Rlc19vbGQuaCwgdGhhdAogICAgIHdvbid0IHdvcmsuCgogICAgIE5PVEU6IFRoaXMgaXMgYSBtYWpvciBicmVhayBvZiBhbiBvbGQgQVBJIGludG8gYSBuZXcgb25lLiAgU29mdHdhcmUKICAgICBhdXRob3JzIGFyZSBlbmNvdXJhZ2VkIHRvIHN3aXRjaCB0byB0aGUgREVTXyBzdHlsZSBmdW5jdGlvbnMuICBTb21lCiAgICAgdGltZSBpbiB0aGUgZnV0dXJlLCBkZXNfb2xkLmggYW5kIHRoZSBsaWJkZXMgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMKICAgICB3aWxsIGJlIGRpc2FibGUgKGkuZS4gT1BFTlNTTF9ESVNBQkxFX09MRF9ERVNfU1VQUE9SVCB3aWxsIGJlIHRoZQogICAgIGRlZmF1bHQpLCBhbmQgdGhlbiBjb21wbGV0ZWx5IHJlbW92ZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGVzdCBmb3IgY2VydGlmaWNhdGVzIHdoaWNoIGNvbnRhaW4gdW5zdXBwb3J0ZWQgY3JpdGljYWwgZXh0ZW5zaW9ucy4KICAgICBJZiBzdWNoIGEgY2VydGlmaWNhdGUgaXMgZm91bmQgZHVyaW5nIGEgdmVyaWZ5IG9wZXJhdGlvbiBpdCBpcyAKICAgICByZWplY3RlZCBieSBkZWZhdWx0OiB0aGlzIGJlaGF2aW91ciBjYW4gYmUgb3ZlcnJpZGRlbiBieSBlaXRoZXIKICAgICBoYW5kbGluZyB0aGUgbmV3IGVycm9yIFg1MDlfVl9FUlJfVU5IQU5ETEVEX0NSSVRJQ0FMX0VYVEVOU0lPTiBvcgogICAgIGJ5IHNldHRpbmcgdGhlIHZlcmlmeSBmbGFnIFg1MDlfVl9GTEFHX0lHTk9SRV9DUklUSUNBTC4gQSBuZXcgZnVuY3Rpb24KICAgICBYNTA5X3N1cHBvcnRlZF9leHRlbnNpb24oKSBoYXMgYWxzbyBiZWVuIGFkZGVkIHdoaWNoIHJldHVybnMgMSBpZiBhCiAgICAgcGFydGljdWxhciBleHRlbnNpb24gaXMgc3VwcG9ydGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIEVWUCBjaXBoZXIgZnVuY3Rpb25zIGluIHNpbWlsYXIgd2F5IHRvIGRpZ2VzdHMKICAgICB0byByZXRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgRVZQX0RpZ2VzdEluaXQoKSBhbmQgRVZQX0RpZ2VzdEZpbmFsKCkgdG8gcmV0YWluCiAgICAgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGUuIEluIHBhcnRpY3VsYXIgdGhlICdjdHgnIHBhcmFtZXRlciBkb2VzCiAgICAgbm90IGhhdmUgdG8gYmUgdG8gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBjYWxsIHRvIEVWUF9EaWdlc3RJbml0KCkgYW5kCiAgICAgaXQgaXMgdGlkaWVkIHVwIGFmdGVyIGEgY2FsbCB0byBFVlBfRGlnZXN0RmluYWwoKS4gTmV3IGZ1bmN0aW9uCiAgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCkgd2hpY2ggZG9lcyBub3QgdGlkeSB1cCB0aGUgY3R4LiBTaW1pbGFybHkgZnVuY3Rpb24KICAgICBFVlBfTURfQ1RYX2NvcHkoKSBjaGFuZ2VkIHRvIG5vdCByZXF1aXJlIHRoZSBkZXN0aW5hdGlvbiB0byBiZQogICAgIGluaXRpYWxpemVkIHZhbGlkIGFuZCBuZXcgZnVuY3Rpb24gRVZQX01EX0NUWF9jb3B5X2V4KCkgYWRkZWQgd2hpY2gKICAgICByZXF1aXJlcyB0aGUgZGVzdGluYXRpb24gdG8gYmUgdmFsaWQuCgogICAgIE1vZGlmeSBhbGwgdGhlIE9wZW5TU0wgZGlnZXN0IGNhbGxzIHRvIHVzZSBFVlBfRGlnZXN0SW5pdF9leCgpLAogICAgIEVWUF9EaWdlc3RGaW5hbF9leCgpIGFuZCBFVlBfTURfQ1RYX2NvcHlfZXgoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2Ugc3NsM19nZXRfbWVzc2FnZSAoc3NsL3MzX2JvdGguYykgYW5kIHRoZSBmdW5jdGlvbnMgdXNpbmcgaXQKICAgICBzbyB0aGF0IGNvbXBsZXRlICdIYW5kc2hha2UnIHByb3RvY29sIHN0cnVjdHVyZXMgYXJlIGtlcHQgaW4gbWVtb3J5CiAgICAgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyAnbXNnX3R5cGUnIGFuZCAnbGVuZ3RoJyB3aXRoICdib2R5JyBkYXRhLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrIGZvciBXaW4zMi4KICAgICBbTWFzc2ltbyBTYW50aW4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFqb3IgcmVzdHJ1Y3R1cmluZyB0byB0aGUgdW5kZXJseWluZyBFTkdJTkUgY29kZS4gVGhpcyBpbmNsdWRlcwogICAgIHJlZHVjdGlvbiBvZiBsaW5rZXIgYmxvYXQsIHNlcGFyYXRpb24gb2YgcHVyZSAiRU5HSU5FIiBtYW5pcHVsYXRpb24KICAgICAoaW5pdGlhbGlzYXRpb24sIGV0YykgZnJvbSBmdW5jdGlvbmFsaXR5IGRlYWxpbmcgd2l0aCBpbXBsZW1lbnRhdGlvbnMKICAgICBvZiBzcGVjaWZpYyBjcnlwdG8gaXRlcmZhY2VzLiBUaGlzIGNoYW5nZSBhbHNvIGludHJvZHVjZXMgaW50ZWdyYXRlZAogICAgIHN1cHBvcnQgZm9yIHN5bW1ldHJpYyBjaXBoZXJzIGFuZCBkaWdlc3QgaW1wbGVtZW50YXRpb25zIC0gc28gRU5HSU5FcwogICAgIGNhbiBub3cgYWNjZWxlcmF0ZSB0aGVzZSBieSBwcm92aWRpbmcgRVZQX0NJUEhFUiBhbmQgRVZQX01ECiAgICAgaW1wbGVtZW50YXRpb25zIG9mIHRoZWlyIG93bi4gVGhpcyBpcyBkZXRhaWxlZCBpbiBjcnlwdG8vZW5naW5lL1JFQURNRQogICAgIGFzIGl0IGNvdWxkbid0IGJlIGFkZXF1YXRlbHkgZGVzY3JpYmVkIGhlcmUuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIGZldwogICAgIEFQSSBjaGFuZ2VzIHdvcnRoIG5vdGluZyAtIHNvbWUgUlNBLCBEU0EsIERILCBhbmQgUkFORCBmdW5jdGlvbnMgdGhhdAogICAgIHdlcmUgY2hhbmdlZCBpbiB0aGUgb3JpZ2luYWwgaW50cm9kdWN0aW9uIG9mIEVOR0lORSBjb2RlIGhhdmUgbm93CiAgICAgcmV2ZXJ0ZWQgYmFjayAtIHRoZSBob29raW5nIGZyb20gdGhpcyBjb2RlIHRvIEVOR0lORSBpcyBub3cgYSBnb29kCiAgICAgZGVhbCBtb3JlIHBhc3NpdmUgYW5kIGF0IHJ1bi10aW1lLCBvcGVyYXRpb25zIGRlYWwgZGlyZWN0bHkgd2l0aAogICAgIFJTQV9NRVRIT0RzLCBEU0FfTUVUSE9EcyAoZXRjKSBhcyB0aGV5IGRpZCBiZWZvcmUsIHJhdGhlciB0aGFuCiAgICAgZGVyZWZlcmVuY2luZyB0aHJvdWdoIGFuIEVOR0lORSBwb2ludGVyIGFueSBtb3JlLiBBbHNvLCB0aGUgRU5HSU5FCiAgICAgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBCTl9NT0RfRVhQW19DUlRdIGhhbmRsZXJzIGhhdmUgYmVlbiByZW1vdmVkIC0KICAgICB0aGV5IHdlcmUgbm90IGJlaW5nIHVzZWQgYnkgdGhlIGZyYW1ld29yayBhcyB0aGVyZSBpcyBubyBjb25jZXB0IG9mIGEKICAgICBCSUdOVU1fTUVUSE9EIGFuZCB0aGV5IGNvdWxkIG5vdCBiZSBnZW5lcmFsaXNlZCB0byB0aGUgbmV3CiAgICAgJ0VOR0lORV9UQUJMRScgbWVjaGFuaXNtIHRoYXQgdW5kZXJsaWVzIHRoZSBuZXcgY29kZS4gU2ltaWxhcmx5LAogICAgIEVOR0lORV9jcHkoKSBoYXMgYmVlbiByZW1vdmVkIGFzIGl0IGNhbm5vdCBiZSBjb25zaXN0ZW50bHkgZGVmaW5lZCBpbgogICAgIHRoZSBuZXcgY29kZS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBDaGFuZ2UgQVNOMV9HRU5FUkFMSVpFRFRJTUVfY2hlY2soKSB0byBhbGxvdyBmcmFjdGlvbmFsIHNlY29uZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIG1rZGVmLnBsIHRvIHNvcnQgc3ltYm9scyB0aGF0IGdldCB0aGUgc2FtZSBlbnRyeSBudW1iZXIsCiAgICAgYW5kIG1ha2Ugc3VyZSB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnVuY3Rpb25zIEVSUl9sb2FkXyoKICAgICBiZWNvbWUgcGFydCBvZiBsaWJlYXkubnVtIGFzIHdlbGwuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IGZ1bmN0aW9uIFNTTF9yZW5lZ290aWF0ZV9wZW5kaW5nKCkuICBUaGlzIHJldHVybnMgdHJ1ZSBvbmNlCiAgICAgcmVuZWdvdGlhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQgKGVpdGhlciBTU0xfcmVuZWdvdGlhdGUoKSBjYWxsCiAgICAgb3IgSGVsbG9SZXF1ZXN0L0NsaWVudEhlbGxvIHJlY2VpdmVkIGZyb20gdGhlIHBlZXIpIGFuZCBiZWNvbWVzCiAgICAgZmFsc2Ugb25jZSBhIGhhbmRzaGFrZSBoYXMgYmVlbiBjb21wbGV0ZWQuCiAgICAgKEZvciBzZXJ2ZXJzLCBTU0xfcmVuZWdvdGlhdGUoKSBmb2xsb3dlZCBieSBTU0xfZG9faGFuZHNoYWtlKCkKICAgICBzZW5kcyBhIEhlbGxvUmVxdWVzdCwgYnV0IGRvZXMgbm90IGVuc3VyZSB0aGF0IGEgaGFuZHNoYWtlIHRha2VzCiAgICAgcGxhY2UuICBTU0xfcmVuZWdvdGlhdGVfcGVuZGluZygpIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgaWYgdGhlCiAgICAgY2xpZW50IGhhcyBmb2xsb3dlZCB0aGUgcmVxdWVzdC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IFNTTCBvcHRpb24gU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OLgogICAgIEJ5IGRlZmF1bHQsIGNsaWVudHMgbWF5IHJlcXVlc3Qgc2Vzc2lvbiByZXN1bXB0aW9uIGV2ZW4gZHVyaW5nCiAgICAgcmVuZWdvdGlhdGlvbiAoaWYgc2Vzc2lvbiBJRCBjb250ZXh0cyBwZXJtaXQpOyB3aXRoIHRoaXMgb3B0aW9uLAogICAgIHNlc3Npb24gcmVzdW1wdGlvbiBpcyBwb3NzaWJsZSBvbmx5IGluIHRoZSBmaXJzdCBoYW5kc2hha2UuCgogICAgIFNTTF9PUF9BTEwgaXMgbm93IDB4MDAwMDBGRkZMIGluc3RlYWQgb2YgMHgwMDBGRkZGRkwuICBUaGlzIG1ha2VzCiAgICAgbW9yZSBiaXRzIGF2YWlsYWJsZSBmb3Igb3B0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgcGFydCBvZgogICAgIFNTTF9PUF9BTEwgKHN1Y2ggYXMgU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgc29tZSBkZW1vcyBmb3IgY2VydGlmaWNhdGUgYW5kIGNlcnRpZmljYXRlIHJlcXVlc3QgY3JlYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBtYXhpbXVtIGNlcnRpZmljYXRlIGNoYWluIHNpemUgYWNjZXB0ZWQgZnJvbSB0aGUgcGVlciBhcHBsaWNhdGlvbgogICAgIHNldHRhYmxlIChTU0wqX2dldC9zZXRfbWF4X2NlcnRfbGlzdCgpKSwgYXMgcHJvcG9zZWQgYnkKICAgICAiRG91Z2xhcyBFLiBFbmdlcnQiIDxkZWVuZ2VydEBhbmwuZ292Pi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgZm9yIFVuaXh3YXJlLTcKICAgICAoQm95ZCBMeW5uIEdlcmJlciA8Z2VyYmVyYkB6ZW5lei5jb20+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIGEgImRlc3Ryb3kiIGhhbmRsZXIgdG8gRU5HSU5FcyB0aGF0IGFsbG93cyBzdHJ1Y3R1cmFsIGNsZWFudXAgdG8KICAgICBiZSBkb25lIHByaW9yIHRvIGRlc3RydWN0aW9uLiBVc2UgdGhpcyB0byB1bmxvYWQgZXJyb3Igc3RyaW5ncyBmcm9tCiAgICAgRU5HSU5FcyB0aGF0IGxvYWQgdGhlaXIgb3duIGVycm9yIHN0cmluZ3MuIE5COiBUaGlzIGFkZHMgdHdvIG5ldyBBUEkKICAgICBmdW5jdGlvbnMgdG8gImdldCIgYW5kICJzZXQiIHRoaXMgZGVzdHJveSBoYW5kbGVyIGluIGFuIEVOR0lORS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBbHRlciBhbGwgZXhpc3RpbmcgRU5HSU5FIGltcGxlbWVudGF0aW9ucyAoZXhjZXB0ICJvcGVuc3NsIiBhbmQKICAgICAib3BlbmJzZCIpIHRvIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlIHRoZWlyIG93biBlcnJvciBzdHJpbmdzLiBUaGlzCiAgICAgbWFrZXMgdGhlbSBtb3JlIGZsZXhpYmxlIHRvIGJlIGJ1aWx0IGJvdGggYXMgc3RhdGljYWxseS1saW5rZWQgRU5HSU5FcwogICAgIGFuZCBzZWxmLWNvbnRhaW5lZCBzaGFyZWQtbGlicmFyaWVzIGxvYWRhYmxlIHZpYSB0aGUgImR5bmFtaWMiIEVOR0lORS4KICAgICBBbHNvLCBhZGQgc3R1YiBjb2RlIHRvIGVhY2ggdGhhdCBtYWtlcyBidWlsZGluZyB0aGVtIGFzIHNlbGYtY29udGFpbmVkCiAgICAgc2hhcmVkLWxpYnJhcmllcyBlYXNpZXIgKHNlZSBSRUFETUUuRU5HSU5FKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYSAiZHluYW1pYyIgRU5HSU5FIHRoYXQgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgRU5HSU5FCiAgICAgaW1wbGVtZW50YXRpb25zIGludG8gYXBwbGljYXRpb25zIHRoYXQgYXJlIGNvbXBsZXRlbHkgaW1wbGVtZW50ZWQgaW4KICAgICBzZWxmLWNvbnRhaW5lZCBzaGFyZWQtbGlicmFyaWVzLiBUaGUgImR5bmFtaWMiIEVOR0lORSBleHBvc2VzIGNvbnRyb2wKICAgICBjb21tYW5kcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB3aGF0IHNoYXJlZC1saWJyYXJ5IHRvIGxvYWQgYW5kCiAgICAgdG8gY29udHJvbCBhc3BlY3RzIG9mIHRoZSB3YXkgaXQgaXMgaGFuZGxlZC4gQWxzbywgbWFkZSBhbiB1cGRhdGUgdG8KICAgICB0aGUgUkVBRE1FLkVOR0lORSBmaWxlIHRoYXQgYnJpbmdzIGl0cyBpbmZvcm1hdGlvbiB1cC10by1kYXRlIGFuZAogICAgIHByb3ZpZGVzIHNvbWUgaW5mb3JtYXRpb24gYW5kIGluc3RydWN0aW9ucyBvbiB0aGUgImR5bmFtaWMiIEVOR0lORQogICAgIChpZS4gaG93IHRvIHVzZSBpdCwgaG93IHRvIGJ1aWxkICJkeW5hbWljIi1sb2FkYWJsZSBFTkdJTkVzLCBldGMpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gdW5sb2FkIHJhbmdlcyBvZiBFUlIgc3RyaW5ncyB3aXRoIGEgbmV3CiAgICAgIkVSUl91bmxvYWRfc3RyaW5ncyIgZnVuY3Rpb24uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGEgY29weSgpIGZ1bmN0aW9uIHRvIEVWUF9NRC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBFVlBfTUQgcm91dGluZXMgdGFrZSBhIGNvbnRleHQgcG9pbnRlciBpbnN0ZWFkIG9mIGp1c3QgdGhlCiAgICAgbWRfZGF0YSB2b2lkIHBvaW50ZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBmbGFncyB0byBFVlBfTUQgYW5kIEVWUF9NRF9DVFguIEVWUF9NRF9GTEFHX09ORVNIT1QgaW5kaWNhdGVzCiAgICAgdGhhdCB0aGUgZGlnZXN0IGNhbiBvbmx5IHByb2Nlc3MgYSBzaW5nbGUgY2h1bmsgb2YgZGF0YQogICAgICh0eXBpY2FsbHkgYmVjYXVzZSBpdCBpcyBwcm92aWRlZCBieSBhIHBpZWNlIG9mCiAgICAgaGFyZHdhcmUpLiBFVlBfTURfQ1RYX0ZMQUdfT05FU0hPVCBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwbGljYXRpb24KICAgICBpcyBvbmx5IGdvaW5nIHRvIHByb3ZpZGUgYSBzaW5nbGUgY2h1bmsgb2YgZGF0YSwgYW5kIGhlbmNlIHRoZQogICAgIGZyYW1ld29yayBuZWVkbid0IGFjY3VtdWxhdGUgdGhlIGRhdGEgZm9yIG9uZXNob3QgZHJpdmVycy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQXMgd2l0aCAiRVJSIiwgbWFrZSBpdCBwb3NzaWJsZSB0byByZXBsYWNlIHRoZSB1bmRlcmx5aW5nICJleF9kYXRhIgogICAgIGZ1bmN0aW9ucy4gVGhpcyBjaGFuZ2UgYWxzbyBhbHRlcnMgdGhlIHN0b3JhZ2UgYW5kIG1hbmFnZW1lbnQgb2YgZ2xvYmFsCiAgICAgZXhfZGF0YSBzdGF0ZSAtIGl0J3Mgbm93IGFsbCBpbnNpZGUgZXhfZGF0YS5jIGFuZCBhbGwgImNsYXNzIiBjb2RlIChlZy4KICAgICBSU0EsIEJJTywgU1NMX0NUWCwgZXRjKSBubyBsb25nZXIgc3RvcmVzIGl0cyBvd24gU1RBQ0tTIGFuZCBwZXItY2xhc3MKICAgICBpbmRleCBjb3VudGVycy4gVGhlIEFQSSBmdW5jdGlvbnMgdGhhdCB1c2UgdGhpcyBzdGF0ZSBoYXZlIGJlZW4gY2hhbmdlZAogICAgIHRvIHRha2UgYSAiY2xhc3NfaW5kZXgiIHJhdGhlciB0aGFuIHBvaW50ZXJzIHRvIHRoZSBjbGFzcydzIGxvY2FsIFNUQUNLCiAgICAgYW5kIGNvdW50ZXIsIGFuZCB0aGVyZSBpcyBub3cgYW4gQVBJIGZ1bmN0aW9uIHRvIGR5bmFtaWNhbGx5IGNyZWF0ZSBuZXcKICAgICBjbGFzc2VzLiBUaGlzIGNlbnRyYWxpc2F0aW9uIGFsbG93cyB1cyB0byAoYSkgcGx1ZyBhIGxvdCBvZiB0aGUKICAgICB0aHJlYWQtc2FmZXR5IHByb2JsZW1zIHRoYXQgZXhpc3RlZCwgYW5kIChiKSBtYWtlcyBpdCBwb3NzaWJsZSB0byBjbGVhbgogICAgIHVwIGFsbCBhbGxvY2F0ZWQgc3RhdGUgdXNpbmcgIkNSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCkiLiBXLnIudC4gKGIpCiAgICAgc3VjaCBkYXRhIHdvdWxkIHByZXZpb3VzbHkgaGF2ZSBhbHdheXMgbGVha2VkIGluIGFwcGxpY2F0aW9uIGNvZGUgYW5kCiAgICAgd29ya2Fyb3VuZHMgd2VyZSBpbiBwbGFjZSB0byBtYWtlIHRoZSBtZW1vcnkgZGVidWdnaW5nIHR1cm4gYSBibGluZCBleWUKICAgICB0byBpdC4gQXBwbGljYXRpb24gY29kZSB0aGF0IGRvZXNuJ3QgdXNlIHRoaXMgbmV3IGZ1bmN0aW9uIHdpbGwgc3RpbGwKICAgICBsZWFrIGFzIGJlZm9yZSwgYnV0IHRoZWlyIG1lbW9yeSBkZWJ1Z2dpbmcgb3V0cHV0IHdpbGwgYW5ub3VuY2UgaXQgbm93CiAgICAgcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBzbGlkZS4KCiAgICAgQmVzaWRlcyB0aGUgYWRkaXRpb24gb2YgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKSwgYW5vdGhlciBBUEkgY2hhbmdlCiAgICAgaW5kdWNlZCBieSB0aGUgImV4X2RhdGEiIG92ZXJoYXVsIGlzIHRoYXQgWDUwOV9TVE9SRV9DVFhfaW5pdCgpIG5vdwogICAgIGhhcyBhIHJldHVybiB2YWx1ZSB0byBpbmRpY2F0ZSBzdWNjZXNzIG9yIGZhaWx1cmUuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byByZXBsYWNlIHRoZSB1bmRlcmx5aW5nICJFUlIiIGZ1bmN0aW9ucyBzdWNoIHRoYXQgdGhlCiAgICAgZ2xvYmFsIHN0YXRlICgyIExIQVNIIHRhYmxlcyBhbmQgMiBsb2NrcykgaXMgb25seSB1c2VkIGJ5IHRoZSAiZGVmYXVsdCIKICAgICBpbXBsZW1lbnRhdGlvbi4gVGhpcyBjaGFuZ2UgYWxzbyBhZGRzIHR3byBmdW5jdGlvbnMgdG8gImdldCIgYW5kICJzZXQiCiAgICAgdGhlIGltcGxlbWVudGF0aW9uIHByaW9yIHRvIGl0IGJlaW5nIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBmaXJzdCB0aW1lCiAgICAgYW55IG90aGVyIEVSUiBmdW5jdGlvbiB0YWtlcyBwbGFjZS4gSWUuIGFuIGFwcGxpY2F0aW9uIGNhbiBjYWxsICJnZXQiLAogICAgIHBhc3MgdGhlIHJldHVybiB2YWx1ZSB0byBhIG1vZHVsZSBpdCBoYXMganVzdCBsb2FkZWQsIGFuZCB0aGF0IG1vZHVsZQogICAgIGNhbiBjYWxsIGl0cyBvd24gInNldCIgZnVuY3Rpb24gdXNpbmcgdGhhdCB2YWx1ZS4gVGhpcyBtZWFucyB0aGUKICAgICBtb2R1bGUncyAiRVJSIiBvcGVyYXRpb25zIHdpbGwgdXNlIChhbmQgbW9kaWZ5KSB0aGUgZXJyb3Igc3RhdGUgaW4gdGhlCiAgICAgYXBwbGljYXRpb24gYW5kIG5vdCBpbiBpdHMgb3duIHN0YXRpY2FsbHkgbGlua2VkIGNvcHkgb2YgT3BlblNTTCBjb2RlLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEdpdmUgREgsIERTQSwgYW5kIFJTQSB0eXBlcyB0aGVpciBvd24gIioqX3VwX3JlZigpIiBmdW5jdGlvbiB0byBpbmNyZW1lbnQKICAgICByZWZlcmVuY2UgY291bnRzLiBUaGlzIHBlcmZvcm1zIG5vcm1hbCBSRUZfUFJJTlQvUkVGX0NIRUNLIG1hY3JvcyBvbgogICAgIHRoZSBvcGVyYXRpb24sIGFuZCBwcm92aWRlcyBhIG1vcmUgZW5jYXBzdWxhdGVkIHdheSBmb3IgZXh0ZXJuYWwgY29kZQogICAgIChjcnlwdG8vZXZwLyBhbmQgc3NsLykgdG8gZG8gdGhpcy4gQWxzbyBjaGFuZ2VkIHRoZSBldnAgYW5kIHNzbCBjb2RlCiAgICAgdG8gdXNlIHRoZXNlIGZ1bmN0aW9ucyByYXRoZXIgdGhhbiBtYW51YWxseSBpbmNyZW1lbnRpbmcgdGhlIGNvdW50cy4KCiAgICAgQWxzbyByZW5hbWUgIkRTT191cCgpIiBmdW5jdGlvbiB0byBtb3JlIGRlc2NyaXB0aXZlICJEU09fdXBfcmVmKCkiLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBFVlAgdGVzdCBwcm9ncmFtLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgc3ltbWV0cmljIGNpcGhlciBzdXBwb3J0IHRvIEVOR0lORS4gRXhwZWN0IHRoZSBBUEkgdG8gY2hhbmdlIQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBOZXcgQ1JMIGZ1bmN0aW9uczogWDUwOV9DUkxfc2V0X3ZlcnNpb24oKSwgWDUwOV9DUkxfc2V0X2lzc3Vlcl9uYW1lKCkKICAgICBYNTA5X0NSTF9zZXRfbGFzdFVwZGF0ZSgpLCBYNTA5X0NSTF9zZXRfbmV4dFVwZGF0ZSgpLCBYNTA5X0NSTF9zb3J0KCksCiAgICAgWDUwOV9SRVZPS0VEX3NldF9zZXJpYWxOdW1iZXIoKSwgYW5kIFg1MDlfUkVWT0tFRF9zZXRfcmV2b2NhdGlvbkRhdGUoKS4KICAgICBUaGVzZSBhbGxvdyBhIENSTCB0byBiZSBidWlsdCB3aXRob3V0IGhhdmluZyB0byBhY2Nlc3MgWDUwOV9DUkwgZmllbGRzCiAgICAgZGlyZWN0bHkuIE1vZGlmeSAnY2EnIGFwcGxpY2F0aW9uIHRvIHVzZSBuZXcgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgU1NMX09QX1RMU19ST0xMQkFDS19CVUcgb3V0IG9mIHRoZSBTU0xfT1BfQUxMIGxpc3Qgb2YgcmVjb21tZW5kZWQKICAgICBidWcgd29ya2Fyb3VuZHMuIFJvbGxiYWNrIGF0dGFjayBkZXRlY3Rpb24gaXMgYSBzZWN1cml0eSBmZWF0dXJlLgogICAgIFRoZSBwcm9ibGVtIHdpbGwgb25seSBhcmlzZSBvbiBPcGVuU1NMIHNlcnZlcnMgd2hlbiBUTFN2MSBpcyBub3QKICAgICBhdmFpbGFibGUgKHNzbHYzX3NlcnZlcl9tZXRob2QoKSBvciBTU0xfT1BfTk9fVExTdjEpLgogICAgIFNvZnR3YXJlIGF1dGhvcnMgbm90IHdhbnRpbmcgdG8gc3VwcG9ydCBUTFN2MSB3aWxsIGhhdmUgc3BlY2lhbCByZWFzb25zCiAgICAgZm9yIHRoZWlyIGNob2ljZSBhbmQgY2FuIGV4cGxpY2l0bHkgZW5hYmxlIHRoaXMgb3B0aW9uLgogICAgIFtCb2RvIE1vZWxsZXIsIEx1dHogSmFlbmlja2VdCgogICopIFJhdGlvbmFsaXNlIEVWUCBzbyBpdCBjYW4gYmUgZXh0ZW5kZWQ6IGRvbid0IGluY2x1ZGUgYSB1bmlvbiBvZgogICAgIGNpcGhlci9kaWdlc3Qgc3RydWN0dXJlcywgYWRkIGluaXQvY2xlYW51cCBmdW5jdGlvbnMgZm9yIEVWUF9NRF9DVFgKICAgICAoc2ltaWxhciB0byB0aG9zZSBleGlzdGluZyBmb3IgRVZQX0NJUEhFUl9DVFgpLgogICAgIFVzYWdlIGV4YW1wbGU6CgogICAgICAgICBFVlBfTURfQ1RYIG1kOwoKICAgICAgICAgRVZQX01EX0NUWF9pbml0KCZtZCk7ICAgICAgICAgICAgIC8qIG5ldyBmdW5jdGlvbiBjYWxsICovCiAgICAgICAgIEVWUF9EaWdlc3RJbml0KCZtZCwgRVZQX3NoYTEoKSk7CiAgICAgICAgIEVWUF9EaWdlc3RVcGRhdGUoJm1kLCBpbiwgbGVuKTsKICAgICAgICAgRVZQX0RpZ2VzdEZpbmFsKCZtZCwgb3V0LCBOVUxMKTsKICAgICAgICAgRVZQX01EX0NUWF9jbGVhbnVwKCZtZCk7ICAgICAgICAgIC8qIG5ldyBmdW5jdGlvbiBjYWxsICovCgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIERFUyBrZXkgc2NoZWR1bGUgY29uZm9ybSB0byB0aGUgdXN1YWwgc2NoZW1lLCBhcyB3ZWxsIGFzCiAgICAgY29ycmVjdGluZyBpdHMgc3RydWN0dXJlLiBUaGlzIG1lYW5zIHRoYXQgY2FsbHMgdG8gREVTIGZ1bmN0aW9ucwogICAgIG5vdyBoYXZlIHRvIHBhc3MgYSBwb2ludGVyIHRvIGEgZGVzX2tleV9zY2hlZHVsZSBpbnN0ZWFkIG9mIGEKICAgICBwbGFpbiBkZXNfa2V5X3NjaGVkdWxlICh3aGljaCB3YXMgYWN0dWFsbHkgYWx3YXlzIGEgcG9pbnRlcgogICAgIGFueXdheSk6IEUuZy4sCgogICAgICAgICBkZXNfa2V5X3NjaGVkdWxlIGtzOwoKCSBkZXNfc2V0X2tleV9jaGVja2VkKC4uLiwgJmtzKTsKCSBkZXNfbmNiY19lbmNyeXB0KC4uLiwgJmtzLCAuLi4pOwoKICAgICAoTm90ZSB0aGF0IGEgbGF0ZXIgY2hhbmdlIHJlbmFtZXMgJ2Rlc18uLi4nIGludG8gJ0RFU18uLi4nLikKICAgICBbQmVuIExhdXJpZV0KCiAgKikgSW5pdGlhbCByZWR1Y3Rpb24gb2YgbGlua2VyIGJsb2F0OiB0aGUgdXNlIG9mIHNvbWUgZnVuY3Rpb25zLCBzdWNoIGFzCiAgICAgUEVNIGNhdXNlcyBsYXJnZSBhbW91bnRzIG9mIHVudXNlZCBmdW5jdGlvbnMgdG8gYmUgbGlua2VkIGluIGR1ZSB0bwogICAgIHBvb3Igb3JnYW5pc2F0aW9uLiBGb3IgZXhhbXBsZSBwZW1fYWxsLmMgY29udGFpbnMgZXZlcnkgUEVNIGZ1bmN0aW9uCiAgICAgd2hpY2ggaGFzIGEga25vY2sgb24gZWZmZWN0IG9mIGxpbmtpbmcgaW4gbGFyZ2UgYW1vdW50cyBvZiAodW51c2VkKQogICAgIEFTTjEgY29kZS4gR3JvdXBpbmcgdG9nZXRoZXIgc2ltaWxhciBmdW5jdGlvbnMgYW5kIHNwbGl0dGluZyB1bnJlbGF0ZWQKICAgICBmdW5jdGlvbnMgcHJldmVudHMgdGhpcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbnVwIG9mIEVWUCBtYWNyb3MuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENoYW5nZSBoaXN0b3JpY2FsIHJlZmVyZW5jZXMgdG8ge05JRCxTTixMTn1fZGVzX2VkZSBhbmQgZWRlMyB0byBhZGQgdGhlCiAgICAgY29ycmVjdCBfZWNiIHN1ZmZpeC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGluaXRpYWwgT0NTUCByZXNwb25kZXIgc3VwcG9ydCB0byBvY3NwIGFwcGxpY2F0aW9uLiBUaGUKICAgICByZXZvY2F0aW9uIGluZm9ybWF0aW9uIGlzIGhhbmRsZWQgdXNpbmcgdGhlIHRleHQgYmFzZWQgaW5kZXgKICAgICB1c2UgYnkgdGhlIGNhIGFwcGxpY2F0aW9uLiBUaGUgcmVzcG9uZGVyIGNhbiBlaXRoZXIgaGFuZGxlCiAgICAgcmVxdWVzdHMgZ2VuZXJhdGVkIGludGVybmFsbHksIHN1cHBsaWVkIGluIGZpbGVzIChmb3IgZXhhbXBsZQogICAgIHZpYSBhIENHSSBzY3JpcHQpIG9yIHVzaW5nIGFuIGludGVybmFsIG1pbmltYWwgc2VydmVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjb25maWd1cmF0aW9uIGNob2ljZXMgdG8gZ2V0IHpsaWIgY29tcHJlc3Npb24gZm9yIFRMUy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2VzIHRvIEtlcmJlcm9zIFNTTCBmb3IgUkZDIDI3MTIgY29tcGxpYW5jZToKICAgICAxLiAgSW1wbGVtZW50ZWQgcmVhbCBLZXJiZXJvc1dyYXBwZXIsIGluc3RlYWQgb2YganVzdCB1c2luZwogICAgICAgICBLUkI1IEFQX1JFUSBtZXNzYWdlLiAgW1RoYW5rcyB0byBTaW1vbiBXaWxraW5zb24gPHN4d0BzeHcub3JnLnVrPl0KICAgICAyLiAgSW1wbGVtZW50ZWQgb3B0aW9uYWwgYXV0aGVudGljYXRvciBmaWVsZCBvZiBLZXJiZXJvc1dyYXBwZXIuCgogICAgIEFkZGVkIG9wZW5zc2wtc3R5bGUgQVNOLjEgbWFjcm9zIGZvciBLZXJiZXJvcyB0aWNrZXQsIGFwX3JlcSwKICAgICBhbmQgYXV0aGVudGljYXRvciBzdHJ1Y3RzOyBzZWUgY3J5cHRvL2tyYjUvLgoKICAgICBHZW5lcmFsaXplZCBLZXJiZXJvcyBjYWxscyB0byBzdXBwb3J0IG11bHRpcGxlIEtlcmJlcm9zIGxpYnJhcmllcy4KICAgICBbVmVybiBTdGFhdHMgPHN0YWF0c3ZyQGFzYy5ocGMubWlsPiwKICAgICAgSmVmZnJleSBBbHRtYW4gPGphbHRtYW5AY29sdW1iaWEuZWR1PgogICAgICB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDYXVzZSAnb3BlbnNzbCBzcGVlZCcgdG8gdXNlIGZ1bGx5IGhhcmQtY29kZWQgRFNBIGtleXMgYXMgaXQKICAgICBhbHJlYWR5IGRvZXMgd2l0aCBSU0EuIHRlc3Rkc2EuaCBub3cgaGFzICdwcml2X2tleS9wdWJfa2V5JwogICAgIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUga2V5IHNpemVzIHJhdGhlciB0aGFuIGhhdmluZyBqdXN0CiAgICAgcGFyYW1ldGVycyAoYW5kICdzcGVlZCcgZ2VuZXJhdGluZyBrZXlzIGVhY2ggdGltZSkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgU3BlZWQgdXAgRVZQIHJvdXRpbmVzLgogICAgIEJlZm9yZToKZW5jcnlwdAp0eXBlICAgICAgICAgICAgICA4IGJ5dGVzICAgICA2NCBieXRlcyAgICAyNTYgYnl0ZXMgICAxMDI0IGJ5dGVzICAgODE5MiBieXRlcwpkZXMtY2JjICAgICAgICAgICA0NDA4Ljg1ayAgICAgNTU2MC41MWsgICAgIDU3NzguNDZrICAgICA1ODYyLjIwayAgICAgNTgyNS4xNmsKZGVzLWNiYyAgICAgICAgICAgNDM4OS41NWsgICAgIDU1NzEuMTdrICAgICA1NzkyLjIzayAgICAgNTg0Ni45MWsgICAgIDU4MzIuMTFrCmRlcy1jYmMgICAgICAgICAgIDQzOTQuMzJrICAgICA1NTc1LjkyayAgICAgNTgwNy40NGsgICAgIDU4NDguMzdrICAgICA1ODQxLjMwawpkZWNyeXB0CmRlcy1jYmMgICAgICAgICAgIDM0ODIuNjZrICAgICA1MDY5LjQ5ayAgICAgNTQ5Ni4zOWsgICAgIDU2MTQuMTZrICAgICA1NjM5LjI4awpkZXMtY2JjICAgICAgICAgICAzNDgwLjc0ayAgICAgNTA2OC43NmsgICAgIDU1MTAuMzRrICAgICA1NjA5Ljg3ayAgICAgNTYzNS41MmsKZGVzLWNiYyAgICAgICAgICAgMzQ4My43MmsgICAgIDUwNjcuNjJrICAgICA1NTA0LjYwayAgICAgNTcwOC4wMWsgICAgIDU3MjQuODBrCiAgICAgQWZ0ZXI6CmVuY3J5cHQKZGVzLWNiYyAgICAgICAgICAgNDY2MC4xNmsgICAgIDU2NTAuMTlrICAgICA1ODA3LjE5ayAgICAgNTgyNy4xM2sgICAgIDU3ODMuMzJrCmRlY3J5cHQKZGVzLWNiYyAgICAgICAgICAgMzYyNC45NmsgICAgIDUyNTguMjFrICAgICA1NTMwLjkxayAgICAgNTYyNC4zMGsgICAgIDU2MjguMjZrCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZGVkIHRoZSBPUzItRU1YIHRhcmdldC4KICAgICBbIkJyaWFuIEhhdmFyZCIgPGJyaWFuaEBraGVsZGFyLmFwYW5hLm9yZy5hdT4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmV3cml0ZSBhcHBzIHRvIHVzZSBOQ09ORiByb3V0aW5lcyBpbnN0ZWFkIG9mIHRoZSBvbGQgQ09ORi4gTmV3IGZ1bmN0aW9ucwogICAgIHRvIHN1cHBvcnQgTkNPTkYgcm91dGluZXMgaW4gZXh0ZW5zaW9uIGNvZGUuIE5ldyBmdW5jdGlvbiBDT05GX3NldF9uY29uZigpCiAgICAgdG8gYWxsb3cgZnVuY3Rpb25zIHdoaWNoIHRha2UgYW4gTkNPTkYgdG8gYWxzbyBoYW5kbGUgdGhlIG9sZCBMSEFTSAogICAgIHN0cnVjdHVyZTogdGhpcyBtZWFucyB0aGF0IHRoZSBvbGQgQ09ORiBjb21wYXRpYmxlIHJvdXRpbmVzIGNhbiBiZQogICAgIHJldGFpbmVkIChpbiBwYXJ0aWN1bGFyIHdydCBleHRlbnNpb25zKSB3aXRob3V0IGhhdmluZyB0byBkdXBsaWNhdGUgdGhlCiAgICAgY29kZS4gTmV3IGZ1bmN0aW9uIFg1MDlWM19hZGRfZXh0X25jb25mX3NrIHRvIGFkZCBleHRlbnNpb25zIHRvIGEgc3RhY2suCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSB0aGUgZ2VuZXJhbCB1c2VyIGludGVyZmFjZSB3aXRoIG1lY2hhbmlzbXMgZm9yIGlubmVyIGNvbnRyb2wKICAgICBhbmQgd2l0aCBwb3NzaWJpbGl0aWVzIHRvIGhhdmUgeWVzL25vIGtpbmQgb2YgcHJvbXB0cy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgYWxsIGNhbGxzIHRvIGxvdyBsZXZlbCBkaWdlc3Qgcm91dGluZXMgaW4gdGhlIGxpYnJhcnkgYW5kCiAgICAgYXBwbGljYXRpb25zIHRvIHVzZSBFVlAuIEFkZCBtaXNzaW5nIGNhbGxzIHRvIEhNQUNfY2xlYW51cCgpIGFuZAogICAgIGRvbid0IGFzc3VtZSBITUFDX0NUWCBjYW4gYmUgY29waWVkIHVzaW5nIG1lbWNweSgpLgogICAgIFtWZXJkb24gV2Fsa2VyIDxWV2Fsa2VyQG5vdmVsbC5jb20+LCBTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gY29udHJvbCBlbmdpbmVzIHRocm91Z2ggY29udHJvbCBuYW1lcyBidXQgd2l0aAogICAgIGFyYml0cmFyeSBhcmd1bWVudHMgaW5zdGVhZCBvZiBqdXN0IGEgc3RyaW5nLgogICAgIENoYW5nZSB0aGUga2V5IGxvYWRlcnMgdG8gdGFrZSBhIFVJX01FVEhPRCBpbnN0ZWFkIG9mIGEgY2FsbGJhY2sKICAgICBmdW5jdGlvbiBwb2ludGVyLiAgTk9URTogdGhpcyBicmVha3MgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyCiAgICAgdmVyc2lvbnMgb2YgT3BlblNTTCBbZW5naW5lXS4KICAgICBBZGFwdCB0aGUgbkNpcGhlciBjb2RlIGZvciB0aGVzZSBuZXcgY29uZGl0aW9ucyBhbmQgYWRkIGEgY2FyZCBpbnNlcnRpb24KICAgICBjYWxsYmFjay4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBFbmhhbmNlIHRoZSBnZW5lcmFsIHVzZXIgaW50ZXJmYWNlIHdpdGggbWVjaGFuaXNtcyB0byBiZXR0ZXIgc3VwcG9ydAogICAgIGRpYWxvZyBib3ggaW50ZXJmYWNlcywgYXBwbGljYXRpb24tZGVmaW5lZCBwcm9tcHRzLCB0aGUgcG9zc2liaWxpdHkKICAgICB0byB1c2UgZGVmYXVsdHMgKGZvciBleGFtcGxlIGRlZmF1bHQgcGFzc3dvcmRzIGZyb20gc29tZXdoZXJlIGVsc2UpCiAgICAgYW5kIGludGVycnVwdHMvY2FuY2VsbGF0aW9ucy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUaWR5IHVwIFBLQ1MjMTIgYXR0cmlidXRlIGhhbmRsaW5nLiBBZGQgc3VwcG9ydCBmb3IgdGhlIENTUCBuYW1lCiAgICAgYXR0cmlidXRlIGluIFBLQ1MjMTIgZmlsZXMsIGFkZCBuZXcgLUNTUCBvcHRpb24gdG8gcGtjczEyIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGEgbWVtb3J5IGxlYWsgaW4gJ3NrX2R1cCgpJyBpbiB0aGUgY2FzZSByZWFsbG9jYXRpb24gZmFpbHMuIChBbHNvCiAgICAgdGlkeSB1cCBzb21lIHVubmVjZXNzYXJpbHkgd2VpcmQgY29kZSBpbiAnc2tfbmV3KCknKS4KICAgICBbR2VvZmYsIHJlcG9ydGVkIGJ5IERpZWdvIFRhcnRhcmEgPGR0YXJ0YXJhQG5vdmFtZW5zLmNvbT5dCgogICopIENoYW5nZSB0aGUga2V5IGxvYWRpbmcgcm91dGluZXMgZm9yIEVOR0lORXMgdG8gdXNlIHRoZSBzYW1lIGtpbmQKICAgICBjYWxsYmFjayAocGVtX3Bhc3N3b3JkX2NiKSBhcyBhbGwgb3RoZXIgcm91dGluZXMgdGhhdCBuZWVkIHRoaXMKICAgICBraW5kIG9mIGNhbGxiYWNrLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluY3JlYXNlIEVOVFJPUFlfTkVFREVEIHRvIDMyIGJ5dGVzLCBhcyBSaWpuZGFlbCBjYW4gb3BlcmF0ZSB3aXRoCiAgICAgMjU2IGJpdCAoPTMyIGJ5dGUpIGtleXMuIE9mIGNvdXJzZSBzZWVkaW5nIHdpdGggbW9yZSBlbnRyb3B5IGJ5dGVzCiAgICAgdGhhbiB0aGlzIG1pbmltdW0gdmFsdWUgaXMgcmVjb21tZW5kZWQuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIE5ldyByYW5kb20gc2VlZGVyIGZvciBPcGVuVk1TLCB1c2luZyB0aGUgc3lzdGVtIHByb2Nlc3Mgc3RhdGlzdGljcwogICAgIHRoYXQgYXJlIGVhc2lseSByZWFjaGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgV2luZG93cyBhcHBhcmVudGx5IGNhbid0IHRyYW5zcGFyZW50bHkgaGFuZGxlIGdsb2JhbAogICAgIHZhcmlhYmxlcyBkZWZpbmVkIGluIERMTHMuIEluaXRpYWxpc2F0aW9ucyBzdWNoIGFzOgoKICAgICAgICBjb25zdCBBU04xX0lURU0gKml0ID0gJkFTTjFfSU5URUdFUl9pdDsKCiAgICAgd29udCBjb21waWxlLiBUaGlzIGlzIHVzZWQgYnkgdGhlIGFueSBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvCiAgICAgZGVjbGFyZSB0aGVpciBvd24gQVNOMSBtb2R1bGVzLiBUaGlzIHdhcyBmaXhlZCBieSBhZGRpbmcgdGhlIG9wdGlvbgogICAgIEVYUE9SVF9WQVJfQVNfRk4gdG8gYWxsIFdpbjMyIHBsYXRmb3JtcywgYWx0aG91Z2ggdGhpcyBpc24ndCBzdHJpY3RseQogICAgIG5lZWRlZCBmb3Igc3RhdGljIGxpYnJhcmllcyB1bmRlciBXaW4zMi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIFg1MDlfUFVSUE9TRV9zZXQoKSBhbmQgWDUwOV9UUlVTVF9zZXQoKSB0byBoYW5kbGUKICAgICBzZXR0aW5nIG9mIHB1cnBvc2UgYW5kIHRydXN0IGZpZWxkcy4gTmV3IFg1MDlfU1RPUkUgdHJ1c3QgYW5kCiAgICAgcHVycG9zZSBmdW5jdGlvbnMgYW5kIHRpZHkgdXAgc2V0dGluZyBpbiBvdGhlciBTU0wgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjb3BpZXMgb2YgWDUwOV9TVE9SRV9DVFggZmllbGRzIGFuZCBjYWxsYmFja3MgdG8gWDUwOV9TVE9SRQogICAgIHN0cnVjdHVyZS4gVGhlc2UgYXJlIGluaGVyaXRlZCBieSBYNTA5X1NUT1JFX0NUWCB3aGVuIGl0IGlzIAogICAgIGluaXRpYWxpc2VkLiBUaGlzIGFsbG93cyB2YXJpb3VzIGRlZmF1bHRzIHRvIGJlIHNldCBpbiB0aGUKICAgICBYNTA5X1NUT1JFIHN0cnVjdHVyZSAoc3VjaCBhcyBmbGFncyBmb3IgQ1JMIGNoZWNraW5nIGFuZCBjdXN0b20KICAgICBwdXJwb3NlIG9yIHRydXN0IHNldHRpbmdzKSBmb3IgZnVuY3Rpb25zIHdoaWNoIG9ubHkgdXNlIFg1MDlfU1RPUkVfQ1RYCiAgICAgaW50ZXJuYWxseSBzdWNoIGFzIFMvTUlNRS4KCiAgICAgTW9kaWZ5IFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdCgpIHNvIGl0IG9ubHkgc2V0cyBwdXJwb3NlcyBhbmQKICAgICB0cnVzdCBzZXR0aW5ncyBpZiB0aGV5IGFyZSBub3Qgc2V0IGluIFg1MDlfU1RPUkUuIFRoaXMgYWxsb3dzIFg1MDlfU1RPUkUKICAgICBwdXJwb3NlcyBhbmQgdHJ1c3QgKGluIFMvTUlNRSBmb3IgZXhhbXBsZSkgdG8gb3ZlcnJpZGUgYW55IHNldCBieSBkZWZhdWx0LgoKICAgICBBZGQgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIENSTCBjaGVja2luZyB0byBzbWltZSwgc19jbGllbnQgYW5kIHNfc2VydmVyCiAgICAgYXBwbGljYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgQ1JMIGJhc2VkIHJldm9jYXRpb24gY2hlY2tpbmcuIElmIHRoZSBDUkwgY2hlY2tpbmcgZmxhZyhzKQogICAgIGFyZSBzZXQgdGhlbiB0aGUgQ1JMIGlzIGxvb2tlZCB1cCBpbiB0aGUgWDUwOV9TVE9SRSBzdHJ1Y3R1cmUgYW5kCiAgICAgaXRzIHZhbGlkaXR5IGFuZCBzaWduYXR1cmUgY2hlY2tlZCwgdGhlbiBpZiB0aGUgY2VydGlmaWNhdGUgaXMgZm91bmQKICAgICBpbiB0aGUgQ1JMIHRoZSB2ZXJpZnkgZmFpbHMgd2l0aCBhIHJldm9rZWQgZXJyb3IuCgogICAgIFZhcmlvdXMgbmV3IENSTCByZWxhdGVkIGNhbGxiYWNrcyBhZGRlZCB0byBYNTA5X1NUT1JFX0NUWCBzdHJ1Y3R1cmUuCgogICAgIENvbW1hbmQgbGluZSBvcHRpb25zIGFkZGVkIHRvICd2ZXJpZnknIGFwcGxpY2F0aW9uIHRvIHN1cHBvcnQgdGhpcy4KCiAgICAgVGhpcyBuZWVkcyBzb21lIGFkZGl0aW9uYWwgd29yaywgc3VjaCBhcyBiZWluZyBhYmxlIHRvIGhhbmRsZSBtdWx0aXBsZQogICAgIENSTHMgd2l0aCBkaWZmZXJlbnQgdGltZXMsIGV4dGVuc2lvbiBiYXNlZCBsb29rdXAgKHJhdGhlciB0aGFuIGp1c3QKICAgICBieSBzdWJqZWN0IG5hbWUpIGFuZCB1bHRpbWF0ZWx5IG1vcmUgY29tcGxldGUgVjIgQ1JMIGV4dGVuc2lvbgogICAgIGhhbmRsaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGdlbmVyYWwgdXNlciBpbnRlcmZhY2UgQVBJIChjcnlwdG8vdWkvKS4gIFRoaXMgaXMgZGVzaWduZWQKICAgICB0byByZXBsYWNlIHRoaW5ncyBsaWtlIGRlc19yZWFkX3Bhc3N3b3JkIGFuZCBmcmllbmRzIChiYWNrd2FyZAogICAgIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zIHVzaW5nIHRoaXMgbmV3IEFQSSBhcmUgcHJvdmlkZWQpLgogICAgIFRoZSBwdXJwb3NlIGlzIHRvIHJlbW92ZSBwcm9tcHRpbmcgZnVuY3Rpb25zIGZyb20gdGhlIERFUyBjb2RlCiAgICAgc2VjdGlvbiBhcyB3ZWxsIGFzIHByb3ZpZGUgZm9yIHByb21wdGluZyB0aHJvdWdoIGRpYWxvZyBib3hlcyBpbgogICAgIGEgd2luZG93IHN5c3RlbSBhbmQgdGhlIGxpa2UuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkICJleF9kYXRhIiBzdXBwb3J0IHRvIEVOR0lORSBzbyBpbXBsZW1lbnRhdGlvbnMgY2FuIGFkZCBzdGF0ZSBhdCBhCiAgICAgcGVyLXN0cnVjdHVyZSBsZXZlbCByYXRoZXIgdGhhbiBoYXZpbmcgdG8gc3RvcmUgaXQgZ2xvYmFsbHkuCiAgICAgW0dlb2ZmXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIGZvciBFTkdJTkUgc3RydWN0dXJlcyB0byBiZSBjb3BpZWQgd2hlbiByZXRyaWV2ZWQgYnkKICAgICBFTkdJTkVfYnlfaWQoKSBpZiB0aGUgRU5HSU5FIHNwZWNpZmllcyBhIG5ldyBmbGFnOiBFTkdJTkVfRkxBR1NfQllfSURfQ09QWS4KICAgICBUaGlzIGNhdXNlcyB0aGUgIm9yaWdpbmFsIiBFTkdJTkUgc3RydWN0dXJlIHRvIGFjdCBsaWtlIGEgdGVtcGxhdGUsCiAgICAgYW5hbG9nb3VzIHRvIHRoZSBSU0EgdnMuIFJTQV9NRVRIT0QgdHlwZSBvZiBzZXBhcmF0aW9uLiBCZWNhdXNlIG9mIHRoaXMKICAgICBvcGVyYXRpb25hbCBzdGF0ZSBjYW4gYmUgbG9jYWxpc2VkIHRvIGVhY2ggRU5HSU5FIHN0cnVjdHVyZSwgZGVzcGl0ZSB0aGUKICAgICBmYWN0IHRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lICJtZXRob2RzIi4gTmV3IEVOR0lORSBzdHJ1Y3R1cmVzIHJldHVybmVkIGluCiAgICAgdGhpcyBjYXNlIGhhdmUgbm8gZnVuY3Rpb25hbCByZWZlcmVuY2VzIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzaW5nbGUKICAgICBzdHJ1Y3R1cmFsIHJlZmVyZW5jZS4gVGhpcyBtYXRjaGVzIHRoZSBzaW5nbGUgc3RydWN0dXJhbCByZWZlcmVuY2UgcmV0dXJuZWQKICAgICBieSBFTkdJTkVfYnlfaWQoKSBub3JtYWxseSwgd2hlbiBpdCBpcyBpbmNyZW1lbnRlZCBvbiB0aGUgcHJlLWV4aXN0aW5nCiAgICAgRU5HSU5FIHN0cnVjdHVyZS4KICAgICBbR2VvZmZdCgogICopIEZpeCBBU04xIGRlY29kZXIgd2hlbiBkZWNvZGluZyB0eXBlIEFOWSBhbmQgVl9BU04xX09USEVSOiBzaW5jZSB0aGlzCiAgICAgbmVlZHMgdG8gbWF0Y2ggYW55IG90aGVyIHR5cGUgYXQgYWxsIHdlIG5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdGhlCiAgICAgdGFnIGNhY2hlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZXMgdG8gdGhlICJvcGVuc3NsIGVuZ2luZSIgdXRpbGl0eSB0byBpbmNsdWRlOwogICAgIC0gdmVyYm9zaXR5IGxldmVscyAoJy12JywgJy12dicsIGFuZCAnLXZ2dicpIHRoYXQgcHJvdmlkZSBpbmZvcm1hdGlvbgogICAgICAgYWJvdXQgYW4gRU5HSU5FJ3MgYXZhaWxhYmxlIGNvbnRyb2wgY29tbWFuZHMuCiAgICAgLSBleGVjdXRpbmcgY29udHJvbCBjb21tYW5kcyBmcm9tIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdXNpbmcgdGhlCiAgICAgICAnLXByZScgYW5kICctcG9zdCcgc3dpdGNoZXMuICctcG9zdCcgaXMgb25seSB1c2VkIGlmICctdCcgaXMKICAgICAgIHNwZWNpZmllZCBhbmQgdGhlIEVOR0lORSBpcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGlzZWQuIFRoZSBzeW50YXggZm9yCiAgICAgICB0aGUgaW5kaXZpZHVhbCBjb21tYW5kcyBhcmUgY29sb24tc2VwYXJhdGVkLCBmb3IgZXhhbXBsZTsKCSBvcGVuc3NsIGVuZ2luZSBjaGlsIC1wcmUgRk9SS19DSEVDSzowIC1wcmUgU09fUEFUSDovbGliL3Rlc3Quc28KICAgICBbR2VvZmZdCgogICopIE5ldyBkeW5hbWljIGNvbnRyb2wgY29tbWFuZCBzdXBwb3J0IGZvciBFTkdJTkVzLiBFTkdJTkVzIGNhbiBub3cKICAgICBkZWNsYXJlIHRoZWlyIG93biBjb21tYW5kcyAobnVtYmVycyksIG5hbWVzIChzdHJpbmdzKSwgZGVzY3JpcHRpb25zLAogICAgIGFuZCBpbnB1dCB0eXBlcyBmb3IgcnVuLXRpbWUgZGlzY292ZXJ5IGJ5IGNhbGxpbmcgYXBwbGljYXRpb25zLiBBCiAgICAgc3Vic2V0IG9mIHRoZXNlIGNvbW1hbmRzIGFyZSBpbXBsaWNpdGx5IGNsYXNzZWQgYXMgImV4ZWN1dGFibGUiCiAgICAgZGVwZW5kaW5nIG9uIHRoZWlyIGlucHV0IHR5cGUsIGFuZCBvbmx5IHRoZXNlIGNhbiBiZSBpbnZva2VkIHRocm91Z2gKICAgICB0aGUgbmV3IHN0cmluZy1iYXNlZCBBUEkgZnVuY3Rpb24gRU5HSU5FX2N0cmxfY21kX3N0cmluZygpLiAoRWcuIHRoaXMKICAgICBjYW4gYmUgYmFzZWQgb24gdXNlciBpbnB1dCwgY29uZmlnIGZpbGVzLCBldGMpLiBUaGUgZGlzdGluY3Rpb24gaXMKICAgICB0aGF0ICJleGVjdXRhYmxlIiBjb21tYW5kcyBjYW5ub3QgcmV0dXJuIGFueXRoaW5nIG90aGVyIHRoYW4gYSBib29sZWFuCiAgICAgcmVzdWx0IGFuZCBjYW4gb25seSBzdXBwb3J0IG51bWVyaWMgb3Igc3RyaW5nIGlucHV0LCB3aGVyZWFzIHNvbWUKICAgICBkaXNjb3ZlcmFibGUgY29tbWFuZHMgbWF5IG9ubHkgYmUgZm9yIGRpcmVjdCB1c2UgdGhyb3VnaAogICAgIEVOR0lORV9jdHJsKCksIGVnLiBzdXBwb3J0aW5nIHRoZSBleGNoYW5nZSBvZiBiaW5hcnkgZGF0YSwgZnVuY3Rpb24KICAgICBwb2ludGVycywgb3Igb3RoZXIgY3VzdG9tIHVzZXMuIFRoZSAiZXhlY3V0YWJsZSIgY29tbWFuZHMgYXJlIHRvCiAgICAgc3VwcG9ydCBwYXJhbWV0ZXJpc2F0aW9ucyBvZiBFTkdJTkUgYmVoYXZpb3VyIHRoYXQgY2FuIGJlCiAgICAgdW5hbWJpZ3VvdXNseSBkZWZpbmVkIGJ5IEVOR0lORXMgYW5kIHVzZWQgY29uc2lzdGVudGx5IGFjcm9zcyBhbnkKICAgICBPcGVuU1NMLWJhc2VkIGFwcGxpY2F0aW9uLiBDb21tYW5kcyBoYXZlIGJlZW4gYWRkZWQgdG8gYWxsIHRoZQogICAgIGV4aXN0aW5nIGhhcmR3YXJlLXN1cHBvcnRpbmcgRU5HSU5Fcywgbm90aWNlYWJseSAiU09fUEFUSCIgdG8gYWxsb3cKICAgICBjb250cm9sIG92ZXIgc2hhcmVkLWxpYnJhcnkgcGF0aHMgd2l0aG91dCBzb3VyY2UgY29kZSBhbHRlcmF0aW9ucy4KICAgICBbR2VvZmZdCgogICopIENoYW5nZWQgYWxsIEVOR0lORSBpbXBsZW1lbnRhdGlvbnMgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgdGhlaXIKICAgICBFTkdJTkVzIHJhdGhlciB0aGFuIGRlY2xhcmluZyB0aGVtIHN0YXRpY2FsbHkuIEFwYXJ0IGZyb20gdGhpcyBiZWluZwogICAgIG5lY2Vzc2FyeSB3aXRoIHRoZSByZW1vdmFsIG9mIHRoZSBFTkdJTkVfRkxBR1NfTUFMTE9DRUQgZGlzdGluY3Rpb24sCiAgICAgdGhpcyBhbHNvIGFsbG93cyB0aGUgaW1wbGVtZW50YXRpb25zIHRvIGNvbXBpbGUgd2l0aG91dCB1c2luZyB0aGUKICAgICBpbnRlcm5hbCBlbmdpbmVfaW50LmggaGVhZGVyLgogICAgIFtHZW9mZl0KCiAgKikgTWlub3IgYWRqdXN0bWVudCB0byAicmFuZCIgY29kZS4gUkFORF9nZXRfcmFuZF9tZXRob2QoKSBub3cgcmV0dXJucyBhCiAgICAgJ2NvbnN0JyB2YWx1ZS4gQW55IGNvZGUgdGhhdCBzaG91bGQgYmUgYWJsZSB0byBtb2RpZnkgYSBSQU5EX01FVEhPRAogICAgIHNob3VsZCBhbHJlYWR5IGhhdmUgbm9uLWNvbnN0IHBvaW50ZXJzIHRvIGl0IChpZS4gdGhleSBzaG91bGQgb25seQogICAgIG1vZGlmeSB0aGVpciBvd24gb25lcykuCiAgICAgW0dlb2ZmXQoKICAqKSBNYWRlIGEgdmFyaWV0eSBvZiBsaXR0bGUgdHdlYWtzIHRvIHRoZSBFTkdJTkUgY29kZS4KICAgICAtICJhdGFsbGEiIGFuZCAidWJzZWMiIHN0cmluZyBkZWZpbml0aW9ucyB3ZXJlIG1vdmVkIGZyb20gaGVhZGVyIGZpbGVzCiAgICAgICB0byBDIGNvZGUuICJudXJvbiIgc3RyaW5nIGRlZmluaXRpb25zIHdlcmUgcGxhY2VkIGluIHZhcmlhYmxlcwogICAgICAgcmF0aGVyIHRoYW4gaGFyZC1jb2RlZCAtIGFsbG93aW5nIHBhcmFtZXRlcmlzYXRpb24gb2YgdGhlc2UgdmFsdWVzCiAgICAgICBsYXRlciBvbiB2aWEgY3RybCgpIGNvbW1hbmRzLgogICAgIC0gUmVtb3ZlZCB1bnVzZWQgIiNpZiAwIidkIGNvZGUuCiAgICAgLSBGaXhlZCBlbmdpbmUgbGlzdCBpdGVyYXRpb24gY29kZSBzbyBpdCB1c2VzIEVOR0lORV9mcmVlKCkgdG8gcmVsZWFzZQogICAgICAgc3RydWN0dXJhbCByZWZlcmVuY2VzLgogICAgIC0gQ29uc3RpZmllZCB0aGUgUkFORF9NRVRIT0QgZWxlbWVudCBvZiBFTkdJTkUgc3RydWN0dXJlcy4KICAgICAtIENvbnN0aWZpZWQgdmFyaW91cyBnZXQvc2V0IGZ1bmN0aW9ucyBhcyBhcHByb3ByaWF0ZSBhbmQgYWRkZWQKICAgICAgIG1pc3NpbmcgZnVuY3Rpb25zIChpbmNsdWRpbmcgYSBjYXRjaC1hbGwgRU5HSU5FX2NweSB0aGF0IGR1cGxpY2F0ZXMKICAgICAgIGFsbCBFTkdJTkUgdmFsdWVzIG9udG8gYSBuZXcgRU5HSU5FIGV4Y2VwdCByZWZlcmVuY2UgY291bnRzL3N0YXRlKS4KICAgICAtIFJlbW92ZWQgTlVMTCBwYXJhbWV0ZXIgY2hlY2tzIGluIGdldC9zZXQgZnVuY3Rpb25zLiBTZXR0aW5nIGEgbWV0aG9kCiAgICAgICBvciBmdW5jdGlvbiB0byBOVUxMIGlzIGEgd2F5IG9mIGNhbmNlbGxpbmcgb3V0IGEgcHJldmlvdXNseSBzZXQKICAgICAgIHZhbHVlLiAgUGFzc2luZyBhIE5VTEwgRU5HSU5FIHBhcmFtZXRlciBpcyBqdXN0IHBsYWluIHN0dXBpZCBhbnl3YXkKICAgICAgIGFuZCBkb2Vzbid0IGp1c3RpZnkgdGhlIGV4dHJhIGVycm9yIHN5bWJvbHMgYW5kIGNvZGUuCiAgICAgLSBEZXByZWNhdGUgdGhlIEVOR0lORV9GTEFHU19NQUxMT0NFRCBkZWZpbmUgYW5kIG1vdmUgdGhlIGFyZWEgZm9yCiAgICAgICBmbGFncyBmcm9tIGVuZ2luZV9pbnQuaCB0byBlbmdpbmUuaC4KICAgICAtIENoYW5nZWQgcHJvdG90eXBlcyBmb3IgRU5HSU5FIGhhbmRsZXIgZnVuY3Rpb25zIChpbml0KCksIGZpbmlzaCgpLAogICAgICAgY3RybCgpLCBrZXktbG9hZCBmdW5jdGlvbnMsIGV0YykgdG8gdGFrZSBhbiAoRU5HSU5FKikgcGFyYW1ldGVyLgogICAgIFtHZW9mZl0KCiAgKikgSW1wbGVtZW50IGJpbmFyeSBpbnZlcnNpb24gYWxnb3JpdGhtIGZvciBCTl9tb2RfaW52ZXJzZSBpbiBhZGRpdGlvbgogICAgIHRvIHRoZSBhbGdvcml0aG0gdXNpbmcgbG9uZyBkaXZpc2lvbi4gIFRoZSBiaW5hcnkgYWxnb3JpdGhtIGNhbiBiZQogICAgIHVzZWQgb25seSBpZiB0aGUgbW9kdWx1cyBpcyBvZGQuICBPbiAzMi1iaXQgc3lzdGVtcywgaXQgaXMgZmFzdGVyCiAgICAgb25seSBmb3IgcmVsYXRpdmVseSBzbWFsbCBtb2R1bGkgKHJvdWdobHkgMjAtMzAlIGZvciAxMjgtYml0IG1vZHVsaSwKICAgICByb3VnaGx5IDUtMTUlIGZvciAyNTYtYml0IG1vZHVsaSksIHNvIHdlIHVzZSBpdCBvbmx5IGZvciBtb2R1bGkKICAgICB1cCB0byA0NTAgYml0cy4gIEluIDY0LWJpdCBlbnZpcm9ubWVudHMsIHRoZSBiaW5hcnkgYWxnb3JpdGhtCiAgICAgYXBwZWFycyB0byBiZSBhZHZhbnRhZ2VvdXMgZm9yIG11Y2ggbG9uZ2VyIG1vZHVsaTsgaGVyZSB3ZSB1c2UgaXQKICAgICBmb3IgbW9kdWxpIHVwIHRvIDIwNDggYml0cy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXdyaXRlIENIT0lDRSBmaWVsZCBzZXR0aW5nIGluIEFTTjFfaXRlbV9leF9kMmkoKS4gVGhlIG9sZCBjb2RlCiAgICAgY291bGQgbm90IHN1cHBvcnQgdGhlIGNvbWJpbmUgZmxhZyBpbiBjaG9pY2UgZmllbGRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhICdjb3B5X2V4dGVuc2lvbnMnIG9wdGlvbiB0byB0aGUgJ2NhJyB1dGlsaXR5LiBUaGlzIGNvcGllcwogICAgIGV4dGVuc2lvbnMgZnJvbSBhIGNlcnRpZmljYXRlIHJlcXVlc3QgdG8gdGhlIGNlcnRpZmljYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IG11bHRpcGxlICdjZXJ0b3B0JyBhbmQgJ25hbWVvcHQnIG9wdGlvbnMgdG8gYmUgc2VwYXJhdGVkCiAgICAgYnkgY29tbWFzLiBBZGQgJ25hbW9wdCcgYW5kICdjZXJ0b3B0JyBvcHRpb25zIHRvIHRoZSAnY2EnIGNvbmZpZwogICAgIGZpbGU6IHRoaXMgYWxsb3dzIHRoZSBkaXNwbGF5IG9mIHRoZSBjZXJ0aWZpY2F0ZSBhYm91dCB0byBiZQogICAgIHNpZ25lZCB0byBiZSBjdXN0b21pc2VkLCB0byBhbGxvdyBjZXJ0YWluIGZpZWxkcyB0byBiZSBpbmNsdWRlZAogICAgIG9yIGV4Y2x1ZGVkIGFuZCBleHRlbnNpb24gZGV0YWlscy4gVGhlIG9sZCBzeXN0ZW0gZGlkbid0IGRpc3BsYXkKICAgICBtdWx0aWNoYXJhY3RlciBzdHJpbmdzIHByb3Blcmx5LCBvbWl0dGVkIGZpZWxkcyBub3QgaW4gdGhlIHBvbGljeQogICAgIGFuZCBjb3VsZG4ndCBkaXNwbGF5IGFkZGl0aW9uYWwgZGV0YWlscyBzdWNoIGFzIGV4dGVuc2lvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRnVuY3Rpb24gRUNfUE9JTlRzX211bCBmb3IgbXVsdGlwbGUgc2NhbGFyIG11bHRpcGxpY2F0aW9uCiAgICAgb2YgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBlbGxpcHRpYyBjdXJ2ZSBwb2ludHMKICAgICAgICAgIFxzdW0gc2NhbGFyc1tpXSpwb2ludHNbaV0sCiAgICAgb3B0aW9uYWxseSBpbmNsdWRpbmcgdGhlIGdlbmVyYXRvciBkZWZpbmVkIGZvciB0aGUgRUNfR1JPVVA6CiAgICAgICAgICBzY2FsYXIqZ2VuZXJhdG9yICsgIFxzdW0gc2NhbGFyc1tpXSpwb2ludHNbaV0uCgogICAgIEVDX1BPSU5UX211bCBpcyBhIHNpbXBsZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGUgdHlwaWNhbCBjYXNlCiAgICAgdGhhdCB0aGUgcG9pbnQgbGlzdCBoYXMganVzdCBvbmUgaXRlbSAoYmVzaWRlcyB0aGUgb3B0aW9uYWwKICAgICBnZW5lcmF0b3IpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpcnN0IEVDX01FVEhPRHMgZm9yIGN1cnZlcyBvdmVyIEdGKHApOgoKICAgICBFQ19HRnBfc2ltcGxlX21ldGhvZCgpIHVzZXMgdGhlIGJhc2ljIEJOX21vZF9tdWwgYW5kIEJOX21vZF9zcXIKICAgICBvcGVyYXRpb25zIGFuZCBwcm92aWRlcyB2YXJpb3VzIG1ldGhvZCBmdW5jdGlvbnMgdGhhdCBjYW4gYWxzbwogICAgIG9wZXJhdGUgd2l0aCBmYXN0ZXIgaW1wbGVtZW50YXRpb25zIG9mIG1vZHVsYXIgYXJpdGhtZXRpYy4gICAgIAoKICAgICBFQ19HRnBfbW9udF9tZXRob2QoKSByZXVzZXMgbW9zdCBmdW5jdGlvbnMgdGhhdCBhcmUgcGFydCBvZgogICAgIEVDX0dGcF9zaW1wbGVfbWV0aG9kLCBidXQgdXNlcyBNb250Z29tZXJ5IGFyaXRobWV0aWMuCgogICAgIFtCb2RvIE1vZWxsZXI7IHBvaW50IGFkZGl0aW9uIGFuZCBwb2ludCBkb3VibGluZwogICAgIGltcGxlbWVudGF0aW9uIGRpcmVjdGx5IGRlcml2ZWQgZnJvbSBzb3VyY2UgY29kZSBwcm92aWRlZCBieQogICAgIExlbmthIEZpYmlrb3ZhIDxmaWJpa292YUBleHAtbWF0aC51bmktZXNzZW4uZGU+XQoKICAqKSBGcmFtZXdvcmsgZm9yIGVsbGlwdGljIGN1cnZlcyAoY3J5cHRvL2VjL2VjLmgsIGNyeXB0by9lYy9lY19sY2wuaCwKICAgICBjcnlwdG8vZWMvZWNfbGliLmMpOgoKICAgICBDdXJ2ZXMgYXJlIEVDX0dST1VQIG9iamVjdHMgKHdpdGggYW4gb3B0aW9uYWwgZ3JvdXAgZ2VuZXJhdG9yKQogICAgIGJhc2VkIG9uIEVDX01FVEhPRHMgdGhhdCBhcmUgYnVpbHQgaW50byB0aGUgbGlicmFyeS4KCiAgICAgUG9pbnRzIGFyZSBFQ19QT0lOVCBvYmplY3RzIGJhc2VkIG9uIEVDX0dST1VQIG9iamVjdHMuCgogICAgIE1vc3Qgb2YgdGhlIGZyYW1ld29yayB3b3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBjdXJ2ZXMgb3ZlciBhcmJpdHJhcnkKICAgICBmaW5pdGUgZmllbGRzLCBidXQgYXMgdGhlcmUgYXJlIG5vIG9idmlvdXMgdHlwZXMgZm9yIGZpZWxkcyBvdGhlcgogICAgIHRoYW4gR0YocCksIHNvbWUgZnVuY3Rpb25zIGFyZSBsaW1pdGVkIHRvIHRoYXQgZm9yIG5vdy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgdGhlIC1IVFRQIG9wdGlvbiB0byBzX3NlcnZlci4gIEl0IGlzIHNpbWlsYXIgdG8gLVdXVywgYnV0IHJlcXVpcmVzCiAgICAgdGhhdCB0aGUgZmlsZSBjb250YWlucyBhIGNvbXBsZXRlIEhUVFAgcmVzcG9uc2UuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBlYyBkaXJlY3RvcnkgdG8gbWtkZWYucGwgYW5kIG1rZmlsZXMucGwuIEluIG1rZGVmLnBsCiAgICAgY2hhbmdlIHRoZSBkZWYgYW5kIG51bSBmaWxlIHByaW50ZiBmb3JtYXQgc3BlY2lmaWVyIGZyb20gIiUtNDBzWFhYIgogICAgIHRvICIlLTM5cyBYWFgiLiBUaGUgbGF0dGVyIHdpbGwgYWx3YXlzIGd1YXJhbnRlZSBhIHNwYWNlIGFmdGVyIHRoZQogICAgIGZpZWxkIHdoaWxlIHRoZSBmb3JtZXIgd2lsbCBjYXVzZSB0aGVtIHRvIHJ1biB0b2dldGhlciBpZiB0aGUgZmllbGQKICAgICBpcyA0MCBvZiBtb3JlIGNoYXJhY3RlcnMgbG9uZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb25zdGlmeSB0aGUgY2lwaGVyIGFuZCBkaWdlc3QgJ21ldGhvZCcgZnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmVzCiAgICAgYW5kIG1vZGlmeSByZWxhdGVkIGZ1bmN0aW9ucyB0byB0YWtlIGNvbnN0YW50IEVWUF9NRCBhbmQgRVZQX0NJUEhFUgogICAgIHBvaW50ZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhpZGUgQk5fQ1RYIHN0cnVjdHVyZSBkZXRhaWxzIGluIGJuX2xjbC5oIGluc3RlYWQgb2YgcHVibGlzaGluZyB0aGVtCiAgICAgaW4gPG9wZW5zc2wvYm4uaD4uICBBbHNvIGZ1cnRoZXIgaW5jcmVhc2UgQk5fQ1RYX05VTSB0byAzMi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNb2RpZnkgRVZQX0RpZ2VzdCooKSByb3V0aW5lcyBzbyB0aGV5IG5vdyByZXR1cm4gdmFsdWVzLiBBbHRob3VnaCB0aGUKICAgICBpbnRlcm5hbCBzb2Z0d2FyZSByb3V0aW5lcyBjYW4gbmV2ZXIgZmFpbCBhZGRpdGlvbmFsIGhhcmR3YXJlIHZlcnNpb25zCiAgICAgbWlnaHQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2xlYW4gdXAgY3J5cHRvL2Vyci9lcnIuaCBhbmQgY2hhbmdlIHNvbWUgZXJyb3IgY29kZXMgdG8gYXZvaWQgY29uZmxpY3RzOgoKICAgICBQcmV2aW91c2x5IEVSUl9SX0ZBVEFMIHdhcyB0b28gc21hbGwgYW5kIGNvaW5jaWRlZCB3aXRoIEVSUl9MSUJfUEtDUzcKICAgICAoPSBFUlJfUl9QS0NTN19MSUIpOyBpdCBpcyBub3cgNjQgaW5zdGVhZCBvZiAzMi4KCiAgICAgQVNOMSBlcnJvciBjb2RlcwogICAgICAgICAgRVJSX1JfTkVTVEVEX0FTTjFfRVJST1IKICAgICAgICAgIC4uLgogICAgICAgICAgRVJSX1JfTUlTU0lOR19BU04xX0VPUwogICAgIHdlcmUgNCAuLiA5LCBjb25mbGljdGluZyB3aXRoCiAgICAgICAgICBFUlJfTElCX1JTQSAoPSBFUlJfUl9SU0FfTElCKQogICAgICAgICAgLi4uCiAgICAgICAgICBFUlJfTElCX1BFTSAoPSBFUlJfUl9QRU1fTElCKS4KICAgICBUaGV5IGFyZSBub3cgNTggLi4gNjMgKGkuZS4sIGp1c3QgYmVsb3cgRVJSX1JfRkFUQUwpLgoKICAgICBBZGQgbmV3IGVycm9yIGNvZGUgJ0VSUl9SX0lOVEVSTkFMX0VSUk9SJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEb24ndCBvdmVydXNlIGxvY2tzIGluIGNyeXB0by9lcnIvZXJyLmM6IEZvciBkYXRhIHJldHJpZXZhbCwgQ1JZUFRPX3JfbG9jawogICAgIHN1ZmZpY2VzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBvcHRpb24gJy1zdWJqIGFyZycgZm9yICdvcGVuc3NsIHJlcScgYW5kICdvcGVuc3NsIGNhJy4gIFRoaXMKICAgICBzZXRzIHRoZSBzdWJqZWN0IG5hbWUgZm9yIGEgbmV3IHJlcXVlc3Qgb3Igc3VwZXJzZWRlcyB0aGUKICAgICBzdWJqZWN0IG5hbWUgaW4gYSBnaXZlbiByZXF1ZXN0LiBGb3JtYXRzIHRoYXQgY2FuIGJlIHBhcnNlZCBhcmUKICAgICAgICAgICdDTj1Tb21lIE5hbWUsIE9VPW15T1UsIEM9SVQnCiAgICAgYW5kCiAgICAgICAgICAnQ049U29tZSBOYW1lL09VPW15T1UvQz1JVCcuCgogICAgIEFkZCBvcHRpb25zICctYmF0Y2gnIGFuZCAnLXZlcmJvc2UnIHRvICdvcGVuc3NsIHJlcScuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGhhY2ttYXN0ZXJzLm5ldD5dCgogICopIEludHJvZHVjZSB0aGUgcG9zc2liaWxpdHkgdG8gYWNjZXNzIGdsb2JhbCB2YXJpYWJsZXMgdGhyb3VnaAogICAgIGZ1bmN0aW9ucyBvbiBwbGF0Zm9ybSB3ZXJlIHRoYXQncyB0aGUgYmVzdCB3YXkgdG8gaGFuZGxlIGV4cG9ydGluZwogICAgIGdsb2JhbCB2YXJpYWJsZXMgaW4gc2hhcmVkIGxpYnJhcmllcy4gIFRvIGVuYWJsZSB0aGlzIGZ1bmN0aW9uYWxpdHksCiAgICAgb25lIG11c3QgY29uZmlndXJlIHdpdGggIkVYUE9SVF9WQVJfQVNfRk4iIG9yIGRlZmluZWQgdGhlIEMgbWFjcm8KICAgICAiT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OIiBpbiBjcnlwdG8vb3BlbnNzbGNvbmYuaCAodGhlIGxhdHRlcgogICAgIGlzIG5vcm1hbGx5IGRvbmUgYnkgQ29uZmlndXJlIG9yIHNvbWV0aGluZyBzaW1pbGFyKS4KCiAgICAgVG8gaW1wbGVtZW50IGEgZ2xvYmFsIHZhcmlhYmxlLCB1c2UgdGhlIG1hY3JvIE9QRU5TU0xfSU1QTEVNRU5UX0dMT0JBTAogICAgIGluIHRoZSBzb3VyY2UgZmlsZSAoZm9vLmMpIGxpa2UgdGhpczoKCglPUEVOU1NMX0lNUExFTUVOVF9HTE9CQUwoaW50LGZvbyk9MTsKCU9QRU5TU0xfSU1QTEVNRU5UX0dMT0JBTChkb3VibGUsYmFyKTsKCiAgICAgVG8gZGVjbGFyZSBhIGdsb2JhbCB2YXJpYWJsZSwgdXNlIHRoZSBtYWNyb3MgT1BFTlNTTF9ERUNMQVJFX0dMT0JBTAogICAgIGFuZCBPUEVOU1NMX0dMT0JBTF9SRUYgaW4gdGhlIGhlYWRlciBmaWxlIChmb28uaCkgbGlrZSB0aGlzOgoKCU9QRU5TU0xfREVDTEFSRV9HTE9CQUwoaW50LGZvbyk7CgkjZGVmaW5lIGZvbyBPUEVOU1NMX0dMT0JBTF9SRUYoZm9vKQoJT1BFTlNTTF9ERUNMQVJFX0dMT0JBTChkb3VibGUsYmFyKTsKCSNkZWZpbmUgYmFyIE9QRU5TU0xfR0xPQkFMX1JFRihiYXIpCgogICAgIFRoZSAjZGVmaW5lcyBhcmUgdmVyeSBpbXBvcnRhbnQsIGFuZCB0aGVyZWZvcmUgc28gaXMgaW5jbHVkaW5nIHRoZQogICAgIGhlYWRlciBmaWxlIGV2ZXJ5d2hlcmUgd2hlcmUgdGhlIGRlZmluZWQgZ2xvYmFscyBhcmUgdXNlZC4KCiAgICAgVGhlIG1hY3JvIE9QRU5TU0xfRVhQT1JUX1ZBUl9BU19GVU5DVElPTiBhbHNvIGFmZmVjdHMgdGhlIGRlZmluaXRpb24KICAgICBvZiBBU04uMSBpdGVtcywgYnV0IHRoYXQgc3RydWN0dXJlIGlzIGEgYml0IGRpZmZlcmVudC4KCiAgICAgVGhlIGxhcmdlc3QgY2hhbmdlIGlzIGluIHV0aWwvbWtkZWYucGwgd2hpY2ggaGFzIGJlZW4gZW5oYW5jZWQgd2l0aAogICAgIGJldHRlciBhbmQgZWFzaWVyIHRvIHVuZGVyc3RhbmQgbG9naWMgdG8gY2hvb3NlIHdoaWNoIHN5bWJvbHMgc2hvdWxkCiAgICAgZ28gaW50byB0aGUgV2luZG93cyAuZGVmIGZpbGVzIGFzIHdlbGwgYXMgYSBudW1iZXIgb2YgZml4ZXMgYW5kIGNvZGUKICAgICBjbGVhbnVwIChhbW9uZyBvdGhlcnMsIGFsZ29yaXRobSBrZXl3b3JkcyBhcmUgbm93IHNvcnRlZAogICAgIGxleGljb2dyYXBoaWNhbGx5IHRvIGF2b2lkIGNvbnN0YW50IHJld3JpdGVzKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbiBCTl9kaXYoKSBrZWVwIGEgY29weSBvZiB0aGUgc2lnbiBvZiAnbnVtJyBiZWZvcmUgd3JpdGluZyB0aGUKICAgICByZXN1bHQgdG8gJ3JtJyBiZWNhdXNlIGlmIHJtPT1udW0gdGhlIHZhbHVlIHdpbGwgYmUgb3ZlcndyaXR0ZW4KICAgICBhbmQgcHJvZHVjZSB0aGUgd3JvbmcgcmVzdWx0IGlmICdudW0nIGlzIG5lZ2F0aXZlOiB0aGlzIGNhdXNlZAogICAgIHByb2JsZW1zIHdpdGggQk5fbW9kKCkgYW5kIEJOX25ubW9kKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRnVuY3Rpb24gT0NTUF9yZXF1ZXN0X3ZlcmlmeSgpLiBUaGlzIGNoZWNrcyB0aGUgc2lnbmF0dXJlIG9uIGFuCiAgICAgT0NTUCByZXF1ZXN0IGFuZCB2ZXJpZmllcyB0aGUgc2lnbmVyIGNlcnRpZmljYXRlLiBUaGUgc2lnbmVyCiAgICAgY2VydGlmaWNhdGUgaXMganVzdCBjaGVja2VkIGZvciBhIGdlbmVyaWMgcHVycG9zZSBhbmQgT0NTUCByZXF1ZXN0CiAgICAgdHJ1c3Qgc2V0dGluZ3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIE9DU1BfY2hlY2tfdmFsaWRpdHkoKSBmdW5jdGlvbiB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgT0NTUAogICAgIHJlc3BvbnNlcy4gT0NTUCByZXNwb25zZXMgYXJlIHByZXBhcmVkIGluIHJlYWwgdGltZSBhbmQgbWF5IG9ubHkKICAgICBiZSBhIGZldyBzZWNvbmRzIG9sZC4gU2ltcGx5IGNoZWNraW5nIHRoYXQgdGhlIGN1cnJlbnQgdGltZSBsaWVzCiAgICAgYmV0d2VlbiB0aGlzVXBkYXRlIGFuZCBuZXh0VXBkYXRlIG1heCByZWplY3Qgb3RoZXJ3aXNlIHZhbGlkIHJlc3BvbnNlcwogICAgIGNhdXNlZCBieSBlaXRoZXIgT0NTUCByZXNwb25kZXIgb3IgY2xpZW50IGNsb2NrIGluYWNjdXJhY3kuIEluc3RlYWQKICAgICB3ZSBhbGxvdyB0aGlzVXBkYXRlIGFuZCBuZXh0VXBkYXRlIHRvIGZhbGwgd2l0aGluIGEgY2VydGFpbiBwZXJpb2Qgb2YKICAgICB0aGUgY3VycmVudCB0aW1lLiBUaGUgYWdlIG9mIHRoZSByZXNwb25zZSBjYW4gYWxzbyBvcHRpb25hbGx5IGJlCiAgICAgY2hlY2tlZC4gVHdvIG5ldyBvcHRpb25zIC12YWxpZGl0eV9wZXJpb2QgYW5kIC1zdGF0dXNfYWdlIGFkZGVkIHRvCiAgICAgb2NzcCB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIElmIHNpZ25hdHVyZSBvciBwdWJsaWMga2V5IGFsZ29yaXRobSBpcyB1bnJlY29nbml6ZWQgcHJpbnQgb3V0IGl0cwogICAgIE9JRCByYXRoZXIgdGhhdCBqdXN0IFVOS05PV04uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIE9DU1BfY2VydF90b19pZCgpIHRvIHRvbGVyYXRlIGEgTlVMTCBzdWJqZWN0IGNlcnRpZmljYXRlIGFuZAogICAgIE9DU1BfY2VydF9pZF9uZXcoKSBhIE5VTEwgc2VyaWFsTnVtYmVyLiBUaGlzIGFsbG93cyBhIHBhcnRpYWwgY2VydGlmaWNhdGUKICAgICBJRCB0byBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgaXNzdWVyIGNlcnRpZmljYXRlIGFsb25lIHdoaWNoIGNhbiB0aGVuIGJlCiAgICAgcGFzc2VkIHRvIE9DU1BfaWRfaXNzdWVyX2NtcCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBjb21waWxhdGlvbiBvcHRpb24gQVNOMV9JVEVNX0ZVTkNUSU9OUy4gVGhpcyBjYXVzZXMgdGhlIG5ldwogICAgIEFTTjEgbW9kdWxlcyB0byBleHBvcnQgZnVuY3Rpb25zIHJldHVybmluZyBBU04xX0lURU0gcG9pbnRlcnMKICAgICBpbnN0ZWFkIG9mIHRoZSBBU04xX0lURU0gc3RydWN0dXJlcyB0aGVtc2VsdmVzLiBUaGlzIGFkZHMgc2V2ZXJhbAogICAgIG5ldyBtYWNyb3Mgd2hpY2ggYWxsb3cgdGhlIHVuZGVybHlpbmcgQVNOMSBmdW5jdGlvbi9zdHJ1Y3R1cmUgdG8KICAgICBiZSBhY2Nlc3NlZCB0cmFuc3BhcmVudGx5LiBBcyBhIHJlc3VsdCBjb2RlIHNob3VsZCBub3QgdXNlIEFTTjFfSVRFTQogICAgIHJlZmVyZW5jZXMgZGlyZWN0bHkgKHN1Y2ggYXMgJlg1MDlfaXQpIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgcmVsZXZhbnQKICAgICBtYWNyb3MgKHN1Y2ggYXMgQVNOMV9JVEVNX3JwdHIoWDUwOSkpLiBUaGlzIG9wdGlvbiBpcyB0byBhbGxvdwogICAgIHVzZSBvZiB0aGUgbmV3IEFTTjEgY29kZSBvbiBwbGF0Zm9ybXMgd2hlcmUgZXhwb3J0aW5nIHN0cnVjdHVyZXMKICAgICBpcyBwcm9ibGVtYXRpY2FsIChmb3IgZXhhbXBsZSBpbiBzaGFyZWQgbGlicmFyaWVzKSBidXQgZXhwb3J0aW5nCiAgICAgZnVuY3Rpb25zIHJldHVybmluZyBwb2ludGVycyB0byBzdHJ1Y3R1cmVzIGlzIG5vdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igb3ZlcnJpZGluZyB0aGUgZ2VuZXJhdGlvbiBvZiBTU0wvVExTIHNlc3Npb24gSURzLgogICAgIFRoZXNlIGNhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZCBlaXRoZXIgaW4gYW4gU1NMX0NUWCBvciBwZXIgU1NMLgogICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIGNvbnRyb2wsIGlmIHRoZXkgd2lzaCwKICAgICB0aGUgYXJiaXRyYXJ5IHZhbHVlcyBjaG9zZW4gZm9yIHVzZSBhcyBzZXNzaW9uIElEcywgcGFydGljdWxhcmx5IGFzIGl0CiAgICAgY2FuIGJlIHVzZWZ1bCBmb3Igc2Vzc2lvbiBjYWNoaW5nIGluIG11bHRpcGxlLXNlcnZlciBlbnZpcm9ubWVudHMuIEEKICAgICBjb21tYW5kLWxpbmUgc3dpdGNoIGZvciB0ZXN0aW5nIHRoaXMgKGFuZCBhbnkgY2xpZW50IGNvZGUgdGhhdCB3aXNoZXMKICAgICB0byB1c2Ugc3VjaCBhIGZlYXR1cmUpIGhhcyBiZWVuIGFkZGVkIHRvICJzX3NlcnZlciIuCiAgICAgW0dlb2ZmIFRob3JwZSwgTHV0eiBKYWVuaWNrZV0KCiAgKikgTW9kaWZ5IG1rZGVmLnBsIHRvIHJlY29nbmlzZSBhbmQgcGFyc2UgcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscwogICAgIG9mIHRoZSBmb3JtICcjaWYgZGVmaW5lZCguLi4pIHx8IGRlZmluZWQoLi4uKSB8fCAuLi4nIGFuZAogICAgICcjaWYgIWRlZmluZWQoLi4uKSAmJiAhZGVmaW5lZCguLi4pICYmIC4uLicuICBUaGlzIGFsc28gYXZvaWRzCiAgICAgdGhlIGdyb3dpbmcgbnVtYmVyIG9mIHNwZWNpYWwgY2FzZXMgaXQgd2FzIHByZXZpb3VzbHkgaGFuZGxpbmcuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBhbGwgY29uZmlndXJhdGlvbiBtYWNyb3MgYXZhaWxhYmxlIGZvciBhcHBsaWNhdGlvbiBieSBtYWtpbmcKICAgICBzdXJlIHRoZXkgYXJlIGF2YWlsYWJsZSBpbiBvcGVuc3NsY29uZi5oLCBieSBnaXZpbmcgdGhlbSBuYW1lcyBzdGFydGluZwogICAgIHdpdGggIk9QRU5TU0xfIiB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBvdGhlciBwYWNrYWdlcyBhbmQgYnkgbWFraW5nCiAgICAgc3VyZSBlX29zMi5oIHdpbGwgY292ZXIgYWxsIHBsYXRmb3JtLXNwZWNpZmljIGNhc2VzIHRvZ2V0aGVyIHdpdGgKICAgICBvcGVuc3NsY29uZi5oLgogICAgIEFkZGl0aW9uYWxseSwgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGRlZmluZSBjb25maWd1cmF0aW9uL3BsYXRmb3JtLQogICAgIHNwZWNpZmljIG5hbWVzIChjYWxsZWQgInN5c3RlbSBpZGVudGl0aWVzIikuICBJbiB0aGUgQyBjb2RlLCB0aGVzZQogICAgIGFyZSBwcmVmaXhlZCB3aXRoICJPUEVOU1NMX1NZU05BTUVfIi4gIGVfb3MyLmggd2lsbCBjcmVhdGUgYW5vdGhlcgogICAgIG1hY3JvIHdpdGggdGhlIG5hbWUgYmVnaW5uaW5nIHdpdGggIk9QRU5TU0xfU1lTXyIsIHdoaWNoIGlzIGRldGVybWluZWQKICAgICBmcm9tICJPUEVOU1NMX1NZU05BTUVfKiIgb3IgY29tcGlsZXItc3BlY2lmaWMgbWFjcm9zIGRlcGVuZGluZyBvbgogICAgIHdoYXQgaXMgYXZhaWxhYmxlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBvcHRpb24gLXNldF9zZXJpYWwgdG8gJ3JlcScgYW5kICd4NTA5JyB0aGlzIGFsbG93cyB0aGUgc2VyaWFsCiAgICAgbnVtYmVyIHRvIHVzZSB0byBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gUHJldmlvdXNseSBzZWxmCiAgICAgc2lnbmVkIGNlcnRpZmljYXRlcyB3ZXJlIGhhcmQgY29kZWQgd2l0aCBzZXJpYWwgbnVtYmVyIDAgYW5kIHRoZSAKICAgICBDQSBvcHRpb25zIG9mICd4NTA5JyBoYWQgdG8gdXNlIGEgc2VyaWFsIG51bWJlciBpbiBhIGZpbGUgd2hpY2ggd2FzCiAgICAgYXV0byBpbmNyZW1lbnRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9ucyB0byAnY2EnIHV0aWxpdHkgdG8gc3VwcG9ydCBWMiBDUkwgZW50cnkgZXh0ZW5zaW9ucy4KICAgICBDdXJyZW50bHkgQ1JMIHJlYXNvbiwgaW52YWxpZGl0eSBkYXRlIGFuZCBob2xkIGluc3RydWN0aW9uIGFyZQogICAgIHN1cHBvcnRlZC4gQWRkIG5ldyBDUkwgZXh0ZW5zaW9ucyB0byBWMyBjb2RlIGFuZCBzb21lIG5ldyBvYmplY3RzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZygpIHRoaXMgaXMgdXNlZCB0bwogICAgIGRpc2FibGUgc3RhbmRhcmQgYmxvY2sgcGFkZGluZyAoYWthIFBLQ1MjNSBwYWRkaW5nKSBpbiB0aGUgRVZQCiAgICAgQVBJLCB3aGljaCB3YXMgcHJldmlvdXNseSBtYW5kYXRvcnkuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZGF0YSBpcwogICAgIG5vdCBwYWRkZWQgaW4gYW55IHdheSBhbmQgc28gdGhlIHRvdGFsIGxlbmd0aCBtdWNoIGJlIGEgbXVsdGlwbGUKICAgICBvZiB0aGUgYmxvY2sgc2l6ZSwgb3RoZXJ3aXNlIGFuIGVycm9yIG9jY3Vycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIChpbmNvbXBsZXRlKSBPQ1NQIFNTTCBzdXBwb3J0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBPQ1NQX3BhcnNlX3VybCgpLiBUaGlzIHNwbGl0cyB1cCBhIFVSTCBpbnRvIGl0cyBob3N0LAogICAgIHBvcnQgYW5kIHBhdGggY29tcG9uZW50czogcHJpbWFyaWx5IHRvIHBhcnNlIE9DU1AgVVJMcy4gTmV3IC11cmwKICAgICBvcHRpb24gdG8gb2NzcCB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBub25jZSBiZWhhdmlvci4gVGhlIHJldHVybiB2YWx1ZSBvZiBPQ1NQX2NoZWNrX25vbmNlKCkgbm93IAogICAgIHJlZmxlY3RzIHRoZSB2YXJpb3VzIGNoZWNrcyBwZXJmb3JtZWQuIEFwcGxpY2F0aW9ucyBjYW4gZGVjaWRlCiAgICAgd2hldGhlciB0byB0b2xlcmF0ZSBjZXJ0YWluIHNpdHVhdGlvbnMgc3VjaCBhcyBhbiBhYnNlbnQgbm9uY2UKICAgICBpbiBhIHJlc3BvbnNlIHdoZW4gb25lIHdhcyBwcmVzZW50IGluIGEgcmVxdWVzdDogdGhlIG9jc3AgYXBwbGljYXRpb24KICAgICBqdXN0IHByaW50cyBvdXQgYSB3YXJuaW5nLiBOZXcgZnVuY3Rpb24gT0NTUF9hZGQxX2Jhc2ljX25vbmNlKCkKICAgICB0aGlzIGlzIHRvIGFsbG93IHJlc3BvbmRlcnMgdG8gaW5jbHVkZSBhIG5vbmNlIGluIGEgcmVzcG9uc2UgZXZlbiBpZgogICAgIHRoZSByZXF1ZXN0IGlzIG5vbmNlLWxlc3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGlzYWJsZSBzdGRpbiBidWZmZXJpbmcgaW4gbG9hZF9jZXJ0IChhcHBzL2FwcHMuYykgc28gdGhhdCBubyBjZXJ0cyBhcmUKICAgICBza2lwcGVkIHdoZW4gdXNpbmcgb3BlbnNzbCB4NTA5IG11bHRpcGxlIHRpbWVzIG9uIGEgc2luZ2xlIGlucHV0IGZpbGUsCiAgICAgZS5nLiAiKG9wZW5zc2wgeDUwOSAtb3V0IGNlcnQxOyBvcGVuc3NsIHg1MDkgLW91dCBjZXJ0MikgPGNlcnRzIi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIEFTTjFfVVRDVElNRV9zZXRfc3RyaW5nKCkgYW5kIEFTTjFfR0VORVJBTElaRURUSU1FX3NldF9zdHJpbmcoKQogICAgIHNldCBzdHJpbmcgdHlwZTogdG8gaGFuZGxlIHNldHRpbmcgQVNOMV9USU1FIHN0cnVjdHVyZXMuIEZpeCBjYQogICAgIHV0aWxpdHkgdG8gY29ycmVjdGx5IGluaXRpYWxpemUgcmV2b2NhdGlvbiBkYXRlIG9mIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbiBTU0xfT1BfQ0lQSEVSX1NFUlZFUl9QUkVGRVJFTkNFIGFsbG93cyB0aGUgc2VydmVyIHRvIG92ZXJyaWRlCiAgICAgdGhlIGNsaWVudHMgcHJlZmVycmVkIGNpcGhlcnN1aXRlcyBhbmQgcmF0aGVyIHVzZSBpdHMgb3duIHByZWZlcmVuY2VzLgogICAgIFNob3VsZCBoZWxwIHRvIHdvcmsgYXJvdW5kIE0kIFNHQyAoU2VydmVyIEdhdGVkIENyeXB0b2dyYXBoeSkgYnVnIGluCiAgICAgSW50ZXJuZXQgRXhwbG9yZXIgYnkgZW5zdXJpbmcgdW5jaGFuZ2VkIGhhc2ggbWV0aG9kIGR1cmluZyBzdGVwdXAuCiAgICAgKEFsc28gcmVwbGFjZXMgdGhlIGJyb2tlbi9kZWFjdGl2YXRlZCBTU0xfT1BfTk9OX0VYUE9SVF9GSVJTVCBvcHRpb24uKQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBNYWtlIG1rZGVmLnBsIHJlY29nbmlzZSBhbGwgREVDTEFSRV9BU04xIG1hY3JvcywgY2hhbmdlIHJpam5kYWVsCiAgICAgdG8gYWVzIGFuZCBhZGQgYSBuZXcgJ2V4aXN0JyBvcHRpb24gdG8gcHJpbnQgb3V0IHN5bWJvbHMgdGhhdCBkb24ndAogICAgIGFwcGVhciB0byBleGlzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRpdGlvbmFsIG9wdGlvbnMgdG8gb2NzcCB1dGlsaXR5IHRvIGFsbG93IGZsYWdzIHRvIGJlIHNldCBhbmQKICAgICBhZGRpdGlvbmFsIGNlcnRpZmljYXRlcyBzdXBwbGllZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGhlIG9wdGlvbiAtVkFmaWxlIHRvICdvcGVuc3NsIG9jc3AnLCBzbyB0aGUgdXNlciBjYW4gZ2l2ZSB0aGUKICAgICBPQ1NQIGNsaWVudCBhIG51bWJlciBvZiBjZXJ0aWZpY2F0ZSB0byBvbmx5IHZlcmlmeSB0aGUgcmVzcG9uc2UKICAgICBzaWduYXR1cmUgYWdhaW5zdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBVcGRhdGUgUmlqbmRhZWwgY29kZSB0byB2ZXJzaW9uIDMuMCBhbmQgY2hhbmdlIEVWUCBBRVMgY2lwaGVycyB0bwogICAgIGhhbmRsZSB0aGUgbmV3IEFQSS4gQ3VycmVudGx5IG9ubHkgRUNCLCBDQkMgbW9kZXMgc3VwcG9ydGVkLiBBZGQgbmV3CiAgICAgQUVTIE9JRHMuCgogICAgIEFkZCBUTFMgQUVTIGNpcGhlcnN1aXRlcyBhcyBkZXNjcmliZWQgaW4gUkZDMzI2OCwgIkFkdmFuY2VkCiAgICAgRW5jcnlwdGlvbiBTdGFuZGFyZCAoQUVTKSBDaXBoZXJzdWl0ZXMgZm9yIFRyYW5zcG9ydCBMYXllcgogICAgIFNlY3VyaXR5IChUTFMpIi4gIChJbiBiZXRhIHZlcnNpb25zIG9mIE9wZW5TU0wgMC45LjcsIHRoZXNlIHdlcmUKICAgICBub3QgZW5hYmxlZCBieSBkZWZhdWx0IGFuZCB3ZXJlIG5vdCBwYXJ0IG9mIHRoZSAiQUxMIiBjaXBoZXJzdWl0ZQogICAgIGFsaWFzIGJlY2F1c2UgdGhleSB3ZXJlIG5vdCB5ZXQgb2ZmaWNpYWw7IHRoZXkgY291bGQgYmUKICAgICBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSBzcGVjaWZ5aW5nIHRoZSAiQUVTZHJhZnQiIGNpcGhlcnN1aXRlCiAgICAgZ3JvdXAgYWxpYXMuICBJbiB0aGUgZmluYWwgcmVsZWFzZSBvZiBPcGVuU1NMIDAuOS43LCB0aGUgZ3JvdXAKICAgICBhbGlhcyBpcyBjYWxsZWQgIkFFUyIgYW5kIGlzIHBhcnQgb2YgIkFMTCIuKQogICAgIFtCZW4gTGF1cmllLCBTdGV2ZSAgSGVuc29uLCBCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBPQ1NQX2NvcHlfbm9uY2UoKSB0byBjb3B5IG5vbmNlIHZhbHVlIChpZiBwcmVzZW50KSBmcm9tCiAgICAgcmVxdWVzdCB0byByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdW5jdGlvbnMgZm9yIE9DU1AgcmVzcG9uZGVycy4gT0NTUF9yZXF1ZXN0X29uZXJlcV9jb3VudCgpLAogICAgIE9DU1BfcmVxdWVzdF9vbmVyZXFfZ2V0MCgpLCBPQ1NQX29uZXJlcV9nZXQwX2lkKCkgYW5kIE9DU1BfaWRfZ2V0MF9pbmZvKCkKICAgICBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0LiBPQ1NQX3Jlc3BvbnNlX2NyZWF0ZSgpCiAgICAgY3JlYXRlcyBhIHJlc3BvbnNlIGFuZCBvcHRpb25hbGx5IGFkZHMgYSBiYXNpYyByZXNwb25zZSBzdHJ1Y3R1cmUuCiAgICAgT0NTUF9iYXNpY19hZGQxX3N0YXR1cygpIGFkZHMgYSBjb21wbGV0ZSBzaW5nbGUgcmVzcG9uc2UgdG8gYSBiYXNpYwogICAgIHJlc3BvbnNlIGFuZCByZXR1cm5zIHRoZSBPQ1NQX1NJTkdMRVJFU1Agc3RydWN0dXJlIGp1c3QgYWRkZWQgKHRvIGFsbG93CiAgICAgZXh0ZW5zaW9ucyB0byBiZSBpbmNsdWRlZCBmb3IgZXhhbXBsZSkuIE9DU1BfYmFzaWNfYWRkMV9jZXJ0KCkgYWRkcyBhCiAgICAgY2VydGlmaWNhdGUgdG8gYSBiYXNpYyByZXNwb25zZSBhbmQgT0NTUF9iYXNpY19zaWduKCkgc2lnbnMgYSBiYXNpYwogICAgIHJlc3BvbnNlIHdpdGggdmFyaW91cyBmbGFncy4gTmV3IGhlbHBlciBmdW5jdGlvbnMgQVNOMV9USU1FX2NoZWNrKCkKICAgICAoY2hlY2tzIHZhbGlkaXR5IG9mIEFTTjFfVElNRSBzdHJ1Y3R1cmUpIGFuZCBBU04xX1RJTUVfdG9fZ2VuZXJhbGl6ZWR0aW1lKCkKICAgICAoY29udmVydHMgQVNOMV9USU1FIHRvIEdlbmVyYWxpemVkVGltZSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyBuZXcgZnVuY3Rpb25zLiBFVlBfRGlnZXN0KCkgY29tYmluZXMgRVZQX0RpZ2VzdHtJbml0LFVwZGF0ZSxGaW5hbH0oKQogICAgIGluIGEgc2luZ2xlIG9wZXJhdGlvbi4gWDUwOV9nZXQwX3B1YmtleV9iaXRzdHIoKSBleHRyYWN0cyB0aGUgcHVibGljX2tleQogICAgIHN0cnVjdHVyZSBmcm9tIGEgY2VydGlmaWNhdGUuIFg1MDlfcHVia2V5X2RpZ2VzdCgpIGRpZ2VzdHMgdGhlIHB1YmxpY19rZXkKICAgICBjb250ZW50czogdGhpcyBpcyB1c2VkIGluIHZhcmlvdXMga2V5IGlkZW50aWZpZXJzLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHNrX3NvcnQoKSB0b2xlcmF0ZSBhIE5VTEwgYXJndW1lbnQuCiAgICAgW1N0ZXZlIEhlbnNvbiByZXBvcnRlZCBieSBNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBjb211bmUubW9kZW5hLml0Pl0KCiAgKikgTmV3IE9DU1AgdmVyaWZ5IGZsYWcgT0NTUF9UUlVTVE9USEVSLiBXaGVuIHNldCB0aGUgIm90aGVyIiBjZXJ0aWZpY2F0ZXMKICAgICBwYXNzZWQgYnkgdGhlIGZ1bmN0aW9uIGFyZSB0cnVzdGVkIGltcGxpY2l0bHkuIElmIGFueSBvZiB0aGVtIHNpZ25lZCB0aGUKICAgICByZXNwb25zZSB0aGVuIGl0IGlzIGFzc3VtZWQgdG8gYmUgdmFsaWQgYW5kIGlzIG5vdCB2ZXJpZmllZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBQS0NTN19zZXRfdHlwZSgpIGluaXRpYWxpc2UgY29udGVudF90eXBlIGluIFBLQ1M3X0VOQ19DT05URU5UCiAgICAgdG8gZGF0YS4gVGhpcyB3YXMgcHJldmlvdXNseSBwYXJ0IG9mIHRoZSBQS0NTNyBBU04xIGNvZGUuIFRoaXMKICAgICB3YXMgY2F1c2luZyBwcm9ibGVtcyB3aXRoIE9wZW5TU0wgY3JlYXRlZCBQS0NTIzEyIGFuZCBQS0NTIzcgc3RydWN0dXJlcy4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBLZW5uZXRoIFIuIFJvYmluZXR0ZQoJCQkJPHN1cHBvcnRAc2VjdXJlbmV0dGVybS5jb20+XQoKICAqKSBBZGQgQ1JZUFRPX3B1c2hfaW5mbygpIGFuZCBDUllQVE9fcG9wX2luZm8oKSBjYWxscyB0byBuZXcgQVNOMQogICAgIHJvdXRpbmVzOiB3aXRob3V0IHRoZXNlIHRyYWNpbmcgbWVtb3J5IGxlYWtzIGlzIHZlcnkgcGFpbmZ1bC4KICAgICBGaXggbGVha3MgaW4gUEtDUzEyIGFuZCBQS0NTNyByb3V0aW5lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFg1MDlfdGltZV9hZGooKSBjb3BlIHdpdGggdGhlIG5ldyBiZWhhdmlvdXIgb2YgQVNOMV9USU1FX25ldygpLgogICAgIFByZXZpb3VzbHkgaXQgaW5pdGlhbGlzZWQgdGhlICd0eXBlJyBhcmd1bWVudCB0byBWX0FTTjFfVVRDVElNRSB3aGljaAogICAgIGVmZmVjdGl2ZWx5IG1lYW50IEdlbmVyYWxpemVkVGltZSB3b3VsZCBuZXZlciBiZSB1c2VkLiBOb3cgaXQKICAgICBpcyBpbml0aWFsaXNlZCB0byAtMSBidXQgWDUwOV90aW1lX2FkaigpIG5vdyBoYXMgdG8gY2hlY2sgdGhlIHZhbHVlCiAgICAgYW5kIHVzZSBBU04xX1RJTUVfc2V0KCkgaWYgdGhlIHZhbHVlIGlzIG5vdCBWX0FTTjFfVVRDVElNRSBvcgogICAgIFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUsIHdpdGhvdXQgdGhpcyBpdCBhbHdheXMgdXNlcyBHZW5lcmFsaXplZFRpbWUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgS2VubmV0aCBSLiBSb2JpbmV0dGUKCQkJCTxzdXBwb3J0QHNlY3VyZW5ldHRlcm0uY29tPl0KCiAgKikgRml4ZXMgdG8gQk5fdG9fQVNOMV9JTlRFR0VSIHdoZW4gYm4gaXMgemVyby4gVGhpcyB3b3VsZCBwcmV2aW91c2x5CiAgICAgcmVzdWx0IGluIGEgemVybyBsZW5ndGggaW4gdGhlIEFTTjFfSU5URUdFUiBzdHJ1Y3R1cmUgd2hpY2ggd2FzCiAgICAgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgc3RydWN0dXJlIHdoZW4gZDJpX0FTTjFfSU5URUdFUigpIHdhcyB1c2VkCiAgICAgYW5kIHdvdWxkIGNhdXNlIEFTTjFfSU5URUdFUl9jbXAoKSB0byBmYWlsLiBFbmhhbmNlIHMyaV9BU04xX0lOVEVHRVIoKQogICAgIHRvIGNvcGUgd2l0aCBoZXggYW5kIG5lZ2F0aXZlIGludGVnZXJzLiBGaXggYnVnIGluIGkyYV9BU04xX0lOVEVHRVIoKQogICAgIHdoZXJlIGl0IGRpZCBub3QgcHJpbnQgb3V0IGEgbWludXMgZm9yIG5lZ2F0aXZlIEFTTjFfSU5URUdFUi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VtbWFyeSBwcmludG91dCB0byBvY3NwIHV0aWxpdHkuIFRoZSB2YXJpb3VzIGZ1bmN0aW9ucyB3aGljaAogICAgIGNvbnZlcnQgc3RhdHVzIHZhbHVlcyB0byBzdHJpbmdzIGhhdmUgYmVlbiByZW5hbWVkIHRvOgogICAgIE9DU1BfcmVzcG9uc2Vfc3RhdHVzX3N0cigpLCBPQ1NQX2NlcnRfc3RhdHVzX3N0cigpIGFuZAogICAgIE9DU1BfY3JsX3JlYXNvbl9zdHIoKSBhbmQgYXJlIG5vIGxvbmdlciBzdGF0aWMuIE5ldyBvcHRpb25zCiAgICAgdG8gdmVyaWZ5IG5vbmNlIHZhbHVlcyBhbmQgdG8gZGlzYWJsZSB2ZXJpZmljYXRpb24uIE9DU1AgcmVzcG9uc2UKICAgICBwcmludG91dCBmb3JtYXQgY2xlYW5lZCB1cC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYWRkaXRpb25hbCBPQ1NQIGNlcnRpZmljYXRlIGNoZWNrcy4gVGhlc2UgYXJlIHRob3NlIHNwZWNpZmllZAogICAgIGluIFJGQzI1NjAuIFRoaXMgY29uc2lzdHMgb2YgdHdvIHNlcGFyYXRlIGNoZWNrczogdGhlIENBIG9mIHRoZQogICAgIGNlcnRpZmljYXRlIGJlaW5nIGNoZWNrZWQgbXVzdCBlaXRoZXIgYmUgdGhlIE9DU1Agc2lnbmVyIGNlcnRpZmljYXRlCiAgICAgb3IgdGhlIGlzc3VlciBvZiB0aGUgT0NTUCBzaWduZXIgY2VydGlmaWNhdGUuIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUKICAgICBPQ1NQIHNpZ25lciBjZXJ0aWZpY2F0ZSBtdXN0IGNvbnRhaW4gdGhlIE9DU1Agc2lnbmluZyBleHRlbmRlZCBrZXkKICAgICB1c2FnZS4gVGhpcyBjaGVjayBpcyBwZXJmb3JtZWQgYnkgYXR0ZW1wdGluZyB0byBtYXRjaCB0aGUgT0NTUAogICAgIHNpZ25lciBvciB0aGUgT0NTUCBzaWduZXIgQ0EgdG8gdGhlIGlzc3Vlck5hbWVIYXNoIGFuZCBpc3N1ZXJLZXlIYXNoCiAgICAgaW4gdGhlIE9DU1BfQ0VSVElEIHN0cnVjdHVyZXMgb2YgdGhlIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgT0NTUCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYWRkZWQgdG8gT0NTUF9iYXNpY192ZXJpZnkoKQogICAgIGFuZCByZWxhdGVkIHJvdXRpbmVzLiBUaGlzIHVzZXMgdGhlIHN0YW5kYXJkIE9wZW5TU0wgY2VydGlmaWNhdGUKICAgICB2ZXJpZnkgcm91dGluZXMgdG8gcGVyZm9ybSBpbml0aWFsIGNoZWNrcyAoanVzdCBDQSB2YWxpZGl0eSkgYW5kCiAgICAgdG8gb2J0YWluIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbi4gVGhlbiBhZGRpdGlvbmFsIGNoZWNrcyB3aWxsIGJlCiAgICAgcGVyZm9ybWVkIG9uIHRoZSBjaGFpbi4gQ3VycmVudGx5IHRoZSByb290IENBIGlzIGNoZWNrZWQgdG8gc2VlCiAgICAgaWYgaXQgaXMgZXhwbGljaXRseSB0cnVzdGVkIGZvciBPQ1NQIHNpZ25pbmcuIFRoaXMgaXMgdXNlZCB0byBzZXQKICAgICBhIHJvb3QgQ0EgYXMgYSBnbG9iYWwgc2lnbmluZyByb290OiB0aGF0IGlzIGFueSBjZXJ0aWZpY2F0ZSB0aGF0CiAgICAgY2hhaW5zIHRvIHRoYXQgQ0EgaXMgYW4gYWNjZXB0YWJsZSBPQ1NQIHNpZ25pbmcgY2VydGlmaWNhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3ICctZXh0ZmlsZSAuLi4nIG9wdGlvbiB0byAnb3BlbnNzbCBjYScgZm9yIHJlYWRpbmcgWC41MDl2MwogICAgIGV4dGVuc2lvbnMgZnJvbSBhIHNlcGFyYXRlIGNvbmZpZ3VyYXRpb24gZmlsZS4KICAgICBBcyB3aGVuIHJlYWRpbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBtYWluIGNvbmZpZ3VyYXRpb24gZmlsZSwKICAgICB0aGUgJy1leHRlbnNpb25zIC4uLicgb3B0aW9uIG1heSBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZQogICAgIHNlY3Rpb24gdG8gdXNlLgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBjb211bmUubW9kZW5hLml0Pl0KCiAgKikgTmV3IE9DU1AgdXRpbGl0eS4gQWxsb3dzIE9DU1AgcmVxdWVzdHMgdG8gYmUgZ2VuZXJhdGVkIG9yCiAgICAgcmVhZC4gVGhlIHJlcXVlc3QgY2FuIGJlIHNlbnQgdG8gYSByZXNwb25kZXIgYW5kIHRoZSBvdXRwdXQKICAgICBwYXJzZWQsIG91dHB1dGVkIG9yIHByaW50ZWQgaW4gdGV4dCBmb3JtLiBOb3QgY29tcGxldGUgeWV0OgogICAgIHN0aWxsIG5lZWRzIHRvIGNoZWNrIHRoZSBPQ1NQIHJlc3BvbnNlIHZhbGlkaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBzdWJjb21tYW5kcyBmb3IgJ29wZW5zc2wgY2EnOgogICAgICdvcGVuc3NsIGNhIC1zdGF0dXMgPHNlcmlhbD4nIHByaW50cyB0aGUgc3RhdHVzIG9mIHRoZSBjZXJ0IHdpdGgKICAgICB0aGUgZ2l2ZW4gc2VyaWFsIG51bWJlciAoYWNjb3JkaW5nIHRvIHRoZSBpbmRleCBmaWxlKS4KICAgICAnb3BlbnNzbCBjYSAtdXBkYXRlZGInIHVwZGF0ZXMgdGhlIGV4cGlyeSBzdGF0dXMgb2YgY2VydGlmaWNhdGVzCiAgICAgaW4gdGhlIGluZGV4IGZpbGUuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+XQoKICAqKSBOZXcgJy1uZXdyZXEtbm9kZXMnIGNvbW1hbmQgb3B0aW9uIHRvIENBLnBsLiAgVGhpcyBpcyBsaWtlCiAgICAgJy1uZXdyZXEnLCBidXQgY2FsbHMgJ29wZW5zc2wgcmVxJyB3aXRoIHRoZSAnLW5vZGVzJyBvcHRpb24KICAgICBzbyB0aGF0IHRoZSByZXN1bHRpbmcga2V5IGlzIG5vdCBlbmNyeXB0ZWQuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz5dCgogICopIE5ldyBjb25maWd1cmF0aW9uIGZvciB0aGUgR05VIEh1cmQuCiAgICAgW0pvbmF0aGFuIEJhcnRsZXR0IDxqb2hubnliQHdvbGZyYW0uY29tPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbml0aWFsIGNvZGUgdG8gaW1wbGVtZW50IE9DU1AgYmFzaWMgcmVzcG9uc2UgdmVyaWZ5LiBUaGlzCiAgICAgaXMgY3VycmVudGx5IGluY29tcGxldGUuIEN1cnJlbnRseSBqdXN0IGZpbmRzIHRoZSBzaWduZXIncwogICAgIGNlcnRpZmljYXRlIGFuZCB2ZXJpZmllcyB0aGUgc2lnbmF0dXJlIG9uIHRoZSByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgU1NMZWF5X3ZlcnNpb24gY29kZSBTU0xFQVlfRElSIHRvIGRldGVybWluZSB0aGUgY29tcGlsZWQtaW4KICAgICB2YWx1ZSBvZiBPUEVOU1NMRElSLiAgVGhpcyBpcyBhdmFpbGFibGUgdmlhIHRoZSBuZXcgJy1kJyBvcHRpb24KICAgICB0byAnb3BlbnNzbCB2ZXJzaW9uJywgYW5kIGlzIGFsc28gaW5jbHVkZWQgaW4gJ29wZW5zc2wgdmVyc2lvbiAtYScuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWxsb3dpbmcgZGVmaW5pbmcgbWVtb3J5IGFsbG9jYXRpb24gY2FsbGJhY2tzIHRoYXQgd2lsbCBiZSBnaXZlbgogICAgIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gaW4gYWRkaXRpb25hbCBhcmd1bWVudHMKICAgICAoYSBjb25zdCBjaGFyKiBhbmQgYW4gaW50KS4gIFRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IHJlbWFpbnMsIGFzCiAgICAgd2VsbCBhcyB0aGUgb3JpZ2luYWwgcG9zc2liaWxpdHkgdG8ganVzdCByZXBsYWNlIG1hbGxvYygpLAogICAgIHJlYWxsb2MoKSBhbmQgZnJlZSgpIGJ5IGZ1bmN0aW9ucyB0aGF0IGRvIG5vdCBrbm93IGFib3V0IHRoZXNlCiAgICAgYWRkaXRpb25hbCBhcmd1bWVudHMuICBUbyByZWdpc3RlciBhbmQgZmluZCBvdXQgdGhlIGN1cnJlbnQKICAgICBzZXR0aW5ncyBmb3IgZXh0ZW5kZWQgYWxsb2NhdGlvbiBmdW5jdGlvbnMsIHRoZSBmb2xsb3dpbmcKICAgICBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkOgoKCUNSWVBUT19zZXRfbWVtX2V4X2Z1bmN0aW9ucwoJQ1JZUFRPX3NldF9sb2NrZWRfbWVtX2V4X2Z1bmN0aW9ucwoJQ1JZUFRPX2dldF9tZW1fZXhfZnVuY3Rpb25zCglDUllQVE9fZ2V0X2xvY2tlZF9tZW1fZXhfZnVuY3Rpb25zCgogICAgIFRoZXNlIHdvcmsgdGhlIHNhbWUgd2F5IGFzIENSWVBUT19zZXRfbWVtX2Z1bmN0aW9ucyBhbmQgZnJpZW5kcy4KICAgICBDUllQVE9fZ2V0X1tsb2NrZWRfXW1lbV9mdW5jdGlvbnMgbm93IHdyaXRlcyAwIHdoZXJlIHN1Y2ggYW4KICAgICBleHRlbmRlZCBhbGxvY2F0aW9uIGZ1bmN0aW9uIGlzIGVuYWJsZWQuCiAgICAgU2ltaWxhcmx5LCBDUllQVE9fZ2V0X1tsb2NrZWRfXW1lbV9leF9mdW5jdGlvbnMgd3JpdGVzIDAgd2hlcmUKICAgICBhIGNvbnZlbnRpb25hbCBhbGxvY2F0aW9uIGZ1bmN0aW9uIGlzIGVuYWJsZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaW5pc2ggb2ZmIHJlbW92aW5nIHRoZSByZW1haW5pbmcgTEhBU0ggZnVuY3Rpb24gcG9pbnRlciBjYXN0cy4KICAgICBUaGVyZSBzaG91bGQgbm8gbG9uZ2VyIGJlIGFueSBwcm90b3R5cGUtY2FzdGluZyByZXF1aXJlZCB3aGVuIHVzaW5nCiAgICAgdGhlIExIQVNIIGFic3RyYWN0aW9uLCBhbmQgYW55IGNhc3RzIHRoYXQgcmVtYWluIGFyZSAiYnVncyIuIFNlZQogICAgIHRoZSBjYWxsYmFjayB0eXBlcyBhbmQgbWFjcm9zIGF0IHRoZSBoZWFkIG9mIGxoYXNoLmggZm9yIGRldGFpbHMKICAgICAoYW5kICJPQkpfY2xlYW51cCIgaW4gY3J5cHRvL29iamVjdHMvb2JqX2RhdC5jIGFzIGFuIGV4YW1wbGUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhdXRvbWF0aWMgcXVlcnkgb2YgRUdEIHNvY2tldHMgaW4gUkFORF9wb2xsKCkgZm9yIHRoZSB1bml4IHZhcmlhbnQuCiAgICAgSWYgL2Rldi9bdV1yYW5kb20gZGV2aWNlcyBhcmUgbm90IGF2YWlsYWJsZSBvciBkbyBub3QgcmV0dXJuIGVub3VnaAogICAgIGVudHJvcHksIEVHRCBzdHlsZSBzb2NrZXRzIChzZXJ2ZWQgYnkgRUdEIG9yIFBSTkdEKSB3aWxsIGF1dG9tYXRpY2FsbHkKICAgICBiZSBxdWVyaWVkLgogICAgIFRoZSBsb2NhdGlvbnMgL3Zhci9ydW4vZWdkLXBvb2wsIC9kZXYvZWdkLXBvb2wsIC9ldGMvZWdkLXBvb2wsIGFuZAogICAgIC9ldGMvZW50cm9weSB3aWxsIGJlIHF1ZXJpZWQgb25jZSBlYWNoIGluIHRoaXMgc2VxdWVuY2UsIHF1ZXJpbmcgc3RvcHMKICAgICB3aGVuIGVub3VnaCBlbnRyb3B5IHdhcyBjb2xsZWN0ZWQgd2l0aG91dCBxdWVyeWluZyBtb3JlIHNvY2tldHMuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIENoYW5nZSB0aGUgVW5peCBSQU5EX3BvbGwoKSB2YXJpYW50IHRvIGJlIGFibGUgdG8gcG9sbCBzZXZlcmFsCiAgICAgcmFuZG9tIGRldmljZXMsIGFzIHNwZWNpZmllZCBieSBERVZSQU5ET00sIHVudGlsIGEgc3VmZmljaWVudCBhbW91bnQKICAgICBvZiBkYXRhIGhhcyBiZWVuIGNvbGxlY3RlZC4gICBXZSBzcGVuZCBhdCBtb3N0IDEwIG1zIG9uIGVhY2ggZmlsZQogICAgIChzZWxlY3QgdGltZW91dCkgYW5kIHJlYWQgaW4gbm9uLWJsb2NraW5nIG1vZGUuICBERVZSQU5ET00gbm93CiAgICAgZGVmYXVsdHMgdG8gdGhlIGxpc3QgIi9kZXYvdXJhbmRvbSIsICIvZGV2L3JhbmRvbSIsICIvZGV2L3NyYW5kb20iCiAgICAgKHByZXZpb3VzbHkgaXQgd2FzIGp1c3QgdGhlIHN0cmluZyAiL2Rldi91cmFuZG9tIiksIHNvIG9uIHR5cGljYWwKICAgICBwbGF0Zm9ybXMgdGhlIDEwIG1zIGRlbGF5IHdpbGwgbmV2ZXIgb2NjdXIuCiAgICAgQWxzbyBzZXBhcmF0ZSBvdXQgdGhlIFVuaXggdmFyaWFudCB0byBpdHMgb3duIGZpbGUsIHJhbmRfdW5peC5jLgogICAgIEZvciBWTVMsIHRoZXJlJ3MgYSBjdXJyZW50bHktZW1wdHkgcmFuZF92bXMuYy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNb3ZlIE9DU1AgY2xpZW50IHJlbGF0ZWQgcm91dGluZXMgdG8gb2NzcF9jbC5jLiBUaGVzZQogICAgIHByb3ZpZGUgdXRpbGl0eSBmdW5jdGlvbnMgd2hpY2ggYW4gYXBwbGljYXRpb24gbmVlZGluZwogICAgIHRvIGlzc3VlIGEgcmVxdWVzdCB0byBhbiBPQ1NQIHJlc3BvbmRlciBhbmQgYW5hbHlzZSB0aGUKICAgICByZXNwb25zZSB3aWxsIHR5cGljYWxseSBuZWVkOiBhcyBvcHBvc2VkIHRvIHRob3NlIHdoaWNoIGFuCiAgICAgT0NTUCByZXNwb25kZXIgaXRzZWxmIHdvdWxkIG5lZWQgd2hpY2ggd2lsbCBiZSBhZGRlZCBsYXRlci4KCiAgICAgT0NTUF9yZXF1ZXN0X3NpZ24oKSBzaWducyBhbiBPQ1NQIHJlcXVlc3Qgd2l0aCBhbiBBUEkgc2ltaWxhcgogICAgIHRvIFBLQ1M3X3NpZ24oKS4gT0NTUF9yZXNwb25zZV9zdGF0dXMoKSByZXR1cm5zIHN0YXR1cyBvZiBPQ1NQCiAgICAgcmVzcG9uc2UuIE9DU1BfcmVzcG9uc2VfZ2V0MV9iYXNpYygpIGV4dHJhY3RzIGJhc2ljIHJlc3BvbnNlCiAgICAgZnJvbSByZXNwb25zZS4gT0NTUF9yZXNwX2ZpbmRfc3RhdHVzKCk6IGZpbmRzIGFuZCBleHRyYWN0cyBzdGF0dXMKICAgICBpbmZvcm1hdGlvbiBmcm9tIGFuIE9DU1BfQ0VSVElEIHN0cnVjdHVyZSAod2hpY2ggd2lsbCBiZSBjcmVhdGVkCiAgICAgd2hlbiB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUgaXMgYnVpbHQpLiBUaGVzZSBhcmUgYnVpbHQgZnJvbSBsb3dlcgogICAgIGxldmVsIGZ1bmN0aW9ucyB3aGljaCB3b3JrIG9uIE9DU1BfU0lOR0xFUkVTUCBzdHJ1Y3R1cmVzIGJ1dAogICAgIHdvbnQgbm9ybWFsbHkgYmUgdXNlZCB1bmxlc3MgdGhlIGFwcGxpY2F0aW9uIHdpc2hlcyB0byBleGFtaW5lCiAgICAgZXh0ZW5zaW9ucyBpbiB0aGUgT0NTUCByZXNwb25zZSBmb3IgZXhhbXBsZS4KCiAgICAgUmVwbGFjZSBub25jZSByb3V0aW5lcyB3aXRoIGEgcGFpciBvZiBmdW5jdGlvbnMuCiAgICAgT0NTUF9yZXF1ZXN0X2FkZDFfbm9uY2UoKSBhZGRzIGEgbm9uY2UgdmFsdWUgYW5kIG9wdGlvbmFsbHkKICAgICBnZW5lcmF0ZXMgYSByYW5kb20gdmFsdWUuIE9DU1BfY2hlY2tfbm9uY2UoKSBjaGVja3MgdGhlCiAgICAgdmFsaWRpdHkgb2YgdGhlIG5vbmNlIGluIGFuIE9DU1AgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIGZ1bmN0aW9uIE9DU1BfcmVxdWVzdF9hZGQoKSB0byBPQ1NQX3JlcXVlc3RfYWRkMF9pZCgpLgogICAgIFRoaXMgZG9lc24ndCBjb3B5IHRoZSBzdXBwbGllZCBPQ1NQX0NFUlRJRCBhbmQgYXZvaWRzIHRoZQogICAgIG5lZWQgdG8gZnJlZSB1cCB0aGUgbmV3bHkgY3JlYXRlZCBpZC4gQ2hhbmdlIHJldHVybiB0eXBlCiAgICAgdG8gT0NTUF9PTkVSRVEgdG8gcmV0dXJuIHRoZSBpbnRlcm5hbCBPQ1NQX09ORVJFUSBzdHJ1Y3R1cmUuCiAgICAgVGhpcyBjYW4gdGhlbiBiZSB1c2VkIHRvIGFkZCBleHRlbnNpb25zIHRvIHRoZSByZXF1ZXN0LgogICAgIERlbGV0ZWQgT0NTUF9yZXF1ZXN0X25ldygpLCBzaW5jZSBtb3N0IG9mIGl0cyBmdW5jdGlvbmFsaXR5CiAgICAgaXMgbm93IGluIE9DU1BfUkVRVUVTVF9uZXcoKSAoYW5kIHRoZSBjYXNlIGluc2Vuc2l0aXZlIG5hbWUKICAgICBjbGFzaCkgYXBhcnQgZnJvbSB0aGUgYWJpbGl0eSB0byBzZXQgdGhlIHJlcXVlc3QgbmFtZSB3aGljaAogICAgIHdpbGwgYmUgYWRkZWQgZWxzZXdoZXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBPQ1NQIEFQSS4gUmVtb3ZlIG9ic29sZXRlIGV4dGVuc2lvbnMgYXJndW1lbnQgZnJvbQogICAgIHZhcmlvdXMgZnVuY3Rpb25zLiBFeHRlbnNpb25zIGFyZSBub3cgaGFuZGxlZCB1c2luZyB0aGUgbmV3CiAgICAgT0NTUCBleHRlbnNpb24gY29kZS4gTmV3IHNpbXBsZSBPQ1NQIEhUVFAgZnVuY3Rpb24gd2hpY2ggCiAgICAgY2FuIGJlIHVzZWQgdG8gc2VuZCByZXF1ZXN0cyBhbmQgcGFyc2UgdGhlIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgUEtDUyM3IChTL01JTUUpIGNvZGUgdG8gd29yayB3aXRoIG5ldyBBU04xLiBUd28gbmV3CiAgICAgQVNOMV9JVEVNIHN0cnVjdHVyZXMgaGVscCB3aXRoIHNpZ24gYW5kIHZlcmlmeS4gUEtDUzdfQVRUUl9TSUdOCiAgICAgdXNlcyB0aGUgc3BlY2lhbCByZW9yZGVyIHZlcnNpb24gb2YgU0VUIE9GIHRvIHNvcnQgdGhlIGF0dHJpYnV0ZXMKICAgICBhbmQgcmVvcmRlciB0aGVtIHRvIG1hdGNoIHRoZSBlbmNvZGVkIG9yZGVyLiBUaGlzIHJlc29sdmVzIGEgbG9uZwogICAgIHN0YW5kaW5nIHByb2JsZW06IGEgdmVyaWZ5IG9uIGEgUEtDUzcgc3RydWN0dXJlIGp1c3QgYWZ0ZXIgc2lnbmluZwogICAgIGl0IHVzZWQgdG8gZmFpbCBiZWNhdXNlIHRoZSBhdHRyaWJ1dGUgb3JkZXIgZGlkIG5vdCBtYXRjaCB0aGUKICAgICBlbmNvZGVkIG9yZGVyLiBQS0NTN19BVFRSX1ZFUklGWSBkb2VzIG5vdCByZW9yZGVyIHRoZSBhdHRyaWJ1dGVzOgogICAgIGl0IHVzZXMgdGhlIHJlY2VpdmVkIG9yZGVyLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byB0b2xlcmF0ZSBzb21lIGJyb2tlbgogICAgIHNvZnR3YXJlIHRoYXQgZG9lcyBub3Qgb3JkZXIgU0VUIE9GLiBUaGlzIGlzIGhhbmRsZWQgYnkgZW5jb2RpbmcKICAgICBhcyBhIFNFUVVFTkNFIE9GIGJ1dCB1c2luZyBpbXBsaWNpdCB0YWdnaW5nICh3aXRoIFVOSVZFUlNBTCBjbGFzcykKICAgICB0byBwcm9kdWNlIHRoZSByZXF1aXJlZCBTRVQgT0YuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSGF2ZSBtazFtZi5wbCBnZW5lcmF0ZSB0aGUgbWFjcm9zIE9QRU5TU0xfQlVJTERfU0hMSUJDUllQVE8gYW5kCiAgICAgT1BFTlNTTF9CVUlMRF9TSExJQlNTTCBhbmQgdXNlIHRoZW0gYXBwcm9wcmlhdGVseSBpbiB0aGUgaGVhZGVyCiAgICAgZmlsZXMgdG8gZ2V0IGNvcnJlY3QgZGVjbGFyYXRpb25zIG9mIHRoZSBBU04uMSBpdGVtIHZhcmlhYmxlcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZXdyaXRlIG9mIFBLQ1MjMTIgY29kZSB0byB1c2UgbmV3IEFTTjEgZnVuY3Rpb25hbGl0eS4gUmVwbGFjZSBtYW55CiAgICAgUEtDUyMxMiBtYWNyb3Mgd2l0aCByZWFsIGZ1bmN0aW9ucy4gRml4IHR3byB1bnJlbGF0ZWQgQVNOMSBidWdzOgogICAgIGFzbjFfY2hlY2tfdGxlbigpIHdvdWxkIHNvbWV0aW1lcyBhdHRlbXB0IHRvIHVzZSAnY3R4JyB3aGVuIGl0IHdhcwogICAgIE5VTEwgYW5kIEFTTjFfVFlQRSB3YXMgbm90IGRlcmVmZXJlbmNlZCBwcm9wZXJseSBpbiBhc24xX2V4X2MyaSgpLgogICAgIE5ldyBBU04xIG1hY3JvOiBERUNMQVJFX0FTTjFfSVRFTSgpIHdoaWNoIGp1c3QgZGVjbGFyZXMgdGhlIHJlbGV2YW50CiAgICAgQVNOMV9JVEVNIGFuZCBubyB3cmFwcGVyIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIG9yIEFTTjFfaXRlbV9kMmlfZnAoKSBhbmQgQVNOMV9pdGVtX2QyaV9iaW8oKS4gVGhlc2UKICAgICByZXBsYWNlIHRoZSBvbGQgZnVuY3Rpb24gcG9pbnRlciBiYXNlZCBJL08gcm91dGluZXMuIENoYW5nZSBtb3N0IG9mCiAgICAgdGhlICpfZDJpX2JpbygpIGFuZCAqX2QyaV9mcCgpIGZ1bmN0aW9ucyB0byB1c2UgdGhlc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSBta2RlZi5wbCB0byBiZSBtb3JlIGFjY2VwdGluZyBhYm91dCBzcGFjaW5nIGluIEMgcHJlcHJvY2Vzc29yCiAgICAgbGluZXMsIHJlY29nbmljZSBtb3JlICJhbGdvcml0aG1zIiB0aGF0IGNhbiBiZSBkZXNlbGVjdGVkLCBhbmQgbWFrZQogICAgIGl0IGNvbXBsYWluIGFib3V0IGFsZ29yaXRobSBkZXNlbGVjdGlvbiB0aGF0IGlzbid0IHJlY29nbmlzZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IEFTTjEgZnVuY3Rpb25zIHRvIGhhbmRsZSBkdXAsIHNpZ24sIHZlcmlmeSwgZGlnZXN0LCBwYWNrIGFuZAogICAgIHVucGFjayBvcGVyYXRpb25zIGluIHRlcm1zIG9mIEFTTjFfSVRFTS4gTW9kaWZ5IGV4aXN0aW5nIHdyYXBwZXJzCiAgICAgdG8gdXNlIG5ldyBmdW5jdGlvbnMuIEFkZCBOT19BU04xX09MRCB3aGljaCBjYW4gYmUgc2V0IHRvIHJlbW92ZQogICAgIHNvbWUgb2xkIHN0eWxlIEFTTjEgZnVuY3Rpb25zOiB0aGlzIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBvbGQKICAgICBjb2RlIHdpbGwgc3RpbGwgd29yayB3aGVuIHRoZXNlIGV2ZW50dWFsbHkgZ28gYXdheS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZXh0ZW5zaW9uIGZ1bmN0aW9ucyBmb3IgT0NTUCBzdHJ1Y3R1cmVzLCB0aGVzZSBmb2xsb3cgdGhlCiAgICAgc2FtZSBjb252ZW50aW9ucyBhcyBjZXJ0aWZpY2F0ZXMgYW5kIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlWM19hZGQxX2kyZCgpLiBUaGlzIGF1dG9tYXRpY2FsbHkgZW5jb2RlcyBhbmQKICAgICBhZGRzIGFuIGV4dGVuc2lvbi4gSXRzIGJlaGF2aW91ciBjYW4gYmUgY3VzdG9taXNlZCB3aXRoIHZhcmlvdXMKICAgICBmbGFncyB0byBhcHBlbmQsIHJlcGxhY2Ugb3IgZGVsZXRlLiBWYXJpb3VzIHdyYXBwZXJzIGFkZGVkIGZvcgogICAgIGNlcnRpZmNhdGVzIGFuZCBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0byBhdm9pZCBjYWxsaW5nIHRoZSB1bmRlcmx5aW5nIEFTTjEgcHJpbnQgcm91dGluZSB3aGVuCiAgICAgYW4gZXh0ZW5zaW9uIGNhbm5vdCBiZSBwYXJzZWQuIENvcnJlY3QgYSB0eXBvIGluIHRoZQogICAgIE9DU1BfU0VSVklDRUxPQyBleHRlbnNpb24uIFRpZHkgdXAgcHJpbnQgT0NTUCBmb3JtYXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBta2RlZi5wbCBwYXJzZSBzb21lIG9mIHRoZSBBU04xIG1hY3JvcyBhbmQgYWRkIGFwcHJvcHJpYXRlCiAgICAgZW50cmllcyBmb3IgdmFyaWFibGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdW5jdGlvbmFsaXR5IHRvIGFwcHMvb3BlbnNzbC5jIGZvciBkZXRlY3RpbmcgbG9ja2luZwogICAgIHByb2JsZW1zOiBBcyB0aGUgcHJvZ3JhbSBpcyBzaW5nbGUtdGhyZWFkZWQsIGFsbCB3ZSBoYXZlCiAgICAgdG8gZG8gaXMgcmVnaXN0ZXIgYSBsb2NraW5nIGNhbGxiYWNrIHVzaW5nIGFuIGFycmF5IGZvcgogICAgIHN0b3Jpbmcgd2hpY2ggbG9ja3MgYXJlIGN1cnJlbnRseSBoZWxkIGJ5IHRoZSBwcm9ncmFtLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVzZSBhIGxvY2sgYXJvdW5kIHRoZSBjYWxsIHRvIENSWVBUT19nZXRfZXhfbmV3X2luZGV4KCkgaW4KICAgICBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9pZHgoKSwgd2hpY2ggaXMgdXNlZCBpbgogICAgIHNzbF92ZXJpZnlfY2VydF9jaGFpbigpIGFuZCB0aHVzIGNhbiBiZSBjYWxsZWQgYXQgYW55IHRpbWUKICAgICBkdXJpbmcgVExTL1NTTCBoYW5kc2hha2VzIHNvIHRoYXQgdGhyZWFkLXNhZmV0eSBpcyBlc3NlbnRpYWwuCiAgICAgVW5mb3J0dW5hdGVseSwgdGhlIGV4X2RhdGEgZGVzaWduIGlzIG5vdCBhdCBhbGwgc3VpdGVkCiAgICAgZm9yIG11bHRpLXRocmVhZGVkIHVzZSwgc28gaXQgcHJvYmFibHkgc2hvdWxkIGJlIGFib2xpc2hlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGRlZCBCcm9hZGNvbSAidWJzZWMiIEVOR0lORSB0byBPcGVuU1NMLgogICAgIFtCcm9hZGNvbSwgdHdlYWtlZCBhbmQgaW50ZWdyYXRlZCBieSBHZW9mZiBUaG9ycGVdCgogICopIE1vdmUgY29tbW9uIGV4dGVuc2lvbiBwcmludGluZyBjb2RlIHRvIG5ldyBmdW5jdGlvbgogICAgIFg1MDlWM19wcmludF9leHRlbnNpb25zKCkuIFJlb3JnYW5pc2UgT0NTUCBwcmludCByb3V0aW5lcyBhbmQKICAgICBpbXBsZW1lbnQgc29tZSBuZWVkZWQgT0NTUCBBU04xIGZ1bmN0aW9ucy4gQWRkIE9DU1AgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOV9zaWduYXR1cmVfcHJpbnQoKSB0byByZW1vdmUgZHVwbGljYXRpb24gaW4gc29tZQogICAgIHByaW50IHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHNwZWNpYWwgbWVhbmluZyB3aGVuIFNFVCBPRiBhbmQgU0VRVUVOQ0UgT0YgZmxhZ3MgYXJlIGJvdGgKICAgICBzZXQgKHRoaXMgd2FzIHRyZWF0ZWQgZXhhY3RseSB0aGUgc2FtZSBhcyBTRVQgT0YgcHJldmlvdXNseSkuIFRoaXMKICAgICBpcyB1c2VkIHRvIHJlb3JkZXIgdGhlIFNUQUNLIHJlcHJlc2VudGluZyB0aGUgc3RydWN0dXJlIHRvIG1hdGNoIHRoZQogICAgIGVuY29kaW5nLiBUaGlzIHdpbGwgYmUgdXNlZCB0byBnZXQgcm91bmQgYSBwcm9ibGVtIHdoZXJlIGEgUEtDUzcKICAgICBzdHJ1Y3R1cmUgd2hpY2ggd2FzIHNpZ25lZCBjb3VsZCBub3QgYmUgdmVyaWZpZWQgYmVjYXVzZSB0aGUgU1RBQ0sKICAgICBvcmRlciBkaWQgbm90IHJlZmxlY3QgdGhlIGVuY29kZWQgb3JkZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVpbXBsZW1lbnQgdGhlIE9DU1AgQVNOMSBtb2R1bGUgdXNpbmcgdGhlIG5ldyBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSB0aGUgWDUwOVYzIGNvZGUgdG8gcGVybWl0IHRoZSB1c2Ugb2YgYW4gQVNOMV9JVEVNIHN0cnVjdHVyZQogICAgIGZvciBpdHMgQVNOMSBvcGVyYXRpb25zLiBUaGUgb2xkIHN0eWxlIGZ1bmN0aW9uIHBvaW50ZXJzIHN0aWxsIGV4aXN0CiAgICAgZm9yIG5vdyBidXQgdGhleSB3aWxsIGV2ZW50dWFsbHkgZ28gYXdheS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNZXJnZSBpbiByZXBsYWNlbWVudCBBU04xIGNvZGUgZnJvbSB0aGUgQVNOMSBicmFuY2guIFRoaXMgYWxtb3N0CiAgICAgY29tcGxldGVseSByZXBsYWNlcyB0aGUgb2xkIEFTTjEgZnVuY3Rpb25hbGl0eSB3aXRoIGEgdGFibGUgZHJpdmVuCiAgICAgZW5jb2RlciBhbmQgZGVjb2RlciB3aGljaCBpbnRlcnByZXRzIGFuIEFTTjFfSVRFTSBzdHJ1Y3R1cmUgZGVzY3JpYmluZwogICAgIHRoZSBBU04xIG1vZHVsZS4gQ29tcGF0aWJpbGl0eSB3aXRoIHRoZSBleGlzdGluZyBBU04xIEFQSSAoaTJkLGQyaSkgaXMKICAgICBsYXJnZWx5IG1haW50YWluZWQuIEFsbW9zdCBhbGwgb2YgdGhlIG9sZCBhc24xX21hYy5oIG1hY3JvIGJhc2VkIEFTTjEKICAgICBoYXMgYWxzbyBiZWVuIGNvbnZlcnRlZCB0byB0aGUgbmV3IGZvcm0uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIEJOX21vZF9leHBfcmVjcCBzbyB0aGF0IG5lZ2F0aXZlIG1vZHVsaSBhcmUgdG9sZXJhdGVkCiAgICAgKHRoZSBzaWduIGlzIGlnbm9yZWQpLiAgU2ltaWxhcmx5LCBpZ25vcmUgdGhlIHNpZ24gaW4gQk5fTU9OVF9DVFhfc2V0CiAgICAgc28gdGhhdCBCTl9tb2RfZXhwX21vbnQgYW5kIEJOX21vZF9leHBfbW9udF93b3JkIHdvcmsKICAgICBmb3IgbmVnYXRpdmUgbW9kdWxpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBCTl91YWRkIGFuZCBCTl91c3ViOiBBbHdheXMgcmV0dXJuIG5vbi1uZWdhdGl2ZSByZXN1bHRzIGluc3RlYWQKICAgICBvZiBub3QgdG91Y2hpbmcgdGhlIHJlc3VsdCdzIHNpZ24gYml0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJOX2RpdiBidWdmaXg6IElmIHRoZSByZXN1bHQgaXMgMCwgdGhlIHNpZ24gKHJlcy0+bmVnKSBtdXN0IG5vdCBiZQogICAgIHNldC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2VkIHRoZSBMSEFTSCBjb2RlIHRvIHVzZSBwcm90b3R5cGVzIGZvciBjYWxsYmFja3MsIGFuZCBjcmVhdGVkCiAgICAgbWFjcm9zIHRvIGRlY2xhcmUgYW5kIGltcGxlbWVudCB0aGluIChvcHRpb25hbGx5IHN0YXRpYykgZnVuY3Rpb25zCiAgICAgdGhhdCBwcm92aWRlIHR5cGUtc2FmZXR5IGFuZCBhdm9pZCBmdW5jdGlvbiBwb2ludGVyIGNhc3RpbmcgZm9yIHRoZQogICAgIHR5cGUtc3BlY2lmaWMgY2FsbGJhY2tzLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZGVkIEtlcmJlcm9zIENpcGhlciBTdWl0ZXMgdG8gYmUgdXNlZCB3aXRoIFRMUywgYXMgd3JpdHRlbiBpbgogICAgIFJGQyAyNzEyLgogICAgIFtWZWVycyBTdGFhdHMgPHN0YWF0c3ZyQGFzYy5ocGMubWlsPiwKICAgICAgSmVmZnJleSBBbHRtYW4gPGphbHRtYW5AY29sdW1iaWEuZWR1PiwgdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmVmb3JtYXQgdGhlIEZBUSBzbyB0aGUgZGlmZmVyZW50IHF1ZXN0aW9ucyBhbmQgYW5zd2VycyBjYW4gYmUgZGl2aWRlZAogICAgIGluIHNlY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgc3ViamVjdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBIYXZlIHRoZSB6bGliIGNvbXByZXNzaW9uIGNvZGUgbG9hZCBaTElCLkRMTCBkeW5hbWljYWxseSB1bmRlcgogICAgIFdpbmRvd3MuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX21vZF9zcXJ0IGZvciBjb21wdXRpbmcgc3F1YXJlIHJvb3RzIG1vZHVsbyBhIHByaW1lCiAgICAgKHVzaW5nIHRoZSBwcm9iYWJpbGlzdGljIFRvbmVsbGktU2hhbmtzIGFsZ29yaXRobSB1bmxlc3MKICAgICBwID09IDMgKG1vZCA0KSAgb3IgIHAgPT0gNSAobW9kIDgpLCAgd2hpY2ggYXJlIGNhc2VzIHRoYXQgY2FuCiAgICAgYmUgaGFuZGxlZCBkZXRlcm1pbmlzdGljYWxseSkuCiAgICAgW0xlbmthIEZpYmlrb3ZhIDxmaWJpa292YUBleHAtbWF0aC51bmktZXNzZW4uZGU+LCBCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgQk5fbW9kX2ludmVyc2UgZmFzdGVyIGJ5IGV4cGxpY2l0bHkgaGFuZGxpbmcgc21hbGwgcXVvdGllbnRzCiAgICAgaW4gdGhlIEV1Y2xpZCBsb29wLiAoU3BlZWQgZ2FpbiBhYm91dCAyMCUgZm9yIHNtYWxsIG1vZHVsaSBbMjU2IG9yCiAgICAgNTEyIGJpdHNdLCBhYm91dCAzMCUgZm9yIGxhcmdlciBvbmVzIFsxMDI0IG9yIDIwNDggYml0c10uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBCTl9rcm9uZWNrZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IEJOX2djZCBzbyB0aGF0IGl0IHdvcmtzIG9uIG5lZ2F0aXZlIGlucHV0czsgdGhlIHJlc3VsdCBpcwogICAgIHBvc2l0aXZlIHVubGVzcyBib3RoIHBhcmFtZXRlcnMgYXJlIHplcm8uCiAgICAgUHJldmlvdXNseSBzb21ldGhpbmcgcmVhc29uYWJseSBjbG9zZSB0byBhbiBpbmZpbml0ZSBsb29wIHdhcwogICAgIHBvc3NpYmxlIGJlY2F1c2UgbnVtYmVycyBjb3VsZCBiZSBncm93aW5nIGluc3RlYWQgb2Ygc2hyaW5raW5nCiAgICAgaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIEV1Y2xpZCdzIGFsZ29yaXRobS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQk5faXNfd29yZCgpIGFuZCBCTl9pc19vbmUoKSBtYWNyb3MgdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlCiAgICAgc2lnbiBvZiB0aGUgbnVtYmVyIGluIHF1ZXN0aW9uLgoKICAgICBGaXggQk5faXNfd29yZChhLHcpIHRvIHdvcmsgY29ycmVjdGx5IGZvciB3ID09IDAuCgogICAgIFRoZSBvbGQgQk5faXNfd29yZChhLHcpIG1hY3JvIGlzIG5vdyBjYWxsZWQgQk5fYWJzX2lzX3dvcmQoYSx3KQogICAgIGJlY2F1c2UgaXRzIHRlc3QgaWYgdGhlIGFic29sdXRlIHZhbHVlIG9mICdhJyBlcXVhbHMgJ3cnLgogICAgIE5vdGUgdGhhdCBCTl9hYnNfaXNfd29yZCBkb2VzICpub3QqIGhhbmRsZSB3ID09IDAgcmVsaWFibHk7CiAgICAgaXQgZXhpc3RzIG1vc3RseSBmb3IgdXNlIGluIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgQk5faXNfemVybygpLAogICAgIEJOX2lzX29uZSgpLCBhbmQgQk5faXNfd29yZCgpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBCTl9zd2FwLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVzZSBCTl9ubm1vZCBpbnN0ZWFkIG9mIEJOX21vZCBpbiBjcnlwdG8vYm4vYm5fZXhwLmMgc28gdGhhdAogICAgIHRoZSBleHBvbmVudGlhdGlvbiBmdW5jdGlvbnMgYXJlIG1vcmUgbGlrZWx5IHRvIHByb2R1Y2UgcmVhc29uYWJsZQogICAgIHJlc3VsdHMgb24gbmVnYXRpdmUgaW5wdXRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBCTl9tb2RfbXVsIHNvIHRoYXQgdGhlIHJlc3VsdCBpcyBhbHdheXMgbm9uLW5lZ2F0aXZlLgogICAgIFByZXZpb3VzbHksIGl0IGNvdWxkIGJlIG5lZ2F0aXZlIGlmIG9uZSBvZiB0aGUgZmFjdG9ycyB3YXMgbmVnYXRpdmU7CiAgICAgSSBkb24ndCB0aGluayBhbnlvbmUgcmVhbGx5IHdhbnRlZCB0aGF0IGJlaGF2aW91ci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNb3ZlIEJOX21vZF8uLi4gZnVuY3Rpb25zIGludG8gbmV3IGZpbGUgY3J5cHRvL2JuL2JuX21vZC5jCiAgICAgKGV4Y2VwdCBmb3IgZXhwb25lbnRpYXRpb24sIHdoaWNoIHN0YXlzIGluIGNyeXB0by9ibi9ibl9leHAuYywKICAgICBhbmQgQk5fbW9kX211bF9yZWNpcHJvY2FsLCB3aGljaCBzdGF5cyBpbiBjcnlwdG8vYm4vYm5fcmVjcC5jKQogICAgIGFuZCBhZGQgbmV3IGZ1bmN0aW9uczoKCiAgICAgICAgICBCTl9ubm1vZAogICAgICAgICAgQk5fbW9kX3NxcgogICAgICAgICAgQk5fbW9kX2FkZAogICAgICAgICAgQk5fbW9kX2FkZF9xdWljawogICAgICAgICAgQk5fbW9kX3N1YgogICAgICAgICAgQk5fbW9kX3N1Yl9xdWljawogICAgICAgICAgQk5fbW9kX2xzaGlmdDEKICAgICAgICAgIEJOX21vZF9sc2hpZnQxX3F1aWNrCiAgICAgICAgICBCTl9tb2RfbHNoaWZ0CiAgICAgICAgICBCTl9tb2RfbHNoaWZ0X3F1aWNrCgogICAgIFRoZXNlIGZ1bmN0aW9ucyBhbHdheXMgZ2VuZXJhdGUgbm9uLW5lZ2F0aXZlIHJlc3VsdHMuCgogICAgIEJOX25ubW9kIG90aGVyd2lzZSBpcyBsaWtlIEJOX21vZCAoaWYgQk5fbW9kIGNvbXB1dGVzIGEgcmVtYWluZGVyICByCiAgICAgc3VjaCB0aGF0ICB8bXwgPCByIDwgMCwgIEJOX25ubW9kIHdpbGwgb3V0cHV0ICByZW0gKyB8bXwgIGluc3RlYWQpLgoKICAgICBCTl9tb2RfWFhYX3F1aWNrKHIsIGEsIFtiLF0gbSkgZ2VuZXJhdGVzIHRoZSBzYW1lIHJlc3VsdCBhcwogICAgIEJOX21vZF9YWFgociwgYSwgW2IsXSBtLCBjdHgpLCBidXQgcmVxdWlyZXMgdGhhdCAgYSAgW2FuZCAgYl0KICAgICBiZSByZWR1Y2VkIG1vZHVsbyAgbS4KICAgICBbTGVua2EgRmliaWtvdmEgPGZpYmlrb3ZhQGV4cC1tYXRoLnVuaS1lc3Nlbi5kZT4sIEJvZG8gTW9lbGxlcl0KCiNpZiAwCiAgICAgVGhlIGZvbGxvd2luZyBlbnRyeSBhY2NpZGVudGFsbHkgYXBwZWFyZWQgaW4gdGhlIENIQU5HRVMgZmlsZQogICAgIGRpc3RyaWJ1dGVkIHdpdGggT3BlblNTTCAwLjkuNy4gIFRoZSBtb2RpZmljYXRpb25zIGRlc2NyaWJlZCBpbgogICAgIGl0IGRvICpub3QqIGFwcGx5IHRvIE9wZW5TU0wgMC45LjcuCgogICopIFJlbW92ZSBhIGZldyBjYWxscyB0byBibl93ZXhwYW5kKCkgaW4gQk5fc3FyKCkgKHRoZSBvbmUgaW4gdGhlcmUKICAgICB3YXMgYWN0dWFsbHkgbmV2ZXIgbmVlZGVkKSBhbmQgaW4gQk5fbXVsKCkuICBUaGUgcmVtb3ZhbCBpbiBCTl9tdWwoKQogICAgIHJlcXVpcmVkIGEgc21hbGwgY2hhbmdlIGluIGJuX211bF9wYXJ0X3JlY3Vyc2l2ZSgpIGFuZCB0aGUgYWRkaXRpb24KICAgICBvZiB0aGUgZnVuY3Rpb25zIGJuX2NtcF9wYXJ0X3dvcmRzKCksIGJuX3N1Yl9wYXJ0X3dvcmRzKCkgYW5kCiAgICAgYm5fYWRkX3BhcnRfd29yZHMoKSwgd2hpY2ggZG8gdGhlIHNhbWUgdGhpbmcgYXMgYm5fY21wX3dvcmRzKCksCiAgICAgYm5fc3ViX3dvcmRzKCkgYW5kIGJuX2FkZF93b3JkcygpIGV4Y2VwdCB0aGV5IHRha2UgYXJyYXlzIHdpdGgKICAgICBkaWZmZXJpbmcgc2l6ZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KI2VuZGlmCgogICopIEluICdvcGVuc3NsIHBhc3N3ZCcsIHZlcmlmeSBwYXNzd29yZHMgcmVhZCBmcm9tIHRoZSB0ZXJtaW5hbAogICAgIHVubGVzcyB0aGUgJy1zYWx0JyBvcHRpb24gaXMgdXNlZCAod2hpY2ggdXN1YWxseSBtZWFucyB0aGF0CiAgICAgdmVyaWZpY2F0aW9uIHdvdWxkIGp1c3Qgd2FzdGUgdXNlcidzIHRpbWUgc2luY2UgdGhlIHJlc3VsdGluZwogICAgIGhhc2ggaXMgZ29pbmcgdG8gYmUgY29tcGFyZWQgd2l0aCBzb21lIGdpdmVuIHBhc3N3b3JkIGhhc2gpCiAgICAgb3IgdGhlIG5ldyAnLW5vdmVyaWZ5JyBvcHRpb24gaXMgdXNlZC4KCiAgICAgVGhpcyBpcyBhbiBpbmNvbXBhdGlibGUgY2hhbmdlLCBidXQgaXQgZG9lcyBub3QgYWZmZWN0CiAgICAgbm9uLWludGVyYWN0aXZlIHVzZSBvZiAnb3BlbnNzbCBwYXNzd2QnIChwYXNzd29yZHMgb24gdGhlIGNvbW1hbmQKICAgICBsaW5lLCAnLXN0ZGluJyBvcHRpb24sICctaW4gLi4uJyBvcHRpb24pIGFuZCB0aHVzIHNob3VsZCBub3QKICAgICBjYXVzZSBhbnkgcHJvYmxlbXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVtb3ZlIGFsbCByZWZlcmVuY2VzIHRvIFJTQXJlZiwgc2luY2UgdGhlcmUncyBubyBtb3JlIG5lZWQgZm9yIGl0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgRFNPIGxvYWQgYWxvbmcgYSBwYXRoIGdpdmVuIHRocm91Z2ggYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKICAgICAoU0hMSUJfUEFUSCkgd2l0aCBzaGxfbG9hZCgpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENvbnN0aWZ5IHRoZSBFTkdJTkUgY29kZSBhcyBhIHJlc3VsdCBvZiBCSUdOVU0gY29uc3RpZmljYXRpb24uCiAgICAgQWxzbyBjb25zdGlmeSB0aGUgUlNBIGNvZGUgYW5kIG1vc3QgdGhpbmdzIHJlbGF0ZWQgdG8gaXQuICBJbiBhCiAgICAgZmV3IHBsYWNlcywgbW9zdCBub3RhYmxlIGluIHRoZSBkZXB0aCBvZiB0aGUgQVNOLjEgY29kZSwgdWdseQogICAgIGNhc3RzIGJhY2sgdG8gbm9uLWNvbnN0IHdlcmUgcmVxdWlyZWQgKHRvIGJlIHNvbHZlZCBhdCBhIGxhdGVyCiAgICAgdGltZSkKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHNvIHRoZSBvcGVuc3NsIGFwcGxpY2F0aW9uIGhhcyBhbGwgZW5naW5lcyBsb2FkZWQgYnkgZGVmYXVsdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDb25zdGlmeSB0aGUgQklHTlVNIHJvdXRpbmVzIGEgbGl0dGxlIG1vcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zOgoKCUVOR0lORV9sb2FkX2Nzd2lmdCgpCglFTkdJTkVfbG9hZF9jaGlsKCkKCUVOR0lORV9sb2FkX2F0YWxsYSgpCglFTkdJTkVfbG9hZF9udXJvbigpCglFTkdJTkVfbG9hZF9idWlsdGluX2VuZ2luZXMoKQoKICAgICBUaGF0IHdheSwgYW4gYXBwbGljYXRpb24gY2FuIGl0c2VsZiBjaG9vc2UgaWYgZXh0ZXJuYWwgZW5naW5lcyB0aGF0CiAgICAgYXJlIGJ1aWx0LWluIGluIE9wZW5TU0wgc2hhbGwgZXZlciBiZSB1c2VkIG9yIG5vdC4gIFRoZSBiZW5lZml0IGlzCiAgICAgdGhhdCBhcHBsaWNhdGlvbnMgd29uJ3QgaGF2ZSB0byBiZSBsaW5rZWQgd2l0aCBsaWJkbCBvciBvdGhlciBkc28KICAgICBsaWJyYXJpZXMgdW5sZXNzIGl0J3MgcmVhbGx5IG5lZWRlZC4KCiAgICAgQ2hhbmdlZCAnb3BlbnNzbCBlbmdpbmUnIHRvIGxvYWQgYWxsIGVuZ2luZXMgb24gZGVtYW5kLgogICAgIENoYW5nZWQgdGhlIGVuZ2luZSBoZWFkZXIgZmlsZXMgdG8gYXZvaWQgdGhlIGR1cGxpY2F0aW9uIG9mIHNvbWUKICAgICBkZWNsYXJhdGlvbnMgKHRoZXkgZGlmZmVyZWQhKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSAnb3BlbnNzbCBlbmdpbmUnIGNhbiBub3cgbGlzdCBjYXBhYmlsaXRpZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQmV0dGVyIGVycm9yIHJlcG9ydGluZyBpbiAnb3BlbnNzbCBlbmdpbmUnLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldmVyIGNhbGwgbG9hZF9kaF9wYXJhbShOVUxMKSBpbiBzX3NlcnZlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgZW5naW5lIGFwcGxpY2F0aW9uLiAgSXQgY2FuIGN1cnJlbnRseSBsaXN0IGVuZ2luZXMgYnkgbmFtZSBhbmQKICAgICBpZGVudGl0eSwgYW5kIHRlc3QgaWYgdGhleSBhcmUgYWN0dWFsbHkgYXZhaWxhYmxlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEltcHJvdmUgUlBNIHNwZWNpZmljYXRpb24gZmlsZSBieSBmb3JjaW5nIHN5bWJvbGljIGxpbmtpbmcgYW5kIG1ha2luZwogICAgIHN1cmUgdGhlIGluc3RhbGxlZCBkb2N1bWVudGF0aW9uIGlzIGFsc28gb3duZWQgYnkgcm9vdC5yb290LgogICAgIFtEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+XQoKICAqKSBHaXZlIHRoZSBPcGVuU1NMIGFwcGxpY2F0aW9ucyBtb3JlIHBvc3NpYmlsaXRpZXMgdG8gbWFrZSB1c2Ugb2YKICAgICBrZXlzIChwdWJsaWMgYXMgd2VsbCBhcyBwcml2YXRlKSBoYW5kbGVkIGJ5IGVuZ2luZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIE9DU1AgY29kZSB0aGF0IGNvbWVzIGZyb20gQ2VydENvLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBWTVMgc3VwcG9ydCBmb3IgdGhlIFJpam5kYWVsIGNvZGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkZWQgdW50ZXN0ZWQgc3VwcG9ydCBmb3IgTnVyb24gY3J5cHRvIGFjY2VsZXJhdG9yLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgZXh0ZXJuYWwgY3J5cHRvZ3JhcGhpYyBkZXZpY2VzLiAgVGhpcyBjb2RlIHdhcwogICAgIHByZXZpb3VzbHkgZGlzdHJpYnV0ZWQgc2VwYXJhdGVseSBhcyB0aGUgImVuZ2luZSIgYnJhbmNoLgogICAgIFtHZW9mZiBUaG9ycGUsIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmV3b3JrIHRoZSBmaWxlbmFtZS10cmFuc2xhdGlvbiBpbiB0aGUgRFNPIGNvZGUuIEl0IGlzIG5vdyBwb3NzaWJsZSB0bwogICAgIGhhdmUgZmFyIGdyZWF0ZXIgY29udHJvbCBvdmVyIGhvdyBhICJuYW1lIiBpcyB0dXJuZWQgaW50byBhIGZpbGVuYW1lCiAgICAgZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRpbmcgZW52aXJvbm1lbnQgYW5kIGFueSBvZGRpdGllcyBhYm91dCB0aGUKICAgICBkaWZmZXJlbnQgc2hhcmVkIGxpYnJhcnkgZmlsZW5hbWVzIG9uIGVhY2ggc3lzdGVtLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFN1cHBvcnQgdGhyZWFkcyBvbiBGcmVlQlNELWVsZiBpbiBDb25maWd1cmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IGZvciBTSEExIGFzc2VtYmx5IHByb2JsZW0gd2l0aCBNQVNNOiBpdCBwcm9kdWNlcwogICAgIHdhcm5pbmdzIGFib3V0IGNvcnJ1cHQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gd2hlbiBhc3NlbWJsaW5nCiAgICAgd2l0aCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uIFRoaXMgaXMgY2F1c2VkIGJ5IHRoZSBvdmVybGFwcGluZwogICAgIG9mIHR3byBzZWN0aW9ucy4KICAgICBbQmVybmQgTWF0dGhlcyA8bWFpbmJ1Z0BjZWxvY29tLmRlPiwgU3RldmUgSGVuc29uXQoKICAqKSBOQ09ORiBjaGFuZ2VzLgogICAgIE5DT05GX2dldF9udW1iZXIoKSBoYXMgbm8gZXJyb3IgY2hlY2tpbmcgYXQgYWxsLiAgQXMgYSByZXBsYWNlbWVudCwKICAgICBOQ09ORl9nZXRfbnVtYmVyX2UoKSBpcyBkZWZpbmVkIChfZSBmb3IgImVycm9yIGNoZWNraW5nIikgYW5kIGlzCiAgICAgcHJvbW90ZWQgc3Ryb25nbHkuICBUaGUgb2xkIE5DT05GX2dldF9udW1iZXIgaXMga2VwdCBhcm91bmQgZm9yCiAgICAgYmluYXJ5IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCiAgICAgTWFrZSBpdCBwb3NzaWJsZSBmb3IgbWV0aG9kcyB0byBsb2FkIGZyb20gc29tZXRoaW5nIG90aGVyIHRoYW4gYSBCSU8sCiAgICAgYnkgcHJvdmlkaW5nIGEgZnVuY3Rpb24gcG9pbnRlciB0aGF0IGlzIGdpdmVuIGEgbmFtZSBpbnN0ZWFkIG9mIGEgQklPLgogICAgIEZvciBleGFtcGxlLCB0aGlzIGNvdWxkIGJlIHVzZWQgdG8gbG9hZCBjb25maWd1cmF0aW9uIGRhdGEgZnJvbSBhbgogICAgIExEQVAgc2VydmVyLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBmb3Igbm9uIGJsb2NraW5nIGFjY2VwdCBCSU9zLiBBZGRlZCBuZXcgSS9PIHNwZWNpYWwgcmVhc29uCiAgICAgQklPX1JSX0FDQ0VQVCB0byBjb3ZlciB0aGlzIGNhc2UuIFByZXZpb3VzbHkgdXNlIG9mIGFjY2VwdCBCSU9zCiAgICAgd2l0aCBub24gYmxvY2tpbmcgSS9PIHdhcyBub3QgcG9zc2libGUgYmVjYXVzZSBubyByZXRyeSBjb2RlIHdhcwogICAgIGltcGxlbWVudGVkLiBBbHNvIGFkZGVkIG5ldyBTU0wgY29kZSBTU0xfV0FOVF9BQ0NFUFQgdG8gY292ZXIKICAgICB0aGlzIGNhc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgdGhlIGJlZ2lubmluZ3Mgb2YgUmlqbmRhZWwgc3VwcG9ydC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGZvciBidWcgaW4gRGlyZWN0b3J5U3RyaW5nIG1hc2sgc2V0dGluZy4gQWRkIHN1cHBvcnQgZm9yCiAgICAgWDUwOV9OQU1FX3ByaW50X2V4KCkgaW4gJ3JlcScgYW5kIFg1MDlfcHJpbnRfZXgoKSBmdW5jdGlvbgogICAgIHRvIGFsbG93IGNlcnRpZmljYXRlIHByaW50aW5nIHRvIG1vcmUgY29udHJvbGxhYmxlLCBhZGRpdGlvbmFsCiAgICAgJ2NlcnRvcHQnIG9wdGlvbiB0byAneDUwOScgdG8gYWxsb3cgbmV3IHByaW50aW5nIG9wdGlvbnMgdG8gYmUKICAgICBzZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2xlYW4gb2xkIEVBWSBNRDUgaGFjayBmcm9tIGVfb3MuaC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmwgYW5kIDAuOS42bSAgWzE3IE1hciAyMDA0XQoKICAqKSBGaXggbnVsbC1wb2ludGVyIGFzc2lnbm1lbnQgaW4gZG9fY2hhbmdlX2NpcGhlcl9zcGVjKCkgcmV2ZWFsZWQKICAgICBieSB1c2luZyB0aGUgQ29kZW5vbWljb24gVExTIFRlc3QgVG9vbCAoQ1ZFLTIwMDQtMDA3OSkKICAgICBbSm9lIE9ydG9uLCBTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ayBhbmQgMC45LjZsICBbMDQgTm92IDIwMDNdCgogICopIEZpeCBhZGRpdGlvbmFsIGJ1ZyByZXZlYWxlZCBieSB0aGUgTklTQ0MgdGVzdCBzdWl0ZToKCiAgICAgU3RvcCBidWcgdHJpZ2dlcmluZyBsYXJnZSByZWN1cnNpb24gd2hlbiBwcmVzZW50ZWQgd2l0aAogICAgIGNlcnRhaW4gQVNOLjEgdGFncyAoQ1ZFLTIwMDMtMDg1MSkKICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmogYW5kIDAuOS42ayAgWzMwIFNlcCAyMDAzXQoKICAqKSBGaXggdmFyaW91cyBidWdzIHJldmVhbGVkIGJ5IHJ1bm5pbmcgdGhlIE5JU0NDIHRlc3Qgc3VpdGU6CgogICAgIFN0b3Agb3V0IG9mIGJvdW5kcyByZWFkcyBpbiB0aGUgQVNOMSBjb2RlIHdoZW4gcHJlc2VudGVkIHdpdGgKICAgICBpbnZhbGlkIHRhZ3MgKENWRS0yMDAzLTA1NDMgYW5kIENWRS0yMDAzLTA1NDQpLgogICAgIAogICAgIElmIHZlcmlmeSBjYWxsYmFjayBpZ25vcmVzIGludmFsaWQgcHVibGljIGtleSBlcnJvcnMgZG9uJ3QgdHJ5IHRvIGNoZWNrCiAgICAgY2VydGlmaWNhdGUgc2lnbmF0dXJlIHdpdGggdGhlIE5VTEwgcHVibGljIGtleS4KCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gc3NsM19hY2NlcHQoKSAoc3NsL3MzX3NydnIuYykgb25seSBhY2NlcHQgYSBjbGllbnQgY2VydGlmaWNhdGUKICAgICBpZiB0aGUgc2VydmVyIHJlcXVlc3RlZCBvbmU6IGFzIHN0YXRlZCBpbiBUTFMgMS4wIGFuZCBTU0wgMy4wCiAgICAgc3BlY2lmaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gc3NsM19nZXRfY2xpZW50X2hlbGxvKCkgKHNzbC9zM19zcnZyLmMpLCB0b2xlcmF0ZSBhZGRpdGlvbmFsCiAgICAgZXh0cmEgZGF0YSBhZnRlciB0aGUgY29tcHJlc3Npb24gbWV0aG9kcyBub3Qgb25seSBmb3IgVExTIDEuMAogICAgIGJ1dCBhbHNvIGZvciBTU0wgMy4wIChhcyByZXF1aXJlZCBieSB0aGUgc3BlY2lmaWNhdGlvbikuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBNYXR0aGlhcyBMb2VwZmVdCgogICopIENoYW5nZSBYNTA5X2NlcnRpZmljYXRlX3R5cGUoKSB0byBtYXJrIHRoZSBrZXkgYXMgZXhwb3J0ZWQvZXhwb3J0YWJsZQogICAgIHdoZW4gaXQncyA1MTIgKmJpdHMqIGxvbmcsIG5vdCA1MTIgYnl0ZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZpIGFuZCAwLjkuNmogIFsxMCBBcHIgMjAwM10KCiAgKikgQ291bnRlcm1lYXN1cmUgYWdhaW5zdCB0aGUgS2xpbWEtUG9rb3JueS1Sb3NhIGV4dGVuc2lvbiBvZgogICAgIEJsZWljaGJhY2hlcidzIGF0dGFjayBvbiBQS0NTICMxIHYxLjUgcGFkZGluZzogdHJlYXQKICAgICBhIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIG1pc21hdGNoIGxpa2UgYSBkZWNyeXB0aW9uIGVycm9yCiAgICAgaW4gc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSAoc3NsL3MzX3NydnIuYykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVHVybiBvbiBSU0EgYmxpbmRpbmcgYnkgZGVmYXVsdCBpbiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgogICAgIHRvIGF2b2lkIGEgdGltaW5nIGF0dGFjay4gQXBwbGljYXRpb25zIHRoYXQgZG9uJ3Qgd2FudCBpdCBjYW4gY2FsbAogICAgIFJTQV9ibGluZGluZ19vZmYoKSBvciB1c2UgdGhlIG5ldyBmbGFnIFJTQV9GTEFHX05PX0JMSU5ESU5HLgogICAgIFRoZXkgd291bGQgYmUgaWxsLWFkdmlzZWQgdG8gZG8gc28gaW4gbW9zdCBjYXNlcy4KICAgICBbQmVuIExhdXJpZSwgU3RldmUgSGVuc29uLCBHZW9mZiBUaG9ycGUsIEJvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIFJTQSBibGluZGluZyBjb2RlIHNvIHRoYXQgaXQgd29ya3Mgd2hlbiB0aGUgUFJORyBpcyBub3QKICAgICBzZWVkZWQgKGluIHRoaXMgY2FzZSwgdGhlIHNlY3JldCBSU0EgZXhwb25lbnQgaXMgYWJ1c2VkIGFzCiAgICAgYW4gdW5wcmVkaWN0YWJsZSBzZWVkIC0tIGlmIGl0IGlzIG5vdCB1bnByZWRpY3RhYmxlLCB0aGVyZQogICAgIGlzIG5vIHBvaW50IGluIGJsaW5kaW5nIGFueXdheSkuICBNYWtlIFJTQSBibGluZGluZyB0aHJlYWQtc2FmZQogICAgIGJ5IHJlbWVtYmVyaW5nIHRoZSBjcmVhdG9yJ3MgdGhyZWFkIElEIGluIHJzYS0+YmxpbmRpbmcgYW5kCiAgICAgaGF2aW5nIGFsbCBvdGhlciB0aHJlYWRzIHVzZSBsb2NhbCBvbmUtdGltZSBibGluZGluZyBmYWN0b3JzCiAgICAgKHRoaXMgcmVxdWlyZXMgbW9yZSBjb21wdXRhdGlvbiB0aGFuIHNoYXJpbmcgcnNhLT5ibGluZGluZywgYnV0CiAgICAgYXZvaWRzIGV4Y2Vzc2l2ZSBsb2NraW5nOyBhbmQgaWYgYW4gUlNBIG9iamVjdCBpcyBub3Qgc2hhcmVkCiAgICAgYmV0d2VlbiB0aHJlYWRzLCBibGluZGluZyB3aWxsIHN0aWxsIGJlIHZlcnkgZmFzdCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZoIGFuZCAwLjkuNmkgIFsxOSBGZWIgMjAwM10KCiAgKikgSW4gc3NsM19nZXRfcmVjb3JkIChzc2wvczNfcGt0LmMpLCBtaW5pbWl6ZSBpbmZvcm1hdGlvbiBsZWFrZWQKICAgICB2aWEgdGltaW5nIGJ5IHBlcmZvcm1pbmcgYSBNQUMgY29tcHV0YXRpb24gZXZlbiBpZiBpbmNvcnJyZWN0CiAgICAgYmxvY2sgY2lwaGVyIHBhZGRpbmcgaGFzIGJlZW4gZm91bmQuICBUaGlzIGlzIGEgY291bnRlcm1lYXN1cmUKICAgICBhZ2FpbnN0IGFjdGl2ZSBhdHRhY2tzIHdoZXJlIHRoZSBhdHRhY2tlciBoYXMgdG8gZGlzdGluZ3Vpc2gKICAgICBiZXR3ZWVuIGJhZCBwYWRkaW5nIGFuZCBhIE1BQyB2ZXJpZmljYXRpb24gZXJyb3IuIChDVkUtMjAwMy0wMDc4KQoKICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEJyaWNlIENhbnZlbCAoRVBGTCksCiAgICAgQWxhaW4gSGlsdGdlbiAoVUJTKSwgU2VyZ2UgVmF1ZGVuYXkgKEVQRkwpLCBhbmQKICAgICBNYXJ0aW4gVnVhZ25vdXggKEVQRkwsIElsaW9uKV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZnIGFuZCAwLjkuNmggIFs1IERlYyAyMDAyXQoKICAqKSBOZXcgZnVuY3Rpb24gT1BFTlNTTF9jbGVhbnNlKCksIHdoaWNoIGlzIHVzZWQgdG8gY2xlYW5zZSBhIHNlY3Rpb24gb2YKICAgICBtZW1vcnkgZnJvbSBpdCdzIGNvbnRlbnRzLiAgVGhpcyBpcyBkb25lIHdpdGggYSBjb3VudGVyIHRoYXQgd2lsbAogICAgIHBsYWNlIGFsdGVybmF0aW5nIHZhbHVlcyBpbiBlYWNoIGJ5dGUuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHNvbHZlCiAgICAgdHdvIGlzc3VlczogMSkgdGhlIHJlbW92YWwgb2YgY2FsbHMgdG8gbWVtc2V0KCkgYnkgaGlnaGx5IG9wdGltaXppbmcKICAgICBjb21waWxlcnMsIGFuZCAyKSBjbGVhbnNpbmcgd2l0aCBvdGhlciB2YWx1ZXMgdGhhbiAwLCBzaW5jZSB0aG9zZSBjYW4KICAgICBiZSByZWFkIHRocm91Z2ggb24gY2VydGFpbiBtZWRpYSwgZm9yIGV4YW1wbGUgYSBzd2FwIHNwYWNlIG9uIGRpc2suCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQnVnZml4OiBjbGllbnQgc2lkZSBzZXNzaW9uIGNhY2hpbmcgZGlkIG5vdCB3b3JrIHdpdGggZXh0ZXJuYWwgY2FjaGluZywKICAgICBiZWNhdXNlIHRoZSBzZXNzaW9uLT5jaXBoZXIgc2V0dGluZyB3YXMgbm90IHJlc3RvcmVkIHdoZW4gcmVsb2FkaW5nCiAgICAgZnJvbSB0aGUgZXh0ZXJuYWwgY2FjaGUuIFRoaXMgcHJvYmxlbSB3YXMgbWFza2VkLCB3aGVuCiAgICAgU1NMX09QX05FVFNDQVBFX1JFVVNFX0NJUEhFUl9DSEFOR0VfQlVHIChwYXJ0IG9mIFNTTF9PUF9BTEwpIHdhcyBzZXQuCiAgICAgKEZvdW5kIGJ5IFN0ZXZlIEhhc2xhbSA8c3RldmVAYXJhcW5pZC5kZHRzLm5ldD4uKQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggY2xpZW50X2NlcnRpZmljYXRlIChzc2wvczJfY2xudC5jKTogVGhlIHBlcm1pc3NpYmxlIHRvdGFsCiAgICAgbGVuZ3RoIG9mIHRoZSBSRVFVRVNULUNFUlRJRklDQVRFIG1lc3NhZ2UgaXMgMTggLi4gMzQsIG5vdCAxNyAuLiAzMy4KICAgICBbWmVldiBMaWViZXIgPHplZXYtbEB5YWhvby5jb20+XQoKICAqKSBVbmRvIGFuIHVuZG9jdW1lbnRlZCBjaGFuZ2UgaW50cm9kdWNlZCBpbiAwLjkuNmUgd2hpY2ggY2F1c2VkCiAgICAgcmVwZWF0ZWQgY2FsbHMgdG8gT3BlblNTTF9hZGRfYWxsX2NpcGhlcnMoKSBhbmQgCiAgICAgT3BlblNTTF9hZGRfYWxsX2RpZ2VzdHMoKSB0byBiZSBpZ25vcmVkLCBldmVuIGFmdGVyIGNhbGxpbmcKICAgICBFVlBfY2xlYW51cCgpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHJlYWRlciB0byBkZWFsIHdpdGggbGFzdCBsaW5lIG5vdAogICAgIGJlaW5nIHByb3Blcmx5IHRlcm1pbmF0ZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIFg1MDlfTkFNRV9jbXAoKSBzbyBpdCBhcHBsaWVzIHRoZSBzcGVjaWFsIHJ1bGVzIG9uIGhhbmRsaW5nCiAgICAgRE4gdmFsdWVzIHRoYXQgYXJlIG9mIHR5cGUgUHJpbnRhYmxlU3RyaW5nLCBhcyB3ZWxsIGFzIFJETnMgb2YgdHlwZQogICAgIGVtYWlsQWRkcmVzcyB3aGVyZSB0aGUgdmFsdWUgaGFzIHRoZSB0eXBlIGlhNVN0cmluZy4KICAgICBbc3RlZmFua0B2YWxpY2VydC5jb20gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGEgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfU1RPUkUgZmxhZyB0byB0YWtlIG92ZXIgaGFsZgogICAgIHRoZSBqb2IgU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQIHdhcyBpbmNvbnNpc3RlbnRseQogICAgIGRvaW5nLCBkZWZpbmUgYSBuZXcgZmxhZyAoU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUwpIHRvIGJlCiAgICAgdGhlIGJpdHdpc2UtT1Igb2YgdGhlIHR3byBmb3IgdXNlIGJ5IHRoZSBtYWpvcml0eSBvZiBhcHBsaWNhdGlvbnMKICAgICB3YW50aW5nIHRoaXMgYmVoYXZpb3VyLCBhbmQgdXBkYXRlIHRoZSBkb2NzLiBUaGUgZG9jdW1lbnRlZAogICAgIGJlaGF2aW91ciBhbmQgYWN0dWFsIGJlaGF2aW91ciB3ZXJlIGluY29uc2lzdGVudCBhbmQgaGFkIGJlZW4KICAgICBjaGFuZ2luZyBhbnl3YXksIHNvIHRoaXMgaXMgbW9yZSBhIGJ1Zy1maXggdGhhbiBhIGJlaGF2aW91cmFsCiAgICAgY2hhbmdlLgogICAgIFtHZW9mZiBUaG9ycGUsIGRpYWdub3NlZCBieSBOYWRhdiBIYXInRWxdCgogICopIERvbid0IGltcG9zZSBhIDE2LWJ5dGUgbGVuZ3RoIG1pbmltdW0gb24gc2Vzc2lvbiBJRHMgaW4gc3NsL3MzX2NsbnQuYwogICAgICh0aGUgU1NMIDMuMCBhbmQgVExTIDEuMCBzcGVjaWZpY2F0aW9ucyBhbGxvdyBhbnkgbGVuZ3RoIHVwIHRvIDMyIGJ5dGVzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggaW5pdGlhbGl6YXRpb24gY29kZSByYWNlIGNvbmRpdGlvbnMgaW4KICAgICAgICBTU0x2MjNfbWV0aG9kKCksICBTU0x2MjNfY2xpZW50X21ldGhvZCgpLCAgIFNTTHYyM19zZXJ2ZXJfbWV0aG9kKCksCiAgICAgICAgU1NMdjJfbWV0aG9kKCksICAgU1NMdjJfY2xpZW50X21ldGhvZCgpLCAgICBTU0x2Ml9zZXJ2ZXJfbWV0aG9kKCksCiAgICAgICAgU1NMdjNfbWV0aG9kKCksICAgU1NMdjNfY2xpZW50X21ldGhvZCgpLCAgICBTU0x2M19zZXJ2ZXJfbWV0aG9kKCksCiAgICAgICAgVExTdjFfbWV0aG9kKCksICAgVExTdjFfY2xpZW50X21ldGhvZCgpLCAgICBUTFN2MV9zZXJ2ZXJfbWV0aG9kKCksCiAgICAgICAgc3NsMl9nZXRfY2lwaGVyX2J5X2NoYXIoKSwKICAgICAgICBzc2wzX2dldF9jaXBoZXJfYnlfY2hhcigpLgogICAgIFtQYXRyaWNrIE1jQ29ybWljayA8cGF0cmlja0B0ZWxsbWUuY29tPiwgQm9kbyBNb2VsbGVyXQoKICAqKSBSZW9yZGVyIGNsZWFudXAgc2VxdWVuY2UgaW4gU1NMX0NUWF9mcmVlKCk6IG9ubHkgcmVtb3ZlIHRoZSBleF9kYXRhIGFmdGVyCiAgICAgdGhlIGNhY2hlZCBzZXNzaW9ucyBhcmUgZmx1c2hlZCwgYXMgdGhlIHJlbW92ZV9jYigpIG1pZ2h0IHVzZSBleF9kYXRhCiAgICAgY29udGVudHMuIEJ1ZyBmb3VuZCBieSBTYW0gVmFyc2hhdmNoaWsgPG1yc2FtQGNvdXJpZXItbXRhLmNvbT4KICAgICAoc2VlIFtvcGVuc3NsLm9yZyAjMjEyXSkuCiAgICAgW0dlb2ZmIFRob3JwZSwgTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IHR5cG8gaW4gT0JKX3R4dDJvYmogd2hpY2ggaW5jb3JyZWN0bHkgcGFzc2VkIHRoZSBjb250ZW50CiAgICAgbGVuZ3RoLCBpbnN0ZWFkIG9mIHRoZSBlbmNvZGluZyBsZW5ndGggdG8gZDJpX0FTTjFfT0JKRUNULgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ZiBhbmQgMC45LjZnICBbOSBBdWcgMjAwMl0KCiAgKikgW0luIDAuOS42Zy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgRml4IGNyeXB0by9lbmdpbmUvdmVuZG9yX2RlZm5zL2Nzd2lmdC5oIGZvciBXSU4zMiAodXNlICdfc3RkY2FsbCcpLgogICAgIFtMeW5uIEdhemlzIDxsZ2F6aXNAcmFpbmJvdy5jb20+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmUgYW5kIDAuOS42ZiAgWzggQXVnIDIwMDJdCgogICopIEZpeCBBU04xIGNoZWNrcy4gQ2hlY2sgZm9yIG92ZXJmbG93IGJ5IGNvbXBhcmluZyB3aXRoIExPTkdfTUFYCiAgICAgYW5kIGdldCBmaXggdGhlIGhlYWRlciBsZW5ndGggY2FsY3VsYXRpb24uCiAgICAgW0Zsb3JpYW4gV2VpbWVyIDxXZWltZXJAQ0VSVC5VbmktU3R1dHRnYXJ0LkRFPiwKCUFsb24gS2FudG9yIDxhbG9ua0BjaGVja3BvaW50LmNvbT4gKGFuZCBvdGhlcnMpLAoJU3RldmUgSGVuc29uXQoKICAqKSBVc2UgcHJvcGVyIGVycm9yIGhhbmRsaW5nIGluc3RlYWQgb2YgJ2Fzc2VydGlvbnMnIGluIGJ1ZmZlcgogICAgIG92ZXJmbG93IGNoZWNrcyBhZGRlZCBpbiAwLjkuNmUuICBUaGlzIHByZXZlbnRzIERvUyAodGhlCiAgICAgYXNzZXJ0aW9ucyBjb3VsZCBjYWxsIGFib3J0KCkpLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+LCBCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ZCBhbmQgMC45LjZlICBbMzAgSnVsIDIwMDJdCgogICopIEFkZCB2YXJpb3VzIHNhbml0eSBjaGVja3MgdG8gYXNuMV9nZXRfbGVuZ3RoKCkgdG8gcmVqZWN0CiAgICAgdGhlIEFTTjEgbGVuZ3RoIGJ5dGVzIGlmIHRoZXkgZXhjZWVkIHNpemVvZihsb25nKSwgd2lsbCBhcHBlYXIKICAgICBuZWdhdGl2ZSBvciB0aGUgY29udGVudCBsZW5ndGggZXhjZWVkcyB0aGUgbGVuZ3RoIG9mIHRoZQogICAgIHN1cHBsaWVkIGJ1ZmZlci4KICAgICBbU3RldmUgSGVuc29uLCBBZGkgU3RhdiA8c3RhdkBtZXJjdXJ5LmNvLmlsPiwgSmFtZXMgWW9uYW4gPGppbUBudGxwLmNvbT5dCgogICopIEZpeCBjaXBoZXIgc2VsZWN0aW9uIHJvdXRpbmVzOiBjaXBoZXJzIHdpdGhvdXQgZW5jcnlwdGlvbiBoYWQgbm8gZmxhZ3MKICAgICBmb3IgdGhlIGNpcGhlciBzdHJlbmd0aCBzZXQgYW5kIHdoZXJlIHRoZXJlZm9yZSBub3QgaGFuZGxlZCBjb3JyZWN0bHkKICAgICBieSB0aGUgc2VsZWN0aW9uIHJvdXRpbmVzIChQUiAjMTMwKS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IEVWUF9kc2Ffc2hhIG1hY3JvLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgTmV3IG9wdGlvbgogICAgICAgICAgU1NMX09QX0RPTlRfSU5TRVJUX0VNUFRZX0ZSQUdNRU5UUwogICAgIGZvciBkaXNhYmxpbmcgdGhlIFNTTCAzLjAvVExTIDEuMCBDQkMgdnVsbmVyYWJpbGl0eSBjb3VudGVybWVhc3VyZQogICAgIHRoYXQgd2FzIGFkZGVkIGluIE9wZW5TU0wgMC45LjZkLgoKICAgICBBcyB0aGUgY291bnRlcm1lYXN1cmUgdHVybmVkIG91dCB0byBiZSBpbmNvbXBhdGlibGUgd2l0aCBzb21lCiAgICAgYnJva2VuIFNTTCBpbXBsZW1lbnRhdGlvbnMsIHRoZSBuZXcgb3B0aW9uIGlzIHBhcnQgb2YgU1NMX09QX0FMTC4KICAgICBTU0xfT1BfQUxMIGlzIHVzdWFsbHkgZW1wbG95ZWQgd2hlbiBjb21wYXRpYmlsaXR5IHdpdGggd2VpcmQgU1NMCiAgICAgaW1wbGVtZW50YXRpb25zIGlzIGRlc2lyZWQgKGUuZy4gJy1idWdzJyBvcHRpb24gdG8gJ3NfY2xpZW50JyBhbmQKICAgICAnc19zZXJ2ZXInKSwgc28gdGhlIG5ldyBvcHRpb24gaXMgYXV0b21hdGljYWxseSBzZXQgaW4gbWFueQogICAgIGFwcGxpY2F0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2VzIGluIHNlY3VyaXR5IHBhdGNoOgoKICAgICBDaGFuZ2VzIG1hcmtlZCAiKENIQVRTKSIgd2VyZSBzcG9uc29yZWQgYnkgdGhlIERlZmVuc2UgQWR2YW5jZWQKICAgICBSZXNlYXJjaCBQcm9qZWN0cyBBZ2VuY3kgKERBUlBBKSBhbmQgQWlyIEZvcmNlIFJlc2VhcmNoIExhYm9yYXRvcnksCiAgICAgQWlyIEZvcmNlIE1hdGVyaWVsIENvbW1hbmQsIFVTQUYsIHVuZGVyIGFncmVlbWVudCBudW1iZXIKICAgICBGMzA2MDItMDEtMi0wNTM3LgoKICAqKSBBZGQgdmFyaW91cyBzYW5pdHkgY2hlY2tzIHRvIGFzbjFfZ2V0X2xlbmd0aCgpIHRvIHJlamVjdAogICAgIHRoZSBBU04xIGxlbmd0aCBieXRlcyBpZiB0aGV5IGV4Y2VlZCBzaXplb2YobG9uZyksIHdpbGwgYXBwZWFyCiAgICAgbmVnYXRpdmUgb3IgdGhlIGNvbnRlbnQgbGVuZ3RoIGV4Y2VlZHMgdGhlIGxlbmd0aCBvZiB0aGUKICAgICBzdXBwbGllZCBidWZmZXIuIChDVkUtMjAwMi0wNjU5KQogICAgIFtTdGV2ZSBIZW5zb24sIEFkaSBTdGF2IDxzdGF2QG1lcmN1cnkuY28uaWw+LCBKYW1lcyBZb25hbiA8amltQG50bHAuY29tPl0KCiAgKikgQXNzZXJ0aW9ucyBmb3IgdmFyaW91cyBwb3RlbnRpYWwgYnVmZmVyIG92ZXJmbG93cywgbm90IGtub3duIHRvCiAgICAgaGFwcGVuIGluIHByYWN0aWNlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIFZhcmlvdXMgdGVtcG9yYXJ5IGJ1ZmZlcnMgdG8gaG9sZCBBU0NJSSB2ZXJzaW9ucyBvZiBpbnRlZ2VycyB3ZXJlCiAgICAgdG9vIHNtYWxsIGZvciA2NCBiaXQgcGxhdGZvcm1zLiAoQ1ZFLTIwMDItMDY1NSkKICAgICBbTWF0dGhldyBCeW5nLU1hZGRpY2sgPG1ibUBhbGRpZ2l0YWwuY28udWs+IGFuZCBCZW4gTGF1cmllIChDSEFUUyk+CgogICopIFJlbW90ZSBidWZmZXIgb3ZlcmZsb3cgaW4gU1NMMyBwcm90b2NvbCAtIGFuIGF0dGFja2VyIGNvdWxkCiAgICAgc3VwcGx5IGFuIG92ZXJzaXplZCBzZXNzaW9uIElEIHRvIGEgY2xpZW50LiAoQ1ZFLTIwMDItMDY1NikKICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBSZW1vdGUgYnVmZmVyIG92ZXJmbG93IGluIFNTTDIgcHJvdG9jb2wgLSBhbiBhdHRhY2tlciBjb3VsZAogICAgIHN1cHBseSBhbiBvdmVyc2l6ZWQgY2xpZW50IG1hc3RlciBrZXkuIChDVkUtMjAwMi0wNjU2KQogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42YyBhbmQgMC45LjZkICBbOSBNYXkgMjAwMl0KCiAgKikgRml4IGNyeXB0by9hc24xL2Ffc2lnbi5jIHNvIHRoYXQgJ3BhcmFtZXRlcnMnIGlzIG9taXR0ZWQgKG5vdAogICAgIGVuY29kZWQgYXMgTlVMTCkgd2l0aCBpZC1kc2Etd2l0aC1zaGExLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBCb2RvIE1vZWxsZXJdCgogICopIENoZWNrIHZhcmlvdXMgWDUwOV8uLi4oKSByZXR1cm4gdmFsdWVzIGluIGFwcHMvcmVxLmMuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBGaXggQkFTRTY0IGRlY29kZSAoRVZQX0RlY29kZVVwZGF0ZSkgZm9yIGRhdGEgd2l0aCBDUi9MRiBlbmRlZCBsaW5lczoKICAgICBhbiBlbmQtb2YtZmlsZSBjb25kaXRpb24gd291bGQgZXJyb25vdXNseSBiZSBmbGFnZ2VkLCB3aGVuIHRoZSBDUkxGCiAgICAgd2FzIGp1c3QgYXQgdGhlIGVuZCBvZiBhIHByb2Nlc3NlZCBibG9jay4gVGhlIGJ1ZyB3YXMgZGlzY292ZXJlZCB3aGVuCiAgICAgcHJvY2Vzc2luZyBkYXRhIHRocm91Z2ggYSBidWZmZXJpbmcgbWVtb3J5IEJJTyBoYW5kaW5nIHRoZSBkYXRhIHRvIGEKICAgICBCQVNFNjQtZGVjb2RpbmcgQklPLiBCdWcgZnVuZCBhbmQgcGF0Y2ggc3VibWl0dGVkIGJ5IFBhdmVsIFRzZWtvdgogICAgIDxwdHNla292QHN5bnRyZXguY29tPiBhbmQgTmVkZWxjaG8gU3RhbmV2LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBJbXBsZW1lbnQgYSBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IGEgdnVsbmVyYWJpbGl0eSByZWNlbnRseSBmb3VuZAogICAgIGluIENCQyBjaXBoZXJzdWl0ZXMgaW4gU1NMIDMuMC9UTFMgMS4wOiBTZW5kIGFuIGVtcHR5IGZyYWdtZW50CiAgICAgYmVmb3JlIGFwcGxpY2F0aW9uIGRhdGEgY2h1bmtzIHRvIGF2b2lkIHRoZSB1c2Ugb2Yga25vd24gSVZzCiAgICAgd2l0aCBkYXRhIHBvdGVudGlhbGx5IGNob3NlbiBieSB0aGUgYXR0YWNrZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGxlbmd0aCBjaGVja3MgaW4gc3NsM19nZXRfY2xpZW50X2hlbGxvKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVExTL1NTTCBsaWJyYXJ5IGJ1Z2ZpeDogdXNlIHMtPnMzLT5pbl9yZWFkX2FwcF9kYXRhIGRpZmZlcmVudGx5CiAgICAgdG8gcHJldmVudCBzc2wzX3JlYWRfaW50ZXJuYWwoKSBmcm9tIGluY29ycmVjdGx5IGFzc3VtaW5nIHRoYXQKICAgICBzc2wzX3JlYWRfYnl0ZXMoKSBmb3VuZCBhcHBsaWNhdGlvbiBkYXRhIHdoaWxlIGhhbmRzaGFrZQogICAgIHByb2Nlc3Npbmcgd2FzIGVuYWJsZWQgd2hlbiBpbiBmYWN0IHMtPnMzLT5pbl9yZWFkX2FwcF9kYXRhIHdhcwogICAgIG1lcmVseSBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgZHVyaW5nIHRoZSBpbml0aWFsIGhhbmRzaGFrZS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEFybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEZpeCBvYmplY3QgZGVmaW5pdGlvbnMgZm9yIFByaXZhdGUgYW5kIEVudGVycHJpc2U6IHRoZXkgd2VyZSBub3QKICAgICByZWNvZ25pemVkIGluIHRoZWlyIHNob3J0bmFtZSAoPWxvd2VyY2FzZSkgcmVwcmVzZW50YXRpb24uIEV4dGVuZAogICAgIG9ial9kYXQucGwgdG8gaXNzdWUgYW4gZXJyb3Igd2hlbiB1c2luZyB1bmRlZmluZWQga2V5d29yZHMgaW5zdGVhZAogICAgIG9mIHNpbGVudGx5IGlnbm9yaW5nIHRoZSBwcm9ibGVtIChTdmVubmluZyBTb3JlbnNlbgogICAgIDxzc3NAc3NzLmRuc2FsaWFzLm5ldD4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggREhfZ2VuZXJhdGVfcGFyYW1ldGVycygpIHNvIHRoYXQgaXQgd29ya3MgZm9yICdub24tc3RhbmRhcmQnCiAgICAgZ2VuZXJhdG9ycywgaS5lLiBnZW5lcmF0b3JzIG90aGVyIHRoYW4gMiBhbmQgNS4gIChQcmV2aW91c2x5LCB0aGUKICAgICBjb2RlIGRpZCBub3QgcHJvcGVybHkgaW5pdGlhbGlzZSB0aGUgJ2FkZCcgYW5kICdyZW0nIHZhbHVlcyB0bwogICAgIEJOX2dlbmVyYXRlX3ByaW1lKCkuKQoKICAgICBJbiB0aGUgbmV3IGdlbmVyYWwgY2FzZSwgd2UgZG8gbm90IGluc2lzdCB0aGF0ICdnZW5lcmF0b3InIGlzCiAgICAgYWN0dWFsbHkgYSBwcmltaXRpdmUgcm9vdDogVGhpcyByZXF1aXJlbWVudCBpcyByYXRoZXIgcG9pbnRsZXNzOwogICAgIGEgZ2VuZXJhdG9yIG9mIHRoZSBvcmRlci1xIHN1Ymdyb3VwIGlzIGp1c3QgYXMgZ29vZCwgaWYgbm90CiAgICAgYmV0dGVyLgogICAgIFtCb2RvIE1vZWxsZXJdCiAKICAqKSBNYXAgbmV3IFg1MDkgdmVyaWZpY2F0aW9uIGVycm9ycyB0byBhbGVydHMuIERpc2NvdmVyZWQgYW5kIHN1Ym1pdHRlZCBieQogICAgIFRvbSBXdSA8dG9tQGFyY290LmNvbT4uCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBzc2wzX3BlbmRpbmcoKSAoc3NsL3MzX2xpYi5jKSB0byBwcmV2ZW50IFNTTF9wZW5kaW5nKCkgZnJvbQogICAgIHJldHVybmluZyBub24temVybyBiZWZvcmUgdGhlIGRhdGEgaGFzIGJlZW4gY29tcGxldGVseSByZWNlaXZlZAogICAgIHdoZW4gdXNpbmcgbm9uLWJsb2NraW5nIEkvTy4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IEpvaG4gSHVnaGVzXQoKICAqKSBTb21lIG9mIHRoZSBjaXBoZXJzIG1pc3NlZCB0aGUgc3RyZW5ndGggZW50cnkgKFNTTF9MT1cgZXRjKS4KICAgICBbQmVuIExhdXJpZSwgTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGJ1ZyBpbiBTU0xfY2xlYXIoKTogYmFkIHNlc3Npb25zIHdlcmUgbm90IHJlbW92ZWQgKGZvdW5kIGJ5CiAgICAgWW9yYW0gWmFoYXZpIDxZb3JhbVpAZ2lsaWFuLmNvbT4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgaW5mb3JtYXRpb24gYWJvdXQgQ3lnV2luIDEuMyBhbmQgb24sIGFuZCBwcmVzZXJ2ZSBwcm9wZXIKICAgICBjb25maWd1cmF0aW9uIGZvciB0aGUgdmVyc2lvbnMgYmVmb3JlIHRoYXQuCiAgICAgW0NvcmlubmEgVmluc2NoZW4gPHZpbnNjaGVuQHJlZGhhdC5jb20+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgcmVtb3ZhbCBmcm9tIHNlc3Npb24gY2FjaGUgKFNTTF9DVFhfcmVtb3ZlX3Nlc3Npb24oKSkgbW9yZSByb2J1c3Q6CiAgICAgY2hlY2sgd2hldGhlciB3ZSBkZWFsIHdpdGggYSBjb3B5IG9mIGEgc2Vzc2lvbiBhbmQgZG8gbm90IGRlbGV0ZSBmcm9tCiAgICAgdGhlIGNhY2hlIGluIHRoaXMgY2FzZS4gUHJvYmxlbSByZXBvcnRlZCBieSAiSXpoYXIgU2hvc2hhbmkgTGV2aSIKICAgICA8aXpoYXJAY2hlY2twb2ludC5jb20+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBEbyBub3Qgc3RvcmUgc2Vzc2lvbiBkYXRhIGludG8gdGhlIGludGVybmFsIHNlc3Npb24gY2FjaGUsIGlmIGl0CiAgICAgaXMgbmV2ZXIgaW50ZW5kZWQgdG8gYmUgbG9va2VkIHVwIChTU0xfU0VTU19DQUNIRV9OT19JTlRFUk5BTF9MT09LVVAKICAgICBmbGFnIGlzIHNldCkuIFByb3Bvc2VkIGJ5IEFzbGFtIDxhc2xhbUBmdW5rLmNvbT4uCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEhhdmUgQVNOMV9CSVRfU1RSSU5HX3NldF9iaXQoKSByZWFsbHkgY2xlYXIgYSBiaXQgd2hlbiB0aGUgcmVxdWVzdGVkCiAgICAgdmFsdWUgaXMgMC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBbSW4gMC45LjZkLWVuZ2luZSByZWxlYXNlOl0KICAgICBGaXggYSBjcmFzaGJ1ZyBhbmQgYSBsb2dpYyBidWcgaW4gaHdjcmhrX2xvYWRfcHVia2V5KCkuCiAgICAgW1Rvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGNvbmZpZ3VyYXRpb24gdGFyZ2V0IGxpbnV4LXMzOTB4LgogICAgIFtOZWFsZSBGZXJndXNvbiA8TmVhbGUuRmVyZ3Vzb25AU29mdHdhcmVBRy1VU0EuY29tPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUaGUgZWFybGllciBidWdmaXggZm9yIHRoZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9DIGNhc2Ugb2YKICAgICBzc2wzX2FjY2VwdCAoc3NsL3MzX3NydnIuYykgaW5jb3JyZWN0bHkgdXNlZCBhIGxvY2FsIGZsYWcKICAgICB2YXJpYWJsZSBhcyBhbiBpbmRpY2F0aW9uIHRoYXQgYSBDbGllbnRIZWxsbyBtZXNzYWdlIGhhcyBiZWVuCiAgICAgcmVjZWl2ZWQuICBBcyB0aGUgZmxhZyB2YWx1ZSB3aWxsIGJlIGxvc3QgYmV0d2VlbiBtdWx0aXBsZQogICAgIGludm9jYXRpb25zIG9mIHNzbDNfYWNjZXB0IHdoZW4gdXNpbmcgbm9uLWJsb2NraW5nIEkvTywgdGhlCiAgICAgZnVuY3Rpb24gbWF5IG5vdCBiZSBhd2FyZSB0aGF0IGEgaGFuZHNoYWtlIGhhcyBhY3R1YWxseSB0YWtlbgogICAgIHBsYWNlLCB0aHVzIHByZXZlbnRpbmcgYSBuZXcgc2Vzc2lvbiBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoZQogICAgIHNlc3Npb24gY2FjaGUuCgogICAgIFRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgd2Ugbm93IHNldCBzLT5uZXdfc2Vzc2lvbiB0byAyIGluc3RlYWQgb2YKICAgICB1c2luZyBhIGxvY2FsIHZhcmlhYmxlLgogICAgIFtMdXR6IEphZW5pY2tlLCBCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeDogUmV0dXJuIC0xIGZyb20gc3NsM19nZXRfc2VydmVyX2RvbmUgKHNzbDMvczNfY2xudC5jKQogICAgIGlmIHRoZSBTU0xfUl9MRU5HVEhfTUlTTUFUQ0ggZXJyb3IgaXMgZGV0ZWN0ZWQuCiAgICAgW0dlb2ZmIFRob3JwZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgJ3NoYXJlZF9sZGZsYWcnIGNvbHVtbiBpbiBDb25maWd1cmUgcGxhdGZvcm0gdGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IEVWUF9DSVBIRVJfbW9kZSBtYWNyby4KICAgICBbIkRhbiBTLiBDYW1wZXIiIDxkYW5AYnRpLm5ldD5dCgogICopIEZpeCBzc2wzX3JlYWRfYnl0ZXMgKHNzbC9zM19wa3QuYyk6IFRvIGlnbm9yZSBtZXNzYWdlcyBvZiB1bmtub3duCiAgICAgdHlwZSwgd2UgbXVzdCB0aHJvdyB0aGVtIGF3YXkgYnkgc2V0dGluZyByci0+bGVuZ3RoIHRvIDAuCiAgICAgW0QgUCBDaGFuZyA8ZHBjQHF1YWx5cy5jb20+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmIgYW5kIDAuOS42YyAgWzIxIGRlYyAyMDAxXQoKICAqKSBGaXggQk5fcmFuZF9yYW5nZSBidWcgcG9pbnRlZCBvdXQgYnkgRG9taW5pa3VzIFNjaGVya2wKICAgICA8RG9taW5pa3VzLlNjaGVya2xAYmlvZGF0YS5jb20+LiAgKFRoZSBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbgogICAgIHdvcmtlZCBpbmNvcnJlY3RseSBmb3IgdGhvc2UgY2FzZXMgd2hlcmUgIHJhbmdlID0gMTAuLi5fMiAgYW5kCiAgICAgMypyYW5nZSAgaXMgdHdvIGJpdHMgbG9uZ2VyIHRoYW4gIHJhbmdlLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBPbmx5IGFkZCBzaWduaW5nIHRpbWUgdG8gUEtDUzcgc3RydWN0dXJlcyBpZiBpdCBpcyBub3QgYWxyZWFkeQogICAgIHByZXNlbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGNyeXB0by9vYmplY3RzL29iamVjdHMuaDogImxkLWNlIiBzaG91bGQgYmUgImlkLWNlIiwKICAgICBPQkpfbGRfY2Ugc2hvdWxkIGJlIE9CSl9pZF9jZS4KICAgICBBbHNvIHNvbWUgaXAtcGRhIE9JRHMgaW4gY3J5cHRvL29iamVjdHMvb2JqZWN0cy50eHQgd2VyZQogICAgIGluY29ycmVjdCAoY2YuIFJGQyAzMDM5KS4KICAgICBbTWF0dCBDb29wZXIsIEZyZWRlcmljIEdpdWRpY2VsbGksIEJvZG8gTW9lbGxlcl0KCiAgKikgUmVsZWFzZSBDUllQVE9fTE9DS19EWU5MT0NLIHdoZW4gQ1JZUFRPX2Rlc3Ryb3lfZHlubG9ja2lkKCkKICAgICByZXR1cm5zIGVhcmx5IGJlY2F1c2UgaXQgaGFzIG5vdGhpbmcgdG8gZG8uCiAgICAgW0FuZHkgU2NobmVpZGVyIDxhbmR5LnNjaG5laWRlckBianNzLmNvLnVrPl0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgRml4IG11dGV4IGNhbGxiYWNrIHJldHVybiB2YWx1ZXMgaW4gY3J5cHRvL2VuZ2luZS9od19uY2lwaGVyLmMuCiAgICAgW0FuZHkgU2NobmVpZGVyIDxhbmR5LnNjaG5laWRlckBianNzLmNvLnVrPl0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgQWRkIHN1cHBvcnQgZm9yIENyeXB0b2dyYXBoaWMgQXBwbGlhbmNlJ3Mga2V5c2VydmVyIHRlY2hub2xvZ3kuCiAgICAgKFVzZSBlbmdpbmUgJ2tleWNsaWVudCcpCiAgICAgW0NyeXB0b2dyYXBoaWMgQXBwbGlhbmNlcyBhbmQgR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYSBjb25maWd1cmF0aW9uIGVudHJ5IGZvciBPUy8zOTAgVW5peC4gIFRoZSBDIGNvbXBpbGVyICdjODknCiAgICAgaXMgY2FsbGVkIHZpYSB0b29scy9jODkuc2ggYmVjYXVzZSBhcmd1bWVudHMgaGF2ZSB0byBiZQogICAgIHJlYXJyYW5nZWQgKGFsbCAnLUwnIG9wdGlvbnMgbXVzdCBhcHBlYXIgYmVmb3JlIHRoZSBmaXJzdCBvYmplY3QKICAgICBtb2R1bGVzKS4KICAgICBbUmljaGFyZCBTaGFwaXJvIDxyc2hhcGlyb0BhYmluaXRpby5jb20+XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBBZGQgc3VwcG9ydCBmb3IgQnJvYWRjb20gY3J5cHRvIGFjY2VsZXJhdG9yIGNhcmRzLCBiYWNrcG9ydGVkCiAgICAgZnJvbSAwLjkuNy4KICAgICBbQnJvYWRjb20sIE5hbGluIERhaHlhYmhhaSA8bmFsaW5AcmVkaGF0LmNvbT4sIE1hcmsgQ294XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBBZGQgc3VwcG9ydCBmb3IgU3VyZVdhcmUgY3J5cHRvIGFjY2VsZXJhdG9yIGNhcmRzIGZyb20gCiAgICAgQmFsdGltb3JlIFRlY2hub2xvZ2llcy4gIChVc2UgZW5naW5lICdzdXJld2FyZScpCiAgICAgW0JhbHRpbW9yZSBUZWNobm9sb2dpZXMgYW5kIE1hcmsgQ294XQoKICAqKSBbSW4gMC45LjZjLWVuZ2luZSByZWxlYXNlOl0KICAgICBBZGQgc3VwcG9ydCBmb3IgY3J5cHRvIGFjY2VsZXJhdG9yIGNhcmRzIGZyb20gQWNjZWxlcmF0ZWQKICAgICBFbmNyeXB0aW9uIFByb2Nlc3NpbmcsIHd3dy5hZXAuaWUuICAoVXNlIGVuZ2luZSAnYWVwJykKICAgICBbQUVQIEluYy4gYW5kIE1hcmsgQ294XQoKICAqKSBBZGQgYSBjb25maWd1cmF0aW9uIGVudHJ5IGZvciBnY2Mgb24gVW5peFdhcmUuCiAgICAgW0dhcnkgQmVuc29uIDxnYmVuc29uQHJlZGhhdC5jb20+XQoKICAqKSBDaGFuZ2Ugc3NsL3MyX2NsbnQuYyBhbmQgc3NsL3MyX3NydnIuYyBzbyB0aGF0IHJlY2VpdmVkIGhhbmRzaGFrZQogICAgIG1lc3NhZ2VzIGFyZSBzdG9yZWQgaW4gYSBzaW5nbGUgcGllY2UgKGZpeGVkLWxlbmd0aCBwYXJ0IGFuZAogICAgIHZhcmlhYmxlLWxlbmd0aCBwYXJ0IGNvbWJpbmVkKSBhbmQgZml4IHZhcmlvdXMgYnVncyBmb3VuZCBvbiB0aGUgd2F5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERpc2FibGUgY2FjaGluZyBpbiBCSU9fZ2V0aG9zdGJ5bmFtZSgpLCBkaXJlY3RseSB1c2UgZ2V0aG9zdGJ5bmFtZSgpCiAgICAgaW5zdGVhZC4gIEJJT19nZXRob3N0YnluYW1lKCkgZG9lcyBub3Qga25vdyB3aGF0IHRpbWVvdXRzIGFyZQogICAgIGFwcHJvcHJpYXRlLCBzbyBlbnRyaWVzIHdvdWxkIHN0YXkgaW4gY2FjaGUgZXZlbiB3aGVuIHRoZXkgaGF2ZQogICAgIGJlY29tZSBpbnZhbGlkLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgUmljaCBTYWx6IDxyc2FsekB6b2xlcmEuY29tPgoKICAqKSBDaGFuZ2Ugc3NsMjNfZ2V0X2NsaWVudF9oZWxsbyAoc3NsL3MyM19zcnZyLmMpIGJlaGF2aW91ciB3aGVuCiAgICAgZmFjZWQgd2l0aCBhIHBhdGhvbG9naWNhbGx5IHNtYWxsIENsaWVudEhlbGxvIGZyYWdtZW50IHRoYXQgZG9lcwogICAgIG5vdCBjb250YWluIGNsaWVudF92ZXJzaW9uOiBJbnN0ZWFkIG9mIGFib3J0aW5nIHdpdGggYW4gZXJyb3IsCiAgICAgc2ltcGx5IGNob29zZSB0aGUgaGlnaGVzdCBhdmFpbGFibGUgcHJvdG9jb2wgdmVyc2lvbiAoaS5lLiwKICAgICBUTFMgMS4wIHVubGVzcyBpdCBpcyBkaXNhYmxlZCkuICBJbiBwcmFjdGljZSwgQ2xpZW50SGVsbG8KICAgICBtZXNzYWdlcyBhcmUgbmV2ZXIgc2VudCBsaWtlIHRoaXMsIGJ1dCB0aGlzIGNoYW5nZSBnaXZlcyB1cwogICAgIHN0cmljdGx5IGNvcnJlY3QgYmVoYXZpb3VyIGF0IGxlYXN0IGZvciBUTFMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IFNTTCBoYW5kc2hha2UgZnVuY3Rpb25zIGFuZCBTU0xfY2xlYXIoKSBzdWNoIHRoYXQgU1NMX2NsZWFyKCkKICAgICBuZXZlciByZXNldHMgcy0+bWV0aG9kIHRvIHMtPmN0eC0+bWV0aG9kIHdoZW4gY2FsbGVkIGZyb20gd2l0aGluCiAgICAgb25lIG9mIHRoZSBTU0wgaGFuZHNoYWtlIGZ1bmN0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IE5pa28gQmFyaWNdCgogICopIEluIHNzbDNfZ2V0X2NsaWVudF9oZWxsbyAoc3NsL3MzX3NydnIuYyksIGdlbmVyYXRlIGEgZmF0YWwgYWxlcnQKICAgICAoc2VudCB1c2luZyB0aGUgY2xpZW50J3MgdmVyc2lvbiBudW1iZXIpIGlmIGNsaWVudF92ZXJzaW9uIGlzCiAgICAgc21hbGxlciB0aGFuIHRoZSBwcm90b2NvbCB2ZXJzaW9uIGluIHVzZS4gIEFsc28gY2hhbmdlCiAgICAgc3NsMjNfZ2V0X2NsaWVudF9oZWxsbyAoc3NsL3MyM19zcnZyLmMpIHRvIHNlbGVjdCBUTFMgMS4wIGlmCiAgICAgdGhlIGNsaWVudCBkZW1hbmRlZCBTU0wgMy4wIGJ1dCBvbmx5IFRMUyAxLjAgaXMgZW5hYmxlZDsgdGhlbgogICAgIHRoZSBjbGllbnQgd2lsbCBhdCBsZWFzdCBzZWUgdGhhdCBhbGVydC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggc3NsM19nZXRfbWVzc2FnZSAoc3NsL3MzX2JvdGguYykgdG8gaGFuZGxlIG1lc3NhZ2UgZnJhZ21lbnRhdGlvbgogICAgIGNvcnJlY3RseS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCBpbmZpbml0ZSBsb29wIGluIHNzbDNfZ2V0X21lc3NhZ2UgKHNzbC9zM19ib3RoLmMpIGlmIGEKICAgICBjbGllbnQgcmVjZWl2ZXMgSGVsbG9SZXF1ZXN0IHdoaWxlIGluIGEgaGFuZHNoYWtlLgogICAgIFtCb2RvIE1vZWxsZXI7IGJ1ZyBub3RpY2VkIGJ5IEFuZHkgU2NobmVpZGVyIDxhbmR5LnNjaG5laWRlckBianNzLmNvLnVrPl0KCiAgKikgQnVnZml4IGluIHNzbDNfYWNjZXB0IChzc2wvczNfc3J2ci5jKTogQ2FzZSBTU0wzX1NUX1NXX0hFTExPX1JFUV9DCiAgICAgc2hvdWxkIGVuZCBpbiAnYnJlYWsnLCBub3QgJ2dvdG8gZW5kJyB3aGljaCBjaXJjdW12ZW50cyB2YXJpb3VzCiAgICAgY2xlYW51cHMgZG9uZSBpbiBzdGF0ZSBTU0xfU1RfT0suICAgQnV0IHNlc3Npb24gcmVsYXRlZCBzdHVmZgogICAgIG11c3QgYmUgZGlzYWJsZWQgZm9yIFNTTF9TVF9PSyBpbiB0aGUgY2FzZSB0aGF0IHdlIGp1c3Qgc2VudCBhCiAgICAgSGVsbG9SZXF1ZXN0LgoKICAgICBBbHNvIGF2b2lkIHNvbWUgb3ZlcmhlYWQgYnkgbm90IGNhbGxpbmcgc3NsX2luaXRfd2Jpb19idWZmZXIoKQogICAgIGJlZm9yZSBqdXN0IHNlbmRpbmcgYSBIZWxsb1JlcXVlc3QuCiAgICAgW0JvZG8gTW9lbGxlciwgRXJpYyBSZXNjb3JsYSA8ZWtyQHJ0Zm0uY29tPl0KCiAgKikgRml4IHNzbC9zM19lbmMuYywgc3NsL3QxX2VuYy5jIGFuZCBzc2wvczNfcGt0LmMgc28gdGhhdCB3ZSBkb24ndAogICAgIHJldmVhbCB3aGV0aGVyIGlsbGVnYWwgYmxvY2sgY2lwaGVyIHBhZGRpbmcgd2FzIGZvdW5kIG9yIGEgTUFDCiAgICAgdmVyaWZpY2F0aW9uIGVycm9yIG9jY3VyZWQuICAoTmVpdGhlciBTU0xlcnIoKSBjb2RlcyBub3IgYWxlcnRzCiAgICAgYXJlIGRpcmVjdGx5IHZpc2libGUgdG8gcG90ZW50aWFsIGF0dGFja2VycywgYnV0IHRoZSBpbmZvcm1hdGlvbgogICAgIG1heSBsZWFrIHZpYSBsb2dmaWxlcy4pCgogICAgIFNpbWlsYXIgY2hhbmdlcyBhcmUgbm90IHJlcXVpcmVkIGZvciB0aGUgU1NMIDIuMCBpbXBsZW1lbnRhdGlvbgogICAgIGJlY2F1c2UgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGlzIHNlbnQgaW4gY2xlYXIgZm9yIFNTTCAyLjAsCiAgICAgYW5kIHRoZSBleHRyYSBieXRlcyBhcmUganVzdCBpZ25vcmVkLiAgSG93ZXZlciBzc2wvczJfcGt0LmMKICAgICBmYWlsZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIHB1cnBvcnRlZCBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpcyBpbgogICAgIHRoZSBsZWdhbCByYW5nZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgT3BlblVOSVgtOCBzdXBwb3J0IGluY2x1ZGluZyBzaGFyZWQgbGlicmFyaWVzCiAgICAgKEJveWQgTHlubiBHZXJiZXIgPGdlcmJlcmJAemVuZXouY29tPikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEltcHJvdmUgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUCgpIGNoZWNrIGFnYWluIHRvIGF2b2lkCiAgICAgJ3dyaXN0d2F0Y2ggYXR0YWNrJyB1c2luZyBodWdlIGVuY29kaW5nIHBhcmFtZXRlcnMgKGNmLgogICAgIEphbWVzIEguIE1hbmdlcidzIENSWVBUTyAyMDAxIHBhcGVyKS4gIE5vdGUgdGhhdCB0aGUKICAgICBSU0FfUEtDUzFfT0FFUF9QQURESU5HIGNhc2Ugb2YgUlNBX3ByaXZhdGVfZGVjcnlwdCgpIGRvZXMgbm90IHVzZQogICAgIGVuY29kaW5nIHBhcmFtZXRlcnMgYW5kIGhlbmNlIHdhcyBub3QgdnVsbmVyYWJsZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCTl9zcXIoKSBidWcgZml4LgogICAgIFtVbGYgTfZsbGVyLCByZXBvcnRlZCBieSBKaW0gRWxsaXMgPGppbS5lbGxpc0BjYXZpdW0uY29tPl0KCiAgKikgUmFiaW4tTWlsbGVyIHRlc3QgYW5hbHlzZXMgYXNzdW1lIHVuaWZvcm1seSBkaXN0cmlidXRlZCB3aXRuZXNzZXMsCiAgICAgc28gdXNlIEJOX3BzZXVkb19yYW5kX3JhbmdlKCkgaW5zdGVhZCBvZiB1c2luZyBCTl9wc2V1ZG9fcmFuZCgpCiAgICAgZm9sbG93ZWQgYnkgbW9kdWxhciByZWR1Y3Rpb24uCiAgICAgW0JvZG8gTW9lbGxlcjsgcG9pbnRlZCBvdXQgYnkgQWRhbSBZb3VuZyA8QVlvdW5nMUBOQ1NVUy5KTkouQ09NPl0KCiAgKikgQWRkIEJOX3BzZXVkb19yYW5kX3JhbmdlKCkgd2l0aCBvYnZpb3VzIGZ1bmN0aW9uYWxpdHk6IEJOX3JhbmRfcmFuZ2UoKQogICAgIGVxdWl2YWxlbnQgYmFzZWQgb24gQk5fcHNldWRvX3JhbmQoKSBpbnN0ZWFkIG9mIEJOX3JhbmQoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBzM19zcnZyLmM6IGFsbG93IHNlbmRpbmcgb2YgbGFyZ2UgY2xpZW50IGNlcnRpZmljYXRlIGxpc3RzICg+IDE2IGtCKS4KICAgICBUaGlzIGZ1bmN0aW9uIHdhcyBicm9rZW4sIGFzIHRoZSBjaGVjayBmb3IgYSBuZXcgY2xpZW50IGhlbGxvIG1lc3NhZ2UKICAgICB0byBoYW5kbGUgU0dDIGRpZCBub3QgYWxsb3cgdGhlc2UgbGFyZ2UgbWVzc2FnZXMuCiAgICAgKFRyYWNrZWQgZG93biBieSAiRG91Z2xhcyBFLiBFbmdlcnQiIDxkZWVuZ2VydEBhbmwuZ292Pi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBhbGVydCBkZXNjcmlwdGlvbnMgZm9yIFRMU3YxIHRvIFNTTF9hbGVydF9kZXNjX3N0cmluZ1tfbG9uZ10oKS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGJ1Z2d5IGJlaGF2aW91ciBvZiBCSU9fZ2V0X251bV9yZW5lZ290aWF0ZXMoKSBhbmQgQklPX2N0cmwoKQogICAgIGZvciBCSU9fQ19HRVRfV1JJVEVfQlVGX1NJWkUgKCJTdGVwaGVuIEhpbnRvbiIgPHNoaW50b25AbmV0b3BpYS5jb20+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgUmV3b3JrIHRoZSBjb25maWd1cmF0aW9uIGFuZCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGZvciBUcnU2NCBVbml4LgogICAgIFRoZSBjb25maWd1cmF0aW9uIHBhcnQgbWFrZXMgdXNlIG9mIG1vZGVybiBjb21waWxlciBmZWF0dXJlcyBhbmQKICAgICBzdGlsbCByZXRhaW5zIG9sZCBjb21waWxlciBiZWhhdmlvciBmb3IgdGhvc2UgdGhhdCBydW4gb2xkZXIgdmVyc2lvbnMKICAgICBvZiB0aGUgT1MuICBUaGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBwYXJ0IGluY2x1ZGVzIGEgdmFyaWFudCB0aGF0CiAgICAgdXNlcyB0aGUgUlBBVEggZmVhdHVyZSwgYW5kIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBzcGVjaWFsCiAgICAgY29uZmlndXJhdGlvbiB0YXJnZXQgImFscGhhLWNjLXJwYXRoIiwgd2hpY2ggd2lsbCBuZXZlciBiZSBzZWxlY3RlZAogICAgIGF1dG9tYXRpY2FsbHkuCiAgICAgW1RpbSBNb29uZXkgPG1vb25leUBkb2diZXJ0LmNjLm5kc3UuTm9EYWsuZWR1PiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbiBzc2wzX2dldF9rZXlfZXhjaGFuZ2UgKHNzbC9zM19jbG50LmMpLCBjYWxsIHNzbDNfZ2V0X21lc3NhZ2UoKQogICAgIHdpdGggdGhlIHNhbWUgbWVzc2FnZSBzaXplIGFzIGluIHNzbDNfZ2V0X2NlcnRpZmljYXRlX3JlcXVlc3QoKS4KICAgICBPdGhlcndpc2UsIGlmIG5vIFNlcnZlcktleUV4Y2hhbmdlIG1lc3NhZ2Ugb2NjdXJzLCBDZXJ0aWZpY2F0ZVJlcXVlc3QKICAgICBtZXNzYWdlcyBtaWdodCBpbmFkdmVydGVudGx5IGJlIHJlamVjdCBhcyB0b28gbG9uZy4KICAgICBbUGV0ciBMYW1wYSA8bGFtcGFAZmVlLnZ1dGJyLmN6Pl0KCiAgKikgRW5oYW5jZWQgc3VwcG9ydCBmb3IgSUEtNjQgVW5peCBwbGF0Zm9ybXMgKHdlbGwsIExpbnV4IGFuZCBIUC1VWCkuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE1vZGlmaWVkIFNTTCBsaWJyYXJ5IHN1Y2ggdGhhdCB0aGUgdmVyaWZ5X2NhbGxiYWNrIHRoYXQgaGFzIGJlZW4gc2V0CiAgICAgc3BlY2lmaWNseSBmb3IgYW4gU1NMIG9iamVjdCB3aXRoIFNTTF9zZXRfdmVyaWZ5KCkgaXMgYWN0dWFsbHkgYmVpbmcKICAgICB1c2VkLiBCZWZvcmUgdGhlIGNoYW5nZSwgYSB2ZXJpZnlfY2FsbGJhY2sgc2V0IHdpdGggdGhpcyBmdW5jdGlvbiB3YXMKICAgICBpZ25vcmVkIGFuZCB0aGUgdmVyaWZ5X2NhbGxiYWNrKCkgc2V0IGluIHRoZSBTU0xfQ1RYIGF0IHRoZSB0aW1lIG9mCiAgICAgdGhlIGNhbGwgd2FzIHVzZWQuIE5ldyBmdW5jdGlvbiBYNTA5X1NUT1JFX0NUWF9zZXRfdmVyaWZ5X2NiKCkgaW50cm9kdWNlZAogICAgIHRvIGFsbG93IHRoZSBuZWNlc3Nhcnkgc2V0dGluZ3MuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEluaXRpYWxpemUgc3RhdGljIHZhcmlhYmxlIGluIGNyeXB0by9kc2EvZHNhX2xpYi5jIGFuZCBjcnlwdG8vZGgvZGhfbGliLmMKICAgICBleHBsaWNpdGx5IHRvIE5VTEwsIGFzIGF0IGxlYXN0IG9uIFNvbGFyaXMgOCB0aGlzIHNlZW1zIG5vdCBhbHdheXMgdG8gYmUKICAgICBkb25lIGF1dG9tYXRpY2FsbHkgKGluIGNvbnRyYWRpY3Rpb24gdG8gdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgQwogICAgIHN0YW5kYXJkKS4gVGhpcyBtYWRlIHByb2JsZW1zIHdoZW4gdXNlZCBmcm9tIE9wZW5TU0guCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEluIE9wZW5TU0wgMC45LjZhIGFuZCAwLjkuNmIsIGNyeXB0by9kaC9kaF9rZXkuYyBpZ25vcmVkCiAgICAgZGgtPmxlbmd0aCBhbmQgYWx3YXlzIHVzZWQKCiAgICAgICAgICBCTl9yYW5kX3JhbmdlKHByaXZfa2V5LCBkaC0+cCkuCgogICAgIEJOX3JhbmRfcmFuZ2UoKSBpcyBub3QgbmVjZXNzYXJ5IGZvciBEaWZmaWUtSGVsbG1hbiwgYW5kIHRoaXMKICAgICBzcGVjaWZpYyByYW5nZSBtYWtlcyBEaWZmaWUtSGVsbG1hbiB1bm5lY2Vzc2FyaWx5IGluZWZmaWNpZW50IGlmCiAgICAgZGgtPmxlbmd0aCAocmVjb21tZW5kZWQgZXhwb25lbnQgbGVuZ3RoKSBpcyBtdWNoIHNtYWxsZXIgdGhhbiB0aGUKICAgICBsZW5ndGggb2YgZGgtPnAuICBXZSBjb3VsZCB1c2UgQk5fcmFuZF9yYW5nZSgpIGlmIHRoZSBvcmRlciBvZgogICAgIHRoZSBzdWJncm91cCB3YXMgc3RvcmVkIGluIHRoZSBESCBzdHJ1Y3R1cmUsIGJ1dCB3ZSBvbmx5IGhhdmUKICAgICBkaC0+bGVuZ3RoLgoKICAgICBTbyBzd2l0Y2ggYmFjayB0bwoKICAgICAgICAgIEJOX3JhbmQocHJpdl9rZXksIGwsIC4uLikKCiAgICAgd2hlcmUgJ2wnIGlzIGRoLT5sZW5ndGggaWYgdGhpcyBpcyBkZWZpbmVkLCBvciBCTl9udW1fYml0cyhkaC0+cCktMQogICAgIG90aGVyd2lzZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbgoKICAgICAgICAgIFJTQV9lYXlfcHVibGljX2VuY3J5cHQKICAgICAgICAgIFJTQV9lYXlfcHJpdmF0ZV9kZWNyeXB0CiAgICAgICAgICBSU0FfZWF5X3ByaXZhdGVfZW5jcnlwdCAoc2lnbmluZykKICAgICAgICAgIFJTQV9lYXlfcHVibGljX2RlY3J5cHQgKHNpZ25hdHVyZSB2ZXJpZmljYXRpb24pCgogICAgIChkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgUlNBX3B1YmxpY19lbmNyeXB0LAogICAgIFJTQV9wcml2YXRlX2RlY3J5cHQsIFJTQV9wcml2YXRlX2VuY3J5cHQsIFJTQV9wdWJsaWNfZGVjcnlwdCksCiAgICAgYWx3YXlzIHJlamVjdCBudW1iZXJzID49IG4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL3JhbmQvbWRfcmFuZC5jLCB1c2UgYSBuZXcgc2hvcnQtdGltZSBsb2NrIENSWVBUT19MT0NLX1JBTkQyCiAgICAgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvICdsb2NraW5nX3RocmVhZCcuICBUaGlzIGlzIG5lY2Vzc2FyeSBvbgogICAgIHN5c3RlbXMgd2hlcmUgYWNjZXNzIHRvICdsb2NraW5nX3RocmVhZCcgKGFuICd1bnNpZ25lZCBsb25nJwogICAgIHZhcmlhYmxlKSBpcyBub3QgYXRvbWljLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIGNyeXB0by9yYW5kL21kX3JhbmQuYywgc2V0ICdsb2NraW5nX3RocmVhZCcgdG8gY3VycmVudCB0aHJlYWQncyBJRAogICAgICpiZWZvcmUqIHNldHRpbmcgdGhlICdjcnlwdG9fbG9ja19yYW5kJyBmbGFnLiAgVGhlIHByZXZpb3VzIGNvZGUgaGFkCiAgICAgYSByYWNlIGNvbmRpdGlvbiBpZiAwIGlzIGEgdmFsaWQgdGhyZWFkIElELgogICAgIFtUcmF2aXMgVml0ZWsgPHZpdGVrQHJvZ3Vld2F2ZS5jb20+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyB1bmRlciBJcml4LgogICAgIFtBbGJlcnQgQ2hpbi1BLVlvdW5nIDxjaGluYUB0aGV3cml0dGVud29yZC5jb20+XQoKICAqKSBBZGQgY29uZmlndXJhdGlvbiBvcHRpb24gdG8gYnVpbGQgb24gTGludXggb24gYm90aCBiaWctZW5kaWFuIGFuZAogICAgIGxpdHRsZS1lbmRpYW4gTUlQUy4KICAgICBbUmFsZiBCYWVjaGxlIDxyYWxmQHVuaS1rb2JsZW56LmRlPl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBIUC1VWC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmEgYW5kIDAuOS42YiAgWzkgSnVsIDIwMDFdCgogICopIENoYW5nZSBzc2xlYXlfcmFuZF9ieXRlcyAoY3J5cHRvL3JhbmQvbWRfcmFuZC5jKQogICAgIHRvIGF2b2lkIGEgU1NMZWF5L09wZW5TU0wgUFJORyB3ZWFrbmVzcyBwb2ludGVkIG91dCBieQogICAgIE1hcmtrdS1KdWhhbmkgTy4gU2FhcmluZW4gPG1hcmtrdS1qdWhhbmkuc2FhcmluZW5Abm9raWEuY29tPjoKICAgICBQUk5HIHN0YXRlIHJlY292ZXJ5IHdhcyBwb3NzaWJsZSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mCiAgICAgb25lIFBSTkcgcmVxdWVzdCBhcHByb3ByaWF0ZWx5IHNpemVkIHRvIGdhaW4ga25vd2xlZGdlIG9uCiAgICAgJ21kJyBmb2xsb3dlZCBieSBlbm91Z2ggY29uc2VjdXRpdmUgMS1ieXRlIFBSTkcgcmVxdWVzdHMKICAgICB0byB0cmF2ZXJzZSBhbGwgb2YgJ3N0YXRlJy4KCiAgICAgMS4gV2hlbiB1cGRhdGluZyAnbWRfbG9jYWwnICh0aGUgY3VycmVudCB0aHJlYWQncyBjb3B5IG9mICdtZCcpCiAgICAgICAgZHVyaW5nIFBSTkcgb3V0cHV0IGdlbmVyYXRpb24sIGhhc2ggYWxsIG9mIHRoZSBwcmV2aW91cwogICAgICAgICdtZF9sb2NhbCcgdmFsdWUsIG5vdCBqdXN0IHRoZSBoYWxmIHVzZWQgZm9yIFBSTkcgb3V0cHV0LgoKICAgICAyLiBNYWtlIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSAnc3RhdGUnIGluY2x1ZGVkIGludG8gdGhlIGhhc2gKICAgICAgICBpbmRlcGVuZGVudCBmcm9tIHRoZSBudW1iZXIgb2YgUFJORyBieXRlcyByZXF1ZXN0ZWQuCgogICAgIFRoZSBmaXJzdCBtZWFzdXJlIGFsb25lIHdvdWxkIGJlIHN1ZmZpY2llbnQgdG8gYXZvaWQKICAgICBNYXJra3UtSnVoYW5pJ3MgYXR0YWNrLiAgKEFjdHVhbGx5IGl0IGhhZCBuZXZlciBvY2N1cnJlZAogICAgIHRvIG1lIHRoYXQgdGhlIGhhbGYgb2YgJ21kX2xvY2FsJyB1c2VkIGZvciBjaGFpbmluZyB3YXMgdGhlCiAgICAgaGFsZiBmcm9tIHdoaWNoIFBSTkcgb3V0cHV0IGJ5dGVzIHdlcmUgdGFrZW4gLS0gSSBoYWQgYWx3YXlzCiAgICAgYXNzdW1lZCB0aGF0IHRoZSBzZWNyZXQgaGFsZiB3b3VsZCBiZSB1c2VkLikgIFRoZSBzZWNvbmQKICAgICBtZWFzdXJlIG1ha2VzIHN1cmUgdGhhdCBhZGRpdGlvbmFsIGRhdGEgZnJvbSAnc3RhdGUnIGlzIG5ldmVyCiAgICAgbWl4ZWQgaW50byAnbWRfbG9jYWwnIGluIHNtYWxsIHBvcnRpb25zOyB0aGlzIGhldXJpc3RpY2FsbHkKICAgICBmdXJ0aGVyIHN0cmVuZ3RoZW5zIHRoZSBQUk5HLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBjcnlwdG8vYm4vYXNtL21pcHMzLnMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIFdoZW4gb25seSB0aGUga2V5IGlzIGdpdmVuIHRvICJlbmMiLCB0aGUgSVYgaXMgdW5kZWZpbmVkLiBQcmludCBvdXQKICAgICBhbiBlcnJvciBtZXNzYWdlIGluIHRoaXMgY2FzZS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSGFuZGxlIHNwZWNpYWwgY2FzZSB3aGVuIFg1MDlfTkFNRSBpcyBlbXB0eSBpbiBYNTA5IHByaW50aW5nIHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIGRzYV9kb192ZXJpZnkgKGNyeXB0by9kc2EvZHNhX29zc2wuYyksIHZlcmlmeSB0aGF0IHIgYW5kIHMgYXJlCiAgICAgcG9zaXRpdmUgYW5kIGxlc3MgdGhhbiBxLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERvbid0IGNoYW5nZSAqcG9pbnRlciBpbiBDUllQVE9fYWRkX2xvY2soKSBpcyBhZGRfbG9ja19jYWxsYmFjayBpcwogICAgIHVzZWQ6IGl0IGlzbid0IHRocmVhZCBzYWZlIGFuZCB0aGUgYWRkX2xvY2tfY2FsbGJhY2sgc2hvdWxkIGhhbmRsZQogICAgIHRoYXQgaXRzZWxmLgogICAgIFtQYXVsIFJvc2UgPFBhdWwuUm9zZUBicmlkZ2UuY29tPl0KCiAgKikgVmVyaWZ5IHRoYXQgaW5jb21pbmcgZGF0YSBvYmV5cyB0aGUgYmxvY2sgc2l6ZSBpbgogICAgIHNzbDNfZW5jIChzc2wvczNfZW5jLmMpIGFuZCB0bHMxX2VuYyAoc3NsL3QxX2VuYy5jKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggT0FFUCBjaGVjay4KICAgICBbVWxmIE32bGxlciwgQm9kbyBN9mxsZXJdCgogICopIFRoZSBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IEJsZWljaGJhY2hlcidzIGF0dGFjayBvbiBQS0NTICMxIHYxLjUKICAgICBSU0EgZW5jcnlwdGlvbiB3YXMgYWNjaWRlbnRhbGx5IHJlbW92ZWQgaW4gczNfc3J2ci5jIGluIE9wZW5TU0wgMC45LjUKICAgICB3aGVuIGZpeGluZyB0aGUgc2VydmVyIGJlaGF2aW91ciBmb3IgYmFja3dhcmRzLWNvbXBhdGlibGUgJ2NsaWVudAogICAgIGhlbGxvJyBtZXNzYWdlcy4gIChOb3RlIHRoYXQgdGhlIGF0dGFjayBpcyBpbXByYWN0aWNhbCBhZ2FpbnN0CiAgICAgU1NMIDMuMCBhbmQgVExTIDEuMCBhbnl3YXkgYmVjYXVzZSBsZW5ndGggYW5kIHZlcnNpb24gY2hlY2tpbmcKICAgICBtZWFucyB0aGF0IHRoZSBwcm9iYWJpbGl0eSBvZiBndWVzc2luZyBhIHZhbGlkIGNpcGhlcnRleHQgaXMKICAgICBhcm91bmQgMl4tNDA7IHNlZSBzZWN0aW9uIDUgaW4gQmxlaWNoZW5iYWNoZXIncyBDUllQVE8gJzk4CiAgICAgcGFwZXIuKQoKICAgICBCZWZvcmUgMC45LjUsIHRoZSBjb3VudGVybWVhc3VyZSAoaGlkZSB0aGUgZXJyb3IgYnkgZ2VuZXJhdGluZyBhCiAgICAgcmFuZG9tICdkZWNyeXB0aW9uIHJlc3VsdCcpIGRpZCBub3Qgd29yayBwcm9wZXJseSBiZWNhdXNlCiAgICAgRVJSX2NsZWFyX2Vycm9yKCkgd2FzIG1pc3NpbmcsIG1lYW5pbmcgdGhhdCBTU0xfZ2V0X2Vycm9yKCkgd291bGQKICAgICBkZXRlY3QgdGhlIHN1cHBvc2VkbHkgaWdub3JlZCBlcnJvci4KCiAgICAgQm90aCBwcm9ibGVtcyBhcmUgbm93IGZpeGVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIGNyeXB0by9iaW8vYmZfYnVmZi5jLCBpbmNyZWFzZSBERUZBVUxUX0JVRkZFUl9TSVpFIHRvIDQwOTYKICAgICAocHJldmlvdXNseSBpdCB3YXMgMTAyNCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciBjb21wYXRpYmlsaXR5IG1vZGUgdHJ1c3Qgc2V0dGluZ3M6IGlnbm9yZSB0cnVzdCBzZXR0aW5ncwogICAgIHVubGVzcyBzb21lIHZhbGlkIHRydXN0IG9yIHJlamVjdCBzZXR0aW5ncyBhcmUgcHJlc2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZm9yIGJsb3dmaXNoIEVWUDogaXRzIGEgdmFyaWFibGUgbGVuZ3RoIGNpcGhlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdmFyaW91cyBidWdzIHJlbGF0ZWQgdG8gRFNBIFMvTUlNRSB2ZXJpZmljYXRpb24uIEhhbmRsZSBtaXNzaW5nCiAgICAgcGFyYW1ldGVycyBpbiBEU0EgcHVibGljIGtleSBzdHJ1Y3R1cmVzIGFuZCByZXR1cm4gYW4gZXJyb3IgaW4gdGhlCiAgICAgRFNBIHJvdXRpbmVzIGlmIHBhcmFtZXRlcnMgYXJlIGFic2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiB2ZXJzaW9ucyB1cCB0byAwLjkuNiwgUkFORF9maWxlX25hbWUoKSByZXNvcnRlZCB0byBmaWxlICIucm5kIgogICAgIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiBuZWl0aGVyICRSQU5ERklMRSBub3IgJEhPTUUgd2FzIHNldC4KICAgICBSQU5EX2ZpbGVfbmFtZSgpIGluIDAuOS42YSByZXR1cm5lZCBOVUxMIGluIHRoaXMgY2FzZS4gIFRoaXMgaGFzCiAgICAgY2F1c2VkIHNvbWUgY29uZnVzaW9uIHRvIFdpbmRvd3MgdXNlcnMgd2hvIGhhdmVuJ3QgZGVmaW5lZCAkSE9NRS4KICAgICBUaHVzIFJBTkRfZmlsZV9uYW1lKCkgaXMgY2hhbmdlZCBhZ2FpbjogZV9vcy5oIGNhbiBkZWZpbmUgYQogICAgIERFRkFVTFRfSE9NRSwgd2hpY2ggd2lsbCBiZSB1c2VkIGlmICRIT01FIGlzIG5vdCBzZXQuCiAgICAgRm9yIFdpbmRvd3MsIHdlIHVzZSAiQzoiOyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIHN0aWxsIHJlcXVpcmUKICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgogICopIE1vdmUgJ2lmICghaW5pdGlhbGl6ZWQpIFJBTkRfcG9sbCgpJyBpbnRvIHJlZ2lvbnMgcHJvdGVjdGVkIGJ5CiAgICAgQ1JZUFRPX0xPQ0tfUkFORC4gIFRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IGF2b2lkcwogICAgIGhhdmluZyBtdWx0aXBsZSB0aHJlYWRzIGNhbGwgUkFORF9wb2xsKCkgY29uY3VycmVudGx5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIGNyeXB0by9yYW5kL21kX3JhbmQuYywgcmVwbGFjZSAnYWRkX2RvX25vdF9sb2NrJyBmbGFnIGJ5IGEKICAgICBjb21iaW5hdGlvbiBvZiBhIGZsYWcgYW5kIGEgdGhyZWFkIElEIHZhcmlhYmxlLgogICAgIE90aGVyd2lzZSB3aGlsZSBvbmUgdGhyZWFkIGlzIGluIHNzbGVheV9yYW5kX2J5dGVzICh3aGljaCBzZXRzIHRoZQogICAgIGZsYWcpLCAqb3RoZXIqIHRocmVhZHMgY2FuIGVudGVyIHNzbGVheV9hZGRfYnl0ZXMgd2l0aG91dCBvYmV5aW5nCiAgICAgdGhlIENSWVBUT19MT0NLX1JBTkQgbG9jayAoYW5kIG1heSBldmVuIGlsbGVnYWxseSByZWxlYXNlIHRoZSBsb2NrCiAgICAgdGhhdCB0aGV5IGRvIG5vdCBob2xkIGFmdGVyIHRoZSBmaXJzdCB0aHJlYWQgdW5zZXRzIGFkZF9kb19ub3RfbG9jaykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIGJjdGVzdCBhZ2FpbjogJy14JyBleHByZXNzaW9ucyBhcmUgbm90IGF2YWlsYWJsZSBpbiBhbGwKICAgICB2ZXJzaW9ucyBvZiAndGVzdCcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjYgYW5kIDAuOS42YSAgWzUgQXByIDIwMDFdCgogICopIEZpeCBhIGNvdXBsZSBvZiBtZW1vcnkgbGVha3MgaW4gUEtDUzdfZGF0YURlY29kZSgpCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgSGV5dW4gWmhlbmcgPGh6aGVuZ0BhdGRzcHJpbnQuY29tPl0KCiAgKikgQ2hhbmdlIENvbmZpZ3VyZSBhbmQgTWFrZWZpbGVzIHRvIHByb3ZpZGUgRVhFX0VYVCwgd2hpY2ggd2lsbCBjb250YWluCiAgICAgdGhlIGRlZmF1bHQgZXh0ZW5zaW9uIGZvciBleGVjdXRhYmxlcywgaWYgYW55LiAgQWxzbywgbWFrZSB0aGUgcGVybAogICAgIHNjcmlwdHMgdGhhdCB1c2Ugc3ltbGluaygpIHRvIHRlc3QgaWYgaXQgcmVhbGx5IGV4aXN0cyBhbmQgdXNlICJjcCIKICAgICBpZiBpdCBkb2Vzbid0LiAgQWxsIHRoaXMgbWFkZSBPcGVuU1NMIGNvbXBpbGFibGUgYW5kIGluc3RhbGxhYmxlIGluCiAgICAgQ3lnV2luLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBmb3IgYXNuMV9HZXRTZXF1ZW5jZSgpIGZvciBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCBkYXRhLgogICAgIElmIFNFUVVFTkNFIGlzIGxlbmd0aCBpcyBpbmRlZmluaXRlIGp1c3Qgc2V0IGMtPnNsZW4gdG8gdGhlIHRvdGFsCiAgICAgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IHNoaWdlQEZyZWVCU0Qub3JnXQogICAgIFtUaGlzIGNoYW5nZSBkb2VzIG5vdCBhcHBseSB0byAwLjkuNy5dCgogICopIENoYW5nZSBiY3Rlc3QgdG8gYXZvaWQgaGVyZS1kb2N1bWVudHMgaW5zaWRlIGNvbW1hbmQgc3Vic3RpdHV0aW9uCiAgICAgKHdvcmthcm91bmQgZm9yIEZyZWVCU0QgL2Jpbi9zaCBidWcpLgogICAgIEZvciBjb21wYXRpYmlsaXR5IHdpdGggVWx0cml4LCBhdm9pZCBzaGVsbCBmdW5jdGlvbnMgKGludHJvZHVjZWQKICAgICBpbiB0aGUgYmN0ZXN0IHZlcnNpb24gdGhhdCBzZWFyY2hlcyBhbG9uZyAkUEFUSCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVuYW1lICdkZXNfZW5jcnlwdCcgdG8gJ2Rlc19lbmNyeXB0MScuICBUaGlzIGF2b2lkcyB0aGUgY2xhc2hlcwogICAgIHdpdGggZGVzX2VuY3J5cHQoKSBkZWZpbmVkIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIGxpa2UgU29sYXJpcwogICAgIGFuZCBVbml4V2FyZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGVjayB0aGUgcmVzdWx0IG9mIFJTQS1DUlQgKHNlZSBELiBCb25laCwgUi4gRGVNaWxsbywgUi4gTGlwdG9uOgogICAgIE9uIHRoZSBJbXBvcnRhbmNlIG9mIEVsaW1pbmF0aW5nIEVycm9ycyBpbiBDcnlwdG9ncmFwaGljCiAgICAgQ29tcHV0YXRpb25zLCBKLiBDcnlwdG9sb2d5IDE0ICgyMDAxKSAyLCAxMDEtMTE5LAogICAgIGh0dHA6Ly90aGVvcnkuc3RhbmZvcmQuZWR1L35kYWJvL3BhcGVycy9mYXVsdHMucHMuZ3opLgogICAgIFtVbGYgTW9lbGxlcl0KICAKICAqKSBNSVBTIGFzc2VtYmxlciBCSUdOVU0gZGl2aXNpb24gYnVnIGZpeC4gCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIERpc2FibGVkIGluY29ycmVjdCBBbHBoYSBhc3NlbWJsZXIgY29kZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggUEtDUyM3IGRlY29kZSByb3V0aW5lcyBzbyB0aGV5IGNvcnJlY3RseSB1cGRhdGUgdGhlIGxlbmd0aAogICAgIGFmdGVyIHJlYWRpbmcgYW4gRU9DIGZvciB0aGUgRVhQTElDSVQgdGFnLgogICAgIFtTdGV2ZSBIZW5zb25dCiAgICAgW1RoaXMgY2hhbmdlIGRvZXMgbm90IGFwcGx5IHRvIDAuOS43Ll0KCiAgKikgRml4IGJ1ZyBpbiBQS0NTIzEyIGtleSBnZW5lcmF0aW9uIHJvdXRpbmVzLiBUaGlzIHdhcyB0cmlnZ2VyZWQKICAgICBpZiBhIDNERVMga2V5IHdhcyBnZW5lcmF0ZWQgd2l0aCBhIDAgaW5pdGlhbCBieXRlLiBJbmNsdWRlCiAgICAgUEtDUzEyX0JST0tFTl9LRVlHRU4gY29tcGlsYXRpb24gb3B0aW9uIHRvIHJldGFpbiB0aGUgb2xkCiAgICAgKGJ1dCBicm9rZW4pIGJlaGF2aW91ci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIGJjdGVzdCB0byBzZWFyY2ggZm9yIGEgd29ya2luZyBiYyBhbG9uZyAkUEFUSCBhbmQgcHJpbnQKICAgICBpdCB3aGVuIGZvdW5kLgogICAgIFtUaW0gUmljZSA8dGltQG11bHRpdGFsZW50cy5uZXQ+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBtZW1vcnkgbGVha3MgaW4gZXJyLmM6IGZyZWUgZXJyX2RhdGEgc3RyaW5nIGlmIG5lY2Vzc2FyeTsKICAgICBkb24ndCB3cml0ZSB0byB0aGUgd3JvbmcgaW5kZXggaW4gRVJSX3NldF9lcnJvcl9kYXRhLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEltcGxlbWVudCBzc2wyM19wZWVrIChhbmFsb2dvdXMgdG8gc3NsMjNfcmVhZCksIHdoaWNoIHByZXZpb3VzbHkKICAgICBkaWQgbm90IGV4aXN0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlcGxhY2UgcmR0c2Mgd2l0aCBfZW1pdCBzdGF0ZW1lbnRzIGZvciBWQysrIHZlcnNpb24gNS4KICAgICBbSmVyZW15IENvb3BlciA8amVyZW15QGJheW1vby5vcmc+XQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHJldXNlIFNTTHYyIHNlc3Npb25zLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIGNvcHlfZW1haWwoKSBjaGVjayBmb3IgPj0gMCBhcyBhIHJldHVybiB2YWx1ZSBmb3IKICAgICBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRCgpIHNpbmNlIDAgaXMgYSB2YWxpZCBpbmRleC4KICAgICBbU3RldmUgSGVuc29uIHJlcG9ydGVkIGJ5IE1hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQG9wZW5zY2Eub3JnPl0KCiAgKikgQXZvaWQgY29yZWR1bXAgd2l0aCB1bnN1cHBvcnRlZCBvciBpbnZhbGlkIHB1YmxpYyBrZXlzIGJ5IGNoZWNraW5nIGlmCiAgICAgWDUwOV9nZXRfcHVia2V5KCkgZmFpbHMgaW4gUEtDUzdfdmVyaWZ5KCkuIEZpeCBtZW1vcnkgbGVhayB3aGVuCiAgICAgUEtDUzdfdmVyaWZ5KCkgZmFpbHMgd2l0aCBub24gZGV0YWNoZWQgZGF0YS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEb24ndCB1c2UgZ2V0ZW52IGluIGxpYnJhcnkgZnVuY3Rpb25zIHdoZW4gcnVuIGFzIHNldHVpZC9zZXRnaWQuCiAgICAgTmV3IGZ1bmN0aW9uIE9QRU5TU0xfaXNzZXR1Z2lkKCkuCiAgICAgW1VsZiBNb2VsbGVyXQoKICAqKSBBdm9pZCBmYWxzZSBwb3NpdGl2ZXMgaW4gbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIGNvZGUgKGNyeXB0by9tZW1fZGJnLmMpCiAgICAgZHVlIHRvIGluY29ycmVjdCBoYW5kbGluZyBvZiBtdWx0aS10aHJlYWRpbmc6CgogICAgIDEuIEZpeCB0aW1pbmcgZ2xpdGNoIGluIHRoZSBNZW1DaGVja19vZmYoKSBwb3J0aW9uIG9mIENSWVBUT19tZW1fY3RybCgpLgoKICAgICAyLiBGaXggbG9naWNhbCBnbGl0Y2ggaW4gaXNfTWVtQ2hlY2tfb24oKSBha2EgQ1JZUFRPX2lzX21lbV9jaGVja19vbigpLgoKICAgICAzLiBDb3VudCBob3cgbWFueSB0aW1lcyBNZW1DaGVja19vZmYoKSBoYXMgYmVlbiBjYWxsZWQgc28gdGhhdAogICAgICAgIG5lc3RlZCB1c2UgY2FuIGJlIHRyZWF0ZWQgY29ycmVjdGx5LiAgVGhpcyBhbHNvIGF2b2lkcyAKICAgICAgICBpbmJhbmQtc2lnbmFsbGluZyBpbiB0aGUgcHJldmlvdXMgY29kZSAod2hpY2ggcmVsaWVkIG9uIHRoZQogICAgICAgIGFzc3VtcHRpb24gdGhhdCB0aHJlYWQgSUQgMCBpcyBpbXBvc3NpYmxlKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgIi1yYW5kIiBvcHRpb24gYWxzbyB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBDUFUgZGV0ZWN0aW9uIG9uIElyaXggNi54LgogICAgIFtLdXJ0IEhvY2tlbmJ1cnkgPGtob2NrZW5iQHN0ZXZlbnMtdGVjaC5lZHU+IGFuZAogICAgICAiQnJ1Y2UgVy4gRm9yc2JlcmciIDxicnVjZS5mb3JzYmVyZ0BiYWVzeXN0ZW1zLmNvbT5dCgogICopIEZpeCBYNTA5X05BTUUgYnVnIHdoaWNoIHByb2R1Y2VkIGluY29ycmVjdCBlbmNvZGluZyBpZiBYNTA5X05BTUUKICAgICB3YXMgZW1wdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAgICBbVGhpcyBjaGFuZ2UgZG9lcyBub3QgYXBwbHkgdG8gMC45LjcuXQoKICAqKSBVc2UgdGhlIGNhY2hlZCBlbmNvZGluZyBvZiBhbiBYNTA5X05BTUUgc3RydWN0dXJlIHJhdGhlciB0aGFuCiAgICAgY29weWluZyBpdC4gVGhpcyBpcyBhcHBhcmVudGx5IHRoZSByZWFzb24gZm9yIHRoZSBsaWJzYWZlICJlcnJvcnMiCiAgICAgYnV0IHRoZSBjb2RlIGlzIGFjdHVhbGx5IGNvcnJlY3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbiBCTl9yYW5kX3JhbmdlKCksIGFuZCBmaXggRFNBX3NpZ25fc2V0dXAoKSB0byBwcmV2ZW50CiAgICAgQmxlaWNoZW5iYWNoZXIncyBEU0EgYXR0YWNrLgogICAgIEV4dGVuZCBCTl9bcHNldWRvX11yYW5kOiBBcyBiZWZvcmUsIHRvcD0xIGZvcmNlcyB0aGUgaGlnaGVzdCB0d28gYml0cwogICAgIHRvIGJlIHNldCBhbmQgdG9wPTAgZm9yY2VzIHRoZSBoaWdoZXN0IGJpdCB0byBiZSBzZXQ7IHRvcD0tMSBpcyBuZXcKICAgICBhbmQgbGVhdmVzIHRoZSBoaWdoZXN0IGJpdCByYW5kb20uCiAgICAgW1VsZiBNb2VsbGVyLCBCb2RvIE1vZWxsZXJdCgogICopIEluIHRoZSBOQ09ORl8uLi4tYmFzZWQgaW1wbGVtZW50YXRpb25zIGZvciBDT05GXy4uLiBxdWVyaWVzCiAgICAgKGNyeXB0by9jb25mL2NvbmZfbGliLmMpLCBpZiB0aGUgaW5wdXQgTEhBU0ggaXMgTlVMTCwgYXZvaWQgdXNpbmcKICAgICBhIHRlbXBvcmFyeSBDT05GIHN0cnVjdHVyZSB3aXRoIHRoZSBkYXRhIGNvbXBvbmVudCBzZXQgdG8gTlVMTAogICAgICh3aGljaCBnaXZlcyBzZWdtZW50YXRpb24gZmF1bHRzIGluIGxoX3JldHJpZXZlKS4KICAgICBJbnN0ZWFkLCB1c2UgTlVMTCBmb3IgdGhlIENPTkYgcG9pbnRlciBpbiBDT05GX2dldF9zdHJpbmcgYW5kCiAgICAgQ09ORl9nZXRfbnVtYmVyICh3aGljaCBtYXkgdXNlIGVudmlyb25tZW50IHZhcmlhYmxlcykgYW5kIGRpcmVjdGx5CiAgICAgcmV0dXJuIE5VTEwgZnJvbSBDT05GX2dldF9zZWN0aW9uLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW4gZm9yIEVCQ0RJQy4KICAgICBbVWxmIE1vZWxsZXJdCgogICopIFRvbGVyYXRlIG5vblJlcHVkaWF0aW9uIGFzIGJlaW5nIHZhbGlkIGZvciBTL01JTUUgc2lnbmluZyBhbmQgY2VydFNpZ24KICAgICBrZXlVc2FnZSBpZiBiYXNpY0NvbnN0cmFpbnRzIGFic2VudCBmb3IgYSBDQS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFNNSU1FX3dyaXRlX1BLQ1M3KCkgd3JpdGUgbWFpbCBoZWFkZXIgdmFsdWVzIHdpdGggYSBmb3JtYXQgdGhhdAogICAgIGlzIG1vcmUgZ2VuZXJhbGx5IGFjY2VwdGVkIChubyBzcGFjZXMgYmVmb3JlIHRoZSBzZW1pY29sb24pLCBzaW5jZQogICAgIHNvbWUgcHJvZ3JhbXMgY2FuJ3QgcGFyc2UgdGhvc2UgdmFsdWVzIHByb3Blcmx5IG90aGVyd2lzZS4gIEFsc28gbWFrZQogICAgIHN1cmUgQklPJ3MgdGhhdCBicmVhayBsaW5lcyBhZnRlciBlYWNoIHdyaXRlIGRvIG5vdCBjcmVhdGUgaW52YWxpZAogICAgIGhlYWRlcnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSB0aGUgQ1JMIGVuY29kaW5nIHJvdXRpbmVzIHdvcmsgd2l0aCBlbXB0eSBTRVFVRU5DRSBPRi4gVGhlCiAgICAgbWFjcm9zIHByZXZpb3VzbHkgdXNlZCB3b3VsZCBub3QgZW5jb2RlIGFuIGVtcHR5IFNFUVVFTkNFIE9GCiAgICAgYW5kIGJyZWFrIHRoZSBzaWduYXR1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAgICBbVGhpcyBjaGFuZ2UgZG9lcyBub3QgYXBwbHkgdG8gMC45LjcuXQoKICAqKSBaZXJvIHRoZSBwcmVtYXN0ZXIgc2VjcmV0IGFmdGVyIGRlcml2aW5nIHRoZSBtYXN0ZXIgc2VjcmV0IGluCiAgICAgREggY2lwaGVyc3VpdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzb21lIEVWUF9hZGRfZGlnZXN0X2FsaWFzIHJlZ2lzdHJhdGlvbnMgKGFzIGZvdW5kIGluCiAgICAgT3BlblNTTF9hZGRfYWxsX2RpZ2VzdHMoKSkgdG8gU1NMX2xpYnJhcnlfaW5pdCgpCiAgICAgYWthIE9wZW5TU0xfYWRkX3NzbF9hbGdvcml0aG1zKCkuICBUaGlzIHByb3ZpZGVzIGltcHJvdmVkCiAgICAgY29tcGF0aWJpbGl0eSB3aXRoIHBlZXJzIHVzaW5nIFguNTA5IGNlcnRpZmljYXRlcwogICAgIHdpdGggdW5jb252ZW50aW9uYWwgQWxnb3JpdGhtSWRlbnRpZmllciBPSURzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBmb3IgSXJpeCB3aXRoIE5PX0FTTS4KICAgICBbIkJydWNlIFcuIEZvcnNiZXJnIiA8YnJ1Y2UuZm9yc2JlcmdAYmFlc3lzdGVtcy5jb20+XQoKICAqKSAuL2NvbmZpZyBzY3JpcHQgZml4ZXMuCiAgICAgW1VsZiBNb2VsbGVyLCBSaWNoYXJkIExldml0dGVdCgogICopIEZpeCAnb3BlbnNzbCBwYXNzd2QgLTEnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBQS0NTMTJfa2V5X2dlbl9hc2MoKSBzbyBpdCBjYW4gY29wZSB3aXRoIG5vbiBudWxsCiAgICAgdGVybWluYXRlZCBzdHJpbmdzIHdob3NlIGxlbmd0aCBpcyBwYXNzZWQgaW4gdGhlIHBhc3NsZW4KICAgICBwYXJhbWV0ZXIsIGZvciBleGFtcGxlIGZyb20gUEVNIGNhbGxiYWNrcy4gVGhpcyB3YXMgZG9uZQogICAgIGJ5IGFkZGluZyBhbiBleHRyYSBsZW5ndGggcGFyYW1ldGVyIHRvIGFzYzJ1bmkoKS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSA8b2RkaXNzZXlAc2Ftc3VuZy5jby5rcj5dCgogICopIEZpeCBDIGNvZGUgZ2VuZXJhdGVkIGJ5ICdvcGVuc3NsIGRzYXBhcmFtIC1DJzogSWYgYSBCTl9iaW4yYm4KICAgICBjYWxsIGZhaWxlZCwgZnJlZSB0aGUgRFNBIHN0cnVjdHVyZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggdG8gdW5pMmFzYygpIHRvIGNvcGUgd2l0aCB6ZXJvIGxlbmd0aCBVbmljb2RlIHN0cmluZ3MuCiAgICAgVGhlc2UgYXJlIHByZXNlbnQgaW4gc29tZSBQS0NTIzEyIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluY3JlYXNlIHMyLT53YnVmIGFsbG9jYXRpb24gYnkgb25lIGJ5dGUgaW4gc3NsMl9uZXcgKHNzbC9zMl9saWIuYykuCiAgICAgT3RoZXJ3aXNlIGRvX3NzbF93cml0ZSAoc3NsL3MyX3BrdC5jKSB3aWxsIHdyaXRlIGJleW9uZCBidWZmZXIgbGltaXRzCiAgICAgd2hlbiB3cml0aW5nIGEgMzI3NjcgYnl0ZSByZWNvcmQuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSByZXBvcnRlZCBieSBFcmljIERheSA8ZWRheUBjb25jZW50cmljLm5ldD5dCgogICopIEluIFJTQV9lYXlfcHVibGljX3tlbixlZH1jcnlwdCBhbmQgUlNBX2VheV9tb2RfZXhwIChyc2FfZWF5LmMpLAogICAgIG9idGFpbiBsb2NrIENSWVBUT19MT0NLX1JTQSBiZWZvcmUgc2V0dGluZyByc2EtPl9tZXRob2RfbW9kX3tuLHAscX0uCgogICAgIChSU0Egb2JqZWN0cyBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IGFjY2VzcyB0byB3aGljaCBpcyBwcm90ZWN0ZWQKICAgICBieSBDUllQVE9fTE9DS19SU0EgW3NlZSByc2FfbGliLmMsIHMzX3NydnIuYywgc3NsX2NlcnQuYywgc3NsX3JzYS5jXSwKICAgICBzbyB0aGV5IGFyZSBtZWFudCB0byBiZSBzaGFyZWQgYmV0d2VlbiB0aHJlYWRzLikKICAgICBbQm9kbyBNb2VsbGVyLCBHZW9mZiBUaG9ycGU7IG9yaWdpbmFsIHBhdGNoIHN1Ym1pdHRlZCBieQogICAgICJSZWRkaWUsIFN0ZXZlbiIgPFN0ZXZlbi5SZWRkaWVAY2EuY29tPl0KCiAgKikgRml4IGEgZGVhZGxvY2sgaW4gQ1JZUFRPX21lbV9sZWFrcygpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVzZSBiZXR0ZXIgdGVzdCBwYXR0ZXJucyBpbiBibnRlc3QuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIHJhbmRfd2luLmMgZml4IGZvciBCb3JsYW5kIEMuCiAgICAgW1VsZiBN9mxsZXJdCiAKICAqKSBCTl9yc2hpZnQgYnVnZml4IGZvciBuID09IDAuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGEgJ2JjdGVzdCcgc2NyaXB0IHRoYXQgY2hlY2tzIGZvciBzb21lIGtub3duICdiYycgYnVncwogICAgIHNvIHRoYXQgJ21ha2UgdGVzdCcgZG9lcyBub3QgYWJvcnQganVzdCBiZWNhdXNlICdiYycgaXMgYnJva2VuLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN0b3JlIHZlcmlmeV9yZXN1bHQgd2l0aGluIFNTTF9TRVNTSU9OIGFsc28gZm9yIGNsaWVudCBzaWRlIHRvCiAgICAgYXZvaWQgcG90ZW50aWFsIHNlY3VyaXR5IGhvbGUuIChSZS11c2VkIHNlc3Npb25zIG9uIHRoZSBjbGllbnQgc2lkZQogICAgIGFsd2F5cyByZXN1bHRlZCBpbiB2ZXJpZnlfcmVzdWx0PT1YNTA5X1ZfT0ssIG5vdCB1c2luZyB0aGUgb3JpZ2luYWwKICAgICByZXN1bHQgb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uKQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggc3NsM19wZW5kaW5nOiBJZiB0aGUgcmVjb3JkIGluIHMtPnMzLT5ycmVjIGlzIG5vdCBvZiB0eXBlCiAgICAgU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBLCByZXR1cm4gMC4KICAgICBTaW1pbGFybHksIGNoYW5nZSBzc2wyX3BlbmRpbmcgdG8gcmV0dXJuIDAgaWYgU1NMX2luX2luaXQocykgaXMgdHJ1ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggU1NMX3BlZWs6CiAgICAgQm90aCBzc2wyX3BlZWsgYW5kIHNzbDNfcGVlaywgd2hpY2ggd2VyZSB0b3RhbGx5IGJyb2tlbiBpbiBlYXJsaWVyCiAgICAgcmVsZWFzZXMsIGhhdmUgYmVlbiByZS1pbXBsZW1lbnRlZCBieSByZW5hbWluZyB0aGUgcHJldmlvdXMKICAgICBpbXBsZW1lbnRhdGlvbnMgb2Ygc3NsMl9yZWFkIGFuZCBzc2wzX3JlYWQgdG8gc3NsMl9yZWFkX2ludGVybmFsCiAgICAgYW5kIHNzbDNfcmVhZF9pbnRlcm5hbCwgcmVzcGVjdGl2ZWx5LCBhbmQgYWRkaW5nICdwZWVrJyBwYXJhbWV0ZXJzCiAgICAgdG8gdGhlbS4gIFRoZSBuZXcgc3NsWzIzXV97cmVhZCxwZWVrfSBmdW5jdGlvbnMgYXJlIGNhbGxzIHRvCiAgICAgc3NsWzIzXV9yZWFkX2ludGVybmFsIHdpdGggdGhlICdwZWVrJyBmbGFnIHNldCBhcHByb3ByaWF0ZWx5LgogICAgIEEgJ3BlZWsnIHBhcmFtZXRlciBoYXMgYWxzbyBiZWVuIGFkZGVkIHRvIHNzbDNfcmVhZF9ieXRlcywgd2hpY2gKICAgICBkb2VzIHRoZSBhY3R1YWwgd29yayBmb3Igc3NsM19yZWFkX2ludGVybmFsLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluaXRpYWxpc2UgImV4X2RhdGEiIG1lbWJlciBvZiBSU0EvRFNBL0RIIHN0cnVjdHVyZXMgcHJpb3IgdG8gY2FsbGluZwogICAgIHRoZSBtZXRob2Qtc3BlY2lmaWMgImluaXQoKSIgaGFuZGxlci4gQWxzbyBjbGVhbiB1cCBleF9kYXRhIGFmdGVyCiAgICAgY2FsbGluZyB0aGUgbWV0aG9kLXNwZWNpZmljICJmaW5pc2goKSIgaGFuZGxlci4gUHJldmlvdXNseSwgdGhpcyB3YXMKICAgICBoYXBwZW5pbmcgdGhlIG90aGVyIHdheSByb3VuZC4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBJbmNyZWFzZSBCTl9DVFhfTlVNICh0aGUgbnVtYmVyIG9mIEJJR05VTXMgaW4gYSBCTl9DVFgpIHRvIDE2LgogICAgIFRoZSBwcmV2aW91cyB2YWx1ZSwgMTIsIHdhcyBub3QgYWx3YXlzIHN1ZmZpY2llbnQgZm9yIEJOX21vZF9leHAoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIHN1cmUgdGhhdCBzaGFyZWQgbGlicmFyaWVzIGdldCB0aGUgaW50ZXJuYWwgbmFtZSBlbmdpbmUgd2l0aAogICAgIHRoZSBmdWxsIHZlcnNpb24gbnVtYmVyIGFuZCBub3QganVzdCAwLiAgVGhpcyBzaG91bGQgbWFyayB0aGUKICAgICBzaGFyZWQgbGlicmFyaWVzIGFzIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlLiAgT2YgY291cnNlLCB0aGlzIHNob3VsZAogICAgIGJlIGNoYW5nZWQgYWdhaW4gd2hlbiB3ZSBjYW4gZ3VhcmFudGVlIGJhY2t3YXJkIGJpbmFyeSBjb21wYXRpYmlsaXR5LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCB0eXBvIGluIGdldF9jZXJ0X2J5X3N1YmplY3QoKSBpbiBieV9kaXIuYwogICAgIFtKZWFuLU1hcmMgRGVzcGVycmllciA8amVhbi1tYXJjLmRlc3BlcnJpZXJAY2VydHBsdXMuY29tPl0KCiAgKikgUmV3b3JrIHRoZSBzeXN0ZW0gdG8gZ2VuZXJhdGUgc2hhcmVkIGxpYnJhcmllczoKCiAgICAgLSBNYWtlIG5vdGUgb2YgdGhlIGV4cGVjdGVkIGV4dGVuc2lvbiBmb3IgdGhlIHNoYXJlZCBsaWJyYXJpZXMgYW5kCiAgICAgICBpZiB0aGVyZSBpcyBhIG5lZWQgZm9yIHN5bWJvbGljIGxpbmtzIGZyb20gZm9yIGV4YW1wbGUgbGliY3J5cHRvLnNvLjAKICAgICAgIHRvIGxpYmNyeXB0by5zby4wLjkuNy4gIFRoZXJlIGlzIGV4dGVuZGVkIGluZm8gaW4gQ29uZmlndXJlIGZvcgogICAgICAgdGhhdC4KCiAgICAgLSBNYWtlIGFzIGZldyByZWJ1aWxkcyBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyBhcyBwb3NzaWJsZS4KCiAgICAgLSBTdGlsbCBhdm9pZCBsaW5raW5nIHRoZSBPcGVuU1NMIHByb2dyYW1zIHdpdGggdGhlIHNoYXJlZCBsaWJyYXJpZXMuCgogICAgIC0gV2hlbiBpbnN0YWxsaW5nLCBpbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyaWVzIHNlcGFyYXRlbHkgZnJvbSB0aGUKICAgICAgIHN0YXRpYyBvbmVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBTU0xfQ1RYX3NldF9yZWFkX2FoZWFkIG1hY3JvIHRvIGFjdHVhbGx5IHVzZSBpdHMgYXJndW1lbnQuCgogICAgIENvcHkgU1NMX0NUWCdzIHJlYWRfYWhlYWQgZmxhZyB0byBTU0wgb2JqZWN0IGRpcmVjdGx5IGluIFNTTF9uZXcKICAgICBhbmQgbm90IGluIFNTTF9jbGVhciBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMgYWxzbyB1c2VkIGJ5IHRoZQogICAgIGFjY2VwdC9jb25uZWN0IGZ1bmN0aW9uczsgcHJldmlvdXNseSwgdGhlIHNldHRpbmdzIG1hZGUgYnkKICAgICBTU0xfc2V0X3JlYWRfYWhlYWQgd291bGQgYmUgbG9zdCBkdXJpbmcgdGhlIGhhbmRzaGFrZS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtcyByZXBvcnRlZCBieSBBbmRlcnMgR2VydHogPGdlcnR6QGVwYWN0LnNlPl0gICAgIAoKICAqKSBDb3JyZWN0IHV0aWwvbWtkZWYucGwgdG8gYmUgc2VsZWN0aXZlIGFib3V0IGRpc2FibGVkIGFsZ29yaXRobXMuCiAgICAgUHJldmlvdXNseSwgaXQgd291bGQgY3JlYXRlIGVudHJpZXMgZm9yIGRpc2FibGVlZCBhbGdvcml0aG1zIG5vCiAgICAgbWF0dGVyIHdoYXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkZWQgc2V2ZXJhbCBuZXcgbWFudWFsIHBhZ2VzIGZvciBTU0xfKiBmdW5jdGlvbi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjVhIGFuZCAwLjkuNiAgWzI0IFNlcCAyMDAwXQoKICAqKSBJbiBzc2wyM19nZXRfY2xpZW50X2hlbGxvLCBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIHdoZW4gZmFjZWQKICAgICB3aXRoIGFuIGluaXRpYWwgU1NMIDMuMC9UTFMgcmVjb3JkIHRoYXQgaXMgdG9vIHNtYWxsIHRvIGNvbnRhaW4gdGhlCiAgICAgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBDbGllbnRIZWxsbyBtZXNzYWdlLCBpLmUuIGNsaWVudF92ZXJzaW9uLgogICAgIChOb3RlIHRoYXQgdGhpcyBpcyBhIHBhdGhvbG9naWMgY2FzZSB0aGF0IHByb2JhYmx5IGhhcyBuZXZlciBoYXBwZW5lZAogICAgIGluIHJlYWwgbGlmZS4pICBUaGUgcHJldmlvdXMgYXBwcm9hY2ggd2FzIHRvIHVzZSB0aGUgdmVyc2lvbiBudW1iZXIKICAgICBmcm9tIHRoZSByZWNvcmQgaGVhZGVyIGFzIGEgc3Vic3RpdHV0ZTsgYnV0IG91ciBwcm90b2NvbCBjaG9pY2UKICAgICBzaG91bGQgbm90IGRlcGVuZCBvbiB0aGF0IG9uZSBiZWNhdXNlIGl0IGlzIG5vdCBhdXRoZW50aWNhdGVkCiAgICAgYnkgdGhlIEZpbmlzaGVkIG1lc3NhZ2VzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vcmUgcm9idXN0IHJhbmRvbW5lc3MgZ2F0aGVyaW5nIGZ1bmN0aW9ucyBmb3IgV2luZG93cy4KICAgICBbSmVmZnJleSBBbHRtYW4gPGphbHRtYW5AY29sdW1iaWEuZWR1Pl0KCiAgKikgRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyBpZiB0aGUgZmxhZyBYNTA5X1ZfRkxBR19JU1NVRVJfQ0hFQ0sgaXMKICAgICBub3Qgc2V0IHRoZW4gd2UgZG9uJ3Qgc2V0dXAgdGhlIGVycm9yIGNvZGUgZm9yIGlzc3VlciBjaGVjayBlcnJvcnMKICAgICB0byBhdm9pZCBwb3NzaWJseSBvdmVyd3JpdGluZyBvdGhlciBlcnJvcnMgd2hpY2ggdGhlIGNhbGxiYWNrIGRvZXMKICAgICBoYW5kbGUuIElmIGFuIGFwcGxpY2F0aW9uIGRvZXMgc2V0IHRoZSBmbGFnIHRoZW4gd2UgYXNzdW1lIGl0IGtub3dzCiAgICAgd2hhdCBpdCBpcyBkb2luZyBhbmQgY2FuIGhhbmRsZSB0aGUgbmV3IGluZm9ybWF0aW9uYWwgY29kZXMKICAgICBhcHByb3ByaWF0ZWx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmb3IgYSBuYXN0eSBidWcgaW4gQVNOMV9UWVBFIGhhbmRsaW5nLiBBU04xX1RZUEUgaXMgdXNlZCBmb3IKICAgICBhIGdlbmVyYWwgIkFOWSIgdHlwZSwgYXMgc3VjaCBpdCBzaG91bGQgYmUgYWJsZSB0byBkZWNvZGUgYW55dGhpbmcKICAgICBpbmNsdWRpbmcgdGFnZ2VkIHR5cGVzLiBIb3dldmVyIGl0IGRpZG4ndCBjaGVjayB0aGUgY2xhc3Mgc28gaXQgd291bGQKICAgICB3cm9uZ2x5IGludGVycHJldCB0YWdnZWQgdHlwZXMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZWlyIHVuaXZlcnNhbAogICAgIGNvdW50ZXJwYXJ0IGFuZCB1bmtub3duIHR5cGVzIHdlcmUganVzdCByZWplY3RlZC4gQ2hhbmdlZCBzbyB0aGF0IHRoZQogICAgIHRhZ2dlZCBhbmQgdW5rbm93biB0eXBlcyBhcmUgaGFuZGxlZCBpbiB0aGUgc2FtZSB3YXkgYXMgYSBTRVFVRU5DRToKICAgICB0aGF0IGlzIHRoZSBlbmNvZGluZyBpcyBzdG9yZWQgaW50YWN0LiBUaGVyZSBpcyBhbHNvIGEgbmV3IHR5cGUKICAgICAiVl9BU04xX09USEVSIiB3aGljaCBpcyB1c2VkIHdoZW4gdGhlIGNsYXNzIGlzIG5vdCB1bml2ZXJzYWwsIGluIHRoaXMKICAgICBjYXNlIHdlIGhhdmUgbm8gaWRlYSB3aGF0IHRoZSBhY3R1YWwgdHlwZSBpcyBzbyB3ZSBqdXN0IGx1bXAgdGhlbSBhbGwKICAgICB0b2dldGhlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBPbiBWTVMsIHN0ZG91dCBtYXkgdmVyeSB3ZWxsIGxlYWQgdG8gYSBmaWxlIHRoYXQgaXMgd3JpdHRlbiB0bwogICAgIGluIGEgcmVjb3JkLW9yaWVudGVkIGZhc2hpb24uICBUaGF0IG1lYW5zIHRoYXQgZXZlcnkgd3JpdGUoKSB3aWxsCiAgICAgd3JpdGUgYSBzZXBhcmF0ZSByZWNvcmQsIHdoaWNoIHdpbGwgYmUgcmVhZCBzZXBhcmF0ZWx5IGJ5IHRoZQogICAgIHByb2dyYW1zIHRyeWluZyB0byByZWFkIGZyb20gaXQuICBUaGlzIGNhbiBiZSB2ZXJ5IGNvbmZ1c2luZy4KCiAgICAgVGhlIHNvbHV0aW9uIGlzIHRvIHB1dCBhIEJJTyBmaWx0ZXIgaW4gdGhlIHdheSB0aGF0IHdpbGwgYnVmZmVyCiAgICAgdGV4dCB1bnRpbCBhIGxpbmVmZWVkIGlzIHJlYWNoZWQsIGFuZCB0aGVuIHdyaXRlIGV2ZXJ5dGhpbmcgYQogICAgIGxpbmUgYXQgYSB0aW1lLCBzbyBldmVyeSByZWNvcmQgd3JpdHRlbiB3aWxsIGJlIGFuIGFjdHVhbCBsaW5lLAogICAgIG5vdCBjaHVua3Mgb2YgbGluZXMgYW5kIG5vdCAodXN1YWxseSBkb2Vzbid0IGhhcHBlbiwgYnV0IEkndmUKICAgICBzZWVuIGl0IG9uY2UpIHNldmVyYWwgbGluZXMgaW4gb25lIHJlY29yZC4gIEJJT19mX2xpbmVidWZmZXIoKSBpcwogICAgIHRoZSBhbnN3ZXIuCgogICAgIEN1cnJlbnRseSwgaXQncyBhIFZNUy1vbmx5IG1ldGhvZCwgYmVjYXVzZSB0aGF0J3Mgd2hlcmUgaXQgaGFzCiAgICAgYmVlbiB0ZXN0ZWQgd2VsbCBlbm91Z2guCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmVtb3ZlICdvcHRpbWl6ZWQnIHNxdWFyaW5nIHZhcmlhbnQgaW4gQk5fbW9kX211bF9tb250Z29tZXJ5LAogICAgIGl0IGNhbiByZXR1cm4gaW5jb3JyZWN0IHJlc3VsdHMuCiAgICAgKE5vdGU6IFRoZSBidWdneSB2YXJpYW50IHdhcyBub3QgZW5hYmxlZCBpbiBPcGVuU1NMIDAuOS41YSwKICAgICBidXQgaXQgd2FzIGluIDAuOS42LWJldGFbMTJdLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEaXNhYmxlIHRoZSBjaGVjayBmb3IgY29udGVudCBiZWluZyBwcmVzZW50IHdoZW4gdmVyaWZ5aW5nIGRldGFjaGVkCiAgICAgc2lnbmF0dXJlcyBpbiBwazdfc21pbWUuYy4gU29tZSB2ZXJzaW9ucyBvZiBOZXRzY2FwZSAod3JvbmdseSkKICAgICBpbmNsdWRlIHplcm8gbGVuZ3RoIGNvbnRlbnQgd2hlbiBzaWduaW5nIG1lc3NhZ2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBCSU9fc2h1dGRvd25fd3IgbWFjcm8sIHdoaWNoIGludm9rZXMgdGhlIEJJT19DX1NIVVRET1dOX1dSCiAgICAgQklPX2N0cmwgKGZvciBCSU8gcGFpcnMpLgogICAgIFtCb2RvIE32bGxlcl0KCiAgKikgQWRkIERTTyBtZXRob2QgZm9yIFZNUy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBCdWcgZml4OiBNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uIGNvdWxkIHByb2R1Y2UgcmVzdWx0cyB3aXRoIHRoZQogICAgIHdyb25nIHNpZ24uCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBSUE0gc3BlY2lmaWNhdGlvbiBvcGVuc3NsLnNwZWMgYW5kIG1vZGlmeSBpdCB0byBidWlsZCB0aHJlZQogICAgIHBhY2thZ2VzLiAgVGhlIGRlZmF1bHQgcGFja2FnZSBjb250YWlucyBhcHBsaWNhdGlvbnMsIGFwcGxpY2F0aW9uCiAgICAgZG9jdW1lbnRhdGlvbiBhbmQgcnVuLXRpbWUgbGlicmFyaWVzLiAgVGhlIGRldmVsIHBhY2thZ2UgY29udGFpbnMKICAgICBpbmNsdWRlIGZpbGVzLCBzdGF0aWMgbGlicmFyaWVzIGFuZCBmdW5jdGlvbiBkb2N1bWVudGF0aW9uLiAgVGhlCiAgICAgZG9jIHBhY2thZ2UgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBkb2MgZGlyZWN0b3J5LiAgVGhlIG9yaWdpbmFsCiAgICAgb3BlbnNzbC5zcGVjIHdhcyBwcm92aWRlZCBieSBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+LgogICAgIFtSaWNoYXJkIExldml0dGVdCiAgICAgCiAgKikgQWRkIGEgbGFyZ2UgbnVtYmVyIG9mIGRvY3VtZW50YXRpb24gZmlsZXMgZm9yIG1hbnkgU1NMIHJvdXRpbmVzLgogICAgIFtMdXR6IEphZW5pY2tlIDxMdXR6LkphZW5pY2tlQGFldC5UVS1Db3R0YnVzLkRFPl0KCiAgKikgQWRkIGEgY29uZmlndXJhdGlvbiBlbnRyeSBmb3IgU29ueSBOZXdzIDQuCiAgICAgW05BS0FKSSBIaXJveXVraSA8bmFrYWppQHR1dHJwLnR1dC5hYy5qcD5dCgogICopIERvbid0IHNldCB0aGUgdHdvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyB0byBvbmUgd2hlbiBnZW5lcmF0aW5nIGEKICAgICByYW5kb20gbnVtYmVyIDwgcSBpbiB0aGUgRFNBIGxpYnJhcnkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIE5ldyBTU0wgQVBJIG1vZGUgJ1NTTF9NT0RFX0FVVE9fUkVUUlknLiAgVGhpcyBkaXNhYmxlcyB0aGUgZGVmYXVsdAogICAgIGJlaGF2aW91ciB0aGF0IFNTTF9yZWFkIG1heSByZXN1bHQgaW4gU1NMX0VSUk9SX1dBTlRfUkVBRCAoZXZlbiBpZgogICAgIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpcyBibG9ja2luZykgaWYgYSBoYW5kc2hha2UgdG9vayBwbGFjZS4KICAgICAoVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIG5lZWRlZCBieSBhcHBsaWNhdGlvbnMgc3VjaCBhcyBzX2NsaWVudAogICAgIGFuZCBzX3NlcnZlciB0aGF0IHVzZSBzZWxlY3QoKSB0byBkZXRlcm1pbmUgd2hlbiB0byB1c2UgU1NMX3JlYWQ7CiAgICAgYnV0IGZvciBhcHBsaWNhdGlvbnMgdGhhdCBrbm93IGluIGFkdmFuY2Ugd2hlbiB0byBleHBlY3QgZGF0YSwgaXQKICAgICBqdXN0IG1ha2VzIHRoaW5ncyBtb3JlIGNvbXBsaWNhdGVkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgUkFORF9lZ2RfYnl0ZXMoKSwgd2hpY2ggZ2l2ZXMgY29udHJvbCBvdmVyIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAogICAgIGZyb20gRUdELgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYSBmZXcgbW9yZSBFQkNESUMgY29uZGl0aW9uYWxzIHRoYXQgbWFrZSBgcmVxJyBhbmQgYHg1MDknCiAgICAgd29yayBiZXR0ZXIgb24gc3VjaCBzeXN0ZW1zLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoUC5TaWVtZW5zLkRlPl0KCiAgKikgQWRkIHR3byBkZW1vIHByb2dyYW1zIGZvciBQS0NTMTJfcGFyc2UoKSBhbmQgUEtDUzEyX2NyZWF0ZSgpLgogICAgIFVwZGF0ZSBQS0NTMTJfcGFyc2UoKSBzbyBpdCBjb3BpZXMgdGhlIGZyaWVuZGx5TmFtZSBhbmQgdGhlCiAgICAga2V5aWQgdG8gdGhlIGNlcnRpZmljYXRlcyBhdXggaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVnIGluIFBLQ1M3X3ZlcmlmeSgpIHdoaWNoIGNhdXNlZCBhbiBpbmZpbml0ZSBsb29wCiAgICAgaWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgc2lnbmF0dXJlLgogICAgIFtTdmVuIFVzenBlbGthdCA8c3VAY2Vsb2NvbS5kZT5dCgogICopIE1ham9yIGNoYW5nZSBpbiB1dGlsL21rZGVmLnBsIHRvIGluY2x1ZGUgZXh0cmEgaW5mb3JtYXRpb24KICAgICBhYm91dCBlYWNoIHN5bWJvbCwgYXMgd2VsbCBhcyBwcmVzZW50aW5nIHZhcmlhYmxlcyBhcyB3ZWxsCiAgICAgYXMgZnVuY3Rpb25zLiAgVGhpcyBjaGFuZ2UgbWVhbnMgdGhhdCB0aGVyZSdzIG4gbW9yZSBuZWVkCiAgICAgdG8gcmVidWlsZCB0aGUgLm51bSBmaWxlcyB3aGVuIHNvbWUgYWxnb3JpdGhtcyBhcmUgZXhjbHVkZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWxsb3cgdGhlIHZlcmlmeSB0aW1lIHRvIGJlIHNldCBieSBhbiBhcHBsaWNhdGlvbiwKICAgICByYXRoZXIgdGhhbiBhbHdheXMgdXNpbmcgdGhlIGN1cnJlbnQgdGltZS4KICAgICBbU3RldmUgSGVuc29uXQogIAogICopIFBoYXNlIDIgdmVyaWZ5IGNvZGUgcmVvcmdhbmlzYXRpb24uIFRoZSBjZXJ0aWZpY2F0ZQogICAgIHZlcmlmeSBjb2RlIG5vdyBsb29rcyB1cCBhbiBpc3N1ZXIgY2VydGlmaWNhdGUgYnkgYQogICAgIG51bWJlciBvZiBjcml0ZXJpYTogc3ViamVjdCBuYW1lLCBhdXRob3JpdHkga2V5IGlkCiAgICAgYW5kIGtleSB1c2FnZS4gSXQgYWxzbyB2ZXJpZmllcyBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZXMKICAgICBieSB0aGUgc2FtZSBjcml0ZXJpYS4gVGhlIG1haW4gY29tcGFyaXNvbiBmdW5jdGlvbiBpcwogICAgIFg1MDlfY2hlY2tfaXNzdWVkKCkgd2hpY2ggcGVyZm9ybXMgdGhlc2UgY2hlY2tzLgogCiAgICAgTG90IG9mIGNoYW5nZXMgd2VyZSBuZWNlc3NhcnkgaW4gb3JkZXIgdG8gc3VwcG9ydCB0aGlzCiAgICAgd2l0aG91dCBjb21wbGV0ZWx5IHJld3JpdGluZyB0aGUgbG9va3VwIGNvZGUuCiAKICAgICBBdXRob3JpdHkgYW5kIHN1YmplY3Qga2V5IGlkZW50aWZpZXIgYXJlIG5vdyBjYWNoZWQuCiAKICAgICBUaGUgTEhBU0ggJ2NlcnRzJyBpcyBYNTA5X1NUT1JFIGhhcyBub3cgYmVlbiByZXBsYWNlZAogICAgIGJ5IGEgU1RBQ0tfT0YoWDUwOV9PQkpFQ1QpLiBUaGlzIGlzIG1haW5seSBiZWNhdXNlIGFuCiAgICAgTEhBU0ggY2FuJ3Qgc3RvcmUgb3IgcmV0cmlldmUgbXVsdGlwbGUgb2JqZWN0cyB3aXRoCiAgICAgdGhlIHNhbWUgaGFzaCB2YWx1ZS4KCiAgICAgQXMgYSByZXN1bHQgdmFyaW91cyBmdW5jdGlvbnMgKHdoaWNoIHdlcmUgYWxsIGludGVybmFsCiAgICAgdXNlIG9ubHkpIGhhdmUgY2hhbmdlZCB0byBoYW5kbGUgdGhlIG5ldyBYNTA5X1NUT1JFCiAgICAgc3RydWN0dXJlLiBUaGlzIHdpbGwgYnJlYWsgYW55dGhpbmcgdGhhdCBtZXNzZWQgcm91bmQKICAgICB3aXRoIFg1MDlfU1RPUkUgaW50ZXJuYWxseS4KIAogICAgIFRoZSBmdW5jdGlvbnMgWDUwOV9TVE9SRV9hZGRfY2VydCgpIG5vdyBjaGVja3MgZm9yIGFuCiAgICAgZXhhY3QgbWF0Y2gsIHJhdGhlciB0aGFuIGp1c3Qgc3ViamVjdCBuYW1lLgogCiAgICAgVGhlIFg1MDlfU1RPUkUgQVBJIGRvZXNuJ3QgZGlyZWN0bHkgc3VwcG9ydCB0aGUgcmV0cmlldmFsCiAgICAgb2YgbXVsdGlwbGUgY2VydGlmaWNhdGVzIG1hdGNoaW5nIGEgZ2l2ZW4gY3JpdGVyaWEsIGhvd2V2ZXIKICAgICB0aGlzIGNhbiBiZSB3b3JrZWQgcm91bmQgYnkgcGVyZm9ybWluZyBhIGxvb2t1cCBmaXJzdAogICAgICh3aGljaCB3aWxsIGZpbGwgdGhlIGNhY2hlIHdpdGggY2FuZGlkYXRlIGNlcnRpZmljYXRlcykKICAgICBhbmQgdGhlbiBleGFtaW5pbmcgdGhlIGNhY2hlIGZvciBtYXRjaGVzLiBUaGlzIGlzIHByb2JhYmx5CiAgICAgdGhlIGJlc3Qgd2UgY2FuIGRvIHdpdGhvdXQgdGhyb3dpbmcgb3V0IFg1MDlfTE9PS1VQCiAgICAgZW50aXJlbHkgKG1heWJlIGxhdGVyLi4uKS4KIAogICAgIFRoZSBYNTA5X1ZFUklGWV9DVFggc3RydWN0dXJlIGhhcyBiZWVuIGVuaGFuY2VkIGNvbnNpZGVyYWJseS4KIAogICAgIEFsbCBjZXJ0aWZpY2F0ZSBsb29rdXAgb3BlcmF0aW9ucyBub3cgZ28gdmlhIGEgZ2V0X2lzc3VlcigpCiAgICAgY2FsbGJhY2suIEFsdGhvdWdoIHRoaXMgY3VycmVudGx5IHVzZXMgYW4gWDUwOV9TVE9SRSBpdAogICAgIGNhbiBiZSByZXBsYWNlZCBieSBjdXN0b20gbG9va3Vwcy4gVGhpcyBpcyBhIHNpbXBsZSB3YXkKICAgICB0byBieXBhc3MgdGhlIFg1MDlfU1RPUkUgaGFja2VyeSBuZWNlc3NhcnkgdG8gbWFrZSB0aGlzCiAgICAgd29yayBhbmQgbWFrZXMgaXQgcG9zc2libGUgdG8gdXNlIG1vcmUgZWZmaWNpZW50IHRlY2huaXF1ZXMKICAgICBpbiBmdXR1cmUuIEEgdmVyeSBzaW1wbGUgdmVyc2lvbiB3aGljaCB1c2VzIGEgc2ltcGxlCiAgICAgU1RBQ0sgZm9yIGl0cyB0cnVzdGVkIGNlcnRpZmljYXRlIHN0b3JlIGlzIGFsc28gcHJvdmlkZWQKICAgICB1c2luZyBYNTA5X1NUT1JFX0NUWF90cnVzdGVkX3N0YWNrKCkuCiAKICAgICBUaGUgdmVyaWZ5X2NiKCkgYW5kIHZlcmlmeSgpIGNhbGxiYWNrcyBub3cgaGF2ZSBlcXVpdmFsZW50cwogICAgIGluIHRoZSBYNTA5X1NUT1JFX0NUWCBzdHJ1Y3R1cmUuCiAKICAgICBYNTA5X1NUT1JFX0NUWCBhbHNvIGhhcyBhICdmbGFncycgZmllbGQgd2hpY2ggY2FuIGJlIHVzZWQKICAgICB0byBjdXN0b21pc2UgdGhlIHZlcmlmeSBiZWhhdmlvdXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KIAogICopIEFkZCBuZXcgUEtDUyM3IHNpZ25pbmcgb3B0aW9uIFBLQ1M3X05PU01JTUVDQVAgd2hpY2ggCiAgICAgZXhjbHVkZXMgUy9NSU1FIGNhcGFiaWxpdGllcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBXaGVuIGEgY2VydGlmaWNhdGUgcmVxdWVzdCBpcyByZWFkIGluIGtlZXAgYSBjb3B5IG9mIHRoZQogICAgIG9yaWdpbmFsIGVuY29kaW5nIG9mIHRoZSBzaWduZWQgZGF0YSBhbmQgdXNlIGl0IHdoZW4gb3V0cHV0aW5nCiAgICAgYWdhaW4uIFNpZ25hdHVyZXMgdGhlbiB1c2UgdGhlIG9yaWdpbmFsIGVuY29kaW5nIHJhdGhlciB0aGFuCiAgICAgYSBkZWNvZGVkLCBlbmNvZGVkIHZlcnNpb24gd2hpY2ggbWF5IGNhdXNlIHByb2JsZW1zIGlmIHRoZQogICAgIHJlcXVlc3QgaXMgaW1wcm9wZXJseSBlbmNvZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIEJJT19wdXRzIGltcGxlbWVudGF0aW9ucywgY2FsbAogICAgIGJ1ZmZlcl93cml0ZShiLCAuLi4pIGRpcmVjdGx5IGluIGJ1ZmZlcl9wdXRzIGluc3RlYWQgb2YgY2FsbGluZwogICAgIEJJT193cml0ZShiLCAuLi4pLgoKICAgICBJbiBCSU9fcHV0cywgaW5jcmVtZW50IGItPm51bV93cml0ZSBhcyBpbiBCSU9fd3JpdGUuCiAgICAgW1BldGVyLlN5bHZlc3RlckBFZGVsV2ViLmZyXQoKICAqKSBGaXggQk5fbXVsX3dvcmQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSB3b3JkIGlzIDAuIChXZSBoYXZlIHRvIHVzZQogICAgIEJOX3plcm8sIHdlIG1heSBub3QgcmV0dXJuIGEgQklHTlVNIHdpdGggYW4gYXJyYXkgY29uc2lzdGluZyBvZgogICAgIHdvcmRzIHNldCB0byB6ZXJvLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCBjYWxsaW5nIGFib3J0KCkgZnJvbSB3aXRoaW4gdGhlIGxpYnJhcnkgd2hlbiBwcm9ibGVtcyBhcmUKICAgICBkZXRlY3RlZCwgZXhjZXB0IGlmIHByZXByb2Nlc3NvciBzeW1ib2xzIGhhdmUgYmVlbiBkZWZpbmVkCiAgICAgKHN1Y2ggYXMgUkVGX0NIRUNLLCBCTl9ERUJVRyBldGMuKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgb3BlbnNzbCBhcHBsaWNhdGlvbiAncnNhdXRsJy4gVGhpcyB1dGlsaXR5IGNhbiBiZQogICAgIHVzZWQgZm9yIGxvdyBsZXZlbCBSU0Egb3BlcmF0aW9ucy4gREVSIHB1YmxpYyBrZXkKICAgICBCSU8vZnAgcm91dGluZXMgYWxzbyBhZGRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQ29uZmlndXJlIGVudHJ5IGFuZCBwYXRjaGVzIGZvciBjb21waWxpbmcgb24gUU5YIDQuCiAgICAgW0FuZHJlYXMgU2NobmVpZGVyIDxhbmRyZWFzQGRzMy5ldGVjaC5maC1oYW1idXJnLmRlPl0KCiAgKikgQSBkZW1vIHN0YXRlLW1hY2hpbmUgaW1wbGVtZW50YXRpb24gd2FzIHNwb25zb3JlZCBieQogICAgIE51cm9uIChodHRwOi8vd3d3Lm51cm9uLmNvbS8pIGFuZCBpcyBub3cgYXZhaWxhYmxlIGluCiAgICAgZGVtb3Mvc3RhdGVfbWFjaGluZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTmV3IG9wdGlvbnMgYWRkZWQgdG8gdGhlICdkZ3N0JyB1dGlsaXR5IGZvciBzaWduYXR1cmUKICAgICBnZW5lcmF0aW9uIGFuZCB2ZXJpZmljYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVW5yZWNvZ25pemVkIFBLQ1MjNyBjb250ZW50IHR5cGVzIGFyZSBub3cgaGFuZGxlZCB2aWEgYQogICAgIGNhdGNoIGFsbCBBU04xX1RZUEUgc3RydWN0dXJlLiBUaGlzIGFsbG93cyB1bnN1cHBvcnRlZAogICAgIHR5cGVzIHRvIGJlIHN0b3JlZCBhcyBhICJibG9iIiBhbmQgYW4gYXBwbGljYXRpb24gY2FuCiAgICAgZW5jb2RlIGFuZCBkZWNvZGUgaXQgbWFudWFsbHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHZhcmlvdXMgc2lnbmVkL3Vuc2lnbmVkIGlzc3VlcyB0byBtYWtlIGFfc3RyZXguYwogICAgIGNvbXBpbGUgdW5kZXIgVkMrKy4KICAgICBbT3NjYXIgSmFjb2Jzc29uIDxvc2Nhci5qYWNvYnNzb25AY2Vsb2NvbS5jb20+XQoKICAqKSBBU04xIGZpeGVzLiBpMmRfQVNOMV9PQkpFQ1Qgd2FzIG5vdCByZXR1cm5pbmcgdGhlIGNvcnJlY3QKICAgICBsZW5ndGggaWYgcGFzc2VkIGEgYnVmZmVyLiBBU04xX0lOVEVHRVJfdG9fQk4gZmFpbGVkCiAgICAgaWYgcGFzc2VkIGEgTlVMTCBCTiBhbmQgaXRzIGFyZ3VtZW50IHdhcyBuZWdhdGl2ZS4KICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBTdmVuIEhlaWJlcmcgPHN2ZW5AdGFydHUuY3liZXIuZWU+XQoKICAqKSBNb2RpZmljYXRpb24gdG8gUEtDUyM3IGVuY29kaW5nIHJvdXRpbmVzIHRvIG91dHB1dCBkZWZpbml0ZQogICAgIGxlbmd0aCBlbmNvZGluZy4gU2luY2UgY3VycmVudGx5IHRoZSB3aG9sZSBzdHJ1Y3R1cmVzIGFyZSBpbgogICAgIG1lbW9yeSB0aGVyZSdzIG5vdCByZWFsIHBvaW50IGluIHVzaW5nIGluZGVmaW5pdGUgbGVuZ3RoIAogICAgIGNvbnN0cnVjdGVkIGVuY29kaW5nLiBIb3dldmVyIGlmIE9wZW5TU0wgaXMgY29tcGlsZWQgd2l0aAogICAgIHRoZSBmbGFnIFBLQ1M3X0lOREVGSU5JVEVfRU5DT0RJTkcgdGhlIG9sZCBmb3JtIGlzIHVzZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkZWQgQklPX3ZwcmludGYoKSBhbmQgQklPX3ZzbnByaW50ZigpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZGVkIG1vcmUgcHJlZml4ZXMgdG8gcGFyc2UgZm9yIGluIHRoZSB0aGUgc3RyaW5ncyB3cml0dGVuCiAgICAgdGhyb3VnaCBhIGxvZ2dpbmcgYmlvLCB0byBjb3ZlciBhbGwgdGhlIGxldmVscyB0aGF0IGFyZSBhdmFpbGFibGUKICAgICB0aHJvdWdoIHN5c2xvZy4gIFRoZSBwcmVmaXhlcyBhcmUgbm93OgoKCVBBTklDLCBFTUVSRywgRU1SCT0+CUxPR19FTUVSRwoJQUxFUlQsIEFMUgkJPT4JTE9HX0FMRVJUCglDUklULCBDUkkJCT0+CUxPR19DUklUCglFUlJPUiwgRVJSCQk9PglMT0dfRVJSCglXQVJOSU5HLCBXQVJOLCBXQVIJPT4JTE9HX1dBUk5JTkcKCU5PVElDRSwgTk9URSwgTk9UCT0+CUxPR19OT1RJQ0UKCUlORk8sIElORgkJPT4JTE9HX0lORk8KCURFQlVHLCBEQkcJCT0+CUxPR19ERUJVRwoKICAgICBhbmQgYXMgYmVmb3JlLCBpZiBub25lIG9mIHRob3NlIHByZWZpeGVzIGFyZSBwcmVzZW50IGF0IHRoZQogICAgIGJlZ2lubmluZyBvZiB0aGUgc3RyaW5nLCBMT0dfRVJSIGlzIGNob3Nlbi4KCiAgICAgT24gV2luMzIsIHRoZSBMT0dfKiBsZXZlbHMgYXJlIG1hcHBlZCBhY2NvcmRpbmcgdG8gdGhpczoKCglMT0dfRU1FUkcsIExPR19BTEVSVCwgTE9HX0NSSVQsIExPR19FUlIJPT4gRVZFTlRMT0dfRVJST1JfVFlQRQoJTE9HX1dBUk5JTkcJCQkJPT4gRVZFTlRMT0dfV0FSTklOR19UWVBFCglMT0dfTk9USUNFLCBMT0dfSU5GTywgTE9HX0RFQlVHCQk9PiBFVkVOVExPR19JTkZPUk1BVElPTl9UWVBFCgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1hZGUgaXQgcG9zc2libGUgdG8gcmVjb25maWd1cmUgd2l0aCBqdXN0IHRoZSBjb25maWd1cmF0aW9uCiAgICAgYXJndW1lbnQgInJlY29uZiIgb3IgInJlY29uZmlndXJlIi4gIFRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCiAgICAgYXJlIHN0b3JlZCBpbiBNYWtlZmlsZS5zc2wgaW4gdGhlIHZhcmlhYmxlIENPTkZJR1VSRV9BUkdTLAogICAgIGFuZCBhcmUgcmV0cmlldmVkIGZyb20gdGhlcmUgd2hlbiByZWNvbmZpZ3VyaW5nLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ENCBpbXBsZW1lbnRlZC4KICAgICBbQXNzYXIgV2VzdGVybHVuZCA8YXNzYXJAc2ljcy5zZT4sIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBhcmd1bWVudHMgLUNBZmlsZSBhbmQgLUNBcGF0aCB0byB0aGUgcGtjczEyIHV0aWxpdHkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGhlIG9ial9kYXQucGwgc2NyaXB0IHdhcyBtZXNzaW5nIHVwIHRoZSBzb3J0aW5nIG9mIG9iamVjdAogICAgIG5hbWVzLiBUaGUgcmVhc29uIHdhcyB0aGF0IGl0IGNvbXBhcmVkIHRoZSBxdW90ZWQgdmVyc2lvbgogICAgIG9mIHN0cmluZ3MgYXMgYSByZXN1bHQgIk9DU1AiID4gIk9DU1AgU2lnbmluZyIgYmVjYXVzZQogICAgICIgPiBTUEFDRS4gQ2hhbmdlZCBzY3JpcHQgdG8gc3RvcmUgdW5xdW90ZWQgdmVyc2lvbnMgb2YKICAgICBuYW1lcyBhbmQgYWRkIHF1b3RlcyBvbiBvdXRwdXQuIEl0IHdhcyBhbHNvIG9taXR0aW5nIHNvbWUKICAgICBuYW1lcyBmcm9tIHRoZSBsb29rdXAgdGFibGUgaWYgdGhleSB3ZXJlIGdpdmVuIGEgZGVmYXVsdAogICAgIHZhbHVlICh0aGF0IGlzIGlmIFNOIGlzIG1pc3NpbmcgaXQgaXMgZ2l2ZW4gdGhlIHNhbWUKICAgICB2YWx1ZSBhcyBMTiBhbmQgdmljZSB2ZXJzYSksIHRoZXNlIGFyZSBub3cgYWRkZWQgb24gdGhlCiAgICAgZ3JvdW5kcyB0aGF0IGlmIGFuIG9iamVjdCBoYXMgYSBuYW1lIHdlIHNob3VsZCBiZSBhYmxlIHRvCiAgICAgbG9vayBpdCB1cC4gRmluYWxseSBhZGRlZCB3YXJuaW5nIG91dHB1dCB3aGVuIGR1cGxpY2F0ZQogICAgIHNob3J0IG9yIGxvbmcgbmFtZXMgYXJlIGZvdW5kLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZXMgbmVlZGVkIGZvciBUYW5kZW0gTlNLLgogICAgIFtTY290dCBVcm9mZiA8c2NvdHRAeHlwcm8uY29tPl0KCiAgKikgRml4IFNTTCAyLjAgcm9sbGJhY2sgY2hlY2tpbmc6IER1ZSB0byBhbiBvZmYtYnktb25lIGVycm9yIGluCiAgICAgUlNBX3BhZGRpbmdfY2hlY2tfU1NMdjIzKCksIHNwZWNpYWwgcGFkZGluZyB3YXMgbmV2ZXIgZGV0ZWN0ZWQKICAgICBhbmQgdGh1cyB0aGUgU1NMIDMuMC9UTFMgMS4wIGNvdW50ZXJtZWFzdXJlIGFnYWluc3QgcHJvdG9jb2wKICAgICB2ZXJzaW9uIHJvbGxiYWNrIGF0dGFja3Mgd2FzIG5vdCBlZmZlY3RpdmUuCgogICAgIEluIHMyM19jbG50LmMsIGRvbid0IHVzZSBzcGVjaWFsIHJvbGxiYWNrLWF0dGFjayBkZXRlY3Rpb24gcGFkZGluZwogICAgIChSU0FfU1NMVjIzX1BBRERJTkcpIGlmIFNTTCAyLjAgaXMgdGhlIG9ubHkgcHJvdG9jb2wgZW5hYmxlZCBpbiB0aGUKICAgICBjbGllbnQ7IHNpbWlsYXJseSwgaW4gczIzX3NydnIuYywgZG9uJ3QgZG8gdGhlIHJvbGxiYWNrIGNoZWNrIGlmCiAgICAgU1NMIDIuMCBpcyB0aGUgb25seSBwcm90b2NvbCBlbmFibGVkIGluIHRoZSBzZXJ2ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBnZXQgaGV4ZHVtcHMgb2YgdW5wcmludGFibGUgZGF0YSB3aXRoICdvcGVuc3NsCiAgICAgYXNuMXBhcnNlJy4gIEJ5IGltcGxpY2F0aW9uLCB0aGUgZnVuY3Rpb25zIEFTTjFfcGFyc2VfZHVtcCgpIGFuZAogICAgIEJJT19kdW1wX2luZGVudCgpIGFyZSBhZGRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgZnVuY3Rpb25zIEFTTjFfU1RSSU5HX3ByaW50X2V4KCkgYW5kIFg1MDlfTkFNRV9wcmludF9leCgpCiAgICAgdGhlc2UgcHJpbnQgb3V0IHN0cmluZ3MgYW5kIG5hbWUgc3RydWN0dXJlcyBiYXNlZCBvbiB2YXJpb3VzCiAgICAgZmxhZ3MgaW5jbHVkaW5nIFJGQzIyNTMgc3VwcG9ydCBhbmQgcHJvcGVyIGhhbmRsaW5nIG9mCiAgICAgbXVsdGlieXRlIGNoYXJhY3RlcnMuIEFkZGVkIG9wdGlvbnMgdG8gdGhlICd4NTA5JyB1dGlsaXR5IAogICAgIHRvIGFsbG93IHRoZSB2YXJpb3VzIGZsYWdzIHRvIGJlIHNldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIGZpeGVzIHRvIHVzZSBBU04xX1RJTUUgaW5zdGVhZCBvZiBBU04xX1VUQ1RJTUUuCiAgICAgQWxzbyBjaGFuZ2UgdGhlIGZ1bmN0aW9ucyBYNTA5X2NtcF9jdXJyZW50X3RpbWUoKSBhbmQKICAgICBYNTA5X2dtdGltZV9hZGooKSB3b3JrIHdpdGggYW4gQVNOMV9USU1FIHN0cnVjdHVyZSwKICAgICB0aGlzIHdpbGwgZW5hYmxlIGNlcnRpZmljYXRlcyB1c2luZyBHZW5lcmFsaXplZFRpbWUgaW4gdmFsaWRpdHkKICAgICBkYXRlcyB0byBiZSBjaGVja2VkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgdGhlIE5FR19QVUJLRVlfQlVHIGNvZGUgKHdoaWNoIHRvbGVyYXRlcyBpbnZhbGlkCiAgICAgbmVnYXRpdmUgcHVibGljIGtleSBlbmNvZGluZ3MpIG9uIGJ5IGRlZmF1bHQsCiAgICAgTk9fTkVHX1BVQktFWV9CVUcgY2FuIGJlIHNldCB0byBkaXNhYmxlIGl0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBjMmlfQVNOMV9PQkpFQ1QoKSB3aGljaCBhY3RzIG9uIEFTTjFfT0JKRUNUCiAgICAgY29udGVudCBvY3RldHMuIEFuIGkyY19BU04xX09CSkVDVCBpcyB1bm5lY2Vzc2FyeSBiZWNhdXNlCiAgICAgdGhlIGVuY29kaW5nIGNhbiBiZSB0cml2aWFsbHkgb2J0YWluZWQgZnJvbSB0aGUgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIGNyeXB0by9lcnIuYyBsb2NraW5nIGJ1Z2ZpeDogVXNlIHdyaXRlIGxvY2tzIChDUllQVE9fd19bdW5dbG9jayksCiAgICAgbm90IHJlYWQgbG9ja3MgKENSWVBUT19yX1t1bl1sb2NrKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBIGZpcnN0IGF0dGVtcHQgYXQgY3JlYXRpbmcgb2ZmaWNpYWwgc3VwcG9ydCBmb3Igc2hhcmVkCiAgICAgbGlicmFyaWVzIHRocm91Z2ggY29uZmlndXJhdGlvbi4gIEkndmUga2VwdCBpdCBzbyB0aGUKICAgICBkZWZhdWx0IGlzIHN0YXRpYyBsaWJyYXJpZXMgb25seSwgYW5kIHRoZSBPcGVuU1NMIHByb2dyYW1zCiAgICAgYXJlIGFsd2F5cyBzdGF0aWNhbGx5IGxpbmtlZCBmb3Igbm93LCBidXQgdGhlcmUgYXJlCiAgICAgcHJlcGFyYXRpb25zIGZvciBkeW5hbWljIGxpbmtpbmcgaW4gcGxhY2UuCiAgICAgVGhpcyBoYXMgYmVlbiB0ZXN0ZWQgb24gTGludXggYW5kIFRydTY0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJhbmRvbW5lc3MgcG9sbGluZyBmdW5jdGlvbiBmb3IgV2luOXgsIGFzIGRlc2NyaWJlZCBpbjoKICAgICBQZXRlciBHdXRtYW5uLCBTb2Z0d2FyZSBHZW5lcmF0aW9uIG9mIFByYWN0aWNhbGx5IFN0cm9uZwogICAgIFJhbmRvbSBOdW1iZXJzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggc28gUFJORyBpcyBzZWVkZWQgaW4gcmVxIGlmIHVzaW5nIGFuIGFscmVhZHkgZXhpc3RpbmcKICAgICBEU0Ega2V5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb25zIHRvIHNtaW1lIGFwcGxpY2F0aW9uLiAtaW5mb3JtIGFuZCAtb3V0Zm9ybQogICAgIGFsbG93IGFsdGVybmF0aXZlIGZvcm1hdHMgZm9yIHRoZSBTL01JTUUgbWVzc2FnZSBpbmNsdWRpbmcKICAgICBQRU0gYW5kIERFUi4gVGhlIC1jb250ZW50IG9wdGlvbiBhbGxvd3MgdGhlIGNvbnRlbnQgdG8gYmUKICAgICBzcGVjaWZpZWQgc2VwYXJhdGVseS4gVGhpcyBzaG91bGQgYWxsb3cgdGhpbmdzIGxpa2UgTmV0c2NhcGUKICAgICBmb3JtIHNpZ25pbmcgb3V0cHV0IGVhc2llciB0byB2ZXJpZnkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSBBU04xIGVuY29kaW5nIG9mIHRhZ3MgdXNpbmcgdGhlICdsb25nIGZvcm0nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBBU04xIGZ1bmN0aW9ucywgaTJjXyogYW5kIGMyaV8qIGZvciBJTlRFR0VSIGFuZCBCSVQKICAgICBTVFJJTkcgdHlwZXMuIFRoZXNlIGNvbnZlcnQgY29udGVudCBvY3RldHMgdG8gYW5kIGZyb20gdGhlCiAgICAgdW5kZXJseWluZyB0eXBlLiBUaGUgYWN0dWFsIHRhZyBhbmQgbGVuZ3RoIG9jdGV0cyBhcmUKICAgICBhbHJlYWR5IGFzc3VtZWQgdG8gaGF2ZSBiZWVuIHJlYWQgaW4gYW5kIGNoZWNrZWQuIFRoZXNlCiAgICAgYXJlIG5lZWRlZCBiZWNhdXNlIGFsbCBvdGhlciBzdHJpbmcgdHlwZXMgaGF2ZSB2aXJ0dWFsbHkKICAgICBpZGVudGljYWwgaGFuZGxpbmcgYXBhcnQgZnJvbSB0aGUgdGFnLiBCeSBoYXZpbmcgdmVyc2lvbnMKICAgICBvZiB0aGUgQVNOMSBmdW5jdGlvbnMgdGhhdCBqdXN0IG9wZXJhdGUgb24gY29udGVudCBvY3RldHMKICAgICBJTVBMSUNJVCB0YWdnaW5nIGNhbiBiZSBoYW5kbGVkIHByb3Blcmx5LiBJdCBhbHNvIGFsbG93cwogICAgIHRoZSBBU04xX0VOVU1FUkFURUQgY29kZSB0byBiZSBjdXQgZG93biBiZWNhdXNlIEFTTjFfRU5VTUVSQVRFRAogICAgIGFuZCBBU04xX0lOVEVHRVIgYXJlIGlkZW50aWNhbCBhcGFydCBmcm9tIHRoZSB0YWcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSBoYW5kbGluZyBvZiBPSUQgb2JqZWN0cyBhcyBmb2xsb3dzOgoKICAgICAtIE5ldyBvYmplY3QgaWRlbnRpZmllcnMgYXJlIGluc2VydGVkIGluIG9iamVjdHMudHh0LCBmb2xsb3dpbmcKICAgICAgIHRoZSBzeW50YXggZ2l2ZW4gaW4gb2JqZWN0cy5SRUFETUUuCiAgICAgLSBvYmplY3RzLnBsIGlzIHVzZWQgdG8gcHJvY2VzcyBvYmpfbWFjLm51bSBhbmQgY3JlYXRlIGEgbmV3CiAgICAgICBvYmpfbWFjLmguCiAgICAgLSBvYmpfZGF0LnBsIGlzIHVzZWQgdG8gY3JlYXRlIGEgbmV3IG9ial9kYXQuaCwgdXNpbmcgdGhlIGRhdGEgaW4KICAgICAgIG9ial9tYWMuaC4KCiAgICAgVGhpcyBpcyBjdXJyZW50bHkga2luZCBvZiBhIGhhY2ssIGFuZCB0aGUgcGVybCBjb2RlIGluIG9iamVjdHMucGwKICAgICBpc24ndCB2ZXJ5IGVsZWdhbnQsIGJ1dCBpdCB3b3JrcyBhcyBJIGludGVuZGVkLiAgVGhlIHNpbXBsZXN0IHdheQogICAgIHRvIGNoZWNrIHRoYXQgaXQgd29ya2VkIGNvcnJlY3RseSBpcyB0byBsb29rIGluIG9ial9kYXQuaCBhbmQKICAgICBjaGVjayB0aGUgYXJyYXkgbmlkX29ianMgYW5kIG1ha2Ugc3VyZSB0aGUgb2JqZWN0cyBoYXZlbid0IG1vdmVkCiAgICAgYXJvdW5kICh0aGlzIGlzIGltcG9ydGFudCEpLiAgQWRkaXRpb25zIGFyZSBPSywgYXMgd2VsbCBhcwogICAgIGNvbnNpc3RlbnQgbmFtZSBjaGFuZ2VzLiAKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgQlNELXN0eWxlIE1ENS1iYXNlZCBwYXNzd29yZHMgdG8gJ29wZW5zc2wgcGFzc3dkJyAob3B0aW9uICctMScpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZGl0aW9uIG9mIHRoZSBjb21tYW5kIGxpbmUgcGFyYW1ldGVyICctcmFuZCBmaWxlJyB0byAnb3BlbnNzbCByZXEnLgogICAgIFRoZSBnaXZlbiBmaWxlIGFkZHMgdG8gd2hhdGV2ZXIgaGFzIGFscmVhZHkgYmVlbiBzZWVkZWQgaW50byB0aGUKICAgICByYW5kb20gcG9vbCB0aHJvdWdoIHRoZSBSQU5ERklMRSBjb25maWd1cmF0aW9uIGZpbGUgb3B0aW9uIG9yCiAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIHRoZSBkZWZhdWx0IHJhbmRvbSBzdGF0ZSBmaWxlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIG1rc3RhY2sucGwgbm93IHNvcnRzIGVhY2ggbWFjcm8gZ3JvdXAgaW50byBsZXhpY2FsIG9yZGVyLgogICAgIFByZXZpb3VzbHkgdGhlIG91dHB1dCBvcmRlciBkZXBlbmRlZCBvbiB0aGUgb3JkZXIgdGhlIGZpbGVzCiAgICAgYXBwZWFyZWQgaW4gdGhlIGRpcmVjdG9yeSwgcmVzdWx0aW5nIGluIG5lZWRsZXNzIHJld3JpdGluZwogICAgIG9mIHNhZmVzdGFjay5oIC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQYXRjaGVzIHRvIG1ha2UgT3BlblNTTCBjb21waWxlIHVuZGVyIFdpbjMyIGFnYWluLiBNb3N0bHkKICAgICB3b3JrIGFyb3VuZHMgZm9yIHRoZSBWQysrIHByb2JsZW0gdGhhdCBpdCB0cmVhdHMgZnVuYygpIGFzCiAgICAgZnVuYyh2b2lkKS4gQWxzbyBzdHJpcHBlZCBvdXQgdGhlIHBhcnRzIG9mIG1rZGVmLnBsIHRoYXQKICAgICBhZGRlZCBleHRyYSB0eXBlc2FmZSBmdW5jdGlvbnM6IHRoZXNlIG5vIGxvbmdlciBleGlzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW9yZ2FuaXNhdGlvbiBvZiB0aGUgc3RhY2sgY29kZS4gVGhlIG1hY3JvcyBhcmUgbm93IGFsbCAKICAgICBjb2xsZWN0ZWQgaW4gc2FmZXN0YWNrLmggLiBFYWNoIG1hY3JvIGlzIGRlZmluZWQgaW4gdGVybXMgb2YKICAgICBhICJzdGFjayBtYWNybyIgb2YgdGhlIGZvcm0gU0tNXzxuYW1lPih0eXBlLCBhLCBiKS4gVGhlIAogICAgIERFQlVHX1NBRkVTVEFDSyBpcyBub3cgaGFuZGxlZCBpbiB0ZXJtcyBvZiBmdW5jdGlvbiBjYXN0cywKICAgICB0aGlzIGhhcyB0aGUgYWR2YW50YWdlIG9mIHJldGFpbmluZyB0eXBlIHNhZmV0eSB3aXRob3V0IHRoZQogICAgIHVzZSBvZiBhZGRpdGlvbmFsIGZ1bmN0aW9ucy4gSWYgREVCVUdfU0FGRVNUQUNLIGlzIG5vdCBkZWZpbmVkCiAgICAgdGhlbiB0aGUgbm9uIHR5cGVzYWZlIG1hY3JvcyBhcmUgdXNlZCBpbnN0ZWFkLiBBbHNvIG1vZGlmaWVkIHRoZQogICAgIG1rc3RhY2sucGwgc2NyaXB0IHRvIGhhbmRsZSB0aGUgbmV3IGZvcm0uIE5lZWRzIHRlc3RpbmcgdG8gc2VlCiAgICAgaWYgd2hpY2ggKGlmIGFueSkgY29tcGlsZXJzIGl0IGNob2tlcyBhbmQgbWF5YmUgbWFrZSBERUJVR19TQUZFU1RBQ0sKICAgICB0aGUgZGVmYXVsdCBpZiBubyBtYWpvciBwcm9ibGVtcy4gU2ltaWxhciBiZWhhdmlvdXIgZm9yIEFTTjFfU0VUX09GCiAgICAgYW5kIFBLQ1MxMl9TVEFDS19PRi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBXaGVuIHNvbWUgdmVyc2lvbnMgb2YgSUlTIHVzZSB0aGUgJ05FVCcgZm9ybSBvZiBwcml2YXRlIGtleSB0aGUKICAgICBrZXkgZGVyaXZhdGlvbiBhbGdvcml0aG0gaXMgZGlmZmVyZW50LiBOb3JtYWxseSBNRDUocGFzc3dvcmQpIGlzCiAgICAgdXNlZCBhcyBhIDEyOCBiaXQgUkM0IGtleS4gSW4gdGhlIG1vZGlmaWVkIGNhc2UKICAgICBNRDUoTUQ1KHBhc3N3b3JkKSArICJTR0NLRVlTQUxUIikgIGlzIHVzZWQgaW5zdGVhZC4gQWRkZWQgc29tZQogICAgIG5ldyBmdW5jdGlvbnMgaTJkX1JTQV9ORVQoKSwgZDJpX1JTQV9ORVQoKSBldGMgd2hpY2ggYXJlIHRoZSBzYW1lCiAgICAgYXMgdGhlIG9sZCBOZXRzY2FwZV9SU0EgZnVuY3Rpb25zIGV4Y2VwdCB0aGV5IGhhdmUgYW4gYWRkaXRpb25hbAogICAgICdzZ2NrZXknIHBhcmFtZXRlciB3aGljaCB1c2VzIHRoZSBtb2RpZmllZCBhbGdvcml0aG0uIEFsc28gYWRkZWQKICAgICBhbiAtc2dja2V5IGNvbW1hbmQgbGluZSBvcHRpb24gdG8gdGhlIHJzYSB1dGlsaXR5LiBUaGFua3MgdG8gCiAgICAgQWRyaWFuIFBlY2sgPGJlcnRpZUBuY2lwaGVyLmNvbT4gZm9yIHBvc3RpbmcgZGV0YWlscyBvZiB0aGUgbW9kaWZpZWQKICAgICBhbGdvcml0aG0gdG8gb3BlbnNzbC1kZXYuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVGhlIGV2cF9sb2NhbC5oIG1hY3JvcyB3ZXJlIHVzaW5nICdjLiMja25hbWUnIHdoaWNoIHJlc3VsdGVkIGluCiAgICAgaW52YWxpZCBleHBhbnNpb24gb24gc29tZSBzeXN0ZW1zIChTQ08gNS4wLjUgZm9yIGV4YW1wbGUpLgogICAgIENvcnJlY3RlZCB0byAnYy5rbmFtZScuCiAgICAgW1BoaWxsaXAgUG9yY2ggPHJvb3RAdGhlcG9yY2guY29tPl0KCiAgKikgTmV3IFg1MDlfZ2V0MV9lbWFpbCgpIGFuZCBYNTA5X1JFUV9nZXQxX2VtYWlsKCkgZnVuY3Rpb25zIHRoYXQgcmV0dXJuCiAgICAgYSBTVEFDSyBvZiBlbWFpbCBhZGRyZXNzZXMgZnJvbSBhIGNlcnRpZmljYXRlIG9yIHJlcXVlc3QsIHRoZXNlIGxvb2sKICAgICBpbiB0aGUgc3ViamVjdCBuYW1lIGFuZCB0aGUgc3ViamVjdCBhbHRlcm5hdGl2ZSBuYW1lIGV4dGVuc2lvbnMgYW5kIAogICAgIG9taXQgYW55IGR1cGxpY2F0ZSBhZGRyZXNzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmUtaW1wbGVtZW50IEJOX21vZF9leHAyX21vbnQgdXNpbmcgaW5kZXBlbmRlbnQgKGFuZCBsYXJnZXIpIHdpbmRvd3MuCiAgICAgVGhpcyBtYWtlcyBEU0EgdmVyaWZpY2F0aW9uIGFib3V0IDIgJSBmYXN0ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jcmVhc2UgbWF4aW11bSB3aW5kb3cgc2l6ZSBpbiBCTl9tb2RfZXhwXy4uLiB0byA2IGJpdHMgaW5zdGVhZCBvZiA1CiAgICAgKG1lYW5pbmcgdGhhdCBub3cgMl41IHZhbHVlcyB3aWxsIGJlIHByZWNvbXB1dGVkLCB3aGljaCBpcyBvbmx5IDQgS0IKICAgICBwbHVzIG92ZXJoZWFkIGZvciAxMDI0IGJpdCBtb2R1bGkpLgogICAgIFRoaXMgbWFrZXMgZXhwb25lbnRpYXRpb25zIGFib3V0IDAuNSAlIGZhc3RlciBmb3IgMTAyNCBiaXQKICAgICBleHBvbmVudHMgKGFzIG1lYXN1cmVkIGJ5ICJvcGVuc3NsIHNwZWVkIHJzYTIwNDgiKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW5hbWUgbWVtb3J5IGhhbmRsaW5nIG1hY3JvcyB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBvdGhlcgogICAgIHNvZnR3YXJlOgogICAgICAgICAgTWFsbG9jICAgICAgICAgPT4gIE9QRU5TU0xfbWFsbG9jCiAgICAgICAgICBNYWxsb2NfbG9ja2VkICA9PiAgT1BFTlNTTF9tYWxsb2NfbG9ja2VkCiAgICAgICAgICBSZWFsbG9jICAgICAgICA9PiAgT1BFTlNTTF9yZWFsbG9jCiAgICAgICAgICBGcmVlICAgICAgICAgICA9PiAgT1BFTlNTTF9mcmVlCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX21vZF9leHBfbW9udF93b3JkIGZvciBzbWFsbCBiYXNlcyAocm91Z2hseSAxNSUKICAgICBmYXN0ZXIgdGhhbiBCTl9tb2RfZXhwX21vbnQsIGkuZS4gNyUgZm9yIGEgZnVsbCBESCBleGNoYW5nZSkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ3lnV2luMzIgc3VwcG9ydC4KICAgICBbSm9obiBKYXJ2aWUgPGpqYXJ2aWVAbmV3c2d1eS5jb20+XQoKICAqKSBUaGUgdHlwZS1zYWZlIHN0YWNrIGNvZGUgaGFzIGJlZW4gcmVqaWdnZWQuIEl0IGlzIG5vdyBvbmx5IGNvbXBpbGVkCiAgICAgaW4gd2hlbiBPcGVuU1NMIGlzIGNvbmZpZ3VyZWQgd2l0aCB0aGUgREVCVUdfU0FGRVNUQUNLIG9wdGlvbiBhbmQKICAgICBieSBkZWZhdWx0IGFsbCB0eXBlLXNwZWNpZmljIHN0YWNrIGZ1bmN0aW9ucyBhcmUgIiNkZWZpbmUiZCBiYWNrIHRvCiAgICAgc3RhbmRhcmQgc3RhY2sgZnVuY3Rpb25zLiBUaGlzIHJlc3VsdHMgaW4gbW9yZSBzdHJlYW1saW5lZCBvdXRwdXQKICAgICBidXQgcmV0YWlucyB0aGUgdHlwZS1zYWZldHkgY2hlY2tpbmcgcG9zc2liaWxpdGllcyBvZiB0aGUgb3JpZ2luYWwKICAgICBhcHByb2FjaC4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBUaGUgU1RBQ0sgY29kZSBoYXMgYmVlbiBjbGVhbmVkIHVwLCBhbmQgY2VydGFpbiB0eXBlIGRlY2xhcmF0aW9ucwogICAgIHRoYXQgZGlkbid0IG1ha2UgYSBsb3Qgb2Ygc2Vuc2UgaGF2ZSBiZWVuIGJyb3VnaHQgaW4gbGluZS4gVGhpcyBoYXMKICAgICBhbHNvIGludm9sdmVkIGEgY2xlYW51cCBvZiBzb3J0cyBpbiBzYWZlc3RhY2suaCB0byBtb3JlIGNvcnJlY3RseQogICAgIG1hcCB0eXBlLXNhZmUgc3RhY2sgZnVuY3Rpb25zIG9udG8gdGhlaXIgcGxhaW4gc3RhY2sgY291bnRlcnBhcnRzLgogICAgIFRoaXMgd29yayBoYXMgYWxzbyByZXN1bHRlZCBpbiBhIHZhcmlldHkgb2YgImNvbnN0ImlmaWNhdGlvbnMgb2YKICAgICBsb3RzIG9mIHRoZSBjb2RlLCBlc3BlY2lhbGx5ICJfY21wIiBvcGVyYXRpb25zIHdoaWNoIHNob3VsZCBub3JtYWxseQogICAgIGJlIHByb3RvdHlwZWQgd2l0aCAiY29uc3QiIHBhcmFtZXRlcnMgYW55d2F5LgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFdoZW4gZ2VuZXJhdGluZyBieXRlcyBmb3IgdGhlIGZpcnN0IHRpbWUgaW4gbWRfcmFuZC5jLCAnc3RpciB0aGUgcG9vbCcKICAgICBieSBzZWVkaW5nIHdpdGggU1RBVEVfU0laRSBkdW1teSBieXRlcyAod2l0aCB6ZXJvIGVudHJvcHkgY291bnQpLgogICAgIChUaGUgUFJORyBzdGF0ZSBjb25zaXN0cyBvZiB0d28gcGFydHMsIHRoZSBsYXJnZSBwb29sICdzdGF0ZScgYW5kICdtZCcsCiAgICAgd2hlcmUgYWxsIG9mICdtZCcgaXMgdXNlZCBlYWNoIHRpbWUgdGhlIFBSTkcgaXMgdXNlZCwgYnV0ICdzdGF0ZScKICAgICBpcyB1c2VkIG9ubHkgaW5kZXhlZCBieSBhIGN5Y2xpYyBjb3VudGVyLiBBcyBlbnRyb3B5IG1heSBub3QgYmUKICAgICB3ZWxsIGRpc3RyaWJ1dGVkIGZyb20gdGhlIGJlZ2lubmluZywgJ21kJyBpcyBpbXBvcnRhbnQgYXMgYQogICAgIGNoYWluaW5nIHZhcmlhYmxlLiBIb3dldmVyLCB0aGUgb3V0cHV0IGZ1bmN0aW9uIGNoYWlucyBvbmx5IGhhbGYKICAgICBvZiAnbWQnLCBpLmUuIDgwIGJpdHMuICBzc2xlYXlfcmFuZF9hZGQsIG9uIHRoZSBvdGhlciBoYW5kLCBjaGFpbnMKICAgICBhbGwgb2YgJ21kJywgYW5kIHNlZWRpbmcgd2l0aCBTVEFURV9TSVpFIGR1bW15IGJ5dGVzIHdpbGwgcmVzdWx0CiAgICAgaW4gYWxsIG9mICdzdGF0ZScgYmVpbmcgcmV3cml0dGVuLCB3aXRoIHRoZSBuZXcgdmFsdWVzIGRlcGVuZGluZwogICAgIG9uIHZpcnR1YWxseSBhbGwgb2YgJ21kJy4gIFRoaXMgb3ZlcmNvbWVzIHRoZSA4MCBiaXQgbGltaXRhdGlvbi4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gc3NsL3MyX2NsbnQuYyBhbmQgc3NsL3MzX2NsbnQuYywgY2FsbCBFUlJfY2xlYXJfZXJyb3IoKSB3aGVuCiAgICAgdGhlIGhhbmRzaGFrZSBpcyBjb250aW51ZWQgYWZ0ZXIgc3NsX3ZlcmlmeV9jZXJ0X2NoYWluKCk7CiAgICAgb3RoZXJ3aXNlLCBpZiBTU0xfVkVSSUZZX05PTkUgaXMgc2V0LCByZW1haW5pbmcgZXJyb3IgY29kZXMKICAgICBjYW4gbGVhZCB0byAndW5leHBsYWluYWJsZScgY29ubmVjdGlvbiBhYm9ydHMgbGF0ZXIuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSB0cmFja2VkIGRvd24gYnkgTHV0eiBKYWVuaWNrZV0KCiAgKikgTWFqb3IgRVZQIEFQSSBjaXBoZXIgcmV2aXNpb24uCiAgICAgQWRkIGhvb2tzIGZvciBleHRyYSBFVlAgZmVhdHVyZXMuIFRoaXMgYWxsb3dzIHZhcmlvdXMgY2lwaGVyCiAgICAgcGFyYW1ldGVycyB0byBiZSBzZXQgaW4gdGhlIEVWUCBpbnRlcmZhY2UuIFN1cHBvcnQgYWRkZWQgZm9yIHZhcmlhYmxlCiAgICAga2V5IGxlbmd0aCBjaXBoZXJzIHZpYSB0aGUgRVZQX0NJUEhFUl9DVFhfc2V0X2tleV9sZW5ndGgoKSBmdW5jdGlvbiBhbmQKICAgICBzZXR0aW5nIG9mIFJDMiBhbmQgUkM1IHBhcmFtZXRlcnMuCgogICAgIE1vZGlmeSBFVlBfT3BlbkluaXQoKSBhbmQgRVZQX1NlYWxJbml0KCkgdG8gY29wZSB3aXRoIHZhcmlhYmxlIGtleSBsZW5ndGgKICAgICBjaXBoZXJzLgoKICAgICBSZW1vdmUgbG90cyBvZiBkdXBsaWNhdGVkIGNvZGUgZnJvbSB0aGUgRVZQIGxpYnJhcnkuIEZvciBleGFtcGxlICpldmVyeSoKICAgICBjaXBoZXIgaW5pdCgpIGZ1bmN0aW9uIGhhbmRsZXMgdGhlICdpdicgaW4gdGhlIHNhbWUgd2F5IGFjY29yZGluZyB0byB0aGUKICAgICBjaXBoZXIgbW9kZS4gVGhleSBhbHNvIGFsbCBkbyBub3RoaW5nIGlmIHRoZSAna2V5JyBwYXJhbWV0ZXIgaXMgTlVMTCBhbmQKICAgICBmb3IgQ0ZCIGFuZCBPRkIgbW9kZXMgdGhleSB6ZXJvIGN0eC0+bnVtLgoKICAgICBOZXcgZnVuY3Rpb25hbGl0eSBhbGxvd3MgcmVtb3ZhbCBvZiBTL01JTUUgY29kZSBSQzIgaGFjay4KCiAgICAgTW9zdCBvZiB0aGUgcm91dGluZXMgaGF2ZSB0aGUgc2FtZSBmb3JtIGFuZCBzbyBjYW4gYmUgZGVjbGFyZWQgaW4gdGVybXMKICAgICBvZiBtYWNyb3MuCgogICAgIEJ5IHNoaWZ0aW5nIHRoaXMgdG8gdGhlIHRvcCBsZXZlbCBFVlBfQ2lwaGVySW5pdCgpIGl0IGNhbiBiZSByZW1vdmVkIGZyb20KICAgICBhbGwgaW5kaXZpZHVhbCBjaXBoZXJzLiBJZiB0aGUgY2lwaGVyIHdhbnRzIHRvIGhhbmRsZSBJVnMgb3Iga2V5cwogICAgIGRpZmZlcmVudGx5IGl0IGNhbiBzZXQgdGhlIEVWUF9DSVBIX0NVU1RPTV9JViBvciBFVlBfQ0lQSF9BTFdBWVNfQ0FMTF9JTklUCiAgICAgZmxhZ3MuCgogICAgIENoYW5nZSBsb3RzIG9mIGZ1bmN0aW9ucyBsaWtlIEVWUF9FbmNyeXB0VXBkYXRlKCkgdG8gbm93IHJldHVybiBhCiAgICAgdmFsdWU6IGFsdGhvdWdoIHNvZnR3YXJlIHZlcnNpb25zIG9mIHRoZSBhbGdvcml0aG1zIGNhbm5vdCBmYWlsCiAgICAgYW55IGluc3RhbGxlZCBoYXJkd2FyZSB2ZXJzaW9ucyBjYW4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW1wbGVtZW50IFNTTF9PUF9UTFNfUk9MTEJBQ0tfQlVHOiBJbiBzc2wzX2dldF9jbGllbnRfa2V5X2V4Y2hhbmdlLCBpZgogICAgIHRoaXMgb3B0aW9uIGlzIHNldCwgdG9sZXJhdGUgYnJva2VuIGNsaWVudHMgdGhhdCBzZW5kIHRoZSBuZWdvdGlhdGVkCiAgICAgcHJvdG9jb2wgdmVyc2lvbiBudW1iZXIgaW5zdGVhZCBvZiB0aGUgcmVxdWVzdGVkIHByb3RvY29sIHZlcnNpb24KICAgICBudW1iZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2FsbCBkaF90bXBfY2IgKHNldCBieSAuLi5fVE1QX0RIX0NCKSB3aXRoIGNvcnJlY3QgJ2lzX2V4cG9ydCcgZmxhZzsKICAgICBpLmUuIG5vbi16ZXJvIGZvciBleHBvcnQgY2lwaGVyc3VpdGVzLCB6ZXJvIG90aGVyd2lzZS4KICAgICBQcmV2aW91cyB2ZXJzaW9ucyBoYWQgdGhpcyBmbGFnIGludmVydGVkLCBpbmNvbnNpc3RlbnQgd2l0aAogICAgIHJzYV90bXBfY2IgKC4uLl9UTVBfUlNBX0NCKS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHJlcG9ydGVkIGJ5IEFtaXQgQ2hvcHJhXQoKICAqKSBBZGQgbWlzc2luZyBEU0EgbGlicmFyeSB0ZXh0IHN0cmluZy4gV29yayBhcm91bmQgZm9yIHNvbWUgSUlTCiAgICAga2V5IGZpbGVzIHdpdGggaW52YWxpZCBTRVFVRU5DRSBlbmNvZGluZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBkb2N1bWVudCAoZG9jL3N0YW5kYXJkcy50eHQpIHRoYXQgbGlzdCBhbGwga2luZHMgb2Ygc3RhbmRhcmRzCiAgICAgYW5kIHNvIG9uIHRoYXQgYXJlIGltcGxlbWVudGVkIGluIE9wZW5TU0wuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRW5oYW5jZSBjX3JlaGFzaCBzY3JpcHQuIE9sZCB2ZXJzaW9uIHdvdWxkIG1pc2hhbmRsZSBjZXJ0aWZpY2F0ZXMKICAgICB3aXRoIHRoZSBzYW1lIHN1YmplY3QgbmFtZSBoYXNoIGFuZCB3b3VsZG4ndCBoYW5kbGUgQ1JMcyBhdCBhbGwuCiAgICAgQWRkZWQgLWZpbmdlcnByaW50IG9wdGlvbiB0byBjcmwgdXRpbGl0eSwgdG8gc3VwcG9ydCBuZXcgY19yZWhhc2gKICAgICBmZWF0dXJlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbGltaW5hdGUgbm9uLUFOU0kgZGVjbGFyYXRpb25zIGluIGNyeXB0by5oIGFuZCBzdGFjay5oLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggZm9yIFNTTCBzZXJ2ZXIgcHVycG9zZSBjaGVja2luZy4gU2VydmVyIGNoZWNraW5nIHdhcwogICAgIHJlamVjdGluZyBjZXJ0aWZpY2F0ZXMgd2hpY2ggaGFkIGV4dGVuZGVkIGtleSB1c2FnZSBwcmVzZW50CiAgICAgYnV0IG5vIHNzbCBjbGllbnQgcHVycG9zZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBSZW5lIEdyb3NzZXIgPGdyb3NzZXJAaGlzb2x1dGlvbnMuY29tPl0KCiAgKikgTWFrZSBQS0NTIzEyIGNvZGUgd29yayB3aXRoIG5vIHBhc3N3b3JkLiBUaGUgUEtDUyMxMiBzcGVjCiAgICAgaXMgYSBsaXR0bGUgdW5jbGVhciBhYm91dCBob3cgYSBibGFuayBwYXNzd29yZCBpcyBoYW5kbGVkLgogICAgIFNpbmNlIHRoZSBwYXNzd29yZCBpbiBlbmNvZGVkIGFzIGEgQk1QU3RyaW5nIHdpdGggdGVybWluYXRpbmcKICAgICBkb3VibGUgTlVMTCBhIHplcm8gbGVuZ3RoIHBhc3N3b3JkIHdvdWxkIGVuZCB1cCBhcyBqdXN0IHRoZQogICAgIGRvdWJsZSBOVUxMLiBIb3dldmVyIG5vIHBhc3N3b3JkIGF0IGFsbCBpcyBkaWZmZXJlbnQgYW5kIGlzCiAgICAgaGFuZGxlZCBkaWZmZXJlbnRseSBpbiB0aGUgUEtDUyMxMiBrZXkgZ2VuZXJhdGlvbiBjb2RlLiBOUwogICAgIHRyZWF0cyBhIGJsYW5rIHBhc3N3b3JkIGFzIHplcm8gbGVuZ3RoLiBNU0lFIHRyZWF0cyBpdCBhcyBubwogICAgIHBhc3N3b3JkIG9uIGV4cG9ydDogYnV0IGl0IHdpbGwgdHJ5IGJvdGggb24gaW1wb3J0LiBXZSBub3cgZG8KICAgICB0aGUgc2FtZTogUEtDUzEyX3BhcnNlKCkgdHJpZXMgemVybyBsZW5ndGggYW5kIG5vIHBhc3N3b3JkIGlmCiAgICAgdGhlIHBhc3N3b3JkIGlzIHNldCB0byAiIiBvciBOVUxMIChOVUxMIGlzIG5vdyBhIHZhbGlkIHBhc3N3b3JkOgogICAgIGl0IHdhc24ndCBiZWZvcmUpIGFzIGRvZXMgdGhlIHBrY3MxMiBhcHBsaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCdWdmaXhlcyBpbiBhcHBzL3g1MDkuYzogQXZvaWQgYSBtZW1vcnkgbGVhazsgYW5kIGRvbid0IHVzZQogICAgIHBlcnJvciB3aGVuIFBFTV9yZWFkX2Jpb19YNTA5X1JFUSBmYWlscywgdGhlIGVycm9yIG1lc3NhZ2UgbXVzdAogICAgIGJlIG9idGFpbmVkIGZyb20gdGhlIGVycm9yIHF1ZXVlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkICd0aHJlYWRfaGFzaCcgbWVtb3J5IGxlYWsgaW4gY3J5cHRvL2Vyci9lcnIuYyBieSBmcmVlaW5nCiAgICAgaXQgaW4gRVJSX3JlbW92ZV9zdGF0ZSBpZiBhcHByb3ByaWF0ZSwgYW5kIGNoYW5nZSBFUlJfZ2V0X3N0YXRlCiAgICAgYWNjb3JkaW5nbHkgdG8gYXZvaWQgcmFjZSBjb25kaXRpb25zICh0aGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlCiAgICAgdGhyZWFkX2hhc2ggaXMgbm8gbG9uZ2VyIGNvbnN0YW50IG9uY2Ugc2V0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXggZm9yIGxpbnV4LWVsZiBtYWtlZmlsZS5vbmUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSB3aWxsIG5vdyBjYXVzZSBhIGRlZmF1bHQKICAgICBSU0FfTUVUSE9EIHRvIGJlIGNob3NlbiBpZiBvbmUgZG9lc24ndCBleGlzdCBhbHJlYWR5LgogICAgIFByZXZpb3VzbHkgdGhpcyB3YXMgb25seSBzZXQgZHVyaW5nIGEgY2FsbCB0byBSU0FfbmV3KCkKICAgICBvciBSU0FfbmV3X21ldGhvZChOVUxMKSBtZWFuaW5nIGl0IHdhcyBwb3NzaWJsZSBmb3IKICAgICBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCkgdG8gcmV0dXJuIE5VTEwuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkZWQgbmF0aXZlIG5hbWUgdHJhbnNsYXRpb24gdG8gdGhlIGV4aXN0aW5nIERTTyBjb2RlCiAgICAgdGhhdCB3aWxsIGNvbnZlcnQgKGlmIHRoZSBmbGFnIHRvIGRvIHNvIGlzIHNldCkgZmlsZW5hbWVzCiAgICAgdGhhdCBhcmUgc3VmZmljaWVudGx5IHNtYWxsIGFuZCBoYXZlIG5vIHBhdGggaW5mb3JtYXRpb24KICAgICBpbnRvIGEgY2Fub25pY2FsIG5hdGl2ZSBmb3JtLiBFZy4gImJsYWgiIGNvbnZlcnRlZCB0bwogICAgICJsaWJibGFoLnNvIiBvciAiYmxhaC5kbGwiIGV0Yy4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBOZXcgZnVuY3Rpb24gRVJSX2Vycm9yX3N0cmluZ19uKGUsIGJ1ZiwgbGVuKSB3aGljaCBpcyBsaWtlCiAgICAgRVJSX2Vycm9yX3N0cmluZyhlLCBidWYpLCBidXQgd3JpdGVzIGF0IG1vc3QgJ2xlbicgYnl0ZXMKICAgICBpbmNsdWRpbmcgdGhlIDAgdGVybWluYXRvci4gIEZvciBFUlJfZXJyb3Jfc3RyaW5nX24sICdidWYnCiAgICAgbWF5IG5vdCBiZSBOVUxMLgogICAgIFtEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+LCBCb2RvIE1vZWxsZXJdCgogICopIENPTkYgbGlicmFyeSByZXdvcmtlZCB0byBiZWNvbWUgbW9yZSBnZW5lcmFsLiAgQSBuZXcgQ09ORgogICAgIGNvbmZpZ3VyYXRpb24gZmlsZSByZWFkZXIgImNsYXNzIiBpcyBpbXBsZW1lbnRlZCBhcyB3ZWxsIGFzIGEKICAgICBuZXcgZnVuY3Rpb25zIChOQ09ORl8qLCBmb3IgIk5ldyBDT05GIikgdG8gaGFuZGxlIGl0LiAgVGhlIG5vdwogICAgIG9sZCBDT05GXyogZnVuY3Rpb25zIGFyZSBzdGlsbCB0aGVyZSwgYnV0IGFyZSByZWltcGxlbWVudGVkIHRvCiAgICAgd29yayBpbiB0ZXJtcyBvZiB0aGUgbmV3IGZ1bmN0aW9ucy4gIEFsc28sIGEgc2V0IG9mIGZ1bmN0aW9ucwogICAgIHRvIGhhbmRsZSB0aGUgaW50ZXJuYWwgc3RvcmFnZSBvZiB0aGUgY29uZmlndXJhdGlvbiBkYXRhIGlzCiAgICAgcHJvdmlkZWQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gd3JpdGUgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZQogICAgIHJlYWRlciAiY2xhc3NlcyIgKEkgY2FuIGRlZmluaXRlbHkgc2VlIHNvbWV0aGluZyByZWFkaW5nIGEKICAgICBjb25maWd1cmF0aW9uIGZpbGUgaW4gWE1MIGZvcm1hdCwgZm9yIGV4YW1wbGUpLCBjYWxsZWQgX0NPTkZfKiwKICAgICBvciAidGhlIGNvbmZpZ3VyYXRpb24gc3RvcmFnZSBBUEkiLi4uCgogICAgIFRoZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlIHJlYWRpbmcgZnVuY3Rpb25zIGFyZToKCiAgICAgICAgTkNPTkZfbmV3LCBOQ09ORl9mcmVlLCBOQ09ORl9sb2FkLCBOQ09ORl9sb2FkX2ZwLCBOQ09ORl9sb2FkX2JpbywKICAgICAgICBOQ09ORl9nZXRfc2VjdGlvbiwgTkNPTkZfZ2V0X3N0cmluZywgTkNPTkZfZ2V0X251bWJyZQoKICAgICAgICBOQ09ORl9kZWZhdWx0LCBOQ09ORl9XSU4zMgoKICAgICAgICBOQ09ORl9kdW1wX2ZwLCBOQ09ORl9kdW1wX2JpbwoKICAgICBOQ09ORl9kZWZhdWx0IGFuZCBOQ09ORl9XSU4zMiBhcmUgbWV0aG9kIChvciAiY2xhc3MiKSBjaG9vc2VycywKICAgICBOQ09ORl9uZXcgY3JlYXRlcyBhIG5ldyBDT05GIG9iamVjdC4gIFRoaXMgd29ya3MgaW4gdGhlIHNhbWUgd2F5CiAgICAgYXMgb3RoZXIgaW50ZXJmYWNlcyBpbiBPcGVuU1NMLCBsaWtlIHRoZSBCSU8gaW50ZXJmYWNlLgogICAgIE5DT05GX2R1bXBfKiBkdW1wIHRoZSBpbnRlcm5hbCBzdG9yYWdlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUsCiAgICAgd2hpY2ggaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuICBBbGwgb3RoZXIgZnVuY3Rpb25zIHRha2UgdGhlIHNhbWUKICAgICBhcmd1bWVudHMgYXMgdGhlIG9sZCBDT05GXyogZnVuY3Rpb25zIHd0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZQogICAgIGZpcnN0IHRoYXQgbXVzdCBiZSBhIGBDT05GIConIGluc3RlYWQgb2YgYSBgTEhBU0ggKicuCgogICAgIFRvIG1ha2UgaXQgZWFzZXIgdG8gdXNlIHRoZSBuZXcgY2xhc3NlcyB3aXRoIHRoZSBvbGQgQ09ORl8qIGZ1bmN0aW9ucywKICAgICB0aGUgZnVuY3Rpb24gQ09ORl9zZXRfZGVmYXVsdF9tZXRob2QgaXMgcHJvdmlkZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkICctdGxzMScgb3B0aW9uIHRvICdvcGVuc3NsIGNpcGhlcnMnLCB3aGljaCB3YXMgYWxyZWFkeQogICAgIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBidXQgaGFkIG5vdCBiZWVuIGltcGxlbWVudGVkLgogICAgIChUaGlzIG9wdGlvbiBpcyBub3QgeWV0IHJlYWxseSB1c2VmdWwgYmVjYXVzZSBldmVuIHRoZSBhZGRpdGlvbmFsCiAgICAgZXhwZXJpbWVudGFsIFRMUyAxLjAgY2lwaGVycyBhcmUgY3VycmVudGx5IHRyZWF0ZWQgYXMgU1NMIDMuMCBjaXBoZXJzLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbml0aWFsIERTTyBjb2RlIGFkZGVkIGludG8gbGliY3J5cHRvIGZvciBsZXR0aW5nIE9wZW5TU0wgKGFuZAogICAgIE9wZW5TU0wtYmFzZWQgYXBwbGljYXRpb25zKSBsb2FkIHNoYXJlZCBsaWJyYXJpZXMgYW5kIGJpbmQgdG8KICAgICB0aGVtIGluIGEgcG9ydGFibGUgd2F5LgogICAgIFtHZW9mZiBUaG9ycGUsIHdpdGggY29udHJpYnV0aW9ucyBmcm9tIFJpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjUgYW5kIDAuOS41YSAgWzEgQXByIDIwMDBdCgogICopIE1ha2Ugc3VyZSBfbHJvdGwgYW5kIF9scm90ciBhcmUgb25seSB1c2VkIHdpdGggTVNWQy4KCiAgKikgVXNlIGxvY2sgQ1JZUFRPX0xPQ0tfUkFORCBjb3JyZWN0bHkgaW4gc3NsZWF5X3JhbmRfc3RhdHVzCiAgICAgKHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFJBTkRfc3RhdHVzKS4KCiAgKikgUmVuYW1lIG9wZW5zc2wgeDUwOSBvcHRpb24gJy1jcmxleHQnLCB3aGljaCB3YXMgYWRkZWQgaW4gMC45LjUsCiAgICAgdG8gJy1jbHJleHQnICg9IGNsZWFyIGV4dGVuc2lvbnMpLCBhcyBpbnRlbmRlZCBhbmQgZG9jdW1lbnRlZC4KICAgICBbQm9kbyBNb2VsbGVyOyBpbmNvbnNpc3RlbmN5IHBvaW50ZWQgb3V0IGJ5IE1pY2hhZWwgQXR0aWxpCiAgICAgPGF0dGlsaUBhbWF4by5jb20+XQoKICAqKSBGaXggZm9yIEhNQUMuIEl0IHdhc24ndCB6ZXJvaW5nIHRoZSByZXN0IG9mIHRoZSBibG9jayBpZiB0aGUga2V5IGxlbmd0aAogICAgIHdhcyBsYXJnZXIgdGhhbiB0aGUgTUQgYmxvY2sgc2l6ZS4gICAgICAKICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBZb3N0IFdpbGxpYW0gPFlvc3RXQHRjZS5jb20+XQoKICAqKSBNb2Rlcm5pc2UgUEtDUzEyX3BhcnNlKCkgc28gaXQgdXNlcyBTVEFDS19PRihYNTA5KSBmb3IgaXRzIGNhIGFyZ3VtZW50CiAgICAgZml4IGEgbGVhayB3aGVuIHRoZSBjYSBhcmd1bWVudCB3YXMgcGFzc2VkIGFzIE5VTEwuIFN0b3AgWDUwOV9QVUJLRVlfc2V0KCkKICAgICB1c2luZyB0aGUgcGFzc2VkIGtleTogaWYgdGhlIHBhc3NlZCBrZXkgd2FzIGEgcHJpdmF0ZSBrZXkgdGhlIHJlc3VsdAogICAgIG9mIFg1MDlfcHJpbnQoKSwgZm9yIGV4YW1wbGUsIHdvdWxkIGJlIHRvIHByaW50IG91dCBhbGwgdGhlIHByaXZhdGUga2V5CiAgICAgY29tcG9uZW50cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBkZXNfcXVhZF9ja3N1bSgpIGJ5dGUgb3JkZXIgYnVnIGZpeC4KICAgICBbVWxmIE32bGxlciwgdXNpbmcgdGhlIHByb2JsZW0gZGVzY3JpcHRpb24gaW4ga3JiNC0wLjkuNywgd2hlcmUKICAgICAgdGhlIHNvbHV0aW9uIGlzIGF0dHJpYnV0ZWQgdG8gRGVycmljayBKIEJyYXNoZWFyIDxzaGFkb3dAREVNRU5USUEuT1JHPl0KCiAgKikgRml4IHNvIFZfQVNOMV9BUFBfQ0hPT1NFIHdvcmtzIGFnYWluOiBob3dldmVyIGl0cyB1c2UgaXMgc3Ryb25nbHkKICAgICBkaXNjb3VyYWdlZC4KICAgICBbU3RldmUgSGVuc29uLCBwb2ludGVkIG91dCBieSBCcmlhbiBLb3J2ZXIgPGJyaWFua0Bjcy5zdGFuZm9yZC5lZHU+XQoKICAqKSBGb3IgZWFzaWx5IHRlc3RpbmcgaW4gc2hlbGwgc2NyaXB0cyB3aGV0aGVyIHNvbWUgY29tbWFuZAogICAgICdvcGVuc3NsIFhYWCcgZXhpc3RzLCB0aGUgbmV3IHBzZXVkby1jb21tYW5kICdvcGVuc3NsIG5vLVhYWCcKICAgICByZXR1cm5zIHdpdGggZXhpdCBjb2RlIDAgaWZmIG5vIGNvbW1hbmQgb2YgdGhlIGdpdmVuIG5hbWUgaXMgYXZhaWxhYmxlLgogICAgICduby1YWFgnIGlzIHByaW50ZWQgaW4gdGhpcyBjYXNlLCAnWFhYJyBvdGhlcndpc2UuICBJbiBib3RoIGNhc2VzLAogICAgIHRoZSBvdXRwdXQgZ29lcyB0byBzdGRvdXQgYW5kIG5vdGhpbmcgaXMgcHJpbnRlZCB0byBzdGRlcnIuCiAgICAgQWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIGFsd2F5cyBpZ25vcmVkLgoKICAgICBTaW5jZSBmb3IgZWFjaCBjaXBoZXIgdGhlcmUgaXMgYSBjb21tYW5kIG9mIHRoZSBzYW1lIG5hbWUsCiAgICAgdGhlICduby1jaXBoZXInIGNvbXBpbGF0aW9uIHN3aXRjaGVzIGNhbiBiZSB0ZXN0ZWQgdGhpcyB3YXkuCgogICAgICgnb3BlbnNzbCBuby1YWFgnIGlzIG5vdCBhYmxlIHRvIGRldGVjdCBwc2V1ZG8tY29tbWFuZHMgc3VjaAogICAgIGFzICdxdWl0JywgJ2xpc3QtWFhYLWNvbW1hbmRzJywgb3IgJ25vLVhYWCcgaXRzZWxmLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVcGRhdGUgdGVzdCBzdWl0ZSBzbyB0aGF0ICdtYWtlIHRlc3QnIHN1Y2NlZWRzIGluICduby1yc2EnIGNvbmZpZ3VyYXRpb24uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRm9yIFNTTF9bQ1RYX11zZXRfdG1wX2RoLCBkb24ndCBjcmVhdGUgYSBESCBrZXkgaWYgU1NMX09QX1NJTkdMRV9ESF9VU0UKICAgICBpcyBzZXQ7IGl0IHdpbGwgYmUgdGhyb3duIGF3YXkgYW55d2F5IGJlY2F1c2UgZWFjaCBoYW5kc2hha2UgY3JlYXRlcwogICAgIGl0cyBvd24ga2V5LgogICAgIHNzbF9jZXJ0X2R1cCwgd2hpY2ggaXMgdXNlZCBieSBTU0xfbmV3LCBub3cgY29waWVzIERIIGtleXMgaW4gYWRkaXRpb24KICAgICB0byBwYXJhbWV0ZXJzIC0tIGluIHByZXZpb3VzIHZlcnNpb25zIChzaW5jZSBPcGVuU1NMIDAuOS4zKSB0aGUKICAgICAnZGVmYXVsdCBrZXknIGZyb20gU1NMX0NUWF9zZXRfdG1wX2RoIHdvdWxkIGFsd2F5cyBiZSBsb3N0LCBtZWFuaW5nCiAgICAgeW91IGVmZmVjdGl2bHkgZ290IFNTTF9PUF9TSU5HTEVfREhfVVNFIHdoZW4gdXNpbmcgdGhpcyBtYWNyby4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgc19jbGllbnQgb3B0aW9uIC1pZ25fZW9mOiBFT0YgYXQgc3RkaW4gaXMgaWdub3JlZCwgYW5kCiAgICAgJ1EnIGFuZCAnUicgbG9zZSB0aGVpciBzcGVjaWFsIG1lYW5pbmdzIChxdWl0L3JlbmVnb3RpYXRlKS4KICAgICBUaGlzIGlzIHBhcnQgb2Ygd2hhdCAtcXVpZXQgZG9lczsgdW5saWtlIC1xdWlldCwgLWlnbl9lb2YKICAgICBkb2VzIG5vdCBzdXBwcmVzcyBhbnkgb3V0cHV0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBjb21wYXRpYmlsaXR5IG9wdGlvbnMgdG8gdGhlIHB1cnBvc2UgYW5kIHRydXN0IGNvZGUuIFRoZQogICAgIHB1cnBvc2UgWDUwOV9QVVJQT1NFX0FOWSBpcyAiYW55IHB1cnBvc2UiIHdoaWNoIGF1dG9tYXRpY2FsbHkKICAgICBhY2NlcHRzIGEgY2VydGlmaWNhdGUgb3IgQ0EsIHRoaXMgd2FzIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIsCiAgICAgd2l0aCBhbGwgdGhlIGFzc29jaWF0ZWQgc2VjdXJpdHkgaXNzdWVzLgoKICAgICBYNTA5X1RSVVNUX0NPTVBBVCBpcyB0aGUgb2xkIHRydXN0IGJlaGF2aW91cjogb25seSBhbmQKICAgICBhdXRvbWF0aWNhbGx5IHRydXN0IHNlbGYgc2lnbmVkIHJvb3RzIGluIGNlcnRpZmljYXRlIHN0b3JlLiBBCiAgICAgbmV3IHRydXN0IHNldHRpbmcgWDUwOV9UUlVTVF9ERUZBVUxUIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGF0CiAgICAgYSBwdXJwb3NlIGhhcyBubyBhc3NvY2lhdGVkIHRydXN0IHNldHRpbmcgYW5kIGl0IHNob3VsZCBpbnN0ZWFkCiAgICAgdXNlIHRoZSB2YWx1ZSBpbiB0aGUgZGVmYXVsdCBwdXJwb3NlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgUEtDUyM4IERTQSBwcml2YXRlIGtleSBjb2RlIHNvIGl0IGRlY29kZXMga2V5cyBhZ2FpbgogICAgIGFuZCBmaXggYSBtZW1vcnkgbGVhay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiB1dGlsL21rZXJyLnBsICh3aGljaCBpbXBsZW1lbnRzICdtYWtlIGVycm9ycycpLCBwcmVzZXJ2ZQogICAgIHJlYXNvbiBzdHJpbmdzIGZyb20gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIC5jIGZpbGUsIGFzCiAgICAgdGhlIGRlZmF1bHQgdG8gaGF2ZSBvbmx5IGRvd25jYXNlIGxldHRlcnMgKGFuZCBkaWdpdHMpIGluCiAgICAgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgcmVhc29ucyBjb2RlcyBpcyBub3QgYWx3YXlzIGFwcHJvcHJpYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIEVSUl9sb2FkX0VSUl9zdHJpbmdzKCksIGJ1aWxkIGFuIEVSUl9MSUJfU1lTIGVycm9yIHJlYXNvbiB0YWJsZQogICAgIHVzaW5nIHN0cmVycm9yLiAgUHJldmlvdXNseSwgRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoKSByZXR1cm5lZAogICAgIGxpYnJhcnkgbmFtZXMgYXMgcmVhc29uIHN0cmluZ3MgZm9yIFNZU2VycjsgYnV0IFNZU2VyciBpcyBhIHNwZWNpYWwKICAgICBjYXNlIHdoZXJlIHNtYWxsIG51bWJlcnMgYXJlIGVycm5vIHZhbHVlcywgbm90IGxpYnJhcnkgbnVtYmVycy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgJy1kc2FwYXJhbScgb3B0aW9uIHRvICdvcGVuc3NsIGRocGFyYW0nIGFwcGxpY2F0aW9uLiAgVGhpcwogICAgIGNvbnZlcnRzIERTQSBwYXJhbWV0ZXJzIGludG8gREggcGFyYW1ldGVycy4gKFdoZW4gY3JlYXRpbmcgcGFyYW1ldGVycywKICAgICBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBpcyB1c2VkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbmNsdWRlICdsZW5ndGgnIChyZWNvbW1lbmRlZCBleHBvbmVudCBsZW5ndGgpIGluIEMgY29kZSBnZW5lcmF0ZWQKICAgICBieSAnb3BlbnNzbCBkaHBhcmFtIC1DJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNldF9sYWJlbCBpbiBwZXJsYXNtIHdhcyBhbHJlYWR5IGJlaW5nIHVzZWQKICAgICBzbyBjb3VsZG4ndCBiZSB1c2VkIGFzIGEgImZpbGUgc2NvcGUiIGZsYWcuIE1vdmVkIHRvIHRoaXJkIGFyZ3VtZW50CiAgICAgd2hpY2ggd2FzIGZyZWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gUEVNX0FTTjFfd3JpdGVfYmlvIGFuZCBzb21lIG90aGVyIGZ1bmN0aW9ucywgdXNlIFJBTkRfcHNldWRvX2J5dGVzCiAgICAgaW5zdGVhZCBvZiBSQU5EX2J5dGVzIGZvciBlbmNyeXB0aW9uIElWcyBhbmQgc2FsdHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jbHVkZSBSQU5EX3N0YXR1cygpIGludG8gUkFORF9NRVRIT0QgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcKICAgICBpdCBvbmx5IGZvciBtZF9yYW5kLmMgIE90aGVyd2lzZSByZXBsYWNpbmcgdGhlIFBSTkcgYnkgY2FsbGluZwogICAgIFJBTkRfc2V0X3JhbmRfbWV0aG9kIHdvdWxkIGJlIGltcG9zc2libGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRG9uJ3QgbGV0IERTQV9nZW5lcmF0ZV9rZXkoKSBlbnRlciBhbiBpbmZpbml0ZSBsb29wIGlmIHRoZSByYW5kb20KICAgICBudW1iZXIgZ2VuZXJhdGlvbiBmYWlscy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgJ3JhbmQnIGFwcGxpY2F0aW9uIGZvciBjcmVhdGluZyBwc2V1ZG8tcmFuZG9tIG91dHB1dC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGRlZCBjb25maWd1cmF0aW9uIHN1cHBvcnQgZm9yIExpbnV4L0lBNjQKICAgICBbUm9sZiBIYWJlcnJlY2tlciA8cm9sZkBzdXNlLmRlPl0KCiAgKikgQXNzZW1ibGVyIG1vZHVsZSBzdXBwb3J0IGZvciBNaW5ndzMyLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTaGFyZWQgbGlicmFyeSBzdXBwb3J0IGZvciBIUFVYIChpbiBzaGxpYi8pLgogICAgIFtMdXR6IEphZW5pY2tlIDxMdXR6LkphZW5pY2tlQGFldC5UVS1Db3R0YnVzLkRFPiBhbmQgQW5vbnltb3VzXQoKICAqKSBTaGFyZWQgbGlicmFyeSBzdXBwb3J0IGZvciBTb2xhcmlzIGdjYy4KICAgICBbTHV0eiBCZWhua2UgPGJlaG5rZUB0cnVzdGNlbnRlci5kZT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS40IGFuZCAwLjkuNSAgWzI4IEZlYiAyMDAwXQoKICAqKSBQS0NTN19lbmNyeXB0KCkgd2FzIGFkZGluZyB0ZXh0IE1JTUUgaGVhZGVycyB0d2ljZSBiZWNhdXNlIHRoZXkKICAgICB3ZXJlIGFkZGVkIG1hbnVhbGx5IGFuZCBieSBTTUlNRV9jcmxmX2NvcHkoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBibnRlc3QuYyBkb24ndCBjYWxsIEJOX3JhbmQgd2l0aCB6ZXJvIGJpdHMgYXJndW1lbnQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgQW5kcmV3IFcuIEdyYXkgPGFncmF5QGljb25zaW5jLmNvbT5dCgogICopIEJOX211bCBidWdmaXg6IEluIGJuX211bF9wYXJ0X3JlY3Vyc2lvbigpIG9ubHkgdGhlIGE+YVtuXSAmJiBiPmJbbl0KICAgICBjYXNlIHdhcyBpbXBsZW1lbnRlZC4gVGhpcyBjYXVzZWQgQk5fZGl2X3JlY3AoKSB0byBmYWlsIG9jY2FzaW9uYWxseS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB0byB0aGUgc2V0X2xhYmVsKCkgaW4gdGhlIHBlcmwKICAgICBhc3NlbWJseSBsYW5ndWFnZSBidWlsZGVyLiBJZiB0aGlzIGFyZ3VtZW50IGV4aXN0cyBhbmQgaXMgc2V0CiAgICAgdG8gMSBpdCBzaWduYWxzIHRoYXQgdGhlIGFzc2VtYmxlciBzaG91bGQgdXNlIGEgc3ltYm9sIHdob3NlIAogICAgIHNjb3BlIGlzIHRoZSBlbnRpcmUgZmlsZSwgbm90IGp1c3QgdGhlIGN1cnJlbnQgZnVuY3Rpb24uIFRoaXMKICAgICBpcyBuZWVkZWQgd2l0aCBNQVNNIHdoaWNoIHVzZXMgdGhlIGZvcm1hdCBsYWJlbDo6IGZvciB0aGlzIHNjb3BlLgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IFBldGVyIFJ1bmVzdGlnIDxwZXRlckBydW5lc3RpZy5jb20+XQoKICAqKSBDaGFuZ2UgdGhlIEFTTjEgdHlwZXMgc28gdGhleSBhcmUgdHlwZWRlZnMgYnkgZGVmYXVsdC4gQmVmb3JlCiAgICAgYWxtb3N0IGFsbCB0eXBlcyB3ZXJlICNkZWZpbmUnZCB0byBBU04xX1NUUklORyB3aGljaCB3YXMgY2F1c2luZwogICAgIFNUQUNLX09GKCkgcHJvYmxlbXM6IHlvdSBjb3VsZG4ndCBkZWNsYXJlIFNUQUNLX09GKEFTTjFfVVRGOFNUUklORykKICAgICBmb3IgZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgbmFtZXMgb2YgbmV3IGZ1bmN0aW9ucyB0byB0aGUgbmV3IGdldDEvZ2V0MCBuYW1pbmcKICAgICBjb252ZW50aW9uOiBBZnRlciAnZ2V0MScsIHRoZSBjYWxsZXIgb3ducyBhIHJlZmVyZW5jZSBjb3VudAogICAgIGFuZCBoYXMgdG8gY2FsbCAuLi5fZnJlZTsgJ2dldDAnIHJldHVybnMgYSBwb2ludGVyIHRvIHNvbWUKICAgICBkYXRhIHN0cnVjdHVyZSB3aXRob3V0IGluY3JlbWVudGluZyByZWZlcmVuY2UgY291bnRlcnMuCiAgICAgKFNvbWUgb2YgdGhlIGV4aXN0aW5nICdnZXQnIGZ1bmN0aW9ucyBpbmNyZW1lbnQgYSByZWZlcmVuY2UKICAgICBjb3VudGVyLCBzb21lIGRvbid0LikKICAgICBTaW1pbGFybHksICdzZXQxJyBhbmQgJ2FkZDEnIGZ1bmN0aW9ucyBpbmNyZWFzZSByZWZlcmVuY2UKICAgICBjb3VudGVycyBvciBkdXBsaWNhdGUgb2JqZWN0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBmb3IgdGhlIHBvc3NpYmlsaXR5IG9mIHRlbXAgUlNBIGtleSBnZW5lcmF0aW9uIGZhaWx1cmU6CiAgICAgdGhlIGNvZGUgdXNlZCB0byBhc3N1bWUgaXQgYWx3YXlzIHdvcmtlZCBhbmQgY3Jhc2hlZCBvbiBmYWlsdXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW4gcHJvYmxlbSBpbiBCSU9fcHJpbnRmKCkuCiAgICAgW1VsZiBN9mxsZXIsIHVzaW5nIHB1YmxpYyBkb21haW4gY29kZSBieSBQYXRyaWNrIFBvd2VsbDsgcHJvYmxlbQogICAgICBwb2ludGVkIG91dCBieSBEYXZpZCBTYWNlcmRvdGUgPGRhczMzQGNvcm5lbGwuZWR1Pl0KCiAgKikgU3VwcG9ydCBFR0QgPGh0dHA6Ly93d3cubG90aGFyLmNvbS90ZWNoL2NyeXB0by8+LiAgTmV3IGZ1bmN0aW9ucwogICAgIFJBTkRfZWdkKCkgYW5kIFJBTkRfc3RhdHVzKCkuICBJbiB0aGUgY29tbWFuZCBsaW5lIGFwcGxpY2F0aW9uLAogICAgIHRoZSBFR0Qgc29ja2V0IGNhbiBiZSBzcGVjaWZpZWQgbGlrZSBhIHNlZWQgZmlsZSB1c2luZyBSQU5ERklMRQogICAgIG9yIC1yYW5kLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBbGxvdyB0aGUgc3RyaW5nIENFUlRJRklDQVRFIHRvIGJlIHRvbGVyYXRlZCBpbiBQS0NTIzcgc3RydWN0dXJlcy4KICAgICBTb21lIENBcyAoZS5nLiBWZXJpc2lnbikgZGlzdHJpYnV0ZSBjZXJ0aWZpY2F0ZXMgaW4gdGhpcyBmb3JtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSB0aGUgU1NMX0FMTE9XX0FESCBjb21waWxlIG9wdGlvbiBhbmQgc2V0IHRoZSBkZWZhdWx0IGNpcGhlcgogICAgIGxpc3QgdG8gZXhjbHVkZSB0aGVtLiBUaGlzIG1lYW5zIHRoYXQgbm8gc3BlY2lhbCBjb21waWxhdGlvbiBvcHRpb24KICAgICBpcyBuZWVkZWQgdG8gdXNlIGFub255bW91cyBESDogaXQganVzdCBuZWVkcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUKICAgICBjaXBoZXIgbGlzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIEVWUF9NRF9DVFhfdHlwZSBtYWNybyBzbyBpdHMgbWVhbmluZyBjb25zaXN0ZW50IHdpdGgKICAgICBFVlBfTURfdHlwZS4gVGhlIG9sZCBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSBpbiBhIG5ldyBtYWNybyBjYWxsZWQKICAgICBFVlBfTURfbWQoKS4gQ2hhbmdlIGNvZGUgdGhhdCB1c2VzIGl0IGFuZCB1cGRhdGUgZG9jcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSAuLi5fY3RybCBmdW5jdGlvbnMgbm93IGhhdmUgY29ycmVzcG9uZGluZyAuLi5fY2FsbGJhY2tfY3RybCBmdW5jdGlvbnMKICAgICB3aGVyZSB0aGUgJ3ZvaWQgKicgYXJndW1lbnQgaXMgcmVwbGFjZWQgYnkgYSBmdW5jdGlvbiBwb2ludGVyIGFyZ3VtZW50LgogICAgIFByZXZpb3VzbHkgJ3ZvaWQgKicgd2FzIGFidXNlZCB0byBwb2ludCB0byBmdW5jdGlvbnMsIHdoaWNoIHdvcmtzIG9uCiAgICAgbWFueSBwbGF0Zm9ybXMsIGJ1dCBpcyBub3QgY29ycmVjdC4gIEFzIHRoZXNlIGZ1bmN0aW9ucyBhcmUgdXN1YWxseQogICAgIGNhbGxlZCBieSBtYWNyb3MgZGVmaW5lZCBpbiBPcGVuU1NMIGhlYWRlciBmaWxlcywgbW9zdCBzb3VyY2UgY29kZQogICAgIHNob3VsZCB3b3JrIHdpdGhvdXQgY2hhbmdlcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPiAod2hpY2ggaXMgY3JlYXRlZCBieSBDb25maWd1cmUpIG5vdyBjb250YWlucwogICAgIHNlY3Rpb25zIHdpdGggaW5mb3JtYXRpb24gb24gLUQuLi4gY29tcGlsZXIgc3dpdGNoZXMgdXNlZCBmb3IKICAgICBjb21waWxpbmcgdGhlIGxpYnJhcnkgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHNlZSB0aGVtLiAgVG8gZW5hYmxlCiAgICAgb25lIG9mIHRoZXNlIHNlY3Rpb25zLCBhIHByZS1wcm9jZXNzb3Igc3ltYm9sIE9QRU5TU0xfLi4uX0RFRklORVMKICAgICBtdXN0IGJlIGRlZmluZWQuICBFLmcuLAogICAgICAgICNkZWZpbmUgT1BFTlNTTF9BTEdPUklUSE1fREVGSU5FUwogICAgICAgICNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CiAgICAgZGVmaW5lcyBhbGwgcGVydGluZW50IE5PXzxhbGdvPiBzeW1ib2xzLCBzdWNoIGFzIE5PX0lERUEsIE5PX1JTQSwgZXRjLgogICAgIFtSaWNoYXJkIExldml0dGUsIFVsZiBhbmQgQm9kbyBN9mxsZXJdCgogICopIEJ1Z2ZpeDogVG9sZXJhdGUgZnJhZ21lbnRhdGlvbiBhbmQgaW50ZXJsZWF2aW5nIGluIHRoZSBTU0wgMy9UTFMKICAgICByZWNvcmQgbGF5ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSAnb3RoZXInIHR5cGUgaW4gY2VydGlmaWNhdGUgYXV4IGluZm8gdG8gYSBTVEFDS19PRgogICAgIFg1MDlfQUxHT1IuIEFsdGhvdWdoIG5vdCBhbiBBbGdvcml0aG1JZGVudGlmaWVyIGFzIHN1Y2ggaXQgaGFzCiAgICAgdGhlIHJlcXVpcmVkIEFTTjEgZm9ybWF0OiBhcmJpdHJhcnkgdHlwZXMgZGV0ZXJtaW5lZCBieSBhbiBPSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNvbWUgUEVNX3dyaXRlX1g1MDlfUkVRX05FVygpIGZ1bmN0aW9ucyBhbmQgYSBjb21tYW5kIGxpbmUKICAgICBhcmd1bWVudCB0byAncmVxJy4gVGhpcyBpcyBub3QgYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgbmV3ZXIgb3IKICAgICBiZXR0ZXIgdGhhbiBvdGhlcnMgaXQganVzdCB1c2VzIHRoZSB3b3JrICdORVcnIGluIHRoZSBjZXJ0aWZpY2F0ZQogICAgIHJlcXVlc3QgaGVhZGVyIGxpbmVzLiBTb21lIHNvZnR3YXJlIG5lZWRzIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVvcmdhbmlzZSBwYXNzd29yZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzOiBub3cgcGFzc3dvcmRzIGNhbiBiZQogICAgIG9idGFpbmVkIGZyb20gdmFyaW91cyBzb3VyY2VzLiBEZWxldGUgdGhlIFBFTV9jYiBmdW5jdGlvbiBhbmQgbWFrZQogICAgIGl0IHRoZSBkZWZhdWx0IGJlaGF2aW91cjogaS5lLiBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTCBhbmQgdGhlCiAgICAgdXNyZGF0YSBhcmd1bWVudCBpcyBub3QgTlVMTCBpbnRlcnByZXQgaXQgYXMgYSBudWxsIHRlcm1pbmF0ZWQgcGFzcwogICAgIHBocmFzZS4gSWYgdXNyZGF0YSBhbmQgdGhlIGNhbGxiYWNrIGFyZSBOVUxMIHRoZW4gdGhlIHBhc3MgcGhyYXNlCiAgICAgaXMgcHJvbXB0ZWQgZm9yIGFzIHVzdWFsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgQ29tcGFxIEF0YWxsYSBjcnlwdG8gYWNjZWxlcmF0b3IuIElmIGl0IGlzIGluc3RhbGxlZCwKICAgICB0aGUgc3VwcG9ydCBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQuIFRoZSByZXN1bHRpbmcgYmluYXJpZXMgd2lsbAogICAgIGF1dG9kZXRlY3QgdGhlIGNhcmQgYW5kIHVzZSBpdCBpZiBwcmVzZW50LgogICAgIFtCZW4gTGF1cmllIGFuZCBDb21wYXEgSW5jLl0KCiAgKikgV29yayBhcm91bmQgZm9yIE5ldHNjYXBlIGhhbmcgYnVnLiBUaGlzIHNlbmRzIGNlcnRpZmljYXRlIHJlcXVlc3QKICAgICBhbmQgc2VydmVyIGRvbmUgaW4gb25lIHJlY29yZC4gU2luY2UgdGhpcyBpcyBwZXJmZWN0bHkgbGVnYWwgaW4gdGhlCiAgICAgU1NML1RMUyBwcm90b2NvbCBpdCBpc24ndCBhICJidWciIG9wdGlvbiBhbmQgaXMgb24gYnkgZGVmYXVsdC4gU2VlCiAgICAgdGhlIGJ1Z3MvU1NMdjMgZW50cnkgZm9yIG1vcmUgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIUC1VWCB0dW5lLXVwOiBuZXcgdW5pZmllZCBjb25maWdzLCBIUCBDIGNvbXBpbGVyIGJ1ZyB3b3JrYXJvdW5kLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgLXJhbmQgYXJndW1lbnQgdG8gc21pbWUgYW5kIHBrY3MxMiBhcHBsaWNhdGlvbnMgYW5kIHJlYWQvd3JpdGUKICAgICBvZiBzZWVkIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3ICdwYXNzd2QnIHRvb2wgZm9yIGNyeXB0KDMpIGFuZCBhcHIxIHBhc3N3b3JkIGhhc2hlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgY29tbWFuZCBsaW5lIHBhc3N3b3JkIG9wdGlvbnMgdG8gdGhlIHJlbWFpbmluZyBhcHBsaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnIGZpeCBmb3IgQk5fZGl2X3JlY3AoKSBmb3IgbnVtZXJhdG9ycyB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mCiAgICAgYml0cy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTW9yZSB0ZXN0cyBpbiBibnRlc3QuYywgYW5kIGNoYW5nZWQgdGVzdF9ibiBvdXRwdXQuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIC4vY29uZmlnIHJlY29nbml6ZXMgTWFjT1MgWCBub3cuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEJ1ZyBmaXggZm9yIEJOX2RpdigpIHdoZW4gdGhlIGZpcnN0IHdvcmRzIG9mIG51bSBhbmQgZGl2c29yIGFyZQogICAgIGVxdWFsIChpdCBnYXZlIHdyb25nIHJlc3VsdHMgaWYgKHJlbT0objEtcSpkMCkmQk5fTUFTSzIpIDwgZDApLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdmFyaW91cyBicm9rZW4gUEtDUyM4IGZvcm1hdHMsIGFuZCBjb21tYW5kIGxpbmUKICAgICBvcHRpb25zIHRvIHByb2R1Y2UgdGhlbS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIEJOX0NUWF9zdGFydCgpLCBCTl9DVFhfZ2V0KCkgYW5kIEJUX0NUWF9lbmQoKSB0bwogICAgIGdldCB0ZW1wb3JhcnkgQklHTlVNcyBmcm9tIGEgQk5fQ1RYLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDb3JyZWN0IHJldHVybiB2YWx1ZXMgaW4gQk5fbW9kX2V4cF9tb250KCkgYW5kIEJOX21vZF9leHAyX21vbnQoKQogICAgIGZvciBwID09IDAuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENoYW5nZSB0aGUgU1NMZWF5X2FkZF9hbGxfKigpIGZ1bmN0aW9ucyB0byBPcGVuU1NMX2FkZF9hbGxfKigpIGFuZAogICAgIGluY2x1ZGUgYSAjZGVmaW5lIGZyb20gdGhlIG9sZCBuYW1lIHRvIHRoZSBuZXcuIFRoZSBvcmlnaW5hbCBpbnRlbnQKICAgICB3YXMgdGhhdCBzdGF0aWNhbGx5IGxpbmtlZCBiaW5hcmllcyBjb3VsZCBmb3IgZXhhbXBsZSBqdXN0IGNhbGwKICAgICBTU0xlYXlfYWRkX2FsbF9jaXBoZXJzKCkgdG8ganVzdCBhZGQgY2lwaGVycyB0byB0aGUgdGFibGUgYW5kIG5vdAogICAgIGxpbmsgd2l0aCBkaWdlc3RzLiBUaGlzIG5ldmVyIHdvcmtlZCBiZWNhdXNlIFNTTGVheV9hZGRfYWxsX2RpZ2VzdHMoKQogICAgIGFuZCBTU0xlYXlfYWRkX2FsbF9jaXBoZXJzKCkgd2VyZSBpbiB0aGUgc2FtZSBzb3VyY2UgZmlsZSBzbyBjYWxsaW5nCiAgICAgb25lIHdvdWxkIGxpbmsgd2l0aCB0aGUgb3RoZXIuIFRoZXkgYXJlIG5vdyBpbiBzZXBhcmF0ZSBzb3VyY2UgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IC1ub3RleHQgb3B0aW9uIHRvICdjYScgYW5kIGEgLXB1YmtleSBvcHRpb24gdG8gJ3Nwa2FjJy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVc2UgYSBsZXNzIHVudXN1YWwgZm9ybSBvZiB0aGUgTWlsbGVyLVJhYmluIHByaW1hbGl0eSB0ZXN0IChpdCB1c2VkCiAgICAgYSBiaW5hcnkgYWxnb3JpdGhtIGZvciBleHBvbmVudGlhdGlvbiBpbnRlZ3JhdGVkIGludG8gdGhlIE1pbGxlci1SYWJpbgogICAgIGxvb3AsIG91ciBzdGFuZGFyZCBtb2RleHAgYWxnb3JpdGhtcyBhcmUgZmFzdGVyKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdXBwb3J0IGZvciB0aGUgRUJDRElDIGNoYXJhY3RlciBzZXQgY29tcGxldGVkLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoLlNOSS5EZT5dCgogICopIFNvdXJjZSBjb2RlIGNsZWFudXBzOiB1c2UgY29uc3Qgd2hlcmUgYXBwcm9wcmlhdGUsIGVsaW1pbmF0ZSBjYXN0cywKICAgICB1c2Ugdm9pZCAqIGluc3RlYWQgb2YgY2hhciAqIGluIGxoYXNoLgogICAgIFtVbGYgTfZsbGVyXSAKCiAgKikgQnVnZml4OiBzc2wzX3NlbmRfc2VydmVyX2tleV9leGNoYW5nZSB3YXMgbm90IHJlc3RhcnRhYmxlCiAgICAgKHRoZSBzdGF0ZSB3YXMgbm90IGNoYW5nZWQgdG8gU1NMM19TVF9TV19LRVlfRVhDSF9CLCBhbmQgYmVjYXVzZSBvZgogICAgIHRoaXMgdGhlIHNlcnZlciBjb3VsZCBvdmVyd3JpdGUgZXBoZW1lcmFsIGtleXMgdGhhdCB0aGUgY2xpZW50CiAgICAgaGFzIGFscmVhZHkgc2VlbikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVHVybiBEU0FfaXNfcHJpbWUgaW50byBhIG1hY3JvIHRoYXQgY2FsbHMgQk5faXNfcHJpbWUsCiAgICAgdXNpbmcgNTAgaXRlcmF0aW9ucyBvZiB0aGUgUmFiaW4tTWlsbGVyIHRlc3QuCgogICAgIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIG5vdyB1c2VzIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0ICh3aXRoIDUwCiAgICAgaXRlcmF0aW9ucyBvZiB0aGUgUmFiaW4tTWlsbGVyIHRlc3QgYXMgcmVxdWlyZWQgYnkgdGhlIGFwcGVuZGl4CiAgICAgdG8gRklQUyBQVUIgMTg2Wy0xXSkgaW5zdGVhZCBvZiBEU0FfaXNfcHJpbWUuCiAgICAgQXMgQk5faXNfcHJpbWVfZmFzdHRlc3QgaW5jbHVkZXMgdHJpYWwgZGl2aXNpb24sIERTQSBwYXJhbWV0ZXIKICAgICBnZW5lcmF0aW9uIGJlY29tZXMgbXVjaCBmYXN0ZXIuCgogICAgIFRoaXMgaW1wbGllcyBhIGNoYW5nZSBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbiBEU0FfaXNfcHJpbWUKICAgICBhbmQgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnM6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZQogICAgIGZvciBlYWNoIHBvc2l0aXZlIHdpdG5lc3MgaW4gdGhlIFJhYmluLU1pbGxlciB0ZXN0LCBub3QganVzdAogICAgIG9jY2FzaW9uYWxseSBpbiB0aGUgaW5uZXIgbG9vcDsgYW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZQogICAgIGNhbGxiYWNrIGZ1bmN0aW9uIG5vdyBwcm92aWRlIGFuIGl0ZXJhdGlvbiBjb3VudCBmb3IgdGhlIG91dGVyCiAgICAgbG9vcCByYXRoZXIgdGhhbiBmb3IgdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBvZiB0aGUgaW5uZXIgbG9vcC4KICAgICBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBhZGRpdGlvbmFsbHkgY2FuIGNhbGwgdGhlIGNhbGxiYWNrCiAgICAgZnVuY3Rpb24gd2l0aCBhbiAnaXRlcmF0aW9uIGNvdW50JyBvZiAtMSwgbWVhbmluZyB0aGF0IGEKICAgICBjYW5kaWRhdGUgaGFzIHBhc3NlZCB0aGUgdHJpYWwgZGl2aXNpb24gdGVzdCAod2hlbiBxIGlzIGdlbmVyYXRlZCAKICAgICBmcm9tIGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIHNlZWQsIHRyaWFsIGRpdmlzaW9uIGlzIHNraXBwZWQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBCTl9pc19wcmltZV9mYXN0dGVzdCB0aGF0IG9wdGlvbmFsbHkgZG9lcyB0cmlhbAogICAgIGRpdmlzaW9uIGJlZm9yZSBzdGFydGluZyB0aGUgUmFiaW4tTWlsbGVyIHRlc3QgYW5kIGhhcwogICAgIGFuIGFkZGl0aW9uYWwgQk5fQ1RYICogYXJndW1lbnQgKHdoZXJlYXMgQk5faXNfcHJpbWUgYWx3YXlzCiAgICAgaGFzIHRvIGFsbG9jYXRlIGF0IGxlYXN0IG9uZSBCTl9DVFgpLgogICAgICdjYWxsYmFjaygxLCAtMSwgY2JfYXJnKScgaXMgY2FsbGVkIHdoZW4gYSBudW1iZXIgaGFzIHBhc3NlZCB0aGUKICAgICB0cmlhbCBkaXZpc2lvbiBzdGFnZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIGJ1ZyBpbiBDUkwgZW5jb2RpbmcuIFRoZSB2YWxpZGl0eSBkYXRlcyB3ZXJlbid0IGJlaW5nIGhhbmRsZWQKICAgICBhcyBBU04xX1RJTUUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1wa2NzMTIgb3B0aW9uIHRvIENBLnBsIHNjcmlwdCB0byB3cml0ZSBvdXQgYSBQS0NTIzEyIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX3BzZXVkb19yYW5kKCkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENsZWFuIHVwIEJOX21vZF9tdWxfbW9udGdvbWVyeSgpOiByZXBsYWNlIHRoZSBicm9rZW4gKGFuZCB1bnJlYWRhYmxlKQogICAgIGJpZ251bSB2ZXJzaW9uIG9mIEJOX2Zyb21fbW9udGdvbWVyeSgpIHdpdGggdGhlIHdvcmtpbmcgY29kZSBmcm9tCiAgICAgU1NMZWF5IDAuOS4wICh0aGUgd29yZCBiYXNlZCB2ZXJzaW9uIGlzIGZhc3RlciBhbnl3YXkpLCBhbmQgY2xlYW4gdXAKICAgICB0aGUgY29tbWVudHMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEF2b2lkIGEgcmFjZSBjb25kaXRpb24gaW4gczJfY2xudC5jIChmdW5jdGlvbiBnZXRfc2VydmVyX2hlbGxvKSB0aGF0CiAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHVzZSB0aGUgc2FtZSBTU0xfU0VTU0lPTiBkYXRhIHN0cnVjdHVyZSBpbgogICAgIFNTTDIgY2xpZW50cyBpbiBtdWx0aXBsZSB0aHJlYWRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRoZSByZXR1cm4gdmFsdWUgb2YgUkFORF9sb2FkX2ZpbGUoKSBubyBsb25nZXIgY291bnRzIGJ5dGVzIG9idGFpbmVkCiAgICAgYnkgc3RhdCgpLiAgUkFORF9sb2FkX2ZpbGUoLi4uLCAtMSkgaXMgbmV3IGFuZCB1c2VzIHRoZSBjb21wbGV0ZSBmaWxlCiAgICAgdG8gc2VlZCB0aGUgUFJORyAocHJldmlvdXNseSBhbiBleHBsaWNpdCBieXRlIGNvdW50IHdhcyByZXF1aXJlZCkuCiAgICAgW1VsZiBN9mxsZXIsIEJvZG8gTfZsbGVyXQoKICAqKSBDbGVhbiB1cCBDUllQVE9fRVhfREFUQSBmdW5jdGlvbnMsIHNvbWUgb2YgdGhlc2UgZGlkbid0IGhhdmUgcHJvdG90eXBlcwogICAgIHVzZWQgKGNoYXIgKikgaW5zdGVhZCBvZiAodm9pZCAqKSBhbmQgaGFkIGNhc3RzIGFsbCBvdmVyIHRoZSBwbGFjZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIEJOX2dlbmVyYXRlX3ByaW1lKCkgcmV0dXJuIE5VTEwgb24gZXJyb3IgaWYgcmV0IT1OVUxMLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBSZXRhaW4gc291cmNlIGNvZGUgY29tcGF0aWJpbGl0eSBmb3IgQk5fcHJpbWVfY2hlY2tzIG1hY3JvOgogICAgIEJOX2lzX3ByaW1lKC4uLiwgQk5fcHJpbWVfY2hlY2tzLCAuLi4pIG5vdyB1c2VzCiAgICAgQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mCiAgICAgUmFiaW4tTWlsbGVyIGl0ZXJhdGlvbnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIERpZmZpZS1IZWxsbWFuIHVzZXMgInNhZmUiIHByaW1lczogREhfY2hlY2soKSByZXR1cm4gY29kZSByZW5hbWVkIHRvCiAgICAgREhfQ0hFQ0tfUF9OT1RfU0FGRV9QUklNRS4KICAgICAoQ2hlY2sgaWYgdGhpcyBpcyB0cnVlPyBPcGVuUEdQIGNhbGxzIHRoZW0gInN0cm9uZyIuKQogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBNZXJnZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiAiZGgiIGFuZCAiZ2VuZGgiIHByb2dyYW1zIGludG8gYSBuZXcgcHJvZ3JhbQogICAgICJkaHBhcmFtIi4gVGhlIG9sZCBwcm9ncmFtcyBhcmUgcmV0YWluZWQgZm9yIG5vdyBidXQgd2lsbCBoYW5kbGUgREgga2V5cwogICAgIChpbnN0ZWFkIG9mIHBhcmFtZXRlcnMpIGluIGZ1dHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHRoZSBjaXBoZXJzLCBzX3NlcnZlciBhbmQgc19jbGllbnQgcHJvZ3JhbXMgY2hlY2sgdGhlIHJldHVybiB2YWx1ZXMKICAgICB3aGVuIGEgbmV3IGNpcGhlciBsaXN0IGlzIHNldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIHRoZSBTU0wvVExTIGNpcGhlciBtZWNoYW5pc20gdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgVExTIDU2Yml0CiAgICAgY2lwaGVycy4gQmVmb3JlIHdoZW4gdGhlIDU2Yml0IGNpcGhlcnMgd2VyZSBlbmFibGVkIHRoZSBzb3J0aW5nIHdhcwogICAgIHdyb25nLgoKICAgICBUaGUgc3ludGF4IGZvciB0aGUgY2lwaGVyIHNvcnRpbmcgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBzb3J0aW5nIGJ5CiAgICAgY2lwaGVyLXN0cmVuZ3RoICh1c2luZyB0aGUgc3RyZW5ndGhfYml0cyBoYXJkIGNvZGVkIGluIHRoZSB0YWJsZXMpLgogICAgIFRoZSBuZXcgY29tbWFuZCBpcyAiQFNUUkVOR1RIIiAoc2VlIGFsc28gZG9jL2FwcHMvY2lwaGVycy5wb2QpLgoKICAgICBGaXggYSBidWcgaW4gdGhlIGNpcGhlci1jb21tYW5kIHBhcnNlcjogd2hlbiBzdXBwbHlpbmcgYSBjaXBoZXIgY29tbWFuZAogICAgIHN0cmluZyB3aXRoIGFuICJ1bmRlZmluZWQiIHN5bWJvbCAobmVpdGhlciBjb21tYW5kIG5vciBhbHBoYW51bWVyaWMKICAgICBbQS1aYS16MC05XSwgc3NsX3NldF9jaXBoZXJfbGlzdCB1c2VkIHRvIGhhbmcgaW4gYW4gZW5kbGVzcyBsb29wLiBOb3cKICAgICBhbiBlcnJvciBpcyBmbGFnZ2VkLgoKICAgICBEdWUgdG8gdGhlIHN0cmVuZ3RoLXNvcnRpbmcgZXh0ZW5zaW9uLCB0aGUgY29kZSBvZiB0aGUKICAgICBzc2xfY3JlYXRlX2NpcGhlcl9saXN0KCkgZnVuY3Rpb24gd2FzIGNvbXBsZXRlbHkgcmVhcnJhbmdlZC4gSSBob3BlIHRoYXQKICAgICB0aGUgcmVhZGFiaWxpdHkgd2FzIGFsc28gaW5jcmVhc2VkIDotKQogICAgIFtMdXR6IEphZW5pY2tlIDxMdXR6LkphZW5pY2tlQGFldC5UVS1Db3R0YnVzLkRFPl0KCiAgKikgTWlub3IgY2hhbmdlIHRvICd4NTA5JyB1dGlsaXR5LiBUaGUgLUNBY3JlYXRlc2VyaWFsIG9wdGlvbiBub3cgdXNlcyAxCiAgICAgZm9yIHRoZSBmaXJzdCBzZXJpYWwgbnVtYmVyIGFuZCBwbGFjZXMgMiBpbiB0aGUgc2VyaWFsIG51bWJlciBmaWxlLiBUaGlzCiAgICAgYXZvaWRzIHByb2JsZW1zIHdoZW4gdGhlIHJvb3QgQ0EgaXMgY3JlYXRlZCB3aXRoIHNlcmlhbCBudW1iZXIgemVybyBhbmQKICAgICB0aGUgZmlyc3QgdXNlciBjZXJ0aWZpY2F0ZSBoYXMgdGhlIHNhbWUgaXNzdWVyIG5hbWUgYW5kIHNlcmlhbCBudW1iZXIKICAgICBhcyB0aGUgcm9vdCBDQS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBYNTA5X0FUVFJJQlVURSB1dGlsaXRpZXMsIGNoYW5nZSB0aGUgJ3JlcScgcHJvZ3JhbSBzbyBpdCB1c2VzCiAgICAgdGhlIG5ldyBjb2RlLiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHVmZi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VzIHRvIFg1MDlfQVRUUklCVVRFIHV0aWxpdGllcy4gVGhlc2UgaGF2ZSBiZWVuIHJlbmFtZWQgZnJvbQogICAgIFg1MDlfKigpIHRvIFg1MDlhdF8qKCkgb24gdGhlIGdyb3VuZHMgdGhhdCB0aGV5IGRvbid0IGhhbmRsZSBYNTA5CiAgICAgc3RydWN0dXJlcyBhbmQgYmVoYXZlIGluIGFuIGFuYWxvZ291cyB3YXkgdG8gdGhlIFg1MDl2MyBmdW5jdGlvbnM6CiAgICAgdGhleSBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ1dCB3cmFwcGVyIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZAogICAgIGluc3RlYWQuCgogICAgIFNvIHdlIGFsc28gbm93IGhhdmUgc29tZSB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IGNhbGwgdGhlIFg1MDlhdCBmdW5jdGlvbnMKICAgICB3aGVuIHBhc3NlZCBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4gKFRPIERPOiBzaW1pbGFyIHRoaW5ncyBjYW4gYmUgZG9uZSB3aXRoCiAgICAgUEtDUyM3IHNpZ25lZCBhbmQgdW5zaWduZWQgYXR0cmlidXRlcywgUEtDUyMxMiBhdHRyaWJ1dGVzIGFuZCBhIGZldyBvdGhlcgogICAgIHRoaW5ncy4gU29tZSBvZiB0aGVzZSBuZWVkIHNvbWUgZDJpIG9yIGkyZCBhbmQgcHJpbnQgZnVuY3Rpb25hbGl0eQogICAgIGJlY2F1c2UgdGhleSBoYW5kbGUgbW9yZSBjb21wbGV4IHN0cnVjdHVyZXMuKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBtaXNzaW5nICNpZm5kZWZzIHRoYXQgY2F1c2VkIG1pc3Npbmcgc3ltYm9scyB3aGVuIGJ1aWxkaW5nIGxpYnNzbAogICAgIGFzIGEgc2hhcmVkIGxpYnJhcnkgd2l0aG91dCBSU0EuICBVc2UgI2lmbmRlZiBOT19TU0wyIGluc3RlYWQgb2YKICAgICBOT19SU0EgaW4gc3NsL3MyKi5jLiAKICAgICBbS3JpcyBLZW5uYXdheSA8a3Jpc0BodWIuZnJlZWJzZC5vcmc+LCBtb2RpZmllZCBieSBVbGYgTfZsbGVyXQoKICAqKSBQcmVjYXV0aW9ucyBhZ2FpbnN0IHVzaW5nIHRoZSBQUk5HIHVuaW5pdGlhbGl6ZWQ6IFJBTkRfYnl0ZXMoKSBub3cKICAgICBoYXMgYSByZXR1cm4gdmFsdWUgd2hpY2ggaW5kaWNhdGVzIHRoZSBxdWFsaXR5IG9mIHRoZSByYW5kb20gZGF0YQogICAgICgxID0gb2ssIDAgPSBub3Qgc2VlZGVkKS4gIEFsc28gYW4gZXJyb3IgaXMgcmVjb3JkZWQgb24gdGhlIHRocmVhZCdzCiAgICAgZXJyb3IgcXVldWUuIE5ldyBmdW5jdGlvbiBSQU5EX3BzZXVkb19ieXRlcygpIGdlbmVyYXRlcyBvdXRwdXQgdGhhdCBpcwogICAgIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlIGJ1dCBub3QgdW5wcmVkaWN0YWJsZS4gUkFORF9hZGQgaXMgbGlrZQogICAgIFJBTkRfc2VlZCwgYnV0IHRha2VzIGFuIGV4dHJhIGFyZ3VtZW50IGZvciBhbiBlbnRyb3B5IGVzdGltYXRlCiAgICAgKFJBTkRfc2VlZCBhbHdheXMgYXNzdW1lcyBmdWxsIGVudHJvcHkpLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBEbyBtb3JlIGl0ZXJhdGlvbnMgb2YgUmFiaW4tTWlsbGVyIHByb2JhYmxlIHByaW1lIHRlc3QgKHNwZWNpZmljYWxseSwKICAgICAzIGZvciAxMDI0LWJpdCBwcmltZXMsIDYgZm9yIDUxMi1iaXQgcHJpbWVzLCAxMiBmb3IgMjU2LWJpdCBwcmltZXMKICAgICBpbnN0ZWFkIG9mIG9ubHkgMiBmb3IgYWxsIGxlbmd0aHM7IHNlZSBCTl9wcmltZV9jaGVja3NfZm9yX3NpemUgZGVmaW5pdGlvbgogICAgIGluIGNyeXB0by9ibi9ibl9wcmltZS5jIGZvciB0aGUgY29tcGxldGUgdGFibGUpLiAgVGhpcyBndWFyYW50ZWVzIGEKICAgICBmYWxzZS1wb3NpdGl2ZSByYXRlIG9mIGF0IG1vc3QgMl4tODAgZm9yIHJhbmRvbSBpbnB1dC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXdyaXRlIHNzbDNfcmVhZF9uIChzc2wvczNfcGt0LmMpIGF2b2lkaW5nIGEgY291cGxlIG9mIGJ1Z3MuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfQ1RYX3JnZXRfY2hhaW4oKSAocmVuYW1lZCB0byBYNTA5X0NUWF9nZXQxX2NoYWluCiAgICAgaW4gdGhlIDAuOS41IHJlbGVhc2UpLCB0aGlzIHJldHVybnMgdGhlIGNoYWluCiAgICAgZnJvbSBhbiBYNTA5X0NUWCBzdHJ1Y3R1cmUgd2l0aCBhIGR1cCBvZiB0aGUgc3RhY2sgYW5kIGFsbAogICAgIHRoZSBYNTA5IHJlZmVyZW5jZSBjb3VudHMgdXBwZWQ6IHNvIHRoZSBzdGFjayB3aWxsIGV4aXN0CiAgICAgYWZ0ZXIgWDUwOV9DVFhfY2xlYW51cCgpIGhhcyBiZWVuIGNhbGxlZC4gTW9kaWZ5IHBrY3MxMi5jCiAgICAgdG8gdXNlIHRoaXMuCgogICAgIEFsc28gbWFrZSBTU0xfU0VTU0lPTl9wcmludCgpIHByaW50IG91dCB0aGUgdmVyaWZ5IHJldHVybgogICAgIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG1hbnBhZ2UgZm9yIHRoZSBwa2NzMTIgY29tbWFuZC4gQWxzbyBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICBiZWhhdmlvdXIgc28gTUFDIGl0ZXJhdGlvbiBjb3VudHMgYXJlIHVzZWQgdW5sZXNzIHRoZSBuZXcKICAgICAtbm9tYWNpdGVyIG9wdGlvbiBpcyB1c2VkLiBUaGlzIGltcHJvdmVzIGZpbGUgc2VjdXJpdHkgYW5kCiAgICAgb25seSBvbGRlciB2ZXJzaW9ucyBvZiBNU0lFICg0LjAgZm9yIGV4YW1wbGUpIG5lZWQgaXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSG9ub3IgdGhlIG5vLXh4eCBDb25maWd1cmUgb3B0aW9ucyB3aGVuIGNyZWF0aW5nIC5ERUYgZmlsZXMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBQS0NTIzEwIGF0dHJpYnV0ZXMgdG8gZmllbGQgdGFibGU6IGNoYWxsZW5nZVBhc3N3b3JkLCAKICAgICB1bnN0cnVjdHVyZWROYW1lIGFuZCB1bnN0cnVjdHVyZWRBZGRyZXNzLiBUaGVzZSBhcmUgdGFrZW4gZnJvbQogICAgIGRyYWZ0IFBLQ1MjOSB2Mi4wIGJ1dCBhcmUgY29tcGF0aWJsZSB3aXRoIHYxLjIgcHJvdmlkZWQgbm8gCiAgICAgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXJzIGFyZSB1c2VkLgoKICAgICBNb3JlIGNoYW5nZXMgdG8gWDUwOV9BVFRSSUJVVEUgY29kZTogYWxsb3cgdGhlIHNldHRpbmcgb2YgdHlwZXMKICAgICBiYXNlZCBvbiBzdHJpbmdzLiBSZW1vdmUgdGhlICdsb2MnIHBhcmFtZXRlciB3aGVuIGFkZGluZwogICAgIGF0dHJpYnV0ZXMgYmVjYXVzZSB0aGVzZSB3aWxsIGJlIGEgU0VUIE9GIGVuY29kaW5nIHdoaWNoIGlzIHNvcnRlZAogICAgIGluIEFTTjEgb3JkZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBjaGFuZ2VzIHRvIHRoZSAncmVxJyB1dGlsaXR5IHRvIGFsbG93IHJlcXVlc3QgZ2VuZXJhdGlvbgogICAgIGF1dG9tYXRpb24uIFRoaXMgd2lsbCBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBqdXN0IGdlbmVyYXRlIGEgdGVtcGxhdGUKICAgICBmaWxlIGNvbnRhaW5pbmcgYWxsIHRoZSBmaWVsZCB2YWx1ZXMgYW5kIGhhdmUgcmVxIGNvbnN0cnVjdCB0aGUKICAgICByZXF1ZXN0LgoKICAgICBJbml0aWFsIHN1cHBvcnQgZm9yIFg1MDlfQVRUUklCVVRFIGhhbmRsaW5nLiBTdGFja3Mgb2YgdGhlc2UgYXJlCiAgICAgdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UgaW5jbHVkaW5nIGNlcnRpZmljYXRlIHJlcXVlc3RzIGFuZCBQS0NTIzcKICAgICBzdHJ1Y3R1cmVzLiBUaGV5IGFyZSBjdXJyZW50bHkgaGFuZGxlZCBtYW51YWxseSB3aGVyZSBuZWNlc3Nhcnkgd2l0aAogICAgIHNvbWUgcHJpbWl0aXZlIHdyYXBwZXJzIGZvciBQS0NTIzcuIFRoZSBuZXcgZnVuY3Rpb25zIGJlaGF2ZSBpbiBhCiAgICAgbWFubmVyIGFuYWxvZ291cyB0byB0aGUgWDUwOSBleHRlbnNpb24gZnVuY3Rpb25zOiB0aGV5IGFsbG93CiAgICAgYXR0cmlidXRlcyB0byBiZSBsb29rZWQgdXAgYnkgTklEIGFuZCBhZGRlZC4KCiAgICAgTGF0ZXIgc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhlIFg1MDlWMyBjb2RlIHdvdWxkIGJlIGRlc2lyYWJsZSB0bwogICAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHRoZSBlbmNvZGluZywgZGVjb2RpbmcgYW5kIHByaW50aW5nIG9mIHRoZQogICAgIG1vcmUgY29tcGxleCB0eXBlcy4gVGhlIHN0cmluZyB0eXBlcyBsaWtlIGNoYWxsZW5nZVBhc3N3b3JkIGNhbgogICAgIGJlIGhhbmRsZWQgYnkgdGhlIHN0cmluZyB0YWJsZSBmdW5jdGlvbnMuCgogICAgIEFsc28gbW9kaWZpZWQgdGhlIG11bHRpIGJ5dGUgc3RyaW5nIHRhYmxlIGhhbmRsaW5nLiBOb3cgdGhlcmUgaXMKICAgICBhICdnbG9iYWwgbWFzaycgd2hpY2ggbWFza3Mgb3V0IGNlcnRhaW4gdHlwZXMuIFRoZSB0YWJsZSBpdHNlbGYKICAgICBjYW4gdXNlIHRoZSBmbGFnIFNUQUJMRV9OT19NQVNLIHRvIGlnbm9yZSB0aGUgbWFzayBzZXR0aW5nOiB0aGlzCiAgICAgaXMgdXNlZnVsIHdoZW4gZm9yIGV4YW1wbGUgdGhlcmUgaXMgb25seSBvbmUgcGVybWlzc2libGUgdHlwZQogICAgIChhcyBpbiBjb3VudHJ5TmFtZSkgYW5kIHVzaW5nIHRoZSBtYXNrIG1pZ2h0IHJlc3VsdCBpbiBubyB2YWxpZAogICAgIHR5cGVzIGF0IGFsbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbiB1cCAnRmluaXNoZWQnIGhhbmRsaW5nLCBhbmQgYWRkIGZ1bmN0aW9ucyBTU0xfZ2V0X2ZpbmlzaGVkIGFuZAogICAgIFNTTF9nZXRfcGVlcl9maW5pc2hlZCB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gb2J0YWluIHRoZSBsYXRlc3QKICAgICBGaW5pc2hlZCBtZXNzYWdlcyBzZW50IHRvIHRoZSBwZWVyIG9yIGV4cGVjdGVkIGZyb20gdGhlIHBlZXIsCiAgICAgcmVzcGVjdGl2ZWx5LiAgKFNTTF9nZXRfcGVlcl9maW5pc2hlZCBpcyB1c3VhbGx5IHRoZSBGaW5pc2hlZCBtZXNzYWdlCiAgICAgYWN0dWFsbHkgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlciwgb3RoZXJ3aXNlIHRoZSBwcm90b2NvbCB3aWxsIGJlIGFib3J0ZWQuKQoKICAgICBBcyB0aGUgRmluaXNoZWQgbWVzc2FnZSBhcmUgbWVzc2FnZSBkaWdlc3RzIG9mIHRoZSBjb21wbGV0ZSBoYW5kc2hha2UKICAgICAod2l0aCBhIHRvdGFsIG9mIDE5MiBiaXRzIGZvciBUTFMgMS4wIGFuZCBtb3JlIGZvciBTU0wgMy4wKSwgdGhleSBjYW4KICAgICBiZSB1c2VkIGZvciBleHRlcm5hbCBhdXRoZW50aWNhdGlvbiBwcm9jZWR1cmVzIHdoZW4gdGhlIGF1dGhlbnRpY2F0aW9uCiAgICAgcHJvdmlkZWQgYnkgU1NML1RMUyBpcyBub3QgZGVzaXJlZCBvciBpcyBub3QgZW5vdWdoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEVuaGFuY2VkIHN1cHBvcnQgZm9yIEFscGhhIExpbnV4IGlzIGFkZGVkLiBOb3cgLi9jb25maWcgY2hlY2tzIGlmCiAgICAgdGhlIGhvc3Qgc3VwcG9ydHMgQldYIGV4dGVuc2lvbiBhbmQgaWYgQ29tcGFxIEMgaXMgcHJlc2VudCBvbiB0aGUKICAgICAkUEFUSC4gSnVzdCBleHBsb2l0aW5nIG9mIHRoZSBCV1ggZXh0ZW5zaW9uIHJlc3VsdHMgaW4gMjAtMzAlCiAgICAgcGVyZm9ybWFuY2Uga2ljayBmb3Igc29tZSBhbGdvcml0aG1zLCBlLmcuIERFUyBhbmQgUkM0IHRvIG1lbnRpb24KICAgICBhIGNvdXBsZS4gQ29tcGFxIEMgaW4gdHVybiBnZW5lcmF0ZXMgfjIwJSBmYXN0ZXIgY29kZSBmb3IgTUQ1IGFuZAogICAgIFNIQTEuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBzdXBwb3J0IGZvciBNUyAiZmFzdCBTR0MiLiBUaGlzIGlzIGFyZ3VhYmx5IGEgdmlvbGF0aW9uIG9mIHRoZQogICAgIFNTTDMvVExTIHByb3RvY29sLiBOZXRzY2FwZSBTR0MgZG9lcyB0d28gaGFuZHNoYWtlczogdGhlIGZpcnN0IHdpdGgKICAgICB3ZWFrIGNyeXB0byBhbmQgYWZ0ZXIgY2hlY2tpbmcgdGhlIGNlcnRpZmljYXRlIGlzIFNHQyBhIHNlY29uZCBvbmUKICAgICB3aXRoIHN0cm9uZyBjcnlwdG8uIE1TIFNHQyBzdG9wcyB0aGUgZmlyc3QgaGFuZHNoYWtlIGFmdGVyIHJlY2VpdmluZwogICAgIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgbWVzc2FnZSBhbmQgc2VuZHMgYSBzZWNvbmQgY2xpZW50IGhlbGxvLiBTaW5jZQogICAgIGEgc2VydmVyIHdpbGwgdHlwaWNhbGx5IGRvIGFsbCB0aGUgdGltZSBjb25zdW1pbmcgb3BlcmF0aW9ucyBiZWZvcmUKICAgICBleHBlY3RpbmcgYW55IGZ1cnRoZXIgbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50IChzZXJ2ZXIga2V5IGV4Y2hhbmdlCiAgICAgaXMgdGhlIG1vc3QgZXhwZW5zaXZlKSB0aGVyZSBpcyBsaXR0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28uCgogICAgIFRvIGdldCBPcGVuU1NMIHRvIHN1cHBvcnQgTVMgU0dDIHdlIGhhdmUgdG8gcGVybWl0IGEgc2Vjb25kIGNsaWVudAogICAgIGhlbGxvIG1lc3NhZ2UgYWZ0ZXIgd2UgaGF2ZSBzZW50IHNlcnZlciBkb25lLiBJbiBhZGRpdGlvbiB3ZSBoYXZlIHRvCiAgICAgcmVzZXQgdGhlIE1BQyBpZiB3ZSBkbyBnZXQgdGhpcyBzZWNvbmQgY2xpZW50IGhlbGxvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGZ1bmN0aW9uICdkMmlfQXV0b1ByaXZhdGVLZXkoKScgdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZGVjaWRlCiAgICAgaWYgYSBERVIgZW5jb2RlZCBwcml2YXRlIGtleSBpcyBSU0Egb3IgRFNBIHRyYWRpdGlvbmFsIGZvcm1hdC4gQ2hhbmdlZAogICAgIGQyaV9Qcml2YXRlS2V5X2JpbygpIHRvIHVzZSBpdC4gVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlICJ0cmFkaXRpb25hbCIKICAgICBmb3JtYXQgREVSIGVuY29kZWQgcHJpdmF0ZSBrZXkuIE5ld2VyIGNvZGUgc2hvdWxkIHVzZSBQS0NTIzggZm9ybWF0IHdoaWNoCiAgICAgaGFzIHRoZSBrZXkgdHlwZSBlbmNvZGVkIGluIHRoZSBBU04xIHN0cnVjdHVyZS4gQWRkZWQgREVSIHByaXZhdGUga2V5CiAgICAgc3VwcG9ydCB0byBwa2NzOCBhcHBsaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTU0wgMy9UTFMgMSBzZXJ2ZXJzIG5vdyBkb24ndCByZXF1ZXN0IGNlcnRpZmljYXRlcyB3aGVuIGFuIGFub255bW91cwogICAgIGNpcGhlcnN1aXRlcyBoYXMgYmVlbiBzZWxlY3RlZCAoYXMgcmVxdWlyZWQgYnkgdGhlIFNTTCAzL1RMUyAxCiAgICAgc3BlY2lmaWNhdGlvbnMpLiAgRXhjZXB0aW9uOiBXaGVuIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQKICAgICBpcyBzZXQsIHdlIGludGVycHJldCB0aGlzIGFzIGEgcmVxdWVzdCB0byB2aW9sYXRlIHRoZSBzcGVjaWZpY2F0aW9uCiAgICAgKHRoZSB3b3JzdCB0aGF0IGNhbiBoYXBwZW4gaXMgYSBoYW5kc2hha2UgZmFpbHVyZSwgYW5kICdjb3JyZWN0JwogICAgIGJlaGF2aW91ciB3b3VsZCByZXN1bHQgaW4gYSBoYW5kc2hha2UgZmFpbHVyZSBhbnl3YXkpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIFNTTF9DVFhfYWRkX3Nlc3Npb24sIHRha2UgaW50byBhY2NvdW50IHRoYXQgdGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUKICAgICBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmVzIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBJRCAoZS5nLiB3aGVuIHR3byB0aHJlYWRzCiAgICAgY29uY3VycmVudGx5IG9idGFpbiB0aGVtIGZyb20gYW4gZXh0ZXJuYWwgY2FjaGUpLgogICAgIFRoZSBpbnRlcm5hbCBjYWNoZSBjYW4gaGFuZGxlIG9ubHkgb25lIFNTTF9TRVNTSU9OIHdpdGggYSBnaXZlbiBJRCwKICAgICBzbyBpZiB0aGVyZSdzIGEgY29uZmxpY3QsIHdlIG5vdyB0aHJvdyBvdXQgdGhlIG9sZCBvbmUgdG8gYWNoaWV2ZQogICAgIGNvbnNpc3RlbmN5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBPSURzIGZvciBpZGVhIGFuZCBibG93ZmlzaCBpbiBDQkMgbW9kZS4gVGhpcyB3aWxsIGFsbG93IGJvdGgKICAgICB0byBiZSB1c2VkIGluIFBLQ1MjNSB2Mi4wIGFuZCBTL01JTUUuICBBbHNvIGFkZCBjaGVja2luZyB0bwogICAgIHNvbWUgcm91dGluZXMgdGhhdCB1c2UgY2lwaGVyIE9JRHM6IHNvbWUgY2lwaGVycyBkbyBub3QgaGF2ZSBPSURzCiAgICAgZGVmaW5lZCBhbmQgc28gdGhleSBjYW5ub3QgYmUgdXNlZCBmb3IgUy9NSU1FIGFuZCBQS0NTIzUgdjIuMCBmb3IKICAgICBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNpbXBsaWZ5IHRoZSB0cnVzdCBzZXR0aW5nIHN0cnVjdHVyZSBhbmQgY29kZS4gTm93IHdlIGp1c3QgaGF2ZQogICAgIHR3byBzZXF1ZW5jZXMgb2YgT0lEcyBmb3IgdHJ1c3RlZCBhbmQgcmVqZWN0ZWQgc2V0dGluZ3MuIFRoZXNlIHdpbGwKICAgICB0eXBpY2FsbHkgaGF2ZSB2YWx1ZXMgdGhlIHNhbWUgYXMgdGhlIGV4dGVuZGVkIGtleSB1c2FnZSBleHRlbnNpb24KICAgICBhbmQgYW55IGFwcGxpY2F0aW9uIHNwZWNpZmljIHB1cnBvc2VzLgoKICAgICBUaGUgdHJ1c3QgY2hlY2tpbmcgY29kZSBub3cgaGFzIGEgZGVmYXVsdCBiZWhhdmlvdXI6IGl0IHdpbGwganVzdAogICAgIGNoZWNrIGZvciBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBOSUQgYXMgdGhlIHBhc3NlZCBpZC4gRnVuY3Rpb25zIGNhbgogICAgIGJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIGVpdGhlciB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb3IgdGhlIGJlaGF2aW91cgogICAgIGZvciBhIGdpdmVuIGlkLiBTU0wgY2xpZW50LCBzZXJ2ZXIgYW5kIGVtYWlsIGFscmVhZHkgaGF2ZSBmdW5jdGlvbnMKICAgICBpbiBwbGFjZSBmb3IgY29tcGF0aWJpbGl0eTogdGhleSBjaGVjayB0aGUgTklEIGFuZCBhbHNvIHJldHVybiAidHJ1c3RlZCIKICAgICBpZiB0aGUgY2VydGlmaWNhdGUgaXMgc2VsZiBzaWduZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGQyaSxpMmQgYmlvL2ZwIGZ1bmN0aW9ucyBmb3IgUHJpdmF0ZUtleTogdGhlc2UgY29udmVydCB0aGUKICAgICB0cmFkaXRpb25hbCBmb3JtYXQgaW50byBhbiBFVlBfUEtFWSBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgcGFzc3dvcmQgY2FsbGJhY2sgZnVuY3Rpb24gUEVNX2NiKCkgd2hpY2ggZWl0aGVyIHByb21wdHMgZm9yCiAgICAgYSBwYXNzd29yZCBpZiB1c3JfZGF0YSBpcyBOVUxMIG9yIG90aGVyd2lzZSBhc3N1bWVzIGl0IGlzIGEgbnVsbAogICAgIHRlcm1pbmF0ZWQgcGFzc3dvcmQuIEFsbG93IHBhc3N3b3JkcyB0byBiZSBwYXNzZWQgb24gY29tbWFuZCBsaW5lCiAgICAgZW52aXJvbm1lbnQgb3IgY29uZmlnIGZpbGVzIGluIGEgZmV3IG1vcmUgdXRpbGl0aWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGJ1bmNoIG9mIERFUiBhbmQgUEVNIGZ1bmN0aW9ucyB0byBoYW5kbGUgUEtDUyM4IGZvcm1hdCBwcml2YXRlCiAgICAga2V5cy4gQWRkIHNvbWUgc2hvcnQgbmFtZXMgZm9yIFBLQ1MjOCBQQkUgYWxnb3JpdGhtcyBhbmQgYWxsb3cgdGhlbQogICAgIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIGZvciB0aGUgcGtjczggYW5kIHBrY3MxMiB1dGlsaXRpZXMuCiAgICAgVXBkYXRlIGRvY3VtZW50YXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgQVNOMSAiTlVMTCIgdHlwZS4gVGhpcyBjb3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBieSB1c2luZwogICAgIEFTTjFfVFlQRSBidXQgdGhlcmUgd2Fzbid0IGFueSBmdW5jdGlvbiB0aGF0IHdvdWxkIHRyeSB0byByZWFkIGEgTlVMTAogICAgIGFuZCBwcm9kdWNlIGFuIGVycm9yIGlmIGl0IGNvdWxkbid0LiBGb3IgY29tcGF0aWJpbGl0eSB3ZSBhbHNvIGhhdmUKICAgICBBU04xX05VTExfbmV3KCkgYW5kIEFTTjFfTlVMTF9mcmVlKCkgZnVuY3Rpb25zIGJ1dCB0aGVzZSBhcmUgZmFrZWQgYW5kCiAgICAgZG9uJ3QgYWxsb2NhdGUgYW55dGhpbmcgYmVjYXVzZSB0aGV5IGRvbid0IG5lZWQgdG8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBNYWNPUyBpcyBub3cgcHJvdmlkZWQuIEV4YW1pbmUgSU5TVEFMTC5NYWNPUwogICAgIGZvciBkZXRhaWxzLgogICAgIFtBbmR5IFBvbHlha292LCBSb3kgV29vZHMgPHJveUBjZW50aWNzeXN0ZW1zLmNhPl0KCiAgKikgUmVidWlsZCBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgdXNlZCBieSBPcGVuU1NMIGNvZGUgYW5kCiAgICAgcG9zc2libHkgb3RoZXJzIGFzIHdlbGwuICBUaGUgcHVycG9zZSBpcyB0byBtYWtlIGFuIGludGVyZmFjZSB0aGF0CiAgICAgcHJvdmlkZSBob29rcyBzbyBhbnlvbmUgY2FuIGJ1aWxkIGEgc2VwYXJhdGUgc2V0IG9mIGFsbG9jYXRpb24gYW5kCiAgICAgZGVhbGxvY2F0aW9uIHJvdXRpbmVzIHRvIGJlIHVzZWQgYnkgT3BlblNTTCwgZm9yIGV4YW1wbGUgbWVtb3J5CiAgICAgcG9vbCBpbXBsZW1lbnRhdGlvbnMsIG9yIHNvbWV0aGluZyBlbHNlLCB3aGljaCB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgc2luY2UgTWFsbG9jKCksIFJlYWxsb2MoKSBhbmQgRnJlZSgpIHdlcmUgZGVmaW5lZCBhcyBtYWNyb3MgaGF2aW5nCiAgICAgdGhlIHZhbHVlcyBtYWxsb2MsIHJlYWxsb2MgYW5kIGZyZWUsIHJlc3BlY3RpdmVseSAoZXhjZXB0IGZvciBXaW4zMgogICAgIGNvbXBpbGF0aW9ucykuICBUaGUgc2FtZSBpcyBwcm92aWRlZCBmb3IgbWVtb3J5IGRlYnVnZ2luZyBjb2RlLgogICAgIE9wZW5TU0wgYWxyZWFkeSBjb21lcyB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gZmluZCBtZW1vcnkgbGVha3MsIGJ1dAogICAgIHRoaXMgZ2l2ZXMgcGVvcGxlIGEgY2hhbmNlIHRvIGRlYnVnIG90aGVyIG1lbW9yeSBwcm9ibGVtcy4KCiAgICAgV2l0aCB0aGVzZSBjaGFuZ2VzLCBhIG5ldyBzZXQgb2YgZnVuY3Rpb25zIGFuZCBtYWNyb3MgaGF2ZSBhcHBlYXJlZDoKCiAgICAgICBDUllQVE9fc2V0X21lbV9kZWJ1Z19mdW5jdGlvbnMoKQkgICAgICAgIFtGXQogICAgICAgQ1JZUFRPX2dldF9tZW1fZGVidWdfZnVuY3Rpb25zKCkgICAgICAgICBbRl0KICAgICAgIENSWVBUT19kYmdfc2V0X29wdGlvbnMoKQkgICAgICAgICAgICAgICAgW0ZdCiAgICAgICBDUllQVE9fZGJnX2dldF9vcHRpb25zKCkgICAgICAgICAgICAgICAgIFtGXQogICAgICAgQ1JZUFRPX21hbGxvY19kZWJ1Z19pbml0KCkgICAgICAgICAgICAgICBbTV0KCiAgICAgVGhlIG1lbW9yeSBkZWJ1ZyBmdW5jdGlvbnMgYXJlIE5VTEwgYnkgZGVmYXVsdCwgdW5sZXNzIHRoZSBsaWJyYXJ5CiAgICAgaXMgY29tcGlsZWQgd2l0aCBDUllQVE9fTURFQlVHIG9yIGZyaWVuZHMgaXMgZGVmaW5lZC4gIElmIHNvbWVvbmUKICAgICB3YW50cyB0byBkZWJ1ZyBtZW1vcnkgYW55d2F5LCBDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKSAod2hpY2gKICAgICBnaXZlcyB0aGUgc3RhbmRhcmQgZGVidWdnaW5nIGZ1bmN0aW9ucyB0aGF0IGNvbWUgd2l0aCBPcGVuU1NMKSBvcgogICAgIENSWVBUT19zZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucygpICh0ZWxscyBPcGVuU1NMIHRvIHVzZSBmdW5jdGlvbnMKICAgICBwcm92aWRlZCBieSB0aGUgbGlicmFyeSB1c2VyKSBtdXN0IGJlIHVzZWQuICBXaGVuIHRoZSBzdGFuZGFyZAogICAgIGRlYnVnZ2luZyBmdW5jdGlvbnMgYXJlIHVzZWQsIENSWVBUT19kYmdfc2V0X29wdGlvbnMgY2FuIGJlIHVzZWQgdG8KICAgICByZXF1ZXN0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb246CiAgICAgQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucyhWX0NZUlBUT19NREVCVUdfeHh4KSBjb3JyZXNwb25kcyB0byBzZXR0aW5nCiAgICAgdGhlIENSWVBUT19NREVCVUdfeHh4IG1hY3JvIHdoZW4gY29tcGlsaW5nIHRoZSBsaWJyYXJ5LiAgIAoKICAgICBBbHNvLCB0aGluZ3MgbGlrZSBDUllQVE9fc2V0X21lbV9mdW5jdGlvbnMgd2lsbCBhbHdheXMgZ2l2ZSB0aGUKICAgICBleHBlY3RlZCByZXN1bHQgKHRoZSBuZXcgc2V0IG9mIGZ1bmN0aW9ucyBpcyB1c2VkIGZvciBhbGxvY2F0aW9uCiAgICAgYW5kIGRlYWxsb2NhdGlvbikgYXQgYWxsIHRpbWVzLCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtIGFuZCBjb21waWxlcgogICAgIG9wdGlvbnMuCgogICAgIFRvIGZpbmlzaCBpdCB1cCwgc29tZSBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5ldmVyIHVzZSBpbiBhbnkgb3RoZXIKICAgICB3YXkgdGhhbiB0aHJvdWdoIG1hY3JvcyBoYXZlIGEgbmV3IEFQSSBhbmQgbmV3IHNlbWFudGljOgoKICAgICAgIENSWVBUT19kYmdfbWFsbG9jKCkKICAgICAgIENSWVBUT19kYmdfcmVhbGxvYygpCiAgICAgICBDUllQVE9fZGJnX2ZyZWUoKQoKICAgICBBbGwgbWFjcm9zIG9mIHZhbHVlIGhhdmUgcmV0YWluZWQgdGhlaXIgb2xkIHN5bnRheC4KICAgICBbUmljaGFyZCBMZXZpdHRlIGFuZCBCb2RvIE1vZWxsZXJdCgogICopIFNvbWUgUy9NSU1FIGZpeGVzLiBUaGUgT0lEIGZvciBTTUlNRUNhcGFiaWxpdGllcyB3YXMgd3JvbmcsIHRoZQogICAgIG9yZGVyaW5nIG9mIFNNSU1FQ2FwYWJpbGl0aWVzIHdhc24ndCBpbiAic3RyZW5ndGggb3JkZXIiIGFuZCB0aGVyZQogICAgIHdhcyBhIG1pc3NpbmcgTlVMTCBpbiB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciBmb3IgdGhlIFNIQTEgc2lnbmF0dXJlCiAgICAgYWxnb3JpdGhtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNvbWUgQVNOMSB0eXBlcyB3aXRoIGlsbGVnYWwgemVybyBsZW5ndGggZW5jb2RpbmcgKElOVEVHRVIsCiAgICAgRU5VTUVSQVRFRCBhbmQgT0JKRUNUIElERU5USUZJRVIpIGNob2tlZCB0aGUgQVNOMSByb3V0aW5lcy4KICAgICBbRnJhbnMgSGV5bWFucyA8ZmhleW1hbnNAaXNhc2VydmVyLmJlPiwgbW9kaWZpZWQgYnkgU3RldmUgSGVuc29uXQoKICAqKSBNZXJnZSBpbiBteSBTL01JTUUgbGlicmFyeSBmb3IgT3BlblNTTC4gVGhpcyBwcm92aWRlcyBhIHNpbXBsZQogICAgIFMvTUlNRSBBUEkgb24gdG9wIG9mIHRoZSBQS0NTIzcgY29kZSwgYSBNSU1FIHBhcnNlciAod2l0aCBlbm91Z2gKICAgICBmdW5jdGlvbmFsaXR5IHRvIGhhbmRsZSBtdWx0aXBhcnQvc2lnbmVkIHByb3Blcmx5KSBhbmQgYSB1dGlsaXR5CiAgICAgY2FsbGVkICdzbWltZScgdG8gY2FsbCBhbGwgdGhpcyBzdHVmZi4gVGhpcyBpcyBiYXNlZCBvbiBjb2RlIEkKICAgICBvcmlnaW5hbGx5IHdyb3RlIGZvciBDZWxvIHdobyBoYXZlIGtpbmRseSBhbGxvd2VkIGl0IHRvIGJlCiAgICAgaW5jbHVkZWQgaW4gT3BlblNTTC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdmFyaWFudHMgZGVzX3NldF9rZXlfY2hlY2tlZCBhbmQgZGVzX3NldF9rZXlfdW5jaGVja2VkIG9mCiAgICAgZGVzX3NldF9rZXkgKGFrYSBkZXNfa2V5X3NjaGVkKS4gIEdsb2JhbCB2YXJpYWJsZSBkZXNfY2hlY2tfa2V5CiAgICAgZGVjaWRlcyB3aGljaCBvZiB0aGVzZSBpcyBjYWxsZWQgYnkgZGVzX3NldF9rZXk7IHRoaXMgd2F5CiAgICAgZGVzX2NoZWNrX2tleSBiZWhhdmVzIGFzIGl0IGFsd2F5cyBkaWQsIGJ1dCBhcHBsaWNhdGlvbnMgYW5kCiAgICAgdGhlIGxpYnJhcnkgaXRzZWxmLCB3aGljaCB3YXMgYnVnZ3kgZm9yIGRlc19jaGVja19rZXkgPT0gMSwKICAgICBoYXZlIGEgY2xlYW5lciB3YXkgdG8gcGljayB0aGUgdmVyc2lvbiB0aGV5IG5lZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFBLQ1MxMl9uZXdwYXNzKCkgd2hpY2ggY2hhbmdlcyB0aGUgcGFzc3dvcmQgb2YgYQogICAgIFBLQ1MxMiBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IFg1MDlfVFJVU1QgYW5kIFg1MDlfUFVSUE9TRSBzbyBpdCBhbHNvIHVzZXMgYSBzdGF0aWMgYW5kCiAgICAgZHluYW1pYyBtaXguIEluIGJvdGggY2FzZXMgdGhlIGlkcyBjYW4gYmUgdXNlZCBhcyBhbiBpbmRleCBpbnRvIHRoZQogICAgIHRhYmxlLiBBbHNvIG1vZGlmaWVkIHRoZSBYNTA5X1RSVVNUX2FkZCgpIGFuZCBYNTA5X1BVUlBPU0VfYWRkKCkKICAgICBmdW5jdGlvbnMgc28gdGhleSBhY2NlcHQgYSBsaXN0IG9mIHRoZSBmaWVsZCB2YWx1ZXMgYW5kIHRoZQogICAgIGFwcGxpY2F0aW9uIGRvZXNuJ3QgbmVlZCB0byBkaXJlY3RseSBtYW5pcHVsYXRlIHRoZSBYNTA5X1RSVVNUCiAgICAgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgQVNOMV9TVFJJTkdfVEFCTEUgc3R1ZmYgc28gaXQgYWxzbyB1c2VzIGJzZWFyY2ggYW5kIGRvZXNuJ3QKICAgICBuZWVkIGluaXRpYWxpc2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlIHdheSB0aGUgVjMgZXh0ZW5zaW9uIGNvZGUgbG9va3MgdXAgZXh0ZW5zaW9ucy4gVGhpcyBub3cKICAgICB3b3JrcyBpbiBhIHNpbWlsYXIgd2F5IHRvIHRoZSBvYmplY3QgY29kZTogd2UgaGF2ZSBzb21lICJzdGFuZGFyZCIKICAgICBleHRlbnNpb25zIGluIGEgc3RhdGljIHRhYmxlIHdoaWNoIGlzIHNlYXJjaGVkIHdpdGggT0JKX2JzZWFyY2goKQogICAgIGFuZCB0aGUgYXBwbGljYXRpb24gY2FuIGFkZCBkeW5hbWljIG9uZXMgaWYgbmVlZGVkLiBUaGUgZmlsZQogICAgIGNyeXB0by94NTA5djMvZXh0X2RhdC5oIG5vdyBoYXMgdGhlIGluZm86IHRoaXMgZmlsZSBuZWVkcyB0byBiZQogICAgIHVwZGF0ZWQgd2hlbmV2ZXIgYSBuZXcgZXh0ZW5zaW9uIGlzIGFkZGVkIHRvIHRoZSBjb3JlIGNvZGUgYW5kIGtlcHQKICAgICBpbiBleHRfbmlkIG9yZGVyLiBUaGVyZSBpcyBhIHNpbXBsZSBwcm9ncmFtICd0YWJ0ZXN0LmMnIHdoaWNoIGNoZWNrcwogICAgIHRoaXMuIE5ldyBleHRlbnNpb25zIGFyZSBub3QgYWRkZWQgdG9vIG9mdGVuIHNvIHRoaXMgZmlsZSBjYW4gcmVhZGlseQogICAgIGJlIG1haW50YWluZWQgbWFudWFsbHkuCgogICAgIFRoZXJlIGFyZSB0d28gYmlnIGFkdmFudGFnZXMgaW4gZG9pbmcgdGhpbmdzIHRoaXMgd2F5LiBUaGUgZXh0ZW5zaW9ucwogICAgIGNhbiBiZSBsb29rZWQgdXAgaW1tZWRpYXRlbHkgYW5kIG5vIGxvbmdlciBuZWVkIHRvIGJlICJhZGRlZCIgdXNpbmcKICAgICBYNTA5VjNfYWRkX3N0YW5kYXJkX2V4dGVuc2lvbnMoKTogdGhpcyBmdW5jdGlvbiBub3cgZG9lcyBub3RoaW5nLgogICAgIFtTaWRlIG5vdGU6IEkgZ2V0ICpsb3RzKiBvZiBlbWFpbCBzYXlpbmcgdGhlIGV4dGVuc2lvbiBjb2RlIGRvZXNuJ3QKICAgICAgd29yayBiZWNhdXNlIHBlb3BsZSBmb3JnZXQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uXQogICAgIEFsc28gbm8gZHluYW1pYyBhbGxvY2F0aW9uIGlzIGRvbmUgdW5sZXNzIG5ldyBleHRlbnNpb25zIGFyZSBhZGRlZDoKICAgICBzbyBpZiB3ZSBkb24ndCBhZGQgY3VzdG9tIGV4dGVuc2lvbnMgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsCiAgICAgWDUwOVYzX0VYVF9jbGVhbnVwKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGVuYyB1dGlsaXR5J3Mgc2FsdGluZyBhcyBmb2xsb3dzOiBtYWtlIHNhbHRpbmcgdGhlIGRlZmF1bHQuIEFkZCBhCiAgICAgbWFnaWMgaGVhZGVyLCBzbyB1bnNhbHRlZCBmaWxlcyBmYWlsIGdyYWNlZnVsbHkgaW5zdGVhZCBvZiBqdXN0IGRlY3J5cHRpbmcKICAgICB0byBnYXJiYWdlLiBUaGlzIGlzIGJlY2F1c2Ugbm90IHNhbHRpbmcgaXMgYSBiaWcgc2VjdXJpdHkgaG9sZSwgc28gcGVvcGxlCiAgICAgc2hvdWxkIGJlIGRpc2NvdXJhZ2VkIGZyb20gZG9pbmcgaXQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeGVzIGFuZCBlbmhhbmNlbWVudHMgdG8gdGhlICd4NTA5JyB1dGlsaXR5LiBJdCBhbGxvd2VkIGEgbWVzc2FnZQogICAgIGRpZ2VzdCB0byBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBidXQgaXQgb25seSB1c2VkIHRoaXMKICAgICBwYXJhbWV0ZXIgd2hlbiBzaWduaW5nIGEgY2VydGlmaWNhdGUuIE1vZGlmaWVkIHNvIGFsbCByZWxldmFudAogICAgIG9wZXJhdGlvbnMgYXJlIGFmZmVjdGVkIGJ5IHRoZSBkaWdlc3QgcGFyYW1ldGVyIGluY2x1ZGluZyB0aGUKICAgICAtZmluZ2VycHJpbnQgYW5kIC14NTA5dG9yZXEgb3B0aW9ucy4gQWxzbyAteDUwOXRvcmVxIGNob2tlZCBpZiBhCiAgICAgRFNBIGtleSB3YXMgdXNlZCBiZWNhdXNlIGl0IGRpZG4ndCBmaXggdGhlIGRpZ2VzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGNlcnRpZmljYXRlIGNoYWluIHZlcmlmeSBjb2RlLiBDdXJyZW50bHkgdGVzdHMgdGhlIHVudHJ1c3RlZAogICAgIGNlcnRpZmljYXRlcyBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgdmVyaWZ5IHB1cnBvc2UgKHdoaWNoIGlzIHNldAogICAgIHdoZW4gdGhlIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZSBpcyBzZXQgdXApIGFuZCBjaGVja3MgdGhlIHBhdGhsZW5ndGguCgogICAgIFRoZXJlIGlzIGEgTk9fQ0hBSU5fVkVSSUZZIGNvbXBpbGF0aW9uIG9wdGlvbiB0byBrZWVwIHRoZSBvbGQgYmVoYXZpb3VyOgogICAgIHRoaXMgaXMgYmVjYXVzZSBpdCB3aWxsIHJlamVjdCBjaGFpbnMgd2l0aCBpbnZhbGlkIGV4dGVuc2lvbnMgd2hlcmVhcwogICAgIGV2ZXJ5IHByZXZpb3VzIHZlcnNpb24gb2YgT3BlblNTTCBhbmQgU1NMZWF5IG1hZGUgbm8gY2hlY2tzIGF0IGFsbC4KCiAgICAgVHJ1c3QgY29kZTogY2hlY2tzIHRoZSByb290IENBIGZvciB0aGUgcmVsZXZhbnQgdHJ1c3Qgc2V0dGluZ3MuIFRydXN0CiAgICAgc2V0dGluZ3MgaGF2ZSBhbiBpbml0aWFsIHZhbHVlIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmVyaWZ5IHB1cnBvc2U6IGUuZy4KICAgICBpZiB0aGUgdmVyaWZ5IHB1cnBvc2UgaXMgZm9yIFNTTCBjbGllbnQgdXNlIGl0IGV4cGVjdHMgdGhlIENBIHRvIGJlCiAgICAgdHJ1c3RlZCBmb3IgU1NMIGNsaWVudCB1c2UuIEhvd2V2ZXIgdGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQgdG8KICAgICBwZXJtaXQgY3VzdG9tIHRydXN0IHNldHRpbmdzOiBvbmUgZXhhbXBsZSBvZiB0aGlzIHdvdWxkIGJlIHRvIG9ubHkgdHJ1c3QKICAgICBjZXJ0aWZpY2F0ZXMgZnJvbSBhIHNwZWNpZmljICJzZWN1cmUiIHNldCBvZiBDQXMuCgogICAgIEFsc28gYWRkZWQgWDUwOV9TVE9SRV9DVFhfbmV3KCkgYW5kIFg1MDlfU1RPUkVfQ1RYX2ZyZWUoKSBmdW5jdGlvbnMKICAgICB3aGljaCBzaG91bGQgYmUgdXNlZCBmb3IgdmVyc2lvbiBwb3J0YWJpbGl0eTogZXNwZWNpYWxseSBzaW5jZSB0aGUKICAgICB2ZXJpZnkgc3RydWN0dXJlIGlzIGxpa2VseSB0byBjaGFuZ2UgbW9yZSBvZnRlbiBub3cuCgogICAgIFNTTCBpbnRlZ3JhdGlvbi4gQWRkIHB1cnBvc2UgYW5kIHRydXN0IHRvIFNTTF9DVFggYW5kIFNTTCBhbmQgZnVuY3Rpb25zCiAgICAgdG8gc2V0IHRoZW0uIElmIG5vdCBzZXQgdGhlbiBhc3N1bWUgU1NMIGNsaWVudHMgd2lsbCB2ZXJpZnkgU1NMIHNlcnZlcnMKICAgICBhbmQgdmljZSB2ZXJzYS4KCiAgICAgVHdvIG5ldyBvcHRpb25zIHRvIHRoZSB2ZXJpZnkgcHJvZ3JhbTogLXVudHJ1c3RlZCBhbGxvd3MgYSBzZXQgb2YKICAgICB1bnRydXN0ZWQgY2VydGlmaWNhdGVzIHRvIGJlIHBhc3NlZCBpbiBhbmQgLXB1cnBvc2Ugd2hpY2ggc2V0cyB0aGUKICAgICBpbnRlbmRlZCBwdXJwb3NlIG9mIHRoZSBjZXJ0aWZpY2F0ZS4gSWYgYSBwdXJwb3NlIGlzIHNldCB0aGVuIHRoZQogICAgIG5ldyBjaGFpbiB2ZXJpZnkgY29kZSBpcyB1c2VkIHRvIGNoZWNrIGV4dGVuc2lvbiBjb25zaXN0ZW5jeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciB0aGUgYXV0aG9yaXR5IGluZm9ybWF0aW9uIGFjY2VzcyBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IFJTQSBhbmQgRFNBIFBFTSByZWFkIHJvdXRpbmVzIHRvIHRyYW5zcGFyZW50bHkgaGFuZGxlCiAgICAgUEtDUyM4IGZvcm1hdCBwcml2YXRlIGtleXMuIE5ldyAqX1BVQktFWV8qIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZQogICAgIHB1YmxpYyBrZXlzIGluIGEgZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBjZXJ0aWZpY2F0ZQogICAgIFN1YmplY3RQdWJsaWNLZXlJbmZvIHN0cnVjdHVyZXMuIFVuZm9ydHVuYXRlbHkgdGhlcmUgd2VyZSBhbHJlYWR5CiAgICAgZnVuY3Rpb25zIGNhbGxlZCAqX1B1YmxpY0tleV8qIHdoaWNoIHVzZWQgdmFyaW91cyBvZGQgZm9ybWF0cyBzbwogICAgIHRoZXNlIGFyZSByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eTogaG93ZXZlciB0aGUgRFNBIHZhcmlhbnRzIHdlcmUKICAgICBuZXZlciBpbiBhIHB1YmxpYyByZWxlYXNlIHNvIHRoZXkgaGF2ZSBiZWVuIGRlbGV0ZWQuIENoYW5nZWQgZHNhL3JzYQogICAgIHV0aWxpdGllcyB0byBoYW5kbGUgdGhlIG5ldyBmb3JtYXQ6IG5vdGUgbm8gcmVsZWFzZXMgZXZlciBoYW5kbGVkIHB1YmxpYwogICAgIGtleXMgc28gd2Ugc2hvdWxkIGJlIE9LLgoKICAgICBUaGUgcHJpbWFyeSBtb3RpdmF0aW9uIGZvciB0aGlzIGNoYW5nZSBpcyB0byBhdm9pZCB0aGUgc2FtZSBmaWFzY28KICAgICB0aGF0IGRvZ3MgcHJpdmF0ZSBrZXlzOiB0aGVyZSBhcmUgc2V2ZXJhbCBpbmNvbXBhdGlibGUgcHJpdmF0ZSBrZXkKICAgICBmb3JtYXRzIHNvbWUgb2Ygd2hpY2ggYXJlIHN0YW5kYXJkIGFuZCBzb21lIE9wZW5TU0wgc3BlY2lmaWMgYW5kCiAgICAgcmVxdWlyZSB2YXJpb3VzIGV2aWwgaGFja3MgdG8gYWxsb3cgcGFydGlhbCB0cmFuc3BhcmVudCBoYW5kbGluZyBhbmQKICAgICBldmVuIHRoZW4gaXQgZG9lc24ndCB3b3JrIHdpdGggREVSIGZvcm1hdHMuIEdpdmVuIHRoZSBvcHRpb24gYW55dGhpbmcKICAgICBvdGhlciB0aGFuIFBLQ1MjOCBzaG91bGQgYmUgZHVtcGVkOiBidXQgdGhlIG90aGVyIGZvcm1hdHMgaGF2ZSB0bwogICAgIHN0YXkgaW4gdGhlIG5hbWUgb2YgY29tcGF0aWJpbGl0eS4KCiAgICAgV2l0aCBwdWJsaWMga2V5cyBhbmQgdGhlIGJlbmVmaXQgb2YgaGluZHNpZ2h0IG9uZSBzdGFuZGFyZCBmb3JtYXQgCiAgICAgaXMgdXNlZCB3aGljaCB3b3JrcyB3aXRoIEVWUF9QS0VZLCBSU0Egb3IgRFNBIHN0cnVjdHVyZXM6IHRob3VnaAogICAgIGl0IGNsZWFybHkgcmV0dXJucyBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIHJlYWQgdGhlIHdyb25nIGtpbmQgb2Yga2V5LgoKICAgICBBZGRlZCBhIC1wdWJrZXkgb3B0aW9uIHRvIHRoZSAneDUwOScgdXRpbGl0eSB0byBvdXRwdXQgdGhlIHB1YmxpYyBrZXkuCiAgICAgQWxzbyByZW5hbWUgdGhlIEVWUF9QS0VZX2dldF8qKCkgdG8gRVZQX1BLRVlfcmdldF8qKCkKICAgICAocmVuYW1lZCB0byBFVlBfUEtFWV9nZXQxXyooKSBpbiB0aGUgT3BlblNTTCAwLjkuNSByZWxlYXNlKSBhbmQgYWRkCiAgICAgRVZQX1BLRVlfcnNldF8qKCkgZnVuY3Rpb25zIChyZW5hbWVkIHRvIEVWUF9QS0VZX3NldDFfKigpKQogICAgIHRoYXQgZG8gdGhlIHNhbWUgYXMgdGhlIEVWUF9QS0VZX2Fzc2lnbl8qKCkgZXhjZXB0IHRoZXkgdXAgdGhlCiAgICAgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBhZGRlZCBrZXkgKHRoZXkgZG9uJ3QgInN3YWxsb3ciIHRoZQogICAgIHN1cHBsaWVkIGtleSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gY3J5cHRvL3g1MDkvYnlfZmlsZS5jIHRoZSBjb2RlIHRvIHJlYWQgaW4gY2VydGlmaWNhdGVzIGFuZAogICAgIENSTHMgd291bGQgZmFpbCBpZiB0aGUgZmlsZSBjb250YWluZWQgbm8gY2VydGlmaWNhdGVzIG9yIG5vIENSTHM6CiAgICAgYWRkZWQgYSBuZXcgZnVuY3Rpb24gdG8gcmVhZCBpbiBib3RoIHR5cGVzIGFuZCByZXR1cm4gdGhlIG51bWJlcgogICAgIHJlYWQ6IHRoaXMgbWVhbnMgdGhhdCBpZiBub25lIGFyZSByZWFkIGl0IHdpbGwgYmUgYW4gZXJyb3IuIFRoZQogICAgIERFUiB2ZXJzaW9ucyBvZiB0aGUgY2VydGlmaWNhdGUgYW5kIENSTCByZWFkZXIgd291bGQgYWx3YXlzIGZhaWwKICAgICBiZWNhdXNlIGl0IGlzbid0IHBvc3NpYmxlIHRvIG1peCBjZXJ0aWZpY2F0ZXMgYW5kIENSTHMgaW4gREVSIGZvcm1hdAogICAgIHdpdGhvdXQgY2hva2luZyBvbmUgb3IgdGhlIG90aGVyIHJvdXRpbmUuIENoYW5nZWQgdGhpcyB0byBqdXN0IHJlYWQKICAgICBhIGNlcnRpZmljYXRlOiB0aGlzIGlzIHRoZSBiZXN0IHdlIGNhbiBkby4gQWxzbyBtb2RpZmllZCB0aGUgY29kZQogICAgIGluIGFwcHMvdmVyaWZ5LmMgdG8gdGFrZSBub3RpY2Ugb2YgcmV0dXJuIGNvZGVzOiBpdCB3YXMgcHJldmlvdXNseQogICAgIGF0dGVtcHRpbmcgdG8gcmVhZCBpbiBjZXJ0aWZpY2F0ZXMgZnJvbSBOVUxMIHBvaW50ZXJzIGFuZCBpZ25vcmluZwogICAgIGFueSBlcnJvcnM6IHRoaXMgaXMgb25lIHJlYXNvbiB3aHkgdGhlIGNlcnQgYW5kIENSTCByZWFkZXIgc2VlbWVkCiAgICAgdG8gd29yay4gSXQgZG9lc24ndCBjaGVjayByZXR1cm4gY29kZXMgZnJvbSB0aGUgZGVmYXVsdCBjZXJ0aWZpY2F0ZQogICAgIHJvdXRpbmVzOiB0aGVzZSBtYXkgd2VsbCBmYWlsIGlmIHRoZSBjZXJ0aWZpY2F0ZXMgYXJlbid0IGluc3RhbGxlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb2RlIHRvIHN1cHBvcnQgb3RoZXJOYW1lIG9wdGlvbiBpbiBHZW5lcmFsTmFtZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXJzdCB1cGRhdGUgdG8gdmVyaWZ5IGNvZGUuIENoYW5nZSB0aGUgdmVyaWZ5IHV0aWxpdHkKICAgICBzbyBpdCB3YXJucyBpZiBpdCBpcyBwYXNzZWQgYSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZToKICAgICBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgbm9ybWFsIGJlaGF2aW91ci4gWDUwOV92ZXJpZnkKICAgICBoYXMgYmVlbiBtb2RpZmllZCB0byBpdCB3aWxsIG5vdyB2ZXJpZnkgYSBzZWxmIHNpZ25lZAogICAgIGNlcnRpZmljYXRlIGlmICpleGFjdGx5KiB0aGUgc2FtZSBjZXJ0aWZpY2F0ZSBhcHBlYXJzCiAgICAgaW4gdGhlIHN0b3JlOiBpdCB3YXMgcHJldmlvdXNseSBpbXBvc3NpYmxlIHRvIHRydXN0IGEKICAgICBzaW5nbGUgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUuIFRoaXMgbWVhbnMgdGhhdDoKICAgICBvcGVuc3NsIHZlcmlmeSBzcy5wZW0KICAgICBub3cgZ2l2ZXMgYSB3YXJuaW5nIGFib3V0IGEgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgYnV0CiAgICAgb3BlbnNzbCB2ZXJpZnkgLUNBZmlsZSBzcy5wZW0gc3MucGVtCiAgICAgaXMgT0suCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIHNlcnZlcnMsIHN0b3JlIHZlcmlmeV9yZXN1bHQgaW4gU1NMX1NFU1NJT04gZGF0YSBzdHJ1Y3R1cmUKICAgICAoYW5kIGFkZCBpdCB0byBleHRlcm5hbCBzZXNzaW9uIHJlcHJlc2VudGF0aW9uKS4KICAgICBUaGlzIGlzIG5lZWRlZCB3aGVuIGNsaWVudCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb25zIGZhaWxzLAogICAgIGJ1dCBhbiBhcHBsaWNhdGlvbi1wcm92aWRlZCB2ZXJpZmljYXRpb24gY2FsbGJhY2sgKHNldCBieQogICAgIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKSBhbGxvd3MgYWNjZXB0aW5nIHRoZSBzZXNzaW9uCiAgICAgYW55d2F5IChpLmUuIGxlYXZlcyB4NTA5X3N0b3JlX2N0eC0+ZXJyb3IgIT0gWDUwOV9WX09LCiAgICAgYnV0IHJldHVybnMgMSk6IFdoZW4gdGhlIHNlc3Npb24gaXMgcmV1c2VkLCB3ZSBoYXZlIHRvIHNldAogICAgIHNzbC0+dmVyaWZ5X3Jlc3VsdCB0byB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSB0byBhdm9pZAogICAgIHNlY3VyaXR5IGhvbGVzLgogICAgIFtCb2RvIE1vZWxsZXIsIHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGEgYnVnIGluIHRoZSBuZXcgUEtDUyM3IGNvZGU6IGl0IGRpZG4ndCBjb25zaWRlciB0aGUKICAgICBjYXNlIGluIFBLQ1M3X2RhdGFJbml0KCkgd2hlcmUgdGhlIHNpZ25lZCBQS0NTNyBzdHJ1Y3R1cmUKICAgICBkaWRuJ3QgY29udGFpbiBhbnkgZXhpc3RpbmcgZGF0YSBiZWNhdXNlIGl0IHdhcyBiZWluZyBjcmVhdGVkLgogICAgIFtQby1DaGVuZyBDaGVuIDxwb2NoZW5nQG5zdC5jb20udHc+LCBzbGlnaHRseSBtb2RpZmllZCBieSBTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHNhbHQgdG8gdGhlIGtleSBkZXJpdmF0aW9uIHJvdXRpbmVzIGluIGVuYy5jLiBUaGlzCiAgICAgZm9ybXMgdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBmaWxlLiBBbHNvIGFkZCBhCiAgICAgLVMgb3B0aW9uIHRvIGFsbG93IGEgc2FsdCB0byBiZSBpbnB1dCBvbiB0aGUgY29tbWFuZCBsaW5lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X2NtcCgpLiBPZGRseSBlbm91Z2ggdGhlcmUgd2Fzbid0IGEgZnVuY3Rpb24KICAgICB0byBjb21wYXJlIHR3byBjZXJ0aWZpY2F0ZXMuIFdlIGRvIHRoaXMgYnkgd29ya2luZyBvdXQgdGhlIFNIQTEKICAgICBoYXNoIGFuZCBjb21wYXJpbmcgdGhhdC4gWDUwOV9jbXAoKSB3aWxsIGJlIG5lZWRlZCBieSB0aGUgdHJ1c3QKICAgICBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNTTF9nZXQxX3Nlc3Npb24oKSBpcyBsaWtlIFNTTF9nZXRfc2Vzc2lvbigpLCBidXQgaW5jcmVtZW50cwogICAgIHRoZSByZWZlcmVuY2UgY291bnQgaW4gdGhlIFNTTF9TRVNTSU9OIHJldHVybmVkLgogICAgIFtHZW9mZiBUaG9ycGUgPGdlb2ZmQGV1LmMyLm5ldD5dCgogICopIEZpeCBmb3IgJ3JlcSc6IGl0IHdhcyBhZGRpbmcgYSBudWxsIHRvIHJlcXVlc3QgYXR0cmlidXRlcy4KICAgICBBbHNvIGNoYW5nZSB0aGUgWDUwOV9MT09LVVAgYW5kIFg1MDlfSU5GTyBjb2RlIHRvIGhhbmRsZQogICAgIGNlcnRpZmljYXRlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgNDAgYW5kIDY0IGJpdCBSQzIgYW5kIFJDNCBhbGdvcml0aG1zOiBkb2N1bWVudAogICAgIHRoZSAnZW5jJyBjb21tYW5kLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gYWRkIGV4dHJhIGluZm9ybWF0aW9uIHRvIHRoZSBtZW1vcnkgbGVhawogICAgIGRldGVjdGluZyBvdXRwdXQsIHRvIGZvcm0gdHJhY2ViYWNrcywgc2hvd2luZyBmcm9tIHdoZXJlIGVhY2gKICAgICBhbGxvY2F0aW9uIHdhcyBvcmlnaW5hdGVkOiBDUllQVE9fcHVzaF9pbmZvKCJjb25zdGFudCBzdHJpbmciKSBhZGRzCiAgICAgdGhlIHN0cmluZyBwbHVzIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB0byBhIHBlci10aHJlYWQKICAgICBzdGFjaywgQ1JZUFRPX3BvcF9pbmZvKCkgZG9lcyB0aGUgb2J2aW91cywgQ1JZUFRPX3JlbW92ZV9hbGxfaW5mbygpCiAgICAgaXMgbGlrZSBjYWxsaW5nIENZUlBUT19wb3BfaW5mbygpIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eS4KICAgICBBbHNvIHVwZGF0ZWQgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIGNvZGUgdG8gYmUgbXVsdGktdGhyZWFkLXNhZmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIG9wdGlvbnMgLXRleHQgYW5kIC1ub291dCB0byBwa2NzNyB1dGlsaXR5IGFuZCBkZWxldGUgdGhlCiAgICAgZW5jcnlwdGlvbiBvcHRpb25zIHdoaWNoIG5ldmVyIGRpZCBhbnl0aGluZy4gVXBkYXRlIGRvY3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG9wdGlvbnMgdG8gc29tZSBvZiB0aGUgdXRpbGl0aWVzIHRvIGFsbG93IHRoZSBwYXNzIHBocmFzZQogICAgIHRvIGJlIGluY2x1ZGVkIG9uIGVpdGhlciB0aGUgY29tbWFuZCBsaW5lIChub3QgcmVjb21tZW5kZWQgb24KICAgICBPU2VzIGxpa2UgVW5peCkgb3IgcmVhZCBmcm9tIHRoZSBlbnZpcm9ubWVudC4gVXBkYXRlIHRoZQogICAgIG1hbnBhZ2VzIGFuZCBmaXggYSBmZXcgYnVncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBmZXcgbWFucGFnZXMgZm9yIHNvbWUgb2YgdGhlIG9wZW5zc2wgY29tbWFuZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSAtcmV2b2tlIG9wdGlvbiBpbiBjYS4gSXQgd2FzIGZyZWVpbmcgdXAgbWVtb3J5IHR3aWNlLAogICAgIGxlYWtpbmcgYW5kIG5vdCBmaW5kaW5nIGFscmVhZHkgcmV2b2tlZCBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5zaXZlIGNoYW5nZXMgdG8gc3VwcG9ydCBjZXJ0aWZpY2F0ZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24uCiAgICAgVGhpcyBpbnZvbHZlcyB0aGUgdXNlIG9mIFg1MDlfQ0VSVF9BVVggc3RydWN0dXJlIGFuZCBYNTA5X0FVWAogICAgIGZ1bmN0aW9ucy4gQW4gWDUwOV9BVVggZnVuY3Rpb24gc3VjaCBhcyBQRU1fcmVhZF9YNTA5X0FVWCgpCiAgICAgY2FuIHN0aWxsIHJlYWQgaW4gYSBjZXJ0aWZpY2F0ZSBmaWxlIGluIHRoZSB1c3VhbCB3YXkgYnV0IGl0CiAgICAgd2lsbCBhbHNvIHJlYWQgaW4gYW55IGFkZGl0aW9uYWwgImF1eGlsaWFyeSBpbmZvcm1hdGlvbiIuIEJ5CiAgICAgZG9pbmcgdGhpbmdzIHRoaXMgd2F5IGEgZmFpciBkZWdyZWUgb2YgY29tcGF0aWJpbGl0eSBjYW4gYmUKICAgICByZXRhaW5lZDogZXhpc3RpbmcgY2VydGlmaWNhdGVzIGNhbiBoYXZlIHRoaXMgaW5mb3JtYXRpb24gYWRkZWQKICAgICB1c2luZyB0aGUgbmV3ICd4NTA5JyBvcHRpb25zLiAKCiAgICAgQ3VycmVudCBhdXhpbGlhcnkgaW5mb3JtYXRpb24gaW5jbHVkZXMgYW4gImFsaWFzIiBhbmQgc29tZSB0cnVzdAogICAgIHNldHRpbmdzLiBUaGUgdHJ1c3Qgc2V0dGluZ3Mgd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgaW4gZW5oYW5jZWQKICAgICBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZmljYXRpb24gcm91dGluZXM6IGN1cnJlbnRseSBhIGNlcnRpZmljYXRlCiAgICAgY2FuIG9ubHkgYmUgdHJ1c3RlZCBpZiBpdCBpcyBzZWxmIHNpZ25lZCBhbmQgdGhlbiBpdCBpcyB0cnVzdGVkCiAgICAgZm9yIGFsbCBwdXJwb3Nlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYXNzZW1ibGVyIGZvciBBbHBoYSAodGVzdGVkIG9ubHkgb24gREVDIE9TRiBub3QgTGludXggb3IgKkJTRCkuCiAgICAgVGhlIHByb2JsZW0gd2FzIHRoYXQgb25lIG9mIHRoZSByZXBsYWNlbWVudCByb3V0aW5lcyBoYWQgbm90IGJlZW4gd29ya2luZwogICAgIHNpbmNlIFNTTGVheSByZWxlYXNlcy4gIEZvciBub3cgdGhlIG9mZmVuZGluZyByb3V0aW5lIGhhcyBiZWVuIHJlcGxhY2VkCiAgICAgd2l0aCBub24tb3B0aW1pc2VkIGFzc2VtYmxlci4gIEV2ZW4gc28sIHRoaXMgbm93IGdpdmVzIGFyb3VuZCA5NSUKICAgICBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBmb3IgMTAyNCBiaXQgUlNBIHNpZ25zLgogICAgIFtNYXJrIENveF0KCiAgKikgSGFjayB0byBmaXggUEtDUyM3IGRlY3J5cHRpb24gd2hlbiB1c2VkIHdpdGggc29tZSB1bm9ydGhvZG94IFJDMiAKICAgICBoYW5kbGluZy4gTW9zdCBjbGllbnRzIGhhdmUgdGhlIGVmZmVjdGl2ZSBrZXkgc2l6ZSBpbiBiaXRzIGVxdWFsIHRvCiAgICAgdGhlIGtleSBsZW5ndGggaW4gYml0czogc28gYSA0MCBiaXQgUkMyIGtleSB1c2VzIGEgNDAgYml0ICg1IGJ5dGUpIGtleS4KICAgICBBIGZldyBob3dldmVyIGRvbid0IGRvIHRoaXMgYW5kIGluc3RlYWQgdXNlIHRoZSBzaXplIG9mIHRoZSBkZWNyeXB0ZWQga2V5CiAgICAgdG8gZGV0ZXJtaW5lIHRoZSBSQzIga2V5IGxlbmd0aCBhbmQgdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgdG8gZGV0ZXJtaW5lCiAgICAgdGhlIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoLiBJbiB0aGlzIGNhc2UgdGhlIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoIGNhbiBzdGlsbAogICAgIGJlIDQwIGJpdHMgYnV0IHRoZSBrZXkgbGVuZ3RoIGNhbiBiZSAxNjggYml0cyBmb3IgZXhhbXBsZS4gVGhpcyBpcyBmaXhlZAogICAgIGJ5IG1hbnVhbGx5IGZvcmNpbmcgYW4gUkMyIGtleSBpbnRvIHRoZSBFVlBfUEtFWSBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGUKICAgICBFVlAgY29kZSBjYW4ndCBjdXJyZW50bHkgaGFuZGxlIHVudXN1YWwgUkMyIGtleSBzaXplczogaXQgYWx3YXlzIGFzc3VtZXMKICAgICB0aGUga2V5IGxlbmd0aCBhbmQgZWZmZWN0aXZlIGtleSBsZW5ndGggYXJlIGVxdWFsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBzaW1wbGlmeSB0aGUgY3JlYXRpb24gb2YgCiAgICAgWDUwOV9OQU1FIHN0cnVjdHVyZXMuIE5vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gZG86CiAgICAgWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV90eHQobm0sICJDTiIsIE1CU1RSSU5HX0FTQywgIlN0ZXZlIiwgLTEsIC0xLCAwKTsKICAgICBhbmQgaGF2ZSBpdCBhdXRvbWF0aWNhbGx5IHdvcmsgb3V0IHRoZSBjb3JyZWN0IGZpZWxkIHR5cGUgYW5kIGZpbGwgaW4KICAgICB0aGUgc3RydWN0dXJlcy4gVGhlIG1vcmUgYWR2ZW50dXJvdXMgY2FuIHRyeToKICAgICBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X3R4dChubSwgZmllbGQsIE1CU1RSSU5HX1VURjgsIHN0ciwgLTEsIC0xLCAwKTsKICAgICBhbmQgaXQgd2lsbCAoaG9wZWZ1bGx5KSB3b3JrIG91dCB0aGUgY29ycmVjdCBtdWx0aWJ5dGUgZW5jb2RpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSAncmVxJyB1dGlsaXR5IHRvIHVzZSB0aGUgbmV3IGZpZWxkIGhhbmRsaW5nIGFuZCBtdWx0aWJ5dGUKICAgICBjb3B5IHJvdXRpbmVzLiBCZWZvcmUgdGhlIEROIGZpZWxkIGNyZWF0aW9uIHdhcyBoYW5kbGVkIGluIGFuIGFkIGhvYwogICAgIHdheSBpbiByZXEsIGNhLCBhbmQgeDUwOSB3aGljaCB3YXMgcmF0aGVyIGJyb2tlbiBhbmQgZGlkbid0IHN1cHBvcnQKICAgICBCTVBTdHJpbmdzIG9yIFVURjhTdHJpbmdzLiBTaW5jZSBzb21lIHNvZnR3YXJlIGRvZXNuJ3QgaW1wbGVtZW50CiAgICAgQk1QU3RyaW5ncyBvciBVVEY4U3RyaW5ncyB5ZXQsIHRoZXkgY2FuIGJlIGVuYWJsZWQgdXNpbmcgdGhlIGNvbmZpZyBmaWxlCiAgICAgdXNpbmcgdGhlIGRpcnN0cmluZ190eXBlIG9wdGlvbi4gU2VlIHRoZSBuZXcgY29tbWVudCBpbiB0aGUgZGVmYXVsdAogICAgIG9wZW5zc2wuY25mIGZvciBtb3JlIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBjcnlwdG8vcmFuZC9tZF9yYW5kLmMgbW9yZSByb2J1c3Q6CiAgICAgLSBBc3N1cmUgdW5pcXVlIHJhbmRvbSBudW1iZXJzIGFmdGVyIGZvcmsoKS4KICAgICAtIE1ha2Ugc3VyZSB0aGF0IGNvbmN1cnJlbnQgdGhyZWFkcyBhY2Nlc3MgdGhlIGdsb2JhbCBjb3VudGVyIGFuZAogICAgICAgbWQgc2VyaWFsaXphYmx5IHNvIHRoYXQgd2UgbmV2ZXIgbG9zZSBlbnRyb3B5IGluIHRoZW0KICAgICAgIG9yIHVzZSBleGFjdGx5IHRoZSBzYW1lIHN0YXRlIGluIG11bHRpcGxlIHRocmVhZHMuCiAgICAgICBBY2Nlc3MgdG8gdGhlIGxhcmdlIHN0YXRlIGlzIG5vdCBhbHdheXMgc2VyaWFsaXphYmxlIGJlY2F1c2UKICAgICAgIHRoZSBhZGRpdGlvbmFsIGxvY2tpbmcgY291bGQgYmUgYSBwZXJmb3JtYW5jZSBraWxsZXIsIGFuZAogICAgICAgbWQgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCBhbnl3YXkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZpbGUgYXBwcy9hcHBfcmFuZC5jIHdpdGggY29tbW9ubHkgbmVlZGVkIGZ1bmN0aW9uYWxpdHkKICAgICBmb3IgaGFuZGxpbmcgdGhlIHJhbmRvbSBzZWVkIGZpbGUuCgogICAgIFVzZSB0aGUgcmFuZG9tIHNlZWQgZmlsZSBpbiBzb21lIGFwcGxpY2F0aW9ucyB0aGF0IHByZXZpb3VzbHkgZGlkIG5vdDoKICAgICAgICAgIGNhLAogICAgICAgICAgZHNhcGFyYW0gLWdlbmtleSAod2hpY2ggYWxzbyBpZ25vcmVkIGl0cyAnLXJhbmQnIG9wdGlvbiksIAogICAgICAgICAgc19jbGllbnQsCiAgICAgICAgICBzX3NlcnZlciwKICAgICAgICAgIHg1MDkgKHdoZW4gc2lnbmluZykuCiAgICAgRXhjZXB0IG9uIHN5c3RlbXMgd2l0aCAvZGV2L3VyYW5kb20sIGl0IGlzIGNydWNpYWwgdG8gaGF2ZSBhIHJhbmRvbQogICAgIHNlZWQgZmlsZSBhdCBsZWFzdCBmb3Iga2V5IGNyZWF0aW9uLCBEU0Egc2lnbmluZywgYW5kIGZvciBESCBleGNoYW5nZXM7CiAgICAgZm9yIFJTQSBzaWduYXR1cmVzIHdlIGNvdWxkIGRvIHdpdGhvdXQgb25lLgoKICAgICBnZW5kaCBhbmQgZ2VuZHNhICh1bmxpa2UgZ2VucnNhKSB1c2VkIHRvIHJlYWQgb25seSB0aGUgZmlyc3QgYnl0ZQogICAgIG9mIGVhY2ggZmlsZSBsaXN0ZWQgaW4gdGhlICctcmFuZCcgb3B0aW9uLiAgVGhlIGZ1bmN0aW9uIGFzIHByZXZpb3VzbHkKICAgICBmb3VuZCBpbiBnZW5yc2EgaXMgbm93IGluIGFwcF9yYW5kLmMgYW5kIGlzIHVzZWQgYnkgYWxsIHByb2dyYW1zCiAgICAgdGhhdCBzdXBwb3J0ICctcmFuZCcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gUkFORF93cml0ZV9maWxlLCB1c2UgbW9kZSAwNjAwIGZvciBjcmVhdGluZyBmaWxlczsKICAgICBkb24ndCBqdXN0IGNobW9kIHdoZW4gaXQgbWF5IGJlIHRvbyBsYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlcG9ydCBhbiBlcnJvciBmcm9tIFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMKICAgICB3aGVuIFg1MDlfTE9PS1VQX2xvYWRfZmlsZSBvciBYNTA5X0xPT0tVUF9hZGRfZGlyIGZhaWxlZC4KICAgICBbQmlsbCBQZXJyeV0KCiAgKikgTmV3IGZ1bmN0aW9uIEFTTjFfbWJzdHJpbmdfY29weSgpIHRoaXMgY29waWVzIGEgc3RyaW5nIGluIGVpdGhlcgogICAgIEFTQ0lJLCBVbmljb2RlLCBVbml2ZXJzYWwgKDQgYnl0ZXMgcGVyIGNoYXJhY3Rlcikgb3IgVVRGOCBmb3JtYXQKICAgICBpbnRvIGFuIEFTTjFfU1RSSU5HIHR5cGUuIEEgbWFzayBvZiBwZXJtaXNzaWJsZSB0eXBlcyBpcyBwYXNzZWQKICAgICBhbmQgaXQgY2hvb3NlcyB0aGUgIm1pbmltYWwiIHR5cGUgdG8gdXNlIG9yIGFuIGVycm9yIGlmIG5vdCB0eXBlCiAgICAgaXMgc3VpdGFibGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9uIGVxdWl2YWxlbnRzIHRvIHRoZSB2YXJpb3VzIG1hY3JvcyBpbiBhc24xLmguIFRoZSBvbGQKICAgICBtYWNyb3MgYXJlIHJldGFpbmVkIHdpdGggYW4gTV8gcHJlZml4LiBDb2RlIGluc2lkZSB0aGUgbGlicmFyeSBjYW4KICAgICB1c2UgdGhlIE1fIG1hY3Jvcy4gRXh0ZXJuYWwgY29kZSAoaW5jbHVkaW5nIHRoZSBvcGVuc3NsIHV0aWxpdHkpCiAgICAgc2hvdWxkICpOT1QqIGluIG9yZGVyIHRvIGJlICJzaGFyZWQgbGlicmFyeSBmcmllbmRseSIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgY2FuIGNoZWNrIGEgY2VydGlmaWNhdGUncyBleHRlbnNpb25zCiAgICAgdG8gc2VlIGlmIGl0IHVzYWJsZSBmb3IgdmFyaW91cyBwdXJwb3NlcyBzdWNoIGFzIFNTTCBjbGllbnQsCiAgICAgc2VydmVyIG9yIFMvTUlNRSBhbmQgQ0FzIG9mIHRoZXNlIHR5cGVzLiBUaGlzIGlzIGN1cnJlbnRseSAKICAgICBWRVJZIEVYUEVSSU1FTlRBTCBidXQgd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgZm9yIGNlcnRpZmljYXRlIGNoYWluCiAgICAgdmVyaWZpY2F0aW9uLiBBbHNvIGFkZGVkIGEgLXB1cnBvc2UgZmxhZyB0byB4NTA5IHV0aWxpdHkgdG8KICAgICBwcmludCBvdXQgYWxsIHRoZSBwdXJwb3Nlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBDUllQVE9fRVhfREFUQSB0byBYNTA5IGNlcnRpZmljYXRlIHN0cnVjdHVyZSBhbmQgYXNzb2NpYXRlZAogICAgIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgWDUwOVYzX3tYNTA5LENSTCxSRVZPS0VEfV9nZXRfZDJpKCkgZnVuY3Rpb25zLiBUaGVzZSB3aWxsIHNlYXJjaAogICAgIGZvciwgb2J0YWluIGFuZCBkZWNvZGUgYW5kIGV4dGVuc2lvbiBhbmQgb2J0YWluIGl0cyBjcml0aWNhbCBmbGFnLgogICAgIFRoaXMgYWxsb3dzIGFsbCB0aGUgbmVjZXNzYXJ5IGV4dGVuc2lvbiBjb2RlIHRvIGJlIGhhbmRsZWQgaW4gYQogICAgIHNpbmdsZSBmdW5jdGlvbiBjYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJDNCB0dW5lLXVwIGZlYXR1cmluZyAzMC00MCUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb24gbW9zdCBSSVNDCiAgICAgcGxhdGZvcm1zLiBTZWUgY3J5cHRvL3JjNC9yYzRfZW5jLmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTmV3IC1ub291dCBvcHRpb24gdG8gYXNuMXBhcnNlLiBUaGlzIGNhdXNlcyBubyBvdXRwdXQgdG8gYmUgcHJvZHVjZWQKICAgICBpdHMgbWFpbiB1c2UgaXMgd2hlbiBjb21iaW5lZCB3aXRoIC1zdHJwYXJzZSBhbmQgLW91dCB0byBleHRyYWN0IGRhdGEKICAgICBmcm9tIGEgZmlsZSAod2hpY2ggbWF5IG5vdCBiZSBpbiBBU04uMSBmb3JtYXQpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmb3IgcGtjczEyIHByb2dyYW0uIEl0IHdhcyBoYXNoaW5nIGFuIGludmFsaWQgY2VydGlmaWNhdGUgcG9pbnRlcgogICAgIHdoZW4gcHJvZHVjaW5nIHRoZSBsb2NhbCBrZXkgaWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIE5ldyBvcHRpb24gLWRocGFyYW0gaW4gc19zZXJ2ZXIuIFRoaXMgYWxsb3dzIGEgREggcGFyYW1ldGVyIGZpbGUgdG8gYmUKICAgICBzdGF0ZWQgZXhwbGljaXRseS4gSWYgaXQgaXMgbm90IHN0YXRlZCB0aGVuIGl0IHRyaWVzIHRoZSBmaXJzdCBzZXJ2ZXIKICAgICBjZXJ0aWZpY2F0ZSBmaWxlLiBUaGUgcHJldmlvdXMgYmVoYXZpb3VyIGhhcmQgY29kZWQgdGhlIGZpbGVuYW1lCiAgICAgInNlcnZlci5wZW0iLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtcHViaW4gYW5kIC1wdWJvdXQgb3B0aW9ucyB0byB0aGUgcnNhIGFuZCBkc2EgY29tbWFuZHMuIFRoZXNlIGFsbG93CiAgICAgYSBwdWJsaWMga2V5IHRvIGJlIGlucHV0IG9yIG91dHB1dC4gRm9yIGV4YW1wbGU6CiAgICAgb3BlbnNzbCByc2EgLWluIGtleS5wZW0gLXB1Ym91dCAtb3V0IHB1YmtleS5wZW0KICAgICBBbHNvIGFkZGVkIG5lY2Vzc2FyeSBEU0EgcHVibGljIGtleSBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHNvIFBLQ1M3X2RhdGFWZXJpZnkoKSBkb2Vzbid0IGNyYXNoIGlmIG5vIGNlcnRpZmljYXRlcyBhcmUgY29udGFpbmVkCiAgICAgaW4gdGhlIG1lc3NhZ2UuIFRoaXMgd2FzIGhhbmRsZWQgYnkgYWxsb3dpbmcKICAgICBYNTA5X2ZpbmRfYnlfaXNzdWVyX2FuZF9zZXJpYWwoKSB0byB0b2xlcmF0ZSBhIE5VTEwgcGFzc2VkIHRvIGl0LgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IFNhbXBvIEtlbGxvbWFraSA8c2FtcG9AbWFpbC5uZXVyb25pby5wdD5dCgogICopIEZpeCBmb3IgYnVnIGluIGQyaV9BU04xX2J5dGVzKCk6IG90aGVyIEFTTjEgZnVuY3Rpb25zIGFkZCBhbiBleHRyYSBudWxsCiAgICAgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5ncyB3aGVyZWFzIHRoaXMgZGlkbid0LiBUaGlzIHdvdWxkIGNhdXNlIHByb2JsZW1zCiAgICAgaWYgc3RyaW5ncyByZWFkIHdpdGggZDJpX0FTTjFfYnl0ZXMoKSB3ZXJlIGxhdGVyIG1vZGlmaWVkLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEFybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEZpeCBmb3IgYmFzZTY0IGRlY29kZSBidWcuIFdoZW4gYSBiYXNlNjQgYmlvIHJlYWRzIG9ubHkgb25lIGxpbmUgb2YKICAgICBkYXRhIGFuZCBpdCBjb250YWlucyBFT0YgaXQgd2lsbCBlbmQgdXAgcmV0dXJuaW5nIGFuIGVycm9yLiBUaGlzIGlzCiAgICAgY2F1c2VkIGJ5IGlucHV0IDQ2IGJ5dGVzIGxvbmcuIFRoZSBjYXVzZSBpcyBkdWUgdG8gdGhlIHdheSBiYXNlNjQKICAgICBCSU9zIGZpbmQgdGhlIHN0YXJ0IG9mIGJhc2U2NCBlbmNvZGVkIGRhdGEuIFRoZXkgZG8gdGhpcyBieSB0cnlpbmcgYQogICAgIHRyaWFsIGRlY29kZSBvbiBlYWNoIGxpbmUgdW50aWwgdGhleSBmaW5kIG9uZSB0aGF0IHdvcmtzLiBXaGVuIHRoZXkKICAgICBkbyBhIGZsYWcgaXMgc2V0IGFuZCBpdCBzdGFydHMgYWdhaW4ga25vd2luZyBpdCBjYW4gcGFzcyBhbGwgdGhlCiAgICAgZGF0YSBkaXJlY3RseSB0aHJvdWdoIHRoZSBkZWNvZGVyLiBVbmZvcnR1bmF0ZWx5IGl0IGRvZXNuJ3QgcmVzZXQKICAgICB0aGUgY29udGV4dCBpdCB1c2VzLiBUaGlzIG1lYW5zIHRoYXQgaWYgRU9GIGlzIHJlYWNoZWQgYW4gYXR0ZW1wdAogICAgIGlzIG1hZGUgdG8gcGFzcyB0d28gRU9GcyB0aHJvdWdoIHRoZSBjb250ZXh0IGFuZCB0aGlzIGNhdXNlcyB0aGUKICAgICByZXN1bHRpbmcgZXJyb3IuIFRoaXMgY2FuIGFsc28gY2F1c2Ugb3RoZXIgcHJvYmxlbXMgYXMgd2VsbC4gQXMgaXMKICAgICB1c3VhbCB3aXRoIHRoZXNlIHByb2JsZW1zIGl0IHRha2VzICphZ2VzKiB0byBmaW5kIGFuZCB0aGUgZml4IGlzCiAgICAgdHJpdmlhbDogbW92ZSBvbmUgbGluZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBpYW5AdW5zLm5zLmFjLnl1IChJdmFuIE5lamdlYmF1ZXIpIF0KCiAgKikgVWdseSB3b3JrYXJvdW5kIHRvIGdldCBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgd29ya2luZyB1bmRlciBXaW5kb3dzLiBUaGUKICAgICBvbGQgY29kZSB3b3VsZG4ndCB3b3JrIGJlY2F1c2UgaXQgbmVlZGVkIHRvIHNlbGVjdCgpIG9uIHNvY2tldHMgYW5kIHRoZQogICAgIHR0eSAoZm9yIGtleXByZXNzZXMgYW5kIHRvIHNlZSBpZiBkYXRhIGNvdWxkIGJlIHdyaXR0ZW4pLiBXaW4zMiBvbmx5CiAgICAgc3VwcG9ydHMgc2VsZWN0KCkgb24gc29ja2V0cyBzbyB3ZSBzZWxlY3QoKSB3aXRoIGEgMXMgdGltZW91dCBvbiB0aGUKICAgICBzb2NrZXRzIGFuZCB0aGVuIHNlZSBpZiBhbnkgY2hhcmFjdGVycyBhcmUgd2FpdGluZyB0byBiZSByZWFkLCBpZiBub25lCiAgICAgYXJlIHByZXNlbnQgdGhlbiB3ZSByZXRyeSwgd2UgYWxzbyBhc3N1bWUgd2UgY2FuIGFsd2F5cyB3cml0ZSBkYXRhIHRvCiAgICAgdGhlIHR0eS4gVGhpcyBpc24ndCBuaWNlIGJlY2F1c2UgdGhlIGNvZGUgdGhlbiBibG9ja3MgdW50aWwgd2UndmUKICAgICByZWNlaXZlZCBhIGNvbXBsZXRlIGxpbmUgb2YgZGF0YSBhbmQgaXQgaXMgZWZmZWN0aXZlbHkgcG9sbGluZyB0aGUKICAgICBrZXlib2FyZCBhdCAxcyBpbnRlcnZhbHM6IGhvd2V2ZXIgaXQncyBxdWl0ZSBhIGJpdCBiZXR0ZXIgdGhhbiBub3QKICAgICB3b3JraW5nIGF0IGFsbCA6LSkgQSBkZWRpY2F0ZWQgV2luZG93cyBhcHBsaWNhdGlvbiBtaWdodCBoYW5kbGUgdGhpcwogICAgIHdpdGggYW4gZXZlbnQgbG9vcCBmb3IgZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIFJTQV9NRVRIT0Qgc3RydWN0dXJlLiBOb3cgdGhlcmUgYXJlIHR3byBleHRyYSBtZXRob2RzLCByc2Ffc2lnbgogICAgIGFuZCByc2FfdmVyaWZ5LiBXaGVuIHRoZSBSU0FfRkxBR1NfU0lHTl9WRVIgb3B0aW9uIGlzIHNldCB0aGVzZSBmdW5jdGlvbnMKICAgICB3aWxsIGJlIGNhbGxlZCB3aGVuIFJTQV9zaWduKCkgYW5kIFJTQV92ZXJpZnkoKSBhcmUgdXNlZC4gVGhpcyBpcyB1c2VmdWwKICAgICBpZiByc2FfcHViX2RlYygpIGFuZCByc2FfcHJpdl9lbmMoKSBlcXVpdmFsZW50cyBhcmUgbm90IGF2YWlsYWJsZS4KICAgICBGb3IgdGhpcyB0byB3b3JrIHByb3Blcmx5IFJTQV9wdWJsaWNfZGVjcnlwdCgpIGFuZCBSU0FfcHJpdmF0ZV9lbmNyeXB0KCkKICAgICBzaG91bGQgKm5vdCogYmUgdXNlZDogUlNBX3NpZ24oKSBhbmQgUlNBX3ZlcmlmeSgpIG11c3QgYmUgdXNlZCBpbnN0ZWFkLgogICAgIFRoaXMgbmVjZXNzaXRhdGVkIHRoZSBzdXBwb3J0IG9mIGFuIGV4dHJhIHNpZ25hdHVyZSB0eXBlIE5JRF9tZDVfc2hhMQogICAgIGZvciBTU0wgc2lnbmF0dXJlcyBhbmQgbW9kaWZpY2F0aW9ucyB0byB0aGUgU1NMIGxpYnJhcnkgdG8gdXNlIGl0IGluc3RlYWQKICAgICBvZiBjYWxsaW5nIFJTQV9wdWJsaWNfZGVjcnlwdCgpIGFuZCBSU0FfcHJpdmF0ZV9lbmNyeXB0KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyAtdmVyaWZ5IC1DQWZpbGUgYW5kIC1DQXBhdGggb3B0aW9ucyB0byB0aGUgY3JsIHByb2dyYW0sIHRoZXNlCiAgICAgd2lsbCBsb29rdXAgYSBDUkwgaXNzdWVycyBjZXJ0aWZpY2F0ZSBhbmQgdmVyaWZ5IHRoZSBzaWduYXR1cmUgaW4gYQogICAgIHNpbWlsYXIgd2F5IHRvIHRoZSB2ZXJpZnkgcHJvZ3JhbS4gVGlkeSB1cCB0aGUgY3JsIHByb2dyYW0gc28gaXQKICAgICBubyBsb25nZXIgYWNjZXNzZXMgc3RydWN0dXJlcyBkaXJlY3RseS4gTWFrZSB0aGUgQVNOMSBDUkwgcGFyc2luZyBhIGJpdAogICAgIGxlc3Mgc3RyaWN0LiBJdCB3aWxsIG5vdyBwZXJtaXQgQ1JMIGV4dGVuc2lvbnMgZXZlbiBpZiBpdCBpcyBub3QKICAgICBhIFYyIENSTDogdGhpcyB3aWxsIGFsbG93IGl0IHRvIHRvbGVyYXRlIHNvbWUgYnJva2VuIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbGl6ZSBhbGwgbm9uLWF1dG9tYXRpYyB2YXJpYWJsZXMgZWFjaCB0aW1lIG9uZSBvZiB0aGUgb3BlbnNzbAogICAgIHN1Yi1wcm9ncmFtcyBpcyBzdGFydGVkICh0aGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGV5IG1heSBiZSBzdGFydGVkCiAgICAgbXVsdGlwbGUgdGltZXMgZnJvbSB0aGUgIk9wZW5TU0w+IiBwcm9tcHQpLgogICAgIFtMZW5uYXJ0IEJhbmcsIEJvZG8gTW9lbGxlcl0KCiAgKikgUHJlbGltaW5hcnkgY29tcGlsYXRpb24gb3B0aW9uIFJTQV9OVUxMIHdoaWNoIGRpc2FibGVzIFJTQSBjcnlwdG8gd2l0aG91dAogICAgIHJlbW92aW5nIGFsbCBvdGhlciBSU0EgZnVuY3Rpb25hbGl0eSAodGhpcyBpcyB3aGF0IE5PX1JTQSBkb2VzKS4gVGhpcwogICAgIGlzIHNvIChmb3IgZXhhbXBsZSkgdGhvc2UgaW4gdGhlIFVTIGNhbiBkaXNhYmxlIHRob3NlIG9wZXJhdGlvbnMgY292ZXJlZAogICAgIGJ5IHRoZSBSU0EgcGF0ZW50IHdoaWxlIGFsbG93aW5nIHN0b3JhZ2UgYW5kIHBhcnNpbmcgb2YgUlNBIGtleXMgYW5kIFJTQQogICAgIGtleSBnZW5lcmF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5vbi1jb3B5aW5nIGludGVyZmFjZSB0byBCSU8gcGFpcnMuCiAgICAgKHN0aWxsIGxhcmdlbHkgdW50ZXN0ZWQpCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEFOUzFfdGFnMnN0cigpIHRvIGNvbnZlcnQgYW4gQVNOMSB0YWcgdG8gYSBkZXNjcmlwdGl2ZQogICAgIEFTQ0lJIHN0cmluZy4gVGhpcyB3YXMgaGFuZGxlZCBpbmRlcGVuZGVudGx5IGluIHZhcmlvdXMgcGxhY2VzIGJlZm9yZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIFVURjhfZ2V0YygpIGFuZCBVVEY4X3B1dGMoKSB0aGF0IHBhcnNlIGFuZCBnZW5lcmF0ZQogICAgIFVURjggc3RyaW5ncyBhIGNoYXJhY3RlciBhdCBhIHRpbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIGNsaWVudF92ZXJzaW9uIGZyb20gY2xpZW50IGhlbGxvIHRvIHNlbGVjdCB0aGUgcHJvdG9jb2wKICAgICAoczIzX3NydnIuYykgYW5kIGZvciBSU0EgY2xpZW50IGtleSBleGNoYW5nZSB2ZXJpZmljYXRpb24KICAgICAoczNfc3J2ci5jKSwgYXMgcmVxdWlyZWQgYnkgdGhlIFNTTCAzLjAvVExTIDEuMCBzcGVjaWZpY2F0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyB0byBoYW5kbGUgU1BLQUNzLCB0aGVzZSB3ZXJlIHByZXZpb3VzbHkKICAgICBoYW5kbGVkIGJ5IHBva2luZyByb3VuZCBpbiB0aGUgc3RydWN0dXJlIGludGVybmFscy4gQWRkZWQgbmV3IGZ1bmN0aW9uCiAgICAgTkVUU0NBUEVfU1BLSV9wcmludCgpIHRvIHByaW50IG91dCBTUEtBQyBhbmQgYSBuZXcgdXRpbGl0eSAnc3BrYWMnIHRvCiAgICAgcHJpbnQsIHZlcmlmeSBhbmQgZ2VuZXJhdGUgU1BLQUNzLiBCYXNlZCBvbiBhbiBvcmlnaW5hbCBpZGVhIGZyb20KICAgICBNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBjb211bmUubW9kZW5hLml0PiBidXQgZXh0ZW5zaXZlbHkgbW9kaWZpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUklQRU1EMTYwIGlzIG9wZXJhdGlvbmFsIG9uIGFsbCBwbGF0Zm9ybXMgYW5kIGlzIGJhY2sgaW4gJ21ha2UgdGVzdCcuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFsbG93IHRoZSBjb25maWcgZmlsZSBleHRlbnNpb24gc2VjdGlvbiB0byBiZSBvdmVyd3JpdHRlbiBvbiB0aGUKICAgICBjb21tYW5kIGxpbmUuIEJhc2VkIG9uIGFuIG9yaWdpbmFsIGlkZWEgZnJvbSBNYXNzaW1pbGlhbm8gUGFsYQogICAgIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+LiBUaGUgbmV3IG9wdGlvbiBpcyBjYWxsZWQgLWV4dGVuc2lvbnMKICAgICBhbmQgY2FuIGJlIGFwcGxpZWQgdG8gY2EsIHJlcSBhbmQgeDUwOS4gQWxzbyAtcmVxZXh0cyB0byBvdmVycmlkZQogICAgIHRoZSByZXF1ZXN0IGV4dGVuc2lvbnMgaW4gcmVxIGFuZCAtY3JsZXh0cyB0byBvdmVycmlkZSB0aGUgY3JsIGV4dGVuc2lvbnMKICAgICBpbiBjYS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGZlYXR1cmUgdG8gdGhlIFNQS0FDIGhhbmRsaW5nIGluIGNhLiAgTm93IHlvdSBjYW4gaW5jbHVkZQogICAgIHRoZSBzYW1lIGZpZWxkIG11bHRpcGxlIHRpbWVzIGJ5IHByZWNlZGluZyBpdCBieSAiWFhYWC4iIGZvciBleGFtcGxlOgogICAgIDEuT1U9IlVuaXQgbmFtZSAxIgogICAgIDIuT1U9IlVuaXQgbmFtZSAyIgogICAgIHRoaXMgaXMgdGhlIHNhbWUgc3ludGF4IGFzIHVzZWQgaW4gdGhlIHJlcSBjb25maWcgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBjZXJ0aWZpY2F0ZSBleHRlbnNpb25zIHRvIGJlIGFkZGVkIHRvIGNlcnRpZmljYXRlIHJlcXVlc3RzLiBUaGVzZQogICAgIGFyZSBzcGVjaWZpZWQgaW4gYSAncmVxX2V4dGVuc2lvbnMnIG9wdGlvbiBvZiB0aGUgcmVxIHNlY3Rpb24gb2YgdGhlCiAgICAgY29uZmlnIGZpbGUuIFRoZXkgY2FuIGJlIHByaW50ZWQgb3V0IHdpdGggdGhlIC10ZXh0IG9wdGlvbiB0byByZXEgYnV0CiAgICAgYXJlIG90aGVyd2lzZSBpZ25vcmVkIGF0IHByZXNlbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGEgaG9ycmlibGUgYnVnIGluIGVuY19yZWFkKCkgaW4gY3J5cHRvL2V2cC9iaW9fZW5jLmM6IGlmIHRoZSBmaXJzdAogICAgIGRhdGEgcmVhZCBjb25zaXN0cyBvZiBvbmx5IHRoZSBmaW5hbCBibG9jayBpdCB3b3VsZCBub3QgZGVjcnlwdGVkIGJlY2F1c2UKICAgICBFVlBfQ2lwaGVyVXBkYXRlKCkgd291bGQgY29ycmVjdGx5IHJlcG9ydCB6ZXJvIGJ5dGVzIGhhZCBiZWVuIGRlY3J5cHRlZC4KICAgICBBIG1pc3BsYWNlZCAnYnJlYWsnIGFsc28gbWVhbnQgdGhlIGRlY3J5cHRlZCBmaW5hbCBibG9jayBtaWdodCBub3QgYmUKICAgICBjb3BpZWQgdW50aWwgdGhlIG5leHQgcmVhZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIERIX01FVEhPRC4gQWdhaW4gYmFzZWQgb24gUlNBX01FVEhPRC4gQWxzbyBhZGRlZAogICAgIGEgZmV3IGV4dHJhIHBhcmFtZXRlcnMgdG8gdGhlIERIIHN0cnVjdHVyZTogdGhlc2Ugd2lsbCBiZSB1c2VmdWwgaWYKICAgICBmb3IgZXhhbXBsZSB3ZSB3YW50IHRoZSB2YWx1ZSBvZiAncScgb3IgaW1wbGVtZW50IFg5LjQyIERILgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgRFNBX01FVEhPRC4gVGhpcyBpcyBiYXNlZCBvbiB0aGUgUlNBX01FVEhPRCBhbmQKICAgICBwcm92aWRlcyBob29rcyB0aGF0IGFsbG93IHRoZSBkZWZhdWx0IERTQSBmdW5jdGlvbnMgb3IgZnVuY3Rpb25zIG9uIGEKICAgICAicGVyIGtleSIgYmFzaXMgdG8gYmUgcmVwbGFjZWQuIFRoaXMgYWxsb3dzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBhbmQKICAgICBoYXJkd2FyZSBrZXkgc3RvcmFnZSB0byBiZSBoYW5kbGVkIHdpdGhvdXQgbWFqb3IgbW9kaWZpY2F0aW9uIHRvIHRoZQogICAgIGxpYnJhcnkuIEFsc28gYWRkZWQgbG93IGxldmVsIG1vZGV4cCBob29rcyBhbmQgQ1JZUFRPX0VYIHN0cnVjdHVyZSBhbmQgCiAgICAgYXNzb2NpYXRlZCBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IGZsYWcgdG8gbWVtb3J5IEJJT3MsIEJJT19GTEFHX01FTV9SRE9OTFkuIFRoaXMgbWFya3MgdGhlIEJJTwogICAgIGFzICJyZWFkIG9ubHkiOiBpdCBjYW4ndCBiZSB3cml0dGVuIHRvIGFuZCB0aGUgYnVmZmVyIGl0IHBvaW50cyB0byB3aWxsCiAgICAgbm90IGJlIGZyZWVkLiBSZWFkaW5nIGZyb20gYSByZWFkIG9ubHkgQklPIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbgogICAgIGEgbm9ybWFsIG1lbW9yeSBCSU8uIFRoaXMgd2FzIGFkZGVkIGJlY2F1c2UgdGhlcmUgYXJlIHNldmVyYWwgdGltZXMgd2hlbgogICAgIGFuIGFyZWEgb2YgbWVtb3J5IG5lZWRzIHRvIGJlIHJlYWQgZnJvbSBhIEJJTy4gVGhlIHByZXZpb3VzIG1ldGhvZCB3YXMKICAgICB0byBjcmVhdGUgYSBtZW1vcnkgQklPIGFuZCB3cml0ZSB0aGUgZGF0YSB0byBpdCwgdGhpcyByZXN1bHRzIGluIHR3bwogICAgIGNvcGllcyBvZiB0aGUgZGF0YSBhbmQgYW4gTyhuXjIpIHJlYWRpbmcgYWxnb3JpdGhtLiBUaGVyZSBpcyBhIG5ldwogICAgIGZ1bmN0aW9uIEJJT19uZXdfbWVtX2J1ZigpIHdoaWNoIGNyZWF0ZXMgYSByZWFkIG9ubHkgbWVtb3J5IEJJTyBmcm9tCiAgICAgYW4gYXJlYSBvZiBtZW1vcnkuIEFsc28gbW9kaWZpZWQgdGhlIFBLQ1MjNyByb3V0aW5lcyB0byB1c2UgcmVhZCBvbmx5CiAgICAgbWVtb3J5IEJJT3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnZml4OiBzc2wyM19nZXRfY2xpZW50X2hlbGxvIGRpZCBub3Qgd29yayBwcm9wZXJseSB3aGVuIGNhbGxlZCBpbgogICAgIHN0YXRlIFNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQiwgaS5lLiB3aGVuIHRoZSBmaXJzdCA3IGJ5dGVzIG9mCiAgICAgYSBTU0x2Mi1jb21wYXRpYmxlIGNsaWVudCBoZWxsbyBmb3IgU1NMdjMgb3IgVExTdjEgY291bGQgYmUgcmVhZCwKICAgICBidXQgYSByZXRyeSBjb25kaXRpb24gb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gcmVhZCB0aGUgcmVzdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUaGUgUEtDUzdfRU5DX0NPTlRFTlRfbmV3KCkgZnVuY3Rpb24gd2FzIHNldHRpbmcgdGhlIGNvbnRlbnQgdHlwZSBhcwogICAgIE5JRF9wa2NzN19lbmNyeXB0ZWQgYnkgZGVmYXVsdDogdGhpcyB3YXMgd3Jvbmcgc2luY2UgdGhpcyBzaG91bGQgYWxtb3N0CiAgICAgYWx3YXlzIGJlIE5JRF9wa2NzN19kYXRhLiBBbHNvIG1vZGlmaWVkIHRoZSBQS0NTN19zZXRfdHlwZSgpIHRvIGhhbmRsZQogICAgIHRoZSBlbmNyeXB0ZWQgZGF0YSB0eXBlOiB0aGlzIGlzIGEgbW9yZSBzZW5zaWJsZSBwbGFjZSB0byBwdXQgaXQgYW5kIGl0CiAgICAgYWxsb3dzIHRoZSBQS0NTIzEyIGNvZGUgdG8gYmUgdGlkaWVkIHVwIHRoYXQgZHVwbGljYXRlZCB0aGlzCiAgICAgZnVuY3Rpb25hbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VkIG9ial9kYXQucGwgc2NyaXB0IHNvIGl0IHRha2VzIGl0cyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG9uCiAgICAgdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBzaG91bGQgYXZvaWQgc2hlbGwgZXNjYXBlIHJlZGlyZWN0aW9uIHByb2JsZW1zCiAgICAgdW5kZXIgV2luMzIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBjZXJ0aWZpY2F0ZSBleHRlbnNpb24gcmVxdWVzdHMsIHRoZXNlIGFyZSBpbmNsdWRlZAogICAgIGluIHRoaW5ncyBsaWtlIFhlbnJvbGwgY2VydGlmaWNhdGUgcmVxdWVzdHMuIEluY2x1ZGVkIGZ1bmN0aW9ucyB0byBhbGxvdwogICAgIGV4dGVuc2lvbnMgdG8gYmUgb2J0YWluZWQgYW5kIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIC1jcmxmIG9wdGlvbiB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgZm9yIHNlbmRpbmcgbmV3bGluZXMgYXMKICAgICBDUkxGIChhcyByZXF1aXJlZCBieSBtYW55IHByb3RvY29scykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjNhIGFuZCAwLjkuNCAgWzA5IEF1ZyAxOTk5XQogIAogICopIEluc3RhbGwgbGliUlNBZ2x1ZS5hIHdoZW4gT3BlblNTTCBpcyBidWlsdCB3aXRoIFJTQXJlZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQSBmZXcgbW9yZSBgYCNpZm5kZWYgTk9fRlBfQVBJIC8gI2VuZGlmJycgcGFpcnMgZm9yIGNvbnNpc3RlbmN5LgogICAgIFtBbmRyaWphIEFudG9uaWpldmljIDxUaGVBbnRvbnkyQGJpZ2Zvb3QuY29tPl0KCiAgKikgRml4IC1zdGFydGRhdGUgYW5kIC1lbmRkYXRlICh3aGljaCB3YXMgbWlzc2luZykgYXJndW1lbnRzIHRvICdjYScKICAgICBwcm9ncmFtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBEU0FfZHVwX0RILCB3aGljaCBkdXBsaWNhdGVzIERTQSBwYXJhbWV0ZXJzL2tleXMgYXMKICAgICBESCBwYXJhbWV0ZXJzL2tleXMgKHEgaXMgbG9zdCBkdXJpbmcgdGhhdCBjb252ZXJzaW9uLCBidXQgdGhlIHJlc3VsdGluZwogICAgIERIIHBhcmFtZXRlcnMgY29udGFpbiBpdHMgbGVuZ3RoKS4KCiAgICAgRm9yIDEwMjQtYml0IHAsIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIGZvbGxvd2VkIGJ5IERTQV9kdXBfREggaXMKICAgICBtdWNoIGZhc3RlciB0aGFuIERIX2dlbmVyYXRlX3BhcmFtZXRlcnMgKHdoaWNoIGNyZWF0ZXMgcGFyYW1ldGVycwogICAgIHdoZXJlIHAgPSAyKnEgKyAxKSwgYW5kIGFsc28gdGhlIHNtYWxsZXIgcSBtYWtlcyBESCBjb21wdXRhdGlvbnMKICAgICBtdWNoIG1vcmUgZWZmaWNpZW50ICgxNjAtYml0IGV4cG9uZW50aWF0aW9uIGluc3RlYWQgb2YgMTAyNC1iaXQKICAgICBleHBvbmVudGlhdGlvbik7IHNvIHRoaXMgcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byBzdXBwb3J0IERIRQogICAgIGNpcGhlcnN1aXRlcyBpbiBTU0wvVExTIHNlcnZlcnMgKHNlZSBzc2wvc3NsdGVzdC5jKS4gIEl0IGlzIG9mCiAgICAgdXR0ZXIgaW1wb3J0YW5jZSB0byB1c2UKICAgICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzX2N0eCwgU1NMX09QX1NJTkdMRV9ESF9VU0UpOwogICAgIG9yCiAgICAgICAgIFNTTF9zZXRfb3B0aW9ucyhzX2N0eCwgU1NMX09QX1NJTkdMRV9ESF9VU0UpOwogICAgIHdoZW4gc3VjaCBESCBwYXJhbWV0ZXJzIGFyZSB1c2VkLCBiZWNhdXNlIG90aGVyd2lzZSBzbWFsbCBzdWJncm91cAogICAgIGF0dGFja3MgbWF5IGJlY29tZSBwb3NzaWJsZSEKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCBtZW1vcnkgbGVhayBpbiBpMmRfREhwYXJhbXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWxsb3cgdGhlIC1rIG9wdGlvbiB0byBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBlbmMgcHJvZ3JhbToKICAgICB0aGlzIGFsbG93cyB0aGUgc2FtZSBlbmNyeXB0ZWQgbWVzc2FnZSB0byBiZSByZWFkIGJ5IG11bHRpcGxlIHJlY2lwaWVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9CSl9vYmoydHh0KGJ1ZiwgYnVmX2xlbiwgYSwgbm9fbmFtZSksIHRoaXMgY29udmVydHMKICAgICBhbiBBU04xX09CSkVDVCB0byBhIHRleHQgc3RyaW5nLiBJZiB0aGUgIm5vX25hbWUiIHBhcmFtZXRlciBpcyBzZXQgdGhlbgogICAgIGl0IHdpbGwgYWx3YXlzIHVzZSB0aGUgbnVtZXJpY2FsIGZvcm0gb2YgdGhlIE9JRCwgZXZlbiBpZiBpdCBoYXMgYSBzaG9ydAogICAgIG9yIGxvbmcgbmFtZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBhbiBleHRyYSBSU0EgZmxhZzogUlNBX0ZMQUdfRVhUX1BLRVkuIFByZXZpb3VzbHkgdGhlIHJzYV9tb2RfZXhwCiAgICAgbWV0aG9kIG9ubHkgZ290IGNhbGxlZCBpZiBwLHEsZG1wMSxkbXExLGlxbXAgY29tcG9uZW50cyB3ZXJlIHByZXNlbnQsCiAgICAgb3RoZXJ3aXNlIGJuX21vZF9leHAgd2FzIGNhbGxlZC4gSW4gdGhlIGNhc2Ugb2YgaGFyZHdhcmUga2V5cyBmb3IgZXhhbXBsZQogICAgIG5vIHByaXZhdGUga2V5IGNvbXBvbmVudHMgbmVlZCBiZSBwcmVzZW50IGFuZCBpdCBtaWdodCBzdG9yZSBleHRyYSBkYXRhCiAgICAgaW4gdGhlIFJTQSBzdHJ1Y3R1cmUsIHdoaWNoIGNhbm5vdCBiZSBhY2Nlc3NlZCBmcm9tIGJuX21vZF9leHAuCiAgICAgQnkgc2V0dGluZyBSU0FfRkxBR19FWFRfUEtFWSByc2FfbW9kX2V4cCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgZm9yCiAgICAgcHJpdmF0ZSBrZXkgb3BlcmF0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBTUEFSQyBMaW51eC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgcGVtX3Bhc3N3b3JkX2NiIGZ1bmN0aW9uIHR5cGUgaW5jb21wYXRpYmx5IGNoYW5nZWQgZnJvbQogICAgICAgICAgdHlwZWRlZiBpbnQgcGVtX3Bhc3N3b3JkX2NiKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCByd2ZsYWcpOwogICAgIHRvCiAgICAgICAgICAuLi4uKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCByd2ZsYWcsIHZvaWQgKnVzZXJkYXRhKTsKICAgICBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gcGFzcyBkYXRhIHRvIHRoZWlyIGNhbGxiYWNrczoKICAgICBUaGUgUEVNW19BU04xXV97cmVhZCx3cml0ZX0uLi4gZnVuY3Rpb25zIGFuZCBtYWNyb3Mgbm93IHRha2UgYW4KICAgICBhZGRpdGlvbmFsIHZvaWQgKiBhcmd1bWVudCwgd2hpY2ggaXMganVzdCBoYW5kZWQgdGhyb3VnaCB3aGVuZXZlcgogICAgIHRoZSBwYXNzd29yZCBjYWxsYmFjayBpcyBjYWxsZWQuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRtaWxsZXJAaWxvZ2ljLmNvbS5hdT47IHRpbnkgY2hhbmdlcyBieSBCb2RvIE1vZWxsZXJdCgogICAgIE5ldyBmdW5jdGlvbiBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YS4KCiAgICAgQ29tcGF0aWJpbGl0eSBub3RlOiBBcyBtYW55IEMgaW1wbGVtZW50YXRpb25zIHB1c2ggZnVuY3Rpb24gYXJndW1lbnRzCiAgICAgb250byB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlciwgdGhlIG5ldyBsaWJyYXJ5IHZlcnNpb24gaXMgbGlrZWx5IHRvCiAgICAgaW50ZXJvcGVyYXRlIHdpdGggcHJvZ3JhbXMgdGhhdCBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aCB0aGUgb2xkCiAgICAgcGVtX3Bhc3N3b3JkX2NiIGRlZmluaXRpb24gKFBFTV93aGF0ZXZlciB0YWtlcyBzb21lIGRhdGEgdGhhdAogICAgIGhhcHBlbnMgdG8gYmUgb24gdGhlIHN0YWNrIGFzIGl0cyBsYXN0IGFyZ3VtZW50LCBhbmQgdGhlIGNhbGxiYWNrCiAgICAganVzdCBpZ25vcmVzIHRoaXMgZ2FyYmFnZSk7IGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgd2hhdHNvZXZlciB0aGF0CiAgICAgdGhpcyB3aWxsIHdvcmsuCgogICopIFRoZSAtRFBMQVRGT1JNPSJcIiQoUExBVEZPUk0pXCIiIGRlZmluaXRpb24gYW5kIHRoZSBzaW1pbGFyIC1EQ0ZMQUdTPS4uLgogICAgIChib3RoIGluIGNyeXB0by9NYWtlZmlsZS5zc2wgZm9yIHVzZSBieSBjcnlwdG8vY3ZlcnNpb24uYykgY2F1c2VkCiAgICAgcHJvYmxlbXMgbm90IG9ubHkgb24gV2luZG93cywgYnV0IGFsc28gb24gc29tZSBVbml4IHBsYXRmb3Jtcy4KICAgICBUbyBhdm9pZCBwcm9ibGVtYXRpYyBjb21tYW5kIGxpbmVzLCB0aGVzZSBkZWZpbml0aW9ucyBhcmUgbm93IGluIGFuCiAgICAgYXV0by1nZW5lcmF0ZWQgZmlsZSBjcnlwdG8vYnVpbGRpbmYuaCAoY3JlYXRlZCBieSBjcnlwdG8vTWFrZWZpbGUuc3NsCiAgICAgZm9yIHN0YW5kYXJkICJtYWtlIiBidWlsZHMsIGJ5IHV0aWwvbWsxbWYucGwgZm9yICJtazFtZiIgYnVpbGRzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNSVBTIElJSS9JViBhc3NlbWJsZXIgbW9kdWxlIGlzIHJlaW1wbGVtZW50ZWQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE1vcmUgREVTIGxpYnJhcnkgY2xlYW51cHM6IHJlbW92ZSByZWZlcmVuY2VzIHRvIHNyYW5kL3JhbmQgYW5kCiAgICAgZGVsZXRlIGFuIHVudXNlZCBmaWxlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdGhlIHRoZSBmcmVlIE5ldHdpZGUgYXNzZW1ibGVyIChOQVNNKSB1bmRlciBXaW4zMiwKICAgICBzaW5jZSBub3QgbWFueSBwZW9wbGUgaGF2ZSBNQVNNIChtbCkgYW5kIGl0IGNhbiBiZSBoYXJkIHRvIG9idGFpbi4KICAgICBUaGlzIGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgT0sgYW5kIHBhc3MgYWxsCiAgICAgdGhlIHRlc3RzLiBDaGVjayBvdXQgSU5TVEFMTC5XMzIgZm9yIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IG1lbW9yeSBsZWFrcyBpbiBzM19jbG50LmM6IEFsbCBub24tYW5vbnltb3VzIFNTTDMvVExTMSBjb25uZWN0aW9ucwogICAgIHdpdGhvdXQgdGVtcG9yYXJ5IGtleXMga2VwdCBhbiBleHRyYSBjb3B5IG9mIHRoZSBzZXJ2ZXIga2V5LAogICAgIGFuZCBjb25uZWN0aW9ucyB3aXRoIHRlbXBvcmFyeSBrZXlzIGRpZCBub3QgZnJlZSBldmVyeXRoaW5nIGluIGNhc2UKICAgICBvZiBhbiBlcnJvci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gUlNBX2NoZWNrX2tleSBhbmQgbmV3IG9wZW5zc2wgcnNhIG9wdGlvbiAtY2hlY2sKICAgICBmb3IgdmVyaWZ5aW5nIHRoZSBjb25zaXN0ZW5jeSBvZiBSU0Ega2V5cy4KICAgICBbVWxmIE1vZWxsZXIsIEJvZG8gTW9lbGxlcl0KCiAgKikgVmFyaW91cyBjaGFuZ2VzIHRvIG1ha2UgV2luMzIgY29tcGlsZSB3b3JrOiAKICAgICAxLiBDYXN0cyB0byBhdm9pZCAibG9zcyBvZiBkYXRhIiB3YXJuaW5ncyBpbiBwNV9jcnB0Mi5jCiAgICAgMi4gQ2hhbmdlIHVuc2lnbmVkIGludCB0byBpbnQgaW4gYl9kdW1wLmMgdG8gYXZvaWQgInNpZ25lZC91bnNpZ25lZAogICAgICAgIGNvbXBhcmlzb24iIHdhcm5pbmdzLgogICAgIDMuIEFkZCBza188VFlQRT5fc29ydCB0byBERUYgZmlsZSBnZW5lcmF0b3IgYW5kIGRvIG1ha2UgdXBkYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGRlYnVnZ2luZyBvcHRpb24gdG8gUEtDUyM1IHYyIGtleSBnZW5lcmF0aW9uIGZ1bmN0aW9uOiB3aGVuCiAgICAgeW91ICNkZWZpbmUgREVCVUdfUEtDUzVWMiBwYXNzd29yZHMsIHNhbHRzLCBpdGVyYXRpb24gY291bnRzIGFuZAogICAgIGRlcml2ZWQga2V5cyBhcmUgcHJpbnRlZCB0byBzdGRlcnIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29weSB0aGUgZmxhZ3MgaW4gQVNOMV9TVFJJTkdfZHVwKCkuCiAgICAgW1JvbWFuIEUuIFBhdmxvdiA8cHJlQG1vLm1zay5ydT5dCgogICopIFRoZSB4NTA5IGFwcGxpY2F0aW9uIG1pc2hhbmRsZWQgc2lnbmluZyByZXF1ZXN0cyBjb250YWluaW5nIERTQQogICAgIGtleXMgd2hlbiB0aGUgc2lnbmluZyBrZXkgd2FzIGFsc28gRFNBIGFuZCB0aGUgcGFyYW1ldGVycyBkaWRuJ3QgbWF0Y2guCgogICAgIEl0IHdhcyBzdXBwb3NlZCB0byBvbWl0IHRoZSBwYXJhbWV0ZXJzIHdoZW4gdGhleSBtYXRjaGVkIHRoZSBzaWduaW5nIGtleToKICAgICB0aGUgdmVyaWZ5aW5nIHNvZnR3YXJlIHdhcyB0aGVuIHN1cHBvc2VkIHRvIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBDQSdzCiAgICAgcGFyYW1ldGVycyBpZiB0aGV5IHdlcmUgYWJzZW50IGZyb20gdGhlIGVuZCB1c2VyIGNlcnRpZmljYXRlLgoKICAgICBPbWl0dGluZyBwYXJhbWV0ZXJzIGlzIG5vIGxvbmdlciByZWNvbW1lbmRlZC4gVGhlIHRlc3Qgd2FzIGFsc28KICAgICB0aGUgd3Jvbmcgd2F5IHJvdW5kISBUaGlzIHdhcyBwcm9iYWJseSBkdWUgdG8gdW51c3VhbCBiZWhhdmlvdXIgaW4KICAgICBFVlBfY21wX3BhcmFtZXRlcnMoKSB3aGljaCByZXR1cm5zIDEgaWYgdGhlIHBhcmFtZXRlcnMgbWF0Y2guIAogICAgIFRoaXMgbWVhbnQgdGhhdCBwYXJhbWV0ZXJzIHdlcmUgb21pdHRlZCB3aGVuIHRoZXkgKmRpZG4ndCogbWF0Y2ggYW5kCiAgICAgdGhlIGNlcnRpZmljYXRlIHdhcyB1c2VsZXNzLiBDZXJ0aWZpY2F0ZXMgc2lnbmVkIHdpdGggJ2NhJyBkaWRuJ3QgaGF2ZQogICAgIHRoaXMgYnVnLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IERvdWcgRXJpY2tzb24gPERvdWcuRXJpY2tzb25AUGFydC5ORVQ+XQoKICAqKSBNZW1vcnkgbGVhayBjaGVja2luZyAoLURDUllQVE9fTURFQlVHKSBoYWQgc29tZSBwcm9ibGVtcy4KICAgICBUaGUgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6CiAgICAgQXBwbGljYXRpb25zIGNhbiB1c2UKICAgICAgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfT04pIGFrYSBNZW1DaGVja19zdGFydCgpLAogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PRkYpIGFrYSBNZW1DaGVja19zdG9wKCk7CiAgICAgIm9mZiIgaXMgbm93IHRoZSBkZWZhdWx0LgogICAgIFRoZSBsaWJyYXJ5IGludGVybmFsbHkgdXNlcwogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19ESVNBQkxFKSBha2EgTWVtQ2hlY2tfb2ZmKCksCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX0VOQUJMRSkgYWthIE1lbUNoZWNrX29uKCkKICAgICB0byBkaXNhYmxlIG1lbW9yeS1jaGVja2luZyB0ZW1wb3JhcmlseS4KCiAgICAgU29tZSBpbmNvbnNpc3RlbnQgc3RhdGVzIHRoYXQgcHJldmlvdXNseSB3ZXJlIHBvc3NpYmxlIChhbmQgd2VyZQogICAgIGV2ZW4gdGhlIGRlZmF1bHQpIGFyZSBub3cgYXZvaWRlZC4KCiAgICAgLURDUllQVE9fTURFQlVHX1RJTUUgaXMgbmV3IGFuZCBhZGRpdGlvbmFsbHkgc3RvcmVzIHRoZSBjdXJyZW50IHRpbWUKICAgICB3aXRoIGVhY2ggbWVtb3J5IGNodW5rIGFsbG9jYXRlZDsgdGhpcyBpcyBvY2Nhc2lvbmFsbHkgbW9yZSBoZWxwZnVsCiAgICAgdGhhbiBqdXN0IGhhdmluZyBhIGNvdW50ZXIuCgogICAgIC1EQ1JZUFRPX01ERUJVR19USFJFQUQgaXMgYWxzbyBuZXcgYW5kIGFkZHMgdGhlIHRocmVhZCBJRC4KCiAgICAgLURDUllQVE9fTURFQlVHX0FMTCBlbmFibGVzIGFsbCBvZiB0aGUgYWJvdmUsIHBsdXMgYW55IGZ1dHVyZQogICAgIGV4dGVuc2lvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW50cm9kdWNlICJtb2RlIiBmb3IgU1NMIHN0cnVjdHVyZXMgKHdpdGggZGVmYXVsdHMgaW4gU1NMX0NUWCksCiAgICAgd2hpY2ggbGFyZ2VseSBwYXJhbGxlbHMgIm9wdGlvbnMiLCBidXQgaXMgZm9yIGNoYW5naW5nIEFQSSBiZWhhdmlvdXIsCiAgICAgd2hlcmVhcyAib3B0aW9ucyIgYXJlIGFib3V0IHByb3RvY29sIGJlaGF2aW91ci4KICAgICBJbml0aWFsICJtb2RlIiBmbGFncyBhcmU6CgogICAgIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFICAgQWxsb3cgU1NMX3dyaXRlIHRvIHJlcG9ydCBzdWNjZXNzIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc2luZ2xlIHJlY29yZCBoYXMgYmVlbiB3cml0dGVuLgogICAgIFNTTF9NT0RFX0FDQ0VQVF9NT1ZJTkdfV1JJVEVfQlVGRkVSICBEb24ndCBpbnNpc3QgdGhhdCBTU0xfd3JpdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXMgdXNlIHRoZSBzYW1lIGJ1ZmZlciBsb2NhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXQgYWxsIG9mIHRoZSBjb250ZW50cyBtdXN0IGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQhKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeDogU1NMX3NldF9vcHRpb25zIGlnbm9yZWQgaXRzIHBhcmFtZXRlciwgb25seSBTU0xfQ1RYX3NldF9vcHRpb25zCiAgICAgd29ya2VkLgoKICAqKSBGaXggcHJvYmxlbXMgd2l0aCBuby1obWFjIGV0Yy4KICAgICBbVWxmIE32bGxlciwgcG9pbnRlZCBvdXQgYnkgQnJpYW4gV2VsbGluZ3RvbiA8YndlbGxpbmdAdGlzbGFicy5jb20+XQoKICAqKSBOZXcgZnVuY3Rpb25zIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSwgUlNBX3NldF9tZXRob2QoKSBhbmQKICAgICBSU0FfZ2V0X21ldGhvZCgpLiBUaGVzZSBhbGxvd3MgcmVwbGFjZW1lbnQgb2YgUlNBX01FVEhPRHMgd2l0aG91dCBoYXZpbmcKICAgICB0byBtZXNzIGFyb3VuZCB3aXRoIHRoZSBpbnRlcm5hbHMgb2YgYW4gUlNBIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggbWVtb3J5IGxlYWtzIGluIERTQV9kb19zaWduIGFuZCBEU0FfaXNfcHJpbWUuCiAgICAgQWxzbyByZWFsbHkgZW5hYmxlIG1lbW9yeSBsZWFrIGNoZWNrcyBpbiBvcGVuc3NsLmMgYW5kIGluIHNvbWUKICAgICB0ZXN0IHByb2dyYW1zLgogICAgIFtDaGFkIEMuIE11bGxpZ2FuLCBCb2RvIE1vZWxsZXJdCgogICopIEZpeCBhIGJ1ZyBpbiBkMmlfQVNOMV9JTlRFR0VSKCkgYW5kIGkyZF9BU04xX0lOVEVHRVIoKSB3aGljaCBjYW4gbWVzcwogICAgIHVwIHRoZSBsZW5ndGggb2YgbmVnYXRpdmUgaW50ZWdlcnMuIFRoaXMgaGFzIG5vdyBiZWVuIHNpbXBsaWZpZWQgdG8ganVzdAogICAgIHN0b3JlIHRoZSBsZW5ndGggd2hlbiBpdCBpcyBmaXJzdCBkZXRlcm1pbmVkIGFuZCB1c2UgaXQgbGF0ZXIsIHJhdGhlcgogICAgIHRoYW4gdHJ5aW5nIHRvIGtlZXAgdHJhY2sgb2Ygd2hlcmUgZGF0YSBpcyBjb3BpZWQgYW5kIHVwZGF0aW5nIGl0IHRvCiAgICAgcG9pbnQgdG8gdGhlIGVuZC4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBCcmllbiBXaGVlbGVyCiAgICAgIDxid2hlZWxlckBhdXRoZW50aWNhLXNlY3VyaXR5LmNvbT5dCgogICopIEFkZCBhIG5ldyBmdW5jdGlvbiBQS0NTN19zaWduYXR1cmVWZXJpZnkuIFRoaXMgYWxsb3dzIHRoZSB2ZXJpZmljYXRpb24KICAgICBvZiBhIFBLQ1MjNyBzaWduYXR1cmUgYnV0IHdpdGggdGhlIHNpZ25pbmcgY2VydGlmaWNhdGUgcGFzc2VkIHRvIHRoZQogICAgIGZ1bmN0aW9uIGl0c2VsZi4gVGhpcyBjb250cmFzdHMgd2l0aCBQS0NTN19kYXRhVmVyaWZ5IHdoaWNoIGFzc3VtZXMgdGhlCiAgICAgY2VydGlmaWNhdGUgaXMgcHJlc2VudCBpbiB0aGUgUEtDUyM3IHN0cnVjdHVyZS4gVGhpcyBpc24ndCBhbHdheXMgdGhlCiAgICAgY2FzZTogY2VydGlmaWNhdGVzIGNhbiBiZSBvbWl0dGVkIGZyb20gYSBQS0NTIzcgc3RydWN0dXJlIGFuZCBiZQogICAgIGRpc3RyaWJ1dGVkIGJ5ICJvdXQgb2YgYmFuZCIgbWVhbnMgKHN1Y2ggYXMgYSBjZXJ0aWZpY2F0ZSBkYXRhYmFzZSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29tcGxldGUgdGhlIFBFTV8qIG1hY3JvcyB3aXRoIERFQ0xBUkVfUEVNIHZlcnNpb25zIHRvIHJlcGxhY2UgdGhlCiAgICAgZnVuY3Rpb24gcHJvdG90eXBlcyBpbiBwZW0uaCwgYWxzbyBjaGFuZ2UgdXRpbC9ta2RlZi5wbCB0byBhZGQgdGhlCiAgICAgbmVjZXNzYXJ5IGZ1bmN0aW9uIG5hbWVzLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBtazFtZi5wbCAodXNlZCBieSBXaW5kb3dzIGJ1aWxkcykgZGlkIG5vdCBwcm9wZXJseSByZWFkIHRoZQogICAgIG9wdGlvbnMgc2V0IGJ5IENvbmZpZ3VyZSBpbiB0aGUgdG9wIGxldmVsIE1ha2VmaWxlLCBhbmQgQ29uZmlndXJlCiAgICAgd2FzIG5vdCBldmVuIGFibGUgdG8gd3JpdGUgbW9yZSB0aGFuIG9uZSBvcHRpb24gY29ycmVjdGx5LgogICAgIEZpeGVkLCBub3cgIm5vLWlkZWEgbm8tcmM1IC1EQ1JZUFRPX01ERUJVRyIgZXRjLiB3b3JrcyBhcyBpbnRlbmRlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb25zIENPTkZfbG9hZF9iaW8oKSBhbmQgQ09ORl9sb2FkX2ZwKCkgdG8gYWxsb3cgYSBjb25maWcKICAgICBmaWxlIHRvIGJlIGxvYWRlZCBmcm9tIGEgQklPIG9yIEZJTEUgcG9pbnRlci4gVGhlIEJJTyB2ZXJzaW9uIHdpbGwKICAgICBmb3IgZXhhbXBsZSBhbGxvdyBtZW1vcnkgQklPcyB0byBjb250YWluIGNvbmZpZyBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiAiQ1JZUFRPX251bV9sb2NrcyIgdGhhdCByZXR1cm5zIENSWVBUT19OVU1fTE9DS1MuCiAgICAgV2hvZXZlciBob3BlcyB0byBhY2hpZXZlIHNoYXJlZC1saWJyYXJ5IGNvbXBhdGliaWxpdHkgYWNyb3NzIHZlcnNpb25zCiAgICAgbXVzdCB1c2UgdGhpcywgbm90IHRoZSBjb21waWxlLXRpbWUgbWFjcm8uCiAgICAgKEV4ZXJjaXNlIDAuOS40OiBXaGljaCBpcyB0aGUgbWluaW11bSBsaWJyYXJ5IHZlcnNpb24gcmVxdWlyZWQgYnkKICAgICBzdWNoIHByb2dyYW1zPykKICAgICBOb3RlOiBBbGwgdGhpcyBhcHBsaWVzIG9ubHkgdG8gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMsIG90aGVycyBkb24ndAogICAgIG5lZWQgbG9ja3MuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIG1pc3NpbmcgY2FzZSB0byBzM19jbG50LmMgc3RhdGUgbWFjaGluZSAtLSBvbmUgb2YgdGhlIG5ldyBTU0wgdGVzdHMKICAgICB0aHJvdWdoIGEgQklPIHBhaXIgdHJpZ2dlcmVkIHRoZSBkZWZhdWx0IGNhc2UsIGkuZS4KICAgICBTU0xlcnIoLi4uLFNTTF9SX1VOS05PV05fU1RBVEUpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyAiQklPIHBhaXIiIGNvbmNlcHQgKGNyeXB0by9iaW8vYnNzX2Jpby5jKSBzbyB0aGF0IGFwcGxpY2F0aW9ucwogICAgIGNhbiB1c2UgdGhlIFNTTCBsaWJyYXJ5IGV2ZW4gaWYgbm9uZSBvZiB0aGUgc3BlY2lmaWMgQklPcyBpcwogICAgIGFwcHJvcHJpYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBhIGJ1ZyBpbiBpMmRfRFNBUHVibGljS2V5KCkgd2hpY2ggbWVhbnQgaXQgcmV0dXJuZWQgdGhlIHdyb25nIHZhbHVlCiAgICAgZm9yIHRoZSBlbmNvZGVkIGxlbmd0aC4KICAgICBbSmVvbiBLeW91bmdIbyA8a2hqZW9uQHNkcy5zYW1zdW5nLmNvLmtyPl0KCiAgKikgQWRkIGluaXRpYWwgZG9jdW1lbnRhdGlvbiBvZiB0aGUgWDUwOVYzIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgcGFpciBvZiBmdW5jdGlvbnMgUEVNX3dyaXRlX1BLQ1M4UHJpdmF0ZUtleSgpIGFuZCAKICAgICBQRU1fd3JpdGVfYmlvX1BLQ1M4UHJpdmF0ZUtleSgpIHRoYXQgYXJlIGVxdWl2YWxlbnQgdG8KICAgICBQRU1fd3JpdGVfUHJpdmF0ZUtleSgpIGFuZCBQRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkoKSBidXQgdXNlIHRoZSBtb3JlCiAgICAgc2VjdXJlIFBLQ1MjOCBwcml2YXRlIGtleSBmb3JtYXQgd2l0aCBhIGhpZ2ggaXRlcmF0aW9uIGNvdW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBkZXRlcm1pbmF0aW9uIG9mIFBlcmwgaW50ZXJwcmV0ZXI6IEEgcGVybCBvciBwZXJsNQogICAgIF9kaXJlY3RvcnlfIGluICRQQVRIIHdhcyBhbHNvIGFjY2VwdGVkIGFzIHRoZSBpbnRlcnByZXRlci4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IGRlbW9zL3NpZ24vc2lnbi5jOiB3ZWxsIHRoZXJlIHdhc24ndCBhbnl0aGluZyBzdHJpY3RseSBzcGVha2luZwogICAgIHdyb25nIHdpdGggaXQgYnV0IGl0IHdhcyB2ZXJ5IG9sZCBhbmQgZGlkIHRoaW5ncyBsaWtlIGNhbGxpbmcKICAgICBQRU1fQVNOMV9yZWFkKCkgZGlyZWN0bHkgYW5kIHVzZWQgTUQ1IGZvciB0aGUgaGFzaCBub3QgdG8gbWVudGlvbiBzb21lCiAgICAgdW51c3VhbCBmb3JtYXR0aW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBkZW1vcy9zZWxmc2lnbi5jOiBpdCB1c2VkIG9ic29sZXRlIGFuZCBkZWxldGVkIGZ1bmN0aW9ucywgY2hhbmdlZAogICAgIHRvIHVzZSB0aGUgbmV3IGV4dGVuc2lvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCB0aGUgUEVNX3JlYWQvUEVNX3dyaXRlIGZ1bmN0aW9ucyBpbiBjcnlwdG8vcGVtL3BlbV9hbGwuYwogICAgIHdpdGggbWFjcm9zLiBUaGlzIHNob3VsZCBtYWtlIGl0IGVhc2llciB0byBjaGFuZ2UgdGhlaXIgZm9ybSwgYWRkIGV4dHJhCiAgICAgYXJndW1lbnRzIGV0Yy4gRml4IGEgZmV3IFBFTSBwcm90b3R5cGVzIHdoaWNoIGRpZG4ndCBoYXZlIGNpcGhlciBhcyBhCiAgICAgY29uc3RhbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRvIGNvbmZpZ3VyYXRpb24gdGFibGUgYSBuZXcgZW50cnkgdGhhdCBjYW4gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZQogICAgIG5hbWUgZm9yIHVuaXN0ZC5oIChmb3IgcHJlLVBPU0lYIHN5c3RlbXMpOyB3ZSBuZWVkIHRoaXMgZm9yIE5lWFRzdGVwLAogICAgIGFjY29yZGluZyB0byBNYXJrIENyaXNwaW4gPE1SQ0BQYW5kYS5DT00+LgogICAgIFtCb2RvIE1vZWxsZXJdCgojaWYgMAogICopIERFUyBDQkMgZGlkIG5vdCB1cGRhdGUgdGhlIElWLiBXZWlyZC4KICAgICBbQmVuIExhdXJpZV0KI2Vsc2UKICAgICBkZXNfY2JjX2VuY3J5cHQgZG9lcyBub3QgdXBkYXRlIHRoZSBJViwgYnV0IGRlc19uY2JjX2VuY3J5cHQgZG9lcy4KICAgICBDaGFuZ2luZyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBmb3JtZXIgbWlnaHQgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgLS0KICAgICB3aGVyZSBJViB1cGRhdGluZyBpcyBuZWVkZWQsIGRlc19uY2JjX2VuY3J5cHQgY2FuIGJlIHVzZWQuCiNlbmRpZgoKICAqKSBXaGVuIGJudGVzdCBpcyBydW4gZnJvbSAibWFrZSB0ZXN0IiBpdCBkcml2ZXMgYmMgdG8gY2hlY2sgaXRzCiAgICAgY2FsY3VsYXRpb25zLCBhcyB3ZWxsIGFzIGludGVybmFsbHkgY2hlY2tpbmcgdGhlbS4gSWYgYW4gaW50ZXJuYWwgY2hlY2sKICAgICBmYWlscywgaXQgbmVlZHMgdG8gY2F1c2UgYmMgdG8gZ2l2ZSBhIG5vbi16ZXJvIHJlc3VsdCBvciBtYWtlIHRlc3QgY2FycmllcwogICAgIG9uIHdpdGhvdXQgbm90aWNpbmcgdGhlIGZhaWx1cmUuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBERVMgbGlicmFyeSBjbGVhbnVwcy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFBLQ1MjNSB2Mi4wIFBCRSBhbGdvcml0aG1zLiBUaGlzIHdpbGwgcGVybWl0IFBLQ1MjOCB0byBiZQogICAgIHVzZWQgd2l0aCBhbnkgY2lwaGVyIHVubGlrZSBQS0NTIzUgdjEuNSB3aGljaCBjYW4gYXQgbW9zdCBoYW5kbGUgNjQgYml0CiAgICAgY2lwaGVycy4gTk9URTogYWx0aG91Z2ggdGhlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIGhhcyBiZWVuIHZlcmlmaWVkCiAgICAgYWdhaW5zdCBzb21lIHB1Ymxpc2hlZCB0ZXN0IHZlY3RvcnMgaXQgaGFzIG5vdCBiZWVuIGV4dGVuc2l2ZWx5IHRlc3RlZAogICAgIHlldC4gQWRkZWQgYSAtdjIgImNpcGhlciIgb3B0aW9uIHRvIHBrY3M4IGFwcGxpY2F0aW9uIHRvIGFsbG93IHRoZSB1c2UKICAgICBvZiB2Mi4wLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluc3RlYWQgb2YgIm1rZGlyIC1wIiwgd2hpY2ggaXMgbm90IGZ1bGx5IHBvcnRhYmxlLCB1c2UgbmV3CiAgICAgUGVybCBzY3JpcHQgInV0aWwvbWtkaXItcC5wbCIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmV3cml0ZSB0aGUgd2F5IHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gKFBCRSkgaXMgaGFuZGxlZC4gSXQgdXNlZCB0bwogICAgIGFzc3VtZSB0aGF0IHRoZSBBU04xIEFsZ29yaXRobUlkZW50aWZpZXIgcGFyYW1ldGVyIHdhcyBhIFBCRVBhcmFtZXRlcgogICAgIHN0cnVjdHVyZS4gVGhpcyB3YXMgdHJ1ZSBmb3IgdGhlIFBLQ1MjNSB2MS41IGFuZCBQS0NTIzEyIFBCRSBhbGdvcml0aG1zCiAgICAgYnV0IGRvZXNuJ3QgYXBwbHkgdG8gUEtDUyM1IHYyLjAgd2hlcmUgaXQgY2FuIGJlIHNvbWV0aGluZyBlbHNlLiBOb3cKICAgICB0aGUgJ3BhcmFtZXRlcicgZmllbGQgb2YgdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgaXMgcGFzc2VkIHRvIHRoZQogICAgIHVuZGVybHlpbmcga2V5IGdlbmVyYXRpb24gZnVuY3Rpb24gc28gaXQgbXVzdCBkbyBpdHMgb3duIEFTTjEgcGFyc2luZy4KICAgICBUaGlzIGhhcyBhbHNvIGNoYW5nZWQgdGhlIEVWUF9QQkVfQ2lwaGVySW5pdCgpIGZ1bmN0aW9uIHdoaWNoIG5vdyBoYXMgYQogICAgICdwYXJhbWV0ZXInIGFyZ3VtZW50IGluc3RlYWQgb2YgbGl0ZXJhbCBzYWx0IGFuZCBpdGVyYXRpb24gY291bnQgdmFsdWVzCiAgICAgYW5kIHRoZSBmdW5jdGlvbiBFVlBfUEJFX0FMR09SX0NpcGhlckluaXQoKSBoYXMgYmVlbiBkZWxldGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIFBLQ1MjNSB2MS41IGNvbXBhdGlibGUgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiBhbGdvcml0aG1zCiAgICAgYW5kIFBLQ1MjOCBmdW5jdGlvbmFsaXR5LiBOZXcgJ3BrY3M4JyBhcHBsaWNhdGlvbiBsaW5rZWQgdG8gb3BlbnNzbC4KICAgICBOZWVkZWQgdG8gY2hhbmdlIHRoZSBQRU1fU1RSSU5HX0VWUF9QS0VZIHZhbHVlIHdoaWNoIHdhcyBqdXN0ICJQUklWQVRFCiAgICAgS0VZIiBiZWNhdXNlIHRoaXMgY2xhc2hlZCB3aXRoIFBLQ1MjOCB1bmVuY3J5cHRlZCBzdHJpbmcuIFNpbmNlIHRoaXMKICAgICB2YWx1ZSB3YXMganVzdCB1c2VkIGFzIGEgIm1hZ2ljIHN0cmluZyIgYW5kIG5vdCB1c2VkIGRpcmVjdGx5IGl0cwogICAgIHZhbHVlIGRvZXNuJ3QgbWF0dGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEludHJvZHVjZSBzb21lIHNlbWJsYW5jZSBvZiBjb25zdCBjb3JyZWN0bmVzcyB0byBCTi4gU2hhbWUgQyBkb2Vzbid0CiAgICAgc3VwcG9ydCBtdXRhYmxlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSAibGludXgtc3BhcmM2NCIgY29uZmlndXJhdGlvbiAodWx0cmFwZW5ndWluKS4KICAgICBbUmF5IE1pbGxlciA8cmF5Lm1pbGxlckBvdWNzLm94LmFjLnVrPl0KICAgICAibGludXgtc3BhcmMiIGNvbmZpZ3VyYXRpb24uCiAgICAgW0NocmlzdGlhbiBGb3JzdGVyIDxmb0BoYXdvLnN0dy51bmktZXJsYW5nZW4uZGU+XQoKICAqKSBjb25maWcgbm93IGdlbmVyYXRlcyBuby14eHggb3B0aW9ucyBmb3IgbWlzc2luZyBjaXBoZXJzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTdXBwb3J0IHRoZSBFQkNESUMgY2hhcmFjdGVyIHNldCAod29yayBpbiBwcm9ncmVzcykuCiAgICAgRmlsZSBlYmNkaWMuYyBub3QgeWV0IGluY2x1ZGVkIGJlY2F1c2UgaXQgaGFzIGEgZGlmZmVyZW50IGxpY2Vuc2UuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBTdXBwb3J0IEJTMjAwMC9PU0QtUE9TSVguCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBNYWtlIGNhbGxiYWNrcyBmb3Iga2V5IGdlbmVyYXRpb24gdXNlIHZvaWQgKiBpbnN0ZWFkIG9mIGNoYXIgKi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBTL01JTUUgc2FtcGxlcyBjb21waWxlIChub3QgeWV0IHRlc3RlZCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZGl0aW9uYWwgdHlwZXNhZmUgc3RhY2tzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBOZXcgY29uZmlndXJhdGlvbiB2YXJpYW50cyAiYnNkaS1lbGYtZ2NjIiAoQlNEL09TIDQueCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4zIGFuZCAwLjkuM2EgIFsyOSBNYXkgMTk5OV0KCiAgKikgTmV3IGNvbmZpZ3VyYXRpb24gdmFyaWFudCAic2NvNS1nY2MiLgoKICAqKSBVcGRhdGVkIHNvbWUgZGVtb3MuCiAgICAgW1NlYW4gTyBSaW9yZGFpbiwgV2FkZSBTY2hvbGluZV0KCiAgKikgQWRkIG1pc3NpbmcgQklPX2ZyZWUgYXQgZXhpdCBvZiBwa2NzMTIgYXBwbGljYXRpb24uCiAgICAgW1d1IFpoaWdhbmddCgogICopIEZpeCBtZW1vcnkgbGVhayBpbiBjb25mLmMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlcyBmb3IgV2luMzIgdG8gYXNzZW1ibGVyIHZlcnNpb24gb2YgTUQ1LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNldCAjISBwYXRoIHRvIHBlcmwgaW4gYXBwcy9kZXJfY2hvcCB0byB3aGVyZSB3ZSBmb3VuZCBpdAogICAgIGluc3RlYWQgb2YgdXNpbmcgYSBmaXhlZCBwYXRoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFNIQSBsaWJyYXJ5IGNoYW5nZXMgZm9yIGlyaXg2NC1taXBzNC1jYy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgSW1wcm92ZW1lbnRzIGZvciBWTVMgc3VwcG9ydC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjJiIGFuZCAwLjkuMyAgWzI0IE1heSAxOTk5XQoKICAqKSBCaWdudW0gbGlicmFyeSBidWcgZml4LiBJUklYIDYgcGFzc2VzICJtYWtlIHRlc3QiIG5vdyEKICAgICBUaGlzIGFsc28gYXZvaWRzIHRoZSBwcm9ibGVtcyB3aXRoIFNDNC4yIGFuZCB1bnBhdGNoZWQgU0M1LiAgCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBza19udW0sIHNrX3ZhbHVlIGFuZCBza19zZXQgdG8gcmVwbGFjZSB0aGUgcHJldmlvdXMgbWFjcm9zLgogICAgIFRoZXNlIGFyZSByZXF1aXJlZCBiZWNhdXNlIG9mIHRoZSB0eXBlc2FmZSBzdGFjayB3b3VsZCBvdGhlcndpc2UgYnJlYWsgCiAgICAgZXhpc3RpbmcgY29kZS4gSWYgb2xkIGNvZGUgdXNlZCBhIHN0cnVjdHVyZSBtZW1iZXIgd2hpY2ggdXNlZCB0byBiZSBTVEFDSwogICAgIGFuZCBpcyBub3cgU1RBQ0tfT0YgKGZvciBleGFtcGxlIGNlcnQgaW4gYSBQS0NTN19TSUdORUQgc3RydWN0dXJlKSB3aXRoCiAgICAgc2tfbnVtIG9yIHNrX3ZhbHVlIGl0IHdvdWxkIHByb2R1Y2UgYW4gZXJyb3IgYmVjYXVzZSB0aGUgbnVtLCBkYXRhIG1lbWJlcnMKICAgICBhcmUgbm90IHByZXNlbnQgaW4gU1RBQ0tfT0YuIE5vdyBpdCBqdXN0IHByb2R1Y2VzIGEgd2FybmluZy4gc2tfc2V0CiAgICAgcmVwbGFjZXMgdGhlIG9sZCBtZXRob2Qgb2YgYXNzaWduaW5nIGEgdmFsdWUgdG8gc2tfdmFsdWUKICAgICAoZS5nLiBza192YWx1ZSh4LCBpKSA9IHkpIHdoaWNoIHRoZSBsaWJyYXJ5IHVzZWQgaW4gYSBmZXcgY2FzZXMuIEFueSBjb2RlCiAgICAgdGhhdCBkb2VzIHRoaXMgd2lsbCBubyBsb25nZXIgd29yayAoYW5kIHNob3VsZCB1c2Ugc2tfc2V0IGluc3RlYWQpIGJ1dAogICAgIHRoaXMgY291bGQgYmUgcmVnYXJkZWQgYXMgYSAicXVlc3Rpb25hYmxlIiBiZWhhdmlvdXIgYW55d2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBtb3N0IG9mIHRoZSBvdGhlciBQS0NTIzcgYnVncy4gVGhlICJleHBlcmltZW50YWwiIGNvZGUgY2FuIG5vdwogICAgIGNvcnJlY3RseSBoYW5kbGUgZW5jcnlwdGVkIFMvTUlNRSBkYXRhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0eXBlIG9mIHZhcmlvdXMgREVTIGZ1bmN0aW9uIGFyZ3VtZW50cyBmcm9tIGRlc19jYmxvY2sKICAgICAod2hpY2ggbWVhbnMsIGluIGZ1bmN0aW9uIGFyZ3VtZW50IGRlY2xhcmF0aW9ucywgcG9pbnRlciB0byBjaGFyKQogICAgIHRvIGRlc19jYmxvY2sgKiAobWVhbmluZyBwb2ludGVyIHRvIGFycmF5IHdpdGggOCBjaGFyIGVsZW1lbnRzKSwKICAgICB3aGljaCBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGRvIG1vcmUgdHlwZWNoZWNraW5nOyBpdCB3YXMgbGlrZQogICAgIHRoYXQgYmFjayBpbiBTU0xlYXksIGJ1dCB3aXRoIGxvdHMgb2YgdWdseSBjYXN0cy4KCiAgICAgSW50cm9kdWNlIG5ldyB0eXBlIGNvbnN0X2Rlc19jYmxvY2suCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVvcmdhbmlzZSB0aGUgUEtDUyM3IGxpYnJhcnkgYW5kIGdldCByaWQgb2Ygc29tZSBvZiB0aGUgbW9yZSBvYnZpb3VzCiAgICAgcHJvYmxlbXM6IGZpbmQgUmVjaXBpZW50SW5mbyBzdHJ1Y3R1cmUgdGhhdCBtYXRjaGVzIHJlY2lwaWVudCBjZXJ0aWZpY2F0ZQogICAgIGFuZCBpbml0aWFsaXNlIHRoZSBBU04xIHN0cnVjdHVyZXMgcHJvcGVybHkgYmFzZWQgb24gcGFzc2VkIGNpcGhlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCZWxhdGVkbHkgbWFrZSB0aGUgQk4gdGVzdHMgYWN0dWFsbHkgY2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCB0aGUgZW5jb2RpbmcgYW5kIGRlY29kaW5nIG9mIG5lZ2F0aXZlIEFTTjEgSU5URUdFUlMgYW5kIGNvbnZlcnNpb24KICAgICB0byBhbmQgZnJvbSBCTnM6IGl0IHdhcyBjb21wbGV0ZWx5IGJyb2tlbi4gTmV3IGNvbXBpbGF0aW9uIG9wdGlvbgogICAgIE5FR19QVUJLRVlfQlVHIHRvIGFsbG93IGZvciBzb21lIGJyb2tlbiBjZXJ0aWZpY2F0ZXMgdGhhdCBlbmNvZGUgcHVibGljCiAgICAga2V5IGVsZW1lbnRzIGFzIG5lZ2F0aXZlIGludGVnZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pemUgYW5kIHNwZWVkIHVwIE1ENS4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBWTVMgc3VwcG9ydC4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPl0KCiAgKikgTmV3IG9wdGlvbiAtb3V0IHRvIGFzbjFwYXJzZSB0byBhbGxvdyB0aGUgcGFyc2VkIHN0cnVjdHVyZSB0byBiZQogICAgIG91dHB1dCB0byBhIGZpbGUuIFRoaXMgaXMgbW9zdCB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSAtc3RycGFyc2UKICAgICBvcHRpb24gdG8gZXhhbWluZSB0aGUgb3V0cHV0IG9mIHRoaW5ncyBsaWtlIE9DVEVUIFNUUklOR1MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBTU0wgbGlicmFyeSBhIGxpdHRsZSBtb3JlIGZvb2wtcHJvb2YgYnkgbm90IHJlcXVpcmluZyBhbnkgbG9uZ2VyCiAgICAgdGhhdCBTU0xfc2V0X3thY2NlcHQsY29ubmVjdH1fc3RhdGUgYmUgY2FsbGVkIGJlZm9yZQogICAgIFNTTF97YWNjZXB0LGNvbm5lY3R9IG1heSBiZSB1c2VkIChTU0xfc2V0Xy4uLl9zdGF0ZSBpcyBvbWl0dGVkCiAgICAgaW4gbWFueSBhcHBsaWNhdGlvbnMgYmVjYXVzZSB1c3VhbGx5IGV2ZXJ5dGhpbmcgKmFwcGVhcmVkKiB0byB3b3JrIGFzCiAgICAgaW50ZW5kZWQgYW55d2F5IC0tIG5vdyBpdCByZWFsbHkgd29ya3MgYXMgaW50ZW5kZWQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vdmUgb3BlbnNzbC5jbmYgb3V0IG9mIGxpYi8uCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCB2YXJpb3VzIHRoaW5ncyB0byBsZXQgT3BlblNTTCBldmVuIHBhc3MgYGBlZ2NjIC1waXBlIC1PMiAtV2FsbAogICAgIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtV2Nhc3QtYWxpZ24gLVdtaXNzaW5nLXByb3RvdHlwZXMKICAgICAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbmVzdGVkLWV4dGVybnMgLVdpbmxpbmUnJyB3aXRoIEVHQ1MgMS4xLjIrIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBWYXJpb3VzIGZpeGVzIHRvIHRoZSBFVlAgYW5kIFBLQ1MjNyBjb2RlLiBJdCBtYXkgbm93IGJlIGFibGUgdG8KICAgICBoYW5kbGUgUEtDUyM3IGVudmVsb3BlZCBkYXRhIHByb3Blcmx5LgogICAgIFtTZWJhc3RpYW4gQWtlcm1hbiA8c2FrQHBhcmFsbGVsY29uc3VsdGluZy5jb20+LCBtb2RpZmllZCBieSBTdGV2ZV0KCiAgKikgQ3JlYXRlIGEgZHVwbGljYXRlIG9mIHRoZSBTU0xfQ1RYJ3MgQ0VSVCBpbiBTU0xfbmV3IGluc3RlYWQgb2YKICAgICBjb3B5aW5nIHBvaW50ZXJzLiAgVGhlIGNlcnRfc3QgaGFuZGxpbmcgaXMgY2hhbmdlZCBieSB0aGlzIGluCiAgICAgdmFyaW91cyB3YXlzIChhbmQgdGh1cyB3aGF0IHVzZWQgdG8gYmUga25vd24gYXMgY3R4LT5kZWZhdWx0X2NlcnQKICAgICBpcyBub3cgY2FsbGVkIGN0eC0+Y2VydCwgc2luY2Ugd2UgZG9uJ3QgcmVzb3J0IHRvIHMtPmN0eC0+W2RlZmF1bHRfXWNlcnQKICAgICBhbnkgbG9uZ2VyIHdoZW4gcy0+Y2VydCBkb2VzIG5vdCBnaXZlIHVzIHdoYXQgd2UgbmVlZCkuCiAgICAgc3NsX2NlcnRfaW5zdGFudGlhdGUgYmVjb21lcyBvYnNvbGV0ZSBieSB0aGlzIGNoYW5nZS4KICAgICBBcyBzb29uIGFzIHdlJ3ZlIGdvdCB0aGUgbmV3IGNvZGUgcmlnaHQgKHBvc3NpYmx5IGl0IGFscmVhZHkgaXM/KSwKICAgICB3ZSBoYXZlIHNvbHZlZCBhIGNvdXBsZSBvZiBidWdzIG9mIHRoZSBlYXJsaWVyIGNvZGUgd2hlcmUgcy0+Y2VydAogICAgIHdhcyB1c2VkIGFzIGlmIGl0IGNvdWxkIG5vdCBoYXZlIGJlZW4gc2hhcmVkIHdpdGggb3RoZXIgU1NMIHN0cnVjdHVyZXMuCgogICAgIE5vdGUgdGhhdCB1c2luZyB0aGUgU1NMIEFQSSBpbiBjZXJ0YWluIGRpcnR5IHdheXMgbm93IHdpbGwgcmVzdWx0CiAgICAgaW4gZGlmZmVyZW50IGJlaGF2aW91ciB0aGFuIG9ic2VydmVkIHdpdGggZWFybGllciBsaWJyYXJ5IHZlcnNpb25zOgogICAgIENoYW5naW5nIHNldHRpbmdzIGZvciBhbiBTU0xfQ1RYICpjdHggYWZ0ZXIgaGF2aW5nIGRvbmUgcyA9IFNTTF9uZXcoY3R4KQogICAgIGRvZXMgbm90IGluZmx1ZW5jZSBzIGFzIGl0IHVzZWQgdG8uCiAgICAgCiAgICAgSW4gb3JkZXIgdG8gY2xlYW4gdXAgdGhpbmdzIG1vcmUgdGhvcm91Z2hseSwgaW5zaWRlIFNTTF9TRVNTSU9OCiAgICAgd2UgZG9uJ3QgdXNlIENFUlQgYW55IGxvbmdlciwgYnV0IGEgbmV3IHN0cnVjdHVyZSBTRVNTX0NFUlQKICAgICB0aGF0IGhvbGRzIHBlci1zZXNzaW9uIGRhdGEgKGlmIGF2YWlsYWJsZSk7IGN1cnJlbnRseSwgdGhpcyBpcwogICAgIHRoZSBwZWVyJ3MgY2VydGlmaWNhdGUgY2hhaW4gYW5kLCBmb3IgY2xpZW50cywgdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlCiAgICAgYW5kIHRlbXBvcmFyeSBrZXkuICBDRVJUIGhvbGRzIG9ubHkgdGhvc2UgdmFsdWVzIHRoYXQgY2FuIGhhdmUKICAgICBtZWFuaW5nZnVsIGRlZmF1bHRzIGluIGFuIFNTTF9DVFguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlWM19FWFRfaTJkKCkgdG8gY3JlYXRlIGFuIFg1MDlfRVhURU5TSU9OIHN0cnVjdHVyZQogICAgIGZyb20gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiBWYXJpb3VzIFBLQ1MjNyBmaXhlczogcmVtb3ZlIHNvbWUKICAgICBldmlsIGNhc3RzIGFuZCBzZXQgdGhlIGVuY19kaWdfYWxnIGZpZWxkIHByb3Blcmx5IGJhc2VkIG9uIHRoZSBzaWduaW5nCiAgICAga2V5IHR5cGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgUEtDUyMxMiBwYXNzd29yZCB0byBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIHRoZQogICAgIGVudmlyb25tZW50LiBMZXQgJ2NhJyBnZXQgaXRzIGNvbmZpZyBmaWxlIG5hbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQKICAgICB2YXJpYWJsZXMgIk9QRU5TU0xfQ09ORiIgb3IgIlNTTEVBWV9DT05GIiAoZm9yIGNvbnNpc3RlbmN5IHdpdGggJ3JlcScKICAgICBhbmQgJ3g1MDknKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBjZXJ0aWZpY2F0ZSBwb2xpY2llcyBleHRlbnNpb24gdG8gdXNlIGFuIElBNVNUUklORyBmb3IgdGhlCiAgICAgb3JnYW5pemF0aW9uIGZpZWxkLiBUaGlzIGlzIGNvbnRyYXJ5IHRvIHRoZSBQS0lYIGRlZmluaXRpb24gYnV0CiAgICAgVmVyaVNpZ24gdXNlcyBpdCBhbmQgSUU1IG9ubHkgcmVjb2duaXNlcyB0aGlzIGZvcm0uIERvY3VtZW50ICd4NTA5JwogICAgIGV4dGVuc2lvbiBvcHRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIFBFREFOVElDIGNvbXBpbGVyIGZsYWcgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBnY2MgLXBlZGFudGljLAogICAgIHdpdGhvdXQgZGlzYWxsb3dpbmcgaW5saW5lIGFzc2VtYmxlciBhbmQgdGhlIGxpa2UgZm9yIG5vbi1wZWRhbnRpYyBidWlsZHMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFN1cHBvcnQgQm9ybGFuZCBDKysgYnVpbGRlci4KICAgICBbSmFuZXogSmVyZSA8ampAdm9pZC5zaT4sIG1vZGlmaWVkIGJ5IFVsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgTWluZ3czMi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU0hBLTEgY2xlYW51cHMgYW5kIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cy4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBTcGFyYyB2OHBsdXMgYXNzZW1ibGVyIGZvciB0aGUgYmlnbnVtIGxpYnJhcnkuCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgQWNjZXB0IGFueSAteHh4IGFuZCAreHh4IGNvbXBpbGVyIG9wdGlvbnMgaW4gQ29uZmlndXJlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBVcGRhdGUgSFBVWCBjb25maWd1cmF0aW9uLgogICAgIFtBbm9ueW1vdXNdCiAgCiAgKikgQWRkIG1pc3Npbmcgc2tfPHR5cGU+X3Vuc2hpZnQoKSBmdW5jdGlvbiB0byBzYWZlc3RhY2suaAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBOZXcgZnVuY3Rpb24gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSB0aGF0IHNldHMgdGhlCiAgICAgImV4dHJhX2NlcnQicyBpbiBhZGRpdGlvbiB0byB0aGUgY2VydGlmaWNhdGUuICAoVGhpcyBtYWtlcyBzZW5zZQogICAgIG9ubHkgZm9yICJQRU0iIGZvcm1hdCBmaWxlcywgYXMgY2hhaW5zIGFzIGEgd2hvbGUgYXJlIG5vdAogICAgIERFUi1lbmNvZGVkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdXBwb3J0IHZlcmlmeV9kZXB0aCBmcm9tIHRoZSBTU0wgQVBJLgogICAgIHg1MDlfdmZ5LmMgaGFkIHdoYXQgY2FuIGJlIGNvbnNpZGVyZWQgYW4gb2ZmLWJ5LW9uZS1lcnJvcjoKICAgICBJdHMgZGVwdGggKHdoaWNoIHdhcyBub3QgcGFydCBvZiB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlKQogICAgIHdhcyBhY3R1YWxseSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGNlcnRpZmljYXRlcyBpbiBhIGNoYWluOwogICAgIG5vdyBpdCByZWFsbHkgY291bnRzIHRoZSBkZXB0aC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXggaW4gY3J5cHRvL3g1MDkveDUwOV9jbXAuYzogVGhlIFNTTGVyciBtYWNybyB3YXMgdXNlZAogICAgIGluc3RlYWQgb2YgWDUwOWVyciwgd2hpY2ggb2Z0ZW4gcmVzdWx0ZWQgaW4gY29uZnVzaW5nIGVycm9yCiAgICAgbWVzc2FnZXMgc2luY2UgdGhlIGVycm9yIGNvZGVzIGFyZSBub3QgZ2xvYmFsbHkgdW5pcXVlCiAgICAgKGUuZy4gYW4gYWxsZWdlZCBlcnJvciBpbiBzc2wzX2FjY2VwdCB3aGVuIGEgY2VydGlmaWNhdGUKICAgICBkaWRuJ3QgbWF0Y2ggdGhlIHByaXZhdGUga2V5KS4KCiAgKikgTmV3IGZ1bmN0aW9uIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dCB0aGF0IGFsbG93cyB0byBzZXQgYSBkZWZhdWx0CiAgICAgdmFsdWUgKHNvIHRoYXQgeW91IGRvbid0IG5lZWQgU1NMX3NldF9zZXNzaW9uX2lkX2NvbnRleHQgZm9yIGVhY2gKICAgICBjb25uZWN0aW9uIHVzaW5nIHRoZSBTU0xfQ1RYKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBPQUVQIGRlY29kaW5nIGJ1ZyBmaXguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgSU5TVEFMTF9QUkVGSVggZm9yIHBhY2thZ2UgYnVpbGRlcnMsIGFzIHByb3Bvc2VkIGJ5CiAgICAgRGF2aWQgSGFycmlzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9ucyAidGhyZWFkcyIgYW5kICJuby10aHJlYWRzIi4gIEZvciBzeXN0ZW1zCiAgICAgd2hlcmUgdGhlIHByb3BlciBjb21waWxlciBvcHRpb25zIGFyZSBrbm93biAoY3VycmVudGx5IFNvbGFyaXMKICAgICBhbmQgTGludXgpLCAidGhyZWFkcyIgaXMgdGhlIGRlZmF1bHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IHNjcmlwdCB1dGlsL21rbGluay5wbCBhcyBhIGZhc3RlciBzdWJzdGl0dXRlIGZvciB1dGlsL21rbGluay5zaC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbnN0YWxsIHZhcmlvdXMgc2NyaXB0cyB0byAkKE9QRU5TU0xESVIpL21pc2MsIG5vdCB0bwogICAgICQoSU5TVEFMTFRPUCkvYmluIC0tIHRoZXkgc2hvdWxkbid0IGNsdXR0ZXIgZGlyZWN0b3JpZXMKICAgICBzdWNoIGFzIC91c3IvbG9jYWwvYmluLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopICJtYWtlIGxpbnV4LXNoYXJlZCIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KICAgICBbTmllbHMgUG9wcGUgPG5pZWxzQG5ldGJveC5vcmc+XQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbiBuby08Y2lwaGVyPiAocnNhLCBpZGVhLCByYzUsIC4uLikuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCB0aGUgUEtDUyMxMiBBUEkgZG9jdW1lbnRhdGlvbiB0byBvcGVuc3NsLnR4dC4gUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IKICAgICBleHRlbnNpb24gYWRkaW5nIGluIHg1MDkgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgTk9QUk9UTyBzZWN0aW9ucyBhbmQgZXJyb3IgY29kZSBjb21tZW50cy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgUGFydGlhbCByZXdyaXRlIG9mIHRoZSBERUYgZmlsZSBnZW5lcmF0b3IgdG8gbm93IHBhcnNlIHRoZSBBTlNJCiAgICAgcHJvdG90eXBlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbnMgLS1wcmVmaXg9RElSIGFuZCAtLW9wZW5zc2xkaXI9RElSLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDb21wbGV0ZSByZXdyaXRlIG9mIHRoZSBlcnJvciBjb2RlIHNjcmlwdChzKS4gSXQgaXMgYWxsIG5vdyBoYW5kbGVkCiAgICAgYnkgb25lIHNjcmlwdCBhdCB0aGUgdG9wIGxldmVsIHdoaWNoIGhhbmRsZXMgZXJyb3IgY29kZSBnYXRoZXJpbmcsCiAgICAgaGVhZGVyIHJld3JpdGluZyBhbmQgQyBzb3VyY2UgZmlsZSBnZW5lcmF0aW9uLiBJdCBzaG91bGQgYmUgbXVjaCBiZXR0ZXIKICAgICB0aGFuIHRoZSBvbGQgbWV0aG9kOiBpdCBub3cgdXNlcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgVWxmJ3MgcGFyc2VyIHRvCiAgICAgcmVhZCB0aGUgQU5TSSBwcm90b3R5cGVzIGluIGFsbCBoZWFkZXIgZmlsZXMgKHRodXMgdGhlIG9sZCBLJlIgZGVmaW5pdGlvbnMKICAgICBhcmVuJ3QgbmVlZGVkIGZvciBlcnJvciBjcmVhdGlvbiBhbnkgbW9yZSkgYW5kIGRvIGEgYmV0dGVyIGpvYiBvZgogICAgIHRyYW5zbGF0aW5nIGZ1bmN0aW9uIGNvZGVzIGludG8gbmFtZXMuIFRoZSBvbGQgJ0FTTjEgZXJyb3IgY29kZSBpbWJlZGRlZAogICAgIGluIGEgY29tbWVudCcgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSBhbmQgaXQgZG9lc24ndCB1c2UgLmVyciBmaWxlcyB3aGljaAogICAgIGhhdmUgbm93IGJlZW4gZGVsZXRlZC4gQWxzbyB0aGUgZXJyb3IgY29kZSBjYWxsIGRvZXNuJ3QgaGF2ZSB0byBhcHBlYXIgYWxsCiAgICAgb24gb25lIGxpbmUgKHdoaWNoIHJlc3VsdGVkIGluIHNvbWUgbGFyZ2UgbGluZXMuLi4pLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSAjaW5jbHVkZSBmaWxlbmFtZXMgZnJvbSA8Zm9vLmg+IHRvIDxvcGVuc3NsL2Zvby5oPi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgYmVoYXZpb3VyIG9mIHNzbDJfcmVhZCB3aGVuIGZhY2luZyBsZW5ndGgtMCBwYWNrZXRzOiBEb24ndCByZXR1cm4KICAgICAwICh3aGljaCB1c3VhbGx5IGluZGljYXRlcyBhIGNsb3NlZCBjb25uZWN0aW9uKSwgYnV0IGNvbnRpbnVlIHJlYWRpbmcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHNvbWUgcmFjZSBjb25kaXRpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBDUkwgZGlzdHJpYnV0aW9uIHBvaW50cyBleHRlbnNpb24uIEFkZCBDZXJ0aWZpY2F0ZQogICAgIFBvbGljaWVzIGFuZCBDUkwgZGlzdHJpYnV0aW9uIHBvaW50cyBkb2N1bWVudGF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgdGhlIGF1dG9nZW5lcmF0ZWQgaGVhZGVyIGZpbGUgcGFydHMgdG8gY3J5cHRvL29wZW5zc2xjb25mLmguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBuZXcgNTYtYml0IERFUyBleHBvcnQgY2lwaGVyc3VpdGVzOiB0aGV5IHdlcmUgdXNpbmcgNyBieXRlcyBpbnN0ZWFkIG9mCiAgICAgOCBvZiBrZXlpbmcgbWF0ZXJpYWwuIE1lcmxpbiBoYXMgYWxzbyBjb25maXJtZWQgaW50ZXJvcCB3aXRoIHRoaXMgZml4CiAgICAgYmV0d2VlbiBPcGVuU1NMIGFuZCBCYWx0aW1vcmUgQy9TU0wgMi4wIGFuZCBKL1NTTCAyLjAuCiAgICAgW01lcmxpbiBIdWdoZXMgPG1lcmxpbkBiYWx0aW1vcmUuaWU+XQoKICAqKSBGaXggbG90cyBvZiB3YXJuaW5ncy4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KIAogICopIEluIGFkZF9jZXJ0X2RpcigpIGluIGNyeXB0by94NTA5L2J5X2Rpci5jLCBicmVhayBvdXQgb2YgdGhlIGxvb3AgaWYKICAgICB0aGUgZGlyZWN0b3J5IHNwZWMgZGlkbid0IGVuZCB3aXRoIGEgTElTVF9TRVBBUkFUT1JfQ0hBUi4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KIAogICopIEZpeCBwcm9ibGVtcyB3aXRoIHNpemVvZihsb25nKSA9PSA4LgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIENoYW5nZSBmdW5jdGlvbnMgdG8gQU5TSSBDLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggdHlwb3MgaW4gZXJyb3IgY29kZXMuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+LCBVbGYgTfZsbGVyXQoKICAqKSBSZW1vdmUgZGVmdW5jdCBhc3NlbWJsZXIgZmlsZXMgZnJvbSBDb25maWd1cmUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFNQQVJDIHY4IGFzc2VtYmxlciBCSUdOVU0gaW1wbGVtZW50YXRpb24uCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgU3VwcG9ydCBmb3IgQ2VydGlmaWNhdGUgUG9saWNpZXMgZXh0ZW5zaW9uOiBib3RoIHByaW50IGFuZCBzZXQuCiAgICAgVmFyaW91cyBhZGRpdGlvbnMgdG8gc3VwcG9ydCB0aGUgcjJpIG1ldGhvZCB0aGlzIHVzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQSBsb3Qgb2YgY29uc3RpZmljYXRpb24sIGFuZCBmaXggYSBidWcgaW4gWDUwOV9OQU1FX29uZWxpbmUoKSB0aGF0IGNvdWxkCiAgICAgcmV0dXJuIGEgY29uc3Qgc3RyaW5nIHdoZW4geW91IGFyZSBleHBlY3RpbmcgYW4gYWxsb2NhdGVkIGJ1ZmZlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEFTTjEgdHlwZXMgVVRGOFN0cmluZyBhbmQgVklTSUJMRVNUUklORywgYWxzbyB0aGUgQ0hPSUNFCiAgICAgdHlwZXMgRGlyZWN0b3J5U3RyaW5nIGFuZCBEaXNwbGF5VGV4dC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29kZSB0byBhbGxvdyByMmkgZXh0ZW5zaW9ucyB0byBhY2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UsCiAgICAgYWRkIGFuIExIQVNIIGRhdGFiYXNlIGRyaXZlciBhbmQgYWRkIHNldmVyYWwgY3R4IGhlbHBlciBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGFuIGV2aWwgYnVnIGluIGJuX2V4cGFuZDIoKSB3aGljaCBjYXVzZWQgdmFyaW91cyBCTiBmdW5jdGlvbnMgdG8KICAgICBmYWlsIHdoZW4gdGhleSBleHRlbmRlZCB0aGUgc2l6ZSBvZiBhIEJJR05VTS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSBTWE5ldCBleHRlbnNpb24uIE1vZGlmeSBta2RlZi5wbCB0bwogICAgIHN1cHBvcnQgdHlwZXNhZmUgc3RhY2suCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHR5cG8gaW4gU1NMX1tnc11ldF9vcHRpb25zKCkuCiAgICAgW05pbHMgRnJvc3RiZXJnIDxuaWxzQG1lZGNvbS5zZT5dCgogICopIERlbGV0ZSB2YXJpb3VzIGZ1bmN0aW9ucyBhbmQgZmlsZXMgdGhhdCBiZWxvbmdlZCB0byB0aGUgKG5vdyBvYnNvbGV0ZSkKICAgICBvbGQgWDUwOVYzIGhhbmRsaW5nIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IENvbmZpZ3VyZSBvcHRpb24gInJzYXJlZiIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIERvbid0IGF1dG8tZ2VuZXJhdGUgcGVtLmguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW50cm9kdWNlIHR5cGUtc2FmZSBBU04uMSBTRVRzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb252ZXJ0IHZhcmlvdXMgYWRkaXRpb25hbCBjYXN0ZWQgc3RhY2tzIHRvIHR5cGUtc2FmZSBTVEFDS19PRigpIHZhcmlhbnRzLgogICAgIFtCZW4gTGF1cmllLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBTdGV2ZSBIZW5zb25dCgogICopIEludHJvZHVjZSB0eXBlLXNhZmUgU1RBQ0tzLiBUaGlzIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBicmVhayBsb3RzIG9mIGNvZGUKICAgICB0aGF0IGxpbmtzIHdpdGggT3BlblNTTCAod2VsbCBhdCBsZWFzdCBjYXVzZSBsb3RzIG9mIHdhcm5pbmdzKSwgYnV0IGZlYXIKICAgICBub3Q6IHRoZSBjb252ZXJzaW9uIGlzIHRyaXZpYWwsIGFuZCBpdCBlbGltaW5hdGVzIGxvYWRzIG9mIGV2aWwgY2FzdHMuIEEKICAgICBmZXcgU1RBQ0tlZCB0aGluZ3MgaGF2ZSBiZWVuIGNvbnZlcnRlZCBhbHJlYWR5LiBGZWVsIGZyZWUgdG8gY29udmVydCBtb3JlLgogICAgIEluIHRoZSBmdWxsbmVzcyBvZiB0aW1lLCBJJ2xsIGRvIGF3YXkgd2l0aCB0aGUgU1RBQ0sgdHlwZSBhbHRvZ2V0aGVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYG9wZW5zc2wgY2EgLXJldm9rZSA8Y2VydGZpbGU+JyBmYWNpbGl0eSB3aGljaCByZXZva2VzIGEgY2VydGlmaWNhdGUKICAgICBzcGVjaWZpZWQgaW4gPGNlcnRmaWxlPiBieSB1cGRhdGluZyB0aGUgZW50cnkgaW4gdGhlIGluZGV4LnR4dCBmaWxlLgogICAgIFRoaXMgd2F5IG9uZSBubyBsb25nZXIgaGFzIHRvIGVkaXQgdGhlIGluZGV4LnR4dCBmaWxlIG1hbnVhbGx5IGZvcgogICAgIHJldm9raW5nIGEgY2VydGlmaWNhdGUuIFRoZSAtcmV2b2tlIG9wdGlvbiBkb2VzIHRoZSBnb3J5IGRldGFpbHMgbm93LgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBvcGVuY2Eub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IGBvcGVuc3NsIGNybCAtbm9vdXQgLXRleHQnIGNvbWJpbmF0aW9uIHdoZXJlIGAtbm9vdXQnIGtpbGxlZCB0aGUKICAgICBgLXRleHQnIG9wdGlvbiBhdCBhbGwgYW5kIHRoaXMgd2F5IHRoZSBgLW5vb3V0IC10ZXh0JyBjb21iaW5hdGlvbiB3YXMKICAgICBpbmNvbnNpc3RlbnQgaW4gYG9wZW5zc2wgY3JsJyB3aXRoIHRoZSBmcmllbmRzIGluIGBvcGVuc3NsIHg1MDl8cnNhfGRzYScuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2Ugc3VyZSBhIGNvcnJlc3BvbmRpbmcgcGxhaW4gdGV4dCBlcnJvciBtZXNzYWdlIGV4aXN0cyBmb3IgdGhlCiAgICAgWDUwOV9WX0VSUl9DRVJUX1JFVk9LRUQvMjMgZXJyb3IgbnVtYmVyIHdoaWNoIGNhbiBvY2N1ciB3aGVuIGEKICAgICB2ZXJpZnkgY2FsbGJhY2sgZnVuY3Rpb24gZGV0ZXJtaW5lZCB0aGF0IGEgY2VydGlmaWNhdGUgd2FzIHJldm9rZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEJ1Z2ZpeDogSW4gdGVzdC90ZXN0ZW5jLCBkb24ndCB0ZXN0ICJvcGVuc3NsIDxjaXBoZXI+IiBmb3IKICAgICBjaXBoZXJzIHRoYXQgd2VyZSBleGNsdWRlZCwgZS5nLiBieSAtRE5PX0lERUEuICBBbHNvLCB0ZXN0CiAgICAgYWxsIGF2YWlsYWJsZSBjaXBlcnMgaW5jbHVkaW5nIHJjNSwgd2hpY2ggd2FzIGZvcmdvdHRlbiB1bnRpbCBub3cuCiAgICAgSW4gb3JkZXIgdG8gbGV0IHRoZSB0ZXN0aW5nIHNoZWxsIHNjcmlwdCBrbm93IHdoaWNoIGFsZ29yaXRobXMKICAgICBhcmUgYXZhaWxhYmxlLCBhIG5ldyAodXAgdG8gbm93IHVuZG9jdW1lbnRlZCkgY29tbWFuZAogICAgICJvcGVuc3NsIGxpc3QtY2lwaGVyLWNvbW1hbmRzIiBpcyB1c2VkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeDogc19jbGllbnQgb2NjYXNpb25hbGx5IHdvdWxkIHNsZWVwIGluIHNlbGVjdCgpIHdoZW4KICAgICBpdCBzaG91bGQgaGF2ZSBjaGVja2VkIFNTTF9wZW5kaW5nKCkgZmlyc3QuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBEU0FfZG9fc2lnbiBhbmQgRFNBX2RvX3ZlcmlmeSB0byBwcm92aWRlIGFjY2VzcyB0bwogICAgIHRoZSByYXcgRFNBIHZhbHVlcyBwcmlvciB0byBBU04uMSBlbmNvZGluZy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgVHdlYWtzIHRvIENvbmZpZ3VyZQogICAgIFtOaWVscyBQb3BwZSA8bmllbHNAbmV0Ym94Lm9yZz5dCgogICopIEFkZCBzdXBwb3J0IGZvciBQS0NTIzUgdjIuMCBBU04xIFBCRVMyIHN0cnVjdHVyZXMuIE5vIG90aGVyIHN1cHBvcnQsCiAgICAgeWV0Li4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHZhcmlhYmxlcyAkKFJBTkxJQikgYW5kICQoUEVSTCkgaW4gdGhlIE1ha2VmaWxlcy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTmV3IGNvbmZpZyBvcHRpb24gdG8gYXZvaWQgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGlsbGVnYWwgb24gdGhlIDgwMzg2LgogICAgIFRoZSBkZWZhdWx0IGNvZGUgaXMgZmFzdGVyLCBidXQgcmVxdWlyZXMgYXQgbGVhc3QgYSA0ODYuCiAgICAgW1VsZiBN9mxsZXJdCiAgCiAgKikgR290IHJpZCBvZiBvbGQgU1NMMl9DTElFTlRfVkVSU0lPTiAoaW5jb25zaXN0ZW50bHkgdXNlZCkgYW5kCiAgICAgU1NMMl9TRVJWRVJfVkVSU0lPTiAobm90IHVzZWQgYXQgYWxsKSBtYWNyb3MsIHdoaWNoIGFyZSBub3cgdGhlCiAgICAgc2FtZSBhcyBTU0wyX1ZFUlNJT04gYW55d2F5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyAiLXNob3djZXJ0cyIgb3B0aW9uIGZvciBzX2NsaWVudC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdGlsbCBtb3JlIFBLQ1MjMTIgaW50ZWdyYXRpb24uIEFkZCBwa2NzMTIgYXBwbGljYXRpb24gdG8gb3BlbnNzbAogICAgIGFwcGxpY2F0aW9uLiBWYXJpb3VzIGNsZWFudXBzIGFuZCBmaXhlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3JlIFBLQ1MjMTIgaW50ZWdyYXRpb24uIEFkZCBuZXcgcGtjczEyIGRpcmVjdG9yeSB3aXRoIE1ha2VmaWxlLnNzbCBhbmQKICAgICBtb2RpZnkgZXJyb3Igcm91dGluZXMgdG8gd29yayBpbnRlcm5hbGx5LiBBZGQgZXJyb3IgY29kZXMgYW5kIFBCRSBpbml0CiAgICAgdG8gbGlicmFyeSBzdGFydHVwIHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1cnRoZXIgUEtDUyMxMiBpbnRlZ3JhdGlvbi4gQWRkZWQgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiwgUEtDUyM4IGFuZAogICAgIHBhY2tpbmcgZnVuY3Rpb25zIHRvIGFzbjEgYW5kIGV2cC4gQ2hhbmdlZCBmdW5jdGlvbiBuYW1lcyBhbmQgZXJyb3IKICAgICBjb2RlcyBhbG9uZyB0aGUgd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBLQ1MxMiBpbnRlZ3JhdGlvbjogYW5kIHNvIGl0IGJlZ2lucy4uLiBGaXJzdCBvZiBzZXZlcmFsIHBhdGNoZXMgdG8KICAgICBzbG93bHkgaW50ZWdyYXRlIFBLQ1MjMTIgZnVuY3Rpb25hbGl0eSBpbnRvIE9wZW5TU0wuIEFkZCBQS0NTIzEyCiAgICAgb2JqZWN0cyB0byBvYmplY3RzLmgKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgJ2luZGVudCcgb3B0aW9uIHRvIHNvbWUgWDUwOVYzIGV4dGVuc2lvbiBjb2RlLiBJbml0aWFsIEFTTjEKICAgICBhbmQgZGlzcGxheSBzdXBwb3J0IGZvciBUaGF3dGUgc3Ryb25nIGV4dHJhbmV0IGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgTGludXhQUEMgc3VwcG9ydC4KICAgICBbSmVmZiBEdWJydWxlIDxpZ29yQHBvYm94Lm9yZz5dCgogICopIEdldCByaWQgb2YgcmVkdW5kYW50IEJOIGZpbGUgYm5fbXVsdy5jLCBhbmQgcmVuYW1lIGJuX2RpdjY0IHRvCiAgICAgYm5fZGl2X3dvcmRzIGluIGFscGhhLnMuCiAgICAgW0hhbm5lcyBSZWluZWNrZSA8SC5SZWluZWNrZUBody5hYy51az4gYW5kIEJlbiBMYXVyaWVdCgogICopIE1ha2Ugc3VyZSB0aGUgUlNBIE9BRVAgdGVzdCBpcyBza2lwcGVkIHVuZGVyIC1EUlNBcmVmIGJlY2F1c2UKICAgICBPQUVQIGlzbid0IHN1cHBvcnRlZCB3aGVuIE9wZW5TU0wgaXMgYnVpbHQgd2l0aCBSU0FyZWYuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBNb3ZlIGRlZmluaXRpb25zIG9mIElTX1NFVC9JU19TRVFVRU5DRSBpbnNpZGUgY3J5cHRvL2FzbjEvYXNuMS5oIAogICAgIHNvIHRoZXkgbm8gbG9uZ2VyIGFyZSBtaXNzaW5nIHVuZGVyIC1ETk9QUk9UTy4gCiAgICAgW1NvcmVuIFMuIEpvcnZhbmcgPHNvcmVuQHQuZGs+XQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjFjIGFuZCAwLjkuMmIgIFsyMiBNYXIgMTk5OV0KCiAgKikgTWFrZSBTU0xfZ2V0X3BlZXJfY2VydF9jaGFpbigpIHdvcmsgaW4gc2VydmVycy4gVW5mb3J0dW5hdGVseSwgaXQgc3RpbGwKICAgICBkb2Vzbid0IHdvcmsgd2hlbiB0aGUgc2Vzc2lvbiBpcyByZXVzZWQuIENvbWluZyBzb29uIQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYSBzZWN1cml0eSBob2xlLCB0aGF0IGFsbG93cyBzZXNzaW9ucyB0byBiZSByZXVzZWQgaW4gdGhlIHdyb25nCiAgICAgY29udGV4dCB0aHVzIGJ5cGFzc2luZyBjbGllbnQgY2VydCBwcm90ZWN0aW9uISBBbGwgc29mdHdhcmUgdGhhdCB1c2VzCiAgICAgY2xpZW50IGNlcnRzIGFuZCBzZXNzaW9uIGNhY2hlcyBpbiBtdWx0aXBsZSBjb250ZXh0cyBORUVEUyBQQVRDSElORyB0bwogICAgIGFsbG93IHNlc3Npb24gcmV1c2UhIEEgZnVsbGVyIHNvbHV0aW9uIGlzIGluIHRoZSB3b3Jrcy4KICAgICBbQmVuIExhdXJpZSwgcHJvYmxlbSBwb2ludGVkIG91dCBieSBIb2xnZXIgUmVpZiwgQm9kbyBNb2VsbGVyIChhbmQgPz8/KV0KCiAgKikgU29tZSBtb3JlIHNvdXJjZSB0cmVlIGNsZWFudXBzIChyZW1vdmVkIG9ic29sZXRlIGZpbGVzCiAgICAgY3J5cHRvL2JmL2FzbS9iZjU4Ni5wbCwgdGVzdC90ZXN0LnR4dCBhbmQgY3J5cHRvL3NoYS9hc20vZi5zOyBjaGFuZ2VkCiAgICAgcGVybWlzc2lvbiBvbiAiY29uZmlnIiBzY3JpcHQgdG8gYmUgZXhlY3V0YWJsZSkgYW5kIGEgZml4IGZvciB0aGUgSU5TVEFMTAogICAgIGRvY3VtZW50LgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgUmVtb3ZlIHNvbWUgbGVnYWN5IGFuZCBlcnJvbmVvdXMgdXNlcyBvZiBtYWxsb2MsIGZyZWUgaW5zdGVhZCBvZgogICAgIE1hbGxvYywgRnJlZS4KICAgICBbTGVubmFydCBCYW5nIDxsb2JAbmV0c3RyZWFtLnNlPiwgd2l0aCBtaW5vciBjaGFuZ2VzIGJ5IFN0ZXZlXQoKICAqKSBNYWtlIHJzYV9vYWVwX3Rlc3QgcmV0dXJuIG5vbi16ZXJvIG9uIGVycm9yLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIG5hdGl2ZSBTb2xhcmlzIHNoYXJlZCBsaWJyYXJpZXMuIENvbmZpZ3VyZQogICAgIHNvbGFyaXMtc3BhcmMtc2M0LXBpYywgbWFrZSwgdGhlbiBydW4gc2hsaWIvc29sYXJpcy1zYzQuc2guIEl0J2QgYmUgbmljZQogICAgIGlmIHNvbWVvbmUgd291bGQgbWFrZSB0aGF0IGxhc3Qgc3RlcCBhdXRvbWF0aWMuCiAgICAgW01hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQEFkTm92dW0uQ0g+XQoKICAqKSBjdHhfc2l6ZSB3YXMgbm90IGJ1aWx0IHdpdGggdGhlIHJpZ2h0IGNvbXBpbGVyIGR1cmluZyAibWFrZSBsaW5rcyIuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDaGFuZ2UgdGhlIG1lYW5pbmcgb2YgJ0FMTCcgaW4gdGhlIGNpcGhlciBsaXN0LiBJdCBub3cgbWVhbnMgImV2ZXJ5dGhpbmcKICAgICBleGNlcHQgTlVMTCBjaXBoZXJzIi4gVGhpcyBtZWFucyB0aGUgZGVmYXVsdCBjaXBoZXIgbGlzdCB3aWxsIG5vIGxvbmdlcgogICAgIGVuYWJsZSBOVUxMIGNpcGhlcnMuIFRoZXkgbmVlZCB0byBiZSBzcGVjaWZpY2FsbHkgZW5hYmxlZCBlLmcuIHdpdGgKICAgICB0aGUgc3RyaW5nICJERUZBVUxUOmVOVUxMIi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdG8gUlNBIHByaXZhdGUgZW5jcnlwdGlvbiByb3V0aW5lczogaWYgcCA8IHEgdGhlbiBpdCB3b3VsZAogICAgIG9jY2FzaW9uYWxseSBwcm9kdWNlIGFuIGludmFsaWQgcmVzdWx0LiBUaGlzIHdpbGwgb25seSBoYXBwZW4gd2l0aAogICAgIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGtleXMgYmVjYXVzZSBPcGVuU1NMIChhbmQgU1NMZWF5KSBlbnN1cmUgcCA+IHEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQmUgbGVzcyByZXN0cmljdGl2ZSBhbmQgYWxsb3cgYWxzbyBgcGVybCB1dGlsL3BlcmxwYXRoLnBsCiAgICAgL3BhdGgvdG8vYmluL3BlcmwnIGluIGFkZGl0aW9uIHRvIGBwZXJsIHV0aWwvcGVybHBhdGgucGwgL3BhdGgvdG8vYmluJywKICAgICBiZWNhdXNlIHRoaXMgd2F5IG9uZSBjYW4gYWxzbyB1c2UgYW4gaW50ZXJwcmV0ZXIgbmFtZWQgYHBlcmw1JyAod2hpY2ggaXMKICAgICB1c3VhbGx5IHRoZSBuYW1lIG9mIFBlcmwgNS54eHggb24gcGxhdGZvcm1zIHdoZXJlIGFuIFBlcmwgNC54IGlzIHN0aWxsCiAgICAgaW5zdGFsbGVkIGFzIGBwZXJsJykuCiAgICAgW01hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQGFkbm92dW0uY2g+XQoKICAqKSBMZXQgdXRpbC9jbGVhbi1kZXBlbmQucGwgd29yayBhbHNvIHdpdGggb2xkZXIgUGVybCA1LjAweCB2ZXJzaW9ucy4KICAgICBbTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIEZpeCBNYWtlZmlsZS5vcmcgc28gQ0MsQ0ZMQUcgZXRjIGFyZSBwYXNzZWQgdG8gJ21ha2UgbGlua3MnIGFkZAogICAgIGFkdmFwaTMyLmxpYiB0byBXaW4zMiBidWlsZCBhbmQgY2hhbmdlIHRoZSBwZW0gdGVzdCBjb21wYXJpc29uCiAgICAgdG8gZmMuZXhlICh0aGFua3MgdG8gVWxyaWNoIEtyb2VuZXIgPGtyb25lcnVAeWFob28uY29tPiBmb3IgdGhlCiAgICAgc3VnZ2VzdGlvbikuIEZpeCBtaXNwbGFjZWQgQVNOSSBwcm90b3R5cGVzIGFuZCBkZWNsYXJhdGlvbnMgaW4gZXZwLmgKICAgICBhbmQgY3J5cHRvL2Rlcy9lZGVfY2JjbV9lbmMuYy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBERVMgcXVhZCBjaGVja3N1bSB3YXMgYnJva2VuIG9uIGJpZy1lbmRpYW4gYXJjaGl0ZWN0dXJlcy4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENvbW1lbnQgb3V0IHR3byBmdW5jdGlvbnMgaW4gYmlvLmggdGhhdCBhcmVuJ3QgaW1wbGVtZW50ZWQuIEZpeCB1cCB0aGUKICAgICBXaW4zMiB0ZXN0IGJhdGNoIGZpbGUgc28gaXQgKG1pZ2h0KSB3b3JrIGFnYWluLiBUaGUgV2luMzIgdGVzdCBiYXRjaCBmaWxlCiAgICAgaXMgaG9ycmlibGU6IEkgZmVlbCBpbGwuLi4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSB2YXJpb3VzICNpZmRlZnMgYXJvdW5kIHNvIE5PX1NZU0xPRywgTk9fRElSRU5UIGV0YyBhcmUgbm93IHNlbGVjdGVkCiAgICAgaW4gZV9vcy5oLiBBdWRpdCBvZiBoZWFkZXIgZmlsZXMgdG8gY2hlY2sgQU5TSSBhbmQgbm9uIEFOU0kKICAgICBzZWN0aW9uczogMTAgZnVuY3Rpb25zIHdlcmUgYWJzZW50IGZyb20gbm9uIEFOU0kgc2VjdGlvbiBhbmQgbm90IGV4cG9ydGVkCiAgICAgZnJvbSBXaW5kb3dzIERMTHMuIEZpeGVkIHVwIGxpYmVheS5udW0gZm9yIG5ldyBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBgb3BlbnNzbCB2ZXJzaW9uJyBvdXRwdXQgbGluZXMgY29uc2lzdGVudC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IFdpbjMyIHN5bWJvbCBleHBvcnQgbGlzdHMgZm9yIEJJTyBmdW5jdGlvbnM6IEFkZGVkCiAgICAgQklPX2dldF9leF9uZXdfaW5kZXgsIEJJT19nZXRfZXhfbnVtLCBCSU9fZ2V0X2V4X2RhdGEgYW5kIEJJT19zZXRfZXhfZGF0YQogICAgIHRvIG1zL2xpYmVheXsxNiwzMn0uZGVmLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBTZWNvbmQgcm91bmQgb2YgZml4aW5nIHRoZSBPcGVuU1NMIHBlcmwvIHN0dWZmLiBJdCBub3cgYXQgbGVhc3QgY29tcGlsZWQKICAgICBmaW5lIHVuZGVyIFVuaXggYW5kIHBhc3NlcyBzb21lIHRyaXZpYWwgdGVzdHMgSSd2ZSBub3cgYWRkZWQuIEJ1dCB0aGUKICAgICB3aG9sZSBzdHVmZiBpcyBob3JyaWJseSBpbmNvbXBsZXRlLCBzbyBhIFJFQURNRS4xU1Qgd2l0aCBhIGRpc2NsYWltZXIgd2FzCiAgICAgYWRkZWQgdG8gbWFrZSBzdXJlIG5vIG9uZSBleHBlY3RzIHRoYXQgdGhpcyBzdHVmZiByZWFsbHkgd29ya3MgaW4gdGhlCiAgICAgT3BlblNTTCAwLjkuMiByZWxlYXNlLiAgQWRkaXRpb25hbGx5IEkndmUgc3RhcnRlZCB0byBjbGVhbiB0aGUgWFMgc291cmNlcwogICAgIHVwIGFuZCBmaXhlZCBhIGZldyBsaXR0bGUgYnVncyBhbmQgaW5jb25zaXN0ZW5jaWVzIGluIE9wZW5TU0wue3BtLHhzfSBhbmQKICAgICBvcGVuc3NsX2Jpby54cy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHRoZSBnZW5lcmF0aW9uIG9mIHR3byBwYXJ0IGFkZHJlc3NlcyBpbiBwZXJsLgogICAgIFtLZW5qaSBNaXlha2UgPGtlbmppQG1peWFrZS5vcmc+LCBpbnRlZ3JhdGVkIGJ5IEJlbiBMYXVyaWVdCgogICopIEFkZCBjb25maWcgZW50cnkgZm9yIExpbnV4IG9uIE1JUFMuCiAgICAgW0pvaG4gVG9iZXkgPGp0b2JleUBjaGFubmVsMS5jb20+XQoKICAqKSBNYWtlIGxpbmtzIHdoZW5ldmVyIENvbmZpZ3VyZSBpcyBydW4sIHVubGVzcyB3ZSBhcmUgb24gV2luZG96ZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgUGVybWl0IGV4dGVuc2lvbnMgdG8gYmUgYWRkZWQgdG8gQ1JMcyB1c2luZyBjcmxfc2VjdGlvbiBpbiBvcGVuc3NsLmNuZi4KICAgICBDdXJyZW50bHkgb25seSBpc3N1ZXJBbHROYW1lIGFuZCBBdXRob3JpdHlLZXlJZGVudGlmaWVyIG1ha2UgYW55IHNlbnNlCiAgICAgaW4gQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSB1c2VmdWwga2x1ZGdlIHRvIGFsbG93IHBhY2thZ2UgbWFpbnRhaW5lcnMgdG8gc3BlY2lmeSBjb21waWxlciBhbmQKICAgICBvdGhlciBwbGF0Zm9ybXMgZGV0YWlscyBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGhvdXQgaGF2aW5nIHRvIHBhdGNoIHRoZQogICAgIENvbmZpZ3VyZSBzY3JpcHQgZXZlcnl0aW1lOiBPbmUgbm93IGNhbiB1c2UgYGBwZXJsIENvbmZpZ3VyZQogICAgIDxpZD46PGRldGFpbHM+JycsIGkuZS4gcGxhdGZvcm0gaWRzIGFyZSBhbGxvd2VkIHRvIGhhdmUgZGV0YWlscyBhcHBlbmRlZAogICAgIHRvIHRoZW0gKHNlcGFyYXRlZCBieSBjb2xvbnMpLiBUaGlzIGlzIHRyZWF0ZWQgYXMgdGhlcmUgd291bGQgYmUgYSBzdGF0aWMKICAgICBwcmUtY29uZmlndXJlZCBlbnRyeSBpbiBDb25maWd1cmUncyAldGFibGUgdW5kZXIga2V5IDxpZD4gd2l0aCB2YWx1ZQogICAgIDxkZXRhaWxzPiBhbmQgYGBwZXJsIENvbmZpZ3VyZSA8aWQ+JycgaXMgY2FsbGVkLiAgU28sIHdoZW4geW91IHdhbnQgdG8KICAgICBwZXJmb3JtIGEgcXVpY2sgdGVzdC1jb21waWxlIHVuZGVyIEZyZWVCU0QgMy4xIHdpdGggcGdjYyBhbmQgd2l0aG91dAogICAgIGFzc2VtYmxlciBzdHVmZiB5b3UgY2FuIHVzZSBgYHBlcmwgQ29uZmlndXJlICJGcmVlQlNELWVsZjpwZ2NjOi1PNjo6OiInJwogICAgIG5vdywgd2hpY2ggb3ZlcnJpZGVzIHRoZSBGcmVlQlNELWVsZiBlbnRyeSBvbi10aGUtZmx5LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBEaXNhYmxlIG5ldyBUTFMxIGNpcGhlcnN1aXRlcyBieSBkZWZhdWx0OiB0aGV5IGFyZW4ndCBvZmZpY2lhbCB5ZXQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFsbG93IERTTyBmbGFncyBsaWtlIC1mcGljLCAtZlBJQywgLUtQSUMgZXRjLiB0byBiZSBzcGVjaWZpZWQKICAgICBvbiB0aGUgYHBlcmwgQ29uZmlndXJlIC4uLicgY29tbWFuZCBsaW5lLiBUaGlzIHdheSBvbmUgY2FuIGNvbXBpbGUKICAgICBPcGVuU1NMIGxpYnJhcmllcyB3aXRoIFBvc2l0aW9uIEluZGVwZW5kZW50IENvZGUgKFBJQykgd2hpY2ggaXMgbmVlZGVkCiAgICAgZm9yIGxpbmtpbmcgaXQgaW50byBEU09zLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1hcmthYmx5LCBleHBvcnQgY2lwaGVycyB3ZXJlIHRvdGFsbHkgYnJva2VuIGFuZCBuby1vbmUgaGFkIG5vdGljZWQhCiAgICAgRml4ZWQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENsZWFuZWQgdXAgdGhlIExJQ0VOU0UgZG9jdW1lbnQ6IFRoZSBvZmZpY2lhbCBjb250YWN0IGZvciBhbnkgbGljZW5zZQogICAgIHF1ZXN0aW9ucyBub3cgaXMgdGhlIE9wZW5TU0wgY29yZSB0ZWFtIHVuZGVyIG9wZW5zc2wtY29yZUBvcGVuc3NsLm9yZy4KICAgICBBbmQgYWRkIGEgcGFyYWdyYXBoIGFib3V0IHRoZSBkdWFsLWxpY2Vuc2Ugc2l0dWF0aW9uIHRvIG1ha2Ugc3VyZSBwZW9wbGUKICAgICByZWNvZ25pemUgdGhhdCBfQk9USF8gdGhlIE9wZW5TU0wgbGljZW5zZSBfQU5EXyB0aGUgU1NMZWF5IGxpY2Vuc2UgYXBwbHkKICAgICB0byB0aGUgT3BlblNTTCB0b29sa2l0LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBHZW5lcmFsIHNvdXJjZSB0cmVlIG1ha2VmaWxlIGNsZWFudXBzOiBNYWRlIGBtYWtpbmcgeHh4IGluIHl5eS4uLicKICAgICBkaXNwbGF5IGNvbnNpc3RlbnQgaW4gdGhlIHNvdXJjZSB0cmVlIGFuZCByZXBsYWNlZCBgL2Jpbi9ybScgYnkgYHJtJy4KICAgICBBZGRpdGlvbmFsbHkgY2xlYW5lZCB1cCB0aGUgYG1ha2UgbGlua3MnIHRhcmdldDogUmVtb3ZlIHVubmVjZXNzYXJ5CiAgICAgc2VtaWNvbG9ucywgc3Vic2VxdWVudCByZWR1bmRhbnQgcmVtb3ZlcywgaW5saW5lIHBvaW50LnNoIGludG8gbWtsaW5rLnNoCiAgICAgdG8gc3BlZWQgcHJvY2Vzc2luZyBhbmQgbm8gbG9uZ2VyIGNsdXR0ZXIgdGhlIGRpc3BsYXkgd2l0aCBjb25mdXNpbmcKICAgICBzdHVmZi4gSW5zdGVhZCBvbmx5IHRoZSBhY3R1YWxseSBkb25lIGxpbmtzIGFyZSBkaXNwbGF5ZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBlcm1pdCBudWxsIGVuY3J5cHRpb24gY2lwaGVyc3VpdGVzLCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiBvbmx5LiBJdCB1c2VkCiAgICAgdG8gYmUgbmVjZXNzYXJ5IHRvIHNldCB0aGUgcHJlcHJvY2Vzc29yIGRlZmluZSBTU0xfQUxMT1dfRU5VTEwgdG8gZG8gdGhpcy4KICAgICBJdCBpcyBub3cgbmVjZXNzYXJ5IHRvIHNldCBTU0xfRk9SQklEX0VOVUxMIHRvIHByZXZlbnQgdGhlIHVzZSBvZiBudWxsCiAgICAgZW5jcnlwdGlvbi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGEgYnVuY2ggb2YgZml4ZXMgdG8gdGhlIFBLQ1MjNyBzdHVmZi4gSXQgdXNlZCB0byBzb21ldGltZXMgcmVvcmRlcgogICAgIHNpZ25lZCBhdHRyaWJ1dGVzIHdoZW4gdmVyaWZ5aW5nIHNpZ25hdHVyZXMgKHRoaXMgd291bGQgYnJlYWsgdGhlbSksIAogICAgIHRoZSBkZXRhY2hlZCBkYXRhIGVuY29kaW5nIHdhcyB3cm9uZyBhbmQgcHVibGljIGtleXMgb2J0YWluZWQgdXNpbmcKICAgICBYNTA5X2dldF9wdWJrZXkoKSB3ZXJlbid0IGZyZWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIHRoZSBCVUZGRVIgZnVuY3Rpb25zLiBBbHNvIGFkZGVkIGEgd29yayBhcm91bmQKICAgICB0byBhIFdpbjk1IGNvbnNvbGUgYnVnLiBUaGlzIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHBhc3N3b3JkIHJlYWQgc3R1ZmY6IHRoZQogICAgIGxhc3QgY2hhcmFjdGVyIHR5cGVkIGdldHMgY2FycmllZCBvdmVyIHRvIHRoZSBuZXh0IGZyZWFkKCkuIElmIHlvdSB3ZXJlIAogICAgIGdlbmVyYXRpbmcgYSBuZXcgY2VydCByZXF1ZXN0IHVzaW5nICdyZXEnIGZvciBleGFtcGxlIHRoZW4gdGhlIGxhc3QKICAgICBjaGFyYWN0ZXIgb2YgdGhlIHBhc3NwaHJhc2Ugd291bGQgYmUgQ1Igd2hpY2ggd291bGQgdGhlbiBlbnRlciB0aGUgZmlyc3QKICAgICBmaWVsZCBhcyBibGFuay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCB0aGUgbmV3IGBJbmNsdWRlcyBPcGVuU1NMIENyeXB0b2dyYXBoeSBTb2Z0d2FyZScgYnV0dG9uIGFzCiAgICAgZG9jL29wZW5zc2xfYnV0dG9uLntnaWYsaHRtbH0gd2hpY2ggaXMgc2ltaWxhciBpbiBzdHlsZSB0byB0aGUgb2xkIFNTTGVheQogICAgIGJ1dHRvbiBhbmQgY2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIGJhc2VkIG9uIE9wZW5TU0wgdG8gc2hvdyB0aGUKICAgICByZWxhdGlvbnNoaXAgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4gIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmUgY29uZnVzaW5nIHZhcmlhYmxlcyBpbiBmdW5jdGlvbiBzaWduYXR1cmVzIGluIGZpbGVzCiAgICAgc3NsL3NzbF9saWIuYyBhbmQgc3NsL3NzbC5oLgogICAgIFtMZW5uYXJ0IEJvbmcgPGxvYkBrdWx0aGVhLnN0YWNrZW4ua3RoLnNlPl0KCiAgKikgRG9uJ3QgaW5zdGFsbCBic3NfZmlsZS5jIHVuZGVyIFBSRUZJWC9pbmNsdWRlLwogICAgIFtMZW5uYXJ0IEJvbmcgPGxvYkBrdWx0aGVhLnN0YWNrZW4ua3RoLnNlPl0KCiAgKikgR2V0IHRoZSBXaW4zMiBjb21waWxlIHdvcmtpbmcgYWdhaW4uIE1vZGlmeSBta2RlZi5wbCBzbyBpdCBjYW4gaGFuZGxlCiAgICAgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBoYXMgc3VwcG9ydCBmb3IgTlQgc3BlY2lmaWMKICAgICBzdHVmZi4gRml4IG1rMW1mLnBsIGFuZCBWQy0zMi5wbCB0byBzdXBwb3J0IE5UIGRpZmZlcmVuY2VzIGFsc28uIFZhcmlvdXMKICAgICAjaWZkZWYgV0lOMzIgYW5kIFdJTk5UcyBzcHJpbmtsZWQgYWJvdXQgdGhlIHBsYWNlIGFuZCBzb21lIGNoYW5nZXMgZnJvbQogICAgIHVuc2lnbmVkIHRvIHNpZ25lZCB0eXBlczogdGhpcyB3YXMga2lsbGluZyB0aGUgV2luMzIgY29tcGlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGNlcnRpZmljYXRlIGZpbGUgdG8gc3RhY2sgZnVuY3Rpb25zLAogICAgIFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soKSBhbmQKICAgICBTU0xfYWRkX2ZpbGVfY2VydF9zdWJqZWN0c190b19zdGFjaygpLiAgVGhlc2UgbGFyZ2VseSBzdXBwbGFudAogICAgIFNTTF9sb2FkX2NsaWVudF9DQV9maWxlKCksIGFuZCBjYW4gYmUgdXNlZCB0byBhZGQgbXVsdGlwbGUgY2VydHMgZWFzaWx5CiAgICAgdG8gYSBzdGFjayAodXN1YWxseSB0aGlzIGlzIHRoZW4gaGFuZGVkIHRvIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KCkpLgogICAgIFRoaXMgbWVhbnMgdGhhdCBBcGFjaGUtU1NMIGFuZCBzaW1pbGFyIHBhY2thZ2VzIGRvbid0IGhhdmUgdG8gbWVzcyBhcm91bmQKICAgICB0byBhZGQgYXMgbWFueSBDQXMgYXMgdGhleSB3YW50IHRvIHRoZSBwcmVmZXJyZWQgbGlzdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRXhwZXJpbWVudCB3aXRoIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gQ3VycmVudGx5IG9ubHkgcGFydGlhbGx5IGFwcGxpZWQgdG8KICAgICBzc2wvc3NsX2xpYi5jLgogICAgIFNlZSBodHRwOi8vd3d3LnN0YWNrLm5sL35kaW1pdHJpL2RveHlnZW4vaW5kZXguaHRtbCwgYW5kIHJ1biBkb3h5Z2VuIHdpdGgKICAgICBvcGVuc3NsLmRveHkgYXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KICAgICBbQmVuIExhdXJpZV0KICAKICAqKSBHZXQgcmlkIG9mIHJlbWFpbmluZyBDKystc3R5bGUgY29tbWVudHMgd2hpY2ggc3RyaWN0IEMgY29tcGlsZXJzIGhhdGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIHBvaW50ZWQgb3V0IGJ5IENhcmxvcyBBbWVuZ3VhbF0KCiAgKikgQ2hhbmdlZCBCTl9SRUNVUlNJT04gaW4gYm5fbW9udC5jIHRvIEJOX1JFQ1VSU0lPTl9NT05UIHNvIGl0IGlzIG5vdAogICAgIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQ6IGl0IGhhcyBwcm9ibGVtcyB3aXRoIGxhcmdlIGtleXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgYnVuY2ggb2YgU1NMX3h4eCgpIGZ1bmN0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIHRlbXBvcmFyeSBSU0EgYW5kCiAgICAgREggcHJpdmF0ZSBrZXlzIGFuZC9vciBjYWxsYmFjayBmdW5jdGlvbnMgd2hpY2ggZGlyZWN0bHkgY29ycmVzcG9uZCB0bwogICAgIHRoZWlyIFNTTF9DVFhfeHh4KCkgY291bnRlcnBhcnRzIGJ1dCB3b3JrIG9uIGEgcGVyLWNvbm5lY3Rpb24gYmFzaXMuIFRoaXMKICAgICBpcyBuZWVkZWQgZm9yIGFwcGxpY2F0aW9ucyB3aGljaCBoYXZlIHRvIGNvbmZpZ3VyZSBjZXJ0aWZpY2F0ZXMgb24gYQogICAgIHBlci1jb25uZWN0aW9uIGJhc2lzIChlLmcuIEFwYWNoZSttb2Rfc3NsKSBpbnN0ZWFkIG9mIGEgcGVyLWNvbnRleHQgYmFzaXMKICAgICAoZS5nLiBzX3NlcnZlcikuIAogICAgICAgIEZvciB0aGUgUlNBIGNlcnRpZmljYXRlIHNpdHVhdGlvbiBpcyBtYWtlcyBubyBkaWZmZXJlbmNlLCBidXQKICAgICBmb3IgdGhlIERTQSBjZXJ0aWZpY2F0ZSBzaXR1YXRpb24gdGhpcyBmaXhlcyB0aGUgIm5vIHNoYXJlZCBjaXBoZXIiCiAgICAgcHJvYmxlbSB3aGVyZSB0aGUgT3BlblNTTCBjaXBoZXIgc2VsZWN0aW9uIHByb2NlZHVyZSBmYWlsZWQgYmVjYXVzZSB0aGUKICAgICB0ZW1wb3Jhcnkga2V5cyB3ZXJlIG5vdCBvdmVydGFrZW4gZnJvbSB0aGUgY29udGV4dCBhbmQgdGhlIEFQSSBwcm92aWRlZAogICAgIG5vIHdheSB0byByZWNvbmZpZ3VyZSB0aGVtLiAKICAgICAgICBUaGUgbmV3IGZ1bmN0aW9ucyBub3cgbGV0IGFwcGxpY2F0aW9ucyByZWNvbmZpZ3VyZSB0aGUgc3R1ZmYgYW5kIHRoZXkKICAgICBhcmUgaW4gZGV0YWlsOiBTU0xfbmVlZF90bXBfUlNBLCBTU0xfc2V0X3RtcF9yc2EsIFNTTF9zZXRfdG1wX2RoLAogICAgIFNTTF9zZXRfdG1wX3JzYV9jYWxsYmFjayBhbmQgU1NMX3NldF90bXBfZGhfY2FsbGJhY2suICBBZGRpdGlvbmFsbHkgYSBuZXcKICAgICBub24tcHVibGljLUFQSSBmdW5jdGlvbiBzc2xfY2VydF9pbnN0YW50aWF0ZSgpIGlzIHVzZWQgYXMgYSBoZWxwZXIKICAgICBmdW5jdGlvbiBhbmQgYWxzbyB0byByZWR1Y2UgY29kZSByZWR1bmRhbmN5IGluc2lkZSBzc2xfcnNhLmMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1vdmUgc19zZXJ2ZXIgLWRjZXJ0IGFuZCAtZGtleSBvcHRpb25zIG91dCBvZiB0aGUgdW5kb2N1bWVudGVkIGZlYXR1cmUKICAgICBhcmVhIGJlY2F1c2UgdGhleSBhcmUgdXNlZnVsIGZvciB0aGUgRFNBIHNpdHVhdGlvbiBhbmQgc2hvdWxkIGJlCiAgICAgcmVjb2duaXplZCBieSB0aGUgdXNlcnMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgY2lwaGVyIGRlY2lzaW9uIHNjaGVtZSBmb3IgZXhwb3J0IGNpcGhlcnM6IHRoZSBleHBvcnQgYml0cyBhcmUKICAgICAqbm90KiB3aXRoaW4gU1NMX01LRVlfTUFTSyBvciBTU0xfQVVUSF9NQVNLLCB0aGV5IGFyZSB3aXRoaW4KICAgICBTU0xfRVhQX01BU0suICBTbywgdGhlIG9yaWdpbmFsIHZhcmlhYmxlIGhhcyB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlCiAgICAgYWxyZWFkeSBtYXNrZWQgdmFyaWFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIEZpeCAncG9ydCcgdmFyaWFibGUgZnJvbSBgaW50JyB0byBgdW5zaWduZWQgaW50JyBpbiBjcnlwdG8vYmlvL2Jfc29jay5jCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIENoYW5nZSB0eXBlIG9mIGFub3RoZXIgbWRfbGVuIHZhcmlhYmxlIGluIHBrN19kb2l0LmM6UEtDUzdfZGF0YUZpbmFsKCkKICAgICBmcm9tIGBpbnQnIHRvIGB1bnNpZ25lZCBpbnQnIGJlY2F1c2UgaXQncyBhIGxlbmd0aCBhbmQgaW5pdGlhbGl6ZWQgYnkKICAgICBFVlBfRGlnZXN0RmluYWwoKSB3aGljaCBleHBlY3RzIGFuIGB1bnNpZ25lZCBpbnQgKicuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIERvbid0IGhhcmQtY29kZSBwYXRoIHRvIFBlcmwgaW50ZXJwcmV0ZXIgb24gc2hlYmFuZyBsaW5lIG9mIENvbmZpZ3VyZQogICAgIHNjcmlwdC4gSW5zdGVhZCB1c2UgdGhlIHVzdWFsIFNoZWxsLT5QZXJsIHRyYW5zaXRpb24gdHJpY2suCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2UgYG9wZW5zc2wgeDUwOSAtbm9vdXQgLW1vZHVsdXMnIGZ1bmN0aW9uYWwgYWxzbyBmb3IgRFNBIGNlcnRpZmljYXRlcwogICAgIChpbiBhZGRpdGlvbiB0byBSU0EgY2VydGlmaWNhdGVzKSB0byBtYXRjaCB0aGUgYmVoYXZpb3VyIG9mIGBvcGVuc3NsIGRzYQogICAgIC1ub291dCAtbW9kdWx1cycgYXMgaXQncyBhbHJlYWR5IHRoZSBjYXNlIGZvciBgb3BlbnNzbCByc2EgLW5vb3V0CiAgICAgLW1vZHVsdXMnLiAgRm9yIFJTQSB0aGUgLW1vZHVsdXMgaXMgdGhlIHJlYWwgIm1vZHVsdXMiIHdoaWxlIGZvciBEU0EKICAgICBjdXJyZW50bHkgdGhlIHB1YmxpYyBrZXkgaXMgcHJpbnRlZCAoYSBkZWNpc2lvbiB3aGljaCB3YXMgYWxyZWFkeSBkb25lIGJ5CiAgICAgYG9wZW5zc2wgZHNhIC1tb2R1bHVzJyBpbiB0aGUgcGFzdCkgd2hpY2ggc2VydmVzIGEgc2ltaWxhciBwdXJwb3NlLgogICAgIEFkZGl0aW9uYWxseSB0aGUgTk9fUlNBIG5vIGxvbmdlciBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIHdob2xlIC1tb2R1bHVzCiAgICAgb3B0aW9uOyBpdCBub3cgb25seSBhdm9pZHMgdXNpbmcgdGhlIFJTQSBzdHVmZi4gU2FtZSBhcHBsaWVzIHRvIE5PX0RTQQogICAgIG5vdywgdG9vLgogICAgIFtSYWxmIFMuICBFbmdlbHNjaGFsbF0KCiAgKikgQWRkIEFybmUgQW5zcGVyJ3MgcmVsaWFibGUgQklPIC0gdGhpcyBpcyBhbiBlbmNyeXB0ZWQsIGJsb2NrLWRpZ2VzdGVkCiAgICAgQklPLiBTZWUgdGhlIHNvdXJjZSAoY3J5cHRvL2V2cC9iaW9fb2suYykgZm9yIG1vcmUgaW5mby4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgRHVtcCB0aGUgb2xkIHl1Y2t5IHJlcSBjb2RlIHRoYXQgdHJpZWQgKGFuZCBmYWlsZWQpIHRvIGFsbG93IHJhdyBPSURzCiAgICAgdG8gYmUgYWRkZWQuIE5vdyBib3RoICdyZXEnIGFuZCAnY2EnIGNhbiB1c2UgbmV3IG9iamVjdHMgZGVmaW5lZCBpbiB0aGUKICAgICBjb25maWcgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29vbCBCSU8gdGhhdCBkb2VzIHN5c2xvZyAob3IgZXZlbnQgbG9nIG9uIE5UKS4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPiwgaW50ZWdyYXRlZCBieSBCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgbmV3IFRMUyBjaXBoZXJzdWl0ZXMsIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9SQzRfNTZfTUQ1LAogICAgIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9SQzJfQ0JDXzU2X01ENSBhbmQKICAgICBUTFNfUlNBX0VYUE9SVDU2X1dJVEhfREVTX0NCQ19TSEEsIGFzIHNwZWNpZmllZCBpbiAiNTYtYml0IEV4cG9ydCBDaXBoZXIKICAgICBTdWl0ZXMgRm9yIFRMUyIsIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMDAudHh0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgcHJlbGltaW5hcnkgY29uZmlnIGluZm8gZm9yIG5ldyBleHRlbnNpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFJTQV9OT19QQURESU5HIHJlYWxseSB1c2Ugbm8gcGFkZGluZy4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEdlbmVyYXRlIGVycm9ycyB3aGVuIHByaXZhdGUvcHVibGljIGtleSBjaGVjayBpcyBkb25lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBPdmVyaGF1bCBmb3IgJ2NybCcgdXRpbGl0eS4gTmV3IGZ1bmN0aW9uIFg1MDlfQ1JMX3ByaW50LiBQYXJ0aWFsIHN1cHBvcnQKICAgICBmb3Igc29tZSBDUkwgZXh0ZW5zaW9ucyBhbmQgbmV3IG9iamVjdHMgYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVhbGx5IGZpeCB0aGUgQVNOMSBJTVBMSUNJVCBidWcgdGhpcyB0aW1lLi4uIFBhcnRpYWwgc3VwcG9ydCBmb3IgcHJpdmF0ZQogICAgIGtleSB1c2FnZSBleHRlbnNpb24gYW5kIGZ1bGxlciBzdXBwb3J0IGZvciBhdXRob3JpdHkga2V5IGlkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBPQUVQIGVuY3J5cHRpb24gZm9yIHRoZSBPcGVuU1NMIGNyeXB0byBsaWJyYXJ5LiBPQUVQIGlzIHRoZSBpbXByb3ZlZAogICAgIHBhZGRpbmcgbWV0aG9kIGZvciBSU0EsIHdoaWNoIGlzIHJlY29tbWVuZGVkIGZvciBuZXcgYXBwbGljYXRpb25zIGluIFBLQ1MKICAgICAjMSB2Mi4wIChSRkMgMjQzNywgT2N0b2JlciAxOTk4KS4KICAgICBPQUVQIChPcHRpbWFsIEFzeW1tZXRyaWMgRW5jcnlwdGlvbiBQYWRkaW5nKSBoYXMgYmV0dGVyIHRoZW9yZXRpY2FsCiAgICAgZm91bmRhdGlvbnMgdGhhbiB0aGUgYWQtaG9jIHBhZGRpbmcgdXNlZCBpbiBQS0NTICMxIHYxLjUuIEl0IGlzIHNlY3VyZQogICAgIGFnYWluc3QgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFJTQS4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT4sIHJlZm9ybWF0dGVkLCBjb3JyZWN0ZWQgYW5kIGludGVncmF0ZWQgYnkKICAgICAgQmVuIExhdXJpZV0KCiAgKikgVXBkYXRlcyB0byB0aGUgbmV3IFNTTCBjb21wcmVzc2lvbiBjb2RlCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgRml4IHNvIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBtYXN0ZXIgc2VjcmV0LCB3aGVuIHBhc3NlZAogICAgIHZpYSBSU0EsIGNoZWNrcyB0aGF0IGlmIFRMUyB3YXMgcHJvcG9zZWQsIGJ1dCB3ZSByb2xsIGJhY2sgdG8gU1NMdjMKICAgICAoYmVjYXVzZSB0aGUgc2VydmVyIHdpbGwgbm90IGFjY2VwdCBoaWdoZXIpLCB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlcgogICAgIGlzIDB4MDMsMHgwMSwgbm90IDB4MDMsMHgwMAogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIFJ1biBleHRlbnNpdmUgbWVtb3J5IGxlYWsgY2hlY2tzIG9uIFNTTCBhcHBzLiBGaXhlZCAqbG90cyogb2YgbWVtb3J5CiAgICAgbGVha3MgaW4gc3NsLyByZWxhdGluZyB0byBuZXcgWDUwOV9nZXRfcHVia2V5KCkgYmVoYXZpb3VyLiBBbHNvIGZpeGVzCiAgICAgaW4gYXBwcy8gYW5kIGFuIHVucmVsYXRlZCBsZWFrIGluIGNyeXB0by9kc2EvZHNhX3ZyZi5jCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgUkFXIGV4dGVuc2lvbnMgd2hlcmUgYW4gYXJiaXRyYXJ5IGV4dGVuc2lvbiBjYW4gYmUKICAgICBjcmVhdGVkIGJ5IGluY2x1ZGluZyBpdHMgREVSIGVuY29kaW5nLiBTZWUgYXBwcy9vcGVuc3NsLmNuZiBmb3IKICAgICBhbiBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc3VyZSBsYXRlc3QgUGVybCB2ZXJzaW9ucyBkb24ndCBpbnRlcnByZXQgc29tZSBnZW5lcmF0ZWQgQyBhcnJheQogICAgIGNvZGUgYXMgUGVybCBhcnJheSBjb2RlIGluIHRoZSBjcnlwdG8vZXJyL2Vycl9nZW5jLnBsIHNjcmlwdC4KICAgICBbTGFycyBXZWJlciA8M3dlYmVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBNb2RpZnkgbXMvZG9fbXMuYmF0IHRvIG5vdCBnZW5lcmF0ZSBhc3NlbWJseSBsYW5ndWFnZSBtYWtlZmlsZXMgc2luY2UKICAgICBub3QgbWFueSBwZW9wbGUgaGF2ZSB0aGUgYXNzZW1ibGVyLiBWYXJpb3VzIFdpbjMyIGNvbXBpbGF0aW9uIGZpeGVzIGFuZAogICAgIHVwZGF0ZSB0byB0aGUgSU5TVEFMTC5XMzIgZmlsZSB3aXRoIChob3BlZnVsbHkpIG1vcmUgYWNjdXJhdGUgV2luMzIKICAgICBidWlsZCBpbnN0cnVjdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGNvbmZpZ3VyZSBzY3JpcHQgJ0NvbmZpZ3VyZScgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgY3J5cHRvL2RhdGUuaAogICAgIGZpbGUgdW5kZXIgV2luMzIgYW5kIGFsc28gYnVpbGQgcGVtLmggZnJvbSBwZW0ub3JnLiBOZXcgc2NyaXB0CiAgICAgdXRpbC9ta2ZpbGVzLnBsIHRvIGNyZWF0ZSB0aGUgTUlORk8gZmlsZSBvbiBlbnZpcm9ubWVudHMgdGhhdCBjYW4ndCBkbyBhCiAgICAgJ21ha2UgZmlsZXMnOiBwZXJsIHV0aWwvbWtmaWxlcy5wbCA+TUlORk8gc2hvdWxkIHdvcmsuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFqb3IgcmV3b3JrIG9mIERFUyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIGluIHRoZSBwdXJzdWl0IG9mIGNvcnJlY3RuZXNzCiAgICAgYW5kIHB1cml0eS4gQXMgYSByZXN1bHQsIG1hbnkgZXZpbCBjYXN0cyBldmFwb3JhdGVkLCBhbmQgc29tZSB3ZWlyZG5lc3MsCiAgICAgdG9vLiBZb3UgbWF5IGZpbmQgdGhpcyBjYXVzZXMgd2FybmluZ3MgaW4geW91ciBjb2RlLiBaYXBwaW5nIHlvdXIgZXZpbAogICAgIGNhc3RzIHdpbGwgcHJvYmFibHkgZml4IHRoZW0uIE1vc3RseS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGZvciBhIHR5cG8gaW4gYXNuMS5oLiBCdWcgZml4IHRvIG9iamVjdCBjcmVhdGlvbiBzY3JpcHQKICAgICBvYmpfZGF0LnBsLiBJdCBjb25zaWRlcmVkIGEgemVybyBpbiBhbiBvYmplY3QgZGVmaW5pdGlvbiB0byBtZWFuCiAgICAgImVuZCBvZiBvYmplY3QiOiBub25lIG9mIHRoZSBvYmplY3RzIGluIG9iamVjdHMuaCBoYXZlIGFueSB6ZXJvcwogICAgIHNvIGl0IHdhc24ndCBzcG90dGVkLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEVyd2FubiBBQkFMRUEgPGVhYmFsZWFAY2VydHBsdXMuY29tPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRyaXBsZSBERVMgQ2lwaGVyIEJsb2NrIENoYWluaW5nIHdpdGggT3V0cHV0IEZlZWRiYWNrCiAgICAgTWFza2luZyAoQ0JDTSkuIEluIHRoZSBhYnNlbmNlIG9mIHRlc3QgdmVjdG9ycywgdGhlIGJlc3QgSSBoYXZlIGJlZW4gYWJsZQogICAgIHRvIGRvIGlzIGNoZWNrIHRoYXQgdGhlIGRlY3J5cHQgdW5kb2VzIHRoZSBlbmNyeXB0LCBzbyBmYXIuIFNlbmQgbWUgdGVzdAogICAgIHZlY3RvcnMgaWYgeW91IGhhdmUgdGhlbS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ29ycmVjdCBjYWxjdWxhdGlvbiBvZiBrZXkgbGVuZ3RoIGZvciBleHBvcnQgY2lwaGVycyAodG9vIG11Y2ggc3BhY2Ugd2FzCiAgICAgYWxsb2NhdGVkIGZvciBudWxsIGNpcGhlcnMpLiBUaGlzIGhhcyBub3QgYmVlbiB0ZXN0ZWQhCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1vZGlmaWNhdGlvbnMgdG8gdGhlIG1rZGVmLnBsIGZvciBXaW4zMiBERUYgZmlsZSBjcmVhdGlvbi4gVGhlIHVzYWdlCiAgICAgbWVzc2FnZSBpcyBub3cgY29ycmVjdCAoaXQgdW5kZXJzdGFuZHMgImNyeXB0byIgYW5kICJzc2wiIG9uIGl0cwogICAgIGNvbW1hbmQgbGluZSkuIFRoZXJlIGlzIGFsc28gbm93IGFuICJ1cGRhdGUiIG9wdGlvbi4gVGhpcyB3aWxsIHVwZGF0ZQogICAgIHRoZSB1dGlsL3NzbGVheS5udW0gYW5kIHV0aWwvbGliZWF5Lm51bSBmaWxlcyB3aXRoIGFueSBuZXcgZnVuY3Rpb25zLgogICAgIElmIHlvdSBkbyBhOiAKICAgICBwZXJsIHV0aWwvbWtkZWYucGwgY3J5cHRvIHNzbCB1cGRhdGUKICAgICBpdCB3aWxsIHVwZGF0ZSB0aGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE92ZXJoYXVsZWQgdGhlIFBlcmwgaW50ZXJmYWNlIChwZXJsLyopOgogICAgIC0gcG9ydGVkIEJOIHN0dWZmIHRvIE9wZW5TU0wncyBkaWZmZXJlbnQgQk4gbGlicmFyeQogICAgIC0gbWFkZSB0aGUgcGVybC8gc291cmNlIHRyZWUgQ1ZTLWF3YXJlCiAgICAgLSByZW5hbWVkIHRoZSBwYWNrYWdlIGZyb20gU1NMZWF5IHRvIE9wZW5TU0wgKHRoZSBmaWxlcyBzdGlsbCBjb250YWluCiAgICAgICB0aGVpciBoaXN0b3J5IGJlY2F1c2UgSSd2ZSBjb3BpZWQgdGhlbSBpbiB0aGUgcmVwb3NpdG9yeSkKICAgICAtIHJlbW92ZWQgb2Jzb2xldGUgZmlsZXMgKHRoZSB0ZXN0IHNjcmlwdHMgd2lsbCBiZSByZXBsYWNlZAogICAgICAgYnkgYmV0dGVyIFRlc3Q6Okhhcm5lc3MgdmFyaWFudHMgaW4gdGhlIGZ1dHVyZSkKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRmlyc3QgY3V0IGZvciBhIHZlcnkgY29uc2VydmF0aXZlIHNvdXJjZSB0cmVlIGNsZWFudXA6CiAgICAgMS4gbWVyZ2UgdmFyaW91cyBvYnNvbGV0ZSByZWFkbWUgdGV4dHMgaW50byBkb2Mvc3NsZWF5LnR4dAogICAgIHdoZXJlIHdlIGNvbGxlY3QgdGhlIG9sZCBkb2N1bWVudHMgYW5kIHJlYWRtZSB0ZXh0cy4KICAgICAyLiByZW1vdmUgdGhlIGZpcnN0IHBhcnQgb2YgZmlsZXMgd2hlcmUgSSdtIGFscmVhZHkgc3VyZSB0aGF0IHdlIG5vCiAgICAgbG9uZ2VyIG5lZWQgdGhlbSBiZWNhdXNlIG9mIHRocmVlIHJlYXNvbnM6IGVpdGhlciB0aGV5IGFyZSBqdXN0IHRlbXBvcmFyeQogICAgIGZpbGVzIHdoaWNoIHdlcmUgbGVmdCBieSBFcmljIG9yIHRoZXkgYXJlIHByZXNlcnZlZCBvcmlnaW5hbCBmaWxlcyB3aGVyZQogICAgIEkndmUgdmVyaWZpZWQgdGhhdCB0aGUgZGlmZiBpcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgQ1ZTIHZpYSAiY3ZzIGRpZmYKICAgICAtclNTTGVheV8wXzhfMWIiIG9yIHRoZXkgd2VyZSByZW5hbWVkIChhcyBpdCB3YXMgZGVmaW5pdGVseSB0aGUgY2FzZSBmb3IKICAgICB0aGUgY3J5cHRvL21kLyBzdHVmZikuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1vcmUgZXh0ZW5zaW9uIGNvZGUuIEluY29tcGxldGUgc3VwcG9ydCBmb3Igc3ViamVjdCBhbmQgaXNzdWVyIGFsdAogICAgIG5hbWUsIGlzc3VlciBhbmQgYXV0aG9yaXR5IGtleSBpZC4gQ2hhbmdlIHRoZSBpMnYgZnVuY3Rpb24gcGFyYW1ldGVycwogICAgIGFuZCBhZGQgYW4gZXh0cmEgJ2NybCcgcGFyYW1ldGVyIGluIHRoZSBYNTA5VjNfQ1RYIHN0cnVjdHVyZTogZ3Vlc3MKICAgICB3aGF0IHRoYXQncyBmb3IgOi0pIEZpeCB0byBBU04xIG1hY3JvIHdoaWNoIG1lc3NlZCB1cAogICAgIElNUExJQ0lUIHRhZyBhbmQgYWRkIGZfZW51bS5jIHdoaWNoIGFkZHMgYTJpLCBpMmEgZm9yIEVOVU1FUkFURUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgRU5VTUVSQVRFRCB0eXBlLiBUaGlzIGlzIGxhcmdlbHkgY29waWVkIGZyb20gdGhlCiAgICAgSU5URUdFUiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb24sIEVWUF9NRF9DVFhfY29weSgpIHRvIHJlcGxhY2UgZnJlcXVlbnQgdXNlIG9mIG1lbWNweS4KICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBNYWtlIHN1cmUgYG1ha2UgcmVoYXNoJyB0YXJnZXQgcmVhbGx5IGZpbmRzIHRoZSBgb3BlbnNzbCcgcHJvZ3JhbS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIFNxdWVlemUgYW5vdGhlciA3JSBvZiBzcGVlZCBvdXQgb2YgTUQ1IGFzc2VtYmxlciwgYXQgbGVhc3Qgb24gYSBQMi4gSSdkCiAgICAgbGlrZSB0byBoZWFyIGFib3V0IGl0IGlmIHRoaXMgc2xvd3MgZG93biBvdGhlciBwcm9jZXNzb3JzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgQ3lnV2luMzIgcGxhdGZvcm0gaW5mb3JtYXRpb24gdG8gQ29uZmlndXJlIHNjcmlwdC4KICAgICBbQWxhbiBCYXRpZSA8YmF0aWVAYWFoei5qZi5pbnRlbC5jb20+XQoKICAqKSBGaXhlZCBtcy8zMmFsbC5iYXQgc2NyaXB0OiBgbm9fYXNtJyAtPiBgbm8tYXNtJwogICAgIFtSYWluZXIgVy4gR2VybGluZyA8Z2VybGluZ0BtcGctZ3YubXBnLmRlPl0KICAKICAqKSBOZXcgcHJvZ3JhbSBuc2VxIHRvIG1hbmlwdWxhdGUgbmV0c2NhcGUgY2VydGlmaWNhdGUgc2VxdWVuY2VzCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGNybDJwa2NzNyBzbyBpdCBzdXBwb3J0cyBtdWx0aXBsZSAtY2VydGZpbGUgYXJndW1lbnRzLiBGaXggYQogICAgIGZldyB0eXBvcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBCTiBjb2RlLiAgUHJldmlvdXNseSB0aGUgZGVmYXVsdCB3YXMgdG8gZGVmaW5lIEJOX1JFQ1VSU0lPTgogICAgIGJ1dCB0aGUgQk4gY29kZSBoYWQgc29tZSBwcm9ibGVtcyB0aGF0IHdvdWxkIGNhdXNlIGZhaWx1cmVzIHdoZW4KICAgICBkb2luZyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYW5kIHNvbWUgb3RoZXIgZnVuY3Rpb25zLgogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIEFkZCBBU04xIGFuZCBQRU0gY29kZSB0byBzdXBwb3J0IG5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQVNOMSBhbmQgUEVNIGNvZGUgdG8gc3VwcG9ydCBuZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNldmVyYWwgUEtJWCBhbmQgcHJpdmF0ZSBleHRlbmRlZCBrZXkgdXNhZ2UgT0lEcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlICdjYScgcHJvZ3JhbSB0byBoYW5kbGUgdGhlIG5ldyBleHRlbnNpb24gY29kZS4gTW9kaWZ5CiAgICAgb3BlbnNzbC5jbmYgZm9yIG5ldyBleHRlbnNpb24gZm9ybWF0LCBhZGQgY29tbWVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9yZSBYNTA5IFYzIGNoYW5nZXMuIEZpeCB0eXBvIGluIHYzX2JpdHN0ci5jLiBBZGQgc3VwcG9ydCB0byAncmVxJwogICAgIGFuZCBhZGQgYSBzYW1wbGUgdG8gb3BlbnNzbC5jbmYgc28gcmVxIC14NTA5IG5vdyBhZGRzIGFwcHJvcHJpYXRlCiAgICAgQ0EgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb250aW51ZWQgWDUwOSBWMyBjaGFuZ2VzLiBBZGQgdG8gb3RoZXIgbWFrZWZpbGVzLCBpbnRlZ3JhdGUgd2l0aCB0aGUKICAgICBlcnJvciBjb2RlLCBhZGQgaW5pdGlhbCBzdXBwb3J0IHRvIFg1MDlfcHJpbnQoKSBhbmQgeDUwOSBhcHBsaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUYWtlcyBhIGRlZXAgYnJlYXRoIGFuZCBzdGFydCBhZGRpbmcgWDUwOSBWMyBleHRlbnNpb24gc3VwcG9ydCBjb2RlLiBBZGQKICAgICBmaWxlcyBpbiBjcnlwdG8veDUwOXYzLiBNb3ZlIG9yaWdpbmFsIHN0dWZmIHRvIGNyeXB0by94NTA5djMvb2xkLiBBbGwgdGhpcwogICAgIHN0dWZmIGlzIGN1cnJlbnRseSBpc29sYXRlZCBhbmQgaXNuJ3QgZXZlbiBjb21waWxlZCB5ZXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29udGludWluZyBwYXRjaGVzIGZvciBHZW5lcmFsaXplZFRpbWUuIEZpeCB1cCBjZXJ0aWZpY2F0ZSBhbmQgQ1JMCiAgICAgQVNOMSB0byB1c2UgQVNOMV9USU1FIGFuZCBtb2RpZnkgcHJpbnQgcm91dGluZXMgdG8gdXNlIEFTTjFfVElNRV9wcmludC4KICAgICBSZW1vdmVkIHRoZSB2ZXJzaW9ucyBjaGVjayBmcm9tIFg1MDkgcm91dGluZXMgd2hlbiBsb2FkaW5nIGV4dGVuc2lvbnM6CiAgICAgdGhpcyBhbGxvd3MgY2VydGFpbiBicm9rZW4gY2VydGlmaWNhdGVzIHRoYXQgZG9uJ3Qgc2V0IHRoZSB2ZXJzaW9uCiAgICAgcHJvcGVybHkgdG8gYmUgcHJvY2Vzc2VkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIERlYWwgd2l0aCBpcnJpdGF0aW5nIHNoaXQgdG8gZG8gd2l0aCBkZXBlbmRlbmNpZXMsIGluIFlBQUhXIChZZXQgQW5vdGhlcgogICAgIEFkIEhvYyBXYXkpIC0gTWFrZWZpbGUuc3NscyBub3cgYWxsIGNvbnRhaW4gbG9jYWwgZGVwZW5kZW5jaWVzLCB3aGljaAogICAgIGNhbiBzdGlsbCBiZSByZWdlbmVyYXRlZCB3aXRoICJtYWtlIGRlcGVuZCIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFNwZWxsaW5nIG1pc3Rha2UgaW4gQyB2ZXJzaW9uIG9mIENBU1QtMTI4LgogICAgIFtCZW4gTGF1cmllLCByZXBvcnRlZCBieSBKZXJlbXkgSHlsdG9uIDxqZXJlbXlAY25yaS5yZXN0b24udmEudXM+XQoKICAqKSBDaGFuZ2VzIHRvIHRoZSBlcnJvciBnZW5lcmF0aW9uIGNvZGUuIFRoZSBwZXJsIHNjcmlwdCBlcnItY29kZS5wbCAKICAgICBub3cgcmVhZHMgaW4gdGhlIG9sZCBlcnJvciBjb2RlcyBhbmQgcmV0YWlucyB0aGUgb2xkIG51bWJlcnMsIG9ubHkKICAgICBhZGRpbmcgbmV3IG9uZXMgaWYgbmVjZXNzYXJ5LiBJdCBhbHNvIG9ubHkgY2hhbmdlcyB0aGUgLmVyciBmaWxlcyBpZiBuZXcKICAgICBjb2RlcyBhcmUgYWRkZWQuIFRoZSBtYWtlZmlsZXMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIG9ubHkgaW5zZXJ0IGVycm9ycwogICAgIHdoZW4gbmVlZGVkICh0byBhdm9pZCBuZWVkbGVzc2x5IG1vZGlmeWluZyBoZWFkZXIgZmlsZXMpLiBUaGlzIGlzIGRvbmUKICAgICBieSBvbmx5IGluc2VydGluZyBlcnJvcnMgaWYgdGhlIC5lcnIgZmlsZSBpcyBuZXdlciB0aGFuIHRoZSBhdXRvIGdlbmVyYXRlZAogICAgIEMgZmlsZS4gVG8gcmVidWlsZCBhbGwgdGhlIGVycm9yIGNvZGVzIGZyb20gc2NyYXRjaCAodGhlIG9sZCBiZWhhdmlvdXIpCiAgICAgZWl0aGVyIG1vZGlmeSBjcnlwdG8vTWFrZWZpbGUuc3NsIHRvIHBhc3MgdGhlIC1yZWdlbiBmbGFnIHRvIGVycl9jb2RlLnBsCiAgICAgb3IgZGVsZXRlIGFsbCB0aGUgLmVyciBmaWxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDQVNULTEyOCB3YXMgaW5jb3JyZWN0bHkgaW1wbGVtZW50ZWQgZm9yIHNob3J0IGtleXMuIFRoZSBDIHZlcnNpb24gaGFzCiAgICAgYmVlbiBmaXhlZCwgYnV0IGlzIHVudGVzdGVkLiBUaGUgYXNzZW1ibGVyIHZlcnNpb25zIGFyZSBhbHNvIGZpeGVkLCBidXQKICAgICBuZXcgYXNzZW1ibGVyIEhBUyBOT1QgQkVFTiBHRU5FUkFURUQgRk9SIFdJTjMyIC0gdGhlIE1ha2VmaWxlIG5lZWRzIGZpeGluZwogICAgIHRvIHJlZ2VuZXJhdGUgaXQgaWYgbmVlZGVkLgogICAgIFtCZW4gTGF1cmllLCByZXBvcnRlZCAod2l0aCBmaXggZm9yIEMgdmVyc2lvbikgYnkgSnVuLWljaGlybyBpdG9qdW4KICAgICAgSGFnaW5vIDxpdG9qdW5Aa2FtZS5uZXQ+XQoKICAqKSBGaWxlIHdhcyBvcGVuZWQgaW5jb3JyZWN0bHkgaW4gcmFuZGZpbGUuYy4KICAgICBbVWxmIE32bGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQmVnaW5uaW5nIG9mIHN1cHBvcnQgZm9yIEdlbmVyYWxpemVkVGltZS4gZDJpLCBpMmQsIGNoZWNrIGFuZCBwcmludAogICAgIGZ1bmN0aW9ucy4gQWxzbyBBU04xX1RJTUUgc3VpdGUgd2hpY2ggaXMgYSBDSE9JQ0Ugb2YgVVRDVGltZSBvcgogICAgIEdlbmVyYWxpemVkVGltZS4gQVNOMV9USU1FIGlzIHRoZSBwcm9wZXIgdHlwZSB1c2VkIGluIGNlcnRpZmljYXRlcyBldAogICAgIGFsOiBpdCdzIGp1c3QgYWxtb3N0IGFsd2F5cyBhIFVUQ1RpbWUuIE5vdGUgdGhpcyBwYXRjaCBhZGRzIG5ldyBlcnJvcgogICAgIGNvZGVzIHNvIGRvIGEgIm1ha2UgZXJyb3JzIiBpZiB0aGVyZSBhcmUgcHJvYmxlbXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29ycmVjdCBMaW51eCAxIHJlY29nbml0aW9uIGluIGNvbmZpZy4KICAgICBbVWxmIE32bGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgUmVtb3ZlIHBvaW50bGVzcyBNRDUgaGFzaCB3aGVuIHVzaW5nIERTQSBrZXlzIGluIGNhLgogICAgIFtBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgR2VuZXJhdGUgYW4gZXJyb3IgaWYgZ2l2ZW4gYW4gZW1wdHkgc3RyaW5nIGFzIGEgY2VydCBkaXJlY3RvcnkuIEFsc28KICAgICBnZW5lcmF0ZSBhbiBlcnJvciBpZiBoYW5kZWQgTlVMTCAocHJldmlvdXNseSByZXR1cm5lZCAwIHRvIGluZGljYXRlIGFuCiAgICAgZXJyb3IsIGJ1dCBkaWRuJ3Qgc2V0IG9uZSkuCiAgICAgW0JlbiBMYXVyaWUsIHJlcG9ydGVkIGJ5IEFub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBBZGQgcHJvdG90eXBlcyB0byBTU0wgbWV0aG9kcy4gTWFrZSBTU0xfd3JpdGUncyBidWZmZXIgY29uc3QsIGF0IGxhc3QuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCB0aGUgZHVtbXkgZnVuY3Rpb24gQk5fcmVmX21vZF9leHAoKSBpbiByc2FyZWYuYyB0byBoYXZlIHRoZSBjb3JyZWN0CiAgICAgcGFyYW1ldGVycy4gVGhpcyB3YXMgY2F1c2luZyBhIHdhcm5pbmcgd2hpY2gga2lsbGVkIG9mZiB0aGUgV2luMzIgY29tcGlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgQysrIHN0eWxlIGNvbW1lbnRzIGZyb20gY3J5cHRvL2JuL2JuX2xvY2FsLmguCiAgICAgW05laWwgQ29zdGlnYW4gPG5laWwuY29zdGlnYW5AY2Vsb2NvbS5jb20+XQoKICAqKSBUaGUgZnVuY3Rpb24gT0JKX3R4dDJuaWQgd2FzIGJyb2tlbi4gSXQgd2FzIHN1cHBvc2VkIHRvIHJldHVybiBhIG5pZAogICAgIGJhc2VkIG9uIGEgdGV4dCBzdHJpbmcsIGxvb2tpbmcgdXAgc2hvcnQgYW5kIGxvbmcgbmFtZXMgYW5kIGZpbmFsbHkKICAgICAiZG90IiBmb3JtYXQuIFRoZSAiZG90IiBmb3JtYXQgc3R1ZmYgZGlkbid0IHdvcmsuIEFkZGVkIG5ldyBmdW5jdGlvbgogICAgIE9CSl90eHQyb2JqIHRvIGRvIHRoZSBzYW1lIGJ1dCByZXR1cm4gYW4gQVNOMV9PQkpFQ1QgYW5kIHJld3JvdGUgCiAgICAgT0JKX3R4dDJuaWQgdG8gdXNlIGl0LiBPQkpfdHh0Mm9iaiBjYW4gYWxzbyByZXR1cm4gb2JqZWN0cyBldmVuIGlmIHRoZQogICAgIE9JRCBpcyBub3QgcGFydCBvZiB0aGUgdGFibGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHByb3RvdHlwZXMgdG8gWDUwOSBsb29rdXAvdmVyaWZ5IG1ldGhvZHMsIGZpeGluZyBhIGJ1ZyBpbgogICAgIFg1MDlfTE9PS1VQX2J5X2FsaWFzKCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFNvcnQgb3BlbnNzbCBmdW5jdGlvbnMgYnkgbmFtZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgR2V0IHRoZSBnZW5kc2EgcHJvZ3JhbSB3b3JraW5nIChob3BlZnVsbHkpIGFuZCBhZGQgaXQgdG8gYXBwIGxpc3QuIFJlbW92ZQogICAgIGVuY3J5cHRpb24gZnJvbSBzYW1wbGUgRFNBIGtleXMgKGluIGNhc2UgYW55b25lIGlzIGludGVyZXN0ZWQgdGhlIHBhc3N3b3JkCiAgICAgd2FzICIxMjM0IikuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBfYWxsXyAqX2ZyZWUgZnVuY3Rpb25zIGFjY2VwdCBhIE5VTEwgcG9pbnRlci4KICAgICBbRnJhbnMgSGV5bWFucyA8ZmhleW1hbnNAaXNhc2VydmVyLmJlPl0KCiAgKikgSWYgYSBESCBrZXkgaXMgZ2VuZXJhdGVkIGluIHMzX3NydnIuYywgZG9uJ3QgYmxvdyBpdCBieSB0cnlpbmcgdG8gdXNlCiAgICAgTlVMTCBwb2ludGVycy4KICAgICBbQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIHNfc2VydmVyIHNob3VsZCBzZW5kIHRoZSBDQWZpbGUgYXMgYWNjZXB0YWJsZSBDQXMsIG5vdCBpdHMgb3duIGNlcnQuCiAgICAgW0JvZG8gTW9lbGxlciA8M21vZWxsZXJAaW5mb3JtYXRpay51bmktaGFtYnVyZy5kZT5dCgogICopIERvbid0IGJsb3cgaXQgZm9yIG51bWVyaWMgLW5ld2tleSBhcmd1bWVudHMgdG8gYXBwcy9yZXEuCiAgICAgW0JvZG8gTW9lbGxlciA8M21vZWxsZXJAaW5mb3JtYXRpay51bmktaGFtYnVyZy5kZT5dCgogICopIFRlbXAga2V5ICJmb3IgZXhwb3J0IiB0ZXN0cyB3ZXJlIHdyb25nIGluIHMzX3NydnIuYy4KICAgICBbQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIEFkZCBwcm90b3R5cGUgZm9yIHRlbXAga2V5IGNhbGxiYWNrIGZ1bmN0aW9ucwogICAgIFNTTF9DVFhfc2V0X3RtcF97cnNhLGRofV9jYWxsYmFjaygpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIERIX2ZyZWUoKSB0b2xlcmF0ZSBiZWluZyBwYXNzZWQgYSBOVUxMIHBvaW50ZXIgKGxpa2UgUlNBX2ZyZWUoKSBhbmQKICAgICBEU0FfZnJlZSgpKS4gTWFrZSBYNTA5X1BVQktFWV9zZXQoKSBjaGVjayBmb3IgZXJyb3JzIGluIGQyaV9QdWJsaWNLZXkoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBYNTA5X25hbWVfYWRkX2VudHJ5KCkgZnJlZWQgdGhlIHdyb25nIHRoaW5nIGFmdGVyIGFuIGVycm9yLgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSByc2FfZWF5LmMgd291bGQgYXR0ZW1wdCB0byBmcmVlIGEgTlVMTCBjb250ZXh0LgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBCSU9fc19zb2NrZXQoKSBoYWQgYSBicm9rZW4gc2hvdWxkX3JldHJ5KCkgb24gV2luZG96ZS4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgQklPX2ZfYnVmZmVyKCkgZGlkbid0IHBhc3Mgb24gQklPX0NUUkxfRkxVU0guCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIE1ha2Ugc3VyZSB0aGUgYWxyZWFkeSBleGlzdGluZyBYNTA5X1NUT1JFLT5kZXB0aCB2YXJpYWJsZSBpcyBpbml0aWFsaXplZAogICAgIGluIFg1MDlfU1RPUkVfbmV3KCksIGJ1dCBkb2N1bWVudCB0aGUgZmFjdCB0aGF0IHRoaXMgdmFyaWFibGUgaXMgc3RpbGwKICAgICB1bnVzZWQgaW4gdGhlIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBwcm9jZXNzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXggdGhlIHZhcmlvdXMgbGlicmFyeSBhbmQgYXBwcyBmaWxlcyB0byBmcmVlIHVwIHBrZXlzIG9idGFpbmVkIGZyb20KICAgICBYNTA5X1BVQktFWV9nZXQoKSBldCBhbC4gQWxzbyBhbGxvdyB4NTA5LmMgdG8gaGFuZGxlIG5ldHNjYXBlIGV4dGVuc2lvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHJlZmVyZW5jZSBjb3VudGluZyBpbiBYNTA5X1BVQktFWV9nZXQoKS4gVGhpcyBtYWtlcwogICAgIGRlbW9zL21hdXJpY2UvZXhhbXBsZTIuYyB3b3JrLCBhbW9uZ3N0IG90aGVycywgcHJvYmFibHkuCiAgICAgW1N0ZXZlIEhlbnNvbiBhbmQgQmVuIExhdXJpZV0KCiAgKikgRmlyc3QgY3V0IG9mIGEgY2xlYW51cCBmb3IgYXBwcy8uIEZpcnN0IHRoZSBgc3NsZWF5JyBwcm9ncmFtIGlzIG5vdyBuYW1lZAogICAgIGBvcGVuc3NsJyBhbmQgc2Vjb25kLCB0aGUgc2hvcnRjdXQgc3ltbGlua3MgZm9yIHRoZSBgb3BlbnNzbCA8Y29tbWFuZD4nCiAgICAgYXJlIG5vIGxvbmdlciBjcmVhdGVkLiBUaGlzIHdheSB3ZSBoYXZlIGEgc2luZ2xlIGFuZCBjb25zaXN0ZW50IGNvbW1hbmQKICAgICBsaW5lIGludGVyZmFjZSBgb3BlbnNzbCA8Y29tbWFuZD4nLCBzaW1pbGFyIHRvIGBjdnMgPGNvbW1hbmQ+Jy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgUGF1bCBTdXR0b24gYW5kIEJlbiBMYXVyaWVdCgogICopIGNhLmM6IG1vdmUgdGVzdCBmb3IgRFNBIGtleXMgaW5zaWRlICNpZm5kZWYgTk9fRFNBLiBNYWtlIHB1YmtleQogICAgIEJJVCBTVFJJTkcgd3JhcHBlciBhbHdheXMgaGF2ZSB6ZXJvIHVudXNlZCBiaXRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBDQS5wbCwgcGVybCB2ZXJzaW9uIG9mIENBLnNoLCBhZGQgZXh0ZW5kZWQga2V5IHVzYWdlIE9JRC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHRoZSB0b3AtbGV2ZWwgSU5TVEFMTCBkb2N1bWVudGF0aW9uIGVhc2llciB0byB1bmRlcnN0YW5kLgogICAgIFtQYXVsIFN1dHRvbl0KCiAgKikgTWFrZWZpbGVzIHVwZGF0ZWQgdG8gZXhpdCBpZiBhbiBlcnJvciBvY2N1cnMgaW4gYSBzdWItZGlyZWN0b3J5CiAgICAgbWFrZSAoaW5jbHVkaW5nIGlmIHVzZXIgcHJlc3NlcyBeQykgW1BhdWwgU3V0dG9uXQoKICAqKSBNYWtlIE1vbnRnb21lcnkgY29udGV4dCBzdHVmZiBleHBsaWNpdCBpbiBSU0EgZGF0YSBzdHJ1Y3R1cmUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCBidWlsZCBvcmRlciBvZiBwZW0gYW5kIGVyciB0byBhbGxvdyBmb3IgZ2VuZXJhdGVkIHBlbS5oLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggcmVudW1iZXJpbmcgYnVnIGluIFg1MDlfTkFNRV9kZWxldGVfZW50cnkoKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRW5oYW5jZWQgdGhlIGVyci1pbnMucGwgc2NyaXB0IHNvIGl0IG1ha2VzIHRoZSBlcnJvciBsaWJyYXJ5IG51bWJlciAKICAgICBnbG9iYWwgYW5kIGNhbiBhZGQgYSBsaWJyYXJ5IG5hbWUuIFRoaXMgaXMgbmVlZGVkIGZvciBleHRlcm5hbCBBU04xIGFuZAogICAgIG90aGVyIGVycm9yIGxpYnJhcmllcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlZCBza19pbnNlcnQgd2hpY2ggbmV2ZXIgd29ya2VkIHByb3Blcmx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBBU04xIG1hY3JvcyBzbyB0aGV5IGNhbiBoYW5kbGUgaW5kZWZpbml0ZSBsZW5ndGggY29uc3RydWN0ZWQgCiAgICAgRVhQTElDSVQgdGFncy4gU29tZSBub24gc3RhbmRhcmQgY2VydGlmaWNhdGVzIHVzZSB0aGVzZTogdGhleSBjYW4gbm93CiAgICAgYmUgcmVhZCBpbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNZXJnZWQgdGhlIHZhcmlvdXMgb2xkL29ic29sZXRlIFNTTGVheSBkb2N1bWVudGF0aW9uIGZpbGVzIChkb2MveHh4LmRvYykKICAgICBpbnRvIGEgc2luZ2xlIGRvYy9zc2xlYXkudHh0IGJ1bmRsZS4gVGhpcyB3YXkgdGhlIGluZm9ybWF0aW9uIGlzIHN0aWxsCiAgICAgcHJlc2VydmVkIGJ1dCBubyBsb25nZXIgbWVzc2VzIHVwIHRoaXMgZGlyZWN0b3J5LiBOb3cgaXQncyBuZXcgcm9vbSBmb3IKICAgICB0aGUgbmV3IHNldCBvZiBkb2N1bWVudGF0aW9uIGZpbGVzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBTRVRzIHdlcmUgaW5jb3JyZWN0bHkgREVSIGVuY29kZWQuIFRoaXMgd2FzIGEgbWFqb3IgcGFpbiwgYmVjYXVzZSB0aGV5CiAgICAgc2hhcmVkIGNvZGUgd2l0aCBTRVFVRU5DRXMsIHdoaWNoIGFyZW4ndCBjb2RlZCB0aGUgc2FtZS4gVGhpcyBtZWFucyB0aGF0CiAgICAgYWxtb3N0IGV2ZXJ5dGhpbmcgdG8gZG8gd2l0aCBTRVRzIG9yIFNFUVVFTkNFcyBoYXMgZWl0aGVyIGNoYW5nZWQgbmFtZSBvcgogICAgIG51bWJlciBvZiBhcmd1bWVudHMuCiAgICAgW0JlbiBMYXVyaWUsIGJhc2VkIG9uIGEgcGFydGlhbCBmaXggYnkgR1AgSmF5YW4gPGdwQG5zai5jby5qcD5dCgogICopIEZpeCB0ZXN0IGRhdGEgdG8gd29yayB3aXRoIHRoZSBhYm92ZS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHRoZSBSU0EgaGVhZGVyIGRlY2xhcmF0aW9ucyB0aGF0IGhpZCBhIGJ1ZyBJIGZpeGVkIGluIDAuOS4wYiBidXQKICAgICB3YXMgYWxyZWFkeSBmaXhlZCBieSBFcmljIGZvciAwLjkuMSBpdCBzZWVtcy4KICAgICBbQmVuIExhdXJpZSAtIHBvaW50ZWQgb3V0IGJ5IFVsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEF1dG9kZXRlY3QgRnJlZUJTRDMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCB2YXJpb3VzIGJ1Z3MgaW4gQ29uZmlndXJlLiBUaGlzIGFmZmVjdHMgdGhlIGZvbGxvd2luZyBwbGF0Zm9ybXM6CiAgICAgbmV4dHN0ZXAKICAgICBuY3Itc2NkZQogICAgIHVuaXh3YXJlLTIuMAogICAgIHVuaXh3YXJlLTIuMC1wZW50aXVtCiAgICAgc2NvNS1jYy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRWxpbWluYXRlIGdlbmVyYXRlZCBmaWxlcyBmcm9tIENWUy4gUmVvcmRlciB0ZXN0cyB0byByZWdlbmVyYXRlIGZpbGVzCiAgICAgYmVmb3JlIHRoZXkgYXJlIG5lZWRlZC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgR2VuZXJhdGUgTWFrZWZpbGUuc3NsIGZyb20gTWFrZWZpbGUub3JnICh0byBrZWVwIENWUyBoYXBweSkuCiAgICAgW0JlbiBMYXVyaWVdCgoKIENoYW5nZXMgYmV0d2VlbiAwLjkuMWIgYW5kIDAuOS4xYyAgWzIzLURlYy0xOTk4XQoKICAqKSBBZGRlZCBPUEVOU1NMX1ZFUlNJT05fTlVNQkVSIHRvIGNyeXB0by9jcnlwdG8uaCBhbmQgCiAgICAgY2hhbmdlZCBTU0xlYXkgdG8gT3BlblNTTCBpbiB2ZXJzaW9uIHN0cmluZ3MuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCiAgCiAgKikgU29tZSBmaXh1cHMgdG8gdGhlIHRvcC1sZXZlbCBkb2N1bWVudHMuCiAgICAgW1BhdWwgU3V0dG9uXQoKICAqKSBGaXhlZCB0aGUgbmFzdHkgYnVnIHdoZXJlIHJzYXJlZi5oIHdhcyBub3QgZm91bmQgdW5kZXIgY29tcGlsZS10aW1lCiAgICAgYmVjYXVzZSB0aGUgc3ltbGluayB0byBpbmNsdWRlLyB3YXMgbWlzc2luZy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgSW5jb3Jwb3JhdGVkIHRoZSBwb3B1bGFyIG5vLVJTQS9EU0Etb25seSBwYXRjaGVzIAogICAgIHdoaWNoIGFsbG93IHRvIGNvbXBpbGUgYSBSU0EtZnJlZSBTU0xlYXkuCiAgICAgW0FuZHJldyBDb29rZSAvIEludGVycmFkZXIgTGR0LiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4ZWQgbmFzdHkgcmVoYXNoIHByb2JsZW0gdW5kZXIgYG1ha2UgLWYgTWFrZWZpbGUuc3NsIGxpbmtzJwogICAgIHdoZW4gInNzbGVheSIgaXMgc3RpbGwgbm90IGZvdW5kLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGRlZCBtb3JlIHBsYXRmb3JtcyB0byBDb25maWd1cmU6IENyYXkgVDNFLCBIUFVYIDExLCAKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgQmVja21hbm4gPGJlY2ttYW5AYWNsLmxhbmwuZ292Pl0KCiAgKikgVXBkYXRlZCB0aGUgUkVBRE1FIGZpbGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIHZhcmlvdXMgLmN2c2lnbm9yZSBmaWxlcyBpbiB0aGUgQ1ZTIHJlcG9zaXRvcnkgc3ViZGlycwogICAgIHRvIG1ha2UgYSAiY3ZzIHVwZGF0ZSIgcmVhbGx5IHNpbGVudC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVjb21waWxlZCB0aGUgZXJyb3ItZGVmaW5pdGlvbiBoZWFkZXIgZmlsZXMgYW5kIGFkZGVkCiAgICAgbWlzc2luZyBzeW1ib2xzIHRvIHRoZSBXaW4zMiBsaW5rZXIgdGFibGVzLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBDbGVhbmVkIHVwIHRoZSB0b3AtbGV2ZWwgZG9jdW1lbnRzOwogICAgIG8gbmV3IGZpbGVzOiBDSEFOR0VTIGFuZCBMSUNFTlNFCiAgICAgbyBtZXJnZWQgVkVSU0lPTiwgSElTVE9SWSogYW5kIFJFQURNRSogZmlsZXMgYSBDSEFOR0VTLlNTTGVheSAKICAgICBvIG1lcmdlZCBDT1BZUklHSFQgaW50byBMSUNFTlNFCiAgICAgbyByZW1vdmVkIG9ic29sZXRlIFRPRE8gZmlsZQogICAgIG8gcmVuYW1lZCBNSUNST1NPRlQgdG8gSU5TVEFMTC5XMzIKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtb3ZlZCBkdW1teSBmaWxlcyBmcm9tIHRoZSAwLjkuMWIgc291cmNlIHRyZWU6IAogICAgIGNyeXB0by9hc24xL3ggY3J5cHRvL2Jpby9jZCBjcnlwdG8vYmlvL2ZnIGNyeXB0by9iaW8vZ3JlcCBjcnlwdG8vYmlvL3ZpCiAgICAgY3J5cHRvL2JuL2FzbS8uLi4uLi5hZGQuYyBjcnlwdG8vYm4vYXNtL2Eub3V0IGNyeXB0by9kc2EvZiBjcnlwdG8vbWQ1L2YKICAgICBjcnlwdG8vcGVtL2dtb24ub3V0IGNyeXB0by9wZXJsYXNtL2YgY3J5cHRvL3BrY3M3L2J1aWxkIGNyeXB0by9yc2EvZgogICAgIGNyeXB0by9zaGEvYXNtL2YgY3J5cHRvL3RocmVhZHMvZiBtcy96enogc3NsL2Ygc3NsL2YubWFrIHRlc3QvZgogICAgIHV0aWwvZi5tYWsgdXRpbC9wbC9mIHV0aWwvcGwvZi5tYWsgY3J5cHRvL2JmL2JmX2xvY2wub2xkIGFwcHMvZgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBBZGRlZCB2YXJpb3VzIHBsYXRmb3JtIHBvcnRhYmlsaXR5IGZpeGVzLgogICAgIFtNYXJrIEouIENveF0KCiAgKikgVGhlIEdlbmVzaXMgb2YgdGhlIE9wZW5TU0wgcnBqZWN0OgogICAgIFdlIHN0YXJ0IHdpdGggdGhlIGxhdGVzdCAodW5yZWxlYXNlZCkgU1NMZWF5IHZlcnNpb24gMC45LjFiIHdoaWNoIEVyaWMgQS4KICAgICBZb3VuZyBhbmQgVGltIEouIEh1ZHNvbiBjcmVhdGVkIHdoaWxlIHRoZXkgd2VyZSB3b3JraW5nIGZvciBDMk5ldCB1bnRpbAogICAgIHN1bW1lciAxOTk4LgogICAgIFtUaGUgT3BlblNTTCBQcm9qZWN0XQogCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4wYiBhbmQgMC45LjFiICBbbm90IHJlbGVhc2VkXQoKICAqKSBVcGRhdGVkIGEgZmV3IENBIGNlcnRpZmljYXRlcyB1bmRlciBjZXJ0cy8KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQ2hhbmdlZCBzb21lIEJJR05VTSBhcGkgc3R1ZmYuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIFZhcmlvdXMgcGxhdGZvcm0gcG9ydHM6IE9wZW5CU0QsIFVsdHJpeCwgSVJJWCA2NGJpdCwgTmV0QlNELCAKICAgICBER1VYIHg4NiwgTGludXggQWxwaGEsIGV0Yy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgTmV3IENPTVAgbGlicmFyeSBbY3J5cHRvL2NvbXAvXSBmb3IgU1NMIFJlY29yZCBMYXllciBDb21wcmVzc2lvbjogCiAgICAgUkxFIChkdW1teSBpbXBsZW1lbnRlZCkgYW5kIFpMSUIgKHJlYWxseSBpbXBsZW1lbnRlZCB3aGVuIFpMSUIgaXMKICAgICBhdmFpbGFibGUpLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGQgLXN0cnBhcnNlIG9wdGlvbiB0byBhc24xcGFycyBwcm9ncmFtIHdoaWNoIHBhcnNlcyBuZXN0ZWQgCiAgICAgYmluYXJ5IHN0cnVjdHVyZXMgCiAgICAgW0RyIFN0ZXBoZW4gSGVuc29uIDxzaGVuc29uQGJpZ2Zvb3QuY29tPl0KCiAgKikgQWRkZWQgIm9pZF9maWxlIiB0byBzc2xlYXkuY25mIGZvciAiY2EiIGFuZCAicmVxIiBwcm9ncmFtcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRFNBIGZpeCBmb3IgImNhIiBwcm9ncmFtLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCAiLWdlbmtleSIgb3B0aW9uIHRvICJkc2FwYXJhbSIgcHJvZ3JhbS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgUklQRSBNRDE2MCAocm1kMTYwKSBtZXNzYWdlIGRpZ2VzdC4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgLWEgKGFsbCkgb3B0aW9uIHRvICJzc2xlYXkgdmVyc2lvbiIgY29tbWFuZC4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgUExBVEZPUk0gZGVmaW5lIHdoaWNoIGlzIHRoZSBpZCBnaXZlbiB0byBDb25maWd1cmUuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIE1lbUNoZWNrX1hYWFggZnVuY3Rpb25zIHRvIGNyeXB0by9tZW0uYyBmb3IgbWVtb3J5IGNoZWNraW5nLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBFeHRlbmRlZCB0aGUgQVNOLjEgcGFyc2VyIHJvdXRpbmVzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBFeHRlbmRlZCBCSU8gcm91dGluZXMgdG8gc3VwcG9ydCBSRVVTRUFERFIsIHNlZWssIHRlbGwsIGV0Yy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgYSBCTl9DVFggdG8gdGhlIEJOIGxpYnJhcnkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEZpeGVkIHRoZSB3ZWFrIGtleSB2YWx1ZXMgaW4gREVTIGxpYnJhcnkKICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQ2hhbmdlZCBBUEkgaW4gRVZQIGxpYnJhcnkgZm9yIGNpcGhlciBhbGlhc2VzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBSQzIvNjRiaXQgY2lwaGVyLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDb252ZXJ0ZWQgdGhlIGxoYXNoIGxpYnJhcnkgdG8gdGhlIGNyeXB0by9tZW0uYyBmdW5jdGlvbnMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIG1vcmUgcmVjb2duaXplZCBBU04uMSBvYmplY3QgaWRzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBtb3JlIFJTQSBwYWRkaW5nIGNoZWNrcyBmb3IgU1NML1RMUy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgQklPIHByb3h5L2ZpbHRlciBmdW5jdGlvbmFsaXR5LgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBleHRyYV9jZXJ0cyB0byBTU0xfQ1RYIHdoaWNoIGNhbiBiZSB1c2VkCiAgICAgc2VuZCBleHRyYSBDQSBjZXJ0aWZpY2F0ZXMgdG8gdGhlIGNsaWVudCBpbiB0aGUgQ0EgY2VydCBjaGFpbiBzZW5kaW5nCiAgICAgcHJvY2Vzcy4gSXQgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBTU0xfQ1RYX2FkZF9leHRyYV9jaGFpbl9jZXJ0KCkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIE5vdyBGb3J0ZXp6YSBpcyBkZW5pZWQgaW4gdGhlIGF1dGhlbnRpY2F0aW9uIHBoYXNlIGJlY2F1c2UKICAgICB0aGlzIGlzIGtleSBleGNoYW5nZSBtZWNoYW5pc20gaXMgbm90IHN1cHBvcnRlZCBieSBTU0xlYXkgYXQgYWxsLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRpdGlvbmFsIFBLQ1MxIGNoZWNrcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgU3VwcG9ydCB0aGUgc3RyaW5nICJUTFN2MSIgZm9yIGFsbCBUTFMgdjEgY2lwaGVycy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgZnVuY3Rpb24gU1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfQ1RYX2lkeCgpIHdoaWNoIGdpdmVzIHRoZQogICAgIGV4X2RhdGEgaW5kZXggb2YgdGhlIFNTTCBjb250ZXh0IGluIHRoZSBYNTA5X1NUT1JFX0NUWCBleF9kYXRhLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBGaXhlZCBhIGZldyBtZW1vcnkgbGVha3MuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEZpeGVkIHZhcmlvdXMgY29kZSBhbmQgY29tbWVudCB0eXBvcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQSBtaW5vciBidWcgaW4gc3NsL3MzX2NsbnQuYyB3aGVyZSB0aGVyZSB3b3VsZCBhbHdheXMgYmUgNCAwIAogICAgIGJ5dGVzIHNlbnQgaW4gdGhlIGNsaWVudCByYW5kb20uCiAgICAgW0Vkd2FyZCBCaXNob3AgPGViaXNob3BAc3B5Z2xhc3MuY29tPl0KCg==