CiBPcGVuU1NMIENIQU5HRVMKIF9fX19fX19fX19fX19fXwoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNyBhbmQgMC45LjggIFt4eCBYWFggMjAwMl0KCiAgKikgQ2hhbmdlIHRoZSAicHJvZ3Jlc3MiIG1lY2hhbmlzbSB1c2VkIGluIGtleS1nZW5lcmF0aW9uIGFuZAogICAgIHByaW1hbGl0eSB0ZXN0aW5nIHRvIGZ1bmN0aW9ucyB0aGF0IHRha2UgYSBuZXcgQk5fR0VOQ0IgcG9pbnRlciBpbgogICAgIHBsYWNlIG9mIGNhbGxiYWNrL2FyZ3VtZW50IHBhaXJzLiBUaGUgbmV3IEFQSSBmdW5jdGlvbnMgaGF2ZSAiX2V4IgogICAgIHBvc3RmaXhlcyBhbmQgdGhlIG9sZGVyIGZ1bmN0aW9ucyBhcmUgcmVpbXBsZW1lbnRlZCBhcyB3cmFwcGVycyBmb3IKICAgICB0aGUgbmV3IG9uZXMuIFRoZSBPUEVOU1NMX05PX0RFUFJFQ0FURUQgc3ltYm9sIGNhbiBiZSB1c2VkIHRvIGhpZGUKICAgICBkZWNsYXJhdGlvbnMgb2YgdGhlIG9sZCBmdW5jdGlvbnMgdG8gaGVscCAoZ3JhY2VmdWwpIGF0dGVtcHRzIHRvCiAgICAgbWlncmF0ZSB0byB0aGUgbmV3IGZ1bmN0aW9ucy4gQWxzbywgdGhlIG5ldyBrZXktZ2VuZXJhdGlvbiBBUEkKICAgICBmdW5jdGlvbnMgb3BlcmF0ZSBvbiBhIGNhbGxlci1zdXBwbGllZCBrZXktc3RydWN0dXJlIGFuZCByZXR1cm4KICAgICBzdWNjZXNzL2ZhaWx1cmUgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGEga2V5IG9yIE5VTEwgLSB0aGlzIGlzIHRvCiAgICAgaGVscCBtYWtlICJrZXlnZW4iIGFub3RoZXIgbWVtYmVyIGZ1bmN0aW9uIG9mIFJTQV9NRVRIT0QgZXRjLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIENoYW5nZSB0aGUgWkxJQiBjb21wcmVzc2lvbiBtZXRob2QgdG8gYmUgc3RhdGVmdWwsIGFuZCBtYWtlIGl0CiAgICAgYXZhaWxhYmxlIHRvIFRMUyB3aXRoIHRoZSBudW1iZXIgZGVmaW5lZCBpbiAKICAgICBkcmFmdC1pZXRmLXRscy1jb21wcmVzc2lvbi0wNC50eHQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBBU04uMSBzdHJ1Y3R1cmVzIGFuZCBmdW5jdGlvbnMgZm9yIENlcnRpZmljYXRlUGFpciwgd2hpY2gKICAgICBpcyBkZWZpbmVkIGFzIGZvbGxvd3MgKGFjY29yZGluZyB0byBYLjUwOV80dGhFZGl0aW9uRHJhZnRWNi5wZGYpOgoKICAgICBDZXJ0aWZpY2F0ZVBhaXIgOjo9IFNFUVVFTkNFIHsKCWZvcndhcmQJCVswXQlDZXJ0aWZpY2F0ZSBPUFRJT05BTCwKCXJldmVyc2UJCVsxXQlDZXJ0aWZpY2F0ZSBPUFRJT05BTCwKCS0tIGF0IGxlYXN0IG9uZSBvZiB0aGUgcGFpciBzaGFsbCBiZSBwcmVzZW50IC0tIH0KCiAgICAgQWxzbyBpbXBsZW1lbnQgdGhlIFBFTSBmdW5jdGlvbnMgdG8gcmVhZCBhbmQgd3JpdGUgY2VydGlmaWNhdGUKICAgICBwYWlycywgYW5kIGRlZmluZWQgdGhlIFBFTSB0YWcgYXMgIkNFUlRJRklDQVRFIFBBSVIiLgoKICAgICBUaGlzIG5lZWRlZCB0byBiZSBkZWZpbmVkLCBtb3N0bHkgZm9yIHRoZSBzYWtlIG9mIHRoZSBMREFQCiAgICAgYXR0cmlidXRlIGNyb3NzQ2VydGlmaWNhdGVQYWlyLCBidXQgbWF5IHByb3ZlIHVzZWZ1bCBlbHNld2hlcmUgYXMKICAgICB3ZWxsLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gaW5oaWJpdCBzeW1saW5raW5nIG9mIHNoYXJlZCBsaWJyYXJpZXMgaW4KICAgICBNYWtlZmlsZS5zaGFyZWQsIGZvciBDeWd3aW4ncyBzYWtlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEV4dGVuZCB0aGUgQklHTlVNIEFQSSBieSBjcmVhdGluZyBuZXcgbWFjcm9zIHRoYXQgYmVoYXZlIGxpa2UKICAgICBmdW5jdGlvbnMKCiAgICAgICAgICB2b2lkIEJOX3NldF9zaWduKEJJR05VTSAqYSwgaW50IG5lZyk7CiAgICAgICAgICBpbnQgQk5fZ2V0X3NpZ24oY29uc3QgQklHTlVNICphKTsKCiAgICAgYW5kIGF2b2lkIHRoZSBuZWVkIHRvIGFjY2VzcyAnYS0+bmVnJyBkaXJlY3RseSBpbiBhcHBsaWNhdGlvbnMuCiAgICAgW05pbHMgTGFyc2NoICA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgSW1wbGVtZW50IGZhc3QgbW9kdWxhciByZWR1Y3Rpb24gZm9yIHBzZXVkby1NZXJzZW5uZSBwcmltZXMKICAgICB1c2VkIGluIE5JU1QgY3VydmVzIChjcnlwdG8vYm4vYm5fbmlzdC5jLCBjcnlwdG8vZWMvZWNwX25pc3QuYykuCiAgICAgRUNfR1JPVVBfbmV3X2N1cnZlX0dGcCgpIHdpbGwgbm93IGF1dG9tYXRpY2FsbHkgdXNlIHRoaXMKICAgICBpZiBhcHBsaWNhYmxlLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkIG5ldyBsb2NrIHR5cGUgKENSWVBUT19MT0NLX0JOKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIEVOR0lORSBmcmFtZXdvcmsgdG8gYXV0b21hdGljYWxseSBsb2FkIGVuZ2luZXMKICAgICBkeW5hbWljYWxseSBmcm9tIHNwZWNpZmljIGRpcmVjdG9yaWVzIHVubGVzcyB0aGV5IGNvdWxkIGJlCiAgICAgZm91bmQgdG8gYWxyZWFkeSBiZSBidWlsdCBpbiBvciBsb2FkZWQuICBNb3ZlIGFsbCB0aGUKICAgICBjdXJyZW50IGVuZ2luZXMgZXhjZXB0IGZvciB0aGUgY3J5cHRvZGV2IG9uZSB0byBhIG5ldwogICAgIGRpcmVjdG9yeSBlbmdpbmVzLy4KICAgICBUaGUgZW5naW5lcyBpbiBlbmdpbmVzLyBhcmUgYnVpbHQgYXMgc2hhcmVkIGxpYnJhcmllcyBpZgogICAgIHRoZSAic2hhcmVkIiBvcHRpb25zIHdhcyBnaXZlbiB0byAuL0NvbmZpZ3VyZSBvciAuL2NvbmZpZy4KICAgICBPdGhlcndpc2UsIHRoZXkgYXJlIGluc2VydGVkIGluIGxpYmNyeXB0by5hLgogICAgIC91c3IvbG9jYWwvc3NsL2VuZ2luZXMgaXMgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IGZvciBkeW5hbWljCiAgICAgZW5naW5lcywgYnV0IHRoYXQgY2FuIGJlIG92ZXJyaWRlbiBhdCBjb25maWd1cmUgdGltZSB0aHJvdWdoCiAgICAgdGhlIHVzdWFsIHVzZSBvZiAtLXByZWZpeCBhbmQvb3IgLS1vcGVuc3NsZGlyLCBhbmQgYXQgcnVuCiAgICAgdGltZSB3aXRoIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBPUEVOU1NMX0VOR0lORVMuCiAgICAgW0dlb2ZmIFRob3JwZSBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgTWFrZWZpbGUuc2hhcmVkLCBhIGhlbHBlciBtYWtlZmlsZSB0byBidWlsZCBzaGFyZWQKICAgICBsaWJyYXJpZXMuICBBZGRhcHQgTWFrZWZpbGUub3JnLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB2ZXJzaW9uIGluZm8gdG8gV2luMzIgRExMcy4KICAgICBbUGV0ZXIgJ0x1bmEnIFJ1bmVzdGlnIiA8cGV0ZXJAcnVuZXN0aWcuY29tPl0KCiAgKikgQWRkIG5ldyAnbWVkaXVtIGxldmVsJyBQS0NTIzEyIEFQSS4gQ2VydGlmaWNhdGVzIGFuZCBrZXlzCiAgICAgY2FuIGJlIGFkZGVkIHVzaW5nIHRoaXMgQVBJIHRvIGNyZWF0ZWQgYXJiaXRyYXJ5IFBLQ1MjMTIKICAgICBmaWxlcyB3aGlsZSBhdm9pZGluZyB0aGUgbG93IGxldmVsIEFQSS4KCiAgICAgTmV3IG9wdGlvbnMgdG8gUEtDUzEyX2NyZWF0ZSgpLCBrZXkgb3IgY2VydCBjYW4gYmUgTlVMTCBhbmQKICAgICB3aWxsIHRoZW4gYmUgb21pdHRlZCBmcm9tIHRoZSBvdXRwdXQgZmlsZS4gVGhlIGVuY3J5cHRpb24KICAgICBhbGdvcml0aG0gTklEcyBjYW4gYmUgc2V0IHRvIC0xIGZvciBubyBlbmNyeXB0aW9uLCB0aGUgbWFjCiAgICAgaXRlcmF0aW9uIGNvdW50IGNhbiBiZSBzZXQgdG8gMCB0byBvbWl0IHRoZSBtYWMuCgogICAgIEVuaGFuY2UgcGtjczEyIHV0aWxpdHkgYnkgbWFraW5nIHRoZSAtbm9rZXlzIGFuZCAtbm9jZXJ0cwogICAgIG9wdGlvbnMgd29yayB3aGVuIGNyZWF0aW5nIGEgUEtDUyMxMiBmaWxlLiBOZXcgb3B0aW9uIC1ub21hYwogICAgIHRvIG9taXQgdGhlIG1hYywgTk9ORSBjYW4gYmUgc2V0IGZvciBhbiBlbmNyeXB0aW9uIGFsZ29yaXRobS4KICAgICBOZXcgY29kZSBpcyBtb2RpZmllZCB0byB1c2UgdGhlIGVuaGFuY2VkIFBLQ1MxMl9jcmVhdGUoKQogICAgIGluc3RlYWQgb2YgdGhlIGxvdyBsZXZlbCBBUEkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5kIEFTTjEgZW5jb2RlciB0byBzdXBwb3J0IGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnVjdGVkCiAgICAgZW5jb2RpbmcuIFRoaXMgY2FuIG91dHB1dCBzZXF1ZW5jZXMgdGFncyBhbmQgb2N0ZXQgc3RyaW5ncyBpbgogICAgIHRoaXMgZm9ybS4gTW9kaWZ5IHBrN19hc24xLmMgdG8gc3VwcG9ydCBpbmRlZmluaXRlIGxlbmd0aAogICAgIGVuY29kaW5nLiBUaGlzIGlzIGV4cGVyaW1lbnRhbCBhbmQgbmVlZHMgYWRkaXRpb25hbCBjb2RlIHRvCiAgICAgYmUgdXNlZnVsLCBzdWNoIGFzIGFuIEFTTjEgYmlvIGFuZCBzb21lIGVuaGFuY2VkIHN0cmVhbWluZwogICAgIFBLQ1MjNyBjb2RlLgoKICAgICBFeHRlbmQgdGVtcGxhdGUgZW5jb2RlIGZ1bmN0aW9uYWxpdHkgc28gdGhhdCB0YWdnaW5nIGlzIHBhc3NlZAogICAgIGRvd24gdG8gdGhlIHRlbXBsYXRlIGVuY29kZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTGV0ICdvcGVuc3NsIHJlcScgZmFpbCBpZiBhbiBhcmd1bWVudCB0byAnLW5ld2tleScgaXMgbm90CiAgICAgcmVjb2duaXplZCBpbnN0ZWFkIG9mIHVzaW5nIFJTQSBhcyBhIGRlZmF1bHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEVDQy1iYXNlZCBjaXBoZXJzdWl0ZXMgZnJvbSBkcmFmdC1pZXRmLXRscy1lY2MtMDEudHh0LgogICAgIEFzIHRoZXNlIGFyZSBub3Qgb2ZmaWNpYWwsIHRoZXkgYXJlIG5vdCBpbmNsdWRlZCBpbiAiQUxMIjsKICAgICB0aGUgIkVDQ2RyYWZ0IiBjaXBoZXJzdWl0ZSBncm91cCBhbGlhcyBjYW4gYmUgdXNlZCB0byBzZWxlY3QgdGhlbS4KICAgICBbVmlwdWwgR3VwdGEgYW5kIFN1bWl0IEd1cHRhIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBFQ0RIIGVuZ2luZSBzdXBwb3J0LgogICAgIFtOaWxzIEd1cmEgYW5kIERvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgRUNESCBpbiBuZXcgZGlyZWN0b3J5IGNyeXB0by9lY2RoLy4KVE9ETzogbW9yZSBnZW5lcmFsIGludGVyZmFjZSAocmV0dXJuICB4ICBjb29yZGluYXRlLCBub3QgaXRzIGhhc2gpClRPRE86IGJ1ZzogcGFkICB4ICB3aXRoIGxlYWRpbmcgemVyb3MgaWYgbmVjZXNzYXJ5CiAgICAgW0RvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBMZXQgQk5fcmFuZF9yYW5nZSgpIGFib3J0IHdpdGggYW4gZXJyb3IgYWZ0ZXIgMTAwIGl0ZXJhdGlvbnMKICAgICB3aXRob3V0IHN1Y2Nlc3MgKHdoaWNoIGluZGljYXRlcyBhIGJyb2tlbiBQUk5HKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgQk5fbW9kX3NxcnQoKSBzbyB0aGF0IGl0IHZlcmlmaWVzIHRoYXQgdGhlIGlucHV0IHZhbHVlCiAgICAgaXMgcmVhbGx5IHRoZSBzcXVhcmUgb2YgdGhlIHJldHVybiB2YWx1ZS4gIChQcmV2aW91c2x5LAogICAgIEJOX21vZF9zcXJ0IHdvdWxkIHNob3cgR0lHTyBiZWhhdmlvdXIuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBuYW1lZCBlbGxpcHRpYyBjdXJ2ZXMgb3ZlciBiaW5hcnkgZmllbGRzIGZyb20gWDkuNjIsIFNFQ0csCiAgICAgYW5kIFdBUC9XVExTOyBhZGQgT0lEcyB0aGF0IHdlcmUgc3RpbGwgbWlzc2luZy4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEV4dGVuZCB0aGUgRUMgbGlicmFyeSBmb3IgZWxsaXB0aWMgY3VydmVzIG92ZXIgYmluYXJ5IGZpZWxkcwogICAgIChuZXcgZmlsZXMgZWMyX3NtcGwuYywgZWMyX3NtcHQuYywgZWMyX211bHQuYyBpbiBjcnlwdG8vZWMvKS4KICAgICBOZXcgRUNfTUVUSE9EOgoKICAgICAgICAgIEVDX0dGMm1fc2ltcGxlX21ldGhvZAoKICAgICBOZXcgQVBJIGZ1bmN0aW9uczoKCiAgICAgICAgICBFQ19HUk9VUF9uZXdfY3VydmVfR0YybQogICAgICAgICAgRUNfR1JPVVBfc2V0X2N1cnZlX0dGMm0KICAgICAgICAgIEVDX0dST1VQX2dldF9jdXJ2ZV9HRjJtCiAgICAgICAgICBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0KICAgICAgICAgIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybQogICAgICAgICAgRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0YybQoKICAgICBQb2ludCBjb21wcmVzc2lvbiBmb3IgYmluYXJ5IGZpZWxkcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGZvcgogICAgIHBhdGVudCByZWFzb25zIChjb21waWxlIHdpdGggT1BFTlNTTF9FQ19CSU5fUFRfQ09NUCBkZWZpbmVkIHRvCiAgICAgZW5hYmxlIGl0KS4KCiAgICAgQXMgYmluYXJ5IHBvbHlub21pYWxzIGFyZSByZXByZXNlbnRlZCBhcyBCSUdOVU1zLCB2YXJpb3VzIG1lbWJlcnMKICAgICBvZiB0aGUgRUNfR1JPVVAgYW5kIEVDX1BPSU5UIGRhdGEgc3RydWN0dXJlcyBjYW4gYmUgc2hhcmVkCiAgICAgYmV0d2VlbiB0aGUgaW1wbGVtZW50YXRpb25zIGZvciBwcmltZSBmaWVsZHMgYW5kIGJpbmFyeSBmaWVsZHM7CiAgICAgdGhlIGFib3ZlIC4uLl9HRjJtIGZ1bmN0aW9ucyAoZXhjZXB0IGZvciBFWF9HUk9VUF9uZXdfY3VydmVfR0YybSkKICAgICBhcmUgZXNzZW50aWFsbHkgaWRlbnRpY2FsIHRvIHRoZWlyIC4uLl9HRnAgY291bnRlcnBhcnRzLgogICAgIChGb3Igc2ltcGxpY2l0eSwgdGhlICcuLi5fR0ZwJyBwcmVmaXggaGFzIGJlZW4gZHJvcHBlZCBmcm9tCiAgICAgdmFyaW91cyBpbnRlcm5hbCBtZXRob2QgbmFtZXMuKQoKICAgICBBbiBpbnRlcm5hbCAnZmllbGRfZGl2JyBtZXRob2QgKHNpbWlsYXIgdG8gJ2ZpZWxkX211bCcgYW5kCiAgICAgJ2ZpZWxkX3NxcicpIGhhcyBiZWVuIGFkZGVkOyB0aGlzIGlzIHVzZWQgb25seSBmb3IgYmluYXJ5IGZpZWxkcy4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIE9wdGlvbmFsbHkgZGlzcGF0Y2ggRUNfUE9JTlRfbXVsKCksIEVDX1BPSU5UX3ByZWNvbXB1dGVfbXVsdCgpCiAgICAgdGhyb3VnaCBtZXRob2RzICgnbXVsJywgJ3ByZWNvbXB1dGVfbXVsdCcpLgoKICAgICBUaGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbnMgKG5vdyBpbnRlcm5hbGx5IGNhbGxlZCAnZWNfd05BRl9tdWwnCiAgICAgYW5kICdlY193TkFGX3ByZWNvbXB1dGVkX211bHQnKSByZW1haW4gdGhlIGRlZmF1bHQgaWYgdGhlc2UKICAgICBtZXRob2RzIGFyZSB1bmRlZmluZWQuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBOZXcgZnVuY3Rpb24gRUNfR1JPVVBfZ2V0X2RlZ3JlZSwgd2hpY2ggaXMgZGVmaW5lZCB0aHJvdWdoCiAgICAgRUNfTUVUSE9ELiAgRm9yIGN1cnZlcyBvdmVyIHByaW1lIGZpZWxkcywgdGhpcyByZXR1cm5zIHRoZSBiaXQKICAgICBsZW5ndGggb2YgdGhlIG1vZHVsdXMuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBOZXcgZnVuY3Rpb25zIEVDX0dST1VQX2R1cCwgRUNfUE9JTlRfZHVwLgogICAgIChUaGVzZSBzaW1wbHkgY2FsbCAuLi5fbmV3ICBhbmQgLi4uX2NvcHkpLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIGJpbmFyeSBwb2x5bm9taWFsIGFyaXRobWV0aWMgc29mdHdhcmUgaW4gY3J5cHRvL2JuL2JuX2dmMm0uYy4KICAgICBQb2x5bm9taWFscyBhcmUgcmVwcmVzZW50ZWQgYXMgQklHTlVNcyAod2hlcmUgdGhlIHNpZ24gYml0IGlzIG5vdAogICAgIHVzZWQpIGluIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIFttYWNyb3NdOiAgCgogICAgICAgICAgQk5fR0YybV9hZGQKICAgICAgICAgIEJOX0dGMm1fc3ViICAgICAgICAgICAgIFs9IEJOX0dGMm1fYWRkXQogICAgICAgICAgQk5fR0YybV9tb2QgICAgICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX2Fycl0KICAgICAgICAgIEJOX0dGMm1fbW9kX211bCAgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9tdWxfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2Rfc3FyICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX3Nxcl9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9pbnYKICAgICAgICAgIEJOX0dGMm1fbW9kX2V4cCAgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9leHBfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2Rfc3FydCAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX3NxcnRfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2Rfc29sdmVfcXVhZCAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX3NvbHZlX3F1YWRfYXJyXQogICAgICAgICAgQk5fR0YybV9jbXAgICAgICAgICAgICAgWz0gQk5fdWNtcF0KCiAgICAgKE5vdGUgdGhhdCBvbmx5IHRoZSAnbW9kJyBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGZvciBmaWVsZHMgR0YoMl5tKS4KICAgICBCTl9HRjJtX2FkZCgpIGlzIG1pc25vbWVyLCBidXQgdGhpcyBpcyBmb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3kuKQoKICAgICBGb3Igc29tZSBmdW5jdGlvbnMsIGFuIHRoZSBpcnJlZHVjaWJsZSBwb2x5bm9taWFsIGRlZmluaW5nIGEKICAgICBmaWVsZCBjYW4gYmUgZ2l2ZW4gYXMgYW4gJ3Vuc2lnbmVkIGludFtdJyB3aXRoIHN0cmljdGx5CiAgICAgZGVjcmVhc2luZyBlbGVtZW50cyBnaXZpbmcgdGhlIGluZGljZXMgb2YgdGhvc2UgYml0cyB0aGF0IGFyZSBzZXQ7CiAgICAgaS5lLiwgcFtdIHJlcHJlc2VudHMgdGhlIHBvbHlub21pYWwKICAgICAgICAgIGYodCkgPSB0XnBbMF0gKyB0XnBbMV0gKyAuLi4gKyB0XnBba10KICAgICB3aGVyZQogICAgICAgICAgcFswXSA+IHBbMV0gPiAuLi4gPiBwW2tdID0gMC4KICAgICBUaGlzIGFwcGxpZXMgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgogICAgICAgICAgQk5fR0YybV9tb2RfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9tdWxfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXJfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9pbnZfYXJyICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfaW52XQogICAgICAgICAgQk5fR0YybV9tb2RfZGl2X2FyciAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX2Rpdl0KICAgICAgICAgIEJOX0dGMm1fbW9kX2V4cF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX3NxcnRfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9zb2x2ZV9xdWFkX2FycgogICAgICAgICAgQk5fR0YybV9wb2x5MmFycgogICAgICAgICAgQk5fR0YybV9hcnIycG9seQoKICAgICBDb252ZXJzaW9uIGNhbiBiZSBwZXJmb3JtZWQgYnkgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgogICAgICAgICAgQk5fR0YybV9wb2x5MmFycgogICAgICAgICAgQk5fR0YybV9hcnIycG9seQoKICAgICBibnRlc3QuYyBoYXMgYWRkaXRpb25hbCB0ZXN0cyBmb3IgYmluYXJ5IHBvbHlub21pYWwgYXJpdGhtZXRpYy4KCiAgICAgVHdvIGltcGxlbWVudGF0aW9ucyBmb3IgQk5fR0YybV9tb2RfZGl2KCkgYXJlIGF2YWlsYWJsZS4KICAgICBUaGUgZGVmYXVsdCBhbGdvcml0aG0gc2ltcGx5IHVzZXMgQk5fR0YybV9tb2RfaW52KCkgYW5kCiAgICAgQk5fR0YybV9tb2RfbXVsKCkuICBUaGUgYWx0ZXJuYXRpdmUgYWxnb3JpdGhtIGlzIGNvbXBpbGVkIGluIG9ubHkKICAgICBpZiBPUEVOU1NMX1NVTl9HRjJNX0RJViBpcyBkZWZpbmVkIChwYXRlbnQgcGVuZGluZzsgcmVhZCB0aGUKICAgICBjb3B5cmlnaHQgbm90aWNlIGluIGNyeXB0by9ibi9ibl9nZjJtLmMgYmVmb3JlIGVuYWJsaW5nIGl0KS4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBuZXcgZXJyb3IgY29kZSAnRVJSX1JfRElTQUJMRUQnIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBzb21lCiAgICAgZnVuY3Rpb25hbGl0eSBpcyBkaXNhYmxlZCBhdCBjb21waWxlLXRpbWUuCiAgICAgW0RvdWdsYXMgU3RlYmlsYSA8ZG91Z2xhcy5zdGViaWxhQHN1bi5jb20+XQoKICAqKSBDaGFuZ2UgZGVmYXVsdCBiZWhhdmlvdXIgb2YgJ29wZW5zc2wgYXNuMXBhcnNlJyBzbyB0aGF0IG1vcmUKICAgICBpbmZvcm1hdGlvbiBpcyB2aXNpYmxlIHdoZW4gdmlld2luZywgZS5nLiwgYSBjZXJ0aWZpY2F0ZToKCiAgICAgTW9kaWZ5IGFzbjFfcGFyc2UyIChjcnlwdG8vYXNuMS9hc24xX3Bhci5jKSBzbyB0aGF0IGluIG5vbi0nZHVtcCcKICAgICBtb2RlIHRoZSBjb250ZW50IG9mIG5vbi1wcmludGFibGUgT0NURVQgU1RSSU5HcyBpcyBvdXRwdXQgaW4gYQogICAgIHN0eWxlIHNpbWlsYXIgdG8gSU5URUdFUnMsIGJ1dCB3aXRoICdbSEVYIERVTVBdJyBwcmVwZW5kZWQgdG8KICAgICBhdm9pZCB0aGUgYXBwZWFyYW5jZSBvZiBhIHByaW50YWJsZSBzdHJpbmcuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgJ2FzbjFfZmxhZycgYW5kICdhc24xX2Zvcm0nIG1lbWJlciB0byBFQ19HUk9VUCB3aXRoIGFjY2VzcwogICAgIGZ1bmN0aW9ucwogICAgICAgICAgRUNfR1JPVVBfc2V0X2FzbjFfZmxhZygpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfYXNuMV9mbGFnKCkKICAgICAgICAgIEVDX0dST1VQX3NldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0oKQogICAgICAgICAgRUNfR1JPVVBfZ2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybSgpCiAgICAgVGhlc2UgY29udHJvbCBBU04xIGVuY29kaW5nIGRldGFpbHM6CiAgICAgLSBDdXJ2ZXMgKGkuZS4sIGdyb3VwcykgYXJlIGVuY29kZWQgZXhwbGljaXRseSB1bmxlc3MgYXNuMV9mbGFnCiAgICAgICBoYXMgYmVlbiBzZXQgdG8gT1BFTlNTTF9FQ19OQU1FRF9DVVJWRS4KICAgICAtIFBvaW50cyBhcmUgZW5jb2RlZCBpbiB1bmNvbXByZXNzZWQgZm9ybSBieSBkZWZhdWx0OyBvcHRpb25zIGZvcgogICAgICAgYXNuMV9mb3IgYXJlIGFzIGZvciBwb2ludDJvY3QsIG5hbWVseQogICAgICAgICAgUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VECiAgICAgICAgICBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRAogICAgICAgICAgUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQKCiAgICAgQWxzbyBhZGQgJ3NlZWQnIGFuZCAnc2VlZF9sZW4nIG1lbWJlcnMgdG8gRUNfR1JPVVAgd2l0aCBhY2Nlc3MKICAgICBmdW5jdGlvbnMKICAgICAgICAgIEVDX0dST1VQX3NldF9zZWVkKCkKICAgICAgICAgIEVDX0dST1VQX2dldDBfc2VlZCgpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfc2VlZF9sZW4oKQogICAgIFRoaXMgaXMgdXNlZCBvbmx5IGZvciBBU04xIHB1cnBvc2VzIChzbyBmYXIpLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkICdmaWVsZF90eXBlJyBtZW1iZXIgdG8gRUNfTUVUSE9ELCB3aGljaCBob2xkcyB0aGUgTklECiAgICAgb2YgdGhlIGFwcHJvcHJpYXRlIGZpZWxkIHR5cGUgT0lELiAgVGhlIG5ldyBmdW5jdGlvbgogICAgIEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZSgpIHJldHVybnMgdGhpcyB2YWx1ZS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCBmdW5jdGlvbnMgCiAgICAgICAgICBFQ19QT0lOVF9wb2ludDJibigpCiAgICAgICAgICBFQ19QT0lOVF9ibjJwb2ludCgpCiAgICAgICAgICBFQ19QT0lOVF9wb2ludDJoZXgoKQogICAgICAgICAgRUNfUE9JTlRfaGV4MnBvaW50KCkKICAgICBwcm92aWRpbmcgdXNlZnVsIGludGVyZmFjZXMgdG8gRUNfUE9JTlRfcG9pbnQyb2N0KCkgYW5kCiAgICAgRUNfUE9JTlRfb2N0MnBvaW50KCkuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBDaGFuZ2UgaW50ZXJuYWxzIG9mIHRoZSBFQyBsaWJyYXJ5IHNvIHRoYXQgdGhlIGZ1bmN0aW9ucwogICAgICAgICAgRUNfR1JPVVBfc2V0X2dlbmVyYXRvcigpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfZ2VuZXJhdG9yKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9vcmRlcigpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfY29mYWN0b3IoKQogICAgIGFyZSBpbXBsZW1lbnRlZCBkaXJlY3RseSBpbiBjcnlwdG8vZWMvZWNfbGliLmMgYW5kIG5vdCBkaXNwYXRjaGVkCiAgICAgdG8gbWV0aG9kcywgd2hpY2ggd291bGQgbGVhZCB0byB1bm5lY2Vzc2FyeSBjb2RlIGR1cGxpY2F0aW9uIHdoZW4KICAgICBhZGRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGN1cnZlcy4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT4gd2l0aCBpbnB1dCBieSBCb2RvIE1vZWxsZXJdCgogICopIEltcGxlbWVudCBjb21wdXRlX3dOQUYgKGNyeXB0by9lYy9lY19tdWx0LmMpIHdpdGhvdXQgQklHTlVNCiAgICAgYXJpdGhtZXRpYywgYW5kIHN1Y2ggdGhhdCBtb2RpZmllZCB3TkFGcyBhcmUgZ2VuZXJhdGVkCiAgICAgKHdoaWNoIGF2b2lkIGxlbmd0aCBleHBhbnNpb24gaW4gbWFueSBjYXNlcykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGEgZnVuY3Rpb24gRUNfR1JPVVBfY2hlY2tfZGlzY3JpbWluYW50KCkgKGRlZmluZWQgdmlhCiAgICAgRUNfTUVUSE9EKSB0aGF0IHZlcmlmaWVzIHRoYXQgdGhlIGN1cnZlIGRpc2NyaW1pbmFudCBpcyBub24temVyby4KCiAgICAgQWRkIGEgZnVuY3Rpb24gRUNfR1JPVVBfY2hlY2soKSB0aGF0IG1ha2VzIHNvbWUgc2FuaXR5IHRlc3RzCiAgICAgb24gYSBFQ19HUk9VUCwgaXRzIGdlbmVyYXRvciBhbmQgb3JkZXIuICBUaGlzIGluY2x1ZGVzCiAgICAgRUNfR1JPVVBfY2hlY2tfZGlzY3JpbWluYW50KCkuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgRUNEU0EgaW4gbmV3IGRpcmVjdG9yeSBjcnlwdG8vZWNkc2EvLgoKICAgICBBZGQgYXBwbGljYXRpb25zICdvcGVuc3NsIGVjcGFyYW0nIGFuZCAnb3BlbnNzbCBlY2RzYScKICAgICAodGhlc2UgYXJlIGJhc2VkIG9uICdvcGVuc3NsIGRzYXBhcmFtJyBhbmQgJ29wZW5zc2wgZHNhJykuCgogICAgIEVDRFNBIHN1cHBvcnQgaXMgYWxzbyBpbmNsdWRlZCBpbiB2YXJpb3VzIG90aGVyIGZpbGVzIGFjcm9zcyB0aGUKICAgICBsaWJyYXJ5LiAgTW9zdCBub3RhYmx5LAogICAgIC0gJ29wZW5zc2wgcmVxJyBub3cgaGFzIGEgJy1uZXdrZXkgZWNkc2E6ZmlsZScgb3B0aW9uOwogICAgIC0gRVZQX1BLQ1M4MlBLRVkgKGNyeXB0by9ldnAvZXZwX3BrZXkuYykgbm93IGNhbiBoYW5kbGUgRUNEU0E7CiAgICAgLSBYNTA5X1BVQktFWV9nZXQgKGNyeXB0by9hc24xL3hfcHVia2V5LmMpIGFuZAogICAgICAgZDJpX1B1YmxpY0tleSAoY3J5cHRvL2FzbjEvZDJpX3B1LmMpIGhhdmUgYmVlbiBtb2RpZmllZCB0byBtYWtlCiAgICAgICB0aGVtIHN1aXRhYmxlIGZvciBFQ0RTQSB3aGVyZSBkb21haW4gcGFyYW1ldGVycyBtdXN0IGJlCiAgICAgICBleHRyYWN0ZWQgYmVmb3JlIHRoZSBzcGVjaWZpYyBwdWJsaWMga2V5OwogICAgIC0gRUNEU0EgZW5naW5lIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBJbmNsdWRlIHNvbWUgbmFtZWQgZWxsaXB0aWMgY3VydmVzLCBhbmQgYWRkIE9JRHMgZnJvbSBYOS42MiwKICAgICBTRUNHLCBhbmQgV0FQL1dUTFMuICBFYWNoIGN1cnZlIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBuZXcKICAgICBmdW5jdGlvbgogICAgICAgICAgRUNfR1JPVVBfbmV3X2J5X25pZCgpLAogICAgIGFuZCB0aGUgbGlzdCBvZiBhdmFpbGFibGUgbmFtZWQgY3VydmVzIGNhbiBiZSBvYnRhaW5lZCB3aXRoCiAgICAgICAgICBFQ19nZXRfYnVpbHRpbl9jdXJ2ZXMoKS4KICAgICBBbHNvIGFkZCBhICdjdXJ2ZV9uYW1lJyBtZW1iZXIgdG8gRUNfR1JPVVAgb2JqZWN0cywgd2hpY2ggY2FuIGJlCiAgICAgYWNjZXNzZWQgdmlhCiAgICAgICAgIEVDX0dST1VQX3NldF9uaWQoKQogICAgICAgICBFQ19HUk9VUF9nZXRfbmlkKCkKICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZSwgQm9kbyBNb2VsbGVyXQogCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZoIGFuZCAwLjkuNyAgW1hYIHh4eCAyMDAyXQoKICAqKSBUaGUgaHdfbmNpcGhlci5jIGVuZ2luZSByZXF1aXJlcyBkeW5hbWljIGxvY2tzLiAgVW5mb3J0dW5hdGVseSwgaXQKICAgICBzZWVtcyB0aGF0IGluIHNwaXRlIG9mIGV4aXN0aW5nIGZvciBtb3JlIHRoYW4gYSB5ZWFyLCBtYW55IGFwcGxpY2F0aW9uCiAgICAgYXV0aG9yIGhhdmUgZG9uZSBub3RoaW5nIHRvIHByb3ZpZGUgdGhlIG5lY2Vzc2FyeSBjYWxsYmFja3MsIHdoaWNoCiAgICAgbWVhbnMgdGhhdCB0aGlzIHBhcnRpY3VsYXIgZW5naW5lIHdpbGwgbm90IHdvcmsgcHJvcGVybHkgYW55d2hlcmUuCiAgICAgVGhpcyBpcyBhIHZlcnkgdW5mb3J0dW5hdGUgc2l0dWF0aW9uIHdoaWNoIGZvcmNlcyB1cywgaW4gdGhlIG5hbWUKICAgICBvZiB1c2FiaWxpdHksIHRvIGdpdmUgdGhlIGh3X25jaXBoZXIuYyBhIHN0YXRpYyBsb2NrLCB3aGljaCBpcyBwYXJ0CiAgICAgb2YgbGliY3J5cHRvLgogICAgIE5PVEU6IFRoaXMgaXMgZm9yIHRoZSAwLjkuNyBzZXJpZXMgT05MWS4gIFRoaXMgaGFjayB3aWxsIG5ldmVyCiAgICAgYXBwZWFyIGluIDAuOS44IG9yIGxhdGVyLiAgV2UgRVhQRUNUIGFwcGxpY2F0aW9uIGF1dGhvcnMgdG8gaGF2ZQogICAgIGRlYWx0IHByb3Blcmx5IHdpdGggdGhpcyB3aGVuIDAuOS44IGlzIHJlbGVhc2VkICh1bmxlc3Mgd2UgYWN0dWFsbHkKICAgICBtYWtlIHN1Y2ggY2hhbmdlcyBpbiB0aGUgbGliY3J5cHRvIGxvY2tpbmcgY29kZSB0aGF0IGNoYW5nZXMgd2lsbAogICAgIGhhdmUgdG8gYmUgbWFkZSBhbnl3YXkpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIGFzbjFfZDJpX3JlYWRfYmlvKCkgcmVwZWF0ZWRseSBjYWxsIEJJT19yZWFkKCkgdW50aWwgYWxsIGNvbnRlbnQKICAgICBvY3RldHMgaGF2ZSBiZWVuIHJlYWQsIEVPRiBvciBhbiBlcnJvciBvY2N1cnMuIFdpdGhvdXQgdGhpcyBjaGFuZ2UKICAgICBzb21lIHRydW5jYXRlZCBBU04xIHN0cnVjdHVyZXMgd2lsbCBub3QgcHJvZHVjZSBhbiBlcnJvci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEaXNhYmxlIEhlaW1kYWwgc3VwcG9ydCwgc2luY2UgaXQgaGFzbid0IGJlZW4gZnVsbHkgaW1wbGVtZW50ZWQuCiAgICAgU3RpbGwgZ2l2ZSB0aGUgcG9zc2liaWxpdHkgdG8gZm9yY2UgdGhlIHVzZSBvZiBIZWltZGFsLCBidXQgd2l0aAogICAgIHdhcm5pbmdzIGFuZCBhIHJlcXVlc3QgdGhhdCBwYXRjaGVzIGdldCBzZW50IHRvIG9wZW5zc2wtZGV2LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgVkMtQ0UgdGFyZ2V0LCBpbnRyb2R1Y2UgdGhlIFdJTkNFIHN5c25hbWUsIGFuZCBhZGQKICAgICBJTlNUQUxMLldDRSBhbmQgYXBwcm9wcmlhdGUgY29uZGl0aW9uYWxzIHRvIG1ha2UgaXQgYnVpbGQuCiAgICAgW1N0ZXZlbiBSZWRkaWUgPHNtckBlc3NlbWVyLmNvbS5hdT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIHRoZSBETEwgbmFtZXMgZm9yIEN5Z3dpbiB0byBjeWdjcnlwdG8teC55LnouZGxsIGFuZAogICAgIGN5Z3NzbC14Lnkuei5kbGwsIHdoZXJlIHgsIHkgYW5kIHogYXJlIHRoZSBtYWpvciwgbWlub3IgYW5kCiAgICAgZWRpdCBudW1iZXJzIG9mIHRoZSB2ZXJzaW9uLgogICAgIFtDb3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbnRyb2R1Y2Ugc2FmZSBzdHJpbmcgY29weSBhbmQgY2F0ZW5hdGlvbiBmdW5jdGlvbnMKICAgICAoQlVGX3N0cmxjcHkoKSBhbmQgQlVGX3N0cmxjYXQoKSkuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKSBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBdm9pZCB1c2luZyBmaXhlZC1zaXplIGJ1ZmZlcnMgZm9yIG9uZS1saW5lIEROcy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgQlVGX01FTV9ncm93X2NsZWFuKCkgdG8gYXZvaWQgaW5mb3JtYXRpb24gbGVha2FnZSB3aGVuCiAgICAgcmVzaXppbmcgYnVmZmVycyBjb250YWluaW5nIHNlY3JldHMsIGFuZCB1c2Ugd2hlcmUgYXBwcm9wcmlhdGUuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQXZvaWQgdXNpbmcgZml4ZWQgc2l6ZSBidWZmZXJzIGZvciBjb25maWd1cmF0aW9uIGZpbGUgbG9jYXRpb24uCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQXZvaWQgZmlsZW5hbWUgdHJ1bmNhdGlvbiBmb3IgdmFyaW91cyBDQSBmaWxlcy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBVc2Ugc2l6ZW9mIGluIHByZWZlcmVuY2UgdG8gbWFnaWMgbnVtYmVycy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBdm9pZCBmaWxlbmFtZSB0cnVuY2F0aW9uIGluIGNlcnQgcmVxdWVzdHMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIGFzc2VydGlvbnMgdG8gY2hlY2sgZm9yIChzdXBwb3NlZGx5IGltcG9zc2libGUpIGJ1ZmZlcgogICAgIG92ZXJmbG93cy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBEb24ndCBjYWNoZSB0cnVuY2F0ZWQgRE5TIGVudHJpZXMgaW4gdGhlIGxvY2FsIGNhY2hlICh0aGlzIGNvdWxkCiAgICAgcG90ZW50aWFsbHkgbGVhZCB0byBhIHNwb29maW5nIGF0dGFjaykuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRml4IHZhcmlvdXMgYnVmZmVycyB0byBiZSBsYXJnZSBlbm91Z2ggZm9yIGhleC9kZWNpbWFsCiAgICAgcmVwcmVzZW50YXRpb25zIGluIGEgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWFubmVyLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBDUllQVE9fcmVhbGxvY19jbGVhbigpIHRvIGF2b2lkIGluZm9ybWF0aW9uIGxlYWthZ2Ugd2hlbgogICAgIHJlc2l6aW5nIGJ1ZmZlcnMgY29udGFpbmluZyBzZWNyZXRzLCBhbmQgdXNlIHdoZXJlIGFwcHJvcHJpYXRlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBCSU9faW5kZW50KCkgdG8gYXZvaWQgbXVjaCBzbGlnaHRseSB3b3JyeWluZyBjb2RlIHRvIGRvCiAgICAgaW5kZW50cy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBDb252ZXJ0IHNwcmludGYoKS9CSU9fcHV0cygpIHRvIEJJT19wcmludGYoKS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBidWZmZXJfZ2V0cygpIGNvdWxkIHRlcm1pbmF0ZSB3aXRoIHRoZSBidWZmZXIgb25seSBoYWxmCiAgICAgZnVsbC4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIGFzc2VydGlvbnMgdG8gcHJldmVudCB1c2VyLXN1cHBsaWVkIGNyeXB0byBmdW5jdGlvbnMgZnJvbQogICAgIG92ZXJmbG93aW5nIGludGVybmFsIGJ1ZmZlcnMgYnkgaGF2aW5nIGxhcmdlIGJsb2NrIHNpemVzLCBldGMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgTmV3IE9QRU5TU0xfYXNzZXJ0KCkgbWFjcm8gKHNpbWlsYXIgdG8gYXNzZXJ0KCksIGJ1dCBlbmFibGVkCiAgICAgdW5jb25kaXRpb25hbGx5KS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGNvcHkgb2Yga2V5IGluIFJDNC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBpbmNvcnJlY3RseSBzaXplZCBidWZmZXJzIGZvciBJViBpbiBwZW0uaC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBGaXggb2ZmLWJ5LW9uZSBlcnJvciBpbiBFR0QgcGF0aC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBJZiBSQU5ERklMRSBwYXRoIGlzIHRvbyBsb25nLCBpZ25vcmUgaW5zdGVhZCBvZiB0cnVuY2F0aW5nLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGluY29ycmVjdGx5IHNpemVkIFguNTA5IHN0cnVjdHVyZQogICAgIENCQ1BhcmFtZXRlci4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBkYW5nZXJvdXMgZnVuY3Rpb24ga251bWJlcigpLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGRhbmdlcm91cyBzdHJ1Y3R1cmUsIEtTU0xfRVJSLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIFByb3RlY3QgYWdhaW5zdCBvdmVybG9uZyBzZXNzaW9uIElEIGNvbnRleHQgbGVuZ3RoIGluIGFuIGVuY29kZWQKICAgICBzZXNzaW9uIG9iamVjdC4gU2luY2UgdGhlc2UgYXJlIGxvY2FsLCB0aGlzIGRvZXMgbm90IGFwcGVhciB0byBiZQogICAgIGV4cGxvaXRhYmxlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIENoYW5nZSBmcm9tIHNlY3VyaXR5IHBhdGNoIChzZWUgMC45LjZlIGJlbG93KSB0aGF0IGRpZCBub3QgYWZmZWN0CiAgICAgdGhlIDAuOS42IHJlbGVhc2Ugc2VyaWVzOgoKICAgICBSZW1vdGUgYnVmZmVyIG92ZXJmbG93IGluIFNTTDMgcHJvdG9jb2wgLSBhbiBhdHRhY2tlciBjb3VsZAogICAgIHN1cHBseSBhbiBvdmVyc2l6ZWQgbWFzdGVyIGtleSBpbiBLZXJiZXJvcy1lbmFibGVkIHZlcnNpb25zLgogICAgIChDQU4tMjAwMi0wNjU3KQogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIENoYW5nZSB0aGUgU1NMIGtlcmI1IGNvZGVzIHRvIG1hdGNoIFJGQyAyNzEyLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgLW5hbWVvcHQgd29yayBmdWxseSBmb3IgcmVxIGFuZCBhZGQgLXJlcW9wdCBzd2l0Y2guCiAgICAgW01pY2hhZWwgQmVsbCA8bWljaGFlbC5iZWxsQHJ6Lmh1LWJlcmxpbi5kZT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgVGhlICJibG9jayBzaXplIiBmb3IgYmxvY2sgY2lwaGVycyBpbiBDRkIgYW5kIE9GQiBtb2RlIHNob3VsZCBiZSAxLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IFluZ3ZlIE55c2FldGVyIFBldHRlcnNlbiA8eW5ndmVAb3BlcmEuY29tPl0KCiAgKikgTWFrZSBzdXJlIHRlc3RzIGNhbiBiZSBwZXJmb3JtZWQgZXZlbiBpZiB0aGUgY29ycmVzcG9uZGluZyBhbGdvcml0aG1zCiAgICAgaGF2ZSBiZWVuIHJlbW92ZWQgZW50aXJlbHkuICBUaGlzIHdhcyBhbHNvIHRoZSBsYXN0IHN0ZXAgdG8gbWFrZQogICAgIE9wZW5TU0wgY29tcGlsYWJsZSB3aXRoIERKR1BQIHVuZGVyIGFsbCByZWFzb25hYmxlIGNvbmRpdGlvbnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSwgRG91ZyBLYXVmbWFuIDxka2F1Zm1hbkByYWh1bC5uZXQ+XQoKICAqKSBBZGQgY2lwaGVyIHNlbGVjdGlvbiBydWxlcyBDT01QTEVNRU5UT0ZBTEwgYW5kIENPTVBMRU1FTlRPRkRFRkFVTFQKICAgICB0byBhbGxvdyB2ZXJzaW9uIGluZGVwZW5kZW50IGRpc2FibGluZyBvZiBub3JtYWxseSB1bnNlbGVjdGVkIGNpcGhlcnMsCiAgICAgd2hpY2ggbWF5IGJlIGFjdGl2YXRlZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHNlbGVjdGluZyBhIHNpbmdsZSBjaXBoZXIuCgogICAgIChFLmcuLCBjaXBoZXIgbGlzdCBzdHJpbmcgIlJTQSIgZW5hYmxlcyBjaXBoZXJzdWl0ZXMgdGhhdCBhcmUgbGVmdAogICAgIG91dCBvZiAiQUxMIiBiZWNhdXNlIHRoZXkgZG8gbm90IHByb3ZpZGUgc3ltbWV0cmljIGVuY3J5cHRpb24uCiAgICAgIlJTQTohQ09NUExFTUVNRU5UT0ZBTEwiIGF2b2lkcyB0aGVzZSB1bnNhZmUgY2lwaGVyc3VpdGVzLikKICAgICBbTHV0eiBKYWVuaWNrZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYXBwcm9wcmlhdGUgc3VwcG9ydCBmb3Igc2VwYXJhdGUgcGxhdGZvcm0tZGVwZW5kZW50IGJ1aWxkCiAgICAgZGlyZWN0b3JpZXMuICBUaGUgcmVjb21tZW5kZWQgd2F5IHRvIG1ha2UgYSBwbGF0Zm9ybS1kZXBlbmRlbnQKICAgICBidWlsZCBkaXJlY3RvcnkgaXMgdGhlIGZvbGxvd2luZyAodGVzdGVkIG9uIExpbnV4KSwgbWF5YmUgd2l0aAogICAgIHNvbWUgbG9jYWwgdHdlYWtzOgoKCSMgUGxhY2UgeW91cnNlbGYgb3V0c2lkZSBvZiB0aGUgT3BlblNTTCBzb3VyY2UgdHJlZS4gIEluCgkjIHRoaXMgZXhhbXBsZSwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIE9QRU5TU0xfU09VUkNFCgkjIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgYWJzb2x1dGUgT3BlblNTTCBzb3VyY2UgZGlyZWN0b3J5LgoJbWtkaXIgLXAgb2JqdHJlZS8iYHVuYW1lIC1zYC1gdW5hbWUgLXJgLWB1bmFtZSAtbWAiCgljZCBvYmp0cmVlLyJgdW5hbWUgLXNgLWB1bmFtZSAtcmAtYHVuYW1lIC1tYCIKCShjZCAkT1BFTlNTTF9TT1VSQ0U7IGZpbmQgLiAtdHlwZSBmIC1vIC10eXBlIGwpIHwgd2hpbGUgcmVhZCBGOyBkbwoJCW1rZGlyIC1wIGBkaXJuYW1lICRGYAoJCWxuIC1zICRPUEVOU1NMX1NPVVJDRS8kRiAkRgoJZG9uZQoKICAgICBUbyBiZSBhYnNvbHV0ZWx5IHN1cmUgbm90IHRvIGRpc3R1cmIgdGhlIHNvdXJjZSB0cmVlLCBhICJtYWtlIGNsZWFuIgogICAgIGlzIGEgZ29vZCB0aGluZy4gIElmIGl0IGlzbid0IHN1Y2Nlc3NmdWxsLCBkb24ndCB3b3JyeSBhYm91dCBpdCwKICAgICBpdCBwcm9iYWJseSBtZWFucyB0aGUgc291cmNlIGRpcmVjdG9yeSBpcyB2ZXJ5IGNsZWFuLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2Ugc3VyZSBhbnkgRU5HSU5FIGNvbnRyb2wgY29tbWFuZHMgbWFrZSBsb2NhbCBjb3BpZXMgb2Ygc3RyaW5nCiAgICAgcG9pbnRlcnMgcGFzc2VkIHRvIHRoZW0gd2hlbmV2ZXIgbmVjZXNzYXJ5LiBPdGhlcndpc2UgaXQgaXMgcG9zc2libGUKICAgICB0aGUgY2FsbGVyIG1heSBoYXZlIG92ZXJ3cml0dGVuIChvciBkZWFsbG9jYXRlZCkgdGhlIG9yaWdpbmFsIHN0cmluZwogICAgIGRhdGEgd2hlbiBhIGxhdGVyIEVOR0lORSBvcGVyYXRpb24gdHJpZXMgdG8gdXNlIHRoZSBzdG9yZWQgdmFsdWVzLgogICAgIFtH9nR6IEJhYmluLUViZWxsIDxiYWJpbmViZWxsQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgSW1wcm92ZSBkaWFnbm9zdGljcyBpbiBmaWxlIHJlYWRpbmcgYW5kIGNvbW1hbmQtbGluZSBkaWdlc3RzLgogICAgIFtCZW4gTGF1cmllIGFpZGVkIGFuZCBhYmV0dGVkIGJ5IFNvbGFyIERlc2lnbmVyIDxzb2xhckBvcGVud2FsbC5jb20+XQoKICAqKSBBZGQgQUVTIG1vZGVzIENGQiBhbmQgT0ZCIHRvIHRoZSBvYmplY3QgZGF0YWJhc2UuICBDb3JyZWN0IGFuCiAgICAgZXJyb3IgaW4gQUVTLUNGQiBkZWNyeXB0aW9uLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJlbW92ZSBtb3N0IGNhbGxzIHRvIEVWUF9DSVBIRVJfQ1RYX2NsZWFudXAoKSBpbiBldnBfZW5jLmMsIHRoaXMgCiAgICAgYWxsb3dzIGV4aXN0aW5nIEVWUF9DSVBIRVJfQ1RYIHN0cnVjdHVyZXMgdG8gYmUgcmV1c2VkIGFmdGVyCiAgICAgY2FsbGluZyBFVlBfKkZpbmFsKCkuIFRoaXMgYmVoYXZpb3VyIGlzIHVzZWQgYnkgZW5jcnlwdGlvbgogICAgIEJJT3MgYW5kIHNvbWUgYXBwbGljYXRpb25zLiBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3QgdGhhdAogICAgIGFwcGxpY2F0aW9ucyBtdXN0IGV4cGxpY2l0bHkgY2xlYW4gdXAgY2lwaGVyIGNvbnRleHRzIHdpdGgKICAgICBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCkgb3IgdGhleSB3aWxsIGxlYWsgbWVtb3J5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoZWNrIHRoZSB2YWx1ZXMgb2YgZG5hIGFuZCBkbmIgaW4gYm5fbXVsX3JlY3Vyc2l2ZSBiZWZvcmUgY2FsbGluZwogICAgIGJuX211bF9jb21iYSAoYSBub24gemVybyB2YWx1ZSBtZWFucyB0aGUgYSBvciBiIGFycmF5cyBkbyBub3QgY29udGFpbgogICAgIG4yIGVsZW1lbnRzKSBhbmQgZmFsbGJhY2sgdG8gYm5fbXVsX25vcm1hbCBpZiBlaXRoZXIgaXMgbm90IHplcm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGVzY2FwaW5nIG9mIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIHdoZW4gdXNpbmcgdGhlIC1zdWJqIG9wdGlvbgogICAgIG9mIHRoZSAib3BlbnNzbCByZXEiIGNvbW1hbmQgbGluZSB0b29sLiAoUm9iZXJ0IEpvb3AgPGpvb3BAZm9rdXMuZ21kLmRlPikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgTWFrZSBvYmplY3QgZGVmaW5pdGlvbnMgY29tcGxpYW50IHRvIExEQVAgKFJGQzIyNTYpOiBTTiBpcyB0aGUgc2hvcnQKICAgICBmb3JtIGZvciAic3VybmFtZSIsIHNlcmlhbE51bWJlciBoYXMgbm8gc2hvcnQgZm9ybS4KICAgICBVc2UgIm1haWwiIGFzIHRoZSBzaG9ydCBuYW1lIGZvciAicmZjODIyTWFpbGJveCIgYWNjb3JkaW5nIHRvIFJGQzI3OTg7CiAgICAgdGhlcmVmb3JlIHJlbW92ZSAibWFpbCIgc2hvcnQgbmFtZSBmb3IgImludGVybmV0IDciLgogICAgIFRoZSBPSUQgZm9yIHVuaXF1ZSBpZGVudGlmaWVycyBpbiBYNTA5IGNlcnRpZmljYXRlcyBpcwogICAgIHg1MDBVbmlxdWVJZGVudGlmaWVyLCBub3QgdW5pcXVlSWRlbnRpZmllci4KICAgICBTb21lIG1vcmUgT0lEIGFkZGl0aW9ucy4gKE1pY2hhZWwgQmVsbCA8bWljaGFlbC5iZWxsQHJ6Lmh1LWJlcmxpbi5kZT4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBhbiAiaW5pdCIgY29tbWFuZCB0byB0aGUgRU5HSU5FIGNvbmZpZyBtb2R1bGUgYW5kIGF1dG8gaW5pdGlhbGl6ZQogICAgIEVOR0lORXMuIFdpdGhvdXQgYW55ICJpbml0IiBjb21tYW5kIHRoZSBFTkdJTkUgd2lsbCBiZSBpbml0aWFsaXplZCAKICAgICBhZnRlciBhbGwgY3RybCBjb21tYW5kcyBoYXZlIGJlZW4gZXhlY3V0ZWQgb24gaXQuIElmIGluaXQ9MSB0aGUgCiAgICAgRU5HSU5FIGlzIGluaXRhaWxpemVkIGF0IHRoYXQgcG9pbnQgKGN0cmxzIGJlZm9yZSB0aGF0IHBvaW50IGFyZSBydW4KICAgICBvbiB0aGUgdW5pbml0aWFsaXplZCBFTkdJTkUgYW5kIGFmdGVyIG9uIHRoZSBpbml0aWFsaXplZCBvbmUpLiBJZgogICAgIGluaXQ9MCB0aGVuIHRoZSBFTkdJTkUgd2lsbCBub3QgYmUgaW5pYXRpYWxpemVkIGF0IGFsbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlICdhcHBfdmVyaWZ5X2NhbGxiYWNrJyBpbnRlcmZhY2Ugc28gdGhhdCB0aGUgdXNlci1kZWZpbmVkCiAgICAgYXJndW1lbnQgaXMgYWN0dWFsbHkgcGFzc2VkIHRvIHRoZSBjYWxsYmFjazogSW4gdGhlCiAgICAgU1NMX0NUWF9zZXRfY2VydF92ZXJpZnlfY2FsbGJhY2soKSBwcm90b3R5cGUsIHRoZSBjYWxsYmFjawogICAgIGRlY2xhcmF0aW9uIGhhcyBiZWVuIGNoYW5nZWQgZnJvbQogICAgICAgICAgaW50ICgqY2IpKCkKICAgICBpbnRvCiAgICAgICAgICBpbnQgKCpjYikoWDUwOV9TVE9SRV9DVFggKix2b2lkICopOwogICAgIGluIHNzbF92ZXJpZnlfY2VydF9jaGFpbiAoc3NsL3NzbF9jZXJ0LmMpLCB0aGUgY2FsbAogICAgICAgICAgaT1zLT5jdHgtPmFwcF92ZXJpZnlfY2FsbGJhY2soJmN0eCkKICAgICBoYXMgYmVlbiBjaGFuZ2VkIGludG8KICAgICAgICAgIGk9cy0+Y3R4LT5hcHBfdmVyaWZ5X2NhbGxiYWNrKCZjdHgsIHMtPmN0eC0+YXBwX3ZlcmlmeV9hcmcpLgoKICAgICBUbyB1cGRhdGUgYXBwbGljYXRpb25zIHVzaW5nIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKCksCiAgICAgYSBkdW1teSBhcmd1bWVudCBjYW4gYmUgYWRkZWQgdG8gdGhlaXIgY2FsbGJhY2sgZnVuY3Rpb25zLgogICAgIFtELiBLLiBTbWV0dGVycyA8c21ldHRlcnNAcGFyYy54ZXJveC5jb20+XQoKICAqKSBBZGRlZCB0aGUgJzQ3NThjY2EnIEVOR0lORSB0byBzdXBwb3J0IElCTSA0NzU4IGNhcmRzLgogICAgIFtNYXVyaWNlIEdpdHRlbnMgPG1hdXJpY2VAZ2l0dGVucy5ubD4sIHRvdWNodXBzIGJ5IEdlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGFuZCBPUEVOU1NMX0xPQURfQ09ORiBkZWZpbmUgd2hpY2ggd2lsbCBjYXVzZQogICAgIE9wZW5TU0xfYWRkX2FsbF9hbGdvcml0aG1zKCkgdG8gbG9hZCB0aGUgb3BlbnNzbC5jbmYgY29uZmlnIGZpbGUuCiAgICAgVGhpcyBhbGxvd3Mgb2xkZXIgYXBwbGljYXRpb25zIHRvIHRyYW5zcGFyZW50bHkgc3VwcG9ydCBjZXJ0YWluCiAgICAgT3BlblNTTCBmZWF0dXJlczogc3VjaCBhcyBjcnlwdG8gYWNjZWxlcmF0aW9uIGFuZCBkeW5hbWljIEVOR0lORSBsb2FkaW5nLgogICAgIFR3byBuZXcgZnVuY3Rpb25zIE9QRU5TU0xfYWRkX2FsbF9hbGdvcml0aG1zX25vY29uZigpIHdoaWNoIHdpbGwgbmV2ZXIKICAgICBsb2FkIHRoZSBjb25maWcgZmlsZSBhbmQgT1BFTlNTTF9hZGRfYWxsX2FsZ29yaXRobXNfY29uZigpIHdoaWNoIHdpbGwKICAgICBhbHdheXMgbG9hZCBpdCBoYXZlIGFsc28gYmVlbiBhZGRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGhlIE9GQiwgQ0ZCIGFuZCBDVFIgKGFsbCB3aXRoIDEyOCBiaXQgZmVlZGJhY2spIHRvIEFFUy4KICAgICBBZGp1c3QgTklEcyBhbmQgRVZQIGxheWVyLgogICAgIFtTdGVwaGVuIFNwcnVuayA8c3RlcGhlbkBzcHJ1bmsub3JnPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDb25maWcgbW9kdWxlcyBzdXBwb3J0IGluIG9wZW5zc2wgdXRpbGl0eS4KCiAgICAgTW9zdCBjb21tYW5kcyBub3cgbG9hZCBtb2R1bGVzIGZyb20gdGhlIGNvbmZpZyBmaWxlLAogICAgIHRob3VnaCBpbiBhIGZldyAoc3VjaCBhcyB2ZXJzaW9uKSB0aGlzIGlzbid0IGRvbmUgCiAgICAgYmVjYXVzZSBpdCBjb3VsZG4ndCBiZSB1c2VkIGZvciBhbnl0aGluZy4KCiAgICAgSW4gdGhlIGNhc2Ugb2YgY2EgYW5kIHJlcSB0aGUgY29uZmlnIGZpbGUgdXNlZCBpcwogICAgIHRoZSBzYW1lIGFzIHRoZSB1dGlsaXR5IGl0c2VsZjogdGhhdCBpcyB0aGUgLWNvbmZpZwogICAgIGNvbW1hbmQgbGluZSBvcHRpb24gY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbgogICAgIGFsdGVybmF0aXZlIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSBkZWZhdWx0IGJlaGF2aW91ciBmcm9tIE9QRU5TU0xfY29uZmlnKCkuIElmIGFwcG5hbWUgaXMgTlVMTAogICAgIHVzZSAib3BlbnNzbF9jb25mIiBpZiBmaWxlbmFtZSBpcyBOVUxMIHVzZSBkZWZhdWx0IG9wZW5zc2wgY29uZmlnIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGFuIGFyZ3VtZW50IHRvIE9QRU5TU0xfY29uZmlnKCkgdG8gYWxsb3cgdGhlIHVzZSBvZiBhbiBhbHRlcm5hdGl2ZQogICAgIGNvbmZpZyBzZWN0aW9uIG5hbWUuIEFkZCBhIG5ldyBmbGFnIHRvIHRvbGVyYXRlIGEgbWlzc2luZyBjb25maWcgZmlsZQogICAgIGFuZCBtb3ZlIGNvZGUgdG8gQ09ORl9tb2R1bGVzX2xvYWRfZmlsZSgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcyBmcm9tIEFjY2VsZXJhdGVkIEVuY3J5cHRpb24KICAgICBQcm9jZXNzaW5nLCB3d3cuYWVwLmllLiAgKFVzZSBlbmdpbmUgJ2FlcCcpCiAgICAgVGhlIHN1cHBvcnQgd2FzIGNvcGllZCBmcm9tIDAuOS42YyBbZW5naW5lXSBhbmQgYWRhcHRlZC9jb3JyZWN0ZWQKICAgICB0byB3b3JrIHdpdGggdGhlIG5ldyBlbmdpbmUgZnJhbWV3b3JrLgogICAgIFtBRVAgSW5jLiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBTdXBwb3J0IGZvciBTdXJlV2FyZSBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSBCYWx0aW1vcmUKICAgICBUZWNobm9sb2dpZXMuICAoVXNlIGVuZ2luZSAnc3VyZXdhcmUnKQogICAgIFRoZSBzdXBwb3J0IHdhcyBjb3BpZWQgZnJvbSAwLjkuNmMgW2VuZ2luZV0gYW5kIGFkYXB0ZWQKICAgICB0byB3b3JrIHdpdGggdGhlIG5ldyBlbmdpbmUgZnJhbWV3b3JrLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEhhdmUgdGhlIENISUwgZW5naW5lIGZvcmstc2FmZSAoYXMgZGVmaW5lZCBieSBuQ2lwaGVyKSBhbmQgYWN0dWFsbHkKICAgICBtYWtlIHRoZSBuZXdlciBFTkdJTkUgZnJhbWV3b3JrIGNvbW1hbmRzIGZvciB0aGUgQ0hJTCBlbmdpbmUgd29yay4KICAgICBbVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gcHJvZHVjZSBzaGFyZWQgbGlicmFyaWVzIG9uIFJlbGlhbnRVTklYLgogICAgIFtSb2JlcnQgRGFobGVtIDxSb2JlcnQuRGFobGVtQGZmbTIuc2llbWVucy5kZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBjb25maWd1cmF0aW9uIHRhcmdldCBkZWJ1Zy1saW51eC1wcHJvLgogICAgIE1ha2UgJ29wZW5zc2wgcnNhJyB1c2UgdGhlIGdlbmVyYWwga2V5IGxvYWRpbmcgcm91dGluZXMKICAgICBpbXBsZW1lbnRlZCBpbiBhcHBzLmMsIGFuZCBtYWtlIHRob3NlIHJvdXRpbmVzIGFibGUgdG8KICAgICBoYW5kbGUgdGhlIGtleSBmb3JtYXQgRk9STUFUX05FVFNDQVBFIGFuZCB0aGUgdmFyaWFudAogICAgIEZPUk1BVF9JSVNTR0MuCiAgICAgW1Rvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICopIEZpeCBhIGNyYXNoYnVnIGFuZCBhIGxvZ2ljIGJ1ZyBpbiBod2NyaGtfbG9hZF9wdWJrZXkoKS4KICAgICBbVG9vbWFzIEtpaXNrIDx2aXhAY3liZXIuZWU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCAta2V5Zm9ybSB0byByc2F1dGwsIGFuZCBkb2N1bWVudCAtZW5naW5lLgogICAgIFtSaWNoYXJkIExldml0dGUsIGluc3BpcmVkIGJ5IFRvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPl0KCiAgKikgQ2hhbmdlIEJJT19uZXdfZmlsZSAoY3J5cHRvL2Jpby9ic3NfZmlsZS5jKSB0byB1c2UgbmV3CiAgICAgQklPX1JfTk9fU1VDSF9GSUxFIGVycm9yIGNvZGUgcmF0aGVyIHRoYW4gdGhlIGdlbmVyaWMKICAgICBFUlJfUl9TWVNfTElCIGVycm9yIGNvZGUgaWYgZm9wZW4oKSBmYWlscyB3aXRoIEVOT0VOVC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbnMKICAgICAgICAgIEVSUl9wZWVrX2xhc3RfZXJyb3IKICAgICAgICAgIEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZQogICAgICAgICAgRVJSX3BlZWtfbGFzdF9lcnJvcl9saW5lX2RhdGEuCiAgICAgVGhlc2UgYXJlIHNpbWlsYXIgdG8KICAgICAgICAgIEVSUl9wZWVrX2Vycm9yCiAgICAgICAgICBFUlJfcGVla19lcnJvcl9saW5lCiAgICAgICAgICBFUlJfcGVla19lcnJvcl9saW5lX2RhdGEsCiAgICAgYnV0IHJlcG9ydCBvbiB0aGUgbGF0ZXN0IGVycm9yIHJlY29yZGVkIHJhdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUKICAgICBzdGlsbCBpbiB0aGUgZXJyb3IgcXVldWUuCiAgICAgW0JlbiBMYXVyaWUsIEJvZG8gTW9lbGxlcl0KICAgICAgICAKICAqKSBkZWZhdWx0X2FsZ29yaXRobXMgb3B0aW9uIGluIEVOR0lORSBjb25maWcgbW9kdWxlLiBUaGlzIGFsbG93cyB0aGluZ3MKICAgICBsaWtlOgogICAgIGRlZmF1bHRfYWxnb3JpdGhtcyA9IEFMTAogICAgIGRlZmF1bHRfYWxnb3JpdGhtcyA9IFJTQSwgRFNBLCBSQU5ELCBDSVBIRVJTLCBESUdFU1RTCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJlbG1pbmFyeSBFTkdJTkUgY29uZmlnIG1vZHVsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZXhwZXJpbWVudGFsIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIEFFUyBjb2RlIHRvIGZvbGxvdyB0aGUgc2FtZSBuYW1lIHN0cnVjdHVyZSBhcyBhbGwgb3RoZXIKICAgICBzeW1tZXRyaWMgY2lwaGVycywgYW5kIGJlaGF2ZSB0aGUgc2FtZSB3YXkuICBNb3ZlIGV2ZXJ5dGhpbmcgdG8KICAgICB0aGUgZGlyZWN0b3J5IGNyeXB0by9hZXMsIHRoZXJlYnkgb2Jzb2xldGluZyBjcnlwdG8vcmlqbmRhZWwuCiAgICAgW1N0ZXBoZW4gU3BydW5rIDxzdGVwaGVuQHNwcnVuay5vcmc+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIFNFQ1VSSVRZOiByZW1vdmUgdW5zYWZlIHNldGptcC9zaWduYWwgaW50ZXJhY3Rpb24gZnJvbSB1aV9vcGVuc3NsLmMuCiAgICAgW0JlbiBMYXVyaWUgYW5kIFRoZW8gZGUgUmFhZHRdCgogICopIEFkZCBvcHRpb24gdG8gb3V0cHV0IHB1YmxpYyBrZXlzIGluIHJlcSBjb21tYW5kLgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSBtYWR3b2xmQG9wZW5jYS5vcmddCgogICopIFVzZSB3TkFGcyBpbiBFQ19QT0lOVHNfbXVsKCkgZm9yIGltcHJvdmVkIGVmZmljaWVuY3kKICAgICAodXAgdG8gYWJvdXQgMTAlIGJldHRlciB0aGFuIGJlZm9yZSBmb3IgUC0xOTIgYW5kIFAtMjI0KS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb25zL21hY3JvcwoKICAgICAgICAgIFNTTF9DVFhfc2V0X21zZ19jYWxsYmFjayhjdHgsIGNiKQogICAgICAgICAgU1NMX0NUWF9zZXRfbXNnX2NhbGxiYWNrX2FyZyhjdHgsIGFyZykKICAgICAgICAgIFNTTF9zZXRfbXNnX2NhbGxiYWNrKHNzbCwgY2IpCiAgICAgICAgICBTU0xfc2V0X21zZ19jYWxsYmFja19hcmcoc3NsLCBhcmcpCgogICAgIHRvIHJlcXVlc3QgY2FsbGluZyBhIGNhbGxiYWNrIGZ1bmN0aW9uCgogICAgICAgICAgdm9pZCBjYihpbnQgd3JpdGVfcCwgaW50IHZlcnNpb24sIGludCBjb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgU1NMICpzc2wsIHZvaWQgKmFyZykKCiAgICAgd2hlbmV2ZXIgYSBwcm90b2NvbCBtZXNzYWdlIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVjZWl2ZWQKICAgICAod3JpdGVfcCA9PSAwKSBvciBzZW50ICh3cml0ZV9wID09IDEpLiAgSGVyZSAndmVyc2lvbicgaXMgdGhlCiAgICAgcHJvdG9jb2wgdmVyc2lvbiAgYWNjb3JkaW5nIHRvIHdoaWNoIHRoZSBTU0wgbGlicmFyeSBpbnRlcnByZXRzCiAgICAgdGhlIGN1cnJlbnQgcHJvdG9jb2wgbWVzc2FnZSAoU1NMMl9WRVJTSU9OLCBTU0wzX1ZFUlNJT04sIG9yCiAgICAgVExTMV9WRVJTSU9OKS4gICdjb250ZW50X3R5cGUnIGlzIDAgaW4gdGhlIGNhc2Ugb2YgU1NMIDIuMCwgb3IKICAgICB0aGUgY29udGVudCB0eXBlIGFzIGRlZmluZWQgaW4gdGhlIFNTTCAzLjAvVExTIDEuMCBwcm90b2NvbAogICAgIHNwZWNpZmljYXRpb24gKGNoYW5nZV9jaXBoZXJfc3BlYygyMCksIGFsZXJ0KDIxKSwgaGFuZHNoYWtlKDIyKSkuCiAgICAgJ2J1ZicgYW5kICdsZW4nIHBvaW50IHRvIHRoZSBhY3R1YWwgbWVzc2FnZSwgJ3NzbCcgdG8gdGhlCiAgICAgU1NMIG9iamVjdCwgYW5kICdhcmcnIGlzIHRoZSBhcHBsaWNhdGlvbi1kZWZpbmVkIHZhbHVlIHNldCBieQogICAgIFNTTFtfQ1RYXV9zZXRfbXNnX2NhbGxiYWNrX2FyZygpLgoKICAgICAnb3BlbnNzbCBzX2NsaWVudCcgYW5kICdvcGVuc3NsIHNfc2VydmVyJyBoYXZlIG5ldyAnLW1zZycgb3B0aW9ucwogICAgIHRvIGVuYWJsZSBhIGNhbGxiYWNrIHRoYXQgZGlzcGxheXMgYWxsIHByb3RvY29sIG1lc3NhZ2VzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSB0aGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBzbyBzaGFyZWQgbGlicmFyaWVzIGFyZSBidWlsdCBhcwogICAgIHNvb24gYXMgdGhlIGNvcnJlc3BvbmRpbmcgc3RhdGljIGxpYnJhcnkgaXMgZmluaXNoZWQsIGFuZCB0aGVyZWJ5IGdldAogICAgIG9wZW5zc2wgYW5kIHRoZSB0ZXN0IHByb2dyYW1zIGxpbmtlZCBhZ2FpbnN0IHRoZSBzaGFyZWQgbGlicmFyeS4KICAgICBUaGlzIHN0aWxsIG9ubHkgaGFwcGVucyB3aGVuIHRoZSBrZXl3b3JkICJzaGFyZCIgaGFzIGJlZW4gZ2l2ZW4gdG8KICAgICB0aGUgY29uZmlndXJhdGlvbiBzY3JpcHRzLgoKICAgICBOT1RFOiBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGlzIHN0aWxsIGFuIGV4cGVyaW1lbnRhbCB0aGluZywgYW5kCiAgICAgYmFja3dhcmQgYmluYXJ5IGNvbXBhdGliaWxpdHkgaXMgc3RpbGwgbm90IGd1YXJhbnRlZWQuCiAgICAgWyJNYWNpZWogVy4gUm96eWNraSIgPG1hY3JvQGRzMi5wZy5nZGEucGw+IGFuZCBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBzdXBwb3J0IGZvciBTdWJqZWN0IEluZm9ybWF0aW9uIEFjY2VzcyBleHRlbnNpb24uCiAgICAgW1BldGVyIFN5bHZlc3RlciA8UGV0ZXIuU3lsdmVzdGVyQEVkZWxXZWIuZnI+XQoKICAqKSBNYWtlIEJVRl9NRU1fZ3JvdygpIGJlaGF2aW91ciBtb3JlIGNvbnNpc3RlbnQ6IEluaXRpYWxpc2UgdG8gemVybwogICAgIGFkZGl0aW9uYWwgYnl0ZXMgd2hlbiBuZXcgbWVtb3J5IGhhZCB0byBiZSBhbGxvY2F0ZWQsIG5vdCBqdXN0CiAgICAgd2hlbiByZXVzaW5nIGFuIGV4aXN0aW5nIGJ1ZmZlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgY29tbWFuZCBsaW5lIGFuZCBjb25maWd1cmF0aW9uIG9wdGlvbiAndXRmOCcgZm9yIHRoZSByZXEgY29tbWFuZC4KICAgICBUaGlzIGFsbG93cyBmaWVsZCB2YWx1ZXMgdG8gYmUgc3BlY2lmaWVkIGFzIFVURjggc3RyaW5ncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgLW11bHRpIGFuZCAtbXIgb3B0aW9ucyB0byAib3BlbnNzbCBzcGVlZCIgLSBnaXZpbmcgbXVsdGlwbGUgcGFyYWxsZWwKICAgICBydW5zIGZvciB0aGUgZm9ybWVyIGFuZCBtYWNoaW5lLXJlYWRhYmxlIG91dHB1dCBmb3IgdGhlIGxhdHRlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkICctbm9lbWFpbEROJyBvcHRpb24gdG8gJ29wZW5zc2wgY2EnLiAgVGhpcyBwcmV2ZW50cyBpbmNsdXNpb24KICAgICBvZiB0aGUgZS1tYWlsIGFkZHJlc3MgaW4gdGhlIEROIChpLmUuLCBpdCB3aWxsIGdvIGludG8gYSBjZXJ0aWZpY2F0ZQogICAgIGV4dGVuc2lvbiBvbmx5KS4gIFRoZSBuZXcgY29uZmlndXJhdGlvbiBmaWxlIG9wdGlvbiAnZW1haWxfaW5fZG4gPSBubycKICAgICBoYXMgdGhlIHNhbWUgZWZmZWN0LgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSBtYWR3b2xmQG9wZW5jYS5vcmddCgogICopIENoYW5nZSBhbGwgZnVuY3Rpb25zIHdpdGggbmFtZXMgc3RhcnRpbmcgd2l0aCBkZXNfIHRvIGJlIHN0YXJ0aW5nCiAgICAgd2l0aCBERVNfIGluc3RlYWQuICBBZGQgd3JhcHBlcnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIGxpYmRlcywKICAgICBidXQgYXJlIG5hbWVkIF9vc3NsX29sZF9kZXNfKi4gIEZpbmFsbHksIGFkZCBtYWNyb3MgdGhhdCBtYXAgdGhlCiAgICAgZGVzXyogc3ltYm9scyB0byB0aGUgY29ycmVzcG9uZGluZyBfb3NzbF9vbGRfZGVzXyogaWYgbGliZGVzCiAgICAgY29tcGF0aWJpbGl0eSBpcyBkZXNpcmVkLiAgSWYgT3BlblNTTCAwLjkuNmMgY29tcGF0aWJpbGl0eSBpcwogICAgIGRlc2lyZWQsIHRoZSBkZXNfKiBzeW1ib2xzIHdpbGwgYmUgbWFwcGVkIHRvIERFU18qLCB3aXRoIG9uZQogICAgIGV4Y2VwdGlvbi4KCiAgICAgU2luY2Ugd2UgcHJvdmlkZSB0d28gY29tcGF0aWJpbGl0eSBtYXBwaW5ncywgdGhlIHVzZXIgbmVlZHMgdG8KICAgICBkZWZpbmUgdGhlIG1hY3JvIE9QRU5TU0xfREVTX0xJQkRFU19DT01QQVRJQklMSVRZIGlmIGxpYmRlcwogICAgIGNvbXBhdGliaWxpdHkgaXMgZGVzaXJlZC4gIFRoZSBkZWZhdWx0IChpLmUuLCB3aGVuIHRoYXQgbWFjcm8KICAgICBpc24ndCBkZWZpbmVkKSBpcyBPcGVuU1NMIDAuOS42YyBjb21wYXRpYmlsaXR5LgoKICAgICBUaGVyZSBhcmUgYWxzbyBtYWNyb3MgdGhhdCBlbmFibGUgYW5kIGRpc2FibGUgdGhlIHN1cHBvcnQgb2Ygb2xkCiAgICAgZGVzIGZ1bmN0aW9ucyBhbHRvZ2V0aGVyLiAgVGhvc2UgYXJlIE9QRU5TU0xfRU5BQkxFX09MRF9ERVNfU1VQUE9SVAogICAgIGFuZCBPUEVOU1NMX0RJU0FCTEVfT0xEX0RFU19TVVBQT1JULiAgSWYgbm9uZSBvciBib3RoIG9mIHRob3NlCiAgICAgYXJlIGRlZmluZWQsIHRoZSBkZWZhdWx0IHdpbGwgYXBwbHk6IHRvIHN1cHBvcnQgdGhlIG9sZCBkZXMgcm91dGluZXMuCgogICAgIEluIGVpdGhlciBjYXNlLCBvbmUgbXVzdCBpbmNsdWRlIG9wZW5zc2wvZGVzLmggdG8gZ2V0IHRoZSBjb3JyZWN0CiAgICAgZGVmaW5pdGlvbnMuICBEbyBub3QgdHJ5IHRvIGp1c3QgaW5jbHVkZSBvcGVuc3NsL2Rlc19vbGQuaCwgdGhhdAogICAgIHdvbid0IHdvcmsuCgogICAgIE5PVEU6IFRoaXMgaXMgYSBtYWpvciBicmVhayBvZiBhbiBvbGQgQVBJIGludG8gYSBuZXcgb25lLiAgU29mdHdhcmUKICAgICBhdXRob3JzIGFyZSBlbmNvdXJhZ2VkIHRvIHN3aXRjaCB0byB0aGUgREVTXyBzdHlsZSBmdW5jdGlvbnMuICBTb21lCiAgICAgdGltZSBpbiB0aGUgZnV0dXJlLCBkZXNfb2xkLmggYW5kIHRoZSBsaWJkZXMgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMKICAgICB3aWxsIGJlIGRpc2FibGUgKGkuZS4gT1BFTlNTTF9ESVNBQkxFX09MRF9ERVNfU1VQUE9SVCB3aWxsIGJlIHRoZQogICAgIGRlZmF1bHQpLCBhbmQgdGhlbiBjb21wbGV0ZWx5IHJlbW92ZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGVzdCBmb3IgY2VydGlmaWNhdGVzIHdoaWNoIGNvbnRhaW4gdW5zdXBwb3J0ZWQgY3JpdGljYWwgZXh0ZW5zaW9ucy4KICAgICBJZiBzdWNoIGEgY2VydGlmaWNhdGUgaXMgZm91bmQgZHVyaW5nIGEgdmVyaWZ5IG9wZXJhdGlvbiBpdCBpcyAKICAgICByZWplY3RlZCBieSBkZWZhdWx0OiB0aGlzIGJlaGF2aW91ciBjYW4gYmUgb3ZlcnJpZGRlbiBieSBlaXRoZXIKICAgICBoYW5kbGluZyB0aGUgbmV3IGVycm9yIFg1MDlfVl9FUlJfVU5IQU5ETEVEX0NSSVRJQ0FMX0VYVEVOU0lPTiBvcgogICAgIGJ5IHNldHRpbmcgdGhlIHZlcmlmeSBmbGFnIFg1MDlfVl9GTEFHX0lHTk9SRV9DUklUSUNBTC4gQSBuZXcgZnVuY3Rpb24KICAgICBYNTA5X3N1cHBvcnRlZF9leHRlbnNpb24oKSBoYXMgYWxzbyBiZWVuIGFkZGVkIHdoaWNoIHJldHVybnMgMSBpZiBhCiAgICAgcGFydGljdWxhciBleHRlbnNpb24gaXMgc3VwcG9ydGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIEVWUCBjaXBoZXIgZnVuY3Rpb25zIGluIHNpbWlsYXIgd2F5IHRvIGRpZ2VzdHMKICAgICB0byByZXRhaW4gY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IHRoZSBiZWhhdmlvdXIgb2YgRVZQX0RpZ2VzdEluaXQoKSBhbmQgRVZQX0RpZ2VzdEZpbmFsKCkgdG8gcmV0YWluCiAgICAgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIGNvZGUuIEluIHBhcnRpY3VsYXIgdGhlICdjdHgnIHBhcmFtZXRlciBkb2VzCiAgICAgbm90IGhhdmUgdG8gYmUgdG8gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBjYWxsIHRvIEVWUF9EaWdlc3RJbml0KCkgYW5kCiAgICAgaXQgaXMgdGlkaWVkIHVwIGFmdGVyIGEgY2FsbCB0byBFVlBfRGlnZXN0RmluYWwoKS4gTmV3IGZ1bmN0aW9uCiAgICAgRVZQX0RpZ2VzdEZpbmFsX2V4KCkgd2hpY2ggZG9lcyBub3QgdGlkeSB1cCB0aGUgY3R4LiBTaW1pbGFybHkgZnVuY3Rpb24KICAgICBFVlBfTURfQ1RYX2NvcHkoKSBjaGFuZ2VkIHRvIG5vdCByZXF1aXJlIHRoZSBkZXN0aW5hdGlvbiB0byBiZQogICAgIGluaXRpYWxpemVkIHZhbGlkIGFuZCBuZXcgZnVuY3Rpb24gRVZQX01EX0NUWF9jb3B5X2V4KCkgYWRkZWQgd2hpY2gKICAgICByZXF1aXJlcyB0aGUgZGVzdGluYXRpb24gdG8gYmUgdmFsaWQuCgogICAgIE1vZGlmeSBhbGwgdGhlIE9wZW5TU0wgZGlnZXN0IGNhbGxzIHRvIHVzZSBFVlBfRGlnZXN0SW5pdF9leCgpLAogICAgIEVWUF9EaWdlc3RGaW5hbF9leCgpIGFuZCBFVlBfTURfQ1RYX2NvcHlfZXgoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2Ugc3NsM19nZXRfbWVzc2FnZSAoc3NsL3MzX2JvdGguYykgYW5kIHRoZSBmdW5jdGlvbnMgdXNpbmcgaXQKICAgICBzbyB0aGF0IGNvbXBsZXRlICdIYW5kc2hha2UnIHByb3RvY29sIHN0cnVjdHVyZXMgYXJlIGtlcHQgaW4gbWVtb3J5CiAgICAgaW5zdGVhZCBvZiBvdmVyd3JpdGluZyAnbXNnX3R5cGUnIGFuZCAnbGVuZ3RoJyB3aXRoICdib2R5JyBkYXRhLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBhbiBpbXBsZW1lbnRhdGlvbiBvZiBTU0xfYWRkX2Rpcl9jZXJ0X3N1YmplY3RzX3RvX3N0YWNrIGZvciBXaW4zMi4KICAgICBbTWFzc2ltbyBTYW50aW4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFqb3IgcmVzdHJ1Y3R1cmluZyB0byB0aGUgdW5kZXJseWluZyBFTkdJTkUgY29kZS4gVGhpcyBpbmNsdWRlcwogICAgIHJlZHVjdGlvbiBvZiBsaW5rZXIgYmxvYXQsIHNlcGFyYXRpb24gb2YgcHVyZSAiRU5HSU5FIiBtYW5pcHVsYXRpb24KICAgICAoaW5pdGlhbGlzYXRpb24sIGV0YykgZnJvbSBmdW5jdGlvbmFsaXR5IGRlYWxpbmcgd2l0aCBpbXBsZW1lbnRhdGlvbnMKICAgICBvZiBzcGVjaWZpYyBjcnlwdG8gaXRlcmZhY2VzLiBUaGlzIGNoYW5nZSBhbHNvIGludHJvZHVjZXMgaW50ZWdyYXRlZAogICAgIHN1cHBvcnQgZm9yIHN5bW1ldHJpYyBjaXBoZXJzIGFuZCBkaWdlc3QgaW1wbGVtZW50YXRpb25zIC0gc28gRU5HSU5FcwogICAgIGNhbiBub3cgYWNjZWxlcmF0ZSB0aGVzZSBieSBwcm92aWRpbmcgRVZQX0NJUEhFUiBhbmQgRVZQX01ECiAgICAgaW1wbGVtZW50YXRpb25zIG9mIHRoZWlyIG93bi4gVGhpcyBpcyBkZXRhaWxlZCBpbiBjcnlwdG8vZW5naW5lL1JFQURNRQogICAgIGFzIGl0IGNvdWxkbid0IGJlIGFkZXF1YXRlbHkgZGVzY3JpYmVkIGhlcmUuIEhvd2V2ZXIsIHRoZXJlIGFyZSBhIGZldwogICAgIEFQSSBjaGFuZ2VzIHdvcnRoIG5vdGluZyAtIHNvbWUgUlNBLCBEU0EsIERILCBhbmQgUkFORCBmdW5jdGlvbnMgdGhhdAogICAgIHdlcmUgY2hhbmdlZCBpbiB0aGUgb3JpZ2luYWwgaW50cm9kdWN0aW9uIG9mIEVOR0lORSBjb2RlIGhhdmUgbm93CiAgICAgcmV2ZXJ0ZWQgYmFjayAtIHRoZSBob29raW5nIGZyb20gdGhpcyBjb2RlIHRvIEVOR0lORSBpcyBub3cgYSBnb29kCiAgICAgZGVhbCBtb3JlIHBhc3NpdmUgYW5kIGF0IHJ1bi10aW1lLCBvcGVyYXRpb25zIGRlYWwgZGlyZWN0bHkgd2l0aAogICAgIFJTQV9NRVRIT0RzLCBEU0FfTUVUSE9EcyAoZXRjKSBhcyB0aGV5IGRpZCBiZWZvcmUsIHJhdGhlciB0aGFuCiAgICAgZGVyZWZlcmVuY2luZyB0aHJvdWdoIGFuIEVOR0lORSBwb2ludGVyIGFueSBtb3JlLiBBbHNvLCB0aGUgRU5HSU5FCiAgICAgZnVuY3Rpb25zIGRlYWxpbmcgd2l0aCBCTl9NT0RfRVhQW19DUlRdIGhhbmRsZXJzIGhhdmUgYmVlbiByZW1vdmVkIC0KICAgICB0aGV5IHdlcmUgbm90IGJlaW5nIHVzZWQgYnkgdGhlIGZyYW1ld29yayBhcyB0aGVyZSBpcyBubyBjb25jZXB0IG9mIGEKICAgICBCSUdOVU1fTUVUSE9EIGFuZCB0aGV5IGNvdWxkIG5vdCBiZSBnZW5lcmFsaXNlZCB0byB0aGUgbmV3CiAgICAgJ0VOR0lORV9UQUJMRScgbWVjaGFuaXNtIHRoYXQgdW5kZXJsaWVzIHRoZSBuZXcgY29kZS4gU2ltaWxhcmx5LAogICAgIEVOR0lORV9jcHkoKSBoYXMgYmVlbiByZW1vdmVkIGFzIGl0IGNhbm5vdCBiZSBjb25zaXN0ZW50bHkgZGVmaW5lZCBpbgogICAgIHRoZSBuZXcgY29kZS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBDaGFuZ2UgQVNOMV9HRU5FUkFMSVpFRFRJTUVfY2hlY2soKSB0byBhbGxvdyBmcmFjdGlvbmFsIHNlY29uZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIG1rZGVmLnBsIHRvIHNvcnQgc3ltYm9scyB0aGF0IGdldCB0aGUgc2FtZSBlbnRyeSBudW1iZXIsCiAgICAgYW5kIG1ha2Ugc3VyZSB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnVuY3Rpb25zIEVSUl9sb2FkXyoKICAgICBiZWNvbWUgcGFydCBvZiBsaWJlYXkubnVtIGFzIHdlbGwuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IGZ1bmN0aW9uIFNTTF9yZW5lZ290aWF0ZV9wZW5kaW5nKCkuICBUaGlzIHJldHVybnMgdHJ1ZSBvbmNlCiAgICAgcmVuZWdvdGlhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQgKGVpdGhlciBTU0xfcmVuZWdvdGlhdGUoKSBjYWxsCiAgICAgb3IgSGVsbG9SZXF1ZXN0L0NsaWVudEhlbGxvIHJlY2V2ZWl2ZWQgZnJvbSB0aGUgcGVlcikgYW5kIGJlY29tZXMKICAgICBmYWxzZSBvbmNlIGEgaGFuZHNoYWtlIGhhcyBiZWVuIGNvbXBsZXRlZC4KICAgICAoRm9yIHNlcnZlcnMsIFNTTF9yZW5lZ290aWF0ZSgpIGZvbGxvd2VkIGJ5IFNTTF9kb19oYW5kc2hha2UoKQogICAgIHNlbmRzIGEgSGVsbG9SZXF1ZXN0LCBidXQgZG9lcyBub3QgZW5zdXJlIHRoYXQgYSBoYW5kc2hha2UgdGFrZXMKICAgICBwbGFjZS4gIFNTTF9yZW5lZ290aWF0ZV9wZW5kaW5nKCkgaXMgdXNlZnVsIGZvciBjaGVja2luZyBpZiB0aGUKICAgICBjbGllbnQgaGFzIGZvbGxvd2VkIHRoZSByZXF1ZXN0LikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgU1NMIG9wdGlvbiBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04uCiAgICAgQnkgZGVmYXVsdCwgY2xpZW50cyBtYXkgcmVxdWVzdCBzZXNzaW9uIHJlc3VtcHRpb24gZXZlbiBkdXJpbmcKICAgICByZW5lZ290aWF0aW9uIChpZiBzZXNzaW9uIElEIGNvbnRleHRzIHBlcm1pdCk7IHdpdGggdGhpcyBvcHRpb24sCiAgICAgc2Vzc2lvbiByZXN1bXB0aW9uIGlzIHBvc3NpYmxlIG9ubHkgaW4gdGhlIGZpcnN0IGhhbmRzaGFrZS4KCiAgICAgU1NMX09QX0FMTCBpcyBub3cgMHgwMDAwMEZGRkwgaW5zdGVhZCBvZiAweDAwMEZGRkZGTC4gIFRoaXMgbWFrZXMKICAgICBtb3JlIGJpdHMgYXZhaWxhYmxlIGZvciBvcHRpb25zIHRoYXQgc2hvdWxkIG5vdCBiZSBwYXJ0IG9mCiAgICAgU1NMX09QX0FMTCAoc3VjaCBhcyBTU0xfT1BfTk9fU0VTU0lPTl9SRVNVTVBUSU9OX09OX1JFTkVHT1RJQVRJT04pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzb21lIGRlbW9zIGZvciBjZXJ0aWZpY2F0ZSBhbmQgY2VydGlmaWNhdGUgcmVxdWVzdCBjcmVhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIG1heGltdW0gY2VydGlmaWNhdGUgY2hhaW4gc2l6ZSBhY2NlcHRlZCBmcm9tIHRoZSBwZWVyIGFwcGxpY2F0aW9uCiAgICAgc2V0dGFibGUgKFNTTCpfZ2V0L3NldF9tYXhfY2VydF9saXN0KCkpLCBhcyBwcm9wb3NlZCBieQogICAgICJEb3VnbGFzIEUuIEVuZ2VydCIgPGRlZW5nZXJ0QGFubC5nb3Y+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyBmb3IgVW5peHdhcmUtNwogICAgIChCb3lkIEx5bm4gR2VyYmVyIDxnZXJiZXJiQHplbmV6LmNvbT4pLgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgYSAiZGVzdHJveSIgaGFuZGxlciB0byBFTkdJTkVzIHRoYXQgYWxsb3dzIHN0cnVjdHVyYWwgY2xlYW51cCB0bwogICAgIGJlIGRvbmUgcHJpb3IgdG8gZGVzdHJ1Y3Rpb24uIFVzZSB0aGlzIHRvIHVubG9hZCBlcnJvciBzdHJpbmdzIGZyb20KICAgICBFTkdJTkVzIHRoYXQgbG9hZCB0aGVpciBvd24gZXJyb3Igc3RyaW5ncy4gTkI6IFRoaXMgYWRkcyB0d28gbmV3IEFQSQogICAgIGZ1bmN0aW9ucyB0byAiZ2V0IiBhbmQgInNldCIgdGhpcyBkZXN0cm95IGhhbmRsZXIgaW4gYW4gRU5HSU5FLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFsdGVyIGFsbCBleGlzdGluZyBFTkdJTkUgaW1wbGVtZW50YXRpb25zIChleGNlcHQgIm9wZW5zc2wiIGFuZAogICAgICJvcGVuYnNkIikgdG8gZHluYW1pY2FsbHkgaW5zdGFudGlhdGUgdGhlaXIgb3duIGVycm9yIHN0cmluZ3MuIFRoaXMKICAgICBtYWtlcyB0aGVtIG1vcmUgZmxleGlibGUgdG8gYmUgYnVpbHQgYm90aCBhcyBzdGF0aWNhbGx5LWxpbmtlZCBFTkdJTkVzCiAgICAgYW5kIHNlbGYtY29udGFpbmVkIHNoYXJlZC1saWJyYXJpZXMgbG9hZGFibGUgdmlhIHRoZSAiZHluYW1pYyIgRU5HSU5FLgogICAgIEFsc28sIGFkZCBzdHViIGNvZGUgdG8gZWFjaCB0aGF0IG1ha2VzIGJ1aWxkaW5nIHRoZW0gYXMgc2VsZi1jb250YWluZWQKICAgICBzaGFyZWQtbGlicmFyaWVzIGVhc2llciAoc2VlIFJFQURNRS5FTkdJTkUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhICJkeW5hbWljIiBFTkdJTkUgdGhhdCBwcm92aWRlcyBhIG1lY2hhbmlzbSBmb3IgYmluZGluZyBFTkdJTkUKICAgICBpbXBsZW1lbnRhdGlvbnMgaW50byBhcHBsaWNhdGlvbnMgdGhhdCBhcmUgY29tcGxldGVseSBpbXBsZW1lbnRlZCBpbgogICAgIHNlbGYtY29udGFpbmVkIHNoYXJlZC1saWJyYXJpZXMuIFRoZSAiZHluYW1pYyIgRU5HSU5FIGV4cG9zZXMgY29udHJvbAogICAgIGNvbW1hbmRzIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHdoYXQgc2hhcmVkLWxpYnJhcnkgdG8gbG9hZCBhbmQKICAgICB0byBjb250cm9sIGFzcGVjdHMgb2YgdGhlIHdheSBpdCBpcyBoYW5kbGVkLiBBbHNvLCBtYWRlIGFuIHVwZGF0ZSB0bwogICAgIHRoZSBSRUFETUUuRU5HSU5FIGZpbGUgdGhhdCBicmluZ3MgaXRzIGluZm9ybWF0aW9uIHVwLXRvLWRhdGUgYW5kCiAgICAgcHJvdmlkZXMgc29tZSBpbmZvcm1hdGlvbiBhbmQgaW5zdHJ1Y3Rpb25zIG9uIHRoZSAiZHluYW1pYyIgRU5HSU5FCiAgICAgKGllLiBob3cgdG8gdXNlIGl0LCBob3cgdG8gYnVpbGQgImR5bmFtaWMiLWxvYWRhYmxlIEVOR0lORXMsIGV0YykuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byB1bmxvYWQgcmFuZ2VzIG9mIEVSUiBzdHJpbmdzIHdpdGggYSBuZXcKICAgICAiRVJSX3VubG9hZF9zdHJpbmdzIiBmdW5jdGlvbi4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYSBjb3B5KCkgZnVuY3Rpb24gdG8gRVZQX01ELgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIEVWUF9NRCByb3V0aW5lcyB0YWtlIGEgY29udGV4dCBwb2ludGVyIGluc3RlYWQgb2YganVzdCB0aGUKICAgICBtZF9kYXRhIHZvaWQgcG9pbnRlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGZsYWdzIHRvIEVWUF9NRCBhbmQgRVZQX01EX0NUWC4gRVZQX01EX0ZMQUdfT05FU0hPVCBpbmRpY2F0ZXMKICAgICB0aGF0IHRoZSBkaWdlc3QgY2FuIG9ubHkgcHJvY2VzcyBhIHNpbmdsZSBjaHVuayBvZiBkYXRhCiAgICAgKHR5cGljYWxseSBiZWNhdXNlIGl0IGlzIHByb3ZpZGVkIGJ5IGEgcGllY2Ugb2YKICAgICBoYXJkd2FyZSkuIEVWUF9NRF9DVFhfRkxBR19PTkVTSE9UIGluZGljYXRlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbgogICAgIGlzIG9ubHkgZ29pbmcgdG8gcHJvdmlkZSBhIHNpbmdsZSBjaHVuayBvZiBkYXRhLCBhbmQgaGVuY2UgdGhlCiAgICAgZnJhbWV3b3JrIG5lZWRuJ3QgYWNjdW11bGF0ZSB0aGUgZGF0YSBmb3Igb25lc2hvdCBkcml2ZXJzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBcyB3aXRoICJFUlIiLCBtYWtlIGl0IHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlIHVuZGVybHlpbmcgImV4X2RhdGEiCiAgICAgZnVuY3Rpb25zLiBUaGlzIGNoYW5nZSBhbHNvIGFsdGVycyB0aGUgc3RvcmFnZSBhbmQgbWFuYWdlbWVudCBvZiBnbG9iYWwKICAgICBleF9kYXRhIHN0YXRlIC0gaXQncyBub3cgYWxsIGluc2lkZSBleF9kYXRhLmMgYW5kIGFsbCAiY2xhc3MiIGNvZGUgKGVnLgogICAgIFJTQSwgQklPLCBTU0xfQ1RYLCBldGMpIG5vIGxvbmdlciBzdG9yZXMgaXRzIG93biBTVEFDS1MgYW5kIHBlci1jbGFzcwogICAgIGluZGV4IGNvdW50ZXJzLiBUaGUgQVBJIGZ1bmN0aW9ucyB0aGF0IHVzZSB0aGlzIHN0YXRlIGhhdmUgYmVlbiBjaGFuZ2VkCiAgICAgdG8gdGFrZSBhICJjbGFzc19pbmRleCIgcmF0aGVyIHRoYW4gcG9pbnRlcnMgdG8gdGhlIGNsYXNzJ3MgbG9jYWwgU1RBQ0sKICAgICBhbmQgY291bnRlciwgYW5kIHRoZXJlIGlzIG5vdyBhbiBBUEkgZnVuY3Rpb24gdG8gZHluYW1pY2FsbHkgY3JlYXRlIG5ldwogICAgIGNsYXNzZXMuIFRoaXMgY2VudHJhbGlzYXRpb24gYWxsb3dzIHVzIHRvIChhKSBwbHVnIGEgbG90IG9mIHRoZQogICAgIHRocmVhZC1zYWZldHkgcHJvYmxlbXMgdGhhdCBleGlzdGVkLCBhbmQgKGIpIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGNsZWFuCiAgICAgdXAgYWxsIGFsbG9jYXRlZCBzdGF0ZSB1c2luZyAiQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKSIuIFcuci50LiAoYikKICAgICBzdWNoIGRhdGEgd291bGQgcHJldmlvdXNseSBoYXZlIGFsd2F5cyBsZWFrZWQgaW4gYXBwbGljYXRpb24gY29kZSBhbmQKICAgICB3b3JrYXJvdW5kcyB3ZXJlIGluIHBsYWNlIHRvIG1ha2UgdGhlIG1lbW9yeSBkZWJ1Z2dpbmcgdHVybiBhIGJsaW5kIGV5ZQogICAgIHRvIGl0LiBBcHBsaWNhdGlvbiBjb2RlIHRoYXQgZG9lc24ndCB1c2UgdGhpcyBuZXcgZnVuY3Rpb24gd2lsbCBzdGlsbAogICAgIGxlYWsgYXMgYmVmb3JlLCBidXQgdGhlaXIgbWVtb3J5IGRlYnVnZ2luZyBvdXRwdXQgd2lsbCBhbm5vdW5jZSBpdCBub3cKICAgICByYXRoZXIgdGhhbiBsZXR0aW5nIGl0IHNsaWRlLgoKICAgICBCZXNpZGVzIHRoZSBhZGRpdGlvbiBvZiBDUllQVE9fY2xlYW51cF9hbGxfZXhfZGF0YSgpLCBhbm90aGVyIEFQSSBjaGFuZ2UKICAgICBpbmR1Y2VkIGJ5IHRoZSAiZXhfZGF0YSIgb3ZlcmhhdWwgaXMgdGhhdCBYNTA5X1NUT1JFX0NUWF9pbml0KCkgbm93CiAgICAgaGFzIGEgcmV0dXJuIHZhbHVlIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHJlcGxhY2UgdGhlIHVuZGVybHlpbmcgIkVSUiIgZnVuY3Rpb25zIHN1Y2ggdGhhdCB0aGUKICAgICBnbG9iYWwgc3RhdGUgKDIgTEhBU0ggdGFibGVzIGFuZCAyIGxvY2tzKSBpcyBvbmx5IHVzZWQgYnkgdGhlICJkZWZhdWx0IgogICAgIGltcGxlbWVudGF0aW9uLiBUaGlzIGNoYW5nZSBhbHNvIGFkZHMgdHdvIGZ1bmN0aW9ucyB0byAiZ2V0IiBhbmQgInNldCIKICAgICB0aGUgaW1wbGVtZW50YXRpb24gcHJpb3IgdG8gaXQgYmVpbmcgYXV0b21hdGljYWxseSBzZXQgdGhlIGZpcnN0IHRpbWUKICAgICBhbnkgb3RoZXIgRVJSIGZ1bmN0aW9uIHRha2VzIHBsYWNlLiBJZS4gYW4gYXBwbGljYXRpb24gY2FuIGNhbGwgImdldCIsCiAgICAgcGFzcyB0aGUgcmV0dXJuIHZhbHVlIHRvIGEgbW9kdWxlIGl0IGhhcyBqdXN0IGxvYWRlZCwgYW5kIHRoYXQgbW9kdWxlCiAgICAgY2FuIGNhbGwgaXRzIG93biAic2V0IiBmdW5jdGlvbiB1c2luZyB0aGF0IHZhbHVlLiBUaGlzIG1lYW5zIHRoZQogICAgIG1vZHVsZSdzICJFUlIiIG9wZXJhdGlvbnMgd2lsbCB1c2UgKGFuZCBtb2RpZnkpIHRoZSBlcnJvciBzdGF0ZSBpbiB0aGUKICAgICBhcHBsaWNhdGlvbiBhbmQgbm90IGluIGl0cyBvd24gc3RhdGljYWxseSBsaW5rZWQgY29weSBvZiBPcGVuU1NMIGNvZGUuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgR2l2ZSBESCwgRFNBLCBhbmQgUlNBIHR5cGVzIHRoZWlyIG93biAiKipfdXBfcmVmKCkiIGZ1bmN0aW9uIHRvIGluY3JlbWVudAogICAgIHJlZmVyZW5jZSBjb3VudHMuIFRoaXMgcGVyZm9ybXMgbm9ybWFsIFJFRl9QUklOVC9SRUZfQ0hFQ0sgbWFjcm9zIG9uCiAgICAgdGhlIG9wZXJhdGlvbiwgYW5kIHByb3ZpZGVzIGEgbW9yZSBlbmNhcHN1bGF0ZWQgd2F5IGZvciBleHRlcm5hbCBjb2RlCiAgICAgKGNyeXB0by9ldnAvIGFuZCBzc2wvKSB0byBkbyB0aGlzLiBBbHNvIGNoYW5nZWQgdGhlIGV2cCBhbmQgc3NsIGNvZGUKICAgICB0byB1c2UgdGhlc2UgZnVuY3Rpb25zIHJhdGhlciB0aGFuIG1hbnVhbGx5IGluY3JlbWVudGluZyB0aGUgY291bnRzLgoKICAgICBBbHNvIHJlbmFtZSAiRFNPX3VwKCkiIGZ1bmN0aW9uIHRvIG1vcmUgZGVzY3JpcHRpdmUgIkRTT191cF9yZWYoKSIuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIEVWUCB0ZXN0IHByb2dyYW0uCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBzeW1tZXRyaWMgY2lwaGVyIHN1cHBvcnQgdG8gRU5HSU5FLiBFeHBlY3QgdGhlIEFQSSB0byBjaGFuZ2UhCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE5ldyBDUkwgZnVuY3Rpb25zOiBYNTA5X0NSTF9zZXRfdmVyc2lvbigpLCBYNTA5X0NSTF9zZXRfaXNzdWVyX25hbWUoKQogICAgIFg1MDlfQ1JMX3NldF9sYXN0VXBkYXRlKCksIFg1MDlfQ1JMX3NldF9uZXh0VXBkYXRlKCksIFg1MDlfQ1JMX3NvcnQoKSwKICAgICBYNTA5X1JFVk9LRURfc2V0X3NlcmlhbE51bWJlcigpLCBhbmQgWDUwOV9SRVZPS0VEX3NldF9yZXZvY2F0aW9uRGF0ZSgpLgogICAgIFRoZXNlIGFsbG93IGEgQ1JMIHRvIGJlIGJ1aWx0IHdpdGhvdXQgaGF2aW5nIHRvIGFjY2VzcyBYNTA5X0NSTCBmaWVsZHMKICAgICBkaXJlY3RseS4gTW9kaWZ5ICdjYScgYXBwbGljYXRpb24gdG8gdXNlIG5ldyBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW92ZSBTU0xfT1BfVExTX1JPTExCQUNLX0JVRyBvdXQgb2YgdGhlIFNTTF9PUF9BTEwgbGlzdCBvZiByZWNvbW1lbmRlZAogICAgIGJ1ZyB3b3JrYXJvdW5kcy4gUm9sbGJhY2sgYXR0YWNrIGRldGVjdGlvbiBpcyBhIHNlY3VyaXR5IGZlYXR1cmUuCiAgICAgVGhlIHByb2JsZW0gd2lsbCBvbmx5IGFyaXNlIG9uIE9wZW5TU0wgc2VydmVycyB3aGVuIFRMU3YxIGlzIG5vdAogICAgIGF2YWlsYWJsZSAoc3NsdjNfc2VydmVyX21ldGhvZCgpIG9yIFNTTF9PUF9OT19UTFN2MSkuCiAgICAgU29mdHdhcmUgYXV0aG9ycyBub3Qgd2FudGluZyB0byBzdXBwb3J0IFRMU3YxIHdpbGwgaGF2ZSBzcGVjaWFsIHJlYXNvbnMKICAgICBmb3IgdGhlaXIgY2hvaWNlIGFuZCBjYW4gZXhwbGljaXRseSBlbmFibGUgdGhpcyBvcHRpb24uCiAgICAgW0JvZG8gTW9lbGxlciwgTHV0eiBKYWVuaWNrZV0KCiAgKikgUmF0aW9uYWxpc2UgRVZQIHNvIGl0IGNhbiBiZSBleHRlbmRlZDogZG9uJ3QgaW5jbHVkZSBhIHVuaW9uIG9mCiAgICAgY2lwaGVyL2RpZ2VzdCBzdHJ1Y3R1cmVzLCBhZGQgaW5pdC9jbGVhbnVwIGZ1bmN0aW9ucyBmb3IgRVZQX01EX0NUWAogICAgIChzaW1pbGFyIHRvIHRob3NlIGV4aXN0aW5nIGZvciBFVlBfQ0lQSEVSX0NUWCkuCiAgICAgVXNhZ2UgZXhhbXBsZToKCiAgICAgICAgIEVWUF9NRF9DVFggbWQ7CgogICAgICAgICBFVlBfTURfQ1RYX2luaXQoJm1kKTsgICAgICAgICAgICAgLyogbmV3IGZ1bmN0aW9uIGNhbGwgKi8KICAgICAgICAgRVZQX0RpZ2VzdEluaXQoJm1kLCBFVlBfc2hhMSgpKTsKICAgICAgICAgRVZQX0RpZ2VzdFVwZGF0ZSgmbWQsIGluLCBsZW4pOwogICAgICAgICBFVlBfRGlnZXN0RmluYWwoJm1kLCBvdXQsIE5VTEwpOwogICAgICAgICBFVlBfTURfQ1RYX2NsZWFudXAoJm1kKTsgICAgICAgICAgLyogbmV3IGZ1bmN0aW9uIGNhbGwgKi8KCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1ha2UgREVTIGtleSBzY2hlZHVsZSBjb25mb3JtIHRvIHRoZSB1c3VhbCBzY2hlbWUsIGFzIHdlbGwgYXMKICAgICBjb3JyZWN0aW5nIGl0cyBzdHJ1Y3R1cmUuIFRoaXMgbWVhbnMgdGhhdCBjYWxscyB0byBERVMgZnVuY3Rpb25zCiAgICAgbm93IGhhdmUgdG8gcGFzcyBhIHBvaW50ZXIgdG8gYSBkZXNfa2V5X3NjaGVkdWxlIGluc3RlYWQgb2YgYQogICAgIHBsYWluIGRlc19rZXlfc2NoZWR1bGUgKHdoaWNoIHdhcyBhY3R1YWxseSBhbHdheXMgYSBwb2ludGVyCiAgICAgYW55d2F5KTogRS5nLiwKCiAgICAgICAgIGRlc19rZXlfc2NoZWR1bGUga3M7CgoJIGRlc19zZXRfa2V5X2NoZWNrZWQoLi4uLCAma3MpOwoJIGRlc19uY2JjX2VuY3J5cHQoLi4uLCAma3MsIC4uLik7CgogICAgIChOb3RlIHRoYXQgYSBsYXRlciBjaGFuZ2UgcmVuYW1lcyAnZGVzXy4uLicgaW50byAnREVTXy4uLicuKQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBJbml0aWFsIHJlZHVjdGlvbiBvZiBsaW5rZXIgYmxvYXQ6IHRoZSB1c2Ugb2Ygc29tZSBmdW5jdGlvbnMsIHN1Y2ggYXMKICAgICBQRU0gY2F1c2VzIGxhcmdlIGFtb3VudHMgb2YgdW51c2VkIGZ1bmN0aW9ucyB0byBiZSBsaW5rZWQgaW4gZHVlIHRvCiAgICAgcG9vciBvcmdhbmlzYXRpb24uIEZvciBleGFtcGxlIHBlbV9hbGwuYyBjb250YWlucyBldmVyeSBQRU0gZnVuY3Rpb24KICAgICB3aGljaCBoYXMgYSBrbm9jayBvbiBlZmZlY3Qgb2YgbGlua2luZyBpbiBsYXJnZSBhbW91bnRzIG9mICh1bnVzZWQpCiAgICAgQVNOMSBjb2RlLiBHcm91cGluZyB0b2dldGhlciBzaW1pbGFyIGZ1bmN0aW9ucyBhbmQgc3BsaXR0aW5nIHVucmVsYXRlZAogICAgIGZ1bmN0aW9ucyBwcmV2ZW50cyB0aGlzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFudXAgb2YgRVZQIG1hY3Jvcy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ2hhbmdlIGhpc3RvcmljYWwgcmVmZXJlbmNlcyB0byB7TklELFNOLExOfV9kZXNfZWRlIGFuZCBlZGUzIHRvIGFkZCB0aGUKICAgICBjb3JyZWN0IF9lY2Igc3VmZml4LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgaW5pdGlhbCBPQ1NQIHJlc3BvbmRlciBzdXBwb3J0IHRvIG9jc3AgYXBwbGljYXRpb24uIFRoZQogICAgIHJldm9jYXRpb24gaW5mb3JtYXRpb24gaXMgaGFuZGxlZCB1c2luZyB0aGUgdGV4dCBiYXNlZCBpbmRleAogICAgIHVzZSBieSB0aGUgY2EgYXBwbGljYXRpb24uIFRoZSByZXNwb25kZXIgY2FuIGVpdGhlciBoYW5kbGUKICAgICByZXF1ZXN0cyBnZW5lcmF0ZWQgaW50ZXJuYWxseSwgc3VwcGxpZWQgaW4gZmlsZXMgKGZvciBleGFtcGxlCiAgICAgdmlhIGEgQ0dJIHNjcmlwdCkgb3IgdXNpbmcgYW4gaW50ZXJuYWwgbWluaW1hbCBzZXJ2ZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvbmZpZ3VyYXRpb24gY2hvaWNlcyB0byBnZXQgemxpYiBjb21wcmVzc2lvbiBmb3IgVExTLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZXMgdG8gS2VyYmVyb3MgU1NMIGZvciBSRkMgMjcxMiBjb21wbGlhbmNlOgogICAgIDEuICBJbXBsZW1lbnRlZCByZWFsIEtlcmJlcm9zV3JhcHBlciwgaW5zdGVhZCBvZiBqdXN0IHVzaW5nCiAgICAgICAgIEtSQjUgQVBfUkVRIG1lc3NhZ2UuICBbVGhhbmtzIHRvIFNpbW9uIFdpbGtpbnNvbiA8c3h3QHN4dy5vcmcudWs+XQogICAgIDIuICBJbXBsZW1lbnRlZCBvcHRpb25hbCBhdXRoZW50aWNhdG9yIGZpZWxkIG9mIEtlcmJlcm9zV3JhcHBlci4KCiAgICAgQWRkZWQgb3BlbnNzbC1zdHlsZSBBU04uMSBtYWNyb3MgZm9yIEtlcmJlcm9zIHRpY2tldCwgYXBfcmVxLAogICAgIGFuZCBhdXRoZW50aWNhdG9yIHN0cnVjdHM7IHNlZSBjcnlwdG8va3JiNS8uCgogICAgIEdlbmVyYWxpemVkIEtlcmJlcm9zIGNhbGxzIHRvIHN1cHBvcnQgbXVsdGlwbGUgS2VyYmVyb3MgbGlicmFyaWVzLgogICAgIFtWZXJuIFN0YWF0cyA8c3RhYXRzdnJAYXNjLmhwYy5taWw+LAogICAgICBKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+CiAgICAgIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIENhdXNlICdvcGVuc3NsIHNwZWVkJyB0byB1c2UgZnVsbHkgaGFyZC1jb2RlZCBEU0Ega2V5cyBhcyBpdAogICAgIGFscmVhZHkgZG9lcyB3aXRoIFJTQS4gdGVzdGRzYS5oIG5vdyBoYXMgJ3ByaXZfa2V5L3B1Yl9rZXknCiAgICAgdmFsdWVzIGZvciBlYWNoIG9mIHRoZSBrZXkgc2l6ZXMgcmF0aGVyIHRoYW4gaGF2aW5nIGp1c3QKICAgICBwYXJhbWV0ZXJzIChhbmQgJ3NwZWVkJyBnZW5lcmF0aW5nIGtleXMgZWFjaCB0aW1lKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBTcGVlZCB1cCBFVlAgcm91dGluZXMuCiAgICAgQmVmb3JlOgplbmNyeXB0CnR5cGUgICAgICAgICAgICAgIDggYnl0ZXMgICAgIDY0IGJ5dGVzICAgIDI1NiBieXRlcyAgIDEwMjQgYnl0ZXMgICA4MTkyIGJ5dGVzCmRlcy1jYmMgICAgICAgICAgIDQ0MDguODVrICAgICA1NTYwLjUxayAgICAgNTc3OC40NmsgICAgIDU4NjIuMjBrICAgICA1ODI1LjE2awpkZXMtY2JjICAgICAgICAgICA0Mzg5LjU1ayAgICAgNTU3MS4xN2sgICAgIDU3OTIuMjNrICAgICA1ODQ2LjkxayAgICAgNTgzMi4xMWsKZGVzLWNiYyAgICAgICAgICAgNDM5NC4zMmsgICAgIDU1NzUuOTJrICAgICA1ODA3LjQ0ayAgICAgNTg0OC4zN2sgICAgIDU4NDEuMzBrCmRlY3J5cHQKZGVzLWNiYyAgICAgICAgICAgMzQ4Mi42NmsgICAgIDUwNjkuNDlrICAgICA1NDk2LjM5ayAgICAgNTYxNC4xNmsgICAgIDU2MzkuMjhrCmRlcy1jYmMgICAgICAgICAgIDM0ODAuNzRrICAgICA1MDY4Ljc2ayAgICAgNTUxMC4zNGsgICAgIDU2MDkuODdrICAgICA1NjM1LjUyawpkZXMtY2JjICAgICAgICAgICAzNDgzLjcyayAgICAgNTA2Ny42MmsgICAgIDU1MDQuNjBrICAgICA1NzA4LjAxayAgICAgNTcyNC44MGsKICAgICBBZnRlcjoKZW5jcnlwdApkZXMtY2JjICAgICAgICAgICA0NjYwLjE2ayAgICAgNTY1MC4xOWsgICAgIDU4MDcuMTlrICAgICA1ODI3LjEzayAgICAgNTc4My4zMmsKZGVjcnlwdApkZXMtY2JjICAgICAgICAgICAzNjI0Ljk2ayAgICAgNTI1OC4yMWsgICAgIDU1MzAuOTFrICAgICA1NjI0LjMwayAgICAgNTYyOC4yNmsKICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkZWQgdGhlIE9TMi1FTVggdGFyZ2V0LgogICAgIFsiQnJpYW4gSGF2YXJkIiA8YnJpYW5oQGtoZWxkYXIuYXBhbmEub3JnLmF1PiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZXdyaXRlIGFwcHMgdG8gdXNlIE5DT05GIHJvdXRpbmVzIGluc3RlYWQgb2YgdGhlIG9sZCBDT05GLiBOZXcgZnVuY3Rpb25zCiAgICAgdG8gc3VwcG9ydCBOQ09ORiByb3V0aW5lcyBpbiBleHRlbnNpb24gY29kZS4gTmV3IGZ1bmN0aW9uIENPTkZfc2V0X25jb25mKCkKICAgICB0byBhbGxvdyBmdW5jdGlvbnMgd2hpY2ggdGFrZSBhbiBOQ09ORiB0byBhbHNvIGhhbmRsZSB0aGUgb2xkIExIQVNICiAgICAgc3RydWN0dXJlOiB0aGlzIG1lYW5zIHRoYXQgdGhlIG9sZCBDT05GIGNvbXBhdGlibGUgcm91dGluZXMgY2FuIGJlCiAgICAgcmV0YWluZWQgKGluIHBhcnRpY3VsYXIgd3J0IGV4dGVuc2lvbnMpIHdpdGhvdXQgaGF2aW5nIHRvIGR1cGxpY2F0ZSB0aGUKICAgICBjb2RlLiBOZXcgZnVuY3Rpb24gWDUwOVYzX2FkZF9leHRfbmNvbmZfc2sgdG8gYWRkIGV4dGVuc2lvbnMgdG8gYSBzdGFjay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIHRoZSBnZW5lcmFsIHVzZXIgaW50ZXJmYWNlIHdpdGggbWVjaGFuaXNtcyBmb3IgaW5uZXIgY29udHJvbAogICAgIGFuZCB3aXRoIHBvc3NpYmlsaXRpZXMgdG8gaGF2ZSB5ZXMvbm8ga2luZCBvZiBwcm9tcHRzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSBhbGwgY2FsbHMgdG8gbG93IGxldmVsIGRpZ2VzdCByb3V0aW5lcyBpbiB0aGUgbGlicmFyeSBhbmQKICAgICBhcHBsaWNhdGlvbnMgdG8gdXNlIEVWUC4gQWRkIG1pc3NpbmcgY2FsbHMgdG8gSE1BQ19jbGVhbnVwKCkgYW5kCiAgICAgZG9uJ3QgYXNzdW1lIEhNQUNfQ1RYIGNhbiBiZSBjb3BpZWQgdXNpbmcgbWVtY3B5KCkuCiAgICAgW1ZlcmRvbiBXYWxrZXIgPFZXYWxrZXJAbm92ZWxsLmNvbT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBjb250cm9sIGVuZ2luZXMgdGhyb3VnaCBjb250cm9sIG5hbWVzIGJ1dCB3aXRoCiAgICAgYXJiaXRyYXJ5IGFyZ3VtZW50cyBpbnN0ZWFkIG9mIGp1c3QgYSBzdHJpbmcuCiAgICAgQ2hhbmdlIHRoZSBrZXkgbG9hZGVycyB0byB0YWtlIGEgVUlfTUVUSE9EIGluc3RlYWQgb2YgYSBjYWxsYmFjawogICAgIGZ1bmN0aW9uIHBvaW50ZXIuICBOT1RFOiB0aGlzIGJyZWFrcyBiaW5hcnkgY29tcGF0aWJpbGl0eSB3aXRoIGVhcmxpZXIKICAgICB2ZXJzaW9ucyBvZiBPcGVuU1NMIFtlbmdpbmVdLgogICAgIEFkYXB0IHRoZSBuQ2lwaGVyIGNvZGUgZm9yIHRoZXNlIG5ldyBjb25kaXRpb25zIGFuZCBhZGQgYSBjYXJkIGluc2VydGlvbgogICAgIGNhbGxiYWNrLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEVuaGFuY2UgdGhlIGdlbmVyYWwgdXNlciBpbnRlcmZhY2Ugd2l0aCBtZWNoYW5pc21zIHRvIGJldHRlciBzdXBwb3J0CiAgICAgZGlhbG9nIGJveCBpbnRlcmZhY2VzLCBhcHBsaWNhdGlvbi1kZWZpbmVkIHByb21wdHMsIHRoZSBwb3NzaWJpbGl0eQogICAgIHRvIHVzZSBkZWZhdWx0cyAoZm9yIGV4YW1wbGUgZGVmYXVsdCBwYXNzd29yZHMgZnJvbSBzb21ld2hlcmUgZWxzZSkKICAgICBhbmQgaW50ZXJydXB0cy9jYW5jZWxsYXRpb25zLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFRpZHkgdXAgUEtDUyMxMiBhdHRyaWJ1dGUgaGFuZGxpbmcuIEFkZCBzdXBwb3J0IGZvciB0aGUgQ1NQIG5hbWUKICAgICBhdHRyaWJ1dGUgaW4gUEtDUyMxMiBmaWxlcywgYWRkIG5ldyAtQ1NQIG9wdGlvbiB0byBwa2NzMTIgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYSBtZW1vcnkgbGVhayBpbiAnc2tfZHVwKCknIGluIHRoZSBjYXNlIHJlYWxsb2NhdGlvbiBmYWlscy4gKEFsc28KICAgICB0aWR5IHVwIHNvbWUgdW5uZWNlc3NhcmlseSB3ZWlyZCBjb2RlIGluICdza19uZXcoKScpLgogICAgIFtHZW9mZiwgcmVwb3J0ZWQgYnkgRGllZ28gVGFydGFyYSA8ZHRhcnRhcmFAbm92YW1lbnMuY29tPl0KCiAgKikgQ2hhbmdlIHRoZSBrZXkgbG9hZGluZyByb3V0aW5lcyBmb3IgRU5HSU5FcyB0byB1c2UgdGhlIHNhbWUga2luZAogICAgIGNhbGxiYWNrIChwZW1fcGFzc3dvcmRfY2IpIGFzIGFsbCBvdGhlciByb3V0aW5lcyB0aGF0IG5lZWQgdGhpcwogICAgIGtpbmQgb2YgY2FsbGJhY2suCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW5jcmVhc2UgRU5UUk9QWV9ORUVERUQgdG8gMzIgYnl0ZXMsIGFzIFJpam5kYWVsIGNhbiBvcGVyYXRlIHdpdGgKICAgICAyNTYgYml0ICg9MzIgYnl0ZSkga2V5cy4gT2YgY291cnNlIHNlZWRpbmcgd2l0aCBtb3JlIGVudHJvcHkgYnl0ZXMKICAgICB0aGFuIHRoaXMgbWluaW11bSB2YWx1ZSBpcyByZWNvbW1lbmRlZC4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgTmV3IHJhbmRvbSBzZWVkZXIgZm9yIE9wZW5WTVMsIHVzaW5nIHRoZSBzeXN0ZW0gcHJvY2VzcyBzdGF0aXN0aWNzCiAgICAgdGhhdCBhcmUgZWFzaWx5IHJlYWNoYWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBXaW5kb3dzIGFwcGFyZW50bHkgY2FuJ3QgdHJhbnNwYXJlbnRseSBoYW5kbGUgZ2xvYmFsCiAgICAgdmFyaWFibGVzIGRlZmluZWQgaW4gRExMcy4gSW5pdGlhbGlzYXRpb25zIHN1Y2ggYXM6CgogICAgICAgIGNvbnN0IEFTTjFfSVRFTSAqaXQgPSAmQVNOMV9JTlRFR0VSX2l0OwoKICAgICB3b250IGNvbXBpbGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgYW55IGFwcGxpY2F0aW9ucyB0aGF0IG5lZWQgdG8KICAgICBkZWNsYXJlIHRoZWlyIG93biBBU04xIG1vZHVsZXMuIFRoaXMgd2FzIGZpeGVkIGJ5IGFkZGluZyB0aGUgb3B0aW9uCiAgICAgRVhQT1JUX1ZBUl9BU19GTiB0byBhbGwgV2luMzIgcGxhdGZvcm1zLCBhbHRob3VnaCB0aGlzIGlzbid0IHN0cmljdGx5CiAgICAgbmVlZGVkIGZvciBzdGF0aWMgbGlicmFyaWVzIHVuZGVyIFdpbjMyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgWDUwOV9QVVJQT1NFX3NldCgpIGFuZCBYNTA5X1RSVVNUX3NldCgpIHRvIGhhbmRsZQogICAgIHNldHRpbmcgb2YgcHVycG9zZSBhbmQgdHJ1c3QgZmllbGRzLiBOZXcgWDUwOV9TVE9SRSB0cnVzdCBhbmQKICAgICBwdXJwb3NlIGZ1bmN0aW9ucyBhbmQgdGlkeSB1cCBzZXR0aW5nIGluIG90aGVyIFNTTCBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGNvcGllcyBvZiBYNTA5X1NUT1JFX0NUWCBmaWVsZHMgYW5kIGNhbGxiYWNrcyB0byBYNTA5X1NUT1JFCiAgICAgc3RydWN0dXJlLiBUaGVzZSBhcmUgaW5oZXJpdGVkIGJ5IFg1MDlfU1RPUkVfQ1RYIHdoZW4gaXQgaXMgCiAgICAgaW5pdGlhbGlzZWQuIFRoaXMgYWxsb3dzIHZhcmlvdXMgZGVmYXVsdHMgdG8gYmUgc2V0IGluIHRoZQogICAgIFg1MDlfU1RPUkUgc3RydWN0dXJlIChzdWNoIGFzIGZsYWdzIGZvciBDUkwgY2hlY2tpbmcgYW5kIGN1c3RvbQogICAgIHB1cnBvc2Ugb3IgdHJ1c3Qgc2V0dGluZ3MpIGZvciBmdW5jdGlvbnMgd2hpY2ggb25seSB1c2UgWDUwOV9TVE9SRV9DVFgKICAgICBpbnRlcm5hbGx5IHN1Y2ggYXMgUy9NSU1FLgoKICAgICBNb2RpZnkgWDUwOV9TVE9SRV9DVFhfcHVycG9zZV9pbmhlcml0KCkgc28gaXQgb25seSBzZXRzIHB1cnBvc2VzIGFuZAogICAgIHRydXN0IHNldHRpbmdzIGlmIHRoZXkgYXJlIG5vdCBzZXQgaW4gWDUwOV9TVE9SRS4gVGhpcyBhbGxvd3MgWDUwOV9TVE9SRQogICAgIHB1cnBvc2VzIGFuZCB0cnVzdCAoaW4gUy9NSU1FIGZvciBleGFtcGxlKSB0byBvdmVycmlkZSBhbnkgc2V0IGJ5IGRlZmF1bHQuCgogICAgIEFkZCBjb21tYW5kIGxpbmUgb3B0aW9ucyBmb3IgQ1JMIGNoZWNraW5nIHRvIHNtaW1lLCBzX2NsaWVudCBhbmQgc19zZXJ2ZXIKICAgICBhcHBsaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBDUkwgYmFzZWQgcmV2b2NhdGlvbiBjaGVja2luZy4gSWYgdGhlIENSTCBjaGVja2luZyBmbGFnKHMpCiAgICAgYXJlIHNldCB0aGVuIHRoZSBDUkwgaXMgbG9va2VkIHVwIGluIHRoZSBYNTA5X1NUT1JFIHN0cnVjdHVyZSBhbmQKICAgICBpdHMgdmFsaWRpdHkgYW5kIHNpZ25hdHVyZSBjaGVja2VkLCB0aGVuIGlmIHRoZSBjZXJ0aWZpY2F0ZSBpcyBmb3VuZAogICAgIGluIHRoZSBDUkwgdGhlIHZlcmlmeSBmYWlscyB3aXRoIGEgcmV2b2tlZCBlcnJvci4KCiAgICAgVmFyaW91cyBuZXcgQ1JMIHJlbGF0ZWQgY2FsbGJhY2tzIGFkZGVkIHRvIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZS4KCiAgICAgQ29tbWFuZCBsaW5lIG9wdGlvbnMgYWRkZWQgdG8gJ3ZlcmlmeScgYXBwbGljYXRpb24gdG8gc3VwcG9ydCB0aGlzLgoKICAgICBUaGlzIG5lZWRzIHNvbWUgYWRkaXRpb25hbCB3b3JrLCBzdWNoIGFzIGJlaW5nIGFibGUgdG8gaGFuZGxlIG11bHRpcGxlCiAgICAgQ1JMcyB3aXRoIGRpZmZlcmVudCB0aW1lcywgZXh0ZW5zaW9uIGJhc2VkIGxvb2t1cCAocmF0aGVyIHRoYW4ganVzdAogICAgIGJ5IHN1YmplY3QgbmFtZSkgYW5kIHVsdGltYXRlbHkgbW9yZSBjb21wbGV0ZSBWMiBDUkwgZXh0ZW5zaW9uCiAgICAgaGFuZGxpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZ2VuZXJhbCB1c2VyIGludGVyZmFjZSBBUEkgKGNyeXB0by91aS8pLiAgVGhpcyBpcyBkZXNpZ25lZAogICAgIHRvIHJlcGxhY2UgdGhpbmdzIGxpa2UgZGVzX3JlYWRfcGFzc3dvcmQgYW5kIGZyaWVuZHMgKGJhY2t3YXJkCiAgICAgY29tcGF0aWJpbGl0eSBmdW5jdGlvbnMgdXNpbmcgdGhpcyBuZXcgQVBJIGFyZSBwcm92aWRlZCkuCiAgICAgVGhlIHB1cnBvc2UgaXMgdG8gcmVtb3ZlIHByb21wdGluZyBmdW5jdGlvbnMgZnJvbSB0aGUgREVTIGNvZGUKICAgICBzZWN0aW9uIGFzIHdlbGwgYXMgcHJvdmlkZSBmb3IgcHJvbXB0aW5nIHRocm91Z2ggZGlhbG9nIGJveGVzIGluCiAgICAgYSB3aW5kb3cgc3lzdGVtIGFuZCB0aGUgbGlrZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgImV4X2RhdGEiIHN1cHBvcnQgdG8gRU5HSU5FIHNvIGltcGxlbWVudGF0aW9ucyBjYW4gYWRkIHN0YXRlIGF0IGEKICAgICBwZXItc3RydWN0dXJlIGxldmVsIHJhdGhlciB0aGFuIGhhdmluZyB0byBzdG9yZSBpdCBnbG9iYWxseS4KICAgICBbR2VvZmZdCgogICopIE1ha2UgaXQgcG9zc2libGUgZm9yIEVOR0lORSBzdHJ1Y3R1cmVzIHRvIGJlIGNvcGllZCB3aGVuIHJldHJpZXZlZCBieQogICAgIEVOR0lORV9ieV9pZCgpIGlmIHRoZSBFTkdJTkUgc3BlY2lmaWVzIGEgbmV3IGZsYWc6IEVOR0lORV9GTEFHU19CWV9JRF9DT1BZLgogICAgIFRoaXMgY2F1c2VzIHRoZSAib3JpZ2luYWwiIEVOR0lORSBzdHJ1Y3R1cmUgdG8gYWN0IGxpa2UgYSB0ZW1wbGF0ZSwKICAgICBhbmFsb2dvdXMgdG8gdGhlIFJTQSB2cy4gUlNBX01FVEhPRCB0eXBlIG9mIHNlcGFyYXRpb24uIEJlY2F1c2Ugb2YgdGhpcwogICAgIG9wZXJhdGlvbmFsIHN0YXRlIGNhbiBiZSBsb2NhbGlzZWQgdG8gZWFjaCBFTkdJTkUgc3RydWN0dXJlLCBkZXNwaXRlIHRoZQogICAgIGZhY3QgdGhleSBhbGwgc2hhcmUgdGhlIHNhbWUgIm1ldGhvZHMiLiBOZXcgRU5HSU5FIHN0cnVjdHVyZXMgcmV0dXJuZWQgaW4KICAgICB0aGlzIGNhc2UgaGF2ZSBubyBmdW5jdGlvbmFsIHJlZmVyZW5jZXMgYW5kIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHNpbmdsZQogICAgIHN0cnVjdHVyYWwgcmVmZXJlbmNlLiBUaGlzIG1hdGNoZXMgdGhlIHNpbmdsZSBzdHJ1Y3R1cmFsIHJlZmVyZW5jZSByZXR1cm5lZAogICAgIGJ5IEVOR0lORV9ieV9pZCgpIG5vcm1hbGx5LCB3aGVuIGl0IGlzIGluY3JlbWVudGVkIG9uIHRoZSBwcmUtZXhpc3RpbmcKICAgICBFTkdJTkUgc3RydWN0dXJlLgogICAgIFtHZW9mZl0KCiAgKikgRml4IEFTTjEgZGVjb2RlciB3aGVuIGRlY29kaW5nIHR5cGUgQU5ZIGFuZCBWX0FTTjFfT1RIRVI6IHNpbmNlIHRoaXMKICAgICBuZWVkcyB0byBtYXRjaCBhbnkgb3RoZXIgdHlwZSBhdCBhbGwgd2UgbmVlZCB0byBtYW51YWxseSBjbGVhciB0aGUKICAgICB0YWcgY2FjaGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlcyB0byB0aGUgIm9wZW5zc2wgZW5naW5lIiB1dGlsaXR5IHRvIGluY2x1ZGU7CiAgICAgLSB2ZXJib3NpdHkgbGV2ZWxzICgnLXYnLCAnLXZ2JywgYW5kICctdnZ2JykgdGhhdCBwcm92aWRlIGluZm9ybWF0aW9uCiAgICAgICBhYm91dCBhbiBFTkdJTkUncyBhdmFpbGFibGUgY29udHJvbCBjb21tYW5kcy4KICAgICAtIGV4ZWN1dGluZyBjb250cm9sIGNvbW1hbmRzIGZyb20gY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB1c2luZyB0aGUKICAgICAgICctcHJlJyBhbmQgJy1wb3N0JyBzd2l0Y2hlcy4gJy1wb3N0JyBpcyBvbmx5IHVzZWQgaWYgJy10JyBpcwogICAgICAgc3BlY2lmaWVkIGFuZCB0aGUgRU5HSU5FIGlzIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXNlZC4gVGhlIHN5bnRheCBmb3IKICAgICAgIHRoZSBpbmRpdmlkdWFsIGNvbW1hbmRzIGFyZSBjb2xvbi1zZXBhcmF0ZWQsIGZvciBleGFtcGxlOwoJIG9wZW5zc2wgZW5naW5lIGNoaWwgLXByZSBGT1JLX0NIRUNLOjAgLXByZSBTT19QQVRIOi9saWIvdGVzdC5zbwogICAgIFtHZW9mZl0KCiAgKikgTmV3IGR5bmFtaWMgY29udHJvbCBjb21tYW5kIHN1cHBvcnQgZm9yIEVOR0lORXMuIEVOR0lORXMgY2FuIG5vdwogICAgIGRlY2xhcmUgdGhlaXIgb3duIGNvbW1hbmRzIChudW1iZXJzKSwgbmFtZXMgKHN0cmluZ3MpLCBkZXNjcmlwdGlvbnMsCiAgICAgYW5kIGlucHV0IHR5cGVzIGZvciBydW4tdGltZSBkaXNjb3ZlcnkgYnkgY2FsbGluZyBhcHBsaWNhdGlvbnMuIEEKICAgICBzdWJzZXQgb2YgdGhlc2UgY29tbWFuZHMgYXJlIGltcGxpY2l0bHkgY2xhc3NlZCBhcyAiZXhlY3V0YWJsZSIKICAgICBkZXBlbmRpbmcgb24gdGhlaXIgaW5wdXQgdHlwZSwgYW5kIG9ubHkgdGhlc2UgY2FuIGJlIGludm9rZWQgdGhyb3VnaAogICAgIHRoZSBuZXcgc3RyaW5nLWJhc2VkIEFQSSBmdW5jdGlvbiBFTkdJTkVfY3RybF9jbWRfc3RyaW5nKCkuIChFZy4gdGhpcwogICAgIGNhbiBiZSBiYXNlZCBvbiB1c2VyIGlucHV0LCBjb25maWcgZmlsZXMsIGV0YykuIFRoZSBkaXN0aW5jdGlvbiBpcwogICAgIHRoYXQgImV4ZWN1dGFibGUiIGNvbW1hbmRzIGNhbm5vdCByZXR1cm4gYW55dGhpbmcgb3RoZXIgdGhhbiBhIGJvb2xlYW4KICAgICByZXN1bHQgYW5kIGNhbiBvbmx5IHN1cHBvcnQgbnVtZXJpYyBvciBzdHJpbmcgaW5wdXQsIHdoZXJlYXMgc29tZQogICAgIGRpc2NvdmVyYWJsZSBjb21tYW5kcyBtYXkgb25seSBiZSBmb3IgZGlyZWN0IHVzZSB0aHJvdWdoCiAgICAgRU5HSU5FX2N0cmwoKSwgZWcuIHN1cHBvcnRpbmcgdGhlIGV4Y2hhbmdlIG9mIGJpbmFyeSBkYXRhLCBmdW5jdGlvbgogICAgIHBvaW50ZXJzLCBvciBvdGhlciBjdXN0b20gdXNlcy4gVGhlICJleGVjdXRhYmxlIiBjb21tYW5kcyBhcmUgdG8KICAgICBzdXBwb3J0IHBhcmFtZXRlcmlzYXRpb25zIG9mIEVOR0lORSBiZWhhdmlvdXIgdGhhdCBjYW4gYmUKICAgICB1bmFtYmlndW91c2x5IGRlZmluZWQgYnkgRU5HSU5FcyBhbmQgdXNlZCBjb25zaXN0ZW50bHkgYWNyb3NzIGFueQogICAgIE9wZW5TU0wtYmFzZWQgYXBwbGljYXRpb24uIENvbW1hbmRzIGhhdmUgYmVlbiBhZGRlZCB0byBhbGwgdGhlCiAgICAgZXhpc3RpbmcgaGFyZHdhcmUtc3VwcG9ydGluZyBFTkdJTkVzLCBub3RpY2VhYmx5ICJTT19QQVRIIiB0byBhbGxvdwogICAgIGNvbnRyb2wgb3ZlciBzaGFyZWQtbGlicmFyeSBwYXRocyB3aXRob3V0IHNvdXJjZSBjb2RlIGFsdGVyYXRpb25zLgogICAgIFtHZW9mZl0KCiAgKikgQ2hhbmdlZCBhbGwgRU5HSU5FIGltcGxlbWVudGF0aW9ucyB0byBkeW5hbWljYWxseSBhbGxvY2F0ZSB0aGVpcgogICAgIEVOR0lORXMgcmF0aGVyIHRoYW4gZGVjbGFyaW5nIHRoZW0gc3RhdGljYWxseS4gQXBhcnQgZnJvbSB0aGlzIGJlaW5nCiAgICAgbmVjZXNzYXJ5IHdpdGggdGhlIHJlbW92YWwgb2YgdGhlIEVOR0lORV9GTEFHU19NQUxMT0NFRCBkaXN0aW5jdGlvbiwKICAgICB0aGlzIGFsc28gYWxsb3dzIHRoZSBpbXBsZW1lbnRhdGlvbnMgdG8gY29tcGlsZSB3aXRob3V0IHVzaW5nIHRoZQogICAgIGludGVybmFsIGVuZ2luZV9pbnQuaCBoZWFkZXIuCiAgICAgW0dlb2ZmXQoKICAqKSBNaW5vciBhZGp1c3RtZW50IHRvICJyYW5kIiBjb2RlLiBSQU5EX2dldF9yYW5kX21ldGhvZCgpIG5vdyByZXR1cm5zIGEKICAgICAnY29uc3QnIHZhbHVlLiBBbnkgY29kZSB0aGF0IHNob3VsZCBiZSBhYmxlIHRvIG1vZGlmeSBhIFJBTkRfTUVUSE9ECiAgICAgc2hvdWxkIGFscmVhZHkgaGF2ZSBub24tY29uc3QgcG9pbnRlcnMgdG8gaXQgKGllLiB0aGV5IHNob3VsZCBvbmx5CiAgICAgbW9kaWZ5IHRoZWlyIG93biBvbmVzKS4KICAgICBbR2VvZmZdCgogICopIE1hZGUgYSB2YXJpZXR5IG9mIGxpdHRsZSB0d2Vha3MgdG8gdGhlIEVOR0lORSBjb2RlLgogICAgIC0gImF0YWxsYSIgYW5kICJ1YnNlYyIgc3RyaW5nIGRlZmluaXRpb25zIHdlcmUgbW92ZWQgZnJvbSBoZWFkZXIgZmlsZXMKICAgICAgIHRvIEMgY29kZS4gIm51cm9uIiBzdHJpbmcgZGVmaW5pdGlvbnMgd2VyZSBwbGFjZWQgaW4gdmFyaWFibGVzCiAgICAgICByYXRoZXIgdGhhbiBoYXJkLWNvZGVkIC0gYWxsb3dpbmcgcGFyYW1ldGVyaXNhdGlvbiBvZiB0aGVzZSB2YWx1ZXMKICAgICAgIGxhdGVyIG9uIHZpYSBjdHJsKCkgY29tbWFuZHMuCiAgICAgLSBSZW1vdmVkIHVudXNlZCAiI2lmIDAiJ2QgY29kZS4KICAgICAtIEZpeGVkIGVuZ2luZSBsaXN0IGl0ZXJhdGlvbiBjb2RlIHNvIGl0IHVzZXMgRU5HSU5FX2ZyZWUoKSB0byByZWxlYXNlCiAgICAgICBzdHJ1Y3R1cmFsIHJlZmVyZW5jZXMuCiAgICAgLSBDb25zdGlmaWVkIHRoZSBSQU5EX01FVEhPRCBlbGVtZW50IG9mIEVOR0lORSBzdHJ1Y3R1cmVzLgogICAgIC0gQ29uc3RpZmllZCB2YXJpb3VzIGdldC9zZXQgZnVuY3Rpb25zIGFzIGFwcHJvcHJpYXRlIGFuZCBhZGRlZAogICAgICAgbWlzc2luZyBmdW5jdGlvbnMgKGluY2x1ZGluZyBhIGNhdGNoLWFsbCBFTkdJTkVfY3B5IHRoYXQgZHVwbGljYXRlcwogICAgICAgYWxsIEVOR0lORSB2YWx1ZXMgb250byBhIG5ldyBFTkdJTkUgZXhjZXB0IHJlZmVyZW5jZSBjb3VudHMvc3RhdGUpLgogICAgIC0gUmVtb3ZlZCBOVUxMIHBhcmFtZXRlciBjaGVja3MgaW4gZ2V0L3NldCBmdW5jdGlvbnMuIFNldHRpbmcgYSBtZXRob2QKICAgICAgIG9yIGZ1bmN0aW9uIHRvIE5VTEwgaXMgYSB3YXkgb2YgY2FuY2VsbGluZyBvdXQgYSBwcmV2aW91c2x5IHNldAogICAgICAgdmFsdWUuICBQYXNzaW5nIGEgTlVMTCBFTkdJTkUgcGFyYW1ldGVyIGlzIGp1c3QgcGxhaW4gc3R1cGlkIGFueXdheQogICAgICAgYW5kIGRvZXNuJ3QganVzdGlmeSB0aGUgZXh0cmEgZXJyb3Igc3ltYm9scyBhbmQgY29kZS4KICAgICAtIERlcHJlY2F0ZSB0aGUgRU5HSU5FX0ZMQUdTX01BTExPQ0VEIGRlZmluZSBhbmQgbW92ZSB0aGUgYXJlYSBmb3IKICAgICAgIGZsYWdzIGZyb20gZW5naW5lX2ludC5oIHRvIGVuZ2luZS5oLgogICAgIC0gQ2hhbmdlZCBwcm90b3R5cGVzIGZvciBFTkdJTkUgaGFuZGxlciBmdW5jdGlvbnMgKGluaXQoKSwgZmluaXNoKCksCiAgICAgICBjdHJsKCksIGtleS1sb2FkIGZ1bmN0aW9ucywgZXRjKSB0byB0YWtlIGFuIChFTkdJTkUqKSBwYXJhbWV0ZXIuCiAgICAgW0dlb2ZmXQoKICAqKSBJbXBsZW1lbnQgYmluYXJ5IGludmVyc2lvbiBhbGdvcml0aG0gZm9yIEJOX21vZF9pbnZlcnNlIGluIGFkZGl0aW9uCiAgICAgdG8gdGhlIGFsZ29yaXRobSB1c2luZyBsb25nIGRpdmlzaW9uLiAgVGhlIGJpbmFyeSBhbGdvcml0aG0gY2FuIGJlCiAgICAgdXNlZCBvbmx5IGlmIHRoZSBtb2R1bHVzIGlzIG9kZC4gIE9uIDMyLWJpdCBzeXN0ZW1zLCBpdCBpcyBmYXN0ZXIKICAgICBvbmx5IGZvciByZWxhdGl2ZWx5IHNtYWxsIG1vZHVsaSAocm91Z2hseSAyMC0zMCUgZm9yIDEyOC1iaXQgbW9kdWxpLAogICAgIHJvdWdobHkgNS0xNSUgZm9yIDI1Ni1iaXQgbW9kdWxpKSwgc28gd2UgdXNlIGl0IG9ubHkgZm9yIG1vZHVsaQogICAgIHVwIHRvIDQ1MCBiaXRzLiAgSW4gNjQtYml0IGVudmlyb25tZW50cywgdGhlIGJpbmFyeSBhbGdvcml0aG0KICAgICBhcHBlYXJzIHRvIGJlIGFkdmFudGFnZW91cyBmb3IgbXVjaCBsb25nZXIgbW9kdWxpOyBoZXJlIHdlIHVzZSBpdAogICAgIGZvciBtb2R1bGkgdXAgdG8gMjA0OCBiaXRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJld3JpdGUgQ0hPSUNFIGZpZWxkIHNldHRpbmcgaW4gQVNOMV9pdGVtX2V4X2QyaSgpLiBUaGUgb2xkIGNvZGUKICAgICBjb3VsZCBub3Qgc3VwcG9ydCB0aGUgY29tYmluZSBmbGFnIGluIGNob2ljZSBmaWVsZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgJ2NvcHlfZXh0ZW5zaW9ucycgb3B0aW9uIHRvIHRoZSAnY2EnIHV0aWxpdHkuIFRoaXMgY29waWVzCiAgICAgZXh0ZW5zaW9ucyBmcm9tIGEgY2VydGlmaWNhdGUgcmVxdWVzdCB0byB0aGUgY2VydGlmaWNhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgbXVsdGlwbGUgJ2NlcnRvcHQnIGFuZCAnbmFtZW9wdCcgb3B0aW9ucyB0byBiZSBzZXBhcmF0ZWQKICAgICBieSBjb21tYXMuIEFkZCAnbmFtb3B0JyBhbmQgJ2NlcnRvcHQnIG9wdGlvbnMgdG8gdGhlICdjYScgY29uZmlnCiAgICAgZmlsZTogdGhpcyBhbGxvd3MgdGhlIGRpc3BsYXkgb2YgdGhlIGNlcnRpZmljYXRlIGFib3V0IHRvIGJlCiAgICAgc2lnbmVkIHRvIGJlIGN1c3RvbWlzZWQsIHRvIGFsbG93IGNlcnRhaW4gZmllbGRzIHRvIGJlIGluY2x1ZGVkCiAgICAgb3IgZXhjbHVkZWQgYW5kIGV4dGVuc2lvbiBkZXRhaWxzLiBUaGUgb2xkIHN5c3RlbSBkaWRuJ3QgZGlzcGxheQogICAgIG11bHRpY2hhcmFjdGVyIHN0cmluZ3MgcHJvcGVybHksIG9taXR0ZWQgZmllbGRzIG5vdCBpbiB0aGUgcG9saWN5CiAgICAgYW5kIGNvdWxkbid0IGRpc3BsYXkgYWRkaXRpb25hbCBkZXRhaWxzIHN1Y2ggYXMgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdW5jdGlvbiBFQ19QT0lOVHNfbXVsIGZvciBtdWx0aXBsZSBzY2FsYXIgbXVsdGlwbGljYXRpb24KICAgICBvZiBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIGVsbGlwdGljIGN1cnZlIHBvaW50cwogICAgICAgICAgXHN1bSBzY2FsYXJzW2ldKnBvaW50c1tpXSwKICAgICBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgZ2VuZXJhdG9yIGRlZmluZWQgZm9yIHRoZSBFQ19HUk9VUDoKICAgICAgICAgIHNjYWxhcipnZW5lcmF0b3IgKyAgXHN1bSBzY2FsYXJzW2ldKnBvaW50c1tpXS4KCiAgICAgRUNfUE9JTlRfbXVsIGlzIGEgc2ltcGxlIHdyYXBwZXIgZnVuY3Rpb24gZm9yIHRoZSB0eXBpY2FsIGNhc2UKICAgICB0aGF0IHRoZSBwb2ludCBsaXN0IGhhcyBqdXN0IG9uZSBpdGVtIChiZXNpZGVzIHRoZSBvcHRpb25hbAogICAgIGdlbmVyYXRvcikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRmlyc3QgRUNfTUVUSE9EcyBmb3IgY3VydmVzIG92ZXIgR0YocCk6CgogICAgIEVDX0dGcF9zaW1wbGVfbWV0aG9kKCkgdXNlcyB0aGUgYmFzaWMgQk5fbW9kX211bCBhbmQgQk5fbW9kX3NxcgogICAgIG9wZXJhdGlvbnMgYW5kIHByb3ZpZGVzIHZhcmlvdXMgbWV0aG9kIGZ1bmN0aW9ucyB0aGF0IGNhbiBhbHNvCiAgICAgb3BlcmF0ZSB3aXRoIGZhc3RlciBpbXBsZW1lbnRhdGlvbnMgb2YgbW9kdWxhciBhcml0aG1ldGljLiAgICAgCgogICAgIEVDX0dGcF9tb250X21ldGhvZCgpIHJldXNlcyBtb3N0IGZ1bmN0aW9ucyB0aGF0IGFyZSBwYXJ0IG9mCiAgICAgRUNfR0ZwX3NpbXBsZV9tZXRob2QsIGJ1dCB1c2VzIE1vbnRnb21lcnkgYXJpdGhtZXRpYy4KCiAgICAgW0JvZG8gTW9lbGxlcjsgcG9pbnQgYWRkaXRpb24gYW5kIHBvaW50IGRvdWJsaW5nCiAgICAgaW1wbGVtZW50YXRpb24gZGlyZWN0bHkgZGVyaXZlZCBmcm9tIHNvdXJjZSBjb2RlIHByb3ZpZGVkIGJ5CiAgICAgTGVua2EgRmliaWtvdmEgPGZpYmlrb3ZhQGV4cC1tYXRoLnVuaS1lc3Nlbi5kZT5dCgogICopIEZyYW1ld29yayBmb3IgZWxsaXB0aWMgY3VydmVzIChjcnlwdG8vZWMvZWMuaCwgY3J5cHRvL2VjL2VjX2xjbC5oLAogICAgIGNyeXB0by9lYy9lY19saWIuYyk6CgogICAgIEN1cnZlcyBhcmUgRUNfR1JPVVAgb2JqZWN0cyAod2l0aCBhbiBvcHRpb25hbCBncm91cCBnZW5lcmF0b3IpCiAgICAgYmFzZWQgb24gRUNfTUVUSE9EcyB0aGF0IGFyZSBidWlsdCBpbnRvIHRoZSBsaWJyYXJ5LgoKICAgICBQb2ludHMgYXJlIEVDX1BPSU5UIG9iamVjdHMgYmFzZWQgb24gRUNfR1JPVVAgb2JqZWN0cy4KCiAgICAgTW9zdCBvZiB0aGUgZnJhbWV3b3JrIHdvdWxkIGJlIGFibGUgdG8gaGFuZGxlIGN1cnZlcyBvdmVyIGFyYml0cmFyeQogICAgIGZpbml0ZSBmaWVsZHMsIGJ1dCBhcyB0aGVyZSBhcmUgbm8gb2J2aW91cyB0eXBlcyBmb3IgZmllbGRzIG90aGVyCiAgICAgdGhhbiBHRihwKSwgc29tZSBmdW5jdGlvbnMgYXJlIGxpbWl0ZWQgdG8gdGhhdCBmb3Igbm93LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCB0aGUgLUhUVFAgb3B0aW9uIHRvIHNfc2VydmVyLiAgSXQgaXMgc2ltaWxhciB0byAtV1dXLCBidXQgcmVxdWlyZXMKICAgICB0aGF0IHRoZSBmaWxlIGNvbnRhaW5zIGEgY29tcGxldGUgSFRUUCByZXNwb25zZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGVjIGRpcmVjdG9yeSB0byBta2RlZi5wbCBhbmQgbWtmaWxlcy5wbC4gSW4gbWtkZWYucGwKICAgICBjaGFuZ2UgdGhlIGRlZiBhbmQgbnVtIGZpbGUgcHJpbnRmIGZvcm1hdCBzcGVjaWZpZXIgZnJvbSAiJS00MHNYWFgiCiAgICAgdG8gIiUtMzlzIFhYWCIuIFRoZSBsYXR0ZXIgd2lsbCBhbHdheXMgZ3VhcmFudGVlIGEgc3BhY2UgYWZ0ZXIgdGhlCiAgICAgZmllbGQgd2hpbGUgdGhlIGZvcm1lciB3aWxsIGNhdXNlIHRoZW0gdG8gcnVuIHRvZ2V0aGVyIGlmIHRoZSBmaWVsZAogICAgIGlzIDQwIG9mIG1vcmUgY2hhcmFjdGVycyBsb25nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnN0aWZ5IHRoZSBjaXBoZXIgYW5kIGRpZ2VzdCAnbWV0aG9kJyBmdW5jdGlvbnMgYW5kIHN0cnVjdHVyZXMKICAgICBhbmQgbW9kaWZ5IHJlbGF0ZWQgZnVuY3Rpb25zIHRvIHRha2UgY29uc3RhbnQgRVZQX01EIGFuZCBFVlBfQ0lQSEVSCiAgICAgcG9pbnRlcnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSGlkZSBCTl9DVFggc3RydWN0dXJlIGRldGFpbHMgaW4gYm5fbGNsLmggaW5zdGVhZCBvZiBwdWJsaXNoaW5nIHRoZW0KICAgICBpbiA8b3BlbnNzbC9ibi5oPi4gIEFsc28gZnVydGhlciBpbmNyZWFzZSBCTl9DVFhfTlVNIHRvIDMyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vZGlmeSBFVlBfRGlnZXN0KigpIHJvdXRpbmVzIHNvIHRoZXkgbm93IHJldHVybiB2YWx1ZXMuIEFsdGhvdWdoIHRoZQogICAgIGludGVybmFsIHNvZnR3YXJlIHJvdXRpbmVzIGNhbiBuZXZlciBmYWlsIGFkZGl0aW9uYWwgaGFyZHdhcmUgdmVyc2lvbnMKICAgICBtaWdodC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbiB1cCBjcnlwdG8vZXJyL2Vyci5oIGFuZCBjaGFuZ2Ugc29tZSBlcnJvciBjb2RlcyB0byBhdm9pZCBjb25mbGljdHM6CgogICAgIFByZXZpb3VzbHkgRVJSX1JfRkFUQUwgd2FzIHRvbyBzbWFsbCBhbmQgY29pbmNpZGVkIHdpdGggRVJSX0xJQl9QS0NTNwogICAgICg9IEVSUl9SX1BLQ1M3X0xJQik7IGl0IGlzIG5vdyA2NCBpbnN0ZWFkIG9mIDMyLgoKICAgICBBU04xIGVycm9yIGNvZGVzCiAgICAgICAgICBFUlJfUl9ORVNURURfQVNOMV9FUlJPUgogICAgICAgICAgLi4uCiAgICAgICAgICBFUlJfUl9NSVNTSU5HX0FTTjFfRU9TCiAgICAgd2VyZSA0IC4uIDksIGNvbmZsaWN0aW5nIHdpdGgKICAgICAgICAgIEVSUl9MSUJfUlNBICg9IEVSUl9SX1JTQV9MSUIpCiAgICAgICAgICAuLi4KICAgICAgICAgIEVSUl9MSUJfUEVNICg9IEVSUl9SX1BFTV9MSUIpLgogICAgIFRoZXkgYXJlIG5vdyA1OCAuLiA2MyAoaS5lLiwganVzdCBiZWxvdyBFUlJfUl9GQVRBTCkuCgogICAgIEFkZCBuZXcgZXJyb3IgY29kZSAnRVJSX1JfSU5URVJOQUxfRVJST1InLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERvbid0IG92ZXJ1c2UgbG9ja3MgaW4gY3J5cHRvL2Vyci9lcnIuYzogRm9yIGRhdGEgcmV0cmlldmFsLCBDUllQVE9fcl9sb2NrCiAgICAgc3VmZmljZXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IG9wdGlvbiAnLXN1YmogYXJnJyBmb3IgJ29wZW5zc2wgcmVxJyBhbmQgJ29wZW5zc2wgY2EnLiAgVGhpcwogICAgIHNldHMgdGhlIHN1YmplY3QgbmFtZSBmb3IgYSBuZXcgcmVxdWVzdCBvciBzdXBlcnNlZGVzIHRoZQogICAgIHN1YmplY3QgbmFtZSBpbiBhIGdpdmVuIHJlcXVlc3QuIEZvcm1hdHMgdGhhdCBjYW4gYmUgcGFyc2VkIGFyZQogICAgICAgICAgJ0NOPVNvbWUgTmFtZSwgT1U9bXlPVSwgQz1JVCcKICAgICBhbmQKICAgICAgICAgICdDTj1Tb21lIE5hbWUvT1U9bXlPVS9DPUlUJy4KCiAgICAgQWRkIG9wdGlvbnMgJy1iYXRjaCcgYW5kICctdmVyYm9zZScgdG8gJ29wZW5zc2wgcmVxJy4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAaGFja21hc3RlcnMubmV0Pl0KCiAgKikgSW50cm9kdWNlIHRoZSBwb3NzaWJpbGl0eSB0byBhY2Nlc3MgZ2xvYmFsIHZhcmlhYmxlcyB0aHJvdWdoCiAgICAgZnVuY3Rpb25zIG9uIHBsYXRmb3JtIHdlcmUgdGhhdCdzIHRoZSBiZXN0IHdheSB0byBoYW5kbGUgZXhwb3J0aW5nCiAgICAgZ2xvYmFsIHZhcmlhYmxlcyBpbiBzaGFyZWQgbGlicmFyaWVzLiAgVG8gZW5hYmxlIHRoaXMgZnVuY3Rpb25hbGl0eSwKICAgICBvbmUgbXVzdCBjb25maWd1cmUgd2l0aCAiRVhQT1JUX1ZBUl9BU19GTiIgb3IgZGVmaW5lZCB0aGUgQyBtYWNybwogICAgICJPUEVOU1NMX0VYUE9SVF9WQVJfQVNfRlVOQ1RJT04iIGluIGNyeXB0by9vcGVuc3NsY29uZi5oICh0aGUgbGF0dGVyCiAgICAgaXMgbm9ybWFsbHkgZG9uZSBieSBDb25maWd1cmUgb3Igc29tZXRoaW5nIHNpbWlsYXIpLgoKICAgICBUbyBpbXBsZW1lbnQgYSBnbG9iYWwgdmFyaWFibGUsIHVzZSB0aGUgbWFjcm8gT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMCiAgICAgaW4gdGhlIHNvdXJjZSBmaWxlIChmb28uYykgbGlrZSB0aGlzOgoKCU9QRU5TU0xfSU1QTEVNRU5UX0dMT0JBTChpbnQsZm9vKT0xOwoJT1BFTlNTTF9JTVBMRU1FTlRfR0xPQkFMKGRvdWJsZSxiYXIpOwoKICAgICBUbyBkZWNsYXJlIGEgZ2xvYmFsIHZhcmlhYmxlLCB1c2UgdGhlIG1hY3JvcyBPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMCiAgICAgYW5kIE9QRU5TU0xfR0xPQkFMX1JFRiBpbiB0aGUgaGVhZGVyIGZpbGUgKGZvby5oKSBsaWtlIHRoaXM6CgoJT1BFTlNTTF9ERUNMQVJFX0dMT0JBTChpbnQsZm9vKTsKCSNkZWZpbmUgZm9vIE9QRU5TU0xfR0xPQkFMX1JFRihmb28pCglPUEVOU1NMX0RFQ0xBUkVfR0xPQkFMKGRvdWJsZSxiYXIpOwoJI2RlZmluZSBiYXIgT1BFTlNTTF9HTE9CQUxfUkVGKGJhcikKCiAgICAgVGhlICNkZWZpbmVzIGFyZSB2ZXJ5IGltcG9ydGFudCwgYW5kIHRoZXJlZm9yZSBzbyBpcyBpbmNsdWRpbmcgdGhlCiAgICAgaGVhZGVyIGZpbGUgZXZlcnl3aGVyZSB3aGVyZSB0aGUgZGVmaW5lZCBnbG9iYWxzIGFyZSB1c2VkLgoKICAgICBUaGUgbWFjcm8gT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OIGFsc28gYWZmZWN0cyB0aGUgZGVmaW5pdGlvbgogICAgIG9mIEFTTi4xIGl0ZW1zLCBidXQgdGhhdCBzdHJ1Y3R1cmUgaXMgYSBiaXQgZGlmZmVyZW50LgoKICAgICBUaGUgbGFyZ2VzdCBjaGFuZ2UgaXMgaW4gdXRpbC9ta2RlZi5wbCB3aGljaCBoYXMgYmVlbiBlbmhhbmNlZCB3aXRoCiAgICAgYmV0dGVyIGFuZCBlYXNpZXIgdG8gdW5kZXJzdGFuZCBsb2dpYyB0byBjaG9vc2Ugd2hpY2ggc3ltYm9scyBzaG91bGQKICAgICBnbyBpbnRvIHRoZSBXaW5kb3dzIC5kZWYgZmlsZXMgYXMgd2VsbCBhcyBhIG51bWJlciBvZiBmaXhlcyBhbmQgY29kZQogICAgIGNsZWFudXAgKGFtb25nIG90aGVycywgYWxnb3JpdGhtIGtleXdvcmRzIGFyZSBub3cgc29ydGVkCiAgICAgbGV4aWNvZ3JhcGhpY2FsbHkgdG8gYXZvaWQgY29uc3RhbnQgcmV3cml0ZXMpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIEJOX2RpdigpIGtlZXAgYSBjb3B5IG9mIHRoZSBzaWduIG9mICdudW0nIGJlZm9yZSB3cml0aW5nIHRoZQogICAgIHJlc3VsdCB0byAncm0nIGJlY2F1c2UgaWYgcm09PW51bSB0aGUgdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbgogICAgIGFuZCBwcm9kdWNlIHRoZSB3cm9uZyByZXN1bHQgaWYgJ251bScgaXMgbmVnYXRpdmU6IHRoaXMgY2F1c2VkCiAgICAgcHJvYmxlbXMgd2l0aCBCTl9tb2QoKSBhbmQgQk5fbm5tb2QoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdW5jdGlvbiBPQ1NQX3JlcXVlc3RfdmVyaWZ5KCkuIFRoaXMgY2hlY2tzIHRoZSBzaWduYXR1cmUgb24gYW4KICAgICBPQ1NQIHJlcXVlc3QgYW5kIHZlcmlmaWVzIHRoZSBzaWduZXIgY2VydGlmaWNhdGUuIFRoZSBzaWduZXIKICAgICBjZXJ0aWZpY2F0ZSBpcyBqdXN0IGNoZWNrZWQgZm9yIGEgZ2VuZXJpYyBwdXJwb3NlIGFuZCBPQ1NQIHJlcXVlc3QKICAgICB0cnVzdCBzZXR0aW5ncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgT0NTUF9jaGVja192YWxpZGl0eSgpIGZ1bmN0aW9uIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBvZiBPQ1NQCiAgICAgcmVzcG9uc2VzLiBPQ1NQIHJlc3BvbnNlcyBhcmUgcHJlcGFyZWQgaW4gcmVhbCB0aW1lIGFuZCBtYXkgb25seQogICAgIGJlIGEgZmV3IHNlY29uZHMgb2xkLiBTaW1wbHkgY2hlY2tpbmcgdGhhdCB0aGUgY3VycmVudCB0aW1lIGxpZXMKICAgICBiZXR3ZWVuIHRoaXNVcGRhdGUgYW5kIG5leHRVcGRhdGUgbWF4IHJlamVjdCBvdGhlcndpc2UgdmFsaWQgcmVzcG9uc2VzCiAgICAgY2F1c2VkIGJ5IGVpdGhlciBPQ1NQIHJlc3BvbmRlciBvciBjbGllbnQgY2xvY2sgaW5hY2N1cmFjeS4gSW5zdGVhZAogICAgIHdlIGFsbG93IHRoaXNVcGRhdGUgYW5kIG5leHRVcGRhdGUgdG8gZmFsbCB3aXRoaW4gYSBjZXJ0YWluIHBlcmlvZCBvZgogICAgIHRoZSBjdXJyZW50IHRpbWUuIFRoZSBhZ2Ugb2YgdGhlIHJlc3BvbnNlIGNhbiBhbHNvIG9wdGlvbmFsbHkgYmUKICAgICBjaGVja2VkLiBUd28gbmV3IG9wdGlvbnMgLXZhbGlkaXR5X3BlcmlvZCBhbmQgLXN0YXR1c19hZ2UgYWRkZWQgdG8KICAgICBvY3NwIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSWYgc2lnbmF0dXJlIG9yIHB1YmxpYyBrZXkgYWxnb3JpdGhtIGlzIHVucmVjb2duaXplZCBwcmludCBvdXQgaXRzCiAgICAgT0lEIHJhdGhlciB0aGF0IGp1c3QgVU5LTk9XTi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgT0NTUF9jZXJ0X3RvX2lkKCkgdG8gdG9sZXJhdGUgYSBOVUxMIHN1YmplY3QgY2VydGlmaWNhdGUgYW5kCiAgICAgT0NTUF9jZXJ0X2lkX25ldygpIGEgTlVMTCBzZXJpYWxOdW1iZXIuIFRoaXMgYWxsb3dzIGEgcGFydGlhbCBjZXJ0aWZpY2F0ZQogICAgIElEIHRvIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBpc3N1ZXIgY2VydGlmaWNhdGUgYWxvbmUgd2hpY2ggY2FuIHRoZW4gYmUKICAgICBwYXNzZWQgdG8gT0NTUF9pZF9pc3N1ZXJfY21wKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGNvbXBpbGF0aW9uIG9wdGlvbiBBU04xX0lURU1fRlVOQ1RJT05TLiBUaGlzIGNhdXNlcyB0aGUgbmV3CiAgICAgQVNOMSBtb2R1bGVzIHRvIGV4cG9ydCBmdW5jdGlvbnMgcmV0dXJuaW5nIEFTTjFfSVRFTSBwb2ludGVycwogICAgIGluc3RlYWQgb2YgdGhlIEFTTjFfSVRFTSBzdHJ1Y3R1cmVzIHRoZW1zZWx2ZXMuIFRoaXMgYWRkcyBzZXZlcmFsCiAgICAgbmV3IG1hY3JvcyB3aGljaCBhbGxvdyB0aGUgdW5kZXJseWluZyBBU04xIGZ1bmN0aW9uL3N0cnVjdHVyZSB0bwogICAgIGJlIGFjY2Vzc2VkIHRyYW5zcGFyZW50bHkuIEFzIGEgcmVzdWx0IGNvZGUgc2hvdWxkIG5vdCB1c2UgQVNOMV9JVEVNCiAgICAgcmVmZXJlbmNlcyBkaXJlY3RseSAoc3VjaCBhcyAmWDUwOV9pdCkgYnV0IGluc3RlYWQgdXNlIHRoZSByZWxldmFudAogICAgIG1hY3JvcyAoc3VjaCBhcyBBU04xX0lURU1fcnB0cihYNTA5KSkuIFRoaXMgb3B0aW9uIGlzIHRvIGFsbG93CiAgICAgdXNlIG9mIHRoZSBuZXcgQVNOMSBjb2RlIG9uIHBsYXRmb3JtcyB3aGVyZSBleHBvcnRpbmcgc3RydWN0dXJlcwogICAgIGlzIHByb2JsZW1hdGljYWwgKGZvciBleGFtcGxlIGluIHNoYXJlZCBsaWJyYXJpZXMpIGJ1dCBleHBvcnRpbmcKICAgICBmdW5jdGlvbnMgcmV0dXJuaW5nIHBvaW50ZXJzIHRvIHN0cnVjdHVyZXMgaXMgbm90LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciBvdmVycmlkaW5nIHRoZSBnZW5lcmF0aW9uIG9mIFNTTC9UTFMgc2Vzc2lvbiBJRHMuCiAgICAgVGhlc2UgY2FsbGJhY2tzIGNhbiBiZSByZWdpc3RlcmVkIGVpdGhlciBpbiBhbiBTU0xfQ1RYIG9yIHBlciBTU0wuCiAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBpcyB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gY29udHJvbCwgaWYgdGhleSB3aXNoLAogICAgIHRoZSBhcmJpdHJhcnkgdmFsdWVzIGNob3NlbiBmb3IgdXNlIGFzIHNlc3Npb24gSURzLCBwYXJ0aWN1bGFybHkgYXMgaXQKICAgICBjYW4gYmUgdXNlZnVsIGZvciBzZXNzaW9uIGNhY2hpbmcgaW4gbXVsdGlwbGUtc2VydmVyIGVudmlyb25tZW50cy4gQQogICAgIGNvbW1hbmQtbGluZSBzd2l0Y2ggZm9yIHRlc3RpbmcgdGhpcyAoYW5kIGFueSBjbGllbnQgY29kZSB0aGF0IHdpc2hlcwogICAgIHRvIHVzZSBzdWNoIGEgZmVhdHVyZSkgaGFzIGJlZW4gYWRkZWQgdG8gInNfc2VydmVyIi4KICAgICBbR2VvZmYgVGhvcnBlLCBMdXR6IEphZW5pY2tlXQoKICAqKSBNb2RpZnkgbWtkZWYucGwgdG8gcmVjb2duaXNlIGFuZCBwYXJzZSBwcmVwcm9jZXNzb3IgY29uZGl0aW9uYWxzCiAgICAgb2YgdGhlIGZvcm0gJyNpZiBkZWZpbmVkKC4uLikgfHwgZGVmaW5lZCguLi4pIHx8IC4uLicgYW5kCiAgICAgJyNpZiAhZGVmaW5lZCguLi4pICYmICFkZWZpbmVkKC4uLikgJiYgLi4uJy4gIFRoaXMgYWxzbyBhdm9pZHMKICAgICB0aGUgZ3Jvd2luZyBudW1iZXIgb2Ygc3BlY2lhbCBjYXNlcyBpdCB3YXMgcHJldmlvdXNseSBoYW5kbGluZy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGFsbCBjb25maWd1cmF0aW9uIG1hY3JvcyBhdmFpbGFibGUgZm9yIGFwcGxpY2F0aW9uIGJ5IG1ha2luZwogICAgIHN1cmUgdGhleSBhcmUgYXZhaWxhYmxlIGluIG9wZW5zc2xjb25mLmgsIGJ5IGdpdmluZyB0aGVtIG5hbWVzIHN0YXJ0aW5nCiAgICAgd2l0aCAiT1BFTlNTTF8iIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIG90aGVyIHBhY2thZ2VzIGFuZCBieSBtYWtpbmcKICAgICBzdXJlIGVfb3MyLmggd2lsbCBjb3ZlciBhbGwgcGxhdGZvcm0tc3BlY2lmaWMgY2FzZXMgdG9nZXRoZXIgd2l0aAogICAgIG9wZW5zc2xjb25mLmguCiAgICAgQWRkaXRpb25hbGx5LCBpdCBpcyBub3cgcG9zc2libGUgdG8gZGVmaW5lIGNvbmZpZ3VyYXRpb24vcGxhdGZvcm0tCiAgICAgc3BlY2lmaWMgbmFtZXMgKGNhbGxlZCAic3lzdGVtIGlkZW50aXRpZXMiKS4gIEluIHRoZSBDIGNvZGUsIHRoZXNlCiAgICAgYXJlIHByZWZpeGVkIHdpdGggIk9QRU5TU0xfU1lTTkFNRV8iLiAgZV9vczIuaCB3aWxsIGNyZWF0ZSBhbm90aGVyCiAgICAgbWFjcm8gd2l0aCB0aGUgbmFtZSBiZWdpbm5pbmcgd2l0aCAiT1BFTlNTTF9TWVNfIiwgd2hpY2ggaXMgZGV0ZXJtaW5lZAogICAgIGZyb20gIk9QRU5TU0xfU1lTTkFNRV8qIiBvciBjb21waWxlci1zcGVjaWZpYyBtYWNyb3MgZGVwZW5kaW5nIG9uCiAgICAgd2hhdCBpcyBhdmFpbGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IG9wdGlvbiAtc2V0X3NlcmlhbCB0byAncmVxJyBhbmQgJ3g1MDknIHRoaXMgYWxsb3dzIHRoZSBzZXJpYWwKICAgICBudW1iZXIgdG8gdXNlIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiBQcmV2aW91c2x5IHNlbGYKICAgICBzaWduZWQgY2VydGlmaWNhdGVzIHdlcmUgaGFyZCBjb2RlZCB3aXRoIHNlcmlhbCBudW1iZXIgMCBhbmQgdGhlIAogICAgIENBIG9wdGlvbnMgb2YgJ3g1MDknIGhhZCB0byB1c2UgYSBzZXJpYWwgbnVtYmVyIGluIGEgZmlsZSB3aGljaCB3YXMKICAgICBhdXRvIGluY3JlbWVudGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBvcHRpb25zIHRvICdjYScgdXRpbGl0eSB0byBzdXBwb3J0IFYyIENSTCBlbnRyeSBleHRlbnNpb25zLgogICAgIEN1cnJlbnRseSBDUkwgcmVhc29uLCBpbnZhbGlkaXR5IGRhdGUgYW5kIGhvbGQgaW5zdHJ1Y3Rpb24gYXJlCiAgICAgc3VwcG9ydGVkLiBBZGQgbmV3IENSTCBleHRlbnNpb25zIHRvIFYzIGNvZGUgYW5kIHNvbWUgbmV3IG9iamVjdHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEVWUF9DSVBIRVJfQ1RYX3NldF9wYWRkaW5nKCkgdGhpcyBpcyB1c2VkIHRvCiAgICAgZGlzYWJsZSBzdGFuZGFyZCBibG9jayBwYWRkaW5nIChha2EgUEtDUyM1IHBhZGRpbmcpIGluIHRoZSBFVlAKICAgICBBUEksIHdoaWNoIHdhcyBwcmV2aW91c2x5IG1hbmRhdG9yeS4gVGhpcyBtZWFucyB0aGF0IHRoZSBkYXRhIGlzCiAgICAgbm90IHBhZGRlZCBpbiBhbnkgd2F5IGFuZCBzbyB0aGUgdG90YWwgbGVuZ3RoIG11Y2ggYmUgYSBtdWx0aXBsZQogICAgIG9mIHRoZSBibG9jayBzaXplLCBvdGhlcndpc2UgYW4gZXJyb3Igb2NjdXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgKGluY29tcGxldGUpIE9DU1AgU1NMIHN1cHBvcnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9DU1BfcGFyc2VfdXJsKCkuIFRoaXMgc3BsaXRzIHVwIGEgVVJMIGludG8gaXRzIGhvc3QsCiAgICAgcG9ydCBhbmQgcGF0aCBjb21wb25lbnRzOiBwcmltYXJpbHkgdG8gcGFyc2UgT0NTUCBVUkxzLiBOZXcgLXVybAogICAgIG9wdGlvbiB0byBvY3NwIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG5vbmNlIGJlaGF2aW9yLiBUaGUgcmV0dXJuIHZhbHVlIG9mIE9DU1BfY2hlY2tfbm9uY2UoKSBub3cgCiAgICAgcmVmbGVjdHMgdGhlIHZhcmlvdXMgY2hlY2tzIHBlcmZvcm1lZC4gQXBwbGljYXRpb25zIGNhbiBkZWNpZGUKICAgICB3aGV0aGVyIHRvIHRvbGVyYXRlIGNlcnRhaW4gc2l0dWF0aW9ucyBzdWNoIGFzIGFuIGFic2VudCBub25jZQogICAgIGluIGEgcmVzcG9uc2Ugd2hlbiBvbmUgd2FzIHByZXNlbnQgaW4gYSByZXF1ZXN0OiB0aGUgb2NzcCBhcHBsaWNhdGlvbgogICAgIGp1c3QgcHJpbnRzIG91dCBhIHdhcm5pbmcuIE5ldyBmdW5jdGlvbiBPQ1NQX2FkZDFfYmFzaWNfbm9uY2UoKQogICAgIHRoaXMgaXMgdG8gYWxsb3cgcmVzcG9uZGVycyB0byBpbmNsdWRlIGEgbm9uY2UgaW4gYSByZXNwb25zZSBldmVuIGlmCiAgICAgdGhlIHJlcXVlc3QgaXMgbm9uY2UtbGVzcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEaXNhYmxlIHN0ZGluIGJ1ZmZlcmluZyBpbiBsb2FkX2NlcnQgKGFwcHMvYXBwcy5jKSBzbyB0aGF0IG5vIGNlcnRzIGFyZQogICAgIHNraXBwZWQgd2hlbiB1c2luZyBvcGVuc3NsIHg1MDkgbXVsdGlwbGUgdGltZXMgb24gYSBzaW5nbGUgaW5wdXQgZmlsZSwKICAgICBlLmcuICIob3BlbnNzbCB4NTA5IC1vdXQgY2VydDE7IG9wZW5zc2wgeDUwOSAtb3V0IGNlcnQyKSA8Y2VydHMiLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1ha2UgQVNOMV9VVENUSU1FX3NldF9zdHJpbmcoKSBhbmQgQVNOMV9HRU5FUkFMSVpFRFRJTUVfc2V0X3N0cmluZygpCiAgICAgc2V0IHN0cmluZyB0eXBlOiB0byBoYW5kbGUgc2V0dGluZyBBU04xX1RJTUUgc3RydWN0dXJlcy4gRml4IGNhCiAgICAgdXRpbGl0eSB0byBjb3JyZWN0bHkgaW5pdGlhbGl6ZSByZXZvY2F0aW9uIGRhdGUgb2YgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9uIFNTTF9PUF9DSVBIRVJfU0VSVkVSX1BSRUZFUkVOQ0UgYWxsb3dzIHRoZSBzZXJ2ZXIgdG8gb3ZlcnJpZGUKICAgICB0aGUgY2xpZW50cyBwcmVmZXJyZWQgY2lwaGVyc3VpdGVzIGFuZCByYXRoZXIgdXNlIGl0cyBvd24gcHJlZmVyZW5jZXMuCiAgICAgU2hvdWxkIGhlbHAgdG8gd29yayBhcm91bmQgTSQgU0dDIChTZXJ2ZXIgR2F0ZWQgQ3J5cHRvZ3JhcGh5KSBidWcgaW4KICAgICBJbnRlcm5ldCBFeHBsb3JlciBieSBlbnN1cmluZyB1bmNoYW5nZWQgaGFzaCBtZXRob2QgZHVyaW5nIHN0ZXB1cC4KICAgICAoQWxzbyByZXBsYWNlcyB0aGUgYnJva2VuL2RlYWN0aXZhdGVkIFNTTF9PUF9OT05fRVhQT1JUX0ZJUlNUIG9wdGlvbi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIE1ha2UgbWtkZWYucGwgcmVjb2duaXNlIGFsbCBERUNMQVJFX0FTTjEgbWFjcm9zLCBjaGFuZ2UgcmlqbmRhZWwKICAgICB0byBhZXMgYW5kIGFkZCBhIG5ldyAnZXhpc3QnIG9wdGlvbiB0byBwcmludCBvdXQgc3ltYm9scyB0aGF0IGRvbid0CiAgICAgYXBwZWFyIHRvIGV4aXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGl0aW9uYWwgb3B0aW9ucyB0byBvY3NwIHV0aWxpdHkgdG8gYWxsb3cgZmxhZ3MgdG8gYmUgc2V0IGFuZAogICAgIGFkZGl0aW9uYWwgY2VydGlmaWNhdGVzIHN1cHBsaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgb3B0aW9uIC1WQWZpbGUgdG8gJ29wZW5zc2wgb2NzcCcsIHNvIHRoZSB1c2VyIGNhbiBnaXZlIHRoZQogICAgIE9DU1AgY2xpZW50IGEgbnVtYmVyIG9mIGNlcnRpZmljYXRlIHRvIG9ubHkgdmVyaWZ5IHRoZSByZXNwb25zZQogICAgIHNpZ25hdHVyZSBhZ2FpbnN0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFVwZGF0ZSBSaWpuZGFlbCBjb2RlIHRvIHZlcnNpb24gMy4wIGFuZCBjaGFuZ2UgRVZQIEFFUyBjaXBoZXJzIHRvCiAgICAgaGFuZGxlIHRoZSBuZXcgQVBJLiBDdXJyZW50bHkgb25seSBFQ0IsIENCQyBtb2RlcyBzdXBwb3J0ZWQuIEFkZCBuZXcKICAgICBBRVMgT0lEcy4KCiAgICAgQWRkIFRMUyBBRVMgY2lwaGVyc3VpdGVzIGFzIGRlc2NyaWJlZCBpbiBSRkMzMjY4LCAiQWR2YW5jZWQKICAgICBFbmNyeXB0aW9uIFN0YW5kYXJkIChBRVMpIENpcGhlcnN1aXRlcyBmb3IgVHJhbnNwb3J0IExheWVyCiAgICAgU2VjdXJpdHkgKFRMUykiLiAgKEluIGJldGEgdmVyc2lvbnMgb2YgT3BlblNTTCAwLjkuNywgdGhlc2Ugd2VyZQogICAgIG5vdCBlbmFibGVkIGJ5IGRlZmF1bHQgYW5kIHdlcmUgbm90IHBhcnQgb2YgdGhlICJBTEwiIGNpcGhlcnN1aXRlCiAgICAgYWxpYXMgYmVjYXVzZSB0aGV5IHdlcmUgbm90IHlldCBvZmZpY2lhbDsgdGhleSBjb3VsZCBiZQogICAgIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHNwZWNpZnlpbmcgdGhlICJBRVNkcmFmdCIgY2lwaGVyc3VpdGUKICAgICBncm91cCBhbGlhcy4gIEluIHRoZSBmaW5hbCByZWxlYXNlIG9mIE9wZW5TU0wgMC45LjcsIHRoZSBncm91cAogICAgIGFsaWFzIGlzIGNhbGxlZCAiQUVTIiBhbmQgaXMgcGFydCBvZiAiQUxMIi4pCiAgICAgW0JlbiBMYXVyaWUsIFN0ZXZlICBIZW5zb24sIEJvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9DU1BfY29weV9ub25jZSgpIHRvIGNvcHkgbm9uY2UgdmFsdWUgKGlmIHByZXNlbnQpIGZyb20KICAgICByZXF1ZXN0IHRvIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1bmN0aW9ucyBmb3IgT0NTUCByZXNwb25kZXJzLiBPQ1NQX3JlcXVlc3Rfb25lcmVxX2NvdW50KCksCiAgICAgT0NTUF9yZXF1ZXN0X29uZXJlcV9nZXQwKCksIE9DU1Bfb25lcmVxX2dldDBfaWQoKSBhbmQgT0NTUF9pZF9nZXQwX2luZm8oKQogICAgIGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBhIGNlcnRpZmljYXRlIHJlcXVlc3QuIE9DU1BfcmVzcG9uc2VfY3JlYXRlKCkKICAgICBjcmVhdGVzIGEgcmVzcG9uc2UgYW5kIG9wdGlvbmFsbHkgYWRkcyBhIGJhc2ljIHJlc3BvbnNlIHN0cnVjdHVyZS4KICAgICBPQ1NQX2Jhc2ljX2FkZDFfc3RhdHVzKCkgYWRkcyBhIGNvbXBsZXRlIHNpbmdsZSByZXNwb25zZSB0byBhIGJhc2ljCiAgICAgcmVzcG9uc2UgYW5kIHJldHVybnMgdGhlIE9DU1BfU0lOR0xFUkVTUCBzdHJ1Y3R1cmUganVzdCBhZGRlZCAodG8gYWxsb3cKICAgICBleHRlbnNpb25zIHRvIGJlIGluY2x1ZGVkIGZvciBleGFtcGxlKS4gT0NTUF9iYXNpY19hZGQxX2NlcnQoKSBhZGRzIGEKICAgICBjZXJ0aWZpY2F0ZSB0byBhIGJhc2ljIHJlc3BvbnNlIGFuZCBPQ1NQX2Jhc2ljX3NpZ24oKSBzaWducyBhIGJhc2ljCiAgICAgcmVzcG9uc2Ugd2l0aCB2YXJpb3VzIGZsYWdzLiBOZXcgaGVscGVyIGZ1bmN0aW9ucyBBU04xX1RJTUVfY2hlY2soKQogICAgIChjaGVja3MgdmFsaWRpdHkgb2YgQVNOMV9USU1FIHN0cnVjdHVyZSkgYW5kIEFTTjFfVElNRV90b19nZW5lcmFsaXplZHRpbWUoKQogICAgIChjb252ZXJ0cyBBU04xX1RJTUUgdG8gR2VuZXJhbGl6ZWRUaW1lKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIG5ldyBmdW5jdGlvbnMuIEVWUF9EaWdlc3QoKSBjb21iaW5lcyBFVlBfRGlnZXN0e0luaXQsVXBkYXRlLEZpbmFsfSgpCiAgICAgaW4gYSBzaW5nbGUgb3BlcmF0aW9uLiBYNTA5X2dldDBfcHVia2V5X2JpdHN0cigpIGV4dHJhY3RzIHRoZSBwdWJsaWNfa2V5CiAgICAgc3RydWN0dXJlIGZyb20gYSBjZXJ0aWZpY2F0ZS4gWDUwOV9wdWJrZXlfZGlnZXN0KCkgZGlnZXN0cyB0aGUgcHVibGljX2tleQogICAgIGNvbnRlbnRzOiB0aGlzIGlzIHVzZWQgaW4gdmFyaW91cyBrZXkgaWRlbnRpZmllcnMuIAogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc2tfc29ydCgpIHRvbGVyYXRlIGEgTlVMTCBhcmd1bWVudC4KICAgICBbU3RldmUgSGVuc29uIHJlcG9ydGVkIGJ5IE1hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+XQoKICAqKSBOZXcgT0NTUCB2ZXJpZnkgZmxhZyBPQ1NQX1RSVVNUT1RIRVIuIFdoZW4gc2V0IHRoZSAib3RoZXIiIGNlcnRpZmljYXRlcwogICAgIHBhc3NlZCBieSB0aGUgZnVuY3Rpb24gYXJlIHRydXN0ZWQgaW1wbGljaXRseS4gSWYgYW55IG9mIHRoZW0gc2lnbmVkIHRoZQogICAgIHJlc3BvbnNlIHRoZW4gaXQgaXMgYXNzdW1lZCB0byBiZSB2YWxpZCBhbmQgaXMgbm90IHZlcmlmaWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIFBLQ1M3X3NldF90eXBlKCkgaW5pdGlhbGlzZSBjb250ZW50X3R5cGUgaW4gUEtDUzdfRU5DX0NPTlRFTlQKICAgICB0byBkYXRhLiBUaGlzIHdhcyBwcmV2aW91c2x5IHBhcnQgb2YgdGhlIFBLQ1M3IEFTTjEgY29kZS4gVGhpcwogICAgIHdhcyBjYXVzaW5nIHByb2JsZW1zIHdpdGggT3BlblNTTCBjcmVhdGVkIFBLQ1MjMTIgYW5kIFBLQ1MjNyBzdHJ1Y3R1cmVzLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEtlbm5ldGggUi4gUm9iaW5ldHRlCgkJCQk8c3VwcG9ydEBzZWN1cmVuZXR0ZXJtLmNvbT5dCgogICopIEFkZCBDUllQVE9fcHVzaF9pbmZvKCkgYW5kIENSWVBUT19wb3BfaW5mbygpIGNhbGxzIHRvIG5ldyBBU04xCiAgICAgcm91dGluZXM6IHdpdGhvdXQgdGhlc2UgdHJhY2luZyBtZW1vcnkgbGVha3MgaXMgdmVyeSBwYWluZnVsLgogICAgIEZpeCBsZWFrcyBpbiBQS0NTMTIgYW5kIFBLQ1M3IHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgWDUwOV90aW1lX2FkaigpIGNvcGUgd2l0aCB0aGUgbmV3IGJlaGF2aW91ciBvZiBBU04xX1RJTUVfbmV3KCkuCiAgICAgUHJldmlvdXNseSBpdCBpbml0aWFsaXNlZCB0aGUgJ3R5cGUnIGFyZ3VtZW50IHRvIFZfQVNOMV9VVENUSU1FIHdoaWNoCiAgICAgZWZmZWN0aXZlbHkgbWVhbnQgR2VuZXJhbGl6ZWRUaW1lIHdvdWxkIG5ldmVyIGJlIHVzZWQuIE5vdyBpdAogICAgIGlzIGluaXRpYWxpc2VkIHRvIC0xIGJ1dCBYNTA5X3RpbWVfYWRqKCkgbm93IGhhcyB0byBjaGVjayB0aGUgdmFsdWUKICAgICBhbmQgdXNlIEFTTjFfVElNRV9zZXQoKSBpZiB0aGUgdmFsdWUgaXMgbm90IFZfQVNOMV9VVENUSU1FIG9yCiAgICAgVl9BU04xX0dFTkVSQUxJWkVEVElNRSwgd2l0aG91dCB0aGlzIGl0IGFsd2F5cyB1c2VzIEdlbmVyYWxpemVkVGltZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBLZW5uZXRoIFIuIFJvYmluZXR0ZQoJCQkJPHN1cHBvcnRAc2VjdXJlbmV0dGVybS5jb20+XQoKICAqKSBGaXhlcyB0byBCTl90b19BU04xX0lOVEVHRVIgd2hlbiBibiBpcyB6ZXJvLiBUaGlzIHdvdWxkIHByZXZpb3VzbHkKICAgICByZXN1bHQgaW4gYSB6ZXJvIGxlbmd0aCBpbiB0aGUgQVNOMV9JTlRFR0VSIHN0cnVjdHVyZSB3aGljaCB3YXMKICAgICBub3QgY29uc2lzdGVudCB3aXRoIHRoZSBzdHJ1Y3R1cmUgd2hlbiBkMmlfQVNOMV9JTlRFR0VSKCkgd2FzIHVzZWQKICAgICBhbmQgd291bGQgY2F1c2UgQVNOMV9JTlRFR0VSX2NtcCgpIHRvIGZhaWwuIEVuaGFuY2UgczJpX0FTTjFfSU5URUdFUigpCiAgICAgdG8gY29wZSB3aXRoIGhleCBhbmQgbmVnYXRpdmUgaW50ZWdlcnMuIEZpeCBidWcgaW4gaTJhX0FTTjFfSU5URUdFUigpCiAgICAgd2hlcmUgaXQgZGlkIG5vdCBwcmludCBvdXQgYSBtaW51cyBmb3IgbmVnYXRpdmUgQVNOMV9JTlRFR0VSLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdW1tYXJ5IHByaW50b3V0IHRvIG9jc3AgdXRpbGl0eS4gVGhlIHZhcmlvdXMgZnVuY3Rpb25zIHdoaWNoCiAgICAgY29udmVydCBzdGF0dXMgdmFsdWVzIHRvIHN0cmluZ3MgaGF2ZSBiZWVuIHJlbmFtZWQgdG86CiAgICAgT0NTUF9yZXNwb25zZV9zdGF0dXNfc3RyKCksIE9DU1BfY2VydF9zdGF0dXNfc3RyKCkgYW5kCiAgICAgT0NTUF9jcmxfcmVhc29uX3N0cigpIGFuZCBhcmUgbm8gbG9uZ2VyIHN0YXRpYy4gTmV3IG9wdGlvbnMKICAgICB0byB2ZXJpZnkgbm9uY2UgdmFsdWVzIGFuZCB0byBkaXNhYmxlIHZlcmlmaWNhdGlvbi4gT0NTUCByZXNwb25zZQogICAgIHByaW50b3V0IGZvcm1hdCBjbGVhbmVkIHVwLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhZGRpdGlvbmFsIE9DU1AgY2VydGlmaWNhdGUgY2hlY2tzLiBUaGVzZSBhcmUgdGhvc2Ugc3BlY2lmaWVkCiAgICAgaW4gUkZDMjU2MC4gVGhpcyBjb25zaXN0cyBvZiB0d28gc2VwYXJhdGUgY2hlY2tzOiB0aGUgQ0Egb2YgdGhlCiAgICAgY2VydGlmaWNhdGUgYmVpbmcgY2hlY2tlZCBtdXN0IGVpdGhlciBiZSB0aGUgT0NTUCBzaWduZXIgY2VydGlmaWNhdGUKICAgICBvciB0aGUgaXNzdWVyIG9mIHRoZSBPQ1NQIHNpZ25lciBjZXJ0aWZpY2F0ZS4gSW4gdGhlIGxhdHRlciBjYXNlIHRoZQogICAgIE9DU1Agc2lnbmVyIGNlcnRpZmljYXRlIG11c3QgY29udGFpbiB0aGUgT0NTUCBzaWduaW5nIGV4dGVuZGVkIGtleQogICAgIHVzYWdlLiBUaGlzIGNoZWNrIGlzIHBlcmZvcm1lZCBieSBhdHRlbXB0aW5nIHRvIG1hdGNoIHRoZSBPQ1NQCiAgICAgc2lnbmVyIG9yIHRoZSBPQ1NQIHNpZ25lciBDQSB0byB0aGUgaXNzdWVyTmFtZUhhc2ggYW5kIGlzc3VlcktleUhhc2gKICAgICBpbiB0aGUgT0NTUF9DRVJUSUQgc3RydWN0dXJlcyBvZiB0aGUgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBPQ1NQIGNlcnRpZmljYXRlIHZlcmlmaWNhdGlvbiBhZGRlZCB0byBPQ1NQX2Jhc2ljX3ZlcmlmeSgpCiAgICAgYW5kIHJlbGF0ZWQgcm91dGluZXMuIFRoaXMgdXNlcyB0aGUgc3RhbmRhcmQgT3BlblNTTCBjZXJ0aWZpY2F0ZQogICAgIHZlcmlmeSByb3V0aW5lcyB0byBwZXJmb3JtIGluaXRpYWwgY2hlY2tzIChqdXN0IENBIHZhbGlkaXR5KSBhbmQKICAgICB0byBvYnRhaW4gdGhlIGNlcnRpZmljYXRlIGNoYWluLiBUaGVuIGFkZGl0aW9uYWwgY2hlY2tzIHdpbGwgYmUKICAgICBwZXJmb3JtZWQgb24gdGhlIGNoYWluLiBDdXJyZW50bHkgdGhlIHJvb3QgQ0EgaXMgY2hlY2tlZCB0byBzZWUKICAgICBpZiBpdCBpcyBleHBsaWNpdGx5IHRydXN0ZWQgZm9yIE9DU1Agc2lnbmluZy4gVGhpcyBpcyB1c2VkIHRvIHNldAogICAgIGEgcm9vdCBDQSBhcyBhIGdsb2JhbCBzaWduaW5nIHJvb3Q6IHRoYXQgaXMgYW55IGNlcnRpZmljYXRlIHRoYXQKICAgICBjaGFpbnMgdG8gdGhhdCBDQSBpcyBhbiBhY2NlcHRhYmxlIE9DU1Agc2lnbmluZyBjZXJ0aWZpY2F0ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgJy1leHRmaWxlIC4uLicgb3B0aW9uIHRvICdvcGVuc3NsIGNhJyBmb3IgcmVhZGluZyBYLjUwOXYzCiAgICAgZXh0ZW5zaW9ucyBmcm9tIGEgc2VwYXJhdGUgY29uZmlndXJhdGlvbiBmaWxlLgogICAgIEFzIHdoZW4gcmVhZGluZyBleHRlbnNpb25zIGZyb20gdGhlIG1haW4gY29uZmlndXJhdGlvbiBmaWxlLAogICAgIHRoZSAnLWV4dGVuc2lvbnMgLi4uJyBvcHRpb24gbWF5IGJlIHVzZWQgZm9yIHNwZWNpZnlpbmcgdGhlCiAgICAgc2VjdGlvbiB0byB1c2UuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+XQoKICAqKSBOZXcgT0NTUCB1dGlsaXR5LiBBbGxvd3MgT0NTUCByZXF1ZXN0cyB0byBiZSBnZW5lcmF0ZWQgb3IKICAgICByZWFkLiBUaGUgcmVxdWVzdCBjYW4gYmUgc2VudCB0byBhIHJlc3BvbmRlciBhbmQgdGhlIG91dHB1dAogICAgIHBhcnNlZCwgb3V0cHV0ZWQgb3IgcHJpbnRlZCBpbiB0ZXh0IGZvcm0uIE5vdCBjb21wbGV0ZSB5ZXQ6CiAgICAgc3RpbGwgbmVlZHMgdG8gY2hlY2sgdGhlIE9DU1AgcmVzcG9uc2UgdmFsaWRpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHN1YmNvbW1hbmRzIGZvciAnb3BlbnNzbCBjYSc6CiAgICAgJ29wZW5zc2wgY2EgLXN0YXR1cyA8c2VyaWFsPicgcHJpbnRzIHRoZSBzdGF0dXMgb2YgdGhlIGNlcnQgd2l0aAogICAgIHRoZSBnaXZlbiBzZXJpYWwgbnVtYmVyIChhY2NvcmRpbmcgdG8gdGhlIGluZGV4IGZpbGUpLgogICAgICdvcGVuc3NsIGNhIC11cGRhdGVkYicgdXBkYXRlcyB0aGUgZXhwaXJ5IHN0YXR1cyBvZiBjZXJ0aWZpY2F0ZXMKICAgICBpbiB0aGUgaW5kZXggZmlsZS4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgPG1hZHdvbGZAY29tdW5lLm1vZGVuYS5pdD5dCgogICopIE5ldyAnLW5ld3JlcS1ub2RlcycgY29tbWFuZCBvcHRpb24gdG8gQ0EucGwuICBUaGlzIGlzIGxpa2UKICAgICAnLW5ld3JlcScsIGJ1dCBjYWxscyAnb3BlbnNzbCByZXEnIHdpdGggdGhlICctbm9kZXMnIG9wdGlvbgogICAgIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBrZXkgaXMgbm90IGVuY3J5cHRlZC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPl0KCiAgKikgTmV3IGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBHTlUgSHVyZC4KICAgICBbSm9uYXRoYW4gQmFydGxldHQgPGpvaG5ueWJAd29sZnJhbS5jb20+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEluaXRpYWwgY29kZSB0byBpbXBsZW1lbnQgT0NTUCBiYXNpYyByZXNwb25zZSB2ZXJpZnkuIFRoaXMKICAgICBpcyBjdXJyZW50bHkgaW5jb21wbGV0ZS4gQ3VycmVudGx5IGp1c3QgZmluZHMgdGhlIHNpZ25lcidzCiAgICAgY2VydGlmaWNhdGUgYW5kIHZlcmlmaWVzIHRoZSBzaWduYXR1cmUgb24gdGhlIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBTU0xlYXlfdmVyc2lvbiBjb2RlIFNTTEVBWV9ESVIgdG8gZGV0ZXJtaW5lIHRoZSBjb21waWxlZC1pbgogICAgIHZhbHVlIG9mIE9QRU5TU0xESVIuICBUaGlzIGlzIGF2YWlsYWJsZSB2aWEgdGhlIG5ldyAnLWQnIG9wdGlvbgogICAgIHRvICdvcGVuc3NsIHZlcnNpb24nLCBhbmQgaXMgYWxzbyBpbmNsdWRlZCBpbiAnb3BlbnNzbCB2ZXJzaW9uIC1hJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBbGxvd2luZyBkZWZpbmluZyBtZW1vcnkgYWxsb2NhdGlvbiBjYWxsYmFja3MgdGhhdCB3aWxsIGJlIGdpdmVuCiAgICAgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiBpbiBhZGRpdGlvbmFsIGFyZ3VtZW50cwogICAgIChhIGNvbnN0IGNoYXIqIGFuZCBhbiBpbnQpLiAgVGhlIGJhc2ljIGZ1bmN0aW9uYWxpdHkgcmVtYWlucywgYXMKICAgICB3ZWxsIGFzIHRoZSBvcmlnaW5hbCBwb3NzaWJpbGl0eSB0byBqdXN0IHJlcGxhY2UgbWFsbG9jKCksCiAgICAgcmVhbGxvYygpIGFuZCBmcmVlKCkgYnkgZnVuY3Rpb25zIHRoYXQgZG8gbm90IGtub3cgYWJvdXQgdGhlc2UKICAgICBhZGRpdGlvbmFsIGFyZ3VtZW50cy4gIFRvIHJlZ2lzdGVyIGFuZCBmaW5kIG91dCB0aGUgY3VycmVudAogICAgIHNldHRpbmdzIGZvciBleHRlbmRlZCBhbGxvY2F0aW9uIGZ1bmN0aW9ucywgdGhlIGZvbGxvd2luZwogICAgIGZ1bmN0aW9ucyBhcmUgcHJvdmlkZWQ6CgoJQ1JZUFRPX3NldF9tZW1fZXhfZnVuY3Rpb25zCglDUllQVE9fc2V0X2xvY2tlZF9tZW1fZXhfZnVuY3Rpb25zCglDUllQVE9fZ2V0X21lbV9leF9mdW5jdGlvbnMKCUNSWVBUT19nZXRfbG9ja2VkX21lbV9leF9mdW5jdGlvbnMKCiAgICAgVGhlc2Ugd29yayB0aGUgc2FtZSB3YXkgYXMgQ1JZUFRPX3NldF9tZW1fZnVuY3Rpb25zIGFuZCBmcmllbmRzLgogICAgIENSWVBUT19nZXRfW2xvY2tlZF9dbWVtX2Z1bmN0aW9ucyBub3cgd3JpdGVzIDAgd2hlcmUgc3VjaCBhbgogICAgIGV4dGVuZGVkIGFsbG9jYXRpb24gZnVuY3Rpb24gaXMgZW5hYmxlZC4KICAgICBTaW1pbGFybHksIENSWVBUT19nZXRfW2xvY2tlZF9dbWVtX2V4X2Z1bmN0aW9ucyB3cml0ZXMgMCB3aGVyZQogICAgIGEgY29udmVudGlvbmFsIGFsbG9jYXRpb24gZnVuY3Rpb24gaXMgZW5hYmxlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBCb2RvIE1vZWxsZXJdCgogICopIEZpbmlzaCBvZmYgcmVtb3ZpbmcgdGhlIHJlbWFpbmluZyBMSEFTSCBmdW5jdGlvbiBwb2ludGVyIGNhc3RzLgogICAgIFRoZXJlIHNob3VsZCBubyBsb25nZXIgYmUgYW55IHByb3RvdHlwZS1jYXN0aW5nIHJlcXVpcmVkIHdoZW4gdXNpbmcKICAgICB0aGUgTEhBU0ggYWJzdHJhY3Rpb24sIGFuZCBhbnkgY2FzdHMgdGhhdCByZW1haW4gYXJlICJidWdzIi4gU2VlCiAgICAgdGhlIGNhbGxiYWNrIHR5cGVzIGFuZCBtYWNyb3MgYXQgdGhlIGhlYWQgb2YgbGhhc2guaCBmb3IgZGV0YWlscwogICAgIChhbmQgIk9CSl9jbGVhbnVwIiBpbiBjcnlwdG8vb2JqZWN0cy9vYmpfZGF0LmMgYXMgYW4gZXhhbXBsZSkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGF1dG9tYXRpYyBxdWVyeSBvZiBFR0Qgc29ja2V0cyBpbiBSQU5EX3BvbGwoKSBmb3IgdGhlIHVuaXggdmFyaWFudC4KICAgICBJZiAvZGV2L1t1XXJhbmRvbSBkZXZpY2VzIGFyZSBub3QgYXZhaWxhYmxlIG9yIGRvIG5vdCByZXR1cm4gZW5vdWdoCiAgICAgZW50cm9weSwgRUdEIHN0eWxlIHNvY2tldHMgKHNlcnZlZCBieSBFR0Qgb3IgUFJOR0QpIHdpbGwgYXV0b21hdGljYWxseQogICAgIGJlIHF1ZXJpZWQuCiAgICAgVGhlIGxvY2F0aW9ucyAvdmFyL3J1bi9lZ2QtcG9vbCwgL2Rldi9lZ2QtcG9vbCwgL2V0Yy9lZ2QtcG9vbCwgYW5kCiAgICAgL2V0Yy9lbnRyb3B5IHdpbGwgYmUgcXVlcmllZCBvbmNlIGVhY2ggaW4gdGhpcyBzZXF1ZW5jZSwgcXVlcmluZyBzdG9wcwogICAgIHdoZW4gZW5vdWdoIGVudHJvcHkgd2FzIGNvbGxlY3RlZCB3aXRob3V0IHF1ZXJ5aW5nIG1vcmUgc29ja2V0cy4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQ2hhbmdlIHRoZSBVbml4IFJBTkRfcG9sbCgpIHZhcmlhbnQgdG8gYmUgYWJsZSB0byBwb2xsIHNldmVyYWwKICAgICByYW5kb20gZGV2aWNlcywgYXMgc3BlY2lmaWVkIGJ5IERFVlJBTkRPTSwgdW50aWwgYSBzdWZmaWNpZW50IGFtb3VudAogICAgIG9mIGRhdGEgaGFzIGJlZW4gY29sbGVjdGVkLiAgIFdlIHNwZW5kIGF0IG1vc3QgMTAgbXMgb24gZWFjaCBmaWxlCiAgICAgKHNlbGVjdCB0aW1lb3V0KSBhbmQgcmVhZCBpbiBub24tYmxvY2tpbmcgbW9kZS4gIERFVlJBTkRPTSBub3cKICAgICBkZWZhdWx0cyB0byB0aGUgbGlzdCAiL2Rldi91cmFuZG9tIiwgIi9kZXYvcmFuZG9tIiwgIi9kZXYvc3JhbmRvbSIKICAgICAocHJldmlvdXNseSBpdCB3YXMganVzdCB0aGUgc3RyaW5nICIvZGV2L3VyYW5kb20iKSwgc28gb24gdHlwaWNhbAogICAgIHBsYXRmb3JtcyB0aGUgMTAgbXMgZGVsYXkgd2lsbCBuZXZlciBvY2N1ci4KICAgICBBbHNvIHNlcGFyYXRlIG91dCB0aGUgVW5peCB2YXJpYW50IHRvIGl0cyBvd24gZmlsZSwgcmFuZF91bml4LmMuCiAgICAgRm9yIFZNUywgdGhlcmUncyBhIGN1cnJlbnRseS1lbXB0eSByYW5kX3Ztcy5jLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1vdmUgT0NTUCBjbGllbnQgcmVsYXRlZCByb3V0aW5lcyB0byBvY3NwX2NsLmMuIFRoZXNlCiAgICAgcHJvdmlkZSB1dGlsaXR5IGZ1bmN0aW9ucyB3aGljaCBhbiBhcHBsaWNhdGlvbiBuZWVkaW5nCiAgICAgdG8gaXNzdWUgYSByZXF1ZXN0IHRvIGFuIE9DU1AgcmVzcG9uZGVyIGFuZCBhbmFseXNlIHRoZQogICAgIHJlc3BvbnNlIHdpbGwgdHlwaWNhbGx5IG5lZWQ6IGFzIG9wcG9zZWQgdG8gdGhvc2Ugd2hpY2ggYW4KICAgICBPQ1NQIHJlc3BvbmRlciBpdHNlbGYgd291bGQgbmVlZCB3aGljaCB3aWxsIGJlIGFkZGVkIGxhdGVyLgoKICAgICBPQ1NQX3JlcXVlc3Rfc2lnbigpIHNpZ25zIGFuIE9DU1AgcmVxdWVzdCB3aXRoIGFuIEFQSSBzaW1pbGFyCiAgICAgdG8gUEtDUzdfc2lnbigpLiBPQ1NQX3Jlc3BvbnNlX3N0YXR1cygpIHJldHVybnMgc3RhdHVzIG9mIE9DU1AKICAgICByZXNwb25zZS4gT0NTUF9yZXNwb25zZV9nZXQxX2Jhc2ljKCkgZXh0cmFjdHMgYmFzaWMgcmVzcG9uc2UKICAgICBmcm9tIHJlc3BvbnNlLiBPQ1NQX3Jlc3BfZmluZF9zdGF0dXMoKTogZmluZHMgYW5kIGV4dHJhY3RzIHN0YXR1cwogICAgIGluZm9ybWF0aW9uIGZyb20gYW4gT0NTUF9DRVJUSUQgc3RydWN0dXJlICh3aGljaCB3aWxsIGJlIGNyZWF0ZWQKICAgICB3aGVuIHRoZSByZXF1ZXN0IHN0cnVjdHVyZSBpcyBidWlsdCkuIFRoZXNlIGFyZSBidWlsdCBmcm9tIGxvd2VyCiAgICAgbGV2ZWwgZnVuY3Rpb25zIHdoaWNoIHdvcmsgb24gT0NTUF9TSU5HTEVSRVNQIHN0cnVjdHVyZXMgYnV0CiAgICAgd29udCBub3JtYWxseSBiZSB1c2VkIHVubGVzcyB0aGUgYXBwbGljYXRpb24gd2lzaGVzIHRvIGV4YW1pbmUKICAgICBleHRlbnNpb25zIGluIHRoZSBPQ1NQIHJlc3BvbnNlIGZvciBleGFtcGxlLgoKICAgICBSZXBsYWNlIG5vbmNlIHJvdXRpbmVzIHdpdGggYSBwYWlyIG9mIGZ1bmN0aW9ucy4KICAgICBPQ1NQX3JlcXVlc3RfYWRkMV9ub25jZSgpIGFkZHMgYSBub25jZSB2YWx1ZSBhbmQgb3B0aW9uYWxseQogICAgIGdlbmVyYXRlcyBhIHJhbmRvbSB2YWx1ZS4gT0NTUF9jaGVja19ub25jZSgpIGNoZWNrcyB0aGUKICAgICB2YWxpZGl0eSBvZiB0aGUgbm9uY2UgaW4gYW4gT0NTUCByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgZnVuY3Rpb24gT0NTUF9yZXF1ZXN0X2FkZCgpIHRvIE9DU1BfcmVxdWVzdF9hZGQwX2lkKCkuCiAgICAgVGhpcyBkb2Vzbid0IGNvcHkgdGhlIHN1cHBsaWVkIE9DU1BfQ0VSVElEIGFuZCBhdm9pZHMgdGhlCiAgICAgbmVlZCB0byBmcmVlIHVwIHRoZSBuZXdseSBjcmVhdGVkIGlkLiBDaGFuZ2UgcmV0dXJuIHR5cGUKICAgICB0byBPQ1NQX09ORVJFUSB0byByZXR1cm4gdGhlIGludGVybmFsIE9DU1BfT05FUkVRIHN0cnVjdHVyZS4KICAgICBUaGlzIGNhbiB0aGVuIGJlIHVzZWQgdG8gYWRkIGV4dGVuc2lvbnMgdG8gdGhlIHJlcXVlc3QuCiAgICAgRGVsZXRlZCBPQ1NQX3JlcXVlc3RfbmV3KCksIHNpbmNlIG1vc3Qgb2YgaXRzIGZ1bmN0aW9uYWxpdHkKICAgICBpcyBub3cgaW4gT0NTUF9SRVFVRVNUX25ldygpIChhbmQgdGhlIGNhc2UgaW5zZW5zaXRpdmUgbmFtZQogICAgIGNsYXNoKSBhcGFydCBmcm9tIHRoZSBhYmlsaXR5IHRvIHNldCB0aGUgcmVxdWVzdCBuYW1lIHdoaWNoCiAgICAgd2lsbCBiZSBhZGRlZCBlbHNld2hlcmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIE9DU1AgQVBJLiBSZW1vdmUgb2Jzb2xldGUgZXh0ZW5zaW9ucyBhcmd1bWVudCBmcm9tCiAgICAgdmFyaW91cyBmdW5jdGlvbnMuIEV4dGVuc2lvbnMgYXJlIG5vdyBoYW5kbGVkIHVzaW5nIHRoZSBuZXcKICAgICBPQ1NQIGV4dGVuc2lvbiBjb2RlLiBOZXcgc2ltcGxlIE9DU1AgSFRUUCBmdW5jdGlvbiB3aGljaCAKICAgICBjYW4gYmUgdXNlZCB0byBzZW5kIHJlcXVlc3RzIGFuZCBwYXJzZSB0aGUgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSBQS0NTIzcgKFMvTUlNRSkgY29kZSB0byB3b3JrIHdpdGggbmV3IEFTTjEuIFR3byBuZXcKICAgICBBU04xX0lURU0gc3RydWN0dXJlcyBoZWxwIHdpdGggc2lnbiBhbmQgdmVyaWZ5LiBQS0NTN19BVFRSX1NJR04KICAgICB1c2VzIHRoZSBzcGVjaWFsIHJlb3JkZXIgdmVyc2lvbiBvZiBTRVQgT0YgdG8gc29ydCB0aGUgYXR0cmlidXRlcwogICAgIGFuZCByZW9yZGVyIHRoZW0gdG8gbWF0Y2ggdGhlIGVuY29kZWQgb3JkZXIuIFRoaXMgcmVzb2x2ZXMgYSBsb25nCiAgICAgc3RhbmRpbmcgcHJvYmxlbTogYSB2ZXJpZnkgb24gYSBQS0NTNyBzdHJ1Y3R1cmUganVzdCBhZnRlciBzaWduaW5nCiAgICAgaXQgdXNlZCB0byBmYWlsIGJlY2F1c2UgdGhlIGF0dHJpYnV0ZSBvcmRlciBkaWQgbm90IG1hdGNoIHRoZQogICAgIGVuY29kZWQgb3JkZXIuIFBLQ1M3X0FUVFJfVkVSSUZZIGRvZXMgbm90IHJlb3JkZXIgdGhlIGF0dHJpYnV0ZXM6CiAgICAgaXQgdXNlcyB0aGUgcmVjZWl2ZWQgb3JkZXIuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHRvbGVyYXRlIHNvbWUgYnJva2VuCiAgICAgc29mdHdhcmUgdGhhdCBkb2VzIG5vdCBvcmRlciBTRVQgT0YuIFRoaXMgaXMgaGFuZGxlZCBieSBlbmNvZGluZwogICAgIGFzIGEgU0VRVUVOQ0UgT0YgYnV0IHVzaW5nIGltcGxpY2l0IHRhZ2dpbmcgKHdpdGggVU5JVkVSU0FMIGNsYXNzKQogICAgIHRvIHByb2R1Y2UgdGhlIHJlcXVpcmVkIFNFVCBPRi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIYXZlIG1rMW1mLnBsIGdlbmVyYXRlIHRoZSBtYWNyb3MgT1BFTlNTTF9CVUlMRF9TSExJQkNSWVBUTyBhbmQKICAgICBPUEVOU1NMX0JVSUxEX1NITElCU1NMIGFuZCB1c2UgdGhlbSBhcHByb3ByaWF0ZWx5IGluIHRoZSBoZWFkZXIKICAgICBmaWxlcyB0byBnZXQgY29ycmVjdCBkZWNsYXJhdGlvbnMgb2YgdGhlIEFTTi4xIGl0ZW0gdmFyaWFibGVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFJld3JpdGUgb2YgUEtDUyMxMiBjb2RlIHRvIHVzZSBuZXcgQVNOMSBmdW5jdGlvbmFsaXR5LiBSZXBsYWNlIG1hbnkKICAgICBQS0NTIzEyIG1hY3JvcyB3aXRoIHJlYWwgZnVuY3Rpb25zLiBGaXggdHdvIHVucmVsYXRlZCBBU04xIGJ1Z3M6CiAgICAgYXNuMV9jaGVja190bGVuKCkgd291bGQgc29tZXRpbWVzIGF0dGVtcHQgdG8gdXNlICdjdHgnIHdoZW4gaXQgd2FzCiAgICAgTlVMTCBhbmQgQVNOMV9UWVBFIHdhcyBub3QgZGVyZWZlcmVuY2VkIHByb3Blcmx5IGluIGFzbjFfZXhfYzJpKCkuCiAgICAgTmV3IEFTTjEgbWFjcm86IERFQ0xBUkVfQVNOMV9JVEVNKCkgd2hpY2gganVzdCBkZWNsYXJlcyB0aGUgcmVsZXZhbnQKICAgICBBU04xX0lURU0gYW5kIG5vIHdyYXBwZXIgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbnMgb3IgQVNOMV9pdGVtX2QyaV9mcCgpIGFuZCBBU04xX2l0ZW1fZDJpX2JpbygpLiBUaGVzZQogICAgIHJlcGxhY2UgdGhlIG9sZCBmdW5jdGlvbiBwb2ludGVyIGJhc2VkIEkvTyByb3V0aW5lcy4gQ2hhbmdlIG1vc3Qgb2YKICAgICB0aGUgKl9kMmlfYmlvKCkgYW5kICpfZDJpX2ZwKCkgZnVuY3Rpb25zIHRvIHVzZSB0aGVzZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIG1rZGVmLnBsIHRvIGJlIG1vcmUgYWNjZXB0aW5nIGFib3V0IHNwYWNpbmcgaW4gQyBwcmVwcm9jZXNzb3IKICAgICBsaW5lcywgcmVjb2duaWNlIG1vcmUgImFsZ29yaXRobXMiIHRoYXQgY2FuIGJlIGRlc2VsZWN0ZWQsIGFuZCBtYWtlCiAgICAgaXQgY29tcGxhaW4gYWJvdXQgYWxnb3JpdGhtIGRlc2VsZWN0aW9uIHRoYXQgaXNuJ3QgcmVjb2duaXNlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgQVNOMSBmdW5jdGlvbnMgdG8gaGFuZGxlIGR1cCwgc2lnbiwgdmVyaWZ5LCBkaWdlc3QsIHBhY2sgYW5kCiAgICAgdW5wYWNrIG9wZXJhdGlvbnMgaW4gdGVybXMgb2YgQVNOMV9JVEVNLiBNb2RpZnkgZXhpc3Rpbmcgd3JhcHBlcnMKICAgICB0byB1c2UgbmV3IGZ1bmN0aW9ucy4gQWRkIE5PX0FTTjFfT0xEIHdoaWNoIGNhbiBiZSBzZXQgdG8gcmVtb3ZlCiAgICAgc29tZSBvbGQgc3R5bGUgQVNOMSBmdW5jdGlvbnM6IHRoaXMgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGlmIG9sZAogICAgIGNvZGUgd2lsbCBzdGlsbCB3b3JrIHdoZW4gdGhlc2UgZXZlbnR1YWxseSBnbyBhd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBleHRlbnNpb24gZnVuY3Rpb25zIGZvciBPQ1NQIHN0cnVjdHVyZXMsIHRoZXNlIGZvbGxvdyB0aGUKICAgICBzYW1lIGNvbnZlbnRpb25zIGFzIGNlcnRpZmljYXRlcyBhbmQgQ1JMcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gWDUwOVYzX2FkZDFfaTJkKCkuIFRoaXMgYXV0b21hdGljYWxseSBlbmNvZGVzIGFuZAogICAgIGFkZHMgYW4gZXh0ZW5zaW9uLiBJdHMgYmVoYXZpb3VyIGNhbiBiZSBjdXN0b21pc2VkIHdpdGggdmFyaW91cwogICAgIGZsYWdzIHRvIGFwcGVuZCwgcmVwbGFjZSBvciBkZWxldGUuIFZhcmlvdXMgd3JhcHBlcnMgYWRkZWQgZm9yCiAgICAgY2VydGlmY2F0ZXMgYW5kIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRvIGF2b2lkIGNhbGxpbmcgdGhlIHVuZGVybHlpbmcgQVNOMSBwcmludCByb3V0aW5lIHdoZW4KICAgICBhbiBleHRlbnNpb24gY2Fubm90IGJlIHBhcnNlZC4gQ29ycmVjdCBhIHR5cG8gaW4gdGhlCiAgICAgT0NTUF9TRVJWSUNFTE9DIGV4dGVuc2lvbi4gVGlkeSB1cCBwcmludCBPQ1NQIGZvcm1hdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIG1rZGVmLnBsIHBhcnNlIHNvbWUgb2YgdGhlIEFTTjEgbWFjcm9zIGFuZCBhZGQgYXByb3ByaWF0ZQogICAgIGVudHJpZXMgZm9yIHZhcmlhYmxlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgZnVuY3Rpb25hbGl0eSB0byBhcHBzL29wZW5zc2wuYyBmb3IgZGV0ZWN0aW5nIGxvY2tpbmcKICAgICBwcm9ibGVtczogQXMgdGhlIHByb2dyYW0gaXMgc2luZ2xlLXRocmVhZGVkLCBhbGwgd2UgaGF2ZQogICAgIHRvIGRvIGlzIHJlZ2lzdGVyIGEgbG9ja2luZyBjYWxsYmFjayB1c2luZyBhbiBhcnJheSBmb3IKICAgICBzdG9yaW5nIHdoaWNoIGxvY2tzIGFyZSBjdXJyZW50bHkgaGVsZCBieSB0aGUgcHJvZ3JhbS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVc2UgYSBsb2NrIGFyb3VuZCB0aGUgY2FsbCB0byBDUllQVE9fZ2V0X2V4X25ld19pbmRleCgpIGluCiAgICAgU1NMX2dldF9leF9kYXRhX1g1MDlfU1RPUkVfaWR4KCksIHdoaWNoIGlzIHVzZWQgaW4KICAgICBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4oKSBhbmQgdGh1cyBjYW4gYmUgY2FsbGVkIGF0IGFueSB0aW1lCiAgICAgZHVyaW5nIFRMUy9TU0wgaGFuZHNoYWtlcyBzbyB0aGF0IHRocmVhZC1zYWZldHkgaXMgZXNzZW50aWFsLgogICAgIFVuZm9ydHVuYXRlbHksIHRoZSBleF9kYXRhIGRlc2lnbiBpcyBub3QgYXQgYWxsIHN1aXRlZAogICAgIGZvciBtdWx0aS10aHJlYWRlZCB1c2UsIHNvIGl0IHByb2JhYmx5IHNob3VsZCBiZSBhYm9saXNoZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkZWQgQnJvYWRjb20gInVic2VjIiBFTkdJTkUgdG8gT3BlblNTTC4KICAgICBbQnJvYWRjb20sIHR3ZWFrZWQgYW5kIGludGVncmF0ZWQgYnkgR2VvZmYgVGhvcnBlXQoKICAqKSBNb3ZlIGNvbW1vbiBleHRlbnNpb24gcHJpbnRpbmcgY29kZSB0byBuZXcgZnVuY3Rpb24KICAgICBYNTA5VjNfcHJpbnRfZXh0ZW5zaW9ucygpLiBSZW9yZ2FuaXNlIE9DU1AgcHJpbnQgcm91dGluZXMgYW5kCiAgICAgaW1wbGVtZW50IHNvbWUgbmVlZGVkIE9DU1AgQVNOMSBmdW5jdGlvbnMuIEFkZCBPQ1NQIGV4dGVuc2lvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfc2lnbmF0dXJlX3ByaW50KCkgdG8gcmVtb3ZlIGR1cGxpY2F0aW9uIGluIHNvbWUKICAgICBwcmludCByb3V0aW5lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBzcGVjaWFsIG1lYW5pbmcgd2hlbiBTRVQgT0YgYW5kIFNFUVVFTkNFIE9GIGZsYWdzIGFyZSBib3RoCiAgICAgc2V0ICh0aGlzIHdhcyB0cmVhdGVkIGV4YWN0bHkgdGhlIHNhbWUgYXMgU0VUIE9GIHByZXZpb3VzbHkpLiBUaGlzCiAgICAgaXMgdXNlZCB0byByZW9yZGVyIHRoZSBTVEFDSyByZXByZXNlbnRpbmcgdGhlIHN0cnVjdHVyZSB0byBtYXRjaCB0aGUKICAgICBlbmNvZGluZy4gVGhpcyB3aWxsIGJlIHVzZWQgdG8gZ2V0IHJvdW5kIGEgcHJvYmxlbSB3aGVyZSBhIFBLQ1M3CiAgICAgc3RydWN0dXJlIHdoaWNoIHdhcyBzaWduZWQgY291bGQgbm90IGJlIHZlcmlmaWVkIGJlY2F1c2UgdGhlIFNUQUNLCiAgICAgb3JkZXIgZGlkIG5vdCByZWZsZWN0IHRoZSBlbmNvZGVkIG9yZGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlaW1wbGVtZW50IHRoZSBPQ1NQIEFTTjEgbW9kdWxlIHVzaW5nIHRoZSBuZXcgY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVcGRhdGUgdGhlIFg1MDlWMyBjb2RlIHRvIHBlcm1pdCB0aGUgdXNlIG9mIGFuIEFTTjFfSVRFTSBzdHJ1Y3R1cmUKICAgICBmb3IgaXRzIEFTTjEgb3BlcmF0aW9ucy4gVGhlIG9sZCBzdHlsZSBmdW5jdGlvbiBwb2ludGVycyBzdGlsbCBleGlzdAogICAgIGZvciBub3cgYnV0IHRoZXkgd2lsbCBldmVudHVhbGx5IGdvIGF3YXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWVyZ2UgaW4gcmVwbGFjZW1lbnQgQVNOMSBjb2RlIGZyb20gdGhlIEFTTjEgYnJhbmNoLiBUaGlzIGFsbW9zdAogICAgIGNvbXBsZXRlbHkgcmVwbGFjZXMgdGhlIG9sZCBBU04xIGZ1bmN0aW9uYWxpdHkgd2l0aCBhIHRhYmxlIGRyaXZlbgogICAgIGVuY29kZXIgYW5kIGRlY29kZXIgd2hpY2ggaW50ZXJwcmV0cyBhbiBBU04xX0lURU0gc3RydWN0dXJlIGRlc2NyaWJpbmcKICAgICB0aGUgQVNOMSBtb2R1bGUuIENvbXBhdGliaWxpdHkgd2l0aCB0aGUgZXhpc3RpbmcgQVNOMSBBUEkgKGkyZCxkMmkpIGlzCiAgICAgbGFyZ2VseSBtYWludGFpbmVkLiBBbG1vc3QgYWxsIG9mIHRoZSBvbGQgYXNuMV9tYWMuaCBtYWNybyBiYXNlZCBBU04xCiAgICAgaGFzIGFsc28gYmVlbiBjb252ZXJ0ZWQgdG8gdGhlIG5ldyBmb3JtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBCTl9tb2RfZXhwX3JlY3Agc28gdGhhdCBuZWdhdGl2ZSBtb2R1bGkgYXJlIHRvbGVyYXRlZAogICAgICh0aGUgc2lnbiBpcyBpZ25vcmVkKS4gIFNpbWlsYXJseSwgaWdub3JlIHRoZSBzaWduIGluIEJOX01PTlRfQ1RYX3NldAogICAgIHNvIHRoYXQgQk5fbW9kX2V4cF9tb250IGFuZCBCTl9tb2RfZXhwX21vbnRfd29yZCB3b3JrCiAgICAgZm9yIG5lZ2F0aXZlIG1vZHVsaS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQk5fdWFkZCBhbmQgQk5fdXN1YjogQWx3YXlzIHJldHVybiBub24tbmVnYXRpdmUgcmVzdWx0cyBpbnN0ZWFkCiAgICAgb2Ygbm90IHRvdWNoaW5nIHRoZSByZXN1bHQncyBzaWduIGJpdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCTl9kaXYgYnVnZml4OiBJZiB0aGUgcmVzdWx0IGlzIDAsIHRoZSBzaWduIChyZXMtPm5lZykgbXVzdCBub3QgYmUKICAgICBzZXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlZCB0aGUgTEhBU0ggY29kZSB0byB1c2UgcHJvdG90eXBlcyBmb3IgY2FsbGJhY2tzLCBhbmQgY3JlYXRlZAogICAgIG1hY3JvcyB0byBkZWNsYXJlIGFuZCBpbXBsZW1lbnQgdGhpbiAob3B0aW9uYWxseSBzdGF0aWMpIGZ1bmN0aW9ucwogICAgIHRoYXQgcHJvdmlkZSB0eXBlLXNhZmV0eSBhbmQgYXZvaWQgZnVuY3Rpb24gcG9pbnRlciBjYXN0aW5nIGZvciB0aGUKICAgICB0eXBlLXNwZWNpZmljIGNhbGxiYWNrcy4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGRlZCBLZXJiZXJvcyBDaXBoZXIgU3VpdGVzIHRvIGJlIHVzZWQgd2l0aCBUTFMsIGFzIHdyaXR0ZW4gaW4KICAgICBSRkMgMjcxMi4KICAgICBbVmVlcnMgU3RhYXRzIDxzdGFhdHN2ckBhc2MuaHBjLm1pbD4sCiAgICAgIEplZmZyZXkgQWx0bWFuIDxqYWx0bWFuQGNvbHVtYmlhLmVkdT4sIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIFJlZm9ybWF0IHRoZSBGQVEgc28gdGhlIGRpZmZlcmVudCBxdWVzdGlvbnMgYW5kIGFuc3dlcnMgY2FuIGJlIGRpdmlkZWQKICAgICBpbiBzZWN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIHN1YmplY3QuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSGF2ZSB0aGUgemxpYiBjb21wcmVzc2lvbiBjb2RlIGxvYWQgWkxJQi5ETEwgZHluYW1pY2FsbHkgdW5kZXIKICAgICBXaW5kb3dzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbiBCTl9tb2Rfc3FydCBmb3IgY29tcHV0aW5nIHNxdWFyZSByb290cyBtb2R1bG8gYSBwcmltZQogICAgICh1c2luZyB0aGUgcHJvYmFiaWxpc3RpYyBUb25lbGxpLVNoYW5rcyBhbGdvcml0aG0gdW5sZXNzCiAgICAgcCA9PSAzIChtb2QgNCkgIG9yICBwID09IDUgKG1vZCA4KSwgIHdoaWNoIGFyZSBjYXNlcyB0aGF0IGNhbgogICAgIGJlIGhhbmRsZWQgZGV0ZXJtaW5pc3RpY2FsbHkpLgogICAgIFtMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPiwgQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIEJOX21vZF9pbnZlcnNlIGZhc3RlciBieSBleHBsaWNpdGx5IGhhbmRsaW5nIHNtYWxsIHF1b3RpZW50cwogICAgIGluIHRoZSBFdWNsaWQgbG9vcC4gKFNwZWVkIGdhaW4gYWJvdXQgMjAlIGZvciBzbWFsbCBtb2R1bGkgWzI1NiBvcgogICAgIDUxMiBiaXRzXSwgYWJvdXQgMzAlIGZvciBsYXJnZXIgb25lcyBbMTAyNCBvciAyMDQ4IGJpdHNdLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fa3JvbmVja2VyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBCTl9nY2Qgc28gdGhhdCBpdCB3b3JrcyBvbiBuZWdhdGl2ZSBpbnB1dHM7IHRoZSByZXN1bHQgaXMKICAgICBwb3NpdGl2ZSB1bmxlc3MgYm90aCBwYXJhbWV0ZXJzIGFyZSB6ZXJvLgogICAgIFByZXZpb3VzbHkgc29tZXRoaW5nIHJlYXNvbmFibHkgY2xvc2UgdG8gYW4gaW5maW5pdGUgbG9vcCB3YXMKICAgICBwb3NzaWJsZSBiZWNhdXNlIG51bWJlcnMgY291bGQgYmUgZ3Jvd2luZyBpbnN0ZWFkIG9mIHNocmlua2luZwogICAgIGluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBFdWNsaWQncyBhbGdvcml0aG0uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IEJOX2lzX3dvcmQoKSBhbmQgQk5faXNfb25lKCkgbWFjcm9zIHRvIHRha2UgaW50byBhY2NvdW50IHRoZQogICAgIHNpZ24gb2YgdGhlIG51bWJlciBpbiBxdWVzdGlvbi4KCiAgICAgRml4IEJOX2lzX3dvcmQoYSx3KSB0byB3b3JrIGNvcnJlY3RseSBmb3IgdyA9PSAwLgoKICAgICBUaGUgb2xkIEJOX2lzX3dvcmQoYSx3KSBtYWNybyBpcyBub3cgY2FsbGVkIEJOX2Fic19pc193b3JkKGEsdykKICAgICBiZWNhdXNlIGl0cyB0ZXN0IGlmIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiAnYScgZXF1YWxzICd3Jy4KICAgICBOb3RlIHRoYXQgQk5fYWJzX2lzX3dvcmQgZG9lcyAqbm90KiBoYW5kbGUgdyA9PSAwIHJlbGlhYmx5OwogICAgIGl0IGV4aXN0cyBtb3N0bHkgZm9yIHVzZSBpbiB0aGUgaW1wbGVtZW50YXRpb25zIG9mIEJOX2lzX3plcm8oKSwKICAgICBCTl9pc19vbmUoKSwgYW5kIEJOX2lzX3dvcmQoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fc3dhcC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBVc2UgQk5fbm5tb2QgaW5zdGVhZCBvZiBCTl9tb2QgaW4gY3J5cHRvL2JuL2JuX2V4cC5jIHNvIHRoYXQKICAgICB0aGUgZXhwb25lbnRpYXRpb24gZnVuY3Rpb25zIGFyZSBtb3JlIGxpa2VseSB0byBwcm9kdWNlIHJlYXNvbmFibGUKICAgICByZXN1bHRzIG9uIG5lZ2F0aXZlIGlucHV0cy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgQk5fbW9kX211bCBzbyB0aGF0IHRoZSByZXN1bHQgaXMgYWx3YXlzIG5vbi1uZWdhdGl2ZS4KICAgICBQcmV2aW91c2x5LCBpdCBjb3VsZCBiZSBuZWdhdGl2ZSBpZiBvbmUgb2YgdGhlIGZhY3RvcnMgd2FzIG5lZ2F0aXZlOwogICAgIEkgZG9uJ3QgdGhpbmsgYW55b25lIHJlYWxseSB3YW50ZWQgdGhhdCBiZWhhdmlvdXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTW92ZSBCTl9tb2RfLi4uIGZ1bmN0aW9ucyBpbnRvIG5ldyBmaWxlIGNyeXB0by9ibi9ibl9tb2QuYwogICAgIChleGNlcHQgZm9yIGV4cG9uZW50aWF0aW9uLCB3aGljaCBzdGF5cyBpbiBjcnlwdG8vYm4vYm5fZXhwLmMsCiAgICAgYW5kIEJOX21vZF9tdWxfcmVjaXByb2NhbCwgd2hpY2ggc3RheXMgaW4gY3J5cHRvL2JuL2JuX3JlY3AuYykKICAgICBhbmQgYWRkIG5ldyBmdW5jdGlvbnM6CgogICAgICAgICAgQk5fbm5tb2QKICAgICAgICAgIEJOX21vZF9zcXIKICAgICAgICAgIEJOX21vZF9hZGQKICAgICAgICAgIEJOX21vZF9hZGRfcXVpY2sKICAgICAgICAgIEJOX21vZF9zdWIKICAgICAgICAgIEJOX21vZF9zdWJfcXVpY2sKICAgICAgICAgIEJOX21vZF9sc2hpZnQxCiAgICAgICAgICBCTl9tb2RfbHNoaWZ0MV9xdWljawogICAgICAgICAgQk5fbW9kX2xzaGlmdAogICAgICAgICAgQk5fbW9kX2xzaGlmdF9xdWljawoKICAgICBUaGVzZSBmdW5jdGlvbnMgYWx3YXlzIGdlbmVyYXRlIG5vbi1uZWdhdGl2ZSByZXN1bHRzLgoKICAgICBCTl9ubm1vZCBvdGhlcndpc2UgaXMgbGlrZSBCTl9tb2QgKGlmIEJOX21vZCBjb21wdXRlcyBhIHJlbWFpbmRlciAgcgogICAgIHN1Y2ggdGhhdCAgfG18IDwgciA8IDAsICBCTl9ubm1vZCB3aWxsIG91dHB1dCAgcmVtICsgfG18ICBpbnN0ZWFkKS4KCiAgICAgQk5fbW9kX1hYWF9xdWljayhyLCBhLCBbYixdIG0pIGdlbmVyYXRlcyB0aGUgc2FtZSByZXN1bHQgYXMKICAgICBCTl9tb2RfWFhYKHIsIGEsIFtiLF0gbSwgY3R4KSwgYnV0IHJlcXVpcmVzIHRoYXQgIGEgIFthbmQgIGJdCiAgICAgYmUgcmVkdWNlZCBtb2R1bG8gIG0uCiAgICAgW0xlbmthIEZpYmlrb3ZhIDxmaWJpa292YUBleHAtbWF0aC51bmktZXNzZW4uZGU+LCBCb2RvIE1vZWxsZXJdCgogICopIFJlbW92ZSBhIGZldyBjYWxscyB0byBibl93ZXhwYW5kKCkgaW4gQk5fc3FyKCkgKHRoZSBvbmUgaW4gdGhlcmUKICAgICB3YXMgYWN0dWFsbHkgbmV2ZXIgbmVlZGVkKSBhbmQgaW4gQk5fbXVsKCkuICBUaGUgcmVtb3ZhbCBpbiBCTl9tdWwoKQogICAgIHJlcXVpcmVkIGEgc21hbGwgY2hhbmdlIGluIGJuX211bF9wYXJ0X3JlY3Vyc2l2ZSgpIGFuZCB0aGUgYWRkaXRpb24KICAgICBvZiB0aGUgZnVuY3Rpb25zIGJuX2NtcF9wYXJ0X3dvcmRzKCksIGJuX3N1Yl9wYXJ0X3dvcmRzKCkgYW5kCiAgICAgYm5fYWRkX3BhcnRfd29yZHMoKSwgd2hpY2ggZG8gdGhlIHNhbWUgdGhpbmcgYXMgYm5fY21wX3dvcmRzKCksCiAgICAgYm5fc3ViX3dvcmRzKCkgYW5kIGJuX2FkZF93b3JkcygpIGV4Y2VwdCB0aGV5IHRha2UgYXJyYXlzIHdpdGgKICAgICBkaWZmZXJpbmcgc2l6ZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW4gJ29wZW5zc2wgcGFzc3dkJywgdmVyaWZ5IHBhc3N3b3JkcyByZWFkIGZyb20gdGhlIHRlcm1pbmFsCiAgICAgdW5sZXNzIHRoZSAnLXNhbHQnIG9wdGlvbiBpcyB1c2VkICh3aGljaCB1c3VhbGx5IG1lYW5zIHRoYXQKICAgICB2ZXJpZmljYXRpb24gd291bGQganVzdCB3YXN0ZSB1c2VyJ3MgdGltZSBzaW5jZSB0aGUgcmVzdWx0aW5nCiAgICAgaGFzaCBpcyBnb2luZyB0byBiZSBjb21wYXJlZCB3aXRoIHNvbWUgZ2l2ZW4gcGFzc3dvcmQgaGFzaCkKICAgICBvciB0aGUgbmV3ICctbm92ZXJpZnknIG9wdGlvbiBpcyB1c2VkLgoKICAgICBUaGlzIGlzIGFuIGluY29tcGF0aWJsZSBjaGFuZ2UsIGJ1dCBpdCBkb2VzIG5vdCBhZmZlY3QKICAgICBub24taW50ZXJhY3RpdmUgdXNlIG9mICdvcGVuc3NsIHBhc3N3ZCcgKHBhc3N3b3JkcyBvbiB0aGUgY29tbWFuZAogICAgIGxpbmUsICctc3RkaW4nIG9wdGlvbiwgJy1pbiAuLi4nIG9wdGlvbikgYW5kIHRodXMgc2hvdWxkIG5vdAogICAgIGNhdXNlIGFueSBwcm9ibGVtcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gUlNBcmVmLCBzaW5jZSB0aGVyZSdzIG5vIG1vcmUgbmVlZCBmb3IgaXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBEU08gbG9hZCBhbG9uZyBhIHBhdGggZ2l2ZW4gdGhyb3VnaCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQogICAgIChTSExJQl9QQVRIKSB3aXRoIHNobF9sb2FkKCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29uc3RpZnkgdGhlIEVOR0lORSBjb2RlIGFzIGEgcmVzdWx0IG9mIEJJR05VTSBjb25zdGlmaWNhdGlvbi4KICAgICBBbHNvIGNvbnN0aWZ5IHRoZSBSU0EgY29kZSBhbmQgbW9zdCB0aGluZ3MgcmVsYXRlZCB0byBpdC4gIEluIGEKICAgICBmZXcgcGxhY2VzLCBtb3N0IG5vdGFibGUgaW4gdGhlIGRlcHRoIG9mIHRoZSBBU04uMSBjb2RlLCB1Z2x5CiAgICAgY2FzdHMgYmFjayB0byBub24tY29uc3Qgd2VyZSByZXF1aXJlZCAodG8gYmUgc29sdmVkIGF0IGEgbGF0ZXIKICAgICB0aW1lKQogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgc28gdGhlIG9wZW5zc2wgYXBwbGljYXRpb24gaGFzIGFsbCBlbmdpbmVzIGxvYWRlZCBieSBkZWZhdWx0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENvbnN0aWZ5IHRoZSBCSUdOVU0gcm91dGluZXMgYSBsaXR0bGUgbW9yZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgoJRU5HSU5FX2xvYWRfY3N3aWZ0KCkKCUVOR0lORV9sb2FkX2NoaWwoKQoJRU5HSU5FX2xvYWRfYXRhbGxhKCkKCUVOR0lORV9sb2FkX251cm9uKCkKCUVOR0lORV9sb2FkX2J1aWx0aW5fZW5naW5lcygpCgogICAgIFRoYXQgd2F5LCBhbiBhcHBsaWNhdGlvbiBjYW4gaXRzZWxmIGNob29zZSBpZiBleHRlcm5hbCBlbmdpbmVzIHRoYXQKICAgICBhcmUgYnVpbHQtaW4gaW4gT3BlblNTTCBzaGFsbCBldmVyIGJlIHVzZWQgb3Igbm90LiAgVGhlIGJlbmVmaXQgaXMKICAgICB0aGF0IGFwcGxpY2F0aW9ucyB3b24ndCBoYXZlIHRvIGJlIGxpbmtlZCB3aXRoIGxpYmRsIG9yIG90aGVyIGRzbwogICAgIGxpYnJhcmllcyB1bmxlc3MgaXQncyByZWFsbHkgbmVlZGVkLgoKICAgICBDaGFuZ2VkICdvcGVuc3NsIGVuZ2luZScgdG8gbG9hZCBhbGwgZW5naW5lcyBvbiBkZW1hbmQuCiAgICAgQ2hhbmdlZCB0aGUgZW5naW5lIGhlYWRlciBmaWxlcyB0byBhdm9pZCB0aGUgZHVwbGljYXRpb24gb2Ygc29tZQogICAgIGRlY2xhcmF0aW9ucyAodGhleSBkaWZmZXJlZCEpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopICdvcGVuc3NsIGVuZ2luZScgY2FuIG5vdyBsaXN0IGNhcGFiaWxpdGllcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBCZXR0ZXIgZXJyb3IgcmVwb3J0aW5nIGluICdvcGVuc3NsIGVuZ2luZScuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV2ZXIgY2FsbCBsb2FkX2RoX3BhcmFtKE5VTEwpIGluIHNfc2VydmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBlbmdpbmUgYXBwbGljYXRpb24uICBJdCBjYW4gY3VycmVudGx5IGxpc3QgZW5naW5lcyBieSBuYW1lIGFuZAogICAgIGlkZW50aXR5LCBhbmQgdGVzdCBpZiB0aGV5IGFyZSBhY3R1YWxseSBhdmFpbGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgSW1wcm92ZSBSUE0gc3BlY2lmaWNhdGlvbiBmaWxlIGJ5IGZvcmNpbmcgc3ltYm9saWMgbGlua2luZyBhbmQgbWFraW5nCiAgICAgc3VyZSB0aGUgaW5zdGFsbGVkIGRvY3VtZW50YXRpb24gaXMgYWxzbyBvd25lZCBieSByb290LnJvb3QuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz5dCgogICopIEdpdmUgdGhlIE9wZW5TU0wgYXBwbGljYXRpb25zIG1vcmUgcG9zc2liaWxpdGllcyB0byBtYWtlIHVzZSBvZgogICAgIGtleXMgKHB1YmxpYyBhcyB3ZWxsIGFzIHByaXZhdGUpIGhhbmRsZWQgYnkgZW5naW5lcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgT0NTUCBjb2RlIHRoYXQgY29tZXMgZnJvbSBDZXJ0Q28uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIFZNUyBzdXBwb3J0IGZvciB0aGUgUmlqbmRhZWwgY29kZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGRlZCB1bnRlc3RlZCBzdXBwb3J0IGZvciBOdXJvbiBjcnlwdG8gYWNjZWxlcmF0b3IuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBleHRlcm5hbCBjcnlwdG9ncmFwaGljIGRldmljZXMuICBUaGlzIGNvZGUgd2FzCiAgICAgcHJldmlvdXNseSBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGFzIHRoZSAiZW5naW5lIiBicmFuY2guCiAgICAgW0dlb2ZmIFRob3JwZSwgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZXdvcmsgdGhlIGZpbGVuYW1lLXRyYW5zbGF0aW9uIGluIHRoZSBEU08gY29kZS4gSXQgaXMgbm93IHBvc3NpYmxlIHRvCiAgICAgaGF2ZSBmYXIgZ3JlYXRlciBjb250cm9sIG92ZXIgaG93IGEgIm5hbWUiIGlzIHR1cm5lZCBpbnRvIGEgZmlsZW5hbWUKICAgICBkZXBlbmRpbmcgb24gdGhlIG9wZXJhdGluZyBlbnZpcm9ubWVudCBhbmQgYW55IG9kZGl0aWVzIGFib3V0IHRoZQogICAgIGRpZmZlcmVudCBzaGFyZWQgbGlicmFyeSBmaWxlbmFtZXMgb24gZWFjaCBzeXN0ZW0uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgU3VwcG9ydCB0aHJlYWRzIG9uIEZyZWVCU0QtZWxmIGluIENvbmZpZ3VyZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggZm9yIFNIQTEgYXNzZW1ibHkgcHJvYmxlbSB3aXRoIE1BU006IGl0IHByb2R1Y2VzCiAgICAgd2FybmluZ3MgYWJvdXQgY29ycnVwdCBsaW5lIG51bWJlciBpbmZvcm1hdGlvbiB3aGVuIGFzc2VtYmxpbmcKICAgICB3aXRoIGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4gVGhpcyBpcyBjYXVzZWQgYnkgdGhlIG92ZXJsYXBwaW5nCiAgICAgb2YgdHdvIHNlY3Rpb25zLgogICAgIFtCZXJuZCBNYXR0aGVzIDxtYWluYnVnQGNlbG9jb20uZGU+LCBTdGV2ZSBIZW5zb25dCgogICopIE5DT05GIGNoYW5nZXMuCiAgICAgTkNPTkZfZ2V0X251bWJlcigpIGhhcyBubyBlcnJvciBjaGVja2luZyBhdCBhbGwuICBBcyBhIHJlcGxhY2VtZW50LAogICAgIE5DT05GX2dldF9udW1iZXJfZSgpIGlzIGRlZmluZWQgKF9lIGZvciAiZXJyb3IgY2hlY2tpbmciKSBhbmQgaXMKICAgICBwcm9tb3RlZCBzdHJvbmdseS4gIFRoZSBvbGQgTkNPTkZfZ2V0X251bWJlciBpcyBrZXB0IGFyb3VuZCBmb3IKICAgICBiaW5hcnkgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KICAgICBNYWtlIGl0IHBvc3NpYmxlIGZvciBtZXRob2RzIHRvIGxvYWQgZnJvbSBzb21ldGhpbmcgb3RoZXIgdGhhbiBhIEJJTywKICAgICBieSBwcm92aWRpbmcgYSBmdW5jdGlvbiBwb2ludGVyIHRoYXQgaXMgZ2l2ZW4gYSBuYW1lIGluc3RlYWQgb2YgYSBCSU8uCiAgICAgRm9yIGV4YW1wbGUsIHRoaXMgY291bGQgYmUgdXNlZCB0byBsb2FkIGNvbmZpZ3VyYXRpb24gZGF0YSBmcm9tIGFuCiAgICAgTERBUCBzZXJ2ZXIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRml4IGZvciBub24gYmxvY2tpbmcgYWNjZXB0IEJJT3MuIEFkZGVkIG5ldyBJL08gc3BlY2lhbCByZWFzb24KICAgICBCSU9fUlJfQUNDRVBUIHRvIGNvdmVyIHRoaXMgY2FzZS4gUHJldmlvdXNseSB1c2Ugb2YgYWNjZXB0IEJJT3MKICAgICB3aXRoIG5vbiBibG9ja2luZyBJL08gd2FzIG5vdCBwb3NzaWJsZSBiZWNhdXNlIG5vIHJldHJ5IGNvZGUgd2FzCiAgICAgaW1wbGVtZW50ZWQuIEFsc28gYWRkZWQgbmV3IFNTTCBjb2RlIFNTTF9XQU5UX0FDQ0VQVCB0byBjb3ZlcgogICAgIHRoaXMgY2FzZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCB0aGUgYmVnaW5uaW5ncyBvZiBSaWpuZGFlbCBzdXBwb3J0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggZm9yIGJ1ZyBpbiBEaXJlY3RvcnlTdHJpbmcgbWFzayBzZXR0aW5nLiBBZGQgc3VwcG9ydCBmb3IKICAgICBYNTA5X05BTUVfcHJpbnRfZXgoKSBpbiAncmVxJyBhbmQgWDUwOV9wcmludF9leCgpIGZ1bmN0aW9uCiAgICAgdG8gYWxsb3cgY2VydGlmaWNhdGUgcHJpbnRpbmcgdG8gbW9yZSBjb250cm9sbGFibGUsIGFkZGl0aW9uYWwKICAgICAnY2VydG9wdCcgb3B0aW9uIHRvICd4NTA5JyB0byBhbGxvdyBuZXcgcHJpbnRpbmcgb3B0aW9ucyB0byBiZQogICAgIHNldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbiBvbGQgRUFZIE1ENSBoYWNrIGZyb20gZV9vcy5oLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ZyBhbmQgMC45LjZoICBbNSBEZWMgMjAwMl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9QRU5TU0xfY2xlYW5zZSgpLCB3aGljaCBpcyB1c2VkIHRvIGNsZWFuc2UgYSBzZWN0aW9uIG9mCiAgICAgbWVtb3J5IGZyb20gaXQncyBjb250ZW50cy4gIFRoaXMgaXMgZG9uZSB3aXRoIGEgY291bnRlciB0aGF0IHdpbGwKICAgICBwbGFjZSBhbHRlcm5hdGluZyB2YWx1ZXMgaW4gZWFjaCBieXRlLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzb2x2ZQogICAgIHR3byBpc3N1ZXM6IDEpIHRoZSByZW1vdmFsIG9mIGNhbGxzIHRvIG1lbXNldCgpIGJ5IGhpZ2hseSBvcHRpbWl6aW5nCiAgICAgY29tcGlsZXJzLCBhbmQgMikgY2xlYW5zaW5nIHdpdGggb3RoZXIgdmFsdWVzIHRoYW4gMCwgc2luY2UgdGhvc2UgY2FuCiAgICAgYmUgcmVhZCB0aHJvdWdoIG9uIGNlcnRhaW4gbWVkaWEsIGZvciBleGFtcGxlIGEgc3dhcCBzcGFjZSBvbiBkaXNrLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEJ1Z2ZpeDogY2xpZW50IHNpZGUgc2Vzc2lvbiBjYWNoaW5nIGRpZCBub3Qgd29yayB3aXRoIGV4dGVybmFsIGNhY2hpbmcsCiAgICAgYmVjYXVzZSB0aGUgc2Vzc2lvbi0+Y2lwaGVyIHNldHRpbmcgd2FzIG5vdCByZXN0b3JlZCB3aGVuIHJlbG9hZGluZwogICAgIGZyb20gdGhlIGV4dGVybmFsIGNhY2hlLiBUaGlzIHByb2JsZW0gd2FzIG1hc2tlZCwgd2hlbgogICAgIFNTTF9PUF9ORVRTQ0FQRV9SRVVTRV9DSVBIRVJfQ0hBTkdFX0JVRyAocGFydCBvZiBTU0xfT1BfQUxMKSB3YXMgc2V0LgogICAgIChGb3VuZCBieSBTdGV2ZSBIYXNsYW0gPHN0ZXZlQGFyYXFuaWQuZGR0cy5uZXQ+LikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGNsaWVudF9jZXJ0aWZpY2F0ZSAoc3NsL3MyX2NsbnQuYyk6IFRoZSBwZXJtaXNzaWJsZSB0b3RhbAogICAgIGxlbmd0aCBvZiB0aGUgUkVRVUVTVC1DRVJUSUZJQ0FURSBtZXNzYWdlIGlzIDE4IC4uIDM0LCBub3QgMTcgLi4gMzMuCiAgICAgW1plZXYgTGllYmVyIDx6ZWV2LWxAeWFob28uY29tPl0KCiAgKikgVW5kbyBhbiB1bmRvY3VtZW50ZWQgY2hhbmdlIGludHJvZHVjZWQgaW4gMC45LjZlIHdoaWNoIGNhdXNlZAogICAgIHJlcGVhdGVkIGNhbGxzIHRvIE9wZW5TU0xfYWRkX2FsbF9jaXBoZXJzKCkgYW5kIAogICAgIE9wZW5TU0xfYWRkX2FsbF9kaWdlc3RzKCkgdG8gYmUgaWdub3JlZCwgZXZlbiBhZnRlciBjYWxsaW5nCiAgICAgRVZQX2NsZWFudXAoKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiByZWFkZXIgdG8gZGVhbCB3aXRoIGxhc3QgbGluZSBub3QKICAgICBiZWluZyBwcm9wZXJseSB0ZXJtaW5hdGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSBYNTA5X05BTUVfY21wKCkgc28gaXQgYXBwbGllcyB0aGUgc3BlY2lhbCBydWxlcyBvbiBoYW5kbGluZwogICAgIEROIHZhbHVlcyB0aGF0IGFyZSBvZiB0eXBlIFByaW50YWJsZVN0cmluZywgYXMgd2VsbCBhcyBSRE5zIG9mIHR5cGUKICAgICBlbWFpbEFkZHJlc3Mgd2hlcmUgdGhlIHZhbHVlIGhhcyB0aGUgdHlwZSBpYTVTdHJpbmcuCiAgICAgW3N0ZWZhbmtAdmFsaWNlcnQuY29tIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBhIFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX1NUT1JFIGZsYWcgdG8gdGFrZSBvdmVyIGhhbGYKICAgICB0aGUgam9iIFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX0xPT0tVUCB3YXMgaW5jb25zaXN0ZW50bHkKICAgICBkb2luZywgZGVmaW5lIGEgbmV3IGZsYWcgKFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMKSB0byBiZQogICAgIHRoZSBiaXR3aXNlLU9SIG9mIHRoZSB0d28gZm9yIHVzZSBieSB0aGUgbWFqb3JpdHkgb2YgYXBwbGljYXRpb25zCiAgICAgd2FudGluZyB0aGlzIGJlaGF2aW91ciwgYW5kIHVwZGF0ZSB0aGUgZG9jcy4gVGhlIGRvY3VtZW50ZWQKICAgICBiZWhhdmlvdXIgYW5kIGFjdHVhbCBiZWhhdmlvdXIgd2VyZSBpbmNvbnNpc3RlbnQgYW5kIGhhZCBiZWVuCiAgICAgY2hhbmdpbmcgYW55d2F5LCBzbyB0aGlzIGlzIG1vcmUgYSBidWctZml4IHRoYW4gYSBiZWhhdmlvdXJhbAogICAgIGNoYW5nZS4KICAgICBbR2VvZmYgVGhvcnBlLCBkaWFnbm9zZWQgYnkgTmFkYXYgSGFyJ0VsXQoKICAqKSBEb24ndCBpbXBvc2UgYSAxNi1ieXRlIGxlbmd0aCBtaW5pbXVtIG9uIHNlc3Npb24gSURzIGluIHNzbC9zM19jbG50LmMKICAgICAodGhlIFNTTCAzLjAgYW5kIFRMUyAxLjAgc3BlY2lmaWNhdGlvbnMgYWxsb3cgYW55IGxlbmd0aCB1cCB0byAzMiBieXRlcykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGluaXRpYWxpemF0aW9uIGNvZGUgcmFjZSBjb25kaXRpb25zIGluCiAgICAgICAgU1NMdjIzX21ldGhvZCgpLCAgU1NMdjIzX2NsaWVudF9tZXRob2QoKSwgICBTU0x2MjNfc2VydmVyX21ldGhvZCgpLAogICAgICAgIFNTTHYyX21ldGhvZCgpLCAgIFNTTHYyX2NsaWVudF9tZXRob2QoKSwgICAgU1NMdjJfc2VydmVyX21ldGhvZCgpLAogICAgICAgIFNTTHYzX21ldGhvZCgpLCAgIFNTTHYzX2NsaWVudF9tZXRob2QoKSwgICAgU1NMdjNfc2VydmVyX21ldGhvZCgpLAogICAgICAgIFRMU3YxX21ldGhvZCgpLCAgIFRMU3YxX2NsaWVudF9tZXRob2QoKSwgICAgVExTdjFfc2VydmVyX21ldGhvZCgpLAogICAgICAgIHNzbDJfZ2V0X2NpcGhlcl9ieV9jaGFyKCksCiAgICAgICAgc3NsM19nZXRfY2lwaGVyX2J5X2NoYXIoKS4KICAgICBbUGF0cmljayBNY0Nvcm1pY2sgPHBhdHJpY2tAdGVsbG1lLmNvbT4sIEJvZG8gTW9lbGxlcl0KCiAgKikgUmVvcmRlciBjbGVhbnVwIHNlcXVlbmNlIGluIFNTTF9DVFhfZnJlZSgpOiBvbmx5IHJlbW92ZSB0aGUgZXhfZGF0YSBhZnRlcgogICAgIHRoZSBjYWNoZWQgc2Vzc2lvbnMgYXJlIGZsdXNoZWQsIGFzIHRoZSByZW1vdmVfY2IoKSBtaWdodCB1c2UgZXhfZGF0YQogICAgIGNvbnRlbnRzLiBCdWcgZm91bmQgYnkgU2FtIFZhcnNoYXZjaGlrIDxtcnNhbUBjb3VyaWVyLW10YS5jb20+CiAgICAgKHNlZSBbb3BlbnNzbC5vcmcgIzIxMl0pLgogICAgIFtHZW9mZiBUaG9ycGUsIEx1dHogSmFlbmlja2VdCgogICopIEZpeCB0eXBvIGluIE9CSl90eHQyb2JqIHdoaWNoIGluY29ycmVjdGx5IHBhc3NlZCB0aGUgY29udGVudAogICAgIGxlbmd0aCwgaW5zdGVhZCBvZiB0aGUgZW5jb2RpbmcgbGVuZ3RoIHRvIGQyaV9BU04xX09CSkVDVC4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmYgYW5kIDAuOS42ZyAgWzkgQXVnIDIwMDJdCgogICopIFtJbiAwLjkuNmctZW5naW5lIHJlbGVhc2U6XQogICAgIEZpeCBjcnlwdG8vZW5naW5lL3ZlbmRvcl9kZWZucy9jc3dpZnQuaCBmb3IgV0lOMzIgKHVzZSAnX3N0ZGNhbGwnKS4KICAgICBbTHlubiBHYXppcyA8bGdhemlzQHJhaW5ib3cuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZlIGFuZCAwLjkuNmYgIFs4IEF1ZyAyMDAyXQoKICAqKSBGaXggQVNOMSBjaGVja3MuIENoZWNrIGZvciBvdmVyZmxvdyBieSBjb21wYXJpbmcgd2l0aCBMT05HX01BWAogICAgIGFuZCBnZXQgZml4IHRoZSBoZWFkZXIgbGVuZ3RoIGNhbGN1bGF0aW9uLgogICAgIFtGbG9yaWFuIFdlaW1lciA8V2VpbWVyQENFUlQuVW5pLVN0dXR0Z2FydC5ERT4sCglBbG9uIEthbnRvciA8YWxvbmtAY2hlY2twb2ludC5jb20+IChhbmQgb3RoZXJzKSwKCVN0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIHByb3BlciBlcnJvciBoYW5kbGluZyBpbnN0ZWFkIG9mICdhc3NlcnRpb25zJyBpbiBidWZmZXIKICAgICBvdmVyZmxvdyBjaGVja3MgYWRkZWQgaW4gMC45LjZlLiAgVGhpcyBwcmV2ZW50cyBEb1MgKHRoZQogICAgIGFzc2VydGlvbnMgY291bGQgY2FsbCBhYm9ydCgpKS4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPiwgQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmQgYW5kIDAuOS42ZSAgWzMwIEp1bCAyMDAyXQoKICAqKSBBZGQgdmFyaW91cyBzYW5pdHkgY2hlY2tzIHRvIGFzbjFfZ2V0X2xlbmd0aCgpIHRvIHJlamVjdAogICAgIHRoZSBBU04xIGxlbmd0aCBieXRlcyBpZiB0aGV5IGV4Y2VlZCBzaXplb2YobG9uZyksIHdpbGwgYXBwZWFyCiAgICAgbmVnYXRpdmUgb3IgdGhlIGNvbnRlbnQgbGVuZ3RoIGV4Y2VlZHMgdGhlIGxlbmd0aCBvZiB0aGUKICAgICBzdXBwbGllZCBidWZmZXIuCiAgICAgW1N0ZXZlIEhlbnNvbiwgQWRpIFN0YXYgPHN0YXZAbWVyY3VyeS5jby5pbD4sIEphbWVzIFlvbmFuIDxqaW1AbnRscC5jb20+XQoKICAqKSBGaXggY2lwaGVyIHNlbGVjdGlvbiByb3V0aW5lczogY2lwaGVycyB3aXRob3V0IGVuY3J5cHRpb24gaGFkIG5vIGZsYWdzCiAgICAgZm9yIHRoZSBjaXBoZXIgc3RyZW5ndGggc2V0IGFuZCB3aGVyZSB0aGVyZWZvcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5CiAgICAgYnkgdGhlIHNlbGVjdGlvbiByb3V0aW5lcyAoUFIgIzEzMCkuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBFVlBfZHNhX3NoYSBtYWNyby4KICAgICBbTmlscyBMYXJzY2hdCgogICopIE5ldyBvcHRpb24KICAgICAgICAgIFNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMKICAgICBmb3IgZGlzYWJsaW5nIHRoZSBTU0wgMy4wL1RMUyAxLjAgQ0JDIHZ1bG5lcmFiaWxpdHkgY291bnRlcm1lYXN1cmUKICAgICB0aGF0IHdhcyBhZGRlZCBpbiBPcGVuU1NMIDAuOS42ZC4KCiAgICAgQXMgdGhlIGNvdW50ZXJtZWFzdXJlIHR1cm5lZCBvdXQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggc29tZQogICAgIGJyb2tlbiBTU0wgaW1wbGVtZW50YXRpb25zLCB0aGUgbmV3IG9wdGlvbiBpcyBwYXJ0IG9mIFNTTF9PUF9BTEwuCiAgICAgU1NMX09QX0FMTCBpcyB1c3VhbGx5IGVtcGxveWVkIHdoZW4gY29tcGF0aWJpbGl0eSB3aXRoIHdlaXJkIFNTTAogICAgIGltcGxlbWVudGF0aW9ucyBpcyBkZXNpcmVkIChlLmcuICctYnVncycgb3B0aW9uIHRvICdzX2NsaWVudCcgYW5kCiAgICAgJ3Nfc2VydmVyJyksIHNvIHRoZSBuZXcgb3B0aW9uIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGluIG1hbnkKICAgICBhcHBsaWNhdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlcyBpbiBzZWN1cml0eSBwYXRjaDoKCiAgICAgQ2hhbmdlcyBtYXJrZWQgIihDSEFUUykiIHdlcmUgc3BvbnNvcmVkIGJ5IHRoZSBEZWZlbnNlIEFkdmFuY2VkCiAgICAgUmVzZWFyY2ggUHJvamVjdHMgQWdlbmN5IChEQVJQQSkgYW5kIEFpciBGb3JjZSBSZXNlYXJjaCBMYWJvcmF0b3J5LAogICAgIEFpciBGb3JjZSBNYXRlcmllbCBDb21tYW5kLCBVU0FGLCB1bmRlciBhZ3JlZW1lbnQgbnVtYmVyCiAgICAgRjMwNjAyLTAxLTItMDUzNy4KCiAgKikgQWRkIHZhcmlvdXMgc2FuaXR5IGNoZWNrcyB0byBhc24xX2dldF9sZW5ndGgoKSB0byByZWplY3QKICAgICB0aGUgQVNOMSBsZW5ndGggYnl0ZXMgaWYgdGhleSBleGNlZWQgc2l6ZW9mKGxvbmcpLCB3aWxsIGFwcGVhcgogICAgIG5lZ2F0aXZlIG9yIHRoZSBjb250ZW50IGxlbmd0aCBleGNlZWRzIHRoZSBsZW5ndGggb2YgdGhlCiAgICAgc3VwcGxpZWQgYnVmZmVyLiAoQ0FOLTIwMDItMDY1OSkKICAgICBbU3RldmUgSGVuc29uLCBBZGkgU3RhdiA8c3RhdkBtZXJjdXJ5LmNvLmlsPiwgSmFtZXMgWW9uYW4gPGppbUBudGxwLmNvbT5dCgogICopIEFzc2VydGlvbnMgZm9yIHZhcmlvdXMgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvd3MsIG5vdCBrbm93biB0bwogICAgIGhhcHBlbiBpbiBwcmFjdGljZS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBWYXJpb3VzIHRlbXBvcmFyeSBidWZmZXJzIHRvIGhvbGQgQVNDSUkgdmVyc2lvbnMgb2YgaW50ZWdlcnMgd2VyZQogICAgIHRvbyBzbWFsbCBmb3IgNjQgYml0IHBsYXRmb3Jtcy4gKENBTi0yMDAyLTA2NTUpCiAgICAgW01hdHRoZXcgQnluZy1NYWRkaWNrIDxtYm1AYWxkaWdpdGFsLmNvLnVrPiBhbmQgQmVuIExhdXJpZSAoQ0hBVFMpPgoKICAqKSBSZW1vdGUgYnVmZmVyIG92ZXJmbG93IGluIFNTTDMgcHJvdG9jb2wgLSBhbiBhdHRhY2tlciBjb3VsZAogICAgIHN1cHBseSBhbiBvdmVyc2l6ZWQgc2Vzc2lvbiBJRCB0byBhIGNsaWVudC4gKENBTi0yMDAyLTA2NTYpCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgUmVtb3RlIGJ1ZmZlciBvdmVyZmxvdyBpbiBTU0wyIHByb3RvY29sIC0gYW4gYXR0YWNrZXIgY291bGQKICAgICBzdXBwbHkgYW4gb3ZlcnNpemVkIGNsaWVudCBtYXN0ZXIga2V5LiAoQ0FOLTIwMDItMDY1NikKICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmMgYW5kIDAuOS42ZCAgWzkgTWF5IDIwMDJdCgogICopIEZpeCBjcnlwdG8vYXNuMS9hX3NpZ24uYyBzbyB0aGF0ICdwYXJhbWV0ZXJzJyBpcyBvbWl0dGVkIChub3QKICAgICBlbmNvZGVkIGFzIE5VTEwpIHdpdGggaWQtZHNhLXdpdGgtc2hhMS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT47IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGVjayB2YXJpb3VzIFg1MDlfLi4uKCkgcmV0dXJuIHZhbHVlcyBpbiBhcHBzL3JlcS5jLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgRml4IEJBU0U2NCBkZWNvZGUgKEVWUF9EZWNvZGVVcGRhdGUpIGZvciBkYXRhIHdpdGggQ1IvTEYgZW5kZWQgbGluZXM6CiAgICAgYW4gZW5kLW9mLWZpbGUgY29uZGl0aW9uIHdvdWxkIGVycm9ub3VzbHkgYmUgZmxhZ2dlZCwgd2hlbiB0aGUgQ1JMRgogICAgIHdhcyBqdXN0IGF0IHRoZSBlbmQgb2YgYSBwcm9jZXNzZWQgYmxvY2suIFRoZSBidWcgd2FzIGRpc2NvdmVyZWQgd2hlbgogICAgIHByb2Nlc3NpbmcgZGF0YSB0aHJvdWdoIGEgYnVmZmVyaW5nIG1lbW9yeSBCSU8gaGFuZGluZyB0aGUgZGF0YSB0byBhCiAgICAgQkFTRTY0LWRlY29kaW5nIEJJTy4gQnVnIGZ1bmQgYW5kIHBhdGNoIHN1Ym1pdHRlZCBieSBQYXZlbCBUc2Vrb3YKICAgICA8cHRzZWtvdkBzeW50cmV4LmNvbT4gYW5kIE5lZGVsY2hvIFN0YW5ldi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW1wbGVtZW50IGEgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBhIHZ1bG5lcmFiaWxpdHkgcmVjZW50bHkgZm91bmQKICAgICBpbiBDQkMgY2lwaGVyc3VpdGVzIGluIFNTTCAzLjAvVExTIDEuMDogU2VuZCBhbiBlbXB0eSBmcmFnbWVudAogICAgIGJlZm9yZSBhcHBsaWNhdGlvbiBkYXRhIGNodW5rcyB0byBhdm9pZCB0aGUgdXNlIG9mIGtub3duIElWcwogICAgIHdpdGggZGF0YSBwb3RlbnRpYWxseSBjaG9zZW4gYnkgdGhlIGF0dGFja2VyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBsZW5ndGggY2hlY2tzIGluIHNzbDNfZ2V0X2NsaWVudF9oZWxsbygpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRMUy9TU0wgbGlicmFyeSBidWdmaXg6IHVzZSBzLT5zMy0+aW5fcmVhZF9hcHBfZGF0YSBkaWZmZXJlbnRseQogICAgIHRvIHByZXZlbnQgc3NsM19yZWFkX2ludGVybmFsKCkgZnJvbSBpbmNvcnJlY3RseSBhc3N1bWluZyB0aGF0CiAgICAgc3NsM19yZWFkX2J5dGVzKCkgZm91bmQgYXBwbGljYXRpb24gZGF0YSB3aGlsZSBoYW5kc2hha2UKICAgICBwcm9jZXNzaW5nIHdhcyBlbmFibGVkIHdoZW4gaW4gZmFjdCBzLT5zMy0+aW5fcmVhZF9hcHBfZGF0YSB3YXMKICAgICBtZXJlbHkgYXV0b21hdGljYWxseSBjbGVhcmVkIGR1cmluZyB0aGUgaW5pdGlhbCBoYW5kc2hha2UuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBGaXggb2JqZWN0IGRlZmluaXRpb25zIGZvciBQcml2YXRlIGFuZCBFbnRlcnByaXNlOiB0aGV5IHdlcmUgbm90CiAgICAgcmVjb2duaXplZCBpbiB0aGVpciBzaG9ydG5hbWUgKD1sb3dlcmNhc2UpIHJlcHJlc2VudGF0aW9uLiBFeHRlbmQKICAgICBvYmpfZGF0LnBsIHRvIGlzc3VlIGFuIGVycm9yIHdoZW4gdXNpbmcgdW5kZWZpbmVkIGtleXdvcmRzIGluc3RlYWQKICAgICBvZiBzaWxlbnRseSBpZ25vcmluZyB0aGUgcHJvYmxlbSAoU3Zlbm5pbmcgU29yZW5zZW4KICAgICA8c3NzQHNzcy5kbnNhbGlhcy5uZXQ+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IERIX2dlbmVyYXRlX3BhcmFtZXRlcnMoKSBzbyB0aGF0IGl0IHdvcmtzIGZvciAnbm9uLXN0YW5kYXJkJwogICAgIGdlbmVyYXRvcnMsIGkuZS4gZ2VuZXJhdG9ycyBvdGhlciB0aGFuIDIgYW5kIDUuICAoUHJldmlvdXNseSwgdGhlCiAgICAgY29kZSBkaWQgbm90IHByb3Blcmx5IGluaXRpYWxpc2UgdGhlICdhZGQnIGFuZCAncmVtJyB2YWx1ZXMgdG8KICAgICBCTl9nZW5lcmF0ZV9wcmltZSgpLikKCiAgICAgSW4gdGhlIG5ldyBnZW5lcmFsIGNhc2UsIHdlIGRvIG5vdCBpbnNpc3QgdGhhdCAnZ2VuZXJhdG9yJyBpcwogICAgIGFjdHVhbGx5IGEgcHJpbWl0aXZlIHJvb3Q6IFRoaXMgcmVxdWlyZW1lbnQgaXMgcmF0aGVyIHBvaW50bGVzczsKICAgICBhIGdlbmVyYXRvciBvZiB0aGUgb3JkZXItcSBzdWJncm91cCBpcyBqdXN0IGFzIGdvb2QsIGlmIG5vdAogICAgIGJldHRlci4KICAgICBbQm9kbyBNb2VsbGVyXQogCiAgKikgTWFwIG5ldyBYNTA5IHZlcmlmaWNhdGlvbiBlcnJvcnMgdG8gYWxlcnRzLiBEaXNjb3ZlcmVkIGFuZCBzdWJtaXR0ZWQgYnkKICAgICBUb20gV3UgPHRvbUBhcmNvdC5jb20+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggc3NsM19wZW5kaW5nKCkgKHNzbC9zM19saWIuYykgdG8gcHJldmVudCBTU0xfcGVuZGluZygpIGZyb20KICAgICByZXR1cm5pbmcgbm9uLXplcm8gYmVmb3JlIHRoZSBkYXRhIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVjZWl2ZWQKICAgICB3aGVuIHVzaW5nIG5vbi1ibG9ja2luZyBJL08uCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBKb2huIEh1Z2hlc10KCiAgKikgU29tZSBvZiB0aGUgY2lwaGVycyBtaXNzZWQgdGhlIHN0cmVuZ3RoIGVudHJ5IChTU0xfTE9XIGV0YykuCiAgICAgW0JlbiBMYXVyaWUsIEx1dHogSmFlbmlja2VdCgogICopIEZpeCBidWcgaW4gU1NMX2NsZWFyKCk6IGJhZCBzZXNzaW9ucyB3ZXJlIG5vdCByZW1vdmVkIChmb3VuZCBieQogICAgIFlvcmFtIFphaGF2aSA8WW9yYW1aQGdpbGlhbi5jb20+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIGluZm9ybWF0aW9uIGFib3V0IEN5Z1dpbiAxLjMgYW5kIG9uLCBhbmQgcHJlc2VydmUgcHJvcGVyCiAgICAgY29uZmlndXJhdGlvbiBmb3IgdGhlIHZlcnNpb25zIGJlZm9yZSB0aGF0LgogICAgIFtDb3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIHJlbW92YWwgZnJvbSBzZXNzaW9uIGNhY2hlIChTU0xfQ1RYX3JlbW92ZV9zZXNzaW9uKCkpIG1vcmUgcm9idXN0OgogICAgIGNoZWNrIHdoZXRoZXIgd2UgZGVhbCB3aXRoIGEgY29weSBvZiBhIHNlc3Npb24gYW5kIGRvIG5vdCBkZWxldGUgZnJvbQogICAgIHRoZSBjYWNoZSBpbiB0aGlzIGNhc2UuIFByb2JsZW0gcmVwb3J0ZWQgYnkgIkl6aGFyIFNob3NoYW5pIExldmkiCiAgICAgPGl6aGFyQGNoZWNrcG9pbnQuY29tPi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRG8gbm90IHN0b3JlIHNlc3Npb24gZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCBzZXNzaW9uIGNhY2hlLCBpZiBpdAogICAgIGlzIG5ldmVyIGludGVuZGVkIHRvIGJlIGxvb2tlZCB1cCAoU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQCiAgICAgZmxhZyBpcyBzZXQpLiBQcm9wb3NlZCBieSBBc2xhbSA8YXNsYW1AZnVuay5jb20+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBIYXZlIEFTTjFfQklUX1NUUklOR19zZXRfYml0KCkgcmVhbGx5IGNsZWFyIGEgYml0IHdoZW4gdGhlIHJlcXVlc3RlZAogICAgIHZhbHVlIGlzIDAuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgW0luIDAuOS42ZC1lbmdpbmUgcmVsZWFzZTpdCiAgICAgRml4IGEgY3Jhc2hidWcgYW5kIGEgbG9naWMgYnVnIGluIGh3Y3Joa19sb2FkX3B1YmtleSgpLgogICAgIFtUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBjb25maWd1cmF0aW9uIHRhcmdldCBsaW51eC1zMzkweC4KICAgICBbTmVhbGUgRmVyZ3Vzb24gPE5lYWxlLkZlcmd1c29uQFNvZnR3YXJlQUctVVNBLmNvbT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGhlIGVhcmxpZXIgYnVnZml4IGZvciB0aGUgU1NMM19TVF9TV19IRUxMT19SRVFfQyBjYXNlIG9mCiAgICAgc3NsM19hY2NlcHQgKHNzbC9zM19zcnZyLmMpIGluY29ycmVjdGx5IHVzZWQgYSBsb2NhbCBmbGFnCiAgICAgdmFyaWFibGUgYXMgYW4gaW5kaWNhdGlvbiB0aGF0IGEgQ2xpZW50SGVsbG8gbWVzc2FnZSBoYXMgYmVlbgogICAgIHJlY2VpdmVkLiAgQXMgdGhlIGZsYWcgdmFsdWUgd2lsbCBiZSBsb3N0IGJldHdlZW4gbXVsdGlwbGUKICAgICBpbnZvY2F0aW9ucyBvZiBzc2wzX2FjY2VwdCB3aGVuIHVzaW5nIG5vbi1ibG9ja2luZyBJL08sIHRoZQogICAgIGZ1bmN0aW9uIG1heSBub3QgYmUgYXdhcmUgdGhhdCBhIGhhbmRzaGFrZSBoYXMgYWN0dWFsbHkgdGFrZW4KICAgICBwbGFjZSwgdGh1cyBwcmV2ZW50aW5nIGEgbmV3IHNlc3Npb24gZnJvbSBiZWluZyBhZGRlZCB0byB0aGUKICAgICBzZXNzaW9uIGNhY2hlLgoKICAgICBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIG5vdyBzZXQgcy0+bmV3X3Nlc3Npb24gdG8gMiBpbnN0ZWFkIG9mCiAgICAgdXNpbmcgYSBsb2NhbCB2YXJpYWJsZS4KICAgICBbTHV0eiBKYWVuaWNrZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXg6IFJldHVybiAtMSBmcm9tIHNzbDNfZ2V0X3NlcnZlcl9kb25lIChzc2wzL3MzX2NsbnQuYykKICAgICBpZiB0aGUgU1NMX1JfTEVOR1RIX01JU01BVENIIGVycm9yIGlzIGRldGVjdGVkLgogICAgIFtHZW9mZiBUaG9ycGUsIEJvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICdzaGFyZWRfbGRmbGFnJyBjb2x1bW4gaW4gQ29uZmlndXJlIHBsYXRmb3JtIHRhYmxlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBFVlBfQ0lQSEVSX21vZGUgbWFjcm8uCiAgICAgWyJEYW4gUy4gQ2FtcGVyIiA8ZGFuQGJ0aS5uZXQ+XQoKICAqKSBGaXggc3NsM19yZWFkX2J5dGVzIChzc2wvczNfcGt0LmMpOiBUbyBpZ25vcmUgbWVzc2FnZXMgb2YgdW5rbm93bgogICAgIHR5cGUsIHdlIG11c3QgdGhyb3cgdGhlbSBhd2F5IGJ5IHNldHRpbmcgcnItPmxlbmd0aCB0byAwLgogICAgIFtEIFAgQ2hhbmcgPGRwY0BxdWFseXMuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZiIGFuZCAwLjkuNmMgIFsyMSBkZWMgMjAwMV0KCiAgKikgRml4IEJOX3JhbmRfcmFuZ2UgYnVnIHBvaW50ZWQgb3V0IGJ5IERvbWluaWt1cyBTY2hlcmtsCiAgICAgPERvbWluaWt1cy5TY2hlcmtsQGJpb2RhdGEuY29tPi4gIChUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24KICAgICB3b3JrZWQgaW5jb3JyZWN0bHkgZm9yIHRob3NlIGNhc2VzIHdoZXJlICByYW5nZSA9IDEwLi4uXzIgIGFuZAogICAgIDMqcmFuZ2UgIGlzIHR3byBiaXRzIGxvbmdlciB0aGFuICByYW5nZS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgT25seSBhZGQgc2lnbmluZyB0aW1lIHRvIFBLQ1M3IHN0cnVjdHVyZXMgaWYgaXQgaXMgbm90IGFscmVhZHkKICAgICBwcmVzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBjcnlwdG8vb2JqZWN0cy9vYmplY3RzLmg6ICJsZC1jZSIgc2hvdWxkIGJlICJpZC1jZSIsCiAgICAgT0JKX2xkX2NlIHNob3VsZCBiZSBPQkpfaWRfY2UuCiAgICAgQWxzbyBzb21lIGlwLXBkYSBPSURzIGluIGNyeXB0by9vYmplY3RzL29iamVjdHMudHh0IHdlcmUKICAgICBpbmNvcnJlY3QgKGNmLiBSRkMgMzAzOSkuCiAgICAgW01hdHQgQ29vcGVyLCBGcmVkZXJpYyBHaXVkaWNlbGxpLCBCb2RvIE1vZWxsZXJdCgogICopIFJlbGVhc2UgQ1JZUFRPX0xPQ0tfRFlOTE9DSyB3aGVuIENSWVBUT19kZXN0cm95X2R5bmxvY2tpZCgpCiAgICAgcmV0dXJucyBlYXJseSBiZWNhdXNlIGl0IGhhcyBub3RoaW5nIHRvIGRvLgogICAgIFtBbmR5IFNjaG5laWRlciA8YW5keS5zY2huZWlkZXJAYmpzcy5jby51az5dCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEZpeCBtdXRleCBjYWxsYmFjayByZXR1cm4gdmFsdWVzIGluIGNyeXB0by9lbmdpbmUvaHdfbmNpcGhlci5jLgogICAgIFtBbmR5IFNjaG5laWRlciA8YW5keS5zY2huZWlkZXJAYmpzcy5jby51az5dCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBDcnlwdG9ncmFwaGljIEFwcGxpYW5jZSdzIGtleXNlcnZlciB0ZWNobm9sb2d5LgogICAgIChVc2UgZW5naW5lICdrZXljbGllbnQnKQogICAgIFtDcnlwdG9ncmFwaGljIEFwcGxpYW5jZXMgYW5kIEdlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGEgY29uZmlndXJhdGlvbiBlbnRyeSBmb3IgT1MvMzkwIFVuaXguICBUaGUgQyBjb21waWxlciAnYzg5JwogICAgIGlzIGNhbGxlZCB2aWEgdG9vbHMvYzg5LnNoIGJlY2F1c2UgYXJndW1lbnRzIGhhdmUgdG8gYmUKICAgICByZWFycmFuZ2VkIChhbGwgJy1MJyBvcHRpb25zIG11c3QgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3Qgb2JqZWN0CiAgICAgbW9kdWxlcykuCiAgICAgW1JpY2hhcmQgU2hhcGlybyA8cnNoYXBpcm9AYWJpbml0aW8uY29tPl0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgQWRkIHN1cHBvcnQgZm9yIEJyb2FkY29tIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcywgYmFja3BvcnRlZAogICAgIGZyb20gMC45LjcuCiAgICAgW0Jyb2FkY29tLCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+LCBNYXJrIENveF0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgQWRkIHN1cHBvcnQgZm9yIFN1cmVXYXJlIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcyBmcm9tIAogICAgIEJhbHRpbW9yZSBUZWNobm9sb2dpZXMuICAoVXNlIGVuZ2luZSAnc3VyZXdhcmUnKQogICAgIFtCYWx0aW1vcmUgVGVjaG5vbG9naWVzIGFuZCBNYXJrIENveF0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgQWRkIHN1cHBvcnQgZm9yIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcyBmcm9tIEFjY2VsZXJhdGVkCiAgICAgRW5jcnlwdGlvbiBQcm9jZXNzaW5nLCB3d3cuYWVwLmllLiAgKFVzZSBlbmdpbmUgJ2FlcCcpCiAgICAgW0FFUCBJbmMuIGFuZCBNYXJrIENveF0KCiAgKikgQWRkIGEgY29uZmlndXJhdGlvbiBlbnRyeSBmb3IgZ2NjIG9uIFVuaXhXYXJlLgogICAgIFtHYXJ5IEJlbnNvbiA8Z2JlbnNvbkByZWRoYXQuY29tPl0KCiAgKikgQ2hhbmdlIHNzbC9zMl9jbG50LmMgYW5kIHNzbC9zMl9zcnZyLmMgc28gdGhhdCByZWNlaXZlZCBoYW5kc2hha2UKICAgICBtZXNzYWdlcyBhcmUgc3RvcmVkIGluIGEgc2luZ2xlIHBpZWNlIChmaXhlZC1sZW5ndGggcGFydCBhbmQKICAgICB2YXJpYWJsZS1sZW5ndGggcGFydCBjb21iaW5lZCkgYW5kIGZpeCB2YXJpb3VzIGJ1Z3MgZm91bmQgb24gdGhlIHdheS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEaXNhYmxlIGNhY2hpbmcgaW4gQklPX2dldGhvc3RieW5hbWUoKSwgZGlyZWN0bHkgdXNlIGdldGhvc3RieW5hbWUoKQogICAgIGluc3RlYWQuICBCSU9fZ2V0aG9zdGJ5bmFtZSgpIGRvZXMgbm90IGtub3cgd2hhdCB0aW1lb3V0cyBhcmUKICAgICBhcHByb3ByaWF0ZSwgc28gZW50cmllcyB3b3VsZCBzdGF5IGluIGNhY2hlIGV2ZW4gd2hlbiB0aGV5IGhhdmUKICAgICBiZWNvbWUgaW52YWxpZC4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IFJpY2ggU2FseiA8cnNhbHpAem9sZXJhLmNvbT4KCiAgKikgQ2hhbmdlIHNzbDIzX2dldF9jbGllbnRfaGVsbG8gKHNzbC9zMjNfc3J2ci5jKSBiZWhhdmlvdXIgd2hlbgogICAgIGZhY2VkIHdpdGggYSBwYXRob2xvZ2ljYWxseSBzbWFsbCBDbGllbnRIZWxsbyBmcmFnbWVudCB0aGF0IGRvZXMKICAgICBub3QgY29udGFpbiBjbGllbnRfdmVyc2lvbjogSW5zdGVhZCBvZiBhYm9ydGluZyB3aXRoIGFuIGVycm9yLAogICAgIHNpbXBseSBjaG9vc2UgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHByb3RvY29sIHZlcnNpb24gKGkuZS4sCiAgICAgVExTIDEuMCB1bmxlc3MgaXQgaXMgZGlzYWJsZWQpLiAgSW4gcHJhY3RpY2UsIENsaWVudEhlbGxvCiAgICAgbWVzc2FnZXMgYXJlIG5ldmVyIHNlbnQgbGlrZSB0aGlzLCBidXQgdGhpcyBjaGFuZ2UgZ2l2ZXMgdXMKICAgICBzdHJpY3RseSBjb3JyZWN0IGJlaGF2aW91ciBhdCBsZWFzdCBmb3IgVExTLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBTU0wgaGFuZHNoYWtlIGZ1bmN0aW9ucyBhbmQgU1NMX2NsZWFyKCkgc3VjaCB0aGF0IFNTTF9jbGVhcigpCiAgICAgbmV2ZXIgcmVzZXRzIHMtPm1ldGhvZCB0byBzLT5jdHgtPm1ldGhvZCB3aGVuIGNhbGxlZCBmcm9tIHdpdGhpbgogICAgIG9uZSBvZiB0aGUgU1NMIGhhbmRzaGFrZSBmdW5jdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBOaWtvIEJhcmljXQoKICAqKSBJbiBzc2wzX2dldF9jbGllbnRfaGVsbG8gKHNzbC9zM19zcnZyLmMpLCBnZW5lcmF0ZSBhIGZhdGFsIGFsZXJ0CiAgICAgKHNlbnQgdXNpbmcgdGhlIGNsaWVudCdzIHZlcnNpb24gbnVtYmVyKSBpZiBjbGllbnRfdmVyc2lvbiBpcwogICAgIHNtYWxsZXIgdGhhbiB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpbiB1c2UuICBBbHNvIGNoYW5nZQogICAgIHNzbDIzX2dldF9jbGllbnRfaGVsbG8gKHNzbC9zMjNfc3J2ci5jKSB0byBzZWxlY3QgVExTIDEuMCBpZgogICAgIHRoZSBjbGllbnQgZGVtYW5kZWQgU1NMIDMuMCBidXQgb25seSBUTFMgMS4wIGlzIGVuYWJsZWQ7IHRoZW4KICAgICB0aGUgY2xpZW50IHdpbGwgYXQgbGVhc3Qgc2VlIHRoYXQgYWxlcnQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHNzbDNfZ2V0X21lc3NhZ2UgKHNzbC9zM19ib3RoLmMpIHRvIGhhbmRsZSBtZXNzYWdlIGZyYWdtZW50YXRpb24KICAgICBjb3JyZWN0bHkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQXZvaWQgaW5maW5pdGUgbG9vcCBpbiBzc2wzX2dldF9tZXNzYWdlIChzc2wvczNfYm90aC5jKSBpZiBhCiAgICAgY2xpZW50IHJlY2VpdmVzIEhlbGxvUmVxdWVzdCB3aGlsZSBpbiBhIGhhbmRzaGFrZS4KICAgICBbQm9kbyBNb2VsbGVyOyBidWcgbm90aWNlZCBieSBBbmR5IFNjaG5laWRlciA8YW5keS5zY2huZWlkZXJAYmpzcy5jby51az5dCgogICopIEJ1Z2ZpeCBpbiBzc2wzX2FjY2VwdCAoc3NsL3MzX3NydnIuYyk6IENhc2UgU1NMM19TVF9TV19IRUxMT19SRVFfQwogICAgIHNob3VsZCBlbmQgaW4gJ2JyZWFrJywgbm90ICdnb3RvIGVuZCcgd2hpY2ggY2lyY3VtZW50cyB2YXJpb3VzCiAgICAgY2xlYW51cHMgZG9uZSBpbiBzdGF0ZSBTU0xfU1RfT0suICAgQnV0IHNlc3Npb24gcmVsYXRlZCBzdHVmZgogICAgIG11c3QgYmUgZGlzYWJsZWQgZm9yIFNTTF9TVF9PSyBpbiB0aGUgY2FzZSB0aGF0IHdlIGp1c3Qgc2VudCBhCiAgICAgSGVsbG9SZXF1ZXN0LgoKICAgICBBbHNvIGF2b2lkIHNvbWUgb3ZlcmhlYWQgYnkgbm90IGNhbGxpbmcgc3NsX2luaXRfd2Jpb19idWZmZXIoKQogICAgIGJlZm9yZSBqdXN0IHNlbmRpbmcgYSBIZWxsb1JlcXVlc3QuCiAgICAgW0JvZG8gTW9lbGxlciwgRXJpYyBSZXNjb3JsYSA8ZWtyQHJ0Zm0uY29tPl0KCiAgKikgRml4IHNzbC9zM19lbmMuYywgc3NsL3QxX2VuYy5jIGFuZCBzc2wvczNfcGt0LmMgc28gdGhhdCB3ZSBkb24ndAogICAgIHJldmVhbCB3aGV0aGVyIGlsbGVnYWwgYmxvY2sgY2lwaGVyIHBhZGRpbmcgd2FzIGZvdW5kIG9yIGEgTUFDCiAgICAgdmVyaWZpY2F0aW9uIGVycm9yIG9jY3VyZWQuICAoTmVpdGhlciBTU0xlcnIoKSBjb2RlcyBub3IgYWxlcnRzCiAgICAgYXJlIGRpcmVjdGx5IHZpc2libGUgdG8gcG90ZW50aWFsIGF0dGFja2VycywgYnV0IHRoZSBpbmZvcm1hdGlvbgogICAgIG1heSBsZWFrIHZpYSBsb2dmaWxlcy4pCgogICAgIFNpbWlsYXIgY2hhbmdlcyBhcmUgbm90IHJlcXVpcmVkIGZvciB0aGUgU1NMIDIuMCBpbXBsZW1lbnRhdGlvbgogICAgIGJlY2F1c2UgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGlzIHNlbnQgaW4gY2xlYXIgZm9yIFNTTCAyLjAsCiAgICAgYW5kIHRoZSBleHRyYSBieXRlcyBhcmUganVzdCBpZ25vcmVkLiAgSG93ZXZlciBzc2wvczJfcGt0LmMKICAgICBmYWlsZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIHB1cnBvcnRlZCBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpcyBpbgogICAgIHRoZSBsZWdhbCByYW5nZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgT3BlblVOSVgtOCBzdXBwb3J0IGluY2x1ZGluZyBzaGFyZWQgbGlicmFyaWVzCiAgICAgKEJveWQgTHlubiBHZXJiZXIgPGdlcmJlcmJAemVuZXouY29tPikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEltcHJvdmUgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUCgpIGNoZWNrIGFnYWluIHRvIGF2b2lkCiAgICAgJ3dyaXN0d2F0Y2ggYXR0YWNrJyB1c2luZyBodWdlIGVuY29kaW5nIHBhcmFtZXRlcnMgKGNmLgogICAgIEphbWVzIEguIE1hbmdlcidzIENSWVBUTyAyMDAxIHBhcGVyKS4gIE5vdGUgdGhhdCB0aGUKICAgICBSU0FfUEtDUzFfT0FFUF9QQURESU5HIGNhc2Ugb2YgUlNBX3ByaXZhdGVfZGVjcnlwdCgpIGRvZXMgbm90IHVzZQogICAgIGVuY29kaW5nIHBhcmFtZXRlcnMgYW5kIGhlbmNlIHdhcyBub3QgdnVsbmVyYWJsZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCTl9zcXIoKSBidWcgZml4LgogICAgIFtVbGYgTfZsbGVyLCByZXBvcnRlZCBieSBKaW0gRWxsaXMgPGppbS5lbGxpc0BjYXZpdW0uY29tPl0KCiAgKikgUmFiaW4tTWlsbGVyIHRlc3QgYW5hbHlzZXMgYXNzdW1lIHVuaWZvcm1seSBkaXN0cmlidXRlZCB3aXRuZXNzZXMsCiAgICAgc28gdXNlIEJOX3BzZXVkb19yYW5kX3JhbmdlKCkgaW5zdGVhZCBvZiB1c2luZyBCTl9wc2V1ZG9fcmFuZCgpCiAgICAgZm9sbG93ZWQgYnkgbW9kdWxhciByZWR1Y3Rpb24uCiAgICAgW0JvZG8gTW9lbGxlcjsgcG9pbnRlZCBvdXQgYnkgQWRhbSBZb3VuZyA8QVlvdW5nMUBOQ1NVUy5KTkouQ09NPl0KCiAgKikgQWRkIEJOX3BzZXVkb19yYW5kX3JhbmdlKCkgd2l0aCBvYnZpb3VzIGZ1bmN0aW9uYWxpdHk6IEJOX3JhbmRfcmFuZ2UoKQogICAgIGVxdWl2YWxlbnQgYmFzZWQgb24gQk5fcHNldWRvX3JhbmQoKSBpbnN0ZWFkIG9mIEJOX3JhbmQoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBzM19zcnZyLmM6IGFsbG93IHNlbmRpbmcgb2YgbGFyZ2UgY2xpZW50IGNlcnRpZmljYXRlIGxpc3RzICg+IDE2IGtCKS4KICAgICBUaGlzIGZ1bmN0aW9uIHdhcyBicm9rZW4sIGFzIHRoZSBjaGVjayBmb3IgYSBuZXcgY2xpZW50IGhlbGxvIG1lc3NhZ2UKICAgICB0byBoYW5kbGUgU0dDIGRpZCBub3QgYWxsb3cgdGhlc2UgbGFyZ2UgbWVzc2FnZXMuCiAgICAgKFRyYWNrZWQgZG93biBieSAiRG91Z2xhcyBFLiBFbmdlcnQiIDxkZWVuZ2VydEBhbmwuZ292Pi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBhbGVydCBkZXNjcmlwdGlvbnMgZm9yIFRMU3YxIHRvIFNTTF9hbGVydF9kZXNjX3N0cmluZ1tfbG9uZ10oKS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGJ1Z2d5IGJlaGF2aW91ciBvZiBCSU9fZ2V0X251bV9yZW5lZ290aWF0ZXMoKSBhbmQgQklPX2N0cmwoKQogICAgIGZvciBCSU9fQ19HRVRfV1JJVEVfQlVGX1NJWkUgKCJTdGVwaGVuIEhpbnRvbiIgPHNoaW50b25AbmV0b3BpYS5jb20+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgUmV3b3JrIHRoZSBjb25maWd1cmF0aW9uIGFuZCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGZvciBUcnU2NCBVbml4LgogICAgIFRoZSBjb25maWd1cmF0aW9uIHBhcnQgbWFrZXMgdXNlIG9mIG1vZGVybiBjb21waWxlciBmZWF0dXJlcyBhbmQKICAgICBzdGlsbCByZXRhaW5zIG9sZCBjb21waWxlciBiZWhhdmlvciBmb3IgdGhvc2UgdGhhdCBydW4gb2xkZXIgdmVyc2lvbnMKICAgICBvZiB0aGUgT1MuICBUaGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBwYXJ0IGluY2x1ZGVzIGEgdmFyaWFudCB0aGF0CiAgICAgdXNlcyB0aGUgUlBBVEggZmVhdHVyZSwgYW5kIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBzcGVjaWFsCiAgICAgY29uZmlndXJhdGlvbiB0YXJnZXQgImFscGhhLWNjLXJwYXRoIiwgd2hpY2ggd2lsbCBuZXZlciBiZSBzZWxlY3RlZAogICAgIGF1dG9tYXRpY2FsbHkuCiAgICAgW1RpbSBNb29uZXkgPG1vb25leUBkb2diZXJ0LmNjLm5kc3UuTm9EYWsuZWR1PiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbiBzc2wzX2dldF9rZXlfZXhjaGFuZ2UgKHNzbC9zM19jbG50LmMpLCBjYWxsIHNzbDNfZ2V0X21lc3NhZ2UoKQogICAgIHdpdGggdGhlIHNhbWUgbWVzc2FnZSBzaXplIGFzIGluIHNzbDNfZ2V0X2NlcnRpZmljYXRlX3JlcXVlc3QoKS4KICAgICBPdGhlcndpc2UsIGlmIG5vIFNlcnZlcktleUV4Y2hhbmdlIG1lc3NhZ2Ugb2NjdXJzLCBDZXJ0aWZpY2F0ZVJlcXVlc3QKICAgICBtZXNzYWdlcyBtaWdodCBpbmFkdmVydGVudGx5IGJlIHJlamVjdCBhcyB0b28gbG9uZy4KICAgICBbUGV0ciBMYW1wYSA8bGFtcGFAZmVlLnZ1dGJyLmN6Pl0KCiAgKikgRW5oYW5jZWQgc3VwcG9ydCBmb3IgSUEtNjQgVW5peCBwbGF0Zm9ybXMgKHdlbGwsIExpbnV4IGFuZCBIUC1VWCkuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE1vZGlmaWVkIFNTTCBsaWJyYXJ5IHN1Y2ggdGhhdCB0aGUgdmVyaWZ5X2NhbGxiYWNrIHRoYXQgaGFzIGJlZW4gc2V0CiAgICAgc3BlY2lmaWNseSBmb3IgYW4gU1NMIG9iamVjdCB3aXRoIFNTTF9zZXRfdmVyaWZ5KCkgaXMgYWN0dWFsbHkgYmVpbmcKICAgICB1c2VkLiBCZWZvcmUgdGhlIGNoYW5nZSwgYSB2ZXJpZnlfY2FsbGJhY2sgc2V0IHdpdGggdGhpcyBmdW5jdGlvbiB3YXMKICAgICBpZ25vcmVkIGFuZCB0aGUgdmVyaWZ5X2NhbGxiYWNrKCkgc2V0IGluIHRoZSBTU0xfQ1RYIGF0IHRoZSB0aW1lIG9mCiAgICAgdGhlIGNhbGwgd2FzIHVzZWQuIE5ldyBmdW5jdGlvbiBYNTA5X1NUT1JFX0NUWF9zZXRfdmVyaWZ5X2NiKCkgaW50cm9kdWNlZAogICAgIHRvIGFsbG93IHRoZSBuZWNlc3Nhcnkgc2V0dGluZ3MuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEluaXRpYWxpemUgc3RhdGljIHZhcmlhYmxlIGluIGNyeXB0by9kc2EvZHNhX2xpYi5jIGFuZCBjcnlwdG8vZGgvZGhfbGliLmMKICAgICBleHBsaWNpdGx5IHRvIE5VTEwsIGFzIGF0IGxlYXN0IG9uIFNvbGFyaXMgOCB0aGlzIHNlZW1zIG5vdCBhbHdheXMgdG8gYmUKICAgICBkb25lIGF1dG9tYXRpY2FsbHkgKGluIGNvbnRyYWRpY3Rpb24gdG8gdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgQwogICAgIHN0YW5kYXJkKS4gVGhpcyBtYWRlIHByb2JsZW1zIHdoZW4gdXNlZCBmcm9tIE9wZW5TU0guCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEluIE9wZW5TU0wgMC45LjZhIGFuZCAwLjkuNmIsIGNyeXB0by9kaC9kaF9rZXkuYyBpZ25vcmVkCiAgICAgZGgtPmxlbmd0aCBhbmQgYWx3YXlzIHVzZWQKCiAgICAgICAgICBCTl9yYW5kX3JhbmdlKHByaXZfa2V5LCBkaC0+cCkuCgogICAgIEJOX3JhbmRfcmFuZ2UoKSBpcyBub3QgbmVjZXNzYXJ5IGZvciBEaWZmaWUtSGVsbG1hbiwgYW5kIHRoaXMKICAgICBzcGVjaWZpYyByYW5nZSBtYWtlcyBEaWZmaWUtSGVsbG1hbiB1bm5lY2Vzc2FyaWx5IGluZWZmaWNpZW50IGlmCiAgICAgZGgtPmxlbmd0aCAocmVjb21tZW5kZWQgZXhwb25lbnQgbGVuZ3RoKSBpcyBtdWNoIHNtYWxsZXIgdGhhbiB0aGUKICAgICBsZW5ndGggb2YgZGgtPnAuICBXZSBjb3VsZCB1c2UgQk5fcmFuZF9yYW5nZSgpIGlmIHRoZSBvcmRlciBvZgogICAgIHRoZSBzdWJncm91cCB3YXMgc3RvcmVkIGluIHRoZSBESCBzdHJ1Y3R1cmUsIGJ1dCB3ZSBvbmx5IGhhdmUKICAgICBkaC0+bGVuZ3RoLgoKICAgICBTbyBzd2l0Y2ggYmFjayB0bwoKICAgICAgICAgIEJOX3JhbmQocHJpdl9rZXksIGwsIC4uLikKCiAgICAgd2hlcmUgJ2wnIGlzIGRoLT5sZW5ndGggaWYgdGhpcyBpcyBkZWZpbmVkLCBvciBCTl9udW1fYml0cyhkaC0+cCktMQogICAgIG90aGVyd2lzZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbgoKICAgICAgICAgIFJTQV9lYXlfcHVibGljX2VuY3J5cHQKICAgICAgICAgIFJTQV9lYXlfcHJpdmF0ZV9kZWNyeXB0CiAgICAgICAgICBSU0FfZWF5X3ByaXZhdGVfZW5jcnlwdCAoc2lnbmluZykKICAgICAgICAgIFJTQV9lYXlfcHVibGljX2RlY3J5cHQgKHNpZ25hdHVyZSB2ZXJpZmljYXRpb24pCgogICAgIChkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgUlNBX3B1YmxpY19lbmNyeXB0LAogICAgIFJTQV9wcml2YXRlX2RlY3J5cHQsIFJTQV9wcml2YXRlX2VuY3J5cHQsIFJTQV9wdWJsaWNfZGVjcnlwdCksCiAgICAgYWx3YXlzIHJlamVjdCBudW1iZXJzID49IG4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL3JhbmQvbWRfcmFuZC5jLCB1c2UgYSBuZXcgc2hvcnQtdGltZSBsb2NrIENSWVBUT19MT0NLX1JBTkQyCiAgICAgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvICdsb2NraW5nX3RocmVhZCcuICBUaGlzIGlzIG5lY2Vzc2FyeSBvbgogICAgIHN5c3RlbXMgd2hlcmUgYWNjZXNzIHRvICdsb2NraW5nX3RocmVhZCcgKGFuICd1bnNpZ25lZCBsb25nJwogICAgIHZhcmlhYmxlKSBpcyBub3QgYXRvbWljLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIGNyeXB0by9yYW5kL21kX3JhbmQuYywgc2V0ICdsb2NraW5nX3RocmVhZCcgdG8gY3VycmVudCB0aHJlYWQncyBJRAogICAgICpiZWZvcmUqIHNldHRpbmcgdGhlICdjcnlwdG9fbG9ja19yYW5kJyBmbGFnLiAgVGhlIHByZXZpb3VzIGNvZGUgaGFkCiAgICAgYSByYWNlIGNvbmRpdGlvbiBpZiAwIGlzIGEgdmFsaWQgdGhyZWFkIElELgogICAgIFtUcmF2aXMgVml0ZWsgPHZpdGVrQHJvZ3Vld2F2ZS5jb20+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyB1bmRlciBJcml4LgogICAgIFtBbGJlcnQgQ2hpbi1BLVlvdW5nIDxjaGluYUB0aGV3cml0dGVud29yZC5jb20+XQoKICAqKSBBZGQgY29uZmlndXJhdGlvbiBvcHRpb24gdG8gYnVpbGQgb24gTGludXggb24gYm90aCBiaWctZW5kaWFuIGFuZAogICAgIGxpdHRsZS1lbmRpYW4gTUlQUy4KICAgICBbUmFsZiBCYWVjaGxlIDxyYWxmQHVuaS1rb2JsZW56LmRlPl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBIUC1VWC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmEgYW5kIDAuOS42YiAgWzkgSnVsIDIwMDFdCgogICopIENoYW5nZSBzc2xlYXlfcmFuZF9ieXRlcyAoY3J5cHRvL3JhbmQvbWRfcmFuZC5jKQogICAgIHRvIGF2b2lkIGEgU1NMZWF5L09wZW5TU0wgUFJORyB3ZWFrbmVzcyBwb2ludGVkIG91dCBieQogICAgIE1hcmtrdS1KdWhhbmkgTy4gU2FhcmluZW4gPG1hcmtrdS1qdWhhbmkuc2FhcmluZW5Abm9raWEuY29tPjoKICAgICBQUk5HIHN0YXRlIHJlY292ZXJ5IHdhcyBwb3NzaWJsZSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mCiAgICAgb25lIFBSTkcgcmVxdWVzdCBhcHByb3ByaWF0ZWx5IHNpemVkIHRvIGdhaW4ga25vd2xlZGdlIG9uCiAgICAgJ21kJyBmb2xsb3dlZCBieSBlbm91Z2ggY29uc2VjdXRpdmUgMS1ieXRlIFBSTkcgcmVxdWVzdHMKICAgICB0byB0cmF2ZXJzZSBhbGwgb2YgJ3N0YXRlJy4KCiAgICAgMS4gV2hlbiB1cGRhdGluZyAnbWRfbG9jYWwnICh0aGUgY3VycmVudCB0aHJlYWQncyBjb3B5IG9mICdtZCcpCiAgICAgICAgZHVyaW5nIFBSTkcgb3V0cHV0IGdlbmVyYXRpb24sIGhhc2ggYWxsIG9mIHRoZSBwcmV2aW91cwogICAgICAgICdtZF9sb2NhbCcgdmFsdWUsIG5vdCBqdXN0IHRoZSBoYWxmIHVzZWQgZm9yIFBSTkcgb3V0cHV0LgoKICAgICAyLiBNYWtlIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSAnc3RhdGUnIGluY2x1ZGVkIGludG8gdGhlIGhhc2gKICAgICAgICBpbmRlcGVuZGVudCBmcm9tIHRoZSBudW1iZXIgb2YgUFJORyBieXRlcyByZXF1ZXN0ZWQuCgogICAgIFRoZSBmaXJzdCBtZWFzdXJlIGFsb25lIHdvdWxkIGJlIHN1ZmZpY2llbnQgdG8gYXZvaWQKICAgICBNYXJra3UtSnVoYW5pJ3MgYXR0YWNrLiAgKEFjdHVhbGx5IGl0IGhhZCBuZXZlciBvY2N1cnJlZAogICAgIHRvIG1lIHRoYXQgdGhlIGhhbGYgb2YgJ21kX2xvY2FsJyB1c2VkIGZvciBjaGFpbmluZyB3YXMgdGhlCiAgICAgaGFsZiBmcm9tIHdoaWNoIFBSTkcgb3V0cHV0IGJ5dGVzIHdlcmUgdGFrZW4gLS0gSSBoYWQgYWx3YXlzCiAgICAgYXNzdW1lZCB0aGF0IHRoZSBzZWNyZXQgaGFsZiB3b3VsZCBiZSB1c2VkLikgIFRoZSBzZWNvbmQKICAgICBtZWFzdXJlIG1ha2VzIHN1cmUgdGhhdCBhZGRpdGlvbmFsIGRhdGEgZnJvbSAnc3RhdGUnIGlzIG5ldmVyCiAgICAgbWl4ZWQgaW50byAnbWRfbG9jYWwnIGluIHNtYWxsIHBvcnRpb25zOyB0aGlzIGhldXJpc3RpY2FsbHkKICAgICBmdXJ0aGVyIHN0cmVuZ3RoZW5zIHRoZSBQUk5HLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBjcnlwdG8vYm4vYXNtL21pcHMzLnMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIFdoZW4gb25seSB0aGUga2V5IGlzIGdpdmVuIHRvICJlbmMiLCB0aGUgSVYgaXMgdW5kZWZpbmVkLiBQcmludCBvdXQKICAgICBhbiBlcnJvciBtZXNzYWdlIGluIHRoaXMgY2FzZS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSGFuZGxlIHNwZWNpYWwgY2FzZSB3aGVuIFg1MDlfTkFNRSBpcyBlbXB0eSBpbiBYNTA5IHByaW50aW5nIHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIGRzYV9kb192ZXJpZnkgKGNyeXB0by9kc2EvZHNhX29zc2wuYyksIHZlcmlmeSB0aGF0IHIgYW5kIHMgYXJlCiAgICAgcG9zaXRpdmUgYW5kIGxlc3MgdGhhbiBxLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERvbid0IGNoYW5nZSAqcG9pbnRlciBpbiBDUllQVE9fYWRkX2xvY2soKSBpcyBhZGRfbG9ja19jYWxsYmFjayBpcwogICAgIHVzZWQ6IGl0IGlzbid0IHRocmVhZCBzYWZlIGFuZCB0aGUgYWRkX2xvY2tfY2FsbGJhY2sgc2hvdWxkIGhhbmRsZQogICAgIHRoYXQgaXRzZWxmLgogICAgIFtQYXVsIFJvc2UgPFBhdWwuUm9zZUBicmlkZ2UuY29tPl0KCiAgKikgVmVyaWZ5IHRoYXQgaW5jb21pbmcgZGF0YSBvYmV5cyB0aGUgYmxvY2sgc2l6ZSBpbgogICAgIHNzbDNfZW5jIChzc2wvczNfZW5jLmMpIGFuZCB0bHMxX2VuYyAoc3NsL3QxX2VuYy5jKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggT0FFUCBjaGVjay4KICAgICBbVWxmIE32bGxlciwgQm9kbyBN9mxsZXJdCgogICopIFRoZSBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IEJsZWljaGJhY2hlcidzIGF0dGFjayBvbiBQS0NTICMxIHYxLjUKICAgICBSU0EgZW5jcnlwdGlvbiB3YXMgYWNjaWRlbnRhbGx5IHJlbW92ZWQgaW4gczNfc3J2ci5jIGluIE9wZW5TU0wgMC45LjUKICAgICB3aGVuIGZpeGluZyB0aGUgc2VydmVyIGJlaGF2aW91ciBmb3IgYmFja3dhcmRzLWNvbXBhdGlibGUgJ2NsaWVudAogICAgIGhlbGxvJyBtZXNzYWdlcy4gIChOb3RlIHRoYXQgdGhlIGF0dGFjayBpcyBpbXByYWN0aWNhbCBhZ2FpbnN0CiAgICAgU1NMIDMuMCBhbmQgVExTIDEuMCBhbnl3YXkgYmVjYXVzZSBsZW5ndGggYW5kIHZlcnNpb24gY2hlY2tpbmcKICAgICBtZWFucyB0aGF0IHRoZSBwcm9iYWJpbGl0eSBvZiBndWVzc2luZyBhIHZhbGlkIGNpcGhlcnRleHQgaXMKICAgICBhcm91bmQgMl4tNDA7IHNlZSBzZWN0aW9uIDUgaW4gQmxlaWNoZW5iYWNoZXIncyBDUllQVE8gJzk4CiAgICAgcGFwZXIuKQoKICAgICBCZWZvcmUgMC45LjUsIHRoZSBjb3VudGVybWVhc3VyZSAoaGlkZSB0aGUgZXJyb3IgYnkgZ2VuZXJhdGluZyBhCiAgICAgcmFuZG9tICdkZWNyeXB0aW9uIHJlc3VsdCcpIGRpZCBub3Qgd29yayBwcm9wZXJseSBiZWNhdXNlCiAgICAgRVJSX2NsZWFyX2Vycm9yKCkgd2FzIG1pc3NpbmcsIG1lYW5pbmcgdGhhdCBTU0xfZ2V0X2Vycm9yKCkgd291bGQKICAgICBkZXRlY3QgdGhlIHN1cHBvc2VkbHkgaWdub3JlZCBlcnJvci4KCiAgICAgQm90aCBwcm9ibGVtcyBhcmUgbm93IGZpeGVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIGNyeXB0by9iaW8vYmZfYnVmZi5jLCBpbmNyZWFzZSBERUZBVUxUX0JVRkZFUl9TSVpFIHRvIDQwOTYKICAgICAocHJldmlvdXNseSBpdCB3YXMgMTAyNCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciBjb21wYXRpYmlsaXR5IG1vZGUgdHJ1c3Qgc2V0dGluZ3M6IGlnbm9yZSB0cnVzdCBzZXR0aW5ncwogICAgIHVubGVzcyBzb21lIHZhbGlkIHRydXN0IG9yIHJlamVjdCBzZXR0aW5ncyBhcmUgcHJlc2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZm9yIGJsb3dmaXNoIEVWUDogaXRzIGEgdmFyaWFibGUgbGVuZ3RoIGNpcGhlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdmFyaW91cyBidWdzIHJlbGF0ZWQgdG8gRFNBIFMvTUlNRSB2ZXJpZmljYXRpb24uIEhhbmRsZSBtaXNzaW5nCiAgICAgcGFyYW1ldGVycyBpbiBEU0EgcHVibGljIGtleSBzdHJ1Y3R1cmVzIGFuZCByZXR1cm4gYW4gZXJyb3IgaW4gdGhlCiAgICAgRFNBIHJvdXRpbmVzIGlmIHBhcmFtZXRlcnMgYXJlIGFic2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiB2ZXJzaW9ucyB1cCB0byAwLjkuNiwgUkFORF9maWxlX25hbWUoKSByZXNvcnRlZCB0byBmaWxlICIucm5kIgogICAgIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiBuZWl0aGVyICRSQU5ERklMRSBub3IgJEhPTUUgd2FzIHNldC4KICAgICBSQU5EX2ZpbGVfbmFtZSgpIGluIDAuOS42YSByZXR1cm5lZCBOVUxMIGluIHRoaXMgY2FzZS4gIFRoaXMgaGFzCiAgICAgY2F1c2VkIHNvbWUgY29uZnVzaW9uIHRvIFdpbmRvd3MgdXNlcnMgd2hvIGhhdmVuJ3QgZGVmaW5lZCAkSE9NRS4KICAgICBUaHVzIFJBTkRfZmlsZV9uYW1lKCkgaXMgY2hhbmdlZCBhZ2FpbjogZV9vcy5oIGNhbiBkZWZpbmUgYQogICAgIERFRkFVTFRfSE9NRSwgd2hpY2ggd2lsbCBiZSB1c2VkIGlmICRIT01FIGlzIG5vdCBzZXQuCiAgICAgRm9yIFdpbmRvd3MsIHdlIHVzZSAiQzoiOyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIHN0aWxsIHJlcXVpcmUKICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgogICopIE1vdmUgJ2lmICghaW5pdGlhbGl6ZWQpIFJBTkRfcG9sbCgpJyBpbnRvIHJlZ2lvbnMgcHJvdGVjdGVkIGJ5CiAgICAgQ1JZUFRPX0xPQ0tfUkFORC4gIFRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IGF2b2lkcwogICAgIGhhdmluZyBtdWx0aXBsZSB0aHJlYWRzIGNhbGwgUkFORF9wb2xsKCkgY29uY3VycmVudGx5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIGNyeXB0by9yYW5kL21kX3JhbmQuYywgcmVwbGFjZSAnYWRkX2RvX25vdF9sb2NrJyBmbGFnIGJ5IGEKICAgICBjb21iaW5hdGlvbiBvZiBhIGZsYWcgYW5kIGEgdGhyZWFkIElEIHZhcmlhYmxlLgogICAgIE90aGVyd2lzZSB3aGlsZSBvbmUgdGhyZWFkIGlzIGluIHNzbGVheV9yYW5kX2J5dGVzICh3aGljaCBzZXRzIHRoZQogICAgIGZsYWcpLCAqb3RoZXIqIHRocmVhZHMgY2FuIGVudGVyIHNzbGVheV9hZGRfYnl0ZXMgd2l0aG91dCBvYmV5aW5nCiAgICAgdGhlIENSWVBUT19MT0NLX1JBTkQgbG9jayAoYW5kIG1heSBldmVuIGlsbGVnYWxseSByZWxlYXNlIHRoZSBsb2NrCiAgICAgdGhhdCB0aGV5IGRvIG5vdCBob2xkIGFmdGVyIHRoZSBmaXJzdCB0aHJlYWQgdW5zZXRzIGFkZF9kb19ub3RfbG9jaykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIGJjdGVzdCBhZ2FpbjogJy14JyBleHByZXNzaW9ucyBhcmUgbm90IGF2YWlsYWJsZSBpbiBhbGwKICAgICB2ZXJzaW9ucyBvZiAndGVzdCcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjYgYW5kIDAuOS42YSAgWzUgQXByIDIwMDFdCgogICopIEZpeCBhIGNvdXBsZSBvZiBtZW1vcnkgbGVha3MgaW4gUEtDUzdfZGF0YURlY29kZSgpCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgSGV5dW4gWmhlbmcgPGh6aGVuZ0BhdGRzcHJpbnQuY29tPl0KCiAgKikgQ2hhbmdlIENvbmZpZ3VyZSBhbmQgTWFrZWZpbGVzIHRvIHByb3ZpZGUgRVhFX0VYVCwgd2hpY2ggd2lsbCBjb250YWluCiAgICAgdGhlIGRlZmF1bHQgZXh0ZW5zaW9uIGZvciBleGVjdXRhYmxlcywgaWYgYW55LiAgQWxzbywgbWFrZSB0aGUgcGVybAogICAgIHNjcmlwdHMgdGhhdCB1c2Ugc3ltbGluaygpIHRvIHRlc3QgaWYgaXQgcmVhbGx5IGV4aXN0cyBhbmQgdXNlICJjcCIKICAgICBpZiBpdCBkb2Vzbid0LiAgQWxsIHRoaXMgbWFkZSBPcGVuU1NMIGNvbXBpbGFibGUgYW5kIGluc3RhbGxhYmxlIGluCiAgICAgQ3lnV2luLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBmb3IgYXNuMV9HZXRTZXF1ZW5jZSgpIGZvciBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCBkYXRhLgogICAgIElmIFNFUVVFTkNFIGlzIGxlbmd0aCBpcyBpbmRlZmluaXRlIGp1c3Qgc2V0IGMtPnNsZW4gdG8gdGhlIHRvdGFsCiAgICAgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IHNoaWdlQEZyZWVCU0Qub3JnXQogICAgIFtUaGlzIGNoYW5nZSBkb2VzIG5vdCBhcHBseSB0byAwLjkuNy5dCgogICopIENoYW5nZSBiY3Rlc3QgdG8gYXZvaWQgaGVyZS1kb2N1bWVudHMgaW5zaWRlIGNvbW1hbmQgc3Vic3RpdHV0aW9uCiAgICAgKHdvcmthcm91bmQgZm9yIEZyZWVCU0QgL2Jpbi9zaCBidWcpLgogICAgIEZvciBjb21wYXRpYmlsaXR5IHdpdGggVWx0cml4LCBhdm9pZCBzaGVsbCBmdW5jdGlvbnMgKGludHJvZHVjZWQKICAgICBpbiB0aGUgYmN0ZXN0IHZlcnNpb24gdGhhdCBzZWFyY2hlcyBhbG9uZyAkUEFUSCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVuYW1lICdkZXNfZW5jcnlwdCcgdG8gJ2Rlc19lbmNyeXB0MScuICBUaGlzIGF2b2lkcyB0aGUgY2xhc2hlcwogICAgIHdpdGggZGVzX2VuY3J5cHQoKSBkZWZpbmVkIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIGxpa2UgU29sYXJpcwogICAgIGFuZCBVbml4V2FyZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGVjayB0aGUgcmVzdWx0IG9mIFJTQS1DUlQgKHNlZSBELiBCb25laCwgUi4gRGVNaWxsbywgUi4gTGlwdG9uOgogICAgIE9uIHRoZSBJbXBvcnRhbmNlIG9mIEVsaW1pbmF0aW5nIEVycm9ycyBpbiBDcnlwdG9ncmFwaGljCiAgICAgQ29tcHV0YXRpb25zLCBKLiBDcnlwdG9sb2d5IDE0ICgyMDAxKSAyLCAxMDEtMTE5LAogICAgIGh0dHA6Ly90aGVvcnkuc3RhbmZvcmQuZWR1L35kYWJvL3BhcGVycy9mYXVsdHMucHMuZ3opLgogICAgIFtVbGYgTW9lbGxlcl0KICAKICAqKSBNSVBTIGFzc2VtYmxlciBCSUdOVU0gZGl2aXNpb24gYnVnIGZpeC4gCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIERpc2FibGVkIGluY29ycmVjdCBBbHBoYSBhc3NlbWJsZXIgY29kZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggUEtDUyM3IGRlY29kZSByb3V0aW5lcyBzbyB0aGV5IGNvcnJlY3RseSB1cGRhdGUgdGhlIGxlbmd0aAogICAgIGFmdGVyIHJlYWRpbmcgYW4gRU9DIGZvciB0aGUgRVhQTElDSVQgdGFnLgogICAgIFtTdGV2ZSBIZW5zb25dCiAgICAgW1RoaXMgY2hhbmdlIGRvZXMgbm90IGFwcGx5IHRvIDAuOS43Ll0KCiAgKikgRml4IGJ1ZyBpbiBQS0NTIzEyIGtleSBnZW5lcmF0aW9uIHJvdXRpbmVzLiBUaGlzIHdhcyB0cmlnZ2VyZWQKICAgICBpZiBhIDNERVMga2V5IHdhcyBnZW5lcmF0ZWQgd2l0aCBhIDAgaW5pdGlhbCBieXRlLiBJbmNsdWRlCiAgICAgUEtDUzEyX0JST0tFTl9LRVlHRU4gY29tcGlsYXRpb24gb3B0aW9uIHRvIHJldGFpbiB0aGUgb2xkCiAgICAgKGJ1dCBicm9rZW4pIGJlaGF2aW91ci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIGJjdGVzdCB0byBzZWFyY2ggZm9yIGEgd29ya2luZyBiYyBhbG9uZyAkUEFUSCBhbmQgcHJpbnQKICAgICBpdCB3aGVuIGZvdW5kLgogICAgIFtUaW0gUmljZSA8dGltQG11bHRpdGFsZW50cy5uZXQ+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBtZW1vcnkgbGVha3MgaW4gZXJyLmM6IGZyZWUgZXJyX2RhdGEgc3RyaW5nIGlmIG5lY2Vzc2FyeTsKICAgICBkb24ndCB3cml0ZSB0byB0aGUgd3JvbmcgaW5kZXggaW4gRVJSX3NldF9lcnJvcl9kYXRhLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEltcGxlbWVudCBzc2wyM19wZWVrIChhbmFsb2dvdXMgdG8gc3NsMjNfcmVhZCksIHdoaWNoIHByZXZpb3VzbHkKICAgICBkaWQgbm90IGV4aXN0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlcGxhY2UgcmR0c2Mgd2l0aCBfZW1pdCBzdGF0ZW1lbnRzIGZvciBWQysrIHZlcnNpb24gNS4KICAgICBbSmVyZW15IENvb3BlciA8amVyZW15QGJheW1vby5vcmc+XQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHJldXNlIFNTTHYyIHNlc3Npb25zLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIGNvcHlfZW1haWwoKSBjaGVjayBmb3IgPj0gMCBhcyBhIHJldHVybiB2YWx1ZSBmb3IKICAgICBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRCgpIHNpbmNlIDAgaXMgYSB2YWxpZCBpbmRleC4KICAgICBbU3RldmUgSGVuc29uIHJlcG9ydGVkIGJ5IE1hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQG9wZW5zY2Eub3JnPl0KCiAgKikgQXZvaWQgY29yZWR1bXAgd2l0aCB1bnN1cHBvcnRlZCBvciBpbnZhbGlkIHB1YmxpYyBrZXlzIGJ5IGNoZWNraW5nIGlmCiAgICAgWDUwOV9nZXRfcHVia2V5KCkgZmFpbHMgaW4gUEtDUzdfdmVyaWZ5KCkuIEZpeCBtZW1vcnkgbGVhayB3aGVuCiAgICAgUEtDUzdfdmVyaWZ5KCkgZmFpbHMgd2l0aCBub24gZGV0YWNoZWQgZGF0YS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEb24ndCB1c2UgZ2V0ZW52IGluIGxpYnJhcnkgZnVuY3Rpb25zIHdoZW4gcnVuIGFzIHNldHVpZC9zZXRnaWQuCiAgICAgTmV3IGZ1bmN0aW9uIE9QRU5TU0xfaXNzZXR1Z2lkKCkuCiAgICAgW1VsZiBNb2VsbGVyXQoKICAqKSBBdm9pZCBmYWxzZSBwb3NpdGl2ZXMgaW4gbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIGNvZGUgKGNyeXB0by9tZW1fZGJnLmMpCiAgICAgZHVlIHRvIGluY29ycmVjdCBoYW5kbGluZyBvZiBtdWx0aS10aHJlYWRpbmc6CgogICAgIDEuIEZpeCB0aW1pbmcgZ2xpdGNoIGluIHRoZSBNZW1DaGVja19vZmYoKSBwb3J0aW9uIG9mIENSWVBUT19tZW1fY3RybCgpLgoKICAgICAyLiBGaXggbG9naWNhbCBnbGl0Y2ggaW4gaXNfTWVtQ2hlY2tfb24oKSBha2EgQ1JZUFRPX2lzX21lbV9jaGVja19vbigpLgoKICAgICAzLiBDb3VudCBob3cgbWFueSB0aW1lcyBNZW1DaGVja19vZmYoKSBoYXMgYmVlbiBjYWxsZWQgc28gdGhhdAogICAgICAgIG5lc3RlZCB1c2UgY2FuIGJlIHRyZWF0ZWQgY29ycmVjdGx5LiAgVGhpcyBhbHNvIGF2b2lkcyAKICAgICAgICBpbmJhbmQtc2lnbmFsbGluZyBpbiB0aGUgcHJldmlvdXMgY29kZSAod2hpY2ggcmVsaWVkIG9uIHRoZQogICAgICAgIGFzc3VtcHRpb24gdGhhdCB0aHJlYWQgSUQgMCBpcyBpbXBvc3NpYmxlKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgIi1yYW5kIiBvcHRpb24gYWxzbyB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBDUFUgZGV0ZWN0aW9uIG9uIElyaXggNi54LgogICAgIFtLdXJ0IEhvY2tlbmJ1cnkgPGtob2NrZW5iQHN0ZXZlbnMtdGVjaC5lZHU+IGFuZAogICAgICAiQnJ1Y2UgVy4gRm9yc2JlcmciIDxicnVjZS5mb3JzYmVyZ0BiYWVzeXN0ZW1zLmNvbT5dCgogICopIEZpeCBYNTA5X05BTUUgYnVnIHdoaWNoIHByb2R1Y2VkIGluY29ycmVjdCBlbmNvZGluZyBpZiBYNTA5X05BTUUKICAgICB3YXMgZW1wdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAgICBbVGhpcyBjaGFuZ2UgZG9lcyBub3QgYXBwbHkgdG8gMC45LjcuXQoKICAqKSBVc2UgdGhlIGNhY2hlZCBlbmNvZGluZyBvZiBhbiBYNTA5X05BTUUgc3RydWN0dXJlIHJhdGhlciB0aGFuCiAgICAgY29weWluZyBpdC4gVGhpcyBpcyBhcHBhcmVudGx5IHRoZSByZWFzb24gZm9yIHRoZSBsaWJzYWZlICJlcnJvcnMiCiAgICAgYnV0IHRoZSBjb2RlIGlzIGFjdHVhbGx5IGNvcnJlY3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbiBCTl9yYW5kX3JhbmdlKCksIGFuZCBmaXggRFNBX3NpZ25fc2V0dXAoKSB0byBwcmV2ZW50CiAgICAgQmxlaWNoZW5iYWNoZXIncyBEU0EgYXR0YWNrLgogICAgIEV4dGVuZCBCTl9bcHNldWRvX11yYW5kOiBBcyBiZWZvcmUsIHRvcD0xIGZvcmNlcyB0aGUgaGlnaGVzdCB0d28gYml0cwogICAgIHRvIGJlIHNldCBhbmQgdG9wPTAgZm9yY2VzIHRoZSBoaWdoZXN0IGJpdCB0byBiZSBzZXQ7IHRvcD0tMSBpcyBuZXcKICAgICBhbmQgbGVhdmVzIHRoZSBoaWdoZXN0IGJpdCByYW5kb20uCiAgICAgW1VsZiBNb2VsbGVyLCBCb2RvIE1vZWxsZXJdCgogICopIEluIHRoZSBOQ09ORl8uLi4tYmFzZWQgaW1wbGVtZW50YXRpb25zIGZvciBDT05GXy4uLiBxdWVyaWVzCiAgICAgKGNyeXB0by9jb25mL2NvbmZfbGliLmMpLCBpZiB0aGUgaW5wdXQgTEhBU0ggaXMgTlVMTCwgYXZvaWQgdXNpbmcKICAgICBhIHRlbXBvcmFyeSBDT05GIHN0cnVjdHVyZSB3aXRoIHRoZSBkYXRhIGNvbXBvbmVudCBzZXQgdG8gTlVMTAogICAgICh3aGljaCBnaXZlcyBzZWdtZW50YXRpb24gZmF1bHRzIGluIGxoX3JldHJpZXZlKS4KICAgICBJbnN0ZWFkLCB1c2UgTlVMTCBmb3IgdGhlIENPTkYgcG9pbnRlciBpbiBDT05GX2dldF9zdHJpbmcgYW5kCiAgICAgQ09ORl9nZXRfbnVtYmVyICh3aGljaCBtYXkgdXNlIGVudmlyb25tZW50IHZhcmlhYmxlcykgYW5kIGRpcmVjdGx5CiAgICAgcmV0dXJuIE5VTEwgZnJvbSBDT05GX2dldF9zZWN0aW9uLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW4gZm9yIEVCQ0RJQy4KICAgICBbVWxmIE1vZWxsZXJdCgogICopIFRvbGVyYXRlIG5vblJlcHVkaWF0aW9uIGFzIGJlaW5nIHZhbGlkIGZvciBTL01JTUUgc2lnbmluZyBhbmQgY2VydFNpZ24KICAgICBrZXlVc2FnZSBpZiBiYXNpY0NvbnN0cmFpbnRzIGFic2VudCBmb3IgYSBDQS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFNNSU1FX3dyaXRlX1BLQ1M3KCkgd3JpdGUgbWFpbCBoZWFkZXIgdmFsdWVzIHdpdGggYSBmb3JtYXQgdGhhdAogICAgIGlzIG1vcmUgZ2VuZXJhbGx5IGFjY2VwdGVkIChubyBzcGFjZXMgYmVmb3JlIHRoZSBzZW1pY29sb24pLCBzaW5jZQogICAgIHNvbWUgcHJvZ3JhbXMgY2FuJ3QgcGFyc2UgdGhvc2UgdmFsdWVzIHByb3Blcmx5IG90aGVyd2lzZS4gIEFsc28gbWFrZQogICAgIHN1cmUgQklPJ3MgdGhhdCBicmVhayBsaW5lcyBhZnRlciBlYWNoIHdyaXRlIGRvIG5vdCBjcmVhdGUgaW52YWxpZAogICAgIGhlYWRlcnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSB0aGUgQ1JMIGVuY29kaW5nIHJvdXRpbmVzIHdvcmsgd2l0aCBlbXB0eSBTRVFVRU5DRSBPRi4gVGhlCiAgICAgbWFjcm9zIHByZXZpb3VzbHkgdXNlZCB3b3VsZCBub3QgZW5jb2RlIGFuIGVtcHR5IFNFUVVFTkNFIE9GCiAgICAgYW5kIGJyZWFrIHRoZSBzaWduYXR1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAgICBbVGhpcyBjaGFuZ2UgZG9lcyBub3QgYXBwbHkgdG8gMC45LjcuXQoKICAqKSBaZXJvIHRoZSBwcmVtYXN0ZXIgc2VjcmV0IGFmdGVyIGRlcml2aW5nIHRoZSBtYXN0ZXIgc2VjcmV0IGluCiAgICAgREggY2lwaGVyc3VpdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzb21lIEVWUF9hZGRfZGlnZXN0X2FsaWFzIHJlZ2lzdHJhdGlvbnMgKGFzIGZvdW5kIGluCiAgICAgT3BlblNTTF9hZGRfYWxsX2RpZ2VzdHMoKSkgdG8gU1NMX2xpYnJhcnlfaW5pdCgpCiAgICAgYWthIE9wZW5TU0xfYWRkX3NzbF9hbGdvcml0aG1zKCkuICBUaGlzIHByb3ZpZGVzIGltcHJvdmVkCiAgICAgY29tcGF0aWJpbGl0eSB3aXRoIHBlZXJzIHVzaW5nIFguNTA5IGNlcnRpZmljYXRlcwogICAgIHdpdGggdW5jb252ZW50aW9uYWwgQWxnb3JpdGhtSWRlbnRpZmllciBPSURzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBmb3IgSXJpeCB3aXRoIE5PX0FTTS4KICAgICBbIkJydWNlIFcuIEZvcnNiZXJnIiA8YnJ1Y2UuZm9yc2JlcmdAYmFlc3lzdGVtcy5jb20+XQoKICAqKSAuL2NvbmZpZyBzY3JpcHQgZml4ZXMuCiAgICAgW1VsZiBNb2VsbGVyLCBSaWNoYXJkIExldml0dGVdCgogICopIEZpeCAnb3BlbnNzbCBwYXNzd2QgLTEnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBQS0NTMTJfa2V5X2dlbl9hc2MoKSBzbyBpdCBjYW4gY29wZSB3aXRoIG5vbiBudWxsCiAgICAgdGVybWluYXRlZCBzdHJpbmdzIHdob3NlIGxlbmd0aCBpcyBwYXNzZWQgaW4gdGhlIHBhc3NsZW4KICAgICBwYXJhbWV0ZXIsIGZvciBleGFtcGxlIGZyb20gUEVNIGNhbGxiYWNrcy4gVGhpcyB3YXMgZG9uZQogICAgIGJ5IGFkZGluZyBhbiBleHRyYSBsZW5ndGggcGFyYW1ldGVyIHRvIGFzYzJ1bmkoKS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSA8b2RkaXNzZXlAc2Ftc3VuZy5jby5rcj5dCgogICopIEZpeCBDIGNvZGUgZ2VuZXJhdGVkIGJ5ICdvcGVuc3NsIGRzYXBhcmFtIC1DJzogSWYgYSBCTl9iaW4yYm4KICAgICBjYWxsIGZhaWxlZCwgZnJlZSB0aGUgRFNBIHN0cnVjdHVyZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggdG8gdW5pMmFzYygpIHRvIGNvcGUgd2l0aCB6ZXJvIGxlbmd0aCBVbmljb2RlIHN0cmluZ3MuCiAgICAgVGhlc2UgYXJlIHByZXNlbnQgaW4gc29tZSBQS0NTIzEyIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluY3JlYXNlIHMyLT53YnVmIGFsbG9jYXRpb24gYnkgb25lIGJ5dGUgaW4gc3NsMl9uZXcgKHNzbC9zMl9saWIuYykuCiAgICAgT3RoZXJ3aXNlIGRvX3NzbF93cml0ZSAoc3NsL3MyX3BrdC5jKSB3aWxsIHdyaXRlIGJleW9uZCBidWZmZXIgbGltaXRzCiAgICAgd2hlbiB3cml0aW5nIGEgMzI3NjcgYnl0ZSByZWNvcmQuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSByZXBvcnRlZCBieSBFcmljIERheSA8ZWRheUBjb25jZW50cmljLm5ldD5dCgogICopIEluIFJTQV9lYXlfcHVibGljX3tlbixlZH1jcnlwdCBhbmQgUlNBX2VheV9tb2RfZXhwIChyc2FfZWF5LmMpLAogICAgIG9idGFpbiBsb2NrIENSWVBUT19MT0NLX1JTQSBiZWZvcmUgc2V0dGluZyByc2EtPl9tZXRob2RfbW9kX3tuLHAscX0uCgogICAgIChSU0Egb2JqZWN0cyBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IGFjY2VzcyB0byB3aGljaCBpcyBwcm90ZWN0ZWQKICAgICBieSBDUllQVE9fTE9DS19SU0EgW3NlZSByc2FfbGliLmMsIHMzX3NydnIuYywgc3NsX2NlcnQuYywgc3NsX3JzYS5jXSwKICAgICBzbyB0aGV5IGFyZSBtZWFudCB0byBiZSBzaGFyZWQgYmV0d2VlbiB0aHJlYWRzLikKICAgICBbQm9kbyBNb2VsbGVyLCBHZW9mZiBUaG9ycGU7IG9yaWdpbmFsIHBhdGNoIHN1Ym1pdHRlZCBieQogICAgICJSZWRkaWUsIFN0ZXZlbiIgPFN0ZXZlbi5SZWRkaWVAY2EuY29tPl0KCiAgKikgRml4IGEgZGVhZGxvY2sgaW4gQ1JZUFRPX21lbV9sZWFrcygpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVzZSBiZXR0ZXIgdGVzdCBwYXR0ZXJucyBpbiBibnRlc3QuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIHJhbmRfd2luLmMgZml4IGZvciBCb3JsYW5kIEMuCiAgICAgW1VsZiBN9mxsZXJdCiAKICAqKSBCTl9yc2hpZnQgYnVnZml4IGZvciBuID09IDAuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGEgJ2JjdGVzdCcgc2NyaXB0IHRoYXQgY2hlY2tzIGZvciBzb21lIGtub3duICdiYycgYnVncwogICAgIHNvIHRoYXQgJ21ha2UgdGVzdCcgZG9lcyBub3QgYWJvcnQganVzdCBiZWNhdXNlICdiYycgaXMgYnJva2VuLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN0b3JlIHZlcmlmeV9yZXN1bHQgd2l0aGluIFNTTF9TRVNTSU9OIGFsc28gZm9yIGNsaWVudCBzaWRlIHRvCiAgICAgYXZvaWQgcG90ZW50aWFsIHNlY3VyaXR5IGhvbGUuIChSZS11c2VkIHNlc3Npb25zIG9uIHRoZSBjbGllbnQgc2lkZQogICAgIGFsd2F5cyByZXN1bHRlZCBpbiB2ZXJpZnlfcmVzdWx0PT1YNTA5X1ZfT0ssIG5vdCB1c2luZyB0aGUgb3JpZ2luYWwKICAgICByZXN1bHQgb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uKQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggc3NsM19wZW5kaW5nOiBJZiB0aGUgcmVjb3JkIGluIHMtPnMzLT5ycmVjIGlzIG5vdCBvZiB0eXBlCiAgICAgU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBLCByZXR1cm4gMC4KICAgICBTaW1pbGFybHksIGNoYW5nZSBzc2wyX3BlbmRpbmcgdG8gcmV0dXJuIDAgaWYgU1NMX2luX2luaXQocykgaXMgdHJ1ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggU1NMX3BlZWs6CiAgICAgQm90aCBzc2wyX3BlZWsgYW5kIHNzbDNfcGVlaywgd2hpY2ggd2VyZSB0b3RhbGx5IGJyb2tlbiBpbiBlYXJsaWVyCiAgICAgcmVsZWFzZXMsIGhhdmUgYmVlbiByZS1pbXBsZW1lbnRlZCBieSByZW5hbWluZyB0aGUgcHJldmlvdXMKICAgICBpbXBsZW1lbnRhdGlvbnMgb2Ygc3NsMl9yZWFkIGFuZCBzc2wzX3JlYWQgdG8gc3NsMl9yZWFkX2ludGVybmFsCiAgICAgYW5kIHNzbDNfcmVhZF9pbnRlcm5hbCwgcmVzcGVjdGl2ZWx5LCBhbmQgYWRkaW5nICdwZWVrJyBwYXJhbWV0ZXJzCiAgICAgdG8gdGhlbS4gIFRoZSBuZXcgc3NsWzIzXV97cmVhZCxwZWVrfSBmdW5jdGlvbnMgYXJlIGNhbGxzIHRvCiAgICAgc3NsWzIzXV9yZWFkX2ludGVybmFsIHdpdGggdGhlICdwZWVrJyBmbGFnIHNldCBhcHByb3ByaWF0ZWx5LgogICAgIEEgJ3BlZWsnIHBhcmFtZXRlciBoYXMgYWxzbyBiZWVuIGFkZGVkIHRvIHNzbDNfcmVhZF9ieXRlcywgd2hpY2gKICAgICBkb2VzIHRoZSBhY3R1YWwgd29yayBmb3Igc3NsM19yZWFkX2ludGVybmFsLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluaXRpYWxpc2UgImV4X2RhdGEiIG1lbWJlciBvZiBSU0EvRFNBL0RIIHN0cnVjdHVyZXMgcHJpb3IgdG8gY2FsbGluZwogICAgIHRoZSBtZXRob2Qtc3BlY2lmaWMgImluaXQoKSIgaGFuZGxlci4gQWxzbyBjbGVhbiB1cCBleF9kYXRhIGFmdGVyCiAgICAgY2FsbGluZyB0aGUgbWV0aG9kLXNwZWNpZmljICJmaW5pc2goKSIgaGFuZGxlci4gUHJldmlvdXNseSwgdGhpcyB3YXMKICAgICBoYXBwZW5pbmcgdGhlIG90aGVyIHdheSByb3VuZC4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBJbmNyZWFzZSBCTl9DVFhfTlVNICh0aGUgbnVtYmVyIG9mIEJJR05VTXMgaW4gYSBCTl9DVFgpIHRvIDE2LgogICAgIFRoZSBwcmV2aW91cyB2YWx1ZSwgMTIsIHdhcyBub3QgYWx3YXlzIHN1ZmZpY2llbnQgZm9yIEJOX21vZF9leHAoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIHN1cmUgdGhhdCBzaGFyZWQgbGlicmFyaWVzIGdldCB0aGUgaW50ZXJuYWwgbmFtZSBlbmdpbmUgd2l0aAogICAgIHRoZSBmdWxsIHZlcnNpb24gbnVtYmVyIGFuZCBub3QganVzdCAwLiAgVGhpcyBzaG91bGQgbWFyayB0aGUKICAgICBzaGFyZWQgbGlicmFyaWVzIGFzIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlLiAgT2YgY291cnNlLCB0aGlzIHNob3VsZAogICAgIGJlIGNoYW5nZWQgYWdhaW4gd2hlbiB3ZSBjYW4gZ3VhcmFudGVlIGJhY2t3YXJkIGJpbmFyeSBjb21wYXRpYmlsaXR5LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCB0eXBvIGluIGdldF9jZXJ0X2J5X3N1YmplY3QoKSBpbiBieV9kaXIuYwogICAgIFtKZWFuLU1hcmMgRGVzcGVycmllciA8amVhbi1tYXJjLmRlc3BlcnJpZXJAY2VydHBsdXMuY29tPl0KCiAgKikgUmV3b3JrIHRoZSBzeXN0ZW0gdG8gZ2VuZXJhdGUgc2hhcmVkIGxpYnJhcmllczoKCiAgICAgLSBNYWtlIG5vdGUgb2YgdGhlIGV4cGVjdGVkIGV4dGVuc2lvbiBmb3IgdGhlIHNoYXJlZCBsaWJyYXJpZXMgYW5kCiAgICAgICBpZiB0aGVyZSBpcyBhIG5lZWQgZm9yIHN5bWJvbGljIGxpbmtzIGZyb20gZm9yIGV4YW1wbGUgbGliY3J5cHRvLnNvLjAKICAgICAgIHRvIGxpYmNyeXB0by5zby4wLjkuNy4gIFRoZXJlIGlzIGV4dGVuZGVkIGluZm8gaW4gQ29uZmlndXJlIGZvcgogICAgICAgdGhhdC4KCiAgICAgLSBNYWtlIGFzIGZldyByZWJ1aWxkcyBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyBhcyBwb3NzaWJsZS4KCiAgICAgLSBTdGlsbCBhdm9pZCBsaW5raW5nIHRoZSBPcGVuU1NMIHByb2dyYW1zIHdpdGggdGhlIHNoYXJlZCBsaWJyYXJpZXMuCgogICAgIC0gV2hlbiBpbnN0YWxsaW5nLCBpbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyaWVzIHNlcGFyYXRlbHkgZnJvbSB0aGUKICAgICAgIHN0YXRpYyBvbmVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBTU0xfQ1RYX3NldF9yZWFkX2FoZWFkIG1hY3JvIHRvIGFjdHVhbGx5IHVzZSBpdHMgYXJndW1lbnQuCgogICAgIENvcHkgU1NMX0NUWCdzIHJlYWRfYWhlYWQgZmxhZyB0byBTU0wgb2JqZWN0IGRpcmVjdGx5IGluIFNTTF9uZXcKICAgICBhbmQgbm90IGluIFNTTF9jbGVhciBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMgYWxzbyB1c2VkIGJ5IHRoZQogICAgIGFjY2VwdC9jb25uZWN0IGZ1bmN0aW9uczsgcHJldmlvdXNseSwgdGhlIHNldHRpbmdzIG1hZGUgYnkKICAgICBTU0xfc2V0X3JlYWRfYWhlYWQgd291bGQgYmUgbG9zdCBkdXJpbmcgdGhlIGhhbmRzaGFrZS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtcyByZXBvcnRlZCBieSBBbmRlcnMgR2VydHogPGdlcnR6QGVwYWN0LnNlPl0gICAgIAoKICAqKSBDb3JyZWN0IHV0aWwvbWtkZWYucGwgdG8gYmUgc2VsZWN0aXZlIGFib3V0IGRpc2FibGVkIGFsZ29yaXRobXMuCiAgICAgUHJldmlvdXNseSwgaXQgd291bGQgY3JlYXRlIGVudHJpZXMgZm9yIGRpc2FibGVlZCBhbGdvcml0aG1zIG5vCiAgICAgbWF0dGVyIHdoYXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkZWQgc2V2ZXJhbCBuZXcgbWFudWFsIHBhZ2VzIGZvciBTU0xfKiBmdW5jdGlvbi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjVhIGFuZCAwLjkuNiAgWzI0IFNlcCAyMDAwXQoKICAqKSBJbiBzc2wyM19nZXRfY2xpZW50X2hlbGxvLCBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIHdoZW4gZmFjZWQKICAgICB3aXRoIGFuIGluaXRpYWwgU1NMIDMuMC9UTFMgcmVjb3JkIHRoYXQgaXMgdG9vIHNtYWxsIHRvIGNvbnRhaW4gdGhlCiAgICAgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBDbGllbnRIZWxsbyBtZXNzYWdlLCBpLmUuIGNsaWVudF92ZXJzaW9uLgogICAgIChOb3RlIHRoYXQgdGhpcyBpcyBhIHBhdGhvbG9naWMgY2FzZSB0aGF0IHByb2JhYmx5IGhhcyBuZXZlciBoYXBwZW5lZAogICAgIGluIHJlYWwgbGlmZS4pICBUaGUgcHJldmlvdXMgYXBwcm9hY2ggd2FzIHRvIHVzZSB0aGUgdmVyc2lvbiBudW1iZXIKICAgICBmcm9tIHRoZSByZWNvcmQgaGVhZGVyIGFzIGEgc3Vic3RpdHV0ZTsgYnV0IG91ciBwcm90b2NvbCBjaG9pY2UKICAgICBzaG91bGQgbm90IGRlcGVuZCBvbiB0aGF0IG9uZSBiZWNhdXNlIGl0IGlzIG5vdCBhdXRoZW50aWNhdGVkCiAgICAgYnkgdGhlIEZpbmlzaGVkIG1lc3NhZ2VzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vcmUgcm9idXN0IHJhbmRvbW5lc3MgZ2F0aGVyaW5nIGZ1bmN0aW9ucyBmb3IgV2luZG93cy4KICAgICBbSmVmZnJleSBBbHRtYW4gPGphbHRtYW5AY29sdW1iaWEuZWR1Pl0KCiAgKikgRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyBpZiB0aGUgZmxhZyBYNTA5X1ZfRkxBR19JU1NVRVJfQ0hFQ0sgaXMKICAgICBub3Qgc2V0IHRoZW4gd2UgZG9uJ3Qgc2V0dXAgdGhlIGVycm9yIGNvZGUgZm9yIGlzc3VlciBjaGVjayBlcnJvcnMKICAgICB0byBhdm9pZCBwb3NzaWJseSBvdmVyd3JpdGluZyBvdGhlciBlcnJvcnMgd2hpY2ggdGhlIGNhbGxiYWNrIGRvZXMKICAgICBoYW5kbGUuIElmIGFuIGFwcGxpY2F0aW9uIGRvZXMgc2V0IHRoZSBmbGFnIHRoZW4gd2UgYXNzdW1lIGl0IGtub3dzCiAgICAgd2hhdCBpdCBpcyBkb2luZyBhbmQgY2FuIGhhbmRsZSB0aGUgbmV3IGluZm9ybWF0aW9uYWwgY29kZXMKICAgICBhcHByb3ByaWF0ZWx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmb3IgYSBuYXN0eSBidWcgaW4gQVNOMV9UWVBFIGhhbmRsaW5nLiBBU04xX1RZUEUgaXMgdXNlZCBmb3IKICAgICBhIGdlbmVyYWwgIkFOWSIgdHlwZSwgYXMgc3VjaCBpdCBzaG91bGQgYmUgYWJsZSB0byBkZWNvZGUgYW55dGhpbmcKICAgICBpbmNsdWRpbmcgdGFnZ2VkIHR5cGVzLiBIb3dldmVyIGl0IGRpZG4ndCBjaGVjayB0aGUgY2xhc3Mgc28gaXQgd291bGQKICAgICB3cm9uZ2x5IGludGVycHJldCB0YWdnZWQgdHlwZXMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZWlyIHVuaXZlcnNhbAogICAgIGNvdW50ZXJwYXJ0IGFuZCB1bmtub3duIHR5cGVzIHdlcmUganVzdCByZWplY3RlZC4gQ2hhbmdlZCBzbyB0aGF0IHRoZQogICAgIHRhZ2dlZCBhbmQgdW5rbm93biB0eXBlcyBhcmUgaGFuZGxlZCBpbiB0aGUgc2FtZSB3YXkgYXMgYSBTRVFVRU5DRToKICAgICB0aGF0IGlzIHRoZSBlbmNvZGluZyBpcyBzdG9yZWQgaW50YWN0LiBUaGVyZSBpcyBhbHNvIGEgbmV3IHR5cGUKICAgICAiVl9BU04xX09USEVSIiB3aGljaCBpcyB1c2VkIHdoZW4gdGhlIGNsYXNzIGlzIG5vdCB1bml2ZXJzYWwsIGluIHRoaXMKICAgICBjYXNlIHdlIGhhdmUgbm8gaWRlYSB3aGF0IHRoZSBhY3R1YWwgdHlwZSBpcyBzbyB3ZSBqdXN0IGx1bXAgdGhlbSBhbGwKICAgICB0b2dldGhlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBPbiBWTVMsIHN0ZG91dCBtYXkgdmVyeSB3ZWxsIGxlYWQgdG8gYSBmaWxlIHRoYXQgaXMgd3JpdHRlbiB0bwogICAgIGluIGEgcmVjb3JkLW9yaWVudGVkIGZhc2hpb24uICBUaGF0IG1lYW5zIHRoYXQgZXZlcnkgd3JpdGUoKSB3aWxsCiAgICAgd3JpdGUgYSBzZXBhcmF0ZSByZWNvcmQsIHdoaWNoIHdpbGwgYmUgcmVhZCBzZXBhcmF0ZWx5IGJ5IHRoZQogICAgIHByb2dyYW1zIHRyeWluZyB0byByZWFkIGZyb20gaXQuICBUaGlzIGNhbiBiZSB2ZXJ5IGNvbmZ1c2luZy4KCiAgICAgVGhlIHNvbHV0aW9uIGlzIHRvIHB1dCBhIEJJTyBmaWx0ZXIgaW4gdGhlIHdheSB0aGF0IHdpbGwgYnVmZmVyCiAgICAgdGV4dCB1bnRpbCBhIGxpbmVmZWVkIGlzIHJlYWNoZWQsIGFuZCB0aGVuIHdyaXRlIGV2ZXJ5dGhpbmcgYQogICAgIGxpbmUgYXQgYSB0aW1lLCBzbyBldmVyeSByZWNvcmQgd3JpdHRlbiB3aWxsIGJlIGFuIGFjdHVhbCBsaW5lLAogICAgIG5vdCBjaHVua3Mgb2YgbGluZXMgYW5kIG5vdCAodXN1YWxseSBkb2Vzbid0IGhhcHBlbiwgYnV0IEkndmUKICAgICBzZWVuIGl0IG9uY2UpIHNldmVyYWwgbGluZXMgaW4gb25lIHJlY29yZC4gIEJJT19mX2xpbmVidWZmZXIoKSBpcwogICAgIHRoZSBhbnN3ZXIuCgogICAgIEN1cnJlbnRseSwgaXQncyBhIFZNUy1vbmx5IG1ldGhvZCwgYmVjYXVzZSB0aGF0J3Mgd2hlcmUgaXQgaGFzCiAgICAgYmVlbiB0ZXN0ZWQgd2VsbCBlbm91Z2guCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmVtb3ZlICdvcHRpbWl6ZWQnIHNxdWFyaW5nIHZhcmlhbnQgaW4gQk5fbW9kX211bF9tb250Z29tZXJ5LAogICAgIGl0IGNhbiByZXR1cm4gaW5jb3JyZWN0IHJlc3VsdHMuCiAgICAgKE5vdGU6IFRoZSBidWdneSB2YXJpYW50IHdhcyBub3QgZW5hYmxlZCBpbiBPcGVuU1NMIDAuOS41YSwKICAgICBidXQgaXQgd2FzIGluIDAuOS42LWJldGFbMTJdLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEaXNhYmxlIHRoZSBjaGVjayBmb3IgY29udGVudCBiZWluZyBwcmVzZW50IHdoZW4gdmVyaWZ5aW5nIGRldGFjaGVkCiAgICAgc2lnbmF0dXJlcyBpbiBwazdfc21pbWUuYy4gU29tZSB2ZXJzaW9ucyBvZiBOZXRzY2FwZSAod3JvbmdseSkKICAgICBpbmNsdWRlIHplcm8gbGVuZ3RoIGNvbnRlbnQgd2hlbiBzaWduaW5nIG1lc3NhZ2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBCSU9fc2h1dGRvd25fd3IgbWFjcm8sIHdoaWNoIGludm9rZXMgdGhlIEJJT19DX1NIVVRET1dOX1dSCiAgICAgQklPX2N0cmwgKGZvciBCSU8gcGFpcnMpLgogICAgIFtCb2RvIE32bGxlcl0KCiAgKikgQWRkIERTTyBtZXRob2QgZm9yIFZNUy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBCdWcgZml4OiBNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uIGNvdWxkIHByb2R1Y2UgcmVzdWx0cyB3aXRoIHRoZQogICAgIHdyb25nIHNpZ24uCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBSUE0gc3BlY2lmaWNhdGlvbiBvcGVuc3NsLnNwZWMgYW5kIG1vZGlmeSBpdCB0byBidWlsZCB0aHJlZQogICAgIHBhY2thZ2VzLiAgVGhlIGRlZmF1bHQgcGFja2FnZSBjb250YWlucyBhcHBsaWNhdGlvbnMsIGFwcGxpY2F0aW9uCiAgICAgZG9jdW1lbnRhdGlvbiBhbmQgcnVuLXRpbWUgbGlicmFyaWVzLiAgVGhlIGRldmVsIHBhY2thZ2UgY29udGFpbnMKICAgICBpbmNsdWRlIGZpbGVzLCBzdGF0aWMgbGlicmFyaWVzIGFuZCBmdW5jdGlvbiBkb2N1bWVudGF0aW9uLiAgVGhlCiAgICAgZG9jIHBhY2thZ2UgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBkb2MgZGlyZWN0b3J5LiAgVGhlIG9yaWdpbmFsCiAgICAgb3BlbnNzbC5zcGVjIHdhcyBwcm92aWRlZCBieSBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+LgogICAgIFtSaWNoYXJkIExldml0dGVdCiAgICAgCiAgKikgQWRkIGEgbGFyZ2UgbnVtYmVyIG9mIGRvY3VtZW50YXRpb24gZmlsZXMgZm9yIG1hbnkgU1NMIHJvdXRpbmVzLgogICAgIFtMdXR6IEphZW5pY2tlIDxMdXR6LkphZW5pY2tlQGFldC5UVS1Db3R0YnVzLkRFPl0KCiAgKikgQWRkIGEgY29uZmlndXJhdGlvbiBlbnRyeSBmb3IgU29ueSBOZXdzIDQuCiAgICAgW05BS0FKSSBIaXJveXVraSA8bmFrYWppQHR1dHJwLnR1dC5hYy5qcD5dCgogICopIERvbid0IHNldCB0aGUgdHdvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyB0byBvbmUgd2hlbiBnZW5lcmF0aW5nIGEKICAgICByYW5kb20gbnVtYmVyIDwgcSBpbiB0aGUgRFNBIGxpYnJhcnkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIE5ldyBTU0wgQVBJIG1vZGUgJ1NTTF9NT0RFX0FVVE9fUkVUUlknLiAgVGhpcyBkaXNhYmxlcyB0aGUgZGVmYXVsdAogICAgIGJlaGF2aW91ciB0aGF0IFNTTF9yZWFkIG1heSByZXN1bHQgaW4gU1NMX0VSUk9SX1dBTlRfUkVBRCAoZXZlbiBpZgogICAgIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpcyBibG9ja2luZykgaWYgYSBoYW5kc2hha2UgdG9vayBwbGFjZS4KICAgICAoVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIG5lZWRlZCBieSBhcHBsaWNhdGlvbnMgc3VjaCBhcyBzX2NsaWVudAogICAgIGFuZCBzX3NlcnZlciB0aGF0IHVzZSBzZWxlY3QoKSB0byBkZXRlcm1pbmUgd2hlbiB0byB1c2UgU1NMX3JlYWQ7CiAgICAgYnV0IGZvciBhcHBsaWNhdGlvbnMgdGhhdCBrbm93IGluIGFkdmFuY2Ugd2hlbiB0byBleHBlY3QgZGF0YSwgaXQKICAgICBqdXN0IG1ha2VzIHRoaW5ncyBtb3JlIGNvbXBsaWNhdGVkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgUkFORF9lZ2RfYnl0ZXMoKSwgd2hpY2ggZ2l2ZXMgY29udHJvbCBvdmVyIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAogICAgIGZyb20gRUdELgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYSBmZXcgbW9yZSBFQkNESUMgY29uZGl0aW9uYWxzIHRoYXQgbWFrZSBgcmVxJyBhbmQgYHg1MDknCiAgICAgd29yayBiZXR0ZXIgb24gc3VjaCBzeXN0ZW1zLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoUC5TaWVtZW5zLkRlPl0KCiAgKikgQWRkIHR3byBkZW1vIHByb2dyYW1zIGZvciBQS0NTMTJfcGFyc2UoKSBhbmQgUEtDUzEyX2NyZWF0ZSgpLgogICAgIFVwZGF0ZSBQS0NTMTJfcGFyc2UoKSBzbyBpdCBjb3BpZXMgdGhlIGZyaWVuZGx5TmFtZSBhbmQgdGhlCiAgICAga2V5aWQgdG8gdGhlIGNlcnRpZmljYXRlcyBhdXggaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVnIGluIFBLQ1M3X3ZlcmlmeSgpIHdoaWNoIGNhdXNlZCBhbiBpbmZpbml0ZSBsb29wCiAgICAgaWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgc2lnbmF0dXJlLgogICAgIFtTdmVuIFVzenBlbGthdCA8c3VAY2Vsb2NvbS5kZT5dCgogICopIE1ham9yIGNoYW5nZSBpbiB1dGlsL21rZGVmLnBsIHRvIGluY2x1ZGUgZXh0cmEgaW5mb3JtYXRpb24KICAgICBhYm91dCBlYWNoIHN5bWJvbCwgYXMgd2VsbCBhcyBwcmVzZW50aWcgdmFyaWFibGVzIGFzIHdlbGwKICAgICBhcyBmdW5jdGlvbnMuICBUaGlzIGNoYW5nZSBtZWFucyB0aGF0IHRoZXJlJ3MgbiBtb3JlIG5lZWQKICAgICB0byByZWJ1aWxkIHRoZSAubnVtIGZpbGVzIHdoZW4gc29tZSBhbGdvcml0aG1zIGFyZSBleGNsdWRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBbGxvdyB0aGUgdmVyaWZ5IHRpbWUgdG8gYmUgc2V0IGJ5IGFuIGFwcGxpY2F0aW9uLAogICAgIHJhdGhlciB0aGFuIGFsd2F5cyB1c2luZyB0aGUgY3VycmVudCB0aW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCiAgCiAgKikgUGhhc2UgMiB2ZXJpZnkgY29kZSByZW9yZ2FuaXNhdGlvbi4gVGhlIGNlcnRpZmljYXRlCiAgICAgdmVyaWZ5IGNvZGUgbm93IGxvb2tzIHVwIGFuIGlzc3VlciBjZXJ0aWZpY2F0ZSBieSBhCiAgICAgbnVtYmVyIG9mIGNyaXRlcmlhOiBzdWJqZWN0IG5hbWUsIGF1dGhvcml0eSBrZXkgaWQKICAgICBhbmQga2V5IHVzYWdlLiBJdCBhbHNvIHZlcmlmaWVzIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlcwogICAgIGJ5IHRoZSBzYW1lIGNyaXRlcmlhLiBUaGUgbWFpbiBjb21wYXJpc29uIGZ1bmN0aW9uIGlzCiAgICAgWDUwOV9jaGVja19pc3N1ZWQoKSB3aGljaCBwZXJmb3JtcyB0aGVzZSBjaGVja3MuCiAKICAgICBMb3Qgb2YgY2hhbmdlcyB3ZXJlIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMKICAgICB3aXRob3V0IGNvbXBsZXRlbHkgcmV3cml0aW5nIHRoZSBsb29rdXAgY29kZS4KIAogICAgIEF1dGhvcml0eSBhbmQgc3ViamVjdCBrZXkgaWRlbnRpZmllciBhcmUgbm93IGNhY2hlZC4KIAogICAgIFRoZSBMSEFTSCAnY2VydHMnIGlzIFg1MDlfU1RPUkUgaGFzIG5vdyBiZWVuIHJlcGxhY2VkCiAgICAgYnkgYSBTVEFDS19PRihYNTA5X09CSkVDVCkuIFRoaXMgaXMgbWFpbmx5IGJlY2F1c2UgYW4KICAgICBMSEFTSCBjYW4ndCBzdG9yZSBvciByZXRyaWV2ZSBtdWx0aXBsZSBvYmplY3RzIHdpdGgKICAgICB0aGUgc2FtZSBoYXNoIHZhbHVlLgoKICAgICBBcyBhIHJlc3VsdCB2YXJpb3VzIGZ1bmN0aW9ucyAod2hpY2ggd2VyZSBhbGwgaW50ZXJuYWwKICAgICB1c2Ugb25seSkgaGF2ZSBjaGFuZ2VkIHRvIGhhbmRsZSB0aGUgbmV3IFg1MDlfU1RPUkUKICAgICBzdHJ1Y3R1cmUuIFRoaXMgd2lsbCBicmVhayBhbnl0aGluZyB0aGF0IG1lc3NlZCByb3VuZAogICAgIHdpdGggWDUwOV9TVE9SRSBpbnRlcm5hbGx5LgogCiAgICAgVGhlIGZ1bmN0aW9ucyBYNTA5X1NUT1JFX2FkZF9jZXJ0KCkgbm93IGNoZWNrcyBmb3IgYW4KICAgICBleGFjdCBtYXRjaCwgcmF0aGVyIHRoYW4ganVzdCBzdWJqZWN0IG5hbWUuCiAKICAgICBUaGUgWDUwOV9TVE9SRSBBUEkgZG9lc24ndCBkaXJlY3RseSBzdXBwb3J0IHRoZSByZXRyaWV2YWwKICAgICBvZiBtdWx0aXBsZSBjZXJ0aWZpY2F0ZXMgbWF0Y2hpbmcgYSBnaXZlbiBjcml0ZXJpYSwgaG93ZXZlcgogICAgIHRoaXMgY2FuIGJlIHdvcmtlZCByb3VuZCBieSBwZXJmb3JtaW5nIGEgbG9va3VwIGZpcnN0CiAgICAgKHdoaWNoIHdpbGwgZmlsbCB0aGUgY2FjaGUgd2l0aCBjYW5kaWRhdGUgY2VydGlmaWNhdGVzKQogICAgIGFuZCB0aGVuIGV4YW1pbmluZyB0aGUgY2FjaGUgZm9yIG1hdGNoZXMuIFRoaXMgaXMgcHJvYmFibHkKICAgICB0aGUgYmVzdCB3ZSBjYW4gZG8gd2l0aG91dCB0aHJvd2luZyBvdXQgWDUwOV9MT09LVVAKICAgICBlbnRpcmVseSAobWF5YmUgbGF0ZXIuLi4pLgogCiAgICAgVGhlIFg1MDlfVkVSSUZZX0NUWCBzdHJ1Y3R1cmUgaGFzIGJlZW4gZW5oYW5jZWQgY29uc2lkZXJhYmx5LgogCiAgICAgQWxsIGNlcnRpZmljYXRlIGxvb2t1cCBvcGVyYXRpb25zIG5vdyBnbyB2aWEgYSBnZXRfaXNzdWVyKCkKICAgICBjYWxsYmFjay4gQWx0aG91Z2ggdGhpcyBjdXJyZW50bHkgdXNlcyBhbiBYNTA5X1NUT1JFIGl0CiAgICAgY2FuIGJlIHJlcGxhY2VkIGJ5IGN1c3RvbSBsb29rdXBzLiBUaGlzIGlzIGEgc2ltcGxlIHdheQogICAgIHRvIGJ5cGFzcyB0aGUgWDUwOV9TVE9SRSBoYWNrZXJ5IG5lY2Vzc2FyeSB0byBtYWtlIHRoaXMKICAgICB3b3JrIGFuZCBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgbW9yZSBlZmZpY2llbnQgdGVjaG5pcXVlcwogICAgIGluIGZ1dHVyZS4gQSB2ZXJ5IHNpbXBsZSB2ZXJzaW9uIHdoaWNoIHVzZXMgYSBzaW1wbGUKICAgICBTVEFDSyBmb3IgaXRzIHRydXN0ZWQgY2VydGlmaWNhdGUgc3RvcmUgaXMgYWxzbyBwcm92aWRlZAogICAgIHVzaW5nIFg1MDlfU1RPUkVfQ1RYX3RydXN0ZWRfc3RhY2soKS4KIAogICAgIFRoZSB2ZXJpZnlfY2IoKSBhbmQgdmVyaWZ5KCkgY2FsbGJhY2tzIG5vdyBoYXZlIGVxdWl2YWxlbnRzCiAgICAgaW4gdGhlIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZS4KIAogICAgIFg1MDlfU1RPUkVfQ1RYIGFsc28gaGFzIGEgJ2ZsYWdzJyBmaWVsZCB3aGljaCBjYW4gYmUgdXNlZAogICAgIHRvIGN1c3RvbWlzZSB0aGUgdmVyaWZ5IGJlaGF2aW91ci4KICAgICBbU3RldmUgSGVuc29uXQogCiAgKikgQWRkIG5ldyBQS0NTIzcgc2lnbmluZyBvcHRpb24gUEtDUzdfTk9TTUlNRUNBUCB3aGljaCAKICAgICBleGNsdWRlcyBTL01JTUUgY2FwYWJpbGl0aWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdoZW4gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGlzIHJlYWQgaW4ga2VlcCBhIGNvcHkgb2YgdGhlCiAgICAgb3JpZ2luYWwgZW5jb2Rpbmcgb2YgdGhlIHNpZ25lZCBkYXRhIGFuZCB1c2UgaXQgd2hlbiBvdXRwdXRpbmcKICAgICBhZ2Fpbi4gU2lnbmF0dXJlcyB0aGVuIHVzZSB0aGUgb3JpZ2luYWwgZW5jb2RpbmcgcmF0aGVyIHRoYW4KICAgICBhIGRlY29kZWQsIGVuY29kZWQgdmVyc2lvbiB3aGljaCBtYXkgY2F1c2UgcHJvYmxlbXMgaWYgdGhlCiAgICAgcmVxdWVzdCBpcyBpbXByb3Blcmx5IGVuY29kZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgQklPX3B1dHMgaW1wbGVtZW50YXRpb25zLCBjYWxsCiAgICAgYnVmZmVyX3dyaXRlKGIsIC4uLikgZGlyZWN0bHkgaW4gYnVmZmVyX3B1dHMgaW5zdGVhZCBvZiBjYWxsaW5nCiAgICAgQklPX3dyaXRlKGIsIC4uLikuCgogICAgIEluIEJJT19wdXRzLCBpbmNyZW1lbnQgYi0+bnVtX3dyaXRlIGFzIGluIEJJT193cml0ZS4KICAgICBbUGV0ZXIuU3lsdmVzdGVyQEVkZWxXZWIuZnJdCgogICopIEZpeCBCTl9tdWxfd29yZCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHdvcmQgaXMgMC4gKFdlIGhhdmUgdG8gdXNlCiAgICAgQk5femVybywgd2UgbWF5IG5vdCByZXR1cm4gYSBCSUdOVU0gd2l0aCBhbiBhcnJheSBjb25zaXN0aW5nIG9mCiAgICAgd29yZHMgc2V0IHRvIHplcm8uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkIGNhbGxpbmcgYWJvcnQoKSBmcm9tIHdpdGhpbiB0aGUgbGlicmFyeSB3aGVuIHByb2JsZW1zIGFyZQogICAgIGRldGVjdGVkLCBleGNlcHQgaWYgcHJlcHJvY2Vzc29yIHN5bWJvbHMgaGF2ZSBiZWVuIGRlZmluZWQKICAgICAoc3VjaCBhcyBSRUZfQ0hFQ0ssIEJOX0RFQlVHIGV0Yy4pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBvcGVuc3NsIGFwcGxpY2F0aW9uICdyc2F1dGwnLiBUaGlzIHV0aWxpdHkgY2FuIGJlCiAgICAgdXNlZCBmb3IgbG93IGxldmVsIFJTQSBvcGVyYXRpb25zLiBERVIgcHVibGljIGtleQogICAgIEJJTy9mcCByb3V0aW5lcyBhbHNvIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBDb25maWd1cmUgZW50cnkgYW5kIHBhdGNoZXMgZm9yIGNvbXBpbGluZyBvbiBRTlggNC4KICAgICBbQW5kcmVhcyBTY2huZWlkZXIgPGFuZHJlYXNAZHMzLmV0ZWNoLmZoLWhhbWJ1cmcuZGU+XQoKICAqKSBBIGRlbW8gc3RhdGUtbWFjaGluZSBpbXBsZW1lbnRhdGlvbiB3YXMgc3BvbnNvcmVkIGJ5CiAgICAgTnVyb24gKGh0dHA6Ly93d3cubnVyb24uY29tLykgYW5kIGlzIG5vdyBhdmFpbGFibGUgaW4KICAgICBkZW1vcy9zdGF0ZV9tYWNoaW5lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBOZXcgb3B0aW9ucyBhZGRlZCB0byB0aGUgJ2Rnc3QnIHV0aWxpdHkgZm9yIHNpZ25hdHVyZQogICAgIGdlbmVyYXRpb24gYW5kIHZlcmlmaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVbnJlY29nbml6ZWQgUEtDUyM3IGNvbnRlbnQgdHlwZXMgYXJlIG5vdyBoYW5kbGVkIHZpYSBhCiAgICAgY2F0Y2ggYWxsIEFTTjFfVFlQRSBzdHJ1Y3R1cmUuIFRoaXMgYWxsb3dzIHVuc3VwcG9ydGVkCiAgICAgdHlwZXMgdG8gYmUgc3RvcmVkIGFzIGEgImJsb2IiIGFuZCBhbiBhcHBsaWNhdGlvbiBjYW4KICAgICBlbmNvZGUgYW5kIGRlY29kZSBpdCBtYW51YWxseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdmFyaW91cyBzaWduZWQvdW5zaWduZWQgaXNzdWVzIHRvIG1ha2UgYV9zdHJleC5jCiAgICAgY29tcGlsZSB1bmRlciBWQysrLgogICAgIFtPc2NhciBKYWNvYnNzb24gPG9zY2FyLmphY29ic3NvbkBjZWxvY29tLmNvbT5dCgogICopIEFTTjEgZml4ZXMuIGkyZF9BU04xX09CSkVDVCB3YXMgbm90IHJldHVybmluZyB0aGUgY29ycmVjdAogICAgIGxlbmd0aCBpZiBwYXNzZWQgYSBidWZmZXIuIEFTTjFfSU5URUdFUl90b19CTiBmYWlsZWQKICAgICBpZiBwYXNzZWQgYSBOVUxMIEJOIGFuZCBpdHMgYXJndW1lbnQgd2FzIG5lZ2F0aXZlLgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IFN2ZW4gSGVpYmVyZyA8c3ZlbkB0YXJ0dS5jeWJlci5lZT5dCgogICopIE1vZGlmaWNhdGlvbiB0byBQS0NTIzcgZW5jb2Rpbmcgcm91dGluZXMgdG8gb3V0cHV0IGRlZmluaXRlCiAgICAgbGVuZ3RoIGVuY29kaW5nLiBTaW5jZSBjdXJyZW50bHkgdGhlIHdob2xlIHN0cnVjdHVyZXMgYXJlIGluCiAgICAgbWVtb3J5IHRoZXJlJ3Mgbm90IHJlYWwgcG9pbnQgaW4gdXNpbmcgaW5kZWZpbml0ZSBsZW5ndGggCiAgICAgY29uc3RydWN0ZWQgZW5jb2RpbmcuIEhvd2V2ZXIgaWYgT3BlblNTTCBpcyBjb21waWxlZCB3aXRoCiAgICAgdGhlIGZsYWcgUEtDUzdfSU5ERUZJTklURV9FTkNPRElORyB0aGUgb2xkIGZvcm0gaXMgdXNlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBCSU9fdnByaW50ZigpIGFuZCBCSU9fdnNucHJpbnRmKCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkZWQgbW9yZSBwcmVmaXhlcyB0byBwYXJzZSBmb3IgaW4gdGhlIHRoZSBzdHJpbmdzIHdyaXR0ZW4KICAgICB0aHJvdWdoIGEgbG9nZ2luZyBiaW8sIHRvIGNvdmVyIGFsbCB0aGUgbGV2ZWxzIHRoYXQgYXJlIGF2YWlsYWJsZQogICAgIHRocm91Z2ggc3lzbG9nLiAgVGhlIHByZWZpeGVzIGFyZSBub3c6CgoJUEFOSUMsIEVNRVJHLCBFTVIJPT4JTE9HX0VNRVJHCglBTEVSVCwgQUxSCQk9PglMT0dfQUxFUlQKCUNSSVQsIENSSQkJPT4JTE9HX0NSSVQKCUVSUk9SLCBFUlIJCT0+CUxPR19FUlIKCVdBUk5JTkcsIFdBUk4sIFdBUgk9PglMT0dfV0FSTklORwoJTk9USUNFLCBOT1RFLCBOT1QJPT4JTE9HX05PVElDRQoJSU5GTywgSU5GCQk9PglMT0dfSU5GTwoJREVCVUcsIERCRwkJPT4JTE9HX0RFQlVHCgogICAgIGFuZCBhcyBiZWZvcmUsIGlmIG5vbmUgb2YgdGhvc2UgcHJlZml4ZXMgYXJlIHByZXNlbnQgYXQgdGhlCiAgICAgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIExPR19FUlIgaXMgY2hvc2VuLgoKICAgICBPbiBXaW4zMiwgdGhlIExPR18qIGxldmVscyBhcmUgbWFwcGVkIGFjY29yZGluZyB0byB0aGlzOgoKCUxPR19FTUVSRywgTE9HX0FMRVJULCBMT0dfQ1JJVCwgTE9HX0VSUgk9PiBFVkVOVExPR19FUlJPUl9UWVBFCglMT0dfV0FSTklORwkJCQk9PiBFVkVOVExPR19XQVJOSU5HX1RZUEUKCUxPR19OT1RJQ0UsIExPR19JTkZPLCBMT0dfREVCVUcJCT0+IEVWRU5UTE9HX0lORk9STUFUSU9OX1RZUEUKCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFkZSBpdCBwb3NzaWJsZSB0byByZWNvbmZpZ3VyZSB3aXRoIGp1c3QgdGhlIGNvbmZpZ3VyYXRpb24KICAgICBhcmd1bWVudCAicmVjb25mIiBvciAicmVjb25maWd1cmUiLiAgVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKICAgICBhcmUgc3RvcmVkIGluIE1ha2VmaWxlLnNzbCBpbiB0aGUgdmFyaWFibGUgQ09ORklHVVJFX0FSR1MsCiAgICAgYW5kIGFyZSByZXRyaWV2ZWQgZnJvbSB0aGVyZSB3aGVuIHJlY29uZmlndXJpbmcuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTUQ0IGltcGxlbWVudGVkLgogICAgIFtBc3NhciBXZXN0ZXJsdW5kIDxhc3NhckBzaWNzLnNlPiwgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGFyZ3VtZW50cyAtQ0FmaWxlIGFuZCAtQ0FwYXRoIHRvIHRoZSBwa2NzMTIgdXRpbGl0eS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUaGUgb2JqX2RhdC5wbCBzY3JpcHQgd2FzIG1lc3NpbmcgdXAgdGhlIHNvcnRpbmcgb2Ygb2JqZWN0CiAgICAgbmFtZXMuIFRoZSByZWFzb24gd2FzIHRoYXQgaXQgY29tcGFyZWQgdGhlIHF1b3RlZCB2ZXJzaW9uCiAgICAgb2Ygc3RyaW5ncyBhcyBhIHJlc3VsdCAiT0NTUCIgPiAiT0NTUCBTaWduaW5nIiBiZWNhdXNlCiAgICAgIiA+IFNQQUNFLiBDaGFuZ2VkIHNjcmlwdCB0byBzdG9yZSB1bnF1b3RlZCB2ZXJzaW9ucyBvZgogICAgIG5hbWVzIGFuZCBhZGQgcXVvdGVzIG9uIG91dHB1dC4gSXQgd2FzIGFsc28gb21pdHRpbmcgc29tZQogICAgIG5hbWVzIGZyb20gdGhlIGxvb2t1cCB0YWJsZSBpZiB0aGV5IHdlcmUgZ2l2ZW4gYSBkZWZhdWx0CiAgICAgdmFsdWUgKHRoYXQgaXMgaWYgU04gaXMgbWlzc2luZyBpdCBpcyBnaXZlbiB0aGUgc2FtZQogICAgIHZhbHVlIGFzIExOIGFuZCB2aWNlIHZlcnNhKSwgdGhlc2UgYXJlIG5vdyBhZGRlZCBvbiB0aGUKICAgICBncm91bmRzIHRoYXQgaWYgYW4gb2JqZWN0IGhhcyBhIG5hbWUgd2Ugc2hvdWxkIGJlIGFibGUgdG8KICAgICBsb29rIGl0IHVwLiBGaW5hbGx5IGFkZGVkIHdhcm5pbmcgb3V0cHV0IHdoZW4gZHVwbGljYXRlCiAgICAgc2hvcnQgb3IgbG9uZyBuYW1lcyBhcmUgZm91bmQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlcyBuZWVkZWQgZm9yIFRhbmRlbSBOU0suCiAgICAgW1Njb3R0IFVyb2ZmIDxzY290dEB4eXByby5jb20+XQoKICAqKSBGaXggU1NMIDIuMCByb2xsYmFjayBjaGVja2luZzogRHVlIHRvIGFuIG9mZi1ieS1vbmUgZXJyb3IgaW4KICAgICBSU0FfcGFkZGluZ19jaGVja19TU0x2MjMoKSwgc3BlY2lhbCBwYWRkaW5nIHdhcyBuZXZlciBkZXRlY3RlZAogICAgIGFuZCB0aHVzIHRoZSBTU0wgMy4wL1RMUyAxLjAgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBwcm90b2NvbAogICAgIHZlcnNpb24gcm9sbGJhY2sgYXR0YWNrcyB3YXMgbm90IGVmZmVjdGl2ZS4KCiAgICAgSW4gczIzX2NsbnQuYywgZG9uJ3QgdXNlIHNwZWNpYWwgcm9sbGJhY2stYXR0YWNrIGRldGVjdGlvbiBwYWRkaW5nCiAgICAgKFJTQV9TU0xWMjNfUEFERElORykgaWYgU1NMIDIuMCBpcyB0aGUgb25seSBwcm90b2NvbCBlbmFibGVkIGluIHRoZQogICAgIGNsaWVudDsgc2ltaWxhcmx5LCBpbiBzMjNfc3J2ci5jLCBkb24ndCBkbyB0aGUgcm9sbGJhY2sgY2hlY2sgaWYKICAgICBTU0wgMi4wIGlzIHRoZSBvbmx5IHByb3RvY29sIGVuYWJsZWQgaW4gdGhlIHNlcnZlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGdldCBoZXhkdW1wcyBvZiB1bnByaW50YWJsZSBkYXRhIHdpdGggJ29wZW5zc2wKICAgICBhc24xcGFyc2UnLiAgQnkgaW1wbGljYXRpb24sIHRoZSBmdW5jdGlvbnMgQVNOMV9wYXJzZV9kdW1wKCkgYW5kCiAgICAgQklPX2R1bXBfaW5kZW50KCkgYXJlIGFkZGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbnMgQVNOMV9TVFJJTkdfcHJpbnRfZXgoKSBhbmQgWDUwOV9OQU1FX3ByaW50X2V4KCkKICAgICB0aGVzZSBwcmludCBvdXQgc3RyaW5ncyBhbmQgbmFtZSBzdHJ1Y3R1cmVzIGJhc2VkIG9uIHZhcmlvdXMKICAgICBmbGFncyBpbmNsdWRpbmcgUkZDMjI1MyBzdXBwb3J0IGFuZCBwcm9wZXIgaGFuZGxpbmcgb2YKICAgICBtdWx0aWJ5dGUgY2hhcmFjdGVycy4gQWRkZWQgb3B0aW9ucyB0byB0aGUgJ3g1MDknIHV0aWxpdHkgCiAgICAgdG8gYWxsb3cgdGhlIHZhcmlvdXMgZmxhZ3MgdG8gYmUgc2V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgZml4ZXMgdG8gdXNlIEFTTjFfVElNRSBpbnN0ZWFkIG9mIEFTTjFfVVRDVElNRS4KICAgICBBbHNvIGNoYW5nZSB0aGUgZnVuY3Rpb25zIFg1MDlfY21wX2N1cnJlbnRfdGltZSgpIGFuZAogICAgIFg1MDlfZ210aW1lX2FkaigpIHdvcmsgd2l0aCBhbiBBU04xX1RJTUUgc3RydWN0dXJlLAogICAgIHRoaXMgd2lsbCBlbmFibGUgY2VydGlmaWNhdGVzIHVzaW5nIEdlbmVyYWxpemVkVGltZSBpbiB2YWxpZGl0eQogICAgIGRhdGVzIHRvIGJlIGNoZWNrZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgTkVHX1BVQktFWV9CVUcgY29kZSAod2hpY2ggdG9sZXJhdGVzIGludmFsaWQKICAgICBuZWdhdGl2ZSBwdWJsaWMga2V5IGVuY29kaW5ncykgb24gYnkgZGVmYXVsdCwKICAgICBOT19ORUdfUFVCS0VZX0JVRyBjYW4gYmUgc2V0IHRvIGRpc2FibGUgaXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIGMyaV9BU04xX09CSkVDVCgpIHdoaWNoIGFjdHMgb24gQVNOMV9PQkpFQ1QKICAgICBjb250ZW50IG9jdGV0cy4gQW4gaTJjX0FTTjFfT0JKRUNUIGlzIHVubmVjZXNzYXJ5IGJlY2F1c2UKICAgICB0aGUgZW5jb2RpbmcgY2FuIGJlIHRyaXZpYWxseSBvYnRhaW5lZCBmcm9tIHRoZSBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgY3J5cHRvL2Vyci5jIGxvY2tpbmcgYnVnZml4OiBVc2Ugd3JpdGUgbG9ja3MgKENSWVBUT193X1t1bl1sb2NrKSwKICAgICBub3QgcmVhZCBsb2NrcyAoQ1JZUFRPX3JfW3VuXWxvY2spLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEEgZmlyc3QgYXR0ZW1wdCBhdCBjcmVhdGluZyBvZmZpY2lhbCBzdXBwb3J0IGZvciBzaGFyZWQKICAgICBsaWJyYXJpZXMgdGhyb3VnaCBjb25maWd1cmF0aW9uLiAgSSd2ZSBrZXB0IGl0IHNvIHRoZQogICAgIGRlZmF1bHQgaXMgc3RhdGljIGxpYnJhcmllcyBvbmx5LCBhbmQgdGhlIE9wZW5TU0wgcHJvZ3JhbXMKICAgICBhcmUgYWx3YXlzIHN0YXRpY2FsbHkgbGlua2VkIGZvciBub3csIGJ1dCB0aGVyZSBhcmUKICAgICBwcmVwYXJhdGlvbnMgZm9yIGR5bmFtaWMgbGlua2luZyBpbiBwbGFjZS4KICAgICBUaGlzIGhhcyBiZWVuIHRlc3RlZCBvbiBMaW51eCBhbmQgVHJ1NjQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmFuZG9tbmVzcyBwb2xsaW5nIGZ1bmN0aW9uIGZvciBXaW45eCwgYXMgZGVzY3JpYmVkIGluOgogICAgIFBldGVyIEd1dG1hbm4sIFNvZnR3YXJlIEdlbmVyYXRpb24gb2YgUHJhY3RpY2FsbHkgU3Ryb25nCiAgICAgUmFuZG9tIE51bWJlcnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBzbyBQUk5HIGlzIHNlZWRlZCBpbiByZXEgaWYgdXNpbmcgYW4gYWxyZWFkeSBleGlzdGluZwogICAgIERTQSBrZXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbnMgdG8gc21pbWUgYXBwbGljYXRpb24uIC1pbmZvcm0gYW5kIC1vdXRmb3JtCiAgICAgYWxsb3cgYWx0ZXJuYXRpdmUgZm9ybWF0cyBmb3IgdGhlIFMvTUlNRSBtZXNzYWdlIGluY2x1ZGluZwogICAgIFBFTSBhbmQgREVSLiBUaGUgLWNvbnRlbnQgb3B0aW9uIGFsbG93cyB0aGUgY29udGVudCB0byBiZQogICAgIHNwZWNpZmllZCBzZXBhcmF0ZWx5LiBUaGlzIHNob3VsZCBhbGxvdyB0aGluZ3MgbGlrZSBOZXRzY2FwZQogICAgIGZvcm0gc2lnbmluZyBvdXRwdXQgZWFzaWVyIHRvIHZlcmlmeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIEFTTjEgZW5jb2Rpbmcgb2YgdGFncyB1c2luZyB0aGUgJ2xvbmcgZm9ybScuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IEFTTjEgZnVuY3Rpb25zLCBpMmNfKiBhbmQgYzJpXyogZm9yIElOVEVHRVIgYW5kIEJJVAogICAgIFNUUklORyB0eXBlcy4gVGhlc2UgY29udmVydCBjb250ZW50IG9jdGV0cyB0byBhbmQgZnJvbSB0aGUKICAgICB1bmRlcmx5aW5nIHR5cGUuIFRoZSBhY3R1YWwgdGFnIGFuZCBsZW5ndGggb2N0ZXRzIGFyZQogICAgIGFscmVhZHkgYXNzdW1lZCB0byBoYXZlIGJlZW4gcmVhZCBpbiBhbmQgY2hlY2tlZC4gVGhlc2UKICAgICBhcmUgbmVlZGVkIGJlY2F1c2UgYWxsIG90aGVyIHN0cmluZyB0eXBlcyBoYXZlIHZpcnR1YWxseQogICAgIGlkZW50aWNhbCBoYW5kbGluZyBhcGFydCBmcm9tIHRoZSB0YWcuIEJ5IGhhdmluZyB2ZXJzaW9ucwogICAgIG9mIHRoZSBBU04xIGZ1bmN0aW9ucyB0aGF0IGp1c3Qgb3BlcmF0ZSBvbiBjb250ZW50IG9jdGV0cwogICAgIElNUExJQ0lUIHRhZ2dpbmcgY2FuIGJlIGhhbmRsZWQgcHJvcGVybHkuIEl0IGFsc28gYWxsb3dzCiAgICAgdGhlIEFTTjFfRU5VTUVSQVRFRCBjb2RlIHRvIGJlIGN1dCBkb3duIGJlY2F1c2UgQVNOMV9FTlVNRVJBVEVECiAgICAgYW5kIEFTTjFfSU5URUdFUiBhcmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHRhZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIGhhbmRsaW5nIG9mIE9JRCBvYmplY3RzIGFzIGZvbGxvd3M6CgogICAgIC0gTmV3IG9iamVjdCBpZGVudGlmaWVycyBhcmUgaW5zZXJ0ZWQgaW4gb2JqZWN0cy50eHQsIGZvbGxvd2luZwogICAgICAgdGhlIHN5bnRheCBnaXZlbiBpbiBvYmplY3RzLlJFQURNRS4KICAgICAtIG9iamVjdHMucGwgaXMgdXNlZCB0byBwcm9jZXNzIG9ial9tYWMubnVtIGFuZCBjcmVhdGUgYSBuZXcKICAgICAgIG9ial9tYWMuaC4KICAgICAtIG9ial9kYXQucGwgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb2JqX2RhdC5oLCB1c2luZyB0aGUgZGF0YSBpbgogICAgICAgb2JqX21hYy5oLgoKICAgICBUaGlzIGlzIGN1cnJlbnRseSBraW5kIG9mIGEgaGFjaywgYW5kIHRoZSBwZXJsIGNvZGUgaW4gb2JqZWN0cy5wbAogICAgIGlzbid0IHZlcnkgZWxlZ2FudCwgYnV0IGl0IHdvcmtzIGFzIEkgaW50ZW5kZWQuICBUaGUgc2ltcGxlc3Qgd2F5CiAgICAgdG8gY2hlY2sgdGhhdCBpdCB3b3JrZWQgY29ycmVjdGx5IGlzIHRvIGxvb2sgaW4gb2JqX2RhdC5oIGFuZAogICAgIGNoZWNrIHRoZSBhcnJheSBuaWRfb2JqcyBhbmQgbWFrZSBzdXJlIHRoZSBvYmplY3RzIGhhdmVuJ3QgbW92ZWQKICAgICBhcm91bmQgKHRoaXMgaXMgaW1wb3J0YW50ISkuICBBZGRpdGlvbnMgYXJlIE9LLCBhcyB3ZWxsIGFzCiAgICAgY29uc2lzdGVudCBuYW1lIGNoYW5nZXMuIAogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBCU0Qtc3R5bGUgTUQ1LWJhc2VkIHBhc3N3b3JkcyB0byAnb3BlbnNzbCBwYXNzd2QnIChvcHRpb24gJy0xJykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkaXRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgJy1yYW5kIGZpbGUnIHRvICdvcGVuc3NsIHJlcScuCiAgICAgVGhlIGdpdmVuIGZpbGUgYWRkcyB0byB3aGF0ZXZlciBoYXMgYWxyZWFkeSBiZWVuIHNlZWRlZCBpbnRvIHRoZQogICAgIHJhbmRvbSBwb29sIHRocm91Z2ggdGhlIFJBTkRGSUxFIGNvbmZpZ3VyYXRpb24gZmlsZSBvcHRpb24gb3IKICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgdGhlIGRlZmF1bHQgcmFuZG9tIHN0YXRlIGZpbGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgbWtzdGFjay5wbCBub3cgc29ydHMgZWFjaCBtYWNybyBncm91cCBpbnRvIGxleGljYWwgb3JkZXIuCiAgICAgUHJldmlvdXNseSB0aGUgb3V0cHV0IG9yZGVyIGRlcGVuZGVkIG9uIHRoZSBvcmRlciB0aGUgZmlsZXMKICAgICBhcHBlYXJlZCBpbiB0aGUgZGlyZWN0b3J5LCByZXN1bHRpbmcgaW4gbmVlZGxlc3MgcmV3cml0aW5nCiAgICAgb2Ygc2FmZXN0YWNrLmggLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBhdGNoZXMgdG8gbWFrZSBPcGVuU1NMIGNvbXBpbGUgdW5kZXIgV2luMzIgYWdhaW4uIE1vc3RseQogICAgIHdvcmsgYXJvdW5kcyBmb3IgdGhlIFZDKysgcHJvYmxlbSB0aGF0IGl0IHRyZWF0cyBmdW5jKCkgYXMKICAgICBmdW5jKHZvaWQpLiBBbHNvIHN0cmlwcGVkIG91dCB0aGUgcGFydHMgb2YgbWtkZWYucGwgdGhhdAogICAgIGFkZGVkIGV4dHJhIHR5cGVzYWZlIGZ1bmN0aW9uczogdGhlc2Ugbm8gbG9uZ2VyIGV4aXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pc2F0aW9uIG9mIHRoZSBzdGFjayBjb2RlLiBUaGUgbWFjcm9zIGFyZSBub3cgYWxsIAogICAgIGNvbGxlY3RlZCBpbiBzYWZlc3RhY2suaCAuIEVhY2ggbWFjcm8gaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZgogICAgIGEgInN0YWNrIG1hY3JvIiBvZiB0aGUgZm9ybSBTS01fPG5hbWU+KHR5cGUsIGEsIGIpLiBUaGUgCiAgICAgREVCVUdfU0FGRVNUQUNLIGlzIG5vdyBoYW5kbGVkIGluIHRlcm1zIG9mIGZ1bmN0aW9uIGNhc3RzLAogICAgIHRoaXMgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgcmV0YWluaW5nIHR5cGUgc2FmZXR5IHdpdGhvdXQgdGhlCiAgICAgdXNlIG9mIGFkZGl0aW9uYWwgZnVuY3Rpb25zLiBJZiBERUJVR19TQUZFU1RBQ0sgaXMgbm90IGRlZmluZWQKICAgICB0aGVuIHRoZSBub24gdHlwZXNhZmUgbWFjcm9zIGFyZSB1c2VkIGluc3RlYWQuIEFsc28gbW9kaWZpZWQgdGhlCiAgICAgbWtzdGFjay5wbCBzY3JpcHQgdG8gaGFuZGxlIHRoZSBuZXcgZm9ybS4gTmVlZHMgdGVzdGluZyB0byBzZWUKICAgICBpZiB3aGljaCAoaWYgYW55KSBjb21waWxlcnMgaXQgY2hva2VzIGFuZCBtYXliZSBtYWtlIERFQlVHX1NBRkVTVEFDSwogICAgIHRoZSBkZWZhdWx0IGlmIG5vIG1ham9yIHByb2JsZW1zLiBTaW1pbGFyIGJlaGF2aW91ciBmb3IgQVNOMV9TRVRfT0YKICAgICBhbmQgUEtDUzEyX1NUQUNLX09GLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdoZW4gc29tZSB2ZXJzaW9ucyBvZiBJSVMgdXNlIHRoZSAnTkVUJyBmb3JtIG9mIHByaXZhdGUga2V5IHRoZQogICAgIGtleSBkZXJpdmF0aW9uIGFsZ29yaXRobSBpcyBkaWZmZXJlbnQuIE5vcm1hbGx5IE1ENShwYXNzd29yZCkgaXMKICAgICB1c2VkIGFzIGEgMTI4IGJpdCBSQzQga2V5LiBJbiB0aGUgbW9kaWZpZWQgY2FzZQogICAgIE1ENShNRDUocGFzc3dvcmQpICsgIlNHQ0tFWVNBTFQiKSAgaXMgdXNlZCBpbnN0ZWQuIEFkZGVkIHNvbWUKICAgICBuZXcgZnVuY3Rpb25zIGkyZF9SU0FfTkVUKCksIGQyaV9SU0FfTkVUKCkgZXRjIHdoaWNoIGFyZSB0aGUgc2FtZQogICAgIGFzIHRoZSBvbGQgTmV0c2NhcGVfUlNBIGZ1bmN0aW9ucyBleGNlcHQgdGhleSBoYXZlIGFuIGFkZGl0aW9uYWwKICAgICAnc2dja2V5JyBwYXJhbWV0ZXIgd2hpY2ggdXNlcyB0aGUgbW9kaWZpZWQgYWxnb3JpdGhtLiBBbHNvIGFkZGVkCiAgICAgYW4gLXNnY2tleSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHRoZSByc2EgdXRpbGl0eS4gVGhhbmtzIHRvIAogICAgIEFkcmlhbiBQZWNrIDxiZXJ0aWVAbmNpcGhlci5jb20+IGZvciBwb3N0aW5nIGRldGFpbHMgb2YgdGhlIG1vZGlmaWVkCiAgICAgYWxnb3JpdGhtIHRvIG9wZW5zc2wtZGV2LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBldnBfbG9jYWwuaCBtYWNyb3Mgd2VyZSB1c2luZyAnYy4jI2tuYW1lJyB3aGljaCByZXN1bHRlZCBpbgogICAgIGludmFsaWQgZXhwYW5zaW9uIG9uIHNvbWUgc3lzdGVtcyAoU0NPIDUuMC41IGZvciBleGFtcGxlKS4KICAgICBDb3JyZWN0ZWQgdG8gJ2Mua25hbWUnLgogICAgIFtQaGlsbGlwIFBvcmNoIDxyb290QHRoZXBvcmNoLmNvbT5dCgogICopIE5ldyBYNTA5X2dldDFfZW1haWwoKSBhbmQgWDUwOV9SRVFfZ2V0MV9lbWFpbCgpIGZ1bmN0aW9ucyB0aGF0IHJldHVybgogICAgIGEgU1RBQ0sgb2YgZW1haWwgYWRkcmVzc2VzIGZyb20gYSBjZXJ0aWZpY2F0ZSBvciByZXF1ZXN0LCB0aGVzZSBsb29rCiAgICAgaW4gdGhlIHN1YmplY3QgbmFtZSBhbmQgdGhlIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZSBleHRlbnNpb25zIGFuZCAKICAgICBvbWl0IGFueSBkdXBsaWNhdGUgYWRkcmVzc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlLWltcGxlbWVudCBCTl9tb2RfZXhwMl9tb250IHVzaW5nIGluZGVwZW5kZW50IChhbmQgbGFyZ2VyKSB3aW5kb3dzLgogICAgIFRoaXMgbWFrZXMgRFNBIHZlcmlmaWNhdGlvbiBhYm91dCAyICUgZmFzdGVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY3JlYXNlIG1heGltdW0gd2luZG93IHNpemUgaW4gQk5fbW9kX2V4cF8uLi4gdG8gNiBiaXRzIGluc3RlYWQgb2YgNQogICAgIChtZWFuaW5nIHRoYXQgbm93IDJeNSB2YWx1ZXMgd2lsbCBiZSBwcmVjb21wdXRlZCwgd2hpY2ggaXMgb25seSA0IEtCCiAgICAgcGx1cyBvdmVyaGVhZCBmb3IgMTAyNCBiaXQgbW9kdWxpKS4KICAgICBUaGlzIG1ha2VzIGV4cG9uZW50aWF0aW9ucyBhYm91dCAwLjUgJSBmYXN0ZXIgZm9yIDEwMjQgYml0CiAgICAgZXhwb25lbnRzIChhcyBtZWFzdXJlZCBieSAib3BlbnNzbCBzcGVlZCByc2EyMDQ4IikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVuYW1lIG1lbW9yeSBoYW5kbGluZyBtYWNyb3MgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIKICAgICBzb2Z0d2FyZToKICAgICAgICAgIE1hbGxvYyAgICAgICAgID0+ICBPUEVOU1NMX21hbGxvYwogICAgICAgICAgTWFsbG9jX2xvY2tlZCAgPT4gIE9QRU5TU0xfbWFsbG9jX2xvY2tlZAogICAgICAgICAgUmVhbGxvYyAgICAgICAgPT4gIE9QRU5TU0xfcmVhbGxvYwogICAgICAgICAgRnJlZSAgICAgICAgICAgPT4gIE9QRU5TU0xfZnJlZQogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbiBCTl9tb2RfZXhwX21vbnRfd29yZCBmb3Igc21hbGwgYmFzZXMgKHJvdWdobHkgMTUlCiAgICAgZmFzdGVyIHRoYW4gQk5fbW9kX2V4cF9tb250LCBpLmUuIDclIGZvciBhIGZ1bGwgREggZXhjaGFuZ2UpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEN5Z1dpbjMyIHN1cHBvcnQuCiAgICAgW0pvaG4gSmFydmllIDxqamFydmllQG5ld3NndXkuY29tPl0KCiAgKikgVGhlIHR5cGUtc2FmZSBzdGFjayBjb2RlIGhhcyBiZWVuIHJlamlnZ2VkLiBJdCBpcyBub3cgb25seSBjb21waWxlZAogICAgIGluIHdoZW4gT3BlblNTTCBpcyBjb25maWd1cmVkIHdpdGggdGhlIERFQlVHX1NBRkVTVEFDSyBvcHRpb24gYW5kCiAgICAgYnkgZGVmYXVsdCBhbGwgdHlwZS1zcGVjaWZpYyBzdGFjayBmdW5jdGlvbnMgYXJlICIjZGVmaW5lImQgYmFjayB0bwogICAgIHN0YW5kYXJkIHN0YWNrIGZ1bmN0aW9ucy4gVGhpcyByZXN1bHRzIGluIG1vcmUgc3RyZWFtbGluZWQgb3V0cHV0CiAgICAgYnV0IHJldGFpbnMgdGhlIHR5cGUtc2FmZXR5IGNoZWNraW5nIHBvc3NpYmlsaXRpZXMgb2YgdGhlIG9yaWdpbmFsCiAgICAgYXBwcm9hY2guCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgVGhlIFNUQUNLIGNvZGUgaGFzIGJlZW4gY2xlYW5lZCB1cCwgYW5kIGNlcnRhaW4gdHlwZSBkZWNsYXJhdGlvbnMKICAgICB0aGF0IGRpZG4ndCBtYWtlIGEgbG90IG9mIHNlbnNlIGhhdmUgYmVlbiBicm91Z2h0IGluIGxpbmUuIFRoaXMgaGFzCiAgICAgYWxzbyBpbnZvbHZlZCBhIGNsZWFudXAgb2Ygc29ydHMgaW4gc2FmZXN0YWNrLmggdG8gbW9yZSBjb3JyZWN0bHkKICAgICBtYXAgdHlwZS1zYWZlIHN0YWNrIGZ1bmN0aW9ucyBvbnRvIHRoZWlyIHBsYWluIHN0YWNrIGNvdW50ZXJwYXJ0cy4KICAgICBUaGlzIHdvcmsgaGFzIGFsc28gcmVzdWx0ZWQgaW4gYSB2YXJpZXR5IG9mICJjb25zdCJpZmljYXRpb25zIG9mCiAgICAgbG90cyBvZiB0aGUgY29kZSwgZXNwZWNpYWxseSAiX2NtcCIgb3BlcmF0aW9ucyB3aGljaCBzaG91bGQgbm9ybWFsbHkKICAgICBiZSBwcm90b3R5cGVkIHdpdGggImNvbnN0IiBwYXJhbWV0ZXJzIGFueXdheS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBXaGVuIGdlbmVyYXRpbmcgYnl0ZXMgZm9yIHRoZSBmaXJzdCB0aW1lIGluIG1kX3JhbmQuYywgJ3N0aXIgdGhlIHBvb2wnCiAgICAgYnkgc2VlZGluZyB3aXRoIFNUQVRFX1NJWkUgZHVtbXkgYnl0ZXMgKHdpdGggemVybyBlbnRyb3B5IGNvdW50KS4KICAgICAoVGhlIFBSTkcgc3RhdGUgY29uc2lzdHMgb2YgdHdvIHBhcnRzLCB0aGUgbGFyZ2UgcG9vbCAnc3RhdGUnIGFuZCAnbWQnLAogICAgIHdoZXJlIGFsbCBvZiAnbWQnIGlzIHVzZWQgZWFjaCB0aW1lIHRoZSBQUk5HIGlzIHVzZWQsIGJ1dCAnc3RhdGUnCiAgICAgaXMgdXNlZCBvbmx5IGluZGV4ZWQgYnkgYSBjeWNsaWMgY291bnRlci4gQXMgZW50cm9weSBtYXkgbm90IGJlCiAgICAgd2VsbCBkaXN0cmlidXRlZCBmcm9tIHRoZSBiZWdpbm5pbmcsICdtZCcgaXMgaW1wb3J0YW50IGFzIGEKICAgICBjaGFpbmluZyB2YXJpYWJsZS4gSG93ZXZlciwgdGhlIG91dHB1dCBmdW5jdGlvbiBjaGFpbnMgb25seSBoYWxmCiAgICAgb2YgJ21kJywgaS5lLiA4MCBiaXRzLiAgc3NsZWF5X3JhbmRfYWRkLCBvbiB0aGUgb3RoZXIgaGFuZCwgY2hhaW5zCiAgICAgYWxsIG9mICdtZCcsIGFuZCBzZWVkaW5nIHdpdGggU1RBVEVfU0laRSBkdW1teSBieXRlcyB3aWxsIHJlc3VsdAogICAgIGluIGFsbCBvZiAnc3RhdGUnIGJlaW5nIHJld3JpdHRlbiwgd2l0aCB0aGUgbmV3IHZhbHVlcyBkZXBlbmRpbmcKICAgICBvbiB2aXJ0dWFsbHkgYWxsIG9mICdtZCcuICBUaGlzIG92ZXJjb21lcyB0aGUgODAgYml0IGxpbWl0YXRpb24uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIHNzbC9zMl9jbG50LmMgYW5kIHNzbC9zM19jbG50LmMsIGNhbGwgRVJSX2NsZWFyX2Vycm9yKCkgd2hlbgogICAgIHRoZSBoYW5kc2hha2UgaXMgY29udGludWVkIGFmdGVyIHNzbF92ZXJpZnlfY2VydF9jaGFpbigpOwogICAgIG90aGVyd2lzZSwgaWYgU1NMX1ZFUklGWV9OT05FIGlzIHNldCwgcmVtYWluaW5nIGVycm9yIGNvZGVzCiAgICAgY2FuIGxlYWQgdG8gJ3VuZXhwbGFpbmFibGUnIGNvbm5lY3Rpb24gYWJvcnRzIGxhdGVyLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gdHJhY2tlZCBkb3duIGJ5IEx1dHogSmFlbmlja2VdCgogICopIE1ham9yIEVWUCBBUEkgY2lwaGVyIHJldmlzaW9uLgogICAgIEFkZCBob29rcyBmb3IgZXh0cmEgRVZQIGZlYXR1cmVzLiBUaGlzIGFsbG93cyB2YXJpb3VzIGNpcGhlcgogICAgIHBhcmFtZXRlcnMgdG8gYmUgc2V0IGluIHRoZSBFVlAgaW50ZXJmYWNlLiBTdXBwb3J0IGFkZGVkIGZvciB2YXJpYWJsZQogICAgIGtleSBsZW5ndGggY2lwaGVycyB2aWEgdGhlIEVWUF9DSVBIRVJfQ1RYX3NldF9rZXlfbGVuZ3RoKCkgZnVuY3Rpb24gYW5kCiAgICAgc2V0dGluZyBvZiBSQzIgYW5kIFJDNSBwYXJhbWV0ZXJzLgoKICAgICBNb2RpZnkgRVZQX09wZW5Jbml0KCkgYW5kIEVWUF9TZWFsSW5pdCgpIHRvIGNvcGUgd2l0aCB2YXJpYWJsZSBrZXkgbGVuZ3RoCiAgICAgY2lwaGVycy4KCiAgICAgUmVtb3ZlIGxvdHMgb2YgZHVwbGljYXRlZCBjb2RlIGZyb20gdGhlIEVWUCBsaWJyYXJ5LiBGb3IgZXhhbXBsZSAqZXZlcnkqCiAgICAgY2lwaGVyIGluaXQoKSBmdW5jdGlvbiBoYW5kbGVzIHRoZSAnaXYnIGluIHRoZSBzYW1lIHdheSBhY2NvcmRpbmcgdG8gdGhlCiAgICAgY2lwaGVyIG1vZGUuIFRoZXkgYWxzbyBhbGwgZG8gbm90aGluZyBpZiB0aGUgJ2tleScgcGFyYW1ldGVyIGlzIE5VTEwgYW5kCiAgICAgZm9yIENGQiBhbmQgT0ZCIG1vZGVzIHRoZXkgemVybyBjdHgtPm51bS4KCiAgICAgTmV3IGZ1bmN0aW9uYWxpdHkgYWxsb3dzIHJlbW92YWwgb2YgUy9NSU1FIGNvZGUgUkMyIGhhY2suCgogICAgIE1vc3Qgb2YgdGhlIHJvdXRpbmVzIGhhdmUgdGhlIHNhbWUgZm9ybSBhbmQgc28gY2FuIGJlIGRlY2xhcmVkIGluIHRlcm1zCiAgICAgb2YgbWFjcm9zLgoKICAgICBCeSBzaGlmdGluZyB0aGlzIHRvIHRoZSB0b3AgbGV2ZWwgRVZQX0NpcGhlckluaXQoKSBpdCBjYW4gYmUgcmVtb3ZlZCBmcm9tCiAgICAgYWxsIGluZGl2aWR1YWwgY2lwaGVycy4gSWYgdGhlIGNpcGhlciB3YW50cyB0byBoYW5kbGUgSVZzIG9yIGtleXMKICAgICBkaWZmZXJlbnRseSBpdCBjYW4gc2V0IHRoZSBFVlBfQ0lQSF9DVVNUT01fSVYgb3IgRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVAogICAgIGZsYWdzLgoKICAgICBDaGFuZ2UgbG90cyBvZiBmdW5jdGlvbnMgbGlrZSBFVlBfRW5jcnlwdFVwZGF0ZSgpIHRvIG5vdyByZXR1cm4gYQogICAgIHZhbHVlOiBhbHRob3VnaCBzb2Z0d2FyZSB2ZXJzaW9ucyBvZiB0aGUgYWxnb3JpdGhtcyBjYW5ub3QgZmFpbAogICAgIGFueSBpbnN0YWxsZWQgaGFyZHdhcmUgdmVyc2lvbnMgY2FuLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCBTU0xfT1BfVExTX1JPTExCQUNLX0JVRzogSW4gc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwgaWYKICAgICB0aGlzIG9wdGlvbiBpcyBzZXQsIHRvbGVyYXRlIGJyb2tlbiBjbGllbnRzIHRoYXQgc2VuZCB0aGUgbmVnb3RpYXRlZAogICAgIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluc3RlYWQgb2YgdGhlIHJlcXVlc3RlZCBwcm90b2NvbCB2ZXJzaW9uCiAgICAgbnVtYmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENhbGwgZGhfdG1wX2NiIChzZXQgYnkgLi4uX1RNUF9ESF9DQikgd2l0aCBjb3JyZWN0ICdpc19leHBvcnQnIGZsYWc7CiAgICAgaS5lLiBub24temVybyBmb3IgZXhwb3J0IGNpcGhlcnN1aXRlcywgemVybyBvdGhlcndpc2UuCiAgICAgUHJldmlvdXMgdmVyc2lvbnMgaGFkIHRoaXMgZmxhZyBpbnZlcnRlZCwgaW5jb25zaXN0ZW50IHdpdGgKICAgICByc2FfdG1wX2NiICguLi5fVE1QX1JTQV9DQikuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSByZXBvcnRlZCBieSBBbWl0IENob3ByYV0KCiAgKikgQWRkIG1pc3NpbmcgRFNBIGxpYnJhcnkgdGV4dCBzdHJpbmcuIFdvcmsgYXJvdW5kIGZvciBzb21lIElJUwogICAgIGtleSBmaWxlcyB3aXRoIGludmFsaWQgU0VRVUVOQ0UgZW5jb2RpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZG9jdW1lbnQgKGRvYy9zdGFuZGFyZHMudHh0KSB0aGF0IGxpc3QgYWxsIGtpbmRzIG9mIHN0YW5kYXJkcwogICAgIGFuZCBzbyBvbiB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBPcGVuU1NMLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEVuaGFuY2UgY19yZWhhc2ggc2NyaXB0LiBPbGQgdmVyc2lvbiB3b3VsZCBtaXNoYW5kbGUgY2VydGlmaWNhdGVzCiAgICAgd2l0aCB0aGUgc2FtZSBzdWJqZWN0IG5hbWUgaGFzaCBhbmQgd291bGRuJ3QgaGFuZGxlIENSTHMgYXQgYWxsLgogICAgIEFkZGVkIC1maW5nZXJwcmludCBvcHRpb24gdG8gY3JsIHV0aWxpdHksIHRvIHN1cHBvcnQgbmV3IGNfcmVoYXNoCiAgICAgZmVhdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRWxpbWluYXRlIG5vbi1BTlNJIGRlY2xhcmF0aW9ucyBpbiBjcnlwdG8uaCBhbmQgc3RhY2suaC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IGZvciBTU0wgc2VydmVyIHB1cnBvc2UgY2hlY2tpbmcuIFNlcnZlciBjaGVja2luZyB3YXMKICAgICByZWplY3RpbmcgY2VydGlmaWNhdGVzIHdoaWNoIGhhZCBleHRlbmRlZCBrZXkgdXNhZ2UgcHJlc2VudAogICAgIGJ1dCBubyBzc2wgY2xpZW50IHB1cnBvc2UuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgUmVuZSBHcm9zc2VyIDxncm9zc2VyQGhpc29sdXRpb25zLmNvbT5dCgogICopIE1ha2UgUEtDUyMxMiBjb2RlIHdvcmsgd2l0aCBubyBwYXNzd29yZC4gVGhlIFBLQ1MjMTIgc3BlYwogICAgIGlzIGEgbGl0dGxlIHVuY2xlYXIgYWJvdXQgaG93IGEgYmxhbmsgcGFzc3dvcmQgaXMgaGFuZGxlZC4KICAgICBTaW5jZSB0aGUgcGFzc3dvcmQgaW4gZW5jb2RlZCBhcyBhIEJNUFN0cmluZyB3aXRoIHRlcm1pbmF0aW5nCiAgICAgZG91YmxlIE5VTEwgYSB6ZXJvIGxlbmd0aCBwYXNzd29yZCB3b3VsZCBlbmQgdXAgYXMganVzdCB0aGUKICAgICBkb3VibGUgTlVMTC4gSG93ZXZlciBubyBwYXNzd29yZCBhdCBhbGwgaXMgZGlmZmVyZW50IGFuZCBpcwogICAgIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIFBLQ1MjMTIga2V5IGdlbmVyYXRpb24gY29kZS4gTlMKICAgICB0cmVhdHMgYSBibGFuayBwYXNzd29yZCBhcyB6ZXJvIGxlbmd0aC4gTVNJRSB0cmVhdHMgaXQgYXMgbm8KICAgICBwYXNzd29yZCBvbiBleHBvcnQ6IGJ1dCBpdCB3aWxsIHRyeSBib3RoIG9uIGltcG9ydC4gV2Ugbm93IGRvCiAgICAgdGhlIHNhbWU6IFBLQ1MxMl9wYXJzZSgpIHRyaWVzIHplcm8gbGVuZ3RoIGFuZCBubyBwYXNzd29yZCBpZgogICAgIHRoZSBwYXNzd29yZCBpcyBzZXQgdG8gIiIgb3IgTlVMTCAoTlVMTCBpcyBub3cgYSB2YWxpZCBwYXNzd29yZDoKICAgICBpdCB3YXNuJ3QgYmVmb3JlKSBhcyBkb2VzIHRoZSBwa2NzMTIgYXBwbGljYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnZml4ZXMgaW4gYXBwcy94NTA5LmM6IEF2b2lkIGEgbWVtb3J5IGxlYWs7IGFuZCBkb24ndCB1c2UKICAgICBwZXJyb3Igd2hlbiBQRU1fcmVhZF9iaW9fWDUwOV9SRVEgZmFpbHMsIHRoZSBlcnJvciBtZXNzYWdlIG11c3QKICAgICBiZSBvYnRhaW5lZCBmcm9tIHRoZSBlcnJvciBxdWV1ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCAndGhyZWFkX2hhc2gnIG1lbW9yeSBsZWFrIGluIGNyeXB0by9lcnIvZXJyLmMgYnkgZnJlZWluZwogICAgIGl0IGluIEVSUl9yZW1vdmVfc3RhdGUgaWYgYXBwcm9wcmlhdGUsIGFuZCBjaGFuZ2UgRVJSX2dldF9zdGF0ZQogICAgIGFjY29yZGluZ2x5IHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyAodGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZQogICAgIHRocmVhZF9oYXNoIGlzIG5vIGxvbmdlciBjb25zdGFudCBvbmNlIHNldCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4IGZvciBsaW51eC1lbGYgbWFrZWZpbGUub25lLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCkgd2lsbCBub3cgY2F1c2UgYSBkZWZhdWx0CiAgICAgUlNBX01FVEhPRCB0byBiZSBjaG9zZW4gaWYgb25lIGRvZXNuJ3QgZXhpc3QgYWxyZWFkeS4KICAgICBQcmV2aW91c2x5IHRoaXMgd2FzIG9ubHkgc2V0IGR1cmluZyBhIGNhbGwgdG8gUlNBX25ldygpCiAgICAgb3IgUlNBX25ld19tZXRob2QoTlVMTCkgbWVhbmluZyBpdCB3YXMgcG9zc2libGUgZm9yCiAgICAgUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpIHRvIHJldHVybiBOVUxMLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZGVkIG5hdGl2ZSBuYW1lIHRyYW5zbGF0aW9uIHRvIHRoZSBleGlzdGluZyBEU08gY29kZQogICAgIHRoYXQgd2lsbCBjb252ZXJ0IChpZiB0aGUgZmxhZyB0byBkbyBzbyBpcyBzZXQpIGZpbGVuYW1lcwogICAgIHRoYXQgYXJlIHN1ZmZpY2llbnRseSBzbWFsbCBhbmQgaGF2ZSBubyBwYXRoIGluZm9ybWF0aW9uCiAgICAgaW50byBhIGNhbm9uaWNhbCBuYXRpdmUgZm9ybS4gRWcuICJibGFoIiBjb252ZXJ0ZWQgdG8KICAgICAibGliYmxhaC5zbyIgb3IgImJsYWguZGxsIiBldGMuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTmV3IGZ1bmN0aW9uIEVSUl9lcnJvcl9zdHJpbmdfbihlLCBidWYsIGxlbikgd2hpY2ggaXMgbGlrZQogICAgIEVSUl9lcnJvcl9zdHJpbmcoZSwgYnVmKSwgYnV0IHdyaXRlcyBhdCBtb3N0ICdsZW4nIGJ5dGVzCiAgICAgaW5jbHVkaW5nIHRoZSAwIHRlcm1pbmF0b3IuICBGb3IgRVJSX2Vycm9yX3N0cmluZ19uLCAnYnVmJwogICAgIG1heSBub3QgYmUgTlVMTC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPiwgQm9kbyBNb2VsbGVyXQoKICAqKSBDT05GIGxpYnJhcnkgcmV3b3JrZWQgdG8gYmVjb21lIG1vcmUgZ2VuZXJhbC4gIEEgbmV3IENPTkYKICAgICBjb25maWd1cmF0aW9uIGZpbGUgcmVhZGVyICJjbGFzcyIgaXMgaW1wbGVtZW50ZWQgYXMgd2VsbCBhcyBhCiAgICAgbmV3IGZ1bmN0aW9ucyAoTkNPTkZfKiwgZm9yICJOZXcgQ09ORiIpIHRvIGhhbmRsZSBpdC4gIFRoZSBub3cKICAgICBvbGQgQ09ORl8qIGZ1bmN0aW9ucyBhcmUgc3RpbGwgdGhlcmUsIGJ1dCBhcmUgcmVpbXBsZW1lbnRlZCB0bwogICAgIHdvcmsgaW4gdGVybXMgb2YgdGhlIG5ldyBmdW5jdGlvbnMuICBBbHNvLCBhIHNldCBvZiBmdW5jdGlvbnMKICAgICB0byBoYW5kbGUgdGhlIGludGVybmFsIHN0b3JhZ2Ugb2YgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBpcwogICAgIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdyaXRlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUKICAgICByZWFkZXIgImNsYXNzZXMiIChJIGNhbiBkZWZpbml0ZWx5IHNlZSBzb21ldGhpbmcgcmVhZGluZyBhCiAgICAgY29uZmlndXJhdGlvbiBmaWxlIGluIFhNTCBmb3JtYXQsIGZvciBleGFtcGxlKSwgY2FsbGVkIF9DT05GXyosCiAgICAgb3IgInRoZSBjb25maWd1cmF0aW9uIHN0b3JhZ2UgQVBJIi4uLgoKICAgICBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZSByZWFkaW5nIGZ1bmN0aW9ucyBhcmU6CgogICAgICAgIE5DT05GX25ldywgTkNPTkZfZnJlZSwgTkNPTkZfbG9hZCwgTkNPTkZfbG9hZF9mcCwgTkNPTkZfbG9hZF9iaW8sCiAgICAgICAgTkNPTkZfZ2V0X3NlY3Rpb24sIE5DT05GX2dldF9zdHJpbmcsIE5DT05GX2dldF9udW1icmUKCiAgICAgICAgTkNPTkZfZGVmYXVsdCwgTkNPTkZfV0lOMzIKCiAgICAgICAgTkNPTkZfZHVtcF9mcCwgTkNPTkZfZHVtcF9iaW8KCiAgICAgTkNPTkZfZGVmYXVsdCBhbmQgTkNPTkZfV0lOMzIgYXJlIG1ldGhvZCAob3IgImNsYXNzIikgY2hvb3NlcnMsCiAgICAgTkNPTkZfbmV3IGNyZWF0ZXMgYSBuZXcgQ09ORiBvYmplY3QuICBUaGlzIHdvcmtzIGluIHRoZSBzYW1lIHdheQogICAgIGFzIG90aGVyIGludGVyZmFjZXMgaW4gT3BlblNTTCwgbGlrZSB0aGUgQklPIGludGVyZmFjZS4KICAgICBOQ09ORl9kdW1wXyogZHVtcCB0aGUgaW50ZXJuYWwgc3RvcmFnZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLAogICAgIHdoaWNoIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLiAgQWxsIG90aGVyIGZ1bmN0aW9ucyB0YWtlIHRoZSBzYW1lCiAgICAgYXJndW1lbnRzIGFzIHRoZSBvbGQgQ09ORl8qIGZ1bmN0aW9ucyB3dGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUKICAgICBmaXJzdCB0aGF0IG11c3QgYmUgYSBgQ09ORiAqJyBpbnN0ZWFkIG9mIGEgYExIQVNIIConLgoKICAgICBUbyBtYWtlIGl0IGVhc2VyIHRvIHVzZSB0aGUgbmV3IGNsYXNzZXMgd2l0aCB0aGUgb2xkIENPTkZfKiBmdW5jdGlvbnMsCiAgICAgdGhlIGZ1bmN0aW9uIENPTkZfc2V0X2RlZmF1bHRfbWV0aG9kIGlzIHByb3ZpZGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCAnLXRsczEnIG9wdGlvbiB0byAnb3BlbnNzbCBjaXBoZXJzJywgd2hpY2ggd2FzIGFscmVhZHkKICAgICBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYnV0IGhhZCBub3QgYmVlbiBpbXBsZW1lbnRlZC4KICAgICAoVGhpcyBvcHRpb24gaXMgbm90IHlldCByZWFsbHkgdXNlZnVsIGJlY2F1c2UgZXZlbiB0aGUgYWRkaXRpb25hbAogICAgIGV4cGVyaW1lbnRhbCBUTFMgMS4wIGNpcGhlcnMgYXJlIGN1cnJlbnRseSB0cmVhdGVkIGFzIFNTTCAzLjAgY2lwaGVycy4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5pdGlhbCBEU08gY29kZSBhZGRlZCBpbnRvIGxpYmNyeXB0byBmb3IgbGV0dGluZyBPcGVuU1NMIChhbmQKICAgICBPcGVuU1NMLWJhc2VkIGFwcGxpY2F0aW9ucykgbG9hZCBzaGFyZWQgbGlicmFyaWVzIGFuZCBiaW5kIHRvCiAgICAgdGhlbSBpbiBhIHBvcnRhYmxlIHdheS4KICAgICBbR2VvZmYgVGhvcnBlLCB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSBSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS41IGFuZCAwLjkuNWEgIFsxIEFwciAyMDAwXQoKICAqKSBNYWtlIHN1cmUgX2xyb3RsIGFuZCBfbHJvdHIgYXJlIG9ubHkgdXNlZCB3aXRoIE1TVkMuCgogICopIFVzZSBsb2NrIENSWVBUT19MT0NLX1JBTkQgY29ycmVjdGx5IGluIHNzbGVheV9yYW5kX3N0YXR1cwogICAgICh0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBSQU5EX3N0YXR1cykuCgogICopIFJlbmFtZSBvcGVuc3NsIHg1MDkgb3B0aW9uICctY3JsZXh0Jywgd2hpY2ggd2FzIGFkZGVkIGluIDAuOS41LAogICAgIHRvICctY2xyZXh0JyAoPSBjbGVhciBleHRlbnNpb25zKSwgYXMgaW50ZW5kZWQgYW5kIGRvY3VtZW50ZWQuCiAgICAgW0JvZG8gTW9lbGxlcjsgaW5jb25zaXN0ZW5jeSBwb2ludGVkIG91dCBieSBNaWNoYWVsIEF0dGlsaQogICAgIDxhdHRpbGlAYW1heG8uY29tPl0KCiAgKikgRml4IGZvciBITUFDLiBJdCB3YXNuJ3QgemVyb2luZyB0aGUgcmVzdCBvZiB0aGUgYmxvY2sgaWYgdGhlIGtleSBsZW5ndGgKICAgICB3YXMgbGFyZ2VyIHRoYW4gdGhlIE1EIGJsb2NrIHNpemUuICAgICAgCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgWW9zdCBXaWxsaWFtIDxZb3N0V0B0Y2UuY29tPl0KCiAgKikgTW9kZXJuaXNlIFBLQ1MxMl9wYXJzZSgpIHNvIGl0IHVzZXMgU1RBQ0tfT0YoWDUwOSkgZm9yIGl0cyBjYSBhcmd1bWVudAogICAgIGZpeCBhIGxlYWsgd2hlbiB0aGUgY2EgYXJndW1lbnQgd2FzIHBhc3NlZCBhcyBOVUxMLiBTdG9wIFg1MDlfUFVCS0VZX3NldCgpCiAgICAgdXNpbmcgdGhlIHBhc3NlZCBrZXk6IGlmIHRoZSBwYXNzZWQga2V5IHdhcyBhIHByaXZhdGUga2V5IHRoZSByZXN1bHQKICAgICBvZiBYNTA5X3ByaW50KCksIGZvciBleGFtcGxlLCB3b3VsZCBiZSB0byBwcmludCBvdXQgYWxsIHRoZSBwcml2YXRlIGtleQogICAgIGNvbXBvbmVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgZGVzX3F1YWRfY2tzdW0oKSBieXRlIG9yZGVyIGJ1ZyBmaXguCiAgICAgW1VsZiBN9mxsZXIsIHVzaW5nIHRoZSBwcm9ibGVtIGRlc2NyaXB0aW9uIGluIGtyYjQtMC45LjcsIHdoZXJlCiAgICAgIHRoZSBzb2x1dGlvbiBpcyBhdHRyaWJ1dGVkIHRvIERlcnJpY2sgSiBCcmFzaGVhciA8c2hhZG93QERFTUVOVElBLk9SRz5dCgogICopIEZpeCBzbyBWX0FTTjFfQVBQX0NIT09TRSB3b3JrcyBhZ2FpbjogaG93ZXZlciBpdHMgdXNlIGlzIHN0cm9uZ2x5CiAgICAgZGlzY291cmFnZWQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgQnJpYW4gS29ydmVyIDxicmlhbmtAY3Muc3RhbmZvcmQuZWR1Pl0KCiAgKikgRm9yIGVhc2lseSB0ZXN0aW5nIGluIHNoZWxsIHNjcmlwdHMgd2hldGhlciBzb21lIGNvbW1hbmQKICAgICAnb3BlbnNzbCBYWFgnIGV4aXN0cywgdGhlIG5ldyBwc2V1ZG8tY29tbWFuZCAnb3BlbnNzbCBuby1YWFgnCiAgICAgcmV0dXJucyB3aXRoIGV4aXQgY29kZSAwIGlmZiBubyBjb21tYW5kIG9mIHRoZSBnaXZlbiBuYW1lIGlzIGF2YWlsYWJsZS4KICAgICAnbm8tWFhYJyBpcyBwcmludGVkIGluIHRoaXMgY2FzZSwgJ1hYWCcgb3RoZXJ3aXNlLiAgSW4gYm90aCBjYXNlcywKICAgICB0aGUgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGFuZCBub3RoaW5nIGlzIHByaW50ZWQgdG8gc3RkZXJyLgogICAgIEFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBhbHdheXMgaWdub3JlZC4KCiAgICAgU2luY2UgZm9yIGVhY2ggY2lwaGVyIHRoZXJlIGlzIGEgY29tbWFuZCBvZiB0aGUgc2FtZSBuYW1lLAogICAgIHRoZSAnbm8tY2lwaGVyJyBjb21waWxhdGlvbiBzd2l0Y2hlcyBjYW4gYmUgdGVzdGVkIHRoaXMgd2F5LgoKICAgICAoJ29wZW5zc2wgbm8tWFhYJyBpcyBub3QgYWJsZSB0byBkZXRlY3QgcHNldWRvLWNvbW1hbmRzIHN1Y2gKICAgICBhcyAncXVpdCcsICdsaXN0LVhYWC1jb21tYW5kcycsIG9yICduby1YWFgnIGl0c2VsZi4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXBkYXRlIHRlc3Qgc3VpdGUgc28gdGhhdCAnbWFrZSB0ZXN0JyBzdWNjZWVkcyBpbiAnbm8tcnNhJyBjb25maWd1cmF0aW9uLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZvciBTU0xfW0NUWF9dc2V0X3RtcF9kaCwgZG9uJ3QgY3JlYXRlIGEgREgga2V5IGlmIFNTTF9PUF9TSU5HTEVfREhfVVNFCiAgICAgaXMgc2V0OyBpdCB3aWxsIGJlIHRocm93biBhd2F5IGFueXdheSBiZWNhdXNlIGVhY2ggaGFuZHNoYWtlIGNyZWF0ZXMKICAgICBpdHMgb3duIGtleS4KICAgICBzc2xfY2VydF9kdXAsIHdoaWNoIGlzIHVzZWQgYnkgU1NMX25ldywgbm93IGNvcGllcyBESCBrZXlzIGluIGFkZGl0aW9uCiAgICAgdG8gcGFyYW1ldGVycyAtLSBpbiBwcmV2aW91cyB2ZXJzaW9ucyAoc2luY2UgT3BlblNTTCAwLjkuMykgdGhlCiAgICAgJ2RlZmF1bHQga2V5JyBmcm9tIFNTTF9DVFhfc2V0X3RtcF9kaCB3b3VsZCBhbHdheXMgYmUgbG9zdCwgbWVhbmluaW5nCiAgICAgeW91IGVmZmVjdGl2bHkgZ290IFNTTF9PUF9TSU5HTEVfREhfVVNFIHdoZW4gdXNpbmcgdGhpcyBtYWNyby4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgc19jbGllbnQgb3B0aW9uIC1pZ25fZW9mOiBFT0YgYXQgc3RkaW4gaXMgaWdub3JlZCwgYW5kCiAgICAgJ1EnIGFuZCAnUicgbG9zZSB0aGVpciBzcGVjaWFsIG1lYW5pbmdzIChxdWl0L3JlbmVnb3RpYXRlKS4KICAgICBUaGlzIGlzIHBhcnQgb2Ygd2hhdCAtcXVpZXQgZG9lczsgdW5saWtlIC1xdWlldCwgLWlnbl9lb2YKICAgICBkb2VzIG5vdCBzdXBwcmVzcyBhbnkgb3V0cHV0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBjb21wYXRpYmlsaXR5IG9wdGlvbnMgdG8gdGhlIHB1cnBvc2UgYW5kIHRydXN0IGNvZGUuIFRoZQogICAgIHB1cnBvc2UgWDUwOV9QVVJQT1NFX0FOWSBpcyAiYW55IHB1cnBvc2UiIHdoaWNoIGF1dG9tYXRpY2FsbHkKICAgICBhY2NlcHRzIGEgY2VydGlmaWNhdGUgb3IgQ0EsIHRoaXMgd2FzIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIsCiAgICAgd2l0aCBhbGwgdGhlIGFzc29jaWF0ZWQgc2VjdXJpdHkgaXNzdWVzLgoKICAgICBYNTA5X1RSVVNUX0NPTVBBVCBpcyB0aGUgb2xkIHRydXN0IGJlaGF2aW91cjogb25seSBhbmQKICAgICBhdXRvbWF0aWNhbGx5IHRydXN0IHNlbGYgc2lnbmVkIHJvb3RzIGluIGNlcnRpZmljYXRlIHN0b3JlLiBBCiAgICAgbmV3IHRydXN0IHNldHRpbmcgWDUwOV9UUlVTVF9ERUZBVUxUIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGF0CiAgICAgYSBwdXJwb3NlIGhhcyBubyBhc3NvY2lhdGVkIHRydXN0IHNldHRpbmcgYW5kIGl0IHNob3VsZCBpbnN0ZWFkCiAgICAgdXNlIHRoZSB2YWx1ZSBpbiB0aGUgZGVmYXVsdCBwdXJwb3NlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgUEtDUyM4IERTQSBwcml2YXRlIGtleSBjb2RlIHNvIGl0IGRlY29kZXMga2V5cyBhZ2FpbgogICAgIGFuZCBmaXggYSBtZW1vcnkgbGVhay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiB1dGlsL21rZXJyLnBsICh3aGljaCBpbXBsZW1lbnRzICdtYWtlIGVycm9ycycpLCBwcmVzZXJ2ZQogICAgIHJlYXNvbiBzdHJpbmdzIGZyb20gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIC5jIGZpbGUsIGFzCiAgICAgdGhlIGRlZmF1bHQgdG8gaGF2ZSBvbmx5IGRvd25jYXNlIGxldHRlcnMgKGFuZCBkaWdpdHMpIGluCiAgICAgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgcmVhc29ucyBjb2RlcyBpcyBub3QgYWx3YXlzIGFwcHJvcHJpYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIEVSUl9sb2FkX0VSUl9zdHJpbmdzKCksIGJ1aWxkIGFuIEVSUl9MSUJfU1lTIGVycm9yIHJlYXNvbiB0YWJsZQogICAgIHVzaW5nIHN0cmVycm9yLiAgUHJldmlvdXNseSwgRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoKSByZXR1cm5lZAogICAgIGxpYnJhcnkgbmFtZXMgYXMgcmVhc29uIHN0cmluZ3MgZm9yIFNZU2VycjsgYnV0IFNZU2VyciBpcyBhIHNwZWNpYWwKICAgICBjYXNlIHdoZXJlIHNtYWxsIG51bWJlcnMgYXJlIGVycm5vIHZhbHVlcywgbm90IGxpYnJhcnkgbnVtYmVycy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgJy1kc2FwYXJhbScgb3B0aW9uIHRvICdvcGVuc3NsIGRocGFyYW0nIGFwcGxpY2F0aW9uLiAgVGhpcwogICAgIGNvbnZlcnRzIERTQSBwYXJhbWV0ZXJzIGludG8gREggcGFyYW1ldGVycy4gKFdoZW4gY3JlYXRpbmcgcGFyYW1ldGVycywKICAgICBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBpcyB1c2VkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbmNsdWRlICdsZW5ndGgnIChyZWNvbW1lbmRlZCBleHBvbmVudCBsZW5ndGgpIGluIEMgY29kZSBnZW5lcmF0ZWQKICAgICBieSAnb3BlbnNzbCBkaHBhcmFtIC1DJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNldF9sYWJlbCBpbiBwZXJsYXNtIHdhcyBhbHJlYWR5IGJlaW5nIHVzZWQKICAgICBzbyBjb3VsZG4ndCBiZSB1c2VkIGFzIGEgImZpbGUgc2NvcGUiIGZsYWcuIE1vdmVkIHRvIHRoaXJkIGFyZ3VtZW50CiAgICAgd2hpY2ggd2FzIGZyZWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gUEVNX0FTTjFfd3JpdGVfYmlvIGFuZCBzb21lIG90aGVyIGZ1bmN0aW9ucywgdXNlIFJBTkRfcHNldWRvX2J5dGVzCiAgICAgaW5zdGVhZCBvZiBSQU5EX2J5dGVzIGZvciBlbmNyeXB0aW9uIElWcyBhbmQgc2FsdHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jbHVkZSBSQU5EX3N0YXR1cygpIGludG8gUkFORF9NRVRIT0QgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcKICAgICBpdCBvbmx5IGZvciBtZF9yYW5kLmMgIE90aGVyd2lzZSByZXBsYWNpbmcgdGhlIFBSTkcgYnkgY2FsbGluZwogICAgIFJBTkRfc2V0X3JhbmRfbWV0aG9kIHdvdWxkIGJlIGltcG9zc2libGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRG9uJ3QgbGV0IERTQV9nZW5lcmF0ZV9rZXkoKSBlbnRlciBhbiBpbmZpbml0ZSBsb29wIGlmIHRoZSByYW5kb20KICAgICBudW1iZXIgZ2VuZXJhdGlvbiBmYWlscy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgJ3JhbmQnIGFwcGxpY2F0aW9uIGZvciBjcmVhdGluZyBwc2V1ZG8tcmFuZG9tIG91dHB1dC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGRlZCBjb25maWd1cmF0aW9uIHN1cHBvcnQgZm9yIExpbnV4L0lBNjQKICAgICBbUm9sZiBIYWJlcnJlY2tlciA8cm9sZkBzdXNlLmRlPl0KCiAgKikgQXNzZW1ibGVyIG1vZHVsZSBzdXBwb3J0IGZvciBNaW5ndzMyLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTaGFyZWQgbGlicmFyeSBzdXBwb3J0IGZvciBIUFVYIChpbiBzaGxpYi8pLgogICAgIFtMdXR6IEphZW5pY2tlIDxMdXR6LkphZW5pY2tlQGFldC5UVS1Db3R0YnVzLkRFPiBhbmQgQW5vbnltb3VzXQoKICAqKSBTaGFyZWQgbGlicmFyeSBzdXBwb3J0IGZvciBTb2xhcmlzIGdjYy4KICAgICBbTHV0eiBCZWhua2UgPGJlaG5rZUB0cnVzdGNlbnRlci5kZT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS40IGFuZCAwLjkuNSAgWzI4IEZlYiAyMDAwXQoKICAqKSBQS0NTN19lbmNyeXB0KCkgd2FzIGFkZGluZyB0ZXh0IE1JTUUgaGVhZGVycyB0d2ljZSBiZWNhdXNlIHRoZXkKICAgICB3ZXJlIGFkZGVkIG1hbnVhbGx5IGFuZCBieSBTTUlNRV9jcmxmX2NvcHkoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBibnRlc3QuYyBkb24ndCBjYWxsIEJOX3JhbmQgd2l0aCB6ZXJvIGJpdHMgYXJndW1lbnQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgQW5kcmV3IFcuIEdyYXkgPGFncmF5QGljb25zaW5jLmNvbT5dCgogICopIEJOX211bCBidWdmaXg6IEluIGJuX211bF9wYXJ0X3JlY3Vyc2lvbigpIG9ubHkgdGhlIGE+YVtuXSAmJiBiPmJbbl0KICAgICBjYXNlIHdhcyBpbXBsZW1lbnRlZC4gVGhpcyBjYXVzZWQgQk5fZGl2X3JlY3AoKSB0byBmYWlsIG9jY2FzaW9uYWxseS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB0byB0aGUgc2V0X2xhYmVsKCkgaW4gdGhlIHBlcmwKICAgICBhc3NlbWJseSBsYW5ndWFnZSBidWlsZGVyLiBJZiB0aGlzIGFyZ3VtZW50IGV4aXN0cyBhbmQgaXMgc2V0CiAgICAgdG8gMSBpdCBzaWduYWxzIHRoYXQgdGhlIGFzc2VtYmxlciBzaG91bGQgdXNlIGEgc3ltYm9sIHdob3NlIAogICAgIHNjb3BlIGlzIHRoZSBlbnRpcmUgZmlsZSwgbm90IGp1c3QgdGhlIGN1cnJlbnQgZnVuY3Rpb24uIFRoaXMKICAgICBpcyBuZWVkZWQgd2l0aCBNQVNNIHdoaWNoIHVzZXMgdGhlIGZvcm1hdCBsYWJlbDo6IGZvciB0aGlzIHNjb3BlLgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IFBldGVyIFJ1bmVzdGlnIDxwZXRlckBydW5lc3RpZy5jb20+XQoKICAqKSBDaGFuZ2UgdGhlIEFTTjEgdHlwZXMgc28gdGhleSBhcmUgdHlwZWRlZnMgYnkgZGVmYXVsdC4gQmVmb3JlCiAgICAgYWxtb3N0IGFsbCB0eXBlcyB3ZXJlICNkZWZpbmUnZCB0byBBU04xX1NUUklORyB3aGljaCB3YXMgY2F1c2luZwogICAgIFNUQUNLX09GKCkgcHJvYmxlbXM6IHlvdSBjb3VsZG4ndCBkZWNsYXJlIFNUQUNLX09GKEFTTjFfVVRGOFNUUklORykKICAgICBmb3IgZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgbmFtZXMgb2YgbmV3IGZ1bmN0aW9ucyB0byB0aGUgbmV3IGdldDEvZ2V0MCBuYW1pbmcKICAgICBjb252ZW50aW9uOiBBZnRlciAnZ2V0MScsIHRoZSBjYWxsZXIgb3ducyBhIHJlZmVyZW5jZSBjb3VudAogICAgIGFuZCBoYXMgdG8gY2FsbCAuLi5fZnJlZTsgJ2dldDAnIHJldHVybnMgYSBwb2ludGVyIHRvIHNvbWUKICAgICBkYXRhIHN0cnVjdHVyZSB3aXRob3V0IGluY3JlbWVudGluZyByZWZlcmVuY2UgY291bnRlcnMuCiAgICAgKFNvbWUgb2YgdGhlIGV4aXN0aW5nICdnZXQnIGZ1bmN0aW9ucyBpbmNyZW1lbnQgYSByZWZlcmVuY2UKICAgICBjb3VudGVyLCBzb21lIGRvbid0LikKICAgICBTaW1pbGFybHksICdzZXQxJyBhbmQgJ2FkZDEnIGZ1bmN0aW9ucyBpbmNyZWFzZSByZWZlcmVuY2UKICAgICBjb3VudGVycyBvciBkdXBsaWNhdGUgb2JqZWN0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBmb3IgdGhlIHBvc3NpYmlsaXR5IG9mIHRlbXAgUlNBIGtleSBnZW5lcmF0aW9uIGZhaWx1cmU6CiAgICAgdGhlIGNvZGUgdXNlZCB0byBhc3N1bWUgaXQgYWx3YXlzIHdvcmtlZCBhbmQgY3Jhc2hlZCBvbiBmYWlsdXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW4gcHJvYmxlbSBpbiBCSU9fcHJpbnRmKCkuCiAgICAgW1VsZiBN9mxsZXIsIHVzaW5nIHB1YmxpYyBkb21haW4gY29kZSBieSBQYXRyaWNrIFBvd2VsbDsgcHJvYmxlbQogICAgICBwb2ludGVkIG91dCBieSBEYXZpZCBTYWNlcmRvdGUgPGRhczMzQGNvcm5lbGwuZWR1Pl0KCiAgKikgU3VwcG9ydCBFR0QgPGh0dHA6Ly93d3cubG90aGFyLmNvbS90ZWNoL2NyeXB0by8+LiAgTmV3IGZ1bmN0aW9ucwogICAgIFJBTkRfZWdkKCkgYW5kIFJBTkRfc3RhdHVzKCkuICBJbiB0aGUgY29tbWFuZCBsaW5lIGFwcGxpY2F0aW9uLAogICAgIHRoZSBFR0Qgc29ja2V0IGNhbiBiZSBzcGVjaWZpZWQgbGlrZSBhIHNlZWQgZmlsZSB1c2luZyBSQU5ERklMRQogICAgIG9yIC1yYW5kLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBbGxvdyB0aGUgc3RyaW5nIENFUlRJRklDQVRFIHRvIGJlIHRvbGVyYXRlZCBpbiBQS0NTIzcgc3RydWN0dXJlcy4KICAgICBTb21lIENBcyAoZS5nLiBWZXJpc2lnbikgZGlzdHJpYnV0ZSBjZXJ0aWZpY2F0ZXMgaW4gdGhpcyBmb3JtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSB0aGUgU1NMX0FMTE9XX0FESCBjb21waWxlIG9wdGlvbiBhbmQgc2V0IHRoZSBkZWZhdWx0IGNpcGhlcgogICAgIGxpc3QgdG8gZXhjbHVkZSB0aGVtLiBUaGlzIG1lYW5zIHRoYXQgbm8gc3BlY2lhbCBjb21waWxhdGlvbiBvcHRpb24KICAgICBpcyBuZWVkZWQgdG8gdXNlIGFub255bW91cyBESDogaXQganVzdCBuZWVkcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUKICAgICBjaXBoZXIgbGlzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIEVWUF9NRF9DVFhfdHlwZSBtYWNybyBzbyBpdHMgbWVhbmluZyBjb25zaXN0ZW50IHdpdGgKICAgICBFVlBfTURfdHlwZS4gVGhlIG9sZCBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSBpbiBhIG5ldyBtYWNybyBjYWxsZWQKICAgICBFVlBfTURfbWQoKS4gQ2hhbmdlIGNvZGUgdGhhdCB1c2VzIGl0IGFuZCB1cGRhdGUgZG9jcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSAuLi5fY3RybCBmdW5jdGlvbnMgbm93IGhhdmUgY29ycmVzcG9uZGluZyAuLi5fY2FsbGJhY2tfY3RybCBmdW5jdGlvbnMKICAgICB3aGVyZSB0aGUgJ3ZvaWQgKicgYXJndW1lbnQgaXMgcmVwbGFjZWQgYnkgYSBmdW5jdGlvbiBwb2ludGVyIGFyZ3VtZW50LgogICAgIFByZXZpb3VzbHkgJ3ZvaWQgKicgd2FzIGFidXNlZCB0byBwb2ludCB0byBmdW5jdGlvbnMsIHdoaWNoIHdvcmtzIG9uCiAgICAgbWFueSBwbGF0Zm9ybXMsIGJ1dCBpcyBub3QgY29ycmVjdC4gIEFzIHRoZXNlIGZ1bmN0aW9ucyBhcmUgdXN1YWxseQogICAgIGNhbGxlZCBieSBtYWNyb3MgZGVmaW5lZCBpbiBPcGVuU1NMIGhlYWRlciBmaWxlcywgbW9zdCBzb3VyY2UgY29kZQogICAgIHNob3VsZCB3b3JrIHdpdGhvdXQgY2hhbmdlcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPiAod2hpY2ggaXMgY3JlYXRlZCBieSBDb25maWd1cmUpIG5vdyBjb250YWlucwogICAgIHNlY3Rpb25zIHdpdGggaW5mb3JtYXRpb24gb24gLUQuLi4gY29tcGlsZXIgc3dpdGNoZXMgdXNlZCBmb3IKICAgICBjb21waWxpbmcgdGhlIGxpYnJhcnkgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHNlZSB0aGVtLiAgVG8gZW5hYmxlCiAgICAgb25lIG9mIHRoZXNlIHNlY3Rpb25zLCBhIHByZS1wcm9jZXNzb3Igc3ltYm9sIE9QRU5TU0xfLi4uX0RFRklORVMKICAgICBtdXN0IGJlIGRlZmluZWQuICBFLmcuLAogICAgICAgICNkZWZpbmUgT1BFTlNTTF9BTEdPUklUSE1fREVGSU5FUwogICAgICAgICNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CiAgICAgZGVmaW5lcyBhbGwgcGVydGluZW50IE5PXzxhbGdvPiBzeW1ib2xzLCBzdWNoIGFzIE5PX0lERUEsIE5PX1JTQSwgZXRjLgogICAgIFtSaWNoYXJkIExldml0dGUsIFVsZiBhbmQgQm9kbyBN9mxsZXJdCgogICopIEJ1Z2ZpeDogVG9sZXJhdGUgZnJhZ21lbnRhdGlvbiBhbmQgaW50ZXJsZWF2aW5nIGluIHRoZSBTU0wgMy9UTFMKICAgICByZWNvcmQgbGF5ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSAnb3RoZXInIHR5cGUgaW4gY2VydGlmaWNhdGUgYXV4IGluZm8gdG8gYSBTVEFDS19PRgogICAgIFg1MDlfQUxHT1IuIEFsdGhvdWdoIG5vdCBhbiBBbGdvcml0aG1JZGVudGlmaWVyIGFzIHN1Y2ggaXQgaGFzCiAgICAgdGhlIHJlcXVpcmVkIEFTTjEgZm9ybWF0OiBhcmJpdHJhcnkgdHlwZXMgZGV0ZXJtaW5lZCBieSBhbiBPSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNvbWUgUEVNX3dyaXRlX1g1MDlfUkVRX05FVygpIGZ1bmN0aW9ucyBhbmQgYSBjb21tYW5kIGxpbmUKICAgICBhcmd1bWVudCB0byAncmVxJy4gVGhpcyBpcyBub3QgYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgbmV3ZXIgb3IKICAgICBiZXR0ZXIgdGhhbiBvdGhlcnMgaXQganVzdCB1c2VzIHRoZSB3b3JrICdORVcnIGluIHRoZSBjZXJ0aWZpY2F0ZQogICAgIHJlcXVlc3QgaGVhZGVyIGxpbmVzLiBTb21lIHNvZnR3YXJlIG5lZWRzIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVvcmdhbmlzZSBwYXNzd29yZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzOiBub3cgcGFzc3dvcmRzIGNhbiBiZQogICAgIG9idGFpbmVkIGZyb20gdmFyaW91cyBzb3VyY2VzLiBEZWxldGUgdGhlIFBFTV9jYiBmdW5jdGlvbiBhbmQgbWFrZQogICAgIGl0IHRoZSBkZWZhdWx0IGJlaGF2aW91cjogaS5lLiBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTCBhbmQgdGhlCiAgICAgdXNyZGF0YSBhcmd1bWVudCBpcyBub3QgTlVMTCBpbnRlcnByZXQgaXQgYXMgYSBudWxsIHRlcm1pbmF0ZWQgcGFzcwogICAgIHBocmFzZS4gSWYgdXNyZGF0YSBhbmQgdGhlIGNhbGxiYWNrIGFyZSBOVUxMIHRoZW4gdGhlIHBhc3MgcGhyYXNlCiAgICAgaXMgcHJvbXB0ZWQgZm9yIGFzIHVzdWFsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgQ29tcGFxIEF0YWxsYSBjcnlwdG8gYWNjZWxlcmF0b3IuIElmIGl0IGlzIGluc3RhbGxlZCwKICAgICB0aGUgc3VwcG9ydCBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQuIFRoZSByZXN1bHRpbmcgYmluYXJpZXMgd2lsbAogICAgIGF1dG9kZXRlY3QgdGhlIGNhcmQgYW5kIHVzZSBpdCBpZiBwcmVzZW50LgogICAgIFtCZW4gTGF1cmllIGFuZCBDb21wYXEgSW5jLl0KCiAgKikgV29yayBhcm91bmQgZm9yIE5ldHNjYXBlIGhhbmcgYnVnLiBUaGlzIHNlbmRzIGNlcnRpZmljYXRlIHJlcXVlc3QKICAgICBhbmQgc2VydmVyIGRvbmUgaW4gb25lIHJlY29yZC4gU2luY2UgdGhpcyBpcyBwZXJmZWN0bHkgbGVnYWwgaW4gdGhlCiAgICAgU1NML1RMUyBwcm90b2NvbCBpdCBpc24ndCBhICJidWciIG9wdGlvbiBhbmQgaXMgb24gYnkgZGVmYXVsdC4gU2VlCiAgICAgdGhlIGJ1Z3MvU1NMdjMgZW50cnkgZm9yIG1vcmUgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIUC1VWCB0dW5lLXVwOiBuZXcgdW5pZmllZCBjb25maWdzLCBIUCBDIGNvbXBpbGVyIGJ1ZyB3b3JrYXJvdW5kLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgLXJhbmQgYXJndW1lbnQgdG8gc21pbWUgYW5kIHBrY3MxMiBhcHBsaWNhdGlvbnMgYW5kIHJlYWQvd3JpdGUKICAgICBvZiBzZWVkIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3ICdwYXNzd2QnIHRvb2wgZm9yIGNyeXB0KDMpIGFuZCBhcHIxIHBhc3N3b3JkIGhhc2hlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgY29tbWFuZCBsaW5lIHBhc3N3b3JkIG9wdGlvbnMgdG8gdGhlIHJlbWFpbmluZyBhcHBsaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnIGZpeCBmb3IgQk5fZGl2X3JlY3AoKSBmb3IgbnVtZXJhdG9ycyB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mCiAgICAgYml0cy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTW9yZSB0ZXN0cyBpbiBibnRlc3QuYywgYW5kIGNoYW5nZWQgdGVzdF9ibiBvdXRwdXQuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIC4vY29uZmlnIHJlY29nbml6ZXMgTWFjT1MgWCBub3cuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEJ1ZyBmaXggZm9yIEJOX2RpdigpIHdoZW4gdGhlIGZpcnN0IHdvcmRzIG9mIG51bSBhbmQgZGl2c29yIGFyZQogICAgIGVxdWFsIChpdCBnYXZlIHdyb25nIHJlc3VsdHMgaWYgKHJlbT0objEtcSpkMCkmQk5fTUFTSzIpIDwgZDApLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdmFyaW91cyBicm9rZW4gUEtDUyM4IGZvcm1hdHMsIGFuZCBjb21tYW5kIGxpbmUKICAgICBvcHRpb25zIHRvIHByb2R1Y2UgdGhlbS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIEJOX0NUWF9zdGFydCgpLCBCTl9DVFhfZ2V0KCkgYW5kIEJUX0NUWF9lbmQoKSB0bwogICAgIGdldCB0ZW1wb3JhcnkgQklHTlVNcyBmcm9tIGEgQk5fQ1RYLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDb3JyZWN0IHJldHVybiB2YWx1ZXMgaW4gQk5fbW9kX2V4cF9tb250KCkgYW5kIEJOX21vZF9leHAyX21vbnQoKQogICAgIGZvciBwID09IDAuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENoYW5nZSB0aGUgU1NMZWF5X2FkZF9hbGxfKigpIGZ1bmN0aW9ucyB0byBPcGVuU1NMX2FkZF9hbGxfKigpIGFuZAogICAgIGluY2x1ZGUgYSAjZGVmaW5lIGZyb20gdGhlIG9sZCBuYW1lIHRvIHRoZSBuZXcuIFRoZSBvcmlnaW5hbCBpbnRlbnQKICAgICB3YXMgdGhhdCBzdGF0aWNhbGx5IGxpbmtlZCBiaW5hcmllcyBjb3VsZCBmb3IgZXhhbXBsZSBqdXN0IGNhbGwKICAgICBTU0xlYXlfYWRkX2FsbF9jaXBoZXJzKCkgdG8ganVzdCBhZGQgY2lwaGVycyB0byB0aGUgdGFibGUgYW5kIG5vdAogICAgIGxpbmsgd2l0aCBkaWdlc3RzLiBUaGlzIG5ldmVyIHdvcmtlZCBiZWNheXNlIFNTTGVheV9hZGRfYWxsX2RpZ2VzdHMoKQogICAgIGFuZCBTU0xlYXlfYWRkX2FsbF9jaXBoZXJzKCkgd2VyZSBpbiB0aGUgc2FtZSBzb3VyY2UgZmlsZSBzbyBjYWxsaW5nCiAgICAgb25lIHdvdWxkIGxpbmsgd2l0aCB0aGUgb3RoZXIuIFRoZXkgYXJlIG5vdyBpbiBzZXBhcmF0ZSBzb3VyY2UgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IC1ub3RleHQgb3B0aW9uIHRvICdjYScgYW5kIGEgLXB1YmtleSBvcHRpb24gdG8gJ3Nwa2FjJy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVc2UgYSBsZXNzIHVudXN1YWwgZm9ybSBvZiB0aGUgTWlsbGVyLVJhYmluIHByaW1hbGl0eSB0ZXN0IChpdCB1c2VkCiAgICAgYSBiaW5hcnkgYWxnb3JpdGhtIGZvciBleHBvbmVudGlhdGlvbiBpbnRlZ3JhdGVkIGludG8gdGhlIE1pbGxlci1SYWJpbgogICAgIGxvb3AsIG91ciBzdGFuZGFyZCBtb2RleHAgYWxnb3JpdGhtcyBhcmUgZmFzdGVyKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdXBwb3J0IGZvciB0aGUgRUJDRElDIGNoYXJhY3RlciBzZXQgY29tcGxldGVkLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoLlNOSS5EZT5dCgogICopIFNvdXJjZSBjb2RlIGNsZWFudXBzOiB1c2UgY29uc3Qgd2hlcmUgYXBwcm9wcmlhdGUsIGVsaW1pbmF0ZSBjYXN0cywKICAgICB1c2Ugdm9pZCAqIGluc3RlYWQgb2YgY2hhciAqIGluIGxoYXNoLgogICAgIFtVbGYgTfZsbGVyXSAKCiAgKikgQnVnZml4OiBzc2wzX3NlbmRfc2VydmVyX2tleV9leGNoYW5nZSB3YXMgbm90IHJlc3RhcnRhYmxlCiAgICAgKHRoZSBzdGF0ZSB3YXMgbm90IGNoYW5nZWQgdG8gU1NMM19TVF9TV19LRVlfRVhDSF9CLCBhbmQgYmVjYXVzZSBvZgogICAgIHRoaXMgdGhlIHNlcnZlciBjb3VsZCBvdmVyd3JpdGUgZXBoZW1lcmFsIGtleXMgdGhhdCB0aGUgY2xpZW50CiAgICAgaGFzIGFscmVhZHkgc2VlbikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVHVybiBEU0FfaXNfcHJpbWUgaW50byBhIG1hY3JvIHRoYXQgY2FsbHMgQk5faXNfcHJpbWUsCiAgICAgdXNpbmcgNTAgaXRlcmF0aW9ucyBvZiB0aGUgUmFiaW4tTWlsbGVyIHRlc3QuCgogICAgIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIG5vdyB1c2VzIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0ICh3aXRoIDUwCiAgICAgaXRlcmF0aW9ucyBvZiB0aGUgUmFiaW4tTWlsbGVyIHRlc3QgYXMgcmVxdWlyZWQgYnkgdGhlIGFwcGVuZGl4CiAgICAgdG8gRklQUyBQVUIgMTg2Wy0xXSkgaW5zdGVhZCBvZiBEU0FfaXNfcHJpbWUuCiAgICAgQXMgQk5faXNfcHJpbWVfZmFzdHRlc3QgaW5jbHVkZXMgdHJpYWwgZGl2aXNpb24sIERTQSBwYXJhbWV0ZXIKICAgICBnZW5lcmF0aW9uIGJlY29tZXMgbXVjaCBmYXN0ZXIuCgogICAgIFRoaXMgaW1wbGllcyBhIGNoYW5nZSBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbiBEU0FfaXNfcHJpbWUKICAgICBhbmQgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnM6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZQogICAgIGZvciBlYWNoIHBvc2l0aXZlIHdpdG5lc3MgaW4gdGhlIFJhYmluLU1pbGxlciB0ZXN0LCBub3QganVzdAogICAgIG9jY2FzaW9uYWxseSBpbiB0aGUgaW5uZXIgbG9vcDsgYW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZQogICAgIGNhbGxiYWNrIGZ1bmN0aW9uIG5vdyBwcm92aWRlIGFuIGl0ZXJhdGlvbiBjb3VudCBmb3IgdGhlIG91dGVyCiAgICAgbG9vcCByYXRoZXIgdGhhbiBmb3IgdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBvZiB0aGUgaW5uZXIgbG9vcC4KICAgICBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBhZGRpdGlvbmFsbHkgY2FuIGNhbGwgdGhlIGNhbGxiYWNrCiAgICAgZnVuY3Rpb24gd2l0aCBhbiAnaXRlcmF0aW9uIGNvdW50JyBvZiAtMSwgbWVhbmluZyB0aGF0IGEKICAgICBjYW5kaWRhdGUgaGFzIHBhc3NlZCB0aGUgdHJpYWwgZGl2aXNpb24gdGVzdCAod2hlbiBxIGlzIGdlbmVyYXRlZCAKICAgICBmcm9tIGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIHNlZWQsIHRyaWFsIGRpdmlzaW9uIGlzIHNraXBwZWQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBCTl9pc19wcmltZV9mYXN0dGVzdCB0aGF0IG9wdGlvbmFsbHkgZG9lcyB0cmlhbAogICAgIGRpdmlzaW9uIGJlZm9yZSBzdGFydGluZyB0aGUgUmFiaW4tTWlsbGVyIHRlc3QgYW5kIGhhcwogICAgIGFuIGFkZGl0aW9uYWwgQk5fQ1RYICogYXJndW1lbnQgKHdoZXJlYXMgQk5faXNfcHJpbWUgYWx3YXlzCiAgICAgaGFzIHRvIGFsbG9jYXRlIGF0IGxlYXN0IG9uZSBCTl9DVFgpLgogICAgICdjYWxsYmFjaygxLCAtMSwgY2JfYXJnKScgaXMgY2FsbGVkIHdoZW4gYSBudW1iZXIgaGFzIHBhc3NlZCB0aGUKICAgICB0cmlhbCBkaXZpc2lvbiBzdGFnZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIGJ1ZyBpbiBDUkwgZW5jb2RpbmcuIFRoZSB2YWxpZGl0eSBkYXRlcyB3ZXJlbid0IGJlaW5nIGhhbmRsZWQKICAgICBhcyBBU04xX1RJTUUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1wa2NzMTIgb3B0aW9uIHRvIENBLnBsIHNjcmlwdCB0byB3cml0ZSBvdXQgYSBQS0NTIzEyIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX3BzZXVkb19yYW5kKCkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENsZWFuIHVwIEJOX21vZF9tdWxfbW9udGdvbWVyeSgpOiByZXBsYWNlIHRoZSBicm9rZW4gKGFuZCB1bnJlYWRhYmxlKQogICAgIGJpZ251bSB2ZXJzaW9uIG9mIEJOX2Zyb21fbW9udGdvbWVyeSgpIHdpdGggdGhlIHdvcmtpbmcgY29kZSBmcm9tCiAgICAgU1NMZWF5IDAuOS4wICh0aGUgd29yZCBiYXNlZCB2ZXJzaW9uIGlzIGZhc3RlciBhbnl3YXkpLCBhbmQgY2xlYW4gdXAKICAgICB0aGUgY29tbWVudHMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEF2b2lkIGEgcmFjZSBjb25kaXRpb24gaW4gczJfY2xudC5jIChmdW5jdGlvbiBnZXRfc2VydmVyX2hlbGxvKSB0aGF0CiAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHVzZSB0aGUgc2FtZSBTU0xfU0VTU0lPTiBkYXRhIHN0cnVjdHVyZSBpbgogICAgIFNTTDIgY2xpZW50cyBpbiBtdWx0aXBsZSB0aHJlYWRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRoZSByZXR1cm4gdmFsdWUgb2YgUkFORF9sb2FkX2ZpbGUoKSBubyBsb25nZXIgY291bnRzIGJ5dGVzIG9idGFpbmVkCiAgICAgYnkgc3RhdCgpLiAgUkFORF9sb2FkX2ZpbGUoLi4uLCAtMSkgaXMgbmV3IGFuZCB1c2VzIHRoZSBjb21wbGV0ZSBmaWxlCiAgICAgdG8gc2VlZCB0aGUgUFJORyAocHJldmlvdXNseSBhbiBleHBsaWNpdCBieXRlIGNvdW50IHdhcyByZXF1aXJlZCkuCiAgICAgW1VsZiBN9mxsZXIsIEJvZG8gTfZsbGVyXQoKICAqKSBDbGVhbiB1cCBDUllQVE9fRVhfREFUQSBmdW5jdGlvbnMsIHNvbWUgb2YgdGhlc2UgZGlkbid0IGhhdmUgcHJvdG90eXBlcwogICAgIHVzZWQgKGNoYXIgKikgaW5zdGVhZCBvZiAodm9pZCAqKSBhbmQgaGFkIGNhc3RzIGFsbCBvdmVyIHRoZSBwbGFjZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIEJOX2dlbmVyYXRlX3ByaW1lKCkgcmV0dXJuIE5VTEwgb24gZXJyb3IgaWYgcmV0IT1OVUxMLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBSZXRhaW4gc291cmNlIGNvZGUgY29tcGF0aWJpbGl0eSBmb3IgQk5fcHJpbWVfY2hlY2tzIG1hY3JvOgogICAgIEJOX2lzX3ByaW1lKC4uLiwgQk5fcHJpbWVfY2hlY2tzLCAuLi4pIG5vdyB1c2VzCiAgICAgQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mCiAgICAgUmFiaW4tTWlsbGVyIGl0ZXJhdGlvbnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIERpZmZpZS1IZWxsbWFuIHVzZXMgInNhZmUiIHByaW1lczogREhfY2hlY2soKSByZXR1cm4gY29kZSByZW5hbWVkIHRvCiAgICAgREhfQ0hFQ0tfUF9OT1RfU0FGRV9QUklNRS4KICAgICAoQ2hlY2sgaWYgdGhpcyBpcyB0cnVlPyBPcGVuUEdQIGNhbGxzIHRoZW0gInN0cm9uZyIuKQogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBNZXJnZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiAiZGgiIGFuZCAiZ2VuZGgiIHByb2dyYW1zIGludG8gYSBuZXcgcHJvZ3JhbQogICAgICJkaHBhcmFtIi4gVGhlIG9sZCBwcm9ncmFtcyBhcmUgcmV0YWluZWQgZm9yIG5vdyBidXQgd2lsbCBoYW5kbGUgREgga2V5cwogICAgIChpbnN0ZWFkIG9mIHBhcmFtZXRlcnMpIGluIGZ1dHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHRoZSBjaXBoZXJzLCBzX3NlcnZlciBhbmQgc19jbGllbnQgcHJvZ3JhbXMgY2hlY2sgdGhlIHJldHVybiB2YWx1ZXMKICAgICB3aGVuIGEgbmV3IGNpcGhlciBsaXN0IGlzIHNldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIHRoZSBTU0wvVExTIGNpcGhlciBtZWNoYW5pc20gdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgVExTIDU2Yml0CiAgICAgY2lwaGVycy4gQmVmb3JlIHdoZW4gdGhlIDU2Yml0IGNpcGhlcnMgd2VyZSBlbmFibGVkIHRoZSBzb3J0aW5nIHdhcwogICAgIHdyb25nLgoKICAgICBUaGUgc3ludGF4IGZvciB0aGUgY2lwaGVyIHNvcnRpbmcgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBzb3J0aW5nIGJ5CiAgICAgY2lwaGVyLXN0cmVuZ3RoICh1c2luZyB0aGUgc3RyZW5ndGhfYml0cyBoYXJkIGNvZGVkIGluIHRoZSB0YWJsZXMpLgogICAgIFRoZSBuZXcgY29tbWFuZCBpcyAiQFNUUkVOR1RIIiAoc2VlIGFsc28gZG9jL2FwcHMvY2lwaGVycy5wb2QpLgoKICAgICBGaXggYSBidWcgaW4gdGhlIGNpcGhlci1jb21tYW5kIHBhcnNlcjogd2hlbiBzdXBwbHlpbmcgYSBjaXBoZXIgY29tbWFuZAogICAgIHN0cmluZyB3aXRoIGFuICJ1bmRlZmluZWQiIHN5bWJvbCAobmVpdGhlciBjb21tYW5kIG5vciBhbHBoYW51bWVyaWMKICAgICBbQS1aYS16MC05XSwgc3NsX3NldF9jaXBoZXJfbGlzdCB1c2VkIHRvIGhhbmcgaW4gYW4gZW5kbGVzcyBsb29wLiBOb3cKICAgICBhbiBlcnJvciBpcyBmbGFnZ2VkLgoKICAgICBEdWUgdG8gdGhlIHN0cmVuZ3RoLXNvcnRpbmcgZXh0ZW5zaW9uLCB0aGUgY29kZSBvZiB0aGUKICAgICBzc2xfY3JlYXRlX2NpcGhlcl9saXN0KCkgZnVuY3Rpb24gd2FzIGNvbXBsZXRlbHkgcmVhcnJhbmdlZC4gSSBob3BlIHRoYXQKICAgICB0aGUgcmVhZGFiaWxpdHkgd2FzIGFsc28gaW5jcmVhc2VkIDotKQogICAgIFtMdXR6IEphZW5pY2tlIDxMdXR6LkphZW5pY2tlQGFldC5UVS1Db3R0YnVzLkRFPl0KCiAgKikgTWlub3IgY2hhbmdlIHRvICd4NTA5JyB1dGlsaXR5LiBUaGUgLUNBY3JlYXRlc2VyaWFsIG9wdGlvbiBub3cgdXNlcyAxCiAgICAgZm9yIHRoZSBmaXJzdCBzZXJpYWwgbnVtYmVyIGFuZCBwbGFjZXMgMiBpbiB0aGUgc2VyaWFsIG51bWJlciBmaWxlLiBUaGlzCiAgICAgYXZvaWRzIHByb2JsZW1zIHdoZW4gdGhlIHJvb3QgQ0EgaXMgY3JlYXRlZCB3aXRoIHNlcmlhbCBudW1iZXIgemVybyBhbmQKICAgICB0aGUgZmlyc3QgdXNlciBjZXJ0aWZpY2F0ZSBoYXMgdGhlIHNhbWUgaXNzdWVyIG5hbWUgYW5kIHNlcmlhbCBudW1iZXIKICAgICBhcyB0aGUgcm9vdCBDQS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBYNTA5X0FUVFJJQlVURSB1dGlsaXRpZXMsIGNoYW5nZSB0aGUgJ3JlcScgcHJvZ3JhbSBzbyBpdCB1c2VzCiAgICAgdGhlIG5ldyBjb2RlLiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHVmZi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VzIHRvIFg1MDlfQVRUUklCVVRFIHV0aWxpdGllcy4gVGhlc2UgaGF2ZSBiZWVuIHJlbmFtZWQgZnJvbQogICAgIFg1MDlfKigpIHRvIFg1MDlhdF8qKCkgb24gdGhlIGdyb3VuZHMgdGhhdCB0aGV5IGRvbid0IGhhbmRsZSBYNTA5CiAgICAgc3RydWN0dXJlcyBhbmQgYmVoYXZlIGluIGFuIGFuYWxhZ291cyB3YXkgdG8gdGhlIFg1MDl2MyBmdW5jdGlvbnM6CiAgICAgdGhleSBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ1dCB3cmFwcGVyIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZAogICAgIGluc3RlYWQuCgogICAgIFNvIHdlIGFsc28gbm93IGhhdmUgc29tZSB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IGNhbGwgdGhlIFg1MDlhdCBmdW5jdGlvbnMKICAgICB3aGVuIHBhc3NlZCBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4gKFRPIERPOiBzaW1pbGFyIHRoaW5ncyBjYW4gYmUgZG9uZSB3aXRoCiAgICAgUEtDUyM3IHNpZ25lZCBhbmQgdW5zaWduZWQgYXR0cmlidXRlcywgUEtDUyMxMiBhdHRyaWJ1dGVzIGFuZCBhIGZldyBvdGhlcgogICAgIHRoaW5ncy4gU29tZSBvZiB0aGVzZSBuZWVkIHNvbWUgZDJpIG9yIGkyZCBhbmQgcHJpbnQgZnVuY3Rpb25hbGl0eQogICAgIGJlY2F1c2UgdGhleSBoYW5kbGUgbW9yZSBjb21wbGV4IHN0cnVjdHVyZXMuKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBtaXNzaW5nICNpZm5kZWZzIHRoYXQgY2F1c2VkIG1pc3Npbmcgc3ltYm9scyB3aGVuIGJ1aWxkaW5nIGxpYnNzbAogICAgIGFzIGEgc2hhcmVkIGxpYnJhcnkgd2l0aG91dCBSU0EuICBVc2UgI2lmbmRlZiBOT19TU0wyIGluc3RlYWQgb2YKICAgICBOT19SU0EgaW4gc3NsL3MyKi5jLiAKICAgICBbS3JpcyBLZW5uYXdheSA8a3Jpc0BodWIuZnJlZWJzZC5vcmc+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+XQoKICAqKSBMZXQgdXRpbC9jbGVhbi1kZXBlbmQucGwgd29yayBhbHNvIHdpdGggb2xkZXIgUGVybCA1LjAweCB2ZXJzaW9ucy4KICAgICBbTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIEZpeCBNYWtlZmlsZS5vcmcgc28gQ0MsQ0ZMQUcgZXRjIGFyZSBwYXNzZWQgdG8gJ21ha2UgbGlua3MnIGFkZAogICAgIGFkdmFwaTMyLmxpYiB0byBXaW4zMiBidWlsZCBhbmQgY2hhbmdlIHRoZSBwZW0gdGVzdCBjb21wYXJpc2lvbgogICAgIHRvIGZjLmV4ZSAodGhhbmtzIHRvIFVscmljaCBLcm9lbmVyIDxrcm9uZXJ1QHlhaG9vLmNvbT4gZm9yIHRoZQogICAgIHN1Z2dlc3Rpb24pLiBGaXggbWlzcGxhY2VkIEFTTkkgcHJvdG90eXBlcyBhbmQgZGVjbGFyYXRpb25zIGluIGV2cC5oCiAgICAgYW5kIGNyeXB0by9kZXMvZWRlX2NiY21fZW5jLmMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgREVTIHF1YWQgY2hlY2tzdW0gd2FzIGJyb2tlbiBvbiBiaWctZW5kaWFuIGFyY2hpdGVjdHVyZXMuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb21tZW50IG91dCB0d28gZnVuY3Rpb25zIGluIGJpby5oIHRoYXQgYXJlbid0IGltcGxlbWVudGVkLiBGaXggdXAgdGhlCiAgICAgV2luMzIgdGVzdCBiYXRjaCBmaWxlIHNvIGl0IChtaWdodCkgd29yayBhZ2Fpbi4gVGhlIFdpbjMyIHRlc3QgYmF0Y2ggZmlsZQogICAgIGlzIGhvcnJpYmxlOiBJIGZlZWwgaWxsLi4uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgdmFyaW91cyAjaWZkZWZzIGFyb3VuZCBzbyBOT19TWVNMT0csIE5PX0RJUkVOVCBldGMgYXJlIG5vdyBzZWxlY3RlZAogICAgIGluIGVfb3MuaC4gQXVkaXQgb2YgaGVhZGVyIGZpbGVzIHRvIGNoZWNrIEFOU0kgYW5kIG5vbiBBTlNJCiAgICAgc2VjdGlvbnM6IDEwIGZ1bmN0aW9ucyB3ZXJlIGFic2VudCBmcm9tIG5vbiBBTlNJIHNlY3Rpb24gYW5kIG5vdCBleHBvcnRlZAogICAgIGZyb20gV2luZG93cyBETExzLiBGaXhlZCB1cCBsaWJlYXkubnVtIGZvciBuZXcgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgYG9wZW5zc2wgdmVyc2lvbicgb3V0cHV0IGxpbmVzIGNvbnNpc3RlbnQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBXaW4zMiBzeW1ib2wgZXhwb3J0IGxpc3RzIGZvciBCSU8gZnVuY3Rpb25zOiBBZGRlZAogICAgIEJJT19nZXRfZXhfbmV3X2luZGV4LCBCSU9fZ2V0X2V4X251bSwgQklPX2dldF9leF9kYXRhIGFuZCBCSU9fc2V0X2V4X2RhdGEKICAgICB0byBtcy9saWJlYXl7MTYsMzJ9LmRlZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgU2Vjb25kIHJvdW5kIG9mIGZpeGluZyB0aGUgT3BlblNTTCBwZXJsLyBzdHVmZi4gSXQgbm93IGF0IGxlYXN0IGNvbXBpbGVkCiAgICAgZmluZSB1bmRlciBVbml4IGFuZCBwYXNzZXMgc29tZSB0cml2aWFsIHRlc3RzIEkndmUgbm93IGFkZGVkLiBCdXQgdGhlCiAgICAgd2hvbGUgc3R1ZmYgaXMgaG9ycmlibHkgaW5jb21wbGV0ZSwgc28gYSBSRUFETUUuMVNUIHdpdGggYSBkaXNjbGFpbWVyIHdhcwogICAgIGFkZGVkIHRvIG1ha2Ugc3VyZSBubyBvbmUgZXhwZWN0cyB0aGF0IHRoaXMgc3R1ZmYgcmVhbGx5IHdvcmtzIGluIHRoZQogICAgIE9wZW5TU0wgMC45LjIgcmVsZWFzZS4gIEFkZGl0aW9uYWxseSBJJ3ZlIHN0YXJ0ZWQgdG8gY2xlYW4gdGhlIFhTIHNvdXJjZXMKICAgICB1cCBhbmQgZml4ZWQgYSBmZXcgbGl0dGxlIGJ1Z3MgYW5kIGluY29uc2lzdGVuY2llcyBpbiBPcGVuU1NMLntwbSx4c30gYW5kCiAgICAgb3BlbnNzbF9iaW8ueHMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgZ2VuZXJhdGlvbiBvZiB0d28gcGFydCBhZGRyZXNzZXMgaW4gcGVybC4KICAgICBbS2VuamkgTWl5YWtlIDxrZW5qaUBtaXlha2Uub3JnPiwgaW50ZWdyYXRlZCBieSBCZW4gTGF1cmllXQoKICAqKSBBZGQgY29uZmlnIGVudHJ5IGZvciBMaW51eCBvbiBNSVBTLgogICAgIFtKb2huIFRvYmV5IDxqdG9iZXlAY2hhbm5lbDEuY29tPl0KCiAgKikgTWFrZSBsaW5rcyB3aGVuZXZlciBDb25maWd1cmUgaXMgcnVuLCB1bmxlc3Mgd2UgYXJlIG9uIFdpbmRvemUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFBlcm1pdCBleHRlbnNpb25zIHRvIGJlIGFkZGVkIHRvIENSTHMgdXNpbmcgY3JsX3NlY3Rpb24gaW4gb3BlbnNzbC5jbmYuCiAgICAgQ3VycmVudGx5IG9ubHkgaXNzdWVyQWx0TmFtZSBhbmQgQXV0aG9yaXR5S2V5SWRlbnRpZmllciBtYWtlIGFueSBzZW5zZQogICAgIGluIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgdXNlZnVsIGtsdWRnZSB0byBhbGxvdyBwYWNrYWdlIG1haW50YWluZXJzIHRvIHNwZWNpZnkgY29tcGlsZXIgYW5kCiAgICAgb3RoZXIgcGxhdGZvcm1zIGRldGFpbHMgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRob3V0IGhhdmluZyB0byBwYXRjaCB0aGUKICAgICBDb25maWd1cmUgc2NyaXB0IGV2ZXJ5dGltZTogT25lIG5vdyBjYW4gdXNlIGBgcGVybCBDb25maWd1cmUKICAgICA8aWQ+OjxkZXRhaWxzPicnLCBpLmUuIHBsYXRmb3JtIGlkcyBhcmUgYWxsb3dlZCB0byBoYXZlIGRldGFpbHMgYXBwZW5kZWQKICAgICB0byB0aGVtIChzZXBlcmF0ZWQgYnkgY29sb25zKS4gVGhpcyBpcyB0cmVhdGVkIGFzIHRoZXJlIHdvdWxkIGJlIGEgc3RhdGljCiAgICAgcHJlLWNvbmZpZ3VyZWQgZW50cnkgaW4gQ29uZmlndXJlJ3MgJXRhYmxlIHVuZGVyIGtleSA8aWQ+IHdpdGggdmFsdWUKICAgICA8ZGV0YWlscz4gYW5kIGBgcGVybCBDb25maWd1cmUgPGlkPicnIGlzIGNhbGxlZC4gIFNvLCB3aGVuIHlvdSB3YW50IHRvCiAgICAgcGVyZm9ybSBhIHF1aWNrIHRlc3QtY29tcGlsZSB1bmRlciBGcmVlQlNEIDMuMSB3aXRoIHBnY2MgYW5kIHdpdGhvdXQKICAgICBhc3NlbWJsZXIgc3R1ZmYgeW91IGNhbiB1c2UgYGBwZXJsIENvbmZpZ3VyZSAiRnJlZUJTRC1lbGY6cGdjYzotTzY6OjoiJycKICAgICBub3csIHdoaWNoIG92ZXJyaWRlcyB0aGUgRnJlZUJTRC1lbGYgZW50cnkgb24tdGhlLWZseS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRGlzYWJsZSBuZXcgVExTMSBjaXBoZXJzdWl0ZXMgYnkgZGVmYXVsdDogdGhleSBhcmVuJ3Qgb2ZmaWNpYWwgeWV0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBbGxvdyBEU08gZmxhZ3MgbGlrZSAtZnBpYywgLWZQSUMsIC1LUElDIGV0Yy4gdG8gYmUgc3BlY2lmaWVkCiAgICAgb24gdGhlIGBwZXJsIENvbmZpZ3VyZSAuLi4nIGNvbW1hbmQgbGluZS4gVGhpcyB3YXkgb25lIGNhbiBjb21waWxlCiAgICAgT3BlblNTTCBsaWJyYXJpZXMgd2l0aCBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHdoaWNoIGlzIG5lZWRlZAogICAgIGZvciBsaW5raW5nIGl0IGludG8gRFNPcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtYXJrYWJseSwgZXhwb3J0IGNpcGhlcnMgd2VyZSB0b3RhbGx5IGJyb2tlbiBhbmQgbm8tb25lIGhhZCBub3RpY2VkIQogICAgIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDbGVhbmVkIHVwIHRoZSBMSUNFTlNFIGRvY3VtZW50OiBUaGUgb2ZmaWNpYWwgY29udGFjdCBmb3IgYW55IGxpY2Vuc2UKICAgICBxdWVzdGlvbnMgbm93IGlzIHRoZSBPcGVuU1NMIGNvcmUgdGVhbSB1bmRlciBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCiAgICAgQW5kIGFkZCBhIHBhcmFncmFwaCBhYm91dCB0aGUgZHVhbC1saWNlbnNlIHNpdHVhdGlvbiB0byBtYWtlIHN1cmUgcGVvcGxlCiAgICAgcmVjb2duaXplIHRoYXQgX0JPVEhfIHRoZSBPcGVuU1NMIGxpY2Vuc2UgX0FORF8gdGhlIFNTTGVheSBsaWNlbnNlIGFwcGx5CiAgICAgdG8gdGhlIE9wZW5TU0wgdG9vbGtpdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgR2VuZXJhbCBzb3VyY2UgdHJlZSBtYWtlZmlsZSBjbGVhbnVwczogTWFkZSBgbWFraW5nIHh4eCBpbiB5eXkuLi4nCiAgICAgZGlzcGxheSBjb25zaXN0ZW50IGluIHRoZSBzb3VyY2UgdHJlZSBhbmQgcmVwbGFjZWQgYC9iaW4vcm0nIGJ5IGBybScuCiAgICAgQWRkaXRvbmFsbHkgY2xlYW5lZCB1cCB0aGUgYG1ha2UgbGlua3MnIHRhcmdldDogUmVtb3ZlIHVubmVjZXNzYXJ5CiAgICAgc2VtaWNvbG9ucywgc3Vic2VxdWVudCByZWR1bmRhbnQgcmVtb3ZlcywgaW5saW5lIHBvaW50LnNoIGludG8gbWtsaW5rLnNoCiAgICAgdG8gc3BlZWQgcHJvY2Vzc2luZyBhbmQgbm8gbG9uZ2VyIGNsdXR0ZXIgdGhlIGRpc3BsYXkgd2l0aCBjb25mdXNpbmcKICAgICBzdHVmZi4gSW5zdGVhZCBvbmx5IHRoZSBhY3R1YWxseSBkb25lIGxpbmtzIGFyZSBkaXNwbGF5ZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBlcm1pdCBudWxsIGVuY3J5cHRpb24gY2lwaGVyc3VpdGVzLCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiBvbmx5LiBJdCB1c2VkCiAgICAgdG8gYmUgbmVjZXNzYXJ5IHRvIHNldCB0aGUgcHJlcHJvY2Vzc29yIGRlZmluZSBTU0xfQUxMT1dfRU5VTEwgdG8gZG8gdGhpcy4KICAgICBJdCBpcyBub3cgbmVjZXNzYXJ5IHRvIHNldCBTU0xfRk9SQklEX0VOVUxMIHRvIHByZXZlbnQgdGhlIHVzZSBvZiBudWxsCiAgICAgZW5jcnlwdGlvbi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGEgYnVuY2ggb2YgZml4ZXMgdG8gdGhlIFBLQ1MjNyBzdHVmZi4gSXQgdXNlZCB0byBzb21ldGltZXMgcmVvcmRlcgogICAgIHNpZ25lZCBhdHRyaWJ1dGVzIHdoZW4gdmVyaWZ5aW5nIHNpZ25hdHVyZXMgKHRoaXMgd291bGQgYnJlYWsgdGhlbSksIAogICAgIHRoZSBkZXRhY2hlZCBkYXRhIGVuY29kaW5nIHdhcyB3cm9uZyBhbmQgcHVibGljIGtleXMgb2J0YWluZWQgdXNpbmcKICAgICBYNTA5X2dldF9wdWJrZXkoKSB3ZXJlbid0IGZyZWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIHRoZSBCVUZGRVIgZnVuY3Rpb25zLiBBbHNvIGFkZGVkIGEgd29yayBhcm91bmQKICAgICB0byBhIFdpbjk1IGNvbnNvbGUgYnVnLiBUaGlzIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHBhc3N3b3JkIHJlYWQgc3R1ZmY6IHRoZQogICAgIGxhc3QgY2hhcmFjdGVyIHR5cGVkIGdldHMgY2FycmllZCBvdmVyIHRvIHRoZSBuZXh0IGZyZWFkKCkuIElmIHlvdSB3ZXJlIAogICAgIGdlbmVyYXRpbmcgYSBuZXcgY2VydCByZXF1ZXN0IHVzaW5nICdyZXEnIGZvciBleGFtcGxlIHRoZW4gdGhlIGxhc3QKICAgICBjaGFyYWN0ZXIgb2YgdGhlIHBhc3NwaHJhc2Ugd291bGQgYmUgQ1Igd2hpY2ggd291bGQgdGhlbiBlbnRlciB0aGUgZmlyc3QKICAgICBmaWVsZCBhcyBibGFuay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCB0aGUgbmV3IGBJbmNsdWRlcyBPcGVuU1NMIENyeXB0b2dyYXBoeSBTb2Z0d2FyZScgYnV0dG9uIGFzCiAgICAgZG9jL29wZW5zc2xfYnV0dG9uLntnaWYsaHRtbH0gd2hpY2ggaXMgc2ltaWxhciBpbiBzdHlsZSB0byB0aGUgb2xkIFNTTGVheQogICAgIGJ1dHRvbiBhbmQgY2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIGJhc2VkIG9uIE9wZW5TU0wgdG8gc2hvdyB0aGUKICAgICByZWxhdGlvbnNoaXAgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4gIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmUgY29uZnVzaW5nIHZhcmlhYmxlcyBpbiBmdW5jdGlvbiBzaWduYXR1cmVzIGluIGZpbGVzCiAgICAgc3NsL3NzbF9saWIuYyBhbmQgc3NsL3NzbC5oLgogICAgIFtMZW5uYXJ0IEJvbmcgPGxvYkBrdWx0aGVhLnN0YWNrZW4ua3RoLnNlPl0KCiAgKikgRG9uJ3QgaW5zdGFsbCBic3NfZmlsZS5jIHVuZGVyIFBSRUZJWC9pbmNsdWRlLwogICAgIFtMZW5uYXJ0IEJvbmcgPGxvYkBrdWx0aGVhLnN0YWNrZW4ua3RoLnNlPl0KCiAgKikgR2V0IHRoZSBXaW4zMiBjb21waWxlIHdvcmtpbmcgYWdhaW4uIE1vZGlmeSBta2RlZi5wbCBzbyBpdCBjYW4gaGFuZGxlCiAgICAgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBoYXMgc3VwcG9ydCBmb3IgTlQgc3BlY2lmaWMKICAgICBzdHVmZi4gRml4IG1rMW1mLnBsIGFuZCBWQy0zMi5wbCB0byBzdXBwb3J0IE5UIGRpZmZlcmVuY2VzIGFsc28uIFZhcmlvdXMKICAgICAjaWZkZWYgV0lOMzIgYW5kIFdJTk5UcyBzcHJpbmtsZWQgYWJvdXQgdGhlIHBsYWNlIGFuZCBzb21lIGNoYW5nZXMgZnJvbQogICAgIHVuc2lnbmVkIHRvIHNpZ25lZCB0eXBlczogdGhpcyB3YXMga2lsbGluZyB0aGUgV2luMzIgY29tcGlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGNlcnRpZmljYXRlIGZpbGUgdG8gc3RhY2sgZnVuY3Rpb25zLAogICAgIFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soKSBhbmQKICAgICBTU0xfYWRkX2ZpbGVfY2VydF9zdWJqZWN0c190b19zdGFjaygpLiAgVGhlc2UgbGFyZ2VseSBzdXBwbGFudAogICAgIFNTTF9sb2FkX2NsaWVudF9DQV9maWxlKCksIGFuZCBjYW4gYmUgdXNlZCB0byBhZGQgbXVsdGlwbGUgY2VydHMgZWFzaWx5CiAgICAgdG8gYSBzdGFjayAodXN1YWxseSB0aGlzIGlzIHRoZW4gaGFuZGVkIHRvIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KCkpLgogICAgIFRoaXMgbWVhbnMgdGhhdCBBcGFjaGUtU1NMIGFuZCBzaW1pbGFyIHBhY2thZ2VzIGRvbid0IGhhdmUgdG8gbWVzcyBhcm91bmQKICAgICB0byBhZGQgYXMgbWFueSBDQXMgYXMgdGhleSB3YW50IHRvIHRoZSBwcmVmZXJyZWQgbGlzdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRXhwZXJpbWVudCB3aXRoIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gQ3VycmVudGx5IG9ubHkgcGFydGlhbGx5IGFwcGxpZWQgdG8KICAgICBzc2wvc3NsX2xpYi5jLgogICAgIFNlZSBodHRwOi8vd3d3LnN0YWNrLm5sL35kaW1pdHJpL2RveHlnZW4vaW5kZXguaHRtbCwgYW5kIHJ1biBkb3h5Z2VuIHdpdGgKICAgICBvcGVuc3NsLmRveHkgYXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KICAgICBbQmVuIExhdXJpZV0KICAKICAqKSBHZXQgcmlkIG9mIHJlbWFpbmluZyBDKystc3R5bGUgY29tbWVudHMgd2hpY2ggc3RyaWN0IEMgY29tcGlsZXJzIGhhdGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIHBvaW50ZWQgb3V0IGJ5IENhcmxvcyBBbWVuZ3VhbF0KCiAgKikgQ2hhbmdlZCBCTl9SRUNVUlNJT04gaW4gYm5fbW9udC5jIHRvIEJOX1JFQ1VSU0lPTl9NT05UIHNvIGl0IGlzIG5vdAogICAgIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQ6IGl0IGhhcyBwcm9ibGVtcyB3aXRoIGxhcmdlIGtleXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgYnVuY2ggb2YgU1NMX3h4eCgpIGZ1bmN0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIHRlbXBvcmFyeSBSU0EgYW5kCiAgICAgREggcHJpdmF0ZSBrZXlzIGFuZC9vciBjYWxsYmFjayBmdW5jdGlvbnMgd2hpY2ggZGlyZWN0bHkgY29ycmVzcG9uZCB0bwogICAgIHRoZWlyIFNTTF9DVFhfeHh4KCkgY291bnRlcnBhcnRzIGJ1dCB3b3JrIG9uIGEgcGVyLWNvbm5lY3Rpb24gYmFzaXMuIFRoaXMKICAgICBpcyBuZWVkZWQgZm9yIGFwcGxpY2F0aW9ucyB3aGljaCBoYXZlIHRvIGNvbmZpZ3VyZSBjZXJ0aWZpY2F0ZXMgb24gYQogICAgIHBlci1jb25uZWN0aW9uIGJhc2lzIChlLmcuIEFwYWNoZSttb2Rfc3NsKSBpbnN0ZWFkIG9mIGEgcGVyLWNvbnRleHQgYmFzaXMKICAgICAoZS5nLiBzX3NlcnZlcikuIAogICAgICAgIEZvciB0aGUgUlNBIGNlcnRpZmljYXRlIHNpdHVhdGlvbiBpcyBtYWtlcyBubyBkaWZmZXJlbmNlLCBidXQKICAgICBmb3IgdGhlIERTQSBjZXJ0aWZpY2F0ZSBzaXR1YXRpb24gdGhpcyBmaXhlcyB0aGUgIm5vIHNoYXJlZCBjaXBoZXIiCiAgICAgcHJvYmxlbSB3aGVyZSB0aGUgT3BlblNTTCBjaXBoZXIgc2VsZWN0aW9uIHByb2NlZHVyZSBmYWlsZWQgYmVjYXVzZSB0aGUKICAgICB0ZW1wb3Jhcnkga2V5cyB3ZXJlIG5vdCBvdmVydGFrZW4gZnJvbSB0aGUgY29udGV4dCBhbmQgdGhlIEFQSSBwcm92aWRlZAogICAgIG5vIHdheSB0byByZWNvbmZpZ3VyZSB0aGVtLiAKICAgICAgICBUaGUgbmV3IGZ1bmN0aW9ucyBub3cgbGV0IGFwcGxpY2F0aW9ucyByZWNvbmZpZ3VyZSB0aGUgc3R1ZmYgYW5kIHRoZXkKICAgICBhcmUgaW4gZGV0YWlsOiBTU0xfbmVlZF90bXBfUlNBLCBTU0xfc2V0X3RtcF9yc2EsIFNTTF9zZXRfdG1wX2RoLAogICAgIFNTTF9zZXRfdG1wX3JzYV9jYWxsYmFjayBhbmQgU1NMX3NldF90bXBfZGhfY2FsbGJhY2suICBBZGRpdGlvbmFsbHkgYSBuZXcKICAgICBub24tcHVibGljLUFQSSBmdW5jdGlvbiBzc2xfY2VydF9pbnN0YW50aWF0ZSgpIGlzIHVzZWQgYXMgYSBoZWxwZXIKICAgICBmdW5jdGlvbiBhbmQgYWxzbyB0byByZWR1Y2UgY29kZSByZWR1bmRhbmN5IGluc2lkZSBzc2xfcnNhLmMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1vdmUgc19zZXJ2ZXIgLWRjZXJ0IGFuZCAtZGtleSBvcHRpb25zIG91dCBvZiB0aGUgdW5kb2N1bWVudGVkIGZlYXR1cmUKICAgICBhcmVhIGJlY2F1c2UgdGhleSBhcmUgdXNlZnVsIGZvciB0aGUgRFNBIHNpdHVhdGlvbiBhbmQgc2hvdWxkIGJlCiAgICAgcmVjb2duaXplZCBieSB0aGUgdXNlcnMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgY2lwaGVyIGRlY2lzaW9uIHNjaGVtZSBmb3IgZXhwb3J0IGNpcGhlcnM6IHRoZSBleHBvcnQgYml0cyBhcmUKICAgICAqbm90KiB3aXRoaW4gU1NMX01LRVlfTUFTSyBvciBTU0xfQVVUSF9NQVNLLCB0aGV5IGFyZSB3aXRoaW4KICAgICBTU0xfRVhQX01BU0suICBTbywgdGhlIG9yaWdpbmFsIHZhcmlhYmxlIGhhcyB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlCiAgICAgYWxyZWFkeSBtYXNrZWQgdmFyaWFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIEZpeCAncG9ydCcgdmFyaWFibGUgZnJvbSBgaW50JyB0byBgdW5zaWduZWQgaW50JyBpbiBjcnlwdG8vYmlvL2Jfc29jay5jCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIENoYW5nZSB0eXBlIG9mIGFub3RoZXIgbWRfbGVuIHZhcmlhYmxlIGluIHBrN19kb2l0LmM6UEtDUzdfZGF0YUZpbmFsKCkKICAgICBmcm9tIGBpbnQnIHRvIGB1bnNpZ25lZCBpbnQnIGJlY2F1c2UgaXQncyBhIGxlbmd0aCBhbmQgaW5pdGlhbGl6ZWQgYnkKICAgICBFVlBfRGlnZXN0RmluYWwoKSB3aGljaCBleHBlY3RzIGFuIGB1bnNpZ25lZCBpbnQgKicuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIERvbid0IGhhcmQtY29kZSBwYXRoIHRvIFBlcmwgaW50ZXJwcmV0ZXIgb24gc2hlYmFuZyBsaW5lIG9mIENvbmZpZ3VyZQogICAgIHNjcmlwdC4gSW5zdGVhZCB1c2UgdGhlIHVzdWFsIFNoZWxsLT5QZXJsIHRyYW5zaXRpb24gdHJpY2suCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2UgYG9wZW5zc2wgeDUwOSAtbm9vdXQgLW1vZHVsdXMnIGZ1bmN0aW9uYWwgYWxzbyBmb3IgRFNBIGNlcnRpZmljYXRlcwogICAgIChpbiBhZGRpdGlvbiB0byBSU0EgY2VydGlmaWNhdGVzKSB0byBtYXRjaCB0aGUgYmVoYXZpb3VyIG9mIGBvcGVuc3NsIGRzYQogICAgIC1ub291dCAtbW9kdWx1cycgYXMgaXQncyBhbHJlYWR5IHRoZSBjYXNlIGZvciBgb3BlbnNzbCByc2EgLW5vb3V0CiAgICAgLW1vZHVsdXMnLiAgRm9yIFJTQSB0aGUgLW1vZHVsdXMgaXMgdGhlIHJlYWwgIm1vZHVsdXMiIHdoaWxlIGZvciBEU0EKICAgICBjdXJyZW50bHkgdGhlIHB1YmxpYyBrZXkgaXMgcHJpbnRlZCAoYSBkZWNpc2lvbiB3aGljaCB3YXMgYWxyZWFkeSBkb25lIGJ5CiAgICAgYG9wZW5zc2wgZHNhIC1tb2R1bHVzJyBpbiB0aGUgcGFzdCkgd2hpY2ggc2VydmVzIGEgc2ltaWxhciBwdXJwb3NlLgogICAgIEFkZGl0aW9uYWxseSB0aGUgTk9fUlNBIG5vIGxvbmdlciBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIHdob2xlIC1tb2R1bHVzCiAgICAgb3B0aW9uOyBpdCBub3cgb25seSBhdm9pZHMgdXNpbmcgdGhlIFJTQSBzdHVmZi4gU2FtZSBhcHBsaWVzIHRvIE5PX0RTQQogICAgIG5vdywgdG9vLgogICAgIFtSYWxmIFMuICBFbmdlbHNjaGFsbF0KCiAgKikgQWRkIEFybmUgQW5zcGVyJ3MgcmVsaWFibGUgQklPIC0gdGhpcyBpcyBhbiBlbmNyeXB0ZWQsIGJsb2NrLWRpZ2VzdGVkCiAgICAgQklPLiBTZWUgdGhlIHNvdXJjZSAoY3J5cHRvL2V2cC9iaW9fb2suYykgZm9yIG1vcmUgaW5mby4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgRHVtcCB0aGUgb2xkIHl1Y2t5IHJlcSBjb2RlIHRoYXQgdHJpZWQgKGFuZCBmYWlsZWQpIHRvIGFsbG93IHJhdyBPSURzCiAgICAgdG8gYmUgYWRkZWQuIE5vdyBib3RoICdyZXEnIGFuZCAnY2EnIGNhbiB1c2UgbmV3IG9iamVjdHMgZGVmaW5lZCBpbiB0aGUKICAgICBjb25maWcgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29vbCBCSU8gdGhhdCBkb2VzIHN5c2xvZyAob3IgZXZlbnQgbG9nIG9uIE5UKS4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPiwgaW50ZWdyYXRlZCBieSBCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgbmV3IFRMUyBjaXBoZXJzdWl0ZXMsIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9SQzRfNTZfTUQ1LAogICAgIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9SQzJfQ0JDXzU2X01ENSBhbmQKICAgICBUTFNfUlNBX0VYUE9SVDU2X1dJVEhfREVTX0NCQ19TSEEsIGFzIHNwZWNpZmllZCBpbiAiNTYtYml0IEV4cG9ydCBDaXBoZXIKICAgICBTdWl0ZXMgRm9yIFRMUyIsIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMDAudHh0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgcHJlbGltaW5hcnkgY29uZmlnIGluZm8gZm9yIG5ldyBleHRlbnNpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFJTQV9OT19QQURESU5HIHJlYWxseSB1c2Ugbm8gcGFkZGluZy4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEdlbmVyYXRlIGVycm9ycyB3aGVuIHByaXZhdGUvcHVibGljIGtleSBjaGVjayBpcyBkb25lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBPdmVyaGF1bCBmb3IgJ2NybCcgdXRpbGl0eS4gTmV3IGZ1bmN0aW9uIFg1MDlfQ1JMX3ByaW50LiBQYXJ0aWFsIHN1cHBvcnQKICAgICBmb3Igc29tZSBDUkwgZXh0ZW5zaW9ucyBhbmQgbmV3IG9iamVjdHMgYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVhbGx5IGZpeCB0aGUgQVNOMSBJTVBMSUNJVCBidWcgdGhpcyB0aW1lLi4uIFBhcnRpYWwgc3VwcG9ydCBmb3IgcHJpdmF0ZQogICAgIGtleSB1c2FnZSBleHRlbnNpb24gYW5kIGZ1bGxlciBzdXBwb3J0IGZvciBhdXRob3JpdHkga2V5IGlkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBPQUVQIGVuY3J5cHRpb24gZm9yIHRoZSBPcGVuU1NMIGNyeXB0byBsaWJyYXJ5LiBPQUVQIGlzIHRoZSBpbXByb3ZlZAogICAgIHBhZGRpbmcgbWV0aG9kIGZvciBSU0EsIHdoaWNoIGlzIHJlY29tbWVuZGVkIGZvciBuZXcgYXBwbGljYXRpb25zIGluIFBLQ1MKICAgICAjMSB2Mi4wIChSRkMgMjQzNywgT2N0b2JlciAxOTk4KS4KICAgICBPQUVQIChPcHRpbWFsIEFzeW1tZXRyaWMgRW5jcnlwdGlvbiBQYWRkaW5nKSBoYXMgYmV0dGVyIHRoZW9yZXRpY2FsCiAgICAgZm91bmRhdGlvbnMgdGhhbiB0aGUgYWQtaG9jIHBhZGRpbmcgdXNlZCBpbiBQS0NTICMxIHYxLjUuIEl0IGlzIHNlY3VyZQogICAgIGFnYWluc3QgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFJTQS4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT4sIHJlZm9ybWF0dGVkLCBjb3JyZWN0ZWQgYW5kIGludGVncmF0ZWQgYnkKICAgICAgQmVuIExhdXJpZV0KCiAgKikgVXBkYXRlcyB0byB0aGUgbmV3IFNTTCBjb21wcmVzc2lvbiBjb2RlCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgRml4IHNvIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBtYXN0ZXIgc2VjcmV0LCB3aGVuIHBhc3NlZAogICAgIHZpYSBSU0EsIGNoZWNrcyB0aGF0IGlmIFRMUyB3YXMgcHJvcG9zZWQsIGJ1dCB3ZSByb2xsIGJhY2sgdG8gU1NMdjMKICAgICAoYmVjYXVzZSB0aGUgc2VydmVyIHdpbGwgbm90IGFjY2VwdCBoaWdoZXIpLCB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlcgogICAgIGlzIDB4MDMsMHgwMSwgbm90IDB4MDMsMHgwMAogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIFJ1biBleHRlbnNpdmUgbWVtb3J5IGxlYWsgY2hlY2tzIG9uIFNTTCBhcHBzLiBGaXhlZCAqbG90cyogb2YgbWVtb3J5CiAgICAgbGVha3MgaW4gc3NsLyByZWxhdGluZyB0byBuZXcgWDUwOV9nZXRfcHVia2V5KCkgYmVoYXZpb3VyLiBBbHNvIGZpeGVzCiAgICAgaW4gYXBwcy8gYW5kIGFuIHVucmVsYXRlZCBsZWFrIGluIGNyeXB0by9kc2EvZHNhX3ZyZi5jCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgUkFXIGV4dGVuc2lvbnMgd2hlcmUgYW4gYXJiaXRyYXJ5IGV4dGVuc2lvbiBjYW4gYmUKICAgICBjcmVhdGVkIGJ5IGluY2x1ZGluZyBpdHMgREVSIGVuY29kaW5nLiBTZWUgYXBwcy9vcGVuc3NsLmNuZiBmb3IKICAgICBhbiBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc3VyZSBsYXRlc3QgUGVybCB2ZXJzaW9ucyBkb24ndCBpbnRlcnByZXQgc29tZSBnZW5lcmF0ZWQgQyBhcnJheQogICAgIGNvZGUgYXMgUGVybCBhcnJheSBjb2RlIGluIHRoZSBjcnlwdG8vZXJyL2Vycl9nZW5jLnBsIHNjcmlwdC4KICAgICBbTGFycyBXZWJlciA8M3dlYmVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBNb2RpZnkgbXMvZG9fbXMuYmF0IHRvIG5vdCBnZW5lcmF0ZSBhc3NlbWJseSBsYW5ndWFnZSBtYWtlZmlsZXMgc2luY2UKICAgICBub3QgbWFueSBwZW9wbGUgaGF2ZSB0aGUgYXNzZW1ibGVyLiBWYXJpb3VzIFdpbjMyIGNvbXBpbGF0aW9uIGZpeGVzIGFuZAogICAgIHVwZGF0ZSB0byB0aGUgSU5TVEFMTC5XMzIgZmlsZSB3aXRoIChob3BlZnVsbHkpIG1vcmUgYWNjdXJhdGUgV2luMzIKICAgICBidWlsZCBpbnN0cnVjdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGNvbmZpZ3VyZSBzY3JpcHQgJ0NvbmZpZ3VyZScgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgY3J5cHRvL2RhdGUuaAogICAgIGZpbGUgdW5kZXIgV2luMzIgYW5kIGFsc28gYnVpbGQgcGVtLmggZnJvbSBwZW0ub3JnLiBOZXcgc2NyaXB0CiAgICAgdXRpbC9ta2ZpbGVzLnBsIHRvIGNyZWF0ZSB0aGUgTUlORk8gZmlsZSBvbiBlbnZpcm9ubWVudHMgdGhhdCBjYW4ndCBkbyBhCiAgICAgJ21ha2UgZmlsZXMnOiBwZXJsIHV0aWwvbWtmaWxlcy5wbCA+TUlORk8gc2hvdWxkIHdvcmsuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFqb3IgcmV3b3JrIG9mIERFUyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIGluIHRoZSBwdXJzdWl0IG9mIGNvcnJlY3RuZXNzCiAgICAgYW5kIHB1cml0eS4gQXMgYSByZXN1bHQsIG1hbnkgZXZpbCBjYXN0cyBldmFwb3JhdGVkLCBhbmQgc29tZSB3ZWlyZG5lc3MsCiAgICAgdG9vLiBZb3UgbWF5IGZpbmQgdGhpcyBjYXVzZXMgd2FybmluZ3MgaW4geW91ciBjb2RlLiBaYXBwaW5nIHlvdXIgZXZpbAogICAgIGNhc3RzIHdpbGwgcHJvYmFibHkgZml4IHRoZW0uIE1vc3RseS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGZvciBhIHR5cG8gaW4gYXNuMS5oLiBCdWcgZml4IHRvIG9iamVjdCBjcmVhdGlvbiBzY3JpcHQKICAgICBvYmpfZGF0LnBsLiBJdCBjb25zaWRlcmVkIGEgemVybyBpbiBhbiBvYmplY3QgZGVmaW5pdGlvbiB0byBtZWFuCiAgICAgImVuZCBvZiBvYmplY3QiOiBub25lIG9mIHRoZSBvYmplY3RzIGluIG9iamVjdHMuaCBoYXZlIGFueSB6ZXJvcwogICAgIHNvIGl0IHdhc24ndCBzcG90dGVkLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEVyd2FubiBBQkFMRUEgPGVhYmFsZWFAY2VydHBsdXMuY29tPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRyaXBsZSBERVMgQ2lwaGVyIEJsb2NrIENoYWluaW5nIHdpdGggT3V0cHV0IEZlZWRiYWNrCiAgICAgTWFza2luZyAoQ0JDTSkuIEluIHRoZSBhYnNlbmNlIG9mIHRlc3QgdmVjdG9ycywgdGhlIGJlc3QgSSBoYXZlIGJlZW4gYWJsZQogICAgIHRvIGRvIGlzIGNoZWNrIHRoYXQgdGhlIGRlY3J5cHQgdW5kb2VzIHRoZSBlbmNyeXB0LCBzbyBmYXIuIFNlbmQgbWUgdGVzdAogICAgIHZlY3RvcnMgaWYgeW91IGhhdmUgdGhlbS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ29ycmVjdCBjYWxjdWxhdGlvbiBvZiBrZXkgbGVuZ3RoIGZvciBleHBvcnQgY2lwaGVycyAodG9vIG11Y2ggc3BhY2Ugd2FzCiAgICAgYWxsb2NhdGVkIGZvciBudWxsIGNpcGhlcnMpLiBUaGlzIGhhcyBub3QgYmVlbiB0ZXN0ZWQhCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1vZGlmaWNhdGlvbnMgdG8gdGhlIG1rZGVmLnBsIGZvciBXaW4zMiBERUYgZmlsZSBjcmVhdGlvbi4gVGhlIHVzYWdlCiAgICAgbWVzc2FnZSBpcyBub3cgY29ycmVjdCAoaXQgdW5kZXJzdGFuZHMgImNyeXB0byIgYW5kICJzc2wiIG9uIGl0cwogICAgIGNvbW1hbmQgbGluZSkuIFRoZXJlIGlzIGFsc28gbm93IGFuICJ1cGRhdGUiIG9wdGlvbi4gVGhpcyB3aWxsIHVwZGF0ZQogICAgIHRoZSB1dGlsL3NzbGVheS5udW0gYW5kIHV0aWwvbGliZWF5Lm51bSBmaWxlcyB3aXRoIGFueSBuZXcgZnVuY3Rpb25zLgogICAgIElmIHlvdSBkbyBhOiAKICAgICBwZXJsIHV0aWwvbWtkZWYucGwgY3J5cHRvIHNzbCB1cGRhdGUKICAgICBpdCB3aWxsIHVwZGF0ZSB0aGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE92ZXJoYXVsZWQgdGhlIFBlcmwgaW50ZXJmYWNlIChwZXJsLyopOgogICAgIC0gcG9ydGVkIEJOIHN0dWZmIHRvIE9wZW5TU0wncyBkaWZmZXJlbnQgQk4gbGlicmFyeQogICAgIC0gbWFkZSB0aGUgcGVybC8gc291cmNlIHRyZWUgQ1ZTLWF3YXJlCiAgICAgLSByZW5hbWVkIHRoZSBwYWNrYWdlIGZyb20gU1NMZWF5IHRvIE9wZW5TU0wgKHRoZSBmaWxlcyBzdGlsbCBjb250YWluCiAgICAgICB0aGVpciBoaXN0b3J5IGJlY2F1c2UgSSd2ZSBjb3BpZWQgdGhlbSBpbiB0aGUgcmVwb3NpdG9yeSkKICAgICAtIHJlbW92ZWQgb2Jzb2xldGUgZmlsZXMgKHRoZSB0ZXN0IHNjcmlwdHMgd2lsbCBiZSByZXBsYWNlZAogICAgICAgYnkgYmV0dGVyIFRlc3Q6Okhhcm5lc3MgdmFyaWFudHMgaW4gdGhlIGZ1dHVyZSkKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRmlyc3QgY3V0IGZvciBhIHZlcnkgY29uc2VydmF0aXZlIHNvdXJjZSB0cmVlIGNsZWFudXA6CiAgICAgMS4gbWVyZ2UgdmFyaW91cyBvYnNvbGV0ZSByZWFkbWUgdGV4dHMgaW50byBkb2Mvc3NsZWF5LnR4dAogICAgIHdoZXJlIHdlIGNvbGxlY3QgdGhlIG9sZCBkb2N1bWVudHMgYW5kIHJlYWRtZSB0ZXh0cy4KICAgICAyLiByZW1vdmUgdGhlIGZpcnN0IHBhcnQgb2YgZmlsZXMgd2hlcmUgSSdtIGFscmVhZHkgc3VyZSB0aGF0IHdlIG5vCiAgICAgbG9uZ2VyIG5lZWQgdGhlbSBiZWNhdXNlIG9mIHRocmVlIHJlYXNvbnM6IGVpdGhlciB0aGV5IGFyZSBqdXN0IHRlbXBvcmFyeQogICAgIGZpbGVzIHdoaWNoIHdlcmUgbGVmdCBieSBFcmljIG9yIHRoZXkgYXJlIHByZXNlcnZlZCBvcmlnaW5hbCBmaWxlcyB3aGVyZQogICAgIEkndmUgdmVyaWZpZWQgdGhhdCB0aGUgZGlmZiBpcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgQ1ZTIHZpYSAiY3ZzIGRpZmYKICAgICAtclNTTGVheV8wXzhfMWIiIG9yIHRoZXkgd2VyZSByZW5hbWVkIChhcyBpdCB3YXMgZGVmaW5pdGVseSB0aGUgY2FzZSBmb3IKICAgICB0aGUgY3J5cHRvL21kLyBzdHVmZikuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1vcmUgZXh0ZW5zaW9uIGNvZGUuIEluY29tcGxldGUgc3VwcG9ydCBmb3Igc3ViamVjdCBhbmQgaXNzdWVyIGFsdAogICAgIG5hbWUsIGlzc3VlciBhbmQgYXV0aG9yaXR5IGtleSBpZC4gQ2hhbmdlIHRoZSBpMnYgZnVuY3Rpb24gcGFyYW1ldGVycwogICAgIGFuZCBhZGQgYW4gZXh0cmEgJ2NybCcgcGFyYW1ldGVyIGluIHRoZSBYNTA5VjNfQ1RYIHN0cnVjdHVyZTogZ3Vlc3MKICAgICB3aGF0IHRoYXQncyBmb3IgOi0pIEZpeCB0byBBU04xIG1hY3JvIHdoaWNoIG1lc3NlZCB1cAogICAgIElNUExJQ0lUIHRhZyBhbmQgYWRkIGZfZW51bS5jIHdoaWNoIGFkZHMgYTJpLCBpMmEgZm9yIEVOVU1FUkFURUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgRU5VTUVSQVRFRCB0eXBlLiBUaGlzIGlzIGxhcmdlbHkgY29waWVkIGZyb20gdGhlCiAgICAgSU5URUdFUiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb24sIEVWUF9NRF9DVFhfY29weSgpIHRvIHJlcGxhY2UgZnJlcXVlbnQgdXNlIG9mIG1lbWNweS4KICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBNYWtlIHN1cmUgYG1ha2UgcmVoYXNoJyB0YXJnZXQgcmVhbGx5IGZpbmRzIHRoZSBgb3BlbnNzbCcgcHJvZ3JhbS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIFNxdWVlemUgYW5vdGhlciA3JSBvZiBzcGVlZCBvdXQgb2YgTUQ1IGFzc2VtYmxlciwgYXQgbGVhc3Qgb24gYSBQMi4gSSdkCiAgICAgbGlrZSB0byBoZWFyIGFib3V0IGl0IGlmIHRoaXMgc2xvd3MgZG93biBvdGhlciBwcm9jZXNzb3JzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgQ3lnV2luMzIgcGxhdGZvcm0gaW5mb3JtYXRpb24gdG8gQ29uZmlndXJlIHNjcmlwdC4KICAgICBbQWxhbiBCYXRpZSA8YmF0aWVAYWFoei5qZi5pbnRlbC5jb20+XQoKICAqKSBGaXhlZCBtcy8zMmFsbC5iYXQgc2NyaXB0OiBgbm9fYXNtJyAtPiBgbm8tYXNtJwogICAgIFtSYWluZXIgVy4gR2VybGluZyA8Z2VybGluZ0BtcGctZ3YubXBnLmRlPl0KICAKICAqKSBOZXcgcHJvZ3JhbSBuc2VxIHRvIG1hbmlwdWxhdGUgbmV0c2NhcGUgY2VydGlmaWNhdGUgc2VxdWVuY2VzCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGNybDJwa2NzNyBzbyBpdCBzdXBwb3J0cyBtdWx0aXBsZSAtY2VydGZpbGUgYXJndW1lbnRzLiBGaXggYQogICAgIGZldyB0eXBvcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBCTiBjb2RlLiAgUHJldmlvdXNseSB0aGUgZGVmYXVsdCB3YXMgdG8gZGVmaW5lIEJOX1JFQ1VSU0lPTgogICAgIGJ1dCB0aGUgQk4gY29kZSBoYWQgc29tZSBwcm9ibGVtcyB0aGF0IHdvdWxkIGNhdXNlIGZhaWx1cmVzIHdoZW4KICAgICBkb2luZyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYW5kIHNvbWUgb3RoZXIgZnVuY3Rpb25zLgogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIEFkZCBBU04xIGFuZCBQRU0gY29kZSB0byBzdXBwb3J0IG5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQVNOMSBhbmQgUEVNIGNvZGUgdG8gc3VwcG9ydCBuZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNldmVyYWwgUEtJWCBhbmQgcHJpdmF0ZSBleHRlbmRlZCBrZXkgdXNhZ2UgT0lEcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlICdjYScgcHJvZ3JhbSB0byBoYW5kbGUgdGhlIG5ldyBleHRlbnNpb24gY29kZS4gTW9kaWZ5CiAgICAgb3BlbnNzbC5jbmYgZm9yIG5ldyBleHRlbnNpb24gZm9ybWF0LCBhZGQgY29tbWVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9yZSBYNTA5IFYzIGNoYW5nZXMuIEZpeCB0eXBvIGluIHYzX2JpdHN0ci5jLiBBZGQgc3VwcG9ydCB0byAncmVxJwogICAgIGFuZCBhZGQgYSBzYW1wbGUgdG8gb3BlbnNzbC5jbmYgc28gcmVxIC14NTA5IG5vdyBhZGRzIGFwcHJvcHJpYXRlCiAgICAgQ0EgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb250aW51ZWQgWDUwOSBWMyBjaGFuZ2VzLiBBZGQgdG8gb3RoZXIgbWFrZWZpbGVzLCBpbnRlZ3JhdGUgd2l0aCB0aGUKICAgICBlcnJvciBjb2RlLCBhZGQgaW5pdGlhbCBzdXBwb3J0IHRvIFg1MDlfcHJpbnQoKSBhbmQgeDUwOSBhcHBsaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUYWtlcyBhIGRlZXAgYnJlYXRoIGFuZCBzdGFydCBhZGRkaW5nIFg1MDkgVjMgZXh0ZW5zaW9uIHN1cHBvcnQgY29kZS4gQWRkCiAgICAgZmlsZXMgaW4gY3J5cHRvL3g1MDl2My4gTW92ZSBvcmlnaW5hbCBzdHVmZiB0byBjcnlwdG8veDUwOXYzL29sZC4gQWxsIHRoaXMKICAgICBzdHVmZiBpcyBjdXJyZW50bHkgaXNvbGF0ZWQgYW5kIGlzbid0IGV2ZW4gY29tcGlsZWQgeWV0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnRpbnVpbmcgcGF0Y2hlcyBmb3IgR2VuZXJhbGl6ZWRUaW1lLiBGaXggdXAgY2VydGlmaWNhdGUgYW5kIENSTAogICAgIEFTTjEgdG8gdXNlIEFTTjFfVElNRSBhbmQgbW9kaWZ5IHByaW50IHJvdXRpbmVzIHRvIHVzZSBBU04xX1RJTUVfcHJpbnQuCiAgICAgUmVtb3ZlZCB0aGUgdmVyc2lvbnMgY2hlY2sgZnJvbSBYNTA5IHJvdXRpbmVzIHdoZW4gbG9hZGluZyBleHRlbnNpb25zOgogICAgIHRoaXMgYWxsb3dzIGNlcnRhaW4gYnJva2VuIGNlcnRpZmljYXRlcyB0aGF0IGRvbid0IHNldCB0aGUgdmVyc2lvbgogICAgIHByb3Blcmx5IHRvIGJlIHByb2Nlc3NlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEZWFsIHdpdGggaXJyaXRhdGluZyBzaGl0IHRvIGRvIHdpdGggZGVwZW5kZW5jaWVzLCBpbiBZQUFIVyAoWWV0IEFub3RoZXIKICAgICBBZCBIb2MgV2F5KSAtIE1ha2VmaWxlLnNzbHMgbm93IGFsbCBjb250YWluIGxvY2FsIGRlcGVuZGVuY2llcywgd2hpY2gKICAgICBjYW4gc3RpbGwgYmUgcmVnZW5lcmF0ZWQgd2l0aCAibWFrZSBkZXBlbmQiLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTcGVsbGluZyBtaXN0YWtlIGluIEMgdmVyc2lvbiBvZiBDQVNULTEyOC4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgYnkgSmVyZW15IEh5bHRvbiA8amVyZW15QGNucmkucmVzdG9uLnZhLnVzPl0KCiAgKikgQ2hhbmdlcyB0byB0aGUgZXJyb3IgZ2VuZXJhdGlvbiBjb2RlLiBUaGUgcGVybCBzY3JpcHQgZXJyLWNvZGUucGwgCiAgICAgbm93IHJlYWRzIGluIHRoZSBvbGQgZXJyb3IgY29kZXMgYW5kIHJldGFpbnMgdGhlIG9sZCBudW1iZXJzLCBvbmx5CiAgICAgYWRkaW5nIG5ldyBvbmVzIGlmIG5lY2Vzc2FyeS4gSXQgYWxzbyBvbmx5IGNoYW5nZXMgdGhlIC5lcnIgZmlsZXMgaWYgbmV3CiAgICAgY29kZXMgYXJlIGFkZGVkLiBUaGUgbWFrZWZpbGVzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBvbmx5IGluc2VydCBlcnJvcnMKICAgICB3aGVuIG5lZWRlZCAodG8gYXZvaWQgbmVlZGxlc3NseSBtb2RpZnlpbmcgaGVhZGVyIGZpbGVzKS4gVGhpcyBpcyBkb25lCiAgICAgYnkgb25seSBpbnNlcnRpbmcgZXJyb3JzIGlmIHRoZSAuZXJyIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgYXV0byBnZW5lcmF0ZWQKICAgICBDIGZpbGUuIFRvIHJlYnVpbGQgYWxsIHRoZSBlcnJvciBjb2RlcyBmcm9tIHNjcmF0Y2ggKHRoZSBvbGQgYmVoYXZpb3VyKQogICAgIGVpdGhlciBtb2RpZnkgY3J5cHRvL01ha2VmaWxlLnNzbCB0byBwYXNzIHRoZSAtcmVnZW4gZmxhZyB0byBlcnJfY29kZS5wbAogICAgIG9yIGRlbGV0ZSBhbGwgdGhlIC5lcnIgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ0FTVC0xMjggd2FzIGluY29ycmVjdGx5IGltcGxlbWVudGVkIGZvciBzaG9ydCBrZXlzLiBUaGUgQyB2ZXJzaW9uIGhhcwogICAgIGJlZW4gZml4ZWQsIGJ1dCBpcyB1bnRlc3RlZC4gVGhlIGFzc2VtYmxlciB2ZXJzaW9ucyBhcmUgYWxzbyBmaXhlZCwgYnV0CiAgICAgbmV3IGFzc2VtYmxlciBIQVMgTk9UIEJFRU4gR0VORVJBVEVEIEZPUiBXSU4zMiAtIHRoZSBNYWtlZmlsZSBuZWVkcyBmaXhpbmcKICAgICB0byByZWdlbmVyYXRlIGl0IGlmIG5lZWRlZC4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgKHdpdGggZml4IGZvciBDIHZlcnNpb24pIGJ5IEp1bi1pY2hpcm8gaXRvanVuCiAgICAgIEhhZ2lubyA8aXRvanVuQGthbWUubmV0Pl0KCiAgKikgRmlsZSB3YXMgb3BlbmVkIGluY29ycmVjdGx5IGluIHJhbmRmaWxlLmMuCiAgICAgW1VsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEJlZ2lubmluZyBvZiBzdXBwb3J0IGZvciBHZW5lcmFsaXplZFRpbWUuIGQyaSwgaTJkLCBjaGVjayBhbmQgcHJpbnQKICAgICBmdW5jdGlvbnMuIEFsc28gQVNOMV9USU1FIHN1aXRlIHdoaWNoIGlzIGEgQ0hPSUNFIG9mIFVUQ1RpbWUgb3IKICAgICBHZW5lcmFsaXplZFRpbWUuIEFTTjFfVElNRSBpcyB0aGUgcHJvcGVyIHR5cGUgdXNlZCBpbiBjZXJ0aWZpY2F0ZXMgZXQKICAgICBhbDogaXQncyBqdXN0IGFsbW9zdCBhbHdheXMgYSBVVENUaW1lLiBOb3RlIHRoaXMgcGF0Y2ggYWRkcyBuZXcgZXJyb3IKICAgICBjb2RlcyBzbyBkbyBhICJtYWtlIGVycm9ycyIgaWYgdGhlcmUgYXJlIHByb2JsZW1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvcnJlY3QgTGludXggMSByZWNvZ25pdGlvbiBpbiBjb25maWcuCiAgICAgW1VsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIFJlbW92ZSBwb2ludGxlc3MgTUQ1IGhhc2ggd2hlbiB1c2luZyBEU0Ega2V5cyBpbiBjYS4KICAgICBbQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIEdlbmVyYXRlIGFuIGVycm9yIGlmIGdpdmVuIGFuIGVtcHR5IHN0cmluZyBhcyBhIGNlcnQgZGlyZWN0b3J5LiBBbHNvCiAgICAgZ2VuZXJhdGUgYW4gZXJyb3IgaWYgaGFuZGVkIE5VTEwgKHByZXZpb3VzbHkgcmV0dXJuZWQgMCB0byBpbmRpY2F0ZSBhbgogICAgIGVycm9yLCBidXQgZGlkbid0IHNldCBvbmUpLgogICAgIFtCZW4gTGF1cmllLCByZXBvcnRlZCBieSBBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgQWRkIHByb3RvdHlwZXMgdG8gU1NMIG1ldGhvZHMuIE1ha2UgU1NMX3dyaXRlJ3MgYnVmZmVyIGNvbnN0LCBhdCBsYXN0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIGR1bW15IGZ1bmN0aW9uIEJOX3JlZl9tb2RfZXhwKCkgaW4gcnNhcmVmLmMgdG8gaGF2ZSB0aGUgY29ycmVjdAogICAgIHBhcmFtZXRlcnMuIFRoaXMgd2FzIGNhdXNpbmcgYSB3YXJuaW5nIHdoaWNoIGtpbGxlZCBvZmYgdGhlIFdpbjMyIGNvbXBpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIEMrKyBzdHlsZSBjb21tZW50cyBmcm9tIGNyeXB0by9ibi9ibl9sb2NhbC5oLgogICAgIFtOZWlsIENvc3RpZ2FuIDxuZWlsLmNvc3RpZ2FuQGNlbG9jb20uY29tPl0KCiAgKikgVGhlIGZ1bmN0aW9uIE9CSl90eHQybmlkIHdhcyBicm9rZW4uIEl0IHdhcyBzdXBwb3NlZCB0byByZXR1cm4gYSBuaWQKICAgICBiYXNlZCBvbiBhIHRleHQgc3RyaW5nLCBsb29raW5nIHVwIHNob3J0IGFuZCBsb25nIG5hbWVzIGFuZCBmaW5hbGx5CiAgICAgImRvdCIgZm9ybWF0LiBUaGUgImRvdCIgZm9ybWF0IHN0dWZmIGRpZG4ndCB3b3JrLiBBZGRlZCBuZXcgZnVuY3Rpb24KICAgICBPQkpfdHh0Mm9iaiB0byBkbyB0aGUgc2FtZSBidXQgcmV0dXJuIGFuIEFTTjFfT0JKRUNUIGFuZCByZXdyb3RlIAogICAgIE9CSl90eHQybmlkIHRvIHVzZSBpdC4gT0JKX3R4dDJvYmogY2FuIGFsc28gcmV0dXJuIG9iamVjdHMgZXZlbiBpZiB0aGUKICAgICBPSUQgaXMgbm90IHBhcnQgb2YgdGhlIHRhYmxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBwcm90b3R5cGVzIHRvIFg1MDkgbG9va3VwL3ZlcmlmeSBtZXRob2RzLCBmaXhpbmcgYSBidWcgaW4KICAgICBYNTA5X0xPT0tVUF9ieV9hbGlhcygpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTb3J0IG9wZW5zc2wgZnVuY3Rpb25zIGJ5IG5hbWUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEdldCB0aGUgZ2VuZHNhIHByb2dyYW0gd29ya2luZyAoaG9wZWZ1bGx5KSBhbmQgYWRkIGl0IHRvIGFwcCBsaXN0LiBSZW1vdmUKICAgICBlbmNyeXB0aW9uIGZyb20gc2FtcGxlIERTQSBrZXlzIChpbiBjYXNlIGFueW9uZSBpcyBpbnRlcmVzdGVkIHRoZSBwYXNzd29yZAogICAgIHdhcyAiMTIzNCIpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgX2FsbF8gKl9mcmVlIGZ1bmN0aW9ucyBhY2NlcHQgYSBOVUxMIHBvaW50ZXIuCiAgICAgW0ZyYW5zIEhleW1hbnMgPGZoZXltYW5zQGlzYXNlcnZlci5iZT5dCgogICopIElmIGEgREgga2V5IGlzIGdlbmVyYXRlZCBpbiBzM19zcnZyLmMsIGRvbid0IGJsb3cgaXQgYnkgdHJ5aW5nIHRvIHVzZQogICAgIE5VTEwgcG9pbnRlcnMuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBzX3NlcnZlciBzaG91bGQgc2VuZCB0aGUgQ0FmaWxlIGFzIGFjY2VwdGFibGUgQ0FzLCBub3QgaXRzIG93biBjZXJ0LgogICAgIFtCb2RvIE1vZWxsZXIgPDNtb2VsbGVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBEb24ndCBibG93IGl0IGZvciBudW1lcmljIC1uZXdrZXkgYXJndW1lbnRzIHRvIGFwcHMvcmVxLgogICAgIFtCb2RvIE1vZWxsZXIgPDNtb2VsbGVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBUZW1wIGtleSAiZm9yIGV4cG9ydCIgdGVzdHMgd2VyZSB3cm9uZyBpbiBzM19zcnZyLmMuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBBZGQgcHJvdG90eXBlIGZvciB0ZW1wIGtleSBjYWxsYmFjayBmdW5jdGlvbnMKICAgICBTU0xfQ1RYX3NldF90bXBfe3JzYSxkaH1fY2FsbGJhY2soKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBESF9mcmVlKCkgdG9sZXJhdGUgYmVpbmcgcGFzc2VkIGEgTlVMTCBwb2ludGVyIChsaWtlIFJTQV9mcmVlKCkgYW5kCiAgICAgRFNBX2ZyZWUoKSkuIE1ha2UgWDUwOV9QVUJLRVlfc2V0KCkgY2hlY2sgZm9yIGVycm9ycyBpbiBkMmlfUHVibGljS2V5KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgWDUwOV9uYW1lX2FkZF9lbnRyeSgpIGZyZWVkIHRoZSB3cm9uZyB0aGluZyBhZnRlciBhbiBlcnJvci4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgcnNhX2VheS5jIHdvdWxkIGF0dGVtcHQgdG8gZnJlZSBhIE5VTEwgY29udGV4dC4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgQklPX3Nfc29ja2V0KCkgaGFkIGEgYnJva2VuIHNob3VsZF9yZXRyeSgpIG9uIFdpbmRvemUuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEJJT19mX2J1ZmZlcigpIGRpZG4ndCBwYXNzIG9uIEJJT19DVFJMX0ZMVVNILgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBNYWtlIHN1cmUgdGhlIGFscmVhZHkgZXhpc3RpbmcgWDUwOV9TVE9SRS0+ZGVwdGggdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQKICAgICBpbiBYNTA5X1NUT1JFX25ldygpLCBidXQgZG9jdW1lbnQgdGhlIGZhY3QgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIHN0aWxsCiAgICAgdW51c2VkIGluIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHRoZSB2YXJpb3VzIGxpYnJhcnkgYW5kIGFwcHMgZmlsZXMgdG8gZnJlZSB1cCBwa2V5cyBvYnRhaW5lZCBmcm9tCiAgICAgWDUwOV9QVUJLRVlfZ2V0KCkgZXQgYWwuIEFsc28gYWxsb3cgeDUwOS5jIHRvIGhhbmRsZSBuZXRzY2FwZSBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCByZWZlcmVuY2UgY291bnRpbmcgaW4gWDUwOV9QVUJLRVlfZ2V0KCkuIFRoaXMgbWFrZXMKICAgICBkZW1vcy9tYXVyaWNlL2V4YW1wbGUyLmMgd29yaywgYW1vbmdzdCBvdGhlcnMsIHByb2JhYmx5LgogICAgIFtTdGV2ZSBIZW5zb24gYW5kIEJlbiBMYXVyaWVdCgogICopIEZpcnN0IGN1dCBvZiBhIGNsZWFudXAgZm9yIGFwcHMvLiBGaXJzdCB0aGUgYHNzbGVheScgcHJvZ3JhbSBpcyBub3cgbmFtZWQKICAgICBgb3BlbnNzbCcgYW5kIHNlY29uZCwgdGhlIHNob3J0Y3V0IHN5bWxpbmtzIGZvciB0aGUgYG9wZW5zc2wgPGNvbW1hbmQ+JwogICAgIGFyZSBubyBsb25nZXIgY3JlYXRlZC4gVGhpcyB3YXkgd2UgaGF2ZSBhIHNpbmdsZSBhbmQgY29uc2lzdGVudCBjb21tYW5kCiAgICAgbGluZSBpbnRlcmZhY2UgYG9wZW5zc2wgPGNvbW1hbmQ+Jywgc2ltaWxhciB0byBgY3ZzIDxjb21tYW5kPicuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIFBhdWwgU3V0dG9uIGFuZCBCZW4gTGF1cmllXQoKICAqKSBjYS5jOiBtb3ZlIHRlc3QgZm9yIERTQSBrZXlzIGluc2lkZSAjaWZuZGVmIE5PX0RTQS4gTWFrZSBwdWJrZXkKICAgICBCSVQgU1RSSU5HIHdyYXBwZXIgYWx3YXlzIGhhdmUgemVybyB1bnVzZWQgYml0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQ0EucGwsIHBlcmwgdmVyc2lvbiBvZiBDQS5zaCwgYWRkIGV4dGVuZGVkIGtleSB1c2FnZSBPSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgdG9wLWxldmVsIElOU1RBTEwgZG9jdW1lbnRhdGlvbiBlYXNpZXIgdG8gdW5kZXJzdGFuZC4KICAgICBbUGF1bCBTdXR0b25dCgogICopIE1ha2VmaWxlcyB1cGRhdGVkIHRvIGV4aXQgaWYgYW4gZXJyb3Igb2NjdXJzIGluIGEgc3ViLWRpcmVjdG9yeQogICAgIG1ha2UgKGluY2x1ZGluZyBpZiB1c2VyIHByZXNzZXMgXkMpIFtQYXVsIFN1dHRvbl0KCiAgKikgTWFrZSBNb250Z29tZXJ5IGNvbnRleHQgc3R1ZmYgZXhwbGljaXQgaW4gUlNBIGRhdGEgc3RydWN0dXJlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYnVpbGQgb3JkZXIgb2YgcGVtIGFuZCBlcnIgdG8gYWxsb3cgZm9yIGdlbmVyYXRlZCBwZW0uaC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHJlbnVtYmVyaW5nIGJ1ZyBpbiBYNTA5X05BTUVfZGVsZXRlX2VudHJ5KCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEVuaGFuY2VkIHRoZSBlcnItaW5zLnBsIHNjcmlwdCBzbyBpdCBtYWtlcyB0aGUgZXJyb3IgbGlicmFyeSBudW1iZXIgCiAgICAgZ2xvYmFsIGFuZCBjYW4gYWRkIGEgbGlicmFyeSBuYW1lLiBUaGlzIGlzIG5lZWRlZCBmb3IgZXh0ZXJuYWwgQVNOMSBhbmQKICAgICBvdGhlciBlcnJvciBsaWJyYXJpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZWQgc2tfaW5zZXJ0IHdoaWNoIG5ldmVyIHdvcmtlZCBwcm9wZXJseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggQVNOMSBtYWNyb3Mgc28gdGhleSBjYW4gaGFuZGxlIGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnV0ZWQgCiAgICAgRVhQTElDSVQgdGFncy4gU29tZSBub24gc3RhbmRhcmQgY2VydGlmaWNhdGVzIHVzZSB0aGVzZTogdGhleSBjYW4gbm93CiAgICAgYmUgcmVhZCBpbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNZXJnZWQgdGhlIHZhcmlvdXMgb2xkL29ic29sZXRlIFNTTGVheSBkb2N1bWVudGF0aW9uIGZpbGVzIChkb2MveHh4LmRvYykKICAgICBpbnRvIGEgc2luZ2xlIGRvYy9zc2xlYXkudHh0IGJ1bmRsZS4gVGhpcyB3YXkgdGhlIGluZm9ybWF0aW9uIGlzIHN0aWxsCiAgICAgcHJlc2VydmVkIGJ1dCBubyBsb25nZXIgbWVzc2VzIHVwIHRoaXMgZGlyZWN0b3J5LiBOb3cgaXQncyBuZXcgcm9vbSBmb3IKICAgICB0aGUgbmV3IHNldCBvZiBkb2N1bWVuYXRpb24gZmlsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFNFVHMgd2VyZSBpbmNvcnJlY3RseSBERVIgZW5jb2RlZC4gVGhpcyB3YXMgYSBtYWpvciBwYWluLCBiZWNhdXNlIHRoZXkKICAgICBzaGFyZWQgY29kZSB3aXRoIFNFUVVFTkNFcywgd2hpY2ggYXJlbid0IGNvZGVkIHRoZSBzYW1lLiBUaGlzIG1lYW5zIHRoYXQKICAgICBhbG1vc3QgZXZlcnl0aGluZyB0byBkbyB3aXRoIFNFVHMgb3IgU0VRVUVOQ0VzIGhhcyBlaXRoZXIgY2hhbmdlZCBuYW1lIG9yCiAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICBbQmVuIExhdXJpZSwgYmFzZWQgb24gYSBwYXJ0aWFsIGZpeCBieSBHUCBKYXlhbiA8Z3BAbnNqLmNvLmpwPl0KCiAgKikgRml4IHRlc3QgZGF0YSB0byB3b3JrIHdpdGggdGhlIGFib3ZlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIFJTQSBoZWFkZXIgZGVjbGFyYXRpb25zIHRoYXQgaGlkIGEgYnVnIEkgZml4ZWQgaW4gMC45LjBiIGJ1dAogICAgIHdhcyBhbHJlYWR5IGZpeGVkIGJ5IEVyaWMgZm9yIDAuOS4xIGl0IHNlZW1zLgogICAgIFtCZW4gTGF1cmllIC0gcG9pbnRlZCBvdXQgYnkgVWxmIE32bGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQXV0b2RldGVjdCBGcmVlQlNEMy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHZhcmlvdXMgYnVncyBpbiBDb25maWd1cmUuIFRoaXMgYWZmZWN0cyB0aGUgZm9sbG93aW5nIHBsYXRmb3JtczoKICAgICBuZXh0c3RlcAogICAgIG5jci1zY2RlCiAgICAgdW5peHdhcmUtMi4wCiAgICAgdW5peHdhcmUtMi4wLXBlbnRpdW0KICAgICBzY281LWNjLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFbGltaW5hdGUgZ2VuZXJhdGVkIGZpbGVzIGZyb20gQ1ZTLiBSZW9yZGVyIHRlc3RzIHRvIHJlZ2VuZXJhdGUgZmlsZXMKICAgICBiZWZvcmUgdGhleSBhcmUgbmVlZGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBHZW5lcmF0ZSBNYWtlZmlsZS5zc2wgZnJvbSBNYWtlZmlsZS5vcmcgKHRvIGtlZXAgQ1ZTIGhhcHB5KS4KICAgICBbQmVuIExhdXJpZV0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4xYiBhbmQgMC45LjFjICBbMjMtRGVjLTE5OThdCgogICopIEFkZGVkIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgdG8gY3J5cHRvL2NyeXB0by5oIGFuZCAKICAgICBjaGFuZ2VkIFNTTGVheSB0byBPcGVuU1NMIGluIHZlcnNpb24gc3RyaW5ncy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KICAKICAqKSBTb21lIGZpeHVwcyB0byB0aGUgdG9wLWxldmVsIGRvY3VtZW50cy4KICAgICBbUGF1bCBTdXR0b25dCgogICopIEZpeGVkIHRoZSBuYXN0eSBidWcgd2hlcmUgcnNhcmVmLmggd2FzIG5vdCBmb3VuZCB1bmRlciBjb21waWxlLXRpbWUKICAgICBiZWNhdXNlIHRoZSBzeW1saW5rIHRvIGluY2x1ZGUvIHdhcyBtaXNzaW5nLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBJbmNvcnBvcmF0ZWQgdGhlIHBvcHVsYXIgbm8tUlNBL0RTQS1vbmx5IHBhdGNoZXMgCiAgICAgd2hpY2ggYWxsb3cgdG8gY29tcGlsZSBhIFJTQS1mcmVlIFNTTGVheS4KICAgICBbQW5kcmV3IENvb2tlIC8gSW50ZXJyYWRlciBMZHQuLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXhlZCBuYXN0eSByZWhhc2ggcHJvYmxlbSB1bmRlciBgbWFrZSAtZiBNYWtlZmlsZS5zc2wgbGlua3MnCiAgICAgd2hlbiAic3NsZWF5IiBpcyBzdGlsbCBub3QgZm91bmQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIG1vcmUgcGxhdGZvcm1zIHRvIENvbmZpZ3VyZTogQ3JheSBUM0UsIEhQVVggMTEsIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBCZWNrbWFubiA8YmVja21hbkBhY2wubGFubC5nb3Y+XQoKICAqKSBVcGRhdGVkIHRoZSBSRUFETUUgZmlsZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdmFyaW91cyAuY3ZzaWdub3JlIGZpbGVzIGluIHRoZSBDVlMgcmVwb3NpdG9yeSBzdWJkaXJzCiAgICAgdG8gbWFrZSBhICJjdnMgdXBkYXRlIiByZWFsbHkgc2lsZW50LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZWNvbXBpbGVkIHRoZSBlcnJvci1kZWZpbml0aW9uIGhlYWRlciBmaWxlcyBhbmQgYWRkZWQKICAgICBtaXNzaW5nIHN5bWJvbHMgdG8gdGhlIFdpbjMyIGxpbmtlciB0YWJsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIENsZWFuZWQgdXAgdGhlIHRvcC1sZXZlbCBkb2N1bWVudHM7CiAgICAgbyBuZXcgZmlsZXM6IENIQU5HRVMgYW5kIExJQ0VOU0UKICAgICBvIG1lcmdlZCBWRVJTSU9OLCBISVNUT1JZKiBhbmQgUkVBRE1FKiBmaWxlcyBhIENIQU5HRVMuU1NMZWF5IAogICAgIG8gbWVyZ2VkIENPUFlSSUdIVCBpbnRvIExJQ0VOU0UKICAgICBvIHJlbW92ZWQgb2Jzb2xldGUgVE9ETyBmaWxlCiAgICAgbyByZW5hbWVkIE1JQ1JPU09GVCB0byBJTlNUQUxMLlczMgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmVkIGR1bW15IGZpbGVzIGZyb20gdGhlIDAuOS4xYiBzb3VyY2UgdHJlZTogCiAgICAgY3J5cHRvL2FzbjEveCBjcnlwdG8vYmlvL2NkIGNyeXB0by9iaW8vZmcgY3J5cHRvL2Jpby9ncmVwIGNyeXB0by9iaW8vdmkKICAgICBjcnlwdG8vYm4vYXNtLy4uLi4uLmFkZC5jIGNyeXB0by9ibi9hc20vYS5vdXQgY3J5cHRvL2RzYS9mIGNyeXB0by9tZDUvZgogICAgIGNyeXB0by9wZW0vZ21vbi5vdXQgY3J5cHRvL3Blcmxhc20vZiBjcnlwdG8vcGtjczcvYnVpbGQgY3J5cHRvL3JzYS9mCiAgICAgY3J5cHRvL3NoYS9hc20vZiBjcnlwdG8vdGhyZWFkcy9mIG1zL3p6eiBzc2wvZiBzc2wvZi5tYWsgdGVzdC9mCiAgICAgdXRpbC9mLm1hayB1dGlsL3BsL2YgdXRpbC9wbC9mLm1hayBjcnlwdG8vYmYvYmZfbG9jbC5vbGQgYXBwcy9mCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIHZhcmlvdXMgcGxhdGZvcm0gcG9ydGFiaWxpdHkgZml4ZXMuCiAgICAgW01hcmsgSi4gQ294XQoKICAqKSBUaGUgR2VuZXNpcyBvZiB0aGUgT3BlblNTTCBycGplY3Q6CiAgICAgV2Ugc3RhcnQgd2l0aCB0aGUgbGF0ZXN0ICh1bnJlbGVhc2VkKSBTU0xlYXkgdmVyc2lvbiAwLjkuMWIgd2hpY2ggRXJpYyBBLgogICAgIFlvdW5nIGFuZCBUaW0gSi4gSHVkc29uIGNyZWF0ZWQgd2hpbGUgdGhleSB3ZXJlIHdvcmtpbmcgZm9yIEMyTmV0IHVudGlsCiAgICAgc3VtbWVyIDE5OTguCiAgICAgW1RoZSBPcGVuU1NMIFByb2plY3RdCiAKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjBiIGFuZCAwLjkuMWIgIFtub3QgcmVsZWFzZWRdCgogICopIFVwZGF0ZWQgYSBmZXcgQ0EgY2VydGlmaWNhdGVzIHVuZGVyIGNlcnRzLwogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIHNvbWUgQklHTlVNIGFwaSBzdHVmZi4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgVmFyaW91cyBwbGF0Zm9ybSBwb3J0czogT3BlbkJTRCwgVWx0cml4LCBJUklYIDY0Yml0LCBOZXRCU0QsIAogICAgIERHVVggeDg2LCBMaW51eCBBbHBoYSwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBOZXcgQ09NUCBsaWJyYXJ5IFtjcnlwdG8vY29tcC9dIGZvciBTU0wgUmVjb3JkIExheWVyIENvbXByZXNzaW9uOiAKICAgICBSTEUgKGR1bW15IGltcGxlbWVudGVkKSBhbmQgWkxJQiAocmVhbGx5IGltcGxlbWVudGVkIHdoZW4gWkxJQiBpcwogICAgIGF2YWlsYWJsZSkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZCAtc3RycGFyc2Ugb3B0aW9uIHRvIGFzbjFwYXJzIHByb2dyYW0gd2hpY2ggcGFyc2VzIG5lc3RlZCAKICAgICBiaW5hcnkgc3RydWN0dXJlcyAKICAgICBbRHIgU3RlcGhlbiBIZW5zb24gPHNoZW5zb25AYmlnZm9vdC5jb20+XQoKICAqKSBBZGRlZCAib2lkX2ZpbGUiIHRvIHNzbGVheS5jbmYgZm9yICJjYSIgYW5kICJyZXEiIHByb2dyYW1zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBEU0EgZml4IGZvciAiY2EiIHByb2dyYW0uCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkICItZ2Vua2V5IiBvcHRpb24gdG8gImRzYXBhcmFtIiBwcm9ncmFtLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBSSVBFIE1EMTYwIChybWQxNjApIG1lc3NhZ2UgZGlnZXN0LgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCAtYSAoYWxsKSBvcHRpb24gdG8gInNzbGVheSB2ZXJzaW9uIiBjb21tYW5kLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBQTEFURk9STSBkZWZpbmUgd2hpY2ggaXMgdGhlIGlkIGdpdmVuIHRvIENvbmZpZ3VyZS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgTWVtQ2hlY2tfWFhYWCBmdW5jdGlvbnMgdG8gY3J5cHRvL21lbS5jIGZvciBtZW1vcnkgY2hlY2tpbmcuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIHRoZSBBU04uMSBwYXJzZXIgcm91dGluZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIEJJTyByb3V0aW5lcyB0byBzdXBwb3J0IFJFVVNFQUREUiwgc2VlaywgdGVsbCwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBhIEJOX0NUWCB0byB0aGUgQk4gbGlicmFyeS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdGhlIHdlYWsga2V5IHZhbHVlcyBpbiBERVMgbGlicmFyeQogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIEFQSSBpbiBFVlAgbGlicmFyeSBmb3IgY2lwaGVyIGFsaWFzZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIFJDMi82NGJpdCBjaXBoZXIuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIENvbnZlcnRlZCB0aGUgbGhhc2ggbGlicmFyeSB0byB0aGUgY3J5cHRvL21lbS5jIGZ1bmN0aW9ucy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgbW9yZSByZWNvZ25pemVkIEFTTi4xIG9iamVjdCBpZHMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIG1vcmUgUlNBIHBhZGRpbmcgY2hlY2tzIGZvciBTU0wvVExTLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBCSU8gcHJveHkvZmlsdGVyIGZ1bmN0aW9uYWxpdHkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIGV4dHJhX2NlcnRzIHRvIFNTTF9DVFggd2hpY2ggY2FuIGJlIHVzZWQKICAgICBzZW5kIGV4dHJhIENBIGNlcnRpZmljYXRlcyB0byB0aGUgY2xpZW50IGluIHRoZSBDQSBjZXJ0IGNoYWluIHNlbmRpbmcKICAgICBwcm9jZXNzLiBJdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoKS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgTm93IEZvcnRlenphIGlzIGRlbmllZCBpbiB0aGUgYXV0aGVudGljYXRpb24gcGhhc2UgYmVjYXVzZQogICAgIHRoaXMgaXMga2V5IGV4Y2hhbmdlIG1lY2hhbmlzbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IFNTTGVheSBhdCBhbGwuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGl0aW9uYWwgUEtDUzEgY2hlY2tzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBTdXBwb3J0IHRoZSBzdHJpbmcgIlRMU3YxIiBmb3IgYWxsIFRMUyB2MSBjaXBoZXJzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBmdW5jdGlvbiBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KCkgd2hpY2ggZ2l2ZXMgdGhlCiAgICAgZXhfZGF0YSBpbmRleCBvZiB0aGUgU1NMIGNvbnRleHQgaW4gdGhlIFg1MDlfU1RPUkVfQ1RYIGV4X2RhdGEuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEZpeGVkIGEgZmV3IG1lbW9yeSBsZWFrcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdmFyaW91cyBjb2RlIGFuZCBjb21tZW50IHR5cG9zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBIG1pbm9yIGJ1ZyBpbiBzc2wvczNfY2xudC5jIHdoZXJlIHRoZXJlIHdvdWxkIGFsd2F5cyBiZSA0IDAgCiAgICAgYnl0ZXMgc2VudCBpbiB0aGUgY2xpZW50IHJhbmRvbS4KICAgICBbRWR3YXJkIEJpc2hvcCA8ZWJpc2hvcEBzcHlnbGFzcy5jb20+XQoK