CkNvcHlyaWdodCAoQykgMjAwMi0yMDEwIEthcmwgSi4gUnVuZ2UgPHJ1bmdlQGthcmxydW5nZS5jb20+CkFsbCByaWdodHMgcmVzZXJ2ZWQuCgp4MTF2bmMgUkVBRE1FIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgRGF0ZTogTW9uIERlYyAyNyAyMDo1ODo1NyBFU1QgMjAxMAoKVGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpcyB0YWtlbiBmcm9tIHRoZXNlIFVSTHM6CgoJaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9pbmRleC5odG1sCglodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3gxMXZuY19vcHRzLmh0bWwKCS4uLgoKdGhleSBjb250YWluIHRoZSBtb3N0IHVwIHRvIGRhdGUgaW5mby4KCgkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9pbmRleC5odG1sOgoKCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCngxMXZuYzogYSBWTkMgc2VydmVyIGZvciByZWFsIFggZGlzcGxheXMKICAgICAgICAgICAgICAgICh0byBGQVEpICAgICh0byBEb3dubG9hZHMpICAgICh0byBCdWlsZGluZykgICAgKHRvIEJldGEgVGVzdCkKICAodG8gRG9uYXRpb25zKSBbUGF5UGFsXSAKCiAgIHgxMXZuYyBhbGxvd3Mgb25lIHRvIHZpZXcgcmVtb3RlbHkgYW5kIGludGVyYWN0IHdpdGggcmVhbCBYIGRpc3BsYXlzCiAgIChpLmUuIGEgZGlzcGxheSBjb3JyZXNwb25kaW5nIHRvIGEgcGh5c2ljYWwgbW9uaXRvciwga2V5Ym9hcmQsIGFuZAogICBtb3VzZSkgd2l0aCBhbnkgVk5DIHZpZXdlci4gSW4gdGhpcyB3YXkgaXQgcGxheXMgdGhlIHJvbGUgZm9yIFVuaXgvWDExCiAgIHRoYXQgV2luVk5DIHBsYXlzIGZvciBXaW5kb3dzLgoKICAgSXQgaGFzIGJ1aWx0LWluIFNTTC9UTFMgZW5jcnlwdGlvbiBhbmQgMjA0OCBiaXQgUlNBIGF1dGhlbnRpY2F0aW9uLAogICBpbmNsdWRpbmcgVmVOQ3J5cHQgc3VwcG9ydDsgVU5JWCBhY2NvdW50IGFuZCBwYXNzd29yZCBsb2dpbiBzdXBwb3J0OwogICBzZXJ2ZXItc2lkZSBzY2FsaW5nOyBzaW5nbGUgcG9ydCBIVFRQUy9IVFRQK1ZOQzsgWmVyb2NvbmYgc2VydmljZQogICBhZHZlcnRpc2luZzsgYW5kIFRpZ2h0Vk5DIGFuZCBVbHRyYVZOQyBmaWxlLXRyYW5zZmVyLiBJdCBoYXMgYWxzbyBiZWVuCiAgIGV4dGVuZGVkIHRvIHdvcmsgd2l0aCBub24tWCBkZXZpY2VzOiBuYXRpdmVseSBvbiBNYWMgT1MgWCBBcXVhL1F1YXJ0eiwKICAgd2ViY2FtcyBhbmQgVFYgdHVuZXIgY2FwdHVyZSBkZXZpY2VzLCBhbmQgZW1iZWRkZWQgTGludXggc3lzdGVtcyBzdWNoCiAgIGFzIFF0b3BpYSBDb3JlLiBGdWxsIElQdjYgc3VwcG9ydCBpcyBwcm92aWRlZC4gTW9yZSBmZWF0dXJlcyBhcmUKICAgZGVzY3JpYmVkIGhlcmUuCgogICBJdCBhbHNvIHByb3ZpZGVzIGFuIGVuY3J5cHRlZCBUZXJtaW5hbCBTZXJ2aWNlcyBtb2RlICgtY3JlYXRlLCAtc3ZjLAogICBvciAteGRtc3ZjIG9wdGlvbnMpIGJhc2VkIG9uIFVuaXggdXNlcm5hbWVzIGFuZCBVbml4IHBhc3N3b3JkcyB3aGVyZQogICB0aGUgdXNlciBkb2VzIG5vdCBuZWVkIHRvIG1lbW9yaXplIGhpcyBWTkMgZGlzcGxheS9wb3J0IG51bWJlci4KICAgTm9ybWFsbHkgYSB2aXJ0dWFsIFggc2Vzc2lvbiAoWHZmYikgaXMgY3JlYXRlZCBmb3IgZWFjaCB1c2VyLCBidXQgaXQKICAgYWxzbyB3b3JrcyB3aXRoIFggc2Vzc2lvbnMgb24gcGh5c2ljYWwgaGFyZHdhcmUuIFNlZSB0aGUgdHN2bmMKICAgdGVybWluYWwgc2VydmljZXMgbW9kZSBvZiB0aGUgU1NWTkMgdmlld2VyIGZvciBvbmUgd2F5IHRvIHRha2UKICAgYWR2YW50YWdlIG9mIHRoaXMgbW9kZS4KCiAgIEkgd3JvdGUgeDExdm5jIGJhY2sgaW4gMjAwMiBiZWNhdXNlIHgwcmZic2VydmVyIHdhcyBiYXNpY2FsbHkKICAgaW1wb3NzaWJsZSB0byBidWlsZCBvbiBTb2xhcmlzIGFuZCBoYWQgcG9vciBwZXJmb3JtYW5jZS4gVGhlIHByaW1hcnkKICAgeDByZmJzZXJ2ZXIgYnVpbGQgcHJvYmxlbXMgY2VudGVyZWQgYXJvdW5kIGVzb3RlcmljIEMrKyB0b29sa2l0cy4KICAgeDExdm5jIGlzIHdyaXR0ZW4gaW4gcGxhaW4gQyBhbmQgbmVlZHMgb25seSBzdGFuZGFyZCBsaWJyYXJpZXMgYW5kIHNvCiAgIHNob3VsZCB3b3JrIG9uIG5lYXJseSBhbGwgVW5peGVzLCBldmVuIHZlcnkgb2xkIG9uZXMuIEkgYWxzbyBjcmVhdGVkCiAgIGVuaGFuY2VtZW50cyB0byBpbXByb3ZlIHRoZSBpbnRlcmFjdGl2ZSByZXNwb25zZSwgYWRkZWQgbWFueSBmZWF0dXJlcywKICAgYW5kIGV0Yy4KCiAgIFRoaXMgcGFnZSBpbmNsdWRpbmcgdGhlIEZBUSBjb250YWlucyBtdWNoIGluZm9ybWF0aW9uIFsqXTsgc29sdXRpb25zCiAgIHRvIG1hbnkgcHJvYmxlbXM7IGFuZCBpbnRlcmVzdGluZyBhcHBsaWNhdGlvbnMsIGJ1dCBuZXZlcnRoZWxlc3MKICAgcGxlYXNlIGZlZWwgZnJlZSB0byBjb250YWN0IG1lIGlmIHlvdSBoYXZlIHByb2JsZW1zIG9yIHF1ZXN0aW9ucyAoYW5kCiAgIGlmIEkgc2F2ZSB5b3UgdGltZSBvciBleHBlbnNlIGJ5IGdpdmluZyB5b3Ugc29tZSBvZiBteSB0aW1lLCBwbGVhc2UKICAgY29uc2lkZXIgYSBQYXlQYWwgRG9uYXRpb24uKSBEbyBjaGVjayB0aGUgRkFRIGFuZCB0aGlzIHBhZ2UgZmlyc3Q7IEkKICAgcmVhbGl6ZSB0aGUgcGFnZXMgYXJlIG1hc3NpdmUsIGJ1dCB5b3UgY2FuIG9mdGVuIHVzZSB5b3VyIGJyb3dzZXIncwogICBmaW5kLWluLXBhZ2Ugc2VhcmNoIGFjdGlvbiB1c2luZyBhIGtleXdvcmQgdG8gZmluZCB0aGUgYW5zd2VyIHRvIHlvdXIKICAgcHJvYmxlbSBvciBxdWVzdGlvbi4KCiAgIFNTVk5DOiAgQW4geDExdm5jIHNpZGUtcHJvamVjdCBwcm92aWRlcyBhbiBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIKICAgcGFja2FnZSAoU1NWTkMpIGZvciBVbml4LCBXaW5kb3dzLCBhbmQgTWFjIE9TIFggd2l0aCBhdXRvbWF0aWMgU1NMCiAgIGFuZC9vciBTU0ggdHVubmVsbGluZyBzdXBwb3J0LCBTU0wgQ2VydGlmaWNhdGUgY3JlYXRpb24sIFNhdmVkCiAgIGNvbm5lY3Rpb24gcHJvZmlsZXMsIFplcm9jb25mLCBWZU5DcnlwdCwgYW5kIGJ1aWx0LWluIFByb3h5IHN1cHBvcnQuCiAgIEFkZGVkIGZlYXR1cmVzIGZvciB0aGUgVGlnaHRWTkMgVW5peCB2aWV3ZXI6IE5ld0ZCU2l6ZSwgWlJMRSBlbmNvZGluZywKICAgVmlld2VyLXNpZGUgU2NhbGluZywgY3Vyc29yIGFscGhhYmxlbmRpbmcsIGxvdyBjb2xvciBtb2RlcywgYW5kCiAgIGVuaGFuY2VkIHBvcHVwIG1lbnU7IFVsdHJhVk5DIGV4dGVuc2lvbnMgc3VwcG9ydCBmb3I6IEZpbGUgVHJhbnNmZXIsCiAgIFRleHQgQ2hhdCwgU2luZ2xlIFdpbmRvdywgU2VydmVyIElucHV0LCBhbmQgMS9uIFNjYWxpbmcgZXh0ZW5zaW9ucywKICAgYW5kIFVsdHJhVk5DIERTTSBlbmNyeXB0aW9uLiBUaGUgU1NWTkMgYnVuZGxlIGNvdWxkIGJlIHBsYWNlZCBvbiwgc2F5LAogICBhIFVTQiBtZW1vcnkgc3RpY2sgZm9yIFNTTC9TU0ggVk5DIHZpZXdpbmcgZnJvbSBuZWFybHkgYW55IG5ldHdvcmtlZAogICBjb21wdXRlci4KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICBBbm5vdW5jZW1lbnRzOgoKICAgSW1wb3J0YW50OiBJZiB5b3UgY3JlYXRlZCBhbnkgcGVybWFuZW50IFNTTCBjZXJ0aWZpY2F0ZXMgKGUuZy4gdmlhCiAgICJ4MTF2bmMgLXNzbCBTQVZFIC4uLiIpIG9uIGEgRGViaWFuIG9yIFVidW50dSBzeXN0ZW0gZnJvbSBTZXB0LiAyMDA2CiAgIHRocm91Z2ggTWF5IDIwMDgsIHRoZW4gdGhvc2Uga2V5cyBhcmUgbGlrZWx5IGV4dHJlbWVseSB3ZWFrIGFuZCBjYW4gYmUKICAgZWFzaWx5IGNyYWNrZWQuIFRoZSBjZXJ0aWZpY2F0ZSBmaWxlcyBzaG91bGQgYmUgZGVsZXRlZCBhbmQgcmVjcmVhdGVkCiAgIG9uIGEgbm9uLURlYmlhbiBzeXN0ZW0gb3IgYW4gdXBkYXRlZCBvbmUuIFNlZQogICBodHRwOi8vd3d3LmRlYmlhbi5vcmcvc2VjdXJpdHkvMjAwOC9kc2EtMTU3MSBmb3IgZGV0YWlscy4gVGhlIHNhbWUKICAgYXBwbGllcyB0byBTU0gga2V5cyAobm90IHVzZWQgYnkgeDExdm5jIGRpcmVjdGx5LCBidXQgbWFueSBwZW9wbGUgdXNlCiAgIFNTSCB0dW5uZWxzIGZvciBWTkMgYWNjZXNzLikKCiAgIEZBUSBtb3ZlZDogVGhlIGh1Z2UgRkFRIGhhcyBmaW5hbGx5IGJlZW4gbW92ZWQgdG8gaXRzIG93biBwYWdlLiBJZiB5b3UKICAgYXJlIHRyeWluZyB0byBmb2xsb3cgc29tZW9uZSdzIGxpbmsgdG8gYW4gRkFRIG9uY2Ugb24gdGhpcyBwYWdlIGl0IGlzCiAgIG5vdyBhIGJyb2tlbiBsaW5rLiBUcnkgaW5zZXJ0aW5nIHRoZSBzdHJpbmcgImZhcS5odG1sIiwgZS5nLjoKZnJvbTogICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jLyNmYXEtc2luZ2xlY2xpY2sKdG86ICAgICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sI2ZhcS1zaW5nbGVjbGljawoKICAgQXBvbG9naWVzIGZvciB0aGUgaW5jb252ZW5pZW5jZSwgdW5mb3J0dW5hdGVseSBpdCBpcyBub3QgcG9zc2libGUgdG8KICAgYXV0b21hdGljYWxseSByZWRpcmVjdCB0byB0aGUgbmV3IHBhZ2Ugc2luY2UgdGhlICcjJyBhbmNob3IgaXMgbm90CiAgIHNlbnQgdG8gdGhlIHdlYnNlcnZlci4KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgICBCYWNrZ3JvdW5kOgoKICAgVk5DIChWaXJ0dWFsIE5ldHdvcmsgQ29tcHV0aW5nKSBpcyBhIHZlcnkgdXNlZnVsIG5ldHdvcmsgZ3JhcGhpY3MKICAgcHJvdG9jb2wgKGFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIG9uZSBjb21wdXRlciBidXQgZGlzcGxheWluZyB0aGVpcgogICB3aW5kb3dzIG9uIGFub3RoZXIpIGluIHRoZSBzcGlyaXQgb2YgWCwgaG93ZXZlciwgdW5saWtlIFgsIHRoZQogICB2aWV3aW5nLWVuZCBpcyB2ZXJ5IHNpbXBsZSBhbmQgbWFpbnRhaW5zIG5vIHN0YXRlLiBJdCBpcyBhIHJlbW90ZQogICBmcmFtZWJ1ZmZlciAoUkZCKSBwcm90b2NvbC4KCiAgIFNvbWUgVk5DIGxpbmtzOgogICAgICogaHR0cDovL3d3dy5yZWFsdm5jLmNvbQogICAgICogaHR0cDovL3d3dy50aWdodHZuYy5jb20KICAgICAqIGh0dHA6Ly93d3cudWx0cmF2bmMuY29tLwogICAgICogaHR0cDovL3d3dy50ZXN0cGxhbnQuY29tL3Byb2R1Y3RzL3ZpbmVfc2VydmVyL09TX1gKCiAgIEZvciBVbml4LCB0aGUgdHJhZGl0aW9uYWwgVk5DIGltcGxlbWVudGF0aW9uIGluY2x1ZGVzIGEgInZpcnR1YWwiIFgxMQogICBzZXJ2ZXIgWHZuYyAodXN1YWxseSBsYXVuY2hlZCB2aWEgdGhlIHZuY3NlcnZlciBjb21tYW5kKSB0aGF0IGlzIG5vdAogICBhc3NvY2lhdGVkIHdpdGggYSBwaHlzaWNhbCBkaXNwbGF5LCBidXQgcHJvdmlkZXMgYSAiZmFrZSIgb25lIFgxMQogICBjbGllbnRzICh4dGVybSwgZmlyZWZveCwgZXRjLikgY2FuIGF0dGFjaCB0by4gQSByZW1vdGUgdXNlciB0aGVuCiAgIGNvbm5lY3RzIHRvIFh2bmMgdmlhIHRoZSBWTkMgY2xpZW50IHZuY3ZpZXdlciBmcm9tIGFueXdoZXJlIG9uIHRoZQogICBuZXR3b3JrIHRvIHZpZXcgYW5kIGludGVyYWN0IHdpdGggdGhlIHdob2xlIHZpcnR1YWwgWDExIGRlc2t0b3AuCgogICBUaGUgVk5DIHByb3RvY29sIGlzIGluIG1vc3QgY2FzZXMgYmV0dGVyIHN1aXRlZCBmb3IgcmVtb3RlIGNvbm5lY3Rpb25zCiAgIHdpdGggbG93IGJhbmR3aWR0aCBhbmQgaGlnaCBsYXRlbmN5IHRoYW4gaXMgdGhlIFgxMSBwcm90b2NvbCBiZWNhdXNlCiAgIGl0IGludm9sdmVzIGZhciBmZXdlciAicm91bmR0cmlwcyIgKGFuIGV4Y2VwdGlvbiBpcyB0aGUgY2FjaGVkIHBpeG1hcAogICBkYXRhIG9uIHRoZSB2aWV3aW5nLWVuZCBwcm92aWRlZCBieSBYLikgQWxzbywgd2l0aCBubyBzdGF0ZSBtYWludGFpbmVkCiAgIHRoZSB2aWV3aW5nLWVuZCBjYW4gY3Jhc2gsIGJlIHJlYm9vdGVkLCBvciByZWxvY2F0ZWQgYW5kIHRoZQogICBhcHBsaWNhdGlvbnMgYW5kIGRlc2t0b3AgY29udGludWUgcnVubmluZy4gTm90IHNvIHdpdGggWDExLgoKICAgU28gdGhlIHN0YW5kYXJkIFh2bmMvdm5jc2VydmVyIHByb2dyYW0gaXMgdmVyeSB1c2VmdWwsIEkgdXNlIGl0IGZvcgogICB0aGluZ3MgbGlrZToKICAgICAqIERlc2t0b3AgY29uZmVyZW5jaW5nIHdpdGggb3RoZXIgdXNlcnMgKGUuZy4gY29kZSByZXZpZXdzLikKICAgICAqIExvbmcgcnVubmluZyBhcHBzL3Rhc2tzIEkgd2FudCB0byBiZSBhYmxlIHRvIHZpZXcgZnJvbSBtYW55IHBsYWNlcwogICAgICAgKGUuZy4gZnJvbSBob21lIGFuZCB3b3JrLikKICAgICAqIE1vdGlmLCBHTk9NRSwgYW5kIHNpbWlsYXIgYXBwbGljYXRpb25zIHRoYXQgd291bGQgeWllbGQgdmVyeSBwb29yCiAgICAgICBwZXJmb3JtYW5jZSBvdmVyIGEgaGlnaCBsYXRlbmN5IGxpbmsuCgogICBIb3dldmVyLCBzb21ldGltZXMgb25lIHdhbnRzIHRvIGNvbm5lY3QgdG8gYSByZWFsIFgxMSBkaXNwbGF5IChpLmUuCiAgIG9uZSBhdHRhY2hlZCB0byBhIHBoeXNpY2FsIG1vbml0b3IsIGtleWJvYXJkLCBhbmQgbW91c2U6IGEgV29ya3N0YXRpb24KICAgb3IgYSBTdW5SYXkgc2Vzc2lvbikgZnJvbSBmYXIgYXdheS4gTWF5YmUgeW91IHdhbnQgdG8gY2xvc2UgZG93biBhbgogICBhcHBsaWNhdGlvbiBjbGVhbmx5IHJhdGhlciB0aGFuIHVzaW5nIGtpbGwsIG9yIHdhbnQgdG8gd29yayBhIGJpdCBpbgogICBhbiBhbHJlYWR5IHJ1bm5pbmcgYXBwbGljYXRpb24sIG9yIHdvdWxkIGxpa2UgdG8gaGVscCBhIGRpc3RhbnQKICAgY29sbGVhZ3VlIHNvbHZlIGEgcHJvYmxlbSB3aXRoIHRoZWlyIGRlc2t0b3AsIG9yIHdvdWxkIGp1c3QgbGlrZSB0bwogICB3b3JrIG91dCBvbiB0aGUgZGVjayBmb3IgYSB3aGlsZS4gVGhpcyBpcyB3aGVyZSB4MTF2bmMgaXMgdXNlZnVsLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgSG93IHRvIHVzZSB4MTF2bmM6CgogICBJbiB0aGlzIGJhc2ljIGV4YW1wbGUgbGV0J3MgYXNzdW1lIHRoZSByZW1vdGUgbWFjaGluZSB3aXRoIHRoZSBYCiAgIGRpc3BsYXkgeW91IHdpc2ggdG8gdmlldyBpcyAiZmFyLWF3YXkuZWFzdDowIiBhbmQgdGhlIHdvcmtzdGF0aW9uIHlvdQogICBhcmUgcHJlc2VudGx5IHdvcmtpbmcgYXQgaXMgInNpdHRpbmctaGVyZS53ZXN0Ii4KCiAgIFN0ZXAgMC4gRG93bmxvYWQgeDExdm5jIChzZWUgYmVsb3cpIGFuZCBoYXZlIGl0IGF2YWlsYWJsZSB0byBydW4gb24KICAgZmFyLWF3YXkuZWFzdCAob24gc29tZSBsaW51eCBkaXN0cm9zIGl0IGlzIGFzIGVhc3kgYXMgImFwdC1nZXQgaW5zdGFsbAogICB4MTF2bmMiLCAiZW1lcmdlIHgxMXZuYyIsIGV0Yy4pIFNpbWlsYXJseSwgaGF2ZSBhIFZOQyB2aWV3ZXIgKGUuZy4KICAgdm5jdmlld2VyKSByZWFkeSB0byBydW4gb24gc2l0dGluZy1oZXJlLndlc3QuIFdlIHJlY29tbWVuZCBUaWdodFZOQwogICBWaWV3ZXJzIChzZWUgYWxzbyBvdXIgU1NWTkMgdmlld2VyLikKCiAgIFN0ZXAgMS4gQnkgc29tZSBtZWFucyBsb2cgaW4gdG8gZmFyLWF3YXkuZWFzdCBhbmQgZ2V0IGEgY29tbWFuZCBzaGVsbAogICBydW5uaW5nIHRoZXJlLiBZb3UgY2FuIHVzZSBzc2gsIG9yIGV2ZW4gcmxvZ2luLCB0ZWxuZXQsIG9yIGFueSBvdGhlcgogICBtZXRob2QgdG8gZG8gdGhpcy4gV2UgZG8gdGhpcyBiZWNhdXNlIHRoZSB4MTF2bmMgcHJvY2VzcyBuZWVkcyB0byBiZQogICBydW4gb24gdGhlIHNhbWUgbWFjaGluZSB0aGUgWCBzZXJ2ZXIgcHJvY2VzcyBpcyBydW5uaW5nIG9uIChvdGhlcndpc2UKICAgdGhpbmdzIHdvdWxkIGJlIGV4dHJlbWVseSBzbG93LikKCiAgIFN0ZXAgMi4gSW4gdGhhdCBmYXItYXdheS5lYXN0IHNoZWxsICh3aXRoIGNvbW1hbmQgcHJvbXB0ICJmYXItYXdheT4iCiAgIGluIHRoaXMgZXhhbXBsZSkgcnVuIHgxMXZuYyBkaXJlY3RlZCBhdCB0aGUgZmFyLWF3YXkuZWFzdCBYIHNlc3Npb24KICAgZGlzcGxheToKCiAgZmFyLWF3YXk+IHgxMXZuYyAtZGlzcGxheSA6MAoKICAgWW91IGNvdWxkIGhhdmUgYWxzbyBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIERJU1BMQVk9OjAgaW5zdGVhZCBvZgogICB1c2luZyAiLWRpc3BsYXkgOjAiLiBUaGlzIHN0ZXAgYXR0YWNoZXMgeDExdm5jIHRvIHRoZSBmYXItYXdheS5lYXN0OjAKICAgWCBkaXNwbGF5IChpLmUuIG5vIHZpZXdlciBjbGllbnRzIHlldC4pCgogICBDb21tb24gR290Y2hhOiBUbyBnZXQgWDExIHBlcm1pc3Npb25zIHJpZ2h0LCB5b3UgbWF5IGFsc28gbmVlZCB0byBzZXQKICAgdGhlIFhBVVRIT1JJVFkgZW52aXJvbm1lbnQgdmFyaWFibGUgKG9yIHVzZSB0aGUgLWF1dGggb3B0aW9uKSB0byBwb2ludAogICB0byB0aGUgY29ycmVjdCBNSVQtTUFHSUMtQ09PS0lFIGZpbGUgKGUuZy4gL2hvbWUvam9lLy5YYXV0aG9yaXR5LikgSWYKICAgeDExdm5jIGRvZXMgbm90IGhhdmUgdGhlIGF1dGhvcml0eSB0byBjb25uZWN0IHRvIHRoZSBkaXNwbGF5IGl0IGV4aXRzCiAgIGltbWVkaWF0ZWx5LiBNb3JlIG9uIGhvdyB0byBmaXggdGhpcyBiZWxvdy4KCiAgIElmIHlvdSBzdXNwZWN0IGFuIFgxMSBwZXJtaXNzaW9ucyBwcm9ibGVtIGRvIHRoaXMgc2ltcGxlIHRlc3Q6IHdoaWxlCiAgIHNpdHRpbmcgYXQgdGhlIHBoeXNpY2FsIFggZGlzcGxheSBvcGVuIGEgdGVybWluYWwgd2luZG93CiAgIChnbm9tZS10ZXJtaW5hbCwgeHRlcm0sIGV0Yy4pIFlvdSBzaG91bGQgYmUgYWJsZSB0byBydW4geDExdm5jCiAgIHN1Y2Nlc3NmdWxseSBpbiB0aGF0IHRlcm1pbmFsIHdpdGhvdXQgYW55IG5lZWQgZm9yIGNvbW1hbmQgbGluZQogICBvcHRpb25zLiBJZiB0aGF0IHdvcmtzIE9LIHRoZW4geW91IGtub3cgWDExIHBlcm1pc3Npb25zIGFyZSB0aGUgb25seQogICB0aGluZyBwcmV2ZW50aW5nIGl0IGZyb20gd29ya2luZyB3aGVuIHlvdSB0cnkgdG8gc3RhcnQgeDExdm5jIHZpYSBhCiAgIHJlbW90ZSBzaGVsbC4gVGhlbiBmaXggdGhpcyB3aXRoIHRoZSB0aXBzIGJlbG93LgoKICAgTm90ZSBhcyBvZiBGZWIvMjAwNyB5b3UgY2FuIGFsc28gdHJ5IHRoZSAtZmluZCBvcHRpb24gaW5zdGVhZCBvZgogICAiLWRpc3BsYXkgLi4uIiBhbmQgc2VlIGlmIHRoYXQgZmluZHMgeW91ciBkaXNwbGF5IGFuZCBYYXV0aG9yaXR5LiBOb3RlCiAgIGFzIG9mIERlYy8yMDA5IHRoZSAtZmluZGF1dGggYW5kICItYXV0aCBndWVzcyIgb3B0aW9ucyBtYXkgYmUgaGVscGZ1bAogICBhcyB3ZWxsLgogICAoRW5kIG9mIENvbW1vbiBHb3RjaGEpCgogICBXaGVuIHgxMXZuYyBzdGFydHMgdXAgdGhlcmUgd2lsbCB0aGVuIGJlIG11Y2ggY2hhdHRlciBwcmludGVkIG91dCAodXNlCiAgICItcSIgdG8gcXVpZXQgaXQpLCB1bnRpbCBpdCBmaW5hbGx5IHNheXMgc29tZXRoaW5nIGxpa2U6CiAgLgogIC4KICAxMy8wNS8yMDA0IDE0OjU5OjU0IEF1dG9wcm9iaW5nIHNlbGVjdGVkIHBvcnQgNTkwMAogIDEzLzA1LzIwMDQgMTQ6NTk6NTQgc2NyZWVuIHNldHVwIGZpbmlzaGVkLgogIDEzLzA1LzIwMDQgMTQ6NTk6NTQKICAxMy8wNS8yMDA0IDE0OjU5OjU0IFRoZSBWTkMgZGVza3RvcCBpcyBmYXItYXdheTowCiAgUE9SVD01OTAwCgogICB3aGljaCBtZWFucyBhbGwgaXMgT0ssIGFuZCB3ZSBhcmUgcmVhZHkgZm9yIHRoZSBmaW5hbCBzdGVwLgoKICAgU3RlcCAzLiBBdCB0aGUgcGxhY2Ugd2hlcmUgeW91IGFyZSBzaXR0aW5nIChzaXR0aW5nLWhlcmUud2VzdCBpbiB0aGlzCiAgIGV4YW1wbGUpIHlvdSBub3cgd2FudCB0byBydW4gYSBWTkMgdmlld2VyIHByb2dyYW0uIFRoZXJlIGFyZSBWTkMKICAgdmlld2VycyBmb3IgVW5peCwgV2luZG93cywgTWFjT1MsIEphdmEtZW5hYmxlZCB3ZWIgYnJvd3NlcnMsIGFuZCBldmVuCiAgIGZvciBQREEncyBsaWtlIHRoZSBQYWxtIFBpbG90IGFuZCBDZWxsIFBob25lcyEgWW91IGNhbiB1c2UgYW55IG9mIHRoZW0KICAgdG8gY29ubmVjdCB0byB4MTF2bmMgKHNlZSB0aGUgYWJvdmUgVk5DIGxpbmtzIHVuZGVyICJCYWNrZ3JvdW5kOiIgb24KICAgaG93IHRvIG9idGFpbiBhIHZpZXdlciBmb3IgeW91ciBwbGF0Zm9ybSBvciBzZWUgdGhpcyBGQVEuIEZvciBTb2xhcmlzLAogICB2bmN2aWV3ZXIgaXMgYXZhaWxhYmxlIGluIHRoZSBDb21wYW5pb24gQ0QgcGFja2FnZSBTRld2bmMuKQoKICAgSW4gdGhpcyBleGFtcGxlIHdlJ2xsIHVzZSB0aGUgVW5peCB2bmN2aWV3ZXIgcHJvZ3JhbSBvbiBzaXR0aW5nLWhlcmUKICAgYnkgdHlwaW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBpbiBhIHNlY29uZCB0ZXJtaW5hbCB3aW5kb3c6CgogIHNpdHRpbmctaGVyZT4gdm5jdmlld2VyIGZhci1hd2F5LmVhc3Q6MAoKICAgVGhhdCBzaG91bGQgcG9wIHVwIGEgdmlld2VyIHdpbmRvdyBvbiBzaXR0aW5nLWhlcmUud2VzdCBzaG93aW5nIGFuZAogICBhbGxvd2luZyBpbnRlcmFjdGlvbiB3aXRoIHRoZSBmYXItYXdheS5lYXN0OjAgIFgxMSBkZXNrdG9wLiBQcmV0dHkKICAgbmlmdHkhIFdoZW4gZmluaXNoZWQsIGV4aXQgdGhlIHZpZXdlcjogdGhlIHJlbW90ZSB4MTF2bmMgcHJvY2VzcyB3aWxsCiAgIHNodXRkb3duIGF1dG9tYXRpY2FsbHkgKG9yIHlvdSBjYW4gdXNlIHRoZSAtZm9yZXZlciBvcHRpb24gdG8gaGF2ZSBpdAogICB3YWl0IGZvciBhZGRpdGlvbmFsIHZpZXdlciBjb25uZWN0aW9ucy4pCgogICBDb21tb24gR290Y2hhOiBOb3dhZGF5cyB0aGVyZSB3aWxsIGxpa2VseSBiZSBhIGhvc3QtbGV2ZWwgZmlyZXdhbGwgb24KICAgdGhlIHgxMXZuYyBzaWRlIHRoYXQgaXMgYmxvY2tpbmcgcmVtb3RlIGFjY2VzcyB0byB0aGUgVk5DIHBvcnQgKGUuZy4KICAgNTkwMC4pIFlvdSB3aWxsIGVpdGhlciBoYXZlIHRvIG9wZW4gdXAgdGhhdCBwb3J0IChvciBhIHJhbmdlIG9mIHBvcnRzKQogICBpbiB5b3VyIGZpcmV3YWxsIGFkbWluaXN0cmF0aW9uIHRvb2wsIG9yIHRyeSB0aGUgU1NIIHR1bm5lbGxpbmcgbWV0aG9kCiAgIGJlbG93IChldmVuIHN0aWxsIHRoZSBmaXJld2FsbCBtdXN0IGFsbG93IGluIHRoZSBTU0ggcG9ydCwgMjIuKQoKCiAgIFNob3J0Y3V0OiBPZiBjb3Vyc2UgaWYgeW91IGxlZnQgeDExdm5jIHJ1bm5pbmcgb24gZmFyLWF3YXkuZWFzdDowIGluIGEKICAgdGVybWluYWwgd2luZG93IHdpdGggdGhlIC1mb3JldmVyIG9wdGlvbiBvciBhcyBhIHNlcnZpY2UsIHlvdSdkIG9ubHkKICAgaGF2ZSB0byBkbyBTdGVwIDMgYXMgeW91IG1vdmVkIGFyb3VuZC4gQmUgc3VyZSB0byB1c2UgYSBWTkMgUGFzc3dvcmQKICAgb3Igb3RoZXIgbWVhc3VyZXMgaWYgeW91IGRvIHRoYXQuCgoKICAgU3VwZXIgU2hvcnRjdXQ6IEhlcmUgaXMgYSBwb3RlbnRpYWxseSB2ZXJ5IGVhc3kgd2F5IHRvIGdldCBhbGwgb2YgaXQKICAgd29ya2luZy4KICAgICAqIEhhdmUgeDExdm5jICgwLjkuMyBvciBsYXRlcikgYXZhaWxhYmxlIHRvIHJ1biBvbiB0aGUgcmVtb3RlIGhvc3QKICAgICAgIChpLmUuIGluICRQQVRILikKICAgICAqIERvd25sb2FkIGFuZCB1bnBhY2sgYSBTU1ZOQyBidW5kbGUgKDEuMC4xOSBvciBsYXRlciwgZS5nLgogICAgICAgc3N2bmNfbm9fd2luZG93cy0xLjAuMjgudGFyLmd6KSBvbiB0aGUgVmlld2VyLXNpZGUgbWFjaGluZS4KICAgICAqIFN0YXJ0IHRoZSBTU1ZOQyBUZXJtaW5hbCBTZXJ2aWNlcyBtb2RlIEdVSTogLi9zc3ZuYy9iaW4vdHN2bmMKICAgICAqIEVudGVyIHlvdXIgcmVtb3RlIHVzZXJuYW1lQGhvc3RuYW1lIChlLmcuIGZyZWRAZmFyLWF3YXkuZWFzdCkgaW4KICAgICAgIHRoZSAiVk5DIFRlcm1pbmFsIFNlcnZlciIgZW50cnkuCiAgICAgKiBDbGljayAiQ29ubmVjdCIuCgogICBUaGF0IHdpbGwgZG8gYW4gU1NIIHRvIHVzZXJuYW1lQGhvc3RuYW1lIGFuZCBzdGFydCB1cCB4MTF2bmMgYW5kIHRoZW4KICAgY29ubmVjdCBhIFZOQyBWaWV3ZXIgdGhyb3VnaCB0aGUgU1NIIGVuY3J5cHRlZCB0dW5uZWwuCgogICBUaGVyZSBhcmUgYSBudW1iZXIgb2YgdGhpbmdzIGFzc3VtZWQgaGVyZSwgZmlyc3QgdGhhdCB5b3UgYXJlIGFibGUgdG8KICAgU1NIIGludG8gdGhlIHJlbW90ZSBob3N0OyBpLmUuIHRoYXQgeW91IGhhdmUgYSBVbml4IGFjY291bnQgdGhlcmUgYW5kCiAgIHRoZSBTU0ggc2VydmVyIGlzIHJ1bm5pbmcuIE9uIFVuaXggYW5kIE1hY09TIFggaXQgaXMgYXNzdW1lZCB0aGF0IHRoZQogICBzc2ggY2xpZW50IGNvbW1hbmQgaXMgYXZhaWxhYmxlIG9uIHRoZSBsb2NhbCBtYWNoaW5lIChvbiBXaW5kb3dzIGEKICAgcGxpbmsgYmluYXJ5IGlzIGluY2x1ZGVkIGluIHRoZSBTU1ZOQyBidW5kbGUuKSBGaW5hbGx5LCBpdCBpcyBhc3N1bWVkCiAgIHRoYXQgeW91IGFyZSBhbHJlYWR5IGxvZ2dlZCBpbnRvIGFuIFggc2Vzc2lvbiBvbiB0aGUgcmVtb3RlIG1hY2hpbmUsCiAgIGUuZy4geW91ciB3b3Jrc3RhdGlvbiAob3RoZXJ3aXNlLCBhIHZpcnR1YWwgWCBzZXJ2ZXIsIGUuZy4gWHZmYiwgd2lsbAogICBiZSBzdGFydGVkIGZvciB5b3UuKQoKICAgSW4gc29tZSBjYXNlcyB0aGUgcmVtb3RlIFNTSCBzZXJ2ZXIgd2lsbCBub3QgcnVuIGNvbW1hbmRzIHdpdGggdGhlCiAgIHNhbWUgJFBBVEggdGhhdCB5b3Ugbm9ybWFsbHkgaGF2ZSBpbiB5b3VyIHNoZWxsIHRoZXJlLiBJbiB0aGlzIGNhc2UKICAgY2xpY2sgb24gT3B0aW9ucyAtPiBBZHZhbmNlZCAtPiBYMTFWTkMgT3B0aW9ucywgYW5kIHR5cGUgaW4gdGhlCiAgIGxvY2F0aW9uIG9mIHRoZSB4MTF2bmMgYmluYXJ5IHVuZGVyICJGdWxsIFBhdGgiLiAoRW5kIG9mIFN1cGVyCiAgIFNob3J0Y3V0KQoKCiAgIERlc2t0b3AgU2hhcmluZzogVGhlIGFib3ZlIG1vcmUgb3IgbGVzcyBhc3N1bWVkIG5vYm9keSB3YXMgc2l0dGluZyBhdAogICB0aGUgd29ya3N0YXRpb24gZGlzcGxheSAiZmFyLWF3YXkuZWFzdDowIi4gVGhpcyBpcyBvZnRlbiB0aGUgY2FzZTogYQogICB1c2VyIHdhbnRzIHRvIGFjY2VzcyBoZXIgd29ya3N0YXRpb24gcmVtb3RlbHkuIEFub3RoZXIgdXNhZ2UgcGF0dGVybgogICBoYXMgdGhlIHVzZXIgc2l0dGluZyBhdCAiZmFyLWF3YXkuZWFzdDowIiBhbmQgaW52aXRlcyBvbmUgb3IgbW9yZQogICBvdGhlciBwZW9wbGUgdG8gdmlldyBhbmQgaW50ZXJhY3Qgd2l0aCBoaXMgZGVza3RvcC4gUGVyaGFwcyB0aGUgdXNlcgogICBnaXZlcyBhIGRlbW8gb3IgcHJlc2VudGF0aW9uIHRoaXMgd2F5ICh1c2luZyB0aGUgdGVsZXBob25lIGZvciB2b2NhbAogICBjb21tdW5pY2F0aW9uLikgQSAiUmVtb3RlIEhlbHAgRGVzayIgbW9kZSB3b3VsZCBiZSBzaW1pbGFyOiBhCiAgIHRlY2huaWNpYW4gY29ubmVjdHMgcmVtb3RlbHkgdG8gdGhlIHVzZXIncyBkZXNrdG9wIHRvIGludGVyYWN0aXZlbHkKICAgc29sdmUgYSBwcm9ibGVtIHRoZSB1c2VyIGlzIGhhdmluZy4KCiAgIEZvciB0aGVzZSBjYXNlcyBpdCBzaG91bGQgYmUgb2J2aW91cyBob3cgaXQgaXMgZG9uZS4gVGhlIGFib3ZlIHN0ZXBzCiAgIHdpbGwgd29yaywgYnV0IG1vcmUgZWFzaWx5IHRoZSB1c2VyIHNpdHRpbmcgYXQgZmFyLWF3YXkuZWFzdDowIHNpbXBseQogICBzdGFydHMgdXAgeDExdm5jIGZyb20gYSB0ZXJtaW5hbCB3aW5kb3csIGFmdGVyIHdoaWNoIHRoZSBndWVzdHMgd291bGQKICAgc3RhcnQgdGhlaXIgVk5DIHZpZXdlcnMuIEZvciB0aGlzIHVzYWdlIG1vZGUgdGhlICItY29ubmVjdAogICBob3N0MSxob3N0MiIgb3B0aW9uIG1heSBiZSBvZiB1c2UgdG8gYXV0b21hdGljYWxseSBjb25uZWN0IHRvIHRoZQogICB2bmN2aWV3ZXJzIGluICItbGlzdGVuIiBtb2RlIG9uIHRoZSBsaXN0IG9mIGhvc3RzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgVHVubmVsbGluZyB4MTF2bmMgdmlhIFNTSDoKCiAgIFRoZSBhYm92ZSBleGFtcGxlIGhhZCBubyBzZWN1cml0eSBvciBwcml2YWN5IGF0IGFsbC4gV2hlbiBsb2dnaW5nIGludG8KICAgcmVtb3RlIG1hY2hpbmVzIChjZXJ0YWlubHkgd2hlbiBnb2luZyBvdmVyIHRoZSBpbnRlcm5ldCkgaXQgaXMgYmVzdCB0bwogICB1c2Ugc3NoLCBvciB1c2UgYSBWUE4gKGZvciBhIFZQTiwgVmlydHVhbCBQcml2YXRlIE5ldHdvcmssIHRoZSBhYm92ZQogICBleGFtcGxlIHNob3VsZCBiZSBwcmV0dHkgc2FmZS4pCgogICBGb3IgeDExdm5jIG9uZSBjYW4gdHVubmVsIHRoZSBWTkMgcHJvdG9jb2wgdGhyb3VnaCBhbiBlbmNyeXB0ZWQgc3NoCiAgIGNoYW5uZWwuIEl0IHdvdWxkIGxvb2sgc29tZXRoaW5nIGxpa2UgcnVubmluZyB0aGUgZm9sbG93aW5nIGNvbW1hbmRzOgogIHNpdHRpbmctaGVyZT4gc3NoIC10IC1MIDU5MDA6bG9jYWxob3N0OjU5MDAgZmFyLWF3YXkuZWFzdCAneDExdm5jIC1sb2NhbGhvc3QKLWRpc3BsYXkgOjAnCgogICAoeW91IHdpbGwgbGlrZWx5IGhhdmUgdG8gcHJvdmlkZSBwYXNzd29yZHMvcGFzc3BocmFzZXMgdG8gbG9naW4gZnJvbQogICBzaXR0aW5nLWhlcmUgaW50byB5b3VyIGZhci1hd2F5LmVhc3QgVW5peCBhY2NvdW50OyB3ZSBhc3N1bWUgeW91IGhhdmUKICAgYSBsb2dpbiBhY2NvdW50IG9uIGZhci1hd2F5LmVhc3QgYW5kIGl0IGlzIHJ1bm5pbmcgdGhlIFNTSCBzZXJ2ZXIpCgogICBBbmQgdGhlbiBpbiBhbm90aGVyIHRlcm1pbmFsIHdpbmRvdyBvbiBzaXR0aW5nLWhlcmUgcnVuIHRoZSBjb21tYW5kOgogIHNpdHRpbmctaGVyZT4gdm5jdmlld2VyIC1lbmNvZGluZ3MgImNvcHlyZWN0IHRpZ2h0IHpybGUgaGV4dGlsZSIgbG9jYWxob3N0OjAKCiAgIE5vdGU6IFRoZSAtZW5jb2RpbmdzIG9wdGlvbiBpcyB2ZXJ5IGltcG9ydGFudDogdm5jdmlld2VyIHdpbGwgb2Z0ZW4KICAgZGVmYXVsdCB0byAicmF3IiBlbmNvZGluZyBpZiBpdCB0aGlua3MgdGhlIGNvbm5lY3Rpb24gaXMgdG8gdGhlIGxvY2FsCiAgIG1hY2hpbmUsIGFuZCBzbyB2bmN2aWV3ZXIgZ2V0cyB0cmlja2VkIHRoaXMgd2F5IGJ5IHRoZSBzc2gKICAgcmVkaXJlY3Rpb24uICJyYXciIGVuY29kaW5nIHdpbGwgYmUgZXh0cmVtZWx5IHNsb3cgb3ZlciBhIG5ldHdvcmtlZAogICBsaW5rLCBzbyB5b3UgbmVlZCB0byBmb3JjZSB0aGUgaXNzdWUgd2l0aCAtZW5jb2RpbmdzICJjb3B5cmVjdCB0aWdodAogICAuLi4iLiBOb3dhZGF5cywgbm90IGFsbCB2aWV3ZXJzIHVzZSB0aGUgLWVuY29kaW5ncyBvcHRpb24sIHRyeQogICAiLVByZWZlcnJlZEVuY29kaW5nPVpSTEUiIChhbHRob3VnaCB0aGUgbmV3ZXIgdmlld2VycyBzZWVtIHRvCiAgIGF1dG9kZXRlY3Qgd2VsbCB3aGVuIHRvIHVzZSByYXcgb3Igbm90LikKCiAgIE5vdGUgdGhhdCAieDExdm5jIC1sb2NhbGhvc3QgLi4uIiBsaW1pdHMgaW5jb21pbmcgdm5jdmlld2VyCiAgIGNvbm5lY3Rpb25zIHRvIG9ubHkgdGhvc2UgZnJvbSB0aGUgc2FtZSBtYWNoaW5lLiBUaGlzIGlzIHZlcnkgbmF0dXJhbAogICBmb3Igc3NoIHR1bm5lbGxpbmcgKHRoZSByZWRpcmVjdGlvbiBhcHBlYXJzIHRvIGNvbWUgZnJvbSB0aGUgc2FtZQogICBtYWNoaW5lLikgVXNlIG9mIGEgVk5DIHBhc3N3b3JkIGlzIGFsc28gc3Ryb25nbHkgcmVjb21tZW5kZWQuCgogICBOb3RlIGFsc28gdGhlIC10IHdlIHVzZWQgYWJvdmUgKGZvcmNlIGFsbG9jYXRlIHBzZXVkb3Rlcm1pbmFsKSwgaXQKICAgYWN0dWFsbHkgc2VlbXMgdG8gaW1wcm92ZSBpbnRlcmFjdGl2ZSB0eXBpbmcgcmVzcG9uc2UgdmlhIFZOQyEKCiAgIFlvdSBtYXkgd2FudCB0byBhZGQgdGhlIC1DIG9wdGlvbiB0byBzc2ggdG8gZW5hYmxlIGNvbXByZXNzaW9uLiBUaGUKICAgVk5DIGNvbXByZXNzaW9uIGlzIG5vdCBwZXJmZWN0LCBhbmQgc28gdGhpcyBtYXkgaGVscCBhIGJpdC4gSG93ZXZlciwKICAgb3ZlciBhIGZhc3QgTEFOIHlvdSBwcm9iYWJseSBkb24ndCB3YW50IHRvIGVuYWJsZSBTU0ggY29tcHJlc3Npb24KICAgYmVjYXVzZSBpdCBjYW4gc2xvdyB0aGluZ3MgZG93bi4gVHJ5IGJvdGggYW5kIHNlZSB3aGljaCBpcyBmYXN0ZXIuCgogICBJZiB5b3VyIHVzZXJuYW1lIGlzIGRpZmZlcmVudCBvbiB0aGUgcmVtb3RlIG1hY2hpbmUgdXNlIHNvbWV0aGluZwogICBsaWtlOiAiZnJlZEBmYXItYXdheS5lYXN0IiBpbiB0aGUgYWJvdmUgc3NoIGNvbW1hbmQgbGluZS4KCiAgIFNvbWUgVk5DIHZpZXdlcnMgd2lsbCBkbyB0aGUgc3NoIHR1bm5lbGxpbmcgZm9yIHlvdSBhdXRvbWF0aWNhbGx5LCB0aGUKICAgVGlnaHRWTkMgVW5peCB2bmN2aWV3ZXIgZG9lcyB0aGlzIHdoZW4gdGhlICItdmlhIGZhci1hd2F5LmVhc3QiIG9wdGlvbgogICBpcyBzdXBwbGllZCB0byBpdCAodGhpcyByZXF1aXJlcyB4MTF2bmMgdG8gYmUgYWxyZWFkeSBydW5uaW5nIG9uCiAgIGZhci1hd2F5LmVhc3Qgb3IgaGF2aW5nIGl0IHN0YXJ0ZWQgYnkgaW5ldGQoOCkuKSBTZWUgdGhlIDNyZCBzY3JpcHQKICAgZXhhbXBsZSBiZWxvdyBmb3IgbW9yZSBpbmZvLgoKICAgU1NWTkM6ICBZb3UgbWF5IGFsc28gd2FudCB0byBsb29rIGF0IHRoZSBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIKICAgKHNzdm5jKSBidW5kbGVzIGJlY2F1c2UgdGhleSBjb250YWluIHNjcmlwdHMgYW5kIEdVSXMgdG8gYXV0b21hdGljYWxseQogICBzZXQgdXAgU1NIIHR1bm5lbHMgKGUuZy4gdGhlIEdVSSwgInNzdm5jIiwgZG9lcyBpdCBhdXRvbWF0aWNhbGx5IGFuZAogICBzbyBkb2VzIHRoaXMgY29tbWFuZDogInNzdm5jX2NtZCAtc3NoIHVzZXJAZmFyLWF3YXkuZWFzdDowIikgYW5kIGNhbgogICBldmVuIHN0YXJ0IHVwIHgxMXZuYyBhcyB3ZWxsLgoKICAgVGhlIFRlcm1pbmFsIFNlcnZpY2VzIG1vZGUgb2YgU1NWTkMgaXMgcGVyaGFwcyB0aGUgZWFzaWVzdCB3YXkgdG8gdXNlCiAgIHgxMXZuYy4gWW91IGp1c3QgbmVlZCB0byBoYXZlIHgxMXZuYyBhdmFpbGFibGUgaW4gJFBBVEggb24gdGhlIHJlbW90ZQogICBzaWRlIChhbmQgY2FuIFNTSCB0byB0aGUgaG9zdCksIGFuZCB0aGVuIG9uIHRoZSB2aWV3ZXItc2lkZSB5b3UgdHlwZQogICBzb21ldGhpbmcgbGlrZToKICB0c3ZuYyBmcmVkQGZhci1hd2F5LmVhc3QKCiAgIGV2ZXJ5dGhpbmcgZWxzZSBpcyBkb25lIGF1dG9tYXRpY2FsbHkgZm9yIHlvdS4gTm9ybWFsbHkgdGhpcyB3aWxsCiAgIHN0YXJ0IGEgdmlydHVhbCBUZXJtaW5hbCBTZXJ2aWNlcyBYIHNlc3Npb24gKFJBTS1vbmx5KSwgYnV0IGlmIHlvdQogICBhbHJlYWR5IGhhdmUgYSByZWFsIFggc2Vzc2lvbiB1cCBvbiB0aGUgcGh5c2ljYWwgaGFyZHdhcmUgaXQgd2lsbCBmaW5kCiAgIHRoYXQgb25lIGZvciB5b3UuCgogICBHYXRld2F5czogIElmIHRoZSBtYWNoaW5lIHlvdSBTU0ggaW50byBpcyBub3QgdGhlIHNhbWUgbWFjaGluZSB3aXRoCiAgIHRoZSBYIGRpc3BsYXkgeW91IHdpc2ggdG8gdmlldyAoZS5nLiB5b3VyIGNvbXBhbnkgcHJvdmlkZXMgaW5jb21pbmcKICAgU1NIIGFjY2VzcyB0byBhIGdhdGV3YXkgbWFjaGluZSksIHRoZW4geW91IG5lZWQgdG8gY2hhbmdlIHRoZSBhYm92ZQogICB0bywgZS5nLjogIi1MIDU5MDA6T3RoZXJIb3N0OjU5MDAiOgogIHNpdHRpbmctaGVyZT4gc3NoIC10IC1MIDU5MDA6T3RoZXJIb3N0OjU5MDAgZ2F0ZXdheS5lYXN0CgogICBXaGVyZSBnYXRld2F5LmVhc3QgaXMgdGhlIGludGVybmV0IGhvc3RuYW1lIChvciBJUCkgb2YgdGhlIGdhdGV3YXkKICAgbWFjaGluZSAoU1NIIHNlcnZlci4pICdPdGhlckhvc3QnIG1pZ2h0IGJlLCBlLmcuLCBmcmVkcy1wYyBvcgogICAxOTIuMTY4LjIuMzMgKGl0IGlzIE9LIGZvciB0aGVzZSB0byBiZSBwcml2YXRlIGhvc3RuYW1lcyBvciBwcml2YXRlIElQCiAgIGFkZHJlc3NlcywgdGhlIGhvc3QgaW4gLUwgaXMgcmVsYXRpdmUgdG8gdGhlIHJlbW90ZSBzZXJ2ZXIgc2lkZS4pCgogICBPbmNlIGxvZ2dlZCBpbiwgeW91J2xsIG5lZWQgdG8gZG8gYSBzZWNvbmQgbG9naW4gKHNzaCwgcnNoLCBldGMuKSB0bwogICB0aGUgd29ya3N0YXRpb24gbWFjaGluZSAnT3RoZXJIb3N0JyBhbmQgdGhlbiBzdGFydCB1cCB4MTF2bmMgb24gaXQgKGlmCiAgIGl0IGlzbid0IGFscmVhZHkgcnVubmluZy4pIChUaGUgIi1jb25uZWN0IGdhdGV3YXk6NTl4eCIgb3B0aW9uIG1heSBiZQogICBhbm90aGVyIGFsdGVybmF0aXZlIGhlcmUgd2l0aCB0aGUgdmlld2VyIGFscmVhZHkgaW4gLWxpc3RlbiBtb2RlLikgRm9yCiAgIGFuIGF1dG9tYXRpYyB3YXkgdG8gdXNlIGEgZ2F0ZXdheSBhbmQgaGF2ZSBhbGwgdGhlIG5ldHdvcmsgdHJhZmZpYwogICBlbmNyeXB0ZWQgKGluY2x1ZGluZyBpbnNpZGUgdGhlIGZpcmV3YWxsKSBzZWUgQ2hhaW5pbmcgU1NIJ3MuCgogICBUaGVzZSBnYXRld2F5IGFjY2VzcyBtb2RlcyBhbHNvIGNhbiBiZSBkb25lIGF1dG9tYXRpY2FsbHkgZm9yIHlvdSB2aWEKICAgdGhlICJQcm94eS9HYXRld2F5IiBzZXR0aW5nIGluIFNTVk5DIChpbmNsdWRpbmcgdGhlIENoYWluaW5nIFNTSCdzCiAgIGNhc2UsICJEb3VibGUgUHJveHkiLikKCiAgIEZpcmV3YWxscy9Sb3V0ZXJzOgoKICAgQSBsb3Qgb2YgcGVvcGxlIGhhdmUgaW5leHBlbnNpdmUgZGV2aWNlcyBmb3IgaG9tZSBvciBvZmZpY2UgdGhhdCBhY3QKICAgYXMgYSBGaXJld2FsbCBhbmQgUm91dGVyIHRvIHRoZSBtYWNoaW5lcyBpbnNpZGUgb24gYSBwcml2YXRlIExBTi4gT25lCiAgIGNhbiB1c3VhbGx5IGNvbmZpZ3VyZSB0aGUgRmlyZXdhbGwvUm91dGVyIGZyb20gaW5zaWRlIHRoZSBMQU4gdmlhIGEKICAgd2ViIGJyb3dzZXIuCgogICBPZnRlbiBoYXZpbmcgYSBGaXJld2FsbC9Sb3V0ZXIgc2l0dGluZyBiZXR3ZWVuIHRoZSB2bmN2aWV3ZXIgYW5kCiAgIHgxMXZuYyB3aWxsIG1ha2UgaXQgaW1wb3NzaWJsZSBmb3IgdGhlIHZpZXdlciB0byBjb25uZWN0IHRvIHgxMXZuYy4KCiAgIE9uZSB0aGluZyB0aGF0IGNhbiBiZSBkb25lIGlzIHRvIHJlZGlyZWN0IGEgcG9ydCBvbiB0aGUKICAgRmlyZXdhbGwvUm91dGVyIHRvLCBzYXksIHRoZSBTU0ggcG9ydCAoMjIpIG9uIGFuIGluc2lkZSBtYWNoaW5lIChob3cKICAgdG8gZG8gdGhpcyBkZXBlbmRzIG9uIHlvdXIgcGFydGljdWxhciBGaXJld2FsbC9Sb3V0ZXIsIG9mdGVuIHRoZQogICByb3V0ZXIgY29uZmlnIFVSTCBpcyBodHRwOi8vMTkyLjE2OC4xMDAuMSBTZWUgd3d3LnBvcnRmb3J3YXJkLmNvbSBmb3IKICAgbW9yZSBpbmZvLikgVGhpcyB3YXkgeW91IHJlYWNoIHRoZXNlIGNvbXB1dGVycyBmcm9tIGFueXdoZXJlIG9uIHRoZQogICBJbnRlcm5ldCBhbmQgdXNlIHgxMXZuYyB0byB2aWV3IFggc2Vzc2lvbnMgcnVubmluZyBvbiB0aGVtLgoKICAgU3VwcG9zZSB5b3UgY29uZmlndXJlZCB0aGUgRmlyZXdhbGwvUm91dGVyIHRvIHJlZGlyZWN0IHRoZXNlIHBvcnRzIHRvCiAgIHR3byBpbnRlcm5hbCBtYWNoaW5lczoKICBQb3J0IDEyMzAwIC0+IDE5Mi4xNjguMS4zLCBQb3J0IDIyIChTU0gpCiAgUG9ydCAxMjMwMSAtPiAxOTIuMTY4LjEuNCwgUG9ydCAyMiAoU1NIKQoKICAgKHdoZXJlIDE5Mi4xNjguMS4zIGlzICJqaWxscy1wYyIgYW5kIDE5Mi4xNjguMS40IGlzICJmcmVkcy1wYyIuKSBUaGVuCiAgIHRoZSBzc2gncyB3b3VsZCBsb29rIHNvbWV0aGluZyBsaWtlOgogIHNpdHRpbmctaGVyZT4gc3NoIC10IC1wIDEyMzAwIC1MIDU5MDA6bG9jYWxob3N0OjU5MDAgamlsbEBmYXItYXdheS5lYXN0ICd4MTF2Cm5jIC1sb2NhbGhvc3QgLWRpc3BsYXkgOjAnCiAgc2l0dGluZy1oZXJlPiBzc2ggLXQgLXAgMTIzMDEgLUwgNTkwMDpsb2NhbGhvc3Q6NTkwMCBmcmVkQGZhci1hd2F5LmVhc3QgJ3gxMXYKbmMgLWxvY2FsaG9zdCAtZGlzcGxheSA6MCcKCiAgIFdoZXJlIGZhci1hd2F5LmVhc3QgbWVhbnMgdGhlIGhvc3RuYW1lIChvciBJUCkgdGhhdCB0aGUKICAgUm91dGVyL0ZpcmV3YWxsIGlzIHVzaW5nIChmb3IgaG9tZSBzZXR1cHMgdGhpcyBpcyB1c3VhbGx5IHRoZSBJUAogICBnb3R0ZW4gZnJvbSB5b3VyIElTUCB2aWEgREhDUCwgdGhlIHNpdGUgaHR0cDovL3d3dy53aGF0aXNteWlwLmNvbS8gaXMKICAgYSBjb252ZW5pZW50IHdheSB0byBkZXRlcm1pbmUgd2hhdCBpdCBpcy4pCgogICBJdCBpcyBhIGdvb2QgaWRlYSB0byBhZGQgc29tZSBvYnNjdXJpdHkgdG8gYWNjZXNzaW5nIHlvdXIgc3lzdGVtIHZpYQogICBTU0ggYnkgdXNpbmcgc29tZSBoaWdoIHJhbmRvbSBwb3J0IChlLmcuIDEyMzAwIGluIHRoZSBhYm92ZSBleGFtcGxlLikKICAgSWYgeW91IGNhbid0IHJlbWVtYmVyIGl0LCBvciBhcmUgb3RoZXJ3aXNlIG5vdCB3b3JyaWVkIGFib3V0IHBvcnQKICAgc2Nhbm5lcnMgZGV0ZWN0aW5nIHRoZSBwcmVzZW5jZSBvZiB5b3VyIFNTSCBzZXJ2ZXIgYW5kIHRoZXJlIGlzIGp1c3QKICAgb25lIGludGVybmFsIFBDIGludm9sdmVkIHlvdSBjb3VsZCBtYXAgMjI6CiAgUG9ydCAyMiAtPiAxOTIuMTY4LjEuMywgUG9ydCAyMiAoU1NIKQoKICAgQWdhaW4sIHRoaXMgU1NIIGdhdGV3YXkgYWNjZXNzIGNhbiBiZSBkb25lIGF1dG9tYXRpY2FsbHkgZm9yIHlvdSB2aWEKICAgdGhlICJQcm94eS9HYXRld2F5IiBzZXR0aW5nIGluIFNTVk5DLiBBbmQgdW5kZXIgdGhlICJSZW1vdGUgU1NICiAgIENvbW1hbmQiIHNldHRpbmcgeW91IGNhbiBlbnRlciB0aGUgeDExdm5jIC1sb2NhbGhvc3QgLWRpc3BsYXkgOjAuCgogICBIb3N0LUxldmVsLUZpcmV3YWxsczogZXZlbiB3aXRoIHRoZSBoYXJkd2FyZSBGaXJld2FsbC9Sb3V0ZXIgcHJvYmxlbQogICBzb2x2ZWQgdmlhIGEgcG9ydCByZWRpcmVjdGlvbiwgbW9zdCBQQyBzeXN0ZW1zIGhhdmUgdGhlaXIgb3duIEhvc3QKICAgbGV2ZWwgImZpcmV3YWxscyIgZW5hYmxlZCB0byBwcm90ZWN0IHVzZXJzIGZyb20gdGhlbXNlbHZlcy4gSS5lLiB0aGUKICAgc3lzdGVtIGl0c2VsZiBibG9ja3MgYWxsIGluY29taW5nIGNvbm5lY3Rpb25zLiBTbyB5b3Ugd2lsbCBuZWVkIHRvIHNlZQogICB3aGF0IGlzIG5lZWRlZCB0byBjb25maWd1cmUgaXQgdG8gYWxsb3cgaW4gdGhlIHBvcnQgKGUuZy4gMjIpIHRoYXQgeW91CiAgIGRlc2lyZS4gRS5nLiBZYXN0LCBGaXJlc3RhcnRlciwgaXB0YWJsZXMoMSksIGV0Yy4uCgogICBWTkMgUG9ydHMgYW5kIEZpcmV3YWxsczogVGhlIGFib3ZlIGRpc2N1c3Npb24gd2FzIGZvciBjb25maWd1cmluZyB0aGUKICAgRmlyZXdhbGwvUm91dGVyIHRvIGxldCBpbiBwb3J0IDIyIChTU0gpLCBidXQgdGhlIHNhbWUgdGhpbmcgY2FuIGJlCiAgIGRvbmUgZm9yIHRoZSBkZWZhdWx0IFZOQyBwb3J0IDU5MDA6CiAgUG9ydCA1OTAwIC0+IDE5Mi4xNjguMS4zLCBQb3J0IDU5MDAgKFZOQykKICBQb3J0IDU5MDEgLT4gMTkyLjE2OC4xLjQsIFBvcnQgNTkwMCAoVk5DKQoKICAgKHdoZXJlIDE5Mi4xNjguMS4zIGlzICJqaWxscy1wYyIgYW5kIDE5Mi4xNjguMS40IGlzICJmcmVkcy1wYyIuKSBUaGlzCiAgIGNvdWxkIGJlIHVzZWQgZm9yIG5vcm1hbCwgdW5lbmNyeXB0ZWQgY29ubmVjdGlvbnMgYW5kIGFsc28gZm9yIFNTTAogICBlbmNyeXB0ZWQgb25lcy4KCiAgIFRoZSBWTkMgZGlzcGxheXMgdG8gZW50ZXIgaW4gdGhlIFZOQyB2aWV3ZXIgd291bGQgYmUsIHNheSwKICAgImZhci1hd2F5LmVhc3Q6MCIgdG8gcmVhY2ggamlsbHMtcGMgYW5kICJmYXItYXdheS5lYXN0OjEiIHRvIHJlYWNoCiAgIGZyZWRzLXBjLiBXZSBhc3N1bWUgYWJvdmUgdGhhdCB4MTF2bmMgaXMgdXNpbmcgcG9ydCA1OTAwIChhbmQgYW55CiAgIEhvc3QtTGV2ZWwtZmlyZXdhbGxzIG9uIGppbGxzLXBjIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gbGV0IHRoYXQgcG9ydAogICBpbi4pIFVzZSB0aGUgIi1yZmJwb3J0IiBvcHRpb24gdG8gdGVsbCB3aGljaCBwb3J0IHgxMXZuYyBzaG91bGQgbGlzdGVuCiAgIG9uLgoKICAgRm9yIGEgaG9tZSBzeXN0ZW0gb25lIGxpa2VseSBkb2VzIG5vdCBoYXZlIGEgaG9zdG5hbWUgYW5kIHdvdWxkIGhhdmUKICAgdG8gdXNlIHRoZSBJUCBhZGRyZXNzLCBzYXksICIyNC41Ni43OC45MzowIi4gRS5nLjoKICB2bmN2aWV3ZXIgMjQuNTYuNzguOTM6MAoKICAgWW91IG1heSB3YW50IHRvIGNob29zZSBhIG1vcmUgb2JzY3VyZSBwb3J0IG9uIHRoZSByb3V0ZXIgc2lkZSwgZS5nLgogICA1OTQ0LCB0byBhdm9pZCBhIGxvdCBvZiBwb3J0IHNjYW5zIGZpbmRpbmcgeW91ciBWTkMgc2VydmVyLiBGb3IgNTk0NAogICB5b3Ugd291bGQgdGVsbCB0aGUgdmlld2VyIHRvIHVzZToKICB2bmN2aWV3ZXIgMjQuNTYuNzguOTM6NDQKCiAgIFRoZSBJUCBhZGRyZXNzIHdvdWxkIG5lZWQgdG8gYmUgY29tbXVuaWNhdGVkIHRvIHRoZSBwZXJzb24gcnVubmluZyB0aGUKICAgVk5DIFZpZXdlci4gVGhlIHNpdGUgaHR0cDovL3d3dy53aGF0aXNteWlwLmNvbS8gY2FuIGhlbHAgaGVyZS4KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFNjcmlwdHMgdG8gYXV0b21hdGUgc3NoIHR1bm5lbGluZzogQXMgZGlzY3Vzc2VkIGJlbG93LCB0aGVyZSBtYXkgYmUKICAgc29tZSBwcm9ibGVtcyB3aXRoIHBvcnQgNTkwMCBiZWluZyBhdmFpbGFibGUuIElmIHRoYXQgaGFwcGVucywgdGhlCiAgIGFib3ZlIHBvcnQgYW5kIGRpc3BsYXkgbnVtYmVycyBtYXkgY2hhbmdlIGEgYml0IChlLmcuIC0+IDU5MDEgYW5kIDoxKS4KICAgSG93ZXZlciwgaWYgeW91ICJrbm93IiBwb3J0IDU5MDAgd2lsbCBiZSBmcmVlIG9uIHRoZSBsb2NhbCBhbmQgcmVtb3RlCiAgIG1hY2hpbmVzLCB5b3UgY2FuIGVhc2lseSBhdXRvbWF0ZSB0aGUgYWJvdmUgdHdvIHN0ZXBzIGJ5IHVzaW5nIHRoZQogICB4MTF2bmMgb3B0aW9uIC1iZyAoZm9ya3MgaW50byBiYWNrZ3JvdW5kIGFmdGVyIGNvbm5lY3Rpb24gdG8gdGhlCiAgIGRpc3BsYXkgaXMgc2V0IHVwKSBvciB1c2luZyB0aGUgLWYgb3B0aW9uIG9mIHNzaC4gU29tZSBleGFtcGxlIHNjcmlwdHMKICAgYXJlIHNob3duIGJlbG93LiBGZWVsIGZyZWUgdG8gdHJ5IHRoZSBzc2ggLUMgdG8gZW5hYmxlIGl0cyBjb21wcmVzc2lvbgogICBhbmQgc2VlIGlmIHRoYXQgc3BlZWRzIHRoaW5ncyB1cCBub3RpY2VhYmx5LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAjMS4gQSBzaW1wbGUgZXhhbXBsZSBzY3JpcHQsIGFzc3VtaW5nIG5vIHByb2JsZW1zIHdpdGggcG9ydCA1OTAwIGJlaW5nCiAgIHRha2VuIG9uIHRoZSBsb2NhbCBvciByZW1vdGUgc2lkZXMsIGxvb2tzIGxpa2U6CiMhL2Jpbi9zaAojIHVzYWdlOiB4MTF2bmNfc3NoIDxob3N0Pjo8eGRpc3BsYXk+CiMgIGUuZy46IHgxMXZuY19zc2ggc25vb3B5LnBlYW51dHMuY29tOjAKIyAgKHVzZXJAaG9zdDpOIGFsc28gd29ya3MpCgpob3N0PWBlY2hvICQxIHwgYXdrIC1GOiAne3ByaW50ICQxfSdgCmRpc3A9YGVjaG8gJDEgfCBhd2sgLUY6ICd7cHJpbnQgJDJ9J2AKaWYgWyAieCRkaXNwIiA9ICJ4IiBdOyB0aGVuIGRpc3A9MDsgZmkKCmNtZD0ieDExdm5jIC1kaXNwbGF5IDokZGlzcCAtbG9jYWxob3N0IC1yZmJhdXRoIC52bmMvcGFzc3dkIgplbmM9ImNvcHlyZWN0IHRpZ2h0IHpybGUgaGV4dGlsZSB6bGliIGNvcnJlIHJyZSByYXciCgpzc2ggLWYgLXQgLUwgNTkwMDpsb2NhbGhvc3Q6NTkwMCAkaG9zdCAiJGNtZCIKCmZvciBpIGluIDEgMiAzCmRvCiAgICAgICAgc2xlZXAgMgogICAgICAgIGlmIHZuY3ZpZXdlciAtZW5jb2RpbmdzICIkZW5jIiA6MDsgdGhlbiBicmVhazsgZmkKZG9uZQoKICAgU2VlIGFsc28gcngxMXZuYy5wbCBiZWxvdy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIzIuIEFub3RoZXIgbWV0aG9kIGlzIHRvIHN0YXJ0IHRoZSBWTkMgdmlld2VyIGluIGxpc3RlbiBtb2RlCiAgICJ2bmN2aWV3ZXIgLWxpc3RlbiIgYW5kIGhhdmUgeDExdm5jIGluaXRpYXRlIGEgcmV2ZXJzZSBjb25uZWN0aW9uCiAgIHVzaW5nIHRoZSAtY29ubmVjdCBvcHRpb246CiMhL2Jpbi9zaAojIHVzYWdlOiB4MTF2bmNfc3NoIDxob3N0Pjo8eGRpc3BsYXk+CiMgIGUuZy46IHgxMXZuY19zc2ggc25vb3B5LnBlYW51dHMuY29tOjAKIyAgKHVzZXJAaG9zdDpOIGFsc28gd29ya3MpCgpob3N0PWBlY2hvICQxIHwgYXdrIC1GOiAne3ByaW50ICQxfSdgCmRpc3A9YGVjaG8gJDEgfCBhd2sgLUY6ICd7cHJpbnQgJDJ9J2AKaWYgWyAieCRkaXNwIiA9ICJ4IiBdOyB0aGVuIGRpc3A9MDsgZmkKCmNtZD0ieDExdm5jIC1kaXNwbGF5IDokZGlzcCAtbG9jYWxob3N0IC1jb25uZWN0IGxvY2FsaG9zdCIgICAjIDw9PSBub3RlIG5ldyBvcHQKaW9uCmVuYz0iY29weXJlY3QgdGlnaHQgenJsZSBoZXh0aWxlIHpsaWIgY29ycmUgcnJlIHJhdyIKCnZuY3ZpZXdlciAtZW5jb2RpbmdzICIkZW5jIiAtbGlzdGVuICYKcGlkPSQhCnNzaCAtdCAtUiA1NTAwOmxvY2FsaG9zdDo1NTAwICRob3N0ICIkY21kIgpraWxsICRwaWQKCiAgIE5vdGUgdGhlIHVzZSBvZiB0aGUgc3NoIG9wdGlvbiAiLVIiIGluc3RlYWQgb2YgIi1MIiB0byBzZXQgdXAgYSByZW1vdGUKICAgcG9ydCByZWRpcmVjdGlvbi4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIzMuIEEgdGhpcmQgd2F5IGlzIHNwZWNpZmljIHRvIHRoZSBUaWdodFZOQyB2bmN2aWV3ZXIgc3BlY2lhbCBvcHRpb24KICAgLXZpYSBmb3IgZ2F0ZXdheXMuIFRoZSBvbmx5IHRyaWNreSBwYXJ0IGlzIHdlIG5lZWQgdG8gc3RhcnQgdXAgeDExdm5jCiAgIGFuZCBnaXZlIGl0IHNvbWUgdGltZSAoNSBzZWNvbmRzIGluIHRoaXMgZXhhbXBsZSkgdG8gc3RhcnQgbGlzdGVuaW5nCiAgIGZvciBjb25uZWN0aW9ucyAoc28gd2UgY2Fubm90IHVzZSB0aGUgVGlnaHRWTkMgZGVmYXVsdCBzZXR0aW5nIGZvcgogICBWTkNfVklBX0NNRCk6CiMhL2Jpbi9zaAojIHVzYWdlOiB4MTF2bmNfc3NoIDxob3N0Pjo8eGRpc3BsYXk+CiMgIGUuZy46IHgxMXZuY19zc2ggc25vb3B5LnBlYW51dHMuY29tOjAKCmhvc3Q9YGVjaG8gJDEgfCBhd2sgLUY6ICd7cHJpbnQgJDF9J2AKZGlzcD1gZWNobyAkMSB8IGF3ayAtRjogJ3twcmludCAkMn0nYAppZiBbICJ4JGRpc3AiID0gIngiIF07IHRoZW4gZGlzcD0wOyBmaQoKVk5DX1ZJQV9DTUQ9InNzaCAtZiAtdCAtTCAlTDolSDolUiAlRyB4MTF2bmMgLWxvY2FsaG9zdCAtcmZicG9ydCA1OTAwIC1kaXNwbGF5CjokZGlzcDsgc2xlZXAgNSIKZXhwb3J0IFZOQ19WSUFfQ01ECgp2bmN2aWV3ZXIgLXZpYSAkaG9zdCBsb2NhbGhvc3Q6MCAgICAgICMgbXVzdCBiZSBUaWdodFZOQyB2bmN2aWV3ZXIuCgogICBPZiBjb3Vyc2UgaWYgeW91IGFscmVhZHkgaGF2ZSB0aGUgeDExdm5jIHJ1bm5pbmcgd2FpdGluZyBmb3IKICAgY29ubmVjdGlvbnMgKG9yIGhhdmUgaXQgc3RhcnRlZCBvdXQgb2YgaW5ldGQoOCkpLCB5b3UgY2FuIHNpbXBseSB1c2UKICAgdGhlIFRpZ2h0Vk5DICJ2bmN2aWV3ZXIgLXZpYSBnYXRld2F5IGhvc3Q6cG9ydCIgaW4gaXRzIGRlZmF1bHQgbW9kZSB0bwogICBwcm92aWRlIHNlY3VyZSBzc2ggdHVubmVsbGluZy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKCgogICBWTkMgcGFzc3dvcmQgZmlsZTogQWxzbyBub3RlIGluIHRoZSAjMS4gZXhhbXBsZSBzY3JpcHQgdGhhdCB0aGUgb3B0aW9uCiAgICItcmZiYXV0aCAudm5jL3Bhc3N3ZCIgcHJvdmlkZXMgYWRkaXRpb25hbCBwcm90ZWN0aW9uIGJ5IHJlcXVpcmluZyBhCiAgIFZOQyBwYXNzd29yZCBmb3IgZXZlcnkgVk5DIHZpZXdlciB0aGF0IGNvbm5lY3RzLiBUaGUgdm5jcGFzc3dkIG9yCiAgIHN0b3JlcGFzc3dkIHByb2dyYW1zLCBvciB0aGUgeDExdm5jIC1zdG9yZXBhc3N3ZCBvcHRpb24gY2FuIGJlIHVzZWQgdG8KICAgY3JlYXRlIHRoZSBwYXNzd29yZCBmaWxlLiB4MTF2bmMgYWxzbyBoYXMgdGhlIHNsaWdodGx5IGxlc3Mgc2VjdXJlCiAgIC1wYXNzd2RmaWxlIGFuZCAiLXBhc3N3ZCBYWFhYWCIgb3B0aW9ucyB0byBzcGVjaWZ5IHBhc3N3b3Jkcy4KCiAgIFZlcnkgSW1wb3J0YW50OiBJdCBpcyB1cCB0byBZT1UgdG8gdGVsbCB4MTF2bmMgdG8gdXNlIHBhc3N3b3JkCiAgIHByb3RlY3Rpb24gKC1yZmJhdXRoIG9yIC1wYXNzd2RmaWxlKSwgaXQgd2lsbCBOT1QgZG8gaXQgZm9yIHlvdQogICBhdXRvbWF0aWNhbGx5IG9yIGZvcmNlIHlvdSB0byAodXNlIC11c2VwdyBpZiB5b3Ugd2FudCB0byBiZSBmb3JjZWQKICAgdG8uKSBUaGUgc2FtZSBnb2VzIGZvciBlbmNyeXB0aW5nIHRoZSBjaGFubmVsIGJldHdlZW4gdGhlIHZpZXdlciBhbmQKICAgeDExdm5jOiBpdCBpcyB1cCB0byB5b3UgdG8gdXNlIHNzaCwgc3R1bm5lbCwgLXNzbCBtb2RlLCBhIFZQTiwgZXRjLgogICAodXNlIHRoZSBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKSBHVUkgaWYgeW91IHdhbnQgdG8gYmUgZm9yY2VkCiAgIHRvIHVzZSBTU0wgb3IgU1NILikgRm9yIGFkZGl0aW9uYWwgc2FmZXR5LCBhbHNvIGxvb2sgaW50byB0aGUgLWFsbG93CiAgIGFuZCAtbG9jYWxob3N0IG9wdGlvbnMgYW5kIGJ1aWxkaW5nIHgxMXZuYyB3aXRoIHRjcF93cmFwcGVycyBzdXBwb3J0CiAgIHRvIGxpbWl0IGhvc3QgYWNjZXNzLgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIFR1bm5lbGxpbmcgeDExdm5jIHZpYSBTU0wvVExTOgoKICAgT25lIGNhbiBhbHNvIGVuY3J5cHQgdGhlIFZOQyB0cmFmZmljIHVzaW5nIGFuIFNTTC9UTFMgdHVubmVsIHN1Y2ggYXMKICAgc3R1bm5lbC5taXJ0Lm5ldCAoYWxzbyBzdHVubmVsLm9yZykgb3IgdXNpbmcgdGhlIGJ1aWx0LWluIChNYXIvMjAwNikKICAgLXNzbCBvcGVuc3NsIG1vZGUuIEEgU1NMLWVuYWJsZWQgSmF2YSBhcHBsZXQgVk5DIFZpZXdlciBpcyBhbHNvCiAgIHByb3ZpZGVkIGluIHRoZSB4MTF2bmMgcGFja2FnZSAoYW5kIGh0dHBzIGNhbiBiZSB1c2VkIHRvIGRvd25sb2FkIGl0LikKCiAgIEFsdGhvdWdoIG5vdCBhcyB1YmlxdWl0b3VzIGFzIHNzaCwgU1NMIHR1bm5lbGxpbmcgc3RpbGwgcHJvdmlkZXMgYQogICB1c2VmdWwgYWx0ZXJuYXRpdmUuIFNlZSB0aGlzIEZBUSBvbiAtc3NsIGFuZCAtc3R1bm5lbCBtb2RlcyBmb3IKICAgZGV0YWlscyBhbmQgZXhhbXBsZXMuCgogICBUaGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgYnVuZGxlcyBjb250YWluIHNvbWUgY29udmVuaWVudAogICB1dGlsaXRpZXMgdG8gYXV0b21hdGljYWxseSBzZXQgdXAgYW4gU1NMIHR1bm5lbCBmcm9tIHRoZSB2aWV3ZXItc2lkZQogICAoaS5lLiB0byBjb25uZWN0IHRvICJ4MTF2bmMgLXNzbCAuLi4iLikgQW5kIG1hbnkgb3RoZXIgZW5oYW5jZW1lbnRzCiAgIHRvby4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIERvd25sb2FkaW5nIHgxMXZuYzoKCiAgIHgxMXZuYyBpcyBhIGNvbnRyaWJ1dGVkIHByb2dyYW0gdG8gdGhlIExpYlZOQ1NlcnZlciBwcm9qZWN0IGF0CiAgIFNvdXJjZUZvcmdlLm5ldC4gSSB1c2UgbGlidm5jc2VydmVyIGZvciBhbGwgb2YgdGhlIFZOQyBhc3BlY3RzOyBJCiAgIGNvdWxkbid0IGhhdmUgZG9uZSB3aXRob3V0IGl0LiBUaGUgZnVsbCBzb3VyY2UgY29kZSBtYXkgYmUgZm91bmQgYW5kCiAgIGRvd25sb2FkZWQgKGVpdGhlciBmaWxlLXJlbGVhc2UgdGFyYmFsbCBvciBHSVQgdHJlZSkgZnJvbSB0aGUgYWJvdmUKICAgbGluay4gQXMgb2YgU2VwIDIwMTAsIHRoZSB4MTF2bmMtMC45LjEyLnRhci5neiBzb3VyY2UgcGFja2FnZSBpcwogICByZWxlYXNlZCAocmVjb21tZW5kZWQgZG93bmxvYWQpLiBUaGUgeDExdm5jIDAuOS4xMiByZWxlYXNlIG5vdGVzLgoKICAgVGhlIHgxMXZuYyBwYWNrYWdlIGlzIHRoZSBzdWJzZXQgb2YgdGhlIGxpYnZuY3NlcnZlciBwYWNrYWdlIG5lZWRlZCB0bwogICBidWlsZCB0aGUgeDExdm5jIHByb2dyYW0uIEFsc28sIHlvdSBjYW4gZ2V0IGEgY29weSBvZiBteSBsYXRlc3QsCiAgIGJsZWVkaW5nIGVkZ2UgeDExdm5jLTAuOS4xMy1kZXYudGFyLmd6IHRhcmJhbGwgdG8gYnVpbGQgdGhlIG1vc3QgdXAgdG8KICAgZGF0ZSBvbmUuCgogICBQcmVjb21waWxlZCBCaW5hcmllcy9QYWNrYWdlczogIFNlZSB0aGUgRkFRIGJlbG93IGZvciBpbmZvcm1hdGlvbgogICBhYm91dCB3aGVyZSB5b3UgbWlnaHQgb2J0YWluIGEgcHJlY29tcGlsZWQgeDExdm5jIGJpbmFyeSBmcm9tIDNyZAogICBwYXJ0aWVzIGFuZCBzb21lIG9uZXMgSSBjcmVhdGUuCgogICBWTkMgVmlld2VyczogIFRvIG9idGFpbiBWTkMgdmlld2VycyBmb3IgdGhlIHZpZXdpbmcgc2lkZSAoV2luZG93cywgTWFjCiAgIE9TLCBvciBVbml4KSB0cnkgdGhlc2UgbGlua3M6CiAgICAgKiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS9kb3dubG9hZC5odG1sCiAgICAgKiBodHRwOi8vd3d3LnJlYWx2bmMuY29tL2Rvd25sb2FkLWZyZWUuaHRtbAogICAgICogaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9jb3R2bmMvCiAgICAgKiBodHRwOi8vd3d3LnVsdHJhdm5jLmNvbS8KICAgICAqIE91ciBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKQoKICAgICAgIFtzc3ZuYy5naWZdCgoKICAgTW9yZSB0b29sczogSGVyZSBpcyBhIHNzaC9yc2ggd3JhcHBlciBzY3JpcHQgcngxMXZuYyB0aGF0IGF0dGVtcHRzIHRvCiAgIGF1dG9tYXRpY2FsbHkgZG8gdGhlIGFib3ZlIFN0ZXBzIDEtMyBmb3IgeW91IChwcm92aWRlZCB5b3UgaGF2ZQogICBzc2gvcnNoIGxvZ2luIHBlcm1pc3Npb24gb24gdGhlIG1hY2hpbmUgeDExdm5jIGlzIHRvIGJlIHJ1biBvbi4pIFRoZQogICBhYm92ZSBleGFtcGxlIHdvdWxkIGJlOiAicngxMXZuYyBmYXItYXdheS5lYXN0OjAiIHR5cGVkIGludG8gYSBzaGVsbAogICBvbiBzaXR0aW5nLWhlcmUud2VzdC4gQWxzbyBpbmNsdWRlZCBpcyBhbiBleHBlcmltZW50YWwgc2NyaXB0CiAgIHJ4MTF2bmMucGwgdGhhdCBhdHRlbXB0cyB0byB0dW5uZWwgdGhlIHZuYyB0cmFmZmljIHRocm91Z2ggYW4gc3NoIHBvcnQKICAgcmVkaXJlY3Rpb24gKGFuZCBkb2VzIG5vdCBhc3N1bWUgcG9ydCA1OTAwIGlzIGZyZWUuKSBIYXZlIGEgbG9vayBhdAogICB0aGVtIHRvIHNlZSB3aGF0IHRoZXkgZG8gYW5kIGN1c3RvbWl6ZSBhcyBuZWVkZWQ6CiAgICAgKiByeDExdm5jIHdyYXBwZXIgc2NyaXB0CiAgICAgKiByeDExdm5jLnBsIHdyYXBwZXIgc2NyaXB0IHRvIHR1bm5lbCB0cmFmZmljIHRocnUgc3NoCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgQnVpbGRpbmcgeDExdm5jOgoKICAgTWFrZSBzdXJlIHlvdSBoYXZlIGFsbCB0aGUgbmVlZGVkIGJ1aWxkL2NvbXBpbGUvZGV2ZWxvcG1lbnQgcGFja2FnZXMKICAgaW5zdGFsbGVkIChlLmcuIExpbnV4IGRpc3RyaWJ1dGlvbnMgZm9vbGlzaGx5IGRvbid0IGluc3RhbGwgdGhlbSBieQogICBkZWZhdWx0LikgU2VlIHRoaXMgYnVpbGQgRkFRIGZvciBtb3JlIGRldGFpbHMuCgogICBJZiB5b3VyIE9TIGhhcyBsaWJqcGVnLnNvIGFuZCBsaWJ6LnNvIGluIHN0YW5kYXJkIGxvY2F0aW9ucyB5b3UgY2FuCiAgIGJ1aWxkIGFzIGZvbGxvd3MgKGV4YW1wbGUgZ2l2ZW4gZm9yIHRoZSAwLjkuMTIgcmVsZWFzZSBvZiB4MTF2bmM6CiAgIHJlcGxhY2Ugd2l0aCB0aGUgdmVyc2lvbiB5b3UgZG93bmxvYWRlZCk6Cih1bi10YXIgdGhlIHgxMXZuYytsaWJ2bmNzZXJ2ZXIgdGFyYmFsbCkKIyBnemlwIC1kYyB4MTF2bmMtMC45LjEyLnRhci5neiB8IHRhciAteHZmIC0KCihjZCB0byB0aGUgc291cmNlIGRpcmVjdG9yeSkKIyBjZCB4MTF2bmMtMC45LjEyCgoocnVuIGNvbmZpZ3VyZSBhbmQgdGhlbiBydW4gbWFrZSkKIyAuL2NvbmZpZ3VyZQojIG1ha2UKCihpZiBhbGwgd2VudCBPSywgY29weSB4MTF2bmMgdG8gdGhlIGRlc2lyZWQgZGVzdGluYXRpb24sIGUuZy4gJEhPTUUvYmluKQojIGNwIC4veDExdm5jL3gxMXZuYyAkSE9NRS9iaW4KCiAgIE9yIGRvIG1ha2UgaW5zdGFsbCwgaXQgd2lsbCBwcm9iYWJseSBpbnN0YWxsIHRvIC91c3IvbG9jYWwvYmluIChydW4KICAgLi9jb25maWd1cmUgLS1oZWxwIGZvciBpbmZvcm1hdGlvbiBvbiBjdXN0b21pemluZyB5b3VyIGNvbmZpZ3VyYXRpb24sCiAgIGUuZy4gLS1wcmVmaXg9L215L3BsYWNlLikgWW91IGNhbiBub3cgcnVuIGl0IHZpYSB0eXBpbmcgIngxMXZuYyIsCiAgICJ4MTF2bmMgLWhlbHAgfCBtb3JlIiwgIngxMXZuYyAtZm9yZXZlciAtc2hhcmVkIC1kaXNwbGF5IDowIiwgZXRjLgoKCiAgIE5vdGU6IEN1cnJlbnRseSBnY2MgaXMgcmVjb21tZW5kZWQgdG8gYnVpbGQgbGlidm5jc2VydmVyLiBJbiBzb21lCiAgIGNhc2VzIGl0IHdpbGwgYnVpbGQgd2l0aCBub24tZ2NjIGNvbXBpbGVycywgYnV0IHRoZSByZXN1bHRpbmcgYmluYXJ5CiAgIHNvbWV0aW1lcyBmYWlscyB0byBydW4gcHJvcGVybHkuIEZvciBTb2xhcmlzIHByZS1idWlsdCBnY2MgYmluYXJpZXMKICAgYXJlIGF0IGh0dHA6Ly93d3cuc3VuZnJlZXdhcmUuY29tLy4gU29tZSBTb2xhcmlzIHByZS1idWlsdCB4MTF2bmMKICAgYmluYXJpZXMgYXJlIGhlcmUuCgogICBIb3dldmVyLCBvbmUgdXNlciByZXBvcnRzIGl0IGRvZXMgd29yayBmaW5lIHdoZW4gYnVpbHQgd2l0aCBTdW4gU3R1ZGlvCiAgIDEwLCBzbyBZTU1WLiBJbiBmYWN0LCBoZXJlIGlzIGEgbGl0dGxlIGJ1aWxkIHNjcmlwdCB0byBkbyB0aGlzIG9uCiAgIFNvbGFyaXMgMTA6CiMhL2Jpbi9zaApQQVRIPS91c3IvY2NzL2Jpbjovb3B0L1NVTldzcHJvL2JpbjokUEFUSDsgZXhwb3J0IFBBVEgKCkNDPSdjYycgXApDRkxBR1M9Jy14TzQnIFwKTERGTEFHUz0nLUwvdXNyL3Nmdy9saWIgLUwvdXNyL1gxMS9saWIgLVIvdXNyL3Nmdy9saWIgLVIvdXNyL1gxMS9saWInIFwKQ1BQRkxBR1M9Jy1JIC91c3Ivc2Z3L2luY2x1ZGUgLUkvdXNyL1gxMS9pbmNsdWRlJyBcCi4vY29uZmlndXJlCgpNQUtFPSJtYWtlIC1lIgpBTV9DRkxBR1M9IiIKZXhwb3J0IE1BS0UgQU1fQ0ZMQUdTCiRNQUtFCgogICBJbiBnZW5lcmFsIHlvdSBjYW4gdXNlIHRoZSAibWFrZSAtZSIgdHJpY2sgaWYgeW91IGRvbid0IGxpa2UKICAgbGlidm5jc2VydmVyJ3MgY2hvaWNlIG9mIEFNX0NGTEFHUy4gU2VlIHRoZSBidWlsZCBzY3JpcHRzIGJlbG93IGZvcgogICBtb3JlIGlkZWFzLiBTY3JpcHRzIHNpbWlsYXIgdG8gdGhlIGFib3ZlIGhhdmUgYmVlbiBzaG93biB0byB3b3JrIHdpdGgKICAgdmVuZG9yIEMgY29tcGlsZXJzIG9uIEhQLVVYIChjY29tOiBIUDkyNDUzLTAxKSBhbmQgVHJ1NjQgKENvbXBhcSBDCiAgIFY2LjUtMDExLikKCiAgIFlvdSBjYW4gZmluZCBpbmZvcm1hdGlvbiBvbiBNaXNjLiBCdWlsZCBwcm9ibGVtcyBoZXJlLgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgQnVpbGRpbmcgb24gU29sYXJpcywgRnJlZUJTRCwgZXRjOiAgIERlcGVuZGluZyBvbiB5b3VyIHZlcnNpb24gb2YKICAgU29sYXJpcyBvciBvdGhlciBVbml4IE9TIHRoZSBqcGVnIGFuZC9vciB6bGliIGxpYnJhcmllcyBtYXkgYmUgaW4KICAgbm9uLXN0YW5kYXJkIHBsYWNlcyAoZS5nLiAvdXNyL2xvY2FsLCAvdXNyL3NmdywgL29wdC9zZncsIGV0Yy4pCgogICBOb3RlOiBJZiBjb25maWd1cmUgY2Fubm90IGZpbmQgdGhlc2UgdHdvIGxpYnJhcmllcyB0aGVuIFRpZ2h0Vk5DIGFuZAogICBaUkxFIGVuY29kaW5nIHN1cHBvcnQgd2lsbCBiZSBkaXNhYmxlZCwgYW5kIHlvdSBkb24ndCB3YW50IHRoYXQhISEgVGhlCiAgIFRpZ2h0Vk5DIGVuY29kaW5nIGdpdmVzIHZlcnkgZ29vZCBjb21wcmVzc2lvbiBhbmQgcGVyZm9ybWFuY2UsIGl0IGV2ZW4KICAgbWFrZXMgYSBub3RpY2VhYmxlIGRpZmZlcmVuY2Ugb3ZlciBhIGZhc3QgTEFOLgoKCiAgIFNob3J0Y3V0czogT24gU29sYXJpcyAxMCB5b3UgY2FuIHBpY2sgdXAgYWxtb3N0IGV2ZXJ5dGhpbmcganVzdCBieQogICBpbnN1cmluZyB0aGF0IHlvdXIgUEFUSCBoYXMgL3Vzci9zZncvYmluIChmb3IgZ2NjKSBhbmQgL3Vzci9jY3MvYmluCiAgIChmb3Igb3RoZXIgYnVpbGQgdG9vbHMpLCBlLmcuOgogIGVudiBQQVRIPS91c3Ivc2Z3L2JpbjovdXNyL2Njcy9iaW46JFBBVEggc2ggLWMgJy4vY29uZmlndXJlOyBtYWtlJwoKICAgKFRoZSBvbmx5IHRoaW5nIHRoaXMgbWlzc2VzIGlzIC91c3IvWDExL2xpYi9saWJYcmFuZHIuc28uMiwgd2hpY2ggaXMKICAgZm9yIHRoZSBsaXR0bGUgdXNlZCAteHJhbmRyIG9wdGlvbiwgc2VlIHRoZSBzY3JpcHQgYmVsb3cgdG8gcGljayBpdCB1cAogICBhcyB3ZWxsLikKCgogICBsaWJqcGVnIGlzIGluY2x1ZGVkIGluIFNvbGFyaXMgOSBhbmQgbGF0ZXIgKC91c3Ivc2Z3L2luY2x1ZGUgYW5kCiAgIC91c3Ivc2Z3L2xpYiksIGFuZCB6bGliIGluIFNvbGFyaXMgOCBhbmQgbGF0ZXIgKC91c3IvaW5jbHVkZSBhbmQKICAgL3Vzci9saWIuKSBTbyBvbiBTb2xhcmlzIDkgeW91IGNhbiBwaWNrIHVwIGV2ZXJ5dGhpbmcgd2l0aCBzb21ldGhpbmcKICAgbGlrZSB0aGlzOgogIGVudiBQQVRIPS91c3IvbG9jYWwvYmluOi91c3IvY2NzL2JpbjokUEFUSCBzaCAtYyAnLi9jb25maWd1cmUgLS13aXRoLWpwZWc9L3VzCnIvc2Z3OyBtYWtlJwoKICAgYXNzdW1pbmcgeW91ciBnY2MgaXMgaW4gL3Vzci9sb2NhbC9iaW4gYW5kIHgxMXZuYyAwLjcuMSBvciBsYXRlci4KICAgVGhlc2UgYXJlIGdldHRpbmcgcHJldHR5IGxvbmcsIHNlZSB0aG9zZSBhc3NpZ25tZW50cyBzcGxpdCB1cCBpbiB0aGUKICAgYnVpbGQgc2NyaXB0IGJlbG93LgoKCiAgIElmIHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUgdGhlc2UgbGlicmFyaWVzIGF0IGFsbCB5b3UgY2FuIGdldCB0aGUKICAgc291cmNlIGZvciB0aGUgbGlicmFyaWVzIHRvIGJ1aWxkIHRoZW06IGxpYmpwZWcgaXMgYXZhaWxhYmxlIGF0CiAgIGZ0cDovL2Z0cC51dS5uZXQvZ3JhcGhpY3MvanBlZy8gYW5kIHpsaWIgYXQgaHR0cDovL3d3dy5nemlwLm9yZy96bGliLy4KICAgU2VlIGFsc28gaHR0cDovL3d3dy5zdW5mcmVld2FyZS5jb20vIGZvciBTb2xhcmlzIGJpbmFyeSBwYWNrYWdlcyBvZgogICB0aGVzZSBsaWJyYXJpZXMgYXMgd2VsbCBhcyBmb3IgZ2NjLiBOb3JtYWxseSB0aGV5IHdpbGwgaW5zdGFsbCBpbnRvCiAgIC91c3IvbG9jYWwgYnV0IHlvdSBjYW4gaW5zdGFsbCB0aGVtIGFueXdoZXJlIHdpdGggdGhlCiAgIC0tcHJlZml4PS9wYXRoL3RvL2FueXdoZXJlLCBldGMuCgoKICAgSGVyZSBpcyBhIGJ1aWxkIHNjcmlwdCB0aGF0IGluZGljYXRlcyBvbmUgd2F5IHRvIHBhc3MgdGhlIGxpYnJhcnkKICAgbG9jYXRpb25zIGluZm9ybWF0aW9uIHRvIHRoZSBsaWJ2bmNzZXJ2ZXIgY29uZmlndXJhdGlvbiB2aWEgdGhlCiAgIENQUEZMQUdTIGFuZCBMREZMQUdTIGVudmlyb25tZW50IHZhcmlhYmxlcy4KLS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tOAo8LS0tCiMhL2Jpbi9zaAoKIyBCdWlsZCBzY3JpcHQgZm9yIFNvbGFyaXMsIGV0Yywgd2l0aCBnY2MsIGxpYmpwZWcgYW5kIGxpYnogaW4KIyBub24tc3RhbmRhcmQgbG9jYXRpb25zLgoKIyBzZXQgdG8gZ2V0IHlvdXIgZ2NjLCBldGM6CiMKUEFUSD0vcGF0aC90by9nY2MvYmluOi91c3IvY2NzL2JpbjovdXNyL3Nmdy9iaW46JFBBVEgKCkpQRUc9L3BhdGgvdG8vanBlZyAgICAgICMgc2V0IHRvIG1heWJlICIvdXNyL2xvY2FsIiwgIi91c3Ivc2Z3Iiwgb3IgIi9vcHQvc2Z3IgpaTElCPS9wYXRoL3RvL3psaWIgICAgICAjIHNldCB0byBtYXliZSAiL3Vzci9sb2NhbCIsICIvdXNyL3NmdyIsIG9yICIvb3B0L3NmdyIKCiMgQmVsb3cgd2UgYXNzdW1lIGhlYWRlcnMgaW4gJEpQRUcvaW5jbHVkZSBhbmQgJFpMSUIvaW5jbHVkZSBhbmQgdGhlCiMgc2hhcmVkIGxpYnJhcmllcyBhcmUgaW4gJEpQRUcvbGliIGFuZCAkWkxJQi9saWIuICBJZiB5b3VyIHNpdHVhdGlvbgojIGlzIGRpZmZlcmVudCBjaGFuZ2UgdGhlIGxvY2F0aW9ucyBpbiB0aGUgdHdvIGxpbmVzIGJlbG93LgojCkNQUEZMQUdTPSItSSAkSlBFRy9pbmNsdWRlIC1JICRaTElCL2luY2x1ZGUiCkxERkxBR1M9Ii1MJEpQRUcvbGliIC1SICRKUEVHL2xpYiAtTCRaTElCL2xpYiAtUiAkWkxJQi9saWIiCgojIFRoZXNlIHR3byBsaW5lcyBtYXkgbm90IGJlIG5lZWRlZCBvbiBtb3JlIHJlY2VudCBTb2xhcmlzIHJlbGVhc2VzOgojCkNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkgL3Vzci9vcGVud2luL2luY2x1ZGUiCkxERkxBR1M9IiRMREZMQUdTIC1ML3Vzci9vcGVud2luL2xpYiAtUiAvdXNyL29wZW53aW4vbGliIgoKIyBUaGVzZSBhcmUgZm9yIGxpYlhyYW5kci5zbyBvbiBTb2xhcmlzIDEwOgojCkNQUEZMQUdTPSIkQ1BQRkxBR1MgLUkgL3Vzci9YMTEvaW5jbHVkZSIKTERGTEFHUz0iJExERkxBR1MgLUwvdXNyL1gxMS9saWIgLVIgL3Vzci9YMTEvbGliIgoKIyBFdmVyeXRoaW5nIG5lZWRzIHRvIGJ1aWx0IHdpdGggX1JFRU5UUkFOVCBmb3IgdGhyZWFkIHNhZmUgZXJybm86CiMKQ1BQRkxBR1M9IiRDUFBGTEFHUyAtRF9SRUVOVFJBTlQiCgpleHBvcnQgUEFUSCBDUFBGTEFHUyBMREZMQUdTCgouL2NvbmZpZ3VyZQptYWtlCgpscyAtbCAuL3gxMXZuYy94MTF2bmMKCi0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTg8LS0tODwtLS04PC0tLTgKPC0tLQoKICAgVGhlbiBkbyBtYWtlIGluc3RhbGwgb3IgY29weSB0aGUgeDExdm5jIGJpbmFyeSB0byB5b3VyIGRlc2lyZWQKICAgZGVzdGluYXRpb24uCgogICBCVFcsIFRvIHJ1biBhIHNoZWxsIHNjcmlwdCwganVzdCBjdXQtYW5kLXBhc3RlIHRoZSBhYm92ZSBpbnRvIGEgZmlsZSwKICAgc2F5ICJteXNjcmlwdCIsIHRoZW4gbW9kaWZ5IHRoZSAiL3BhdGgvdG8vLi4uIiBpdGVtcyB0byBjb3JyZXNwb25kIHRvCiAgIHlvdXIgc3lzdGVtL2Vudmlyb25tZW50LCBhbmQgdGhlbiB0eXBlOiAic2ggbXlzY3JpcHQiIHRvIHJ1biBpdC4KCiAgIE5vdGUgdGhhdCBvbiBTb2xhcmlzIG1ha2UgaXMgL3Vzci9jY3MvYmluL21ha2UsIHNvIHRoYXQgaXMgd2h5IHRoZQogICBhYm92ZSBwdXRzIC91c3IvY2NzL2JpbiBpbiBQQVRILiBPdGhlciBpbXBvcnRhbnQgYnVpbGQgdXRpbGl0aWVzIGFyZQogICB0aGVyZSB0b286IGxkLCBhciwgZXRjLiBBbHNvLCBpdCBpcyBwcm9iYWJseSBhIGJhZCBpZGVhIHRvIGhhdmUKICAgL3Vzci91Y2IgaW4geW91ciBQQVRIIHdoaWxlIGJ1aWxkaW5nLgoKICAgU3RhcnRpbmcgd2l0aCB0aGUgMC43LjEgeDExdm5jIHJlbGVhc2UgdGhlICJjb25maWd1cmUgLS13aXRoLWpwZWc9RElSCiAgIC0td2l0aC16bGliPURJUiIgb3B0aW9ucyBhcmUgaGFuZHkgaWYgeW91IHdhbnQgdG8gYXZvaWQgbWFraW5nIGEKICAgc2NyaXB0LgoKICAgSWYgeW91IG5lZWQgdG8gbGluayBPcGVuU1NMIGxpYnNzbC5hIG9uIFNvbGFyaXMgc2VlIHRoaXMgbWV0aG9kLgoKICAgSWYgeW91IG5lZWQgdG8gYnVpbGQgb24gU29sYXJpcyAyLjUuMSBvciBlYXJsaWVyIG9yIG90aGVyIG9sZGVyIFVuaXgKICAgT1Mncywgc2VlIHRoaXMgd29ya2Fyb3VuZCBGQVEuCgoKICAgQnVpbGRpbmcgb24gRnJlZUJTRCwgT3BlbkJTRCwgLi4uOiAgIFRoZSBqcGVnIGxpYnJhcmllcyBzZWVtIHRvIGJlIGluCiAgIC91c3IvbG9jYWwgb3IgL3Vzci9wa2cgb24gdGhlc2UgT1Mncy4gWW91IHdvbid0IG5lZWQgdGhlIG9wZW53aW4gc3R1ZmYKICAgaW4gdGhlIGFib3ZlIHNjcmlwdCAoYnV0IHlvdSBtYXkgbmVlZCAvdXNyL1gxMVI2Ly4uLi4pIEFsc28gc3RhcnRpbmcKICAgd2l0aCB0aGUgMC43LjEgeDExdm5jIHJlbGVhc2UsIHRoaXMgdXN1YWxseSB3b3JrczoKICAuL2NvbmZpZ3VyZSAtLXdpdGgtanBlZz0vdXNyL2xvY2FsCiAgbWFrZQoKCiAgIEJ1aWxkaW5nIG9uIEhQLVVYOiAgIEZvciBqcGVnIGFuZCB6bGliIHlvdSB3aWxsIG5lZWQgdG8gZG8gdGhlIHNhbWUKICAgc29ydCBvZiB0aGluZyBhcyBkZXNjcmliZWQgYWJvdmUgZm9yIFNvbGFyaXMuIFlvdSBzZXQgQ1BQRkxBR1MgYW5kCiAgIExERkxBR1MgdG8gZmluZCB0aGVtIChzZWUgYmVsb3cgZm9yIGFuIGV4YW1wbGUuKSBZb3UgZG8gbm90IG5lZWQgdG8gZG8KICAgYW55IG9mIHRoZSBhYm92ZSAvdXNyL29wZW53aW4gc3R1ZmYuIEFsc28sIEhQLVVYIGRvZXMgbm90IHNlZW0gdG8KICAgc3VwcG9ydCAtUiwgc28gZ2V0IHJpZCBvZiB0aGUgLVIgaXRlbXMgaW4gTERGTEFHUy4gQmVjYXVzZSBvZiB0aGlzLCBhdAogICBydW50aW1lIHlvdSBtYXkgbmVlZCB0byBzZXQgTERfTElCUkFSWV9QQVRIIG9yIFNITElCX1BBVEggdG8gaW5kaWNhdGUKICAgdGhlIGRpcmVjdG9yeSBwYXRocyBzbyB0aGUgbGlicmFyaWVzIGNhbiBiZSBmb3VuZC4gSXQgaXMgYSBnb29kIGlkZWEKICAgdG8gaGF2ZSBzdGF0aWMgYXJjaGl2ZXMsIGUuZy4gbGliei5hIGFuZCBsaWJqcGVnLmEgZm9yIHRoZSBub25zdGFuZGFyZAogICBsaWJyYXJpZXMgc28gdGhhdCB0aGV5IGdldCBib2x0ZWQgaW50byB0aGUgeDExdm5jIGJpbmFyeSAoYW5kIHNvIHdvbid0CiAgIGdldCAibG9zdCIuKQoKICAgSGVyZSBpcyB3aGF0IHdlIHJlY2VudGx5IGRpZCB0byBidWlsZCB4MTF2bmMgMC43LjIgb24gSFAtVVggMTEuMTEKLi9jb25maWd1cmUgLS13aXRoLWpwZWc9JEhPTUUvaHB1eC9qcGVnIC0td2l0aC16bGliPSRIT01FL2hwdXgvemxpYgptYWtlCgogICBXaGVyZSB3ZSBoYWQgc3RhdGljIGFyY2hpdmVzIChsaWJqcGVnLmEsIGxpYnouYSkgb25seSBhbmQgaGVhZGVyIGZpbGVzCiAgIGluIHRoZSAkSE9NRS9ocHV4Ly4uLiBkaXJlY3RvcmllcyBhcyBkaXNjdXNzZWQgZm9yIHRoZSBidWlsZCBzY3JpcHQuCgogICBPbiBIUC1VWCAxMS4yMyBhbmQgMTEuMzEgd2UgaGF2ZSBoYWQgcHJvYmxlbXMgY29tcGlsaW5nIHdpdGggZ2NjLgogICAiL3Vzci9pbmNsdWRlL3JwYy9hdXRoLmg6ODc6IGVycm9yOiBmaWVsZCAnc3luY2FkZHInIGhhcyBpbmNvbXBsZXRlCiAgIHR5cGUiLiBBcyBhIHdvcmthcm91bmQgZm9yIHgxMXZuYyAwLjkuNCBhbmQgbGF0ZXIgc2V0IHlvdXIgQ1BQRkxBR1MgdG8KICAgaW5jbHVkZToKICBDUFBGTEFHUz0iLURJR05PUkVfR0VUU1BOQU0iCiAgZXhwb3J0IENQUEZMQUdTCgogICBUaGlzIGRpc2FibGVzIGEgdmVyeSByYXJlIHVzYWdlIG1vZGUgZm9yIC11bml4cHdfbmlzIGJ5IG5vdCB0cnlpbmcKICAgZ2V0c3BuYW0oMykuCgogICBVc2luZyBIUC1VWCdzIEMgY29tcGlsZXIgb24gMTEuMjMgYW5kIDExLjMxIHdlIGhhdmUgc29tZSBzZXZlcmUKICAgY29tcGlsZXIgZXJyb3JzIHRoYXQgaGF2ZSBub3QgYmVlbiB3b3JrZWQgYXJvdW5kIHlldC4gSWYgeW91IG5lZWQgdG8KICAgZG8gdGhpcywgY29udGFjdCBtZSBhbmQgSSB3aWxsIGdpdmUgeW91IGEgZHJhc3RpYyByZWNpcGUgdGhhdCB3aWxsCiAgIHByb2R1Y2UgYSB3b3JraW5nIGJpbmFyeS4KCgogICBCdWlsZGluZyBvbiBBSVg6ICAgQUlYOiBvbmUgdXNlciBoYWQgdG8gYWRkIHRoZSAiWDExLmFkdCIgcGFja2FnZSB0bwogICBBSVggNC4zLjMgYW5kIDUuMiB0byBnZXQgYnVpbGQgaGVhZGVyIGZpbGVzIGxpa2UgWFNobS5oLCBldGMuIFlvdSBtYXkKICAgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IC91c3IvbHBwL1gxMS9pbmNsdWRlLCBldGMgaXMgYmVpbmcgcGlja2VkCiAgIHVwIGJ5IHRoZSBjb25maWd1cmUgYW5kIG1ha2UuCgogICBGb3IgYSByZWNlbnQgYnVpbGQgb24gQUlYIDUuMyB3ZSBuZWVkZWQgdG8gYWRkIHRoZXNlIENGTEFHUyB0byBiZSBhYmxlCiAgIHRvIGJ1aWxkIHdpdGggZ2NjOgogIGVudiBDRkxBR1M9Jy1tYWl4NjQgLVhsaW5rZXIgLWJiaWd0b2MnIC4vY29uZmlndXJlIC4uLgoKICAgd2UgYWxzbyBidWlsdCBvdXIgb3duIGxpYmpwZWcgYW5kIGxpYnogdXNpbmcgLW1haXg2NC4KCiAgIEJUVywgb25lIHdheSB0byBydW4gYW4gWHZmYi1saWtlIHZpcnR1YWwgWCBzZXJ2ZXIgZm9yIHRlc3Rpbmcgb24gQUlYCiAgIGlzIHNvbWV0aGluZyBsaWtlICIvdXNyL2Jpbi9YMTEvWCAtZm9yY2UgLXZmYiAtYWMgOjEiLgoKCiAgIEJ1aWxkaW5nIG9uIE1hYyBPUyBYOiAgIFRoZXJlIGlzIG5vdyBuYXRpdmUgTWFjIE9TIFggc3VwcG9ydCBmb3IKICAgeDExdm5jIGJ5IHVzaW5nIHRoZSByYXcgZnJhbWVidWZmZXIgZmVhdHVyZS4gVGhpcyBtb2RlIGRvZXMgbm90IHVzZSBvcgogICBuZWVkIFgxMSBhdCBhbGwuIFRvIGJ1aWxkIHlvdSBtYXkgbmVlZCB0byBkaXNhYmxlIFgxMToKLi9jb25maWd1cmUgLS13aXRob3V0LXggLi4uCm1ha2UKCiAgIEhvd2V2ZXIsIGlmIHlvdXIgc3lzdGVtIGhhcyB0aGUgTWFjIE9TIFggYnVpbGQgcGFja2FnZSBmb3IgWDExIGFwcHMKICAgeW91IHdpbGwgbm90IG5lZWQgdG8gc3VwcGx5IHRoZSAiLS13aXRob3V0LXgiIG9wdGlvbiAoaW4gdGhpcyBjYXNlIHRoZQogICByZXN1bHRpbmcgeDExdm5jIHdvdWxkIGJlIGFibGUgdG8gZXhwb3J0IGJvdGggdGhlIG5hdGl2ZSBNYWMgT1MgWAogICBkaXNwbGF5IGFuZCB3aW5kb3dzIGRpc3BsYXllZCBpbiB0aGUgWERhcndpbiBYIHNlcnZlci4pIEJlIHN1cmUgdG8KICAgaW5jbHVkZSB0aGUgLi9jb25maWd1cmUgb3B0aW9uIHRvIGZpbmQgbGlianBlZyBvbiB5b3VyIHN5c3RlbS4KCgogICBPcGVuU1NMOiAgIFN0YXJ0aW5nIHdpdGggdmVyc2lvbiAwLjguMyB4MTF2bmMgY2FuIG5vdyBiZSBidWlsdCB3aXRoCiAgIFNTTC9UTFMgc3VwcG9ydC4gRm9yIHRoaXMgdG8gYmUgZW5hYmxlZCB0aGUgbGlic3NsLnNvIGxpYnJhcnkgbmVlZHMgdG8KICAgYmUgYXZhaWxhYmxlIGF0IGJ1aWxkIHRpbWUuIFNvIHlvdSBtYXkgbmVlZCB0byBoYXZlIGFkZGl0aW9uYWwKICAgQ1BQRkxBR1MgYW5kIExERkxBR1MgaXRlbXMgaWYgeW91ciBsaWJzc2wuc28gaXMgaW4gYSBub24tc3RhbmRhcmQKICAgcGxhY2UuIEFzIG9mIHgxMXZuYyAwLjkuNCB0aGVyZSBpcyBhbHNvIHRoZSAtLXdpdGgtc3NsPURJUiBjb25maWd1cmUKICAgb3B0aW9uLgoKICAgT24gU29sYXJpcyB1c2luZyBzdGF0aWMgYXJjaGl2ZXMgbGlic3NsLmEgYW5kIGxpYmNyeXB0by5hIGluc3RlYWQgb2YKICAgLnNvIHNoYXJlZCBsaWJyYXJpZXMgKGUuZy4gZnJvbSB3d3cuc3VuZnJlZXdhcmUuY29tKSwgd2UgZm91bmQgd2UKICAgbmVlZGVkIHRvIGFsc28gc2V0IExERkxBR1MgYXMgZm9sbG93cyB0byBnZXQgdGhlIGNvbmZpZ3VyZSB0byB3b3JrOgplbnYgTERGTEFHUz0nLWxzb2NrZXQgLWxkbCcgLi9jb25maWd1cmUgLS13aXRoLXNzbD0vcGF0aC90by9vcGVuc3NsIC4uLgptYWtlCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICAgQmV0YSBUZXN0aW5nOgoKICAgSSBkb24ndCBoYXZlIGFueSBmb3JtYWwgYmV0YS10ZXN0ZXJzIGZvciB0aGUgcmVsZWFzZXMgb2YgeDExdm5jLCBzbwogICBJJ2QgYXBwcmVjaWF0ZSBhbnkgYWRkaXRpb25hbCB0ZXN0aW5nIHZlcnkgbXVjaC4KCiAgIFRoYW5rcyB0byB0aG9zZSB3aG8gc3VnZ2VzdGVkIGZlYXR1cmVzIGFuZCBoZWxwZWQgYmV0YSB0ZXN0IHgxMXZuYwogICAwLjkuMTIgcmVsZWFzZWQgaW4gU2VwIDIwMTAhCgogICBQbGVhc2UgaGVscCB0ZXN0IGFuZCBkZWJ1ZyB0aGUgMC45LjEzIHZlcnNpb24gZm9yIHJlbGVhc2Ugc29tZXRpbWUgaW4KICAgV2ludGVyIDIwMTAuCgogICBUaGUgdmVyc2lvbiAwLjkuMTMgYmV0YSB0YXJiYWxsIGlzIGtlcHQgaGVyZToKICAgeDExdm5jLTAuOS4xMy1kZXYudGFyLmd6CgogICBUaGVyZSBhcmUgYWxzbyBzb21lIExpbnV4LCBTb2xhcmlzLCBNYWMgT1MgWCwgYW5kIG90aGVyIE9TIHRlc3QKICAgYmluYXJpZXMgaGVyZS4gUGxlYXNlIGtpY2sgdGhlIHRpcmVzIGFuZCByZXBvcnQgYnVncywgcGVyZm9ybWFuY2UKICAgcmVncmVzc2lvbnMsIHVuZGVzaXJlZCBiZWhhdmlvciwgZXRjLiB0byBtZS4KCiAgIFRvIGFpZCB0ZXN0aW5nIG9mIHRoZSBidWlsdC1pbiBTU0wvVExTIHN1cHBvcnQgZm9yIHgxMXZuYywgYSBudW1iZXIgb2YKICAgVk5DIFZpZXdlciBwYWNrYWdlcyBmb3IgVW5peCwgTWFjIE9TIFgsIGFuZCBXaW5kb3dzIGhhdmUgYmVlbiBjcmVhdGVkCiAgIHRoYXQgcHJvdmlkZSBTU0wgU3VwcG9ydCBmb3IgdGhlIFRpZ2h0Vk5DIFZpZXdlciAodGhpcyBpcyBkb25lIGJ5CiAgIHdyYXBwZXIgc2NyaXB0cyBhbmQgYSBHVUkgdGhhdCBzdGFydHMgU1RVTk5FTC4pIEl0IHNob3VsZCBiZSBwcmV0dHkKICAgY29udmVuaWVudCBmb3IgYXV0b21hdGljIFNTTCBhbmQgU1NIIGNvbm5lY3Rpb25zLiBJdCBpcyBkZXNjcmliZWQgaW4KICAgZGV0YWlsIGF0IGFuZCBjYW4gYmUgZG93bmxvYWRlZCBmcm9tIHRoZSBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIKICAgKFNTVk5DKSBwYWdlLiBUaGUgU1NWTkMgVW5peCB2aWV3ZXIgYWxzbyBzdXBwb3J0cyB4MTF2bmMncyBzeW1tZXRyaWMKICAga2V5IGVuY3J5cHRpb24gY2lwaGVycyAoc2VlIHRoZSAnVWx0cmFWTkMgRFNNIEVuY3J5cHRpb24gUGx1Z2luJwogICBzZXR0aW5ncyBwYW5lbC4pCgoKICAgSGVyZSBhcmUgc29tZSBmZWF0dXJlcyB0aGF0IHdpbGwgYXBwZWFyIGluIHRoZSAwLjkuMTMgcmVsZWFzZToKICAgICAqIEltcHJvdmVkIHN1cHBvcnQgZm9yIG5vbi1YMTEgdG91Y2hzY3JlZW4gZGV2aWNlcyAoZS5nLiBoYW5kaGVsZCBvcgogICAgICAgY2VsbCBwaG9uZSkgdmlhIExpbnV4IHVpbnB1dCBpbnB1dCBpbmplY3Rpb24uIEFkZGl0aW9uYWwgdHVuaW5nCiAgICAgICBwYXJhbWV0ZXJzIGFyZSBhZGRlZC4gVFNMSUIgdG91Y2hzY3JlZW4gY2FsaWJyYXRpb24gaXMgc3VwcG9ydGVkLgogICAgICAgVGVzdGVkIG9uIFF0bW9rbyBOZW8gRnJlZXJ1bm5lci4gQSB0b29sLCBtaXNjL3VpbnB1dC5wbCwgaXMKICAgICAgIHByb3ZpZGVkIHRvIGRpYWdub3NlIHVpbnB1dCBiZWhhdmlvciBvbiBuZXcgZGV2aWNlcy4gVGhlIGVudi4KICAgICAgIHZhcnMuIFgxMVZOQ19VSU5QVVRfQlVTIGFuZCBYMTFWTkNfVUlOUFVUX1ZFUlNJT04gYXJlIGF2YWlsYWJsZSBpZgogICAgICAgbGVhdmluZyB0aGVtIHVuc2V0IGRvZXMgbm90IHdvcmsuCiAgICAgKiBUaGUgTGludXggdWlucHV0IG5vbi1YMTEgaW5wdXQgaW5qZWN0aW9uIGNhbiBub3cgYmUgYnlwYXNzZWQ6CiAgICAgICBldmVudHMgY2FuIGJlIGRpcmVjdGx5IHdyaXR0ZW4gdG8gdGhlIC9kZXYvaW5wdXQvZXZlbnQgZGV2aWNlcwogICAgICAgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIChkaXJlY3RfYWJzPS4uLiwgZXRjLikgQSAtcGlwZWlucHV0IGlucHV0CiAgICAgICBpbmplY3Rpb24gaGVscGVyIHNjcmlwdCwgbWlzYy9xdF90c2xpYl9pbmplY3QucGwgaXMgcHJvdmlkZWQgYXMgYQogICAgICAgdHdlYWthYmxlIG5vbi1idWlsdGluIGRpcmVjdCBpbnB1dCBpbmplY3Rpb24gbWV0aG9kLgogICAgICogVGhlIGxpc3Qgb2YgbmV3IHVpbnB1dCBwYXJhbWV0ZXJzIGZvciB0aGUgYWJvdmUgdHdvIGZlYXR1cmVzIGlzOgogICAgICAgcHJlc3N1cmUsIHRzbGliX2NhbCwgdG91Y2hfYWx3YXlzLCBkcmFnc2tpcCwgYnRuX3RvdWNoOwogICAgICAgZGlyZWN0X3JlbCwgZGlyZWN0X2FicywgZGlyZWN0X2J0biwgZGlyZWN0X2tleS4KICAgICAqIFRoZSBNYWNPU1ggbmF0aXZlIHNlcnZlciBjYW4gbm93IHVzZSBPcGVuR0wgZm9yIHRoZSBzY3JlZW4KICAgICAgIGNhcHR1cmUuIEluIG5lYXJseSBhbGwgY2FzZXMgdGhpcyBpcyBmYXN0ZXIgdGhhbiB0aGUgcmF3CiAgICAgICBmcmFtZWJ1ZmZlciBjYXB0dXJlIG1ldGhvZC4gVGhlcmUgYXJlIGJ1aWxkIGFuZCBydW4gdGltZSBmbGFncywKICAgICAgIFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRCwgZXRjLiB0byBkaXNhYmxlIHVzZSBvZiBkZXByZWNhdGVkCiAgICAgICBpbnB1dCBpbmplY3Rpb24gYW5kIHNjcmVlbiBhY2Nlc3MgaW50ZXJmYWNlcy4gQ3Vyc29yIHNoYXBlIG5vdwogICAgICAgd29ya3MgZm9yIDY0Yml0IGJpbmFyaWVzLgogICAgICogVGhlIGluY2x1ZGVkIFNTTCBlbmFibGVkIEphdmEgVk5DIFZpZXdlcnMgbm93IGhhbmRsZSBNb3VzZSBXaGVlbAogICAgICAgZXZlbnRzLgogICAgICogbWlzY2VsbGFuZW91cyBuZXcgZmVhdHVyZXMgYW5kIGNoYW5nZXM6CiAgICAgKiBJbiAtcmVmbGVjdCBtb2RlLCB0aGUgbGlidm5jY2xpZW50IGNvbm5lY3Rpb24gY2FuIG5vdyBoYXZlIHRoZQogICAgICAgcGl4ZWwgZm9ybWF0IG1vZGlmaWVkIHZpYSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzCiAgICAgICBYMTFWTkNfUkVGTEVDVF9iaXRzUGVyU2FtcGxlLCBYMTFWTkNfUkVGTEVDVF9zYW1wbGVzUGVyUGl4ZWwsIGFuZAogICAgICAgWDExVk5DX1JFRkxFQ1RfYnl0ZXNQZXJQaXhlbAogICAgICogSW4gLWNyZWF0ZSBtb2RlIHRoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBhZGRlZCB0bwogICAgICAgZmluZSB0dW5lIHRoZSBiZWhhdmlvcjogRklORF9ESVNQTEFZX05PX0xTT0Y6IGRvIG5vdCB1c2UgbHNvZigxKQogICAgICAgdG8gdHJ5IHRvIGRldGVybWluZSB0aGUgTGludXggVlQsIEZJTkRfRElTUExBWV9OT19WVF9GSU5EOiBkbyBub3QKICAgICAgIHRyeSB0byBkZXRlcm1pbmUgdGhlIExpbnV4IFZUIGF0IGFsbCwgWDExVk5DX0NSRUFURV9MQ19BTExfQ19PSzoKICAgICAgIGRvIG5vdCBib3RoZXIgdW5kb2luZyB0aGUgc2V0dGluZyBMQ19BTEw9QyB0aGF0IHRoZSBjcmVhdGVfZGlzcGxheQogICAgICAgc2NyaXB0IHNldHMuIFRoZSBwZXJmb3JtYW5jZSBvZiB0aGUgLWNyZWF0ZSBzY3JpcHQgaGFzIGJlZW4KICAgICAgIGltcHJvdmVkIGZvciBsYXJnZSBpbnN0YWxsYXRpb25zICgxMDAncyBvZiB1c2VyIHNlc3Npb25zIG9uIG9uZQogICAgICAgbWFjaGluZS4pCiAgICAgKiBJbiAtdW5peHB3IG1vZGUsIG9uZSBjYW4gbm93IFRhYiBmcm9tIGxvZ2luOiB0byBQYXNzd29yZC4KICAgICAqIEFuIGVudmlyb25tZW50IHZhcmlhYmxlLCBYMTFWTkNfU0JfRkFDVE9SLCBhbGxvd3Mgb25lIHRvIHNjYWxlIHRoZQogICAgICAgLXNiIHNjcmVlbmJsYW5rIHNsZWVwIHRpbWUgZnJvbSB0aGUgZGVmYXVsdCAyIHNlY3MuCiAgICAgKiBBbiBleHBlcmltZW50YWwgb3B0aW9uIC11bml4c29jayBpcyBhdmFpbGFibGUgZm9yIHRlc3RpbmcuIE5vdGUsCiAgICAgICBob3dldmVyLCB0aGF0IGl0IHJlcXVpcmVzIGEgbWFudWFsIGNoYW5nZSB0bwogICAgICAgbGlidm5jc2VydmVyL3JmYnNlcnZlci5jIGZvciBpdCB0byB3b3JrLgogICAgICogRG9jdW1lbnRlZCB0aGF0IC1ncmFia2JkIGlzIG5vIGxvbmdlciB3b3JraW5nIHdpdGggc29tZS9tb3N0CiAgICAgICB3aW5kb3cgbWFuYWdlcnMgKGl0IGNhbiBwcmV2ZW50IHJlc2l6aW5nIGFuZCBtZW51IHBvc3RpbmcuKQoKCiAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcHBlYXJlZCBpbiB0aGUgMC45LjEyIHJlbGVhc2UgKFNlcC8yMDEwKToKICAgICAqIE9uZSBjYW4gbm93IHNwZWNpZnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIGRpc3BsYXlzIHRoYXQgY2FuIGJlCiAgICAgICBjcmVhdGVkIGluIC1jcmVhdGUgbW9kZSB2aWEgdGhlIGVudi4gdmFyLgogICAgICAgWDExVk5DX0NSRUFURV9NQVhfRElTUExBWVMKICAgICAqIFRoZSBYMTFWTkNfTk9fTElNSVRfU0hNIGVudi4gdmFyLiBpcyBhZGRlZCB0byBza2lwIGFueSBhdXRvbWF0aWMKICAgICAgIHNoYXJlZCBtZW1vcnkgcmVkdWN0aW9uLgogICAgICogVGhlIGtkbSBkaXNwbGF5IG1hbmFnZXIgaXMgbm93IGRldGVjdGVkIHdoZW4gdHJ5aW5nIG5vdCB0byBnZXQKICAgICAgIGtpbGxlZCBieSB0aGUgZGlzcGxheSBtYW5hZ2VyLgogICAgICogQSBjb21waWxlIHRpbWUgYnVnIGlzIGZpeGVkIHNvIHRoYXQgY29uZmlndXJpbmcgdXNpbmcKICAgICAgIC0td2l0aC1zeXN0ZW0tbGlidm5jc2VydmVyIHBvaW50aW5nIHRvIExpYlZOQ1NlcnZlciAwLjkuNyB3b3JrcwogICAgICAgYWdhaW4uIEEgYnVnIGZyb20gZm9yY2VkIHVzZSBvZiBYZGVmcy5oIGlzIHdvcmtlZCBhcm91bmQuCgoKICAgSGVyZSBhcmUgc29tZSBmZWF0dXJlcyB0aGF0IGFwcGVhcmVkIGluIHRoZSAwLjkuMTEgcmVsZWFzZSAoQXVnLzIwMTApOgogICAgICogVGhlIHNvdXJjZSB0cmVlIGlzIHN5bmNocm9uaXplZCB3aXRoIHRoZSBtb3N0IHJlY2VudCBsaWJ2bmNjbGllbnQKICAgICAgICh0aGlzIG9ubHkgYWZmZWN0cyAtcmVmbGVjdCBtb2RlLikgQnVpbGQgaXMgZml4ZWQgZm9yCiAgICAgICBpbmNvbXBhdGliaWxpdGllcyB3aGVuIHVzaW5nIGFuIGV4dGVybmFsIExpYlZOQ1NlcnZlciAoZS5nLgogICAgICAgLi9jb25maWd1cmUgLS13aXRoLXN5c3RlbS1saWJ2bmNzZXJ2ZXIuLi4pIFBsZWFzZSBoZWxwIHRlc3QgdGhlc2UKICAgICAgIGJ1aWxkIGFuZCBydW50aW1lIGFzcGVjdHMgYW5kIHJlcG9ydCBiYWNrIHdoYXQgeW91IGZpbmQsIHRoYW5rcy4KICAgICAqIFRoZSBTU0wgZW5hYmxlZCBKYXZhIFZOQyBWaWV3ZXIgTWFrZWZpbGUgaGFzIGJlZW4gbW9kaWZpZWQgc28gdGhhdAogICAgICAgdGhlIGphciBmaWxlcyB0aGF0IGFyZSBidWlsdCBhcmUgY29tcGF0aWJsZSBiYWNrIHRvIEphdmEgMS40LgogICAgICogSW4gLWNyZWF0ZS8tdW5peHB3IG1vZGUsIHRoZSBlbnYuIHZhci4gRkRfVVNFUlBSRUZTIG1heSBiZSBzZXQgdG8KICAgICAgIGEgZmlsZW5hbWUgaW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSB0aGF0IGluY2x1ZGVzIGRlZmF1bHQKICAgICAgIHVzZXJuYW1lOm9wdGlvbnMgdmFsdWVzIChzbyB0aGUgb3B0aW9ucyBkbyBub3QgbmVlZCB0byBiZSB0eXBlZAogICAgICAgZXZlcnkgdGltZSBhdCB0aGUgbG9naW4gcHJvbXB0LikKICAgICAqIEluIC1yZWZsZWN0IG1vZGUgY3Vyc29yIHBvc2l0aW9uIHVwZGF0ZXMgYXJlIG5vdyBoYW5kbGVkCiAgICAgICBjb3JyZWN0bHkuCgoKICAgSGVyZSBhcmUgc29tZSBmZWF0dXJlcyB0aGF0IGFwcGVhcmVkIGluIHRoZSAwLjkuMTAgcmVsZWFzZSAoTWF5LzIwMTApOgogICAgICogVGhlIGluY2x1ZGVkIFNTTCBlbmFibGVkIEphdmEgYXBwbGV0IHZpZXdlciBub3cgc3VwcG9ydHMgQ2hhaW5lZAogICAgICAgU1NMIENlcnRpZmljYXRlcy4gVGhlIGRlYnVnQ2VydHM9eWVzIGFwcGxldCBwYXJhbWV0ZXIgYWlkcwogICAgICAgdHJvdWJsZXNob290aW5nIGNlcnRpZmljYXRlIHZhbGlkYXRpb24uIFRoZSB4MTF2bmMgLXNzbCBtb2RlIGhhcwogICAgICAgYWx3YXlzIHN1cHBvcnRlZCBjaGFpbmVkIFNTTCBjZXJ0aWZpY2F0ZXMgKHNpbXBseSBwdXQgdGhlCiAgICAgICBpbnRlcm1lZGlhdGUgY2VydGlmaWNhdGVzLCBpbiBvcmRlciwgYWZ0ZXIgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZQogICAgICAgaW4gdGhlIHBlbSBmaWxlLikKICAgICAqIEEgZGVtbyBDR0kgc2NyaXB0IGRlc2t0b3AuY2dpIHNob3dzIGhvdyB0byBjcmVhdGUgYW4gU1NMCiAgICAgICBlbmNyeXB0ZWQsIG11bHRpLXVzZXIgeDExdm5jIHdlYiBsb2dpbiBkZXNrdG9wIHNlcnZpY2UuIFRoZSBzY3JpcHQKICAgICAgIHJlcXVpcmVzIHgxMXZuYyB2ZXJzaW9uIDAuOS4xMC4gVGhlIHVzZXIgbG9ncyBpbnRvIGEgc2VjdXJlIHdlYgogICAgICAgc2l0ZSBhbmQgZ2V0cyBoaXMvaGVyIG93biB2aXJ0dWFsIGRlc2t0b3AgKFh2ZmIuKSB4MTF2bmMncyBTU0wKICAgICAgIGVuYWJsZWQgSmF2YSBWaWV3ZXIgQXBwbGV0IGlzIGxhdW5jaGVkIGJ5IHRoZSB3ZWIgYnJvd3NlciBmb3IKICAgICAgIHNlY3VyZSB2aWV3aW5nIChhbmQgc28gbm8gc29mdHdhcmUgbmVlZHMgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZQogICAgICAgdmlld2VyLXNpZGUuKSBPbmUgY2FuIHVzZSB0aGUgZGVza3RvcC5jZ2kgc2NyaXB0IGZvciBpZGVhcyB0bwogICAgICAgY3JlYXRlIHRoZWlyIG93biBmYW5jaWVyIG9yIGN1c3RvbWl6ZWQgd2ViIGxvZ2luIGRlc2t0b3Agc2VydmljZQogICAgICAgKGUuZy4gdXNlci1jcmVhdGlvbiwgUEhQLCBTUUwsIHNwZWNpYWxpemVkIGRlc2t0b3AgYXBwbGljYXRpb24sCiAgICAgICBldGMuKSBNb3JlIGluZm8gaGVyZS4gVGhlcmUgaXMgYWxzbyBhbiBvcHRpb25hbCAncG9ydCByZWRpcmVjdGlvbicKICAgICAgIG1vZGUgdGhhdCBhbGxvd3MgcmVkaXJlY3Rpb24gdG8gb3RoZXIgU1NMIGVuYWJsZWQgVk5DIHNlcnZlcnMKICAgICAgIHJ1bm5pbmcgaW5zaWRlIHRoZSBmaXJld2FsbC4KICAgICAqIEJ1aWx0LWluIHN1cHBvcnQgZm9yIElQdjYgKDEyOCBiaXQgaW50ZXJuZXQgYWRkcmVzc2VzKSBpcyBub3cKICAgICAgIHByb3ZpZGVkLiBTZWUgdGhlIC02IGFuZCAtY29ubmVjdCBvcHRpb25zIGZvciBkZXRhaWxzLgogICAgICAgQWRkaXRpb25hbGx5LCBpbiBjYXNlIHRoZXJlIGFyZSBzdGlsbCBwcm9ibGVtcyB3aXRoIGJ1aWx0LWluIElQdjYKICAgICAgIHN1cHBvcnQsIGEgdHJhbnNpdGlvbmFsIHRvb2wgaXMgcHJvdmlkZWQgaW4gaW5ldDZ0bzQgdGhhdCBhbGxvd3MKICAgICAgIHgxMXZuYyAob3IgYW55IG90aGVyIElQdjQgYXBwbGljYXRpb24pIHRvIHJlY2VpdmUgY29ubmVjdGlvbnMgb3ZlcgogICAgICAgSVB2Ni4KICAgICAqIFRoZSBYZHVtbXkgd3JhcHBlciBzY3JpcHQgZm9yIFhvcmcncyBkdW1teSBkcml2ZXIgaXMgdXBkYXRlZCBhbmQKICAgICAgIG5vIGxvbmdlciByZXF1aXJlcyBiZWluZyBydW4gYXMgcm9vdC4gTmV3IHNlcnZpY2Ugb3B0aW9ucyBhcmUKICAgICAgIHByb3ZpZGVkIHRvIHNlbGVjdCBYZHVtbXkgb3ZlciBYdmZiIGFzIHRoZSB2aXJ0dWFsIFggc2VydmVyIHRvIGJlCiAgICAgICBjcmVhdGVkLgogICAgICogVGhlICIlIiB1bml4IHBhc3N3b3JkIHZlcmlmaWNhdGlvbiB0cmlja3MgZm9yIHRoZSAtdW5peHB3IG9wdGlvbgogICAgICAgYXJlIG5vdyBkb2N1bWVudGVkLiBUaGV5IGhhdmUgYWxzbyBiZWVuIGV4dGVuZGVkIHRvIHJ1biBhIGNvbW1hbmQKICAgICAgIGFzIHRoZSB1c2VyIGlmIG9uZSBzZXRzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBVTklYUFdfQ01ELiBUaGUKICAgICAgIGRlc2t0b3AuY2dpIGRlbW8gc2NyaXB0IHRha2VzIGFkdmFudGFnZSBvZiB0aGlzIG5ldyBmZWF0dXJlLgogICAgICogQSBidWcgaGFzIGJlZW4gZml4ZWQgdGhhdCB3b3VsZCBwcmV2ZW50IHRoZSBKYXZhIGFwcGxldCB2aWV3ZXIKICAgICAgIGZyb20gYmVpbmcgZG93bmxvYWRlZCBzdWNjZXNzZnVsbHkgaW4gc2luZ2xlLXBvcnQgSFRUUFMvVk5DIGluZXRkCiAgICAgICBtb2RlLiBUaGUgZW52LiB2YXIuIFgxMVZOQ19IVFRQU19ET1dOTE9BRF9XQUlUX1RJTUUgY2FuIGJlIHVzZWQgdG8KICAgICAgIGFkanVzdCBmb3IgaG93IG1hbnkgc2Vjb25kcyBhIC1pbmV0ZCBvciAtaHR0cHMgaHR0cGQgZG93bmxvYWQgaXMKICAgICAgIHdhaXRlZCBmb3IgKGRlZmF1bHQgMTUgc2Vjb25kcy4pIFRoZSBhcHBsZXQgd2lsbCBub3cgYXV0b2RldGVjdAogICAgICAgeDExdm5jIGFuZCB1c2UgR0VUPTEgZm9yIGZhc3RlciBjb25uZWN0aW5nLiBNYW55IG90aGVyCiAgICAgICBpbXByb3ZlbWVudHMgYW5kIGZpeGVzLgogICAgICogVGhlIFRpZ2h0Vk5DIHNlY3VyaXR5IHR5cGUgKFRpZ2h0Vk5DIGZlYXR1cmVzIGVuYWJsZXIpIG5vdyB3b3JrcwogICAgICAgZm9yIFJGQiB2ZXJzaW9uIDMuOC4KICAgICAqIFRoZSBYIHByb3BlcnR5IFgxMVZOQ19UUkFQX1hSQU5EUiBjYW4gYmUgc2V0IG9uIGEgZGVza3RvcCB0byBmb3JjZQogICAgICAgeDExdm5jIHRvIHVzZSB0aGUgLXhyYW5kciBzY3JlZW4gc2l6ZSBjaGFuZ2UgdHJhcHBpbmcgY29kZS4KICAgICAqIE5ldyByZW1vdGUgY29udHJvbCBxdWVyeSBvcHRpb25zOiBwb2ludGVyX3gsIHBvaW50ZXJfeSwKICAgICAgIHBvaW50ZXJfc2FtZSwgcG9pbnRlcl9yb290LCBhbmQgcG9pbnRlcl9tYXNrLiBBIGRlbW8gc2NyaXB0IHVzaW5nCiAgICAgICB0aGVtIG1pc2MvcGFubmVyLnBsIGlzIHByb3ZpZGVkLgogICAgICogVGhlIC1zc2xTY3JpcHRzIG9wdGlvbiBwcmludHMgb3V0IHRoZSBTU0wgY2VydGlmaWNhdGUgbWFuYWdlbWVudAogICAgICAgc2NyaXB0cy4KCgogICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOS45IHJlbGVhc2UgKERlYy8yMDA5KToKICAgICAqIFRoZSAtdW5peHB3X3N5c3RlbV9ncmVldGVyIG9wdGlvbiwgd2hlbiB1c2VkIGluIGNvbWJpbmVkIHVuaXhwdwogICAgICAgYW5kIFhETUNQIEZJTkRDUkVBVEVESVNQTEFZIG1vZGUgKGZvciBleGFtcGxlOiAteGRtc3ZjKSwgZW5hYmxlcwogICAgICAgdGhlIHVzZXIgdG8gcHJlc3MgRXNjYXBlIHRvIGp1bXAgZGlyZWN0bHkgdG8gdGhlIFhETS9HRE0vS0RNIGxvZ2luCiAgICAgICBncmVldGVyIHNjcmVlbi4gVGhpcyB3YXkgdGhlIHVzZXIgYXZvaWRzIGVudGVyaW5nIGhpcyB1bml4CiAgICAgICBwYXNzd29yZCB0d2ljZSBhdCBYIHNlc3Npb24gY3JlYXRpb24gdGltZS4gQWxzbywgdGhlIHVuaXhwdyBsb2dpbgogICAgICAgcGFuZWwgbm93IGhhcyBhIHNob3J0IGhlbHAgZGlzcGxheWVkIGlmIHRoZSB1c2VyIHByZXNzZXMgJ0YxJy4KICAgICAqIHgxMXZuYyBub3cgdHJpZXMgdG8gYmUgYSBsaXR0bGUgYml0IG1vcmUgYWdncmVzc2l2ZSBpbiBrZWVwaW5nIHVwCiAgICAgICB3aXRoIFZOQyBjbGllbnQncyBmcmFtZWJ1ZmZlciB1cGRhdGUgcmVxdWVzdHMuIFNvbWUgYnJva2VuIFZOQwogICAgICAgY2xpZW50cyBsaWtlIEVnZ3BsYW50IGFuZCBKb2xseXNGYXN0Vk5DIGNvbnRpbnVvdXNseSBzcHJheSB0aGVzZQogICAgICAgcmVxdWVzdHMgYXQgVk5DIHNlcnZlcnMgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGhhdmUgcmVjZWl2ZWQKICAgICAgIGFueSB1cGRhdGVzIG9yIG5vdC4pIFVuZGVyIHNvbWUgY2lyY3Vtc3RhbmNlcyB0aGlzIGNvdWxkIGxlYWQgdG8KICAgICAgIHgxMXZuYyBmYWxsaW5nIGJlaGluZC4gVGhlIC1leHRyYV9mYnVyIG9wdGlvbiBhbGxvd3Mgb25lIHRvIGZpbmUKICAgICAgIHR1bmUgdGhlIHNldHRpbmcuIEFkZGl0aW9uYWxseSwgb25lIG1heSBhbHNvIGRpYWwgZG93biBkZWxheXM6CiAgICAgICBlLmcuICItZGVmZXIgNSIgYW5kICItd2FpdCA1IiAob3IgdG8gMSBvciBldmVuIDApIG9yIC1ub25hcCBvcgogICAgICAgLWFsbGlucHV0IHRvIGtlZXAgdXAgd2l0aCB0aGVzZSBWTkMgY2xpZW50cyBhdCB0aGUgZXhwZW5zZSBvZgogICAgICAgaW5jcmVhc2VkIHN5c3RlbSBsb2FkLgogICAgICogSGV1cmlzdGljcyBhcmUgYXBwbGllZCB0byB0cnkgdG8gZGV0ZXJtaW5lIGlmIHRoZSBYIGRpc3BsYXkgaXMKICAgICAgIGN1cnJlbnRseSBpbiBhIERpc3BsYXkgTWFuYWdlciBHcmVldGVyIExvZ2luIHBhbmVsIChlLmcuIEdETSkgSWYKICAgICAgIHNvLCB4MTF2bmMncyBjcmVhdGlvbiBvZiBhbnkgd2luZG93cyBhbmQgdXNlIG9mIFhGSVhFUyBhcmUKICAgICAgIGRlbGF5ZWQuIFRoaXMgaXMgdG8gdHJ5IHRvIGF2b2lkIHgxMXZuYyBiZWluZyBraWxsZWQgYWZ0ZXIgdGhlCiAgICAgICB1c2VyIGxvZ3MgaW4gaWYgdGhlIEdETSBLaWxsSW5pdENsaWVudHM9dHJ1ZSBpcyBpbiBlZmZlY3QuIFNvIG9uZQogICAgICAgZG9lcyBub3QgbmVlZCB0byBzZXQgS2lsbEluaXRDbGllbnRzPWZhbHNlLiBOb3RlIHRoYXQgaW4gcmVjZW50CiAgICAgICBHRE0gdGhlIEtpbGxJbml0Q2xpZW50cyBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4gQWxzbyBkZWxheWVkIGlzCiAgICAgICB0aGUgdXNlIG9mIHRoZSBYRklYRVMgY3Vyc29yIGZldGNoaW5nIGZ1bmN0aW9uYWxpdHk7IHRoaXMgYXZvaWRzCiAgICAgICBhbiBYb3JnIGJ1ZyB0aGF0IGNhdXNlcyBYb3JnIHRvIGNyYXNoIHJpZ2h0IGFmdGVyIHRoZSB1c2VyIGxvZ3MKICAgICAgIGluLgogICAgICogQSBuZXcgb3B0aW9uIC1maW5kYXV0aCBydW5zIHRoZSBGSU5ERElTUExBWSBzY3JpcHQgdGhhdCBhcHBsaWVzCiAgICAgICBoZXVyaXN0aWNzIHRoYXQgdHJ5IHRvIGRldGVybWluZSB0aGUgWEFVVEhPUklUWSBmaWxlLiBUaGUgdXNlIG9mCiAgICAgICAnLWF1dGggZ3Vlc3MnIHdpbGwgdXNlIHRoZSBYQVVUSE9SSVRZIHRoYXQgLWZpbmRhdXRoIHJldmVhbHMuIFRoaXMKICAgICAgIGNhbiBiZSBoYW5keSBpbiB3aXRoIHRoZSBsYXN0ZXN0IEdETSB3aGVyZSB0aGUgYWJpbGl0eSB0byBzdG9yZQogICAgICAgY29va2llcyBpbiB+Ly5YYXV0aG9yaXR5IGhhcyBiZWVuIHJlbW92ZWQuIElmIHgxMXZuYyBpcyBydW5uaW5nIGFzCiAgICAgICByb290IChlLmcuIGluZXRkKSBhbmQgeW91IGFkZCAtZW52IEZEX1hETT0xIHRvIHRoZSBhYm92ZSAtZmluZGF1dGgKICAgICAgIG9yIC1hdXRoIGd1ZXNzIGNvbW1hbmQgbGluZXMsIGl0IHdpbGwgZmluZCB0aGUgY29ycmVjdCBYQVVUSE9SSVRZCiAgICAgICBmb3IgdGhlIGdpdmVuIGRpc3BsYXkgKHRoaXMgd29ya3MgZm9yIFhETS9HRE0vS0RNIGlmIHRoZSBsb2dpbgogICAgICAgZ3JlZXRlciBwYW5lbCBpcyB1cCBvciBpZiBzb21lb25lIGhhcyBhbHJlYWR5IGxvZ2dlZCBpbnRvIGFuIFgKICAgICAgIHNlc3Npb24uKQogICAgICogVGhlIEZJTkRESVNQTEFZIGFuZCBGSU5EQ1JFQVRFRElTUExBWSBtb2RlcyAoaS5lLiAiLWRpc3BsYXkKICAgICAgIFdBSVQ6Y21kPS4uLiIsIC1maW5kLCAtY3JlYXRlKSBub3cgd29yayBjb3JyZWN0bHkgZm9yIHRoZQogICAgICAgdXNlci1zdXBwbGllZCBsb2dpbiBwcm9ncmFtIHNjaGVtZSAiLXVuaXhwd19jbWQgLi4uIiwgYXMgbG9uZyBhcwogICAgICAgdGhlIGxvZ2luIHByb2dyYW0gc3VwcG9ydHMgcnVubmluZyBjb21tYW5kcyBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSAiUkZCX1VOSVhQV19DTURfUlVOIiBhcyB0aGUgbG9nZ2VkLWluIHVzZXIuCiAgICAgICBUaGUgbW9kZSAiLXVuaXhwd19uaXMgLi4uIiBoYXMgYWxzbyBiZWVuIG1hZGUgbW9yZSBjb25zaXN0ZW50LgogICAgICogVGhlIC1zdHVubmVsIG9wdGlvbiAobGlrZSAtc3NsIGJ1dCB1c2VzIHN0dW5uZWwgYXMgYW4gZXh0ZXJuYWwKICAgICAgIGhlbHBlciBwcm9ncmFtKSBub3cgd29ya3Mgd2l0aCB0aGUgLXNzbCAiU0FWRSIgYW5kICJUTVAiIHNwZWNpYWwKICAgICAgIGNlcnRpZmljYXRlIG5hbWVzLiBUaGUgLXNzbHZlcmlmeSBhbmQgLXNzbENSTCBvcHRpb25zIG5vdyB3b3JrCiAgICAgICBjb3JyZWN0bHkgaW4gLXN0dW5uZWwgbW9kZS4gU2luZ2xlIHBvcnQgSFRUUFMgY29ubmVjdGlvbnMgYXJlIGFsc28KICAgICAgIHN1cHBvcnRlZCBmb3IgdGhpcyBtb2RlLgogICAgICogVGhlcmUgaXMgYW4gZXhwZXJpbWVudGFsIEFwcGxpY2F0aW9uIFNoYXJpbmcgbW9kZSB0aGF0IGltcHJvdmVzCiAgICAgICB1cG9uIHRoZSAtaWQvLXNpZCBzaW5nbGUgd2luZG93IHNoYXJpbmc6IC1hcHBzaGFyZSAocnVuICJ4MTF2bmMKICAgICAgIC1hcHBzaGFyZSAtaGVscCIgZm9yIG1vcmUgaW5mby4pIEl0IGlzIHN0aWxsIHZlcnkgcHJpbWl0aXZlIGFuZAogICAgICAgYXBwcm94aW1hdGUsIGJ1dCBhdCBsZWFzdCBpdCBkaXNwbGF5cyBtdWx0aXBsZSB0b3AtbGV2ZWwgd2luZG93cy4KICAgICAqIFRoZSByZW1vdGUgY29udHJvbCBjb21tYW5kIC1SIGNhbiBiZSB1c2VkIHRvIGluc3RydWN0IHgxMXZuYyB0bwogICAgICAgcmVzZW5kIGl0cyBtb3N0IHJlY2VudCBjb3B5IG9mIHRoZSBDbGlwYm9hcmQsIFByaW1hcnksIG9yCiAgICAgICBDdXRidWZmZXIgc2VsZWN0aW9uczogIngxMXZuYyAtUiByZXNlbmRfY2xpcGJvYXJkIiwgIngxMXZuYyAtUgogICAgICAgcmVzZW5kX3ByaW1hcnkiLCBhbmQgIngxMXZuYyAtUiByZXNlbmRfY3V0YnVmZmVyIi4KICAgICAqIFRoZSBmb250cyBpbiB0aGUgR1VJICgtZ3VpKSBjYW4gbm93IGJ5IHNldCB2aWEgZW52aXJvbm1lbnQKICAgICAgIHZhcmlhYmxlcywgZS5nLiAtZW52IFgxMVZOQ19GT05UX0JPTEQ9J0hlbHZldGljYSAtMTYgYm9sZCcgYW5kCiAgICAgICAtZW52IFgxMVZOQ19GT05UX0ZJWEVEPSdDb3VyaWVyIC0xNCcuCiAgICAgKiBUaGUgWERBTUFHRSBtZWNoYW5pc20gaXMgbm93IGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgZm9yIGEgcGVyaW9kCiAgICAgICBvZiB0aW1lIGlmIGEgZ2FtZSBvciBzY3JlZW5zYXZlciBnZW5lcmF0ZXMgdG9vIG1hbnkgWERBTUFHRQogICAgICAgcmVjdGFuZ2xlcyBwZXIgc2Vjb25kLiBUaGlzIGF2b2lkcyB0aGUgWDExIGV2ZW50IHF1ZXVlIGZyb20KICAgICAgIHNvYWtpbmcgdXAgdG9vIG11Y2ggbWVtb3J5LgogICAgICogVGhlcmUgaXMgYW4gZXhwZXJpbWVudGFsIHdvcmthcm91bmQ6ICItZW52IFgxMVZOQ19XQVRDSF9EWF9EWT0xIgogICAgICAgdGhhdCB0cmllcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHBvb3JseSBjb25zdHJ1Y3RlZCBtZW51IHRoZW1lcwogICAgICAgdGhhdCBwbGFjZSB0aGUgaW5pdGlhbCBwb3NpdGlvbiBvZiB0aGUgbW91c2UgY3Vyc29yIGluc2lkZSBhIG1lbnUKICAgICAgIGl0ZW0ncyBhY3RpdmUgem9uZS4gTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaGVyZS4KCgogICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOS44IHJlbGVhc2UgKEp1bC8yMDA5KToKICAgICAqIFN0YWJpbGl0eSBpbXByb3ZlbWVudHMgdG8gLXRocmVhZHMgbW9kZS4gUnVubmluZyB4MTF2bmMgdGhpcyB3YXkKICAgICAgIGlzIG1vcmUgcmVsaWFibGUgbm93LiBUaHJlYWRlZCBvcGVyYXRpb24gc29tZXRpbWVzIGdpdmVzIGJldHRlcgogICAgICAgaW50ZXJhY3RpdmUgcmVzcG9uc2UgYW5kIGZhc3RlciB1cGRhdGVzOiB0cnkgaXQgb3V0LiBUaGUgdGhyZWFkZWQKICAgICAgIG1vZGUgbm93IHN1cHBvcnRzIG11bHRpcGxlIFZOQyB2aWV3ZXJzIHVzaW5nIHRoZSBzYW1lIFZOQwogICAgICAgZW5jb2RpbmcuIFRoZSB0aHJlYWRlZCBtb2RlIGNhbiBhbHNvIHlpZWxkIGEgcGVyZm9ybWFuY2UKICAgICAgIGVuaGFuY2VtZW50IGluIHRoZSBtYW55IGNsaWVudCBjYXNlIChlLmcuIGNsYXNzLXJvb20gYnJvYWRjYXN0LikKICAgICAgIFdlIGhhdmUgdGVzdGVkIHdpdGggMzAgdG8gNTAgc2ltdWx0YW5lb3VzIGNsaWVudHMuIFNlZSBhbHNvCiAgICAgICAtcmVmbGVjdC4KICAgICAgIEZvciBzaW11bHRhbmVvdXMgY2xpZW50czogdGhlIFpSTEUgZW5jb2RpbmcgaXMgdGhyZWFkIHNhZmUgb24gYWxsCiAgICAgICBwbGF0Zm9ybXMsIGFuZCB0aGUgVGlnaHQgYW5kIFpsaWIgZW5jb2RpbmdzIGFyZSBjdXJyZW50bHkgb25seQogICAgICAgdGhyZWFkIHNhZmUgb24gTGludXggd2hlcmUgdGhyZWFkIGxvY2FsIHN0b3JhZ2UsIF9fdGhyZWFkLCBpcwogICAgICAgdXNlZC4gSWYgeW91ciBub24tTGludXggc3lzdGVtIGFuZCBjb21waWxlciBzdXBwb3J0IF9fdGhyZWFkIG9uZQogICAgICAgY2FuIHN1cHBseSAtRFRMUz1fX3RocmVhZCB0byBlbmFibGUgaXQuIFdoZW4gdGhlcmUgaXMgb25seSBvbmUKICAgICAgIGNvbm5lY3RlZCBjbGllbnQsIGFsbCBlbmNvZGluZ3MgYXJlIHNhZmUgb24gYWxsIHBsYXRmb3Jtcy4gTm90ZQogICAgICAgdGhhdCBzb21lIGZlYXR1cmVzIChlLmcuIHNjcm9sbCBkZXRlY3Rpb24gYW5kIC1uY2FjaGUpIG1heSBiZQogICAgICAgZGlzYWJsZWQgb3IgcnVuIHdpdGggcmVkdWNlZCBmdW5jdGlvbmFsaXR5IGluIC10aHJlYWRzIG1vZGUuCiAgICAgKiBBdXRvbWF0aWNhbGx5IHRyaWVzIHRvIHdvcmsgYXJvdW5kIGFuIFhvcmcgc2VydmVyIGFuZCBHTk9NRSBidWcKICAgICAgIGludm9sdmluZyBpbmZpbml0ZWx5IHJlcGVhdGluZyBrZXlzIHdoZW4gdHVybmluZyBvZmYga2V5CiAgICAgICByZXBlYXRpbmcuIFVzZSAtcmVwZWF0IGlmIHRoZSBhdXRvbWF0aWMgd29ya2Fyb3VuZCBmYWlscy4KICAgICAqIEltcHJvdmVkIHJlbGlhYmlsaXR5IG9mIHRoZSBTaW5nbGUgUG9ydCBTU0wgVk5DIGFuZCBIVFRQUyBqYXZhCiAgICAgICB2aWV3ZXIgYXBwbGV0IGRlbGl2ZXJ5IG1lY2hhbmlzbS4KICAgICAqIFRoZSAtY2xpcCBtb2RlIHdvcmtzIHVuZGVyIC1yYXdmYi4KCgogICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOS43IHJlbGVhc2UgKE1hci8yMDA5KToKICAgICAqIFN1cHBvcnQgZm9yIHBvbGxpbmcgTGludXggVmlydHVhbCBUZXJtaW5hbHMgKGFsc28gY2FsbGVkIHZpcnR1YWwKICAgICAgIGNvbnNvbGVzKSBkaXJlY3RseSBpbnN0ZWFkIG9mIHVzaW5nIC9kZXYvZmIuIFRoZSBvcHRpb24gdG8gdXNlIGlzLAogICAgICAgZm9yIGV4YW1wbGUsICItcmF3ZmIgdnQyIiBmb3IgVmlydHVhbCBUZXJtaW5hbCAyLCBldGMuIEluIHRoaXMKICAgICAgIGNhc2UgdGhlIHNwZWNpYWwgZmlsZSAvZGV2L3Zjc2EyIGlzIHVzZWQgdG8gcmV0cmlldmUgdnQyJ3MgY3VycmVudAogICAgICAgdGV4dC4gVGV4dCBhbmQgY29sb3JzIGFyZSBzaG93biwgYnV0IG5vIGdyYXBoaWNzLgogICAgICogU3VwcG9ydCBmb3IgbGVzcyB0aGFuIDggYml0cyBwZXIgcGl4ZWwgZnJhbWVidWZmZXJzIChlLmcuIDQgb3IgMQogICAgICAgYnBwKSBpbiB0aGUgLXJhd2ZiIG1vZGUuCiAgICAgKiBUaGUgU1NMIGVuYWJsZWQgVWx0cmFWTkMgSmF2YSB2aWV3ZXIgYXBwbGV0IG5vdyBoYXMgYSBbSG9tZV0gZW50cnkKICAgICAgIGluIHRoZSAiZHJpdmVzIiBkcm9wIGRvd24gbWVudS4gVGhpcyBtZW51IGNhbiBiZSBjb25maWd1cmVkIHdpdGgKICAgICAgIHRoZSBmdHBEcm9wRG93biBhcHBsZXQgcGFyYW1ldGVyLiBBbGwgb2YgdGhlIGFwcGxldCBwYXJhbWV0ZXJzIGFyZQogICAgICAgZG9jdW1lbnRlZCBpbiBjbGFzc2VzL3NzbC9SRUFETUUuCiAgICAgKiBFeHBlcmltZW50YWwgc3VwcG9ydCBmb3IgVmlydHVhbEdMJ3MgVHVyYm9WTkMgKGFuIGVuaGFuY2VkCiAgICAgICBUaWdodFZOQyBmb3IgZmFzdCBMQU4gaGlnaCBmcmFtZXJhdGUgdXNhZ2UuKQogICAgICogVGhlIENVUFMgVGVybWluYWwgU2VydmljZXMgaGVscGVyIG1vZGUgaGFzIGJlZW4gaW1wcm92ZWQuCiAgICAgKiBJbXByb3ZlbWVudHMgdG8gdGhlIC1uY2FjaGVfY3IgdGhhdCBhbGxvd3Mgc21vb3RoIG9wYXF1ZSB3aW5kb3cKICAgICAgIG1vdGlvbnMgdXNpbmcgdGhlICdjb3B5cmVjdCcgZW5jb2Rpbmcgd2hlbiB1c2luZyAtbmNhY2hlIG1vZGUuCiAgICAgKiBUaGUgLXJtZmxhZyBvcHRpb24gZW5hYmxlcyBhIHdheSB0byBpbmRpY2F0ZSB0byBvdGhlciBwcm9jZXNzZXMKICAgICAgIHgxMXZuYyBoYXMgZXhpdGVkLgogICAgICogUmV2ZXJzZSBjb25uZWN0aW9ucyB1c2luZyBhbm9ueW1vdXMgRGlmZmllIEhlbGxtYW4gU1NMIGVuY3J5cHRpb24KICAgICAgIG5vdyB3b3JrLgoKCiAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcHBlYXJlZCBpbiB0aGUgMC45LjYgcmVsZWFzZSAoRGVjLzIwMDgpOgogICAgICogU3VwcG9ydCBmb3IgVmVOQ3J5cHQgU1NML1RMUyBlbmNyeXB0ZWQgY29ubmVjdGlvbnMuIEl0IGlzIGVuYWJsZWQKICAgICAgIGJ5IGRlZmF1bHQgaW4gdGhlIC1zc2wgbW9kZS4gVk5DIFZpZXdlcnMgbGlrZSB2aW5hZ3JlLAogICAgICAgZ3ZuY3ZpZXdlci9ndGstdm5jLCB0aGUgdmVuY3J5cHQgcGFja2FnZSwgU1NWTkMsIGFuZCBvdGhlcnMKICAgICAgIHN1cHBvcnQgdGhpcyBlbmNyeXB0aW9uIG1vZGUuIEl0IGNhbiBhbHNvIGJlIHVzZWQgd2l0aCB0aGUgLXVuaXhwdwogICAgICAgb3B0aW9uIHRvIGVuYWJsZSBVbml4IHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbgogICAgICAgKFZlTkNyeXB0J3MgIipQbGFpbiIgbW9kZXMuKSBBIHNpbWlsYXIgYnV0IG9sZGVyIFZOQyBzZWN1cml0eSB0eXBlCiAgICAgICAiQU5PTlRMUyIgKHVzZWQgYnkgdmlubykgaXMgc3VwcG9ydGVkIGFzIHdlbGwuIFNlZSB0aGUgLXZlbmNyeXB0CiAgICAgICBhbmQgLWFub250bHMgb3B0aW9ucyBmb3IgYWRkaXRpb25hbCBjb250cm9sLiBUaGUgZGlmZmVyZW5jZQogICAgICAgYmV0d2VlbiB4MTF2bmMncyBub3JtYWwgLXNzbCBtb2RlIGFuZCBWZU5DcnlwdCBpcyB0aGF0IHRoZSBmb3JtZXIKICAgICAgIHdyYXBzIHRoZSBlbnRpcmUgVk5DIGNvbm5lY3Rpb24gaW4gU1NMIChsaWtlIEhUVFBTIGRvZXMgZm9yIEhUVFAsCiAgICAgICBpLmUuICJ2bmNzOi8vIikgd2hpbGUgVmVOQ3J5cHQgc3dpdGNoZXMgb24gdGhlIFNTTC9UTFMgYXQgYQogICAgICAgY2VydGFpbiBwb2ludCBkdXJpbmcgdGhlIFZOQyBoYW5kc2hha2UuIFVzZSAtc3Nsb25seSB0byBkaXNhYmxlCiAgICAgICBib3RoIFZlTkNyeXB0IGFuZCBBTk9OVExTICh2aW5vLikKICAgICAqIFRoZSAiLXNzbCBBTk9OIiBvcHRpb24gZW5hYmxlcyBBbm9ueW1vdXMgRGlmZmllLUhlbGxtYW4gKEFESCkga2V5CiAgICAgICBleGNoYW5nZSBmb3IgeDExdm5jJ3Mgbm9ybWFsIFNTTC9UTFMgb3BlcmF0aW9uLiBOb3RlIHRoYXQKICAgICAgIEFub255bW91cyBEaWZmaWUtSGVsbG1hbiB1c2VzIGVuY3J5cHRpb24gZm9yIHByaXZhY3ksIGJ1dCBwcm92aWRlcwogICAgICAgbm8gYXV0aGVudGljYXRpb24gYW5kIHNvIGlzIHN1c2NlcHRpYmxlIHRvIE1hbi1Jbi1UaGUtTWlkZGxlCiAgICAgICBhdHRhY2tzIChhbmQgc28gd2UgZG8gbm90IHJlY29tbWVuZCBpdDogd2UgcHJlZmVyIHlvdSB1c2UgIi1zc2wKICAgICAgIFNBVkUiLCBldGMuIGFuZCBoYXZlIHRoZSBWTkMgdmlld2VyIHZlcmlmeSB0aGUgY2VydC4pIFRoZSBBTk9OVExTCiAgICAgICBtb2RlICh2aW5vKSBvbmx5IHN1cHBvcnRzIEFESC4gVmVOQ3J5cHQgbW9kZSBzdXBwb3J0cyBib3RoIEFESCBhbmQKICAgICAgIHJlZ3VsYXIgWDUwOSBTU0wgY2VydGlmaWNhdGVzIG1vZGVzLiBGb3IgdGhlc2UgQURIIGlzIGVuYWJsZWQgYnkKICAgICAgIGRlZmF1bHQuIFNlZSAtdmVuY3J5cHQgYW5kIC1hbm9udGxzIGZvciBob3cgdG8gZGlzYWJsZSBBREguCiAgICAgKiBGb3IgeDExdm5jJ3MgU1NML1RMUyBtb2Rlcywgb25lIGNhbiBub3cgc3BlY2lmeSBhIENlcnRpZmljYXRlCiAgICAgICBSZXZvY2F0aW9uIExpc3QgKENSTCkgd2l0aCB0aGUgLXNzbENSTCBvcHRpb24uIFRoaXMgd2lsbCBvbmx5IGJlCiAgICAgICB1c2VmdWwgZm9yIHdpZGUgZGVwbG95bWVudHM6IHNheSBhIGNvbXBhbnktd2lkZSB4MTF2bmMgU1NMIGFjY2VzcwogICAgICAgZGVwbG95bWVudCB1c2luZyBhIGNlbnRyYWwgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IChDQSkgdmlhCiAgICAgICAtc3NsR2VuQ0EgYW5kIC1zc2xHZW5DZXJ0LiBUaGlzIHdheSBpZiBhIHVzZXIgaGFzIGhpcyBsYXB0b3AgbG9zdAogICAgICAgb3Igc3RvbGVuLCB5b3Ugb25seSBoYXZlIHRvIHJldm9rZSBoaXMga2V5IGluc3RlYWQgb2YgY3JlYXRpbmcgYQogICAgICAgbmV3IENlcnRpZmljYXRlIEF1dGhvcml0eSBhbmQgcmVkZXBsb3lpbmcgbmV3IGtleXMgdG8gYWxsIHVzZXJzLgogICAgICogVGhlIGRlZmF1bHQgU1NML1RMUyBtb2RlLCAiLXNzbCIgKG5vIHBlbSBmaWxlIHBhcmFtZXRlciBzdXBwbGllZCksCiAgICAgICBpcyBub3cgdGhlIHNhbWUgYXMgIi1zc2wgU0FWRSIgYW5kIHdpbGwgc2F2ZSB0aGUgZ2VuZXJhdGVkCiAgICAgICBzZWxmLXNpZ25lZCBjZXJ0IGluICJ+Ly52bmMvY2VydHMvc2VydmVyLnBlbSIuIFByZXZpb3VzbHkgIi1zc2wiCiAgICAgICB3b3VsZCBjcmVhdGUgYSB0ZW1wb3Jhcnkgc2VsZi1zaWduZWQgY2VydCB0aGF0IHdhcyBkaXNjYXJkZWQgd2hlbgogICAgICAgeDExdm5jIGV4aXRlZC4gVGhlIHJlYXNvbiBmb3IgdGhlIGNoYW5nZSBpcyB0byBhdCBsZWFzdCBnaXZlIHRoZQogICAgICAgY2hhbmNlIGZvciB0aGUgVk5DIFZpZXdlciBzaWRlIChlLmcuIFNTVk5DKSB0byByZW1lbWJlciB0aGUgY2VydAogICAgICAgdG8gYXV0aGVudGljYXRlIHN1YnNlcXVlbnQgY29ubmVjdGlvbnMgdG8gdGhlIHNhbWUgeDExdm5jIHNlcnZlci4KICAgICAgIFVzZSAiLXNzbCBUTVAiIHRvIHJlZ2FpbiB0aGUgcHJldmlvdXMgYmVoYXZpb3IuIFVzZSAiLXNzbAogICAgICAgU0FWRV9OT1BST01QVCIgdG8gYXZvaWQgYmVpbmcgcHJvbXB0ZWQgYWJvdXQgdXNpbmcgcGFzc3BocmFzZSB3aGVuCiAgICAgICB0aGUgY2VydGlmaWNhdGUgaXMgY3JlYXRlZC4KICAgICAqIFRoZSBvcHRpb24gLWh0dHBfb25lcG9ydCBlbmFibGVzIHNpbmdsZS1wb3J0IEhUVFAgY29ubmVjdGlvbnMgdmlhCiAgICAgICB0aGUgSmF2YSBWTkMgVmlld2VyLiBTbywgZm9yIGV4YW1wbGUsIHRoZSB3ZWIgYnJvd3NlciBVUkwKICAgICAgICJodHRwOi8vbXlob3N0Lm9yZzo1OTAwIiB3b3JrcyB0aGUgc2FtZSBhcwogICAgICAgImh0dHA6Ly9teWhvc3Qub3JnOjU4MDAiLCBidXQgd2l0aCB0aGUgY29udmVuaWVuY2Ugb2Ygb25seQogICAgICAgaW52b2x2aW5nIG9uZSBwb3J0IGluc3RlYWQgb2YgdHdvLiBUaGlzIHdvcmtzIGZvciBib3RoIHVuZW5jcnlwdGVkCiAgICAgICBjb25uZWN0aW9ucyBhbmQgZm9yIFNTSCB0dW5uZWxzIChzZWUgLWh0dHBzcmVkaXIgaWYgdGhlIHR1bm5lbAogICAgICAgcG9ydCBkaWZmZXJzLikgTm90ZSB0aGF0IEhUVFBTIHNpbmdsZS1wb3J0IG9wZXJhdGlvbiBpbiAtc3NsIFNTTAogICAgICAgZW5jcnlwdGVkIG1vZGUgaGFzIGJlZW4gYXZhaWxhYmxlIHNpbmNlIHgxMXZuYyB2ZXJzaW9uIDAuOC4zLgogICAgICogRm9yIHRoZSAtYXZhaGkvLXplcm9jb25mIFNlcnZpY2UgQWR2ZXJ0aXppbmcgbW9kZSwgaWYgeDExdm5jIHdhcwogICAgICAgbm90IGNvbXBpbGVkIHdpdGggdGhlIGF2YWhpLWNsaWVudCBsaWJyYXJ5LCB0aGVuIGFuIGV4dGVybmFsCiAgICAgICBoZWxwZXIgcHJvZ3JhbSwgZWl0aGVyIGF2YWhpLXB1Ymxpc2goMSkgKG9uIFVuaXgpIG9yIGRucy1zZCgxKSAob24KICAgICAgIE1hYyBPUyBYKSwgaXMgdXNlZCBpbnN0ZWFkLgogICAgICogVGhlICItcmZicG9ydCBQUk9NUFQiIG9wdGlvbiB3aWxsIHByb21wdCB0aGUgdXNlciB2aWEgdGhlIEdVSSB0bwogICAgICAgc2VsZWN0IHRoZSBWTkMgcG9ydCAoZS5nLiA1OTAxKSB0byBsaXN0ZW4gb24sIGFuZCBhIGZldyBvdGhlcgogICAgICAgYmFzaWMgc2V0dGluZ3MuIFRoaXMgZW5hYmxlcyBhIGhhbmR5IEdVSSBtb2RlIGZvciBuYWl2ZSB1c2VyczoKICAgeDExdm5jIC1ndWkgdHJheT1zZXRwYXNzIC1yZmJwb3J0IFBST01QVCAtbG9nZmlsZSAkSE9NRS8ueDExdm5jLmxvZy4lVk5DRElTUApMQVkKICAgICAgIHN1aXRhYmxlIGZvciBwdXR0aW5nIGluIGEgbGF1bmNoZXIgb3IgbWVudSwgZS5nLiB4MTF2bmMuZGVza3RvcC4KICAgICAgIFRoZSAtbG9nZmlsZSBleHBhbnNpb24gaXMgbmV3IHRvby4gSW4gdGhlIEdVSSwgdGhlIHRyYXk9c2V0cGFzcwogICAgICAgUHJvcGVydGllcyBwYW5lbCBoYXMgYmVlbiBpbXByb3ZlZC4KICAgICAqIFRoZSAtc29saWQgc29saWQgYmFja2dyb3VuZCBjb2xvciBvcHRpb24gbm93IHdvcmtzIGZvciB0aGUgTWFjIE9TCiAgICAgICBYIGNvbnNvbGUuCiAgICAgKiBUaGUgLXJlb3BlbiBvcHRpb24gaW5zdHJ1Y3RzIHgxMXZuYyB0byB0cnkgdG8gcmVvcGVuIHRoZSBYIGRpc3BsYXkKICAgICAgIGlmIGl0IGlzIHByZW1hdHVyZWx5IGNsb3NlZCBieSwgc2F5LCB0aGUgZGlzcGxheSBtYW5hZ2VyIChlLmcuCiAgICAgICBHRE0uKQoKCiAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcHBlYXJlZCBpbiB0aGUgMC45LjUgcmVsZWFzZSAoT2N0LzIwMDgpOgogICAgICogU3ltbWV0cmljIGtleSBlbmNyeXB0aW9uIGNpcGhlcnMuIEFSQzQsIEFFUy0xMjgsIEFFUy0yNTYsCiAgICAgICBibG93ZmlzaCwgYW5kIDNkZXMgYXJlIHN1cHBvcnRlZC4gU2FsdCBhbmQgaW5pdGlhbGl6YXRpb24gdmVjdG9yCiAgICAgICBzZWVkaW5nIGlzIHByb3ZpZGVkLiBUaGVzZSBjb21wbGltZW50IHRoZSBtb3JlIHdpZGVseSB1c2VkIFNTTCBhbmQKICAgICAgIFNTSCBlbmNyeXB0aW9uIGFjY2VzcyBtZXRob2RzLiBTU1ZOQyBhbHNvIHN1cHBvcnRzIHRoZXNlCiAgICAgICBlbmNyeXB0aW9uIG1vZGVzLgogICAgICogU2NhbGluZyBkaWZmZXJlbnRseSBhbG9uZyB0aGUgWC0gYW5kIFktZGlyZWN0aW9ucy4gRS5nLiAiLXNjYWxlCiAgICAgICAxMjgweDEwMjQiIG9yICItc2NhbGUgMC44eDAuNzUiICAgIEFsc28sICItZ2VvbWV0cnkgV3hIIiBpcyBhbgogICAgICAgYWxpYXMgZm9yICItc2NhbGUgV3hIIgogICAgICogQnkgaGF2aW5nIFNTVk5DIHZlcnNpb24gMS4wLjIxIG9yIGxhdGVyIGF2YWlsYWJsZSBpbiB5b3VyICRQQVRILAogICAgICAgdGhlIC1jaGF0d2luZG93IG9wdGlvbiBhbGxvd3MgYSBVbHRyYVZOQyBUZXh0IENoYXQgd2luZG93IHRvCiAgICAgICBhcHBlYXIgb24gdGhlIGxvY2FsIFgxMSBjb25zb2xlL2Rpc3BsYXkgKHRoaXMgd2F5IHRoZSByZW1vdGUKICAgICAgIHZpZXdlciBjYW4gY2hhdCB3aXRoIHRoZSBwZXJzb24gYXQgdGhlIHBoeXNpY2FsIGRpc3BsYXk7IGUuZy4KICAgICAgIGhlbHBkZXNrIG1vZGUuKSBUaGlzIGFsc28gd29ya3Mgb24gdGhlIE1hYyBPUyBYIGNvbnNvbGUgaWYgdGhlCiAgICAgICBYcXVhcnR6IFgxMSBzZXJ2ZXIgKGVuYWJsZWQgYnkgZGVmYXVsdCBvbiBsZW9wYXJkKSBpcyBydW5uaW5nIGZvcgogICAgICAgdGhlIGNoYXR3aW5kb3cuCiAgICAgKiBUaGUgSFRUUCBKYXZhIHZpZXdlciBhcHBsZXQgamFyLCBjbGFzc2VzL1ZuY1ZpZXdlci5qYXIsIGhhcyBiZWVuCiAgICAgICB1cGRhdGVkIHdpdGggYW4gaW1wcm92ZWQgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gdGhlIGNvZGUgdXNlZCBieQogICAgICAgdGhlIGNsYXNzZXMvc3NsIGFwcGxldHMuCgoKICAgSGVyZSBhcmUgc29tZSBmZWF0dXJlcyB0aGF0IGFwcGVhcmVkIGluIHRoZSAwLjkuNCByZWxlYXNlIChTZXAvMjAwOCk6CiAgICAgKiBJbXByb3ZlbWVudHMgdG8gdGhlIC1maW5kIGFuZCAtY3JlYXRlIFggc2Vzc2lvbiBmaW5kaW5nIG9yCiAgICAgICBjcmVhdGluZyBtb2RlczogbmV3IGRlc2t0b3AgdHlwZXMgYW5kIHNlcnZpY2UgcmVkaXJlY3Rpb24gb3B0aW9ucy4KICAgICAgIFBlcnNvbmFsIGN1cHNkIGRhZW1vbiBhbmQgU1NIIHBvcnQgcmVkaXJlY3Rpb24gaGVscGVyIGZvciB1c2Ugd2l0aAogICAgICAgU1NWTkMncyBUZXJtaW5hbCBTZXJ2aWNlcyBmZWF0dXJlLgogICAgICogUmV2ZXJzZSBWTkMgY29ubmVjdGlvbnMgdmlhIC1jb25uZWN0IHdvcmsgaW4gdGhlIC1maW5kLCAtY3JlYXRlCiAgICAgICBhbmQgcmVsYXRlZCAtZGlzcGxheSBXQUlUOi4uLiBtb2Rlcy4KICAgICAqIFJldmVyc2UgVk5DIGNvbm5lY3Rpb25zIChlaXRoZXIgbm9ybWFsIG9yIFNTTCkgY2FuIHVzZSBhIFdlYiBQcm94eQogICAgICAgb3IgYSBTT0NLUyBwcm94eSwgb3IgYSBTU0ggY29ubmVjdGlvbiwgb3IgZXZlbiBhIENHSSBVUkwgdG8gbWFrZQogICAgICAgdGhlIG91dGdvaW5nIGNvbm5lY3Rpb24uIFNlZTogLXByb3h5LiBGb3J3YXJkIGNvbm5lY3Rpb25zIGNhbiBhbHNvCiAgICAgICB1c2U6IC1zc2guCiAgICAgKiBSZXZlcnNlIFZOQyBjb25uZWN0aW9ucyB2aWEgdGhlIFVsdHJhVk5DIHJlcGVhdGVyIHByb3h5IChlaXRoZXIKICAgICAgIG5vcm1hbCBvciBTU0wpIGFyZSBzdXBwb3J0ZWQuIFVzZSBlaXRoZXIgdGhlICItY29ubmVjdAogICAgICAgcmVwZWF0ZXI9SUQ6Tk5OTitob3N0OnBvcnQiIG9yICItY29ubmVjdAogICAgICAgcmVwZWF0ZXI6Ly9ob3N0OnBvcnQrSUQ6Tk5OTiIgbm90YXRpb24uIFRoZSBTU1ZOQyBWTkMgdmlld2VyIGFsc28KICAgICAgIHN1cHBvcnRzIHRoZSBVbHRyYVZOQyByZXBlYXRlci4gQWxzbywgYSBwZXJsIHJlcGVhdGVyIGltcGxlbWVudGlvbgogICAgICAgaXMgaGVyZTogdWx0cmF2bmNfcmVwZWF0ZXIucGwKICAgICAqIFN1cHBvcnQgZm9yIGluZGV4ZWQgY29sb3JtYXBzIChQc2V1ZG9Db2xvcikgd2l0aCBkZXB0aHMgb3RoZXIgdGhhbgogICAgICAgOCAoZnJvbSAxIHRvIDE2IG5vdyB3b3JrKSBmb3Igbm9uLXN0YW5kYXJkIGhhcmR3YXJlLiBPcHRpb24KICAgICAgICItYWR2ZXJ0aXNlX3RydWVjb2xvciIgdG8gaGFuZGxlIHNvbWUgd29ya2Fyb3VuZCBpbiB0aGlzIG1vZGUuCiAgICAgKiBTdXBwb3J0IGZvciB0aGUgWllXUkxFIGVuY29kaW5nLCB0aGlzIGlzIHRoZSBSZWFsVk5DIFpSTEUgZW5jb2RpbmcKICAgICAgIGV4dGVuZGVkIHRvIGRvIG1vdGlvbiB2aWRlbyBhbmQgcGhvdG8gcmVnaW9ucyBtb3JlIGVmZmljaWVudGx5IGJ5CiAgICAgICB3YXkgb2YgYSBXYXZlbGV0IGJhc2VkIHRyYW5zZm9ybWF0aW9uLgogICAgICogVGhlIC1maW5kZHB5IGFuZCAtbGlzdGRweSB1dGlsaXRpZXMgaGVscCB0byBkZWJ1ZyBhbmQgY29uZmlndXJlCiAgICAgICB0aGUgLWZpbmQsIC1jcmVhdGUsIGFuZCAtZGlzcGxheSBXQUlUOi4uLiBtb2Rlcy4KICAgICAqIFNvbWUgYXV0b21hdGljIGRldGVjdGlvbiBvZiBzY3JlZW4gcmVzaXplcyBhcmUgaGFuZGxlZCBldmVuIGlmIHRoZQogICAgICAgLXhyYW5kciBvcHRpb24gaXMgbm90IHN1cHBsaWVkLgogICAgICogVGhlIC1hdXRvcG9ydCBvcHRpb25zIGdpdmVzIG1vcmUgY29udHJvbCBvdmVyIHRoZSBWTkMgcG9ydCB4MTF2bmMKICAgICAgIGNob29zZXMuCiAgICAgKiBUaGUgLXBpbmcgc2VjcyBjYW4gYmUgdXNlZCB0byBoZWxwIGtlZXAgaWRsZSBjb25uZWN0aW9ucyBhbGl2ZS4KICAgICAqIFBhc3Rpbmcgb2YgdGhlIHNlbGVjdGlvbi9jbGlwYm9hcmQgaW50byByZW1vdGUgYXBwbGljYXRpb25zIChlLmcuCiAgICAgICBKYXZhKSBoYXMgYmVlbiBpbXByb3ZlZC4KICAgICAqIEZpeGVkIGEgYnVnIGlmIGEgY2xpZW50IGRpc2Nvbm5lY3RzIGR1cmluZyB0aGUgJ3NwZWVkLWVzdGltYXRpb24nCiAgICAgICBwaGFzZS4KICAgICAqIFRvIHVuc2V0IENhcHNfTG9jaywgTnVtX0xvY2sgYW5kIHJhaXNlIGFsbCBrZXlzIGluIHRoZSBYIHNlcnZlcgogICAgICAgdXNlIC1jbGVhcl9hbGwuCiAgICAgKiBVc2FnZSB3aXRoIGR2b3JhayBrZXlib2FyZHMgaGFzIGJlZW4gaW1wcm92ZWQuIFNlZSBhbHNvOiAteGtiLgogICAgICogVGhlIEphdmEgVmlld2VyIGFwcGxldCBzb3VyY2UgY29kZSBpcyBub3cgaW5jbHVkZWQgaW4gdGhlCiAgICAgICB4MTF2bmMtMC45LioudGFyLmd6IHRhcmJhbGwuIFRoaXMgbWVhbnMgeW91IGNhbiBub3cgYnVpbGQgdGhlIEphdmEKICAgICAgIHZpZXdlciBhcHBsZXQgamFyIGZpbGVzIGZyb20gc291cmNlLiBJZiB5b3Ugc3RvcHBlZCBzaGlwcGluZyB0aGUKICAgICAgIEphdmEgdmlld2VyIGFwcGxldCBqYXIgZmlsZXMgZHVlIHRvIGxhY2sgb2Ygc291cmNlIGNvZGUsIHlvdSBjYW4KICAgICAgIHN0YXJ0IGFnYWluLgoKCiAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcHBlYXJlZCBpbiB0aGUgMC45LjMgcmVsZWFzZSAoT2N0LzIwMDcpOgogICAgICogVmlld2VyLXNpZGUgcGl4bWFwIGNhY2hpbmcuIEEgbGFyZ2UgYXJlYSBvZiBwaXhlbHMgKGF0IGxlYXN0IDItMwogICAgICAgdGltZXMgYXMgYmlnIGFzIHRoZSBmcmFtZWJ1ZmZlciBpdHNlbGY7IHRoZSBiaWdnZXIgdGhlIGJldHRlci4uLgogICAgICAgZGVmYXVsdCBpcyAxMFgpIGlzIHBsYWNlZCBiZWxvdyB0aGUgZnJhbWVidWZmZXIgdG8gYWN0IGFzIGEKICAgICAgIGJ1ZmZlci9jYWNoZSBhcmVhIGZvciBwaXhlbCBkYXRhLiBUaGUgVk5DIENvcHlSZWN0IGVuY29kaW5nIGlzCiAgICAgICB1c2VkIHRvIG1vdmUgaXQgYXJvdW5kLCBzbyBhbnkgdmlld2VyIGNhbiB0YWtlIGFkdmFudGFnZSBvZiBpdC4KICAgICAgIFVudGlsIHdlIHN0YXJ0IG1vZGlmeWluZyB2aWV3ZXJzIHlvdSB3aWxsIGJlIGFibGUgdG8gc2VlIHRoZSBjYWNoZQogICAgICAgYXJlYSBpZiB5b3Ugc2Nyb2xsIGRvd24gKHRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIGRlYnVnISkgRm9yCiAgICAgICB0ZXN0aW5nIHRoZSBkZWZhdWx0IGlzICItbmNhY2hlIDEwIi4gVGhlIHVuaXggRW5oYW5jZWQgVGlnaHRWTkMKICAgICAgIFZpZXdlciBzc3ZuYyBoYXMgYSBuaWNlIC15Y3JvcCBvcHRpb24gdG8gaGVscCBoaWRlIHRoZSBwaXhlbCBjYWNoZQogICAgICAgYXJlYSBmcm9tIHZpZXcuCgoKICAgSGVyZSBhcmUgc29tZSBmZWF0dXJlcyB0aGF0IGFwcGVhcmVkIGluIHRoZSAwLjkuMiByZWxlYXNlIChKdW4vMjAwNyk6CiAgICAgKiBCdWlsZGluZyB3aXRoIG5vIE9wZW5TU0wgbGlic3NsIGF2YWlsYWJsZSAob3Igd2l0aCAtLXdpdGhvdXQtc3NsKQogICAgICAgaGFzIGJlZW4gZml4ZWQuCiAgICAgKiBPbmUgY2FuIGNvbmZpZ3VyZSB4MTF2bmMgdmlhICIuL2NvbmZpZ3VyZQogICAgICAgLS13aXRoLXN5c3RlbS1saWJ2bmNzZXJ2ZXIiIHRvIHVzZSBhIHN5c3RlbSBpbnN0YWxsZWQgbGlidm5jc2VydmVyCiAgICAgICBsaWJyYXJ5IGluc3RlYWQgb2YgdGhlIG9uZSBidW5kbGVkIGluIHRoZSByZWxlYXNlIHRhcmJhbGwuCiAgICAgKiBJZiBVbHRyYVZOQyBmaWxlIHRyYW5zZmVyIG9yIGNoYXQgaXMgZGV0ZWN0ZWQsIHRoZW4gVk5DIGNsaWVudHMKICAgICAgIGFyZSAicGluZ2VkIiBtb3JlIG9mdGVuIHRvIHByZXZlbnQgdGhlc2Ugc2lkZSBjaGFubmVscyBmcm9tCiAgICAgICBiZWNvbWluZyBzZXJ2aWNlZCB0b28gaW5mcmVxdWVudGx5LgogICAgICogSW4gLXVuaXhwdyBtb2RlIGluIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgZGlhbG9nIG5vIHRleHQgd2lsbAogICAgICAgYmUgZWNob2VkIGlmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgc2VudCBpcyAiRXNjYXBlIi4gVGhpcyBlbmFibGVzIGEKICAgICAgIGNvbnZlbmllbmNlIGZlYXR1cmUgaW4gU1NWTkMgdG8gc2VuZCB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkCiAgICAgICBhdXRvbWF0aWNhbGx5LgoKCiAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcHBlYXJlZCBpbiB0aGUgMC45LjEgcmVsZWFzZSAoTWF5LzIwMDcpOgogICAgICogVGhlIFVsdHJhVk5DIEphdmEgdmlld2VyIGhhcyBiZWVuIGVuaGFuY2VkIHRvIHN1cHBvcnQgU1NMIChhcyB0aGUKICAgICAgIFRpZ2h0Vk5DIHZpZXdlciBoYWQgYmVlbiBwcmV2aW91c2x5LikgVGhlIFVsdHJhVk5DIEphdmEgc3VwcG9ydHMKICAgICAgIHVsdHJhdm5jIGZpbGV0cmFuc2ZlciwgYW5kIHNvIGNhbiBiZSB1c2VkIGFzIGEgVk5DIHZpZXdlciBvbiBVbml4CiAgICAgICB0aGF0IHN1cHBvcnRzIHVsdHJhdm5jIGZpbGV0cmFuc2Zlci4gSXQgaXMgaW4gdGhlCiAgICAgICBjbGFzc2VzL3NzbC9VbHRyYVZpZXdlclNTTC5qYXIgZmlsZSAodGhhdCBpcyBwb2ludGVkIHRvIGJ5CiAgICAgICB1bHRyYS52bmMuKSBUaGUgc2lnbmVkIGFwcGxldCBTaWduZWRVbHRyYVZpZXdlclNTTC5qYXIgdmVyc2lvbgogICAgICAgKHBvaW50ZWQgdG8gYnkgdWx0cmFzaWduZWQudm5jKSB3aWxsIGJlIG5lZWRlZCB0byBhY2Nlc3MgdGhlIGxvY2FsCiAgICAgICBkcml2ZSBpZiB5b3UgYXJlIHVzaW5nIGl0IGZvciBmaWxlIHRyYW5zZmVyIHZpYSBhIFdlYiBicm93c2VyLgogICAgICAgU29tZSBvdGhlciBidWdzIGluIHRoZSBVbHRyYVZOQyBKYXZhIHZpZXdlciB3ZXJlIGZpeGVkIGFuZCBhIGZldwogICAgICAgaW1wcm92ZW1lbnRzIHRvIHRoZSBVSSBtYWRlLgogICAgICogQSBuZXcgVW5peCB1c2VybmFtZSBsb2dpbiBtb2RlIGZvciBWTkMgVmlld2VycyBhdXRoZW50aWNhdGVkIHZpYSBhCiAgICAgICBDbGllbnQgU1NMIENlcnRpZmljYXRlOiAiLXVzZXJzIHNzbHBlZXI9Ii4gVGhlIGVtYWlsQWRkcmVzcwogICAgICAgc3ViamVjdCBmaWVsZCBpcyBpbnNwZWN0ZWQgZm9yIHVzZXJuYW1lQGhvc3RuYW1lIGFuZCB0aGVuIGFjdHMgYXMKICAgICAgIHRob3VnaCAiLXVzZXJzICt1c2VybmFtZSIgaGFzIGJlZW4gc3VwcGxpZWQuIFRoaXMgd2F5IHRoZSBVbml4CiAgICAgICB1c2VybmFtZSBpcyBpZGVudGlmaWVkIGJ5IChpLmUuIHNpbXBseSBleHRyYWN0ZWQgZnJvbSkgdGhlIENsaWVudAogICAgICAgU1NMIENlcnRpZmljYXRlLiBUaGlzIGNvdWxkIGJlIHVzZWZ1bCB3aXRoIC1maW5kLCAtY3JlYXRlIGFuZCAtc3ZjCiAgICAgICBtb2RlcyBpZiB5b3UgYXJlIGFsc28gaGF2ZSBzZXQgdXAgYW5kIHVzZSBWTkMgQ2xpZW50IFNTTAogICAgICAgQ2VydGlmaWNhdGUgYXV0aGVudGljYXRpb24uCiAgICAgKiBGb3IgZXh0ZXJuYWwgZGlzcGxheSBmaW5kaW5nL2NyZWF0aW5nIHByb2dyYW1zIChlLmcuIFdBSVQ6Y21kPS4uLikKICAgICAgIGlmIHRoZSBWTkMgVmlld2VyIGlzIGF1dGhlbnRpY2F0ZWQgdmlhIGEgQ2xpZW50IFNTTCBDZXJ0aWZpY2F0ZSwKICAgICAgIHRoZW4gdGhhdCBDZXJ0aWZpY2F0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICAgICBSRkJfU1NMX0NMSUVOVF9DRVJULgoKCiAgIEhlcmUgYXJlIHNvbWUgZmVhdHVyZXMgdGhhdCBhcHBlYXJlZCBpbiB0aGUgMC45IHJlbGVhc2UgKEFwci8yMDA3KToKICAgICAqIFZOQyBTZXJ2aWNlIGFkdmVydGlzaW5nIHZpYSBtRE5TIC8gWmVyb0NvbmYgLyBCb25Kb3VyIHdpdGggdGhlCiAgICAgICBBdmFoaSBjbGllbnQgbGlicmFyeS4gRW5hYmxlIHZpYSAiLWF2YWhpIiBvciAiLXplcm9jb25mIi4KICAgICAqIEltcGxlbWVudGF0aW9ucyBvZiBVbHRyYVZOQydzIFRleHRDaGF0LCBTaW5nbGVXaW5kb3csIGFuZAogICAgICAgU2VydmVySW5wdXQgZXh0ZW5zaW9ucyAocmVxdWlyZXMgdWx0cmF2bmMgdmlld2VyIG9yIHNzdm5jIFVuaXgKICAgICAgIHZpZXdlci4pIFRoZXkgdG9nZ2xlIHRoZSBzZWxlY3Rpb24gb2YgYSBzaW5nbGUgd2luZG93ICgtaWQpLCBhbmQKICAgICAgIGRpc2FibGUgKGZyaWVuZGx5KSB1c2VyIGlucHV0IGFuZCB2aWV3aW5nIChtb25pdG9yIGJsYW5rKSBhdCB0aGUKICAgICAgIFZOQyBzZXJ2ZXIuCiAgICAgKiBTaG9ydCBhbGlhc2VzICItZmluZCIsICItY3JlYXRlIiwgIi1zdmMiLCBhbmQgIi14ZG1zdmMiIGZvcgogICAgICAgY29tbW9ubHkgdXNlZCBGSU5EQ1JFQVRFRElTUExBWSB1c2FnZSBtb2Rlcy4KICAgICAqIFJldmVyc2UgVk5DIGNvbm5lY3Rpb25zICh2aWV3ZXIgbGlzdGVuaW5nKSBub3cgd29yayBpbiBTU0wgKC1zc2wpCiAgICAgICBtb2RlLgogICAgICogTmV3IG9wdGlvbnMgdG8gY29udHJvbCB0aGUgTW9uaXRvciBwb3dlciBzdGF0ZSBhbmQga2V5Ym9hcmQvbW91c2UKICAgICAgIGdyYWJiaW5nOiAtZm9yY2VkcG1zLCAtY2xpZW50ZHBtcywgLW5vc2VydmVyZHBtcywgYW5kIC1ncmFiYWx3YXlzLgogICAgICogQSBzaW1wbGUgd2F5IHRvIGVtdWxhdGUgaW5ldGQoOCkgdG8gc29tZSBkZWdyZWUgdmlhIHRoZSAiLWxvb3BiZyIKICAgICAgIG9wdGlvbi4KICAgICAqIE1vbml0b3IgdGhlIGFjY3VyYWN5IG9mIFhEQU1BR0UgYW5kIGFwcGx5ICItbm94ZGFtYWdlIiBpZiBpdCBpcwogICAgICAgbm90IHdvcmtpbmcgd2VsbC4gT3BlbkdMIGFwcGxpY2F0aW9ucyBsaWtlIGxpa2UgYmVyeWwgYW5kIE15dGhUdgogICAgICAgaGF2ZSBiZWVuIHNob3duIHRvIG1ha2UgWERBTUFHRSBub3Qgd29yayBwcm9wZXJseS4KICAgICAqIEZvciBKYXZhIFNTTCBjb25uZWN0aW9ucyBpbnZvbHZpbmcgYSByb3V0ZXIvZmlyZXdhbGwgcG9ydAogICAgICAgcmVkaXJlY3Rpb24sIGFuIG9wdGlvbiAtaHR0cHNyZWRpciB0byBzcGFyZSB0aGUgdXNlciBmcm9tIG5lZWRpbmcKICAgICAgIHRvIGluY2x1ZGUgJlBPUlQ9Tk5OIGluIHRoZSBicm93c2VyIFVSTC4KCgogICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOC40IHJlbGVhc2UgKEZlYi8yMDA3KToKICAgICAqIE5hdGl2ZSBNYWMgT1MgWCBBcXVhL1F1YXJ0eiBzdXBwb3J0LiAoaS5lLiBPU1h2bmMgYWx0ZXJuYXRpdmU7CiAgICAgICBzb21lIGFjdGl2aXRpZXMgYXJlIGZhc3RlcikKICAgICAqIEEgbmV3IGxvZ2luIG1vZGU6ICItZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWSAtdW5peHB3CiAgICAgICAuLi4iIHRoYXQgd2lsbCBDcmVhdGUgYSBuZXcgWCBzZXNzaW9uIChlaXRoZXIgdmlydHVhbCBvciByZWFsIGFuZAogICAgICAgd2l0aCBvciB3aXRob3V0IGEgZGlzcGxheSBtYW5hZ2VyLCBlLmcuIGtkbSkgZm9yIHRoZSB1c2VyIGlmIGl0CiAgICAgICBjYW5ub3QgZmluZCB0aGUgdXNlcidzIFggc2Vzc2lvbiBkaXNwbGF5IHZpYSB0aGUgRklORERJU1BMQVkKICAgICAgIG1ldGhvZC4gU2VlIHRoZSAtc3ZjIGFuZCB0aGUgLXhkbXN2YyBhbGlhc2VzLgogICAgICogeDExdm5jIGNhbiBhY3QgYXMgYSBWTkMgcmVmbGVjdG9yL3JlcGVhdGVyIHVzaW5nIHRoZSAiLXJlZmxlY3QKICAgICAgIGhvc3Q6TiIgb3B0aW9uLiBJbnN0ZWFkIG9mIHBvbGxpbmcgYW4gWCBkaXNwbGF5LCB0aGUgcmVtb3RlIFZOQwogICAgICAgU2VydmVyIGhvc3Q6TiBpcyBjb25uZWN0ZWQgdG8gYW5kIHJlLWV4cG9ydGVkIHZpYSBWTkMuIFRoaXMgaXMKICAgICAgIGludGVuZGVkIGZvciB1c2UgaW4gYnJvYWRjYXN0aW5nIGEgZGlzcGxheSB0byBtYW55IChlLmcuID4gMTY7CiAgICAgICBjbGFzc3Jvb20gb3IgbGFyZ2UgZGVtbykgVk5DIHZpZXdlcnMgd2hlcmUgYmFuZHdpZHRoIGFuZCBvdGhlcgogICAgICAgcmVzb3VyY2VzIGFyZSBjb25zZXJ2ZWQgYnkgc3ByZWFkaW5nIHRoZSBsb2FkIG92ZXIgYSBudW1iZXIgb2YKICAgICAgIHJlcGVhdGVycy4KICAgICAqIFdpcmVmcmFtZSBjb3B5cmVjdCBkZXRlY3Rpb24gZm9yIGxvY2FsIHVzZXIgYWN0aXZpdHkgKGUuZy4gc29tZW9uZQogICAgICAgc2l0dGluZyBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBtb3Zpbmcgd2luZG93cykgVXNlCiAgICAgICAtbm93aXJlZnJhbWVsb2NhbCB0byBkaXNhYmxlLgogICAgICogVGhlICItTiIgb3B0aW9uIGNvdXBsZXMgdGhlIFZOQyBEaXNwbGF5IG51bWJlciB0byB0aGUgWCBEaXNwbGF5CiAgICAgICBudW1iZXIuIEUuZy4gaWYgeW91ciBYIERJU1BMQVkgaXMgOjIgdGhlbiB0aGUgVk5DIGRpc3BsYXkgd2lsbCBiZQogICAgICAgOjIgKGkuZS4gdXNpbmcgcG9ydCA1OTAyLikgSWYgdGhhdCBwb3J0IGlzIHRha2VuIHgxMXZuYyB3aWxsIGV4aXQuCiAgICAgKiBPcHRpb24gLW5vZHBtcyB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIHByb2dyYW1zIGxpa2UgS0RFJ3MKICAgICAgIGtkZXNrdG9wX2xvY2sgdGhhdCBrZWVwIHJlc3RhcnRpbmcgdGhlIHNjcmVlbiBzYXZlciBldmVyeSBmZXcKICAgICAgIHNlY29uZHMuCiAgICAgKiBUbyBhdXRvbWF0aWNhbGx5IGZpeCB0aGUgY29tbW9uIG1vdXNlIG1vdGlvbiBwcm9ibGVtIG9uIFhJTkVSQU1BCiAgICAgICAobXVsdGktaGVhZGVkKSBkaXNwbGF5cywgdGhlIC14d2FycHBvaW50ZXIgb3B0aW9uIGlzIGVuYWJsZWQgYnkKICAgICAgIGRlZmF1bHQgd2hlbiBYSU5FUkFNQSBpcyBhY3RpdmUuCgogICBJZiB5b3UgaGF2ZSBhIE1hYyBwbGVhc2UgdHJ5IG91dCB0aGUgbmF0aXZlIE1hYyBPUyBYIHN1cHBvcnQsIGJ1aWxkCiAgIHdpdGggIi4vY29uZmlndXJlIC0td2l0aG91dC14Iiwgb3IgZG93bmxvYWQgYSBiaW5hcnkgbWVudGlvbmVkIGFib3ZlLAogICAoZXZlbiBpZiB5b3UgZG9uJ3QgcGxhbiBvbiBldmVyIHVzaW5nIGl0IGluIHRoaXMgbW9kZSEpLCBhbmQgbGV0IG1lCiAgIGtub3cgaG93IGl0IHdlbnQuIFRoYW5rcy4KCgogICBIZXJlIGFyZSBzb21lIGZlYXR1cmVzIHRoYXQgYXBwZWFyZWQgaW4gdGhlIDAuOC4zIHJlbGVhc2UgKE5vdi8yMDA2KToKICAgICAqIFRoZSAtc3NsIG9wdGlvbiBwcm92aWRlcyBTU0wgZW5jcnlwdGlvbiBhbmQgYXV0aGVudGljYXRpb24KICAgICAgIG5hdGl2ZWx5IHZpYSB0aGUgd3d3Lm9wZW5zc2wub3JnIGxpYnJhcnkuIE9uZSBjYW4gdXNlIGZyb20gYQogICAgICAgc2ltcGxlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIHNlcnZlciBjZXJ0aWZpY2F0ZSB1cCB0byBmdWxsIENBCiAgICAgICBhbmQgY2xpZW50IGNlcnRpZmljYXRlIGF1dGhlbnRpY2F0aW9uIHNjaGVtZXMuCiAgICAgKiBTaW1pbGFyIHRvIC1zc2wsIHRoZSAtc3R1bm5lbCBvcHRpb24gc3RhcnRzIHVwIGEgU1NMIHR1bm5lbCBzZXJ2ZXIKICAgICAgIHN0dW5uZWwgKHRoYXQgbXVzdCBiZSBpbnN0YWxsZWQgc2VwYXJhdGVseSBvbiB0aGUgc3lzdGVtOgogICAgICAgc3R1bm5lbC5taXJ0Lm5ldCApIHRvIGFsbG93IG9ubHkgZW5jcnlwdGVkIFNTTCBjb25uZWN0aW9ucyBmcm9tCiAgICAgICB0aGUgbmV0d29yay4KICAgICAqIFRoZSAtc3NsdmVyaWZ5IG9wdGlvbiBhbGxvd3MgZm9yIGF1dGhlbnRpY2F0aW5nIFZOQyBjbGllbnRzIHZpYQogICAgICAgdGhlaXIgY2VydGlmaWNhdGVzIGluIGVpdGhlciAtc3NsIG9yIC1zdHVubmVsIG1vZGVzLgogICAgICogQ2VydGlmaWNhdGUgY3JlYXRpb24gYW5kIG1hbmFnZW1lbnQgdG9vbHMgYXJlIHByb3ZpZGUgaW4gdGhlCiAgICAgICAtc3NsR2VuQ2VydCwgLXNzbEdlbkNBLCBhbmQgcmVsYXRlZCBvcHRpb25zLgogICAgICogQW4gU1NMIGVuYWJsZWQgSmF2YSBhcHBsZXQgVk5DIFZpZXdlciBhcHBsZXQgaXMgcHJvdmlkZWQgYnkgeDExdm5jCiAgICAgICBpbiBjbGFzc2VzL3NzbC9WbmNWaWV3ZXIuamFyLiBJbiBhZGRpdGlvbiB0byBub3JtYWwgSFRUUCwgdGhlCiAgICAgICBhcHBsZXQgbWF5IGJlIGxvYWRlZCBpbnRvIHRoZSB3ZWIgYnJvd3NlciB2aWEgSFRUUFMgKEhUVFAgb3ZlcgogICAgICAgU1NMLikgKG9uZSBjYW4gdXNlIHRoZSBWTkMgcG9ydCwgZS5nLiBodHRwczovL2hvc3Q6NTkwMC8sIG9yIGFsc28KICAgICAgIHRoZSBzZXBhcmF0ZSAtaHR0cHMgcG9ydCBvcHRpb24uKSBBIHdyYXBwZXIgc2hlbGwgc2NyaXB0CiAgICAgICBzc192bmN2aWV3ZXIgaXMgYWxzbyBwcm92aWRlZCB0aGF0IHNldHMgdXAgYSBzdHVubmVsIGNsaWVudC1zaWRlCiAgICAgICB0dW5uZWwgb24gVW5peCBzeXN0ZW1zLiBTZWUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgZm9yCiAgICAgICBvdGhlciBTU0wvU1NIIHZpZXdlciBwb3NzaWJpbGl0aWVzLgogICAgICogVGhlIC11bml4cHcgb3B0aW9uIHN1cHBvcnRzIFVuaXggdXNlcm5hbWUgYW5kIHBhc3N3b3JkCiAgICAgICBhdXRoZW50aWNhdGlvbiAoYSBzaW1wbGVyIHZhcmlhbnQgaXMgdGhlIC11bml4cHdfbmlzIG9wdGlvbiB0aGF0CiAgICAgICB3b3JrcyBpbiBlbnZpcm9ubWVudHMgd2hlcmUgdGhlIGVuY3J5cHRlZCBwYXNzd29yZHMgYXJlIHJlYWRhYmxlLAogICAgICAgZS5nLiBOSVMuKSBUaGUgLXNzbCBvciAtbG9jYWxob3N0ICsgLXN0dW5uZWwgb3B0aW9ucyBhcmUgZW5mb3JjZWQKICAgICAgIGluIHRoaXMgbW9kZSB0byBwcmV2ZW50IHBhc3N3b3JkIHNuaWZmaW5nLiBBcyBhIGNvbnZlbmllbmNlLCB0aGVzZQogICAgICAgcmVxdWlyZW1lbnRzIGFyZSBsaWZ0ZWQgaWYgYSBTU0ggdHVubmVsIGNhbiBiZSBkZWR1Y2VkIChidXQKICAgICAgIC1sb2NhbGhvc3Qgc3RpbGwgYXBwbGllcy4pCiAgICAgKiBDb3VwbGluZyAtdW5peHB3IHdpdGggIi1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRESVNQTEFZIiBvciAiLWRpc3BsYXkKICAgICAgIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZIiBwcm92aWRlcyBhIHdheSB0byBhbGxvdyBhIHVzZXIgdG8KICAgICAgIGxvZ2luIHdpdGggdGhlaXIgVU5JWCBwYXNzd29yZCBhbmQgaGF2ZSB0aGVpciBkaXNwbGF5IGNvbm5lY3RlZCB0bwogICAgICAgYXV0b21hdGljYWxseS4gU2VlIHRoZSAtc3ZjIGFuZCB0aGUgLXhkbXN2YyBhbGlhc2VzLgogICAgICogSG9va3MgYXJlIHByb3ZpZGVkIGluIHRoZSAtdW5peHB3X2NtZCBhbmQgIi1wYXNzd2RmaWxlCiAgICAgICBjbWQ6LGN1c3RvbTouLi4iIG9wdGlvbnMgdG8gYWxsb3cgeW91IHRvIHN1cHBseSB5b3VyIG93bgogICAgICAgYXV0aGVudGljYXRpb24gYW5kIHBhc3N3b3JkIGxvb2t1cCBwcm9ncmFtcy4KICAgICAqIHgxMXZuYyBjYW4gYmUgY29uZmlndXJlZCBhbmQgYnVpbHQgdG8gbm90IGRlcGVuZCBvbiBYMTEgbGlicmFyaWVzCiAgICAgICAiLi9jb25maWd1cmUgLS13aXRob3V0LXgiIGZvciAtcmF3ZmIgb25seSBvcGVyYXRpb24gKGUuZy4gZW1iZWRkZWQKICAgICAgIGxpbnV4IGNvbnNvbGUgZGV2aWNlcy4pCiAgICAgKiBUaGUgLXJvdGF0ZSBvcHRpb24gZW5hYmxlcyB5b3UgdG8gcm90YXRlIG9yIHJlZmxlY3QgdGhlIHNjcmVlbgogICAgICAgYmVmb3JlIGV4cG9ydGluZyB2aWEgVk5DLiBUaGlzIGlzIGludGVuZGVkIGZvciB1c2Ugb24gaGFuZGhlbGRzCiAgICAgICBhbmQgb3RoZXIgZGV2aWNlcyB3aGVyZSB0aGUgcm90YXRpb24gb3JpZW50YXRpb24gaXMgbm90ICJuYXR1cmFsIi4KICAgICAqIFRoZSAiLXVsdHJhZmlsZXhmZXIiIGFsaWFzIGlzIHByb3ZpZGVkIGFuZCBpbXByb3ZlZCBVbHRyYVZOQwogICAgICAgZmlsZXRyYW5zZmVyIHJhdGVzIGhhdmUgYmVlbiBhY2hpZXZlZC4KICAgICAqIFVuZGVyIHRoZSAiLWNvbm5lY3Rfb3JfZXhpdCBob3N0IiBvcHRpb24geDExdm5jIHdpbGwgZXhpdAogICAgICAgaW1tZWRpYXRlbHkgdW5sZXNzIHRoZSByZXZlcnNlIGNvbm5lY3Rpb24gdG8gaG9zdCBzdWNjZWVkcy4gVGhlCiAgICAgICAiLXJmYnBvcnQgMCIgb3B0aW9uIGRpc2FibGVzIFRDUCBsaXN0ZW5pbmcgZm9yIGNvbm5lY3Rpb25zICh1c2VmdWwKICAgICAgIGZvciB0aGlzIG1vZGUuKQogICAgICogVGhlICItcmF3ZmIgcmFuZCIgYW5kICItcmF3ZmIgbm9uZSIgb3B0aW9ucyBhcmUgdXNlZnVsIGZvciB0ZXN0aW5nCiAgICAgICBhdXRvbWF0aW9uIHNjcmlwdHMsIGV0Yy4sIHdpdGhvdXQgcmVxdWlyaW5nIGEgZnVsbCBkZXNrdG9wLgogICAgICogUmVkdWNlZCBzcGV3aW5nIG9mIGluZm9ybWF0aW9uIGF0IHN0YXJ0dXAsIHVzZSAiLXZlcmJvc2UiIChhbHNvCiAgICAgICAiLXYiKSB0byB0dXJuIGl0IGJhY2sgb24gZm9yIGRlYnVnZ2luZyBvciBpZiB5b3UgYXJlIGdvaW5nIHRvIHNlbmQKICAgICAgIG1lIGEgcHJvYmxlbSByZXBvcnQuCgogICBIZXJlIGFyZSBzb21lIFByZXZpb3VzIFJlbGVhc2UgTm90ZXMKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIFNvbWUgTm90ZXM6CgogICBCb3RoIGEgY2xpZW50IGFuZCBhIHNlcnZlcjogICBJdCBpcyBzb21ldGltZXMgY29uZnVzaW5nIHRvIHBlb3BsZSB0aGF0CiAgIHgxMXZuYyBpcyBib3RoIGEgY2xpZW50IGFuZCBhIHNlcnZlciBhdCB0aGUgc2FtZSB0aW1lLiBJdCBpcyBhbiBYCiAgIGNsaWVudCBiZWNhdXNlIGl0IGNvbm5lY3RzIHRvIHRoZSBydW5uaW5nIFggc2VydmVyIHRvIGRvIHRoZSBzY3JlZW4KICAgcG9sbHMuIFRoaW5rIG9mIGl0IGFzIGEgcmF0aGVyIGVmZmljaWVudCAic2NyZWVuc2hvdCIgcHJvZ3JhbSBydW5uaW5nCiAgIGNvbnRpbnVvdXNseS4gSXQgaXMgYSBzZXJ2ZXIgaW4gdGhlIHNlbnNlIHRoYXQgaXQgaXMgYSBWTkMgc2VydmVyIHRoYXQKICAgVk5DIHZpZXdlcnMgb24gdGhlIG5ldHdvcmsgY2FuIGNvbm5lY3QgdG8gYW5kIHZpZXcgdGhlIHNjcmVlbgogICBmcmFtZWJ1ZmZlciBpdCBtYW5hZ2VzLgoKICAgV2hlbiB0cnlpbmcgdG8gZGVidWcgcHJvYmxlbXMsIHJlbWVtYmVyIHRvIHRoaW5rIG9mIGJvdGggcm9sZXMuIEUuZy4KICAgImhvdyBpcyB4MTF2bmMgY29ubmVjdGluZyB0byB0aGUgWCBzZXJ2ZXI/IiwgImhvdyBpcyB0aGUgdm5jdmlld2VyCiAgIGNvbm5lY3RpbmcgdG8geDExdm5jPyIsICJ3aGF0IHBlcm1pdHMvcmVzdHJpY3RzIHRoZSBjb25uZWN0aW9uPyIuIEJvdGgKICAgbGlua3MgbWF5IGhhdmUgcmVhY2hhYmlsaXR5LCBwZXJtaXNzaW9uLCBhbmQgb3RoZXIgaXNzdWVzLgoKICAgTmV0d29yayBwZXJmb3JtYW5jZTogICBXaGV0aGVyIHlvdSBhcmUgdXNpbmcgWHZuYyBvciB4MTF2bmMgaXQgaXMKICAgYWx3YXlzIGEgZ29vZCBpZGVhIHRvIGhhdmUgYSBzb2xpZCBiYWNrZ3JvdW5kIGNvbG9yIGluc3RlYWQgb2YgYQogICBwcmV0dHkgYmFja2dyb3VuZCBpbWFnZS4gRWFjaCBhbmQgZXZlcnkgcmUtZXhwb3N1cmUgb2YgdGhlIGJhY2tncm91bmQKICAgbXVzdCBiZSByZXNlbnQgb3ZlciB0aGUgbmV0d29yazogYmV0dGVyIHRvIGhhdmUgdGhhdCBiYWNrZ3JvdW5kIGJlIGEKICAgc29saWQgY29sb3IgdGhhdCBjb21wcmVzc2VzIHZlcnkgd2VsbCBjb21wYXJlZCB0byBhIHBob3RvIGltYWdlLiAoVGhpcwogICBpcyBvbmUgcGxhY2Ugd2hlcmUgdGhlIFggcHJvdG9jb2wgaGFzIGFuIGFkdmFudGFnZSBvdmVyIHRoZSBWTkMKICAgcHJvdG9jb2wuKSBJIHN1Z2dlc3QgdXNpbmcgeHNldHJvb3QsIGR0c3R5bGUgb3Igc2ltaWxhciB1dGlsaXR5IHRvIHNldAogICBhIHNvbGlkIGJhY2tncm91bmQgd2hpbGUgdXNpbmcgeDExdm5jLiBZb3UgY2FuIHR1cm4gdGhlIHByZXR0eQogICBiYWNrZ3JvdW5kIGltYWdlIGJhY2sgb24gd2hlbiB5b3UgYXJlIHVzaW5nIHRoZSBkaXNwbGF5IGRpcmVjdGx5LgogICBVcGRhdGU6IEFzIG9mIEZlYi8yMDA1IHgxMXZuYyBoYXMgdGhlIC1zb2xpZCBbY29sb3JdIG9wdGlvbiB0aGF0IHdvcmtzCiAgIG9uIHJlY2VudCBHTk9NRSwgS0RFLCBhbmQgQ0RFIGFuZCBhbHNvIG9uIGNsYXNzaWMgWCAoYmFja2dyb3VuZCBpbWFnZQogICBpcyBvbiB0aGUgcm9vdCB3aW5kb3cuKSBVcGRhdGU6IEFzIG9mIE9jdC8yMDA3IHgxMXZuYyBoYXMgdGhlIC1uY2FjaGUKICAgb3B0aW9uIHRoYXQgZG9lcyBhIHJlYXNvbmFibGUgam9iIGNhY2hpbmcgdGhlIGJhY2tncm91bmQgKGFuZCBvdGhlcikKICAgcGl4bWFwIGRhdGEgb24gdGhlIHZpZXdlciBzaWRlLgoKICAgSSBhbHNvIGZpbmQgdGhlIFRpZ2h0Vk5DIGVuY29kaW5nIGdpdmVzIHRoZSBiZXN0IHJlc3BvbnNlIGZvciBteSB1c2FnZQogICAoVW5peCA8LT4gVW5peCBvdmVyIGNhYmxlIG1vZGVtLikgT25lIG5lZWRzIGEgdGlnaHR2bmMtYXdhcmUgdm5jdmlld2VyCiAgIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgZW5jb2RpbmcuCgogICBUQ1AgcG9ydCBpc3N1ZXM6ICAgTm90aWNlIHRoZSBsaW5lcwogIDE4LzA3LzIwMDMgMTQ6MzY6MzEgQXV0b3Byb2Jpbmcgc2VsZWN0ZWQgcG9ydCA1OTAwCiAgUE9SVD01OTAwCgogICBpbiB0aGUgb3V0cHV0LiA1OTAwIGlzIHRoZSBkZWZhdWx0IFZOQyBsaXN0ZW5pbmcgcG9ydCAoanVzdCBsaWtlIDYwMDAKICAgaXMgWDExJ3MgZGVmYXVsdCBsaXN0ZW5pbmcgcG9ydC4pIEhhZCBwb3J0IDU5MDAgYmVlbiB0YWtlbiBieSBzb21lCiAgIG90aGVyIGFwcGxpY2F0aW9uLCB4MTF2bmMgd291bGQgaGF2ZSBuZXh0IHRyaWVkIDU5MDEuIFRoYXQgd291bGQgbWVhbgogICB0aGUgdmlld2VyIGNvbW1hbmQgYWJvdmUgc2hvdWxkIGJlIGNoYW5nZWQgdG8gdm5jdmlld2VyCiAgIGZhci1hd2F5LmVhc3Q6MS4gWW91IGNhbiBmb3JjZSB0aGUgcG9ydCB3aXRoIHRoZSAiLXJmYnBvcnQgTk5OTiIKICAgb3B0aW9uIHdoZXJlIE5OTk4gaXMgdGhlIGRlc2lyZWQgcG9ydCBudW1iZXIuIElmIHRoYXQgcG9ydCBpcyBhbHJlYWR5CiAgIHRha2VuLCB4MTF2bmMgd2lsbCBleGl0IGltbWVkaWF0ZWx5LiBUaGUgIi1OIiBvcHRpb24gd2lsbCB0cnkgdG8gbWF0Y2gKICAgdGhlIFZOQyBkaXNwbGF5IG51bWJlciB0byB0aGUgWCBkaXNwbGF5LiAgIChhbHNvIHNlZSB0aGUgIlN1blJheQogICBHb3RjaGEiIG5vdGUgYmVsb3cpCgogICBPcHRpb25zOiAgIHgxMXZuYyBoYXMgKGZhciB0b28pIG1hbnkgZmVhdHVyZXMgdGhhdCBtYXkgYmUgYWN0aXZhdGVkCiAgIHZpYSBpdHMgY29tbWFuZCBsaW5lIG9wdGlvbnMuIFVzZWZ1bCBvcHRpb25zIGFyZSwgZS5nLiwgLXNjYWxlIHRvIGRvCiAgIHNlcnZlci1zaWRlIHNjYWxpbmcsIGFuZCAtcmZiYXV0aCBwYXNzd2QtZmlsZSB0byB1c2UgVk5DIHBhc3N3b3JkCiAgIHByb3RlY3Rpb24gKHRoZSB2bmNwYXNzd2Qgb3Igc3RvcmVwYXNzd2QgcHJvZ3JhbXMsIG9yIHRoZSB4MTF2bmMKICAgLXN0b3JlcGFzc3dkIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgdGhlIHBhc3N3b3JkIGZpbGUuKQoKICAgQWxnb3JpdGhtOiAgIEhvdyBkb2VzIHgxMXZuYyBkbyBpdD8gUmF0aGVyIGJydXRlLWZvcmNlZGx5OiBpdAogICBjb250aW51b3VzbHkgcG9sbHMgdGhlIFgxMSBmcmFtZWJ1ZmZlciBmb3IgY2hhbmdlcyB1c2luZwogICBYU2htR2V0SW1hZ2UoKS4gV2hlbiBjaGFuZ2VzIGFyZSBkaXNjb3ZlcmVkLCBpdCBpbnN0cnVjdHMgbGlidm5jc2VydmVyCiAgIHdoaWNoIHJlY3Rhbmd1bGFyIHJlZ2lvbnMgb2YgdGhlIGZyYW1lYnVmZmVyIGhhdmUgY2hhbmdlZCwgYW5kCiAgIGxpYnZuY3NlcnZlciBjb21wcmVzc2VzIHRoZSBjaGFuZ2VzIGFuZCBzZW5kcyB0aGVtIG9mZiB0byBhbnkKICAgY29ubmVjdGVkIFZOQyB2aWV3ZXJzLiBBIG51bWJlciBvZiBhcHBsaWNhdGlvbnMgZG8gc2ltaWxhciB0aGluZ3MsCiAgIHN1Y2ggYXMgeDByZmJzZXJ2ZXIsIGtyZmIsIHgwdm5jc2VydmVyLCB2aW5vLiB4MTF2bmMgdXNlcyBhIDMyIHggMzIKICAgcGl4ZWwgdGlsZSBtb2RlbCAodGhlIGRlc2t0b3AgaXMgZGVjb21wb3NlZCBpbnRvIHJvdWdobHkgMTAwMCBzdWNoCiAgIHRpbGVzKSwgd2hlcmUgY2hhbmdlZCB0aWxlcyBhcmUgZm91bmQgYnkgcHNldWRvLXJhbmRvbWx5IHBvbGxpbmcgMQogICBwaXhlbCB0YWxsIGhvcml6b250YWwgc2NhbmxpbmVzIHNlcGFyYXRlZCB2ZXJ0aWNhbGx5IGJ5IDMyIHBpeGVscy4KICAgVGhpcyBpcyBhIHN1cnByaXNpbmdseSBlZmZlY3RpdmUgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGNoYW5nZWQKICAgcmVnaW9ucy4gRm9yIGtleWJvYXJkIGFuZCBtb3VzZSB1c2VyIGlucHV0IHRoZSBYVEVTVCBleHRlbnNpb24gaXMgdXNlZAogICB0byBwYXNzIHRoZSBpbnB1dCBldmVudHMgdG8gdGhlIFggc2VydmVyLiBUbyBkZXRlY3QgWEJlbGwgImJlZXBzIiB0aGUKICAgWEtFWUJPQVJEIGV4dGVuc2lvbiBpcyB1c2VkLiBJZiBhdmFpbGFibGUsIHRoZSBYRklYRVMgZXh0ZW5zaW9uIGlzCiAgIHVzZWQgdG8gcmV0cmlldmUgdGhlIGN1cnJlbnQgbW91c2UgY3Vyc29yIHNoYXBlLiBBbHNvLCBpZiBhdmFpbGFibGUKICAgdGhlIFggREFNQUdFIGV4dGVuc2lvbiBpcyB1c2VkIHRvIHJlY2VpdmUgaGludHMgZnJvbSB0aGUgWCBzZXJ2ZXIKICAgd2hlcmUgbW9kaWZpZWQgcmVnaW9ucyBvbiB0aGUgc2NyZWVuIGFyZS4gVGhpcyBncmVhdGx5IHJlZHVjZXMgdGhlCiAgIHN5c3RlbSBsb2FkIHdoZW4gbm90IG11Y2ggaXMgY2hhbmdpbmcgb24gdGhlIHNjcmVlbiBhbmQgYWxzbyBpbXByb3ZlcwogICBob3cgcXVpY2tseSB0aGUgc2NyZWVuIGlzIHVwZGF0ZWQuCgogICBCYXJiZXJzaG9wIG1pcnJvcnMgZWZmZWN0OiAgIFdoYXQgaWYgeDExdm5jIGlzIHN0YXJ0ZWQgdXAsIGFuZAogICB2bmN2aWV3ZXIgaXMgdGhlbiBzdGFydGVkIHVwIG9uIHRoZSBzYW1lIG1hY2hpbmUgYW5kIGRpc3BsYXllZCBvbiB0aGUKICAgc2FtZSBkaXNwbGF5IHgxMXZuYyBpcyBwb2xsaW5nPyBPbmUgbWlnaHQgImFjY2lkZW50YWxseSIgZG8gdGhpcyB3aGVuCiAgIGZpcnN0IHRlc3Rpbmcgb3V0IHRoZSBwcm9ncmFtcy4gWW91IGdldCBhbiBpbnRlcmVzdGluZwogICByZWN1cnNpdmUvZmVlZGJhY2sgZWZmZWN0IHdoZXJlIHZuY3ZpZXdlciBpbWFnZXMga2VlcCBwb3BwaW5nIHVwIGVhY2gKICAgb25lIGNvbnRhaW5lZCBpbiB0aGUgcHJldmlvdXMgb25lIGFuZCBzbGlnaHRseSBzaGlmdGVkIGEgYml0IGJ5IHRoZQogICB3aW5kb3cgbWFuYWdlciBkZWNvcmF0aW9ucy4gVGhlcmUgd2lsbCBiZSBhbiBldmVuIG1vcmUgaW50ZXJlc3RpbmcKICAgZWZmZWN0IGlmIC1zY2FsZSBpcyB1c2VkLiBBbHNvLCBpZiB0aGUgWEtFWUJPQVJEIGlzIHN1cHBvcnRlZCBhbmQgdGhlCiAgIFhCZWxsICJiZWVwcyIgb25jZSwgeW91IGdldCBhbiBpbmZpbml0ZSBsb29wIG9mIGJlZXBzIGdvaW5nIG9mZi4KICAgQWx0aG91Z2ggYWxsIG9mIHRoaXMgaXMgbWlsZGx5IGV4Y2l0aW5nIGl0IGlzIG5vdCBtdWNoIHVzZTogeW91IHdpbGwKICAgbm9ybWFsbHkgcnVuIGFuZCBkaXNwbGF5IHRoZSB2aWV3ZXIgb24gYSBkaWZmZXJlbnQgbWFjaGluZSEKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIFN1biBSYXkgTm90ZXM6CgogICBZb3UgY2FuIHJ1biB4MTF2bmMgb24geW91ciAoY29ubmVjdGVkIG9yIGRpc2Nvbm5lY3RlZCkgU3VuUmF5IHNlc3Npb24uCiAgIEhlcmUgYXJlIHNvbWUgbm90ZXMgb24gU3VuUmF5IHVzYWdlIHdpdGggeDExdm5jLgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIExpbWl0YXRpb25zOgoKICAgICAqIER1ZSB0byB0aGUgcG9sbGluZyBuYXR1cmUsIHNvbWUgYWN0aXZpdGllcyAob3BhcXVlIHdpbmRvdyBtb3ZlcywKICAgICAgIHNjcm9sbGluZyksIGNhbiBiZSBwcmV0dHkgY2hvcHB5L3JhZ2dlZCBhbmQgb3RoZXJzIChleHBvc3VyZXMgb2YKICAgICAgIGxhcmdlIGFyZWFzKSBzbG93LiBFeHBlcmltZW50IHdpdGggaW50ZXJhY3RpbmcgYSBiaXQgZGlmZmVyZW50bHkKICAgICAgIHRoYW4geW91IG5vcm1hbGx5IGRvIHRvIG1pbmltaXplIHRoZSBlZmZlY3RzIChlLmcuIGRvIGZ1bGxwYWdlCiAgICAgICBwYWdpbmcgcmF0aGVyIHRoYW4gbGluZS1ieS1saW5lIHNjcm9sbGluZywgYW5kIG1vdmUgd2luZG93cyBpbiBhCiAgICAgICBzaW5nbGUsIHF1aWNrIG1vdGlvbi4pIFJlY2VudCB3b3JrIGhhcyBwcm92aWRlZCB0aGUKICAgICAgIC1zY3JvbGxjb3B5cmVjdCBhbmQgLXdpcmVmcmFtZSBzcGVlZHVwcyB1c2luZyB0aGUgQ29weVJlY3QgVk5DCiAgICAgICBlbmNvZGluZyBhbmQgb3RoZXIgdGhpbmdzLCBidXQgdGhleSBvbmx5IHNwZWVkIHVwIHNvbWUgYWN0aXZpdGllcywKICAgICAgIG5vdCBhbGwuCiAgICAgKiBBIHJhdGUgbGltaXRpbmcgZmFjdG9yIGZvciB4MTF2bmMgcGVyZm9ybWFuY2UgaXMgdGhhdCBncmFwaGljcwogICAgICAgaGFyZHdhcmUgaXMgb3B0aW1pemVkIGZvciB3cml0aW5nLCBub3QgcmVhZGluZyAoeDExdm5jIHJlYWRzIHRoZQogICAgICAgdmlkZW8gZnJhbWVidWZmZXIgZm9yIHRoZSBzY3JlZW4gaW1hZ2UgZGF0YS4pIFRoZSBkaWZmZXJlbmNlIGNhbgogICAgICAgYmUgYSBmYWN0b3Igb2YgMTAgdG8gMTAwMCwgYW5kIHNvIGl0IHVzdWFsbHkgdGFrZXMgYWJvdXQgMC41LTEgc2VjCiAgICAgICB0byByZWFkIGluIHRoZSB3aG9sZSB2aWRlbyBoYXJkd2FyZSBmcmFtZWJ1ZmZlciAoZS5nLiA1TUIgZm9yCiAgICAgICAxMjgweDEwMjQgYXQgZGVwdGggMjQgd2l0aCBhIHJlYWQgcmF0ZSBvZiA1LTEwTUIvc2VjLikgU28gd2hlbmV2ZXIKICAgICAgIGFjdGl2aXR5IGNoYW5nZXMgbW9zdCBvZiB0aGUgc2NyZWVuIChlLmcuIG1vdmluZyBvciBpY29uaWZ5aW5nIGEKICAgICAgIGxhcmdlIHdpbmRvdykgdGhlcmUgaXMgYSBkZWxheSBvZiAwLjUtMSBzZWMgd2hpbGUgeDExdm5jIHJlYWRzIHRoZQogICAgICAgY2hhbmdlZCByZWdpb25zIGluLgogICAgICAgQSBzbG93IGZyYW1lYnVmZmVyIHJlYWQgcmF0ZSB3aWxsIG9mdGVuIGJlIHRoZSBwZXJmb3JtYW5jZQogICAgICAgYm90dGxlbmVjayBvbiBhIGZhc3QgTEFOICh3aGVyZWFzIG9uIHNsb3dlciBsaW5rcyB0aGUgcmVkdWNlZAogICAgICAgbmV0d29yayBiYW5kd2lkdGggYmVjb21lcyB0aGUgYm90dGxlbmVjay4pCiAgICAgICBOb3RlOiBBIHF1aWNrIHdheSB0byBnZXQgYSAyWCBzcGVlZHVwIG9mIHRoaXMgZm9yIHgxMXZuYyBpcyB0bwogICAgICAgc3dpdGNoIHlvdXIgWCBzZXJ2ZXIgZnJvbSBkZXB0aCAyNCAoMzJicHApIHRvIGRlcHRoIDE2ICgxNmJwcC4pCiAgICAgICBZb3UgZ2V0IGEgNFggc3BlZWR1cCBnb2luZyB0byA4YnBwLCBidXQgdGhlIGxhY2sgb2YgY29sb3IgY2VsbHMgaXMKICAgICAgIHVzdWFsbHkgdW5hY2NlcHRhYmxlLgogICAgICAgVG8gZ2V0IGEgc2Vuc2Ugb2YgdGhlIHJlYWQgYW5kIHdyaXRlIHNwZWVkcyBvZiB5b3VyIHZpZGVvIGNhcmQsCiAgICAgICB5b3UgY2FuIHJ1biBiZW5jaG1hcmtzIGxpa2U6ICJ4MTFwZXJmIC1nZXRpbWFnZTUwMCIsICAieDExcGVyZgogICAgICAgLXB1dGltYWdlNTAwIiwgICJ4MTFwZXJmIC1zaG1wdXQ1MDAiIGFuZCBmb3IgWEZyZWU4NiBkaXNwbGF5cyB3aXRoCiAgICAgICBkaXJlY3QgZ3JhcGhpY3MgYWNjZXNzIHRoZSAiZGdhIiBjb21tYW5kIChwcmVzcyAiYiIgdG8gcnVuIHRoZQogICAgICAgYmVuY2htYXJrIGFuZCB0aGVuIGFmdGVyIGEgZmV3IHNlY29uZHMgcHJlc3MgInEiIHRvIHF1aXQuKSBFdmVuCiAgICAgICB0aGlzICJkZCBpZj0vZGV2L2ZiMCBvZj0vZGV2L251bGwiIG9mdGVuIGdpdmVzIGEgZ29vZCBlc3RpbWF0ZS4KICAgICAgIHgxMXZuYyBhbHNvIHByaW50cyBvdXQgaXRzIGVzdGltYXRlOgogIDI4LzAyLzIwMDkgMTE6MTE6MDcgQXV0b3Byb2JpbmcgVENQIHBvcnQKICAyOC8wMi8yMDA5IDExOjExOjA3IEF1dG9wcm9iaW5nIHNlbGVjdGVkIHBvcnQgNTkwMAogIDI4LzAyLzIwMDkgMTE6MTE6MDggZmIgcmVhZCByYXRlOiAxMCBNQi9zZWMKICAyOC8wMi8yMDA5IDExOjExOjA4IHNjcmVlbiBzZXR1cCBmaW5pc2hlZC4KICAgICAgIFdlIGhhdmUgc2VlbiBhIGZldyBjYXNlcyB3aGVyZSB0aGUgaGFyZHdhcmUgZmIgcmVhZCBzcGVlZCBpcwogICAgICAgZ3JlYXRlciB0aGFuIDY1IE1CL3NlYzogb24gaGlnaCBlbmQgZ3JhcGhpY3Mgd29ya3N0YXRpb25zIGZyb20gU0dJCiAgICAgICBhbmQgU3VuLCBhbmQgYWxzbyBmcm9tIGEgTGludXggdXNlciB1c2luZyBudmlkaWEgcHJvcHJpZXRhcnkKICAgICAgIGRyaXZlcnMgZm9yIGhpcyBudmlkaWEgdmlkZW8gY2FyZC4gVXBkYXRlIDIwMDg6IHRoYW5rZnVsbHksIHRoZXNlCiAgICAgICBzcGVkIHVwIGRyaXZlcnMgYXJlIGJlY29taW5nIG1vcmUgY29tbW9uIG9uIExpbnV4IGFuZCAqQlNEIHN5c3RlbXMKICAgICAgIGFuZCB0aGF0IG1ha2VzIHgxMXZuYyBydW4gc29tZXdoYXQgbW9yZSBxdWlja2x5LiBTb21ldGltZXMgdGhleQogICAgICAgaGF2ZSBhIHJlYWQgcmF0ZSBvZiBvdmVyIDQwMCBNQi9zZWMuCiAgICAgICBPbiBYRnJlZTg2L1hvcmcgaXQgaXMgYWN0dWFsbHkgcG9zc2libGUgdG8gaW5jcmVhc2UgdGhlCiAgICAgICBmcmFtZWJ1ZmZlciByZWFkIHNwZWVkIGNvbnNpZGVyYWJseSAoMTAtMTAwIHRpbWVzKSBieSB1c2luZyB0aGUKICAgICAgIFNoYWRvdyBGcmFtZWJ1ZmZlciAoYSBjb3B5IG9mIHRoZSBmcmFtZWJ1ZmZlciBpcyBrZXB0IGluIG1haW4KICAgICAgIG1lbW9yeSBhbmQgdGhpcyBjYW4gYmUgcmVhZCBtdWNoIG1vcmUgcXVpY2tseS4pIFRvIGRvIHRoaXMgb25lCiAgICAgICBwdXRzIHRoZSBsaW5lIE9wdGlvbiAiU2hhZG93RkIiICJ0cnVlIiBpbiB0aGUgRGV2aWNlIHNlY3Rpb24gb2YKICAgICAgIHRoZSAvZXRjL1gxMS9YRjg2Q29uZmlnIG9yIC9ldGMvWDExL3hvcmcuY29uZiBmaWxlLiBOb3RlIHRoYXQgdGhpcwogICAgICAgZGlzYWJsZXMgMkQgYWNjZWxlcmF0aW9uIGF0IHRoZSBwaHlzaWNhbCBkaXNwbGF5IGFuZCBzbyB0aGF0IG1pZ2h0CiAgICAgICBiZSB1bmFjY2VwdGFibGUgaWYgb25lIHBsYXlzIGdhbWVzLCBldGMuIG9uIHRoZSBtYWNoaW5lJ3MgbG9jYWwKICAgICAgIGRpc3BsYXkuIE5ldmVydGhlbGVzcyB0aGlzIGNvdWxkIGJlIGhhbmR5IGluIHNvbWUgY2lyY3Vtc3RhbmNlcywKICAgICAgIGUuZy4gaWYgdGhlIHNsb3dlciBzcGVlZCB3aGlsZSBzaXR0aW5nIGF0IHRoZSBwaHlzaWNhbCBkaXNwbGF5IHdhcwogICAgICAgYWNjZXB0YWJsZSAodGhpcyBzZWVtcyB0byBiZSB0cnVlIGZvciBtb3N0IHZpZGVvIGNhcmRzIHRoZXNlCiAgICAgICBkYXlzLikgVW5mb3J0dW5hdGVseSBpdCBkb2VzIG5vdCBzZWVtIHNoYWRvd2ZiIGNhbiBiZSB0dXJuZWQgb24KICAgICAgIGFuZCBvZmYgZHluYW1pY2FsbHkuLi4KICAgICAgIEFub3RoZXIgYW11c2luZyB0aGluZyBvbmUgY2FuIGRvIGlzIHVzZSBYdmZiIGFzIHRoZSBYIHNlcnZlciwgZS5nLgogICAgICAgInhpbml0ICRIT01FLy54aW5pdHJjIC0tIC91c3IvWDExUjYvYmluL1h2ZmIgOjEgLXNjcmVlbiAwCiAgICAgICAxMDI0eDc2OHgxNiIgeDExdm5jIGNhbiBwb2xsIFh2ZmIgZWZmaWNpZW50bHkgdmlhIG1haW4gbWVtb3J5LgogICAgICAgSXQncyBub3QgZXhhY3RseSBjbGVhciB3aHkgb25lIHdvdWxkIHdhbnQgdG8gZG8gdGhpcyBpbnN0ZWFkIG9mCiAgICAgICB1c2luZyB2bmNzZXJ2ZXIvWHZuYywgKHBlcmhhcHMgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgYW4geDExdm5jCiAgICAgICBmZWF0dXJlLCBzdWNoIGFzIGZyYW1lYnVmZmVyIHNjYWxpbmcgb3IgYnVpbHQtaW4gU1NMIGVuY3J5cHRpb24pLAogICAgICAgYnV0IHdlIG1lbnRpb24gaXQgYmVjYXVzZSBpdCBtYXkgYmUgb2YgdXNlIGZvciBzcGVjaWFsIHB1cnBvc2UKICAgICAgIGFwcGxpY2F0aW9ucy4gWW91IG1heSBuZWVkIHRvIHVzZSB0aGUgIi1jYyA0IiBvcHRpb24gdG8gZm9yY2UgWHZmYgogICAgICAgdG8gdXNlIGEgVHJ1ZUNvbG9yIHZpc3VhbCBpbnN0ZWFkIG9mIERpcmVjdENvbG9yLiBTZWUgYWxzbyB0aGUKICAgICAgIGRlc2NyaXB0aW9uIG9mIHRoZSAtY3JlYXRlIG9wdGlvbiB0aGF0IGRvZXMgYWxsIG9mIHRoaXMKICAgICAgIGF1dG9tYXRpY2FsbHkgZm9yIHlvdSAoYmUgc3VyZSB0byBpbnN0YWxsIHRoZSBYdmZiIHBhY2thZ2UsIGUuZy4KICAgICAgIGFwdC1nZXQgaW5zdGFsbCB4dmZiLikKICAgICAgIEFsc28sIGEgZmFzdGVyIGFuZCBtb3JlIGFjY3VyYXRlIHdheSBpcyB0byB1c2UgdGhlICJkdW1teSIKICAgICAgIFhvcmcvWEZyZWU4NiBkZXZpY2UgZHJpdmVyIChvciBvdXIgWGR1bW15IHdyYXBwZXIgc2NyaXB0LikgU2VlCiAgICAgICB0aGlzIEZBUSBmb3IgZGV0YWlscy4KICAgICAqIFNvbWV3aGF0IHN1cnByaXNpbmdseSwgdGhlIFgxMSBtb3VzZSAoY3Vyc29yKSBzaGFwZSBpcyB3cml0ZS1vbmx5CiAgICAgICBhbmQgY2Fubm90IGJlIHF1ZXJpZWQgZnJvbSB0aGUgWCBzZXJ2ZXIuIFNvIHRyYWRpdGlvbmFsbHkgaW4KICAgICAgIHgxMXZuYyB0aGUgY3Vyc29yIHNoYXBlIHN0YXlzIGZpeGVkIGF0IGFuIGFycm93LiAoc2VlIHRoZSAiLWN1cnNvcgogICAgICAgWCIgYW5kICItY3Vyc29yIHNvbWUiIG9wdGlvbnMsIGhvd2V2ZXIsIGZvciBhIHBhcnRpYWwgaGFjayBmb3IgdGhlCiAgICAgICByb290IHdpbmRvdywgZXRjLikgSG93ZXZlciwgb24gU29sYXJpcyB1c2luZyB0aGUgU1VOX09WTCBvdmVybGF5CiAgICAgICBleHRlbnNpb24sIHgxMXZuYyBjYW4gc2hvdyB0aGUgY29ycmVjdCBtb3VzZSBjdXJzb3Igd2hlbiB0aGUKICAgICAgIC1vdmVybGF5IG9wdGlvbiBpcyBhbHNvIHN1cHBsaWVkLiBBIHNpbWlsYXIgdGhpbmcgaXMgZG9uZSBvbiBJUklYCiAgICAgICBhcyB3ZWxsIHdoZW4gLW92ZXJsYXkgaXMgc3VwcGxpZWQuCiAgICAgICBNb3JlIGdlbmVyYWxseSwgYXMgb2YgRGVjLzIwMDQgeDExdm5jIHN1cHBvcnRzIHRoZSBuZXcgWEZJWEVTCiAgICAgICBleHRlbnNpb24gKGluIFhvcmcgYW5kIFNvbGFyaXMgMTApIHRvIHF1ZXJ5IHRoZSBYIHNlcnZlciBmb3IgdGhlCiAgICAgICBleGFjdCBjdXJzb3Igc2hhcGUsIHRoaXMgd29ya3MgcHJldHR5IHdlbGwgZXhjZXB0IHRoYXQgY3Vyc29ycwogICAgICAgd2l0aCB0cmFuc3BhcmVuY3kgKGFscGhhIGNoYW5uZWwpIG5lZWQgdG8gYXBwcm94aW1hdGVkIHRvIHNvbGlkCiAgICAgICBSR0IgdmFsdWVzIChzb21lIGN1cnNvcnMgbG9vayB3b3JzZSB0aGFuIG90aGVycy4pCiAgICAgKiBBdWRpbyBmcm9tIGFwcGxpY2F0aW9ucyBpcyBvZiBjb3Vyc2Ugbm90IHJlZGlyZWN0ZWQgKHNlcGFyYXRlCiAgICAgICByZWRpcmVjdG9ycyBkbyBleGlzdCwgZS5nLiBlc2QsIHNlZSB0aGUgRkFRIG9uIHRoaXMgYmVsb3cuKSBUaGUKICAgICAgIFhCZWxsKCkgImJlZXBzIiB3aWxsIHdvcmsgaWYgdGhlIFggc2VydmVyIHN1cHBvcnRzIHRoZSBYS0VZQk9BUkQKICAgICAgIGV4dGVuc2lvbi4gKE5vdGUgdGhhdCBvbiBTb2xhcmlzIFhLRVlCT0FSRCBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgogICAgICAgUGFzc2luZyAra2IgdG8gWHN1biBlbmFibGVzIGl0LikKICAgICAqIFRoZSBzY3JvbGwgZGV0ZWN0aW9uIGFsZ29yaXRobSBmb3IgdGhlIC1zY3JvbGxjb3B5cmVjdCBvcHRpb24gY2FuCiAgICAgICBnaXZlIGNob3BweSBvciBidW5jaGVkIHVwIHRyYW5zaWVudCBvdXRwdXQgYW5kIG9jY2FzaW9uYWxseQogICAgICAgcGFpbnRpbmcgZXJyb3JzLgogICAgICogVXNpbmcgLXRocmVhZHMgY2FuIGV4cG9zZSBzb21lIGJ1Z3MvY3Jhc2hlcyBpbiBsaWJ2bmNzZXJ2ZXIuCgogICBQbGVhc2UgZmVlbCBmcmVlIHRvIGNvbnRhY3QgbWUgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9ucywgcHJvYmxlbXMsIG9yCiAgIGNvbW1lbnRzIGFib3V0IHgxMXZuYywgZXRjLiBQbGVhc2UgYmUgcG9saXRlLCB0aG9yb3VnaCwgYW5kIG5vdAogICBkZW1hbmRpbmcgKHNhZGx5LCB0aGUgbnVtYmVyIG9mIHBlb3BsZSBjb250YWN0aW5nIG1lIHRoYXQgYXJlIHJ1ZGUgYW5kCiAgIGRlbWFuZGluZyBpcyBpbmNyZWFzaW5nIGRyYW1hdGljYWxseS4pCiAgIEFsc28sIHNvbWUgcGVvcGxlIGFzayBpZiB0aGV5IGNhbiBtYWtlIGEgZG9uYXRpb24sIHNlZSB0aGlzIGxpbmsgZm9yCiAgIHRoYXQuCgkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9mYXEuaHRtbDoKCgogICB4MTF2bmMgSG9tZSAgICBEb25hdGlvbnMKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIHgxMXZuYyBGQVE6CgoKICAgW0J1aWxkaW5nIGFuZCBTdGFydGluZ10KCiAgIFEtMTogSSBjYW4ndCBnZXQgeDExdm5jIHRvIHN0YXJ0IHVwLiBJdCBzYXlzICJYT3BlbkRpc3BsYXkgZmFpbGVkCiAgIChudWxsKSIgb3IgIlhsaWI6IGNvbm5lY3Rpb24gdG8gIjowLjAiIHJlZnVzZWQgYnkgc2VydmVyIFhsaWI6IE5vCiAgIHByb3RvY29sIHNwZWNpZmllZCIgYW5kIHRoZW4gZXhpdHMuIFdoYXQgZG8gSSBuZWVkIHRvIGRvPyAKCiAgIFEtMjogSSBjYW4ndCBnZXQgeDExdm5jIGFuZC9vciBsaWJ2bmNzZXJ2ZXIgdG8gY29tcGlsZS4gCgogICBRLTM6IEkganVzdCBidWlsdCB4MTF2bmMgc3VjY2Vzc2Z1bGx5LCBidXQgd2hlbiBJIHVzZSBpdCBteSBrZXlzdHJva2VzCiAgIGFuZCBtb3VzZSBidXR0b24gY2xpY2tzIGFyZSBpZ25vcmVkICAoSSBhbSBhYmxlIHRvIG1vdmUgdGhlIG1vdXNlCiAgIHRob3VnaC4pIAoKICAgUS00OiBIZWxwLCBJIG5lZWQgdG8gcnVuIHgxMXZuYyBvbiBTb2xhcmlzIDIuNS4xIChvciBvdGhlciBvbGQKICAgVW5peC9MaW51eCkgYW5kIGl0IGRvZXNuJ3QgY29tcGlsZSEgCgogICBRLTU6IFdoZXJlIGNhbiBJIGdldCBhIHByZWNvbXBpbGVkIHgxMXZuYyBiaW5hcnkgZm9yIG15IE9wZXJhdGluZwogICBTeXN0ZW0/IAoKICAgUS02OiBXaGVyZSBjYW4gSSBnZXQgYSBWTkMgVmlld2VyIGJpbmFyeSAob3Igc291cmNlIGNvZGUpIGZvciB0aGUKICAgT3BlcmF0aW5nIFN5c3RlbSBJIHdpbGwgYmUgdmlld2luZyBmcm9tPyAKCiAgIFEtNzogSG93IGNhbiBJIHNlZSBhbGwgb2YgeDExdm5jJ3MgY29tbWFuZCBsaW5lIG9wdGlvbnMgYW5kCiAgIGRvY3VtZW50YXRpb24gb24gaG93IHRvIHVzZSB0aGVtPyAKCiAgIFEtODogSSBkb24ndCBsaWtlIHR5cGluZyBhcmNhbmUgY29tbWFuZCBsaW5lIG9wdGlvbnMgZXZlcnkgdGltZSBJCiAgIHN0YXJ0IHgxMXZuYy4gV2hhdCBjYW4gSSBkbz8gSXMgdGhlcmUgYSBjb25maWcgZmlsZT8gT3IgYSBHVUk/IAoKICAgUS05OiBIb3cgY2FuIEkgZ2V0IHRoZSBHVUkgdG8gcnVuIGluIHRoZSBTeXN0ZW0gVHJheSwgb3IgYXQgbGVhc3QgYmUgYQogICBzbWFsbGVyLCBzaW1wbGVyIGljb24/IAoKICAgUS0xMDogSG93IGNhbiBJIGdldCB4MTF2bmMgdG8gbGlzdGVuIG9uIGEgZGlmZmVyZW50IHBvcnQgYmVzaWRlcyB0aGUKICAgZGVmYXVsdCBWTkMgcG9ydCAoNTkwMCk/IAoKICAgUS0xMTogTXkgRmlyZXdhbGwvUm91dGVyIGRvZXNuJ3QgYWxsb3cgVk5DIFZpZXdlcnMgdG8gY29ubmVjdCB0bwogICB4MTF2bmMuIAoKICAgUS0xMjogSXMgaXQgcG9zc2libGUgZm9yIGEgVk5DIFZpZXdlciBhbmQgYSBWTkMgU2VydmVyIHRvIGNvbm5lY3QgdG8KICAgZWFjaCBvdGhlciBldmVuIHRob3VnaCBib3RoIGFyZSBiZWhpbmQgRmlyZXdhbGxzIHRoYXQgYmxvY2sgYWxsCiAgIGluY29taW5nIGNvbm5lY3Rpb25zPyAKCiAgIFEtMTM6IENhbiBJIG1ha2UgeDExdm5jIG1vcmUgcXVpZXQgYW5kIGFsc28gZ28gaW50byB0aGUgYmFja2dyb3VuZAogICBhZnRlciBzdGFydGluZyB1cD8gCgogICBRLTE0OiBTb21ldGltZXMgd2hlbiBhIFZOQyB2aWV3ZXIgZGllcyBhYnJ1cHRseSwgeDExdm5jIGFsc28gZGllcyB3aXRoCiAgIHRoZSBlcnJvciBtZXNzYWdlIGxpa2U6ICJCcm9rZW4gcGlwZSIuIEknbSB1c2luZyB0aGUgLWZvcmV2ZXIgbW9kZSBhbmQKICAgSSB3YW50IHgxMXZuYyB0byBrZWVwIHJ1bm5pbmcuIAoKICAgUS0xNTogVGhlIFdpbmRvd3MgVGlnaHRWTkMgMS4zLjkgVmlld2VyIGNhbm5vdCBjb25uZWN0IHRvIHgxMXZuYy4gCgogICBRLTE2OiBLREUncyBrcmRjIFZOQyB2aWV3ZXIgY2Fubm90IGNvbm5lY3QgdG8geDExdm5jLiAKCiAgIFEtMTc6IFdoZW4gSSBzdGFydCB4MTF2bmMgb24gYW4gQWxwaGEgVHJ1NjQgd29ya3N0YXRpb24gdGhlIFggc2VydmVyCiAgIGNyYXNoZXMhIAoKICAgUS0xODogV2hlbiBydW5uaW5nIHgxMXZuYyBvbiBhbiBJQk0gQUlYIHdvcmtzdGF0aW9uIGFmdGVyIGEgZmV3CiAgIG1pbnV0ZXMgdGhlIFZOQyBjb25uZWN0aW9uIGZyZWV6ZXMuIAoKICAgUS0xOTogQXJlIHRoZXJlIGFueSBidWlsZC10aW1lIGN1c3RvbWl6YXRpb25zIHBvc3NpYmxlLCBlLmcuIGNoYW5nZQogICBkZWZhdWx0cywgY3JlYXRlIGEgc21hbGxlciBiaW5hcnksIGV0Yz8gCgogICBbV2luMlZOQyBSZWxhdGVkXQoKICAgUS0yMDogSSBoYXZlIHR3byBzZXBhcmF0ZSBtYWNoaW5lIGRpc3BsYXlzIGluIGZyb250IG9mIG1lLCBvbmUgV2luZG93cwogICB0aGUgb3RoZXIgWDExOiBjYW4gSSB1c2UgeDExdm5jIGluIGNvbWJpbmF0aW9uIHdpdGggV2luMlZOQyBpbgogICBkdWFsLXNjcmVlbiBtb2RlIHRvIHBhc3MgdGhlIGtleXN0cm9rZXMgYW5kIG1vdXNlIG1vdGlvbnMgdG8gdGhlIFgxMQogICBkaXNwbGF5PyAKCiAgIFEtMjE6IEkgYW0gcnVubmluZyBXaW4yVk5DIG9uIG15IFdpbmRvd3MgbWFjaGluZSBhbmQgIngxMXZuYyAtbm9mYiIgb24KICAgVW5peCB0byBwYXNzIGtleWJvYXJkIGFuZCBtb3VzZSB0byB0aGUgVW5peCBtb25pdG9yLiBXaGVuZXZlciBJIHN0YXJ0CiAgIFdpbjJWTkMgaXQgcXVpY2tseSBkaXNjb25uZWN0cyBhbmQgeDExdm5jIHNheXM6CiAgIHJmYlByb2Nlc3NDbGllbnROb3JtYWxNZXNzYWdlOiByZWFkOiBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIgCgogICBRLTIyOiBDYW4gSSBydW4gIngxMXZuYyAtbm9mYiIgb24gYSBNYWMgT1MgWCBtYWNoaW5lIHRvIHJlZGlyZWN0IG1vdXNlCiAgIGFuZCBrZXlib2FyZCBpbnB1dCB0byBpdCBmcm9tIFdpbmRvd3MgYW5kIFgxMSBtYWNoaW5lcyB2aWEgV2luMlZOQyBhbmQKICAgeDJ2bmMsIHJlc3BlY3RpdmVseT8gCgogICBbQ29sb3IgSXNzdWVzXQoKICAgUS0yMzogVGhlIFggZGlzcGxheSBJIHJ1biB4MTF2bmMgb24gaXMgb25seSA4IGJpdHMgcGVyIHBpeGVsIChicHApCiAgIFBzZXVkb0NvbG9yIChpLmUuIG9ubHkgMjU2IGRpc3RpbmN0IGNvbG9ycy4pIFRoZSB4MTF2bmMgY29sb3JzIG1heQogICBzdGFydCBvdXQgT0ssIGJ1dCBhZnRlciBhIHdoaWxlIHRoZXkgYXJlIGluY29ycmVjdCBpbiBjZXJ0YWluIHdpbmRvd3MuCiAgIAogICBRLTI0OiBDb2xvciBwcm9ibGVtczogV2h5IGFyZSB0aGUgY29sb3JzIGZvciBzb21lIHdpbmRvd3MgaW5jb3JyZWN0IGluCiAgIHgxMXZuYz8gQlRXLCBteSBYIGRpc3BsYXkgaGFzIG5pY2Ugb3ZlcmxheS9tdWx0aS1kZXB0aCB2aXN1YWxzIG9mCiAgIGRpZmZlcmVudCBjb2xvciBkZXB0aHM6IGUuZy4gdGhlcmUgYXJlIGJvdGggZGVwdGggOCBhbmQgMjQgdmlzdWFscwogICBhdmFpbGFibGUgYXQgdGhlIHNhbWUgdGltZS4gCgogICBRLTI1OiBJIGFtIG9uIGEgaGlnaCBjb2xvciBzeXN0ZW0gKGRlcHRoID49IDI0KSBidXQgSSBzZWVtIHRvIGhhdmUKICAgY29sb3JtYXAgcHJvYmxlbXMuIFRoZXkgZWl0aGVyIGZsYXNoIG9yIGV2ZXJ5dGhpbmcgaXMgdmVyeSBkYXJrLiAKCiAgIFEtMjY6IEhvdyBkbyBJIGZpZ3VyZSBvdXQgdGhlIHdpbmRvdyBpZCB0byBzdXBwbHkgdG8gdGhlIC1pZCB3aW5kb3dpZAogICBvcHRpb24/IAoKICAgUS0yNzogV2h5IGRvbid0IG1lbnVzIG9yIG90aGVyIHRyYW5zaWVudCB3aW5kb3dzIGNvbWUgdXAgd2hlbiBJIGFtCiAgIHVzaW5nIHRoZSAtaWQgd2luZG93aWQgb3B0aW9uIHRvIHZpZXcgYSBzaW5nbGUgYXBwbGljYXRpb24gd2luZG93PyAKCiAgIFEtMjg6IE15IFggZGlzcGxheSBpcyBkZXB0aCAyNCBhdCAyNGJwcCAoaW5zdGVhZCBvZiB0aGUgbm9ybWFsIGRlcHRoCiAgIDI0IGF0IDMyYnBwLikgSSdtIGhhdmluZyBsb3RzIG9mIGNvbG9yIGFuZCB2aXN1YWwgcHJvYmxlbXMgd2l0aCB4MTF2bmMKICAgYW5kL29yIHZuY3ZpZXdlci4gV2hhdCdzIHVwPyAKCiAgIFtYdGVybWluYWxzXQoKICAgUS0yOTogQ2FuIEkgdXNlIHgxMXZuYyB0byB2aWV3IGFuZCBpbnRlcmFjdCB3aXRoIGFuIFh0ZXJtaW5hbCAoZS5nLgogICBOQ0QpIHRoYXQgaXMgbm90IHJ1bm5pbmcgVU5JWCBhbmQgc28geDExdm5jIGNhbm5vdCBiZSBydW4gb24gaXQKICAgZGlyZWN0bHk/IAoKICAgUS0zMDogSG93IGRvIEkgZ2V0IG15IFggcGVybWlzc2lvbnMgKE1JVC1NQUdJQy1DT09LSUUgZmlsZSkgY29ycmVjdAogICBmb3IgYSBVbml4L0xpbnV4IG1hY2hpbmUgYWN0aW5nIGFzIGFuIFh0ZXJtaW5hbD8gCgogICBbU3VuIFJheXNdCgogICBRLTMxOiBJJ20gaGF2aW5nIHRyb3VibGUgdXNpbmcgeDExdm5jIHdpdGggbXkgU3VuIFJheSBzZXNzaW9uLiAKCiAgIFtSZW1vdGUgQ29udHJvbF0KCiAgIFEtMzI6IEhvdyBkbyBJIHN0b3AgeDExdm5jIG9uY2UgaXQgaXMgcnVubmluZyBpbiB0aGUgYmFja2dyb3VuZD8gCgogICBRLTMzOiBDYW4gSSBjaGFuZ2Ugc2V0dGluZ3MgaW4geDExdm5jIHdpdGhvdXQgaGF2aW5nIHRvIHJlc3RhcnQgaXQ/CiAgIENhbiBJIHJlbW90ZSBjb250cm9sIGl0PyAKCiAgIFtTZWN1cml0eSBhbmQgUGVybWlzc2lvbnNdCgogICBRLTM0OiBIb3cgZG8gSSBjcmVhdGUgYSBWTkMgcGFzc3dvcmQgZm9yIHVzZSB3aXRoIHgxMXZuYz8gCgogICBRLTM1OiBDYW4gSSBtYWtlIGl0IHNvIC1zdG9yZXBhc3N3ZCBkb2Vzbid0IHNob3cgbXkgcGFzc3dvcmQgb24gdGhlCiAgIHNjcmVlbj8gCgogICBRLTM2OiBDYW4gSSBoYXZlIHR3byBwYXNzd29yZHMgZm9yIFZOQyB2aWV3ZXJzLCBvbmUgZm9yIGZ1bGwgYWNjZXNzCiAgIGFuZCB0aGUgb3RoZXIgZm9yIHZpZXctb25seSBhY2Nlc3MgdG8gdGhlIGRpc3BsYXk/IAoKICAgUS0zNzogQ2FuIEkgaGF2ZSBhcyBtYW55IGZ1bGwtYWNjZXNzIGFuZCB2aWV3LW9ubHkgcGFzc3dvcmRzIGFzIEkKICAgbGlrZT8gCgogICBRLTM4OiBEb2VzIHgxMXZuYyBzdXBwb3J0IFVuaXggdXNlcm5hbWVzIGFuZCBwYXNzd29yZHM/IENhbiBJIGZ1cnRoZXIKICAgbGltaXQgdGhlIHNldCBvZiBVbml4IHVzZXJuYW1lcyB3aG8gY2FuIGNvbm5lY3QgdG8gdGhlIFZOQyBkZXNrdG9wPyAKCiAgIFEtMzk6IENhbiBJIHN1cHBseSBhbiBleHRlcm5hbCBwcm9ncmFtIHRvIHByb3ZpZGUgbXkgb3duIGN1c3RvbSBsb2dpbgogICBtZXRob2QgKGUuZy4gRHluYW1pYy9PbmUtdGltZSBwYXNzd29yZHMgb3Igbm9uLVVuaXggKExEQVApIHVzZXJuYW1lcwogICBhbmQgcGFzc3dvcmRzKT8gCgogICBRLTQwOiBXaHkgZG9lcyB4MTF2bmMgZXhpdCBhcyBzb29uIGFzIHRoZSBWTkMgdmlld2VyIGRpc2Nvbm5lY3RzPyBBbmQKICAgd2h5IGRvZXNuJ3QgaXQgYWxsb3cgbW9yZSB0aGFuIG9uZSBWTkMgdmlld2VyIHRvIGNvbm5lY3QgYXQgdGhlIHNhbWUKICAgdGltZT8gCgogICBRLTQxOiBDYW4gSSBsaW1pdCB3aGljaCBtYWNoaW5lcyBpbmNvbWluZyBWTkMgY2xpZW50cyBjYW4gY29ubmVjdAogICBmcm9tPyAKCiAgIFEtNDI6IEhvdyBkbyBJIGJ1aWxkIHgxMXZuYy9saWJ2bmNzZXJ2ZXIgd2l0aCBsaWJ3cmFwICh0Y3Bfd3JhcHBlcnMpCiAgIHN1cHBvcnQ/IAoKICAgUS00MzogQ2FuIEkgaGF2ZSB4MTF2bmMgb25seSBsaXN0ZW4gb24gb25lIG5ldHdvcmsgaW50ZXJmYWNlIChlLmcuCiAgIGludGVybmFsIExBTikgcmF0aGVyIHRoYW4gaGF2aW5nIGl0IGxpc3RlbiBvbiBhbGwgbmV0d29yayBpbnRlcmZhY2VzCiAgIGFuZCByZWx5aW5nIG9uIC1hbGxvdyB0byBmaWx0ZXIgdW53YW50ZWQgY29ubmVjdGlvbnMgb3V0PyAKCiAgIFEtNDQ6IE5vdyB0aGF0IC1sb2NhbGhvc3QgaW1wbGllcyBsaXN0ZW5pbmcgb25seSBvbiB0aGUgbG9vcGJhY2sKICAgaW50ZXJmYWNlLCBob3cgSSBjYW4gb2NjYXNpb25hbGx5IGFsbG93IGluIGEgbm9uLWxvY2FsaG9zdCB2aWEgdGhlIC1SCiAgIGFsbG93b25jZSByZW1vdGUgY29udHJvbCBjb21tYW5kPyAKCiAgIFEtNDU6IENhbiBJIGZpbmUgdHVuZSB3aGF0IHR5cGVzIG9mIHVzZXIgaW5wdXQgYXJlIGFsbG93ZWQ/IEUuZy4gaGF2ZQogICBzb21lIHVzZXJzIGp1c3QgYmUgYWJsZSB0byBtb3ZlIHRoZSBtb3VzZSwgYnV0IG5vdCBjbGljayBvciB0eXBlCiAgIGFueXRoaW5nPyAKCiAgIFEtNDY6IENhbiBJIHByb21wdCB0aGUgdXNlciBhdCB0aGUgbG9jYWwgWCBkaXNwbGF5IHdoZXRoZXIgdGhlCiAgIGluY29taW5nIFZOQyBjbGllbnQgc2hvdWxkIGJlIGFjY2VwdGVkIG9yIG5vdD8gQ2FuIEkgZGVjaWRlIHRvIG1ha2UKICAgc29tZSBjbGllbnRzIHZpZXctb25seT8gSG93IGFib3V0IHJ1bm5pbmcgYW4gYXJiaXRyYXJ5IHByb2dyYW0gdG8gbWFrZQogICB0aGUgZGVjaXNpb25zPyAKCiAgIFEtNDc6IEkgc3RhcnQgeDExdm5jIGFzIHJvb3QgYmVjYXVzZSBpdCBpcyBsYXVuY2hlZCB2aWEgaW5ldGQoOCkgb3IgYQogICBkaXNwbGF5IG1hbmFnZXIgbGlrZSBnZG0oMSkuIENhbiBJIGhhdmUgeDExdm5jIGxhdGVyIHN3aXRjaCB0byBhCiAgIGRpZmZlcmVudCB1c2VyPyAKCiAgIFEtNDg6IEkgdXNlIGEgc2NyZWVuLWxvY2sgd2hlbiBJIGxlYXZlIG15IHdvcmtzdGF0aW9uIChlLmcuCiAgIHhzY3JlZW5zYXZlciBvciB4bG9jay4pIFdoZW4gSSByZW1vdGVseSBhY2Nlc3MgbXkgd29ya3N0YXRpb24gZGVza3RvcAogICB2aWEgeDExdm5jIEkgY2FuIHVubG9jayB0aGUgZGVza3RvcCBmaW5lLCBidXQgSSBhbSB3b3JyaWVkIHBlb3BsZSB3aWxsCiAgIHNlZSBteSBhY3Rpdml0aWVzIG9uIHRoZSBwaHlzaWNhbCBtb25pdG9yLiBXaGF0IGNhbiBJIGRvIHRvIHByZXZlbnQKICAgdGhpcywgb3IgYXQgbGVhc3QgbWFrZSBpdCBtb3JlIGRpZmZpY3VsdD8gCgogICBRLTQ5OiBDYW4gSSBoYXZlIHgxMXZuYyBhdXRvbWF0aWNhbGx5IGxvY2sgdGhlIHNjcmVlbiB3aGVuIEkKICAgZGlzY29ubmVjdCB0aGUgVk5DIHZpZXdlcj8gCgogICBbRW5jcnlwdGVkIENvbm5lY3Rpb25zXQoKICAgUS01MDogSG93IGNhbiBJIHR1bm5lbCBteSBjb25uZWN0aW9uIHRvIHgxMXZuYyB2aWEgYW4gZW5jcnlwdGVkIFNTSAogICBjaGFubmVsIGJldHdlZW4gdHdvIFVuaXggbWFjaGluZXM/IAoKICAgUS01MTogSG93IGNhbiBJIHR1bm5lbCBteSBjb25uZWN0aW9uIHRvIHgxMXZuYyB2aWEgYW4gZW5jcnlwdGVkIFNTSAogICBjaGFubmVsIGZyb20gV2luZG93cyB1c2luZyBhbiBTU0ggY2xpZW50IGxpa2UgUHV0dHk/IAoKICAgUS01MjogSG93IGNhbiBJIHR1bm5lbCBteSBjb25uZWN0aW9uIHRvIHgxMXZuYyB2aWEgYW4gZW5jcnlwdGVkIFNTTAogICBjaGFubmVsIHVzaW5nIGFuIGV4dGVybmFsIHRvb2wgbGlrZSBzdHVubmVsPyAKCiAgIFEtNTM6IERvZXMgeDExdm5jIGhhdmUgYnVpbHQtaW4gU1NMIHR1bm5lbGluZz8gCgogICBRLTU0OiBIb3cgZG8gSSB1c2UgVk5DIFZpZXdlcnMgd2l0aCBidWlsdC1pbiBTU0wgdHVubmVsaW5nPyAKCiAgIFEtNTU6IEhvdyBkbyBJIHVzZSB0aGUgSmF2YSBhcHBsZXQgVk5DIFZpZXdlciB3aXRoIGJ1aWx0LWluIFNTTAogICB0dW5uZWxpbmcgd2hlbiBnb2luZyB0aHJvdWdoIGEgV2ViIFByb3h5PyAKCiAgIFEtNTY6IENhbiBBcGFjaGUgd2ViIHNlcnZlciBhY3QgYXMgYSBnYXRld2F5IGZvciB1c2VycyB0byBjb25uZWN0IHZpYQogICBTU0wgZnJvbSB0aGUgSW50ZXJuZXQgd2l0aCBhIFdlYiBicm93c2VyIHRvIHgxMXZuYyBydW5uaW5nIG9uIHRoZWlyCiAgIHdvcmtzdGF0aW9ucyBiZWhpbmQgYSBmaXJld2FsbD8gCgogICBRLTU3OiBDYW4gSSBjcmVhdGUgYW5kIHVzZSBteSBvd24gU1NMIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIHdpdGgKICAgeDExdm5jPyAKCiAgIFtEaXNwbGF5IE1hbmFnZXJzIGFuZCBTZXJ2aWNlc10KCiAgIFEtNTg6IEhvdyBjYW4gSSBydW4geDExdm5jIGFzIGEgInNlcnZpY2UiIHRoYXQgaXMgYWx3YXlzIGF2YWlsYWJsZT8gCgogICBRLTU5OiBIb3cgY2FuIEkgdXNlIHgxMXZuYyB0byBjb25uZWN0IHRvIGFuIFggbG9naW4gc2NyZWVuIGxpa2UgeGRtLAogICBHTk9NRSBnZG0sIEtERSBrZG0sIG9yIENERSBkdGxvZ2luPyAoaS5lLiBub2JvZHkgaXMgbG9nZ2VkIGludG8gYW4gWAogICBzZXNzaW9uIHlldC4pIAoKICAgUS02MDogQ2FuIEkgcnVuIHgxMXZuYyBvdXQgb2YgaW5ldGQoOCk/IEhvdyBhYm91dCB4aW5ldGQoOCk/IAoKICAgUS02MTogQ2FuIEkgaGF2ZSB4MTF2bmMgYWR2ZXJ0aXNlIGl0cyBWTkMgc2VydmljZSBhbmQgcG9ydCB2aWEgbUROUyAvCiAgIFplcm9jb25mIChlLmcuIEF2YWhpKSBzbyBWTkMgdmlld2VycyBvbiB0aGUgbG9jYWwgbmV0d29yayBjYW4gZGV0ZWN0CiAgIGl0IGF1dG9tYXRpY2FsbHk/IAoKICAgUS02MjogQ2FuIEkgaGF2ZSB4MTF2bmMgYWxsb3cgYSB1c2VyIHRvIGxvZyBpbiB3aXRoIGhlciBVTklYIHVzZXJuYW1lCiAgIGFuZCBwYXNzd29yZCBhbmQgdGhlbiBoYXZlIGl0IGZpbmQgaGVyIFggc2Vzc2lvbiBkaXNwbGF5IG9uIHRoYXQKICAgbWFjaGluZSBhbmQgdGhlbiBhdHRhY2ggdG8gaXQ/IEhvdyBhYm91dCBzdGFydGluZyBhbiBYIHNlc3Npb24gaWYgb25lCiAgIGNhbm5vdCBiZSBmb3VuZD8gCgogICBRLTYzOiBDYW4gSSBoYXZlIHgxMXZuYyByZXN0YXJ0IGl0c2VsZiBhZnRlciBpdCB0ZXJtaW5hdGVzPyAKCiAgIFEtNjQ6IEhvdyBkbyBJIG1ha2UgeDExdm5jIHdvcmsgd2l0aCB0aGUgSmF2YSBWTkMgdmlld2VyIGFwcGxldCBpbiBhCiAgIHdlYiBicm93c2VyPyAKCiAgIFEtNjU6IEFyZSByZXZlcnNlIGNvbm5lY3Rpb25zIChpLmUuIHRoZSBWTkMgc2VydmVyIGNvbm5lY3RpbmcgdG8gdGhlCiAgIFZOQyB2aWV3ZXIpIHVzaW5nICJ2bmN2aWV3ZXIgLWxpc3RlbiIgYW5kIHZuY2Nvbm5lY3QoMSkgc3VwcG9ydGVkPyAKCiAgIFEtNjY6IENhbiByZXZlcnNlIGNvbm5lY3Rpb25zIGJlIG1hZGUgdG8gZ28gdGhyb3VnaCBhIFdlYiBvciBTT0NLUwogICBwcm94eSBvciBTU0g/IAoKICAgUS02NzogQ2FuIHgxMXZuYyBwcm92aWRlIGEgbXVsdGktdXNlciBkZXNrdG9wIHdlYiBsb2dpbiBzZXJ2aWNlIGFzIGFuCiAgIEFwYWNoZSBDR0kgb3IgUEhQIHNjcmlwdD8gCgogICBRLTY4OiBDYW4gSSB1c2UgeDExdm5jIGFzIGEgcmVwbGFjZW1lbnQgZm9yIFh2bmM/IChpLmUuIG5vdCBmb3IgYSByZWFsCiAgIGRpc3BsYXksIGJ1dCBmb3IgYSB2aXJ0dWFsIG9uZSBJIGtlZXAgYXJvdW5kLikgCgogICBRLTY5OiBIb3cgY2FuIEkgdXNlIHgxMXZuYyBvbiAiaGVhZGxlc3MiIG1hY2hpbmVzPyBXaHkgbWlnaHQgSSB3YW50CiAgIHRvPyAKCiAgIFtSZXNvdXJjZSBVc2FnZSBhbmQgUGVyZm9ybWFuY2VdCgogICBRLTcwOiBJIGhhdmUgbG90cyBvZiBtZW1vcnksIGJ1dCB3aHkgZG9lcyB4MTF2bmMgZmFpbCB3aXRoICAgIHNobWdldDoKICAgTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UgICAgb3IgICAgTWlub3Igb3Bjb2RlIG9mIGZhaWxlZCByZXF1ZXN0OiAxCiAgIChYX1NobUF0dGFjaCk/IAoKICAgUS03MTogSG93IGNhbiBJIG1ha2UgeDExdm5jIHVzZSBsZXNzIHN5c3RlbSByZXNvdXJjZXM/IAoKICAgUS03MjogSG93IGNhbiBJIG1ha2UgeDExdm5jIHVzZSBNT1JFIHN5c3RlbSByZXNvdXJjZXM/IAoKICAgUS03MzogSSB1c2UgeDExdm5jIG92ZXIgYSBzbG93IGxpbmsgd2l0aCBoaWdoIGxhdGVuY3kgKGUuZy4gZGlhbHVwCiAgIG1vZGVtIG9yIGJyb2FkYmFuZCksIGlzIHRoZXJlIGFueXRoaW5nIEkgY2FuIGRvIHRvIHNwZWVkIHRoaW5ncyB1cD8gCgogICBRLTc0OiBEb2VzIHgxMXZuYyBzdXBwb3J0IHRoZSBYIERBTUFHRSBYc2VydmVyIGV4dGVuc2lvbiB0byBmaW5kCiAgIG1vZGlmaWVkIHJlZ2lvbnMgb2YgdGhlIHNjcmVlbiBxdWlja2x5IGFuZCBlZmZpY2llbnRseT8gCgogICBRLTc1OiBNeSBPcGVuR0wgYXBwbGljYXRpb24gc2hvd3Mgbm8gc2NyZWVuIHVwZGF0ZXMgdW5sZXNzIEkgc3VwcGx5CiAgIHRoZSAtbm94ZGFtYWdlIG9wdGlvbiB0byB4MTF2bmMuIAoKICAgUS03NjogV2hlbiBJIGRyYWcgd2luZG93cyBhcm91bmQgd2l0aCB0aGUgbW91c2Ugb3Igc2Nyb2xsIHVwIGFuZCBkb3duCiAgIHRoaW5ncyByZWFsbHkgYm9nIGRvd24gKHVubGVzcyBJIGRvIHRoZSBkcmFnIGluIGEgc2luZ2xlLCBxdWljawogICBtb3Rpb24uKSBJcyB0aGVyZSBhbnl0aGluZyB0byBkbyB0byBpbXByb3ZlIHRoaW5ncz8gCgogICBRLTc3OiBXaHkgbm90IGRvIHNvbWV0aGluZyBsaWtlIHdpcmVmcmFtZSBhbmltYXRpb25zIHRvIGF2b2lkIHRoZQogICB3aW5kb3dzICJsdXJjaGluZyIgd2hlbiBiZWluZyBtb3ZlZCBvciByZXNpemVkPyAKCiAgIFEtNzg6IENhbiB4MTF2bmMgdHJ5IHRvIGFwcGx5IGhldXJpc3RpY3MgdG8gZGV0ZWN0IHdoZW4gYSB3aW5kb3cgaXMKICAgc2Nyb2xsaW5nIGl0cyBjb250ZW50cyBhbmQgdXNlIHRoZSBDb3B5UmVjdCBlbmNvZGluZyBmb3IgYSBzcGVlZHVwPyAKCiAgIFEtNzk6IENhbiB4MTF2bmMgZG8gY2xpZW50LXNpZGUgY2FjaGluZyBvZiBwaXhlbCBkYXRhPyBJLmUuIHNvIHdoZW4KICAgdGhhdCBwaXhlbCBkYXRhIGlzIG5lZWRlZCBhZ2FpbiBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIHJldHJhbnNtaXR0ZWQKICAgb3ZlciB0aGUgbmV0d29yay4gCgogICBRLTgwOiBEb2VzIHgxMXZuYyBzdXBwb3J0IFR1cmJvVk5DPyAKCiAgIFtNb3VzZSBDdXJzb3IgU2hhcGVzXQoKICAgUS04MTogV2h5IGlzbid0IHRoZSBtb3VzZSBjdXJzb3Igc2hhcGUgKHRoZSBsaXR0bGUgaWNvbiBzaGFwZSB3aGVyZQogICB0aGUgbW91c2UgcG9pbnRlciBpcykgY29ycmVjdCBhcyBJIG1vdmUgZnJvbSB3aW5kb3cgdG8gd2luZG93PyAKCiAgIFEtODI6IFdoZW4gdXNpbmcgWEZJWEVTIGN1cnNvcnNoYXBlIG1vZGUsIHNvbWUgb2YgdGhlIGN1cnNvcnMgbG9vawogICByZWFsbHkgYmFkIHdpdGggZXh0cmEgYmxhY2sgYm9yZGVycyBhcm91bmQgdGhlIGN1cnNvciBhbmQgb3RoZXIgY3J1ZnQuCiAgIEhvdyBjYW4gSSBpbXByb3ZlIHRoZWlyIGFwcGVhcmFuY2U/IAoKICAgUS04MzogSW4gWEZJWEVTIG1vZGUsIGFyZSB0aGVyZSBhbnkgaGFja3MgdG8gaGFuZGxlIGN1cnNvcgogICB0cmFuc3BhcmVuY3kgKCJhbHBoYSBjaGFubmVsIikgZXhhY3RseT8gCgogICBbTW91c2UgUG9pbnRlcl0KCiAgIFEtODQ6IFdoeSBkb2VzIHRoZSBtb3VzZSBhcnJvdyBqdXN0IHN0YXkgaW4gb25lIGNvcm5lciBpbiBteQogICB2bmN2aWV3ZXIsIHdoZXJlYXMgbXkgY3Vyc29yICh0aGF0IGRvZXMgbW92ZSkgaXMganVzdCBhIGRvdD8gCgogICBRLTg1OiBDYW4gSSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgVGlnaHRWTkMgZXh0ZW5zaW9uIHRvIHRoZSBWTkMKICAgcHJvdG9jb2wgd2hlcmUgQ3Vyc29yIFBvc2l0aW9ucyBVcGRhdGVzIGFyZSBzZW50IGJhY2sgdG8gYWxsIGNvbm5lY3RlZAogICBjbGllbnRzIChpLmUuIHBhc3NpdmUgdmlld2VycyBjYW4gc2VlIHRoZSBtb3VzZSBjdXJzb3IgYmVpbmcgbW92ZWQKICAgYXJvdW5kIGJ5IGFub3RoZXIgdmlld2VyKT8gCgogICBRLTg2OiBJcyBpdCBwb3NzaWJsZSB0byBzd2FwIHRoZSBtb3VzZSBidXR0b25zIChlLmcuIGxlZnQtaGFuZGVkCiAgIG9wZXJhdGlvbiksIG9yIGFyYml0cmFyaWx5IHJlbWFwIHRoZW0/IEhvdyBhYm91dCBtYXBwaW5nIGJ1dHRvbiBjbGlja3MKICAgdG8ga2V5c3Ryb2tlcywgZS5nLiB0byBwYXJ0aWFsbHkgZW11bGF0ZSBNb3VzZSB3aGVlbCBzY3JvbGxpbmc/IAoKICAgW0tleWJvYXJkIElzc3Vlc10KCiAgIFEtODc6IEhvdyBjYW4gSSBnZXQgbXkgQWx0R3IgYW5kIFNoaWZ0IG1vZGlmaWVycyB0byB3b3JrIGJldHdlZW4KICAga2V5Ym9hcmRzIGZvciBkaWZmZXJlbnQgbGFuZ3VhZ2VzPyAKCiAgIFEtODg6IFdoZW4gSSB0cnkgdG8gdHlwZSBhICI8IiAoaS5lLiBsZXNzIHRoYW4pIGluc3RlYWQgSSBnZXQgIj4iCiAgIChpLmUuIGdyZWF0ZXIgdGhhbikhIFN0cmFuZ2VseSwgdHlwaW5nICI+IiB3b3JrcyBPSyEhIAoKICAgUS04OTogRXh0cmEgQ2hhcmFjdGVyIEluc2VydGVkLCBFLmcuOiBXaGVuIEkgdHJ5IHRvIHR5cGUgYSAiPCIgKGkuZS4KICAgbGVzcyB0aGFuKSBpbnN0ZWFkIEkgZ2V0ICI8LCIgKGkuZS4gYW4gZXh0cmEgY29tbWEuKSAKCiAgIFEtOTA6IEknbSB1c2luZyBhbiAiaW50ZXJuYXRpb25hbCIga2V5Ym9hcmQgKGUuZy4gR2VybWFuICJkZSIsIG9yCiAgIERhbmlzaCAiZGsiKSBhbmQgdGhlIC1tb2R0d2VhayBtb2RlIHdvcmtzIHdlbGwgaWYgdGhlIFZOQyB2aWV3ZXIgaXMKICAgcnVuIG9uIGEgVW5peC9MaW51eCBtYWNoaW5lIHdpdGggYSBzaW1pbGFyIGtleWJvYXJkLiAgIEJ1dCBpZiBJIHJ1bgogICB0aGUgVk5DIHZpZXdlciBvbiBVbml4L0xpbnV4IHdpdGggYSBkaWZmZXJlbnQga2V5Ym9hcmQgKGUuZy4gInVzIikgb3IKICAgV2luZG93cyB3aXRoIGFueSBrZXlib2FyZCwgSSBjYW4ndCB0eXBlIHNvbWUga2V5cyBsaWtlOiAgICJAIiwgIiQiLAogICAiPCIsICI+IiwgZXRjLiBIb3cgY2FuIEkgZml4IHRoaXM/IAoKICAgUS05MTogV2hlbiB0eXBpbmcgSSBzb21ldGltZXMgZ2V0IGRvdWJsZSwgdHJpcGxlLCBvciBtb3JlIG9mIG15CiAgIGtleXN0cm9rZXMgcmVwZWF0ZWQuIEknbSBzdXJlIEkgb25seSB0eXBlZCB0aGVtIG9uY2UsIHdoYXQgY2FuIEkgZG8/IAoKICAgUS05MjogVGhlIHgxMXZuYyAtbm9yZXBlYXQgbW9kZSBpcyBpbiBlZmZlY3QsIGJ1dCBJIHN0aWxsIGdldCByZXBlYXRlZAogICBrZXlzdHJva2VzISEgCgogICBRLTkzOiBBZnRlciB1c2luZyB4MTF2bmMgZm9yIGEgd2hpbGUsIEkgZmluZCB0aGF0IEkgY2Fubm90IHR5cGUgc29tZQogICAob3IgYW55KSBjaGFyYWN0ZXJzIG9yIG15IG1vdXNlIGNsaWNrcyBhbmQgZHJhZ3Mgbm8gbG9uZ2VyIGhhdmUgYW55CiAgIGVmZmVjdCwgb3IgdGhleSBsZWFkIHRvIHN0cmFuZ2UgZWZmZWN0cy4gV2hhdCBoYXBwZW5lZD8gCgogICBRLTk0OiBUaGUgbWFjaGluZSB3aGVyZSBJIHJ1biB4MTF2bmMgaGFzIGFuIEFsdEdyIGtleSwgYnV0IHRoZSBsb2NhbAogICBtYWNoaW5lIHdoZXJlIEkgcnVuIHRoZSBWTkMgdmlld2VyIGRvZXMgbm90LiBJcyB0aGVyZSBhIHdheSBJIGNhbiBtYXAKICAgYSBsb2NhbCB1bnVzZWQga2V5IHRvIHNlbmQgYW4gQWx0R3I/IEhvdyBhYm91dCBhIENvbXBvc2Uga2V5IGFzIHdlbGw/IAoKICAgUS05NTogSSBoYXZlIGEgU3VuIG1hY2hpbmUgSSBydW4geDExdm5jIG9uLiBJdHMgU3VuIGtleWJvYXJkIGhhcyBqdXN0CiAgIG9uZSBBbHQga2V5IGxhYmVsbGVkICJBbHQiIGFuZCB0d28gTWV0YSBrZXlzIGxhYmVsbGVkIHdpdGggbGl0dGxlCiAgIGRpYW1vbmRzLiBUaGUgbWFjaGluZSB3aGVyZSBJIHJ1biB0aGUgVk5DIHZpZXdlciBvbmx5IGhhcyBBbHQga2V5cy4KICAgSG93IGNhbiBJIHNlbmQgYSBNZXRhIGtleXByZXNzPyAoZS5nLiBlbWFjcyBuZWVkcyB0aGlzKSAKCiAgIFEtOTY6IFJ1bm5pbmcgeDExdm5jIG9uIEhQLVVYIEkgY2Fubm90IHR5cGUgIiMiIEkganVzdCBnZXQgYSAiMyIKICAgaW5zdGVhZC4gCgogICBRLTk3OiBDYW4gSSBtYXAgYSBrZXlzdHJva2UgdG8gYSBtb3VzZSBidXR0b24gY2xpY2sgb24gdGhlIHJlbW90ZQogICBtYWNoaW5lPyAKCiAgIFEtOTg6IEhvdyBjYW4gSSBnZXQgQ2Fwc19Mb2NrIHRvIHdvcmsgYmV0d2VlbiBteSBWTkMgdmlld2VyIGFuZAogICB4MTF2bmM/IAoKICAgW1NjcmVlbiBSZWxhdGVkIElzc3VlcyBhbmQgRmVhdHVyZXNdCgogICBRLTk5OiBUaGUgcmVtb3RlIGRpc3BsYXkgaXMgbGFyZ2VyIChpbiBudW1iZXIgb2YgcGl4ZWxzKSB0aGFuIHRoZQogICBsb2NhbCBkaXNwbGF5IEkgYW0gcnVubmluZyB0aGUgdm5jdmlld2VyIG9uLiBJIGRvbid0IGxpa2UgdGhlCiAgIHZuY3ZpZXdlciBzY3JvbGxiYXJzLCB3aGF0IEkgY2FuIGRvPyAKCiAgIFEtMTAwOiBEb2VzIHgxMXZuYyBzdXBwb3J0IHNlcnZlci1zaWRlIGZyYW1lYnVmZmVyIHNjYWxpbmc/IChFLmcuIHRvCiAgIG1ha2UgdGhlIGRlc2t0b3Agc21hbGxlci4pIAoKICAgUS0xMDE6IERvZXMgeDExdm5jIHdvcmsgd2l0aCBYaW5lcmFtYT8gKGkuZS4gbXVsdGlwbGUgbW9uaXRvcnMgam9pbmVkCiAgIHRvZ2V0aGVyIHRvIGZvcm0gb25lIGJpZywgc2luZ2xlIHNjcmVlbi4pIAoKICAgUS0xMDI6IENhbiBJIHVzZSB4MTF2bmMgb24gYSBtdWx0aS1oZWFkZWQgZGlzcGxheSB0aGF0IGlzIG5vdCBYaW5lcmFtYQogICAoaS5lLiBzZXBhcmF0ZSBzY3JlZW5zIDowLjAsIDowLjEsIC4uLiBmb3IgZWFjaCBtb25pdG9yKT8gCgogICBRLTEwMzogQ2FuIHgxMXZuYyBzaG93IG9ubHkgYSBwb3J0aW9uIG9mIHRoZSBkaXNwbGF5PyAoRS5nLiBmb3IgYQogICBzcGVjaWFsIHB1cnBvc2UgYXBwbGljYXRpb24gb3IgYSB2ZXJ5IGxhcmdlIHNjcmVlbi4pIAoKICAgUS0xMDQ6IERvZXMgeDExdm5jIHN1cHBvcnQgdGhlIFhSQU5EUiAoWCBSZXNpemUsIFJvdGF0ZSBhbmQKICAgUmVmbGVjdGlvbikgZXh0ZW5zaW9uPyBXaGVuZXZlciBJIHJvdGF0ZSBvciByZXNpemUgdGhlIHNjcmVlbiB4MTF2bmMKICAganVzdCBzZWVtcyB0byBjcmFzaC4gCgogICBRLTEwNTogSW5kZXBlbmRlbnQgb2YgYW55IFhSQU5EUiwgY2FuIEkgaGF2ZSB4MTF2bmMgcm90YXRlIGFuZC9vcgogICByZWZsZWN0IHRoZSBzY3JlZW4gdGhhdCB0aGUgVk5DIHZpZXdlcnMgc2VlPyAoZS5nLiBmb3IgYSBoYW5kaGVsZAogICB3aG9zZSBzY3JlZW4gaXMgcm90YXRlZCA5MCBkZWdyZWVzLikgCgogICBRLTEwNjogV2h5IGlzIHRoZSB2aWV3IGluIG15IFZOQyB2aWV3ZXIgY29tcGxldGVseSBibGFjaz8gT3Igd2h5IGlzCiAgIGV2ZXJ5dGhpbmcgZmxhc2hpbmcgYXJvdW5kIHJhbmRvbWx5PyAKCiAgIFEtMTA3OiBJIHVzZSBMaW51eCBWaXJ0dWFsIFRlcm1pbmFscyAoVlQncykgdG8gaW1wbGVtZW50ICdGYXN0IFVzZXIKICAgU3dpdGNoaW5nJyBiZXR3ZWVuIHVzZXJzJyBzZXNzaW9ucyAoZS5nLiBCZXR0eSBpcyBvbiBDdHJsLUFsdC1GNywKICAgQm9iYnkgaXMgb24gQ3RybC1BbHQtRjgsIGFuZCBTaWQgaXMgb24gQ3RybC1BbHQtRjE6IHRoZXkgdXNlIHRob3NlCiAgIGtleXN0cm9rZXMgdG8gc3dpdGNoIGJldHdlZW4gdGhlaXIgc2Vzc2lvbnMuKSAgIEhvdyBjb21lIHRoZSB2aWV3IGluIGEKICAgVk5DIHZpZXdlciBjb25uZWN0aW5nIHRvIHgxMXZuYyBpcyBlaXRoZXIgY29tcGxldGVseSBibGFjayBvcgogICBvdGhlcndpc2UgYWxsIG1lc3NlZCB1cCB1bmxlc3MgdGhlIFggc2Vzc2lvbiB4MTF2bmMgaXMgYXR0YWNoZWQgdG8gaXMKICAgaW4gdGhlIGFjdGl2ZSBWVD8gCgogICBRLTEwODogSSBhbSB1c2luZyB4MTF2bmMgd2hlcmUgbXkgbG9jYWwgbWFjaGluZSBoYXMgInBvcHVwL2hpZGRlbgogICB0YXNrYmFycyIgYW5kIHRoZSByZW1vdGUgZGlzcGxheSB3aGVyZSB4MTF2bmMgcnVucyBhbHNvIGhhcwogICAicG9wdXAvaGlkZGVuIHRhc2tiYXJzIiBhbmQgdGhleSBpbnRlcmZlcmUgYW5kIGZpZ2h0IHdpdGggZWFjaCBvdGhlci4KICAgV2hhdCBjYW4gSSBkbz8gCgogICBRLTEwOTogSGVscCEgeDExdm5jIGFuZCBteSBLREUgc2NyZWVuc2F2ZXIga2VlcCBzd2l0Y2hpbmcgZWFjaCBvdGhlcgogICBvbiBhbmQgb2ZmIGV2ZXJ5IGZldyBzZWNvbmRzLiAKCiAgIFEtMTEwOiBJIGFtIHJ1bm5pbmcgdGhlIGNvbXBpeiAzRCB3aW5kb3cgbWFuYWdlciAob3IgYmVyeWwsIE15dGhUdiwKICAgR29vZ2xlIEVhcnRoLCBvciBzb21lIG90aGVyIE9wZW5HTCBhcHApIGFuZCBJIGRvIG5vdCBnZXQgc2NyZWVuCiAgIHVwZGF0ZXMgaW4geDExdm5jLiAKCiAgIFEtMTExOiBDYW4gSSB1c2UgeDExdm5jIHRvIHZpZXcgbXkgVk1XYXJlIHNlc3Npb24gcmVtb3RlbHk/IAoKICAgW0V4cG9ydGluZyBub24tWDExIGRldmljZXMgdmlhIFZOQ10KCiAgIFEtMTEyOiBDYW4gbm9uLVggZGV2aWNlcyAoZS5nLiBhIHJhdyBmcmFtZWJ1ZmZlcikgYmUgdmlld2VkIChhbmQgZXZlbgogICBjb250cm9sbGVkKSB2aWEgVk5DIHdpdGggeDExdm5jPyAKCiAgIFEtMTEzOiBDYW4gSSBleHBvcnQgdGhlIExpbnV4IENvbnNvbGUgKFZpcnR1YWwgVGVybWluYWxzKSB2aWEgVk5DCiAgIHVzaW5nIHgxMXZuYz8gCgogICBRLTExNDogQ2FuIEkgZXhwb3J0IHZpYSBWTkMgYSBXZWJjYW0gb3IgVFYgdHVuZXIgZnJhbWVidWZmZXIgdXNpbmcKICAgeDExdm5jPyAKCiAgIFEtMTE1OiBDYW4gSSBjb25uZWN0IHZpYSBWTkMgdG8gYSBRdC1lbWJlZGRlZC9RdC1lbmhhbmNlZC9RdG9waWEKICAgYXBwbGljYXRpb24gcnVubmluZyBvbiBteSBoYW5kaGVsZCwgY2VsbCBwaG9uZSwgb3IgUEMgdXNpbmcgdGhlIExpbnV4CiAgIGNvbnNvbGUgZnJhbWVidWZmZXIgKGkuZS4gbm90IFgxMSk/IAoKICAgUS0xMTY6IEhvdyBkbyBJIGluamVjdCB0b3VjaCBzY3JlZW4gaW5wdXQgaW50byBhbgogICBRdC1lbWJlZGRlZC9RdC1lbmhhbmNlZC9RdG9waWEgY2VsbCBwaG9uZSBzdWNoIGFzIG9wZW5tb2tvL3F0bW9rbyBOZW8KICAgRnJlZXJ1bm5lcj8gCgogICBRLTExNzogTm93IHRoYXQgbm9uLVgxMSBkZXZpY2VzIGNhbiBiZSBleHBvcnRlZCB2aWEgVk5DIHVzaW5nIHgxMXZuYywKICAgY2FuIEkgYnVpbGQgaXQgd2l0aCBubyBkZXBlbmRlbmNpZXMgb24gWDExIGhlYWRlciBmaWxlcyBhbmQgbGlicmFyaWVzPwogICAKICAgUS0xMTg6IEhvdyBkbyBJIGNyb3NzIGNvbXBpbGUgeDExdm5jIGZvciBhIGRpZmZlcmVudCBhcmNoaXRlY3R1cmUgdGhhbgogICBteSBMaW51eCBpMzg2IG9yIGFtZDY0IFBDPyAKCiAgIFEtMTE5OiBEb2VzIHgxMXZuYyBzdXBwb3J0IE1hYyBPUyBYIEFxdWEvUXVhcnR6IGRpc3BsYXlzIG5hdGl2ZWx5CiAgIChpLmUuIG5vIFgxMSBpbnZvbHZlZCk/IAoKICAgUS0xMjA6IENhbiB4MTF2bmMgYmUgdXNlZCBhcyBhIFZOQyByZWZsZWN0b3IvcmVwZWF0ZXIgdG8gaW1wcm92ZQogICBwZXJmb3JtYW5jZSBmb3IgdGhlIGNhc2Ugb2YgYSBsYXJnZSBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzIFZOQyB2aWV3ZXJzCiAgIChlLmcuIGNsYXNzcm9vbSBicm9hZGNhc3Rpbmcgb3IgYSBsYXJnZSBkZW1vKT8gCgogICBRLTEyMTogQ2FuIHgxMXZuYyBiZSB1c2VkIGR1cmluZyBhIExpbnV4LCBTb2xhcmlzLCBldGMuIHN5c3RlbQogICBJbnN0YWxsYXRpb24gc28gdGhlIEluc3RhbGxhdGlvbiBjYW4gYmUgZG9uZSByZW1vdGVseT8gCgogICBbTWlzYzogQ2xpcGJvYXJkLCBGaWxlIFRyYW5zZmVyL1NoYXJpbmcsIFByaW50aW5nLCBTb3VuZCwgQmVlcHMsCiAgIFRoYW5rcywgZXRjLl0KCiAgIFEtMTIyOiBEb2VzIHRoZSBDbGlwYm9hcmQvU2VsZWN0aW9uIGdldCB0cmFuc2ZlcnJlZCBiZXR3ZWVuIHRoZQogICB2bmN2aWV3ZXIgYW5kIHRoZSBYIGRpc3BsYXk/IAoKICAgUS0xMjM6IENhbiBJIHVzZSB4MTF2bmMgdG8gcmVjb3JkIGEgU2hvY2sgV2F2ZSBGbGFzaCAob3Igb3RoZXIgZm9ybWF0KQogICB2aWRlbyBvZiBteSBkZXNrdG9wLCBlLmcuIHRvIHJlY29yZCBhIHR1dG9yaWFsIG9yIGRlbW8/IAoKICAgUS0xMjQ6IENhbiBJIHRyYW5zZmVyIGZpbGVzIGJhY2sgYW5kIGZvcnRoIHdpdGggeDExdm5jPyAKCiAgIFEtMTI1OiBXaGljaCBVbHRyYVZOQyBleHRlbnNpb25zIGFyZSBzdXBwb3J0ZWQ/IAoKICAgUS0xMjY6IENhbiB4MTF2bmMgZW11bGF0ZSBVbHRyYVZOQydzIFNpbmdsZSBDbGljayBoZWxwZGVzayBtb2RlIGZvcgogICBVbml4PyBJLmUuIHNvbWV0aGluZyB2ZXJ5IHNpbXBsZSBmb3IgYSBuYWl2ZSB1c2VyIHRvIGluaXRpYXRlIGEKICAgcmV2ZXJzZSB2bmMgY29ubmVjdGlvbiBmcm9tIHRoZWlyIFVuaXggZGVza3RvcCB0byBhIGhlbHBkZXNrCiAgIG9wZXJhdG9yJ3MgVk5DIFZpZXdlci4gCgogICBRLTEyNzogQ2FuIEkgKHRlbXBvcmFyaWx5KSBtb3VudCBteSBsb2NhbCAodmlld2VyLXNpZGUpIFdpbmRvd3MvU2FtYmEKICAgRmlsZSBzaGFyZSBvbiB0aGUgbWFjaGluZSB3aGVyZSB4MTF2bmMgaXMgcnVubmluZz8gCgogICBRLTEyODogQ2FuIEkgcmVkaXJlY3QgQ1VQUyBwcmludCBqb2JzIGZyb20gdGhlIHJlbW90ZSBkZXNrdG9wIHdoZXJlCiAgIHgxMXZuYyBpcyBydW5uaW5nIHRvIGEgcHJpbnRlciBvbiBteSBsb2NhbCAodmlld2VyLXNpZGUpIG1hY2hpbmU/IAoKICAgUS0xMjk6IEhvdyBjYW4gSSBoZWFyIHRoZSBzb3VuZCAoYXVkaW8pIGZyb20gdGhlIHJlbW90ZSBhcHBsaWNhdGlvbnMKICAgb24gdGhlIGRlc2t0b3AgSSBhbSB2aWV3aW5nIHZpYSB4MTF2bmM/IAoKICAgUS0xMzA6IFdoeSBkb24ndCBJIGhlYXIgdGhlICJCZWVwcyIgaW4gbXkgWCBzZXNzaW9uIChlLmcuIHdoZW4gdHlwaW5nCiAgIHRwdXQgYmVsIGluIGFuIHh0ZXJtKT8gCgogICBRLTEzMTogRG9lcyB4MTF2bmMgd29yayB3aXRoIElQdjY/IAoKICAgUS0xMzI6IFRoYW5rcyBmb3IgeW91ciBwcm9ncmFtIG9yIGZvciB5b3VyIGhlbHAhIENhbiBJIG1ha2UgYQogICBkb25hdGlvbj8gCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCgogICBbQnVpbGRpbmcgYW5kIFN0YXJ0aW5nXQoKICAgUS0xOiBJIGNhbid0IGdldCB4MTF2bmMgdG8gc3RhcnQgdXAuIEl0IHNheXMgIlhPcGVuRGlzcGxheSBmYWlsZWQKICAgKG51bGwpIiBvciAiWGxpYjogY29ubmVjdGlvbiB0byAiOjAuMCIgcmVmdXNlZCBieSBzZXJ2ZXIgWGxpYjogTm8KICAgcHJvdG9jb2wgc3BlY2lmaWVkIiBhbmQgdGhlbiBleGl0cy4gV2hhdCBkbyBJIG5lZWQgdG8gZG8/CgogICBGb3IgdGhlIGZvcm1lciBlcnJvciwgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgWCBkaXNwbGF5IHRvIGNvbm5lY3QgdG8KICAgKGl0IGFsc28gbmVlZHMgdG8gYmUgb24gdGhlIHNhbWUgbWFjaGluZSB0aGUgeDExdm5jIHByb2Nlc3MgaXMgdG8gcnVuCiAgIG9uLikgU2V0IHlvdXIgRElTUExBWSBlbnZpcm9ubWVudCB2YXJpYWJsZSAob3IgdXNlIHRoZSAtZGlzcGxheQogICBvcHRpb24pIHRvIHNwZWNpZnkgaXQuIE5lYXJseSBhbHdheXMgdGhlIGNvcnJlY3QgdmFsdWUgd2lsbCBiZSAiOjAiCiAgIChpbiBmYWN0LCB4MTF2bmMgd2lsbCBub3cgYXNzdW1lIDowIGlmIGdpdmVuIG5vIG90aGVyIGluZm9ybWF0aW9uLikKCgogICBGb3IgdGhlIGxhdHRlciBlcnJvciwgeW91IG5lZWQgdG8gc2V0IHVwIHRoZSBYMTEgcGVybWlzc2lvbnMKICAgY29ycmVjdGx5LgoKICAgVG8gbWFrZSBzdXJlIFgxMSBwZXJtaXNzaW9ucyBhcmUgdGhlIHByb2JsZW0gZG8gdGhpcyBzaW1wbGUgdGVzdDoKICAgd2hpbGUgc2l0dGluZyBhdCB0aGUgcGh5c2ljYWwgWCBkaXNwbGF5IG9wZW4gYSB0ZXJtaW5hbCB3aW5kb3cKICAgKGdub21lLXRlcm1pbmFsLCB4dGVybSwgZXRjLikgWW91IHNob3VsZCBiZSBhYmxlIHRvIHJ1biB4MTF2bmMKICAgc3VjY2Vzc2Z1bGx5IHdpdGhvdXQgYW55IG5lZWQgZm9yIHNwZWNpYWwgc3RlcHMgb3IgY29tbWFuZCBsaW5lCiAgIG9wdGlvbnMgaW4gdGhhdCB0ZXJtaW5hbCAoaS5lLiBqdXN0IHR5cGUgIngxMXZuYyIuKSBJZiB0aGF0IHdvcmtzIE9LCiAgIHRoZW4geW91IGtub3cgWDExIHBlcm1pc3Npb25zIGFyZSB0aGUgb25seSB0aGluZyBwcmV2ZW50aW5nIGl0IGZyb20KICAgd29ya2luZyB3aGVuIHlvdSB0cnkgdG8gc3RhcnQgeDExdm5jIHZpYSwgc2F5LCBhIHJlbW90ZSBzaGVsbC4KCiAgIEhvdyB0byBTb2x2ZTogIFNlZSB0aGUgeGF1dGgoMSksIFhzZWN1cml0eSg3KSwgYW5kIHhob3N0KDEpIG1hbiBwYWdlcwogICBvciB0aGlzIEhvd3RvIGZvciBtdWNoIGluZm8gb24gWDExIHBlcm1pc3Npb25zLiBGb3IgZXhhbXBsZSwgeW91IG1heQogICBuZWVkIHRvIHNldCB5b3VyIFhBVVRIT1JJVFkgZW52aXJvbm1lbnQgdmFyaWFibGUgKG9yIHVzZSB0aGUgLWF1dGgKICAgb3B0aW9uKSB0byBwb2ludCB0byB0aGUgY29ycmVjdCBNSVQtTUFHSUMtQ09PS0lFIGZpbGUgKGUuZy4KICAgL2hvbWUvam9lLy5YYXV0aG9yaXR5IG9yIC92YXIvZ2RtLzowLlhhdXRoIG9yIC92YXIvbGliL2tkbS9BOjAtY3JXazcySwogICBvciAvdG1wLy5nZG16bmRWbFIsIGV0YywgZXRjLiksIG9yIHNpbXBseSBiZSBzdXJlIHlvdSBydW4geDExdm5jIGFzCiAgIHRoZSBjb3JyZWN0IHVzZXIgKGkuZS4gdGhlIHVzZXIgd2hvIGlzIGxvZ2dlZCBpbnRvIHRoZSBYIHNlc3Npb24geW91CiAgIHdpc2ggdG8gdmlldy4pCgogICBOb3RlOiBUaGUgTUlUIGNvb2tpZSBmaWxlIGNvbnRhaW5zIHRoZSBzZWNyZXQga2V5IHRoYXQgYWxsb3dzIHgxMXZuYwogICB0byBjb25uZWN0IHRvIHRoZSBkZXNpcmVkIFggZGlzcGxheS4KCiAgIElmLCBzYXksIHNzaGQgaGFzIHNldCBYQVVUSE9SSVRZIHRvIHBvaW50IHRvIGEgcmFuZG9tIGZpbGUgaXQgaGFzCiAgIGNyZWF0ZWQgZm9yIFggZm9yd2FyZGluZyB0aGF0IHdpbGwgY2F1c2UgcHJvYmxlbXMuIChVbmRlciBzb21lCiAgIGNpcmN1bXN0YW5jZXMgZXZlbiBzdSgxKSBhbmQgdGVsbmV0KDEpIGNhbiBzZXQgWEFVVEhPUklUWS4gU2VlIGFsc28KICAgdGhlIGdkbSBwYXJhbWV0ZXIgTmV2ZXJQbGFjZUNvb2tpZXNPbk5GUyB0aGF0IHNldHMgWEFVVEhPUklUWSB0byBhCiAgIHJhbmRvbSBmaWxlbmFtZSBpbiAvdG1wIGZvciB0aGUgd2hvbGUgWCBzZXNzaW9uLikKCiAgIFJ1bm5pbmcgeDExdm5jIGFzIHJvb3QgaXMgb2Z0ZW4gbm90IGVub3VnaDogeW91IG5lZWQgdG8ga25vdyB3aGVyZSB0aGUKICAgTUlULU1BR0lDLUNPT0tJRSBmaWxlIGZvciB0aGUgZGVzaXJlZCBYIGRpc3BsYXkgaXMuCgogICBFeGFtcGxlIHNvbHV0aW9uOgogIHgxMXZuYyAtZGlzcGxheSA6MCAtYXV0aCAvdmFyL2dkbS86MC5YYXV0aAoKICAgKHRoaXMgaXMgZm9yIHRoZSBkaXNwbGF5IG1hbmFnZXIgZ2RtIGFuZCByZXF1aXJlcyByb290IHBlcm1pc3Npb24gdG8KICAgcmVhZCB0aGUgZ2RtIGNvb2tpZSBmaWxlLCBzZWUgdGhpcyBmYXEgZm9yIG90aGVyIGRpc3BsYXkgbWFuYWdlcgogICBjb29raWUgZmlsZSBuYW1lcy4pCgogICBOb3RlIGFzIG9mIEZlYi8yMDA3IHlvdSBjYW4gYWxzbyB0cnkgdGhlIC1maW5kIG9wdGlvbiBpbnN0ZWFkIG9mCiAgICItZGlzcGxheSAuLi4iIGFuZCBzZWUgaWYgdGhhdCBmaW5kcyB5b3VyIGRpc3BsYXkgYW5kIFhhdXRob3JpdHkuCgogICBMZXNzIHNhZmUsIGJ1dCB0byBhdm9pZCBmaWd1cmluZyBvdXQgd2hlcmUgdGhlIGNvcnJlY3QgWEFVVEhPUklUWSBmaWxlCiAgIGlzLCBpZiB0aGUgcGVyc29uIHNpdHRpbmcgYXQgdGhlIHBoeXNpY2FsIFggc2Vzc2lvbiB0eXBlcyAieGhvc3QKICAgK2xvY2FsaG9zdCIgdGhlbiBvbmUgc2hvdWxkIGJlIGFibGUgdG8gYXR0YWNoIHgxMXZuYyB0byB0aGUgc2Vzc2lvbgogICAoZnJvbSB0aGUgc2FtZSBtYWNoaW5lLikgVGhlIHBlcnNvbiBjb3VsZCB0aGVuIHR5cGUgInhob3N0IC1sb2NhbGhvc3QiCiAgIGFmdGVyIHgxMXZuYyBoYXMgY29ubmVjdGVkIHRvIGdvIGJhY2sgdG8gdGhlIGRlZmF1bHQgcGVybWlzc2lvbnMuCiAgIEFsc28sIGZvciBzb21lIHNpdHVhdGlvbnMgdGhlICItdXNlcnMgbHVyaz0iIG9wdGlvbiBtYXkgc29vbiBiZSBvZiB1c2UKICAgKHBsZWFzZSByZWFkIHRoZSBkb2N1bWVudGF0aW9uIG9uIHRoZSAtdXNlcnMgb3B0aW9uLikKCiAgIFRvIHRlc3Qgb3V0IHlvdXIgWDExIHBlcm1pc3Npb25zIGZyb20gYSByZW1vdGUgc2hlbGwsIHNldCBESVNQTEFZIGFuZAogICBwb3NzaWJseSBYQVVUSE9SSVRZIChzZWUgeW91ciBzaGVsbCdzIG1hbiBwYWdlLCBiYXNoKDEpLCB0Y3NoKDEpLCBvbgogICBob3cgdG8gc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcykgYW5kIHR5cGUgeGRweWluZm8gaW4gdGhlIHNhbWUgcGxhY2UKICAgeW91IHdpbGwgYmUgdHlwaW5nIChvciBvdGhlcndpc2UgcnVubmluZykgeDExdm5jLiBJZiBpbmZvcm1hdGlvbiBpcwogICBwcmludGVkIG91dCBhYm91dCB0aGUgWCBkaXNwbGF5IChzY3JlZW4gc2l6ZXMsIHN1cHBvcnRlZCBleHRlbnNpb25zLAogICBjb2xvciB2aXN1YWxzIGluZm8pIHRoYXQgbWVhbnMgdGhlIFgxMSBwZXJtaXNzaW9ucyBhcmUgc2V0IHVwCiAgIHByb3Blcmx5OiB4ZHB5aW5mbyBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIERJU1BMQVkhIFlvdSBjb3VsZCBhbHNvCiAgIHR5cGUgeGNsb2NrIGFuZCBtYWtlIHN1cmUgbm8gZXJyb3JzIGFyZSByZXBvcnRlZCAoYSBjbG9jayBzaG91bGQKICAgYXBwZWFyIG9uIHRoZSBYIGRpc3BsYXksIHByZXNzIEN0cmwtQyB0byBzdG9wIGl0LikgSWYgdGhlc2Ugd29yaywgdGhlbgogICB0eXBpbmcgIngxMXZuYyIgaW4gdGhlIHNhbWUgZW52aXJvbm1lbnQgc2hvdWxkIGFsc28gd29yay4KCiAgIEltcG9ydGFudDogaWYgeW91IGNhbm5vdCBnZXQgeW91ciBYMTEgcGVybWlzc2lvbnMgc28gdGhhdCB0aGUgeGRweWluZm8KICAgb3IgeGNsb2NrIHRlc3RzIHdvcmssIHgxMXZuYyBhbHNvIHdpbGwgbm90IHdvcmsgKGFsbCBvZiB0aGVzZSBYCiAgIGNsaWVudHMgbXVzdCBiZSBhbGxvd2VkIHRvIGNvbm5lY3QgdG8gdGhlIFggc2VydmVyIHRvIGZ1bmN0aW9uCiAgIHByb3Blcmx5LikKCiAgIEZpcmV3YWxsczogU3BlYWtpbmcgb2YgcGVybWlzc2lvbnMsIGl0IHNob3VsZCBnbyB3aXRob3V0IHNheWluZyB0aGF0CiAgIHRoZSBob3N0LWxldmVsIGZpcmV3YWxsIHdpbGwgbmVlZCB0byBiZSBjb25maWd1cmVkIHRvIGFsbG93CiAgIGNvbm5lY3Rpb25zIGluIG9uIGEgcG9ydC4gRS5nLiA1OTAwIChkZWZhdWx0IFZOQyBwb3J0KSBvciAyMiAoZGVmYXVsdAogICBTU0ggcG9ydCBmb3IgdHVubmVsbGluZyBWTkMuKSBNb3N0IHN5c3RlbXMgdGhlc2UgZGF5cyBoYXZlIGZpcmV3YWxscwogICB0dXJuZWQgb24gYnkgZGVmYXVsdCwgc28geW91IHdpbGwgYWN0aXZlbHkgaGF2ZSB0byBkbyBzb21ldGhpbmcgdG8KICAgcG9rZSBhIGhvbGUgaW4gdGhlIGZpcmV3YWxsIGF0IHRoZSBkZXNpcmVkIHBvcnQgbnVtYmVyLiBTZWUgeW91cgogICBzeXN0ZW0gYWRtaW5pc3RyYXRpb24gdG9vbCBmb3IgRmlyZXdhbGwgc2V0dGluZ3MgKFlhc3QsIEZpcmVzdGFydGVyLAogICBldGMuKQoKCiAgIFEtMjogSSBjYW4ndCBnZXQgeDExdm5jIGFuZC9vciBsaWJ2bmNzZXJ2ZXIgdG8gY29tcGlsZS4KCiAgIE1ha2Ugc3VyZSB5b3UgaGF2ZSBnY2MgKG9yIG90aGVyIEMgY29tcGlsZXIpIGFuZCBhbGwgb2YgdGhlIHJlcXVpcmVkCiAgIGxpYnJhcmllcyBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgLWRldi8tZGV2ZWwgcGFja2FnZXMgaW5zdGFsbGVkLiBUaGVzZQogICBpbmNsdWRlIFhvcmcvWEZyZWU4NiwgbGliWDExLCBsaWJqcGVnLCBsaWJ6LCBsaWJzc2wsIC4uLiBhbmQgZG9uJ3QKICAgZm9yZ2V0IHRoZSBkZXZzOiBsaWJqcGVnLWRldiwgbGlic3NsLWRldiAuLi4KCiAgIFRoZSBtb3N0IGNvbW1vbiBidWlsZCBwcm9ibGVtIHRoYXQgcGVvcGxlIGVuY291bnRlciBpcyB0aGF0IHRoZQogICBuZWNlc3NhcnkgWDExIGxpYnJhcmllcyBhcmUgaW5zdGFsbGVkIG9uIHRoZWlyIHN5c3RlbSBob3dldmVyIGl0IGRvZXMKICAgbm90IGhhdmUgdGhlIGNvcnJlc3BvbmRpbmcgLWRldi8tZGV2ZWwgcGFja2FnZXMgaW5zdGFsbGVkLiBUaGVzZSBkZXYKICAgcGFja2FnZXMgaW5jbHVkZSBDIGhlYWRlciBmaWxlcyBhbmQgYnVpbGQtdGltZSAuc28gc3ltbGluay4gSXQgaXMgYQogICBzaGFtZSB0aGUgY3VycmVudCB0cmVuZCBpbiBkaXN0cm9zIGlzIHRvIG5vdCBpbnN0YWxsIHRoZSBkZXYgcGFja2FnZQogICBieSBkZWZhdWx0IHdoZW4gdGhlIHRoZSBsaWJyYXJ5IHJ1bnRpbWUgcGFja2FnZSBpcyBpbnN0YWxsZWQuLi4gKGl0CiAgIGRpbWluaXNoZXMgdGhlIHBvd2VyIG9mIG9wZW4gc291cmNlKQoKICAgQXMgb2YgTm92LzIwMDYgaGVyZSBpcyBhIGxpc3Qgb2YgbGlicmFyaWVzIHRoYXQgeDExdm5jIHVzdWFsbHkgbGlrZXMKICAgdG8gdXNlOgpsaWJjLnNvICAgICAgICBsaWJYMTEuc28gICAgICAgbGliWHRzdC5zbyAgICAgICBsaWJYZXh0LnNvCmxpYlhmaXhlcy5zbyAgIGxpYlhkYW1hZ2Uuc28gICBsaWJYaW5lcmFtYS5zbyAgIGxpYlhyYW5kci5zbwpsaWJ6LnNvICAgICAgICBsaWJqcGVnLnNvICAgICAgbGlicHRocmVhZC5zbwpsaWJzc2wuc28gICAgICBsaWJjcnlwdG8uc28gICAgbGliY3J5cHQuc28KCiAgIGFsdGhvdWdoIHgxMXZuYyB3aWxsIGJlIHByZXR0eSB1c2FibGUgd2l0aCB0aGUgc3Vic2V0OiBsaWJjLnNvLAogICBsaWJYMTEuc28sIGxpYlh0c3Quc28sIGxpYlhleHQuc28sIGxpYnouc28sIGFuZCBsaWJqcGVnLnNvLgoKICAgQWZ0ZXIgcnVubmluZyB0aGUgbGlidm5jc2VydmVyIGNvbmZpZ3VyZSwgY2FyZWZ1bGx5IGV4YW1pbmUgdGhlIG91dHB1dAogICBhbmQgdGhlIG1lc3NhZ2VzIGluIHRoZSBjb25maWcubG9nIGZpbGUgbG9va2luZyBmb3IgbWlzc2luZwogICBjb21wb25lbnRzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGNvbmZpZ3VyZSBvdXRwdXQgbG9va3MgbGlrZToKICBjaGVja2luZyBob3cgdG8gcnVuIHRoZSBDIHByZXByb2Nlc3Nvci4uLiBnY2MgLUUKICBjaGVja2luZyBmb3IgWC4uLiBubwogIGNoZWNraW5nIGZvciBYa2JTZWxlY3RFdmVudHMgaW4gLWxYMTEuLi4gbm8KICBjaGVja2luZyBmb3IgWGluZXJhbWFRdWVyeVNjcmVlbnMgaW4gLWxYaW5lcmFtYS4uLiBubwogIGNoZWNraW5nIGZvciBYVGVzdEZha2VLZXlFdmVudCBpbiAtbFh0c3QuLi4gbm8KCiAgIG9yIGV2ZW4gd29yc2U6CiAgY2hlY2tpbmcgZm9yIEMgY29tcGlsZXIgZGVmYXVsdCBvdXRwdXQgZmlsZSBuYW1lLi4uIGNvbmZpZ3VyZTogZXJyb3I6CiAgQyBjb21waWxlciBjYW5ub3QgY3JlYXRlIGV4ZWN1dGFibGVzCiAgU2VlIGBjb25maWcubG9nJyBmb3IgbW9yZSBkZXRhaWxzLgoKICAgdGhlcmUgaXMgcXVpdGUgYSBiaXQgd3Jvbmcgd2l0aCB0aGUgYnVpbGQgZW52aXJvbm1lbnQuIEhvcGVmdWxseQogICBzaW1wbHkgYWRkaW5nIC1kZXYgcGFja2FnZXMgYW5kL29yIGdjYyBvciBtYWtlIHdpbGwgZml4IGl0LgoKICAgRm9yIERlYmlhbiB0aGUgbGlzdCBzZWVtcyB0byBiZToKICBnY2MKICBtYWtlCiAgbGliYzYtZGV2CiAgbGlianBlZzgtZGV2ICAgICAgICAgICAoZm9ybWVybHkgbGlianBlZzYyLWRldikKICBsaWJ4MTEtZGV2CiAgeDExcHJvdG8tY29yZS1kZXYgICAgICAoZm9ybWVybHkgeC1kZXYpCiAgbGlieGV4dC1kZXYKICBsaWJ4dHN0LWRldgogIGxpYnhkYW1hZ2UtZGV2CiAgbGlieGZpeGVzLWRldgogIGxpYnhyYW5kci1kZXYKICBsaWJ4aW5lcmFtYS1kZXYKICBsaWJ4c3MtZGV2ICAgICAgICAgICAgIChmb3JtZXJseSB4bGlicy1zdGF0aWMtZGV2KQogIHpsaWIxZy1kZXYKICBsaWJzc2wtZGV2CiAgbGliYXZhaGktY2xpZW50LWRldgogIGxpbnV4LWxpYmMtZGV2ICAgICAgICAgKG9ubHkgbmVlZGVkIGZvciBsaW51eCBjb25zb2xlIHJhd2ZiIHN1cHBvcnQpCgogICBOb3RlIHRoYXQgZGVwZW5kaW5nIG9uIHlvdXIgT1MgdmVyc2lvbiB0aGUgYWJvdmUgbmFtZXMgbWF5IGhhdmUgYmVlbgogICBjaGFuZ2VkIGFuZC9vciBhZGRpdGlvbmFsIHBhY2thZ2VzIG1heSBiZSBuZWVkZWQuCgogICBGb3IgUmVkaGF0IHRoZSBsaXN0IHNlZW1zIHRvIGJlOgogIGdjYwogIG1ha2UKICBnbGliYy1kZXZlbAogIGxpYmpwZWctZGV2ZWwKICBsaWJYMTEtZGV2ZWwKICB4b3JnLXgxMS1wcm90by1kZXZlbAogIGxpYlhkYW1hZ2UtZGV2ZWwKICBsaWJYZml4ZXMtZGV2ZWwKICBsaWJYcmFuZHItZGV2ZWwKICB6bGliLWRldmVsCiAgb3BlbnNzbC1kZXZlbAogIGF2YWhpLWRldmVsCiAga2VybmVsLWhlYWRlcnMgICAgICAgICAob25seSBuZWVkZWQgZm9yIGxpbnV4IGNvbnNvbGUgcmF3ZmIgc3VwcG9ydCkKCiAgIEZvciBvdGhlciBkaXN0cm9zIG9yIE9TJ3MgdGhlIHBhY2thZ2UgbmFtZXMgbWF5IG5vdCBiZSB0aGUgc2FtZSBidXQKICAgd2lsbCBsb29rIHNpbWlsYXIuIEFsc28sIGRpc3Ryb3MgdGVuZCB0byByZW5hbWUgcGFja2FnZXMgYXMgd2VsbCBzbwogICB0aGUgYWJvdmUgbGlzdCBtYXkgYmUgb3V0IG9mIGRhdGUuIFNvIG9ubHkgdXNlIHRoZSBhYm92ZSBsaXN0cyBhcwogICBoaW50cyBmb3IgdGhlIHBhY2thZ2UgbmFtZXMgdGhhdCBhcmUgbmVlZGVkLgoKICAgSGF2ZSBhIGxvb2sgYXQgTWlzYy4gQnVpbGQgUHJvYmxlbXMgZm9yIGFkZGl0aW9uYWwgZml4ZXMuCgogICBOb3RlOiB0aGVyZSBpcyBncm93aW5nIHRyZW5kIGluIExpbnV4IGFuZCBvdGhlciBkaXN0cm9zIHRvIHNsaWNlIHVwCiAgIGNvcmUgWDExIHNvZnR3YXJlIGludG8gbW9yZSBhbmQgc21hbGxlciBwYWNrYWdlcy4gU28gYmUgcHJlcGFyZWQgZm9yCiAgIG1vcmUgaGVhZGFjaGVzIGNvbXBpbGluZyBzb2Z0d2FyZS4uLgoKCiAgIFEtMzogSSBqdXN0IGJ1aWx0IHgxMXZuYyBzdWNjZXNzZnVsbHksIGJ1dCB3aGVuIEkgdXNlIGl0IG15IGtleXN0cm9rZXMKICAgYW5kIG1vdXNlIGJ1dHRvbiBjbGlja3MgYXJlIGlnbm9yZWQgIChJIGFtIGFibGUgdG8gbW92ZSB0aGUgbW91c2UKICAgdGhvdWdoLikKCiAgIFRoaXMgaXMgbW9zdCBsaWtlbHkgZHVlIHRvIHlvdSBub3QgaGF2aW5nIGEgd29ya2luZyBidWlsZCBlbnZpcm9ubWVudAogICBmb3IgdGhlIFhURVNUIGNsaWVudCBsaWJyYXJ5IGxpYlh0c3Quc28uIFRoZSBsaWJyYXJ5IGlzIHByb2JhYmx5CiAgIHByZXNlbnQgb24geW91ciBzeXN0ZW0sIGJ1dCB0aGUgcGFja2FnZSBpbnN0YWxsaW5nIHRoZSBidWlsZCBoZWFkZXIKICAgZmlsZSBpcyBtaXNzaW5nLgoKICAgSWYgeW91IHdlcmUgd2F0Y2hpbmcgY2FyZWZ1bGx5IHdoaWxlIGNvbmZpZ3VyZSB3YXMgcnVubmluZyB5b3Ugd291bGQKICAgaGF2ZSBzZWVuOgogIGNoZWNraW5nIGZvciBYVGVzdEZha2VLZXlFdmVudCBpbiAtbFh0c3QuLi4gbm8KCiAgIFRoZSBzb2x1dGlvbiBpcyB0byBhZGQgdGhlIG5lY2Vzc2FyeSBidWlsZCBlbnZpcm9ubWVudCBwYWNrYWdlIChhbmQKICAgdGhlIGxpYnJhcnkgcGFja2FnZSBpZiB0aGF0IGlzIG1pc3NpbmcgdG9vLikgT24gRGViaWFuIHRoZSBidWlsZAogICBwYWNrYWdlIGlzIGxpYnh0c3QtZGV2LiBPdGhlciBkaXN0cm9zL09TJ3MgbWF5IGhhdmUgaXQgaW4gYW5vdGhlcgogICBwYWNrYWdlLgoKICAgeDExdm5jIHdpbGwgYnVpbGQgd2l0aG91dCBzdXBwb3J0IGZvciB0aGlzIGxpYnJhcnkgKGUuZy4gcGVyaGFwcyBvbmUKICAgd2FudHMgYSB2aWV3LW9ubHkgeDExdm5jIG9uIGEgc3RyaXBwZWQgZG93biBvciBlbWJlZGRlZCBzeXN0ZW0uLi4pIEFuZAogICBhdCBydW50aW1lIGl0IHdpbGwgYWxzbyBjb250aW51ZSB0byBydW4gZXZlbiBpZiB0aGUgWCBzZXJ2ZXIgaXQKICAgY29ubmVjdHMgdG8gZG9lcyBub3Qgc3VwcG9ydCBYVEVTVC4gSW4gYm90aCBjYXNlcyBpdCBjYW5ub3QgaW5qZWN0CiAgIGtleXN0cm9rZXMgb3IgYnV0dG9uIGNsaWNrcyBzaW5jZSBYVEVTVCBpcyBuZWVkZWQgZm9yIHRoYXQgKGl0IGNhbgogICBzdGlsbCBtb3ZlIHRoZSBtb3VzZSBwb2ludGVyIHVzaW5nIHRoZSBYIEFQSSBYV2FycFBvaW50ZXIoKS4pCgogICBZb3Ugd2lsbCBzZWUgYSB3YXJuaW5nIG1lc3NhZ2Ugc29tZXRoaW5nIGxpa2UgdGhpcyBhdCBydW4gdGltZToKICAyMC8wMy8yMDA1IDIyOjMzOjA5IFdBUk5JTkc6IFhURVNUIGV4dGVuc2lvbiBub3QgYXZhaWxhYmxlIChlaXRoZXIgbWlzc2luZyBmcgpvbQogIDIwLzAzLzIwMDUgMjI6MzM6MDkgICBkaXNwbGF5IG9yIGNsaWVudCBsaWJyYXJ5IGxpYlh0c3QgbWlzc2luZyBhdCBidWlsZCB0aW1lCi4pCiAgMjAvMDMvMjAwNSAyMjozMzowOSAgIE1PU1QgdXNlciBpbnB1dCAocG9pbnRlciBhbmQga2V5Ym9hcmQpIHdpbGwgYmUgRElTQ0FSREUKRC4KICAyMC8wMy8yMDA1IDIyOjMzOjA5ICAgSWYgZGlzcGxheSBkb2VzIGhhdmUgWFRFU1QsIGJlIHN1cmUgdG8gYnVpbGQgeDExdm5jIHdpdApoCiAgMjAvMDMvMjAwNSAyMjozMzowOSAgIGEgd29ya2luZyBsaWJYdHN0IGJ1aWxkIGVudmlyb25tZW50IChlLmcuIGxpYnh0c3QtZGV2LAogIDIwLzAzLzIwMDUgMjI6MzM6MDkgICBvciBvdGhlciBwYWNrYWdlcy4pCiAgMjAvMDMvMjAwNSAyMjozMzowOSBObyBYVEVTVCBleHRlbnNpb24sIHN3aXRjaGluZyB0byAteHdhcnBwb2ludGVyIG1vZGUgZm9yCiAgMjAvMDMvMjAwNSAyMjozMzowOSAgIHBvaW50ZXIgbW90aW9uIGlucHV0LgoKICAgQWxzbywgYXMgb2YgTm92LzIwMDYgdGhlcmUgd2lsbCBiZSBhIGNvbmZpZ3VyZSBidWlsZCB0aW1lIHdhcm5pbmcgYXMKICAgd2VsbDoKICAuLi4KICBjaGVja2luZyBmb3IgWEZpeGVzR2V0Q3Vyc29ySW1hZ2UgaW4gLWxYZml4ZXMuLi4geWVzCiAgY2hlY2tpbmcgZm9yIFhEYW1hZ2VRdWVyeUV4dGVuc2lvbiBpbiAtbFhkYW1hZ2UuLi4geWVzCiAgY29uZmlndXJlOiBXQVJOSU5HOgogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgQSB3b3JraW5nIGJ1aWxkIGVudmlyb25tZW50IGZvciB0aGUgWFRFU1QgZXh0ZW5zaW9uIHdhcyBub3QgZm91bmQgKGxpYlh0c3QpLgogIEFuIHgxMXZuYyBidWlsdCB0aGlzIHdheSB3aWxsIGJlIG9ubHkgYmFyZWx5IHVzYWJsZS4gIFlvdSB3aWxsIGJlIGFibGUgdG8KICBtb3ZlIHRoZSBtb3VzZSBidXQgbm90IGNsaWNrIG9yIHR5cGUuICBUaGVyZSBjYW4gYWxzbyBiZSBkZWFkbG9ja3MgaWYgYW4KICBhcHBsaWNhdGlvbiBncmFicyB0aGUgWCBzZXJ2ZXIuCgogIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGluc3RhbGwgdGhlIG5lY2Vzc2FyeSBkZXZlbG9wbWVudCBwYWNrYWdlcwogIGZvciBYVEVTVCAocGVyaGFwcyBpdCBpcyBuYW1lZCBzb21ldGhpbmcgbGlrZSBsaWJ4dHN0LWRldikgYW5kIHJ1bgogIGNvbmZpZ3VyZSBhZ2Fpbi4KICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKCiAgIFEtNDogSGVscCwgSSBuZWVkIHRvIHJ1biB4MTF2bmMgb24gU29sYXJpcyAyLjUuMSAob3Igb3RoZXIgb2xkCiAgIFVuaXgvTGludXgpIGFuZCBpdCBkb2Vzbid0IGNvbXBpbGUhCgogICBXZSBhcG9sb2dpemUgdGhhdCB4MTF2bmMgZG9lcyBub3QgYnVpbGQgY2xlYW5seSBvbiBvbGRlciB2ZXJzaW9ucyBvZgogICBTb2xhcmlzLCBMaW51eCwgZXRjLjogdmVyeSBmZXcgdXNlcnMgYXJlIG9uIHRoZXNlIG9sZCByZWxlYXNlcy4KCiAgIFdlIGhhdmUgaGVhcmQgdGhhdCBzaW5jZSBEZWMvMjAwNCBhIFNvbGFyaXMgMi42IGJ1aWx0IHgxMXZuYyB3aWxsIHJ1bgogICBvbiBTb2xhcmlzIFNvbGFyaXMgMi41IGFuZCAyLjUuMSAoc2luY2UgYSB3b3JrYXJvdW5kIGZvciBYQ29udmVydENhc2UKICAgaXMgcHJvdmlkZWQuKQoKICAgSW4gYW55IGV2ZW50LCBoZXJlIGlzIGEgd29ya2Fyb3VuZCBmb3IgU29sYXJpcyAyLjUuMSAoYW5kIHBlcmhhcHMKICAgZWFybGllciBhbmQgcGVyaGFwcyBub24tU29sYXJpcyk6CgogICBGaXJzdCB1c2UgdGhlIGVudmlyb25tZW50IHNldHRpbmdzIChDUFBGTEFHUywgTERGTEFHUywgZXRjLikgaW4gdGhlCiAgIGFib3ZlIFNvbGFyaXMgYnVpbGQgc2NyaXB0IHRvIHJ1biB0aGUgY29uZmlndXJlIGNvbW1hbmQuIFRoYXQgc2hvdWxkCiAgIHN1Y2NlZWQgd2l0aG91dCBmYWlsdXJlLiBUaGVuIHlvdSBoYXZlIHRvIGhhbmQgZWRpdCB0aGUgYXV0b2dlbmVyYXRlZAogICByZmIvcmZiY29uZmlnLmggZmlsZSBpbiB0aGUgc291cmNlIHRyZWUsIGFuZCBqdXN0IGJlZm9yZSB0aGUgbGFzdAogICAjZW5kaWYgYXQgdGhlIGJvdHRvbSBvZiB0aGF0IGZpbGUgaW5zZXJ0IHRoZXNlIHdvcmthcm91bmQgbGluZXM6CnN0cnVjdCB0aW1ldmFsIF90bXBfdXNsZWVwX3R2OwojZGVmaW5lIHVzbGVlcCh4KSBcCiAgICBfdG1wX3VzbGVlcF90di50dl9zZWMgID0gKHgpIC8gMTAwMDAwMDsgXAogICAgX3RtcF91c2xlZXBfdHYudHZfdXNlYyA9ICh4KSAlIDEwMDAwMDA7IFwKICAgIHNlbGVjdCgwLCBOVUxMLCBOVUxMLCBOVUxMLCAmX3RtcF91c2xlZXBfdHYpOwppbnQgZ2V0aG9zdG5hbWUoY2hhciAqbmFtZSwgaW50IG5hbWVsZW4pOwpsb25nIHJhbmRvbSgpOwppbnQgc3JhbmRvbSh1bnNpZ25lZCBpbnQgc2VlZCk7CiN1bmRlZiBMSUJWTkNTRVJWRVJfSEFWRV9MSUJQVEhSRUFECiNkZWZpbmUgU0hVVF9SRFdSIDIKdHlwZWRlZiB1bnNpZ25lZCBpbnQgaW5fYWRkcl90OwojZGVmaW5lIHNucHJpbnRmKGEsIG4sIGFyZ3MuLi4pIHNwcmludGYoKGEpLCAjIyBhcmdzKQoKICAgVGhlbiBydW4gbWFrZSB3aXRoIHRoZSBTb2xhcmlzIGJ1aWxkIHNjcmlwdCBlbnZpcm9ubWVudCwgZXZlcnl0aGluZwogICBzaG91bGQgY29tcGlsZSB3aXRob3V0IHByb2JsZW1zLCBhbmQgdGhlIHJlc3VsdGluZyB4MTF2bmMgYmluYXJ5CiAgIHNob3VsZCB3b3JrIE9LLiBJZiBzb21lIG5vbi14MTF2bmMgcmVsYXRlZCBwcm9ncmFtcyBmYWlsIChlLmcuIHRlc3QKICAgcHJvZ3JhbXMpIGFuZCB0aGUgeDExdm5jIGJpbmFyeSBpcyBub3QgY3JlYXRlZCB0cnkgIm1ha2UgLWsiIHRvIGhhdmUKICAgaXQga2VlcCBnb2luZy4gU2ltaWxhciBzb3J0cyBvZiBrbHVkZ2VzIGluIHJmYi9yZmJjb25maWcuaCBjYW4gYmUgZG9uZQogICBvbiBvdGhlciBvbGRlciBPUyAoU29sYXJpcywgTGludXgsIC4uLikgcmVsZWFzZXMuCgogICBIZXJlIGFyZSBzb21lIG5vdGVzIGZvciBzaW1pbGFyIHN0ZXBzIHRoYXQgbmVlZCB0byBiZSBkb25lIHRvIGJ1aWxkIG9uCiAgIFN1bk9TIDQueAoKICAgUGxlYXNlIGxldCB1cyBrbm93IGlmIHlvdSBoYWQgdG8gdXNlIHRoZSBhYm92ZSB3b3JrYXJvdW5kIChhbmQgd2hldGhlcgogICBpdCB3b3JrZWQgb3Igbm90LikgSWYgdGhlcmUgaXMgZW5vdWdoIGRlbWFuZCB3ZSB3aWxsIHRyeSB0byBwdXNoIGNsZWFuCiAgIGNvbXBpbGF0aW9ucyBiYWNrIHRvIGVhcmxpZXIgU29sYXJpcywgTGludXgsIGV0YywgcmVsZWFzZXMuCgoKICAgUS01OiBXaGVyZSBjYW4gSSBnZXQgYSBwcmVjb21waWxlZCB4MTF2bmMgYmluYXJ5IGZvciBteSBPcGVyYXRpbmcKICAgU3lzdGVtPwoKICAgSG9wZWZ1bGx5IHRoZSBidWlsZCBzdGVwcyBhYm92ZSBhbmQgRkFRIHByb3ZpZGUgZW5vdWdoIGluZm8gZm9yIGEKICAgcGFpbmxlc3MgY29tcGlsZSBmb3IgbW9zdCBlbnZpcm9ubWVudHMuIFBsZWFzZSByZXBvcnQgcHJvYmxlbXMgd2l0aAogICB0aGUgeDExdm5jIGNvbmZpZ3VyZSwgbWFrZSwgZXRjLiBvbiB5b3VyIHN5c3RlbSAoaWYgeW91ciBzeXN0ZW0gaXMKICAga25vd24gdG8gY29tcGlsZSBvdGhlciBHTlUgcGFja2FnZXMgc3VjY2Vzc2Z1bGx5LikKCiAgIFRoZXJlIGFyZSBwcmVjb21waWxlZCB4MTF2bmMgYmluYXJpZXMgYnVpbHQgYnkgb3RoZXIgZ3JvdXBzIHRoYXQgYXJlCiAgIGF2YWlsYWJsZSBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKICAgIFNsYWNrd2FyZTogICAgICAoLnRneikgIGh0dHA6Ly93d3cubGludXhwYWNrYWdlcy5uZXQvCgogICBTdVNFOiAoLnJwbSkgaHR0cDovc29mdHdhcmUub3BlbnN1c2Uub3JnLyBHZW50b286IChpbmZvKQogICBodHRwOi8vZ2VudG9vLXdpa2kuY29tLyBhbmQgaHR0cDovL2dlbnRvby1wb3J0YWdlLmNvbS8gRnJlZUJTRDogKC50YnopCiAgIGh0dHA6Ly93d3cuZnJlZWJzZC5vcmcvIGh0dHA6Ly93d3cuZnJlc2hwb3J0cy5vcmcvbmV0L3gxMXZuYyBOZXRCU0Q6CiAgIChzcmMpIGh0dHA6Ly9wa2dzcmMuc2UveDExL3gxMXZuYyBPcGVuQlNEOiAoLnRneikgaHR0cDovL29wZW5wb3J0cy5zZS8KICAgQXJjaCBMaW51eDogKC50Z3opIGh0dHA6Ly93d3cuYXJjaGxpbnV4Lm9yZy8gTm9raWEgNzcwICguZGViKQogICBodHRwOi8vbWlrZS5zYXVuYnkuZ29vZ2xlcGFnZXMuY29tL3gxMXZuY2Zvcm5va2lhNzcwMiBTaGFycCBaYXVydXMKICAgaHR0cDovL3d3dy5mb2N2LmNvbS8gRGViaWFuOiAoLmRlYikgaHR0cDovL3BhY2thZ2VzLmRlYmlhbi5vcmcveDExdm5jCiAgIFJlZGhhdC9GZWRvcmE6ICgucnBtKSBodHRwOi8vcGFja2FnZXMuc3cuYmUveDExdm5jIFJQTWZvcmdlCiAgIGh0dHA6Ly9kYWcud2llZXJzLmNvbS9ycG0vcGFja2FnZXMveDExdm5jLyAoTi5CLjogdW5tYWludGFpbmVkIGFmdGVyCiAgIDAuOS4zKSBTb2xhcmlzOiAocGtnKSBodHRwOi8vd3d3LnN1bmZyZWV3YXJlLmNvbS8KCiAgIElmIHRoZSBhYm92ZSBiaW5hcmllcyBkb24ndCB3b3JrIGFuZCBidWlsZGluZyB4MTF2bmMgb24geW91ciBPUyBmYWlscwogICAoYW5kIGFsbCBlbHNlIGZhaWxzISkgeW91IGNhbiB0cnkgb25lIG9mIE15IENvbGxlY3Rpb24gb2YgeDExdm5jCiAgIEJpbmFyaWVzIGZvciB2YXJpb3VzIE9TJ3MgYW5kIHgxMXZuYyByZWxlYXNlcy4KCiAgIEFzIGEgZ2VuZXJhbCBub3RlLCB0aGUgeDExdm5jIHByb2dyYW0gaXMgc2ltcGxlIGVub3VnaCB5b3UgZG9uJ3QKICAgcmVhbGx5IG5lZWQgdG8gaW5zdGFsbCBhIHBhY2thZ2U6IHRoZSBiaW5hcnkgd2lsbCBpbiBtb3N0IGNhc2VzIHdvcmsKICAgYXMgaXMgYW5kIGZyb20gYW55IGxvY2F0aW9uIChhcyBsb25nIGFzIHlvdXIgc3lzdGVtIGxpYnJhcmllcyBhcmUgbm90CiAgIHRvbyBvbGQsIGV0Yy4pIFNvLCBmb3IgTGludXggZGlzdHJpYnV0aW9ucyB0aGF0IGFyZSBub3Qgb25lIG9mIHRoZQogICBhYm92ZSwgdGhlIHgxMXZuYyBiaW5hcnkgZnJvbSB0aGUgYWJvdmUgcGFja2FnZXMgaGFzIGEgZ29vZCBjaGFuY2Ugb2YKICAgd29ya2luZy4gWW91IGNhbiAiaW5zdGFsbCIgaXQgYnkganVzdCBjb3B5aW5nIHRoZSB4MTF2bmMgYmluYXJ5IHRvIHRoZQogICBkZXNpcmVkIGRpcmVjdG9yeSBpbiB5b3VyIFBBVEguIFRpcCBvbiBleHRyYWN0aW5nIGZpbGVzIGZyb20gYSBEZWJpYW4KICAgcGFja2FnZTogZXh0cmFjdCB0aGUgYXJjaGl2ZSB2aWEgYSBjb21tYW5kIGxpa2U6ICJhciB4CiAgIHgxMXZuY18wLjYtMl9pMzg2LmRlYiIgYW5kIHRoZW4geW91IGNhbiBmaW5kIHRoZSBiaW5hcnkgaW4gdGhlCiAgIHJlc3VsdGluZyBkYXRhLnRhci5neiB0YXIgZmlsZS4gQWxzbywgcnBtMmNwaW8oMSkgaXMgdXNlZnVsIGluCiAgIGV4dHJhY3RpbmcgZmlsZXMgZnJvbSBycG0gcGFja2FnZXMuCgogICBJZiB5b3UgdXNlIGEgc3RhbmRhbG9uZSBiaW5hcnkgbGlrZSB0aGlzIGFuZCBhbHNvIHdhbnQgeDExdm5jIHRvIHNlcnZlCiAgIHVwIHRoZSBKYXZhIFZOQyBWaWV3ZXIgamFyIGZpbGUgKGVpdGhlciBTU0wgZW5hYmxlZCBvciByZWd1bGFyIG9uZSksCiAgIHRoZW4geW91IHdpbGwgbmVlZCB0byBleHRyYWN0IHRoZSBjbGFzc2VzIHN1YmRpcmVjdG9yeSBmcm9tIHRoZSBzb3VyY2UKICAgdGFyYmFsbCBhbmQgcG9pbnQgeDExdm5jIHRvIGl0IHZpYSB0aGUgLWh0dHBkaXIgb3B0aW9uLiBFLmcuOgogICAgeDExdm5jIC1odHRwZGlyIC9wYXRoL3RvL3gxMXZuYy0wLjkuOS9jbGFzc2VzL3NzbCAuLi4KCgogICBRLTY6IFdoZXJlIGNhbiBJIGdldCBhIFZOQyBWaWV3ZXIgYmluYXJ5IChvciBzb3VyY2UgY29kZSkgZm9yIHRoZQogICBPcGVyYXRpbmcgU3lzdGVtIEkgd2lsbCBiZSB2aWV3aW5nIGZyb20/CgogICBUbyBvYnRhaW4gVk5DIHZpZXdlcnMgZm9yIHRoZSB2aWV3aW5nIHNpZGUgKFdpbmRvd3MsIE1hYyBPUywgb3IgVW5peCkKICAgdHJ5IGhlcmU6CiAgICAgKiBodHRwOi8vd3d3LnRpZ2h0dm5jLmNvbS9kb3dubG9hZC5odG1sCiAgICAgKiBodHRwOi8vd3d3LnJlYWx2bmMuY29tL2Rvd25sb2FkLWZyZWUuaHRtbAogICAgICogaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9jb3R2bmMvCiAgICAgKiBodHRwOi8vd3d3LnVsdHJhdm5jLmNvbS8KICAgICAqIE91ciBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKQoKICAgICAgIFtzc3ZuYy5naWZdCgoKICAgUS03OiBIb3cgY2FuIEkgc2VlIGFsbCBvZiB4MTF2bmMncyBjb21tYW5kIGxpbmUgb3B0aW9ucyBhbmQKICAgZG9jdW1lbnRhdGlvbiBvbiBob3cgdG8gdXNlIHRoZW0/CgogICBSdW46ICB4MTF2bmMgLW9wdHMgICB0byBsaXN0IGp1c3QgdGhlIG9wdGlvbiBuYW1lcyBvciBydW46ICB4MTF2bmMKICAgLWhlbHAgICBmb3IgbG9uZyBkZXNjcmlwdGlvbnMgYWJvdXQgZWFjaCBvcHRpb24uIFRoZSBvdXRwdXQgaXMgbGlzdGVkCiAgIGhlcmUgYXMgd2VsbC4gWWVzLCB4MTF2bmMgZG9lcyBoYXZlIGEgbG90IG9mIG9wdGlvbnMsIGRvZXNuJ3QgaXQuLi4KCgogICBRLTg6IEkgZG9uJ3QgbGlrZSB0eXBpbmcgYXJjYW5lIGNvbW1hbmQgbGluZSBvcHRpb25zIGV2ZXJ5IHRpbWUgSQogICBzdGFydCB4MTF2bmMuIFdoYXQgY2FuIEkgZG8/IElzIHRoZXJlIGEgY29uZmlnIGZpbGU/IE9yIGEgR1VJPwoKICAgWW91IGNvdWxkIGNyZWF0ZSBhIHNoZWxsIHNjcmlwdCB0aGF0IGNhbGxzIHgxMXZuYyB3aXRoIHlvdXIgb3B0aW9uczoKIyEvYmluL3NoCiMKIyBmaWxlbmFtZTogWDExdm5jICAoaS5lLiBub3QgIngxMXZuYyIpCiMgSXQgcmVzaWRlcyBpbiBhIGRpcmVjdG9yeSBpbiAkUEFUSC4gImNobW9kIDc1NSBYMTF2bmMiIGhhcyBiZWVuIHJ1biBvbiBpdC4KIwp4MTF2bmMgLXdhaXQgNTAgLWxvY2FsaG9zdCAtcmZiYXV0aCAkSE9NRS8udm5jL3Bhc3N3ZCAtZGlzcGxheSA6MCAkKgoKICAgYSBzaW1pbGFyIHRoaW5nIGNhbiBiZSBkb25lIHZpYSBhbGlhc2VzIGluIHlvdXIgc2hlbGwgKGJhc2gsIHRjc2gsCiAgIGNzaCwgZXRjLi4pCgogICBPciBhcyBvZiBKdW4vMjAwNCB5b3UgY2FuIHVzZSB0aGUgc2ltcGxlICRIT01FLy54MTF2bmNyYyBjb25maWcgZmlsZQogICBzdXBwb3J0LiBJZiB0aGF0IGZpbGUgZXhpc3RzLCBlYWNoIGxpbmUgaXMgdGFrZW4gYXMgYSBjb21tYW5kIGxpbmUKICAgb3B0aW9uLiBFLmcuIHRoZSBhYm92ZSB3b3VsZCBiZToKIyB0aGlzIGlzIGEgY29tbWVudCBpbiBteSB+Ly54MTF2bmNyYyBmaWxlCndhaXQgNTAgICAgICAgICMgdGhpcyBpcyBhIGNvbW1lbnQgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KLWxvY2FsaG9zdCAgICAgIyBub3RlOiB0aGUgbGVhZGluZyAiLSIgaXMgb3B0aW9uYWwuCnJmYmF1dGggIC9ob21lL2ZyZWQvLnZuYy9wYXNzd2QKZGlzcGxheSA6MAoKICAgQXMgb2YgRGVjLzIwMDQgdGhlcmUgaXMgbm93IGEgc2ltcGxlIFRjbC9UayBHVUkgYmFzZWQgb24gdGhlCiAgIHJlbW90ZS1jb250cm9sIGZ1bmN0aW9uYWxpdHkgKCItUiIpIHRoYXQgd2FzIGFkZGVkLiBUaGUgL3Vzci9iaW4vd2lzaAogICBwcm9ncmFtIGlzIG5lZWRlZCBmb3Igb3BlcmF0aW9uLiBUaGUgZ3VpIGlzIG5vdCBwYXJ0aWN1bGFybHkKICAgdXNlci1mcmllbmRseSwgaXQganVzdCBwcm92aWRlcyBhIHBvaW50IGFuZCBjbGljayBtb2RlIHRvIHNldCBhbGwgdGhlCiAgIG1hbnkgeDExdm5jIHBhcmFtZXRlcnMgYW5kIG9idGFpbiBoZWxwIG9uIHRoZW0uIEl0IGlzIGFsc28gdmVyeSB1c2VmdWwKICAgZm9yIHRlc3RpbmcuIFNlZSB0aGUgLWd1aSBvcHRpb24gZm9yIG1vcmUgaW5mby4gRXhhbXBsZXM6ICJ4MTF2bmMgLi4uCiAgIC1ndWkiIGFuZCAieDExdm5jIC4uLiAtZ3VpIG90aGVyOjAiIGluIHRoZSBsYXR0ZXIgY2FzZSB0aGUgZ3VpIGlzCiAgIGRpc3BsYXllZCBvbiBvdGhlcjowLCBub3QgdGhlIFggZGlzcGxheSB4MTF2bmMgaXMgcG9sbGluZy4gVGhlcmUgaXMKICAgYWxzbyBhICItZ3VpIHRyYXkiIHN5c3RlbSB0cmF5IG1vZGUuCgogICBbdGt4MTF2bmMuZ2lmXQoKICAgTk9URTogWW91IG1heSBuZWVkIHRvIGluc3RhbGwgdGhlICJ3aXNoIiBvciAidGsiIG9yICJ0azguNCIgcGFja2FnZQogICBmb3IgdGhlIGd1aSBtb2RlIHRvIHdvcmsgKHRoZSBwYWNrYWdlIG5hbWUgZGVwZW5kcyBvbiB5b3VyIE9TL2Rpc3Ryby4pCiAgIFRoZSB0Y2wvdGsgIndpc2giIGludGVycHJldGVyIGlzIHVzZWQuIEluIGRlYmlhbiAoYW5kIHNvIHVidW50dSB0b28pCiAgIG9uZSB3b3VsZCBydW4gImFwdC1nZXQgaW5zdGFsbCB0ayIgb3IgcGVyaGFwcyAiYXB0LWdldCBpbnN0YWxsIHRrOC40IgoKCiAgIFEtOTogSG93IGNhbiBJIGdldCB0aGUgR1VJIHRvIHJ1biBpbiB0aGUgU3lzdGVtIFRyYXksIG9yIGF0IGxlYXN0IGJlIGEKICAgc21hbGxlciwgc2ltcGxlciBpY29uPwoKICAgQXMgb2YgSnVsLzIwMDUgdGhlIGd1aSBjYW4gcnVuIGluIGEgbW9yZSBmcmllbmRseSBzbWFsbCBpY29uIG1vZGUKICAgIi1ndWkgaWNvbiIgb3IgaW4gdGhlIHN5c3RlbSB0cmF5OiAiLWd1aSB0cmF5Ii4gSXQgaGFzIGJhbGxvb24gc3RhdHVzLAogICBhIHNpbXBsZSBtZW51LCBhbmQgYSBQcm9wZXJpdGllcyBkaWFsb2cuIFRoZSBmdWxsLCBjb21wbGljYXRlZCwgZ3VpIGlzCiAgIG9ubHkgYXZhaWxhYmxlIHVuZGVyICJBZHZhbmNlZCIuIE90aGVyIGltcHJvdmVtZW50cyB3ZXJlIGFkZGVkIGFzCiAgIHdlbGwuIFRyeSAiTWlzYyAtPiBzaW1wbGVfZ3VpIiBmb3IgYSBndWkgd2l0aCBmZXdlciBlc290ZXJpYyBtZW51CiAgIGl0ZW1zLgoKICAgSWYgdGhlIGd1aSBmYWlscyB0byBlbWJlZCBpdHNlbGYgaW4gdGhlIHN5c3RlbSB0cmF5LCBkbyBhIHJldHJ5IHZpYQogICAiV2luZG93IFZpZXcgLT4gaWNvbiIgZm9sbG93ZWQgYnkgIldpbmRvdyBWaWV3IC0+IHRyYXkiIHdpdGggdGhlIHBvcHVwCiAgIG1lbnUuCgogICBGb3IgaW5leHBlcmllbmNlZCB1c2VycyBzdGFydGluZyB1cCB4MTF2bmMgYW5kIHRoZSBHVUkgd2hpbGUgc2l0dGluZwogICBhdCB0aGUgcGh5c2ljYWwgWCBkaXNwbGF5IChub3QgcmVtb3RlbHkpLCB1c2luZyBzb21ldGhpbmcgbGlrZSAieDExdm5jCiAgIC1kaXNwbGF5IDowIC1ndWkgdHJheT1zZXRwYXNzIiBtaWdodCBiZSBzb21ldGhpbmcgZm9yIHRoZW0gdGhhdCB0aGV5CiAgIGFyZSBhY2N1c3RvbWVkIHRvIGluIGEgRGVza3RvcCBlbnZpcm9ubWVudCAoaXQgcHJvbXB0cyBmb3IgYW4gaW5pdGlhbAogICBwYXNzd29yZCwgZXRjLikgVGhpcyBpcyBhIGJhc2ljICJTaGFyZSBNeSBEZXNrdG9wIiB1c2FnZSBtb2RlLgoKICAgQXMgb2YgTm92LzIwMDggaW4geDExdm5jIDAuOS42IHRoZXJlIGlzIGEgZGVza3RvcCBtZW51IGl0ZW0KICAgKHgxMXZuYy5kZXNrdG9wKSB0aGF0IHJ1bnMgdGhpcyBjb21tYW5kOgogICB4MTF2bmMgLWd1aSB0cmF5PXNldHBhc3MgLXJmYnBvcnQgUFJPTVBUIC1sb2dmaWxlICVIT01FLy54MTF2bmMubG9nLiVWTkNESVNQCkxBWQoKICAgd2hpY2ggYWxzbyBwcm9tcHRzIGZvciB3aGljaCBWTkMgcG9ydCB0byB1c2UgYW5kIGEgY291cGxlIG90aGVyCiAgIHBhcmFtZXRlcnMuCgoKICAgUS0xMDogSG93IGNhbiBJIGdldCB4MTF2bmMgdG8gbGlzdGVuIG9uIGEgZGlmZmVyZW50IHBvcnQgYmVzaWRlcyB0aGUKICAgZGVmYXVsdCBWTkMgcG9ydCAoNTkwMCk/CgogICBVc2Ugc29tZXRoaW5nIGxpa2UsIGUuZy4sICJ4MTF2bmMgLXJmYnBvcnQgNTkwMSIgdG8gZm9yY2UgaXQgdG8gdXNlCiAgIHBvcnQgNTkwMSAodGhpcyBpcyBWTkMgZGlzcGxheSA6MS4pIElmIHNvbWV0aGluZyBlbHNlIGlzIHVzaW5nIHRoYXQKICAgcG9ydCB4MTF2bmMgd2lsbCBleGl0IGltbWVkaWF0ZWx5LiBJZiB5b3UgZG8gbm90IHN1cHBseSB0aGUgLXJmYnBvcnQKICAgb3B0aW9uLCBpdCB3aWxsIGF1dG9wcm9iZSBzdGFydGluZyBhdCA1OTAwIGFuZCB3b3JrIGl0cyB3YXkgdXAgdG8gNTk5OQogICBsb29raW5nIGZvciBhIGZyZWUgcG9ydCB0byBsaXN0ZW4gb24uIEluIHRoYXQgY2FzZSwgd2F0Y2ggZm9yIHRoZQogICBQT1JUPTU5eHggbGluZSB0byBzZWUgd2hpY2ggcG9ydCBpdCBmb3VuZCwgdGhlbiBzdWJ0cmFjdCA1OTAwIGZyb20gaXQKICAgZm9yIHRoZSBWTkMgZGlzcGxheSBudW1iZXIgdG8gZW50ZXIgaW50byB0aGUgVk5DIFZpZXdlcihzKS4KCiAgIFRoZSAiLU4iIG9wdGlvbiB3aWxsIHRyeSB0byBtYXRjaCB0aGUgVk5DIGRpc3BsYXkgbnVtYmVyIHRvIHRoZSBYCiAgIGRpc3BsYXkgKGUuZy4gWDExIERJU1BMQVkgb2YgOjUgKHBvcnQgNjAwNSkgd2lsbCBoYXZlIFZOQyBkaXNwbGF5IDo1CiAgIChwb3J0IDU5MDUpLikKCiAgIEFsc28gc2VlIHRoZSAiLWF1dG9wb3J0IG4iIG9wdGlvbiB0byBpbmRpY2F0ZWQgYXQgd2hpY2ggdmFsdWUgdGhlIGF1dG8KICAgcHJvYmluZyBzaG91bGQgc3RhcnQgYXQuCgoKICAgUS0xMTogTXkgRmlyZXdhbGwvUm91dGVyIGRvZXNuJ3QgYWxsb3cgVk5DIFZpZXdlcnMgdG8gY29ubmVjdCB0bwogICB4MTF2bmMuCgogICBTZWUgdGhlIEZpcmV3YWxscy9Sb3V0ZXJzIGRpc2N1c3Npb24uCgoKICAgUS0xMjogSXMgaXQgcG9zc2libGUgZm9yIGEgVk5DIFZpZXdlciBhbmQgYSBWTkMgU2VydmVyIHRvIGNvbm5lY3QgdG8KICAgZWFjaCBvdGhlciBldmVuIHRob3VnaCBib3RoIGFyZSBiZWhpbmQgRmlyZXdhbGxzIHRoYXQgYmxvY2sgYWxsCiAgIGluY29taW5nIGNvbm5lY3Rpb25zPwoKICAgVGhpcyBpcyB2ZXJ5IGRpZmZpY3VsdCBvciBpbXBvc3NpYmxlIHRvIGRvIHVubGVzcyBhIHRoaXJkIG1hY2hpbmUsCiAgIHJlYWNoYWJsZSBieSBib3RoLCBpcyB1c2VkIGFzIGEgcmVsYXkuIFNvIHdlIGFzc3VtZSBhIHRoaXJkIG1hY2hpbmUgaXMKICAgc29tZWhvdyBiZWluZyB1c2VkIGFzIGEgcmVsYXkuCgogICAoVXBkYXRlOiBJdCBtYXkgYmUgcG9zc2libGUgdG8gZG8gIk5BVC0yLU5BVCIgd2l0aG91dCBhIHJlbGF5IG1hY2hpbmUKICAgYnkgdXNpbmcgYSBVRFAgdHVubmVsIHN1Y2ggYXMgaHR0cDovL3NhbXkucGwvcHduYXQvLiBBbGwgdGhhdCBpcwogICByZXF1aXJlZCBpcyB0aGF0IGJvdGggTkFUIGZpcmV3YWxscyBhbGxvdyBpbiBVRFAgcGFja2V0cyBmcm9tIGFuIElQCiAgIGFkZHJlc3MgdG8gd2hpY2ggYSBVRFAgcGFja2V0IGhhcyByZWNlbnRseSBiZWVuIHNlbnQgdG8uIElmIHlvdSB0cnkgaXQKICAgb3V0IGxldCB1cyBrbm93IGhvdyBpdCB3ZW50LikKCiAgIEluIHRoZSBmb2xsb3dpbmcgZGlzY3Vzc2lvbiwgd2Ugd2lsbCBzdXBwb3NlIHBvcnQgNTk1MCBpcyBiZWluZyB1c2VkCiAgIG9uIHRoZSByZWxheSBtYWNoaW5lIGFzIHRoZSBWTkMgcG9ydCBmb3IgdGhlIHJlbmRlenZvdXMuCgogICBBIHdheSB0byByZW5kZXp2b3VzIGlzIHRvIGhhdmUgdGhlIFZOQyBTZXJ2ZXIgc3RhcnQgYSByZXZlcnNlCiAgIGNvbm5lY3Rpb24gdG8gdGhlIHJlbGF5IG1hY2hpbmU6CiAgIHgxMXZuYyAtY29ubmVjdCB0aGlyZC1tYWNoaW5lLm5ldDo1OTUwIC4uLgoKICAgYW5kIHRoZSBWTkMgdmlld2VyIGZvcndhcmQgY29ubmVjdHMgYXMgdXN1YWw6CiAgIHZuY3ZpZXdlciB0aGlyZC1tYWNoaW5lLm5ldDo1MAoKICAgT3IgbWF5YmUgdHdvIHBvcnRzIHdvdWxkIGJlIGludm9sdmVkLCBlLmcuIHRoZSB2aWV3ZXIgZ29lcyB0byBkaXNwbGF5CiAgIDo1MSAoNTk1MS4pIEl0IGRlcGVuZHMgb24gdGhlIHJlbGF5IHNvZnR3YXJlIGJlaW5nIHVzZWQuCgogICBXaGF0IHNvZnR3YXJlIHRvIHJ1biBvbiB0aGlyZC1tYWNoaW5lPyBBIFRDUCByZWxheSBvZiBzb21lIHNvcnQgY291bGQKICAgYmUgdXNlZC4uLiBUcnkgYSBnb29nbGUgc2VhcmNoIG9uICJ0Y3AgcmVsYXkiIG9yICJpcCByZWxheSIuIEhvd2V2ZXIsCiAgIG5vdGUgdGhhdCB0aGlzIGlzbid0IGEgc2ltcGxlIHJlZGlyZWN0aW9uIGJlY2F1c2UgaXQgaG9va3MgdXAgdHdvCiAgIGluY29taW5nIGNvbm5lY3Rpb25zLiBZb3UgY2FuIGxvb2sgYXQgb3VyIFVsdHJhVk5DIHJlcGVhdGVyCiAgIGltcGxlbWVudGF0aW9uIHVsdHJhdm5jX3JlcGVhdGVyLnBsIGZvciBpZGVhcyBhbmQgcG9zc2libHkgdG8KICAgY3VzdG9taXplLgoKICAgQWxzbywgaWYgeW91IGFyZSBub3QgdGhlIGFkbWluIG9mIHRoaXJkLW1hY2hpbmUgeW91J2QgaGF2ZSB0byBjb252aW5jZQogICB0aGUgb3duZXIgdG8gYWxsb3cgeW91IHRvIGluc3RhbGwgdGhpcyBzb2Z0d2FyZSAoYW5kIGhlIHdvdWxkIGxpa2VseQogICBuZWVkIHRvIG9wZW4gaGlzIHNlcnZlcidzIGZpcmV3YWxsIHRvIGFsbG93IHRoZSBwb3J0IHRocm91Z2guKQoKICAgSXQgaXMgcmVjb21tZW5kZWQgdGhhdCBTU0wgaXMgdXNlZCBmb3IgZW5jcnlwdGlvbiAoZS5nLiAiLXNzbCBTQVZFIikKICAgd2hlbiBnb2luZyBvdmVyIHRoZSBpbnRlcm5ldC4KCiAgIFdlIGhhdmUgYSBwcm90b3R5cGUgZm9yIHBlcmZvcm1pbmcgYSByZW5kZXp2b3VzIHZpYSBhIFdlYiBTZXJ2ZXIKICAgYWN0aW5nIGFzIHRoZSByZWxheSBtYWNoaW5lLiBEb3dubG9hZCB0aGUgdm5jeGZlciBDR0kgc2NyaXB0IGFuZCBzZWUKICAgdGhlIGluc3RydWN0aW9ucyBhdCB0aGUgdG9wLgoKICAgT25jZSB0aGF0IENHSSBzY3JpcHQgaXMgc2V0IHVwIG9uIHRoZSB3ZWJzaXRlLCBib3RoIHVzZXJzIGdvIHRvLCBzYXksCiAgIGh0dHA6Ly9zb21lc2l0ZS5jb20vdm5jeGZlciAob3IgbWF5YmUgYSAiL2NnaS1iaW4iIGRpcmVjdG9yeSBvciAiLmNnaSIKICAgc3VmZml4IG11c3QgYmUgdXNlZC4pIFByZXZpb3VzbHksIGJvdGggaGF2ZSBhZ3JlZWQgb24gdGhlIHNhbWUgc2Vzc2lvbgogICBuYW1lIChzYXkgYnkgcGhvbmUgb3IgZW1haWwpICwgZS5nLiAiNWNvd3MiLCBhbmQgcHV0IHRoYXQgaW50byB0aGUKICAgZW50cnkgZm9ybSBvbiB0aGUgdm5jeGZlciBzdGFydGluZyBwYWdlIChob3BlZnVsbHkgc2VwYXJhdGVkIGJ5IGEgZmV3CiAgIHNlY29uZHMsIHNvIHRoZSByZWxheSBoZWxwZXIgY2FuIGZ1bGx5IHN0YXJ0IHVwIGF0IHRoZSBmaXJzdCByZXF1ZXN0LikKCiAgIFRoZSBwYWdlIHJldHVybmVkIHRlbGxzIHRoZW0gdGhlIGhvc3RuYW1lIGFuZCBwb3J0IG51bWJlciBhbmQgcG9zc2libGUKICAgY29tbWFuZCB0byB1c2UgZm9yIGZvcndhcmQgKFZOQyBWaWV3ZXIpIGFuZCByZXZlcnNlIChWTkMgU2VydmVyLCBpLmUuCiAgIHgxMXZuYykgY29ubmVjdGlvbnMgYXMgZGVzY3JpYmVkIGFib3ZlLgoKICAgQWxzbyBzaW5jZSBPY3QvMjAwNywgeDExdm5jIGNhbiBjb25uZWN0IGRpcmVjdGx5IChubyB3ZWIgYnJvd3NlciksCiAgIGxpa2UgdGhpczoKICAgeDExdm5jIC4uLiAtY29ubmVjdCBsb2NhbGhvc3Q6MCAtcHJveHkgJ2h0dHA6Ly9zb21lc2l0ZS5jb20vdm5jeGZlcj9zZXNzaW9uPQo1Y293cyYnCgogICBVbmZvcnR1bmF0ZWx5IHRoZSBwcm90b3R5cGUgcmVxdWlyZXMgdGhhdCB0aGUgV2ViIHNlcnZlcidzIGZpcmV3YWxsCiAgIGFsbG93IGluIHRoZSBwb3J0IChlLmcuIDU5NTApIHVzZWQgZm9yIHRoZSByZW5kZXp2b3VzLiBNb3N0IHdlYgogICBzZXJ2ZXJzIGFyZSBub3QgY29uZmlndXJlZCB0byBkbyB0aGlzLCBzbyB5b3Ugd291bGQgbmVlZCB0byBhc2sgdGhlCiAgIGFkbWluIHRvIGRvIHRoaXMgZm9yIHlvdS4gTmVhcmx5IGFsbCBmcmVlIHdlYnNwYWNlIHNpdGVzLCBlLmcuCiAgIHd3dy56ZW5kdXJsLmNvbSwgd2lsbCBub3QgYWxsb3cgeW91ciBDR0kgc2NyaXB0IHRvIGJlIGFuIG9wZW4gcmVsYXkKICAgbGlrZSB0aGlzLiAoSWYgeW91IGZpbmQgb25lIHRoYXQgZG9lcyBhbGxvdyB0aGlzLCBsZXQgbWUga25vdyEpCgogICBNYXliZSBzb21lZGF5IGEgY2xldmVyIHRyaWNrIHdpbGwgYmUgdGhvdWdodCB1cCB0byByZWxheCB0aGUgbGlzdGVuaW5nCiAgIHBvcnQgcmVxdWlyZW1lbnQgKGUuZy4gdXNlIEhUVFAvQ0dJIGl0c2VsZiBmb3IgdGhlIHRyYW5zZmVyLi4uIGl0IGlzCiAgIGRpZmZpY3VsdCB0byBlbXVsYXRlIGEgZnVsbC1kdXBsZXggVENQIGNvbm5lY3Rpb24gd2l0aCB0aGVtLikKCiAgIFNlZSBhbHNvIHRoZSBGaXJld2FsbHMvUm91dGVycyBkaXNjdXNzaW9uIGFuZCBSZXZlcnNlIENvbm5lY3Rpb24gUHJveHkKICAgZGlzY3Vzc2lvbi4KCgogICBTU0ggbWV0aG9kOiBJZiBib3RoIHVzZXJzIChpLmUuIG9uZSBvbiBWaWV3ZXItc2lkZSBhbmQgdGhlIG90aGVyIG9uCiAgIHgxMXZuYyBzZXJ2ZXIgc2lkZSkgaGF2ZSBTU0ggYWNjZXNzIHRvIGEgY29tbW9uIG1hY2hpbmUgb24gdGhlCiAgIGludGVybmV0IChvciBvdGhlcndpc2UgbXV0dWFsbHkgcmVhY2hhYmxlKSwgdGhlbiBTU0ggcGx1bWJpbmcgY2FuIGJlCiAgIHVzZWQgdG8gc29sdmUgdGhpcyBwcm9ibGVtLiBUaGUgdXNlcnMgY3JlYXRlIFNTSCB0dW5uZWxzIGdvaW5nIHRocm91Z2gKICAgdGhlIFNTSCBsb2dpbiBtYWNoaW5lLgoKICAgSW5zdGVhZCBvZiBhc3N1bWluZyBwb3J0IDU5MDAgaXMgZnJlZSBvbiB0aGUgU1NIIG1hY2hpbmUsIHdlIHdpbGwKICAgYXNzdW1lIGJvdGggdXNlcnMgYWdyZWVkIHRvIHVzZSA1OTMzLiBUaGlzIHdpbGwgaWxsdXN0cmF0ZSBob3cgdG8gdXNlCiAgIGEgZGlmZmVyZW50IHBvcnQgZm9yIHRoZSByZWRpci4gSXQgY291bGQgYmUgYW55IHBvcnQsIHdoYXQgbWF0dGVycyBpcwogICB0aGF0IGJvdGggcGFydGllcyByZWZlciB0byB0aGUgc2FtZSBvbmUuCgogICBTZXQgdXAgdGhlIFR1bm5lbCBmcm9tIHRoZSBWTkMgU2VydmVyIHNpZGU6CiAgIHNzaCAtdCAtUiA1OTMzOmxvY2FsaG9zdDo1OTAwIHVzZXJAdGhpcmQtbWFjaGluZS5uZXQKCiAgIFNldCB1cCB0aGUgVHVubmVsIGZyb20gdGhlIFZOQyBWaWV3ZXIgc2lkZToKICAgc3NoIC10IC1MIDU5MDA6bG9jYWxob3N0OjU5MzMgdXNlckB0aGlyZC1tYWNoaW5lLm5ldAoKICAgUnVuIFNlcnZlciBvbiB0aGUgVk5DIFNlcnZlciBzaWRlOgogICB4MTF2bmMgLXJmYnBvcnQgNTkwMCAtbG9jYWxob3N0IC4uLgoKICAgUnVuIFZpZXdlciBvbiB0aGUgVk5DIFZpZXdlciBzaWRlOgogICB2bmN2aWV3ZXIgLWVuY29kaW5ncyAiY29weXJlY3QgdGlnaHQgenJsZSBoZXh0aWxlIiBsb2NhbGhvc3Q6MAoKICAgKHdlIGFzc3VtZSB0aGUgb2xkLXN0eWxlIC1lbmNvZGluZ3Mgb3B0aW9uIG5lZWRzIHRvIGJlIHVzZWQuIFNlZSBoZXJlCiAgIGZvciBkZXRhaWxzLikKCiAgIElmIHRoZSBTU0ggbWFjaGluZSBoYXMgYmVlbiBjb25maWd1cmVkIChzZWUgc3NoZF9jb25maWcoNSkpIHdpdGggdGhlCiAgIG9wdGlvbiBHYXRld2F5UG9ydHM9eWVzLCB0aGVuIHRoZSB0dW5uZWwgc2V0IHVwIGJ5IHRoZSBWTkMgU2VydmVyIHdpbGwKICAgYmUgcmVhY2hhYmxlIGRpcmVjdGx5IGJ5IHRoZSBWTkMgdmlld2VyIChhcyBsb25nIGFzIHRoZSBTU0ggbWFjaGluZSdzCiAgIGZpcmV3YWxsIGRvZXMgbm90IGJsb2NrIHRoZSBwb3J0LCA1OTMzIGluIHRoaXMgZXhhbXBsZS4pIFNvIGluIHRoYXQKICAgY2FzZSB0aGUgVmlld2VyIHNpZGUgZG9lcyBub3QgbmVlZCB0byBydW4gYW55IHNzaCBjb21tYW5kLCBidXQgcmF0aGVyCiAgIG9ubHkgcnVuczoKICAgdm5jdmlld2VyIHRoaXJkLW1hY2hpbmUubmV0OjMzCgogICBJbiB0aGlzIGNhc2Ugd2UgcmVjb21tZW5kIFNTTCBiZSB1c2VkIGZvciBlbmNyeXB0aW9uLgoKICAgVGhlIGNyZWF0aW9uIG9mIGJvdGggdHVubmVscyBjYW4gYmUgYXV0b21hdGVkLiBBcyBvZiBPY3QvMjAwNyB0aGUgLXNzaAogICB4MTF2bmMgb3B0aW9uIGlzIGF2YWlsYWJsZSBhbmQgc28gb25seSB0aGlzIGNvbW1hbmQgbmVlZHMgdG8gYmUgcnVuIG9uCiAgIHRoZSBWTkMgU2VydmVyIHNpZGU6CiAgIHgxMXZuYyAtc3NoIHVzZXJAdGhpcmQtbWFjaGluZS5uZXQ6MzMgLi4uCgogICAodGhlIFNTSCBwYXNzcGhyYXNlIG1heSBuZWVkIHRvIGJlIHN1cHBsaWVkLikKCiAgIFRvIGF1dG9tYXRlIG9uIHRoZSBWTkMgVmlld2VyIHNpZGUsIHRoZSB1c2VyIGNhbiB1c2UgdGhlIEVuaGFuY2VkCiAgIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpIGJ5OgogICAgICogQ2xpY2tpbmcgb24gJ1VzZSBTU0gnCiAgICAgKiBFbnRlcmluZyB1c2VyQHRoaXJkLW1hY2hpbmUubmV0OjMzIGludG8gJ1ZOQyBIb3N0OkRpc3BsYXknIGVudHJ5CiAgICAgICBib3gKICAgICAqIENsaWNraW5nIG9uICdDb25uZWN0JwoKICAgQXMgYWJvdmUsIGlmIHRoZSBTU0ggR2F0ZXdheVBvcnRzPXllcyBzZXR0aW5nIGlzIGNvbmZpZ3VyZWQgdGhlIFZpZXdlcgogICBzaWRlIGRvZXNuJ3QgbmVlZCB0byBjcmVhdGUgYSBTU0ggdHVubmVsLiBJbiBTU1ZOQyB0aGUgVmlld2VyIHVzZXIKICAgY291bGQgaW5zdGVhZCBzZWxlY3QgJ1VzZSBTU0wnIGFuZCB0aGVuLCBlLmcuLCBvbiB0aGUgU2VydmVyIHNpZGUKICAgc3VwcGx5ICItc3NsIFNBVkUiIHRvIHgxMXZuYy4gVGhlbiBlbmQtdG8tZW5kIFNTTCBlbmNyeXB0aW9uIHdvdWxkIGJlCiAgIHVzZWQgKGluIGFkZGl0aW9uIHRvIHRoZSBTU0ggZW5jcnlwdGlvbiBvbiB0aGUgU2VydmVyLXNpZGUgbGVnLikKCgogICBRLTEzOiBDYW4gSSBtYWtlIHgxMXZuYyBtb3JlIHF1aWV0IGFuZCBhbHNvIGdvIGludG8gdGhlIGJhY2tncm91bmQKICAgYWZ0ZXIgc3RhcnRpbmcgdXA/CgogICBVc2UgdGhlIC1xIGFuZCAtYmcgb3B0aW9ucywgcmVzcGVjdGl2ZWx5LiAgKGFsc286IC1xdWlldCBpcyBhbiBhbGlhcwogICBmb3IgLXEpCgogICBOb3RlIHRoYXQgdW5kZXIgLWJnIHRoZSBzdGRlcnIgbWVzc2FnZXMgd2lsbCBiZSBsb3N0IHVubGVzcyB5b3UgdXNlCiAgIHRoZSAiLW8gbG9nZmlsZSIgb3B0aW9uLgoKCiAgIFEtMTQ6IFNvbWV0aW1lcyB3aGVuIGEgVk5DIHZpZXdlciBkaWVzIGFicnVwdGx5LCB4MTF2bmMgYWxzbyBkaWVzIHdpdGgKICAgdGhlIGVycm9yIG1lc3NhZ2UgbGlrZTogIkJyb2tlbiBwaXBlIi4gSSdtIHVzaW5nIHRoZSAtZm9yZXZlciBtb2RlIGFuZAogICBJIHdhbnQgeDExdm5jIHRvIGtlZXAgcnVubmluZy4KCiAgIEFzIG9mIEphbi8yMDA0IHRoZSBTSUdQSVBFIHNpZ25hbCBpcyBpZ25vcmVkLiBTbyBpZiBhIHZpZXdlciBjbGllbnQKICAgdGVybWluYXRlcyBhYnJ1cHRseSwgbGlidm5jc2VydmVyIHdpbGwgbm90aWNlIG9uIHRoZSBuZXh0IEkvTwogICBvcGVyYXRpb24gYW5kIHdpbGwgY2xvc2UgdGhlIGNvbm5lY3Rpb24gYW5kIGNvbnRpbnVlIG9uLgoKICAgVXAgdW50aWwgb2YgQXByLzIwMDQgdGhlIGFib3ZlIGZpeCBvbmx5IHdvcmtzIGZvciBCU0Qgc2lnbmFsIHN5c3RlbXMKICAgKExpbnV4LCBGcmVlQlNELCAuLi4pIEZvciBTWVNWIHN5c3RlbXMgdGhlcmUgaXMgYSB3b3JrYXJvdW5kIGluIHBsYWNlCiAgIHNpbmNlIGFib3V0IEp1bi8yMDA0LgoKCiAgIFEtMTU6IFRoZSBXaW5kb3dzIFRpZ2h0Vk5DIDEuMy45IFZpZXdlciBjYW5ub3QgY29ubmVjdCB0byB4MTF2bmMuCgogICBUaGlzIGFwcGVhcnMgdG8gYmUgZml4ZWQgaW4geDExdm5jIHZlcnNpb24gMC45IGFuZCBsYXRlci4gSWYgeW91IG5lZWQKICAgdG8gdXNlIGFuIGVhcmxpZXIgdmVyc2lvbiBvZiB4MTF2bmMsIHRyeSB1c2luZyB0aGUgIi1yZmJ2ZXJzaW9uIDMuNyIKICAgb3B0aW9uLiBJbiBnZW5lcmFsIHNvbWV0aW1lcyBvbmUgY2FuIGdldCBhIG1pc2JlaGF2aW5nIHZpZXdlciB0byB3b3JrCiAgIGJ5IHN1cHBseWluZyByZmIgdmVyc2lvbnMgMy43IG9yIDMuMy4KCgogICBRLTE2OiBLREUncyBrcmRjIFZOQyB2aWV3ZXIgY2Fubm90IGNvbm5lY3QgdG8geDExdm5jLgoKICAgVGhpcyBoYXMgYmVlbiBmaXhlZCBpbiB4MTF2bmMgdmVyc2lvbiAwLjguNC4gTW9yZSBpbmZvIGhlcmUsIGhlcmUsIGFuZAogICBoZXJlLgoKCiAgIFEtMTc6IFdoZW4gSSBzdGFydCB4MTF2bmMgb24gYW4gQWxwaGEgVHJ1NjQgd29ya3N0YXRpb24gdGhlIFggc2VydmVyCiAgIGNyYXNoZXMhCgogICBUaGlzIGlzIGEgYnVnIGluIHRoZSBYIHNlcnZlciBvYnZpb3VzbHk7IGFuIFggY2xpZW50IHNob3VsZCBuZXZlciBiZQogICBhYmxlIHRvIGNyYXNoIGl0LgoKICAgVGhlIHByb2JsZW0gc2VlbXMgdG8gYmUgd2l0aCB0aGUgUkVDT1JEIFggZXh0ZW5zaW9uIGFuZCBzbyBhCiAgIHdvcmthcm91bmQgaXMgdG8gdXNlIHRoZSAiLW5veHJlY29yZCIgeDExdm5jIGNvbW1hbmQgbGluZSBvcHRpb24uCgoKICAgUS0xODogV2hlbiBydW5uaW5nIHgxMXZuYyBvbiBhbiBJQk0gQUlYIHdvcmtzdGF0aW9uIGFmdGVyIGEgZmV3CiAgIG1pbnV0ZXMgdGhlIFZOQyBjb25uZWN0aW9uIGZyZWV6ZXMuCgogICBPbmUgdXNlciByZXBvcnRzIHdoZW4gcnVubmluZyB4MTF2bmMgb24gQUlYIDUuMyBpbiBoaXMgQ0RFIHNlc3Npb24KICAgYWZ0ZXIgYSBmZXcgbWludXRlcyBvciBzZWNvbmRzIHgxMXZuYyB3aWxsICJmcmVlemUiIChubyBtb3JlIHVwZGF0ZXMKICAgYmVpbmcgc2VudCwgZXRjLikgVGhlIGZyZWV6aW5nIGFwcGVhcmVkIHRvIGJlIHdvcnNlIGZvciB2ZXJzaW9ucyBsYXRlcgogICB0aGFuIDAuOS4yLgoKICAgVGhlIHByb2JsZW0gc2VlbXMgdG8gYmUgd2l0aCB0aGUgUkVDT1JEIFggZXh0ZW5zaW9uIG9uIEFJWCBhbmQgc28gYQogICB3b3JrYXJvdW5kIGlzIHRvIHVzZSB0aGUgIi1ub3hyZWNvcmQiIHgxMXZuYyBjb21tYW5kIGxpbmUgb3B0aW9uLiBUaGUKICAgdXNlciBmb3VuZCBubyBmcmVlemVzIG9jY3VycmVkIHdoZW4gdXNpbmcgdGhhdCBvcHRpb24uCgoKICAgUS0xOTogQXJlIHRoZXJlIGFueSBidWlsZC10aW1lIGN1c3RvbWl6YXRpb25zIHBvc3NpYmxlLCBlLmcuIGNoYW5nZQogICBkZWZhdWx0cywgY3JlYXRlIGEgc21hbGxlciBiaW5hcnksIGV0Yz8KCiAgIFRoZXJlIGFyZSBzb21lIG9wdGlvbnMuIFRoZXkgYXJlIGVuYWJsZWQgYnkgYWRkaW5nIHNvbWV0aGluZyBsaWtlCiAgIC1EeHh4eD0xIHRvIHRoZSBDUFBGTEFHUyBlbnZpcm9ubWVudCB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyBjb25maWd1cmUKICAgKHNlZSB0aGUgYnVpbGQgbm90ZXMgZm9yIGdlbmVyYWwgYmFja2dyb3VuZC4pCi8qCiAqIE1hci8yMDA2CiAqIEJ1aWxkLXRpbWUgY3VzdG9taXphdGlvbiB2aWEgQ1BQRkxBR1MuCiAqCiAqIFN1bW1hcnkgb2Ygb3B0aW9ucyB0byBpbmNsdWRlIGluIENQUEZMQUdTIGZvciBjdXN0b20gYnVpbGRzOgogKgogKiAtRFZOQ1NIQVJFRCAgdG8gaGF2ZSB0aGUgdm5jIGRpc3BsYXkgc2hhcmVkIGJ5IGRlZmF1bHQuCiAqIC1ERk9SRVZFUiAgdG8gaGF2ZSAtZm9yZXZlciBvbiBieSBkZWZhdWx0LgogKiAtRE5PUkVQRUFUPTAgIHRvIGhhdmUgLXJlcGVhdCBvbiBieSBkZWZhdWx0LgogKiAtREFEREtFWVNZTVM9MCAgdG8gaGF2ZSAtbm9hZGRfa2V5c3ltcyB0aGUgZGVmYXVsdC4KICoKICogLURSRU1PVEVfREVGQVVMVD0wICB0byBkaXNhYmxlIHJlbW90ZS1jb250cm9sIG9uIGJ5IGRlZmF1bHQgKC15ZXNyZW1vdGUuKQogKiAtRFJFTU9URV9DT05UUk9MPTAgIHRvIGRpc2FibGUgcmVtb3RlLWNvbnRyb2wgbWVjaGFuaXNtIGNvbXBsZXRlbHkuCiAqIC1ERVhURVJOQUxfQ09NTUFORFM9MCAgdG8gZGlzYWJsZSB0aGUgcnVubmluZyBvZiBhbGwgZXh0ZXJuYWwgY29tbWFuZHMuCiAqIC1ERklMRVhGRVI9MCAgZGlzYWJsZSBmaWxleGZlci4KICoKICogLURIQVJEV0lSRV9QQVNTV0Q9Li4uICAgICAgaGFyZHdpcmVkIHBhc3N3b3JkcywgcXVvdGluZyBuZWNlc3NhcnkuCiAqIC1ESEFSRFdJUkVfVklFV1BBU1NXRD0uLi4KICogLUROT1BXPTEgICAgICAgICAgICAgICAgICAgbWFrZSAtbm9wdyB0aGUgZGVmYXVsdCAoc2tpcCB3YXJuaW5nKQogKiAtRFVTRVBXPTEgICAgICAgICAgICAgICAgICBtYWtlIC11c2VwdyB0aGUgZGVmYXVsdAogKiAtRFBBU1NXRF9SRVFVSVJFRD0xICAgICAgICBleGl0IHVubGVzcyBhIHBhc3N3b3JkIGlzIHN1cHBsaWVkLgogKiAtRFBBU1NXRF9VTkxFU1NfTk9QVz0xICAgICBleGl0IHVubGVzcyBhIHBhc3N3b3JkIGlzIHN1cHBsaWVkIGFuZCBubyAtbm9wdy4KICoKICogLURXSVJFRlJBTUU9MCAgdG8gaGF2ZSAtbm93aXJlZnJhbWUgYXMgdGhlIGRlZmF1bHQuCiAqIC1EV0lSRUZSQU1FX0NPUFlSRUNUPTAgIHRvIGhhdmUgLW5vd2lyZWNvcHlyZWN0IGFzIHRoZSBkZWZhdWx0LgogKiAtRFdJUkVGUkFNRV9QQVJNUz0uLi4gICBzZXQgZGVmYXVsdCAtd2lyZWNvcHlyZWN0IHBhcmFtZXRlcnMuCiAqIC1EU0NST0xMX0NPUFlSRUNUPTAgICAgIHRvIGhhdmUgLW5vc2Nyb2xsY29weXJlY3QgYXMgdGhlIGRlZmF1bHQuCiAqIC1EU0NST0xMX0NPUFlSRUNUX1BBUk1TPS4uLiAgc2V0IGRlZmF1bHQgLXNjcm9sbGNvcHlyZWN0IHBhcmFtZXRlcnMuCiAqIC1EU0NBTElOR19DT1BZUkVDVD0wCiAqIC1EWERBTUFHRT0wICAgIHRvIGhhdmUgLW5veGRhbWFnZSBhcyB0aGUgZGVmYXVsdC4KICogLURTS0lQRFVQUz0wICAgdG8gaGF2ZSAtbm9za2lwX2R1cHMgYXMgdGhlIGRlZmF1bHQgb3IgdmljZSB2ZXJzYS4KICoKICogLURQT0lOVEVSX01PREVfREVGQVVMVD17MCwxLDIsMyw0fSAgc2V0IGRlZmF1bHQgLXBvaW50ZXJfbW9kZS4KICogLURCT0xETFlfQ0xPU0VfRElTUExBWT0wICB0byBub3QgY2xvc2UgWCBESVNQTEFZIHVuZGVyIC1yYXdmYi4KICogLURTTUFMTF9GT09UUFJJTlQ9MSAgZm9yIHNtYWxsZXIgYmluYXJ5IHNpemUgKG5vIGhlbHAsIG5vIGd1aSwgZXRjKQogKiAgICAgICAgICAgICAgICAgICAgICB1c2UgMiBvciAzIGZvciBldmVuIHNtYWxsZXIgZm9vdHByaW50LgogKiAtRE5PR1VJICBkbyBub3QgaW5jbHVkZSB0aGUgZ3VpIHRreDExdm5jLgogKiAtRFBPTExfOFRPMjRfREVMQVk9TgogKiAtRERFQlVHX1hFVkVOVFM9MSAgZW5hYmxlIHByaW50b3V0IGZvciBYIGV2ZW50cy4KICoKICogU2V0IHRoZXNlIGluIENQUEZMQUdTIGJlZm9yZSBydW5uaW5nIGNvbmZpZ3VyZS4gRS5nLjoKICoKICogICAlIGVudiBDUFBGTEFHUz0iLURGT1JFVkVSIC1EUkVNT1RFX0NPTlRST0w9MCIgLi9jb25maWd1cmUKICogICAlIG1ha2UKICovCgogICBJZiBvdGhlciB0aGluZ3MgKGUuZy4gIi1JIC4uLiIpIGFyZSBuZWVkZWQgaW4gQ1BQRkxBR1MgYWRkIHRoZW0gYXMKICAgd2VsbC4KCiAgIE9uIHNvbWUgc3lzdGVtcyBpcyBzZWVtcyB5b3UgbmVlZCB0byBzZXQgTENfQUxMPUMgZm9yIGNvbmZpZ3VyZSB0bwogICB3b3JrIHByb3Blcmx5Li4uCgogICBCZSBjYXJlZnVsIHRoZSBmb2xsb3dpbmcgdHdvIHZhcmlhYmxlczogSEFSRFdJUkVfUEFTU1dEIGFuZAogICBIQVJEV0lSRV9WSUVXUEFTU1dELiBJZiBzZXQgKHJlbWVtYmVyIHRvIGluY2x1ZGUgdGhlIGRvdWJsZSBxdW90ZXMKICAgYXJvdW5kIHRoZSBzdHJpbmcpLCB0aGV5IHdpbGwgYmUgdXNlZCBhcyBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlCiAgIC1wYXNzd2QgYW5kIC12aWV3cGFzc3dkIG9wdGlvbnMuIE9mIGNvdXJzZSB0aGUgc3RyaW5ncyB3aWxsIGV4aXN0CiAgIHVub2JzY3VyZWQgaW4gdGhlIHgxMXZuYyBiaW5hcnk6IGl0IGJldHRlciBub3QgYmUgcmVhZGFibGUgYnkKICAgdW5pbnRlbmRlZHMuIFBlcmhhcHMgdGhpcyBpcyBvZiB1c2UgaW4gcmVtb3RlIGFjY2VzcyBmb3IgYW4gZW1iZWRkZWQKICAgYXBwbGljYXRpb24sIGV0Yy4uLgoKICAgTGV0IHVzIGtub3cgaWYgbW9yZSBidWlsZC10aW1lIGN1c3RvbWl6YXRpb25zIHdvdWxkIGJlIHVzZWZ1bC4KCgogICBbV2luMlZOQyBSZWxhdGVkXQoKICAgUS0yMDogSSBoYXZlIHR3byBzZXBhcmF0ZSBtYWNoaW5lIGRpc3BsYXlzIGluIGZyb250IG9mIG1lLCBvbmUgV2luZG93cwogICB0aGUgb3RoZXIgWDExOiBjYW4gSSB1c2UgeDExdm5jIGluIGNvbWJpbmF0aW9uIHdpdGggV2luMlZOQyBpbgogICBkdWFsLXNjcmVlbiBtb2RlIHRvIHBhc3MgdGhlIGtleXN0cm9rZXMgYW5kIG1vdXNlIG1vdGlvbnMgdG8gdGhlIFgxMQogICBkaXNwbGF5PwoKICAgWWVzLCBmb3IgYmVzdCByZXNwb25zZSBzdGFydCB1cCB4MTF2bmMgd2l0aCB0aGUgIi1ub2ZiIiBvcHRpb24KICAgKGRpc2FibGVzIGZyYW1lYnVmZmVyIHBvbGxpbmcsIGFuZCBkb2VzIG90aGVyIG9wdGltaXphdGlvbnMpIG9uIHRoZQogICBzZWNvbmRhcnkgZGlzcGxheSAoWDExKSBtYWNoaW5lLiBUaGVuIHN0YXJ0IHVwIFdpbjJWTkMgb24gdGhlIHByaW1hcnkKICAgZGlzcGxheSAoV2luZG93cykgcmVmZXJyaW5nIGl0IHRvIHRoZSBzZWNvbmRhcnkgZGlzcGxheS4KCiAgIFRoaXMgd2lsbCBhbHNvIHdvcmsgWDExIHRvIFgxMSB1c2luZyB4MnZuYywgaG93ZXZlciB5b3Ugd291bGQgcHJvYmFibHkKICAganVzdCB3YW50IHRvIGF2b2lkIFZOQyBhbmQgdXNlIHgyeCBmb3IgdGhhdC4KCiAgIEZvciByZWZlcmVuY2UsIGhlcmUgYXJlIHNvbWUgbGlua3MgdG8gV2luMlZOQy1saWtlIHByb2dyYW1zIGZvcgogICBtdWx0aXBsZSBtb25pdG9yIHNldHVwczoKICAgICAqIE9yaWdpbmFsIFdpbjJWTkMKICAgICAqIEVuaGFuY2VkIFdpbjJWTkMgKGJyb2tlbj8pIGFuZCBzb3VyY2Vmb3JnZSBsaW5rCiAgICAgKiB4MnZuYwogICAgICogeDJ4CiAgICAgKiB6dm5jIChNb3JwaE9TKQoKICAgQWxsIG9mIHRoZW0gd2lsbCB3b3JrIHdpdGggeDExdm5jIChleGNlcHQgeDJ4IHdoZXJlIGl0IGlzIG5vdCBuZWVkZWQuKQoKCiAgIFEtMjE6IEkgYW0gcnVubmluZyBXaW4yVk5DIG9uIG15IFdpbmRvd3MgbWFjaGluZSBhbmQgIngxMXZuYyAtbm9mYiIgb24KICAgVW5peCB0byBwYXNzIGtleWJvYXJkIGFuZCBtb3VzZSB0byB0aGUgVW5peCBtb25pdG9yLiBXaGVuZXZlciBJIHN0YXJ0CiAgIFdpbjJWTkMgaXQgcXVpY2tseSBkaXNjb25uZWN0cyBhbmQgeDExdm5jIHNheXM6CiAgIHJmYlByb2Nlc3NDbGllbnROb3JtYWxNZXNzYWdlOiByZWFkOiBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIKCiAgIElzIHRoZSBkZWZhdWx0IHZpc3VhbCBvZiB0aGUgWCBkaXNwbGF5IHlvdSBydW4geDExdm5jIG9uIGxvdyBjb2xvcgogICAoZS5nLiA4IGJpdCBwZXIgcGl4ZWwgUHNldWRvQ29sb3IpPyAoeW91IGNhbiBydW4geGRweWluZm8gdG8gY2hlY2ssCiAgIGxvb2sgaW4gdGhlICJzY3JlZW4iIHNlY3Rpb24uKSBUaGVyZSBzZWVtcyB0byBiZSBhIGJ1ZyBpbiBXaW4yVk5DIGluCiAgIHRoYXQgaXQgY2Fubm90IGRlYWwgY29ycmVjdGx5IHdpdGggY29sb3JtYXBzIChQc2V1ZG9Db2xvciBpcyB0aGUgbW9zdAogICBjb21tb24gZXhhbXBsZSBvZiBhIHZpc3VhbCB3aXRoIGEgY29sb3JtYXAuKQoKICAgSWYgc28sIHRoZXJlIGFyZSBhIGNvdXBsZSBvcHRpb25zLiAxKSBDYW4geW91IHNldCB0aGUgZGVmYXVsdCB2aXN1YWwKICAgb24geW91ciBkaXNwbGF5IHRvIGJlIGRlcHRoIDI0IFRydWVDb2xvcj8gU3VuIG1hY2hpbmVzIG9mdGVuIGhhdmUgOCsyNAogICBvdmVybGF5L211bHRpLWRlcHRoIHZpc3VhbHMsIGFuZCB5b3UgY2FuIG1ha2UgdGhlIGRlZmF1bHQgdmlzdWFsIGRlcHRoCiAgIDI0IFRydWVDb2xvciAoc2VlIGZiY29uZmlnKDEpIGFuZCBYc3VuKDEpLikgMikgQXMgb2YgRmViLzIwMDQgeDExdm5jCiAgIGhhcyB0aGUgLXZpc3VhbCBvcHRpb24gdG8gYWxsb3cgeW91IHRvIGZvcmNlIHRoZSBmcmFtZWJ1ZmZlciB2aXN1YWwgdG8KICAgd2hhdGV2ZXIgeW91IHdhbnQgKHRoaXMgdXN1YWxseSBtZXNzZXMgdXAgdGhlIGNvbG9ycyB1bmxlc3MgeW91IGFyZQogICB2ZXJ5IGNsZXZlci4pIEluIHRoaXMgY2FzZSwgdGhlIG9wdGlvbiBwcm92aWRlcyBhIGNvbnZlbmllbnQKICAgd29ya2Fyb3VuZCBmb3IgdGhlIFdpbjJWTkMgYnVnOgogIHgxMXZuYyAtbm9mYiAtdmlzdWFsIFRydWVDb2xvciAtZGlzcGxheSA6MCAuLi4KCiAgIFNvIHRoZSB2aXN1YWwgd2lsbCBiZSBzZXQgdG8gOGJwcCBUcnVlQ29sb3IgYW5kIFdpbjJWTkMgY2FuIGhhbmRsZQogICB0aGlzLiBTaW5jZSBXaW4yVk5DIGRvZXMgbm90IHVzZSB0aGUgZnJhbWVidWZmZXIgZGF0YSB0aGVyZSBzaG91bGQgYmUKICAgbm8gcHJvYmxlbXMgaW4gZG9pbmcgdGhpcy4KCiAgIFEtMjI6IENhbiBJIHJ1biAieDExdm5jIC1ub2ZiIiBvbiBhIE1hYyBPUyBYIG1hY2hpbmUgdG8gcmVkaXJlY3QgbW91c2UKICAgYW5kIGtleWJvYXJkIGlucHV0IHRvIGl0IGZyb20gV2luZG93cyBhbmQgWDExIG1hY2hpbmVzIHZpYSBXaW4yVk5DIGFuZAogICB4MnZuYywgcmVzcGVjdGl2ZWx5PwoKICAgWWVzLCBhcyBvZiBOb3YvMjAwNiB5b3UgY2FuLiBUaGVyZSBtYXkgYmUgYSB0cmljayBvciB0d28geW91J2xsIG5lZWQKICAgdG8gZG8gdG8gZ2V0IHRoZSBDbGlwYm9hcmQgZXhjaGFuZ2UgYmV0d2VlbiB0aGUgbWFjaGluZXMgdG8gd29yay4KCgoKICAgW0NvbG9yIElzc3Vlc10KCiAgIFEtMjM6IFRoZSBYIGRpc3BsYXkgSSBydW4geDExdm5jIG9uIGlzIG9ubHkgOCBiaXRzIHBlciBwaXhlbCAoYnBwKQogICBQc2V1ZG9Db2xvciAoaS5lLiBvbmx5IDI1NiBkaXN0aW5jdCBjb2xvcnMuKSBUaGUgeDExdm5jIGNvbG9ycyBtYXkKICAgc3RhcnQgb3V0IE9LLCBidXQgYWZ0ZXIgYSB3aGlsZSB0aGV5IGFyZSBpbmNvcnJlY3QgaW4gY2VydGFpbiB3aW5kb3dzLgoKICAgVXNlIHRoZSAtZmxhc2hjbWFwIG9wdGlvbiB0byBoYXZlIHgxMXZuYyB3YXRjaCBmb3IgY2hhbmdlcyBpbiB0aGUKICAgY29sb3JtYXAsIGFuZCBwcm9wYWdhdGUgdGhvc2UgY2hhbmdlcyBiYWNrIHRvIGNvbm5lY3RlZCBjbGllbnRzLiBUaGlzCiAgIGNhbiBiZSBzbG93IChzaW5jZSB0aGUgd2hvbGUgc2NyZWVuIG11c3QgYmUgdXBkYXRlZCBvdmVyIHRoZSBuZXR3b3JrCiAgIHdoZW5ldmVyIHRoZSBjb2xvcm1hcCBjaGFuZ2VzLikgVGhpcyBmbGFzaGluZyBjb2xvcm1hcCBiZWhhdmlvciBvZnRlbgogICBoYXBwZW5zIGlmIGFuIGFwcGxpY2F0aW9uIGluc3RhbGxzIGl0cyBvd24gcHJpdmF0ZSBjb2xvcm1hcCB3aGVuIHRoZQogICBtb3VzZSBpcyBpbiBpdHMgd2luZG93LiAibmV0c2NhcGUgLWluc3RhbGwiIGlzIGEgd2VsbC1rbm93biBoaXN0b3JpY2FsCiAgIGV4YW1wbGUgb2YgdGhpcy4gQ29uc2lkZXIgcmVjb25maWd1cmluZyB0aGUgc3lzdGVtIHRvIDE2IGJwcCBvciBkZXB0aAogICAyNCBUcnVlQ29sb3IgaWYgYXQgYWxsIHBvc3NpYmxlLgoKICAgQWxzbyBub3RlIHRoZSBvcHRpb24gLTh0bzI0IChKYW4vMjAwNikgY2FuIG9mdGVuIHJlbW92ZSB0aGUgbmVlZCBmb3IKICAgZmxhc2hpbmcgdGhlIGNvbG9ybWFwLiBFdmVyeXRoaW5nIGlzIGR5bmFtaWNhbGx5IHRyYW5zZm9ybWVkIHRvIGRlcHRoCiAgIDI0IGF0IDMyIGJwcCB1c2luZyB0aGUgY29sb3JtYXBzLiBUaGVyZSBtYXkgYmUgcGFpbnRpbmcgZXJyb3JzIGhvd2V2ZXIKICAgKHNlZSB0aGUgZm9sbG93aW5nIEZBUSBmb3IgdGlwcyBvbiByZWR1Y2luZyBhbmQgY29ycmVjdGluZyB0aGVtLikKCiAgIEluIHNvbWUgcmFyZSBjYXNlcyAoU0NPIHVuaXh3YXJlKSB0aGUgLW5vdHJ1ZWNvbG9yIG9wdGlvbiBoYXMKICAgY29ycmVjdGVkIGNvbG9ycyBvbiA4YnBwIGRpc3BsYXlzLiBUaGUgcmVkLCBncmVlbiwgYW5kIGJsdWUgbWFza3Mgd2VyZQogICBub24temVybyBpbiA4YnBwIFBzZXVkb0NvbG9yIG9uIGFuIG9ic2N1cmUgc2V0dXAsIGFuZCB0aGlzIG9wdGlvbgogICBjb3JyZWN0ZWQgdGhlIHByb2JsZW1zLgoKCiAgIFEtMjQ6IENvbG9yIHByb2JsZW1zOiBXaHkgYXJlIHRoZSBjb2xvcnMgZm9yIHNvbWUgd2luZG93cyBpbmNvcnJlY3QgaW4KICAgeDExdm5jPyBCVFcsIG15IFggZGlzcGxheSBoYXMgbmljZSBvdmVybGF5L211bHRpLWRlcHRoIHZpc3VhbHMgb2YKICAgZGlmZmVyZW50IGNvbG9yIGRlcHRoczogZS5nLiB0aGVyZSBhcmUgYm90aCBkZXB0aCA4IGFuZCAyNCB2aXN1YWxzCiAgIGF2YWlsYWJsZSBhdCB0aGUgc2FtZSB0aW1lLgoKICAgWW91IG1heSB3YW50IHRvIHJldmlldyB0aGUgcHJldmlvdXMgcXVlc3Rpb24gcmVnYXJkaW5nIDggYnBwCiAgIFBzZXVkb0NvbG9yLgoKICAgT24gc29tZSBoYXJkd2FyZSAoU3VuL1NQQVJDIGFuZCBTR0kpLCB0aGUgLW92ZXJsYXkgb3B0aW9uIGRpc2N1c3NlZCBhCiAgIGNvdXBsZSBwYXJhZ3JhcGhzIGRvd24gbWF5IHNvbHZlIHRoaXMgZm9yIHlvdSAoeW91IG1heSB3YW50IHRvIHNraXAgdG8KICAgaXQgZGlyZWN0bHkuKSBPbiBvdGhlciBoYXJkd2FyZSB0aGUgbGVzcyByb2J1c3QgLTh0bzI0IG9wdGlvbiBtYXkgaGVscAogICAoYWxzbyBkaXNjdXNzZWQgYmVsb3cuKQoKICAgUnVuIHhkcHlpbmZvKDEpIHRvIHNlZSB3aGF0IHRoZSBkZWZhdWx0IHZpc3VhbCBpcyBhbmQgd2hhdCB0aGUgZGVwdGhzCiAgIG9mIHRoZSBvdGhlciB2aXN1YWxzIGFyZS4gRG9lcyB0aGUgZGVmYXVsdCB2aXN1YWwgaGF2ZSBhIGRlcHRoIG9mIDgKICAgYnV0IHRoZXJlIGFyZSBvdGhlciB2aXN1YWxzIG9mIGRlcHRoIDI0PyBJZiBpdCBkb2VzLCBjYW4geW91IHBvc3NpYmx5CiAgIHJlLWNvbmZpZ3VyZSB5b3VyIFggc2VydmVyIHRvIG1ha2UgYSBkZXB0aCAyNCB2aXN1YWwgdGhlIGRlZmF1bHQ/IElmCiAgIHlvdSBjYW4gZG8gaXQsIHRoaXMgd2lsbCBzYXZlIHlvdSBhIGxvdCBvZiBncmllZiBXUlQgY29sb3JzIGFuZCB4MTF2bmMKICAgKGFuZCBmb3IgZ2VuZXJhbCB1c2FnZSB0b28hKSBIZXJlIGlzIGhvdyBJIGRvIHRoaXMgb24gYW4gb2xkCiAgIFNwYXJjc3RhdGlvbiAyMCBydW5uaW5nIFNvbGFyaXMgOSB3aXRoIFNYIGdyYXBoaWNzCiAgeGluaXQgLS0gLWRldiAvZGV2L2ZiIGRlZmNsYXNzIFRydWVDb2xvciBkZWZkZXB0aCAyNAoKICAgYW5kIGl0IHdvcmtzIG5pY2VseSAobm90ZTogdG8gbG9nIGludG8gY29uc29sZSBmcm9tIHRoZSBkdGxvZ2luCiAgIHdpbmRvdywgc2VsZWN0ICJPcHRpb25zIC0+IENvbW1hbmQgTGluZSBMb2dpbiIsIHRoZW4gbG9naW4gYW5kIGVudGVyCiAgIHRoZSBhYm92ZSBjb21tYW5kLikgU2VlIHRoZSAtZGV2IHNlY3Rpb24gb2YgdGhlIFhzdW4oMSkgbWFucGFnZSBmb3IgYQogICBkZXNjcmlwdGlvbiBvZiB0aGUgYWJvdmUgYXJndW1lbnRzLiBJZiB5b3UgaGF2ZSByb290IHBlcm1pc3Npb24sIGEKICAgbW9yZSBwZXJtYW5lbnQgYW5kIGNvbnZlbmllbnQgdGhpbmcgdG8gZG8gaXMgdG8gcmVjb3JkIHRoZSBhcmd1bWVudHMKICAgaW4gYSBsaW5lIGxpa2U6CiAgOjAgIExvY2FsIGxvY2FsX3VpZEBjb25zb2xlIHJvb3QgL3Vzci9vcGVud2luL2Jpbi9Yc3VuIC1kZXYgL2Rldi9mYiBkZWZjbGFzcwpUcnVlQ29sb3IgZGVmZGVwdGggMjQKCiAgIGluIC9ldGMvZHQvY29uZmlnL1hzZXJ2ZXJzIChjb3B5IC91c3IvZHQvY29uZmlnL1hzZXJ2ZXJzLikgQWxzbyBsb29rCiAgIGF0IHRoZSBmYmNvbmZpZygxKSBhbmQgcmVsYXRlZCBtYW5wYWdlcyAoZS5nLiBmZmJjb25maWcsIG02NGNvbmZpZywKICAgcGd4Y29uZmlnLCBTVU5XamZiX2NvbmZpZywgZXRjIC4uLikgZm9yIGhhcmR3YXJlIGZyYW1lYnVmZmVyIHNldHRpbmdzCiAgIHRoYXQgbWF5IGFjaGlldmUgdGhlIHNhbWUgZWZmZWN0LgoKICAgSW4gZ2VuZXJhbCBmb3Igbm9uLVN1biBtYWNoaW5lcywgbG9vayBhdCB0aGUgIi1jYyBjbGFzcyIgYW5kIHJlbGF0ZWQKICAgb3B0aW9ucyBpbiB5b3VyIFggc2VydmVyIG1hbnBhZ2UgKHBlcmhhcHMgWHNlcnZlcigxKSksIGl0IG1heSBhbGxvdwogICBtb2RpZnlpbmcgdGhlIGRlZmF1bHQgdmlzdWFsIChlLmcuICItY2MgNCIsIHNlZSA8WDExL1guaD4gZm9yIHRoZQogICB2aXN1YWwgY2xhc3MgbnVtYmVycy4pIE9uIFhGcmVlODYgc29tZSB2aWRlbyBjYXJkIGRyaXZlcnMgKGUuZy4gTWF0cm94CiAgIG1nYSkgaGF2ZSBzZXR0aW5ncyBsaWtlIE9wdGlvbiAiT3ZlcmxheSIgIjI0LDgiIHRvIHN1cHBvcnQgbXVsdGktZGVwdGgKICAgb3ZlcmxheXMuIEZvciB0aGVzZSwgdXNlIHRoZSAiLWNjIDQiIFggc2VydmVyIGNvbW1hbmQgbGluZSBvcHRpb24gdG8KICAgZ2V0IGEgZGVwdGggMjQgZGVmYXVsdCB2aXN1YWwuCgoKICAgVGhlIC1vdmVybGF5IG1vZGU6IEFub3RoZXIgb3B0aW9uIGlzIGlmIHRoZSBzeXN0ZW0gd2l0aCBvdmVybGF5CiAgIHZpc3VhbHMgaXMgYSBTdW4gc3lzdGVtIHJ1bm5pbmcgU29sYXJpcyBvciBTR0kgcnVubmluZyBJUklYIHlvdSBjYW4KICAgdXNlIHRoZSAtb3ZlcmxheSB4MTF2bmMgb3B0aW9uIChBdWcvMjAwNCkgdG8gaGF2ZSB4MTF2bmMgdXNlIHRoZQogICBTb2xhcmlzIFhSZWFkU2NyZWVuKDNYMTEpIGZ1bmN0aW9uIHRvIHBvbGwgdGhlICJ0cnVlIHZpZXciIG9mIHRoZQogICB3aG9sZSBzY3JlZW4gYXQgZGVwdGggMjQgVHJ1ZUNvbG9yLiBYUmVhZERpc3BsYXkoM1gxMSkgaXMgdXNlZCBvbgogICBJUklYLiBUaGlzIGlzIHVzZWZ1bCBmb3IgTGVnYWN5IGFwcGxpY2F0aW9ucyAob2xkZXIgdmVyc2lvbnMgb2YKICAgQ2FkZW5jZSBDQUQgYXBwcyBhcmUgbWVudGlvbmVkIGJ5IHgxMXZuYyB1c2VycykgdGhhdCByZXF1aXJlIHRoZQogICBkZWZhdWx0IGRlcHRoIGJlIDhicHAsIG9yIHRoZSBhcHAgd2lsbCB1c2UgYSA4YnBwIHZpc3VhbCBldmVuIGlmIGRlcHRoCiAgIDI0IHZpc3VhbHMgYXJlIGF2YWlsYWJsZSwgYW5kIHNvIHRoZSBkZWZhdWx0IGRlcHRoIHdvcmthcm91bmQKICAgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBwYXJhZ3JhcGggaXMgbm90IHN1ZmZpY2llbnQgZm9yIHRoZXNlIGFwcHMuCgogICBJdCBzZWVtcyB0aGF0IFhvcmcgaXMgd29ya2luZyB0b3dhcmQgc3VwcG9ydGluZyBYUmVhZERpc3BsYXkoM1gxMSkgYXMKICAgcGFydCBvZiB0aGUgUkVOREVSIGV4dGVuc2lvbiB3b3JrLiBXaGVuIGl0IGRvZXMgc3VwcG9ydCBpdCBhbmQKICAgcHJvdmlkZXMgYSBsaWJyYXJ5IEFQSSB4MTF2bmMgd2lsbCBiZSBtb2RpZmllZCB0byB0YWtlIGFkdmFudGFnZSBvZgogICB0aGUgZmVhdHVyZSB0byBzdXBwb3J0IC1vdmVybGF5IG9uIExpbnV4LCAqQlNELCBldGMuIFVudGlsIHRoZW4gc2VlCiAgIHRoZSAtOHRvMjQgbW9kZSBiZWxvdy4KCiAgIE1pc2MuIG5vdGVzIG9uIC1vdmVybGF5IG1vZGU6IEFuIGFtdXNpbmcgYnktcHJvZHVjdCBvZiAtb3ZlcmxheSBtb2RlCiAgIGlzIHRoYXQgdGhlIG1vdXNlIGN1cnNvciBzaGFwZSBpcyBjb3JyZWN0ISAoaS5lLiBYRklYRVMgaXMgbm90CiAgIG5lZWRlZC4pIFRoZSAtb3ZlcmxheSBtb2RlIG1heSBiZSBzb21ld2hhdCBzbG93ZXIgdGhhbiBub3JtYWwgbW9kZSBkdWUKICAgdG8gdGhlIGV4dHJhIGZyYW1lYnVmZmVyIG1hbmlwdWxhdGlvbnMgdGhhdCBtdXN0IGJlIHBlcmZvcm1lZC4gQWxzbywKICAgb24gU29sYXJpcyB0aGVyZSBpcyBhIGJ1ZyBpbiB0aGF0IGZvciBzb21lIHBvcHVwIG1lbnVzLCB0aGUgd2luZG93cwogICB0aGV5IG92ZXJsYXAgd2lsbCBoYXZlIHBhaW50aW5nIGVycm9ycyAoZmxhc2hpbmcgY29sb3JzKSB3aGlsZSB0aGUKICAgcG9wdXAgaXMgdXAgKGEgd29ya2Fyb3VuZCBpcyB0byBkaXNhYmxlIFNhdmVVbmRlcnMgYnkgcGFzc2luZyAtc3UgdG8KICAgWHN1biwgZS5nLiBpbiB5b3VyIC9ldGMvZHQvY29uZmlnL1hzZXJ2ZXJzIGZpbGUuKQoKCiAgIFRoZSAtOHRvMjQgbW9kZTogVGhlIC04dG8yNCB4MTF2bmMgb3B0aW9uIChKYW4vMjAwNikgaXMgYSBrbHVkZ2UgdG8KICAgdHJ5IHRvIGR5bmFtaWNhbGx5IHJld3JpdGUgdGhlIHBpeGVsIHZhbHVlcyBzbyB0aGF0IHRoZSA4YnBwIHBhcnQgb2YKICAgdGhlIHNjcmVlbiBpcyBtYXBwZWQgb250byBkZXB0aCAyNCBUcnVlQ29sb3IuIFRoaXMgaXMgbGVzcyByb2J1c3QgdGhhbgogICB0aGUgLW92ZXJsYXkgbW9kZSBiZWNhdXNlIGl0IGlzIGRvbmUgYnkgeDExdm5jIG91dHNpZGUgb2YgdGhlIFgKICAgc2VydmVyLiBTbyBvbmx5IHVzZSBpdCBvbiBPUydzIHRoYXQgZG8gbm90IHN1cHBvcnQgLW92ZXJsYXkuIFRoZQogICAtOHRvMjQgbW9kZSB3aWxsIHdvcmsgaWYgdGhlIGRlZmF1bHQgdmlzdWFsIGlzIGRlcHRoIDI0IG9yIGRlcHRoIDguIEl0CiAgIHNjYW5zIGZvciBhbnkgd2luZG93cyB3aXRoaW4gMyBsZXZlbHMgb2YgdGhlIHJvb3Qgd2luZG93IHRoYXQgYXJlIDhicHAKICAgKGkuZS4gbGVnYWN5IGFwcGxpY2F0aW9uKSwgb3IgaW4gZ2VuZXJhbCBvbmVzIHRoYXQgYXJlIG5vdCB1c2luZyB0aGUKICAgZGVmYXVsdCB2aXN1YWwuIEZvciB0aGUgd2luZG93cyBpdCBmaW5kcyBpdCB1c2VzIFhHZXRTdWJJbWFnZSgpIHRvCiAgIHJldHJpZXZlIHRoZSBwaXhlbHMgdmFsdWVzIGFuZCB1c2VzIHRoZSBjb3JyZWN0IGluZGV4ZWQgY29sb3JtYXAgdG8KICAgY3JlYXRlIGEgZGVwdGggMjQgVHJ1ZUNvbG9yIHZpZXcgb2YgdGhlIHdob2xlIHNjcmVlbi4gVGhpcyBkZXB0aCAyNCwKICAgMzJicHAgdmlldyBpcyBleHBvcnRlZCB2aWEgVk5DLgoKICAgRXZlbiBvbiBwdXJlIDhicHAgZGlzcGxheXMgaXQgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJuYXRpdmUgdG8KICAgLWZsYXNoY21hcCB0byBhdm9pZCBjb2xvciBmbGFzaGluZyBjb21wbGV0ZWx5LgoKICAgVGhpcyBzY2hlbWUgaXMgYXBwcm94aW1hdGUgYW5kIGNhbiBvZnRlbiBsZWFkIHRvIHBhaW50aW5nIGVycm9ycy4gWW91CiAgIGNhbiBtYW51YWxseSBjb3JyZWN0IG1vc3QgcGFpbnRpbmcgZXJyb3JzIGJ5IHByZXNzaW5nIDMgQWx0X0wncyBpbiBhCiAgIHJvdywgb3IgYnkgdXNpbmcgc29tZXRoaW5nIGxpa2U6IC1maXhzY3JlZW4gVj0zLjAgdG8gYXV0b21hdGljYWxseQogICByZWZyZXNoIHRoZSBzY3JlZW4gZXZlcnkgMyBzZWNvbmRzLiBBbHNvIC1maXhzY3JlZW4gOD0zLjAgaGFzIGJlZW4KICAgYWRkZWQgdG8ganVzdCByZWZyZXNoIHRoZSBub24tZGVmYXVsdCB2aXN1YWwgcGFydHMgb2YgdGhlIHNjcmVlbi4KCiAgIEluIGdlbmVyYWwgdGhlIHNjaGVtZSB1c2VzIG1hbnkgcmVzb3VyY2VzIGFuZCBtYXkgZ2l2ZSByaXNlIHRvCiAgIHNsdWdnaXNoIGJlaGF2aW9yLiBJZiBtdWx0aXBsZSB3aW5kb3dzIGFyZSB1c2luZyBkaWZmZXJlbnQgOGJwcAogICBpbmRleGVkIGNvbG9ybWFwcyBhbGwgYnV0IG9uZSB3aW5kb3cgbWF5IG5lZWQgdG8gYmUgaWNvbmlmaWVkIGZvciB0aGUKICAgY29sb3JzIHRvIGJlIGNvcnJlY3QuIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0dW5hYmxlIHBhcmFtZXRlcnMgdG8gdHJ5CiAgIHRvIGFkanVzdCBwZXJmb3JtYW5jZSBhbmQgcGFpbnRpbmcgYWNjdXJhY3kuIFRoZSBvcHRpb24gLTh0bzI0CiAgIG5vZ2V0aW1hZ2UgY2FuIGdpdmUgYSBuaWNlIHNwZWVkdXAgaWYgdGhlIGRlZmF1bHQgZGVwdGggMjQgWCBzZXJ2ZXIKICAgc3VwcG9ydHMgaGlkaW5nIHRoZSA4YnBwIGJpdHMgaW4gYml0cyAyNS0zMiBvZiB0aGUgZnJhbWVidWZmZXIgZGF0YS4KICAgT24gdmVyeSBzbG93IG1hY2hpbmVzIC04dG8yNCBwb2xsPTAuMixjYWNoZXdpbj01LjAgZ2l2ZXMgYW4gdXNlZnVsCiAgIHNwZWVkdXAuIFNlZSB0aGUgLTh0bzI0IGhlbHAgZGVzY3JpcHRpb24gZm9yIGluZm9ybWF0aW9uIG9uIHR1bmFibGUKICAgcGFyYW1ldGVycywgZXRjLgoKCiAgIENvbG9ycyBzdGlsbCBub3Qgd29ya2luZyBjb3JyZWN0bHk/IFJ1biB4d2luaW5mbyBvbiB0aGUgYXBwbGljYXRpb24KICAgd2l0aCB0aGUgaW5jb3JyZWN0IGNvbG9ycyB0byB2ZXJpZnkgdGhhdCB0aGUgZGVwdGggb2YgaXRzIHZpc3VhbCBpcwogICBkaWZmZXJlbnQgZnJvbSB0aGUgZGVmYXVsdCB2aXN1YWwgZGVwdGggKGdvdHRlbiBmcm9tIHhkcHlpbmZvLikgT25lCiAgIHBvc3NpYmxlIHdvcmthcm91bmQgaW4gdGhpcyBjYXNlIGlzIHRvIHVzZSB0aGUgLWlkIG9wdGlvbiB0byBwb2ludAogICB4MTF2bmMgYXQgdGhlIGFwcGxpY2F0aW9uIHdpbmRvdyBpdHNlbGYuIElmIHRoZSBhcHBsaWNhdGlvbiBpcwogICBjb21wbGljYXRlZCAobG90cyBvZiB0b3BsZXZlbCB3aW5kb3dzIGFuZCBwb3B1cCBtZW51cykgdGhpcyBtYXkgbm90IGJlCiAgIGFjY2VwdGFibGUsIGFuZCBtYXkgZXZlbiBjcmFzaCB4MTF2bmMgKGJ1dCBub3QgdGhlIGFwcGxpY2F0aW9uLikgU2VlCiAgIGFsc28gLWFwcHNoYXJlLgoKICAgSXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZSB0byBzb2x2ZSB0aGlzIHByb2JsZW0gaW4gZ2VuZXJhbCAoc2VlCiAgIHh3ZCgxKSBmb3IgZXhhbXBsZSksIGJ1dCBpdCBkb2VzIG5vdCBzZWVtIHRyaXZpYWwgb3Igc3VmZmljaWVudGx5IGZhc3QKICAgZm9yIHgxMXZuYyB0byBiZSBhYmxlIHRvIGRvIHNvIGluIHJlYWwgdGltZS4gVGhlIC04dG8yNCBtZXRob2QgZG9lcwogICB0aGlzIGFwcHJveGltYXRlbHkgYW5kIGlzIHNvbWV3aGF0IHVzYWJsZS4gRm9ydHVuYXRlbHkgdGhlIC1vdmVybGF5CiAgIG9wdGlvbiB3b3JrcyBmb3IgU29sYXJpcyBtYWNoaW5lcyB3aXRoIG92ZXJsYXkgdmlzdWFscyB3aGVyZSBtb3N0IG9mCiAgIHRoaXMgcHJvYmxlbSBvY2N1cnMuCgoKICAgUS0yNTogSSBhbSBvbiBhIGhpZ2ggY29sb3Igc3lzdGVtIChkZXB0aCA+PSAyNCkgYnV0IEkgc2VlbSB0byBoYXZlCiAgIGNvbG9ybWFwIHByb2JsZW1zLiBUaGV5IGVpdGhlciBmbGFzaCBvciBldmVyeXRoaW5nIGlzIHZlcnkgZGFyay4KCiAgIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgZGVmYXVsdCBWaXN1YWwgKHVzZSB4ZHB5aW5mbyB0byBsaXN0IHRoZW0pIGlzCiAgIERpcmVjdENvbG9yIGluc3RlYWQgb2YgVHJ1ZUNvbG9yLiBUaGVzZSBhcmUgYm90aCB1c3VhbGx5IHVzZWQgaW4gaGlnaAogICBjb2xvciBtb2RlcywgYnV0IHdoZXJlYXMgVHJ1ZUNvbG9yIHVzZXMgc3RhdGljIHJhbXBzIGZvciB0aGUgUmVkLAogICBHcmVlbiwgYW5kIEJsdWUgY29tcG9uZW50cywgRGlyZWN0Q29sb3IgaGFzIGFyYml0cmFyeSBjb2xvcm1hcHMgZm9yCiAgIHRoZSBSZWQsIEdyZWVuLCBhbmQgQmx1ZSBDb21wb25lbnRzLiBDdXJyZW50bHkgeDExdm5jIGNhbm5vdCBkZWNvZGUKICAgdGhlc2UgY29sb3JtYXBzIGFuZCB0cmVhdHMgdGhlbSBqdXN0IGxpa2UgVHJ1ZUNvbG9yLgoKICAgVGhlIG9ubHkgd29ya2Fyb3VuZCBzbyBmYXIgaXMgdG8gcmVzdGFydCB0aGUgWCBzZXJ2ZXIgd2l0aCB0aGUgIi1jYyA0IgogICBvcHRpb24gdG8gZm9yY2UgVHJ1ZUNvbG9yIGFzIHRoZSBkZWZhdWx0IHZpc3VhbCAoRGlyZWN0Q29sb3IgaXMgIi1jYwogICA1Ijsgc2VlIC91c3IvaW5jbHVkZS9YMTEvWC5oLikgVGhlIG9ubHkgcGxhY2Ugd2UgaGF2ZSBzZWVuIHRoaXMgaXMKICAgd2l0aCB0aGUgdmlydHVhbCBmcmFtZWJ1ZmZlciBzZXJ2ZXIgWHZmYiBvbiBYb3JnIDcuMi4gU28gaW4gdGhhdCBjYXNlCiAgIHlvdSBwcm9iYWJseSBzaG91bGQgcmVzdGFydCBpdCB3aXRoIHNvbWV0aGluZyBsaWtlIHRoaXM6ICJYdmZiIDoxIC1jYwogICA0IC1zY3JlZW4gMCAxMjgweDEwMjR4MjQiLiBJdCBzaG91bGQgYmUgcG9zc2libGUgZm9yIHgxMXZuYyB0byBoYW5kbGUKICAgRGlyZWN0Q29sb3IsIGJ1dCB0aGlzIGhhc24ndCBiZWVuIGltcGxlbWVudGVkIGR1ZSB0byBpdHMgcmFyZSB1c2FnZS4KCiAgIFlvdSBtYXkgYWxzbyBzZWUgdGhpcyBwcm9ibGVtIG9uIGFuIFggZGlzcGxheSB3aXRoIGEgVHJ1ZUNvbG9yIGRlZmF1bHQKICAgdmlzdWFsIHdoZXJlIGFuIGFwcGxpY2F0aW9uIGNob29zZXMgYSBEaXJlY3RDb2xvciB2aXN1YWwgZm9yIGl0cwogICB3aW5kb3cocykuIEl0IHNlZW1zIHRoZSBhcHBsaWNhdGlvbiBhbHNvIG5lZWRzIHRvIGluc3RhbGwgaXRzIG93bgogICBjb2xvcm1hcCBmb3IgdGhlIHZpc3VhbCBmb3IgdGhlIGNvbG9ycyB0byBiZSBtZXNzZWQgdXAgaW4geDExdm5jLiBPbmUKICAgY2FuIG1ha2UgeHd1ZCBkbyB0aGlzIGZvciBleGFtcGxlLgoKCiAgIFEtMjY6IEhvdyBkbyBJIGZpZ3VyZSBvdXQgdGhlIHdpbmRvdyBpZCB0byBzdXBwbHkgdG8gdGhlIC1pZCB3aW5kb3dpZAogICBvcHRpb24/CgogICBSdW4gdGhlIHh3aW5pbmZvIHByb2dyYW0gaW4gYSB0ZXJtaW5hbC4gSXQgd2lsbCBhc2sgeW91IHRvIGNsaWNrIG9uCiAgIHRoZSBkZXNpcmVkIGFwcGxpY2F0aW9uIHdpbmRvdy4gQWZ0ZXIgY2xpY2tpbmcsIGl0IHdpbGwgcHJpbnQgb3V0IG11Y2gKICAgaW5mb3JtYXRpb24sIGluY2x1ZGluZyB0aGUgd2luZG93IGlkIChlLmcuIDB4NjAwMDAxMC4pIEFsc28sIHRoZQogICB2aXN1YWwgYW5kIGRlcHRoIG9mIHRoZSB3aW5kb3cgcHJpbnRlZCBvdXQgaXMgb2Z0ZW4gdXNlZnVsIGluCiAgIGRlYnVnZ2luZyB4MTF2bmMgY29sb3IgcHJvYmxlbXMuCgogICBBbHNvLCBhcyBvZiBEZWMvMjAwNCB5b3UgY2FuIHVzZSAiLWlkIHBpY2siIHRvIGhhdmUgeDExdm5jIHJ1bgogICB4d2luaW5mbygxKSBmb3IgeW91IGFuZCBhZnRlciB5b3UgY2xpY2sgdGhlIHdpbmRvdyBpdCBleHRyYWN0cyB0aGUKICAgd2luZG93aWQuIEJlc2lkZXMgInBpY2siIHRoZXJlIGlzIGFsc28gImlkOnJvb3QiIHRvIGFsbG93IHlvdSB0byBnbwogICBiYWNrIHRvIHJvb3Qgd2luZG93IHdoZW4gZG9pbmcgcmVtb3RlLWNvbnRyb2wuCgoKICAgUS0yNzogV2h5IGRvbid0IG1lbnVzIG9yIG90aGVyIHRyYW5zaWVudCB3aW5kb3dzIGNvbWUgdXAgd2hlbiBJIGFtCiAgIHVzaW5nIHRoZSAtaWQgd2luZG93aWQgb3B0aW9uIHRvIHZpZXcgYSBzaW5nbGUgYXBwbGljYXRpb24gd2luZG93PwoKICAgVGhpcyBpcyByZWxhdGVkIHRvIHRoZSBiZWhhdmlvciBvZiB0aGUgWEdldEltYWdlKDNYMTEpIGFuZAogICBYU2htR2V0SW1hZ2UoKSBpbnRlcmZhY2VzIHJlZ2FyZGluZyBiYWNraW5nc3RvcmUsIHNhdmV1bmRlcnMsIGV0Yy4gVGhlCiAgIHdheSB0aGUgaW1hZ2UgaXMgcmV0cmlldmVkIGRlcGVuZHMgb24gc29tZSBhc3BlY3RzIG9mIGhvdyB0aGUgWCBzZXJ2ZXIKICAgbWFpbnRhaW5zIHRoZSBkaXNwbGF5IGltYWdlIGRhdGEgYW5kIHdoZXRoZXIgb3RoZXIgd2luZG93cyBhcmUKICAgY2xpcHBpbmcgb3Igb2JzY3VyaW5nIGl0LiBTZWUgdGhlIFhHZXRJbWFnZSgzWDExKSBtYW4gcGFnZSBmb3IgbW9yZQogICBkZXRhaWxzLiBJZiB5b3UgZGlzYWJsZSBCYWNraW5nU3RvcmUgYW5kIFNhdmVVbmRlcnMgaW4gdGhlIFggc2VydmVyCiAgIHlvdSBzaG91bGQgYmUgYWJsZSB0byBzZWUgdGhlc2UgdHJhbnNpZW50IHdpbmRvd3MuCgogICBJZiB0aGluZ3MgYXJlIG5vdCB3b3JraW5nIGFuZCB5b3Ugc3RpbGwgd2FudCB0byBkbyB0aGUgc2luZ2xlIHdpbmRvdwogICBwb2xsaW5nLCB0cnkgdGhlIC1zaWQgd2luZG93aWQgb3B0aW9uICgic2hpZnRlZCIgd2luZG93aWQuKQoKICAgVXBkYXRlOiBhcyBvZiBOb3YvMjAwOSBpbiB0aGUgMC45LjkgeDExdm5jIGRldmVsb3BtZW50IHRhcmJhbGwsIHRoZXJlCiAgIGlzIGFuIGV4cGVyaW1lbnRhbCBBcHBsaWNhdGlvbiBTaGFyaW5nIG1vZGUgdGhhdCBpbXByb3ZlcyB1cG9uIHRoZQogICAtaWQvLXNpZCBzaW5nbGUgd2luZG93IHNoYXJpbmc6IC1hcHBzaGFyZSAocnVuICJ4MTF2bmMgLWFwcHNoYXJlCiAgIC1oZWxwIiBmb3IgbW9yZSBpbmZvLikgSXQgaXMgc3RpbGwgdmVyeSBwcmltaXRpdmUgYW5kIGFwcHJveGltYXRlLCBidXQKICAgYXQgbGVhc3QgaXQgZGlzcGxheXMgbXVsdGlwbGUgdG9wLWxldmVsIHdpbmRvd3MuCgoKICAgUS0yODogTXkgWCBkaXNwbGF5IGlzIGRlcHRoIDI0IGF0IDI0YnBwIChpbnN0ZWFkIG9mIHRoZSBub3JtYWwgZGVwdGgKICAgMjQgYXQgMzJicHAuKSBJJ20gaGF2aW5nIGxvdHMgb2YgY29sb3IgYW5kIHZpc3VhbCBwcm9ibGVtcyB3aXRoIHgxMXZuYwogICBhbmQvb3Igdm5jdmlld2VyLiBXaGF0J3MgdXA/CgogICBGaXJzdCBvZmYsIGRlcHRoIDI0IGF0IDI0YnBwIChicHA9Yml0cy1wZXItcGl4ZWwpIGlzIGZhaXJseSB1bmNvbW1vbgogICBhbmQgY2FuIGNhdXNlIHByb2JsZW1zIGluIGdlbmVyYWwuIEl0IGFsc28gY2FuIGJlIHNsb3dlciB0aGFuIGRlcHRoIDI0CiAgIGF0IDMyYnBwLiBZb3UgbWlnaHQgd2FudCB0byBzd2l0Y2ggdG8gMzJicHAgKGZvciBYRnJlZTg2IHNlZSB0aGUKICAgIi1mYmJwcCAzMiIsIERlZmF1bHRGYkJwcCwgRmJCcHAgYW5kIHJlbGF0ZWQgb3B0aW9ucy4pIFBlcmhhcHMgeW91CiAgIGhhdmUgMjRicHAgYmVjYXVzZSB0aGUgdmlkZW8gbWVtb3J5IG9mIHRoZSBtYWNoaW5lIGlzIGxvdyBhbmQgdGhlCiAgIHNjcmVlbiB3b3VsZG4ndCBmaXQgaW4gdmlkZW8gUkFNIGF0IDMyYnBwLiBGb3IgdGhpcyBjYXNlIGRlcHRoIDE2IGF0CiAgIDE2YnBwIG1pZ2h0IGJlIGFuIGFjY2VwdGFibGUgb3B0aW9uLgoKICAgSW4gYW55IGV2ZW50IHgxMXZuYyBzaG91bGQgaGFuZGxlIGRlcHRoIDI0IGF0IDI0YnBwIChhbHRob3VnaAogICBwZXJmb3JtYW5jZSBtYXkgYmUgc2xvd2VyLCBhbmQgeW91IG1heSBuZWVkIHRvIHVzZSB0aGUgWlJMRSBlbmNvZGluZwogICBpbnN0ZWFkIG9mIFRpZ2h0LikgVGhlcmUgYXJlIHNvbWUgY2F2ZWF0cyBpbnZvbHZpbmcgdGhlIHZpZXdlcgogICBob3dldmVyOgoKICAgVGhlIFJlYWxWTkMgVW5peCB2aWV3ZXIgY2Fubm90IGhhbmRsZSAyNGJwcCBmcm9tIHRoZSBzZXJ2ZXIsIGl0IHdpbGwKICAgc2F5OiAibWFpbjogc2V0UEY6IG5vdCA4LCAxNiBvciAzMiBicHA/IiBhbmQgZXhpdC4gSSBoYXZlIG5vdCBjaGVja2VkCiAgIHRoZSBSZWFsVk5DIFdpbmRvd3Mgdmlld2VyLgoKICAgU28geW91IG5lZWQgdG8gdXNlIHRoZSBUaWdodFZOQyBVbml4IHZpZXdlci4gSG93ZXZlciB0aGVyZSBhcmUgc29tZQogICBwcm9ibGVtcyB3aXRoIHRoYXQgdG9vLiBJdCBzZWVtcyBsaWJ2bmNzZXJ2ZXIgZG9lcyBub3QgZG8gMjRicHAKICAgY29ycmVjdGx5IHdpdGggdGhlIFRpZ2h0IGVuY29kaW5nLiBUaGUgY29sb3JzIGFuZCBzY3JlZW4gdWx0aW1hdGVseQogICBnZXQgbWVzc2VkIHVwLiBTbyB5b3UgaGF2ZSB0byB1c2UgYSBkaWZmZXJlbnQgZW5jb2Rpbmcgd2l0aCB0aGUKICAgVGlnaHRWTkMgdm5jdmlld2VyLCB0cnkgInpsaWIiLCAiaGV4dGlsZSIsIG9yIG9uZSBvZiB0aGUgb3RoZXIKICAgZW5jb2RpbmdzIChlLmcuIHZuY3ZpZXdlciAtZW5jb2RpbmdzICJ6bGliIGhleHRpbGUiIC4uLi4pIEkgaGF2ZSBub3QKICAgY2hlY2tlZCB0aGUgVGlnaHRWTkMgb3IgVWx0cmFWTkMgV2luZG93cyB2aWV3ZXJzLgoKICAgSXQgYXBwZWFycyB0aGUgb2xkZXIgUmVhbFZOQyBVbml4IHZpZXdlcnMgKGUuZy4gMy4zLjMgYW5kIDMuMy43KSBjYW4KICAgaGFuZGxlIDI0YnBwIGZyb20gdGhlIHNlcnZlciwgc28geW91IG1heSB3YW50IHRvIHVzZSB0aG9zZS4gVGhleQogICBldmlkZW50bHkgcmVxdWVzdCAzMiBicHAgYW5kIGxpYnZuY3NlcnZlciBvYmxpZ2VzLgoKICAgVXBkYXRlOiBhcyBvZiBBcHIvMjAwNiB5b3UgY2FuIHVzZSB0aGUgLTI0dG8zMiBvcHRpb24gdG8gaGF2ZSB4MTF2bmMKICAgZHluYW1pY2FsbHkgdHJhbnNmb3JtIHRoZSAyNGJwcCBwaXhlbCBkYXRhIHRvIDMyYnBwLiBUaGlzIGV4dHJhCiAgIHRyYW5zZm9ybWF0aW9uIGNvdWxkIHNsb3cgdGhpbmdzIGRvd24gZnVydGhlciBob3dldmVyLgoKICAgTm93IGNvbWluZyB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uIGlmIHlvdSBhcmUgcnVubmluZyB0aGUgdm5jdmlld2VyIG9uCiAgIHRoZSAyNGJwcCBkaXNwbGF5LCBUaWdodFZOQyB3aWxsIGZhaWwgd2l0aCAiQ2FuJ3QgY29wZSB3aXRoIDI0CiAgIGJpdHMtcGVyLXBpeGVsLiBTb3JyeS4iIGFuZCBSZWFsVk5DIHdpbGwgZmFpbCB3aXRoICJtYWluOiBFcnJvcjoKICAgY291bGRuJ3QgZmluZCBzdWl0YWJsZSBwaXhtYXAgZm9ybWF0IiBzbyBldmlkZW50bHkgeW91IGNhbm5vdCB1c2UKICAgMjRicHAgZm9yIHRoZSB2bmN2aWV3ZXJzIHRvIHdvcmsgb24gdGhhdCBYIGRpc3BsYXkuCgogICBOb3RlLCBob3dldmVyLCB0aGF0IHRoZSBVbml4IHZpZXdlciBpbiB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyCiAgIChTU1ZOQykgcHJvamVjdCBjYW4gaGFuZGxlIDI0YnBwIFggZGlzcGxheXMuIEl0IGRvZXMgdGhpcyBieQogICByZXF1ZXN0aW5nIGEgMTZicHAgcGl4ZWwgZm9ybWF0IChvciA4YnBwIGlmIHRoZSAtYmdyMjMzIG9wdGlvbiBoYXMKICAgYmVlbiBzdXBwbGllZCkgZnJvbSB0aGUgVk5DIHNlcnZlciwgYW5kIHRyYW5zbGF0ZXMgdGhhdCB0byAyNGJwcAogICBsb2NhbGx5LgogICBbWHRlcm1pbmFsc10KCiAgIFEtMjk6IENhbiBJIHVzZSB4MTF2bmMgdG8gdmlldyBhbmQgaW50ZXJhY3Qgd2l0aCBhbiBYdGVybWluYWwgKGUuZy4KICAgTkNEKSB0aGF0IGlzIG5vdCBydW5uaW5nIFVOSVggYW5kIHNvIHgxMXZuYyBjYW5ub3QgYmUgcnVuIG9uIGl0CiAgIGRpcmVjdGx5PwoKICAgWW91IGNhbiwgYnV0IGl0IHdpbGwgbGlrZWx5IGJlIHZlcnkgd2FzdGVmdWwgb2YgbmV0d29yayBiYW5kd2lkdGgKICAgc2luY2UgeW91IHdpbGwgYmUgcG9sbGluZyB0aGUgWCBkaXNwbGF5IG92ZXIgdGhlIG5ldHdvcmsgYXMgb3Bwb3NlZCB0bwogICBvdmVyIHRoZSBsb2NhbCBoYXJkd2FyZS4gVG8gZG8gdGhpcywgcnVuIHgxMXZuYyBvbiBhIFVOSVggbWFjaGluZSBhcwogICBjbG9zZSBhcyBwb3NzaWJsZSBuZXR3b3JrLXdpc2UgKGUuZy4gc2FtZSBzd2l0Y2gpIHRvIHRoZSBYdGVybWluYWwKICAgbWFjaGluZS4gVXNlIHRoZSAtZGlzcGxheSBvcHRpb24gdG8gcG9pbnQgdGhlIGRpc3BsYXkgdG8gdGhhdCBvZiB0aGUKICAgWHRlcm1pbmFsICh5b3UnbGwgb2YgY291cnNlIG5lZWQgYmFzaWMgWDExIHBlcm1pc3Npb24gdG8gZG8gdGhhdCkgYW5kCiAgIGZpbmFsbHkgc3VwcGx5IHRoZSAtbm9zaG0gb3B0aW9uICh0aGlzIGVuYWJsZXMgdGhlIHBvbGxpbmcgb3ZlciB0aGUKICAgbmV0d29yay4pCgogICBJZiB0aGUgWHRlcm1pbmFsJ3MgWCBkaXNwbGF5IGlzIG9wZW4gdG8gdGhlIG5ldHdvcmsgZm9yIGNvbm5lY3Rpb25zLAogICB5b3UgbWlnaHQgdXNlIHNvbWV0aGluZyBsaWtlICItZGlzcGxheSB4dGVybTEyMzowIi4gSWYgeW91IGFyZSB0cnlpbmcKICAgdG8gZG8gdGhpcyB2aWEgYW4gU1NIIHR1bm5lbCAoYXNzdW1pbmcgeW91IGNhbiBhY3R1YWxseSBzc2ggaW50byB0aGUKICAgWHRlcm1pbmFsKSBpdCB3aWxsIGJlIGEgbGl0dGxlIHRyaWNreSAoZWl0aGVyIHVzZSB0aGUgc3NoICItUiIgb3B0aW9uCiAgIG9yIGNvbnNpZGVyIHNzaC1pbmcgaW4gdGhlIG90aGVyIGRpcmVjdGlvbi4pIEluIGFsbCBjYXNlcyB0aGUgWDExCiAgIHBlcm1pc3Npb25zIG5lZWQgdG8gYWxsb3cgdGhlIGNvbm5lY3Rpb24uCgogICBUaGUgcmVzcG9uc2Ugd2lsbCBsaWtlbHkgYmUgc2x1Z2dpc2ggKG1heWJlIG9ubHkgb25lICJmcmFtZSIgcGVyCiAgIHNlY29uZC4pIFRoaXMgbW9kZSBpcyBub3QgcmVjb21tZW5kZWQgZXhjZXB0IGZvciAicXVpY2sgY2hlY2tzIiBvZgogICBoYXJkIHRvIGdldCB0byBYIHNlcnZlcnMuIFVzZSBzb21ldGhpbmcgbGlrZSAiLXdhaXQgMTUwIiB0byBjdXQgZG93bgogICBvbiB0aGUgcG9sbGluZyByYXRlLiBZb3UgbWF5IGFsc28gbmVlZCAtZmxpcGJ5dGVvcmRlciBpZiB0aGUgY29sb3JzCiAgIGdldCBtZXNzZWQgdXAgZHVlIHRvIGVuZGlhbiBieXRlIG9yZGVyIGRpZmZlcmVuY2VzLgoKICAgUS0zMDogSG93IGRvIEkgZ2V0IG15IFggcGVybWlzc2lvbnMgKE1JVC1NQUdJQy1DT09LSUUgZmlsZSkgY29ycmVjdAogICBmb3IgYSBVbml4L0xpbnV4IG1hY2hpbmUgYWN0aW5nIGFzIGFuIFh0ZXJtaW5hbD8KCiAgIElmIHRoZSBYIGRpc3BsYXkgbWFjaGluZSBpcyBhIHRyYWRpdGlvbmFsIFh0ZXJtaW5hbCAod2hlcmUgdGhlIFgKICAgc2VydmVyIHByb2Nlc3MgcnVucyBvbiB0aGUgWHRlcm1pbmFsIGJveCwgYnV0IGFsbCBvZiB0aGUgWCBjbGllbnQKICAgYXBwbGljYXRpb25zIChmaXJlZm94LCBldGMpIHJ1biBvbiBhIGNlbnRyYWwgc2VydmVyIChha2EgInRlcm1pbmFsCiAgIHNlcnZlciIpKSwgeW91IHdpbGwgbmVlZCB0byBsb2cgaW50byB0aGUgWHRlcm1pbmFsIG1hY2hpbmUgKGkuZS4gZ2V0IGEKICAgc2hlbGwgcnVubmluZyB0aGVyZSkgYW5kIHRoZW4gc3RhcnQgdGhlIHgxMXZuYyBwcm9ncmFtLiBJZiB0aGUKICAgWHRlcm1pbmFsIExpbnV4L1VuaXggbWFjaGluZSBpcyBzdHJpcHBlZCBkb3duIChlLmcuIG5vIHVzZXJzIGJlc2lkZXMKICAgcm9vdCkgdGhhdCBtYXkgYmUgZGlmZmljdWx0LgoKICAgVGhlIG5leHQgcHJvYmxlbSBpcyB0aGUgbG9naW4gRGlzcGxheSBNYW5hZ2VyIChlLmcuIGdkbSwga2RtKSwgYW5kCiAgIGhlbmNlIHRoZSBNSVQtTUFHSUMtQ09PS0lFIGF1dGggZmlsZXMsIGFyZSBvbiB0aGUgY2VudHJhbCBzZXJ2ZXIgYW5kCiAgIG5vdCBvbiB0aGUgWHRlcm1pbmFsIGJveCB3aGVyZSB0aGUgWCBzZXJ2ZXIgYW5kIHgxMXZuYyBwcm9jZXNzZXMgYXJlLgoKICAgU28gdW5sZXNzIFggcGVybWlzc2lvbnMgYXJlIGNvbXBsZXRlbHkgdHVybmVkIG9mZiAoZS5nLiAieGhvc3QgKyIpLCB0bwogICBydW4gdGhlIHgxMXZuYyBwcm9jZXNzIG9uIHRoZSBYdGVybWluYWwgYm94IHRoZSBNSVQtTUFHSUMtQ09PS0lFIGF1dGgKICAgZmlsZSBkYXRhIChYQVVUSE9SSVRZIG9yICRIT01FLy5YYXV0aG9yaXR5KSBtdXN0IGJlIGFjY2Vzc2libGUgYnkgb3IKICAgY29waWVkIHRvIHRoZSBYdGVybWluYWwuIElmICRIT01FLy5YYXV0aG9yaXR5IGlzIGV4cG9ydGVkIHZpYSBORlMKICAgKHRoaXMgaXMgaW5zZWN1cmUgb2YgY291cnNlLCBidXQgaGFzIGJlZW4gZ29pbmcgb24gZm9yIGRlY2FkZXMpLCB0aGVuCiAgIHgxMXZuYyBjYW4gc2ltcGx5IHBpY2sgaXQgdXAgdmlhIE5GUyAoeW91IG1heSBuZWVkIHRvIHVzZSB0aGUgLWF1dGgKICAgb3B0aW9uIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IGZpbGUuKSBPdGhlciBvcHRpb25zIGluY2x1ZGUgY29weWluZwogICB0aGUgYXV0aCBmaWxlIHVzaW5nIHNjcCwgb3Igc29tZXRoaW5nIGxpa2U6CiAgY2VudHJhbC1zZXJ2ZXI+ICB4YXV0aCBuZXh0cmFjdCAtIHh0ZXJtMTIzOjAgfCBzc2ggeHRlcm0xMjMgeGF1dGggbm1lcmdlIC0KCiAgIGFuZCB0aGVuLCBzYXksIHNzaCBmcm9tIGNlbnRyYWwtc2VydmVyIHRvIHh0ZXJtMTIzIHRvIHN0YXJ0IHgxMXZuYy4KICAgSGVyZSAieHRlcm0xMjMiIHJlZmVycyB0byB0aGUgY29tcHV0ZXIgYWN0aW5nIGFzIHRoZSBYdGVybWluYWwgYW5kCiAgICJjZW50cmFsLXNlcnZlciIgaXMgdGhlIHRlcm1pbmFsIHNlcnZlci4gWW91IGNhbiB1c2UgInhhdXRoIC1mCiAgIC9wYXRoL3RvL2Nvb2tpZS1maWxlIGxpc3QiIHRvIGV4YW1pbmUgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb29raWUocykgaW4KICAgYSBmaWxlICIvcGF0aC90by9jb29raWUtZmlsZSIuIFNlZSB0aGUgeGF1dGgoMSkgbWFucGFnZSBmb3IgbW9yZQogICBkZXRhaWxzLgoKICAgSWYgdGhlIGRpc3BsYXkgbmFtZSBpbiB0aGUgY29va2llIGZpbGUgbmVlZHMgdG8gYmUgY2hhbmdlZCBiZXR3ZWVuIHRoZQogICB0d28gaG9zdHMsIHNlZSB0aGlzIG5vdGUgb24gdGhlICJ4YXV0aCBhZGQgLi4uIiBjb21tYW5kLgoKICAgQSBsZXNzIHNlY3VyZSBvcHRpb24gaXMgdG8gcnVuIHNvbWV0aGluZyBsaWtlICJ4aG9zdCArMTI3LjAuMC4xIiB3aGlsZQogICBzaXR0aW5nIGF0IHRoZSBYdGVybWluYWwgYm94IHRvIGFsbG93IGNvb2tpZS1mcmVlIGxvY2FsIGFjY2VzcyBmb3IKICAgeDExdm5jLiBZb3UgY2FuIHJ1biAieGhvc3QgLTEyNy4wLjAuMSIgYWZ0ZXIgeDExdm5jIGNvbm5lY3RzIGlmIHlvdQogICB3YW50IHRvIGdvIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHBlcm1pc3Npb25zLgoKICAgSWYgdGhlIFh0ZXJtaW5hbCBpcyByZWFsbHkgc3RyaXBwZWQgZG93biBhbmQgZG9lc24ndCBoYXZlIGFueSB1c2VyCiAgIGFjY291bnRzLCBORlMsIGV0Yy4geW91J2xsIG5lZWQgdG8gY29udGFjdCB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdG9yCiAgIHRvIHNldCBzb21ldGhpbmcgdXAuIEl0IGNhbiBiZSBkb25lISEhICBTb21lIFh0ZXJtaW5hbCBwcm9qZWN0cyBoYXZlCiAgIGFjdHVhbGx5IGVuYWJsZWQgInJ1biBsb2NhbGx5IiBmYWNpbGl0aWVzIGZvciB0aGUgcnVubmluZyBvZiBhbgogICBvY2Nhc2lvbmFsIGFwcCBtb3JlIGVmZmljaWVudGx5IGxvY2FsbHkgb24gdGhlIFh0ZXJtaW5hbCBib3ggKGUuZy4KICAgcmVhbHBsYXllci4pCgogICBOb3QgcmVjb21tZW5kZWQsIGJ1dCBhcyBhIGxhc3QgcmVzb3J0LCB5b3UgY291bGQgaGF2ZSB4MTF2bmMgcG9sbCB0aGUKICAgWHRlcm1pbmFsIERpc3BsYXkgb3ZlciB0aGUgbmV0d29yay4gRm9yIHRoaXMgeW91IHdvdWxkIHJ1biBhICJ4MTF2bmMKICAgLW5vc2htIC4uLiIgcHJvY2VzcyBvbiB0aGUgY2VudHJhbC1zZXJ2ZXIgKGFuZCBob3BlIHRoZSBuZXR3b3JrIGFkbWluCiAgIGRvZXNuJ3QgZ2V0IGFuZ3J5Li4uKQoKICAgTm90ZTogdXNlIG9mIERpc3BsYXkgTWFuYWdlciAoZ2RtLCBrZG0sIC4uLikgYXV0aCBjb29raWUgZmlsZXMgKGkuZS4KICAgZnJvbSAvdmFyLy4uLiwgIC90bXAvLi4uLCBvciBlbHNld2hlcmUpIG1heSByZXF1aXJlIG1vZGlmaWNhdGlvbiB2aWEKICAgeGF1dGgoMSkgdG8gY29ycmVjdGx5IGluY2x1ZGUgdGhlIGRpc3BsYXkgeDExdm5jIHJlZmVycyB0byAoZS5nLgogICAieGF1dGggLWYgY29va2llLWZpbGUgYWRkIDowIC4gNDViZTUxYWUyY2U5ZGZiYWNkODgyYWIzZWY4ZTk2YjEiLAogICB3aGVyZSB0aGUgIjQ1YmU1MS4uLiIgY29va2llIHZhbHVlIHdhcyBmb3VuZCBmcm9tIGFuICJ4YXV0aCAtZgogICAvcGF0aC90by9vcmlnaW5hbC9jb29raWUtZmlsZSBsaXN0Iikgb3Igb3RoZXIgcmVhc29ucy4gU2VlIHhhdXRoKDEpCiAgIG1hbnBhZ2UgZm9yIGZ1bGwgZGV0YWlscyBvbiBob3cgdG8gdHJhbnNmZXIgYW4gTUlULU1BR0lDLUNPT0tJRQogICBiZXR3ZWVuIG1hY2hpbmVzIGFuZCBkaXNwbGF5cy4KCiAgIFZOQ3ZpZXdlciBwZXJmb3JtYW5jZSBvbiBYdGVybWluYWxzOiAgVGhpcyBpc24ndCByZWxhdGVkIHRvIHgxMXZuYyBvbgogICBYdGVybWluYWxzLCBidXQgd2UgbWVudGlvbiBpdCBoZXJlIGFueXdheSBiZWNhdXNlIG9mIHRoZSBzaW1pbGFyCiAgIGlzc3Vlcy4gSWYgeW91IGFyZSBvbiBhbiBYdGVybWluYWwgYW5kIHdhbnQgdG8gdXNlIHZuY3ZpZXdlciB0bwogICBjb25uZWN0IHRvIGEgVk5DIHNlcnZlciBzb21ld2hlcmUsIHRoZW4gcGVyZm9ybWFuY2Ugd291bGQgYmUgYmVzdCBpZgogICB5b3UgcmFuIHRoZSB2aWV3ZXIgb24gdGhlIFh0ZXJtaW5hbCBib3guIE90aGVyd2lzZSwgKGkuZS4gcnVubmluZyB0aGUKICAgdmlld2VyIHByb2Nlc3Mgb24gdGhlIGNlbnRyYWwtc2VydmVyKSBhbGwgb2YgdGhlIHZuY3ZpZXdlciBzY3JlZW4KICAgZHJhd2luZyBpcyBkb25lIG1vcmUgaW5lZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLiBTb21ldGhpbmcgdG8KICAgY29uc2lkZXIsIGVzcGVjaWFsbHkgb24gYSBidXN5IG5ldHdvcmsuIChCVFcsIHRoaXMgaGFzIGFsbCBvZiB0aGUKICAgYWJvdmUgcGVybWlzc2lvbiwgZXRjLCBwcm9ibGVtczogYm90aCB2bmN2aWV3ZXIgYW5kIHgxMXZuYyBhcmUgWAogICBjbGllbnQgYXBwcyBkZXNpcmVkIHRvIGJlIHJ1biBvbiB0aGUgWHRlcm1pbmFsIGJveC4pCgogICBbU3VuIFJheXNdCgogICBRLTMxOiBJJ20gaGF2aW5nIHRyb3VibGUgdXNpbmcgeDExdm5jIHdpdGggbXkgU3VuIFJheSBzZXNzaW9uLgoKICAgVGhlIFN1biBSYXkgdGVjaG5vbG9neSBpcyBhIGJpdCBsaWtlICJWTkMgZG9uZSBpbiBoYXJkd2FyZSIgKHRoZSBTdW4KICAgUmF5IHRlcm1pbmFsIGRldmljZSwgRFRVLCBwbGF5aW5nIHRoZSByb2xlIG9mIHRoZSB2bmN2aWV3ZXIuKQogICBDb21wbGV0ZWx5IGluZGVwZW5kZW50IG9mIHRoYXQsIHRoZSBTdW5SYXkgdXNlcidzIHNlc3Npb24gaXMgc3RpbGwgYW4KICAgWCBzZXJ2ZXIgdGhhdCBzcGVha3MgdGhlIFgxMSBwcm90b2NvbCBhbmQgc28geDExdm5jIHNpbXBseSB0YWxrcyB0bwogICB0aGUgWCBzZXJ2ZXIgcGFydCB0byBleHBvcnQgdGhlIFN1blJheSBkZXNrdG9wIHRvIGFueSBwbGFjZSBpbiB0aGUKICAgd29ybGQgKGkuZS4gbm90IG9ubHkgdG8gYSBTdW4gUmF5IHRlcm1pbmFsIGRldmljZSksIGNyZWF0aW5nIGEgc29ydCBvZgogICAiU29mdCBSYXkiLiBQbGVhc2Ugc2VlIHRoaXMgZGlzY3Vzc2lvbiBvZiBTdW4gUmF5IGlzc3VlcyBmb3Igc29sdXRpb25zCiAgIHRvIHByb2JsZW1zLgoKICAgQWxzbyBzZWUgdGhlIFN1biBSYXkgUmVtb3RlIENvbnRyb2wgVG9vbGtpdCB0aGF0IHVzZXMgeDExdm5jLgoKICAgW1JlbW90ZSBDb250cm9sXQoKICAgUS0zMjogSG93IGRvIEkgc3RvcCB4MTF2bmMgb25jZSBpdCBpcyBydW5uaW5nIGluIHRoZSBiYWNrZ3JvdW5kPwoKICAgQXMgb2YgRGVjLzIwMDQgdGhlcmUgaXMgYSByZW1vdGUgY29udHJvbCBmZWF0dXJlLiBJdCBjYW4gY2hhbmdlIGEgaHVnZQogICBudW1iZXIgb2YgcGFyYW1ldGVycyBvbiB0aGUgZmx5OiBzZWUgdGhlIC1yZW1vdGUgYW5kIC1xdWVyeSBvcHRpb25zLgogICBUbyBzaHV0IGRvd24gdGhlIHJ1bm5pbmcgeDExdm5jIHNlcnZlciBqdXN0IHR5cGUgIngxMXZuYyAtUiBzdG9wIi4gVG8KICAgZGlzY29ubmVjdCBhbGwgY2xpZW50cyBkbyAieDExdm5jIC1SIGRpc2Nvbm5lY3Q6YWxsIiwgZXRjLgoKICAgSWYgdGhlIC1mb3JldmVyIG9wdGlvbiBoYXMgbm90IGJlZW4gc3VwcGxpZWQsIHgxMXZuYyB3aWxsCiAgIGF1dG9tYXRpY2FsbHkgZXhpdCBhZnRlciB0aGUgZmlyc3QgY2xpZW50IGRpc2Nvbm5lY3RzLiBJbiBnZW5lcmFsIGlmCiAgIHlvdSBjYW5ub3QgdXNlIHRoZSByZW1vdGUgY29udHJvbCwgdGhlbiB5b3Ugd2lsbCBoYXZlIHRvIGtpbGwgdGhlCiAgIHgxMXZuYyBwcm9jZXNzIFRoaXMgY2FuIGJlIGRvbmUgdmlhOiAia2lsbCBOTk5OTiIgKHdoZXJlIE5OTk5OIGlzIHRoZQogICB4MTF2bmMgcHJvY2VzcyBpZCBudW1iZXIgZm91bmQgZnJvbSBwcygxKSksIG9yICJwa2lsbCB4MTF2bmMiLCBvcgogICAia2lsbGFsbCB4MTF2bmMiIChMaW51eCBvbmx5LikKCiAgIElmIHlvdSBoYXZlIG5vdCBwdXQgeDExdm5jIGluIHRoZSBiYWNrZ3JvdW5kIHZpYSB0aGUgLWJnIG9wdGlvbiBvcgogICBzaGVsbCAmIG9wZXJhdG9yLCB0aGVuIHNpbXBseSBwcmVzcyBDdHJsLUMgaW4gdGhlIHNoZWxsIHdoZXJlIHgxMXZuYwogICBpcyBydW5uaW5nIHRvIHN0b3AgaXQuCgogICBQb3RlbnRpYWwgR290Y2hhOiBJZiBzb21laG93IHlvdXIgS2V5cHJlc3Mgb2YgQ3RybC1DIHdlbnQgdGhyb3VnaAogICB4MTF2bmMgdG8gdGhlIFhzZXJ2ZXIgdGhhdCB0aGVuIGRlbGl2ZXJlZCBpdCB0byB4MTF2bmMgaXQgaXMgcG9zc2libGUKICAgb25lIG9yIGJvdGggb2YgdGhlIEN0cmwgb3IgQyBrZXlzIHdpbGwgYmUgbGVmdCBzdHVjayBpbiB0aGUgcHJlc3NlZAogICBkb3duIHN0YXRlIGluIHRoZSBYc2VydmVyLiBUYXBwaW5nIHRoZSBzdHVjayBrZXkgKGVpdGhlciB2aWEgYSBuZXcKICAgeDExdm5jIG9yIGF0IHRoZSBwaHlzaWNhbCBjb25zb2xlKSB3aWxsIHJlbGVhc2UgaXQgZnJvbSB0aGUgc3R1Y2sKICAgc3RhdGUuIElmIHRoZSBrZXlib2FyZCBzZWVtcyB0byBiZSBhY3Rpbmcgc3RyYW5nZWx5IGl0IGlzIG9mdGVuIGZpeGVkCiAgIGJ5IHRhcHBpbmcgQ3RybCwgU2hpZnQsIGFuZCBBbHQuIEFsdGVybmF0aXZlbHksIHRoZSAtY2xlYXJfbW9kcyBvcHRpb24KICAgYW5kIC1jbGVhcl9rZXlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byByZWxlYXNlIHByZXNzZWQga2V5cyBhdCBzdGFydHVwCiAgIGFuZCBleGl0LiBUaGUgb3B0aW9uIC1jbGVhcl9hbGwgd2lsbCBhbHNvIHRyeSB0byB1bnNldCBDYXBzX0xvY2ssCiAgIE51bV9Mb2NrLCBldGMuCgoKICAgUS0zMzogQ2FuIEkgY2hhbmdlIHNldHRpbmdzIGluIHgxMXZuYyB3aXRob3V0IGhhdmluZyB0byByZXN0YXJ0IGl0PwogICBDYW4gSSByZW1vdGUgY29udHJvbCBpdD8KCiAgIExvb2sgYXQgdGhlIC1yZW1vdGUgKGFuIGFsaWFzIGlzIC1SKSBhbmQgLXF1ZXJ5IChhbiBhbGlhcyBpcyAtUSkKICAgb3B0aW9ucyBhZGRlZCBpbiBEZWMvMjAwNC4gVGhleSBhbGxvdyBuZWFybHkgZXZlcnl0aGluZyB0byBiZSBjaGFuZ2VkCiAgIGR5bmFtaWNhbGx5IGFuZCBzZXR0aW5ncyB0byBiZSBxdWVyaWVkLiBFeGFtcGxlczogIngxMXZuYyAtUiBzaGFyZWQiLAogICAieDExdm5jIC1SIGZvcmV2ZXIiLCAieDExdm5jIC1SIHNjYWxlOjMvNCIsICJ4MTF2bmMgLVEgbW9kdHdlYWsiLAogICAieDExdm5jIC1SIHN0b3AiLCAieDExdm5jIC1SIGRpc2Nvbm5lY3Q6YWxsIiwgZXRjLi4KCiAgIFRoZXNlIGNvbW1hbmRzIGRvIG5vdCBzdGFydCBhIHgxMXZuYyBzZXJ2ZXIsIGJ1dCByYXRoZXIgY29tbXVuaWNhdGUKICAgd2l0aCBvbmUgdGhhdCBpcyBhbHJlYWR5IHJ1bm5pbmcuIFRoZSBYIGRpc3BsYXkgKFgxMVZOQ19SRU1PVEUKICAgcHJvcGVydHkpIGlzIHVzZWQgYXMgdGhlIGNvbW11bmljYXRpb24gY2hhbm5lbCwgc28gdGhlIFggcGVybWlzc2lvbnMKICAgYW5kIERJU1BMQVkgbXVzdCBiZSBzZXQgdXAgY29ycmVjdGx5IGZvciBjb21tdW5pY2F0aW9uIHRvIGJlIHBvc3NpYmxlLgoKICAgVGhlcmUgaXMgYWxzbyBhIHNpbXBsZSBUY2wvVGsgZ3VpIGJhc2VkIG9uIHRoaXMgcmVtb3RlIGNvbnRyb2wKICAgbWVjaGFuaXNtLiBTZWUgdGhlIC1ndWkgb3B0aW9uIGZvciBtb3JlIGluZm8uIFlvdSB3aWxsIG5lZWQgdG8gaGF2ZQogICBUY2wvVGsgKGkuZS4gL3Vzci9iaW4vd2lzaCkgaW5zdGFsbGVkIGZvciBpdCB0byB3b3JrLiBJdCBjYW4gYWxzbyBydW4KICAgaW4gdGhlIHN5c3RlbSB0cmF5OiAiLWd1aSB0cmF5IiBvciBhcyBhIHN0YW5kYWxvbmUgc21hbGwgaWNvbiB3aW5kb3c6CiAgICItZ3VpIGljb24iLiBVc2UgIi1ndWkgdHJheT1zZXRwYXNzIiBmb3IgYSBuYWl2ZSB1c2VyICJTaGFyZSBNeQogICBEZXNrdG9wIiBtb2RlLgoKICAgW1NlY3VyaXR5IGFuZCBQZXJtaXNzaW9uc10KCiAgIFEtMzQ6IEhvdyBkbyBJIGNyZWF0ZSBhIFZOQyBwYXNzd29yZCBmb3IgdXNlIHdpdGggeDExdm5jPwoKICAgWW91IG1heSBhbHJlYWR5IGhhdmUgb25lIGluICRIT01FLy52bmMvcGFzc3dkIGlmIHlvdSBoYXZlIHVzZWQsIHNheSwKICAgdGhlIHZuY3NlcnZlciBwcm9ncmFtIGZyb20gdGhlIHJlZ3VsYXIgUmVhbFZOQyBvciBUaWdodFZOQyBwYWNrYWdlcwogICAoaS5lLiBsYXVuY2hpbmcgdGhlIFh2bmMgc2VydmVyLikgT3RoZXJ3aXNlLCB5b3UgY291bGQgdXNlIHRoZQogICB2bmNwYXNzd2QoMSkgcHJvZ3JhbSBmcm9tIHRob3NlIHBhY2thZ2VzLgoKICAgQXMgb2YgSnVuLzIwMDQgeDExdm5jIHN1cHBvcnRzIHRoZSAtc3RvcmVwYXNzd2QgInBhc3MiICJmaWxlIiBvcHRpb24sCiAgIHdoaWNoIGlzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgb2Ygc3RvcmVwYXNzd2QuIEJlIHN1cmUgdG8gcXVvdGUgdGhlCiAgICJwYXNzIiBpZiBpdCBjb250YWlucyBzaGVsbCBtZXRhIGNoYXJhY3RlcnMsIHNwYWNlcywgZXRjLiBFeGFtcGxlOgogIHgxMXZuYyAtc3RvcmVwYXNzd2QgJ3N3b3JkKmZpc2gnICRIT01FL215dm5jcGFzc3dkCgogICBZb3UgdGhlbiB1c2UgdGhlIHBhc3N3b3JkIHZpYSB0aGUgeDExdm5jIG9wdGlvbjogIi1yZmJhdXRoCiAgICRIT01FL215dm5jcGFzc3dkIgoKICAgQXMgb2YgSmFuLzIwMDYgaWYgeW91IGRvIG5vdCBzdXBwbHkgYW55IGFyZ3VtZW50czoKICB4MTF2bmMgLXN0b3JlcGFzc3dkCgogICB5b3Ugd2lsbCBiZSBwcm9tcHRlZCBmb3IgYSBwYXNzd29yZCB0byBzYXZlIHRvIH4vLnZuYy9wYXNzd2QgKHlvdXIKICAga2V5c3Ryb2tlcyB3aGVuIGVudGVyaW5nIHRoZSBwYXNzd29yZCB3aWxsIG5vdCBiZSBlY2hvZWQgdG8gdGhlCiAgIHNjcmVlbi4pIElmIHlvdSBzdXBwbHkgb25lIGFyZ3VtZW50LCBlLmcuICJ4MTF2bmMgLXN0b3JlcGFzc3dkCiAgIH4vLm15cGFzcyIsIHRoZSBwYXNzd29yZCB5b3UgYXJlIHByb21wdGVkIGZvciB3aWxsIGJlIHN0b3JlZCBpbiB0aGF0CiAgIGZpbGUuCgogICB4MTF2bmMgYWxzbyBoYXMgdGhlIC1wYXNzd2RmaWxlIGFuZCAtcGFzc3dkLy12aWV3cGFzc3dkIHBsYWluIHRleHQKICAgKGkuZS4gbm90IG9ic2N1cmVkIGxpa2UgdGhlIC1yZmJhdXRoIFZOQyBwYXNzd29yZHMpIHBhc3N3b3JkIG9wdGlvbnMuCgogICBZb3UgY2FuIHVzZSB0aGUgLXVzZXB3IG9wdGlvbiB0byBhdXRvbWF0aWNhbGx5IHVzZSBhbnkgcGFzc3dvcmQgZmlsZQogICB5b3UgaGF2ZSBpbiB+Ly52bmMvcGFzc3dkIG9yIH4vLnZuYy9wYXNzd2RmaWxlICh0aGUgbGF0dGVyIGlzIHVzZWQKICAgd2l0aCB0aGUgLXBhc3N3ZGZpbGUgb3B0aW9uLikKCiAgeDExdm5jIC11c2VwdyAtZGlzcGxheSA6MCAuLi4KCiAgIElmIG5laXRoZXIgZmlsZSBleGlzdHMgeW91IGFyZSBwcm9tcHRlZCB0byBzdG9yZSBhIHBhc3N3b3JkIGluCiAgIH4vLnZuYy9wYXNzd2QuIElmIGEgcGFzc3dvcmQgZmlsZSBjYW5ub3QgYmUgZm91bmQgb3IgY3JlYXRlZCB4MTF2bmMKICAgZXhpdHMgaW1tZWRpYXRlbHkuIEFuIGFkbWluIG1heSB3YW50IHRvIHNldCBpdCB1cCB0aGlzIHdheSBmb3IgdXNlcnMKICAgd2hvIGRvIG5vdCBrbm93IGJldHRlci4KCgogICBRLTM1OiBDYW4gSSBtYWtlIGl0IHNvIC1zdG9yZXBhc3N3ZCBkb2Vzbid0IHNob3cgbXkgcGFzc3dvcmQgb24gdGhlCiAgIHNjcmVlbj8KCiAgIFlvdSBjYW4gdXNlIHRoZSB2bmNwYXNzd2QgcHJvZ3JhbSBmcm9tIFJlYWxWTkMgb3IgVGlnaHRWTkMgbWVudGlvbmVkCiAgIGFib3ZlLiBBcyBvZiBKYW4vMjAwNiB0aGUgLXN0b3JlcGFzc3dkIG9wdGlvbiB3aXRob3V0IGFueSBhcmd1bWVudHMKICAgd2lsbCBub3QgZWNobyB5b3VyIHBhc3N3b3JkIGFzIHlvdSB0eXBlIGl0IGFuZCBzYXZlIHRoZSBmaWxlIHRvCiAgIH4vLnZuYy9wYXNzd2Q6CiAgIyB4MTF2bmMgLXN0b3JlcGFzc3dkCiAgRW50ZXIgVk5DIHBhc3N3b3JkOgogIFZlcmlmeSBwYXNzd29yZDoKICBXcml0ZSBwYXNzd29yZCB0byAvaG9tZS9teW5hbWUvLnZuYy9wYXNzd2Q/ICBbeV0vbgogIFBhc3N3b3JkIHdyaXR0ZW4gdG86IC9ob21lL215bmFtZS8udm5jL3Bhc3N3ZAoKICAgWW91IGNhbiBhbHNvIGdpdmUgaXQgYW4gYWx0ZXJuYXRlIGZpbGVuYW1lLCBlLmcuICJ4MTF2bmMgLXN0b3JlcGFzc3dkCiAgIH4vLm15cGFzcyIKCgogICBRLTM2OiBDYW4gSSBoYXZlIHR3byBwYXNzd29yZHMgZm9yIFZOQyB2aWV3ZXJzLCBvbmUgZm9yIGZ1bGwgYWNjZXNzCiAgIGFuZCB0aGUgb3RoZXIgZm9yIHZpZXctb25seSBhY2Nlc3MgdG8gdGhlIGRpc3BsYXk/CgogICBZZXMsIGFzIG9mIE1heS8yMDA0IHRoZXJlIGlzIHRoZSAtdmlld3Bhc3N3ZCBvcHRpb24gdG8gc3VwcGx5IHRoZQogICB2aWV3LW9ubHkgcGFzc3dvcmQuIE5vdGUgdGhlIGZ1bGwtYWNjZXNzIHBhc3N3b3JkIG9wdGlvbiAtcGFzc3dkIG11c3QKICAgYmUgc3VwcGxpZWQgYXQgdGhlIHNhbWUgdGltZS4gRS5nLjogLXBhc3N3ZCBzd29yZCAtdmlld3Bhc3N3ZCBmaXNoLgoKICAgVG8gYXZvaWQgc3BlY2lmeWluZyB0aGUgcGFzc3dvcmRzIG9uIHRoZSBjb21tYW5kIGxpbmUgKHdoZXJlIHRoZXkKICAgY291bGQgYmUgb2JzZXJ2ZWQgdmlhIHRoZSBwcygxKSBjb21tYW5kIGJ5IGFueSB1c2VyKSB5b3UgY2FuIHVzZSB0aGUKICAgLXBhc3N3ZGZpbGUgb3B0aW9uIHRvIHNwZWNpZnkgYSBmaWxlIGNvbnRhaW5pbmcgcGxhaW4gdGV4dCBwYXNzd29yZHMuCiAgIFByZXN1bWFibHkgdGhpcyBmaWxlIGlzIHJlYWRhYmxlIG9ubHkgYnkgeW91LCBhbmQgaWRlYWxseSBpdCBpcwogICBsb2NhdGVkIG9uIHRoZSBtYWNoaW5lIHgxMXZuYyBpcyBydW4gb24gKHRvIGF2b2lkIGJlaW5nIHNub29wZWQgb24KICAgb3ZlciB0aGUgbmV0d29yay4pIFRoZSBmaXJzdCBsaW5lIG9mIHRoaXMgZmlsZSBpcyB0aGUgZnVsbC1hY2Nlc3MKICAgcGFzc3dvcmQuIElmIHRoZXJlIGlzIGEgc2Vjb25kIGxpbmUgaW4gdGhlIGZpbGUgYW5kIGl0IGlzIG5vbi1ibGFuaywKICAgaXQgaXMgdGFrZW4gYXMgdGhlIHZpZXctb25seSBwYXNzd29yZC4gKHVzZSAiX19FTVBUWV9fIiB0byBzdXBwbHkgYW4KICAgZW1wdHkgb25lLikKCiAgIFZpZXctb25seSBwYXNzd29yZHMgY3VycmVudGx5IGRvIG5vdCB3b3JrIGZvciB0aGUgLXJmYmF1dGggcGFzc3dvcmQKICAgb3B0aW9uIChzdGFuZGFyZCBWTkMgcGFzc3dvcmQgc3RvcmluZyBtZWNoYW5pc20uKSBGV0lXLCBub3RlIHRoYXQKICAgYWx0aG91Z2ggdGhlIG91dHB1dCAodXN1YWxseSBwbGFjZWQgaW4gJEhPTUUvLnZuYy9wYXNzd2QpIGJ5IHRoZQogICB2bmNwYXNzd2Qgb3Igc3RvcmVwYXNzd2QgcHJvZ3JhbXMgKG9yIGZyb20geDExdm5jIC1zdG9yZXBhc3N3ZCkgbG9va3MKICAgZW5jcnlwdGVkIHRoZXkgYXJlIHJlYWxseSBqdXN0IG9ic2N1cmVkIHRvIGF2b2lkICJjYXN1YWwiIHBhc3N3b3JkCiAgIHN0ZWFsaW5nLiBJdCB0YWtlcyBhbG1vc3Qgbm8gc2tpbGwgdG8gZmlndXJlIG91dCBob3cgdG8gZXh0cmFjdCB0aGUKICAgcGxhaW4gdGV4dCBwYXNzd29yZHMgZnJvbSAkSE9NRS8udm5jL3Bhc3N3ZCBzaW5jZSBpdCBpcyB2ZXJ5CiAgIHN0cmFpZ2h0LWZvcndhcmQgdG8gd29yayBvdXQgd2hhdCB0byBkbyBmcm9tIHRoZSBWTkMgc291cmNlIGNvZGUuCgoKICAgUS0zNzogQ2FuIEkgaGF2ZSBhcyBtYW55IGZ1bGwtYWNjZXNzIGFuZCB2aWV3LW9ubHkgcGFzc3dvcmRzIGFzIEkKICAgbGlrZT8KCiAgIFllcywgYXMgb2YgSmFuLzIwMDYgaW4gdGhlIGxpYnZuY3NlcnZlciBDVlMgdGhlIC1wYXNzd2RmaWxlIG9wdGlvbiBoYXMKICAgYmVlbiBleHRlbmRlZCB0byBoYW5kbGUgYXMgbWFueSBwYXNzd29yZHMgYXMgeW91IGxpa2UuIFlvdSBwdXQgdGhlCiAgIHZpZXctb25seSBwYXNzd29yZHMgYWZ0ZXIgYSBsaW5lIF9fQkVHSU5fVklFV09OTFlfXy4KCiAgIFlvdSBjYW4gYWxzbyBlYXNpbHkgYW5ub3RhdGUgYW5kIGNvbW1lbnQgb3V0IHBhc3N3b3JkcyBpbiB0aGUgZmlsZS4KICAgWW91IGNhbiBoYXZlIHgxMXZuYyByZS1yZWFkIHRoZSBmaWxlIGR5bmFtaWNhbGx5IHdoZW4gaXQgaXMgbW9kaWZpZWQuCgoKICAgUS0zODogRG9lcyB4MTF2bmMgc3VwcG9ydCBVbml4IHVzZXJuYW1lcyBhbmQgcGFzc3dvcmRzPyBDYW4gSSBmdXJ0aGVyCiAgIGxpbWl0IHRoZSBzZXQgb2YgVW5peCB1c2VybmFtZXMgd2hvIGNhbiBjb25uZWN0IHRvIHRoZSBWTkMgZGVza3RvcD8KICAgVXBkYXRlOiBhcyBvZiBGZWIvMjAwNiB4MTF2bmMgaGFzIHRoZSAtdW5peHB3IG9wdGlvbiB0aGF0IGRvZXMgdGhpcwogICBvdXRzaWRlIG9mIHRoZSBWTkMgcHJvdG9jb2wgYW5kIGxpYnZuY3NlcnZlci4gVGhlIHN0YW5kYXJkIHN1KDEpCiAgIHByb2dyYW0gaXMgdXNlZCB0byB2YWxpZGF0ZSB0aGUgdXNlcidzIHBhc3N3b3JkLiBBIGZhbWlsaWFyICJsb2dpbjoiCiAgIGFuZCAiUGFzc3dvcmQ6IiBkaWFsb2cgaXMgcHJlc2VudGVkIHRvIHRoZSB1c2VyIG9uIGEgYmxhY2sgc2NyZWVuCiAgIGluc2lkZSB0aGUgdm5jdmlld2VyLiBUaGUgY29ubmVjdGlvbiBpcyBkcm9wcGVkIGlmIHRoZSB1c2VyIGZhaWxzIHRvCiAgIHN1cHBseSB0aGUgY29ycmVjdCBwYXNzd29yZCBpbiAzIHRyaWVzIG9yIGRvZXMgbm90IHNlbmQgb25lIGJlZm9yZSBhCiAgIDI1IHNlY29uZCB0aW1lb3V0LiBFeGlzdGluZyBjbGllbnRzIGFyZSB2aWV3LW9ubHkgZHVyaW5nIHRoaXMgcGVyaW9kLgogICBBIGxpc3Qgb2YgYWxsb3dlZCBVbml4IHVzZXJuYW1lcyBtYXkgYWxzbyBiZSBzdXBwbGllZCBhbG9uZyB3aXRoCiAgIHBlci11c2VyIHNldHRpbmdzLgoKICAgVGhlcmUgaXMgYWxzbyB0aGUgLXVuaXhwd19uaXMgb3B0aW9uIGZvciBub24tc2hhZG93LXBhc3N3b3JkCiAgICh0eXBpY2FsbHkgTklTIGVudmlyb25tZW50cywgaGVuY2UgdGhlIG5hbWUpIHN5c3RlbXMgd2hlcmUgdGhlCiAgIHRyYWRpdGlvbmFsIGdldHB3bmFtKCkgYW5kIGNyeXB0KCkgZnVuY3Rpb25zIGFyZSB1c2VkIGluc3RlYWQgb2YKICAgc3UoMSkuIFRoZSBlbmNyeXB0ZWQgdXNlciBwYXNzd29yZHMgbXVzdCBiZSBhY2Nlc3NpYmxlIHRvIHRoZSB1c2VyCiAgIHJ1bm5pbmcgeDExdm5jIGluIC11bml4cHdfbmlzIG1vZGUsIG90aGVyd2lzZSB0aGUgbG9naW5zIHdpbGwgYWx3YXlzCiAgIGZhaWwgZXZlbiB3aGVuIHRoZSBjb3JyZWN0IHBhc3N3b3JkIGlzIHN1cHBsaWVkLiBTZWUgeXBjYXQoMSkgYW5kCiAgIHNoYWRvdyg1KS4KCiAgIFR3byBzZXR0aW5ncyBhcmUgZW5mb3JjZWQgaW4gdGhlIC11bml4cHcgYW5kIC11bml4cHdfbmlzIG1vZGVzIHRvCiAgIHByb3ZpZGUgZXh0cmEgc2VjdXJpdHk6IHRoZSAxKSAtbG9jYWxob3N0IGFuZCAyKSAtc3R1bm5lbCBvciAtc3NsCiAgIG9wdGlvbnMuIFdpdGhvdXQgdGhlc2Ugb25lIG1pZ2h0IHNlbmQgdGhlIFVuaXggdXNlcm5hbWUgYW5kIHBhc3N3b3JkCiAgIGRhdGEgaW4gY2xlYXIgdGV4dCBvdmVyIHRoZSBuZXR3b3JrIHdoaWNoIGlzIGEgdmVyeSBiYWQgaWRlYS4gVGhleSBjYW4KICAgYmUgcmVsYXhlZCBpZiB5b3Ugd2FudCB0byBwcm92aWRlIGVuY3J5cHRpb24gb3RoZXIgdGhhbiBzdHVubmVsIG9yCiAgIC1zc2wgKHRoZSBjb25zdHJhaW50IGlzIGF1dG9tYXRpY2FsbHkgcmVsYXhlZCBpZiBTU0hfQ09OTkVDVElPTiBpcyBzZXQKICAgYW5kIGluZGljYXRlcyB5b3UgaGF2ZSBzc2gtZWQgaW4sIGhvd2V2ZXIgdGhlIC1sb2NhbGhvc3QgcmVxdWlyZW1lbnQKICAgaXMgc3RpbGwgZW5mb3JjZWQuKQoKICAgVGhlIHR3byAtdW5peHB3IG1vZGVzIGhhdmUgYmVlbiB0ZXN0ZWQgb24gTGludXgsIFNvbGFyaXMsIE1hYyBPUyBYLAogICBIUC1VWCwgQUlYLCBUcnU2NCwgRnJlZUJTRCwgT3BlbkJTRCwgYW5kIE5ldEJTRC4gQWRkaXRpb25hbCB0ZXN0aW5nIGlzCiAgIGFwcHJlY2lhdGVkLiBGb3IgdGhlIGxhc3QgNCBpdCBhcHBlYXJzIHRoYXQgc3UoMSkgd2lsbCBub3QgcHJvbXB0IGZvcgogICBhIHBhc3N3b3JkIGlmIHN1LWluZyB0byBvbmVzZWxmLiBTaW5jZSB4MTF2bmMgcmVxdWlyZXMgYSBwYXNzd29yZAogICBwcm9tcHQgZnJvbSBzdSwgeDExdm5jIGZvcmNlcyB0aG9zZSBsb2dpbnMgdG8gZmFpbCBldmVuIHdoZW4gdGhlCiAgIGNvcnJlY3QgcGFzc3dvcmQgaXMgc3VwcGxpZWQuIE9uICpCU0QgaXQgYXBwZWFycyB0aGlzIGNhbiBiZSBjb3JyZWN0ZWQKICAgYnkgcmVtb3ZpbmcgdGhlIHBhbV9zZWxmLnNvIGVudHJ5IGluIC9ldGMvcGFtLmQvc3UuCgoKICAgUHJldmlvdXMgb2xkZXIgZGlzY3Vzc2lvbiAocHJpb3IgdG8gdGhlIC11bml4cHcgb3B0aW9uKToKCiAgIFVudGlsIHRoZSBWTkMgcHJvdG9jb2wgYW5kIGxpYnZuY3NlcnZlciBzdXBwb3J0IHRoaXMgdGhpbmdzIHdpbGwgYmUKICAgYXBwcm94aW1hdGUgYXQgYmVzdC4KCiAgIE9uZSBhcHByb3hpbWF0ZSBtZXRob2QgaW52b2x2ZXMgc3RhcnRpbmcgeDExdm5jIHdpdGggdGhlIC1sb2NhbGhvc3QKICAgb3B0aW9uLiBUaGlzIGJhc2ljYWxseSByZXF1aXJlcyB0aGUgdmlld2VyIHVzZXIgdG8gbG9nIGludG8gdGhlCiAgIHdvcmtzdGF0aW9uIHdoZXJlIHgxMXZuYyBpcyBydW5uaW5nIHZpYSB0aGVpciBVbml4IHVzZXJuYW1lIGFuZAogICBwYXNzd29yZCwgYW5kIHRoZW4gc29tZWhvdyBzZXQgdXAgYSBwb3J0IHJlZGlyZWN0aW9uIG9mIGhpcyB2bmN2aWV3ZXIKICAgY29ubmVjdGlvbiB0byBtYWtlIGl0IGFwcGVhciB0byBlbWFuYXRlIGZyb20gdGhlIGxvY2FsIG1hY2hpbmUuIEFzCiAgIGRpc2N1c3NlZCBhYm92ZSwgc3NoIGlzIHVzZWZ1bCBmb3IgdGhpczogInNzaCAtTCA1OTAwOmxvY2FsaG9zdDo1OTAwCiAgIHVzZXJAaG9zdG5hbWUgLi4uIiBTZWUgdGhlIHNzaCB3cmFwcGVyIHNjcmlwdHMgbWVudGlvbmVkIGVsc2V3aGVyZSBvbgogICB0aGlzIHBhZ2UuIHN0dW5uZWwgZG9lcyB0aGlzIGFzIHdlbGwuCgogICBPZiBjb3Vyc2UgYSBtYWxpY2lvdXMgdXNlciBjb3VsZCBhbGxvdyBvdGhlciB1c2VycyB0byBnZXQgaW4gdGhyb3VnaAogICBoaXMgY2hhbm5lbCwgYnV0IHRoYXQgaXMgYSBwcm9ibGVtIHdpdGggZXZlcnkgbWV0aG9kLiBBbm90aGVyIHRoaW5nIHRvCiAgIHdhdGNoIG91dCBmb3IgaXMgYSBtYWxpY2lvdXMgdXNlciBvbiB0aGUgdmlld2VyIHNpZGUgKHdoZXJlIHNzaCBpcwogICBydW5uaW5nKSB0cnlpbmcgdG8gc25lYWsgaW4gdGhyb3VnaCB0aGUgc3NoIHBvcnQgcmVkaXJlY3Rpb24gdGhlcmUuCgogICBSZWdhcmRpbmcgbGltaXRpbmcgdGhlIHNldCBvZiBVbml4IHVzZXJuYW1lcyB3aG8gY2FuIGNvbm5lY3QsIHRoZQogICB0cmFkaXRpb25hbCB3YXkgd291bGQgYmUgdG8gZnVydGhlciByZXF1aXJlIGEgVk5DIHBhc3N3b3JkIHRvIHN1cHBsaWVkCiAgICgtcmZiYXV0aCwgLXBhc3N3ZCwgZXRjKSBhbmQgb25seSB0ZWxsIHRoZSBwZW9wbGUgYWxsb3dlZCBpbiB3aGF0IHRoZQogICBWTkMgcGFzc3dvcmQgaXMuIEEgc2NoZW1lIHRoYXQgYXZvaWRzIGEgc2Vjb25kIHBhc3N3b3JkIGludm9sdmVzIHVzaW5nCiAgIHRoZSAtYWNjZXB0IG9wdGlvbiB0aGF0IHJ1bnMgYSBwcm9ncmFtIHRvIGV4YW1pbmUgdGhlIGNvbm5lY3Rpb24KICAgaW5mb3JtYXRpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIHVzZXIgaXMgY29ubmVjdGluZyBmcm9tIHRoZSBsb2NhbAogICBtYWNoaW5lLiBUaGF0IG1heSBiZSBkaWZmaWN1bHQgdG8gZG8sIGJ1dCwgZm9yIGV4YW1wbGUsIHRoZSBwcm9ncmFtCiAgIGNvdWxkIHVzZSB0aGUgaWRlbnQgc2VydmljZSBvbiB0aGUgbG9jYWwgbWFjaGluZSAobm9ybWFsbHkgaWRlbnQKICAgc2hvdWxkIG5vdCBiZSB0cnVzdGVkIG92ZXIgdGhlIG5ldHdvcmssIGJ1dCBvbiB0aGUgbG9jYWwgbWFjaGluZSBpdAogICBzaG91bGQgYmUgYWNjdXJhdGU6IG90aGVyd2lzZSByb290IGhhcyBiZWVuIGNvbXByb21pc2VkIGFuZCBzbyB0aGVyZQogICBhcmUgbW9yZSBzZXJpb3VzIHByb2JsZW1zISBVbmZvcnR1bmF0ZWx5IHJlY2VudCBMaW51eCBkaXN0cm9zIHNlZW0gdG8KICAgcHJvdmlkZSBhIHJhbmRvbSBzdHJpbmcgKE1ENSBoYXNoPykgaW5zdGVhZCBvZiB0aGUgdXNlcm5hbWUuKSBBbgogICBleGFtcGxlIHNjcmlwdCBwYXNzZWQgaW4gdmlhIC1hY2NlcHQgc2NyaXB0bmFtZSB0aGF0IGRlZHVjZXMgdGhlIFVuaXgKICAgdXNlcm5hbWUgYW5kIGxpbWl0cyB3aG8gY2FuIGJlIGFjY2VwdGVkIG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2UKICAgdGhpczoKIyEvYmluL3NoCmlmIFsgIiRSRkJfQ0xJRU5UX0lQIiAhPSAiMTI3LjAuMC4xIiAtbyAiJFJGQl9TRVJWRVJfSVAiICE9ICIxMjcuMC4wLjEiIF07IHRoZW4KICAgICAgICBleGl0IDEgICMgc29tZXRoaW5nIGZpc2h5Li4uIHJlamVjdCBpdC4KZmkKdXNlcj1gZWNobyAiJFJGQl9DTElFTlRfUE9SVCwgJFJGQl9TRVJWRVJfUE9SVCIgfCBuYyAtdyAxICRSRkJfQ0xJRU5UX0lQIDExMyBcCiAgICAgICAgfCBncmVwICdVU0VSSUQuKlVOSVgnIHwgaGVhZCAtbiAxIHwgc2VkIC1lICdzL1tcciBdLy9nJyB8IGF3ayAtRjogJ3twcmkKbnQgJDR9J2AKCmZvciBva3VzZXIgaW4gZnJlZCBiYXJuZXkgd2lsbWEgYmV0dHkKZG8KICAgICAgICBpZiBbICJYJHVzZXIiID0gIlgkb2t1c2VyIiBdOyB0aGVuCiAgICAgICAgICAgICAgICBleGl0IDAgICMgYWNjZXB0IGl0CiAgICAgICAgZmkKZG9uZQpleGl0IDEgICMgcmVqZWN0IGl0CgogICBGb3IgdGhpcyB0byB3b3JrIHdpdGggc3NoIHBvcnQgcmVkaXJlY3Rpb24sIHRoZSBzc2ggb3B0aW9uCiAgIFVzZVByaXZpbGVnZVNlcGFyYXRpb24gbXVzdCBiZSBlbmFibGVkIG90aGVyd2lzZSB0aGUgdXNlcmlkIHdpbGwKICAgYWx3YXlzIGJlICJyb290Ii4KCiAgIEhlcmUgaXMgYSBzaW1pbGFyIGV4YW1wbGUgYmFzZWQgb24gTGludXggbmV0c3RhdCgxKSBvdXRwdXQ6CiMhL2Jpbi9zaAojCiMgYWNjZXB0X2xvY2FsX25ldHN0YXQ6ICB4MTF2bmMgLWFjY2VwdCBjb21tYW5kIHRvIGFjY2VwdCBhIGxvY2FsCiMgdm5jdmlld2VyIGNvbm5lY3Rpb24gZnJvbSBhY2NlcHRhYmxlIHVzZXJzLiAgTGludXggbmV0c3RhdCAtbnRlIGlzIHVzZWQuCgpQQVRIPS9iaW46L3Vzci9iaW46JFBBVEg7IGV4cG9ydCBQQVRIOyAgIyBzZXQgdG8gZ2V0IHN5c3RlbSB1dGlscwoKYWxsb3dlZD0iYGlkIC11IGZyZWRgIjsgICAgICAgICAgICAgICAgICMgYWRkIG1vcmUgdXNlciBudW1iZXJzIGlmIGRlc2lyZWQuCgojIGNoZWNrIHJlcXVpcmVkIHNldHRpbmdzCm9rPTEKaWYgWyAiWCRhbGxvd2VkIiA9ICJYIiBdOyB0aGVuCiAgICAgICAgb2s9MDsgICAjIHNvbWV0aGluZyB3cm9uZyB3aXRoIGFsbG93ZWQgbGlzdApmaQppZiBbICJYJFJGQl9DTElFTlRfSVAiICE9ICJYMTI3LjAuMC4xIiAtbyAiWCRSRkJfU0VSVkVSX0lQIiAhPSAiWDEyNy4wLjAuMSIgXTsKdGhlbgogICAgICAgIG9rPTA7ICAgIyBjb25uZWN0aW9uIG5vdCBvdmVyIGxvY2FsaG9zdApmaQppZiBbICIkUkZCX0NMSUVOVF9QT1JUIiAtbGUgMCAtbyAiJFJGQl9TRVJWRVJfUE9SVCIgLWxlIDAgXTsgdGhlbgogICAgICAgIG9rPTA7ICAgIyBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0Y3AgcG9ydCBudW1iZXJzCmZpCmlmIFsgIiRvayIgPSAwIF07IHRoZW4KICAgICAgICBlY2hvICIkMDogaW52YWxpZCBzZXR0aW5nOiIgMT4mMgogICAgICAgIGVudiB8IGdyZXAgXlJGQiB8IHNvcnQgMT4mMgogICAgICAgIGV4aXQgMQpmaQoKIyBMaW51eCBuZXRzdGF0IC1udGU6CiMgUHJvdG8gUmVjdi1RIFNlbmQtUSBMb2NhbCBBZGRyZXNzICAgICAgICAgICBGb3JlaWduIEFkZHJlc3MgICAgICAgICBTdGF0ZQogICBVc2VyICAgICAgIElub2RlCiMgMCAgICAgMCAgICAgIDAgICAgICBSRkJfQ0xJRU5UICAgICAgICAgICAgICBSRkJfU0VSVkVSICAgICAgICAgICBFU1RBQkxJU0hFRAogICBubm5uICAgICAgIC4uLi4KIwp1c2VyPWBuZXRzdGF0IC1udGUgfCBncmVwIEVTVEFCTElTSEVEIFwKICAgICAgICB8IGdyZXAgIiAkUkZCX0NMSUVOVF9JUDokUkZCX0NMSUVOVF9QT1JUICAqJFJGQl9TRVJWRVJfSVA6JFJGQl9TRVJWRVJfUApPUlQgImAKCmVjaG8gIm5ldHN0YXQgbWF0Y2g6ICR1c2VyIiAxPiYyCnVzZXI9YGVjaG8gIiR1c2VyIiB8IGhlYWQgLW4gMSB8IHNlZCAtZSAncy9eLipFU1RBQkxJU0hFRC8gLycgfCBhd2sgJ3twcmludCAkMX0KJ2AKCm9rPTAKZm9yIHUgaW4gJGFsbG93ZWQKZG8KICAgICAgICBpZiBbICJYJHVzZXIiID0gIlgkdSIgXTsgdGhlbgogICAgICAgICAgICAgICAgb2s9MQogICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICBmaQpkb25lCgppZiBbICJYJG9rIiA9ICJYMSIgXTsgdGhlbgogICAgICAgIGVjaG8gIiQwOiB1c2VyIGFjY2VwdGVkOiAnJHVzZXInIiAxPiYyCiAgICAgICAgZXhpdCAwCmVsc2UKICAgICAgICBlY2hvICIkMDogdXNlciAnJHVzZXInIGludmFsaWQ6IiAxPiYyCiAgICAgICAgZWNobyAiJDA6IGFsbG93ZWQ6ICRhbGxvd2VkIiAxPiYyCiAgICAgICAgZW52IHwgZ3JlcCBeUkZCIHwgc29ydCAxPiYyCiAgICAgICAgZXhpdCAxCmZpCgoKICAgUS0zOTogQ2FuIEkgc3VwcGx5IGFuIGV4dGVybmFsIHByb2dyYW0gdG8gcHJvdmlkZSBteSBvd24gY3VzdG9tIGxvZ2luCiAgIG1ldGhvZCAoZS5nLiBEeW5hbWljL09uZS10aW1lIHBhc3N3b3JkcyBvciBub24tVW5peCAoTERBUCkgdXNlcm5hbWVzCiAgIGFuZCBwYXNzd29yZHMpPwogICBZZXMsIHRoZXJlIGFyZSBzZXZlcmFsIHBvc3NpYmlsaXRpZXMuIEZvciBiYWNrZ3JvdW5kIHNlZSB0aGUgRkFRIG9uCiAgIHRoZSAtYWNjZXB0IHdoZXJlIGFuIGV4dGVybmFsIHByb2dyYW0gbWF5IGJlIHJ1biB0byBkZWNpZGUgaWYgYSBWTkMKICAgY2xpZW50IHNob3VsZCBiZSBhbGxvd2VkIHRvIHRyeSB0byBjb25uZWN0IGFuZCBsb2cgaW4uIElmIHRoZSBwcm9ncmFtCiAgIChvciBsb2NhbCB1c2VyIHByb21wdGVkIGJ5IGEgcG9wdXApIGFuc3dlcnMgInllcyIsIHRoZW4gLWFjY2VwdAogICBwcm9jZWVkcyB0byB0aGUgbm9ybWFsIFZOQyBhbmQgeDExdm5jIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMsCiAgIG90aGVyd2lzZSB0aGUgY29ubmVjdGlvbiBpcyBkcm9wcGVkLgoKICAgVG8gcHJvdmlkZSBtb3JlIGRpcmVjdCBjb3VwbGluZyB0byB0aGUgVk5DIGNsaWVudCdzIHVzZXJuYW1lIGFuZC9vcgogICBzdXBwbGllZCBwYXNzd29yZCB0aGUgZm9sbG93aW5nIG9wdGlvbnMgd2VyZSBhZGRlZCBpbiBTZXAvMjAwNjoKICAgICAqIC11bml4cHdfY21kIGNvbW1hbmQKICAgICAqIC1wYXNzd2RmaWxlIGNtZDpjb21tYW5kCiAgICAgKiAtcGFzc3dkZmlsZSBjdXN0b206Y29tbWFuZAoKICAgSW4gZWFjaCBjYXNlICJjb21tYW5kIiBpcyBhbiBleHRlcm5hbCBjb21tYW5kIHJ1biBieSB4MTF2bmMuIFlvdQogICBzdXBwbHkgaXQuIEZvciBleGFtcGxlLCBpdCBtYXkgY291cGxlIHRvIHlvdXIgTERBUCBzeXN0ZW0gb3Igb3RoZXIKICAgc2VydmVycyB5b3Ugc2V0IHVwLgoKICAgRm9yIC11bml4cHdfY21kIHRoZSBub3JtYWwgLXVuaXhwdyBMb2dpbjogYW5kIFBhc3N3b3JkOiBwcm9tcHRzIGFyZQogICBzdXBwbGllZCB0byB0aGUgVk5DIHZpZXdlciBhbmQgdGhlIHN0cmluZ3MgdGhlIGNsaWVudCByZXR1cm5zIGFyZSB0aGVuCiAgIHBpcGVkIGludG8gImNvbW1hbmQiIGFzIHRoZSBmaXJzdCB0d28gbGluZXMgb2YgaXRzIHN0YW5kYXJkIGlucHV0LiBJZgogICB0aGUgY29tbWFuZCByZXR1cm5zIHN1Y2Nlc3MsIGkuZS4gZXhpdCgwKSwgdGhlIFZOQyBjbGllbnQgaXMgYWNjZXB0ZWQsCiAgIG90aGVyd2lzZSBpdCBpcyByZWplY3RlZC4KCiAgIEZvciAiLXBhc3N3ZGZpbGUgY21kOmNvbW1hbmQiIHRoZSBjb21tYW5kIGlzIHJ1biBhbmQgaXQgcmV0dXJucyBhCiAgIHBhc3N3b3JkIGxpc3QgKGxpa2UgYSBwYXNzd29yZCBmaWxlLCBzZWUgdGhlIC1wYXNzd2RmaWxlIHJlYWQ6ZmlsZW5hbWUKICAgbW9kZS4pIFBlcmhhcHMgYSBkeW5hbWljLCBvbmUtdGltZSBwYXNzd29yZCBpcyByZXRyaWV2ZWQgZnJvbSBhIHNlcnZlcgogICB0aGlzIHdheS4KCiAgIEZvciAiLXBhc3N3ZGZpbGUgY3VzdG9tOmNvbW1hbmQiIG9uZSBnZXRzIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciB0aGUKICAgVk5DIGNoYWxsZW5nZS1yZXNwb25zZSBkaWFsb2cgd2l0aCB0aGUgVk5DIGNsaWVudC4geDExdm5jIHNlbmRzIG91dCBhCiAgIHN0cmluZyBvZiByYW5kb20gYnl0ZXMgKDE2IGJ5IHRoZSBWTkMgc3BlYykgYW5kIHRoZSBjbGllbnQgcmV0dXJucyB0aGUKICAgc2FtZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSB3YXkgdGhlIHNlcnZlciBjYW4gdmVyaWZ5IG9ubHkgdGhlCiAgIGF1dGhvcml6ZWQgdXNlciBjb3VsZCBoYXZlIGNyZWF0ZWQuIFRoZSBWTkMgcHJvdG9jb2wgc3BlY2lmaWVzIERFUwogICBlbmNyeXB0aW9uIHdpdGggYSBwYXNzd29yZC4gSWYgeW91IGFyZSB3aWxsaW5nIHRvIG1vZGlmeSB0aGUgVk5DCiAgIHZpZXdlcnMsIHlvdSBjYW4gaGF2ZSBpdCBiZSBhbnl0aGluZyB5b3Ugd2FudCwgcGVyaGFwcyBhIGxlc3MKICAgY3JhY2thYmxlIE1ENSBoYXNoIHNjaGVtZSBvciBvbmUtdGltZSBwYWQuIFlvdXIgcHJvZ3JhbSB3aWxsIHJlYWQgZnJvbQogICBpdHMgc3RhbmRhcmQgaW5wdXQgdGhlIHNpemUgb2YgdGhlIGNoYWxsZW5nZS1yZXNwb25zZSBmb2xsb3dlZCBieSBhCiAgIG5ld2xpbmUsIHRoZW4gdGhlIGNoYWxsZW5nZSBieXRlcyBmb2xsb3dlZCBieSB0aGUgcmVzcG9uc2UgYnl0ZXMuIElmCiAgIHlvdXIgY29tbWFuZCB0aGVuIHJldHVybnMgc3VjY2VzcywgaS5lLiBleGl0KDApLCB0aGUgVk5DIGNsaWVudCBpcwogICBhY2NlcHRlZCwgb3RoZXJ3aXNlIGl0IGlzIHJlamVjdGVkLgoKICAgSW4gYWxsIGNhc2VzIHRoZSAiUkZCXyoiIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0IGFzIHVuZGVyCiAgIC1hY2NlcHQuIFRoZXNlIHZhcmlhYmxlcyBjYW4gcHJvdmlkZSB1c2VmdWwgaW5mb3JtYXRpb24gZm9yIHRoZQogICBleHRlcm5hbGx5IHN1cHBsaWVkIHByb2dyYW0gdG8gdXNlLgoKCiAgIFEtNDA6IFdoeSBkb2VzIHgxMXZuYyBleGl0IGFzIHNvb24gYXMgdGhlIFZOQyB2aWV3ZXIgZGlzY29ubmVjdHM/IEFuZAogICB3aHkgZG9lc24ndCBpdCBhbGxvdyBtb3JlIHRoYW4gb25lIFZOQyB2aWV3ZXIgdG8gY29ubmVjdCBhdCB0aGUgc2FtZQogICB0aW1lPwoKICAgVGhlc2UgZGVmYXVsdHMgYXJlIHNpbXBsZSBzYWZldHkgbWVhc3VyZXMgdG8gYXZvaWQgc29tZW9uZSB1bmtub3dpbmdseQogICBsZWF2aW5nIGhpcyBYMTEgZGVza3RvcCBleHBvc2VkICh0byB0aGUgaW50ZXJuZXQsIHNheSkgZm9yIGxvbmcKICAgcGVyaW9kcyBvZiB0aW1lLiBVc2UgdGhlIC1mb3JldmVyIG9wdGlvbiAoYWthIC1tYW55KSB0byBoYXZlIHgxMXZuYwogICB3YWl0IGZvciBtb3JlIGNvbm5lY3Rpb25zIGFmdGVyIHRoZSBmaXJzdCBjbGllbnQgZGlzY29ubmVjdHMuIFVzZSB0aGUKICAgLXNoYXJlZCBvcHRpb24gdG8gaGF2ZSB4MTF2bmMgYWxsb3cgbXVsdGlwbGUgY2xpZW50cyB0byBjb25uZWN0CiAgIHNpbXVsdGFuZW91c2x5LgoKICAgUmVjb21tZW5kZWQgYWRkaXRpb25hbCBzYWZldHkgbWVhc3VyZXMgaW5jbHVkZSB1c2luZyBzc2ggKHNlZSBhYm92ZSksCiAgIHN0dW5uZWwsIC1zc2wsIG9yIGEgVlBOIHRvIGF1dGhlbnRpY2F0ZSBhbmQgZW5jcnlwdCB0aGUgdmlld2VyCiAgIGNvbm5lY3Rpb25zIG9yIHRvIGF0IGxlYXN0IHVzZSB0aGUgLXJmYmF1dGggcGFzc3dkLWZpbGUgb3B0aW9uIHRvIHVzZQogICBWTkMgcGFzc3dvcmQgcHJvdGVjdGlvbiAob3IgLXBhc3N3ZGZpbGUpIEl0IGlzIHVwIHRvIFlPVSB0byBhcHBseQogICB0aGVzZSBzZWN1cml0eSBtZWFzdXJlcywgdGhleSB3aWxsIG5vdCBiZSBkb25lIGZvciB5b3UgYXV0b21hdGljYWxseS4KCgogICBRLTQxOiBDYW4gSSBsaW1pdCB3aGljaCBtYWNoaW5lcyBpbmNvbWluZyBWTkMgY2xpZW50cyBjYW4gY29ubmVjdAogICBmcm9tPwoKICAgWWVzLCBsb29rIGF0IHRoZSAtYWxsb3cgYW5kIC1sb2NhbGhvc3Qgb3B0aW9ucyB0byBsaW1pdCBjb25uZWN0aW9ucyBieQogICBob3N0bmFtZSBvciBJUCBhZGRyZXNzLiBFLmcuCiAgeDExdm5jIC1hbGxvdyAxOTIuMTY4LjAuMSwxOTIuMTY4LjAuMgoKICAgZm9yIHRob3NlIHR3byBob3N0cyBvcgogIHgxMXZuYyAtYWxsb3cgMTkyLjE2OC4wLgoKICAgZm9yIGEgc3VibmV0LiBGb3IgaW5kaXZpZHVhbCBob3N0cyB5b3UgY2FuIHVzZSB0aGUgaG9zdG5hbWUgaW5zdGVhZCBvZgogICB0aGUgSVAgbnVtYmVyLCBlLmcuOiAiLWFsbG93IHNub29weSIsIGFuZCAiLWFsbG93IGRhcmtzdGFyLHdvbWJhdCIuCiAgIE5vdGUgdGhhdCAtbG9jYWxob3N0IGFjaGlldmVzIHRoZSBzYW1lIHRoaW5nIGFzICItYWxsb3cgMTI3LjAuMC4xIgoKICAgRm9yIG1vcmUgY29udHJvbCwgYnVpbGQgbGlidm5jc2VydmVyIHdpdGggbGlid3JhcCBzdXBwb3J0CiAgICh0Y3Bfd3JhcHBlcnMpIGFuZCB0aGVuIHVzZSAvZXRjL2hvc3RzLmFsbG93IFNlZSBob3N0c19hY2Nlc3MoNSkgZm9yCiAgIGNvbXBsZXRlIGRldGFpbHMuCgoKICAgUS00MjogSG93IGRvIEkgYnVpbGQgeDExdm5jL2xpYnZuY3NlcnZlciB3aXRoIGxpYndyYXAgKHRjcF93cmFwcGVycykKICAgc3VwcG9ydD8KCiAgIEhlcmUgaXMgb25lIHdheSB0byBwYXNzIHRoaXMgaW5mb3JtYXRpb24gdG8gdGhlIGNvbmZpZ3VyZSBzY3JpcHQ6CiAgZW52IENQUEZMQUdTPS1EVVNFX0xJQldSQVAgTERGTEFHUz0tbHdyYXAgLi9jb25maWd1cmUKCiAgIHRoZW4gcnVuIG1ha2UgYXMgdXN1YWwuIFRoaXMgcmVxdWlyZXMgbGlid3JhcCBhbmQgaXRzIGRldmVsb3BtZW50CiAgIHBhY2thZ2UgKHRjcGQuaCkgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBidWlsZCBtYWNoaW5lLiBJZiBhZGRpdGlvbmFsCiAgIENQUEZMQUdTIG9yIExERkxBR1Mgb3B0aW9ucyBhcmUgbmVlZGVkIHN1cHBseSB0aGVtIGFzIHdlbGwgdXNpbmcKICAgcXVvdGVzLgoKICAgVGhlIHJlc3VsdGluZyB4MTF2bmMgdGhlbiB1c2VzIGxpYndyYXAvdGNwX3dyYXBwZXJzIGZvciBjb25uZWN0aW9ucy4KICAgVGhlIHNlcnZpY2UgbmFtZSB5b3Ugd2lsbCB1c2UgaW4gL2V0Yy9ob3N0cy5hbGxvdyBhbmQgL2V0Yy9ob3N0cy5kZW55CiAgIGlzICJ2bmMiLCBlLmcuOgogIHZuYzogMTkyLjE2OC4xMDAuMyAuZXhhbXBsZS5jb20KCiAgIE5vdGUgdGhhdCBpZiB5b3UgcnVuIHgxMXZuYyBvdXQgb2YgaW5ldGQgeW91IGRvIG5vdCBuZWVkIHRvIGJ1aWxkCiAgIHgxMXZuYyB3aXRoIGxpYndyYXAgc3VwcG9ydCBiZWNhdXNlIHRoZSAvdXNyL3NiaW4vdGNwZCByZWZlcmVuY2UgaW4KICAgL2V0Yy9pbmV0ZC5jb25mIGhhbmRsZXMgdGhlIHRjcF93cmFwcGVycyBzdHVmZi4KCgogICBRLTQzOiBDYW4gSSBoYXZlIHgxMXZuYyBvbmx5IGxpc3RlbiBvbiBvbmUgbmV0d29yayBpbnRlcmZhY2UgKGUuZy4KICAgaW50ZXJuYWwgTEFOKSByYXRoZXIgdGhhbiBoYXZpbmcgaXQgbGlzdGVuIG9uIGFsbCBuZXR3b3JrIGludGVyZmFjZXMKICAgYW5kIHJlbHlpbmcgb24gLWFsbG93IHRvIGZpbHRlciB1bndhbnRlZCBjb25uZWN0aW9ucyBvdXQ/CgogICBBcyBvZiBNYXIvMjAwNSB0aGVyZSBpcyB0aGUgIi1saXN0ZW4gaXBhZGRyIiBvcHRpb24gdGhhdCBlbmFibGVzIHRoaXMuCiAgIEZvciBpcGFkZHIgZWl0aGVyIHN1cHBseSB0aGUgZGVzaXJlZCBuZXR3b3JrIGludGVyZmFjZSdzIElQIGFkZHJlc3MKICAgKG9yIHVzZSBhIGhvc3RuYW1lIHRoYXQgcmVzb2x2ZXMgdG8gaXQpIG9yIHVzZSB0aGUgc3RyaW5nICJsb2NhbGhvc3QiLgogICBGb3IgYWRkaXRpb25hbCBmaWx0ZXJpbmcgc2ltdWx0YW5lb3VzbHkgdXNlIHRoZSAiLWFsbG93IGhvc3QxLC4uLiIKICAgb3B0aW9uIHRvIGFsbG93IG9ubHkgc3BlY2lmaWMgaG9zdHMgaW4uCgogICBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gaW5zdXJlIHRoYXQgbm8gb25lIGNhbiBldmVuIGJlZ2luCiAgIGEgZGlhbG9nIHdpdGggeDExdm5jIGZyb20gdW50cnVzdGVkIG5ldHdvcmsgaW50ZXJmYWNlcyAoZS5nLiBwcHAwLikKICAgVGhlIG9wdGlvbiAtbG9jYWxob3N0IG5vdyBpbXBsaWVzICItbGlzdGVuIGxvY2FsaG9zdCIgc2luY2UgdGhhdCBpcwogICB3aGF0IG1vc3QgcGVvcGxlIGV4cGVjdCBpdCB0byBkby4KCgogICBRLTQ0OiBOb3cgdGhhdCAtbG9jYWxob3N0IGltcGxpZXMgbGlzdGVuaW5nIG9ubHkgb24gdGhlIGxvb3BiYWNrCiAgIGludGVyZmFjZSwgaG93IEkgY2FuIG9jY2FzaW9uYWxseSBhbGxvdyBpbiBhIG5vbi1sb2NhbGhvc3QgdmlhIHRoZSAtUgogICBhbGxvd29uY2UgcmVtb3RlIGNvbnRyb2wgY29tbWFuZD8KCiAgIFRvIGRvIHRoaXMgc3BlY2lmeSAiLWFsbG93IGxvY2FsaG9zdCIuIFVubGlrZSAtbG9jYWxob3N0IHRoaXMgd2lsbAogICBsZWF2ZSB4MTF2bmMgbGlzdGVuaW5nIG9uIGFsbCBpbnRlcmZhY2VzIChidXQgb2YgY291cnNlIG9ubHkgYWxsb3dpbmcKICAgaW4gbG9jYWwgY29ubmVjdGlvbnMsIGUuZy4gc3NoIHJlZGlycy4pIFRoZW4geW91IGNhbiBsYXRlciBydW4gIngxMXZuYwogICAtUiBhbGxvd29uY2U6c29tZWhvc3QiIG9yIHVzZSB0byBndWkgdG8gcGVybWl0IGEgb25lLXNob3QgY29ubmVjdGlvbgogICBmcm9tIGEgcmVtb3RlIGhvc3QuCgoKICAgUS00NTogQ2FuIEkgZmluZSB0dW5lIHdoYXQgdHlwZXMgb2YgdXNlciBpbnB1dCBhcmUgYWxsb3dlZD8gRS5nLiBoYXZlCiAgIHNvbWUgdXNlcnMganVzdCBiZSBhYmxlIHRvIG1vdmUgdGhlIG1vdXNlLCBidXQgbm90IGNsaWNrIG9yIHR5cGUKICAgYW55dGhpbmc/CgogICBBcyBvZiBGZWIvMjAwNSwgdGhlIC1pbnB1dCBvcHRpb24gYWxsb3dzIHlvdSB0byBkbyB0aGlzLiAiSyIsICJNIiwKICAgIkIiLCAiQyIsIGFuZCAiRiIgc3RhbmQgZm9yIEtleXN0cm9rZSwgTW91c2UtbW90aW9uLCBCdXR0b24tY2xpY2tzLAogICBDbGlwYm9hcmQsIGFuZCBGaWxlLVRyYW5zZmVyLCByZXNwZWN0aXZlbHkuIFRoZSBzZXR0aW5nOiAiLWlucHV0IE0iCiAgIG1ha2VzIGF0dGFjaGVkIHZpZXdlcnMgb25seSBhYmxlIHRvIG1vdmUgdGhlIG1vdXNlLiAiLWlucHV0IEtNQkMsTSIKICAgbGV0cyBub3JtYWwgY2xpZW50cyBkbyBldmVyeXRoaW5nIGFuZCBlbmFibGVzIHZpZXctb25seSBjbGllbnRzIHRvCiAgIG1vdmUgdGhlIG1vdXNlLgoKICAgVGhlc2Ugc2V0dGluZ3MgY2FuIGFsc28gYmUgYXBwbGllZCBvbiBhIHBlci12aWV3ZXIgYmFzaXMgdmlhIHRoZQogICByZW1vdGUgY29udHJvbCBtZWNoYW5pc20gb3IgdGhlIEdVSS4gRS5nLiB4MTF2bmMgLVIgaW5wdXQ6aG9zdG5hbWU6TQoKCiAgIFEtNDY6IENhbiBJIHByb21wdCB0aGUgdXNlciBhdCB0aGUgbG9jYWwgWCBkaXNwbGF5IHdoZXRoZXIgdGhlCiAgIGluY29taW5nIFZOQyBjbGllbnQgc2hvdWxkIGJlIGFjY2VwdGVkIG9yIG5vdD8gQ2FuIEkgZGVjaWRlIHRvIG1ha2UKICAgc29tZSBjbGllbnRzIHZpZXctb25seT8gSG93IGFib3V0IHJ1bm5pbmcgYW4gYXJiaXRyYXJ5IHByb2dyYW0gdG8gbWFrZQogICB0aGUgZGVjaXNpb25zPwoKICAgWWVzLCBsb29rIGF0IHRoZSAiLWFjY2VwdCBjb21tYW5kIiBvcHRpb24sIGl0IGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhbgogICBleHRlcm5hbCBjb21tYW5kIHRoYXQgaXMgcnVuIGZvciBlYWNoIG5ldyBjbGllbnQuICh1c2UgcXVvdGVzIGFyb3VuZAogICB0aGUgY29tbWFuZCBpZiBpdCBjb250YWlucyBzcGFjZXMsIGV0Yy4pIElmIHRoZSBleHRlcm5hbCBjb21tYW5kCiAgIHJldHVybnMgMCAoc3VjY2VzcykgdGhlIGNsaWVudCBpcyBhY2NlcHRlZCwgb3RoZXJ3aXNlIHdpdGggYW55IG90aGVyCiAgIHJldHVybiBjb2RlIHRoZSBjbGllbnQgaXMgcmVqZWN0ZWQuIFNlZSBiZWxvdyBob3cgdG8gYWxzbyBhY2NlcHQKICAgY2xpZW50cyB2aWV3LW9ubHkuCgogICBUaGUgZXh0ZXJuYWwgY29tbWFuZCB3aWxsIGhhdmUgdGhlIFJGQl9DTElFTlRfSVAgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgc2V0IHRvIHRoZSBjbGllbnQncyBudW1lcmljYWwgSVAgYWRkcmVzcywgUkZCX0NMSUVOVF9QT1JUIGl0cyBwb3J0CiAgIG51bWJlci4gU2ltaWxhcmx5IGZvciBSRkJfU0VSVkVSX0lQIGFuZCBSRkJfU0VSVkVSX1BPUlQgdG8gYWxsb3cKICAgaWRlbnRpZmljYXRpb24gb2YgdGhlIHRjcCB2aXJ0dWFsIGNpcmN1aXQuIERJU1BMQVkgd2lsbCBiZSBzZXQgdG8gdGhhdAogICBvZiB0aGUgWDExIGRpc3BsYXkgYmVpbmcgcG9sbGVkLiBBbHNvLCBSRkJfWDExVk5DX1BJRCBpcyBzZXQgdG8gdGhlCiAgIHgxMXZuYyBwcm9jZXNzIGlkIChlLmcuIGluIGNhc2UgeW91IGRlY2lkZWQgdG8ga2lsbCBpdCksIFJGQl9DTElFTlRfSUQKICAgd2lsbCBiZSBhbiBpZCBudW1iZXIsIGFuZCBSRkJfQ0xJRU5UX0NPVU5UIHRoZSBudW1iZXIgb2Ygb3RoZXIgY2xpZW50cwogICBjdXJyZW50bHkgY29ubmVjdGVkLiBSRkJfTU9ERSB3aWxsIGJlICJhY2NlcHQiLgoKICAgQnVpbHQtaW4gUG9wdXAgV2luZG93OiBBcyBhIHNwZWNpYWwgY2FzZSwgIi1hY2NlcHQgcG9wdXAiIHdpbGwKICAgaW5zdHJ1Y3QgeDExdm5jIHRvIGNyZWF0ZSBpdHMgb3duIHNpbXBsZSBwb3B1cCB3aW5kb3cuIFRvIGFjY2VwdCB0aGUKICAgY2xpZW50IHByZXNzICJ5IiBvciBjbGljayBtb3VzZSBvbiB0aGUgIlllcyIgYnV0dG9uLiBUbyByZWplY3QgdGhlCiAgIGNsaWVudCBwcmVzcyAibiIgb3IgY2xpY2sgbW91c2Ugb24gdGhlICJObyIgYnV0dG9uLiBUbyBhY2NlcHQgdGhlCiAgIGNsaWVudCBWaWV3LW9ubHksIHByZXNzICJ2IiBvciBjbGljayBtb3VzZSBvbiB0aGUgIlZpZXciIGJ1dHRvbi4gSWYKICAgdGhlIC12aWV3b25seSBvcHRpb24gaGFzIGJlZW4gc3VwcGxpZWQsIHRoZSAiVmlldyIgYWN0aW9uIHdpbGwgbm90IGJlCiAgIHByZXNlbnQ6IHRoZSB3aG9sZSBkaXNwbGF5IGlzIHZpZXcgb25seSBpbiB0aGF0IGNhc2UuCgogICBUaGUgcG9wdXAgd2luZG93IHRpbWVzIG91dCBhZnRlciAxMjAgc2Vjb25kcywgdG8gY2hhbmdlIHRoaXMgYmVoYXZpb3IKICAgdXNlICItYWNjZXB0IHBvcHVwOk4iIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBzZWNvbmRzICh1c2UgMCBmb3Igbm8KICAgdGltZW91dC4pIE1vcmUgdHJpY2tzOiAiLWFjY2VwdCBwb3B1cG1vdXNlIiB3aWxsIG9ubHkgdGFrZSBtb3VzZSBjbGljawogICByZXNwb25zZXMsIHdoaWxlICItYWNjZXB0IHBvcHVwa2V5IiB3aWxsIG9ubHkgdGFrZSBrZXlzdHJva2UgcmVzcG9uc2VzCiAgIChwb3B1cCB0YWtlcyBib3RoLikgQWZ0ZXIgYW55IG9mIHRoZSAzIHBvcHVwIGtleXdvcmRzIHlvdSBjYW4gc3VwcGx5IGEKICAgcG9zaXRpb24gb2YgdGhlIHdpbmRvdzogK04rTSwgKHRoZSBkZWZhdWx0IGlzIHRvIGNlbnRlciB0aGUgd2luZG93KQogICBlLmcuIC1hY2NlcHQgcG9wdXBtb3VzZSsxMCsxMC4KCiAgIEFsc28gYXMgYSBzcGVjaWFsIGNhc2UgIi1hY2NlcHQgeG1lc3NhZ2UiIHdpbGwgcnVuIHRoZSB4bWVzc2FnZSgxKQogICBwcm9ncmFtIHRvIHByb21wdCB0aGUgdXNlciB3aGV0aGVyIHRoZSBjbGllbnQgc2hvdWxkIGJlIGFjY2VwdGVkIG9yCiAgIG5vdC4gVGhpcyByZXF1aXJlcyB0aGF0IHlvdSBoYXZlIHhtZXNzYWdlIGluc3RhbGxlZCBhbmQgYXZhaWxhYmxlIHZpYQogICBQQVRILiBJbiBjYXNlIGl0IGlzIG5vdCBhbHJlYWR5IG9uIHlvdXIgc3lzdGVtLCB0aGUgeG1lc3NhZ2UgcHJvZ3JhbQogICBpcyBhdmFpbGFibGUgYXQgZnRwOi8vZnRwLngub3JnLwogICAoRW5kIG9mIEJ1aWx0LWluIFBvcHVwIFdpbmRvdzopCgogICBUbyBpbmNsdWRlIHZpZXctb25seSBkZWNpc2lvbnMgZm9yIHRoZSBleHRlcm5hbCBjb21tYW5kcywgcHJlZml4IHRoZQogICBjb21tYW5kIHNvbWV0aGluZyBsaWtlIHRoaXM6ICJ5ZXM6MCxubzoqLHZpZXc6MyBteWNvbW1hbmQgLi4uIiBUaGlzCiAgIGFzc29jaWF0ZXMgdGhlIHRocmVlIGFjdGlvbnM6IHllcyhhY2NlcHQpLCBubyhyZWplY3QpLCBhbmQKICAgdmlldyhhY2NlcHQtdmlldy1vbmx5KSwgd2l0aCB0aGUgbnVtZXJpY2FsIHJldHVybiAoaS5lLiBleGl0KCkpIGNvZGVzLgogICBVc2UgIioiIGluc3RlYWQgb2YgYSBudW1iZXIgdG8gc2V0IHRoZSBkZWZhdWx0IGFjdGlvbiAoZS5nLiBpbiBjYXNlCiAgIHRoZSBleHRlcm5hbCBjb21tYW5kIHJldHVybnMgYW4gdW5leHBlY3RlZCByZXR1cm4gY29kZS4pCgogICBIZXJlIGlzIGFuIGV4YW1wbGUgLWFjY2VwdCBzY3JpcHQgY2FsbGVkIGFjY2VwdF9vcl9sb2NrLiBJdCB1c2VzCiAgIHhtZXNzYWdlIGFuZCB4bG9jayAocmVwbGFjZSB3aXRoIHlvdXIgc2NyZWVuIGxvY2sgY29tbWFuZCwgbWF5YmUgaXQgaXMKICAgInhzY3JlZW5zYXZlci1jb21tYW5kIC1sb2NrIiwgb3Iga2Rlc2t0b3BfbG9jaywgb3IgImR0YWN0aW9uCiAgIExvY2tEaXNwbGF5Ii4pIEl0IHdpbGwgcHJvbXB0IHRoZSB1c2VyIGF0IHRoZSBYIGRpc3BsYXkgd2hldGhlciB0bwogICBhY2NlcHQsIHJlamVjdCwgb3IgYWNjZXB0IHZpZXctb25seSB0aGUgY2xpZW50LCBidXQgaWYgdGhlIHByb21wdAogICB0aW1lcyBvdXQgYWZ0ZXIgNjAgc2Vjb25kcyB0aGUgc2NyZWVuIGlzIGxvY2tlZCBhbmQgdGhlIFZOQyBjbGllbnQgaXMKICAgYWNjZXB0ZWQuIFRoaXMgYWxsb3dzIHRoZSByZW1vdGUgYWNjZXNzIHdoZW4gbm8gb25lIGlzIGF0IHRoZSBkaXNwbGF5LgojIS9iaW4vc2gKIwojIGFjY2VwdF9vcl9sb2NrOiBwcm9tcHQgdXNlciBhdCBYIGRpc3BsYXkgd2hldGhlciB0byBhY2NlcHQgYW4gaW5jb21pbmcKIyAgICAgICAgICAgICAgICAgVk5DIGNvbm5lY3Rpb24uICBJZiB0aW1lb3V0IGV4cGlyZXMsIHNjcmVlbiBpcyBsb2NrZWQKIyAgICAgICAgICAgICAgICAgYW5kIHRoZSBWTkMgdmlld2VyIGlzIGFjY2VwdGVkIChhbGxvd3MgcmVtb3RlIGFjY2VzcwojICAgICAgICAgICAgICAgICB3aGVuIG5vIG9uZSBpcyBzaXR0aW5nIGF0IHRoZSBkaXNwbGF5LikKIwojIHVzYWdlOiB4MTF2bmMgLi4uIC1mb3JldmVyIC1hY2NlcHQgJ3llczowLG5vOiosdmlldzo0IGFjY2VwdF9vcl9sb2NrJwojCnhtZXNzYWdlIC1idXR0b25zIHllczoyLG5vOjMsdmlldy1vbmx5OjQgLWNlbnRlciBcCiAgICAgICAgIC10aW1lb3V0IDYwICJ4MTF2bmM6IGFjY2VwdCBjb25uZWN0aW9uIGZyb20gJFJGQl9DTElFTlRfSVA/IgpyYz0kPwppZiBbICRyYyA9IDAgXTsgdGhlbgogICAgICAgIHhsb2NrICYgIyBvciAieGxvY2sgLW1vZGUgYmxhbmsiIGZvciBubyBhbmltYXRpb25zLgogICAgICAgIHNsZWVwIDUKICAgICAgICBleGl0IDAKZWxpZiBbICRyYyA9IDIgXTsgdGhlbgogICAgICAgIGV4aXQgMAplbGlmIFsgJHJjID0gNCBdOyB0aGVuCiAgICAgICAgZXhpdCA0CmZpCmV4aXQgMQoKICAgU3RlZmFuIFJhZG1hbiBoYXMgd3JpdHRlbiBhIG5pY2UgZHRrc2ggc2NyaXB0IGR0Vm5jUG9wdXAgZm9yIHVzZSBpbgogICBDREUgZW52aXJvbm1lbnRzIHRvIGRvIHRoZSBzYW1lIHNvcnQgb2YgdGhpbmcuIEluZm9ybWF0aW9uIG9uIGhvdyB0bwogICB1c2UgaXQgaXMgZm91bmQgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4gSGUgZW5jb3VyYWdlcyB5b3UgdG8gcHJvdmlkZQogICBmZWVkYmFjayB0byBoaW0gdG8gaGVscCBpbXByb3ZlIHRoZSBzY3JpcHQuCgogICBOb3RlIHRoYXQgaW4gYWxsIGNhc2VzIHgxMXZuYyB3aWxsIGJsb2NrIHdoaWxlIHRoZSBleHRlcm5hbCBjb21tYW5kIG9yCiAgIHBvcHVwIGlzIGJlaW5nIHJ1biwgc28gYXR0YWNoZWQgY2xpZW50cyB3aWxsIG5vdCByZWNlaXZlIHNjcmVlbgogICB1cGRhdGVzLCBldGMgZHVyaW5nIHRoaXMgcGVyaW9kLgoKICAgVG8gcnVuIGEgY29tbWFuZCB3aGVuIGEgY2xpZW50IGRpc2Nvbm5lY3RzLCB1c2UgdGhlICItZ29uZSBjb21tYW5kIgogICBvcHRpb24uIFRoaXMgaXMgZm9yIHRoZSB1c2VyJ3MgY29udmVuaWVuY2Ugb25seTogdGhlIHJldHVybiBjb2RlIG9mCiAgIHRoZSBjb21tYW5kIGlzIG5vdCBpbnRlcnByZXRlZCBieSB4MTF2bmMuIFRoZSBzYW1lIGVudmlyb25tZW50CiAgIHZhcmlhYmxlcyBhcmUgc2V0IGFzIGluICItYWNjZXB0IGNvbW1hbmQiIChleGNlcHQgdGhhdCBSRkJfTU9ERSB3aWxsCiAgIGJlICJnb25lIi4pCgogICBBcyBvZiBKYW4vMjAwNiB0aGUgIi1hZnRlcmFjY2VwdCBjb21tYW5kIiBvcHRpb24gd2lsbCBydW4gdGhlIGNvbW1hbmQKICAgb25seSBhZnRlciB0aGUgVk5DIGNsaWVudCBoYXMgYmVlbiBhY2NlcHRlZCBhbmQgYXV0aGVudGljYXRlZC4gTGlrZQogICAtZ29uZSB0aGUgcmV0dXJuIGNvZGUgaXMgbm90IGludGVycHJldGVkLiBSRkJfTU9ERSB3aWxsIGJlCiAgICJhZnRlcmFjY2VwdCIuKQoKCiAgIFEtNDc6IEkgc3RhcnQgeDExdm5jIGFzIHJvb3QgYmVjYXVzZSBpdCBpcyBsYXVuY2hlZCB2aWEgaW5ldGQoOCkgb3IgYQogICBkaXNwbGF5IG1hbmFnZXIgbGlrZSBnZG0oMSkuIENhbiBJIGhhdmUgeDExdm5jIGxhdGVyIHN3aXRjaCB0byBhCiAgIGRpZmZlcmVudCB1c2VyPwoKICAgQXMgb2YgRmViLzIwMDUgeDExdm5jIGhhcyB0aGUgLXVzZXJzIG9wdGlvbiB0aGF0IGFsbG93cyB0aGluZ3MgbGlrZQogICB0aGlzLiBQbGVhc2UgcmVhZCB0aGUgZG9jdW1lbnRhdGlvbiBvbiBpdCAoYWxzbyBpbiB0aGUgeDExdm5jIC1oZWxwCiAgIG91dHB1dCkgY2FyZWZ1bGx5IGZvciBmZWF0dXJlcyBhbmQgY2F2ZWF0cy4gSXQncyB1c2UgY2FuIG9mdGVuCiAgIGRlY3JlYXNlIHNlY3VyaXR5IHVubGVzcyBjYXJlIGlzIHRha2VuLgoKICAgQlRXLCBhIG5pY2UgdXNlIG9mIGl0IGlzICItdXNlcnMgK25vYm9keSIgdGhhdCBzd2l0Y2hlcyB0byB0aGUgVW5peAogICB1c2VyIG5vYm9keSByaWdodCBhZnRlciBjb25uZWN0aW9ucyB0byB0aGUgWCBkaXNwbGF5IGFyZSBlc3RhYmxpc2hlZC4KCiAgIEluIGFueSBldmVudCwgd2hpbGUgcnVubmluZyB4MTF2bmMgYXMgcm9vdCwgcmVtZW1iZXIgaXQgY29tZXMgd2l0aCBubwogICB3YXJyYW50eSA7LSkuCgoKICAgUS00ODogSSB1c2UgYSBzY3JlZW4tbG9jayB3aGVuIEkgbGVhdmUgbXkgd29ya3N0YXRpb24gKGUuZy4KICAgeHNjcmVlbnNhdmVyIG9yIHhsb2NrLikgV2hlbiBJIHJlbW90ZWx5IGFjY2VzcyBteSB3b3Jrc3RhdGlvbiBkZXNrdG9wCiAgIHZpYSB4MTF2bmMgSSBjYW4gdW5sb2NrIHRoZSBkZXNrdG9wIGZpbmUsIGJ1dCBJIGFtIHdvcnJpZWQgcGVvcGxlIHdpbGwKICAgc2VlIG15IGFjdGl2aXRpZXMgb24gdGhlIHBoeXNpY2FsIG1vbml0b3IuIFdoYXQgY2FuIEkgZG8gdG8gcHJldmVudAogICB0aGlzLCBvciBhdCBsZWFzdCBtYWtlIGl0IG1vcmUgZGlmZmljdWx0PwoKICAgUHJvYmFibHkgbW9zdCB3b3JrIGVudmlyb25tZW50cyB3b3VsZCByZXNwZWN0IHlvdXIgcHJpdmFjeSBpZiB5b3UKICAgcG93ZXJlZCBvZmYgdGhlIG1vbml0b3IuIEFsc28gcmVtZW1iZXIgaWYgcGVvcGxlIGhhdmUgcGh5c2ljYWwgYWNjZXNzCiAgIHRvIHlvdXIgd29ya3N0YXRpb24gdGhleSBiYXNpY2FsbHkgY2FuIGRvIGFueXRoaW5nIHRoZXkgd2FudCB3aXRoIGl0CiAgIChlLmcuIGluc3RhbGwgYSBiYWNrZG9vciBmb3IgbGF0ZXIgdXNlLCBldGMuKQoKICAgSW4gYW55IGV2ZW50LCBhcyBvZiBKdW4vMjAwNCB0aGVyZSBpcyBhbiBleHBlcmltZW50YWwgdXRpbGl0eSB0byBtYWtlCiAgIGl0IG1vcmUgZGlmZmljdWx0IGZvciBub3NleSBwZW9wbGUgdG8gc2VlIHlvdXIgeDExdm5jIGFjdGl2aXRpZXMuIFRoZQogICBzb3VyY2UgZm9yIGl0IGlzIGJsb2NrZHB5LmMgVGhlIGlkZWEgYmVoaW5kIGl0IGlzIHNpbXBsZSAoYnV0CiAgIG9idmlvdXNseSBub3QgYnVsbGV0cHJvb2YpOiB3aGVuIGEgVk5DIGNsaWVudCBhdHRhY2hlcyB0byB4MTF2bmMgcHV0CiAgIHRoZSBkaXNwbGF5IG1vbml0b3IgaW4gdGhlIERQTVMgIm9mZiIgc3RhdGUsIGlmIHRoZSBEUE1TIHN0YXRlIGV2ZXIKICAgY2hhbmdlcyBpbW1lZGlhdGVseSBzdGFydCB1cCB0aGUgc2NyZWVuLWxvY2sgcHJvZ3JhbS4gVGhlIHgxMXZuYyB1c2VyCiAgIHdpbGwgbm90aWNlIHNvbWV0aGluZyBpcyBoYXBwZW5pbmcgYW5kIHRoaW5rIGFib3V0IHdoYXQgdG8gZG8gbmV4dAogICAod2hpbGUgdGhlIHNjcmVlbiBpcyBpbiBhIGxvY2tlZCBzdGF0ZS4pCgogICBUaGlzIHdvcmtzIChvciBhdCBsZWFzdCBoYXMgYSBjaGFuY2Ugb2Ygd29ya2luZykgYmVjYXVzZSBpZiB0aGUKICAgaW50cnVkZXIgbW92ZXMgdGhlIG1vdXNlIG9yIHByZXNzZXMgYSBrZXkgb24gdGhlIGtleWJvYXJkLCB0aGUgbW9uaXRvcgogICB3YWtlcyB1cCBvdXQgb2YgdGhlIERQTVMgb2ZmIHN0YXRlLCBhbmQgdGhpcyBpbmR1Y2VzIHRoZSBzY3JlZW4gbG9jawogICBwcm9ncmFtIHRvIGFjdGl2YXRlIGFzIHNvb24gYXMgcG9zc2libGUuIE9mIGNvdXJzZSB0aGVyZSBhcmUgY3JhY2tzIGluCiAgIHRoaXMsIHRoZSBlYXZlc2Ryb3BwZXIgY291bGQgZGV0YWNoIHlvdXIgbW9uaXRvciBhbmQgaW5zZXJ0IGEgbm9uLURQTVMKICAgb25lLCBhbmQgdGhlcmUgYXJlIHJhY2UgY29uZGl0aW9ucy4gQXMgbWVudGlvbmVkIGFib3ZlIHRoaXMgaXMgbm90CiAgIGJ1bGxldHByb29mLiBBIHJlYWxseSByb2J1c3Qgc29sdXRpb24gd291bGQgbGlrZWx5IHJlcXVpcmUgWCBzZXJ2ZXIKICAgYW5kIHBlcmhhcHMgZXZlbiB2aWRlbyBoYXJkd2FyZSBzdXBwb3J0LgoKICAgVGhlIGJsb2NrZHB5IHV0aWxpdHkgaXMgbGF1bmNoZWQgYnkgdGhlIC1hY2NlcHQgb3B0aW9uIGFuZCB0b2xkIHRvCiAgIGV4aXQgdmlhIHRoZSAtZ29uZSBvcHRpb24gKHRoZSB2bmMgY2xpZW50IHVzZXIgc2hvdWxkIG9idmlvdXNseQogICByZS1sb2NrIHRoZSBzY3JlZW4gYmVmb3JlIGRpc2Nvbm5lY3RpbmchKSBJbnN0cnVjdGlvbnMgY2FuIGJlIGZvdW5kIGluCiAgIHRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHV0aWxpdHkgYXQgdGhlIGFib3ZlIGxpbmsuIFJvdWdobHkgaXQgaXMKICAgc29tZXRoaW5nIGxpa2UgdGhpczoKICB4MTF2bmMgLi4uIC1hY2NlcHQgImJsb2NrZHB5IC1iZyAtZiAkSE9NRS8uYmRweSIgLWdvbmUgInRvdWNoICRIT01FLy5iZHB5IgoKICAgYnV0IHBsZWFzZSByZWFkIHRoZSB0b3Agb2YgdGhlIGZpbGUuCgogICBVcGRhdGU6IEFzIG9mIEZlYi8yMDA3IHRoZXJlIGlzIHNvbWUgYnVpbHRpbiBzdXBwb3J0IGZvciB0aGlzOgogICAtZm9yY2VkcG1zIGFuZCAtY2xpZW50ZHBtcyBob3dldmVyLCB0aGV5IGFyZSBwcm9iYWJseSBsZXNzIHJvYnVzdCB0aGFuCiAgIHRoZSBhYm92ZSBibG9ja2RweS5jIHNjaGVtZSwgc2luY2UgaWYgdGhlIHBlcnNvbiBmbG9vZHMgdGhlIHBoeXNpY2FsCiAgIG1hY2hpbmUgd2l0aCBtb3VzZSBvciBwb2ludGVyIGlucHV0IGhlIGNhbiB1c3VhbGx5IHNlZSBmbGFzaGVzIG9mIHRoZQogICBzY3JlZW4gYmVmb3JlIHRoZSBtb25pdG9yIGlzIHBvd2VyZWQgb2ZmIGFnYWluLiBTZWUgYWxzbyB0aGUgLWdyYWJrYmQsCiAgIC1ncmFicHRyLCBhbmQgLWdyYWJhbHdheXMgb3B0aW9ucy4KCgogICBRLTQ5OiBDYW4gSSBoYXZlIHgxMXZuYyBhdXRvbWF0aWNhbGx5IGxvY2sgdGhlIHNjcmVlbiB3aGVuIEkKICAgZGlzY29ubmVjdCB0aGUgVk5DIHZpZXdlcj8KCiAgIFllcywgYSB1c2VyIG1lbnRpb25zIGhlIHVzZXMgdGhlIC1nb25lIG9wdGlvbiB1bmRlciBDREUgdG8gcnVuIGEKICAgc2NyZWVuIGxvY2sgcHJvZ3JhbToKICB4MTF2bmMgLWRpc3BsYXkgOjAgLWZvcmV2ZXIgLWdvbmUgJ2R0YWN0aW9uIExvY2tEaXNwbGF5JwoKICAgT3RoZXIgcG9zc2liaWxpdGllcyBhcmU6CiAgeDExdm5jIC1kaXNwbGF5IDowIC1mb3JldmVyIC1nb25lICd4c2NyZWVuc2F2ZXItY29tbWFuZCAtbG9jaycKICB4MTF2bmMgLWRpc3BsYXkgOjAgLWZvcmV2ZXIgLWdvbmUgJ2tkZXNrdG9wX2xvY2snCiAgeDExdm5jIC1kaXNwbGF5IDowIC1mb3JldmVyIC1nb25lICd4bG9jayAmJwogIHgxMXZuYyAtZGlzcGxheSA6MCAtZm9yZXZlciAtZ29uZSAneGxvY2sgLW1vZGUgYmxhbmsgJicKCiAgIEhlcmUgaXMgYSBzY2hlbWUgdXNpbmcgdGhlIC1hZnRlcmFjY2VwdCBvcHRpb24gKGluIHZlcnNpb24gMC44KSB0bwogICB1bmxvY2sgdGhlIHNjcmVlbiBhZnRlciB0aGUgZmlyc3QgdmFsaWQgVk5DIGxvZ2luIGFuZCB0byBsb2NrIHRoZQogICBzY3JlZW4gYWZ0ZXIgdGhlIGxhc3QgdmFsaWQgVk5DIGxvZ2luIGRpc2Nvbm5lY3RzOgogIHgxMXZuYyAtZGlzcGxheSA6MCAtZm9yZXZlciAtc2hhcmVkIC1hZnRlcmFjY2VwdCAuL215eGxvY2tlciAtZ29uZSAuL215eGxvY2tlCnIKCiAgIFdoZXJlIHRoZSBzY3JpcHQgLi9teXhsb2NrZXIgaXM6CiMhL2Jpbi9zaAoKIy91c3IvYmluL2VudiB8IGdyZXAgUkZCXyB8IHNvcnQgICAgICAgICMgZm9yIHZpZXdpbmcgUkZCXyogc2V0dGluZ3MuCgppZiBbICJYJFJGQl9NT0RFIiA9ICJYYWZ0ZXJhY2NlcHQiIF07IHRoZW4KICAgICAgICBpZiBbICJYJFJGQl9TVEFURSIgPSAiWE5PUk1BTCIgXTsgdGhlbiAgIyByZXF1aXJlIHZhbGlkIGxvZ2luCiAgICAgICAgICAgICAgICBpZiBbICJYJFJGQl9DTElFTlRfQ09VTlQiID0gIlgxIiBdOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxhbGwgeGxvY2sgICAjIExpbnV4IG9ubHkuCiAgICAgICAgICAgICAgICBmaQogICAgICAgIGZpCmVsaWYgWyAiWCRSRkJfTU9ERSIgPSAiWGdvbmUiIF07IHRoZW4KICAgICAgICBpZiBbICJYJFJGQl9TVEFURSIgPSAiWE5PUk1BTCIgXTsgdGhlbiAgIyByZXF1aXJlIHZhbGlkIGxvZ2luCiAgICAgICAgICAgICAgICBpZiBbICJYJFJGQl9DTElFTlRfQ09VTlQiID0gIlgwIiBdOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIHhsb2NrIC1tb2RlIGJsYW5rICYKICAgICAgICAgICAgICAgIGZpCiAgICAgICAgZmkKZmkKCiAgIE5vdGUgdGhlIHhsb2NrIG9wdGlvbiAiLW1vZGUgYmxhbmsiIHRvIGF2b2lkIGFuaW1hdGlvbnMuCgogICBUaGVyZSBpcyBhIHByb2JsZW0gaWYgeW91IGhhdmUgeDExdm5jIHJ1bm5pbmcgdGhpcyB3YXkgaW4gLWZvcmV2ZXIKICAgbW9kZSBhbmQgeW91IGhpdCBDdHJsLUMgdG8gc3RvcCBpdC4gVGhlIHhsb2NrIChvciBvdGhlciBwcm9ncmFtKSB3aWxsCiAgIGdldCBraWxsZWQgdG9vLiBUbyB3b3JrIGFyb3VuZCB0aGlzIG1ha2UgYSBsaXR0bGUgc2NyaXB0IGNhbGxlZAogICBzZXRwZ3JwIHRoYXQgbG9va3MgbGlrZToKIyEvdXNyL2Jpbi9wZXJsCnNldHBncnAoMCwgMCk7CmV4ZWMgQEFSR1Y7CgogICB0aGVuIHVzZSAtZ29uZSAic2V0cGdycCB4bG9jayAmIiwgZXRjLgogICBbRW5jcnlwdGVkIENvbm5lY3Rpb25zXQoKICAgUS01MDogSG93IGNhbiBJIHR1bm5lbCBteSBjb25uZWN0aW9uIHRvIHgxMXZuYyB2aWEgYW4gZW5jcnlwdGVkIFNTSAogICBjaGFubmVsIGJldHdlZW4gdHdvIFVuaXggbWFjaGluZXM/CgogICBTZWUgdGhlIGRlc2NyaXB0aW9uIGVhcmxpZXIgb24gdGhpcyBwYWdlIG9uIGhvdyB0byB0dW5uZWwgVk5DIHZpYSBTU0gKICAgZnJvbSBVbml4IHRvIFVuaXguIEEgbnVtYmVyIG9mIHdheXMgYXJlIGRlc2NyaWJlZCBhbG9uZyB3aXRoIHNvbWUKICAgaXNzdWVzIHlvdSBtYXkgZW5jb3VudGVyLgoKICAgT3RoZXIgc2VjdXJlIGVuY3J5cHRlZCBtZXRob2RzIGV4aXN0cywgZS5nLiBzdHVubmVsLCBJUFNFQywgdmFyaW91cwogICBWUE5zLCBldGMuCgogICBTZWUgYWxzbyB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgcGFnZSB3aGVyZSBtdWNoIG9mIHRoaXMKICAgaXMgbm93IGF1dG9tYXRlZC4KCgogICBRLTUxOiBIb3cgY2FuIEkgdHVubmVsIG15IGNvbm5lY3Rpb24gdG8geDExdm5jIHZpYSBhbiBlbmNyeXB0ZWQgU1NICiAgIGNoYW5uZWwgZnJvbSBXaW5kb3dzIHVzaW5nIGFuIFNTSCBjbGllbnQgbGlrZSBQdXR0eT8KCiAgIEFib3ZlIHdlIGRlc2NyaWJlZCBob3cgdG8gdHVubmVsIFZOQyB2aWEgU1NIIGZyb20gVW5peCB0byBVbml4LCB5b3UKICAgbWF5IHdhbnQgdG8gcmV2aWV3IGl0LiBUbyBkbyB0aGlzIGZyb20gV2luZG93cyB1c2luZyBQdXR0eSBpdCB3b3VsZCBnbwogICBzb21ldGhpbmcgbGlrZSB0aGlzOgogICAgICogSW4gdGhlIFB1dHR5IGRpYWxvZyB3aW5kb3cgdW5kZXIgJ1Nlc3Npb24nIGVudGVyIHRoZSBob3N0bmFtZSBvcgogICAgICAgSVAgbnVtYmVyIG9mIHRoZSBVbml4IG1hY2hpbmUgd2l0aCBkaXNwbGF5IHRvIGJlIHZpZXdlZC4KICAgICAqIE1ha2Ugc3VyZSB0aGUgU1NIIHByb3RvY29sIGlzIHNlbGVjdGVkIGFuZCB0aGUgc2VydmVyIHBvcnQgaXMKICAgICAgIGNvcnJlY3QuCiAgICAgKiBVbmRlciAnQ29ubmVjdGlvbnMvU1NIL1R1bm5lbHMnIEFkZCBhIExvY2FsIGNvbm5lY3Rpb24gd2l0aAogICAgICAgJ1NvdXJjZSBwb3J0OiAgNTkwMCcgYW5kICdEZXN0aW5hdGlvbjogIGxvY2FsaG9zdDo1OTAwJwogICAgICogTG9nIGludG8gdGhlIHJlbW90ZSBtYWNoaW5lIGJ5IHByZXNzaW5nICdPcGVuJyBhbmQgc3VwcGx5aW5nCiAgICAgICB1c2VybmFtZSwgcGFzc3dvcmQsIGV0Yy4KICAgICAqIEluIHRoYXQgU1NIIHNoZWxsLCBzdGFydCB1cCB4MTF2bmMgYnkgdHlwaW5nIHRoZSBjb21tYW5kOiB4MTF2bmMKICAgICAgIC1kaXNwbGF5IDowIHBsdXMgYW55IG90aGVyIGRlc2lyZWQgb3B0aW9ucyAoZS5nLiAtbG9jYWxob3N0LikKICAgICAqIEZpbmFsbHksIHN0YXJ0IHVwIHlvdXIgVk5DIFZpZXdlciBpbiBXaW5kb3dzIGFuZCBlbnRlcgogICAgICAgJ2xvY2FsaG9zdDowJyBhcyB0aGUgVk5DIHNlcnZlci4KCiAgIFlvdSBjYW4ga2VlcCBhbGwgb2YgdGhlIHNldHRpbmdzIGluIGEgUHV0dHkgJ1NhdmVkIFNlc3Npb24nLiBBbHNvLAogICBvbmNlIGV2ZXJ5dGhpbmcgaXMgd29ya2luZywgeW91IGNhbiBjb25zaWRlciBwdXR0aW5nIHgxMXZuYyAtZGlzcGxheQogICA6MCAocGx1cyBvdGhlciBjbWRsaW5lIG9wdGlvbnMpIGluIHRoZSAnUmVtb3RlIGNvbW1hbmQnIFB1dHR5IHNldHRpbmcKICAgdW5kZXIgJ0Nvbm5lY3Rpb25zL1NTSCcuCgogICBTZWUgYWxzbyB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgcGFnZSB3aGVyZSBtdWNoIG9mIHRoaXMKICAgaXMgbm93IGF1dG9tYXRlZCB2aWEgdGhlIFB1dHR5IHBsaW5rIHV0aWxpdHkuCgogICBGb3IgZXh0cmEgcHJvdGVjdGlvbiBmZWVsIGZyZWUgdG8gcnVuIHgxMXZuYyB3aXRoIHRoZSAtbG9jYWxob3N0IGFuZAogICAtcmZiYXV0aC8tcGFzc3dkZmlsZSBvcHRpb25zLgoKICAgSWYgdGhlIG1hY2hpbmUgeW91IFNTSCBpbnRvIHZpYSBQdXR0eSBpcyBub3QgdGhlIHNhbWUgbWFjaGluZSB3aXRoIHRoZQogICBYIGRpc3BsYXkgeW91IHdpc2ggdG8gdmlldyAoZS5nLiB5b3VyIGNvbXBhbnkgcHJvdmlkZXMgaW5jb21pbmcgU1NICiAgIGFjY2VzcyB0byBhIGdhdGV3YXkgbWFjaGluZSksIHRoZW4geW91IG5lZWQgdG8gY2hhbmdlIHRoZSBhYm92ZSBQdXR0eQogICBkaWFsb2cgc2V0dGluZyB0bzogJ0Rlc3RpbmF0aW9uOiBvdGhlcmhvc3Q6NTkwMCcsIE9uY2UgbG9nZ2VkIGluLAogICB5b3UnbGwgbmVlZCB0byBkbyBhIHNlY29uZCBsb2dpbiAoc3NoIG9yIHJzaCkgdG8gdGhlIHdvcmtzdGF0aW9uCiAgIG1hY2hpbmUgJ290aGVyaG9zdCcgYW5kIHRoZW4gc3RhcnQgdXAgeDExdm5jIG9uIGl0LiBUaGlzIGNhbiBhbHNvIGJlCiAgIGF1dG9tYXRlZCBieSBDaGFpbmluZyBTU0gncy4KCiAgIEFzIGRpc2N1c3NlZCBhYm92ZSBhbm90aGVyIG9wdGlvbiBpcyB0byBmaXJzdCBzdGFydCB0aGUgVk5DIHZpZXdlciBpbgogICAibGlzdGVuIiBtb2RlLCBhbmQgdGhlbiBsYXVuY2ggeDExdm5jIHdpdGggdGhlICItY29ubmVjdCBsb2NhbGhvc3QiCiAgIG9wdGlvbiB0byBlc3RhYmxpc2ggdGhlIHJldmVyc2UgY29ubmVjdGlvbi4gSW4gdGhpcyBjYXNlIGEgUmVtb3RlIHBvcnQKICAgcmVkaXJlY3Rpb24gKG5vdCBMb2NhbCkgaXMgbmVlZGVkIGZvciBwb3J0IDU1MDAgaW5zdGVhZCBvZiA1OTAwIChpLmUuCiAgICdTb3VyY2UgcG9ydDogIDU1MDAnIGFuZCAnRGVzdGluYXRpb246ICBsb2NhbGhvc3Q6NTUwMCcgZm9yIGEgUmVtb3RlCiAgIGNvbm5lY3Rpb24uKQoKCiAgIFEtNTI6IEhvdyBjYW4gSSB0dW5uZWwgbXkgY29ubmVjdGlvbiB0byB4MTF2bmMgdmlhIGFuIGVuY3J5cHRlZCBTU0wKICAgY2hhbm5lbCB1c2luZyBhbiBleHRlcm5hbCB0b29sIGxpa2Ugc3R1bm5lbD8KCiAgIEl0IGlzIHBvc3NpYmxlIHRvIHVzZSBhICJsaWdodGVyIHdlaWdodCIgZW5jcnlwdGlvbiBzZXR1cCB0aGFuIFNTSCBvcgogICBJUFNFQy4gU1NMIHR1bm5lbHMgc3VjaCBhcyBzdHVubmVsIChhbHNvIHN0dW5uZWwub3JnKSBwcm92aWRlIGFuCiAgIGVuY3J5cHRlZCBjaGFubmVsIHdpdGhvdXQgdGhlIG5lZWQgZm9yIFVuaXggdXNlcnMsIHBhc3N3b3JkcywgYW5kIGtleQogICBwYXNzcGhyYXNlcyByZXF1aXJlZCBmb3Igc3NoIChhbmQgYXQgdGhlIG90aGVyIGV4dHJlbWUgU1NMIGNhbiBhbHNvCiAgIHByb3ZpZGUgYSBjb21wbGV0ZSBzaWduZWQgY2VydGlmaWNhdGUgY2hhaW4gb2YgdHJ1c3QuKSBPbiB0aGUgb3RoZXIKICAgaGFuZCwgc2luY2UgU1NIIGlzIHVzdWFsbHkgaW5zdGFsbGVkIGV2ZXJ5d2hlcmUgYW5kIGZpcmV3YWxscyBvZnRlbgogICBsZXQgaXRzIHBvcnQgdGhyb3VnaCwgc3NoIGlzIGZyZXF1ZW50bHkgdGhlIHBhdGggb2YgbGVhc3QgcmVzaXN0YW5jZQogICAoaXQgYWxzbyBuaWNlbHkgbWFuYWdlcyBwdWJsaWMga2V5cyBmb3IgeW91LikKCiAgIFVwZGF0ZTogQXMgb2YgRmViLzIwMDYgeDExdm5jIGhhcyB0aGUgb3B0aW9ucyAtc3NsLCAtc3R1bm5lbCwgYW5kCiAgIC1zc2x2ZXJpZnkgdG8gcHJvdmlkZSBpbnRlZ3JhdGVkIFNTTCBzY2hlbWVzLiBUaGV5IGFyZSBkaXNjdXNzZWQgaW4KICAgdGhlIE5leHQgRkFRICh5b3UgcHJvYmFibHkgd2FudCB0byBza2lwIHRvIGl0IG5vdy4pCgogICBXZSBpbmNsdWRlIHRoZXNlIG5vbi1idWlsdC1pbiBtZXRob2QgZGVzY3JpcHRpb25zIGJlbG93IGZvciBoaXN0b3JpY2FsCiAgIHJlZmVyZW5jZS4gVGhleSBhcmUgaGFuZHkgYmVjYXVzZSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgU1NMIHR1bm5lbHMgdG8KICAgYW55IFZOQyAob3Igb3RoZXIgdHlwZSBvZikgc2VydmVyLgoKCiAgIEhlcmUgYXJlIHNvbWUgYmFzaWMgZXhhbXBsZXMgdXNpbmcgc3R1bm5lbCBidXQgdGhlIGdlbmVyYWwgaWRlYSBmb3IKICAgYW55IFNTTCB0dW5uZWwgdXRpbGl0eSBpcyB0aGUgc2FtZToKICAgICAqIFN0YXJ0IHVwIHgxMXZuYyBhbmQgY29uc3RyYWluIGl0IHRvIGxpc3RlbiBvbiBsb2NhbGhvc3QuCiAgICAgKiBUaGVuIHN0YXJ0IHVwIHRoZSBTU0wgdHVubmVsIHJ1bm5pbmcgb24gdGhlIHNhbWUgbWFjaGluZSB0bwogICAgICAgZm9yd2FyZCBpbmNvbWluZyBjb25uZWN0aW9ucyB0byB0aGF0IHgxMXZuYy4KICAgICAqIFNldCB1cCBhbmQgcnVuIGEgc2ltaWxhciBTU0wgdHVubmVsIGZvciB0aGUgb3V0Z29pbmcgY29ubmVjdGlvbiBvbgogICAgICAgdGhlIFZOQyB2aWV3ZXIgbWFjaGluZSBwb2ludGluZyBpdCB0byB0aGUgU1NML3gxMXZuYyBzZXJ2ZXIuCiAgICAgKiBPcHRpb25hbGx5LCBzZXQgdXAgc2VydmVyIChvciBldmVuIGNsaWVudCkgcHVibGljL3ByaXZhdGUga2V5cyBmb3IKICAgICAgIHVzZSBpbiBhdXRoZW50aWNhdGluZyBvbmUgc2lkZSB0byB0aGUgb3RoZXIuCiAgICAgKiBGaW5hbGx5LCBzdGFydCB0aGUgVk5DIFZpZXdlciBhbmQgdGVsbCBpdCB0byBjb25uZWN0IHRvIHRoZSBsb2NhbAogICAgICAgcG9ydCAoZS5nLiBhIHZuYyBkaXNwbGF5IGxvY2FsaG9zdDowKSB3aGVyZSBpdHMgb3V0Z29pbmcgU1NMCiAgICAgICB0dW5uZWwgaXMgbGlzdGVuaW5nLgoKICAgV2UnbGwgZmlyc3QgdXNlIHRoZSBzdHVubmVsIHZlcnNpb24gMyBzeW50YXggc2luY2UgaXQgaXMgdGhlIG1vc3QKICAgY29uY2lzZSBhbmQgVW5peHkuCgogICBTdGFydCB1cCB4MTF2bmMgbGlzdGVuaW5nIG9uIHBvcnQgNTkwMDoKICB4MTF2bmMgLWRpc3BsYXkgOjAgLXJmYnBvcnQgNTkwMCAtbG9jYWxob3N0IC1iZyAtcGFzc3dkZmlsZSB+L215cGFzcwoKICAgVGhlbiBzdGFydCBzdHVubmVsICh2ZXJzaW9uIDMsIG5vdCA0KSB3aXRoIHRoaXMgY29tbWFuZDoKICBzdHVubmVsIC1kIDU5MDEgLXIgNTkwMCAtcCAvcGF0aC90by9zdHVubmVsLnBlbQoKICAgVGhlIGFib3ZlIHR3byBjb21tYW5kcyBhcmUgcnVuIG9uIGhvc3QgImZhci1hd2F5LmVhc3QiLiBUaGUKICAgc3R1bm5lbC5wZW0gaXMgdGhlIHNlbGYtc2lnbmVkIFBFTSBmaWxlIGNlcnRpZmljYXRlIGNyZWF0ZWQgd2hlbgogICBzdHVubmVsIGlzIGJ1aWx0LiBPbmUgY2FuIGFsc28gY3JlYXRlIGNlcnRpZmljYXRlcyBzaWduZWQgYnkKICAgQ2VydGlmaWNhdGUgQXV0aG9yaXRpZXMgb3Igc2VsZi1zaWduZWQgaWYgZGVzaXJlZCB1c2luZyB0aGUgeDExdm5jCiAgIHV0aWxpdGllcyBkZXNjcmliZWQgdGhlcmUuCgogICBTU0wgVmlld2VyczogIE5leHQsIG9uIHRoZSBWTkMgdmlld2VyIHNpZGUgd2UgbmVlZCBhbiBTU0wgdHVubmVsIHRvCiAgIGVuY3J5cHQgdGhlIG91dGdvaW5nIGNvbm5lY3Rpb24uIFRoZSBuaWNlIHRoaW5nIGlzIGFueSBTU0wgdHVubmVsIGNhbgogICBiZSB1c2VkIGJlY2F1c2UgdGhlIHByb3RvY29sIGlzIGEgc3RhbmRhcmQuIEZvciB0aGlzIGV4YW1wbGUgd2UnbGwKICAgYWxzbyB1c2Ugc3R1bm5lbCBvbiB0aGUgdmlld2VyIHNpZGUgb24gVW5peC4gRmlyc3Qgc3RhcnQgdXAgdGhlCiAgIGNsaWVudC1zaWRlIHN0dW5uZWwgKHZlcnNpb24gMywgbm90IDQpOgogIHN0dW5uZWwgLWMgLWQgbG9jYWxob3N0OjU5MDIgLXIgZmFyLWF3YXkuZWFzdDo1OTAxCgogICBUaGVuIHBvaW50IHRoZSB2aWV3ZXIgdG8gdGhlIGxvY2FsIHR1bm5lbCBvbiBwb3J0IDU5MDI6CiAgdm5jdmlld2VyIC1lbmNvZGluZ3MgImNvcHlyZWN0IHRpZ2h0IHpybGUgaGV4dGlsZSIgbG9jYWxob3N0OjIKCiAgIFRoYXQncyBpdC4gIE5vdGUgdGhhdCB0aGUgc3Nfdm5jdmlld2VyIHNjcmlwdCBjYW4gYXV0b21hdGUgdGhpcwogICBlYXNpbHksIGFuZCBzbyBjYW4gdGhlIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpIHBhY2thZ2UuCgogICBCZSBzdXJlIHRvIHVzZSBhIFZOQyBwYXNzd29yZCBiZWNhdXNlIHVubGlrZSBzc2ggYnkgZGVmYXVsdCB0aGUKICAgZW5jcnlwdGVkIFNTTCBjaGFubmVsIHByb3ZpZGVzIG5vIGF1dGhlbnRpY2F0aW9uIChvbmx5IHByaXZhY3kuKSBXaXRoCiAgIHNvbWUgZXh0cmEgY29uZmlndXJhdGlvbiBvbmUgY291bGQgYWxzbyBzZXQgdXAgY2VydGlmaWNhdGVzIHRvIHByb3ZpZGUKICAgYXV0aGVudGljYXRpb24gb2YgZWl0aGVyIG9yIGJvdGggc2lkZXMgYXMgd2VsbCAoYW5kIGhlbmNlIGF2b2lkCiAgIG1hbi1pbi10aGUtbWlkZGxlIGF0dGFja3MuKSBTZWUgdGhlIHN0dW5uZWwgYW5kIG9wZW5zc2wgZG9jdW1lbnRhdGlvbgogICBhbmQgYWxzbyB0aGUga2V5IG1hbmFnZW1lbnQgc2VjdGlvbiBmb3IgZGV0YWlscy4KCiAgIHN0dW5uZWwgaGFzIGFsc28gYmVlbiBwb3J0ZWQgdG8gV2luZG93cywgYW5kIHRoZXJlIGFyZSBsaWtlbHkgb3RoZXJzCiAgIHRvIGNob29zZSBmcm9tIGZvciB0aGF0IE9TLiBNdWNoIGluZm8gZm9yIHVzaW5nIGl0IG9uIFdpbmRvd3MgY2FuIGJlCiAgIGZvdW5kIGF0IHRoZSBzdHVubmVsIHNpdGUgYW5kIGluIHRoaXMgYXJ0aWNsZSBUaGUgYXJ0aWNsZSBhbHNvIHNob3dzCiAgIHRoZSBkZXRhaWxlZCBzdGVwcyB0byBzZXQgdXAgYWxsIHRoZSBhdXRoZW50aWNhdGlvbiBjZXJ0aWZpY2F0ZXMuIChmb3IKICAgYm90aCBzZXJ2ZXIgYW5kIGNsaWVudHMsIHNlZSBhbHNvIHRoZSB4MTF2bmMgdXRpbGl0aWVzIHRoYXQgZG8gdGhpcy4pCiAgIFRoZSBkZWZhdWx0IFdpbmRvd3MgY2xpZW50IHNldHVwIChubyBjZXJ0cykgaXMgc2ltcGxlciBhbmQgb25seSA0CiAgIGZpbGVzIGFyZSBuZWVkZWQgaW4gYSBmb2xkZXI6IHN0dW5uZWwuZXhlLCBzdHVubmVsLmNvbmYsIGxpYnNzbDMyLmRsbCwKICAgbGliZWF5MzIuZGxsLiBXZSB1c2VkIGFuIHN0dW5uZWwuY29uZiBjb250YWluaW5nOgojIHN0dW5uZWwuY29uZjoKY2xpZW50ID0geWVzCm9wdGlvbnMgPSBBTEwKW215dm5jc3NsXQphY2NlcHQgPSBsb2NhbGhvc3Q6NTkwMgpjb25uZWN0ID0gZmFyLWF3YXkuZWFzdDo1OTAxCgogICB0aGVuIGRvdWJsZSBjbGljayBvbiB0aGUgc3R1bm5lbC5leGUgaWNvbiB0byBsYXVuY2ggaXQgKGZvbGxvd2VkIGJ5CiAgIHBvaW50aW5nIHRoZSBWTkMgdmlld2VyIHRvIGxvY2FsaG9zdDoyKS4KCgogICBzdHVubmVsIGluZXRkLWxpa2UgbW9kZToKCiAgIEFzIGFuIGFzaWRlLCBpZiB5b3UgZG9uJ3QgbGlrZSB0aGUgbGl0dGxlICJnYXAiIG9mIHVuZW5jcnlwdGVkIFRDUAogICB0cmFmZmljIChhbmQgYSBsb2NhbGhvc3QgbGlzdGVuaW5nIHNvY2tldCkgb24gdGhlIGxvY2FsIG1hY2hpbmUKICAgYmV0d2VlbiBzdHVubmVsIGFuZCB4MTF2bmMgaXQgY2FuIGFjdHVhbGx5IGJlIGNsb3NlZCBieSBoYXZpbmcgc3R1bm5lbAogICBzdGFydCB1cCB4MTF2bmMgaW4gLWluZXRkIG1vZGU6CiAgc3R1bm5lbCAtcCAvcGF0aC90by9zdHVubmVsLnBlbSAtUCBub25lIC1kIDU5MDAgLWwgLi94MTF2bmNfc2gKCiAgIFdoZXJlIHRoZSBzY3JpcHQgeDExdm5jX3NoIHN0YXJ0cyB1cCB4MTF2bmM6CiMhL2Jpbi9zaAp4MTF2bmMgLXEgLWluZXRkIC1kaXNwbGF5IDowIC1wYXNzd2RmaWxlIH4vbXlwYXNzCgogICBOb3RlIHRoYXQgdGhpcyBjcmVhdGVzIGEgc2VwYXJhdGUgeDExdm5jIHByb2Nlc3MgZm9yIGVhY2ggaW5jb21pbmcKICAgY29ubmVjdGlvbiAoYXMgYW55IGluZXRkIHgxMXZuYyB1c2FnZSB3b3VsZCksIGJ1dCBmb3IgdGhlIGNhc2Ugb2YKICAgbm9ybWFsbHkganVzdCBvbmUgdmlld2VyIGF0IGEgdGltZSBpdCBzaG91bGQgbm90IGJlIGEgYmlnIHByb2JsZW0uCgoKICAgc3R1bm5lbCA0IHN5bnRheDoKCiAgIFNvbWV3aGF0IHNhZGx5LCB0aGUgc3R1bm5lbCB2ZXJzaW9uIDQgc3ludGF4IGlzIG5vdCBzbyBhbWVuYWJsZSB0byB0aGUKICAgY29tbWFuZCBsaW5lIG9yIHNjcmlwdHMuIFlvdSBuZWVkIHRvIGNyZWF0ZSBhIGNvbmZpZyBmaWxlIHdpdGggdGhlCiAgIHBhcmFtZXRlcnMuIEUuZy46CiAgc3R1bm5lbCB4MTF2bmMuY2ZnCgogICBXaGVyZSB0aGUgZmlsZSB4MTF2bmMuY2ZnIGNvbnRhaW5zOgpmb3JlZ3JvdW5kID0geWVzCnBpZCA9CmNlcnQgPSAvcGF0aC90by9zdHVubmVsLnBlbQpbeDExdm5jX3N0dW5uZWxdCmFjY2VwdCAgPSA1OTAxCmNvbm5lY3QgPSA1OTAwCgogICBPbmUgbmljZSB0aGluZyBhYm91dCB2ZXJzaW9uIDQgaXMgb2Z0ZW4gdGhlIFBFTSBmaWxlIGRvZXMgbm90IG5lZWQgdG8KICAgYmUgc3BlY2lmaWVkIGJlY2F1c2Ugc3R1bm5lbCBmaW5kcyBpdCBpbiBpdHMgaW5zdGFsbGVkIGFyZWEuIE9uZSBvdGhlcgogICBnb3RjaGEgdGhlIFBFTSBmaWxlIGlzIHVzdWFsbHkgb25seSByZWFkYWJsZSBieSByb290IChpdCBoYXMgdGhlCiAgIHByaXZhdGUga2V5IGFmdGVyYWxsKSwgc28geW91J2xsIG5lZWQgdG8gcmVsYXggdGhlIHBlcm1pc3Npb25zIG9yIG1ha2UKICAgYSBjb3B5IHRoYXQgdGhlIHVzZXIgcnVubmluZyB4MTF2bmMvc3R1bm5lbCBjYW4gcmVhZC4KCgogICBTU0wgVk5DIFZpZXdlcnM6CgogICBSZWdhcmRpbmcgVk5DIHZpZXdlcnMgdGhhdCAibmF0aXZlbHkiIGRvIFNTTCB1bmZvcnR1bmF0ZWx5IHRoZXJlIGRvCiAgIG5vdCBzZWVtIHRvIGJlIG1hbnkuIFRoZSBTaW5nbGVDbGljayBVbHRyYVZOQyBKYXZhIFZpZXdlciBpcyBTU0wgYW5kCiAgIGlzIGNvbXBhdGlibGUgd2l0aCB4MTF2bmMncyAtc3NsIG9wdGlvbiBhbmQgc3R1bm5lbC4pIENvbW1lcmNpYWwKICAgdmVyc2lvbnMgb2YgVk5DIHNlZW0gdG8gaGF2ZSBzb21lIFNTTC1saWtlIGVuY3J5cHRpb24gYnVpbHQgaW4sIGJ1dCB3ZQogICBoYXZlbid0IHRyaWVkIHRob3NlIGVpdGhlciBhbmQgdGhleSBwcm9iYWJseSB3b3VsZG4ndCB3b3JrIHNpbmNlIHRoZWlyCiAgIChwcm9wcmlldGFyeSkgU1NMLWxpa2UgbmVnb3RpYXRpb24gaXMgbGlrZWx5IGVtYmVkZGVkIGluIHRoZSBWTkMKICAgcHJvdG9jb2wgdW5saWtlIG91ciBjYXNlIHdoZXJlIGl0IGlzIGV4dGVybmFsLgoKICAgTm90ZTogYXMgb2YgTWFyLzIwMDYgbGlidm5jc2VydmVyL3gxMXZuYyBwcm92aWRlcyBhIFNTTC1lbmFibGVkIEphdmEKICAgYXBwbGV0IHRoYXQgY2FuIGJlIHNlcnZlZCB1cCB2aWEgdGhlIC1odHRwZGlyIG9yIC1odHRwIG9wdGlvbnMgd2hlbgogICAtc3NsIGlzIGVuYWJsZWQuIEl0IHdpbGwgYWxzbyBiZSBzZXJ2ZWQgdmlhIEhUVFBTIHZpYSBlaXRoZXIgdGhlIFZOQwogICBwb3J0IChlLmcuIGh0dHBzOi8vaG9zdDo1OTAwLykgb3IgYSAybmQgcG9ydCB2aWEgdGhlIC1odHRwcyBvcHRpb24uCgogICBJbiBnZW5lcmFsIGN1cnJlbnQgU1NMIFZOQyBzb2x1dGlvbnMgYXJlIG5vdCBwYXJ0aWN1bGFybHkgInNlZW1sZXNzIi4KICAgQnV0IGl0IGNhbiBiZSBkb25lLCBhbmQgd2l0aCBhIHdyYXBwZXIgc2NyaXB0IG9uIHRoZSB2aWV3ZXIgc2lkZSBhbmQKICAgdGhlIC1zdHVubmVsIG9yIC1zc2wgb3B0aW9uIG9uIHRoZSBzZXJ2ZXIgc2lkZSBpdCB3b3JrcyB3ZWxsIGFuZCBpcwogICBjb252ZW5pZW50LiBIZXJlIGlzIGEgc2ltcGxlIHNjcmlwdCBzc192bmN2aWV3ZXIgdGhhdCBhdXRvbWF0ZXMKICAgcnVubmluZyBzdHVubmVsIG9uIHRoZSBWTkMgdmlld2VyIHNpZGUgb24gVW5peCBhIGxpdHRsZSBtb3JlIGNhcmVmdWxseQogICB0aGFuIHRoZSBjb21tYW5kcyBwcmludGVkIGFib3ZlLiAoT25lIGNvdWxkIHByb2JhYmx5IGRvIGEgc2ltaWxhcgogICB0aGluZyB3aXRoIGEgLkJBVCBmaWxlIG9uIFdpbmRvd3MgaW4gdGhlIHN0dW5uZWwgZm9sZGVyLikKCiAgIFVwZGF0ZSBKdWwvMjAwNjogd2Ugbm93IHByb3ZpZGUgYW4gRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykKICAgcGFja2FnZSB0aGF0IHN0YXJ0cyB1cCBTVFVOTkVMIGF1dG9tYXRpY2FsbHkgYWxvbmcgd2l0aCBzb21lIG90aGVyCiAgIGZlYXR1cmVzLiBBbGwgYmluYXJpZXMgKHN0dW5uZWwsIHZuY3ZpZXdlciwgYW5kIHNvbWUgdXRpbGl0aWVzKSBhcmUKICAgcHJvdmlkZWQgaW4gdGhlIHBhY2thZ2UuIEl0IHdvcmtzIG9uIFVuaXgsIE1hYyBPUyBYLCBhbmQgV2luZG93cy4KCgogICBRLTUzOiBEb2VzIHgxMXZuYyBoYXZlIGJ1aWx0LWluIFNTTCB0dW5uZWxpbmc/CgogICBZb3UgY2FuIHJlYWQgYWJvdXQgbm9uLWJ1aWx0LWluIG1ldGhvZHMgaW4gdGhlIFByZXZpb3VzIEZBUSBmb3IKICAgYmFja2dyb3VuZC4KCiAgIFNTTCB0dW5uZWxzIHByb3ZpZGUgYW4gZW5jcnlwdGVkIGNoYW5uZWwgd2l0aG91dCB0aGUgbmVlZCBmb3IgVW5peAogICB1c2VycywgcGFzc3dvcmRzLCBhbmQga2V5IHBhc3NwaHJhc2VzIHJlcXVpcmVkIGZvciBzc2ggKGFuZCBhdCB0aGUKICAgb3RoZXIgZXh0cmVtZSBTU0wgY2FuIGFsc28gcHJvdmlkZSBhIGNvbXBsZXRlIHNpZ25lZCBjZXJ0aWZpY2F0ZSBjaGFpbgogICBvZiB0cnVzdC4pIE9uIHRoZSBvdGhlciBoYW5kLCBzaW5jZSBTU0ggaXMgdXN1YWxseSBpbnN0YWxsZWQKICAgZXZlcnl3aGVyZSBhbmQgZmlyZXdhbGxzIG9mdGVuIGxldCBpdHMgcG9ydCB0aHJvdWdoLCBzc2ggaXMgZnJlcXVlbnRseQogICB0aGUgcGF0aCBvZiBsZWFzdCByZXNpc3RhbmNlLgoKICAgQnVpbHQtaW4gU1NMIHgxMXZuYyBvcHRpb25zOgoKICAgQXMgb2YgRmViLzIwMDYgdGhlIHgxMXZuYyAtc3NsIG9wdGlvbiBhdXRvbWF0ZXMgdGhlIFNTTCB0dW5uZWwKICAgY3JlYXRpb24gb24gdGhlIHgxMXZuYyBzZXJ2ZXIgc2lkZS4gQW4gU1NMLWVuYWJsZWQgSmF2YSBWaWV3ZXIgYXBwbGV0CiAgIGlzIGFsc28gcHJvdmlkZWQgdGhhdCBjYW4gYmUgc2VydmVkIHZpYSBIVFRQIG9yIEhUVFBTIHRvIGF1dG9tYXRlIFNTTAogICBvbiB0aGUgY2xpZW50IHNpZGUuCgogICBUaGUgLXNzbCBtb2RlIHVzZXMgdGhlIHd3dy5vcGVuc3NsLm9yZyBsaWJyYXJ5IGlmIGF2YWlsYWJsZSBhdCBidWlsZAogICB0aW1lLgoKICAgVGhlIG1vZGUgcmVxdWlyZXMgYW4gU1NMIGNlcnRpZmljYXRlIGFuZCBrZXkgKGkuZS4gLnBlbSBmaWxlLikgVGhlc2UKICAgYXJlIHVzdWFsbHkgY3JlYXRlZCB2aWEgdGhlIG9wZW5zc2woMSkgcHJvZ3JhbSAoaW4gZmFjdCBpbiBmb3IgIi1zc2wiCiAgIChzYW1lIGFzICItc3NsIFNBVkUiKSBpdCB3aWxsIHJ1biBvcGVuc3NsIGZvciB5b3UgYXV0b21hdGljYWxseS4pIFNvCiAgIHRoZSBTU0wgaXMgbm90IGNvbXBsZXRlbHkgImJ1aWx0LWluIiBzaW5jZSB0aGlzIGV4dGVybmFsIHRvb2wgbmVlZHMgdG8KICAgYmUgaW5zdGFsbGVkLCBidXQgYXQgbGVhc3QgeDExdm5jIHJ1bnMgaXQgZm9yIHlvdSBhdXRvbWF0aWNhbGx5LgoKICAgQW4gLXNzbCBleGFtcGxlOgogIHgxMXZuYyAtZGlzcGxheSA6MCAtc3NsIC1wYXNzd2RmaWxlIH4vbXlwYXNzCgogICBZb3UnbGwgZ2V0IG91dHB1dCBsaWtlIHRoaXM6CiAgMDkvMDQvMjAwNiAxOToyNzozNSBDcmVhdGluZyBhIHNlbGYtc2lnbmVkIFBFTSBjZXJ0aWZpY2F0ZS4uLgogIDA5LzA0LzIwMDYgMTk6Mjc6MzUKICAuLi4KCiAgVGhlIFNTTCBWTkMgZGVza3RvcCBpczogIGZhci1hd2F5LmVhc3Q6MAogIFBPUlQ9NTkwMAogIFNTTFBPUlQ9NTkwMAoKICAgSW4gdGhpcyBjYXNlIG9wZW5zc2woMSkgd2FzIHVzZWQgdG8gY3JlYXRlIGEgUEVNIGF1dG9tYXRpY2FsbHkuIEl0CiAgIHdpbGwgcHJvbXB0IHlvdSBpZiB5b3Ugd2FudCB0byBwcm90ZWN0IGl0IHdpdGggd2l0aCBhIHBhc3NwaHJhc2UuIFVzZQogICAiLXNzbCBTQVZFX05PUFJPTVBUIiB0byBub3QgYmUgcHJvbXB0ZWQuIFVzZSAiLXNzbCBUTVAiIHRvIGNyZWF0ZSBhCiAgIHRlbXBvcmFyeSBzZWxmLXNpZ25lZCBjZXJ0IHRoYXQgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiB4MTF2bmMgZXhpdHMuCgogICBVcGRhdGU6IEFzIG9mIE5vdi8yMDA4IHgxMXZuYyBhbHNvIHN1cHBvcnRzIHRoZSBWZU5DcnlwdCBTU0wvVExTCiAgIHR1bm5lbCBleHRlbnNpb24gdG8gdGhlIFZOQyBwcm90b2NvbC4gVGhlIG9sZGVyIEFOT05UTFMgbWV0aG9kICh2aW5vKQogICBpcyBhbHNvIHN1cHBvcnRlZC4gVGhpcyBzdXBwb3J0IGlzIG9uIGJ5IGRlZmF1bHQgd2hlbiB0aGUgLXNzbCBvcHRpb24KICAgaXMgaW4gdXNlIGFuZCBjYW4gYmUgZmluZS10dW5lZCB1c2luZyB0aGVzZSBvcHRpb25zOiAtdmVuY3J5cHQsCiAgIC1hbm9udGxzLCBhbmQgLXNzbG9ubHkuCgogICBUaGUgbm9ybWFsIHgxMXZuYyAtc3NsIG9wZXJhdGlvbiBpcyBzb21ld2hhdCBsaWtlIGEgVVJMIG1ldGhvZAogICB2bmNzOi8vaG9zdG5hbWUgaWYgdm5jOi8vaG9zdG5hbWUgaW5kaWNhdGVzIGEgc3RhbmRhcmQgdW5lbmNyeXB0ZWQgVk5DCiAgIGNvbm5lY3Rpb24uIEp1c3QgYXMgaHR0cHM6Ly9ob3N0bmFtZSBpcyBhbiBTU0wgZW5jcnlwdGVkIHZlcnNpb24gb2YKICAgaHR0cDovL2hvc3RuYW1lLiBUaGUgZW50aXJlIFZOQyBzZXNzaW9uIGdvZXMgdGhyb3VnaCB0aGUgU1NMIHR1bm5lbC4KICAgVmVOQ3J5cHQsIG9uIHRoZSBvdGhlciBoYW5kLCBzd2l0Y2hlcyB0byBTU0wvVExTIGVhcmx5IGluIHRoZSBWTkMKICAgcHJvdG9jb2wgaGFuZHNoYWtlLiB4MTF2bmMgMC45LjYgc3VwcG9ydHMgYm90aCBzaW11bHRhbmVvdXNseSB3aGVuCiAgIC1zc2wgaXMgYWN0aXZlLgoKCiAgIFNTTCBWTkMgVmlld2VyczouIFZpZXdlci1zaWRlIHdpbGwgbmVlZCB0byB1c2UgU1NMIGFzIHdlbGwuIFNlZSB0aGUKICAgbmV4dCBGQVEgYW5kIGhlcmUgZm9yIFNTTCBlbmFibGVkIFZOQyBWaWV3ZXJzLCBpbmNsdWRpbmcgU1NWTkMsIHRvCiAgIGNvbm5lY3QgdG8gdGhlIGFib3ZlIHgxMXZuYyB2aWEgU1NMLgoKCiAgIEFzIHNlZW4gYWJvdmUsIHRoZSBQRU0gKHByaXZhY3kgZW5oYW5jZWQgbWFpbCkgZmlsZSBkb2VzIG5vdCBuZWVkIHRvCiAgIGJlIHN1cHBsaWVkIGlmIHRoZSBvcGVuc3NsKDEpIGNvbW1hbmQgaXMgYXZhaWxhYmxlIGluIFBBVEgsIGluIHRoYXQKICAgY2FzZSBhIHNlbGYtc2lnbmVkLCBjZXJ0aWZpY2F0ZSBnb29kIHRoZSBjdXJyZW50IGFuZCBzdWJzZXF1ZW50IHgxMXZuYwogICBzZXNzaW9ucyBpcyBjcmVhdGVkICh0aGlzIG1heSB0YWtlIGEgd2hpbGUgb24gdmVyeSBzbG93IG1hY2hpbmVzLikKCiAgIEluIGdlbmVyYWwsIHRoZSBQRU0gZmlsZSBjb250YWlucyBib3RoIHRoZSBDZXJ0aWZpY2F0ZSAoaS5lLiBwdWJsaWMKICAga2V5KSBhbmQgdGhlIFByaXZhdGUgS2V5LiBCZWNhdXNlIG9mIHRoZSBsYXR0ZXIsIHRoZSBmaWxlIHNob3VsZCBiZQogICBwcm90ZWN0ZWQgZnJvbSBiZWluZyByZWFkIGJ5IHVudHJ1c3RlZCB1c2Vycy4gVGhlIGJlc3Qgd2F5IHRvIGRvIHRoaXMKICAgaXMgdG8gZW5jcnlwdCB0aGUga2V5IHdpdGggYSBwYXNzcGhyYXNlIChub3RlIGhvd2V2ZXIgdGhpcyByZXF1aXJlcwogICBzdXBwbHlpbmcgdGhlIHBhc3NwaHJhc2UgZWFjaCB0aW1lIHgxMXZuYyBpcyBzdGFydGVkIHVwLikKCiAgIFNlZSB0aGUgZGlzY3Vzc2lvbiBvbiB4MTF2bmMgS2V5IE1hbmFnZW1lbnQgZm9yIHNvbWUgdXRpbGl0aWVzCiAgIHByb3ZpZGVkIGZvciBjcmVhdGluZyBhbmQgbWFuYWdpbmcgY2VydGlmaWNhdGVzIGFuZCBrZXlzIGFuZCBldmVuIGZvcgogICBjcmVhdGluZyB5b3VyIG93biBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKSBmb3Igc2lnbmluZyBWTkMgc2VydmVyCiAgIGFuZCBjbGllbnQgY2VydGlmaWNhdGVzLiBUaGlzIG1heSBiZSBkb25lIGJ5IGltcG9ydGluZyB0aGUgY2VydGlmaWNhdGUKICAgaW50byBXZWIgQnJvd3NlciBvciBKYXZhIHBsdWdpbiBrZXlzdG9yZXMsIG9yIHBvaW50aW5nIHN0dW5uZWwgdG8gaXQuCiAgIFRoZSB3cmFwcGVyIHNjcmlwdCBzc192bmN2aWV3ZXIgcHJvdmlkZXMgYW4gZXhhbXBsZSBvbiB1bml4IChzZWUgdGhlCiAgIC12ZXJpZnkgb3B0aW9uLikKCiAgIEhlcmUgYXJlIHNvbWUgbm90ZXMgb24gdGhlIHNpbXBsZXIgZGVmYXVsdCAobm9uLUNBKSBvcGVyYXRpb24uIFRvIGhhdmUKICAgeDExdm5jIHNhdmUgdGhlIGdlbmVyYXRlZCBjZXJ0aWZpY2F0ZSBhbmQga2V5LCB1c2UgdGhlICJTQVZFIiBrZXl3b3JkCiAgIGxpa2UgdGhpczoKICB4MTF2bmMgLXNzbCBTQVZFIC1kaXNwbGF5IDowIC4uLgoKICAgKHRoaXMgaXMgdGhlIHNhbWUgYXMgdGhlIGRlZmF1bHQ6ICItc3NsIi4pIFRoaXMgd2F5IGl0IHdpbGwgYmUgc2F2ZWQKICAgaW4gdGhlIGRlZmF1bHQgZGlyZWN0b3J5IH4vLnZuYy9jZXJ0cy8gYXMgc2VydmVyLmNydCAodGhlIGNlcnRpZmljYXRlCiAgIG9ubHkpIGFuZCBzZXJ2ZXIucGVtIChib3RoIGNlcnRpZmljYXRlIGFuZCBwcml2YXRlIGtleS4pIFRoaXMgb3BlbnMgdXAKICAgdGhlIHBvc3NpYmlsaXR5IG9mIGNvcHlpbmcgdGhlIHNlcnZlci5jcnQgdG8gbWFjaGluZXMgd2hlcmUgdGhlIFZOQwogICBWaWV3ZXIgd2lsbCBiZSBydW4gdG8gZW5hYmxlIGF1dGhlbnRpY2F0aW5nIHRoZSB4MTF2bmMgU1NMIFZOQyBzZXJ2ZXIKICAgdG8gdGhlIGNsaWVudHMuIFdoZW4gYXV0aGVudGljYXRpb24gdGFrZXMgcGxhY2UgdGhpcyB3YXkgKG9yIHZpYSB0aGUKICAgbW9yZSBzb3BoaXN0aWNhdGVkIENBIHNpZ25pbmcgZGVzY3JpYmVkIGhlcmUpLCB0aGVuCiAgIE1hbi1Jbi1UaGUtTWlkZGxlLUF0dGFja3MgYXJlIHByZXZlbnRlZC4gT3RoZXJ3aXNlLCB0aGUgU1NMIGVuY3J5cHRpb24KICAgb25seSBwcm92aWRlcyBwcm90ZWN0aW9uIGFnYWluc3QgcGFzc2l2ZSBuZXR3b3JrIHRyYWZmaWMgInNuaWZmaW5nIgogICAoaS5lLiB5b3UgYXJlIG5vdCBwcm90ZWN0ZWQgYWdhaW5zdCBNLUktVC1NIGF0dGFja3MuKSBOb3dhZGF5cywgbW9zdAogICBwZW9wbGUgc2VlbSBtb3N0bHkgY29uY2VybmVkIG1haW5seSBhYm91dCBwYXNzaXZlIHNuaWZmaW5nIChhbmQgdGhlCiAgIGRlZmF1bHQgeDExdm5jIFNTTCBtb2RlIHByb3RlY3RzIGFnYWluc3QgaXQuKSBOb3RlIHRoYXQgdGhlcmUgYXJlCiAgIGhhY2tlciB0b29scyBsaWtlIGRzbmlmZi93ZWJtaXRtIGFuZCBjYWluIHRoYXQgaW1wbGVtZW50IFNTTAogICBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLiBUaGV5IHJlbHkgb24gdGhlIGNsaWVudCBub3QgYm90aGVyaW5nIHRvCiAgIGNoZWNrIHRoZSBjZXJ0LgoKCiAgIE9uZSBjYW4gdGVzdCB0byBzb21lIGRlZ3JlZSB0aGF0IFNTTCBpcyB3b3JraW5nIGFmdGVyIHN0YXJ0aW5nIHgxMXZuYwogICB3aXRoIHRoZSAtc3R1bm5lbCBvciAtc3NsIG9wdGlvbi4gRnJvbSBhbm90aGVyIG1hY2hpbmUgb25lIGNhbiB1c2UgdGhlCiAgIG9wZW5zc2wgY29tbWFuZCBzb21ldGhpbmcgbGlrZSB0aGlzOgogb3BlbnNzbCBzX2NsaWVudCAtZGVidWcgLW1zZyAtc2hvd2NlcnRzIC1jb25uZWN0IGZhci1hd2F5LmVhc3Q6NTkwMAoKICAgQWZ0ZXIgYWxsIG9mIHRoZSBkZWJ1Z2dpbmcgb3V0cHV0IGFuZCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzIHlvdSdsbAogICBzZWUgdGhlIHN0cmluZyAiUkZCIDAwMy4wMDgiIHRoYXQgY2FtZSBmcm9tIHgxMXZuYy4gUG9pbnRpbmcgYSB3ZWIKICAgYnJvd3NlciBjb25uZWN0aW5nIHRvOiBodHRwczovL2Zhci1hd2F5LmVhc3Q6NTkwMC8gYW5kIHRoZW4gdmlld2luZwogICB0aGUgU1NMIGNlcnRpZmljYXRlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25uZWN0aW9uIGluIHRoZSBwYW5lbHMKICAgd2lsbCBhbHNvIHdvcmsuCgogICBOb3RlOiBJZiB5b3Ugc2VydmUgdXAgdGhlIFNTTCBlbmFibGVkIEphdmEgVk5DIFZpZXdlciB2aWEgc29tZXRoaW5nCiAgIGxpa2U6CiB4MTF2bmMgLXNzbCAtaHR0cGRpciAvdXNyL2xvY2FsL3NoYXJlL3gxMXZuYy9jbGFzc2VzL3NzbAoKICAgKG9yIGp1c3QgdGhlIC1odHRwIG9wdGlvbiksIHlvdSBjYW4gdGVzdCBpdCBvdXQgY29tcGxldGVseSB1c2luZyB0aGF0LAogICBpbmNsdWRpbmcgdXNpbmcgaHR0cHMgdG8gZG93bmxvYWQgaXQgaW50byB0aGUgYnJvd3NlciBhbmQgY29ubmVjdCB0bwogICB4MTF2bmMuCgoKICAgVGhlIG9sZGVyIC1zdHVubmVsIG9wdGlvbjogQmVmb3JlIHRoZSAtc3NsIG9wdGlvbiB0aGVyZSB3YXMgYQogICBjb252ZW5pZW5jZSBvcHRpb24gLXN0dW5uZWwgdGhhdCB3b3VsZCBzdGFydCBhbiBleHRlcm5hbCBTU0wgdHVubmVsCiAgIGZvciB5b3UgdXNpbmcgc3R1bm5lbC4gVGhlIC1zc2wgbWV0aG9kIGlzIHRoZSBwcmVmZXJyZWQgd2F5LCBidXQgZm9yCiAgIGhpc3RvcmljYWwgcmVmZXJlbmNlIHdlIGtlZXAgdGhlIC1zdHVubmVsIGluZm8gaGVyZS4KCiAgIFRoZSAtc3R1bm5lbCBtb2RlIHJlcXVpcmVzIHRoZSBzdHVubmVsLm1pcnQubmV0IGNvbW1hbmQgc3R1bm5lbCg4KSB0bwogICBiZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbS4KCiAgIFNvbWUgLXN0dW5uZWwgZXhhbXBsZXM6CiAgeDExdm5jIC1kaXNwbGF5IDowIC1zdHVubmVsIC9wYXRoL3RvL3N0dW5uZWwucGVtIC1wYXNzd2RmaWxlIH4vbXlwYXNzCgogIHgxMXZuYyAtZGlzcGxheSA6MCAtc3R1bm5lbCBTQVZFIC4uLgoKICAgWW91J2xsIGdldCBvdXRwdXQgbGlrZSB0aGlzOgogIFRoZSBWTkMgZGVza3RvcCBpczogICAgICBsb2NhbGhvc3Q6NTAKICBUaGUgU1NMIFZOQyBkZXNrdG9wIGlzOiAgZmFyLWF3YXkuZWFzdDowCiAgUE9SVD01OTUwCiAgU1NMUE9SVD01OTAwCgogICBUaGF0IGluZGljYXRlcyBzdHVubmVsIGlzIGxpc3RlbmluZyBvbiBwb3J0IDU5MDAgZm9yIGluY29taW5nCiAgIFNTTC13cmFwcGVkIFZOQyBjb25uZWN0aW9ucyBmcm9tIHZpZXdlcnMuIHgxMXZuYyBpcyBsaXN0ZW5pbmcgZm9yCiAgIGxvY2FsIGNvbm5lY3Rpb25zIG9uIHBvcnQgNTk1MCBpbiB0aGlzIGNhc2UgKHJlbW90ZSB2aWV3ZXJzIGNhbm5vdAogICBjb25uZWN0IHRvIGl0IGRpcmVjdGx5LikgRm9yIC1zdHVubmVsIHRvIHdvcmsgdGhlIHN0dW5uZWwgY29tbWFuZCBtdXN0CiAgIGJlIGluc3RhbGxlZCBvbiB0aGUgbWFjaGluZSBhbmQgYXZhaWxhYmxlIGluIFBBVEggKG5vdGUgc3R1bm5lbCBpcwogICBvZnRlbiBpbnN0YWxsZWQgaW4gc2JpbiBkaXJlY3RvcmllcyByYXRoZXIgdGhhbiBiaW4uKSBOb3RlIHRoYXQgdGhlCiAgIGRlZmF1bHQgIi1zdHVubmVsIiBieSBpdHNlbGYgY3JlYXRlcyBhIHRlbXBvcmFyeSBjZXJ0IChhcyBpbiAiLXNzbAogICBUTVAiLikKCgogICBRLTU0OiBIb3cgZG8gSSB1c2UgVk5DIFZpZXdlcnMgd2l0aCBidWlsdC1pbiBTU0wgdHVubmVsaW5nPwoKICAgTm90ZXMgb24gdXNpbmcgIm5hdGl2ZSIgVk5DIFZpZXdlcnMgd2l0aCBTU0w6CgogICBUaGVyZSBhcmVuJ3QgYW55IG5hdGl2ZSBWTkMgVmlld2VycyB0aGF0IGRvIFNTTCAoYXNrIHlvdXIgVk5DIHZpZXdlcgogICBkZXZlbG9wZXIgdG8gYWRkIHRoZSBmZWF0dXJlLikgU28gYSB0dW5uZWwgbXVzdCBiZSBzZXR1cCB0aGF0IHlvdQogICBwb2ludCB0aGUgVk5DIFZpZXdlciB0by4gVGhpcyBpcyBvZnRlbiBTVFVOTkVMLiBZb3UgY2FuIGRvIHRoaXMKICAgbWFudWFsbHksIG9yIHVzZSB0aGUgc3Nfdm5jdmlld2VyIHNjcmlwdCBvbiBVbml4LCBvciBvdXIgRW5oYW5jZWQKICAgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgcGFja2FnZSBvbiBVbml4LCBXaW5kb3dzLCBvciBNYWNPU1guIFNlZSB0aGUKICAgbmV4dCBzZWN0aW9uIGZvciBKYXZhIFdlYiBicm93c2VyIFNTTCBWTkMgVmlld2VycyAoeW91IG9ubHkgbmVlZCBhCiAgIEphdmEtZW5hYmxlZCBXZWIgYnJvd3NlciBmb3IgaXQgdG8gd29yay4pCgogICBOb3RlcyBvbiB0aGUgU1NMIGVuYWJsZWQgSmF2YSBWTkMgVmlld2VyIHByb3ZpZGVkIGluIHgxMXZuYwogICBjbGFzc2VzL3NzbC9WbmNWaWV3ZXIuamFyOgoKICAgQSBKYXZhIGFwcGxldCBWTkMgVmlld2VyIGFsbG93cyB5b3UgdG8gY29ubmVjdCB0byBhIFZOQyBTZXJ2ZXIgZnJvbSBhCiAgIEphdmEtZW5hYmxlZCBXZWIgYnJvd3Nlci4KCiAgIFRoZSBTU0wgZW5hYmxlZCBKYXZhIFZOQyBWaWV3ZXIgKFZuY1ZpZXdlci5qYXIpIGluIHRoZSB4MTF2bmMgcGFja2FnZQogICBzdXBwb3J0cyBvbmx5IFNTTCBiYXNlZCBjb25uZWN0aW9ucyBieSBkZWZhdWx0LiBBcyBtZW50aW9uZWQgYWJvdmUgdGhlCiAgIC1odHRwZGlyIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggdG8gLi4uL2NsYXNzZXMvc3NsLiBBIHR5cGljYWwKICAgbG9jYXRpb24gbWlnaHQgYmUgL3Vzci9sb2NhbC9zaGFyZS94MTF2bmMvY2xhc3Nlcy9zc2wuIE9yIC1odHRwIGNhbiBiZQogICB1c2VkIHRvIHRyeSB0byBoYXZlIGl0IGZpbmQgdGhlIGRpcmVjdG9yeSBhdXRvbWF0aWNhbGx5LgoKICAgQWxzbyBub3RlIHRoYXQgdGhlIFNpbmdsZUNsaWNrIFVsdHJhVk5DIEphdmEgVmlld2VyIGlzIGNvbXBhdGlibGUgd2l0aAogICB4MTF2bmMncyAtc3NsIFNTTCBtb2RlLiAoV2UgdGVzdGVkIGl0IHRoaXMgd2F5OiAiamF2YSAtY3AKICAgLi9WbmNWaWV3ZXIuamFyIFZuY1ZpZXdlciBIT1NUIGZhci1hd2F5LmVhc3QgUE9SVCA1OTAwIFVTRVNTTCAxCiAgIFRSVVNUQUxMIDEiKQoKICAgVGhlIEphdmEgdmlld2VyIHVzZXMgU1NMIHRvIGNvbW11bmljYXRlIHNlY3VyZWx5IHdpdGggeDExdm5jLiBOb3RlCiAgIHRoYXQgdGhlIGFwcGxldCBjYW4gb3B0aW9uYWxseSBhbHNvIGJlIGRvd25sb2FkZWQgaW50byB5b3VyIHdlYgogICBicm93c2VyIHZpYSBIVFRQUyAod2hpY2ggaXMgSFRUUCBvdmVyIFNTTC4pIFRoaXMgd2F5IHRoZSBIVE1MIHBhZ2UgYW5kCiAgIHRoZSBKYXZhIGFwcGxldCBpdHNlbGYgYXJlIGFsc28gZGVsaXZlcmVkIHNlY3VyZWx5IHdpdGggU1NMIChhcwogICBvcHBvc2VkIHRvIG9ubHkgdGhlIFZOQyB0cmFmZmljIGJlaW5nIGVuY3J5cHRlZCB3aXRoIFNTTC4pCgogICBGb3IgdGhpcyBjYXNlIHRoZSBvdXRwdXQgd2lsbCBiZSBzb21ldGhpbmcgbGlrZSB0aGlzOgogIHgxMXZuYyAtc3NsIFNBVkUgLWh0dHAKICAuLi4KICBUaGUgU1NMIFZOQyBkZXNrdG9wIGlzOiAgZmFyLWF3YXkuZWFzdDowCiAgSmF2YSBTU0wgdmlld2VyIFVSTDogICAgIGh0dHBzOi8vZmFyLWF3YXkuZWFzdDo1OTAwLwogIEphdmEgU1NMIHZpZXdlciBVUkw6ICAgICBodHRwOi8vZmFyLWF3YXkuZWFzdDo1ODAwLwogIFBPUlQ9NTkwMAogIFNTTFBPUlQ9NTkwMAoKICAgSW5kaWNhdGluZyB0aGUgdHdvIFVSTHMgKHRoZSBmaXJzdCBvbmUgZW5jcnlwdGVkLCB0aGUgc2Vjb25kIG5vdCkgb25lCiAgIGNvdWxkIHBvaW50IHRoZSB3ZWIgYnJvd3NlciBhdCB0byBnZXQgdGhlIFZOQyB2aWV3ZXIgYXBwbGV0LiBFLmcuIHB1dAogICB0aGlzCiAgIGh0dHA6Ly9mYXItYXdheS5lYXN0OjU4MDAvCgogICBvcjoKICAgaHR0cHM6Ly9mYXItYXdheS5lYXN0OjU5MDAvCgogICBpbnRvIHlvdXIgSmF2YS1lbmFibGVkIFdlYiBicm93c2VyLgoKICAgTm90ZSB0aGF0IEtERSdzIEtvbnF1ZXJvciB3ZWIgYnJvd3NlciBzZWVtcyB0byBoYXZlIHByb2JsZW1zIHdpdGgKICAgaHR0cHMgSmF2YSBhcHBsZXRzLCBzbyB5b3UnbGwgaGF2ZSB0byB1c2UgdGhlIGh0dHAvNTgwMCB3aXRoIGl0IChpZgogICB5b3UgZ2V0IGh0dHBzLzU5MDAgd29ya2luZyBsZXQgdXMga25vdyBob3cgeW91IGRpZCBpdC4pCgogICBJZiB5b3UgYXJlIHVzaW5nIGEgcm91dGVyL2ZpcmV3YWxsIHdpdGggcG9ydC1yZWRpcmVjdGlvbiwgYW5kIHlvdSBhcmUKICAgcmVkaXJlY3RpbmcgcG9ydHMgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCBvbmVzICg1ODAwLCA1OTAwKSBsaXN0ZWQKICAgYWJvdmUgc2VlIGhlcmUuCgogICBUaGUgaHR0cHMgc2VydmljZSBwcm92aWRlZCB0aHJ1IHRoZSBhY3R1YWwgVk5DIHBvcnQgKDU5MDAgaW4gdGhlIGFib3ZlCiAgIGV4YW1wbGUpIGNhbiBvY2Nhc2lvbmFsbHkgYmUgc2xvdyBvciB1bnJlbGlhYmxlIChpdCBoYXMgdG8gcmVhZCBzb21lCiAgIGlucHV0IGFuZCB0cnkgdG8gZ3Vlc3MgaWYgdGhlIGNvbm5lY3Rpb24gaXMgVk5DIG9yIEhUVFAuKSBJZiBpdCBpcwogICB1bnJlbGlhYmxlIGZvciB5b3UgYW5kIHlvdSBzdGlsbCB3YW50IHRvIHNlcnZlIHRoZSBKYXZhIGFwcGxldCB2aWEKICAgaHR0cHMsIHVzZSB0aGUgLWh0dHBzIG9wdGlvbiB0byBnZXQgYW4gYWRkaXRpb25hbCBwb3J0IGRlZGljYXRlZCB0bwogICBodHRwcyAoaXRzIFVSTCB3aWxsIGFsc28gYmUgcHJpbnRlZCBpbiB0aGUgb3V0cHV0LikKCiAgIEFub3RoZXIgcG9zc2liaWxpdHkgaXMgdG8gYWRkIHRoZSBHRVQgYXBwbGV0IHBhcmFtZXRlcjoKICBodHRwczovL2Zhci1hd2F5LmVhc3Q6NTkwMC8/R0VUPTEKCiAgIFRoaXMgd2lsbCBoYXZlIHRoZSBWTkMgVmlld2VyIHNlbmQgYSBzcGVjaWFsIEhUVFAgR0VUIHN0cmluZyAiR0VUCiAgIC9yZXF1ZXN0Lmh0dHBzLnZuYy5jb25uZWN0aW9uIEhUVFAvMS4wIiB0aGF0IHgxMXZuYyB3aWxsIG5vdGljZSBtb3JlCiAgIHF1aWNrbHkgYXMgYSByZXF1ZXN0IGZvciBhIFZOQyBjb25uZWN0aW9uLiBPdGhlcndpc2UgaXQgbXVzdCB3YWl0IGZvcgogICBhIHRpbWVvdXQgdG8gZXhwaXJlIGJlZm9yZSBpdCBhc3N1bWVzIGEgVk5DIGNvbm5lY3Rpb24uCgogICBZb3UgbWF5IGFsc28gdXNlICJ1cmxQcmVmaXg9c29tZXN0cmluZyIgdG8gaGF2ZSAvc29tZXN0cmluZyBwcmVwZW5kZWQKICAgdG8gL3JlcXVlc3QuaHR0cHMudm5jLmNvbm5lY3Rpb24iLiBQZXJoYXBzIHlvdSBhcmUgdXNpbmcgYSB3ZWIgc2VydmVyCiAgIHByb3h5IHNjaGVtZSB0byBlbnRlciBhIGZpcmV3YWxsIG9yIG90aGVyd2lzZSBoYXZlIHJ1bGVzIGFwcGxpZWQgdG8KICAgdGhlIFVSTC4gSWYgeW91IG5lZWQgdG8gaGF2ZSBhbnkgc2xhc2hlcyAiLyIgaW4gInNvbWVzdHJpbmciIHVzZQogICAiXzJGXyIgKGEgZGVmaWNpZW5jeSBpbiBsaWJ2bmNzZXJ2ZXIgcHJldmVudHMgdXNpbmcgdGhlIG1vcmUgbmF0dXJhbAogICAiJTJGIi4pCgogICBZb3UgYXBwbHkgbXVsdGlwbGUgYXBwbGV0IHBhcmFtZXRlcnMgaW4gdGhlIHJlZ3VsYXIgVVJMIHdheSwgZS5nLjoKICBodHRwczovL2Zhci1hd2F5LmVhc3Q6NTkwMC8/R0VUPTEmdXJsUHJlZml4PW15c3ViZGlyJi4uLgoKICAgQWxsIG9mIHRoZSB4MTF2bmMgSmF2YSBWaWV3ZXIgYXBwbGV0IHBhcmFtZXRlcnMgYXJlIGRlc2NyaWJlZCBpbiB0aGUKICAgZmlsZSBjbGFzc2VzL3NzbC9SRUFETUUKCgogICBUaXBzIG9uIEdldHRpbmcgdGhlIFNTTCBKYXZhIEFwcGxldCBXb3JraW5nIHRoZSBGaXJzdCBUaW1lOgogICBVbmZvcnR1bmF0ZWx5LCBpdCBjYW4gYmUgYSBsaXR0bGUgdHJpY2t5IGdldHRpbmcgdGhlIFNTTCBWTkMgSmF2YQogICBWaWV3ZXIgd29ya2luZyB3aXRoIHgxMXZuYy4gSGVyZSBhcmUgc29tZSB0aXBzIHRvIGdldHRpbmcgd29ya2luZyB0aGUKICAgZmlyc3QgdGltZSAoYWZ0ZXJ3YXJkcyB5b3UgY2FuIGluY3JlbWVudGFsbHkgY3VzdG9taXplIHdpdGggbW9yZQogICBjb21wbGV4IHNldHRpbmdzLikKICAgICAqIEZpcnN0IHRyeSBpdCBvbiB0aGUgTEFOOiBEbyBOT1QgdHJ5IHRvIGhhdmUgaXQgd29yayB0aGUgZmlyc3QgdGltZQogICAgICAgZ29pbmcgdGhyb3VnaCBmaXJld2FsbHMsIFdlYiBwcm94aWVzLCBob21lIHJvdXRlciBwb3J0CiAgICAgICByZWRpcmVjdGlvbnMsIG9yIEFwYWNoZSBwb3J0YWwuIEp1c3QgdHJ5IGEgZGlyZWN0IGNvbm5lY3Rpb24gb3ZlcgogICAgICAgeW91ciBMQU4gZmlyc3QgKGlmIHlvdSBvbmx5IGhhdmUgMSBtYWNoaW5lIGFuZCBubyBMQU4sIGp1c3QgZG8gYQogICAgICAgZGlyZWN0IGNvbm5lY3Rpb24gdG8gdGhlIHNhbWUgbWFjaGluZTogbG9jYWxob3N0LikgSWYgdGhlIExBTgogICAgICAgbWFjaGluZSB5b3UgcnVuIHgxMXZuYyBvbiBoYXMgaXRzIG93biBob3N0LWxldmVsIGZpcmV3YWxsIChtb3N0CiAgICAgICBsaW51eCBtYWNoaW5lIGNvbWUgd2l0aCB0aGF0IG9uIGJ5IGRlZmF1bHQpLCBkaXNhYmxlIGl0IG9yIGF0CiAgICAgICBsZWFzdCBsZXQgdGNwIHBvcnRzIDU4MDAtNjAwMCB0aHJvdWdoLgogICAgICogRmlyc3QgdHJ5IEhUVFAgdG8gZG93bmxvYWQgdGhlIEphdmEgQXBwbGV0OiB4MTF2bmMgY2FuIHNlcnZlIGJvdGgKICAgICAgIHRoZSBKYXZhIEFwcGxldCBqYXIgZmlsZSBhbmQgVk5DIG91dCBvZiB0aGUgc2FtZSBwb3J0IChib3RoCiAgICAgICB0dW5uZWxlZCB0aHJvdWdoIFNTTCwgc2VlIGJlbG93LikgQnV0IGl0IGNhbiBsZWFkIHRvIHRpbWluZyBhbmQKICAgICAgIG90aGVyIHByb2JsZW1zLiBTbyBmaXJzdCB0cnkgSFRUUCBpbnN0ZWFkIG9mIEhUVFBTIHRvIGRvd25sb2FkIHRoZQogICAgICAgQXBwbGV0IGphciBmaWxlIChWbmNWaWV3ZXIuamFyLikgVGhhdCBpcyB0byBzYXkgdHJ5CiAgICAgICBodHRwOi8vaG9zdG5hbWU6NTgwMCBpbiB5b3VyIHdlYiBicm93c2VyIGZpcnN0IGJlZm9yZSB0cnlpbmcKICAgICAgIGh0dHBzOi8vaG9zdG5hbWU6NTkwMC4geDExdm5jIHdpbGwgcHJpbnQgb3V0IHRoZSBwb3J0cyBhbmQgVVJMcyBpdAogICAgICAgaXMgdXNpbmcsIHNvIHVzZSB0aGUgSFRUUCBvbmUgaXQgcHJpbnRzIG91dC4KICAgICAqIEFsd2F5cyBSZXN0YXJ0IHRoZSBCcm93c2VyOiBJZiB5b3UgYXJlIGhhdmluZyBmYWlsdXJlcyBhbmQgaGF2ZSB0bwogICAgICAgcmVwZWF0ZWRseSByZXRyeSB0aGluZ3MgQUxXQVlTIHJlc3RhcnQgdGhlIGJyb3dzZXIgKGkuZS4KICAgICAgIGNvbXBsZXRlbHkgZXhpdCBpdCBhbmQgdGhlbiBzdGFydCBhIG5ldyBicm93c2VyIHByb2Nlc3MpIGVhY2gKICAgICAgIHRpbWUuIE90aGVyd2lzZSBhcyB5b3UgYXJlIGNoYW5naW5nIHRoaW5ncyB0aGUgYnJvd3NlciBtYXkKICAgICAgICJyZW1lbWJlciIgZmFpbGVkIGFwcGxldCBkb3dubG9hZHMsIGV0Yy4gYW5kIGp1c3QgYWRkIHRvIHRoZQogICAgICAgY29uZnVzaW9uIGFuZCBpcnJlcHJvZHVjaWJpbGl0eS4gSWYgeW91IHNlZSBpdCB0cnlpbmcgdG8gZG93bmxvYWQKICAgICAgIFZuY1ZpZXdlci5jbGFzcyAoaW5zdGVhZCBvZiBWbmNWaWV3ZXIuamFyKSB5b3Uga25vdyBpdCBpcyByZWFsbHkKICAgICAgIGNvbmZ1c2VkIGFuZCBuZWVkcyB0byBiZSByZXN0YXJ0ZWQuCiAgICAgKiBTdGVwIExpdmVseTogSWYgeW91IGdldCBCcm93c2VyIG9yIEphdmEgVk0gb3IgVk5DIFZpZXdlciBhcHBsZXQKICAgICAgIGRpYWxvZyBib3hlcyBzYXlpbmcgdGhpbmdzIGxpa2UgIkRvIHlvdSB3YW50IHRvIHRydXN0IHRoaXMKICAgICAgIGNlcnRpZmljYXRlPyIgb3IgIlRoZSBob3N0bmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgb25lIG9uIHRoZQogICAgICAgY2VydGlmaWNhdGUiLCBldGMuIGp1c3QgZ28gdGhyb3VnaCB0aGVtIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCiAgICAgICB4MTF2bmMgY2Fubm90IHdhaXQgZm9yZXZlciBmb3IgZWFjaCBTU0wgY29ubmVjdGlvbiwgYW5kIHNvIGlmIHlvdQogICAgICAgZGF3ZGxlIHRvbyBsb25nIGluc3BlY3RpbmcgdGhlIGNlcnRzLCBldGMgaXQgY2FuIGxlYWQgdG8gcHJvYmxlbXMuCiAgICAgICBHZXQgaXQgd29ya2luZyBmaXJzdCBiZWZvcmUgdGFraW5nIHlvdXIgdGltZSB0byByZWFkIHRoZSBkZXRhaWxzCiAgICAgICBpbiB0aGUgZGlhbG9ncywgZXRjLgogICAgICogTm8gaW5ldGQsIFBsZWFzZTogRXZlbiBpZiB5b3UgaW50ZW5kIHRvIGRlcGxveSB2aWEgaW5ldGQgb3IgeGluZXRkCiAgICAgICBldmVudHVhbGx5LCBnZXQgdGhhdCB3b3JraW5nIGxhdGVyIChhbmQgcmVtZW1iZXIgZG8gbm90IHVzZQogICAgICAgc29tZXRoaW5nIGxpa2UgIi1zc2wgVE1QIiB0aGF0IGNyZWF0ZXMgYSBuZXcgdGVtcG9yYXJ5IFNTTAogICAgICAgY2VydGlmaWNhdGUgZm9yIGV2ZXJ5IG5ldyBzb2NrZXQgY29ubmVjdGlvbi4pCiAgICAgKiBOb3RoaW5nIEZhbmN5OiBEbyBub3QgdHJ5IGZhbmN5IHN0dWZmIGxpa2UgLXN2YywgLWNyZWF0ZSwgLXVuaXhwdywKICAgICAgICItdXNlcnMgdW5peHB3PSIsICItdXNlcnMgc3NscGVlcj0iLCAtc3NsdmVyaWZ5LCBldGMuIEp1c3QgZ2V0IHRoZQogICAgICAgc2ltcGxlc3QgY29ubmVjdGlvbiB3b3JraW5nIGZpcnN0IGFuZCB0aGVuIGluY3JlbWVudGFsbHkgYWRkIHdoYXQKICAgICAgIHlvdSBuZWVkLgoKICAgU28gdGhlIHJlY29tbWVuZGVkIHRlc3QgY29tbWFuZCBsaW5lcyBhcmU6CiAgIHgxMXZuYyAtc3NsIFNBVkUgLWh0dHAKICAgeDExdm5jIC1zc2wgU0FWRSAtaHR0cGRpciAvcGF0aC90by94MTF2bmMvY2xhc3Nlcy9zc2wKCiAgIFVzZSB0aGUgbGF0dGVyIGlmIHgxMXZuYyBjYW5ub3QgYXV0b21hdGljYWxseSBmaW5kIHRoZSBjbGFzc2VzL3NzbAogICBkaXJlY3RvcnkgKHRoaXMgd2hhdCB0aGUgLWh0dHAgb3B0aW9uIGluc3RydWN0cyBpdCB0byBkby4pIFRoZW4gcG9pbnQKICAgeW91ciBicm93c2VyIHRvIHRoZSBIVFRQIChub3QgSFRUUFMpIFVSTCBpdCBwcmludHMgb3V0LgoKICAgRm9sbG93aW5nIHRoZSBhYm92ZSBndWlkZWxpbmVzLCBkaWQgaXQgd29yaz8gSWYgc28sIENvbmdyYXR1bGF0aW9ucyEhCiAgIHlvdSBjcmVhdGVkIGFuIFNTTCBlbmNyeXB0ZWQgY29ubmVjdGlvbiBiZXR3ZWVuIHRoZSBTU0wgSmF2YSBhcHBsZXQKICAgcnVubmluZyBpbiB5b3VyIHdlYiBicm93c2VyIGFuZCB4MTF2bmMuIFRoZSBmYWN0IHRoYXQgeW91IHVzZWQgSFRUUAogICBpbnN0ZWFkIG9mIEhUVFBTIHRvIGRvd25sb2FkIHRoZSBhcHBsZXQgaXMgbm90IHRoZSBlbmQgb2YgdGhlIHdvcmxkCiAgIChzb21lIHVzZXJzIGRvIGl0IHRoaXMgd2F5KSwgdGhlIG1haW4gdGhpbmcgaXMgdGhhdCB0aGUgVk5DIHRyYWZmaWMgaXMKICAgZW5jcnlwdGVkIHdpdGggU1NMLiBJZiB5b3UgYXJlIGhhdmluZyB0cm91YmxlIGV2ZW4gd2l0aCB0aGUgYWJvdmUKICAgYmFzZWxpbmUgdGVzdCBjYXNlIGZlZWwgZnJlZSB0byBjb250YWN0IG1lIChwbGVhc2Ugc2VuZCB0aGUgRnVsbAogICB4MTF2bmMgb3V0cHV0LCBub3QganVzdCBwYXJ0IG9mIGl0OyB0aGUgY29tcGxldGUgeDExdm5jIGNvbW1hbmQgbGluZTsKICAgdGhlIFVSTChzKSBlbnRlcmVkIGluIHRoZSBicm93c2VyOyB0aGUgZnVsbCBKYXZhIENvbnNvbGUgb3V0cHV0OyBhbmQKICAgYW55dGhpbmcgZWxzZSB5b3UgY2FuIHRoaW5rIG9mLikKCiAgIE5leHQsIHlvdSBjYW4gYWRkIHRoZSBmZWF0dXJlcyB5b3Ugd2FudCBvbmUgYnkgb25lIHRlc3RpbmcgaXQgc3RpbGwKICAgd29ya3MgZWFjaCB0aW1lLiBJIHN1Z2dlc3QgZmlyc3QgdHVybmluZyBvbiB0aGUgSFRUUFMgYXBwbGV0IGRvd25sb2FkCiAgIChodHRwczovL2hvc3RuYW1lOjU5MDApIGlmIHRoYXQgaXMgd2hhdCB5b3UgaW50ZW5kIHRvIHVzZS4gVGhhdCBvbmUKICAgZ2l2ZXMgdGhlIG1vc3QgdHJvdWJsZSBiZWNhdXNlIG9mIHRoZSBhbWJpZ3VpdHkgb2YgcGFzc2luZyB0d28KICAgZGlmZmVyZW50IHByb3RvY29scyAoSFRUUCBhbmQgVk5DKSB0aHJvdWdoIHRoZSBzYW1lIFNTTCBzZXJ2aWNlIHBvcnQuCgogICBOZXh0LCB0dXJuIG9uIGluZXRkIGlmIHlvdSBpbnRlbmQgdG8gdXNlIHRoYXQgKHRoaXMgY2FuIGJlIHRyaWNreSB0b28sCiAgIGJlIHN1cmUgdG8gdXNlIC1vYSBsb2dmaWxlIGFuZCBpbnNwZWN0IGl0IGNhcmVmdWxseSBpZiB0aGVyZSBhcmUKICAgcHJvYmxlbXMuKSBJZiB5b3UgYXJlIGdvaW5nIHRvIHVzZSBub24tc3RhbmRhcmQgcG9ydHMgKGUuZy4gIi1yZmJwb3J0CiAgIDQ0MyIgYXMgcm9vdCksIHdvcmsgb24gdGhhdCBuZXh0LiBUaGVuIGVuYWJsZSB0aGUgZmlyZXdhbGwsIHJvdXRlcgogICBwb3J0IHJlZGlyZWN0aW9uIGNoYW5uZWwgKHlvdSB3aWxsIHNvbWVob3cgbmVlZCB0byBiZSBvdXRzaWRlIHRvIGRvCiAgIHRoYXQsIG1heWJlIHRlc3QgdGhhdCB0aHJvdWdoIGFub3RoZXIgVk5DIHNlc3Npb24uKQoKICAgVGhlbiwgaWYgeW91IHBsYW4gdG8gdXNlIHRoZW0sIGVuYWJsZSAiZmFuY3kgc3R1ZmYiIGxpa2UgIi1zdmMiIG9yCiAgICItdW5peHB3IiwgZXRjLCBldGMuIEJlIHN1cmUgdG8gYWRkIGEgcGFzc3dvcmQgZWl0aGVyICItcmZiYXV0aCIgb3IKICAgIi11bml4cHciIG9yIGJvdGguIElmIHlvdSBuZWVkIHRvIGhhdmUgdGhlIHdlYiBicm93c2VyIHVzZSBhIGNvcnBvcmF0ZQogICBXZWIgUHJveHkgKGkuZS4gaXQgY2Fubm90IGNvbm5lY3QgZGlyZWN0bHkpIHdvcmsgb24gdGhhdCBsYXN0LiBEaXR0bwogICBmb3IgdGhlIEFwYWNoZSBwb3J0YWwuCgoKICAgUm91dGVyL0ZpcmV3YWxsIHBvcnQgcmVkaXJzOiAgSWYgeW91IGFyZSBkb2luZyBwb3J0IHJlZGlyZWN0aW9uIGF0CiAgIHlvdXIgcm91dGVyIHRvIGFuIGludGVybmFsIG1hY2hpbmUgcnVubmluZyB4MTF2bmMgQU5EIHRoZSBpbnRlcm5ldAogICBmYWNpbmcgcG9ydCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgaW50ZXJuYWwgbWFjaGluZSdzIFZOQyBwb3J0LCB5b3UKICAgd2lsbCBuZWVkIHRvIGFwcGx5IHRoZSBQT1JUIGFwcGxldCBwYXJhbWV0ZXIgdG8gaW5kaWNhdGUgdG8gdGhlIGFwcGxldAogICB0aGUgSW50ZXJuZXQgZmFjaW5nIHBvcnQgbnVtYmVyIChvdGhlcndpc2UgYnkgZGVmYXVsdCB0aGUgaW50ZXJuYWwKICAgbWFjaGluZSdzIHBvcnQsIHNheSA1OTAwLCBpcyBzZW50IGFuZCB0aGF0IG9mIGNvdXJzZSBpcyByZWplY3RlZCBhdAogICB0aGUgZmlyZXdhbGwvcm91dGVyLikgRm9yIGV4YW1wbGU6CiAgaHR0cHM6Ly9mYXItYXdheS5lYXN0OjQ0My8/R0VUPTEmUE9SVD00NDMKCiAgIFNvIGluIHRoaXMgZXhhbXBsZSB0aGUgdXNlciBjb25maWd1cmVzIGhpcyByb3V0ZXIgdG8gcmVkaXJlY3QKICAgY29ubmVjdGlvbnMgdG8gcG9ydCA0NDMgb24gaGlzIEludGVybmV0IHNpZGUgdG8sIHNheSwgcG9ydCA1OTAwIG9uIHRoZQogICBpbnRlcm5hbCBtYWNoaW5lIHJ1bm5pbmcgeDExdm5jLiBTZWUgYWxzbyB0aGUgLWh0dHBzcmVkaXIgb3B0aW9uIHRoYXQKICAgd2lsbCB0cnkgdG8gYXV0b21hdGUgdGhpcyBmb3IgeW91LgoKICAgVG8gY29uZmlndXJlIHlvdXIgcm91dGVyIHRvIGRvIHBvcnQgcmVkaXJlY3Rpb24sIHNlZSBpdHMgaW5zdHJ1Y3Rpb25zLgogICBUeXBpY2FsbHksIGZyb20gdGhlIGluc2lkZSB5b3UgcG9pbnQgYSB3ZWIgYnJvd3NlciB0byBhIHNwZWNpYWwgVVJMCiAgIChlLmcuIGh0dHA6Ly8xOTIuMTY4LjEuMSkgYW5kIHlvdSBnZXQgYSB3ZWIgaW50ZXJmYWNlIHRvIGNvbmZpZ3VyZSBpdC4KICAgTG9vayBmb3Igc29tZXRoaW5nIGxpa2UgIlBvcnQgUmVkaXJlY3Rpb24iIG9yICJQb3J0IEZvcndhcmRpbmciLAogICBwcm9iYWJseSB1bmRlciAiQWR2YW5jZWQiIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuIElmIHlvdSBoYXZlIGEgTGludXgKICAgb3IgVW5peCBzeXN0ZW0gYWN0aW5nIGFzIHlvdXIgZmlyZXdhbGwvcm91dGVyLCBzZWUgaXRzIGZpcmV3YWxsCiAgIGNvbmZpZ3VyYXRpb24uCgogICBZb3UgY2FuIGFsc28gdXNlIHgxMXZuYyBvcHRpb25zIC1yZmJwb3J0IE5OTk5OIGFuZCAtaHR0cHBvcnQgTk5OTk4gdG8KICAgbWF0Y2ggdGhlIHBvcnRzIHRoYXQgeW91ciBmaXJld2FsbCB3aWxsIGJlIHJlZGlyZWN0aW5nIHRvIHRoZSBtYWNoaW5lCiAgIHdoZXJlIHgxMXZuYyBpcyBydW4uCgoKICAgVGVkaW91cyBEaWFsb2dzOiBJZiB5b3UgZG8gc2VydmUgdGhlIFNTTCBlbmFibGVkIEphdmEgdmlld2VyIHZpYSBodHRwcwogICBiZSBwcmVwYXJlZCBmb3IgcXVpdGUgYSBudW1iZXIgb2YgImFyZSB5b3Ugc3VyZSB5b3UgdHJ1c3QgdGhpcyBzaXRlPyIKICAgZGlhbG9nczoKICAgICAqIEZpcnN0IGZyb20gdGhlIFdlYiBicm93c2VyIHRoYXQgY2Fubm90IHZlcmlmeSB0aGUgc2VsZi1zaWduZWQKICAgICAgIGNlcnRpZmljYXRlIHdoZW4gaXQgZG93bmxvYWRzIGluZGV4LnZuYy4KICAgICAqIEZyb20gdGhlIFdlYiBicm93c2VyIGFnYWluIG5vdGluZyB0aGF0IHRoZSBjb21tb24gbmFtZSBvbiB0aGUKICAgICAgIGNlcnRpZmljYXRlIGRvZXMgbm90IG1hdGNoIHRoZSBob3N0bmFtZSBvZiB0aGUgcmVtb3RlIG1hY2hpbmUuCiAgICAgKiBOZXh0IGZyb20gdGhlIEphdmEgVk0gdGhhdCBjYW5ub3QgdmVyaWZ5IHRoZSBzZWxmLXNpZ25lZAogICAgICAgY2VydGlmaWNhdGUgd2hlbiBpdCBkb3dubG9hZHMgVm5jVmlld2VyLmphci4KICAgICAqIEFuZCBhbHNvIGZyb20gdGhlIEphdmEgVk0gYWdhaW4gbm90aW5nIHRoYXQgdGhlIGNvbW1vbiBuYW1lIG9uIHRoZQogICAgICAgY2VydGlmaWNhdGUgZG9lcyBub3QgbWF0Y2ggdGhlIGhvc3RuYW1lIG9mIHRoZSByZW1vdGUgbWFjaGluZS4KICAgICAqIEZpbmFsbHkgZnJvbSB0aGUgSmF2YSBWbmNWaWV3ZXIgYXBwbGV0IGl0c2VsZiBzYXlpbmcgaXQgY2Fubm90CiAgICAgICB2ZXJpZnkgdGhlIGNlcnRpZmljYXRlISAob3IgYSBwb3B1cCBhc2tpbmcgeW91IGlmIHlvdSB3YW50IHRvIHNlZQogICAgICAgdGhlIGNlcnRpZmljYXRlLikKCiAgIE5vdGUgdGhhdCBzb21ldGltZXMgaWYgeW91IHBhdXNlIHRvbyBsb25nIGF0IG9uZSBvZiB0aGUgYWJvdmUgZGlhbG9ncwogICB0aGVuIHgxMXZuYyBtYXkgZXhjZWVkIGEgdGltZW91dCBhbmQgYXNzdW1lIHRoZSBjdXJyZW50IHNvY2tldAogICBjb25uZWN0aW9uIGlzIFZOQyBpbnN0ZWFkIG9mIHRoZSBIVFRQUyBpdCBhY3R1YWxseSBpcyAoYnV0IHNpbmNlIHlvdQogICBoYXZlIHBhdXNlZCB0b28gbG9uZyBhdCB0aGUgZGlhbG9nIHRoZSBHRVQgcmVxdWVzdCBjb21lcyB0b28gbGF0ZS4pCiAgIE9mdGVuIGhpdHRpbmcgUmVsb2FkIGFuZCBnb2luZyB0aHJvdWdoIHRoZSBkaWFsb2dzIG1vcmUgcXVpY2tseSB3aWxsCiAgIGxldCB5b3UgY29ubmVjdC4gVGhlIEphdmEgVk0gZGlhbG9ncyBhcmUgdGhlIG1vc3QgaW1wb3J0YW50IG9uZXMgdG8KICAgTk9UIGxpbmdlciBhdC4gSWYgeW91IHNlZSBpbiB0aGUgeDExdm5jIG91dHB1dCBhIHJlcXVlc3QgZm9yCiAgIFZuY1ZpZXdlci5jbGFzcyBpbnN0ZWFkIG9mIFZuY1ZpZXdlci5qYXIgaXQgaXMgdG9vIGxhdGUuLi4geW91IHdpbGwKICAgbmVlZCB0byBjb21wbGV0ZWx5IHJlc3RhcnQgdGhlIFdlYiBicm93c2VyIHRvIGdldCBpdCB0byB0cnkgZm9yIHRoZQogICBqYXIgYWdhaW4uIFlvdSBjYW4gdXNlIHRoZSAtaHR0cHMgb3B0aW9uIGlmIHlvdSB3YW50IGEgZGVkaWNhdGVkIHBvcnQKICAgZm9yIEhUVFBTIGNvbm5lY3Rpb25zIGluc3RlYWQgb2Ygc2hhcmluZyB0aGUgVk5DIHBvcnQuCgogICBUbyBzZWUgZXhhbXBsZSB4MTF2bmMgb3V0cHV0IGZvciBhIHN1Y2Nlc3NmdWwgaHR0cHM6Ly9ob3N0OjU5MDAvCiAgIGNvbm5lY3Rpb24gd2l0aCB0aGUgSmF2YSBBcHBsZXQgc2VlIFRoaXMgUGFnZS4gQW5kIGhlcmUgaXMgYSBuZXdlcgogICBleGFtcGxlIGluY2x1ZGluZyB0aGUgSmF2YSBDb25zb2xlIG91dHB1dC4KCiAgIEFsbCBvZiB0aGUgeDExdm5jIEphdmEgVmlld2VyIGFwcGxldCBwYXJhbWV0ZXJzIGFyZSBkZXNjcmliZWQgaW4gdGhlCiAgIGZpbGUgY2xhc3Nlcy9zc2wvUkVBRE1FCgoKICAgTm90ZXMgb24gdGhlIFZOQyBWaWV3ZXIgc3Nfdm5jdmlld2VyIHdyYXBwZXIgc2NyaXB0OgoKICAgSWYgeW91IHdhbnQgdG8gdXNlIGEgbmF0aXZlIFZOQyBWaWV3ZXIgd2l0aCB0aGUgU1NMIGVuYWJsZWQgeDExdm5jIHlvdQogICB3aWxsIG5lZWQgdG8gcnVuIGFuIGV4dGVybmFsIFNTTCB0dW5uZWwgb24gdGhlIFZpZXdlciBzaWRlLiBUaGVyZSBkbwogICBub3Qgc2VlbSB0byBiZSBhbnkgbmF0aXZlIFNTTCBWTkMgVmlld2VycyBvdXRzaWRlIG9mIG91ciB4MTF2bmMgYW5kCiAgIFNTVk5DIHBhY2thZ2VzLiBUaGUgYmFzaWMgaWRlYXMgb2YgZG9pbmcgdGhpcyB3ZXJlIGRpc2N1c3NlZCBmb3IKICAgZXh0ZXJuYWwgdHVubmVsIHV0aWxpdGllcyBoZXJlLgoKICAgVGhlIHNzX3ZuY3ZpZXdlciBzY3JpcHQgcHJvdmlkZWQgd2l0aCB4MTF2bmMgYW5kIFNTVk5DIGNhbiBzZXQgdXAgdGhlCiAgIHN0dW5uZWwgdHVubmVsIGF1dG9tYXRpY2FsbHkgb24gdW5peCBhcyBsb25nIGFzIHRoZSBzdHVubmVsIGNvbW1hbmQgaXMKICAgaW5zdGFsbGVkIG9uIHRoZSBWaWV3ZXIgbWFjaGluZSBhbmQgYXZhaWxhYmxlIGluIFBBVEggKGFuZCB2bmN2aWV3ZXIKICAgdG9vIG9mIGNvdXJzZS4pIE5vdGUgdGhhdCBvbiBhIERlYmlhbiBiYXNlZCBzeXN0ZW0geW91IHdpbGwgbmVlZCB0bwogICBpbnN0YWxsIHRoZSBwYWNrYWdlIHN0dW5uZWw0IG5vdCBzdHVubmVsLiBZb3UgY2FuIHNldCB0aGUgZW52aXJvbm1lbnQKICAgdmFyaWFibGVzIFNUVU5ORUwgYW5kIFZOQ1ZJRVdFUkNNRCB0byBwb2ludCB0byB0aGUgY29ycmVjdCBwcm9ncmFtcyBpZgogICB5b3Ugd2FudCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdHMuCgogICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgogIDEpICBzc192bmN2aWV3ZXIgZmFyLWF3YXkuZWFzdDowCgogIDIpICBzc192bmN2aWV3ZXIgZmFyLWF3YXkuZWFzdDowIC1lbmNvZGluZ3MgImNvcHlyZWN0IHRpZ2h0IHpybGUgaGV4dGlsZSIKCiAgMykgIHNzX3ZuY3ZpZXdlciAtdmVyaWZ5IC4vc2VydmVyLmNydCBmYXItYXdheS5lYXN0OjAKCiAgNCkgIHNzX3ZuY3ZpZXdlciAtbXljZXJ0IC4vY2xpZW50LnBlbSBmYXItYXdheS5lYXN0OjAKCiAgNSkgIHNzX3ZuY3ZpZXdlciAtcHJveHkgZmFyLWF3YXkuZWFzdDo4MDgwIG15d29ya3N0YXRpb246MAoKICAgVGhlIGZpcnN0IG9uZSBpcyB0aGUgZGVmYXVsdCBtb2RlIGFuZCBhY2NlcHRzIHRoZSB4MTF2bmMgY2VydGlmaWNhdGUKICAgd2l0aG91dCBxdWVzdGlvbi4gVGhlIHNlY29uZCBvbmUgaXMgYXMgdGhlIGZpcnN0LCBidXQgYWRkcyB0aGUKICAgLWVuY29kaW5ncyBvcHRpb25zIHRvIHRoZSB2bmN2aWV3ZXIgY29tbWFuZCBsaW5lLgoKICAgVGhlIHRoaXJkIG9uZSByZXF1aXJlcyB0aGF0IHRoZSB4MTF2bmMgc2VydmVyIGF1dGhlbnRpY2F0ZSBpdHNlbGYgdG8KICAgdGhlIGNsaWVudCBhZ2FpbnN0IHRoZSBjZXJ0aWZpY2F0ZSBpbiB0aGUgZmlsZSAuL3NlcnZlci5jcnQgKGUuZy4gb25lCiAgIGNyZWF0ZWQgYnkgIngxMXZuYyAtc3NsIFNBVkUiIGFuZCBzYWZlbHkgY29waWVkIHRvIHRoZSBWTkMgdmlld2VyCiAgIG1hY2hpbmUuKQoKICAgVGhlIGZvdXJ0aCBvbmUgaXMgZm9yIFZOQyBWaWV3ZXIgYXV0aGVudGljYXRpb24sIGl0IHVzZXMgLi9jbGllbnQucGVtCiAgIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgdG8geDExdm5jLiBPbmUgY2FuIHN1cHBseSBib3RoIC12ZXJpZnkgYW5kCiAgIC1teWNlcnQgc2ltdWx0YW5lb3VzbHkuCgogICBUaGUgZmlmdGggb25lIHNob3dzIHRoYXQgV2ViIHByb3hpZXMgY2FuIGJlIHVzZWQgaWYgdGhhdCBpcyB0aGUgb25seQogICB3YXkgdG8gZ2V0IG91dCBvZiB0aGUgZmlyZXdhbGwuIElmIHRoZSAiZG91YmxlIHByb3h5IiBzaXR1YXRpb24gYXJpc2VzCiAgIHNlcGFyYXRlIHRoZSB0d28gYnkgY29tbWFzLiBTZWUgdGhpcyBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdwogICBXZWIgcHJveGllcyBjb21lIGludG8gcGxheS4KCiAgIElmIG9uZSB1c2VzIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IChDQSkgc2NoZW1lIGRlc2NyaWJlZCBoZXJlLCB0aGUKICAgd3JhcHBlciBzY3JpcHQgd291bGQgdXNlIHRoZSBDQSBjZXJ0IGluc3RlYWQgb2YgdGhlIHNlcnZlciBjZXJ0OgogIDMnKSAgc3Nfdm5jdmlld2VyIC12ZXJpZnkgLi9jYWNlcnQuY3J0IGZhci1hd2F5LmVhc3Q6MAoKICAgVXBkYXRlIEp1bC8yMDA2OiB3ZSBub3cgcHJvdmlkZSBhbiBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKQogICBwYWNrYWdlIHRoYXQgc3RhcnRzIHVwIFNUVU5ORUwgYXV0b21hdGljYWxseSBhbG9uZyB3aXRoIHNvbWUgb3RoZXIKICAgZmVhdHVyZXMuIEFsbCBiaW5hcmllcyAoc3R1bm5lbCwgdm5jdmlld2VyLCBhbmQgc29tZSB1dGlsaXRpZXMpIGFyZQogICBwcm92aWRlZCBpbiB0aGUgcGFja2FnZS4gSXQgd29ya3Mgb24gVW5peCwgTWFjIE9TIFgsIGFuZCBXaW5kb3dzLgoKCiAgIFEtNTU6IEhvdyBkbyBJIHVzZSB0aGUgSmF2YSBhcHBsZXQgVk5DIFZpZXdlciB3aXRoIGJ1aWx0LWluIFNTTAogICB0dW5uZWxpbmcgd2hlbiBnb2luZyB0aHJvdWdoIGEgV2ViIFByb3h5PwogICBUaGUgU1NMIGVuYWJsZWQgSmF2YSBWTkMgVmlld2VyIGFuZCBmaXJld2FsbCBQcm94aWVzOgoKICAgU1NMIGFuZCBIVFRQUyBhc2lkZSwgdGhlcmUgaXMgYSBnZW5lcmFsIHByb2JsZW0gd2l0aCBGaXJld2FsbCBQcm94aWVzCiAgIGFuZCBKYXZhIEFwcGxldHMgdGhhdCBvcGVuIHNvY2tldHMuIFRoZSBhcHBsZXQgaXMgZG93bmxvYWRlZAogICBzdWNjZXNzZnVsbHkgKHRocm91Z2ggdGhlIGJyb3dzZXIpIHVzaW5nIEhUVFAgYW5kIHRoZSBwcm94eSwgYnV0IHdoZW4KICAgdGhlIGFwcGxldCB0cmllcyB0byByZWNvbm5lY3QgdG8gdGhlIG9yaWdpbmF0aW5nIGhvc3QgKHRoZSBvbmx5IG9uZQogICBhbGxvd2VkIGJ5IHNlY3VyaXR5KSBpdCBkb2VzIG5vdCB1c2UgdGhlIHByb3h5IGNoYW5uZWwuIFNvIGl0IGNhbm5vdAogICByZWNvbm5lY3QgdG8gdGhlIHNlcnZlciB0aGUgYXBwbGV0IGNhbWUgZnJvbSEKCiAgIFdlIGhhdmUgZm91bmQgYSBjb252ZW5pZW50IHdvcmthcm91bmQ6IGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUKICAgVm5jVmlld2VyLmphciByZXNpZGVzIHRoZXJlIGlzIGEgZGlnaXRhbGx5IHNpZ25lZCB2ZXJzaW9uIG9mIHRoZSBzYW1lCiAgIGFwcGxldCBjYWxsZWQgU2lnbmVkVm5jVmlld2VyLmphci4gU2luY2UgdGhlIGFwcGxldCBpcyBkaWdpdGFsbHkKICAgc2lnbmVkLCB0aGVyZSB3aWxsIGJlIGFuIGFkZGl0aW9uYWwgZGlhbG9nIGZyb20gdGhlIEphdmEgVk0gcGx1Z2luCiAgIGFza2luZyB5b3UgaWYgeW91IHdhbnQgdG8gdHJ1c3QgdGhlIGFwcGxldCBmdWxseS4KCiAgIFlvdSBzaG91bGQgc2F5ICJZZXMiLiBJZiB5b3UgZG8sIHRoZSBhcHBsZXQgd2lsbCBiZSBydW4gaW4gYSBtb2RlCiAgIHdoZXJlIGl0IGNhbiB0cnkgdG8gZGV0ZXJtaW5lIHRoZSBmaXJld2FsbCBwcm94eSBob3N0IG5hbWUgYW5kIHBvcnQKICAgKGl0IHdpbGwgYXNrIHlvdSBmb3IgdGhlbSBpZiBpdCBjYW5ub3QgZmluZCB0aGVtLikgVGhpcyB3YXkgaXQgY2FuCiAgIGNvbm5lY3QgZGlyZWN0bHkgdG8gdGhlIFByb3h5IGFuZCB0aGVuIHJlcXVlc3QgdGhlIENPTk5FQ1QgbWV0aG9kIHRvCiAgIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIG9yaWdpbmF0aW5nIGhvc3QgKHRoZSB4MTF2bmMgVk5DIFNlcnZlci4pIFNTTCBpcwogICB0aGVuIGxheWVyZWQgb3ZlciB0aGlzIHNvY2tldC4KCiAgIFRvIGRvIHRoaXMgeW91IHNob3VsZCB1c2UgdGhlIHByb3h5LnZuYyBIVE1MIGZpbGUgbGlrZSB2aWEgdGhpcyBVUkwgaW4KICAgeW91ciBicm93c2VyOgogIGh0dHBzOi8veW91cm1hY2hpbmUuY29tOjU5MDAvcHJveHkudm5jCgogICAoaW5zdGVhZCBvZiB0aGUgdW5zaWduZWQgb25lIGluIGh0dHBzOi8veW91cm1hY2hpbmUuY29tOjU5MDAvIHRoYXQKICAgZ2l2ZXMgdGhlIGRlZmF1bHQgaW5kZXgudm5jKQoKICAgUHJveGllcyB0aGF0IGxpbWl0IENPTk5FQ1QgdG8gcG9ydHMgNDQzIGFuZCA1NjM6CgogICBUaGluZ3MgYmVjb21lIHRyaWNraWVyIGlmIHRoZSBXZWIgcHJveHkgcmVzdHJpY3RzIHdoaWNoIENPTk5FQ1QgcG9ydHMKICAgY2FuIGJlIHJlZGlyZWN0ZWQgdG8uIEZvciBzZWN1cml0eSwgc29tZSAobW9zdD8pIHByb3hpZXMgb25seSBhbGxvdwogICBwb3J0IDQ0MyAoSFRUUFMpIGFuZCA1NjMgKFNORVdTKSBieSBkZWZhdWx0LiBJbiB0aGlzIGNhc2UsIHRoZSBvbmx5CiAgIHRoaW5nIHRvIGRvIGlzIHJ1biB4MTF2bmMgb24gdGhhdCBsb3cgcG9ydCwgZS5nLiAiLXJmYnBvcnQgNDQzIiwgKG9yCiAgIHVzZSBhIHBvcnQgcmVkaXJlY3Rpb24gb24sIHNheSwgYSBmaXJld2FsbCBvciByb3V0ZXIgcG9ydCA0NDMgdG8gdGhlCiAgIGludGVybmFsIG1hY2hpbmUuKQoKICAgSWYgeW91IGRvIHN1Y2ggYSByZWRpcmVjdGlvbiB0byBhbiBpbnRlcm5hbCBtYWNoaW5lIGFuZCB4MTF2bmMgaXMgbm90CiAgIGxpc3RlbmluZyBvbiBwb3J0IDQ0MywgeW91IHdpbGwgcHJvYmFibHkgbmVlZCB0byBlZGl0IHByb3h5LnZuYy4KICAgU3VwcG9zZSB0aGUgU1NMIHgxMXZuYyBzZXJ2ZXIgd2FzIGxpc3RlbmluZyBvbiBwb3J0IDU5MDEuIFlvdSBzaG91bGQKICAgY2hhbmdlIHRoZSBsaW5lIGluIHByb3h5LnZuYyBmcm9tOgogIDxwYXJhbSBuYW1lPVBPUlQgdmFsdWU9JFBPUlQ+CgogICB0bzoKICA8cGFyYW0gbmFtZT1QT1JUIHZhbHVlPTQ0Mz4KCiAgIFNpbmNlIG90aGVyd2lzZSAkUE9SVCB3aWxsIGJlIGV4cGFuZGVkIHRvIDU5MDEgYnkgeDExdm5jIGFuZCB0aGUKICAgdmlld2VyIGFwcGxldCB3aWxsIGZhaWwgdG8gY29ubmVjdCB0byB0aGF0IHBvcnQgb24gdGhlIGZpcmV3YWxsLgoKICAgQW5vdGhlciB3YXkgdG8gYWNoaWV2ZSB0aGUgc2FtZSB0aGluZyBpcyB0byB1c2UgdGhlIGFwcGxldCBQT1JUCiAgIHBhcmFtZXRlcjoKICBodHRwczovL3lvdXJtYWNoaW5lLmNvbS9wcm94eS52bmM/UE9SVD00NDMKCiAgIHRoaXMgaXMgY2xlYW5lciBiZWNhdXNlIGl0IGF2b2lkcyBlZGl0aW5nIHRoZSBmaWxlLCBidXQgcmVxdWlyZXMgbW9yZQogICBwYXJhbWV0ZXJzIGluIHRoZSBVUkwuIFNlZSBhbHNvIHRoZSAtaHR0cHNyZWRpciB4MTF2bmMgb3B0aW9uIHRoYXQKICAgd2lsbCB0cnkgdG8gYXV0b21hdGUgdGhpcyBmb3IgeW91LiBUbyB1c2UgdGhlIEdFVCB0cmljayBkaXNjdXNzZWQKICAgYWJvdmUsIGRvOgogIGh0dHBzOi8veW91cm1hY2hpbmUuY29tL3Byb3h5LnZuYz9HRVQ9MSZQT1JUPTQ0MwoKICAgQWxsIG9mIHRoZSB4MTF2bmMgSmF2YSBWaWV3ZXIgYXBwbGV0IHBhcmFtZXRlcnMgYXJlIGRlc2NyaWJlZCBpbiB0aGUKICAgZmlsZSBjbGFzc2VzL3NzbC9SRUFETUUKCiAgIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBKYXZhIENvbnNvbGUgYW5kIHgxMXZuYyBvdXRwdXQgZm9yIHRoZSBXZWIgcHJveHkKICAgY2FzZS4KCgogICBOb3RlIHRoYXQgYm90aCB0aGUgc3Nfdm5jdmlld2VyIHN0dW5uZWwgVW5peCB3cmFwcGVyIHNjcmlwdCBhbmQKICAgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgY2FuIHVzZSBXZWIgcHJveGllcyBhcyB3ZWxsIGV2ZW4KICAgdGhvdWdoIHRoZXkgZG8gbm90IGludm9sdmUgYSBXZWIgYnJvd3Nlci4KCgogICBRLTU2OiBDYW4gQXBhY2hlIHdlYiBzZXJ2ZXIgYWN0IGFzIGEgZ2F0ZXdheSBmb3IgdXNlcnMgdG8gY29ubmVjdCB2aWEKICAgU1NMIGZyb20gdGhlIEludGVybmV0IHdpdGggYSBXZWIgYnJvd3NlciB0byB4MTF2bmMgcnVubmluZyBvbiB0aGVpcgogICB3b3Jrc3RhdGlvbnMgYmVoaW5kIGEgZmlyZXdhbGw/CiAgIFllcy4gWW91IHdpbGwgbmVlZCB0byBjb25maWd1cmUgYXBhY2hlIHRvIGZvcndhcmQgdGhlc2UgY29ubmVjdGlvbnMuCiAgIEl0IGlzIGRpc2N1c3NlZCBoZXJlLiBUaGlzIFNTTCBWTkMgcG9ydGFsIHByb3ZpZGVzIGEgY2xlYW4gYWx0ZXJuYXRpdmUKICAgdG8gdGhlIHRyYWRpdGlvbmFsIG1ldGhvZCB3aGVyZSB0aGUgdXNlciB1c2VzIFNTSCB0byBsb2cgaW4gdGhyb3VnaAogICB0aGUgZ2F0ZXdheSB0byBjcmVhdGUgdGhlIGVuY3J5cHRlZCBwb3J0IHJlZGlyZWN0aW9uIHRvIHgxMXZuYyBydW5uaW5nCiAgIG9uIGhlciBkZXNrdG9wLgoKICAgQWxzbyBzZWUgdGhlIGRlc2t0b3AuY2dpIENHSSBzY3JpcHQgbWV0aG9kIHRoYXQgYWNoaWV2ZXMgbXVjaCBvZiB3aGF0CiAgIHRoaXMgQXBhY2hlIFZOQyBTU0wgcG9ydGFsIG1ldGhvZCBkb2VzIChhcyBsb25nIGFzIGRlc2t0b3AuY2dpJ3MgJ3BvcnQKICAgcmVkaXJlY3Rpb24nIG1vZGUgaXMgZW5hYmxlZC4pCgoKICAgUS01NzogQ2FuIEkgY3JlYXRlIGFuZCB1c2UgbXkgb3duIFNTTCBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKSB3aXRoCiAgIHgxMXZuYz8KICAgWWVzLCBzZWUgdGhpcyBwYWdlIGZvciBob3cgdG8gZG8gdGhpcyBhbmQgdGhlIHV0aWxpdHkgY29tbWFuZHMgeDExdm5jCiAgIHByb3ZpZGVzIHRvIGNyZWF0ZSBhbmQgbWFuYWdlIG1hbnkgdHlwZXMgb2YgY2VydGlmaWNhdGVzIGFuZCBwcml2YXRlCiAgIGtleXMuCgoKCiAgIFtEaXNwbGF5IE1hbmFnZXJzIGFuZCBTZXJ2aWNlc10KCiAgIFEtNTg6IEhvdyBjYW4gSSBydW4geDExdm5jIGFzIGEgInNlcnZpY2UiIHRoYXQgaXMgYWx3YXlzIGF2YWlsYWJsZT8KCiAgIFRoZXJlIGFyZSBhIG51bWJlciBvZiB3YXlzIHRvIGRvIHRoaXMuIFRoZSBwcmltYXJ5IHRoaW5nIHlvdSBuZWVkIHRvCiAgIGRlY2lkZSBpcyB3aGV0aGVyIHlvdSB3YW50IHgxMXZuYyB0byBjb25uZWN0IHRvIHRoZSBYIHNlc3Npb24gb24gdGhlCiAgIG1hY2hpbmUgMSkgcmVnYXJkbGVzcyBvZiB3aG8gKG9yIGlmIGFueW9uZSkgaGFzIHRoZSBYIHNlc3Npb24sIG9yIDIpCiAgIG9ubHkgaWYgYSBjZXJ0YWluIHVzZXIgaGFzIHRoZSBYIHNlc3Npb24uIEJlY2F1c2UgWCBzZXNzaW9ucyBhcmUKICAgcHJvdGVjdGVkIGJ5IFggcGVybWlzc2lvbnMgKE1JVC1NQUdJQy1DT09LSUUgZmlsZXMgWEFVVEhPUklUWSBhbmQKICAgJEhPTUUvLlhhdXRob3JpdHkpIHRoZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQgeDExdm5jIHdpbGwgb2YgY291cnNlCiAgIG5lZWQgdG8gaGF2ZSBzdWZmaWNpZW50IHBlcm1pc3Npb25zIHRvIGNvbm5lY3QgdG8gdGhlIFggZGlzcGxheS4KCiAgIEhlcmUgYXJlIHNvbWUgaWRlYXM6CiAgICAgKiBVc2UgdGhlIGRlc2NyaXB0aW9uIHVuZGVyICJDb250aW51b3VzbHkiIGluIHRoZSBGQVEgb24geDExdm5jIGFuZAogICAgICAgRGlzcGxheSBNYW5hZ2VycwogICAgICogVXNlIHRoZSBkZXNjcmlwdGlvbiBpbiB0aGUgRkFRIG9uIHgxMXZuYyBhbmQgaW5ldGQoOCkKICAgICAqIFVzZSB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIEZBUSBvbiBVbml4IHVzZXIgbG9naW5zIGFuZCBpbmV0ZCg4KQogICAgICogU3RhcnQgeDExdm5jIGZyb20geW91ciAkSE9NRS8ueHNlc3Npb24gKG9yICRIT01FLy54aW5pdHJjIG9yCiAgICAgICBhdXRvc3RhcnQgc2NyaXB0IG9yIC4uLikKICAgICAqIEFsdGhvdWdoIGxlc3MgcmVsaWFibGUsIHNlZSB0aGUgeDExdm5jX2xvb3AgcmMubG9jYWwgaGFjayBiZWxvdy4KCiAgIFRoZSBkaXNwbGF5IG1hbmFnZXIgc2NoZW1lIHdpbGwgbm90IGJlIHNwZWNpZmljIHRvIHdoaWNoIHVzZXIgaGFzIHRoZQogICBYIHNlc3Npb24gdW5sZXNzIGEgdGVzdCBpcyBzcGVjaWZpY2FsbHkgcHV0IGludG8gdGhlIGRpc3BsYXkgc3RhcnR1cAogICBzY3JpcHQgKG9mdGVuIG5hbWVkIFhzZXR1cC4pIFRoZSBpbmV0ZCg4KSBzY2hlbWUgbWF5IG9yIG1heSBub3QgYmUKICAgc3BlY2lmaWMgdG8gd2hpY2ggdXNlciBoYXMgdGhlIFggc2Vzc2lvbiAoYW5kIGl0IG1heSBub3QgYmUgYWJsZSB0byBkbwogICBhbGwgdXNlcnMgdmlhIHRoZSBYQVVUSE9SSVRZIHBlcm1pc3Npb24gaXNzdWVzLikKCiAgIFRoZSAueHNlc3Npb24vLnhpbml0cmMgc2NoZW1lIGlzIG9idmlvdXNseSBpcyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIKICAgdXNlciBhbmQgb25seSB3aGVuIHRoZXkgYXJlIGxvZ2dlZCBpbnRvIFguIElmIHlvdSBkbyBub3Qga25vdyB3aGF0IGEKICAgJEhPTUUvLnhzZXNzaW9uIHNjcmlwdCBpcyBvciBob3cgdG8gdXNlIG9uZSwgcGVyaGFwcyB5b3VyIGRlc2t0b3AgaGFzCiAgIGEgInNlc3Npb24gc3RhcnR1cCBjb21tYW5kcyIgY29uZmlndXJhdGlvbiBvcHRpb24uIFRoZSBjb21tYW5kIHRvIGJlCiAgIHJ1biBpbiB0aGUgLnhzZXNzaW9uIG9yIC54aW5pdHJjIGZpbGUgbWF5IGxvb2sgbGlrZSB0aGlzOgp4MTF2bmMgLWxvZ2ZpbGUgJEhPTUUvLngxMXZuYy5sb2cgLXJmYmF1dGggJEhPTUUvLnZuYy9wYXNzd2QgLWZvcmV2ZXIgLWJnCgogICBwbHVzIGFueSBvdGhlciBvcHRpb25zIHlvdSBkZXNpcmUuCgogICBEZXBlbmRpbmcgb24geW91ciBkZXNrdG9wIGFuZC9vciBPUy9kaXN0cmlidXRpb24gdGhlIGF1dG9tYXRpY2FsbHkgcnVuCiAgIFggc3RhcnR1cCBzY3JpcHRzICh0cmFkaXRpb25hbGx5IC54c2Vzc2lvbi8ueGluaXRyYykgbWF5IGhhdmUgdG8gYmUgaW4KICAgYSBkaWZmZXJlbnQgZGlyZWN0b3J5IG9yIGhhdmUgYSBkaWZmZXJlbnQgYmFzZW5hbWUuIE9uZSB1c2VyCiAgIHJlY29tbWVuZHMgdGhlIGRlc2NyaXB0aW9uIHVuZGVyICdSdW5uaW5nIFNjcmlwdHMgQXV0b21hdGljYWxseScgYXQKICAgdGhpcyBsaW5rLgoKICAgRmlyZXdhbGxzOiBub3RlIGFsbCBtZXRob2RzIHdpbGwgcmVxdWlyZSB0aGUgaG9zdC1sZXZlbCBmaXJld2FsbCB0byBiZQogICBjb25maWd1cmVkIHRvIGFsbG93IGNvbm5lY3Rpb25zIGluIG9uIGEgcG9ydC4gRS5nLiA1OTAwIChkZWZhdWx0IFZOQwogICBwb3J0KSBvciAyMiAoZGVmYXVsdCBTU0ggcG9ydCBmb3IgdHVubmVsbGluZyBWTkMuKSBNb3N0IHN5c3RlbXMgdGhlc2UKICAgZGF5cyBoYXZlIGZpcmV3YWxscyB0dXJuZWQgb24gYnkgZGVmYXVsdCwgc28geW91IHdpbGwgYWN0aXZlbHkgaGF2ZSB0bwogICBkbyBzb21ldGhpbmcgdG8gcG9rZSBhIGhvbGUgaW4gdGhlIGZpcmV3YWxsIGF0IHRoZSBkZXNpcmVkIHBvcnQKICAgbnVtYmVyLiBTZWUgeW91ciBzeXN0ZW0gYWRtaW5pc3RyYXRpb24gdG9vbCBmb3IgRmlyZXdhbGwgc2V0dGluZ3MKICAgKFlhc3QsIEZpcmVzdGFydGVyLCBldGMuKQoKCiAgIFEtNTk6IEhvdyBjYW4gSSB1c2UgeDExdm5jIHRvIGNvbm5lY3QgdG8gYW4gWCBsb2dpbiBzY3JlZW4gbGlrZSB4ZG0sCiAgIEdOT01FIGdkbSwgS0RFIGtkbSwgb3IgQ0RFIGR0bG9naW4/IChpLmUuIG5vYm9keSBpcyBsb2dnZWQgaW50byBhbiBYCiAgIHNlc3Npb24geWV0LikKCiAgIFdlIGRlc2NyaWJlIHR3byBzY2VuYXJpb3MgaGVyZS4gVGhlIGZpcnN0IGlzIGNhbGxlZCAnT25lIHRpbWUgb25seScKICAgbWVhbmluZyB5b3UganVzdCBuZWVkIHRvIGRvIGl0IHF1aWNrbHkgb25jZSBhbmQgZG9uJ3Qgd2FudCB0byByZXBlYXQ7CiAgIGFuZCB0aGUgc2Vjb25kIGlzIGNhbGxlZCAnQ29udGludW91c2x5JyBtZWFuaW5nIHlvdSB3YW50IHRoZSBhY2Nlc3MgdG8KICAgYmUgYXZhaWxhYmxlIGFmdGVyIGV2ZXJ5IHJlYm9vdCBhbmQgYWZ0ZXIgZXZlcnkgZGVza3RvcCBsb2dvdXQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIE9uZSB0aW1lIG9ubHk6ICAgSWYgdGhlIFggbG9naW4gc2NyZWVuIGlzIHJ1bm5pbmcgYW5kIHlvdSBqdXN0IHdhbnQgdG8KICAgY29ubmVjdCB0byBpdCBvbmNlIChpLmUuIGEgb25lLXNob3QpOgoKICAgSXQgaXMgdXN1YWxseSBwb3NzaWJsZSB0byBkbyB0aGlzIGJ5IGp1c3QgYWRqdXN0aW5nIHRoZSBYQVVUSE9SSVRZCiAgIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHBvaW50IHRvIHRoZSBjb3JyZWN0IE1JVC1DT09LSUUgYXV0aCBmaWxlCiAgIHdoaWxlIHJ1bm5pbmcgeDExdm5jIGFzIHJvb3QsIGUuZy4gZm9yIHRoZSBnbm9tZSBkaXNwbGF5IG1hbmFnZXIsIEdETToKICB4MTF2bmMgLWF1dGggL3Zhci9nZG0vOjAuWGF1dGggLWRpc3BsYXkgOjAKCiAgICh0aGUgLWF1dGggb3B0aW9uIHNldHMgdGhlIFhBVVRIT1JJVFkgdmFyaWFibGUgZm9yIHlvdS4pCgogICBUaGVyZSB3aWxsIGJlIGEgc2ltaWxhciB0aGluZyB0byBkbyBmb3IgeGRtIHVzaW5nIGhvd2V2ZXIgYSBkaWZmZXJlbnQKICAgYXV0aCBkaXJlY3RvcnkgcGF0aCAocGVyaGFwcyBzb21ldGhpbmcgbGlrZQogICAvdmFyL2xpYi94ZG0vYXV0aGRpci9hdXRoZmlsZXMvQTowLVhRdmFKaykgZm9yIHRoZSB4ZG0gZ3JlZXRlciBvcgogICAvdmFyL2xpYi9rZG0vQTowLWNyV2s3MiAob3IgL3Zhci9ydW4veGF1dGgvQTowLXFRUGZ0ciwgZXRjLiBldGMpIGZvcgogICB0aGUga2RtIGdyZWV0ZXIuIE9mIGNvdXJzZSwgdGhlIHJhbmRvbSBjaGFyYWN0ZXJzIGluIHRoZSBmaWxlIGJhc2VuYW1lCiAgIHdpbGwgdmFyeSBhbmQgeW91IHdpbGwgbmVlZCB0byB1c2UgdGhlIGFjdHVhbCBmaWxlbmFtZSBvbiB5b3VyIHN5c3RlbS4KICAgUmVhZCB5b3VyIHN5c3RlbSBkb2NzIHRvIGZpbmQgb3V0IHdoZXJlIHRoZSBkaXNwbGF5IG1hbmFnZXIgY29va2llCiAgIGZpbGVzIGFyZSBrZXB0LgoKICAgVHJpY2s6IHNvbWV0aW1lcyBwcygxKSBjYW4gcmV2ZWFsIHRoZSBYIHNlcnZlciBwcm9jZXNzIC1hdXRoIGFyZ3VtZW50CiAgIChlLmcuICJwcyB3d2F1eCB8IGdyZXAgYXV0aCIpIGFuZCBoZW5jZSB0aGUgcGF0aCB0byB0aGUgYXV0aCBmaWxlLgoKICAgeDExdm5jIG11c3QgYmUgcnVuIGFzIHJvb3QgZm9yIHRoaXMgYmVjYXVzZSB0aGUgL3Zhci9nZG0vOjAuWGF1dGgsCiAgIC92YXIvbGliL2tkbS9BOjAtY3JXazcyLCBldGMuIGF1dGggZmlsZXMgYXJlIG9ubHkgcmVhZGFibGUgYnkgcm9vdC4gSWYKICAgeW91IGRvIG5vdCB3YW50IHRvIHJ1biB4MTF2bmMgYXMgcm9vdCwgeW91IGNhbiBjb3B5IChhcyByb290IG9yIHN1ZG8pCiAgIHRoZSBhdXRoIGZpbGUgdG8gc29tZSBsb2NhdGlvbiBhbmQgbWFrZSBpdCByZWFkYWJsZSBieSB5b3VyIHVzZXJpZC4KICAgVGhlbiBydW4geDExdm5jIGFzIHlvdXIgdXNlcmlkIHdpdGggLWF1dGggcG9pbnRlZCB0byB0aGUgY29waWVkIGZpbGUuCgogICBVcGRhdGUgRGVjLzIwMDk6IHVzZSAiLWF1dGggZ3Vlc3MiIHRvIGhhdmUgeDExdm5jIHRyeSB0byBndWVzcyB0aGUKICAgbG9jYXRpb24gb2YgdGhlIGF1dGggZmlsZSBmb3IgeW91LgoKICAgWW91IG5leHQgY29ubmVjdCB0byB4MTF2bmMgd2l0aCBhIFZOQyB2aWV3ZXIsIGdpdmUgeW91ciB1c2VybmFtZSBhbmQKICAgcGFzc3dvcmQgdG8gdGhlIFggbG9naW4gcHJvbXB0IHRvIHN0YXJ0IHlvdXIgc2Vzc2lvbi4KCiAgIE5vdGU6ICBHRE06IGdkbSBzZWVtcyB0byBoYXZlIGFuIGFubm95aW5nIHNldHRpbmcgdGhhdCBjYXVzZXMgeDExdm5jCiAgIChhbmQgYW55IG90aGVyIFggY2xpZW50cykgdG8gYmUga2lsbGVkIGFmdGVyIHRoZSB1c2VyIGxvZ3MgaW4uIFNldHRpbmcKICAgS2lsbEluaXRDbGllbnRzPWZhbHNlIGluIHRoZSBbZGFlbW9uXSBzZWN0aW9uIG9mIC9ldGMvWDExL2dkbS9nZG0uY29uZgogICAob3IgL2V0Yy9nZG0vZ2RtLmNvbmYsIGV0Yy4pIGF2b2lkcyB0aGlzLiBPdGhlcndpc2UsIGp1c3QgcmVzdGFydAogICB4MTF2bmMgYW5kIHRoZW4gcmVjb25uZWN0IHlvdXIgdmlld2VyLiBPdGhlciBkaXNwbGF5IG1hbmFnZXJzIChrZG0sCiAgIGV0YykgbWF5IGFsc28gaGF2ZSBhIHNpbWlsYXIgcHJvYmxlbS4gT25lIHVzZXIgcmVwb3J0cyBoYXZpbmcgdG8gYWx0ZXIKICAgImdkbS5jb25mLWN1c3RvbSIgYXMgd2VsbC4KCiAgIE5vdGU6ICBTb2xhcmlzOiBGb3IgZHRsb2dpbiBpbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgc29ydCBvZiB0cmljawogICAoQlRXLCB0aGUgYXV0aCBmaWxlIHNob3VsZCBiZSBpbiAvdmFyL2R0KSwgeW91J2xsIGFsc28gbmVlZCB0byBhZGQKICAgc29tZXRoaW5nIGxpa2UgRHRsb2dpbipncmFiU2VydmVyOkZhbHNlIHRvIHRoZSBYY29uZmlnIGZpbGUKICAgKC9ldGMvZHQvY29uZmlnL1hjb25maWcgb3IgL3Vzci9kdC9jb25maWcvWGNvbmZpZyBvbiBTb2xhcmlzLCBzZWUgdGhlCiAgIGV4YW1wbGUgYXQgdGhlIGVuZCBvZiB0aGlzIEZBUS4pIFRoZW4gcmVzdGFydCBkdGxvZ2luLCBlLmcuOgogICAvZXRjL2luaXQuZC9kdGxvZ2luIHN0b3A7IC9ldGMvaW5pdC5kL2R0bG9naW4gc3RhcnQgb3IgcmVib290LgoKICAgVXBkYXRlIE5vdi8yMDA4OiBSZWdhcmRpbmcgR0RNIEtpbGxJbml0Q2xpZW50czogc2VlIHRoZSAtcmVvcGVuIG9wdGlvbgogICBmb3IgYW5vdGhlciBwb3NzaWJsZSB3b3JrYXJvdW5kLgoKICAgVXBkYXRlIE9jdC8yMDA5OiBSZWdhcmRpbmcgR0RNIEtpbGxJbml0Q2xpZW50czogc3RhcnRpbmcgd2l0aCB4MTF2bmMKICAgMC45LjkgaXQgd2lsbCB0cnkgdG8gYXBwbHkgaGV1cmlzdGljcyB0byBkZXRlY3QgaWYgYSB3aW5kb3cgbWFuYWdlciBpcwogICBub3QgcnVubmluZyAoaS5lLiB3aGV0aGVyIHRoZSBEaXNwbGF5IE1hbmFnZXIgR3JlZXRlciBMb2dpbiBwYW5lbCBpcwogICBzdGlsbCB1cC4pIElmIGl0IHRoaW5rcyB0aGUgZGlzcGxheSBtYW5hZ2VyIGxvZ2luIGlzIHN0aWxsIHVwIGl0IHdpbGwKICAgZGVsYXkgY3JlYXRpbmcgd2luZG93cyBvciB1c2luZyBYRklYRVMuIFRoZSBmb3JtZXIgaXMgd2hhdCBHRE0gdXNlcyB0bwogICBraWxsIHRoZSBpbml0aWFsIGNsaWVudHMsIHVzZSBvZiB0aGUgbGF0dGVyIGNhbiBjYXVzZSBhIGRpZmZlcmVudAogICBwcm9ibGVtOiBhbiBYb3JnIHNlcnZlciBjcmFzaC4gU28gd2l0aCAwLjkuOSBhbmQgbGF0ZXIgaXQgc2hvdWxkIGFsbAogICB3b3JrIHdpdGhvdXQgbmVlZGluZyB0byBzZXQgS2lsbEluaXRDbGllbnRzPWZhbHNlICh3aGljaCBpcyBhIGdvb2QKICAgYmVjYXVzZSByZWNlbnQgR0RNLCB2Mi4yNCwgaGFzIHJlbW92ZWQgdGhpcyBvcHRpb24pIG9yIHVzZSAtbm94Zml4ZXMuCiAgIFRvIGRpc2FibGUgdGhlIGhldXJpc3RpY3MgYW5kIGRlbGF5aW5nIHNldCBYMTFWTkNfQVZPSURfV0lORE9XUz1uZXZlcjsKICAgdG8gc2V0IHRoZSBkZWxheSB0aW1lIGV4cGxpY2l0bHkgdXNlLCBlLmcuLCBYMTFWTkNfQVZPSURfV0lORE9XUz0xMjAKICAgKGRlbGF5cyBmb3IgMTIwIHNlY29uZHMgYWZ0ZXIgdGhlIFZOQyBjb25uZWN0aW9uOyB5b3UgaGF2ZSB0aGF0IGxvbmcKICAgdG8gbG9nIGluLikKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgQ29udGludW91c2x5OiAgIEhhdmUgeDExdm5jIHJlYXR0YWNoIGVhY2ggdGltZSB0aGUgWCBzZXJ2ZXIgaXMKICAgcmVzdGFydGVkIChpLmUuIGFmdGVyIGVhY2ggbG9nb3V0IGFuZCByZWJvb3QpOgoKICAgVG8gbWFrZSB4MTF2bmMgYWx3YXlzIGF0dGFjaGVkIHRvIHRoZSBYIHNlcnZlciBpbmNsdWRpbmcgdGhlIGxvZ2luCiAgIHNjcmVlbiB5b3Ugd2lsbCBuZWVkIHRvIGFkZCBhIGNvbW1hbmQgdG8gYSBkaXNwbGF5IG1hbmFnZXIgc3RhcnR1cAogICBzY3JpcHQuCgogICBQbGVhc2UgY29uc2lkZXIgdGhlIHNlY3VyaXR5IGltcGxpY2F0aW9ucyBvZiB0aGlzISBUaGUgVk5DIGRpc3BsYXkgZm9yCiAgIHRoZSBYIHNlc3Npb24gYWx3YXlzIGFjY2Vzc2libGUgKGJ1dCBob3BlZnVsbHkgcGFzc3dvcmQgcHJvdGVjdGVkLikKICAgQWRkIC1sb2NhbGhvc3QgaWYgeW91IG9ubHkgcGxhbiB0byBhY2Nlc3MgdmlhIGEgU1NIIHR1bm5lbC4KCiAgIFRoZSBuYW1lIG9mIHRoZSBkaXNwbGF5IG1hbmFnZXIgc3RhcnR1cCBzY3JpcHQgZmlsZSBkZXBlbmRzIG9uIGRlc2t0b3AKICAgdXNlZCBhbmQgc2VlbSB0byBiZToKICAgICBHRE0gKEdOT01FKSAgL2V0Yy9YMTEvZ2RtL0luaXQvRGVmYXVsdAogICAgICAgICAgICAgICAgICAvZXRjL2dkbS9Jbml0L0RlZmF1bHQKICAgICBLRE0gKEtERSkgICAgL2V0Yy9rZGUqL2tkbS9Yc2V0dXAKICAgICBYRE0gICAgICAgICAgL2V0Yy9YMTEveGRtL1hzZXR1cCAgICAgICAgICAob3Igc29tZXRpbWVzIHhkbS9Yc2V0dXBfMCkKICAgICBDREUgICAgICAgICAgL2V0Yy9kdC9jb25maWcvWHNldHVwCgogICBhbHRob3VnaCB0aGUgZXhhY3QgbG9jYXRpb24gY2FuIGJlIG9wZXJhdGluZyBzeXN0ZW0sIGRpc3RyaWJ1dGlvbiwgYW5kCiAgIHRpbWUgZGVwZW5kZW50LiBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHlvdXIgZGlzcGxheSBtYW5hZ2VyOgogICBnZG0oMSksIGtkbSgxKSwgeGRtKDEpLCBkdGxvZ2luKDEpIGZvciBhZGRpdGlvbmFsIGRldGFpbHMuIFRoZXJlIG1heQogICBhbHNvIGJlIGRpc3BsYXkgbnVtYmVyIHNwZWNpZmljIHNjcmlwdHM6IGUuZy4gWHNldHVwXzAgdnMuIFhzZXR1cCwgeW91CiAgIG5lZWQgdG8gd2F0Y2ggb3V0IGZvci4KCiAgIE5vdGU6ICBZb3Ugc2hvdWxkIHJlYWQgYW5kIHVuZGVyc3RhbmQgYWxsIG9mIHRoZSBOb3RlJ3MgYW5kIFVwZGF0ZSdzCiAgIGluIHRoZSAnT25lIHRpbWUgb25seScgc2VjdGlvbiBhYm92ZS4gQWxsIG9mIHRoZSBHRE0gdG9waWNzIGFwcGx5IGhlcmUKICAgYXMgd2VsbDoKCiAgIE5vdGU6ICBHRE06IFRoZSBhYm92ZSAoaW4gJ09uZSB0aW1lIG9ubHknKSBnZG0gc2V0dGluZyBvZgogICBLaWxsSW5pdENsaWVudHM9ZmFsc2UgaW4gL2V0Yy9YMTEvZ2RtL2dkbS5jb25mIChvciAvZXRjL2dkbS9nZG0uY29uZiwKICAgZXRjLikgZm9yIEdETSBpcyBuZWVkZWQgaGVyZSBhcyB3ZWxsLiBPdGhlciBkaXNwbGF5IG1hbmFnZXJzIChLRE0sCiAgIGV0YykgbWF5IGFsc28gaGF2ZSBhIHNpbWlsYXIgcHJvYmxlbS4KCiAgIEFsc28gc2VlIHRoZSBVcGRhdGUgT2N0LzIwMDkgYWJvdmUgd2hlcmUgeDExdm5jIDAuOS45IGFuZCBsYXRlcgogICBhdXRvbWF0aWNhbGx5IGF2b2lkcyBiZWluZyBraWxsZWQuCgogICBOb3RlOiAgRHRMb2dpbjogVGhlIGFib3ZlIChpbiAnT25lIHRpbWUgb25seScpCiAgIER0bG9naW4qZ3JhYlNlcnZlcjpGYWxzZSBzdGVwIGZvciBTb2xhcmlzIHdpbGwgYmUgbmVlZGVkIGZvciBkdGxvZ2luCiAgIGhlcmUgYXMgd2VsbC4KCiAgIEluIGFueSBldmVudCwgdGhlIGxpbmUgeW91IHdpbGwgYWRkIHRvIHRoZSBkaXNwbGF5IG1hbmFnZXIgc2NyaXB0CiAgIChYc2V0dXAsIERlZmF1bHQsIG9yIHdoYXRldmVyKSB3aWxsIGxvb2sgc29tZXRoaW5nIGxpa2U6CiAgL3Vzci9sb2NhbC9iaW4veDExdm5jIC1yZmJhdXRoIC9wYXRoL3RvL3RoZS92bmMvcGFzc3dkIC1vIC92YXIvbG9nL3gxMXZuYy5sb2cKIC1mb3JldmVyIC1iZwoKICAgd2hlcmUgeW91IHNob3VsZCBjdXN0b21pemUgdGhlIGV4YWN0IGNvbW1hbmQgdG8geW91ciBuZWVkcyAoZS5nLgogICAtbG9jYWxob3N0IGZvciBTU0ggdHVubmVsLW9ubHkgYWNjZXNzOyAtc3NsIFNBVkUgZm9yIFNTTCBhY2Nlc3M7IGV0Yy4pCgogICBIYXBweSwgaGFwcHksIGpveSwgam95OiAgTm90ZSB0aGF0IHdlIGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgLWRpc3BsYXkKICAgb3IgLWF1dGggYmVjYXVzZSBoYXBwaWx5IHRoZXkgYXJlIGFscmVhZHkgc2V0IGZvciB1cyBpbiB0aGUgRElTUExBWQogICBhbmQgWEFVVEhPUklUWSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIHRoZSBYc2V0dXAgc2NyaXB0ISEhCgogICBZb3UgbWF5IGFsc28gd2FudCB0byBmb3JjZSB0aGUgVk5DIHBvcnQgd2l0aCBzb21ldGhpbmcgbGlrZSAiLXJmYnBvcnQKICAgNTkwMCIgKG9yIC1OKSB0byBhdm9pZCBhdXRvc2VsZWN0aW5nIG9uZSBpZiA1OTAwIGlzIGFscmVhZHkgdGFrZW4uCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIEZlZG9yYS9nZG06IEhlcmUgaXMgYW4gZXhhbXBsZSBvZiB3aGF0IHdlIGRpZCBvbiBhIHZhbmlsbGEgaW5zdGFsbCBvZgogICBGZWRvcmEtQzMgKHNlZW1zIHRvIHVzZSBnZG0gYnkgZGVmYXVsdC4pIEFkZCBhIGxpbmUgbGlrZSB0aGlzIHRvCiAgIC9ldGMvWDExL2dkbS9Jbml0LzowCiAgL3Vzci9sb2NhbC9iaW4veDExdm5jIC1yZmJhdXRoIC9ldGMveDExdm5jLnBhc3N3ZCAtZm9yZXZlciAtYmcgLW8gL3Zhci9sb2cveDEKMXZuYy5sb2cKCiAgIEFuZCB0aGVuIGFkZCB0aGlzIGxpbmUgdG8gL2V0Yy9YMTEvZ2RtL2dkbS5jb25mIChvciAvZXRjL2dkbS9nZG0uY29uZiwKICAgZXRjLikgaW4gdGhlIFtkYWVtb25dIHNlY3Rpb246CiAgS2lsbEluaXRDbGllbnRzPWZhbHNlCgogICBUaGVuIHJlc3RhcnQ6IC91c3Ivc2Jpbi9nZG0tcmVzdGFydCAob3IgcmVib290LikgVGhlCiAgIEtpbGxJbml0Q2xpZW50cz1mYWxzZSBzZXR0aW5nIGlzIGltcG9ydGFudDogd2l0aG91dCBpdCB4MTF2bmMgd2lsbCBiZQogICBraWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZXIgbG9ncyBpbi4gSGVyZSBhcmUgZnVsbCBkZXRhaWxzIG9uCiAgIGhvdyB0byBjb25maWd1cmUgZ2RtCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFNvbGFyaXMvZHRsb2dpbjogSGVyZSBpcyBhbiBleGFtcGxlIG9mIHdoYXQgd2UgZGlkIG9uIGEgdmFuaWxsYQogICBpbnN0YWxsIG9mIFNvbGFyaXM6CiAgIE1ha2UgdGhlIGRpcmVjdG9yeSAvZXRjL2R0L2NvbmZpZzoKICBta2RpciAtcCAvZXRjL2R0L2NvbmZpZwoKICAgQ29weSBvdmVyIHRoZSBYY29uZmlnIGZpbGUgZm9yIGN1c3RvbWl6YXRpb246CiAgY3AgL3Vzci9kdC9jb25maWcvWGNvbmZpZyAvZXRjL2R0L2NvbmZpZy9YY29uZmlnCgogICBFZGl0IC9ldGMvZHQvY29uZmlnL1hjb25maWcgYW5kIHVuY29tbWVudCB0aGUgbGluZToKICBEdGxvZ2luKmdyYWJTZXJ2ZXI6ICAgICAgICBGYWxzZQoKICAgTmV4dCwgY29weSBvdmVyIFhzZXR1cCBmb3IgY3VzdG9taXphdGlvbjoKICBjcCAvdXNyL2R0L2NvbmZpZy9Yc2V0dXAgL2V0Yy9kdC9jb25maWcvWHNldHVwCgogICBFZGl0IC9ldGMvZHQvY29uZmlnL1hzZXR1cCBhbmQgYXQgdGhlIGJvdHRvbSBwdXQgYSBsaW5lIGxpa2U6CiAgL3Vzci9sb2NhbC9iaW4veDExdm5jIC1mb3JldmVyIC1vIC92YXIvbG9nL3gxMXZuYy5sb2cgLWJnCgogICAodHdlYWtlZCB0byB5b3VyIGxvY2FsIHNldHVwIGFuZCBwcmVmZXJlbmNlcywgYSBwYXNzd29yZCB2aWEgLXJmYmF1dGgsCiAgIGV0Yy4gd291bGQgYmUgYSB2ZXJ5IGdvb2QgaWRlYS4pCgogICBSZXN0YXJ0IHRoZSBYIHNlcnZlciBhbmQgZHRsb2dpbjoKICAvZXRjL2luaXQuZC9kdGxvZ2luIHN0b3AKICAvZXRjL2luaXQuZC9kdGxvZ2luIHN0YXJ0CgogICAob3IgcmVib290IG9yIG1heWJlIGp1c3QgcmVzdGFydCB0aGUgWCBzZXNzaW9uLikKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgS0RNOiBPbmUgdXNlciBydW5uaW5nIHRoZSBrZG0gZGlzcGxheSBtYW5hZ2VyIHJlcG9ydHMgcHV0dGluZyB0aGlzCiAgIGxpbmU6CiAgeDExdm5jIC1mb3JldmVyIC1yZmJhdXRoIC9ob21lL3h5ei8udm5jL3Bhc3N3ZCAtYmcgLW8gL3Zhci9sb2cveDExdm5jLmxvZwoKICAgaW4gL2V0Yy9rZGUva2RtL1hzZXR1cC4gQWZ0ZXIgcmVib290aW5nIHRoZSBzeXN0ZW0gaXQgYWxsIHNlZW1lZCB0bwogICB3b3JrIGZpbmUuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCgogICBJZiB5b3UgZG8gbm90IHdhbnQgdG8gZGVhbCB3aXRoIGFueSBkaXNwbGF5IG1hbmFnZXIgc3RhcnR1cCBzY3JpcHRzLAogICBoZXJlIGlzIGEga2x1ZGdleSBzY3JpcHQgdGhhdCBjYW4gYmUgcnVuIG1hbnVhbGx5IG9yIG91dCBvZiBhIGJvb3QKICAgZmlsZSBsaWtlIHJjLmxvY2FsOiB4MTF2bmNfbG9vcCBJdCB3aWxsIG5lZWQgc29tZSBsb2NhbCBjdXN0b21pemF0aW9uCiAgIGJlZm9yZSBydW5uaW5nLiBCZWNhdXNlIHRoZSBYQVVUSE9SSVRZIGF1dGggZmlsZSBtdXN0IGJlIGd1ZXNzZWQgYnkKICAgdGhpcyBzY3JpcHQsIHVzZSBvZiB0aGUgZGlzcGxheSBtYW5hZ2VyIHNjcmlwdCBtZXRob2QgZGVzY3JpYmVkIGFib3ZlCiAgIGlzIGdyZWF0bHkgcHJlZmVycmVkLiBUaGVyZSBpcyBhbHNvIHRoZSAtbG9vcCBvcHRpb24gdGhhdCBkb2VzCiAgIHNvbWV0aGluZyBzaW1pbGFyLgoKICAgSWYgdGhlIG1hY2hpbmUgaXMgYSB0cmFkaXRpb25hbCBYdGVybWluYWwgeW91IG1heSB3YW50IHRvIHJlYWQgdGhpcwogICBGQVEuCgogICBGaXJld2FsbHM6IG5vdGUgYWxsIG1ldGhvZHMgd2lsbCByZXF1aXJlIHRoZSBob3N0LWxldmVsIGZpcmV3YWxsIHRvIGJlCiAgIGNvbmZpZ3VyZWQgdG8gYWxsb3cgY29ubmVjdGlvbnMgaW4gb24gYSBwb3J0LiBFLmcuIDU5MDAgKGRlZmF1bHQgVk5DCiAgIHBvcnQpIG9yIDIyIChkZWZhdWx0IFNTSCBwb3J0IGZvciB0dW5uZWxsaW5nIFZOQy4pIE1vc3Qgc3lzdGVtcyB0aGVzZQogICBkYXlzIGhhdmUgZmlyZXdhbGxzIHR1cm5lZCBvbiBieSBkZWZhdWx0LCBzbyB5b3Ugd2lsbCBhY3RpdmVseSBoYXZlIHRvCiAgIGRvIHNvbWV0aGluZyB0byBwb2tlIGEgaG9sZSBpbiB0aGUgZmlyZXdhbGwgYXQgdGhlIGRlc2lyZWQgcG9ydAogICBudW1iZXIuIFNlZSB5b3VyIHN5c3RlbSBhZG1pbmlzdHJhdGlvbiB0b29sIGZvciBGaXJld2FsbCBzZXR0aW5ncwogICAoWWFzdCwgRmlyZXN0YXJ0ZXIsIGV0Yy4pCgoKICAgUS02MDogQ2FuIEkgcnVuIHgxMXZuYyBvdXQgb2YgaW5ldGQoOCk/IEhvdyBhYm91dCB4aW5ldGQoOCk/CgogICBZZXMsIHBlcmhhcHMgYSBsaW5lIHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gL2V0Yy9pbmV0ZC5jb25mIHdpbGwgZG8gaXQKICAgZm9yIHlvdToKCiAgNTkwMCBzdHJlYW0gdGNwIG5vd2FpdCByb290IC91c3Ivc2Jpbi90Y3BkIC91c3IvbG9jYWwvYmluL3gxMXZuY19zaAoKICAgd2hlcmUgdGhlIHNoZWxsIHNjcmlwdCAvdXNyL2xvY2FsL2Jpbi94MTF2bmNfc2ggdXNlcyB0aGUgLWluZXRkIG9wdGlvbgogICBhbmQgbG9va3Mgc29tZXRoaW5nIGxpa2UgKHlvdSdsbCBuZWVkIHRvIGN1c3RvbWl6ZSB0byB5b3VyIHNldHRpbmdzLikKIyEvYmluL3NoCi91c3IvbG9jYWwvYmluL3gxMXZuYyAtaW5ldGQgLWRpc3BsYXkgOjAgLWF1dGggL2hvbWUvZnJlZC8uWGF1dGhvcml0eSBcCiAgICAgICAgLXJmYmF1dGggL2hvbWUvZnJlZC8udm5jL3Bhc3N3ZCAtbyAvdmFyL2xvZy94MTF2bmNfc2gubG9nCgogICBJbXBvcnRhbnQ6ICBOb3RlIHRoYXQgeW91IG11c3QgcmVkaXJlY3QgdGhlIHN0YW5kYXJkIGVycm9yIG91dHB1dCB0byBhCiAgIGxvZyBmaWxlIChlLmcuIC1vIGxvZ2ZpbGUpIG9yICIyPi9kZXYvbnVsbCIgZm9yIHByb3BlciBvcGVyYXRpb24gdmlhCiAgIGluZXRkIChvdGhlcndpc2UgdGhlIHN0YW5kYXJkIGVycm9yIGFsc28gZ29lcyB0byB0aGUgVk5DIHZuY3ZpZXdlciwKICAgYW5kIHRoYXQgY29uZnVzZXMgaXQgZ3JlYXRseSwgY2F1c2luZyBpdCB0byBhYm9ydC4pIElmIHlvdSBkbyBub3QgdXNlCiAgIGEgd3JhcHBlciBzY3JpcHQgYXMgYWJvdmUgYnV0IHJhdGhlciBjYWxsIHgxMXZuYyBkaXJlY3RseSBpbgogICAvZXRjL2luZXRkLmNvbmYgYW5kIGRvIG5vdCByZWRpcmVjdCBzdGRlcnIgdG8gYSBmaWxlLCB0aGVuIHlvdSBtdXN0CiAgIHNwZWNpZnkgdGhlIC1xIChha2EgLXF1aWV0KSBvcHRpb246ICIvdXNyL2xvY2FsL2Jpbi94MTF2bmMgLXEgLWluZXRkCiAgIC4uLiIuIFdoZW4geW91IHN1cHBseSBib3RoIC1xIGFuZCAtaW5ldCBhbmQgbm8gIi1vIGxvZ2ZpbGUiIHRoZW4KICAgc3RkZXJyIHdpbGwgYXV0b21hdGljYWxseSBiZSBjbG9zZWQgKHRvIHByZXZlbnQsIGUuZy4gbGlicmFyeSBzdGRlcnIKICAgbWVzc2FnZXMgbGVha2luZyBvdXQgdG8gdGhlIHZpZXdlci4pIFRoZSByZWNvbW1lbmRlZCBwcmFjdGljZSBpcyB0bwogICB1c2UgIi1vIGxvZ2ZpbGUiIHRvIGNvbGxlY3QgdGhlIG91dHB1dCBpbiBhIGZpbGUgb3Igd3JhcHBlciBzY3JpcHQKICAgd2l0aCAiMj5sb2dmaWxlIiByZWRpcmVjdGlvbiBiZWNhdXNlIHRoZSBlcnJvcnMgYW5kIHdhcm5pbmdzIHByaW50ZWQKICAgb3V0IGFyZSB2ZXJ5IHVzZWZ1bCBpbiB0cm91Ymxlc2hvb3RpbmcgcHJvYmxlbXMuCgogICBOb3RlIGFsc28gdGhlIG5lZWQgdG8gc2V0IFhBVVRIT1JJVFkgdmlhIC1hdXRoIHRvIHBvaW50IHRvIHRoZQogICBNSVQtQ09PS0lFIGF1dGggZmlsZSB0byBnZXQgcGVybWlzc2lvbiB0byBjb25uZWN0IHRvIHRoZSBYIGRpc3BsYXkKICAgKHNldHRpbmcgYW5kIGV4cG9ydGluZyB0aGUgWEFVVEhPUklUWSB2YXJpYWJsZSBhY2NvbXBsaXNoZXMgdGhlIHNhbWUKICAgdGhpbmcuKSBTZWUgdGhlIHgxMXZuY19sb29wIGZpbGUgaW4gdGhlIHByZXZpb3VzIHF1ZXN0aW9uIGZvciBtb3JlCiAgIGlkZWFzIG9uIHdoYXQgdGhhdCBhdXRoIGZpbGUgbWF5IGJlLCBldGMuIFRoZSBzY2hlbWUgZGVzY3JpYmVkIGluIHRoZQogICBGQVEgb24gVW5peCB1c2VyIGxvZ2lucyBhbmQgaW5ldGQoOCkgd29ya3MgYXJvdW5kIHRoZSBYQVVUSE9SSVRZIGlzc3VlCiAgIG5pY2VseS4KCiAgIE5vdGU6ICBPbiBTb2xhcmlzIHlvdSBjYW5ub3QgaGF2ZSB0aGUgYmFyZSBudW1iZXIgNTkwMCBpbgogICAvZXRjL2luZXRkLmNvbmYsIHlvdSdsbCBuZWVkIHRvIHJlcGxhY2UgaXQgd2l0aCBhIHdvcmQgbGlrZSB4MTF2bmMgYW4KICAgdGhlbiBwdXQgc29tZXRoaW5nIGxpa2UgIngxMXZuYyA1OTAwL3RjcCIgaW4gL2V0Yy9zZXJ2aWNlcy4KCiAgIFNpbmNlIHRoZSBwcm9jZXNzIHJ1bnMgYXMgcm9vdCwgaXQgbWlnaHQgYmUgYSBiYWQgaWRlYSB0byBoYXZlIHRoZQogICBsb2dmaWxlIGluIGEgd29ybGQtd3JpdGFibGUgYXJlYSBsaWtlIC90bXAgaWYgdGhlcmUgYXJlIHVudHJ1c3R3b3J0aHkKICAgdXNlcnMgb24gdGhlIG1hY2hpbmUuIFBlcmhhcHMgL3Zhci9sb2cgaXMgYSBiZXR0ZXIgcGxhY2UuCgogICBCZSBzdXJlIHRvIGxvb2sgYXQgeW91ciAvZXRjL2hvc3RzLmFsbG93IGFuZCAvZXRjL2hvc3RzLmRlbnkgc2V0dGluZ3MKICAgdG8gbGltaXQgdGhlIG1hY2hpbmVzIHRoYXQgY2FuIGNvbm5lY3QgdG8gdGhpcyBzZXJ2aWNlICh5b3VyIGRlc2t0b3AhKQogICBGb3IgdGhlIGFib3ZlIGV4YW1wbGUgd2l0aCAvZXRjL2hvc3RzLmFsbG93OgogIHgxMXZuY19zaCA6IDEyMy40NS42Ny44OQoKICAgQSByZWFsbHkgc2FmZSB3YXkgdG8gZG8gdGhpbmdzIGlzIHRvIGxpbWl0IHRoZSBhYm92ZSBpbmV0ZCB0bwogICBsb2NhbGhvc3Qgb25seSAodmlhIC9ldGMvaG9zdHMuYWxsb3cpIGFuZCB1c2Ugc3NoIHRvIHR1bm5lbCB0aGUKICAgaW5jb21pbmcgY29ubmVjdGlvbi4gVXNpbmcgaW5ldGQgZm9yIHRoaXMgcHJldmVudHMgdGhlcmUgYmVpbmcgYSB0aW55CiAgIHdpbmRvdyBvZiBvcHBvcnR1bml0eSBiZXR3ZWVuIHgxMXZuYyBzdGFydGluZyB1cCBhbmQgeW91ciB2bmN2aWV3ZXIKICAgY29ubmVjdGluZyB0byBpdC4gQWx3YXlzIHVzZSBhIFZOQyBwYXNzd29yZCB0byBmdXJ0aGVyIHByb3RlY3QgYWdhaW5zdAogICB1bndhbnRlZCBhY2Nlc3MuCgogICBGb3IgeGluZXRkKDgpLCBvbmUgdXNlciByZXBvcnRzIGhlIGNyZWF0ZWQgdGhlIGZpbGUKICAgL2V0Yy94aW5ldGQuZC94MTF2bmNzZXJ2aWNlIGNvbnRhaW5pbmcgdGhlIGZvbGxvd2luZzoKIyBkZWZhdWx0OiBvZmYKIyBkZXNjcmlwdGlvbjoKc2VydmljZSB4MTF2bmNzZXJ2aWNlCnsKICAgICAgICBmbGFncyAgICAgICAgICAgPSBSRVVTRSBOQU1FSU5BUkdTCiAgICAgICAgcG9ydCAgICAgICAgICAgID0gNTkwMAogICAgICAgIHR5cGUgICAgICAgICAgICA9IFVOTElTVEVECiAgICAgICAgc29ja2V0X3R5cGUgICAgID0gc3RyZWFtCiAgICAgICAgcHJvdG9jb2wgICAgICAgID0gdGNwCiAgICAgICAgd2FpdCAgICAgICAgICAgID0gbm8KICAgICAgICB1c2VyICAgICAgICAgICAgPSByb290CiAgICAgICAgc2VydmVyICAgICAgICAgID0gL3Vzci9zYmluL3RjcGQKICAgICAgICBzZXJ2ZXJfYXJncyAgICAgPSAvdXNyL2xvY2FsL2Jpbi94MTF2bmNfc2gKICAgICAgICBkaXNhYmxlICAgICAgICAgPSBubwp9CgogICBXaXRoIHRoZSBjb250ZW50cyBvZiAvdXNyL2xvY2FsL2Jpbi94MTF2bmNfc2ggc2ltaWxhciB0byB0aGUgZXhhbXBsZQogICBnaXZlbiBhYm92ZS4gT25lIHVzZXIgcmVwb3J0cyB0aGlzIHdvcmtzIHdpdGggYXZvaWRpbmcgdGhlIHdyYXBwZXIKICAgc2NyaXB0OgpzZXJ2aWNlIHgxMXZuY3NlcnZpY2UKewogICAgICAgIHBvcnQgICAgICAgICAgICA9IDU5MDAKICAgICAgICB0eXBlICAgICAgICAgICAgPSBVTkxJU1RFRAogICAgICAgIHNvY2tldF90eXBlICAgICA9IHN0cmVhbQogICAgICAgIHByb3RvY29sICAgICAgICA9IHRjcAogICAgICAgIHdhaXQgICAgICAgICAgICA9IG5vCiAgICAgICAgdXNlciAgICAgICAgICAgID0gcm9vdAogICAgICAgIHNlcnZlciAgICAgICAgICA9IC91c3IvbG9jYWwvYmluL3gxMXZuYwogICAgICAgIHNlcnZlcl9hcmdzICAgICA9IC1pbmV0ZCAtcSAtZGlzcGxheSA6MCAtYXV0aCAvdmFyL2dkbS86MC5YYXV0aAogICAgICAgIGRpc2FibGUgICAgICAgICA9IG5vCn0KCiAgIChvciBvbmUgY2FuIHJlcGxhY2UgdGhlIC1xIHdpdGggc2F5ICItbyAvdmFyL2xvZy94MTF2bmMubG9nIiB0bwogICBjYXB0dXJlIGEgbG9nKQoKICAgVGhlIGFib3ZlIHdvcmtzIG5pY2VseSBmb3IgR0RNIGJlY2F1c2UgdGhlIC1hdXRoIGZpbGUgaXMgYSBmaXhlZCBuYW1lLgogICBGb3IgS0RNIG9yIFhETSB0aGUgZmlsZW5hbWUgdmFyaWVzLiBIZXJlIGlzIG9uZSBpZGVhIGZvciBhIHgxMXZuY19zaAogICB3cmFwcGVyIHRvIHRyeSB0byBndWVzcyB0aGUgbmFtZToKIyEvYmluL3NoCkNPTFVNTlM9MjU2CmV4cG9ydCBDT0xVTU5TCmF1dGhmaWxlPWBwcyB3d2F1eCB8IGdyZXAgJy9YLiotYXV0aCcgfCBncmVwIC12IGdyZXAgfCBzZWQgLWUgJ3MvXi4qLWF1dGggKi8vJwotZSAncy8gLiokLy8nIHwgaGVhZCAtbiAxYAoKaWYgWyAtciAiJGF1dGhmaWxlIiBdOyB0aGVuCiAgICAgICAgZXhlYyAvdXNyL2xvY2FsL2Jpbi94MTF2bmMgLWluZXRkIC1vIC92YXIvbG9nL3gxMXZuYy5sb2cgLWRpc3BsYXkgOjAgLWEKdXRoICIkYXV0aGZpbGUiCmZpCmV4aXQgMQoKICAgU3RhcnRpbmcgd2l0aCB4MTF2bmMgMC45LjMgdGhpcyBjYW4gYmUgYXV0b21hdGVkIGJ5OgojIS9iaW4vc2gKZXhlYyAvdXNyL2xvY2FsL2Jpbi94MTF2bmMgLWluZXRkIC1vIC92YXIvbG9nL3gxMXZuYy5sb2cgLWZpbmQgLWVudiBGRF9YRE09MQoKCiAgIFEtNjE6IENhbiBJIGhhdmUgeDExdm5jIGFkdmVydGlzZSBpdHMgVk5DIHNlcnZpY2UgYW5kIHBvcnQgdmlhIG1ETlMgLwogICBaZXJvY29uZiAoZS5nLiBBdmFoaSkgc28gVk5DIHZpZXdlcnMgb24gdGhlIGxvY2FsIG5ldHdvcmsgY2FuIGRldGVjdAogICBpdCBhdXRvbWF0aWNhbGx5PwoKICAgWWVzLCBhcyBvZiBGZWIvMjAwNyB4MTF2bmMgc3VwcG9ydHMgbUROUyAvIFplcm9jb25mIGFkdmVydGlzaW5nIG9mIGl0cwogICBzZXJ2aWNlIHZpYSB0aGUgQXZhaGkgY2xpZW50IGxpYnJhcnkuIFVzZSB0aGUgb3B0aW9uIC1hdmFoaSAoc2FtZSBhcwogICAtbWRucyBvciAtemVyb2NvbmYpIHRvIGVuYWJsZSBpdC4gRGVwZW5kaW5nIG9uIHlvdXIgc2V0dXAgeW91IG1heSBuZWVkCiAgIHRvIGluc3RhbGwgQXZhaGkgKGluY2x1ZGluZyB0aGUgZGV2ZWxvcG1lbnQvYnVpbGQgcGFja2FnZXMpLCBlbmFibGUKICAgdGhlIHNlcnZlcjogYXZhaGktZGFlbW9uIGFuZCBhdmFoaS1kbnNjb25mZCwgYW5kIHBvc3NpYmx5IG9wZW4gdXAgVURQCiAgIHBvcnQgNTM1MyBvbiB5b3VyIGZpcmV3YWxsLgoKICAgSWYgdGhlIEF2YWhpIGNsaWVudCBsaWJyYXJ5IG9yIGJ1aWxkIGVudmlyb25tZW50IGlzIG5vdCBhdmFpbGFibGUgYXQKICAgYnVpbGQtdGltZSwgdGhlbiBhdCBydW4tdGltZSB4MTF2bmMgd2lsbCB0cnkgdG8gbG9vayBmb3IgZXh0ZXJuYWwKICAgaGVscGVyIHByb2dyYW1zLCBhdmFoaS1icm93c2UoMSkgb3IgZG5zLXNkKDEpLCB0byBkbyB0aGUgd29yay4KCiAgIFRoZSBzZXJ2aWNlIHdhcyB0ZXN0ZWQgd2l0aCBDaGlja2VuIG9mIHRoZSBWTkMgKCJVc2UgQm9uam91ciIKICAgc2VsZWN0ZWQpIG9uIGEgTWFjIG9uIHRoZSBzYW1lIG5ldHdvcmsgYW5kIHRoZSBzZXJ2aWNlIHdhcyBub3RlZCBhbmQKICAgbGlzdGVkIGluIHRoZSBzZXJ2ZXJzIGxpc3QuIENsaWNraW5nIG9uIGl0IGFuZCB0aGVuICJDb25uZWN0IgogICBjb25uZWN0ZWQgYXV0b21hdGljYWxseSB3L28gaGF2aW5nIHRvIGVudGVyIGFueSBob3N0bmFtZXMgb3IgcG9ydAogICBudW1iZXJzLgoKICAgSXQgYXBwZWFycyBTdVNFIDEwLjEgY29tZXMgd2l0aCBhdmFoaSAob3IgeW91IGNhbiBhZGQgcGFja2FnZXMsIGUuZy4KICAgYXZhaGktMC42LjUtMjcpIGJ1dCBub3QgdGhlIGRldmVsb3BtZW50IHBhY2thZ2UgKHlvdSBjYW4gdXNlIHRoZQogICBPcGVuU3VTRSBhdmFoaS1kZXZlbCBycG0uKSBVbmZvcnR1bmF0ZWx5LCB5b3UgbWF5IG5lZWQgdG8gZGlzYWJsZQogICBhbm90aGVyIFplcm9jb25mIGRhZW1vbiAiL2V0Yy9pbml0LmQvbWRuc2Qgc3RvcCIsIGJlZm9yZSBkb2luZwogICAiL2V0Yy9pbml0LmQvYXZhaGktZGFlbW9uIHN0YXJ0IiBhbmQgIi9ldGMvaW5pdC5kL2F2YWhpLWRuc2NvbmZkCiAgIHN0YXJ0Ii4gV2UgYWxzbyBoYWQgdG8gY29tbWVudCBvdXQgdGhlIGJyb3dzZS1kb21haW5zIGxpbmUgaW4KICAgL2V0Yy9hdmFoaS9hdmFoaS1kYWVtb24uY29uZi4gSG9wZWZ1bGx5IHRoZXJlIGlzICJMZXNzQ29uZiIgdG8gZG8gb24KICAgb3RoZXIgZGlzdHJvcy9PUydzLi4uCgoKICAgUS02MjogQ2FuIEkgaGF2ZSB4MTF2bmMgYWxsb3cgYSB1c2VyIHRvIGxvZyBpbiB3aXRoIGhlciBVTklYIHVzZXJuYW1lCiAgIGFuZCBwYXNzd29yZCBhbmQgdGhlbiBoYXZlIGl0IGZpbmQgaGVyIFggc2Vzc2lvbiBkaXNwbGF5IG9uIHRoYXQKICAgbWFjaGluZSBhbmQgdGhlbiBhdHRhY2ggdG8gaXQ/IEhvdyBhYm91dCBzdGFydGluZyBhbiBYIHNlc3Npb24gaWYgb25lCiAgIGNhbm5vdCBiZSBmb3VuZD8KCiAgIFRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHZpYSBpbmV0ZCg4KSB1c2luZyB0aGUgLXVuaXhwdyBhbmQKICAgLWRpc3BsYXkgV0FJVCBvcHRpb25zLiBUaGUgcmVhc29uIGluZXRkKDgpIG1ha2VzIHRoaXMgZWFzaWVyIGlzIHRoYXQKICAgaXQgc3RhcnRzIGEgbmV3IHgxMXZuYyBwcm9jZXNzIGZvciBlYWNoIG5ldyB1c2VyIGNvbm5lY3Rpb24uIE90aGVyd2lzZQogICBhIHdyYXBwZXIgd291bGQgaGF2ZSB0byBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIGFuZCBzcGF3biBuZXcgeDExdm5jJ3MKICAgKHNlZSB0aGlzIGV4YW1wbGUgYW5kIGFsc28gdGhlIC1sb29wYmcgb3B0aW9uLikgaW5ldGQoOCkgaXMgbm90CiAgIHJlcXVpcmVkIGZvciB0aGlzLCBidXQgaXQgbWFrZXMgc29tZSBhc3BlY3RzIG1vcmUgZ2VuZXJhbC4KCiAgIEFsc28gd2l0aCBpbmV0ZCg4KSB1c2VycyBhbHdheXMgY29ubmVjdCB0byBhIGZpeGVkIFZOQyBkaXNwbGF5LCBzYXkKICAgaG9zdG5hbWU6MCwgYW5kIGRvIG5vdCBuZWVkIHRvIG1lbW9yaXplIGEgc3BlY2lhbCBWTkMgZGlzcGxheSBudW1iZXIKICAganVzdCBmb3IgdGhlaXIgcGVyc29uYWwgdXNlLCBldGMuCgogICBVcGRhdGU6IFVzZSB0aGUgLWZpbmQsIC1jcmVhdGUsIC1zdmMsIGFuZCAteGRtc3ZjIG9wdGlvbnMgdGhhdCBhcmUKICAgc2hvcnRoYW5kIGZvciBjb21tb24gRklORENSRUFURURJU1BMQVkgdXNhZ2UgbW9kZXMgKGUuZy4gdGVybWluYWwKICAgc2VydmljZXMpIGRlc2NyaWJlZCBiZWxvdy4gKGkuZS4gc2ltcGx5IHVzZSAiLXN2YyIgaW5zdGVhZCBvZiB0aGUKICAgY3VtYmVyc29tZSAiLWRpc3BsYXkgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWHZmYiAtdW5peHB3IC11c2VycwogICB1bml4cHc9IC1zc2wgU0FWRSIpCgogICBUaGUgLWRpc3BsYXkgV0FJVCBvcHRpb24gbWFrZXMgeDExdm5jIHdhaXQgdW50aWwgYSBWTkMgdmlld2VyIGlzCiAgIGNvbm5lY3RlZCBiZWZvcmUgYXR0YWNoaW5nIHRvIHRoZSBYIGRpc3BsYXkuCgogICBBZGRpdGlvbmFsbHkgaXQgY2FuIGJlIHVzZWQgdG8gcnVuIGFuIGV4dGVybmFsIGNvbW1hbmQgdGhhdCByZXR1cm5zCiAgIHRoZSBESVNQTEFZIGFuZCBYQVVUSE9SSVRZIGRhdGEuIFdlIHByb3ZpZGUgc29tZSB1c2VmdWwgYnVpbHRpbiBvbmVzCiAgIChGSU5ERElTUExBWSBhbmQgRklORENSRUFURURJU1BMQVkgYmVsb3cpLCBidXQgaW4gcHJpbmNpcGxlIG9uZSBjb3VsZAogICBzdXBwbHkgaGlzIG93biBzY3JpcHQ6ICItZGlzcGxheSBXQUlUOmNtZD0vcGF0aC90by9maW5kX2Rpc3BsYXkiIHdoZXJlCiAgIHRoZSBzY3JpcHQgZmluZF9kaXNwbGF5IG1pZ2h0IGxvb2sgc29tZXRoaW5nIGxpa2UgdGhpcy4KCiAgIEEgZGVmYXVsdCBzY3JpcHQgc29tZXdoYXQgbGlrZSB0aGUgYWJvdmUgaXMgdXNlZCB1bmRlciAiLWRpc3BsYXkKICAgV0FJVDpjbWQ9RklORERJU1BMQVkiIChzYW1lIGFzIC1maW5kKSBUaGUgZm9ybWF0IGZvciBhbnkgc3VjaCBjb21tYW5kCiAgIGlzIHRoYXQgaXQgcmV0dXJucyBESVNQTEFZPTpkaXNwIGFzIHRoZSBmaXJzdCBsaW5lIGFuZCBhbnkgcmVtYWluaW5nCiAgIGxpbmVzIGFyZSBlaXRoZXIgWEFVVEhPUklUWT1maWxlIG9yIHJhdyB4YXV0aCBkYXRhICh0aGUgYWJvdmUgZXhhbXBsZQogICBkb2VzIHRoZSBsYXR0ZXIuKSBJZiBhcHBsaWNhYmxlICgtdW5peHB3IG1vZGUpLCB0aGUgcHJvZ3JhbSBpcyBydW4gYXMKICAgdGhlIFVuaXggdXNlciBuYW1lIHdobyBsb2dnZWQgaW4uCgogICBPbiBMaW51eCBpZiB0aGUgdmlydHVhbCB0ZXJtaW5hbCBpcyBrbm93biB0aGUgcHJvZ3JhbSBhcHBlbmRzICIsVlQ9biIKICAgdG8gdGhlIERJU1BMQVkgbGluZTsgYSBjaHZ0IG4gd2lsbCBiZSBhdHRlbXB0ZWQgYXV0b21hdGljYWxseS4gT3IgaWYKICAgb25seSB0aGUgWCBzZXJ2ZXIgcHJvY2VzcyBJRCBpcyBrbm93biBpdCBhcHBlbmRzICIsWFBJRD1uIiAoYSBjaHZ0CiAgIHdpbGwgYmUgYXR0ZW1wdGVkIGJ5IHgxMXZuYy4pCgogICBUaXA6IE5vdGUgdGhhdCB0aGUgLWZpbmQgb3B0aW9uIGlzIGFuIGFsaWFzIGZvciAiLWRpc3BsYXkKICAgV0FJVDpjbWQ9RklORERJU1BMQVkiLiBVc2UgaXQhCgogICBUaGUgLXVuaXhwdyBvcHRpb24gYWxsb3dzIFVOSVggcGFzc3dvcmQgbG9naW5zLiBJdCBjb252ZW5pZW50bHkga25vd3MKICAgdGhlIFVuaXggdXNlcm5hbWUgd2hvc2UgWCBkaXNwbGF5IHNob3VsZCBiZSBmb3VuZC4gSGVyZSBhcmUgYSBjb3VwbGUKICAgL2V0Yy9pbmV0ZC5jb25mIGV4YW1wbGVzIG9mIHRoaXMgdXNhZ2U6CjU5MDAgIHN0cmVhbSAgdGNwICBub3dhaXQgIG5vYm9keSAgL3Vzci9zYmluL3RjcGQgL3Vzci9sb2NhbC9iaW4veDExdm5jIC1pbmV0ZAotdW5peHB3IFwKICAgICAgLWZpbmQgLW8gL3Zhci9sb2cveDExdm5jLmxvZyAtc3NsIFNBVkUgLXNzbGRpciAvdXNyL2xvY2FsL2NlcnRzCjU5MDAgIHN0cmVhbSAgdGNwICBub3dhaXQgIHJvb3QgICAgL3Vzci9zYmluL3RjcGQgL3Vzci9sb2NhbC9iaW4veDExdm5jIC1pbmV0ZAotdW5peHB3IFwKICAgICAgLWZpbmQgLW8gL3Zhci9sb2cveDExdm5jLmxvZyAtc3NsIFNBVkUgLXVzZXJzIHVuaXhwdz0KCiAgIE5vdGUgd2UgaGF2ZSB1c2VkIHRoZSAtZmluZCBhbGlhcyBhbmQgdGhlIHZlcnkgbG9uZyBsaW5lcyBoYXZlIGJlZW4KICAgc3BsaXQuIEFuIGFsdGVybmF0aXZlIGlzIHRvIHVzZSBhIHdyYXBwZXIgc2NyaXB0LCBlLmcuCiAgIC91c3IvbG9jYWwvYmluL3gxMXZuYy5zaCB0aGF0IGhhcyBhbGwgb2YgdGhlIG9wdGlvbnMuIChzZWUgYWxzbyB0aGUKICAgLXN2YyBhbGlhcy4pCgogICBJbiB0aGUgZmlyc3QgaW5ldGQgbGluZSB4MTF2bmMgaXMgcnVuIGFzIHVzZXIgIm5vYm9keSIgYW5kIHN0YXlzIHVzZXIKICAgbm9ib2R5IGR1cmluZyB0aGUgd2hvbGUgc2Vzc2lvbi4gVGhlIHBlcm1pc3Npb25zIG9mIHRoZSBsb2cgZmlsZXMgYW5kCiAgIGNlcnRzIGRpcmVjdG9yeSB3aWxsIG5lZWQgdG8gYmUgc2V0IHVwIHRvIGFsbG93ICJub2JvZHkiIHRvIHVzZSB0aGVtLgoKICAgSW4gdGhlIHNlY29uZCBvbmUgeDExdm5jIGlzIHJ1biBhcyByb290IGFuZCBzd2l0Y2hlcyB0byB0aGUgdXNlciB0aGF0CiAgIGxvZ3MgaW4gZHVlIHRvIHRoZSAiLXVzZXJzIHVuaXhwdz0iIG9wdGlvbi4KCiAgIE5vdGUgdGhhdCBTU0wgaXMgcmVxdWlyZWQgZm9yIHRoaXMgbW9kZSBiZWNhdXNlIG90aGVyd2lzZSB0aGUgVW5peAogICBwYXNzd29yZCB3b3VsZCBiZSBwYXNzZWQgaW4gY2xlYXIgdGV4dCBvdmVyIHRoZSBuZXR3b3JrLiBJbiBnZW5lcmFsCiAgIC11bml4cHcgaXMgbm90IHJlcXVpcmVkIGZvciB0aGlzIHNvcnQgb2Ygc2NoZW1lLCBidXQgaXQgaXMgY29udmVuaWVudAogICBiZWNhdXNlIGl0IGRldGVybWluZXMgZXhhY3RseSB3aG8gdGhlIFVuaXggdXNlciBpcyB3aG9zZSBkaXNwbGF5CiAgIHNob3VsZCBiZSBzb3VnaHQuIE90aGVyd2lzZSB0aGUgZmluZF9kaXNwbGF5IHNjcmlwdCB3b3VsZCBoYXZlIHRvIHVzZQogICBzb21lIG1ldGhvZCB0byB3b3JrIG91dCBESVNQTEFZLCBYQVVUSE9SSVRZLCBldGMgKHBlcmhhcHMgeW91IHVzZQogICBtdWx0aXBsZSBpbmV0ZCBwb3J0cyBhbmQgaGFyZHdpcmUgdXNlcm5hbWVzIGZvciBkaWZmZXJlbnQgcG9ydHMuKQoKICAgSWYgeW91IHJlYWxseSB3YW50IHRvIGRpc2FibGUgdGhlIFNTTCBvciBTU0ggLWxvY2FsaG9zdCBjb25zdHJhaW50cwogICAodGhpcyBpcyBub3QgcmVjb21tZW5kZWQgdW5sZXNzIHlvdSByZWFsbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmc6CiAgIFVuaXggcGFzc3dvcmRzIHNlbnQgaW4gY2xlYXIgdGV4dCBpcyBhIHZlcnkgYmFkIGlkZWEuLi4pIHJlYWQgdGhlCiAgIC11bml4cHcgZG9jdW1lbnRhdGlvbi4KCiAgIEEgaW5ldGQoOCkgc2NoZW1lIGZvciBhIGZpeGVkIHVzZXIgdGhhdCBkb2Vzbid0IHVzZSBTU0wgb3IgdW5peAogICBwYXNzd2RzIGNvdWxkIGJlOgogIC91c3IvbG9jYWwvYmluL3gxMXZuYyAtaW5ldGQgLXVzZXJzID1mcmVkIC1maW5kIC1yZmJhdXRoIC9ob21lL2ZyZWQvLnZuYy9wYXNzCndkIC1vIC92YXIvbG9nL3gxMXZuYy5sb2cKCiAgIFRoZSAiLXVzZXJzID1mcmVkIiBvcHRpb24gd2lsbCBjYXVzZSB4MTF2bmMgdG8gc3dpdGNoIHRvIHVzZXIgZnJlZCBhbmQKICAgdGhlbiBmaW5kIGhpcyBYIGRpc3BsYXkuIFRoZSBWTkMgcGFzc3dvcmQgKC1yZmJhdXRoKSBhcyBvcHBvc2VkIHRvCiAgIFVuaXggcGFzc3dvcmQgKC11bml4cHcpIGlzIHVzZWQgdG8gYXV0aGVudGljYXRlIHRoZSBWTkMgY2xpZW50LgoKICAgU2ltaWxhciBsb29raW5nIGNvbW1hbmRzIHRvIHRoZSBhYm92ZSBleGFtcGxlcyBjYW4gYmUgcnVuIGRpcmVjdGx5IGFuZAogICBkbyBub3QgdXNlIGluZXRkIChqdXN0IHJlbW92ZSB0aGUgLWluZXRkIG9wdGlvbiBhbmQgcnVuIGZyb20gdGhlCiAgIGNtZGxpbmUsIGV0Yy4pCgoKICAgWCBTZXNzaW9uIENyZWF0aW9uOiBBbiBhZGRlZCAoTm92LzIwMDYpIGV4dGVuc2lvbiB0byBGSU5ERElTUExBWSBpcwogICBGSU5EQ1JFQVRFRElTUExBWSB3aGVyZSBpZiBpdCBkb2VzIG5vdCBmaW5kIGFuIFggZGlzcGxheSB2aWEgdGhlCiAgIEZJTkRESVNQTEFZIG1ldGhvZCBpdCB3aWxsIGNyZWF0ZSBhbiBYIHNlcnZlciBzZXNzaW9uIGZvciB0aGUgdXNlcgogICAoaS5lLiBkZXNrdG9wL3Rlcm1pbmFsIHNlcnZlci4pIFRoaXMgaXMgdGhlIG9ubHkgdGltZSB4MTF2bmMgYWN0dWFsbHkKICAgdHJpZXMgdG8gc3RhcnQgdXAgYW4gWCBzZXJ2ZXIgKG5vcm1hbGx5IGl0IGp1c3QgYXR0YWNoZXMgdG8gYW4KICAgZXhpc3Rpbmcgb25lLikKCiAgIEZvciB2aXJ0dWFsIHNlc3Npb25zIHlvdSB3aWxsIG5lZWQgdG8gaW5zdGFsbCB0aGUgWHZmYiBwcm9ncmFtIChlLmcuCiAgIGFwdC1nZXQgaW5zdGFsbCB4dmZiKSBvciBvdXIgWGR1bW15IHByb2dyYW0gKHNlZSBiZWxvdy4pCgogICBCeSBkZWZhdWx0IGl0IHdpbGwgb25seSB0cnkgdG8gc3RhcnQgdXAgdmlydHVhbCAobm9uLWhhcmR3YXJlKSBYCiAgIHNlcnZlcnM6IGZpcnN0IFh2ZmIgYW5kIGlmIHRoYXQgaXMgbm90IGF2YWlsYWJsZSB0aGVuIFhkdW1teSAoaW5jbHVkZWQKICAgaW4gdGhlIHgxMXZuYyBzb3VyY2UgY29kZS4pIE5vdGUgdGhhdCBYZHVtbXkgb25seSB3b3JrcyBvbiBMaW51eAogICB3aGVyZWFzIFh2ZmIgd29ya3MganVzdCBhYm91dCBldmVyeXdoZXJlIChhbmQgaW4gc29tZSBzaXR1YXRpb25zCiAgIFhkdW1teSBtdXN0IGJlIHJ1biBhcyByb290LikgQW4gYWR2YW50YWdlIG9mIFhkdW1teSBvdmVyIFh2ZmIgaXMgdGhhdAogICBYZHVtbXkgc3VwcG9ydHMgUkFORFIgZHluYW1pYyBzY3JlZW4gcmVzaXppbmcsIHdoaWNoIGNhbiBiZSBoYW5keSBpZgogICB0aGUgdXNlciBhY2Nlc3NlcyB0aGUgZGVza3RvcCBmcm9tIGRpZmZlcmVudCBzaXplZCBzY3JlZW5zIChlLmcuCiAgIHdvcmtzdGF0aW9uIGFuZCBsYXB0b3AuKQoKICAgU28gYW4gaW5ldGQoOCkgZXhhbXBsZSBtaWdodCBsb29rIGxpa2U6CjU5MDAgc3RyZWFtIHRjcCBub3dhaXQgcm9vdCAvdXNyL3NiaW4vdGNwZCAvdXNyL2xvY2FsL2Jpbi94MTF2bmMgLWluZXRkIFwKICAgICAgLW8gL3Zhci9sb2cveDExdm5jLmxvZyAtaHR0cCAtcHJvZyAvdXNyL2xvY2FsL2Jpbi94MTF2bmMgXAogICAgICAtc3NsIFNBVkUgLXVuaXhwdyAtdXNlcnMgdW5peHB3PSAtZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWQoKICAgV2hlcmUgdGhlIHZlcnkgbG9uZyBsaW5lcyBoYXZlIGJlZW4gc3BsaXQuIFNlZSBiZWxvdyB3aGVyZSB0aGF0IGxvbmcKICAgYW5kIGN1bWJlcnNvbWUgbGFzdCBsaW5lIGlzIHJlcGxhY2VkIGJ5IHRoZSAtc3ZjIGFsaWFzLgoKICAgVGhlIGFib3ZlIG1vZGUgd2lsbCBhbGxvdyBkaXJlY3QgU1NMIChlLmcuIHNzX3ZuY3ZpZXdlciBvciBTU1ZOQykKICAgYWNjZXNzIGFuZCBhbHNvIEphdmEgV2ViIGJyb3dlcnMgYWNjZXNzIHZpYTogaHR0cHM6Ly9ob3N0bmFtZTo1OTAwLy4KCiAgIFRpcDogTm90ZSB0aGF0IHRoZSAtY3JlYXRlIG9wdGlvbiBpcyBhbiBhbGlhcyBmb3IgIi1kaXNwbGF5CiAgIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIiLgoKICAgVGlwOiBOb3RlIHRoYXQgLXN2YyBpcyBhIHNob3J0IGhhbmQgZm9yIHRoZSBsb25nICItc3NsIFNBVkUgLXVuaXhwdwogICAtdXNlcnMgdW5peHB3PSAtZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWSIgcGFydC4gVW5saWtlCiAgIC1jcmVhdGUsIHRoaXMgYWxpYXMgYWxzbyBzZXRzIHVwIFNTTCBlbmNyeXB0aW9uIGFuZCBVbml4IHBhc3N3b3JkCiAgIGxvZ2luLgoKICAgVGhlIGFib3ZlIGluZXRkIGV4YW1wbGUgdGhlbiBzaW1wbGlmaWVzIHRvOgo1OTAwIHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgL3Vzci9zYmluL3RjcGQgL3Vzci9sb2NhbC9iaW4veDExdm5jIC1pbmV0ZCBcCiAgICAgIC1vIC92YXIvbG9nL3gxMXZuYy5sb2cgLWh0dHAgLXByb2cgL3Vzci9sb2NhbC9iaW4veDExdm5jIFwKICAgICAgLXN2YwoKICAgVGlwOiBJbiBhZGRpdGlvbiB0byB0aGUgdXN1YWwgdW5peHB3IHBhcmFtZXRlcnMsIGluc2lkZSB0aGUgVk5DIHZpZXdlcgogICB0aGUgdXNlciBjYW4gc3BlY2lmeSBhZnRlciBoaXMgdXNlcm5hbWUgKGZvbGxvd2luZyBhICI6IiBzZWUgLWRpc3BsYXkKICAgV0FJVCBmb3IgZGV0YWlscykgZm9yIEZJTkRDUkVBVEVESVNQTEFZIHRoZXkgY2FuIGFkZCAiZ2VvbT1XeEgiIG9yCiAgICJnZW9tPVd4SHhEIiB0byBzcGVjaWZ5IHRoZSB3aWR0aCwgaGVpZ2h0LCBhbmQgb3B0aW9uYWxseSB0aGUgY29sb3IKICAgZGVwdGguIEUuZy4gImZyZWQ6Z2VvbT04MDB4NjAwIiBhdCB0aGUgbG9naW46IHByb21wdC4gQWxzbyBpZiB0aGUgZW52LgogICB2YXIgWDExVk5DX0NSRUFURV9HRU9NIGlzIHNldCB0byB0aGUgZGVzaXJlZCBXeEggb3IgV3hIeEQgdGhhdCB3aWxsIGJlCiAgIHVzZWQgYnkgeDExdm5jLgoKICAgWW91IGNhbiBzZXQgdGhlIGVudi4gdmFyIFgxMVZOQ19TS0lQX0RJU1BMQVkgdG8gYSBjb21tYSBzZXBhcmF0ZWQgbGlzdAogICBvZiBkaXNwbGF5cyB0byBpZ25vcmUgaW4gdGhlIEZJTkRESVNQTEFZIHByb2Nlc3MgKHRvIGZvcmNlIGNyZWF0aW9uIG9mCiAgIG5ldyBkaXNwbGF5cyBpbiBzb21lIGNhc2VzLikgVGhlIHVzZXIgbG9nZ2luZyBpbiB2aWEgdGhlIHZuY3ZpZXdlciBjYW4KICAgYWxzbyBzZXQgdGhpcyB2aWEgdXNlcm5hbWU6bm9kaXNwbGF5PS4uLikKCiAgIElmIHlvdSBkbyBub3QgcGxhbiBvbiB1c2luZyB0aGUgSmF2YSBXZWIgYnJvd3NlciBhcHBsZXQgeW91IGNhbiByZW1vdmUKICAgdGhlIC1odHRwIChhbmQgLXByb2cpIG9wdGlvbiBzaW5jZSB0aGlzIHdpbGwgc3BlZWQgdXAgbG9nZ2luZy1pbiBieSBhCiAgIGZldyBzZWNvbmRzICh4MTF2bmMgd2lsbCBub3QgaGF2ZSB0byB3YWl0IHRvIHNlZSBpZiBhIGNvbm5lY3Rpb24gaXMKICAgSFRUUFMgb3IgVk5DLikKCiAgIEZvciByZWZlcmVuY2UsIHhpbmV0ZCBmb3JtYXQgaW4gdGhlIGZpbGUsIHNheSwgL2V0Yy94aW5ldGQuZC94MTF2bmM6CnNlcnZpY2UgeDExdm5jCnsKICAgICAgICB0eXBlICAgICAgICAgICAgPSBVTkxJU1RFRAogICAgICAgIHBvcnQgICAgICAgICAgICA9IDU5MDAKICAgICAgICBzb2NrZXRfdHlwZSAgICAgPSBzdHJlYW0KICAgICAgICBwcm90b2NvbCAgICAgICAgPSB0Y3AKICAgICAgICB3YWl0ICAgICAgICAgICAgPSBubwogICAgICAgIHVzZXIgICAgICAgICAgICA9IHJvb3QKICAgICAgICBzZXJ2ZXIgICAgICAgICAgPSAvdXNyL2xvY2FsL2Jpbi94MTF2bmMKICAgICAgICBzZXJ2ZXJfYXJncyAgICAgPSAtaW5ldGQgLW8gL3Zhci9sb2cveDExdm5jLmxvZyAtaHR0cCAtcHJvZyAvdXNyL2xvY2FsLwpiaW4veDExdm5jIC1zdmMKICAgICAgICBkaXNhYmxlICAgICAgICAgPSBubwp9CgogICBUbyBwcmludCBvdXQgdGhlIHNjcmlwdCBpbiB0aGlzIGNhc2UgdXNlICItZGlzcGxheQogICBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS1wcmludCIuIFRvIGNoYW5nZSB0aGUgcHJlZmVyZW5jZSBvZgogICBYc2VydmVycyBhbmQgd2hpY2ggdG8gdHJ5IGxpc3QgdGhlbSwgZS5nLjogIi1kaXNwbGF5CiAgIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVgsWHZmYixYZHVtbXkiIG9yIHVzZSAiLWNyZWF0ZV94c3J2CiAgIFgsWHZmYixYZHVtbXkiLiBUaGUgIlgiIG9uZSBtZWFucyB0byB0cnkgdG8gc3RhcnQgdXAgYSByZWFsLCBoYXJkd2FyZQogICBYIHNlcnZlciwgZS5nLiBzdGFydHgoMSkgKGlmIHRoZXJlIGlzIGFscmVhZHkgYSByZWFsIFggc2VydmVyIHJ1bm5pbmcKICAgdGhpcyBtYXkgb25seSB3b3JrIG9uIExpbnV4IGFuZCB0aGUgY2h2dCBwcm9ncmFtIG1heSBuZWVkIHRvIGJlIHJ1biB0bwogICBzd2l0Y2ggdG8gdGhlIGNvcnJlY3QgTGludXggdmlydHVhbCB0ZXJtaW5hbC4pIHgxMXZuYyB3aWxsIHRyeSB0byBydW4KICAgY2h2dCBhdXRvbWF0aWNhbGx5IGlmIGl0IGNhbiBkZXRlcm1pbmUgd2hpY2ggVlQgc2hvdWxkIGJlIHN3aXRjaGVkIHRvLgoKICAgWERNL0dETS9LRE0gTG9naW4gR3JlZXRlciBQYW5lbDogSWYgeW91IHdhbnQgdG8gcHJlc2VudCB0aGUgdXNlciB3aXRoCiAgIGEgeGRtL2dkbS9rZG0gZGlzcGxheSBtYW5hZ2VyICJncmVldGVyIiBsb2dpbiB5b3UgY2FuIHVzZSBYdmZiLnhkbWNwCiAgIGluc3RlYWQgb2YgWHZmYiwgZXRjIGluIHRoZSBhYm92ZSBsaXN0LiBIb3dldmVyLCB5b3UgbmVlZCB0byBjb25maWd1cmUKICAgeGRtL2dkbS9rZG0gdG8gYWNjZXB0IGxvY2FsaG9zdCBYRE1DUCBtZXNzYWdlcywgdGhpcyBjYW4gYmUgZG9uZSBieQogICAoZnJvbSAtaGVscCBvdXRwdXQpOgogICAgICBJZiB5b3Ugd2FudCB0aGUgRklORENSRUFURURJU1BMQVkgc2Vzc2lvbiB0byBjb250YWN0IGFuIFhETUNQIGxvZ2luCiAgICAgIG1hbmFnZXIgKHhkbS9nZG0va2RtKSBvbiB0aGUgc2FtZSBtYWNoaW5lLCB0aGVuIHVzZSAiWHZmYi54ZG1jcCIKICAgICAgaW5zdGVhZCBvZiAiWHZmYiIsIGV0Yy4gIFRoZSB1c2VyIHdpbGwgaGF2ZSB0byBzdXBwbHkgaGlzIHVzZXJuYW1lCiAgICAgIGFuZCBwYXNzd29yZCBvbmUgbW9yZSB0aW1lIChidXQgaGUgZ2V0cyB0byBzZWxlY3QgaGlzIGRlc2t0b3AKICAgICAgdHlwZSBzbyB0aGF0IGNhbiBiZSB1c2VmdWwuKSAgRm9yIHRoaXMgdG8gd29yaywgeW91IHdpbGwgbmVlZCB0bwogICAgICBlbmFibGUgbG9jYWxob3N0IFhETUNQICh1ZHAgcG9ydCAxNzcpIGZvciB0aGUgZGlzcGxheSBtYW5hZ2VyLgogICAgICBUaGlzIHNlZW1zIHRvIGJlOgoKICAgICAgIGZvciBnZG0gaW4gZ2RtLmNvbmY6ICAgRW5hYmxlPXRydWUgaW4gc2VjdGlvbiBbeGRtY3BdCiAgICAgICBmb3Iga2RtIGluIGtkbXJjOiAgICAgIEVuYWJsZT10cnVlIGluIHNlY3Rpb24gW1hkbWNwXQogICAgICAgZm9yIHhkbSBpbiB4ZG0tY29uZmlnOiBEaXNwbGF5TWFuYWdlci5yZXF1ZXN0UG9ydDogMTc3CgogICBVbmxlc3MgeW91IGFyZSBhbHNvIHByb3ZpZGluZyBYRE1DUCBzZXJ2aWNlIHRvIHh0ZXJtaW5hbHMgb3Igb3RoZXIKICAgbWFjaGluZXMsIG1ha2Ugc3VyZSB0aGF0IHRoZSBob3N0IGFjY2VzcyBsaXN0IG9ubHkgYWxsb3dzIGxvY2FsCiAgIGNvbm5lY3Rpb25zICh0aGUgbmFtZSBvZiB0aGlzIGZpbGUgaXMgb2Z0ZW4gWGFjY2VzcyBhbmQgaXQgaXMgdXN1YWxseQogICBzZXR1cCBieSBkZWZhdWx0IHRvIGRvIGp1c3QgdGhhdC4pIE5vd2FkYXlzLCBob3N0IGxldmVsIGZpcmV3YWxsaW5nCiAgIHdpbGwgYWxzbyB0eXBpY2FsbHkgYmxvY2sgVURQIChwb3J0IDE3NyBmb3IgWERNQ1ApIGJ5IGRlZmF1bHQKICAgZWZmZWN0aXZlbHkgbGltaXRpbmcgdGhlIFVEUCBjb25uZWN0aW9ucyB0byBsb2NhbGhvc3QuCgogICBUaXA6IE5vdGUgdGhhdCAteGRtc3ZjIGlzIGEgc2hvcnQgaGFuZCBhbGlhcyBmb3IgdGhlIGxvbmcgIi1zc2wgU0FWRQogICAtdW5peHB3IC11c2VycyB1bml4cHc9IC1kaXNwbGF5CiAgIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIueGRtY3AiLiBTbyB3ZSBzaW1wbHkgdXNlOgpzZXJ2aWNlIHgxMXZuYwp7CiAgICAgICAgdHlwZSAgICAgICAgICAgID0gVU5MSVNURUQKICAgICAgICBwb3J0ICAgICAgICAgICAgPSA1OTAwCiAgICAgICAgc29ja2V0X3R5cGUgICAgID0gc3RyZWFtCiAgICAgICAgcHJvdG9jb2wgICAgICAgID0gdGNwCiAgICAgICAgd2FpdCAgICAgICAgICAgID0gbm8KICAgICAgICB1c2VyICAgICAgICAgICAgPSByb290CiAgICAgICAgc2VydmVyICAgICAgICAgID0gL3Vzci9sb2NhbC9iaW4veDExdm5jCiAgICAgICAgc2VydmVyX2FyZ3MgICAgID0gLWluZXRkIC1vIC92YXIvbG9nL3gxMXZuYy5sb2cgLXhkbXN2YwogICAgICAgIGRpc2FibGUgICAgICAgICA9IG5vCn0KCiAgIChOb3RlOiB1c2UgIi1zdmMiIGluc3RlYWQgb2YgIi14ZG1zdmMiIGZvciBubyBYRE1DUCBsb2dpbiBncmVldGVyLikKCgogICBMb2NhbCBhY2Nlc3MgKFZOQyBTZXJ2ZXIgYW5kIFZOQyBWaWV3ZXIgb24gdGhlIHNhbWUgbWFjaGluZSk6IFRvCiAgIGFjY2VzcyB5b3VyIHZpcnR1YWwgWCBkaXNwbGF5IHNlc3Npb24gbG9jYWxseSAoaS5lLiB3aGlsZSBzaXR0aW5nIGF0CiAgIHRoZSBzYW1lIG1hY2hpbmUgaXQgaXMgcnVubmluZyBvbikgb25lIGNhbiBwZXJoYXBzIGhhdmUgc29tZXRoaW5nIGxpa2UKICAgdGhpcyBpbiB0aGVpciAkSE9NRS8ueGluaXRyYwojIS9iaW4vc2gKeDExdm5jIC1jcmVhdGUgLXJmYnBvcnQgNTkwNSAtZW52IFdBSVRCRz0xCnZuY3ZpZXdlciAtZ2VvbWV0cnkgKzArMCAtZW5jb2RpbmdzIHJhdyAtcGFzc3dkICRIT01FLy52bmMvcGFzc3dkIGxvY2FsaG9zdDo1CgogICBZb3UgbWF5IG5vdCBuZWVkIHRoZSAtcGFzc3dkLiBSZWNlbnQgUmVhbFZOQyB2aWV3ZXJzIG1pZ2h0IGJlIHRoaXM6CiMhL2Jpbi9zaAp4MTF2bmMgLWNyZWF0ZSAtcmZicG9ydCA1OTA1IC1lbnYgV0FJVEJHPTEKdm5jdmlld2VyIC1GdWxsU2NyZWVuIC1QcmVmZXJyZWRFbmNvZGluZyByYXcgLXBhc3N3ZCAkSE9NRS8udm5jL3Bhc3N3ZCBsb2NhbGhvcwp0OjUKCiAgIFRoaXMgd2F5IGEgYmFyZSBYIHNlcnZlciBpcyBydW4gd2l0aCBubyB3aW5kb3cgbWFuYWdlciBvciBkZXNrdG9wOyBpdAogICBzaW1wbHkgcnVucyBvbmx5IHRoZSBWTkMgVmlld2VyIG9uIHRoZSByZWFsIFggc2VydmVyLiBUaGUgVmlld2VyIHRoZW4KICAgZHJhd3MgdGhlIHZpcnR1YWwgWCBzZXNzaW9uIG9uIHRvIHRoZSByZWFsIG9uZS4gT24geW91ciBzeXN0ZW0gaXQKICAgbWlnaHQgbm90IGJlICRIT01FLy54aW5pdHJjLCBidXQgcmF0aGVyIC54c2Vzc2lvbiwgLlhjbGllbnRzLCBvcgogICBzb21ldGhpbmcgZWxzZS4gWW91IHdpbGwgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgaXQgaXMgZm9yIHlvdXIgc3lzdGVtCiAgIGFuZCBjb25maWd1cmF0aW9uLgoKICAgVGhlcmUgbWF5IGJlIGEgcHJvYmxlbSBpZiB0aGUgcmVzb2x1dGlvbiAoV3hIKSBvZiB0aGUgdmlydHVhbCBYCiAgIGRpc3BsYXkgZG9lcyBub3QgbWF0Y2ggdGhhdCBvZiB0aGUgcGh5c2ljYWwgWCBkaXNwbGF5LgoKICAgSWYgeW91IGRvIG5vdCB3YW50IHRvIG9yIGNhbm5vdCBmaWd1cmUgb3V0IHRoZSBYIHN0YXJ0dXAgc2NyaXB0IG5hbWUKICAgKC54aW5pdHJjLCBldGMpIHlvdSBjb3VsZCBzYXZlIHRoZSBhYm92ZSBjb21tYW5kcyB0byBhIHNoZWxsIHNjcmlwdCwKICAgc2F5ICJ2bmNsb2NhbCIsIGFuZCB0aGUgbG9nIGluIHZpYSB0aGUgbm9ybWFsIEtETSBvciBHRE0gZ3JlZXRlcgogICBwcm9ncmFtIHVzaW5nIHRoZSAiRmFpbHNhZmUiIG9wdGlvbi4gVGhlbiBpbiB0aGUgbG9uZSB4dGVybSB0aGF0IGNvbWVzCiAgIHVwIHR5cGUgInZuY2xvY2FsIiB0byBjb25uZWN0IHRvIHlvdXIgdmlydHVhbCBYIGRpc3BsYXkgdmlhIHgxMXZuYyBhbmQKICAgdm5jdmlld2VyLgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgU3VtbWFyeTogVGhlICItZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWSIgc2NoZW1lIGNhbiBiZSB1c2VkCiAgIHRvIHByb3ZpZGUgYSAiZGVza3RvcCBzZXJ2aWNlIiAoaS5lLiB0ZXJtaW5hbCBzZXJ2aWNlKSBvbiB0aGUgc2VydmVyCiAgIG1hY2hpbmU6IHlvdSBhbHdheXMgZ2V0IHNvbWUgZGVza3RvcCB0aGVyZSwgZWl0aGVyIGEgcmVhbCBoYXJkd2FyZSBYCiAgIHNlcnZlciBvciBhIHZpcnR1YWwgb25lIChkZXBlbmRpbmcgb24gaG93IHlvdSBzZXQgdGhpbmdzIHVwLikKCiAgIFNvIGl0IHByb3ZpZGVzIHNpbXBsZSAidGVybWluYWwgc2VydmljZXMiIGJhc2VkIG9uIFVuaXggdXNlcm5hbWUgYW5kCiAgIHBhc3N3b3JkLiBUaGUgY3JlYXRlZCBYIHNlcnZlciBzZXNzaW9ucyAodmlydHVhbCBvciByZWFsIGhhcmR3YXJlKQogICB3aWxsIHJlbWFpbiBydW5uaW5nIGFmdGVyIHlvdSBkaXNjb25uZWN0IHRoZSBWTkMgdmlld2VyIGFuZCB3aWxsIGJlCiAgIGZvdW5kIGFnYWluIG9uIHJlY29ubmVjdGluZyB2aWEgVk5DIGFuZCBsb2dnaW5nIGluLiBUbyB0ZXJtaW5hdGUgdGhlbQogICB1c2UgdGhlIG5vcm1hbCB3YXkgdG8gRXhpdC9Mb2dPdXQgZnJvbSBpbnNpZGUgeW91ciBYIHNlc3Npb24uIFRoZSB1c2VyCiAgIGRvZXMgbm90IGhhdmUgdG8gbWVtb3JpemUgd2hpY2ggVk5DIGRpc3BsYXkgbnVtYmVyIGlzIGhpcy4gVGhleSBhbGwgZ28KICAgdGhlIHNhbWUgb25lIChlLmcuIGhvc3RuYW1lOjApIGFuZCBpdCBzd2l0Y2hlcyBiYXNlZCBvbiB1c2VybmFtZS4KCgogICBRLTYzOiBDYW4gSSBoYXZlIHgxMXZuYyByZXN0YXJ0IGl0c2VsZiBhZnRlciBpdCB0ZXJtaW5hdGVzPwoKICAgT25lIGNvdWxkIGRvIHRoaXMgaW4gYSBzaGVsbCBzY3JpcHQsIGJ1dCBub3cgdGhlcmUgaXMgYW4gb3B0aW9uIC1sb29wCiAgIHRoYXQgbWFrZXMgaXQgZWFzaWVyLiBPZiBjb3Vyc2Ugd2hlbiB4MTF2bmMgcmVzdGFydHMgaXQgbmVlZHMgdG8gaGF2ZQogICBwZXJtaXNzaW9ucyB0byBjb25uZWN0IHRvIHRoZSAocG90ZW50aWFsbHkgbmV3KSBYIGRpc3BsYXkuIFRoaXMgbW9kZQogICBjb3VsZCBiZSB1c2VmdWwgaWYgdGhlIFggc2VydmVyIHJlc3RhcnRzIG9mdGVuLiBVc2UgZS5nLiAiLWxvb3A1MDAwIgogICB0byBzbGVlcCA1MDAwIG1zIGJldHdlZW4gcmVzdGFydHMuIEFsc28gIi1sb29wMjAwMCw1IiB0byBzbGVlcCAyMDAwIG1zCiAgIGFuZCBvbmx5IHJlc3RhcnQgNSB0aW1lcy4KCiAgIE9uZSBjYW4gYWxzbyB1c2UgdGhlIC1sb29wYmcgdG8gZW11bGF0ZSBpbmV0ZCg4KSB0byBzb21lIGRlZ3JlZSwgd2hlcmUKICAgZWFjaCBjb25uZWN0ZWQgcHJvY2VzcyBydW5zIGluIHRoZSBiYWNrZ3JvdW5kLiBJdCBjb3VsZCBiZSBjb21iaW5lZCwKICAgc2F5LCB3aXRoIHRoZSAtc3ZjIG9wdGlvbiB0byBwcm92aWRlIHNpbXBsZSB0ZXJtaW5hbCBzZXJ2aWNlcyB3aXRob3V0CiAgIHVzaW5nIGluZXRkKDgpLgoKCiAgIFEtNjQ6IEhvdyBkbyBJIG1ha2UgeDExdm5jIHdvcmsgd2l0aCB0aGUgSmF2YSBWTkMgdmlld2VyIGFwcGxldCBpbiBhCiAgIHdlYiBicm93c2VyPwoKICAgVG8gaGF2ZSB4MTF2bmMgc2VydmUgdXAgYSBKYXZhIFZOQyB2aWV3ZXIgYXBwbGV0IHRvIGFueSB3ZWIgYnJvd3NlcnMKICAgdGhhdCBjb25uZWN0IHRvIGl0LCBydW4geDExdm5jIHdpdGggdGhpcyBvcHRpb246CiAgLWh0dHBkaXIgL3BhdGgvdG8vdGhlL2phdmEvY2xhc3Nlcy9kaXIKCiAgICh0aGlzIGRpcmVjdG9yeSB3aWxsIGNvbnRhaW4gdGhlIGZpbGVzIGluZGV4LnZuYyBhbmQsIGZvciBleGFtcGxlLAogICBWbmNWaWV3ZXIuamFyKSBOb3RlIHRoYXQgbGlidm5jc2VydmVyIGNvbnRhaW5zIHRoZSBUaWdodFZOQyBKYXZhCiAgIGNsYXNzZXMgamFyIGZpbGUgZm9yIHlvdXIgY29udmVuaWVuY2UuIChpdCBpcyB0aGUgZmlsZQogICBjbGFzc2VzL1ZuY1ZpZXdlci5qYXIgaW4gdGhlIHNvdXJjZSB0cmVlLikKCiAgIFlvdSB3aWxsIHNlZSBvdXRwdXQgc29tZXRoaW5nIGxpa2UgdGhpczoKICAxNC8wNS8yMDA0IDExOjEzOjU2IEF1dG9wcm9iaW5nIHNlbGVjdGVkIHBvcnQgNTkwMAogIDE0LzA1LzIwMDQgMTE6MTM6NTYgTGlzdGVuaW5nIGZvciBIVFRQIGNvbm5lY3Rpb25zIG9uIFRDUCBwb3J0IDU4MDAKICAxNC8wNS8yMDA0IDExOjEzOjU2ICAgVVJMIGh0dHA6Ly93YWxudXQ6NTgwMAogIDE0LzA1LzIwMDQgMTE6MTM6NTYgc2NyZWVuIHNldHVwIGZpbmlzaGVkLgogIDE0LzA1LzIwMDQgMTE6MTM6NTYgVGhlIFZOQyBkZXNrdG9wIGlzIHdhbG51dDowCiAgUE9SVD01OTAwCgogICB0aGVuIHlvdSBjYW4gY29ubmVjdCB0byB0aGF0IFVSTCB3aXRoIGFueSBKYXZhIGVuYWJsZWQgYnJvd3Nlci4gRmVlbAogICBmcmVlIHRvIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCBpbmRleC52bmMgZmlsZSBpbiB0aGUgY2xhc3NlcyBkaXJlY3RvcnkuCgogICBBcyBvZiBNYXkvMjAwNSB0aGUgLWh0dHAgb3B0aW9uIHdpbGwgdHJ5IHRvIGd1ZXNzIHdoZXJlIHRoZSBKYXZhCiAgIGNsYXNzZXMgamFyIGZpbGUgaXMgYnkgbG9va2luZyBpbiBleHBlY3RlZCBsb2NhdGlvbnMgYW5kIG9uZXMgcmVsYXRpdmUKICAgdG8gdGhlIHgxMXZuYyBiaW5hcnkuCgogICBBbHNvIG5vdGUgdGhhdCBpZiB5b3Ugd2FudGVkIHRvLCB5b3UgY291bGQgYWxzbyBzdGFydCB0aGUgSmF2YSB2aWV3ZXIKICAgZW50aXJlbHkgZnJvbSB0aGUgdmlld2VyLXNpZGUgYnkgaGF2aW5nIHRoZSBqYXIgZmlsZSB0aGVyZSBhbmQgdXNpbmcKICAgZWl0aGVyIHRoZSBqYXZhIG9yIGFwcGxldHZpZXdlciBjb21tYW5kcyB0byBydW4gdGhlIHByb2dyYW0uCiAgamF2YSAtY3AgLi9WbmNWaWV3ZXIuamFyIFZuY1ZpZXdlciBIT1NUIGZhci1hd2F5LmVhc3QgUE9SVCA1OTAwCgogICBQcm94aWVzOiBTZWUgdGhlIGRpc2N1c3Npb24gaGVyZSBpZiB0aGUgd2ViIGJyb3dzZXIgbXVzdCB1c2UgYSB3ZWIKICAgcHJveHkgdG8gY29ubmVjdCB0byB0aGUgaW50ZXJuZXQuIEl0IGlzIHRyaWNreSB0byBnZXQgSmF2YSBhcHBsZXRzIHRvCiAgIHdvcmsgaW4gdGhpcyBjYXNlOiBhIHNpZ25lZCBhcHBsZXQgbXVzdCBiZSB1c2VkIHNvIGl0IGNhbiBjb25uZWN0IHRvCiAgIHRoZSBwcm94eSBhbmQgYXNrIGZvciB0aGUgcmVkaXJlY3Rpb24gdG8gdGhlIFZOQyBzZXJ2ZXIuIE9uZSB3YXkgdG8gZG8KICAgdGhpcyBpcyB0byB1c2UgdGhlIHNpZ25lZCBTU0wgb25lIHJlZmVycmVkIHRvIGluIGNsYXNzZXMvc3NsL3Byb3h5LnZuYwogICBhbmQgc2V0IGRpc2FibGVTU0w9eWVzIChub3RlIHRoYXQgdGhpcyBoYXMgbm8gZW5jcnlwdGlvbjsgcGxlYXNlIHVzZQogICBTU0wgb3IgU1NIIGFzIGRpc2N1c3MgZWxzZXdoZXJlIG9uIHRoaXMgcGFnZSkgaW4gdGhlIFVSTCBvciB0aGUgZmlsZS4KCgogICBRLTY1OiBBcmUgcmV2ZXJzZSBjb25uZWN0aW9ucyAoaS5lLiB0aGUgVk5DIHNlcnZlciBjb25uZWN0aW5nIHRvIHRoZQogICBWTkMgdmlld2VyKSB1c2luZyAidm5jdmlld2VyIC1saXN0ZW4iIGFuZCB2bmNjb25uZWN0KDEpIHN1cHBvcnRlZD8KCiAgIEFzIG9mIE1hci8yMDA0IHgxMXZuYyBzdXBwb3J0cyByZXZlcnNlIGNvbm5lY3Rpb25zLiBPbiBVbml4IG9uZSBzdGFydHMKICAgdGhlIFZOQyB2aWV3ZXIgaW4gbGlzdGVuIG1vZGU6ICJ2bmN2aWV3ZXIgLWxpc3RlbiIgKHNlZSB5b3VyCiAgIGRvY3VtZW50YXRpb24gZm9yIFdpbmRvd3MsIGV0YyksIGFuZCB0aGVuIHN0YXJ0cyB1cCB4MTF2bmMgd2l0aCB0aGUKICAgLWNvbm5lY3Qgb3B0aW9uLiBUbyBjb25uZWN0IGltbWVkaWF0ZWx5IGF0IHgxMXZuYyBzdGFydHVwIHRpbWUgdXNlIHRoZQogICAiLWNvbm5lY3QgaG9zdDpwb3J0IiBvcHRpb24gKHVzZSBjb21tYXMgZm9yIGEgbGlzdCBvZiBob3N0cyB0byBjb25uZWN0CiAgIHRvLikgVGhlICI6cG9ydCIgaXMgb3B0aW9uYWwgKGRlZmF1bHQgaXMgVk5DIGxpc3RlbmluZyBwb3J0IGlzIDU1MDAuKQoKICAgSWYgYSBmaWxlIGlzIHNwZWNpZmllZCBpbnN0ZWFkOiAtY29ubmVjdCAvcGF0aC90by9zb21lL2ZpbGUgdGhlbiB0aGF0CiAgIGZpbGUgaXMgY2hlY2tlZCBwZXJpb2RpY2FsbHkgKGFib3V0IG9uY2UgYSBzZWNvbmQpIGZvciBuZXcgaG9zdHMgdG8KICAgY29ubmVjdCB0by4KCiAgIFRoZSAtcmVtb3RlIGNvbnRyb2wgb3B0aW9uIChha2EgLVIpIGNhbiBhbHNvIGJlIHVzZWQgdG8gZG8gdGhpcyBkdXJpbmcKICAgYW4gYWN0aXZlIHgxMXZuYyBzZXNzaW9uLCBlLmcuOgp4MTF2bmMgLWRpc3BsYXkgOjAgLVIgY29ubmVjdDpob3N0bmFtZS5kb21haW4KCiAgIFVzZSB0aGUgIi1jb25uZWN0X29yX2V4aXQiIG9wdGlvbiB0byBoYXZlIHgxMXZuYyBleGl0IGlmIHRoZSByZXZlcnNlCiAgIGNvbm5lY3Rpb24gZmFpbHMuIEFsc28sIG5vdGUgdGhlICItcmZicG9ydCAwIiBvcHRpb24gZGlzYWJsZXMgVENQCiAgIGxpc3RlbmluZyBmb3IgY29ubmVjdGlvbnMgKHBvdGVudGlhbGx5IHVzZWZ1bCBmb3IgcmV2ZXJzZSBjb25uZWN0aW9uCiAgIG1vZGUsIGFzc3VtaW5nIHlvdSBkbyBub3Qgd2FudCBhbnkgImZvcndhcmQiIGNvbm5lY3Rpb25zLikKCiAgIE5vdGUgdGhhdCBhcyBvZiBNYXIvMjAwNiB4MTF2bmMgcmVxdWlyZXMgcGFzc3dvcmQgYXV0aGVudGljYXRpb24gZm9yCiAgIHJldmVyc2UgY29ubmVjdGlvbnMgYXMgd2VsbCBhcyBmb3IgZm9yd2FyZCBvbmVzIChhc3N1bWluZyBwYXNzd29yZAogICBhdXRoIGhhcyBiZWVuIGVuYWJsZWQsIGUuZy4gdmlhIC1yZmJhdXRoLCAtcGFzc3dkZmlsZSwgZXRjLikgTWFueSBWTkMKICAgc2VydmVycyBkbyBub3QgcmVxdWlyZSBhbnkgcGFzc3dvcmQgZm9yIHJldmVyc2UgY29ubmVjdGlvbnMuIFRvIHJlZ2FpbgogICB0aGUgb2xkIGJlaGF2aW9yIHN1cHBseSB0aGlzIG9wdGlvbiAiLWVudgogICBYMTFWTkNfUkVWRVJTRV9DT05ORUNUSU9OX05PX0FVVEg9MSIgdG8geDExdm5jLgoKICAgVm5jY29ubmVjdCBjb21tYW5kOiBUbyB1c2UgdGhlIHZuY2Nvbm5lY3QoMSkgcHJvZ3JhbSAoZnJvbSB0aGUgY29yZQogICBWTkMgcGFja2FnZSBhdCB3d3cucmVhbHZuYy5jb20pIHNwZWNpZnkgdGhlIC12bmNjb25uZWN0IG9wdGlvbiB0bwogICB4MTF2bmMgKE5vdGU6IGFzIG9mIERlYy8yMDA0IC12bmNjb25uZWN0IGlzIG5vdyB0aGUgZGVmYXVsdC4pCiAgIHZuY2Nvbm5lY3QoMSkgbXVzdCBiZSBwb2ludGVkIHRvIHRoZSBzYW1lIFgxMSBESVNQTEFZIGFzIHgxMXZuYyAoc2luY2UKICAgaXQgdXNlcyBYIHByb3BlcnRpZXMgdG8gY29tbXVuaWNhdGUgd2l0aCB4MTF2bmMuKSBJZiB5b3UgZG8gbm90IGhhdmUKICAgb3IgZG8gbm90IHdhbnQgdG8gZ2V0IHRoZSB2bmNjb25uZWN0KDEpIHByb2dyYW0sIHRoZSBmb2xsb3dpbmcgc2NyaXB0CiAgIChuYW1lZCAiVm5jY29ubmVjdCIpIG1heSB3b3JrIGlmIHlvdXIgeHByb3AoMSkgc3VwcG9ydHMgdGhlIC1zZXQKICAgb3B0aW9uOgojIS9iaW4vc2gKIyB1c2FnZTogVm5jY29ubmVjdCA8aG9zdD4KIyAgICAgICAgVm5jY29ubmVjdCA8aG9zdDpwb3J0PgojIG5vdGU6IG5vdCBhbGwgeHByb3AoMSkgc3VwcG9ydCAtc2V0LgojCnhwcm9wIC1yb290IC1mIFZOQ19DT05ORUNUIDhzIC1zZXQgVk5DX0NPTk5FQ1QgIiQxIgoKCiAgIFEtNjY6IENhbiByZXZlcnNlIGNvbm5lY3Rpb25zIGJlIG1hZGUgdG8gZ28gdGhyb3VnaCBhIFdlYiBvciBTT0NLUwogICBwcm94eSBvciBTU0g/CgogICBZZXMsIGFzIG9mIE9jdC8yMDA3IHgxMXZuYyBzdXBwb3J0cyByZXZlcnNlIGNvbm5lY3Rpb25zIHRocm91Z2gKICAgcHJveGllczogdXNlIHRoZSAiLXByb3h5IGhvc3Q6cG9ydCIgb3B0aW9uLiBUaGUgZGVmYXVsdCBpcyB0byBhc3N1bWUKICAgdGhlIHByb3h5IGlzIGEgV2ViIHByb3h5LiBOb3RlIHRoYXQgbW9zdCBXZWIgcHJveGllcyBvbmx5IGFsbG93IHByb3h5CiAgIGRlc3RpbmF0aW9uIGNvbm5lY3Rpb25zIHRvIHBvcnRzIDQ0MyAoSFRUUFMpIGFuZCA1NjMgKFNORVdTKSBhbmQgc28KICAgdGhpcyBtaWdodCBub3QgYmUgdG9vIHVzZWZ1bCB1bmxlc3MgdGhlIHByb3h5IGhhcyBiZWVuIG1vZGlmaWVkCiAgIChBbGxvd0NPTk5FQ1QgYXBhY2hlIHNldHRpbmcpIG9yIHRoZSBWTkMgdmlld2VyIGxpc3RlbnMgb24gb25lIG9mCiAgIHRob3NlIHBvcnRzIChvciB0aGUgcm91dGVyIGRvZXMgYSBwb3J0IHJlZGlyLikgQSB3ZWIgcHJveHkgbWF5IGFsc28gYmUKICAgc3BlY2lmaWVkIHZpYSAiLXByb3h5IGh0dHA6Ly9ob3N0OnBvcnQiCgogICBGb3IgU09DS1M0IGFuZCBTT0NLUzRhIHByb3hpZXMgdXNlIHRoaXMgZm9ybWF0ICItcHJveHkKICAgc29ja3M6Ly9ob3N0OnBvcnQiLiBJZiB0aGUgcmV2ZXJzZSBjb25uZWN0aW9uIGhvc3RuYW1lIGlzIGEgbnVtZXJpY2FsCiAgIElQIG9yICJsb2NhbGhvc3QiIHRoZW4gU09DS1M0IChubyBob3N0IGxvb2t1cCkgaXMgdXNlZCwgb3RoZXJ3aXNlCiAgIFNPQ0tTNGEgd2lsbCBiZSB1c2VkLiBGb3IgU09DS1M1IChwcm94eSB3aWxsIGRvIGxvb2t1cCBhbmQgbWFueSBvdGhlcgogICB0aGluZ3MpIHVzZSAiLXByb3h5IHNvY2tzNTovL2hvc3Q6cG9ydCIuIE5vdGUgdGhhdCB0aGUgU1NIIGJ1aWx0aW4KICAgU09DS1MgcHJveHkgInNzaCAtRCBwb3J0IiBvbmx5IGRvZXMgU09DS1M0IG9yIFNPQ0tTNSwgc28gdXNlIHNvY2tzNTovLwogICBmb3IgYSBzc2ggLUQgcHJveHkuCgogICBUaGUgcHJveHlpbmcgd29ya3MgZm9yIGJvdGggU1NMIGVuY3J5cHRlZCBhbmQgbm9ybWFsIHJldmVyc2UKICAgY29ubmVjdGlvbnMuCgogICBBbiBleHBlcmltZW50YWwgbW9kZSBpcyAiLXByb3h5IGh0dHA6Ly9ob3N0OnBvcnQvLi4uIiB3aGVyZSB0aGUgVVJMCiAgIChlLmcuIGEgQ0dJIHNjcmlwdCkgaXMgcmV0cmlldmVkIHZpYSB0aGUgR0VUIG1ldGhvZC4gU2VlIC1wcm94eSBmb3IKICAgbW9yZSBpbmZvLgoKICAgQW5vdGhlciBleHBlcmltZW50YWwgbW9kZSBpcyAiLXByb3h5IHNzaDovL3VzZXJAaG9zdCIgaW4gd2hpY2ggY2FzZSBhCiAgIFNTSCB0dW5uZWwgaXMgdXNlZCBmb3IgdGhlIHByb3h5aW5nLiBTZWUgLXByb3h5IGZvciBtb3JlIGluZm8uCgogICBVcCB0byAzIHByb3hpZXMgbWF5IGJlIGNoYWluZWQgdG9nZXRoZXIgYnkgbGlzdGluZyB0aGVtIGJ5IGNvbW1hcwogICBlLmcuOiAiLXByb3h5IGh0dHA6Ly9ob3N0MTpwb3J0MSxzb2NrczU6Ly9ob3N0Mjpwb3J0MiIgaW4gY2FzZSBvbmUKICAgbmVlZHMgdG8gcmljb2NoZXQgb2ZmIG9mIHNldmVyYWwgbWFjaGluZXMgdG8gdWx0aW1hdGVseSByZWFjaCB0aGUKICAgbGlzdGVuaW5nIHZpZXdlci4KCgogICBRLTY3OiBDYW4geDExdm5jIHByb3ZpZGUgYSBtdWx0aS11c2VyIGRlc2t0b3Agd2ViIGxvZ2luIHNlcnZpY2UgYXMgYW4KICAgQXBhY2hlIENHSSBvciBQSFAgc2NyaXB0PwogICBZZXMuIFNlZSB0aGUgZXhhbXBsZSBzY3JpcHQgZGVza3RvcC5jZ2kgZm9yIGlkZWFzLiBJdCBpcyBpbiB0aGUgc291cmNlCiAgIHRyZWUgaW4gdGhlIGRpcmVjdG9yeSB4MTF2bmMvbWlzYy4gSXQgc2VydmVzIHgxMXZuYydzIFNTTCBlbmFibGVkIEphdmEKICAgQXBwbGV0IHRvIHRoZSB3ZWIgYnJvd3NlciB3aXRoIHRoZSBjb3JyZWN0IGNvbm5lY3Rpb24gaW5mb3JtYXRpb24gZm9yCiAgIHRoZSB1c2VyJ3MgdmlydHVhbCBkZXNrdG9wIChhbiBYdmZiIHNlc3Npb24gdmlhIC1jcmVhdGU7IGJlIHN1cmUgdG8KICAgYWRkIHRoZSBYdmZiIHBhY2thZ2UuKSBIVFRQUy9TU0wgZW5hYmxlZCBBcGFjaGUgc2hvdWxkIGJlIHVzZWQgdG8KICAgc2VydmUgdGhlIHNjcmlwdCB0byBhdm9pZCB1bml4IGFuZCB2bmMgcGFzc3dvcmRzIGZyb20gYmVpbmcgc2VudCBpbgogICBjbGVhcnRleHQgYW5kIHNuaWZmZWQuCgogICBCeSBkZWZhdWx0IGl0IHVzZXMgYSBzZXBhcmF0ZSBWTkMgcG9ydCBmb3IgZWFjaCB1c2VyIGRlc2t0b3AgKGVpdGhlcgogICBieSBhdXRvcHJvYmluZyBpbiBhIHJhbmdlIG9mIHBvcnRzIG9yIHVzaW5nIGEgcG9ydCBiYXNlZCBvbiB0aGUgdXNlcmlkCiAgIG51bWJlci4pIFRoZSB3ZWIgc2VydmVyJ3MgZmlyZXdhbGwgbXVzdCBhbGxvdyBpbmNvbWluZyBjb25uZWN0aW9ucyB0bwogICB0aGVzZSBwb3J0cy4KCiAgIEl0IGlzIHNvbWV3aGF0IGRpZmZpY3VsdCB0byBkbyBhbGwgb2YgdGhpcyB3aXRoIHgxMXZuYyBsaXN0ZW5pbmcgb24gYQogICBzaW5nbGUgcG9ydCwgaG93ZXZlciB0aGVyZSBpcyBhbHNvIGEgJ2ZpeGVkIHBvcnQnIHNjaGVtZSBkZXNjcmliZWQgaW4KICAgdGhlIHNjcmlwdCBiYXNlZCBvbiAtbG9vcGJnIHRoYXQgd29ya3MgZmFpcmx5IHdlbGwgKGJ1dCBtb3JlCiAgIGV4cGVyaWVuY2UgaXMgbmVlZGVkIHRvIHNlZSB3aGF0IHByb2JsZW1zIGNvbnRlbnRpb24gZm9yIHRoZSBzYW1lIHBvcnQKICAgY2F1c2VzOyBob3dldmVyIGF0IHdvcnN0IG9uZSB1c2VyIG1heSBuZWVkIHRvIHJlLWxvZ2luLikKCiAgIFRoZXJlIGlzIGFsc28gYW4gb3B0aW9uYWwgJ3BvcnQgcmVkaXJlY3Rpb24nIG1vZGUgZm9yIGRlc2t0b3AuY2dpIHRoYXQKICAgYWxsb3dzIHJlZGlyZWN0aW9uIHRvIG90aGVyIG1hY2hpbmVzIGluc2lkZSB0aGUgZmlyZXdhbGwgYWxyZWFkeQogICBydW5uaW5nIFNTTCBlbmFibGVkIFZOQyBzZXJ2ZXJzLiBUaGlzIHByb3ZpZGVzIG11Y2ggb2YgdGhlCiAgIGZ1bmN0aW9uYWxpdHkgYXMgdGhlIFNTTCBQb3J0YWwgYW5kIGlzIGVhc2llciB0byBzZXQgdXAuCgoKICAgUS02ODogQ2FuIEkgdXNlIHgxMXZuYyBhcyBhIHJlcGxhY2VtZW50IGZvciBYdm5jPyAoaS5lLiBub3QgZm9yIGEgcmVhbAogICBkaXNwbGF5LCBidXQgZm9yIGEgdmlydHVhbCBvbmUgSSBrZWVwIGFyb3VuZC4pCgogICBZb3UgY2FuLCBidXQgeW91IHdvdWxkIG5vdCBiZSBkb2luZyB0aGlzIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChmb3IKICAgdmlydHVhbCBYIHNlc3Npb25zIHZpYSBWTkMsIFh2bmMgc2hvdWxkIGdpdmUgdGhlIGZhc3Rlc3QgcmVzcG9uc2UuKQogICBZb3UgbWF5IHdhbnQgdG8gZG8gdGhpcyBiZWNhdXNlIFh2bmMgaXMgYnVnZ3kgYW5kIGNyYXNoZXMsIGRvZXMgbm90CiAgIHN1cHBvcnQgYW4gWCBzZXJ2ZXIgZXh0ZW5zaW9uIHlvdSBkZXNpcmUsIG9yIHlvdSB3YW50IHRvIHRha2UKICAgYWR2YW50YWdlIG9mIG9uZSBvZiB4MTF2bmMncyB1bmVuZGluZyBudW1iZXIgb2Ygb3B0aW9ucyBhbmQgZmVhdHVyZXMuCgogICBPbmUgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBoYXZlIGEgWHZmYigxKSB2aXJ0dWFsIGZyYW1lYnVmZmVyIFgKICAgc2VydmVyIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQgYW5kIGhhdmUgeDExdm5jIGF0dGFjaGVkIHRvIGl0LgogICBBbm90aGVyIG1ldGhvZCwgZmFzdGVyIGFuZCBtb3JlIGFjY3VyYXRlLCBpcyB0byB1c2UgdGhlICJkdW1teSIgRGV2aWNlCiAgIERyaXZlciBpbiBYRnJlZTg2L1hvcmcgKHNlZSBiZWxvdy4pCgogICBGb3IgdGhlc2UgdmlydHVhbCBzZXNzaW9ucyB5b3Ugd2lsbCBuZWVkIHRvIGluc3RhbGwgdGhlIFh2ZmIgcHJvZ3JhbQogICAoZS5nLiBhcHQtZ2V0IGluc3RhbGwgeHZmYikgb3Igb3VyIFhkdW1teSBwcm9ncmFtIChzZWUgYmVsb3cuKQoKICAgSW4gZWl0aGVyIGNhc2UsIG9uZSBjYW4gdmlldyB0aGlzIGRlc2t0b3AgYm90aCByZW1vdGVseSBhbmQgYWxzbwogICBsb2NhbGx5IHVzaW5nIHZuY3ZpZXdlci4gTWFrZSBzdXJlIHZuY3ZpZXdlcidzICItZW5jb2RpbmdzIHJhdyIgaXMgaW4KICAgZWZmZWN0IGZvciBsb2NhbCB2aWV3aW5nIChjb21wcmVzc2lvbiBzZWVtcyB0byBzbG93IHRoaW5ncyBkb3duCiAgIGxvY2FsbHkuKSBGb3IgbG9jYWwgdmlld2luZyB5b3Ugc2V0IHVwIGEgImJhcmUiIHdpbmRvdyBtYW5hZ2VyIHRoYXQKICAganVzdCBzdGFydHMgdXAgdm5jdmlld2VyIGFuZCBub3RoaW5nIGVsc2UgKFNlZSBob3cgYmVsb3cuKQoKICAgSGVyZSBpcyBvbmUgd2F5IHRvIHN0YXJ0IHVwIFh2ZmI6CiAgeGluaXQgLS0gL3Vzci9iaW4vWHZmYiA6MSAtY2MgNCAtc2NyZWVuIDAgMTAyNHg3Njh4MTYKCiAgIFRoaXMgc3RhcnRzIHVwIGEgMTZicHAgdmlydHVhbCBkaXNwbGF5LiBUbyBleHBvcnQgaXQgdmlhIFZOQyB1c2UKICB4MTF2bmMgLWRpc3BsYXkgOjEgLi4uCgogICBUaGVuIGhhdmUgdGhlIHJlbW90ZSB2bmN2aWV3ZXIgYXR0YWNoIHRvIHgxMXZuYydzIFZOQyBkaXNwbGF5IChlLmcuIDowCiAgIHdoaWNoIGlzIHBvcnQgNTkwMC4pCgogICBUaGUgIi1jYyA0IiBYdmZiIG9wdGlvbiBpcyB0byBmb3JjZSBpdCB0byB1c2UgYSBUcnVlQ29sb3IgdmlzdWFsCiAgIGluc3RlYWQgb2YgRGlyZWN0Q29sb3IgKHRoaXMgd29ya3MgYXJvdW5kIGEgcmVjZW50IGJ1ZyBpbiB0aGUgWG9yZwogICBYdmZiIHNlcnZlci4pCgogICBPbmUgZ29vZCB0aGluZyBhYm91dCBYdmZiIGlzIHRoYXQgdGhlIHZpcnR1YWwgZnJhbWVidWZmZXIgZXhpc3RzIGluCiAgIG1haW4gbWVtb3J5IChyYXRoZXIgdGhhbiBpbiB0aGUgdmlkZW8gaGFyZHdhcmUpLCBhbmQgc28geDExdm5jIGNhbgogICAic2NyZWVuIHNjcmFwZSIgaXQgdmVyeSBlZmZpY2llbnRseSAobW9yZSB0aGFuLCBzYXksIDEwMFggZmFzdGVyIHRoYW4KICAgbm9ybWFsIHZpZGVvIGhhcmR3YXJlLikKCiAgIFVwZGF0ZSBOb3YvMjAwNjogU2VlIHRoZSBGSU5EQ1JFQVRFRElTUExBWSBkaXNjdXNzaW9uIG9mIHRoZSAiLWRpc3BsYXkKICAgV0FJVDpjbWQ9RklORERJU1BMQVkiIG9wdGlvbiB3aGVyZSB2aXJ0dWFsIChYdmZiIG9yIFhkdW1teSwgb3IgZXZlbgogICByZWFsIG9uZXMgYnkgY2hhbmdpbmcgYW4gb3B0aW9uKSBYIHNlcnZlcnMgYXJlIHN0YXJ0ZWQgYXV0b21hdGljYWxseQogICBmb3IgbmV3IHVzZXJzIGNvbm5lY3RpbmcuIFRoaXMgcHJvdmlkZXMgYSAiZGVza3RvcCBzZXJ2aWNlIiBmb3IgdGhlCiAgIG1hY2hpbmUuIFlvdSBlaXRoZXIgZ2V0IHlvdXIgcmVhbCBYIHNlc3Npb24gb3IgeW91ciB2aXJ0dWFsCiAgIChYdmZiL1hkdW1teSkgb25lIHdoZW5ldmVyIHlvdSBjb25uZWN0IHRvIHRoZSBtYWNoaW5lIChpbmV0ZCg4KSBpcyBhCiAgIG5pY2Ugd2F5IHRvIHByb3ZpZGUgdGhpcyBzZXJ2aWNlLikgVGhlIC1maW5kLCAtY3JlYXRlLCAtc3ZjLCBhbmQKICAgLXhkbXN2YyBhbGlhc2VzIGNhbiBhbHNvIGNvbWUgaW4gaGFuZHkgaGVyZS4KCiAgIFRoZXJlIGFyZSBzb21lIGFubm95YW5jZXMgV1JUIFh2ZmIgaG93ZXZlci4gVGhlIGRlZmF1bHQga2V5Ym9hcmQKICAgbWFwcGluZyBzZWVtcyB0byBiZSB2ZXJ5IHBvb3IuIE9uZSBzaG91bGQgcnVuIHgxMXZuYyB3aXRoIC1hZGRfa2V5c3ltcwogICBvcHRpb24gdG8gaGF2ZSBrZXlzeW1zIGFkZGVkIGF1dG9tYXRpY2FsbHkuIEFsc28sIHRvIGFkZCB0aGUgU2hpZnRfUgogICBhbmQgQ29udHJvbF9SIG1vZGlmaWVycyBzb21ldGhpbmcgbGlrZSB0aGlzIGlzIG5lZWRlZDoKIyEvYmluL3NoCnhtb2RtYXAgLWUgImtleWNvZGUgYW55ID0gU2hpZnRfUiIKeG1vZG1hcCAtZSAiYWRkIFNoaWZ0ID0gU2hpZnRfTCBTaGlmdF9SIgp4bW9kbWFwIC1lICJrZXljb2RlIGFueSA9IENvbnRyb2xfUiIKeG1vZG1hcCAtZSAiYWRkIENvbnRyb2wgPSBDb250cm9sX0wgQ29udHJvbF9SIgp4bW9kbWFwIC1lICJrZXljb2RlIGFueSA9IEFsdF9MIgp4bW9kbWFwIC1lICJrZXljb2RlIGFueSA9IEFsdF9SIgp4bW9kbWFwIC1lICJrZXljb2RlIGFueSA9IE1ldGFfTCIKeG1vZG1hcCAtZSAiYWRkIE1vZDEgPSBBbHRfTCBBbHRfUiBNZXRhX0wiCgogICAobm90ZTogdGhlc2UgYXJlIGFwcGxpZWQgYXV0b21hdGljYWxseSBpbiB0aGUgRklORENSRUFURURJU1BMQVkgbW9kZQogICBvZiB4MTF2bmMuKSBQZXJoYXBzIHRoZSBYdmZiIG9wdGlvbnMgLXhrYmRiIG9yIC14a2JtYXAgY291bGQgYmUgdXNlZAogICB0byBnZXQgYSBiZXR0ZXIgZGVmYXVsdCBrZXlib2FyZCBtYXBwaW5nLi4uCgogICBEdW1teSBEcml2ZXI6ICBBIHVzZXIgcG9pbnRzIG91dCBhIGZhc3RlciBhbmQgbW9yZSBhY2N1cmF0ZSBtZXRob2QgaXMKICAgdG8gdXNlIHRoZSAiZHVtbXkiIERldmljZSBEcml2ZXIgb2YgWEZyZWU4Ni9Yb3JnIGluc3RlYWQgb2YgWHZmYi4gSGUKICAgdXNlcyB0aGlzIHRvIGNyZWF0ZSBhIHBlcnNpc3RlbnQgYW5kIHJlc2l6YWJsZSBkZXNrdG9wIGFjY2Vzc2libGUgZnJvbQogICBhbnl3aGVyZS4gSW4gdGhlIERldmljZSBTZWN0aW9uIG9mIHRoZSBjb25maWcgZmlsZSBzZXQgRHJpdmVyICJkdW1teSIuCiAgIFlvdSBtYXkgYWxzbyBuZWVkIHRvIHNldCBWaWRlb1JhbSBOTk4gdG8gYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlCiAgIGZyYW1lYnVmZmVyLiBUaGUgZnJhbWVidWZmZXIgaXMga2VwdCBpbiBtYWluIG1lbW9yeSBsaWtlIFh2ZmIgZXhjZXB0CiAgIHRoYXQgdGhlIHNlcnZlciBjb2RlIGlzIGNsb3NlbHkgY29ycmVsYXRlZCB3aXRoIHRoZSByZWFsIFhGcmVlODYvWG9yZwogICBYc2VydmVyIHVubGlrZSBYdmZiLgoKICAgVGhlIG1haW4gZHJhd2JhY2sgdG8gdGhpcyBtZXRob2QgKGJlc2lkZXMgcmVxdWlyaW5nIGV4dHJhCiAgIGNvbmZpZ3VyYXRpb24gYW5kIHBvc3NpYmx5IHJvb3QgcGVybWlzc2lvbikgaXMgdGhhdCBpdCBhbHNvIGRvZXMgdGhlCiAgIExpbnV4IFZpcnR1YWwgQ29uc29sZS9UZXJtaW5hbCAoVkMvVlQpIHN3aXRjaGluZyBldmVuIHRob3VnaCBpdCBkb2VzCiAgIG5vdCBuZWVkIHRvIChzaW5jZSBpdCBkb2Vzbid0IHVzZSBhIHJlYWwgZnJhbWVidWZmZXIuKSBUaGVyZSBhcmUgc29tZQogICAiZHVhbCBoZWFkZWQiIChhY3R1YWxseSBtdWx0aS1oZWFkZWQvbXVsdGktdXNlcikgcGF0Y2hlcyB0byB0aGUgWAogICBzZXJ2ZXIgdGhhdCB0dXJuIG9mZiB0aGUgVlQgdXNhZ2UgaW4gdGhlIFggc2VydmVyLiBVcGRhdGU6IEFzIG9mCiAgIEp1bC8yMDA1IHdlIGhhdmUgYW4gTERfUFJFTE9BRCBzY3JpcHQgWGR1bW15IHRoYXQgYWxsb3dzIHlvdSB0byB1c2UgYQogICBzdG9jayAoaS5lLiB1bnBhdGNoZWQpIFhvcmcgb3IgWEZyZWU4NiBzZXJ2ZXIgd2l0aCB0aGUgImR1bW15IiBkcml2ZXIKICAgYW5kIG5vdCBoYXZlIGFueSBWVCBzd2l0Y2hpbmcgcHJvYmxlbXMhIEFuIGFkdmFudGFnZSBvZiBYZHVtbXkgb3ZlcgogICBYdmZiIGlzIHRoYXQgWGR1bW15IHN1cHBvcnRzIFJBTkRSIGR5bmFtaWMgc2NyZWVuIHJlc2l6aW5nLgoKICAgVGhlIHN0YW5kYXJkIHdheSB0byBzdGFydCB0aGUgImR1bW15IiBkcml2ZXIgd291bGQgYmU6CnN0YXJ0eCAtLSA6MSAtY29uZmlnIC9ldGMvWDExL3hvcmcuY29uZi5kdW1teQoKICAgd2hlcmUgdGhlIGZpbGUgL2V0Yy9YMTEveG9yZy5jb25mLmR1bW15IGhhcyBpdHMgRGV2aWNlIFNlY3Rpb24KICAgbW9kaWZpZWQgYXMgZGVzY3JpYmVkIGFib3ZlLiBUbyB1c2UgdGhlIExEX1BSRUxPQUQgd3JhcHBlciBzY3JpcHQ6CnN0YXJ0eCAtLSAvcGF0aC90by9YZHVtbXkgOjEKCiAgIEFuIHhkbSgxKSBleGFtcGxlIGlzIGFsc28gcHJvdmlkZWQuCgogICBJbiBnZW5lcmFsLCBvbmUgY2FuIHVzZSB0aGVzZSBzb3J0cyBvZiBzY2hlbWVzIHRvIHVzZSB4MTF2bmMgdG8gZXhwb3J0CiAgIG90aGVyIHZpcnR1YWwgWCBzZXNzaW9ucywgc2F5IFhuZXN0IG9yIGV2ZW4gWHZuYyBpdHNlbGYgKHVzZWZ1bCBmb3IKICAgdGVzdGluZyB4MTF2bmMuKQoKICAgTG9jYWwgYWNjZXNzIChWTkMgU2VydmVyIGFuZCBWTkMgVmlld2VyIG9uIHRoZSBzYW1lIG1hY2hpbmUpOiBZb3UgdXNlCiAgIGEgVk5DIHZpZXdlciB0byBhY2Nlc3MgdGhlIGRpc3BsYXkgcmVtb3RlbHk7IHRvIGFjY2VzcyB5b3VyIHZpcnR1YWwgWAogICBkaXNwbGF5IGxvY2FsbHkgKGkuZS4gd2hpbGUgc2l0dGluZyBhdCB0aGUgc2FtZSBtYWNoaW5lIGl0IGlzIHJ1bm5pbmcKICAgb24pIG9uZSBjYW4gcGVyaGFwcyBoYXZlIHNvbWV0aGluZyBsaWtlIHRoaXMgaW4gdGhlaXIgJEhPTUUvLnhpbml0cmMKIyEvYmluL3NoCngxMXZuYyAtZGlzcGxheSA6NSAtcmZicG9ydCA1OTA1IC1iZwp2bmN2aWV3ZXIgLWdlb21ldHJ5ICswKzAgLWVuY29kaW5ncyByYXcgLXBhc3N3ZCAkSE9NRS8udm5jL3Bhc3N3ZCBsb2NhbGhvc3Q6NQoKICAgVGhlIGRpc3BsYXkgbnVtYmVycyAoVk5DIGFuZCBYKSB3aWxsIGxpa2VseSBiZSBkaWZmZXJlbnQgKHlvdSBjb3VsZAogICBhbHNvIHRyeSAtZmluZCksIGFuZCB5b3UgbWF5IG5vdCBuZWVkIHRoZSAtcGFzc3dkLiBSZWNlbnQgUmVhbFZOQwogICB2aWV3ZXJzIG1pZ2h0IGJlIHRoaXM6CiMhL2Jpbi9zaAp4MTF2bmMgLWRpc3BsYXkgOjUgLXJmYnBvcnQgNTkwNSAtYmcKdm5jdmlld2VyIC1GdWxsU2NyZWVuIC1QcmVmZXJyZWRFbmNvZGluZyByYXcgLXBhc3N3ZCAkSE9NRS8udm5jL3Bhc3N3ZCBsb2NhbGhvcwp0OjUKCiAgIFRoaXMgd2F5IGEgYmFyZSBYIHNlcnZlciBpcyBydW4gd2l0aCBubyB3aW5kb3cgbWFuYWdlciBvciBkZXNrdG9wOyBpdAogICBzaW1wbHkgcnVucyBvbmx5IHRoZSBWTkMgVmlld2VyIG9uIHRoZSByZWFsIFggc2VydmVyLiBUaGUgVmlld2VyIHRoZW4KICAgZHJhd3MgdGhlIHZpcnR1YWwgWCBzZXNzaW9uIG9uIHRvIHRoZSByZWFsIG9uZS4gT24geW91ciBzeXN0ZW0gaXQKICAgbWlnaHQgbm90IGJlICRIT01FLy54aW5pdHJjLCBidXQgcmF0aGVyIC54c2Vzc2lvbiwgLlhjbGllbnRzLCBvcgogICBzb21ldGhpbmcgZWxzZS4gWW91IHdpbGwgbmVlZCB0byBmaWd1cmUgb3V0IHdoYXQgaXQgaXMgZm9yIHlvdXIgc3lzdGVtCiAgIGFuZCBjb25maWd1cmF0aW9uLgoKCiAgIFhETS9HRE0vS0RNIE9uZS1TaG90IFggc2Vzc2lvbnM6IEZvciB0aGUgZ2VuZXJhbCByZXBsYWNlbWVudCBvZiBYdm5jCiAgIGJ5IFh2ZmIreDExdm5jLCBvbmUgdXNlciBkZXNjcmliZXMgYSBzaW1pbGFyIHNldHVwIGhlIGNyZWF0ZWQgd2hlcmUKICAgdGhlIFggc2Vzc2lvbnMgYXJlIG9uZS1zaG90J3MgKGRlc3Ryb3llZCBhZnRlciB0aGUgdm5jdmlld2VyCiAgIGRpc2Nvbm5lY3RzKSBhbmQgaXQgdXNlcyB0aGUgWERNL0dETS9LRE0gbG9naW4gZ3JlZXRlciBoZXJlLgoKCiAgIFEtNjk6IEhvdyBjYW4gSSB1c2UgeDExdm5jIG9uICJoZWFkbGVzcyIgbWFjaGluZXM/IFdoeSBtaWdodCBJIHdhbnQKICAgdG8/CgogICBBbiBpbnRlcmVzdGluZyBhcHBsaWNhdGlvbiBvZiB4MTF2bmMgaXMgdG8gbGV0IGl0IGV4cG9ydCBkaXNwbGF5cyBvZgogICAiaGVhZGxlc3MiIG1hY2hpbmVzLiBGb3IgZXhhbXBsZSwgeW91IG1heSBoYXZlIHNvbWUgbGFiIG9yIHNlcnZlcgogICBtYWNoaW5lcyB3aXRoIG5vIGtleWJvYXJkLCBtb3VzZSwgb3IgbW9uaXRvciwgYnV0IGVhY2ggb25lIHN0aWxsIGhhcyBhCiAgIHZpZGVvIGNhcmQuIE9uZSBjYW4gdXNlIHgxMXZuYyB0byBwcm92aWRlIGEgc2ltcGxlICJkZXNrdG9wIHNlcnZpY2UiCiAgIGZyb20gdGhlc2Ugc2VydmVyIG1hY2hpbmVzLgoKICAgQW4gWCBzZXJ2ZXIgY2FuIGJlIHN0YXJ0ZWQgb24gdGhlIGhlYWRsZXNzIG1hY2hpbmUgKHNvbWV0aW1lcyB0aGlzCiAgIHJlcXVpcmVzIGNvbmZpZ3VyaW5nIHRoZSBYIHNlcnZlciB0byBub3QgZmFpbCBpZiBpdCBjYW5ub3QgZGV0ZWN0IGEKICAga2V5Ym9hcmQgb3IgbW91c2UsIHNlZSB0aGUgbmV4dCBwYXJhZ3JhcGguKSBUaGVuIHlvdSBjYW4gZXhwb3J0IHRoYXQgWAogICBkaXNwbGF5IHZpYSB4MTF2bmMgKGUuZy4gc2VlIHRoaXMgRkFRKSBhbmQgYWNjZXNzIGl0IGZyb20gYW55d2hlcmUgb24KICAgdGhlIG5ldHdvcmsgdmlhIGEgVk5DIHZpZXdlci4KCiAgIFNvbWUgdGlwcyBvbiBnZXR0aW5nIFggc2VydmVycyB0byBzdGFydCBvbiBtYWNoaW5lcyB3aXRob3V0IGtleWJvYXJkCiAgIG9yIG1vdXNlOiBGb3IgWEZyZWU4Ni9Yb3JnIHRoZSBPcHRpb24gIkFsbG93TW91c2VPcGVuRmFpbCIgInRydWUiCiAgICJTZXJ2ZXJGbGFncyIgY29uZmlnIGZpbGUgb3B0aW9uIGlzIHVzZWZ1bC4gT24gU29sYXJpcyBYc3VuIHRoZQogICArbmtleWJvYXJkIGFuZCArbm1vdXNlIG9wdGlvbnMgYXJlIHVzZWZ1bCAocHV0IHRoZW0gaW4gdGhlIHNlcnZlcgogICBjb21tYW5kIGxpbmUgYXJncyBpbiAvZXRjL2R0L2NvbmZpZy9Yc2VydmVycy4pIFRoZXJlIGFyZSBwYXRjaGVzCiAgIGF2YWlsYWJsZSBmb3IgWHN1biBhdCBsZWFzZSBiYWNrIHRvIFNvbGFyaXMgOCB0aGF0IHN1cHBvcnQgdGhpcy4gU2VlCiAgIFhzZXJ2ZXIoMSkgZm9yIG1vcmUgaW5mby4KCiAgIEFsdGhvdWdoIHRoaXMgdXNhZ2UgbWF5IHNvdW5kIHN0cmFuZ2UgaXQgY2FuIGJlIHF1aXRlIHVzZWZ1bCBmb3IgYSBHVUkKICAgKG9yIG90aGVyKSB0ZXN0aW5nIG9yIFFBIHNldHVwczogdGhlIGVuZ2luZWVycyBkbyBub3QgbmVlZCB0byB3YWxrIHRvCiAgIGxhYiBtYWNoaW5lcyBydW5uaW5nIGRpZmZlcmVudCBoYXJkd2FyZSwgT1MncywgdmVyc2lvbnMsIGV0YyAob3IgaGF2ZQogICBtYW55IGRpZmZlcmVudCBtYWNoaW5lcyBpbiB0aGVpciBvZmZpY2UuKSBUaGV5IGp1c3QgY29ubmVjdCB0byB0aGUKICAgdmFyaW91cyB0ZXN0IG1hY2hpbmVzIG92ZXIgdGhlIG5ldHdvcmsgdmlhIFZOQy4gVGhlIGFkdmFudGFnZSB0bwogICB0ZXN0aW5nIHRoaXMgd2F5IGluc3RlYWQgb2YgdXNpbmcgWHZuYyBvciBldmVuIFh2ZmIgaXMgdGhhdCB0aGUgdGVzdAogICBpcyBkb25lIHVzaW5nIHRoZSByZWFsIFggc2VydmVyLCBmb250cywgdmlkZW8gaGFyZHdhcmUsIGV0Yy4gdGhhdCB3aWxsCiAgIGJlIHVzZWQgaW4gdGhlIGZpZWxkLgoKICAgT25lIGNhbiBpbWFnaW5lIGEgc2luZ2xlIHNlcnZlciBtYWNoaW5lIGNyYW1tZWQgd2l0aCBhcyBtYW55IHZpZGVvCiAgIGNhcmRzIGFzIGl0IGNhbiBob2xkIHRvIHByb3ZpZGUgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIGFjY2VzcyBvcgogICB0ZXN0aW5nIG9uIGRpZmZlcmVudCBraW5kcyBvZiB2aWRlbyBoYXJkd2FyZS4KCiAgIFNlZSBhbHNvIHRoZSBGSU5EQ1JFQVRFRElTUExBWSBkaXNjdXNzaW9uIG9mIHRoZSAiLWRpc3BsYXkKICAgV0FJVDpjbWQ9RklORERJU1BMQVkiIG9wdGlvbiB3aGVyZSB2aXJ0dWFsIFh2ZmIgb3IgWGR1bW15LCBvciByZWFsIFgKICAgc2VydmVycyBhcmUgc3RhcnRlZCBhdXRvbWF0aWNhbGx5IGZvciBuZXcgdXNlcnMgY29ubmVjdGluZy4gVGhlIC1maW5kLAogICAtY3JlYXRlLCAtc3ZjLCBhbmQgLXhkbXN2YyBhbGlhc2VzIGNhbiBhbHNvIGNvbWUgaW4gaGFuZHkgaGVyZS4KCiAgIFtSZXNvdXJjZSBVc2FnZSBhbmQgUGVyZm9ybWFuY2VdCgogICBRLTcwOiBJIGhhdmUgbG90cyBvZiBtZW1vcnksIGJ1dCB3aHkgZG9lcyB4MTF2bmMgZmFpbCB3aXRoICAgIHNobWdldDoKICAgTm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UgICAgb3IgICAgTWlub3Igb3Bjb2RlIG9mIGZhaWxlZCByZXF1ZXN0OiAxCiAgIChYX1NobUF0dGFjaCk/CgogICBJdCBpcyBub3QgYSBtYXR0ZXIgb2YgZnJlZSBtZW1vcnksIGJ1dCByYXRoZXIgZnJlZSBzaGFyZWQgbWVtb3J5IChzaG0pCiAgIHNsb3RzLCBhbHNvIGtub3duIGFzIHNobSBzZWdtZW50cy4gVGhpcyBvZnRlbiBvY2N1cnMgb24gYSBwdWJsaWMKICAgU29sYXJpcyBtYWNoaW5lIHVzaW5nIHRoZSBkZWZhdWx0IG9mIG9ubHkgMTAwIHNsb3RzLiBZb3UgKG9yIHRoZSBvd25lcgogICBvciByb290KSBjYW4gY2xlYW4gdGhlbSBvdXQgd2l0aCBpcGNybSgxKS4geDExdm5jIHRyaWVzIGhhcmQgdG8KICAgcmVsZWFzZSBpdHMgc2xvdHMsIGJ1dCBpdCwgYW5kIG90aGVyIHByb2dyYW1zLCBhcmUgbm90IGFsd2F5cyBhYmxlIHRvCiAgIChlLmcuIGlmIGtpbGwgLTknZC4pCgogICBTb21ldGltZXMgeDExdm5jIHdpbGwgbm90aWNlIHRoZSBwcm9ibGVtIHdpdGggc2htIHNlZ21lbnRzIGFuZCB0cmllcwogICB0byBnZXQgYnkgd2l0aCBmZXdlciwgb25seSBnaXZpbmcgYSB3YXJuaW5nIGxpa2UgdGhpczoKICAxOS8wMy8yMDA0IDEwOjEwOjU4IHNobWF0KHRpbGVfcm93KSBmYWlsZWQuCiAgc2htYXQ6IFRvbyBtYW55IG9wZW4gZmlsZXMKICAxOS8wMy8yMDA0IDEwOjEwOjU4IGVycm9yIGNyZWF0aW5nIHRpbGUtcm93IHNobSBmb3IgbGVuPTQKICAxOS8wMy8yMDA0IDEwOjEwOjU4IHJldmVydGluZyB0byBzaW5nbGVfY29weXRpbGUgbW9kZQoKICAgSGVyZSBpcyBhIHNoZWxsIHNjcmlwdCBzaG1fY2xlYXIgdG8gbGlzdCBhbmQgcHJvbXB0IGZvciByZW1vdmFsIG9mCiAgIHlvdXIgdW5hdHRhY2hlZCBzaG0gc2VnbWVudHMgKGF0dGFjaGVkIG9uZXMgYXJlIHNraXBwZWQuKSBJIHVzZSBpdAogICB3aGlsZSBkZWJ1Z2dpbmcgeDExdm5jIChJIHVzZSAic2htX2NsZWFyIC15IiB0byBhc3N1bWUgInllcyIgZm9yIGVhY2gKICAgcHJvbXB0LikgSWYgeDExdm5jIGlzIHJlZ3VsYXJseSBub3QgY2xlYW5pbmcgdXAgaXRzIHNobSBzZWdtZW50cywKICAgcGxlYXNlIGNvbnRhY3QgbWUgc28gd2UgY2FuIHdvcmsgdG8gaW1wcm92ZSB0aGUgc2l0dWF0aW9uLgoKICAgTG9uZ2VyIHRlcm0sIG9uIFNvbGFyaXMgeW91IGNhbiBwdXQgc29tZXRoaW5nIGxpa2UgdGhpcyBpbgogICAvZXRjL3N5c3RlbToKICBzZXQgc2htc3lzOnNobWluZm9fc2htbWF4ID0gMHgyMDAwMDAwCiAgc2V0IHNobXN5czpzaG1pbmZvX3NobW1uaSA9IDB4MTAwMAoKICAgdG8gc3dlZXAgdGhlIHByb2JsZW0gdW5kZXIgdGhlIHJ1ZyAoNDA5NiBzbG90cy4pIE9uIExpbnV4LCBleGFtaW5lCiAgIC9wcm9jL3N5cy9rZXJuZWwvc2htbW5pOyB5b3UgY2FuIG1vZGlmeSB0aGUgdmFsdWUgYnkgd3JpdGluZyB0byB0aGF0CiAgIGZpbGUuCgogICBUaGluZ3MgYXJlIGV2ZW4gbW9yZSB0aWdodCBvbiBTb2xhcmlzIDggYW5kIGVhcmxpZXIsIHRoZXJlIGlzIGEKICAgZGVmYXVsdCBtYXhpbXVtIG51bWJlciBvZiBzaG0gc2VnbWVudHMgcGVyIHByb2Nlc3Mgb2YgNi4gVGhlIGVycm9yIGlzCiAgIHRoZSBYIHNlcnZlciAobm90IHgxMXZuYykgYmVpbmcgdW5hYmxlIHRvIGF0dGFjaCB0byB0aGUgc2VnbWVudHMsIGFuZAogICBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgogIDMwLzA0LzIwMDQgMTQ6MDQ6MjYgR290IGNvbm5lY3Rpb24gZnJvbSBjbGllbnQgMTkyLjE2OC4xLjIzCiAgMzAvMDQvMjAwNCAxNDowNDoyNiAgIG90aGVyIGNsaWVudHM6CiAgWCBFcnJvciBvZiBmYWlsZWQgcmVxdWVzdDogIEJhZEFjY2VzcyAoYXR0ZW1wdCB0byBhY2Nlc3MgcHJpdmF0ZSByZXNvdXJjZSBkZW4KaWVkKQogICAgIE1ham9yIG9wY29kZSBvZiBmYWlsZWQgcmVxdWVzdDogIDEzMSAoTUlULVNITSkKICAgICBNaW5vciBvcGNvZGUgb2YgZmFpbGVkIHJlcXVlc3Q6ICAxIChYX1NobUF0dGFjaCkKICAgICBTZXJpYWwgbnVtYmVyIG9mIGZhaWxlZCByZXF1ZXN0OiAgMTQKICAgICBDdXJyZW50IHNlcmlhbCBudW1iZXIgaW4gb3V0cHV0IHN0cmVhbTogIDE3CgogICBUaGlzIHRpZ2h0IGxpbWl0IG9uIFNvbGFyaXMgOCBjYW4gYmUgaW5jcmVhc2VkIHZpYToKICBzZXQgc2htc3lzOnNobWluZm9fc2htc2VnID0gMTAwCgogICBpbiAvZXRjL3N5c3RlbS4gU2VlIHRoZSBuZXh0IHBhcmFncmFwaCBmb3IgbW9yZSB3b3JrYXJvdW5kcy4KCiAgIFRvIG1pbmltaXplIHRoZSBudW1iZXIgb2Ygc2htIHNlZ21lbnRzIHVzZWQgYnkgeDExdm5jIHRyeSB1c2luZyB0aGUKICAgLW9uZXRpbGUgb3B0aW9uIChjb3JyZXNwb25kcyB0byBvbmx5IDMgc2htIHNlZ21lbnRzIHVzZWQsIGFuZCBhZGRpbmcKICAgLWZzIDEuMCBrbm9ja3MgaXQgZG93biB0byAyLikgSWYgeW91IGFyZSBoYXZpbmcgbXVjaCB0cm91YmxlIHdpdGggc2htCiAgIHNlZ21lbnRzLCBjb25zaWRlciBkaXNhYmxpbmcgc2htIGNvbXBsZXRlbHkgdmlhIHRoZSAtbm9zaG0gb3B0aW9uLgogICBQZXJmb3JtYW5jZSB3aWxsIGJlIHNvbWV3aGF0IGRlZ3JhZGVkIGJ1dCB3aGVuIGRvbmUgb3ZlciBsb2NhbCBtYWNoaW5lCiAgIHNvY2tldHMgaXQgc2hvdWxkIGJlIGFjY2VwdGFibGUgKHNlZSBhbiBlYXJsaWVyIHF1ZXN0aW9uIGRpc2N1c3NpbmcKICAgLW5vc2htLikKCgogICBRLTcxOiBIb3cgY2FuIEkgbWFrZSB4MTF2bmMgdXNlIGxlc3Mgc3lzdGVtIHJlc291cmNlcz8KCiAgIFRoZSAtbmFwIChub3cgb24gYnkgZGVmYXVsdDsgdXNlIC1ub25hcCB0byBkaXNhYmxlKSBhbmQgIi13YWl0IG4iCiAgICh3aGVyZSBuIGlzIHRoZSBzbGVlcCBiZXR3ZWVuIHBvbGxzIGluIG1pbGxpc2Vjb25kcywgdGhlIGRlZmF1bHQgaXMgMzAKICAgb3Igc28pIG9wdGlvbiBhcmUgZ29vZCBwbGFjZXMgdG8gc3RhcnQuIEluIGFkZGl0aW9uLCBzb21ldGhpbmcgbGlrZQogICAiLXNiIDE1IiB3aWxsIGNhdXNlIHgxMXZuYyB0byBnbyBpbnRvIGEgZGVlcC1zbGVlcCBtb2RlIGFmdGVyIDE1CiAgIHNlY29uZHMgb2Ygbm8gYWN0aXZpdHkgKGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNjAuKQoKICAgUmVkdWNpbmcgdGhlIFggc2VydmVyIGJpdHMgcGVyIHBpeGVsIGRlcHRoIChlLmcuIHRvIDE2YnBwIG9yIGV2ZW4KICAgOGJwcCkgd2lsbCBmdXJ0aGVyIGRlY3JlYXNlIG1lbW9yeSBJL08gYW5kIG5ldHdvcmsgSS9PLiBUaGUgU2hhZG93RkIgWAogICBzZXJ2ZXIgc2V0dGluZyB3aWxsIG1ha2UgeDExdm5jJ3Mgc2NyZWVuIHBvbGxpbmcgbGVzcyBzZXZlcmUuIFVzaW5nCiAgIHRoZSAtb25ldGlsZSBvcHRpb24gd2lsbCB1c2UgbGVzcyBtZW1vcnkgYW5kIHVzZSBmZXdlciBzaGFyZWQgbWVtb3J5CiAgIHNsb3RzIChhZGQgLWZzIDEuMCBmb3Igb25lIGxlc3Mgc2xvdC4pCgoKICAgUS03MjogSG93IGNhbiBJIG1ha2UgeDExdm5jIHVzZSBNT1JFIHN5c3RlbSByZXNvdXJjZXM/CgogICBZb3UgY2FuIHRyeSAtdGhyZWFkcyAobm90ZSB0aGlzIG1vZGUgY2FuIGJlIHVuc3RhYmxlIGFuZC9vciBjcmFzaDsgYW5kCiAgIGFzIG9mIE1heS8yMDA4IGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkLCBzZWUgdGhlIG9wdGlvbiBkZXNjcmlwdGlvbikgb3IKICAgZGlhbCBkb3duIHRoZSB3YWl0IHRpbWUgKGUuZy4gLXdhaXQgMSkgYW5kIHBvc3NpYmx5IGRpYWwgZG93biAtZGVmZXIKICAgYXMgd2VsbC4gTm90ZSB0aGF0IGlmIHlvdSB0cnkgdG8gaW5jcmVhc2UgdGhlICJmcmFtZSByYXRlIiB0b28gbXVjaAogICB5b3UgY2FuIGJvZyBkb3duIHRoZSBzZXJ2ZXIgZW5kIHdpdGggdGhlIGV4dHJhIHdvcmsgaXQgbmVlZHMgdG8gZG8KICAgY29tcHJlc3NpbmcgdGhlIGZyYW1lYnVmZmVyIGRhdGEsIGV0Yy4KCiAgIFRoYXQgc2FpZCwgaXQgaXMgcG9zc2libGUgdG8gInN0cmVhbSIgdmlkZW8gdmlhIHgxMXZuYyBpZiB0aGUgdmlkZW8KICAgd2luZG93IGlzIHNtYWxsIGVub3VnaC4gRS5nLiBhIDI1NngxOTIgeGF3dHYgVFYgY2FwdHVyZSB3aW5kb3cgKHVzaW5nCiAgIHRoZSB4MTF2bmMgLWlkIG9wdGlvbikgY2FuIGJlIHN0cmVhbWVkIG92ZXIgYSBMQU4gb3Igd2lyZWxlc3MgYXQgYQogICByZWFzb25hYmxlIGZyYW1lIHJhdGUuIElmIHRoZSBncmFwaGljcyBjYXJkJ3MgZnJhbWVidWZmZXIgcmVhZCByYXRlIGlzCiAgIGZhc3RlciB0aGFuIG5vcm1hbCB0aGVuIHRoZSB2aWRlbyB3aW5kb3cgc2l6ZSBhbmQgZnJhbWUgcmF0ZSBjYW4gYmUKICAgbXVjaCBoaWdoZXIuIFRoZSB1c2Ugb2YgVHVyYm9WTkMgYW5kL29yIFR1cmJvSlBFRyBjYW4gbWFrZSB0aGUgZnJhbWUKICAgcmF0ZSBzb21ld2hhdCBoaWdoZXIgc3RpbGwgKGJ1dCBtb3N0IG9mIHRoaXMgaGluZ2VzIG9uIHRoZSBncmFwaGljcwogICBjYXJkJ3MgcmVhZCByYXRlLikKCgogICBRLTczOiBJIHVzZSB4MTF2bmMgb3ZlciBhIHNsb3cgbGluayB3aXRoIGhpZ2ggbGF0ZW5jeSAoZS5nLiBkaWFsdXAKICAgbW9kZW0gb3IgYnJvYWRiYW5kKSwgaXMgdGhlcmUgYW55dGhpbmcgSSBjYW4gZG8gdG8gc3BlZWQgdGhpbmdzIHVwPwoKICAgU29tZSB0aGluZ3MgeW91IG1pZ2h0IHdhbnQgdG8gZXhwZXJpbWVudCB3aXRoIChtYW55IG9mIHdoaWNoIHdpbGwgaGVscAogICBwZXJmb3JtYW5jZSBvbiBmYXN0ZXIgbGlua3MgYXMgd2VsbCk6CgogICAgIFggc2VydmVyL3Nlc3Npb24gcGFyYW1ldGVyczoKICAgICAqIENvbmZpZ3VyZSB0aGUgWCBzZXJ2ZXIgYml0cyBwZXIgcGl4ZWwgdG8gYmUgMTZicHAgb3IgZXZlbiA4YnBwLgogICAgICAgKHJlZHVjZXMgYW1vdW50IG9mIGRhdGEgbmVlZGVkIHRvIGJlIHBvbGxlZCwgY29tcHJlc3NlZCwgYW5kIHNlbnQpCiAgICAgKiBVc2UgYSBzbWFsbGVyIGRlc2t0b3Agc2l6ZSAoZS5nLiAxMDI0eDc2OCBpbnN0ZWFkIG9mIDEyODB4MTAyNCkKICAgICAqIE1ha2Ugc3VyZSB0aGUgZGVza3RvcCBiYWNrZ3JvdW5kIGlzIGEgc29saWQgY29sb3IgKHRoZSBiYWNrZ3JvdW5kCiAgICAgICBpcyByZXNlbnQgZXZlcnkgdGltZSBpdCBpcyByZS1leHBvc2VkLikgQ29uc2lkZXIgdXNpbmcgdGhlIC1zb2xpZAogICAgICAgW2NvbG9yXSBvcHRpb24gdG8gdHJ5IHRvIGRvIHRoaXMgYXV0b21hdGljYWxseS4KICAgICAqIENvbmZpZ3VyZSB5b3VyIHdpbmRvdyBtYW5hZ2VyIG9yIGRlc2t0b3AgInRoZW1lIiB0byBub3QgdXNlIGZhbmN5CiAgICAgICBpbWFnZXMsIHNoYWRpbmcsIGFuZCBncmFkaWVudHMgZm9yIHRoZSB3aW5kb3cgZGVjb3JhdGlvbnMsIGV0Yy4KICAgICAgIERpc2FibGUgd2luZG93IGFuaW1hdGlvbnMsIGV0Yy4gTWF5YmUgeW91ciBkZXNrdG9wIGhhcyBhICJsb3cKICAgICAgIGJhbmR3aWR0aCIgdGhlbWUgeW91IGNhbiBlYXNpbHkgc3dpdGNoIGludG8gYW5kIG91dCBvZi4gQWxzbyBpbgogICAgICAgRmlyZWZveCBkaXNhYmxlIGV5ZS1jYW5keSwgZS5nLjogRWRpdCAtPiBQcmVmZXJlbmNlcyAtPiBBZHZhbmNlZAogICAgICAgLT4gVXNlIFNtb290aCBTY3JvbGxpbmcgKGRlc2VsZWN0IGl0LikKICAgICAqIEF2b2lkIHNtYWxsIHNjcm9sbHMgb2YgbGFyZ2Ugd2luZG93cyB1c2luZyB0aGUgQXJyb3cga2V5cyBvcgogICAgICAgc2Nyb2xsYmFyLiBUcnkgdG8gdXNlIFBhZ2VVcC9QYWdlRG93biBpbnN0ZWFkLiAobm90IHNvIG11Y2ggb2YgYQogICAgICAgcHJvYmxlbSBpbiB4MTF2bmMgMC43LjIgaWYgLXNjcm9sbGNvcHlyZWN0IGlzIGFjdGl2ZSBhbmQgZGV0ZWN0aW5nCiAgICAgICBzY3JvbGxzIGZvciB0aGUgYXBwbGljYXRpb24uKQogICAgICogSWYgdGhlIC13aXJlZnJhbWUgb3B0aW9uIGlzIG5vdCBhdmFpbGFibGUgKGVhcmxpZXIgdGhhbiB4MTF2bmMKICAgICAgIDAuNy4yIG9yIHlvdSBoYXZlIGRpc2FibGVkIGl0IHZpYSAtbm93aXJlZnJhbWUpIHRoZW4gRGlzYWJsZQogICAgICAgT3BhcXVlIE1vdmVzIGFuZCBSZXNpemVzIGluIHRoZSB3aW5kb3cgbWFuYWdlci9kZXNrdG9wLgogICAgICogSG93ZXZlciBpZiAtd2lyZWZyYW1lIGlzIGFjdGl2ZSAob24gYnkgZGVmYXVsdCBpbiB4MTF2bmMgMC43LjIpCiAgICAgICB0aGVuIHlvdSBzaG91bGQgRW5hYmxlIE9wYXF1ZSBNb3ZlcyBhbmQgUmVzaXplcyBpbiB0aGUgd2luZG93CiAgICAgICBtYW5hZ2VyISBUaGlzIHNlZW1zIGNvdW50ZXItaW50dWl0aXZlLCBidXQgYmVjYXVzZSB4MTF2bmMgZGV0ZWN0cwogICAgICAgdGhlIG1vdmUvcmVzaXplIGV2ZW50cyBlYXJseSB0aGVyZSBpcyBhIGh1Z2Ugc3BlZWR1cCBvdmVyIGEgc2xvdwogICAgICAgbGluayB3aGVuIE9wYXF1ZSBNb3ZlcyBhbmQgUmVzaXplcyBhcmUgZW5hYmxlZC4gKGUuZy4gQ29weVJlY3QKICAgICAgIGVuY29kaW5nIHdpbGwgYmUgdXNlZC4pCiAgICAgKiBUdXJuIG9mZiBBbnRpLWFsaWFzZWQgZm9udHMgb24geW91ciBzeXN0ZW0sIHdlYiBicm93c2VyLCB0ZXJtaW5hbAogICAgICAgd2luZG93cywgZXRjLiBBQSBmb250cyBkbyBub3QgY29tcHJlc3MgYXMgd2VsbCBhcyB0cmFkaXRpb25hbAogICAgICAgZm9udHMgKHNvbWV0aW1lcyAxMFggbGVzcy4pCiAgICAgKiBPbiBGaXJlZm94L01vemlsbGEgKGFuZCBhbnl0aGluZyBlbHNlKSB0dXJuIG9mZiAiU21vb3RoIFNjcm9sbCIKICAgICAgIGFuaW1hdGlvbnMuIEluIEZpcmVmb3ggcHV0IGluIHRoZSBVUkwgImFib3V0OmNvbmZpZyIgYW5kIHNldAogICAgICAgZ2VuZXJhbC5zbW9vdGhTY3JvbGwgdG8gZmFsc2UuCiAgICAgKiBPbiBYb3JnL1hGcmVlODYgdHVybiBvbiB0aGUgU2hhZG93IEZyYW1lYnVmZmVyIHRvIHNwZWVkIHVwCiAgICAgICByZWFkaW5nLiAoT3B0aW9uICJTaGFkb3dGQiIgInRydWUiIGluIHRoZSBEZXZpY2Ugc2VjdGlvbiBvZgogICAgICAgL2V0Yy9YMTEvWEY4NkNvbmZpZykgVGhpcyBkaXNhYmxlcyAyRCBhY2NlbGVyYXRpb24gb24gdGhlIHBoeXNpY2FsCiAgICAgICBkaXNwbGF5IGFuZCBzbyBtYXkgbm90IGJlIHdvcnRoIGl0IChpZiB5b3UgcGxheSBnYW1lcywgZXRjKSwgYnV0CiAgICAgICBjb3VsZCBiZSBvZiB1c2UgaW4gc29tZSBzaXR1YXRpb25zLiBOb3RlOiBJZiB0aGUgbmV0d29yayBsaW5rIGlzCiAgICAgICB2ZXJ5IHNsb3csIHRoaXMgc3BlZWR1cCBtYXkgbm90IGJlIG5vdGljZWQuCgogICAgIFZOQyB2aWV3ZXIgcGFyYW1ldGVyczoKICAgICAqIFVzZSBhIFRpZ2h0Vk5DIGVuYWJsZWQgdmlld2VyISAoQWN0dWFsbHksIFJlYWxWTkMgNC54IHZpZXdlciB3aXRoCiAgICAgICBaUkxFIGVuY29kaW5nIGlzIG5vdCB0b28gYmFkIGVpdGhlcjsgc29tZSBjbGFpbSBpdCBpcyBmYXN0ZXIuKQogICAgICogTWFrZSBzdXJlIHRoZSB0aWdodCAob3IgenJsZSkgZW5jb2RpbmcgaXMgYmVpbmcgdXNlZCAobG9vayBhdAogICAgICAgdm5jdmlld2VyIGFuZCB4MTF2bmMgb3V0cHV0cykKICAgICAqIFJlcXVlc3QgOCBiaXRzIHBlciBwaXhlbCB1c2luZyAtYmdyMjMzICh1cCB0byA0WCBzcGVlZHVwIG92ZXIKICAgICAgIGRlcHRoIDI0IFRydWVDb2xvciAoMzJicHApLCBidXQgY29sb3JzIHdpbGwgYmUgb2ZmKQogICAgICogUmVhbFZOQyA0Lnggdmlld2VyIGhhcyBzb21lIGV4dHJlbWVseSBsb3cgY29sb3IgbW9kZXMgKG9ubHkgNjQgYW5kCiAgICAgICBldmVuIDggY29sb3JzLikgU1NWTkMgZG9lcyB0b28uIFRoZSBjb2xvcnMgYXJlIHBvb3IsIGJ1dCBpdCBpcwogICAgICAgdXN1YWxseSBub3RpY2VhYmx5IGZhc3RlciB0aGFuIGJncjIzMyAoMjU2IGNvbG9ycy4pCiAgICAgKiBUcnkgaW5jcmVhc2luZyB0aGUgVGlnaHRWTkMgLWNvbXByZXNzbGV2ZWwgKGNvbXByZXNzZXMgbW9yZSBvbgogICAgICAgc2VydmVyIHNpZGUgYmVmb3JlIHNlbmRpbmcsIGJ1dCB1c2VzIG1vcmUgQ1BVKQogICAgICogVHJ5IHJlZHVjaW5nIHRoZSBUaWdodFZOQyAtcXVhbGl0eSAoaW5jcmVhc2VzIEpQRUcgY29tcHJlc3Npb24sCiAgICAgICBidXQgaXMgbG9zc3kgd2l0aCBwYWludGluZyBhcnRpZmFjdHMpCiAgICAgKiBUcnkgb3RoZXIgVk5DIGVuY29kaW5ncyB2aWEgLWVuY29kaW5ncyAodGlnaHQgbWF5IGJlIHRoZSBmYXN0ZXN0LAogICAgICAgYnV0IHlvdSBzaG91bGQgY29tcGFyZSBpdCB0byB6cmxlIGFuZCBtYXliZSBzb21lIG9mIHRoZSBvdGhlcnMpCiAgICAgKiBPbiB0aGUgbWFjaGluZSB3aGVyZSB2bmN2aWV3ZXIgaXMgcnVuLCBtYWtlIHN1cmUgQmFja2luZyBTdG9yZSBpcwogICAgICAgZW5hYmxlZCAoWG9yZy9YRnJlZTg2IGRpc2FibGVzIGl0IGJ5IGRlZmF1bHQgY2F1c2luZyByZS1leHBvc3VyZXMKICAgICAgIG9mIHZuY3ZpZXdlciB0byBiZSB2ZXJ5IHNsb3cpIE9wdGlvbiAiYmFja2luZ3N0b3JlIiBpbiBjb25maWcKICAgICAgIGZpbGUuCgogICAgIHgxMXZuYyBwYXJhbWV0ZXJzOgogICAgICogTWFrZSBzdXJlIHRoZSAtd2lyZWZyYW1lIG9wdGlvbiBpcyBhY3RpdmUgKGl0IHNob3VsZCBiZSBvbiBieQogICAgICAgZGVmYXVsdCkgYW5kIHlvdSBoYXZlIE9wYXF1ZSBNb3Zlcy9SZXNpemVzIEVuYWJsZWQgaW4gdGhlIHdpbmRvdwogICAgICAgbWFuYWdlci4KICAgICAqIE1ha2Ugc3VyZSB0aGUgLXNjcm9sbGNvcHlyZWN0IG9wdGlvbiBpcyBhY3RpdmUgKGl0IHNob3VsZCBiZSBvbiBieQogICAgICAgZGVmYXVsdC4pIFRoaXMgZGV0ZWN0cyBzY3JvbGxzIGluIG1hbnkgKGJ1dCBub3QgYWxsKSBhcHBsaWNhdGlvbnMKICAgICAgIGFuIGFwcGxpZXMgdGhlIENvcHlSZWN0IGVuY29kaW5nIGZvciBhIGJpZyBzcGVlZHVwLgogICAgICogRW5mb3JjZSBhIHNvbGlkIGJhY2tncm91bmQgd2hlbiBWTkMgdmlld2VycyBhcmUgY29ubmVjdGVkIHZpYQogICAgICAgLXNvbGlkCiAgICAgKiBUcnkgeDExdm5jJ3MgY2xpZW50LXNpZGUgY2FjaGluZyBjbGllbnQtc2lkZSBjYWNoaW5nIHNjaGVtZToKICAgICAgIC1uY2FjaGUKICAgICAqIFNwZWNpZnkgLXNwZWVkcyBtb2RlbSB0byBmb3JjZSB0aGUgd2lyZWZyYW1lIGFuZCBzY3JvbGxjb3B5cmVjdAogICAgICAgaGV1cmlzdGljIHBhcmFtZXRlcnMgKGFuZCBhbnkgZnV0dXJlIG9uZXMpIHRvIHRob3NlIG9mIGEgZGlhbHVwCiAgICAgICBtb2RlbSBjb25uZWN0aW9uIChvciBzdXBwbHkgdGhlIHJkLGJ3LGxhdCBudW1lcmljYWwgdmFsdWVzIHRoYXQKICAgICAgIGNoYXJhY3Rlcml6ZSB5b3VyIGxpbmsuKQogICAgICogSWYgd2lyZWZyYW1lIGFuZCBzY3JvbGxjb3B5cmVjdCBhcmVuJ3Qgd29ya2luZywgdHJ5IHVzaW5nIHRoZSBtb3JlCiAgICAgICBkcmFzdGljIC1ub2RyYWdnaW5nIChubyBzY3JlZW4gdXBkYXRlcyB3aGVuIGRyYWdnaW5nIG1vdXNlLCBidXQKICAgICAgIHNvbWV0aW1lcyB5b3UgbWlzcyB2aXN1YWwgZmVlZGJhY2spCiAgICAgKiBTZXQgLWZzIDEuMCAoZGlzYWJsZXMgZnVsbHNjcmVlbiB1cGRhdGVzKQogICAgICogVHJ5IGluY3JlYXNpbmcgLXdhaXQgb3IgLWRlZmVyIChyZWR1Y2VzIHRoZSBtYXhpbXVtICJmcmFtZSByYXRlIiwKICAgICAgIGJ1dCB3b24ndCBoZWxwIG11Y2ggZm9yIGxhcmdlIHNjcmVlbiBjaGFuZ2VzKQogICAgICogVHJ5IHRoZSAtcHJvZ3Jlc3NpdmUgcGl4ZWxoZWlnaHQgbW9kZSB3aXRoIHRoZSBibG9jayBwaXhlbGhlaWdodAogICAgICAgMTAwIG9yIHNvIChkZWxheXMgc2VuZGluZyB2ZXJ0aWNhbCBibG9ja3Mgc2luY2UgdGhleSBtYXkgY2hhbmdlCiAgICAgICB3aGlsZSB2aWV3ZXIgaXMgcmVjZWl2aW5nIGVhcmxpZXIgb25lcykKICAgICAqIElmIHlvdSBqdXN0IHdhbnQgdG8gd2F0Y2ggb25lIChzaW1wbGUpIHdpbmRvdyB1c2UgLWlkIG9yIC1hcHBzaGFyZQogICAgICAgKGN1dHMgZG93biBleHRyYW5lb3VzIHBvbGxpbmcgYW5kIHVwZGF0ZXMsIGJ1dCBjYW4gYmUgYnVnZ3kgb3IKICAgICAgIGluc3VmZmljaWVudCkKICAgICAqIFNldCAtbm9zZWwgKGRpc2FibGVzIGFsbCBjbGlwYm9hcmQgc2VsZWN0aW9uIGV4Y2hhbmdlKQogICAgICogVXNlIC1ub2N1cnNvciBhbmQgLW5vY3Vyc29ycG9zIChyZXBhaW50aW5nIHRoZSByZW1vdGUgY3Vyc29yCiAgICAgICBwb3NpdGlvbiBhbmQgc2hhcGUgdGFrZXMgcmVzb3VyY2VzIGFuZCByb3VuZCB0cmlwcykKICAgICAqIE9uIHZlcnkgc2xvdyBsaW5rcyAoZS5nLiA8PSAyOC44KSB5b3UgbWF5IG5lZWQgdG8gaW5jcmVhc2UgdGhlCiAgICAgICAtcmVhZHRpbWVvdXQgbiBzZXR0aW5nIGlmIGl0IHNvbWV0aW1lcyB0YWtlcyBtb3JlIHRoYW4gMjBzZWMgdG8KICAgICAgIHBhaW50IHRoZSBmdWxsIHNjcmVlbiwgZXRjLgogICAgICogRG8gbm90IHVzZSAtZml4c2NyZWVuIHRvIGF1dG9tYXRpY2FsbHkgcmVmcmVzaCB0aGUgd2hvbGUgc2NyZWVuLAogICAgICAgdGFwIHRocmVlIEFsdF9MJ3MgdGhlbiB0aGUgc2NyZWVuIGhhcyBwYWludGluZyBlcnJvcnMgKHJhcmUKICAgICAgIHByb2JsZW0uKQoKCiAgIEV4YW1wbGUgZm9yIHRoZSBLREUgZGVza3RvcDoKCiAgIExhdW5jaCB0aGUgIktERSBDb250cm9sIENlbnRlciIgdXRpbGl0eS4gU29tZXRpbWVzIHRoaXMgaXMgY2FsbGVkCiAgICJQZXJzb25hbCBTZXR0aW5ncyIuCgogICBTZWxlY3QgIkRlc2t0b3AiLgoKICAgIFRoZW4gU2VsZWN0ICJXaW5kb3cgQmVoYXZpb3IiLiBJbiB0aGUgIk1vdmluZyIgVGFiIHNldCB0aGVzZToKICAgICAqIFlFUyAtIERpc3BsYXkgY29udGVudCBpbiBtb3Zpbmcgd2luZG93cwogICAgICogWUVTIC0gRGlzcGxheSBjb250ZW50IGluIHJlc2l6aW5nIHdpbmRvd3MKICAgICAqIE5PICAgLSBEaXNwbGF5IHdpbmRvdyBnZW9tZXRyeSB3aGVuIG1vdmluZyBvciByZXNpemluZwogICAgICogTk8gICAtIEFuaW1hdGUgbWluaW1pemUgYW5kIHJlc3RvcmUKCiAgICBJbiB0aGUgIlRyYW5zbHVjZW5jeSIgVGFiIHNldDoKICAgICAqIE5PICAgLSBVc2UgdHJhbnNsdWNlbmN5L3NoYWRvd3MKCiAgIE5leHQgaGl0ICJCYWNrIiBhbmQgdGhlbiBzZWxlY3QgIlBhbmVscyIuCgogICAgSW4gdGhlICJBcHBlYXJhbmNlIiBUYWIgc2V0OgogICAgICogTk8gICAtIEVuYWJsZSBpY29uIG1vdXNlb3ZlciBlZmZlY3RzCiAgICAgKiBOTyAgIC0gRW5hYmxlIHRyYW5zcGFyZW5jeQoKICAgTm93IGdvIGFsbCB0aGUgd2F5IGJhY2sgdXAgdG8gdGhlIHRvcCBhbmQgU2VsZWN0ICJBcHBlYXJhbmNlICYKICAgVGhlbWVzIi4KCiAgICBTZWxlY3QgIkJhY2tncm91bmQiIGFuZCBzZXQ6CiAgICAgKiBZRVMgLSBObyBwaWN0dXJlCiAgICAgKiBDb2xvcnM6IFNpbmdsZSBDb2xvcgoKICAgIFNlbGVjdCAiRm9udHMiIGFuZCBkaXNhYmxlIGFudGktYWxpYXNlZCBmb250cyBpZiB5b3UgYXJlIGJvbGQgZW5vdWdoLgoKICAgIFNlbGVjdCAiTGF1bmNoIEZlZWRiYWNrIiBhbmQgc2V0OgogICAgICogQnVzeSBDdXJzb3I6IE5vIEJ1c3kgQ3Vyc29yCiAgICAgKiBOTyAgIC0gRW5hYmxlIHRhc2tiYXIgbm90aWZpY2F0aW9uCgogICAgU2VsZWN0ICJTY3JlZW4gU2F2ZXIiIGFuZCBzZXQ6CiAgICAgKiBTY3JlZW4gU2F2ZXI6IEJsYW5rIFNjcmVlbgoKICAgIFNlbGVjdCAiU3R5bGUiIGFuZCBpbiB0aGUgIkVmZmVjdHMiIFRhYiBzZXQ6CiAgICAgKiBOTyAgIC0gRW5hYmxlIEdVSSBlZmZlY3RzCgoKICAgRXhhbXBsZSBmb3IgdGhlIEdOT01FIGRlc2t0b3A6CiAgICAgKiBUQkQuCgoKICAgUS03NDogRG9lcyB4MTF2bmMgc3VwcG9ydCB0aGUgWCBEQU1BR0UgWHNlcnZlciBleHRlbnNpb24gdG8gZmluZAogICBtb2RpZmllZCByZWdpb25zIG9mIHRoZSBzY3JlZW4gcXVpY2tseSBhbmQgZWZmaWNpZW50bHk/CgogICBZZXMsIGFzIG9mIE1hci8yMDA1IHgxMXZuYyB3aWxsIHVzZSB0aGUgWCBEQU1BR0UgZXh0ZW5zaW9uIGJ5IGRlZmF1bHQKICAgaWYgaXQgaXMgYXZhaWxhYmxlIG9uIHRoZSBkaXNwbGF5LiBUaGlzIHJlcXVpcmVzIGxpYlhkYW1hZ2UgdG8gYmUKICAgYXZhaWxhYmxlIGluIHRoZSBidWlsZCBlbnZpcm9ubWVudCBhcyB3ZWxsIChyZWNlbnQgTGludXggZGlzdHJvcyBhbmQKICAgU29sYXJpcyAxMCBoYXZlIGl0LikKCiAgIFRoZSBEQU1BR0UgZXh0ZW5zaW9uIGVuYWJsZXMgdGhlIFggc2VydmVyIHRvIHJlcG9ydCBjaGFuZ2VkIHJlZ2lvbnMgb2YKICAgdGhlIHNjcmVlbiBiYWNrIHRvIHgxMXZuYy4gU28geDExdm5jIGRvZXNuJ3QgaGF2ZSB0byBndWVzcyB3aGVyZSB0aGUKICAgY2hhbmdlcyBhcmUgKGJ5IHBvbGxpbmcgZXZlcnkgcGl4ZWwgb2YgdGhlIGVudGlyZSBzY3JlZW4gZXZlcnkgMi00CiAgIHNlY29uZHMuKSBUaGUgdXNlIG9mIFggREFNQUdFIGRyYW1hdGljYWxseSByZWR1Y2VzIHRoZSBsb2FkIHdoZW4gdGhlCiAgIHNjcmVlbiBpcyBub3QgY2hhbmdpbmcgdmVyeSBtdWNoIChpLmUuIG1vc3Qgb2YgdGhlIHRpbWUuKSBJdCBhbHNvCiAgIG5vdGljZWFibHkgaW1wcm92ZXMgdXBkYXRlcywgZXNwZWNpYWxseSBmb3IgdmVyeSBzbWFsbCBjaGFuZ2VkIGFyZWFzCiAgIChlLmcuIGNsb2NrIHRpY2tpbmcsIGN1cnNvciBmbGFzaGluZywgdHlwaW5nLCBldGMuKQoKICAgTm90ZSB0aGF0IHRoZSBEQU1BR0UgZXh0ZW5zaW9uIGRvZXMgbm90IHNwZWVkIHVwIHRoZSBhY3R1YWwgcmVhZGluZyBvZgogICBwaXhlbHMgZnJvbSB0aGUgdmlkZW8gY2FyZCBmcmFtZWJ1ZmZlciBtZW1vcnksIGJ5LCBzYXksIG1pcnJvcmluZyB0aGVtCiAgIGluIG1haW4gbWVtb3J5LiBTbyByZWFkaW5nIHRoZSBmYiBpcyBzdGlsbCBwYWluZnVsbHkgc2xvdyAoZS5nLgogICA1TUIvc2VjKSwgYW5kIHNvIGV2ZW4gdXNpbmcgWCBEQU1BR0Ugd2hlbiBsYXJnZSBjaGFuZ2VzIG9jY3VyIG9uIHRoZQogICBzY3JlZW4gdGhlIGJ1bGsgb2YgdGhlIHRpbWUgaXMgc3RpbGwgc3BlbnQgcmV0cmlldmluZyB0aGVtLiBOb3QgaWRlYWwsCiAgIGJ1dCB1c2Ugb2YgdGhlIFNoYWRvd0ZCIFhGcmVlODYvWG9yZyBvcHRpb24gc3BlZWRzIHVwIHRoZSByZWFkaW5nCiAgIGNvbnNpZGVyYWJseSAoYXQgdGhlIGNvc3Qgb2YgaC93IGFjY2VsZXJhdGlvbi4pCgogICBVbmZvcnR1bmF0ZWx5IHRoZSBjdXJyZW50IFhvcmcgREFNQUdFIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbiBjYW4gYXQKICAgdGltZXMgYmUgb3Zlcmx5IGNvbnNlcnZhdGl2ZSBhbmQgcmVwb3J0IHZlcnkgbGFyZ2UgcmVjdGFuZ2xlcyBhcwogICAiZGFtYWdlZCIgZXZlbiB0aG91Z2ggb25seSBhIHNtYWxsIHBvcnRpb24gb2YgdGhlIHBpeGVscyBoYXZlIGFjdHVhbGx5CiAgIGJlZW4gbW9kaWZpZWQuIFRoaXMgYmVoYXZpb3IgaXMgb2Z0ZW4gdGhlIGZhdWx0IG9mIHRoZSB3aW5kb3cgbWFuYWdlcgogICAoZS5nLiBpdCByZWRyYXdzIHRoZSBlbnRpcmUsIHVuc2VlbiwgZnJhbWUgd2luZG93IHVuZGVybmVhdGggdGhlCiAgIGFwcGxpY2F0aW9uIHdpbmRvdyB3aGVuIGl0IGdhaW5zIGZvY3VzKSwgb3IgdGhlIGFwcGxpY2F0aW9uIGl0c2VsZgogICAoZS5nLiBkb2VzIGxhcmdlLCB1bm5lY2Vzc2FyeSByZXBhaW50cy4pCgogICBUbyB3b3JrIGFyb3VuZCB0aGlzIGRlZmljaWVuY3ksIHgxMXZuYyBjdXJyZW50bHkgb25seSB0cnVzdHMgc21hbGwKICAgREFNQUdFIHJlY3RhbmdsZXMgdG8gY29udGFpbiByZWFsIGRhbWFnZS4gVGhlIGxhcmdlciByZWN0YW5nbGVzIGFyZQogICBvbmx5IHVzZWQgYXMgaGludHMgdG8gZm9jdXMgdGhlIHRyYWRpdGlvbmFsIHNjYW5saW5lIHBvbGxpbmcgKGkuZS4gaWYKICAgYSBzY2FubGluZSBkb2Vzbid0IGludGVyc2VjdCBhIHJlY2VudCBEQU1BR0UgcmVjdGFuZ2xlLCB0aGUgc2NhbiBpcwogICBza2lwcGVkLikgWW91IGNhbiB1c2UgdGhlICIteGRfYXJlYSBBIiBvcHRpb24gdG8gYWRqdXN0IHRoZSBzaXplIG9mCiAgIHRoZSB0cnVzdGVkIERBTUFHRSByZWN0YW5nbGVzLiBUaGUgZGVmYXVsdCBpcyAyMDAwMCBwaXhlbHMgKGUuZy4gYQogICAxNDB4MTQwIHNxdWFyZSwgZXRjLikgVXNlICIteGRfYXJlYSAwIiB0byBkaXNhYmxlIHRoZSBjdXRvZmYgYW5kIHRydXN0CiAgIGFsbCBEQU1BR0UgcmVjdGFuZ2xlcy4KCiAgIFRoZSBvcHRpb24gIi14ZF9tZW0gZiIgbWF5IGFsc28gYmUgb2YgdXNlIGluIHR1bmluZyB0aGUgYWxnb3JpdGhtLiBUbwogICBkaXNhYmxlIHVzaW5nIERBTUFHRSBlbnRpcmVseSB1c2UgIi1ub3hkYW1hZ2UiLgoKCiAgIFEtNzU6IE15IE9wZW5HTCBhcHBsaWNhdGlvbiBzaG93cyBubyBzY3JlZW4gdXBkYXRlcyB1bmxlc3MgSSBzdXBwbHkKICAgdGhlIC1ub3hkYW1hZ2Ugb3B0aW9uIHRvIHgxMXZuYy4KICAgT25lIHVzZXIgcmVwb3J0cyBpbiBoaXMgZW52aXJvbm1lbnQgKE15dGhUViB1c2luZyB0aGUgTlZJRElBIE9wZW5HTAogICBkcml2ZXJzKSBoZSBnZXRzIG5vIHVwZGF0ZXMgYWZ0ZXIgdGhlIGluaXRpYWwgc2NyZWVuIGlzIGRyYXduIHVubGVzcwogICBoZSB1c2VzIHRoZSAiLW5veGRhbWFnZSIgb3B0aW9uLgoKICAgVGhpcyBzZWVtcyB0byBiZSBhIGJ1ZyBpbiB0aGUgWCBEQU1BR0UgaW1wbGVtZW50YXRpb24gb2YgdGhhdCBkcml2ZXIuCiAgIFlvdSBtYXkgaGF2ZSB0byB1c2UgLW5veGRhbWFnZSBhcyB3ZWxsLiBBIHdheSB0byBhdXRvZGV0ZWN0IHRoaXMgd2lsbAogICBiZSB0cmllZCwgcHJvYmFibHkgdGhlIGJlc3QgaXQgd2lsbCBkbyBpcyBhdXRvbWF0aWNhbGx5IHN0b3AgdXNpbmcgWAogICBEQU1BR0UuCgogICBBIGRldmVsb3BlciBmb3IgTWluaU15dGggcmVwb3J0cyB0aGF0IHRoZSAnYWxwaGFwdWxzZScgdGFnIG9mIHRoZQogICB0aGVtZSBHLkEuTi5ULiBjYW4gYWxzbyBjYXVzZSBwcm9ibGVtcywgYW5kIHNob3VsZCBiZSBhdm9pZGVkIHdoZW4KICAgdXNpbmcgVk5DLgoKICAgVXBkYXRlOiBzZWUgdGhpcyBGQVEgdG9vLgoKCiAgIFEtNzY6IFdoZW4gSSBkcmFnIHdpbmRvd3MgYXJvdW5kIHdpdGggdGhlIG1vdXNlIG9yIHNjcm9sbCB1cCBhbmQgZG93bgogICB0aGluZ3MgcmVhbGx5IGJvZyBkb3duICh1bmxlc3MgSSBkbyB0aGUgZHJhZyBpbiBhIHNpbmdsZSwgcXVpY2sKICAgbW90aW9uLikgSXMgdGhlcmUgYW55dGhpbmcgdG8gZG8gdG8gaW1wcm92ZSB0aGluZ3M/CgogICBUaGlzIHByb2JsZW0gaXMgcHJpbWFyaWx5IGR1ZSB0byBzbG93IGhhcmR3YXJlIHJlYWQgcmF0ZXMgZnJvbSB2aWRlbwogICBjYXJkczogYXMgeW91IHNjcm9sbCBvciBtb3ZlIGEgbGFyZ2Ugd2luZG93IGFyb3VuZCB0aGUgc2NyZWVuIGNoYW5nZXMKICAgYXJlIG11Y2ggdG9vIHJhcGlkIGZvciB4MTF2bmMgdG8ga2VlcCB1cCB0aGVtIChpdCBjYW4gdXN1YWxseSBvbmx5CiAgIHJlYWQgdGhlIHZpZGVvIGNhcmQgYXQgYWJvdXQgNS0xMCBNQi9zZWMsIHNvIGl0IGNhbiB0YWtlIGEgZ29vZAogICBmcmFjdGlvbiBvZiBhIHNlY29uZCB0byByZWFkIHRoZSBjaGFuZ2VzIGluZHVjZSBmcm9tIG1vdmluZyBhIGxhcmdlCiAgIHdpbmRvdywgaWYgdGhpcyB0byBiZSBkb25lIGEgbnVtYmVyIG9mIHRpbWVzIGluIHN1Y2Nlc3Npb24gdGhlIHdpbmRvdwogICBvciBzY3JvbGwgYXBwZWFycyB0byAibHVyY2giIGZvcndhcmQuKSBTZWUgdGhlIGRlc2NyaXB0aW9uIGluIHRoZQogICAtcG9pbnRlcl9tb2RlIG9wdGlvbiBmb3IgbW9yZSBpbmZvLiBUaGUgbmV4dCBib3R0bGVuZWNrIGlzIGNvbXByZXNzaW5nCiAgIGFsbCBvZiB0aGVzZSBjaGFuZ2VzIGFuZCBzZW5kaW5nIHRoZW0gb3V0IHRvIGNvbm5lY3RlZCB2aWV3ZXJzLAogICBob3dldmVyIHRoZSBWTkMgcHJvdG9jb2wgaXMgcHJldHR5IG11Y2ggc2VsZi1hZGFwdGluZyB3aXRoIHJlc3BlY3QgdG8KICAgdGhhdCAodXBkYXRlcyBhcmUgb25seSBwYWNrYWdlZCBhbmQgc2VudCB3aGVuIHZpZXdlcnMgYXNrIGZvciB0aGVtLikKCiAgIEFzIG9mIEphbi8yMDA0IHRoZXJlIGFyZSBzb21lIGltcHJvdmVtZW50cyB0byBsaWJ2bmNzZXJ2ZXIuIFRoZQogICBkZWZhdWx0IHNob3VsZCBub3cgYmUgbXVjaCBiZXR0ZXIgdGhhbiBiZWZvcmUgYW5kIGRyYWdnaW5nIHNtYWxsCiAgIHdpbmRvd3MgYXJvdW5kIHNob3VsZCBubyBsb25nZXIgYmUgYSBodWdlIHBhaW4uIElmIGZvciBzb21lIHJlYXNvbgogICB0aGVzZSBjaGFuZ2VzIG1ha2UgbWF0dGVycyB3b3JzZSwgeW91IGNhbiBnbyBiYWNrIHRvIHRoZSBvbGQgd2F5IHZpYQogICB0aGUgIi1wb2ludGVyX21vZGUgMSIgb3B0aW9uLgoKICAgQWxzbyBhZGRlZCB3YXMgdGhlIC1ub2RyYWdnaW5nIG9wdGlvbiB0aGF0IGRpc2FibGVzIGFsbCBzY3JlZW4gdXBkYXRlcwogICB3aGlsZSBkcmFnZ2luZyB3aXRoIHRoZSBtb3VzZSAoaS5lLiBtb3VzZSBtb3Rpb24gd2l0aCBhIGJ1dHRvbiBoZWxkCiAgIGRvd24uKSBUaGlzIGdpdmVzIHRoZSBzbmFwcGllc3QgcmVzcG9uc2UsIGJ1dCBtaWdodCBiZSB1bmRlc2lyZWQgaW4KICAgc29tZSBjaXJjdW1zdGFuY2VzIHdoZW4geW91IHdhbnQgdG8gc2VlIHRoZSB2aXN1YWwgZmVlZGJhY2sgd2hpbGUKICAgZHJhZ2dpbmcgKGUuZy4gbWVudSB0cmF2ZXJzYWwgb3IgdGV4dCBzZWxlY3Rpb24uKQoKICAgQXMgb2YgRGVjLzIwMDQgdGhlIC1wb2ludGVyX21vZGUgbiBvcHRpb24gd2FzIGludHJvZHVjZWQuIG49MSBpcyB0aGUKICAgb3JpZ2luYWwgbW9kZSwgbj0yIGFuIGltcHJvdmVtZW50LCBldGMuLiBTZWUgdGhlIC1wb2ludGVyX21vZGUgbiBoZWxwCiAgIGZvciBtb3JlIGluZm8uCgogICBBbHNvLCBpbiBzb21lIGNpcmN1bXN0YW5jZXMgdGhlIC10aHJlYWRzIG9wdGlvbiBjYW4gaW1wcm92ZSByZXNwb25zZQogICBjb25zaWRlcmFibHkuIEJlIGZvcmV3YXJuZWQgdGhhdCBpZiBtb3JlIHRoYW4gb25lIHZuY3ZpZXdlciBpcwogICBjb25uZWN0ZWQgYXQgdGhlIHNhbWUgdGltZSB0aGVuIGxpYnZuY3NlcnZlciBtYXkgbm90IGJlIHRocmVhZCBzYWZlCiAgICh0cnkgdG8gZ2V0IHRoZSB2aWV3ZXJzIHRvIHVzZSBkaWZmZXJlbnQgVk5DIGVuY29kaW5ncywgZS5nLiB0aWdodCBhbmQKICAgWlJMRS4pIFRoaXMgb3B0aW9uIGNhbiBiZSB1bnN0YWJsZSBhbmQgc28gYXMgb2YgRmViLzIwMDggaXQgaXMKICAgZGlzYWJsZWQgYnkgZGVmYXVsdC4gU2V0IGVudi4gWDExVk5DX1RIUkVBREVEPTEgdG8gcmUtZW5hYmxlLgoKICAgQXMgb2YgQXByLzIwMDUgdHdvIG5ldyBvcHRpb25zIChzZWUgdGhlIHdpcmVmcmFtZSBGQVEgYW5kCiAgIHNjcm9sbGNvcHlyZWN0IEZBUSBiZWxvdykgcHJvdmlkZSBzY2hlbWVzIHRvIHN3ZWVwIHRoaXMgcHJvYmxlbSB1bmRlcgogICB0aGUgcnVnIGZvciB3aW5kb3cgbW92ZXMgb3IgcmVzaXplcyBhbmQgZm9yIHNvbWUgKGJ1dCBub3QgYWxsKSB3aW5kb3cKICAgc2Nyb2xscy4gVGhlc2UgYXJlIHRoZSBwcmVmZXJyZWQgd2F5IG9mIGF2b2lkaW5nIHRoZSAibHVyY2hpbmciCiAgIHByb2JsZW0sIGNvbnRhY3QgbWUgaWYgdGhleSBhcmUgbm90IHdvcmtpbmcuIE5vdGUgb24gU3VTRSBhbmQgc29tZQogICBvdGhlciBkaXN0cm9zIHRoZSBSRUNPUkQgWCBleHRlbnNpb24gdXNlZCBieSBzY3JvbGxjb3B5cmVjdCBpcyBub3QKICAgZW5hYmxlZCBieSBkZWZhdWx0LCB0dXJuIGl0IG9uIGluIHhvcmcuY29uZjoKU2VjdGlvbiAiTW9kdWxlIgogICAgICAgIC4uLgogICAgICAgIExvYWQgICJyZWNvcmQiCiAgICAgICAgLi4uCkVuZFNlY3Rpb24KCgogICBRLTc3OiBXaHkgbm90IGRvIHNvbWV0aGluZyBsaWtlIHdpcmVmcmFtZSBhbmltYXRpb25zIHRvIGF2b2lkIHRoZQogICB3aW5kb3dzICJsdXJjaGluZyIgd2hlbiBiZWluZyBtb3ZlZCBvciByZXNpemVkPwoKICAgTmljZSBpZGVhIGZvciBhIGhhY2shIEFzIG9mIEFwci8yMDA1IHgxMXZuYyBieSBkZWZhdWx0IHdpbGwgYXBwbHkKICAgaGV1cmlzdGljcyB0byB0cnkgdG8gZ3Vlc3MgaWYgYSB3aW5kb3cgaXMgYmVpbmcgKG9wYXF1ZWx5KSBtb3ZlZCBvcgogICByZXNpemVkLiBJZiBzdWNoIGEgY2hhbmdlIGlzIGRldGVjdGVkIGZyYW1lYnVmZmVyIHBvbGxpbmcgYW5kIHVwZGF0ZXMKICAgd2lsbCBiZSBzdXNwZW5kZWQgYW5kIG9ubHkgYW4gYW5pbWF0ZWQgIndpcmVmcmFtZSIgKGEgcmVjdGFuZ2xlCiAgIG91dGxpbmUgZHJhd24gd2hlcmUgdGhlIG1vdmVkL3Jlc2l6ZWQgd2luZG93IHdvdWxkIGJlKSBpcyBzaG93bi4gV2hlbgogICB0aGUgd2luZG93IG1vdmUvcmVzaXplIHN0b3BzLCBpdCByZXR1cm5zIHRvIG5vcm1hbCBwcm9jZXNzaW5nOiB5b3UKICAgc2hvdWxkIG9ubHkgc2VlIHRoZSB3aW5kb3cgYXBwZWFyIGluIHRoZSBuZXcgcG9zaXRpb24uIFRoaXMgc3BhcmVzIHlvdQogICBmcm9tIGludGVyYWN0aW5nIHdpdGggYSAibHVyY2hpbmciIHdpbmRvdyBiZXR3ZWVuIGFsbCBvZiB0aGUKICAgaW50ZXJtZWRpYXRlIHN0ZXBzLiBCVFcgdGhlIGx1cmNoaW5nIGlzIGR1ZSB0byBzbG93IHZpZGVvIGNhcmQgcmVhZAogICByYXRlcyAoc2VlIGhlcmUgdG9vLikgQSBkaXNwbGFjZW1lbnQsIGV2ZW4gYSBzbWFsbCBvbmUsIG9mIGEgbGFyZ2UKICAgd2luZG93IHJlcXVpcmVzIGEgbm9uLW5lZ2xpZ2libGUgYW1vdW50IG9mIHRpbWUsIGEgZ29vZCBmcmFjdGlvbiBvZiBhCiAgIHNlY29uZCwgdG8gcmVhZCBpbiBmcm9tIHRoZSBoYXJkd2FyZSBmcmFtZWJ1ZmZlci4KCiAgIE5vdGUgdGhhdCBPcGFxdWUgTW92ZXMvUmVzaXplcyBtdXN0IGJlIEVuYWJsZWQgYnkgeW91ciB3aW5kb3cgbWFuYWdlcgogICBmb3IgLXdpcmVmcmFtZSB0byBkbyBhbnkgZ29vZC4KCiAgIFRoZSBtb2RlIGlzIGN1cnJlbnRseSBvbiBieSBkZWZhdWx0IGJlY2F1c2UgbW9zdCBwZW9wbGUgYXJlIGFmZmxpY3RlZAogICB3aXRoIHRoZSBwcm9ibGVtLiBJdCBjYW4gYmUgZGlzYWJsZWQgd2l0aCB0aGUgLW5vd2lyZWZyYW1lIG9wdGlvbiAoYWthCiAgIC1ub3dmLikgV2h5IG1pZ2h0IG9uZSB3YW50IHRvIHR1cm4gb2ZmIHRoZSB3aXJlZnJhbWluZz8gU2luY2UgeDExdm5jCiAgIGlzIG1lcmVseSBndWVzc2luZyB3aGVuIHdpbmRvd3MgYXJlIGJlaW5nIG1vdmVkL3Jlc2l6ZWQsIGl0IG1heSBndWVzcwogICBwb29ybHkgZm9yIHlvdXIgd2luZG93LW1hbmFnZXIgb3IgZGVza3RvcCwgb3IgZXZlbiBmb3IgdGhlIHdheSB5b3UKICAgbW92ZSB0aGUgcG9pbnRlci4gSWYgeW91ciB3aW5kb3ctbWFuYWdlciBvciBkZXNrdG9wIGFscmVhZHkgZG9lcyBpdHMKICAgb3duIHdpcmVmcmFtaW5nIHRoZW4gdGhpcyBtb2RlIGlzIGEgd2FzdGUgb2YgdGltZSBhbmQgY291bGQgZG8gdGhlCiAgIHdyb25nIHRoaW5nIG9jY2FzaW9uYWxseS4gVGhlcmUgbWF5IGJlIG90aGVyIHJlYXNvbnMgdGhlIG5ldyBtb2RlCiAgIGZlZWxzIHVubmF0dXJhbC4gSWYgeW91IGhhdmUgdmVyeSBleHBlbnNpdmUgdmlkZW8gaGFyZHdhcmUgKFNHSSwgd2VsbAogICBub3cgZXZlbiBwcm9wcmlldGFyeSBYb3JnIGRyaXZlcnMgYXJlIGZhc3QgYXQgcmVhZGluZykgb3IgYXJlIHVzaW5nIGFuCiAgIGluLVJBTSB2aWRlbyBmcmFtZWJ1ZmZlciAoU3VuUmF5LCBTaGFkb3dGQiwgWHZmYiksIHRoZSByZWFkIHJhdGUgZnJvbQogICB0aGF0IGZyYW1lYnVmZmVyIG1heSBiZSB2ZXJ5IGZhc3QgKDEwMCdzIG9mIE1CL3NlYykgYW5kIHNvIHlvdSBkb24ndAogICByZWFsbHkgc2VlIG11Y2ggbHVyY2hpbmcgKGF0IGxlYXN0IG92ZXIgYSBmYXN0IExBTik6IG9wYXF1ZSBtb3ZlcyBsb29rCiAgIHNtb290aCBpbiB4MTF2bmMuIE5vdGU6IFNoYWRvd0ZCIGlzIG9mdGVuIHR1cm5lZCBvbiB3aGVuIHlvdSBhcmUgdXNpbmcKICAgdGhlIHZlc2FmYiBvciBmYmRldiBYRnJlZTg2IHZpZGVvIGRyaXZlciBpbnN0ZWFkIG9mIGEgbmF0aXZlIG9uZSBzbwogICB5b3UgbWlnaHQgYmUgdXNpbmcgaXQgYWxyZWFkeSBhbmQgbm90IGtub3cuCgogICBUaGUgaGV1cmlzdGljcyB1c2VkIHRvIGd1ZXNzIHdpbmRvdyBtb3Rpb24gb3IgcmVzaXppbmcgYXJlIHNpbXBsZSwgYnV0CiAgIGFyZSBub3QgZm9vbCBwcm9vZjogeDExdm5jIGlzIHNvbWV0aW1lcyB0cmlja2VkIGFuZCBzbyB5b3UnbGwKICAgb2NjYXNpb25hbGx5IHNlZSB0aGUgbHVyY2hpbmcgb3BhcXVlIG1vdmUgYW5kIHJhcmVseSBzb21ldGhpbmcgZXZlbgogICB3b3JzZS4KCiAgIEZpcnN0IGl0IGFzc3VtZXMgdGhhdCB0aGUgbW92ZS9yZXNpemUgd2lsbCBvY2N1ciB3aXRoIGEgbW91c2UgYnV0dG9uCiAgIHByZXNzZWQsIGhlbGQgZG93biBhbmQgZHJhZ2dlZCAob2YgY291cnNlIHRoaXMgaXMgb25seSBtb3N0bHkgdHJ1ZS4pCiAgIE5leHQgaXQgd2lsbCBvbmx5IGNvbnNpZGVyIGEgd2luZG93IGZvciB3aXJlZnJhbWluZyBpZiB0aGUgbW91c2UKICAgcG9pbnRlciBpcyBpbml0aWFsbHkgImNsb3NlIGVub3VnaCIgdG8gdGhlIGVkZ2VzIG9mIHRoZSB3aW5kb3cgZnJhbWUsCiAgIGUuZy4geW91IGhhdmUgZ3JhYmJlZCB0aGUgdGl0bGUgYmFyIG9yIGEgcmVzaXplciBlZGdlICh0aGlzCiAgIHJlcXVpcmVtZW50IGNhbiBiZSBkaXNhYmxlZCBhbmQgaXQgYWxzbyBub3QgYXBwbGllZCBpZiBhIG1vZGlmaWVyIGtleSwKICAgZS5nLiBBbHQsIGlzIHByZXNzZWQuKSBJZiB0aGVzZSBhcmUgdHJ1ZSwgaXQgd2lsbCB3YWl0IGFuIGFtb3VudCBvZgogICB0aW1lIHRvIHNlZSBpZiB0aGUgd2luZG93IHN0YXJ0cyBtb3Zpbmcgb3IgcmVzaXppbmcuIElmIGl0IGRvZXMsIGl0CiAgIHN0YXJ0cyBkcmF3aW5nIHRoZSB3aXJlZnJhbWUgIm91dGxpbmUiIG9mIHdoZXJlIHRoZSB3aW5kb3cgd291bGQgYmUuCiAgIFdoZW4gdGhlIG1vdXNlIGJ1dHRvbiBpcyByZWxlYXNlZCwgb3IgYSB0aW1lb3V0IG9jY3VycywgaXQgZ29lcyBiYWNrCiAgIHRvIHRoZSBzdGFuZGFyZCBtb2RlIHRvIGFsbG93IHRoZSBhY3R1YWwgZnJhbWVidWZmZXIgY2hhbmdlcyB0bwogICBwcm9wYWdhdGUgdG8gdGhlIHZpZXdlcnMuCgogICBUaGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSB0d2Vha2VkOgogICAgICogQ29sb3IvU2hhZGUgb2YgdGhlIHdpcmVmcmFtZS4KICAgICAqIExpbmV3aWR0aCBvZiB0aGUgb3V0bGluZSBmcmFtZS4KICAgICAqIEN1dG9mZiBzaXplIG9mIHdpbmRvd3MgdG8gbm90IGFwcGx5IHdpcmVmcmFtaW5nIHRvLgogICAgICogQ3V0b2ZmcyBmb3IgY2xvc2VuZXNzIHRvIFRvcCwgQm90dG9tLCBMZWZ0LCBhbmQgUmlnaHQgZWRnZXMgb2YKICAgICAgIHdpbmRvdy4KICAgICAqIE1vZGlmaWVyIGtleXMgdG8gZW5hYmxlIGludGVyaW9yIHdpbmRvdyBncmFiYmluZy4KICAgICAqIE1heGltdW0gdGltZSB0byB3YWl0IGZvciBkcmFnZ2luZyBwb2ludGVyIGV2ZW50cy4KICAgICAqIE1heGltdW0gdGltZSB0byB3YWl0IGZvciB0aGUgd2luZG93IHRvIHN0YXJ0IG1vdmluZy9yZXNpemluZy4KICAgICAqIE1heGltdW0gdGltZSB0byBzaG93IGEgd2lyZWZyYW1lIGFuaW1hdGlvbi4KICAgICAqIE1pbmltdW0gdGltZSBiZXR3ZWVuIHNlbmRpbmcgd2lyZWZyYW1lIG91dGxpbmVzLgoKICAgU2VlIHRoZSAiLXdpcmVmcmFtZSB0d2Vha3MiIG9wdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiBPbiBhIHNsb3cgbGluaywKICAgZS5nLiBkaWFsdXAgbW9kZW0sIHRoZSBwYXJhbWV0ZXJzIG1heSBiZSBhdXRvbWF0aWNhbGx5IGFkanVzdGVkIGZvcgogICBiZXR0ZXIgcmVzcG9uc2UuCgoKICAgQ29weVJlY3QgZW5jb2Rpbmc6ICBJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgdGhlcmUgaXMgdGhlCiAgICItd2lyZWNvcHlyZWN0IG1vZGUiIG9wdGlvbi4gSXQgaXMgYWxzbyBvbiBieSBkZWZhdWx0LiBUaGlzIGluc3RydWN0cwogICB4MTF2bmMgdG8gbm90IG9ubHkgc2hvdyB0aGUgd2lyZWZyYW1lIGFuaW1hdGlvbiwgYnV0IHRvIGFsc28gaW5zdHJ1Y3QKICAgYWxsIGNvbm5lY3RlZCBWTkMgdmlld2VycyB0byBsb2NhbGx5IHRyYW5zbGF0ZSB0aGUgd2luZG93IGltYWdlIGRhdGEKICAgZnJvbSB0aGUgb3JpZ2luYWwgcG9zaXRpb24gdG8gdGhlIG5ldyBwb3NpdGlvbiBvbiB0aGUgc2NyZWVuIHdoZW4gdGhlCiAgIGFuaW1hdGlvbiBpcyBkb25lLiBUaGlzIHNwZWVkdXAgaXMgdGhlIFZOQyBDb3B5UmVjdCBlbmNvZGluZzogdGhlCiAgIGZyYW1lYnVmZmVyIHVwZGF0ZSBkb2Vzbid0IG5lZWQgdG8gc2VuZCB0aGUgYWN0dWFsIG5ldyBpbWFnZSBkYXRhLgogICBUaGlzIGlzIG5pY2UgaW4gZ2VuZXJhbCwgYW5kIHZlcnkgY29udmVuaWVudCBvdmVyIGEgc2xvdyBsaW5rLCBidXQKICAgc2luY2UgaXQgaXMgYmFzZWQgb24gaGV1cmlzdGljcyB5b3UgbWF5IG5lZWQgdG8gZGlzYWJsZSBpdCB3aXRoIHRoZQogICAtbm93aXJlY29weXJlY3Qgb3B0aW9uIChha2EgLW5vd2NyKSBpZiBpdCB3b3JrcyBpbmNvcnJlY3RseSBvcgogICB1bm5hdHVyYWxseSBmb3IgeW91LgoKICAgVGhlIC13aXJlY29weXJlY3QgbW9kZXMgYXJlOiAibmV2ZXIiIChzYW1lIGFzIC1ub3dpcmVjb3B5cmVjdCk7ICJ0b3AiLAogICBvbmx5IGFwcGx5IHRoZSBDb3B5UmVjdCBpZiB0aGUgd2luZG93IGlzIGFwcGVhcnMgdG8gYmUgb24gdGhlIHRvcCBvZgogICB0aGUgd2luZG93IHN0YWNrIGFuZCBpcyBub3Qgb2JzdHJ1Y3RlZCBieSBvdGhlciB3aW5kb3dzOyBhbmQgImFsd2F5cyIKICAgdG8gYWx3YXlzIHRyeSB0byBhcHBseSB0aGUgQ29weVJlY3QgKG9ic3RydWN0ZWQgcmVnaW9ucyBhcmUgdXN1YWxseQogICBjbGlwcGVkIG9mZiBhbmQgbm90IHRyYW5zbGF0ZWQuKQoKICAgTm90ZSB0aGF0IHNvbWUgZGVza3RvcHMgKEtERSBhbmQgeGZjZSkgYXBwZWFyIHRvIG1lc3Mgd2l0aCB0aGUgd2luZG93CiAgIHN0YWNraW5nIGluIHdheXMgdGhhdCBhcmUgbm90IHlldCBjbGVhci4gSW4gdGhlc2UgY2FzZXMgeDExdm5jIHdvcmtzCiAgIGFyb3VuZCB0aGUgcHJvYmxlbSBieSBhcHBseWluZyB0aGUgQ29weVJlY3QgZXZlbiBpZiBvYnNjdXJpbmcgd2luZG93cycKICAgZGF0YSBpcyB0cmFuc2xhdGVkISBVc2UgLW5vd2lyZWNvcHlyZWN0IGlmIHRoaXMgeWllbGRzIHVuZGVzaXJhYmxlCiAgIGVmZmVjdHMgZm9yIHlvdXIgZGVza3RvcC4KCiAgIEFsc28sIHRoZSBDb3B5UmVjdCBlbmNvZGluZyBtYXkgZ2l2ZSBpbmNvcnJlY3QgcmVzdWx0cyB1bmRlciAtc2NhbGUKICAgKGRlcGVuZGluZyBvbiB0aGUgc2NhbGUgZmFjdG9yIHRoZSBDb3B5UmVjdCBvcGVyYXRpb24gaXMgb2Z0ZW4gb25seQogICBhcHByb3hpbWF0ZTogdGhlIGNvcnJlY3RseSBzY2FsZWQgZnJhbWVidWZmZXIgd2lsbCBiZSBzbGlnaHRseQogICBkaWZmZXJlbnQgZnJvbSB0aGUgdHJhbnNsYXRlZCBvbmUuKSB4MTF2bmMgd2lsbCB0cnkgdG8gcHVzaCBhCiAgICJjbGVhbnVwIiB1cGRhdGUgYWZ0ZXIgdGhlIENvcHlSZWN0IGlmIC1zY2FsZSBpcyBpbiBlZmZlY3QuIFVzZQogICAtbm93aXJlY29weXJlY3QgaWYgdGhpcyBvciBvdGhlciBwYWludGluZyBlcnJvcnMgYXJlIHVuYWNjZXB0YWJsZS4KCgogICBRLTc4OiBDYW4geDExdm5jIHRyeSB0byBhcHBseSBoZXVyaXN0aWNzIHRvIGRldGVjdCB3aGVuIGEgd2luZG93IGlzCiAgIHNjcm9sbGluZyBpdHMgY29udGVudHMgYW5kIHVzZSB0aGUgQ29weVJlY3QgZW5jb2RpbmcgZm9yIGEgc3BlZWR1cD8KCiAgIEFub3RoZXIgbmljZSBpZGVhIGZvciBhIGhhY2shIEFzIG9mIE1heS8yMDA1IHgxMXZuYyB3aWxsIGJ5IGRlZmF1bHQKICAgYXBwbHkgaGV1cmlzdGljcyB0byB0cnkgdG8gZGV0ZWN0IGlmIHRoZSB3aW5kb3cgdGhhdCBoYXMgdGhlIGlucHV0CiAgIGZvY3VzIGlzIHNjcm9sbGluZyBpdHMgY29udGVudHMgKGJ1dCBvbmx5IHdoZW4geDExdm5jIGlzIGZlZWRpbmcgdXNlcgogICBpbnB1dCwga2V5c3Ryb2tlIG9yIHBvaW50ZXIsIHRvIHRoZSBYIHNlcnZlci4pIFNvLCB3aGVuIGRldGVjdGVkLAogICBzY3JvbGxzIGluZHVjZWQgYnkgZHJhZ2dpbmcgb24gYSBzY3JvbGxiYXIgb3IgYnkgdHlwaW5nIChlLmcuIFVwIG9yCiAgIERvd24gYXJyb3dzLCBoaXR0aW5nIFJldHVybiBpbiBhIHRlcm1pbmFsIHdpbmRvdywgZXRjKSwgd2lsbCBzaG93IHVwCiAgIG11Y2ggbW9yZSBxdWlja2x5IHRoYW4gdmlhIHRoZSBzdGFuZGFyZCB4MTF2bmMgc2NyZWVuIHBvbGxpbmcgdXBkYXRlCiAgIG1lY2hhbmlzbS4KCiAgIFRoZXJlIHdpbGwgYmUgYSBzcGVlZHVwIGZvciBib3RoIHNsb3cgYW5kIGZhc3QgbGlua3MgdG8gdmlld2Vycy4gRm9yCiAgIHNsb3cgbGlua3MgdGhlIHNwZWVkdXAgaXMgbW9zdGx5IGR1ZSB0byB0aGUgQ29weVJlY3QgZW5jb2Rpbmcgbm90CiAgIHJlcXVpcmluZyB0aGUgaW1hZ2UgZGF0YSB0byBiZSB0cmFuc21pdHRlZCBvdmVyIHRoZSBuZXR3b3JrLiBGb3IgZmFzdAogICBsaW5rcyB0aGUgc3BlZWR1cCBpcyBwcmltYXJpbHkgZHVlIHRvIHgxMXZuYyBub3QgaGF2aW5nIHRvIHJlYWQgdGhlCiAgIHNjcm9sbGVkIGZyYW1lYnVmZmVyIGRhdGEgZnJvbSB0aGUgWCBzZXJ2ZXIgKHJlY2FsbCB0aGF0IHJlYWRpbmcgZnJvbQogICB0aGUgaGFyZHdhcmUgZnJhbWVidWZmZXIgaXMgc2xvdy4pCgogICBUbyBkbyB0aGlzIHgxMXZuYyB1c2VzIHRoZSBSRUNPUkQgWCBleHRlbnNpb24gdG8gc25vb3AgdGhlIFgxMQogICBwcm90b2NvbCBiZXR3ZWVuIHRoZSBYIGNsaWVudCB3aXRoIHRoZSBmb2N1cyB3aW5kb3cgYW5kIHRoZSBYIHNlcnZlci4KICAgVGhpcyBleHRlbnNpb24gaXMgdXN1YWxseSBwcmVzZW50IG9uIG1vc3QgWCBzZXJ2ZXJzIChidXQgU3VTRSBkaXNhYmxlcwogICBpdCBmb3Igc29tZSByZWFzb24uKSBPbiBYRnJlZTg2L1hvcmcgaXQgY2FuIGJlIGVuYWJsZWQgdmlhIExvYWQKICAgInJlY29yZCIgaW4gdGhlIE1vZHVsZSBzZWN0aW9uIG9mIHRoZSBjb25maWcgZmlsZSBpZiBpdCBpc24ndCBhbHJlYWR5OgpTZWN0aW9uICJNb2R1bGUiCiAgICAgICAgLi4uCiAgICAgICAgTG9hZCAgInJlY29yZCIKICAgICAgICAuLi4KRW5kU2VjdGlvbgoKICAgQ3VycmVudGx5IHRoZSBSRUNPUkQgZXh0ZW5zaW9uIGlzIHVzZWQgYXMgbGl0dGxlIGFzIHBvc3NpYmxlIHNvIGFzIHRvCiAgIG5vdCBzbG93IGRvd24gcmVndWxhciB1c2UuIE9ubHkgc2ltcGxlIGhldXJpc3RpY3MgYXJlIGFwcGxpZWQgdG8KICAgZGV0ZWN0IFhDb3B5QXJlYSBhbmQgWENvbmZpZ3VyZVdpbmRvdyBjYWxscyBmcm9tIHRoZSBhcHBsaWNhdGlvbi4KICAgVGhlc2UgY2F0Y2ggYSBsb3Qgb2Ygc2Nyb2xscywgZS5nLiBpbiBtb3ppbGxhL2ZpcmVmb3ggYW5kIGluIHRlcm1pbmFsCiAgIHdpbmRvd3MgbGlrZSBnbm9tZS10ZXJtaW5hbCBhbmQgeHRlcm0uIFVuZm9ydHVuYXRlbHkgdGhlIHRvb2xraXRzIEtERQogICBhcHBsaWNhdGlvbnMgdXNlIG1ha2Ugc2Nyb2xsIGRldGVjdGlvbiBsZXNzIGVmZmVjdGl2ZSAob25seSByYXJlbHkgYXJlCiAgIHRoZXkgZGV0ZWN0ZWQ6IGkuZS4gS29ucXVlcm9yIGFuZCBLb25zb2xlIGRvbid0IHdvcmsuKSBBbiBpbnRlcmVzdGluZwogICBwcm9qZWN0LCB0aGF0IG1heSBiZSB0aGUgZGlyZWN0aW9uIHgxMXZuYyB0YWtlcywgaXMgdG8gcmVjb3JkIGFsbCBvZgogICB0aGUgWDExIHByb3RvY29sIGZyb20gYWxsIGNsaWVudHMgYW5kIHRyeSB0byAidGVlIiB0aGUgc3RyZWFtIGludG8gYQogICBtb2RpZmllZCBYdmZiIHdhdGNoaW5nIGZvciBDb3B5UmVjdCBhbmQgb3RoZXIgVk5DIHNwZWVkdXBzLiBBCiAgIHBvdGVudGlhbCBpc3N1ZSBpcyB0aGUgUkVDT1JEIHN0cmVhbSBpcyBkZWxheWVkIGZyb20gYWN0dWFsIHZpZXcgb24KICAgdGhlIFggc2VydmVyIGRpc3BsYXk6IGlmIG9uZSBmYWxscyB0b28gZmFyIGJlaGluZCBpdCBjb3VsZCBiZWNvbWUgYQogICBtZXNzLi4uCgogICBUaGUgaW5pdGlhbCBpbXBsZW1lbnRhdGlvbiBvZiAtc2Nyb2xsY29weXJlY3Qgb3B0aW9uIGlzIHVzZWZ1bCBpbiB0aGF0CiAgIGl0IGRldGVjdHMgbWFueSBzY3JvbGxzIGFuZCB0aHVzIGdpdmVzIGEgbXVjaCBuaWNlciB3b3JraW5nCiAgIGVudmlyb25tZW50IChlc3BlY2lhbGx5IHdoZW4gY29tYmluZWQgd2l0aCB0aGUgLXdpcmVmcmFtZQogICAtd2lyZWNvcHlyZWN0IG9wdGlvbnMsIHdoaWNoIGFyZSBhbHNvIG9uIGJ5IGRlZmF1bHQ7IGFuZCBpZiB5b3UgYXJlCiAgIHdpbGxpbmcgdG8gZW5hYmxlIHRoZSBTaGFkb3dGQiB0aGluZ3MgYXJlIHZlcnkgZmFzdC4pIFRoZSBmYWN0IHRoYXQKICAgdGhlcmUgYXJlbid0IGxvbmcgZGVsYXlzIG9yIGx1cmNoZXMgZHVyaW5nIHNjcm9sbGluZyBpcyB0aGUgcHJpbWFyeQogICBpbXByb3ZlbWVudC4KCiAgIEJ1dCB0aGVyZSBhcmUgc29tZSBkcmF3YmFja3M6CiAgICAgKiBOb3QgYWxsIHNjcm9sbHMgYXJlIGRldGVjdGVkLiBTb21lIGFwcHMgc2Nyb2xsIHdpbmRvd3MgaW4gd2F5cwogICAgICAgdGhhdCBjYW5ub3QgY3VycmVudGx5IGJlIGRldGVjdGVkLCBhbmQgb3RoZXIgdGltZXMgeDExdm5jICJtaXNzZXMiCiAgICAgICB0aGUgc2Nyb2xsIGR1ZSB0byB0aW1lb3V0cywgZXRjLiBTb21ldGltZXMgaXQgaXMgbW9yZSBkaXN0cmFjdGluZwogICAgICAgdGhhdCBhIHNwZWVkdXAgb2NjYXNpb25hbGx5IGRvZXNuJ3Qgd29yayBhcyBvcHBvc2VkIHRvIGJlaW5nCiAgICAgICBjb25zaXN0ZW50bHkgc2xvdyEKICAgICAqIEZvciByYXBpZCBzY3JvbGxpbmcgKGkuZS4gc2VxdWVuY2Ugb2YgbWFueSBzY3JvbGxzIG92ZXIgYSBzaG9ydAogICAgICAgcGVyaW9kKSB0aGVyZSBjYW4gYmUgcGFpbnRpbmcgZXJyb3JzICh0ZWFyaW5nLCBidW5jaGluZyB1cCwgZXRjLikKICAgICAgIGR1cmluZyB0aGUgc2Nyb2xsLiBUaGVzZSB3aWxsIHJlcGFpciB0aGVtc2VsdmVzIGFmdGVyIHRoZSBzY3JvbGwKICAgICAgIGlzIG92ZXIsIGJ1dCB3aGVuIHRoZXkgYXJlIHNldmVyZSBpdCBjYW4gYmUgZGlzdHJhY3RpbmcuIFRyeSB0bwogICAgICAgdGhpbmsgb2YgdGhlIGFwcHJveGltYXRlIHdpbmRvdyBjb250ZW50cyBhcyBhIHF1aWNrZXIgYW5kIG1vcmUKICAgICAgIHVzZWZ1bCAiYW5pbWF0aW9uIiBjb21wYXJlZCB0byB0aGUgc2xvd2VyIHBvbGxpbmcgc2NoZW1lLi4uCiAgICAgKiBTY3JvbGxpbmcgaW5zaWRlIHNoZWxscyBpbiB0ZXJtaW5hbCB3aW5kb3dzIChnbm9tZS10ZXJtaW5hbCwKICAgICAgIHh0ZXJtKSwgY2FuIGxlYWQgdG8gb2RkIHBhaW50aW5nIGVycm9ycy4gVGhpcyBpcyBiZWNhdXNlIHgxMXZuYwogICAgICAgZGlkIG5vdCBoYXZlIHRpbWUgdG8gZGV0ZWN0IGEgc2NyZWVuIGNoYW5nZSBqdXN0IGJlZm9yZSB0aGUgc2Nyb2xsCiAgICAgICAobW9zdCBjb21tb24gaXMgdGhlIHRlcm1pbmFsIHVuZHJhd3MgdGhlIGJsb2NrIGN1cnNvciBiZWZvcmUKICAgICAgIHNjcm9sbGluZyB0aGUgdGV4dCB1cDogaW4gdGhlIHZpZXdlciB5b3UgdGVtcG9yYXJpbHkgc2VlIG11bHRpcGxlCiAgICAgICBibG9jayBjdXJzb3JzLikgQW5vdGhlciBpc3N1ZSBpcyB3aXRoIHRoaW5ncyBsaWtlIG1vcmUoMSk6IHNjcm9sbAogICAgICAgZGV0ZWN0aW9uIGZvciA1LTYgbGluZXMgaGFwcGVucyBuaWNlbHksIGJ1dCB0aGVuIGl0IGNhbid0IGtlZXAgdXAKICAgICAgIGFuZCBzbyB0aGVyZSBpcyBhIGxvbmcgcGF1c2UgZm9yIHRoZSBzdGFuZGFyZCBwb2xsaW5nIG1ldGhvZCB0bwogICAgICAgZGVsaXZlciB0aGUgcmVtYWluaW5nIHVwZGF0ZXMuCiAgICAgKiBNb3JlIHJhcmVseSBzb21ldGltZXMgcGFpbnRpbmcgZXJyb3JzIGFyZSBub3QgcmVwYWlyZWQgYWZ0ZXIgdGhlCiAgICAgICBzY3JvbGwgaXMgb3Zlci4gVGhpcyBtYXkgYmUgYSBidWcgaW4geDExdm5jIG9yIGxpYnZuY3NlcnZlciwgb3IgaXQKICAgICAgIG1heSBiZSBhbiBpbmVzY2FwYWJsZSBmYWN0IG9mIHRoZSBDb3B5UmVjdCBlbmNvZGluZyBhbmQgdGhlIGRlbGF5CiAgICAgICBiZXR3ZWVuIFJFQ09SRCBjYWxsYmFja3MgYW5kIHdoYXQgaXMgYWN0dWFsbHkgb24gdGhlIFggZGlzcGxheS4KICAgICAgIE9uZSBjYW4gdGFwIHRoZSBBbHRfTCBrZXkgKExlZnQgIkFsdCIga2V5KSAzIHRpbWVzIGluIGEgcm93IHRvCiAgICAgICBzaWduYWwgeDExdm5jIHRvIHJlZnJlc2ggdGhlIHNjcmVlbiB0byBhbGwgdmlld2Vycy4gWW91cgogICAgICAgVk5DLXZpZXdlciBtYXkgaGF2ZSBpdHMgb3duIHNjcmVlbiByZWZyZXNoIGhvdC1rZXkgb3IgYnV0dG9uLiBTZWUKICAgICAgIGFsc286IC1maXhzY3JlZW4KICAgICAqIFNvbWUgYXBwbGljYXRpb25zLCBub3RhYmx5IE9wZW5PZmZpY2UsIGRvIFhDb3B5QXJlYSBzY3JvbGxzIGluCiAgICAgICB3ZWlyZCB3YXlzIHRoYXQgYXNzdW1lIGFuY2VzdG9yIHdpbmRvdyBjbGlwcGluZyBpcyB0YWtpbmcgcGxhY2UuCiAgICAgICBTZWUgdGhlIC1zY3Jfc2tpcCBvcHRpb24gZm9yIHdheXMgdG8gdHdlYWsgdGhpcyBvbiBhCiAgICAgICBwZXItYXBwbGljYXRpb24gYmFzaXMuCiAgICAgKiBTZWxlY3RpbmcgdGV4dCB3aGlsZSBkcmFnZ2luZyB0aGUgbW91c2UgbWF5IGJlIHNsb3dlciwgZXNwZWNpYWxseQogICAgICAgaWYgdGhlIEJ1dHRvbi1kb3duIGV2ZW50IGhhcHBlbnMgbmVhciB0aGUgd2luZG93J3MgZWRnZS4gVGhpcyBpcwogICAgICAgYmVjYXVzZSB0aGUgc2Nyb2xsY29weXJlY3Qgc2NoZW1lIGlzIHdhdGNoaW5nIGZvciBzY3JvbGxzIHZpYQogICAgICAgUkVDT1JEIGFuZCBoYXMgdG8gd2FpdCBmb3IgYSB0aW1lb3V0IHRvIG9jY3VyIGJlZm9yZSBpdCBkb2VzIHRoZQogICAgICAgdXBkYXRlLgogICAgICogRm9yIHJlYXNvbnMgbm90IHlldCB1bmRlcnN0b29kIHRoZSBSRUNPUkQgZXh0ZW5zaW9uIGNhbiBzdG9wCiAgICAgICByZXNwb25kaW5nIChhbmQgaGVuY2Ugc2Nyb2xscyBhcmUgbWlzc2VkLikgQXMgYSB3b3JrYXJvdW5kIHgxMXZuYwogICAgICAgYXR0ZW1wdHMgdG8gcmVzZXQgdGhlIFJFQ09SRCBjb25uZWN0aW9uIGV2ZXJ5IDYwIHNlY29uZHMgb3Igc28uCiAgICAgICBBbm90aGVyIHdvcmthcm91bmQgaXMgdG8gdHlwZSA0IFN1cGVyX0wgKExlZnQgU3VwZXIvV2luZG93cy1GbGFnCiAgICAgICBrZXkpIGluIGEgcm93IHRvIHJlc2V0IFJFQ09SRC4gV29yayBpcyBpbiBwcm9ncmVzcyB0byB0cnkgdG8gZml4CiAgICAgICB0aGlzIGJ1Zy4KICAgICAqIFNvbWV0aW1lcyB5b3UgbmVlZCB0byAicmV0cmFpbiIgeDExdm5jIGZvciBhIGNlcnRhaW4gd2luZG93CiAgICAgICBiZWNhdXNlIGl0IGZhaWxzIHRvIGRldGVjdCBzY3JvbGxzIGluIGl0LiBTb21ldGltZXMgY2xpY2tpbmcKICAgICAgIGluc2lkZSB0aGUgYXBwbGljYXRpb24gd2luZG93IG9yIHNlbGVjdGluZyBzb21lIHRleHQgaW4gaXQgdG8KICAgICAgIGZvcmNlIHRoZSBmb2N1cyBoZWxwcy4KICAgICAqIFdoZW4gdXNpbmcgdGhlIC1zY2FsZSBvcHRpb24gdGhlcmUgd2lsbCBiZSBhIHF1aWNrIENvcHlSZWN0CiAgICAgICBzY3JvbGwsIGJ1dCBpdCBuZWVkcyB0byBiZSBmb2xsb3dlZCBieSBhIHNsb3dlciAiY2xlYW51cCIgdXBkYXRlLgogICAgICAgVGhpcyBpcyBiZWNhdXNlIGZvciBhIGZpeGVkIGZpbml0ZSBzY3JlZW4gcmVzb2x1dGlvbiAoZS5nLiA3NSBkcGkpCiAgICAgICBzY2FsaW5nIGFuZCBjb3B5cmVjdC1pbmcgYXJlIG5vdCBleGFjdGx5IGluZGVwZW5kZW50LiBTY2FsaW5nCiAgICAgICBpbnZvbHZlcyBhIGJsZW5kaW5nIG9mIG5lYXJieSBwaXhlbHMgYW5kIGlmIHlvdSB0cmFuc2xhdGUgYSBwaXhlbAogICAgICAgdGhlIG5laWdoYm9yIHBpeGVsIHdlaWdodGluZyBtYXkgYmUgZGlmZmVyZW50LiBTbyB5b3UgaGF2ZSB0byB3YWl0CiAgICAgICBhIGJpdCBmb3IgdGhlIGNsZWFudXAgdXBkYXRlIHRvIGZpbmlzaC4gT24gc2xvdyBsaW5rcyB4MTF2bmMgbWF5CiAgICAgICBhdXRvbWF0aWNhbGx5IGRlY2lkZSB0byBub3QgZGV0ZWN0IHNjcm9sbHMgd2hlbiAtc2NhbGUgaXMgaW4KICAgICAgIGVmZmVjdC4gSW4gZ2VuZXJhbCBpdCB3aWxsIGFsc28gdHJ5IHRvIGRlZmVyIHRoZSBjbGVhbnVwIHVwZGF0ZSBpZgogICAgICAgcG9zc2libGUuCgogICBJZiB5b3UgZmluZCB0aGUgLXNjcm9sbGNvcHlyZWN0IGJlaGF2aW9yIHRvbyBhcHByb3hpbWF0ZSBvcgogICBkaXN0cmFjdGluZyB5b3UgY2FuIGdvIGJhY2sgdG8gdGhlIHN0YW5kYXJkIHBvbGxpbmctb25seSB1cGRhdGUgbWV0aG9kCiAgIHdpdGggdGhlIC1ub3Njcm9sbGNvcHlyZWN0IChvciAtbm9zY3IgZm9yIHNob3J0LikgSWYgeW91IGZpbmQgc29tZQogICBleHRyZW1lbHkgYmFkIGFuZCByZXBlYXRhYmxlIGJlaGF2aW9yIGZvciAtc2Nyb2xsY29weXJlY3QgcGxlYXNlCiAgIHJlcG9ydCBhIGJ1Zy4KCiAgIEFsdGVybmF0aXZlbHksIGFzIHdpdGggLXdpcmVmcmFtZSwgdGhlcmUgYXJlIG1hbnkgdHVuaW5nIHBhcmFtZXRlcnMgdG8KICAgdHJ5IHRvIGltcHJvdmUgdGhlIHNpdHVhdGlvbi4gWW91IGNhbiBhbHNvIGFjY2VzcyB0aGVzZSBwYXJhbWV0ZXJzCiAgIGluc2lkZSB0aGUgZ3VpIHVuZGVyICJUdW5pbmciLiBUaGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSB0d2Vha2VkOgogICAgICogVGhlIG1pbmltdW0gcGl4ZWwgYXJlYSBvZiBhIHJlY3RhbmdsZSB0byBiZSB3YXRjaGVkIGZvciBzY3JvbGxzLgogICAgICogQSBsaXN0IGlmIGFwcGxpY2F0aW9uIG5hbWVzIHRvIHNraXAgc2Nyb2xsIGRldGVjdGlvbi4KICAgICAqIFdoaWNoIGtleXN0cm9rZXMgc2hvdWxkIHRyaWdnZXIgc2Nyb2xsIGRldGVjdGlvbi4KICAgICAqIFdoaWNoIGFwcGxpY2F0aW9ucyBzaG91bGQgaGF2ZSBhICJ0ZXJtaW5hbCIgdHdlYWsgYXBwbGllZCB0byB0aGVtLgogICAgICogV2hlbiByZXBlYXRpbmcga2V5cyAoZS5nLiBVcCBhcnJvdykgc2hvdWxkIGJlIGRpc2NhcmRlZCB0bwogICAgICAgcHJlc2VydmUgYSBzY3JvbGwuCiAgICAgKiBDdXRvZmZzIGZvciBjbG9zZW5lc3MgdG8gVG9wLCBCb3R0b20sIExlZnQsIGFuZCBSaWdodCBlZGdlcyBvZgogICAgICAgd2luZG93IGZvciBtb3VzZSBpbmR1Y2VkIHNjcm9sbHMuCiAgICAgKiBTZXQgdGltZW91dCBwYXJhbWV0ZXJzIGZvciBrZXlzdHJva2UgaW5kdWNlZCBzY3JvbGxzLgogICAgICogU2V0IHRpbWVvdXQgcGFyYW1ldGVycyBmb3IgbW91c2UgcG9pbnRlciBpbmR1Y2VkIHNjcm9sbHMuCiAgICAgKiBIYXZlIHRoZSBmdWxsIHNjcmVlbiBiZSBwZXJpb2RpY2FsbHkgcmVmcmVzaGVkIHRvIGZpeCBwYWludGluZwogICAgICAgZXJyb3JzLgoKCiAgIFEtNzk6IENhbiB4MTF2bmMgZG8gY2xpZW50LXNpZGUgY2FjaGluZyBvZiBwaXhlbCBkYXRhPyBJLmUuIHNvIHdoZW4KICAgdGhhdCBwaXhlbCBkYXRhIGlzIG5lZWRlZCBhZ2FpbiBpdCBkb2VzIG5vdCBoYXZlIHRvIGJlIHJldHJhbnNtaXR0ZWQKICAgb3ZlciB0aGUgbmV0d29yay4KCiAgIEFzIG9mIERlYy8yMDA2IGluIHRoZSAwLjkgZGV2ZWxvcG1lbnQgdGFyYmFsbCB0aGVyZSBpcyBhbiBleHBlcmltZW50YWwKICAgY2xpZW50LXNpZGUgY2FjaGluZyBpbXBsZW1lbnRhdGlvbiBlbmFibGVkIGJ5IHRoZSAiLW5jYWNoZSBuIiBvcHRpb24uCiAgIEluIGZhY3QsIGR1cmluZyB0aGUgdGVzdCBwZXJpb2QgaXQgd2FzIG9uIGJ5IGRlZmF1bHQgd2l0aCBuIHNldCB0byAxMC4KICAgVG8gZGlzYWJsZSBpdCB1c2UgIi1ub25jYWNoZSIuCgogICBJdCBpcyBhIHNpbXBsZSBzY2hlbWUgd2hlcmUgYSAodmVyeSBsYXJnZSkgbG93ZXIgcG9ydGlvbiBvZiB0aGUKICAgZnJhbWVidWZmZXIgKGkuZS4gc3RhcnRpbmcganVzdCBiZWxvdyB0aGUgdXNlcidzIGFjdHVhbCBkZXNrdG9wCiAgIGRpc3BsYXkpIGlzIHVzZWQgZm9yIHN0b3JpbmcgcGl4ZWwgZGF0YS4gQ29weVJlY3Q7IGEgZmFzdCwgZXNzZW50aWFsbHkKICAgbG9jYWwgdmlld2VyLXNpZGUgVk5DIGVuY29kaW5nOyBpcyB1c2VkIHRvIHN3YXAgdGhlIHBpeGVsIGRhdGEgaW4gYW5kCiAgIG91dCBvZiB0aGUgYWN0dWFsIGRpc3BsYXkgYXJlYS4gSXQgZ2l2ZXMgYW4gZXhjZWxsZW50IHNwZWVkdXAgZm9yCiAgIGljb25pZnlpbmcvZGVpY29uaWZ5aW5nIGFuZCBtb3Zpbmcgd2luZG93cyBhbmQgcmUtcG9zdGluZyBvZiBtZW51cwogICAob2Z0ZW4gaXQgZG9lc24ndCBmZWVsIGxpa2UgVk5DIGF0IGFsbDogdGhlcmUgaXMgbm8gZGVsYXkgd2FpdGluZyBmb3IKICAgdGhlIHBpeGVsIGRhdGEgdG8gZmlsbCBpbi4pCgogICBUaGlzIHNjaGVtZSBpcyBuaWNlIGJlY2F1c2UgaXQgZG9lcyBhbGwgb2YgdGhpcyB3aXRoaW4gdGhlIGV4aXN0aW5nCiAgIFZOQyBwcm90b2NvbCwgYW5kIHNvIGl0IHdvcmtzIHdpdGggYWxsIFZOQyB2aWV3ZXJzLgoKICAgQSBjaGFsbGVuZ2UgdG8gZG9pbmcgbW9yZSBzb3BoaXN0aWNhdGVkIChlLmcuIGNvbXByZXNzZWQgYW5kL29yCiAgIHNoYXJlZCkgY2xpZW50LXNpZGUgY2FjaGluZyBpcyB0aGF0IG9uZSBuZWVkcyB0byBleHRlbmQgdGhlIFZOQwogICBwcm90b2NvbCwgbW9kaWZ5IGEgdmlld2VyIGFuZCB0aGVuIGFsc28gY29udmluY2UgdXNlcnMgdG8gYWRvcHQgeW91cgogICBtb2RpZmllZCBWTkMgVmlld2VyIChvciBnZXQgdGhlIG5ldyBmZWF0dXJlcyB0byBiZSBmb2xkZWQgaW50byB0aGUKICAgbWFpbiBWTkMgdmlld2VycywgcGF0Y2hlcyBhY2NlcHRlZCwgZXRjLi4uIGxpa2VseSB0YWtlcyBtYW55IHllYXJzCiAgIGJlZm9yZSB0aGV5IG1pZ2h0IGJlIGRlcGxveWVkIGluIHRoZSBmaWVsZC4pIFNvIGl0IGlzIGNvbnZlbmllbnQgdGhhdAogICB0aGUgIi1uY2FjaGUgbiIgd29ya3Mgd2l0aCBhbnkgdW5hbHRlcmVkIFZOQyB2aWV3ZXIuCgogICBBIGRyYXdiYWNrIG9mIHRoZSAiLW5jYWNoZSBuIiBtZXRob2QgaXMgdGhhdCBpbiB0aGUgVk5DIFZpZXdlciB5b3UgY2FuCiAgIHNjcm9sbCBkb3duIGFuZCBhY3R1YWxseSBzZWUgdGhlIGNhY2hlZCBwaXhlbCBkYXRhLiBTbyBpdCBsb29rcyBsaWtlCiAgIHRoZXJlIGlzIGEgYnVnOiB5b3UgY2FuIHNjcm9sbCBkb3duIGluIHlvdXIgdmlld2VyIGFuZCBzZWUgYSBzdHJhbmdlCiAgICJoaXN0b3J5IiBvZiB3aW5kb3dzIG9uIHlvdXIgZGVza3RvcC4gVGhpcyBpcyB3b3JraW5nIGFzIGludGVuZGVkLiBPbmUKICAgd2lsbCBuZWVkIHRvIHRyeSB0byBhZGp1c3QgdGhlIHNpemUgb2YgaGlzIFZOQyBWaWV3ZXIgd2luZG93IHNvIHRoZQogICBjYWNoZSBhcmVhIGNhbm5vdCBiZSBzZWVuLiBTU1ZOQyAoc2VlIGJlbG93KSBjYW4gZG8gdGhpcwogICBhdXRvbWF0aWNhbGx5LgoKICAgQXQgc29tZSBwb2ludCBMaWJWTkNTZXJ2ZXIgbWF5IGltcGxlbWVudCBhICJyZmJGQkNyb3AiIHBzZXVkb2VuY29kaW5nCiAgIHRoYXQgdmlld2VycyBjYW4gdXNlIHRvIGxlYXJuIHdoaWNoIHBvcnRpb24gb2YgdGhlIGZyYW1lYnVmZmVyIHRvCiAgIGFjdHVhbGx5IHNob3cgdG8gdGhlIHVzZXJzICh3aXRoIHRoZSBoaWRkZW4gcGFydCB1c2VkIGZvciBjYWNoaW5nLCBvcgogICBwZXJoYXBzIHNvbWV0aGluZyBlbHNlLCBtYXliZSBkb3VibGUgYnVmZmVyaW5nIG9yIG90aGVyIG9mZnNjcmVlbgogICByZW5kZXJpbmcuLi4pCgogICBUaGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgVW5peCB2aWV3ZXIgaGFzIGEgbmljZSAteWNyb3AKICAgb3B0aW9uIHRvIGhlbHAgaGlkZSB0aGUgcGl4ZWwgY2FjaGUgYXJlYSBmcm9tIHZpZXcuIEl0IHdpbGwgdHVybiBvbgogICBhdXRvbWF0aWNhbGx5IGlmIHRoZSBmcmFtZWJ1ZmZlciBhcHBlYXJzIHRvIGJlIHZlcnkgdGFsbCAoaGVpZ2h0IG1vcmUKICAgdGhhbiB0d2ljZSB0aGUgd2lkdGgpLCBvciB5b3UgY2FuIHN1cHBseSB0aGUgYWN0dWFsIHZhbHVlIGZvciB0aGUKICAgaGVpZ2h0LiBJZiB0aGUgc2NyZWVuIGlzIHJlc2l6ZWQgYnkgc2NhbGluZywgZXRjLCB0aGUgeWNyb3AgdmFsdWUgaXMKICAgc2NhbGVkIGFzIHdlbGwuIEluIGZ1bGxzY3JlZW4gbW9kZSB5b3UgY2Fubm90IHNjcm9sbCBwYXN0IHRoZSBlbmQgb2YKICAgdGhlIGFjdHVhbCBzY3JlZW4sIGFuZCBpbiBub24tZnVsbHNjcmVlbiBtb2RlIHRoZSB3aW5kb3cgbWFuYWdlciBmcmFtZQogICBpcyBhZGp1c3RlZCB0byBmaXQgdGhlIGFjdHVhbCBkaXNwbGF5IChzbyB5b3UgZG9uJ3Qgc2VlIHRoZSBwaXhlbAogICBjYWNoZSByZWdpb24pIGFuZCB0aGUgc2Nyb2xsYmFycyBhcmUgdmVyeSB0aGluIHRvIGF2b2lkIGRpc3RyYWN0aW9uCiAgIGFuZCB0cm91YmxlIGZpdHRpbmcgaW5zaWRlIHlvdXIgZGlzcGxheS4gVXNlIHRoZSAiLXNid2lkdGggbiIgdmlld2VyCiAgIG9wdGlvbiB0byBtYWtlIHRoZSBzY3JvbGxiYXJzIHRoaWNrZXIgaWYgeW91IGxpa2UuCgogICBBbm90aGVyIGRyYXdiYWNrIG9mIHRoZSBzY2hlbWUgaXMgdGhhdCBpdCBpcyBWRVJZIG1lbW9yeSBpbnRlbnNpdmUsCiAgIHRoZSBuIGluICItbmNhY2hlIG4iIGlzIHRoZSBmYWN0b3Igb2YgaW5jcmVhc2Ugb3ZlciB0aGUgYmFzZQogICBmcmFtZWJ1ZmZlciBzaXplIHRvIHVzZSBmb3IgY2FjaGluZy4gSXQgaXMgYW4gZXZlbiBpbnRlZ2VyIGFuZCBzaG91bGQKICAgYmUgZmFpcmx5IGxhcmdlLCA2LTEyLCB0byBhY2hpZXZlIGdvb2QgcmVzcG9uc2UuIFRoaXMgdXN1YWxseSByZXF1aXJlcwogICBhYm91dCA1MC0xMDBNQiBvZiBhZGRpdGlvbmFsIFJBTSBvbiBib3RoIHRoZSBjbGllbnQgYW5kIHNlcnZlciBzaWRlcy4KICAgRm9yIGV4YW1wbGUgd2l0aCBuPTYgYSAxMjgweDEwMjQgZGlzcGxheSB3aWxsIHVzZSBhIGZyYW1lYnVmZmVyIHRoYXQKICAgaXMgMTI4MHg3MTY4OiBldmVyeXRoaW5nIGJlbG93IHJvdyAxMDI0IGlzIHRoZSBwaXhlbCBidWZmZXIgY2FjaGUuIElmCiAgIHlvdSBhcmUgcnVubmluZyBvbiBsb3cgbWVtb3J5IG1hY2hpbmVzIG9yIG1lbW9yeSBpcyB0aWdodCBiZWNhdXNlIG9mCiAgIG90aGVyIHJ1bm5pbmcgYXBwbGljYXRpb25zIHlvdSBzaG91bGQgbm90IHVzZSAtbmNhY2hlLgoKICAgVGhlIHJlYXNvbiBmb3Igc28gbXVjaCBtZW1vcnkgaXMgYmVjYXVzZSB0aGUgcGl4ZWwgZGF0YSBpcyBub3QKICAgY29tcHJlc3NlZCBhbmQgc28gdGhlIHdob2xlIHdpbmRvdyB0byBiZSBzYXZlZCBtdXN0IGJlIHN0b3JlZAogICAib2Zmc2NyZWVuIi4gRS5nLiBmb3IgYSBsYXJnZSB3ZWIgYnJvd3NlciB3aW5kb3cgdGhpcyBjYW4gYmUgbmVhcmx5IDEKICAgbWlsbGlvbiBwaXhlbHMsIGFuZCB0aGF0IGlzIG9ubHkgZm9yIGEgc2luZ2xlIHdpbmRvdyEgT25lIHR5cGljYWxseQogICB3YW50cyB0byBjeWNsZSBiZXR3ZWVuIDUtMTAgbGFyZ2UgYWN0aXZlIHdpbmRvd3MuIEFsc28gYmVjYXVzZSBib3RoCiAgIGJhY2tpbmctc3RvcmUgKHRoZSB3aW5kb3cncyBhY3R1YWwgY29udGVudHMpIGFuZCBzYXZlLXVuZGVycyAodGhlCiAgIHBpeGVscyBjb3ZlcmVkIHVwIGJ5IHRoZSB3aW5kb3cpIGFyZSBjYWNoZWQgb2Zmc2NyZWVuIHRoYXQgaW50cm9kdWNlcwogICBhbiBhZGRpdGlvbmFsIGZhY3RvciBvZiAyIGluIG1lbW9yeSB1c2UuCgogICBIb3dldmVyLCBldmVuIGluIHRoZSBzbWFsbGVzdCB1c2FnZSBtb2RlIHdpdGggbiBlcXVhbCAyIGFuZAogICAtbmNhY2hlX25vX3Jvb3RwaXhtYXAgc2V0ICh0aGlzIHJlcXVpcmVzIG9ubHkgMlggYWRkaXRpb25hbAogICBmcmFtZWJ1ZmZlciBtZW1vcnkpIHRoZXJlIGlzIHN0aWxsIGEgbm90aWNhYmxlIGltcHJvdmVtZW50IGZvciBtYW55CiAgIGFjdGl2aXRpZXMsIGFsdGhvdWdoIGl0IGlzIG5vdCBhcyBkcmFtYXRpYyBhcyB3aXRoLCBzYXkgbiBlcXVhbCAxMiBhbmQKICAgcm9vdHBpeG1hcCAoZGVza3RvcCBiYWNrZ3JvdW5kKSBjYWNoaW5nIGVuYWJsZWQuCgogICBUaGUgbGFyZ2UgbWVtb3J5IGNvbnN1bXB0aW9uIG9mIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGNhbiBiZQogICB0aG91Z2h0IG9mIGFzIGEgdHJhZGVvZmYgdG8gcHJvdmlkaW5nIGNhY2hpbmcgYW5kIGJlaW5nIGNvbXBhdGlibGUKICAgd2l0aCBhbGwgVk5DIHZpZXdlcnMgYW5kIGFsc28gZWFzZSBvZiBpbXBsZW1lbnRpbmcuIEhvcGVmdWxseSBpdCBjYW4KICAgYmUgdHVuZWQgdG8gdXNlIGxlc3MsIG9yIHRoZSBWTkMgY29tbXVuaXR5IHdpbGwgZXh0ZW5kIHRoZSBwcm90b2NvbCB0bwogICBhbGxvdyBjYWNoaW5nIGFuZCByZXBsYXlpbmcgb2YgY29tcHJlc3NlZCBibG9icyBvZiBkYXRhLgoKICAgQW5vdGhlciBvcHRpb24gdG8gZXhwZXJpbWVudCB3aXRoIGlzICItbmNhY2hlX2NyIi4gQnkgc3BlY2lmeWluZyBpdCwKICAgeDExdm5jIHdpbGwgdHJ5IHRvIGRvIHNtb290aCBvcGFxdWUgd2luZG93IG1vdmVzIGluc3RlYWQgb2YgaXRzCiAgIHdpcmVmcmFtZS4gVGhpcyBjYW4gZ2l2ZSBhIHZlcnkgbmljZSBlZmZlY3QgKG5vdGU6IG9uIFVuaXggdGhlIHJlYWx2bmMKICAgdmlld2VyIHNlZW1zIHRvIGJlIHNtb290aGVyIHRoYW4gdGhlIHRpZ2h0dm5jIHZpZXdlciksIGJ1dCBjYW4gbGVhZCB0bwogICBzb21lIHBhaW50aW5nIHByb2JsZW1zLCBhbmQgY2FuIGJlIGplcmt5IGluIHNvbWUgY2lyY3Vtc3RhbmNlcy4KCiAgIFN1cnByaXNpbmdseSwgZm9yIHZlcnkgc2xvdyBjb25uZWN0aW9ucywgZS5nLiBtb2RlbSwgdGhlIC1uY2FjaGVfY3IKICAgb3B0aW9uIGNhbiBhY3R1YWxseSBpbXByb3ZlIHdpbmRvdyBkcmFncy4gVGhpcyBpcyBwcm9iYWJseSBiZWNhdXNlIG5vCiAgIHBpeGVsIGRhdGEgKG9ubHkgQ29weVJlY3QgaW5zdHJ1Y3Rpb25zKSBhcmUgc2VudCB3aGVuIGRyYWdnaW5nIGEKICAgd2luZG93LiBOb3JtYWxseSwgdGhlIHdpcmVmcmFtZSBtdXN0IGJlIHNlbnQgYW5kIHRoaXMgaW52b2x2ZXMKICAgY29tcHJlc3NpbmcgYW5kIHNlbmRpbmcgdGhlIGxpbmVzIHRoYXQgZ2l2ZSByaXNlIHRvIHRoZSBtb3ZpbmcgYm94CiAgIGVmZmVjdCAobm90ZSB0aGF0IHJlYWwgZnJhbWVidWZmZXIgZGF0YSBpcyBzZW50IHRvICJlcmFzZSIgdGhlIHdoaXRlCiAgIGxpbmVzIG9mIHRoZSBib3guKQoKICAgSWYgeW91IGV4cGVyaWVuY2UgcGFpbnRpbmcgZXJyb3JzIHlvdSBjYW4gY2FuIHRhcCB0aGUgQWx0X0wga2V5IChMZWZ0CiAgICJBbHQiIGtleSkgMyB0aW1lcyBpbiBhIHJvdyB0byBzaWduYWwgeDExdm5jIHRvIHJlZnJlc2ggdGhlIHNjcmVlbiB0bwogICBhbGwgdmlld2Vycy4gWW91IG1heSBhbHNvIG5lZWQgdG8gaWNvbmlmeSBhbmQgdGhlbiBkZWljb25pZnkgYW55CiAgIGRhbWFnZWQgd2luZG93cyB0byBjb3JyZWN0IHRoZWlyIGNhY2hlIGRhdGEgYXMgd2VsbC4gTm90ZSB0aGF0IGlmIHlvdQogICBjaGFuZ2UgY29sb3Igdmlld2VyIGRlcHRoIChlLmcuIDhicHAgdG8gZnVsbCBjb2xvcikgZHluYW1pY2FsbHkgdGhhdAogICB3aWxsIHVzdWFsbHkgbGVhZCB0byB0aGUgZW50aXJlIGV4dGVuZGVkIGZyYW1lYnVmZmVyIGJlaW5nIHJlc2VudAogICB3aGljaCBjYW4gdGFrZSBhIGxvbmcgdGltZSBvdmVyIHZlcnkgc2xvdyBsaW5rczogaXQgbWF5IGJlIGJldHRlciB0bwogICByZWNvbm5lY3QgYW5kIHJlc2V0IHRoZSBmb3JtYXQgcmlnaHQgYWZ0ZXIgZG9pbmcgc28uIHgxMXZuYyB3aWxsIHRyeQogICB0byBkZXRlY3QgdGhlIGZvcm1hdCBjaGFuZ2UgYW5kIGNsZWFyIChtYWtlIGNvbXBsZXRlbHkgYmxhY2spIHRoZQogICBjYWNoZSByZWdpb24uCgogICBHb3RjaGEgZm9yIG9sZGVyIFVuaXggVk5DIFZpZXdlcnM6IFRoZSBvbGRlciBVbml4IFZOQyB2aWV3ZXJzIChlLmcuCiAgIGN1cnJlbnQgVGlnaHRWTkMgVW5peCBWaWV3ZXIpIHJlcXVpcmUgWCBzZXJ2ZXIgYmFja2luZ3N0b3JlIHRvIGtlZXAKICAgb2ZmLXZpZXdlciBzY3JlZW4gZGF0YSBsb2NhbC4gSWYgdGhlIHZpZXdlci1zaWRlIFggc2VydmVyIGhhcwogICBiYWNraW5nc3RvcmUgZGlzYWJsZWQgKHNhZGx5LCBjdXJyZW50bHkgdGhlIGRlZmF1bHQgb24gTGludXgsIGV0YyksCiAgIHRoZW4gdG8gZ2V0IHRoZSBvZmZzY3JlZW4gcGl4ZWxzIHRoZSB2aWV3ZXIgaGFzIHRvIGFzayBmb3IgYSByZWZyZXNoCiAgIG92ZXIgdGhlIG5ldHdvcmssIHRoZXJlYnkgZGVmZWF0aW5nIHRoZSBjYWNoaW5nLiBVc2Ugc29tZXRoaW5nIGxpa2UKICAgdGhpcyBpbiB5b3VyIHZpZXdlci1zaWRlIC9ldGMvWDExL3hvcmcuY29uZiBmaWxlIChvciBvdGhlcndpc2UgZ2V0CiAgIHlvdXIgdmlld2VyLXNpZGUgc3lzdGVtIHRvIGRvIGl0KQpTZWN0aW9uICJEZXZpY2UiCiAgICAgICAgLi4uCiAgICAgICAgT3B0aW9uICAiYmFja2luZ3N0b3JlIgogICAgICAgIC4uLgpFbmRTZWN0aW9uCgogICBObyBwcm9ibGVtcyBsaWtlIHRoaXMgaGF2ZSBiZWVuIG9ic2VydmVkIHdpdGggV2luZG93cyBWTkMgVmlld2VyczoKICAgdGhleSBhbGwgc2VlbSB0byBrZWVwIHRoZWlyIGVudGlyZSBmcmFtZWJ1ZmZlciBpbiBsb2NhbCBtZW1vcnkuCgogICBHb3RjaGEgZm9yIEtERSBrcmRjIFZOQyBWaWV3ZXI6IE9uZSB1c2VyIGZvdW5kIHRoYXQgS0RFJ3Mga3JkYyB2aWV3ZXIKICAgaGFzIHNvbWUgc29ydCBvZiBoYXJkd2lyZWQgbGltaXQgb24gdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUKICAgZnJhbWVidWZmZXIgKDY0TUI/KS4gSXQgZmFpbHMgcXVpY2tseSBzYXlpbmcgIlRoZSBjb25uZWN0aW9uIHRvIHRoZQogICBob3N0IGhhcyBiZWVuIGludGVycnVwdGVkLiIgVGhlIHdvcmthcm91bmQgZm9yIGhpcyAxMjgweDEwMjQKICAgeDExdm5jLXNpZGUgZGlzcGxheSB3YXMgdG8gcnVuIHdpdGggIi1uY2FjaGUgMTAiLCBpLmUuIGEgc21hbGxlciB2YWx1ZQogICB0byBiZSB1bmRlciB0aGUga3JkYyB0aHJlc2hvbGQuCgogICBBbHRob3VnaCB0aGlzIHNjaGVtZSBpcyBub3QgYXMgcXVpY2sgKG5vciBhcyBjb21wcmVzc2VkKSBhcwogICBueC9ub21hY2hpbmUsIHNheSwgaXQgZG9lcyBwcm92aWRlIGEgZ29vZCBzdGVwIGluIHRoZSBkaXJlY3Rpb24gb2YKICAgaW1wcm92aW5nIFZOQyBwZXJmb3JtYW5jZSBieSBjbGllbnQgc2lkZSBjYWNoaW5nLgoKCiAgIFEtODA6IERvZXMgeDExdm5jIHN1cHBvcnQgVHVyYm9WTkM/CgogICBBcyBvZiBGZWIvMjAwOSAoZGV2ZWxvcG1lbnQgdGFyYmFsbCkgdGhlcmUgaXMgYW4gZXhwZXJpbWVudGFsIGtsdWRnZQogICB0byBsZXQgeW91IGJ1aWxkIHgxMXZuYyB1c2luZyBUdXJib1ZOQydzIG1vZGlmaWVkIFRpZ2h0Vk5DIGVuY29kaW5nLgogICBUdXJib1ZOQyBpcyBwYXJ0IG9mIHRoZSBWaXJ0dWFsR0wgcHJvamVjdC4gSXQgZG9lcyB0d28gbWFpbiB0aGluZ3MgdG8KICAgc3BlZWQgdXAgdGhlIFRpZ2h0Vk5DIGVuY29kaW5nOgogICAgICogSXQgZWxpbWluYXRlcyBib3R0bGVuZWNrcywgb3ZlcmhlYWRzLCB3YWl0LXRpbWVzIGluIHRoZSBUaWdodFZOQwogICAgICAgZW5jb2RpbmcgaW1wbGVtZW50YXRpb24gYW5kIGluc3RlYWQgb25seSB3b3JyaWVzIGFib3V0IHNlbmRpbmcKICAgICAgIHZlcnkgd2VsbCAoYW5kIHF1aWNrbHkpIGNvbXByZXNzZWQgSlBFRyBkYXRhLgogICAgICogQSBmYXN0IHByb3ByaWV0YXJ5IEpQRUcgaW1wbGVtZW50aW9uIGlzIHVzZWQgKEludGVsIElQUCBvbiB4ODYpCiAgICAgICBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBsaWJqcGVnIGltcGxlbWVudGF0aW9uLiBUdXJib0pQRUcgaXMgYW4KICAgICAgIGludGVyZmFjZSBsaWJyYXJ5LCBsaWJ0dXJib2pwZWcsIHByb3ZpZGVkIGJ5IHRoZSBwcm9qZWN0IHRoYXQKICAgICAgIGFjaGlldmVzIHRoaXMuCgogICBUdXJib1ZOQyB3b3JrcyB2ZXJ5IHdlbGwgb3ZlciBMQU4gYW5kIGV2aWRlbnRseSBmYXN0IEJyb2FkYmFuZCB0b28uCiAgIFdoZW4gdXNpbmcgaXQgd2l0aCB4MTF2bmMgaW4gc3VjaCBhIHNpdHVhdGlvbiB5b3UgbWF5IHdhbnQgdG8gZGlhbAogICBkb3duIHRoZSBkZWxheXMsIGUuZy4gIi13YWl0IDUiIGFuZCAiLWRlZmVyIDUiIChvciBldmVuIGEgc21hbGxlcgogICBzZXR0aW5nKSB0byBwb2xsIGFuZCBwdW1wIHRoaW5ncyBvdXQgbW9yZSBxdWlja2x5LgoKICAgU2VlIHRoZSBpbnN0cnVjdGlvbnMgaW4gIngxMXZuYy9taXNjL3R1cmJvdm5jL1JFQURNRSIgZm9yIGhvdyB0byBidWlsZAogICB4MTF2bmMgd2l0aCBUdXJib1ZOQyBzdXBwb3J0LiBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gZG93bmxvYWQgdGhlCiAgIFR1cmJvSlBFRyBzb2Z0d2FyZS4KCiAgIEluIGJyaWVmLCB0aGUgc3RlcHMgbG9vayBsaWtlIHRoaXM6CiAgY2QgeDExdm5jLXgueS56L3gxMXZuYy9taXNjL3R1cmJvdm5jCiAgLi9hcHBseV90dXJib3ZuYwogIGNkIC4uLy4uLy4uCiAgZW52IExERkxBR1M9Jy1ML0RJUiAtWGxpbmtlciAtLXJwYXRoPS9ESVInIC4vY29uZmlndXJlCiAgbWFrZSBBTV9MREZMQUdTPSctbHR1cmJvanBlZycKCiAgIHdoZXJlIHlvdSByZXBsYWNlICIvRElSIiB3aXRoIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyBsaWJ0dXJib2pwZWcuc28KICAgeW91IGRvd25sb2FkZWQgc2VwYXJhdGVseS4gSWYgaXQgd29ya3Mgb3V0IHdlbGwgZW5vdWdoIFR1cmJvVk5DCiAgIHN1cHBvcnQgd2lsbCBiZSBpbnRlZ3JhdGVkIGludG8geDExdm5jIGFuZCBtb3JlIG9mIGl0cyB0dW5pbmcgZmVhdHVyZXMKICAgd2lsbCBiZSBpbXBsZW1lbnRlZC4gU3VwcG9ydCBmb3IgVHVyYm9WTkMgaW4gU1NWTkMgdmlld2VyIGhhcyBiZWVuCiAgIGFkZGVkIGFzIGFuIGV4cGVyaW1lbnQgYXMgd2VsbC4gSWYgeW91IHRyeSBlaXRoZXIgb25lLCBsZXQgdXMga25vdyBob3cKICAgaXQgd2VudC4KCiAgIFRoZXJlIGFsc28gbWF5IGJlIHNvbWUgTGludXguaTY4NiBhbmQgRGFyd2luLmkzODYgeDExdm5jIGJpbmFyaWVzIHdpdGgKICAgVHVyYm9WTkMgc3VwcG9ydCBpbiB0aGUgbWlzYy4gYmlucyBkaXJlY3RvcnkuIEZvciBvdGhlciBwbGF0Zm9ybXMgeW91CiAgIHdpbGwgbmVlZCB0byBjb21waWxlIHlvdXJzZWxmLgoKICAgT24gcmVsYXRpdmVseSBjaGVhcCBhbmQgb2xkIGhhcmR3YXJlIChBbHRob242NCBYMiA1MDAwKyAvIEdlRm9yY2UKICAgNjIwMCkgeDExdm5jIGFuZCBTU1ZOQywgYm90aCBUdXJib1ZOQyBlbmFibGVkLCB3ZXJlIGFibGUgdG8gc3VzdGFpbgogICAxMy41IGZyYW1lcy9zZWMgKGZwcykgYW5kIDE1IE1lZ2FwaXhlbHMvc2VjIHVzaW5nIHRoZSBWaXJ0dWFsR0wKICAgc3VwcGxpZWQgT3BlbkdMIGJlbmNobWFyayBwcm9ncmFtIGdseHNwaGVyZXMuIFZpcnR1YWxHTCBvbiBoaWdoZXItZW5kCiAgIGhhcmR3YXJlIGNhbiBzdXN0YWluIDIwLTMwIGZwcyB3aXRoIHRoZSBnbHhzcGhlcmVzIGJlbmNobWFyay4KCiAgIFBvdGVudGlhbCBTbG93ZG93bjogQXMgd2UgZGVzY3JpYmUgZWxzZXdoZXJlLCB1bmxlc3MgeW91IHVzZSB4MTF2bmMKICAgd2l0aCBhbiBYIHNlcnZlciB1c2luZywgc2F5LCBOVmlkaWEgcHJvcHJpZXRhcnkgZHJpdmVycyAob3IgYSB2aXJ0dWFsCiAgIFggc2VydmVyIGxpa2UgWHZmYiBvciBYZHVtbXksIG9yIGluIFNoYWRvd0ZCIG1vZGUpLCB0aGVuIHRoZSByZWFkIHJhdGUKICAgZnJvbSB0aGUgZ3JhcGhpY3MgY2FyZCBjYW4gYmUgcmF0aGVyIHNsb3cgKGUuZy4gMTAgTUIvc2VjKSBhbmQgYmVjb21lcwogICB0aGUgYm90dGxlbmVjayB3aGVuIHVzaW5nIHgxMXZuYyBvdmVyIGZhc3QgbmV0d29ya3MuIE5vdGUgdGhhdCBhbGwgb2YKICAgWG9yZydzIGRyaXZlcnMgY3VycmVudGx5ICgyMDA5KSBoYXZlIHNsb3cgcmVhZCByYXRlcyAob25seSBwcm9wcmlldGFyeQogICBkcml2ZXJzIGFwcGVhciB0byBoYXZlIG9wdGltaXplZCByZWFkcy4pCgogICBTbyB1bmRlciB0aGVzZSAobW9yZSBvciBsZXNzIHR5cGljYWwpIGNvbmRpdGlvbnMsIHRoZSBzcGVlZAogICBpbXByb3ZlbWVudCBwcm92aWRlZCBieSBUdXJib1ZOQyBtYXkgb25seSBiZSBtYXJnaW5hbC4gTG9vayBmb3IgdGhpcwogICBvdXRwdXQgdG8gc2VlIHlvdXIgcmVhZCByYXRlOgogIDI4LzAyLzIwMDkgMTE6MTE6MDcgQXV0b3Byb2JpbmcgVENQIHBvcnQKICAyOC8wMi8yMDA5IDExOjExOjA3IEF1dG9wcm9iaW5nIHNlbGVjdGVkIHBvcnQgNTkwMAogIDI4LzAyLzIwMDkgMTE6MTE6MDggZmIgcmVhZCByYXRlOiAxMCBNQi9zZWMKICAyOC8wMi8yMDA5IDExOjExOjA4IHNjcmVlbiBzZXR1cCBmaW5pc2hlZC4KCiAgIEEgcmF0ZSBvZiAxMCBNQi9zZWMgbWVhbnMgYSAxMjgweDEwMjR4MjQgc2NyZWVuIHRha2VzIDAuNSBzZWNvbmRzIHRvCiAgIHJlYWQgaW4uIFR1cmJvVk5DIGNvbXByZXNzZXMgdGhhdCB0byBKUEVHIGluIGEgbXVjaCBzaG9ydGVyIHRpbWUuIE9uCiAgIHRoZSBvdGhlciBoYW5kLCBhbiBOVmlkaWEgZHJpdmVyIG1heSBoYXZlIGEgcmVhZCByYXRlIG9mIDI1MCBNQi9zZWMKICAgYW5kIHNvIG9ubHkgdGFrZXMgMC4wMiBzZWNvbmRzIHRvIHJlYWQgdGhlIGVudGlyZSBzY3JlZW4gaW4uCgoKCiAgIFtNb3VzZSBDdXJzb3IgU2hhcGVzXQoKICAgUS04MTogV2h5IGlzbid0IHRoZSBtb3VzZSBjdXJzb3Igc2hhcGUgKHRoZSBsaXR0bGUgaWNvbiBzaGFwZSB3aGVyZQogICB0aGUgbW91c2UgcG9pbnRlciBpcykgY29ycmVjdCBhcyBJIG1vdmUgZnJvbSB3aW5kb3cgdG8gd2luZG93PwoKICAgT24gWCBzZXJ2ZXJzIHN1cHBvcnRpbmcgWEZJWEVTIG9yIFNvbGFyaXMvSVJJWCBPdmVybGF5IGV4dGVuc2lvbnMgaXQKICAgaXMgcG9zc2libGUgZm9yIHgxMXZuYyB0byBkbyB0aGlzIGNvcnJlY3RseS4gU2VlIGEgZmV3IHBhcmFncmFwaHMgZG93bgogICBmb3IgdGhlIGFuc3dlci4KCiAgIEhpc3RvcmljYWxseSwgdGhlIFgxMSBtb3VzZSBjdXJzb3Igc2hhcGUgKGkuZS4gbGl0dGxlIHBpY3R1cmU6IGFuCiAgIGFycm93LCBYLCBJLWJlYW0sIHJlc2l6ZXIsIGV0YykgaXMgb25lIG9mIHRoZSBmZXcgV1JJVEUtb25seSBvYmplY3RzCiAgIGluIFgxMS4gVGhhdCBpcywgYW4gYXBwbGljYXRpb24gY2FuIHRlbGwgdGhlIFggc2VydmVyIHdoYXQgdGhlIGN1cnNvcgogICBzaGFwZSBzaG91bGQgYmUgd2hlbiB0aGUgcG9pbnRlciBpcyBpbiBhIGdpdmVuIHdpbmRvdywgYnV0IGEgcHJvZ3JhbQogICAobGlrZSB4MTF2bmMpIHVuZm9ydHVuYXRlbHkgY2Fubm90IHJlYWQgdGhpcyBpbmZvcm1hdGlvbi4gSSBiZWxpZXZlCiAgIHRoaXMgaXMgYmVjYXVzZSB0aGUgY3Vyc29yIHNoYXBlIGlzIG9mdGVuIGRvd25sb2FkZWQgdG8gdGhlIGdyYXBoaWNzCiAgIGhhcmR3YXJlICh2aWRlbyBjYXJkKSwgYnV0IEkgY291bGQgYmUgbWlzdGFrZW4uCgogICBBIHNpbXBsZSBrbHVkZ2UgaXMgcHJvdmlkZWQgYnkgdGhlICItY3Vyc29yIFgiIG9wdGlvbiB0aGF0IGNoYW5nZXMgdGhlCiAgIGN1cnNvciB3aGVuIHRoZSBtb3VzZSBpcyBvbiB0aGUgcm9vdCBiYWNrZ3JvdW5kIChvciBhbnkgd2luZG93IGhhcyB0aGUKICAgc2FtZSBjdXJzb3IgYXMgdGhlIHJvb3QgYmFja2dyb3VuZC4pIE5vdGUgdGhhdCBkZXNrdG9wcyBsaWtlIEdOT01FIG9yCiAgIEtERSBvZnRlbiBjb3ZlciB1cCB0aGUgcm9vdCBiYWNrZ3JvdW5kLCBzbyB0aGlzIHdvbid0IHdvcmsgZm9yIHRob3NlCiAgIGNhc2VzLiBBbHNvIHNlZSB0aGUgIi1jdXJzb3Igc29tZSIgb3B0aW9uIGZvciBhZGRpdGlvbmFsIGtsdWRnZXMuCgogICBOb3RlIHRoYXQgYXMgb2YgQXVnLzIwMDQgb24gU29sYXJpcyB1c2luZyB0aGUgU1VOX09WTCBvdmVybGF5CiAgIGV4dGVuc2lvbiBhbmQgSVJJWCwgeDExdm5jIGNhbiBzaG93IHRoZSBjb3JyZWN0IG1vdXNlIGN1cnNvciB3aGVuIHRoZQogICAtb3ZlcmxheSBvcHRpb24gaXMgc3VwcGxpZWQuIFNlZSB0aGlzIEZBUSBmb3IgbW9yZSBpbmZvLgoKICAgQWxzbyBhcyBvZiBEZWMvMjAwNCBYRklYRVMgWCBleHRlbnNpb24gc3VwcG9ydCBoYXMgYmVlbiBhZGRlZCB0byBhbGxvdwogICBleGFjdCBleHRyYWN0aW9uIG9mIHRoZSBtb3VzZSBjdXJzb3Igc2hhcGUuIFhGSVhFUyBmaXhlcyB0aGUgcHJvYmxlbQogICBvZiB0aGUgY3Vyc29yLXNoYXBlIGJlaW5nIHdyaXRlLW9ubHk6IHgxMXZuYyBjYW4gbm93IHF1ZXJ5IHRoZSBYCiAgIHNlcnZlciBmb3IgdGhlIGN1cnJlbnQgc2hhcGUgYW5kIHNlbmQgaXQgYmFjayB0byB0aGUgY29ubmVjdGVkCiAgIHZpZXdlcnMuIFhGSVhFUyBpcyBhdmFpbGFibGUgb24gcmVjZW50IExpbnV4IFhvcmcgYmFzZWQgZGlzdHJvcyBhbmQKICAgU29sYXJpcyAxMC4KCiAgIFRoZSBvbmx5IFhGSVhFUyBpc3N1ZSBpcyB0aGUgaGFuZGxpbmcgb2YgYWxwaGEgY2hhbm5lbCB0cmFuc3BhcmVuY3kgaW4KICAgY3Vyc29ycy4gSWYgYSBjdXJzb3IgaGFzIGFueSB0cmFuc2x1Y2VuY3kgdGhlbiBpbiBnZW5lcmFsIGl0IG11c3QgYmUKICAgYXBwcm94aW1hdGVkIHRvIG9wYXF1ZSBSR0IgdmFsdWVzIGZvciB1c2UgaW4gVk5DLiBUaGVyZSBhcmUgc29tZQogICBzaXR1YXRpb25zIHdoZXJlIHRoZSBjdXJzb3IgdHJhbnNwYXJlbmN5IGNhbiBhbHNvIGhhbmRsZWQgZXhhY3RseToKICAgd2hlbiB0aGUgVk5DIFZpZXdlciByZXF1aXJlcyB0aGUgY3Vyc29yIHNoYXBlIGJlIGRyYXduIGludG8gdGhlIFZOQwogICBmcmFtZWJ1ZmZlciBvciBpZiB5b3UgYXBwbHkgYSBwYXRjaCB0byB5b3VyIFZOQyBWaWV3ZXIgdG8gZXh0cmFjdAogICBoaWRkZW4gYWxwaGEgY2hhbm5lbCBkYXRhIHVuZGVyIDMyYnBwLiBEZXRhaWxzIGNhbiBiZSBmb3VuZCBoZXJlLgoKCiAgIFEtODI6IFdoZW4gdXNpbmcgWEZJWEVTIGN1cnNvcnNoYXBlIG1vZGUsIHNvbWUgb2YgdGhlIGN1cnNvcnMgbG9vawogICByZWFsbHkgYmFkIHdpdGggZXh0cmEgYmxhY2sgYm9yZGVycyBhcm91bmQgdGhlIGN1cnNvciBhbmQgb3RoZXIgY3J1ZnQuCiAgIEhvdyBjYW4gSSBpbXByb3ZlIHRoZWlyIGFwcGVhcmFuY2U/CgogICBUaGlzIGhhcHBlbnMgZm9yIGN1cnNvcnMgd2l0aCB0cmFuc3BhcmVuY3kgKCJhbHBoYSBjaGFubmVsIik7IHJlZ3VsYXIKICAgWCBjdXJzb3JzIChiaXRtYXBzKSBzaG91bGQgYmUgY29ycmVjdC4gVW5mb3J0dW5hdGVseSB4MTF2bmMgMC43IHdhcwogICByZWxlYXNlZCB3aXRoIGEgdmVyeSBwb29yIGFsZ29yaXRobSBmb3IgYXBwcm94aW1hdGluZyB0aGUKICAgdHJhbnNwYXJlbmN5LCB3aGljaCBsZWQgdG8gdGhlIHVnbHkgYmxhY2sgYm9yZGVycy4KCiAgIFRoZSBwcm9ibGVtIGlzIGFzIGZvbGxvd3M6IFhGSVhFUyBhbGxvd3MgeDExdm5jIHRvIHJldHJpZXZlIHRoZQogICBjdXJyZW50IFggc2VydmVyIGN1cnNvciBzaGFwZSwgaW5jbHVkaW5nIHRoZSBhbHBoYSBjaGFubmVsIGZvcgogICB0cmFuc3BhcmVuY3kuIEZvciB0cmFkaXRpb25hbCBiaXRtYXAgY3Vyc29ycyB0aGUgYWxwaGEgdmFsdWUgd2lsbCBiZSAwCiAgIGZvciBjb21wbGV0ZWx5IHRyYW5zcGFyZW50IHBpeGVscyBhbmQgMjU1IGZvciBjb21wbGV0ZWx5IG9wYXF1ZQogICBwaXhlbHM7IHdoZXJlYXMgZm9yIG1vZGVybiwgZXllLWNhbmR5IGN1cnNvcnMgYW4gYWxwaGEgdmFsdWUgYmV0d2VlbiAwCiAgIGFuZCAyNTUgbWVhbnMgdG8gYmxlbmQgaW4gdGhlIGJhY2tncm91bmQgY29sb3JzIHRvIHRoYXQgZGVncmVlIHdpdGgKICAgdGhlIGN1cnNvciBjb2xvcnMuIFRoZSBwaXhlbCBjb2xvciBibGVuZGluZyBmb3JtdWxhIGlzIHNvbWV0aGluZyBsaWtlCiAgIHRoaXM6IFJlZCA9IFJlZF9jdXJzb3IgKiBhICsgUmVkX2JhY2tncm91bmQgKiAoMSAtIGEpLCAod2hlcmUgaGVyZSAwCiAgID08IGEgPTwgMSksIHdpdGggc2ltaWxhciBmb3IgR3JlZW4gYW5kIEJsdWUuIFRoZSBWTkMgcHJvdG9jb2wgZG9lcyBub3QKICAgY3VycmVudGx5IHN1cHBvcnQgYW4gYWxwaGEgY2hhbm5lbCBpbiBjdXJzb3JzOiBpdCBvbmx5IHN1cHBvcnRzCiAgIHJlZ3VsYXIgWCBiaXRtYXAgY3Vyc29ycyBhbmQgUmljaCBDdXJzb3JzIHRoYXQgaGF2ZSBSR0IgKFJlZCwgR3JlZW4sCiAgIEJsdWUpIGNvbG9yIGRhdGEsIGJ1dCBubyAiQSIgPSBhbHBoYSBkYXRhLiBTbyBpbiBnZW5lcmFsIHgxMXZuYyBoYXMgdG8KICAgYXBwcm94aW1hdGUgYSBjdXJzb3Igd2l0aCB0cmFuc3BhcmVuY3kgdG8gY3JlYXRlIGEgUmljaCBDdXJzb3IuIFRoaXMKICAgaXMgZWFzaWVyIHNhaWQgdGhhbiBkb25lOiBzb21lIGN1cnNvciB0aGVtZXMgaGF2ZSBjdXJzb3JzIHdpdGgKICAgY29tcGxpY2F0ZWQgZHJvcCBzaGFkb3dzIGFuZCBvdGhlciBmb3JtcyBvZiB0cmFuc2x1Y2VuY3kuCgogICBBbnl3YXksIGZvciB0aGUgeDExdm5jIDAuNy4xIHJlbGVhc2UgdGhlIGFsZ29yaXRobSBmb3IgYXBwcm94aW1hdGluZwogICB0cmFuc3BhcmVuY3kgaXMgbXVjaCBpbXByb3ZlZCBhbmQgaG9wZWZ1bGx5IGdpdmVzIGRlY2VudCBjdXJzb3Igc2hhcGVzCiAgIGZvciBtb3N0IGN1cnNvciB0aGVtZXMgYW5kIHlvdSBkb24ndCBoYXZlIHRvIHdvcnJ5IGFib3V0IGl0LgoKICAgSW4gY2FzZSBpdCBzdGlsbCBsb29rcyBiYWQgZm9yIHlvdXIgY3Vyc29yIHRoZW1lLCB0aGVyZSBhcmUgKG9mCiAgIGNvdXJzZSEpIHNvbWUgdHVuYWJsZSBwYXJhbWV0ZXJzLiBUaGUgIi1hbHBoYWN1dCBuIiBvcHRpb24gbGV0cyB5b3UKICAgc2V0IHRoZSB0aHJlc2hvbGQgIm4iIChiZXR3ZWVuIDAgYW5kIDI1NSk6IGN1cnNvciBwaXhlbHMgd2l0aCBhbHBoYQogICB2YWx1ZXMgYmVsb3cgbiB3aWxsIGJlIGNvbnNpZGVyZWQgY29tcGxldGVseSB0cmFuc3BhcmVudCB3aGlsZSB2YWx1ZXMKICAgZXF1YWwgdG8gb3IgYWJvdmUgbiB3aWxsIGJlIGNvbXBsZXRlbHkgb3BhcXVlLiBUaGUgZGVmYXVsdCBpcyAyNDAuIFRoZQogICAiLWFscGhhZnJhYyBmIiBvcHRpb24gdHJpZXMgdG8gY29ycmVjdCBpbmRpdmlkdWFsIGN1cnNvcnMgdGhhdCBkaWQgbm90CiAgIGZhcmUgd2VsbCB3aXRoIHRoZSBkZWZhdWx0IC1hbHBoYWN1dCB2YWx1ZTogaWYgYSBjdXJzb3IgaGFzIGxlc3MgdGhhbgogICBmcmFjdGlvbiBmIChiZXR3ZWVuIDAuMCBhbmQgMS4wKSBvZiBpdHMgcGl4ZWxzIHNlbGVjdGVkIGJ5IHRoZSBkZWZhdWx0CiAgIC1hbHBoYWN1dCwgdGhlIHRocmVzaG9sZCBpcyBsb3dlcmVkIHVudGlsIGYgb2YgaXRzIHBpeGVscyBhcmUKICAgc2VsZWN0ZWQuIFRoZSBkZWZhdWx0IGZyYWN0aW9uIGlzIDAuMzMuCgogICBGaW5hbGx5LCB0aGVyZSBpcyBhbiBvcHRpb24gLWFscGhhcmVtb3ZlIHRoYXQgaXMgdXNlZnVsIGZvciB0aGVtZXMKICAgd2hlcmUgbWFueSBjdXJzb3JzIGFyZSBsaWdodCBjb2xvcmVkIChlLmcuICJ3aGl0ZWdsYXNzIi4pIFhGSVhFUwogICByZXR1cm5zIHRoZSBjdXJzb3IgZGF0YSB3aXRoIHRoZSBSR0IgdmFsdWVzIHByZS1tdWx0aXBsaWVkIGJ5IHRoZQogICBhbHBoYSB2YWx1ZS4gSWYgdGhlIHdoaXRlIGN1cnNvcnMgbG9vayB0b28gZ3JleSwgc3BlY2lmeSAtYWxwaGFyZW1vdmUKICAgdG8gYnJpZ2h0ZW4gdGhlbSBieSBoYXZpbmcgeDExdm5jIGRpdmlkZSBvdXQgdGhlIGFscGhhIHZhbHVlLgoKICAgT25lIHVzZXIgcGxheWVkIHdpdGggdGhlc2UgcGFyYW1ldGVycyBhbmQgcmVwb3J0ZWQgYmFjazoKIE9mIHRoZSBjdXJzb3IgdGhlbWVzIHByZXNlbnQgb24gbXkgc3lzdGVtOgoKICAgZ2VudG9vIGFuZCBnZW50b28tYmx1ZTogICBhbHBoYWN1dDoxOTIgLSBub2FscGhhcmVtb3ZlCgogICBnZW50b28tc2lsdmVyOiAgICAgICAgICAgIGFscGhhY3V0OjEyNyBhbmQgYWxwaGFyZW1vdmUKCiAgIHdoaXRlZ2xhc3MgYW5kIHJlZGdsYXNzIChwcmVzdW1hYmx5IGFsc28gaGFuZGhlbGRzLCB3aGljaCBpcyBiYXNlZAogICBoZWF2aWx5IG9uIHJlZGdsYXNzKSBsb29rIGZpbmUgd2l0aCB0aGUgYXBwYXJlbnQgZGVmYXVsdCBvZiBhbHBoYWN1dDoyNTUuCgoKICAgUS04MzogSW4gWEZJWEVTIG1vZGUsIGFyZSB0aGVyZSBhbnkgaGFja3MgdG8gaGFuZGxlIGN1cnNvcgogICB0cmFuc3BhcmVuY3kgKCJhbHBoYSBjaGFubmVsIikgZXhhY3RseT8KCiAgIEFzIG9mIEphbi8yMDA1IGxpYnZuY3NlcnZlciBoYXMgYmVlbiBtb2RpZmllZCB0byBhbGxvdyBhbiBhbHBoYQogICBjaGFubmVsIChpLmUuIFJHQkEgZGF0YSkgZm9yIFJpY2ggQ3Vyc29ycy4gU28geDExdm5jIGNhbiBub3cgc2VuZCB0aGUKICAgYWxwaGEgY2hhbm5lbCBkYXRhIHRvIGxpYnZuY3NlcnZlci4gSG93ZXZlciwgdGhpcyBkYXRhIHdpbGwgb25seSBiZQogICB1c2VkIGZvciBWTkMgY2xpZW50cyB0aGF0IGRvIG5vdCBzdXBwb3J0IHRoZSBDdXJzb3JTaGFwZVVwZGF0ZXMgVk5DCiAgIGV4dGVuc2lvbiAob3IgaGF2ZSBkaXNhYmxlZCBpdC4pIEl0IGNhbiBiZSBkaXNhYmxlZCBmb3IgYWxsIGNsaWVudHMKICAgd2l0aCB0aGUgLW5vY3Vyc29yc2hhcGUgeDExdm5jIG9wdGlvbi4gSW4gdGhpcyBjYXNlIHRoZSBjdXJzb3IgaXMKICAgZHJhd24sIGNvcnJlY3RseSBibGVuZGVkIHdpdGggdGhlIGJhY2tncm91bmQsIGludG8gdGhlIFZOQyBmcmFtZWJ1ZmZlcgogICBiZWZvcmUgYmVpbmcgc2VudCBvdXQgdG8gdGhlIGNsaWVudC4gU28gdGhlIGFscGhhIGJsZW5kaW5nIGlzIGRvbmUgb24KICAgdGhlIHgxMXZuYyBzaWRlLiBVc2UgdGhlIC1ub2FscGhhYmxlbmQgb3B0aW9uIHRvIGRpc2FibGUgdGhpcyBiZWhhdmlvcgogICAoYWx3YXlzIGFwcHJveGltYXRlIHRyYW5zcGFyZW50IGN1cnNvcnMgd2l0aCBvcGFxdWUgUkdCIHZhbHVlcy4pCgogICBUaGUgQ3Vyc29yU2hhcGVVcGRhdGVzIFZOQyBleHRlbnNpb24gY29tcGxpY2F0ZXMgbWF0dGVycyBiZWNhdXNlIHRoZQogICBjdXJzb3Igc2hhcGUgaXMgc2VudCB0byB0aGUgVk5DIHZpZXdlcnMgc3VwcG9ydGluZyBpdCwgYW5kIHRoZSB2aWV3ZXJzCiAgIGRyYXcgdGhlIGN1cnNvciBsb2NhbGx5LiBUaGlzIGltcHJvdmVzIHJlc3BvbnNlIG92ZXIgc2xvdyBsaW5rcy4gQWxwaGEKICAgY2hhbm5lbCBkYXRhIGZvciB0aGVzZSBsb2NhbGx5IGRyYXduIGN1cnNvcnMgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUKICAgVk5DIHByb3RvY29sLgoKICAgSG93ZXZlciwgaW4gdGhlIGxpYnZuY3NlcnZlciBDVlMgdGhlcmUgaXMgYSBwYXRjaCB0byB0aGUgVGlnaHRWTkMKICAgdmlld2VyIHRvIG1ha2UgdGhpcyB3b3JrIGZvciBDdXJzb3JTaGFwZVVwZGF0ZXMgdW5kZXIgc29tZQogICBjaXJjdW1zdGFuY2VzLiBUaGlzIGhhY2sgaXMgb3V0c2lkZSBvZiB0aGUgVk5DIHByb3RvY29sLiBJdCByZXF1aXJlcwogICB0aGUgc2NyZWVucyBvbiBib3RoIHNpZGVzIHRvIGJlIGRlcHRoIDI0IGF0IDMyYnBwIChpdCB1c2VzIHRoZSBleHRyYSA4CiAgIGJpdHMgdG8gc2VjcmV0bHkgaGlkZSB0aGUgY3Vyc29yIGFscGhhIGNoYW5uZWwgZGF0YS4pIE5vdCBvbmx5IGRvZXMgaXQKICAgcmVxdWlyZSBkZXB0aCAyNCBhdCAzMmJwcCwgYnV0IGl0IGFsc28gY3VycmVudGx5IHJlcXVpcmVzIHRoZSBjbGllbnQKICAgYW5kIHNlcnZlciB0byBiZSBvZiB0aGUgc2FtZSBlbmRpYW5uZXNzIChvdGhlcndpc2UgdGhlIGhpZGRlbiBhbHBoYQogICBkYXRhIGdldHMgcmVzZXQgdG8gemVybyBieSBhIGxpYnZuY3NlcnZlciB0cmFuc2xhdGlvbiBmdW5jdGlvbjsgd2UgY2FuCiAgIGZpeCB0aGlzIGF0IHNvbWUgcG9pbnQgaWYgdGhlcmUgaXMgaW50ZXJlc3QuKSBUaGUgcGF0Y2ggaXMgZm9yIHRoZQogICBUaWdodFZOQyAxLjNkZXY1IFVuaXggdm5jdmlld2VyIGFuZCBpdCBlbmFibGVzIHRoZSBUaWdodFZOQyB2aWV3ZXIgdG8KICAgZG8gdGhlIGN1cnNvciBhbHBoYSBibGVuZGluZyBsb2NhbGx5LiBUaGUgcGF0Y2ggY29kZSBzaG91bGQgZ2l2ZSBhbgogICBleGFtcGxlIG9uIGhvdyB0byBjaGFuZ2UgdGhlIFdpbmRvd3MgVGlnaHRWTkMgdmlld2VyIHRvIGFjaGlldmUgdGhlCiAgIHNhbWUgdGhpbmcgKHNlbmQgbWUgdGhlIHBhdGNoIGlmIHlvdSBnZXQgdGhhdCB3b3JraW5nLikKCiAgIFRoaXMgcGF0Y2ggaXMgYXBwbGllZCB0byB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgcGFja2FnZQogICB3ZSBwcm92aWRlLgoKICAgW01vdXNlIFBvaW50ZXJdCgogICBRLTg0OiBXaHkgZG9lcyB0aGUgbW91c2UgYXJyb3cganVzdCBzdGF5IGluIG9uZSBjb3JuZXIgaW4gbXkKICAgdm5jdmlld2VyLCB3aGVyZWFzIG15IGN1cnNvciAodGhhdCBkb2VzIG1vdmUpIGlzIGp1c3QgYSBkb3Q/CgogICBUaGlzIGRlZmF1bHQgdGFrZXMgYWR2YW50YWdlIG9mIGEgdGlnaHR2bmMgZXh0ZW5zaW9uCiAgIChDdXJzb3JTaGFwZVVwZGF0ZXMpIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgYSBjdXJzb3IgaW1hZ2Ugc2hhcGUgZm9yCiAgIHRoZSBsb2NhbCBWTkMgdmlld2VyLiBZb3UgbWF5IGRpc2FibGUgaXQgd2l0aCB0aGUgLW5vY3Vyc29yIG9wdGlvbiB0bwogICB4MTF2bmMgaWYgeW91ciB2aWV3ZXIgZG9lcyBub3QgaGF2ZSB0aGlzIGV4dGVuc2lvbi4KCiAgIE5vdGU6IGFzIG9mIEF1Zy8yMDA0IHRoaXMgc2hvdWxkIGJlIGZpeGVkOiB0aGUgZGVmYXVsdCBmb3IKICAgbm9uLXRpZ2h0dm5jIHZpZXdlcnMgKG9yIG9uZXMgdGhhdCBkbyBub3Qgc3VwcG9ydCBDdXJzb3JTaGFwZVVwZGF0ZXMpCiAgIHdpbGwgYmUgdG8gZHJhdyB0aGUgbW92aW5nIGN1cnNvciBpbnRvIHRoZSB4MTF2bmMgZnJhbWVidWZmZXIuIFRoaXMKICAgY2FuIGFsc28gYmUgZGlzYWJsZWQgdmlhIC1ub2N1cnNvci4KCgogICBRLTg1OiBDYW4gSSB0YWtlIGFkdmFudGFnZSBvZiB0aGUgVGlnaHRWTkMgZXh0ZW5zaW9uIHRvIHRoZSBWTkMKICAgcHJvdG9jb2wgd2hlcmUgQ3Vyc29yIFBvc2l0aW9ucyBVcGRhdGVzIGFyZSBzZW50IGJhY2sgdG8gYWxsIGNvbm5lY3RlZAogICBjbGllbnRzIChpLmUuIHBhc3NpdmUgdmlld2VycyBjYW4gc2VlIHRoZSBtb3VzZSBjdXJzb3IgYmVpbmcgbW92ZWQKICAgYXJvdW5kIGJ5IGFub3RoZXIgdmlld2VyKT8KCiAgIFVzZSB0aGUgLWN1cnNvcnBvcyBvcHRpb24gd2hlbiBzdGFydGluZyB4MTF2bmMuIEEgVk5DIHZpZXdlciBtdXN0CiAgIHN1cHBvcnQgdGhlIEN1cnNvciBQb3NpdGlvbnMgVXBkYXRlcyBmb3IgdGhlIHVzZXIgdG8gc2VlIHRoZSBtb3VzZQogICBtb3Rpb25zICh0aGUgVGlnaHRWTkMgdmlld2VycyBzdXBwb3J0IHRoaXMuKSBBcyBvZiBBdWcvMjAwNCAtY3Vyc29ycG9zCiAgIGlzIHRoZSBkZWZhdWx0LiBTZWUgYWxzbyAtbm9jdXJzb3Jwb3MgYW5kIC1ub2N1cnNvcnNoYXBlLgoKCiAgIFEtODY6IElzIGl0IHBvc3NpYmxlIHRvIHN3YXAgdGhlIG1vdXNlIGJ1dHRvbnMgKGUuZy4gbGVmdC1oYW5kZWQKICAgb3BlcmF0aW9uKSwgb3IgYXJiaXRyYXJpbHkgcmVtYXAgdGhlbT8gSG93IGFib3V0IG1hcHBpbmcgYnV0dG9uIGNsaWNrcwogICB0byBrZXlzdHJva2VzLCBlLmcuIHRvIHBhcnRpYWxseSBlbXVsYXRlIE1vdXNlIHdoZWVsIHNjcm9sbGluZz8KCiAgIFlvdSBjYW4gcmVtYXAgdGhlIG1vdXNlIGJ1dHRvbnMgdmlhIHNvbWV0aGluZyBsaWtlOiAtYnV0dG9ubWFwIDEzLTMxCiAgIChvciBwZXJoYXBzIDEyLTIxLikgQWxzbywgbm90ZSB0aGF0IHhtb2RtYXAoMSkgbGV0cyB5b3UgZGlyZWN0bHkKICAgYWRqdXN0IHRoZSBYIHNlcnZlcidzIGJ1dHRvbiBtYXBwaW5ncywgYnV0IGluIHNvbWUgY2lyY3Vtc3RhbmNlcyBpdAogICBtaWdodCBiZSBtb3JlIGRlc2lyYWJsZSB0byBoYXZlIHgxMXZuYyBkbyBpdC4KCiAgIE9uZSB1c2VyIGhhZCBhbiBYIHNlcnZlciB3aXRoIG9ubHkgb25lIG1vdXNlIGJ1dHRvbighKSBhbmQgd2FzIGFibGUgdG8KICAgbWFwIGFsbCBvZiB0aGUgVk5DIGNsaWVudCBtb3VzZSBidXR0b25zIHRvIGl0IHZpYTogLWJ1dHRvbm1hcCAxMjMtMTExLgoKICAgTm90ZSB0aGF0IHRoZSAtZGVidWdfcG9pbnRlciBvcHRpb24gcHJpbnRzIG91dCBtdWNoIGluZm8gZm9yIGV2ZXJ5CiAgIG1vdXNlL3BvaW50ZXIgZXZlbnQgYW5kIGlzIGhhbmR5IGluIHNvbHZpbmcgcHJvYmxlbXMuCgogICBUbyBtYXAgbW91c2UgYnV0dG9uIGNsaWNrcyB0byBrZXlzdHJva2VzIHlvdSBjYW4gdXNlIHRoZSBhbHRlcm5hdGUKICAgZm9ybWF0IHdoZXJlIHRoZSBrZXlzdHJva2VzIGFyZSBlbmNsb3NlZCBiZXR3ZWVuIGNvbG9ucyBsaWtlIHRoaXMKICAgOjxLZXlTeW0+OiBpbiBwbGFjZSBvZiB0aGUgbW91c2UgYnV0dG9uIGRpZ2l0LiBGb3IgYSBzZXF1ZW5jZSBvZgogICBrZXlzeW1zIHNlcGFyYXRlIHRoZW0gd2l0aCAiKyIgc2lnbnMuIExvb2sgaW4gdGhlIGluY2x1ZGUgZmlsZQogICA8WDExL2tleXN5bWRlZi5oPiwgb3IgdXNlIHhldigxKSwgb3IgLWRlYnVnX2tleWJvYXJkIHRvIGZpbmQgdGhlCiAgIGtleXN5bSBuYW1lcy4gQnV0dG9uIGNsaWNrcyBjYW4gYWxzbyBiZSBpbmNsdWRlZCBpbiB0aGUgc2VxdWVuY2UgdmlhCiAgIHRoZSBmYWtlIGtleXN5bXMgQnV0dG9uMSwgZXRjLgoKICAgQXMgYW4gZXhhbXBsZSwgc3VwcG9zZSB0aGUgVk5DIHZpZXdlciBtYWNoaW5lIGhhcyBhIG1vdXNlIHdoZWVsICh0aGVzZQogICBnZW5lcmF0ZSBidXR0b24gNCBhbmQgNSBldmVudHMpLCBidXQgdGhlIG1hY2hpbmUgdGhhdCB4MTF2bmMgaXMgcnVuIG9uCiAgIG9ubHkgaGFzIHRoZSAzIHJlZ3VsYXIgYnV0dG9ucy4gSW4gbm9ybWFsIG9wZXJhdGlvbiB4MTF2bmMgd2lsbAogICBkaXNjYXJkIHRoZSBidXR0b24gNCBhbmQgNSBldmVudHMuIEhvd2V2ZXIsIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nCiAgIGJ1dHRvbiBtYXBzIGNvdWxkIHBvc3NpYmx5IGJlIG9mIHVzZSBlbXVsYXRpbmcgdGhlIG1vdXNlIHdoZWVsIGV2ZW50cwogICBpbiB0aGlzIGNhc2U6CiAgLWJ1dHRvbm1hcCAxMjM0NS0xMjM6UHJpb3I6Ok5leHQ6CiAgLWJ1dHRvbm1hcCAxMjM0NS0xMjM6VXArVXArVXA6OkRvd24rRG93bitEb3duOgoKICAgRXhhY3RseSB3aGF0IGtleXN0cm9rZSAic2Nyb2xsaW5nIiBldmVudHMgdGhleSBzaG91bGQgYmUgYm91bmQgdG8KICAgZGVwZW5kcyBvbiBvbmUncyB0YXN0ZS4gSWYgdGhpcyBtZXRob2QgaXMgdG9vIGFwcHJveGltYXRlLCBvbmUgY291bGQKICAgY29uc2lkZXIgbm90IHVzaW5nIC1idXR0b25tYXAgYnV0IHJhdGhlciBjb25maWd1cmluZyB0aGUgWCBzZXJ2ZXIgdG8KICAgdGhpbmsgaXQgaGFzIGEgbW91c2Ugd2l0aCA1IGJ1dHRvbnMgZXZlbiB0aG91Z2ggdGhlIHBoeXNpY2FsIG1vdXNlCiAgIGRvZXMgbm90LiAoZS5nLiAnT3B0aW9uICJaQXhpc01hcHBpbmciICI0IDUiJy4pCgogICBOb3RlIHRoYXQgd2hlbiBhIGtleXN5bS1tYXBwZWQgbW91c2UgYnV0dG9uIGlzIGNsaWNrZWQgZG93biB0aGlzCiAgIGltbWVkaWF0ZWx5IGdlbmVyYXRlcyB0aGUga2V5LXByZXNzIGFuZCBrZXktcmVsZWFzZSBldmVudHMgKGZvciBlYWNoCiAgIGtleXN5bSBpbiB0dXJuIGlmIHRoZSBtYXBwaW5nIGhhcyBhIHNlcXVlbmNlIG9mIGtleXN5bXMuKSBXaGVuIHRoZQogICBtb3VzZSBidXR0b24gZ29lcyBiYWNrIHVwIG5vdGhpbmcgaXMgZ2VuZXJhdGVkLgoKICAgSWYgeW91IGluY2x1ZGUgbW9kaWZpZXIga2V5cyBsaWtlIFNoaWZ0X0wgaW5zdGVhZCBvZiBrZXktcHJlc3MKICAgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkga2V5LXJlbGVhc2UgdGhlIHN0YXRlIG9mIHRoZSBtb2RpZmllciBrZXkgaXMKICAgdG9nZ2xlZCAoaG93ZXZlciB0aGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgbW9kaWZpZXIga2V5IGlzIGlnbm9yZWQuKSBTbwogICB0byBtYXAgdGhlIHJpZ2h0IGJ1dHRvbiB0byB0eXBlIG15IG5hbWUgJ0thcmwgUnVuZ2UnIEkgY291bGQgdXNlIHRoaXM6CiAgLWJ1dHRvbm1hcCAzLTpTaGlmdF9MK2srU2hpZnRfTCthK3IrbCtzcGFjZStTaGlmdF9MK3IrU2hpZnRfTCt1K24rZytlOgoKICAgKHllcywgdGhpcyBpcyBnZXR0aW5nIGEgbGl0dGxlIHNpbGx5LikKCiAgIEJUVywgQ29taW5nIHRoZSBvdGhlciB3YXkgYXJvdW5kLCBpZiB0aGUgbWFjaGluZSB5b3UgYXJlIHNpdHRpbmcgYXQKICAgZG9lcyBub3QgaGF2ZSBhIG1vdXNlIHdoZWVsLCBidXQgdGhlIHJlbW90ZSBtYWNoaW5lIGRvZXMgKG9yIGF0IGxlYXN0CiAgIGhhcyA1IGJ1dHRvbnMgY29uZmlndXJlZCksIHRoaXMga2V5IHJlbWFwcGluZyBjYW4gYmUgdXNlZnVsOgogIC1yZW1hcCBTdXBlcl9SLUJ1dHRvbjQsTWVudS1CdXR0b241CgogICB5b3UganVzdCB0YXAgdGhvc2UgdHdvIGtleXMgdG8gZ2V0IHRoZSBtb3VzZSB3aGVlbCBzY3JvbGxzICh0aGlzIGlzCiAgIG1vcmUgdXNlZnVsIHRoYW4gdGhlIFVwIGFuZCBEb3duIGFycm93IGtleXMgYmVjYXVzZSBhIG1vdXNlIHdoZWVsCiAgICJjbGljayIgdXN1YWxseSBnaXZlcyBhIG11bHRpLWxpbmUgc2Nyb2xsLikKICAgW0tleWJvYXJkIElzc3Vlc10KCiAgIFEtODc6IEhvdyBjYW4gSSBnZXQgbXkgQWx0R3IgYW5kIFNoaWZ0IG1vZGlmaWVycyB0byB3b3JrIGJldHdlZW4KICAga2V5Ym9hcmRzIGZvciBkaWZmZXJlbnQgbGFuZ3VhZ2VzPwoKICAgVGhlIG9wdGlvbiAtbW9kdHdlYWsgc2hvdWxkIGhlbHAgaGVyZS4gSXQgaXMgYSBtb2RlIHRoYXQgbW9uaXRvcnMgdGhlCiAgIHN0YXRlIG9mIHRoZSBTaGlmdCBhbmQgQWx0R3IgTW9kaWZpZXJzIGFuZCB0cmllcyB0byBkZWR1Y2UgdGhlIGNvcnJlY3QKICAga2V5Y29kZSB0byBzZW5kLCBwb3NzaWJseSBieSBzZW5kaW5nIGZha2UgbW9kaWZpZXIga2V5IHByZXNzZXMgYW5kCiAgIHJlbGVhc2VzIGluIGFkZGl0aW9uIHRvIHRoZSBhY3R1YWwga2V5c3Ryb2tlLgoKICAgVXBkYXRlOiAgQXMgb2YgSnVsLzIwMDQgLW1vZHR3ZWFrIGlzIG5vdyB0aGUgZGVmYXVsdCAodXNlIC1ub21vZHR3ZWFrCiAgIHRvIGdldCB0aGUgb2xkIGJlaGF2aW9yLikgVGhpcyB3YXMgZG9uZSBiZWNhdXNlIGl0IHdhcyBub3RpY2VkIG9uCiAgIG5ld2VyIFhGcmVlODYgc2V0dXBzIGV2ZW4gb24gYmxhbmQgInVzIiBrZXlib2FyZHMgbGlrZSAicGMxMDQgdXMiCiAgIFhGcmVlODYgaW5jbHVkZWQgYSAiZ2hvc3QiIGtleSB3aXRoIGJvdGggIjwiIGFuZCAiPiIgaXQuIFRoaXMga2V5IGRvZXMKICAgbm90IGV4aXN0IG9uIHRoZSBrZXlib2FyZCAoc2VlIHRoaXMgRkFRIGZvciBtb3JlIGluZm8uKSBXaXRob3V0CiAgIC1tb2R0d2VhayB0aGVyZSB3YXMgdGhlbiBhbiBhbWJpZ3VpdHkgaW4gdGhlIHJldmVyc2UgbWFwIGtleXN5bSA9PgogICBrZXljb2RlLCBtYWtpbmcgaXQgc28gdGhlICI8IiBzeW1ib2wgY291bGQgbm90IGJlIHR5cGVkLgoKICAgQWxzbyBzZWUgdGhlIEZBUSBhYm91dCB0aGUgLXhrYiBvcHRpb24gZm9yIGEgbW9yZSBwb3dlcmZ1bCBtZXRob2Qgb2YKICAgbW9kaWZpZXIgdHdlYWtpbmcgZm9yIHVzZSBvbiBYIHNlcnZlcnMgd2l0aCB0aGUgWEtFWUJPQVJEIGV4dGVuc2lvbi4KCiAgIFdoZW4gdHJ5aW5nIHRvIHJlc29sdmUga2V5Ym9hcmQgbWFwcGluZyBwcm9ibGVtcywgbm90ZSB0aGF0IHRoZQogICAtZGVidWdfa2V5Ym9hcmQgb3B0aW9uIHByaW50cyBvdXQgbXVjaCBpbmZvIGZvciBldmVyeSBrZXlzdHJva2UgYW5kIHNvCiAgIGNhbiBiZSB1c2VmdWwgZGVidWdnaW5nIHRoaW5ncy4KCiAgIE5vdGUgdGhhdCBvbmUgdXNlciBoYWQgYSBzdHJhbmdlIHNldHVwIGFuZCBub25lIG9mIHRoZSBhYm92ZSBoZWxwZWQuCiAgIEhpcyBzb2x1dGlvbiB3YXMgdG8gZGlzYWJsZSBhbGwgb2YgdGhlIGFib3ZlIGFuZCB1c2UgLW5vbW9kdHdlYWsuIFRoaXMKICAgaXMgdGhlIHNpbXBsZXN0IGZvcm0gb2Yga2V5c3Ryb2tlIGluc2VydGlvbiBhbmQgaXQgYWN0dWFsbHkgc29sdmVkIHRoZQogICBwcm9ibGVtLiBUcnkgaXQgaWYgdGhlIG90aGVyIG9wdGlvbnMgZG9uJ3QgaGVscC4KCgogICBRLTg4OiBXaGVuIEkgdHJ5IHRvIHR5cGUgYSAiPCIgKGkuZS4gbGVzcyB0aGFuKSBpbnN0ZWFkIEkgZ2V0ICI+IgogICAoaS5lLiBncmVhdGVyIHRoYW4pISBTdHJhbmdlbHksIHR5cGluZyAiPiIgd29ya3MgT0shIQoKICAgRG9lcyB5b3VyIGtleWJvYXJkIGhhdmUgYSBzaW5nbGUga2V5IHdpdGggYm90aCAiPCIgYW5kICI+IiBvbiBpdD8gRXZlbgogICBpZiBpdCBkb2Vzbid0LCB5b3VyIFggc2VydmVyIG1heSB0aGluayB5b3VyIGtleWJvYXJkIGhhcyBzdWNoIGEga2V5CiAgIChlLmcuIHBjMTA1IGluIHRoZSBYRjg2Q29uZmlnIGZpbGUgd2hlbiBpdCBzaG91bGQgYmUgc29tZXRoaW5nIGVsc2UsCiAgIHNheSBwYzEwNC4pCgogICBTaG9ydCBDdXQ6IFRyeSB0aGUgLXhrYiBvciAtc2xvcHB5X2tleXMgb3B0aW9ucyBhbmQgc2VlIGlmIHRoYXQgaGVscHMKICAgdGhlIHNpdHVhdGlvbi4gVGhlIGRpc2N1c3Npb24gYmVsb3cgaXMgYSBiaXQgb3V0ZGF0ZWQgKGUuZy4gLW1vZHR3ZWFrCiAgIGlzIG5vdyB0aGUgZGVmYXVsdCkgYnV0IGl0IGlzIHVzZWZ1bCByZWZlcmVuY2UgZm9yIHZhcmlvdXMgdHJpY2tzIGFuZAogICBzbyBpcyBrZXB0LgoKCiAgIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCBvbiB0aGUgWHNlcnZlciB3aGVyZSB4MTF2bmMgaXMgcnVuIHRoZXJlIGFyZQogICB0d28ga2V5Y29kZXMgdGhhdCBjb3JyZXNwb25kIHRvIHRoZSAiPCIga2V5c3ltLiBSdW4gc29tZXRoaW5nIGxpa2UKICAgdGhpcyB0byBzZWU6CgogIHhtb2RtYXAgLXBrIHwgZWdyZXAgLWkgJ0tleUNvZGV8bGVzc3xncmVhdGVyJwogIFRoZXJlIGFyZSA0IEtleVN5bXMgcGVyIEtleUNvZGU7IEtleUNvZGVzIHJhbmdlIGZyb20gOCB0byAyNTUuCiAgICAgIEtleUNvZGUgICAgIEtleXN5bSAoS2V5c3ltKSAuLi4KICAgICAgIDU5ICAgICAgICAgMHgwMDJjIChjb21tYSkgIDB4MDAzYyAobGVzcykKICAgICAgIDYwICAgICAgICAgMHgwMDJlIChwZXJpb2QpIDB4MDAzZSAoZ3JlYXRlcikKICAgICAgIDk0ICAgICAgICAgMHgwMDNjIChsZXNzKSAgIDB4MDAzZSAoZ3JlYXRlcikKCiAgIFRoYXQga2V5Y29kZSA5NCBpcyB0aGUgc3BlY2lhbCBrZXkgd2l0aCBib3RoICI8IiBhbmQgIj4iLiBXaGVuIHgxMXZuYwogICByZWNlaXZlcyB0aGUgIjwiIGtleXN5bSBvdmVyIHRoZSB3aXJlIGZyb20gdGhlIHJlbW90ZSBWTkMgY2xpZW50LCBpdAogICB1bmZvcnR1bmF0ZWx5IG1hcHMgaXQgdG8ga2V5Y29kZSA5NCBpbnN0ZWFkIG9mIDU5LCBhbmQgc2VuZHMgOTQgdG8gdGhlCiAgIFggc2VydmVyLiBTaW5jZSBTaGlmdCBpcyBkb3duIChpLmUuIHlvdSBhcmUgU2hpZnRpbmcgdGhlIGNvbW1hIGtleSksCiAgIHRoZSBYIHNlcnZlciBpbnRlcnByZXRzIHRoaXMgYXMgU2hpZnRlZC05NCwgd2hpY2ggaXMgIj4iLgoKICAgQSB3b3JrYXJvdW5kIGluIHRoZSBYIHNlcnZlciBjb25maWd1cmF0aW9uIGlzIHRvICJkZWFkZW4iIHRoYXQgc3BlY2lhbAogICBrZXk6CgogIHhtb2RtYXAgLWUgImtleWNvZGUgOTQgPSAiCgogICBIb3dldmVyLCBvbmUgdXNlciBzYWlkIGhlIGhhZCB0byBkbyB0aGlzOgoKICB4bW9kbWFwIC1lICJrZXljb2RlIDk0ID0gMHgwMDJjIDB4MDAzYyIKCiAgIChJZiB0aGUgbnVtZXJpY2FsIHZhbHVlcyBhcmUgZGlmZmVyZW50IGZvciB5b3VyIHNldHVwLCBzdWJzdGl0dXRlIHRoZQogICBvbmVzIHRoYXQgY29ycmVzcG9uZCB0byB5b3VyIGRpc3BsYXkuIFRoZSBhYm92ZSB4bW9kbWFwIHNjaGVtZSBjYW4KICAgb2Z0ZW4gYmUgdXNlZCB0byB3b3JrIGFyb3VuZCBvdGhlciBhbWJpZ3VvdXMga2V5c3ltIHRvIGtleWNvZGUKICAgbWFwcGluZ3MuKQoKICAgQWx0ZXJuYXRpdmVseSwgaGVyZSBhcmUgc29tZSB4MTF2bmMgb3B0aW9ucyB0byB0cnkgdG8gd29yayBhcm91bmQgdGhlCiAgIHByb2JsZW06CiAgIC1tb2R0d2VhawoKICAgYW5kCiAgIC1yZW1hcCBsZXNzLWNvbW1hCgogICBUaGVzZSBhcmUgY29udmVuaWVudCBpbiB0aGF0IHRoZXkgZG8gbm90IG1vZGlmeSB0aGUgYWN0dWFsIFggc2VydmVyCiAgIHNldHRpbmdzLiBUaGUgZm9ybWVyICgtbW9kdHdlYWspIGlzIGEgbW9kZSB0aGF0IG1vbml0b3JzIHRoZSBzdGF0ZSBvZgogICB0aGUgU2hpZnQgYW5kIEFsdEdyIG1vZGlmaWVycyBhbmQgdHJpZXMgdG8gZGVkdWNlIHRoZSBjb3JyZWN0IGtleWNvZGUKICAgc2VxdWVuY2UgdG8gc2VuZC4gU2luY2UgSnVsLzIwMDQgLW1vZHR3ZWFrIGlzIG5vdyB0aGUgZGVmYXVsdC4gVGhlCiAgIGxhdHRlciAoLXJlbWFwIGxlc3MtY29tbWEpIGlzIGFuIGltbWVkaWF0ZSByZW1hcHBpbmcgb2YgdGhlIGtleXN5bQogICBsZXNzIHRvIHRoZSBrZXlzeW0gY29tbWEgd2hlbiBpdCBjb21lcyBpbiBmcm9tIGEgY2xpZW50IChzbyB3aGVuIFNoaWZ0CiAgIGlzIGRvd24gdGhlIGNvbW1hIHByZXNzIHdpbGwgeWllbGQgIjwiLikKCiAgIFNlZSBhbHNvIHRoZSBGQVEgYWJvdXQgdGhlIC14a2Igb3B0aW9uIGFzIGEgcG9zc2libGUgd29ya2Fyb3VuZCB1c2luZwogICB0aGUgWEtFWUJPQVJEIGV4dGVuc2lvbi4KCiAgIE5vdGUgdGhhdCB0aGUgLWRlYnVnX2tleWJvYXJkIG9wdGlvbiBwcmludHMgb3V0IG11Y2ggaW5mbyBmb3IgZXZlcnkKICAga2V5c3Ryb2tlIHRvIGFpZCBkZWJ1Z2dpbmcga2V5Ym9hcmQgcHJvYmxlbXMuCgoKICAgUS04OTogRXh0cmEgQ2hhcmFjdGVyIEluc2VydGVkLCBFLmcuOiBXaGVuIEkgdHJ5IHRvIHR5cGUgYSAiPCIgKGkuZS4KICAgbGVzcyB0aGFuKSBpbnN0ZWFkIEkgZ2V0ICI8LCIgKGkuZS4gYW4gZXh0cmEgY29tbWEuKQoKICAgVGhpcyBpcyBsaWtlbHkgYmVjYXVzZSB5b3UgcHJlc3MgIlNoaWZ0IiB0aGVuICI8IiBidXQgdGhlbiByZWxlYXNlZAogICB0aGUgU2hpZnQga2V5IGJlZm9yZSByZWxlYXNpbmcgdGhlICI8Ii4gQmVjYXVzZSBvZiBhIGtleW1hcHBpbmcKICAgYW1iaWd1aXR5IHRoZSBsYXN0IGV2ZW50ICI8IHVwIiBpcyBpbnRlcnByZXRlZCBhcyAiLCIgYmVjYXVzZSB0aGF0IGtleQogICB1bnNoaWZ0ZWQgaXMgdGhlIGNvbW1hLgoKICAgVGhpcyBleHRyYSBjaGFyYWN0ZXIgaW5zZXJ0aW9uIHdpbGwgaGFwcGVuIGZvciBvdGhlciBjb21iaW5hdGlvbnMgb2YKICAgY2hhcmFjdGVyczogaW4gZ2VuZXJhbCBpdCBjYW4gaGFwcGVuIHdoZW5ldmVyIHRoZSBTaGlmdCBrZXkgaXMKICAgcmVsZWFzZWQgZWFybHkuCgogICBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGluIC14a2IgbW9kZSwgYmVjYXVzZSBpdCB3b3JrcyBoYXJkIHRvIHJlc29sdmUKICAgdGhlIGFtYmlndWl0aWVzLiBJZiB5b3UgZG8gbm90IHdhbnQgdG8gdXNlIC14a2IsIHRyeSB0aGUgb3B0aW9uCiAgIC1zbG9wcHlfa2V5cyB0byBhdHRlbXB0IGEgc2ltaWxhciB0eXBlIG9mIGFsZ29yaXRobS4KCiAgIE9uZSB1c2VyIGhhZCB0aGlzIHByb2JsZW0gZm9yIEl0YWxpYW4gYW5kIEdlcm1hbiBrZXlib2FyZHMgd2l0aCB0aGUKICAga2V5IGNvbnRhaW5pbmcgIjoiIGFuZCAiLiIgV2hlbiBoZSB0eXBlZCAiOiIgaGUgd291bGQgZ2V0IGFuIGV4dHJhICIuIgogICBpbnNlcnRlZCBhZnRlciB0aGUgIjoiLiBUaGUgc29sdXRpb24gd2FzIC1zbG9wcHlfa2V5cy4KCgogICBRLTkwOiBJJ20gdXNpbmcgYW4gImludGVybmF0aW9uYWwiIGtleWJvYXJkIChlLmcuIEdlcm1hbiAiZGUiLCBvcgogICBEYW5pc2ggImRrIikgYW5kIHRoZSAtbW9kdHdlYWsgbW9kZSB3b3JrcyB3ZWxsIGlmIHRoZSBWTkMgdmlld2VyIGlzCiAgIHJ1biBvbiBhIFVuaXgvTGludXggbWFjaGluZSB3aXRoIGEgc2ltaWxhciBrZXlib2FyZC4gICBCdXQgaWYgSSBydW4KICAgdGhlIFZOQyB2aWV3ZXIgb24gVW5peC9MaW51eCB3aXRoIGEgZGlmZmVyZW50IGtleWJvYXJkIChlLmcuICJ1cyIpIG9yCiAgIFdpbmRvd3Mgd2l0aCBhbnkga2V5Ym9hcmQsIEkgY2FuJ3QgdHlwZSBzb21lIGtleXMgbGlrZTogICAiQCIsICIkIiwKICAgIjwiLCAiPiIsIGV0Yy4gSG93IGNhbiBJIGZpeCB0aGlzPwoKICAgVGhlIHByb2JsZW0gd2l0aCBXaW5kb3dzIGlzIGl0IGRvZXMgbm90IHNlZW0gdG8gaGFuZGxlIEFsdEdyIHdlbGwuIEl0CiAgIHNlZW1zIHRvIGZha2UgaXQgdXAgYnkgc2VuZGluZyBDb250cm9sX0wrQWx0X1IgdG8gYXBwbGljYXRpb25zLiBUaGUKICAgV2luZG93cyBWTkMgdmlld2VyIHNlbmRzIHRob3NlIHR3byBkb3duIGtleXN0cm9rZXMgb3V0IG9uIHRoZSB3aXJlIHRvCiAgIHRoZSBWTkMgc2VydmVyLCBidXQgd2hlbiB0aGUgdXNlciB0eXBlcyB0aGUgbmV4dCBrZXkgdG8gZ2V0LCBlLmcuLCAiQCIKICAgdGhlIFdpbmRvd3MgVk5DIHZpZXdlciBzZW5kcyBldmVudHMgYnJpbmdpbmcgdGhlIHVwIHRoZQogICBDb250cm9sX0wrQWx0X1Iga2V5cywgYW5kIHRoZW4gc2VuZHMgdGhlICJAIiBrZXlzeW0gYnkgaXRzZWxmLgoKICAgVGhlIFVuaXgvTGludXggVk5DIHZpZXdlciBvbiBhICJ1cyIga2V5Ym9hcmQgZG9lcyBhIHNpbWlsYXIgdGhpbmcKICAgc2luY2UgIkAiIGlzIHRoZSBTaGlmdCBvZiB0aGUgIjIiIGtleS4gVGhlIGtleXN5bXMgU2hpZnQgYW5kICJAIiBhcmUKICAgc2VudCB0byB0aGUgVk5DIHNlcnZlci4KCiAgIEluIGJvdGggY2FzZXMgbm8gQWx0R3IgaXMgc2VudCB0byB0aGUgVk5DIHNlcnZlciwgYnV0IHdlIGtub3cgQWx0R3IgaXMKICAgbmVlZGVkIG9uIHRoZSBwaHlzaWNhbCBpbnRlcm5hdGlvbmFsIGtleWJvYXJkIHRvIHR5cGUgYSAiQCIuCgogICBUaGlzIGFsbCB3b3JrZWQgZmluZSB3aXRoIHgxMXZuYyBydW5uaW5nIHdpdGggdGhlIC1tb2R0d2VhayBvcHRpb24gKGl0CiAgIGZpZ3VyZXMgb3V0IGhvdyB0byBhZGp1c3QgdGhlIE1vZGlmaWVyIGtleXMgKFNoaWZ0IG9yIEFsdEdyKSB0byBnZXQKICAgdGhlICJAIi4pIEhvd2V2ZXIgaXQgZmFpbHMgdW5kZXIgcmVjZW50IHZlcnNpb25zIG9mIFhGcmVlODYgKGFuZCB0aGUKICAgWC5vcmcgZm9yay4pIFRoZXNlIHJ1biB0aGUgWEtFWUJPQVJEIGV4dGVuc2lvbiBieSBkZWZhdWx0IGFuZCBtYWtlCiAgIGhlYXZ5IHVzZSBvZiBpdCB0byBoYW5kbGUgaW50ZXJuYXRpb25hbCBrZXlib2FyZHMuCgogICBUbyBtYWtlIGEgbG9uZyBzdG9yeSBzaG9ydCwgb24gdGhlc2UgbmV3ZXIgWEZyZWU4NiBzZXR1cHMgdGhlCiAgIHRyYWRpdGlvbmFsIFgga2V5bWFwIGxvb2t1cCB4MTF2bmMgdXNlcyBpcyBubyBsb25nZXIgYWNjdXJhdGUuIHgxMXZuYwogICBjYW4ndCBmaW5kIHRoZSBrZXlzeW0gIkAiIGFueXdoZXJlIGluIHRoZSBrZXltYXBwaW5nISAoZXZlbiB0aG91Z2ggaXQKICAgaXMgaW4gdGhlIFhLRVlCT0FSRCBleHRlbmRlZCBrZXltYXBwaW5nLikKCiAgIEhvdyB0byBTb2x2ZTogQXMgb2YgSnVsLzIwMDQgeDExdm5jIGhhcyB0d28gY2hhbmdlczoKICAgICAqIC1tb2R0d2VhayAodHdlYWsgTW9kaWZpZXIga2V5cykgaXMgbm93IHRoZSBkZWZhdWx0ICh1c2UKICAgICAgIC1ub21vZHR3ZWFrIHRvIGdvIGJhY2sgdG8gdGhlIG9sZCB3YXkpCiAgICAgKiB0aGVyZSBpcyBhIG5ldyBvcHRpb24gLXhrYiB0byB1c2UgdGhlIFhLRVlCT0FSRCBleHRlbnNpb24gQVBJIHRvCiAgICAgICBkbyB0aGUgTW9kaWZpZXIga2V5IHR3ZWFraW5nLgoKICAgVGhlIC14a2Igb3B0aW9uIHNlZW1zIHRvIGZpeCBhbGwgb2YgdGhlIG1pc3Npbmcga2V5czogIkAiLCAiPCIsICI+IiwKICAgZXRjLjogaXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdHJ5IGl0IGlmIHlvdSBoYXZlIHRoaXMgc29ydCBvZgogICBwcm9ibGVtLiBMZXQgdXMga25vdyBpZiB0aGVyZSBhcmUgYW55IHJlbWFpbmluZyBwcm9ibGVtcyAoc2VlIHRoZSBuZXh0CiAgIHBhcmFncmFwaCBmb3Igc29tZSBrbm93biBwcm9ibGVtcy4pIElmIHlvdSBzcGVjaWZ5IHRoZSAtZGVidWdfa2V5Ym9hcmQKICAgKGFrYSAtZGspIG9wdGlvbiB0d2ljZSB5b3Ugd2lsbCBnZXQgYSBodWdlIGFtb3VudCBvZiBrZXlzdHJva2UKICAgZGVidWdnaW5nIG91dHB1dCAoc2VuZCBpdCBhbG9uZyB3aXRoIGFueSBwcm9ibGVtcyB5b3UgcmVwb3J0LikKCiAgIFVwZGF0ZTogYXMgb2YgSnVuLzIwMDUgeDExdm5jIHdpbGwgdHJ5IHRvIGF1dG9tYXRpY2FsbHkgZW5hYmxlIC14a2IgaWYKICAgaXQgYXBwZWFycyB0aGF0IHdvdWxkIGJlIGJlbmVmaWNpYWwgKGUuZy4gaWYgaXQgc2VlcyBhbnkgb2YgIkAiLCAiPCIsCiAgICI+IiwgIlsiIGFuZCBzaW1pbGFyIGtleXMgYXJlIG1hcHBlZCBpbiBhIHdheSB0aGF0IG5lZWRzIHRoZSAteGtiIHRvCiAgIGFjY2VzcyB0aGVtLikgVG8gZGlzYWJsZSB0aGlzIGF1dG9tYXRpYyBjaGVjayB1c2UgLW5veGtiLgoKICAgS25vd24gcHJvYmxlbXM6CiAgICAgKiBPbmUgdXNlciBoYWQgdG8gZGlzYWJsZSBhICJnaG9zdCIgTW9kZV9zd2l0Y2gga2V5IHRoYXQgd2FzIGNhdXNpbmcKICAgICAgIHByb2JsZW1zIHVuZGVyIC14a2IuIEhpcyBwaHlzaWNhbCBBbHRHciBrZXkgd2FzIGJvdW5kIHRvCiAgICAgICBJU09fTGV2ZWwzX1NoaWZ0ICh3aGljaCBzZWVtcyB0byBiZSB0aGUgWEtFWUJPQVJEIHdheSBvZiBkb2luZwogICAgICAgdGhpbmdzKSwgd2hpbGUgdGhlcmUgd2FzIGEgZ2hvc3Qga2V5IE1vZGVfc3dpdGNoICh3aGljaCBzZWVtcyB0bwogICAgICAgYmUgb2Jzb2xldGUpIGluIHRoZSBtYXBwaW5nIGFzIHdlbGwuIEJvdGggb2YgdGhlc2Uga2V5c3ltcyB3ZXJlCiAgICAgICBib3VuZCB0byBNb2Q1IGFuZCB4MTF2bmMgd2FzIHVuZm9ydHVuYXRlbHkgY2hvb3NpbmcgTW9kZV9zd2l0Y2guCiAgICAgICBGcm9tIHRoZSB4MTF2bmMgLXhrYiAtZGsgLWRrIG91dHB1dCBpdCB3YXMgbm90ZWQgdGhhdCBNb2RlX3N3aXRjaAogICAgICAgd2FzIGF0dGFjaGVkIHRvIGtleWNvZGUgOTMgKG5vIHBoeXNpY2FsIGtleSBnZW5lcmF0ZXMgdGhpcwogICAgICAga2V5Y29kZSkgd2hpbGUgSVNPX0xldmVsM19TaGlmdCB3YXMgYXR0YWNoZWQgdG8ga2V5Y29kZSAxMTMuIFRoZQogICAgICAga2V5Y29kZSBza2lwcGluZyBvcHRpb24gd2FzIHVzZWQgdG8gZGlzYWJsZSB0aGUgZ2hvc3Qga2V5OgogICAgICAgLXNraXBfa2V5Y29kZXMgOTMKICAgICAqIEluIGltcGxlbWVudGluZyAteGtiIHdlIG5vdGljZWQgdGhhdCBzb21lIGNoYXJhY3RlcnMgd2VyZSBzdGlsbAogICAgICAgbm90IGdldHRpbmcgdGhyb3VnaCwgZS5nLiAifiIgYW5kICJeIi4gVGhpcyBpcyBub3QgcmVhbGx5IGFuCiAgICAgICBYS0VZQk9BUkQgcHJvYmxlbS4gV2hhdCB3YXMgaGFwcGVuaW5nIHdhcyB0aGUgVk5DIHZpZXdlciB3YXMKICAgICAgIHNlbmRpbmcgdGhlIGtleXN5bXMgYXNjaWl0aWxkZSBhbmQgYXNjaWljaXJjdW0gdG8geDExdm5jLCBidXQgb24KICAgICAgIHRoZSBYIHNlcnZlciB3aXRoIHRoZSBpbnRlcm5hdGlvbmFsIGtleWJvYXJkIHRob3NlIGtleXN5bXMgd2VyZQogICAgICAgbm90IG1hcHBlZCB0byBhbnkga2V5cy4gU28geDExdm5jIGhhZCB0byBza2lwIHRoZW0gKE5vdGU6IGFzIG9mCiAgICAgICBNYXkvMjAwNSB0aGV5IGFyZSBhZGRlZCBieSBkZWZhdWx0IHNlZSAtYWRkX2tleXN5bXMgYmVsb3cuKQogICAgICAgVGhlIHdheSB0aGVzZSBjaGFyYWN0ZXJzIGFyZSB0eXBpY2FsbHkgZW50ZXJlZCBvbiBpbnRlcm5hdGlvbmFsCiAgICAgICBrZXlib2FyZHMgaXMgYnkgImRlYWQiIChha2EgIm11dGUiKSBrZXlzLiBFLmcuIHRvIGVudGVyICJ+IiBhdCB0aGUKICAgICAgIHBoeXNpY2FsIGRpc3BsYXkgdGhlIGtleXN5bSBkZWFkX3RpbGRlIGlzIHByZXNzZWQgYW5kIHJlbGVhc2VkCiAgICAgICAodGhpcyB1c3VhbGx5IGludm9sdmVzIGhvbGRpbmcgQWx0R3IgZG93biB3aGlsZSBhbm90aGVyIGtleSBpcwogICAgICAgcHJlc3NlZCkgYW5kIHRoZW4gc3BhY2UgaXMgcHJlc3NlZC4gKHRoaXMgY2FuIGFsc28gYmUgdXNlZCBnZXQKICAgICAgIGNoYXJhY3RlcnMgd2l0aCB0aGUgIn4iIHN5bWJvbCBvbiB0b3AsIGUuZy4gIuMiIGJ5IHR5cGluZyAiYSIKICAgICAgIGluc3RlYWQgb2Ygc3BhY2UuKQogICAgICAgV2hhdCB0byBkbz8gSW4gZ2VuZXJhbCB0aGUgVk5DIHByb3RvY29sIGhhcyBub3QgcmVhbGx5IHNvbHZlZCB0aGlzCiAgICAgICBwcm9ibGVtOiB3aGF0IHNob3VsZCBiZSBkb25lIGlmIHRoZSBWTkMgdmlld2VyIHNlbmRzIGEga2V5c3ltIG5vdAogICAgICAgcmVjb2duaXplZCBieSB0aGUgVk5DIHNlcnZlciBzaWRlPyBXb3JrYXJvdW5kcyBjYW4gcG9zc2libHkgYmUKICAgICAgIGNyZWF0ZWQgdXNpbmcgdGhlIC1yZW1hcCB4MTF2bmMgb3B0aW9uOgogIC1yZW1hcCBhc2NpaXRpbGRlLWRlYWRfdGlsZGUsYXNjaWljaXJjdW0tZGVhZF9jaXJjdW1mbGV4CiAgICAgICBldGMuIFVzZSAtcmVtYXAgZmlsZW5hbWUgaWYgdGhlIGxpc3QgaXMgbG9uZy4gUGxlYXNlIHNlbmQgdXMgeW91cgogICAgICAgd29ya2Fyb3VuZHMgZm9yIHRoaXMgcHJvYmxlbSBvbiB5b3VyIGtleWJvYXJkLiBQZXJoYXBzIHdlIGNhbiBoYXZlCiAgICAgICB4MTF2bmMgYWRqdXN0IGF1dG9tYXRpY2FsbHkgYXQgc29tZSBwb2ludC4gQWxzbyBzZWUgdGhlCiAgICAgICAtYWRkX2tleXN5bXMgb3B0aW9uIGluIHRoZSBuZXh0IHBhcmFncmFwaC4KICAgICAgIFVwZGF0ZTogZm9yIGNvbnZlbmllbmNlICItcmVtYXAgREVBRCIgZG9lcyBtYW55IG9mIHRoZXNlIG1hcHBpbmdzCiAgICAgICBhdCBvbmNlLgogICAgICogVG8gY29tcGxlbWVudCB0aGUgYWJvdmUgd29ya2Fyb3VuZCB1c2luZyB0aGUgLXJlbWFwLCBhbiBvcHRpb24KICAgICAgIC1hZGRfa2V5c3ltcyB3YXMgYWRkZWQuIFRoaXMgb3B0aW9uIGluc3RydWN0cyB4MTF2bmMgdG8gYmluZCBhbnkKICAgICAgIHVua25vd24gS2V5c3ltcyBjb21pbmcgaW4gZnJvbSBWTkMgdmlld2VycyB0byB1bnVzZWQgS2V5Y29kZXMgaW4KICAgICAgIHRoZSBYIHNlcnZlci4gVGhpcyBtb2RpZmllcyB0aGUgZ2xvYmFsIHN0YXRlIG9mIHRoZSBYIHNlcnZlci4gV2hlbgogICAgICAgeDExdm5jIGV4aXRzIGl0IHJlbW92ZXMgdGhlIGV4dHJhIGtleW1hcHBpbmdzIGl0IGNyZWF0ZWQuIE5vdGUKICAgICAgIHRoYXQgdGhlIC1yZW1hcCBtYXBwaW5ncyBhcmUgYXBwbGllZCBmaXJzdCwgcmlnaHQgd2hlbiB0aGUgS2V5c3ltCiAgICAgICBpcyByZWNlaXZlZCBmcm9tIGEgVk5DIHZpZXdlciwgYW5kIG9ubHkgYWZ0ZXIgdGhhdCB3b3VsZAogICAgICAgLWFkZF9rZXlzeW1zLCBvciBhbnl0aGluZyBlbHNlLCBjb21lIGludG8gcGxheS4KICAgICAgIFVwZGF0ZTogLWFkZF9rZXlzeW1zIGlzIG5vdyBvbiBieSBkZWZhdWx0LiBVc2UgLW5vYWRkX2tleXN5bXMgdG8KICAgICAgIGRpc2FibGUuCgoKICAgUS05MTogV2hlbiB0eXBpbmcgSSBzb21ldGltZXMgZ2V0IGRvdWJsZSwgdHJpcGxlLCBvciBtb3JlIG9mIG15CiAgIGtleXN0cm9rZXMgcmVwZWF0ZWQuIEknbSBzdXJlIEkgb25seSB0eXBlZCB0aGVtIG9uY2UsIHdoYXQgY2FuIEkgZG8/CgogICBUaGlzIG1heSBiZSBkdWUgdG8gYW4gaW50ZXJwbGF5IGJldHdlZW4geW91ciBYIHNlcnZlcidzIGtleSBhdXRvcmVwZWF0CiAgIGRlbGF5IGFuZCB0aGUgZXh0cmEgdGltZSBkZWxheXMgY2F1c2VkIGJ5IHgxMXZuYyBwcm9jZXNzaW5nLgoKICAgU2hvcnQgYW5zd2VyOiBkaXNhYmxlIGtleSBhdXRvcmVwZWF0aW5nIGJ5IHJ1bm5pbmcgdGhlIGNvbW1hbmQgInhzZXQgcgogICBvZmYiIG9uIHRoZSBYc2VydmVyIHdoZXJlIHgxMXZuYyBpcyBydW4gKHJlc3RvcmUgdmlhICJ4c2V0IHIgb24iKSBvcgogICB1c2UgdGhlIG5ldyAoSnVsLzIwMDQpIC1ub3JlcGVhdCB4MTF2bmMgb3B0aW9uLiBZb3Ugd2lsbCBzdGlsbCBoYXZlCiAgIGF1dG9yZXBlYXRpbmcgYmVjYXVzZSB0aGF0IGlzIHRha2VuIGNhcmUgb2Ygb24geW91ciBWTkMgdmlld2VyIHNpZGUuCgogICBVcGRhdGU6IGFzIG9mIERlYy8yMDA0IC1ub3JlcGVhdCBpcyBub3cgdGhlIGRlZmF1bHQuIFVzZSAtcmVwZWF0IHRvCiAgIGRpc2FibGUgaXQuCgogICBEZXRhaWxzOgogICBzdXBwb3NlIHlvdSBwcmVzcyBhIGtleSBET1dOIGFuZCBpdCBnZW5lcmF0ZXMgY2hhbmdlcyBpbiBsYXJnZSByZWdpb25zCiAgIG9mIHRoZSBzY3JlZW4uIFRoZSBDUFUgYW5kIEkvTyB3b3JrIHgxMXZuYyBkb2VzIGZvciB0aGUgbGFyZ2Ugc2NyZWVuCiAgIGNoYW5nZSBjb3VsZCBiZSBsb25nZXIgdGhhbiB5b3VyIFggc2VydmVyJ3Mga2V5IGF1dG9yZXBlYXQgZGVsYXkuCiAgIHgxMXZuYyBtYXkgbm90IGdldCB0byBwcm9jZXNzaW5nIHRoZSBrZXkgVVAgZXZlbnQgdW50aWwgYWZ0ZXIgdGhlCiAgIHNjcmVlbiB3b3JrIGlzIGNvbXBsZXRlZC4gVGhlIFggc2VydmVyIGJlbGlldmVzIHRoZSBrZXkgaGFzIGJlZW4gaGVsZAogICBkb3duIGFsbCB0aGlzIHRpbWUsIGFuZCBhcHBsaWVzIGl0cyBhdXRvcmVwZWF0IHJ1bGVzLgoKICAgRXZlbiB3aXRob3V0IGluZHVjaW5nIGNoYW5nZXMgaW4gbGFyZ2UgcmVnaW9ucyBvZiB0aGUgc2NyZWVuLCB0aGlzCiAgIHByb2JsZW0gY291bGQgYXJpc2Ugd2hlbiBhY2Nlc3NpbmcgeDExdm5jIHZpYSBhIGRpYWx1cCBtb2RlbSBvcgogICBvdGhlcndpc2UgaGlnaCBsYXRlbmN5IGxpbmsgKGUuZy4gPiAyNTAgbXMgbGF0ZW5jeS4pCgogICBMb29rIGF0IHRoZSBvdXRwdXQgb2YgInhzZXQgcSIgZm9yIHRoZSAiYXV0byByZXBlYXQgZGVsYXkiIHNldHRpbmcuIElzCiAgIGl0IGxvdyAoZS5nLiA8IDMwMCBtcyk/IElmIHlvdSB0dXJuIG9mZiBhdXRvcmVwZWF0IGNvbXBsZXRlbHk6ICJ4c2V0IHIKICAgb2ZmIiwgZG9lcyB0aGUgcHJvYmxlbSBnbyBhd2F5PwoKICAgVGhlIHdvcmthcm91bmQgaXMgdG8gbWFudWFsbHkgYXBwbHkgInhzZXQgciBvZmYiIGFuZCAieHNldCByIG9uIiBhcwogICBuZWVkZWQsIG9yIHRvIHVzZSB0aGUgLW5vcmVwZWF0ICh3aGljaCBoYXMgc2luY2UgRGVjLzIwMDQgYmVlbiBtYWRlCiAgIHRoZSBkZWZhdWx0LikgTm90ZSB0aGF0IHdpdGggWCBzZXJ2ZXIgYXV0b3JlcGVhdCB0dXJuZWQgb2ZmIHRoZSBWTkMKICAgdmlld2VyIHNpZGUgb2YgdGhlIGNvbm5lY3Rpb24gd2lsbCAobmVhcmx5IGFsd2F5cykgZG8gaXRzIG93bgogICBhdXRvcmVwZWF0aW5nIHNvIHRoZXJlIGlzIG5vIGJpZyBsb3NzIGhlcmUsIHVubGVzcyBzb21lb25lIGlzIGFsc28KICAgd29ya2luZyBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBhbmQgbWlzc2VzIGhpcyBhdXRvcmVwZWF0aW5nLgoKCiAgIFEtOTI6IFRoZSB4MTF2bmMgLW5vcmVwZWF0IG1vZGUgaXMgaW4gZWZmZWN0LCBidXQgSSBzdGlsbCBnZXQgcmVwZWF0ZWQKICAga2V5c3Ryb2tlcyEhCgogICBBcmUgeW91IHVzaW5nIHgxMXZuYyB0byBsb2cgaW4gdG8gYW4gWCBzZXNzaW9uIHZpYSBkaXNwbGF5IG1hbmFnZXI/CiAgIChhcyBkZXNjcmliZWQgaW4gdGhpcyBGQVEpIElmIHNvLCB4MTF2bmMgaXMgc3RhcnRpbmcgYmVmb3JlIHlvdXIKICAgc2Vzc2lvbiBhbmQgaXQgZGlzYWJsZXMgYXV0b3JlcGVhdCB3aGVuIHlvdSBjb25uZWN0LCBidXQgdGhlbiBhZnRlcgogICB5b3UgbG9nIGluIHlvdXIgc2Vzc2lvbiBzdGFydHVwIChHTk9NRSwgS0RFLCAuLi4pIGNvdWxkIGJlIHJlc2V0dGluZwogICB0aGUgYXV0b3JlcGVhdCB0byBiZSBvbi4gT3IgaXQgY291bGQgYmUgc29tZXRoaW5nIGluc2lkZSB5b3VyIGRlc2t0b3AKICAgdHJ5aW5nIHRvIGJlIGhlbHBmdWwgdGhhdCBkZWNpZGVzIHRvIHR1cm4gaXQgYmFjayBvbi4KCiAgIHgxMXZuYyBpbiAtbm9yZXBlYXQgbW9kZSB3aWxsIGJ5IGRlZmF1bHQgcmVzZXQgYXV0b3JlcGVhdCB0byBvZmYgMgogICB0aW1lcyAodG8gaGVscCBnZXQgdGhydSB0aGUgc2Vzc2lvbiBzdGFydHVwIHByb2JsZW0pLCBidXQgaXQgd2lsbCBub3QKICAgY29udGludWUgdG8gYmF0dGxlIHdpdGggdGhpbmdzIHR1cm5pbmcgYXV0b3JlcGVhdCBiYWNrIG9uLiBJdCB3aWxsCiAgIGFsc28gdHVybiBhdXRvcmVwZWF0IG9mZiB3aGVuZXZlciBpdCBnb2VzIGZyb20gYSBzdGF0ZSBvZiB6ZXJvIGNsaWVudHMKICAgdG8gb25lIGNsaWVudC4gWW91IGNhbiBhZGp1c3QgdGhlIG51bWJlciBvZiByZXNldHMgdmlhICItbm9yZXBlYXQgTiIsCiAgIG9yIHVzZSAiLW5vcmVwZWF0IC0xIiB0byBoYXZlIGl0IGtlZXAgcmVzZXR0aW5nIGl0IHdoZW5ldmVyIGF1dG9yZXBlYXQKICAgZ2V0cyB0dXJuZWQgYmFjayBvbiB3aGVuIGNsaWVudHMgYXJlIGNvbm5lY3RlZC4KCiAgIEluIGdlbmVyYWwgeW91IGNhbiBtYW51YWxseSB0dXJuIGF1dG9yZXBlYXRpbmcgb2ZmIGJ5IHR5cGluZyAieHNldCByCiAgIG9mZiIsIG9yIGEgdXNpbmcgZGVza3RvcCB1dGlsaXR5L21lbnUsIG9yICJ4MTF2bmMgLVIgbm9yZXBlYXQiLiBJZgogICBzb21ldGhpbmcgaW4geW91ciBkZXNrdG9wIGlzIGF1dG9tYXRpY2FsbHkgdHVybmluZyBpdCBiYWNrIG9uIHlvdQogICBzaG91bGQgZmlndXJlIG91dCBob3cgdG8gZGlzYWJsZSB0aGF0IHNvbWVob3cuCgoKICAgUS05MzogQWZ0ZXIgdXNpbmcgeDExdm5jIGZvciBhIHdoaWxlLCBJIGZpbmQgdGhhdCBJIGNhbm5vdCB0eXBlIHNvbWUKICAgKG9yIGFueSkgY2hhcmFjdGVycyBvciBteSBtb3VzZSBjbGlja3MgYW5kIGRyYWdzIG5vIGxvbmdlciBoYXZlIGFueQogICBlZmZlY3QsIG9yIHRoZXkgbGVhZCB0byBzdHJhbmdlIGVmZmVjdHMuIFdoYXQgaGFwcGVuZWQ/CgogICBQcm9iYWJseSBhIG1vZGlmaWVyIGtleSwgZS5nLiBDb250cm9sIG9yIEFsdCBpcyAic3R1Y2siIGluIGEgcHJlc3NlZAogICBkb3duIHN0YXRlLgoKICAgVGhpcyBoYXBwZW5zIGZvciBWTkMgaW4gZ2VuZXJhbCBieSB0aGUgZm9sbG93aW5nIG1lY2hhbmlzbS4gU3VwcG9zZSBvbgogICB0aGUgVmlld2VyIHNpZGUgZGVza3RvcCB0aGVyZSBpcyBzb21lIGhvdC1rZXkgdG8gc3dpdGNoCiAgIGRlc2t0b3BzL3Jvb21zL3NwYWNlcywgZXRjLiBFLmcuIHN1cHBvc2UgQWx0K0xlZnRBcnJvdyBtb3ZlcyB0byB0aGUKICAgbGVmdCBkZXNrdG9wL3Jvb20vc3BhY2UuIE9yIHN1cHBvc2UgYW4gQWx0K2hvdGtleSBjb21iaW5hdGlvbgogICBpY29uaWZpZXMgYSB3aW5kb3cuIFRoaXMgY2FuIGxlYXZlIHRoZSBBbHQga2V5IHByZXNzZWQgZG93biBvbiB0aGUKICAgcmVtb3RlIHNpZGUuCgogICBDb25zaWRlciB0aGUgc2VxdWVuY2UgdGhhdCBoYXBwZW5zLiBUaGUgQWx0X0wga2V5IGFuZCB0aGVuIHRoZQogICBMZWZ0QXJyb3cga2V5IGdvIGRvd24uIFNpbmNlIHlvdSBhcmUgaW5zaWRlIHRoZSB2aWV3ZXIgdGhlIEFsdF9MIGtleQogICBwcmVzcyBpcyBzZW50IHRvIHRoZSBvdGhlciBzaWRlICh4MTF2bmMpIGFuZCBzbyBpdCBpcyBwcmVzc2VkIGRvd24gaW4KICAgdGhlIHJlbW90ZSBkZXNrdG9wIGFzIHdlbGwuIChieSAiQWx0X0wiIHdlIG1lYW4gdGhlIEFsdCBrZXkgb24gdGhlCiAgIGxlZnQtaGFuZCBzaWRlIG9mIHRoZSBrZXlib2FyZC4pIFlvdXIgbG9jYWwgZGVza3RvcCAod2hlcmUgdGhlIFZOQwogICBWaWV3ZXIgaXMgcnVubmluZykgdGhlbiB3YXJwcyB0byB0aGUgbmV3IGRlc2t0b3Avcm9vbS9zcGFjZTogTGVhdmluZwogICB0aGUgQWx0X0wga2V5IHN0aWxsIHByZXNzZWQgZG93biBpbiB0aGUgcmVtb3RlIGRlc2t0b3AuCgogICBJZiBzb21lb25lIGlzIHNpdHRpbmcgYXQgdGhlIGRlc2t0b3AsIG9yIHdoZW4geW91IHJldHVybiBpbiB0aGUgdmlld2VyCiAgIGl0IG1heSBiZSB2ZXJ5IGNvbmZ1c2luZyBiZWNhdXNlIHRoZSBBbHRfTCBpcyBzdGlsbCBwcmVzc2VkIGRvd24gYnV0CiAgIHlvdSAob3IgdGhlIHBlcnNvbiBzaXR0aW5nIGF0IHRoZSBkZXNrdG9wKSBkbyBub3QgcmVhbGl6ZSB0aGlzLgogICBEZXBlbmRpbmcgb24gd2hpY2ggcmVtb3RlIGRlc2t0b3AgKHgxMXZuYyBzaWRlKSBpcyB1c2VkLCBpdCBjYW4gYWN0CiAgIHZlcnkgc3RyYW5nZWx5LgoKICAgQSBxdWljayB3b3JrYXJvdW5kIHdoZW4geW91IG5vdGljZSB0aGlzIGlzIHRvIHByZXNzIGFuZCByZWxlYXNlIGFsbCBvZgogICB0aGUgQWx0LCBTaGlmdCwgQ29udHJvbCwgV2luZG93cy1GbGFnLCBtb2RpZmllciBrZXlzIHRvIGZyZWUgdGhlCiAgIHByZXNzZWQgb25lLiBZb3UgbmVlZCB0byBkbyB0aGlzIGZvciBib3RoIHRoZSBsZWZ0IGFuZCByaWdodCBTaGlmdCwKICAgQWx0LCBDb250cm9sLCBldGMuIGtleXMgdG8gYmUgc3VyZS4KCiAgIE5vdGUgdGhhdCBtYW55IFZOQyBWaWV3ZXJzIHRyeSB0byBndWFyZCBhZ2FpbnN0IHRoaXMgd2hlbiB0aGV5IGFyZQogICBub3RpZmllZCBieSB0aGUgd2luZG93IHN5c3RlbSB0aGF0IHRoZSB2aWV3ZXIgYXBwIGhhcyAibG9zdCBmb2N1cyIuCiAgIFdoZW4gaXQgcmVjZWl2ZXMgdGhlICJsb3N0IGZvY3VzIiBldmVudCwgdGhlIHZpZXdlciBzZW5kcyBWTkMKICAgS2V5LVJlbGVhc2UgZXZlbnRzIGZvciBhbGwgbW9kaWZpZXIga2V5cyB0aGF0IGFyZSBjdXJyZW50bHkgcHJlc3NlZAogICBkb3duLiBUaGlzIGRvZXMgbm90IGFsd2F5cyB3b3JrLCBob3dldmVyLCBzaW5jZSBpdCBkZXBlbmRzIG9uIGhvdyB0aGUKICAgZGVza3RvcCBtYW5hZ2VzIHRoZXNlICJ3YXJwcyIuIElmIHRoZSB2aWV3ZXIgaXMgbm90IG5vdGlmaWVkIGl0IGNhbm5vdAogICBrbm93IGl0IG5lZWRzIHRvIHJlbGVhc2UgdGhlIG1vZGlmaWVycy4KCiAgIFlvdSBjYW4gYWxzbyB1c2UgdGhlIC1jbGVhcl9tb2RzIG9wdGlvbiB0byB0cnkgdG8gY2xlYXIgYWxsIG9mIHRoZQogICBtb2RpZmllciBrZXlzIGF0IHgxMXZuYyBzdGFydHVwLiBZb3Ugd2lsbCBzdGlsbCBoYXZlIHRvIGJlIGNhcmVmdWwKICAgdGhhdCB5b3UgZG8gbm90IGxlYXZlIHRoZSBtb2RpZmllciBrZXkgcHJlc3NlZCBkb3duIGR1cmluZyB5b3VyCiAgIHNlc3Npb24uIEl0IGlzIGRpZmZpY3VsdCB0byBwcmV2ZW50IHRoaXMgcHJvYmxlbSBmcm9tIG9jY3VycmluZyAoc2hvcnQKICAgb2YgdXNpbmcgLXJlbWFwIHRvIHByZXZlbnQgc2VuZGluZyBhbGwgb2YgdGhlIHByb2JsZW0gbW9kaWZpZXIga2V5cywKICAgd2hpY2ggd291bGQgbWFrZSB0aGUgZGVzdGtvcCBwcmV0dHkgdW51c2FibGUuKQoKICAgRHVyaW5nIGEgc2Vzc2lvbiB0aGVzZSB4MTF2bmMgcmVtb3RlIGNvbnRyb2wgY29tbWFuZHMgY2FuIGFsc28gaGVscDoKICAgeDExdm5jIC1SIGNsZWFyX21vZHMKICAgeDExdm5jIC1SIGNsZWFyX2tleXMKICAgeDExdm5jIC1SIGNsZWFyX2xvY2tzCiAgIHgxMXZuYyAtUiBjbGVhcl9hbGwKCiAgIEEgc2ltaWxhciBwcm9ibGVtIGNhbiBvY2N1ciBpZiB5b3UgYWNjaWRlbnRhbGx5IHByZXNzIHRoZSBDYXBzX0xvY2sgb3IKICAgTnVtX0xvY2sgZG93bi4gV2hlbiB0aGVzZSBhcmUgbG9ja2VkIG9uIHRoZSByZW1vdGUgc2lkZSBpdCBjYW4KICAgc29tZXRpbWVzIGxlYWQgdG8gc3RyYW5nZSBkZXNrdG9wIGJlaGF2aW9yIChlLmcuIGNhbm5vdCBkcmFnIG9yIGNsaWNrCiAgIG9uIHdpbmRvd3MuKSBBcyBhYm92ZSB5b3UgbWF5IG5vdCBub3RpY2UgdGhpcyBiZWNhdXNlIHRoZSBsb2NrIGlzbid0CiAgIGRvd24gb24gdGhlIGxvY2FsIChWaWV3ZXIpIHNpZGUuIFNlZSB0aGlzIEZBUSBvbiBsb2NrIGtleXMgcHJvYmxlbS4KICAgVGhlc2Ugb3B0aW9ucyBtYXkgaGVscCBhdm9pZCB0aGUgcHJvYmxlbTogLXNraXBfbG9ja2tleXMgYW5kCiAgIC1jYXBzbG9jay4gU2VlIGFsc28gLWNsZWFyX2FsbC4KCgogICBRLTk0OiBUaGUgbWFjaGluZSB3aGVyZSBJIHJ1biB4MTF2bmMgaGFzIGFuIEFsdEdyIGtleSwgYnV0IHRoZSBsb2NhbAogICBtYWNoaW5lIHdoZXJlIEkgcnVuIHRoZSBWTkMgdmlld2VyIGRvZXMgbm90LiBJcyB0aGVyZSBhIHdheSBJIGNhbiBtYXAKICAgYSBsb2NhbCB1bnVzZWQga2V5IHRvIHNlbmQgYW4gQWx0R3I/IEhvdyBhYm91dCBhIENvbXBvc2Uga2V5IGFzIHdlbGw/CgogICBTb21ldGhpbmcgbGlrZSAiLXJlbWFwIFN1cGVyX1ItTW9kZV9zd2l0Y2giIHgxMXZuYyBvcHRpb24gbWF5IHdvcmsuCiAgIE5vdGUgdGhhdCBTdXBlcl9SIGlzIHRoZSAiUmlnaHQgV2luZG96ZSh0bSkgRmxhZ2dpZSIga2V5OyB5b3UgbWF5IHdhbnQKICAgdG8gY2hvb3NlIGFub3RoZXIuIFRoZSAtZGVidWdfa2V5Ym9hcmQgb3B0aW9uIGNvbWVzIGluIGhhbmR5IGluCiAgIGZpbmRpbmcga2V5c3ltIG5hbWVzIChzbyBkb2VzIHhldigxKS4pCgogICBGb3IgQ29tcG9zZSBob3cgYWJvdXQgIi1yZW1hcCBNZW51LU11bHRpX2tleSIgKG5vdGUgdGhhdCBNdWx0aV9rZXkgaXMKICAgdGhlIG9mZmljaWFsIG5hbWUgZm9yIENvbXBvc2UuKSBUbyBkbyBib3RoIGF0IHRoZSBzYW1lIHRpbWU6ICItcmVtYXAKICAgU3VwZXJfUi1Nb2RlX3N3aXRjaCxNZW51LU11bHRpX2tleSIgb3IgdXNlICItcmVtYXAgZmlsZW5hbWUiIHRvCiAgIHNwZWNpZnkgcmVtYXBwaW5ncyBmcm9tIGEgZmlsZS4KCgogICBRLTk1OiBJIGhhdmUgYSBTdW4gbWFjaGluZSBJIHJ1biB4MTF2bmMgb24uIEl0cyBTdW4ga2V5Ym9hcmQgaGFzIGp1c3QKICAgb25lIEFsdCBrZXkgbGFiZWxsZWQgIkFsdCIgYW5kIHR3byBNZXRhIGtleXMgbGFiZWxsZWQgd2l0aCBsaXR0bGUKICAgZGlhbW9uZHMuIFRoZSBtYWNoaW5lIHdoZXJlIEkgcnVuIHRoZSBWTkMgdmlld2VyIG9ubHkgaGFzIEFsdCBrZXlzLgogICBIb3cgY2FuIEkgc2VuZCBhIE1ldGEga2V5cHJlc3M/IChlLmcuIGVtYWNzIG5lZWRzIHRoaXMpCgogICBIZXJlIGFyZSBhIGNvdXBsZSBpZGVhcy4gVGhlIGZpcnN0IG9uZSBpcyB0byBzaW1wbHkgdXNlIHhtb2RtYXAoMSkgdG8KICAgYWRqdXN0IHRoZSBTdW4gWCBzZXJ2ZXIuIFBlcmhhcHMgeG1vZG1hcCAtZSAia2V5c3ltIEFsdF9MID0gTWV0YV9MCiAgIEFsdF9MIiB3aWxsIGRvIHRoZSB0cmljay4gKHRoZXJlIGFyZSBvdGhlciB3YXlzIHRvIGRvIGl0LCBvbmUgdXNlcgogICB1c2VkOiB4bW9kbWFwIC1lICJrZXljb2RlIDI2ID0gTWV0YV9MIiBmb3IgaGlzIHNldHVwLikKCiAgIFNpbmNlIHhtb2RtYXAoMSkgbW9kaWZpZXMgdGhlIFggc2VydmVyIG1hcHBpbmdzIHlvdSBtYXkgbm90IHdhbnQgdG8gZG8KICAgdGhpcyAoYmVjYXVzZSBpdCBhZmZlY3RzIGxvY2FsIHdvcmsgb24gdGhhdCBtYWNoaW5lLikgU29tZXRoaW5nIGxpa2UKICAgdGhlIC1yZW1hcCBBbHRfTC1NZXRhX0wgdG8geDExdm5jIG1heSBiZSBzdWZmaWNpZW50IGZvciBvbmVzIG5lZWRzLAogICBhbmQgZG9lcyBub3QgbW9kaWZ5IHRoZSBYIHNlcnZlciBlbnZpcm9ubWVudC4gTm90ZSB0aGF0IHlvdSBjYW5ub3QKICAgc2VuZCBBbHRfTCBpbiB0aGlzIGNhc2UsIG1heWJlIC1yZW1hcCBTdXBlcl9MLU1ldGFfTCB3b3VsZCBiZSBhIGJldHRlcgogICBjaG9pY2UgaWYgdGhlIFN1cGVyX0wga2V5IGlzIHR5cGljYWxseSB1bnVzZWQgaW4gVW5peC4KCgogICBRLTk2OiBSdW5uaW5nIHgxMXZuYyBvbiBIUC1VWCBJIGNhbm5vdCB0eXBlICIjIiBJIGp1c3QgZ2V0IGEgIjMiCiAgIGluc3RlYWQuCgogICBPbmUgdXNlciByZXBvcnRzIHRoaXMgcHJvYmxlbSBvbiBIUC1VWCBSZWxfQi4xMS4yMy4gVGhlIHByb2JsZW0gd2FzCiAgIHRyYWNlZCB0byBhIHN0cmFuZ2Uga2V5Ym9hcmQgbWFwcGluZyBmb3IgdGhlIG1hY2hpbmUgKGUuZy4geG1vZG1hcCAtcGsKICAgb3V0cHV0KSB0aGF0IGxvb2tlZCBsaWtlOgogIC4uLgogIDAzOSAgMiAgICAgICAgICAgICAgICAgIGF0ICAgICAgICAgICAgICAgICBhdCAgICAgICAgICAgICAgIGF0CiAgLi4uCiAgMDQ3ICAzICAgICAgICAgICAgICAgICAgbnVtYmVyc2lnbiAgICAgICAgIG51bWJlcnNpZ24gICAgICAgbnVtYmVyc2lnbgoKICAgYW5kIHNpbWlsYXIgdHJpcGxlIG1hcHBpbmdzICh3aXRoIHR3byBpbiB0aGUgQWx0R3IvTW9kZV9zd2l0Y2ggZ3JvdXApCiAgIG9mIGEga2V5c3VtIHRvIGEgc2luZ2xlIGtleWNvZGUuCgogICBVc2UgdGhlIC1ub21vZHR3ZWFrIG9wdGlvbiBhcyBhIHdvcmthcm91bmQuIFlvdSBjYW4gYWxzbyB1c2UgeG1vZG1hcAogICB0byBjb3JyZWN0IHRoZXNlIG1hcHBpbmdzIGluIHRoZSBzZXJ2ZXIsIGUuZy46CiAgeG1vZG1hcCAtZSAia2V5Y29kZSA0NyA9IDMgbnVtYmVyc2lnbiIKCiAgIEFsc28sIGFzIG9mIEZlYi8yMDA3LCBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIE1PRFRXRUFLX0xPV0VTVD0xCiAgIChlaXRoZXIgaW4geW91ciBzaGVsbCBvciB2aWEgIi1lbnYgTU9EVFdFQUtfTE9XRVNUPTEiIG9wdGlvbikgdG8KICAgaGFuZGxlIHRoZXNlIG1hcHBpbmdzIGJldHRlci4KCgogICBRLTk3OiBDYW4gSSBtYXAgYSBrZXlzdHJva2UgdG8gYSBtb3VzZSBidXR0b24gY2xpY2sgb24gdGhlIHJlbW90ZQogICBtYWNoaW5lPwoKICAgVGhpcyBjYW4gYmUgZG9uZSBkaXJlY3RseSBpbiBzb21lIFggc2VydmVycyB1c2luZyBBY2Nlc3NYIGFuZAogICBQb2ludGVyX0VuYWJsZUtleXMsIGJ1dCBpcyBhIGJpdCBhd2t3YXJkLiBJdCBtYXkgYmUgbW9yZSBjb252ZW5pZW50IHRvCiAgIGhhdmUgeDExdm5jIGRvIHRoZSByZW1hcHBpbmcuIFRoaXMgY2FuIGJlIGRvbmUgdmlhIHRoZSAtcmVtYXAgb3B0aW9uCiAgIHVzaW5nIHRoZSBmYWtlICJrZXlzeW1zIiBCdXR0b24xLCBCdXR0b24yLCBldGMuIGFzIHRoZSAidG8iIGtleXMgKGkuZS4KICAgdGhlIG9uZXMgYWZ0ZXIgdGhlICItIikKCiAgIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIGEgbGFwdG9wIHdoZXJlIHRoZSBWTkMgdmlld2VyIGlzIHJ1biB0aGF0IGhhcwogICBhIHRvdWNocGFkIHdpdGggb25seSB0d28gYnV0dG9ucy4gSXQgaXMgZGlmZmljdWx0IHRvIGRvIGEgbWlkZGxlCiAgIGJ1dHRvbiAicGFzdGUiIGJlY2F1c2UgKHVzaW5nIFhGcmVlODYvWG9yZyBFbXVsYXRlM0J1dHRvbnMpIHlvdSBoYXZlCiAgIHRvIGNsaWNrIGJvdGggYnV0dG9ucyBvbiB0aGUgdG91Y2ggcGFkIGF0IHRoZSBzYW1lIHRpbWUuIFRoaXMKICAgcmVtYXBwaW5nOgogIC1yZW1hcCBTdXBlcl9SLUJ1dHRvbjIKCiAgIG1hcHMgdGhlIFN1cGVyX1IgImZsYWciIGtleSBwcmVzcyB0byB0aGUgQnV0dG9uMiBjbGljaywgdGhlcmVieSBtYWtpbmcKICAgWCBwYXN0aW5nIGEgYml0IGVhc2llci4KCiAgIE5vdGUgdGhhdCBvbmNlIHRoZSBrZXkgZ29lcyBkb3duLCB0aGUgYnV0dG9uIGRvd24gYW5kIGJ1dHRvbiB1cCBldmVudHMKICAgYXJlIGdlbmVyYXRlZCBpbW1lZGlhdGVseSBvbiB0aGUgeDExdm5jIHNpZGUuIFdoZW4gdGhlIGtleSBpcyByZWxlYXNlZAogICAoaS5lLiBnb2VzIHVwKSBubyBldmVudHMgYXJlIGdlbmVyYXRlZC4KCiAgIFEtOTg6IEhvdyBjYW4gSSBnZXQgQ2Fwc19Mb2NrIHRvIHdvcmsgYmV0d2VlbiBteSBWTkMgdmlld2VyIGFuZAogICB4MTF2bmM/CgogICBUaGlzIGlzIGEgbGl0dGxlIHRyaWNreSBiZWNhdXNlIGl0IGlzIHBvc3NpYmxlIHRvIGdldCB0aGUgQ2Fwc19Mb2NrCiAgIHN0YXRlIG91dCBvZiBzeW5jIGJldHdlZW4geW91ciB2aWV3ZXItc2lkZSBtYWNoaW5lIGFuZCB0aGUgeDExdm5jLXNpZGUKICAgWCBzZXJ2ZXIuIEZvciBiZXN0IHJlc3VsdHMsIHdlIHJlY29tbWVuZCBub3QgZXZlciBsZXR0aW5nIHRoZQogICBDYXBzX0xvY2sga2V5cHJlc3NlcyBiZSBwcm9jZXNzZWQgYnkgeDExdm5jLiBUaGF0IHdheSB3aGVuIHlvdSBwcmVzcwogICBDYXBzX0xvY2sgaW4gdGhlIHZpZXdlciB5b3VyIGxvY2FsIG1hY2hpbmUgZ29lcyBpbnRvIHRoZSBDYXBzX0xvY2sgb24KICAgc3RhdGUgYW5kIHNlbmRzIGtleXN5bSAiQSIgc2F5IHdoZW4geW91IHByZXNzICJhIi4geDExdm5jIHdpbGwgdGhlbgogICBmYWtlIHRoaW5ncyB1cCBzbyB0aGF0IFNoaWZ0IGlzIGhlbGQgZG93biB0byBnZW5lcmF0ZSAiQSIuIFRoZQogICAtc2tpcF9sb2Nra2V5cyBvcHRpb24gc2hvdWxkIGhlbHAgdG8gYWNjb21wbGlzaCB0aGlzLiBGb3IgZmluZXIgZ3JhaW4KICAgY29udHJvbCB1c2Ugc29tZXRoaW5nIGxpa2U6ICItcmVtYXAgQ2Fwc19Mb2NrLU5vbmUiLgoKICAgQWxzbyB0cnkgdGhlIC1ub21vZHR3ZWFrIGFuZCAtY2Fwc2xvY2sgb3B0aW9ucy4KCiAgIEFub3RoZXIgdXNlZnVsIG9wdGlvbiB0aGF0IHR1cm5zIG9mZiBhbnkgTG9jayBrZXlzIG9uIHRoZSByZW1vdGUgc2lkZQogICBhdCBzdGFydHVwIGFuZCBlbmQgaXMgdGhlIC1jbGVhcl9hbGwgb3B0aW9uLiBEdXJpbmcgYSBzZXNzaW9uIHlvdSBjYW4KICAgcnVuIHRoZXNlIHJlbW90ZSBjb250cm9sIGNvbW1hbmRzIHRvIG1vZGlmeSB0aGUgTG9jayBrZXlzOgogICB4MTF2bmMgLVIgY2xlYXJfbG9ja3MKICAgeDExdm5jIC1SIGNsZWFyX2FsbAoKICAgdGhlIGZvcm1lciB3aWxsIHRyeSB0byB1bnNldCBhbnkgTG9jayBrZXlzLCB0aGUgbGF0dGVyIHdpbGwgZG8gc2FtZQogICBhbmQgYWxzbyB0cnkgdG8gbWFrZSBpdCBzbyBubyBrZXkgaXMgcHJlc3NlZCBkb3duIChlLmcuICJzdHVjayIgQWx0X0wsCiAgIGV0Yy4pCiAgIFtTY3JlZW4gUmVsYXRlZCBJc3N1ZXMgYW5kIEZlYXR1cmVzXQoKICAgUS05OTogVGhlIHJlbW90ZSBkaXNwbGF5IGlzIGxhcmdlciAoaW4gbnVtYmVyIG9mIHBpeGVscykgdGhhbiB0aGUKICAgbG9jYWwgZGlzcGxheSBJIGFtIHJ1bm5pbmcgdGhlIHZuY3ZpZXdlciBvbi4gSSBkb24ndCBsaWtlIHRoZQogICB2bmN2aWV3ZXIgc2Nyb2xsYmFycywgd2hhdCBJIGNhbiBkbz8KCiAgIHZuY3ZpZXdlciBoYXMgYSBvcHRpb24gKHVzdWFsbHkgYWNjZXNzaWJsZSB2aWEgRjgga2V5IG9yIC1mdWxsc2NyZWVuCiAgIG9wdGlvbikgZm9yIHZuY3ZpZXdlciB0byBydW4gaW4gZnVsbCBzY3JlZW4sIHdoZXJlIGl0IHdpbGwKICAgYXV0b21hdGljYWxseSBzY3JvbGwgd2hlbiB0aGUgbW91c2UgaXMgbmVhciB0aGUgZWRnZSBvZiB0aGUgY3VycmVudAogICB2aWV3LiBGb3IgcXVpY2sgc2Nyb2xsaW5nLCBhbHNvIG1ha2Ugc3VyZSBCYWNraW5nIFN0b3JlIGlzIGVuYWJsZWQgb24KICAgdGhlIG1hY2hpbmUgdm5jdmlld2VyIGlzIHJ1biBvbi4gKFhGcmVlODYvWG9yZyBkaXNhYmxlcyBpdCBieSBkZWZhdWx0CiAgIGZvciBzb21lIHJlYXNvbiwgYWRkIE9wdGlvbiAiYmFja2luZ3N0b3JlIiB0byBYRjg2Q29uZmlnIG9uIHRoZQogICB2bmN2aWV3ZXIgc2lkZS4pCgogICBCVFcsIGNvbnRhY3QgbWUgaWYgeW91IGFyZSBoYXZpbmcgcHJvYmxlbXMgd2l0aCB2bmN2aWV3ZXIgaW4KICAgZnVsbHNjcmVlbiBtb2RlIHdpdGggeW91ciB3aW5kb3cgbWFuYWdlciAoaS5lLiBubyBrZXlib2FyZCByZXNwb25zZS4pCiAgIEkgaGF2ZSBhIHdvcmthcm91bmQgZm9yIHZuY3ZpZXdlciB1c2luZyBYR3JhYlNlcnZlcigpLgoKICAgVGhlcmUgbWF5IGFsc28gYmUgc2NhbGluZyB2aWV3ZXJzIG91dCB0aGVyZSAoZS5nLiBUaWdodFZOQyBvciBVbHRyYVZOQwogICBvbiBXaW5kb3dzKSB0aGF0IGF1dG9tYXRpY2FsbHkgc2hyaW5rIG9yIGV4cGFuZCB0aGUgcmVtb3RlIGZyYW1lYnVmZmVyCiAgIHRvIGZpdCB0aGUgbG9jYWwgZGlzcGxheS4gRXNwZWNpYWxseSBmb3IgaGFuZC1oZWxkIGRldmljZXMuIFNlZSBhbHNvCiAgIHRoZSBuZXh0IEZBUSBvbiB4MTF2bmMgc2NhbGluZy4KCgogICBRLTEwMDogRG9lcyB4MTF2bmMgc3VwcG9ydCBzZXJ2ZXItc2lkZSBmcmFtZWJ1ZmZlciBzY2FsaW5nPyAoRS5nLiB0bwogICBtYWtlIHRoZSBkZXNrdG9wIHNtYWxsZXIuKQoKICAgQXMgb2YgSnVuLzIwMDQgeDExdm5jIHByb3ZpZGVzIGJhc2ljIHNlcnZlci1zaWRlIHNjYWxpbmcuIEl0IGlzIGEKICAgZ2xvYmFsIHNjYWxpbmcgb2YgdGhlIGRlc2t0b3AsIG5vdCBhIHBlci1jbGllbnQgc2V0dGluZy4gVG8gZW5hYmxlIGl0CiAgIHVzZSB0aGUgIi1zY2FsZSBmcmFjdGlvbiIgb3B0aW9uLiAiZnJhY3Rpb24iIGNhbiBlaXRoZXIgYmUgYSBmbG9hdGluZwogICBwb2ludCBudW1iZXIgKGUuZy4gLXNjYWxlIDAuNzUpIG9yIHRoZSBhbHRlcm5hdGl2ZSBtL24gZnJhY3Rpb24KICAgbm90YXRpb24gKGUuZy4gLXNjYWxlIDMvNC4pIE5vdGUgdGhhdCBpZiBmcmFjdGlvbiBpcyBncmVhdGVyIHRoYW4gb25lCiAgIHRoZSBkaXNwbGF5IGlzIG1hZ25pZmllZC4KCiAgIEV4dHJhIHJlc291cmNlcyAoQ1BVLCBtZW1vcnkgSS9PLCBhbmQgbWVtb3J5KSBhcmUgcmVxdWlyZWQgdG8gZG8gdGhlCiAgIHNjYWxpbmcuIElmIHRoZSBtYWNoaW5lIGlzIHNsb3cgd2hlcmUgeDExdm5jIGlzIHJ1biB3aXRoIHNjYWxpbmcKICAgZW5hYmxlZCwgdGhlIGludGVyYWN0aXZlIHJlc3BvbnNlIGNhbiBiZSB1bmFjY2VwdGFibGUuIE9UT0gsIGlmIHJ1bgogICB3aXRoIHNjYWxpbmcgb24gYSBmYXN0IG1hY2hpbmUgdGhlIHBlcmZvcm1hbmNlIGRlZ3JhZGF0aW9uIGlzIHVzdWFsbHkKICAgbm90IGEgYmlnIGlzc3VlIG9yIGV2ZW4gbm90aWNlYWJsZS4KCiAgIEl0IG1heSBoZWxwIHRvIGNvbXBpbGUgeDExdm5jIHdpdGggY29tcGlsZXIgb3B0aW9uIC1PMyBvciAtTzQgdG8gc3BlZWQKICAgdXAgdGhlIHNjYWxpbmcgY29kZS4gU2V0IHRoZSBDRkxBR1MgZW52LiB2YXIuIGJlZm9yZSBydW5uaW5nCiAgIGNvbmZpZ3VyZS4KCiAgIEFsc28sIGlmIHlvdSBqdXN0IHdhbnQgYSBxdWljaywgcm91Z2ggInRodW1ibmFpbCIgb2YgdGhlIGRpc3BsYXkgeW91CiAgIGNhbiBhcHBlbmQgIjpuYiIgdG8gdGhlIGZyYWN0aW9uIHRvIHR1cm4gb24gIm5vIGJsZW5kaW5nIiBtb2RlLiBFLmcuOgogICAiLXNjYWxlIDEvMzpuYiIgRm9udHMgd2lsbCBiZSBkaWZmaWN1bHQgdG8gcmVhZCwgYnV0IHRoZSBsYXJnZXIKICAgZmVhdHVyZXMgd2lsbCBiZSByZWNvZ25pemFibGUuIEJUVywgIm5vIGJsZW5kaW5nIiBtb2RlIGlzIGZvcmNlZCBvbgogICB3aGVuIHNjYWxpbmcgOGJwcCBQc2V1ZG9Db2xvciBkaXNwbGF5cyAoYmVjYXVzZSBibGVuZGluZyBhbiBpbmRleGVkCiAgIGNvbG9ybWFwIGlzIGEgYmFkIGlkZWEgYW5kIGxlYWRzIHRvIHJhbmRvbSBjb2xvcnMsIHVzZSA6ZmIgdG8gZm9yY2UgaXQKICAgb24uKQoKICAgT25lIGNhbiBhbHNvIHVzZSB0aGUgIjpuYiIgd2l0aCBhbiBpbnRlZ2VyIHNjYWxlIGZhY3RvciAoc2F5ICItc2NhbGUKICAgMjpuYiIpIHRvIHVzZSB4MTF2bmMgYXMgYSBzY3JlZW4gbWFnbmlmaWVyIGZvciB2aXNpb24gaW1wYWlyZWQKICAgYXBwbGljYXRpb25zLiBTaW5jZSB3aXRoIGludGVnZXIgc2NhbGUgZmFjdG9ycyB0aGUgZnJhbWVidWZmZXJzIGJlY29tZQogICBodWdlIGFuZCBzY2FsaW5nIG9wZXJhdGlvbnMgdGltZSBjb25zdW1pbmcsIGJlIHN1cmUgdG8gdXNlICI6bmIiIGZvcgogICB0aGUgZmFzdGVzdCByZXNwb25zZS4KCiAgIEluIGdlbmVyYWwgZm9yIGEgc2NhbGVkIGRpc3BsYXkgaWYgeW91IGFyZSB1c2luZyBhIFRpZ2h0Vk5DIHZpZXdlciB5b3UKICAgbWF5IHdhbnQgdG8gdHVybiBvZmYganBlZyBlbmNvZGluZyAoZS5nLiB2bmN2aWV3ZXIgLW5vanBlZyBob3N0OjAuKQogICBUaGVyZSBhcHBlYXJzIHRvIGJlIGEgbm9pc2UgZW5oYW5jZW1lbnQgZWZmZWN0LCBlc3BlY2lhbGx5IGZvciByZWdpb25zCiAgIGNvbnRhaW5pbmcgZm9udC90ZXh0OiB0aGUgc2NhbGluZyBjYW4gaW50cm9kdWNlIHNvbWUgcGl4ZWwgYXJ0aWZhY3RzCiAgIHRoYXQgZXZpZGVudGx5IGNhdXNlcyB0aGUgdGlnaHQgZW5jb2RpbmcgYWxnb3JpdGhtIHRvIGluY29ycmVjdGx5CiAgIGRldGVjdCB0aGUgcmVnaW9ucyBhcyBpbWFnZSBkYXRhIGFuZCB0aGVyZWJ5IGludHJvZHVjZSBhZGRpdGlvbmFsCiAgIHBpeGVsIGFydGlmYWN0cyBkdWUgdG8gdGhlIGxvc3NpbmVzcyBvZiB0aGUganBlZyBjb21wcmVzc2lvbgogICBhbGdvcml0aG0uIEV4cGVyaW1lbnQgdG8gc2VlIGlmIC1ub2pwZWcgdm5jdmlld2VyIG9wdGlvbiBpbXByb3ZlcyB0aGUKICAgcmVhZGFiaWxpdHkgb2YgdGV4dCB3aGVuIHVzaW5nIC1zY2FsZSB0byBzaHJpbmsgdGhlIGRpc3BsYXkgc2l6ZS4gQWxzbwogICBub3RlIHRoYXQgc2NhbGluZyBtYXkgYWN0dWFsbHkgc2xvdyBkb3duIHRoZSB0cmFuc2ZlciBvZiB0ZXh0IHJlZ2lvbnMKICAgYmVjYXVzZSBhZnRlciBiZWluZyBzY2FsZWQgdGhleSBkbyBub3QgY29tcHJlc3MgYXMgd2VsbC4gKHRoaXMgY2FuCiAgIG9mdGVuIGJlIGEgc2lnbmlmaWNhbnQgc2xvd2Rvd24sIGUuZy4gMTBYLikKCiAgIEFub3RoZXIgaXNzdWUgaXMgdGhhdCBpdCBhcHBlYXJzIFZOQyB2aWV3ZXJzIHJlcXVpcmUgdGhlIHNjcmVlbiB3aWR0aAogICB0byBiZSBhIG11bHRpcGxlIG9mIDQuIFdoZW4gc2NhbGluZyB4MTF2bmMgd2lsbCByb3VuZCB0aGUgd2lkdGggdG8gdGhlCiAgIG5lYXJlc3QgbXVsdGlwbGUgb2YgNC4gVG8gZGlzYWJsZSB0aGlzIHVzZSB0aGUgIjpuNCIgc3ViIG9wdGlvbiAobGlrZQogICAiOm5iIiBpbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoOyB0byBzcGVjaWZ5IGJvdGggdXNlIGEgY29tbWE6CiAgICI6bmIsbjQiLCBldGMuKQoKICAgSWYgb25lIGRlc2lyZXMgcGVyLWNsaWVudCBzY2FsaW5nIGZvciBzb21ldGhpbmcgbGlrZSAxOjEgZnJvbSBhCiAgIHdvcmtzdGF0aW9uIGFuZCAxOjIgZnJvbSBhIHNtYWxsZXIgZGV2aWNlIChlLmcuIGhhbmRoZWxkKSwgY3VycmVudGx5CiAgIHRoZSBvbmx5IG9wdGlvbiBpcyB0byBydW4gdHdvIChvciBtb3JlKSB4MTF2bmMgcHJvY2Vzc2VzIHdpdGgKICAgZGlmZmVyZW50IHNjYWxpbmdzIGxpc3RlbmluZyBvbiBzZXBhcmF0ZSBwb3J0cyAoLXJmYnBvcnQgb3B0aW9uLCBldGMuKQoKICAgVXBkYXRlOiBBcyBvZiBNYXkvMjAwNiB4MTF2bmMgYWxzbyBzdXBwb3J0cyB0aGUgVWx0cmFWTkMgc2VydmVyLXNpZGUKICAgc2NhbGluZy4gVGhpcyBpcyBhIHBlci1jbGllbnQgc2NhbGluZyBieSBmYWN0b3JzIDEvMiwgMS8zLCAuLi4gYW5kIHNvCiAgIG1heSBiZSB1c2VmdWwgZm9yIFBEQSdzICgiLXNjYWxlIDEvMiIsIGV0Yy4gd2lsbCBnaXZlIHNpbWlsYXIgcmVzdWx0cwogICBleGNlcHQgdGhhdCBpdCBhcHBsaWVzIHRvIGFsbCBjbGllbnRzLikgWW91IG1heSBuZWVkIHRvIHN1cHBseQogICAiLXJmYnZlcnNpb24gMy42IiBmb3IgdGhpcyB0byBiZSByZWNvZ25pemVkIGJ5IFVsdHJhVk5DIHZpZXdlcnMuCgogICBCVFcsIHdoZW5ldmVyIHlvdSBydW4gdHdvIG9yIG1vcmUgeDExdm5jJ3Mgb24gdGhlIHNhbWUgWCBkaXNwbGF5IGFuZAogICB1c2UgdGhlIEdVSSwgdGhlbiB0byBhdm9pZCBhbGwgb2YgdGhlIHgxMXZuYydzIHNpbXVsdGFuZW91c2x5CiAgIGFuc3dlcmluZyB0aGUgZ3VpIHlvdSB3aWxsIG5lZWQgdG8gdXNlIHNvbWV0aGluZyBsaWtlICItY29ubmVjdCBmaWxlMQogICAtZ3VpIC4uLiIgd2l0aCBkaWZmZXJlbnQgY29ubmVjdCBmaWxlcyBmb3IgZWFjaCB4MTF2bmMgeW91IHdhbnQgdG8KICAgY29udHJvbCB2aWEgdGhlIGd1aSAob3IgcmVtb3RlLWNvbnRyb2wuKSBUaGUgIi1jb25uZWN0IGZpbGUxIiB1c2FnZQogICBnaXZlcyBzZXBhcmF0ZSBjb21tdW5pY2F0aW9uIGNoYW5uZWxzIGJldHdlZW4gYSB4MTF2bmMgcHJvY2VzcyBhbmQgdGhlCiAgIGd1aSBwcm9jZXNzLiBPdGhlcndpc2UgdGhleSBhbGwgc2hhcmUgdGhlIHNhbWUgWCBwcm9wZXJ0eSBjaGFubmVsczoKICAgVk5DX0NPTk5FQ1QgYW5kIFgxMVZOQ19SRU1PVEUuCgogICBVcGRhdGU6IEFzIG9mIE1hci8yMDA1IHgxMXZuYyBub3cgc2NhbGVzIHRoZSBtb3VzZSBjdXJzb3Igd2l0aCB0aGUKICAgc2FtZSBzY2FsZSBmYWN0b3IgYXMgdGhlIHNjcmVlbi4gSWYgeW91IGRvbid0IHdhbnQgdGhhdCwgdXNlIHRoZQogICAiLXNjYWxlX2N1cnNvciBmcmFjIiBvcHRpb24gdG8gc2V0IHRoZSBjdXJzb3Igc2NhbGluZyB0byBhIGRpZmZlcmVudAogICBmYWN0b3IgKGUuZy4gdXNlICItc2NhbGVfY3Vyc29yIDEiIHRvIGtlZXAgdGhlIGN1cnNvciBhdCBpdHMgbmF0dXJhbAogICB1bnNjYWxlZCBzaXplLikKCgogICBRLTEwMTogRG9lcyB4MTF2bmMgd29yayB3aXRoIFhpbmVyYW1hPyAoaS5lLiBtdWx0aXBsZSBtb25pdG9ycyBqb2luZWQKICAgdG9nZXRoZXIgdG8gZm9ybSBvbmUgYmlnLCBzaW5nbGUgc2NyZWVuLikKCiAgIFllcywgaXQgc2hvdWxkIGdlbmVyYWxseSB3b3JrIGJlY2F1c2UgaXQgc2ltcGx5IHBvbGxzIHRoZSBiaWcKICAgZWZmZWN0aXZlIHNjcmVlbi4KCiAgIElmIHRoZSB2aWV3aW5nLWVuZCBtb25pdG9yIGlzIG5vdCBhcyBiaWcgYXMgdGhlIHJlbW90ZSBYaW5lcmFtYQogICBkaXNwbGF5LCB0aGVuIHRoZSB2bmN2aWV3ZXIgc2Nyb2xsYmFycywgZXRjLCB3aWxsIGhhdmUgdG8gYmUgdXNlZCB0bwogICBwYW4gYWNyb3NzIHRoZSBsYXJnZSBhcmVhLiBIb3dldmVyIG9uZSB1c2VyIHN0YXJ0ZWQgdHdvIHgxMXZuYydzLCBvbmUKICAgd2l0aCAiLWNsaXAgMTI4MHgxMDI0KzArMCIgYW5kIHRoZSBvdGhlciB3aXRoICItY2xpcCAxMjgweDEwMjQrMTI4MCswIgogICB0byBzcGxpdCB0aGUgYmlnIHNjcmVlbiBpbnRvIHR3byBhbmQgdXNlZCB0d28gVk5DIHZpZXdlcnMgdG8gYWNjZXNzCiAgIHRoZW0uCgogICBBcyBvZiBKdW4vMjAwODogVXNlICItY2xpcCB4aW5lcmFtYTAiIHRvIGNsaXAgdG8gdGhlIGZpcnN0IHhpbmVyYW1hCiAgIHN1Yi1zY3JlZW4gKGlmIHhpbmVyYW1hIGlzIGFjdGl2ZS4pIHhpbmVyYW1hMSBmb3IgdGhlIDJuZCBzdWItc2NyZWVuLAogICBldGMuIFRoaXMgd2F5IHlvdSBkb24ndCBuZWVkIHRvIGZpZ3VyZSBvdXQgdGhlIFd4SCtYK1kgb2YgdGhlIGRlc2lyZWQKICAgeGluZXJhbWEgc3ViLXNjcmVlbi4gc2NyZWVucyBhcmUgc29ydGVkIGluIGluY3JlYXNpbmcgZGlzdGFuY2UgZnJvbQogICB0aGUgKDAsMCkgb3JpZ2luIChJLmUuIG5vdCB0aGUgWHNlcnZlcidzIG9yZGVyLikKCiAgIFRoZXJlIGFyZSBhIGNvdXBsZSBwb3RlbnRpYWwgaXNzdWVzIHdpdGggWGluZXJhbWEgaG93ZXZlci4gSWYgdGhlCiAgIHNjcmVlbiBpcyBub3QgcmVjdGFuZ3VsYXIgKGUuZy4gMTI4MHgxMDI0IGFuZCAxMDI0eDc2OCBtb25pdG9ycyBqb2luZWQKICAgdG9nZXRoZXIpLCB0aGVuIHRoZXJlIHdpbGwgYmUgIm5vbi1leGlzdGVudCIgYXJlYXMgb24gdGhlIHNjcmVlbi4gVGhlCiAgIFggc2VydmVyIHdpbGwgcmV0dXJuICJnYXJiYWdlIiBpbWFnZSBkYXRhIGZvciB0aGVzZSBhcmVhcyBhbmQgc28gdGhleQogICBtYXkgYmUgZGlzdHJhY3RpbmcgdG8gdGhlIHZpZXdlci4gVGhlIC1ibGFja291dCB4MTF2bmMgb3B0aW9uIGFsbG93cwogICB5b3UgdG8gYmxhY2tlbi1vdXQgcmVjdGFuZ2xlcyBieSBtYW51YWxseSBzcGVjaWZ5aW5nIHRoZWlyIFd4SCtYK1kKICAgZ2VvbWV0cmllcy4gSWYgeW91ciBzeXN0ZW0gaGFzIHRoZSBsaWJYaW5lcmFtYSBsaWJyYXJ5LCB0aGUgLXhpbmVyYW1hCiAgIHgxMXZuYyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gaGF2ZSBpdCBhdXRvbWF0aWNhbGx5IGRldGVybWluZSB0aGUKICAgcmVjdGFuZ2xlcyB0byBiZSBibGFja2VuZWQgb3V0LiAoTm90ZSBvbiA4YnBwIFBzZXVkb0NvbG9yIGRpc3BsYXlzIHRoZQogICBmaWxsIGNvbG9yIG1heSBub3QgYmUgYmxhY2suKSBVcGRhdGU6IC14aW5lcmFtYSBpcyBub3cgb24gYnkgZGVmYXVsdC4KCiAgIFNvbWUgdXNlcnMgaGF2ZSByZXBvcnRlZCB0aGF0IHRoZSBtb3VzZSBkb2VzIG5vdCBiZWhhdmUgcHJvcGVybHkgZm9yCiAgIHRoZWlyIFhpbmVyYW1hIGRpc3BsYXk6IGkuZS4gdGhlIG1vdXNlIGNhbm5vdCBiZSBtb3ZlZCB0byBhbGwgcmVnaW9ucwogICBvZiB0aGUgbGFyZ2UgZGlzcGxheS4gSWYgdGhpcyBoYXBwZW5zIHRyeSB1c2luZyB0aGUgLXh3YXJwcG9pbnRlcgogICBvcHRpb24uIFRoaXMgaW5zdHJ1Y3RzIHgxMXZuYyB0byBmYWtlIG1vdXNlIHBvaW50ZXIgbW90aW9ucyB1c2luZyB0aGUKICAgWFdhcnBQb2ludGVyIGZ1bmN0aW9uIGluc3RlYWQgb2YgdGhlIFhUZXN0RmFrZU1vdGlvbkV2ZW50IFhURVNUCiAgIGZ1bmN0aW9uLiAoVGhpcyBtYXkgYmUgZHVlIHRvIGEgYnVnIGluIHRoZSBYIHNlcnZlciBmb3IgWFRFU1Qgd2hlbgogICBYaW5lcmFtYSBpcyBlbmFibGVkLikgVXBkYXRlOiBBcyBvZiBEZWMvMjAwNiAteHdhcnBwb2ludGVyIHdpbGwgYmUKICAgYXBwbGllZCBhdXRvbWF0aWNhbGx5IGlmIFhpbmVyYW1hIGlzIGRldGVjdGVkLiBUbyBkaXNhYmxlIHVzZToKICAgLW5veHdhcnBwb2ludGVyCgoKICAgUS0xMDI6IENhbiBJIHVzZSB4MTF2bmMgb24gYSBtdWx0aS1oZWFkZWQgZGlzcGxheSB0aGF0IGlzIG5vdCBYaW5lcmFtYQogICAoaS5lLiBzZXBhcmF0ZSBzY3JlZW5zIDowLjAsIDowLjEsIC4uLiBmb3IgZWFjaCBtb25pdG9yKT8KCiAgIFlvdSBjYW4sIGJ1dCBpdCBpcyBhIGxpdHRsZSBiaXQgYXdrd2FyZDogeW91IG11c3Qgc3RhcnQgc2VwYXJhdGUKICAgeDExdm5jIHByb2Nlc3NlcyBmb3IgZWFjaCBzY3JlZW4sIGFuZCBvbiB0aGUgdmlld2luZyBlbmQgc3RhcnQgdXAKICAgc2VwYXJhdGUgVk5DIHZpZXdlciBwcm9jZXNzZXMgY29ubmVjdGluZyB0byB0aGVtLiBlLmcuIG9uIHRoZSByZW1vdGUKICAgZW5kOgogIHgxMXZuYyAtZGlzcGxheSA6MC4wIC1iZyAtcSAtcmZicG9ydCA1OTAwCiAgeDExdm5jIC1kaXNwbGF5IDowLjEgLWJnIC1xIC1yZmJwb3J0IDU5MDEKCiAgICh0aGlzIGNvdWxkIGJlIGF1dG9tYXRlZCBpbiB0aGUgZGlzcGxheSBtYW5hZ2VyIFhzZXR1cCBmb3IgZXhhbXBsZSkKICAgYW5kIHRoZW4gb24gdGhlIGxvY2FsIG1hY2hpbmUgd2hlcmUgeW91IGFyZSBzaXR0aW5nOgogIHZuY3ZpZXdlciBzb21laG9zdDowICYKICB2bmN2aWV3ZXIgc29tZWhvc3Q6MSAmCgogICBOb3RlOiBpZiB5b3UgYXJlIHJ1bm5pbmcgb24gU29sYXJpcyA4IG9yIGVhcmxpZXIgeW91IGNhbiBlYXNpbHkgaGl0IHVwCiAgIGFnYWluc3QgdGhlIG1heGltdW0gb2YgNiBzaG0gc2VnbWVudHMgcGVyIHByb2Nlc3MgKGZvciBYc3VuIGluIHRoaXMKICAgY2FzZSkgZnJvbSBydW5uaW5nIG11bHRpcGxlIHgxMXZuYyBwcm9jZXNzZXMuIFlvdSBzaG91bGQgbW9kaWZ5CiAgIC9ldGMvc3lzdGVtIGFzIG1lbnRpb25lZCBpbiBhbm90aGVyIEZBUSB0byBpbmNyZWFzZSB0aGUgbGltaXQuIEl0IGlzCiAgIHByb2JhYmx5IGFsc28gYSBnb29kIGlkZWEgdG8gcnVuIHdpdGggdGhlIC1vbmV0aWxlIG9wdGlvbiBpbiB0aGlzIGNhc2UKICAgKHRvIGxpbWl0IGVhY2ggeDExdm5jIHRvIDMgc2htIHNlZ21lbnRzKSwgb3IgZXZlbiAtbm9zaG0gdG8gdXNlIG5vIHNobQogICBzZWdtZW50cy4KCgogICBRLTEwMzogQ2FuIHgxMXZuYyBzaG93IG9ubHkgYSBwb3J0aW9uIG9mIHRoZSBkaXNwbGF5PyAoRS5nLiBmb3IgYQogICBzcGVjaWFsIHB1cnBvc2UgYXBwbGljYXRpb24gb3IgYSB2ZXJ5IGxhcmdlIHNjcmVlbi4pCgogICBBcyBvZiBNYXIvMjAwNSB4MTF2bmMgaGFzIHRoZSAiLWNsaXAgV3hIK1grWSIgb3B0aW9uIHRvIHNlbGVjdCBhCiAgIHJlY3RhbmdsZSBvZiB3aWR0aCBXLCBoZWlnaHQgSCBhbmQgb2Zmc2V0IChYLCBZKS4gVGh1cyB0aGUgVk5DIHNjcmVlbgogICB3aWxsIGJlIHRoZSBjbGlwcGVkIHN1Yi1yZWdpb24gb2YgdGhlIGRpc3BsYXkgYW5kIGJlIG9ubHkgV3hIIGluIHNpemUuCiAgIE9uZSB1c2VyIHVzZWQgLWNsaXAgdG8gc3BsaXQgdXAgYSBsYXJnZSBYaW5lcmFtYSBzY3JlZW4gaW50byB0d28gbW9yZQogICBtYW5hZ2FibGUgc21hbGxlciBzY3JlZW5zLgoKICAgVGhpcyBhbHNvIHdvcmtzIHRvIHZpZXcgYSBzdWItcmVnaW9uIG9mIGEgc2luZ2xlIGFwcGxpY2F0aW9uIHdpbmRvdyBpZgogICB0aGUgLWlkIG9yIC1zaWQgb3B0aW9ucyBhcmUgdXNlZC4gVGhlIG9mZnNldCBpcyBtZWFzdXJlZCBmcm9tIHRoZQogICB1cHBlciBsZWZ0IGNvcm5lciBvZiB0aGUgc2VsZWN0ZWQgd2luZG93LgoKCiAgIFEtMTA0OiBEb2VzIHgxMXZuYyBzdXBwb3J0IHRoZSBYUkFORFIgKFggUmVzaXplLCBSb3RhdGUgYW5kCiAgIFJlZmxlY3Rpb24pIGV4dGVuc2lvbj8gV2hlbmV2ZXIgSSByb3RhdGUgb3IgcmVzaXplIHRoZSBzY3JlZW4geDExdm5jCiAgIGp1c3Qgc2VlbXMgdG8gY3Jhc2guCgogICBBcyBvZiBEZWMvMjAwNCB4MTF2bmMgc3VwcG9ydHMgWFJBTkRSLiBZb3UgZW5hYmxlIGl0IHdpdGggdGhlIC14cmFuZHIKICAgb3B0aW9uIHRvIG1ha2UgeDExdm5jIG1vbml0b3IgWFJBTkRSIGV2ZW50cyBhbmQgYWxzbyB0cmFwIFggc2VydmVyCiAgIGVycm9ycyBpZiB0aGUgc2NyZWVuIGNoYW5nZSBvY2N1cnJlZCBpbiB0aGUgbWlkZGxlIG9mIGFuIFggY2FsbCBsaWtlCiAgIFhHZXRJbWFnZS4gT25jZSBpdCB0cmFwcyB0aGUgc2NyZWVuIGNoYW5nZSBpdCB3aWxsIGNyZWF0ZSBhIG5ldwogICBmcmFtZWJ1ZmZlciB1c2luZyB0aGUgbmV3IHNjcmVlbi4KCiAgIElmIHRoZSBjb25uZWN0ZWQgdm5jIHZpZXdlcnMgc3VwcG9ydCB0aGUgTmV3RkJTaXplIFZOQyBleHRlbnNpb24KICAgKFdpbmRvd3MgVGlnaHRWTkMgdmlld2VyIGFuZCBSZWFsVk5DIDQuMCB3aW5kb3dzIGFuZCBVbml4IHZpZXdlcnMgZG8pCiAgIHRoZW4gdGhlIHZpZXdlciB3aWxsIGF1dG9tYXRpY2FsbHkgcmVzaXplLiBPdGhlcndpc2UsIHRoZSBuZXcKICAgZnJhbWVidWZmZXIgaXMgZml0IGFzIGJlc3QgYXMgcG9zc2libGUgaW50byB0aGUgb3JpZ2luYWwgdmlld2VyIHNpemUKICAgKHBvcnRpb25zIG9mIHRoZSBzY3JlZW4gbWF5IGJlIGNsaXBwZWQsIHVudXNlZCwgZXRjLikgRm9yIHRoZXNlCiAgIHZpZXdlcnMgeW91IGNhbiB0cnkgdGhlIC1wYWRnZW9tIG9wdGlvbiB0byBtYWtlIHRoZSByZWdpb24gYmlnIGVub3VnaAogICB0byBob2xkIGFsbCByZXNpemVzIGFuZCByb3RhdGlvbnMuIFdlIGhhdmUgZml4ZWQgdGhpcyBwcm9ibGVtIGZvciB0aGUKICAgVGlnaHRWTkMgVmlld2VyIG9uIFVuaXg6IFNTVk5DCgogICBJZiB5b3Ugc3BlY2lmeSAiLXhyYW5kciBuZXdmYnNpemUiIHRoZW4gdm5jIHZpZXdlcnMgdGhhdCBkbyBub3QKICAgc3VwcG9ydCBOZXdGQlNpemUgd2lsbCBiZSBkaXNjb25uZWN0ZWQgYmVmb3JlIHRoZSByZXNpemUuIElmIHlvdQogICBzcGVjaWZ5ICIteHJhbmRyIGV4aXQiIHRoZW4gYWxsIHdpbGwgYmUgZGlzY29ubmVjdGVkIGFuZCB4MTF2bmMgd2lsbAogICB0ZXJtaW5hdGUuCgoKICAgUS0xMDU6IEluZGVwZW5kZW50IG9mIGFueSBYUkFORFIsIGNhbiBJIGhhdmUgeDExdm5jIHJvdGF0ZSBhbmQvb3IKICAgcmVmbGVjdCB0aGUgc2NyZWVuIHRoYXQgdGhlIFZOQyB2aWV3ZXJzIHNlZT8gKGUuZy4gZm9yIGEgaGFuZGhlbGQKICAgd2hvc2Ugc2NyZWVuIGlzIHJvdGF0ZWQgOTAgZGVncmVlcy4pCgogICBBcyBvZiBKdWwvMjAwNiB0aGVyZSBpcyB0aGUgLXJvdGF0ZSBvcHRpb24gYWxsb3cgdGhpcy4gRS5nJ3M6ICItcm90YXRlCiAgICs5MCIsICItcm90YXRlIC05MCIsICItcm90YXRlIHgiLCBldGMuCgoKICAgUS0xMDY6IFdoeSBpcyB0aGUgdmlldyBpbiBteSBWTkMgdmlld2VyIGNvbXBsZXRlbHkgYmxhY2s/IE9yIHdoeSBpcwogICBldmVyeXRoaW5nIGZsYXNoaW5nIGFyb3VuZCByYW5kb21seT8KCiAgIFNlZSB0aGUgbmV4dCBGQVEgZm9yIGEgcG9zc2libGUgZXhwbGFuYXRpb24uCgoKICAgUS0xMDc6IEkgdXNlIExpbnV4IFZpcnR1YWwgVGVybWluYWxzIChWVCdzKSB0byBpbXBsZW1lbnQgJ0Zhc3QgVXNlcgogICBTd2l0Y2hpbmcnIGJldHdlZW4gdXNlcnMnIHNlc3Npb25zIChlLmcuIEJldHR5IGlzIG9uIEN0cmwtQWx0LUY3LAogICBCb2JieSBpcyBvbiBDdHJsLUFsdC1GOCwgYW5kIFNpZCBpcyBvbiBDdHJsLUFsdC1GMTogdGhleSB1c2UgdGhvc2UKICAga2V5c3Ryb2tlcyB0byBzd2l0Y2ggYmV0d2VlbiB0aGVpciBzZXNzaW9ucy4pICAgSG93IGNvbWUgdGhlIHZpZXcgaW4gYQogICBWTkMgdmlld2VyIGNvbm5lY3RpbmcgdG8geDExdm5jIGlzIGVpdGhlciBjb21wbGV0ZWx5IGJsYWNrIG9yCiAgIG90aGVyd2lzZSBhbGwgbWVzc2VkIHVwIHVubGVzcyB0aGUgWCBzZXNzaW9uIHgxMXZuYyBpcyBhdHRhY2hlZCB0byBpcwogICBpbiB0aGUgYWN0aXZlIFZUPwoKICAgVGhpcyBzZWVtcyB0byBoYXZlIHRvIGRvIHdpdGggaG93IGFwcGxpY2F0aW9ucyAodGhlIFggc2VydmVyIHByb2Nlc3NlcwogICBpbiB0aGlzIGNhc2UpIG11c3QgInBsYXkgbmljZWx5IiBpZiB0aGV5IGFyZSBub3Qgb24gdGhlIGFjdGl2ZSBWVAogICAoc29tZXRpbWVzIGNhbGxlZCBWQyBmb3IgdmlydHVhbCBjb25zb2xlLikgVGhhdCBpcywgdGhleSBzaG91bGQgbm90CiAgIHJlYWQgZnJvbSB0aGUga2V5Ym9hcmQgb3IgbW91c2Ugb3IgbWFuYWdlIHRoZSB2aWRlbyBkaXNwbGF5IHVubGVzcwogICB0aGV5IGhhdmUgdGhlIGFjdGl2ZSBWVC4gR2l2ZW4gdGhhdCBpdCBhcHBlYXJzIHRoZSBYR2V0SW1hZ2UoKSBjYWxsCiAgIG11c3QgdWx0aW1hdGVseSByZXRyaWV2ZSB0aGUgZnJhbWVidWZmZXIgZGF0YSBmcm9tIHRoZSB2aWRlbyBoYXJkd2FyZQogICBpdHNlbGYsIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgeDExdm5jJ3MgcG9sbGluZyB3b3VsZG4ndCB3b3JrIHVubGVzcyB0aGUKICAgWCBzZXNzaW9uIGhhZCBhY3RpdmUgY29udHJvbCBvZiB0aGUgVlQuCgogICBUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGFuIGVhc3kgd2F5IHRvIHdvcmsgYXJvdW5kIHRoaXMuIEV2ZW4geHdkKDEpCiAgIGRvZXNuJ3Qgd29yayBpbiB0aGlzIGNhc2UgKHRyeSBpdC4pIFNvbWV0aGluZyB3b3VsZCBuZWVkIHRvIGJlIGRvbmUgYXQKICAgYSBsb3dlciBsZXZlbCwgc2F5IGluIHRoZSBYRnJlZTg2L1hvcmcgWCBzZXJ2ZXIuIEFsc28sIHVzaW5nIHRoZQogICBTaGFkb3cgRnJhbWVidWZmZXIgKGEgY29weSBvZiB0aGUgdmlkZW8gZnJhbWVidWZmZXIgaXMga2VwdCBpbiBtYWluCiAgIG1lbW9yeSkgZG9lcyBub3QgYXBwZWFyIHRvIGZpeCB0aGUgcHJvYmxlbS4KCiAgIElmIG5vIG9uZSBpcyBzaXR0aW5nIGF0IHRoZSB3b3Jrc3RhdGlvbiBhbmQgeW91IGp1c3Qgd2FudCB0byByZW1vdGVseQogICBzd2l0Y2ggdGhlIFZUIG92ZXIgdG8gdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggeW91ciBYIHNlc3Npb24gKHNvCiAgIHgxMXZuYyBjYW4gcG9sbCBpdCBjb3JyZWN0bHkpLCBvbmUgY2FuIHVzZSB0aGUgY2h2dCgxKSBjb21tYW5kLCBlLmcuCiAgICJjaHZ0IDciIGZvciBWVCAjNy4KCgogICBRLTEwODogSSBhbSB1c2luZyB4MTF2bmMgd2hlcmUgbXkgbG9jYWwgbWFjaGluZSBoYXMgInBvcHVwL2hpZGRlbgogICB0YXNrYmFycyIgYW5kIHRoZSByZW1vdGUgZGlzcGxheSB3aGVyZSB4MTF2bmMgcnVucyBhbHNvIGhhcwogICAicG9wdXAvaGlkZGVuIHRhc2tiYXJzIiBhbmQgdGhleSBpbnRlcmZlcmUgYW5kIGZpZ2h0IHdpdGggZWFjaCBvdGhlci4KICAgV2hhdCBjYW4gSSBkbz8KCiAgIFdoZW4geW91IG1vdmUgdGhlIG1vdXNlIHRvIHRoZSBlZGdlIG9mIHRoZSBzY3JlZW4gd2hlcmUgdGhlIHBvcHVwcwogICBoYXBwZW4sIHRoZSB0YXNrYmFycyBpbnRlcmZlcmUgd2l0aCBlYWNoIG90aGVyIGluIHN0cmFuZ2Ugd2F5cy4gVGhpcwogICBzb21ldGltZXMgaGFwcGVucyB3aGVyZSB0aGUgbG9jYWwgbWFjaGluZSBpcyBHTk9NRSBvciBNYWMgT1MgWCBhbmQgdGhlCiAgIHJlbW90ZSBtYWNoaW5lIGlzIEdOT01FLiBJcyB0aGVyZSBhIHdheSB0byB0ZW1wb3JhcmlseSBkaXNhYmxlIG9uZSBvcgogICBib3RoIG9mIHRoZXNlIG1hZ2ljIGRlc2t0b3AgdGFza2JhcnM/CgogICBPbmUgeDExdm5jIHVzZXIgc3VnZ2VzdHM6IGl0IHNob3VsZCBiZSBzdHJhaWdodGZvcndhcmQgdG8gcmlnaHQgbW91c2UKICAgY2xpY2sgb24gdGhlIHRhc2sgYmFyIHBhbmVsLCBhbmQgdW5jaGVjayAiZW5hYmxlIGF1dG8taGlkZSIgZnJvbSB0aGUKICAgcGFuZWwgcHJvcGVydGllcyBkaWFsb2cgYm94LiBUaGlzIHdpbGwgbWFrZSB0aGUgcGFuZWwgYWx3YXlzIHZpc2libGUuCgogICBRLTEwOTogSGVscCEgeDExdm5jIGFuZCBteSBLREUgc2NyZWVuc2F2ZXIga2VlcCBzd2l0Y2hpbmcgZWFjaCBvdGhlcgogICBvbiBhbmQgb2ZmIGV2ZXJ5IGZldyBzZWNvbmRzLgoKICAgVGhpcyBpcyBhIG5ldyAoSnVsLzIwMDYpIHByb2JsZW0gc2Vlbiwgc2F5LCBvbiB0aGUgdmVyc2lvbiBvZiBLREUgdGhhdAogICBpcyBzaGlwcGVkIHdpdGggU3VTRSAxMC4xLiBJdCBpcyBub3QgeWV0IGNsZWFyIHdoYXQgaXMgY2F1c2luZyB0aGlzLi4uCiAgIElmIHlvdSBtb3ZlIHRoZSBtb3VzZSB0aHJvdWdoIHgxMXZuYyB0aGUgc2NyZWVuc2F2ZXIgc2h1dHMgb2ZmIGxpa2UgaXQKICAgc2hvdWxkIGJ1dCB0aGVuIGEgc2Vjb25kIG9yIHR3byBhZnRlciB5b3Ugc3RvcCBtb3ZpbmcgdGhlIG1vdXNlIHRoZQogICBzY3JlZW5zYXZlciBzbmFwcyBiYWNrIG9uLgoKICAgVGhpcyBtYXkgYmUgYSBidWcgaW4ga2Rlc2t0b3BfbG9jay4gRm9yIG5vdyB0aGUgb25seSB3b3JrYXJvdW5kIGlzIHRvCiAgIGRpc2FibGUgdGhlIHNjcmVlbnNhdmVyLiBZb3UgY2FuIHRyeSB1c2luZyBhbm90aGVyIG9uZSBzdWNoIGFzCiAgIHN0cmFpZ2h0IHhzY3JlZW5zYXZlciAoc2VlIHRoZSBpbnN0cnVjdGlvbnMgaGVyZSBmb3IgaG93IHRvIGRpc2FibGUKICAga2Rlc2t0b3BfbG9jay4pIElmIHlvdSBoYXZlIG1vcmUgaW5mbyBvbiB0aGlzIG9yIHNlZSBpdCBvdXRzaWRlIG9mIEtERQogICBwbGVhc2UgbGV0IHVzIGtub3cuCgogICBVcGRhdGU6IEl0IGFwcGVhcnMgdGhpcyBpcyBkdWUgdG8ga2Rlc2t0b3BfbG9jayBlbmFibGluZyB0aGUgc2NyZWVuCiAgIHNhdmVyIHdoZW4gdGhlIE1vbml0b3IgaXMgaW4gRFBNUyBsb3ctcG93ZXIgc3RhdGUgKGUuZy4gc3RhbmRieSwKICAgc3VzcGVuZCwgb3Igb2ZmLikgSW4gTm92LzIwMDYgdGhlIHgxMXZuYyAtbm9kcG1zIG9wdGlvbiB3YXMgYWRkZWQgYXMgYQogICB3b3JrYXJvdW5kLiBOb3JtYWxseSBpdCBpcyBhIGdvb2QgdGhpbmcgdGhhdCB0aGUgbW9uaXRvciBwb3dlcnMgZG93bgogICAoc2luY2UgeDExdm5jIGNhbiBzdGlsbCBwb2xsIHRoZSBmcmFtZWJ1ZmZlciBpbiB0aGlzIHN0YXRlKSwgYnV0IGlmCiAgIHlvdSBleHBlcmllbmNlIHRoZSBrZGVza3RvcF9sb2NrIHByb2JsZW0geW91IGNhbiBzcGVjaWZ5IHRoZSAiLW5vZHBtcyIKICAgb3B0aW9uIHRvIGtlZXAgdGhlIE1vbml0b3Igb3V0IG9mIGxvdyBwb3dlciBzdGF0ZSB3aGlsZSBWTkMgY2xpZW50cwogICBhcmUgY29ubmVjdGVkLiBUaGlzIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyB0eXBpbmcgInhzZXQgZHBtcyBmb3JjZQogICBvbiIgcGVyaW9kaWNhbGx5LiAoaWYgeW91IGRvbid0IHdhbnQgdG8gZG8gdGhlc2UgdGhpbmdzIGp1c3QgZGlzYWJsZQogICB0aGUgc2NyZWVuc2F2ZXIuKSBGZWVsIGZyZWUgdG8gZmlsZSBhIGJ1ZyBhZ2FpbnN0IGtkZXNrdG9wX2xvY2sgd2l0aAogICBLREUuCgogICBRLTExMDogSSBhbSBydW5uaW5nIHRoZSBjb21waXogM0Qgd2luZG93IG1hbmFnZXIgKG9yIGJlcnlsLCBNeXRoVHYsCiAgIEdvb2dsZSBFYXJ0aCwgb3Igc29tZSBvdGhlciBPcGVuR0wgYXBwKSBhbmQgSSBkbyBub3QgZ2V0IHNjcmVlbgogICB1cGRhdGVzIGluIHgxMXZuYy4KCiAgIFRoaXMgYXBwZWFycyB0byBiZSBiZWNhdXNlIHRoZSAzRCBPcGVuR0wvR0xYIGhhcmR3YXJlIHNjcmVlbiB1cGRhdGVzCiAgIGRvIG5vdCBnZXQgcmVwb3J0ZWQgdmlhIHRoZSBYREFNQUdFIG1lY2hhbmlzbS4gU28gdGhpcyBpcyBhIGJ1ZyBpbgogICBjb21waXovYmVyeWwgb3IgWERBTUFHRS9Yb3JnIG9yIHRoZSAocG9zc2libHkgM3JkIHBhcnR5KSB2aWRlbyBjYXJkCiAgIGRyaXZlci4KCiAgIEFzIGEgd29ya2Fyb3VuZCBhcHBseSB0aGUgLW5veGRhbWFnZSBvcHRpb24uIEFzIG9mIEZlYi8yMDA3IHgxMXZuYwogICB3aWxsIHRyeSB0byBhdXRvZGV0ZWN0IHRoZSBwcm9ibGVtIGFuZCBkaXNhYmxlIFhEQU1BR0UgaWYgaXMgYXBwZWFycwogICB0byBiZSBtaXNzaW5nIGEgbG90IG9mIHVwZGF0ZXMuIEJ1dCBpZiB5b3Uga25vdyB5b3UgYXJlIHVzaW5nIGNvbXBpegogICB5b3UgbWlnaHQgYXMgd2VsbCBhbHdheXMgc3VwcGx5IC1ub3hkYW1hZ2UuIFRoYW5rcyB0byB0aGlzIHVzZXIgd2hvCiAgIHJlcG9ydGVkIHRoZSBwcm9ibGVtIGFuZCBkaXNjb3ZlcmVkIHRoZSB3b3JrYXJvdW5kLgoKICAgQSBkZXZlbG9wZXIgZm9yIE1pbmlNeXRoIHJlcG9ydHMgdGhhdCB0aGUgJ2FscGhhcHVsc2UnIHRhZyBvZiB0aGUKICAgdGhlbWUgRy5BLk4uVC4gY2FuIGFsc28gY2F1c2UgcHJvYmxlbXMsIGFuZCBzaG91bGQgYmUgYXZvaWRlZCB3aGVuCiAgIHVzaW5nIFZOQy4KCiAgIFBsZWFzZSByZXBvcnQgYSBidWcgb3IgY29tcGxhaW50IHRvIEJlcnlsL0NvbXBpeiBhbmQvb3IgWG9yZyBhYm91dAogICB0aGlzOiBydW5uaW5nIHgxMXZuYyB3aXRoIC1ub3hkYW1hZ2UgZGlzYWJsZXMgYSBuaWNlIGltcHJvdmVtZW50IGluCiAgIHJlc3BvbnNpdmVuZXNzIChlc3BlY2lhbGx5IGZvciB0eXBpbmcpIGFuZCBhbHNvIGxlYWRzIHRvIHVubmVjZXNzYXJ5CiAgIENQVSBhbmQgbWVtb3J5IEkvTyBsb2FkIGR1ZSB0byB0aGUgZXh0cmEgcG9sbGluZy4KCiAgIFVwZGF0ZTogYXMgb2YgTWF5LzIwMTAgTlZJRElBIG1heSBoYXZlIGZpeGVkIHRoaXMgcHJvYmxlbSBpbiB0aGVpcgogICBwcm9wcmlldGFyeSBkcml2ZXJzLiBTZWUgdGhlIE5WSURJQSBSZWxlYXNlIE5vdGVzLiAobG9vayBmb3IKICAgJ3gxMXZuYycuKQoKICAgUS0xMTE6IENhbiBJIHVzZSB4MTF2bmMgdG8gdmlldyBteSBWTVdhcmUgc2Vzc2lvbiByZW1vdGVseT8KCiAgIFllcywgc2luY2UgVk1XYXJlIHVzdWFsbHkgcnVucyBhcyBhbiBYIGFwcGxpY2F0aW9uIHlvdSBjYW4gdmlldyBpdCB2aWEKICAgeDExdm5jIGluIHRoZSBub3JtYWwgd2F5LgoKICAgTm90ZSB0aGF0IFZNV2FyZSBoYXMgc2V2ZXJhbCB2aWV3aW5nIG1vZGVzOgogICAgICogTm9ybWFsIFggYXBwbGljYXRpb24gd2luZG93ICAod2l0aCB3aW5kb3cgbWFuYWdlciBmcmFtZSkKICAgICAqIFF1aWNrLVN3aXRjaCBtb2RlICAod2l0aCBubyB3aW5kb3cgbWFuYWdlciBmcmFtZSkKICAgICAqIEZ1bGxzY3JlZW4gbW9kZQoKICAgVGhlIHdheSBWTVdhcmUgZG9lcyBGdWxsc2NyZWVuIG1vZGUgb24gTGludXggaXMgdG8gZGlzcGxheSB0aGUgR3Vlc3QKICAgZGVza3RvcCBpbiBhIHNlcGFyYXRlIFZpcnR1YWwgVGVybWluYWwgKGUuZy4gVlQgOCkgKHNlZSB0aGlzIEZBUSBvbgogICBWVCdzIGZvciBiYWNrZ3JvdW5kLikgVW5mb3J0dW5hdGVseSwgdGhpcyBGdWxsc2NyZWVuIFZUIGlzIG5vdCBhbiBYCiAgIHNlcnZlci4gU28geDExdm5jIGNhbm5vdCBhY2Nlc3MgaXQgKGhvd2V2ZXIsIHNlZSB0aGlzIGRpc2N1c3Npb24gb2YKICAgLXJhd2ZiIGZvciBhIHBvc3NpYmxlIHdvcmthcm91bmQuKSB4MTF2bmMgd29ya3MgZmluZSB3aXRoICJOb3JtYWwgWAogICBhcHBsaWNhdGlvbiB3aW5kb3ciIGFuZCAiUXVpY2stU3dpdGNoIG1vZGUiIGJlY2F1c2UgdGhlc2UgdXNlIFguCgogICBVcGRhdGU6IEl0IGFwcGVhcnMgdGhlIGluIFZNV2FyZSA1LnggdGhlIEZ1bGxzY3JlZW4gbW9kZSBpcyBYLCBzbwogICB4MTF2bmMgYWNjZXNzIGRvZXMgd29yay4KCiAgIE9uZSB1c2VyIHJlcG9ydHMgaGUgbGVmdCBoaXMgbWFjaGluZSB3aXRoIFZNV2FyZSBpbiB0aGUgRnVsbHNjcmVlbgogICBtb2RlLCBhbmQgZXZlbiB0aG91Z2ggaGlzIFggc2Vzc2lvbiB3YXNuJ3QgaW4gdGhlIGFjdGl2ZSBWVCwgaGUgY291bGQKICAgc3RpbGwgY29ubmVjdCB4MTF2bmMgdG8gdGhlIFggc2Vzc2lvbiBhbmQgcGFzcyB0aGUga2V5c3Ryb2tlcyBDdHJsLUFsdAogICAodHlwaW5nICJibGluZCIpIHRvIHRoZSBWTVdhcmUgWCBhcHAuIFRoaXMgaW5kdWNlZCBWTVdhcmUgdG8gc3dpdGNoCiAgIG91dCBvZiBGdWxsc2NyZWVuIGludG8gTm9ybWFsIFggbW9kZSBhbmQgaGUgY291bGQgY29udGludWUgd29ya2luZyBpbgogICB0aGUgR3Vlc3QgZGVza3RvcCByZW1vdGVseS4KCgogICBBc2lkZTogU29tZXRpbWVzIGl0IGlzIGNvbnZlbmllbnQgKGZvciBwZXJmb3JtYW5jZSwgZXRjLikgdG8gc3RhcnQKICAgVk1XYXJlIGluIGl0cyBvd24gWCBzZXNzaW9uIHVzaW5nIHN0YXJ0eCgxKS4gVGhpcyBjYW4gYmUgdXNlZCB0byBoYXZlCiAgIGEgbWluaW1hbCB3aW5kb3cgbWFuZ2VyIChlLmcuIHR3bSBvciBldmVuIG5vIHdpbmRvdyBtYW5hZ2VyKSwgdG8KICAgaW1wcm92ZSByZXNwb25zZS4gT25lIGNhbiBhbHNvIGN1dCB0aGUgZGlzcGxheSBkZXB0aCAoZS5nLiB0byAxNmJwcCkKICAgaW4gdGhpcyAybmQgWCBzZXNzaW9uIHRvIGltcHJvdmUgdmlkZW8gcGVyZm9ybWFuY2UuIFRoaXMgMm5kIFggc2Vzc2lvbgogICBlbXVsYXRlcyBGdWxsc2NyZWVuIG1vZGUgdG8gc29tZSBkZWdyZWUgYW5kIGNhbiBiZSB2aWV3ZWQgdmlhIHgxMXZuYwogICBhcyBsb25nIGFzIHRoZSBWTVdhcmUgWCBzZXNzaW9uIGlzIGluIHRoZSBhY3RpdmUgVlQuCgogICBBbHNvIG5vdGUgdGhhdCB3aXRoIGEgbGl0dGxlIGJpdCBvZiBwbGF5aW5nIHdpdGggInh3aW5pbmZvIC1hbGwKICAgLWNoaWxkcmVuIiBvdXRwdXQgb25lIGNhbiBleHRyYWN0IHRoZSAobm9uLXRvcGxldmVsKSB3aW5kb3ctaWQgb2YgdGhlCiAgIG9mIHRoZSBHdWVzdCBkZXNrdG9wIG9ubHkgd2hlbiBWTVdhcmUgaXMgcnVubmluZyBhcyBhIG5vcm1hbCBYCiAgIGFwcGxpY2F0aW9uLiBUaGVuIG9uZSBjYW4gZXhwb3J0IGp1c3QgdGhlIGd1ZXN0IGRlc2t0b3AgKGkuZS4gd2l0aG91dAogICB0aGUgVk1XYXJlIG1lbnUgYnV0dG9ucykgYnkgdXNlIG9mIHRoZSAtaWQgd2luZG93aWQgb3B0aW9uLiBUaGUKICAgY2F2ZWF0cyBhcmUgdGhlIFggc2Vzc2lvbiBWTVdhcmUgaXMgaW4gbXVzdCBiZSBpbiB0aGUgYWN0aXZlIFZUIGFuZAogICB0aGUgd2luZG93IG11c3QgYmUgZnVsbHkgdmlzaWJsZSwgc28gdGhpcyBtb2RlIGlzIG5vdCB0ZXJyaWJseQogICBjb252ZW5pZW50LCBidXQgY291bGQgYmUgdXNlZnVsIGluIHNvbWUgY2lyY3Vtc3RhbmNlcyAoZS5nLiBydW5uaW5nCiAgIFZNV2FyZSBvbiBhIHZlcnkgcG93ZXJmdWwgc2VydmVyIG1hY2hpbmUgaW4gYSBzZXJ2ZXIgcm9vbSB0aGF0IGhhcHBlbnMKICAgdG8gaGF2ZSBhIHZpZGVvIGNhcmQsIChidXQgbmVlZCBub3QgaGF2ZSBhIG1vbml0b3IsIEtleWJvYXJkIG9yCiAgIG1vdXNlKS4pCgoKCiAgIFtFeHBvcnRpbmcgbm9uLVgxMSBkZXZpY2VzIHZpYSBWTkNdCgogICBRLTExMjogQ2FuIG5vbi1YIGRldmljZXMgKGUuZy4gYSByYXcgZnJhbWVidWZmZXIpIGJlIHZpZXdlZCAoYW5kIGV2ZW4KICAgY29udHJvbGxlZCkgdmlhIFZOQyB3aXRoIHgxMXZuYz8KCiAgIEFzIG9mIEFwci8yMDA1IHRoZXJlIGlzIHN1cHBvcnQgZm9yIHRoaXMuIFR3byBvcHRpb25zIHdlcmUgYWRkZWQ6CiAgICItcmF3ZmIgc3RyaW5nIiAodG8gaW5kaWNhdGUgdGhlIHJhdyBmcmFtZSBidWZmZXIgZGV2aWNlLCBmaWxlLCBldGMuCiAgIGFuZCBpdHMgcGFyYW1ldGVycykgYW5kICItcGlwZWlucHV0IGNvbW1hbmQiICh0byBwcm92aWRlIGFuIGV4dGVybmFsCiAgIHByb2dyYW0gdGhhdCB3aWxsIGluamVjdCBvciBvdGhlcndpc2UgcHJvY2VzcyBtb3VzZSBhbmQga2V5c3Ryb2tlCiAgIGlucHV0LikgU29tZSB1c2VmdWwgLXBpcGVpbnB1dCBzY2hlbWVzLCBWSUQsIENPTlNPTEUsIGFuZCBVSU5QVVQsIGhhdmUKICAgc2luY2UgYmVlbiBidWlsdCBpbnRvIHgxMXZuYyBmb3IgY29udmVuaWVuY2UuCgogICBUaGlzIG5vbi1YIG1vZGUgZm9yIHgxMXZuYyBpcyBzb21ld2hhdCBleHBlcmltZW50YWwgYmVjYXVzZSBpdCBpcyBzbwogICByZW1vdmVkIGluIHNjb3BlIGZyb20gdGhlIGludGVuZGVkIHVzYWdlIG9mIHRoZSB0b29sLiBJbmNvbXBsZXRlCiAgIGF0dGVtcHQgaXMgbWFkZSB0byBtYWtlIGFsbCBvZiB0aGUgb3RoZXIgb3B0aW9ucyBjb25zaXN0ZW50IHdpdGggbm9uLVgKICAgZnJhbWVidWZmZXIgcG9sbGluZy4gU28gYWxsIG9mIHRoZSBYLXJlbGF0ZWQgb3B0aW9ucyAoZS5nLgogICAtYWRkX2tleXN5bXMsIC14a2IpIGFyZSBqdXN0IGlnbm9yZWQgb3IgbWF5IGNhdXNlIGFuIGVycm9yIGlmIHVzZWQuIEJlCiAgIGNhcmVmdWwgYXBwbHlpbmcgc3VjaCBhbiBvcHRpb24gdmlhIHJlbW90ZSBjb250cm9sLgoKICAgVGhlIGZvcm1hdCBmb3IgdGhlIC1yYXdmYiBzdHJpbmcgaXM6CiAgICAtcmF3ZmIgPHR5cGU+OjxvYmplY3Q+QDxXPng8SD54PGJwcD5bLTxCUEw+XVs6PFI+LzxHPi88Qj5dWys8b2Zmc2V0Pl0KCiAgIFRoZXJlIGFyZSBhbHNvIHNvbWUgdXNlZnVsIGFsaWFzZXMgKGUuZy4gImNvbnNvbGUiLikgU29tZSBleGFtcGxlczoKICAgIC1yYXdmYiBzaG06MjEwMzM3OTMzQDgwMHg2MDB4MzI6ZmYvZmYwMC9mZjAwMDAKCiAgICAtcmF3ZmIgbWFwOi9kZXYvZmIwQDEwMjR4NzY4eDE2CgogICAgLXJhd2ZiIG1hcDovdG1wL1h2ZmJfc2NyZWVuMEA2NDB4NDgweDgrMzIzMgoKICAgIC1yYXdmYiBmaWxlOi90bXAvbXkucG5tQDI1MHgyMDB4MjQrMzcKCiAgICAtcmF3ZmIgZmlsZTovZGV2L3VyYW5kb21AMTI4eDEyOHg4CgogICAgLXJhd2ZiIHNuYXA6L2Rldi92aWRlbzBAMzIweDI0MHgyNCAtMjR0bzMyCgogICAgLXJhd2ZiIGNvbnNvbGUKCiAgICAtcmF3ZmIgdnQyCgogICAgLXJhd2ZiIHZpZGVvCgogICAgLXJhd2ZiIHNldHVwOm15Y21kLnNoCgogICBTbyB0aGUgdHlwZSBjYW4gYmUgInNobSIgZm9yIHNoYXJlZCBtZW1vcnkgb2JqZWN0cywgYW5kICJtYXAiIG9yCiAgICJmaWxlIiBmb3IgZmlsZSBvYmplY3RzLiAibWFwIiB1c2VzIG1tYXAoMikgdG8gbWFwIHRoZSBmaWxlIGludG8KICAgbWVtb3J5IGFuZCBpcyBwcmVmZXJyZWQgb3ZlciAiZmlsZSIgKHRoYXQgdXNlcyB0aGUgc2xvd2VyIGxzZWVrKDIpCiAgIGFjY2VzcyBtZXRob2QuKSBPbmx5IHVzZSBmaWxlIGlmIG1hcCBpc24ndCB3b3JraW5nLiBCVFcsICJtbWFwIiBpcyBhbgogICBhbGlhcyBmb3IgIm1hcCIgYW5kIGlmIHlvdSBkbyBub3Qgc3VwcGx5IGEgdHlwZSBhbmQgdGhlIGZpbGUgZXhpc3RzLAogICBtYXAgaXMgYXNzdW1lZCAoc2VlIHRoZSAtaGVscCBvdXRwdXQgYW5kIGJlbG93IGZvciBzb21lIGV4Y2VwdGlvbnMgdG8KICAgdGhpcy4pIFRoZSAic25hcDoiIHNldHRpbmcgYXBwbGllcyB0aGUgLXNuYXBmYiBvcHRpb24gd2l0aCAiZmlsZToiCiAgIHR5cGUgcmVhZGluZyAodGhpcyBpcyB1c2VmdWwgZm9yIGV4cG9ydGluZyB3ZWJjYW1zIG9yIFRWIHR1bmVyIHZpZGVvOwogICBzZWUgdGhlIG5leHQgRkFRIGZvciBtb3JlIGluZm8uKQoKICAgQWxzbywgaWYgdGhlIHN0cmluZyBpcyBvZiB0aGUgZm9ybSAic2V0dXA6Y21kIiB0aGVuIGNtZCBpcyBydW4gYW5kIHRoZQogICBmaXJzdCBsaW5lIG9mIGl0cyBvdXRwdXQgcmV0cmlldmVkIGFuZCB1c2VkIGFzIHRoZSByYXdmYiBzdHJpbmcuIFRoaXMKICAgYWxsb3dzIGluaXRpYWxpemluZyB0aGUgZGV2aWNlLCBkZXRlcm1pbmluZyBXeEh4QiwgZXRjLgoKICAgVGhlIG9iamVjdCB3aWxsIGJlIHRoZSBudW1lcmljYWwgc2hhcmVkIG1lbW9yeSBpZCBmb3IgdGhlIGNhc2Ugb2Ygc2htLgogICBUaGUgaWRlYSBoZXJlIGlzIHNvbWUgb3RoZXIgcHJvZ3JhbSBoYXMgY3JlYXRlZCB0aGlzIHNoYXJlZCBtZW1vcnkKICAgc2VnbWVudCBhbmQgcGVyaW9kaWNhbGx5IHVwZGF0ZXMgaXQgd2l0aCBuZXcgZnJhbWVidWZmZXIgZGF0YS4geDExdm5jCiAgIHBvbGxzIHRoZSBhcmVhIGZvciBjaGFuZ2VzLiBTZWUgc2htYXQoMikgYW5kIGlwY3MoOCkgZm9yIG1vcmUgaW5mby4KICAgVGhlIGlwY3MgY29tbWFuZCB3aWxsIGxpc3QgY3VycmVudCBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzIG9uIHRoZQogICBzeXN0ZW0uIFNvbWV0aW1lcyB5b3UgY2FuIHNub29wIG9uIGEgcHJvZ3JhbSdzIGZyYW1lYnVmZmVyIGl0IGRpZCBub3QKICAgZXhwZWN0IHlvdSB3b3VsZCBiZSBwb2xsaW5nIQoKICAgVGhlIG9iamVjdCB3aWxsIGJlIHRoZSBwYXRoIHRvIHRoZSByZWd1bGFyIG9yIGNoYXJhY3RlciBzcGVjaWFsIGZpbGUKICAgZm9yIHRoZSBjYXNlcyBvZiBtYXAgYW5kIGZpbGUuIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCBpbiB0aGUgY2FzZSBvZiBhCiAgIHJlZ3VsYXIgZmlsZSBzb21lIG90aGVyIHByb2dyYW0gaXMgd3JpdGluZy91cGRhdGluZyBmcmFtZWJ1ZmZlciBpbWFnZQogICBkYXRhIHRvIGl0LiBJbiB0aGUgY2FzZSBvZiBhIGNoYXJhY3RlciBzcGVjaWFsIChlLmcuIC9kZXYvZmIwKSBpdCBpcwogICB0aGUga2VybmVsIHRoYXQgaXMgInVwZGF0aW5nIiB0aGUgZnJhbWVidWZmZXIgZGF0YS4KCiAgIEluIG1vc3QgY2FzZXMgeDExdm5jIG5lZWRzIHRvIGJlIHRvbGQgdGhlIHdpZHRoLCBoZWlnaHQsIGFuZCBudW1iZXIgb2YKICAgYml0cyBwZXIgcGl4ZWwgKGJwcCkgb2YgdGhlIGZyYW1lYnVmZmVyLiBUaGlzIGlzIHRoZSBAV3hIeEIgZmllbGQuIEZvcgogICB0aGUgY2FzZSBvZiB0aGUgTGludXggZnJhbWVidWZmZXIgZGV2aWNlLCAvZGV2L2ZiMCwgdGhlIGZic2V0KDgpIG1heQogICBiZSBvZiB1c2UgKGJ1dCBtYXkgbm90IGFsd2F5cyBiZSBhY2N1cmF0ZSBmb3Igd2hhdCBpcyBjdXJyZW50bHkKICAgdmlld2FibGUuKSBJbiBnZW5lcmFsIHNvbWUgZ3Vlc3NpbmcgbWF5IGJlIHJlcXVpcmVkLCBlc3BlY2lhbGx5IGZvcgogICB0aGUgYnBwLiBVcGRhdGU6IGluICItcmF3ZmIgY29uc29sZSIgbW9kZSB4MTF2bmMgd2lsbCB1c2UgdGhlIGxpbnV4ZmIKICAgQVBJIHRvIHRyeSB0byBndWVzcyAoaXQgaXMgc3RpbGwgbm90IGFsd2F5cyBhY2N1cmF0ZS4pIEFsc28gdHJ5CiAgICItcmF3ZmIgdnROIiAob24geDExdm5jIDAuOS43IGFuZCBsYXRlcikgZm9yIHRoZSBOLXRoIExpbnV4IHRleHQKICAgY29uc29sZSAoYWthIHZpcnR1YWwgdGVybWluYWwuKSBJZiB0aGUgbnVtYmVyIG9mIEJ5dGVzIFBlciBMaW5lIGlzIG5vdAogICBXeEh4Qi84IChpLmUuIHRoZSBmcmFtZWJ1ZmZlciBsaW5lcyBhcmUgcGFkZGVkKSB5b3UgY2FuIHNwZWNpZnkgdGhpcwogICBpbmZvcm1hdGlvbiBhZnRlciBXeEh4QiB2aWEgIi1CUEwiLCBlLmcuIEA4MDB4NjAweDE2LTIwNDgKCiAgIEJhc2VkIG9uIHRoZSBicHAgeDExdm5jIHdpbGwgdHJ5IHRvIGd1ZXNzIHRoZSByZWQsIGdyZWVuLCBhbmQgYmx1ZQogICBtYXNrcyAodGhlc2UgaW5kaWNhdGUgd2hpY2ggYml0cyBjb3JyZXNwb25kIHRvIGVhY2ggY29sb3IuKSBJdCBpZiBnZXRzCiAgIGl0IHdyb25nIHlvdSBjYW4gc3BlY2lmeSB0aGVtIG1hbnVhbGx5IHZpYSB0aGUgb3B0aW9uYWwgIjpSL0cvQiIKICAgZmllbGQuIEUuZy4gIjoweGZmMDAwMC8weDAwZmYwMC8weDAwMDBmZiIgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yCiAgIDMyYnBwLikKCiAgIEZpbmFsbHksIHRoZSBmcmFtZWJ1ZmZlciBtYXkgbm90IGJlZ2luIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG1lbW9yeQogICBvYmplY3QsIHNvIHVzZSB0aGUgb3B0aW9uYWwgIitvZmZzZXQiIHBhcmFtZXRlciB0byBpbmRpY2F0ZSB3aGVyZSB0aGUKICAgZnJhbWVidWZmZXIgaW5mb3JtYXRpb24gc3RhcnRzLiBTbyBhcyBhbiBleGFtcGxlLCB0aGUgWHZmYiB2aXJ0dWFsCiAgIGZyYW1lYnVmZmVyIGhhcyBvcHRpb25zIC1zaG1lbSBhbmQgLWZiZGlyIGZvciBleHBvcnRpbmcgaXRzIHZpcnR1YWwKICAgc2NyZWVuIHRvIGVpdGhlciBzaG0gb3IgYSBtYXBwZWQgZmlsZS4gVGhlIGZvcm1hdCBvZiB0aGVzZSBpcyBYV0QgYW5kCiAgIHNvIHRoZSBpbml0aWFsIGhlYWRlciBzaG91bGQgYmUgc2tpcHBlZC4gQlRXLCBzaW5jZSBYV0QgaXMgbm90CiAgIHN0cmljdGx5IFJHQiB0aGUgdmlldyB3aWxsIG9ubHkgYmUgYXBwcm94aW1hdGUsIGJ1dCB1c2FibGUuIE9mIGNvdXJzZQogICBmb3IgdGhlIGNhc2Ugb2YgWHZmYiB4MTF2bmMgY2FuIHBvbGwgaXQgbXVjaCBiZXR0ZXIgdmlhIHRoZSBYIEFQSSwgYnV0CiAgIHlvdSBnZXQgdGhlIGlkZWEuCgogICBCeSBkZWZhdWx0IGluIC1yYXdmYiBtb2RlIHgxMXZuYyB3aWxsIGFjdHVhbGx5IGNsb3NlIGFueSBYIGRpc3BsYXkgaXQKICAgaGFwcGVuZWQgdG8gb3Blbi4gVGhpcyBpcyBiYXNpY2FsbHkgdG8gc2hha2Ugb3V0IGJ1Z3MgKGUuZyBpdCB3aWxsCiAgIGNyYXNoIHJhdGhlciB0aGFuIG15c3RlcmlvdXNseSBpbnRlcmFjdGluZyB3aXRoIHRoZSBYIGRpc3BsYXkuKSBJZiB5b3UKICAgd2FudCB4MTF2bmMgdG8ga2VlcCB0aGUgWCBkaXNwbGF5IG9wZW4gd2hpbGUgcG9sbGluZyB0aGUgcmF3CiAgIGZyYW1lYnVmZmVyIHByZWZpeCBhICIrIiBzaWduIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmluZyAoZS5nLgogICArZmlsZTovZGV2L3VyYW5kb21ANjR4NjR4OCkgVGhpcyBjb3VsZCBiZSBjb252ZW5pZW50IGZvciBrZWVwaW5nIHRoZQogICByZW1vdGUgY29udHJvbCBjaGFubmVsIGFjdGl2ZSAoaXQgdXNlcyBYIHByb3BlcnRpZXMuKSBUaGUgIi1jb25uZWN0CiAgIC9wYXRoL3RvL2ZpbGUiIG1lY2hhbmlzbSBjb3VsZCBhbHNvIGJlIHVzZWQgZm9yIHJlbW90ZSBjb250cm9sIHRvCiAgIGF2b2lkIHRoZSBYIHByb3BlcnR5IGNoYW5uZWwuIFJhcmUgdXNhZ2UsIGJ1dCBpZiB5b3UgYWxzbyBzdXBwbHkKICAgLW5vdmlld29ubHkgaW4gdGhpcyAiKyIgbW9kZSB0aGVuIHRoZSBtb3VzZSBhbmQga2V5Ym9hcmQgaW5wdXQgYXJlCiAgIHN0aWxsIHNlbnQgdG8gdGhlIFggZGlzcGxheSwgcHJlc3VtYWJseSBmb3IgZG9pbmcgc29tZXRoaW5nIGFtdXNpbmcKICAgd2l0aCAvZGV2L2ZiLi4uCgogICBJbnRlcmVzdGluZyBEZXZpY2VzOi4gSGVyZSBhcmUgc29tZSBhbGlhc2VzIGZvciBpbnRlcmVzdGluZyBkZXZpY2UKICAgZmlsZXMgdGhhdCBjYW4gYmUgcG9sbGVkIHZpYSAtcmF3ZmI6CiAgIC1yYXdmYiBjb25zb2xlICAgICAgICAgICAgICAgL2Rldi9mYjAgICAgICAgIExpbnV4IENvbnNvbGUKICAgLXJhd2ZiIHZ0MiAgICAgICAgICAgICAgICAgICAvZGV2L3Zjc2EyICAgICAgTGludXggQ29uc29sZSAoZS5nLiB2aXJ0dWFsIHRlcgptaW5hbCAjMikKICAgLXJhd2ZiIHZpZGVvICAgICAgICAgICAgICAgICAvZGV2L3ZpZGVvMCAgICAgVmlkZW80TGludXggQ2FwdHVyZSBkZXZpY2UKICAgLXJhd2ZiIHJhbmQgICAgICAgICAgICAgICAgICAvZGV2L3VyYW5kb20gICAgUmFuZG9tIEJ5dGVzCiAgIC1yYXdmYiBudWxsICAgICAgICAgICAgICAgICAgL2Rldi96ZXJvICAgICAgIFplcm8gQnl0ZXMgKGJsYWNrIHNjcmVlbikKCiAgIFRoZSBMaW51eCBjb25zb2xlLCAvZGV2L2ZiMCwgZXRjIG5lZWRzIHRvIGhhdmUgaXRzIGRyaXZlciBlbmFibGVkIGluCiAgIHRoZSBrZXJuZWwuIFNvbWUgb2YgdGhlIGRyaXZlcnMgYXJlIHZpZGVvIGNhcmQgc3BlY2lmaWMgYW5kCiAgIGFjY2VsZXJhdGVkLiBUaGUgY29uc29sZSBpcyBlaXRoZXIgdGhlIFRleHQgY29uc29sZXMgKHVzdWFsbHkKICAgdHR5MS10dHk2KSwgb3IgWCBncmFwaGljYWwgZGlzcGxheSAodXN1YWxseSBzdGFydGluZyBhdCB0dHk3LikgSW4KICAgYWRkaXRpb24gdG8gdGhlIHRleHQgY29uc29sZSBvdGhlciBncmFwaGljYWwgb25lcyBtYXkgYmUgdmlld2VkIGFuZAogICBpbnRlcmFjdGVkIHdpdGggYXMgd2VsbCwgZS5nLiBEaXJlY3RGQiBvciBTVkdBbGliIGFwcHMsIFZNV2FyZSBub24tWAogICBmdWxsc2NyZWVuLCBvciBRdC1lbWJlZGRlZCBhcHBzIChQREFzL0hhbmRoZWxkcy4pIEJ5IGRlZmF1bHQgdGhlCiAgIHBpcGVpbnB1dCBtZWNoYW5pc21zIFVJTlBVVCBhbmQgQ09OU09MRSAoa2V5c3Ryb2tlcyBvbmx5KSBhcmUKICAgYXV0b21hdGljYWxseSBhdHRlbXB0ZWQgaW4gdGhpcyBtb2RlIHVuZGVyICItcmF3ZmIgY29uc29sZSIuCgogICBUaGUgVmlkZW80TGludXggQ2FwdHVyZSBkZXZpY2UsIC9kZXYvdmlkZW8wLCBldGMgaXMgZWl0aGVyIGEgV2ViY2FtIG9yCiAgIGEgVFYgY2FwdHVyZSBkZXZpY2UgYW5kIG5lZWRzIHRvIGhhdmUgaXRzIGRyaXZlciBlbmFibGVkIGluIHRoZQogICBrZXJuZWwuIFNlZSB0aGlzIEZBUSBmb3IgZGV0YWlscy4gSWYgc3BlY2lmaWVkIHZpYSAiLXJhd2ZiIFZpZGVvIiB0aGVuCiAgIHRoZSBwaXBlaW5wdXQgbWV0aG9kICJWSUQiIGlzIGFwcGxpZWQgKGl0IGxldHMgeW91IGNoYW5nZSB2aWRlbwogICBwYXJhbWV0ZXJzIGR5bmFtaWNhbGx5IHZpYSBrZXlzdHJva2VzLikKCiAgIFRoZSBsYXN0IHR3bywgL2Rldi91cmFuZG9tIGFuZCAvZGV2L3plcm8gYXJlIGp1c3QgZm9yIGZ1biwgYnV0IGFyZQogICBhbHNvIHVzZWZ1bCBpbiB0ZXN0aW5nLgoKCiAgIEFsbCBvZiB0aGUgYWJvdmUgLXJhd2ZiIG9wdGlvbnMgYXJlIGp1c3QgZm9yIHZpZXdpbmcgdGhlIHJhdwogICBmcmFtZWJ1ZmZlciAoYWx0aG91Z2ggc29tZSBvZiB0aGUgYWxpYXNlcyBkbyBpbXBseSBrZXlzdHJva2UgYW5kIG1vdXNlCiAgIHBpcGVpbnB1dCBtZXRob2RzLikgVGhhdCBtYXkgYmUgZW5vdWdoIGZvciBjZXJ0YWluIGFwcGxpY2F0aW9ucyBvZgogICB0aGlzIGZlYXR1cmUgKGUuZy4gc3VwcG9zZSBhIHZpZGVvIGNhbWVyYSBtYXBwZWQgaXRzIGZyYW1lYnVmZmVyIGludG8KICAgbWVtb3J5IGFuZCB5b3UganVzdCB3YW50ZWQgdG8gbG9vayBhdCBpdCB2aWEgVk5DLikKICAgVG8gaGFuZGxlIHRoZSBwb2ludGVyIGFuZCBrZXlib2FyZCBpbnB1dCBmcm9tIHRoZSB2aWV3ZXIgdXNlcnMgdGhlCiAgICItcGlwZWlucHV0IGNtZCIgb3B0aW9uIHdhcyBhZGRlZCB0byBpbmRpY2F0ZSBhIGhlbHBlciBwcm9ncmFtIHRvCiAgIHByb2Nlc3MgdGhlIHVzZXIgaW5wdXQuIFRoZSBpbnB1dCBpcyBzdHJlYW1lZCB0byBpdCBhbmQgbG9va3MKICAgc29tZXRoaW5nIGxpa2UgdGhpczoKICAgUG9pbnRlciAxIDIwNSAyNTcgMCBOb25lCiAgIFBvaW50ZXIgMSAxOTggMjUzIDAgTm9uZQogICBQb2ludGVyIDEgMTk4IDI1MyAxIEJ1dHRvblByZXNzLTEKICAgUG9pbnRlciAxIDE5OCAyNTMgMCBCdXR0b25SZWxlYXNlLTEKICAgUG9pbnRlciAxIDE5OCAyNTIgMCBOb25lCiAgIEtleXN5bSAxIDEgMTE5IHcgS2V5UHJlc3MKICAgS2V5c3ltIDEgMCAxMTkgdyBLZXlSZWxlYXNlCiAgIEtleXN5bSAxIDEgNjUyODggQmFja1NwYWNlIEtleVByZXNzCiAgIEtleXN5bSAxIDAgNjUyODggQmFja1NwYWNlIEtleVJlbGVhc2UKICAgS2V5c3ltIDEgMSAxMTIgcCBLZXlQcmVzcwogICBLZXlzeW0gMSAwIDExMiBwIEtleVJlbGVhc2UKCiAgIFJ1biAiLXBpcGVpbnB1dCB0ZWU6L2Jpbi9jYXQiIHRvIGdldCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQuIE5vdGUKICAgdGhhdCB0aGUgLXBpcGVpbnB1dCBvcHRpb24gaXMgaW5kZXBlbmRlbnQgb2YgLXJhd2ZiIG1vZGUgYW5kIHNvIG1heQogICBoYXZlIHNvbWUgb3RoZXIgaW50ZXJlc3RpbmcgdXNlcy4gVGhlICJ0ZWU6IiBwcmVmaXggbWVhbnMgeDExdm5jIHdpbGwKICAgYm90aCBwcm9jZXNzIHRoZSB1c2VyIGlucHV0IGFuZCBwaXBlIGl0IHRvIHRoZSBjb21tYW5kLiBUaGUgZGVmYXVsdCBpcwogICB0byBqdXN0IHBpcGUgaXQgdG8gdGhlIC1waXBlaW5wdXQgY29tbWFuZC4KCiAgIE5vdGUgdGhlIC1waXBlaW5wdXQgaGVscGVyIHByb2dyYW0gY291bGQgYWN0dWFsbHkgY29udHJvbCB0aGUgcmF3CiAgIGZyYW1lYnVmZmVyLiBJbiB0aGUgbGlidm5jc2VydmVyIENWUyBhIHNpbXBsZSBleGFtcGxlIHByb2dyYW0KICAgeDExdm5jL21pc2Mvc2xpZGUucGwgaXMgcHJvdmlkZWQgdGhhdCBkZW1vbnN0cmF0ZXMgYSBzaW1wbGUganBlZwogICAic2xpZGVzaG93IiBhcHBsaWNhdGlvbi4gQWxzbyB0aGUgYnVpbHRpbiAiLXBpcGVpbnB1dCBWSUQiIG1vZGUgZG9lcwogICB0aGlzIGZvciB3ZWJjYW1zIGFuZCBUViBjYXB0dXJlIGRldmljZXMgKC9kZXYvdmlkZW8wLikKCiAgIFRoZSAtcGlwZWlucHV0IHByb2dyYW0gaXMgcnVuIHdpdGggdGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNldDoKICAgWDExVk5DX1BJRCwgWDExVk5DX1BST0csIFgxMVZOQ19DTURMSU5FLCBYMTFWTkNfUkFXRkJfU1RSIHRvIGFpZCBpdHMKICAga25vd2luZyB3aGF0IGlzIHVwLgoKICAgQW5vdGhlciBleGFtcGxlIHByb3ZpZGVkIGluIGxpYnZuY3NlcnZlciBDVlMgaXMgYSBzY3JpcHQgdG8gaW5qZWN0CiAgIGtleXN0cm9rZXMgaW50byB0aGUgTGludXggY29uc29sZSAoZS5nLiB0aGUgdmlydHVhbCBjb25zb2xlczoKICAgL2Rldi90dHkxLCAvZGV2L3R0eTIsIGV0YykgaW4geDExdm5jL21pc2MvdmNpbmplY3QucGwuIEl0IGlzIGJhc2VkIG9uCiAgIHRoZSB2bmN0ZXJtL0xpbnV4Vk5DLmMgcHJvZ3JhbSBhbHNvIGluIHRoZSBsaWJ2bmNzZXJ2ZXIgQ1ZTLiBTbyB0bwogICB2aWV3IGFuZCBpbnRlcmFjdCB3aXRoIFZUICMyIChhc3N1bWluZyBpdCBpcyB0aGUgYWN0aXZlIFZUKSBvbmUgY2FuCiAgIHJ1biBzb21ldGhpbmcgbGlrZToKICB4MTF2bmMgLXJhd2ZiIG1hcDovZGV2L2ZiMEAxMDI0eDc2OHgxNiAtcGlwZWlucHV0ICcuL3ZjaW5qZWN0LnBsIDInCgogICBUaGlzIGFzc3VtZXMgeW91ciBMaW51eCBmcmFtZWJ1ZmZlciBkZXZpY2UgKC9kZXYvZmIwKSBpcyBwcm9wZXJseQogICBjb25maWd1cmVkLiBTZWUgZmJzZXQoOCkgYW5kIG90aGVyIGRvY3VtZW50YXRpb24uIFRyeQogICAiZmlsZTovZGV2L2ZiMEBXeEh4QiIgYXMgYSBsYXN0IHJlc29ydC4gU3RhcnRpbmcgd2l0aCB4MTF2bmMgMC44LjEsCiAgIHRoZSBhYm92ZSBWVCBpbmplY3Rpb24gaXMgYnVpbHQgaW4sIGFzIHdlbGwgYXMgV3hIeEIgZGV0ZXJtaW5hdGlvbi4KICAgSnVzdCB1c2Ugc29tZXRoaW5nIGxpa2U6CiAgeDExdm5jIC1yYXdmYiBjb25zb2xlCgogICB0aGlzIHdpbGwgdHJ5IHRvIGd1ZXNzIHRoZSBhY3RpdmUgdmlydHVhbCBjb25zb2xlICh2aWEgL2Rldi90dHkwKSBhbmQKICAgYWxzbyB0aGUgL2Rldi9mYjAgV3hIeEIgYW5kIHJnYiBtYXNrcyBhdXRvbWF0aWNhbGx5LiBVc2UsIGUuZy4sCiAgICItcmF3ZmIgY29uc29sZTMiIHRvIGZvcmNlIHRoZSBWVCBudW1iZXIuIFRoaXMgaW5wdXQgbWV0aG9kIGNhbiBiZQogICB1c2VkIGdlbmVyYWxseSB2aWEgIi1waXBlaW5wdXQgQ09OU09MRSIuIEFsc28gc3RhcnRpbmcgd2l0aCB4MTF2bmMKICAgMC44LjIgdGhlICItcGlwZWlucHV0IFVJTlBVVCIgbW9kZSBpcyB0cmllZCBmaXJzdCAoaXQgZG9lcyBib3RoCiAgIGtleWJvYXJkIGFuZCBtb3VzZSBpbnB1dCkgYW5kIHRoZW4gZmFsbHMgYmFjayB0byBDT05TT0xFIG1vZGUgaWYgaXQgaXMKICAgbm90IGF2YWlsYWJsZS4gSGVyZSBpcyB0aGUgLWhlbHAgb3V0cHV0IGZvciB0aGlzIG1vZGU6CgogICAgIElmIHRoZSByYXdmYiBzdHJpbmcgYmVnaW5zIHdpdGggImNvbnNvbGUiIHRoZSBmcmFtZWJ1ZmZlciBkZXZpY2UKICAgICAvZGV2L2ZiMCBpcyBvcGVuZWQgKHRoaXMgcmVxdWlyZXMgdGhlIGFwcHJvcHJpYXRlIGtlcm5lbCBtb2R1bGVzIHRvCiAgICAgYmUgaW5zdGFsbGVkKSBhbmQgc28gaXMgL2Rldi90dHkwLiBUaGUgbGF0dGVyIGlzIHVzZWQgdG8gaW5qZWN0CiAgICAga2V5c3Ryb2tlcyAobm90IGFsbCBhcmUgc3VwcG9ydGVkLCBidXQgdGhlIGJhc2ljIG9uZXMgYXJlLikgWW91CiAgICAgd2lsbCBuZWVkIHRvIGJlIHJvb3QgdG8gaW5qZWN0IGtleXN0cm9rZXMuIC9kZXYvdHR5MCByZWZlcnMgdG8gdGhlCiAgICAgYWN0aXZlIFZULCB0byBpbmRpY2F0ZSBvbmUgZXhwbGljaXRseSwgdXNlICJjb25zb2xlMiIsIGV0Yy4gdXNpbmcKICAgICB0aGUgVlQgbnVtYmVyLgoKICAgICBJZiB0aGUgTGludXggdmVyc2lvbiBzZWVtcyB0byBiZSAyLjYgb3IgbGF0ZXIgYW5kIHRoZSAidWlucHV0IgogICAgIG1vZHVsZSBhcHBlYXJzIHRvIGJlIHByZXNlbnQsIHRoZW4gdGhlIHVpbnB1dCBtZXRob2Qgd2lsbCBiZSB1c2VkCiAgICAgaW5zdGVhZCBvZiAvZGV2L3R0eU4uIHVpbnB1dCBhbGxvd3MgaW5zZXJ0aW9uIG9mIEJPVEgga2V5c3Ryb2tlcwogICAgIGFuZCBtb3VzZSBpbnB1dCBhbmQgc28gaXQgcHJlZmVycmVkIHdoZW4gYWNjZXNzaW5nIGdyYXBoaWNhbCAoZS5nLgogICAgIFF0LWVtYmVkZGVkKSBsaW51eCBjb25zb2xlIGFwcHMuIFNlZSAtcGlwZWlucHV0IFVJTlBVVCBiZWxvdyBmb3IKICAgICBtb3JlIGluZm9ybWF0aW9uIG9uIHRoaXMgbW9kZSAoeW91IG1heSB3YW50IHRvIGFsc28gdXNlIHRoZQogICAgIC1ub2RyYWdnaW5nIGFuZCAtY3Vyc29yIG5vbmUgb3B0aW9ucy4pIFVzZSAiY29uc29sZTAiLCBldGMgb3IKICAgICAtcGlwZWlucHV0IENPTlNPTEUgdG8gZm9yY2UgdGhlIC9kZXYvdHR5TiBtZXRob2QuCgogICAgIE5vdGUgeW91IGNhbiBjaGFuZ2UgVlQgcmVtb3RlbHkgdXNpbmcgdGhlIGNodnQoMSkgY29tbWFuZC4KICAgICBTb21ldGltZXMgc3dpdGNoaW5nIG91dCBhbmQgYmFjayBjb3JyZWN0cyB0aGUgZnJhbWVidWZmZXIgc3RhdGUuCgogICAgIFRvIHNraXAgaW5wdXQgaW5qZWN0aW5nIGVudGlyZWx5IHVzZSAiY29uc29sZXgiLgoKICAgICBUaGUgc3RyaW5nICIvZGV2L2ZiMCIgKDEsIGV0YykgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZiAiY29uc29sZSIuCiAgICAgVGhpcyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IGZyYW1lYnVmZmVyIGRldmljZSwgZS5nLgogICAgIC9kZXYvZmIxLiBBcyBhIHNob3J0Y3V0IHRoZSAiL2Rldi8iIGNhbiBiZSBkcm9wcGVkLiBJZiB0aGUgbmFtZSBpcwogICAgIHNvbWV0aGluZyBub25zdGFuZGFyZCwgdXNlICJjb25zb2xlOi9kZXYvZm9vZmIiCgogICAgIElmIHlvdSBkbyBub3Qgd2FudCB4MTF2bmMgdG8gZ3Vlc3MgdGhlIGZyYW1lYnVmZmVyJ3MgV3hIeEIgYW5kCiAgICAgbWFza3MgYXV0b21hdGljYWxseSAoc29tZXRpbWVzIHRoZSBrZXJuZWwgZ2l2ZXMgaW5hY2N1cmF0ZQogICAgIGluZm9ybWF0aW9uKSwgc3BlY2lmeSB0aGVtIHdpdGggYSBAV3hIeEIgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgoKICAgVGhlIGFib3ZlIGlzIGp1c3QgYW4gZXhhbXBsZSBvZiB3aGF0IGNhbiBiZSBkb25lLiBOb3RlIHRoYXQgaWYgeW91CiAgIHJlYWxseSB3YW50IHRvIHZpZXcgYW5kIGludGVyYWN0IHdpdGggdGhlIExpbnV4IFRleHQgY29uc29sZSBpdCBpcwogICBiZXR0ZXIgdG8gdXNlIHRoZSBtb3JlIGFjY3VyYXRlIGFuZCBmYXN0ZXIgTGludXhWTkMgcHJvZ3JhbS4gVGhlCiAgIGFkdmFudGFnZSB4MTF2bmMgLXJhd2ZiIG1pZ2h0IGhhdmUgaXMgdGhhdCBpdCBjYW4gYWxsb3cgaW50ZXJhY3Rpb24KICAgd2l0aCBhIG5vbi10ZXh0IGFwcGxpY2F0aW9uLCBlLmcuIG9uZSBiYXNlZCBvbiBTVkdBbGliIG9yIFF0LWVtYmVkZGVkCiAgIEFsc28sIGZvciBleGFtcGxlIHRoZSBWTVdhcmUgRnVsbHNjcmVlbiBtb2RlIGlzIGFjdHVhbGx5IHZpZXdhYmxlCiAgIHVuZGVyIC1yYXdmYiBhbmQgY2FuIGJlIGludGVyYWN0ZWQgd2l0aCBpZiB1aW5wdXQgaXMgZW5hYmxlZC4KCiAgIElmIHRoZSBMaW51eCB1aW5wdXQgZHJpdmVyIGlzIGF2YWlsYWJsZSB0aGVuIGZ1bGwga2V5c3Ryb2tlIGFuZCBtb3VzZQogICBpbnB1dCBpbnRvIHRoZSBMaW51eCBjb25zb2xlIGNhbiBiZSBwZXJmb3JtZWQuIFlvdSBtYXkgYmUgYWJsZSB0bwogICBlbmFibGUgdWlucHV0IHZpYSBjb21tYW5kcyBsaWtlIHRoZXNlOgogIG1vZHByb2JlIHVpbnB1dAogIG1rbm9kIC9kZXYvaW5wdXQvdWlucHV0IGMgMTAgMjIzCgogICBUaGUgLXJhd2ZiIGFuZCAtcGlwZWlucHV0IGZlYXR1cmVzIGFyZSBpbnRlbmRlZCB0byBoZWxwIG9uZSBjcmVhdGl2ZWx5CiAgICJnZXQgb3V0IG9mIGEgamFtIiAoc2F5IG9uIGEgbGVnYWN5IG9yIGVtYmVkZGVkIGRldmljZSkgd2hlcmUgWCBpcwogICBhYnNlbnQgb3IgZG9lc24ndCB3b3JrIHByb3Blcmx5LiBGZWVkYmFjayBhbmQgYnVnIHJlcG9ydHMgYXJlIHdlbGNvbWUuCiAgIEZvciBtb3JlIGNvbnRyb2wgYW5kIGxlc3Mgb3ZlcmhlYWQgdXNlIGxpYnZuY3NlcnZlciBpbiB5b3VyIG93biBDCiAgIHByb2dyYW0gdGhhdCBwYXNzZXMgdGhlIGZyYW1lYnVmZmVyIHRvIGxpYnZuY3NlcnZlci4KCgogICBRLTExMzogQ2FuIEkgZXhwb3J0IHRoZSBMaW51eCBDb25zb2xlIChWaXJ0dWFsIFRlcm1pbmFscykgdmlhIFZOQwogICB1c2luZyB4MTF2bmM/CgogICBZZXMsIHlvdSBtYXkgbmVlZCB0byBiZSByb290IHRvIGFjY2VzcyB0aGUgZGV2aWNlcyB0aGF0IG1ha2UgdXAgdGhlCiAgIGxpbnV4IGNvbnNvbGUuCgogICBUbyBhY2Nlc3MgdGhlIGFjdGl2ZSBMaW51eCBjb25zb2xlIHZpYSB0aGUgY29tcHV0ZXIncyBmcmFtZWJ1ZmZlciB0cnkKICAgc29tZXRoaW5nIGxpa2U6CiAgeDExdm5jIC1yYXdmYiBjb25zb2xlCiAgeDExdm5jIC1yYXdmYiBjb25zb2xlMgoKICAgVGhlc2Ugd2lsbCB0cnkgdG8gYWNjZXNzIHRoZSBmcmFtZWJ1ZmZlciB0aHJvdWdoIC9kZXYvZmIgKG9yIC9kZXYvZmIwLAogICBldGMuKSBhbmQgaWYgaXQgc3VjY2VlZHMgaXQgd2lsbCBzaG93IGFueSB0ZXh0IG9yIGdyYXBoaWNzIHRoYXQgaXMKICAgY3VycmVudGx5IGRpc3BsYXllZC4gS2V5c3Ryb2tlcyB3aWxsIGJlIGluamVjdGVkIHZpYSB0aGUgZGV2aWNlCiAgIC9kZXYvdHR5MCAodG8gZm9yY2UgYW4gZXhwbGljaXQgdmlydHVhbCB0ZXJtaW5hbCBhcHBlbmQgYSBudW1iZXIsIGUuZy4KICAgImNvbnNvbGUyIiB0byBzZWxlY3QgL2Rldi90dHkyLikKCiAgIElmIHlvdXIgTGludXggc3lzdGVtIGRvZXMgbm90IGhhdmUgYSBmcmFtZWJ1ZmZlciBkZXZpY2UgKC9kZXYvZmIpIHlvdQogICBjYW4gZ2V0IG9uZSBieSBhZGRpbmcsIGUuZy4sIHZnYT0weDMxQiBib290IHBhcmFtZXRlci4gVGhpcyBlbmFibGVzCiAgIHRoZSBWR0EgZnJhbWVidWZmZXIgZGV2aWNlIGF0IDEyODB4MTAyNHgyNC4gMHgzMTcgZ2l2ZXMgMTAyNHg3Njh4MTYsCiAgIGV0Yy4gWW91IGNhbiBhbHNvIGVuYWJsZSBhIExpbnV4IGZyYW1lYnVmZmVyIGRldmljZSBieSBtb2Rwcm9iaW5nIGEKICAgZnJhbWVidWZmZXIgZHJpdmVyIHNwZWNpZmljIHRvIHlvdXIgdmlkZW8gY2FyZC4KCiAgIE5vdGUgdGhhdCB0aGlzICItcmF3ZmIgY29uc29sZSIgbW9kZSBzaG93cyB0aGUgY29udGVudHMgb2YgdGhlCiAgIGhhcmR3YXJlIGZyYW1lYnVmZmVyLCBhbmQgc28gd2lsbCBzaG93IHdoYXRldmVyIGlzIG9uIHRoZSBzY3JlZW4uIEl0CiAgIGhhcyBubyBjb25jZXB0IG9mIFZpcnR1YWwgVGVybWluYWxzIFdSVCB3aGF0IHRoZXJlIGlzIHRvIHZpZXcsIGl0CiAgIGFsd2F5cyBzaG93cyB0aGUgYWN0aXZlIHZpcnR1YWwgdGVybWluYWwuCgogICBBbm90aGVyIG1vZGUgaXMgc3BlY2lmaWMgdG8gdGhlIExpbnV4IHRleHQgVmlydHVhbCBUZXJtaW5hbHMsIGl0IHNob3dzCiAgIHRoZWlyIHRleHQgYW5kIGNvbG9ycyAoYnV0IG5vIGdyYXBoaWNzKSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQgaXMKICAgdGhlIGFjdGl2ZSBWVCBvciBub3QuIEl0IGlzIGF2YWlsYWJsZSBvbiB4MTF2bmMgMC45LjcgYW5kIGxhdGVyLgogICBFbmFibGUgdGhpcyBtb2RlIGxpa2UgdGhpczoKICB4MTF2bmMgLXJhd2ZiIHZ0CiAgeDExdm5jIC1yYXdmYiB2dDIKCiAgIFRoZSBmb3JtZXIgd2lsbCBzZWxlY3QgdGhlIGFjdGl2ZSBvbmUsIHRoZSBsYXR0ZXIgdGhlIDJuZCBWVC4geDExdm5jCiAgIGltcGxlbWVudHMgdGhpcyBtb2RlIGJ5IG9wZW5pbmcgdGhlIGN1cnJlbnQgY29uc29sZSB0ZXh0IGZpbGUKICAgIi9kZXYvdmNzYTIiIGluc3RlYWQgb2YgIi9kZXYvZmIiLiBJbiB0aGlzIHdheSBpdCBwcm92aWRlcyB0aGUgYmFzaWMKICAgZnVuY3Rpb25hbGl0eSBvZiB0aGUgTGliVk5DU2VydmVyIExpbnV4Vk5DIHByb2dyYW0uCgogICBUaGUgdnQgbW9kZSBjYW4gYmUgYSB1c2VmdWwgd2F5IHRvIHRyeSB0byBnZXQgYSBtYWNoaW5lJ3MgWCBzZXJ2ZXIKICAgd29ya2luZyByZW1vdGVseSwgZS5nLiB5b3UgZWRpdCAvZXRjL1gxMS94b3JnLmNvbmYgYW5kIHRoZW4gdHlwZQogICBzdGFydHggKG9yIHNpbWlsYXIsIGUuZy4gZ2RtKSBpbiB0aGUgdmlydHVhbCB0ZXJtaW5hbC4gQSAybmQgeDExdm5jCiAgIGNvdWxkIGJlIHVzZWQgdG8gc2VlIGlmIHRoZSBYIHNlcnZlciBpcyBub3cgd29ya2luZyBjb3JyZWN0bHkuCgogICBRLTExNDogQ2FuIEkgZXhwb3J0IHZpYSBWTkMgYSBXZWJjYW0gb3IgVFYgdHVuZXIgZnJhbWVidWZmZXIgdXNpbmcKICAgeDExdm5jPwoKICAgWWVzLCB0aGlzIGlzIHBvc3NpYmxlIHRvIHNvbWUgZGVncmVlIHdpdGggdGhlIC1yYXdmYiBvcHRpb24uIFRoZXJlIGlzCiAgIG5vIFgxMSBpbnZvbHZlZDogc25hcHNob3RzIGZyb20gdGhlIHZpZGVvIGNhcHR1cmUgZGV2aWNlIGFyZSB1c2VkIGZvcgogICB0aGUgc2NyZWVuIGltYWdlIGRhdGEuIFNlZSB0aGUgcHJldmlvdXMgRkFRIG9uIC1yYXdmYiBmb3IgYmFja2dyb3VuZC4KICAgRm9yIGJlc3QgcmVzdWx0cywgdXNlIHgxMXZuYyB2ZXJzaW9uIDAuOC4xIG9yIGxhdGVyLgoKICAgUm91Z2hseSwgb25lIHdvdWxkIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6CiAgeDExdm5jIC1yYXdmYiBzbmFwOi9kZXYvdmlkZW9AMzIweDI0MHgzMgoKICAgVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBzeXN0ZW0gYWxsb3dzIHNpbXBsZSByZWFkKDIpIGFjY2VzcyB0byB0aGUKICAgdmlkZW8gZGV2aWNlLiBUaGlzIGlzIHRydWUgZm9yIHZpZGVvNExpbnV4IG9uIExpbnV4IGtlcm5lbCAyLjYgYW5kCiAgIGxhdGVyIChpdCB3b24ndCB3b3JrIGZvciAyLjQsIHlvdSdsbCBuZWVkIGEgc2VwYXJhdGUgcHJvZ3JhbSB0bwogICBzbmFwc2hvdCB0byBhIGZpbGUgdGhhdCB5b3UgcG9pbnQgLXJhd2ZiIHRvOyBhc2sgbWUgaWYgaXQgaXMgbm90IGNsZWFyCiAgIHdoYXQgdG8gZG8uKQoKICAgVGhlICJzbmFwOiIgZW5mb3JjZXMgLXNuYXBmYiBtb2RlIHdoaWNoIGFwcGVhcnMgdG8gYmUgbmVjZXNzYXJ5LiBUaGUKICAgcmVhZCBwb2ludGVyIGZvciB2aWRlbyBjYXB0dXJlIGRldmljZXMgY2Fubm90IGJlIHJlcG9zaXRpb25lZCAod2hpY2gKICAgd291bGQgYmUgbmVlZGVkIGZvciBzY2FubGluZSBwb2xsaW5nKSwgYnV0IHlvdSBjYW4gcmVhZCBhIGZ1bGwgZnJhbWUKICAgb2YgZGF0YSBmcm9tIHRoZSBkZXZpY2UuCgogICBPbiBMaW51eCwgaWYgdGhlIFZpZGVvNExpbnV4IEFQSSBpcyBwcmVzZW50IG9yIHRoZSB2NGwtaW5mbygxKSBwcm9ncmFtCiAgIChyZWxhdGVkIHRvIHhhd3R2KSBleGlzdHMgaW4gaW4gUEFUSCwgdGhlbiB4MTF2bmMgY2FuIGJlIGluc3RydWN0ZWQgdG8KICAgdHJ5IGl0IHRvIGRldGVybWluZSB0aGUgLXJhd2ZiIFd4SHhCIHBhcmFtZXRlcnMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5LgogICBJbiB0aGlzIGNhc2Ugb25lIHdvdWxkIGp1c3QgdHlwZToKICB4MTF2bmMgLXJhd2ZiIHZpZGVvCgogICBvciAiLXJhd2ZiIHZpZGVvMSIgZm9yIHRoZSAybmQgdmlkZW8gZGV2aWNlLCBldGMuCgogICB4MTF2bmMgaGFzIGFsc28gYmVlbiBleHRlbmRlZCB0byB1c2UgdGhlIFZpZGVvNExpbnV4IEFQSSBvdmVyIHY0bC1pbmZvCiAgIGlmIGl0IGlzIGF2YWlsYWJsZSBhdCBidWlsZCB0aW1lLiBUaGlzIGVuYWJsZXMgc2V0dGluZyBwYXJhbWV0ZXJzCiAgIChlLmcuIHNpemUgYW5kIGJyaWdodG5lc3MpIHZpYSB4MTF2bmMuIFNlZSB0aGUgZGVzY3JpcHRpb24gYmVsb3cuCiAgIFdpdGhvdXQgVmlkZW80TGludXggeW91IHdpbGwgbmVlZCB0byBpbml0aWFsaXplIHRoZSBzZXR0aW5ncyBvZiB0aGUKICAgdmlkZW8gZGV2aWNlIHVzaW5nIHNvbWV0aGluZyBsaWtlIHhhd3R2IG9yIHNwY2F2aWV3IChhbmQgdGhlbiBob3BlIHRoZQogICBzZXR0aW5ncyBwZXJzaXN0IHVudGlsIHgxMXZuYyByZW9wZW5zIHRoZSBkZXZpY2UuKQoKICAgTWFueSB2aWRlbzRsaW51eCBkcml2ZXJzIHRlbmQgdG8gc2V0IHRoZSBmcmFtZWJ1ZmZlciB0byBiZSAyNGJwcCAoYXMKICAgb3Bwb3NlZCB0byAzMmJwcC4pIFNpbmNlIHRoaXMgY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggVk5DIHZpZXdlcnMsCiAgIGV0YywgdGhlIC0yNHRvMzIgb3B0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbXBvc2VkIHdoZW4gaW4gMjRicHAuCgogICBOb3RlIHRoYXQgYnkgaXRzIHZlcnkgbmF0dXJlLCB2aWRlbyBjYXB0dXJlIGludm9sdmVzIHJhcGlkIGNoYW5nZSBpbgogICB0aGUgZnJhbWVidWZmZXIuIFRoaXMgaXMgZXNwZWNpYWxseSB0cnVlIGZvciBjYW1lcmFzIHdoZXJlIHNsaWdodAogICB3YXZlcmluZyBpbiBicmlnaHRuZXNzIGlzIGFsd2F5cyBoYXBwZW5pbmcuIFRoaXMgY2FuIGxlYWQgdG8gbXVjaAogICBuZXR3b3JrIGJhbmR3aWR0aCBjb25zdW1wdGlvbiBmb3IgdGhlIFZOQyB0cmFmZmljIGFuZCBhbHNvIGxvY2FsIENQVQogICBhbmQgSS9PIHJlc291cmNlIHVzYWdlLiBZb3UgbWF5IHdhbnQgdG8gZXhwZXJpbWVudCB3aXRoICJkaWFsaW5nIGRvd24iCiAgIHRoZSBmcmFtZXJhdGUgdmlhIHRoZSAtd2FpdCwgLXNsb3dfZmIsIG9yIC1kZWZlciBvcHRpb25zLiBEZWNyZWFzaW5nCiAgIHRoZSB3aW5kb3cgc2l6ZSBhbmQgYnBwIGFsc28gaGVscHMuCgoKICAgU2V0dGluZyBDYW1lcmEvVHVuZXIgcGFyYW1ldGVycyB2aWEgeDExdm5jOgoKICAgVGhlcmUgaXMgYWxzbyBzb21lIHN1cHBvcnQgZm9yIHNldHRpbmcgcGFyYW1ldGVycyBvZiB0aGUgY2FwdHVyZQogICBkZXZpY2UuIFRoaXMgaXMgZG9uZSB2aWEgIi1yYXdmYiB2aWRlbzo8c2V0dGluZ3M+Ii4gVGhpcyBjb3VsZCBiZQogICB1c2VmdWwgZm9yIHVuYXR0ZW5kZWQgc3RhcnR1cCBhdCBib290dGltZSwgZXRjLiBIZXJlIGlzIHRoZSAtaGVscAogICBkZXNjcmlwdGlvbjoKCiAgICAgQSBtb3JlIHNvcGhpc3RpY2F0ZWQgdmlkZW8gZGV2aWNlIHNjaGVtZSBhbGxvd3MgaW5pdGlhbGl6aW5nIHRoZQogICAgIGRldmljZSdzIHNldHRpbmdzIHVzaW5nOgoKICAgICAgICAgICAtcmF3ZmIgdmlkZW86PHNldHRpbmdzPgoKICAgICBUaGUgcHJlZml4IGNvdWxkIGFsc28gYmUsIGFzIGFib3ZlLCBlLmcuICJ2aWRlbzE6IiB0byBzcGVjaWZ5IHRoZQogICAgIGRldmljZSBmaWxlLiBUaGUgdjRsIEFQSSBtdXN0IGJlIGF2YWlsYWJsZSBmb3IgdGhpcyB0byB3b3JrLgogICAgIE90aGVyd2lzZSwgeW91IHdpbGwgbmVlZCB0byB0cnkgdG8gaW5pdGlhbGl6ZSB0aGUgZGV2aWNlIHdpdGggYW4KICAgICBleHRlcm5hbCBwcm9ncmFtLCBlLmcuIHhhd3R2LCBzcGNhdmlldywgYW5kIGhvcGUgdGhleSBwZXJzaXN0IHdoZW4KICAgICB4MTF2bmMgcmUtb3BlbnMgdGhlIGRldmljZS4KCiAgICAgPHNldHRpbmdzPiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGtleT12YWx1ZSBwYWlycy4gVGhlCiAgICAgZGV2aWNlJ3MgYnJpZ2h0bmVzcywgY29sb3IsIGNvbnRyYXN0LCBhbmQgaHVlIGNhbiBiZSBzZXQgdG8KICAgICBwZXJjZW50YWdlcywgZS5nLiBicj04MCxjbz01MCxjbj00NCxodT02MC4KCiAgICAgVGhlIGRldmljZSBmaWxlbmFtZSBjYW4gYmUgc2V0IHRvbyBpZiBuZWVkZWQgKGlmIGl0IGRvZXMgbm90IHN0YXJ0CiAgICAgd2l0aCAidmlkZW8iKSwgZS5nLiBmbj0vZGV2L3FjYW0uCgogICAgIFRoZSB3aWR0aCwgaGVpZ2h0IGFuZCBicHAgb2YgdGhlIGZyYW1lYnVmZmVyIGNhbiBiZSBzZXQgdmlhLCBlLmcuLAogICAgIHc9MTYwLGg9MTIwLGJwcD0xNi4KCiAgICAgUmVsYXRlZCB0byB0aGUgYnBwIGFib3ZlLCB0aGUgcGl4ZWwgZm9ybWF0IGNhbiBiZSBzZXQgdmlhIHRoZQogICAgIGZtdD1YWFgsIHdoZXJlIFhYWCBjYW4gYmUgb25lIG9mOiBHUkVZLCBISTI0MCwgUkdCNTU1LCBSR0I1NjUsCiAgICAgUkdCMjQsIGFuZCBSR0IzMiAod2l0aCBicHAgOCwgOCwgMTYsIDE2LCAyNCwgYW5kIDMyIHJlc3BlY3RpdmVseS4pCiAgICAgU2VlIGh0dHA6Ly93d3cubGludXh0di5vcmcgZm9yIG1vcmUgaW5mbyAoVjRMIGFwaS4pCgogICAgIEZvciBUVi9yZiB0dW5lciBjYXJkcyBvbmUgY2FuIHNldCB0aGUgdHVuaW5nIG1vZGUgdmlhIHR1bj1YWFggd2hlcmUKICAgICBYWFggY2FuIGJlIG9uZSBvZiBQQUwsIE5UU0MsIFNFQ0FNLCBvciBBVVRPLgoKICAgICBPbmUgY2FuIHN3aXRjaCB0aGUgaW5wdXQgY2hhbm5lbCBieSB0aGUgaW5wPVhYWCBzZXR0aW5nLCB3aGVyZSBYWFgKICAgICBpcyB0aGUgbmFtZSBvZiB0aGUgaW5wdXQgY2hhbm5lbCAoVGVsZXZpc2lvbiwgQ29tcG9zaXRlMSwgUy1WaWRlbywKICAgICBldGMuKSBVc2UgdGhlIG5hbWUgdGhhdCBpcyBpbiB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRldmljZSB0aGF0CiAgICAgaXMgcHJpbnRlZCBhdCBzdGFydHVwLgoKICAgICBGb3IgaW5wdXQgY2hhbm5lbHMgd2l0aCB0dW5lcnMgKGUuZy4gVGVsZXZpc2lvbikgb25lIGNhbiBjaGFuZ2UKICAgICB3aGljaCBzdGF0aW9uIGlzIHNlbGVjdGVkIGJ5IHRoZSBzdGE9WFhYIHNldHRpbmcuIFhYWCBpcyB0aGUKICAgICBzdGF0aW9uIG51bWJlci4gQ3VycmVudGx5IG9ubHkgdGhlIG50c2MtY2FibGUtdXMgKFVTIGNhYmxlKQogICAgIGNoYW5uZWxzIGFyZSBidWlsdCBpbnRvIHgxMXZuYy4gU2VlIHRoZSAtZnJlcXRhYiBvcHRpb24gYmVsb3cgdG8KICAgICBzdXBwbHkgb25lIGZyb20geGF3dHYuIElmIFhYWCBpcyBncmVhdGVyIHRoYW4gNTAwLCB0aGVuIGl0IGlzCiAgICAgaW50ZXJwcmV0ZWQgYXMgYSByYXcgZnJlcXVlbmN5IGluIEtIei4KCiAgICAgRXhhbXBsZToKCiAgICAgLXJhd2ZiIHZpZGVvOmJyPTgwLHc9MzIwLGg9MjQwLGZtdD1SR0IzMix0dW49TlRTQyxzdGE9NDcKCiAgICAgb25lIG1pZ2h0IG5lZWQgdG8gYWRkIGlucD1UZWxldmlzaW9uIHRvbyBmb3IgdGhlIGlucHV0IGNoYW5uZWwgdG8KICAgICBiZSBUViBpZiB0aGUgY2FyZCBkb2Vzbid0IGNvbWUgdXAgYnkgZGVmYXVsdCBpbiB0aGF0IG9uZS4KCiAgICAgTm90ZSB0aGF0IG5vdCBhbGwgdmlkZW8gY2FwdHVyZSBkZXZpY2VzIHdpbGwgc3VwcG9ydCBhbGwgb2YgdGhlCiAgICAgYWJvdmUgc2V0dGluZ3MuCgogICAgIFNlZSB0aGUgLXBpcGVpbnB1dCBWSUQgb3B0aW9uIGJlbG93IGZvciBhIHdheSB0byBjb250cm9sIHRoZQogICAgIHNldHRpbmdzIHRocm91Z2ggdGhlIFZOQyBWaWV3ZXIgdmlhIGtleXN0cm9rZXMuCgogICAgIEFzIGFib3ZlLCBpZiB5b3Ugc3BlY2lmeSBhICJAV3hIeEIuLi4iIGFmdGVyIHRoZSA8c2V0dGluZ3M+IHN0cmluZwogICAgIHRoZXkgYXJlIHVzZWQgdmVyYmF0aW06IHRoZSBkZXZpY2UgaXMgbm90IHF1ZXJpZWQgZm9yIHRoZSBjdXJyZW50CiAgICAgdmFsdWVzLiBPdGhlcndpc2UgdGhlIGRldmljZSB3aWxsIGJlIHF1ZXJpZWQuCgogICBBbHNvLCBpZiB5b3Ugc3VwcGx5IHRoZSAiLXBpcGVpbnB1dCBWSUQiIChvciB1c2UgIi1yYXdmYiBWaWRlbyIpCiAgIG9wdGlvbiB5b3UgY2FuIGNvbnRyb2wgdGhlIHNldHRpbmdzIHRvIHNvbWUgZGVncmVlIHZpYSBrZXlzdHJva2UKICAgbWFwcGluZ3MsIGUuZy4gQiB0byBpbmNyZWFzZSB0aGUgYnJpZ2h0bmVzcyBvciBVcCBhcnJvdyB0byBjaGFuZ2UgdGhlCiAgIFRWIHN0YXRpb246CgogICAgIEZvciAiLXBpcGVpbnB1dCBWSUQiIGFuZCB5b3UgYXJlIHVzaW5nIHRoZSAtcmF3ZmIgZm9yIGEgdmlkZW8KICAgICBjYXB0dXJlIGRldmljZSwgdGhlbiBhbiBpbnRlcm5hbCBsaXN0IG9mIGtleWJvYXJkIG1hcHBpbmdzIGlzIHVzZWQKICAgICB0byBzZXQgcGFyYW1ldGVycyBvZiB0aGUgdmlkZW8uIFRoZSBtYXBwaW5ncyBhcmU6CgogICAgICAgICAiQiIgYW5kICJiIiBhZGp1c3QgdGhlIGJyaWdodG5lc3MgdXAgYW5kIGRvd24uCiAgICAgICAgICJIIiBhbmQgImgiIGFkanVzdCB0aGUgaHVlLgogICAgICAgICAiQyIgYW5kICJjIiBhZGp1c3QgdGhlIGNvbG91ci4KICAgICAgICAgIk4iIGFuZCAibiIgYWRqdXN0IHRoZSBjb250cmFzdC4KICAgICAgICAgIlMiIGFuZCAicyIgYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjYXB0dXJlIHNjcmVlbi4KICAgICAgICAgIkkiIGFuZCAiaSIgY3ljbGUgdGhyb3VnaCBpbnB1dCBjaGFubmVscy4KICAgICAgICAgVXAgYW5kIERvd24gYXJyb3dzIGFkanVzdCB0aGUgc3RhdGlvbiAoaWYgYSB0dW5lcikKICAgICAgICAgRjEsIEYyLCAuLi4sIEY2IHdpbGwgc3dpdGNoIHRoZSB2aWRlbyBjYXB0dXJlIHBpeGVsCiAgICAgICAgIGZvcm1hdCB0byBISTI0MCwgUkdCNTY1LCBSR0IyNCwgUkdCMzIsIFJHQjU1NSwgYW5kCiAgICAgICAgIEdSRVkgcmVzcGVjdGl2ZWx5LiBTZWUgLXJhd2ZiIHZpZGVvIGZvciBkZXRhaWxzLgoKICAgU2VlIGFsc28gdGhlIC1mcmVxdGFiIG9wdGlvbiB0byBzdXBwbHkgeW91ciBvd24geGF3dHYgY2hhbm5lbCB0bwogICBmcmVxdWVuY3kgbWFwcGluZ3MgZm9yIHlvdXIgY291bnRyeSAob25seSBudHNjLWNhYmxlLXVzIGlzIGJ1aWx0IGludG8KICAgeDExdm5jLikKCgogICBRLTExNTogQ2FuIEkgY29ubmVjdCB2aWEgVk5DIHRvIGEgUXQtZW1iZWRkZWQvUXQtZW5oYW5jZWQvUXRvcGlhCiAgIGFwcGxpY2F0aW9uIHJ1bm5pbmcgb24gbXkgaGFuZGhlbGQsIGNlbGwgcGhvbmUsIG9yIFBDIHVzaW5nIHRoZSBMaW51eAogICBjb25zb2xlIGZyYW1lYnVmZmVyIChpLmUuIG5vdCBYMTEpPwoKICAgWWVzLCB0aGUgYmFzaWMgbWV0aG9kIGZvciB0aGlzIGlzIHRoZSAtcmF3ZmIgc2NoZW1lIHdoZXJlIHRoZSBMaW51eAogICBjb25zb2xlIGZyYW1lYnVmZmVyICh1c3VhbGx5IC9kZXYvZmIwKSBpcyBwb2xsZWQgYW5kIHRoZSB1aW5wdXQgZHJpdmVyCiAgIGlzIHVzZWQgdG8gaW5qZWN0IGtleXN0cm9rZXMgYW5kIG1vdXNlIGlucHV0LiBPZnRlbiB5b3Ugd2lsbCBqdXN0IGhhdmUKICAgdG8gdHlwZToKICB4MTF2bmMgLXJhd2ZiIGNvbnNvbGUKCiAgICh5b3UgbWF5IG5lZWQgdG8gZW5hYmxlIHRoZSB1aW5wdXQgZHJpdmVyIG9uIHRoZSBzeXN0ZW0gdmlhICJtb2Rwcm9iZQogICB1aW5wdXQ7IG1rbm9kIC9kZXYvaW5wdXQvdWlucHV0IGMgMTAgMjIzIikgSWYgdGhpcyBkb2VzIG5vdCBmaW5kIHRoZQogICBjb3JyZWN0IGZyYW1lIGJ1ZmZlciBwcm9wZXJ0aWVzIGZpZ3VyZSB0aGVtIG91dCBvciBndWVzcyB0aGVtIGFuZCB1c2UKICAgc29tZXRoaW5nIGxpa2U6CiAgeDExdm5jIC1yYXdmYiAvZGV2L2ZiMEA2NDB4NDgweDE2CgogICBBbHNvLCB0byBmb3JjZSB1c2FnZSBvZiB0aGUgdWlucHV0IGluamVjdGlvbiBtZXRob2QgdXNlICItcGlwZWlucHV0CiAgIFVJTlBVVCIuIFNlZSB0aGUgLXBpcGVpbnB1dCBkZXNjcmlwdGlvbiBmb3IgdHVuYWJsZSBwYXJhbWV0ZXJzLCBldGMuCgogICBPbmUgcHJvYmxlbSB3aXRoIHRoZSB4MTF2bmMgdWlucHV0IHNjaGVtZSBpcyB0aGF0IGl0IGNhbm5vdCBndWVzcyB0aGUKICAgbW91c2UgbW90aW9uICJhY2NlbGVyYXRpb24iIHVzZWQgYnkgdGhlIHdpbmRvd2luZyBhcHBsaWNhdGlvbiAoZS5nLgogICBRV1Mgb3IgWDExLikgRm9yIFgxMSBhbmQgUXQtZW1iZWRkZWQgdGhlIGFjY2VsZXJhdGlvbiBpcyB1c3VhbGx5IDIKICAgKGkuZS4gYSBkeCBvZiAxIGZyb20gdGhlIG1vdXNlIHlpZWxkcyBhIDIgcGl4ZWwgZGlzcGxhY2VtZW50IG9mIHRoZQogICBtb3VzZSBjdXJzb3IuKSBUaGUgZGVmYXVsdCB4MTF2bmMgdXNlcyBpcyAyLCBzaW5jZSB0aGF0IGlzIG9mdGVuIHVzZWQuCiAgIEhvd2V2ZXIgZm9yIG9uZSBRdC1lbWJlZGRlZCBzeXN0ZW0gd2UgbmVlZGVkIHRvIGRvOgogIHgxMXZuYyAtcmF3ZmIgY29uc29sZSAgLXBpcGVpbnB1dCBVSU5QVVQ6YWNjZWw9NC4wCgogICB0byBnZXQgcmVhc29uYWJsZSBwb3NpdGlvbmluZyBvZiB0aGUgbW91c2UuCgogICBFdmVuIHdpdGggdGhlIGNvcnJlY3QgYWNjZWxlcmF0aW9uIHNldHRpbmcgdGhlcmUgaXMgc3RpbGwgc29tZSBkcmlmdAogICAocHJvYmFibHkgYmVjYXVzZSBvZiB0aGUgbW91c2UgdGhyZXNob2xkIHdoZXJlIHRoZSBhY2NlbGVyYXRpb24ga2lja3MKICAgaW4pIGFuZCBzbyB4MTF2bmMgbmVlZHMgdG8gcmVwb3NpdGlvbiB0aGUgY3Vyc29yIGZyb20gMCwwIGFib3V0IDUKICAgdGltZXMgYSBzZWNvbmQuIFNlZSB0aGUgLXBpcGVpbnB1dCBVSU5QVVQgb3B0aW9uIGZvciB0dW5pbmcgcGFyYW1ldGVycwogICB0aGF0IGNhbiBiZSBzZXQgKHRoZXJlIGFyZSBzb21lIGV4cGVyaW1lbnRhbCB0aHJlc2g9TiB0dW5pbmcKICAgcGFyYW1ldGVycyBhcyB3ZWxsKQoKICAgQ3VycmVudGx5LCBvbmUgY2FuIGV4cGVjdCBtb3VzZSBpbnB1dCB0byBiZSBhIGxpdHRsZSBmbGFrZXkuIEFsbCBpbgogICBhbGwsIHRoZSBMaW51eCBmcmFtZWJ1ZmZlciBpbnB1dCBtZWNoYW5pc20gZm9yIFF0LWVtYmVkZGVkIGZyYW1lYnVmZmVyCiAgIGFwcHMgaXMgbm90IHBlcmZlY3QsIGJ1dCBpdCBpcyB1c2FibGUuCgogICBJZiB5b3UgbmVlZCB0byBjcmVhdGUgYSBzbWFsbGVyIHgxMXZuYyBiaW5hcnkgZm9yIGEgaGFuZGhlbGQKICAgZW52aXJvbm1lbnQgYmUgc3VyZSB0byBydW4gc3RyaXAoMSkgb24gaXQgYW5kIGFsc28gY29uc2lkZXIKICAgY29uZmlndXJpbmcgd2l0aCwgZS5nLiAiZW52IENQUEZMQUdTPSctRFNNQUxMX0ZPT1RQUklOVD0xJyAuL2NvbmZpZ3VyZQogICAuLi4iIHRvIHJlbW92ZSByYXJlbHkgdXNlZCBmZWF0dXJlcyBhbmQgbGFyZ2UgdGV4dHMgKHVzZSAyIG9yIDMKICAgaW5zdGVhZCBvZiAxIHRvIHJlbW92ZSBtb3JlLikgQ3VycmVudGx5IChKdWwvMjAwNikgdGhpcyBjYW4gbG93ZXIgdGhlCiAgIHNpemUgb2YgdGhlIHgxMXZuYyBmcm9tIDEuMU1CIHRvIDAuNi0wLjdNQi4KCiAgIFRoZSB4MTF2bmMgdWlucHV0IG1ldGhvZCBhcHBsaWVzIHRvIG5lYXJseSBhbnl0aGluZyBvbiB0aGUgTGludXgKICAgZnJhbWVidWZmZXIgY29uc29sZSwgbm90IGp1c3QgUXQtZW1iZWRkZWQvUXRvcGlhLiBEaXJlY3RGQiwgU0RMIHVzaW5nCiAgIGZiY29uIGRyaXZlciwgU1ZHQWxpYiBhcHBsaWNhdGlvbnMgY2FuIGFsc28gYmUgdmlld2VkIGFuZCBpbnRlcmFjdGVkCiAgIHdpdGguIEV2ZW4gYSBMaW51eCBYIHNlc3Npb24gY2FuIGJlIHZpZXdlZCBhbmQgaW50ZXJhY3RlZCB3aXRoIHdpdGhvdXQKICAgdXNpbmcgWDExIChhbmQgeDExdm5jIGRvZXMgbm90IGhhdmUgdG8gdGVybWluYXRlIHdoZW4gdGhlIFggc2VydmVyCiAgIHJlc3RhcnRzISkgVGhlIExpbnV4IFRleHQgY29uc29sZXMgKEYxLUY2KSBhbHNvIHdvcmsuCgogICBOb3RlIHRoYXQgUXQtZW1iZWRkZWQgc3VwcGxpZXMgaXRzIG93biBWTkMgZ3JhcGhpY3MgZHJpdmVyLCBidXQgaXQKICAgY2Fubm90IGRvIGJvdGggdGhlIExpbnV4IGNvbnNvbGUgZnJhbWVidWZmZXIgYW5kIFZOQyBhdCB0aGUgc2FtZSB0aW1lLAogICB3aGljaCBpcyBvZnRlbiB3aGF0IGlzIGRlc2lyZWQgZnJvbSBWTkMuCgogICBVcGRhdGU6IFdlIGFyZSBmaW5kaW5nIHNvbWUgc2V0dXBzIGxpa2UgUXRvcGlhIG9uIHRoZSBJUEFRIGRvIG5vdAogICBhbGxvdyBtb3VzZSBpbnB1dCB2aWEgdWlucHV0LiBQbGVhc2UgaGVscCB1cyBkZWJ1ZyB0aGlzIHByb2JsZW0gYnkKICAgdHJ5aW5nIHgxMXZuYyBvbiB5b3VyIGRldmljZSBhbmQgbGV0dGluZyB1cyBrbm93IHdoYXQgZG9lcyBhbmQgZG9lcwogICBub3Qgd29yay4gU2VlIHRoZSBuZXh0IEZBUSBmb3IgYSBwb3NzaWJsZSB3b3JrYXJvdW5kIGZvciB0b3VjaHNjcmVlbnMuCgoKICAgUS0xMTY6IEhvdyBkbyBJIGluamVjdCB0b3VjaCBzY3JlZW4gaW5wdXQgaW50byBhbgogICBRdC1lbWJlZGRlZC9RdC1lbmhhbmNlZC9RdG9waWEgY2VsbCBwaG9uZSBzdWNoIGFzIG9wZW5tb2tvL3F0bW9rbyBOZW8KICAgRnJlZXJ1bm5lcj8KCiAgIFRoZSBxdG1va28gcHJvamVjdCBkb2VzIG5vdCB1c2UgWDExIGZvciB0aGUgZ3JhcGhpY2FsIGRpc3BsYXkuCiAgIFVuZm9ydHVuYXRlbHkgdGhlIExpbnV4IHVpbnB1dCBtZXRob2QgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBGQVEKICAgZG9lcyBub3Qgd29yayBiZWNhdXNlIFF0IGlzIHVzaW5nIFRTTElCICh0b3VjaCBzY3JlZW4gbGlicmFyeSkgdG8KICAgcHJvY2VzcyB0aGUgaW5wdXQgYW5kIGl0IG9ubHkgcmVhZHMgZnJvbSBvbmUgZGV2aWNlIChvZnRlbgogICAvZGV2L2lucHV0L2V2ZW50MSkgYW5kIG5vdCBmcm9tIHRoZSBuZXcgVUlOUFVUIGRldmljZSB0aGF0IHgxMXZuYwogICBjcmVhdGVzICh1bmRlciAtcGlwZWlucHV0IFVJTlBVVCkKCiAgIFNvIHNvbWV0aGluZyBlbHNlIG5lZWRzIHRvIGJlIGRvbmUuIEl0IHdhcyBkaXNjb3ZlcmVkIHRoYXQgYnkgc2ltcGx5CiAgIHdyaXRpbmcgdGhlIHRvdWNoc2NyZWVuIGV2ZW50cyBkaXJlY3RseSB0byAvZGV2L2lucHV0L2V2ZW50MSB0aGVuCiAgIGlucHV0IGNhbiBiZSBpbmplY3RlZCBpbnRvIHRoZSBzeXN0ZW0uIFRoZXJlIGlzIG5vIHgxMXZuYyBidWlsdGluIG1vZGUKICAgZm9yIHRoaXMgeWV0ICh1bnRpbCB3ZSB1bmRlcnN0YW5kIGl0IGJldHRlciksIGJ1dCB0aGVyZSBpcyBhIHdvcmtpbmcKICAgc2NyaXB0IHByb3ZpZGVkIGluIHgxMXZuYy9taXNjL3F0X3RzbGliX2luamVjdC5wbC4gU28gb25lIGNvdWxkIHVzZSBpdAogICB0aGlzIHdheSBmb3IgZXhhbXBsZToKICB4MTF2bmMgLi4uIC1yYXdmYiBjb25zb2xlIC1waXBlaW5wdXQgcGF0aC90by9xdF90c2xpYl9pbmplY3QucGwgLWVudiBJTkpFQ1RfTwpQVElPTlM9Y2xpY2tvbmx5LGNhbD0vZXRjL3BvaW50ZXJjYWwKCiAgIFJlYWQgdGhlIHNjcmlwdCBmb3IgaG93IHRvIGVuYWJsZSBvdGhlciBvcHRpb25zIGFuZCB3aGF0IHRoZSBhYm92ZQogICBvcHRpb25zIG1lYW4gKGUuZy4gL2V0Yy9wb2ludGVyY2FsIGNvbnRhaW5zIFRTTElCJ3MgY2FsaWJyYXRpb24KICAgcGFyYW1ldGVycyBhbmQgYXJlIG5lY2Vzc2FyeSB0byBhY2hpZXZlIGFjY3VyYXRlIHBvaW50aW5nLikKCiAgIFRoZSB4MTF2bmMvbWlzYy9xdF90c2xpYl9pbmplY3QucGwgc2NyaXB0IGNhbiBwb3RlbnRpYWxseSBiZSBtb2RpZmllZAogICB0byBoYW5kbGUgb3RoZXIgZGV2aWNlcyB3aGVyZSB0aGUgdWlucHV0IG1ldGhvZCBmYWlscy4gSXQgY291bGQgYWxzbwogICBiZSBtb2RpZmllZCB0byBjcmVhdGUgJ2hvdCBrZXlzJywgZXRjLgoKICAgUGxlYXNlIGxldCB1cyBrbm93IGhvdyB0aGluZ3MgZ28gaWYgeW91IHRyeSB0aGlzIG91dDsgdGhlcmUgaXMgbXVjaCB0bwogICBsZWFybiBhYm91dCBzeW50aGV0aWMgaW5wdXQgaW5qZWN0aW9uIGluIGhhbmRoZWxkcyBhbmQgY2VsbCBwaG9uZXMuIEFzCiAgIHdlIGxlYXJuIG1vcmUgd2UgY2FuIGRldmVsb3AgYSBidWlsdGluIHgxMXZuYyBtb2RlIGZvciB0aGlzIHNvcnQgb2YKICAgaW5qZWN0aW9uLgoKICAgVXBkYXRlIERlYy8yMDEwOiBUaGVyZSBpcyBleHBlcmltZW50YWwgYnVpbHQtaW4gVUlOUFVUIHN1cHBvcnQgaW4gdGhlCiAgIHgxMXZuYyBkZXZlbG9wbWVudCB0YXJiYWxsIGZvciBxdG1va28gd2l0aCB0b3VjaHBhZCBtYW5hZ2VkIGJ5IHRzbGliLgogICBTZWUgLXBpcGVpbnB1dCBVSU5QVVQgZm9yIG1vcmUgaW5mby4gSGVyZSBpcyBhbiBleGFtcGxlOgogICB4MTF2bmMgLXJhd2ZiIGNvbnNvbGUgLXBpcGVpbnB1dCBVSU5QVVQ6dG91Y2gsdHNsaWJfY2FsPS9ldGMvcG9pbnRlcmNhbCxkaXJlCmN0X2Ficz0vZGV2L2lucHV0L2V2ZW50MSxub3VpbnB1dCxkcmFnc2tpcD0zCgoKICAgUS0xMTc6IE5vdyB0aGF0IG5vbi1YMTEgZGV2aWNlcyBjYW4gYmUgZXhwb3J0ZWQgdmlhIFZOQyB1c2luZyB4MTF2bmMsCiAgIGNhbiBJIGJ1aWxkIGl0IHdpdGggbm8gZGVwZW5kZW5jaWVzIG9uIFgxMSBoZWFkZXIgZmlsZXMgYW5kIGxpYnJhcmllcz8KCiAgIFllcywgYXMgb2YgSnVsLzIwMDYgeDExdm5jIGVuYWJsZXMgYnVpbGRpbmcgZm9yIC1yYXdmYiBvbmx5IHN1cHBvcnQuCiAgIEp1c3QgZG8gc29tZXRoaW5nIGxpa2Ugd2hlbiBidWlsZGluZzoKICAuL2NvbmZpZ3VyZSAtLXdpdGhvdXQteCAgICAocGx1cyBhbnkgb3RoZXIgZmxhZ3MpCiAgbWFrZQoKICAgWW91IGNhbiB0aGVuIHRlc3QgdmlhICJsZGQgeDExdm5jIiB0aGF0IHRoZSBiaW5hcnkgZG9lcyBub3QgZGVwZW5kIG9uCiAgIGxpYlgxMS5zbywgZXRjLiBTZWUgdGhlIHByZXZpb3VzIEZBUSdzIGZvciBub24tWDExIGZyYW1lYnVmZmVyIHVzYWdlLgogICBJZiB5b3UgdXNlIHRoaXMgZm9yIGFuIGludGVyZXN0aW5nIG5vbi1YMTEgYXBwbGljYXRpb24gcGxlYXNlIGxldCB1cwogICBrbm93IHdoYXQgeW91IGRpZC4KCgogICBRLTExODogSG93IGRvIEkgY3Jvc3MgY29tcGlsZSB4MTF2bmMgZm9yIGEgZGlmZmVyZW50IGFyY2hpdGVjdHVyZSB0aGFuCiAgIG15IExpbnV4IGkzODYgb3IgYW1kNjQgUEM/CgogICBZb3Ugd2lsbCBuZWVkIGEgY3Jvc3MtY29tcGlsaW5nIHRvb2xjaGFpbi4gUGVyaGFwcyB5b3VyIGRpc3RybwogICBwcm92aWRlcyB0aGVzZSBvciB5b3UgY2FuIGZpbmQgYSBIT1dUTyBmb3IgeW91ciBkaXN0cm8uIFdlIGZvdW5kIGEKICAgbmljZSBvbmUgYXQgcXRtb2tvLm9yZyBmb3IgYnVpbGRpbmcgYXJtZWwgYmluYXJpZXMgb24gRGViaWFuIExpbnV4CiAgIGkzODYgbWFjaGluZXMuIEl0IGluY2x1ZGVzIG1vc3Qgb2YgdGhlIGxpYnJhcmllcyB0aGF0IHgxMXZuYyBuZWVkcy4gV2UKICAgdXNlIHRoYXQgZXhhbXBsZSBoZXJlLgoKICAgV2UgcmFuIHRoaXMgc2NyaXB0IHRvIHNldCBQQVRILCBjb25maWd1cmUsIGFuZCBidWlsZDoKIyEvYmluL3NoCgojIHRvb2xjaGFpbiBmcm9tOiBxdG1va28tZGViaWFuLXRvb2xjaGFpbi1hcm12NHQtZWFiaS50YXIuZ3oKCmV4cG9ydCBQQVRIPS9vcHQvdG9vbGNoYWlucy9hcm05MjB0LWVhYmkvYmluOiRQQVRICgplbnYgQ0M9YXJtLWxpbnV4LWdjYyAuL2NvbmZpZ3VyZSAtLWhvc3Q9YXJtLWxpbnV4IC0td2l0aG91dC1hdmFoaQoKbWFrZQoKYXJtLWxpbnV4LXN0cmlwIC4veDExdm5jL3gxMXZuYwpscyAtbCAuL3gxMXZuYy94MTF2bmMKCiAgIE5vdGUgd2UgaGFkIHRvIGluY2x1ZGUgLS13aXRob3V0LWF2YWhpIGR1ZSB0byBsYWNrIG9mCiAgIGxpYmF2YWhpLWNsaWVudC5zby4zIHN1cHBsaWVkIGJ5IHRoZSB0b29sY2hhaW4gd2UgdXNlZC4gT25lIHdvdWxkIG5lZWQKICAgdG8gYWRkIGl0IGlmIGl0IHdhcyBkZXNpcmVkIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4gV2UgYWxzbyBzdHJpcHBlZAogICB0aGUgYmluYXJ5IHRvIG1ha2UgaXQgc21hbGxlci4KCiAgIEZvciBhbiBlbWJlZGRlZCBzeXN0ZW0gb25lIG1heSBhbHNvIHdhbnQgdG8gYWRkIC0td2l0aG91dC14IGlmIHRoZQogICBlbWJlZGRlZCBzeXN0ZW0gZG9lcyBub3QgdXNlIFgxMSBhbmQgdGhlIC1yYXdmYiBtZWNoYW5pc20gbXVzdCBiZQogICB1c2VkLgoKCiAgIFEtMTE5OiBEb2VzIHgxMXZuYyBzdXBwb3J0IE1hYyBPUyBYIEFxdWEvUXVhcnR6IGRpc3BsYXlzIG5hdGl2ZWx5CiAgIChpLmUuIG5vIFgxMSBpbnZvbHZlZCk/CgogICBZZXMsIHNpbmNlIE5vdi8yMDA2IGluIHRoZSBkZXZlbG9wbWVudCB0cmVlICh4MTF2bmMtMC44LjQgdGFyYmFsbCkKICAgdGhlcmUgaXMgc3VwcG9ydCBmb3IgbmF0aXZlIE1hYyBPUyBYIEFxdWEvUXVhcnR6IGRpc3BsYXlzIHVzaW5nIHRoZQogICAtcmF3ZmIgbWVjaGFuaXNtIGRlc2NyaWJlZCBhYm92ZS4gVGhlIG1vdXNlIGFuZCBrZXlib2FyZCBpbnB1dCBpcwogICBhY2hpZXZlZCB2aWEgTWFjIE9TIFggQVBJJ3MuCgogICBTbyB5b3UgY2FuIHVzZSB4MTF2bmMgYXMgYW4gYWx0ZXJuYXRpdmUgdG8gT1NYdm5jIChha2EgVmluZSBTZXJ2ZXIpLAogICBvciBBcHBsZSBSZW1vdGUgRGVza3RvcCAoQVJEKS4gUGVyaGFwcyB0aGVyZSBpcyBzb21lIHgxMXZuYyBmZWF0dXJlCiAgIHlvdSdkIGxpa2UgdG8gdXNlIG9uIE1hYyBPUyBYLCBldGMuIEZvciBhIG51bWJlciBvZiBhY3Rpdml0aWVzIChlLmcuCiAgIHdpbmRvdyBkcmFncykgaXQgc2VlbXMgdG8gYmUgZmFzdGVyIHRoYW4gT1NYdm5jLgoKICAgTm90ZXM6CgogICBYMTE6ICB4MTF2bmMgd2lsbCBhbHNvIHdvcmsgKGFzIGl0IGhhcyBmb3IgeWVhcnMpIHdpdGggYSBYMTEgc2VydmVyCiAgIChYRGFyd2luKSBydW5uaW5nIG9uIE1hYyBPUyBYIChwZW9wbGUgb2Z0ZW4gaW5zdGFsbCB0aGlzIHNvZnR3YXJlIHRvCiAgIGRpc3BsYXkgcmVtb3RlIFgxMSBhcHBzIG9uIHRoZWlyIE1hYyBPUyBYIHN5c3RlbSwgb3IgdXNlIHNvbWUgb2xkCiAgIGZhdm9yaXRlcyBsb2NhbGx5IHN1Y2ggYXMgeHRlcm0uKSBIb3dldmVyIGluIHRoaXMgY2FzZSB4MTF2bmMgd2lsbAogICBvbmx5IHdvcmsgcmVhc29uYWJseSBpbiBzaW5nbGUgd2luZG93IC1pZCB3aW5kb3dpZCBtb2RlIChhbmQgdGhlCiAgIHdpbmRvdyBtYXkgbmVlZCB0byBoYXZlIG1vdXNlIGZvY3VzLikKCiAgIElmIHlvdSBkbyBub3QgaGF2ZSB0aGUgRElTUExBWSBlbnYuIHZhcmlhYmxlIHNldCwgeDExdm5jIHdpbGwgYXNzdW1lCiAgIG5hdGl2ZSBBcXVhL1F1YXJ0eiBvbiBNYWMgT1MgWCwgaG93ZXZlciBpZiBESVNQTEFZIGlzIHNldCBpdCB3aWxsCiAgIGFzc3VtZSBhbiBYMTEgY29ubmVjdGlvbi4gVXNlICItcmF3ZmIgY29uc29sZSIgdG8gZm9yY2UgdGhlIG5hdGl2ZQogICBkaXNwbGF5IChvciB1bnNldCBESVNQTEFZLikKCiAgIFVwZGF0ZTogTGVvcGFyZCBzZXRzIERJU1BMQVkgYnkgZGVmYXVsdCBpbiBhbGwgc2Vzc2lvbnMuIFNpbmNlIGl0CiAgIHN0YXJ0cyB3aXRoIHRoZSBzdHJpbmcgIi90bXAvIiB4MTF2bmMgd2lsbCB1c2UgdGhhdCB0byBrbm93IGlmIGl0CiAgIHNob3VsZCBpZ25vcmUgaXQuIFVzZSAiLWRpc3BsYXkgOjAuMCIgdG8gZm9yY2UgaXQuCgogICBCdWlsZGluZzogIElmIHlvdSBkb24ndCBoYXZlIHRoZSBYMTEgYnVpbGQgYW5kIHJ1bnRpbWUgcGFja2FnZXMKICAgaW5zdGFsbGVkIHlvdSB3aWxsIG5lZWQgdG8gYnVpbGQgaXQgbGlrZSB0aGlzOgogICAoY2QgdG8gdGhlIGUuZy4geDExdm5jLTAuOSwgc291cmNlIGRpcmVjdG9yeSkKICAgLi9jb25maWd1cmUgLS13aXRob3V0LXgKICAgbWFrZQoKICAgV2luMlZOQy94MnZuYzogIE9uZSBoYW5keSB1c2UgaXMgdG8gdXNlIHRoZSAtbm9mYiBtb2RlIHRvIHJlZGlyZWN0CiAgIG1vdXNlIGFuZCBrZXlib2FyZCBpbnB1dCB0byBhIG5lYXJieSBNYWMgKGkuZS4gb25lIHRvIHRoZSBzaWRlIG9mIHlvdXIKICAgZGVzaykgdmlhIHgydm5jIG9yIFdpbjJWTkMuIFNlZSB0aGlzIEZBUSBmb3IgbW9yZSBpbmZvLgoKICAgT3B0aW9uczogIEhlcmUgYXJlIHRoZSBNYWMgT1MgWCBzcGVjaWZpYyB4MTF2bmMgb3B0aW9uczoKICAgLW1hY25vZGltICAgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWMgT1MgWCBzZXJ2ZXIsIGRpc2FibGUgZGltbWluZy4KICAgLW1hY25vc2xlZXAgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWMgT1MgWCBzZXJ2ZXIsIGRpc2FibGUgZGlzcGxheSBzbGVlcAouCiAgIC1tYWNub3NhdmVyICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjIE9TIFggc2VydmVyLCBkaXNhYmxlIHNjcmVlbnNhdmVyLgogICAtbWFjbm93YWl0ICAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hYyBPUyBYIHNlcnZlciwgZG8gbm90IHdhaXQgZm9yIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgIHVzZXIgdG8gc3dpdGNoIGJhY2sgdG8gaGlzIGRpc3BsYXkuCiAgIC1tYWN3aGVlbCBuICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjIE9TIFggc2VydmVyLCBzZXQgdGhlIG1vdXNlIHdoZWVsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlZWQgdG8gbiAoZGVmYXVsdCA1LikKICAgLW1hY25vc3dhcCAgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWMgT1MgWCBzZXJ2ZXIsIGRvIG5vdCBzd2FwIG1vdXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyAyIGFuZCAzLgogICAtbWFjbm9yZXNpemUgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hYyBPUyBYIHNlcnZlciwgZG8gbm90IHJlc2l6ZSBvciByZXNlCnQKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnJhbWVidWZmZXIgZXZlbiBpZiBpdCBpcyBkZXRlY3RlZCB0aGF0IHRoZSBzY3JlZQpuCiAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x1dGlvbiBvciBkZXB0aCBoYXMgY2hhbmdlZC4KICAgLW1hY2ljb25hbmltIG4gICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWMgT1MgWCBzZXJ2ZXIsIHNldCBuIHRvIHRoZSBudW1iZXIKICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBtaWxsaXNlY29uZHMgdGhhdCB0aGUgd2luZG93IGljb25pZnkvZGVpY29uaWZ5CiAgICAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uIHRha2VzLiAgSW4gLW5jYWNoZSBtb2RlIHRoaXMgdmFsdWUgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gc2tpcCB0aGUgYW5pbWF0aW9uIGlmIHBvc3NpYmxlLiAoZGVmYXVsdCA0MDApCiAgIC1tYWNtZW51ICAgICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjIE9TIFggc2VydmVyLCBpbiAtbmNhY2hlIGNsaWVudC1zaWQKZQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hpbmcgbW9kZSwgdHJ5IHRvIGNhY2hlIHB1bGwgZG93biBtZW51cyAobm90IHBlcmZlCmN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGV5IGhhdmUgYW5pbWF0ZWQgZmFkZXMsIGV0Yy4pCgogICBQYXN0ZUJvYXJkL0NsaXBib2FyZDogICBUaGVyZSBpcyBhIGJ1ZyB0aGF0IHRoZSBDbGlwYm9hcmQgKGNhbGxlZAogICBQYXN0ZUJvYXJkIG9uIE1hYyBpdCBhcHBlYXJzKSBleGNoYW5nZSB3aWxsIG5vdCB0YWtlIHBsYWNlIHVubGVzcwogICB4MTF2bmMgd2FzIHN0YXJ0ZWQgZnJvbSBpbnNpZGUgdGhlIEFxdWEgZGlzcGxheSAoZS5nLiBzdGFydGVkIGluc2lkZSBhCiAgIFRlcm1pbmFsIGFwcCB3aW5kb3cuKSBPdGhlcndpc2UgaXQgY2Fubm90IGNvbm5lY3QgdG8gdGhlIFBhc3RlQm9hcmQKICAgc2VydmVyLiBTbyBDbGlwYm9hcmQgZXhjaGFuZ2Ugd29uJ3Qgd29yayBmb3Igb3VyIHN0YW5kYXJkICJzc2ggaW4iCiAgIHN0YXJ0dXAgc2NoZW1lLgoKICAgSG9wZWZ1bGx5IHRoaXMgZGVmaWNpZW5jeSBjYW4gYmUgcmVtb3ZlZCwgYnV0IHVudGlsIHRoZW4gZm9yIENsaXBib2FyZAogICBleGNoYW5nZSB0byB3b3JrIHlvdSB3aWxsIG5lZWQgdG8gc3RhcnQgeDExdm5jIGluc2lkZSB0aGUgZGVza3RvcAogICBzZXNzaW9uIChpLmUuIGVpdGhlciBzdGFydCBpdCBydW5uaW5nIGJlZm9yZSB5b3UgbGVhdmUsIG9yIHN0YXJ0IHVwIGEKICAgMm5kIHgxMXZuYyBpbnNpZGUgZnJvbSBhIDFzdCBvbmUgc3RhcnRlZCBvdXRzaWRlLCBvciB1c2UgdGhlIGFwcGxlCiAgIHNjcmlwdCBiZWxvdykKCiAgIEhlcmUgYWxzbyBpcyBhIG9zYXNjcmlwdCB0cmljayB0aGF0IHNlZW1zIHRvIHdvcmsgKGl0IG9wZW5zIHRoZQogICBUZXJtaW5hbCBhcHAgYW5kIGluc3RydWN0cyBpdCB0byBzdGFydCB4MTF2bmMpOgoKIyEvYmluL3NoCiMKIyBzdGFydF94MTF2bmM6IHN0YXJ0IHgxMXZuYyBpbiBhIFRlcm1pbmFsIHdpbmRvdwojICh0aGlzIHdpbGwgYWxsb3cgQ2xpcGJvYXJkL1Bhc3RlYm9hcmQgZXhjaGFuZ2UgdG8gd29yaykKCnRtcD0vdG1wL3N0YXJ0X3gxMXZuYy4kJAoKY2F0ID4gJHRtcCA8PEVORAoKdGVsbCBhcHBsaWNhdGlvbiAiVGVybWluYWwiCiAgICAgICAgYWN0aXZhdGUKICAgICAgICBkbyBzY3JpcHQgd2l0aCBjb21tYW5kICIkSE9NRS94MTF2bmMgLXJmYmF1dGggLnZuYy9wYXNzd2QgLXNzbCBTQVZFIgplbmQgdGVsbAoKRU5ECgpvc2FzY3JpcHQgJHRtcApybSAtZiAkdG1wCgogICB3aGVyZSB5b3Ugc2hvdWxkIGN1c3RvbWl6ZSB0aGUgeDExdm5jIGNvbW1hbmQgbGluZSB0byB5b3VyIG5lZWRzIGFuZAogICB0aGUgZnVsbCBwYXRoIHRvIHRoZSBiaW5hcnkuIFNhdmUgaXQgaW4gYSBmaWxlIGUuZy4gInN0YXJ0X3gxMXZuYyIgYW5kCiAgIHRoZW4gYWZ0ZXIgeW91IFNTSCBpbiBqdXN0IHR5cGUgIi4vc3RhcnRfeDExdm5jIiAob3IgaGF2ZSBzc2ggcnVuIHRoZQogICBjb21tYW5kIGZvciB5b3UuKSBUaGVuIG9uY2UgeW91IGFyZSBjb25uZWN0ZWQgdmlhIFZOQywgaWNvbmlmeSB0aGUKICAgVGVybWluYWwgd2luZG93cyAoeW91IGNhbid0IGRlbGV0ZSB0aGVtIHNpbmNlIHRoYXQgd2lsbCBraWxsIHgxMXZuYy4pCgogICBVcGRhdGUgQXVnLzIwMTA6IEEgdXNlciByZXBvcnRzIHRoZSBmb2xsb3dpbmcgdXNlZnVsIGluZm9ybWF0aW9uOgpUaGlzIGlzIG5vdCBhIHByb2JsZW0gb24gTWFjIE9TIFggMTAuNi54IChTbm93IExlb3BhcmQpIHdoZW4gY29ubmVjdGluZwp2aWEgc3NoIHRvIHN0YXJ0IHgxMXZuYy4gIEFuZCwgb24gTWFjIE9TIFggMTAuNS54IChMZW9wYXJkKSwgdGhlIHByb2JsZW0KY2FuIGJlIHBlcm1hbmVudGx5IGVsaW1pbmF0ZWQgYnkgZG9pbmcgdGhpczoKCgpzdWRvIC91c3IvbGliZXhlYy9QbGlzdEJ1ZGR5IC1jICdkZWxldGUgOkxpbWl0TG9hZFRvU2Vzc2lvblR5cGUnIFwKICAgLWMgJ2FkZCA6TGltaXRMb2FkVG9TZXNzaW9uVHlwZSBzdHJpbmcgQmFja2dyb3VuZCcgXAogICAvU3lzdGVtL0xpYnJhcnkvTGF1bmNoQWdlbnRzL2NvbS5hcHBsZS5wYm9hcmQucGxpc3QKIyBpZ25vcmUgYW55ICdEZWxldGU6IEVudHJ5LCAiOkxpbWl0TG9hZFRvU2Vzc2lvblR5cGUiLCBEb2VzIE5vdCBFeGlzdCcgbWVzc2FnZQoKYW5kIHRoZW4gcmVzdGFydGluZyAoeWVzLCB5b3UgbXVzdCByZXN0YXJ0IG5vdCBqdXN0IGxvZyBvZmYpLiAgQnV0Ck9OTFkgZG8gdGhhdCBmb3IgTWFjIE9TIFggMTAuNS54IGFuZCBOT1QgZm9yIDEwLjYueCAod2hpY2ggZG9lc24ndApuZWVkIGl0IGFueXdheSkuCgogICBXZSByZWNlbnRseSBnb3QgYWNjZXNzIHRvIGEgTWFjT1NYIDEwLjYuNCAoU25vdyBMZW9wYXJkKSBtYWNib29rIGFuZAogICBoYXZlIGNvbmZpcm1lZCB0aGF0IHRoZSBhYm92ZSBpcyBjb3JyZWN0LgoKCiAgIFEtMTIwOiBDYW4geDExdm5jIGJlIHVzZWQgYXMgYSBWTkMgcmVmbGVjdG9yL3JlcGVhdGVyIHRvIGltcHJvdmUKICAgcGVyZm9ybWFuY2UgZm9yIHRoZSBjYXNlIG9mIGEgbGFyZ2UgbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBWTkMgdmlld2VycwogICAoZS5nLiBjbGFzc3Jvb20gYnJvYWRjYXN0aW5nIG9yIGEgbGFyZ2UgZGVtbyk/CgogICBZZXMsIGFzIG9mIEZlYi8yMDA3IHRoZXJlIGlzIHRoZSAiLXJlZmxlY3QgaG9zdDpOIiBvcHRpb24gdG8gY29ubmVjdAogICB0byB0aGUgVk5DIHNlcnZlciAiaG9zdDpOIiAoZWl0aGVyIGFub3RoZXIgeDExdm5jIG9yIGFueSBvdGhlciBWTkMKICAgc2VydmVyKSBhbmQgcmUtZXhwb3J0IGl0LiBWTkMgdmlld2VycyB0aGVuIGNvbm5lY3QgdG8gdGhlIHgxMXZuYyhzKQogICBydW5uaW5nIC1yZWZsZWN0LgoKICAgVGhlIC1yZWZsZWN0IG9wdGlvbiBpcyB0aGUgc2FtZSBhczogIi1yYXdmYiB2bmM6aG9zdDpOIi4gU2VlIHRoZQogICAtcmF3ZmIgZGVzY3JpcHRpb24gdW5kZXIgIlZOQyBIT1NUIiBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IGNhbiByZXBsYWNlICJob3N0Ok4iIHdpdGggImxpc3RlbiIgb3IgImxpc3Rlbjpwb3J0IiBmb3IgcmV2ZXJzZQogICBjb25uZWN0aW9ucy4KCiAgIE9uZSBjYW4gc2V0IHVwIGEgbnVtYmVyIG9mIHN1Y2ggcmVmbGVjdG9ycy9yZXBlYXRlcnMgdG8gc3ByZWFkIHRoZQogICByZXNvdXJjZSB1c2FnZSBhcm91bmQsIGUuZy46CiAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwKICAgICAgIEMgLS0tLS0tLTwtLS0tLS0tfAogICAgICAgQyAtLS0tLS0tPC0tLS0tLS18LS0tLSBSIC0tLS0tfAogICAgICAgQyAtLS0tLS0tPC0tLS0tLS18ICAgICAgICAgICAgfAogICAgICAgQyAtLS0tLS0tPC0tLS0tLS18ICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgQyAtLS0tLS0tPC0tLS0tLS18ICAgICAgICAgICAgfAogICAgICAgQyAtLS0tLS0tPC0tLS0tLS18ICAgICAgICAgICAgfAogICAgICAgQyAtLS0tLS0tPC0tLS0tLS18LS0tLSBSIC0tLS0tfAogICAgICAgQyAtLS0tLS0tPC0tLS0tLS18ICAgICAgICAgICAgfAogICAgICAgQyAtLS0tLS0tPC0tLS0tLS18ICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfD09PT09PSBTCiAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwgICAgICAgICAgICB8CiAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwgICAgICAgICAgICB8CiAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwtLS0tIFIgLS0tLS18CiAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwgICAgICAgICAgICB8CiAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwgICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwgICAgICAgICAgICB8CiAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwgICAgICAgICAgICB8CiAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwtLS0tIFIgLS0tLS18CiAgICAgICBDIC0tLS0tLS08LS0tLS0tLXwKICAgICAgIEMgLS0tLS0tLTwtLS0tLS0tfAoKICAgV2hlcmUgIlMiIGlzIHRoZSBvcmlnaW5hbCBWTkMgU2VydmVyLCAiQyIgZGVub3RlIFZOQyB2aWV3ZXIgY2xpZW50cywKICAgYW5kICJSIiBkZW5vdGVzIGFuIHgxMXZuYyBydW5uaW5nIC1yZWZsZWN0IHRvICJTIi4KCiAgIElkZWFsbHksIGEgY2xpZW50ICJDIiB3aWxsIGJlIGZhaXJseSBjbG9zZSBuZXR3b3JrLXdpc2UgdG8gaXRzICJSIi4gSXQKICAgaXMgZmluZSB0byBydW4gdGhlICJSIiBvbiB0aGUgc2FtZSBtYWNoaW5lIGFzIG9uZSBvZiBpdHMgIkMncyIuIEEgbmljZQogICBzZXR1cCBmb3IgYSBsYXJnZSwgKGUuZy4gNjQtMTI4KSB2aWV3ZXIgY2xhc3Nyb29tIGJyb2FkY2FzdCBjYXNlIHdvdWxkCiAgIGJlIHRvIHJ1biBSJ3Mgb24gYXJlYXMgaXNvbGF0ZWQgYnkgbmV0d29yayBzd2l0Y2hlcywgZS5nLiBvbmUgUiBwZXIKICAgc3dpdGNoLgoKICAgSW4gYW4gZXh0cmVtZSBjYXNlIChlLmcuIDEwMDAgdmlld2Vycykgb25lIG1pZ2h0IGFjdHVhbGx5IG5lZWQgYSAybmQKICAgbGF5ZXIgb2YgUidzIGluIHRoZSB0cmVlLiBJZiB5b3UgdHJ5IHNvbWV0aGluZyBsaWtlIHRoYXQgbGV0IHVzIGtub3chCgogICBUaGVyZSBhcmUgbWFueSByZXNvdXJjZSBzYXZpbmdzIGluIGRvaW5nIHNvbWV0aGluZyBsaWtlIHRoZSBhYm92ZS4gVGhlCiAgIGZpcnN0IG9idmlvdXMgb25lIGlzIG5ldHdvcmsgYmFuZHdpZHRoIHNhdmluZ3MuIEFub3RoZXIgaXMgbGVzcyBDUFUKICAgbG9hZCBvbiAiUyIgc2luY2UgaXQgaGFuZGxlcyBtYW55IGZld2VyIHNpbXVsdGFuZW91cyBjb25uZWN0aW9ucy4KICAgQWxzbywgaWYgdGhlcmUgYXJlIGEgZmV3IGNsaWVudHMgQyBvbiB2ZXJ5IHNsb3cgbGlua3MsIHRoZWlyIHByZXNlbmNlCiAgIGRvZXMgbm90IHNsb3cgZG93biBldmVyeSBvdGhlciBjbGllbnQsIGp1c3QgdGhlIGNsaWVudHMgb24gdGhlaXIgIlIiLgogICBPbmUgd2F5IGEgc2xvdyBjbGllbnQgYWZmZWN0cyB0aGluZ3MgaXMgaWYgdGhlcmUgYXJlIHNvbWUgbGFyZ2UKICAgZnJhbWVidWZmZXIgd3JpdGVzIChlLmcuIGpwZWcgaW1hZ2UgcmVnaW9uKSB0aGVuIHRoZSByZXBlYXRlciBtYXkKICAgYmxvY2sgd2FpdGluZyBmb3IgdGhhdCBsYXJnZSB3cml0ZSB0byBmaW5pc2ggYmVmb3JlIGdvaW5nIG9udG8gdGhlCiAgIG5leHQgY2xpZW50IChob3dldmVyLCBpZiB0aGUgd3JpdGUgaXMgc21hbGwgZW5vdWdoLCB0aGUga2VybmVsIHdpbGwKICAgYnVmZmVyIGl0IGFuZCB0aGUgc2VydmVyIGNhbiBnbyBvbiB0byBzZXJ2aWNlIHRoZSBuZXh0IGNsaWVudC4pCgogICBUaGUgeDExdm5jIC1yZWZsZWN0IGltcGxlbWVudGF0aW9uIHVzZXMgdGhlIGxpYnZuY2NsaWVudCBsaWJyYXJ5IGluCiAgIHRoZSBMaWJWTkNTZXJ2ZXIgcHJvamVjdCB0byBoYW5kbGUgdGhlIGNvbm5lY3Rpb24gdG8gIlMiLiBJdCBpcyBub3QKICAgY3VycmVudGx5IHZlcnkgZWZmaWNpZW50IHNpbmNlIGl0IHNpbXBseSBkb2VzIGl0cyBub3JtYWwgZnJhbWVidWZmZXIKICAgcG9sbGluZyBzY2hlbWUgb24gdGhlIGxpYnZuY2NsaWVudCBmcmFtZWJ1ZmZlciAod2hpY2ggaXQgdGhlbgogICByZS1leHBvcnRzIHZpYSBWTkMgdG8gaXRzIGNsaWVudHMgQy4pIEhvd2V2ZXIsIENvcHlSZWN0IGFuZAogICBDdXJzb3JTaGFwZSBlbmNvZGluZ3MgYXJlIHByZXNlcnZlZCBpbiB0aGUgcmVmbGVjdGlvbiBhbmQgdGhhdCBoZWxwcy4KICAgRHJhZ2dpbmcgd2luZG93cyB3aXRoIHRoZSBtb3VzZSBjYW4gYmUgYSBwcm9ibGVtIChlc3BlY2lhbGx5IGlmIFMgaXMKICAgbm90IGRvaW5nIHdpcmVmcmFtaW5nIHNvbWVob3csIGNvbnNpZGVyIC1ub2RyYWdnaW5nIGlmIHRoZSBwcm9ibGVtIGlzCiAgIHNldmVyZSkgRm9yIGEgcmVhbGx5IGZhc3QgcmVmbGVjdG9yL3JlcGVhdGVyIGl0IHdvdWxkIGhhdmUgdG8gYmUKICAgaW1wbGVtZW50ZWQgZnJvbSBzY3JhdGNoIHdpdGggcGVyZm9ybWFuY2UgaW4gbWluZC4gU2VlIHRoZXNlIG90aGVyCiAgIHByb2plY3RzOgogICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy92bmMtcmVmbGVjdG9yLywKICAgIGh0dHA6Ly93d3cudGlnaHR2bmMuY29tL3Byb2plY3Rvci8gICAgICAgICAgICAgICAgKGNsb3NlZCBzb3VyY2U/KSwKCgogICBBdXRvbWF0aW9uIHZpYSBSZXZlcnNlIENvbm5lY3Rpb25zOiAgIEluc3RlYWQgb2YgaGF2aW5nIHRoZSBSJ3MKICAgY29ubmVjdCBkaXJlY3RseSB0byBTIGFuZCB0aGVuIHRoZSBDJ3MgY29ubmVjdCBkaXJlY3RseSB0byB0aGUgUiB0aGV5CiAgIHNob3VsZCB1c2UsIHNvbWUgY29udmVuaWVuY2UgY2FuIGJlIGFjaGlldmVkIGJ5IHVzaW5nIHJldmVyc2UKICAgY29ubmVjdGlvbnMgKHRoZSB4MTF2bmMgIiItY29ubmVjdCBob3N0MSxob3N0MiwuLi4iIG9wdGlvbi4pIFN1cHBvc2UKICAgYWxsIHRoZSBjbGllbnRzICJDIiBhcmUgc3RhcnRlZCB1cCBpbiBMaXN0ZW4gbW9kZToKICAgIGNsaWVudDE+ICB2bmN2aWV3ZXIgLWxpc3RlbgogICAgY2xpZW50Mj4gIHZuY3ZpZXdlciAtbGlzdGVuCiAgICBjbGllbnQzPiAgdm5jdmlld2VyIC1saXN0ZW4KICAgIC4uLgogICAgY2xpZW50NjQ+IHZuY3ZpZXdlciAtbGlzdGVuCgogICAoZS5nLiBjbGllbnQxPiBpcyB0aGUgY21kbGluZSBwcm9tcHQgb24gbWFjaGluZSBjbGllbnQxIC4uLiBldGMpIGFuZAogICBhbGwgdGhlIHJlcGVhdGVycyBSIGFyZSBzdGFydGVkIGxpa2UgdGhpczoKICAgIHJlcGVhdGVyMT4geDExdm5jIC1yZWZsZWN0IGxpc3RlbiAtY29ubmVjdCBjbGllbnQxLGNsaWVudDIsLi4uY2xpZW50OAogICAgcmVwZWF0ZXIyPiB4MTF2bmMgLXJlZmxlY3QgbGlzdGVuIC1jb25uZWN0IGNsaWVudDksY2xpZW50MTAsLi4uY2xpZW50MTYKICAgIC4uLgogICAgcmVwZWF0ZXI4PiB4MTF2bmMgLXJlZmxlY3QgbGlzdGVuIC1jb25uZWN0IGNsaWVudDU3LGNsaWVudDU4LC4uLmNsaWVudDY0CgogICBhbmQgZmluYWxseSB0aGUgbWFpbiBzZXJ2ZXIgaXMgc3RhcnRlZCB0byBraWNrIHRoZSB3aG9sZSB0aGluZyBpbnRvCiAgIG1vdGlvbjoKICAgIHZuY3NlcnZlcj4geDExdm5jIC1kaXNwbGF5IDowIC1jb25uZWN0IHJlcGVhdGVyMSxyZXBlYXRlcjIsLi4ucmVwZWF0ZXI4CgogICAob3IgaW5zdHJ1Y3QgYSBub24teDExdm5jIFZOQyBzZXJ2ZXIgdG8gcmV2ZXJzZSBjb25uZWN0IHRvIHRoZQogICByZXBlYXRlcnMuKSBGb3IgYSBjbGFzc3Jvb20gYnJvYWRjYXN0aW5nIHNldHVwIG9uZSBtaWdodCBoYXZlIHRoZQogICBmaXJzdCB0d28gc2V0cyBvZiBjb21tYW5kcyBzdGFydCBhdXRvbWF0aWNhbGx5IGF0IGJvb3R1cCBvciB3aGVuCiAgIHNvbWVvbmUgbG9ncyBpbiwgYW5kIHRoZW4gc3RhcnQgZXZlcnl0aGluZyB1cCB3aXRoIHRoZSBTIHNlcnZlci4gT25lCiAgIG1heSBldmVuIGJlIGFibGUgdG8gc2NyaXB0IHRoZSBmb3J3YXJkIGNvbm5lY3Rpb24gYm9vdHN0cmFwIGNhc2UsIGxldAogICB1cyBrbm93IHdoYXQgeW91IGRpZC4gQSByZWFsbHkgbmljZSB0aGluZyB3b3VsZCBiZSBzb21lIHNvcnQgb2YKICAgYXV0by1kaXNjb3Zlcnkgb2YgeW91ciByZXBlYXRlciwgZXRjLi4uCgogICBRLTEyMTogQ2FuIHgxMXZuYyBiZSB1c2VkIGR1cmluZyBhIExpbnV4LCBTb2xhcmlzLCBldGMuIHN5c3RlbQogICBJbnN0YWxsYXRpb24gc28gdGhlIEluc3RhbGxhdGlvbiBjYW4gYmUgZG9uZSByZW1vdGVseT8KCiAgIFRoaXMgY2FuIGJlIGRvbmUsIGJ1dCBpdCBkb2Vzbid0IGFsd2F5cyB3b3JrIGJlY2F1c2UgaXQgZGVwZW5kcyBvbiBob3cKICAgdGhlIE9TIGRvZXMgaXRzIGluc3RhbGwuIFdlIGhhdmUgdG8gInNuZWFrIGluIiBzb21laG93LiBOb3RlIHRoYXQgc29tZQogICBPUydzIGhhdmUgYSByZW1vdGUgaW5zdGFsbCAoc3NoIGV0Yy4pIGJ1aWx0IGluIGFuZCBzbyB5b3UgbWlnaHQgd2FudAogICB0byB1c2UgdGhhdCBpbnN0ZWFkLgoKICAgVXN1YWxseSB0aGUgT1MgaW5zdGFsbCB3aWxsIGhhdmUgdG8gYmUgYSBuZXR3b3JrLWluc3RhbGwgaW4gb3JkZXIgdG8KICAgaGF2ZSBuZXR3b3JraW5nIHVwIGR1cmluZyB0aGUgaW5zdGFsbC4gT3RoZXJ3aXNlLCB5b3UgbWF5IGhhdmUgYQogICAoc2xpbSkgY2hhbmNlIHRvIGNvbmZpZ3VyZSB0aGUgbmV0d29ya2luZyBtYW51YWxseSAoaWZjb25maWcoOCkgYW5kCiAgIHJvdXRlKDgpLikKCiAgIFRvIGF2b2lkIGxpYnJhcnkgZGVwZW5kZW5jaWVzIHByb2JsZW1zIGluIHRoZSB0eXBpY2FsIG1pbmltYWwgKGUuZy4KICAgYnVzeWJveCkgaW5zdGFsbGF0aW9uIE9TIGl0IGlzIGEgZ29vZCBpZGVhIHRvIGJ1aWxkIGEgc3RhdGljYWxseQogICBsaW5rZWQgeDExdm5jIGJpbmFyeS4gQSB3YXkgdGhhdCBvZnRlbiB3b3JrcyBpcyB0byBkbyBhIG5vcm1hbCBidWlsZAogICBhbmQgdGhlbiBwYXN0ZSB0aGUgZmluYWwgeDExdm5jIGxpbmsgbGluZSBpbnRvIGEgc2hlbGwgc2NyaXB0LiBUaGVuCiAgIGNoYW5nZSB0aGUgImdjYyIgdG8gImdjYyAtc3RhdGljIiBhbmQgcnVuIHRoZSBzaGVsbCBzY3JpcHQuIFlvdSBtYXkKICAgbmVlZCB0byBkaXNhYmxlIGZlYXR1cmVzIChlLmcuICItLXdpdGhvdXQteGZpeGVzIikgaWYgdGhlcmUgaXMgbm90IGEKICAgc3RhdGljIGxpYnJhcnkgZm9yIHRoZSBmZWF0dXJlIGF2YWlsYWJsZS4gWW91IG1heSBhbHNvIG5lZWQgdG8gYWRkCiAgIGV4dHJhIGxpbmsgb3B0aW9ucyAoZS5nLiAiLWxYcmVuZGVyIikgdG8gY29tcGxldGUgbGlicmFyeSBkZXBlbmRlbmNpZXMKICAgbWFudWFsbHkuCgogICBMZXQncyBjYWxsIHRoZSBiaW5hcnkgeDExdm5jLnN0YXRpYy4gUGxhY2UgaXQgb24gYSB3ZWJzZXJ2ZXIKICAgc29tZXdoZXJlLiBJdCBtYXkgYmUgcG9zc2libGUgdG8gcmV0cmlldmUgaXQgdmlhIHNjcCgxKSB0b28uCgogICBEdXJpbmcgdGhlIGluc3RhbGwgeW91IG5lZWQgdG8gZ2V0IGEgc2hlbGwgdG8gcmV0cmVpdmUgeDExdm5jLnN0YXRpYwogICBhbmQgcnVuIGl0LgoKICAgSWYgdGhlIFNvbGFyaXMgaW5zdGFsbCBpcyBhbiBvbGRlciBYLWJhc2VkIG9uZSwgdGhlcmUgd2lsbCBiZSBhIG1lbnUKICAgZm9yIHlvdSB0byBnZXQgYSB0ZXJtaW5hbCB3aW5kb3cuIEZyb20gdGhhdCB3aW5kb3cgeW91IG1pZ2h0IGJlIGFibGUKICAgdG8gcmV0cmlldmUgeDExdm5jLnN0YXRpYyB2aWEgd2dldCwgc2NwLCBvciBmdHAuIFJlbWVtYmVyIHRvIGRvICJjaG1vZAogICA3NTUgLi94MTF2bmMuc3RhdGljIiBhbmQgdGhlbiBmaW5kIHRoZSAtYXV0aCBmaWxlIGFzIGluIHRoaXMgRkFRLgoKICAgSWYgaXQgaXMgYSBMaW51eCBpbnN0YWxsIHRoYXQgdXNlcyBhbiBYIHNlcnZlciAoZS5nLiBTdVNFIGFuZCBwcm9iYWJseQogICBGZWRvcmEpLCB0aGVuIHlvdSBjYW4gb2Z0ZW4gZ2V0IGEgc2hlbGwgYnkgcHJlc3NpbmcgQ3RybC1BbHQtRjIgb3IKICAgc2ltaWxhci4gVGhlbiBnZXQgdGhlIHgxMXZuYyBiaW5hcnkgdmlhIHNvbWV0aGluZyBsaWtlIHRoaXM6CiAgIGNkIC90bXAKICAgd2dldCBodHRwOi8vMTkyLjE2OC4wLjIyL3gxMXZuYy5zdGF0aWMKICAgY2htb2QgNzU1IC4veDExdm5jLnN0YXRpYwoKICAgRmluZCB0aGUgbmFtZSBvZiB0aGUgYXV0aCBmaWxlIGFzIGluIHRoaXMgRkFRLiAobWF5YmUgcnVuICJwcyB3d2F1eCB8CiAgIGdyZXAgYXV0aCIuKSBUaGVuIHJ1biBpdCBsaWtlIHRoaXM6CiAgIC4veDExdm5jLnN0YXRpYyAtZm9yZXZlciAtbm9wdyAtZGlzcGxheSA6MCAtYXV0aCAvdG1wL3doZXJldmVyL3RoZS9hdXRoZmlsZQoKICAgdGhlbiBwcmVzcyBBbHQtRjcgdG8gZ28gYmFjayB0byB0aGUgWCBpbnN0YWxsLiBZb3Ugc2hvdWxkIG5vdyBiZSBhYmxlCiAgIHRvIGNvbm5lY3QgdmlhIGEgdm5jIHZpZXdlciBhbmQgY29udGludWUgdGhlIGluc3RhbGwuIFdhdGNoIG91dCBmb3IKICAgdGhlIGRpc3BsYXkgYmVpbmcgOjEsIGV0Yy4KCiAgIElmIHRoZXJlIGlzIGEgZmlyZXdhbGwgYmxvY2tpbmcgaW5jb21pbmcgY29ubmVjdGlvbnMgZHVyaW5nIHRoZQogICBpbnN0YWxsLCB1c2UgdGhlICItY29ubmVjdCBob3N0bmFtZSIgb3B0aW9uIG9wdGlvbiBmb3IgYSByZXZlcnNlCiAgIGNvbm5lY3Rpb24gdG8gdGhlIGhvc3RuYW1lIHJ1bm5pbmcgdGhlIFZOQyB2aWV3ZXIgaW4gbGlzdGVuIG1vZGUuCgogICBEZWJpYW4gYmFzZWQgaW5zdGFsbHMgYXJlIGVpdGhlciBjb25zb2xlLXRleHQgb3IgY29uc29sZS1mcmFtZWJ1ZmZlcgogICBiYXNlZC4gVGhlc2UgYXJlIGluc3RhbGwgKG9yIGV4cGVydCkgYW5kIGluc3RhbGxndWkgKG9yIGV4cGVydGd1aSkKICAgYm9vdCBsaW5lcywgcmVzcGVjdGl2ZWx5LiBGb3IgdGhlIGNvbnNvbGUtdGV4dCBiYXNlZCBpbnN0YWxscyB5b3UKICAgcHJvYmFibHkgbmVlZCB0byBhZGQgYSBib290IGNtZCBsaW5lIG9wdGlvbiBsaWtlIHZnYT0weDMxNCAod2hpY2ggaXMKICAgODAweDYwMHgxNikgdG8gZ2V0IHRoZSBjb25zb2xlLXRleHQgdG8gdXNlIHRoZSBsaW51eCBmcmFtZWJ1ZmZlcgogICBkZXZpY2UgcHJvcGVybHkuCgogICBGb3IgYSBEZWJpYW4gY29uc29sZS10ZXh0IGJhc2VkIGluc3RhbGwgYWZ0ZXIgdGhlIG5ldHdvcmsgaXMKICAgY29uZmlndXJlZCBwcmVzcyBDdHJsLUFsdC1GMiB0byBnZXQgYSBzaGVsbC4gUmV0cmlldmUgdGhlIGJpbmFyeSB2aWEKICAgd2dldCBhcyBhYm92ZSBhbmQgY2htb2QgNzU1IGl0LiBUaGVuIHJ1biBpdCBzb21ldGhpbmcgbGlrZSB0aGlzOgogICBzbGVlcCAxMDsgLi94MTF2bmMuc3RhdGljIC1mb3JldmVyIC1ub3B3IC1yYXdmYiBjb25zb2xlCgogICB0aGVuIGJlZm9yZSB0aGUgc2xlZXAgaXMgb3ZlciBwcmVzcyBBbHQtRjEgdG8gZ2V0IGJhY2sgdG8gdGhlIGluc3RhbGwKICAgdmlydHVhbCBjb25zb2xlLiBZb3Ugc2hvdWxkIGJlIGFibGUgdG8gY29ubmVjdCB2aWEgYSBWTkMgdmlld2VyIGFuZAogICBjb250aW51ZSB3aXRoIHRoZSBpbnN0YWxsLgoKICAgRm9yIGEgcmVjZW50ICgyMDA5KSBEZWJpYW4gaW5zdGFsbCB3ZSBib290ZWQgd2l0aCAiZXhwZXJ0IHZnYT0weDMwMSIKICAgYW5kICJleHBlcnQgdmdhPTB4MzExIiB0byBnZXQgY29uc29sZSB0ZXh0IGJhc2VkIGluc3RhbGxzIGF0IDY0MHg0ODB4OAogICBhbmQgNjQweDQ4MHgxNiwgcmVzcGVjdGl2ZWx5IChyZXBsYWNlICJleHBlcnQiIHdpdGggImluc3RhbGwiIGlmIHlvdQogICBsaWtlLikgT3RoZXJ3aXNlIGl0IHdhcyBnaXZpbmcgYSAxNiBjb2xvciA2NDB4NDgweDQgKDQgYml0IHBlciBwaXhlbCkKICAgZGlzcGxheSB3aGljaCB4MTF2bmMgY291bGQgbm90IGhhbmRsZS4KCiAgIEZvciBEZWJpYW4gY29uc29sZS1mcmFtZWJ1ZmZlciBHVUkgYmFzZWQgaW5zdGFsbHMgKGluc3RhbGxndWkgb3IKICAgZXhwZXJ0Z3VpKSB3ZSBoYXZlIG5vdCBiZSBhYmxlIHRvIGVudGVyIGtleXN0cm9rZXMgb3IgbW91c2UgbW90aW9ucy4KICAgVGhpcyBtYXkgYmUgcmVzb2x2ZWQgaWYgdGhlIGluc3RhbGwgaGFkIHRoZSBMaW51eCBrZXJuZWwgbW9kdWxlCiAgIHVpbnB1dCwgYnV0IGl0IGRvZXNuJ3Q7IG9uZSBjYW4gd2dldCB1aW5wdXQua28gYW5kIHRoZW4gcnVuIGluc21vZCBvbgogICBpdCwgYnV0IHRoZSBtb2R1bGUgbXVzdCBtYXRjaCB0aGUgaW5zdGFsbGF0aW9uIGtlcm5lbC4gU28sIGZhaWxpbmcKICAgdGhhdCwgeW91IGNhbiBvbmx5IGRvIHRoZSBHVUkgdmlldy1vbmx5LCB3aGljaCBjYW4gYmUgaGFuZHkgdG8gd2F0Y2ggYQogICBsb25nIG5ldHdvcmsgaW5zdGFsbCBmcm9tIHlvdXIgZGVzayBpbnN0ZWFkIG9mIGluIGZyb250IG9mIHRoZSBtYWNoaW5lCiAgIGJlaW5nIGluc3RhbGxlZC4gRm9yIHRoZXNlLCBhZnRlciB0aGUgbmV0d29yayBpcyBjb25maWd1cmVkIHByZXNzCiAgIEN0cmwtQWx0LUYyIHRvIGdldCBhIHNoZWxsLiBSZXRyaWV2ZSB0aGUgYmluYXJ5IHZpYSB3Z2V0IGFzIGFib3ZlIGFuZAogICBjaG1vZCA3NTUgaXQuIFRoZW4gcnVuIGl0IHNvbWV0aGluZyBsaWtlIHRoaXM6CiAgIHNsZWVwIDEwOyAuL3gxMXZuYy5zdGF0aWMgLWZvcmV2ZXIgLW5vcHcgLXJhd2ZiIGNvbnNvbGUKCiAgIHRoZW4gYmVmb3JlIHRoZSBzbGVlcCBpcyBvdmVyIHByZXNzIEFsdC1GNSB0byBnZXQgYmFjayB0byB0aGUgR1VJCiAgIGluc3RhbGwgY29uc29sZS4gWW91IHNob3VsZCBiZSBhYmxlIHRvIGNvbm5lY3QgdmlhIGEgVk5DIHZpZXdlciBhbmQKICAgd2F0Y2ggdGhlIGluc3RhbGwuCiAgIFtNaXNjOiBDbGlwYm9hcmQsIEZpbGUgVHJhbnNmZXIvU2hhcmluZywgUHJpbnRpbmcsIFNvdW5kLCBCZWVwcywKICAgVGhhbmtzLCBldGMuXQoKICAgUS0xMjI6IERvZXMgdGhlIENsaXBib2FyZC9TZWxlY3Rpb24gZ2V0IHRyYW5zZmVycmVkIGJldHdlZW4gdGhlCiAgIHZuY3ZpZXdlciBhbmQgdGhlIFggZGlzcGxheT8KCiAgIEFzIG9mIEphbi8yMDA0IHgxMXZuYyBzdXBwb3J0cyB0aGUgIkN1dFRleHQiIHBhcnQgb2YgdGhlIFJGQiAoYWthIFZOQykKICAgcHJvdG9jb2wuIFdoZW4gdGV4dCBpcyBzZWxlY3RlZC9jb3BpZWQgaW4gdGhlIFggc2Vzc2lvbiB0aGF0IHgxMXZuYyBpcwogICBwb2xsaW5nIGl0IHdpbGwgYmUgc2VudCB0byBjb25uZWN0ZWQgVk5DIHZpZXdlcnMuIEFuZCB3aGVuIEN1dFRleHQgaXMKICAgcmVjZWl2ZWQgZnJvbSBhIFZOQyB2aWV3ZXIgdGhlbiB4MTF2bmMgd2lsbCBzZXQgdGhlIFgxMSBzZWxlY3Rpb25zCiAgIFBSSU1BUlksIENMSVBCT0FSRCwgYW5kIENVVEJVRkZFUjAgdG8gaXQuIHgxMXZuYyBpcyBhYmxlIHRvIGhvbGQgdGhlCiAgIFBSSU1BUlkgYW5kIENMSVBCT0FSRCBzZWxlY3Rpb25zIChYdm5jIGRvZXMgbm90IHNlZW0gdG8gZG8gdGhpcy4pCgogICBUaGUgWDExIHNlbGVjdGlvbnMgY2FuIGJlIGNvbmZ1c2luZywgZXNwZWNpYWxseSB0byB0aG9zZSBjb21pbmcgZnJvbQogICBXaW5kb3dzIG9yIE1hY09TWCB3aGVyZSB0aGVyZSBpcyBqdXN0IGEgc2luZ2xlICdDbGlwYm9hcmQnLiBUaGUgWDExCiAgIENMSVBCT0FSRCBzZWxlY3Rpb24gaXMgYSBsb3QgbGlrZSB0aGF0IG9mIFdpbmRvd3MgYW5kIE1hY09TWCwgZS5nLgogICBoaWdobGlnaHRlZCB0ZXh0IGlzIHNlbnQgdG8gdGhlIGNsaXBib2FyZCB3aGVuIHRoZSB1c2VyIGFjdGl2YXRlcwogICAiRWRpdCAtPiBDb3B5IiBvciBwcmVzc2VzICJDb250cm9sK0MiIChhbmQgcGFzdGluZyBpdCB2aWEgIkVkaXQgLT4KICAgUGFzdGUiIG9yICJDb250cm9sK1YiLikgVGhlIFgxMSBQUklNQVJZIHNlbGVjdGlvbiBoYXMgYmVlbiBkZXNjcmliZWQKICAgYXMgJ2ZvciBwb3dlciB1c2Vycycgb3IgJ2FuIEVhc3RlciBFZ2cnLiBBcyBzb29uIGFzIHRleHQgaXMKICAgaGlnaGxpZ2h0ZWQgaXQgaXMgc2V0IHRvIHRoZSBQUklNQVJZIHNlbGVjdGlvbiBhbmQgc28gaXQgaXMKICAgaW1tZWRpYXRlbHkgcmVhZHkgZm9yIHBhc3RpbmcsIHVzdWFsbHkgdmlhIHRoZSBNaWRkbGUgTW91c2UgQnV0dG9uIG9yCiAgICJTaGlmdCtJbnNlcnQiLiBTZWUgdGhpcyBqd3ogbGluayBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KCiAgIHgxMXZuYydzIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gd2F0Y2ggYm90aCBDTElQQk9BUkQgYW5kIFBSSU1BUlkgYW5kCiAgIHdoZW5ldmVyIG9uZSBvZiB0aGVtIGNoYW5nZXMsIGl0IHNlbmRzIHRoZSBuZXcgdGV4dCB0byBjb25uZWN0ZWQKICAgdmlld2Vycy4gTm90ZSB0aGF0IHNpbmNlIHRoZSBSRkIgcHJvdG9jb2wgb25seSBoYXMgYSBzaW5nbGUgIkN1dFRleHQiCiAgIHRoZW4gYm90aCBzZWxlY3Rpb25zIGFyZSAibWVyZ2VkIiB0byBzb21lIGRlZ3JlZSAoYW5kIHRoaXMgY2FuIGxlYWQgdG8KICAgY29uZnVzaW5nIHJlc3VsdHMuKSBPbmUgdXNlciB3YXMgY29uZnVzZWQgd2h5IHgxMXZuYyB3YXMgImZvcmdldHRpbmciCiAgIGhpcyBDTElQQk9BUkQgc2VsZWN0aW9uIGFuZCB0aGUgcmVhc29uIHdhcyBoZSBhbHNvIGNoYW5nZWQgUFJJTUFSWQogICBzb21lIHRpbWUgYWZ0ZXIgaGUgY29waWVkIHRleHQgdG8gdGhlIGNsaXBib2FyZC4gVXN1YWxseSBhbiBhcHAgd2lsbAogICBzZXQgUFJJTUFSWSBhcyBzb29uIGFzIGFueSB0ZXh0IGlzIGhpZ2hsaWdodGVkIHNvIGl0IGVhc3kgdG8gc2VlIGhvdwogICBDTElQQk9BUkQgd2FzIGZvcmdvdHRlbi4gVXNlIHRoZSAtbm9wcmltYXJ5IGRlc2NyaWJlZCBiZWxvdyBhcyBhCiAgIHdvcmthcm91bmQuIFNpbWlsYXJseSwgYnkgZGVmYXVsdCB3aGVuIHgxMXZuYyByZWNlaXZlcyBDdXRUZXh0IGl0IHNldHMKICAgYm90aCBDTElQQk9BUkQgYW5kIFBSSU1BUlkgdG8gaXQgKHRoaXMgaXMgcHJvYmFibHkgbGVzcyBjb25mdXNpbmcsIGJ1dAogICBjb3VsZCBwb3NzaWJseSBsZWFkIHRvIHNvbWUgZmFpbHVyZSBtb2RlcyBhcyB3ZWxsLikKCiAgIFlvdSBtYXkgbm90IGxpa2UgdGhlc2UgZGVmYXVsdHMuIEhlcmUgYXJlIHdheXMgdG8gY2hhbmdlIHRoZSBiZWhhdmlvcjoKICAgICAqIElmIHlvdSBkb24ndCB3YW50IHRoZSBDbGlwYm9hcmQvU2VsZWN0aW9uIGV4Y2hhbmdlZCBhdCBhbGwgdXNlIHRoZQogICAgICAgLW5vc2VsIG9wdGlvbi4KICAgICAqIElmIHlvdSB3YW50IGNoYW5nZXMgaW4gUFJJTUFSWSB0byBiZSBpZ25vcmVkIHVzZSB0aGUgLW5vcHJpbWFyeQogICAgICAgb3B0aW9uLgogICAgICogSWYgeW91IHdhbnQgY2hhbmdlcyBpbiBDTElQQk9BUkQgdG8gYmUgaWdub3JlZCB1c2UgdGhlCiAgICAgICAtbm9jbGlwYm9hcmQgb3B0aW9uLgogICAgICogSWYgeW91IGRvbid0IHdhbnQgeDExdm5jIHRvIHNldCBQUklNQVJZIHRvIHRoZSAiQ3V0VGV4dCIgcmVjZWl2ZWQKICAgICAgIGZyb20gdmlld2VycyB1c2UgdGhlIC1ub3NldHByaW1hcnkgb3B0aW9uLgogICAgICogSWYgeW91IGRvbid0IHdhbnQgeDExdm5jIHRvIHNldCBDTElQQk9BUkQgdG8gdGhlICJDdXRUZXh0IgogICAgICAgcmVjZWl2ZWQgZnJvbSB2aWV3ZXJzIHVzZSB0aGUgLW5vc2V0Y2xpcGJvYXJkIG9wdGlvbi4KCiAgIFlvdSBjYW4gYWxzbyBmaW5lLXR1bmUgaXQgYSBiaXQgd2l0aCB0aGUgLXNlbGRpciBkaXIgb3B0aW9uIGFuZCBhbHNvCiAgIC1pbnB1dC4KCiAgIFlvdSBtYXkgbmVlZCB0byB3YXRjaCBvdXQgZm9yIGRlc2t0b3AgdXRpbGl0aWVzIHN1Y2ggYXMgS0RFJ3MKICAgIktsaXBwZXIiIHRoYXQgZG8gb2RkIHRoaW5ncyB3aXRoIHRoZSBzZWxlY3Rpb24sIGNsaXBib2FyZCwgYW5kCiAgIGN1dGJ1ZmZlcnMuCgoKICAgUS0xMjM6IENhbiBJIHVzZSB4MTF2bmMgdG8gcmVjb3JkIGEgU2hvY2sgV2F2ZSBGbGFzaCAob3Igb3RoZXIgZm9ybWF0KQogICB2aWRlbyBvZiBteSBkZXNrdG9wLCBlLmcuIHRvIHJlY29yZCBhIHR1dG9yaWFsIG9yIGRlbW8/CgogICBZZXMsIGl0IGlzIHBvc3NpYmxlIHdpdGggYSBudW1iZXIgb2YgdG9vbHMgdGhhdCByZWNvcmQgVk5DIGFuZAogICB0cmFuc2Zvcm0gaXQgdG8gc3dmIGZvcm1hdCBvciBvdGhlcnMuIE9uZSBzdWNoIHBvcHVsYXIgdG9vbCBpcwogICBweXZuYzJzd2YuIFRoZXJlIGFyZSBhIG51bWJlciBvZiB0dXRvcmlhbHMgKGJyb2tlbiBsaW5rPykgb24gaG93IHRvIGRvCiAgIHRoaXMuIEFub3RoZXIgb3B0aW9uIGlzIHRvIHVzZSB0aGUgdm5jMm1wZyB0aGF0IGNvbWVzIGluIHRoZQogICBMaWJWTkNTZXJ2ZXIgcGFja2FnZS4KICAgQW4gaW1wb3J0YW50IHRoaW5nIHRvIHJlbWVtYmVyIHdoZW4gZG9pbmcgdGhpcyBpcyB0aGF0IHR1bmluZwogICBwYXJhbWV0ZXJzIHNob3VsZCBiZSBhcHBsaWVkIHRvIHgxMXZuYyB0byBzcGVlZCB1cCBpdHMgcG9sbGluZyBmb3IKICAgdGhpcyBzb3J0IG9mIGFwcGxpY2F0aW9uLCBlLmcuICItd2FpdCAxMCAtZGVmZXIgMTAiLgoKICAgUS0xMjQ6IENhbiBJIHRyYW5zZmVyIGZpbGVzIGJhY2sgYW5kIGZvcnRoIHdpdGggeDExdm5jPwoKICAgQXMgb2YgT2N0LzIwMDUgYW5kIE1heS8yMDA2IHgxMXZuYyBlbmFibGVzLCByZXNwZWN0aXZlbHksIHRoZSBUaWdodFZOQwogICBhbmQgVWx0cmFWTkMgZmlsZSB0cmFuc2ZlciBpbXBsZW1lbnRhdGlvbnMgdGhhdCB3ZXJlIGFkZGVkIHRvCiAgIGxpYnZuY3NlcnZlci4gVGhpcyBjdXJyZW50bHkgd29ya3Mgd2l0aCBUaWdodFZOQyBhbmQgVWx0cmFWTkMgdmlld2VycwogICAoYW5kIFdpbmRvd3Mgdmlld2VycyBvbmx5IHN1cHBvcnQgZmlsZXRyYW5zZmVyIGl0IGFwcGVhcnMuLi4gYnV0IHRoZXkKICAgZG8gd29yayB0byBzb21lIGRlZ3JlZSB1bmRlciBXaW5lIG9uIExpbnV4LikKCiAgIFRoZSBTU1ZOQyBVbml4IFZOQyB2aWV3ZXIgc3VwcG9ydHMgVWx0cmFWTkMgZmlsZSB0cmFuc2ZlciBieSB1c2Ugb2YgYQogICBKYXZhIGhlbHBlciBwcm9ncmFtLgoKICAgVGlnaHRWTkMgZmlsZSB0cmFuc2ZlciBpcyBvZmYgYnkgZGVmYXVsdCwgaWYgeW91IHdhbnQgdG8gZW5hYmxlIGl0IHVzZQogICB0aGUgLXRpZ2h0ZmlsZXhmZXIgb3B0aW9uLgoKICAgVWx0cmFWTkMgZmlsZSB0cmFuc2ZlciBpcyBvZmYgYnkgZGVmYXVsdCwgdG8gZW5hYmxlIGl0IHVzZSBzb21ldGhpbmcKICAgbGlrZSAiLXJmYnZlcnNpb24gMy42IC1wZXJtaXRmaWxldHJhbnNmZXIiCiAgIG9wdGlvbnMgKFVsdHJhVk5DIGluY29ycmVjdGx5IHVzZXMgdGhlIFJGQiBwcm90b2NvbCB2ZXJzaW9uIHRvCiAgIGRldGVybWluZSBpZiBpdHMgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZSwgc28geDExdm5jIGhhcyB0byBwcmV0ZW5kIHRvCiAgIGJlIHZlcnNpb24gMy42LikgQXMgb2YgU2VwLzIwMDYgIi11bHRyYWZpbGV4ZmVyIiBpcyBhbiBhbGlhcyBmb3IgdGhlc2UKICAgdHdvIG9wdGlvbnMuIE5vdGUgdGhhdCBydW5uaW5nIGFzIFJGQiB2ZXJzaW9uIDMuNiBtYXkgY29uZnVzZSBvdGhlcgogICBWTkMgVmlld2Vycy4KCiAgIFNhZGx5IHlvdSBjYW5ub3QgZG8gYm90aCAtdGlnaHRmaWxleGZlciBhbmQgLXVsdHJhZmlsZXhmZXIgYXQgdGhlIHNhbWUKICAgdGltZSBiZWNhdXNlIHRoZSBsYXR0ZXIgcmVxdWlyZXMgc2V0dGluZyB0aGUgdmVyc2lvbiB0byAzLjYgYW5kCiAgIHRpZ2h0dm5jIHdpbGwgbm90IGRvIGZpbGV0cmFuc2ZlciB3aGVuIGl0IHNlZXMgdGhhdCB2ZXJzaW9uIG51bWJlci4KCiAgIEFsc28sIGJlY2F1c2Ugb2YgdGhlIHdheSB0aGUgTGliVk5DU2VydmVyIFRpZ2h0Vk5DIGZpbGUgdHJhbnNmZXIgaXMKICAgaW1wbGVtZW50ZWQsIHlvdSBjYW5ub3QgZG8gVGlnaHR2bmMgZmlsZSB0cmFuc2ZlciBpbiAtdW5peHB3IG1vZGUuCiAgIEhvd2V2ZXIsIFVsdHJhVk5DIGZpbGUgdHJhbnNmZXIgZG9lcyB3b3JrIGluIC11bml4cHcgKGJ1dCBpZiBhIGNsaWVudAogICB0cmllcyBpdCBkbyBhIGZpbGV0cmFuc2ZlciBkdXJpbmcgdGhlIGxvZ2luIHByb2Nlc3MgaXQgd2lsbCBiZQogICBkaXNjb25uZWN0ZWQuKQoKICAgSU1QT1JUQU5UOiBwbGVhc2UgdW5kZXJzdGFuZCBpZiAtdWx0cmFmaWxleGZlciBvciAtdGlnaHRmaWxleGZlciBpcwogICBzcGVjaWZpZWQgYW5kIHlvdSBydW4geDExdm5jIGFzIHJvb3QgZm9yLCBzYXksIGluZXRkIG9yIGRpc3BsYXkKICAgbWFuYWdlciAoZ2RtLCBrZG0sIC4uLikgYWNjZXNzIGFuZCB5b3UgZG8gbm90IGhhdmUgaXQgc3dpdGNoIHVzZXJzIHZpYQogICB0aGUgLXVzZXJzIG9wdGlvbiwgdGhlbiBWTkMgVmlld2VycyB0aGF0IGNvbm5lY3QgYXJlIGFibGUgdG8gZG8KICAgZmlsZXRyYW5zZmVyIHJlYWRzIGFuZCB3cml0ZXMgYXMgKnJvb3QqLgoKICAgVGhlIFVsdHJhVk5DIGFuZCBUaWdodFZOQyBzZXR0aW5ncyBjYW4gYmUgdG9nZ2xlZCBvbiBhbmQgb2ZmIGluc2lkZQogICB0aGUgZ3VpIG9yIGJ5IC1SIHJlbW90ZSBjb250cm9sLiBIb3dldmVyIGZvciBUaWdodFZOQyB0aGUgY2hhbmdlZAogICBzZXR0aW5nIG9ubHkgYXBwbGllcyBmb3IgTkVXIGNsaWVudHMsIGN1cnJlbnQgY2xpZW50cyByZXRhaW4gdGhlaXIKICAgVGlnaHRWTkMgZmlsZSB0cmFuc2ZlciBhYmlsaXR5LiBGb3IgVWx0cmFWTkMgaXQgd29ya3MgYmV0dGVyLCBob3dldmVyCiAgIGlmIGFuIFVsdHJhVk5DIGNsaWVudCBoYXMgaW5pdGlhdGVkIGEgZmlsZSB0cmFuc2ZlciBkaWFsb2cgaXQgd2lsbAogICByZW1haW4gaW4gZWZmZWN0IHVudGlsIHRoZSBkaWFsb2cgaXMgY2xvc2VkLiBJZiB5b3Ugd2FudCB0byBzd2l0Y2gKICAgYmV0d2VlbiBVbHRyYVZOQyBhbmQgVGlnaHRWTkMgZmlsZSB0cmFuc2ZlciBpbiB0aGUgZ3VpIG9yIGJ5IHJlbW90ZQogICBjb250cm9sIHlvdSB3aWxsIHByb2JhYmx5IGJlIGZvaWxlZCBieSB0aGUgIi1yZmJ2ZXJzaW9uIDMuNiIgaXNzdWUuCgoKICAgUS0xMjU6IFdoaWNoIFVsdHJhVk5DIGV4dGVuc2lvbnMgYXJlIHN1cHBvcnRlZD8KCiAgIFNvbWUgb2YgdGhlbSBhcmUgc3VwcG9ydGVkLiBUbyBnZXQgVWx0cmFWTkMgVmlld2VycyB0byBhdHRlbXB0IHRvIHVzZQogICB0aGVzZSBleHRlbnNpb25zIHlvdSB3aWxsIG5lZWQgdG8gc3VwcGx5IHRoaXMgb3B0aW9uIHRvIHgxMXZuYzoKICAgLXJmYnZlcnNpb24gMy42CgogICBPciB1c2UgLXVsdHJhZmlsZXhmZXIgd2hpY2ggaXMgYW4gYWxpYXMgZm9yIHRoZSBhYm92ZSBvcHRpb24gYW5kCiAgICItcGVybWl0ZmlsZXRyYW5zZmVyIi4gVWx0cmFWTkMgZXZpZGVudGx5IHRyZWF0cyBhbnkgb3RoZXIgUkZCIHZlcnNpb24KICAgbnVtYmVyIGFzIG5vbi1VbHRyYVZOQy4KCiAgIEhlcmUgYXJlIGEgbGlzdCBvZiB0aGUgVWx0cmFWTkMgZXh0ZW5zaW9ucyBzdXBwb3J0ZWQgYnkgeDExdm5jOgogICAgICogU2VydmVySW5wdXQ6ICJUb2dnbGUgUmVtb3RlIElucHV0IGFuZCBSZW1vdGUgQmxhbmsgTW9uaXRvciIKICAgICAqIEZpbGVUcmFuc2ZlcjogIk9wZW4gRmlsZSBUcmFuc2Zlci4uLiIKICAgICAqIFNpbmdsZVdpbmRvdzogIlNlbGVjdCBTaW5nbGUgV2luZG93Li4uIgogICAgICogVGV4dENoYXQ6ICJPcGVuIENoYXQuLi4iCiAgICAgKiAxL24gU2VydmVyIFNjYWxpbmcKCiAgIFRoZSBTU1ZOQyBVbml4IFZOQyB2aWV3ZXIgc3VwcG9ydHMgdGhlc2UgVWx0cmFWTkMgZXh0ZW5zaW9ucy4KCiAgIFRvIGRpc2FibGUgU2luZ2xlV2luZG93IGFuZCBTZXJ2ZXJJbnB1dCB1c2UgLW5vdWx0cmFleHQgKHRoZSBvdGhlcnMKICAgYXJlIG1hbmFnZWQgYnkgTGliVk5DU2VydmVyLikgU2VlIHRoaXMgb3B0aW9uIHRvbzogLW5vc2VydmVyZHBtcy4KCiAgIEFsc28sIHRoZSBVbHRyYVZOQyByZXBlYXRlciBwcm94eSBpcyBzdXBwb3J0ZWQgZm9yIHVzZSB3aXRoIHJldmVyc2UKICAgY29ubmVjdGlvbnM6ICItY29ubmVjdCByZXBlYXRlcjovL2hvc3Q6cG9ydCtJRDpOTk5OIi4gVXNlIGl0IGZvciBib3RoCiAgIHBsYWludGV4dCBhbmQgU1NMIGNvbm5lY3Rpb25zLiBUaGlzIG1vZGUgY2FuIHNlbmQgYW55IHN0cmluZyBiZWZvcmUKICAgc3dpdGNoaW5nIHRvIHRoZSBWTkMgcHJvdG9jb2wsIGFuZCBzbyBjb3VsZCBiZSB1c2VkIHdpdGggb3RoZXIKICAgcHJveHkvZ2F0ZXdheSB0b29scy4gQWxzbywgYSBwZXJsIHJlcGVhdGVyIGltcGxlbWVudGlvbiBpcyBoZXJlOgogICB1bHRyYXZuY19yZXBlYXRlci5wbAoKCiAgIFEtMTI2OiBDYW4geDExdm5jIGVtdWxhdGUgVWx0cmFWTkMncyBTaW5nbGUgQ2xpY2sgaGVscGRlc2sgbW9kZSBmb3IKICAgVW5peD8gSS5lLiBzb21ldGhpbmcgdmVyeSBzaW1wbGUgZm9yIGEgbmFpdmUgdXNlciB0byBpbml0aWF0ZSBhCiAgIHJldmVyc2Ugdm5jIGNvbm5lY3Rpb24gZnJvbSB0aGVpciBVbml4IGRlc2t0b3AgdG8gYSBoZWxwZGVzawogICBvcGVyYXRvcidzIFZOQyBWaWV3ZXIuCgogICBZZXMsIFVsdHJhVk5DJ3MgU2luZ2xlIENsaWNrIChTQykgbW9kZSBjYW4gYmUgZW11bGF0ZWQgZmFpcmx5IHdlbGwgb24KICAgVW5peC4KCiAgIFdlIHVzZSB0aGUgdGVybSAiaGVscGRlc2siIGJlbG93LCBidXQgaXQgY291bGQgYmUgYW55IHNvcnQgb2YgcmVtb3RlCiAgIGFzc2lzdGFuY2UgeW91IHdhbnQgdG8gc2V0IHVwLCBlLmcuIHNvbWV0aGluZyBmb3IgVW5peC11c2luZyBmcmllbmRzCiAgIG9yIGZhbWlseSB0byB1c2UuIFRoaXMgaW5jbHVkZXMgTWFjIE9TIFguCgogICBBc3N1bWUgeW91IGNyZWF0ZSBhIGhlbHBkZXNrIGRpcmVjdG9yeSAiaGQiIG9uIHlvdXIgd2Vic2l0ZToKICAgaHR0cDovL3d3dy5teXNpdGUuY29tL2hkIChhbnkgd2Vic2l0ZSB0aGF0IHlvdSBjYW4gdXBsb2FkIGZpbGVzIHRvCiAgIHNob3VsZCB3b3JrLCBhbHRob3VnaCByZW1lbWJlciB0aGUgdXNlciB3aWxsIGJlIHJ1bm5pbmcgdGhlIHByb2dyYW1zCiAgIHlvdSBwbGFjZSB0aGVyZS4pCgogICBJbiB0aGF0ICJoZCIgc3ViZGlyZWN0b3J5IGNvcHkgYW4geDExdm5jIGJpbmFyeSB0byBiZSBydW4gb24gdGhlIFVuaXgKICAgdXNlcidzIG1hY2hpbmUgKGUuZy4gTGludXgsIGV0YykgYW5kIGFsc28gY3JlYXRlIGEgZmlsZSBuYW1lZCAidm5jIgogICBjb250YWluaW5nIHRoZSBmb2xsb3dpbmc6CiMhL2Jpbi9zaAoKd2ViaG9zdD0iaHR0cDovL3d3dy5teXNpdGUuY29tL2hkIiAgIyBZb3VyIGhlbHBkZXNrIGRpciBVUkwuCgp2bmNob3N0PSJpcC5zb21lcGxhY2UubmV0IiAgICAgICAgICAjIFlvdXIgaG9zdCBydW5uaW5nICd2bmN2aWV3ZXIgLWxpc3RlbicKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBJdCBjb3VsZCBhbHNvIGJlIHlvdXIgSVAgbnVtYmVyLiBJZiBpdCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGEgcm91dGVyL2ZpcmV3YWxsLCB5b3Ugd2lsbCBuZWVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgY29uZmlndXJlIGl0IHRvIHJlZGlyZWN0IHBvcnQgNTUwMCB0byB5b3UKcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHdvcmtzdGF0aW9uIHJ1bm5pbmcgJ3ZuY3ZpZXdlciAtbGlzdGVuJwoKZGlyPS90bXAvdm5jX2hlbHBkZXNrLiQkICAgICAgICAgICAgIyBNYWtlIGEgdGVtcG9yYXJ5IHdvcmtpbmcgZGlyLgpta2RpciAkZGlyIHx8IGV4aXQgMQpjZCAkZGlyIHx8IGV4aXQgMQoKdHJhcCAiY2QgL3RtcDsgcm0gLXJmICRkaXIiIDAgMiAxNSAgIyBDbGVhbnMgdXAgb24gZXhpdC4KCndnZXQgJHdlYmhvc3QveDExdm5jICAgICAgICAgICAgICAgICMgRmV0Y2ggeDExdm5jIGJpbmFyeS4gIElmIG11bHRpLQpjaG1vZCA3NTUgLi94MTF2bmMgICAgICAgICAgICAgICAgICAjIHBsYXRmb3JtLCB1c2UgJHdlYmhvc3QvYHVuYW1lYC94MTF2bmMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBvciBzaW1pbGFyLgoKLi94MTF2bmMgLWNvbm5lY3Rfb3JfZXhpdCAkdm5jaG9zdCAtcmZicG9ydCAwIC1ub3B3CgogICB3aXRoIHRoZSBob3N0bmFtZXMgLyBJUCBhZGRyZXNzZXMgY3VzdG9taXplZCB0byB5b3VyIGNhc2UuCgogICBPbiB0aGUgaGVscGRlc2sgVk5DIHZpZXdlciBtYWNoaW5lIChpcC5zb21lcGxhY2UubmV0IGluIHRoaXMgZXhhbXBsZSkKICAgeW91IGhhdmUgdGhlIGhlbHBkZXNrIG9wZXJhdG9yIHJ1bm5pbmcgVk5DIHZpZXdlciBpbiBsaXN0ZW4gbW9kZToKICAgdm5jdmlld2VyIC1saXN0ZW4KCiAgIG9yIGlmIG9uIFdpbmRvd3MsIGV0Yy4gc29tZWhvdyBoYXZlIHRoZSBWTkMgdmlld2VyIGJlIGluICJsaXN0ZW4iCiAgIG1vZGUuCgogICBUaGVuLCB3aGVuIHRoZSBuYWl2ZSB1c2VyIG5lZWRzIGFzc2lzdGFuY2UgeW91IGluc3RydWN0IGhpbSB0byBvcGVuIHVwCiAgIGEgdGVybWluYWwgd2luZG93IG9uIGhpcyBVbml4IGRlc2t0b3AgYW5kIHBhc3RlIHRoZSBmb2xsb3dpbmcgaW50byB0aGUKICAgc2hlbGw6CiAgIHdnZXQgLXFPIC0gaHR0cDovL3d3dy5teXNpdGUuY29tL2hkL3ZuYyB8IHNoIC0KCiAgIGFuZCB0aGVuIHByZXNzIEVudGVyLiBZb3UgY291bGQgaGF2ZSB0aGlzIGluc3RydWN0aW9uIG9uIGEgd2ViIHBhZ2Ugb3IKICAgaW4gYW4gZW1haWwgeW91IHNlbmQgaGltLCBldGMuIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgd2dldCBpcwogICBpbnN0YWxsZWQgb24gdGhlIHVzZXIncyBVbml4IG1hY2hpbmUgKGhlIG1pZ2h0IG9ubHkgaGF2ZSBjdXJsIG9yIGx5bngsCiAgIHNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvLikKCgogICBTbyBJIGd1ZXNzIHRoaXMgaXMgYWJvdXQgMy00IGNsaWNrcyAoc3RhcnQgYSB0ZXJtaW5hbCBhbmQgcGFzdGUpIGFuZAogICBwcmVzc2luZyAiRW50ZXIiIGluc3RlYWQgb2YgInNpbmdsZSBjbGljayIuLi4KCiAgIFNlZSB0aGlzIHBhZ2UgZm9yIHNvbWUgdmFyaWF0aW9ucyBvbiB0aGlzIG1ldGhvZCwgZS5nLiBob3cgdG8gYWRkIGEKICAgcGFzc3dvcmQsIFNTTCBDZXJ0aWZpY2F0ZXMsIGV0Yy4KCgogICBJZiB5b3UgZG9uJ3QgaGF2ZSBhIHdlYnNpdGUgKHRoZXJlIGFyZSBtYW55IGZyZWUgb25lcykgb3IgZG9uJ3Qgd2FudAogICB0byB1c2Ugb25lIHlvdSB3aWxsIGhhdmUgdG8gZW1haWwgaGltIGFsbCBvZiB0aGUgaW5ncmVkaWVudHMgKHgxMXZuYwogICBiaW5hcnkgYW5kIGEgbGF1bmNoZXIgc2NyaXB0KSBhbmQgdGVsbCBoaW0gaG93IHRvIHJ1biBpdC4gVGhpcyBjb3VsZAogICBiZSBlYXN5IG9yIGNoYWxsZW5naW5nIGRlcGVuZGluZyBvbiB0aGUgc2tpbGwgb2YgdGhlIG5haXZlIHVuaXgKICAgdXNlci4uLgoKICAgQSBiaXQgb2Ygb2JzY3VyaXR5IHNlY3VyaXR5IGNvdWxkIGJlIHB1dCBpbiB3aXRoIGEgLXBhc3N3ZCwgLXJmYmF1dGgKICAgb3B0aW9ucywgZXRjLiAobm90ZSB0aGF0IHgxMXZuYyB3aWxsIHJlcXVpcmUgYSBwYXNzd29yZCBldmVuIGZvcgogICByZXZlcnNlIGNvbm5lY3Rpb25zLikgTW9yZSBpbmZvIGhlcmUuCgoKICAgRmlyZXdhbGxzOiBJZiB0aGUgaGVscGRlc2sgKHlvdSkgd2l0aCB0aGUgdm5jdmlld2VyIGlzIGJlaGluZCBhCiAgIE5BVC9GaXJld2FsbC9Sb3V0ZXIgdGhlIHJvdXRlciB3aWxsIGhhdmUgdG8gYmUgY29uZmlndXJlZCB0byByZWRpcmVjdAogICBhIHBvcnQgKGkuZS4gNTUwMCBvciBtYXliZSBkaWZmZXJlbnQgb25lIGlmIHlvdSBsaWtlKSB0byB0aGUgdm5jdmlld2VyCiAgIG1hY2hpbmUuIElmIHRoZSB2bmN2aWV3ZXIgbWFjaGluZSBhbHNvIGhhcyBpdHMgb3duIGhvc3QtbGV2ZWwKICAgZmlyZXdhbGwsIHlvdSB3aWxsIGhhdmUgdG8gb3BlbiB1cCB0aGUgcG9ydCB0aGVyZSBhcyB3ZWxsLgoKICAgTkFULTItTkFUOiBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IHRvIGdvICJOQVQtMi1OQVQiLCBpLmUuIGJvdGggVXNlcgogICBhbmQgSGVscGRlc2sgd29ya3N0YXRpb25zIGJlaGluZCBOQVQnaW5nIEZpcmV3YWxsL1JvdXRlcnMgd2l0aG91dAogICBjb25maWd1cmluZyBhIHJvdXRlciB0byBkbyBhIHBvcnQgcmVkaXJlY3Rpb24gKGkuZS4gb24geW91ciBzaWRlLCB0aGUKICAgSGVscERlc2suKSBUbyBhdm9pZCBtb2RpZnlpbmcgZWl0aGVyIGZpcmV3YWxsL3JvdXRlciwgb25lIHdvdWxkIG5lZWQKICAgc29tZSBwdWJsaWMgKElQIGFkZHJlc3MgcmVhY2hhYmxlIG9uIHRoZSBpbnRlcm5ldCkgcmVkaXJlY3Rpb24vcHJveHkKICAgc2VydmljZS4gUGVyaGFwcyBzdWNoIGEgdGhpbmcgZXhpc3RzLiBodHRwOi8vc2MudXZuYy5jb20gcHJvdmlkZXMgdGhpcwogICBzZXJ2aWNlIGZvciB0aGVpciBVbHRyYVZOQyBTaW5nbGUgQ2xpY2sgdXNlcnMuCgogICBVcGRhdGU6IEl0IG1heSBiZSBwb3NzaWJsZSB0byBkbyAiTkFULTItTkFUIiB3aXRoIGEgVURQIHR1bm5lbCBzdWNoIGFzCiAgIGh0dHA6Ly9zYW15LnBsL3B3bmF0Ly4gQWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgdGhhdCBib3RoIE5BVCBmaXJld2FsbHMKICAgYWxsb3cgaW4gVURQIHBhY2tldHMgZnJvbSBhbiBJUCBhZGRyZXNzIHRvIHdoaWNoIGEgVURQIHBhY2tldCBoYXMKICAgcmVjZW50bHkgYmVlbiBzZW50IHRvLiBJZiB5b3UgdHJ5IGl0IG91dCBsZXQgdXMga25vdyBob3cgaXQgd2VudC4KCgogICBWZXJ5IE5haXZlIFVzZXJzOgoKICAgSWYgaXQgaXMgYmV5b25kIHRoZSB1c2VyIGhvdyB0byBvcGVuIGEgdGVybWluYWwgd2luZG93IGFuZCBwYXN0ZSBpbiBhCiAgIGNvbW1hbmQgKHlvdSBoYXZlIG15IGNvbmRvbGVuY2VzLi4uKSB5b3Ugd291bGQgaGF2ZSB0byBzb21laG93IHNldHVwCiAgIGhpcyBXZWIgYnJvd3NlciB0byBkb3dubG9hZCB0aGUgInZuYyIgZmlsZSAob3IgYSBzY3JpcHQgY29udGFpbmluZyB0aGUKICAgYWJvdmUgd2dldCBsaW5lKSBhbmQgcHJvbXB0IHRoZSB1c2VyIGlmIGhlIHdhbnRzIHRvIHJ1biBpdC4gVGhpcyBtYXkKICAgYmUgdHJpY2t5IHRvIHNldCB1cCAod2hpY2ggaXMgcHJvYmFibHkgYSBnb29kIHRoaW5nIHRvIG5vdCBoYXZlIHRoZQogICB3ZWIgYnJvd3NlciByZWFkaWx5IHJ1biBhcmJpdHJhcnkgcHJvZ3JhbXMgZG93bmxvYWRlZCBmcm9tIHRoZQogICBpbnRlcm5ldC4uLikKCiAgIE9uZSBjb21tYW5kLWxpbmUgZnJlZSB3YXksIHRlc3RlZCB3aXRoIEtERSwgaXMgdG8gbmFtZSB0aGUgZmlsZSB2bmMuc2gKICAgYW5kIHRoZW4gaW5zdHJ1Y3QgdGhlIHVzZXIgdG8gcmlnaHQtY2xpY2sgb24gdGhlIGxpbmsgYW5kIGRvICJTYXZlCiAgIExpbmsgQXMiIHRvIGhpcyBEZXNrdG9wLiBJdCB3aWxsIGFwcGVhciBhcyBhbiBpY29uLCBwcm9iYWJseSBvbmUgdGhhdAogICBsb29rcyBsaWtlIGEgdGVybWluYWwgb3IgYSBjb21tYW5kIGxpbmUgcHJvbXB0LiBIZSBuZXh0IHNob3VsZAogICByaWdodC1jbGljayBvbiB0aGUgaWNvbiBhbmQgc2VsZWN0ICJQcm9wZXJ0aWVzIiBhbmQgZ28gdG8gdGhlCiAgICJQZXJtaXNzaW9ucyIgdGFiLiBUaGVuIGluIHRoYXQgZGlhbG9nIHNlbGVjdCB0aGUgY2hlY2tib3ggIklzCiAgIGV4ZWN1dGFibGUiLiBIZSBzaG91bGQgdGhlbiBiZSBhYmxlIHRvIGNsaWNrIG9uIHRoZSBpY29uIHRvIGxhdW5jaCBpdC4KICAgQW5vdGhlciBvcHRpb24gaXMgdG8gcmlnaHQtY2xpY2sgb24gdGhlIGljb24gYW5kIHNlbGVjdCAiT3BlbiBXaXRoIC0+CiAgIE90aGVyIC4uLiIgYW5kIGZvciB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdHlwZSBpbiAiL2Jpbi9zaCIuCiAgIFVuZm9ydHVuYXRlbHkgaW4gYm90aCBjYXNlcyB0aGUgY29tbWFuZCBvdXRwdXQgaXMgbG9zdCBhbmQgc28gZXJyb3JzCiAgIGNhbm5vdCBiZSBkZWJ1Z2dlZCBhcyBlYXNpbHkuIEEgc2ltaWxhciB0aGluZyBhcHBlYXJzIHRvIHdvcmsgaW4gR05PTUUKICAgaWYgdW5kZXIgIlByb3BlcnRpZXMgLT4gUGVybWlzc2lvbnMiIHRoZXkgY2xpY2sgb24gIkV4ZWN1dGUiIGNoZWNrYm94CiAgIGZvciAiT3duZXIiLiBUaGVuIHdoZW4gdGhleSBjbGljayBvbiB0aGUgaWNvbiwgdGhleSB3aWxsIGdldCBhIGRpYWxvZwogICB3aGVyZSB0aGV5IGNhbiBzZWxlY3QgIlJ1biBpbiBUZXJtaW5hbCIuIEluIGdlbmVyYWwgZm9yIHN1Y2ggY2FzZXMsIGlmCiAgIGl0IGlzIGZlYXNpYmxlLCBpdCBtaWdodCBiZSBlYXNpZXIgdG8gc3NoIHRvIGhpcyBtYWNoaW5lIGFuZCBzZXQKICAgdGhpbmdzIHVwIHlvdXJzZWxmLi4uCgoKICAgU1NMIEVuY3J5cHRlZCBIZWxwZGVzayBDb25uZWN0aW9uczoKCiAgIEFzIG9mIEFwci8yMDA3IHgxMXZuYyBzdXBwb3J0cyByZXZlcnNlIGNvbm5lY3Rpb25zIGluIFNTTCBhbmQgc28gd2UKICAgY2FuIGRvIHRoaXMuIE9uIHRoZSBIZWxwZGVzayBzaWRlIChWaWV3ZXIpIHlvdSB3aWxsIG5lZWQgU1RVTk5FTCBvcgogICBiZXR0ZXIgdXNlIHRoZSBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKSBwYWNrYWdlIHdlIHByb3ZpZGUKICAgdGhhdCBhdXRvbWF0ZXMgYWxsIG9mIHRoZSBTU0wgZm9yIHlvdS4KCiAgIFRvIGRvIHRoaXMgY3JlYXRlIGEgZmlsZSBuYW1lZCAidm5jcyIgaW4gdGhlIHdlYnNpdGUgImhkIiBkaXJlY3RvcnkKICAgY29udGFpbmluZyB0aGUgZm9sbG93aW5nOgojIS9iaW4vc2gKCndlYmhvc3Q9Imh0dHA6Ly93d3cubXlzaXRlLmNvbS9oZCIgICMgWW91ciBoZWxwZGVzayBkaXIgVVJMLgoKdm5jaG9zdD0iaXAuc29tZXBsYWNlLm5ldCIgICAgICAgICAgIyBZb3VyIGhvc3QgcnVubmluZyAndm5jdmlld2VyIC1saXN0ZW4nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSXQgY291bGQgYWxzbyBiZSB5b3VyIElQIG51bWJlci4gSWYgaXQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBhIHJvdXRlci9maXJld2FsbCwgeW91IHdpbGwgbmVlZCB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGNvbmZpZ3VyZSBpdCB0byByZWRpcmVjdCBwb3J0IDU1MDAgdG8geW91CnIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyB3b3Jrc3RhdGlvbiBydW5uaW5nICd2bmN2aWV3ZXIgLWxpc3RlbicKCmRpcj0vdG1wL3ZuY19oZWxwZGVzay4kJCAgICAgICAgICAgICMgTWFrZSBhIHRlbXBvcmFyeSB3b3JraW5nIGRpci4KbWtkaXIgJGRpciB8fCBleGl0IDEKY2QgJGRpciB8fCBleGl0IDEKCnRyYXAgImNkIC90bXA7IHJtIC1yZiAkZGlyIiAwIDIgMTUgICMgQ2xlYW5zIHVwIG9uIGV4aXQuCgp3Z2V0ICR3ZWJob3N0L3gxMXZuYyAgICAgICAgICAgICAgICAjIEZldGNoIHgxMXZuYyBiaW5hcnkuICBJZiBtdWx0aS0KY2htb2QgNzU1IC4veDExdm5jICAgICAgICAgICAgICAgICAgIyBwbGF0Zm9ybSwgdXNlICR3ZWJob3N0L2B1bmFtZWAveDExdm5jCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgb3Igc2ltaWxhci4KCi4veDExdm5jIC1jb25uZWN0X29yX2V4aXQgJHZuY2hvc3QgLXJmYnBvcnQgMCAtbm9wdyAtc3NsICAgICMgTm90ZSAtc3NsIG9wdGlvbi4KCiAgIHdpdGggdGhlIGhvc3RuYW1lcyBvciBJUCBhZGRyZXNzZXMgY3VzdG9taXplZCB0byB5b3VyIGNhc2UuCgogICBUaGUgb25seSBjaGFuZ2UgZnJvbSB0aGUgInZuYyIgYWJvdmUgaXMgdGhlIGFkZGl0aW9uIG9mIHRoZSAtc3NsCiAgIG9wdGlvbiB0byB4MTF2bmMuIFRoaXMgd2lsbCBjcmVhdGUgYSB0ZW1wb3JhcnkgU1NMIGNlcnQ6IG9wZW5zc2woMSkKICAgd2lsbCBuZWVkIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgdXNlcidzIGVuZC4gQSBmaXhlZCBTU0wgY2VydCBmaWxlCiAgIGNvdWxkIGJlIHVzZWQgdG8gYXZvaWQgdGhpcyAoYW5kIHByb3ZpZGUgc29tZSBhdXRoZW50aWNhdGlvbjsgbW9yZQogICBpbmZvIGhlcmUuKQoKICAgVGhlIG5haXZlIHVzZXIgd2lsbCBiZSBkb2luZyB0aGlzOgogICB3Z2V0IC1xTyAtIGh0dHA6Ly93d3cubXlzaXRlLmNvbS9oZC92bmNzIHwgc2ggLQoKICAgKG9yIHBlcmhhcHMgZXZlbiB1c2UgaHR0cHM6Ly8gaWYgYXZhaWxhYmxlLikKCiAgIEJ1dCBiZWZvcmUgdGhhdCwgdGhlIGhlbHBkZXNrIG9wZXJhdG9yIG5lZWRzIHRvIGhhdmUgInZuY3ZpZXdlcgogICAtbGlzdGVuIiBydW5uaW5nIGFzIGJlZm9yZSwgaG93ZXZlciBoZSBuZWVkcyBhbiBTU0wgdHVubmVsIGF0IGhpcyBlbmQuCiAgIFRoZSBlYXNpZXN0IHdheSB0byBkbyB0aGlzIGlzIHVzZSBFbmhhbmNlZCBUaWdodFZOQyBWaWV3ZXIgKFNTVk5DKS4KICAgU3RhcnQgaXQsIGFuZCBzZWxlY3QgT3B0aW9ucyAtPiAnUmV2ZXJzZSBWTkMgQ29ubmVjdGlvbiAoLWxpc3RlbiknLgogICBUaGVuIFVOLXNlbGVjdCAnVmVyaWZ5IEFsbCBDZXJ0cycgKHRoaXMgY2FuIGJlIGVuYWJsZWQgbGF0ZXIgaWYgeW91CiAgIHdhbnQ7IHlvdSdsbCBuZWVkIHRoZSB4MTF2bmMgU1NMIGNlcnRpZmljYXRlKSwgYW5kIGNsaWNrICdMaXN0ZW4nLgoKICAgSWYgeW91IGRvbid0IHdhbnQgdG8gdXNlIFNTVk5DIGZvciB0aGUgdmlld2VyLCBidXQgcmF0aGVyIHNldCB1cAogICBTVFVOTkVMIG1hbnVhbGx5IGluc3RlYWQsIG1ha2UgYSBmaWxlICJzdHVubmVsLmNmZyIgY29udGFpbmluZzoKZm9yZWdyb3VuZCA9IHllcwpwaWQgPQoKW3ZuY10KYWNjZXB0ID0gNTUwMApjb25uZWN0ID0gbG9jYWxob3N0OjU1MDEKCiAgIGFuZCBydW46CiAgc3R1bm5lbCAuL3N0dW5uZWwuY2ZnCgogICBhbmQgdGhlbiBzdGFydCB0aGUgInZuY3ZpZXdlciAtbGlzdGVuIDEiIChpLmUuIDEgdG8gY29ycmVzcG9uZCB0byB0aGUKICAgNTUwMSBwb3J0LikgTm90ZSB0aGF0IHRoaXMgYXNzdW1lcyB0aGUgc3R1bm5lbCBpbnN0YWxsIGNyZWF0ZWQgYQogICBTZXJ2ZXIgU1NMIGNlcnQra2V5LCB1c3VhbGx5IC9ldGMvc3R1bm5lbC9zdHVubmVsLnBlbSAobm90IGFsbCBkaXN0cm9zCiAgIHdpbGwgZG8gdGhpcy4pIEFsc28sIHRoYXQgZmlsZSBpcyBieSBkZWZhdWx0IG9ubHkgcmVhZGFibGUgYnkgcm9vdCwgc28KICAgc3R1bm5lbCBuZWVkcyB0byBiZSBydW4gYXMgcm9vdC4gSWYgeW91ciBzeXN0ZW0gZG9lcyBub3QgaGF2ZSBhIGtleQogICBpbnN0YWxsZWQgb3IgeW91IGRvIG5vdCB3YW50IHRvIHJ1biBzdHVubmVsIGFzIHJvb3QgKG9yIGNoYW5nZSB0aGUKICAgcGVybWlzc2lvbnMgb24gdGhlIGZpbGUpLCB5b3UgY2FuIHVzZSB4MTF2bmMgdG8gY3JlYXRlIG9uZSBmb3IgeW91IGZvcgogICBleGFtcGxlOgogIHgxMXZuYyAtc3NsR2VuQ2VydCBzZXJ2ZXIgc2VsZjpteXN0dW5uZWwKCiAgIGFuc3dlciB0aGUgcHJvbXB0cyB3aXRoIHdoYXRldmVyIHlvdSB3YW50OyB5b3UgY2FuIHRha2UgdGhlIGRlZmF1bHQKICAgZm9yIGFsbCBvZiB0aGVtIGlmIHlvdSBsaWtlLiBUaGUgb3BlbnNzbCgxKSBwYWNrYWdlIG11c3QgYmUgaW5zdGFsbGVkLgogICBTZWUgdGhpcyBsaW5rIGFuZCB0aGlzIG9uZSB0b28gZm9yIG1vcmUgaW5mbyBvbiBTU0wgY2VydHMuIFRoaXMKICAgY3JlYXRlcyAkSE9NRS8udm5jL2NlcnRzL3NlcnZlci1zZWxmOm15c3R1bm5lbC5wZW0sIHRoZW4geW91IHdvdWxkCiAgIGNoYW5nZSB0aGUgInN0dW5uZWwuY2ZnIiB0byBsb29rIHNvbWV0aGluZyBsaWtlOgpmb3JlZ3JvdW5kID0geWVzCnBpZCA9CmNlcnQgPSAvaG9tZS9teXVzZXJuYW1lLy52bmMvY2VydHMvc2VydmVyLXNlbGY6bXlzdHVubmVsLnBlbQoKW3ZuY10KYWNjZXB0ID0gNTUwMApjb25uZWN0ID0gbG9jYWxob3N0OjU1MDEKCiAgIEluIGFueSBldmVudCwgd2l0aCBzdHVubmVsIGhhdmluZyBiZWVuIHNldHVwLCB0aGUgbmFpdmUgdXNlciBpcwogICBpbnN0cnVjdGVkIHRvIHBhc3RlIGluIGFuZCBydW46CiAgIHdnZXQgLXFPIC0gaHR0cDovL3d3dy5teXNpdGUuY29tL2hkL3ZuY3MgfCBzaCAtCgogICB0byBwaWNrIHVwIHRoZSB2bmNzIHNjcmlwdCB0aGlzIHRpbWUuCgogICBPZiBjb3Vyc2UgaWYgYSBtYW4taW4tdGhlLW1pZGRsZSBjYW4gYWx0ZXIgd2hhdCB0aGUgdXNlciBkb3dubG9hZHMKICAgdGhlbiBhbGwgYmV0cyBhcmUgb2ZmIS4KCiAgIE1vcmUgU1NMIHZhcmlhdGlvbnMgYW5kIGluZm8gYWJvdXQgY2VydGlmaWNhdGVzIGNhbiBiZSBmb3VuZCBoZXJlLgoKCiAgIE9wZW5TU0wgbGlic3NsLnNvLjAuOS43IHByb2JsZW1zOgoKICAgSWYgeW91IGJ1aWxkIHlvdXIgb3duIHN0dW5uZWwgb3IgeDExdm5jIGZvciBkZXBsb3ltZW50LCB5b3UgbWF5IHdhbnQKICAgdG8gc3RhdGljYWxseSBsaW5rIGxpYnNzbC5hIGFuZCBsaWJjcnlwdG8uYSBpbnRvIGl0IGJlY2F1c2UgTGludXgKICAgZGlzdHJvcyBhcmUgY3VycmVudGx5IGEgYml0IG9mIGEgbWVzcyByZWdhcmRpbmcgd2hpY2ggdmVyc2lvbiBvZgogICBsaWJzc2wgaXMgaW5zdGFsbGVkLgoKICAgWW91IHdpbGwgZmluZCB0aGUgZGV0YWlscyBoZXJlLgoKCiAgIFEtMTI3OiBDYW4gSSAodGVtcG9yYXJpbHkpIG1vdW50IG15IGxvY2FsICh2aWV3ZXItc2lkZSkgV2luZG93cy9TYW1iYQogICBGaWxlIHNoYXJlIG9uIHRoZSBtYWNoaW5lIHdoZXJlIHgxMXZuYyBpcyBydW5uaW5nPwoKICAgWW91IHdpbGwgaGF2ZSB0byB1c2UgYW4gZXh0ZXJuYWwgbmV0d29yayByZWRpcmVjdGlvbiBmb3IgdGhpcy4KICAgRmlsZXN5c3RlbSBtb3VudGluZyBpcyBub3QgcGFydCBvZiB0aGUgVk5DIHByb3RvY29sLgoKICAgV2Ugc2hvdyBhIHNpbXBsZSBTYW1iYSBleGFtcGxlIGhlcmUuCgogICBGaXJzdCB5b3Ugd2lsbCBuZWVkIGEgdHVubmVsIHRvIHJlZGlyZWN0IHRoZSBTTUIgcmVxdWVzdHMgZnJvbSB0aGUKICAgcmVtb3RlIG1hY2hpbmUgdG8gdGhlIG9uZSB5b3Ugc2l0dGluZyBhdC4gV2UgdXNlIGFuIHNzaCB0dW5uZWw6CiAgc2l0dGluZy1oZXJlPiBzc2ggLUMgLVIgMTEzOTpsb2NhbGhvc3Q6MTM5IGZhci1hd2F5LmVhc3QKCiAgIE9yIG9uZSBjb3VsZCBjb21iaW5lIHRoaXMgd2l0aCB0aGUgVk5DIHR1bm5lbCBhdCB0aGUgc2FtZSB0aW1lLCBlLmcuOgogIHNpdHRpbmctaGVyZT4gc3NoIC1DIC1SIDExMzk6bG9jYWxob3N0OjEzOSAtdCAtTCA1OTAwOmxvY2FsaG9zdDo1OTAwIGZhci1hd2F5Ci5lYXN0ICd4MTF2bmMgLWxvY2FsaG9zdCAtZGlzcGxheSA6MCcKCiAgIFBvcnQgMTM5IGlzIHRoZSBXaW5kb3dzIFNlcnZpY2UgcG9ydC4gRm9yIFdpbmRvd3Mgc3lzdGVtcyBpbnN0ZWFkIG9mCiAgIFNhbWJhLCB5b3UgbWF5IG5lZWQgdG8gdXNlIHRoZSBhY3R1YWwgSVAgYWRkcmVzcyBvZiB0aGUgV2luZG93IG1hY2hpbmUKICAgaW5zdGVhZCBvZiAibG9jYWxob3N0IiBpbiB0aGUgLVIgb3B0aW9uIChzaW5jZSB0aGUgV2luZG93cyBzZXJ2aWNlCiAgIGRvZXMgbm90IGxpc3RlbiBvbiBsb2NhbGhvc3QgYnkgZGVmYXVsdC4pCgogICBOb3RlIHRoYXQgd2UgdXNlIDExMzkgaW5zdGVhZCBvZiAxMzkgb24gdGhlIHJlbW90ZSBzaWRlIGJlY2F1c2UgMTM5CiAgIHdvdWxkIHJlcXVpcmUgcm9vdCBwZXJtaXNzaW9uIHRvIGxpc3RlbiBvbiAoYW5kIHlvdSBtYXkgaGF2ZSBhIHNhbWJhCiAgIHNlcnZlciBydW5uaW5nIG9uIGl0IGFscmVhZHkuKQoKICAgVGhlIHNzaCAtQyBpcyB0byBlbmFibGUgY29tcHJlc3Npb24sIHdoaWNoIG1pZ2h0IHNwZWVkIHVwIHRoZSBkYXRhCiAgIHRyYW5zZmVycy4KCiAgIERlcGVuZGluZyBvbiB0aGUgcmVtb3RlIHN5c3RlbSBzaWRlIGNvbmZpZ3VyYXRpb24sIGl0IG1heSBvciBtYXkgbm90CiAgIGJlIHBvc3NpYmxlIHRvIG1vdW50IHRoZSBTTUIgc2hhcmUgYXMgYSBub24tcm9vdCB1c2VyLiBUcnkgaXQgZmlyc3QgYXMKICAgYSBub24tcm9vdCB1c2VyIGFuZCBpZiB0aGF0IGZhaWxzIHlvdSB3aWxsIGhhdmUgdG8gYmVjb21lIHJvb3QuCgogICBXZSB3aWxsIGFzc3VtZSB0aGUgdXNlciBuYW1lIGlzICJmcmVkIiBhbmQgd2Ugd2lsbCB0cnkgdG8gbW91bnQgdGhlCiAgIHZpZXdlci1zaWRlIFdpbmRvd3MgU01CIHNoYXJlICIvL2hheXN0YWNrL3B1YiIgaW4KICAgL2hvbWUvZnJlZC9zbWItaGF5c3RhY2stcHViLgogIGZhci1hd2F5PiBta2RpciAtcCAvaG9tZS9mcmVkL3NtYi1oYXlzdGFjay1wdWIKICBmYXItYXdheT4gc21ibW91bnQgLy9oYXlzdGFjay9wdWIgL2hvbWUvZnJlZC9zbWItaGF5c3RhY2stcHViIC1vIHVzZXJuYW1lPWZyZQpkLGlwPTEyNy4wLjAuMSxwb3J0PTExMzkKCiAgIChUaGUgMm5kIGNvbW1hbmQgbWF5IG5lZWQgdG8gYmUgcnVuIGFzIHJvb3QuKSBUaGVuIHJ1biAiZGYiIG9yICJscyAtbAogICAvaG9tZS9mcmVkL3NtYi1oYXlzdGFjay1wdWIiIHRvIHNlZSBpZiBpdCBpcyBtb3VudGVkIHByb3Blcmx5LiBDb25zdWx0CiAgIHRoZSBzbWJtb3VudCg4KSBhbmQgcmVsYXRlZCBkb2N1bWVudGF0aW9uIChpdCBtYXkgcmVxdWlyZSBzb21lCiAgIGZpZGRsaW5nIHRvIGdldCB3cml0ZSBwZXJtaXNzaW9ucyBjb3JyZWN0LCBldGMuKSBUbyB1bm1vdW50OgogIGZhci1hd2F5PiBzbWJ1bW91bnQgL2hvbWUvZnJlZC9zbWItaGF5c3RhY2stcHViCgogICBBdCBzb21lIHBvaW50IHdlIGhvcGUgdG8gZm9sZCBzb21lIGF1dG9tYXRpb24gZm9yIFNNQiBzc2ggcmVkaXIgc2V0dXAKICAgaW50byB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgcGFja2FnZSB3ZSBwcm92aWRlIChhcyBvZgogICBTZXAgMjAwNiBpdCBpcyB0aGVyZSBmb3IgdGVzdGluZy4pCgoKICAgUS0xMjg6IENhbiBJIHJlZGlyZWN0IENVUFMgcHJpbnQgam9icyBmcm9tIHRoZSByZW1vdGUgZGVza3RvcCB3aGVyZQogICB4MTF2bmMgaXMgcnVubmluZyB0byBhIHByaW50ZXIgb24gbXkgbG9jYWwgKHZpZXdlci1zaWRlKSBtYWNoaW5lPwoKICAgWW91IHdpbGwgaGF2ZSB0byB1c2UgYW4gZXh0ZXJuYWwgbmV0d29yayByZWRpcmVjdGlvbiBmb3IgdGhpcy4KICAgUHJpbnRpbmcgaXMgbm90IHBhcnQgb2YgdGhlIFZOQyBwcm90b2NvbC4KCiAgIFdlIHNob3cgYSBzaW1wbGUgVW5peCB0byBVbml4IENVUFMgZXhhbXBsZSBoZXJlLiBOb24tQ1VQUyBwb3J0CiAgIHJlZGlyZWN0aW9ucyAoZS5nLiBMUEQpIHNob3VsZCBhbHNvIGJlIHBvc3NpYmxlLCBidXQgbWF5IGJlIGEgYml0IG1vcmUKICAgdHJpY2t5LiBJZiB5b3UgYXJlIHZpZXdpbmcgb24gV2luZG93cyBTTUIgYW5kIGRvbid0IGhhdmUgYSBsb2NhbCBjdXBzCiAgIHNlcnZlciBpdCBtYXkgYmUgdHJpY2tpZXIgc3RpbGwgKHNlZSBiZWxvdy4pCgogICBGaXJzdCB5b3Ugd2lsbCBuZWVkIGEgdHVubmVsIHRvIHJlZGlyZWN0IHRoZSBwcmludCByZXF1ZXN0cyBmcm9tIHRoZQogICByZW1vdGUgbWFjaGluZSB0byB0aGUgb25lIHlvdSBzaXR0aW5nIGF0LiBXZSB1c2UgYW4gc3NoIHR1bm5lbDoKICBzaXR0aW5nLWhlcmU+IHNzaCAtQyAtUiA2NjMxOmxvY2FsaG9zdDo2MzEgZmFyLWF3YXkuZWFzdAoKICAgT3Igb25lIGNvdWxkIGNvbWJpbmUgdGhpcyB3aXRoIHRoZSBWTkMgdHVubmVsIGF0IHRoZSBzYW1lIHRpbWUsIGUuZy46CiAgc2l0dGluZy1oZXJlPiBzc2ggLUMgLVIgNjYzMTpsb2NhbGhvc3Q6NjMxIC10IC1MIDU5MDA6bG9jYWxob3N0OjU5MDAgZmFyLWF3YXkKLmVhc3QgJ3gxMXZuYyAtbG9jYWxob3N0IC1kaXNwbGF5IDowJwoKICAgUG9ydCA2MzEgaXMgdGhlIGRlZmF1bHQgQ1VQUyBwb3J0LiBUaGUgYWJvdmUgYXNzdW1lcyB5b3UgaGF2ZSBhIEN1cHMKICAgc2VydmVyIHJ1bm5pbmcgb24geW91ciB2aWV3ZXIgbWFjaGluZSAobG9jYWxob3N0OjYzMSksIGlmIG5vdCwgdXNlCiAgIHNvbWV0aGluZyBsaWtlIG15LWN1cHMtc3J2OjYzMSAodGhlIHZpZXdlci1zaWRlIEN1cHMgc2VydmVyKSBpbiB0aGUgLVIKICAgaW5zdGVhZC4KCiAgIE5vdGUgdGhhdCB3ZSB1c2UgNjYzMSBpbnN0ZWFkIG9mIDYzMSBvbiB0aGUgcmVtb3RlIHNpZGUgYmVjYXVzZSA2MzEKICAgd291bGQgcmVxdWlyZSByb290IHBlcm1pc3Npb24gdG8gbGlzdGVuIG9uIChhbmQgeW91IGxpa2VseSBoYXZlIGEgY3VwcwogICBzZXJ2ZXIgcnVubmluZyBvbiBpdCBhbHJlYWR5LikKCiAgIE5vdyB0aGUgdHJpY2t5IHBhcnQ6IHRvIGdldCBhcHBsaWNhdGlvbnMgdG8gbm90aWNlIHlvdXIgY3VwcwogICBzZXJ2ZXIvcHJpbnRlciBvbiBsb2NhbGhvc3Q6NjYzMS4KCiAgIElmIHlvdSBoYXZlIGFkbWluaXN0cmF0aXZlIHByaXZpbGVnZSAoaS5lLiByb290IHBhc3N3b3JkKSBvbiB0aGUKICAgeDExdm5jIHNpZGUgd2hlcmUgdGhlIGRlc2t0b3AgaXMgcnVubmluZywgaXQgc2hvdWxkIGJlIGVhc3kgdG8gYWRkIHRoZQogICBwcmludGVyIHRocm91Z2ggc29tZSBjb25maWd1cmF0aW9uIHV0aWxpdHkgKGUuZy4gaW4gS0RFOiBVdGlsaXRpZXMgLT4KICAgUHJpbnRpbmcgLT4gUHJpbnRpbmcgTWFuYWdlciwgYW5kIHRoZW4gc3VwcGx5IGFkbWluIHBhc3N3b3JkLCBhbmQgdGhlbgogICBBZGQgUHJpbnRlci9DbGFzcywgYW5kIHRoZW4gZmlsbCBpbiB0aGUgaW5xdWlzaXRpdmUgd2l6YXJkLiBNb3N0CiAgIGltcG9ydGFudCBpcyB0aGUgIlJlbW90ZSBJUFAgc2VydmVyIiBwYW5lbCB3aGVyZSB5b3UgcHV0IGluIGxvY2FsaG9zdAogICBmb3IgSG9zdCBhbmQgNjYzMSBmb3IgUG9ydC4pIFRoZSBtYWluIHNldHRpbmcgeW91IHdhbnQgdG8gY29udmV5IGlzCiAgIHRoZSBob3N0IGlzIGxvY2FsaG9zdCBhbmQgdGhlIHBvcnQgaXMgbm9uLXN0YW5kYXJkIChlLmcuIDY2MzEuKSBTb21lCiAgIGNvbmZpZ3VyYXRpb24gdXRpbGl0aWVzIHdpbGwgdGFrZSBhbiBJbnRlcm5ldCBQcmludGluZyBQcm90b2NvbCAoSVBQKQogICBVUkksIGUuZy4gaHR0cDovL2xvY2FsaG9zdDo2NjMxL3ByaW50ZXJzLywKICAgaXBwOi8vbG9jYWxob3N0OjY2MzEvcHJpbnRlcnMvcHJpbnRlci1uYW1lLAogICBpcHA6Ly9sb2NhbGhvc3Q6NjYzMS9pcHAvcHJpbnRlci1uYW1lLCBldGMuIENoZWNrIHlvdXIgQ1VQUwogICBkb2N1bWVudGF0aW9uIGFuZCBhZG1pbiBpbnRlcmZhY2VzIHRvIGZpbmQgd2hhdCB0aGUgc3ludGF4IGlzIGFuZCB3aGF0CiAgIHRoZSAicHJpbnRlciBuYW1lIiBpcy4KCiAgIElmIHlvdSBkbyBub3QgaGF2ZSByb290IG9yIHByaW50IGFkbWluIHByaXZpbGVnZXMsIGJ1dCBhcmUgcnVubmluZyBhCiAgIHJlY2VudCAodmVyc2lvbiAxLjIgb3IgZ3JlYXRlcikgb2YgdGhlIEN1cHMgY2xpZW50IHNvZnR3YXJlLCB0aGVuIGFuCiAgIGVhc3kgd2F5IHRvIHRlbXBvcmFyaWx5IHN3aXRjaCBDdXBzIHNlcnZlcnMgaXMgdG8gY3JlYXRlIHRoZSBkaXJlY3RvcnkKICAgYW5kIGZpbGU6ICRIT01FLy5jdXBzL2NsaWVudC5jb25mIG9uIHRoZSByZW1vdGUgc2lkZSB3aXRoIGEgbGluZSBsaWtlOgogIFNlcnZlck5hbWUgbG9jYWxob3N0OjY2MzEKCiAgIFdoZW4gbm90IHVzaW5nIHgxMXZuYyBmb3IgcmVtb3RlIGFjY2VzcyB5b3UgY2FuIGNvbW1lbnQgdGhlIGFib3ZlIGxpbmUKICAgb3V0IHdpdGggYSAnIycgKG9yIHJlbmFtZSB0aGUgY2xpZW50LmNvbmYgZmlsZSksIHRvIGhhdmUgbm9ybWFsIGN1cHMKICAgb3BlcmF0aW9uLgoKICAgVW5mb3J0dW5hdGVseSwgcnVubmluZyBhcHBsaWNhdGlvbnMgbWF5IG5lZWQgdG8gYmUgcmVzdGFydGVkIHRvIG5vdGljZQogICB0aGUgbmV3IHByaW50ZXJzIChsaWJjdXBzIGRvZXMgbm90IHRyYWNrIGNoYW5nZXMgaW4gY2xpZW50LmNvbmYuKQogICBEZXBlbmRpbmcgb24gY2lyY3Vtc3RhbmNlcywgYSBydW5uaW5nIGFwcGxpY2F0aW9uIG1heSBhY3R1YWxseSBub3RpY2UKICAgdGhlIG5ldyBwcmludGVycyB3aXRob3V0IHJlc3RhcnRpbmcgKGUuZy4gbm8gcHJpbnQgZGlhbG9nIGhhcyB0YWtlbgogICBwbGFjZSB5ZXQsIG9yIHRoZXJlIGFyZSBubyBDVVBTIHByaW50ZXJzIGNvbmZpZ3VyZWQgb24gdGhlIHJlbW90ZQogICBzaWRlLikKCiAgIEN1cHMgY2xpZW50IHNvZnR3YXJlIHRoYXQgaXMgb2xkZXIgKDEuMSkgZG9lcyBub3Qgc3VwcG9ydCBhcHBlbmRpbmcKICAgdGhlIHBvcnQgbnVtYmVyLCBhbmQgZm9yIG5ld2VyIG9uZXMgdGhlcmUgaXMgYSBidWcgcHJldmVudGluZyBpdCBmcm9tCiAgIGFsd2F5cyB3b3JraW5nIChmaXhlZCBpbiAxLjIuMy4pIEtsdWRnZXMgbGlrZSB0aGVzZSBhdCB0aGUgY29tbWFuZAogICBsaW5lIHdpbGwgd29yazoKICBmYXItYXdheT4gZW52IENVUFNfU0VSVkVSPWxvY2FsaG9zdCBJUFBfUE9SVD02NjMxIGxwc3RhdCAtcCAtZAogIGZhci1hd2F5PiBlbnYgQ1VQU19TRVJWRVI9bG9jYWxob3N0IElQUF9QT1JUPTY2MzEgbHByIC1QIG15cHJpbnRlciBmaWxlLnBzCiAgZmFyLWF3YXk+IGVudiBDVVBTX1NFUlZFUj1sb2NhbGhvc3QgSVBQX1BPUlQ9NjYzMSBmaXJlZm94CgogICBidXQgYXJlIHNvbWV3aGF0IGF3a3dhcmQgc2luY2UgeW91IGhhdmUgdG8gcmV0cm9hY3RpdmVseSBzZXQgdGhlIGVudi4KICAgdmFyIElQUF9QT1JULiBJdHMgdmFsdWUgY2Fubm90IGJlIGJyb2FkY2FzdCB0byBhbHJlYWR5IHJ1bm5pbmcgYXBwcwogICAobGlrZSB0aGUgJEhPTUUvLmN1cHMvY2xpZW50LmNvbmYgdHJpY2sgc29tZXRpbWVzIGRvZXMuKSBBIGNvbW1vbgogICB3b3JrYXJvdW5kIGZvciBhbiBhbHJlYWR5IHJ1bm5pbmcgYXBwIGlzIHRvIHNvbWVob3cgZ2V0IGl0IHRvICJQcmludAogICBUbyBGaWxlIiwgZS5nLiBmaWxlLnBzIGFuZCB0aGVuIHVzZSBzb21ldGhpbmcgbGlrZSB0aGUgbHByIGV4YW1wbGUKICAgYWJvdmUuIEFsc28sIHRoZSBvcHRpb24gIi1oIGhvc3Q6cG9ydCIgd29ya3Mgd2l0aCBDVVBTIGxwKDEpIGFuZAogICBscHIoMSkuCgogICBZb3UgY2FuIGFsc28gcHJpbnQgdG8gV2luZG93cyBzaGFyZXMgcHJpbnRlcnMgaW4gcHJpbmNpcGxlLiBZb3UgbWF5IGRvCiAgIHRoaXMgd2l0aCB0aGUgc21ic3Bvb2woOCkgY29tbWFuZCwgb3IgY29uZmlndXJlIHRoZSByZW1vdGUgQ1VQUyB2aWEKICAgbHBhZG1pbig4KSwgZXRjLCB0byB1c2UgYSBwcmludGVyIFVSSSBzb21ldGhpbmcgbGlrZQogICBzbWI6Ly9tYWNoaW5lOnBvcnQvcHJpbnRlciAodGhpcyBtYXkgaGF2ZSBzb21lIG5hbWUgcmVzb2x1dGlvbgogICBwcm9ibGVtcyBXUlQgbG9jYWxob3N0LikgQWxzbywgYXMgd2l0aCBTTUIgbW91bnRpbmcsIHRoZSBwb3J0IHJlZGlyCiAgICgtUikgdG8gdGhlIFdpbmRvd3MgbWFjaGluZSBtdXN0IHVzZSB0aGUgYWN0dWFsIElQIGFkZHJlc3MgaW5zdGVhZCBvZgogICAibG9jYWxob3N0Ii4KCiAgIEF0IHNvbWUgcG9pbnQgd2UgaG9wZSB0byBmb2xkIHNvbWUgYXV0b21hdGlvbiBmb3IgQ1VQUyBzc2ggcmVkaXIgc2V0dXAKICAgaW50byB0aGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIChTU1ZOQykgcGFja2FnZSB3ZSBwcm92aWRlIChhcyBvZgogICBTZXAgMjAwNiBpdCBpcyB0aGVyZSBmb3IgdGVzdGluZy4pCgoKICAgUS0xMjk6IEhvdyBjYW4gSSBoZWFyIHRoZSBzb3VuZCAoYXVkaW8pIGZyb20gdGhlIHJlbW90ZSBhcHBsaWNhdGlvbnMKICAgb24gdGhlIGRlc2t0b3AgSSBhbSB2aWV3aW5nIHZpYSB4MTF2bmM/CgogICBZb3Ugd2lsbCBoYXZlIHRvIHVzZSBhbiBleHRlcm5hbCBuZXR3b3JrIGF1ZGlvIG1lY2hhbmlzbSBmb3IgdGhpcy4KICAgQXVkaW8gaXMgbm90IHBhcnQgb2YgdGhlIFZOQyBwcm90b2NvbC4KCiAgIFdlIHNob3cgYSBzaW1wbGUgVW5peCB0byBVbml4IGVzZCBleGFtcGxlIGhlcmUgKGFydHNkIHNob3VsZCBiZQogICBwb3NzaWJsZSB0b28sIHdlIGhhdmUgYWxzbyB2ZXJpZmllZCB0aGUgZXNkIFdpbmRvd3MgcG9ydCB3b3JrcyBmb3IgdGhlCiAgIG1ldGhvZCBkZXNjcmliZWQgYmVsb3cuKQoKICAgRmlyc3QgeW91IHdpbGwgbmVlZCBhIHR1bm5lbCB0byByZWRpcmVjdCB0aGUgYXVkaW8gZnJvbSB0aGUgcmVtb3RlCiAgIG1hY2hpbmUgdG8gdGhlIG9uZSB5b3Ugc2l0dGluZyBhdC4gV2UgdXNlIGFuIHNzaCB0dW5uZWw6CiAgc2l0dGluZy1oZXJlPiBzc2ggLUMgLVIgMTYwMDE6bG9jYWxob3N0OjE2MDAxIGZhci1hd2F5LmVhc3QKCiAgIE9yIG9uZSBjb3VsZCBjb21iaW5lIHRoaXMgd2l0aCB0aGUgVk5DIHR1bm5lbCBhdCB0aGUgc2FtZSB0aW1lLCBlLmcuOgogIHNpdHRpbmctaGVyZT4gc3NoIC1DIC1SIDE2MDAxOmxvY2FsaG9zdDoxNjAwMSAtdCAtTCA1OTAwOmxvY2FsaG9zdDo1OTAwIGZhci1hCndheS5lYXN0ICd4MTF2bmMgLWxvY2FsaG9zdCAtZGlzcGxheSA6MCcKCiAgIFBvcnQgMTYwMDEgaXMgdGhlIGRlZmF1bHQgRVNEIHVzZXMuIFNvIHdoZW4gYW4gYXBwbGljYXRpb24gb24gdGhlCiAgIHJlbW90ZSBkZXNrdG9wIG1ha2VzIGEgc291bmQgaXQgd2lsbCBjb25uZWN0IHRvIHRoaXMgdHVubmVsIGFuZCBiZQogICByZWRpcmVjdGVkIHRvIHBvcnQgMTYwMDEgb24gdGhlIGxvY2FsIG1hY2hpbmUgKHNpdHRpbmctaGVyZSBpbiB0aGlzCiAgIGV4YW1wbGUuKSBUaGUgLUMgb3B0aW9uIGlzIGFuIGF0dGVtcHQgdG8gY29tcHJlc3MgdGhlIGF1ZGlvIGEgbGl0dGxlCiAgIGJpdC4KCiAgIFNvIHdlIG5leHQgbmVlZCBhIGxvY2FsIChzaXR0aW5nLWhlcmUpIGVzZCBkYWVtb24gcnVubmluZyB0aGF0IHdpbGwKICAgcmVjZWl2ZSB0aG9zZSByZXF1ZXN0cyBhbmQgcGxheSB0aGVtIG9uIHRoZSBsb2NhbCBzb3VuZCBkZXZpY2U6CiAgc2l0dGluZy1oZXJlPiBlc2QgLXByb21pc2N1b3VzIC1wb3J0IDE2MDAxIC10Y3AgLWJpbmQgMTI3LjAuMC4xCgogICBTZWUgdGhlIGVzZCgxKSBtYW4gcGFnZSBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlIG9wdGlvbnMgKHRoZSBhYm92ZSBhcmUKICAgbm90IHZlcnkgc2VjdXJlLikgKFRoaXMgbWV0aG9kIGFsc28gd29ya3Mgd2l0aCB0aGUgRXNvdW5EIHdpbmRvd3MgcG9ydAogICBlc2QuZXhlKQoKICAgVG8gdGVzdCB0aGlzIHNvdW5kIHR1bm5lbCwgd2UgdXNlIHRoZSBlc2RwbGF5IHByb2dyYW0gdG8gcGxheSBhIHNpbXBsZQogICAud2F2IGZpbGU6CiAgZmFyLWF3YXk+IGVzZHBsYXkgLXMgbG9jYWxob3N0OjE2MDAxIGltX3NvX2hhcHB5LndhdgoKICAgSWYgeW91IGhlYXIgdGhlIHNvdW5kIChDYXB0YWluIEtpcmsgaW4gdGhpcyBleGFtcGxlKSwgdGhhdCBtZWFucyB5b3UKICAgYXJlIGluIGdyZWF0IHNoYXBlLgoKICAgVG8gcnVuIGluZGl2aWR1YWwgYXVkaW8gYXBwbGljYXRpb25zIHlvdSBjYW4gdXNlIHRoZSBlc2Rkc3AoMSkKICAgY29tbWFuZDoKICBmYXItYXdheT4gZXNkZHNwIC1zIGxvY2FsaG9zdDoxNjAwMSB4bW1zCgogICBUaGVuIHlvdSBjb3VsZCB0cnkgcGxheWluZyBzb21lIHNvdW5kcyBpbnNpZGUgeG1tcy4gWW91IGNvdWxkIGFsc28gc2V0CiAgIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBFU1BFQUtFUj1sb2NhbGhvc3Q6MTYwMDEgdG8gbm90IG5lZWQgdG8KICAgc3VwcGx5IHRoZSAtcyBvcHRpb24gYWxsIHRoZSB0aW1lLiAoZm9yIHJlYXNvbnMgbm90IGNsZWFyLCBzb21ldGltZXMKICAgZXNkZHNwIGNhbiBmaWd1cmUgaXQgb3V0IG9uIGl0cyBvd24uKSBBbGwgdGhlIHNjcmlwdCBlc2Rkc3AgZG9lcyBpcyB0bwogICBzZXQgRVNQRUFLRVIgYW5kIExEX1BSRUxPQUQgZm9yIHlvdSBzbyB0aGF0IHdoZW4gdGhlIGFwcGxpY2F0aW9uIG9wZW5zCiAgIHRoZSBzb3VuZCBkZXZpY2UgKHVzdWFsbHkgL2Rldi9kc3ApIGl0cyBpbnRlcmFjdGlvbnMgd2l0aCB0aGUgZGV2aWNlCiAgIHdpbGwgYmUgaW50ZXJjZXB0ZWQgYW5kIHNlbnQgdG8gdGhlIGVzZCBkYWVtb24gcnVubmluZyBvbiBzaXR0aW5nLWhlcmUKICAgKHRoYXQgaW4gdHVybiB3cml0ZXMgdGhlbSB0byB0aGUgcmVhbCwgbG9jYWwgL2Rldi9kc3AuKQoKICAgUmVkaXJlY3RpbmcgQWxsIHNvdW5kOgoKICAgSXQgZG9lcyBub3Qgc2VlbSB0byBiZSBwb3NzaWJsZSB0byBzd2l0Y2ggYWxsIG9mIHRoZSBzb3VuZCBvZiB0aGUKICAgcmVtb3RlIG1hY2hpbmUgZnJvbSBpdHMgc291bmQgZGV2aWNlIHRvIHRoZSBhYm92ZSBlc2Qrc3NoIHR1bm5lbAogICB3aXRob3V0IHNvbWUgcHJlcGFyYXRpb24uIEJ1dCBpdCBjYW4gYmUgZG9uZSByZWFzb25hYmx5IHdlbGwgaWYgeW91CiAgIHByZXBhcmUgKGkuZS4gcmVzdGFydCkgdGhlIGRlc2t0b3Agd2l0aCB0aGlzIGluIG1pbmQuCgogICBIZXJlIGlzIG9uZSB3YXkgdG8gcmVkaXJlY3QgYWxsIHNvdW5kLiBUaGUgaWRlYSBpcyB3ZSBydW4gdGhlIGVudGlyZQogICBkZXNrdG9wIHdpdGggc291bmQgZGlyZWN0ZWQgdG8gbG9jYWxob3N0OjE2MDAxLiBXaGVuIHdlIGFyZSBzaXR0aW5nIGF0CiAgIGZhci1hd2F5LmVhc3Qgd2UgcnVuICJlc2QgLXByb21pc2N1b3VzIC1wb3J0IDE2MDAxIC10Y3AgLWJpbmQKICAgMTI3LjAuMC4xIiBvbiBmYXItYXdheS5lYXN0ICh0byBiZSBhYmxlIHRvIGhlYXIgdGhlIHNvdW5kLikgSG93ZXZlciwKICAgd2hlbiB3ZSBhcmUgc2l0dGluZyBhdCBzaXR0aW5nLWhlcmUud2VzdCB3ZSBraWxsIHRoYXQgZXNkIHByb2Nlc3MgYW5kCiAgIHJ1biB0aGF0IHNhbWUgZXNkIGNvbW1hbmQgb24gc2l0dGluZy1oZXJlLndlc3QgYW5kIHN0YXJ0IHVwIHRoZSBhYm92ZQogICBzc2ggdHVubmVsLiBUaGlzIGlzIGEgbGl0dGxlIGF3a3dhcmQsIGJ1dCB3aXRoIHNvbWUgc2NyaXB0cyBvbmUgd291bGQKICAgcHJvYmFibHkga2lsbCBhbmQgcmVzdGFydCB0aGUgZXNkIHByb2Nlc3NlcyBhdXRvbWF0aWNhbGx5IHdoZW4geDExdm5jCiAgIGlzIHVzZWQuCgogICBTbyBuZXh0IHdlIGhhdmUgdG8gcnVuIHRoZSB3aG9sZSBkZXNrdG9wIHBvaW50aW5nIHRvd2FyZCBvdXIgZXNkLiBIZXJlCiAgIGlzIGEgc2ltcGxlIHdheSB0byB0ZXN0LiBMb2cgaW4gdG8gdGhlIG1hY2hpbmUgdmlhIHRoZSAiRmFpbFNhZmUiCiAgIGRlc2t0b3AuIFRoZW4gaW4gdGhlIGxvbmUgdGVybWluYWwgdHlwZSBzb21ldGhpbmcgbGlrZToKICBlc2Rkc3AgLXMgbG9jYWxob3N0OjE2MDAxIGdub21lLXNlc3Npb24Kb3I6CiAgZXNkZHNwIC1zIGxvY2FsaG9zdDoxNjAwMSBzdGFydGtkZQoKICAgd2hlcmUgdGhlIGxhc3QgcGFydCBpcyB3aGF0ZXZlciBjb21tYW5kIHN0YXJ0cyB5b3VyIGRlc2t0b3AgKGV2ZW4KICAgZnZ3bTIuKSBUaGlzIGNhdXNlcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIEVTUEVBS0VSIGFuZCBMRF9QUkVMT0FECiAgIHRvIGJlIHNldCBhcHByb3ByaWF0ZWx5IGFuZCBldmVyeSBhcHBsaWNhdGlvbiAocHJvY2Vzc2VzIHdpdGggdGhlCiAgIGRlc2t0b3AgYXMgYW4gYW5jZXN0b3IpIHdpbGwgdXNlIHRoZW0uIElmIHRoaXMgc2NoZW1lIHdvcmtzIHdlbGwgeW91CiAgIGNhbiBtYWtlIGl0IGxlc3Mga2x1bmt5IGJ5IGFkZGluZyB0aGUgY29tbWFuZCB0byB5b3VyIH4vLnhzZXNzaW9uLAogICBldGMuIGZpbGUgdGhhdCBzdGFydHMgeW91ciBkZWZhdWx0IGRlc2t0b3AuIE9yIHlvdSBtYXkgYmUgYWJsZSB0bwogICBjb25maWd1cmUgeW91ciBkZXNrdG9wIHRvIHVzZSBsb2NhbGhvc3Q6MTYwMDEsIG9yIHdoYXRldmVyIGlzIG5lZWRlZCwKICAgdmlhIGEgZ3VpIGNvbmZpZ3VyYXRpb24gcGFuZWwuIFNvbWUgTm90ZXM6CiAgICAgKiBOb3QgYWxsIGF1ZGlvIGFwcGxpY2F0aW9ucyBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBlc2QgYW5kIGFydHNkCiAgICAgICBtZWNoYW5pc21zLCBidXQgbWFueSBhcmUuCiAgICAgKiBUaGUgYXVkaW8gaXMgbm90IGNvbXByZXNzZWQgc28geW91IHByb2JhYmx5IG5lZWQgYSBicm9hZGJhbmQgb3IKICAgICAgIGZhc3RlciBjb25uZWN0aW9uLiBMaXN0ZW5pbmcgdG8gbXVzaWMgbWF5IG5vdCBiZSB2ZXJ5IHBsZWFzYW50Li4uCiAgICAgICAoQWx0aG91Z2ggd2UgZm91bmQgc3RyZWFtaW5nIG11c2ljIGZyb20gYWNyb3NzIHRoZSBVUyBvdmVyIGNhYmxlCiAgICAgICBtb2RlbSB3b3JrZWQgT0ssIGJ1dCB0b29rIDIwMCBLQi9zZWMsIHRvIHVzZSBsZXNzIGJhbmR3aWR0aAogICAgICAgY29uc2lkZXIgc29tZXRoaW5nIGxpa2UgInNzaCBmYXItYXdheS5lYXN0ICdjYXQgZmF2b3JpdGUubXAzJyB8CiAgICAgICBtcGcxMjMgLWIgNDAwMCAtIikKICAgICAqIExpbnV4IGRvZXMgbm90IHNlZW0gdG8gaGF2ZSB0aGUgY29uY2VwdCBvZiBMRF9QUkVMT0FEXzY0IHNvIGlmIHlvdQogICAgICAgcnVuIG9uIGEgbWl4ZWQgNjQtIGFuZCAzMi1iaXQgQUJJIHN5c3RlbSAoZS5nLiBBTUQgeDg2XzY0KSBzb21lIG9mCiAgICAgICB0aGUgYXBwbGljYXRpb25zIHdpbGwgZmFpbCB0byBydW4gYmVjYXVzZSBMRF9QUkVMT0FEIHdpbGwgcG9pbnQgdG8KICAgICAgIGxpYnJhcmllcyBvZiB0aGUgd3Jvbmcgd29yZHNpemUuCiAgICAgKiBBdCBzb21lIHBvaW50IHdlIGhvcGUgdG8gZm9sZCBzb21lIGF1dG9tYXRpb24gZm9yIGVzZCBvciBhcnRzZCBzc2gKICAgICAgIHJlZGlyIHNldHVwIGludG8gdGhlIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoU1NWTkMpIHBhY2thZ2Ugd2UKICAgICAgIHByb3ZpZGUgKGFzIG9mIFNlcC8yMDA2IGl0IGlzIHRoZXJlIGZvciB0ZXN0aW5nLikKCgogICBRLTEzMDogV2h5IGRvbid0IEkgaGVhciB0aGUgIkJlZXBzIiBpbiBteSBYIHNlc3Npb24gKGUuZy4gd2hlbiB0eXBpbmcKICAgdHB1dCBiZWwgaW4gYW4geHRlcm0pPwoKICAgQXMgb2YgRGVjLzIwMDMgIkJlZXAiIFhCZWxsIGV2ZW50cyBhcmUgdHJhY2tlZCBieSBkZWZhdWx0LiBUaGUgWAogICBzZXJ2ZXIgbXVzdCBzdXBwb3J0IHRoZSBYS0VZQk9BUkQgZXh0ZW5zaW9uICh0aGlzIGlzIG5vdCBvbiBieSBkZWZhdWx0CiAgIGluIFNvbGFyaXMsIHNlZSBYc2VydmVyKDEpIGZvciBob3cgdG8gdHVybiBpdCBvbiB2aWEgK2tiKSwgYW5kIHNvIHlvdQogICB3b24ndCBoZWFyIHRoZW0gaWYgdGhlIGV4dGVuc2lvbiBpcyBub3QgcHJlc2VudC4KCiAgIElmIHlvdSBkb24ndCB3YW50IHRvIGhlYXIgdGhlIGJlZXBzIHVzZSB0aGUgLW5vYmVsbCBvcHRpb24uIElmIHlvdQogICB3YW50IHRvIGhlYXIgdGhlIGF1ZGlvIGZyb20gdGhlIHJlbW90ZSBhcHBsaWNhdGlvbnMsIGNvbnNpZGVyIHRyeWluZyBhCiAgIHJlZGlyZWN0b3Igc3VjaCBhcyBlc2QuCgoKICAgUS0xMzE6IERvZXMgeDExdm5jIHdvcmsgd2l0aCBJUHY2PwoKICAgVXBkYXRlOiBhcyBvZiBBcHIvMjAxMCBpbiB0aGUgMC45LjEwIHgxMXZuYyBkZXZlbG9wbWVudCB0YXJiYWxsLCB0aGVyZQogICBpcyBub3cgYnVpbHQtaW4gc3VwcG9ydCBmb3IgSVB2NiAoMTI4IGJpdCBpbnRlcm5ldCBhZGRyZXNzZXMuKSBTZWUgdGhlCiAgIC02IGFuZCAtY29ubmVjdCBvcHRpb25zIGZvciBkZXRhaWxzLgoKICAgVGhlIHJlbWFpbmRlciBvZiB0aGlzIEZBUSBlbnRyeSBzaG93cyBob3cgdG8gZG8gd2l0aCB0aGlzIHdpdGggcHJlCiAgIDAuOS4xMCB4MTF2bmMgdXNpbmcgSVB2NiBoZWxwZXIgdG9vbHMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFVzaW5nIGFuIGV4dGVybmFsIElQdjYgaGVscGVyOgogICBBIHdheSB0byBkbyB0aGlzIGlzIHZpYSBhIHNlcGFyYXRlIGhlbHBlciBwcm9ncmFtIHN1Y2ggYXMgaW5ldGQgKG9yCiAgIGZvciBlbmNyeXB0ZWQgY29ubmVjdGlvbnM6IHNzaCBvciBzdHVubmVsLikgRm9yIGV4YW1wbGUsIHlvdSBjb25maWd1cmUKICAgeDExdm5jIHRvIGJlIHJ1biBmcm9tIGluZXRkIG9yIHhpbmV0ZCBhbmQgaW5zdHJ1Y3QgaXQgdG8gbGlzdGVuIG9uIGFuCiAgIElQdjYgYWRkcmVzcy4gRm9yIHhpbmV0ZCB0aGUgc2V0dGluZyAiZmxhZ3MgPSBJUHY2IiB3aWxsIGJlIG5lZWRlZC4KICAgRm9yIGluZXRkLmNvbmYsIGFuIGV4YW1wbGUgaXM6CiAgNTkwMCBzdHJlYW0gdGNwNiBub3dhaXQgcm9vdCAvdXNyL3NiaW4vdGNwZCAvdXNyL2xvY2FsL2Jpbi94MTF2bmNfd3JhcHBlci5zaAoKICAgV2UgYWxzbyBwcm92aWRlIGEgdHJhbnNpdGlvbmFsIHRvb2wgaW4gIngxMXZuYy9taXNjL2luZXQ2dG80IiB0aGF0CiAgIGFjdHMgYXMgYSByZWxheSBmb3IgYW55IElQdjQgYXBwbGljYXRpb24gdG8gYWxsb3cgY29ubmVjdGlvbnMgb3ZlcgogICBJUHY2LiBGb3IgZXhhbXBsZToKICBpbmV0NnRvNCA1OTAwIGxvY2FsaG9zdDo1OTAwCgogICB3aGVyZSB4MTF2bmMgaXMgbGlzdGVuaW5nIG9uIElQdjQgcG9ydCA1OTAwLgoKICAgQWxzbyBub3RlIHRoYXQgbm90IGFsbCBWTkMgVmlld2VycyBhcmUgSVB2NiBlbmFibGVkLCBzbyBhIHJlZGlyZWN0b3IKICAgbWF5IGFsc28gYmUgbmVlZGVkIGZvciB0aGVtLiBUaGUgdG9vbCAiaW5ldDZ0bzQgLXIgLi4uIiBjYW4gZG8gdGhpcyBhcwogICB3ZWxsLiBTU1ZOQyAoc2VlIGJlbG93KSBzdXBwb3J0cyBJUHY2IHdpdGhvdXQgbmVlZCBmb3IgdGhlIGhlbHBlci4KCiAgIyAuL2luZXQ2dG80IC1oZWxwCgogIGluZXQ2dG80OiAgQWN0IGFzIGFuIGlwdjYtdG8taXB2NCByZWxheSBmb3IgdGNwIGFwcGxpY2F0aW9ucyB0aGF0CiAgICAgICAgICAgICBkbyBub3Qgc3VwcG9ydCBpcHY2LgoKICBVc2FnZTogICAgIGluZXQ2dG80CiAgICAgICAgICAgICBpbmV0NnRvNCAtcgoKICBFeGFtcGxlczogIGluZXQ2dG80IDU5MDAgbG9jYWxob3N0OjU5MDAKICAgICAgICAgICAgIGluZXQ2dG80IDgwODAgd2ViMTo4MAogICAgICAgICAgICAgaW5ldDZ0bzQgLXIgNTkwMCBmZTgwOjoyMTc6ZjJmZjpmZWU2OjZmNWElZXRoMDo1OTAwCgogIFRoZSAtciBvcHRpb24gcmV2ZXJzZXMgdGhlIGRpcmVjdGlvbiBvZiB0cmFuc2xhdGlvbiAoZS5nLiBmb3IgaXB2NAogIGNsaWVudHMgdGhhdCBuZWVkIHRvIGNvbm5lY3QgdG8gaXB2NiBzZXJ2ZXJzLikgIFJldmVyc2luZyBpcyB0aGUgZGVmYXVsdAogIGlmIHRoaXMgc2NyaXB0IGlzIG5hbWVkICdpbmV0NHRvNicgKGUuZy4gYnkgYSBzeW1saW5rLikKCiAgVXNlIEN0cmwtQyB0byBzdG9wIHRoaXMgcHJvZ3JhbS4KCiAgWW91IGNhbiBhbHNvIHNldCBlbnYuIHZhcnMgSU5FVDZUTzRfTE9PUD0xIG9yIElORVQ2VE80X0xPT1A9QkcKICB0byBoYXZlIGFuIG91dGVyIGxvb3AgcmVzdGFydGluZyB0aGlzIHByb2dyYW0gKEJHIG1lYW5zIGRvIHRoYXQKICBpbiB0aGUgYmFja2dyb3VuZCksIGFuZCBJTkVUNlRPNF9MT0dGSUxFIGZvciBhIGxvZyBmaWxlLgogIEFsc28gc2V0IElORVQ2VE80X1ZFUkJPU0UgdG8gdmVyYm9zaXR5IGxldmVsIGFuZCBJTkVUNlRPNF9XQUlUVElNRQogIGFuZCBJTkVUNlRPNF9QSURGSUxFIChzZWUgYmVsb3cuKQoKICAgVGhlICJJTkVUNlRPNF9MT09QPUJHIiBhbmQgIklORVQ2VE80X0xPR0ZJTEU9Li4uIiBlbnYuIHZhcmlhYmxlcyBtYWtlCiAgIHRoZSB0b29sIHJ1biByZWxpYWJseSBhcyBhIGRhZW1vbiBmb3IgdmVyeSBsb25nIHBlcmlvZHMuIFJlYWQgdGhlIHRvcAogICBwYXJ0IG9mIHRoZSBzY3JpcHQgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIEVuY3J5cHRlZCBUdW5uZWxzIHdpdGggSVB2NiBTdXBwb3J0OgogICBGb3IgU1NIIHR1bm5lbGxlZCBlbmNyeXB0ZWQgVk5DIGNvbm5lY3Rpb25zLCBvbmUgY2FuIG9mIGNvdXJzZSB1c2UgdGhlCiAgIElQdjYgc3VwcG9ydCBpbiBzc2goMSkuCgogICBGb3IgU1NMIGVuY3J5cHRlZCBWTkMgY29ubmVjdGlvbnMsIG9uZSBwb3NzaWJpbGl0eSBpcyB0byB1c2UgdGhlIElQdjYKICAgc3VwcG9ydCBpbiBzdHVubmVsKDEpLiBUaGlzIGluY2x1ZGVzIHRoZSBidWlsdC1pbiBzdXBwb3J0IHZpYSB0aGUKICAgLXN0dW5uZWwgb3B0aW9uLiBGb3IgZXhhbXBsZToKICB4MTF2bmMgLXN0dW5uZWwgU0FWRSAtZW52IFNUVU5ORUxfTElTVEVOPTo6IC1lbnYgU1RVTk5FTF9ERUJVRz0xIC4uLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBTU0ggSVB2NiBUcmlja3M6CiAgIEl0IGlzIGludGVyZXN0aW5nIHRvIG5vdGUgdGhhdCBzc2goMSkgY2FuIGRvIGJhc2ljYWxseSB0aGUgc2FtZSB0aGluZwogICBhcyBpbmV0NnRvNCBhYm92ZSBieToKICBzc2ggLWcgLUwgNTkwMDpsb2NhbGhvc3Q6NTkwMSBsb2NhbGhvc3QgInByaW50ZiAnUHJlc3MgRW50ZXIgdG8gRXhpdDogJzsgcmVhZAogeCIKCiAgICh3aGVyZSB3ZSBoYXZlIHgxMXZuYyBydW5uaW5nIHZpYSAiLXJmYnBvcnQgNTkwMSIgaW4gdGhpcyBjYXNlLikKCiAgIE5vdGUgdGhhdCBvbmUgY2FuIGFsc28gbWFrZSBhIGhvbWUtYnJldyBTT0NLUzUgaXB2NC10by1pcHY2IGdhdGV3YXkKICAgcHJveHkgdXNpbmcgc3NoIGxpa2UgdGhpczoKICBzc2ggLUQgJyo6MTA4MCcgbG9jYWxob3N0ICJwcmludGYgJ1ByZXNzIEVudGVyIHRvIEV4aXQ6ICc7IHJlYWQgeCIKCiAgIHRoZW4gc3BlY2lmeSBhIHByb3h5IGxpa2Ugc29ja3M6Ly9ob3N0bmFtZToxMDgwIHdoZXJlIGhvc3RuYW1lIGlzIHRoZQogICBtYWNoaW5lIHJ1bm5pbmcgdGhlIGFib3ZlIHNzaCBjb21tYW5kIChhZGQgLXYgdG8gc3NoIGZvciBjb25uZWN0aW9uCiAgIGxvZ2dpbmcgaW5mby4pCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIElQdjYgU1NWTkMgVmlld2VyOgogICBPdXIgU1NWTkMgVk5DIFZpZXdlciBpcyBiYXNpY2FsbHkgYSB3cmFwcGVyIGZvciBzc2goMSkgYW5kIHN0dW5uZWwoMSksCiAgIGFuZCBzbyBpdCBhbHJlYWR5IGhhcyBnb29kIElQdjYgc3VwcG9ydCBiZWNhdXNlIHRoZXNlIHR3byBjb21tYW5kcyBkby4KICAgT24gVW5peCwgTWFjT1NYLCBhbmQgV2luZG93cyBuZWFybHkgYWxsIG9mIHRoZSB0aGUgcmVtYWluaW5nIHBhcnRzIG9mCiAgIFNTVk5DIChlLmcuIHRoZSBidWlsdC1pbiBwcm94eWluZyBhbmQgdW4tZW5jcnlwdGVkIGNvbm5lY3Rpb25zKSBoYXZlCiAgIGJlZW4gbW9kaWZpZWQgdG8gc3VwcG9ydCBJUHY2IGluIFNTVk5DIDEuMC4yNi4KCgoKCgoKICAgIENvbnRyaWJ1dGlvbnM6CgogICBRLTEzMjogVGhhbmtzIGZvciB5b3VyIHByb2dyYW0gb3IgZm9yIHlvdXIgaGVscCEgQ2FuIEkgbWFrZSBhCiAgIGRvbmF0aW9uPwoKICAgUGxlYXNlIGRvIChhbnkgYW1vdW50IGlzIGFwcHJlY2lhdGVkOyB2ZXJ5IGZldyBoYXZlIGRvbmF0ZWQpIGFuZCB0aGFuawogICB5b3UgZm9yIHlvdXIgc3VwcG9ydCEgQ2xpY2sgb24gdGhlIFBheVBhbCBidXR0b24gYmVsb3cgZm9yIG1vcmUgaW5mby4KCiAgIFt4LWNsaWNrLWJ1dDA0LmdpZl0tU3VibWl0CgkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9jaGFpbmluZ3NzaC5odG1sOgoKCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIENoYWluaW5nIHNzaCdzOiBOb3RlIHRoYXQgZm9yIHVzZSBvZiBhIHNzaCBnYXRld2F5IGFuZCAtTCByZWRpcmVjdGlvbgogICB0byBhbiBpbnRlcm5hbCBob3N0IChlLmcuICItTCA1OTAwOm90aGVyaG9zdDo1OTAwIikgdGhlIFZOQyB0cmFmZmljCiAgIGluc2lkZSB0aGUgZmlyZXdhbGwgaXMgbm90IGVuY3J5cHRlZCBhbmQgeW91IGhhdmUgdG8gbWFudWFsbHkgbG9nIGludG8KICAgb3RoZXJob3N0IHRvIHN0YXJ0IHgxMXZuYy4gS3lsZSBBbW9uIHNob3dzIGEgbWV0aG9kIHdoZXJlIHlvdSBjaGFpbgogICB0d28gc3NoJ3MgdG9nZXRoZXIgdGhhdCBlbmNyeXB0cyBhbGwgbmV0d29yayB0cmFmZmljIGFuZCBhbHNvCiAgIGF1dG9tYXRpY2FsbHkgc3RhcnRzIHVwIHgxMXZuYyBvbiB0aGUgaW50ZXJuYWwgd29ya3N0YXRpb246CiMhL2Jpbi9zaAojCmdhdGV3YXk9ImV4YW1wbGUuY29tIiAgICMgb3IgInVzZXJAZXhhbXBsZS5jb20iCmhvc3Q9ImxhYnlyaW50aCIgICAgICAgICMgb3IgInVzZXJAaG9zdG5hbWUiCnVzZXI9Imt5bGUiCgojIE5lZWQgdG8gc2xlZXAgbG9uZyBlbm91Z2ggZm9yIGFsbCBvZiB0aGUgcGFzc3dvcmRzIGFuZCB4MTF2bmMgdG8gc3RhcnQgdXAuCiMgVGhlIDwvZGV2L251bGwgYmVsb3cgbWFrZXMgdGhlIHZuY3ZpZXdlciBwcm9tcHQgZm9yIHBhc3N3ZCB2aWEgcG9wdXAgd2luZG93LgojCihzbGVlcCAxMDsgdm5jdmlld2VyIC1lbmNvZGluZ3MgImNvcHlyZWN0IHRpZ2h0IHpybGUgemxpYiBoZXh0aWxlIiBcCiAgICBsb2NhbGhvc3Q6MCA8L2Rldi9udWxsID4vZGV2L251bGwpICYKCiMgQ2hhaW4gdGhlIHZuYyBjb25uZWN0aW9uIHRocnUgMiBzc2gncywgYW5kIGNvbm5lY3QgeDExdm5jIHRvIHVzZXIncyBkaXNwbGF5OgojCmV4ZWMgL3Vzci9iaW4vc3NoIC10IC1MIDU5MDA6bG9jYWxob3N0OjU5MDAgJGdhdGV3YXkgXAogICAgIC91c3IvYmluL3NzaCAtdCAtTCA1OTAwOmxvY2FsaG9zdDo1OTAwICRob3N0IFwKICAgICBzdWRvIC91c3IvYmluL3gxMXZuYyAtbG9jYWxob3N0IC1hdXRoIC9ob21lLyR1c2VyLy5YYXV0aG9yaXR5IFwKICAgICAgICAgLXJmYmF1dGggLnZuYy9wYXNzd2QgLWRpc3BsYXkgOjAKCiAgIEFsc28gbm90ZSB0aGUgdXNlIG9mIHN1ZG8oMSkgdG8gc3dpdGNoIHRvIHJvb3Qgc28gdGhhdCB0aGUgZGlmZmVyZW50CiAgIHVzZXIncyAuWGF1dGhvcml0eSBmaWxlIGNhbiBiZSBhY2Nlc3NlZC4gU2VlIHRoZSB2aXN1ZG8oOCkgbWFucGFnZSBmb3IKICAgZGV0YWlscyBvbiBob3cgdG8gc2V0IHRoaXMgdXAgKHJlbW92ZSB0aGUgc3VkbyBpZiB5b3UgZG8gbm90IHdhbnQgdG8KICAgZG8gdGhpcykuIE9uZSBjYW4gYWxzbyBjaGFpbiB0b2dldGhlciBzc2gncyBmb3IgcmV2ZXJzZSBjb25uZWN0aW9ucwogICB3aXRoIHZuY3ZpZXdlcnMgdXNpbmcgdGhlIC1saXN0ZW4gb3B0aW9uLiBGb3IgdGhpcyBjYXNlIC1SIHdvdWxkCiAgIHJlcGxhY2UgdGhlIC1MIChhbmQgNTUwMCB0aGUgNTkwMCwgc2VlIHRoZSAjMiBleGFtcGxlIHNjcmlwdCBhYm92ZSkuCiAgIElmIHRoZSBnYXRld2F5IG1hY2hpbmUncyBzc2hkIGlzIGNvbmZpZ3VyZWQgd2l0aCBHYXRld2F5UG9ydHM9bm8gKHRoZQogICBkZWZhdWx0KSB0aGVuIHRoZSBkb3VibGUgY2hhaW5pbmcgb2YgInNzaCAtUiAuLi4iIHdpbGwgYmUgcmVxdWlyZWQgZm9yCiAgIHJldmVyc2UgY29ubmVjdGlvbnMgdG8gd29yay4KCQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL21pc2NidWlsZC5odG1sOgoKCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIE1pc2MuIEJ1aWxkIHByb2JsZW1zOiAgIFdlIGNvbGxlY3QgaGVyZSByYXJlIGJ1aWxkIHByb2JsZW1zIHNvbWUgdXNlcnMKICAgaGF2ZSByZXBvcnRlZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgd29ya2Fyb3VuZHMuIFNlZSBhbHNvIHRoZSBGQVEncyBvbgogICBidWlsZGluZy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgRU5WIHBhcmFtZXRlcjogT25lIHVzZXIgaGFkIGEgcHJvYmxlbSB3aGVyZSB0aGUgYnVpbGQgc2NyaXB0IGJlbG93IHdhcwogICBmYWlsaW5nIGJlY2F1c2UgaGlzIHdvcmsgZW52aXJvbm1lbnQgaGFkIHRoZSBFTlYgdmFyaWFibGUgc2V0IHRvIGEKICAgc2NyaXB0IHRoYXQgd2FzIHJlc2V0dGluZyBoaXMgUEFUSCBzbyB0aGF0IGdjYyBjb3VsZCBubyBsb25nZXIgYmUKICAgZm91bmQuIE1ha2Ugc3VyZSB5b3UgZG8gbm90IGhhdmUgYW55IEVOViBvciBCQVNIX0VOViBpbiB5b3VyCiAgIGVudmlyb25tZW50IGRvaW5nIHRoaW5ncyBsaWtlIHRoYXQuIFR5cGluZyAidW5zZXQgRU5WIiwgZXRjLiBiZWZvcmUKICAgY29uZmlndXJpbmcgYW5kIGJ1aWxkaW5nIHNob3VsZCBjbGVhciBpdC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgQmFzaCB4cGc6IE9uZSB1c2VyIGhhZCBoaXMgYmFzaCBzaGVsbCBjb21waWxlZCB3aXRoCiAgIC0tZW5hYmxlLXhwZy1lY2hvLWRlZmF1bHQgdGhhdCBjYXVzZXMgc29tZSBzdHJhbmdlIGJlaGF2aW9yIHdpdGgKICAgdGhpbmdzIGxpa2UgZWNobyAiXFwxIC4uLiIgdGhlIGNvbmZpZ3VyZSBzY3JpcHQgZXhlY3V0ZXMuIEluCiAgIHBhcnRpY3VsYXIgaW5zdGVhZCBvZiBnZXR0aW5nICJcMSIgdGhlIG5vbi1wcmludGFibGUgY2hhcmFjdGVyICJeQSIgaXMKICAgcHJvZHVjZWQsIGFuZCBjYXVzZXMgZmFpbHVyZXMgYXQgY29tcGlsZSB0aW1lIGxpa2U6CiAgLi4vcmZiL3JmYmNvbmZpZy5oOjk6MjI6IHdhcm5pbmc6IGV4dHJhIHRva2VucyBhdCBlbmQgb2YgI2lmbmRlZiBkaXJlY3RpdmUKCiAgIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGNvbmZpZ3VyZSBsaWtlIHRoaXM6CiAgZW52IENPTkZJR19TSEVMTD0vYmluL3NoIC9iaW4vc2ggLi9jb25maWd1cmUKCiAgIGkuZS4gYXZvaWQgdXNpbmcgdGhlIGJhc2ggd2l0aCB0aGUgbWlzYmVoYXZpb3IuIEEgYnVnIGhhcyBiZWVuIGZpbGVkCiAgIGFnYWluc3QgYXV0b2NvbmYgdG8gZ3VhcmQgYWdhaW5zdCB0aGlzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBBSVg6IG9uZSB1c2VyIGhhZCB0byBhZGQgdGhlICJYMTEuYWR0IiBwYWNrYWdlIHRvIEFJWCB0byBnZXQgYnVpbGQKICAgaGVhZGVyIGZpbGVzIGxpa2UgWFNobS5oLCBldGMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFVidW50dSBGZWlzdHkgRmF3biA3LjA0OiBJbiBNYXkvMjAwNyBvbmUgdXNlciBzYWlkIGhlIG5lZWRlZCB0byBhZGQKICAgdGhlc2UgcGFja2FnZXMgdG8gY29tcGlsZSB4MTF2bmMgb24gdGhhdCBMaW51eCBkaXN0cm8gYW5kIHZlcnNpb246CiAgYXB0LWdldCBpbnN0YWxsIGJ1aWxkLWVzc2VudGlhbCBtYWtlIGJpbjg2IGxpYmpwZWc2Mi1kZXYgbGlic3NsLWRldiBsaWJ4dHN0LWQKZXYKCiAgIE5vdGUgdGhhdCBVYnVudHUgaXMgYmFzZWQgb24gRGViaWFuLCBzbyBwZXJoYXBzIHRoaXMgaXMgdGhlIGxpc3QKICAgbmVlZGVkIG9uIERlYmlhbiAodGVzdGluZz8pIGFzIHdlbGwuIFRvIGJ1aWxkIGluIEF2YWhpIChtRE5TIHNlcnZpY2UKICAgYWR2ZXJ0aXNpbmcpIHN1cHBvcnQgaXQgd291bGQgYXBwZWFyIHRoYXQgbGliYXZhaGktY2xpZW50LWRldiBpcwogICBuZWVkZWQgYXMgd2VsbC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgRXhjZWVkaW5nbHkgc2xvdyBjb21waWxhdGlvbjogeDExdm5jIGhhcyBhIGNvdXBsZSBvZiBmaWxlcyB3aGljaAogICBjb250YWluIHZlcnkgbGFyZ2UgImNhc2Ugc3RhdGVtZW50cyIgKG92ZXIgMTAwIGNhc2VzKSB0aGF0IG9uIHNvbWUKICAgcGxhdGZvcm1zIGNhbiB0YWtlIGEgdmVyeSBsb25nIHRpbWUgdG8gY29tcGlsZSAoaW4gZXh0cmVtZSBjYXNlcyBvdmVyCiAgIGFuIGhvdXIpLiBIb3dldmVyIG9uIDMyYml0IExpbnV4IHdpdGggaW50ZWwvYW1kIHByb2Nlc3NvciBhbmQgZ2NjCiAgIHRoZXNlIGZpbGVzIHVzdWFsbHkgdGFrZSBsZXNzIHRoYW4gMTAgc2Vjb25kcyB0byBjb21waWxlLiBGb3IgNjRiaXQKICAgc3lzdGVtcyB1c2luZyBnY2MgdGhlIHByb2JsZW0gYXBwZWFycyB0byBiZSBtdWNoIHdvcnNlLgoKICAgVGhlIHR3byBmaWxlcyB3aXRoIHRoZSBsYXJnZSBudW1iZXIgb2YgY2FzZXMsIHJlbW90ZS5jIGFuZCB4MTF2bmMuYywKICAgaGF2ZSBubyByZWFsIG5lZWQgdG8gYmUgb3B0aW1pemVkICh0aGUgY29kZSBpcyB1c2VkIG9ubHkgdmVyeQogICBpbmZyZXF1ZW50bHkpLiBTbyBpdCBpcyBmaW5lIHRvIHN1cHBseSAiLU8wIiAoZGlzYWJsZXMgb3B0aW1pemF0aW9uKQogICB0byBDRkxBR1Mgd2hlbiBjb21waWxpbmcgdGhlbS4gSG93ZXZlciwgaXQgaXMgdHJpY2t5IHdpdGgKICAgYXV0b2NvbmYvYXV0b21ha2UgdG8gZG8gdGhpcyAoZXNwZWNpYWxseSBzaW5jZSBib3RoIHRoZSBjb21waWxlciBhbmQKICAgbWFrZSB2ZXJzaW9ucyBoYXZlIGEgYmlnIGVmZmVjdCkuCgogICBTbyBpZiB0aGUgY29tcGlsZSB0aW1lcyBhcmUgZ2V0dGluZyB0b28gbG9uZyBmb3IgeW91IGZvciB0aGVzZSB0d28KICAgZmlsZXMgeW91IHdpbGwgbmVlZCB0byBtYW51YWxseSBjaGFuZ2Ugc29tZSB0aGluZ3MuIEZpcnN0LCBydW4KICAgY29uZmlndXJlIGFuZCB3aGVuIGl0IGhhcyBmaW5pc2hlZCwgZWRpdCB0aGUgZ2VuZXJhdGVkIGZpbGUKICAgeDExdm5jL01ha2VmaWxlIGFuZCBwdXQgdGhlc2UgbGluZXMgYXQgdGhlIHZlcnkgdG9wOgp4MTF2bmMteDExdm5jLm8gOiAgQ0ZMQUdTICs9IC1PMAp4MTF2bmMtcmVtb3RlLm8gOiAgQ0ZMQUdTICs9IC1PMAoKICAgVGhvc2UgbGluZXMgYXNzdW1lIGdudSBtYWtlIChnbWFrZSkgaXMgYmVpbmcgdXNlZC4gSWYgeW91IGFyZSB1c2luZwogICBhbm90aGVyIG1ha2UsIHNheSBTb2xhcmlzIG1ha2UsIGluc2VydCB0aGVzZSBpbnN0ZWFkOgp4MTF2bmMteDExdm5jLm8gOj0gQ0ZMQUdTICs9IC1PMAp4MTF2bmMtcmVtb3RlLm8gOj0gQ0ZMQUdTICs9IC1PMAoKICAgWW91IGNvdWxkIHdyaXRlIGEgYnVpbGQgc2hlbGwgc2NyaXB0IHRoYXQgbW9kaWZpZWQgdGhlIE1ha2VmaWxlIHRoaXMKICAgd2F5IGJlZm9yZSBydW5uaW5nIG1ha2UuCgogICBUaGUgIi1PMCIgKG5vdGUgaXQgaXMgImNhcGl0YWwgT2giIGZvbGxvd2VkIGJ5ICJ6ZXJvIikgYXNzdW1lcyB0aGUgZ2NjCiAgIGNvbXBpbGVyLiBJZiB5b3UgYXJlIHVzaW5nIGEgZGlmZmVyZW50IGNvbXBpbGVyIHlvdSB3aWxsIG5lZWQgdG8gZmluZAogICB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbiB0byBkaXNhYmxlIG9wdGltaXphdGlvbiwgb3Igb3RoZXJ3aXNlIGhhdmUgdGhlCiAgIGxpbmVzIHNldCBDRkxBR1MgdG8gdGhlIGVtcHR5IHN0cmluZy4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgQnJva2VuIFRocmVhZCBMb2NhbCBTdG9yYWdlIG9uIFN1U0UgOS4yOiBTdGFydGluZyB3aXRoIHgxMXZuYyAwLjkuOAogICB0aGUgYnVuZGxlZCBsaWJ2bmNzZXJ2ZXIgdXNlcyB0aGUgX190aHJlYWQga2V5d29yZCB0byBtYWtlIHNvbWUgb2YgdGhlCiAgIGVuY29kaW5ncyAoaS5lLiB0aWdodCkgdGhyZWFkIHNhZmUgKG11bHRpcGxlIFZOQyBjbGllbnRzIGNhbiBiZSB1c2luZwogICB0aWdodCBhdCB0aGUgc2FtZSB0aW1lIGluIHgxMXZuYyAtdGhyZWFkcyBtb2RlLikgRXZpZGVudGx5IG9uIHRoZSBvbGQKICAgU3VTRSA5LjIgc3lzdGVtIHRoZSBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSB0aHJlYWQgbG9jYWwgc3RvcmFnZQogICBwcm9wZXJseS4gSGVyZSBpcyBhbiBleGFtcGxlIGJ1aWxkIGZhaWx1cmU6CnRpZ2h0LmM6MTEyNjogZXJyb3I6IHVucmVjb2duaXphYmxlIGluc246CihpbnNuOkhJIDExIDEwIDEzIDAgKG5pbCkgKHNldCAocmVnL2Y6U0kgNTkpCiAgICAgICAgKGNvbnN0OlNJIChwbHVzOlNJIChzeW1ib2xfcmVmOlNJICgiJWxwYWxldHRlIikpCiAgICAgICAgICAgICAgICAoY29uc3RfaW50IDIwNDggWzB4ODAwXSkpKSkgLTEgKG5pbCkKICAgIChleHByX2xpc3Q6UkVHX0VRVUFMIChjb25zdDpTSSAocGx1czpTSSAoc3ltYm9sX3JlZjpTSSAoIiVscGFsZXR0ZSIpKQogICAgICAgICAgICAgICAgKGNvbnN0X2ludCAyMDQ4IFsweDgwMF0pKSkKICAgICAgICAobmlsKSkpCnRpZ2h0LmM6MTEyNjogaW50ZXJuYWwgY29tcGlsZXIgZXJyb3I6IGluIGV4dHJhY3RfaW5zbiwgYXQgcmVjb2cuYzoyMTc1ClBsZWFzZSBzdWJtaXQgYSBmdWxsIGJ1ZyByZXBvcnQsCndpdGggcHJlcHJvY2Vzc2VkIHNvdXJjZSBpZiBhcHByb3ByaWF0ZS4KU2VlIFVSTDpodHRwOi8vd3d3LnN1c2UuZGUvZmVlZGJhY2sgZm9yIGluc3RydWN0aW9ucy4KCiAgIFRoZSB3b3JrYXJvdW5kIGlzIHRvIGRpc2FibGUgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgYXQgY29uZmlndXJlIHRpbWUKICAgbGlrZSB0aGlzOgplbnYgQ1BQRkxBR1M9Ii1EVExTPScnIiAuL2NvbmZpZ3VyZQoKICAgYW5kIHRoZW4gYnVpbGQgaXQuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3N1bnJheS5odG1sOgoKCiAgICBTdW4gUmF5IE5vdGVzOgoKICAgWW91IGNhbiBydW4geDExdm5jIG9uIHlvdXIgKGNvbm5lY3RlZCBvciBkaXNjb25uZWN0ZWQpIFN1blJheSBzZXNzaW9uCiAgIChQbGVhc2UgcmVtZW1iZXIgdG8gdXNlIHNldHRpbmdzIGxpa2UgLXdhaXQgMjAwLCAtc2IgMTUsIGFuZCBub3QKICAgcnVubmluZyBhIHNjcmVlbnNhdmVyIGFuaW1hdGlvbiAoYmxhbmsgaW5zdGVhZCkgdG8gYXZvaWQgYmVpbmcgYQogICByZXNvdXJjZSBob2chIHgxMXZuYyBkb2VzIGluZHVjZSBhIGxvdCBvZiBtZW1vcnkgSS9PIGZyb20gcG9sbGluZyB0aGUKICAgWCBzZXJ2ZXIuIEl0IGFsc28gaGVscHMgdG8gaGF2ZSBhIHNvbGlkIGJhY2tncm91bmQgY29sb3IsIGUuZy4KICAgLXNvbGlkKS4KCiAgIE5ld3M6IFN1biBSYXkgUmVtb3RlIENvbnRyb2wgVG9vbGtpdDogU2VlIHRoZSBuaWNlIHNldCBvZiB0b29scyBpbiB0aGUKICAgU3VuIFJheSBSZW1vdGUgQ29udHJvbCBUb29sa2l0IHRoYXQgbGF1bmNoIHgxMXZuYyBhdXRvbWF0aWNhbGx5IGZvcgogICB5b3UgZm9yIGNlcnRhaW4gdXNhZ2UgbW9kZXMuCgogICBZb3UgaGF2ZSB0byBrbm93IHRoZSBuYW1lIG9mIHRoZSBtYWNoaW5lIHlvdXIgU3VuUmF5IHNlc3Npb24gWCBzZXJ2ZXIKICAgaXMgcnVubmluZyBvbiAoc28geW91IGNhbiBzc2ggaW50byBpdCBhbmQgc3RhcnQgeDExdm5jKS4gWW91IGFsc28gbmVlZAogICB0byBrbm93IHRoZSBYMTEgRElTUExBWSBudW1iZXIgZm9yIHRoZSBzZXNzaW9uOiBvbiBhIFN1blJheSBpdCBjb3VsZAogICBiZSBhIGxhcmdlIG51bWJlciwgZS5nLiA6MTM3LCBzaW5jZSB0aGVyZSBhcmUgbWFueSBwZW9wbGUgd2l0aCBYCiAgIHNlc3Npb25zIChYc3VuIHByb2Nlc3Nlcykgb24gdGhlIHNhbWUgbWFjaGluZS4gSWYgeW91IGRvbid0IGtub3cgaXQsCiAgIHlvdSBjYW4gZ2V0IGl0IGJ5IHJ1bm5pbmcgd2hvKDEpIGluIGEgc2hlbGwgb24gdGhlIFN1blJheSBzZXJ2ZXIgYW5kCiAgIGxvb2tpbmcgZm9yIHRoZSBkdGxvY2FsIGVudHJ5IHdpdGggeW91ciB1c2VybmFtZSAoYW5kIGlmIHlvdSBkb24ndAogICBldmVuIGtub3cgd2hpY2ggc2VydmVyIG1hY2hpbmUgaGFzIHlvdXIgc2Vzc2lvbiwgeW91IGNvdWxkIGxvZ2luIHRvCiAgIGFsbCBwb3NzaWJsZSBvbmVzIGxvb2tpbmcgYXQgdGhlIHdobyBvdXRwdXQgZm9yIHlvdXIgdXNlcm5hbWUuLi4pLgoKICAgSSBwdXQgc29tZSBjb2RlIGluIG15IH4vLmR0cHJvZmlsZSBzY3JpcHQgdGhhdCBzdG9yZXMgJERJU1BMQVkKICAgKGluY2x1ZGluZyB0aGUgaG9zdG5hbWUpIGluIGEgfi8uc3VucmF5X2N1cnJlbnQgZmlsZSBhdCBzZXNzaW9uCiAgIHN0YXJ0dXAgKGFuZCBkZWxldGVzIGl0IHdoZW4gdGhlIFggc2Vzc2lvbiBlbmRzKSB0byBtYWtlIGl0IGVhc3kgdG8KICAgZ2V0IGF0IHRoZSBob3N0bmFtZSBhbmQgWDExIGRpc3BsYXkgbnVtYmVyIGluZm8gZm9yIG15IGN1cnJlbnQgWAogICBzZXNzaW9ucyB3aGVuIEkgc3NoIGluIGFuZCBhbSBhYm91dCB0byBzdGFydCB4MTF2bmMuCgogICBTdW5SYXkgR290Y2hhICMxOiAgIE5vdGUgdGhhdCBldmVuIHRob3VnaCB5b3VyIFN1blJheSBYMTEgRElTUExBWSBpcwogICBzb21ldGhpbmcgbGlrZSA6MTM3LCB4MTF2bmMgc3RpbGwgdHJpZXMgZm9yIHBvcnQgNTkwMCBhcyBpdHMgbGlzdGVuaW5nCiAgIHBvcnQgaWYgaXQgY2FuIGdldCBpdCwgaW4gd2hpY2ggY2FzZSB0aGUgVk5DIGRpc3BsYXkgKGkuZS4gdGhlCiAgIGluZm9ybWF0aW9uIHlvdSBzdXBwbHkgdG8gdGhlIFZOQyB2aWV3ZXIpIGlzIHNvbWV0aGluZyBsaWtlCiAgIHN1bnJheS1zZXJ2ZXI6MCAgIChub3RlIHRoZSA6MCBjb3JyZXNwb25kaW5nIHRvIHBvcnQgNTkwMCwgaXQgaXMgbm90CiAgIDoxMzcpLiBJZiBpdCBjYW5ub3QgZ2V0IDU5MDAsIGl0IHRyaWVzIGZvciA1OTAxLCBhbmQgc28gb24uIFlvdSBjYW4KICAgYWxzbyB0cnkgdG8gZm9yY2UgdGhlIHBvcnQgKGFuZCB0aGVyZWJ5IHRoZSBWTkMgZGlzcGxheSkgdXNpbmcgdGhlCiAgIC1yZmJwb3J0IE5OTk4gb3B0aW9uLgoKICAgRXNwZWNpYWxseSBvbiBhIGJ1c3kgU3VuIFJheSBzZXJ2ZXIgaXQgaXMgb2Z0ZW4gZGlmZmljdWx0IHRvIGZpbmQgZnJlZQogICBwb3J0cyBmb3IgYm90aCBWTkMgYW5kIHRoZSBIVFRQIEphdmEgYXBwbGV0IHNlcnZlciB0byBsaXN0ZW4gb24uIFRoaXMKICAgc2NyaXB0LCB2bmNfZmluZHBvcnRzIG1heSBiZSBvZiB1c2UgZm9yIGRvaW5nIHRoaXMgYXV0b21hdGljYWxseS4gSXQKICAgc3VnZ2VzdHMgeDExdm5jIGNvbW1hbmQgbGluZSBvcHRpb25zIGJhc2VkIG9uIG5ldHN0YXQgb3V0cHV0IHRoYXQKICAgbGlzdHMgdGhlIG9jY3VwaWVkIHBvcnRzLiBJdCBpcyBldmVuIG1vcmUgZGlmZmljdWx0IHRvIHN0YXJ0CiAgIHZuY3NlcnZlci9Ydm5jIG9uIGEgYnVzeSBTdW4gUmF5IGJlY2F1c2UgdGhlbiAzIHBvcnRzIChIVFRQLCBWTkMsIGFuZAogICBYMTEpLCBhbGwgc2VwYXJhdGVkIGJ5IDEwMCBhcmUgbmVlZGVkISBUaGlzIHNjcmlwdCwgZmluZHZuY3BvcnRzIG1heQogICBiZSBoZWxwZnVsIGFzIHdlbGwuIEJvdGggc2NyaXB0cyBzdGFydCBhdCBWTkMgZGlzcGxheSA6MTAgYW5kIHdvcmsKICAgdGhlaXIgd2F5IHVwLgoKICAgU3VuUmF5IEdvdGNoYSAjMjogICBJZiB5b3UgZ2V0IGFuIGVycm9yIGxpa2U6CiAgICAgICAgc2htZ2V0KHRpbGUpIGZhaWxlZC4KICAgICAgICBzaG1nZXQ6IE5vIHNwYWNlIGxlZnQgb24gZGV2aWNlCgogICB3aGVuIHN0YXJ0aW5nIHVwIHgxMXZuYyB0aGF0IG1vc3QgbGlrZWx5IG1lYW5zIGFsbCB0aGUgc2hhcmVkIG1lbW9yeQogICAoc2htKSBzbG90cyBhcmUgZmlsbGVkIHVwIG9uIHlvdXIgbWFjaGluZS4gVGhlIFNvbGFyaXMgZGVmYXVsdCBpcyBvbmx5CiAgIDEwMCwgYW5kIHRoYXQgY2FuIGdldCBmaWxsZWQgdXAgaW4gYSB3ZWVrIG9yIHNvIG9uIGEgU3VuUmF5IHNlcnZlcgogICB3aXRoIGxvdHMgb2YgdXNlcnMuIElmIHRoZSBzaG0gc2xvdCBpcyBvcnBoYW5lZCAoZS5nLiBjcmVhdG9yIHByb2Nlc3MKICAgZGllcykgdGhlIHNsb3QgaXMgbm90IHJlY2xhaW1lZC4gWW91IGNhbiB2aWV3IHRoZSBzaG0gc2xvdHMgd2l0aCB0aGUKICAgImlwY3MgLW1BIiBjb21tYW5kLiBJZiB0aGVyZSBhcmUgYWJvdXQgMTAwIHRoZW4geW91J3ZlIHByb2JhYmx5IGhpdAogICB0aGlzIHByb2JsZW0uIFRoZXkgY2FuIGJlIGNsZWFuZWQgb3V0IChieSB0aGUgb3duZXIgb3IgYnkgcm9vdCkgdXNpbmcKICAgdGhlIGlwY3JtIGNvbW1hbmQuIEkgd3JvdGUgYSBzY3JpcHQgc2htX2NsZWFyIHRoYXQgZmluZHMgdGhlIG9ycGhhbnMKICAgYW5kIGxpc3RzIG9yIHJlbW92ZXMgdGhlbS4gTG9uZ2VyIHRlcm0sIGhhdmUgeW91ciBTdW5SYXkgc3lzYWRtaW4gYWRkCiAgIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gL2V0Yy9zeXN0ZW06CiAgICAgICAgc2V0IHNobXN5czpzaG1pbmZvX3NobW1heCA9IDB4MjAwMDAwMAogICAgICAgIHNldCBzaG1zeXM6c2htaW5mb19zaG1tbmkgPSAweDEwMDAKCiAgIFN1blJheSBHb3RjaGEgIzM6ICAgU29tZSBTdW5SYXkgaW5zdGFsbGF0aW9ucyBoYXZlIGltcGxlbWVudGVkCiAgIHN1c3BlbmRpbmcgY2VydGFpbiBhcHBsaWNhdGlvbnMgd2hlbiBhIFN1blJheSBzZXNzaW9uIGlzIGluIGEKICAgZGlzY29ubmVjdGVkIHN0YXRlIChlLmcuIEphdmEgQmFkZ2UgcHVsbGVkIG91dCwgdXRkZXRhY2gsIGV0YykuIFRoaXMKICAgaXMgYSBnb29kIHRoaW5nIGJlY2F1c2UgaXQgbGltaXRzIGhvZ2d5IG9yIHJ1bmF3YXkgYXBwcyBmcm9tIHdhc3RpbmcKICAgdGhlIHNoYXJlZCBDUFUgcmVzb3VyY2UuIFRoaW5rIGhvdyBtdWNoIENQVSBhbmQgbWVtb3J5IEkvTyBpcyB3YXN0ZWQKICAgYnkgYSBidW5jaCBvZiBGaXJlZm94IHdpbmRvd3MgcnVubmluZyB3b3J0aGxlc3MgRmxhc2ggYW5pbWF0aW9ucyB3aGlsZQogICB5b3VyIHNlc3Npb24gaXMgZGlzY29ubmVjdGVkIQoKICAgU28gc29tZSBzaXRlcyBoYXZlIGltcGxlbWVudGVkIHNjcmlwdHMgdG8gc3VzcGVuZCAoZS5nLiBraWxsIC1TVE9QKQogICBjZXJ0YWluIGFwcHMgd2hlbiB5b3VyIGJhZGdlIGlzIHJlbW92ZWQgZnJvbSB0aGUgU3VuUmF5IHRlcm1pbmFsLiBXaGVuCiAgIHlvdSByZWF0dGFjaCwgaXQga2lsbCAtQ09OVCB0aGVtLiBUaGlzIGNhdXNlcyBwcm9ibGVtcyBmb3Igdmlld2luZyB0aGUKICAgZGV0YWNoZWQgU3VuUmF5IHNlc3Npb24gdmlhIHgxMXZuYzogdGhvc2Ugc3VzcGVuZGVkIGFwcHMgd2lsbCBub3QKICAgcmVzcG9uZCAodGhlaXIgd2luZG93cyB3aWxsIGJlIGJsYW5rIG9yIG90aGVyd2lzZSBpbmFjdGl2ZSkuCgogICBXaGF0IHRvIGRvPyBXZWxsLCBzaW5jZSB5b3UgYXJlIGdvaW5nIHRvIGJlIHVzaW5nIHRoZSBhcHBsaWNhdGlvbiB5b3UKICAgbWlnaHQgYXMgd2VsbCB1bmZyZWV6ZSBpdCByYXRoZXIgdGhhbiBzdGFydGluZyB1cCBhIDJuZCBpbnN0YW5jZS4gSGVyZQogICBpcyBvbmUgd2F5IHRvIGRvIGl0IHVzaW5nIHRoZSBraWxsIC1DT05UIG1lY2hhbmlzbToKICAga2lsbCAtQ09OVCBgcHMgLWVhbGYgfCBncmVwICcgVCAnIHwgZ3JlcCAkTE9HTkFNRSB8IGF3ayAne3ByaW50ICQ0fSdgCgogICBJZiB5b3Ugd2FudCB0byBiZSBhIGdvb2QgY2l0aXplbiBhbmQgcmUtZnJlZXplIHRoZW0gYmVmb3JlIHlvdSBleGl0CiAgIHgxMXZuYyB0aGlzIHNjcmlwdCBjb3VsZCBiZSBvZiB1c2U6CiMhL2Jpbi9zaAojCiMga2lsbCAtU1RPUC8tQ09OVCBzY3JpcHQgZm9yIHgxMXZuYyAob3Igb3RoZXIpIFN1blJheSB1c2FnZSAoImZyZWV6ZXMiCiMgY2VydGFpbiBhcHBzIGZyb20gaG9nZ2luZyByZXNvdXJjZXMgd2hlbiBkaXNjb25uZWN0ZWQpLgojCiMgUHV0IGhlcmUgYSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyB0aGUgYXBwcyB0aGF0IGFyZSBmcm96ZW46CiMKYXBwbWF0Y2g9ImphdmFfdm18anJlfG5ldHNjYXBlLWJpbnxmaXJlZm94LWJpbnxyZWFscGxheXxhY3JvcmVhZHxtb3ppbGxhLWJpbiIKCmlmIFsgIlgkMSIgPSAiWGZyZWV6ZSIgXTsgdGhlbgogICAgICAgIHBraWxsIC1TVE9QIC1VICRMT0dOQU1FICIkYXBwbWF0Y2giCmVsaWYgWyAiWCQxIiA9ICJYdGhhdyIgXTsgdGhlbgogICAgICAgIHBraWxsIC1DT05UIC1VICRMT0dOQU1FICIkYXBwbWF0Y2giCgplbGlmIFsgIiRSRkJfTU9ERSIgPSAiYWZ0ZXJhY2NlcHQiIC1hICIkUkZCX1NUQVRFIiA9ICJOT1JNQUwiIF07IHRoZW4KICAgICAgICAjIGEgdmFsaWQgeDExdm5jIGxvZ2luLgogICAgICAgIGlmIFsgIiRSRkJfQ0xJRU5UX0NPVU5UIiA9ICIxIiBdOyB0aGVuCiAgICAgICAgICAgICAgICAjIG9ubHkgb25lIGNsaWVudCBwcmVzZW50LgogICAgICAgICAgICAgICAgcGtpbGwgLUNPTlQgLVUgJExPR05BTUUgIiRhcHBtYXRjaCIKICAgICAgICBmaQplbGlmIFsgIiRSRkJfTU9ERSIgPSAiZ29uZSIgLWEgIiRSRkJfU1RBVEUiID0gIk5PUk1BTCIgXTsgdGhlbgogICAgICAgICMgYSB2YWxpZCB4MTF2bmMgbG9naW4uCiAgICAgICAgaWYgWyAiJFJGQl9DTElFTlRfQ09VTlQiID0gIjAiIF07IHRoZW4KICAgICAgICAgICAgICAgICMgbGFzdCBjbGllbnQgcHJlc2VudCBoYXMganVzdCBsZWZ0LgogICAgICAgICAgICAgICAgcGtpbGwgLVNUT1AgLVUgJExPR05BTUUgIiRhcHBtYXRjaCIKICAgICAgICBmaQpmaQpleGl0IDAKCiAgIElmIHlvdSBjYWxsZWQgdGhlIHNjcmlwdCAiZ29vZGNpdGl6ZW4iIHlvdSBjb3VsZCB0eXBlICJnb29kY2l0aXplbgogICB0aGF3IiB0byB1bmZyZWV6ZSB0aGVtLCBhbmQgdGhlbiAiZ29vZGNpdGl6ZW4gZnJlZXplIiB0byByZWZyZWV6ZQogICB0aGVtLiBPbmUgY291bGQgYWxzbyB1c2UgdGhlc2UgeDExdm5jIG9wdGlvbnMgIi1hZnRlcmFjY2VwdAogICBnb29kY2l0aXplbiAtZ29uZSBnb29kY2l0aXplbiIgdG8gZG8gaXQgYXV0b21hdGljYWxseS4KCiAgIFN1blJheSBHb3RjaGEgIzQ6ICAgUmVjZW50IHZlcnNpb25zIG9mIHRoZSBTdW4gUmF5IFNlcnZlciBTb2Z0d2FyZQogICBTUlNTIChzZWVtcyB0byBiZSB2ZXJzaW9uIDMuMCBvciAzLjEpIGhhdmUgYSAibWlzZmVhdHVyZSIgdGhhdCB3aGVuCiAgIHRoZSBzZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCAoaS5lLiBiYWRnZS9zbWFydGNhcmQgb3V0KSB0aGUgc2NyZWVuCiAgIGxvY2tlciAoeHNjcmVlbnNhdmVyKSB3aWxsIGZyZWV6ZSB0aGUgWCBzZXJ2ZXIganVzdCB3aGVuIHRoZSAiRW50ZXIKICAgUGFzc3dvcmQiIGRpYWxvZyBib3ggYXBwZWFycy4gU28geW91IGNhbm5vdCB1bmxvY2sgdGhlIHNjcmVlbiByZW1vdGVseQogICB2aWEgeDExdm5jIQoKICAgVXBkYXRlOiBwbGVhc2Ugc2VlIEJvYiBEb29saXR0bGUncyBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgdGhpcwogICBpc3N1ZSBhdCB0aGUgYm90dG9tIG9mIHRoaXMgc2VjdGlvbi4KCiAgIEhlcmUgImZyZWV6ZSIgbWVhbnMgInN0b3Agb3RoZXIgWCBjbGllbnRzIGZyb20gaW5zZXJ0aW5nIGtleWJvYXJkIGFuZAogICBtb3VzZSBpbnB1dCBhbmQgZnJvbSB2aWV3aW5nIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoZSBzY3JlZW4iLiBPcgogICBzb21ldGhpbmcgbGlrZSB0aGF0OyB0aGUgdXBzaG90IGlzIHgxMXZuYyBjYW4ndCBkbyBpdHMgbm9ybWFsIHRoaW5nLgoKICAgVGhlcmUgYXJlIHNldmVyYWwgd29ya2Fyb3VuZHMgZm9yIHRoaXMuCgogICAxKSBUaGUgZWFzaWVzdCBvbmUgYnkgZmFyIGlzIHRvIHB1dCB0aGVzZSBsaW5lcyBpbiB5b3VyCiAgICRIT01FLy5kdHByb2ZpbGUgZmlsZToKU1VOX1NVTlJBWV9VVFhMT0NLX1BSRUY9Ii91c3Ivb3Blbndpbi9iaW4veGxvY2sgLW1vZGUgYmxhbmsiCmV4cG9ydCBTVU5fU1VOUkFZX1VUWExPQ0tfUFJFRgoKICAgT25lIG1pZ2h0IGFyZ3VlIHRoYXQgeGxvY2sgaXNuJ3QgcGFydGljdWxhcmx5ICJwcmV0dHkiLiAoSnVzdCBJTUhPLAogICBidXQgaWYgc29tZXRoaW5nIGxpa2UgdGhpcyBub3QgYmVpbmcgcHJldHR5IGFjdHVhbGx5IGdldHMgaW4gdGhlIHdheQogICBvZiB5b3VyIHdvcmsgSSB0aGluayBzb21lIGludHJvc3BlY3Rpb24gbWF5IGJlIGluIG9yZGVyLiA6LSkKCiAgIDIpIFRoZSBwcm9ibGVtIGhhcyBiZWVuIHRyYWNlZCB0byB0aGUgcGFtX3N1bnJheS5zbyBQQU0gbW9kdWxlLgogICBFdmlkZW50bHkgeHNjcmVlbnNhdmVyIGludm9rZXMgdGhpcyBwYW0gbW9kdWxlIGFuZCBpdCBjb21tdW5pY2F0ZXMKICAgd2l0aCB1dHNlc3Npb25kIHdobyBpbiB0dXJuIGluc3RydWN0cyB0aGUgWHN1biBzZXJ2ZXIgdG8gbm90IHByb2Nlc3MKICAgYW55IHN5bnRoZXRpYyBtb3VzZS9rZXlib2FyZCBpbnB1dCBvciB0byB1cGRhdGUgdGhlIHNjcmVlbgogICBmcmFtZWJ1ZmZlci4gSXQgaXMgbm90IGNsZWFyIGlmIHRoaXMgaXMgYnkgZGVzaWduIChzZWN1cml0eT8pIG9yCiAgIHNvbWV0aGluZyBlbHNlLgoKICAgSW4gYW55IGV2ZW50LCB0aGUgcHJvYmxlbSBjYW4gYmUgYXZvaWRlZCwgc29tZXdoYXQgZHJhc3RpY2FsbHksIGJ5CiAgIGNvbW1lbnRpbmcgb3V0IHRoZSBjb3JyZXNwb25kaW5nIGxpbmUgaW4gL2V0Yy9wYW0uY29uZjoKI3hzY3JlZW5zYXZlciBhdXRoIHN1ZmZpY2llbnQgL29wdC9TVU5XdXQvbGliL3BhbV9zdW5yYXkuc28gc3luY29uZGlzcGxheQoKICAgTGVhdmUgdGhlIG90aGVyIHhzY3JlZW5zYXZlciBwYW0gYXV0aGVudGljYXRpb24gbGluZXMgdW5jaGFuZ2VkLiBUaGUKICAgZHRzZXNzaW9uLVN1blJheSBsaW5lIG1heSBhbHNvIG5lZWQgdG8gYmUgY29tbWVudGVkIG91dCB0byBhdm9pZCB0aGUKICAgcHJvYmxlbSBmb3IgQ0RFIHNlc3Npb25zLiBOLkIuIGl0IGlzIHBvc3NpYmxlIHRoZSBhcHBsaWNhdGlvbiBvZiBhCiAgIFNTUlMgcGF0Y2gsIGV0YywgbWF5IHJlLWVuYWJsZSB0aGF0IC9ldGMvcGFtLmNvbmYgbGluZS4gSXQgbWF5IGJlCiAgIGRpZmZpY3VsdCB0byBjb252aW5jZSBhIHN5c2FkbWluIHRvIG1ha2UgdGhpcyBjaGFuZ2UuCgogICAzKSBBIG1vcmUgZm9yY2VmdWwgd2F5IGlzIHRvIGtpbGwgdGhlIHhzY3JlZW5zYXZlciBwcm9jZXNzIGZyb20gYQogICBzaGVsbCBwcm9tcHQgd2hlbmV2ZXIgeW91IGNvbm5lY3QgdmlhIHgxMXZuYyBhbmQgdGhlIHNjcmVlbiBpcyBpbiBhCiAgIGxvY2tlZCBzdGF0ZToKcGtpbGwgLVUgJExPR05BTUUgJ154c2NyZWVuc2F2ZXIkJwoKICAgQW5kIHRoZW4gYWZ0ZXIgeW91IGFyZSBpbiBiZSBzdXJlIHRvIHJlc3RhcnQgaXQgYnkgdHlwaW5nIHNvbWV0aGluZwogICBsaWtlOgp4c2NyZWVuc2F2ZXIgJgoKICAgWW91IG1heSB3YW50IHRvIGF2b2lkIHJlc3RhcnRpbmcgaXQgdW50aWwgeW91IGFyZSBhYm91dCB0byBkaXNjb25uZWN0CiAgIHlvdXIgVk5DIHZpZXdlciAoc2luY2UgaWYgaXQgbG9ja3MgdGhlIHNjcmVlbiB3aGlsZSB5b3UgYXJlIHdvcmtpbmcKICAgeW91J2xsIGJlIHN0dWNrIGFnYWluKS4KCiAgIDMnKSBUaGUgYWJvdmUgaWRlYSBjYW4gYmUgZG9uZSBhIGJpdCBtb3JlIGNsZWFubHkgYnkgaGF2aW5nIHgxMXZuYyBkbwogICBpdC4gU3VwcG9zZSB3ZSBjYWxsZWQgdGhlIGZvbGxvd2luZyBzY3JpcHQgeHNzX2tpbGxlcjoKIyEvYmluL3NoCiMKIyB4c3Nfa2lsbGVyOiBraWxsIHhzY3JlZW5zYXZlciBhZnRlciBhIHZhbGlkIHgxMXZuYyBjbGllbnQgbG9ncyBpbi4KIyAgICAgICAgICAgICBSZXN0YXJ0IHhzY3JlZW5zYXZlciBhbmQgbG9jayBpdCB3aGVuIHRoZSBsYXN0IGNsaWVudAojICAgICAgICAgICAgIGRpc2Nvbm5lY3RzLgoKUEFUSD0vdXNyL29wZW53aW4vYmluOi91c3IvYmluOiRQQVRICmV4cG9ydCBQQVRICgppZiBbICIkUkZCX01PREUiID0gImFmdGVyYWNjZXB0IiAtYSAiJFJGQl9TVEFURSIgPSAiTk9STUFMIiBdOyB0aGVuCiAgICAgICAgIyBhIHZhbGlkIHgxMXZuYyBsb2dpbi4KICAgICAgICBpZiBbICIkUkZCX0NMSUVOVF9DT1VOVCIgPSAiMSIgXTsgdGhlbgogICAgICAgICAgICAgICAgIyBvbmx5IG9uZSBjbGllbnQgcHJlc2VudC4KICAgICAgICAgICAgICAgIHBraWxsIC1VICRMT0dOQU1FICdeeHNjcmVlbnNhdmVyJCcKICAgICAgICAgICAgICAgIHBraWxsIC1LSUxMIC1VICRMT0dOQU1FIC1mIHhzY3JlZW5zYXZlci9oYWNrcwogICAgICAgIGZpCmVsaWYgWyAiJFJGQl9NT0RFIiA9ICJnb25lIiAtYSAiJFJGQl9TVEFURSIgPSAiTk9STUFMIiBdOyB0aGVuCiAgICAgICAgIyBhIHZhbGlkIHgxMXZuYyBsb2dpbi4KICAgICAgICBpZiBbICIkUkZCX0NMSUVOVF9DT1VOVCIgPSAiMCIgXTsgdGhlbgogICAgICAgICAgICAgICAgIyBsYXN0IGNsaWVudCBwcmVzZW50IGhhcyBqdXN0IGxlZnQuCiAgICAgICAgICAgICAgICB4c2NyZWVuc2F2ZXIgLW5vc3BsYXNoICYKICAgICAgICAgICAgICAgIHNsZWVwIDEKICAgICAgICAgICAgICAgIHhzY3JlZW5zYXZlci1jb21tYW5kIC1sb2NrICYKICAgICAgICBmaQpmaQoKICAgVGhlbiB3ZSB3b3VsZCBydW4geDExdm5jIHdpdGggdGhlc2Ugb3B0aW9uczogIi1hZnRlcmFjY2VwdCB4c3Nfa2lsbGVyCiAgIC1nb25lIHhzc19raWxsZXIiLiBUaGUgLWFmdGVyYWNjZXB0IG9wdGlvbiAoaW50cm9kdWNlZCBpbiB2ZXJzaW9uIDAuOCkKICAgaXMgdXNlZCB0byBydW4gYSBjb21tYW5kIGFmdGVyIGEgdm5jdmlld2VyIGhhcyBzdWNjZXNzZnVsbHkgbG9nZ2VkIGluCiAgIChub3RlIHRoYXQgdGhpcyBpcyBhIFZOQyBsb2dpbiwgbm90IGEgVW5peCBsb2dpbiwgc28geW91IG1heSBub3Qgd2FudAogICB0byBkbyB0aGlzIGlmIHlvdSBhcmUgcmVhbGx5IHBhcmFub2lkLi4uKQoKICAgTm90ZSBpZiB5b3UgdXNlIHRoZSBhYm92ZSBzY3JpcHQgYW5kIGFsc28gcGxhbiB0byBDdHJsLUMgKFNJR0lOVCkKICAgeDExdm5jIHlvdSBoYXZlIHRvIHJ1biB0aGUgeHNjcmVlbnNhdmVyIGluIGEgbmV3IHByb2Nlc3MgZ3JvdXAgdG8KICAgYXZvaWQga2lsbGluZyBpdCBhcyB3ZWxsLiBPbmUgd2F5IHRvIGRvIHRoaXMgaXMgdmlhIHRoaXMga2x1ZGdlOgpwZXJsIC1lICdzZXRwZ3JwKDAsMCk7IGV4ZWMgInhzY3JlZW5zYXZlciAtbm9zcGxhc2ggJiInCgogICBpbiB0aGUgYWJvdmUgc2NyaXB0LgoKICAgNCkgVGhlcmUgYXBwZWFycyB0byBiZSBhIGJ1ZyBpbiBwYW1fc3VucmF5LnNvIGluIHRoYXQgaXQgZG9lc24ndCBzZWVtCiAgIHRvIGhvbm9yIHRoZSBjb252ZW50aW9uIHRoYXQsIHNheSwgRElTUExBWT11bml4OjMgbWVhbnMgdG8gdXNlIFVuaXgKICAgc29ja2V0cyB0byBjb25uZWN0IHRvIGRpc3BsYXkgMyBvbiB0aGUgbG9jYWwgbWFjaGluZSAodGhpcyBpcyBhIGJpdAogICBmYXN0ZXIgdGhhbiBUQ1Agc29ja2V0cykuIFJhdGhlciwgaXQgdGhpbmtzIHRoZSBkaXNwbGF5IGlzIGEgbm9uLWxvY2FsCiAgIG9uZSB0byBhIG1hY2hpbmUgbmFtZWQgInVuaXgiICh0aGF0IHVzdWFsbHkgZG9lcyBub3QgcmVzb2x2ZSB0byBhbiBJUAogICBhZGRyZXNzKS4KCiAgIEFtdXNpbmdseSwgdGhpcyBjYW4gYmUgdXNlZCB0byBieXBhc3MgdGhlIHBhbV9zdW5yYXkuc28gYmxvY2tpbmcgb2YKICAgWHN1biB0aGF0IHByZXZlbnRzIG9uZSBmcm9tIHVubG9ja2luZyB0aGUgc2NyZWVuIHJlbW90ZWx5IHZpYSB4MTF2bmMuCiAgIE9uZSBjb3VsZCBwdXQgc29tZXRoaW5nIGxpa2UgdGhpcyBpbiAkSE9NRS8uZHRwcm9maWxlIHRvIGtpbGwgYW55CiAgIGV4aXN0aW5nIHhzY3JlZW5zYXZlcnMgYW5kIHRoZW4gc3RhcnQgdXAgYSBmcmVzaCB4c2NyZWVuc2F2ZXIgdXNpbmcKICAgRElTUExBWT11bml4Ok4KIyBzdG9wL2tpbGwgYW55IHJ1bm5pbmcgeHNjcmVlbnNhdmVycyAocHJvYmFibHkgbm90IHJ1bm5pbmcgeWV0LCBidXQgdG8gYmUgc3VyZQopCnhzY3JlZW5zYXZlci1jb21tYW5kIC1leGl0CnBraWxsIC1VICRMT0dOQU1FICdeeHNjcmVlbnNhdmVyJCcKZW52IERJU1BMQVk9YGVjaG8gJERJU1BMQVkgfCBzZWQgLWUgJ3MvXi4qOi91bml4Oi8nYCB4c2NyZWVuc2F2ZXIgJgoKCiAgIEltcG9ydGFudDogTm90ZSB0aGF0IGFsbCBvZiB0aGUgYWJvdmUgd29ya2Fyb3VuZHMgc2lkZS1zdGVwIHRoZQogICBwYW1fc3VucmF5LnNvIFBBTSBtb2R1bGUgaW4gb25lIHdheSBvciBhbm90aGVyLiBZb3UnbGwgbmVlZCB0byBzZWUgaWYKICAgdGhhdCBpcyBhcHByb3ByaWF0ZSBmb3IgeW91ciBzaXRlJ3MgU3VuUmF5IC8gc21hcnRjYXJkIHVzYWdlLiBBbHNvLAogICB0aGVzZSBoYWNrcyBtYXkgYnJlYWsgb3RoZXIgdGhpbmdzIGFuZCBzbyB5b3UgbWF5IHdhbnQgdG8gdGVzdCB2YXJpb3VzCiAgIHNjZW5hcmlvcyBjYXJlZnVsbHkuIEUuZy4gY2hlY2sgY29ybmVyIGNhc2VzIGxpa2UgWERNQ1AvZHRyZW1vdGUsCiAgIE5TQ00sIGV0Yy4KCgogICBVcGRhdGUgTWF5IDIwMDg6IEhlcmUgaXMgYSB1c2VmdWwgZGVzY3JpcHRpb24gb2YgdGhpcyBpc3N1ZSBmcm9tIEJvYgogICBEb29saXR0bGUgd2hvIGlzIGEgZGV2ZWxvcGVyIGZvciBTdW4gUmF5IGF0IFN1bi4gSSBkb24ndCBoYXZlIHRoZSB0aW1lCiAgIHRvIGRpZ2VzdCBhbmQgZGlzdGlsbCBpdCBhbmQgdGhlbiBhZGp1c3QgdGhlIGFib3ZlIG1ldGhvZHMgdG8gcHJvdmlkZQogICBhIGNsZWFyZXIgZGVzY3JpcHRpb24sIHNvIEkganVzdCBpbmNsdWRlIGJlbG93IHRoZSBkZXNjcmlwdGlvbiBoZSBzZW50CiAgIG1lIHdpdGggdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGhlbHAgc29tZSB1c2VyczoKCiAgICAgSW4gU1JTUyA0LjAgYW5kIGVhcmxpZXIsIHRoZSBwdXJwb3NlIG9mIHBhbV9zdW5yYXkuc28gaW4gdGhlICJhdXRoIgogICAgIFBBTSBzdGFjayBvZiBzY3JlZW5zYXZlcnMgaXMgdG8gZW5hYmxlIE5TQ00gKGFuZCwgYWx0aG91Z2ggdGhpcyBpcwogICAgIG11Y2ggbGVzcyBjb21tb25seSB1c2VkLCAiU0MiLCB3aGljaCBpcyBjb25maWd1cmVkIHdoZW4gM3JkLXBhcnR5CiAgICAgc29mdHdhcmUgaXMgaW5zdGFsbGVkIHRvIGFsbG93IHNtYXJ0Y2FyZHMgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZQogICAgIGF1dGhlbnRpY2F0aW9uIHByb2Nlc3MpIHRvIHdvcmsuIEl0IHNob3VsZCBoYXZlIG5vIGVmZmVjdCB3aXRoCiAgICAgc21hcnRjYXJkcy4gQ3VycmVudGx5LCBob3dldmVyLCBpdCBkb2VzIGJsb2NrIHRoZSBQQU0gc3RhY2sgZm9yIGFsbAogICAgIHNlc3Npb25zLCB3aGljaCBjYXVzZXMgeHNjcmVlbnNhdmVyLCB3aGVuIGl0IGxvY2tzIGEgZGlzY29ubmVjdGVkCiAgICAgc2Vzc2lvbiwgdG8gbm90IHByb2Nlc3MgYW55IG1vdXNlIG9yIGtleWJvYXJkIGV2ZW50cyBhcyB5b3UKICAgICBkZXNjcmliZSAodW5sZXNzIHhzY3JlZW5zYXZlciBkb2VzIGFuIFggc2VydmVyIGdyYWIsIGhvd2V2ZXIsIG90aGVyCiAgICAgYXBwbGljYXRpb25zIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIGRyYXcgaW4gdGhlIHNlc3Npb24gYWx0aG91Z2gKICAgICB4c2NyZWVuc2F2ZXIgbWF5IGJlIHBsYXlpbmcgdHJpY2tzIGxpa2UgcHV0dGluZyBhIGJsYWNrIHdpbmRvdyBvbgogICAgIHRvcCBvZiBldmVyeXRoaW5nKS4gSW4gYm90aCBvZiB0aGUgTlNDTSBhbmQgU0MgbW9kZWxzLAogICAgIGF1dGhlbnRpY2F0aW9uIG9jY3VycyBpbiBhIHNlcGFyYXRlIHNlc3Npb24gYmVmb3JlIFNSU1Mgd2lsbAogICAgIHJlY29ubmVjdCB0byB0aGUgdXNlciBzZXNzaW9uLCBpbiB3aGljaCBjYXNlIHBhbV9zdW5yYXkuc28gY2F1c2VzCiAgICAgeHNjcmVlbnNhdmVyIHRvIGp1c3QgdW5sb2NrIHRoZSBzY3JlZW4gd2l0aG91dCBwcm9tcHRpbmcgdGhlIHVzZXIKICAgICB0byBlbnRlciB0aGVpciBwYXNzd29yZCBhZ2Fpbi4gVG8gZG8gdGhpcywgcGFtX3N1bnJheS5zbyBoYXMgdG8KICAgICBibG9jayB1bnRpbCB0aGUgc2Vzc2lvbiBiZWNvbWVzIHJlY29ubmVjdGVkLCBzbyBpdCBjYW4gcXVlcnkgU1JTUwogICAgIGF0IHRoYXQgdGltZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUgdXNlciBoYXMgYWxyZWFkeQogICAgIGF1dGhlbnRpY2F0ZWQgb3Igbm90LiBJbiBTUlNTIDQuMCBhbmQgZWFybGllciByZWxlYXNlcywKICAgICBwYW1fc3VucmF5LnNvIGNvdWxkIGhhdmUgYmVlbiBvcHRpbWl6ZWQgdG8gbm90IGJsb2NrIHNtYXJ0Y2FyZAogICAgIHNlc3Npb25zLCBhbHRob3VnaCBzaW5jZSB0aGUgc2Vzc2lvbiBpcyBkaXNjb25uZWN0ZWQgdGhpcyB0eXBpY2FsbHkKICAgICBpc24ndCBpbXBvcnRhbnQgKGV4Y2VwdCBpbiB0aGUgeDExdm5jIGNhc2UsIGFzIHlvdSd2ZSBvYnNlcnZlZCkuCgogICAgIEluIFNSU1MgNC4xLCBob3dldmVyLCBmb3IgaW5jcmVhc2VkIHNlY3VyaXR5IHRoZSBvdXQtb2Ytc2Vzc2lvbgogICAgIGF1dGhlbnRpY2F0aW9uIG1vZGVsIGhhcyBiZWVuIGV4dGVuZGVkIHRvICphbGwqIHNlc3Npb24gdHlwZXMsIHNvCiAgICAgcGFtX3N1bnJheS5zbyB3aWxsIGJlIHJlcXVpcmVkIGluIGFsbCBjYXNlcyB1bmxlc3MgdXNlcnMgYXJlCiAgICAgd2lsbGluZyB0byBhdXRoZW50aWNhdGUgdHdpY2UgdXBvbiBob3RkZXNraW5nIChlLmcuIHdoZW4gdGhlaXIgY2FyZAogICAgIGlzIGluc2VydGVkKS4gSW4gZnV0dXJlLCB3ZSBtYXkgZG8gYXdheSB3aXRoIHBhbV9zdW5yYXkuc28sIGFuZCBpbgogICAgIGZhY3Qgd2l0aCBhbnkgdHJhZGl0aW9uYWwgc2NyZWVuIGxvY2tlciBpbiB0aGUgdXNlciBzZXNzaW9uLCBzaW5jZQogICAgIFNSU1MgaXRzZWxmIHdpbGwgYmUgcHJvdmlkaW5nIGJldHRlciBzZWN1cml0eSB0aGFuIGEgc2NyZWVuIGxvY2tlcgogICAgIHJ1bm5pbmcgZW50aXJlbHkgd2l0aGluIHRoZSB1c2VyJ3MgWCBzZXNzaW9uIGlzIGNhcGFibGUgb2YKICAgICBwcm92aWRpbmcuCgogICAgIFlvdXIgdHJpY2sgb2Ygc2V0dGluZyBESVNQTEFZIHRvIHVuaXg6RFBZIHdpbGwgZWZmZWN0aXZlbHkgZGlzYWJsZQogICAgIHBhbV9zdW5yYXkuc28gKEknbSBub3Qgc3VyZSBJJ2QgY2FsbCB0aGF0IGEgYnVnIC0geW91J3JlIGdvaW5nIG91dAogICAgIG9mIHlvdXIgd2F5IHRvIGRvIHNvbWV0aGluZyB0aGF0IHdvdWxkbid0IG9jY3VyIGluIHRoZSBub3JtYWwKICAgICBjb3Vyc2Ugb2YgZXZlbnRzLCBhbmQgcmVhbGx5IHByb3ZpZGVzIG5vIHVzZWZ1bCB2YWx1ZSBvdGhlciB0aGFuIHRvCiAgICAgdGlja2xlIHRoaXMgYmVoYXZpb3IgaW4gcGFtX3N1bnJheS5zbykuIFRoaXMgd2lsbCBtZWFuIHRoYXQsIGluCiAgICAgU1JTUyA0LjAgYW5kIGVhcmxpZXIgcmVsZWFzZXMsIHVzZXJzIHdpbGwgYmUgcHJvbXB0ZWQgZm9yIHRoZWlyCiAgICAgcGFzc3dvcmRzIHR3aWNlIHdoZW4gcmVjb25uZWN0aW5nIHRvIHRoZWlyIHNlc3Npb25zIGZvciBOU0NNIGFuZCBTQwogICAgIHNlc3Npb24gdHlwZXMuIEluIDQuMSwgZGlzYWJsaW5nIHBhbV9zdW5yYXkuc28gaW4gdGhpcyB3YXkgd2lsbAogICAgIGNhdXNlIHRoaXMgZG91YmxlLWF1dGhlbnRpY2F0aW9uIHRvIG9jY3VyIGZvciAqYWxsKiBzZXNzaW9ucywKICAgICBpbmNsdWRpbmcgc2ltcGxlIHNtYXJ0Y2FyZCBzZXNzaW9ucy4gVXNlcnMgbWF5IGJlIHdpbGxpbmcgdG8gcGF5CiAgICAgdGhhdCBwcmljZSBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHVzZSB4MTF2bmMgaW4gZGlzY29ubmVjdGVkCiAgICAgc2Vzc2lvbnMuIEkgbGlrZSB0aGlzIGhhY2ssIHBlcnNvbmFsbHkuIEl0J3MgYSBsaXR0bGUgbGVzcwogICAgIGNvbnZlbmllbnQgdGhhbiBzb21lIG9mIHRoZSBvdGhlciBhcHByb2FjaGVzIHlvdSBkZXNjcmliZSwgYnV0IGl0J3MKICAgICBsaWdodGVyLXdlaWdodCBhbmQgbW9yZSBzZWN1cmUgdGhhbiBtb3N0IG9mIHRoZSBvdGhlciBhcHByb2FjaGVzLAogICAgIGFuZCBwcm92aWRlcyB0aGUgdmFsdWUgb2YgYmVpbmcgYWJsZSB0byB1c2UgeDExdm5jIGluIGxvY2tlZAogICAgIHNlc3Npb25zLgoKICAgICBIZXJlIGFyZSBzb21lIG90aGVyIG1pbm9yIG5vdGVzOiAtIEkgd291bGRuJ3QgcmVjb21tZW5kIHN0b3JpbmcKICAgICB5b3VyIGRpc3BsYXkgaW4geW91ciAuZHRwcm9maWxlLCB1bmxlc3MgeW91J3JlIHdpbGxpbmcgdG8gbGl2ZSB3aXRoCiAgICAgYSBzaW5nbGUgc2Vzc2lvbiBhdCBhIHRpbWUuIFBlcnNvbmFsbHksIEkgb2Z0ZW4gZmluZCBteXNlbGYgdXNpbmcKICAgICBzZXZlcmFsIHNlc3Npb25zLCBpbiBzZXZlcmFsIEZvR3MsIGZvciBzaG9ydCBwZXJpb2RzIG9mIHRpbWUgc28KICAgICB0aGlzIHdvdWxkIGNlcnRhaW5seSBicmVhay4gSU1PIGl0J3MgcHJldHR5IGVhc3kgdG8gdXNlICRESVNQTEFZIHRvCiAgICAgZG8gd2hhdCB5b3Ugd2FudCBvbiB0aGUgZmx5LCBhcyBuZWVkZWQsIHNvIEkgZG9uJ3QgdGhpbmsgdGhlIHByaWNlCiAgICAgb2YgYnJlYWtpbmcgbXVsdGlwbGUtc2Vzc2lvbiBmdW5jdGlvbmFsaXR5IHdvdWxkIGJlIHdvcnRoIHRoZQogICAgIGNvbnZlbmllbmNlLCB0byBtZSBhdCBsZWFzdC4gSGVyZSdzIHNvbWUga3NoL2Jhc2ggc3ludGF4IHRvIGV4dHJhY3QKICAgICB0aGUgaG9zdG5hbWUgYW5kIGRpc3BsYXkgbnVtYmVyIG9uIHRoZSBmbHkgd2hpY2ggeW91IG1heSBmaW5kCiAgICAgdXNlZnVsOgpIT1NUTkFNRT0ke0RJU1BMQVklOip9CkZVTExEUFk9JHtESVNQTEFZIyo6fQpEUFlOVU09JHtGVUxMRFBZJS4qfQoKICAgICBBIGZpbmFsIG5vdGUgbWF5IGdpdmUgeW91IHNvbWUgaW5zaWdodCBpbnRvIG90aGVyIGNsZXZlciBoYWNrcyBpbgogICAgIHRoaXMgYXJlYTogLSBDaGVjayBvdXQgdXRhY3Rpb24uIEl0J3MgYSB2ZXJ5IGhhbmR5IGxpdHRsZSB1dGlsaXR5CiAgICAgdGhhdCBjYW4gYmUgcnVuIGFzIGEgZGFlbW9uIGluIHRoZSB1c2VyIHNlc3Npb24gd2hpY2ggd2lsbCBpbnZva2UgYQogICAgIHNwZWNpZmllZCBjb21tYW5kIHVwb24gc2Vzc2lvbiBjb25uZWN0cyBhbmQvb3IgZGlzY29ubmVjdHMuCiAgICAgUGVyc29uYWxseSwgSSBzdGFydCBvbmUgdXAgaW4gbXkgLmR0cHJvZmlsZSBhcyBmb2xsb3dzOgp1dGFjdGlvbiAtYyAkSE9NRS8uc3Jjb25uZWN0cmMgLWQgJEhPTUUvLnNyZGlzY29ubmVjdHJjICYKCiAgICAgVGhpcyB0aGVuIGFsbG93cyBtZSB0byBjb25zdHJ1Y3QgYSAuc3Jjb25uZWN0cmMgc2NyaXB0IGNvbnRhaW5pbmcKICAgICB1c2VmdWwgY29tbWFuZHMgSSdkIGxpa2UgdG8gaGF2ZSBydW4gZXZlcnkgdGltZSBJIGluc2VydCBteQogICAgIHNtYXJ0Y2FyZCwgYW5kIGEgLnNyZGlzY29ubmVjdHJjIHNjcmlwdCBvZiBjb21tYW5kcyB0byBiZSBydW4gZXZlcnkKICAgICB0aW1lIEkgcmVtb3ZlIG15IHNtYXJ0Y2FyZCAob3IsIGNvbm5lY3QvZGlzY29ubmVjdCB0byBteSBzZXNzaW9uCiAgICAgdmlhIE5TQ00gb3IgU0MpLiBUaGlzIGNhbiBiZSB1c2VkIGZvciB0aGluZ3MgbGlrZSBub3RpZnlpbmcgYSBjaGF0CiAgICAgY2xpZW50IG9mIGF3YXkgc3RhdHVzLCBhcyB3ZWxsIGFzIHNvbWUgb2YgdGhlIGhhY2tzIHlvdSd2ZQogICAgIGRlc2NyaWJlZCBvbiB5b3VyIHBhZ2Ugc3VjaCBhcyBmcmVlemUvdW5mcmVlemUsIG9yIHBlcmhhcHMgdG8KICAgICB0ZXJtaW5hdGUgYW4geHNjcmVlbnNhdmVyIGFuZCBzdGFydCB1cCBhIG5ldyBvbmUgd2l0aCB0aGUgdW5peDpEUFkKICAgICAkRElTUExBWSBzcGVjaWZpY2F0aW9uIGFzIHlvdSBkZXNjcmliZSAoYWx0aG91Z2ggaXQgcHJvYmFibHkgbWFrZXMKICAgICBtb3N0IHNlbnNlIHRvIGRvIHRoaXMgYXQgbG9naW4gdGltZSwgYXMgb3Bwb3NlZCB0byBldmVyeSBjb25uZWN0IG9yCiAgICAgZGlzY29ubmVjdCBldmVudCkuCgkKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9zc2wuaHRtbDoKCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBOb3RlcyBvbiB4MTF2bmMgU1NMIENlcnRpZmljYXRlcyBhbmQgS2V5IE1hbmFnZW1lbnQ6CgogICBUaGUgc2ltcGxlc3Qgc2NoZW1lICgieDExdm5jIC1zc2wgVE1QIikgaXMgd2hlcmUgeDExdm5jIGdlbmVyYXRlcyBhCiAgIHRlbXBvcmFyeSwgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUgZWFjaCB0aW1lIChhdXRvbWF0aWNhbGx5IHVzaW5nCiAgIG9wZW5zc2woMSkpIGFuZCB0aGUgVk5DIHZpZXdlciBjbGllbnQgYWNjZXB0cyB0aGUgY2VydGlmaWNhdGUgd2l0aG91dAogICBxdWVzdGlvbiAoZS5nLiB1c2VyIGNsaWNrcyAiWWVzIiBpbiBhIGRpYWxvZyBib3guIFBlcmhhcHMgdGhlIGRpYWxvZwogICBhbGxvd3MgdGhlbSB0byB2aWV3IHRoZSBjZXJ0aWZpY2F0ZSB0b28pLiBBbHNvIG5vdGUgc3R1bm5lbCdzIGRlZmF1bHQKICAgaXMgdG8gcXVpZXRseSBhY2NlcHQgYWxsIGNlcnRpZmljYXRlcy4KCiAgIFRoZSBlbmNyeXB0aW9uIHRoaXMgcHJvdmlkZXMgcHJvdGVjdHMgYWdhaW5zdCBhbGwgcGFzc2l2ZSBzbmlmZmluZyBvZgogICB0aGUgVk5DIHRyYWZmaWMgYW5kIHBhc3N3b3JkcyBvbiB0aGUgbmV0d29yayBhbmQgc28gaXQgaXMgcXVpdGUgZ29vZCwKICAgYnV0IGl0IGRvZXMgbm90IHByZXZlbnQgYSBNYW4tSW4tVGhlLU1pZGRsZSBhY3RpdmUgYXR0YWNrOiBlLmcuIGFuCiAgIGF0dGFja2VyIGludGVyY2VwdHMgdGhlIFZOQyBjbGllbnQgc3RyZWFtIGFuZCBzZW5kcyBpdCBoaXMgb3duIFB1YmxpYwogICBrZXkgZm9yIFNTTCBuZWdvdGlhdGlvbiAocHJldGVuZGluZyB0byBiZSB0aGUgc2VydmVyKS4gVGhlbiBpdCBtYWtlcyBhCiAgIGNvbm5lY3Rpb24gdG8gU1NMIHgxMXZuYyBpdHNlbGYgYW5kIGZvcndhcmRzIHRoZSBkYXRhIGJhY2sgYW5kIGZvcnRoLgogICBIZSBjYW4gc2VlIGFsbCB0aGUgdHJhZmZpYyBhbmQgbW9kaWZ5IGl0IGFzIHdlbGwuCgogICBNb3N0IHBlb3BsZSBkb24ndCBzZWVtIHRvIHdvcnJ5IGFib3V0IE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFja3MgdGhlc2UKICAgZGF5czsgdGhleSBhcmUgbW9yZSBjb25jZXJuZWQgYWJvdXQgcGFzc2l2ZSBzbmlmZmluZyBvZiBwYXNzd29yZHMsCiAgIGV0Yy4gUGVyaGFwcyBzb21lZGF5IHRoYXQgd2lsbCBjaGFuZ2UgaWYgYXR0YWNrIHRvb2xzIGFyZSB1c2VkIG1vcmUKICAgd2lkZWx5IHRvIHBlcmZvcm0gdGhlIGF0dGFjay4gTk9URTogVGhlcmUgYXJlIGhhY2tlciB0b29scyBsaWtlCiAgIGRzbmlmZi93ZWJtaXRtIGFuZCBjYWluIHRoYXQgaW1wbGVtZW50IFNTTCBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLgogICBUaGV5IGFsbCByZWx5IG9uIHRoZSBjbGllbnQgbm90IGJvdGhlcmluZyB0byBjaGVjayB0aGF0IHRoZSBjZXJ0IGlzCiAgIHZhbGlkLgoKICAgSWYgeW91IGFyZSBub3Qgd29ycmllZCBhYm91dCBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzIHlvdSBkbyBub3QgaGF2ZQogICB0byByZWFkIHRoZSB0ZWNobmlxdWVzIGRlc2NyaWJlZCBpbiB0aGUgcmVzdCBvZiB0aGlzIGRvY3VtZW50LgoKICAgVG8gcHJldmVudCBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLCBjZXJ0aWZpY2F0ZXMgbXVzdCBzb21laG93IGJlCiAgIHZlcmlmaWVkLiBUaGlzIHJlcXVpcmVzIHRoZSBWTkMgY2xpZW50IHNpZGUgaGF2ZSBzb21lIHBpZWNlIG9mCiAgIGluZm9ybWF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZSBTU0wgeDExdm5jIHNlcnZlci4KICAgQWx0ZXJuYXRpdmVseSwgYWx0aG91Z2ggcmFyZWx5IGRvbmUsIHgxMXZuYyBjYW4gdmVyaWZ5IFZOQyBDbGllbnRzJwogICBjZXJ0aWZpY2F0ZXMsIHNlZSB0aGUgLXNzbHZlcmlmeSBvcHRpb24gdGhhdCBpcyBkaXNjdXNzZWQgYmVsb3cuCgogICBUaGVyZSBhcmUgYSBudW1iZXIgb2Ygd2F5cyB0byBoYXZlIHRoZSBjbGllbnQgYXV0aGVudGljYXRlIHRoZSBTU0wKICAgeDExdm5jIHNlcnZlci4gVGhlIHF1aWNrZXN0IHdheSBwZXJoYXBzIHdvdWxkIGJlIHRvIGNvcHkgKHNhZmVseSkgdGhlCiAgIGNlcnRpZmljYXRlIHgxMXZuYyBwcmludHMgb3V0OgoyNi8wMy8yMDA2IDIxOjEyOjAwIENyZWF0aW5nIGEgdGVtcG9yYXJ5LCBzZWxmLXNpZ25lZCBQRU0gY2VydGlmaWNhdGUuLi4KLi4uCi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQpNSUlDNFRDQ0FrcWdBd0lCQWdJSkFNbndDYU9qdkVLYU1BMEdDU3FHU0liM0RRRUJCQVVBTUlHbU1Rc3dDUVlEClZRUUdFd0pCVlRFT01Bd0dBMVVFQnhNRlRHbHVkWGd4SVRBZkJnTlZCQXNUR0dGdVoyVnNZUzB4TVRRek5ESTEKTlRJd0xqUXhNVEUyT1RFUE1BMEdBMVVFQ2hNR2VERXhkbTVqTVM0d0xBWURWUVFERXlWNE1URjJibU10VTBWTQoobW9yZSBsaW5lcykgLi4uCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KCiAgIHRvIHRoZSBjbGllbnQgbWFjaGluZShzKSBhbmQgaGF2ZSB0aGUgY2xpZW50J3MgU1NMIG1hY2hpbmVyeSAoZS5nLgogICBzdHVubmVsLCBXZWIgQnJvd3Nlciwgb3IgSmF2YSBwbHVnaW4pIGltcG9ydCB0aGUgY2VydGlmaWNhdGUuIFRoYXQgd2F5CiAgIHdoZW4gdGhlIGNvbm5lY3Rpb24gdG8geDExdm5jIGlzIG1hZGUgdGhlIGNsaWVudCBjYW4gdmVyaWZ5IHRoYXQgaXMgaXQKICAgdGhlIGRlc2lyZWQgc2VydmVyIG9uIHRoZSBvdGhlciBzaWRlIG9mIHRoZSBTU0wgY29ubmVjdGlvbi4KCiAgIFNvLCBmb3IgZXhhbXBsZSBzdXBwb3NlIHRoZSB1c2VyIGlzIHVzaW5nIHRoZSBTU0wgZW5hYmxlZCBKYXZhIFZOQwogICBWaWV3ZXIgYW5kIGhhcyBpbmNvcnBvcmF0ZWQgdGhlIHgxMXZuYyBjZXJ0aWZpY2F0ZSBpbnRvIGhpcyBXZWIKICAgYnJvd3NlciBvbiB0aGUgdmlld2luZyBzaWRlLiBJZiBoZSBnZXRzIGEgZGlhbG9nIHRoYXQgdGhlIGNlcnRpZmljYXRlCiAgIGlzIG5vdCB2ZXJpZmllZCBoZSBrbm93cyBzb21ldGhpbmcgaXMgd3JvbmcuIEl0IG1heSBiZSBhCiAgIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFjaywgYnV0IG1vcmUgbGlrZWx5IHgxMXZuYyBjZXJ0aWZpY2F0ZSBoYXMKICAgY2hhbmdlZCBvciBleHBpcmVkIG9yIGhpcyBicm93c2VyIHdhcyByZWluc3RhbGxlZCBhbmQvb3IgbG9zdCB0aGUKICAgY2VydGlmaWNhdGUsIGV0YywgZXRjLgoKICAgQXMgYW5vdGhlciBleGFtcGxlLCBpZiB0aGUgdXNlciB3YXMgdXNpbmcgc3R1bm5lbCB3aXRoIGhpcyBWTkMgdmlld2VyCiAgICh0aGlzIGlzIG1lbnRpb25lZCBpbiB0aGlzIEZBUSksIGUuZy4gU1RVTk5FTC5FWEUgb24gV2luZG93cywgdGhlbiBoZQogICB3b3VsZCBoYXZlIHRvIHNldCB0aGUgIkNBZmlsZSA9IHBhdGgtdG8tdGhlLWNlcnQiIGFuZCAidmVyaWZ5ID0gMiIKICAgb3B0aW9ucyBpbiB0aGUgc3R1bm5lbC5jb25mIGZpbGUgYmVmb3JlIHN0YXJ0aW5nIHVwIHRoZSB0dW5uZWwuIElmIGEKICAgeDExdm5jIGNlcnRpZmljYXRlIGNhbm5vdCBiZSB2ZXJpZmllZCwgc3R1bm5lbCB3aWxsIGRyb3AgdGhlCiAgIGNvbm5lY3Rpb24gKGFuZCBwcmludCBhIGZhaWx1cmUgbWVzc2FnZSBpbiBpdHMgbG9nIGZpbGUpLgoKICAgQSB0aGlyZCBleGFtcGxlLCB1c2luZyB0aGUgVk5DIHZpZXdlciBvbiBVbml4IHdpdGggc3R1bm5lbCB0aGUgd3JhcHBlcgogICBzY3JpcHQgY2FuIGJlIHVzZWQgdGhpcyB3YXk6ICJzc192bmN2aWV3ZXIgLXZlcmlmeSAuL3gxMXZuYy5jcnQKICAgZmFyLWF3YXkuZWFzdDowIiB3aGVyZSAuL3gxMXZuYy5jcnQgaXMgdGhlIGNvcGllZCBjZXJ0aWZpY2F0ZSB4MTF2bmMKICAgcHJpbnRlZCBvdXQuCgogICBBcyBmb3VydGggZXhhbXBsZSwgb3VyIFNTVk5DIGVuaGFuY2VkIHRpZ2h0dm5jIHZpZXdlciBjYW4gYWxzbyB1c2UKICAgdGhlc2UgY2VydGlmaWNhdGUgZmlsZXMgZm9yIHNlcnZlciBhdXRoZW50aWNhdGlvbi4gWW91IGNhbiBsb2FkIHRoZW0KICAgdmlhIHRoZSBTU1ZOQyAnQ2VydHMuLi4nIGRpYWxvZyBhbmQgc2V0ICdTZXJ2ZXJDZXJ0JyB0byB0aGUKICAgY2VydGlmaWNhdGUgZmlsZSB5b3Ugc2FmZWx5IGNvcGllZCB0aGVyZS4KCiAgIE5vdGUgdGhhdCBpbiBwcmluY2lwbGUgdGhlIGNvcHlpbmcgb2YgdGhlIGNlcnRpZmljYXRlIHRvIHRoZSBjbGllbnQKICAgbWFjaGluZShzKSBpdHNlbGYgY291bGQgYmUgYWx0ZXJlZCBieSBhIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFjayEgWW91CiAgIGNhbid0IHdpbjsgaXQgaXMgdmVyeSBkaWZmaWN1bHQgdG8gYmUgY29tcGxldGVseSBzZWN1cmUuIEl0IGlzCiAgIHVubGlrZWx5IHRoZSBhdHRhY2tlciBjb3VsZCBwcmVkaWN0IGhvdyB5b3Ugd2VyZSBnb2luZyB0byBzZW5kIGl0CiAgIHVubGVzcyB5b3UgaGFkLCBzYXksIGRvbmUgaXQgbWFueSB0aW1lcyBiZWZvcmUgdGhlIHNhbWUgd2F5LiBTU0ggaXMgYQogICB2ZXJ5IGdvb2Qgd2F5IHRvIHNlbmQgaXQgKGJ1dCBvZiBjb3Vyc2UgaXQgdG9vIGRlcGVuZHMgb24gcHVibGljIGtleXMKICAgYmVpbmcgc2VudCB1bmFsdGVyZWQgYmV0d2VlbiB0aGUgdHdvIG1hY2hpbmVzISkuCgogICBJZiB5b3UgYXJlIHJlYWxseSBwYXJhbm9pZCwgSSdtIHN1cmUgeW91J2xsIGZpZ3VyZSBvdXQgYSByZWFsbHkgZ29vZAogICB3YXkgdG8gdHJhbnNwb3J0IHRoZSBjZXJ0aWZpY2F0ZXMuIFNlZSB0aGUgQ2VydGlmaWNhdGUgQXV0aG9yaXR5CiAgIHNjaGVtZSBiZWxvdyBmb3IgYSB3YXkgdG8gbWFrZSB0aGlzIGVhc2llciAoeW91IGp1c3QgaGF2ZSB0byBkbyBpdAogICBvbmNlKS4KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFNhdmluZyBTU0wgY2VydGlmaWNhdGVzIGFuZCBrZXlzOgoKICAgTm93LCBpdCB3b3VsZCBiZSB2ZXJ5IGluY29udmVuaWVudCB0byBjb3B5IHRoZSBuZXcgdGVtcG9yYXJ5CiAgIGNlcnRpZmljYXRlIGV2ZXJ5IHRpbWUgeDExdm5jIGlzIHJ1biBpbiBTU0wgbW9kZS4gU28gZm9yIGNvbnZlbmllbmNlCiAgIHRoZXJlIGlzIHRoZSAiU0FWRSIga2V5d29yZCB0byBpbnN0cnVjdCB4MTF2bmMgdG8gc2F2ZSB0aGUgY2VydGlmaWNhdGUKICAgaXQgY3JlYXRlczoKICB4MTF2bmMgLXNzbCBTQVZFIC1kaXNwbGF5IDowIC4uLgoKICAgVGhpcyBiZWhhdmlvciBpcyBub3cgdGhlIGRlZmF1bHQsIHlvdSBtdXN0IHVzZSAiVE1QIiBmb3IgYSB0ZW1wb3JhcnkKICAgb25lLiBJdCB3aWxsIHNhdmUgdGhlIGNlcnRpZmljYXRlIGFuZCBwcml2YXRlIGtleSBpbiB0aGVzZSBmaWxlczoKICB+Ly52bmMvY2VydHMvc2VydmVyLmNydAogIH4vLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtCgogICBUaGUgIi5jcnQiIGZpbGUgY29udGFpbnMgb25seSB0aGUgY2VydGlmaWNhdGUgYW5kIHNob3VsZCBiZSBzYWZlbHkKICAgY29waWVkIHRvIHRoZSBWTkMgVmlld2VyIG1hY2hpbmUocykgdGhhdCB3aWxsIGJlIGF1dGhlbnRpY2F0aW5nIHRoZQogICB4MTF2bmMgc2VydmVyLiBUaGUgIi5wZW0iIGZpbGUgY29udGFpbnMgYm90aCB0aGUgY2VydGlmaWNhdGUgYW5kIHRoZQogICBwcml2YXRlIGtleSBhbmQgc2hvdWxkIGJlIGtlcHQgc2VjcmV0LiAoSWYgeW91IGRvbid0IGxpa2UgdGhlIGRlZmF1bHQKICAgbG9jYXRpb24gfi8udm5jL2NlcnRzLCBlLmcuIGl0IGlzIG9uIGFuIE5GUyBzaGFyZSBhbmQgeW91IGFyZSB3b3JyaWVkCiAgIGFib3V0IGxvY2FsIG5ldHdvcmsgc25pZmZpbmcsIHVzZSB0aGUgLXNzbGRpciBkaXIgb3B0aW9uIHRvIHBvaW50IHRvIGEKICAgZGlmZmVyZW50IGRpcmVjdG9yeS4pCgogICBTbyB0aGUgbmV4dCB0aW1lIHlvdSBydW4gIngxMXZuYyAtc3NsIFNBVkUgLi4uIiBpdCB3aWxsIHJlYWQgdGhlCiAgIHNlcnZlci5wZW0gZmlsZSBkaXJlY3RseSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4KCiAgIFlvdSBjYW4gbWFuYWdlIG11bHRpcGxlIFNTTCB4MTF2bmMgc2VydmVyIGtleXMgaW4gdGhpcyBzaW1wbGUgd2F5IGJ5CiAgIHVzaW5nOgogIHgxMXZuYyAtc3NsIFNBVkUta2V5MiAtZGlzcGxheSA6MCAuLi4KCiAgIGV0Yywgd2hlcmUgeW91IHB1dCB3aGF0ZXZlciBuYW1lIHlvdSBjaG9vc2UgZm9yIHRoZSBrZXkgYWZ0ZXIgIlNBVkUtIi4KICAgRS5nLiAiLXNzbCBTQVZFLWZyZWQiLgoKICAgQWxzbywgaWYgeW91IHdhbnQgdG8gYmUgcHJvbXB0ZWQgdG8gcG9zc2libHkgY2hhbmdlIHRoZSBtYWRlIHVwIG5hbWVzLAogICBldGMuIHRoYXQgeDExdm5jIGNyZWF0ZXMgKGUuZy4gIngxMXZuYy1TRUxGLVNJR05FRC1DRVJULTc3NjIiIGZvciB0aGUKICAgQ29tbW9uTmFtZSkgZm9yIHRoZSBjZXJ0aWZpY2F0ZXMgZGlzdGluZ3Vpc2hlZCBuYW1lIChETiksIHRoZW4gdXNlCiAgICJ4MTF2bmMgLXNzbCBTQVZFX1BST01QVCAuLi4iLCAieDExdm5jIC1zc2wgU0FWRV9QUk9NUFQtZnJlZCAuLi4iIGV0Yy4KICAgd2hlbiB5b3UgY3JlYXRlIHRoZSBrZXkgdGhlIGZpcnN0IHRpbWUuCgogICBUaXA6IHdoZW4gcHJvbXB0aW5nLCBpZiB5b3UgY2hvb3NlIHRoZSBDb21tb25OYW1lIGVudHJ5IHRvIGJlIHRoZSBmdWxsCiAgIGludGVybmV0IGhvc3RuYW1lIG9mIHRoZSBtYWNoaW5lIHRoZSBjbGllbnRzIHdpbGwgYmUgY29ubmVjdGluZyB0bwogICB0aGVuIHRoYXQgd2lsbCBhdm9pZCBhbiBhbm5veWluZyBkaWFsb2cgYm94IGluIHRoZWlyIFdlYiBicm93c2VycyB0aGF0CiAgIHdhcm4gdGhhdCB0aGUgQ29tbW9uTmFtZSBkb2Vzbid0IG1hdGNoIHRoZSBob3N0bmFtZS4KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFBhc3NwaHJhc2VzIGZvciBzZXJ2ZXIga2V5czoKCiAgIFdlbGwsIHNpbmNlIG5vdyB3aXRoIHRoZSAiU0FWRSIga2V5d29yZCB0aGUgY2VydGlmaWNhdGUgYW5kIGtleSB3aWxsCiAgIGJlIGxvbmdlciBsaXZlZCwgb25lIGNhbiBuZXh0IHdvcnJ5IGFib3V0IHNvbWVib2R5IHN0ZWFsaW5nIHRoZQogICBwcml2YXRlIGtleSBhbmQgcHJldGVuZGluZyB0byBiZSB0aGUgeDExdm5jIHNlcnZlciEgSG93IHRvIGd1YXJkCiAgIGFnYWluc3QgdGhpcz8KCiAgIFRoZSBmaXJzdCBpcyB0aGF0IHRoZSBmaWxlIGlzIGNyZWF0ZWQgd2l0aCBwZXJtcyA2MDAgKGkuZS4gLXJ3LS0tLS0tLSkKICAgdG8gbWFrZSBpdCBoYXJkZXIgZm9yIGFuIHVudHJ1c3RlZCB1c2VyIHRvIGNvcHkgdGhlIGZpbGUuIEEgYmV0dGVyIHdheQogICBpcyB0byBhbHNvIGVuY3J5cHQgdGhlIHByaXZhdGUga2V5IHdpdGggYSBwYXNzcGhyYXNlLiBZb3UgYXJlIHByb21wdGVkCiAgIHdoZXRoZXIgeW91IHdhbnQgdG8gZG8gdGhpcyBvciBub3Qgd2hlbiB0aGUga2V5IGlzIGZpcnN0IGNyZWF0ZWQgdW5kZXIKICAgIi1zc2wgU0FWRSIgbW9kZSAoIlByb3RlY3Qga2V5IHdpdGggYSBwYXNzcGhyYXNlPyB5L24iKS4gSXQgaXMKICAgc3VnZ2VzdGVkIHRoYXQgeW91IHVzZSBhIHBhc3NwaHJhc2UuIFRoZSBpbmNvbnZlbmllbmNlIGlzIGV2ZXJ5IHRpbWUKICAgeW91IHJ1biAieDExdm5jIC1zc2wgU0FWRSAuLi4iIHlvdSB3aWxsIG5lZWQgdG8gc3VwcGx5IHRoZSBwYXNzcGhyYXNlCiAgIHRvIGFjY2VzcyB0aGUgcHJpdmF0ZSBrZXk6CiAgMDYvMDQvMjAwNiAxMTozOToxMSB1c2luZyBQRU0gL2hvbWUvcnVuZ2UvLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtICAwLjAwMHMKCiAgQSBwYXNzcGhyYXNlIGlzIG5lZWRlZCB0byB1bmxvY2sgYW4gT3BlblNTTCBwcml2YXRlIGtleSAoUEVNIGZpbGUpLgogIEVudGVyIHBhc3NwaHJhc2U+CgogICBiZWZvcmUgeDExdm5jIGNhbiBjb250aW51ZS4KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIEJlaW5nIHlvdXIgb3duIENlcnRpZmljYXRlIEF1dGhvcml0eToKCiAgIEEgdmVyeSBzb3BoaXN0aWNhdGVkIHdheSB0aGF0IHNjYWxlcyB3ZWxsIGlmIHRoZSBudW1iZXIgb2YgdXNlcnMgaXMKICAgbGFyZ2UgaXMgdG8gdXNlIGEgQ2VydGlmaWNhdGUgQXV0aG9yaXR5IChDQSkgd2hvc2UgcHVibGljIGNlcnRpZmljYXRlCiAgIGlzIGF2YWlsYWJsZSB0byBhbGwgb2YgdGhlIFZOQyBjbGllbnRzIGFuZCB3aG9zZSBwcml2YXRlIGtleSBoYXMgYmVlbgogICB1c2VkIHRvIGRpZ2l0YWxseSBzaWduIHRoZSB4MTF2bmMgc2VydmVyIGNlcnRpZmljYXRlKHMpLgoKICAgVGhlIGlkZWEgaXMgYXMgZm9sbG93czoKICAgICAqIEEgc3BlY2lhbCBDQSBjZXJ0IGFuZCBrZXkgaXMgZ2VuZXJhdGVkLgogICAgICogSXRzIHByaXZhdGUga2V5IGlzIGFsd2F5cyBwcm90ZWN0ZWQgYnkgYSBnb29kIHBhc3NwaHJhc2Ugc2luY2UgaXQKICAgICAgIGlzIG9ubHkgdXNlZCBmb3Igc2lnbmluZy4KICAgICAqIFRoZSBDQSBjZXJ0IGlzIChzYWZlbHkpIGRpc3RyaWJ1dGVkIHRvIGFsbCBtYWNoaW5lcyB3aGVyZSBWTkMKICAgICAgIGNsaWVudHMgd2lsbCBydW4uCiAgICAgKiBPbmUgb3IgbW9yZSB4MTF2bmMgc2VydmVyIGNlcnRzIGFuZCBrZXlzIGFyZSBnZW5lcmF0ZWQuCiAgICAgKiBUaGUgeDExdm5jIHNlcnZlciBjZXJ0IGlzIHNpZ25lZCB3aXRoIHRoZSBDQSBwcml2YXRlIGtleS4KICAgICAqIHgxMXZuYyBpcyBydW4gdXNpbmcgdGhlIHNlcnZlciBrZXkuIChlLmcuICItc3NsIFNBVkUiKQogICAgICogVk5DIGNsaWVudHMgKHZpZXdlcnMpIGNhbiBub3cgYXV0aGVudGljYXRlIHRoZSB4MTF2bmMgc2VydmVyCiAgICAgICBiZWNhdXNlIHRoZXkgaGF2ZSB0aGUgQ0EgY2VydGlmaWNhdGUuCgogICBUaGUgYWR2YW50YWdlIGlzIHRoZSBDQSBjZXJ0IG9ubHkgbmVlZHMgdG8gYmUgZGlzdHJpYnV0ZWQgb25jZSB0byB0aGUKICAgdmFyaW91cyBtYWNoaW5lcywgdGhhdCBjYW4gYmUgZG9uZSBldmVuIGJlZm9yZSB4MTF2bmMgc2VydmVyIGNlcnRzIGFyZQogICBnZW5lcmF0ZWQuCgogICBBcyBhYm92ZSwgaXQgaXMgaW1wb3J0YW50IHRoZSBDQSBwcml2YXRlIGtleSBhbmQgdGhlIHgxMXZuYyBzZXJ2ZXIga2V5CiAgIGFyZSBrZXB0IHNlY3JldCwgb3RoZXJ3aXNlIHNvbWVvbmUgY291bGQgc3RlYWwgdGhlbSBhbmQgcHJldGVuZCB0byBiZQogICB0aGUgQ0Egb3IgdGhlIHgxMXZuYyBzZXJ2ZXIgaWYgdGhleSBjb3BpZWQgdGhlIGtleS4gSXQgaXMgcmVjb21tZW5kZWQKICAgdGhhdCB0aGUgeDExdm5jIHNlcnZlciBrZXlzIGFyZSBhbHNvIHByb3RlY3RlZCB2aWEgYSBwYXNzcGhyYXNlIChzZWUKICAgdGhlIHByZXZpb3VzIHNlY3Rpb24pLgoKICAgT3B0aW9uYWxseSwgVk5DIHZpZXdlciBjZXJ0cyBhbmQga2V5cyBjb3VsZCBhbHNvIGJlIGdlbmVyYXRlZCB0bwogICBlbmFibGUgdGhlIHgxMXZuYyBzZXJ2ZXIgdG8gYXV0aGVudGljYXRlIGVhY2ggY2xpZW50LiBUaGlzIGlzIG5vdAogICBub3JtYWxseSBkb25lICh1c3VhbGx5IGEgc2ltcGxlIHZpZXdlciBwYXNzd29yZCBzY2hlbWUgaXMgdXNlZCksIGJ1dAogICB0aGlzIGNhbiBiZSB1c2VmdWwgaW4gc29tZSBzaXR1YXRpb25zLiBUaGVzZSBvcHRpb25hbCBzdGVwcyBnbyBsaWtlCiAgIHRoaXM6CiAgICAgKiBPbmUgb3IgbW9yZSBWTkMgY2xpZW50IGNlcnRzIGFuZCBrZXlzIGFyZSBnZW5lcmF0ZWQuCiAgICAgKiBUaGVzZSBWTkMgY2xpZW50IGNlcnRzIGFyZSBzaWduZWQgd2l0aCB0aGUgQ0EgcHJpdmF0ZSBrZXkuCiAgICAgKiBUaGUgVk5DIGNsaWVudCBjZXJ0cytrZXlzIGFyZSBzYWZlbHkgZGlzdHJpYnV0ZWQgdG8gdGhlCiAgICAgICBjb3JyZXNwb25kaW5nIGNsaWVudCBtYWNoaW5lcy4KICAgICAqIHgxMXZuYyBpcyB0b2xkIHRvIHZlcmlmeSBjbGllbnRzIGJ5IHVzaW5nIHRoZSBDQSBjZXJ0LiAoZS5nLgogICAgICAgIi1zc2x2ZXJpZnkgQ0EiKQogICAgICogV2hlbiBWTkMgY2xpZW50cyAodmlld2VycykgY29ubmVjdCwgdGhleSBtdXN0IGF1dGhlbnRpY2F0ZQogICAgICAgdGhlbXNlbHZlcyB0byB4MTF2bmMgYnkgdXNpbmcgdGhlaXIgY2xpZW50IGtleS4KCiAgIEFnYWluLCBpdCBpcyBhIGdvb2QgaWRlYSBpZiB0aGUgY2xpZW50IHByaXZhdGUga2V5cyBhcmUgcHJvdGVjdGVkIHdpdGgKICAgYSBwYXNzcGhyYXNlLCBvdGhlcndpc2UgaWYgc3RvbGVuIHRoZXkgY291bGQgYmUgdXNlZCB0byBnYWluIGFjY2VzcyB0bwogICB0aGUgeDExdm5jIHNlcnZlci4gT25jZSBkaXN0cmlidXRlZCB0byB0aGUgY2xpZW50IG1hY2hpbmVzLCB0aGVyZSBpcwogICBubyBuZWVkIHRvIGtlZXAgdGhlIGNsaWVudCBrZXkgb24gdGhlIENBIG1hY2hpbmUgdGhhdCBnZW5lcmF0ZWQgYW5kCiAgIHNpZ25lZCBpdC4gWW91IGNhbiBrZWVwIHRoZSBjbGllbnQgY2VydHMgaWYgeW91IGxpa2UgYmVjYXVzZSB0aGV5IGFyZQogICBwdWJsaWMuCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBIb3cgdG8gZG8gdGhlIGFib3ZlIENBIHN0ZXBzIHdpdGggeDExdm5jOgoKICAgU29tZSB1dGlsaXR5IGNvbW1hbmRzIGFyZSBwcm92aWRlZCB0byBlYXNlIHRoZSBjZXJ0K2tleSBjcmVhdGlvbiwKICAgc2lnbmluZywgYW5kIG1hbmFnZW1lbnQ6IC1zc2xHZW5DQSwgLXNzbEdlbkNlcnQsIC1zc2xEZWxDZXJ0LAogICAtc3NsRW5jS2V5LCAtc3NsQ2VydEluZm8uIFRoZXkgYmFzaWNhbGx5IHJ1biB0aGUgb3BlbnNzbCgxKSBjb21tYW5kCiAgIGZvciB5b3UgdG8gbWFuYWdlIHRoZSBjZXJ0cy9rZXlzLiBJdCBpcyByZXF1aXJlZCB0aGF0IG9wZW5zc2woMSkgaXMKICAgaW5zdGFsbGVkIG9uIHRoZSBtYWNoaW5lIGFuZCBhdmFpbGFibGUgaW4gUEFUSC4gQWxsIGNvbW1hbmRzIGNhbiBiZQogICBwb2ludGVkIHRvIGFuIGFsdGVybmF0ZSB0b3BsZXZlbCBjZXJ0aWZpY2F0ZSBkaXJlY3RvcnkgdmlhIHRoZSAtc3NsZGlyCiAgIG9wdGlvbiBpZiB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgdGhlIGRlZmF1bHQgfi8udm5jL2NlcnRzLgoKICAgMSkgVG8gZ2VuZXJhdGUgeW91ciBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKSBjZXJ0IGFuZCBrZXkgcnVuIHRoaXM6CiAgeDExdm5jIC1zc2xHZW5DQQoKICAgRm9sbG93IHRoZSBwcm9tcHRzLCB5b3UgY2FuIG1vZGlmeSBhbnkgaW5mb3JtYXRpb25hbCBzdHJpbmdzIHlvdSBjYXJlCiAgIHRvLiBZb3Ugd2lsbCBhbHNvIGJlIHJlcXVpcmVkIHRvIGVuY3J5cHQgdGhlIENBIHByaXZhdGUga2V5IHdpdGggYQogICBwYXNzcGhyYXNlLiBUaGlzIGdlbmVyYXRlcyB0aGVzZSBmaWxlczoKICB+Ly52bmMvY2VydHMvQ0EvY2FjZXJ0LnBlbSAgICAgICAgICAgICAodGhlIENBIHB1YmxpYyBjZXJ0aWZpY2F0ZSkKICB+Ly52bmMvY2VydHMvQ0EvcHJpdmF0ZS9jYWtleS5wZW0gICAgICAodGhlIGVuY3J5cHRlZCBDQSBwcml2YXRlIGtleSkKCiAgIElmIHlvdSB3YW50IHRvIHVzZSBhIGRpZmZlcmVudCBkaXJlY3RvcnkgdXNlIC1zc2xkaXIgSXQgbXVzdCBzdXBwbGllZAogICB3aXRoIGFsbCBzdWJzZXF1ZW50IFNTTCB1dGlsaXR5IG9wdGlvbnMgdG8gcG9pbnQgdGhlbSB0byB0aGUgY29ycmVjdAogICBkaXJlY3RvcnkuCgogICAyKSBUbyBnZW5lcmF0ZSBhIHNpZ25lZCB4MTF2bmMgc2VydmVyIGNlcnQgYW5kIGtleSBydW4gdGhpczoKICB4MTF2bmMgLXNzbEdlbkNlcnQgc2VydmVyCgogICBBcyB3aXRoIHRoZSBDQSBnZW5lcmF0aW9uLCBmb2xsb3cgdGhlIHByb21wdHMgYW5kIHlvdSBjYW4gbW9kaWZ5IGFueQogICBpbmZvcm1hdGlvbmFsIHN0cmluZ3MgdGhhdCB5b3UgY2FyZSB0by4gVGhpcyB3aWxsIGNyZWF0ZSB0aGUgZmlsZXM6CiAgfi8udm5jL2NlcnRzL3NlcnZlci5jcnQgICAgICAgICAgICAgKHRoZSBzZXJ2ZXIgcHVibGljIGNlcnRpZmljYXRlKQogIH4vLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtICAgICAgICAgICAgICh0aGUgc2VydmVyIHByaXZhdGUga2V5ICsgcHVibGljIGNlcnQpCgogICBJdCBpcyByZWNvbW1lbmRlZCB0byBwcm90ZWN0IHRoZSBzZXJ2ZXIgcHJpdmF0ZSBrZXkgd2l0aCBhIHBhc3NwaHJhc2UKICAgKHlvdSB3aWxsIGJlIHByb21wdGVkIHdoZXRoZXIgeW91IHdhbnQgdG8pLiBZb3Ugd2lsbCBuZWVkIHRvIHByb3ZpZGUKICAgaXQgd2hlbmV2ZXIgeW91IHN0YXJ0IHgxMXZuYyB1c2luZyB0aGlzIGtleS4KCiAgIDMpIFN0YXJ0IHVwIHgxMXZuYyB1c2luZyB0aGlzIHNlcnZlciBrZXk6CiAgeDExdm5jIC1zc2wgU0FWRSAtZGlzcGxheSA6MCAuLi4KCiAgIChTQVZFIGNvcnJlc3BvbmRzIHRvIHNlcnZlci5wZW0sIHNlZSAtc3NsR2VuQ2VydCBzZXJ2ZXIgc29tZW5hbWUgaW5mbwogICBvbiBjcmVhdGluZyBhZGRpdGlvbmFsIHNlcnZlciBrZXlzLCBzZXJ2ZXItc29tZW5hbWUuY3J0IC4uLikKCiAgIDQpIE5leHQsIHNhZmVseSBjb3B5IHRoZSBDQSBjZXJ0aWZpY2F0ZSB0byB0aGUgVk5DIHZpZXdlciAoY2xpZW50KQogICBtYWNoaW5lKHMpLiBQZXJoYXBzOgogIHNjcCB+Ly52bmMvQ0EvY2FjZXJ0LnBlbSBjbGllbnRtYWNoaW5lOi4KCiAgIDUpIFRoZW4gdGhlIHRyaWNreSBwYXJ0LCBtYWtlIGl0IHNvIHRoZSBTU0wgVk5DIFZpZXdlciB1c2VzIHRoaXMKICAgY2VydGlmaWNhdGUhIFRoZXJlIGFyZSBhIG51bWJlciBvZiB3YXlzIHRoaXMgbWlnaHQgYmUgZG9uZSwgaXQgZGVwZW5kcwogICBvbiB3aGF0IHlvdXIgY2xpZW50IGFuZC9vciBTU0wgdHVubmVsIGlzLiBTb21lIGV4YW1wbGVzOgoKICAgRm9yIHRoZSBTU0wgSmF2YSBWTkMgdmlld2VyIHN1cHBsaWVkIHdpdGggeDExdm5jIGluCiAgIGNsYXNzZXMvc3NsL1ZuY1ZpZXdlci5qYXIgb3IgY2xhc3Nlcy9zc2wvU2lnbmVkVm5jVmlld2VyLmphcjoKICAgICAqIEltcG9ydCB0aGUgY2FjZXJ0LnBlbSBjZXJ0IGludG8geW91ciBXZWIgQnJvd3NlciAoZS5nLiBFZGl0IC0+CiAgICAgICBQcmVmZXJlbmNlcyAtPiBQcml2YWN5ICYgU2VjdXJpdHkgLT4gTWFuYWdlIENlcnRpZmljYXRlcyAtPgogICAgICAgV2ViU2l0ZXMgLT4gSW1wb3J0KQogICAgICogT3IgSW1wb3J0IHRoZSBjYWNlcnQucGVtIGNlcnQgaW50byB5b3VyIEphdmEgUGx1Z2luIChlLmcuIHJ1bgogICAgICAgQ29udHJvbFBhbmVsLCB0aGVuIFNlY3VyaXR5IC0+IENlcnRpZmljYXRlcyAtPiBTZWN1cmUgU2l0ZSAtPgogICAgICAgSW1wb3J0KQoKICAgV2hlbiBpbXBvcnRpbmcsIG9uZSB3b3VsZCBnaXZlIHRoZSBicm93c2VyL2phdmEtcGx1Z2luIHRoZSBwYXRoIHRvIHRoZQogICBjb3BpZWQgY2FjZXJ0LnBlbSBmaWxlIGluIHNvbWUgZGlhbG9nLiBOb3RlIHRoYXQgdGhlIFdlYiBicm93c2VyIG9yCiAgIEphdmEgcGx1Z2luIGlzIHVzZWQgZm9yIHRoZSBzZXJ2ZXIgYXV0aGVudGljYXRpb24uIElmIHRoZSB1c2VyIGdldHMgYQogICAiU2l0ZSBub3QgdmVyaWZpZWQiIG1lc3NhZ2Ugd2hpbGUgY29ubmVjdGluZyBoZSBzaG91bGQgaW52ZXN0aWdhdGUKICAgZnVydGhlci4KCiAgIEZvciB0aGUgdXNlIG9mIHN0dW5uZWwgKGUuZy4gb24gV2luZG93cykgb25lIHdvdWxkIGFkZCB0aGlzIHRvIHRoZQogICBzdHVubmVsLmNvbmY6CiAgIyBzdHVubmVsLmNvbmY6CiAgY2xpZW50ID0geWVzCiAgb3B0aW9ucyA9IEFMTAogIENBZmlsZSA9IC9wYXRoL3RvL2NhY2VydC5wZW0gICAgICAgICAgIyBvciBtYXliZSBDOlxwYXRoXHRvXGNhY2VydC5wZW0KICBbbXl2bmNzc2xdCiAgYWNjZXB0ID0gNTkwMQogIGNvbm5lY3QgPSBmYXItYXdheS5lYXN0OjU5MDAKCiAgICh0aGVuIHBvaW50IHRoZSBWTkMgdmlld2VyIHRvIGxvY2FsaG9zdDoxKS4KCiAgIEhlcmUgaXMgYW4gZXhhbXBsZSBmb3IgdGhlIFVuaXggc3R1bm5lbCB3cmFwcGVyIHNjcmlwdCBzc192bmN2aWV3ZXIgaW4KICAgb3VyIFNTVk5DIHBhY2thZ2U6CiAgc3Nfdm5jdmlld2VyIC12ZXJpZnkgLi9jYWNlcnQucGVtIGZhci1hd2F5LmVhc3Q6MAoKICAgT3VyIFNTVk5DIGVuaGFuY2VkIHRpZ2h0dm5jIHZpZXdlciBHVUkgY2FuIGFsc28gdXNlIHRoZSBjZXJ0aWZpY2F0ZQogICBmaWxlIGZvciBzZXJ2ZXIgYXV0aGVudGljYXRpb24uIFlvdSBjYW4gbG9hZCBpdCB2aWEgdGhlIFNTVk5DCiAgICdDZXJ0cy4uLicgZGlhbG9nIGFuZCBzZXQgJ1NlcnZlckNlcnQnIHRvIHRoZSBjYWNlcnQucGVtIGZpbGUgeW91CiAgIHNhZmVseSBjb3BpZWQgdGhlcmUuCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBUcmlja3MgZm9yIHNlcnZlciBrZXlzOgoKICAgVG8gY3JlYXRlIGFkZGl0aW9uYWwgeDExdm5jIHNlcnZlciBrZXlzIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6CiAgeDExdm5jIC1zc2xHZW5DZXJ0IHNlcnZlciBteW90aGVya2V5CgogICBhbmQgdXNlIGl0IHRoaXMgd2F5OgogIHgxMXZuYyAtc3NsIFNBVkUtbXlvdGhlcmtleSAuLi4KCiAgIFRoZSBmaWxlcyB3aWxsIGJlIH4vLnZuYy9jZXJ0cy9zZXJ2ZXItbXlvdGhlcmtleS57Y3J0LHBlbX0KCiAgIFlvdSBjYW4gYWxzbyBjcmVhdGUgYSBzZWxmLXNpZ25lZCBzZXJ2ZXIga2V5OgogIHgxMXZuYyAtc3NsR2VuQ2VydCBzZXJ2ZXIgc2VsZjp0aGlyZF9rZXkKCiAgIGFuZCB1c2UgaXQgdGhpcyB3YXk6CiAgeDExdm5jIC1zc2wgU0FWRS1zZWxmOnRoaXJkX2tleSAuLi4KCiAgIFRoaXMga2V5IGlzIG5vdCBzaWduZWQgYnkgeW91ciBDQS4gVGhpcyBjYW4gYmUgaGFuZHkgdG8gaGF2ZSBhIGtleSBzZXQKICAgc2VwYXJhdGUgZnJvbSB5b3VyIENBIHdoZW4geW91IGRvIG5vdCB3YW50IHRvIGNyZWF0ZSBhIDJuZCBDQQogICBjZXJ0K2tleS4KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFVzaW5nIGV4dGVybmFsIENBJ3M6CgogICBZb3UgZG9uJ3QgaGF2ZSB0byB1c2UgeW91ciBvd24gQ0EgY2VydCtrZXksIHlvdSBjYW4gdXNlIGEgdGhpcmQKICAgcGFydHkncyBpbnN0ZWFkLiBQZXJoYXBzIHlvdSBoYXZlIGEgY29tcGFueS13aWRlIENBIG9yIHlvdSBjYW4gZXZlbgogICBoYXZlIHlvdXIgeDExdm5jIGNlcnRpZmljYXRlIHNpZ25lZCBieSBhIHByb2Zlc3Npb25hbCBDQSAoZS5nLgogICB3d3cudGhhd3RlLmNvbSBvciB3d3cudmVyaXNpZ24uY29tIG9yIHBlcmhhcHMgdGhlIGZyZWUgY2VydGlmaWNhdGUKICAgc2VydmljZSB3d3cuc3RhcnRjb20ub3JnIG9yIHd3dy5jYWNlcnQub3JnKS4KCiAgIFRoZSBhZHZhbnRhZ2UgdG8gZG9pbmcgdGhpcyBpcyB0aGF0IHRoZSBWTkMgY2xpZW50IG1hY2hpbmVzIHdpbGwKICAgYWxyZWFkeSBoYXZlIHRoZSBDQSBjZXJ0aWZpY2F0ZXMgaW5zdGFsbGVkIGFuZCB5b3UgZG9uJ3QgaGF2ZSB0bwogICBpbnN0YWxsIGl0IG9uIGVhY2ggbWFjaGluZS4KCiAgIFRvIGdlbmVyYXRlIGFuIHgxMXZuYyBzZXJ2ZXIgY2VydCtrZXkgdGhpcyB3YXkgeW91IHNob3VsZCBnZW5lcmF0ZSBhCiAgICJyZXF1ZXN0IiBmb3IgYSBjZXJ0aWNhdGUgc2lnbmluZyBzb21ldGhpbmcgbGlrZSB0aGlzICh3ZSB1c2UgdGhlIG5hbWUKICAgImV4dGVybmFsIiBpbiB0aGlzIGV4YW1wbGUsIGl0IGNvdWxkIGJlIGFueXRoaW5nIHlvdSB3YW50KToKICB4MTF2bmMgLXNzbEdlbkNlcnQgc2VydmVyIHJlcTpleHRlcm5hbAoKICAgVGhpcyB3aWxsIGNyZWF0ZSB0aGUgcmVxdWVzdCBmaWxlOgogIH4vLnZuYy9jZXJ0cy9zZXJ2ZXItcmVxOmV4dGVybmFsLnJlcQoKICAgV2hpY2ggeW91IHNob3VsZCBzZW5kIHRvIHRoZSBleHRlcm5hbCBDQS4gV2hlbiB5b3UgZ2V0IHRoZSBzaWduZWQKICAgY2VydGlmaWNhdGUgYmFjayBmcm9tIHRoZW0sIHNhdmUgaXQgaW4gdGhlIGZpbGU6CiAgfi8udm5jL2NlcnRzL3NlcnZlci1yZXE6ZXh0ZXJuYWwuY3J0CgogICBhbmQgY3JlYXRlIHRoZSAucGVtIHRoaXMgd2F5OgogIG12ICB+Ly52bmMvY2VydHMvc2VydmVyLXJlcTpleHRlcm5hbC5rZXkgICAgfi8udm5jL2NlcnRzL3NlcnZlci1yZXE6ZXh0ZXJuYWwuCnBlbQogIGNobW9kIDYwMCB+Ly52bmMvY2VydHMvc2VydmVyLXJlcTpleHRlcm5hbC5wZW0KICBjYXQgfi8udm5jL2NlcnRzL3NlcnZlci1yZXE6ZXh0ZXJuYWwuY3J0ID4+IH4vLnZuYy9jZXJ0cy9zZXJ2ZXItcmVxOmV4dGVybmFsLgpwZW0KCiAgIFlvdSBhbHNvIHJlbmFtZSB0aGUgdHdvIGZpbGVzICguY3J0IGFuZCAucGVtKSB0byBoYXZlIGEgc2hvcnRlcgogICBiYXNlbmFtZSBpZiB5b3UgbGlrZS4gRS5nLjoKICBtdiAgfi8udm5jL2NlcnRzL3NlcnZlci1yZXE6ZXh0ZXJuYWwucGVtICB+Ly52bmMvY2VydHMvc2VydmVyLWV4dC5wZW0KICBtdiAgfi8udm5jL2NlcnRzL3NlcnZlci1yZXE6ZXh0ZXJuYWwuY3J0ICB+Ly52bmMvY2VydHMvc2VydmVyLWV4dC5jcnQKCiAgIGFuZCB0aGUgdXNlIHZpYSAieDExdm5jIC1zc2wgU0FWRS1leHQgLi4uIiwgZXRjLgoKICAgT24gdGhlIHZpZXdlciBzaWRlIG1ha2Ugc3VyZSB0aGUgZXh0ZXJuYWwgQ0EncyBjZXJ0aWZpY2F0ZSBpcwogICBpbnN0YWxsZWQgYW4gYXZhaWxhYmxlIGZvciB0aGUgVk5DIHZpZXdlciBzb2Z0d2FyZSB5b3UgcGxhbiB0byB1c2UuCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBVc2luZyBDbGllbnQgS2V5cyBmb3IgQXV0aGVudGljYXRpb246CgogICBZb3UgY2FuIG9wdGlvbmFsbHkgY3JlYXRlIGNlcnRzK2tleXMgZm9yIHlvdXIgVk5DIGNsaWVudCBtYWNoaW5lcyBhcwogICB3ZWxsLiBBZnRlciBkaXN0cmlidXRpbmcgdGhlbSB0byB0aGUgY2xpZW50IG1hY2hpbmVzIHlvdSBjYW4gaGF2ZQogICB4MTF2bmMgdmVyaWZ5IHRoZSBjbGllbnRzIHVzaW5nIFNTTC4gSGVyZSBpcyBob3cgdG8gZG8gdGhpczoKCiAgeDExdm5jIC1zc2xHZW5DZXJ0IGNsaWVudCBkaWxiZXJ0CiAgeDExdm5jIC1zc2xHZW5DZXJ0IGNsaWVudCB3YWxseQogIHgxMXZuYyAtc3NsR2VuQ2VydCBjbGllbnQgYWxpY2UKICAuLi4KCiAgIEFzIHVzdWFsLCBmb2xsb3cgdGhlIHByb21wdHMgaWYgeW91IHdhbnQgdG8gY2hhbmdlIGFueSBvZiB0aGUgaW5mbwogICBmaWVsZCB2YWx1ZXMuIEFzIGFsd2F5cywgaXQgaXMgYSBnb29kIGlkZWEgKGFsdGhvdWdoIGluY29udmVuaWVudCkgdG8KICAgcHJvdGVjdCB0aGUgcHJpdmF0ZSBrZXlzIHdpdGggYSBwYXNzcGhyYXNlLiBUaGVzZSBmaWxlcyBhcmUgY3JlYXRlZDoKICB+Ly52bmMvY2VydHMvY2xpZW50cy9kaWxiZXJ0LmNydAogIH4vLnZuYy9jZXJ0cy9jbGllbnRzL2RpbGJlcnQucGVtCiAgLi4uCgogICBOb3RlIHRoYXQgdGhlc2UgYXJlIGtlcHQgaW4gYSBjbGllbnRzIHN1YmRpcmVjdG9yeS4KCiAgIE5leHQsIHNhZmVseSBjb3B5IHRoZSAucGVtIGZpbGVzIHRvIGVhY2ggY29ycmVzcG9uZGluZyBjbGllbnQgbWFjaGluZQogICBhbmQgaW5jb3Jwb3JhdGUgdGhlbSBpbnRvIHRoZSBWTkMgdmlld2VyIC8gU1NMIHNvZnR3YXJlIChzZWUgdGhlIGlkZWFzCiAgIG1lbnRpb25lZCBhYm92ZSBmb3IgdGhlIENBIGFuZCBzZXJ2ZXIga2V5cykuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMKICAgdGhlc2UgY2VydGlmaWNhdGVzIG1pZ2h0IGJlIHJlZmVycmVkIHRvIGFzICJNeSBDZXJ0aWZpY2F0ZXMiIG9yCiAgICJDbGllbnQgQ2VydGlmaWNhdGVzIi4gVGhleSBhcmUgdXNlZCBmb3IgY2xpZW50IGF1dGhlbnRpY2F0aW9uICh3aGljaAogICBpcyByZWxhdGl2ZWx5IHJhcmUgZm9yIFNTTCkuCgogICBBZnRlciBjb3B5aW5nIHRoZW0geW91IGNhbiBkZWxldGUgdGhlIGNsaWVudHMvKi5wZW0gZmlsZXMgZm9yIGV4dHJhCiAgIHNhZmV0eSBiZWNhdXNlIHRoZSBwcml2YXRlIGtleXMgYXJlIG5vdCBuZWVkZWQgYnkgdGhlIHgxMXZuYyBzZXJ2ZXIuCiAgIFlvdSBkb24ndCByZWFsbHkgbmVlZCB0aGUgY2xpZW50cy8qLmNydCBmaWxlcyBlaXRoZXIgKGJlY2F1c2UgdGhleQogICBoYXZlIGJlZW4gc2lnbmVkIGJ5IHRoZSBDQSkuIEJ1dCB0aGV5IGNvdWxkIGNvbWUgaW4gaGFuZHkgZm9yIHRyYWNraW5nCiAgIG9yIHRyb3VibGVzaG9vdGluZywgZXRjLgoKICAgTm93IHN0YXJ0IHVwIHgxMXZuYyBhbmQgaW5zdHJ1Y3QgaXQgdG8gdmVyaWZ5IGNvbm5lY3RpbmcgY2xpZW50cyB2aWEKICAgU1NMIGFuZCB0aGUgQ0EgY2VydDoKICB4MTF2bmMgLXNzbCBTQVZFIC1zc2x2ZXJpZnkgQ0EKCiAgIFRoZSAiQ0EiIHNwZWNpYWwgdG9rZW4gaW5zdHJ1Y3RzIHgxMXZuYyB0byB1c2UgaXRzIENBIHNpZ25lZCBjZXJ0cyBmb3IKICAgdmVyaWZpY2F0aW9uLgoKICAgRm9yIGFyYml0cmFyeSBzZWxmLXNpZ25lZCBjbGllbnQgY2VydGlmaWNhdGVzIChubyBDQSkgaXQgbWlnaHQgYmUKICAgc29tZXRoaW5nIGxpa2UgdGhpczoKICB4MTF2bmMgLXNzbCBTQVZFIC1zc2x2ZXJpZnkgcGF0aC90by9jbGllbnQuY3J0CiAgeDExdm5jIC1zc2wgU0FWRSAtc3NsdmVyaWZ5IHBhdGgvdG8vY2xpZW50LWhhc2gtZGlyCiAgeDExdm5jIC1zc2wgU0FWRSAtc3NsdmVyaWZ5IHBhdGgvdG8vY2VydHMudHh0CgogICBXaGVyZSBjbGllbnQuY3J0IHdvdWxkIGJlIGFuIGluZGl2aWR1YWwgY2xpZW50IGNlcnRpZmljYXRlOwogICBjbGllbnQtaGFzaC1kaXIgYSBkaXJlY3Rvcnkgb2YgZmlsZSBuYW1lcyBiYXNlZCBvbiBtZDUgaGFzaGVzIG9mIHRoZQogICBjZXJ0cyAoc2VlIC1zc2x2ZXJpZnkpOyBhbmQgY2VydHMudHh0IHNpZ25pZmllcyBhIHNpbmdsZSBmaWxlIGZ1bGwgb2YKICAgY2xpZW50IGNlcnRpZmljYXRlcy4KCiAgIEZpbmFsbHksIGNvbm5lY3Qgd2l0aCB5b3VyIFZOQyB2aWV3ZXIgdXNpbmcgdGhlIGtleS4gSGVyZSBpcyBhbgogICBleGFtcGxlIGZvciB0aGUgVW5peCBzdHVubmVsIHdyYXBwZXIgc2NyaXB0IHNzX3ZuY3ZpZXdlcjogdXNpbmcgY2xpZW50CiAgIGF1dGhlbnRpY2F0aW9uIChhbmQgdGhlIHN0YW5kYXJkIHNlcnZlciBhdXRoZW50aWNhdGlvbiB3aXRoIHRoZSBDQQogICBjZXJ0KToKICBzc192bmN2aWV3ZXIgLW15Y2VydCAuL2RpbGJlcnQucGVtIC12ZXJpZnkgLi9jYWNlcnQucGVtIGZhci1hd2F5LmVhc3Q6MAoKICAgT3VyIFNTVk5DIGVuaGFuY2VkIHRpZ2h0dm5jIHZpZXdlciBjYW4gYWxzbyB1c2UgdGhlc2Ugb3BlbnNzbCAucGVtCiAgIGZpbGVzICh5b3UgY2FuIGxvYWQgdGhlbSB2aWEgQ2VydHMuLi4gLT4gTXlDZXJ0IGRpYWxvZykuCgogICBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHVzZSAtc3NsdmVyaWZ5IG9uIGEgcGVyLWNsaWVudCBrZXkgYmFzaXMsIGFuZAogICBhbHNvIHVzaW5nIHNlbGYtc2lnbmVkIGNsaWVudCBrZXlzICh4MTF2bmMgLXNzbEdlbkNlcnQgY2xpZW50CiAgIHNlbGY6ZGlsYmVydCkKCiAgIE5vdyBhIHRyaWNreSBwYXJ0IGlzIHRvIGdldCBXZWIgYnJvd3NlcnMgb3IgSmF2YSBSdW50aW1lIHRvIGltcG9ydCBhbmQKICAgdXNlIHRoZSBvcGVuc3NsIC5wZW0gY2VydCtrZXkgZmlsZXMuIFNlZSB0aGUgbmV4dCBwYXJhZ3JhcGggb24gaG93IHRvCiAgIGNvbnZlcnQgdGhlbSB0byBwa2NzMTIgZm9ybWF0LiBJZiB5b3UgZmluZCBhIHJvYnVzdCB3YXkgdG8gaW1wb3J0IHRoZW0KICAgYW5kIGFuZCBnZXQgdGhlbSB0byB1c2UgdGhlIGNlcnQgcGxlYXNlIGxldCB1cyBrbm93IQoKICAgSGVyZSBpcyBob3cgdG8gY29udmVydCBvdXIgb3BlbnNzbCBjcnQvcGVtIGZpbGVzIHRvIHBrY3MxMiBmb3JtYXQKICAgKGNvbnRhaW5zIGJvdGggdGhlIGNsaWVudCBjZXJ0aWZpY2F0ZSBhbmQga2V5KSB0aGF0IGNhbiBiZSByZWFkIGJ5IFdlYgogICBicm93c2VycyBhbmQgSmF2YSBmb3IgdXNlIGluIGNsaWVudCBhdXRoZW50aWNhdGlvbjoKICBvcGVuc3NsIHBrY3MxMiAtZXhwb3J0IC1pbiBteWNlcnQuY3J0IC1pbmtleSBteWNlcnQucGVtIC1vdXQgbXljZXJ0LnAxMgoKICAgaXQgd2lsbCBhc2sgZm9yIGEgcGFzc3BocmFzZSB0byBwcm90ZWN0IG15Y2VydC5wMTIuIFNvbWUgc29mdHdhcmUKICAgKGUuZy4gSmF2YSBDb250cm9sUGFuZWwpIG1heSByZXF1aXJlIGEgbm9uLWVtcHR5IHBhc3NwaHJhc2UuIEFjdHVhbGx5LAogICBzaW5jZSBvdXIgLnBlbSBjb250YWlucyBib3RoIHRoZSBjZXJ0aWZpY2F0ZSBhbmQgcHJpdmF0ZSBrZXksIHlvdQogICBjb3VsZCBqdXN0IHN1cHBseSBpdCBmb3IgdGhlIC1pbiBhbmQgcmVtb3ZlIHRoZSAtaW5rZXkgb3B0aW9uLiBJdAogICBhcHBlYXJzIHRoYXQgZm9yIGNlcnRpZmljYXRlcyBvbmx5IGltcG9ydGluZywgb3VyIC5jcnQgZmlsZSBpcwogICBzdWZmaWNpZW50IGFuZCBjYW4gYmUgcmVhZCBieSBNb3ppbGxhL0ZpcmVmb3ggYW5kIEphdmEuLi4KCiAgIElmIHlvdSBoYXZlIHRyb3VibGUgZ2V0dGluZyB5b3VyIEphdmEgUnVudGltZSB0byBpbXBvcnQgYW5kIHVzZSB0aGUKICAgY2VydCtrZXksIHRoZXJlIGlzIGEgd29ya2Fyb3VuZCBmb3IgdGhlIFNTTC1lbmFibGVkIEphdmEgYXBwbGV0LiBPbgogICB0aGUgV2ViIGJyb3dzZXIgVVJMIHRoYXQgcmV0cmlldmVzIHRoZSBWTkMgYXBwbGV0LCBzaW1wbHkgYWRkIGEKICAgIi8/b25lVGltZUtleT0uLi4iIGFwcGxldCBwYXJhbWV0ZXIgKHNlZSBzc2wtcG9ydGFsIGZvciBtb3JlIGRldGFpbHMKICAgb24gYXBwbGV0IHBhcmFtZXRlcnM7IHlvdSBkb24ndCBuZWVkIHRvIGRvIHRoZSBmdWxsIHBvcnRhbCBzZXR1cAogICB0aG91Z2gpLiBUaGUgdmFsdWUgb2YgdGhlIG9uZVRpbWVLZXkgd2lsbCBiZSB0aGUgdmVyeSBsb25nIHN0cmluZyB0aGF0CiAgIGlzIG91dHB1dCBvZiB0aGUgb25ldGltZWtleSBwcm9ncmFtIGZvdW5kIGluIHRoZSBjbGFzc2VzL3NzbCB4MTF2bmMKICAgZGlyZWN0b3J5LiBPciB5b3UgY2FuIHNldCBvbmVUaW1lS2V5PVBST01QVCBpbiB3aGljaCBjYXNlIHRoZSBhcHBsZXQKICAgd2lsbCBhc2sgeW91IHRvIHBhc3RlIGluIHRoZSBsb25nIHN0cmluZy4gVGhlc2Ugc2NoZW1lIGlzIHByZXR0eSB1Z2x5LAogICBidXQgaXQgd29ya3MuIEEgbmljZSBhcHBsaWNhdGlvbiBvZiBpdCBpcyB0byBtYWtlIG9uZSB0aW1lIGtleXMgZm9yCiAgIHVzZXJzIHRoYXQgaGF2ZSBhbHJlYWR5IGxvZ2dlZCBpbnRvIGEgc2VjdXJlIEhUVFBTIHNpdGUgdmlhIHBhc3N3b3JkLgogICBBIGNnaSBwcm9ncmFtIHRoZW4gbWFrZXMgYSBvbmUgdGltZSBrZXkgZm9yIHRoZSBsb2dnZWQgaW4gdXNlciB0byB1c2U6CiAgIGl0IGlzIHBhc3NlZCBiYWNrIG92ZXIgSFRUUFMgYXMgdGhlIGFwcGxldCBwYXJhbWV0ZXIgaW4gdGhlIFVSTCBhbmQgc28KICAgY2Fubm90IGJlIHNuaWZmZWQuIHgxMXZuYyBpcyBydW4gdG8gdXNlIHRoYXQga2V5IHZpYSAtc3NsdmVyaWZ5LgoKICAgVXBkYXRlOiBhcyBvZiBBcHIgMjAwNyBpbiB0aGUgMC45LjEgeDExdm5jIHRhcmJhbGwgdGhlcmUgaXMgYSBuZXcKICAgb3B0aW9uIHNldHRpbmcgIi11c2VycyBzc2xwZWVyPSIgdGhhdCB3aWxsIGRvIGEgc3dpdGNoIHVzZXIgbXVjaCBsaWtlCiAgIC11bml4cHcgZG9lcywgYnV0IHRoaXMgdGltZSB1c2luZyB0aGUgZW1haWxBZGRyZXNzIGZpZWxkIG9mIHRoZQogICBDZXJ0aWZpY2F0ZSBzdWJqZWN0IG9mIHRoZSB2ZXJpZmllZCBDbGllbnQuIFRoaXMgbW9kZSByZXF1aXJlcwogICAtc3NsdmVyaWZ5IHR1cm5lZCBvbiB0byB2ZXJpZnkgdGhlIGNsaWVudHMgdmlhIFNTTC4gVGhpcyBtb2RlIGNhbiBiZQogICB1c2VmdWwgaW4gc2l0dWF0aW9ucyB1c2luZyAtY3JlYXRlIG9yIC1zdmMgd2hlcmUgYSBuZXcgWCBzZXJ2ZXIgbmVlZHMKICAgdG8gYmUgc3RhcnRlZCB1cCBhcyB0aGUgYXV0aGVudGljYXRlZCB1c2VyIChidXQgdW5saWtlIGluIC11bml4cHcKICAgbW9kZSwgdGhlIHVuaXggdXNlcm5hbWUgaXMgbm90IG9idmlvdXNseSBrbm93bikuCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBSZXZva2luZyBDZXJ0aWZpY2F0ZXM6CgogICBBIGxhcmdlLCBzY2FsZWQtdXAgaW5zdGFsbGF0aW9uIG1heSBiZW5lZml0IGZyb20gYmVpbmcgYWJsZSB0byByZXZva2UKICAgY2VydGlmaWNhdGVzIChlLmcuIHN1cHBvc2UgYSB1c2VyJ3MgbGFwdG9wIHdpdGggYSB2bmMgY2xpZW50IG9yIHNlcnZlcgogICBrZXkgaXMgY29tcHJvbWlzZWQuKSBZb3UgY2FuIHVzZSB0aGlzIG9wdGlvbiB3aXRoIHgxMXZuYzogLXNzbENSTC4gU2VlCiAgIHRoZSBpbmZvIGF0IHRoYXQgbGluayBmb3IgYSBndWlkZSBvbiB3aGF0IG9wZW5zc2woMSkgY29tbWFuZHMgeW91IHdpbGwKICAgbmVlZCB0byBydW4gdG8gcmV2b2tlIGEgY2VydGlmaWNhdGUuCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBBZGRpdGlvbmFsIHV0bGl0aWVzOgoKICAgWW91IGNhbiBnZXQgaW5mb3JtYXRpb24gYWJvdXQgeW91ciBrZXlzIHZpYSAtc3NsQ2VydEluZm8uIFRoZXNlIGxpc3RzCiAgIGFsbCB5b3VyIGtleXM6CiAgeDExdm5jIC1zc2xDZXJ0SW5mbyBsaXN0CiAgeDExdm5jIC1zc2xDZXJ0SW5mbyBsbAoKICAgKHRoZSBsYXR0ZXIgaXMgbG9uZyBmb3JtYXQpLgoKICAgVGhlc2UgcHJpbnQgbG9uZyBvdXRwdXQsIGluY2x1ZGluZyB0aGUgcHVibGljIGNlcnRpZmljYXRlLCBmb3IKICAgaW5kaXZpZHVhbCBrZXlzOgogIHgxMXZuYyAtc3NsQ2VydEluZm8gc2VydmVyCiAgeDExdm5jIC1zc2xDZXJ0SW5mbyBkaWxiZXJ0CiAgeDExdm5jIC1zc2xDZXJ0SW5mbyBhbGwgICAgICAgICAgICAgKGV2ZXJ5IGtleSwgdmVyeSBsb25nKQoKICAgSWYgeW91IHdhbnQgdG8gYWRkIGEgcHJvdGVjdGluZyBwYXNzcGhyYXNlIHRvIGEga2V5IG9yaWdpbmFsbHkgY3JlYXRlZAogICB3aXRob3V0IG9uZToKICB4MTF2bmMgLXNzbEVuY0tleSBTQVZFCiAgeDExdm5jIC1zc2xFbmNLZXkgU0FWRS1mcmVkCgogICBUbyBkZWxldGUgYSBjZXJ0K2tleToKICB4MTF2bmMgLXNzbERlbENlcnQgU0FWRQogIHgxMXZuYyAtc3NsRGVsQ2VydCBTQVZFLWZyZWQKICB4MTF2bmMgLXNzbERlbENlcnQgd2FsbHkKCiAgIChidXQgcm0oMSkgd2lsbCBiZSBqdXN0IGFzIGVmZmVjdGl2ZSkuCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBDaGFpbmVkIENlcnRpZmljYXRlczoKCiAgIFRoZXJlIGlzIGluY3JlYXNpbmcgaW50ZXJlc3QgaW4gdXNpbmcgY2hhaW5lZCBDQSdzIGluc3RlYWQgb2YgYSBzaW5nbGUKICAgQ0EuIFRoZSBtZXJpdHMgb2YgdXNpbmcgY2hhaW5lZCBDQSdzIGFyZSBub3QgZGVzY3JpYmVkIGhlcmUgYmVzaWRlcyB0bwogICBzYXkgaXRzIHVzZSBtYXkgbWFrZSBzb21lIHRoaW5ncyBlYXNpZXIgd2hlbiBhIGNlcnRpZmljYXRlIG5lZWRzIHRvIGJlCiAgIHJldm9rZWQuCgogICB4MTF2bmMgc3VwcG9ydHMgY2hhaW5lZCBDQSBjZXJ0aWZpY2F0ZXMuIFdlIGRlc2NyaWJlIGEgYmFzaWMgdXNlIGNhc2UKICAgaGVyZS4KCiAgIEJhY2tncm91bmQ6IE9mIGNvdXJzZSB0aGUgbW9zdCBzdHJhaWdodCBmb3J3YXJkIHdheSB0byB1c2UgU1NMIHdpdGgKICAgeDExdm5jIGlzIHRvIHVzZSBubyBDQSBhdCBhbGwgKHNlZSBhYm92ZSk6IGEgc2VsZi1zaWduZWQgY2VydGlmaWNhdGUKICAgYW5kIGtleSBpcyB1c2VkIGFuZCBpdHMgY2VydGlmaWNhdGUgbmVlZHMgdG8gYmUgc2FmZWx5IGNvcGllZCB0byB0aGUKICAgY2xpZW50IHNpZGUuIFRoaXMgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHRoZSBTU0ggc3R5bGUgb2YgbWFuYWdpbmcKICAga2V5cy4gTmV4dCBsZXZlbCB1cCwgb25lIGNhbiB1c2UgYSBzaW5nbGUgQ0EgdG8gc2lnbiBzZXJ2ZXIga2V5czogdGhlbgogICBvbmx5IHRoZSBDQSdzIGNlcnRpZmljYXRlIG5lZWRzIHRvIGJlIHNhZmVseSBjb3BpZWQgdG8gdGhlIGNsaWVudAogICBzaWRlLCB0aGlzIGNhbiBoYXBwZW4gZXZlbiBiZWZvcmUgYW55IHNlcnZlciBjZXJ0cyBhcmUgY3JlYXRlZCAoYWdhaW4sCiAgIHNlZSBhbGwgb2YgdGhlIGRpc2N1c3Npb24gYWJvdmUuKQoKICAgV2l0aCBhIGNlcnRpZmljYXRlIGNoYWluIHRoZXJlIGFyZSB0d28gb3IgbW9yZSBDQSdzIGludm9sdmVkLiBQZXJoYXBzCiAgIGl0IGxvb2tzIGxpa2UgdGhpczoKICByb290X0NBIC0tLT4gaW50ZXJtZWRpYXRlX0NBIC0tLT4gc2VydmVyX2NlcnQKCiAgIFdoZXJlIHRoZSBhcnJvdyBiYXNpY2FsbHkgbWVhbnMgInNpZ25zIi4KCiAgIEluIHRoaXMgdXNhZ2UgbW9kZSB0aGUgY2xpZW50ICh2aWV3ZXItc2lkZSkgd2lsbCBoYXZlIHJvb3RfQ0EncwogICBjZXJ0aWZpY2F0ZSBhdmFpbGFibGUgZm9yIHZlcmlmeWluZyAoYW5kIG5vdGhpbmcgZWxzZS4pIElmIHRoZSB2aWV3ZXIKICAgb25seSByZWNlaXZlZCBzZXJ2ZXJfY2VydCdzIGNlcnRpZmljYXRlLCBpdCB3b3VsZCBub3QgaGF2ZSBlbm91Z2ggaW5mbwogICB0byB2ZXJpZnkgdGhlIHNlcnZlci4gVGhlIGNsaWVudCBuZWVkcyB0byBoYXZlIGludGVybWVkaWF0ZV9DQSdzIGNlcnQKICAgYXMgd2VsbC4gVGhlIHdheSB0byBkbyB0aGlzIHdpdGggeDExdm5jIChpLmUuIGFuIE9wZW5TU0wgdXNpbmcgYXBwKSBpcwogICB0byBjb25jYXRlbmF0ZSB0aGUgc2VydmVyX2NlcnQncyBwZW0gYW5kIHRoZSBpbnRlcm1lZGlhdGVfQ0EncwogICBjZXJ0aWZpY2F0ZSB0b2dldGhlci4KCiAgIEZvciBleGFtcGxlLCBzdXBwb3NlIHRoZSBmaWxlIGludGVybWVkaWF0ZV9DQS5jcnQgaGFkCiAgIGludGVybWVkaWF0ZV9DQSdzIGNlcnRpZmljYXRlLiBBbmQgc3VwcG9zZSB0aGUgZmlsZSBzZXJ2ZXJfY2VydC5wZW0KICAgaGFkIHRoZSBzZXJ2ZXIncyBjZXJ0aWZpY2F0ZSBhbmQgcHJpdmF0ZSBrZXkgcGFpciBhcyBkZXNjcmliZWQgYWJvdmUKICAgb24gdGhpcyBwYWdlLiBXZSBuZWVkIHRvIGRvIHRoaXM6CiAgY2F0IGludGVybWVkaWF0ZV9DQS5jcnQgPj4gc2VydmVyX2NlcnQucGVtCgogICAoTm90ZTogdGhlIG9yZGVyIG9mIHRoZSBpdGVtcyBpbnNpZGUgdGhlIGZpbGUgbWF0dGVyczsgaW50ZXJtZWRpYXRlX0NBCiAgIG11c3QgYmUgYWZ0ZXIgdGhlIHNlcnZlciBrZXkgYW5kIGNlcnQpIGFuZCB0aGVuIHdlIHJ1biB4MTF2bmMgbGlrZQogICB0aGlzOgogIHgxMXZuYyAtc3NsIC4vc2VydmVyX2NlcnQucGVtIC4uLgoKICAgVGhlbiwgb24gdGhlIFZOQyB2aWV3ZXIgY2xpZW50IHNpZGUsIHRoZSB2aWV3ZXIgYXV0aGVudGljYXRlcyB0aGUKICAgeDExdm5jIHNlcnZlciBieSB1c2luZyByb290X0NBJ3MgY2VydGlmaWNhdGUuIFN1cHBvc2UgdGhhdCBpcyBpbiBhCiAgIGZpbGUgbmFtZWQgcm9vdF9DQS5jcnQsIHRoZW4gdXNpbmcgdGhlIFNTVk5DIHdyYXBwZXIgc2NyaXB0CiAgIHNzX3ZuY3ZpZXdlciAod2hpY2ggaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgU1NWTkMgcGFja2FnZSkgYXMgb3VyCiAgIGV4YW1wbGUsIHdlIGhhdmU6CiAgc3Nfdm5jdmlld2VyIC12ZXJpZnkgLi9yb290X0NBLmNydCBob3N0bmFtZTowCgogICAod2hlcmUgImhvc3RuYW1lIiBpcyB0aGUgbWFjaGluZSB3aGVyZSB4MTF2bmMgaXMgcnVubmluZy4pIE9uZSBjb3VsZAogICBhbHNvIHVzZSB0aGUgU1NWTkMgR1VJIHNldHRpbmcgQ2VydHMgLT4gU2VydmVyQ2VydCB0byB0aGUgcm9vdF9DQS5jcnQKICAgZmlsZS4gQW55IG90aGVyIFNTTCBlbmFibGVkIFZOQyB2aWV3ZXIgd291bGQgdXNlIHJvb3RfQ0EuY3J0IGluIGEKICAgc2ltaWxhciB3YXkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIENyZWF0aW5nIENoYWluZWQgQ2VydGlmaWNhdGVzOgoKICAgSGVyZSBpcyBhIGZ1biBleGFtcGxlIHVzaW5nIFZlcmlTaWduJ3MgIlRyaWFsIENlcnRpZmljYXRlIiBwcm9ncmFtLgogICBOb3RlIHRoYXQgVmVyaVNpZ24gaGFzIGEgUm9vdCBDQSBhbmQgYWxzbyBhbiBJbnRlcm1lZGlhdGUgQ0EgYW5kIHVzZXMKICAgdGhlIGxhdHRlciB0byBzaWduIGN1c3RvbWVycyBjZXJ0aWZpY2F0ZXMuIFNvIHRoaXMgcHJvdmlkZXMgYW4gZWFzeQogICB3YXkgdG8gdGVzdCBvdXQgdGhlIGNoYWluZWQgY2VydGlmaWNhdGVzIG1lY2hhbmlzbSB3aXRoIHgxMXZuYy4KCiAgIEZpcnN0IHdlIGNyZWF0ZWQgYSB0ZXN0IHgxMXZuYyBzZXJ2ZXIga2V5OgogIG9wZW5zc2wgZ2VucnNhIC1vdXQgVjEua2V5IDEwMjQKCiAgIHRoZW4gd2UgY3JlYXRlZCBhIGNlcnRpZmljYXRlIHNpZ25pbmcgcmVxdWVzdCAoQ1NSKSBmb3IgaXQ6CiAgb3BlbnNzbCByZXEgLW5ldyAta2V5IFYxLmtleSAtb3V0IFYxLmNzcgoKICAgKHdlIGZvbGxvd2VkIHRoZSBwcm9tcHRzIGFuZCBzdXBwbGllZCBpbmZvcm1hdGlvbiBmb3IgdGhlIHZhcmlvdXMKICAgZmllbGRzLikKCiAgIFRoZW4gd2Ugd2VudCB0byBWZXJpU2lnbidzIHBhZ2UgaHR0cDovL3d3dy52ZXJpc2lnbi5jb20vc3NsL2luZGV4Lmh0bWwKICAgYW5kIGNsaWNrZWQgb24gIkZSRUUgVFJJQUwiICh0aGUgY2VydGlmaWNhdGUgaXMgZ29vZCBmb3IgMTQgZGF5cy4pIFdlCiAgIGZpbGxlZCBpbiB0aGUgZm9ybXMgYW5kIGdvdCB0byB0aGUgcG9pbnQgd2hlcmUgaXQgYXNrZWQgZm9yIHRoZSBDU1IKICAgYW5kIHNvIHdlIHBhc3RlZCBpbiB0aGUgY29udGVudHMgb2YgdGhlIGFib3ZlIFYxLmNzciBmaWxlLiBUaGVuLCBhZnRlcgogICBhIGZldyBtb3JlIHN0ZXBzLCBWZXJpU2lnbiBzaWduZWQgYW5kIGVtYWlsZWQgdXMgb3VyIGNlcnRpZmljYXRlLgoKICAgVGhlIFZlcmlTaWduIFRyaWFsIGNlcnRpZmljYXRlcyB3ZXJlIGZvdW5kIGhlcmU6CiAgaHR0cDovL3d3dy52ZXJpc2lnbi5jb20vc3VwcG9ydC92ZXJpc2lnbi1pbnRlcm1lZGlhdGUtY2EvVHJpYWxfU2VjdXJlX1NlcnZlcl8KUm9vdC9pbmRleC5odG1sCiAgaHR0cDovL3d3dy52ZXJpc2lnbi5jb20vc3VwcG9ydC92ZXJpc2lnbi1pbnRlcm1lZGlhdGUtY2EvdHJpYWwtc2VjdXJlLXNlcnZlci0KaW50ZXJtZWRpYXRlL2luZGV4Lmh0bWwKCiAgIFRoZSBmb3JtZXIgd2FzIHBhc3RlZCBpbnRvIGEgZmlsZSBWLVJvb3QuY3J0IGFuZCB0aGUgbGF0dGVyIHdhcyBwYXN0ZWQKICAgaW50byBWLUludGVybWVkaWF0ZS5jcnQKCiAgIFdlIHBhc3RlZCBvdXIgVHJpYWwgY2VydGlmaWNhdGUgdGhhdCBWZXJpU2lnbiBzaWduZWQgYW5kIGVtYWlsZWQgdG8gdXMKICAgaW50byBhIGZpbGUgbmFtZWQgVjEuY3J0IGFuZCB0aGVuIHdlIHR5cGVkOgogIGNhdCBWMS5rZXkgVjEuY3J0ID4gVjEucGVtCiAgY2F0IFYxLnBlbSBWLUludGVybWVkaWF0ZS5jcnQgPiBWMS1jb21iaW5lZC5wZW0KICBjaG1vZCA2MDAgVjEucGVtIFYxLWNvbWJpbmVkLnBlbQoKICAgU28gbm93IHRoZSBmaWxlIFYxLWNvbWJpbmVkLnBlbSBoYXMgb3VyIHByaXZhdGUga2V5IGFuZCAoVmVyaVNpZ24KICAgc2lnbmVkKSBjZXJ0aWZpY2F0ZSBhbmQgVmVyaVNpZ24ncyBUcmlhbCBJbnRlcm1lZGlhdGUgY2VydGlmaWNhdGUuCgogICBOZXh0LCB3ZSBzdGFydCB4MTF2bmM6CiAgeDExdm5jIC1zc2wgLi9WMS1jb21iaW5lZC5wZW0gLi4uCgogICBhbmQgZmluYWxseSwgb24gdGhlIHZpZXdlciBzaWRlIChTU1ZOQyB3cmFwcGVyIHNjcmlwdCBleGFtcGxlKToKICBzc192bmN2aWV3ZXIgLXZlcmlmeSAuL1YtUm9vdC5jcnQgaG9zdG5hbWU6MAoKICAgT25lIHdpbGwgZmluZCB0aGF0IG9ubHkgdGhhdCBjb21iaW5hdGlvbiBvZiBjZXJ0cyBhbmQga2V5cyB3aWxsIHdvcmssCiAgIGkuZS4gYWxsb3cgdGhlIFNTTCBjb25uZWN0aW9uIHRvIGJlIGVzdGFibGlzaGVkLiBFdmVyeSBvdGhlcgogICBjb21iaW5hdGlvbiB3ZSB0cmllZCBmYWlsZWQgKG5vdGUgdGhhdCBzc192bmN2aWV3ZXIgdXNlcyB0aGUgZXh0ZXJuYWwKICAgc3R1bm5lbCBjb21tYW5kIHRvIGhhbmRsZSB0aGUgU1NMIHNvIHdlIGFyZSByZWFsbHkgdGVzdGluZyBzdHVubmVsJ3MKICAgU1NMIGltcGxlbWVudGF0aW9uIG9uIHRoZSB2aWV3ZXIgc2lkZSk7IGFuZCBzbyB0aGUgc3lzdGVtIHdvcmtzIGFzCiAgIGV4cGVjdGVkLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBWTkMgQ2xpZW50IEF1dGhlbnRpY2F0aW9uIHVzaW5nIENlcnRpZmljYXRlIENoYWluczoKCiAgIE5vdywgZ29pbmcgdGhlIG90aGVyIHdheSBhcm91bmQgd2l0aCB0aGUgY2xpZW50IGF1dGhlbnRpY2F0aW5nIGhpbXNlbGYKICAgdmlhIHRoaXMgY2hhaW4gb2YgU1NMIGNlcnRpZmljYXRlcywgeDExdm5jIGlzIHJ1biB0aGlzIHdheToKICB4MTF2bmMgLXNzbCBTQVZFIC1zc2x2ZXJpZnkgLi9WLVJvb3QuY3J0IC4uLgoKICAgKG5vdGUgc2luY2UgdGhlIHNlcnZlciBtdXN0IGFsd2F5cyBzdXBwbHkgYSBjZXJ0LCB3ZSB1c2UgaXRzIG5vcm1hbAogICBzZWxmLXNpZ25lZCwgZXRjLiwgb25lIHZpYSAiLXNzbCBTQVZFIiBhbmQgdXNlIHRoZSBWZXJpU2lnbiByb290IGNlcnQKICAgZm9yIGNsaWVudCBhdXRoZW50aWNhdGlvbiB2aWEgLXNzbHZlcmlmeS4gVGhlIHZpZXdlciBtdXN0IG5vdyBzdXBwbHkKICAgdGhlIGNvbWJpbmVkIGNlcnRpZmljYXRlcywgZS5nLjoKICBzc192bmN2aWV3ZXIgLW15Y2VydCAuL1YxLWNvbWJpbmVkLnBlbSBob3N0bmFtZTowCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFVzaW5nIE9wZW5TU0wgYW5kIHgxMXZuYyB0byBjcmVhdGUgQ2VydGlmaWNhdGUgQ2hhaW5zOgoKICAgQWx0aG91Z2ggdGhlIHgxMXZuYyBDQSBtZWNoYW5pc20gKC1zc2xHZW5DQSBhbmQgLXNzbEdlbkNlcnQ7IHNlZQogICBhYm92ZSkgd2FzIGRlc2lnbmVkIHRvIG9ubHkgaGFuZGxlIGEgc2luZ2xlIHJvb3QgQ0EgKHRvIHNpZ24gc2VydmVyCiAgIGFuZC9vciBjbGllbnQgY2VydHMpIGl0IGNhbiBiZSBjb2VyY2VkIGludG8gY3JlYXRpbmcgYSBjZXJ0aWZpY2F0ZQogICBjaGFpbiBieSB3YXkgb2YgYW4gZXh0cmEgb3BlbnNzbCgxKSBjb21tYW5kLgoKICAgV2Ugd2lsbCBmaXJzdCBjcmVhdGUgdHdvIENBJ3MgdmlhIC1zc2xHZW5DQTsgdGhlbiB1c2Ugb25lIG9mIHRoZXNlIENBCiAgIHRvIHNpZ24gdGhlIG90aGVyOyBjcmVhdGUgYSBuZXcgKG5vbi1DQSkgc2VydmVyIGNlcnQ7IGFuZCBhcHBlbmQgdGhlCiAgIGludGVybWVkaWF0ZSBDQSdzIGNlcnQgdG8gdGhlIHNlcnZlciBjZXJ0IHRvIGhhdmUgZXZlcnl0aGluZyBuZWVkZWQgaW4KICAgdGhlIG9uZSBmaWxlLgoKICAgSGVyZSBhcmUgdGhlIGNvbW1hbmRzIHdlIHJhbiB0byBkbyB3aGF0IHRoZSBwcmV2aW91cyBwYXJhZ3JhcGgKICAgb3V0bGluZXMuCgogICBGaXJzdCB3ZSBjcmVhdGUgdGhlIHR3byBDQSdzLCBjYWxsZWQgQ0Ffcm9vdCBhbmQgQ0FfSW50ZXJtZWRpYXRlIGhlcmUsCiAgIGluIHNlcGFyYXRlIGRpcmVjdG9yaWVzIHZpYSB4MTF2bmM6CiAgeDExdm5jIC1zc2xkaXIgfi9DQV9Sb290IC1zc2xHZW5DQQogICAgIChmb2xsb3cgdGhlIHByb21wdHMsIHdlIGluY2x1ZGVkICJDQV9Sb290IiwgZS5nLiBDb21tb24gTmFtZSwgdG8gYWlkIGlkZW50CmlmeWluZyBpdCkKCiAgeDExdm5jIC1zc2xkaXIgfi9DQV9JbnRlcm1lZGlhdGUgLXNzbEdlbkNBCiAgICAgKGZvbGxvdyB0aGUgcHJvbXB0cywgd2UgaW5jbHVkZWQgIkNBX0ludGVybWVkaWF0ZSIsIGUuZy4gQ29tbW9uIE5hbWUsIHRvIGEKaWQgaWRlbnRpZnlpbmcgaXQpCgogICBOZXh0IGJhY2t1cCBDQV9JbnRlcm1lZGlhdGUncyBjZXJ0IGFuZCB0aGVuIHNpZ24gaXQgd2l0aCBDQV9Sb290OgogIG12IH4vQ0FfSW50ZXJtZWRpYXRlL0NBL2NhY2VydC5wZW0gfi9DQV9JbnRlcm1lZGlhdGUvQ0EvY2FjZXJ0LnBlbS5PUklHCiAgY2Qgfi9DQV9Sb290CiAgb3BlbnNzbCBjYSAtY29uZmlnIC4vQ0Evc3NsLmNuZiAtcG9saWN5IHBvbGljeV9hbnl0aGluZyAtZXh0ZW5zaW9ucyB2M19jYSAtbm8KdGV4dCAtc3NfY2VydCB+L0NBX0ludGVybWVkaWF0ZS9DQS9jYWNlcnQucGVtLk9SSUcgLW91dCB+L0NBX0ludGVybWVkaWF0ZS9DQS9jYQpjZXJ0LnBlbQoKICAgTm90ZSB0aGF0IGl0IGlzIHJlcXVpcmVkIHRvIGNkIHRvIHRoZSB+L0NBX1Jvb3QgZGlyZWN0b3J5IGFuZCBydW4gdGhlCiAgIG9wZW5zc2wgY29tbWFuZCBmcm9tIHRoZXJlLgoKICAgWW91IGNhbiBwcmludCBvdXQgaW5mbyBhYm91dCB0aGUgY2VydCB5b3UganVzdCBtb2RpZmllZCBieToKICBvcGVuc3NsIHg1MDkgLW5vb3V0IC10ZXh0IC1pbiB+L0NBX0ludGVybWVkaWF0ZS9DQS9jYWNlcnQucGVtCgogICBOb3cgd2UgY3JlYXRlIGFuIHgxMXZuYyBzZXJ2ZXIgY2VydCBuYW1lZCAidGVzdF9jaGFpbiIgdGhhdCBpcyBzaWduZWQKICAgYnkgQ0FfSW50ZXJtZWRpYXRlOgogIHgxMXZuYyAtc3NsZGlyIH4vQ0FfSW50ZXJtZWRpYXRlIC1zc2xHZW5DZXJ0IHNlcnZlciB0ZXN0X2NoYWluCiAgICAgKGZvbGxvdyB0aGUgcHJvbXB0cykKCiAgIFlvdSBjYW4gcHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc2VydmVyIGNlcnQganVzdCBjcmVhdGVkIHZpYQogICB0aGlzIGNvbW1hbmQ6CiAgeDExdm5jIC1zc2xkaXIgfi9DQV9JbnRlcm1lZGlhdGUgLXNzbENlcnRJbmZvIFNBVkUtdGVzdF9jaGFpbgoKICAgVGhpcyB3aWxsIHRlbGwgeW91IHRoZSBmdWxsIHBhdGggdG8gdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSwgd2hpY2ggaXMKICAgbmVlZGVkIGJlY2F1c2Ugd2UgbmVlZCB0byBtYW51YWxseSBhcHBlbmQgdGhlIENBX0ludGVybWVkaWF0ZSBjZXJ0IGZvcgogICB0aGUgY2hhaW4gdG8gd29yazoKICBjYXQgfi9DQV9JbnRlcm1lZGlhdGUvQ0EvY2FjZXJ0LnBlbSA+PiB+L0NBX0ludGVybWVkaWF0ZS9zZXJ2ZXItdGVzdF9jaGFpbi5wZQptCgogICBOb3cgd2UgYXJlIGZpbmFsbHkgcmVhZHkgdG8gdXNlIGl0LiBXZSBjYW4gcnVuIHgxMXZuYyB1c2luZyB0aGlzCiAgIHNlcnZlciBjZXJ0K2tleSBieSBlaXRoZXIgdGhpcyBjb21tYW5kOgogIHgxMXZuYyAtc3NsZGlyIH4vQ0FfSW50ZXJtZWRpYXRlIC1zc2wgU0FWRS10ZXN0X2NoYWluIC4uLgoKICAgb3IgdGhpcyBjb21tYW5kOgogIHgxMXZuYyAtc3NsIH4vQ0FfSW50ZXJtZWRpYXRlL3NlcnZlci10ZXN0X2NoYWluLnBlbSAuLi4KCiAgIHNpbmNlIHRoZXkgYXJlIGVxdWl2YWxlbnQgKGJvdGggbG9hZCB0aGUgc2FtZSBwZW0gZmlsZS4pCgogICBGaW5hbGx5IHdlIGNvbm5lY3QgdmlhIFZOQyB2aWV3ZXIgdGhhdCB1c2VzIENBX1Jvb3QgdG8gdmVyaWZ5IHRoZQogICBzZXJ2ZXIuIEFzIGJlZm9yZSB3ZSB1c2Ugc3Nfdm5jdmlld2VyOgogIHNzX3ZuY3ZpZXdlciAtdmVyaWZ5IH4vQ0FfUm9vdC9DQS9jYWNlcnQucGVtIGhvc3RuYW1lOjAKCiAgIENsaWVudCBDZXJ0aWZpY2F0ZXMgKHNlZSBhYm92ZSkgd29yayBpbiBhIHNpbWlsYXIgbWFubmVyLgoKICAgU28gYWx0aG91Z2ggaXQgaXMgYSBsaXR0bGUgYXdrd2FyZCB3aXRoIHRoZSBleHRyYSBzdGVwcyAoZS5nLgogICBhcHBlbmRpbmcgdGhlIENBX0ludGVybWVkaWF0ZSBjZXJ0KSBpdCBpcyBwb3NzaWJsZS4gSWYgeW91IHdhbnQgdG8gZG8KICAgdGhpcyBlbnRpcmVseSB3aXRoIG9wZW5zc2woMSkgeW91IHdpbGwgaGF2ZSB0byBsZWFybiB0aGUgb3BlbnNzbAogICBjb21tYW5kcyBjb3JyZXNwb25kaW5nIHRvIC1nZW5DQSBhbmQgLWdlbkNlcnQuIFlvdSBtYXkgYmUgYWJsZSB0byBmaW5kCiAgIGd1aWRlcyBvbiB0aGUgSW50ZXJuZXQgdG8gZG8gdGhpcy4gU3RhcnRpbmcgd2l0aCB4MTF2bmMgMC45LjEwLCB5b3UKICAgY2FuIGhhdmUgaXQgcHJpbnQgb3V0IHRoZSB3cmFwcGVyIHNjcmlwdHMgaXQgdXNlcyB2aWE6IC1zc2xTY3JpcHRzCiAgICh5b3Ugd2lsbCBzdGlsbCBuZWVkIHRvIGZpbGwgaW4gYSBmZXcgcGllY2VzIG9mIGluZm9ybWF0aW9uOyBhc2sgaWYgaXQKICAgaXMgbm90IGNsZWFyIGZyb20gdGhlIHNvdXJjZSBjb2RlLikKCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIE1vcmUgaW5mbzoKCiAgIFNlZSBhbHNvIHRoaXMgYXJ0aWNsZSBmb3Igc29tZSBzb21lIGdlbmVyYWwgaW5mbyBhbmQgZXhhbXBsZXMgdXNpbmcKICAgc3R1bm5lbCBhbmQgb3BlbnNzbCBvbiBXaW5kb3dzIHdpdGggVk5DLiBBbHNvCiAgIGh0dHA6Ly93d3cuc3R1bm5lbC5vcmcvZmFxL2NlcnRzLmh0bWwgaXMgYSB2ZXJ5IGdvb2Qgc291cmNlIG9mCiAgIGluZm9ybWF0aW9uIG9uIFNTTCBjZXJ0aWZpY2F0ZSBjcmVhdGlvbiBhbmQgbWFuYWdlbWVudC4KCQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3NzbC1wb3J0YWwuaHRtbDoKCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBVc2luZyBBcGFjaGUgYXMgYW4gU1NMIEdhdGV3YXkgdG8gbXVsdGlwbGUgeDExdm5jIHNlcnZlcnMgaW5zaWRlIGEKICAgZmlyZXdhbGw6CgogICBCYWNrZ3JvdW5kOgoKICAgVGhlIHR5cGljYWwgd2F5IHRvIGFsbG93IGFjY2VzcyB0byB4MTF2bmMgKG9yIGFueSBvdGhlciBWTkMgc2VydmVyKQogICBydW5uaW5nIG9uIG11bHRpcGxlIHdvcmtzdGF0aW9ucyBpbnNpZGUgYSBmaXJld2FsbCBpcyB2aWEgU1NILiBUaGUKICAgdXNlciBzb21ld2hlcmUgb3V0IG9uIHRoZSBJbnRlcm5ldCBsb2dzIGluIHRvIHRoZSBTU0ggZ2F0ZXdheSBtYWNoaW5lCiAgIGFuZCB1c2VzIHBvcnQgZm9yd2FyZGluZyAoZS5nLiBzc2ggLXQgLUwgNTkwMDpteXdvcmtzdGF0aW9uOjU5MDAKICAgdXNlckBnYXRld2F5KSB0byBzZXQgdXAgdGhlIGVuY3J5cHRlZCBjaGFubmVsIHRoYXQgVk5DIGlzIHRoZW4KICAgdHVubmVsZWQgdGhyb3VnaC4gTmV4dCBoZSBzdGFydHMgdXAgdGhlIFZOQyB2aWV3ZXIgb24gdGhlIG1hY2hpbmUKICAgd2hlcmUgaGUgaXMgc2l0dGluZyBkaXJlY3RlZCB0byB0aGUgbG9jYWwgdHVubmVsIHBvcnQgKGUuZy4KICAgbG9jYWxob3N0OjApLgoKICAgVGhlIFNTSCBzY2hlbWUgaXMgbmljZSBiZWNhdXNlIGl0IGlzIGEgd2lkZWx5IHVzZWQgYW5kIHdlbGwgdGVzdGVkCiAgIGxvZ2luIHRlY2huaXF1ZSBmb3IgdXNlcnMgY29ubmVjdGluZyB0byBtYWNoaW5lcyBpbnNpZGUgdGhlaXIgY29tcGFueQogICBvciBob21lIGZpcmV3YWxsLiBGb3IgVk5DIGFjY2VzcyBpdCBpcyBhIGJpdCBhd2t3YXJkLCBob3dldmVyLCBiZWNhdXNlCiAgIFNTSCBuZWVkcyB0byBiZSBpbnN0YWxsZWQgb24gdGhlIFZpZXdlciBtYWNoaW5lIGFuZCB0aGUgdXNlciB1c3VhbGx5CiAgIGhhcyB0byByaWcgdXAgaGlzIG93biBwb3J0IHJlZGlyZWN0aW9uIHBsdW1iaW5nIChob3dldmVyLCBzZWUgb3VyCiAgIG90aGVyIHRvb2wpLgoKICAgQWxzbywgc29tZSB1c2VycyBoYXZlIHJlc3RyaWN0aXZlIHdvcmsgZW52aXJvbm1lbnRzIHdoZXJlIFNTSCBhbmQKICAgc2ltaWxhciBhcHBsaWNhdGlvbnMgYXJlIHByb2hpYml0ZWQgKGkuZS4gb25seSBvdXRnb2luZyBjb25uZWN0aW9ucyB0bwogICBzdGFuZGFyZCBXV1cgcG9ydHMgZnJvbSBhIGJyb3dzZXIgYXJlIGFsbG93ZWQsIHBlcmhhcHMgbWVkaWF0ZWQgYnkgYQogICBwcm94eSBzZXJ2ZXIpLiBUaGVzZSB1c2VycyBoYXZlIHN1Y2Nlc3NmdWxseSB1c2VkIHRoZSBtZXRob2QgZGVzY3JpYmVkCiAgIGhlcmUgZm9yIHJlbW90ZSBhY2Nlc3MuCgogICBXaXRoIHRoZSBTU0wgc3VwcG9ydCBpbiB4MTF2bmMgYW5kIHRoZSBTU0wgZW5hYmxlZCBKYXZhIFZOQyB2aWV3ZXIKICAgYXBwbGV0LCBhIGNvbnZlbmllbnQgYW5kIHNlY3VyZSBhbHRlcm5hdGl2ZSBleGlzdHMgdGhhdCB1c2VzIHRoZQogICBBcGFjaGUgd2Vic2VydmVyIGFzIGEgZ2F0ZXdheS4gVGhlIGlkZWEgaXMgdGhhdCB0aGUgY29tcGFueSBvciBob21lCiAgIGludGVybmV0IGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBydW5uaW5nIGFwYWNoZSBhcyBhIHdlYiBzZXJ2ZXIgKGVpdGhlcgogICBTU0wgb3Igbm9uLVNTTCkgYW5kIHdlIGFkZCB0byBpdCB0aGUgYWJpbGl0eSB0byBhY3QgYXMgYSBnYXRld2F5IGZvcgogICBTU0wgVk5DIGNvbm5lY3Rpb25zLiBUaGUgb25seSB0aGluZyBuZWVkZWQgb24gdGhlIFZpZXdlciBzaWRlIGlzIGEKICAgSmF2YSBlbmFibGVkIFdlYiBCcm93c2VyOiB0aGUgdXNlciBzaW1wbHkgZW50ZXJzIGEgVVJMIHRoYXQgc3RhcnRzIHRoZQogICBlbnRpcmUgVk5DIGNvbm5lY3Rpb24gcHJvY2Vzcy4gTm8gVk5DIG9yIFNTSCBzcGVjaWZpYyBzb2Z0d2FyZSBuZWVkcwogICB0byBiZSBpbnN0YWxsZWQgb24gdGhlIHZpZXdlciBzaWRlIG1hY2hpbmUuCgogICBUaGUgc3R1bm5lbCBWTkMgdmlld2VyIHN0dW5uZWwgd3JhcHBlciBzY3JpcHQgcHJvdmlkZWQgKHNzX3ZuY3ZpZXdlcikKICAgY2FuIGFsc28gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG1ldGhvZCBkZXNjcmliZWQgaGVyZSB3aXRoIGl0cyAtcHJveHkKICAgb3B0aW9uLgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgU2ltcGxlciBTb2x1dGlvbnM6IFRoaXMgYXBhY2hlIFNTTCBWTkMgcG9ydGFsIHNvbHV0aW9uIG1heSBiZSB0b28gbXVjaAogICBmb3IgeW91LiBJdCBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3RpbmcgdG8KICAgTVVMVElQTEUgd29ya3N0YXRpb25zIGluc2lkZSB0aGUgZmlyZXdhbGwuIElmIHlvdSBvbmx5IGhhdmUgb25lIG9yIHR3bwogICBpbnNpZGUgbWFjaGluZXMgdGhhdCB5b3Ugd2FudCB0byBhY2Nlc3MsIHRoZSBtZXRob2QgZGVzY3JpYmVkIGhlcmUgaXMKICAgb3Zlcmx5IGNvbXBsaWNhdGVkISBTZWUgYmVsb3cgZm9yIHNvbWUgc2ltcGxlciAoYW5kIHN0aWxsIG5vbi1TU0gpCiAgIGVuY3J5cHRlZCBzZXR1cHMuCgogICBBbHNvIHNlZSB0aGUgcmVjZW50IChNYXIvMjAxMCkgZGVza3RvcC5jZ2kgeDExdm5jIGRlc2t0b3Agd2ViIGxvZ2luCiAgIENHSSBzY3JpcHQgdGhhdCBhY2hpZXZlcyBtdWNoIG9mIHdoYXQgdGhlIG1ldGhvZCBkZXNjcmliZXMgaGVyZQogICAoZXNwZWNpYWxseSBpZiBpdHMgJ3BvcnQgcmVkaXJlY3Rpb24nIGZlYXR1cmUgaXMgZW5hYmxlZC4pCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCgoKICAgVGhlcmUgYXJlIG51bWVyb3VzIHdheXMgdG8gYWNoaWV2ZSB0aGlzIHdpdGggQXBhY2hlLiBXZSBwcmVzZW50IG9uZSBvZgogICB0aGUgc2ltcGxlc3Qgb25lcyBoZXJlLgoKICAgSW1wb3J0YW50OiB0aGVzZSBzb3J0cyBvZiBzY2hlbWVzIGFsbG93IGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20KICAgYW55d2hlcmUgb24gdGhlIEludGVybmV0IHRvIGZpeGVkIHBvcnRzIG9uIG1hY2hpbmVzIGluc2lkZSB0aGUKICAgZmlyZXdhbGwuIENhcmUgbXVzdCBiZSB0YWtlbiB0byBpbXBsZW1lbnQgYW5kIHRlc3QgdGhvcm91Z2hseS4gSWYgb25lCiAgIGlzIHBhcmFub2lkIG9uZSBjYW4gKGFuZCBzaG91bGQpIGFkZCBleHRyYSBsYXllcnMgb2YgcHJvdGVjdGlvbi4gKGUuZy4KICAgZXh0cmEgcGFzc3dvcmRzLCBwYWNrZXQgZmlsdGVyaW5nLCBTU0wgY2VydGlmaWNhdGUgdmVyaWZpY2F0aW9uLCBldGMpLgoKICAgQWxzbywgaXQgaXMgZWFzeSB0byBtaXNzIHRoZSBwb2ludCB0aGF0IHVubGVzcyBwcmVjYXV0aW9ucyBhcmUgdGFrZW4KICAgdG8gdmVyaWZ5IFNTTCBDZXJ0aWZpY2F0ZXMsIHRoZW4gdGhlIFZOQyBWaWV3ZXIgaXMgdnVsbmVyYWJsZSB0bwogICBtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2tzIChidXQgbm90IHRvIHRoZSBtb3JlIGNvbW1vbiBwYXNzaXZlIHNuaWZmaW5nCiAgIGF0dGFja3MpLiBOb3RlIHRoYXQgdGhlcmUgYXJlIGhhY2tlciB0b29scyBsaWtlIGRzbmlmZi93ZWJtaXRtIGFuZAogICBjYWluIHRoYXQgaW1wbGVtZW50IFNTTCBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzLiBUaGV5IHJlbHkgb24gdGhlCiAgIGNsaWVudCBub3QgYm90aGVyaW5nIHRvIGNoZWNrIHRoZSBjZXJ0LgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBUaGUgSG9seSBHcmFpbDogYSBzaW5nbGUgaHR0cHMgcG9ydCAoNDQzKQoKICAgQmVmb3JlIHdlIGRpc2N1c3MgdGhlIHNlbGYtY29udGFpbmVkIGFwYWNoZSBleGFtcGxlcyBoZXJlLCB3ZSB3YW50IHRvCiAgIG1lbnRpb24gdGhhdCBtYW55IHgxMXZuYyB1c2VycyB3aG8gcmVhZCB0aGlzIHBhZ2UgYW5kIGltcGxlbWVudCB0aGUKICAgYXBhY2hlIFNTTCBWTkMgcG9ydGFsIGFzayBmb3Igc29tZXRoaW5nIHRoYXQgKHNvIGZhcikgc2VlbXMgZGlmZmljdWx0CiAgIG9yIGltcG9zc2libGUgdG8gZG8gZW50aXJlbHkgaW5zaWRlIGFwYWNoZToKICAgICAqIEEgc2luZ2xlIHBvcnQsIDQ0MyAodGhlIGRlZmF1bHQgaHR0cHM6Ly8gcG9ydCksIGlzIG9wZW4gdG8gdGhlCiAgICAgICBJbnRlcm5ldAogICAgICogSXQgaXMgSFRUUFMvU1NMIGVuY3J5cHRlZAogICAgICogSXQgaGFuZGxlcyBib3RoIFZOQyB0cmFmZmljIGFuZCBKYXZhIFZOQyBBcHBsZXQgZG93bmxvYWRzLgogICAgICogQW5kIHRoZSBzZXJ2ZXIgY2FuIGFsc28gc2VydmUgbm9ybWFsIEhUVFBTIHdlYnBhZ2VzLCBDR0ksIGV0Yy4KCiAgIEl0IGlzIHRoZSBsYXN0IGl0ZW0gdGhhdCBtYWtlcyBpdCB0cmlja3kgKG90aGVyd2lzZSB0aGUgbWV0aG9kCiAgIGRlc2NyaWJlZCBvbiB0aGlzIHBhZ2Ugd2lsbCB3b3JrKS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHN1Y2ggYQogICBzb2x1dGlvbiBhbmQgYXJlIHdpbGxpbmcgdG8gcnVuIGEgc2VwYXJhdGUgaGVscGVyIHByb2dyYW0KICAgKGNvbm5lY3Rfc3dpdGNoKSBsb29rIGhlcmUuIEFsc28sIHNlZSB0aGlzIGFwYWNoZSBwYXRjaC4KICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgRXhhbXBsZToKCiAgIFRoZSBzY2hlbWUgZGVzY3JpYmVkIGhlcmUgc2V0cyB1cCBhcGFjaGUgb24gdGhlIGZpcmV3YWxsL2dhdGV3YXkgYXMgYQogICByZWd1bGFyIFdlYiBwcm94eSBpbnRvIHRoZSBpbnRyYW5ldCBhbmQgYWxsb3dzIGNvbm5lY3Rpb25zIHRvIGEgc2luZ2xlCiAgIGZpeGVkIHBvcnQgb24gYSBsaW1pdGVkIHNldCBvZiBtYWNoaW5lcy4KCiAgIFRoZSBjb25maWd1cmF0aW9uIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24gZG9lcyBub3QgdXNlIHRoZSBtb2Rfc3NsCiAgIGFwYWNoZSBtb2R1bGUgKHRoZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIGRlc2NyaWJlZCBpbiB0aGUgc2VjdGlvbgogICAiRG93bmxvYWRpbmcgdGhlIEphdmEgYXBwbGV0IHRvIHRoZSBicm93c2VyIHZpYSBIVFRQUyIgZG9lcyB0YWtlCiAgIGFkdmFudGFnZSBvZiBtb2Rfc3NsKQoKICAgSW4gdGhpcyBleGFtcGxlIHN1cHBvc2UgdGhlIGdhdGV3YXkgbWFjaGluZSBydW5uaW5nIGFwYWNoZSBpcyBuYW1lZAogICAid3d3LmdhdGV3YXkuZWFzdCIgKGUuZy4gaXQgbWF5IGFsc28gcHJvdmlkZSBub3JtYWwgd2ViIHNlcnZpY2UpLiBXZQogICBhbHNvIGNob29zZSB0aGUgSW50ZXJuZXQtZmFjaW5nIHBvcnQgZm9yIHRoaXMgVk5DIHNlcnZpY2UgdG8gYmUgcG9ydAogICA1NjMuIE9uZSBjb3VsZCBjaG9vc2UgYW55IHBvcnQsIGluY2x1ZGluZyB0aGUgZGVmYXVsdCBIVFRQIHBvcnQgODAuCgogICBEZXRhaWw6IFdlIGNob29zZSA1NjMgYmVjYXVzZSBpdCBpcyB0aGUgcmFyZWx5IHVzZWQgU05FV1MgcG9ydCB0aGF0IGlzCiAgIG9mdGVuIGFsbG93ZWQgYnkgV2ViIHByb3hpZXMgZm9yIHRoZSBDT05ORUNUIG1ldGhvZC4gVGhlIGlkZWEgaXMgdGhlCiAgIHVzZXIgbWF5IGJlIGNvbWluZyBvdXQgb2YgYW5vdGhlciBmaXJld2FsbCB1c2luZyBhIHByb3h5IChub3QgdGhlIG9uZQogICB3ZSBkZXNjcmliZSBoZXJlLCB0aGF0IGlzLCB0aGUgY2FzZSB3aGVuIHR3byBwcm94aWVzIGFyZSBpbnZvbHZlZCwKICAgZS5nLiBvbmUgYXQgd29yayBhbmQgYW5vdGhlciBBcGFjaGUgKGRlc2NyaWJlZCBoZXJlKSBhdCBob21lCiAgIHJlZGlyZWN0aW5nIGludG8gb3VyIGZpcmV3YWxsOyB0aGUgImRvdWJsZSBwcm94eSIgb3IgImRvdWJsZSBmaXJld2FsbCIKICAgcHJvYmxlbSkuIFVzaW5nIHBvcnQgNTYzIHNpbXBsaWZpZXMgdGhpbmdzIGJlY2F1c2UgQ09OTkVDVCdzIHRvIGl0IGFyZQogICB1c3VhbGx5IGFsbG93ZWQgYnkgZGVmYXVsdC4KCiAgIFdlIGFsc28gYXNzdW1lIGFsbCBvZiB0aGUgeDExdm5jIHNlcnZlcnMgb24gdGhlIGludGVybmFsIG1hY2hpbmVzIGFyZQogICBhbGwgbGlzdGVuaW5nIG9uIHBvcnQgNTkxNSAoIi1yZmJwb3J0IDU5MTUiKSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0CiAgIDU5MDAuIFRoaXMgaXMgdG8gbGltaXQgYW55IHVuaW50ZW5kZWQgcHJveHkgcmVkaXJlY3Rpb25zIHRvIGEgbGVzc2VyCiAgIHVzZWQgcG9ydCwgYW5kIGFsc28gdG8gc3RheSBvdXQgb2YgdGhlIHdheSBvZiBub3JtYWwgVk5DIHNlcnZlcnMgb24KICAgdGhlIHNhbWUgbWFjaGluZXMuIE9uZSBjb3VsZCBvYnZpb3VzbHkgaW1wbGVtZW50IGEgc2NoZW1lIHRoYXQgaGFuZGxlcwogICBkaWZmZXJlbnQgcG9ydHMsIGJ1dCB3ZSBqdXN0IGRpc2N1c3MgdGhpcyBzaW1wbGUgc2V0dXAgaGVyZS4KCiAgIFNvIHdlIGJhc2ljYWxseSBhc3N1bWUgeDExdm5jIGhhcyBiZWVuIHN0YXJ0ZWQgdGhpcyB3YXkgb24gYWxsIG9mIHRoZQogICB3b3Jrc3RhdGlvbnMgdG8gYmUgZ3JhbnRlZCBWTkMgYWNjZXNzOgogIHgxMXZuYyAtc3NsIFNBVkUgLWh0dHAgLWRpc3BsYXkgOjAgLWZvcmV2ZXIgLXJmYmF1dGggfi8udm5jL3Bhc3N3ZCAtcmZicG9ydCA1CjkxNQoKICAgaS5lLiB3ZSBmb3JjZSBTU0wgVk5DIGNvbm5lY3Rpb25zLCBwb3J0IDU5MTUsIHNlcnZlIHRoZSBKYXZhIFZOQwogICB2aWV3ZXIgYXBwbGV0LCBhbmQgcmVxdWlyZSBhIFZOQyBwYXNzd29yZCAoYW5vdGhlciBvcHRpb24gd291bGQgYmUKICAgLXVuaXhwdykuIFRoZSBhYm92ZSBjb21tYW5kIGNvdWxkIGFsc28gYmUgcnVuIG91dCBvZiBpbmV0ZCg4KS4gSXQgY2FuCiAgIGFsc28gYmUgdXNlZCB0byBhdXRvZGV0ZWN0IHRoZSB1c2VyJ3MgZGlzcGxheSBhbmQgWGF1dGhvcml0eSBkYXRhLgoKCiAgIFRoZXNlIHNlY3Rpb25zIGFyZSBhZGRlZCB0byB0aGUgaHR0cGQuY29uZiBhcGFjaGUgY29uZmlndXJhdGlvbiBmaWxlCiAgIG9uIHd3dy5nYXRld2F5LmVhc3Q6CgojIEluIHRoZSBnbG9iYWwgc2VjdGlvbiB5b3UgbmVlZCB0byBlbmFibGUgdGhlc2UgbW9kdWxlcy4KIyBOb3RlIHRoYXQgdGhlIE9SREVSIE1BVFRFUlMhIG1vZF9yZXdyaXRlIG11c3QgYmUgYmVmb3JlIG1vZF9wcm94eQojIChzbyB0aGF0IHdlIGNhbiBjaGVjayB0aGUgYWxsb3dlZCBob3N0IGxpc3QgdmlhIHJld3JpdGUpCiMKTG9hZE1vZHVsZSByZXdyaXRlX21vZHVsZSBtb2R1bGVzL21vZF9yZXdyaXRlLnNvCkxvYWRNb2R1bGUgcHJveHlfbW9kdWxlIG1vZHVsZXMvbW9kX3Byb3h5LnNvCkxvYWRNb2R1bGUgcHJveHlfY29ubmVjdF9tb2R1bGUgbW9kdWxlcy9tb2RfcHJveHlfY29ubmVjdC5zbwpMb2FkTW9kdWxlIHByb3h5X2Z0cF9tb2R1bGUgbW9kdWxlcy9tb2RfcHJveHlfZnRwLnNvCkxvYWRNb2R1bGUgcHJveHlfaHR0cF9tb2R1bGUgbW9kdWxlcy9tb2RfcHJveHlfaHR0cC5zbwo8SWZEZWZpbmUgU1NMPgpMb2FkTW9kdWxlIHNzbF9tb2R1bGUgbW9kdWxlcy9tb2Rfc3NsLnNvCjwvSWZEZWZpbmU+CgoKIyBOZWFyIHRoZSBib3R0b20gb2YgaHR0cGQuY29uZiB5b3UgcHV0IHRoZSBwb3J0IDU2MyB2aXJ0dWFsIGhvc3Q6CgpMaXN0ZW4gNTYzCgo8VmlydHVhbEhvc3QgKjo1NjM+CgogICAjIEFsbG93IHByb3h5IENPTk5FQ1QgcmVxdWVzdHMgKm9ubHkqIHRvIHBvcnQgNTkxNS4KICAgIyBJZiB0aGUgbWFjaGluZXMgdXNlIGRpZmZlcmVudCBwb3J0cywgZS5nLiA1OTE2IGxpc3QgdGhlbSBoZXJlIGFzIHdlbGw6CiAgICMKICAgUHJveHlSZXF1ZXN0cyBPbgogICBBbGxvd0NPTk5FQ1QgNTkxNQoKICAgUmV3cml0ZUVuZ2luZSBPbgoKICAgIyBDb252ZW5pZW5jZSBydWxlcyB0byBleHBhbmQgYXBwbGV0IHBhcmFtZXRlcnMuICBUaGVzZSBkbyBub3QgaGF2ZSBhIHRyYWlsaQpuZyAiLyIKICAgIwogICAjIC92bmMgICBmb3IgaHR0cCBqYXIgZmlsZSBkb3dubG9hZGluZzoKICAgIwogICBSZXdyaXRlUnVsZSAvdm5jLyhbXi9dKykkICAgICAgICAgICAgICAgL3ZuYy8kMS9pbmRleC52bmM/Q09OTkVDVD0kMSs1OTE1JlBPClJUPTU2MyZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSBbUixORSxMXQogICBSZXdyaXRlUnVsZSAvdm5jL3RydXN0LyhbXi9dKykkICAgICAgICAgL3ZuYy8kMS9pbmRleC52bmM/Q09OTkVDVD0kMSs1OTE1JlBPClJUPTU2MyZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSZ0cnVzdEFsbFZuY0NlcnRzPXllcyBbUixORSxMXQogICBSZXdyaXRlUnVsZSAvdm5jL3Byb3h5LyhbXi9dKykkICAgICAgICAgL3ZuYy8kMS9wcm94eS52bmM/Q09OTkVDVD0kMSs1OTE1JlBPClJUPTU2MyZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSZmb3JjZVByb3h5PXllcyBbUixORSxMXQogICBSZXdyaXRlUnVsZSAvdm5jL3RydXN0L3Byb3h5LyhbXi9dKykkICAgL3ZuYy8kMS9wcm94eS52bmM/Q09OTkVDVD0kMSs1OTE1JlBPClJUPTU2MyZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSZmb3JjZVByb3h5PXllcyZ0cnVzdEFsbFZuY0NlcnRzPXllcyBbUixORSxMXQoKICAgIyBSZWFkIGluIHRoZSBhbGxvd2VkIGhvc3QgdG8gdm5jIGRpc3BsYXkgbWFwcGluZyBmaWxlLiAgSXQgbG9va3MgbGlrZToKICAgIwogICAjICAgaG9zdDEgICAgIDE1CiAgICMgICBob3N0MiAgICAgMTUKICAgIyAgIC4uLgogICAjCiAgICMgdGhlIGRpc3BsYXkgIjE1IiBtZWFucyA1ODE1IGZvciBodHRwIGFwcGxldCBkb3dubG9hZCwgNTkxNSBmb3IgU1NMIHZuYy4KICAgIwogICBSZXdyaXRlTWFwIHZuY2hvc3RzIHR4dDovZGlzdC9hcGFjaGUvY29uZi92bmMuaG9zdHMKCiAgICMgUHJveHk6IGNoZWNrIGZvciB0aGUgQ09OTkVDVCBob3N0bmFtZSBhbmQgcG9ydCBiZWluZyBpbiB0aGUgdm5jLmhvc3RzIGxpc3QKLgogICAjCiAgIFJld3JpdGVDb25kICV7VEhFX1JFUVVFU1R9IF5DT05ORUNUIFtOQ10KICAgUmV3cml0ZUNvbmQgJXtSRVFVRVNUX1VSSX0gXiguKik6KC4qKSQKICAgUmV3cml0ZUNvbmQgJHt2bmNob3N0czolMXxOT1RGT1VORH0gTk9URk9VTkQKICAgUmV3cml0ZVJ1bGUgXi4qJCAvVk5DRkFJTCBbRixMXQoKICAgUmV3cml0ZUNvbmQgJXtUSEVfUkVRVUVTVH0gXkNPTk5FQ1QgW05DXQogICBSZXdyaXRlQ29uZCAle1JFUVVFU1RfVVJJfSBeKC4qKTooLiopJAogICBSZXdyaXRlQ29uZCA1OSR7dm5jaG9zdHM6JTF9PSUyICFeKC4qKT0oXDEpJAogICBSZXdyaXRlUnVsZSBeLiokIC9WTkNGQUlMIFtGLExdCgoKICAgIyBSZW1hcCAvdm5jIHRvIHRoZSBwcm94eSBodHRwIGRvd25sb2FkIChlLmcuIGh0dHA6Ly9ob3N0OjU4MTUpCiAgICMKICAgIyBGaXJzdCwgZmFpbCBpZiBpdCBzdGFydHMgd2l0aCB0aGUgc3RyaW5nIC92bmMwOgogICAjCiAgIFJld3JpdGVSdWxlIF4vdm5jMC4qICAgICAgICAgICAgL1ZOQ0ZBSUwgW0YsTF0KICAgIwogICAjIE5leHQsIG1hcCB0aGUgcHJlZml4IHRvIC92bmMwL2hvc3Q6cHJvdG9jb2w6cG9ydAogICAjCiAgIFJld3JpdGVSdWxlIF4vdm5jLyhbXi9dKykvKC4qKSAgL3ZuYzAvJDE6aHR0cDo1OCR7dm5jaG9zdHM6JDF8Tk9URk9VTkR9LyQyCltORV0KICAgIwogICAjIERyb3AgYW55IG5vdCBmb3VuZDoKICAgIwogICBSZXdyaXRlUnVsZSBeL3ZuYzAuKk5PVEZPVU5ELiogIC9WTkNGQUlMIFtGLExdCgogICAjIENvbnN0cnVjdCB0aGUgcHJveHkgVVJMIGFuZCByZXRyaWV2ZSBpdDoKICAgIwogICBSZXdyaXRlUnVsZSBeL3ZuYzAvKFteL10rKTooW14vXSspOihbXi9dKykvKC4qKSAkMjovLyQxOiQzLyQ0IFtQLE5FLExdCgo8L1ZpcnR1YWxIb3N0PgoKICAgVGhlbiByZXN0YXJ0IGFwYWNoZSAocGVyaGFwczogImFwYWNoZWN0bCBzdG9wOyBhcGFjaGVjdGwgc3RhcnQiKS4KCiAgIE5vdGUgdGhhdCB0aGUgbGlzdGluZyBvZiBhbGxvd2VkIGludGVybmFsIHdvcmtzdGF0aW9ucyBpcyBkb25lIGluIGFuCiAgIGV4dGVybmFsIGZpbGUgKC9kaXN0L2FwYWNoZS9jb25mL3ZuYy5ob3N0cyBpbiB0aGUgZXhhbXBsZSBhYm92ZSksIHRoZQogICBmb3JtYXQgaXMgbGlrZSB0aGlzOgojIGFsbG93ZWQgdm5jIGhvc3RzIGZpbGU6Cmhvc3RuYW1lMSAgMTUKaG9zdG5hbWUyICAxNQouLi4KCiAgIFlvdSBsaXN0IHRoZSBob3N0bmFtZSBhbmQgdGhlIFZOQyBkaXNwbGF5IChhbHdheXMgMTUgaW4gb3VyIGV4YW1wbGUpLgogICBPbmx5IHRvIHRoZXNlIGhvc3RzIHdpbGwgdGhlIGV4dGVybmFsIFZOQyB2aWV3ZXJzIGJlIGFibGUgdG8gY29ubmVjdAogICB0byAodmlhIHRoZSBIVFRQIENPTk5FQ1QgbWV0aG9kKS4KCiAgIFRoZSBhYm92ZSBzZXR1cCByZXF1aXJlcyBtb2RfcmV3cml0ZSBhbmQgbW9kX3Byb3h5IGJlIGVuYWJsZWQgaW4gdGhlCiAgIGFwYWNoZSB3ZWIgc2VydmVyLiBJbiB0aGlzIGV4YW1wbGUgdGhleSBhcmUgbG9hZGVkIGFzIG1vZHVsZXMgKGFuZAogICBub3RlIHRoYXQgbW9kX3Jld3JpdGUgbXVzdCBiZSBsaXN0ZWQgYmVmb3JlIG1vZF9wcm94eSk7CgogICBUaGUgdXNlciBhdCB0aGUgSmF2YSBlbmFibGVkIFdlYiBicm93c2VyIHdvdWxkIHNpbXBseSBlbnRlciB0aGlzIFVSTAogICBpbnRvIHRoZSBicm93c2VyOgogICBodHRwOi8vd3d3LmdhdGV3YXkuZWFzdDo1NjMvdm5jL2hvc3QyCgogICB0byBjb25uZWN0IHRvIGludGVybmFsIHdvcmtzdGF0aW9uIGhvc3QyLCBldGMuCgogICBJbXBvcnRhbnQ6IGRvIG5vdCBwdXQgYSB0cmFpbGluZyAiLyIgb24gdGhlIFVSTCwgc2luY2UgdGhhdCB3aWxsCiAgIGRlZmVhdCB0aGUgUmV3cml0ZVJ1bGVzIHRoYXQgbG9vayBmb3IgdGhlIGhvc3RuYW1lIGF0IHRoZSB2ZXJ5IGVuZC4KCiAgIFRoZXJlIHdpbGwgYmUgYSBudW1iZXIgb2YgU1NMIGNlcnRpZmljYXRlLCBldGMsIGRpYWxvZ3MgaGUgd2lsbCBoYXZlCiAgIHRvIHJlc3BvbmQgdG8gaW4gYWRkaXRpb24gdG8gYW55IHBhc3N3b3JkcyBoZSBpcyByZXF1aXJlZCB0byBwcm92aWRlCiAgICh0aGlzIGRlcGVuZHMgb24gaG93IHlvdSBzZXQgdXAgdXNlciBhdXRoZW50aWNhdGlvbiBmb3IgeDExdm5jKS4KCiAgIElmIGEgc2Vjb25kIFdlYiBwcm94eSBpcyBpbnZvbHZlZCAoaS5lLiB0aGUgdXNlcidzIGJyb3dzZXIgaXMgaW5zaWRlCiAgIGFub3RoZXIgZmlyZXdhbGwgYW5kIHBvbGljeSByZXF1aXJlcyB1c2luZyBhIFdlYiBwcm94eSBzZXJ2ZXIpIHRoZW4KICAgdXNlIHRoaXMgVVJMOgogICBodHRwOi8vd3d3LmdhdGV3YXkuZWFzdDo1NjMvdm5jL3Byb3h5L2hvc3QyCgogICBUaGlzIHdpbGwgaW52b2x2ZSBkb3dubG9hZGluZyBhIHNpZ25lZCBqYXZhIHZpZXdlciBhcHBsZXQgamFyIGZpbGUKICAgdGhhdCBpcyBhYmxlIHRvIGludGVyYWN0IHdpdGggdGhlIGludGVybmFsIHByb3h5IGZvciB0aGUgVk5DCiAgIGNvbm5lY3Rpb24uIFNlZSB0aGlzIEZBUSBmb3IgbW9yZSBpbmZvIG9uIGhvdyB0aGlzIHdvcmtzLiBOb3RlOgogICBzb21ldGltZXMgd2l0aCB0aGUgUHJveHkgY2FzZSBpZiB5b3Ugc2VlICdCYWQgR2F0ZXdheScgZXJyb3IgeW91IHdpbGwKICAgaGF2ZSB0byB3YWl0IDEwIG9yIHNvIHNlY29uZHMgYW5kIHRoZW4gaGl0IHJlbG9hZC4gVGhpcyBzZWVtcyB0byBiZQogICBkdWUgdG8gaGF2aW5nIHRvIHdhaXQgZm9yIGEgQ29ubmVjdGlvbiBLZWVwYWxpdmUgdG8gdGVybWluYXRlLi4uCgogICBGb3IgY29tcGxldGVuZXNzLCB0aGUgInRydXN0IiBjYXNlcyB0aGF0IHNraXAgYSBWTkMgY2VydGlmaWNhdGUgZGlhbG9nCiAgIChkaXNjdXNzZWQgYmVsb3cpIHdvdWxkIGJlIGVudGVyZWQgYXM6CiAgIGh0dHA6Ly93d3cuZ2F0ZXdheS5lYXN0OjU2My92bmMvdHJ1c3QvaG9zdDIKICAgaHR0cDovL3d3dy5nYXRld2F5LmVhc3Q6NTYzL3ZuYy90cnVzdC9wcm94eS9ob3N0MgoKICAgWW91IGNhbiBvZiBjb3Vyc2UgY2hvb3NlIHNob3J0ZXIgb3IgbW9yZSBlYXN5IHRvIHJlbWVtYmVyIFVSTCBmb3JtYXRzLgogICBKdXN0IGNoYW5nZSB0aGUgQ29udmVuaWVuY2UgUmV3cml0ZVJ1bGVzIGluIGh0dHBkLmNvbmYuCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBQb3J0IFZhcmlhdGlvbnM6CgogICBOb3RlIHRoYXQgeW91IGNhbiBydW4gdGhpcyBvbiB0aGUgZGVmYXVsdCBIVFRQIHBvcnQgODAgaW5zdGVhZCBvZiBwb3J0CiAgIDU2My4gSWYgeW91IGRvIG5vdCBleHBlY3QgdG8gaGF2ZSBhIGJyb3dzZXIgY29ubmVjdGluZyBmcm9tIGluc2lkZSBhCiAgIHByb3h5aW5nIGZpcmV3YWxsICh3aGVyZSBzb21ldGltZXMgb25seSBjb25uZWN0aW9ucyB0byBwb3J0cyA0NDMgYW5kCiAgIDU2MyBhcmUgYWxsb3dlZCkgdGhpcyBzaG91bGQgYmUgZmluZS4gVXNlICI4MCIgaW5zdGVhZCBvZiAiNTYzIiBpbiB0aGUKICAgaHR0cGQuY29uZiBjb25maWcgZmlsZSAoeW91IG1heSBuZWVkIHRvIG1lcmdlIGl0IHdpdGggb3RoZXIgZGVmYXVsdAogICBwb3J0IDgwIHRoaW5ncyB5b3UgaGF2ZSB0aGVyZSkuCgogICBUaGVuIHRoZSBVUkwncyB3aWxsIGJlIGEgYml0IHNpbXBsZXI6CiAgIGh0dHA6Ly93d3cuZ2F0ZXdheS5lYXN0L3ZuYy9ob3N0MgogICBodHRwOi8vd3d3LmdhdGV3YXkuZWFzdC92bmMvdHJ1c3QvaG9zdDIKCiAgIGV0Yy4KCiAgIEJlc2lkZXMgODAgb25lIGNvdWxkIHVzZSBhbnkgb3RoZXIgcmFuZG9tIHBvcnQgbnVtYmVyIChzaW5jZSB0aGVyZSBhcmUKICAgc28gbWFueSBwb3J0IHNjYW5zIG9uIDgwLCBhIGxpdHRsZSBvYnNjdXJpdHkgbWlnaHQgYmUgdXNlZnVsKS4KCiAgIE9uZSBvcHRpb24gaXMgdG8gdXNlIHBvcnQgIjQ0MyIgKHRoZSBkZWZhdWx0IGh0dHBzOi8vIHBvcnQpIGluc3RlYWQgb2YKICAgIjU2MyIuIEluIHRoaXMgY2FzZSBBcGFjaGUgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIG1vZF9zc2w7IHdlIGp1c3QKICAgaGFwcGVuIHRvIHVzZSBwb3J0ICI0NDMiIGluIHRoZSB3YXkgYW55IHJhbmRvbSBwb3J0IHdvdWxkIGJlIHVzZWQuCiAgIFRoaXMgY291bGQgYmUgaGFuZHkgaWYgdGhlIFZpZXdlciBzaWRlIGVudmlyb25tZW50IGlzIHJlc3RyaWN0aXZlIGluCiAgIHRoYXQgaXQgb25seSBhbGxvd3Mgb3V0Z29pbmcgY29ubmVjdGlvbnMgdG8gcG9ydHMgODAgYW5kIDQ0MyAoYW5kLAogICBzYXksIHlvdSBkaWRuJ3Qgd2FudCB0byB1c2UgcG9ydCA4MCwgb3IgeW91IHdhbnRlZCB0byB1c2UgODAgZm9yCiAgIHNvbWV0aGluZyBlbHNlKS4gQW5vdGhlciByZWFzb24gZm9yIHVzaW5nIDQ0MyB3b3VsZCBiZSBzb21lIHdlYiBwcm94eQogICBlbnZpcm9ubWVudHMgb25seSBhbGxvdyB0aGUgQ09OTkVDVCBtZXRob2QgdG8gZ28gdG8gcG9ydCA0NDMgKGFuZCBub3QKICAgZXZlbiB0aGUgY2FzZSA1NjMgd2UgdXNlIGFib3ZlKS4KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIERldGFpbHM6CgogICBMZXQncyBnbyB0aHJvdWdoIHRoZSBodHRwZC5jb25mIGFkZGl0aW9ucyBpbiBkZXRhaWwgZnJvbSB0aGUgdG9wLgoKICAgVGhlIExvYWRNb2R1bGVzIGRpcmVjdGl2ZXMgbG9hZCB0aGUgbmVjZXNzYXJ5IGFwYWNoZSBtb2R1bGVzLiBOb3RlCiAgIHRoYXQgbW9kX3Jld3JpdGUgbXVzdCBiZSBsaXN0ZWQgZmlyc3QuIElmIHlvdSBhcmUgY29tcGlsaW5nIGZyb20KICAgc2NyYXRjaCBzb21ldGhpbmcgbGlrZSB0aGlzIHdvcmtlZCBmb3IgdXM6CiAgLi9jb25maWd1cmUgLS1lbmFibGUtcHJveHk9c2hhcmVkIC0tZW5hYmxlLXByb3h5LWNvbm5lY3Q9c2hhcmVkIC0tZW5hYmxlLXNzbD0Kc2hhcmVkIC0tZW5hYmxlLXJld3JpdGU9c2hhcmVkIC0tcHJlZml4PS9kaXN0L2FwYWNoZQoKICAgVGhlbiB0aGUgVmlydHVhbEhvc3QgKjo1NjMgdmlydHVhbCBob3N0IHNlY3Rpb24gc3RhcnRzLgoKICAgVGhlICJQcm94eVJlcXVlc3RzIE9uIiBhbmQgIkFsbG93Q09OTkVDVCA1OTE1IiBlbmFibGUgdGhlIHdlYiBzZXJ2ZXIKICAgdG8gZm9yd2FyZCBwcm94eSByZXF1ZXN0cyB0byBwb3J0IDU5MTUgKGFuZCBvbmx5IHRoaXMgcG9ydCkgSU5TSURFIHRoZQogICBmaXJld2FsbC4gVGhpbmsgYWJvdXQgdGhlIGltcGxpY2F0aW9ucyBvZiB0aGlzIHRob3JvdWdobHkgYW5kIHRlc3QgaXQKICAgY2FyZWZ1bGx5LgoKICAgVGhlIFJld3JpdGVSdWxlJ3MgYXJlIGZvciBjb252ZW5pZW5jZSBvbmx5IHNvIHRoYXQgdGhlIFVSTCBlbnRlcmVkCiAgIGludG8gdGhlIFdlYiBicm93c2VyIGRvZXMgbm90IG5lZWQgdGhlIHZhcmlvdXMgZXh0cmEgcGFyYW1ldGVycywgZS5nLjoKICAgaHR0cDovL3d3dy5nYXRld2F5LmVhc3Q6NTYzL3ZuYy9ob3N0Mi9pbmRleC52bmM/Q09OTkVDVD1ob3N0Mis1OTE1JlBPUlQ9NTYzLApibGFoLGJsYWguLi4KCiAgIChvciBvdGhlcndpc2UgbWFrZSBkaXJlY3QgZWRpdHMgdG8gaW5kZXgudm5jIHRvIHNldCB0aGVzZSBwYXJhbWV0ZXJzKS4KICAgVGhlIGZvcmNlUHJveHk9eWVzIHBhcmFtZXRlciBpcyBwYXNzZWQgdG8gdGhlIGFwcGxldCB0byBmb3JjZSB0aGUgdXNlCiAgIG9mIGEgb3V0Z29pbmcgcHJveHkgc29ja2V0IGNvbm5lY3Rpb24uIFVzZSBpdCBvbmx5IGlmIHRoZSBXZWIgYnJvd3NlcgogICBpcyBpbnNpZGUgYSBzZXBhcmF0ZSBXZWIgcHJveHlpbmcgZW52aXJvbm1lbnQgKGkuZS4gbGFyZ2UgY29ycG9yYXRpb24pCgogICBUaGUgcmV3cml0ZXMgd2l0aCBwYXJhbWV0ZXIgdXJsUHJlZml4IGFyZSBkZXNjcmliZWQgdW5kZXIgVHJpY2tzIGZvcgogICBCZXR0ZXIgUmVzcG9uc2UuIFRoZSAidHJ1c3QiIG9uZXMgKGFsc28gZGVzY3JpYmVkIHVuZGVyIFRyaWNrcykgd2l0aAogICB0cnVzdEFsbFZuY0NlcnRzIHRlbGwgdGhlIEphdmEgVk5DIGFwcGxldCB0byBza2lwIGEgZGlhbG9nIGFza2luZwogICBhYm91dCB0aGUgVk5DIENlcnRpZmljYXRlLiBUaGV5IGFyZSBhIGJpdCBmYXN0ZXIgYW5kIG1vcmUgcmVsaWFibGUKICAgdGhhbiB0aGUgb3JpZ2luYWwgbWV0aG9kLiBJbiB0aGUgYmVzdCBzaXR1YXRpb24gdGhleSBsZWFkIHRvIGJlaW5nCiAgIGxvZ2dlZCBpbiAyMCBzZWNvbmRzIG9yIGxlc3MgKHdpdGhvdXQgdGhlbSB0aGUgdGltZSB0byBsb2dpbiBjYW4gYmUKICAgbXVjaCBsb25nZXIgc2luY2UgYSBudW1iZXIgb2YgY29ubmVjdGlvbnMgbXVzdCB0aW1lb3V0KS4KCiAgIEFsbCBvZiB0aGUgeDExdm5jIEphdmEgVmlld2VyIGFwcGxldCBwYXJhbWV0ZXJzIGFyZSBkZXNjcmliZWQgaW4gdGhlCiAgIGZpbGUgY2xhc3Nlcy9zc2wvUkVBRE1FCgogICBUaGUgZXh0ZXJuYWwgZmlsZSAvZGlzdC9hcGFjaGUvY29uZi92bmMuaG9zdHMgY29udGFpbmluZyB0aGUgYWxsb3dlZAogICBWTkMgc2VydmVyIGhvc3RuYW1lcyBpcyByZWFkIGluLiBJdHMgMm5kIGNvbHVtbiBjb250YWlucyB0aGUgVk5DCiAgIGRpc3BsYXkgb2YgdGhlIGhvc3QgKGFsd2F5cyAxNSBpbiBvdXIgZXhhbXBsZTsgaWYgeW91IG1ha2UgaXQgdmFyeSB5b3UKICAgd2lsbCBuZWVkIHRvIGFkanVzdCBzb21lIGxpbmVzIGluIHRoZSBodHRwZC5jb25mIGFjY29yZGluZ2x5LCBlLmcuCiAgIEFsbG93Q09OTkVDVCkuIFRoaXMgbGlzdCBpcyB1c2VkIHRvIGNvbnN0cmFpbiBib3RoIHRoZSBKYXIgZmlsZQogICBkb3dubG9hZCBVUkwgYW5kIHRoZSBwcm94eSBDT05ORUNUIHRoZSBWTkMgdmlld2VyIG1ha2VzIHRvIG9ubHkgdGhlCiAgIGludGVuZGVkIFZOQyBzZXJ2ZXJzLgoKICAgTGltaXRpbmcgdGhlIHByb3h5IENPTk5FQ1QgaXMgZG9uZSB3aXRoIHRoZSB0d28gc2V0cyBvZiBSZXdyaXRlQ29uZAogICBjb25kaXRpb25zLgoKICAgTGltaXRpbmcgdGhlIEphciBmaWxlIGRvd25sb2FkIFVSTCBpcyBkb25lIGluIHRoZSByZW1haW5pbmcgNAogICBSZXdyaXRlUnVsZSdzLgoKICAgTm90ZSB0aGF0IHRoZXNlIGluZGV4LnZuYyBhbmQgVm5jVmlld2VyLmphciBkb3dubG9hZHMgdG8gdGhlIGJyb3dzZXIKICAgYXJlIG5vdCBlbmNyeXB0ZWQgdmlhIFNTTCwgYW5kIHNvIGluIHByaW5jaXBsZSBjb3VsZCBiZSB0YW1wZXJlZCB3aXRoCiAgIGJ5IGEgcmVhbGx5IGJhZCBndXkuIFRoZSBzdWJzZXF1ZW50IFZOQyBjb25uZWN0aW9uLCBob3dldmVyLCBpcwogICBlbmNyeXB0ZWQgdGhyb3VnaCBhIHNpbmdsZSBTU0wgY29ubmVjdGlvbiAoaXQgbWFrZXMgYSBDT05ORUNUIHN0cmFpZ2h0CiAgIHRvIHgxMXZuYykuIFNlZSBiZWxvdyBmb3IgaG93IHRvIGhhdmUgdGhlc2UgaW5pdGlhbCBkb3dubG9hZHMKICAgZW5jcnlwdGVkIGFzIHdlbGwgKGlmIHRoZSBhcGFjaGUgd2ViIHNlcnZlciBoYXMgU1NML21vZF9zc2wsIGkuZS4KICAgaHR0cHMsIGVuYWJsZWQgYW5kIGNvbmZpZ3VyZWQpLgoKICAgVW5mb3J0dW5hdGVseSB0aGUgSmF2YSBWTkMgdmlld2VyIGFwcGxldCBjdXJyZW50bHkgaXMgbm90IGFibGUgdG8gc2F2ZQogICBpdHMgb3duIGxpc3Qgb2YgQ2VydGlmaWNhdGVzIChlLmcuIHRoZSB1c2VyIHNheXMgdHJ1c3QgdGhpcyBWTkMKICAgY2VydGlmaWNhdGUgJ2Fsd2F5cycpLiBUaGlzIGlzIGJlY2F1c2UgYW4gYXBwbGV0IGl0IGNhbm5vdCBvcGVuIGxvY2FsCiAgIGZpbGVzLCBldGMuIFNhZGx5LCB0aGUgYXBwbGV0IGNhbm5vdCBldmVuIHJlbWVtYmVyIGNlcnRpZmljYXRlcyBpbiB0aGUKICAgc2FtZSBicm93c2VyIHNlc3Npb24gYmVjYXVzZSBpdCBpcyBjb21wbGV0ZWx5IHJlaW5pdGlhbGl6ZWQgZm9yIGVhY2gKICAgY29ubmVjdGlvbiAoc2VlIGJlbG93KS4KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFRvbyBNdWNoPwoKICAgSWYgdGhlc2UgYXBhY2hlIHJ1bGVzIGFyZSBhIGxpdHRsZSB0b28gbXVjaCBmb3IgeW91LCB0aGVyZSBpcyBhIGxpdHRsZQogICBiaXQgc2ltcGxlciBzY2hlbWUgd2hlcmUgeW91IGhhdmUgdG8gbGlzdCBlYWNoIG9mIHRoZSBpbmRpdmlkdWFsCiAgIG1hY2hpbmVzIGluIHRoZSBodHRwZC5jb25mIGFuZCBzc2wuY29uZiBmaWxlcy4gSXQgbWF5IGJlIGEgbGl0dGxlIG1vcmUKICAgdHlwaW5nIHRvIG1haW50YWluLCBidXQgcGVyaGFwcyBiZWluZyBtb3JlIHN0cmFpZ2h0IGZvcndhcmQgKGxlc3MKICAgUmV3cml0ZVJ1bGUncykgaXMgZGVzaXJhYmxlLgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgUHJvYmxlbXM/CgogICBUbyBzZWUgZXhhbXBsZSB4MTF2bmMgb3V0cHV0IGZvciBhIHN1Y2Nlc3NmdWwgaHR0cHM6Ly9ob3N0OjU5MDAvCiAgIGNvbm5lY3Rpb24gd2l0aCB0aGUgSmF2YSBBcHBsZXQgc2VlIFRoaXMgUGFnZS4KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFNvbWUgSWRlYXMgZm9yIGFkZGluZyBleHRyYSBhdXRoZW50aWNhdGlvbiwgZXRjLiBmb3IgdGhlIHBhcmFub2lkOgogICAgICogVk5DIHBhc3N3b3JkczogLXJmYmF1dGgsIC1wYXNzd2RmaWxlLCBvciAtdXNlcHcuIEV2ZW4gYWRkaW5nIGEKICAgICAgIHNpbXBsZSBjb21wYW55LXdpZGUgVk5DIHBhc3N3b3JkIGhlbHBzIGJsb2NrIHVud2FudGVkIGFjY2Vzcy4KICAgICAqIFVuaXggcGFzc3dvcmRzOiAtdW5peHB3CiAgICAgKiBTU0wgQ2xpZW50IGNlcnRpZmljYXRlczogLXNzbHZlcmlmeQogICAgICogQXBhY2hlIEF1dGhVc2VyRmlsZSBkaXJlY3RpdmU6IC5odGFjY2VzcywgZXRjLgogICAgICogRmlsdGVyIGNvbm5lY3Rpb25zIGJhc2VkIG9uIElQIGFkZHJlc3Mgb3IgaG9zdG5hbWUuCiAgICAgKiBVc2UgUG9ydC1rbm9ja2luZyBvbiB5b3VyIGZpcmV3YWxsIGFzIGRlc2NyaWJlZCBpbjogRW5oYW5jZWQKICAgICAgIFRpZ2h0Vk5DIFZpZXdlciAoc3N2bmMpLgogICAgICogQWRkIHByb3h5IHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIChyZXF1aXJlcyBWaWV3ZXIgY2hhbmdlcz8pCiAgICAgKiBSdW4gYSBzZXBhcmF0ZSBpbnN0YW5jZSBvZiBBcGFjaGUgdGhhdCBwcm92aWRlcyB0aGlzIFZOQyBzZXJ2aWNlCiAgICAgICBzbyBpdCBjYW4gYmUgYnJvdWdodCB1cCBhbmQgZG93biBpbmRlcGVuZGVudGx5IG9mIHRoZSBub3JtYWwgd2ViCiAgICAgICBzZXJ2ZXIuCiAgICAgKiBIb3cgc2VjdXJlIGlzIHRoZSBDbGllbnQgc2lkZT8gUHVibGljIG1hY2hpbmVzIGluIGludGVybmV0IGNhZmVzLAogICAgICAgZXRjLCBhcmUgb2Z0ZW4gaGFja2VkLCB3aXRoIGJhY2tkb29ycyBhbmQgVk5DIHNlcnZlcnMgb2YgdGhlaXIKICAgICAgIG93bi4gUHJlZmVyIHVzaW5nIHlvdXIgb3duIGZpcmV3YWxsZWQgbGFwdG9wIHRvIGEgcHVibGljIG1hY2hpbmUuCgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgVXNpbmcgbm9uLUphdmEgdmlld2VycyB3aXRoIHRoaXMgc2NoZW1lOgoKICAgVGhlIHNzX3ZuY3ZpZXdlciBzdHVubmVsIHdyYXBwZXIgc2NyaXB0IGZvciBWTkMgdmlld2VycyBoYXMgdGhlIC1wcm94eQogICBvcHRpb24gdGhhdCBjYW4gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyBtZXRob2QuCiAgIHNzX3ZuY3ZpZXdlciAtcHJveHkgd3d3LmdhdGV3YXkuZWFzdDo1NjMgICBob3N0MToxNQoKICAgRm9yIHRoZSBjYXNlIG9mIHRoZSAiZG91YmxlIHByb3h5IiBzaXR1YXRpb24gKHNlZSBiZWxvdykgc3VwcGx5IGJvdGgKICAgc2VwYXJhdGVkIGJ5IGEgY29tbWEuCiAgIHNzX3ZuY3ZpZXdlciAtcHJveHkgcHJveHkxLmZvb2Jhci5jb206ODA4MCx3d3cuZ2F0ZXdheS5lYXN0OjU2MyAgIGhvc3QxOjE1CgogICBGb3IgdGhlIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAoc3N2bmMpIEdVSSAoaXQgdXNlcyBzc192bmN2aWV3ZXIgb24KICAgVW5peCkgcHV0ICdob3N0MToxNScgaW50byB0aGUgJ1ZOQyBTZXJ2ZXInIGVudHJ5IGJveCwgYW5kIGhlcmUgYXJlCiAgIHBvc3NpYmxlIFByb3h5L0dhdGV3YXkgZW50cmllcwogICBQcm94eS9HYXRld2F5OiAgIHd3dy5nYXRld2F5LmVhc3Q6NTYzCiAgIFByb3h5L0dhdGV3YXk6ICAgcHJveHkxLmZvb2Jhci5jb206ODA4MCx3d3cuZ2F0ZXdheS5lYXN0OjU2MwoKICAgdGhlbiBjbGljayBvbiB0aGUgJ0Nvbm5lY3QnIGJ1dHRvbi4KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIERvd25sb2FkaW5nIHRoZSBKYXZhIGFwcGxldCB0byB0aGUgYnJvd3NlciB2aWEgSFRUUFM6CgogICBUbyBoYXZlIHRoZSBKYXZhIGFwcGxldCBkb3dubG9hZGVkIHRvIHRoZSB1c2VyJ3MgV2ViIEJyb3dzZXIgdmlhIGFuCiAgIGVuY3J5cHRlZCAoYW5kIGV2aWRlbnRseSBzYWZlcikgU1NMIGNvbm5lY3Rpb24gdGhlIEFwYWNoZSB3ZWJzZXJ2ZXIKICAgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgZm9yIFNTTCB2aWEgbW9kX3NzbC4KCiAgIEl0IGlzIGFjdHVhbGx5IHBvc3NpYmxlIHRvIHVzZSB0aGUgeDExdm5jIEtleSBNYW5hZ2VtZW50IHV0aWxpdHkKICAgIi1zc2xHZW5DZXJ0IiB0byBnZW5lcmF0ZSB5b3VyIEFwYWNoZS9TU0wgLmNydCBhbmQgLmtleSBmaWxlcy4gKEluCiAgIGJyaWVmLCBydW4gc29tZXRoaW5nIGxpa2UgIngxMXZuYyAtc3NsR2VuQ2VydCBzZXJ2ZXIgc2VsZjphcGFjaGUiIHRoZW4KICAgY29weSB0aGUgcmVzdWx0aW5nIHNlbGY6YXBhY2hlLmNydCBmaWxlIHRvIGNvbmYvc3NsLmNydC9zZXJ2ZXIuY3J0IGFuZAogICBleHRyYWN0IHRoZSBwcml2YXRlIGtleSBwYXJ0IGZyb20gc2VsZjphcGFjaGUucGVtIGFuZCBwYXN0ZSBpdCBpbnRvCiAgIGNvbmYvc3NsLmtleS9zZXJ2ZXIua2V5KS4gU2V0dGluZyB0aGUgZW52IHZhciBSRVFfQVJHUz0nLWRheXMgMTA5NScKICAgYmVmb3JlIHJ1bm5pbmcgeDExdm5jIHdpbGwgYnVtcCB1cCB0aGUgZXhwaXJhdGlvbiBkYXRlICgzIHllYXJzIGluCiAgIHRoaXMgY2FzZSkuCgogICBPciB5b3UgY2FuIHVzZSB0aGUgc3RhbmRhcmQgbWV0aG9kcyBkZXNjcmliZWQgaW4gdGhlIEFwYWNoZSBtb2Rfc3NsCiAgIGRvY3VtZW50YXRpb24gdG8gY3JlYXRlIHlvdXIga2V5cy4gVGhlbiByZXN0YXJ0IEFwYWNoZSwgdXN1YWxseQogICBzb21ldGhpbmcgbGlrZSAiYXBhY2hlY3RsIHN0b3AiIGZvbGxvd2VkIGJ5ICJhcGFjaGVjdGwgc3RhcnRzc2wiCgogICBJbiBhZGRpdGlvbiB0byB0aGUgYWJvdmUgc2VjdGlvbnMgaW4gaHR0cGQuY29uZiBvbmUgc2hvdWxkIGFkZCB0aGUKICAgZm9sbG93aW5nIHRvIHNzbC5jb25mOgogICBTU0xQcm94eUVuZ2luZSAgT24KCiAgIFJld3JpdGVFbmdpbmUgT24KCiAgICMgQ29udmVuaWVuY2UgcnVsZXMgdG8gZXhwYW5kIGFwcGxldCBwYXJhbWV0ZXJzLiAgVGhlc2UgZG8gbm90IGhhdmUgYSB0cmFpbGkKbmcgIi8iCiAgICMKICAgIyAvdm5jICAgaHR0cCBqYXIgZmlsZSBkb3dubG9hZGluZzoKICAgIwogICBSZXdyaXRlUnVsZSAvdm5jLyhbXi9dKykkICAgICAgICAgICAgICAgICAgICAgICAgL3ZuYy8kMS9pbmRleC52bmM/Q09OTkVDVD0kCjErNTkxNSZQT1JUPTU2MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jXzJGXyQxIFtSLE5FLExdCiAgIFJld3JpdGVSdWxlIC92bmMvcHJveHkvKFteL10rKSQgICAgICAgICAgICAgICAgICAvdm5jLyQxL3Byb3h5LnZuYz9DT05ORUNUPSQKMSs1OTE1JlBPUlQ9NTYzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNfMkZfJDEmZm9yY2VQcm94eT15ZXMgW1IsTgpFLExdCiAgICMKICAgIyAod2Ugc2tpcHBlZCB0aGUgInRydXN0IiBvbmVzIGFib3ZlLCBwdXQgdGhlbSBpbiBpZiB5b3UgbGlrZSkKICAgIwogICAjIC92bmNzICBodHRwcyBqYXIgZmlsZSBkb3dubG9hZGluZzoKICAgIwogICBSZXdyaXRlUnVsZSAvdm5jcy8oW14vXSspJCAgICAgICAgICAgICAgICAgICAgICAvdm5jcy8kMS9pbmRleC52bmM/Q09OTkVDVD0kCjErNTkxNSZQT1JUPTU2MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jc18yRl8kMSBbUixORSxMXQogICBSZXdyaXRlUnVsZSAvdm5jcy9wcm94eS8oW14vXSspJCAgICAgICAgICAgICAgICAvdm5jcy8kMS9wcm94eS52bmM/Q09OTkVDVD0kCjErNTkxNSZQT1JUPTU2MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jc18yRl8kMSZmb3JjZVByb3h5PXllcyBbUiwKTkUsbF0KICAgUmV3cml0ZVJ1bGUgL3ZuY3MvdHJ1c3QvKFteL10rKSQgICAgICAgICAgICAgICAgL3ZuY3MvJDEvaW5kZXgudm5jP0NPTk5FQ1Q9JAoxKzU5MTUmUE9SVD01NjMmaHR0cHNQb3J0PTQ0MyZHRVQ9MSZ1cmxQcmVmaXg9XzJGX3ZuY3NfMkZfJDEmdHJ1c3RBbGxWbmNDZXJ0cz15CmVzIFtSLE5FLExdCiAgIFJld3JpdGVSdWxlIC92bmNzL3RydXN0L3Byb3h5LyhbXi9dKykkICAgICAgICAgIC92bmNzLyQxL3Byb3h5LnZuYz9DT05ORUNUPSQKMSs1OTE1JlBPUlQ9NTYzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNzXzJGXyQxJmZvcmNlUHJveHk9eWVzJnRydQpzdEFsbFZuY0NlcnRzPXllcyBbUixORSxMXQoKICAgIyBDb252ZW5pZW5jZSBydWxlcyB1c2VkIGZvciB0aGUgY29ubmVjdF9zd2l0Y2ggaGVscGVyIChyZXF1aXJlcyBMaXN0ZW4gMTI3LgowLjAuMTo0NDMgYWJvdmUpOgogICAjCiAgIFJld3JpdGVSdWxlIC92bmM0NDMvKFteL10rKSQgICAgICAgICAgICAgICAgICAgIC92bmNzLyQxL2luZGV4LnZuYz9DT05ORUNUPSQKMSs1OTE1JlBPUlQ9NDQzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNzXzJGXyQxIFtSLE5FLExdCiAgIFJld3JpdGVSdWxlIC92bmM0NDMvcHJveHkvKFteL10rKSQgICAgICAgICAgICAgIC92bmNzLyQxL3Byb3h5LnZuYz9DT05ORUNUPSQKMSs1OTE1JlBPUlQ9NDQzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNzXzJGXyQxJmZvcmNlUHJveHk9eWVzIFtSLApORSxMXQogICBSZXdyaXRlUnVsZSAvdm5jNDQzL3RydXN0LyhbXi9dKykkICAgICAgICAgICAgICAvdm5jcy8kMS9pbmRleC52bmM/Q09OTkVDVD0kCjErNTkxNSZQT1JUPTQ0MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jc18yRl8kMSZ0cnVzdEFsbFZuY0NlcnRzPXkKZXMgW1IsTkUsTF0KICAgUmV3cml0ZVJ1bGUgL3ZuYzQ0My90cnVzdC9wcm94eS8oW14vXSspJCAgICAgICAgL3ZuY3MvJDEvcHJveHkudm5jP0NPTk5FQ1Q9JAoxKzU5MTUmUE9SVD00NDMmaHR0cHNQb3J0PTQ0MyZHRVQ9MSZ1cmxQcmVmaXg9XzJGX3ZuY3NfMkZfJDEmZm9yY2VQcm94eT15ZXMmdHJ1CnN0QWxsVm5jQ2VydHM9eWVzIFtSLE5FLExdCgogICAjIFJlYWQgaW4gdGhlIGFsbG93ZWQgaG9zdCB0byB2bmMgZGlzcGxheSBtYXBwaW5nIGZpbGUuICBJdCBsb29rcyBsaWtlOgogICAjCiAgICMgICBob3N0MSAgICAgMTUKICAgIyAgIGhvc3QyICAgICAxNQogICAjICAgLi4uCiAgICMKICAgIyB0aGUgZGlzcGxheSAiMTUiIG1lYW5zIDU5MTUgZm9yIFNTTCBWTkMgYW5kIDU4MTUgZm9yIGh0dHAgYXBwbGV0IGRvd25sb2FkLgogICAjCiAgIFJld3JpdGVNYXAgdm5jaG9zdHMgdHh0Oi9kaXN0L2FwYWNoZS9jb25mL3ZuYy5ob3N0cwoKCiAgICMgUmVtYXAgL3ZuYyBhbmQgL3ZuY3MgdG8gdGhlIHByb3h5IGh0dHAgZG93bmxvYWQgKGUuZy4gaHR0cHM6Ly9ob3N0OjU5MTUpCiAgICMKICAgIyBGaXJzdCwgZmFpbCBpZiBpdCBzdGFydHMgd2l0aCB0aGUgc3RyaW5nIC92bmMwOgogICAjCiAgIFJld3JpdGVSdWxlIF4vdm5jMC4qICAgICAgICAgICAgL1ZOQ0ZBSUwgW0YsTF0KICAgIwogICAjIE5leHQsIG1hcCB0aGUgcHJlZml4IHRvIC92bmMwOmhvc3Q6cHJvdG9jb2w6cG9ydAogICAjCiAgIFJld3JpdGVSdWxlIF4vdm5jLyhbXi9dKykvKC4qKSAgL3ZuYzAvJDE6aHR0cDo1OCR7dm5jaG9zdHM6JDF8Tk9URk9VTkR9LyQyCltORV0KICAgUmV3cml0ZVJ1bGUgXi92bmNzLyhbXi9dKykvKC4qKSAvdm5jMC8kMTpodHRwczo1OSR7dm5jaG9zdHM6JDF8Tk9URk9VTkR9LyQyCltORV0KICAgIwogICAjIERyb3AgYW55IG5vdCBmb3VuZDoKICAgIwogICBSZXdyaXRlUnVsZSBeL3ZuYzAuKk5PVEZPVU5ELiogIC9WTkNGQUlMIFtGLExdCgogICAjIENvbnN0cnVjdCB0aGUgcHJveHkgVVJMIGFuZCByZXRyaWV2ZSBpdDoKICAgIwogICBSZXdyaXRlUnVsZSBeL3ZuYzAvKFteL10rKTooW14vXSspOihbXi9dKykvKC4qKSAkMjovLyQxOiQzLyQ0IFtQLE5FLExdCgogICBUaGlzIGlzIGFsbCBpbiB0aGUgIjxWaXJ0dWFsSG9zdCBfZGVmYXVsdF86NDQzPiIgc2VjdGlvbiBvZiBzc2wuY29uZi4KCiAgIFRoZSB1c2VyIGNvdWxkIHRoZW4gcG9pbnQgdGhlIFdlYiBCcm93c2VyIHRvOgogICBodHRwczovL3d3dy5nYXRld2F5LmVhc3Qvdm5jL2hvc3QyCgogICBvcgogICBodHRwczovL3d3dy5nYXRld2F5LmVhc3Qvdm5jL3Byb3h5L2hvc3QyCgogICBmb3IgdGhlICJkb3VibGUgcHJveHkiIGNhc2UuIChJbXBvcnRhbnQ6IGRvIG5vdCBwdXQgYSB0cmFpbGluZyAiLyIgb24KICAgdGhlIFVSTCwgc2luY2UgdGhhdCB3aWxsIGRlZmVhdCB0aGUgUmV3cml0ZVJ1bGVzLikKCiAgIEFzIHdpdGggdGhlIGh0dHBkLmNvbmYgY2FzZSwgdGhlIGV4dGVybmFsIGZpbGUKICAgKC9kaXN0L2FwYWNoZS9jb25mL3ZuYy5ob3N0cyBpbiB0aGUgYWJvdmUgZXhhbXBsZSkgY29udGFpbnMgdGhlCiAgIGhvc3RuYW1lcyBvZiB0aGUgYWxsb3dlZCBWTkMgc2VydmVycy4KCiAgIE5vdGUgdGhhdCBpbnNpZGUgdGhlIGZpcmV3YWxsIHRoZSBKYXZhIGFwcGxldCBkb3dubG9hZCB0cmFmZmljIGlzIG5vdAogICBlbmNyeXB0ZWQgKG9ubHkgb3ZlciB0aGUgSW50ZXJuZXQgaXMgU1NMIHVzZWQpIGZvciB0aGVzZSBjYXNlczoKICAgaHR0cHM6Ly93d3cuZ2F0ZXdheS5lYXN0L3ZuYy9ob3N0MgogICBodHRwczovL3d3dy5nYXRld2F5LmVhc3Qvdm5jL3Byb3h5L2hvc3QyCgogICBIb3dldmVyIGZvciB0aGUgc3BlY2lhbCAidm5jcyIgcnVsZXMgYWJvdmU6CiAgIGh0dHBzOi8vd3d3LmdhdGV3YXkuZWFzdC92bmNzL2hvc3QyCgogICB0aGUgSmF2YSBhcHBsZXQgZG93bmxvYWQgaXMgZW5jcnlwdGVkIHZpYSBTU0wgZm9yIGJvdGggbGVncy4gTm90ZSB0aGF0CiAgIHRoZSB0d28gbGVncyBhcmUgdHdvIHNlcGFyYXRlIFNTTCBzZXNzaW9ucy4gU28gdGhlIGRhdGEgaXMgZGVjcnlwdGVkCiAgIGluc2lkZSBhbiBhcGFjaGUgcHJvY2VzcyBhbmQgcmVlbmNyeXB0ZWQgYnkgdGhlIGFwYWNoZSBwcm9jZXNzIGZvciB0aGUKICAgMm5kIFNTTCBzZXNzaW9uIGluc2lkZSB0aGUgc2FtZSBhcGFjaGUgcHJvY2VzcyAoYSB2ZXJ5IHNtYWxsIGdhcCBvbmUKICAgbWlnaHQgb3Zlcmxvb2spLgoKICAgVGhlICJ2bmNzL3RydXN0IiBvbmVzIGFyZSBsaWtlIHRoZSAidHJ1c3QiIG9uZXMgZGVzY3JpYmVkIGVhcmxpZXIKICAgaHR0cHM6Ly93d3cuZ2F0ZXdheS5lYXN0L3ZuY3MvdHJ1c3QvbWFjaDIKCiAgIGFuZCBzaW1pbGFybHkgZm9yIHRoZSBodHRwc1BvcnQgb25lcy4gU2VlIFRyaWNrcyBmb3IgQmV0dGVyIFJlc3BvbnNlLgoKICAgSW4gYWxsIG9mIHRoZSBhYm92ZSBjYXNlcyB0aGUgVk5DIHRyYWZmaWMgZnJvbSBWaWV3ZXIgdG8geDExdm5jIGlzCiAgIGVuY3J5cHRlZCBlbmQtdG8tZW5kIGluIGEgc2luZ2xlIFNTTCBzZXNzaW9uLCBldmVuIGZvciB0aGUgImRvdWJsZQogICBwcm94eSIgY2FzZSBiZWNhdXNlIHRoZSBDT05ORUNUIG1ldGhvZCBpcyB1c2VkICh0aGVyZSBhcmUgYWN0dWFsbHkgdHdvCiAgIENPTk5FQ1QncyBmb3IgdGhlICJkb3VibGUgcHJveHkiIGNhc2UpLiBUaGlzIHBhcnQgKHRoZSBWTkMgdHJhZmZpYykgaXMKICAgdGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgdG8gaGF2ZSBlbmNyeXB0ZWQuCgogICBOb3RlIHRoYXQgdGhlIENlcnRpZmljYXRlIGRpYWxvZ3MgdGhlIHVzZXIgaGFzIGluIGhpcyB3ZWIgYnJvd3NlciB3aWxsCiAgIGJlIGZvciB0aGUgQXBhY2hlIENlcnRpZmljYXRlLCB3aGlsZSBmb3IgdGhlIEphdmEgYXBwbGV0IGl0IHdpbGwgYmUKICAgdGhlIHgxMXZuYyBjZXJ0aWZpY2F0ZS4KCiAgIE5vdGUgYWxzbyB0aGF0IHlvdSBjYW4gaGF2ZSBBcGFjaGUgc2VydmUgdXAgdGhlIEphciBmaWxlIFZuY1ZpZXdlci5qYXIKICAgYW5kL29yIGluZGV4LnZuYy9wcm94eS52bmMgaW5zdGVhZCBvZiBlYWNoIHgxMXZuYyBpZiB5b3Ugd2FudCB0by4KCiAgIFRoZSBydWxlcyBpbiBzc2wuY29uZiBhcmUgc2ltaWxhciB0byB0aGUgb25lcyBpbiBodHRwZC5jb25mIGFuZCBzbyBhcmUKICAgbm90IGRpc2N1c3NlZCBpbiBkZXRhaWwuIFRoZSBvbmx5IHJlYWxseSBuZXcgdGhpbmcgaXMgdGhlIC92bmNzCiAgIGhhbmRsaW5nIHRvIGRvd25sb2FkIHRoZSBhcHBsZXQgamFyIHZpYSBIVFRQUyBvbiBwb3J0IDU5MTUuCgogICBUaGUgc3BlY2lhbCBlbnRyaWVzICIvdm5jNDQzIiBhcmUgb25seSB1c2VkIGZvciB0aGUgc3BlY2lhbCBoZWxwZXIKICAgcHJvZ3JhbSAoY29ubmVjdF9zd2l0Y2gpIGZvciB0aGUgaHR0cHMgcG9ydCA0NDMgb25seSBtb2RlIGRpc2N1c3NlZAogICBoZXJlLgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgSU5FVEQgYXV0b21hdGlvbjoKCiAgIFRoZSAic2luZ2xlLXBvcnQiIChpLmUuIDU5MTUpIEhUVFBTIGFwcGxldCBkb3dubG9hZCBhbmQgVk5DIGNvbm5lY3Rpb24KICAgYXNwZWN0IHNob3duIGhlcmUgaXMgY29udmVuaWVudCBhbmQgYWxzbyBlbmFibGVzIGhhdmluZyB4MTF2bmMgcnVuIG91dAogICBvZiBpbmV0ZC4gVGhhdCB3YXkgeDExdm5jIGlzIHJ1biBvbiBkZW1hbmQgaW5zdGVhZCBvZiBiZWluZyBydW4gYWxsCiAgIHRoZSB0aW1lICh0aGUgdXNlciBkb2VzIG5vdCBoYXZlIHRvIHJlbWVtYmVyIHRvIHN0YXJ0IGl0KS4gVGhlIGZpcnN0CiAgIGNvbm5lY3Rpb25zIHRvIGluZXRkIGRvd25sb2FkIGluZGV4LnZuYyBhbmQgdGhlIEphciBmaWxlICh2aWEgaHR0cHMpCiAgIGFuZCB0aGUgdGhlIGxhc3QgY29ubmVjdGlvbiB0byBpbmV0ZCBlc3RhYmxpc2hlcyB0aGUgU1NMIFZOQwogICBjb25uZWN0aW9uLiBTaW5jZSB4MTF2bmMgaXMgcmVzdGFydGVkIGZvciBlYWNoIGNvbm5lY3Rpb24sIHRoaXMgd2lsbAogICBiZSBhIGJpdCBzbG93ZXIgdGhhbiB0aGUgbm9ybWFsIHByb2Nlc3MuCgogICBGb3IgZXhhbXBsZSwgdGhlIC9ldGMvaW5ldGQuY29uZiBsaW5lIGNvdWxkIGJlOgogIDU5MTUgc3RyZWFtIHRjcCBub3dhaXQgcm9vdCAvdXNyL3NiaW4vdGNwZCAvdXNyL2xvY2FsL2Jpbi94MTF2bmNfc3NsLnNoCgogICB3aGVyZSB0aGUgc2NyaXB0IHgxMXZuY19zc2wuc2ggbG9va3Mgc29tZXRoaW5nIGxpa2UgdGhpczoKIyEvYmluL3NoCgovdXNyL2xvY2FsL2Jpbi94MTF2bmMgLWluZXRkIC1vYSAvdmFyL2xvZy94MTF2bmMtMTUubG9nIFwKICAgICAgICAtc3NsIFNBVkUgLWh0dHAgLXVuaXhwdyAtbG9jYWxob3N0IFwKICAgICAgICAtZGlzcGxheSA6MCAtYXV0aCAvaG9tZS9USEVfVVNFUi8uWGF1dGhvcml0eQoKICAgd2hlcmUsIGFzIHVzdWFsLCB0aGUgaW5ldGQgbGF1bmNoaW5nIG5lZWRzIHRvIGtub3cgd2hpY2ggdXNlciBpcwogICB0eXBpY2FsbHkgdXNpbmcgdGhlIGRpc3BsYXkgb24gdGhhdCBtYWNoaW5lLiBPbmUgY291bGQgaW1hZ2luZSBnaXZpbmcKICAgZGlmZmVyZW50IHVzZXJzIGRpZmZlcmVudCBwb3J0cywgNTkxNSwgNTkxNiwgZXRjLiB0byBkaXN0aW5ndWlzaCAodGhlbgogICB0aGUgc2NyaXB0IHdvdWxkIG5lZWQgdG8gYmUgcGFzc2VkIHRoZSB1c2VybmFtZSkuIG1vZF9yZXdyaXRlIGNvdWxkIGJlCiAgIHVzZWQgdG8gYXV0b21hdGljYWxseSBtYXAgdXNlcm5hbWUgaW4gdGhlIFVSTCB0byBoaXMgcG9ydCBudW1iZXIuCgogICBBIGJldHRlciB3YXkgaXMgdG8gdXNlIHRoZSAiLWRpc3BsYXkgV0FJVDpjbWQ9RklORERJU1BMQVkiIGZlYXR1cmUgdG8KICAgYXV0b2RldGVjdCB0aGUgdXNlciBhbmQgWGF1dGhvcml0eSBkYXRhOgojIS9iaW4vc2gKCi91c3IvbG9jYWwvYmluL3gxMXZuYyAtaW5ldGQgLW9hIC92YXIvbG9nL3gxMXZuYy0xNS5sb2cgXAogICAgICAgIC1zc2wgU0FWRSAtaHR0cCAtdW5peHB3IC1sb2NhbGhvc3QgLXVzZXJzIHVuaXhwdz0gXAogICAgICAgIC1maW5kCgogICAod2UgaGF2ZSB1c2VkIHRoZSBhbGlhcyAtZmluZCBmb3IgIi1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRESVNQTEFZIi4pCiAgIFRoaXMgd2F5IHRoZSB1c2VyIG11c3Qgc3VwcGx5IGhpcyBVbml4IHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhbmQgdGhlbgogICBoaXMgZGlzcGxheSBhbmQgWGF1dGhvcml0eSBkYXRhIG9uIHRoYXQgbWFjaGluZSB3aWxsIGJlIGxvY2F0ZWQgYW5kCiAgIHJldHVybmVkIHRvIHgxMXZuYyB0byBhbGxvdyBpdCB0byBhdHRhY2guIElmIGhlIGRvZXNuJ3QgaGF2ZSBhIGRpc3BsYXkKICAgcnVubmluZyBvbiB0aGF0IG1hY2hpbmUgb3IgaGUgZmFpbHMgdG8gbG9nIGluIGNvcnJlY3RseSwgdGhlCiAgIGNvbm5lY3Rpb24gd2lsbCBiZSBkcm9wcGVkLgoKICAgVGhlIHZhcmlhbnQgIi1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZIiAoYWxpYXNlZCBieQogICAiLWNyZWF0ZSIpIHdpbGwgYWN0dWFsbHkgY3JlYXRlIGEgKHZpcnR1YWwgb3IgcmVhbCkgWCBzZXJ2ZXIgc2Vzc2lvbgogICBmb3IgdGhlIHVzZXIgaWYgb25lIGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4gU2VlIGhlcmUgZm9yIGRldGFpbHMuCgogICBUbyBlbmFibGUgaW5ldGQgb3BlcmF0aW9uIGZvciB0aGUgbm9uLUhUVFBTIEphdmEgdmlld2VyIGRvd25sb2FkIChwb3J0CiAgIDU4MTUgaW4gdGhlIGFib3ZlIGh0dHBkLmNvbmYgZXhhbXBsZSkgeW91IHdpbGwgbmVlZCB0byBydW4geDExdm5jIGluCiAgIEhUVFBPTkNFIG1vZGUgb24gcG9ydCA1ODE1OiBGb3IgZXhhbXBsZSwgdGhlIC9ldGMvaW5ldGQuY29uZiBsaW5lCiAgIGNvdWxkIGJlOgogIDU4MTUgc3RyZWFtIHRjcCBub3dhaXQgcm9vdCAvdXNyL3NiaW4vdGNwZCAvdXNyL2xvY2FsL2Jpbi94MTF2bmMgXAogICAgICAgLWluZXRkIC1wcm9nIC91c3IvbG9jYWwvYmluL3gxMXZuYyAtb2EgL3Zhci9sb2cveDExdm5jLTE1LmxvZyBcCiAgICAgICAtaHR0cF9zc2wgLWRpc3BsYXkgV0FJVDpjbWQ9SFRUUE9OQ0UKCiAgIHdoZXJlIHRoZSBsb25nIGluZXRkLmNvbmYgbGluZSBoYXMgYmVlbiBzcGxpdC4gTm90ZSBob3cgdGhlIC1odHRwX3NzbAogICB0cmllcyB0byBhdXRvbWF0aWNhbGx5IGZpbmQgdGhlIC4uLi9jbGFzc2VzL3NzbCBzdWJkaXJlY3RvcnkuIFRoaXMKICAgcmVxdWlyZXMgdGhlIC1wcm9nIG9wdGlvbiBhdmFpbGFibGUgaW4geDExdm5jIDAuOC40IChhIHNoZWxsIHNjcmlwdAogICB3cmFwcGVyLCBlLmcuIC91c3IvbG9jYWwvYmluL3gxMXZuY19odHRwLnNoIGNhbiBiZSB1c2VkIHRvIHdvcmsgYXJvdW5kCiAgIHRoaXMpLgoKICAgQWxzbyBub3RlIHRoZSB1c2Ugb2YgIi1zc2wgU0FWRSIgYWJvdmUuIFRoaXMgd2F5IGEgc2F2ZWQgc2VydmVyLnBlbSBpcwogICB1c2VkIGZvciBlYWNoIGluZXRkIGludm9jYXRpb24gKHJhdGhlciBnZW5lcmF0aW5nIGEgbmV3IG9uZSBlYWNoIHRpbWUKICAgYXMgaGFwcGVucyBmb3IgIi1zc2wgVE1QIikuIE5vdGUgdGhhdCBpdCBjYW5ub3QgaGF2ZSBhIHByb3RlY3RpbmcKICAgcGFzc3BocmFzZSBiZWNhdXNlIGluZXRkIHdpbGwgbm90IGJlIGFibGUgdG8gc3VwcGx5IGl0LgoKICAgQW5vdGhlciBvcHRpb24gaXM6CiAgNTgxNSBzdHJlYW0gdGNwIG5vd2FpdCByb290IC91c3Ivc2Jpbi90Y3BkIC91c3IvbG9jYWwvYmluL3gxMXZuYyBcCiAgICAgICAtaW5ldGQgLWh0dHBkaXIgL3Vzci9sb2NhbC9zaGFyZS94MTF2bmMvY2xhc3Nlcy9zc2wgXAogICAgICAgLW9hIC92YXIvbG9nL3gxMXZuYy0xNS5sb2cgLWRpc3BsYXkgV0FJVDpjbWQ9SFRUUE9OQ0UKCiAgICh0aGlzIGFsc28gcmVxdWlyZXMgYSBmZWF0dXJlIGZvdW5kIGluIHgxMXZuYyAwLjguNCkuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIE90aGVyIElkZWFzOgoKICAgLSBUaGUgYWJvdmUgc2NoZW1lcyB3b3JrLCBidXQgdGhleSBhcmUgYSBiaXQgY29tcGxpY2F0ZWQgd2l0aCBhbGwgb2YKICAgdGhlIHJpZ2dpbmcuIFRoZXJlIHNob3VsZCBiZSBtb3JlIGVsZWdhbnQgd2F5cyB0byBjb25maWd1cmUgQXBhY2hlIHRvCiAgIGRvIHRoZXNlLCBidXQgd2UgaGF2ZSBub3QgZm91bmQgdGhlbSAocGxlYXNlIGxldCB1cyBrbm93IGlmIHlvdQogICBkaXNjb3ZlciBzb21ldGhpbmcgbmljZSkuIEhvd2V2ZXIsIG9uY2UgdGhpcyBzY2hlbWUgaGFzIGJlZW4gc2V0IHVwCiAgIGFuZCBpcyB3b3JraW5nIGl0IGlzIGVhc3kgdG8gbWFpbnRhaW4gYW5kIGFkZC9kZWxldGUgd29ya3N0YXRpb25zLAogICBldGMuCgogICAtIEluIGdlbmVyYWwgQXBhY2hlIGlzIG5vdCByZXF1aXJlZCwgYnV0IGl0IG1ha2VzIHRoaW5ncyBjb252ZW5pZW50LgogICBUaGUgZmlyZXdhbGwgaXRzZWxmIGNvdWxkIGRvIHRoZSBwb3J0IHJlZGlyZWN0aW9uIHZpYSBpdHMgZmlyZXdhbGwKICAgcnVsZXMuIEV2aWRlbnRseSBkaWZmZXJlbnQgSW50ZXJuZXQtZmFjaW5nIHBvcnRzIHdvdWxkIGJlIHJlcXVpcmVkIGZvcgogICBlYWNoIHdvcmtzdGF0aW9uLiBUaGlzIGNvdWxkIGJlIHNldCB1cCB1c2luZyBpcHRhYmxlcyBydWxlcyBmb3IKICAgZXhhbXBsZS4gSWYgdGhlcmUgd2VyZSBqdXN0IG9uZSBvciB0d28gbWFjaGluZXMgdGhpcyB3b3VsZCBiZSB0aGUKICAgZWFzaWVzdCBtZXRob2QuIEZvciBleGFtcGxlOgogIGlwdGFibGVzIC10IG5hdCAtQSBQUkVST1VUSU5HIC1wIHRjcCAtZCAyNC4zNS40Ni41NyAtLWRwb3J0IDU5MDEgLWogRE5BVCAtLXRvCi1kZXN0aW5hdGlvbiAxOTIuMTY4LjEuMjo1OTE1CiAgaXB0YWJsZXMgLXQgbmF0IC1BIFBSRVJPVVRJTkcgLXAgdGNwIC1kIDI0LjM1LjQ2LjU3IC0tZHBvcnQgNTkwMiAtaiBETkFUIC0tdG8KLWRlc3RpbmF0aW9uIDE5Mi4xNjguMS4zOjU5MTUKCiAgIFdoZXJlIDI0LjM1LjQ2LjU3IGlzIHRoZSBpbnRlcm5ldCBJUCBhZGRyZXNzIG9mIHRoZSBnYXRld2F5LiBJbiB0aGlzCiAgIGV4YW1wbGUgMjQuMzUuNDYuNTc6NTkwMSBpcyByZWRpcmVjdGVkIHRvIHRoZSBpbnRlcm5hbCBtYWNoaW5lCiAgIDE5Mi4xNjguMS4yOjU5MTUgYW5kIDI0LjM1LjQ2LjU3OjU5MDIgaXMgcmVkaXJlY3RlZCB0byBhbm90aGVyCiAgIGludGVybmFsIG1hY2hpbmUgMTkyLjE2OC4xLjM6NTkxNSwgYm90aCBydW5uaW5nIHgxMXZuYyAtc3NsIC4uLiBpbiBTU0wKICAgbW9kZS4gRm9yIHRoaXMgZXhhbXBsZSwgdGhlIHVzZXIgd291bGQgcG9pbnQgdGhlIHdlYiBicm93c2VyIHRvLCBlLmcuOgogIGh0dHBzOi8vMjQuMzUuNDYuNTc6NTkwMS8/UE9SVD01OTAxCgogICBvciB1c2luZyB0aGUgc3R1bm5lbCB3cmFwcGVyIHNjcmlwdDoKICBzc192bmN2aWV3ZXIgMjQuMzUuNDYuNTc6MQoKICAgT25lIGNhbiBhY2hpZXZlIHNpbWlsYXIgdGhpbmdzIHdpdGggZGVkaWNhdGVkIGZpcmV3YWxsL3JvdXRlcnMgKGUuZy4KICAgTGlua3N5cykgdXNpbmcgdGhlIGRldmljZSdzIHdlYiBvciBvdGhlciBpbnRlcmZhY2UgdG8gY29uZmlndXJlIHRoZQogICBmaXJld2FsbC4KCiAgIElmIHRoZSB1c2VyIG1heSBiZSBjb21pbmcgb3V0IG9mIGEgZmlyZXdhbGwgdXNpbmcgYSBwcm94eSBpdCBtYXkgYmUKICAgYmV0dGVyIHRvIHJlZGlyZWN0IHBvcnRzIDQ0MyBhbmQgNTYzIChpbnN0ZWFkIG9mIDU5MDEgYW5kIDU5MDIpIHRvIHRoZQogICBpbnRlcm5hbCBtYWNoaW5lcyBzbyB0aGF0IHRoZSB1c2VyJ3MgcHJveHkgd2lsbCBhbGxvdyBDT05ORUNUaW5nIHRvCiAgIHRoZW0uCgogICAtIFRoZSByZWRpcmVjdGlvbiBjb3VsZCBhbHNvIGJlIGRvbmUgYXQgdGhlIGFwcGxpY2F0aW9uIGxldmVsIHVzaW5nIGEKICAgVENQIHJlZGlyZWN0IHByb2dyYW0gKGUuZy4gaXBfcmVsYXkgb3IgZmFuY2llciBvbmVzKS4gRXZpZGVudGx5IG1vcmUKICAgY2FyZWZ1bCBpbnRlcm5hbCBob3N0bmFtZSBjaGVja2luZywgZXRjLiwgY291bGQgYmUgcGVyZm9ybWVkIGJ5IHRoZQogICBzcGVjaWFsIHB1cnBvc2UgYXBwbGljYXRpb24gdG8gYWRkIHNlY3VyaXR5LiBTZWUgY29ubmVjdF9zd2l0Y2ggd2hpY2gKICAgaXMgc29tZXdoYXQgcmVsYXRlZC4KCiAgIC0gT25lIG1pZ2h0IGltYWdpbmUgdGhlIFByb3h5UGFzcyBjb3VsZCBiZSBkb25lIGZvciB0aGUgVk5DIHRyYWZmaWMgYXMKICAgd2VsbCAoZm9yIHRoZSBzc2wuY29uZiBjYXNlKSB0byBhdm9pZCB0aGUgQ09OTkVDVCBwcm94eWluZyBjb21wbGV0ZWx5CiAgICh3aGljaCB3b3VsZCBiZSBuaWNlIHRvIGF2b2lkKS4gVW5mb3J0dW5hdGVseSB3ZSB3ZXJlIG5vdCBhYmxlIHRvIGdldAogICB0aGlzIHRvIHdvcmsuIFNpbmNlIEhUVFAgaXMgYSByZXF1ZXN0LXJlc3BvbnNlIHByb3RvY29sIChhcyBvcHBvc2VkIHRvCiAgIGEgZnVsbCBiaWRpcmVjdGlvbmFsIGxpbmsgcmVxdWlyZWQgYnkgVk5DIHRoYXQgQ09OTkVDVCBwcm92aWRlcykgdGhpcwogICBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gZG8uIEl0IG1heSBiZSBwb3NzaWJsZSwgYnV0IHdlIGhhdmVuJ3QgZm91bmQgb3V0CiAgIGhvdyB5ZXQuCgogICBBbGwgb2YgdGhlIHgxMXZuYyBKYXZhIFZpZXdlciBhcHBsZXQgcGFyYW1ldGVycyBhcmUgZGVzY3JpYmVkIGluIHRoZQogICBmaWxlIGNsYXNzZXMvc3NsL1JFQURNRQoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgVHJpY2tzIGZvciBCZXR0ZXIgUmVzcG9uc2UgYW5kIHJlbGlhYmlsaXR5OgoKICAgVGhlICJvcmlnaW5hbCBzY2hlbWUiIHVzaW5nIGh0dHBkLmNvbmYgYW5kIHNzbC5jb25mIHJld3JpdGVzIHdpdGhvdXQKICAgdXJsUHJlZml4IGFuZCB0cnVzdEFsbFZuY0NlcnRzIGFib3ZlIHNob3VsZCB3b3JrIE9LLCBidXQgbWF5IGxlYWQgdG8KICAgc2xvdyBhbmQvb3IgdW5yZWxpYWJsZSBsb2FkaW5nIG9mIHRoZSBhcHBsZXQgYW5kIGZpbmFsIGNvbm5lY3Rpb24gdG8KICAgeDExdm5jLiBUaGUgZm9sbG93aW5nIGFyZSB3aGF0IEkgZG8gbm93IHRvIGdldCBiZXR0ZXIgcmVzcG9uc2UgYW5kCiAgIHJlbGlhYmlsaXR5LiBZTU1WLgoKICAgVGhlIHByb2JsZW0gd2l0aCB0aGUgIm9yaWdpbmFsIHNjaGVtZSIgaXMgdGhhdCB0aGVyZSBpcyBhIHBvaW50IHdoZXJlCiAgIHRoZSBWTkMgVmlld2VyIGFwcGxldCBjYW4gdHJ5IHVwIHRvIDMgdGltZXMgdG8gcmV0cmlldmUgdGhlIHgxMXZuYwogICBjZXJ0aWZpY2F0ZSwgc2luY2UgaXQgbmVlZHMgdG8gZ2V0IGl0IHRvIHNob3cgaXQgdG8geW91IGFuZCBhc2sgeW91IGlmCiAgIHlvdSBhY2NlcHQgaXQuIFRoaXMgY2FuIGFkZCBhYm91dCA0NSBzZWNvbmRzIHRvIHRoZSB3aG9sZSBwcm9jZXNzCiAgICh3aGljaCB0YWtlcyAxIHRvIDEuNSBtaW51dGVzIHdpdGggYWxsIHRoZSBkaWFsb2dzKSBzaW5jZSBhIGNvdXBsZSBvZgogICB0aG9zZSBjb25uZWN0aW9ucyBtdXN0IHRpbWUgb3V0LiBUaGUgInRydXN0IiBpdGVtcyBpbiB0aGUgY29uZmlnIGFkZCBhCiAgIHBhcmFtZXRlciB0cnVzdEFsbFZuY0NlcnRzPXllcyBzaW1pbGFyIHRvIHRoZSBmb3JjZVByb3h5PXllcwogICBwYXJhbWV0ZXIuIFRoaXMgY2FuIGN1dCB0aGUgdG90YWwgdGltZSB0byB0aGUgVk5DIHBhc3N3b3JkIHByb21wdCBkb3duCiAgIHRvIDE1IHNlY29uZHMgd2hpY2ggaXMgcHJldHR5IGdvb2QuIChOb3RlIGJ5IGlnbm9yaW5nIHRoZSBjZXJ0aWZpY2F0ZQogICB0aGlzIGRvZXMgbm90IHByb3RlY3QgYWdhaW5zdCBtYW4taW4tdGhlLW1pZGRsZSBhdHRhY2tzIHdoaWNoIGFyZQogICByYXJlLCBidXQgbWF5YmUgdGhlIHdvbid0IGJlIHNvIHJhcmUgaW4gdGhlIGZ1dHVyZS4uLiBzZWUKICAgZHNuaWZmL3dlYm1pdG0gYW5kIGNhaW4pCgogICBGaXJzdCBtYWtlIHN1cmUgdGhlIHgxMXZuYyBTU0wgY2VydGlmaWNhdGUra2V5IGlzIHRoZSBzYW1lIGFzCiAgIEFwYWNoZSdzLiAob3RoZXJ3aXNlIHlvdSBtYXkgZ2V0IG9uZSBleHRyYSBkaWFsb2cgYW5kL29yIG9uZSBleHRyYQogICBjb25uZWN0aW9uIHRoYXQgaGFzIHRvIHRpbWUgb3V0KS4KCiAgIFRoZSBmb2xsb3dpbmcgUmV3cml0ZVJ1bGUncyBhcmUgdGhlIHNhbWUgbm93IGFkdm9jYXRlZCBpbiB0aGUKICAgaW5zdHJ1Y3Rpb25zIGFib3ZlLgoKICAgVGhlIGh0dHBzUG9ydCBhbmQgdXJsUHJlZml4PSBwYXJhbWV0ZXJzIGdpdmUgaGludHMgdG8gdGhlIGFwcGxldCB0bwogICBpbXByb3ZlIGNvbm5lY3Rpbmc6IFRoaXMgaXMgd2hhdCBnb2VzIGluIGh0dHBkLmNvbmY6CiAgIFJld3JpdGVFbmdpbmUgT24KICAgUmV3cml0ZVJ1bGUgL3ZuYy8oW14vXSspJCAgICAgICAgICAgICAgIC92bmMvJDEvaW5kZXgudm5jP0NPTk5FQ1Q9JDErNTkxNSZQTwpSVD01NjMmdXJsUHJlZml4PV8yRl92bmNfMkZfJDEgW1IsTkVdCiAgIFJld3JpdGVSdWxlIC92bmMvdHJ1c3QvKFteL10rKSQgICAgICAgICAvdm5jLyQxL2luZGV4LnZuYz9DT05ORUNUPSQxKzU5MTUmUE8KUlQ9NTYzJnVybFByZWZpeD1fMkZfdm5jXzJGXyQxJnRydXN0QWxsVm5jQ2VydHM9eWVzIFtSLE5FXQogICBSZXdyaXRlUnVsZSAvdm5jL3Byb3h5LyhbXi9dKykkICAgICAgICAgL3ZuYy8kMS9wcm94eS52bmM/Q09OTkVDVD0kMSs1OTE1JlBPClJUPTU2MyZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSZmb3JjZVByb3h5PXllcyBbUixORV0KICAgUmV3cml0ZVJ1bGUgL3ZuYy90cnVzdC9wcm94eS8oW14vXSspJCAgIC92bmMvJDEvcHJveHkudm5jP0NPTk5FQ1Q9JDErNTkxNSZQTwpSVD01NjMmdXJsUHJlZml4PV8yRl92bmNfMkZfJDEmZm9yY2VQcm94eT15ZXMmdHJ1c3RBbGxWbmNDZXJ0cz15ZXMgW1IsTkVdCgogICBUaGUgaHR0cHNQb3J0IGFuZCB1cmxQcmVmaXggcHJvdmlkZSB1c2VmdWwgaGludHMgdG8gdGhlIFZOQyBWaWV3ZXIKICAgYXBwbGV0IHdoZW4gaXQgY29ubmVjdHMgdG8geDExdm5jIHRvIGdsZWFuIGluZm9ybWF0aW9uIGFib3V0IFByb3hpZXMsCiAgIGNlcnRpZmljYXRlcywgZXRjLgoKICAgVGhpcyBpcyB3aGF0IGdvZXMgaW50byBzc2wuY29uZjoKICAgUmV3cml0ZUVuZ2luZSBPbgogICBSZXdyaXRlUnVsZSAvdm5jLyhbXi9dKykkICAgICAgICAgICAgICAgIC92bmMvJDEvaW5kZXgudm5jP0NPTk5FQ1Q9JDErNTkxNSZQCk9SVD01NjMmaHR0cHNQb3J0PTQ0MyZHRVQ9MSZ1cmxQcmVmaXg9XzJGX3ZuY18yRl8kMSBbUixORV0KICAgUmV3cml0ZVJ1bGUgL3ZuYy9wcm94eS8oW14vXSspJCAgICAgICAgICAvdm5jLyQxL3Byb3h5LnZuYz9DT05ORUNUPSQxKzU5MTUmUApPUlQ9NTYzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNfMkZfJDEmZm9yY2VQcm94eT15ZXMgW1IsTkVdCiAgIFJld3JpdGVSdWxlIC92bmNzLyhbXi9dKykkICAgICAgICAgICAgICAvdm5jcy8kMS9pbmRleC52bmM/Q09OTkVDVD0kMSs1OTE1JlAKT1JUPTU2MyZodHRwc1BvcnQ9NDQzJkdFVD0xJnVybFByZWZpeD1fMkZfdm5jc18yRl8kMSBbUixORV0KICAgUmV3cml0ZVJ1bGUgL3ZuY3MvcHJveHkvKFteL10rKSQgICAgICAgIC92bmNzLyQxL3Byb3h5LnZuYz9DT05ORUNUPSQxKzU5MTUmUApPUlQ9NTYzJmh0dHBzUG9ydD00NDMmR0VUPTEmdXJsUHJlZml4PV8yRl92bmNzXzJGXyQxJmZvcmNlUHJveHk9eWVzIFtSLE5FXQogICBSZXdyaXRlUnVsZSAvdm5jcy90cnVzdC8oW14vXSspJCAgICAgICAgL3ZuY3MvJDEvaW5kZXgudm5jP0NPTk5FQ1Q9JDErNTkxNSZQCk9SVD01NjMmaHR0cHNQb3J0PTQ0MyZHRVQ9MSZ1cmxQcmVmaXg9XzJGX3ZuY3NfMkZfJDEmdHJ1c3RBbGxWbmNDZXJ0cz15ZXMgW1IsTkUKXQogICBSZXdyaXRlUnVsZSAvdm5jcy90cnVzdC9wcm94eS8oW14vXSspJCAgL3ZuY3MvJDEvcHJveHkudm5jP0NPTk5FQ1Q9JDErNTkxNSZQCk9SVD01NjMmaHR0cHNQb3J0PTQ0MyZHRVQ9MSZ1cmxQcmVmaXg9XzJGX3ZuY3NfMkZfJDEmZm9yY2VQcm94eT15ZXMmdHJ1c3RBbGxWbmMKQ2VydHM9eWVzIFtSLE5FXQoKICAgVGhlIHJlc3QgaXMgdGhlIHNhbWUuCgogICBUaGUgaHR0cHNQb3J0IGFuZCB1cmxQcmVmaXggYW5kIEdFVCBwcm92aWRlIHVzZWZ1bCBoaW50cyB0byB0aGUgVk5DCiAgIFZpZXdlciBhcHBsZXQgd2hlbiBpdCBjb25uZWN0cyB0byB4MTF2bmMgdG8gZ2xlYW4gaW5mb3JtYXRpb24gYWJvdXQKICAgUHJveGllcywgY2VydGlmaWNhdGVzLCBldGMsIGFuZCBhbHNvIGZvciB0aGUgdWx0aW1hdGUgVk5DIGNvbm5lY3Rpb24KICAgKEdFVCBzcGVlZHMgdGhpcyB1cCBieSBzZW5kaW5nIGEgc3BlY2lhbCBIVFRQIEdFVCB0byBjYXVzZSB4MTF2bmMgdG8KICAgaW1tZWRpYXRlbHkgc3dpdGNoIHRvIHRoZSBWTkMgcHJvdG9jb2wpLgoKICAgVG8gdHVybiB0aGVzZSBpbnRvIFVSTHMsIGFzIHdhcyBkb25lIGFib3ZlLCB0YWtlIHRoZSBzdHJpbmcgaW4gdGhlCiAgIFJld3JpdGVSdWxlLCBlLmcuIC92bmNzIGFuZCB0dXJuIGl0IGludG8KICAgaHR0cHM6Ly9nYXRld2F5L3ZuY3MvbWFjaGluZW5hbWUgU2ltaWxhcmx5IGZvciBub24taHR0cHM6CiAgIGh0dHA6Ly9nYXRld2F5OjU2My92bmMvbWFjaGluZW5hbWUKCiAgIElmIHlvdSB1c2UgdGhlICd0cnVzdCcgb25lcywgeW91IGFyZSBwZXJmb3JtaW5nIE5PIGNoZWNrcywgdmlzdWFsIG9yCiAgIG90aGVyd2lzZSwgb24gdGhlIFZOQyBTU0wgY2VydGlmaWNhdGUuIEl0IGlzIHRydXN0ZWQgd2l0aG91dCBxdWVzdGlvbi4KICAgVGhpcyBzcGVlZHMgdGhpbmdzIHVwIGJlY2F1c2UgaXQgYXZvaWRzIGEgZGlhbG9nIGFib3V0IGNlcnRpZmljYXRlcywKICAgYnV0IG9mIGNvdXJzZSBoYXMgc29tZSByaXNrIFdSVCBNYW4gaW4gdGhlIE1pZGRsZSBhdHRhY2tzLiBJIGRvbid0CiAgIHJlY29tbWVuZCB0aGVtLiBJdCBpcyBiZXR0ZXIgdG8gdXNlIC92bmMgb3IgL3ZuY3MgYW5kIHRoZSBmaXJzdCB0aW1lCiAgIHlvdSBjb25uZWN0IGNhcmVmdWxseSBjaGVjayB0aGUgQ2VydGlmaWNhdGUgYW5kIHRoZW4gdGVsbCB5b3VyIEJyb3dzZXIKICAgYW5kIEphdmEgVmlydHVhbCBNYWNoaW5lIHRvIHRydXN0IHRoZSBjZXJ0aWZpY2F0ZSAnQWx3YXlzJy4gVGhlbiBpZgogICB5b3UgbGF0ZXIgZ2V0IGFuIHVuZXhwZWN0ZWQgZGlhbG9nLCB5b3Uga25vdyBzb21ldGhpbmcgaXMgd3JvbmcuCiAgIE5lYXJseSBhbHdheXMgaXQgaXMganVzdCBhIGNoYW5nZWQgb3IgZXhwaXJlZCBjZXJ0aWZpY2F0ZSwgYnV0IGJldHRlcgogICBzYWZlIHRoYW4gc29ycnkuLi4KCQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2VuaGFuY2VkX3RpZ2h0dm5jX3ZpZXdlci5odG1sOgoKCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCkVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciAgIChTU1ZOQzogICBTU0wvU1NIIFZOQyB2aWV3ZXIpCgogICAoVG8gRG93bmxvYWRzKSAgKFRvIFF1aWNrIFN0YXJ0KQoKICAgW3Nzdm5jLmdpZl0gW3Nzdm5jX3dpbmRvd3MuZ2lmXSBbc3N2bmNfbWFjb3N4LmdpZl0gLiAuCgoKICAgVGhlIEVuaGFuY2VkIFRpZ2h0Vk5DIFZpZXdlciwgU1NWTkMsIGFkZHMgZW5jcnlwdGlvbiBzZWN1cml0eSB0byBWTkMKICAgY29ubmVjdGlvbnMuCgogICBUaGUgcGFja2FnZSBwcm92aWRlcyBhIEdVSSBmb3IgV2luZG93cywgTWFjIE9TIFgsIGFuZCBVbml4IHRoYXQKICAgYXV0b21hdGljYWxseSBzdGFydHMgdXAgYW4gU1RVTk5FTCBTU0wgdHVubmVsIGZvciBTU0wgb3Igc3NoL3BsaW5rIGZvcgogICBTU0ggY29ubmVjdGlvbnMgdG8gYW55IFZOQyBzZXJ2ZXIsIHN1Y2ggYXMgeDExdm5jLCBhbmQgdGhlbiBsYXVuY2hlcwogICB0aGUgVk5DIFZpZXdlciB0byB1c2UgdGhlIGVuY3J5cHRlZCB0dW5uZWwuCgogICBUaGUgeDExdm5jIHNlcnZlciBoYXMgYnVpbHQtaW4gU1NMIHN1cHBvcnQsIGhvd2V2ZXIgU1NWTkMgY2FuIG1ha2UgU1NMCiAgIGVuY3J5cHRlZCBWTkMgY29ubmVjdGlvbnMgdG8gYW55IFZOQyBTZXJ2ZXIgaWYgdGhleSBhcmUgcnVubmluZyBhbiBTU0wKICAgdHVubmVsLCBzdWNoIGFzIFNUVU5ORUwgb3Igc29jYXQsIGF0IHRoZWlyIGVuZC4gU1NWTkMncyBTU0ggdHVubmVsCiAgIHdpbGwgd29yayB0byBhbnkgVk5DIFNlcnZlciBob3N0IHJ1bm5pbmcgc3NoZCB0aGF0IHlvdSBjYW4gbG9nIGludG8uCgogICBUaGUgRW5oYW5jZWQgVGlnaHRWTkMgVmlld2VyIHBhY2thZ2Ugc3RhcnRlZCBhcyBhIHByb2plY3QgdG8gYWRkIHNvbWUKICAgcGF0Y2hlcyB0byB0aGUgbG9uZyBuZWdsZWN0ZWQgVW5peCBUaWdodFZOQyBWaWV3ZXIuIEhvd2V2ZXIsIG5vdyB0aGUKICAgZnJvbnQtZW5kIEdVSSwgZW5jcnlwdGlvbiwgYW5kIHdyYXBwZXIgc2NyaXB0cyBmZWF0dXJlcyBwb3NzaWJseQogICBvdXR3ZWlnaCB0aGUgVW5peCBUaWdodFZOQyBWaWV3ZXIgaW1wcm92ZW1lbnRzIChzZWUgdGhlIGxpc3RzIGJlbG93IHRvCiAgIGNvbXBhcmUpLgoKICAgVGhlIFNTVk5DIFVuaXggdm5jdmlld2VyIGNhbiBhbHNvIGJlIHJ1biB3aXRob3V0IHRoZSBTU1ZOQyBlbmNyeXB0aW9uCiAgIEdVSSBhcyBhbiBlbmhhbmNlZCByZXBsYWNlbWVudCBmb3IgdGhlIHh2bmN2aWV3ZXIsIHh0aWdodHZuY3ZpZXdlciwKICAgZXRjLiwgdmlld2Vycy4KCiAgIEluIGFkZGl0aW9uIHRvIG5vcm1hbCBTU0wsIFNTVk5DIGFsc28gc3VwcG9ydHMgdGhlIFZlTkNyeXB0IFNTTC9UTFMKICAgYW5kIFZpbm8vQU5PTlRMUyBlbmNyeXB0aW9uIGV4dGVuc2lvbnMgdG8gVk5DIG9uIFVuaXgsIE1hYyBPUyBYLCBhbmQKICAgV2luZG93cy4gVmlhIHRoZSBwcm92aWRlZCBTU1ZOQyBWZU5DcnlwdCBicmlkZ2UsIFZlTkNyeXB0IGFuZCBBTk9OVExTCiAgIGVuY3J5cHRpb24gYWxzbyB3b3JrcyB3aXRoIGFueSB0aGlyZCBwYXJ0eSBWTkMgVmlld2VyIChlLmcuIFJlYWxWTkMsCiAgIFRpZ2h0Vk5DLCBVbHRyYVZOQywgZXRjLi4uKSB5b3Ugc2VsZWN0IHZpYSAnQ2hhbmdlIFZOQyBWaWV3ZXInLgoKICAgVGhlIHNob3J0IG5hbWUgZm9yIHRoaXMgcHJvamVjdCBpcyAic3N2bmMiIGZvciBTU0wvU1NIIFZOQyBWaWV3ZXIuCiAgIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgdG8gc3RhcnQgaXQuCgogICBUaGVyZSBpcyBhIHNpbXBsaWZpZWQgU1NILU9ubHkgbW9kZSAoc3Nodm5jKS4gQW5kIGFuIGV2ZW4gbW9yZQogICBzaW1wbGlmaWVkIFRlcm1pbmFsLVNlcnZpY2VzIG1vZGUgKHRzdm5jKSBmb3IgdXNlIHdpdGggeDExdm5jIG9uIHRoZQogICByZW1vdGUgc2lkZS4KCiAgIFRoZSB0b29sIGhhcyBtYW55IGFkZGl0aW9uYWwgZmVhdHVyZXM7IHNlZSB0aGUgZGVzY3JpcHRpb25zIGJlbG93LgoKICAgSXQgaXMgYSBzZWxmLWNvbnRhaW5lZCBidW5kbGUsIHlvdSBjb3VsZCBjYXJyeSBpdCBhcm91bmQgb24sIHNheSwgYQogICBVU0IgbWVtb3J5IHN0aWNrIC8gZmxhc2ggZHJpdmUgZm9yIHNlY3VyZSBWTkMgdmlld2luZyBmcm9tIGFsbW9zdCBhbnkKICAgbWFjaGluZSwgVW5peCwgTWFjIE9TIFgsIGFuZCBXaW5kb3dzIChhbmQgaWYgeW91IGNyZWF0ZSBhIGRpcmVjdG9yeQogICBuYW1lZCAiSG9tZSIgaW4gdGhlIHRvcGxldmVsIHNzdm5jIGRpcmVjdG9yeSBvbiB0aGUgZHJpdmUgeW91ciBWTkMKICAgcHJvZmlsZXMgYW5kIGNlcnRzIHdpbGwgYmUga2VwdCB0aGVyZSBhcyB3ZWxsKS4gRm9yIFVuaXgsIHRoZXJlIGlzCiAgIGFsc28gYSBjb252ZW50aW9uYWwgc291cmNlIHRhcmJhbGwgdG8gYnVpbGQgYW5kIGluc3RhbGwgaW4gdGhlIG5vcm1hbAogICB3YXkgYW5kIG5vdCB1c2UgYSBwcmUtYnVpbHQgYnVuZGxlLgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIEFubm91bmNlbWVudHM6CgogICBJbXBvcnRhbnQ6IElmIHlvdSBjcmVhdGVkIGFueSBTU0wgY2VydGlmaWNhdGVzIHdpdGggU1NWTkMgKG9yIGFueXRoaW5nCiAgIGVsc2UpIG9uIGEgRGViaWFuIG9yIFVidW50dSBzeXN0ZW0gZnJvbSBTZXB0LiAyMDA2IHRocm91Z2ggTWF5IDIwMDgsCiAgIHRoZW4gdGhvc2Uga2V5cyBhcmUgbGlrZWx5IGV4dHJlbWVseSB3ZWFrIGFuZCBjYW4gYmUgZWFzaWx5IGNyYWNrZWQuCiAgIFRoZSBjZXJ0aWZpY2F0ZSBmaWxlcyBzaG91bGQgYmUgZGVsZXRlZCBhbmQgcmVjcmVhdGVkIG9uIGEgbm9uLURlYmlhbgogICBzeXN0ZW0gb3IgYW4gdXBkYXRlZCBvbmUuIFNlZQogICBodHRwOi8vd3d3LmRlYmlhbi5vcmcvc2VjdXJpdHkvMjAwOC9kc2EtMTU3MSBmb3IgZGV0YWlscy4gVGhlIHNhbWUKICAgYXBwbGllcyB0byBTU0gga2V5cy4KCiAgIFBsZWFzZSByZWFkIHRoaXMgaW5mb3JtYXRpb24gb24gdXNpbmcgU1NWTkMgb24gd29ya3N0YXRpb25zIHdpdGgKICAgVW50cnVzdGVkIExvY2FsIFVzZXJzLgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgIEZlYXR1cmUgTGlzdDoKCiAgIFdyYXBwZXIgc2NyaXB0cyBhbmQgYSB0Y2wvdGsgR1VJIHdlcmUgd3JpdHRlbiB0byBjcmVhdGUgdGhlc2UgZmVhdHVyZXMKICAgZm9yIFVuaXgsIE1hYyBPUyBYLCBhbmQgV2luZG93czoKICAgICAqIFNTTCBzdXBwb3J0IGZvciBjb25uZWN0aW9ucyB1c2luZyB0aGUgYnVuZGxlZCBzdHVubmVsIHByb2dyYW0uCiAgICAgKiBBdXRvbWF0aWMgU1NIIGNvbm5lY3Rpb25zIGZyb20gdGhlIEdVSSAoc3lzdGVtIHNzaCBpcyB1c2VkIG9uIFVuaXgKICAgICAgIGFuZCBNYWNPUyBYOyBidW5kbGVkIHBsaW5rIGlzIHVzZWQgb24gV2luZG93cykKICAgICAqIEFiaWxpdHkgdG8gU2F2ZSBhbmQgTG9hZCBWTkMgcHJvZmlsZXMgZm9yIGRpZmZlcmVudCBob3N0cy4KICAgICAqIFlvdSBjYW4gYWxzbyB1c2UgeW91ciBvd24gVk5DIFZpZXdlciwgZS5nLiBVbHRyYVZOQyBvciBSZWFsVk5DLAogICAgICAgd2l0aCB0aGUgU1NWTkMgZW5jcnlwdGlvbiBHVUkgZnJvbnQtZW5kIGlmIHlvdSBwcmVmZXIuCiAgICAgKiBDcmVhdGUgb3IgSW1wb3J0IFNTTCBDZXJ0aWZpY2F0ZXMgYW5kIFByaXZhdGUgS2V5cy4KICAgICAqIFJldmVyc2UgKHZpZXdlciBsaXN0ZW5pbmcpIFZOQyBjb25uZWN0aW9ucyB2aWEgU1NMIGFuZCBTU0guCiAgICAgKiBWZU5DcnlwdCBTU0wvVExTIFZOQyBlbmNyeXB0aW9uIHN1cHBvcnQgKHVzZWQgYnkgVmVOQ3J5cHQsIFFFTVUsCiAgICAgICBnZ2ksIGxpYnZpcnQvdmlydC1tYW5hZ2VyL3hlbiwgdmluYWdyZS9ndm5jdmlld2VyL2d0ay12bmMpCiAgICAgKiBBTk9OVExTIFNTTC9UTFMgVk5DIGVuY3J5cHRpb24gc3VwcG9ydCAodXNlZCBieSBWaW5vKQogICAgICogVmVOQ3J5cHQgYW5kIEFOT05UTFMgYXJlIGFsc28gZW5hYmxlZCBmb3IgYW55IDNyZCBwYXJ0eSBWTkMgVmlld2VyCiAgICAgICAoZS5nLiBSZWFsVk5DLCBUaWdodFZOQywgVWx0cmFWTkMgLi4uKSBvbiBVbml4LCBNYWNPU1gsIGFuZAogICAgICAgV2luZG93cyB2aWEgdGhlIHByb3ZpZGVkIFNTVk5DIFZlTkNyeXB0IFZpZXdlciBCcmlkZ2UgdG9vbCAodXNlCiAgICAgICAnQ2hhbmdlIFZOQyBWaWV3ZXInIHRvIHNlbGVjdCB0aGUgb25lIHlvdSB3YW50LikKICAgICAqIFN1cHBvcnQgZm9yIFdlYiBQcm94aWVzLCBTT0NLUyBQcm94aWVzLCBhbmQgdGhlIFVsdHJhVk5DIHJlcGVhdGVyCiAgICAgICBwcm94eSAoZS5nLiByZXBlYXRlcjovL2hvc3Q6cG9ydCtJRDoxMjM0KS4gTXVsdGlwbGUgcHJveGllcyBtYXkgYmUKICAgICAgIGNoYWluZWQgdG9nZXRoZXIgKDMgbWF4KS4KICAgICAqIFN1cHBvcnQgZm9yIFNTSCBHYXRld2F5IGNvbm5lY3Rpb25zIGFuZCBub24tc3RhbmRhcmQgU1NIIHBvcnRzLgogICAgICogQXV0b21hdGljIFNlcnZpY2UgdHVubmVsbGluZyB2aWEgU1NIIGZvciBDVVBTIGFuZCBTTUIgUHJpbnRpbmcsCiAgICAgICBFU0QvQVJUU0QgQXVkaW8sIGFuZCBTTUIgKFdpbmRvd3MvU2FtYmEpIGZpbGVzeXN0ZW0gbW91bnRpbmcuCiAgICAgKiBTZXRzIHVwIGFueSBhZGRpdGlvbmFsIFNTSCBwb3J0IHJlZGlyZWN0aW9ucyB0aGF0IHlvdSB3YW50LgogICAgICogWmVyb2NvbmYgKGFrYSBCb25qb3VyKSBpcyB1c2VkIG9uIFVuaXggYW5kIE1hYyBPUyBYIHRvIGZpbmQgVk5DCiAgICAgICBzZXJ2ZXJzIG9uIHlvdXIgbG9jYWwgbmV0d29yayBpZiB0aGUgYXZhaGktYnJvd3NlIG9yIGRucy1zZAogICAgICAgcHJvZ3JhbSBpcyBhdmFpbGFibGUgYW5kIGluIHlvdXIgUEFUSC4KICAgICAqIFBvcnQgS25vY2tpbmcgZm9yICJjbG9zZWQgcG9ydCIgU1NIL1NTTCBjb25uZWN0aW9ucy4gSW4gYWRkaXRpb24KICAgICAgIHRvIGEgc2ltcGxlIGZpeGVkIHBvcnQgc2VxdWVuY2UgYW5kIG9uZS10aW1lLXBhZCBpbXBsZW1lbnRhdGlvbiwgYQogICAgICAgaG9vayBpcyBhbHNvIHByb3ZpZGVkIHRvIHJ1biBhbnkgcG9ydCBrbm9ja2luZyBjbGllbnQgYmVmb3JlCiAgICAgICBjb25uZWN0aW5nLgogICAgICogU3VwcG9ydCBmb3IgbmF0aXZlIE1hY09TIFggdXNhZ2Ugd2l0aCBidW5kbGVkIENoaWNrZW4gb2YgdGhlIFZOQwogICAgICAgdmlld2VyICh0aGUgVW5peCBYMTEgdmlld2VyIGlzIGFsc28gcHJvdmlkZWQgZm9yIE1hY09TIFgsIGFuZCBpcwogICAgICAgYmV0dGVyIElNSE8uIEl0IGlzIG5vdyB0aGUgZGVmYXVsdCBvbiBNYWNPUyBYLikKICAgICAqIER5bmFtaWMgVk5DIFNlcnZlciBQb3J0IGRldGVybWluYXRpb24gYW5kIHJlZGlyZWN0aW9uICh1c2luZyBzc2gncwogICAgICAgYnVpbHRpbiBTT0NLUyBwcm94eSwgc3NoIC1EKSBmb3Igc2VydmVycyBsaWtlIHgxMXZuYyB0aGF0IHByaW50CiAgICAgICBvdXQgUE9SVD0gYXQgc3RhcnR1cC4KICAgICAqIFVuaXggVXNlcm5hbWUgYW5kIFBhc3N3b3JkIGVudHJ5IGZvciB1c2Ugd2l0aCAieDExdm5jIC11bml4cHciCiAgICAgICB0eXBlIGxvZ2luIGRpYWxvZ3MuCiAgICAgKiBTaW1wbGlmaWVkIG1vZGUgbGF1bmNoZWQgYnkgY29tbWFuZCAic3Nodm5jIiB0aGF0IGlzIFNTSCBPbmx5LgogICAgICogU2ltcGxpZmllZCBtb2RlIGxhdW5jaGVkIGJ5IGNvbW1hbmQgInRzdm5jIiB0aGF0IHByb3ZpZGVzIGEgVk5DCiAgICAgICAiVGVybWluYWwgU2VydmljZXMiIG1vZGUgKHVzZXMgeDExdm5jIG9uIHRoZSByZW1vdGUgc2lkZSkuCiAgICAgKiBJUHY2IHN1cHBvcnQgZm9yIGFsbCBjb25uZWN0aW9uIG1vZGVzIG9uIFVuaXgsIE1hY09TWCwgYW5kCiAgICAgICBXaW5kb3dzLgoKICAgUGF0Y2hlcyB0byBUaWdodFZOQyAxLjMuOSB2bmNfdW5peHNyYyB0cmVlIHdlcmUgY3JlYXRlZCBmb3IgVW5peAogICBUaWdodFZOQyBWaWV3ZXIgaW1wcm92ZW1lbnRzICh0aGVzZSBvbmx5IGFwcGx5IHRvIHRoZSBVbml4IFZOQyB2aWV3ZXIsCiAgIGluY2x1ZGluZyBNYWNPU1ggWFF1YXJ0eik6CiAgICAgKiByZmJOZXdGQlNpemUgVk5DIHN1cHBvcnQgKGR5bmFtaWMgc2NyZWVuIHJlc2l6aW5nKQogICAgICogQ2xpZW50LXNpZGUgU2NhbGluZyBvZiB0aGUgRGVza3RvcCBpbiB0aGUgdmlld2VyLgogICAgICogWlJMRSBWTkMgZW5jb2Rpbmcgc3VwcG9ydCAoUmVhbFZOQydzIGVuY29kaW5nKQogICAgICogU3VwcG9ydCBmb3IgdGhlIFpZV1JMRSBlbmNvZGluZywgYSB3YXZlbGV0IGJhc2VkIGV4dGVuc2lvbiB0byBaUkxFCiAgICAgICB0byBpbXByb3ZlIGNvbXByZXNzaW9uIG9mIG1vdGlvbiB2aWRlbyBhbmQgcGhvdG8gcmVnaW9ucy4KICAgICAqIFR1cmJvVk5DIHN1cHBvcnQgKFZpcnR1YWxHTCdzIG1vZGlmaWVkIFRpZ2h0Vk5DIGVuY29kaW5nOyByZXF1aXJlcwogICAgICAgVHVyYm9KUEVHIGxpYnJhcnkpCiAgICAgKiBQaXBlbGluZWQgVXBkYXRlcyBvZiB0aGUgZnJhbWVidWZmZXIgYXMgaW4gVHVyYm9WTkMgKGFza3MgZm9yIHRoZQogICAgICAgbmV4dCB1cGRhdGUgYmVmb3JlIHRoZSBjdXJyZW50IG9uZSBoYXMgZmluaXNoZWQgZG93bmxvYWRpbmc7IHRoaXMKICAgICAgIGdpdmVzIHNvbWUgc3BlZWR1cCBvbiBoaWdoIGxhdGVuY3kgY29ubmVjdGlvbnMuKQogICAgICogQ3Vyc29yIGFscGhhYmxlbmRpbmcgd2l0aCB4MTF2bmMgYXQgMzJicHAgKC1hbHBoYSBvcHRpb24pCiAgICAgKiBPcHRpb24gIi11bml4cHcgLi4uIiBmb3IgdXNlIHdpdGggIngxMXZuYyAtdW5peHB3IiB0eXBlIGxvZ2luCiAgICAgICBkaWFsb2dzLgogICAgICogU3VwcG9ydCBmb3IgVWx0cmFWTkMgZXh0ZW5zaW9uczogMS9uIFNlcnZlciBzaWRlIHNjYWxpbmcsIFRleHQKICAgICAgIENoYXQsIFNpbmdsZSBXaW5kb3csIERpc2FibGUgU2VydmVyLXNpZGUgSW5wdXQuIEJvdGggVWx0cmFWTkMgYW5kCiAgICAgICB4MTF2bmMgc2VydmVycyBzdXBwb3J0IHRoZXNlIGV4dGVuc2lvbnMuCiAgICAgKiBVbHRyYVZOQyBGaWxlIFRyYW5zZmVyIHZpYSBhbiBhdXhpbGlhcnkgSmF2YSBoZWxwZXIgcHJvZ3JhbSAoamF2YQogICAgICAgbXVzdCBiZSBpbiAkUEFUSCkuIE5vdGUgdGhhdCB0aGUgeDExdm5jIHNlcnZlciBhbHNvIHN1cHBvcnRzCiAgICAgICBVbHRyYVZOQyBmaWxlIHRyYW5zZmVyLgogICAgICogQ29ubmVjdGlvbiBzdXBwb3J0IGZvciB0aGUgVWx0cmFWTkMgcmVwZWF0ZXIgcHJveHkgKC1yZXBlYXRlcgogICAgICAgb3B0aW9uKS4KICAgICAqIFN1cHBvcnQgZm9yIFVsdHJhVk5DIFNpbmdsZSBDbGljayBvcGVyYXRpb24uIChib3RoIHVuZW5jcnlwdGVkOiBTQwogICAgICAgSSwgYW5kIFNTTCBlbmNyeXB0ZWQ6IFNDIElJSSkKICAgICAqIFN1cHBvcnQgZm9yIFVsdHJhVk5DIERTTSBFbmNyeXB0aW9uIFBsdWdpbiBzeW1tZXRyaWMgZW5jcnlwdGlvbgogICAgICAgbW9kZS4gKEFSQzQsIEFFU1YyLCBNU1JDNCwgYW5kIFNlY3VyZVZOQykKICAgICAqIFN1cHBvcnQgZm9yIFVsdHJhVk5DIE1TLUxvZ29uIGF1dGhlbnRpY2F0aW9uIChOT1RFOiB0aGUgVWx0cmFWTkMKICAgICAgIE1TLUxvZ29uIGtleSBleGNoYW5nZSBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IHdlYWs7IGFuIGVhdmVzZHJvcHBlcgogICAgICAgb24gdGhlIG5ldHdvcmsgY2FuIHJlY292ZXIgeW91ciBXaW5kb3dzIHBhc3N3b3JkIGVhc2lseSBpbiBhIGZldwogICAgICAgc2Vjb25kczsgeW91IG5lZWQgdG8gdXNlIGFuIGFkZGl0aW9uYWwgZW5jcnlwdGVkIHR1bm5lbCB3aXRoCiAgICAgICBNUy1Mb2dvbi4pCiAgICAgKiBTdXBwb3J0IGZvciBzeW1tZXRyaWMgZW5jcnlwdGlvbiAoaW5jbHVkaW5nIGJsb3dmaXNoIGFuZCAzZGVzCiAgICAgICBjaXBoZXJzKSB0byBOb24tVWx0cmFWTkMgU2VydmVycy4gQW55IHNlcnZlciB1c2luZyB0aGUgc2FtZQogICAgICAgZW5jcnlwdGlvbiBtZXRob2Qgd2lsbCB3b3JrLCBlLmcuOiAgeDExdm5jIC1lbmMgYmxvd2Zpc2g6Li9teS5rZXkKICAgICAqIEluc3RlYWQgb2YgaG9zdG5hbWU6ZGlzcGxheSBvbmUgY2FuIGFsc28gc3VwcGx5ICJleGVjPWNvbW1hbmQKICAgICAgIGFyZ3MuLi4iIHRvIGNvbm5lY3QgdGhlIHZpZXdlciB0byB0aGUgc3RkaW8gb2YgYW4gZXh0ZXJuYWwgY29tbWFuZAogICAgICAgKGUuZy4gc3R1bm5lbCBvciBzb2NhdCkgcmF0aGVyIHRoYW4gdXNpbmcgYSBUQ1AvSVAgc29ja2V0LiBVbml4CiAgICAgICBkb21haW4gc29ja2V0cywgZS5nLiAvcGF0aC90by91bml4L3NvY2tldCwgYW5kIGEgcHJldmlvdXNseSBvcGVuZWQKICAgICAgIGZpbGUgZGVzY3JpcHRvciBmZD0wLCB3b3JrIHRvby4KICAgICAqIExvY2FsIFBvcnQgUHJvdGVjdGlvbnMgZm9yIFNUVU5ORUwgYW5kIFNTSDogYXZvaWQgaGF2aW5nIGZvciBsb25nCiAgICAgICBwZXJpb2RzIG9mIHRpbWUgYSBsaXN0ZW5pbmcgcG9ydCBvbiB0aGUgdGhlIGxvY2FsIChWTkMgdmlld2VyKQogICAgICAgc2lkZSB0aGF0IHJlZGlyZWN0cyB0byB0aGUgcmVtb3RlIHNpZGUuCiAgICAgKiBSZXZlcnNlICh2aWV3ZXIgbGlzdGVuaW5nKSBWTkMgY29ubmVjdGlvbnMgY2FuIHNob3cgYSBQb3B1cCBkaWFsb2cKICAgICAgIGFza2luZyB3aGV0aGVyIHRvIGFjY2VwdCB0aGUgY29ubmVjdGlvbiBvciBub3QgKC1hY2NlcHRwb3B1cC4pIFRoZQogICAgICAgZXh0cmEgaW5mbyBwcm92aWRlZCBieSBVbHRyYVZOQyBTaW5nbGUgQ2xpY2sgcmV2ZXJzZSBjb25uZWN0aW9ucwogICAgICAgaXMgYWxzbyBzdXBwb3J0ZWQgKC1hY2NlcHRwb3B1cHNjKQogICAgICogRXh0cmVtZWx5IGxvdyBjb2xvciBtb2RlczogNjQgYW5kIDggY29sb3JzIGluIDhicHAKICAgICAgICgtdXNlNjQvLWJncjIyMiwgLXVzZTgvLWJncjExMSkKICAgICAqIE1lZGl1bSBjb2xvciBtb2RlOiAxNmJwcCBtb2RlIG9uIGEgMzJicHAgVmlld2VyIGRpc3BsYXkKICAgICAgICgtMTZicHAvLWJncjU2NSkKICAgICAqIEZvciB1c2Ugd2l0aCB4MTF2bmMncyBjbGllbnQtc2lkZSBjYWNoaW5nIC1uY2FjaGUgbWV0aG9kIHVzZSB0aGUKICAgICAgIGNyb3BwaW5nIG9wdGlvbiAteWNyb3Agbi4gVGhpcyB3aWxsICJoaWRlIiB0aGUgbGFyZ2UgcGl4ZWwgYnVmZmVyCiAgICAgICBjYWNoZSBiZWxvdyB0aGUgYWN0dWFsIGRpc3BsYXkuIFNldCB0byB0aGUgYWN0dWFsIGhlaWdodCBvciB1c2UgLTEKICAgICAgIGZvciBhdXRvZGV0ZWN0aW9uIChhbHNvLCB0YWxsIHNjcmVlbnMsIEggPiAyKlcsIGFyZSBhdXRvZGV0ZWN0ZWQKICAgICAgIGJ5IGRlZmF1bHQpLgogICAgICogRXNjYXBlIEtleXM6IHNwZWNpZnkgYSBzZXQgb2YgbW9kaWZpZXIga2V5cyBzbyB0aGF0IHdoZW4gdGhleSBhcmUKICAgICAgIGFsbCBwcmVzc2VkIGRvd24geW91IGNhbiBpbnZva2UgUG9wdXAgbWVudSBhY3Rpb25zIHZpYSBrZXlzdHJva2VzLgogICAgICAgSS5lLiwgYSBzZXQgb2YgJ0hvdCBLZXlzJy4gT25lIGNhbiBhbHNvIHBhbiAobW92ZSkgdGhlIGRlc2t0b3AKICAgICAgIGluc2lkZSB0aGUgdmlld3BvcnQgdmlhIEFycm93IGtleXMgb3IgYSBtb3VzZSBkcmFnLgogICAgICogU2Nyb2xsYmFyIHdpZHRoIHNldHRpbmc6IC1zYndpZHRoIG4sIHRoZSBkZWZhdWx0IGlzIHZlcnkgdGhpbiwgMgogICAgICAgcGl4ZWxzLCBmb3IgbGVzcyBkaXN0cmFjdGluZyAteWNyb3AgdXNhZ2UuCiAgICAgKiBTZWxlY3Rpb24gdGV4dCBzZW5kaW5nIGFuZCByZWNlaXZpbmcgY2FuIGJlIGZpbmUtdHVuZWQgd2l0aCB0aGUKICAgICAgIC1zZW5kY2xpcGJvYXJkLCAtc2VuZGFsd2F5cywgYW5kIC1yZWN2dGV4dCBvcHRpb25zLgogICAgICogVGlnaHRWTkMgY29tcHJlc3Npb24gYW5kIHF1YWxpdHkgbGV2ZWxzIGFyZSBhdXRvbWF0aWNhbGx5IHNldAogICAgICAgYmFzZWQgb24gb2JzZXJ2ZWQgbmV0d29yayBsYXRlbmN5IChuLmIuIG5vdCBiYW5kd2lkdGguKQogICAgICogSW1wcm92ZW1lbnRzIHRvIHRoZSBQb3B1cCBtZW51LCBhbGwgb2YgdGhlc2UgY2FuIG5vdyBiZSBjaGFuZ2VkCiAgICAgICBkeW5hbWljYWxseSB2aWEgdGhlIG1lbnU6IFZpZXdPbmx5LCBUb2dnbGUgQmVsbCwgQ3Vyc29yU2hhcGUKICAgICAgIHVwZGF0ZXMsIFgxMSBDdXJzb3IsIEN1cnNvciBBbHBoYWJsZW5kaW5nLCBUb2dnbGUgVGlnaHQvWlJMRSwKICAgICAgIFRvZ2dsZSBKUEVHLCBGdWxsQ29sb3IvMTZicHAvOGJwcCAoMjU2LzY0LzggY29sb3JzKSwgR3JleXNjYWxlIGZvcgogICAgICAgbG93IGNvbG9yIG1vZGVzLCBTY2FsaW5nIHRoZSBWaWV3ZXIgcmVzb2x1dGlvbiwgRXNjYXBlIEtleXMsCiAgICAgICBQaXBlbGluZSBVcGRhdGVzLCBhbmQgb3RoZXJzLCBpbmNsdWRpbmcgVWx0cmFWTkMgZXh0ZW5zaW9ucy4KICAgICAqIE1haW50YWlucyBpdHMgb3duIEJhY2tpbmdTdG9yZSBpZiB0aGUgWCBzZXJ2ZXIgZG9lcyBub3QuCiAgICAgKiBUaGUgZGVmYXVsdCBmb3IgbG9jYWxob3N0OjAgY29ubmVjdGlvbnMgaXMgbm90IHJhdyBlbmNvZGluZyBzaW5jZQogICAgICAgc2FtZS1tYWNoaW5lIGNvbm5lY3Rpb25zIGFyZSBwcmV0dHkgcmFyZS4gRGVmYXVsdCBhc3N1bWVzIHlvdSBhcmUKICAgICAgIHVzaW5nIGEgU1NMIG9yIFNTSCB0dW5uZWwuIFVzZSAtcmF3bG9jYWwgdG8gcmV2ZXJ0LgogICAgICogWEdyYWJTZXJ2ZXIgc3VwcG9ydCBmb3IgZnVsbHNjcmVlbiBtb2RlLCBmb3Igb2xkIHdpbmRvdyBtYW5hZ2VycwogICAgICAgKC1ncmFiLy1ncmFiYWxsIG9wdGlvbikuCiAgICAgKiBGaXggZm9yIFBvcHVwIG1lbnUgcG9zaXRpb25pbmcgZm9yIG9sZCB3aW5kb3cgbWFuYWdlcnMgKC1wb3B1cGZpeAogICAgICAgb3B0aW9uKS4KICAgICAqIFRoZSBWTkMgVmlld2VyIHNzdm5jdmlld2VyIHN1cHBvcnRzIElQdjYgbmF0aXZlbHkgKG5vIGhlbHBlcnMKICAgICAgIG5lZWRlZC4pCgogICBUaGUgbGlzdCBvZiAzcmQgcGFydHkgc29mdHdhcmUgYnVuZGxlZCBpbiB0aGUgYXJjaGl2ZSBmaWxlczoKICAgICAqIFRpZ2h0Vk5DIFZpZXdlciAgKHdpbmRvd3MsIHVuaXgsIG1hY29zeCkKICAgICAqIENoaWNrZW4gb2YgdGhlIFZOQyBWaWV3ZXIgIChtYWNvc3gpCiAgICAgKiBTdHVubmVsICAod2luZG93cywgdW5peCwgbWFjb3N4KQogICAgICogUHV0dHkvUGxpbmsvUGFnZWFudCAgKHdpbmRvd3MpCiAgICAgKiBPcGVuU1NMICAod2luZG93cykKICAgICAqIGVzb3VuZCAgKHdpbmRvd3MpCgogICBUaGVzZSBhcmUgYWxsIHNlbGYtY29udGFpbmVkIGluIHRoZSBidW5kbGUgZGlyZWN0b3J5OiB0aGV5IHdpbGwgbm90IGJlCiAgIGluc3RhbGxlZCBvbiB5b3VyIHN5c3RlbS4gSnVzdCB1bi16aXAgb3IgdW4tdGFyIHRoZSBmaWxlIHlvdQogICBkb3dubG9hZGVkIGFuZCBydW4gdGhlIGZyb250ZW5kIHNzdm5jIHN0cmFpZ2h0IGZyb20gaXRzIGRpcmVjdG9yeS4KICAgQWx0ZXJuYXRpdmVseSwgb24gVW5peCB5b3UgY2FuIHVzZSB0aGUgY29udmVudGlvbmFsIHNvdXJjZSB0YXJiYWxsLgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKICAgSGVyZSBpcyB0aGUgUXVpY2sgU3RhcnQgaW5mbyBmcm9tIHRoZSBSRUFETUUgZm9yIGhvdyB0byBzZXR1cCBhbmQgdXNlCiAgIFNTVk5DOgpRdWljayBTdGFydDoKLS0tLS0tLS0tLS0KClVuaXggYW5kIE1hYyBPUyBYOgoKICAgIEluc2lkZSBhIFRlcm1pbmFsIGRvIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcuCgogICAgVW5wYWNrIHRoZSBhcmNoaXZlOgoKICAgICAgICAlIGd6aXAgLWRjIHNzdm5jLTEuMC4yOS50YXIuZ3ogfCB0YXIgeHZmIC0KCiAgICBSdW4gdGhlIEdVSToKCiAgICAgICAgJSAuL3Nzdm5jL1VuaXgvc3N2bmMgICAgICAgICAgICAgICAoZm9yIFVuaXgpCgogICAgICAgICUgLi9zc3ZuYy9NYWNPU1gvc3N2bmMgICAgICAgICAgICAgKGZvciBNYWMgT1MgWCkKCiAgICBUaGUgc21hbGxlciBmaWxlICJzc3ZuY19ub193aW5kb3dzLTEuMC4yOS50YXIuZ3oiCiAgICBjb3VsZCBoYXZlIGJlZW4gdXNlZCBhcyB3ZWxsLgoKICAgIE9uIE1hY09TWCB5b3UgY291bGQgYWxzbyBjbGljayBvbiB0aGUgU1NWTkMgYXBwIGljb24gaW4gdGhlIEZpbmRlci4KCiAgICBPbiBNYWNPU1ggaWYgeW91IGRvbid0IGxpa2UgdGhlIENoaWNrZW4gb2YgdGhlIFZOQyAoZS5nLiBubyBsb2NhbAogICAgY3Vyc29ycywgbm8gc2NyZWVuIHNpemUgcmVzY2FsaW5nLCBhbmQgbm8gcGFzc3dvcmQgcHJvbXB0aW5nKSwgYW5kIHlvdQogICAgaGF2ZSB0aGUgWERhcndpbiBYIHNlcnZlciBpbnN0YWxsZWQsIHlvdSBjYW4gc2V0IERJU1BMQVkgYmVmb3JlIHN0YXJ0aW5nCiAgICBzc3ZuYyAob3IgdHlwZSBESVNQTEFZPS4uLiBpbiBIb3N0OkRpc3AgYW5kIGhpdCBSZXR1cm4pLiAgVGhlbiBvdXIKICAgIGVuaGFuY2VkIFRpZ2h0Vk5DIHZpZXdlciB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiBDT1RWTkMuCiAgICBVcGRhdGU6IHRoZXJlIGlzIG5vdyBhICdVc2UgWDExIHZuY3ZpZXdlciBvbiBNYWNPU1gnIHVuZGVyIE9wdGlvbnMgLi4uCgoKICAgIElmIHlvdSB3YW50IGEgU1NILW9ubHkgdG9vbCAod2l0aG91dCB0aGUgZGlzdHJhY3Rpb25zIG9mIFNTTCkgcnVuCiAgICB0aGUgY29tbWFuZDoKCiAgICAgICAgICAgICAgICBzc2h2bmMKCiAgICBpbnN0ZWFkIG9mICJzc3ZuYyIuICBPciBjbGljayAiU1NILU9ubHkgTW9kZSIgdW5kZXIgT3B0aW9ucy4KICAgIENvbnRyb2wtaCB3aWxsIHRvZ2dsZSBiZXR3ZWVuIHRoZSB0d28gbW9kZXMuCgoKICAgIElmIHlvdSB3YW50IGEgc2ltcGxlIFZOQyBUZXJtaW5hbCBTZXJ2aWNlcyBvbmx5IG1vZGUgKHJlcXVpcmVzIHgxMXZuYwogICAgb24gdGhlIHJlbW90ZSBzZXJ2ZXIpIHJ1biB0aGUgY29tbWFuZDoKCiAgICAgICAgICAgICAgICB0c3ZuYwoKICAgIGluc3RlYWQgb2YgInNzdm5jIi4gIE9yIGNsaWNrICJUZXJtaW5hbCBTZXJ2aWNlcyIgdW5kZXIgT3B0aW9ucy4KICAgIENvbnRyb2wtdCB3aWxsIHRvZ2dsZSBiZXR3ZWVuIHRoZSB0d28gbW9kZXMuCgogICAgInRzdm5jIHByb2ZpbGUtbmFtZSIgYW5kICJ0c3ZuYyB1c2VyQGhvc3RuYW1lIiB3b3JrIHRvby4KCgpVbml4L01hY09TWCBJbnN0YWxsOgoKICAgIFRoZXJlIGlzIG5vIHN0YW5kYXJkIGluc3RhbGwgZm9yIHRoZSBidW5kbGVzLCBidXQgeW91IGNhbiBtYWtlCiAgICBzeW1saW5rcyBsaWtlIHNvOgoKICAgICAgICBjZCAvYS9kaXJlY3RvcnkvaW4vUEFUSAogICAgICAgIGxuIC1zIC9wYXRoL3RvL3Nzdm5jL2Jpbi97cyx0fSogLgoKICAgIE9yIHB1dCAvcGF0aC90by9zc3ZuYy9iaW4sIC9wYXRoL3RvL3Nzdm5jL1VuaXgsIG9yIC9wYXRoL3RvL3Nzdm5jL01hY09TWAogICAgaW4geW91ciBQQVRILgoKICAgIEZvciB0aGUgY29udmVudGlvbmFsIHNvdXJjZSB0YXJiYWxsIGl0IHdpbGwgY29tcGlsZSBhbmQgaW5zdGFsbCwgZS5nLjoKCiAgICAgICBnemlwIC1kYyBzc3ZuYy0xLjAuMjkuc3JjLnRhci5neiB8IHRhciB4dmYgLQogICAgICAgY2Qgc3N2bmMtMS4wLjI5CiAgICAgICBtYWtlIGNvbmZpZwogICAgICAgbWFrZSBhbGwKICAgICAgIG1ha2UgUFJFRklYPS9teS9pbnN0YWxsL2RpciBpbnN0YWxsCgogICAgdGhlbiBoYXZlIC9teS9pbnN0YWxsL2Rpci9iaW4gaW4geW91ciBQQVRILgoKCgpXaW5kb3dzOgoKICAgIFVuemlwLCB1c2luZyBXaW5aaXAgb3IgYSBzaW1pbGFyIHV0aWxpdHksIHRoZSB6aXAgZmlsZToKCiAgICAgICAgc3N2bmMtMS4wLjI5LnppcAoKICAgIFJ1biB0aGUgR1VJLCBlLmcuOgoKICAgICAgICBTdGFydCAtPiBSdW4gLT4gQnJvd3NlCgogICAgYW5kIHRoZW4gbmF2aWdhdGUgdG8KCiAgICAgICAgLi4uL3Nzdm5jL1dpbmRvd3Mvc3N2bmMuZXhlCgogICAgc2VsZWN0IE9wZW4sIGFuZCB0aGVuIE9LIHRvIGxhdW5jaCBpdC4KCiAgICBUaGUgc21hbGxlciBmaWxlICJzc3ZuY193aW5kb3dzX29ubHktMS4wLjI5LnppcCIKICAgIGNvdWxkIGhhdmUgYmVlbiB1c2VkIGFzIHdlbGwuCgogICAgWW91IGNhbiBtYWtlIGEgV2luZG93cyBzaG9ydGN1dCB0byB0aGlzIHByb2dyYW0gaWYgeW91IHdhbnQgdG8uCgogICAgU2VlIHRoZSBXaW5kb3dzL1JFQURNRS50eHQgZm9yIG1vcmUgaW5mby4KCgogICAgSWYgeW91IHdhbnQgYSBTU0gtb25seSB0b29sICh3aXRob3V0IHRoZSBkaXN0cmFjdGlvbnMgb2YgU1NMKSBydW4KICAgIHRoZSBjb21tYW5kOgoKICAgICAgICAgICAgICAgIHNzaHZuYy5iYXQKCiAgICBPciBjbGljayAiU1NILU9ubHkgTW9kZSIgdW5kZXIgT3B0aW9ucy4KCgogICAgSWYgeW91IHdhbnQgYSBzaW1wbGUgVk5DIFRlcm1pbmFsIFNlcnZpY2VzIG9ubHkgbW9kZSAocmVxdWlyZXMgeDExdm5jCiAgICBvbiB0aGUgcmVtb3RlIHNlcnZlcikgcnVuIHRoZSBjb21tYW5kOgoKICAgICAgICAgICAgICAgIHRzdm5jLmJhdAoKICAgIE9yIGNsaWNrICJUZXJtaW5hbCBTZXJ2aWNlcyIgdW5kZXIgT3B0aW9ucy4gIENvbnRyb2wtdCB3aWxsIHRvZ2dsZQogICAgYmV0d2VlbiB0aGUgdHdvIG1vZGVzLiAgInRzdm5jIHByb2ZpbGUtbmFtZSIgYW5kICJ0c3ZuYyB1c2VyQGhvc3RuYW1lIgogICAgd29yayB0b28uCgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBZb3UgY2FuIHJlYWQgYWxsIG9mIHRoZSBTU1ZOQyBHVUkncyBPbmxpbmUgSGVscCBUZXh0IGhlcmUuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFRoZSBidW5kbGUgdW5wYWNrcyBhIGRpcmVjdG9yeS9mb2xkZXIgbmFtZWQ6IHNzdm5jLiBJdCBjb250YWlucyB0aGVzZQogICBwcm9ncmFtcyB0byBsYXVuY2ggdGhlIEdVSToKICAgICAgICBXaW5kb3dzL3Nzdm5jLmV4ZSAgICAgICAgZm9yIFdpbmRvd3MKICAgICAgICBNYWNPU1gvc3N2bmMgICAgICAgICAgICAgZm9yIE1hYyBPUyBYCiAgICAgICAgVW5peC9zc3ZuYyAgICAgICAgICAgICAgIGZvciBVbml4CgogICAodGhlIE1hYyBPUyBYIGFuZCBVbml4IGxhdW5jaGVycyBhcmUgc2ltcGx5IGxpbmtzIHRvIHRoZSBiaW4KICAgZGlyZWN0b3J5KS4gU2VlIHRoZSBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCgogICBUaGUgU1NILU9ubHkgbW9kZSBsYXVuY2hlciBwcm9ncmFtIGhhcyBuYW1lIHNzaHZuYy4gVGhlIFRlcm1pbmFsCiAgIFNlcnZpY2VzIG1vZGUgbGF1bmNoZXIgcHJvZ3JhbSAoYXNzdW1lcyB4MTF2bmMgMC44LjQgb3IgbGF0ZXIgYW5kIFh2ZmIKICAgaW5zdGFsbGVkIG9uIHRoZSBzZXJ2ZXIgbWFjaGluZSkgaGFzIG5hbWUgdHN2bmMuCgogICBUaGUgVmlld2VyIFNTTCBzdXBwb3J0IGlzIGRvbmUgdmlhIGEgd3JhcHBlciBzY3JpcHQgKGJpbi9zc3ZuY19jbWQKICAgdGhhdCBjYWxscyBiaW4vdXRpbC9zc192bmN2aWV3ZXIpIHRoYXQgc3RhcnRzIHVwIHRoZSBTVFVOTkVMIHR1bm5lbAogICBmaXJzdCBhbmQgdGhlbiBzdGFydHMgdGhlIFRpZ2h0Vk5DIHZpZXdlciBwb2ludGVkIGF0IHRoYXQgdHVubmVsLiBUaGUKICAgYmluL3Nzdm5jIHByb2dyYW0gaXMgYSBHVUkgZnJvbnQtZW5kIHRvIHRoYXQgc2NyaXB0LiBTZWUgdGhpcyBGQVEgZm9yCiAgIG1vcmUgZGV0YWlscyBvbiBTU0wgdHVubmVsbGluZy4gSW4gU1NIIGNvbm5lY3Rpb24gbW9kZSwgdGhlIHdyYXBwZXJzCiAgIHN0YXJ0IHVwIFNTSCBhcHByb3ByaWF0ZWx5LgoKCiAgIE1lbW9yeSBTdGljayBVc2FnZTogSWYgeW91IGNyZWF0ZSBhIGRpcmVjdG9yeSBuYW1lZCAiSG9tZSIgaW4gdGhhdAogICB0b3BsZXZlbCBzc3ZuYyBkaXJlY3RvcnkgdGhlbiB0aGF0IHdpbGwgYmUgdXNlZCBhcyB0aGUgYmFzZSBmb3IKICAgc3RvcmluZyBWTkMgcHJvZmlsZXMgYW5kIGNlcnRpZmljYXRlcy4gQWxzbywgZm9yIGNvbnZlbmllbmNlLCBpZiB5b3UKICAgZmlyc3QgcnVuIHRoZSBjb21tYW5kIHdpdGggIi4iIGFzIGFuIGFyZ3VtZW50IChlLmcuICJzc3ZuYyAuIikgaXQgd2lsbAogICBhdXRvbWF0aWNhbGx5IGNyZWF0ZSB0aGUgIkhvbWUiIGRpcmVjdG9yeSBmb3IgeW91LiBUaGlzIGlzIGhhbmR5IGlmCiAgIHlvdSB3YW50IHRvIHBsYWNlIFNTVk5DIG9uIGEgVVNCIGZsYXNoIGRyaXZlIHRoYXQgeW91IGNhcnJ5IGFyb3VuZCBmb3IKICAgbW9iaWxlIHVzZSBhbmQgeW91IHdhbnQgdGhlIHByb2ZpbGVzIHlvdSBjcmVhdGUgdG8gc3RheSB3aXRoIHRoZSBkcml2ZQogICAob3RoZXJ3aXNlIHlvdSdkIGhhdmUgdG8gYnJvd3NlIHRvIHRoZSBkcml2ZSBkaXJlY3RvcnkgZWFjaCB0aW1lIHlvdQogICBsb2FkIG9yIHNhdmUpLgoKICAgT25lIHVzZXIgb24gV2luZG93cyBjcmVhdGVkIGEgQkFUIGZpbGUgdG8gbGF1bmNoIFNTVk5DIGFuZCBuZWVkZWQgdG8KICAgZG8gdGhpcyB0byBnZXQgdGhlIEhvbWUgZGlyZWN0b3J5IGNvcnJlY3Q6CmNkIFxzc3ZuY1xXaW5kb3dzCnN0YXJ0IFxzc3ZuY1xXaW5kb3dzXHNzdm5jLmV4ZQoKICAgKGFuIG9wdGlvbmFsIHByb2ZpbGUgbmFtZSBjYW4gYmUgc3VwcGxpZWQgdG8gdGhlIHNzdm5jLmV4ZSBsaW5lKQoKICAgV0FSTklORzogaWYgeW91IHVzZSBzc3ZuYyBmcm9tIGFuICJJbnRlcm5ldCBDYWZlIiwgaS5lLiBzb21lIHVudHJ1c3RlZAogICBjb21wdXRlciwgcGxlYXNlIGJlIGF3YXJlIHRoYXQgc29tZW9uZSBtYXkgaGF2ZSBzZXQgdXAgdGhhdCBtYWNoaW5lIHRvCiAgIGJlIGNhcHR1cmluZyB5b3VyIGtleXN0cm9rZXMsIGV0Yy4KCgogICBTU0gtT25seSB2ZXJzaW9uOiBUaGUgY29tbWFuZCAic3Nodm5jIiBjYW4gYmUgcnVuIGluc3RlYWQgb2YgInNzdm5jIgogICB0byBnZXQgYW4gU1NILW9ubHkgdmVyc2lvbiBvZiB0aGUgdG9vbDoKCiAgIFtzc2h2bmMuZ2lmXQoKICAgVGhlc2UgYWxzbyB3b3JrOiAic3Nodm5jIG15cHJvZmlsZSIgYW5kICJzc2h2bmMgdXNlckBob3N0bmFtZSIuIFRvCiAgIHN3aXRjaCBmcm9tIHRoZSByZWd1bGFyIFNTVk5DIG1vZGUsIGNsaWNrICJTU0gtT25seSBNb2RlIiB1bmRlcgogICBPcHRpb25zLiBUaGlzIG1vZGUgaXMgbGVzcyBkaXN0cmFjdGluZyBpZiB5b3UgbmV2ZXIgcGxhbiB0byB1c2UgU1NMLAogICBtYW5hZ2UgY2VydGlmaWNhdGVzLCBldGMuCgoKICAgVGVybWluYWwgU2VydmljZXMgT25seTogVGhlIGNvbW1hbmQgInRzdm5jIiBjYW4gYmUgcnVuIGluc3RlYWQgb2YKICAgInNzdm5jIiB0byBnZXQgYSAiVGVybWluYWwgU2VydmljZXMiIG9ubHkgdmVyc2lvbiBvZiB0aGUgdG9vbDoKCiAgIFt0c3ZuYy5naWZdCgogICBUaGVzZSBhbHNvIHdvcms6ICJ0c3ZuYyBteXByb2ZpbGUiIGFuZCAidHN2bmMgdXNlckBob3N0bmFtZSIuIFRvCiAgIHN3aXRjaCBmcm9tIHRoZSByZWd1bGFyIFNTVk5DIG1vZGUsIGNsaWNrICJUZXJtaW5hbCBTZXJ2aWNlcyIgdW5kZXIKICAgT3B0aW9ucy4KCiAgIFRoaXMgbW9kZSByZXF1aXJlcyB4MTF2bmMgKDAuOS4zIG9yIGxhdGVyKSBpbnN0YWxsZWQgb24gdGhlIHJlbW90ZQogICBtYWNoaW5lIHRvIGZpbmQsIGNyZWF0ZSwgYW5kIG1hbmFnZSB0aGUgdXNlciBzZXNzaW9ucy4gU1NIIGlzIHVzZWQgdG8KICAgY3JlYXRlIHRoZSBlbmNyeXB0ZWQgYW5kIGF1dGhlbnRpY2F0ZWQgdHVubmVsLiBUaGUgWHZmYiAodmlydHVhbAogICBmcmFtZWJ1ZmZlciBYIHNlcnZlcikgcHJvZ3JhbSBtdXN0IGFsc28gYmUgaW5zdGFsbGVkIG9uIHRoZSByZW1vdGUKICAgc3lzdGVtLiBIb3dldmVyIHRzdm5jIHdpbGwgYWxzbyBjb25uZWN0IHRvIGEgcmVhbCBYIHNlc3Npb24gKGkuZS4gb24KICAgdGhlIHBoeXNpY2FsIGhhcmR3YXJlKSBpZiB5b3UgYXJlIGFscmVhZHkgbG9nZ2VkIGludG8gdGhlIFggc2Vzc2lvbjsKICAgdGhpcyBpcyBhIHVzZWZ1bCBhY2Nlc3MgbW9kZSBhbmQgZG9lcyBub3QgcmVxdWlyZSBYdmZiIG9uIHRoZSByZW1vdGUKICAgc3lzdGVtLgoKICAgVGhpcyBtb2RlIHNob3VsZCBiZSB2ZXJ5IGVhc3kgZm9yIGJlZ2lubmVyIHVzZXJzIHRvIHVuZGVyc3RhbmQgYW5kCiAgIHVzZS4gT24gdGhlIHJlbW90ZSBlbmQgeW91IG9ubHkgbmVlZCB0byBoYXZlIHgxMXZuYyBhbmQgWHZmYiBhdmFpbGFibGUKICAgaW4gJFBBVEgsIGFuZCBvbiB0aGUgbG9jYWwgZW5kIHlvdSBqdXN0IHJ1biBzb21ldGhpbmcgbGlrZToKICAgdHN2bmMgbXluYW1lQG15aG9zdC5jb20KCiAgIChvciBzdGFydCB1cCB0aGUgdHN2bmMgR1VJIGZpcnN0IGFuZCB0aGVuIGVudGVyIG15bmFtZUBteWhvc3QuY29tIGFuZAogICBwcmVzcyAiQ29ubmVjdCIpLgoKICAgTm9ybWFsbHkgdGhlIFRlcm1pbmFsIFNlcnZpY2VzIHNlc3Npb25zIGNyZWF0ZWQgYXJlIHZpcnR1YWwgKFJBTS1vbmx5KQogICBvbmVzIChlLmcuIFh2ZmIsIFhkdW1teSwgb3IgWHZuYyksIGhvd2V2ZXIgYSBuaWNlIGZlYXR1cmUgaXMgaWYgeW91CiAgIGhhdmUgYSByZWd1bGFyIFggc2Vzc2lvbiAoaS5lIGRpc3BsYXlpbmcgb24gdGhlIHBoeXNpY2FsIGhhcmR3YXJlKSBvbgogICB0aGUgcmVtb3RlIG1hY2hpbmUgdGhhdCB5b3UgYXJlIEFMUkVBRFkgbG9nZ2VkIGludG8sIHRoZW4gdGhlIHgxMXZuYwogICBydW4gZnJvbSB0c3ZuYyB3aWxsIGZpbmQgaXQgZm9yIHlvdSBhcyB3ZWxsLgoKICAgQWxzbywgdGhlcmUgaXMgc2V0dGluZyAiWCBMb2dpbiIgdW5kZXIgQWR2YW5jZWQgT3B0aW9ucyB0aGF0IGFsbG93cwogICB5b3UgdG8gYXR0YWNoIHRvIGEgcmVhbCBYIHNlcnZlciB3aXRoIG5vIG9uZSBsb2dnZWQgaW4geWV0IChpLmUuCiAgIFhETS9HRE0vS0RNIExvZ2luIEdyZWV0ZXIgc2NyZWVuKSBhcyBsb25nIGFzIHlvdSBoYXZlIHN1ZG8oMSkKICAgcGVybWlzc2lvbiBvbiB0aGUgcmVtb3RlIG1hY2hpbmUuCgogICBOaWNlIGZlYXR1cmVzIHRvIHNvb24gdG8gYmUgYWRkZWQgdG8gdGhlIHRzdm5jIG1vZGUgYXJlIGVhc3kgQ1VQUwogICBwcmludGluZyAod29ya2luZyBmYWlybHkgd2VsbCkgYW5kIFNvdW5kIHJlZGlyZWN0aW9uIChuZWVkcyBtdWNoIHdvcmspCiAgIG9mIHRoZSBUZXJtaW5hbCBTZXJ2aWNlcyBEZXNrdG9wIHNlc3Npb24uIEl0IGlzIGVhc2llciBpbiB0c3ZuYyBtb2RlCiAgIGJlY2F1c2UgdGhlIGVudGlyZSBkZXNrdG9wIHNlc3Npb24gY2FuIGJlIHN0YXJ0ZWQgd2l0aCB0aGUgY29ycmVjdAogICBlbnZpcm9ubWVudC4gc3N2bmMgdHJpZXMgdG8gaGFuZGxlIHRoZSBnZW5lcmFsIGNhc2Ugb2YgYW4gYWxyZWFkeQogICBzdGFydGVkIGRlc2t0b3AgYW5kIHRoYXQgaXMgbW9yZSBkaWZmaWN1bHQuCgoKICAgUHJveGllczogV2ViIHByb3hpZXMsIFNPQ0tTIHByb3hpZXMsIGFuZCB0aGUgVWx0cmFWTkMgcmVwZWF0ZXIgcHJveHkKICAgYXJlIHN1cHBvcnRlZCB0byBhbGxvdyB0aGUgU1NWTkMgY29ubmVjdGlvbiB0byBnbyB0aHJvdWdoIHRoZSBwcm94eSB0bwogICB0aGUgb3RoZXJ3aXNlIHVucmVhY2hhYmxlIFZOQyBTZXJ2ZXIuIFNTSCBnYXRld2F5IG1hY2hpbmVzIGNhbiBiZSB1c2VkCiAgIGluIHRoZSBzYW1lIHdheS4gUmVhZCBtb3JlIGFib3V0IFNTVk5DIHByb3h5IHN1cHBvcnQgaGVyZS4KCgogICBEeW5hbWljIFZOQyBTZXJ2ZXIgUG9ydCBkZXRlcm1pbmF0aW9uOiBJZiB5b3UgYXJlIHJ1bm5pbmcgU1NWTkMgb24KICAgVW5peCBhbmQgYXJlIHVzaW5nIFNTSCB0byBzdGFydCB0aGUgcmVtb3RlIFZOQyBzZXJ2ZXIgYW5kIHRoZSBWTkMKICAgc2VydmVyIHByaW50cyBvdXQgdGhlIGxpbmUgIlBPUlQ9Tk5OTiIgdG8gaW5kaWNhdGUgd2hpY2ggZHluYW1pYyBwb3J0CiAgIGl0IGlzIHVzaW5nICh4MTF2bmMgZG9lcyB0aGlzKSwgdGhlbiBpZiB5b3UgcHJlZml4IHRoZSBTU0ggY29tbWFuZAogICB3aXRoICJQT1JUPSIgU1NWTkMgd2lsbCB3YXRjaCBmb3IgdGhlIFBPUlQ9Tk5OTiBsaW5lIGFuZCB1c2VzIHNzaCdzCiAgIGJ1aWx0IGluIFNPQ0tTIHByb3h5IChzc2ggLUQgLi4uKSB0byBjb25uZWN0IHRvIHRoZSBkeW5hbWljIFZOQyBzZXJ2ZXIKICAgcG9ydCB0aHJvdWdoIHRoZSBTU0ggdHVubmVsLiBGb3IgZXhhbXBsZToKICAgICAgICBWTkMgSG9zdDpEaXNwbGF5ICAgICB1c2VyQHNvbWVob3N0LmNvbQogICAgICAgIFJlbW90ZSBTU0ggQ29tbWFuZDogIFBPUlQ9IHgxMXZuYyAtZmluZAoKICAgb3IgIlBPUlQ9IHgxMXZuYyAtZGlzcGxheSA6MCAtbG9jYWxob3N0IiwgZXRjLiBPciB1c2UgIlA9IHgxMXZuYyAuLi4iCgogICBUaGVyZSBpcyBhbHNvIGNvZGUgdG8gZGV0ZWN0IHRoZSBkaXNwbGF5IG9mIHRoZSByZWd1bGFyIFVuaXgKICAgdm5jc2VydmVyKDEpLiBJdCBleHRyYWN0cyB0aGUgZGlzcGxheSAoYW5kIGhlbmNlIHBvcnQpIGZyb20gdGhlIGxpbmVzCiAgICJOZXcgJ1gnIGRlc2t0b3AgaXMgaG9zdG5hbWU6NCIgYW5kIGFsc28gIlZOQyBzZXJ2ZXIgaXMgYWxyZWFkeQogICBydW5uaW5nIGFzIDo0Ii4gU28geW91IGNhbiB1c2Ugc29tZXRoaW5nIGxpa2U6CiAgICAgICAgUE9SVD0gdm5jc2VydmVyOyBzbGVlcCAxNQpvcjogICAgIFBPUlQ9IHZuY3NlcnZlciA6NDsgc2xlZXAgMTUKCiAgIHRoZSBsYXR0ZXIgaXMgcHJlZmVycmVkIGJlY2F1c2Ugd2hlbiB5b3UgcmVjb25uZWN0IHdpdGggaXQgd2lsbCBmaW5kCiAgIHRoZSBhbHJlYWR5IHJ1bm5pbmcgb25lLiBUaGUgZm9ybWVyIG9uZSB3aWxsIGtlZXAgY3JlYXRpbmcgbmV3IFgKICAgc2Vzc2lvbnMgaWYgY2FsbGVkIHJlcGVhdGVkbHkuCgogICBJZiB5b3UgdXNlIFBPUlQ9IG9uIFdpbmRvd3MsIGEgbGFyZ2UgcmFuZG9tIHBvcnQgaXMgc2VsZWN0ZWQgaW5zdGVhZAogICBhbmQgdGhlIC1yZmJwb3J0IG9wdGlvbiBpcyBwYXNzZWQgdG8geDExdm5jIChpdCBkb2VzIG5vdCB3b3JrIHdpdGgKICAgdm5jc2VydmVyKS4KCgoKICAgUGF0Y2hlcyBmb3IgVW5peCBUaWdodHZuYyB2aWV3ZXI6CgogICBUaGUgcmZiTmV3RkJTaXplIHN1cHBvcnQgYWxsb3dzIHRoZSBlbmhhbmNlZCBUaWdodFZOQyBVbml4IHZpZXdlciB0bwogICByZXNpemUgd2hlbiB0aGUgc2VydmVyIGRvZXMgKGUuZy4gIngxMXZuYyAtUiBzY2FsZT0zLzQiIHJlbW90ZSBjb250cm9sCiAgIGNvbW1hbmQpLgoKICAgVGhlIGN1cnNvciBhbHBoYWJsZW5kaW5nIGlzIGRlc2NyaWJlZCBoZXJlLgoKICAgVGhlIFJlYWxWTkMgWlJMRSBlbmNvZGluZyBpcyBzdXBwb3J0ZWQsIGluIGFkZGl0aW9uIHRvIHNvbWUgbG93IGNvbG9ycwogICBtb2RlcyAoMTZicHAgYW5kIDhicHAgYXQgMjU2LCA2NCwgYW5kIGV2ZW4gOCBjb2xvcnMsIGZvciB1c2Ugb24gdmVyeQogICBzbG93IGNvbm5lY3Rpb25zKS4gR3JleXNjYWxlcyBhcmUgYWxzbyBlbmFibGVkIGZvciB0aGUgbG93IGNvbG9yCiAgIG1vZGVzLgoKICAgVGhlIFBvcHVwIG1lbnUgKEY4KSBpcyBlbmhhbmNlZCB3aXRoIHRoZSBhYmlsaXR5IHRvIGNoYW5nZSBtYW55IHRoaW5ncwogICBvbiB0aGUgZmx5LiBGOSBpcyBhZGRlZCBhcyBhIHNob3J0Y3V0IHRvIHRvZ2dsZSBGdWxsU2NyZWVuIG1vZGUuCgogICBDbGllbnQgU2lkZSBDYWNoaW5nOiBUaGUgeDExdm5jIGNsaWVudC1zaWRlIGNhY2hpbmcgaXMgaGFuZGxlZCBuaWNlbHkKICAgYnkgdGhpcyB2aWV3ZXIuIFRoZSB2ZXJ5IGxhcmdlIHBpeGVsIGNhY2hlIGJlbG93IHRoZSBhY3R1YWwgZGlzcGxheSBpbgogICB0aGlzIGNhY2hpbmcgbWV0aG9kIGlzIGRpc3RyYWN0aW5nLiBPdXIgVW5peCBWTkMgdmlld2VyIHdpbGwKICAgYXV0b21hdGljYWxseSB0cnkgdG8gYXV0b2RldGVjdCB0aGUgYWN0dWFsIGRpc3BsYXkgaGVpZ2h0IGlmIHRoZQogICBmcmFtZWJ1ZmZlciBpcyB2ZXJ5IHRhbGwgKG1vcmUgdGhhbiB0d2ljZSBhcyBoaWdoIGFzIGl0IGlzIHdpZGUpLiBPbmUKICAgY2FuIGFsc28gc2V0IHRoZSBoZWlnaHQgdG8gdGhlIGtub3duIHZhbHVlIHZpYSAteWNyb3Agbiwgb3IgdXNlIC15Y3JvcAogICAtMSB0byBmb3JjZSBhdXRvZGVjdGlvbi4gSW4gZnVsbHNjcmVlbiBtb2RlIG9uZSBpcyBub3QgcG9zc2libGUgdG8KICAgc2Nyb2xsIGRvd24gdG8gdGhlIHBpeGVsIGNhY2hlIHJlZ2lvbi4gSW4gbm9uLWZ1bGxzY3JlZW4gbW9kZSB0aGUKICAgd2luZG93IG1hbmFnZXIgZnJhbWUgaXMgInNocmluay13cmFwcGVkIiBhcm91bmQgdGhlIGFjdHVhbCBzY3JlZW4KICAgZGlzcGxheS4gWW91IGNhbiBzdGlsbCBzY3JvbGwgZG93biB0byB0aGUgcGl4ZWwgY2FjaGUgcmVnaW9uLiBUaGUKICAgc2Nyb2xsYmFycyBhcmUgc2V0IHRvIGJlIHZlcnkgdGhpbiAoMiBwaXhlbHMpIHRvIGJlIGxlc3MgZGlzdHJhY3RpbmcuCiAgIFVzZSB0aGUgLXNid2lkdGggbiB0byBtYWtlIHRoZW0gd2lkZXIuCgogICBQcm9iYWJseSBub2JvZHkgaXMgaW50ZXJlc3RlZCBpbiB0aGUgZ3JhYnNlcnZlciBwYXRjaCBmb3Igb2xkIHdpbmRvdwogICBtYW5hZ2VycyB3aGVuIHRoZSB2aWV3ZXIgaXMgaW4gZnVsbHNjcmVlbiBtb2RlLi4uIFRoaXMgYW5kIHNvbWUgb3RoZXIKICAgdW5maXhlZCBidWdzIGhhdmUgYmVlbiBmaXhlZCBpbiBvdXIgcGF0Y2hlcyAoZnVsbHNjcmVlbiB0b2dnbGUgd29ya3MKICAgd2l0aCBLREUsIC14MTFjdXJzb3IgaGFzIGJlZW4gZml4ZWQsIGFuZCB0aGUgZG90IGN1cnNvciBoYXMgYmVlbiBtYWRlCiAgIHNtYWxsZXIpLgoKICAgRnJvbSB0aGUgLWhlbHAgb3V0cHV0OgpTU1ZOQyBWaWV3ZXIgKGJhc2VkIG9uIFRpZ2h0Vk5DIHZpZXdlciB2ZXJzaW9uIDEuMy45KQoKVXNhZ2U6IHZuY3ZpZXdlciBbPE9QVElPTlM+XSBbPEhPU1Q+XVs6PERJU1BMQVkjPl0KICAgICAgIHZuY3ZpZXdlciBbPE9QVElPTlM+XSBbPEhPU1Q+XVs6OjxQT1JUIz5dCiAgICAgICB2bmN2aWV3ZXIgWzxPUFRJT05TPl0gZXhlYz1bQ01EIEFSR1MuLi5dCiAgICAgICB2bmN2aWV3ZXIgWzxPUFRJT05TPl0gZmQ9bgogICAgICAgdm5jdmlld2VyIFs8T1BUSU9OUz5dIC9wYXRoL3RvL3VuaXgvc29ja2V0CiAgICAgICB2bmN2aWV3ZXIgWzxPUFRJT05TPl0gLWxpc3RlbiBbPERJU1BMQVkjPl0KICAgICAgIHZuY3ZpZXdlciAtaGVscAoKPE9QVElPTlM+IGFyZSBzdGFuZGFyZCBYdCBvcHRpb25zLCBvcjoKICAgICAgICAtdmlhIDxHQVRFV0FZPgogICAgICAgIC1zaGFyZWQgKHNldCBieSBkZWZhdWx0KQogICAgICAgIC1ub3NoYXJlZAogICAgICAgIC12aWV3b25seQogICAgICAgIC1mdWxsc2NyZWVuCiAgICAgICAgLW5vcmFpc2VvbmJlZXAKICAgICAgICAtcGFzc3dkIDxQQVNTV0QtRklMRU5BTUU+IChzdGFuZGFyZCBWTkMgYXV0aGVudGljYXRpb24pCiAgICAgICAgLXVzZXIgPFVTRVJOQU1FPiAoVW5peCBsb2dpbiBhdXRoZW50aWNhdGlvbikKICAgICAgICAtZW5jb2RpbmdzIDxFTkNPRElORy1MSVNUPiAoZS5nLiAidGlnaHQsY29weXJlY3QiKQogICAgICAgIC1iZ3IyMzMKICAgICAgICAtb3duY21hcAogICAgICAgIC10cnVlY29sb3VyCiAgICAgICAgLWRlcHRoIDxERVBUSD4KICAgICAgICAtY29tcHJlc3NsZXZlbCA8Q09NUFJFU1MtVkFMVUU+ICgwLi45OiAwLWZhc3QsIDktYmVzdCkKICAgICAgICAtcXVhbGl0eSA8SlBFRy1RVUFMSVRZLVZBTFVFPiAoMC4uOTogMC1sb3csIDktaGlnaCkKICAgICAgICAtbm9qcGVnCiAgICAgICAgLW5vY3Vyc29yc2hhcGUKICAgICAgICAteDExY3Vyc29yCiAgICAgICAgLWF1dG9wYXNzCgpPcHRpb24gbmFtZXMgbWF5IGJlIGFiYnJldmlhdGVkLCBlLmcuIC1iZ3IgaW5zdGVhZCBvZiAtYmdyMjMzLgpTZWUgdGhlIG1hbnVhbCBwYWdlIGZvciBtb3JlIGluZm9ybWF0aW9uLgoKCkVuaGFuY2VkIFRpZ2h0Vk5DIHZpZXdlciAoU1NWTkMpIG9wdGlvbnM6CgogICBVUkwgaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy9zc3ZuYy5odG1sCgogICBOb3RlOiBaUkxFIGFuZCBaWVdSTEUgZW5jb2RpbmdzIGFyZSBub3cgc3VwcG9ydGVkLgoKICAgTm90ZTogRjkgaXMgc2hvcnRjdXQgdG8gVG9nZ2xlIEZ1bGxTY3JlZW4gbW9kZS4KCiAgIE5vdGU6IEluIC1saXN0ZW4gbW9kZSBzZXQgdGhlIGVudiB2YXIuIFNTVk5DX01VTFRJUExFX0xJU1RFTj0xCiAgICAgICAgIHRvIGFsbG93IG1vcmUgdGhhbiBvbmUgaW5jb21pbmcgVk5DIHNlcnZlciBhdCBhIHRpbWUuCiAgICAgICAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgLW11bHRpbGlzdGVuIGRlc2NyaWJlZCBiZWxvdy4gIFNldAogICAgICAgICBTU1ZOQ19NVUxUSVBMRV9MSVNURU49TUFYOm4gdG8gYWxsb3cgbm8gbW9yZSB0aGFuICJuIgogICAgICAgICBzaW11bHRhbmVvdXMgcmV2ZXJzZSBjb25uZWN0aW9ucy4KCiAgIE5vdGU6IElmIHRoZSBob3N0OnBvcnQgaXMgc3BlY2lmaWVkIGFzICJleGVjPWNvbW1hbmQgYXJncy4uLiIKICAgICAgICAgdGhlbiBpbnN0ZWFkIG9mIG1ha2luZyBhIFRDUC9JUCBzb2NrZXQgY29ubmVjdGlvbiB0byB0aGUKICAgICAgICAgcmVtb3RlIFZOQyBzZXJ2ZXIsICJjb21tYW5kIGFyZ3MuLi4iIGlzIGV4ZWN1dGVkIGFuZCB0aGUKICAgICAgICAgdmlld2VyIGlzIGF0dGFjaGVkIHRvIGl0cyBzdGRpby4gIFRoaXMgZW5hYmxlcyB0dW5uZWxsaW5nCiAgICAgICAgIGVzdGFibGlzaGVkIHZpYSBhbiBleHRlcm5hbCBjb21tYW5kLCBlLmcuIGFuIHN0dW5uZWwoOCkKICAgICAgICAgdGhhdCBkb2VzIG5vdCBpbnZvbHZlIGEgbGlzdGVuaW5nIHNvY2tldC4gIFRoaXMgbW9kZSBkb2VzCiAgICAgICAgIG5vdCB3b3JrIGZvciAtbGlzdGVuIHJldmVyc2UgY29ubmVjdGlvbnMuCgogICAgICAgICBJZiB0aGUgaG9zdDpwb3J0IGlzIHNwZWNpZmllZCBhcyAiZmQ9biIgdGhlbiBpdCBpcyBhc3N1bWVkCiAgICAgICAgIG4gaXMgYW4gYWxyZWFkeSBvcGVuZWQgZmlsZSBkZXNjcmlwdG9yIHRvIHRoZSBzb2NrZXQuIChpLmUKICAgICAgICAgdGhlIHBhcmVudCBkaWQgZm9yaytleGVjKQoKICAgICAgICAgSWYgdGhlIGhvc3Q6cG9ydCBjb250YWlucyBhICcvJyBpdCBpcyBpbnRlcnByZXRlZCBhcyBhCiAgICAgICAgIHVuaXgtZG9tYWluIHNvY2tldCAoQUZfTE9DQUwgaW5zZWFkIG9mIEFGX0lORVQpCgogICAgICAgIC1tdWx0aWxpc3RlbiAgQXMgaW4gLWxpc3RlbiAocmV2ZXJzZSBjb25uZWN0aW9uIGxpc3RlbmluZykgZXhjZXB0CiAgICAgICAgICAgICAgICAgICAgYWxsb3cgbW9yZSB0aGFuIG9uZSBpbmNvbWluZyBWTkMgc2VydmVyIHRvIGJlIGNvbm5lY3RlZAogICAgICAgICAgICAgICAgICAgIGF0IGEgdGltZS4gIFRoZSBkZWZhdWx0IGZvciAtbGlzdGVuIG9mIG9ubHkgb25lIGF0IGEKICAgICAgICAgICAgICAgICAgICB0aW1lIHRyaWVzIHRvIHBsYXkgaXQgc2FmZSBieSBub3QgYWxsb3dpbmcgYW55b25lIG9uCiAgICAgICAgICAgICAgICAgICAgdGhlIG5ldHdvcmsgdG8gcHV0IChtYW55KSBkZXNrdG9wcyBvbiB5b3VyIHNjcmVlbiBvdmVyCiAgICAgICAgICAgICAgICAgICAgYSBsb25nIHdpbmRvdyBvZiB0aW1lLiBVc2UgLW11bHRpbGlzdGVuIGZvciBubyBsaW1pdC4KCiAgICAgICAgLWFjY2VwdHBvcHVwICBJbiAtbGlzdGVuIChyZXZlcnNlIGNvbm5lY3Rpb24gbGlzdGVuaW5nKSBtb2RlIHdoZW4KICAgICAgICAgICAgICAgICAgICBhIHJldmVyc2UgVk5DIGNvbm5lY3Rpb24gY29tZXMgaW4gc2hvdyBhIHBvcHVwIGFza2luZwogICAgICAgICAgICAgICAgICAgIHdoZXRoZXIgdG8gQWNjZXB0IG9yIFJlamVjdCB0aGUgY29ubmVjdGlvbi4gIFRoZSBJUAogICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3RpbmcgaG9zdCBpcyBzaG93bi4gIFNhbWUgYXMKICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIHRoZSBlbnYuIHZhci4gU1NWTkNfQUNDRVBUX1BPUFVQPTEuCgogICAgICAgIC1hY2NlcHRwb3B1cHNjICBBcyBpbiAtYWNjZXB0cG9wdXAgZXhjZXB0IGFzc3VtZSBVbHRyYVZOQyBTaW5nbGUKICAgICAgICAgICAgICAgICAgICBDbGljayAoU0MpIHNlcnZlci4gIFJldHJpZXZlIFVzZXIgYW5kIENvbXB1dGVyTmFtZQogICAgICAgICAgICAgICAgICAgIGluZm8gZnJvbSBVbHRyYVZOQyBTZXJ2ZXIgYW5kIGRpc3BsYXkgaW4gdGhlIFBvcHVwLgoKICAgICAgICAtdXNlNjQgICAgICBJbiAtYmdyMjMzIG1vZGUsIHVzZSA2NCBjb2xvcnMgaW5zdGVhZCBvZiAyNTYuCiAgICAgICAgLWJncjIyMiAgICAgU2FtZSBhcyAtdXNlNjQuCgogICAgICAgIC11c2U4ICAgICAgIEluIC1iZ3IyMzMgbW9kZSwgdXNlIDggY29sb3JzIGluc3RlYWQgb2YgMjU2LgogICAgICAgIC1iZ3IxMTEgICAgIFNhbWUgYXMgLXVzZTguCgogICAgICAgIC0xNmJwcCAgICAgIElmIHRoZSB2bmMgdmlld2VyIFggZGlzcGxheSBpcyBkZXB0aCAyNCBhdCAzMmJwcAogICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgYSAxNmJwcCBmb3JtYXQgZnJvbSB0aGUgVk5DIHNlcnZlciB0byBjdXQKICAgICAgICAgICAgICAgICAgICBuZXR3b3JrIHRyYWZmaWMgYnkgdXAgdG8gMlgsIHRoZW4gdHJhbmxhdGUgdGhlCiAgICAgICAgICAgICAgICAgICAgcGl4ZWxzIHRvIDMyYnBwIGxvY2FsbHkuCiAgICAgICAgLWJncjU2NSAgICAgU2FtZSBhcyAtMTZicHAuCgogICAgICAgIC1ncmV5ICAgICAgIFVzZSBhIGdyZXkgc2NhbGUgZm9yIHRoZSAxNi0gYW5kIDgtYnBwIG1vZGVzLgoKICAgICAgICAtYWxwaGEgICAgICBVc2UgYWxwaGFibGVuZGluZyB0cmFuc3BhcmVuY3kgZm9yIGxvY2FsIGN1cnNvcnMKICAgICAgICAgICAgICAgICAgICByZXF1aXJlczogeDExdm5jIHNlcnZlciwgYm90aCBjbGllbnQgYW5kIHNlcnZlcgogICAgICAgICAgICAgICAgICAgIG11c3QgYmUgMzJicHAgYW5kIHNhbWUgZW5kaWFubmVzcy4KCiAgICAgICAgLXNjYWxlIHN0ciAgU2NhbGUgdGhlIGRlc2t0b3AgbG9jYWxseS4gIFRoZSBzdHJpbmcgInN0ciIgY2FuCiAgICAgICAgICAgICAgICAgICAgYSBmbG9hdGluZyBwb2ludCByYXRpbywgZS5nLiAiMC45Iiwgb3IgYSBmcmFjdGlvbiwKICAgICAgICAgICAgICAgICAgICBlLmcuICIzLzQiLCBvciBXeEgsIGUuZy4gMTI4MHgxMDI0LiAgVXNlICJmaXQiCiAgICAgICAgICAgICAgICAgICAgdG8gZml0IGluIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplLiAgVXNlICJhdXRvIiB0bwogICAgICAgICAgICAgICAgICAgIGZpdCBpbiB0aGUgd2luZG93IHNpemUuICAic3RyIiBjYW4gYWxzbyBiZSBzZXQgYnkKICAgICAgICAgICAgICAgICAgICB0aGUgZW52LiB2YXIuIFNTVk5DX1NDQUxFLgoKICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugb2JzZXJ2ZSBtb3VzZSB0cmFpbCBwYWludGluZyBlcnJvcnMsIGVuYWJsZQogICAgICAgICAgICAgICAgICAgIFgxMSBDdXJzb3IgbW9kZSAoZWl0aGVyIHZpYSBQb3B1cCBvciAteDExY3Vyc29yLikKCiAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHNjYWxpbmcgaXMgZG9uZSBpbiBzb2Z0d2FyZSBhbmQgc28gY2FuIGJlCiAgICAgICAgICAgICAgICAgICAgc2xvdyBhbmQgcmVxdWlyZXMgbW9yZSBtZW1vcnkuICBTb21lIHNwZWVkdXAgVGlwczoKCiAgICAgICAgICAgICAgICAgICAgICAgIFpSTEUgaXMgZmFzdGVyIHRoYW4gVGlnaHQgaW4gdGhpcyBtb2RlLiAgV2hlbgogICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nIGlzIGZpcnN0IGRldGVjdGVkLCB0aGUgZW5jb2Rpbmcgd2lsbAogICAgICAgICAgICAgICAgICAgICAgICBiZSBhdXRvbWF0aWNhbGx5IHN3aXRjaGVkIHRvIFpSTEUuICBVc2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIFBvcHVwIG1lbnUgaWYgeW91IHdhbnQgdG8gZ28gYmFjayB0byBUaWdodC4KICAgICAgICAgICAgICAgICAgICAgICAgU2V0IFNTVk5DX1BSRVNFUlZFX0VOQ09ESU5HPTEgdG8gZGlzYWJsZSB0aGlzLgoKICAgICAgICAgICAgICAgICAgICAgICAgVXNlIGEgc29saWQgYmFja2dyb3VuZCBvbiB0aGUgcmVtb3RlIHNpZGUuCiAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIG1hbnVhbGx5IG9yIHZpYSB4MTF2bmMgLXNvbGlkIC4uLikKCiAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSByZW1vdGUgc2VydmVyIGlzIHgxMXZuYywgdHJ5IGNsaWVudAogICAgICAgICAgICAgICAgICAgICAgICBzaWRlIGNhY2hpbmc6IHgxMXZuYyAtbmNhY2hlIDEwIC4uLgoKICAgICAgICAteWNyb3AgbiAgICBPbmx5IHNob3cgdGhlIHRvcCBuIHJvd3Mgb2YgdGhlIGZyYW1lYnVmZmVyLiAgRm9yCiAgICAgICAgICAgICAgICAgICAgdXNlIHdpdGggeDExdm5jIC1uY2FjaGUgY2xpZW50IGNhY2hpbmcgb3B0aW9uCiAgICAgICAgICAgICAgICAgICAgdG8gaGVscCAiaGlkZSIgdGhlIHBpeGVsIGNhY2hlIHJlZ2lvbi4KICAgICAgICAgICAgICAgICAgICBVc2UgYSBuZWdhdGl2ZSB2YWx1ZSAoZS5nLiAtMSkgZm9yIGF1dG9kZXRlY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgQXV0b2RldGVjdGlvbiB3aWxsIGFsd2F5cyB0YWtlIHBsYWNlIGlmIHRoZSByZW1vdGUKICAgICAgICAgICAgICAgICAgICBmYiBoZWlnaHQgaXMgbW9yZSB0aGFuIDIgdGltZXMgdGhlIHdpZHRoLgoKICAgICAgICAtc2J3aWR0aCBuICBTY3JvbGxiYXIgd2lkdGggZm9yIHgxMXZuYyAtbmNhY2hlIG1vZGUgKC15Y3JvcCksCiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyB2ZXJ5IG5hcnJvdzogMiBwaXhlbHMsIGl0IGlzIG5hcnJvdyB0bwogICAgICAgICAgICAgICAgICAgIGF2b2lkIGRpc3RyYWN0aW9uIGluIC15Y3JvcCBtb2RlLgoKICAgICAgICAtbm9iZWxsICAgICBEaXNhYmxlIGJlbGwuCgogICAgICAgIC1yYXdsb2NhbCAgIFByZWZlciByYXcgZW5jb2RpbmcgZm9yIGxvY2FsaG9zdCwgZGVmYXVsdCBpcwogICAgICAgICAgICAgICAgICAgIG5vLCBpLmUuIGFzc3VtZXMgeW91IGhhdmUgYSBTU0ggdHVubmVsIGluc3RlYWQuCgogICAgICAgIC1ub3R0eSAgICAgIFRyeSB0byBhdm9pZCB1c2luZyB0aGUgdGVybWluYWwgZm9yIGludGVyYWN0aXZlCiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VzOiB1c2Ugd2luZG93cyBmb3IgbWVzc2FnZXMgYW5kIHByb21wdGluZwogICAgICAgICAgICAgICAgICAgIGluc3RlYWQuICBNZXNzYWdlcyB3aWxsIGFsc28gYmUgcHJpbnRlZCB0byB0ZXJtaW5hbC4KCiAgICAgICAgLXNlbmRjbGlwYm9hcmQgIFNlbmQgdGhlIFggQ0xJUEJPQVJEIHNlbGVjdGlvbiAoaS5lLiBDdHJsK0MsCiAgICAgICAgICAgICAgICAgICAgICAgIEN0cmwrVikgaW5zdGVhZCBvZiB0aGUgWCBQUklNQVJZIHNlbGVjdGlvbiAobW91c2UKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0IGFuZCBtaWRkbGUgYnV0dG9uIHBhc3RlLikKCiAgICAgICAgLXNlbmRhbHdheXMgICAgIFdoZW5ldmVyIHRoZSBtb3VzZSBlbnRlcnMgdGhlIFZOQyB2aWV3ZXIgbWFpbgogICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3csIHNlbmQgdGhlIHNlbGVjdGlvbiB0byB0aGUgVk5DIHNlcnZlciBldmVuIGlmCiAgICAgICAgICAgICAgICAgICAgICAgIGl0IGhhcyBub3QgY2hhbmdlZC4gIFRoaXMgaXMgbGlrZSB0aGUgWHQgcmVzb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRpb24gU2VsZWN0aW9uVG9WTkMoYWx3YXlzKQoKICAgICAgICAtcmVjdnRleHQgc3RyICAgV2hlbiBjdXQgdGV4dCBpcyByZWNlaXZlZCBmcm9tIHRoZSBWTkMgc2VydmVyLAogICAgICAgICAgICAgICAgICAgICAgICBzc3ZuY3ZpZXdlciB3aWxsIHNldCBib3RoIHRoZSBYIFBSSU1BUlkgYW5kIHRoZQogICAgICAgICAgICAgICAgICAgICAgICBYIENMSVBCT0FSRCBsb2NhbCBzZWxlY3Rpb25zLiAgVG8gY29udHJvbCB3aGljaAogICAgICAgICAgICAgICAgICAgICAgICBpcyBzZXQsIHNwZWNpZnkgJ3N0cicgYXMgJ3ByaW1hcnknLCAnY2xpcGJvYXJkJywKICAgICAgICAgICAgICAgICAgICAgICAgb3IgJ2JvdGgnICh0aGUgZGVmYXVsdC4pCgogICAgICAgIC1ncmFiYWxsICAgIEdyYWIgdGhlIGVudGlyZSBYIHNlcnZlciB3aGVuIGluIGZ1bGxzY3JlZW4gbW9kZSwKICAgICAgICAgICAgICAgICAgICBuZWVkZWQgYnkgc29tZSBvbGQgd2luZG93IG1hbmFnZXJzIGxpa2UgZnZ3bTIuCgogICAgICAgIC1wb3B1cGZpeCAgIFdhcnAgdGhlIHBvcHVwIGJhY2sgdG8gdGhlIHBvaW50ZXIgcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGJ5IHNvbWUgb2xkIHdpbmRvdyBtYW5hZ2VycyBsaWtlIGZ2d20yLgogICAgICAgIC1zZW5kY2xpcGJvYXJkICBTZW5kIHRoZSBYIENMSVBCT0FSRCBzZWxlY3Rpb24gKGkuZS4gQ3RybCtDLAogICAgICAgICAgICAgICAgICAgICAgICBDdHJsK1YpIGluc3RlYWQgb2YgdGhlIFggUFJJTUFSWSBzZWxlY3Rpb24gKG1vdXNlCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdCBhbmQgbWlkZGxlIGJ1dHRvbiBwYXN0ZS4pCgogICAgICAgIC1zZW5kYWx3YXlzICAgICBXaGVuZXZlciB0aGUgbW91c2UgZW50ZXJzIHRoZSBWTkMgdmlld2VyIG1haW4KICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LCBzZW5kIHRoZSBzZWxlY3Rpb24gdG8gdGhlIFZOQyBzZXJ2ZXIgZXZlbiBpZgogICAgICAgICAgICAgICAgICAgICAgICBpdCBoYXMgbm90IGNoYW5nZWQuICBUaGlzIGlzIGxpa2UgdGhlIFh0IHJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uIFNlbGVjdGlvblRvVk5DKGFsd2F5cykKCiAgICAgICAgLXJlY3Z0ZXh0IHN0ciAgIFdoZW4gY3V0IHRleHQgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgVk5DIHNlcnZlciwKICAgICAgICAgICAgICAgICAgICAgICAgc3N2bmN2aWV3ZXIgd2lsbCBzZXQgYm90aCB0aGUgWCBQUklNQVJZIGFuZCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgWCBDTElQQk9BUkQgbG9jYWwgc2VsZWN0aW9ucy4gIFRvIGNvbnRyb2wgd2hpY2gKICAgICAgICAgICAgICAgICAgICAgICAgaXMgc2V0LCBzcGVjaWZ5ICdzdHInIGFzICdwcmltYXJ5JywgJ2NsaXBib2FyZCcsCiAgICAgICAgICAgICAgICAgICAgICAgIG9yICdib3RoJyAodGhlIGRlZmF1bHQuKQoKICAgICAgICAtZ3JhYmFsbCAgICBHcmFiIHRoZSBlbnRpcmUgWCBzZXJ2ZXIgd2hlbiBpbiBmdWxsc2NyZWVuIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGJ5IHNvbWUgb2xkIHdpbmRvdyBtYW5hZ2VycyBsaWtlIGZ2d20yLgoKICAgICAgICAtcG9wdXBmaXggICBXYXJwIHRoZSBwb3B1cCBiYWNrIHRvIHRoZSBwb2ludGVyIHBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgIG5lZWRlZCBieSBzb21lIG9sZCB3aW5kb3cgbWFuYWdlcnMgbGlrZSBmdndtMi4KCiAgICAgICAgLWdyYWJrYmQgICAgR3JhYiB0aGUgWCBrZXlib2FyZCB3aGVuIGluIGZ1bGxzY3JlZW4gbW9kZSwKICAgICAgICAgICAgICAgICAgICBuZWVkZWQgYnkgc29tZSB3aW5kb3cgbWFuYWdlcnMuIFNhbWUgYXMgLWdyYWJrZXlib2FyZC4KICAgICAgICAgICAgICAgICAgICAtZ3JhYmtiZCBpcyB0aGUgZGVmYXVsdCwgdXNlIC1ub2dyYWJrYmQgdG8gZGlzYWJsZS4KCiAgICAgICAgLWJzLCAtbm9icyAgV2hldGhlciBvciBub3QgdG8gdXNlIFggc2VydmVyIEJhY2tpbmdzdG9yZSBmb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgbWFpbiB2aWV3ZXIgd2luZG93LiAgVGhlIGRlZmF1bHQgaXMgdG8gbm90LCBtYWlubHkKICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIG1vc3QgTGludXgsIGV0Yywgc3lzdGVtcyBYIHNlcnZlcnMgZGlzYWJsZQogICAgICAgICAgICAgICAgICAgICphbGwqIEJhY2tpbmdzdG9yZSBieSBkZWZhdWx0LiAgVG8gcmUtZW5hYmxlIGl0IHB1dAoKICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uICJCYWNraW5nc3RvcmUiCgogICAgICAgICAgICAgICAgICAgIGluIHRoZSBEZXZpY2Ugc2VjdGlvbiBvZiAvZXRjL1gxMS94b3JnLmNvbmYuCiAgICAgICAgICAgICAgICAgICAgSW4gLWJzIG1vZGUgd2l0aCBubyBYIHNlcnZlciBiYWNraW5nc3RvcmUsIHdoZW5ldmVyIGFuCiAgICAgICAgICAgICAgICAgICAgYXJlYSBvZiB0aGUgc2NyZWVuIGlzIHJlLWV4cG9zZWQgaXQgbXVzdCBnbyBvdXQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgVk5DIHNlcnZlciB0byByZXRyaWV2ZSB0aGUgcGl4ZWxzLiBUaGlzIGlzIHRvbyBzbG93LgoKICAgICAgICAgICAgICAgICAgICBJbiAtbm9icyBtb2RlLCBtZW1vcnkgaXMgYWxsb2NhdGVkIGJ5IHRoZSB2aWV3ZXIgdG8KICAgICAgICAgICAgICAgICAgICBwcm92aWRlIGl0cyBvd24gYmFja2luZyBvZiB0aGUgbWFpbiB2aWV3ZXIgd2luZG93LiBUaGlzCiAgICAgICAgICAgICAgICAgICAgYWN0dWFsbHkgbWFrZXMgc29tZSBhY3Rpdml0aWVzIGZhc3RlciAoY2hhbmdlcyBpbiBsYXJnZQogICAgICAgICAgICAgICAgICAgIHJlZ2lvbnMpIGJ1dCBjYW4gYXBwZWFyIHRvICJmbGFzaCIgdG9vIG11Y2guCgogICAgICAgIC1ub3NobSAgICAgIERpc2FibGUgdXNlIG9mIE1JVCBzaGFyZWQgbWVtb3J5IGV4dGVuc2lvbiAobm90IHJlY29tbWVuZGVkCikKCiAgICAgICAgLXRlcm1jaGF0ICAgRG8gdGhlIFVsdHJhVk5DIGNoYXQgaW4gdGhlIHRlcm1pbmFsIHZuY3ZpZXdlciBpcyBpbgogICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgaW4gYW4gaW5kZXBlbmRlbnQgd2luZG93LgoKICAgICAgICAtdW5peHB3IHN0ciBVc2VmdWwgZm9yIGxvZ2dpbmcgaW50byB4MTF2bmMgaW4gLXVuaXhwdyBtb2RlLiAic3RyIiBpcyBhCiAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHRoYXQgYWxsb3dzIG1hbnkgd2F5cyB0byBlbnRlciB0aGUgVW5peCBVc2VybmFtZQogICAgICAgICAgICAgICAgICAgIGFuZCBVbml4IFBhc3N3b3JkLiAgVGhlc2UgY2hhcmFjdGVyczogdXNlcm5hbWUsIG5ld2xpbmUsCiAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQsIG5ld2xpbmUgYXJlIHNlbnQgdG8gdGhlIFZOQyBzZXJ2ZXIgYWZ0ZXIgYW55IFZOQwogICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIGhhcyB0YWtlbiBwbGFjZS4gIFVuZGVyIHgxMXZuYyB0aGV5IGFyZQogICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIHRoZSAtdW5peHB3IGxvZ2luLiAgT3RoZXIgVk5DIHNlcnZlcnMgY291bGQgZG8KICAgICAgICAgICAgICAgICAgICBzb21ldGhpbmcgc2ltaWxhci4KCiAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBhbHNvIGluZGljYXRlICJzdHIiIHZpYSB0aGUgZW52aXJvbm1lbnQKICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBTU1ZOQ19VTklYUFcuCgogICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgRXNjYXBlIGtleSBpcyBhY3R1YWxseSBzZW50IGZpcnN0IHRvIHRlbGwKICAgICAgICAgICAgICAgICAgICB4MTF2bmMgdG8gbm90IGVjaG8gdGhlIFVuaXggVXNlcm5hbWUgYmFjayB0byB0aGUgVk5DCiAgICAgICAgICAgICAgICAgICAgdmlld2VyLiBTZXQgU1NWTkNfVU5JWFBXX05PRVNDPTEgdG8gb3ZlcnJpZGUgdGhpcy4KCiAgICAgICAgICAgICAgICAgICAgSWYgc3RyIGlzICIuIiwgdGhlbiB5b3UgYXJlIHByb21wdGVkIGF0IHRoZSBjb21tYW5kIGxpbmUKICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbiB0aGUgbm9ybWFsIHdheS4gIElmIHN0ciBpcwogICAgICAgICAgICAgICAgICAgICItIiB0aGUgc3RkaW4gaXMgcmVhZCB2aWEgZ2V0cGFzcygzKSBmb3IgdXNlcm5hbWVAcGFzc3dvcmQuCiAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIGlmIHN0ciBpcyBhIGZpbGUsIGl0IGlzIG9wZW5lZCBhbmQgdGhlIGZpcnN0IGxpbmUKICAgICAgICAgICAgICAgICAgICByZWFkIGlzIHRha2VuIGFzIHRoZSBVbml4IHVzZXJuYW1lIGFuZCB0aGUgMm5kIGFzIHRoZQogICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkLiBJZiBzdHIgcHJlZml4ZWQgYnkgInJtOiIgdGhlIGZpbGUgaXMgcmVtb3ZlZAogICAgICAgICAgICAgICAgICAgIGFmdGVyIHJlYWRpbmcuIE90aGVyd2lzZSwgaWYgc3RyIGhhcyBhICJAIiBjaGFyYWN0ZXIsCiAgICAgICAgICAgICAgICAgICAgaXQgaXMgdGFrZW4gYXMgdXNlcm5hbWVAcGFzc3dvcmQuIE90aGVyd2lzZSwgdGhlIHByb2dyYW0KICAgICAgICAgICAgICAgICAgICBleGl0cyB3aXRoIGFuIGVycm9yLiBHb3QgYWxsIHRoYXQ/CgogICAgIC1yZXBlYXRlciBzdHIgIFRoaXMgaXMgZm9yIHVzZSB3aXRoIFVsdHJhVk5DIHJlcGVhdGVyIHByb3h5IGRlc2NyaWJlZAogICAgICAgICAgICAgICAgICAgIGhlcmU6IGh0dHA6Ly93d3cudXZuYy5jb20vYWRkb25zL3JlcGVhdGVyLmh0bWwuICBUaGUgInN0ciIKICAgICAgICAgICAgICAgICAgICBpcyB0aGUgSUQgc3RyaW5nIHRvIGJlIHNlbnQgdG8gdGhlIHJlcGVhdGVyLiAgRS5nLiBJRDoxMjM0CiAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGFsc28gYmUgdGhlIGhvc3RuYW1lIGFuZCBwb3J0IG9yIGRpc3BsYXkgb2YgdGhlIFZOQwogICAgICAgICAgICAgICAgICAgIHNlcnZlciwgZS5nLiAxMi4zNC41Ni43ODowIG9yIHNub29weS5jb206MS4gIE5vdGUgdGhhdCB3aGVuCiAgICAgICAgICAgICAgICAgICAgdXNpbmcgLXJlcGVhdGVyLCB0aGUgaG9zdDpkcHkgb24gdGhlIGNtZGxpbmUgaXMgdGhlIHJlcGVhdGUKcgogICAgICAgICAgICAgICAgICAgIHNlcnZlciwgTk9UIHRoZSBWTkMgc2VydmVyLiAgVGhlIHJlcGVhdGVyIHdpbGwgY29ubmVjdCB5b3UuCgogICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6IHZuY3ZpZXdlciAuLi4gLXJlcGVhdGVyIElEOjMzMzMgcmVwZWF0Lmhvc3Q6NTkwMAogICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6IHZuY3ZpZXdlciAuLi4gLXJlcGVhdGVyIHZob3N0OjAgcmVwZWF0Lmhvc3Q6NTkwMAoKICAgICAgICAgICAgICAgICAgICBVc2UsIGUuZy4sICctcmVwZWF0ZXIgU0NJSUk9SUQ6MzIxMCcgaWYgdGhlIHJlcGVhdGVyIGlzIGEKICAgICAgICAgICAgICAgICAgICBTaW5nbGUgQ2xpY2sgSUlJIChTU0wpIHJlcGVhdGVyIChyZXBlYXRlcl9TU0wuZXhlKSBhbmQgeW91CiAgICAgICAgICAgICAgICAgICAgYXJlIHBhc3NpbmcgdGhlIFNTTCBwYXJ0IG9mIHRoZSBjb25uZWN0aW9uIHRocm91Z2ggc3R1bm5lbCwKICAgICAgICAgICAgICAgICAgICBzb2NhdCwgZXRjLiBUaGlzIHdheSB0aGUgbWFnaWMgVWx0cmFWTkMgc3RyaW5nICd0ZXN0QicKICAgICAgICAgICAgICAgICAgICBuZWVkZWQgdG8gd29yayB3aXRoIHRoZSByZXBlYXRlciBpcyBzZW50IHRvIGl0LgoKICAgICAtcmZidmVyc2lvbiBzdHIgU2V0IHRoZSBhZHZlcnRpc2VkIFJGQiB2ZXJzaW9uLiAgRS5nLjogLXJmYnZlcnNpb24gMy42CiAgICAgICAgICAgICAgICAgICAgRm9yIHNvbWUgc2VydmVycywgZS5nLiBVbHRyYVZOQyB0aGlzIG5lZWRzIHRvIGJlIGRvbmUuCgogICAgIC11bHRyYWRzbSAgICAgIFVsdHJhVk5DIGhhcyBzeW1tZXRyaWMgcHJpdmF0ZSBrZXkgZW5jcnlwdGlvbiBEU00gcGx1Z2luczoKICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnV2bmMuY29tL2ZlYXR1cmVzL2VuY3J5cHRpb24uaHRtbC4gSXQgaXMgYXNzdW1lZAogICAgICAgICAgICAgICAgICAgIHlvdSBhcmUgdXNpbmcgYSB1bml4IHByb2dyYW0gKGUuZy4gb3VyIHVsdHJhdm5jX2RzbV9oZWxwZXIpCiAgICAgICAgICAgICAgICAgICAgdG8gZW5jcnlwdCBhbmQgZGVjcnlwdCB0aGUgVWx0cmFWTkMgRFNNIHN0cmVhbS4gSU4gQURESVRJT04KICAgICAgICAgICAgICAgICAgICBUTyBUSEFUIHN1cHBseSAtdWx0cmFkc20gdG8gdGVsbCBUSElTIHZpZXdlciB0byBtb2RpZnkgdGhlCiAgICAgICAgICAgICAgICAgICAgUkZCIGRhdGEgc2VudCBzbyBhcyB0byB3b3JrIHdpdGggdGhlIFVsdHJhVk5DIFNlcnZlci4gRm9yCiAgICAgICAgICAgICAgICAgICAgc29tZSByZWFzb24sIGVhY2ggUkZCIG1zZyB0eXBlIG11c3QgYmUgc2VudCB0d2ljZSB1bmRlciBEU00KLgoKICAgICAtbXNsb2dvbiB1c2VyICBVc2UgV2luZG93cyBNUyBMb2dvbiB0byBhbiBVbHRyYVZOQyBzZXJ2ZXIuICBTdXBwbHkgdGhlCiAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUgb3IgIjEiIHRvIGJlIHByb21wdGVkLiAgVGhlIGRlZmF1bHQgaXMgdG8KICAgICAgICAgICAgICAgICAgICBhdXRvZGV0ZWN0IHRoZSBVbHRyYVZOQyBNUyBMb2dvbiBzZXJ2ZXIgYW5kIHByb21wdCBmb3IKICAgICAgICAgICAgICAgICAgICB0aGUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkLgoKICAgICAgICAgICAgICAgICAgICBJTVBPUlRBTlQgTk9URTogVGhlIFVsdHJhVk5DIE1TLUxvZ29uIERpZmZpZS1IZWxsbWFuCiAgICAgICAgICAgICAgICAgICAgZXhjaGFuZ2UgaXMgdmVyeSB3ZWFrIGFuZCBjYW4gYmUgYnJ1dGUgZm9yY2VkIHRvIHJlY292ZXIKICAgICAgICAgICAgICAgICAgICB5b3VyIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBpbiBhIGZldyBzZWNvbmRzIG9mIENQVSB0aW1lLgogICAgICAgICAgICAgICAgICAgIFRvIGJlIHNhZmUsIGJlIHN1cmUgdG8gdXNlIGFuIGFkZGl0aW9uYWwgZW5jcnlwdGVkIHR1bm5lbAogICAgICAgICAgICAgICAgICAgIChlLmcuIFNTTCBvciBTU0gpIGZvciB0aGUgZW50aXJlIFZOQyBzZXNzaW9uLgoKICAgICAtY2hhdG9ubHkgICAgICBUcnkgdG8gYmUgYSBjbGllbnQgdGhhdCBvbmx5IGRvZXMgVWx0cmFWTkMgdGV4dCBjaGF0LiBUaGlzCiAgICAgICAgICAgICAgICAgICAgbW9kZSBpcyB1c2VkIGJ5IHgxMXZuYyB0byBwcmVzZW50IGEgY2hhdCB3aW5kb3cgb24gdGhlCiAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWwgWDExIGNvbnNvbGUgKGkuZS4gY2hhdCB3aXRoIHRoZSBwZXJzb24gYXQgdGhlCiAgICAgICAgICAgICAgICAgICAgZGlzcGxheSkuCgogICAgIC1lbnYgVkFSPVZBTFVFIFRvIHNhdmUgd3JpdGluZyBhIHNoZWxsIHNjcmlwdCB0byBzZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzCiwKICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IGFzIG1hbnkgYXMgeW91IG5lZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIEZvcgogICAgICAgICAgICAgICAgICAgIGV4YW1wbGUsIC1lbnYgU1NWTkNfTVVMVElQTEVfTElTVEVOPU1BWDo1IC1lbnYgRURJVE9SPXZpCgogICAgIC1ub2lwdjYgICAgICAgIERpc2FibGUgYWxsIElQdjYgc29ja2V0cy4gIFNhbWUgYXMgVk5DVklFV0VSX05PX0lQVjY9MS4KCiAgICAgLW5vaXB2NCAgICAgICAgRGlzYWJsZSBhbGwgSVB2NCBzb2NrZXRzLiAgU2FtZSBhcyBWTkNWSUVXRVJfTk9fSVBWND0xLgoKICAgICAtcHJpbnRyZXMgICAgICBQcmludCBvdXQgdGhlIFNzdm5jIFggcmVzb3VyY2VzIChhcHBkZWZhdWx0cykgYW5kIHRoZW4gZXhpdAogICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gc2F2ZSB0aGVtIHRvIGEgZmlsZSBhbmQgY3VzdG9taXplIHRoZW0gKGUuZy4gdGhlCiAgICAgICAgICAgICAgICAgICAga2V5YmluZGluZ3MgYW5kIFBvcHVwIG1lbnUpICBUaGVuIHBvaW50IHRvIHRoZSBmaWxlIHZpYQogICAgICAgICAgICAgICAgICAgIFhFTlZJUk9OTUVOVCBvciBYQVBQTFJFU0RJUi4KCiAgICAgLXBpcGVsaW5lICAgICAgTGlrZSBUdXJib1ZOQywgcmVxdWVzdCB0aGUgbmV4dCBmcmFtZWJ1ZmZlciB1cGRhdGUgYXMgc29vbgogICAgICAgICAgICAgICAgICAgIGFzIHBvc3NpYmxlIGluc3RlYWQgb2Ygd2FpdGluZyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50CiAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgdXBkYXRlIGNvbWluZyBpbi4gIEhlbHBzICdwaXBlbGluZScgdGhlIHVwZGF0ZXMKLgogICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgY3VycmVudGx5IHRoZSBkZWZhdWx0LCB1c2UgLW5vcGlwZWxpbmUgdG8gZGlzYWJsZS4KCiAgICAgLWFwcHNoYXJlICAgICAgRW5hYmxlIGZlYXR1cmVzIGZvciB1c2Ugd2l0aCB4MTF2bmMncyAtYXBwc2hhcmUgbW9kZSB3aGVyZQogICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2Ygc2hhcmluZyB0aGUgZnVsbCBkZXNrdG9wIG9ubHkgdGhlIGFwcGxpY2F0aW9uJ3MKICAgICAgICAgICAgICAgICAgICB3aW5kb3dzIGFyZSBzaGFyZWQuICBWaWV3ZXIgbXVsdGlsaXN0ZW4gbW9kZSBpcyB1c2VkIHRvCiAgICAgICAgICAgICAgICAgICAgY3JlYXRlIHRoZSBtdWx0aXBsZSB3aW5kb3dzOiAtbXVsdGlsaXN0ZW4gaXMgaW1wbGllZC4KICAgICAgICAgICAgICAgICAgICBTZWUgJ3gxMXZuYyAtYXBwc2hhcmUgLWhlbHAnIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIG1vZGUuCgogICAgICAgICAgICAgICAgICAgIEZlYXR1cmVzIGVuYWJsZWQgaW4gdGhlIHZpZXdlciB1bmRlciAtYXBwc2hhcmUgYXJlOgogICAgICAgICAgICAgICAgICAgIE1pbmltdW0gZXh0cmEgdGV4dCBpbiB0aGUgdGl0bGUsIGF1dG8gLXljcm9wIGlzIGRpc2FibGVkLAogICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtcmVtb3RlX3ByZWZpeCBYMTFWTkNfQVBQU0hBUkVfQ01EOiBtZXNzYWdlIGNoYW5uZWwsCiAgICAgICAgICAgICAgICAgICAgeDExdm5jIGluaXRpYWwgd2luZG93IHBvc2l0aW9uIGhpbnRzLiAgU2VlIGFsc28gRXNjYXBlIEtleXMKICAgICAgICAgICAgICAgICAgICBiZWxvdyBmb3IgYWRkaXRpb25hbCBrZXkgYW5kIG1vdXNlIGJpbmRpbmdzLgoKICAgICAtZXNjYXBlIHN0ciAgICBUaGlzIHNldHMgdGhlICdFc2NhcGUgS2V5cycgbW9kaWZpZXIgc2VxdWVuY2UgYW5kIGVuYWJsZXMKICAgICAgICAgICAgICAgICAgICBlc2NhcGUga2V5cyBtb2RlLiAgV2hlbiB0aGUgbW9kaWZpZXIga2V5cyBlc2NhcGUgc2VxdWVuY2UKICAgICAgICAgICAgICAgICAgICBpcyBoZWxkIGRvd24sIHRoZSBuZXh0IGtleXN0cm9rZSBpcyBpbnRlcnByZXRlZCBsb2NhbGx5CiAgICAgICAgICAgICAgICAgICAgdG8gcGVyZm9ybSBhIHNwZWNpYWwgYWN0aW9uIGluc3RlYWQgb2YgYmVpbmcgc2VudCB0byB0aGUKICAgICAgICAgICAgICAgICAgICByZW1vdGUgVk5DIHNlcnZlci4KCiAgICAgICAgICAgICAgICAgICAgVXNlICctZXNjYXBlIGRlZmF1bHQnIGZvciB0aGUgZGVmYXVsdCBtb2RpZmllciBzZXF1ZW5jZS4KICAgICAgICAgICAgICAgICAgICAoVW5peDogQWx0X0wsU3VwZXJfTCBhbmQgTWFjT1NYOiBDb250cm9sX0wsTWV0YV9MKQoKICAgIEhlcmUgYXJlIHRoZSAnRXNjYXBlIEtleXM6IEhlbHArU2V0JyBpbnN0cnVjdGlvbnMgZnJvbSB0aGUgUG9wdXAgTWVudToKCiAgICBFc2NhcGUgS2V5czogIEVudGVyIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgbW9kaWZpZXIga2V5cyB0byBiZSB0aGUKICAgICdlc2NhcGUgc2VxdWVuY2UnLiAgV2hlbiB0aGVzZSBrZXlzIGFyZSBoZWxkIGRvd24sIHRoZSBuZXh0IGtleXN0cm9rZSBpcwogICAgaW50ZXJwcmV0ZWQgbG9jYWxseSB0byBpbnZva2UgYSBzcGVjaWFsIGFjdGlvbiBpbnN0ZWFkIG9mIGJlaW5nIHNlbnQgdG8KICAgIHRoZSByZW1vdGUgVk5DIHNlcnZlci4gIEluIG90aGVyIHdvcmRzLCBhIHNldCBvZiAnSG90IEtleXMnLgoKICAgIFRvIGVuYWJsZSBvciBkaXNhYmxlIHRoaXMsIGNsaWNrIG9uICdFc2NhcGUgS2V5czogVG9nZ2xlJyBpbiB0aGUgUG9wdXAuCgogICAgSGVyZSBpcyB0aGUgbGlzdCBvZiBob3Qta2V5IG1hcHBpbmdzIHRvIHNwZWNpYWwgYWN0aW9uczoKCiAgICAgICByOiByZWZyZXNoIGRlc2t0b3AgIGI6IHRvZ2dsZSBiZWxsICAgYzogdG9nZ2xlIGZ1bGwtY29sb3IKICAgICAgIGY6IGZpbGUgdHJhbnNmZXIgICAgeDogeDExY3Vyc29yICAgICB6OiB0b2dnbGUgVGlnaHQvWlJMRQogICAgICAgbDogZnVsbCBzY3JlZW4gICAgICBnOiBncmFiYWxsICAgICAgIGU6IGVzY2FwZSBrZXlzIGRpYWxvZwogICAgICAgczogc2NhbGUgZGlhbG9nICAgICArOiBzY2FsZSB1cCAoPSkgIC06IHNjYWxlIGRvd24gKF8pCiAgICAgICB0OiB0ZXh0IGNoYXQgICAgICAgICAgICAgICAgICAgICAgICAgYTogYWxwaGFibGVuZCBjdXJzb3IKICAgICAgIFY6IHRvZ2dsZSB2aWV3b25seSAgUTogcXVpdCB2aWV3ZXIgICAxIDIgMyA0IDUgNjogVWx0cmFWTkMgc2NhbGUgMS9uCgogICAgICAgQXJyb3cga2V5czogICAgICAgICBwYW4gdGhlIHZpZXdwb3J0IGFib3V0IDEwJSBmb3IgZWFjaCBrZXlwcmVzcy4KICAgICAgIFBhZ2VVcCAvIFBhZ2VEb3duOiAgcGFuIHRoZSB2aWV3cG9ydCBieSBhIHNjcmVlbmZ1bCB2ZXJ0aWNhbGx5LgogICAgICAgSG9tZSAgIC8gRW5kOiAgICAgICBwYW4gdGhlIHZpZXdwb3J0IGJ5IGEgc2NyZWVuZnVsIGhvcml6b250YWxseS4KICAgICAgIEtleVBhZCBBcnJvdyBrZXlzOiAgcGFuIHRoZSB2aWV3cG9ydCBieSAxIHBpeGVsIGZvciBlYWNoIGtleXByZXNzLgogICAgICAgRHJhZ2dpbmcgdGhlIE1vdXNlIHdpdGggQnV0dG9uMSBwcmVzc2VkIGFsc28gcGFucyB0aGUgdmlld3BvcnQuCiAgICAgICBDbGlja2luZyBNb3VzZSBCdXR0b24zIGJyaW5ncyB1cCB0aGUgUG9wdXAgTWVudS4KCiAgICBUaGUgYWJvdmUgbWFwcGluZ3MgYXJlICphbHdheXMqIGFjdGl2ZSBpbiBWaWV3T25seSBtb2RlLCB1bmxlc3MgeW91IHNldCB0aGUKICAgIEVzY2FwZSBLZXlzIHZhbHVlIHRvICduZXZlcicuCgogICAgSWYgdGhlIEVzY2FwZSBLZXlzIHZhbHVlIGJlbG93IGlzIHNldCB0byAnZGVmYXVsdCcgdGhlbiBhIGRlZmF1bHQgbGlzdCBvZgogICAgb2YgbW9kaWZpZXIga2V5cyBpcyB1c2VkLiAgRm9yIFVuaXggaXQgaXM6IEFsdF9MLFN1cGVyX0wgYW5kIGZvciBNYWNPU1ggaXQKICAgIGlzIENvbnRyb2xfTCxNZXRhX0wuICBOb3RlOiB0aGUgU3VwZXJfTCBrZXkgdXN1YWxseSBoYXMgYSBXaW5kb3dzKFRNKSBGbGFnCiAgICBvbiBpdC4gIEFsc28gbm90ZSB0aGUgX0wgYW5kIF9SIG1lYW4gdGhlIGtleSBpcyBvbiB0aGUgTEVGVCBvciBSSUdIVCBzaWRlCiAgICBvZiB0aGUga2V5Ym9hcmQuCgogICAgT24gVW5peCAgIHRoZSBkZWZhdWx0IGlzIEFsdCBhbmQgV2luZG93cyBrZXlzIG9uIExlZnQgc2lkZSBvZiBrZXlib2FyZC4KICAgIE9uIE1hY09TWCB0aGUgZGVmYXVsdCBpcyBDb250cm9sIGFuZCBDb21tYW5kIGtleXMgb24gTGVmdCBzaWRlIG9mIGtleWJvYXJkLgoKICAgIEV4YW1wbGU6IFByZXNzIGFuZCBob2xkIHRoZSBBbHQgYW5kIFdpbmRvd3Mga2V5cyBvbiB0aGUgTEVGVCBzaWRlIG9mIHRoZQogICAga2V5Ym9hcmQgYW5kIHRoZW4gcHJlc3MgJ2MnIHRvIHRvZ2dsZSB0aGUgZnVsbC1jb2xvciBzdGF0ZS4gIE9yIHByZXNzICd0JwogICAgdG8gdG9nZ2xlIHRoZSB1bHRyYXZuYyBUZXh0IENoYXQgd2luZG93LCBldGMuCgogICAgVG8gdXNlIHNvbWV0aGluZyBiZXNpZGVzIHRoZSBkZWZhdWx0LCBzdXBwbHkgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCAob3IgYQogICAgc2luZ2xlIG9uZSkgZnJvbTogU2hpZnRfTCBTaGlmdF9SIENvbnRyb2xfTCBDb250cm9sX1IgQWx0X0wgQWx0X1IgTWV0YV9MCiAgICBNZXRhX1IgU3VwZXJfTCBTdXBlcl9SIEh5cGVyX0wgSHlwZXJfUiBvciBNb2RlX3N3aXRjaC4KCgogICBOZXcgUG9wdXAgYWN0aW9uczoKCiAgICAgICAgVmlld09ubHk6ICAgICAgICAgICAgICAgIH4gLXZpZXdvbmx5CiAgICAgICAgRGlzYWJsZSBCZWxsOiAgICAgICAgICAgIH4gLW5vYmVsbAogICAgICAgIEN1cnNvciBTaGFwZTogICAgICAgICAgICB+IC1ub2N1cnNvcnNoYXBlCiAgICAgICAgWDExIEN1cnNvcjogICAgICAgICAgICAgIH4gLXgxMWN1cnNvcgogICAgICAgIEN1cnNvciBBbHBoYWJsZW5kOiAgICAgICB+IC1hbHBoYQogICAgICAgIFRvZ2dsZSBUaWdodC9IZXh0aWxlOiAgICB+IC1lbmNvZGluZ3MgaGV4dGlsZS4uLgogICAgICAgIFRvZ2dsZSBUaWdodC9aUkxFOiAgICAgICB+IC1lbmNvZGluZ3MgenJsZS4uLgogICAgICAgIFRvZ2dsZSBaUkxFL1pZV1JMRTogICAgICB+IC1lbmNvZGluZ3Mgenl3cmxlLi4uCiAgICAgICAgUXVhbGl0eSBMZXZlbCAgICAgICAgICAgIH4gLXF1YWxpdHkgKGJvdGggVGlnaHQgYW5kIFpZV1JMRSkKICAgICAgICBDb21wcmVzcyBMZXZlbCAgICAgICAgICAgfiAtY29tcHJlc3NsZXZlbAogICAgICAgIERpc2FibGUgSlBFRzogICAgICAgICAgICB+IC1ub2pwZWcgIChUaWdodCkKICAgICAgICBQaXBlbGluZSBVcGRhdGVzICAgICAgICAgfiAtcGlwZWxpbmUKCiAgICAgICAgRnVsbCBDb2xvciAgICAgICAgICAgICAgICAgYXMgbWFueSBjb2xvcnMgYXMgbG9jYWwgc2NyZWVuIGFsbG93cy4KICAgICAgICBHcmV5IHNjYWxlICgxNiAmIDgtYnBwKSAgfiAtZ3JleSwgZm9yIGxvdyBjb2xvcnMgMTYvOGJwcCBtb2RlcyBvbmx5LgogICAgICAgIDE2IGJpdCBjb2xvciAoQkdSNTY1KSAgICB+IC0xNmJwcCAvIC1iZ3I1NjUKICAgICAgICA4ICBiaXQgY29sb3IgKEJHUjIzMykgICAgfiAtYmdyMjMzCiAgICAgICAgMjU2IGNvbG9ycyAgICAgICAgICAgICAgIH4gLWJncjIzMyBkZWZhdWx0ICMgb2YgY29sb3JzLgogICAgICAgICA2NCBjb2xvcnMgICAgICAgICAgICAgICB+IC1iZ3IyMjIgLyAtdXNlNjQKICAgICAgICAgIDggY29sb3JzICAgICAgICAgICAgICAgfiAtYmdyMTExIC8gLXVzZTgKICAgICAgICBTY2FsZSBWaWV3ZXIgICAgICAgICAgICAgfiAtc2NhbGUKICAgICAgICBFc2NhcGUgS2V5czogVG9nZ2xlICAgICAgfiAtZXNjYXBlCiAgICAgICAgRXNjYXBlIEtleXM6IEhlbHArU2V0ICAgIH4gLWVzY2FwZQogICAgICAgIFNldCBZIENyb3AgKHktbWF4KSAgICAgICB+IC15Y3JvcAogICAgICAgIFNldCBTY3JvbGxiYXIgV2lkdGggICAgICB+IC1zYndpZHRoCiAgICAgICAgWEdyYWJTZXJ2ZXIgICAgICAgICAgICAgIH4gLWdyYWJhbGwKCiAgICAgICAgVWx0cmFWTkMgRXh0ZW5zaW9uczoKCiAgICAgICAgICBTZXQgMS9uIFNlcnZlciBTY2FsZSAgICAgVWx0cmF2bmMgZXh0LiBTY2FsZSBkZXNrdG9wIGJ5IDEvbi4KICAgICAgICAgIFRleHQgQ2hhdCAgICAgICAgICAgICAgICBVbHRyYXZuYyBleHQuIERvIFRleHQgQ2hhdC4KICAgICAgICAgIEZpbGUgVHJhbnNmZXIgICAgICAgICAgICBVbHRyYXZuYyBleHQuIEZpbGUgeGZlciB2aWEgSmF2YSBoZWxwZXIuCiAgICAgICAgICBTaW5nbGUgV2luZG93ICAgICAgICAgICAgVWx0cmF2bmMgZXh0LiBHcmFiIGFuZCB2aWV3IGEgc2luZ2xlIHdpbmRvdy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0IHRoZW4gY2xpY2sgb24gdGhlIHdpbmRvdyB5b3Ugd2FudCkuCiAgICAgICAgICBEaXNhYmxlIFJlbW90ZSBJbnB1dCAgICAgVWx0cmF2bmMgZXh0LiBUcnkgdG8gcHJldmVudCBpbnB1dCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3aW5nIG9mIG1vbml0b3IgYXQgcGh5c2ljYWwgZGlzcGxheS4KCiAgICAgICAgTm90ZTogdGhlIFVsdHJhdm5jIGV4dGVuc2lvbnMgb25seSBhcHBseSB0byBzZXJ2ZXJzIHRoYXQgc3VwcG9ydAogICAgICAgICAgICAgIHRoZW0uICB4MTF2bmMvbGlidm5jc2VydmVyIHN1cHBvcnRzIHNvbWUgb2YgdGhlbS4KCiAgICAgICAgU2VuZCBDbGlwYm9hcmQgbm90IFByaW1hcnkgIH4gLXNlbmRjbGlwYm9hcmQKICAgICAgICBTZW5kIFNlbGVjdGlvbiBFdmVyeSB0aW1lICAgfiAtc2VuZGFsd2F5cwoKICAgTmVhcmx5IGFsbCBvZiB0aGVzZSBjYW4gYmUgY2hhbmdlZCBkeW5hbWljYWxseSBpbiB0aGUgUG9wdXAgbWVudQogICAocHJlc3MgRjggZm9yIGl0KToKCiAgIFt2aWV3ZXJfbWVudS5naWZdIFt1bml4dmlld2VyLmpwZ10KCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFdpbmRvd3M6CgogICBGb3IgV2luZG93cywgU1NMIFZpZXdlciBzdXBwb3J0IGlzIHByb3ZpZGVkIGJ5IGEgR1VJIFdpbmRvd3Mvc3N2bmMuZXhlCiAgIHRoYXQgcHJvbXB0cyBmb3IgdGhlIFZOQyBkaXNwbGF5IGFuZCB0aGVuIHN0YXJ0cyB1cCBTVFVOTkVMIGZvbGxvd2VkCiAgIGJ5IHRoZSBTdG9jayBUaWdodFZOQyBXaW5kb3dzIFZpZXdlci4gQm90aCBhcmUgYnVuZGxlZCBpbiB0aGUgcGFja2FnZQogICBmb3IgeW91ciBjb252ZW5pZW5jZS4gVGhlIEdVSSBoYXMgb3RoZXIgdXNlZnVsIGZlYXR1cmVzLiBXaGVuIHRoZQogICBjb25uZWN0aW9uIGlzIGZpbmlzaGVkLCB5b3Ugd2lsbCBiZSBhc2tlZCBpZiB5b3Ugd2FudCB0byB0ZXJtaW5hdGUgdGhlCiAgIFNUVU5ORUwgcHJvZ3JhbS4gRm9yIFNTSCBjb25uZWN0aW9ucyBmcm9tIFdpbmRvd3MgdGhlIEdVSSB3aWxsIHVzZQogICBQTElOSyBpbnN0ZWFkIG9mIFNUVU5ORUwuCgogICBVbml4IGFuZCBNYWMgT1MgWDoKCiAgIFJ1biB0aGUgR1VJIChzc3ZuYywgc2VlIGFib3ZlKSBhbmQgbGV0IG1lIGtub3cgaG93IGl0IGdvZXMuCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIEhvcGVmdWxseSB0aGlzIHRvb2wgd2lsbCBtYWtlIGl0IGNvbnZlbmllbnQgZm9yIHBlb3BsZSB0byBoZWxwIHRlc3QKICAgYW5kIHVzZSB0aGUgYnVpbHQtaW4gU1NMIHN1cHBvcnQgaW4geDExdm5jLiBFeHRyYSB0ZXN0aW5nIG9mIHRoaXMKICAgZmVhdHVyZSBpcyBtdWNoIGFwcHJlY2lhdGVkISEgVGhhbmtzLgoKICAgUGxlYXNlIEhlbHAgVGVzdCB0aGUgbmV3bHkgYWRkZWQgZmVhdHVyZXM6CiAgICAgKiBBdXRvbWF0aWMgU2VydmljZSB0dW5uZWxsaW5nIHZpYSBTU0ggZm9yIENVUFMgYW5kIFNNQiBQcmludGluZwogICAgICogRVNEL0FSVFNEIEF1ZGlvCiAgICAgKiBTTUIgKFdpbmRvd3MvU2FtYmEpIGZpbGVzeXN0ZW0gbW91bnRpbmcKCiAgIFRoZXNlIGFsbG93IHlvdSB0byBwcmludCBmcm9tIHRoZSByZW1vdGUgKFZOQyBTZXJ2ZXIpIG1hY2hpbmUgdG8gbG9jYWwKICAgcHJpbnRlcnMsIGxpc3RlbiB0byBzb3VuZHMgKHdpdGggc29tZSBsaW1pdGF0aW9ucykgZnJvbSB0aGUgcmVtb3RlIFZOQwogICBTZXJ2ZXIgbWFjaGluZSwgYW5kIHRvIG1vdW50IHlvdXIgbG9jYWwgV2luZG93cyBvciBTYW1iYSBzaGFyZXMgb24gdGhlCiAgIHJlbW90ZSBWTkMgU2VydmVyIG1hY2hpbmUuIEJhc2ljYWxseSB0aGVzZSBuZXcgZmVhdHVyZXMgdHJ5IHRvCiAgIGF1dG9tYXRlIHRoZSB0cmlja3MgZGVzY3JpYmVkIGhlcmU6CiAgICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sI2ZhcS1zbWItc2hhcmVzCiAgICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sI2ZhcS1jdXBzCiAgICBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL2ZhcS5odG1sI2ZhcS1zb3VuZAogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBEb3dubG9hZGluZzogRG93bmxvYWRzIGZvciB0aGlzIHByb2plY3QgYXJlIGhvc3RlZCBhdCBTb3VyY2Vmb3JnZS5uZXQuCgogICBDaG9vc2UgdGhlIGFyY2hpdmUgZmlsZSBidW5kbGUgdGhhdCBiZXN0IHN1aXRzIHlvdSAoZS5nLiBubyBzb3VyY2UKICAgY29kZSwgd2luZG93cyBvbmx5LCB1bml4IG9ubHksIHppcCwgdGFyIGV0YykuCgogICBBIHF1aWNrIGd1aWRlOgoKICAgICAgT24gc29tZSBmbGF2b3Igb2YgVW5peCwgZS5nLiBMaW51eCBvciBTb2xhcmlzPyBVc2UKICAgInNzdm5jX3VuaXhfb25seSIgKG9yICJzc3ZuY19ub193aW5kb3dzIiB0byByZWNvbXBpbGUpLgogICAgICBPbiBNYWMgT1MgWD8gVXNlICJzc3ZuY19ub193aW5kb3dzIi4KICAgICAgT24gV2luZG93cz8gVXNlICJzc3ZuY193aW5kb3dzX29ubHkiLgogIHNzdm5jX3dpbmRvd3Nfb25seS0xLjAuMjguemlwICAgICAgV2luZG93cyBCaW5hcmllcyBPbmx5LiAgTm8gc291cmNlIGluY2x1ZGVkCiAoNi4yTUIpCiAgc3N2bmNfbm9fd2luZG93cy0xLjAuMjgudGFyLmd6ICAgICBVbml4IGFuZCBNYWMgT1MgWCBPbmx5LiBObyBXaW5kb3dzIGJpbmFyaWUKcy4gIFNvdXJjZSBpbmNsdWRlZC4gKDEwLjFNQikKICBzc3ZuY191bml4X29ubHktMS4wLjI4LnRhci5neiAgICAgIFVuaXggQmluYXJpZXMgT25seS4gICAgIE5vIHNvdXJjZSBpbmNsdWRlZAouICg3LjJNQikKICBzc3ZuY191bml4X21pbmltYWwtMS4wLjI4LnRhci5neiAgIFVuaXggTWluaW1hbC4gIFlvdSBtdXN0IHN1cHBseSB5b3VyIG93biB2bgpjdmlld2VyIGFuZCBzdHVubmVsLiAoMC4yTUIpCgogIHNzdm5jLTEuMC4yOC50YXIuZ3ogICAgICAgICAgICAgICAgQWxsIFVuaXgsIE1hYyBPUyBYLCBhbmQgV2luZG93cyBiaW5hcmllcyBhCm5kIHNvdXJjZSBUR1ouICgxNi4xTUIpCiAgc3N2bmMtMS4wLjI4LnppcCAgICAgICAgICAgICAgICAgICBBbGwgVW5peCwgTWFjIE9TIFgsIGFuZCBXaW5kb3dzIGJpbmFyaWVzIGEKbmQgc291cmNlIFpJUC4gKDE2LjRNQikKICBzc3ZuY19hbGwtMS4wLjI4LnppcCAgICAgICAgICAgICAgIEFsbCBVbml4LCBNYWMgT1MgWCwgYW5kIFdpbmRvd3MgYmluYXJpZXMgYQpuZCBzb3VyY2UgQU5EIGZ1bGwgYXJjaGl2ZXMgaW4gdGhlIHppcCBkaXIuICgxOS4yTUIpCgoKICAgSGVyZSBpcyBhIGNvbnZlbnRpb25hbCBzb3VyY2UgdGFyYmFsbDoKICBzc3ZuYy0xLjAuMjguc3JjLnRhci5neiAgICAgICAgICAgIENvbnZlbnRpb25hbCBTb3VyY2UgZm9yIFNTVk5DIEdVSSBhbmQgVW5peAogVk5Ddmlld2VyICAoMC41TUIpCgogICBpdCB3aWxsIGJlIG9mIHVzZSB0byB0aG9zZSB3aG8gZG8gbm90IHdhbnQgdGhlIFNTVk5DCiAgICJvbmUtc2l6ZS1maXRzLWFsbCIgYnVuZGxlcy4gRm9yIGV4YW1wbGUsIHBhY2thZ2UvZGlzdHJvIG1haW50YWluZXJzCiAgIHdpbGwgZmluZCB0aGlzIG1vcmUgZmFtaWxpYXIgYW5kIHVzZWZ1bCB0byB0aGVtIChpLmUuIHRoZXkgcnVuOiAibWFrZQogICBjb25maWc7IG1ha2UgYWxsOyBtYWtlIGluc3RhbGwiKS4gTm90ZSB0aGF0IGl0IGRvZXMgbm90IGluY2x1ZGUgdGhlCiAgIHN0dW5uZWwgc291cmNlLCBhbmQgc28gaGFzIGEgZGVwZW5kZW5jeSB0aGF0IHRoZSBzeXN0ZW0gc3R1bm5lbCBpcwogICBpbnN0YWxsZWQuCgogICBSZWFkIHRoZSBSRUFETUUuc3JjIGZpbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdXNpbmcgdGhlCiAgIGNvbnZlbnRpb25hbCBzb3VyY2UgdGFyYmFsbC4KCgogICBOb3RlOiBldmVuIHdpdGggdGhlIFVuaXggYnVuZGxlcywgZS5nLiAic3N2bmNfbm9fd2luZG93cyIgb3IKICAgInNzdm5jX2FsbCIsIHlvdSBtYXkgbmVlZCB0byBydW4gdGhlICIuL2J1aWxkLnVuaXgiIHNjcmlwdCBpbiB0aGUgdG9wCiAgIGRpcmVjdG9yeSB0byByZWNvbXBpbGUgZm9yIHlvdXIgb3BlcmF0aW5nIHN5c3RlbS4KCiAgIEhlcmUgYXJlIHRoZSBjb3JyZXNwb25kaW5nIDEuMC4yOSBkZXZlbG9wbWVudCBidW5kbGVzIChQbGVhc2UgaGVscAogICB0ZXN0IHRoZW0pOgoKICBzc3ZuY193aW5kb3dzX29ubHktMS4wLjI5LnppcAogIHNzdm5jX25vX3dpbmRvd3MtMS4wLjI5LnRhci5negogIHNzdm5jX3VuaXhfb25seS0xLjAuMjkudGFyLmd6CiAgc3N2bmNfdW5peF9taW5pbWFsLTEuMC4yOS50YXIuZ3oKCiAgc3N2bmMtMS4wLjI5LnRhci5negogIHNzdm5jLTEuMC4yOS56aXAKICBzc3ZuY19hbGwtMS4wLjI5LnppcAoKICBzc3ZuYy0xLjAuMjkuc3JjLnRhci5neiAgICAgICAgICAgIENvbnZlbnRpb25hbCBTb3VyY2UgZm9yIFNTVk5DIEdVSSBhbmQgVW5peAogVk5Ddmlld2VyICAoMC41TUIpCgoKICAgRm9yIGFueSBVbml4IHN5c3RlbSwgYSBzZWxmLWV4dHJhY3RpbmcgYW5kIHJ1bm5pbmcgZmlsZSBmb3IgdGhlCiAgICJzc3ZuY191bml4X21pbmltYWwiIHBhY2thZ2UgaXMgaGVyZTogc3N2bmMuIFNhdmUgaXQgYXMgZmlsZW5hbWUKICAgInNzdm5jIiwgdHlwZSAiY2htb2QgNzU1IC4vc3N2bmMiLCBhbmQgdGhlbiBsYXVuY2ggdGhlIEdVSSB2aWEgdHlwaW5nCiAgICIuL3Nzdm5jIi4gTm90ZSB0aGF0IHRoaXMgInNzdm5jX3VuaXhfbWluaW1hbCIgbW9kZSByZXF1aXJlcyB5b3UKICAgaW5zdGFsbCB0aGUgInN0dW5uZWwiIGFuZCAidm5jdmlld2VyIiBwcm9ncmFtcyBleHRlcm5hbGx5IChmb3IKICAgZXhhbXBsZSwgaW5zdGFsbCB5b3VyIGRpc3Ryb3MnIHZlcnNpb25zLCBlLmcuIG9uIGRlYmlhbjogImFwdC1nZXQKICAgaW5zdGFsbCBzdHVubmVsNCB4dGlnaHR2bmN2aWV3ZXIiLikgSXQgd2lsbCB3b3JrLCBidXQgbWFueSBvZiB0aGUKICAgU1NWTkMgZmVhdHVyZXMgd2lsbCBiZSBtaXNzaW5nLgoKICAgUHJldmlvdXMgcmVsZWFzZXM6CiAgICAgIFJlbGVhc2UgMS4wLjE4IGF0IFNvdXJjZWZvcmdlLm5ldAogICAgICBSZWxlYXNlIDEuMC4xOSBhdCBTb3VyY2Vmb3JnZS5uZXQKICAgICAgUmVsZWFzZSAxLjAuMjAgYXQgU291cmNlZm9yZ2UubmV0CiAgICAgIFJlbGVhc2UgMS4wLjIxIGF0IFNvdXJjZWZvcmdlLm5ldAogICAgICBSZWxlYXNlIDEuMC4yMiBhdCBTb3VyY2Vmb3JnZS5uZXQKICAgICAgUmVsZWFzZSAxLjAuMjMgYXQgU291cmNlZm9yZ2UubmV0CiAgICAgIFJlbGVhc2UgMS4wLjI0IGF0IFNvdXJjZWZvcmdlLm5ldAogICAgICBSZWxlYXNlIDEuMC4yNSBhdCBTb3VyY2Vmb3JnZS5uZXQKICAgICAgUmVsZWFzZSAxLjAuMjYgYXQgU291cmNlZm9yZ2UubmV0CiAgICAgIFJlbGVhc2UgMS4wLjI3IGF0IFNvdXJjZWZvcmdlLm5ldAogICAgICBSZWxlYXNlIDEuMC4yOCBhdCBTb3VyY2Vmb3JnZS5uZXQKCgogICBQbGVhc2UgaGVscCB0ZXN0IHRoZSBVbHRyYVZOQyBGaWxlIFRyYW5zZmVyIHN1cHBvcnQgaW4gdGhlIG5hdGl2ZSBVbml4CiAgIFZOQyB2aWV3ZXIhIExldCB1cyBrbm93IGhvdyBpdCB3ZW50LgoKICAgQ3VycmVudCBVbml4IGJpbmFyaWVzIGluIHRoZSBhcmNoaXZlczoKICAgIExpbnV4Lmk2ODYKICAgIExpbnV4Lng4Nl82NAogICAgTGludXgucHBjNjQgICAgWCAocmVtb3ZlZCkKICAgIExpbnV4LmFscGhhICAgIFggKHJlbW92ZWQpCiAgICBTdW5PUy5zdW40dQogICAgU3VuT1Muc3VuNG0KICAgIFN1bk9TLmk4NnBjCiAgICBEYXJ3aW4uUG93ZXIuTWFjaW50b3NoCiAgICBEYXJ3aW4uaTM4NgogICAgSFAtVVguOTAwMCAgICAgWCAocmVtb3ZlZCkKICAgIEZyZWVCU0QuaTM4NiAgIFggKHJlbW92ZWQpCiAgICBOZXRCU0QuaTM4NiAgICBYIChyZW1vdmVkKQogICAgT3BlbkJTRC5pMzg2ICAgWCAocmVtb3ZlZCkKCiAgIChzb21lIG9mIHRoZXNlIGFyZSBvdXQgb2YgZGF0ZSwgbWFya2VkIHdpdGggJ1gnIGFib3ZlLCBiZWNhdXNlIEkgbm8KICAgbG9uZ2VyIGhhdmUgYWNjZXNzIHRvIG1hY2hpbmVzIHJ1bm5pbmcgdGhvc2UgT1Mncy4gVXNlIHRoZQogICAiYnVpbGQudW5peCIgc2NyaXB0IHRvIHJlY29tcGlsZSBvbiB5b3VyIHN5c3RlbSkuCgogICBOb3RlOiBzb21lIG9mIHRoZSBhYm92ZSBiaW5hcmllcyBkZXBlbmQgb24gbGlic3NsLnNvLjAuOS43LCB3aGVyZWFzCiAgIHNvbWUgcmVjZW50IGRpc3Ryb3Mgb25seSBwcm92aWRlIGxpYnNzbC5zby4wLjkuOCBieSBkZWZhdWx0IChmb3IKICAgY29tcGF0aWJpbGl0eSByZWFzb25zIHRoZXkgc2hvdWxkIGluc3RhbGwgYm90aCBieSBkZWZhdWx0IGJ1dCBub3QgYWxsCiAgIGRvKS4gU28geW91IG1heSBuZWVkIHRvIGluc3RydWN0IHlvdXIgZGlzdHJvIHRvIGluc3RhbGwgdGhlIDAuOS43CiAgIGxpYnJhcnkgKGl0IGlzIGZpbmUgdG8gaGF2ZSBib3RoIHJ1bnRpbWVzIGluc3RhbGxlZCBzaW11bHRhbmVvdXNseQogICBzaW5jZSB0aGUgbGlicmFyaWVzIGhhdmUgZGlmZmVyZW50IG5hbWVzKS4gVXBkYXRlOiBJIG5vdyB0cnkgdG8KICAgc3RhdGljYWxseSBsaW5rIGxpYnNzbC5hIGZvciBhbGwgb2YgdGhlIGJpbmFyaWVzIGluIHRoZSBhcmNoaXZlLgoKICAgWW91IGNhbiBhbHNvIHJ1biB0aGUgaW5jbHVkZWQgYnVpbGQudW5peCBzY3JpcHQgdG8gdHJ5IHRvCiAgIGF1dG9tYXRpY2FsbHkgYnVpbGQgdGhlIGJpbmFyaWVzIGlmIHlvdXIgT1MgaXMgbm90IGluIHRoZSBhYm92ZSBsaXN0CiAgIG9yIHRoZSBpbmNsdWRlZCBiaW5hcnkgZG9lcyBub3QgcnVuIHByb3Blcmx5IG9uIHlvdXIgc3lzdGVtLiBMZXQgbWUKICAga25vdyBob3cgdGhhdCBnb2VzLgogICAgIF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCgogICBJTVBPUlRBTlQ6IHRoZXJlIG1heSBiZSByZXN0cmljdGlvbnMgZm9yIHlvdSB0byBkb3dubG9hZCwgdXNlLCBvcgogICByZWRpc3RyaWJ1dGUgdGhlIGFib3ZlIGJlY2F1c2Ugb2YgY3J5cHRvZ3JhcGhpYyBzb2Z0d2FyZSB0aGV5IGNvbnRhaW4KICAgb3IgZm9yIG90aGVyIHJlYXNvbnMuIFBsZWFzZSBjaGVjayBvdXQgeW91ciBzaXR1YXRpb24gYW5kIGluZm9ybWF0aW9uCiAgIGF0IHRoZSBmb2xsb3dpbmcgYW5kIHJlbGF0ZWQgc2l0ZXM6CiAgICAgICAgaHR0cDovL3N0dW5uZWwubWlydC5uZXQKICAgICAgICBodHRwOi8vd3d3LnN0dW5uZWwub3JnCiAgICAgICAgaHR0cDovL3d3dy5vcGVuc3NsLm9yZwogICAgICAgIGh0dHA6Ly93d3cuY2hpYXJrLmdyZWVuZW5kLm9yZy51ay9+c2d0YXRoYW0vcHV0dHkvCiAgICAgICAgaHR0cDovL3d3dy50aWdodHZuYy5jb20KICAgICAgICBodHRwOi8vd3d3LnJlYWx2bmMuY29tCiAgICAgICAgaHR0cDovL3NvdXJjZWZvcmdlLm5ldC9wcm9qZWN0cy9jb3R2bmMvCiAgICAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KCiAgIFJFQURNRTogSGVyZSBpcyB0aGUgdG9wbGV2ZWwgUkVBRE1FIGZyb20gdGhlIGJ1bmRsZS4KCQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3gxMXZuY19vcHRzLmh0bWw6CgoKICAgICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKeDExdm5jOiBhIFZOQyBzZXJ2ZXIgZm9yIHJlYWwgWCBkaXNwbGF5cwoKICAgSGVyZSBhcmUgYWxsIG9mIHgxMXZuYyBjb21tYW5kIGxpbmUgb3B0aW9uczoKJSB4MTF2bmMgLW9wdHMgICAgICAoc2VlIGJlbG93IGZvciAtaGVscCBsb25nIGRlc2NyaXB0aW9ucykKCngxMXZuYzogYWxsb3cgVk5DIGNvbm5lY3Rpb25zIHRvIHJlYWwgWDExIGRpc3BsYXlzLiAwLjkuMTMgbGFzdG1vZDogMjAxMC0xMi0yNwoKeDExdm5jIG9wdGlvbnM6CiAgLWRpc3BsYXkgZGlzcCAgICAgICAgICAgIC1hdXRoIGZpbGUgICAgICAgICAgICAgICAtTiAgICAgICAgICAgICAgICAgICAgIAogIC1hdXRvcG9ydCBuICAgICAgICAgICAgICAtcmZicG9ydCBzdHIgICAgICAgICAgICAgLTYgICAgICAgICAgICAgICAgICAgICAKICAtbm82ICAgICAgICAgICAgICAgICAgICAgLW5vaXB2NiAgICAgICAgICAgICAgICAgIC1ub2lwdjQgICAgICAgICAgICAgICAgCiAgLXJlb3BlbiAgICAgICAgICAgICAgICAgIC1yZWZsZWN0IGhvc3Q6TiAgICAgICAgICAtaWQgd2luZG93aWQgICAgICAgICAgIAogIC1zaWQgd2luZG93aWQgICAgICAgICAgICAtYXBwc2hhcmUgICAgICAgICAgICAgICAgLWNsaXAgV3hIK1grWSAgICAgICAgICAKICAtZmxhc2hjbWFwICAgICAgICAgICAgICAgLXNoaWZ0Y21hcCBuICAgICAgICAgICAgIC1ub3RydWVjb2xvciAgICAgICAgICAgCiAgLWFkdmVydGlzZV90cnVlY29sb3IgICAgIC12aXN1YWwgbiAgICAgICAgICAgICAgICAtb3ZlcmxheSAgICAgICAgICAgICAgIAogIC1vdmVybGF5X25vY3Vyc29yICAgICAgICAtOHRvMjQgW29wdHNdICAgICAgICAgICAgLTI0dG8zMiAgICAgICAgICAgICAgICAKICAtc2NhbGUgZnJhY3Rpb24gICAgICAgICAgLWdlb21ldHJ5IFd4SCAgICAgICAgICAgIC1zY2FsZV9jdXJzb3IgZnJhYyAgICAgCiAgLXZpZXdvbmx5ICAgICAgICAgICAgICAgIC1zaGFyZWQgICAgICAgICAgICAgICAgICAtb25jZSAgICAgICAgICAgICAgICAgIAogIC1mb3JldmVyICAgICAgICAgICAgICAgICAtbG9vcCAgICAgICAgICAgICAgICAgICAgLXRpbWVvdXQgbiAgICAgICAgICAgICAKICAtc2xlZXBpbiBuICAgICAgICAgICAgICAgLWluZXRkICAgICAgICAgICAgICAgICAgIC10aWdodGZpbGV4ZmVyICAgICAgICAgCiAgLXVsdHJhZmlsZXhmZXIgICAgICAgICAgIC1odHRwICAgICAgICAgICAgICAgICAgICAtaHR0cF9zc2wgICAgICAgICAgICAgIAogIC1hdmFoaSAgICAgICAgICAgICAgICAgICAtbWRucyAgICAgICAgICAgICAgICAgICAgLXplcm9jb25mICAgICAgICAgICAgICAKICAtY29ubmVjdCBzdHJpbmcgICAgICAgICAgLWNvbm5lY3Rfb3JfZXhpdCBzdHIgICAgIC1wcm94eSBzdHJpbmcgICAgICAgICAgCiAgLXZuY2Nvbm5lY3QgICAgICAgICAgICAgIC1ub3ZuY2Nvbm5lY3QgICAgICAgICAgICAtYWxsb3cgaG9zdDFbLGhvc3QyLi5dIAogIC1sb2NhbGhvc3QgICAgICAgICAgICAgICAtdW5peHNvY2sgc3RyICAgICAgICAgICAgLWxpc3RlbjYgc3RyICAgICAgICAgICAKICAtbm9sb29rdXAgICAgICAgICAgICAgICAgLWlucHV0IHN0cmluZyAgICAgICAgICAgIC1ncmFia2JkICAgICAgICAgICAgICAgCiAgLWdyYWJwdHIgICAgICAgICAgICAgICAgIC11bmdyYWJib3RoICAgICAgICAgICAgICAtZ3JhYmFsd2F5cyAgICAgICAgICAgIAogIC12aWV3cGFzc3dkIHN0cmluZyAgICAgICAtcGFzc3dkZmlsZSBmaWxlbmFtZSAgICAgLXNob3dyZmJhdXRoIGZpbGVuYW1lICAKICAtdW5peHB3IFtsaXN0XSAgICAgICAgICAgLXVuaXhwd19uaXMgW2xpc3RdICAgICAgIC11bml4cHdfY21kIGNtZCAgICAgICAgCiAgLWZpbmQgICAgICAgICAgICAgICAgICAgIC1maW5kZHB5ICAgICAgICAgICAgICAgICAtbGlzdGRweSAgICAgICAgICAgICAgIAogIC1maW5kYXV0aCBbZGlzcF0gICAgICAgICAtY3JlYXRlICAgICAgICAgICAgICAgICAgLXhkdW1teSAgICAgICAgICAgICAgICAKICAteHZuYyAgICAgICAgICAgICAgICAgICAgLXh2bmNfcmVkaXJlY3QgICAgICAgICAgIC14ZHVtbXlfeHZmYiAgICAgICAgICAgCiAgLWNyZWF0ZV94c3J2IHN0ciAgICAgICAgIC1zdmMgICAgICAgICAgICAgICAgICAgICAtc3ZjX3hkdW1teSAgICAgICAgICAgIAogIC1zdmNfeHZuYyAgICAgICAgICAgICAgICAtc3ZjX3hkdW1teV94dmZiICAgICAgICAgLXhkbXN2YyAgICAgICAgICAgICAgICAKICAtc3NoeGRtc3ZjICAgICAgICAgICAgICAgLXVuaXhwd19zeXN0ZW1fZ3JlZXRlciAgIC1yZWRpcmVjdCBwb3J0ICAgICAgICAgCiAgLWRpc3BsYXkgV0FJVDouLi4gICAgICAgIC12ZW5jcnlwdCBtb2RlICAgICAgICAgICAtYW5vbnRscyBtb2RlICAgICAgICAgIAogIC1zc2xvbmx5ICAgICAgICAgICAgICAgICAtZGhwYXJhbXMgZmlsZSAgICAgICAgICAgLW5vc3NsICAgICAgICAgICAgICAgICAKICAtc3NsIFtwZW1dICAgICAgICAgICAgICAgLXNzbHRpbWVvdXQgbiAgICAgICAgICAgIC1zc2xub2ZhaWwgICAgICAgICAgICAgCiAgLXNzbGRpciBkaXIgICAgICAgICAgICAgIC1zc2x2ZXJpZnkgcGF0aCAgICAgICAgICAtc3NsQ1JMIHBhdGggICAgICAgICAgIAogIC1zc2xHZW5DQSBbZGlyXSAgICAgICAgICAtc3NsR2VuQ2VydCB0eXBlIG5hbWUgICAgLXNzbEVuY0tleSBwZW0gICAgICAgICAKICAtc3NsQ2VydEluZm8gcGVtICAgICAgICAgLXNzbERlbENlcnQgcGVtICAgICAgICAgIC1zc2xTY3JpcHRzICAgICAgICAgICAgCiAgLXN0dW5uZWwgW3BlbV0gICAgICAgICAgIC1zdHVubmVsMyAgW3BlbV0gICAgICAgICAtZW5jIGNpcGhlcjprZXlmaWxlICAgIAogIC1odHRwcyBbcG9ydF0gICAgICAgICAgICAtaHR0cHNyZWRpciBbcG9ydF0gICAgICAgLWh0dHBfb25lcG9ydCAgICAgICAgICAKICAtc3NoIHVzZXJAaG9zdDpkaXNwICAgICAgLXVzZXB3ICAgICAgICAgICAgICAgICAgIC1zdG9yZXBhc3N3ZCBwYXNzIGZpbGUgCiAgLW5vcHcgICAgICAgICAgICAgICAgICAgIC1hY2NlcHQgc3RyaW5nICAgICAgICAgICAtYWZ0ZXJhY2NlcHQgc3RyaW5nICAgIAogIC1nb25lIHN0cmluZyAgICAgICAgICAgICAtdXNlcnMgbGlzdCAgICAgICAgICAgICAgLW5vc2htICAgICAgICAgICAgICAgICAKICAtZmxpcGJ5dGVvcmRlciAgICAgICAgICAgLW9uZXRpbGUgICAgICAgICAgICAgICAgIC1zb2xpZCBbY29sb3JdICAgICAgICAgCiAgLWJsYWNrb3V0IHN0cmluZyAgICAgICAgIC14aW5lcmFtYSAgICAgICAgICAgICAgICAtbm94aW5lcmFtYSAgICAgICAgICAgIAogIC14dHJhcCAgICAgICAgICAgICAgICAgICAteHJhbmRyIFttb2RlXSAgICAgICAgICAgLXJvdGF0ZSBzdHJpbmcgICAgICAgICAKICAtcGFkZ2VvbSBXeEggICAgICAgICAgICAgLW8gbG9nZmlsZSAgICAgICAgICAgICAgIC1mbGFnIGZpbGUgICAgICAgICAgICAgCiAgLXJtZmxhZyBmaWxlICAgICAgICAgICAgIC1yYyBmaWxlbmFtZSAgICAgICAgICAgICAtbm9yYyAgICAgICAgICAgICAgICAgIAogIC1lbnYgVkFSPVZBTFVFICAgICAgICAgICAtcHJvZyAvcGF0aC90by94MTF2bmMgICAgLWgsIC1oZWxwICAgICAgICAgICAgICAKICAtPywgLW9wdHMgICAgICAgICAgICAgICAgLVYsIC12ZXJzaW9uICAgICAgICAgICAgIC1saWNlbnNlICAgICAgICAgICAgICAgCiAgLWRiZyAgICAgICAgICAgICAgICAgICAgIC1xLCAtcXVpZXQgICAgICAgICAgICAgICAtdiwgLXZlcmJvc2UgICAgICAgICAgIAogIC1iZyAgICAgICAgICAgICAgICAgICAgICAtbW9kdHdlYWsgICAgICAgICAgICAgICAgLW5vbW9kdHdlYWsgICAgICAgICAgICAKICAteGtiICAgICAgICAgICAgICAgICAgICAgLW5veGtiICAgICAgICAgICAgICAgICAgIC1jYXBzbG9jayAgICAgICAgICAgICAgCiAgLXNraXBfbG9ja2tleXMgICAgICAgICAgIC1ub3NraXBfbG9ja2tleXMgICAgICAgICAtc2tpcF9rZXljb2RlcyBzdHJpbmcgIAogIC1zbG9wcHlfa2V5cyAgICAgICAgICAgICAtc2tpcF9kdXBzICAgICAgICAgICAgICAgLW5vc2tpcF9kdXBzICAgICAgICAgICAKICAtYWRkX2tleXN5bXMgICAgICAgICAgICAgLW5vYWRkX2tleXN5bXMgICAgICAgICAgIC1jbGVhcl9tb2RzICAgICAgICAgICAgCiAgLWNsZWFyX2tleXMgICAgICAgICAgICAgIC1jbGVhcl9hbGwgICAgICAgICAgICAgICAtcmVtYXAgc3RyaW5nICAgICAgICAgIAogIC1ub3JlcGVhdCAgICAgICAgICAgICAgICAtcmVwZWF0ICAgICAgICAgICAgICAgICAgLW5vZmIgICAgICAgICAgICAgICAgICAKICAtbm9iZWxsICAgICAgICAgICAgICAgICAgLW5vc2VsICAgICAgICAgICAgICAgICAgIC1ub3ByaW1hcnkgICAgICAgICAgICAgCiAgLW5vc2V0cHJpbWFyeSAgICAgICAgICAgIC1ub2NsaXBib2FyZCAgICAgICAgICAgICAtbm9zZXRjbGlwYm9hcmQgICAgICAgIAogIC1zZWxkaXIgc3RyaW5nICAgICAgICAgICAtY3Vyc29yIFttb2RlXSAgICAgICAgICAgLW5vY3Vyc29yICAgICAgICAgICAgICAKICAtY3Vyc29yX2RyYWcgICAgICAgICAgICAgLWFycm93IG4gICAgICAgICAgICAgICAgIC1ub3hmaXhlcyAgICAgICAgICAgICAgCiAgLWFscGhhY3V0IG4gICAgICAgICAgICAgIC1hbHBoYWZyYWMgZnJhY3Rpb24gICAgICAtYWxwaGFyZW1vdmUgICAgICAgICAgIAogIC1ub2FscGhhYmxlbmQgICAgICAgICAgICAtbm9jdXJzb3JzaGFwZSAgICAgICAgICAgLWN1cnNvcnBvcyAgICAgICAgICAgICAKICAtbm9jdXJzb3Jwb3MgICAgICAgICAgICAgLXh3YXJwcG9pbnRlciAgICAgICAgICAgIC1ub3h3YXJwcG9pbnRlciAgICAgICAgCiAgLWFsd2F5c19pbmplY3QgICAgICAgICAgIC1idXR0b25tYXAgc3RyaW5nICAgICAgICAtbm9kcmFnZ2luZyAgICAgICAgICAgIAogIC1uY2FjaGUgbiAgICAgICAgICAgICAgICAtbmNhY2hlX2NyICAgICAgICAgICAgICAgLW5jYWNoZV9ub19tb3ZlcmFpc2UgICAKICAtbmNhY2hlX25vX2R0Y2hhbmdlICAgICAgLW5jYWNoZV9ub19yb290cGl4bWFwICAgIC1uY2FjaGVfa2VlcF9hbmltcyAgICAgCiAgLW5jYWNoZV9vbGRfd20gICAgICAgICAgIC1uY2FjaGVfcGFkIG4gICAgICAgICAgICAtZGVidWdfbmNhY2hlICAgICAgICAgIAogIC13aXJlZnJhbWUgW3N0cl0gICAgICAgICAtbm93aXJlZnJhbWUgICAgICAgICAgICAgLW5vd2lyZWZyYW1lbG9jYWwgICAgICAKICAtd2lyZWNvcHlyZWN0IG1vZGUgICAgICAgLW5vd2lyZWNvcHlyZWN0ICAgICAgICAgIC1kZWJ1Z193aXJlZnJhbWUgICAgICAgCiAgLXNjcm9sbGNvcHlyZWN0IG1vZGUgICAgIC1ub3Njcm9sbGNvcHlyZWN0ICAgICAgICAtc2NyX2FyZWEgbiAgICAgICAgICAgIAogIC1zY3Jfc2tpcCBsaXN0ICAgICAgICAgICAtc2NyX2luYyBsaXN0ICAgICAgICAgICAgLXNjcl9rZXlzIGxpc3QgICAgICAgICAKICAtc2NyX3Rlcm0gbGlzdCAgICAgICAgICAgLXNjcl9rZXlyZXBlYXQgbG8taGkgICAgIC1zY3JfcGFybXMgc3RyaW5nICAgICAgCiAgLWZpeHNjcmVlbiBzdHJpbmcgICAgICAgIC1kZWJ1Z19zY3JvbGwgICAgICAgICAgICAtbm94cmVjb3JkICAgICAgICAgICAgIAogIC1ncmFiX2J1c3RlciAgICAgICAgICAgICAtbm9ncmFiX2J1c3RlciAgICAgICAgICAgLWRlYnVnX2dyYWJzICAgICAgICAgICAKICAtZGVidWdfc2VsICAgICAgICAgICAgICAgLXBvaW50ZXJfbW9kZSBuICAgICAgICAgIC1pbnB1dF9za2lwIG4gICAgICAgICAgCiAgLWFsbGlucHV0ICAgICAgICAgICAgICAgIC1pbnB1dF9lYWdlcmx5ICAgICAgICAgICAtc3BlZWRzIHJkLGJ3LGxhdCAgICAgIAogIC13bWR0IHN0cmluZyAgICAgICAgICAgICAtZGVidWdfcG9pbnRlciAgICAgICAgICAgLWRlYnVnX2tleWJvYXJkICAgICAgICAKICAtZGVmZXIgdGltZSAgICAgICAgICAgICAgLXdhaXQgdGltZSAgICAgICAgICAgICAgIC1leHRyYV9mYnVyIG4gICAgICAgICAgCiAgLXdhaXRfdWkgZmFjdG9yICAgICAgICAgIC1zZXRkZWZlciBuICAgICAgICAgICAgICAtbm93YWl0X2JvZyAgICAgICAgICAgIAogIC1zbG93X2ZiIHRpbWUgICAgICAgICAgICAteHJlZnJlc2ggdGltZSAgICAgICAgICAgLW5hcCAgICAgICAgICAgICAgICAgICAKICAtbm9uYXAgICAgICAgICAgICAgICAgICAgLXNiIHRpbWUgICAgICAgICAgICAgICAgIC1yZWFkdGltZW91dCBuICAgICAgICAgCiAgLXBpbmcgbiAgICAgICAgICAgICAgICAgIC1ub2ZicG0gICAgICAgICAgICAgICAgICAtZmJwbSAgICAgICAgICAgICAgICAgIAogIC1ub2RwbXMgICAgICAgICAgICAgICAgICAtZHBtcyAgICAgICAgICAgICAgICAgICAgLWZvcmNlZHBtcyAgICAgICAgICAgICAKICAtY2xpZW50ZHBtcyAgICAgICAgICAgICAgLW5vc2VydmVyZHBtcyAgICAgICAgICAgIC1ub3VsdHJhZXh0ICAgICAgICAgICAgCiAgLWNoYXR3aW5kb3cgICAgICAgICAgICAgIC1ub3hkYW1hZ2UgICAgICAgICAgICAgICAteGRfYXJlYSBBICAgICAgICAgICAgIAogIC14ZF9tZW0gZiAgICAgICAgICAgICAgICAtc2lncGlwZSBzdHJpbmcgICAgICAgICAgLXRocmVhZHMgICAgICAgICAgICAgICAKICAtbm90aHJlYWRzICAgICAgICAgICAgICAgLWZzIGYgICAgICAgICAgICAgICAgICAgIC1nYXBzIG4gICAgICAgICAgICAgICAgCiAgLWdyb3cgbiAgICAgICAgICAgICAgICAgIC1mdXp6IG4gICAgICAgICAgICAgICAgICAtZGVidWdfdGlsZXMgICAgICAgICAgIAogIC1zbmFwZmIgICAgICAgICAgICAgICAgICAtcmF3ZmIgc3RyaW5nICAgICAgICAgICAgLWZyZXF0YWIgZmlsZSAgICAgICAgICAKICAtcGlwZWlucHV0IGNtZCAgICAgICAgICAgLW1hY25vZGltICAgICAgICAgICAgICAgIC1tYWNub3NsZWVwICAgICAgICAgICAgCiAgLW1hY25vc2F2ZXIgICAgICAgICAgICAgIC1tYWNub3dhaXQgICAgICAgICAgICAgICAtbWFjd2hlZWwgbiAgICAgICAgICAgIAogIC1tYWNub3N3YXAgICAgICAgICAgICAgICAtbWFjbm9yZXNpemUgICAgICAgICAgICAgLW1hY2ljb25hbmltIG4gICAgICAgICAKICAtbWFjbWVudSAgICAgICAgICAgICAgICAgLW1hY3Vza2JkICAgICAgICAgICAgICAgIC1tYWNub29wZW5nbCAgICAgICAgICAgCiAgLW1hY25vcmF3ZmIgICAgICAgICAgICAgIC1ndWkgW2d1aS1vcHRzXSAgICAgICAgICAtcmVtb3RlIGNvbW1hbmQgICAgICAgIAogIC1xdWVyeSB2YXJpYWJsZSAgICAgICAgICAtUUQgdmFyaWFibGUgICAgICAgICAgICAgLXN5bmMgICAgICAgICAgICAgICAgICAKICAtcXVlcnlfcmV0cmllcyBzdHIgICAgICAgLXJlbW90ZV9wcmVmaXggc3RyICAgICAgIC1ub3JlbW90ZSAgICAgICAgICAgICAgCiAgLXllc3JlbW90ZSAgICAgICAgICAgICAgIC11bnNhZmUgICAgICAgICAgICAgICAgICAtc2FmZXIgICAgICAgICAgICAgICAgIAogIC1wcml2cmVtb3RlICAgICAgICAgICAgICAtbm9jbWRzICAgICAgICAgICAgICAgICAgLWFsbG93ZWRjbWRzIGxpc3QgICAgICAKICAtZGVueV9hbGwgICAgICAgICAgICAgIAoKTGliVk5DU2VydmVyIG9wdGlvbnM6Ci1yZmJwb3J0IHBvcnQgICAgICAgICAgVENQIHBvcnQgZm9yIFJGQiBwcm90b2NvbAotcmZid2FpdCB0aW1lICAgICAgICAgIG1heCB0aW1lIGluIG1zIHRvIHdhaXQgZm9yIFJGQiBjbGllbnQKLXJmYmF1dGggcGFzc3dkLWZpbGUgICB1c2UgYXV0aGVudGljYXRpb24gb24gUkZCIHByb3RvY29sCiAgICAgICAgICAgICAgICAgICAgICAgKHVzZSAnc3RvcmVwYXNzd2QnIHRvIGNyZWF0ZSBhIHBhc3N3b3JkIGZpbGUpCi1yZmJ2ZXJzaW9uIDMueCAgICAgICAgU2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBSRkIgd2UgY2hvb3NlIHRvIGFkdmVydGlzZQotcGVybWl0ZmlsZXRyYW5zZmVyICAgIHBlcm1pdCBmaWxlIHRyYW5zZmVyIHN1cHBvcnQKLXBhc3N3ZCBwbGFpbi1wYXNzd29yZCB1c2UgYXV0aGVudGljYXRpb24gCiAgICAgICAgICAgICAgICAgICAgICAgKHVzZSBwbGFpbi1wYXNzd29yZCBhcyBwYXNzd29yZCwgVVNFIEFUIFlPVVIgUklTSykKLWRlZmVydXBkYXRlIHRpbWUgICAgICB0aW1lIGluIG1zIHRvIGRlZmVyIHVwZGF0ZXMgKGRlZmF1bHQgNDApCi1kZWZlcnB0cnVwZGF0ZSB0aW1lICAgdGltZSBpbiBtcyB0byBkZWZlciBwb2ludGVyIHVwZGF0ZXMgKGRlZmF1bHQgbm9uZSkKLWRlc2t0b3AgbmFtZSAgICAgICAgICBWTkMgZGVza3RvcCBuYW1lIChkZWZhdWx0ICJMaWJWTkNTZXJ2ZXIiKQotYWx3YXlzc2hhcmVkICAgICAgICAgIGFsd2F5cyB0cmVhdCBuZXcgY2xpZW50cyBhcyBzaGFyZWQKLW5ldmVyc2hhcmVkICAgICAgICAgICBuZXZlciB0cmVhdCBuZXcgY2xpZW50cyBhcyBzaGFyZWQKLWRvbnRkaXNjb25uZWN0ICAgICAgICBkb24ndCBkaXNjb25uZWN0IGV4aXN0aW5nIGNsaWVudHMgd2hlbiBhIG5ldyBub24tc2hhcmVkCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBjb21lcyBpbiAocmVmdXNlIG5ldyBjb25uZWN0aW9uIGluc3RlYWQpCi1odHRwZGlyIGRpci1wYXRoICAgICAgZW5hYmxlIGh0dHAgc2VydmVyIHVzaW5nIGRpci1wYXRoIGhvbWUKLWh0dHBwb3J0IHBvcnRudW0gICAgICB1c2UgcG9ydG51bSBmb3IgaHR0cCBjb25uZWN0aW9uCi1lbmFibGVodHRwcHJveHkgICAgICAgZW5hYmxlIGh0dHAgcHJveHkgc3VwcG9ydAotcHJvZ3Jlc3NpdmUgaGVpZ2h0ICAgIGVuYWJsZSBwcm9ncmVzc2l2ZSB1cGRhdGluZyBmb3Igc2xvdyBsaW5rcwotbGlzdGVuIGlwYWRkciAgICAgICAgIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb25seSBvbiBuZXR3b3JrIGludGVyZmFjZSB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgYWRkciBpcGFkZHIuICctbGlzdGVuIGxvY2FsaG9zdCcgYW5kIGhvc3RuYW1lIHdvcmsgdG9vLgoKbGlidm5jc2VydmVyLXRpZ2h0LWV4dGVuc2lvbiBvcHRpb25zOgotZGlzYWJsZWZpbGV0cmFuc2ZlciAgIGRpc2FibGUgZmlsZSB0cmFuc2ZlcgotZnRwcm9vdCBzdHJpbmcgICAgICAgIHNldCBmdHAgcm9vdAoKCgoKJSB4MTF2bmMgLWhlbHAKCngxMXZuYzogYWxsb3cgVk5DIGNvbm5lY3Rpb25zIHRvIHJlYWwgWDExIGRpc3BsYXlzLiAwLjkuMTMgbGFzdG1vZDogMjAxMC0xMi0yNwoKKHR5cGUgIngxMXZuYyAtb3B0cyIgdG8ganVzdCBsaXN0IHRoZSBvcHRpb25zLikKClR5cGljYWwgdXNhZ2UgaXM6CgogICBSdW4gdGhpcyBjb21tYW5kIGluIGEgc2hlbGwgb24gdGhlIHJlbW90ZSBtYWNoaW5lICJmYXItaG9zdCIKICAgd2l0aCBYIHNlc3Npb24geW91IHdpc2ggdG8gdmlldzoKCiAgICAgICB4MTF2bmMgLWRpc3BsYXkgOjAKCiAgIFRoZW4gcnVuIHRoaXMgaW4gYW5vdGhlciB3aW5kb3cgb24gdGhlIG1hY2hpbmUgeW91IGFyZSBzaXR0aW5nIGF0OgoKICAgICAgIHZuY3ZpZXdlciBmYXItaG9zdDowCgpPbmNlIHgxMXZuYyBlc3RhYmxpc2hlcyBjb25uZWN0aW9ucyB3aXRoIHRoZSBYMTEgc2VydmVyIGFuZCBzdGFydHMgbGlzdGVuaW5nCmFzIGEgVk5DIHNlcnZlciBpdCB3aWxsIHByaW50IG91dCBhIHN0cmluZzogUE9SVD1YWFhYIHdoZXJlIFhYWFggaXMgdHlwaWNhbGx5CjU5MDAgKHRoZSBkZWZhdWx0IFZOQyBzZXJ2ZXIgcG9ydCkuICBPbmUgd291bGQgbmV4dCBydW4gc29tZXRoaW5nIGxpa2UKdGhpcyBvbiB0aGUgbG9jYWwgbWFjaGluZTogInZuY3ZpZXdlciBob3N0bmFtZTpOIiB3aGVyZSAiaG9zdG5hbWUiIGlzCnRoZSBuYW1lIG9mIHRoZSBtYWNoaW5lIHJ1bm5pbmcgeDExdm5jIGFuZCBOIGlzIFhYWFggLSA1OTAwLCBpLmUuIHVzdWFsbHkKInZuY3ZpZXdlciBob3N0bmFtZTowIi4KCkJ5IGRlZmF1bHQgeDExdm5jIHdpbGwgbm90IGFsbG93IHRoZSBzY3JlZW4gdG8gYmUgc2hhcmVkIGFuZCBpdCB3aWxsIGV4aXQKYXMgc29vbiBhcyB0aGUgY2xpZW50IGRpc2Nvbm5lY3RzLiAgU2VlIC1zaGFyZWQgYW5kIC1mb3JldmVyIGJlbG93IHRvIG92ZXJyaWRlCnRoZXNlIHByb3RlY3Rpb25zLiAgU2VlIHRoZSBGQVEgZm9yIGRldGFpbHMgaG93IHRvIHR1bm5lbCB0aGUgVk5DIGNvbm5lY3Rpb24KdGhyb3VnaCBhbiBlbmNyeXB0ZWQgY2hhbm5lbCBzdWNoIGFzIHNzaCgxKS4gIEluIGJyaWVmOgoKICAgICAgIHNzaCAtdCAtTCA1OTAwOmxvY2FsaG9zdDo1OTAwIGZhci1ob3N0ICd4MTF2bmMgLWxvY2FsaG9zdCAtZGlzcGxheSA6MCcKCiAgICAgICB2bmN2aWV3ZXIgLWVuY29kaW5ncyAnY29weXJlY3QgdGlnaHQgenJsZSBoZXh0aWxlJyBsb2NhbGhvc3Q6MAoKQWxzbywgdXNlIG9mIGEgVk5DIHBhc3N3b3JkICgtcmZiYXV0aCBvciAtcGFzc3dkZmlsZSkgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQuCgpGb3IgYWRkaXRpb25hbCBpbmZvIHNlZTogaHR0cDovL3d3dy5rYXJscnVuZ2UuY29tL3gxMXZuYy8KICAgICAgICAgICAgICAgICAgICBhbmQgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwKCgpDb25maWcgZmlsZSBzdXBwb3J0OiBpZiB0aGUgZmlsZSAkSE9NRS8ueDExdm5jcmMgZXhpc3RzIHRoZW4gZWFjaCBsaW5lIGluCml0IGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgY29tbWFuZCBsaW5lIG9wdGlvbi4gIERpc2FibGUgd2l0aCAtbm9yYy4gIEZvcgplYWNoIG9wdGlvbiBuYW1lLCB0aGUgbGVhZGluZyBjaGFyYWN0ZXIgIi0iIGlzIG5vdCByZXF1aXJlZC4gIEUuZy4gYSBsaW5lCnRoYXQgaXMgZWl0aGVyICJmb3JldmVyIiBvciAiLWZvcmV2ZXIiIG1heSBiZSB1c2VkIGFuZCBhcmUgZXF1aXZhbGVudC4KTGlrZXdpc2UgIndhaXQgMTAwIiBvciAiLXdhaXQgMTAwIiBhcmUgYWNjZXB0YWJsZSBhbmQgZXF1aXZhbGVudCBsaW5lcy4KVGhlICIjIiBjaGFyYWN0ZXIgY29tbWVudHMgb3V0IHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUgaW4gdGhlIHVzdWFsIHdheQooYmFja3NsYXNoIGl0IGZvciBhIGxpdGVyYWwpLiAgTGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpcyB0cmltbWVkIG9mZi4KTGluZXMgbWF5IGJlIGNvbnRpbnVlZCB3aXRoIGEgIlwiIGFzIHRoZSBsYXN0IGNoYXJhY3RlciBvZiBhIGxpbmUgKGl0CmJlY29tZXMgYSBzcGFjZSBjaGFyYWN0ZXIpLgoKT3B0aW9uczoKCi1kaXNwbGF5IGRpc3AgICAgICAgICAgWDExIHNlcnZlciBkaXNwbGF5IHRvIGNvbm5lY3QgdG8sIHVzdWFsbHkgOjAuICBUaGUgWAogICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciBwcm9jZXNzIG11c3QgYmUgcnVubmluZyBvbiBzYW1lIG1hY2hpbmUgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBNSVQtU0hNLiAgRXF1aXZhbGVudCB0byBzZXR0aW5nIHRoZSBESVNQTEFZCiAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gImRpc3AiLgoKICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIGRlc2NyaXB0aW9uIGJlbG93IG9mIHRoZSAiLWRpc3BsYXkgV0FJVDouLi4iCiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucywgd2hlcmUgYWxpYXMgIi1maW5kIiB3aWxsIGZpbmQgdGhlIHVzZXIncwogICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgYXV0b21hdGljYWxseSwgYW5kICItY3JlYXRlIiB3aWxsIGNyZWF0ZSBhCiAgICAgICAgICAgICAgICAgICAgICAgWHZmYiBzZXNzaW9uIGlmIG5vIHNlc3Npb24gaXMgZm91bmQuCgotYXV0aCBmaWxlICAgICAgICAgICAgIFNldCB0aGUgWCBhdXRob3JpdHkgZmlsZSB0byBiZSAiZmlsZSIsIGVxdWl2YWxlbnQgdG8KICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nIHRoZSBYQVVUSE9SSVRZIGVudmlyb25tZW50IHZhcmlhYmxlIHRvICJmaWxlIgogICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBzdGFydHVwLiAgU2FtZSBhcyAteGF1dGggZmlsZS4gIFNlZSBYc2VjdXJpdHkoNyksCiAgICAgICAgICAgICAgICAgICAgICAgeGF1dGgoMSkgbWFuIHBhZ2VzIGZvciBtb3JlIGluZm8uCgogICAgICAgICAgICAgICAgICAgICAgIFVzZSAnLWF1dGggZ3Vlc3MnIHRvIGhhdmUgeDExdm5jIHVzZSBpdHMgLWZpbmRhdXRoCiAgICAgICAgICAgICAgICAgICAgICAgbWVjaGFuaXNtIChkZXNjcmliZWQgYmVsb3cpIHRvIHRyeSB0byBndWVzcyB0aGUKICAgICAgICAgICAgICAgICAgICAgICBYQVVUSE9SSVRZIGZpbGVuYW1lIGFuZCB1c2UgaXQuCgogICAgICAgICAgICAgICAgICAgICAgIFhETS9HRE0vS0RNOiBpZiB5b3UgYXJlIHJ1bm5pbmcgeDExdm5jIGFzIHJvb3QgYW5kIHdhbnQKICAgICAgICAgICAgICAgICAgICAgICB0byBmaW5kIHRoZSBYQVVUSE9SSVRZIGJlZm9yZSBhbnlvbmUgaGFzIGxvZ2dlZCBpbnRvIGFuCiAgICAgICAgICAgICAgICAgICAgICAgWCBzZXNzaW9uIHlldCwgdXNlOiB4MTF2bmMgLWVudiBGRF9YRE09MSAtYXV0aCBndWVzcyAuLi4KICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyB3aWxsIGFsc28gZmluZCB0aGUgWEFVVEhPUklUWSBpZiBhIHVzZXIgaXMgYWxyZWFkeQogICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlZCBpbnRvIHRoZSBYIHNlc3Npb24uKSAgV2hlbiBydW5uaW5nIGFzIHJvb3QsCiAgICAgICAgICAgICAgICAgICAgICAgRkRfWERNPTEgd2lsbCBiZSB0cmllZCBpZiB0aGUgaW5pdGlhbCAtYXV0aCBndWVzcyBmYWlscy4KCi1OICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIFggZGlzcGxheSBpcyA6TiwgdHJ5IHRvIHNldCB0aGUgVk5DIGRpc3BsYXkgdG8KICAgICAgICAgICAgICAgICAgICAgICBhbHNvIGJlIDpOIFRoaXMganVzdCBzZXRzIHRoZSAtcmZicG9ydCBvcHRpb24gdG8gNTkwMCtOCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHByb2dyYW0gd2lsbCBleGl0IGltbWVkaWF0ZWx5IGlmIHRoYXQgcG9ydCBpcyBub3QKICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUuIFRoZSAtTiBvcHRpb24gb25seSB3b3JrcyB3aXRoIG5vcm1hbCAtZGlzcGxheQogICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLCBlLmcuIDowIG9yIDo4LCAtTiBpcyBpZ25vcmVkIGluIHRoZSAtZGlzcGxheQogICAgICAgICAgICAgICAgICAgICAgIFdBSVQ6Li4uLCAtY3JlYXRlLCAtZmluZCwgLXN2YywgLXJlZGlyZWN0LCBldGMgbW9kZXMuCgotYXV0b3BvcnQgbiAgICAgICAgICAgIEF1dG9tYXRpY2FsbHkgcHJvYmUgZm9yIGEgZnJlZSBWTkMgcG9ydCBzdGFydGluZyBhdCBuLgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIHN0YXJ0IHByb2JpbmcgYXQgNTkwMC4gIFVzZSB0aGlzIHRvCiAgICAgICAgICAgICAgICAgICAgICAgc3RheSBhd2F5IGZyb20gb3RoZXIgVk5DIHNlcnZlcnMgbmVhciA1OTAwLgoKLXJmYnBvcnQgc3RyICAgICAgICAgICBUaGUgVk5DIHBvcnQgdG8gbGlzdGVuIG9uIChhIExpYlZOQ1NlcnZlciBvcHRpb24pLCBlLmcuCiAgICAgICAgICAgICAgICAgICAgICAgNTkwMCwgNTkwMSwgZXRjLiAgSWYgc3BlY2lmaWVkIGFzICItcmZicG9ydCBQUk9NUFQiCiAgICAgICAgICAgICAgICAgICAgICAgdGhlbiB0aGUgeDExdm5jIC1ndWkgaXMgdXNlZCB0byBwcm9tcHQgdGhlIHVzZXIgdG8KICAgICAgICAgICAgICAgICAgICAgICBlbnRlciB0aGUgcG9ydCBudW1iZXIuCgotNiAgICAgICAgICAgICAgICAgICAgIElQdjYgbGlzdGVuaW5nIHN1cHBvcnQuICBJbiBhZGRpdGlvbiB0byBJUHY0LCB0aGUKICAgICAgICAgICAgICAgICAgICAgICBJUHY2IGFkZHJlc3MgaXMgbGlzdGVuZWQgb24gZm9yIGluY29taW5nIGNvbm5lY3Rpb25zLgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBzYW1lIHBvcnQgbnVtYmVyIGFzIElQdjQgaXMgdXNlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgTk9URTogIFRoaXMgeDExdm5jIGJpbmFyeSB3YXMgY29tcGlsZWQgdG8gaGF2ZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAiLTYiIElQdjYgbGlzdGVuaW5nIG1vZGUgRU5BQkxFRCBieSBkZWZhdWx0IChDUFBGTEFHUwogICAgICAgICAgICAgICAgICAgICAgIC1EWDExVk5DX0xJU1RFTjY9MSkuICBTbyB0byBkaXNhYmxlIElQdjYgbGlzdGVuaW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICAgICB5b3UgTVVTVCBzdXBwbHkgdGhlICItbm82IiBvcHRpb24gKHNlZSBiZWxvdy4pCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSAiLTYiIG1vZGUgd29ya3MgZm9yIGJvdGggbm9ybWFsIGNvbm5lY3Rpb25zIGFuZAogICAgICAgICAgICAgICAgICAgICAgIC1zc2wgZW5jcnlwdGVkIG9uZXMuICBOZWFybHkgZXZlcnl0aGluZyBpcyBzdXBwb3J0ZWQKICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIElQdjYgY2FzZSwgYnV0IHRoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zLgogICAgICAgICAgICAgICAgICAgICAgIFNlZSAtc3R1bm5lbCBmb3IgaXRzIElQdjYgc3VwcG9ydC4KCiAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5LCBmb3IgYWJzb2x1dGVseSBldmVyeXRoaW5nIHRvIHdvcmsgY29ycmVjdGx5CiAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hY2hpbmUgbWF5IG5lZWQgdG8gaGF2ZSBzb21lIElQdjQgc3VwcG9ydCwgYXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgbGVhc3QgZm9yIHRoZSBsb29wYmFjayBpbnRlcmZhY2UuICBIb3dldmVyLCBmb3IgbmVhcmx5CiAgICAgICAgICAgICAgICAgICAgICAgYWxsIHVzYWdlIG1vZGVzIG5vIElQdjQgc3VwcG9ydCBpcyByZXF1aXJlZC4gU2VlIC1ub3BpdjQKLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgaGF2ZSB0cm91YmxlIGNvbXBpbGluZyBvciBydW5uaW5nIGluIElQdjYgbW9kZSwKICAgICAgICAgICAgICAgICAgICAgICBzZXQgLURYMTFWTkNfSVBWNj0wIGluIENQUEZMQUdTIHdoZW4gY29uZmlndXJpbmcgdG8KICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlIElQdjYgc3VwcG9ydC4KCi1ubzYgICAgICAgICAgICAgICAgICAgRGlzYWJsZSBJUHY2IGxpc3RlbmluZyBzdXBwb3J0IChvbmx5IHVzZWZ1bCBpZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAiLTYiIG1vZGUgaXMgY29tcGlsZWQgaW4gdG8gYmUgdGhlIGRlZmF1bHQ7IHNlZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfTElTVEVONiBkZXNjcmlwdGlvbiBhYm92ZSB1bmRlciAiLTYiLikKCi1ub2lwdjYgICAgICAgICAgICAgICAgRG8gbm90IHRyeSB0byB1c2UgSVB2NiBmb3IgYW55IGxpc3RlbmluZyBvciBjb25uZWN0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0cy4gIFRoaXMgaW5jbHVkZXMgYm90aCB0aGUgbGlzdGVuaW5nIHNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAgICBwb3J0KHMpIGFuZCBvdXRnb2luZyBjb25uZWN0aW9ucyBmcm9tIC1jb25uZWN0LAogICAgICAgICAgICAgICAgICAgICAgIC1jb25uZWN0X29yX2V4aXQsIG9yIC1wcm94eS4gIFVzZSB0aGlzIGlmIHlvdSBhcmUgaGF2aW5nCiAgICAgICAgICAgICAgICAgICAgICAgcHJvYmxlbXMgZHVlIHRvIElQdjYuCgotbm9pcHY0ICAgICAgICAgICAgICAgIERvIG5vdCB0cnkgdG8gdXNlIElQdjQgZm9yIGFueSBsaXN0ZW5pbmcgb3IgY29ubmVjdGluZwogICAgICAgICAgICAgICAgICAgICAgIHNvY2tldHMuICBUaGlzIGlzIG1haW5seSBmb3IgZXhwbG9yaW5nIHRoZSBiZWhhdmlvciBvZgogICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBvbiBhbiBJUHY2LW9ubHkgc3lzdGVtLCBidXQgbWF5IGhhdmUgb3RoZXIgdXNlcy4KCi1yZW9wZW4gICAgICAgICAgICAgICAgSWYgdGhlIFggc2VydmVyIGNvbm5lY3Rpb24gaXMgZGlzY29ubmVjdGVkLCB0cnkgdG8KICAgICAgICAgICAgICAgICAgICAgICByZW9wZW4gdGhlIFggZGlzcGxheSAodXAgdG8gb25lIHRpbWUuKSAgVGhpcyBpcyBvZiB1c2UKICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGlzcGxheSBtYW5hZ2VycyBsaWtlIEdETSAoS2lsbEluaXRDbGllbnRzIG9wdGlvbikKICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGtpbGwgeDExdm5jIGp1c3QgYWZ0ZXIgdGhlIHVzZXIgbG9ncyBpbnRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgIFggc2Vzc2lvbi4gIE5vdGU6IHRoZSByZW9wZW5lZCBzdGF0ZSBtYXkgYmUgdW5zdGFibGUuCiAgICAgICAgICAgICAgICAgICAgICAgU2V0IFgxMVZOQ19SRU9QRU5fRElTUExBWT1uIHRvIHJlb3BlbiBuIHRpbWVzIGFuZAogICAgICAgICAgICAgICAgICAgICAgIHNldCBYMTFWTkNfUkVPUEVOX1NMRUVQX01BWCB0byB0aGUgbnVtYmVyIG9mIHNlY29uZHMsCiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCAxMCwgdG8ga2VlcCB0cnlpbmcgdG8gcmVvcGVuIHRoZSBkaXNwbGF5IChvbmNlCiAgICAgICAgICAgICAgICAgICAgICAgcGVyIHNlY29uZC4pCgogICAgICAgICAgICAgICAgICAgICAgIFVwZGF0ZTogYXMgb2YgMC45LjksIHgxMXZuYyB0cmllcyB0byBhdXRvbWF0aWNhbGx5IGF2b2lkCiAgICAgICAgICAgICAgICAgICAgICAgYmVpbmcga2lsbGVkIGJ5IHRoZSBkaXNwbGF5IG1hbmFnZXIgYnkgZGVsYXlpbmcgY3JlYXRpbmcKICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dzIG9yIHVzaW5nIFhGSVhFUy4gIFNvIHlvdSBzaG91bGRuJ3QgbmVlZCB0byB1c2UKICAgICAgICAgICAgICAgICAgICAgICBLaWxsSW5pdENsaWVudHM9ZmFsc2UgYXMgbG9uZyBhcyB5b3UgbG9nIGluIHF1aWNrbHkKICAgICAgICAgICAgICAgICAgICAgICBlbm91Z2ggKHdpdGhpbiA0NSBzZWNvbmRzIG9mIGNvbm5lY3RpbmcuKSAgWW91IGNhbgogICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUgdGhpcyBieSBzZXR0aW5nIFgxMVZOQ19BVk9JRF9XSU5ET1dTPW5ldmVyLgogICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gYWxzbyBzZXQgaXQgdG8gdGhlIG51bWJlciBvZiBzZWNvbmRzIHRvIGRlbGF5LgoKLXJlZmxlY3QgaG9zdDpOICAgICAgICBJbnN0ZWFkIG9mIGNvbm5lY3RpbmcgdG8gYW5kIHBvbGxpbmcgYW4gWCBkaXNwbGF5LAogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBWTkMgc2VydmVyIGhvc3Q6TiBhbmQgYmUgYQogICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rvci9yZXBlYXRlciBmb3IgaXQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgdHJ5aW5nCiAgICAgICAgICAgICAgICAgICAgICAgdG8gbWFuYWdlIHRoZSBjYXNlIG9mIG1hbnkgc2ltdWx0YW5lb3VzIFZOQyB2aWV3ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gY2xhc3Nyb29tIGJyb2FkY2FzdGluZykgd2hlcmUsIGUuZy4geW91IHB1dAogICAgICAgICAgICAgICAgICAgICAgIGEgcmVwZWF0ZXIgb24gZWFjaCBuZXR3b3JrIHN3aXRjaCwgZXRjLCB0byBpbXByb3ZlCiAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UgYnkgZGlzdHJpYnV0aW5nIHRoZSBsb2FkIGFuZCBuZXR3b3JrCiAgICAgICAgICAgICAgICAgICAgICAgdHJhZmZpYy4gIEltcGxpZXMgLXNoYXJlZCAodXNlIC1ub3NoYXJlZCBhcyBhIGxhdGVyCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIHRvIGRpc2FibGUpLiBTZWUgdGhlIGRpc2N1c3Npb24gYmVsb3cgdW5kZXIKICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgdm5jOmhvc3Q6TiBmb3IgbW9yZSBkZXRhaWxzLgoKLWlkIHdpbmRvd2lkICAgICAgICAgICBTaG93IHRoZSBYIHdpbmRvdyBjb3JyZXNwb25kaW5nIHRvICJ3aW5kb3dpZCIgbm90CiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVudGlyZSBkaXNwbGF5LiAgTmV3IHdpbmRvd3MgbGlrZSBwb3B1cCBtZW51cywKICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2llbnQgdG9wbGV2ZWxzLCBldGMsIG1heSBub3QgYmUgc2VlbiBvciBtYXkgYmUKICAgICAgICAgICAgICAgICAgICAgICBjbGlwcGVkLiAgRGlzYWJsaW5nIFNhdmVVbmRlcnMgb3IgQmFja2luZ1N0b3JlIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgIFggc2VydmVyIG1heSBoZWxwIHNob3cgdGhlbS4gIHgxMXZuYyBtYXkgY3Jhc2ggaWYgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgd2luZG93IGlzIGluaXRpYWxseSBwYXJ0aWFsbHkgb2JzY3VyZWQsIGNoYW5nZXMgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICBpcyBpY29uaWZpZWQsIGV0Yy4gIFNvbWUgc3RlcHMgYXJlIHRha2VuIHRvIGF2b2lkIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIC14cmFuZHIgbWVjaGFuaXNtIGlzIHVzZWQgdG8gdHJhY2sgcmVzaXplcy4gIFVzZQogICAgICAgICAgICAgICAgICAgICAgIHh3aW5pbmZvKDEpIHRvIGdldCB0aGUgd2luZG93IGlkLCBvciB1c2UgIi1pZCBwaWNrIgogICAgICAgICAgICAgICAgICAgICAgIHRvIGhhdmUgeDExdm5jIHJ1biB4d2luaW5mbygxKSBmb3IgeW91IGFuZCBleHRyYWN0CiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGlkLiAgVGhlIC1pZCBvcHRpb24gaXMgdXNlZnVsIGZvciBleHBvcnRpbmcgdmVyeQogICAgICAgICAgICAgICAgICAgICAgIHNpbXBsZSBhcHBsaWNhdGlvbnMgKGUuZy4gdGhlIGN1cnJlbnQgdmlldyBvbiBhIHdlYmNhbSkuCi1zaWQgd2luZG93aWQgICAgICAgICAgQXMgLWlkLCBidXQgaW5zdGVhZCBvZiB1c2luZyB0aGUgd2luZG93IGRpcmVjdGx5IGl0CiAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRzIGEgcm9vdCB2aWV3IHRvIGl0OiB0aGlzIHNob3dzIFNhdmVVbmRlcnMgbWVudXMsCiAgICAgICAgICAgICAgICAgICAgICAgZXRjLCBhbHRob3VnaCB0aGV5IHdpbGwgYmUgY2xpcHBlZCBpZiB0aGV5IGV4dGVuZCBiZXlvbmQKICAgICAgICAgICAgICAgICAgICAgICB0aGUgd2luZG93LgoKLWFwcHNoYXJlICAgICAgICAgICAgICBTaW1wbGUgYXBwbGljYXRpb24gc2hhcmluZyBiYXNlZCBvbiB0aGUgLWlkLy1zaWQKICAgICAgICAgICAgICAgICAgICAgICBtZWNoYW5pc20uICBFdmVyeSBuZXcgdG9wbGV2ZWwgd2luZG93IHRoYXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gY3JlYXRlcyBpbmR1Y2VzIGEgbmV3IHZpZXdlciB3aW5kb3cgdmlhCiAgICAgICAgICAgICAgICAgICAgICAgYSByZXZlcnNlIGNvbm5lY3Rpb24uICBUaGUgLWlkLy1zaWQgYW5kIC1jb25uZWN0CiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyBhcmUgcmVxdWlyZWQuICBSdW4gJ3gxMXZuYyAtYXBwc2hhcmUgLWhlbHAnCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgaW5mby4KCi1jbGlwIFd4SCtYK1kgICAgICAgICAgT25seSBzaG93IHRoZSBzdWItcmVnaW9uIG9mIHRoZSBmdWxsIGRpc3BsYXkgdGhhdAogICAgICAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSByZWN0YW5nbGUgZ2VvbWV0cnkgd2l0aCBzaXplIFd4SCBhbmQKICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgK1grWS4gIFRoZSBWTkMgZGlzcGxheSBoYXMgc2l6ZSBXeEggKGkuZS4gc21hbGxlcgogICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGhlIGZ1bGwgZGlzcGxheSkuICBUaGlzIGFsc28gd29ya3MgZm9yIC1pZC8tc2lkCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB3aGVyZSB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSB1cHBlciBsZWZ0CiAgICAgICAgICAgICAgICAgICAgICAgY29ybmVyIG9mIHRoZSBzZWxlY3RlZCB3aW5kb3cuICBBbiBleGFtcGxlIHVzZSBvZiB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIHdvdWxkIGJlIHRvIHNwbGl0IGEgbGFyZ2UgKGUuZy4gWGluZXJhbWEpIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHR3byBwYXJ0cyB0byBiZSBhY2Nlc3NlZCB2aWEgc2VwYXJhdGUgdmlld2VycyBieQogICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgYSBzZXBhcmF0ZSB4MTF2bmMgb24gZWFjaCBwYXJ0LgoKICAgICAgICAgICAgICAgICAgICAgICBVc2UgJy1jbGlwIHhpbmVyYW1hMCcgdG8gY2xpcCB0byB0aGUgZmlyc3QgeGluZXJhbWEKICAgICAgICAgICAgICAgICAgICAgICBzdWItc2NyZWVuIChpZiB4aW5lcmFtYSBpcyBhY3RpdmUpLiAgeGluZXJhbWExIGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAybmQgc3ViLXNjcmVlbiwgZXRjLiAgVGhpcyB3YXkgeW91IGRvbid0IG5lZWQgdG8gZmlndXJlCiAgICAgICAgICAgICAgICAgICAgICAgb3V0IHRoZSBXeEgrWCtZIG9mIHRoZSBkZXNpcmVkIHhpbmVyYW1hIHN1Yi1zY3JlZW4uCiAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVucyBhcmUgc29ydGVkIGluIGluY3JlYXNpbmcgZGlzdGFuY2UgZnJvbSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAoMCwwKSBvcmlnaW4gKEkuZS4gbm90IHRoZSBYc2VydmVyJ3Mgb3JkZXIpLgoKLWZsYXNoY21hcCAgICAgICAgICAgICBJbiA4YnBwIGluZGV4ZWQgY29sb3IsIGxldCB0aGUgaW5zdGFsbGVkIGNvbG9ybWFwIGZsYXNoCiAgICAgICAgICAgICAgICAgICAgICAgYXMgdGhlIHBvaW50ZXIgbW92ZXMgZnJvbSB3aW5kb3cgdG8gd2luZG93IChzbG93KS4KICAgICAgICAgICAgICAgICAgICAgICBBbHNvIHRyeSB0aGUgLTh0bzI0IG9wdGlvbiB0byBhdm9pZCBmbGFzaCBhbHRvZ2V0aGVyLgotc2hpZnRjbWFwIG4gICAgICAgICAgIFJhcmUgcHJvYmxlbSwgYnV0IHNvbWUgOGJwcCBkaXNwbGF5cyB1c2UgbGVzcyB0aGFuIDI1NgogICAgICAgICAgICAgICAgICAgICAgIGNvbG9yY2VsbHMgKGUuZy4gMTYtY29sb3IgZ3JheXNjYWxlLCBwZXJoYXBzIHRoZSBvdGhlcgogICAgICAgICAgICAgICAgICAgICAgIGJpdHMgYXJlIHVzZWQgZm9yIGRvdWJsZSBidWZmZXJpbmcpICphbmQqIGFsc28gbmVlZCB0bwogICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IHRoZSBwaXhlbHMgdmFsdWVzIGF3YXkgZnJvbSAwLCAuLiwgbmNlbGxzLiAgIm4iCiAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIHRoZSBzaGlmdCB0byBiZSBhcHBsaWVkIHRvIHRoZSBwaXhlbCB2YWx1ZXMuCiAgICAgICAgICAgICAgICAgICAgICAgVG8gc2VlIHRoZSBwaXhlbCB2YWx1ZXMgc2V0IERFQlVHX0NNQVA9MSB0byBwcmludCBvdXQKICAgICAgICAgICAgICAgICAgICAgICBhIGNvbG9ybWFwIGhpc3RvZ3JhbS4gIEV4YW1wbGU6IC1zaGlmdGNtYXAgMjQwCi1ub3RydWVjb2xvciAgICAgICAgICAgRm9yIDhicHAgZGlzcGxheXMsIGZvcmNlIGluZGV4ZWQgY29sb3IgKGkuZS4gYSBjb2xvcm1hcCkKICAgICAgICAgICAgICAgICAgICAgICBldmVuIGlmIGl0IGxvb2tzIGxpa2UgOGJwcCBUcnVlQ29sb3IgKHJhcmUgcHJvYmxlbSkuCi1hZHZlcnRpc2VfdHJ1ZWNvbG9yICAgSWYgdGhlIFgxMSBkaXNwbGF5IGlzIGluZGV4ZWQgY29sb3IsIGxpZSB0byBjbGllbnRzCiAgICAgICAgICAgICAgICAgICAgICAgd2hlbiB0aGV5IGZpcnN0IGNvbm5lY3QgYnkgdGVsbGluZyB0aGVtIGl0IGlzIHRydWVjb2xvci4KICAgICAgICAgICAgICAgICAgICAgICBUbyB3b3JrYXJvdW5kIFJlYWxWTkM6IGluUEYgaGFzIGNvbG91ck1hcCBidXQgbm90IDhicHAKICAgICAgICAgICAgICAgICAgICAgICBVc2UgJy1hZHZlcnRpc2VfdHJ1ZWNvbG9yIHJlc2V0JyB0byByZXNldCBjbGllbnQgZmIgdG9vLgoKLXZpc3VhbCBuICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBwcm9iYWJseSBkb2VzIG5vdCBkbyB3aGF0IHlvdSB0aGluay4KICAgICAgICAgICAgICAgICAgICAgICBJdCBzaW1wbHkgKmZvcmNlcyogdGhlIHZpc3VhbCB1c2VkIGZvciB0aGUgZnJhbWVidWZmZXI7CiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBtYXkgYmUgYSBiYWQgdGhpbmcuLi4gKGUuZy4gbWVzc2VzIHVwIGNvbG9ycyBvcgogICAgICAgICAgICAgICAgICAgICAgIGNhdXNlIGEgY3Jhc2gpLiBJdCBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgYW5kIGZvciBzb21lCiAgICAgICAgICAgICAgICAgICAgICAgd29ya2Fyb3VuZHMuICBuIG1heSBiZSBhIGRlY2ltYWwgbnVtYmVyLCBvciAweCBoZXguCiAgICAgICAgICAgICAgICAgICAgICAgUnVuIHhkcHlpbmZvKDEpIGZvciB0aGUgdmFsdWVzLiAgT25lIG1heSBhbHNvIHVzZQogICAgICAgICAgICAgICAgICAgICAgICJUcnVlQ29sb3IiLCBldGMuIHNlZSA8WDExL1guaD4gZm9yIGEgbGlzdC4gIElmIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBlbmRzIGluICI6bSIgdGhlbiBmb3IgYmV0dGVyIG9yIGZvciB3b3JzZQogICAgICAgICAgICAgICAgICAgICAgIHRoZSB2aXN1YWwgZGVwdGggaXMgZm9yY2VkIHRvIGJlIG0uICBZb3UgbWF5IHdhbnQgdG8KICAgICAgICAgICAgICAgICAgICAgICB1c2UgLW5vc2htIHdoZW4gdXNpbmcgdGhpcyBvcHRpb24gKHNvIFhHZXRJbWFnZSBtYXkKICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHRyYW5zbGF0ZSB0aGUgcGl4ZWwgZGF0YSkuCgotb3ZlcmxheSAgICAgICAgICAgICAgIEhhbmRsZSBtdWx0aXBsZSBkZXB0aCB2aXN1YWxzIG9uIG9uZSBzY3JlZW4sIGUuZy4gOCsyNAogICAgICAgICAgICAgICAgICAgICAgIGFuZCAyNCs4IG92ZXJsYXkgdmlzdWFscyAodGhlIDMyIGJpdHMgcGVyIHBpeGVsIGFyZQogICAgICAgICAgICAgICAgICAgICAgIHBhY2tlZCB3aXRoIDggZm9yIFBzZXVkb0NvbG9yIGFuZCAyNCBmb3IgVHJ1ZUNvbG9yKS4KCiAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5IC1vdmVybGF5IG9ubHkgd29ya3Mgb24gU29sYXJpcyB2aWEKICAgICAgICAgICAgICAgICAgICAgICBYUmVhZFNjcmVlbigzWDExKSBhbmQgSVJJWCB1c2luZyBYUmVhZERpc3BsYXkoMykuCiAgICAgICAgICAgICAgICAgICAgICAgT24gU29sYXJpcyB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBpbWFnZSAiYmxlZWRpbmciCiAgICAgICAgICAgICAgICAgICAgICAgYXJvdW5kIHRyYW5zaWVudCBwb3B1cCBtZW51cyAoYnV0IG5vdCBmb3IgdGhlIG1lbnUKICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYpOiBhIHdvcmthcm91bmQgaXMgdG8gZGlzYWJsZSBTYXZlVW5kZXJzCiAgICAgICAgICAgICAgICAgICAgICAgYnkgcGFzc2luZyB0aGUgIi1zdSIgYXJndW1lbnQgdG8gWHN1biAoaW4KICAgICAgICAgICAgICAgICAgICAgICAvZXRjL2R0L2NvbmZpZy9Yc2VydmVycykuCgogICAgICAgICAgICAgICAgICAgICAgIFVzZSAtb3ZlcmxheSBhcyBhIHdvcmthcm91bmQgZm9yIHNpdHVhdGlvbnMgbGlrZSB0aGVzZToKICAgICAgICAgICAgICAgICAgICAgICBTb21lIGxlZ2FjeSBhcHBsaWNhdGlvbnMgcmVxdWlyZSB0aGUgZGVmYXVsdCB2aXN1YWwgdG8KICAgICAgICAgICAgICAgICAgICAgICBiZSA4YnBwICg4KzI0KSwgb3IgdGhleSB3aWxsIHVzZSA4YnBwIFBzZXVkb0NvbG9yIGV2ZW4KICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSBkZWZhdWx0IHZpc3VhbCBpcyBkZXB0aCAyNCBUcnVlQ29sb3IgKDI0KzgpLgogICAgICAgICAgICAgICAgICAgICAgIEluIHRoZXNlIGNhc2VzIGNvbG9ycyBpbiBzb21lIHdpbmRvd3Mgd2lsbCBiZSBpbmNvcnJlY3QKICAgICAgICAgICAgICAgICAgICAgICBpbiB4MTF2bmMgdW5sZXNzIC1vdmVybGF5IGlzIHVzZWQuICBBbm90aGVyIHVzZSBvZgogICAgICAgICAgICAgICAgICAgICAgIC1vdmVybGF5IGlzIHRvIGVuYWJsZSBzaG93aW5nIHRoZSBleGFjdCBtb3VzZSBjdXJzb3IKICAgICAgICAgICAgICAgICAgICAgICBzaGFwZSAoZGV0YWlscyBiZWxvdykuCgogICAgICAgICAgICAgICAgICAgICAgIFVuZGVyIC1vdmVybGF5LCBwZXJmb3JtYW5jZSB3aWxsIGJlIHNvbWV3aGF0IHNsb3dlcgogICAgICAgICAgICAgICAgICAgICAgIGR1ZSB0byB0aGUgZXh0cmEgaW1hZ2UgdHJhbnNmb3JtYXRpb25zIHJlcXVpcmVkLgogICAgICAgICAgICAgICAgICAgICAgIEZvciBvcHRpbWFsIHBlcmZvcm1hbmNlIGRvIG5vdCB1c2UgLW92ZXJsYXksIGJ1dCByYXRoZXIKICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgdGhlIFggc2VydmVyIHNvIHRoYXQgdGhlIGRlZmF1bHQgdmlzdWFsIGlzCiAgICAgICAgICAgICAgICAgICAgICAgZGVwdGggMjQgVHJ1ZUNvbG9yIGFuZCB0cnkgdG8gaGF2ZSBhbGwgYXBwcyB1c2UgdGhhdAogICAgICAgICAgICAgICAgICAgICAgIHZpc3VhbCAoZS5nLiBzb21lIGFwcHMgaGF2ZSAtdXNlMjQgb3IgLXZpc3VhbCBvcHRpb25zKS4KLW92ZXJsYXlfbm9jdXJzb3IgICAgICBTZXRzIC1vdmVybGF5LCBidXQgZG9lcyBub3QgdHJ5IHRvIGRyYXcgdGhlIGV4YWN0IG1vdXNlCiAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yIHNoYXBlIHVzaW5nIHRoZSBvdmVybGF5IG1lY2hhbmlzbS4KCi04dG8yNCBbb3B0c10gICAgICAgICAgVHJ5IHRoaXMgb3B0aW9uIGlmIC1vdmVybGF5IGlzIG5vdCBzdXBwb3J0ZWQgb24geW91cgogICAgICAgICAgICAgICAgICAgICAgIE9TLCBhbmQgeW91IGhhdmUgYSBsZWdhY3kgOGJwcCBhcHAgdGhhdCB5b3Ugd2FudCB0bwogICAgICAgICAgICAgICAgICAgICAgIHZpZXcgb24gYSBtdWx0aS1kZXB0aCBkaXNwbGF5IHdpdGggZGVmYXVsdCBkZXB0aCAyNAogICAgICAgICAgICAgICAgICAgICAgIChhbmQgaXMgMzIgYnBwKSBPUiBoYXZlIGEgZGVmYXVsdCBkZXB0aCA4IGRpc3BsYXkgd2l0aAogICAgICAgICAgICAgICAgICAgICAgIGRlcHRoIDI0IG92ZXJsYXkgd2luZG93cyBmb3Igc29tZSBhcHBzLiAgVGhpcyBvcHRpb24KICAgICAgICAgICAgICAgICAgICAgICBtYXkgbm90IHdvcmsgb24gYWxsIFggc2VydmVycyBhbmQgaGFyZHdhcmUgKHRlc3RlZAogICAgICAgICAgICAgICAgICAgICAgIG9uIFhGcmVlODYvWG9yZyBtZ2EgZHJpdmVyIGFuZCBYc3VuKS4gIFRoZSAib3B0cyIKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXMgbm90IHJlcXVpcmVkIGFuZCBpcyBkZXNjcmliZWQgYmVsb3cuCgogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbW9kZSBlbmFibGVzIGEgaGFjayB3aGVyZSB4MTF2bmMgbW9uaXRvcnMgd2luZG93cwogICAgICAgICAgICAgICAgICAgICAgIHdpdGhpbiAzIGxldmVscyBmcm9tIHRoZSByb290IHdpbmRvdy4gIElmIGl0IGZpbmRzCiAgICAgICAgICAgICAgICAgICAgICAgYW55IHRoYXQgYXJlIDhicHAgaXQgZXh0cmFjdHMgdGhlIGluZGV4ZWQgY29sb3IKICAgICAgICAgICAgICAgICAgICAgICBwaXhlbCB2YWx1ZXMgdXNpbmcgWEdldEltYWdlKCkgYW5kIHRoZW4gYXBwbGllcyBhCiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gdXNpbmcgdGhlIGNvbG9ybWFwKHMpIHRvIGNyZWF0ZSBUcnVlQ29sb3IKICAgICAgICAgICAgICAgICAgICAgICBSR0IgdmFsdWVzIHRoYXQgaXQgaW4gdHVybiBpbnNlcnRzIGludG8gYml0cyAxLTI0IG9mCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyYW1lYnVmZmVyLiAgVGhpcyBjcmVhdGVzIGEgZGVwdGggMjQgInZpZXciCiAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGRpc3BsYXkgdGhhdCBpcyB0aGVuIGV4cG9ydGVkIHZpYSBWTkMuCgogICAgICAgICAgICAgICAgICAgICAgIENvbnZlcnNlbHksIGZvciBkZWZhdWx0IGRlcHRoIDggZGlzcGxheXMsIHRoZSBkZXB0aAogICAgICAgICAgICAgICAgICAgICAgIDI0IHJlZ2lvbnMgYXJlIHJlYWQgYnkgWEdldEltYWdlKCkgYW5kIGV2ZXJ5dGhpbmcgaXMKICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lZCBhbmQgaW5zZXJ0ZWQgaW50byBhIGRlcHRoIDI0IFRydWVDb2xvcgogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyLgoKICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgZXZlbiBpZiB0aGVyZSBhcmUgKm5vKiBkZXB0aCAyNCB2aXN1YWxzIG9yCiAgICAgICAgICAgICAgICAgICAgICAgd2luZG93cyAoaS5lLiBwdXJlIDhicHApLCB0aGlzIG1vZGUgaXMgcG90ZW50aWFsbHkKICAgICAgICAgICAgICAgICAgICAgICBhbiBpbXByb3ZlbWVudCBvdmVyIC1mbGFzaGNtYXAgYmVjYXVzZSBpdCBhdm9pZHMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgZmxhc2hpbmcgYW5kIHNob3dzIGVhY2ggd2luZG93IGluIHRoZSBjb3JyZWN0IGNvbG9yLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1ldGhvZCB3b3JrcyBPSywgYnV0IG1heSBzdGlsbCBoYXZlIGJ1Z3MgYW5kIGl0CiAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBob2cgcmVzb3VyY2VzLiAgSWYgdGhlcmUgYXJlIG11bHRpcGxlIDhicHAgd2luZG93cwogICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIGRpZmZlcmVudCBjb2xvcm1hcHMsIG9uZSBtYXkgaGF2ZSB0byBpY29uaWZ5IGFsbAogICAgICAgICAgICAgICAgICAgICAgIGJ1dCBvbmUgZm9yIHRoZSBjb2xvcnMgdG8gYmUgY29ycmVjdC4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgbWF5IGJlIHBhaW50aW5nIGVycm9ycyBmb3IgY2xpcHBpbmcgYW5kIHN3aXRjaGluZwogICAgICAgICAgICAgICAgICAgICAgIGJldHdlZW4gd2luZG93cyBvZiBkZXB0aHMgOCBhbmQgMjQuICBIZXVyaXN0aWNzIGFyZQogICAgICAgICAgICAgICAgICAgICAgIGFwcGxpZWQgdG8gdHJ5IHRvIG1pbmltaXplIHRoZSBwYWludGluZyBlcnJvcnMuICBPbmUgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgYWxzbyBwcmVzcyAzIEFsdF9MJ3MgaW4gYSByb3cgdG8gcmVmcmVzaCB0aGUgc2NyZWVuCiAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGVycm9yIGRvZXMgbm90IHJlcGFpciBpdHNlbGYuICBBbHNvIHRoZSBvcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAtZml4c2NyZWVuIDg9My4wIG9yIC1maXhzY3JlZW4gVj0zLjAgbWF5IGJlIHVzZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RpY2FsbHkgcmVmcmVzaCB0aGUgc2NyZWVuIGF0IHRoZSBjb3N0IG9mIGJhbmR3aWR0aAogICAgICAgICAgICAgICAgICAgICAgIChldmVyeSAzIHNlYyBmb3IgdGhpcyBleGFtcGxlKS4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFtvcHRzXSBzdHJpbmcgY2FuIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBzZXR0aW5ncy4KICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBzZXR0aW5ncyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KCiAgICAgICAgICAgICAgICAgICAgICAgRm9yIGZvciBzb21lIFggc2VydmVycyB3aXRoIGRlZmF1bHQgZGVwdGggMjQgYQogICAgICAgICAgICAgICAgICAgICAgIHNwZWVkdXAgbWF5IGJlIGFjaGlldmVkIHZpYSB0aGUgb3B0aW9uICJub2dldGltYWdlIi4KICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGVuYWJsZXMgYSBzY2hlbWUgd2VyZSBYR2V0SW1hZ2UoKSBpcyBub3QgdXNlZAogICAgICAgICAgICAgICAgICAgICAgIHRvIHJldHJpZXZlIHRoZSA4YnBwIGRhdGEuICBJbnN0ZWFkLCBpdCBhc3N1bWVzIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICB0aGUgOGJwcCBkYXRhIGlzIGluIGJpdHMgMjUtMzIgb2YgdGhlIDMyYml0IFggcGl4ZWxzLgogICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vIHJlcXVpcmVtZW50IHRoYXQgdGhlIFggc2VydmVyIHNob3VsZCBwdXQKICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YSB0aGVyZSBmb3Igb3VyIHBvbGwgcmVxdWVzdHMsIGJ1dCBzb21lIGRvIGFuZAogICAgICAgICAgICAgICAgICAgICAgIHNvIHRoZSBleHRyYSBzdGVwcyB0byByZXRyaWV2ZSBpdCBjYW4gYmUgc2tpcHBlZC4KICAgICAgICAgICAgICAgICAgICAgICBUZXN0ZWQgd2l0aCBtZ2EgZHJpdmVyIHdpdGggWEZyZWU4Ni9Yb3JnLiAgRm9yIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgZGVwdGggOCBjYXNlIHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuCgogICAgICAgICAgICAgICAgICAgICAgIFRvIGFkanVzdCBob3cgb2Z0ZW4gWEdldEltYWdlKCkgaXMgdXNlZCB0byBwb2xsIHRoZQogICAgICAgICAgICAgICAgICAgICAgIG5vbi1kZWZhdWx0IHZpc3VhbCByZWdpb25zIGZvciBjaGFuZ2VzLCB1c2UgdGhlIG9wdGlvbgogICAgICAgICAgICAgICAgICAgICAgICJwb2xsPXQiIHdoZXJlICJ0IiBpcyBhIGZsb2F0aW5nIHBvaW50IHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgKGRlZmF1bHQ6IDAuMDUpCgogICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmcgdGhlIG9wdGlvbiAibGV2ZWwyIiB3aWxsIGxpbWl0IHRoZSBzZWFyY2gKICAgICAgICAgICAgICAgICAgICAgICBmb3Igbm9uLWRlZmF1bHQgdmlzdWFsIHdpbmRvd3MgdG8gdHdvIGxldmVscyBmcm9tIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHJvb3Qgd2luZG93LiAgRG8gdGhpcyBvbiBzbG93IG1hY2hpbmVzIHdoZXJlIHlvdSBrbm93CiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdpbmRvdyBtYW5hZ2VyIG9ubHkgaW1wb3NlcyBvbmUgZXh0cmEgd2luZG93IGJldHdlZW4KICAgICAgICAgICAgICAgICAgICAgICB0aGUgYXBwIHdpbmRvdyBhbmQgdGhlIHJvb3Qgd2luZG93LgoKICAgICAgICAgICAgICAgICAgICAgICBBbHNvIGZvciB2ZXJ5IHNsb3cgbWFjaGluZXMgdXNlICJjYWNoZXdpbj10IgogICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIHQgaXMgYSBmbG9hdGluZyBwb2ludCBhbW91bnQgb2YgdGltZSB0byBjYWNoZQogICAgICAgICAgICAgICAgICAgICAgIFhHZXRXaW5kb3dBdHRyaWJ1dGVzIHJlc3VsdHMuICBFLmcuIGNhY2hld2luPTUuMC4KICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1heSBsZWFkIHRvIHRoZSB3aW5kb3dzIGJlaW5nIHVubm90aWNlZCBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgIGFtb3VudCBvZiB0aW1lIHdoZW4gZGVpY29uaWZ5aW5nLCBwYWludGluZyBlcnJvcnMsIGV0Yy4KCiAgICAgICAgICAgICAgICAgICAgICAgV2hpbGUgdGVzdGluZyBvbiBhIHZlcnkgb2xkIFNTMjAgdGhlc2Ugb3B0aW9ucyBnYXZlCiAgICAgICAgICAgICAgICAgICAgICAgdG9sZXJhYmxlIHJlc3BvbnNlOiAtOHRvMjQgcG9sbD0wLjIsY2FjaGV3aW49NS4wLiBGb3IKICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1hY2hpbmUgLW92ZXJsYXkgaXMgc3VwcG9ydGVkIGFuZCBnaXZlcyBiZXR0ZXIKICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS4KCiAgICAgICAgICAgICAgICAgICAgICAgRGVidWdnaW5nIGZvciB0aGlzIG1vZGUgY2FuIGJlIGVuYWJsZWQgYnkgc2V0dGluZwogICAgICAgICAgICAgICAgICAgICAgICJkYmc9MSIsICJkYmc9MiIsIG9yICJkYmc9MyIuCgotMjR0bzMyICAgICAgICAgICAgICAgIFZlcnkgcmFyZSBwcm9ibGVtOiBpZiB0aGUgZnJhbWVidWZmZXIgKFggZGlzcGxheQogICAgICAgICAgICAgICAgICAgICAgIG9yIC1yYXdmYikgaXMgMjRicHAgaW5zdGVhZCBvZiB0aGUgdXN1YWwgMzJicHAsIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljYWxseSB0cmFuc2Zvcm0gdGhlIHBpeGVscyB0byAzMmJwcC4gIFRoaXMgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgICAgIHNsb3dlciwgYnV0IGNhbiBiZSB1c2VkIHRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIHdoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgVk5DIHZpZXdlcnMgY2Fubm90IGhhbmRsZSAyNGJwcCAoZS5nLiAibWFpbjogc2V0UEY6CiAgICAgICAgICAgICAgICAgICAgICAgbm90IDgsIDE2IG9yIDMyIGJwcD8iKS4gIFNlZSB0aGUgRkFRIGZvciBtb3JlIGluZm8uCgogICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBjYXNlIG9mIC1yYXdmYiBtb2RlLCB0aGUgcGl4ZWxzIGFyZSBkaXJlY3RseQogICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkIGJ5IGluc2VydGluZyBhIDAgYnl0ZSB0byBwYWQgdGhlbSBvdXQgdG8gMzJicHAuCiAgICAgICAgICAgICAgICAgICAgICAgRm9yIFggZGlzcGxheXMsIGEga2x1ZGdlIGlzIGRvbmUgdGhhdCBpcyBlcXVpdmFsZW50IHRvCiAgICAgICAgICAgICAgICAgICAgICAgIi1ub3NobSAtdmlzdWFsIFRydWVDb2xvcjozMiIuICAoSWYgYmV0dGVyIHBlcmZvcm1hbmNlCiAgICAgICAgICAgICAgICAgICAgICAgaXMgbmVlZGVkIGZvciB0aGUgbGF0dGVyLCBmZWVsIGZyZWUgdG8gYXNrKS4KCi1zY2FsZSBmcmFjdGlvbiAgICAgICAgU2NhbGUgdGhlIGZyYW1lYnVmZmVyIGJ5IGZhY3RvciAiZnJhY3Rpb24iLiAgVmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgbGVzcyB0aGFuIDEgc2hyaW5rIHRoZSBmYiwgbGFyZ2VyIG9uZXMgZXhwYW5kIGl0LiBOb3RlOgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbWFnZSBtYXkgbm90IGJlIHNoYXJwIGFuZCByZXNwb25zZSBtYXkgYmUgc2xvd2VyLgogICAgICAgICAgICAgICAgICAgICAgIElmICJmcmFjdGlvbiIgY29udGFpbnMgYSBkZWNpbWFsIHBvaW50ICIuIiBpdAogICAgICAgICAgICAgICAgICAgICAgIGlzIHRha2VuIGFzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBhbHRlcm5hdGl2ZWx5CiAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5vdGF0aW9uICJtL24iIG1heSBiZSB1c2VkIHRvIGRlbm90ZSBmcmFjdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICBleGFjdGx5LCBlLmcuIC1zY2FsZSAyLzMKCiAgICAgICAgICAgICAgICAgICAgICAgVG8gc2NhbGUgYXN5bW1ldHJpY2FsbHkgaW4gdGhlIGhvcml6b250YWwgYW5kIHZlcnRpY2FsCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9ucywgc3BlY2lmeSBhIFd4SCBnZW9tZXRyeSB0byBzdHJldGNoIHRvOgogICAgICAgICAgICAgICAgICAgICAgIGUuZy4gJy1zY2FsZSAxMDI0eDc2OCcsIG9yIGFsc28gJy1zY2FsZSAwLjl4MC43NScKCiAgICAgICAgICAgICAgICAgICAgICAgU2NhbGluZyBPcHRpb25zOiBjYW4gYmUgYWRkZWQgYWZ0ZXIgImZyYWN0aW9uIiB2aWEKICAgICAgICAgICAgICAgICAgICAgICAiOiIsIHRvIHN1cHBseSBtdWx0aXBsZSAiOiIgb3B0aW9ucyB1c2UgY29tbWFzLgogICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBqdXN0IHdhbnQgYSBxdWljaywgcm91Z2ggc2NhbGluZyB3aXRob3V0CiAgICAgICAgICAgICAgICAgICAgICAgYmxlbmRpbmcsIGFwcGVuZCAiOm5iIiB0byAiZnJhY3Rpb24iIChlLmcuIC1zY2FsZQogICAgICAgICAgICAgICAgICAgICAgIDEvMzpuYikuICBObyBibGVuZGluZyBpcyB0aGUgZGVmYXVsdCBmb3IgOGJwcCBpbmRleGVkCiAgICAgICAgICAgICAgICAgICAgICAgY29sb3IsIHRvIGZvcmNlIGJsZW5kaW5nIGZvciB0aGlzIGNhc2UgdXNlICI6ZmIiLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyBkaXNhYmxlIC1zY3JvbGxjb3B5cmVjdCBhbmQgLXdpcmVjb3B5cmVjdCB1bmRlcgogICAgICAgICAgICAgICAgICAgICAgIC1zY2FsZSB1c2UgIjpub2NyIi4gIElmIHlvdSBuZWVkIHRvIHRvIGVuYWJsZSB0aGVtIHVzZQogICAgICAgICAgICAgICAgICAgICAgICI6Y3IiIG9yIHNwZWNpZnkgdGhlbSBleHBsaWNpdGx5IG9uIHRoZSBjb21tYW5kIGxpbmUuCiAgICAgICAgICAgICAgICAgICAgICAgSWYgYSBzbG93IGxpbmsgaXMgZGV0ZWN0ZWQsICI6bm9jciIgbWF5IGJlIGFwcGxpZWQKICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5LiAgRGVmYXVsdDogOmNyCgogICAgICAgICAgICAgICAgICAgICAgIE1vcmUgZXNvdGVyaWMgb3B0aW9uczogZm9yIGNvbXBhdGliaWxpdHkgd2l0aCB2bmN2aWV3ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNjYWxlZCB3aWR0aCBpcyBhZGp1c3RlZCB0byBiZSBhIG11bHRpcGxlIG9mIDQ6CiAgICAgICAgICAgICAgICAgICAgICAgdG8gZGlzYWJsZSB0aGlzIHVzZSAiOm40Ii4gICI6aW4iIHVzZSBpbnRlcnBvbGF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1lIGV2ZW4gd2hlbiBzaHJpbmtpbmcsICI6cGFkIiBwYWQgc2NhbGVkIHdpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGhlaWdodCB0byBiZSBtdWx0aXBsZXMgb2Ygc2NhbGluZyBkZW5vbWluYXRvcgogICAgICAgICAgICAgICAgICAgICAgIChlLmcuIDMgZm9yIDIvMykuCgotZ2VvbWV0cnkgV3hIICAgICAgICAgIFNhbWUgYXMgLXNjYWxlIFd4SAoKLXNjYWxlX2N1cnNvciBmcmFjICAgICBCeSBkZWZhdWx0IGlmIC1zY2FsZSBpcyBzdXBwbGllZCB0aGUgY3Vyc29yIHNoYXBlIGlzCiAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkIGJ5IHRoZSBzYW1lIGZhY3Rvci4gIERlcGVuZGluZyBvbiB5b3VyIHVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgIHlvdSBtYXkgd2FudCB0byBzY2FsZSB0aGUgY3Vyc29yIGluZGVwZW5kZW50bHkgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuIG9yIG5vdCBhdCBhbGwuICBJZiB5b3Ugc3BlY2lmeSAtc2NhbGVfY3Vyc29yCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnNvciB3aWxsIGJlIHNjYWxlZCBieSB0aGF0IGZhY3Rvci4gIFdoZW4gdXNpbmcKICAgICAgICAgICAgICAgICAgICAgICAtc2NhbGUgbW9kZSB0byBrZWVwIHRoZSBjdXJzb3IgYXQgaXRzICJuYXR1cmFsIiBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgdXNlICItc2NhbGVfY3Vyc29yIDEiLiAgTW9zdCBvZiB0aGUgIjoiIHNjYWxpbmcKICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIGFwcGx5IGhlcmUgYXMgd2VsbC4KCi12aWV3b25seSAgICAgICAgICAgICAgQWxsIFZOQyBjbGllbnRzIGNhbiBvbmx5IHdhdGNoIChkZWZhdWx0IG9mZikuCi1zaGFyZWQgICAgICAgICAgICAgICAgVk5DIGRpc3BsYXkgaXMgc2hhcmVkLCBpLmUuIG1vcmUgdGhhbiBvbmUgdmlld2VyIGNhbgogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgYXQgdGhlIHNhbWUgdGltZSAoZGVmYXVsdCBvZmYpLgotb25jZSAgICAgICAgICAgICAgICAgIEV4aXQgYWZ0ZXIgdGhlIGZpcnN0IHN1Y2Nlc3NmdWxseSBjb25uZWN0ZWQgdmlld2VyCiAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdHMsIG9wcG9zaXRlIG9mIC1mb3JldmVyLiBUaGlzIGlzIHRoZSBEZWZhdWx0LgotZm9yZXZlciAgICAgICAgICAgICAgIEtlZXAgbGlzdGVuaW5nIGZvciBtb3JlIGNvbm5lY3Rpb25zIHJhdGhlciB0aGFuIGV4aXRpbmcKICAgICAgICAgICAgICAgICAgICAgICBhcyBzb29uIGFzIHRoZSBmaXJzdCBjbGllbnQocykgZGlzY29ubmVjdC4gU2FtZSBhcyAtbWFueQoKICAgICAgICAgICAgICAgICAgICAgICBUbyBnZXQgdGhlIHN0YW5kYXJkIG5vbi1zaGFyZWQgVk5DIGJlaGF2aW9yIHdoZXJlIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICBhIG5ldyBWTkMgY2xpZW50IGNvbm5lY3RzIHRoZSBleGlzdGluZyBWTkMgY2xpZW50IGlzCiAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCB1c2U6ICAtbmV2ZXJzaGFyZWQgLWZvcmV2ZXIgICBUaGlzIG1ldGhvZCBjYW4KICAgICAgICAgICAgICAgICAgICAgICBhbHNvIGJlIHVzZWQgdG8gZ3VhcmQgYWdhaW5zdCBodW5nIFRDUCBjb25uZWN0aW9ucyB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgZG8gbm90IGdvIGF3YXkuCgotbG9vcCAgICAgICAgICAgICAgICAgIENyZWF0ZSBhbiBvdXRlciBsb29wIHJlc3RhcnRpbmcgdGhlIHgxMXZuYyBwcm9jZXNzCiAgICAgICAgICAgICAgICAgICAgICAgd2hlbmV2ZXIgaXQgdGVybWluYXRlcy4gIC1iZyBhbmQgLWluZXRkIGFyZSBpZ25vcmVkCiAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBtb2RlIChob3dldmVyIHNlZSAtbG9vcGJnIGJlbG93KS4KCiAgICAgICAgICAgICAgICAgICAgICAgVXNlZnVsIGZvciBjb250aW51aW5nIGV2ZW4gaWYgdGhlIFggc2VydmVyIHRlcm1pbmF0ZXMKICAgICAgICAgICAgICAgICAgICAgICBhbmQgcmVzdGFydHMgKGF0IHRoYXQgbW9tZW50IHRoZSBwcm9jZXNzIHdpbGwgbmVlZAogICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb24gdG8gcmVjb25uZWN0IHRvIHRoZSBuZXcgWCBzZXJ2ZXIgb2YgY291cnNlKS4KCiAgICAgICAgICAgICAgICAgICAgICAgVXNlLCBlLmcuLCAtbG9vcDEwMCB0byBzbGVlcCAxMDAgbWlsbGlzZWNzIGJldHdlZW4KICAgICAgICAgICAgICAgICAgICAgICByZXN0YXJ0cywgZXRjLiAgRGVmYXVsdCBpcyAyMDAwbXMgKGkuZS4gMiBzZWNzKSBVc2UsCiAgICAgICAgICAgICAgICAgICAgICAgZS5nLiAtbG9vcDMwMCw1IHRvIHNsZWVwIDMwMCBtcyBhbmQgb25seSBsb29wIDUgdGltZXMuCgogICAgICAgICAgICAgICAgICAgICAgIElmIC1sb29wYmcgKHBsdXMgYW55IG51bWJlcnMpIGlzIHNwZWNpZmllZCBpbnN0ZWFkLAogICAgICAgICAgICAgICAgICAgICAgIHRoZSAiLWJnIiBvcHRpb24gaXMgaW1wbGllZCBhbmQgdGhlIG1vZGUgYXBwcm94aW1hdGVzCiAgICAgICAgICAgICAgICAgICAgICAgaW5ldGQoOCkgdXNhZ2UgdG8gc29tZSBkZWdyZWUuICBJbiB0aGlzIGNhc2Ugd2hlbgogICAgICAgICAgICAgICAgICAgICAgIGl0IGdvZXMgaW50byB0aGUgYmFja2dyb3VuZCBhbnkgbGlzdGVuaW5nIHNvY2tldHMKICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBwb3J0cyA1OTAwLCA1ODAwKSBhcmUgY2xvc2VkLCBzbyB0aGUgbmV4dCBvbmUKICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgbG9vcCBjYW4gdXNlIHRoZW0uICBUaGlzIG1vZGUgd2lsbCBvbmx5IGJlIG9mCiAgICAgICAgICAgICAgICAgICAgICAgdXNlIGlmIGEgVk5DIGNsaWVudCAodGhlIG9ubHkgY2xpZW50IGZvciB0aGF0IHByb2Nlc3MpCiAgICAgICAgICAgICAgICAgICAgICAgaXMgYWxyZWFkeSBjb25uZWN0ZWQgYmVmb3JlIHRoZSBwcm9jZXNzIGdvZXMgaW50byB0aGUKICAgICAgICAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kLCBmb3IgZXhhbXBsZSwgdXNhZ2Ugb2YgLWRpc3BsYXkgV0FJVDouLiwKICAgICAgICAgICAgICAgICAgICAgICAtc3ZjLCBhbmQgLWNvbm5lY3QgY2FuIG1ha2UgdXNlIG9mIHRoaXMgInBvb3IgbWFuJ3MiCiAgICAgICAgICAgICAgICAgICAgICAgaW5ldGQgbW9kZS4gIFRoZSBkZWZhdWx0IHdhaXQgdGltZSBpcyA1MDBtcyBpbiB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZS4gIFRoaXMgdXNhZ2UgY291bGQgdXNlIHVzZWZ1bDogIC1zdmMgLWJnIC1sb29wYmcKCi10aW1lb3V0IG4gICAgICAgICAgICAgRXhpdCB1bmxlc3MgYSBjbGllbnQgY29ubmVjdHMgd2l0aGluIHRoZSBmaXJzdCBuIHNlY29uZHMKICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBzdGFydHVwLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBoYXZlIGJlZW4gbm8gY29ubmVjdGlvbiBhdHRlbXB0cyBhZnRlciBuCiAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kcyB4MTF2bmMgZXhpdHMgaW1tZWRpYXRlbHkuICBJZiBhIGNsaWVudCBpcwogICAgICAgICAgICAgICAgICAgICAgIHRyeWluZyB0byBjb25uZWN0IGJ1dCBoYXMgbm90IHByb2dyZXNzZWQgdG8gdGhlIG5vcm1hbAogICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGluZyBzdGF0ZSwgeDExdm5jIGdpdmVzIGl0IGEgZmV3IG1vcmUgc2Vjb25kcwogICAgICAgICAgICAgICAgICAgICAgIHRvIGZpbmlzaCBhbmQgZXhpdHMgaWYgaXQgZG9lcyBub3QgbWFrZSBpdCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICBub3JtYWwgc3RhdGUuCgogICAgICAgICAgICAgICAgICAgICAgIEZvciByZXZlcnNlIGNvbm5lY3Rpb25zIHZpYSAtY29ubmVjdCBvciAtY29ubmVjdF9vcl9leGl0CiAgICAgICAgICAgICAgICAgICAgICAgYSB0aW1lb3V0IG9mIG4gc2Vjb25kcyB3aWxsIGJlIHNldCBmb3IgYWxsIHJldmVyc2UKICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0cy4gIElmIHRoZSBjb25uZWN0IHRpbWVvdXQgYWxhcm0gZ29lcyBvZmYsCiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIHdpbGwgZXhpdCBpbW1lZGlhdGVseS4KCi1zbGVlcGluIG4gICAgICAgICAgICAgQXQgc3RhcnR1cCBzbGVlcCBuIHNlY29uZHMgYmVmb3JlIHByb2NlZWRpbmcgKGUuZy4gdG8KICAgICAgICAgICAgICAgICAgICAgICBhbGxvdyByZWRpcnMgYW5kIGxpc3RlbmluZyBjbGllbnRzIHRvIHN0YXJ0IHVwKQoKICAgICAgICAgICAgICAgICAgICAgICBJZiBhIHJhbmdlIGlzIGdpdmVuOiAnLXNsZWVwaW4gbWluLW1heCcsIGEgcmFuZG9tIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBtaW4gYW5kIG1heCBpcyBzbGVwdC4gRS5nLiAnLXNsZWVwaW4gMC0yMCcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgJy1zbGVlcGluIDEwLTMwJy4gIEZsb2F0cyBhcmUgYWxsb3dlZCB0b28uCgotaW5ldGQgICAgICAgICAgICAgICAgIExhdW5jaGVkIGJ5IGluZXRkKDgpOiBzdGRpbyBpbnN0ZWFkIG9mIGxpc3RlbmluZyBzb2NrZXQuCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogaWYgeW91IGFyZSBub3QgcmVkaXJlY3Rpbmcgc3RkZXJyIHRvIGEgbG9nIGZpbGUKICAgICAgICAgICAgICAgICAgICAgICAodmlhIHNoZWxsIDI+IG9yIC1vIG9wdGlvbikgeW91IE1VU1QgYWxzbyBzcGVjaWZ5IHRoZSAtcQogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiwgb3RoZXJ3aXNlIHRoZSBzdGRlcnIgZ29lcyB0byB0aGUgdmlld2VyIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBjYXVzZSBpdCB0byBhYm9ydC4gIFNwZWNpZnlpbmcgYm90aCAtaW5ldGQgYW5kIC1xCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIG5vIC1vIHdpbGwgYXV0b21hdGljYWxseSBjbG9zZSB0aGUgc3RkZXJyLgoKLXRpZ2h0ZmlsZXhmZXIgICAgICAgICBFbmFibGUgdGhlIFRpZ2h0Vk5DIGZpbGUgdHJhbnNmZXIgZXh0ZW5zaW9uLiBOb3RlIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdoZW4gdGhlIC12aWV3b25seSBvcHRpb24gaXMgc3VwcGxpZWQgYWxsIGZpbGUKICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcnMgYXJlIGRpc2FibGVkLiAgQWxzbyBjbGllbnRzIHRoYXQgbG9nIGluCiAgICAgICAgICAgICAgICAgICAgICAgdmlld29ubHkgY2Fubm90IHRyYW5zZmVyIGZpbGVzLiAgSG93ZXZlciwgaWYgdGhlIHJlbW90ZQogICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2wgbWVjaGFuaXNtIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSBnbG9iYWwgb3IKICAgICAgICAgICAgICAgICAgICAgICBwZXItY2xpZW50IHZpZXdvbmx5IHN0YXRlIHRoZSBmaWxldHJhbnNmZXIgcGVybWlzc2lvbnMKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIE5PVCBjaGFuZ2UuCgogICAgICAgICAgICAgICAgICAgICAgIElNUE9SVEFOVDogcGxlYXNlIHVuZGVyc3RhbmQgaWYgLXRpZ2h0ZmlsZXhmZXIgaXMKICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgYW5kIHlvdSBydW4geDExdm5jIGFzIHJvb3QgZm9yLCBzYXksIGluZXRkCiAgICAgICAgICAgICAgICAgICAgICAgb3IgZGlzcGxheSBtYW5hZ2VyIChnZG0sIGtkbSwgLi4uKSBhY2Nlc3MgYW5kIHlvdSBkbwogICAgICAgICAgICAgICAgICAgICAgIG5vdCBoYXZlIGl0IHN3aXRjaCB1c2VycyB2aWEgdGhlIC11c2VycyBvcHRpb24sIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICBWTkMgVmlld2VycyB0aGF0IGNvbm5lY3QgYXJlIGFibGUgdG8gZG8gZmlsZXRyYW5zZmVyCiAgICAgICAgICAgICAgICAgICAgICAgcmVhZHMgYW5kIHdyaXRlcyBhcyAqcm9vdCouCgogICAgICAgICAgICAgICAgICAgICAgIEFsc28sIHRpZ2h0ZmlsZXhmZXIgaXMgZGlzYWJsZWQgaW4gLXVuaXhwdyBtb2RlLgoKLXVsdHJhZmlsZXhmZXIgICAgICAgICBOb3RlOiB0byBlbmFibGUgVWx0cmFWTkMgZmlsZXRyYW5zZmVyIGFuZCB0byBnZXQgaXQgdG8KICAgICAgICAgICAgICAgICAgICAgICB3b3JrIHlvdSBwcm9iYWJseSBuZWVkIHRvIHN1cHBseSB0aGVzZSBMaWJWTkNTZXJ2ZXIKICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiAiLXJmYnZlcnNpb24gMy42IC1wZXJtaXRmaWxldHJhbnNmZXIiCiAgICAgICAgICAgICAgICAgICAgICAgIi11bHRyYWZpbGV4ZmVyIiBpcyBhbiBhbGlhcyBmb3IgdGhpcyBjb21iaW5hdGlvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgSU1QT1JUQU5UOiBwbGVhc2UgdW5kZXJzdGFuZCBpZiAtdWx0cmFmaWxleGZlciBpcwogICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBhbmQgeW91IHJ1biB4MTF2bmMgYXMgcm9vdCBmb3IsIHNheSwgaW5ldGQKICAgICAgICAgICAgICAgICAgICAgICBvciBkaXNwbGF5IG1hbmFnZXIgKGdkbSwga2RtLCAuLi4pIGFjY2VzcyBhbmQgeW91IGRvCiAgICAgICAgICAgICAgICAgICAgICAgbm90IGhhdmUgaXQgc3dpdGNoIHVzZXJzIHZpYSB0aGUgLXVzZXJzIG9wdGlvbiwgdGhlbgogICAgICAgICAgICAgICAgICAgICAgIFZOQyBWaWV3ZXJzIHRoYXQgY29ubmVjdCBhcmUgYWJsZSB0byBkbyBmaWxldHJhbnNmZXIKICAgICAgICAgICAgICAgICAgICAgICByZWFkcyBhbmQgd3JpdGVzIGFzICpyb290Ki4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHNhZGx5IHlvdSBjYW5ub3QgZG8gYm90aCAtdGlnaHRmaWxleGZlciBhbmQKICAgICAgICAgICAgICAgICAgICAgICAtdWx0cmFmaWxleGZlciBhdCB0aGUgc2FtZSB0aW1lIGJlY2F1c2UgdGhlIGxhdHRlcgogICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVzIHNldHRpbmcgdGhlIHZlcnNpb24gdG8gMy42IGFuZCB0aWdodHZuYyB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgbm90IGRvIGZpbGV0cmFuc2ZlciB3aGVuIGl0IHNlZXMgdGhhdCB2ZXJzaW9uIG51bWJlci4KCi1odHRwICAgICAgICAgICAgICAgICAgSW5zdGVhZCBvZiB1c2luZyAtaHR0cGRpciAoc2VlIGJlbG93KSB0byBzcGVjaWZ5CiAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgdGhlIEphdmEgdm5jdmlld2VyIGFwcGxldCBpcywgaGF2ZSB4MTF2bmMgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgdG8gKmd1ZXNzKiB3aGVyZSB0aGUgZGlyZWN0b3J5IGlzIGJ5IGxvb2tpbmcgcmVsYXRpdmUKICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgcHJvZ3JhbSBsb2NhdGlvbiBhbmQgaW4gc3RhbmRhcmQgbG9jYXRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgKC91c3IvbG9jYWwvc2hhcmUveDExdm5jL2NsYXNzZXMsIGV0YykuICBVbmRlciAtc3NsIG9yCiAgICAgICAgICAgICAgICAgICAgICAgLXN0dW5uZWwgdGhlIHNzbCBjbGFzc2VzIHN1YmRpcmVjdG9yeSBpcyBzb3VnaHQuCi1odHRwX3NzbCAgICAgICAgICAgICAgQXMgLWh0dHAsIGJ1dCBmb3JjZSBsb29rdXAgZm9yIHNzbCBjbGFzc2VzIHN1YmRpci4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGZvciBIVFRQUywgc2luZ2xlLXBvcnQgSmF2YSBhcHBsZXQgZGVsaXZlcnkKICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIHNldCBYMTFWTkNfSFRUUFNfRE9XTkxPQURfV0FJVF9USU1FIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgIG1heCBudW1iZXIgb2Ygc2Vjb25kcyB0byB3YWl0IGZvciB0aGUgYXBwbGV0IGRvd25sb2FkCiAgICAgICAgICAgICAgICAgICAgICAgdG8gZmluaXNoLiAgVGhlIGRlZmF1bHQgaXMgMTUuCgotYXZhaGkgICAgICAgICAgICAgICAgIFVzZSB0aGUgQXZhaGkvbUROUyBaZXJvQ29uZiBwcm90b2NvbCB0byBhZHZlcnRpc2UKICAgICAgICAgICAgICAgICAgICAgICB0aGlzIFZOQyBzZXJ2ZXIgdG8gdGhlIGxvY2FsIG5ldHdvcmsuIChSZWxhdGVkIHRlcm1zOgogICAgICAgICAgICAgICAgICAgICAgIFJlbmRlenZvdXMsIEJvbmpvdXIpLiAgRGVwZW5kaW5nIG9uIHlvdXIgc2V0dXAsIHlvdQogICAgICAgICAgICAgICAgICAgICAgIG1heSBuZWVkIHRvIHN0YXJ0IGF2YWhpLWRhZW1vbiBhbmQgb3BlbiB1ZHAgcG9ydCA1MzUzCiAgICAgICAgICAgICAgICAgICAgICAgaW4geW91ciBmaXJld2FsbC4KCiAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBzZXQgWDExVk5DX0FWQUhJX05BTUUsIFgxMVZOQ19BVkFISV9IT1NULAogICAgICAgICAgICAgICAgICAgICAgIGFuZC9vciBYMTFWTkNfQVZBSElfUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZXMKICAgICAgICAgICAgICAgICAgICAgICB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZXMuICBGb3IgZXhhbXBsZToKICAgICAgICAgICAgICAgICAgICAgICAtZW52IFgxMVZOQ19BVkFISV9OQU1FPXdhbGx5CgogICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBhdmFoaSBBUEkgY2Fubm90IGJlIGZvdW5kIGF0IGJ1aWxkIHRpbWUsIGEgaGVscGVyCiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSBsaWtlIGF2YWhpLXB1Ymxpc2goMSkgb3IgZG5zLXNkKDEpIHdpbGwgYmUgdHJpZWQKCi1tZG5zICAgICAgICAgICAgICAgICAgU2FtZSBhcyAtYXZhaGkuCi16ZXJvY29uZiAgICAgICAgICAgICAgU2FtZSBhcyAtYXZhaGkuCgotY29ubmVjdCBzdHJpbmcgICAgICAgIEZvciB1c2Ugd2l0aCAidm5jdmlld2VyIC1saXN0ZW4iIHJldmVyc2UgY29ubmVjdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgICAgSWYgInN0cmluZyIgaGFzIHRoZSBmb3JtICJob3N0IiBvciAiaG9zdDpwb3J0IgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25uZWN0aW9uIGlzIG1hZGUgb25jZSBhdCBzdGFydHVwLgoKICAgICAgICAgICAgICAgICAgICAgICBVc2UgY29tbWFzIGZvciBhIGxpc3Qgb2YgaG9zdCdzIGFuZCBob3N0OnBvcnQncy4KICAgICAgICAgICAgICAgICAgICAgICBFLmcuIC1jb25uZWN0IGhvc3QxLGhvc3QyIG9yIGhvc3QxOjAsaG9zdDI6NTY3OC4KICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdG8gcmV2ZXJzZSBjb25uZWN0IHRvIG11bHRpcGxlIGhvc3RzIGF0IHRoZQogICAgICAgICAgICAgICAgICAgICAgIHNhbWUgdGltZSB5b3Ugd2lsbCBsaWtlbHkgbmVlZCB0byBhbHNvIHN1cHBseTogLXNoYXJlZAoKICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdW5saWtlIG1vc3Qgdm5jIHNlcnZlcnMsIHgxMXZuYyB3aWxsIHJlcXVpcmUgYQogICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkIGZvciByZXZlcnNlIGFzIHdlbGwgYXMgZm9yIGZvcndhcmQgY29ubmVjdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgICAgKHByb3ZpZGVkIHBhc3N3b3JkIGF1dGggaGFzIGJlZW4gZW5hYmxlZCwgLXJmYmF1dGgsIGV0YykKICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IHdhbnQgdG8gcmVxdWlyZSBhIHBhc3N3b3JkIGZvciByZXZlcnNlCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgc2V0IFgxMVZOQ19SRVZFUlNFX0NPTk5FQ1RJT05fTk9fQVVUSD0xIGluCiAgICAgICAgICAgICAgICAgICAgICAgeW91ciBlbnZpcm9ubWVudCBiZWZvcmUgc3RhcnRpbmcgeDExdm5jLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiAic3RyaW5nIiBjb250YWlucyAiLyIgaXQgaXMgaW5zdGVhZCBpbnRlcnByZXRlZAogICAgICAgICAgICAgICAgICAgICAgIGFzIGEgZmlsZSB0byBwZXJpb2RpY2FsbHkgY2hlY2sgZm9yIG5ldyBob3N0cy4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgZmlyc3QgbGluZSBpcyByZWFkIGFuZCB0aGVuIHRoZSBmaWxlIGlzIHRydW5jYXRlZC4KICAgICAgICAgICAgICAgICAgICAgICBCZSBjYXJlZnVsIGFib3V0IHRoZSBsb2NhdGlvbiBvZiB0aGlzIGZpbGUgaWYgeDExdm5jCiAgICAgICAgICAgICAgICAgICAgICAgaXMgcnVubmluZyBhcyByb290IChlLmcuIHZpYSBnZG0oMSksIGV0YykuCgoKICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlciBtb2RlOiBTb21lIHNlcnZpY2VzIHByb3ZpZGUgYW4gaW50ZXJtZWRpYXRlCiAgICAgICAgICAgICAgICAgICAgICAgInZuYyByZXBlYXRlciI6IGh0dHA6Ly93d3cudXZuYy5jb20vYWRkb25zL3JlcGVhdGVyLmh0bWwKICAgICAgICAgICAgICAgICAgICAgICAoYW5kIGFsc28gaHR0cDovL2tvdGkubWJuZXQuZmkvanRrby8gZm9yIGxpbnV4IHBvcnQpCiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhY3RzIGFzIGEgcHJveHkvZ2F0ZXdheS4gIE1vZGVzIGxpa2UgdGhlc2UgcmVxdWlyZQogICAgICAgICAgICAgICAgICAgICAgIGFuIGluaXRpYWwgc3RyaW5nIHRvIGJlIHNlbnQgZm9yIHRoZSByZXZlcnNlIGNvbm5lY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgdGhlIFZOQyBwcm90b2NvbCBpcyBzdGFydGVkLiAgSGVyZSBhcmUgdGhlIHdheXMKICAgICAgICAgICAgICAgICAgICAgICB0byBkbyB0aGlzOgoKICAgICAgICAgICAgICAgICAgICAgICAgIC1jb25uZWN0IHByZT1zb21lX3N0cmluZytob3N0OnBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgIC1jb25uZWN0IHByZTEyOD1zb21lX3N0cmluZytob3N0OnBvcnQKICAgICAgICAgICAgICAgICAgICAgICAgIC1jb25uZWN0IHJlcGVhdGVyPUlEOjEyMzQraG9zdDpwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgICAtY29ubmVjdCByZXBlYXRlcj0yMy40NS42Ny44OTo6NTUwMStob3N0OnBvcnQKCiAgICAgICAgICAgICAgICAgICAgICAgU1NWTkMgbm90YXRpb24gaXMgYWxzbyBzdXBwb3J0ZWQ6CgogICAgICAgICAgICAgICAgICAgICAgICAgLWNvbm5lY3QgcmVwZWF0ZXI6Ly9ob3N0OnBvcnQrSUQ6MTIzNAoKICAgICAgICAgICAgICAgICAgICAgICBBcyB3aXRoIG5vcm1hbCAtY29ubmVjdCB1c2FnZSwgaWYgdGhlIHJlcGVhdGVyIHBvcnQgaXMKICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3VwcGxpZWQgNTUwMCBpcyBhc3N1bWVkLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgYmFzaWMgaWRlYSBpcyBiZXR3ZWVuIHRoZSBzcGVjaWFsIHRhZywgZS5nLiAicHJlPSIKICAgICAgICAgICAgICAgICAgICAgICBhbmQgIisiIGlzIHRoZSBwcmUtc3RyaW5nIHRvIGJlIHNlbnQuICBOb3RlIHRoYXQgaW4KICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGNhc2UgaG9zdDpwb3J0IGlzIHRoZSByZXBlYXRlciBzZXJ2ZXIsIE5PVCB0aGUKICAgICAgICAgICAgICAgICAgICAgICB2bmMgdmlld2VyLiAgU29tZWhvdyB0aGUgcHJlLXN0cmluZyB0ZWxscyB0aGUgcmVwZWF0ZXIKICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgaG93IHRvIGZpbmQgdGhlIHZuYyB2aWV3ZXIgYW5kIGNvbm5lY3QgeW91IHRvIGl0LgoKICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGUgY2FzZSBwcmU9c29tZV9zdHJpbmcraG9zdDpwb3J0LCAic29tZV9zdHJpbmciCiAgICAgICAgICAgICAgICAgICAgICAgaXMgc2ltcGx5IHNlbnQuIEluIHRoZSBjYXNlIHByZU5OTj1zb21lX3N0cmluZytob3N0OnBvcnQKICAgICAgICAgICAgICAgICAgICAgICAic29tZV9zdHJpbmciIGlzIHNlbnQgaW4gYSBudWxsIHBhZGRlZCBidWZmZXIgb2YKICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGggTk5OLiAgcmVwZWF0ZXI9IGlzIHRoZSBzYW1lIGFzIHByZTI1MD0sIHRoaXMgaXMKICAgICAgICAgICAgICAgICAgICAgICB0aGUgdWx0cmF2bmMgcmVwZWF0ZXIgYnVmZmVyIHNpemUuCgogICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ3MgbGlrZSAiXG4iIGFuZCAiXHIiLCBldGMuIGFyZSBleHBhbmRlZCB0bwogICAgICAgICAgICAgICAgICAgICAgIG5ld2xpbmUgYW5kIGNhcnJpYWdlIHJldHVybi4gICJcYyIgaXMgZXhwYW5kZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICAiLCIgc2luY2UgdGhlIGNvbm5lY3Qgc3RyaW5nIGlzIGNvbW1hIHNlcGFyYXRlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgU2VlIGFsc28gdGhlIC1wcm94eSBvcHRpb24gYmVsb3cgZm9yIGFkZGl0aW9uYWwgd2F5cwogICAgICAgICAgICAgICAgICAgICAgIHRvIHBsdW1iIHJldmVyc2UgY29ubmVjdGlvbnMuCgogICAgICAgICAgICAgICAgICAgICAgIFJldmVyc2UgU1NMOiB1c2luZyAtY29ubmVjdCBpbiAtc3NsIG1vZGUgbWFrZXMgeDExdm5jCiAgICAgICAgICAgICAgICAgICAgICAgYWN0IGFzIGFuIFNTTCBjbGllbnQgKGluaXRpYXRlcyBTU0wgY29ubmVjdGlvbikgcmF0aGVyCiAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBhbiBTU0wgc2VydmVyLiAgVGhlIGlkZWEgaXMgeDExdm5jIG1pZ2h0IGJlCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGluZyB0byBzdHVubmVsIG9uIHRoZSB2aWV3ZXIgc2lkZSB3aXRoIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHZpZXdlciBpbiBsaXN0ZW5pbmcgbW9kZS4gIElmIHlvdSBkbyBub3Qgd2FudCB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IsIHVzZSAtZW52IFgxMVZOQ19ESVNBQkxFX1NTTF9DTElFTlRfTU9ERT0xLgogICAgICAgICAgICAgICAgICAgICAgIFdpdGggdGhpcyB0aGUgdmlld2VyIHNpZGUgY2FuIGFjdCBhcyB0aGUgU1NMIGNsaWVudAogICAgICAgICAgICAgICAgICAgICAgIGFzIGl0IG5vcm1hbGx5IGRvZXMgZm9yIGZvcndhcmQgY29ubmVjdGlvbnMuCgogICAgICAgICAgICAgICAgICAgICAgIFJldmVyc2UgU1NMIFJlcGVhdGVyIG1vZGU6ICBUaGlzIHdpbGwgd29yaywgYnV0IG5vdGUKICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGlmIHRoZSBWTkMgQ2xpZW50IGRvZXMgYW55IHNvcnQgb2YgYSAnRmV0Y2ggQ2VydCcKICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb24gYmVmb3JlIGNvbm5lY3RpbmcsIHRoZW4gdGhlIFJlcGVhdGVyIHdpbGwKICAgICAgICAgICAgICAgICAgICAgICBsaWtlbHkgZHJvcCB0aGUgY29ubmVjdGlvbiBhbmQgYm90aCBzaWRlcyB3aWxsIG5lZWQKICAgICAgICAgICAgICAgICAgICAgICB0byByZXN0YXJ0LiAgQ29uc2lkZXIgdGhlIHVzZSBvZiAtY29ubmVjdF9vcl9leGl0CiAgICAgICAgICAgICAgICAgICAgICAgYW5kIC1sb29wMzAwLDIgdG8gaGF2ZSB4MTF2bmMgcmVjb25uZWN0IG9uY2UgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZXIgYWZ0ZXIgdGhlIGZldGNoLiAgWW91IHdpbGwgcHJvYmFibHkgYWxzbyB3YW50CiAgICAgICAgICAgICAgICAgICAgICAgdG8gc3VwcGx5IC1zc2xvbmx5IHRvIGF2b2lkIHgxMXZuYyB0aGlua2luZyB0aGUgZGVsYXkKICAgICAgICAgICAgICAgICAgICAgICBpbiByZXNwb25zZSBtZWFucyB0aGUgY29ubmVjdGlvbiBpcyBWZU5DcnlwdC4gIFRoZSBlbnYKICAgICAgICAgICAgICAgICAgICAgICB2YXIgWDExVk5DX0RJU0FCTEVfU1NMX0NMSUVOVF9NT0RFPTEgZGlzY3Vzc2VkIGFib3ZlCiAgICAgICAgICAgICAgICAgICAgICAgbWF5IGFsc28gYmUgdXNlZnVsIChpLmUuIHRoZSB2aWV3ZXIgY2FuIGRvIGEgZm9yd2FyZAogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gYXMgaXQgbm9ybWFsbHkgZG9lcy4pCgogICAgICAgICAgICAgICAgICAgICAgIElQdjY6IGFzIG9mIHgxMXZuYyAwLjkuMTAgdGhlIC1jb25uZWN0IG9wdGlvbiBzaG91bGQKICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0IHRvIElQdjYgaG9zdHMgcHJvcGVybHkuICBJZiB0aGVyZSBhcmUgcHJvYmxlbXMKICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIGRpc2FibGUgSVB2NiBieSBzZXR0aW5nIC1EWDExVk5DX0lQVjY9MAogICAgICAgICAgICAgICAgICAgICAgIGluIENQUEZMQUdTIHdoZW4gY29uZmlndXJpbmcuICBJZiB0aGVyZSBwcm9ibGVtcwogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RpbmcgdG8gSVB2NiBob3N0cyBjb25zaWRlciBhIHJlbGF5IGxpa2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZWQgaW5ldDZ0bzQgc2NyaXB0IG9yIHRoZSAtcHJveHkgb3B0aW9uLgoKLWNvbm5lY3Rfb3JfZXhpdCBzdHIgICBBcyB3aXRoIC1jb25uZWN0LCBleGNlcHQgaWYgbm9uZSBvZiB0aGUgcmV2ZXJzZQogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zIHN1Y2NlZWQsIHRoZW4geDExdm5jIHNodXRzIGRvd24gaW1tZWRpYXRlbHkKCiAgICAgICAgICAgICAgICAgICAgICAgQW4gZWFzaWVyIHRvIHR5cGUgYWxpYXMgZm9yIHRoaXMgb3B0aW9uIGlzICctY29lJwoKICAgICAgICAgICAgICAgICAgICAgICBCeSB0aGUgd2F5LCBpZiB5b3UgZG8gbm90IHdhbnQgeDExdm5jIHRvIGxpc3RlbiBvbgogICAgICAgICAgICAgICAgICAgICAgIEFOWSBpbnRlcmZhY2UgdXNlIC1yZmJwb3J0IDAgIHdoaWNoIGlzIGhhbmR5IGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAtY29ubmVjdF9vcl9leGl0IG1vZGUuCgotcHJveHkgc3RyaW5nICAgICAgICAgIFVzZSBwcm94eSBpbiBzdHJpbmcgKGUuZy4gaG9zdDpwb3J0KSBhcyBhIHByb3h5IGZvcgogICAgICAgICAgICAgICAgICAgICAgIG1ha2luZyByZXZlcnNlIGNvbm5lY3Rpb25zICgtY29ubmVjdCBvciAtY29ubmVjdF9vcl9leGl0CiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucykuCgogICAgICAgICAgICAgICAgICAgICAgIFdlYiBwcm94aWVzIGFyZSBzdXBwb3J0ZWQsIGJ1dCBub3RlIGJ5IGRlZmF1bHQgbW9zdCBvZgogICAgICAgICAgICAgICAgICAgICAgIHRoZW0gb25seSBzdXBwb3J0IGRlc3RpbmF0aW9uIGNvbm5lY3Rpb25zIHRvIHBvcnRzIDQ0MwogICAgICAgICAgICAgICAgICAgICAgIG9yIDU2Mywgc28gdGhpcyBtaWdodCBub3QgYmUgdmVyeSB1c2VmdWwgKHRoZSB2aWV3ZXIKICAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBuZWVkIHRvIGxpc3RlbiBvbiB0aGF0IHBvcnQgb3IgdGhlIHJvdXRlciB3b3VsZAogICAgICAgICAgICAgICAgICAgICAgIGhhdmUgdG8gZG8gYSBwb3J0IHJlZGlyZWN0aW9uKS4KCiAgICAgICAgICAgICAgICAgICAgICAgQSB3ZWIgcHJveHkgbWF5IGJlIHNwZWNpZmllZCBieSBlaXRoZXIgImhvc3Q6cG9ydCIKICAgICAgICAgICAgICAgICAgICAgICBvciAiaHR0cDovL2hvc3Q6cG9ydCIgKHRoZSBwb3J0IGlzIHJlcXVpcmVkIGV2ZW4gaWYKICAgICAgICAgICAgICAgICAgICAgICBpdCBpcyB0aGUgY29tbW9uIGNob2ljZXMgODAgb3IgODA4MCkKCiAgICAgICAgICAgICAgICAgICAgICAgU09DS1M0LCBTT0NLUzRhLCBhbmQgU09DS1M1IGFyZSBhbHNvIHN1cHBvcnRlZC4KICAgICAgICAgICAgICAgICAgICAgICBTT0NLUyBwcm94aWVzIG5vcm1hbGx5IGRvIG5vdCBoYXZlIHJlc3RyaWN0aW9ucyBvbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiBwb3J0IG51bWJlci4KCiAgICAgICAgICAgICAgICAgICAgICAgVXNlIGEgZm9ybWF0IGxpa2UgdGhpczogc29ja3M6Ly9ob3N0OnBvcnQgb3IKICAgICAgICAgICAgICAgICAgICAgICBzb2NrczU6Ly9ob3N0OnBvcnQuICBOb3RlIHRoYXQgc3NoIC1EIGRvZXMgbm90IHN1cHBvcnQKICAgICAgICAgICAgICAgICAgICAgICBTT0NLUzRhLCBzbyB1c2Ugc29ja3M1Oi8vLiAgRm9yIHNvY2tzOi8vIFNPQ0tTNCBpcyB1c2VkCiAgICAgICAgICAgICAgICAgICAgICAgb24gYSBudW1lcmljYWwgSVAgYW5kICJsb2NhbGhvc3QiLCBvdGhlcndpc2UgU09DS1M0YQogICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgKGFuZCBzbyB0aGUgcHJveHkgdHJpZXMgdG8gZG8gdGhlIEROUyBsb29rdXApLgoKICAgICAgICAgICAgICAgICAgICAgICBBbiBleHBlcmltZW50YWwgbW9kZSBpcyAiLXByb3h5IGh0dHA6Ly9ob3N0OnBvcnQvLi4uIgogICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhlICIvIiBhZnRlciB0aGUgcG9ydCB0aGF0IGRpc3Rpbmd1aXNoZXMgaXQgZnJvbQogICAgICAgICAgICAgICAgICAgICAgIGEgbm9ybWFsIHdlYiBwcm94eS4gIFRoZSBwb3J0IG11c3QgYmUgc3VwcGxpZWQgZXZlbiBpZgogICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIHRoZSBkZWZhdWx0IDgwLiAgRm9yIHRoaXMgbW9kZSBhIEdFVCBpcyBkb25lIHRvCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN1cHBsaWVkIFVSTCB3aXRoIHRoZSBzdHJpbmcgaG9zdD1IJnBvcnQ9UCBhcHBlbmRlZC4KICAgICAgICAgICAgICAgICAgICAgICBIIGFuZCBQIHdpbGwgYmUgdGhlIC1jb25uZWN0IHJldmVyc2UgY29ubmVjdCBob3N0CiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHBvcnQuICBVc2UgdGhlIHN0cmluZyAiX19FTkRfXyIgdG8gZGlzYWJsZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICBhcHBlbmRpbmcuICBUaGUgYmFzaWMgaWRlYSBoZXJlIGlzIHRoYXQgbWF5YmUgc29tZSBjZ2kKICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQgcHJvdmlkZXMgdGhlIGFjdHVhbCB2aWV3ZXIgaG9va3VwIGFuZCB0dW5uZWxsaW5nLgogICAgICAgICAgICAgICAgICAgICAgIEhvdyB0byBhY3R1YWxseSBhY2hpZXZlIHRoaXMgd2l0aGluIGNnaSwgcGhwLCBldGMuIGlzCiAgICAgICAgICAgICAgICAgICAgICAgbm90IGNsZWFyLi4uICBBIGN1c3RvbSB3ZWIgc2VydmVyIG9yIGFwYWNoZSBtb2R1bGUKICAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBiZSBzdHJhaWdodC1mb3J3YXJkLgoKICAgICAgICAgICAgICAgICAgICAgICBBbm90aGVyIGV4cGVyaW1lbnRhbCBtb2RlIGlzICItcHJveHkgc3NoOi8vdXNlckBob3N0IgogICAgICAgICAgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgYSBTU0ggdHVubmVsIGlzIHVzZWQgZm9yIHRoZSBwcm94eWluZy4KICAgICAgICAgICAgICAgICAgICAgICAidXNlckAiIGlzIG5vdCBuZWVkZWQgdW5sZXNzIHlvdXIgdW5peCB1c2VybmFtZSBpcwogICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBvbiAiaG9zdCIuICBGb3IgYSBub24tc3RhbmRhcmQgU1NIIHBvcnQKICAgICAgICAgICAgICAgICAgICAgICB1c2Ugc3NoOi8vdXNlckBob3N0OnBvcnQuICBJZiBwcm94aWVzIGFyZSBjaGFpbmVkIChzZWUKICAgICAgICAgICAgICAgICAgICAgICBuZXh0IHBhcmFncmFwaCkgdGhlbiB0aGUgc3NoIG9uZSBtdXN0IGJlIHRoZSBmaXJzdCBvbmUuCiAgICAgICAgICAgICAgICAgICAgICAgSWYgc3NoLWFnZW50IGlzIG5vdCBhY3RpdmUsIHRoZW4gdGhlIHNzaCBwYXNzd29yZCBuZWVkcwogICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGVudGVyZWQgaW4gdGhlIHRlcm1pbmFsIHdoZXJlIHgxMXZuYyBpcyBydW5uaW5nLgogICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVzOgoKICAgICAgICAgICAgICAgICAgICAgICAgIC1jb25uZWN0IGxvY2FsaG9zdDowIC1wcm94eSBzc2g6Ly9tZUBmcmllbmRzLXBjOjIyMjIKCiAgICAgICAgICAgICAgICAgICAgICAgICAtY29ubmVjdCBzbm9vcHk6MCAtcHJveHkgc3NoOi8vc3NoLmNvbXBhbnkuY29tCgogICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlIHByb3hpZXMgbWF5IGJlIGNoYWluZWQgdG9nZXRoZXIgaW4gY2FzZSBvbmUKICAgICAgICAgICAgICAgICAgICAgICBuZWVkcyB0byByaWNvY2hldCBvZmYgb2YgYSBudW1iZXIgb2YgaG9zdHMgdG8gZmluYWxseQogICAgICAgICAgICAgICAgICAgICAgIHJlYWNoIHRoZSBWTkMgdmlld2VyLiAgVXAgdG8gMyBtYXkgYmUgY2hhaW5lZCwgc2VwYXJhdGUKICAgICAgICAgICAgICAgICAgICAgICB0aGVtIGJ5IGNvbW1hcyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgdG8gYmUgY29ubmVjdGVkIHRvLgogICAgICAgICAgICAgICAgICAgICAgIEUuZy46ICBodHRwOi8vaG9zdDE6cG9ydDEsc29ja3M1Oi8vaG9zdDI6cG9ydDIgb3IgdGhyZWUKICAgICAgICAgICAgICAgICAgICAgICBsaWtlOiAgZmlyc3Qsc2Vjb25kLHRoaXJkCgogICAgICAgICAgICAgICAgICAgICAgIElQdjY6IGFzIG9mIHgxMXZuYyAwLjkuMTAgdGhlIC1wcm94eSBvcHRpb24gc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdCB0byBJUHY2IGhvc3RzIHByb3Blcmx5LiAgSWYgdGhlcmUgYXJlIHByb2JsZW1zCiAgICAgICAgICAgICAgICAgICAgICAgeW91IGNhbiBkaXNhYmxlIElQdjYgYnkgc2V0dGluZyAtRFgxMVZOQ19JUFY2PTAKICAgICAgICAgICAgICAgICAgICAgICBpbiBDUFBGTEFHUyB3aGVuIGNvbmZpZ3VyaW5nLiAgSWYgdGhlcmUgcHJvYmxlbXMKICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW5nIHRvIElQdjYgaG9zdHMgY29uc2lkZXIgYSByZWxheSBsaWtlIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkIGluZXQ2dG80IHNjcmlwdC4KCi12bmNjb25uZWN0ICAgICAgICAgICAgTW9uaXRvciB0aGUgVk5DX0NPTk5FQ1QgWCBwcm9wZXJ0eSBzZXQgYnkgdGhlIHN0YW5kYXJkCi1ub3ZuY2Nvbm5lY3QgICAgICAgICAgVk5DIHByb2dyYW0gdm5jY29ubmVjdCgxKS4gIFdoZW4gdGhlIHByb3BlcnR5IGlzCiAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvICJob3N0IiBvciAiaG9zdDpwb3J0IiBlc3RhYmxpc2ggYSByZXZlcnNlCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi4gIFVzaW5nIHhwcm9wKDEpIGluc3RlYWQgb2Ygdm5jY29ubmVjdCBtYXkKICAgICAgICAgICAgICAgICAgICAgICB3b3JrIChzZWUgdGhlIEZBUSkuICBUaGUgLXJlbW90ZSBjb250cm9sIG1lY2hhbmlzbSB1c2VzCiAgICAgICAgICAgICAgICAgICAgICAgWDExVk5DX1JFTU9URSBjaGFubmVsLCBhbmQgdGhpcyBvcHRpb24gZGlzYWJsZXMvZW5hYmxlcwogICAgICAgICAgICAgICAgICAgICAgIGl0IGFzIHdlbGwuICBEZWZhdWx0OiAtdm5jY29ubmVjdAoKICAgICAgICAgICAgICAgICAgICAgICBUbyB1c2UgZGlmZmVyZW50IG5hbWVzIGZvciB0aGVzZSBYMTEgcHJvcGVydGllcyAoZS5nLiB0bwogICAgICAgICAgICAgICAgICAgICAgIGhhdmUgc2VwYXJhdGUgY29tbXVuaWNhdGlvbiBjaGFubmVscyBmb3IgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMncyBvbiB0aGUgc2FtZSBkaXNwbGF5KSBzZXQgdGhlIFZOQ19DT05ORUNUIG9yCiAgICAgICAgICAgICAgICAgICAgICAgWDExVk5DX1JFTU9URSBlbnYuIHZhcnMuIHRvIHRoZSBzdHJpbmcgeW91IHdhbnQsIGZvcgogICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGU6IC1lbnYgWDExVk5DX1JFTU9URT1YMTFWTkNfUkVNT1RFXzEyMzQ1CiAgICAgICAgICAgICAgICAgICAgICAgQm90aCBzaWRlcyBvZiB0aGUgY2hhbm5lbCBtdXN0IHVzZSB0aGUgc2FtZSB1bmlxdWUgbmFtZS4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgc2FtZSBjYW4gYmUgZG9uZSBmb3IgdGhlIGludGVybmFsIFgxMVZOQ19USUNLRVIKICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSAoaGVhcnRiZWF0IGFuZCB0aW1lc3RhbXApIGlmIGRlc2lyZWQuCgotYWxsb3cgaG9zdDFbLGhvc3QyLi5dIE9ubHkgYWxsb3cgY2xpZW50IGNvbm5lY3Rpb25zIGZyb20gaG9zdHMgbWF0Y2hpbmcKICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaG9zdG5hbWVzIG9yIElQIGFkZHJlc3Nlcy4KICAgICAgICAgICAgICAgICAgICAgICBDYW4gYWxzbyBiZSBhIG51bWVyaWNhbCBJUCBwcmVmaXgsIGUuZy4gIjE5Mi4xNjguMTAwLiIKICAgICAgICAgICAgICAgICAgICAgICB0byBtYXRjaCBhIHNpbXBsZSBzdWJuZXQsIGZvciBtb3JlIGNvbnRyb2wgYnVpbGQKICAgICAgICAgICAgICAgICAgICAgICBMaWJWTkNTZXJ2ZXIgd2l0aCBsaWJ3cmFwIHN1cHBvcnQgKFNlZSB0aGUgRkFRKS4gIElmIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGxpc3QgY29udGFpbnMgYSAiLyIgaXQgaW5zdGVhZCBpcyBhIGludGVycHJldGVkCiAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBmaWxlIGNvbnRhaW5pbmcgYWRkcmVzc2VzIG9yIHByZWZpeGVzIHRoYXQgaXMKICAgICAgICAgICAgICAgICAgICAgICByZS1yZWFkIGVhY2ggdGltZSBhIG5ldyBjbGllbnQgY29ubmVjdHMuICBMaW5lcyBjYW4gYmUKICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50ZWQgb3V0IHdpdGggdGhlICIjIiBjaGFyYWN0ZXIgaW4gdGhlIHVzdWFsIHdheS4KCiAgICAgICAgICAgICAgICAgICAgICAgLWFsbG93IGFwcGxpZXMgaW4gLXNzbCBtb2RlLCBidXQgbm90IGluIC1zdHVubmVsIG1vZGUuCgogICAgICAgICAgICAgICAgICAgICAgIElQdjY6IGFzIG9mIHgxMXZuYyAwLjkuMTAgYSBob3N0IGNhbiBiZSBzcGVjaWZpZWQKICAgICAgICAgICAgICAgICAgICAgICBpbiBJUHY2IG51bWVyaWNhbCBmb3JtYXQsIGUuZy4gMjAwMTo0ODYwOmIwMDk6OjkzLgoKLWxvY2FsaG9zdCAgICAgICAgICAgICBCYXNpY2FsbHkgdGhlIHNhbWUgYXMgIi1hbGxvdyAxMjcuMC4wLjEiLgoKICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBpZiB5b3Ugd2FudCB0byByZXN0cmljdCB3aGljaCBuZXR3b3JrIGludGVyZmFjZQogICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBsaXN0ZW5zIG9uLCBzZWUgdGhlIC1saXN0ZW4gb3B0aW9uIGJlbG93LgogICAgICAgICAgICAgICAgICAgICAgIEUuZy4gIi1saXN0ZW4gbG9jYWxob3N0IiBvciAiLWxpc3RlbiAxOTIuMTY4LjMuMjEiLgogICAgICAgICAgICAgICAgICAgICAgIEFzIGEgc3BlY2lhbCBjYXNlLCB0aGUgb3B0aW9uICItbG9jYWxob3N0IiBpbXBsaWVzCiAgICAgICAgICAgICAgICAgICAgICAgIi1saXN0ZW4gbG9jYWxob3N0Ii4KCiAgICAgICAgICAgICAgICAgICAgICAgQSByYXJlIGNhc2UsIGJ1dCBmb3Igbm9uLWxvY2FsaG9zdCAtbGlzdGVuIHVzYWdlLCBpZgogICAgICAgICAgICAgICAgICAgICAgIHlvdSB1c2UgdGhlIHJlbW90ZSBjb250cm9sIG1lY2hhbmlzbSAoLVIpIHRvIGNoYW5nZQogICAgICAgICAgICAgICAgICAgICAgIHRoZSAtbGlzdGVuIGludGVyZmFjZSB5b3UgbWF5IG5lZWQgdG8gbWFudWFsbHkgYWRqdXN0CiAgICAgICAgICAgICAgICAgICAgICAgdGhlIC1hbGxvdyBsaXN0IChhbmQgdmljZSB2ZXJzYSkgdG8gYXZvaWQgc2l0dWF0aW9ucwogICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIG5vIGNvbm5lY3Rpb25zIChvciB0b28gbWFueSkgYXJlIGFsbG93ZWQuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgd2FudCB4MTF2bmMgdG8gbGlzdGVuIG9uIEFOWSBpbnRlcmZhY2UKICAgICAgICAgICAgICAgICAgICAgICAoZXZpZGVudGx5IHlvdSBhcmUgdXNpbmcgLWNvbm5lY3Qgb3IgLWNvbm5lY3Rfb3JfZXhpdCwKICAgICAgICAgICAgICAgICAgICAgICBvciBwbGFuIHRvIHVzZSByZW1vdGUgY29udHJvbDogLVIgY29ubmVjdDpob3N0KSwgdXNlCiAgICAgICAgICAgICAgICAgICAgICAgLXJmYnBvcnQgMAoKICAgICAgICAgICAgICAgICAgICAgICBJUHY2OiBpZiBJUHY2IGlzIHN1cHBvcnRlZCwgdGhpcyBvcHRpb24gYXV0b21hdGljYWxseQogICAgICAgICAgICAgICAgICAgICAgIGltcGxpZXMgdGhlIElQdjYgbG9vcGJhY2sgYWRkcmVzcyAnOjoxJyBhcyB3ZWxsLgoKLXVuaXhzb2NrIHN0ciAgICAgICAgICBMaXN0ZW4gb24gdGhlIHVuaXggc29ja2V0IChBRl9VTklYKSAnc3RyJwogICAgICAgICAgICAgICAgICAgICAgIGZvciBjb25uZWN0aW9ucy4gIFRoaXMgbW9kZSBpcyBmb3IgZWl0aGVyIGxvY2FsCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnMgb3IgYSB0dW5uZWwgZW5kcG9pbnQgd2hlcmUgb25lIHdhbnRzIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGZpbGUgcGVybWlzc2lvbiBvZiB0aGUgdW5peCBzb2NrZXQgZmlsZSB0byBkZXRlcm1pbmUKICAgICAgICAgICAgICAgICAgICAgICB3aGF0IGNhbiBjb25uZWN0IHRvIGl0LiAgKFRoaXMgY3VycmVudGx5IHJlcXVpcmVzIGFuCiAgICAgICAgICAgICAgICAgICAgICAgZWRpdCB0byBsaWJ2bnNlcnZlci9yZmJzZXJ2ZXIuYzogY29tbWVudCBvdXQgbGluZXMgMzEwCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIDMxMSwgJ2Nsb3NlKHNvY2spJyBhbmQgJ3JldHVybiBOVUxMJyBpbiByZmJzZXJ2ZXIuYwogICAgICAgICAgICAgICAgICAgICAgIGFmdGVyIHRoZSBzZXRzb2Nrb3B0KCkgY2FsbC4pIE5vdGUgdGhhdCB0byBkaXNhYmxlIGFsbAogICAgICAgICAgICAgICAgICAgICAgIHRjcCBsaXN0ZW5pbmcgcG9ydHMgc3BlY2lmeSAnLXJmYnBvcnQgMCcgYW5kIHNob3VsZCBiZQogICAgICAgICAgICAgICAgICAgICAgIHVzZWZ1bCB3aXRoIHRoaXMgbW9kZS4gIEV4YW1wbGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1rZGlyIH4vczsgY2htb2QgNzAwIH4vczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC11bml4c29jayB+L3MvbXlzb2NrIC1yZmJwb3J0IDAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFNTVk5DIHVuaXggdm5jdmlld2VyIGNhbiBjb25uZWN0IHRvIHVuaXggc29ja2V0cy4KCi1saXN0ZW42IHN0ciAgICAgICAgICAgV2hlbiBpbiBJUHY2IGxpc3RlbiBtb2RlICItNiIsIGxpc3RlbiBvbmx5IG9uIHRoZQogICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsgaW50ZXJmYWNlIHdpdGggYWRkcmVzcyAic3RyIi4gIEl0IGFsc28gd29ya3MKICAgICAgICAgICAgICAgICAgICAgICBmb3IgbGluayBzY29wZSBhZGRyZXNzZXMgKGZlODA6OjIxOTpkYmZmOmZlZTU6M2Y5MiVldGgwKQogICAgICAgICAgICAgICAgICAgICAgIGFuZCBJUHY2IGhvc3RuYW1lIHN0cmluZ3MgKGUuZy4gaXB2Ni5nb29nbGUuY29tLikKICAgICAgICAgICAgICAgICAgICAgICBVc2UgTGliVk5DU2VydmVyIC1saXN0ZW4gb3B0aW9uIGZvciB0aGUgSVB2NCBpbnRlcmZhY2UuCgotbm9sb29rdXAgICAgICAgICAgICAgIERvIG5vdCB1c2UgZ2V0aG9zdGJ5bmFtZSgpIG9yIGdldGhvc3RieWFkZHIoKSB0byBsb29rIHVwCiAgICAgICAgICAgICAgICAgICAgICAgaG9zdCBuYW1lcyBvciBJUCBudW1iZXJzLiAgVXNlIHRoaXMgaWYgbmFtZSByZXNvbHV0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgaXMgaW5jb3JyZWN0bHkgc2V0IHVwIGFuZCBsZWFkcyB0byBsb25nIHBhdXNlcyBhcyBuYW1lCiAgICAgICAgICAgICAgICAgICAgICAgbG9va3VwcyB0aW1lIG91dCwgZXRjLgoKLWlucHV0IHN0cmluZyAgICAgICAgICBGaW5lIHR1bmluZyBvZiBhbGxvd2VkIHVzZXIgaW5wdXQuICBJZiAic3RyaW5nIiBkb2VzCiAgICAgICAgICAgICAgICAgICAgICAgbm90IGNvbnRhaW4gYSBjb21tYSAiLCIgdGhlIHR1bmluZyBhcHBsaWVzIG9ubHkgdG8KICAgICAgICAgICAgICAgICAgICAgICBub3JtYWwgY2xpZW50cy4gIE90aGVyd2lzZSB0aGUgcGFydCBiZWZvcmUgIiwiIGlzCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIG5vcm1hbCBjbGllbnRzIGFuZCB0aGUgcGFydCBhZnRlciBmb3Igdmlldy1vbmx5CiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cy4gICJLIiBpcyBmb3IgS2V5c3Ryb2tlIGlucHV0LCAiTSIgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgTW91c2UtbW90aW9uIGlucHV0LCAiQiIgZm9yIEJ1dHRvbi1jbGljayBpbnB1dCwgIkMiCiAgICAgICAgICAgICAgICAgICAgICAgaXMgZm9yIENsaXBib2FyZCBpbnB1dCwgYW5kICJGIiBpcyBmb3IgRmlsZSB0cmFuc2ZlcgogICAgICAgICAgICAgICAgICAgICAgICh1bHRyYXZuYyBvbmx5KS4gIFRoZWlyIHByZXNlbmNlIGluIHRoZSBzdHJpbmcgZW5hYmxlcwogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdHlwZSBvZiBpbnB1dC4gIEUuZy4gIi1pbnB1dCBNIiBtZWFucyBub3JtYWwKICAgICAgICAgICAgICAgICAgICAgICB1c2VycyBjYW4gb25seSBtb3ZlIHRoZSBtb3VzZSBhbmQgICItaW5wdXQgS01CQ0YsTSIKICAgICAgICAgICAgICAgICAgICAgICBsZXRzIG5vcm1hbCB1c2VycyBkbyBhbnl0aGluZyBhbmQgZW5hYmxlcyB2aWV3LW9ubHkKICAgICAgICAgICAgICAgICAgICAgICB1c2VycyB0byBtb3ZlIHRoZSBtb3VzZS4gIFRoaXMgb3B0aW9uIGlzIGlnbm9yZWQgd2hlbgogICAgICAgICAgICAgICAgICAgICAgIGEgZ2xvYmFsIC12aWV3b25seSBpcyBpbiBlZmZlY3QgKGFsbCBpbnB1dCBpcyBkaXNjYXJkZWQKICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGF0IGNhc2UpLgoKLWdyYWJrYmQgICAgICAgICAgICAgICBXaGVuIFZOQyB2aWV3ZXJzIGFyZSBjb25uZWN0ZWQsIGF0dGVtcHQgdG8gdGhlIGdyYWIKICAgICAgICAgICAgICAgICAgICAgICB0aGUga2V5Ym9hcmQgc28gYSAobm9uLW1hbGljaW91cykgdXNlciBzaXR0aW5nIGF0IHRoZQogICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsIGRpc3BsYXkgaXMgbm90IGFibGUgdG8gZW50ZXIga2V5c3Ryb2tlcy4KICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1ldGhvZCB1c2VzIFhHcmFiS2V5Ym9hcmQoM1gxMSkgYW5kIHNvIGl0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgbm90IHNlY3VyZSBhbmQgZG9lcyBub3QgcnVsZSBvdXQgdGhlIHBlcnNvbiBhdCB0aGUKICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbCBkaXNwbGF5IGluamVjdGluZyBrZXlzdHJva2VzIGJ5IGZsb29kaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciB3aXRoIHRoZW0sIGdyYWJiaW5nIHRoZSBrZXlib2FyZCBoaW1zZWxmLCBldGMuCiAgICAgICAgICAgICAgICAgICAgICAgU29tZSBkZWdyZWUgb2YgY29vcGVyYXRpb24gZnJvbSB0aGUgcGVyc29uIGF0IHRoZQogICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgaXMgYXNzdW1lZC4gIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHJlbW90ZQogICAgICAgICAgICAgICAgICAgICAgIGhlbHAtZGVzayBvciBlZHVjYXRpb25hbCB1c2FnZSBtb2Rlcy4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogb24gc29tZSByZWNlbnQgKDEyLzIwMTApIFggc2VydmVycyBhbmQvb3IKICAgICAgICAgICAgICAgICAgICAgICBkZXNrdG9wcywgLWdyYWJrYmQgbm8gbG9uZ2VyIHdvcmtzOiBpdCBwcmV2ZW50cyB0aGUKICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgbWFuYWdlciBmcm9tIHJlc2l6aW5nIHdpbmRvd3MgYW5kIHNpbWlsYXIgdGhpbmdzLgogICAgICAgICAgICAgICAgICAgICAgIFRyeSAtdW5ncmFiYm90aCBiZWxvdyAobWlnaHQgbm90IHdvcmsuKQoKLWdyYWJwdHIgICAgICAgICAgICAgICBBcyAtZ3JhYmtiZCwgYnV0IGZvciB0aGUgbW91c2UgcG9pbnRlciB1c2luZwogICAgICAgICAgICAgICAgICAgICAgIFhHcmFiUG9pbnRlcigzWDExKS4gIFVuZm9ydHVuYXRlbHkgZHVlIHRvIHRoZSB3YXkgdGhlIFgKICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgd29ya3MsIHRoZSBtb3VzZSBjYW4gc3RpbGwgYmUgbW92ZWQgYXJvdW5kIGJ5IHRoZQogICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXQgdGhlIHBoeXNpY2FsIGRpc3BsYXksIGJ1dCBoZSB3aWxsIG5vdCBiZSBhYmxlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlIHdpbmRvdyBmb2N1cyB3aXRoIGl0LiAgQWxzbyBzb21lIHdpbmRvdyBtYW5hZ2VycwogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FsbCBYR3JhYlNlcnZlcigzWDExKSBmb3IgcmVzaXplcywgZXRjLCB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgYWN0IG9uIHRoZSBsb2NhbCB1c2VyJ3MgaW5wdXQuICBBZ2Fpbiwgc29tZSBkZWdyZWUgb2YKICAgICAgICAgICAgICAgICAgICAgICBjb29wZXJhdGlvbiBmcm9tIHRoZSBwZXJzb24gYXQgdGhlIGRpc3BsYXkgaXMgYXNzdW1lZC4KCi11bmdyYWJib3RoICAgICAgICAgICAgV2hlbmV2ZXIgdGhlcmUgaXMgYW55IGlucHV0IChlaXRoZXIga2V5Ym9hcmQgb3IKICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyKSwgdW5ncmFiICpib3RoKiB0aGUga2V5Ym9hcmQgYW5kIHRoZSBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgaW5qZWN0aW5nIHRoZSBzeW50aGV0aWMgaW5wdXQuICBUaGlzIGlzIHRvIGFsbG93CiAgICAgICAgICAgICAgICAgICAgICAgd2luZG93IG1hbmFnZXJzLCBldGMuIGEgY2hhbmNlIHRvIGdyYWIuCgotZ3JhYmFsd2F5cyAgICAgICAgICAgIEFwcGx5IGJvdGggLWdyYWJrYmQgYW5kIC1ncmFicHRyIGV2ZW4gd2hlbiBubyBWTkMKICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXJzIGFyZSBjb25uZWN0ZWQuICBJZiB5b3Ugb25seSB3YW50IG9uZSBvZiB0aGVtLAogICAgICAgICAgICAgICAgICAgICAgIHVzZSB0aGUgLVIgcmVtb3RlIGNvbnRyb2wgdG8gdHVybiB0aGUgb3RoZXIgYmFjayBvbiwKICAgICAgICAgICAgICAgICAgICAgICBlLmcuIC1SIG5vZ3JhYnB0ci4KCi12aWV3cGFzc3dkIHN0cmluZyAgICAgU3VwcGx5IGEgMm5kIHBhc3N3b3JkIGZvciB2aWV3LW9ubHkgbG9naW5zLiAgVGhlIC1wYXNzd2QKICAgICAgICAgICAgICAgICAgICAgICAoZnVsbC1hY2Nlc3MpIHBhc3N3b3JkIG11c3QgYWxzbyBiZSBzdXBwbGllZC4KCi1wYXNzd2RmaWxlIGZpbGVuYW1lICAgU3BlY2lmeSB0aGUgTGliVk5DU2VydmVyIHBhc3N3b3JkIHZpYSB0aGUgZmlyc3QgbGluZQogICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmaWxlICJmaWxlbmFtZSIgKGluc3RlYWQgb2YgdmlhIC1wYXNzd2Qgb24KICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWFuZCBsaW5lIHdoZXJlIG90aGVycyBtaWdodCBzZWUgaXQgdmlhIHBzKDEpKS4KCiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSBkZXNjcmlwdGlvbnMgYmVsb3cgZm9yIGhvdyB0byBzdXBwbHkgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZHMsIHZpZXctb25seSBwYXNzd29yZHMsIHRvIHNwZWNpZnkgZXh0ZXJuYWwKICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtcyBmb3IgdGhlIGF1dGhlbnRpY2F0aW9uLCBhbmQgb3RoZXIgZmVhdHVyZXMuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBmaWxlbmFtZSBpcyBwcmVmaXhlZCB3aXRoICJybToiIGl0IHdpbGwgYmUKICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVkIGFmdGVyIGJlaW5nIHJlYWQuICBQZXJoYXBzIHRoaXMgaXMgdXNlZnVsIGluCiAgICAgICAgICAgICAgICAgICAgICAgbGltaXRpbmcgdGhlIHJlYWRhYmlsaXR5IG9mIHRoZSBmaWxlLiAgSW4gZ2VuZXJhbCwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgZmlsZSBzaG91bGQgbm90IGJlIHJlYWRhYmxlIGJ5IHVudHJ1c3RlZCB1c2VycwogICAgICAgICAgICAgICAgICAgICAgIChCVFc6IG5laXRoZXIgc2hvdWxkIHRoZSBWTkMgLXJmYmF1dGggZmlsZTogaXQgaXMgTk9UCiAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkLCBvbmx5IG9ic2N1cmVkIHdpdGggYSBmaXhlZCBrZXkpLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgZmlsZW5hbWUgaXMgcHJlZml4ZWQgd2l0aCAicmVhZDoiIGl0IHdpbGwKICAgICAgICAgICAgICAgICAgICAgICBwZXJpb2RpY2FsbHkgYmUgY2hlY2tlZCBmb3IgY2hhbmdlcyBhbmQgcmVyZWFkLiAgSXQgaXMKICAgICAgICAgICAgICAgICAgICAgICBndWFyYW50ZWVkIHRvIGJlIHJlcmVhZCBqdXN0IHdoZW4gYSBuZXcgY2xpZW50IGNvbm5lY3RzCiAgICAgICAgICAgICAgICAgICAgICAgc28gdGhhdCB0aGUgbGF0ZXN0IHBhc3N3b3JkcyB3aWxsIGJlIHVzZWQuCgogICAgICAgICAgICAgICAgICAgICAgIElmICJmaWxlbmFtZSIgaXMgcHJlZml4ZWQgd2l0aCAiY21kOiIgdGhlbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgYWZ0ZXIgdGhlICI6IiBpcyBydW4gYXMgYW4gZXh0ZXJuYWwgY29tbWFuZDoKICAgICAgICAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIHdpbGwgYmUgaW50ZXJwcmV0ZWQgYXMgaWYgaXQKICAgICAgICAgICAgICAgICAgICAgICB3ZXJlIHJlYWQgZnJvbSBhIHBhc3N3b3JkIGZpbGUgKHNlZSBiZWxvdykuICBJZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGRvZXMgbm90IGV4aXQgd2l0aCAwLCB0aGVuIHgxMXZuYyB0ZXJtaW5hdGVzCiAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkuICBUbyBzcGVjaWZ5IG1vcmUgdGhhbiAxMDAwIHBhc3N3b3JkcyB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgd2F5IHNldCBYMTFWTkNfTUFYX1BBU1NXRFMgYmVmb3JlIHN0YXJ0aW5nIHgxMXZuYy4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQgYXMgaW4gLWFjY2VwdC4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGR1ZSB0byB0aGUgVk5DIHByb3RvY29sIG9ubHkgdGhlIGZpcnN0IDgKICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzIG9mIGEgcGFzc3dvcmQgYXJlIHVzZWQgKERFUyBrZXkpLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiAiZmlsZW5hbWUiIGlzIHByZWZpeGVkIHdpdGggImN1c3RvbToiIHRoZW4gYQogICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBwYXNzd29yZCBjaGVja2VyIGlzIHN1cHBsaWVkIGFzIGFuIGV4dGVybmFsCiAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBmb2xsb3dpbmcgdGhlICI6Ii4gVGhlIGNvbW1hbmQgd2lsbCBiZSBydW4KICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGEgY2xpZW50IGF1dGhlbnRpY2F0ZXMuICBJZiB0aGUgY29tbWFuZCBleGl0cyB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgMCB0aGUgY2xpZW50IGlzIGFjY2VwdGVkLCBvdGhlcndpc2UgaXQgaXMgcmVqZWN0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0IGFzIGluIC1hY2NlcHQuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdGFuZGFyZCBpbnB1dCB0byB0aGUgY3VzdG9tIGNvbW1hbmQgd2lsbCBiZSBhCiAgICAgICAgICAgICAgICAgICAgICAgZGVjaW1hbCBkaWdpdCAibGVuIiBmb2xsb3dlZCBieSBhIG5ld2xpbmUuICJsZW4iCiAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIHRoZSBjaGFsbGVuZ2Ugc2l6ZSBhbmQgaXMgdXN1YWxseSAxNiAodGhlCiAgICAgICAgICAgICAgICAgICAgICAgVk5DIHNwZWMpLiAgVGhlbiBmb2xsb3dzIGxlbiBieXRlcyB3aGljaCBpcyB0aGUgcmFuZG9tCiAgICAgICAgICAgICAgICAgICAgICAgY2hhbGxlbmdlIHN0cmluZyB0aGF0IHdhcyBzZW50IHRvIHRoZSBjbGllbnQuIFRoaXMgaXMKICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGZvbGxvd2VkIGJ5IGxlbiBtb3JlIGJ5dGVzIGhvbGRpbmcgdGhlIGNsaWVudCdzCiAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgKGkuZS4gdGhlIGNoYWxsZW5nZSBzdHJpbmcgZW5jcnlwdGVkIHZpYSBERVMKICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSB1c2VyIHBhc3N3b3JkIGluIHRoZSBzdGFuZGFyZCBzaXR1YXRpb24pLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgImN1c3RvbToiIHNjaGVtZSBjYW4gYmUgdXNlZnVsIHRvIGltcGxlbWVudAogICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWMgcGFzc3dvcmRzIG9yIHRvIGltcGxlbWVudCBtZXRob2RzIHdoZXJlIGxvbmdlcgogICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkcyBhbmQvb3IgZGlmZmVyZW50IGVuY3J5cHRpb24gYWxnb3JpdGhtcwogICAgICAgICAgICAgICAgICAgICAgIGFyZSB1c2VkLiAgVGhlIGxhdHRlciB3aWxsIHJlcXVpcmUgY3VzdG9taXppbmcgdGhlIFZOQwogICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCBhcyB3ZWxsLiAgT25lIGNvdWxkIGNyZWF0ZSBhbiBNRDVTVU0gYmFzZWQgc2NoZW1lCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGUuCgogICAgICAgICAgICAgICAgICAgICAgIEZpbGUgZm9ybWF0IGZvciAtcGFzc3dkZmlsZToKCiAgICAgICAgICAgICAgICAgICAgICAgSWYgbXVsdGlwbGUgbm9uLWJsYW5rIGxpbmVzIGV4aXN0IGluIHRoZSBmaWxlIHRoZXkgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgYWxsIHRha2VuIGFzIHZhbGlkIHBhc3N3b3Jkcy4gIEJsYW5rIGxpbmVzIGFyZSBpZ25vcmVkLgogICAgICAgICAgICAgICAgICAgICAgIFBhc3N3b3JkIGxpbmVzIG1heSBiZSAiY29tbWVudGVkIG91dCIgKGlnbm9yZWQpIGlmCiAgICAgICAgICAgICAgICAgICAgICAgdGhleSBiZWdpbiB3aXRoIHRoZSBjaGFyYWN0ZXIgIiMiIG9yIHRoZSBsaW5lIGNvbnRhaW5zCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN0cmluZyAiX19TS0lQX18iLiAgTGluZXMgbWF5IGJlIGFubm90YXRlZCBieSB1c2UKICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgIl9fQ09NTV9fIiBzdHJpbmc6IGZyb20gaXQgdG8gdGhlIGVuZCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBsaW5lIGlzIGlnbm9yZWQuICBBbiBlbXB0eSBwYXNzd29yZCBtYXkgYmUgc3BlY2lmaWVkCiAgICAgICAgICAgICAgICAgICAgICAgdmlhIHRoZSAiX19FTVBUWV9fIiBzdHJpbmcgb24gYSBsaW5lIGJ5IGl0c2VsZiAobm90ZQogICAgICAgICAgICAgICAgICAgICAgIHlvdXIgdmlld2VyIG1pZ2h0IG5vdCBhY2NlcHQgZW1wdHkgcGFzc3dvcmRzKS4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0cmluZyAiX19CRUdJTl9WSUVXT05MWV9fIiBhcHBlYXJzIG9uIGEKICAgICAgICAgICAgICAgICAgICAgICBsaW5lIGJ5IGl0c2VsZiwgdGhlIHJlbWFpbmluZyBwYXNzd29yZHMgYXJlIHVzZWQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgdmlld29ubHkgYWNjZXNzLiAgRm9yIGNvbXBhdGliaWxpdHksIGFzIGEgc3BlY2lhbCBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGZpbGUgY29udGFpbnMgb25seSB0d28gcGFzc3dvcmQgbGluZXMgdGhlIDJuZAogICAgICAgICAgICAgICAgICAgICAgIG9uZSBpcyBhdXRvbWF0aWNhbGx5IHRha2VuIGFzIHRoZSB2aWV3b25seSBwYXNzd29yZC4KICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgdGhlICJfX0JFR0lOX1ZJRVdPTkxZX18iIHRva2VuIG11c3QgYmUKICAgICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIGhhdmUgdmlld29ubHkgcGFzc3dvcmRzLiAgKHRpcDogbWFrZSB0aGUgM3JkCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGxhc3QgbGluZSBiZSAiX19CRUdJTl9WSUVXT05MWV9fIiB0byBoYXZlIDIKICAgICAgICAgICAgICAgICAgICAgICBmdWxsLWFjY2VzcyBwYXNzd29yZHMpCgotc2hvd3JmYmF1dGggZmlsZW5hbWUgIFByaW50IHRvIHRoZSBzY3JlZW4gdGhlIG9ic2N1cmVkIFZOQyBwYXNzd29yZCBrZXB0IGluCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJmYmF1dGggZmlsZSAiZmlsZW5hbWUiIGFuZCB0aGVuIGV4aXQuCgotdW5peHB3IFtsaXN0XSAgICAgICAgIFVzZSBVbml4IHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbi4gIHgxMXZuYwogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgdXNlIHRoZSBzdSgxKSBwcm9ncmFtIHRvIHZlcmlmeSB0aGUgdXNlcidzCiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQuICBbbGlzdF0gaXMgYW4gb3B0aW9uYWwgY29tbWEgc2VwYXJhdGVkIGxpc3QKICAgICAgICAgICAgICAgICAgICAgICBvZiBhbGxvd2VkIFVuaXggdXNlcm5hbWVzLiAgSWYgdGhlIFtsaXN0XSBzdHJpbmcgYmVnaW5zCiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY2hhcmFjdGVyICIhIiB0aGVuIHRoZSBlbnRpcmUgbGlzdCBpcyB0YWtlbgogICAgICAgICAgICAgICAgICAgICAgIGFzIGFuIGV4Y2x1ZGUgbGlzdC4gIFNlZSBiZWxvdyBmb3IgcGVyLXVzZXIgb3B0aW9ucwogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY2FuIGJlIGFwcGxpZWQuCgogICAgICAgICAgICAgICAgICAgICAgIEEgZmFtaWxpYXIgImxvZ2luOiIgYW5kICJQYXNzd29yZDoiIGRpYWxvZyBpcwogICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRlZCB0byB0aGUgdXNlciBvbiBhIGJsYWNrIHNjcmVlbiBpbnNpZGUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgdm5jdmlld2VyLiAgVGhlIGNvbm5lY3Rpb24gaXMgZHJvcHBlZCBpZiB0aGUgdXNlciBmYWlscwogICAgICAgICAgICAgICAgICAgICAgIHRvIHN1cHBseSB0aGUgY29ycmVjdCBwYXNzd29yZCBpbiAzIHRyaWVzIG9yIGRvZXMgbm90CiAgICAgICAgICAgICAgICAgICAgICAgc2VuZCBvbmUgYmVmb3JlIGEgNDUgc2Vjb25kIHRpbWVvdXQuICBFeGlzdGluZyBjbGllbnRzCiAgICAgICAgICAgICAgICAgICAgICAgYXJlIHZpZXctb25seSBkdXJpbmcgdGhpcyBwZXJpb2QuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgcmVjZWl2ZWQgaXMgIkVzY2FwZSIgdGhlbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICB1bml4IHVzZXJuYW1lIHdpbGwgbm90IGJlIGRpc3BsYXllZCBhZnRlciAibG9naW46IgogICAgICAgICAgICAgICAgICAgICAgIGFzIGl0IGlzIHR5cGVkLiAgVGhpcyBjb3VsZCBiZSBvZiB1c2UgZm9yIFZOQyB2aWV3ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhdXRvbWF0aWNhbGx5IHR5cGUgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4KCiAgICAgICAgICAgICAgICAgICAgICAgU2luY2UgdGhlIGRldGFpbGVkIGJlaGF2aW9yIG9mIHN1KDEpIGNhbiB2YXJ5IGZyb20KICAgICAgICAgICAgICAgICAgICAgICBPUyB0byBPUyBhbmQgZm9yIGxvY2FsIGNvbmZpZ3VyYXRpb25zLCB0ZXN0IHRoZSBtb2RlCiAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIGRlcGxveW1lbnQgdG8gbWFrZSBzdXJlIGl0IGlzIHdvcmtpbmcgcHJvcGVybHkuCiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIHdpbGwgYXR0ZW1wdCB0byBiZSBjb25zZXJ2YXRpdmUgYW5kIHJlamVjdCBhCiAgICAgICAgICAgICAgICAgICAgICAgbG9naW4gaWYgYW55dGhpbmcgYWJub3JtYWwgb2NjdXJzLgoKICAgICAgICAgICAgICAgICAgICAgICBPbmUgY2FzZSB0byBub3RlOiBGcmVlQlNEIGFuZCB0aGUgb3RoZXIgQlNEJ3MgYnkKICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGl0IGlzIGltcG9zc2libGUgZm9yIHRoZSB1c2VyIHJ1bm5pbmcgeDExdm5jIHRvCiAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGUgaGlzICpvd24qIHBhc3N3b3JkIHZpYSBzdSgxKSAoY29tbWVudGluZyBvdXQKICAgICAgICAgICAgICAgICAgICAgICB0aGUgcGFtX3NlbGYuc28gZW50cnkgaW4gL2V0Yy9wYW0uZC9zdSBlbGltaW5hdGVzIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcikuICBTbyB0aGUgeDExdm5jIGxvZ2luIHdpbGwgYWx3YXlzICpGQUlMKiBmb3IKICAgICAgICAgICAgICAgICAgICAgICB0aGlzIGNhc2UgKGV2ZW4gd2hlbiB0aGUgY29ycmVjdCBwYXNzd29yZCBpcyBzdXBwbGllZCkuCgogICAgICAgICAgICAgICAgICAgICAgIEEgcG9zc2libGUgd29ya2Fyb3VuZCBmb3IgdGhpcyBvbiAqQlNEIHdvdWxkIGJlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgeDExdm5jIGFzIHJvb3Qgd2l0aCB0aGUgIi11c2VycyArbm9ib2R5IiBvcHRpb24KICAgICAgICAgICAgICAgICAgICAgICB0byBpbW1lZGlhdGVseSBzd2l0Y2ggdG8gdXNlciBub2JvZHkgd2hlcmUgdGhlIHN1J2luZwogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgcHJvY2VlZCBub3JtYWxseS4KCiAgICAgICAgICAgICAgICAgICAgICAgQW5vdGhlciBzb3VyY2Ugb2YgcG90ZW50aWFsIHByb2JsZW1zIGFyZSBQQU0gbW9kdWxlcwogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcHJvbXB0IGZvciBleHRyYSBpbmZvLCBlLmcuIHBhc3N3b3JkIGFnaW5nIG1vZHVsZXMuCiAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgbG9naW5zIHdpbGwgZmFpbCBhcyB3ZWxsIGV2ZW4gd2hlbiB0aGUgY29ycmVjdAogICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkIGlzIHN1cHBsaWVkLgoKICAgICAgICAgICAgICAgICAgICAgICAqKklNUE9SVEFOVCoqOiB0byBwcmV2ZW50IHRoZSBVbml4IHBhc3N3b3JkIGJlaW5nIHNlbnQKICAgICAgICAgICAgICAgICAgICAgICBpbiAqY2xlYXIgdGV4dCogb3ZlciB0aGUgbmV0d29yaywgb25lIG9mIHR3byBzY2hlbWVzCiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBlbmZvcmNlZDogMSkgdGhlIC1zc2wgYnVpbHRpbiBTU0wgbW9kZSwgb3IgMikKICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlIGJvdGggLWxvY2FsaG9zdCBhbmQgLXN0dW5uZWwgYmUgZW5hYmxlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIDEpIGVuc3VyZXMgdGhlIHRyYWZmaWMgaXMgZW5jcnlwdGVkIGJldHdlZW4KICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXIgYW5kIHNlcnZlci4gIEEgUEVNIGZpbGUgd2lsbCBiZSByZXF1aXJlZCwgc2VlIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGRpc2N1c3Npb24gdW5kZXIgLXNzbCBiZWxvdyAodW5kZXIgc29tZSBjaXJjdW1zdGFuY2VzCiAgICAgICAgICAgICAgICAgICAgICAgYSB0ZW1wb3Jhcnkgb25lIGNhbiBiZSBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCkuCgogICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCAyKSByZXF1aXJlcyB0aGUgdmlld2VyIGNvbm5lY3Rpb24gdG8gYXBwZWFyCiAgICAgICAgICAgICAgICAgICAgICAgdG8gY29tZSBmcm9tIHRoZSBzYW1lIG1hY2hpbmUgeDExdm5jIGlzIHJ1bm5pbmcgb24KICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBmcm9tIGEgc3NoIC1MIHBvcnQgcmVkaXJlY3Rpb24pLiAgQW5kIHRoYXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgLXN0dW5uZWwgU1NMIG1vZGUgYmUgdXNlZCBmb3IgZW5jcnlwdGlvbiBvdmVyIHRoZQogICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmsuIChzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIC1zdHVubmVsIGJlbG93KS4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogYXMgYSBjb252ZW5pZW5jZSwgaWYgeW91IHNzaCgxKSBpbiBhbmQgc3RhcnQKICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgaXQgd2lsbCBjaGVjayBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUKICAgICAgICAgICAgICAgICAgICAgICBTU0hfQ09OTkVDVElPTiBpcyBzZXQgYW5kIGFwcGVhcnMgcmVhc29uYWJsZS4gIElmIGl0CiAgICAgICAgICAgICAgICAgICAgICAgZG9lcywgdGhlbiB0aGUgLXNzbCBvciAtc3R1bm5lbCByZXF1aXJlbWVudCB3aWxsIGJlCiAgICAgICAgICAgICAgICAgICAgICAgZHJvcHBlZCBzaW5jZSBpdCBpcyBhc3N1bWVkIHlvdSBhcmUgdXNpbmcgc3NoIGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWQgdHVubmVsbGluZy4gIC1sb2NhbGhvc3QgaXMgc3RpbGwgZW5mb3JjZWQuCiAgICAgICAgICAgICAgICAgICAgICAgVXNlIC1zc2wgb3IgLXN0dW5uZWwgdG8gZm9yY2UgU1NMIHVzYWdlIGV2ZW4gaWYKICAgICAgICAgICAgICAgICAgICAgICBTU0hfQ09OTkVDVElPTiBpcyBzZXQuCgogICAgICAgICAgICAgICAgICAgICAgIFRvIG92ZXJyaWRlIHRoZSBhYm92ZSByZXN0cmljdGlvbnMgeW91IGNhbiBzZXQKICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYmVmb3JlIHN0YXJ0aW5nIHgxMXZuYzoKCiAgICAgICAgICAgICAgICAgICAgICAgU2V0IFVOSVhQV19ESVNBQkxFX1NTTD0xIHRvIGRpc2FibGUgcmVxdWlyaW5nIGVpdGhlcgogICAgICAgICAgICAgICAgICAgICAgIC1zc2wgb3IgLXN0dW5uZWwgKGFzIHVuZGVyIFNTSF9DT05ORUNUSU9OLikgIEV2aWRlbnRseQogICAgICAgICAgICAgICAgICAgICAgIHlvdSB3aWxsIGJlIHVzaW5nIGEgZGlmZmVyZW50IG1ldGhvZCB0byBlbmNyeXB0IHRoZQogICAgICAgICAgICAgICAgICAgICAgIGRhdGEgYmV0d2VlbiB0aGUgdm5jdmlld2VyIGFuZCB4MTF2bmM6IHBlcmhhcHMgc3NoKDEpCiAgICAgICAgICAgICAgICAgICAgICAgb3IgYW4gSVBTRUMgVlBOLiAtbG9jYWxob3N0IGlzIHN0aWxsIGVuZm9yY2VkIChob3dldmVyLAogICAgICAgICAgICAgICAgICAgICAgIHNlZSB0aGUgbmV4dCBwYXJhZ3JhcGguKQoKICAgICAgICAgICAgICAgICAgICAgICBTZXQgVU5JWFBXX0RJU0FCTEVfTE9DQUxIT1NUPTEgdG8gZGlzYWJsZSB0aGUgLWxvY2FsaG9zdAogICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVtZW50IGluIC11bml4cHcgbW9kZXMuICBPbmUgc2hvdWxkIG5ldmVyIGRvIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBhbGxvdyB0aGUgVW5peCBwYXNzd29yZHMgdG8gYmUgc25pZmZlZCBvbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBuZXR3b3JrLikgIFRoaXMgYWxzbyBkaXNhYmxlcyB0aGUgbG9jYWxob3N0IHJlcXVpcmVtZW50CiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHJldmVyc2UgY29ubmVjdGlvbnMgKHNlZSBiZWxvdy4pCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB1c2Ugb2YgLWxvY2FsaG9zdCB3aXRoIHNzaCgxKSAoYW5kIG5vIC11bml4cHcpCiAgICAgICAgICAgICAgICAgICAgICAgaXMgcm91Z2hseSB0aGUgc2FtZSBhcyByZXF1aXJpbmcgYSBVbml4IHVzZXIgbG9naW4KICAgICAgICAgICAgICAgICAgICAgICAoc2luY2UgYSBVbml4IHBhc3N3b3JkIG9yIHRoZSB1c2VyJ3MgcHVibGljIGtleQogICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQgYnkgc3NoZCBvbiB0aGUgbWFjaGluZSB3aGVyZQogICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBydW5zIGFuZCBvbmx5IGxvY2FsIGNvbm5lY3Rpb25zIGZyb20gdGhhdCBtYWNoaW5lCiAgICAgICAgICAgICAgICAgICAgICAgYXJlIGFjY2VwdGVkKS4KCiAgICAgICAgICAgICAgICAgICAgICAgUmVnYXJkaW5nIHJldmVyc2UgY29ubmVjdGlvbnMgKGUuZy4gLVIgY29ubmVjdDpob3N0CiAgICAgICAgICAgICAgICAgICAgICAgYW5kIC1jb25uZWN0IGhvc3QpLCB3aGVuIHRoZSAtbG9jYWxob3N0IGNvbnN0cmFpbnQgaXMKICAgICAgICAgICAgICAgICAgICAgICBpbiBlZmZlY3QgdGhlbiByZXZlcnNlIGNvbm5lY3Rpb25zIGNhbiBvbmx5IGJlIHVzZWQKICAgICAgICAgICAgICAgICAgICAgICB0byBjb25uZWN0IHRvIHRoZSBzYW1lIG1hY2hpbmUgeDExdm5jIGlzIHJ1bm5pbmcgb24KICAgICAgICAgICAgICAgICAgICAgICAoZGVmYXVsdCBwb3J0IDU1MDApLiAgUGxlYXNlIHVzZSBhIHNzaCBvciBzdHVubmVsIHBvcnQKICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGlvbiB0byB0aGUgdmlld2VyIG1hY2hpbmUgdG8gdHVubmVsIHRoZSByZXZlcnNlCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBvdmVyIGFuIGVuY3J5cHRlZCBjaGFubmVsLgoKICAgICAgICAgICAgICAgICAgICAgICBJbiAtaW5ldGQgbW9kZSB0aGUgTWV0aG9kIDEpIHdpbGwgYmUgZW5mb3JjZWQgKG5vdAogICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZCAyKS4gIFdpdGggLXNzbCBpbiBlZmZlY3QgcmV2ZXJzZSBjb25uZWN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgIGFyZSBkaXNhYmxlZC4gIElmIHlvdSBvdmVycmlkZSB0aGlzIHZpYSBlbnYuIHZhciwgYmUKICAgICAgICAgICAgICAgICAgICAgICBzdXJlIHRvIGFsc28gdXNlIGVuY3J5cHRpb24gZnJvbSB0aGUgdmlld2VyIHRvIGluZXRkLgogICAgICAgICAgICAgICAgICAgICAgIFRpcDogeW91IGNhbiBhbHNvIGhhdmUgeW91ciBvd24gc3R1bm5lbCBzcGF3biB4MTF2bmMKICAgICAgICAgICAgICAgICAgICAgICBpbiAtaW5ldGQgbW9kZSAodGhlcmVieSBieXBhc3NpbmcgaW5ldGQpLiAgU2VlIHRoZSBGQVEKICAgICAgICAgICAgICAgICAgICAgICBmb3IgZGV0YWlscy4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHVzZXIgbmFtZXMgaW4gdGhlIGNvbW1hIHNlcGFyYXRlZCBbbGlzdF0gbWF5IGhhdmUKICAgICAgICAgICAgICAgICAgICAgICBwZXItdXNlciBvcHRpb25zIGFmdGVyIGEgIjoiLCBlLmcuICJmcmVkOm9wdHMiCiAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgIm9wdHMiIGlzIGEgIisiIHNlcGFyYXRlZCBsaXN0IG9mCiAgICAgICAgICAgICAgICAgICAgICAgInZpZXdvbmx5IiwgImZ1bGxhY2Nlc3MiLCAiaW5wdXQ9WFhYWCIsIG9yCiAgICAgICAgICAgICAgICAgICAgICAgImRlbnkiLCBlLmcuICJrYXJsLHdhbGx5OnZpZXdvbmx5LGJvc3M6aW5wdXQ9TSIuCiAgICAgICAgICAgICAgICAgICAgICAgRm9yICJpbnB1dD0iIGl0IGlzIHRoZSBLLE0sQixDIGRlc2NyaWJlZCB1bmRlciAtaW5wdXQuCgogICAgICAgICAgICAgICAgICAgICAgIElmIGFuIGl0ZW0gaW4gdGhlIGxpc3QgaXMgIioiIHRoYXQgbWVhbnMgdGhvc2UKICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zIGFwcGx5IHRvIGFsbCB1c2Vycy4gIEl0IEFMU08gaW1wbGllcyBhbGwgdXNlcnMKICAgICAgICAgICAgICAgICAgICAgICBhcmUgYWxsb3dlZCB0byBsb2cgaW4gYWZ0ZXIgc3VwcGx5aW5nIGEgdmFsaWQgcGFzc3dvcmQuCiAgICAgICAgICAgICAgICAgICAgICAgVXNlICJkZW55IiB0byBleHBsaWNpdGx5IGRlbnkgc29tZSB1c2VycyBpZiB5b3UgdXNlCiAgICAgICAgICAgICAgICAgICAgICAgIioiIHRvIHNldCBhIGdsb2JhbCBvcHRpb24uICBJZiBbbGlzdF0gYmVnaW5zIHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIiEiIGNoYXJhY3RlciB0aGVuICIqIiBpcyBpZ25vcmVkIGZvciBjaGVja2luZyBpZgogICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGlzIGFsbG93ZWQsIGJ1dCB0aGUgb3B0aW9uIHZhbHVlcyBhc3NvY2lhdGVkCiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBpdCBkbyBhcHBseSBhcyBub3JtYWwuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSBhbHNvIHNvbWUgdXRpbGl0aWVzIGZvciBjaGVja2luZyBwYXNzd29yZHMKICAgICAgICAgICAgICAgICAgICAgICBpZiBbbGlzdF0gc3RhcnRzIHdpdGggdGhlICIlIiBjaGFyYWN0ZXIuICBTZWUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgcXVpY2tfcHcoKSBmdW5jdGlvbiBmb3IgbW9yZSBkZXRhaWxzLiAgRGVzY3JpcHRpb246CiAgICAgICAgICAgICAgICAgICAgICAgIiUtIiBvciAiJXN0ZGluIiBtZWFucyByZWFkIG9uZSBsaW5lIGZyb20gc3RkaW4uCiAgICAgICAgICAgICAgICAgICAgICAgIiVlbnYiIG1lYW5zIGl0IGlzIGluICRVTklYUFcgZW52IHZhci4gIEEgbGVhZGluZwogICAgICAgICAgICAgICAgICAgICAgICIlLyIgb3IgIiUuIiBtZWFucyByZWFkIHRoZSBmaXJzdCBsaW5lIGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUgdGhhdCBmb2xsb3dzIGFmdGVyIHRoZSAlIGNoYXJhY3Rlci4gJSBieQogICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZiBtZWFucyBwcm9tcHQgZm9yIHRoZSB1c2VybmFtZSBhbmQgcGFzc3dvcmQuCiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlOiAldXNlcjpwYXNzICAgRS5nLiAtdW5peHB3ICVmcmVkOnN3b3JkZmlzaAogICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGUgb3RoZXIgY2FzZXMgdXNlcjpwYXNzIGlzIHJlYWQgZnJvbSB0aGUgaW5kaWNhdGVkCiAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLiAgSWYgdGhlIHBhc3N3b3JkIGlzIGNvcnJlY3QgJ1kgdXNlcicgaXMgcHJpbnRlZAogICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgcHJvZ3JhbSBleGl0IGNvZGUgaXMgMC4gIElmIHRoZSBwYXNzd29yZCBpcwogICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdCBpdCBwcmludHMgJ04gdXNlcicgYW5kIHRoZSBleGl0IGNvZGUgaXMgMS4KICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBzb21lIG90aGVyIGVycm9yIHRoZSBleGl0IGNvZGUgaXMgMi4KICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGZlYXR1cmUgZW5hYmxlcyB4MTF2bmMgdG8gYmUgYSBnZW5lcmFsIHVuaXggdXNlcgogICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkIGNoZWNraW5nIHRvb2w7IGl0IGNvdWxkIGJlIHVzZWQgZnJvbSBzY3JpcHRzCiAgICAgICAgICAgICAgICAgICAgICAgb3Igb3RoZXIgcHJvZ3JhbXMuICBUaGVzZSAlIHBhc3N3b3JkIGNoZWNrcyBhbHNvIGFwcGx5CiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIC11bml4cHdfbmlzIGFuZCAtdW5peHB3X2NtZCBvcHRpb25zLgoKICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhlICUgcGFzc3dvcmQgY2hlY2ssIGlmIHRoZSBlbnYuIHZhci4gVU5JWFBXX0NNRAogICAgICAgICAgICAgICAgICAgICAgIGlzIHNldCB0byBhIGNvbW1hbmQgdGhlbiBpdCBpcyBydW4gYXMgdGhlIHVzZXIgKGFzc3VtaW5nCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhc3N3b3JkIGlzIGNvcnJlY3QuKSAgVGhlIG91dHB1dCBvZiB0aGUgY29tbWFuZCBpcwogICAgICAgICAgICAgICAgICAgICAgIG5vdCBwcmludGVkLCB0aGUgcHJvZ3JhbSBvciBzY3JpcHQgbXVzdCBtYW5hZ2UgdGhhdCBieQogICAgICAgICAgICAgICAgICAgICAgIHNvbWUgb3RoZXIgbWVhbnMuICBUaGUgZXhpdCBjb2RlIG9mIHgxMXZuYyB3aWxsIGRlcGVuZAogICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBleGl0IGNvZGUgb2YgdGhlIGNvbW1hbmQgdGhhdCBpcyBydW4uCgogICAgICAgICAgICAgICAgICAgICAgIFVzZSAtbm91bml4cHcgdG8gZGlzYWJsZSB1bml4cHcgbW9kZSBpZiBpdCB3YXMgZW5hYmxlZAogICAgICAgICAgICAgICAgICAgICAgIGVhcmxpZXIgaW4gdGhlIGNtZCBsaW5lIChlLmcuIC1zdmMgbW9kZSkKCi11bml4cHdfbmlzIFtsaXN0XSAgICAgQXMgLXVuaXhwdyBhYm92ZSwgaG93ZXZlciBkbyBub3QgdXNlIHN1KDEpIGJ1dCByYXRoZXIKICAgICAgICAgICAgICAgICAgICAgICB1c2UgdGhlIHRyYWRpdGlvbmFsIGdldHB3bmFtKDMpICsgY3J5cHQoMykgbWV0aG9kIHRvCiAgICAgICAgICAgICAgICAgICAgICAgdmVyaWZ5IHBhc3N3b3Jkcy4gQWxsIG9mIHRoZSBhYm92ZSAtdW5peHB3IG9wdGlvbnMgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludHMgYXBwbHkuCgogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbW9kZSByZXF1aXJlcyB0aGF0IHRoZSBlbmNyeXB0ZWQgcGFzc3dvcmRzIGJlCiAgICAgICAgICAgICAgICAgICAgICAgcmVhZGFibGUuICBFbmNyeXB0ZWQgcGFzc3dvcmRzIHN0b3JlZCBpbiAvZXRjL3NoYWRvdwogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW5hY2Nlc3NpYmxlIHVubGVzcyB4MTF2bmMgaXMgcnVuIGFzIHJvb3QuCgogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgY2FsbGVkICJOSVMiIG1vZGUgc2ltcGx5IGJlY2F1c2UgaW4gbW9zdAogICAgICAgICAgICAgICAgICAgICAgIE5JUyBzZXR1cHMgdXNlciBlbmNyeXB0ZWQgcGFzc3dvcmRzIGFyZSBhY2Nlc3NpYmxlCiAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gInlwY2F0IHBhc3N3ZCIpIGJ5IGFuIG9yZGluYXJ5IHVzZXIgYW5kIHNvIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICB1c2VyIGNhbiBhdXRoZW50aWNhdGUgQU5ZIHVzZXIuCgogICAgICAgICAgICAgICAgICAgICAgIE5JUyBpcyBub3QgcmVxdWlyZWQgZm9yIHRoaXMgbW9kZSB0byB3b3JrIChvbmx5IHRoYXQKICAgICAgICAgICAgICAgICAgICAgICBnZXRwd25hbSgzKSByZXR1cm4gdGhlIGVuY3J5cHRlZCBwYXNzd29yZCBpcyByZXF1aXJlZCksCiAgICAgICAgICAgICAgICAgICAgICAgYnV0IGl0IGlzIHVubGlrZWx5IGl0IHdpbGwgd29yayAoYXMgYW4gb3JkaW5hcnkgdXNlcikKICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9zdCBtb2Rlcm4gZW52aXJvbm1lbnRzIHVubGVzcyBOSVMgaXMgYXZhaWxhYmxlLgogICAgICAgICAgICAgICAgICAgICAgIE9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIHgxMXZuYyBpcyBydW4gYXMgcm9vdCBpdCB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgYmUgYWJsZSB0byB0byBhY2Nlc3MgL2V0Yy9zaGFkb3cgZXZlbiBpZiBOSVMgaXMgbm90CiAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIChub3RlIHJ1bm5pbmcgYXMgcm9vdCBpcyBvZnRlbiBkb25lIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIHgxMXZuYyBmcm9tIGluZXRkIGFuZCB4ZG0vZ2RtL2tkbSkuCgogICAgICAgICAgICAgICAgICAgICAgIExvb2tlZCBhdCBhbm90aGVyIHdheSwgaWYgeW91IGRvIG5vdCB3YW50IHRvIHVzZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICBzdSgxKSBtZXRob2QgcHJvdmlkZWQgYnkgLXVuaXhwdyAoaS5lLiBzdV92ZXJpZnkoKSksIHlvdQogICAgICAgICAgICAgICAgICAgICAgIGNhbiBydW4geDExdm5jIGFzIHJvb3QgYW5kIHVzZSAtdW5peHB3X25pcy4gIEFueSB1c2VycwogICAgICAgICAgICAgICAgICAgICAgIHdpdGggcGFzc3dvcmRzIGluIC9ldGMvc2hhZG93IGNhbiB0aGVuIGJlIGF1dGhlbnRpY2F0ZWQuCgogICAgICAgICAgICAgICAgICAgICAgIEluIC11bml4cHdfbmlzIG1vZGUsIHVuZGVyIG5vIGNpcmN1bXN0YW5jZXMgaXMgeDExdm5jJ3MKICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHBhc3N3b3JkIHZlcmlmeWluZyBmdW5jdGlvbiBiYXNlZCBvbiBzdSBjYWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiB0aGUgZnVuY3Rpb24gc3VfdmVyaWZ5KCkgdGhhdCBydW5zIC9iaW4vc3UKICAgICAgICAgICAgICAgICAgICAgICBpbiBhIHBzZXVkb3Rlcm1pbmFsIHRvIHZlcmlmeSBwYXNzd29yZHMuKSAgSG93ZXZlciwKICAgICAgICAgICAgICAgICAgICAgICBpZiAtdW5peHB3X25pcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIC1maW5kCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIC1jcmVhdGUgLWRpc3BsYXkgV0FJVDouLi4gbW9kZXMgdGhlbiwgaWYgeDExdm5jIGlzCiAgICAgICAgICAgICAgICAgICAgICAgcnVubmluZyBhcyByb290LCAvYmluL3N1IG1heSBiZSBjYWxsZWQgZXh0ZXJuYWxseSB0bwogICAgICAgICAgICAgICAgICAgICAgIHJ1biB0aGUgZmluZCBvciBjcmVhdGUgY29tbWFuZHMuCgotdW5peHB3X2NtZCBjbWQgICAgICAgIEFzIC11bml4cHcgYWJvdmUsIGhvd2V2ZXIgZG8gbm90IHVzZSBzdSgxKSBidXQgcmF0aGVyCiAgICAgICAgICAgICAgICAgICAgICAgcnVuIHRoZSBleHRlcm5hbGx5IHN1cHBsaWVkIGNvbW1hbmQgImNtZCIuICBUaGUgZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICBsaW5lIG9mIGl0cyBzdGRpbiB3aWxsIGJlIHRoZSB1c2VybmFtZSBhbmQgdGhlIHNlY29uZAogICAgICAgICAgICAgICAgICAgICAgIGxpbmUgdGhlIHJlY2VpdmVkIHBhc3N3b3JkLiAgSWYgdGhlIGNvbW1hbmQgZXhpdHMKICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHN0YXR1cyAwIChzdWNjZXNzKSB0aGUgVk5DIHVzZXIgd2lsbCBiZSBhY2NlcHRlZC4KICAgICAgICAgICAgICAgICAgICAgICBJdCB3aWxsIGJlIHJlamVjdGVkIGZvciBhbnkgb3RoZXIgcmV0dXJuIHN0YXR1cy4KCiAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pYyBwYXNzd29yZHMgYW5kIG5vbi11bml4IHBhc3N3b3JkcywgZS5nLiBMREFQLAogICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBpbXBsZW1lbnRlZCB0aGlzIHdheSBieSBwcm92aWRpbmcgeW91ciBvd24gY3VzdG9tCiAgICAgICAgICAgICAgICAgICAgICAgaGVscGVyIHByb2dyYW0uICBOb3RlIHRoYXQgdGhlIHJlbW90ZSB2aWV3ZXIgaXMgZ2l2ZW4gMwogICAgICAgICAgICAgICAgICAgICAgIHRyaWVzIHRvIGVudGVyIHRoZSBjb3JyZWN0IHBhc3N3b3JkLCBhbmQgc28gdGhlIHByb2dyYW0KICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgY2FsbGVkIGluIGEgcm93IHRoYXQgbWFueSAob3IgbW9yZSkgdGltZXMuCgogICAgICAgICAgICAgICAgICAgICAgIElmIGEgbGlzdCBvZiBhbGxvd2VkIHVzZXJzIGlzIG5lZWRlZCB0byBsaW1pdCB3aG8gY2FuCiAgICAgICAgICAgICAgICAgICAgICAgbG9nIGluLCB1c2UgLXVuaXhwdyBbbGlzdF0gaW4gYWRkaXRpb24gdG8gdGhpcyBvcHRpb24uCgogICAgICAgICAgICAgICAgICAgICAgIEluIEZJTkRESVNQTEFZIGFuZCBGSU5EQ1JFQVRFRElTUExBWSBtb2RlcyB0aGUgImNtZCIKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGFsc28gYmUgcnVuIHdpdGggdGhlIFJGQl9VTklYUFdfQ01EX1JVTiBlbnYuIHZhci4KICAgICAgICAgICAgICAgICAgICAgICBub24tZW1wdHkgYW5kIHNldCB0byB0aGUgY29ycmVzcG9uZGluZyBkaXNwbGF5CiAgICAgICAgICAgICAgICAgICAgICAgZmluZC9jcmVhdGUgY29tbWFuZC4gIFRoZSBmaXJzdCB0d28gbGluZXMgb2YgaW5wdXQgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXJuYW1lIGFuZCBwYXNzd2QgYXMgaW4gdGhlIG5vcm1hbCBjYXNlIGRlc2NyaWJlZAogICAgICAgICAgICAgICAgICAgICAgIGFib3ZlLiAgVG8gc3VwcG9ydCBGSU5ERElTUExBWSBhbmQgRklORENSRUFURURJU1BMQVksCiAgICAgICAgICAgICAgICAgICAgICAgImNtZCIgc2hvdWxkIHJ1biB0aGUgcmVxdWVzdGVkIGNvbW1hbmQgYXMgdGhlIHVzZXIKICAgICAgICAgICAgICAgICAgICAgICAoYW5kIG1vc3QgbGlrZWx5IHJlZnVzaW5nIHRvIHJ1biBpdCBpZiB0aGUgcGFzc3dvcmQgaXMKICAgICAgICAgICAgICAgICAgICAgICBub3QgY29ycmVjdC4pICBIZXJlIGlzIGFuIGV4YW1wbGUgc2NyaXB0IChub3RlIGl0IGhhcwogICAgICAgICAgICAgICAgICAgICAgIGEgaGFyZHdpcmVkIGJvZ3VzIHBhc3N3b3JkICJhYmMiISkKCiAgICAgICAgICAgICAgICAgICAgICAgICAjIS9iaW4vc2gKICAgICAgICAgICAgICAgICAgICAgICAgICMgRXhhbXBsZSB4MTF2bmMgLXVuaXhwd19jbWQgc2NyaXB0LgogICAgICAgICAgICAgICAgICAgICAgICAgIyBSZWFkIHRoZSBmaXJzdCB0d28gbGluZXMgb2Ygc3RkaW4gKHVzZXIgYW5kIHBhc3N3ZCkKICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgdXNlcgogICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCBwYXNzCgogICAgICAgICAgICAgICAgICAgICAgICAgZGVidWc9MAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgWyAkZGVidWcgPSAxIF07IHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlY2hvICJ1c2VyOiAkdXNlciIgMT4mMgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVjaG8gInBhc3M6ICRwYXNzIiAxPiYyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52IHwgZWdyZXAgLWkgJ3JmYnx2bmMnIDE+JjIKICAgICAgICAgICAgICAgICAgICAgICAgIGZpCgogICAgICAgICAgICAgICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgcGFzc3dvcmQgaXMgdmFsaWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAjIChBIHJlYWwgZXhhbXBsZSB3b3VsZCB1c2UgbGRhcCBsb29rdXAsIGV0YyEpCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBbICJYJHBhc3MiICE9ICJYYWJjIiBdOyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpdCAxICAjIGluY29ycmVjdCBwYXNzd29yZAogICAgICAgICAgICAgICAgICAgICAgICAgZmkKCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiBbICJYJFJGQl9VTklYUFdfQ01EX1JVTiIgPSAiWCIgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQgMCAgIyBjb3JyZWN0IHBhc3N3b3JkCiAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBSdW4gdGhlIHJlcXVlc3RlZCBjb21tYW5kIChmaW5kZGlzcGxheSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBbICRkZWJ1ZyA9IDEgXTsgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNobyAicnVuOiAkUkZCX1VOSVhQV19DTURfUlVOIiAxPiYyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGVjIC9iaW4vc3UgLSAiJHVzZXIiIC1jICIkUkZCX1VOSVhQV19DTURfUlVOIgogICAgICAgICAgICAgICAgICAgICAgICAgZmkKCiAgICAgICAgICAgICAgICAgICAgICAgSW4gLXVuaXhwd19jbWQgbW9kZSwgdW5kZXIgbm8gY2lyY3Vtc3RhbmNlcyBpcyB4MTF2bmMncwogICAgICAgICAgICAgICAgICAgICAgIHVzZXIgcGFzc3dvcmQgdmVyaWZ5aW5nIGZ1bmN0aW9uIGJhc2VkIG9uIHN1IGNhbGxlZAogICAgICAgICAgICAgICAgICAgICAgIChpLmUuIHRoZSBmdW5jdGlvbiBzdV92ZXJpZnkoKSB0aGF0IHJ1bnMgL2Jpbi9zdSBpbiBhCiAgICAgICAgICAgICAgICAgICAgICAgcHNldWRvdGVybWluYWwgdG8gdmVyaWZ5IHBhc3N3b3Jkcy4pICBJdCBpcyB1cCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCB1bml4cHdfY21kIHRvIGRvIHVzZXIgc3dpdGNoaW5nIGlmIGRlc2lyZWQKICAgICAgICAgICAgICAgICAgICAgICBhbmQgaWYgaXQgaGFzIHRoZSBwZXJtaXNzaW9ucyB0byBkbyBzby4KCi1maW5kICAgICAgICAgICAgICAgICAgRmluZCB0aGUgdXNlcidzIGRpc3BsYXkgdXNpbmcgRklORERJU1BMQVkuIFRoaXMKICAgICAgICAgICAgICAgICAgICAgICBpcyBhbiBhbGlhcyBmb3IgIi1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRESVNQTEFZIi4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogaWYgYSAtZGlzcGxheSBvY2N1cnMgbGF0ZXIgb24gdGhlIGNvbW1hbmQgbGluZQogICAgICAgICAgICAgICAgICAgICAgIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIC1maW5kIHNldHRpbmcuCgogICAgICAgICAgICAgICAgICAgICAgIEZvciB0aGlzIGFuZCB0aGUgbmV4dCBmZXcgb3B0aW9ucyBzZWUgLWRpc3BsYXkgV0FJVDouLi4KICAgICAgICAgICAgICAgICAgICAgICBiZWxvdyBmb3IgYWxsIG9mIHRoZSBkZXRhaWxzLgoKLWZpbmRkcHkgICAgICAgICAgICAgICBSdW4gdGhlIEZJTkRESVNQTEFZIHByb2dyYW0sIHByaW50IG91dCB0aGUgZm91bmQKICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IChpZiBhbnkpIGFuZCBleGl0LiAgT3V0cHV0IGlzIGxpa2U6IERJU1BMQVk9OjAuMAogICAgICAgICAgICAgICAgICAgICAgIERJU1BMQVk9OjAuMCxYUElEPTEyMzQ1IG9yIERJU1BMQVk9OjAuMCxWVD03LiAgWFBJRCBpcwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBwcm9jZXNzIElEIG9mIHRoZSBmb3VuZCBYIHNlcnZlci4gIFZUIGlzIHRoZSBMaW51eAogICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgdGVybWluYWwgb2YgdGhlIFggc2VydmVyLgotbGlzdGRweSAgICAgICAgICAgICAgIEhhdmUgdGhlIEZJTkRESVNQTEFZIHByb2dyYW0gbGlzdCBhbGwgb2YgeW91ciBkaXNwbGF5cwogICAgICAgICAgICAgICAgICAgICAgIChpLmUuIGFsbCB0aGUgWCBkaXNwbGF5cyBvbiB0aGUgbG9jYWwgbWFjaGluZSB0aGF0IHlvdQogICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYWNjZXNzIHJpZ2h0cyB0bykuICB4MTF2bmMgdGhlbiBleGl0cy4KCi1maW5kYXV0aCBbZGlzcF0gICAgICAgQXBwbHkgdGhlIC1maW5kLy1maW5kZHB5IGhldXJpc3RpY3MgdG8gdHJ5IHRvIGd1ZXNzCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIFhBVVRIT1JJVFkgZmlsZSBmb3IgRElTUExBWSAnZGlzcCcuICBJZiAnZGlzcCcKICAgICAgICAgICAgICAgICAgICAgICBpcyBub3Qgc3VwcGxpZWQsIHRoZW4gdGhlIHZhbHVlIGluIHRoZSAtZGlzcGxheSBvbgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBjbWRsaW5lIGlzIHVzZWQ7IGZhaWxpbmcgdGhhdCAkRElTUExBWSBpcyB1c2VkOwogICAgICAgICAgICAgICAgICAgICAgIGFuZCBmYWlsaW5nIHRoYXQgIjowIiBpcyB1c2VkLiAgeDExdm5jIHRoZW4gZXhpdHMuCgogICAgICAgICAgICAgICAgICAgICAgIElmIG5vdGhpbmcgaXMgcHJpbnRlZCBvdXQsIHRoYXQgbWVhbnMgbm8gWEFVVEhPUklUWSB3YXMKICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCBmb3IgJ2Rpc3AnOyBpLmUuIGZhaWx1cmUuICBJZiAiWEFVVEhPUklUWT0iCiAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJpbnRlZCBvdXQsIHRoYXQgbWVhbnMgdXNlIHRoZSBkZWZhdWx0IChpLmUuIGRvCiAgICAgICAgICAgICAgICAgICAgICAgbm90IHNldCBYQVVUSE9SSVRZKS4gIElmICJYQVVUSE9SSVRZPS9wYXRoL3RvL2ZpbGUiCiAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJpbnRlZCBvdXQsIHRoZW4gdXNlIHRoYXQgZmlsZS4KCiAgICAgICAgICAgICAgICAgICAgICAgWERNL0dETS9LRE06IGlmIHlvdSBhcmUgcnVubmluZyB4MTF2bmMgYXMgcm9vdCBhbmQgd2FudAogICAgICAgICAgICAgICAgICAgICAgIHRvIGZpbmQgdGhlIFhBVVRIT1JJVFkgYmVmb3JlIGFueW9uZSBoYXMgbG9nZ2VkIGludG8gYW4KICAgICAgICAgICAgICAgICAgICAgICBYIHNlc3Npb24geWV0LCB1c2U6IHgxMXZuYyAtZW52IEZEX1hETT0xIC1maW5kYXV0aCAuLi4KICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyB3aWxsIGFsc28gZmluZCB0aGUgWEFVVEhPUklUWSBpZiBhIHVzZXIgaXMgYWxyZWFkeQogICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlZCBpbnRvIHRoZSBYIHNlc3Npb24uKSAgV2hlbiBydW5uaW5nIGFzIHJvb3QsCiAgICAgICAgICAgICAgICAgICAgICAgRkRfWERNPTEgd2lsbCBiZSB0cmllZCBpZiB0aGUgaW5pdGlhbCAtZmluZGF1dGggZmFpbHMuCgotY3JlYXRlICAgICAgICAgICAgICAgIEZpcnN0IHRyeSB0byBmaW5kIHRoZSB1c2VyJ3MgZGlzcGxheSB1c2luZyBGSU5ERElTUExBWSwKICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGF0IGRvZXNuJ3Qgc3VjY2VlZCBjcmVhdGUgYW4gWCBzZXNzaW9uIHZpYSB0aGUKICAgICAgICAgICAgICAgICAgICAgICBGSU5EQ1JFQVRFRElTUExBWSBtZXRob2QuICBUaGlzIGlzIGFuIGFsaWFzIGZvcgogICAgICAgICAgICAgICAgICAgICAgICItZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS1YdmZiIi4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogaWYgYSAtZGlzcGxheSBvY2N1cnMgbGF0ZXIgb24gdGhlIGNvbW1hbmQgbGluZQogICAgICAgICAgICAgICAgICAgICAgIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIC1jcmVhdGUgc2V0dGluZy4KCiAgICAgICAgICAgICAgICAgICAgICAgU1NIIE5PVEU6IGZvciBib3RoIC1maW5kIGFuZCAtY3JlYXRlIHlvdSBjYW4gKHNob3VsZCEpCiAgICAgICAgICAgICAgICAgICAgICAgYWRkIHRoZSAiLWxvY2FsaG9zdCIgb3B0aW9uIHRvIGZvcmNlIFNTSCB0dW5uZWwgYWNjZXNzLgoKLXhkdW1teSAgICAgICAgICAgICAgICBBcyBpbiAtY3JlYXRlLCBleGNlcHQgWGR1bW15IGluc3RlYWQgb2YgWHZmYi4KLXh2bmMgICAgICAgICAgICAgICAgICBBcyBpbiAtY3JlYXRlLCBleGNlcHQgWHZuYyBpbnN0ZWFkIG9mIFh2ZmIuCi14dm5jX3JlZGlyZWN0ICAgICAgICAgQXMgaW4gLWNyZWF0ZSwgZXhjZXB0IFh2bmMucmVkaXJlY3QgaW5zdGVhZCBvZiBYdmZiLgoteGR1bW15X3h2ZmIgICAgICAgICAgIFNldHMgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktWGR1bW15LFh2ZmIKCi1jcmVhdGVfeHNydiBzdHIgICAgICAgU2V0cyBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS08c3RyPiAgQ2FuIGJlIG9uIGNtZGxpbmUKICAgICAgICAgICAgICAgICAgICAgICBhZnRlciBhbnl0aGluZyB0aGF0IHNldHMgV0FJVDouLiBhbmQgb3RoZXIgdGhpbmdzCiAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gLXN2YywgLXhkbXN2YykgdG8gYWRqdXN0IHRoZSBYIHNlcnZlciBsaXN0LgogICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6IC1zdmMgLi4uIC1jcmVhdGVfeHNydiBYZHVtbXksWAoKLXN2YyAgICAgICAgICAgICAgICAgICBUZXJtaW5hbCBzZXJ2aWNlcyBtb2RlIGJhc2VkIG9uIFNTTCBhY2Nlc3MuICBBbGlhcyBmb3IKICAgICAgICAgICAgICAgICAgICAgICAtZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS1YdmZiIC11bml4cHcgLXVzZXJzCiAgICAgICAgICAgICAgICAgICAgICAgdW5peHB3PSAtc3NsIFNBVkUgICBBbHNvICItc2VydmljZSIuCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IGlmIGEgLWRpc3BsYXksIC11bml4cHcsIC11c2Vycywgb3IgLXNzbCBvY2N1cnMKICAgICAgICAgICAgICAgICAgICAgICBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIC1zdmMKICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLgoKLXN2Y194ZHVtbXkgICAgICAgICAgICBBcyAtc3ZjIGV4Y2VwdCBYZHVtbXkgaW5zdGVhZCBvZiBYdmZiLgotc3ZjX3h2bmMgICAgICAgICAgICAgIEFzIC1zdmMgZXhjZXB0IFh2bmMgaW5zdGVhZCBvZiBYdmZiLgotc3ZjX3hkdW1teV94dmZiICAgICAgIEFzIC1zdmMgd2l0aCBYZHVtbXksWHZmYi4KCi14ZG1zdmMgICAgICAgICAgICAgICAgRGlzcGxheSBtYW5hZ2VyIFRlcm1pbmFsIHNlcnZpY2VzIG1vZGUgYmFzZWQgb24gU1NMLgogICAgICAgICAgICAgICAgICAgICAgIEFsaWFzIGZvciAtZGlzcGxheSBXQUlUOmNtZD1GSU5EQ1JFQVRFRElTUExBWS1YdmZiLnhkbWNwCiAgICAgICAgICAgICAgICAgICAgICAgLXVuaXhwdyAtdXNlcnMgdW5peHB3PSAtc3NsIFNBVkUgIEFsc28gIi14ZG1fc2VydmljZSIuCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IGlmIGEgLWRpc3BsYXksIC11bml4cHcsIC11c2Vycywgb3IgLXNzbCBvY2N1cnMKICAgICAgICAgICAgICAgICAgICAgICBsYXRlciBvbiB0aGUgY29tbWFuZCBsaW5lIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIC14ZG1zdmMKICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyBjcmVhdGUgYSBzZXNzaW9uIGEgdXNlciB3aWxsIGhhdmUgdG8gZmlyc3QgbG9nIGluCiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIC11bml4cHcgZGlhbG9nIGFuZCB0aGVuIGxvZyBpbiBhZ2FpbiB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICBYRE0vR0RNL0tETSBwcm9tcHQuICBTdWJzZXF1ZW50IHJlLWNvbm5lY3Rpb25zIHdpbGwKICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHJlcXVpcmUgdGhlIC11bml4cHcgcGFzc3dvcmQuICBTZWUgdGhlIGRpc2N1c3Npb24KICAgICAgICAgICAgICAgICAgICAgICB1bmRlciAtZGlzcGxheSBXQUlUOi4uLiBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IFhETSwKICAgICAgICAgICAgICAgICAgICAgICBldGMgY29uZmlndXJhdGlvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgUmVtZW1iZXIgdG8gZW5hYmxlIFhETUNQIGluIHRoZSB4ZG0tY29uZmlnLCBnZG0uY29uZiwKICAgICAgICAgICAgICAgICAgICAgICBvciBrZG1yYyBjb25maWd1cmF0aW9uIGZpbGUuICBTZWUgLWRpc3BsYXkgV0FJVDogZm9yCiAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBpbmZvLgoKLXNzaHhkbXN2YyAgICAgICAgICAgICBEaXNwbGF5IG1hbmFnZXIgVGVybWluYWwgc2VydmljZXMgbW9kZSBiYXNlZCBvbiBTU0guCiAgICAgICAgICAgICAgICAgICAgICAgQWxpYXMgZm9yIC1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVh2ZmIueGRtY3AKICAgICAgICAgICAgICAgICAgICAgICAtbG9jYWxob3N0LgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgLWxvY2FsaG9zdCBvcHRpb24gY29uc3RyYWlucyBjb25uZWN0aW9ucyB0byBjb21lCiAgICAgICAgICAgICAgICAgICAgICAgaW4gdmlhIGEgU1NIIHR1bm5lbCAod2hpY2ggd2lsbCByZXF1aXJlIGEgbG9naW4pLgogICAgICAgICAgICAgICAgICAgICAgIFRvIGNyZWF0ZSBhIHNlc3Npb24gYSB1c2VyIHdpbGwgYWxzbyBoYXZlIHRvIGxvZyBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIFhETSBHRE0gS0RNIHByb21wdC4gU3Vic2VxdWVudCByZS1jb25uZWN0aW9ucyB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgb25seSBvbmx5IHJlcXVpcmUgdGhlIFNTSCBsb2dpbi4gIFNlZSB0aGUgZGlzY3Vzc2lvbgogICAgICAgICAgICAgICAgICAgICAgIHVuZGVyIC1kaXNwbGF5IFdBSVQ6Li4uIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgWERNLAogICAgICAgICAgICAgICAgICAgICAgIGV0YyBjb25maWd1cmF0aW9uLgoKICAgICAgICAgICAgICAgICAgICAgICBSZW1lbWJlciB0byBlbmFibGUgWERNQ1AgaW4gdGhlIHhkbS1jb25maWcsIGdkbS5jb25mLAogICAgICAgICAgICAgICAgICAgICAgIG9yIGtkbXJjIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFNlZSAtZGlzcGxheSBXQUlUOiBmb3IKICAgICAgICAgICAgICAgICAgICAgICBtb3JlIGluZm8uCgotdW5peHB3X3N5c3RlbV9ncmVldGVyIFByZXNlbnQgYSAiUHJlc3MgJ0VzY2FwZScgZm9yIFN5c3RlbSBHcmVldGVyIiBvcHRpb24KICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY29ubmVjdGluZyBWTkMgY2xpZW50IGluIGNvbWJpbmVkIC11bml4cHcKICAgICAgICAgICAgICAgICAgICAgICBhbmQgeGRtY3AgRklORENSRUFURURJU1BMQVkgbW9kZXMgKGUuZy4gLXhkbXN2YykuCgogICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGx5IGluIGEgLXVuaXhwdyBtb2RlIHRoZSBWTkMgY2xpZW50IG11c3QKICAgICAgICAgICAgICAgICAgICAgICBzdXBwbHkgYSB2YWxpZCB1c2VybmFtZSBhbmQgcGFzc3dvcmQgdG8gZ2FpbiBhY2Nlc3MuCiAgICAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgaWYgLXVuaXhwd19zeXN0ZW1fZ3JlZXRlciBpcyBzdXBwbGllZCBBTkQKICAgICAgICAgICAgICAgICAgICAgICB0aGUgRklORENSRUFURURJU1BMQVkgY29tbWFuZCBtYXRjaGVzICd4ZG1jcCcsIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNlciBoYXMgdGhlIG9wdGlvbiB0byBwcmVzcyBFc2NhcGUgYW5kIHRoZW4gZ2V0IGEKICAgICAgICAgICAgICAgICAgICAgICBYRE0vR0RNL0tETSBsb2dpbi9ncmVldGVyIHBhbmVsIGluc3RlYWQuIFRoZXkgd2lsbCB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgc3VwcGx5IGEgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGRpcmVjdGx5IHRvIHRoZSBncmVldGVyLgoKICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIGluIHhkbWNwIEZJTkRDUkVBVEVESVNQTEFZIG1vZGUgdGhlIHVzZXIKICAgICAgICAgICAgICAgICAgICAgICBtdXN0IHN1cHBseSBoaXMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIFRXSUNFLiAgRmlyc3QgdG8KICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5pdGlhbCB1bml4cHcgbG9naW4gZGlhbG9nLCBhbmQgc2Vjb25kIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHN1YnNlcXVlbnQgWERNL0dETS9LRE0gZ3JlZXRlci4gIE5vdGUgdGhhdCBpZiB0aGUgdXNlcgogICAgICAgICAgICAgICAgICAgICAgIHJlLWNvbm5lY3RzIGFuZCBzdXBwbGllcyBoaXMgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGluCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVuaXhwdyBkaWFsb2cgdGhlIHhkbWNwIGdyZWV0ZXIgaXMgc2tpcHBlZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICBoZSBpcyBjb25uZWN0ZWQgZGlyZWN0bHkgdG8gaGlzIGV4aXN0aW5nIFggc2Vzc2lvbi4KICAgICAgICAgICAgICAgICAgICAgICBTbyB0aGUgLXVuaXhwd19zeXN0ZW1fZ3JlZXRlciBvcHRpb24gYXZvaWRzIHRoZSBleHRyYQogICAgICAgICAgICAgICAgICAgICAgIHBhc3N3b3JkIGF0IFggc2Vzc2lvbiBjcmVhdGlvbiB0aW1lLgoKICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiAgeDExdm5jIC14ZG1zdmMgLXVuaXhwd19zeXN0ZW1fZ3JlZXRlcgogICAgICAgICAgICAgICAgICAgICAgIFNlZSAtdW5peHB3IGFuZCAtZGlzcGxheSBXQUlUOi4uLiBmb3IgbW9yZSBpbmZvLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3BlY2lhbCBvcHRpb25zIGFmdGVyIGEgY29sb24gYXQgdGhlIGVuZCBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSAoZS5nLiB1c2VyOnNvbGlkKSBkZXNjcmliZWQgdW5kZXIgLWRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICBXQUlUOiBhcmUgYWxzbyBhcHBsaWVkIGluIHRoaXMgbW9kZSBpZiB0aGV5IGFyZSB0eXBlZAogICAgICAgICAgICAgICAgICAgICAgIGluIGJlZm9yZSB0aGUgdXNlciBoaXRzIEVzY2FwZS4gIFRoZSB1c2VybmFtZSBpcyBpZ25vcmVkCiAgICAgICAgICAgICAgICAgICAgICAgYnV0IHRoZSBjb2xvbiBvcHRpb25zIGFyZSBub3QuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IG1lc3NhZ2UgaXMgMiBsaW5lcyBpbiBhIHNtYWxsIGZvbnQsIHNldAogICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnYuIHZhci4gWDExVk5DX1NZU1RFTV9HUkVFVEVSMT10cnVlIGZvciBhIDEgbGluZQogICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgaW4gYSBsYXJnZXIgZm9udC4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHVzZXIgcHJlc3NlZCBFc2NhcGUgdGhlIEZJTkRDUkVBVEVESVNQTEFZIGNvbW1hbmQKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJ1biB3aXRoIHRoZSBlbnYuIHZhci4gWDExVk5DX1hETV9PTkxZPTEuCgogICAgICAgICAgICAgICAgICAgICAgIFJlbWVtYmVyIHRvIGVuYWJsZSBYRE1DUCBpbiB0aGUgeGRtLWNvbmZpZywgZ2RtLmNvbmYsCiAgICAgICAgICAgICAgICAgICAgICAgb3Iga2RtcmMgY29uZmlndXJhdGlvbiBmaWxlLiAgU2VlIC1kaXNwbGF5IFdBSVQ6IGZvcgogICAgICAgICAgICAgICAgICAgICAgIG1vcmUgaW5mby4KCi1yZWRpcmVjdCBwb3J0ICAgICAgICAgQXMgaW4gRklORENSRUFURURJU1BMQVktWHZuYy5yZWRpcmVjdCBtb2RlIGV4Y2VwdAogICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0IGltbWVkaWF0ZWx5IChpLmUuIHdpdGhvdXQgWCBzZXNzaW9uIGZpbmRpbmcKICAgICAgICAgICAgICAgICAgICAgICBvciBjcmVhdGlvbikgdG8gYSBWTkMgc2VydmVyIGxpc3RlbmluZyBvbiBwb3J0LiBZb3UKICAgICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBzdXBwbHkgaG9zdDpwb3J0IHRvIHJlZGlyZWN0IHRvIGEgZGlmZmVyZW50CiAgICAgICAgICAgICAgICAgICAgICAgbWFjaGluZS4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgMCA8PSBwb3J0IDwgMjAwIGl0IGlzIHRha2VuIGFzIGEgVk5DIGRpc3BsYXkgKDU5MDAgaXMKICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCB0byBnZXQgdGhlIGFjdHVhbCBwb3J0KSwgaWYgcG9ydCA8IDAgdGhlbiAtcG9ydAogICAgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQuCgogICAgICAgICAgICAgICAgICAgICAgIFByb2JhYmx5IHRoZSBvbmx5IHJlYXNvbiB0byB1c2UgdGhlIC1yZWRpcmVjdCBvcHRpb24KICAgICAgICAgICAgICAgICAgICAgICBpcyBpbiBjb25qdW5jdGlvbiB3aXRoIFNTTCBzdXBwb3J0LCBlLmcuIC1zc2wgU0FWRS4KICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHByb3ZpZGVzIGFuIGVhc3kgd2F5IHRvIGFkZCBTU0wgZW5jcnlwdGlvbiB0byBhIFZOQwogICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciB0aGF0IGRvZXMgbm90IHN1cHBvcnQgU1NMIChlLmcuIFh2bmMgb3Igdm5jLnNvKQogICAgICAgICAgICAgICAgICAgICAgIEluIGZhY3QsIHRoZSBwcm90b2NvbCBkb2VzIG5vdCBldmVuIG5lZWQgdG8gYmUgVk5DLAogICAgICAgICAgICAgICAgICAgICAgIGFuZCBzbyAiLXJmYnBvcnQgcG9ydDEgLXNzbCBTQVZFIC1yZWRpcmVjdCBob3N0OnBvcnQyIgogICAgICAgICAgICAgICAgICAgICAgIGNhbiBhY3QgYXMgYSByZXBsYWNlbWVudCBmb3Igc3R1bm5lbCgxKS4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIG9ubHkgYWxsb3dzIG9uZSByZWRpcmVjdGVkIGNvbm5lY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIC1mb3JldmVyIG9wdGlvbiBkb2VzIG5vdCBhcHBseS4gIFVzZSAtaW5ldGQgb3IKICAgICAgICAgICAgICAgICAgICAgICAtbG9vcCBmb3IgcGVyc2lzdGVudCBzZXJ2aWNlLgoKLWRpc3BsYXlfV0FJVCA6Li4uICAgICAgQSBzcGVjaWFsIHVzYWdlIG1vZGUgZm9yIHRoZSBub3JtYWwgLWRpc3BsYXkgb3B0aW9uLgogICAgICAgICAgICAgICAgICAgICAgIFVzZWZ1bCB3aXRoIC11bml4cHcsIGJ1dCBjYW4gYmUgdXNlZCBpbmRlcGVuZGVudGx5CiAgICAgICAgICAgICAgICAgICAgICAgb2YgaXQuICBJZiB0aGUgZGlzcGxheSBzdHJpbmcgYmVnaW5zIHdpdGggV0FJVDogdGhlbgogICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyB3YWl0cyB1bnRpbCBhIFZOQyBjbGllbnQgY29ubmVjdHMgYmVmb3JlIG9wZW5pbmcKICAgICAgICAgICAgICAgICAgICAgICB0aGUgWCBkaXNwbGF5IChvciAtcmF3ZmIgZGV2aWNlKS4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb3VsZCBiZSB1c2VmdWwgZm9yIGRlbGF5aW5nIG9wZW5pbmcgdGhlIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICBmb3IgY2VydGFpbiB1c2FnZSBtb2RlcyAoc2F5IGlmIHgxMXZuYyBpcyBzdGFydGVkIGF0CiAgICAgICAgICAgICAgICAgICAgICAgYm9vdCB0aW1lIGFuZCBubyBYIHNlcnZlciBpcyBydW5uaW5nIG9yIHVzZXJzIGxvZ2dlZAogICAgICAgICAgICAgICAgICAgICAgIGluIHlldCkuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzdHJpbmcgaXMsIGUuZy4gV0FJVDowLjAgb3IgV0FJVDoxLCBpLmUuICJXQUlUIgogICAgICAgICAgICAgICAgICAgICAgIGluIGZyb250IG9mIGEgbm9ybWFsIFggZGlzcGxheSwgdGhlbiB0aGF0IGluZGljYXRlZAogICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgaXMgdXNlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgT25lIGNhbiBhbHNvIGluc2VydCBhIGdlb21ldHJ5IGJldHdlZW4gY29sb25zLCBlLmcuCiAgICAgICAgICAgICAgICAgICAgICAgV0FJVDoxMjgweDEwMjQ6Li4uIHRvIHNldCB0aGUgc2l6ZSBvZiB0aGUgZGlzcGxheSB0aGUKICAgICAgICAgICAgICAgICAgICAgICBWTkMgY2xpZW50IGZpcnN0IGF0dGFjaGVzIHRvIHNpbmNlIHNvbWUgVk5DIHZpZXdlcnMKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIG5vdCBhdXRvbWF0aWNhbGx5IGFkanVzdCB0byBhIG5ldyBmcmFtZWJ1ZmZlciBzaXplLgoKICAgICAgICAgICAgICAgICAgICAgICBBIG1vcmUgaW50ZXJlc3RpbmcgY2FzZSBpcyBsaWtlIHRoaXM6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FJVDpjbWQ9L3Vzci9sb2NhbC9iaW4vZmluZF9kaXNwbGF5CgogICAgICAgICAgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgdGhlIGNvbW1hbmQgYWZ0ZXIgImNtZD0iIGlzIHJ1biB0bwogICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNhbGx5IHdvcmsgb3V0IHRoZSBESVNQTEFZIGFuZCBvcHRpb25hbGx5IHRoZQogICAgICAgICAgICAgICAgICAgICAgIFhBVVRIT1JJVFkgZGF0YS4gIFRoZSBmaXJzdCBsaW5lIG9mIHRoZSBjb21tYW5kIG91dHB1dAogICAgICAgICAgICAgICAgICAgICAgIG11c3QgYmUgb2YgdGhlIGZvcm0gRElTUExBWT08eGRpc3BsYXk+LiAgT24gTGludXgKICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgdmlydHVhbCB0ZXJtaW5hbCBpcyBrbm93biBhcHBlbmQgIixWVD1uIiB0bwogICAgICAgICAgICAgICAgICAgICAgIHRoaXMgc3RyaW5nIGFuZCB0aGUgY2h2dCgxKSBwcm9ncmFtIHdpbGwgYWxzbyBiZSBydW4uCiAgICAgICAgICAgICAgICAgICAgICAgQW55IHJlbWFpbmluZyBvdXRwdXQgaXMgdGFrZW4gYXMgWEFVVEhPUklUWSBkYXRhLgogICAgICAgICAgICAgICAgICAgICAgIEl0IGNhbiBiZSBlaXRoZXIgb2YgdGhlIGZvcm0gWEFVVEhPUklUWT08ZmlsZT4gb3IgcmF3CiAgICAgICAgICAgICAgICAgICAgICAgeGF1dGhvcml0eSBkYXRhIGZvciB0aGUgZGlzcGxheS4gRm9yIGV4YW1wbGU7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgeGF1dGggZXh0cmFjdCAtICRESVNQTEFZIgoKICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBBcyBzcGVjaWZpZWQgaW4gdGhlIHByZXZpb3VzIHBhcmFncmFwaCwgeW91IGNhbgogICAgICAgICAgICAgICAgICAgICAgIHN1cHBseSB5b3VyIG93biBXQUlUOmNtZD0uLi4gcHJvZ3JhbSBvciBzY3JpcHQsIEJVVAogICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGFyZSB0d28gdmVyeSB1c2VmdWwgKkJVSUxULUlOKiBvbmVzOiBGSU5ERElTUExBWQogICAgICAgICAgICAgICAgICAgICAgIChhbGlhcyAtZmluZCBhYm92ZSkgYW5kIEZJTkRDUkVBVEVESVNQTEFZIChhbGlhcyAtY3JlYXRlCiAgICAgICAgICAgICAgICAgICAgICAgYWJvdmUuKSAgTW9zdCBwZW9wbGUgdXNlIHRoZXNlIGluc3RlYWQgb2YgY3JlYXRpbmcKICAgICAgICAgICAgICAgICAgICAgICB0aGVpciBvd24gc2NyaXB0LiAgUmVhZCB0aGUgZm9sbG93aW5nIChlc3BlY2lhbGx5IHRoZQogICAgICAgICAgICAgICAgICAgICAgIEJVSUxULUlOIG1vZGVzIHNlY3Rpb25zKSB0byBzZWUgaG93IHRvIGNvbmZpZ3VyZSB0aGVzZQogICAgICAgICAgICAgICAgICAgICAgIHR3byB1c2VmdWwgYnVpbHRpbiAtZGlzcGxheSBXQUlUOiBtb2Rlcy4KCiAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhlIGNhc2Ugb2YgLXVuaXhwdyAoYW5kIC11bml4cHdfbmlzIG9ubHkgaWYgeDExdm5jCiAgICAgICAgICAgICAgICAgICAgICAgaXMgcnVubmluZyBhcyByb290KSwgdGhlbiB0aGUgY21kPSBjb21tYW5kIGlzIHJ1bgogICAgICAgICAgICAgICAgICAgICAgIGFzIHRoZSB1c2VyIHdobyBqdXN0IGF1dGhlbnRpY2F0ZWQgdmlhIHRoZSBsb2dpbiBhbmQKICAgICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCBwcm9tcHQuCgogICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBjYXNlIG9mIC11bml4cHdfY21kLCB0aGUgY29tbWFuZHMgd2lsbCBhbHNvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgcnVuIGFzIHRoZSBsb2dnZWQtaW4gdXNlciwgYXMgbG9uZyBhcyB0aGUgdXNlci1zdXBwbGllZAogICAgICAgICAgICAgICAgICAgICAgIGhlbHBlciBwcm9ncmFtIHN1cHBvcnRzIFJGQl9VTklYUFdfQ01EX1JVTiAoc2VlIHRoZQogICAgICAgICAgICAgICAgICAgICAgIC11bml4cHdfY21kIG9wdGlvbi4pCgogICAgICAgICAgICAgICAgICAgICAgIEFsc28gaW4gdGhlIGNhc2Ugb2YgLXVuaXhwdywgdGhlIHVzZXIgbG9nZ2luZyBpbiBjYW4KICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSBhIGNvbG9uIGF0IHRoZSBlbmQgb2YgaGVyIHVzZXJuYW1lIGFuZCBzdXBwbHkKICAgICAgICAgICAgICAgICAgICAgICBhIGZldyBvcHRpb25zOiBzY2FsZT0sIHNjYWxlX2N1cnNvcj0gKG9yIHNjPSksIHNvbGlkCiAgICAgICAgICAgICAgICAgICAgICAgKG9yIHNvKSwgaWQ9LCBjbGVhcl9tb2RzIChvciBjbSksIGNsZWFyX2tleXMgKG9yCiAgICAgICAgICAgICAgICAgICAgICAgY2spLCBjbGVhcl9hbGwgKG9yIGNhKSwgcmVwZWF0LCBzcGVlZHM9IChvciBzcD0pLAogICAgICAgICAgICAgICAgICAgICAgIHJlYWR0aW1lb3V0PSAob3IgcmQ9KSwgdmlld29ubHkgKG9yIHZvKSwgbm9kaXNwbGF5PQogICAgICAgICAgICAgICAgICAgICAgIChvciBuZD0pLCByb3RhdGU9IChvciBybz0pLCBvciBub25jYWNoZSAob3IgbmMpLAogICAgICAgICAgICAgICAgICAgICAgIGFsbCBzZXBhcmF0ZWQgYnkgY29tbWFzIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUuCiAgICAgICAgICAgICAgICAgICAgICAgQWZ0ZXIgdGhlIHVzZXIgbG9ncyBpbiBzdWNjZXNzZnVsbHksIHRoZXNlIG9wdGlvbnMgd2lsbAogICAgICAgICAgICAgICAgICAgICAgIGJlIGFwcGxpZWQgdG8gdGhlIFZOQyBzY3JlZW4uICBGb3IgZXhhbXBsZSwKCiAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naW46IGZyZWQ6c2NhbGU9My80LHNjPTEscmVwZWF0CiAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc3dvcmQ6IC4uLgoKICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpbjogcnVuZ2U6c3A9bW9kZW0scmQ9MTIwLHNvbGlkCgogICAgICAgICAgICAgICAgICAgICAgIGZvciBjb252ZW5pZW5jZSBtL24gaW1wbGllcyBzY2FsZT0gZS5nLiBmcmVkOjMvNCAgSWYgeW91CiAgICAgICAgICAgICAgICAgICAgICAgdHlwZSBhbmQgZW50ZXIgeW91ciBwYXNzd29yZCBpbmNvcnJlY3RseSwgdG8gcmV0cmlldmUKICAgICAgICAgICAgICAgICAgICAgICB5b3VyIGxvbmcgImxvZ2luOiIgbGluZSBwcmVzcyB0aGUgVXAgYXJyb3cgb25jZQogICAgICAgICAgICAgICAgICAgICAgIChiZWZvcmUgdHlwaW5nIGFueXRoaW5nIGVsc2UpLgoKICAgICAgICAgICAgICAgICAgICAgICBNb3N0IG9mIHRoZXNlIGNvbG9uIG9wdGlvbnMgb25seSBhcHBseSB0byB0aGUgYnVpbHRpbgogICAgICAgICAgICAgICAgICAgICAgIEZJTkRESVNQTEFZIGFuZCBGSU5EQ1JFQVRFRElTUExBWSBtb2RlcywgYnV0IG5vdGUKICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHRoZXkgYXJlIHBhc3NlZCB0byB0aGUgZXh0cmVuYWwgY29tbWFuZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCBhcyB3ZWxsIGFuZCBzbyBjb3VsZCBiZSB1c2VkLgoKICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGUgbG9naW4gcGFuZWwsIHByZXNzIEYxIHRvIGdldCBhIGxpc3Qgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIG9wdGlvbnMgdGhhdCB5b3UgY2FuIGFkZCBhZnRlciB0aGUgdXNlcm5hbWUuCgogICAgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgb3B0aW9uIGlzICJnZW9tPVd4SCIgb3IgImdlb209V3hIeEQiIChvcgogICAgICAgICAgICAgICAgICAgICAgIGdlPSkuIFRoaXMgb25seSBoYXMgYW4gZWZmZWN0IGluIEZJTkRDUkVBVEVESVNQTEFZCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB3aGVuIGEgdmlydHVhbCBYIHNlcnZlciBzdWNoIGFzIFh2ZmIgaXMgZ29pbmcKICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBjcmVhdGVkLiAgSXQgc2V0cyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXcgZGlzcGxheSwgYW5kIG9wdGlvbmFsbHkgdGhlIGNvbG9yIGRlcHRoIGFzCiAgICAgICAgICAgICAgICAgICAgICAgd2VsbC4KCiAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBhbHNvIHN1cHBseSAiZ25vbWUiLCAia2RlIiwgInR3bSIsCiAgICAgICAgICAgICAgICAgICAgICAgImZ2d20iLCAibXdtIiwgImR0d20iLCAid21ha2VyIiwgInhmY2UiLAogICAgICAgICAgICAgICAgICAgICAgICJseGRlIiwgImVubGlnaHRlbm1lbnQiLCAiWHNlc3Npb24iLCBvcgogICAgICAgICAgICAgICAgICAgICAgICJmYWlsc2FmZSIgKHNhbWUgYXMgInh0ZXJtIikgdG8gaGF2ZSB0aGUgY3JlYXRlZAogICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgdXNlIHRoYXQgbW9kZSBmb3IgdGhlIHVzZXIgc2Vzc2lvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSAidGFnPS4uLiIgdG8gc2V0IHRoZSB1bmlxdWUgRkRfVEFHIGRlc2t0b3AKICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIHRhZyBkZXNjcmliZWQgYmVsb3cuICBOb3RlOiB0aGlzIG9wdGlvbiB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgYmUgaWdub3JlZCBpZiB0aGUgRkRfVEFHIGVudi4gdmFyLiBpcyBhbHJlYWR5IHNldCBvcgogICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSB2aWV3ZXItc2lkZSBzdXBwbGllZCB2YWx1ZSBpcyBub3QgY29tcGxldGVseQogICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2VkIG9mIGFscGhhbnVtZXJpYyBvciAnXycgb3IgJy0nIGNoYXJhY3RlcnMuCgogICAgICAgICAgICAgICAgICAgICAgIFVzZXIgcHJlZmVyZW5jZXMgZmlsZTogSW5zdGVhZCBvZiBoYXZpbmcgdGhlIHVzZXIgdHlwZQogICAgICAgICAgICAgICAgICAgICAgIGluIGdlb209V3hILC4uLiBldGMuIGV2ZXJ5IHRpbWUgaGUgbG9ncyBpbiB0byBmaW5kCiAgICAgICAgICAgICAgICAgICAgICAgb3IgY3JlYXRlIGhpcyBYIHNlc3Npb24sIGlmIHlvdSBzZXQgRkRfVVNFUlBSRUZTIHRvCiAgICAgICAgICAgICAgICAgICAgICAgYSBzdHJpbmcgdGhhdCBkb2VzIG5vdCBjb250YWluIHRoZSAiLyIgY2hhcmFjdGVyLAogICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeSBpcyBwcmVwZW5kZWQgdG8gdGhhdAogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBhbmQgaWYgdGhlIGZpbGUgZXhpc3RzIGl0cyBmaXJzdCBsaW5lIGlzIHJlYWQKICAgICAgICAgICAgICAgICAgICAgICBhbmQgYXBwZW5kZWQgdG8gYW55IG9wdGlvbnMgaGUgc3VwcGxpZWQgYXQgdGhlIGxvZ2luOgogICAgICAgICAgICAgICAgICAgICAgIHByb21wdC4gIEZvciBleGFtcGxlIC1lbnYgRkRfVVNFUlBSRUZTPS54MTF2bmNfY3JlYXRlCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSB1c2VyIHB1dCAiZ2VvbT0xNjAweDEyMDAiIGluIGhpcwogICAgICAgICAgICAgICAgICAgICAgIH4vLngxMXZuY19jcmVhdGUgZmlsZS4KCiAgICAgICAgICAgICAgICAgICAgICAgVG8gZGlzYWJsZSB0aGUgb3B0aW9uIHNldHRpbmcgc2V0IHRoZSBlbnZpcm9ubWVudAogICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlIFgxMVZOQ19OT19VTklYUFdfT1BUUz0xIGJlZm9yZSBzdGFydGluZyB4MTF2bmMuCiAgICAgICAgICAgICAgICAgICAgICAgVG8gc2V0IGFueSBvdGhlciBvcHRpb25zLCB0aGUgdXNlciBjYW4gdXNlIHRoZSBndWkKICAgICAgICAgICAgICAgICAgICAgICAoeDExdm5jIC1ndWkgY29ubmVjdCkgb3IgdGhlIHJlbW90ZSBjb250cm9sIG1ldGhvZAogICAgICAgICAgICAgICAgICAgICAgICh4MTF2bmMgLVIgb3B0OnZhbCkgZHVyaW5nIGhpcyBWTkMgc2Vzc2lvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgU28gd2Ugc2VlIHRoZSBjb21iaW5hdGlvbiBvZiAtZGlzcGxheSBXQUlUOmNtZD0uLi4gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgLXVuaXhwdyBhbGxvd3MgYXV0b21hdGljIHBhaXJpbmcgb2YgYW4gdW5peAogICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZWQgVk5DIHVzZXIgd2l0aCBoaXMgZGVza3RvcC4gIFRoaXMgY291bGQKICAgICAgICAgICAgICAgICAgICAgICBiZSB2ZXJ5IHVzZWZ1bCBvbiBTdW5SYXlzIGFuZCBhbHNvIGFueSBzeXN0ZW0gd2hlcmUKICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSB1c2VycyBzaGFyZSBhIGdpdmVuIG1hY2hpbmUuICBUaGUgdXNlciBkb2VzCiAgICAgICAgICAgICAgICAgICAgICAgbm90IG5lZWQgdG8gcmVtZW1iZXIgc3BlY2lhbCBwb3J0cyBvciBwYXNzd29yZHMgc2V0IHVwCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGhpcyBkZXNrdG9wIGFuZCBWTkMuCgogICAgICAgICAgICAgICAgICAgICAgIEEgbmljZSB3YXkgdG8gdXNlIFdBSVQ6Y21kPS4uLiBpcyBvdXQgb2YgaW5ldGQoOCkKICAgICAgICAgICAgICAgICAgICAgICAoaXQgYXV0b21hdGljYWxseSBmb3JrcyBhIG5ldyB4MTF2bmMgZm9yIGVhY2ggdXNlcikuCiAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBoYXZlIHRoZSB4MTF2bmMgaW5ldGQgc3Bhd25lZCBwcm9jZXNzIHJ1biBhcywKICAgICAgICAgICAgICAgICAgICAgICBzYXksIHJvb3Qgb3Igbm9ib2R5LiAgV2hlbiBydW4gYXMgcm9vdCAoZm9yIGVpdGhlciBpbmV0ZAogICAgICAgICAgICAgICAgICAgICAgIG9yIGRpc3BsYXkgbWFuYWdlciksIHlvdSBjYW4gYWxzbyBzdXBwbHkgdGhlIG9wdGlvbgogICAgICAgICAgICAgICAgICAgICAgICItdXNlcnMgdW5peHB3PSIgdG8gaGF2ZSB0aGUgeDExdm5jIHByb2Nlc3Mgc3dpdGNoIHRvCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHVzZXIgYXMgd2VsbC4gIE5vdGU6IHRoZXJlIHdpbGwgYmUgYSAybmQgU1NMIGhlbHBlcgogICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgdGhhdCB3aWxsIG5vdCBzd2l0Y2gsIGJ1dCBpdCBpcyBvbmx5IGVuY29kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGRlY29kaW5nIHRoZSBlbmNyeXB0ZWQgc3RyZWFtIGF0IHRoYXQgcG9pbnQuCgogICAgICAgICAgICAgICAgICAgICAgIEJVSUxULUlOIG1vZGVzOgoKICAgICAgICAgICAgICAgICAgICAgICAtLSBBdXRvbWF0aWMgRmluZGluZyBvZiBVc2VyIFggU2Vzc2lvbnMgLS0KCiAgICAgICAgICAgICAgICAgICAgICAgQXMgYSBzcGVjaWFsIGNhc2UsIFdBSVQ6Y21kPUZJTkRESVNQTEFZIHdpbGwgcnVuIGEKICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQgdGhhdCB3b3JrcyBvbiBtb3N0IFVuaXhlcyB0byBkZXRlcm1pbmUgYSB1c2VyJ3MKICAgICAgICAgICAgICAgICAgICAgICBESVNQTEFZIHZhcmlhYmxlIGFuZCB4YXV0aG9yaXR5IGRhdGEgKHNlZSB3aG8oMSkpLgoKICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBUaGUgb3B0aW9uICItZmluZCIgaXMgYW4gYWxpYXMgZm9yIHRoaXMgbW9kZS4KCiAgICAgICAgICAgICAgICAgICAgICAgVG8gaGF2ZSB0aGlzIGRlZmF1bHQgc2NyaXB0IHByaW50ZWQgdG8gc3Rkb3V0IChlLmcuIGZvcgogICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbWl6YXRpb24pIHJ1biB3aXRoIFdBSVQ6Y21kPUZJTkRESVNQTEFZLXByaW50IFRvCiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0aGUgc2NyaXB0IHJ1biB0byBwcmludCB3aGF0IGRpc3BsYXkgaXQgd291bGQgZmluZAogICAgICAgICAgICAgICAgICAgICAgIHVzZSAiLWZpbmRkcHkiIG9yIFdBSVQ6Y21kPUZJTkRESVNQTEFZLXJ1bgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3RhbmRhcmQgc2NyaXB0IHJ1bnMgeGRweWluZm8oMSkgcnVuIG9uIHBvdGVudGlhbAogICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlzLiAgSWYgeW91ciBYIHNlcnZlcihzKSBoYXZlIGEgbG9naW4gZ3JlZXRlcgogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZXhjbHVzaXZlbHkgZ3JhYnMgdGhlIFhzZXJ2ZXIsIHRoZW4geGRweWluZm8KICAgICAgICAgICAgICAgICAgICAgICBibG9ja3MgZm9yZXZlciBhbmQgdGhpcyBtb2RlIHdpbGwgbm90IHdvcmsuICBTZWUKICAgICAgICAgICAgICAgICAgICAgICB3d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLWRpc3BsYXktbWFuYWdlcgogICAgICAgICAgICAgICAgICAgICAgIGZvciBob3cgdG8gZGlzYWJsZSB0aGlzIGZvciBkdGdyZWV0IG9uIFNvbGFyaXMgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libHkgZm9yIG90aGVyIGdyZWV0ZXJzLgoKICAgICAgICAgICAgICAgICAgICAgICBJbiAtZmluZC9jbWQ9RklORERJU1BMQVkgbW9kZSwgaWYgeW91IHNldCBGRF9YRE09MSwKICAgICAgICAgICAgICAgICAgICAgICBlLmcuICd4MTF2bmMgLWVudiBGRF9YRE09MSAtZmluZCAuLi4nIGFuZCB4MTF2bmMgaXMKICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIGFzIHJvb3QgKGUuZy4gaW5ldGQpIHRoZW4gaXQgd2lsbCB0cnkgdG8gZmluZAogICAgICAgICAgICAgICAgICAgICAgIHRoZSBYQVVUSE9SSVRZIGZpbGUgb2YgYSBydW5uaW5nIFhETS9HRE0vS0RNIGxvZ2luCiAgICAgICAgICAgICAgICAgICAgICAgZ3JlZXRlciAoaS5lLiBubyB1c2VyIGhhcyBsb2dnZWQgaW50byBhbiBYIHNlc3Npb24geWV0LikKCiAgICAgICAgICAgICAgICAgICAgICAgQXMgYW5vdGhlciBzcGVjaWFsIGNhc2UsIFdBSVQ6Y21kPUhUVFBPTkNFIHdpbGwgYWxsb3cKICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgdG8gc2VydmljZSBvbmUgaHR0cCByZXF1ZXN0IGFuZCB0aGVuIGV4aXQuCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB1c3VhbGx5IGRvbmUgaW4gLWluZXRkIG1vZGUgdG8gcnVuIG9uLCBzYXksCiAgICAgICAgICAgICAgICAgICAgICAgcG9ydCA1ODAwIGFuZCBhbGxvdyB0aGUgSmF2YSB2bmN2aWV3ZXIgdG8gYmUgZG93bmxvYWRlZAogICAgICAgICAgICAgICAgICAgICAgIGJ5IGNsaWVudCB3ZWIgYnJvd3NlcnMuICBGb3IgZXhhbXBsZToKCiAgICAgICAgICAgICAgICAgICAgICAgIDU4MTUgc3RyZWFtIHRjcCBub3dhaXQgcm9vdCAvdXNyL3NiaW4vdGNwZCAvLi4uL3gxMXZuYwpcCiAgICAgICAgICAgICAgICAgICAgICAgICAgLWluZXRkIC1xIC1odHRwX3NzbCAtcHJvZyAvLi4uL3gxMXZuYyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgLWRpc3BsYXkgV0FJVDpjbWQ9SFRUUE9OQ0UKCiAgICAgICAgICAgICAgICAgICAgICAgV2hlcmUgLy4uLi94MTF2bmMgaXMgdGhlIGZ1bGwgcGF0aCB0byB4MTF2bmMuCiAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgdXNlZCBpbiB0aGUgQXBhY2hlIFNTTC1wb3J0YWwgZXhhbXBsZSAoc2VlIEZBUSkuCgogICAgICAgICAgICAgICAgICAgICAgIEluIHRoaXMgbW9kZSB5b3UgY2FuIHNldCBYMTFWTkNfU0tJUF9ESVNQTEFZIHRvIGEKICAgICAgICAgICAgICAgICAgICAgICBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBkaXNwbGF5cyAoZS5nLiAiOjAsOjEiKSB0bwogICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZSBpbiB0aGUgZmluZGluZyBwcm9jZXNzLiAgVGhlICI6IiBpcyBvcHRpb25hbC4KICAgICAgICAgICAgICAgICAgICAgICBSYW5nZXMgbi1tIGUuZy4gMC0yMCBjYW4gYWxzbyBiZSBzdXBwbGllZC4gVGhpcyBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyBiZSBzZXQgYnkgdGhlIGNvbm5lY3RpbmcgdXNlciB2aWEgIm5kPSIKICAgICAgICAgICAgICAgICAgICAgICB1c2luZyAiKyIgaW5zdGVhZCBvZiAiLCIgIElmICJuZD1hbGwiIG9yIHlvdSBzZXQKICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfU0tJUF9ESVNQTEFZPWFsbCB0aGVuIGFsbCBkaXNwbGF5IGZpbmRpbmcgZmFpbHMKICAgICAgICAgICAgICAgICAgICAgICBhcyBpZiB5b3Ugc2V0IFgxMVZOQ19GSU5ERElTUExBWV9BTFdBWVNfRkFJTFM9MSAoYmVsb3cuKQoKICAgICAgICAgICAgICAgICAgICAgICBPbiBzb21lIHN5c3RlbXMgbHNvZigxKSBjYW4gYmUgdmVyeSBzbG93LiAgU2V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgIGVudi4gdmFyLiBGSU5EX0RJU1BMQVlfTk9fTFNPRj0xIHRvIHNraXAgdXNpbmcgbHNvZiB0bwogICAgICAgICAgICAgICAgICAgICAgIHRyeSB0byBmaW5kIHRoZSBMaW51eCBWVCB0aGUgWCBzZXJ2ZXIgaXMgcnVubmluZyBvbi4KICAgICAgICAgICAgICAgICAgICAgICBzZXQgRklORF9ESVNQTEFZX05PX1ZUX0ZJTkQ9MSB0byBhdm9pZCBsb29raW5nIGF0IGFsbC4KCiAgICAgICAgICAgICAgICAgICAgICAgLS0gQXV0b21hdGljIENyZWF0aW9uIG9mIFVzZXIgWCBTZXNzaW9ucyAtLQoKICAgICAgICAgICAgICAgICAgICAgICBBbiBpbnRlcmVzdGluZyBvcHRpb24gaXMgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVkKICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGlzIGxpa2UgRklORERJU1BMQVkgaW4gdGhhdCBpcyB1c2VzIHRoZSBzYW1lIG1ldGhvZAogICAgICAgICAgICAgICAgICAgICAgIHRvIGZpbmQgYW4gZXhpc3RpbmcgZGlzcGxheS4gIEhvd2V2ZXIsIGlmIGl0IGRvZXMgbm90CiAgICAgICAgICAgICAgICAgICAgICAgZmluZCBvbmUgaXQgd2lsbCB0cnkgdG8gKnN0YXJ0KiB1cCBhbiBYIHNlcnZlciBzZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSB1c2VyLiAgVGhpcyBpcyB0aGUgb25seSB0aW1lIHgxMXZuYyB0cmllcyB0bwogICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5IHN0YXJ0IHVwIGFuIFggc2VydmVyLgoKICAgICAgICAgICAgICAgICAgICAgICBOT1RFOiBUaGUgb3B0aW9uICItY3JlYXRlIiBpcyBhbiBhbGlhcyBmb3IgdGhpcyBtb2RlLgoKICAgICAgICAgICAgICAgICAgICAgICBJdCB3aWxsIHN0YXJ0IGxvb2tpbmcgZm9yIGFuIG9wZW4gZGlzcGxheSBudW1iZXIgYXQgOjIwCiAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGUgdmlhIFgxMVZOQ19DUkVBVEVfU1RBUlRJTkdfRElTUExBWV9OVU1CRVI9bgogICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgODAgWCBkaXNwbGF5cyBhcmUgYWxsb3dlZCAoaS5lLiBnb2luZyB0byA6OTkpCiAgICAgICAgICAgICAgICAgICAgICAgT3ZlcnJpZGUgdmlhIFgxMVZOQ19DUkVBVEVfTUFYX0RJU1BMQVlTPW4KCiAgICAgICAgICAgICAgICAgICAgICAgRm9yIGl0cyBoZXVyaXN0aWNzLCB0aGUgY3JlYXRlIGRpc3BsYXkgc2NyaXB0IHNldHMKICAgICAgICAgICAgICAgICAgICAgICBMQ19BTEw9QyBzbyB0aGF0IGNvbW1hbmQgb3V0cHV0IGlzIHVuaWZvcm0uICBCeSBkZWZhdWx0CiAgICAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCB0cnkgdG8gcmVzdG9yZSBMQ19BTEwgcmlnaHQgYmVmb3JlIHN0YXJ0aW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHVzZXIgc2Vzc2lvbi4gIEhvd2V2ZXIsIGlmIHlvdSBkb24ndCBtaW5kIGl0IGtlZXBpbmcKICAgICAgICAgICAgICAgICAgICAgICBMQ19BTEw9QyBzZXQgdGhlIGVudi4gdmFyLjogWDExVk5DX0NSRUFURV9MQ19BTExfQ19PSz0xCgogICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgRklORENSRUFURURJU1BMQVkgd2lsbCB0cnkgWHZmYiBhbmQgdGhlbgogICAgICAgICAgICAgICAgICAgICAgIFhkdW1teToKCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFhkdW1teSB3cmFwcGVyIGlzIHBhcnQgb2YgdGhlIHgxMXZuYyBzb3VyY2UgY29kZQogICAgICAgICAgICAgICAgICAgICAgICh4MTF2bmMvbWlzYy9YZHVtbXkpICBJdCBzaG91bGQgYmUgYXZhaWxhYmxlIGluIFBBVEgKICAgICAgICAgICAgICAgICAgICAgICBhbmQgaGF2ZSBydW4gIlhkdW1teSAtaW5zdGFsbCIgb25jZSB0byBjcmVhdGUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkIGxpYnJhcnkuICBYZHVtbXkgb25seSB3b3JrcyBvbiBMaW51eC4gIEFzIG9mCiAgICAgICAgICAgICAgICAgICAgICAgMTIvMjAwOSBpdCBubyBsb25nZXIgbmVlZHMgdG8gYmUgcnVuIGFzIHJvb3QsIGFuZCB0aGUKICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIHRvIG5vdCBydW4gYXMgcm9vdC4gIEluIHNvbWUgY2lyY3Vtc3RhbmNlcwogICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zIG1heSByZXF1aXJlIHJ1bm5pbmcgaXQgYXMgcm9vdCwgaW4gdGhlc2UKICAgICAgICAgICAgICAgICAgICAgICBjYXNlcyBzcGVjaWZ5IEZEX1hEVU1NWV9SVU5fQVNfUk9PVD0xLCB0aGlzIGlzIHRoZSBzYW1lCiAgICAgICAgICAgICAgICAgICAgICAgYXMgc3VwcGx5aW5nIC1yb290IHRvIHRoZSBYZHVtbXkgY21kbGluZS4KCiAgICAgICAgICAgICAgICAgICAgICAgWHZmYiBpcyBhdmFpbGFibGUgb24gbW9zdCBwbGF0Zm9ybXMgYW5kIGRvZXMgbm90CiAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZSByb290LgoKICAgICAgICAgICAgICAgICAgICAgICBBbiBhZHZhbnRhZ2Ugb2YgWGR1bW15IG92ZXIgWHZmYiBpcyB0aGF0IFhkdW1teSBzdXBwb3J0cwogICAgICAgICAgICAgICAgICAgICAgIFJBTkRSIGR5bmFtaWMgc2NyZWVuIHJlc2l6aW5nLgoKICAgICAgICAgICAgICAgICAgICAgICBXaGVuIHgxMXZuYyBleGl0cyAoaS5lLiB1c2VyIGRpc2Nvbm5lY3RzKSB0aGUgWAogICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciBzZXNzaW9uIHN0YXlzIHJ1bm5pbmcgaW4gdGhlIGJhY2tncm91bmQuCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIEZJTkRESVNQTEFZIHdpbGwgZmluZCBpdCBkaXJlY3RseSBuZXh0IHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHVzZXIgbXVzdCBleGl0IHRoZSBYIHNlc3Npb24gaW4gdGhlIHVzdWFsIHdheSBmb3IKICAgICAgICAgICAgICAgICAgICAgICBpdCB0byB0ZXJtaW5hdGUgKG9yIGtpbGwgdGhlIFggc2VydmVyIHByb2Nlc3MgaWYgYWxsCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBmYWlscykuCgogICAgICAgICAgICAgICAgICAgICAgIFRvIHRyb3VibGVzaG9vdCB0aGUgRklORENSRUFURURJU1BMQVkgbWVjaGFuaXNtLAogICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgZm9sbG93aW5nIGVudi4gdmFyLiB0byBhbiBvdXRwdXQgbG9nIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgZS5nIC1lbnYgQ1JFQVRFX0RJU1BMQVlfT1VUUFVUPS90bXAvbXlkZWJ1Zy50eHQKCiAgICAgICAgICAgICAgICAgICAgICAgU28gdGhpcyBpcyBhIHNvbWV3aGF0IG9kZCBtb2RlIGZvciB4MTF2bmMgaW4gdGhhdCBpdAogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgc3RhcnQgdXAgYW5kIHBvbGwgdmlydHVhbCBYIHNlcnZlcnMhICBUaGlzIGNhbgogICAgICAgICAgICAgICAgICAgICAgIGJlIHVzZWQgZnJvbSwgc2F5LCBpbmV0ZCg4KSB0byBwcm92aWRlIGEgbWVhbnMgb2YKICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0ZWx5IGdldHRpbmcgYSBkZXNrdG9wIChlaXRoZXIgcmVhbCBvciB2aXJ0dWFsKQogICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBtYWNoaW5lLiAgRS5nLiBhIGRlc2t0b3Agc2VydmljZToKCiAgICAgICAgICAgICAgICAgICAgICAgICA1OTAwIHN0cmVhbSB0Y3Agbm93YWl0IHJvb3QgL3Vzci9zYmluL3RjcGQgLy4uLi94MTF2bmMKICAgICAgICAgICAgICAgICAgICAgICAgICAtaW5ldGQgLXEgLWh0dHAgLXNzbCBTQVZFIC11bml4cHcgLXVzZXJzIHVuaXhwdz1cCiAgICAgICAgICAgICAgICAgICAgICAgICAgLXBhc3N3ZCBzZWNyZXQgLXByb2cgLy4uLi94MTF2bmMgXAogICAgICAgICAgICAgICAgICAgICAgICAgIC1kaXNwbGF5IFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZCgogICAgICAgICAgICAgICAgICAgICAgIFdoZXJlIC8uLi4veDExdm5jIGlzIHRoZSBmdWxsIHBhdGggdG8geDExdm5jLgoKICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIC1zdmMvLXNlcnZpY2Ugb3B0aW9uIGFsaWFzIGFib3ZlLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiBmb3Igc29tZSByZWFzb24geW91IGRvIG5vdCB3YW50IHgxMXZuYyB0byBldmVyCiAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHRvIGZpbmQgYW4gZXhpc3RpbmcgZGlzcGxheSBzZXQgdGhlIGVudi4gdmFyCiAgICAgICAgICAgICAgICAgICAgICAgWDExVk5DX0ZJTkRESVNQTEFZX0FMV0FZU19GQUlMUz0xIChhbHNvIC1lbnYgLi4uKQogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgdGhlIHNhbWUgYXMgc2V0dGluZyBYMTFWTkNfU0tJUF9ESVNQTEFZPWFsbCBvcgogICAgICAgICAgICAgICAgICAgICAgIHN1cHBseWluZyAibmQ9YWxsIiBhZnRlciAidXNlcm5hbWU6IgoKICAgICAgICAgICAgICAgICAgICAgICBVc2UgV0FJVDpjbWQ9RklORENSRUFURURJU1BMQVktcHJpbnQgdG8gcHJpbnQgb3V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdCB0aGF0IGlzIHVzZWQgZm9yIHRoaXMuCgogICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gc3BlY2lmeSB0aGUgcHJlZmVycmVkIFggc2VydmVyIG9yZGVyIHZpYSBlLmcuLAogICAgICAgICAgICAgICAgICAgICAgIFdBSVQ6Y21kPUZJTkRDUkVBVEVESVNQTEFZLVhkdW1teSxYdmZiLFggIGFuZC9vciBsZWF2ZQogICAgICAgICAgICAgICAgICAgICAgIG91dCBvbmVzIHlvdSBkbyBub3Qgd2FudC4gIFRoZSB0aGUgY2FzZSAiWCIgbWVhbnMgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgdG8gc3RhcnQgdXAgYSByZWFsLCBoYXJkd2FyZSBYIHNlcnZlciB1c2luZyB4aW5pdCgxKQogICAgICAgICAgICAgICAgICAgICAgIG9yIHN0YXJ0eCgxKS4gIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gWCBzZXJ2ZXIgcnVubmluZwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBYIGNhc2UgbWF5IG9ubHkgd29yayBvbiBMaW51eCAoc2VlIHN0YXJ0eCgxKSkuCgogICAgICAgICAgICAgICAgICAgICAgICJYdm5jIiB3aWxsIHN0YXJ0IHVwIGEgVk5DIFggc2VydmVyIChyZWFsLQogICAgICAgICAgICAgICAgICAgICAgIG9yIHRpZ2h0LXZuYywgZS5nLiB1c2UgaWYgWHZmYiBpcyBub3QgYXZhaWxhYmxlKS4KICAgICAgICAgICAgICAgICAgICAgICAiWHNydiIgd2lsbCBzdGFydCB1cCB0aGUgc2VydmVyIHByb2dyYW0gaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUgIkZEX1hTUlYiIGlmIGl0IGlzIG5vbi1lbXB0eS4gWW91IGNhbiBtYWtlCiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBiZSBhIHdyYXBwZXIgc2NyaXB0IGlmIHlvdSBsaWtlIChpdCBtdXN0IGhhbmRsZSA6TiwKICAgICAgICAgICAgICAgICAgICAgICAtZ2VvbWV0cnksIGFuZCAtZGVwdGggYW5kIG90aGVyIFggc2VydmVyIG9wdGlvbnMpLgoKICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgRkRfR0VPTSAob3IKICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfQ1JFQVRFX0dFT00pIHRvIFd4SCBvciBXeEh4RCB0byBzZXQgdGhlIHdpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGhlaWdodCBhbmQgb3B0aW9uYWxseSB0aGUgY29sb3IgZGVwdGggb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlZCBkaXNwbGF5LiAgWW91IGNhbiBhbHNvIHNldCBGRF9TRVNTIHRvIGJlIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24gKHNob3J0IG5hbWUgb2YgdGhlIHdpbmRvd21hbmFnZXI6IGtkZSwgZ25vbWUsCiAgICAgICAgICAgICAgICAgICAgICAgdHdtLCBmYWlsc2FmZSwgZXRjLikuIEZEX09QVFMgY29udGFpbnMgZXh0cmEgb3B0aW9ucwogICAgICAgICAgICAgICAgICAgICAgIHRvIHBhc3MgdG8gdGhlIFggc2VydmVyLiBZb3UgY2FuIGFsc28gc2V0IEZEX1BST0cgdG8KICAgICAgICAgICAgICAgICAgICAgICBiZSB0aGUgZnVsbCBwYXRoIHRvIHRoZSBzZXNzaW9uL3dpbmRvd21hbmFnZXIgcHJvZ3JhbS4KCiAgICAgICAgICAgICAgICAgICAgICAgTW9yZSBGRCB0cmlja3M6ICBGRF9DVVBTPXBvcnQgb3IgRkRfQ1VQUz1ob3N0OnBvcnQKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHNldCB0aGUgY3VwcyBwcmludGluZyBlbnZpcm9ubWVudC4gIFNpbWlsYXJseSBmb3IKICAgICAgICAgICAgICAgICAgICAgICBGRF9FU0Q9cG9ydCBvciBGRF9FU0Q9aG9zdDpwb3J0IGZvciBlc2Rkc3Agc291bmQKICAgICAgICAgICAgICAgICAgICAgICByZWRpcmVjdGlvbi4gIFNldCBGRF9FWFRSQSB0byBhIGNvbW1hbmQgdG8gYmUgcnVuIGEKICAgICAgICAgICAgICAgICAgICAgICBmZXcgc2Vjb25kcyBhZnRlciB0aGUgWCBzZXJ2ZXIgc3RhcnRzIHVwLiAgU2V0IEZEX1RBRwogICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGEgdW5pcXVlIG5hbWUgZm9yIHRoZSBzZXNzaW9uLCBpdCBpcyBzZXQgYXMgYW4KICAgICAgICAgICAgICAgICAgICAgICBYIHByb3BlcnR5LCB0aGF0IG1ha2VzIEZJTkRESVNQTEFZIG9ubHkgZmluZCBzZXNzaW9ucwogICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhhdCB0YWcgdmFsdWUuCgogICAgICAgICAgICAgICAgICAgICAgIFNldCBGRF9YRE1DUF9JRiB0byB0aGUgbmV0d29yayBpbnRlcmZhY2UgdGhhdCB0aGUKICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IG1hbmFnZXIgaXMgcnVubmluZyBvbjsgZGVmYXVsdCBpcyAnbG9jYWxob3N0JwogICAgICAgICAgICAgICAgICAgICAgIGJ1dCB5b3UgbWF5IG5lZWQgdG8gc2V0IGl0IHRvICc6OjEnIG9uIHNvbWUgSVB2NiBvbmx5CiAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtcyBvciBtaXNjb25maWd1cmVkIGRpc3BsYXkgbWFuYWdlcnMuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSB3YW50IHRoZSBGSU5EQ1JFQVRFRElTUExBWSBzZXNzaW9uIHRvIGNvbnRhY3QgYW4KICAgICAgICAgICAgICAgICAgICAgICBYRE1DUCBsb2dpbiBtYW5hZ2VyICh4ZG0vZ2RtL2tkbSkgb24gdGhlIHNhbWUgbWFjaGluZSwKICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHVzZSAiWHZmYi54ZG1jcCIgaW5zdGVhZCBvZiAiWHZmYiIsIGV0Yy4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgdXNlciB3aWxsIGhhdmUgdG8gc3VwcGx5IGhpcyB1c2VybmFtZSBhbmQgcGFzc3dvcmQKICAgICAgICAgICAgICAgICAgICAgICBvbmUgbW9yZSB0aW1lIChidXQgaGUgZ2V0cyB0byBzZWxlY3QgaGlzIGRlc2t0b3AgdHlwZQogICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgY2FuIGJlIHVzZWZ1bCkuICBGb3IgdGhpcyB0byB3b3JrLCB5b3Ugd2lsbAogICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gZW5hYmxlIGxvY2FsaG9zdCBYRE1DUCAodWRwIHBvcnQgMTc3KSBmb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBtYW5hZ2VyLiAgVGhpcyBzZWVtcyB0byBiZToKCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBnZG0gaW4gZ2RtLmNvbmY6ICAgRW5hYmxlPXRydWUgaW4gc2VjdGlvbiBbeGRtY3BdCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBrZG0gaW4ga2RtcmM6ICAgICAgRW5hYmxlPXRydWUgaW4gc2VjdGlvbiBbWGRtY3BdCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciB4ZG0gaW4geGRtLWNvbmZpZzogRGlzcGxheU1hbmFnZXIucmVxdWVzdFBvcnQ6IDE3NwoKICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIHNob3J0aGFuZCBvcHRpb25zIGFib3ZlICItc3ZjIiwgIi14ZG1zdmMiCiAgICAgICAgICAgICAgICAgICAgICAgYW5kICItc3NoeGRtc3ZjIiB0aGF0IHNwZWNpZnkgdGhlIGFib3ZlIG9wdGlvbnMgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgc29tZSB1c2VmdWwgY2FzZXMuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBzZXQgdGhlIGVudi4gdmFyIFdBSVRCRz0xIHgxMXZuYyB3aWxsIGdvIGludG8KICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFja2dyb3VuZCBvbmNlIGxpc3RlbmluZyBpbiB3YWl0IG1vZGUuCgogICAgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgc3BlY2lhbCBtb2RlIGlzIEZJTkRDUkVBVEVESVNQTEFZLVh2bmMucmVkaXJlY3QsCiAgICAgICAgICAgICAgICAgICAgICAgKG9yIEZJTkRESVNQTEFZLVh2bmMucmVkaXJlY3QpLiAgSW4gdGhpcyBjYXNlIGl0IHdpbGwKICAgICAgICAgICAgICAgICAgICAgICBzdGFydCB1cCBYdm5jIGFzIGFib3ZlIGlmIG5lZWRlZCwgYnV0IGluc3RlYWQgb2YKICAgICAgICAgICAgICAgICAgICAgICBwb2xsaW5nIGl0IGluIGl0cyBub3JtYWwgd2F5LCBpdCBzaW1wbHkgZG9lcyBhIHNvY2tldAogICAgICAgICAgICAgICAgICAgICAgIHJlZGlyZWN0aW9uIG9mIHRoZSBjb25uZWN0ZWQgVk5DIHZpZXdlciB0byB0aGUgWHZuYy4KCiAgICAgICAgICAgICAgICAgICAgICAgU28gaW4gWHZuYy5yZWRpcmVjdCB4MTF2bmMgZG9lcyBubyBWTkMgYnV0IG1lcmVseQogICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVycyB0aGUgZGF0YSBiYWNrIGFuZCBmb3J0aC4gIFRoaXMgc2hvdWxkIGJlCiAgICAgICAgICAgICAgICAgICAgICAgZmFzdGVyIHRoZW4geDExdm5jJ3MgcG9sbGluZyBtZXRob2QsIGJ1dCBub3QgYXMgZmFzdAogICAgICAgICAgICAgICAgICAgICAgIGFzIGNvbm5lY3RpbmcgZGlyZWN0bHkgdG8gdGhlIFh2bmMgd2l0aCB0aGUgVk5DIFZpZXdlci4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgaWRlYSBoZXJlIGlzIHRvIHRha2UgYWR2YW50YWdlIG9mIHgxMXZuYydzIGRpc3BsYXkKICAgICAgICAgICAgICAgICAgICAgICBmaW5kaW5nL2NyZWF0aW5nIHNjaGVtZSwgU1NMLCBhbmQgcGVyaGFwcyBhIGZldyBvdGhlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgTW9zdCBvZiB4MTF2bmMncyBvcHRpb25zIGRvIG5vdCBhcHBseSBpbiB0aGlzIG1vZGUuCgogICAgICAgICAgICAgICAgICAgICAgIFh2bmMucmVkaXJlY3Qgc2hvdWxkIGFsc28gd29yayBmb3IgdGhlIHZuYy5zbyBYIHNlcnZlcgogICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBmb3IgdGhlIGgvdyBkaXNwbGF5IGhvd2V2ZXIgaXQgd2lsbCB3b3JrIG9ubHkKICAgICAgICAgICAgICAgICAgICAgICBmb3IgZmluZGluZyB0aGUgZGlzcGxheSBhbmQgdGhlIHVzZXIgbXVzdCBhbHJlYWR5IGJlCiAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VkIGludG8gdGhlIFggY29uc29sZS4KCi12ZW5jcnlwdCBtb2RlICAgICAgICAgVGhlIFZlTkNyeXB0IGV4dGVuc2lvbiB0byB0aGUgVk5DIHByb3RvY29sIGFsbG93cwogICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZCBTU0wvVExTIGNvbm5lY3Rpb25zLiAgSWYgdGhlIC1zc2wgbW9kZSBpcwogICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQsIHRoZW4gVmVOQ3J5cHQgaXMgZW5hYmxlZCBhcyB3ZWxsIEJZIERFRkFVTFQKICAgICAgICAgICAgICAgICAgICAgICAodGhleSBib3RoIHVzZSBhIFNTTC9UTFMgdHVubmVsLCBvbmx5IHRoZSBwcm90b2NvbAogICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZSBpcyBhIGxpdHRsZSBkaWZmZXJlbnQuKQoKICAgICAgICAgICAgICAgICAgICAgICBUbyBjb250cm9sIHdoZW4gYW5kIGhvdyBWZU5DcnlwdCBpcyB1c2VkLCBzcGVjaWZ5IHRoZQogICAgICAgICAgICAgICAgICAgICAgIG1vZGUgc3RyaW5nLiAgSWYgbW9kZSBpcyAibmV2ZXIiLCB0aGVuIFZlTkNyeXB0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgbm90IHVzZWQuICBJZiBtb2RlIGlzICJzdXBwb3J0IiAodGhlIGRlZmF1bHQpIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICBWZU5DcnlwdCBpcyBzdXBwb3J0ZWQuICBJZiBtb2RlIGlzICJvbmx5IiwgdGhlbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBzaW1pbGFyIGFuZCBvbGRlciBBTk9OVExTIHByb3RvY29sIGlzIG5vdCBzaW11bHRhbmVvdXNseQogICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZC4gIHgxMXZuYydzIG5vcm1hbCBTU0wgbW9kZSAodm5jczovLykgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCB1bmRlciAtc3NsIHVubGVzcyB5b3Ugc2V0IG1vZGUgdG8gImZvcmNlIi4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgbW9kZSBpcyBwcmVmaXhlZCB3aXRoICJub2RoOiIsIHRoZW4gRGlmZmllIEhlbGxtYW4KICAgICAgICAgICAgICAgICAgICAgICBhbm9ueW1vdXMga2V5IGV4Y2hhbmdlIGlzIGRpc2FibGVkLiAgSWYgbW9kZSBpcyBwcmVmaXhlZAogICAgICAgICAgICAgICAgICAgICAgIHdpdGggIm5veDUwOToiLCB0aGVuIFg1MDkga2V5IGV4Y2hhbmdlIGlzIGRpc2FibGVkLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyBkaXNhYmxlIGFsbCBBbm9ueW1vdXMgRGlmZmllLUhlbGxtYW4gYWNjZXNzCiAgICAgICAgICAgICAgICAgICAgICAgKHN1c2NlcHRpYmxlIHRvIE1hbi1Jbi1UaGUtTWlkZGxlIGF0dGFjaykgeW91IHdpbGwgbmVlZAogICAgICAgICAgICAgICAgICAgICAgIHRvIHN1cHBseSAiLXZlbmNyeXB0IG5vZGg6c3VwcG9ydCAtYW5vbnRscyBuZXZlciIKICAgICAgICAgICAgICAgICAgICAgICBvciAiLXZlbmNyeXB0IG5vZGg6b25seSIKCiAgICAgICAgICAgICAgICAgICAgICAgSWYgbW9kZSBpcyBwcmVmaXhlZCB3aXRoICJuZXdkaDoiLCB0aGVuIG5ldyBEaWZmaWUKICAgICAgICAgICAgICAgICAgICAgICBIZWxsbWFuIHBhcmFtZXRlcnMgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBjb25uZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgY2FuIGJlIHRpbWUgY29uc3VtaW5nOiAxLTYwIHNlY3M7IHNlZSAtZGhwYXJhbXMKICAgICAgICAgICAgICAgICAgICAgICBiZWxvdyBmb3IgYSBmYXN0ZXIgd2F5KSByYXRoZXIgdGhhbiB1c2luZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCB2YWx1ZXMgaW4gdGhlIHByb2dyYW0uICBVc2luZyBmaXhlZCwgcHVibGljbHkKICAgICAgICAgICAgICAgICAgICAgICBrbm93biB2YWx1ZXMgaXMgbm90IGtub3duIHRvIGJlIGEgc2VjdXJpdHkgcHJvYmxlbS4KICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgYXBwbGllcyB0byBBTk9OVExTIGFzIHdlbGwuCgogICAgICAgICAgICAgICAgICAgICAgIExvbmcgZXhhbXBsZTogLXZlbmNyeXB0IG5ld2RoOm5veDUwOTpzdXBwb3J0CgogICAgICAgICAgICAgICAgICAgICAgIEFsc28sIGlmIG1vZGUgaXMgcHJlZml4ZWQgd2l0aCAicGxhaW46IiwgdGhlbgogICAgICAgICAgICAgICAgICAgICAgIGlmIC11bml4cHcgbW9kZSBpcyBhY3RpdmUgdGhlIFZlTkNyeXB0ICIqUGxhaW4iCiAgICAgICAgICAgICAgICAgICAgICAgdXNlcm5hbWUrcGFzc3dkIG1ldGhvZCBpcyBlbmFibGVkIGZvciBVbml4IGxvZ2lucy4KICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgaW4gLXVuaXhwdyBtb2RlIHRoZSBub3JtYWwgbG9naW4gcGFuZWwgaXMKICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgWW91ICpNVVNUKiBzdXBwbHkgdGhlIC1zc2wgb3B0aW9uIGZvciBWZU5DcnlwdCB0bwogICAgICAgICAgICAgICAgICAgICAgIGJlIGFjdGl2ZS4gIFRoZSAtdmVuY3J5cHQgb3B0aW9uIG9ubHkgZmluZS10dW5lcyBpdHMKICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24uCgotYW5vbnRscyBtb2RlICAgICAgICAgIFRoZSBBTk9OVExTIGV4dGVuc2lvbiB0byB0aGUgVk5DIHByb3RvY29sIGFsbG93cwogICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZCBTU0wvVExTIGNvbm5lY3Rpb25zLiAgSWYgdGhlIC1zc2wgbW9kZSBpcwogICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQsIHRoZW4gQU5PTlRMUyBpcyBlbmFibGVkIGFzIHdlbGwgQlkgREVGQVVMVAogICAgICAgICAgICAgICAgICAgICAgICh0aGV5IGJvdGggdXNlIGEgU1NML1RMUyB0dW5uZWwsIG9ubHkgdGhlIHByb3RvY29sCiAgICAgICAgICAgICAgICAgICAgICAgaGFuZHNoYWtlIGlzIGEgbGl0dGxlIGRpZmZlcmVudC4pCgogICAgICAgICAgICAgICAgICAgICAgIEFOT05UTFMgaXMgYW4gb2xkZXIgU1NML1RMUyBtb2RlIGludHJvZHVjZWQgYnkgdmluby4KCiAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgcmVmZXJyZWQgdG8gYXMgJ1RMUycgZm9yIGl0cyByZWdpc3RlcmVkIFZOQwogICAgICAgICAgICAgICAgICAgICAgIHNlY3VyaXR5LXR5cGUgbmFtZSwgYnV0IHdlIHVzZSB0aGUgbW9yZSBkZXNjcmlwdGl2ZQogICAgICAgICAgICAgICAgICAgICAgICdBTk9OVExTJyBoZXJlIGJlY2F1c2UgaXQgcHJvdmlkZXMgb25seSBBbm9ueW1vdXMKICAgICAgICAgICAgICAgICAgICAgICBEaWZmaWUtSGVsbG1hbiBlbmNyeXB0ZWQgY29ubmVjdGlvbnMsIGFuZCBoZW5jZSBubwogICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmlsaXR5IGZvciBjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgVG8gY29udHJvbCB3aGVuIGFuZCBob3cgQU5PTlRMUyBpcyB1c2VkLCBzcGVjaWZ5IHRoZQogICAgICAgICAgICAgICAgICAgICAgIG1vZGUgc3RyaW5nLiAgSWYgbW9kZSBpcyAibmV2ZXIiLCB0aGVuIEFOT05UTFMgaXMgbm90CiAgICAgICAgICAgICAgICAgICAgICAgdXNlZC4gIElmIG1vZGUgaXMgInN1cHBvcnQiICh0aGUgZGVmYXVsdCkgdGhlbiBBTk9OVExTCiAgICAgICAgICAgICAgICAgICAgICAgaXMgc3VwcG9ydGVkLiAgSWYgbW9kZSBpcyAib25seSIsIHRoZW4gdGhlIHNpbWlsYXIKICAgICAgICAgICAgICAgICAgICAgICBWZU5DcnlwdCBwcm90b2NvbCBpcyBub3Qgc2ltdWx0YW5lb3VzbHkgc3VwcG9ydGVkLgogICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYydzIG5vcm1hbCBTU0wgbW9kZSAodm5jczovLykgd2lsbCBiZSBzdXBwb3J0ZWQKICAgICAgICAgICAgICAgICAgICAgICB1bmRlciAtc3NsIHVubGVzcyB5b3Ugc2V0IG1vZGUgdG8gImZvcmNlIi4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgbW9kZSBpcyBwcmVmaXhlZCB3aXRoICJuZXdkaDoiLCB0aGVuIG5ldyBEaWZmaWUKICAgICAgICAgICAgICAgICAgICAgICBIZWxsbWFuIHBhcmFtZXRlcnMgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCBjb25uZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMgY2FuIGJlIHRpbWUgY29uc3VtaW5nOiAxLTYwIHNlY3M7IHNlZSAtZGhwYXJhbXMKICAgICAgICAgICAgICAgICAgICAgICBiZWxvdyBmb3IgYSBmYXN0ZXIgd2F5KSByYXRoZXIgdGhhbiB1c2luZyB0aGUKICAgICAgICAgICAgICAgICAgICAgICBmaXhlZCB2YWx1ZXMgaW4gdGhlIHByb2dyYW0uICBVc2luZyBmaXhlZCwgcHVibGljbHkKICAgICAgICAgICAgICAgICAgICAgICBrbm93biB2YWx1ZXMgaXMgbm90IGtub3duIHRvIGJlIGEgc2VjdXJpdHkgcHJvYmxlbS4KICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNldHRpbmcgYXBwbGllcyB0byBWZU5DcnlwdCBhcyB3ZWxsLiAgU2VlIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mICJwbGFpbjoiIHVuZGVyIC12ZW5jcnlwdC4KCiAgICAgICAgICAgICAgICAgICAgICAgTG9uZyBleGFtcGxlOiAtYW5vbnRscyBuZXdkaDpwbGFpbjpzdXBwb3J0CgogICAgICAgICAgICAgICAgICAgICAgIFlvdSAqTVVTVCogc3VwcGx5IHRoZSAtc3NsIG9wdGlvbiBmb3IgQU5PTlRMUyB0bwogICAgICAgICAgICAgICAgICAgICAgIGJlIGFjdGl2ZS4gIFRoZSAtYW5vbnRscyBvcHRpb24gb25seSBmaW5lLXR1bmVzIGl0cwogICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4KCi1zc2xvbmx5ICAgICAgICAgICAgICAgU2FtZSBhczogIi12ZW5jcnlwdCBuZXZlciAtYW5vbnRscyBuZXZlciIgIGkuZS4gaXQKICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlcyB0aGUgVmVOQ3J5cHQgYW5kIEFOT05UTFMgZW5jcnlwdGlvbiBtZXRob2RzCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIG9ubHkgYWxsb3dzIHN0YW5kYXJkIFNTTCB0dW5uZWxpbmcuICBZb3UgbXVzdCBhbHNvCiAgICAgICAgICAgICAgICAgICAgICAgc3VwcGx5IHRoZSAtc3NsIC4uLiBvcHRpb24gKHNlZSBiZWxvdy4pCgoKLWRocGFyYW1zIGZpbGUgICAgICAgICBGb3Igc29tZSBvcGVyYXRpb25zIGEgc2V0IG9mIERpZmZpZSBIZWxsbWFuIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICAgICAgICAocHJpbWUgYW5kIGdlbmVyYXRvcikgaXMgbmVlZGVkLiAgSWYgc28sIHVzZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluICJmaWxlIi4gSW4gcGFydGljdWxhciwgdGhlIFZlTkNyeXB0IGFuZAogICAgICAgICAgICAgICAgICAgICAgIEFOT05UTFMgYW5vbnltb3VzIERIIG1vZGUgbmVlZCB0aGVtLiAgQnkgZGVmYXVsdCBhCiAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQgc2V0IGlzIHVzZWQuIElmIHlvdSBkbyBub3Qgd2FudCB0byBkbyB0aGF0IHlvdQogICAgICAgICAgICAgICAgICAgICAgIGNhbiBzcGVjaWZ5ICJuZXdkaDoiIHRvIHRoZSAtdmVuY3J5cHQgYW5kIC1hbm9udGxzCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyB0byBnZW5lcmF0ZSBhIG5ldyBzZXQgZWFjaCBzZXNzaW9uLiAgSWYgdGhhdAogICAgICAgICAgICAgICAgICAgICAgIGlzIHRvbyBzbG93IGZvciB5b3UsIHVzZSAtZGhwYXJhbXMgZmlsZSB0byBhIHNldCB5b3UKICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkIG1hbnVhbGx5IHZpYSAib3BlbnNzbCBkaHBhcmFtIC1vdXQgZmlsZSAxMDI0IgoKLW5vc3NsICAgICAgICAgICAgICAgICBEaXNhYmxlIHRoZSAtc3NsIG9wdGlvbiAoc2VlIGJlbG93KS4gU2luY2UgLXNzbCBpcyBvZmYKICAgICAgICAgICAgICAgICAgICAgICBieSBkZWZhdWx0IC1ub3NzbCB3b3VsZCBvbmx5IGJlIHVzZWQgb24gdGhlIGNvbW1hbmRsaW5lCiAgICAgICAgICAgICAgICAgICAgICAgdG8gdW5zZXQgYW55ICplYXJsaWVyKiAtc3NsIG9wdGlvbiAob3IgLXN2Yy4uLikKCi1zc2wgW3BlbV0gICAgICAgICAgICAgVXNlIHRoZSBvcGVuc3NsIGxpYnJhcnkgKHd3dy5vcGVuc3NsLm9yZykgdG8gcHJvdmlkZSBhCiAgICAgICAgICAgICAgICAgICAgICAgYnVpbHQtaW4gZW5jcnlwdGVkIFNTTC9UTFMgdHVubmVsIGJldHdlZW4gVk5DIHZpZXdlcnMKICAgICAgICAgICAgICAgICAgICAgICBhbmQgeDExdm5jLiAgVGhpcyByZXF1aXJlcyBsaWJzc2wgc3VwcG9ydCB0byBiZQogICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVkIGludG8geDExdm5jIGF0IGJ1aWxkIHRpbWUuICBJZiB4MTF2bmMgaXMgbm90CiAgICAgICAgICAgICAgICAgICAgICAgYnVpbHQgd2l0aCBsaWJzc2wgc3VwcG9ydCBpdCB3aWxsIGV4aXQgaW1tZWRpYXRlbHkgd2hlbgogICAgICAgICAgICAgICAgICAgICAgIC1zc2wgaXMgcHJlc2NyaWJlZC4gIFNlZSB0aGUgLXN0dW5uZWwgb3B0aW9uIGJlbG93IGZvcgogICAgICAgICAgICAgICAgICAgICAgIGFuIGFsdGVybmF0aXZlLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk5DIFZpZXdlci1zaWRlIG5lZWRzIHRvIHN1cHBvcnQgU1NML1RMUyBhcyB3ZWxsLgogICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGlzIFVSTCBhbmQgYWxzbyB0aGUgZGlzY3Vzc2lvbiBiZWxvdyBmb3IKICAgICAgICAgICAgICAgICAgICAgICBpZGVhcyBvbiBob3cgdG8gZW5hYmxlIFNTTCBzdXBwb3J0IGZvciB0aGUgdmlld2VyOgogICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cua2FybHJ1bmdlLmNvbS94MTF2bmMvZmFxLmh0bWwjZmFxLXNzbC10dW4KICAgICAgICAgICAgICAgICAgICAgICBuZWwtdmlld2VycyAuICB4MTF2bmMgcHJvdmlkZXMgYW4gU1NMIGVuYWJsZWQgSmF2YQogICAgICAgICAgICAgICAgICAgICAgIHZpZXdlciBhcHBsZXQgaW4gdGhlIGNsYXNzZXMvc3NsIGRpcmVjdG9yeSAoLWh0dHAgb3IKICAgICAgICAgICAgICAgICAgICAgICAtaHR0cGRpciBvcHRpb25zLikgIFRoZSBTU1ZOQyB2aWV3ZXIgcGFja2FnZSBzdXBwb3J0cwogICAgICAgICAgICAgICAgICAgICAgIFNTTCB0dW5uZWxzIHRvby4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIFZOQyBWaWV3ZXIgc3VwcG9ydHMgVmVOQ3J5cHQgb3IgQU5PTlRMUyAodmlubydzCiAgICAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGlvbiBtb2RlKSB0aGV5IGFyZSBhbHNvIHN1cHBvcnRlZCBieSB0aGUgLXNzbAogICAgICAgICAgICAgICAgICAgICAgIG1vZGUgKHNlZSB0aGUgLXZlbmNyeXB0IGFuZCAtYW5vbnRscyBvcHRpb25zIGZvciBtb3JlCiAgICAgICAgICAgICAgICAgICAgICAgaW5mbzsgdXNlIC1zc2xvbmx5IHRvIGRpc2FibGUgYm90aCBvZiB0aGVtLikKCiAgICAgICAgICAgICAgICAgICAgICAgVXNlICItc3NsIC9wYXRoL3RvL215Y2VydC5wZW0iIHRvIHNwZWNpZnkgYW4gU1NMCiAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgZmlsZSBpbiBQRU0gZm9ybWF0IHRvIHVzZSB0byBpZGVudGlmeSBhbmQKICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlIGEga2V5IGZvciB0aGlzIHNlcnZlci4gIFNlZSBvcGVuc3NsKDEpIGZvciBtb3JlCiAgICAgICAgICAgICAgICAgICAgICAgaW5mbyBhYm91dCBQRU1zIGFuZCB0aGUgLXNzbEdlbkNlcnQgYW5kICItc3NsIFNBVkUiCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyBiZWxvdyBmb3IgaG93IHRvIGNyZWF0ZSB0aGVtLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgY29ubmVjdGluZyBWTkMgdmlld2VyIFNTTCB0dW5uZWwgY2FuIChhdCBpdHMgb3B0aW9uKQogICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0ZSB0aGlzIHNlcnZlciBpZiBpdCBoYXMgdGhlIHB1YmxpYyBrZXkgcGFydAogICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjZXJ0aWZpY2F0ZSAob3IgYSBjb21tb24gY2VydGlmaWNhdGUgYXV0aG9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgIENBLCBpcyBhIG1vcmUgc29waGlzdGljYXRlZCB3YXkgdG8gdmVyaWZ5IHRoaXMgc2VydmVyJ3MKICAgICAgICAgICAgICAgICAgICAgICBjZXJ0LCBzZWUgLXNzbEdlbkNBIGJlbG93KS4gIFRoaXMgYXV0aGVudGljYXRpb24gaXMKICAgICAgICAgICAgICAgICAgICAgICBkb25lIHRvIHByZXZlbnQgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy4gIE90aGVyd2lzZSwKICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgVk5DIHZpZXdlciBzaW1wbHkgYWNjZXB0cyB0aGlzIHNlcnZlcidzIGtleQogICAgICAgICAgICAgICAgICAgICAgIFdJVEhPVVQgdmVyaWZpY2F0aW9uLCB0aGUgdHJhZmZpYyBpcyBwcm90ZWN0ZWQgZnJvbQogICAgICAgICAgICAgICAgICAgICAgIHBhc3NpdmUgc25pZmZpbmcgb24gdGhlIG5ldHdvcmssIGJ1dCAqTk9UKiBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy4gVGhlcmUgYXJlIGhhY2tlciB0b29scwogICAgICAgICAgICAgICAgICAgICAgIGxpa2UgZHNuaWZmL3dlYm1pdG0gYW5kIGNhaW4gdGhhdCBpbXBsZW1lbnQgU1NMCiAgICAgICAgICAgICAgICAgICAgICAgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgW3BlbV0gaXMgZW1wdHkgb3IgdGhlIHN0cmluZyAiU0FWRSIgdGhlbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBvcGVuc3NsKDEpIGNvbW1hbmQgbXVzdCBiZSBhdmFpbGFibGUgdG8gZ2VuZXJhdGUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgdGhlIGZpcnN0IHRpbWUuICBBIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlCiAgICAgICAgICAgICAgICAgICAgICAgaXMgZ2VuZXJhdGVkIChzZWUgLXNzbEdlbkNBIGFuZCAtc3NsR2VuQ2VydCBmb3IgdXNlCiAgICAgICAgICAgICAgICAgICAgICAgb2YgYSBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkuKSAgSXQgd2lsbCBiZSBzYXZlZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICBmaWxlIH4vLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtLiAgT24gc3Vic2VxdWVudCBjYWxscyBpZgogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgZmlsZSBhbHJlYWR5IGV4aXN0cyBpdCB3aWxsIGJlIHVzZWQgZGlyZWN0bHkuCgogICAgICAgICAgICAgICAgICAgICAgIFVzZSAiU0FWRV9OT1BST01QVCIgdG8gYXZvaWQgYmVpbmcgcHJvbXB0ZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICBwcm90ZWN0IHRoZSBnZW5lcmF0ZWQga2V5IHdpdGggYSBwYXNzcGhyYXNlLiAgSG93ZXZlciBpbgogICAgICAgICAgICAgICAgICAgICAgIC1pbmV0ZCBhbmQgLWJnIG1vZGVzIHRoZXJlIHdpbGwgYmUgbm8gcHJvbXB0aW5nIGZvciBhCiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3BocmFzZSBpbiBlaXRoZXIgY2FzZS4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgW3BlbV0gaXMgIlNBVkVfUFJPTVBUIiB0aGUgc2VydmVyLnBlbSBjZXJ0aWZpY2F0ZQogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgY3JlYXRlZCBiYXNlZCBvbiB5b3VyIGFuc3dlcnMgdG8gaXRzIHByb21wdHMgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgYWxsIGluZm8gc3VjaCBhcyBPcmdhbml6YXRpb25hbE5hbWUsIENvbW1vbk5hbWUsIGV0Yy4KCiAgICAgICAgICAgICAgICAgICAgICAgVXNlICJTQVZFLTxzdHJpbmc+IiBhbmQgIlNBVkVfUFJPTVBULTxzdHJpbmc+IgogICAgICAgICAgICAgICAgICAgICAgIHRvIHJlZmVyIHRvIHRoZSBmaWxlIH4vLnZuYy9jZXJ0cy9zZXJ2ZXItPHN0cmluZz4ucGVtCiAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCAoaXQgd2lsbCBiZSBnZW5lcmF0ZWQgaWYgaXQgZG9lcyBub3QgYWxyZWFkeQogICAgICAgICAgICAgICAgICAgICAgIGV4aXN0KS4gIEUuZy4gIlNBVkUtY2hhcmxpZSIgd2lsbCBzdG9yZSB0byB0aGUgZmlsZQogICAgICAgICAgICAgICAgICAgICAgIH4vLnZuYy9jZXJ0cy9zZXJ2ZXItY2hhcmxpZS5wZW0KCiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6IHgxMXZuYyAtc3NsIFNBVkUgLWRpc3BsYXkgOjAgLi4uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsIFNBVkUtc29tZW90aGVyIC1kaXNwbGF5IDowIC4uLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiBbcGVtXSBpcyAiVE1QIiBhbmQgdGhlIG9wZW5zc2woMSkgdXRpbGl0eQogICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgZXhpc3RzIGluIFBBVEgsIHRoZW4gYSB0ZW1wb3JhcnksIHNlbGYtc2lnbmVkCiAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgd2lsbCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgc2Vzc2lvbi4gIElmCiAgICAgICAgICAgICAgICAgICAgICAgb3BlbnNzbCgxKSBjYW5ub3QgYmUgdXNlZCB0byBnZW5lcmF0ZSBhIHRlbXBvcmFyeQogICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlIHgxMXZuYyBleGl0cyBpbW1lZGlhdGVseS4gIFRoZSB0ZW1wb3JhcnkKICAgICAgICAgICAgICAgICAgICAgICBjZXJ0IHdpbGwgYmUgZGlzY2FyZGVkIHdoZW4geDExdm5jIGV4aXRzLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiBzdWNjZXNzZnVsIGluIHVzaW5nIG9wZW5zc2woMSkgdG8gZ2VuZXJhdGUgYQogICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeSBjZXJ0aWZpY2F0ZSBpbiAiU0FWRSIgb3IgIlRNUCIgY3JlYXRpb24KICAgICAgICAgICAgICAgICAgICAgICBtb2RlcywgdGhlIHB1YmxpYyBwYXJ0IG9mIGl0IHdpbGwgYmUgZGlzcGxheWVkIHRvIHN0ZGVycgogICAgICAgICAgICAgICAgICAgICAgIChlLmcuIG9uZSBjb3VsZCBjb3B5IGl0IHRvIHRoZSBjbGllbnQtc2lkZSB0byBwcm92aWRlCiAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRpb24gb2YgdGhlIHNlcnZlciB0byBWTkMgdmlld2Vycy4pCgogICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IEluICJUTVAiIG1vZGUsIHVubGVzcyB5b3Ugc2FmZWx5IGNvcHkgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHBhcnQgb2YgdGhlIHRlbXBvcmFyeSBDZXJ0IHRvIHRoZSB2aWV3ZXIgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgYXV0aGVudGljYXRlICpldmVyeSB0aW1lKiAodW5saWtlbHkuLi4pLCB0aGVuIG9ubHkKICAgICAgICAgICAgICAgICAgICAgICBwYXNzaXZlIHNuaWZmaW5nIGF0dGFja3MgYXJlIHByZXZlbnRlZCBhbmQgeW91IGFyZQogICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIG9wZW4gdG8gTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcy4gIFRoaXMgaXMKICAgICAgICAgICAgICAgICAgICAgICB3aHkgdGhlIGRlZmF1bHQgIlNBVkUiIG1vZGUgaXMgcHJlZmVycmVkIChhbmQgbW9yZQogICAgICAgICAgICAgICAgICAgICAgIHNvcGhpc3RpY2F0ZWQgQ0EgbW9kZSB0b28pLiAgT25seSB3aXRoIHNhdmVkIGtleXMgQU5ECiAgICAgICAgICAgICAgICAgICAgICAgdGhlIFZOQyB2aWV3ZXIgYXV0aGVudGljYXRpbmcgdGhlbSAodmlhIHRoZSBwdWJsaWMKICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSksIGFyZSBNYW4tSW4tVGhlLU1pZGRsZSBhdHRhY2tzIHByZXZlbnRlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgW3BlbV0gaXMgIkFOT04iIHRoZW4gdGhlIERpZmZpZS1IZWxsbWFuIGFub255bW91cwogICAgICAgICAgICAgICAgICAgICAgIGtleSBleGNoYW5nZSBtZXRob2QgaXMgdXNlZC4gIEluIHRoaXMgbW9kZSB0aGVyZQogICAgICAgICAgICAgICAgICAgICAgIGFyZSAqbm8qIFNTTCBjZXJ0aWZpY2F0ZXMgYW5kIHNvIGl0IGlzIG5vdCBwb3NzaWJsZQogICAgICAgICAgICAgICAgICAgICAgIHRvIGF1dGhlbnRpY2F0ZSBlaXRoZXIgdGhlIFZOQyBzZXJ2ZXIgb3IgVk5DIGNsaWVudC4KICAgICAgICAgICAgICAgICAgICAgICBUaHVzIG9ubHkgcGFzc2l2ZSBuZXR3b3JrIHNuaWZmaW5nIGF0dGFja3MgYXJlIGF2b2lkZWQ6CiAgICAgICAgICAgICAgICAgICAgICAgdGhlICJBTk9OIiBtZXRob2QgaXMgc3VzY2VwdGlibGUgdG8gTWFuLUluLVRoZS1NaWRkbGUKICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2tzLiAgIkFOT04iIGlzIG5vdCByZWNvbW1lbmRlZDsgaW5zdGVhZCB1c2UKICAgICAgICAgICAgICAgICAgICAgICBhIFNTTCBQRU0geW91IGNyZWF0ZWQgb3IgdGhlIGRlZmF1bHQgIlNBVkUiIG1ldGhvZC4KCiAgICAgICAgICAgICAgICAgICAgICAgU2VlIC1zc2xkaXIgYmVsb3cgdG8gdXNlIGEgZGlyZWN0b3J5IGJlc2lkZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCB+Ly52bmMvY2VydHMKCiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91ciB4MTF2bmMgYmluYXJ5IHdhcyBub3QgY29tcGlsZWQgd2l0aCBPcGVuU1NMCiAgICAgICAgICAgICAgICAgICAgICAgbGlicmFyeSBzdXBwb3J0LCB1c2Ugb2YgdGhlIC1zc2wgb3B0aW9uIHdpbGwgaW5kdWNlIGFuCiAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlIGZhaWx1cmUgYW5kIGV4aXQuICBGb3Igc3VjaCBiaW5hcmllcywgY29uc2lkZXIKICAgICAgICAgICAgICAgICAgICAgICB1c2luZyB0aGUgLXN0dW5uZWwgb3B0aW9uIGZvciBTU0wgZW5jcnlwdGVkIGNvbm5lY3Rpb25zLgoKICAgICAgICAgICAgICAgICAgICAgICBNaXNjIEluZm86IEluIHRlbXBvcmFyeSBjZXJ0IGNyZWF0aW9uIG1vZGUgIlRNUCIsIHNldAogICAgICAgICAgICAgICAgICAgICAgIHRoZSBlbnYuIHZhci4gWDExVk5DX1NIT1dfVE1QX1BFTT0xIHRvIGhhdmUgeDExdm5jIHByaW50CiAgICAgICAgICAgICAgICAgICAgICAgb3V0IHRoZSBlbnRpcmUgY2VydGlmaWNhdGUsIGluY2x1ZGluZyB0aGUgUFJJVkFURSBLRVkKICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LCB0byBzdGRlcnIuICBUaGVyZSBhcmUgYmV0dGVyIHdheXMgdG8gZ2V0L3NhdmUgdGhpcwogICAgICAgICAgICAgICAgICAgICAgIGluZm8uICBTZWUgIlNBVkUiIGFib3ZlIGFuZCAiLXNzbEdlbkNlcnQiIGJlbG93LgoKLXNzbHRpbWVvdXQgbiAgICAgICAgICBTZXQgU1NMIHJlYWQgdGltZW91dCB0byBuIHNlY29uZHMuICBJbiBzb21lIHNpdHVhdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBhbiBpY29uaWZpZWQgdmlld2VyIGluIFdpbmRvd3MpIHRoZSB2aWV3ZXIgc3RvcHMKICAgICAgICAgICAgICAgICAgICAgICB0YWxraW5nIGFuZCB0aGUgY29ubmVjdGlvbiBpcyBkcm9wcGVkIGFmdGVyIHRoZSBkZWZhdWx0CiAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCAoMjVzIGZvciBhYm91dCB0aGUgZmlyc3QgbWludXRlLCA0MzIwMHMgbGF0ZXIpLgogICAgICAgICAgICAgICAgICAgICAgIFNldCB0byB6ZXJvIHRvIHBvbGwgZm9yZXZlci4gIFNldCB0byBhIG5lZ2F0aXZlIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIHRoZSBidWlsdGluIHNldHRpbmcuCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHZhbHVlIGRvZXMgTk9UIGFwcGx5IHRvIHRoZSAqaW5pdGlhbCogc3NsCiAgICAgICAgICAgICAgICAgICAgICAgaW5pdCBjb25uZWN0aW9uLiAgVGhlIGRlZmF1bHQgdGltZW91dCBmb3IgdGhhdCBpcyAyMHNlYy4KICAgICAgICAgICAgICAgICAgICAgICBVc2UgLWVudiBTU0xfSU5JVF9USU1FT1VUPW4gdG8gbW9kaWZ5IGl0LgoKLXNzbG5vZmFpbCAgICAgICAgICAgICBFeGl0IGF0IHRoZSBmaXJzdCBTU0wgY29ubmVjdGlvbiBmYWlsdXJlLiBVc2VmdWwgd2hlbgogICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdGluZyBTU0wgY29ubmVjdGlvbnMgKGUuZy4geDExdm5jIGlzIHN0YXJ0ZWQgdmlhCiAgICAgICAgICAgICAgICAgICAgICAgc3NoKSBhbmQgeW91IGRvIG5vdCB3YW50IHgxMXZuYyB3YWl0aW5nIGFyb3VuZCBmb3IgbW9yZQogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLCB0eWluZyB1cCBwb3J0cywgZXRjLgoKLXNzbGRpciBkaXIgICAgICAgICAgICBVc2UgImRpciIgYXMgYW4gYWx0ZXJuYXRlIHNzbCBjZXJ0aWZpY2F0ZSBhbmQga2V5CiAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlbWVudCB0b3BsZXZlbCBkaXJlY3RvcnkuICBUaGUgZGVmYXVsdCBpcwogICAgICAgICAgICAgICAgICAgICAgIH4vLnZuYy9jZXJ0cwoKICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGRpcmVjdG9yeSBpcyB1c2VkIHRvIHN0b3JlIHNlcnZlciBhbmQgb3RoZXIKICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMgYW5kIGtleXMgYW5kIGFsc28gb3RoZXIgbWF0ZXJpYWxzLiAgRS5nLiBpbgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBzaW1wbGVzdCBjYXNlLCAiLXNzbCBTQVZFIiB3aWxsIHN0b3JlIHRoZSB4MTF2bmMKICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgY2VydCBpbiBkaXIvc2VydmVyLnBlbQoKICAgICAgICAgICAgICAgICAgICAgICBVc2Ugb2YgYWx0ZXJuYXRlIGRpcmVjdG9yaWVzIHZpYSAtc3NsZGlyIGFsbG93cyB5b3UgdG8KICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2UgbXVsdGlwbGUgVk5DIENlcnRpZmljYXRlIEF1dGhvcml0eSAoQ0EpIGtleXMuCiAgICAgICAgICAgICAgICAgICAgICAgQW5vdGhlciB1c2UgaXMgaWYgfi8udm5jL2NlcnQgaXMgb24gYW4gTkZTIHNoYXJlIHlvdQogICAgICAgICAgICAgICAgICAgICAgIG1pZ2h0IHdhbnQgeW91ciBjZXJ0aWZpY2F0ZXMgYW5kIGtleXMgdG8gYmUgb24gYSBsb2NhbAogICAgICAgICAgICAgICAgICAgICAgIGZpbGVzeXN0ZW0gdG8gcHJldmVudCBuZXR3b3JrIHNub29waW5nIChmb3IgZXhhbXBsZQogICAgICAgICAgICAgICAgICAgICAgIC1zc2xkaXIgL3Zhci9saWIveDExdm5jLWNlcnRzKS4KCiAgICAgICAgICAgICAgICAgICAgICAgLXNzbGRpciBhZmZlY3RzIG5lYXJseSBhbGwgb2YgdGhlIG90aGVyIC1zc2wqIG9wdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgZS5nLiAtc3NsIFNBVkUsIC1zc2xHZW5DZXJ0LCBldGMuLgoKLXNzbHZlcmlmeSBwYXRoICAgICAgICBGb3IgZWl0aGVyIG9mIHRoZSAtc3NsIG9yIC1zdHVubmVsIG1vZGVzLCB1c2UgInBhdGgiCiAgICAgICAgICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBjZXJ0aWZpY2F0ZXMgdG8gYXV0aGVudGljYXRlIGluY29taW5nIFZOQwogICAgICAgICAgICAgICAgICAgICAgICpDbGllbnQqIGNvbm5lY3Rpb25zIChub3JtYWxseSBvbmx5IHRoZSBzZXJ2ZXIgaXMKICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkIGluIFNTTC4pICBUaGlzIGNhbiBiZSB1c2VkIGFzIGEgbWV0aG9kCiAgICAgICAgICAgICAgICAgICAgICAgdG8gcmVwbGFjZSBzdGFuZGFyZCBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiBvZiBjbGllbnRzLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiAicGF0aCIgaXMgYSBkaXJlY3RvcnkgaXQgY29udGFpbnMgdGhlIGNsaWVudCAob3IgQ0EpCiAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGVzIGluIHNlcGFyYXRlIGZpbGVzLiAgSWYgcGF0aCBpcyBhIGZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgaXQgY29udGFpbnMgb25lIG9yIG1vcmUgY2VydGlmaWNhdGVzLiBTZWUgc3BlY2lhbCB0b2tlbnMKICAgICAgICAgICAgICAgICAgICAgICBiZWxvdy4gIFRoZXNlIGNvcnJlc3BvbmQgdG8gdGhlICJDQXBhdGggPSBkaXIiIGFuZAogICAgICAgICAgICAgICAgICAgICAgICJDQWZpbGUgPSBmaWxlIiBzdHVubmVsIG9wdGlvbnMuICBTZWUgdGhlIHN0dW5uZWwoOCkKICAgICAgICAgICAgICAgICAgICAgICBtYW5wYWdlIGZvciBkZXRhaWxzLgoKICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2wgLXNzbHZlcmlmeSB+L215LmNydAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbCAtc3NsdmVyaWZ5IH4vbXlfcGVtX2Rpci8KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGlmIHBhdGggaXMgYSBkaXJlY3RvcnksIGl0IG11c3QgY29udGFpbgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBjZXJ0cyBpbiBzZXBhcmF0ZSBmaWxlcyBuYW1lZCBsaWtlIDxIQVNIPi4wLCB3aGVyZQogICAgICAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiA8SEFTSD4gaXMgZm91bmQgYnkgcnVubmluZyB0aGUgY29tbWFuZAogICAgICAgICAgICAgICAgICAgICAgICJvcGVuc3NsIHg1MDkgLWhhc2ggLW5vb3V0IC1pbiBmaWxlLmNydCIuIEV2aWRlbnRseQogICAgICAgICAgICAgICAgICAgICAgIG9uZSB1c2VzIDxIQVNIPi4xIGlmIHRoZXJlIGlzIGEgY29sbGlzaW9uLi4uCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSB0aGUga2V5LW1hbmFnZW1lbnQgdXRpbGl0eSAiLXNzbENlcnRJbmZvIEhBU0hPTiIKICAgICAgICAgICAgICAgICAgICAgICBhbmQgIi1zc2xDZXJ0SW5mbyBIQVNIT0ZGIiB3aWxsIGNyZWF0ZS9kZWxldGUgdGhlc2UKICAgICAgICAgICAgICAgICAgICAgICBoYXNoZXMgZm9yIHlvdSBhdXRvbWF0aWNhbGx5ICh2aWEgc3ltbGluaykgaW4gdGhlIEhBU0gKICAgICAgICAgICAgICAgICAgICAgICBzdWJkaXJzIGl0IG1hbmFnZXMuICBUaGVuIHlvdSBjYW4gcG9pbnQgLXNzbHZlcmlmeSB0bwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBIQVNIIHN1YmRpci4KCiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lhbCB0b2tlbnM6IGluIC1zc2wgbW9kZSwgaWYgInBhdGgiIGlzIG5vdCBhIGZpbGUgb3IKICAgICAgICAgICAgICAgICAgICAgICBhIGRpcmVjdG9yeSwgaXQgaXMgdGFrZW4gYXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZgogICAgICAgICAgICAgICAgICAgICAgIHRva2VucyB0aGF0IGFyZSBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgoKICAgICAgICAgICAgICAgICAgICAgICBJZiBhIHRva2VuIGlzICJDQSIgdGhhdCBtZWFucyBsb2FkIHRoZSBDQS9jYWNlcnQucGVtCiAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBmcm9tIHRoZSBzc2wgZGlyZWN0b3J5LiAgSWYgYSB0b2tlbiBpcyAiY2xpZW50cyIKICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGFsbCB0aGUgZmlsZXMgY2xpZW50cy8qLmNydCBpbiB0aGUgc3NsIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgICAgICAgIGFyZSBsb2FkZWQuICBPdGhlcndpc2UgdGhlIGZpbGUgY2xpZW50cy90b2tlbi5jcnQKICAgICAgICAgICAgICAgICAgICAgICBpcyBhdHRlbXB0ZWQgdG8gYmUgbG9hZGVkLiAgQXMgYSBrbHVkZ2UsIHVzZSBhIHRva2VuCiAgICAgICAgICAgICAgICAgICAgICAgbGlrZSAuLi9zZXJ2ZXItZm9vIHRvIGxvYWQgYSBzZXJ2ZXIgY2VydCBpZiB5b3UgZmluZAogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgbmVjZXNzYXJ5LgoKICAgICAgICAgICAgICAgICAgICAgICBVc2UgLXNzbGRpciB0byB1c2UgYSBkaXJlY3RvcnkgZGlmZmVyZW50IGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgfi8udm5jL2NlcnRzIGRlZmF1bHQuCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCBpZiB0aGUgIkNBIiBjZXJ0IGlzIGxvYWRlZCB5b3UgZG8gbm90IG5lZWQKICAgICAgICAgICAgICAgICAgICAgICB0byBsb2FkIGFueSBvZiB0aGUgY2VydHMgdGhhdCBoYXZlIGJlZW4gc2lnbmVkIGJ5IGl0LgogICAgICAgICAgICAgICAgICAgICAgIFlvdSB3aWxsIG5lZWQgdG8gbG9hZCBhbnkgYWRkaXRpb25hbCBzZWxmLXNpZ25lZCBjZXJ0cwogICAgICAgICAgICAgICAgICAgICAgIGhvd2V2ZXIuCgogICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbCAtc3NsdmVyaWZ5IENBCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsIC1zc2x2ZXJpZnkgc2VsZjpmcmVkLHNlbGY6amltCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsIC1zc2x2ZXJpZnkgQ0EsY2xpZW50cwoKICAgICAgICAgICAgICAgICAgICAgICBVc3VhbGx5ICItc3NsdmVyaWZ5IENBIiBpcyB0aGUgbW9zdCBlZmZlY3RpdmUuCiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSAtc3NsR2VuQ0EgYW5kIC1zc2xHZW5DZXJ0IG9wdGlvbnMgYmVsb3cgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgaG93IHRvIHNldCB1cCBhbmQgbWFuYWdlIHRoZSBDQSBmcmFtZXdvcmsuCgoKCiAgICAgICAgICAgICAgICAgICAgICAgTk9URTogdGhlIGZvbGxvd2luZyB1dGlsaXRpZXMsIC1zc2xHZW5DQSwgLXNzbEdlbkNlcnQsCiAgICAgICAgICAgICAgICAgICAgICAgLXNzbEVuY0tleSwgLXNzbENlcnRJbmZvLCBhbmQgLXNzbENSTCBhcmUgcHJvdmlkZWQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGVuZXNzLCBidXQgZm9yIGNhc3VhbCB1c2FnZSB0aGV5IGFyZSBvdmVya2lsbC4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhleSBwcm92aWRlIFZOQyBDZXJ0aWZpY2F0ZSBBdXRob3JpdHkgKENBKSBrZXkgY3JlYXRpb24KICAgICAgICAgICAgICAgICAgICAgICBhbmQgc2VydmVyIC8gY2xpZW50IGtleSBnZW5lcmF0aW9uIGFuZCBzaWduaW5nLiAgU28gdGhleQogICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGUgYSBiYXNpYyBQdWJsaWMgS2V5IG1hbmFnZW1lbnQgZnJhbWV3b3JrIGZvcgogICAgICAgICAgICAgICAgICAgICAgIFZOQy1pbmcgd2l0aCB4MTF2bmMuIChub3RlIHRoYXQgdGhleSByZXF1aXJlIG9wZW5zc2woMSkKICAgICAgICAgICAgICAgICAgICAgICBiZSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSkKCiAgICAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgdGhlIHNpbXBsZXN0IHVzYWdlIG1vZGUsICItc3NsIFRNUCIgKHdoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGl0cyBvd24sIHNlbGYtc2lnbmVkLAogICAgICAgICAgICAgICAgICAgICAgIHRlbXBvcmFyeSBrZXkgYW5kIHRoZSBWTkMgdmlld2VycyBhbHdheXMgYWNjZXB0IGl0LAogICAgICAgICAgICAgICAgICAgICAgIGUuZy4gYWNjZXB0aW5nIHZpYSBhIGRpYWxvZyBib3gpIGlzIHByb2JhYmx5IHNhZmUgZW5vdWdoCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIG1vc3Qgc2NlbmFyaW9zLiAgQ0EgbWFuYWdlbWVudCBpcyBub3QgbmVlZGVkLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyBwcm90ZWN0IGFnYWluc3QgTWFuLUluLVRoZS1NaWRkbGUgYXR0YWNrcyB0aGUgIlRNUCIKICAgICAgICAgICAgICAgICAgICAgICBtb2RlIGNhbiBiZSBpbXByb3ZlZCBieSB1c2luZyAiLXNzbCBTQVZFIiAoc2FtZSBhcwogICAgICAgICAgICAgICAgICAgICAgICItc3NsIiwgaS5lLiB0aGUgZGVmYXVsdCkgdG8gaGF2ZSB4MTF2bmMgY3JlYXRlIGEKICAgICAgICAgICAgICAgICAgICAgICBsb25nZXIgdGVybSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSwgYW5kIHRoZW4gKHNhZmVseSkKICAgICAgICAgICAgICAgICAgICAgICBjb3B5IHRoZSBjb3JyZXNwb25kaW5nIHB1YmxpYyBrZXkgY2VydCB0byB0aGUgZGVzaXJlZAogICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCBtYWNoaW5lcyAoY2FyZSBtdXN0IGJlIHRha2VuIHRoZSBwcml2YXRlIGtleSBwYXJ0CiAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHN0b2xlbjsgeW91IHdpbGwgYmUgcHJvbXB0ZWQgZm9yIGEgcGFzc3BocmFzZSkuCgogICAgICAgICAgICAgICAgICAgICAgIFNvIGtlZXAgaW4gbWluZCBubyBDQSBrZXkgY3JlYXRpb24gb3IgbWFuYWdlbWVudAogICAgICAgICAgICAgICAgICAgICAgICgtc3NsR2VuQ0EgYW5kIC1zc2xHZW5DZXJ0KSBpcyBuZWVkZWQgZm9yIGVpdGhlciBvZgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBhYm92ZSB0d28gY29tbW9uIHVzYWdlIG1vZGVzLgoKICAgICAgICAgICAgICAgICAgICAgICBPbmUgbWlnaHQgd2FudCB0byB1c2UgLXNzbEdlbkNBIGFuZCAtc3NsR2VuQ2VydAogICAgICAgICAgICAgICAgICAgICAgIGlmIHlvdSBoYWQgYSBsYXJnZSBudW1iZXIgb2YgVk5DIGNsaWVudCBhbmQgc2VydmVyCiAgICAgICAgICAgICAgICAgICAgICAgd29ya3N0YXRpb25zLiAgVGhhdCB3YXkgdGhlIGFkbWluaXN0cmF0b3IgY291bGQgZ2VuZXJhdGUKICAgICAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSBDQSBrZXkgd2l0aCAtc3NsR2VuQ0EgYW5kIGRpc3RyaWJ1dGUgaXRzCiAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgcGFydCB0byBhbGwgb2YgdGhlIHdvcmtzdGF0aW9ucy4KCiAgICAgICAgICAgICAgICAgICAgICAgTmV4dCwgaGUgY291bGQgY3JlYXRlIHNpZ25lZCBWTkMgc2VydmVyIGtleXMKICAgICAgICAgICAgICAgICAgICAgICAoLXNzbEdlbkNlcnQgc2VydmVyIC4uLikgZm9yIGVhY2ggd29ya3N0YXRpb24gb3IgdXNlcgogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlbiB4MTF2bmMgd291bGQgdXNlIHRvIGF1dGhlbnRpY2F0ZSBpdHNlbGYgdG8KICAgICAgICAgICAgICAgICAgICAgICBhbnkgVk5DIGNsaWVudCB0aGF0IGhhcyB0aGUgQ0EgY2VydC4KCiAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWxseSwgdGhlIGFkbWluIGNvdWxkIGFsc28gbWFrZSBpdCBzbyB0aGUKICAgICAgICAgICAgICAgICAgICAgICBWTkMgY2xpZW50cyB0aGVtc2VsdmVzIGFyZSBhdXRoZW50aWNhdGVkIHRvIHgxMXZuYwogICAgICAgICAgICAgICAgICAgICAgICgtc3NsR2VuQ2VydCBjbGllbnQgLi4uKSAgRm9yIHRoaXMgLXNzbHZlcmlmeSB3b3VsZCBiZQogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZWQgdG8gdGhlIENBIGNlcnQgKGFuZC9vciBzZWxmLXNpZ25lZCBjZXJ0cykuCgogICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyB3aWxsIGJlIGFibGUgdG8gdXNlIGFsbCBvZiB0aGVzZSBjZXJ0IGFuZAogICAgICAgICAgICAgICAgICAgICAgIGtleSBmaWxlcy4gIE9uIHRoZSBWTkMgY2xpZW50IHNpZGUsIHRoZXkgd2lsbCBuZWVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgYmUgImltcG9ydGVkIiBzb21laG93LiAgV2ViIGJyb3dzZXJzIGhhdmUgIk1hbmFnZQogICAgICAgICAgICAgICAgICAgICAgIENlcnRpZmljYXRlcyIgYWN0aW9ucyBhcyBkb2VzIHRoZSBKYXZhIGFwcGxldCBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sIFBhbmVsLiAgc3R1bm5lbCBjYW4gYWxzbyB1c2UgdGhlc2UgZmlsZXMgKHNlZQogICAgICAgICAgICAgICAgICAgICAgIHRoZSBzc192bmN2aWV3ZXIgZXhhbXBsZSBzY3JpcHQgaW4gdGhlIEZBUSBhbmQgU1NWTkMuKQoKLXNzbENSTCBwYXRoICAgICAgICAgICBTZXQgdGhlIENlcnRpZmljYXRlIFJldm9jYXRpb24gTGlzdHMgKENSTCkgdG8gInBhdGgiLgogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgc2V0dGluZyBhcHBsaWVzIGZvciBib3RoIC1zc2wgYW5kIC1zdHVubmVsIG1vZGVzLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiBwYXRoIGlzIGEgZmlsZSwgdGhlIGZpbGUgY29udGFpbnMgb25lIG9yIG1vcmUgQ1JMcwogICAgICAgICAgICAgICAgICAgICAgIGluIFBFTSBmb3JtYXQuICBJZiBwYXRoIGlzIGEgZGlyZWN0b3J5LCBpdCBjb250YWlucwogICAgICAgICAgICAgICAgICAgICAgIGhhc2ggbmFtZWQgZmlsZXMgb2YgQ1JMcyBpbiB0aGUgdXN1YWwgT3BlblNTTCBtYW5uZXIuCiAgICAgICAgICAgICAgICAgICAgICAgU2VlIHRoZSBPcGVuU1NMIGFuZCBzdHVubmVsKDgpIGRvY3VtZW50YXRpb24gZm9yCiAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBpbmZvLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBvbmx5IGFwcGxpZXMgaWYgLXNzbHZlcmlmeSBoYXMgYmVlbgogICAgICAgICAgICAgICAgICAgICAgIHN1cHBsaWVkOiBpdCBjaGVja3MgZm9yIHJldm9jYXRpb24gYWxvbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGUgY2hhaW4gdXNlZCB0byB2ZXJpZnkgdGhlIFZOQyBjbGllbnQuCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIC1zc2xDUkwgc2V0dGluZyB3aWxsIGJlIGlnbm9yZWQgd2hlbiAtc3NsdmVyaWZ5IGlzCiAgICAgICAgICAgICAgICAgICAgICAgbm90IHNwZWNpZmllZC4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGlmIGEgQ1JMJ3MgZXhwaXJhdGlvbiBkYXRlIGhhcyBwYXNzZWQsIGFsbAogICAgICAgICAgICAgICAgICAgICAgIFNTTCBjb25uZWN0aW9ucyB3aWxsIGZhaWwgcmVnYXJkbGVzcyBvZiBpZiB0aGV5IGFyZQogICAgICAgICAgICAgICAgICAgICAgIHJlbGF0ZWQgdG8gdGhlIHN1YmplY3Qgb2YgdGhlIENSTCBvciBub3QuCgogICAgICAgICAgICAgICAgICAgICAgIE9ubHkgcmFyZWx5IHdpbGwgb25lJ3MgeDExdm5jIC1zc2wgaW5mcmFzdHJ1Y3R1cmUgYmUgc28KICAgICAgICAgICAgICAgICAgICAgICBsYXJnZSB0aGF0IHRoaXMgb3B0aW9uIHdvdWxkIGJlIHVzZWZ1bCAoc2luY2Ugbm9ybWFsbHkKICAgICAgICAgICAgICAgICAgICAgICBtYWludGFpbmluZyB0aGUgY29udGVudHMgb2YgdGhlIC1zc2x2ZXJpZnkgZmlsZSBvcgogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBzaG91bGQgYmUgZW5vdWdoLikgIEhvd2V2ZXIsIHdoZW4gdXNpbmcKICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgd2l0aCBhIENlcnRpZmljYXRlIEF1dGhvcml0eSAoc2VlIC1zc2xHZW5DQSkKICAgICAgICAgICAgICAgICAgICAgICB0byBhdXRoZW50aWNhdGUgQ2xpZW50cyB2aWEgU1NML1RMUywgdGhlIC1zc2xDUkwgb3B0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWZ1bCB0byByZXZva2UgdXNlcnMnIGNlcnRzIHdob3NlIHByaXZhdGUgU1NMCiAgICAgICAgICAgICAgICAgICAgICAga2V5cyB3ZXJlIGxvc3Qgb3Igc3RvbGVuIChlLmcuIGxhcHRvcC4pICBUaGlzIHdheSBhIG5ldwogICAgICAgICAgICAgICAgICAgICAgIENBIGNlcnQra2V5IGRvZXMgbm90IG5lZWQgdG8gYmUgY3JlYXRlZCBhbmQgbmV3IHNpZ25lZAogICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCBrZXlzIGdlbmVyYXRlZCBhbmQgZGlzdHJpYnV0ZWQgdG8gYWxsIHVzZXJzLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyBjcmVhdGUgYSBDUkwgZmlsZSB3aXRoIHJldm9rZWQgY2VydGlmaWNhdGVzIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzICdvcGVuc3NsIGNhIC1yZXZva2UgLi4uJyBhbmQgJ29wZW5zc2wgY2EKICAgICAgICAgICAgICAgICAgICAgICAtZ2VuY3JsIC4uLicgYXJlIHVzZWZ1bC4gIChSdW4gdGhlbSBpbiB+Ly52bmMvY2VydHMpCgotc3NsR2VuQ0EgW2Rpcl0gICAgICAgIEdlbmVyYXRlIHlvdXIgb3duIENlcnRpZmljYXRlIEF1dGhvcml0eSBwcml2YXRlIGtleSwKICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSwgYW5kIG90aGVyIGZpbGVzIGluIGRpcmVjdG9yeSBbZGlyXS4KICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgdGhlbiBleGl0cy4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgW2Rpcl0gaXMgbm90IHN1cHBsaWVkLCBhIC1zc2xkaXIgc2V0dGluZyBpcyB1c2VkLAogICAgICAgICAgICAgICAgICAgICAgIG9yIG90aGVyd2lzZSB+Ly52bmMvY2VydHMgaXMgdXNlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb21tYW5kIGFsc28gY3JlYXRlcyBkaXJlY3RvcmllcyB3aGVyZSBzZXJ2ZXIgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50IGNlcnRzIGFuZCBrZXlzIHdpbGwgYmUgc3RvcmVkLiAgVGhlIG9wZW5zc2woMSkKICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIG11c3QgYmUgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0gYW5kIGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgIGluIFBBVEguCgogICAgICAgICAgICAgICAgICAgICAgIEFmdGVyIHRoZSBDQSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgYXJlIGNyZWF0ZWQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGNvbW1hbmQgZXhpdHM7IHRoZSBWTkMgc2VydmVyIGlzIG5vdCBydW4uCgogICAgICAgICAgICAgICAgICAgICAgIFlvdSB3aWxsIGJlIHByb21wdGVkIGZvciBpbmZvcm1hdGlvbiB0byBwdXQgaW50byB0aGUgQ0EKICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZS4gIFRoZSBpbmZvIGRvZXMgbm90IGhhdmUgdG8gYmUgYWNjdXJhdGUganVzdAogICAgICAgICAgICAgICAgICAgICAgIGFzIGxvbmcgYXMgY2xpZW50cyBhY2NlcHQgdGhlIGNlcnQgZm9yIFZOQyBjb25uZWN0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgICBZb3Ugd2lsbCBhbHNvIG5lZWQgdG8gc3VwcGx5IGEgcGFzc3BocmFzZSBvZiBhdCBsZWFzdAogICAgICAgICAgICAgICAgICAgICAgIDQgY2hhcmFjdGVycyBmb3IgdGhlIENBIHByaXZhdGUga2V5LgoKICAgICAgICAgICAgICAgICAgICAgICBPbmNlIHlvdSBoYXZlIGdlbmVyYXRlZCB0aGUgQ0EgeW91IGNhbiBkaXN0cmlidXRlCiAgICAgICAgICAgICAgICAgICAgICAgaXRzIGNlcnRpZmljYXRlIHBhcnQsIFtkaXJdL0NBL2NhY2VydC5wZW0sIHRvIG90aGVyCiAgICAgICAgICAgICAgICAgICAgICAgd29ya3N0YXRpb25zIHdoZXJlIFZOQyB2aWV3ZXJzIHdpbGwgYmUgcnVuLiAgT25lIHdpbGwKICAgICAgICAgICAgICAgICAgICAgICBuZWVkIHRvICJpbXBvcnQiIHRoaXMgY2VydGlmaWNhdGUgaW4gdGhlIGFwcGxpY2F0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICBlLmcuIFdlYiBicm93c2VyLCBKYXZhIGFwcGxldCBwbHVnaW4sIHN0dW5uZWwsIGV0Yy4KICAgICAgICAgICAgICAgICAgICAgICBOZXh0LCB5b3UgY2FuIGNyZWF0ZSBhbmQgc2lnbiBrZXlzIHVzaW5nIHRoZSBDQSB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIC1zc2xHZW5DZXJ0IG9wdGlvbiBiZWxvdy4KCiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xHZW5DQQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsR2VuQ0EgIH4vbXlDQWRpcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyAtc3NsZGlyIH4vbXlDQWRpciAtc3NsR2VuQ0EKCiAgICAgICAgICAgICAgICAgICAgICAgKHRoZSBsYXN0IHR3byBsaW5lcyBhcmUgZXF1aXZhbGVudCkKCi1zc2xHZW5DZXJ0IHR5cGUgbmFtZSAgR2VuZXJhdGUgYSBWTkMgc2VydmVyIG9yIGNsaWVudCBjZXJ0aWZpY2F0ZSBhbmQgcHJpdmF0ZQogICAgICAgICAgICAgICAgICAgICAgIGtleSBwYWlyIHNpZ25lZCBieSB0aGUgQ0EgY3JlYXRlZCBwcmV2aW91c2x5IHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAtc3NsR2VuQ0EuICBUaGUgb3BlbnNzbCgxKSBwcm9ncmFtIG11c3QgYmUgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIHN5c3RlbSBhbmQgYXZhaWxhYmxlIGluIFBBVEguCgogICAgICAgICAgICAgICAgICAgICAgIEFmdGVyIHRoZSBDZXJ0aWZpY2F0ZSBpcyBnZW5lcmF0ZWQgeDExdm5jIGV4aXRzOyB0aGUKICAgICAgICAgICAgICAgICAgICAgICBWTkMgc2VydmVyIGlzIG5vdCBydW4uCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSB0eXBlIG9mIGtleSB0byBiZSBnZW5lcmF0ZWQgaXMgdGhlIHN0cmluZyAidHlwZSIuCiAgICAgICAgICAgICAgICAgICAgICAgSXQgaXMgZWl0aGVyICJzZXJ2ZXIiIChpLmUuIGZvciB1c2UgYnkgeDExdm5jKSBvcgogICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQiIChmb3IgYSBWTkMgdmlld2VyKS4gIE5vdGUgdGhhdCB0eXBpY2FsbHkKICAgICAgICAgICAgICAgICAgICAgICBvbmx5ICJzZXJ2ZXIiIGlzIHVzZWQ6IHRoZSBWTkMgY2xpZW50cyBhdXRoZW50aWNhdGUKICAgICAgICAgICAgICAgICAgICAgICB0aGVtc2VsdmVzIGJ5IGEgbm9uLXB1YmxpYy1rZXkgbWV0aG9kIChlLmcuIFZOQyBvcgogICAgICAgICAgICAgICAgICAgICAgIHVuaXggcGFzc3dvcmQpLiAgInR5cGUiIGlzIHJlcXVpcmVkLgoKICAgICAgICAgICAgICAgICAgICAgICBBbiBhcmJpdHJhcnkgZGVmYXVsdCBuYW1lIHlvdSB3YW50IHRvIGFzc29jaWF0ZSB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGtleSBpcyBzdXBwbGllZCBieSB0aGUgIm5hbWUiIHN0cmluZy4gIFlvdSBjYW4KICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2UgaXQgYXQgdGhlIHZhcmlvdXMgcHJvbXB0cyB3aGVuIGNyZWF0aW5nIHRoZSBrZXkuCiAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiIGlzIG9wdGlvbmFsLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiBuYW1lIGlzIGxlZnQgYmxhbmsgZm9yIGNsaWVudHMga2V5cyB0aGVuICJub2JvZHkiCiAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZC4gIElmIGxlZnQgYmxhbmsgZm9yIHNlcnZlciBrZXlzLCB0aGVuIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgc2VydmVyIGtleTogInNlcnZlci5wZW0iIGlzIGNyZWF0ZWQgKHRoaXMKICAgICAgICAgICAgICAgICAgICAgICBpcyB0aGUgc2F2ZWQgb25lIHJlZmVyZW5jZWQgYnkgIi1zc2wgU0FWRSIgd2hlbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIgaXMgc3RhcnRlZCkKCiAgICAgICAgICAgICAgICAgICAgICAgSWYgIm5hbWUiIGJlZ2lucyB3aXRoIHRoZSBzdHJpbmcgInNlbGY6IiB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgYSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBpcyBjcmVhdGVkIGluc3RlYWQgb2Ygb25lCiAgICAgICAgICAgICAgICAgICAgICAgc2lnbmVkIGJ5IHlvdXIgQ0Ega2V5LgoKICAgICAgICAgICAgICAgICAgICAgICBJZiAibmFtZSIgYmVnaW5zIHdpdGggdGhlIHN0cmluZyAicmVxOiIgdGhlbiBvbmx5IGEKICAgICAgICAgICAgICAgICAgICAgICBrZXkgKC5rZXkpIGFuZCBhIGNlcnRpZmljYXRlIHNpZ25pbmcgKnJlcXVlc3QqICgucmVxKQogICAgICAgICAgICAgICAgICAgICAgIGFyZSBnZW5lcmF0ZWQuICBZb3UgY2FuIHRoZW4gc2VuZCB0aGUgLnJlcSBmaWxlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgYW4gZXh0ZXJuYWwgQ0EgKGV2ZW4gYSBwcm9mZXNzaW9uYWwgb25lLCBlLmcuIFRoYXd0ZSkKICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBjb21iaW5lIHRoZSAua2V5IGFuZCB0aGUgcmVjZWl2ZWQgY2VydCBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIC5wZW0gZmlsZSB3aXRoIHRoZSBzYW1lIGJhc2VuYW1lLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGlzdGluY3Rpb24gYmV0d2VlbiAic2VydmVyIiBhbmQgImNsaWVudCIgaXMKICAgICAgICAgICAgICAgICAgICAgICBzaW1wbHkgdGhlIGNob2ljZSBvZiBvdXRwdXQgZmlsZW5hbWVzIGFuZCBzdWItZGlyZWN0b3J5LgogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWFrZXMgaXQgc28gdGhlIC1zc2wgU0FWRS1uYW1lIG9wdGlvbiBjYW4gZWFzaWx5CiAgICAgICAgICAgICAgICAgICAgICAgcGljayB1cCB0aGUgeDExdm5jIFBFTSBmaWxlIHRoaXMgb3B0aW9uIGdlbmVyYXRlcy4KICAgICAgICAgICAgICAgICAgICAgICBBbmQgc2ltaWxhcmx5IG1ha2VzIGl0IGVhc3kgZm9yIHRoZSAtc3NsdmVyaWZ5IG9wdGlvbgogICAgICAgICAgICAgICAgICAgICAgIHRvIHBpY2sgdXAgeW91ciBjbGllbnQgY2VydHMuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGlzIG5vdGhpbmcgc3BlY2lhbCBhYm91dCB0aGUgZmlsZW5hbWUgb3IgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gb2YgZWl0aGVyIHRoZSAic2VydmVyIiBhbmQgImNsaWVudCIgY2VydHMuCiAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiByZW5hbWUgdGhlIGZpbGVzIG9yIG1vdmUgdGhlbSB0byB3aGVyZXZlcgogICAgICAgICAgICAgICAgICAgICAgIHlvdSBsaWtlLgoKICAgICAgICAgICAgICAgICAgICAgICBQcmVjZWRlIHRoaXMgb3B0aW9uIHdpdGggLXNzbGRpciBbZGlyXSB0byB1c2UgYQogICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBvdGhlciB0aGFuIHRoZSBkZWZhdWx0IH4vLnZuYy9jZXJ0cyBZb3Ugd2lsbAogICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gcnVuIC1zc2xHZW5DQSBvbiB0aGF0IGRpcmVjdG9yeSBmaXJzdCBiZWZvcmUKICAgICAgICAgICAgICAgICAgICAgICBkb2luZyBhbnkgLXNzbEdlbkNlcnQga2V5IGNyZWF0aW9uLgoKICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHlvdSBjYW5ub3QgcmVjcmVhdGUgYSBjZXJ0IHdpdGggZXhhY3RseSB0aGUgc2FtZQogICAgICAgICAgICAgICAgICAgICAgIGRpc3RpZ3Vpc2hlZCBuYW1lIChETikgYXMgYW4gZXhpc3Rpbmcgb25lLiAgVG8gZG8gc28sCiAgICAgICAgICAgICAgICAgICAgICAgeW91IHdpbGwgbmVlZCB0byBlZGl0IHRoZSBbZGlyXS9DQS9pbmRleC50eHQgZmlsZSB0bwogICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGUgbGluZS4KCiAgICAgICAgICAgICAgICAgICAgICAgU2ltaWxhciB0byAtc3NsR2VuQ0EsIHlvdSB3aWxsIGJlIHByb21wdGVkIHRvIGZpbGwKICAgICAgICAgICAgICAgICAgICAgICBpbiBzb21lIGluZm9ybWF0aW9uIHRoYXQgd2lsbCBiZSByZWNvcmRlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZSB3aGVuIGl0IGlzIGNyZWF0ZWQuCgogICAgICAgICAgICAgICAgICAgICAgIFRpcDogaWYgeW91IGtub3cgdGhlIGZ1bGx5LXF1YWxpZmllZCBob3N0bmFtZSBvdGhlcgogICAgICAgICAgICAgICAgICAgICAgIHBlb3BsZSB3aWxsIGJlIGNvbm5lY3RpbmcgdG8sIHlvdSBjYW4gdXNlIHRoYXQgYXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uTmFtZSAiQ04iIHRvIGF2b2lkIHNvbWUgYXBwbGljYXRpb25zIChlLmcuIHdlYgogICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXJzIGFuZCBqYXZhIHBsdWdpbikgY29tcGxhaW5pbmcgdGhhdCBpdCBkb2VzIG5vdAogICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHRoZSBob3N0bmFtZS4KCiAgICAgICAgICAgICAgICAgICAgICAgWW91IHdpbGwgYWxzbyBuZWVkIHRvIHN1cHBseSB0aGUgQ0EgcHJpdmF0ZSBrZXkKICAgICAgICAgICAgICAgICAgICAgICBwYXNzcGhyYXNlIHRvIHVubG9jayB0aGUgcHJpdmF0ZSBrZXkgY3JlYXRlZCBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgLXNzbEdlbkNBLiAgVGhpcyBwcml2YXRlIGtleSBpcyB1c2VkIHRvIHNpZ24gdGhlIHNlcnZlcgogICAgICAgICAgICAgICAgICAgICAgIG9yIGNsaWVudCBjZXJ0aWZpY2F0ZS4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlICJzZXJ2ZXIiIGNlcnRzIGNhbiBiZSB1c2VkIGJ5IHgxMXZuYyBkaXJlY3RseSBieQogICAgICAgICAgICAgICAgICAgICAgIHBvaW50aW5nIHRvIHRoZW0gdmlhIHRoZSAtc3NsIFtwZW1dIG9wdGlvbi4gIFRoZSBkZWZhdWx0CiAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB3aWxsIGJlIH4vLnZuYy9jZXJ0cy9zZXJ2ZXIucGVtLiAgVGhpcyBvbmUgd291bGQKICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIGJ5IHNpbXBseSB0eXBpbmcgLXNzbCBTQVZFLiAgVGhlIHBlbSBmaWxlCiAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgYm90aCB0aGUgY2VydGlmaWNhdGUgYW5kIHRoZSBwcml2YXRlIGtleS4KICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuY3J0IGZpbGUgY29udGFpbnMgdGhlIGNlcnQgb25seS4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlICJjbGllbnQiIGNlcnQgKyBwcml2YXRlIGtleSBmaWxlIHdpbGwgbmVlZAogICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGNvcGllZCBhbmQgaW1wb3J0ZWQgaW50byB0aGUgVk5DIHZpZXdlcgogICAgICAgICAgICAgICAgICAgICAgIHNpZGUgYXBwbGljYXRpb25zIChXZWIgYnJvd3NlciwgSmF2YSBwbHVnaW4sCiAgICAgICAgICAgICAgICAgICAgICAgc3R1bm5lbCwgZXRjLikgIE9uY2UgdGhhdCBpcyBkb25lIHlvdSBjYW4gZGVsZXRlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICJjbGllbnQiIHByaXZhdGUga2V5IGZpbGUgb24gdGhpcyBtYWNoaW5lIHNpbmNlCiAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgb25seSBuZWVkZWQgb24gdGhlIFZOQyB2aWV3ZXIgc2lkZS4gIFRoZSwKICAgICAgICAgICAgICAgICAgICAgICBlLmcuIH4vLnZuYy9jZXJ0cy9jbGllbnRzLzxuYW1lPi5wZW0gY29udGFpbnMgYm90aAogICAgICAgICAgICAgICAgICAgICAgIHRoZSBjZXJ0IGFuZCBwcml2YXRlIGtleS4gIFRoZSA8bmFtZT4uY3J0IGNvbnRhaW5zIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGNlcnRpZmljYXRlIG9ubHkuCgogICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IEl0IGlzIHZlcnkgaW1wb3J0YW50IHRvIGtub3cgb25lIHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlIG5ldyBrZXlzIHdpdGggYSBwYXNzcGhyYXNlLiAgT3RoZXJ3aXNlIGlmIGFuCiAgICAgICAgICAgICAgICAgICAgICAgdW50cnVzdGVkIHVzZXIgc3RlYWxzIHRoZSBrZXkgZmlsZSBoZSBjb3VsZCB1c2UgaXQgdG8KICAgICAgICAgICAgICAgICAgICAgICBtYXNxdWVyYWRlIGFzIHRoZSB4MTF2bmMgc2VydmVyIChvciBWTkMgdmlld2VyIGNsaWVudCkuCiAgICAgICAgICAgICAgICAgICAgICAgWW91IHdpbGwgYmUgcHJvbXB0ZWQgd2hldGhlciB0byBlbmNyeXB0IHRoZSBrZXkgd2l0aAogICAgICAgICAgICAgICAgICAgICAgIGEgcGFzc3BocmFzZSBvciBub3QuICBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkby4KICAgICAgICAgICAgICAgICAgICAgICBPbmUgaW5jb252ZW5pZW5jZSB0byBhIHBhc3NwaHJhc2UgaXMgdGhhdCBpdCBtdXN0CiAgICAgICAgICAgICAgICAgICAgICAgYmUgdHlwZWQgaW4gRVZFUlkgdGltZSB4MTF2bmMgb3IgdGhlIGNsaWVudCBhcHAgaXMKICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkIHVwLgoKICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbEdlbkNlcnQgc2VydmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbCBTQVZFIC1kaXNwbGF5IDowIC4uLgoKICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlbiBvbiB2aWV3ZXIgdXNpbmcgc3Nfdm5jdmlld2VyIHN0dW5uZWwgd3JhcHBlcgogICAgICAgICAgICAgICAgICAgICAgIChzZWUgdGhlIEZBUSk6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzc192bmN2aWV3ZXIgLXZlcmlmeSAuL2NhY2VydC5jcnQgaG9zdG5hbWU6MAoKICAgICAgICAgICAgICAgICAgICAgICAodGhpcyBhc3N1bWVzIHRoZSBjYWNlcnQuY3J0IGNlcnQgZnJvbSAtc3NsR2VuQ0EKICAgICAgICAgICAgICAgICAgICAgICB3YXMgc2FmZWx5IGNvcGllZCB0byB0aGUgVk5DIHZpZXdlciBtYWNoaW5lIHdoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgc3Nfdm5jdmlld2VyIGlzIHJ1bikKCiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZSB1c2luZyBhIG5hbWU6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xHZW5DZXJ0IHNlcnZlciBjaGFybGllCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbCBTQVZFLWNoYXJsaWUgLWRpc3BsYXkgOjAgLi4uCgogICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGUgZm9yIGEgY2xpZW50IGNlcnRpZmljYXRlIChyYXJlbHkgdXNlZCk6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIC1zc2xHZW5DZXJ0IGNsaWVudCByb2dlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NwIH4vLnZuYy9jZXJ0cy9jbGllbnRzL3JvZ2VyLnBlbSBzb21laG9zdDouCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBybSAgfi8udm5jL2NlcnRzL2NsaWVudHMvcm9nZXIucGVtCgogICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBpcyB0aGVuIHN0YXJ0ZWQgd2l0aCB0aGUgb3B0aW9uIC1zc2x2ZXJpZnkKICAgICAgICAgICAgICAgICAgICAgICB+Ly52bmMvY2VydHMvY2xpZW50cy9yb2dlci5jcnQgKG9yIHNpbXBseSAtc3NsdmVyaWZ5CiAgICAgICAgICAgICAgICAgICAgICAgcm9nZXIpLCBhbmQgb24gdGhlIHZpZXdlciB1c2VyIG9uIHNvbWVob3N0IGNvdWxkIGRvCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Nfdm5jdmlld2VyIC1teWNlcnQgLi9yb2dlci5wZW0gaG9zdG5hbWU6MAoKICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugc2V0IHRoZSBlbnYuIHZhciBSRVFfQVJHUz0nLi4uJyBpdCB3aWxsIGJlCiAgICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIHRvIG9wZW5zc2wgcmVxKDEpLiAgQSBjb21tb24gdXNlIHdvdWxkIGJlCiAgICAgICAgICAgICAgICAgICAgICAgUkVRX0FSR1M9Jy1kYXlzIDEwOTUnIHRvIGJ1bXAgdXAgdGhlIGV4cGlyYXRpb24gZGF0ZQogICAgICAgICAgICAgICAgICAgICAgICgzIHllYXJzIGluIHRoaXMgY2FzZSkuCgotc3NsRW5jS2V5IHBlbSAgICAgICAgIFV0aWxpdHkgdG8gZW5jcnlwdCBhbiBleGlzdGluZyBQRU0gZmlsZSB3aXRoIGEKICAgICAgICAgICAgICAgICAgICAgICBwYXNzcGhyYXNlIHlvdSBzdXBwbHkgd2hlbiBwcm9tcHRlZC4gIEZvciB0aGF0IGtleSB0byBiZQogICAgICAgICAgICAgICAgICAgICAgIHVzZWQgKGUuZy4gYnkgeDExdm5jKSB0aGUgcGFzc3BocmFzZSBtdXN0IGJlIHN1cHBsaWVkCiAgICAgICAgICAgICAgICAgICAgICAgZWFjaCB0aW1lLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgIlNBVkUiIG5vdGF0aW9uIGRlc2NyaWJlZCB1bmRlciAtc3NsIGFwcGxpZXMgYXMKICAgICAgICAgICAgICAgICAgICAgICB3ZWxsLiAocHJlY2VkZSB0aGlzIG9wdGlvbiB3aXRoIC1zc2xkaXIgW2Rpcl0gdG8gcmVmZXIKICAgICAgICAgICAgICAgICAgICAgICBhIGRpcmVjdG9yeSBiZXNpZGVzIHRoZSBkZWZhdWx0IH4vLnZuYy9jZXJ0cykKCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIG9wZW5zc2woMSkgcHJvZ3JhbSBtdXN0IGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGF2YWlsYWJsZSBpbiBQQVRILiAgQWZ0ZXIgdGhlIEtleSBmaWxlIGlzIGVuY3J5cHRlZAogICAgICAgICAgICAgICAgICAgICAgIHRoZSB4MTF2bmMgY29tbWFuZCBleGl0czsgdGhlIFZOQyBzZXJ2ZXIgaXMgbm90IHJ1bi4KCiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbEVuY0tleSAvcGF0aC90by9mb28ucGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbEVuY0tleSBTQVZFCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgLXNzbEVuY0tleSBTQVZFLWNoYXJsaWUKCi1zc2xDZXJ0SW5mbyBwZW0gICAgICAgUHJpbnRzIG91dCBpbmZvcm1hdGlvbiBhYm91dCBhbiBleGlzdGluZyBQRU0gZmlsZS4KICAgICAgICAgICAgICAgICAgICAgICBJbiBhZGRpdGlvbiB0aGUgcHVibGljIGNlcnRpZmljYXRlIGlzIGFsc28gcHJpbnRlZC4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgb3BlbnNzbCgxKSBwcm9ncmFtIG11c3QgYmUgaW4gUEFUSC4gQmFzaWNhbGx5IHRoZQogICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgIm9wZW5zc2wgeDUwOSAtdGV4dCIgaXMgcnVuIG9uIHRoZSBwZW0uCgogICAgICAgICAgICAgICAgICAgICAgIEFmdGVyIHRoZSBpbmZvIGlzIHByaW50ZWQgdGhlIHgxMXZuYyBjb21tYW5kIGV4aXRzOwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBWTkMgc2VydmVyIGlzIG5vdCBydW4uCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSAiU0FWRSIgbm90YXRpb24gZGVzY3JpYmVkIHVuZGVyIC1zc2wgYXBwbGllcwogICAgICAgICAgICAgICAgICAgICAgIGFzIHdlbGwuCgogICAgICAgICAgICAgICAgICAgICAgIFVzaW5nICAiTElTVCIgd2lsbCBnaXZlIGEgbGlzdCBvZiBhbGwgY2VydHMgYmVpbmcKICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkIChpbiB0aGUgfi8udm5jL2NlcnRzIGRpciwgdXNlIC1zc2xkaXIgdG8gcmVmZXIKICAgICAgICAgICAgICAgICAgICAgICB0byBhbm90aGVyIGRpcikuICAiQUxMIiB3aWxsIHByaW50IG91dCB0aGUgaW5mbyBmb3IKICAgICAgICAgICAgICAgICAgICAgICBldmVyeSBtYW5hZ2VkIGtleSAodGhpcyBjYW4gYmUgdmVyeSBsb25nKS4gIEdpdmluZyBhCiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50IG9yIHNlcnZlciBjZXJ0IHNob3J0bmFtZSB3aWxsIGFsc28gdHJ5IGEgbG9va3VwCiAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gLXNzbENlcnRJbmZvIGNoYXJsaWUpLiAgVXNlICJMSVNUTCIgb3IgIkxMIgogICAgICAgICAgICAgICAgICAgICAgIGZvciBhIGxvbmcgKGxzIC1sIHN0eWxlKSBsaXN0aW5nLgoKICAgICAgICAgICAgICAgICAgICAgICBVc2luZyAiSEFTSE9OIiB3aWxsIGNyZWF0ZSBzdWJkaXJzIFtkaXJdL0hBU0ggYW5kCiAgICAgICAgICAgICAgICAgICAgICAgW2Rpcl0vSEFTSCB3aXRoIE9wZW5TU0wgaGFzaCBmaWxlbmFtZXMgKGUuZy4gMGQ1ZmJiZjEuMCkKICAgICAgICAgICAgICAgICAgICAgICBzeW1saW5rcyBwb2ludGluZyB1cCB0byB0aGUgY29ycmVzcG9uZGluZyAqLmNydCBmaWxlLgogICAgICAgICAgICAgICAgICAgICAgIChbZGlyXSBpcyB+Ly52bmMvY2VydHMgb3Igb25lIGdpdmVuIGJ5IC1zc2xkaXIuKQogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSB1c2VmdWwgd2F5IGZvciBvdGhlciBPcGVuU1NMIGFwcGxpY2F0aW9ucwogICAgICAgICAgICAgICAgICAgICAgIChlLmcuIHN0dW5uZWwpIHRvIGFjY2VzcyBhbGwgb2YgdGhlIGNlcnRzIHdpdGhvdXQKICAgICAgICAgICAgICAgICAgICAgICBoYXZpbmcgdG8gY29uY2F0ZW5hdGUgdGhlbS4gIHgxMXZuYyB3aWxsIG5vdCB1c2UgdGhlbQogICAgICAgICAgICAgICAgICAgICAgIHVubGVzcyB5b3Ugc3BlY2lmaWNhbGx5IHJlZmVyZW5jZSB0aGVtLiAgIkhBU0hPRkYiCiAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlcyB0aGVzZSBIQVNIIHN1YmRpcnMuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBMSVNULCBMSVNUTCwgTEwsIEFMTCwgSEFTSE9OLCBIQVNIT0ZGIHdvcmRzIGNhbgogICAgICAgICAgICAgICAgICAgICAgIGFsc28gYmUgbG93ZXJjYXNlLCBlLmcuICJsaXN0Ii4KCi1zc2xEZWxDZXJ0IHBlbSAgICAgICAgUHJvbXB0cyB5b3UgdG8gZGVsZXRlIGFsbCAuY3J0IC5wZW0gLmtleSAucmVxIGZpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCB3aXRoIFtwZW1dLiAgeDExdm5jIHRoZW4gZXhpdHMuICJTQVZFIgogICAgICAgICAgICAgICAgICAgICAgIGFuZCBsb29rdXBzIGFzIGluIC1zc2xDZXJ0SW5mbyBhcHBseSBhcyB3ZWxsLgoKLXNzbFNjcmlwdHMgICAgICAgICAgICBQcmludHMgb3V0IGJvdGggdGhlICdnZW5DQScgYW5kICdnZW5DZXJ0JyB4MTF2bmMKICAgICAgICAgICAgICAgICAgICAgICBvcGVuc3NsIHdyYXBwZXIgc2NyaXB0cyBmb3IgeW91IHRvIGV4YW1pbmUsIG1vZGlmeSwgZXRjLgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBzY3JpcHRzIGFyZSBwcmludGVkIHRvIHN0ZG91dCBhbmQgdGhlbiB0aGUgeDExdm5jCiAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSBleGl0cy4KCgotc3R1bm5lbCBbcGVtXSAgICAgICAgIFVzZSB0aGUgc3R1bm5lbCg4KSAoc3R1bm5lbC5taXJ0Lm5ldCkgdG8gcHJvdmlkZSBhbgogICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZCBTU0wgdHVubmVsIGJldHdlZW4gdmlld2VycyBhbmQgeDExdm5jLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGV4dGVybmFsIHR1bm5lbCBtZXRob2Qgd2FzIGltcGxlbWVudGVkIHByaW9yIHRvIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGludGVncmF0ZWQgLXNzbCBlbmNyeXB0aW9uIGRlc2NyaWJlZCBhYm92ZS4gIEl0IHN0aWxsCiAgICAgICAgICAgICAgICAgICAgICAgd29ya3Mgd2VsbCBhbmQgYXZvaWRzIHRoZSByZXF1aXJlbWVudCBvZiBsaW5raW5nIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICB0aGUgT3BlblNTTCBsaWJyYXJpZXMuICBUaGlzIG1vZGUgcmVxdWlyZXMgc3R1bm5lbAogICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGluc3RhbGxlZCBvbiB0aGUgc3lzdGVtIGFuZCBhdmFpbGFibGUgdmlhIFBBVEgKICAgICAgICAgICAgICAgICAgICAgICAobi5iLiBzdHVubmVsIGlzIG9mdGVuIGluc3RhbGxlZCBpbiBzYmluIGRpcmVjdG9yaWVzKS4KICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDQueCBvZiBzdHVubmVsIGlzIGFzc3VtZWQgKGJ1dCBzZWUgLXN0dW5uZWwzCiAgICAgICAgICAgICAgICAgICAgICAgYmVsb3cuKQoKICAgICAgICAgICAgICAgICAgICAgICBbcGVtXSBpcyBvcHRpb25hbCwgdXNlICItc3R1bm5lbCAvcGF0aC90by9zdHVubmVsLnBlbSIKICAgICAgICAgICAgICAgICAgICAgICB0byBzcGVjaWZ5IGEgUEVNIGNlcnRpZmljYXRlIGZpbGUgdG8gcGFzcyB0byBzdHVubmVsLgogICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgLXNzbCBvcHRpb24gZm9yIG1vcmUgaW5mbyBvbiBjZXJ0aWZpY2F0ZSBmaWxlcy4KCiAgICAgICAgICAgICAgICAgICAgICAgV2hldGhlciBvciBub3QgeW91ciBzdHVubmVsIGhhcyBpdHMgb3duIGNlcnRpZmljYXRlCiAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kcyBvbiB5b3VyIHN0dW5uZWwgY29uZmlndXJhdGlvbjsgc3R1bm5lbCBvZnRlbgogICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlcyBvbmUgYXQgaW5zdGFsbCB0aW1lLiAgU2VlIHlvdXIgc3R1bm5lbAogICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuICBJbiBhbnkgZXZlbnQsIGlmIHlvdSB3YW50IHRvCiAgICAgICAgICAgICAgICAgICAgICAgdXNlIHRoaXMgY2VydGlmaWNhdGUgeW91IG11c3Qgc3VwcGx5IHRoZSBmdWxsIHBhdGggdG8gaXQKICAgICAgICAgICAgICAgICAgICAgICBhcyBbcGVtXS4gIE5vdGU6IHRoZSBmaWxlIG1heSBvbmx5IGJlIHJlYWRhYmxlIGJ5IHJvb3QuCgogICAgICAgICAgICAgICAgICAgICAgIFtwZW1dIG1heSBhbHNvIGJlIHRoZSBzcGVjaWFsIHN0cmluZ3MgIlRNUCIsICJTQVZFIiwKICAgICAgICAgICAgICAgICAgICAgICBhbmQgIlNBVkUuLi4iIGFzIGRlc2NyaWJlZCBpbiB0aGUgLXNzbCBvcHRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgSWYgW3BlbV0gaXMgbm90IHN1cHBsaWVkLCAiU0FWRSIgaXMgYXNzdW1lZC4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBWZU5DcnlwdCwgQU5PTlRMUywgYW5kICJBTk9OIiBtb2RlcwogICAgICAgICAgICAgICAgICAgICAgIGFyZSBub3Qgc3VwcG9ydGVkIGluIC1zdHVubmVsIG1vZGUuCgogICAgICAgICAgICAgICAgICAgICAgIHN0dW5uZWwgaXMgc3RhcnRlZCB1cCBhcyBhIGNoaWxkIHByb2Nlc3Mgb2YgeDExdm5jIGFuZAogICAgICAgICAgICAgICAgICAgICAgIGFueSBTU0wgY29ubmVjdGlvbnMgc3R1bm5lbCByZWNlaXZlcyBhcmUgZGVjcnlwdGVkIGFuZAogICAgICAgICAgICAgICAgICAgICAgIHNlbnQgdG8geDExdm5jIG92ZXIgYSBsb2NhbCBzb2NrZXQuICBUaGUgc3RyaW5ncwogICAgICAgICAgICAgICAgICAgICAgICJUaGUgU1NMIFZOQyBkZXNrdG9wIGlzIC4uLiIgYW5kICJTU0xQT1JUPS4uLiIKICAgICAgICAgICAgICAgICAgICAgICBhcmUgcHJpbnRlZCBvdXQgYXQgc3RhcnR1cCB0byBpbmRpY2F0ZSB0aGlzLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgLWxvY2FsaG9zdCBvcHRpb24gaXMgZW5mb3JjZWQgYnkgZGVmYXVsdCB0byBhdm9pZAogICAgICAgICAgICAgICAgICAgICAgIHBlb3BsZSByb3V0aW5nIGFyb3VuZCB0aGUgU1NMIGNoYW5uZWwuICBVc2UgLWVudgogICAgICAgICAgICAgICAgICAgICAgIFNUVU5ORUxfRElTQUJMRV9MT0NBTEhPU1Q9MSB0byBkaXNhYmxlIHRoaXMgc2VjdXJpdHkKICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlbWVudC4KCiAgICAgICAgICAgICAgICAgICAgICAgU2V0IC1lbnYgU1RVTk5FTF9ERUJVRz0xIGZvciBtb3JlIGRlYnVnZ2luZyBwcmludG91dC4KCiAgICAgICAgICAgICAgICAgICAgICAgU2V0IC1lbnYgU1RVTk5FTF9QUk9HPXh4eCB0byB0aGUgZnVsbCBwYXRoIG9mIHN0dW5uZWwKICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIHlvdSB3YW50IHRvIGJlIHVzZWQgKGUuZy4gL3Vzci9iaW4vc3R1bm5lbDQpLgoKICAgICAgICAgICAgICAgICAgICAgICBTZXQgLWVudiBTVFVOTkVMX0xJU1RFTj14eHggdG8gdGhlIGFkZHJlc3Mgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yayBpbnRlcmZhY2UgdG8gbGlzdGVuIG9uICh0aGUgZGVmYXVsdCBpcyB0byBsaXN0ZW4KICAgICAgICAgICAgICAgICAgICAgICBvbiBhbGwgaW50ZXJmYWNlcyksIGUuZy4gU1RVTk5FTF9MSVNURU49MTkyLjE2OC4xLjEwMC4KCiAgICAgICAgICAgICAgICAgICAgICAgQSBzaW1wbGUgd2F5IHRvIGFkZCBJUHY2IHN1cHBvcnQgaXMgU1RVTk5FTF9MSVNURU49OjoKCiAgICAgICAgICAgICAgICAgICAgICAgWW91ciBWTkMgdmlld2VyIHdpbGwgYWxzbyBuZWVkIHRvIGJlIGFibGUgdG8gY29ubmVjdAogICAgICAgICAgICAgICAgICAgICAgIHZpYSBTU0wuICBVbmZvcnR1bmF0ZWx5IG5vdCB0b28gbWFueSBkbyB0aGlzLiAgU2VlIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IFNTTCB2aWV3ZXJzIHVuZGVyIHRoZSAtc3NsIG9wdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgeDExdm5jIHByb2plY3QncyBTU1ZOQyBpcyBhbiBvcHRpb24uCgogICAgICAgICAgICAgICAgICAgICAgIEFsc28sIGluIHRoZSB4MTF2bmMgZGlzdHJpYnV0aW9uLCBwYXRjaGVkIFRpZ2h0Vk5DCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIFVsdHJhVk5DIEphdmEgYXBwbGV0IGphciBmaWxlcyBhcmUgcHJvdmlkZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICB0aGUgY2xhc3Nlcy9zc2wgZGlyZWN0b3J5IHRoYXQgZG8gU1NMIGNvbm5lY3Rpb25zLgogICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZSBzZXJ2aW5nIHRoZW0gd2l0aCB0aGUgLWh0dHAsIC1odHRwX3NzbCwgb3IKICAgICAgICAgICAgICAgICAgICAgICAtaHR0cGRpciAoc2VlIHRoZSBvcHRpb24gZGVzY3JpcHRpb25zIGZvciBtb3JlIGluZm8uKQoKICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgZm9yIHRoZSBKYXZhIHZpZXdlciBhcHBsZXQgdXNhZ2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIj9QT1JUPXh4eHgiIGluIHRoZSB2YXJpb3VzIFVSTHMgcHJpbnRlZCBhdCBzdGFydHVwCiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBuZWVkIHRvIGJlIHN1cHBsaWVkIHRvIHRoZSB3ZWIgYnJvd3NlciB0byBjb25uZWN0CiAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVybHkuCgogICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSB0aGUgYXV0b21hdGljICJzaW5nbGUgcG9ydCIgSFRUUFMgbW9kZSBvZgogICAgICAgICAgICAgICAgICAgICAgIC1zc2wgaXMgbm90IGZ1bGx5IHN1cHBvcnRlZCBpbiAtc3R1bm5lbCBtb2RlLiAgSG93ZXZlciwKICAgICAgICAgICAgICAgICAgICAgICBpdCBjYW4gYmUgZW11bGF0ZWQgdmlhOgoKICAgICAgICAgICAgICAgICAgICAgICAgICUgeDExdm5jIC1zdHVubmVsIC1odHRwX3NzbCAtaHR0cF9vbmVwb3J0IC4uLgoKICAgICAgICAgICAgICAgICAgICAgICBJbiBnZW5lcmFsLCBpdCBpcyBhbHNvIG5vdCB0b28gZGlmZmljdWx0IHRvIHNldCB1cAogICAgICAgICAgICAgICAgICAgICAgIGFuIHN0dW5uZWwgb3Igb3RoZXIgU1NMIHR1bm5lbCBvbiB0aGUgdmlld2VyIHNpZGUuCiAgICAgICAgICAgICAgICAgICAgICAgQSBzaW1wbGUgZXhhbXBsZSBvbiBVbml4IHVzaW5nIHN0dW5uZWwgMy54IGlzOgoKICAgICAgICAgICAgICAgICAgICAgICAgICUgc3R1bm5lbCAtYyAtZCBsb2NhbGhvc3Q6NTkwMSAtciByZW1vdGVob3N0OjU5MDAKICAgICAgICAgICAgICAgICAgICAgICAgICUgdm5jdmlld2VyIGxvY2FsaG9zdDoxCgogICAgICAgICAgICAgICAgICAgICAgIEZvciBXaW5kb3dzLCBzdHVubmVsIGhhcyBiZWVuIHBvcnRlZCB0byBpdCBhbmQgdGhlcmUKICAgICAgICAgICAgICAgICAgICAgICBhcmUgcHJvYmFibHkgb3RoZXIgc3VjaCB0b29scyBhdmFpbGFibGUuICBTZWUgdGhlIEZBUQogICAgICAgICAgICAgICAgICAgICAgIGFuZCBTU1ZOQyBmb3IgbW9yZSBleGFtcGxlcy4KCi1zdHVubmVsMyAgW3BlbV0gICAgICAgVXNlIHZlcnNpb24gMy54IHN0dW5uZWwgY29tbWFuZCBsaW5lIHN5bnRheCBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiA0LnguICBUaGUgLWh0dHAvLWh0dHBkaXIgSmF2YSBhcHBsZXQgc2VydmluZwogICAgICAgICAgICAgICAgICAgICAgIGlzIGN1cnJlbnRseSBub3QgYXZhaWxhYmxlIGluIHRoaXMgbW9kZS4KCi1lbmMgY2lwaGVyOmtleWZpbGUgICAgVXNlIHN5bW1ldHJpYyBlbmNyeXB0aW9uIHdpdGggY2lwaGVyICJjaXBoZXIiCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNlY3JldCBrZXkgZGF0YSBpbiAia2V5ZmlsZSIuICBJZiBrZXlmaWxlIGlzCiAgICAgICAgICAgICAgICAgICAgICAgcHc9PHN0cmluZz4gdGhlbiAic3RyaW5nIiBpcyB1c2VkIGFzIHRoZSBrZXkgZGF0YS4KCiAgICAgICAgICAgICAgICAgICAgICAgTk9URTogSXQgaXMgcmVjb21tZW5kZWQgdGhhdCB5b3UgdXNlIFNTTCB2aWEgdGhlIC1zc2wKICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gaW5zdGVhZCBvZiB0aGlzIG9wdGlvbiBiZWNhdXNlIFNTTCBpcyB3ZWxsCiAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJzdG9vZCBhbmQgdGFrZXMgZ3JlYXQgY2FyZSB0byBlc3RhYmxpc2ggdW5pcXVlCiAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBrZXlzIGFuZCBpcyBtb3JlIGNvbXBhdGlibGUgd2l0aCBvdGhlciBzb2Z0d2FyZS4KICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhpcyBvcHRpb24gaWYgeW91IGRvIG5vdCB3YW50IHRvIGRlYWwgd2l0aCBTU0wKICAgICAgICAgICAgICAgICAgICAgICBjZXJ0aWZpY2F0ZXMgZm9yIGF1dGhlbnRpY2F0aW9uIGFuZCBkbyBub3Qgd2FudCB0bwogICAgICAgICAgICAgICAgICAgICAgIHVzZSBTU0ggYnV0IHdhbnQgc29tZSBlbmNyeXB0aW9uIGZvciB5b3VyIFZOQyBzZXNzaW9uLgogICAgICAgICAgICAgICAgICAgICAgIE9yIGlmIHlvdSBtdXN0IGludGVyZmFjZSB3aXRoIGEgc3ltbWV0cmljIGtleSB0dW5uZWwKICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHlvdSBkbyBub3QgaGF2ZSBjb250cm9sIG92ZXIuCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIG1vZGUgd2lsbCBOT1Qgd29yayB3aXRoIHRoZSBVbHRyYVZOQyBEU00KICAgICAgICAgICAgICAgICAgICAgICBwbHVnaW5zIGJlY2F1c2UgdGhleSBhbHRlciB0aGUgUkZCIHByb3RvY29sIGluIGFkZGl0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgdG8gdHVubmVsbGluZyB3aXRoIHRoZSBzeW1tZXRyaWMgY2lwaGVyIChhbiB1bmZvcnR1bmF0ZQogICAgICAgICAgICAgICAgICAgICAgIGNob2ljZSBvZiBpbXBsZW1lbnRhdGlvbi4uLikKCiAgICAgICAgICAgICAgICAgICAgICAgY2lwaGVyIGNhbiBiZSBvbmUgb2Y6ICBhcmM0LCBhZXN2MiwgYWVzLWNmYiwgYmxvd2Zpc2gsCiAgICAgICAgICAgICAgICAgICAgICAgYWVzMjU2LCBvciAzZGVzLiAgU2VlIHRoZSBPcGVuU1NMIGRvY3VtZW50YXRpb24gZm9yCiAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBpbmZvLiAgVGhlIGtleXNpemUgaXMgMTI4IGJpdHMgKGV4Y2VwdCBmb3IgYWVzMjU2KS4KICAgICAgICAgICAgICAgICAgICAgICBIZXJlIGlzIG9uZSB3YXkgdG8gbWFrZSBhIGtleWZpbGUgd2l0aCB0aGF0IG1hbnkgYml0czoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZCBpZj0vZGV2L3JhbmRvbSBvZj0uL215LmtleSBicz0xNiBjb3VudD0xCgogICAgICAgICAgICAgICAgICAgICAgIHlvdSB3aWxsIG5lZWQgdG8gc2VjdXJlbHkgc2hhcmUgdGhpcyBrZXkgd2l0aCB0aGUgb3RoZXIKICAgICAgICAgICAgICAgICAgICAgICBzaWRlIG9mIHRoZSBWTkMgY29ubmVjdGlvbiAoU2VlIFNTVk5DIGZvciBleGFtcGxlcykuCgogICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6ICAtZW5jIGJsb3dmaXNoOi4vbXkua2V5CiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTogIC1lbmMgYmxvd2Zpc2g6cHc9c3dvcmRmaXNoCgogICAgICAgICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgMTYgYnl0ZXMgb2YgcmFuZG9tIHNhbHQgZm9sbG93ZWQgYnkgMTYgYnl0ZXMKICAgICAgICAgICAgICAgICAgICAgICBvZiByYW5kb20gaW5pdGlhbGl6YXRpb24gdmVjdG9yIGFyZSBzZW50IGF0IHRoZSB2ZXJ5CiAgICAgICAgICAgICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uICBUaGUgb3RoZXIgc2lkZSBtdXN0IHJlYWQgdGhlc2UKICAgICAgICAgICAgICAgICAgICAgICBhbmQgaW5pdGlhbGl6ZSB0aGVpciBjaXBoZXIgd2l0aCB0aGVtLiAgVGhlc2UgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgbWFrZSB0aGUgc2Vzc2lvbiBrZXkgdW5pcXVlICh3aXRob3V0IHRoZW0gdGhlIHNlY3VyaXR5CiAgICAgICAgICAgICAgICAgICAgICAgaXMgbWluaW1hbCkuICBTaW1pbGFybHksIHRoZSBvdGhlciBzaWRlIG11c3Qgc2VuZCB1cwogICAgICAgICAgICAgICAgICAgICAgIGl0cyByYW5kb20gc2FsdCBhbmQgSVYgd2l0aCB0aG9zZSBzYW1lIGxlbmd0aHMuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBzYWx0IGFuZCBrZXkgZGF0YSBhcmUgY29tYmluZWQgdG8gY3JlYXRlIGEgc2Vzc2lvbgogICAgICAgICAgICAgICAgICAgICAgIGtleSB1c2luZyBhbiBtZDUgaGFzaCBhcyBkZXNjcmliZWQgaW4gRVZQX0J5dGVzVG9LZXkoMykuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBleGFjdCBjYWxsIGlzOiBFVlBfQnl0ZXNUb0tleShDaXBoZXIsIEVWUF9tZDUoKSwKICAgICAgICAgICAgICAgICAgICAgICBzYWx0LCBrZXlkYXRhLCBsZW4sIDEsIGtleXN0ciwgTlVMTCk7ICB3aGVyZSBzYWx0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhbmRvbSBkYXRhIGFzIGRlc2NyaWJlZCBhYm92ZSwgYW5kIGtleWRhdGEgaXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkIHNlY3JldCBrZXkgZGF0YS4gIGtleXN0ciBpcyB0aGUgcmVzdWx0aW5nIHNlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICBrZXkuICBUaGUgY2lwaGVyIGlzIHRoZW4gc2VlZGVkIHdpdGgga2V5c3RyIGFuZCB1c2VzCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhbmRvbSBpbml0aWFsaXphdGlvbiB2ZWN0b3IgYXMgaXRzIGZpcnN0IGJsb2NrLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyBtb2RpZnkgdGhlIGFtb3VudCBvZiByYW5kb20gc2FsdCBhbmQgaW5pdGlhbGl6YXRpb24KICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3IgdXNlIGNpcGhlckBuLG0gd2hlcmUgbiBpcyB0aGUgc2FsdCBsZW5ndGggYW5kCiAgICAgICAgICAgICAgICAgICAgICAgbSB0aGUgaW5pdGlhbGl6YXRpb24gdmVjdG9yIGxlbmd0aC4gIEUuZy4KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lbmMgYWVzLWNmYkA4LDE2Oi4vbXkua2V5CgogICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIG5vdCBhIGdvb2QgaWRlYSB0byBzZXQgZWl0aGVyIG9uZSB0byB6ZXJvLAogICAgICAgICAgICAgICAgICAgICAgIGFsdGhvdWdoIHlvdSBtYXkgYmUgZm9yY2VkIHRvIGlmIHRoZSBvdGhlciBzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHR1bm5lbCBpcyBub3QgdW5kZXIgeW91ciBjb250cm9sLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyBza2lwIHRoZSBzYWx0IGFuZCBFVlBfQnl0ZXNUb0tleSBNRDUgZW50aXJlbHkgKG5vCiAgICAgICAgICAgICAgICAgICAgICAgaGFzaGluZyBpcyBkb25lOiB0aGUga2V5ZGF0YSBpcyBkaXJlY3RseSBpbnNlcnRlZCBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNpcGhlcikgc3BlY2lmeSAiLTEiIGZvciB0aGUgc2FsdCwgZS5nLgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLWVuYyBibG93ZmlzaEAtMSwxNjouL215LmtleQoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWVzc2FnZSBkaWdlc3QgY2FuIGFsc28gYmUgY2hhbmdlZCB0byBzb21ldGhpbmcKICAgICAgICAgICAgICAgICAgICAgICBiZXNpZGVzIHRoZSBkZWZhdWx0IE1ENS4gIFVzZSBjaXBoZXJAbWQrbixtIHdoZXJlICJtZCIKICAgICAgICAgICAgICAgICAgICAgICBjYW4gYmUgb25lIG9mIHNoYSwgc2hhMSwgbWQ1LCBvciByaXBlLiAgRm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZW5jIGFyYzRAc2hhKzgsMTY6Li9teS5rZXkKCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFNTVk5DIHZuYyB2aWV3ZXIgcHJvamVjdCBzdXBwbGllcyBhIHN5bW1ldHJpYwogICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb24gdG9vbCBuYW1lZCAidWx0cmF2bmNfZHNtX2hlbHBlciIgdGhhdCBjYW4KICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIG9uIHRoZSB2aWV3ZXIgc2lkZS4gIEZvciBleGFtcGxlOgoKICAgICAgICAgICAgICAgICAgICAgICBzc3ZuY3ZpZXdlciBleGVjPSd1bHRyYXZuY19kc21faGVscGVyIGFyYzQgbXkua2V5IDAgaDpwJwoKICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBoOnAgaXMgdGhlIGhvc3RuYW1lIGFuZCBwb3J0IG9mIHRoZSB4MTF2bmMgc2VydmVyLgogICAgICAgICAgICAgICAgICAgICAgIHVsdHJhdm5jX2RzbV9oZWxwZXIgbWF5IGFsc28gYmUgdXNlZCBzdGFuZGFsb25lIHRvCiAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZSBhIHN5bW1ldHJpYyBlbmNyeXB0aW9uIHR1bm5lbCBmb3IgYW55IHZpZXdlcgogICAgICAgICAgICAgICAgICAgICAgIG9yIHNlcnZlciAoVk5DIG9yIG90aGVyd2lzZS4pIFRoZSBjaXBoZXIgKDFzdCBhcmcpCiAgICAgICAgICAgICAgICAgICAgICAgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIHN5bnRheCBhcyB3ZSB1c2UgYWJvdmUuCgogICAgICAgICAgICAgICAgICAgICAgIEFsc28gc2VlIHRoZSAnTm9uLVVsdHJhIERTTScgU1NWTkMgb3B0aW9uIGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAnVWx0cmFWTkMgRFNNIEVuY3J5cHRpb24gUGx1Z2luJyBhZHZhbmNlZCBvcHRpb24uCgogICAgICAgICAgICAgICAgICAgICAgIEZvciBib3RoIHdheXMgb2YgdXNpbmcgdGhlIHZpZXdlciwgeW91IGNhbiBzcGVjaWZ5IHRoZQogICAgICAgICAgICAgICAgICAgICAgIHNhbHQsaXZlYyBzaXplcyAoaW4gR1VJIG9yLCBlLmcuIGFyYzRAOCwxNikuCgotaHR0cHMgW3BvcnRdICAgICAgICAgIFVzZSBhIHNwZWNpYWwsIHNlcGFyYXRlIEhUVFBTIHBvcnQgKC1zc2wgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgLXN0dW5uZWwgbW9kZXMgb25seSkgZm9yIEhUVFBTIEphdmEgdmlld2VyIGFwcGxldAogICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkaW5nLiBJLmUuIG5vdCA1OTAwIGFuZCBub3QgNTgwMCAodGhlIGRlZmF1bHRzLikKCiAgICAgICAgICAgICAgICAgICAgICAgQkFDS0dST1VORDogSW4gLXNzbCBtb2RlLCBpdCB0dXJucyBvdXQgeW91IGNhbiB1c2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlIFZOQyBwb3J0IChlLmcuIDU5MDApIGZvciBib3RoIFZOQyBhbmQgSFRUUFMKICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9ucy4gKEhUVFBTIGlzIHVzZWQgdG8gcmV0cmlldmUgYSBTU0wtYXdhcmUKICAgICAgICAgICAgICAgICAgICAgICBWbmNWaWV3ZXIuamFyIGFwcGxldCB0aGF0IGlzIHByb3ZpZGVkIHdpdGggeDExdm5jKS4KICAgICAgICAgICAgICAgICAgICAgICBTaW5jZSBib3RoIHVzZSBTU0wgdGhlIGltcGxlbWVudGF0aW9uIHdhcyBleHRlbmRlZCB0bwogICAgICAgICAgICAgICAgICAgICAgIGRldGVjdCBpZiBIVFRQIHRyYWZmaWMgKGkuZS4gR0VUKSBpcyB0YWtpbmcgcGxhY2UgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlIGl0IGFjY29yZGluZ2x5LiAgVGhlIFVSTCB3b3VsZCBiZSwgZS5nLjoKCiAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9teW1hY2hpbmUub3JnOjU5MDAvCgogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgY29udmVuaWVudCBmb3IgZmlyZXdhbGxzLCBldGMsIGJlY2F1c2Ugb25seSBvbmUKICAgICAgICAgICAgICAgICAgICAgICBwb3J0IG5lZWRzIHRvIGJlIGFsbG93ZWQgaW4uICBIb3dldmVyLCB0aGlzIGhldXJpc3RpYwogICAgICAgICAgICAgICAgICAgICAgIGFkZHMgYSBmZXcgc2Vjb25kcyBkZWxheSB0byBlYWNoIGNvbm5lY3Rpb24gYW5kIGNhbiBiZQogICAgICAgICAgICAgICAgICAgICAgIHVucmVsaWFibGUgKGVzcGVjaWFsbHkgaWYgdGhlIHVzZXIgdGFrZXMgbXVjaCB0aW1lIHRvCiAgICAgICAgICAgICAgICAgICAgICAgcG9uZGVyIHRoZSBDZXJ0aWZpY2F0ZSBkaWFsb2dzIGluIGhpcyBicm93c2VyLCBKYXZhIFZNLAogICAgICAgICAgICAgICAgICAgICAgIG9yIFZOQyBWaWV3ZXIgYXBwbGV0LiAgVGhhdCdzIHJpZ2h0IDMgc2VwYXJhdGUgIkFyZQogICAgICAgICAgICAgICAgICAgICAgIHlvdSBzdXJlIHlvdSB3YW50IHRvIGNvbm5lY3Q/IiBkaWFsb2dzISkKCiAgICAgICAgICAgICAgICAgICAgICAgRU5EIE9GIEJBQ0tHUk9VTkQuCgogICAgICAgICAgICAgICAgICAgICAgIFVTQUdFOiBTbyB1c2UgdGhlIC1odHRwcyBvcHRpb24gdG8gcHJvdmlkZSBhIHNlcGFyYXRlLAogICAgICAgICAgICAgICAgICAgICAgIG1vcmUgcmVsaWFibGUgSFRUUFMgcG9ydCB0aGF0IHgxMXZuYyB3aWxsIGxpc3RlbiBvbi4gIElmCiAgICAgICAgICAgICAgICAgICAgICAgW3BvcnRdIGlzIG5vdCBwcm92aWRlZCAob3IgaXMgMCksIG9uZSBpcyBhdXRvc2VsZWN0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFVSTCB0byB1c2UgaXMgcHJpbnRlZCBvdXQgYXQgc3RhcnR1cC4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFNTTCBKYXZhIGFwcGxldCBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkIHZpYSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAtaHR0cGRpciBvcHRpb24uICBJZiBub3Qgc3VwcGxpZWQsIC1odHRwcyB3aWxsIHRyeQogICAgICAgICAgICAgICAgICAgICAgIHRvIGd1ZXNzIHRoZSBkaXJlY3RvcnkgYXMgdGhvdWdoIHRoZSAtaHR0cCBvcHRpb24KICAgICAgICAgICAgICAgICAgICAgICB3YXMgc3VwcGxpZWQuCgotaHR0cHNyZWRpciBbcG9ydF0gICAgIEluIC1zc2wgbW9kZSB3aXRoIHRoZSBKYXZhIGFwcGxldCByZXRyaWV2ZWQgdmlhIEhUVFBTLAogICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIEhUTUwgZmlsZSBjb250YWluaW5nIGFwcGxldCBwYXJhbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgKCdpbmRleC52bmMnIG9yICdwcm94eS52bmMnKSBpcyBzZW50IGRvIE5PVCBzZXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgYXBwbGV0IFBPUlQgcGFyYW1ldGVyIHRvIHRoZSBhY3R1YWwgVk5DIHBvcnQgYnV0IHNldCBpdAogICAgICAgICAgICAgICAgICAgICAgIHRvICJwb3J0IiBpbnN0ZWFkLiAgSWYgInBvcnQiIGlzIG5vdCBzdXBwbGllZCwgdGhlbgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBwb3J0IG51bWJlciBpcyBndWVzc2VkIGZyb20gdGhlIEhvc3Q6IEhUVFAgaGVhZGVyLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGFuIGluY29taW5nIFRDUCBjb25uZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Rpb24gaXMgcGVyZm9ybWVkIGJ5IGEgcm91dGVyL2dhdGV3YXkvZmlyZXdhbGwKICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG9uZSBwb3J0IHRvIGFuIGludGVybmFsIG1hY2hpbmUgd2hlcmUgeDExdm5jIGlzCiAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuaW5nIG9uIGEgZGlmZmVyZW50IHBvcnQuIFRoZSBKYXZhIGFwcGxldCBuZWVkcyB0bwogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3QgdG8gdGhlIGZpcmV3YWxsL3JvdXRlciBwb3J0LCBub3QgdGhlIFZOQyBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGludGVybmFsIHdvcmtzdGF0aW9uLiBGb3IgZXhhbXBsZSwgb25lIGNvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgcmVkaXIgZnJvbSBteWdhdGV3YXkuY29tOjQ0MyB0byB3b3Jrc3RhdGlvbjo1OTAwLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHNwYXJlcyB0aGUgdXNlciBmcm9tIGhhdmluZyB0byB0eXBlIGluCiAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9teWdhdGV3YXkuY29tLz9QT1JUPTQ0MyBpbnRvIHRoZWlyIHdlYgogICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXIuIE5vdGUgdGhhdCBwb3J0IDQ0MyBpcyB0aGUgZGVmYXVsdCBodHRwcyBwb3J0OwogICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHBvcnRzIG11c3QgYmUgZXhwbGljaXRseSBpbmRpY2F0ZWQsIGZvciBleGFtcGxlOgogICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vbXlnYXRld2F5LmNvbTo4MDAwLz9QT1JUPTgwMDAuICBUbyBhdm9pZCBoYXZpbmcKICAgICAgICAgICAgICAgICAgICAgICB0byBpbmNsdWRlIHRoZSBQT1JUPSBpbiB0aGUgYnJvd3NlciBVUkwsIHNpbXBseSBzdXBwbHkKICAgICAgICAgICAgICAgICAgICAgICAiLWh0dHBzcmVkaXIiIHRvIHgxMXZuYy4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gZG9lcyBub3Qgd29yayBpbiAtc3R1bm5lbCBtb2RlLgoKICAgICAgICAgICAgICAgICAgICAgICBNb3JlIHRyaWNrczogc2V0IHRoZSBlbnYgdmFyIFgxMVZOQ19FWFRSQV9IVFRQU19QQVJBTVMKICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBleHRyYSBVUkwgcGFyYW1ldGVycyB0byB1c2UuICBUaGlzIHdheSB5b3UgZG8KICAgICAgICAgICAgICAgICAgICAgICBub3QgbmVlZCB0byBzcGVjaWZ5IGV4dHJhIFBBUkFNUyBpbiB0aGUgaW5kZXgudm5jIGZpbGUuCiAgICAgICAgICAgICAgICAgICAgICAgRS5nLiB4MTF2bmMgLWVudiBYMTFWTkNfRVhUUkFfSFRUUFNfUEFSQU1TPSc/R0VUPTEnIC4uLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IHdhbnQgdG8gZXhwb3NlIHRoZSBub24tU1NMIEhUVFAgcG9ydCB0bwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXR3b3JrIChpLmUuIHlvdSBqdXN0IHdhbnQgdGhlIHNpbmdsZSBWTkMvSFRUUFMKICAgICAgICAgICAgICAgICAgICAgICBwb3J0LCBlLmcuIDU5MDAsIG9wZW4gZm9yIGNvbm5lY3Rpb25zKSB0aGVuIHNwZWNpZnkgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIC1lbnYgWDExVk5DX0hUVFBfTElTVEVOX0xPQ0FMSE9TVD0xICBUaGlzIHdheQogICAgICAgICAgICAgICAgICAgICAgIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBMaWJWTkNTZXJ2ZXIgaHR0cGQgc2VydmVyIHdpbGwKICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGJlIGF2YWlsYWJsZSBvbiBsb2NhbGhvc3QgKG5vdGUgdGhhdCBpbiAtc3NsIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgSFRUUFMgcmVxdWVzdHMgYXJlIHJlZGlyZWN0ZWQgZnJvbSBTU0wgdG8gdGhlIG5vbi1TU0wKICAgICAgICAgICAgICAgICAgICAgICBMaWJWTkNTZXJ2ZXIgSFRUUCBzZXJ2ZXIuKQoKLWh0dHBfb25lcG9ydCAgICAgICAgICBGb3IgVU4tZW5jcnlwdGVkIGNvbm5lY3Rpb25zIG1vZGUgKGkuZS4gbm8gLXNzbCwKICAgICAgICAgICAgICAgICAgICAgICAtc3R1bm5lbCwgb3IgLWVuYyBvcHRpb25zKSwgYWxsb3cgdGhlIEphdmEgVk5DIFZpZXdlcgogICAgICAgICAgICAgICAgICAgICAgIGFwcGxldCB0byBiZSBkb3dubG9hZGVkIHRocnUgdGhlIFZOQyBwb3J0IHZpYSBIVFRQLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGF0IGlzIHRvIHNheSwgeW91IGNhbiB1c2UgYSBzaW5nbGUgcG9ydCBmb3IgSmF2YQogICAgICAgICAgICAgICAgICAgICAgIGFwcGxldCB2aWV3ZXIgY29ubmVjdGlvbnMgYnkgdXNpbmcgYSBVUkwgaW4geW91ciB3ZWIKICAgICAgICAgICAgICAgICAgICAgICBicm93c2VyIGxpa2UgdGhpcywgZm9yIGV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9ob3N0bmFtZTo1OTAwCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWd1bGFyLCB0d28tcG9ydCBtb2RlLCBVUkwgaHR0cDovL2hvc3RuYW1lOjU4MDAKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgYXMgd2VsbC4KCiAgICAgICAgICAgICAgICAgICAgICAgQXMgbWVudGlvbmVkIGFib3ZlLCB0aGlzIG1vZGUgd2lsbCBOT1Qgd29yayB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIC1zc2wsIC1zdHVubmVsLCBvciAtZW5jIGVuY3J5cHRpb24gb3B0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgaXMgaXQgZXF1aXZhbGVudCB0byAnLWVuYyBub25lJyAoaS5lLiBpdAogICAgICAgICAgICAgICAgICAgICAgIHVzZXMgdGhlIHNhbWUgZGV0ZWN0aW9uIG1lY2hhbmlzbSBhcyBmb3IgSFRUUFMsIGJ1dAogICAgICAgICAgICAgICAgICAgICAgIHdpdGggbm8gZW5jcnlwdGlvbi4pCgogICAgICAgICAgICAgICAgICAgICAgIEhUVFBTIHNpbmdsZS1wb3J0IGlzIG9uIGJ5IGRlZmF1bHQgaW4gLXNzbCBlbmNyeXB0ZWQKICAgICAgICAgICAgICAgICAgICAgICBtb2RlIChhbmQgLWVuYyB0b28pLCBzbyB5b3Ugb25seSBuZWVkIC1odHRwX29uZXBvcnQKICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGRvaW5nIG5vbi1TU0wgZW5jcnlwdGVkIGNvbm5lY3Rpb25zLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1vZGUgY291bGQgYWxzbyBiZSB1c2VmdWwgZm9yIFNTSCB0dW5uZWxzIHNpbmNlCiAgICAgICAgICAgICAgICAgICAgICAgaXQgbWVhbnMgb25seSBvbmUgcG9ydCBuZWVkcyB0byBiZSByZWRpcmVjdGVkLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgLWh0dHBzcmVkaXIgb3B0aW9uIG1heSBhbHNvIGJlIHVzZWZ1bCBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgIG1vZGUgd2hlbiB1c2luZyBhbiBTU0ggdHVubmVsIGFzIHdlbGwgYXMgZm9yIHJvdXRlcgogICAgICAgICAgICAgICAgICAgICAgIHBvcnQgcmVkaXJlY3Rpb25zLgoKICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIC1lbnYgWDExVk5DX0hUVFBfTElTVEVOX0xPQ0FMSE9TVD0xCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGRlc2NyaWJlZCBhYm92ZSB1bmRlciAtaHR0cHNyZWRpciBhcHBsaWVzIGZvcgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBMaWJWTkNTZXJ2ZXIgaHR0cGQgc2VydmVyIGluIGFsbCBjYXNlcyAoc3NsIG9yIG5vdC4pCgotc3NoIHVzZXJAaG9zdDpkaXNwICAgIENyZWF0ZSBhIHJlbW90ZSBsaXN0ZW5pbmcgcG9ydCBvbiBtYWNoaW5lICJob3N0IgogICAgICAgICAgICAgICAgICAgICAgIHZpYSBhIFNTSCB0dW5uZWwgdXNpbmcgdGhlIC1SIHJwb3J0OmxvY2FsaG9zdDpscG9ydAogICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC4gbHBvcnQgd2lsbCBiZSB0aGUgbG9jYWwgeDExdm5jIGxpc3RlbmluZyBwb3J0LAogICAgICAgICAgICAgICAgICAgICAgIHNvIGEgY29ubmVjdGlvbiB0byBycG9ydCAoNTkwMCtkaXNwKSBvbiAiaG9zdCIKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHJlYWNoIHgxMXZuYy4gIEUuZy4gZnJlZEBzbm9vcHkuY29tOjAKCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjb3VsZCBiZSB1c2VmdWwgaWYgYSBmaXJld2FsbC9yb3V0ZXIgcHJldmVudHMKICAgICAgICAgICAgICAgICAgICAgICBpbmNvbWluZyBjb25uZWN0aW9ucyB0byB0aGUgeDExdm5jIG1hY2hpbmUsIGJ1dAogICAgICAgICAgICAgICAgICAgICAgIHRoZSBzc2ggbWFjaGluZSAiaG9zdCIgY2FuIGJlIHJlYWNoZWQgYnkgdGhlIFZOQwogICAgICAgICAgICAgICAgICAgICAgIHZpZXdlci4gInVzZXJAIiBpcyBub3QgbmVlZGVkIHVubGVzcyB0aGUgcmVtb3RlIHVuaXgKICAgICAgICAgICAgICAgICAgICAgICB1c2VybmFtZSBkaWZmZXJzIGZyb20gdGhlIGN1cnJlbnQgb25lLgoKICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IHRoZSByZW1vdGUgc3NoZCBpcyB1c3VhbGx5IGNvbmZpZ3VyZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW4gb25seSBvbiBsb2NhbGhvc3QgZm9yIHJwb3J0LCBzbyB0aGUgdmlld2VyIG1heQogICAgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gc3NoIC1MIHJlZGlyIHRvICJob3N0IiBhcyB3ZWxsIChTZWUgU1NWTkMgdG8KICAgICAgICAgICAgICAgICAgICAgICBhdXRvbWF0ZSB0aGlzKS4gIFRoZSBzc2hkIHNldHRpbmcgR2F0ZXdheVBvcnRzIGVuYWJsZXMKICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5pbmcgb24gYWxsIGludGVyZmFjZXMgZm9yIHJwb3J0OyB2aWV3ZXJzIGNhbgogICAgICAgICAgICAgICAgICAgICAgIHJlYWNoIGl0IG1vcmUgZWFzaWx5LgoKICAgICAgICAgICAgICAgICAgICAgICAiZGlzcCIgaXMgdGhlIFZOQyBkaXNwbGF5IGZvciB0aGUgcmVtb3RlIFNTSCBzaWRlLAogICAgICAgICAgICAgICAgICAgICAgIGUuZy4gMCBjb3JyZXNwb25kcyB0byBwb3J0IDU5MDAsIGV0Yy4gIElmIGRpc3AgaXMKICAgICAgICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gMjAwIHRoZSB2YWx1ZSBpcyB1c2VkIGFzIHRoZSBwb3J0LiAgVXNlIGEKICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSB2YWx1ZSB0byBmb3JjZSBhIGxvdyBwb3J0LCBlLmcuIGhvc3Q6LTgwIHdpbGwKICAgICAgICAgICAgICAgICAgICAgICB1c2UgcG9ydCA4MC4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgc3NoLWFnZW50IGlzIG5vdCBhY3RpdmUsIHRoZW4gdGhlIHNzaCBwYXNzd29yZCBuZWVkcwogICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGVudGVyZWQgaW4gdGhlIHRlcm1pbmFsIHdoZXJlIHgxMXZuYyBpcyBydW5uaW5nLgoKICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IHRoZSByZW1vdGUgc3NoIHdpbGwgaXNzdWUgYSAnc2xlZXAgMzAwJyB0bwogICAgICAgICAgICAgICAgICAgICAgIHdhaXQgZm9yIHRoZSBpbmNvbWluZyBjb25uZWN0aW9uIGZvciA1IG1pbnMuICBUbyBtb2RpZnkKICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHVzZSB1c2VyQGhvc3Q6ZGlzcCtzZWNzLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgcmVtb3RlIFNTSCBzZXJ2ZXIgaXMgb24gYSBub24tc3RhbmRhcmQgcG9ydAogICAgICAgICAgICAgICAgICAgICAgIChpLmUuIG5vdCAyMikgdXNlIHVzZXJAaG9zdDpwb3J0OmRpc3Arc2Vjcy4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBzc2ggcHJvY2VzcyBNQVkgTk9UIGJlIGtpbGxlZCB3aGVuCiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIGV4aXRzLiAgSXQgdHJpZXMgYnkgbG9va2luZyBhdCBwcygxKSBvdXRwdXQuCgotdXNlcHcgICAgICAgICAgICAgICAgIElmIG5vIG90aGVyIHBhc3N3b3JkIG1ldGhvZCB3YXMgc3VwcGxpZWQgb24gdGhlIGNvbW1hbmQKICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBmaXJzdCBsb29rIGZvciB+Ly52bmMvcGFzc3dkIGFuZCBpZiBmb3VuZCB1c2UgaXQKICAgICAgICAgICAgICAgICAgICAgICB3aXRoIC1yZmJhdXRoOyBuZXh0LCBsb29rIGZvciB+Ly52bmMvcGFzc3dkZmlsZSBhbmQKICAgICAgICAgICAgICAgICAgICAgICB1c2UgaXQgd2l0aCAtcGFzc3dkZmlsZTsgb3RoZXJ3aXNlLCBwcm9tcHQgdGhlIHVzZXIKICAgICAgICAgICAgICAgICAgICAgICBmb3IgYSBwYXNzd29yZCB0byBjcmVhdGUgfi8udm5jL3Bhc3N3ZCBhbmQgdXNlIGl0IHdpdGgKICAgICAgICAgICAgICAgICAgICAgICB0aGUgLXJmYmF1dGggb3B0aW9uLiAgSWYgbm9uZSBvZiB0aGVzZSBzdWNjZWVkIHgxMXZuYwogICAgICAgICAgICAgICAgICAgICAgIGV4aXRzIGltbWVkaWF0ZWx5LgoKLXN0b3JlcGFzc3dkIHBhc3MgZmlsZSBTdG9yZSBwYXNzd29yZCAicGFzcyIgYXMgdGhlIFZOQyBwYXNzd29yZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBmaWxlICJmaWxlIi4gIE9uY2UgdGhlIHBhc3N3b3JkIGlzIHN0b3JlZCB0aGUKICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmFtIGV4aXRzLiAgVXNlIHRoZSBwYXNzd29yZCB2aWEgIi1yZmJhdXRoIGZpbGUiCgogICAgICAgICAgICAgICAgICAgICAgIElmIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cywgIngxMXZuYyAtc3RvcmVwYXNzd2QiLAogICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2VyIGlzIHByb21wdGVkIGZvciBhIHBhc3N3b3JkIGFuZCBpdCBpcyBzdG9yZWQKICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgZmlsZSB+Ly52bmMvcGFzc3dkLiAgQ2FsbGVkIHdpdGggb25lIGFyZ3VtZW50LAogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB0aGUgZmlsZSB0byBzdG9yZSB0aGUgcHJvbXB0ZWQgcGFzc3dvcmQgaW4uCgotbm9wdyAgICAgICAgICAgICAgICAgIERpc2FibGUgdGhlIGJpZyB3YXJuaW5nIG1lc3NhZ2Ugd2hlbiB5b3UgdXNlIHgxMXZuYwogICAgICAgICAgICAgICAgICAgICAgIHdpdGhvdXQgc29tZSBzb3J0IG9mIHBhc3N3b3JkLgoKLWFjY2VwdCBzdHJpbmcgICAgICAgICBSdW4gYSBjb21tYW5kIChwb3NzaWJseSB0byBwcm9tcHQgdGhlIHVzZXIgYXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgWDExIGRpc3BsYXkpIHRvIGRlY2lkZSB3aGV0aGVyIGFuIGluY29taW5nIGNsaWVudAogICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBhbGxvd2VkIHRvIGNvbm5lY3Qgb3Igbm90LiAgInN0cmluZyIgaXMKICAgICAgICAgICAgICAgICAgICAgICBhbiBleHRlcm5hbCBjb21tYW5kIHJ1biB2aWEgc3lzdGVtKDMpIG9yIHNvbWUgc3BlY2lhbAogICAgICAgICAgICAgICAgICAgICAgIGNhc2VzIGRlc2NyaWJlZCBiZWxvdy4gIEJlIHN1cmUgdG8gcXVvdGUgInN0cmluZyIKICAgICAgICAgICAgICAgICAgICAgICBpZiBpdCBjb250YWlucyBzcGFjZXMsIHNoZWxsIGNoYXJhY3RlcnMsIGV0Yy4gIElmIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIGNvbW1hbmQgcmV0dXJucyAwIHRoZSBjbGllbnQgaXMgYWNjZXB0ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIHRoZSBjbGllbnQgaXMgcmVqZWN0ZWQuICBTZWUgYmVsb3cgZm9yIGFuCiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIHRvIGFjY2VwdCBhIGNsaWVudCB2aWV3LW9ubHkuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHgxMXZuYyBpcyBydW5uaW5nIGFzIHJvb3QgKHNheSBmcm9tIGluZXRkKDgpIG9yIGZyb20KICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IG1hbmFnZXJzIHhkbSgxKSwgZ2RtKDEpLCBldGMpLCB0aGluayBhYm91dCB0aGUKICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eSBpbXBsaWNhdGlvbnMgY2FyZWZ1bGx5IGJlZm9yZSBzdXBwbHlpbmcgdGhpcwogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbiAobGlrZXdpc2UgZm9yIHRoZSAtZ29uZSBvcHRpb24pLgoKICAgICAgICAgICAgICAgICAgICAgICBFbnZpcm9ubWVudDogVGhlIFJGQl9DTElFTlRfSVAgZW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbAogICAgICAgICAgICAgICAgICAgICAgIGJlIHNldCB0byB0aGUgaW5jb21pbmcgY2xpZW50IElQIG51bWJlciBhbmQgdGhlIHBvcnQKICAgICAgICAgICAgICAgICAgICAgICBpbiBSRkJfQ0xJRU5UX1BPUlQgKG9yIC0xIGlmIHVuYXZhaWxhYmxlKS4gIFNpbWlsYXJseSwKICAgICAgICAgICAgICAgICAgICAgICBSRkJfU0VSVkVSX0lQIGFuZCBSRkJfU0VSVkVSX1BPUlQgKHRoZSB4MTF2bmMgc2lkZQogICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBjb25uZWN0aW9uKSwgYXJlIHNldCB0byBhbGxvdyBpZGVudGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSB0Y3AgdmlydHVhbCBjaXJjdWl0LiAgVGhlIHgxMXZuYyBwcm9jZXNzCiAgICAgICAgICAgICAgICAgICAgICAgaWQgd2lsbCBiZSBpbiBSRkJfWDExVk5DX1BJRCwgYSBjbGllbnQgaWQgbnVtYmVyIGluCiAgICAgICAgICAgICAgICAgICAgICAgUkZCX0NMSUVOVF9JRCwgYW5kIHRoZSBudW1iZXIgb2Ygb3RoZXIgY29ubmVjdGVkIGNsaWVudHMKICAgICAgICAgICAgICAgICAgICAgICBpbiBSRkJfQ0xJRU5UX0NPVU5ULiAgUkZCX01PREUgd2lsbCBiZSAiYWNjZXB0Ii4KICAgICAgICAgICAgICAgICAgICAgICBSRkJfU1RBVEUgd2lsbCBiZSBQUk9UT0NPTF9WRVJTSU9OLCBTRUNVUklUWV9UWVBFLAogICAgICAgICAgICAgICAgICAgICAgIEFVVEhFTlRJQ0FUSU9OLCBJTklUSUFMSVNBVElPTiwgTk9STUFMLCBvciBVTktOT1dOCiAgICAgICAgICAgICAgICAgICAgICAgaW5kaWNhdGluZyB1cCB0byB3aGljaCBzdGF0ZSB0aGUgY2xpZW50IGhhcyBhY2hpZXZlZC4KICAgICAgICAgICAgICAgICAgICAgICBSRkJfTE9HSU5fVklFV09OTFkgd2lsbCBiZSAwLCAxLCBvciAtMSAodW5rbm93bikuCiAgICAgICAgICAgICAgICAgICAgICAgUkZCX1VTRVJOQU1FLCBSRkJfTE9HSU5fVElNRSwgYW5kIFJGQl9DVVJSRU5UX1RJTUUgbWF5CiAgICAgICAgICAgICAgICAgICAgICAgYWxzbyBiZSBzZXQuCgogICAgICAgICAgICAgICAgICAgICAgIElmICJzdHJpbmciIGlzICJwb3B1cCIgdGhlbiBhIGJ1aWx0aW4gcG9wdXAgd2luZG93CiAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZC4gIFRoZSBwb3B1cCB3aWxsIHRpbWUgb3V0IGFmdGVyIDEyMCBzZWNvbmRzLAogICAgICAgICAgICAgICAgICAgICAgIHVzZSAicG9wdXA6TiIgdG8gbW9kaWZ5IHRoZSB0aW1lb3V0IHRvIE4gc2Vjb25kcwogICAgICAgICAgICAgICAgICAgICAgICh1c2UgMCBmb3Igbm8gdGltZW91dCkuCgogICAgICAgICAgICAgICAgICAgICAgIEluIHRoZSBjYXNlIG9mICJwb3B1cCIgYW5kIHdoZW4gdGhlIC11bml4cHcgb3B0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgaXMgc3BlY2lmaWVkLCB0aGVuIGEgKnNlY29uZCogd2luZG93IHdpbGwgYmUgcG9wcGVkCiAgICAgICAgICAgICAgICAgICAgICAgdXAgYWZ0ZXIgdGhlIHVzZXIgc3VjY2Vzc2Z1bGx5IGxvZ3MgaW4gdmlhIGhpcyBVTklYCiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQuICBUaGlzIHRpbWUgdGhlIHVzZXIgd2lsbCBiZSBpZGVudGlmaWVkIGFzCiAgICAgICAgICAgICAgICAgICAgICAgVU5JWDp1c2VybmFtZUBob3N0bmFtZSwgdGhlICJVTklYOiIgcHJlZml4IGluZGljYXRlcwogICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHVzZXIgdGhlIHZpZXdlciBsb2dnZWQgYXMgdmlhIC11bml4cHcuICBUaGUgZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICBwb3B1cCBpcyBvbmx5IGZvciB3aGV0aGVyIHRvIGFsbG93IGhpbSB0byBldmVuICp0cnkqCiAgICAgICAgICAgICAgICAgICAgICAgdG8gbG9naW4gdmlhIHVuaXggcGFzc3dvcmQuCgogICAgICAgICAgICAgICAgICAgICAgIElmICJzdHJpbmciIGlzICJ4bWVzc2FnZSIgdGhlbiBhbiB4bWVzc2FnZSgxKQogICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb24gaXMgdXNlZCBmb3IgdGhlIGNvbW1hbmQuICB4bWVzc2FnZSBtdXN0IGJlCiAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkIG9uIHRoZSBtYWNoaW5lIGZvciB0aGlzIHRvIHdvcmsuCgogICAgICAgICAgICAgICAgICAgICAgIEJvdGggInBvcHVwIiBhbmQgInhtZXNzYWdlIiB3aWxsIHByZXNlbnQgYW4gb3B0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFjY2VwdGluZyB0aGUgY2xpZW50ICJWaWV3LU9ubHkiICh0aGUgY2xpZW50CiAgICAgICAgICAgICAgICAgICAgICAgY2FuIG9ubHkgd2F0Y2gpLiAgVGhpcyBvcHRpb24gd2lsbCBub3QgYmUgcHJlc2VudGVkIGlmCiAgICAgICAgICAgICAgICAgICAgICAgLXZpZXdvbmx5IGhhcyBiZWVuIHNwZWNpZmllZCwgaW4gd2hpY2ggY2FzZSB0aGUgZW50aXJlCiAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBpcyB2aWV3IG9ubHkuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSB1c2VyIHN1cHBsaWVkIGNvbW1hbmQgaXMgcHJlZml4ZWQgd2l0aCBzb21ldGhpbmcKICAgICAgICAgICAgICAgICAgICAgICBsaWtlICJ5ZXM6MCxubzoqLHZpZXc6MyBteWNvbW1hbmQgLi4uIiB0aGVuIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICBhc3NvY2lhdGVzIHRoZSBudW1lcmljYWwgY29tbWFuZCByZXR1cm4gY29kZSB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGFjdGlvbnM6IGFjY2VwdCwgcmVqZWN0LCBhbmQgYWNjZXB0LXZpZXctb25seSwKICAgICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuICBVc2UgIioiIGluc3RlYWQgb2YgYSBudW1iZXIgdG8gaW5kaWNhdGUKICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGVmYXVsdCBhY3Rpb24gKGluIGNhc2UgdGhlIGNvbW1hbmQgcmV0dXJucyBhbgogICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQgdmFsdWUpLiAgRS5nLiAibm86KiIgaXMgYSBnb29kIGNob2ljZS4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHgxMXZuYyBibG9ja3Mgd2hpbGUgdGhlIGV4dGVybmFsIGNvbW1hbmQKICAgICAgICAgICAgICAgICAgICAgICBvciBwb3B1cCBpcyBydW5uaW5nIChvdGhlciBjbGllbnRzIG1heSBzZWUgbm8gdXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyB0aGlzIHBlcmlvZCkuICBTbyBhIHBlcnNvbiBzaXR0aW5nIGEgdGhlIHBoeXNpY2FsCiAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheSBpcyBuZWVkZWQgdG8gcmVzcG9uZCB0byBhbiBwb3B1cCBwcm9tcHQuICh1c2UKICAgICAgICAgICAgICAgICAgICAgICBhIDJuZCB4MTF2bmMgaWYgeW91IGxvY2sgeW91cnNlbGYgb3V0KS4KCiAgICAgICAgICAgICAgICAgICAgICAgTW9yZSAtYWNjZXB0IHRyaWNrczogdXNlICJwb3B1cG1vdXNlIiB0byBvbmx5IGFsbG93CiAgICAgICAgICAgICAgICAgICAgICAgbW91c2UgY2xpY2tzIGluIHRoZSBidWlsdGluIHBvcHVwIHRvIGJlIHJlY29nbml6ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgU2ltaWxhcmx5IHVzZSAicG9wdXBrZXkiIHRvIG9ubHkgcmVjb2duaXplCiAgICAgICAgICAgICAgICAgICAgICAga2V5c3Ryb2tlIHJlc3BvbnNlcy4gIFRoZXNlIGFyZSB0byBoZWxwIGF2b2lkIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYWNjaWRlbnRhbGx5IGFjY2VwdGluZyBhIGNsaWVudCBieSB0eXBpbmcgb3IKICAgICAgICAgICAgICAgICAgICAgICBjbGlja2luZy4gQWxsIDMgb2YgdGhlIHBvcHVwIGtleXdvcmRzIGNhbiBiZSBmb2xsb3dlZAogICAgICAgICAgICAgICAgICAgICAgIGJ5ICtOK00gdG8gc3VwcGx5IGEgcG9zaXRpb24gZm9yIHRoZSBwb3B1cCB3aW5kb3cuCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgaXMgdG8gY2VudGVyIHRoZSBwb3B1cCB3aW5kb3cuCi1hZnRlcmFjY2VwdCBzdHJpbmcgICAgQXMgLWFjY2VwdCwgZXhjZXB0IHRvIHJ1biBhIHVzZXIgc3VwcGxpZWQgY29tbWFuZCBhZnRlcgogICAgICAgICAgICAgICAgICAgICAgIGEgY2xpZW50IGhhcyBiZWVuIGFjY2VwdGVkIGFuZCBhdXRoZW50aWNhdGVkLiBSRkJfTU9ERQogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc2V0IHRvICJhZnRlcmFjY2VwdCIgYW5kIHRoZSBvdGhlciBSRkJfKgogICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlcyBhcmUgYXMgaW4gLWFjY2VwdC4gIFVubGlrZSAtYWNjZXB0LCB0aGUKICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIHJldHVybiBjb2RlIGlzIG5vdCBpbnRlcnByZXRlZCBieSB4MTF2bmMuCiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTogLWFmdGVyYWNjZXB0ICdraWxsYWxsIHhsb2NrICYnCi1nb25lIHN0cmluZyAgICAgICAgICAgQXMgLWFjY2VwdCwgZXhjZXB0IHRvIHJ1biBhIHVzZXIgc3VwcGxpZWQgY29tbWFuZCB3aGVuCiAgICAgICAgICAgICAgICAgICAgICAgYSBjbGllbnQgZ29lcyBhd2F5IChkaXNjb25uZWN0cykuICBSRkJfTU9ERSB3aWxsIGJlCiAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvICJnb25lIiBhbmQgdGhlIG90aGVyIFJGQl8qIHZhcmlhYmxlcyBhcmUgYXMKICAgICAgICAgICAgICAgICAgICAgICBpbiAtYWNjZXB0LiAgVGhlICJwb3B1cCIgYWN0aW9ucyBhcHBseSBhcyB3ZWxsLgogICAgICAgICAgICAgICAgICAgICAgIFVubGlrZSAtYWNjZXB0LCB0aGUgY29tbWFuZCByZXR1cm4gY29kZSBpcyBub3QKICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnByZXRlZCBieSB4MTF2bmMuICBFeGFtcGxlOiAtZ29uZSAneGxvY2sgJicKCi11c2VycyBsaXN0ICAgICAgICAgICAgSWYgeDExdm5jIGlzIHN0YXJ0ZWQgYXMgcm9vdCAoc2F5IGZyb20gaW5ldGQoOCkgb3IgZnJvbQogICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgbWFuYWdlcnMgeGRtKDEpLCBnZG0oMSksIGV0YyksIHRoZW4gYXMgc29vbgogICAgICAgICAgICAgICAgICAgICAgIGFzIHBvc3NpYmxlIGFmdGVyIGNvbm5lY3Rpb25zIHRvIHRoZSBYIGRpc3BsYXkgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgZXN0YWJsaXNoZWQgdHJ5IHRvIHN3aXRjaCB0byBvbmUgb2YgdGhlIHVzZXJzIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGNvbW1hIHNlcGFyYXRlZCAibGlzdCIuICBJZiB4MTF2bmMgaXMgbm90IHJ1bm5pbmcgYXMKICAgICAgICAgICAgICAgICAgICAgICByb290IHRoaXMgb3B0aW9uIGlzIGlnbm9yZWQuCgogICAgICAgICAgICAgICAgICAgICAgIFdoeSB1c2UgdGhpcyBvcHRpb24/ICBJbiBnZW5lcmFsIGl0IGlzIG5vdCBuZWVkZWQgc2luY2UKICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgaXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhlIFggZGlzcGxheSBhbmQgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybSBpdHMgcHJpbWFyeSBmdW5jdGlvbnMuICBUaGUgb3B0aW9uIHdhcyBhZGRlZAogICAgICAgICAgICAgICAgICAgICAgIHRvIG1ha2Ugc29tZSBvZiB0aGUgKmV4dGVybmFsKiB1dGlsaXR5IGNvbW1hbmRzIHgxMXZuYwogICAgICAgICAgICAgICAgICAgICAgIG9jY2FzaW9uYWxseSBydW5zIHdvcmsgcHJvcGVybHkuICBJbiBwYXJ0aWN1bGFyIHVuZGVyCiAgICAgICAgICAgICAgICAgICAgICAgR05PTUUgYW5kIEtERSB0byBpbXBsZW1lbnQgdGhlICItc29saWQgY29sb3IiIGZlYXR1cmUKICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBjb21tYW5kcyAoZ2NvbmZ0b29sLTIgYW5kIGRjb3ApIHVuZm9ydHVuYXRlbHkKICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIHJ1biBhcyB0aGUgdXNlciBvd25pbmcgdGhlIGRlc2t0b3Agc2Vzc2lvbi4KICAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB0aGlzIG9wdGlvbiBzd2l0Y2hlcyB1c2VyaWQgaXQgYWxzbyBhZmZlY3RzIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHVzZXJpZCB1c2VkIHRvIHJ1biB0aGUgcHJvY2Vzc2VzIGZvciB0aGUgLWFjY2VwdCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAtZ29uZSBvcHRpb25zLiAgSXQgYWxzbyBhZmZlY3RzIHRoZSBhYmlsaXR5IHRvIHJlYWQKICAgICAgICAgICAgICAgICAgICAgICBmaWxlcyBmb3Igb3B0aW9ucyBzdWNoIGFzIC1jb25uZWN0LCAtYWxsb3csIGFuZCAtcmVtYXAKICAgICAgICAgICAgICAgICAgICAgICBhbmQgYWxzbyB0aGUgdWx0cmEgYW5kIHRpZ2h0IGZpbGV0cmFuc2ZlciBmZWF0dXJlIGlmCiAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZC4gIE5vdGUgdGhhdCB0aGUgLWNvbm5lY3QgZmlsZSBpcyBhbHNvIHNvbWV0aW1lcwogICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gdG8uCgogICAgICAgICAgICAgICAgICAgICAgIFNvIGJlIGNhcmVmdWwgd2l0aCB0aGlzIG9wdGlvbiBzaW5jZSBpbiBzb21lIHNpdHVhdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICBpdHMgdXNlIGNhbiBkZWNyZWFzZSBzZWN1cml0eS4KCiAgICAgICAgICAgICAgICAgICAgICAgSW4gZ2VuZXJhbCB0aGUgc3dpdGNoIHRvIGEgdXNlciB3aWxsIG9ubHkgdGFrZSBwbGFjZQogICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBkaXNwbGF5IGNhbiBzdGlsbCBiZSBzdWNjZXNzZnVsbHkgb3BlbmVkIGFzIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICB1c2VyICh0aGlzIGlzIHByaW1hcmlseSB0byB0cnkgdG8gZ3Vlc3MgdGhlIGFjdHVhbCBvd25lcgogICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzZXNzaW9uKS4gRXhhbXBsZTogIi11c2VycyBmcmVkLHdpbG1hLGJldHR5Ii4KICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgYSBtYWxpY2lvdXMgbG9jYWwgdXNlciAiYmFybmV5IiBieQogICAgICAgICAgICAgICAgICAgICAgIHF1aWNrbHkgdXNpbmcgInhob3N0ICsiIHdoZW4gbG9nZ2luZyBpbiBtYXkgcG9zc2libHkKICAgICAgICAgICAgICAgICAgICAgICBnZXQgdGhlIHgxMXZuYyBwcm9jZXNzIHRvIHN3aXRjaCB0byB1c2VyICJmcmVkIi4KICAgICAgICAgICAgICAgICAgICAgICBXaGF0IGhhcHBlbnMgbmV4dD8KCiAgICAgICAgICAgICAgICAgICAgICAgVW5kZXIgZGlzcGxheSBtYW5hZ2VycyBpdCBtYXkgYmUgYSBsb25nIHRpbWUgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN3aXRjaCBzdWNjZWVkcyAoaS5lLiBhIHVzZXIgbG9ncyBpbikuICBUbyBpbnN0ZWFkCiAgICAgICAgICAgICAgICAgICAgICAgbWFrZSBpdCBzd2l0Y2ggaW1tZWRpYXRlbHkgcmVnYXJkbGVzcyBpZiB0aGUgZGlzcGxheQogICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSByZW9wZW5lZCBwcmVmaXggdGhlIHVzZXJuYW1lIHdpdGggdGhlICIrIgogICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3Rlci4gRS5nLiAiLXVzZXJzICtib2IiIG9yICItdXNlcnMgK25vYm9keSIuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBsYXR0ZXIgKGkuZS4gc3dpdGNoaW5nIGltbWVkaWF0ZWx5IHRvIHVzZXIKICAgICAgICAgICAgICAgICAgICAgICAibm9ib2R5IikgaXMgdGhlIG9ubHkgb2J2aW91cyB1c2Ugb2YgdGhlIC11c2VycyBvcHRpb24KICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGluY3JlYXNlcyBzZWN1cml0eS4KCiAgICAgICAgICAgICAgICAgICAgICAgVXNlIHRoZSBmb2xsb3dpbmcgbm90YXRpb24gdG8gYXNzb2NpYXRlIGEgZ3JvdXAgd2l0aAogICAgICAgICAgICAgICAgICAgICAgIGEgdXNlcjogdXNlcjEuZ3JvdXAxLHVzZXIyLmdyb3VwMiwuLi4gIE5vdGUgdGhhdAogICAgICAgICAgICAgICAgICAgICAgIGluaXRncm91cHMoMikgd2lsbCBzdGlsbCBiZSBjYWxsZWQgZmlyc3QgdG8gdHJ5IHRvCiAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIHRvIEFMTCBvZiBhIHVzZXIncyBncm91cHMgKHByaW1hcnkgYW5kIGFkZGl0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICBncm91cHMpLiAgT25seSBpZiB0aGF0IGZhaWxzIG9yIGl0IGlzIG5vdCBhdmFpbGFibGUKICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSBzaW5nbGUgZ3JvdXAgc3BlY2lmaWVkIGFzIGFib3ZlIChvciB0aGUgdXNlcidzCiAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeSBncm91cCBpZiBub3Qgc3BlY2lmaWVkKSBpcyBzd2l0Y2hlZCB0byB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgc2V0Z2lkKDIpLiAgVXNlIC1lbnYgWDExVk5DX1NJTkdMRV9HUk9VUD0xIHRvIHByZXZlbnQKICAgICAgICAgICAgICAgICAgICAgICB0cnlpbmcgaW5pdGdyb3VwcygyKSBhbmQgb25seSBzd2l0Y2ggdG8gdGhlIHNpbmdsZQogICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLiAgVGhpcyBzb3J0IG9mIHNldHRpbmcgaXMgb25seSByZWFsbHkgbmVlZGVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgbWFrZSB0aGUgdWx0cmEgb3IgdGlnaHQgZmlsZXRyYW5zZmVyIHBlcm1pc3Npb25zIHdvcmsKICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJseS4gVGhpcyBmb3JtYXQgYXBwbGllcyB0byBhbnkgY29tbWEgc2VwYXJhdGVkIGxpcwp0CiAgICAgICAgICAgICAgICAgICAgICAgb2YgdXNlcnMsIGV2ZW4gdGhlIHNwZWNpYWwgIj0iIG1vZGVzIGRlc2NyaWJlZCBiZWxvdy4KCiAgICAgICAgICAgICAgICAgICAgICAgSW4gLXVuaXhwdyBtb2RlLCBpZiAiLXVzZXJzIHVuaXhwdz0iIGlzIHN1cHBsaWVkCiAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBhZnRlciBhIHVzZXIgYXV0aGVudGljYXRlcyBoaW1zZWxmIHZpYSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAtdW5peHB3IG1lY2hhbmlzbSwgeDExdm5jIHdpbGwgdHJ5IHRvIHN3aXRjaCB0byB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgdXNlciBhcyB0aG91Z2ggIi11c2VycyArdXNlcm5hbWUiIGhhZCBiZWVuIHN1cHBsaWVkLgogICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSB3YW50IHRvIGxpbWl0IHdoaWNoIHVzZXJzIHRoaXMgd2lsbCBiZSBkb25lIGZvciwKICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlIHRoZW0gYXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBhZnRlciAidW5peHB3PSIKICAgICAgICAgICAgICAgICAgICAgICBHcm91cHMgY2FuIGFsc28gYmUgc3BlY2lmaWVkIGFzIGRlc2NyaWJlZCBhYm92ZS4KCiAgICAgICAgICAgICAgICAgICAgICAgU2ltaWxhcmx5LCBpbiAtc3NsIG1vZGUsIGlmICItdXNlcnMgc3NscGVlcj0iIGlzCiAgICAgICAgICAgICAgICAgICAgICAgc3VwcGxpZWQgdGhlbiBhZnRlciBhbiBTU0wgY2xpZW50IGF1dGhlbnRpY2F0ZXMgd2l0aCBoaXMKICAgICAgICAgICAgICAgICAgICAgICBjZXJ0ICh0aGUgLXNzbHZlcmlmeSBvcHRpb24gaXMgcmVxdWlyZWQgZm9yIHRoaXMpIHgxMXZuYwogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgZXh0cmFjdCBhIFVOSVggdXNlcm5hbWUgZnJvbSB0aGUgImVtYWlsQWRkcmVzcyIKICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCAodXNlcm5hbWVAaG9zdG5hbWUuY29tKSBvZiB0aGUgIlN1YmplY3QiIG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHg1MDkgU1NMIGNlcnQgYW5kIHRoZW4gdHJ5IHRvIHN3aXRjaCB0byB0aGF0IHVzZXIgYXMKICAgICAgICAgICAgICAgICAgICAgICB0aG91Z2ggIi11c2VycyArdXNlcm5hbWUiIGhhZCBiZWVuIHN1cHBsaWVkLiAgSWYgeW91CiAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBsaW1pdCB3aGljaCB1c2VycyB0aGlzIHdpbGwgYmUgZG9uZSBmb3IsIHByb3ZpZGUKICAgICAgICAgICAgICAgICAgICAgICB0aGVtIGFzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3QgYWZ0ZXIgInNzbHBlZXI9Ii4KICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGVudi4gdmFyIFgxMVZOQ19TU0xQRUVSX0NOIHRvIHVzZSB0aGUgQ29tbW9uCiAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAobm9ybWFsbHkgYSBob3N0bmFtZSkgaW5zdGVhZCBvZiB0aGUgRW1haWwgZmllbGQuCgogICAgICAgICAgICAgICAgICAgICAgIE5PVEU6IGZvciBzc2xwZWVyPSBtb2RlIHRoZSB4MTF2bmMgYWRtaW5pc3RyYXRvciBtdXN0CiAgICAgICAgICAgICAgICAgICAgICAgdGFrZSBjYXJlIHRoYXQgYW55IGNsaWVudCBjZXJ0cyBoZSBhZGRzIHRvIC1zc2x2ZXJpZnkKICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHRoZSBpbnRlbmRlZCBVTklYIHVzZXJuYW1lIGluIHRoZSAiZW1haWxBZGRyZXNzIgogICAgICAgICAgICAgICAgICAgICAgIGZpZWxkIG9mIHRoZSBjZXJ0LiAgT3RoZXJ3aXNlIGEgdXNlciBtYXkgYmUgYWJsZSB0bwogICAgICAgICAgICAgICAgICAgICAgIGxvZyBpbiBhcyBhbm90aGVyLiAgVGhpcyBjb21tYW5kIGNhbiBiZSBvZiB1c2UgaW4KICAgICAgICAgICAgICAgICAgICAgICBjaGVja2luZzogIm9wZW5zc2wgeDUwOSAtdGV4dCAtaW4gZmlsZS5jcnQiLCBzZWUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIlN1YmplY3Q6IiBsaW5lLiAgQWxzbywgYWxvbmcgd2l0aCB0aGUgbm9ybWFsIFJGQl8qCiAgICAgICAgICAgICAgICAgICAgICAgZW52LiB2YXJzLiAoc2VlIC1hY2NlcHQpIHBhc3NlZCB0byBleHRlcm5hbCBjbWQ9CiAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZHMsIFJGQl9TU0xfQ0xJRU5UX0NFUlQgd2lsbCBiZSBzZXQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50J3MgeDUwOSBjZXJ0aWZpY2F0ZSBzdHJpbmcuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBzc2xwZWVyPSBtb2RlIGNhbiBhaWQgZmluZGluZyBYIHNlc3Npb25zIHZpYSB0aGUKICAgICAgICAgICAgICAgICAgICAgICBGSU5ERElTUExBWSBhbmQgRklORENSRUFURURJU1BMQVkgbWVjaGFuaXNtcy4KCiAgICAgICAgICAgICAgICAgICAgICAgVG8gaW1tZWRpYXRlbHkgc3dpdGNoIHRvIGEgdXNlciAqYmVmb3JlKiBjb25uZWN0aW9ucwogICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBYIGRpc3BsYXkgYXJlIG1hZGUgb3IgYW55IGZpbGVzIG9wZW5lZCB1c2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIj0iIGNoYXJhY3RlcjogIi11c2VycyA9Ym9iIi4gIFRoYXQgdXNlciBuZWVkcyB0bwogICAgICAgICAgICAgICAgICAgICAgIGJlIGFibGUgdG8gb3BlbiB0aGUgWCBkaXNwbGF5IGFuZCBhbnkgZmlsZXMgb2YgY291cnNlLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3BlY2lhbCB1c2VyICJndWVzcz0iIG1lYW5zIHRvIGV4YW1pbmUgdGhlIHV0bXB4CiAgICAgICAgICAgICAgICAgICAgICAgZGF0YWJhc2UgKHNlZSB3aG8oMSkpIGxvb2tpbmcgZm9yIGEgdXNlciBhdHRhY2hlZCB0bwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBkaXNwbGF5IG51bWJlciAoZnJvbSBESVNQTEFZIG9yIC1kaXNwbGF5IG9wdGlvbikKICAgICAgICAgICAgICAgICAgICAgICBhbmQgdHJ5IGhpbS9oZXIuICBUbyBsaW1pdCB0aGUgbGlzdCBvZiBndWVzc2VzLCB1c2U6CiAgICAgICAgICAgICAgICAgICAgICAgIi11c2VycyBndWVzcz1ib2IsYmV0dHkiLgoKICAgICAgICAgICAgICAgICAgICAgICBFdmVuIG1vcmUgc2luaXN0ZXIgaXMgdGhlIHNwZWNpYWwgdXNlciAibHVyaz0iCiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBtZWFucyB0byB0cnkgdG8gZ3Vlc3MgdGhlIERJU1BMQVkgZnJvbSB0aGUgdXRtcHgKICAgICAgICAgICAgICAgICAgICAgICBsb2dpbiBkYXRhYmFzZSBhcyB3ZWxsLiAgU28gaXQgImx1cmtzIiB3YWl0aW5nIGZvcgogICAgICAgICAgICAgICAgICAgICAgIGFueW9uZSB0byBsb2cgaW50byBhbiBYIHNlc3Npb24gYW5kIHRoZW4gY29ubmVjdHMgdG8gaXQuCiAgICAgICAgICAgICAgICAgICAgICAgU3BlY2lmeSBhIGxpc3Qgb2YgdXNlcnMgYWZ0ZXIgdGhlID0gdG8gbGltaXQgd2hpY2ggdXNlcnMKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHRyaWVkLiAgVG8gZW5hYmxlIGEgZGlmZmVyZW50IHNlYXJjaGluZyBtb2RlLCBpZgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaXJzdCB1c2VyIGluIHRoZSBsaXN0IGlzIHNvbWV0aGluZyBsaWtlICI6MCIgb3IKICAgICAgICAgICAgICAgICAgICAgICAiOjAtMiIgdGhhdCBpbmRpY2F0ZXMgYSByYW5nZSBvZiBESVNQTEFZIG51bWJlcnMgdGhhdAogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdHJpZWQgKHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZSBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICB1dG1weCBkYXRhYmFzZSkgZm9yIGFsbCB1c2VycyB0aGF0IGFyZSBsb2dnZWQgaW4uICBBbHNvCiAgICAgICAgICAgICAgICAgICAgICAgc2VlIHRoZSAiLWRpc3BsYXkgV0FJVDouLi4iIGZ1bmN0aW9uYWxpdHkuICBFeGFtcGxlczoKICAgICAgICAgICAgICAgICAgICAgICAiLXVzZXJzIGx1cms9IiBhbmQgYWxzbyAiLXVzZXJzIGx1cms9OjAtMSxib2IsbWFyeSIKCiAgICAgICAgICAgICAgICAgICAgICAgQmUgZXNwZWNpYWxseSBjYXJlZnVsIHVzaW5nIHRoZSAiZ3Vlc3M9IiBhbmQgImx1cms9IgogICAgICAgICAgICAgICAgICAgICAgIG1vZGVzLiAgVGhleSBhcmUgbm90IHJlY29tbWVuZGVkIGZvciB1c2Ugb24gbWFjaGluZXMKICAgICAgICAgICAgICAgICAgICAgICB3aXRoIHVudHJ1c3R3b3J0aHkgbG9jYWwgdXNlcnMuCgotbm9zaG0gICAgICAgICAgICAgICAgIERvIG5vdCB1c2UgdGhlIE1JVC1TSE0gZXh0ZW5zaW9uIGZvciB0aGUgcG9sbGluZy4KICAgICAgICAgICAgICAgICAgICAgICBSZW1vdGUgZGlzcGxheXMgY2FuIGJlIHBvbGxlZCB0aGlzIHdheTogYmUgY2FyZWZ1bCB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgY2FuIHVzZSBsYXJnZSBhbW91bnRzIG9mIG5ldHdvcmsgYmFuZHdpZHRoLiAgVGhpcyBpcwogICAgICAgICAgICAgICAgICAgICAgIGFsc28gb2YgdXNlIGlmIHRoZSBsb2NhbCBtYWNoaW5lIGhhcyBhIGxpbWl0ZWQgbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgICAgb2Ygc2htIHNlZ21lbnRzIGFuZCAtb25ldGlsZSBpcyBub3Qgc3VmZmljaWVudC4KLWZsaXBieXRlb3JkZXIgICAgICAgICBTb21ldGltZXMgbmVlZGVkIGlmIHJlbW90ZWx5IHBvbGxlZCBob3N0IGhhcyBkaWZmZXJlbnQKICAgICAgICAgICAgICAgICAgICAgICBlbmRpYW5uZXNzLiAgSWdub3JlZCB1bmxlc3MgLW5vc2htIGlzIHNldC4KLW9uZXRpbGUgICAgICAgICAgICAgICBEbyBub3QgdXNlIHRoZSBuZXcgY29weV90aWxlcygpIGZyYW1lYnVmZmVyIG1lY2hhbmlzbSwKICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHVzZSAxIHNobSB0aWxlIGZvciBwb2xsaW5nLiAgTGltaXRzIHNobSBzZWdtZW50cwogICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gMy4KCiAgICAgICAgICAgICAgICAgICAgICAgVG8gZGlzYWJsZSBhbnkgYXV0b21hdGljIHNobSByZWR1Y3Rpb24gc2V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgIGVudi4gdmFyLiBYMTFWTkNfTk9fTElNSVRfU0hNLgoKLXNvbGlkIFtjb2xvcl0gICAgICAgICBUbyBpbXByb3ZlIHBlcmZvcm1hbmNlLCB3aGVuIFZOQyBjbGllbnRzIGFyZSBjb25uZWN0ZWQKICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gY2hhbmdlIHRoZSBkZXNrdG9wIGJhY2tncm91bmQgdG8gYSBzb2xpZCBjb2xvci4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgW2NvbG9yXSBpcyBvcHRpb25hbDogdGhlIGRlZmF1bHQgY29sb3IgaXMgImN5YW40Ii4KICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSBkaWZmZXJlbnQgb25lIHNwZWNpZnkgdGhlIFggY29sb3IgKHJnYi50eHQgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBlLmcuICJkYXJrYmx1ZSIgb3IgbnVtZXJpY2FsICIjUlJHR0JCIikuCgogICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSB0aGlzIG9wdGlvbiBvbmx5IHdvcmtzIG9uIEdOT01FLCBLREUsIENERSwKICAgICAgICAgICAgICAgICAgICAgICBYRkNFLCBhbmQgY2xhc3NpYyBYIChpLmUuIHdpdGggdGhlIGJhY2tncm91bmQgaW1hZ2UKICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgcm9vdCB3aW5kb3cpLiAgVGhlICJnY29uZnRvb2wtMiIsICJkY29wIgogICAgICAgICAgICAgICAgICAgICAgIGFuZCAieGZjb25mLXF1ZXJ5IiBleHRlcm5hbCBjb21tYW5kcyBhcmUgcnVuIGZvcgogICAgICAgICAgICAgICAgICAgICAgIEdOT01FLCBLREUsIGFuZCBYRkNFIHJlc3BlY3RpdmVseS4gIFRoaXMgYWxzbyB3b3JrcwogICAgICAgICAgICAgICAgICAgICAgIG9uIG5hdGl2ZSBNYWNPU1guICAoVGhlcmUgaXMgbm8gY29sb3Igc2VsZWN0aW9uIGZvcgogICAgICAgICAgICAgICAgICAgICAgIE1hY09TWCBvciBYRkNFLikgIE90aGVyIGRlc2t0b3BzIHdvbid0IHdvcmssIChzZW5kCiAgICAgICAgICAgICAgICAgICAgICAgdXMgdGhlIGNvcnJlc3BvbmRpbmcgY29tbWFuZHMgaWYgeW91IGZpbmQgdGhlbSkuCiAgICAgICAgICAgICAgICAgICAgICAgSWYgeDExdm5jIGlzIHJ1bm5pbmcgYXMgcm9vdCAoaW5ldGQoOCkgb3IgZ2RtKDEpKSwKICAgICAgICAgICAgICAgICAgICAgICB0aGUgLXVzZXJzIG9wdGlvbiBtYXkgYmUgbmVlZGVkIGZvciBHTk9NRSwgS0RFLCBYRkNFLgogICAgICAgICAgICAgICAgICAgICAgIElmIHgxMXZuYyBndWVzc2VzIHlvdXIgZGVza3RvcCBpbmNvcnJlY3RseSwgeW91IGNhbgogICAgICAgICAgICAgICAgICAgICAgIGZvcmNlIGl0IGJ5IHByZWZpeGluZyBjb2xvciB3aXRoICJnbm9tZToiLCAia2RlOiIsCiAgICAgICAgICAgICAgICAgICAgICAgImNkZToiLCAieGZjZToiLCBvciAicm9vdDoiLgoKICAgICAgICAgICAgICAgICAgICAgICBVcGRhdGU6IC1zb2xpZCBubyBsb25nZXIgd29ya3Mgb24gS0RFNC4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIHdvcmtzIGluIGEgbGltaXRlZCB3YXkgb24gdGhlIE1hYyBPUyBYIENvbnNvbGUKICAgICAgICAgICAgICAgICAgICAgICB3aXRoIG9uZSBjb2xvciAoJ2tlbHAnKSB1c2luZyB0aGUgc2NyZWVuc2F2ZXIgd3JpdGluZwogICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBiYWNrZ3JvdW5kLiAgTG9vayBpbiAifi9MaWJyYXJ5L1NjcmVlbiBTYXZlcnMiCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIFZuY1NvbGlkQ29sb3IucG5nIHRvIGNoYW5nZSB0aGUgY29sb3IuCgotYmxhY2tvdXQgc3RyaW5nICAgICAgIEJsYWNrIG91dCByZWN0YW5nbGVzIG9uIHRoZSBzY3JlZW4uICJzdHJpbmciIGlzIGEKICAgICAgICAgICAgICAgICAgICAgICBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBXeEgrWCtZIHR5cGUgZ2VvbWV0cmllcyBmb3IKICAgICAgICAgICAgICAgICAgICAgICBlYWNoIHJlY3RhbmdsZS4gIElmIG9uZSBvZiB0aGUgaXRlbXMgb24gdGhlIGxpc3QgaXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICJub3B0ciIgdGhlIG1vdXNlIHBvaW50ZXIgd2lsbCBub3QgYmUgYWxsb3dlZAogICAgICAgICAgICAgICAgICAgICAgIHRvIGdvIGludG8gYSBibGFja2VkIG91dCByZWdpb24uCi14aW5lcmFtYSAgICAgICAgICAgICAgSWYgeW91ciBzY3JlZW4gaXMgY29tcG9zZWQgb2YgbXVsdGlwbGUgbW9uaXRvcnMKLW5veGluZXJhbWEgICAgICAgICAgICBnbHVlZCB0b2dldGhlciB2aWEgWElORVJBTUEsIGFuZCB0aGF0IHNjcmVlbiBpcwogICAgICAgICAgICAgICAgICAgICAgIG5vdCBhIHJlY3RhbmdsZSB0aGlzIG9wdGlvbiB3aWxsIHRyeSB0byBndWVzcyB0aGUKICAgICAgICAgICAgICAgICAgICAgICBhcmVhcyB0byBibGFjayBvdXQgKGlmIHlvdXIgc3lzdGVtIGhhcyBsaWJYaW5lcmFtYSkuCiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogLXhpbmVyYW1hCgogICAgICAgICAgICAgICAgICAgICAgIEluIGdlbmVyYWwsIHdlIGhhdmUgbm90aWNlZCBvbiBYSU5FUkFNQSBkaXNwbGF5cyB5b3UgbWF5CiAgICAgICAgICAgICAgICAgICAgICAgbmVlZCB0byB1c2UgdGhlICIteHdhcnBwb2ludGVyIiBvcHRpb24gaWYgdGhlIG1vdXNlCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBtaXNiZWhhdmVzIGFuZCBpdCBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuIFVzZQogICAgICAgICAgICAgICAgICAgICAgICItbm94d2FycHBvaW50ZXIiIGlmIHlvdSBkbyBub3Qgd2FudCB0aGlzLgoKLXh0cmFwICAgICAgICAgICAgICAgICBVc2UgdGhlIERFQy1YVFJBUCBleHRlbnNpb24gZm9yIGtleXN0cm9rZSBhbmQgbW91c2UKICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCBpbnNlcnRpb24uICBGb3IgdXNlIG9uIGxlZ2FjeSBzeXN0ZW1zLCBlLmcuIFgxMVI1LAogICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgYW4gaW5jb21wbGV0ZSBvciBtaXNzaW5nIFhURVNUIGV4dGVuc2lvbi4KICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IERFQy1YVFJBUCB3aWxsIGJlIHVzZWQgaWYgWFRFU1Qgc2VydmVyIGdyYWIKICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIGlzIG1pc3NpbmcsIHVzZSAteHRyYXAgdG8gZG8gdGhlIGtleXN0cm9rZSBhbmQKICAgICAgICAgICAgICAgICAgICAgICBtb3VzZSBpbnNlcnRpb24gdmlhIERFQy1YVFJBUCBhcyB3ZWxsLgoKLXhyYW5kciBbbW9kZV0gICAgICAgICBJZiB0aGUgZGlzcGxheSBzdXBwb3J0cyB0aGUgWFJBTkRSIChYIFJlc2l6ZSwgUm90YXRlCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIFJlZmxlY3Rpb24pIGV4dGVuc2lvbiwgYW5kIHlvdSBleHBlY3QgWFJBTkRSIGV2ZW50cwogICAgICAgICAgICAgICAgICAgICAgIHRvIG9jY3VyIHRvIHRoZSBkaXNwbGF5IHdoaWxlIHgxMXZuYyBpcyBydW5uaW5nLCB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyBpbmRpY2F0ZXMgeDExdm5jIHNob3VsZCB0cnkgdG8gcmVzcG9uZCB0bwogICAgICAgICAgICAgICAgICAgICAgIHRoZW0gKGFzIG9wcG9zZWQgdG8gc2ltcGx5IGNyYXNoaW5nIGJ5IGFzc3VtaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgIG9sZCBzY3JlZW4gc2l6ZSkuICBTZWUgdGhlIHhyYW5kcigxKSBtYW5wYWdlIGFuZCBydW4KICAgICAgICAgICAgICAgICAgICAgICAneHJhbmRyIC1xJyBmb3IgbW9yZSBpbmZvLiAgW21vZGVdIGlzIG9wdGlvbmFsIGFuZAogICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlZCBiZWxvdy4KCiAgICAgICAgICAgICAgICAgICAgICAgU2luY2Ugd2F0Y2hpbmcgZm9yIFhSQU5EUiBldmVudHMgYW5kIHRyYXBwaW5nIGVycm9ycwogICAgICAgICAgICAgICAgICAgICAgIGluY3JlYXNlcyBwb2xsaW5nIG92ZXJoZWFkLCBvbmx5IHVzZSB0aGlzIG9wdGlvbiBpZgogICAgICAgICAgICAgICAgICAgICAgIFhSQU5EUiBjaGFuZ2VzIGFyZSBleHBlY3RlZC4gIEZvciBleGFtcGxlIG9uIGEgcm90YXRhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuIFBEQSBvciBsYXB0b3AsIG9yIHVzaW5nIGEgWFJBTkRSLWF3YXJlIERlc2t0b3AKICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSB5b3UgcmVzaXplIG9mdGVuLiAgSXQgaXMgYmVzdCB0byBiZSB2aWV3aW5nIHdpdGggYQogICAgICAgICAgICAgICAgICAgICAgIHZuY3ZpZXdlciB0aGF0IHN1cHBvcnRzIHRoZSBOZXdGQlNpemUgZW5jb2RpbmcsIHNpbmNlIGl0CiAgICAgICAgICAgICAgICAgICAgICAga25vd3MgaG93IHRvIHJlYWN0IHRvIHNjcmVlbiBzaXplIGNoYW5nZXMuICBPdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgICAgICAgTGliVk5DU2VydmVyIHRyaWVzIHRvIGRvIHNvIHNvbWV0aGluZyByZWFzb25hYmxlIGZvcgogICAgICAgICAgICAgICAgICAgICAgIHZpZXdlcnMgdGhhdCBjYW5ub3QgZG8gdGhpcyAocG9ydGlvbnMgb2YgdGhlIHNjcmVlbgogICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBjbGlwcGVkLCB1bnVzZWQsIGV0YykuCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZSBkZWZhdWx0IG5vdyBpcyB0byBjaGVjayBmb3IgWFJBTkRSIGV2ZW50cywgYnV0CiAgICAgICAgICAgICAgICAgICAgICAgZG8gbm90IHRyYXAgZXZlcnkgWCBjYWxsIHRoYXQgbWF5IGZhaWwgZHVlIHRvIHJlc2l6ZS4KICAgICAgICAgICAgICAgICAgICAgICBJZiBhIHJlc2l6ZSBldmVudCBpcyByZWNlaXZlZCwgdGhlIGZ1bGwgLXhyYW5kciBtb2RlCiAgICAgICAgICAgICAgICAgICAgICAgaXMgZW5hYmxlZC4gIFRvIGRpc2FibGUgZXZlbiBjaGVja2luZyBmb3IgZXZlbnRzIHN1cHBseToKICAgICAgICAgICAgICAgICAgICAgICAtbm94cmFuZHIuCgogICAgICAgICAgICAgICAgICAgICAgICJtb2RlIiBkZWZhdWx0cyB0byAicmVzaXplIiwgd2hpY2ggbWVhbnMgY3JlYXRlIGEKICAgICAgICAgICAgICAgICAgICAgICBuZXcsIHJlc2l6ZWQsIGZyYW1lYnVmZmVyIGFuZCBob3BlIGFsbCB2aWV3ZXJzIGNhbiBjb3BlCiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY2hhbmdlLiAgIm5ld2Zic2l6ZSIgbWVhbnMgZmlyc3QgZGlzY29ubmVjdAogICAgICAgICAgICAgICAgICAgICAgIGFsbCB2aWV3ZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIE5ld0ZCU2l6ZSBWTkMKICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZywgYW5kIHRoZW4gcmVzaXplIHRoZSBmcmFtZWJ1ZmZlci4gICJleGl0IgogICAgICAgICAgICAgICAgICAgICAgIG1lYW5zIGRpc2Nvbm5lY3QgYWxsIHZpZXdlciBjbGllbnRzLCBhbmQgdGhlbiB0ZXJtaW5hdGUKICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMuCgotcm90YXRlIHN0cmluZyAgICAgICAgIFJvdGF0ZSBhbmQvb3IgZmxpcCB0aGUgZnJhbWVidWZmZXIgdmlldyBleHBvcnRlZCBieSBWTkMuCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyB0cmFuc2Zvcm1hdGlvbiBpcyBpbmRlcGVuZGVudCBvZiBYUkFORFIgYW5kIGlzCiAgICAgICAgICAgICAgICAgICAgICAgZG9uZSBpbiBzb2Z0d2FyZSBpbiBtYWluIG1lbW9yeSBhbmQgc28gbWF5IGJlIHNsb3dlci4KICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG1vZGUgY291bGQgYmUgdXNlZnVsIG9uIGEgaGFuZGhlbGQgd2l0aCBwb3J0cmFpdCBvcgogICAgICAgICAgICAgICAgICAgICAgIGxhbmRzY2FwZSBtb2RlcyB0aGF0IGRvIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBzY2FubGluZQogICAgICAgICAgICAgICAgICAgICAgIG9yZGVyIG9mIHRoZSBhY3R1YWwgZnJhbWVidWZmZXIuICAic3RyaW5nIiBjYW4gYmU6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggICAgIGZsaXAgYWxvbmcgeC1heGlzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeSAgICAgZmxpcCBhbG9uZyB5LWF4aXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHh5ICAgICBmbGlwIGFsb25nIHgtIGFuZCB5LWF4ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgKzkwICAgICByb3RhdGUgOTAgZGVncmVlcyBjbG9ja3dpc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgLTkwICAgICByb3RhdGUgOTAgZGVncmVlcyBjb3VudGVyLWNsb2Nrd2lzZQogICAgICAgICAgICAgICAgICAgICAgICAgICs5MHggICAgIHJvdGF0ZSA5MCBkZWdyZWVzIENXLCB0aGVuIGZsaXAgYWxvbmcgeAogICAgICAgICAgICAgICAgICAgICAgICAgICs5MHkgICAgIHJvdGF0ZSA5MCBkZWdyZWVzIENXLCB0aGVuIGZsaXAgYWxvbmcgeQoKICAgICAgICAgICAgICAgICAgICAgICB0aGVzZSBnaXZlIGFsbCBwb3NzaWJsZSByb3RhdGlvbnMgYW5kIHJlZmxlY3Rpb25zLgoKICAgICAgICAgICAgICAgICAgICAgICBBbGlhc2VzOiBzYW1lIGFzIHh5OiAgeXgsICsxODAsIC0xODAsIDE4MAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbWUgYXMgLTkwOiArMjcwLCAyNzAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lIGFzICs5MDogOTAsIChkaXR0byBmb3IgOTB4LCA5MHkpCgogICAgICAgICAgICAgICAgICAgICAgIExpa2UgLXNjYWxlLCB0aGlzIHRyYW5zZm9ybWF0aW9uIGlzIGFwcGxpZWQgYXQgdGhlIHZlcnkKICAgICAgICAgICAgICAgICAgICAgICBlbmQgb2YgYW55IGNoYWluIG9mIGZyYW1lYnVmZmVyIHRyYW5zZm9ybWF0aW9ucyBhbmQgc28KICAgICAgICAgICAgICAgICAgICAgICBhbnkgb3B0aW9ucyB3aXRoIGdlb21ldHJpZXMsIGUuZy4gLWJsYWNrb3V0LCAtY2xpcCwgZXRjLgogICAgICAgICAgICAgICAgICAgICAgIGFyZSByZWxhdGl2ZSB0byB0aGUgb3JpZ2luYWwgWCAob3IgLXJhd2ZiKSBmcmFtZWJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICBub3QgdGhlIGZpbmFsIG9uZSBzZW50IHRvIFZOQyB2aWV3ZXJzLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IHdhbnQgdGhlIGN1cnNvciBzaGFwZSB0byBiZSByb3RhdGVkCiAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4ICJzdHJpbmciIHdpdGggIm5jOiIsIGUuZy4gIm5jOis5MCIsCiAgICAgICAgICAgICAgICAgICAgICAgIm5jOnh5IiwgZXRjLgoKLXBhZGdlb20gV3hIICAgICAgICAgICBXaGVuZXZlciBhIG5ldyB2bmN2aWV3ZXIgY29ubmVjdHMsIHRoZSBmcmFtZWJ1ZmZlciBpcwogICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VkIHdpdGggYSBmYWtlLCBzb2xpZCBibGFjayBvbmUgb2YgZ2VvbWV0cnkgV3hILgogICAgICAgICAgICAgICAgICAgICAgIFNob3J0bHkgYWZ0ZXJ3YXJkcyB0aGUgZnJhbWVidWZmZXIgaXMgcmVwbGFjZWQgd2l0aCB0aGUKICAgICAgICAgICAgICAgICAgICAgICByZWFsIG9uZS4gIFRoaXMgaXMgaW50ZW5kZWQgZm9yIHVzZSB3aXRoIHZuY3ZpZXdlcnMKICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGRvIG5vdCBzdXBwb3J0IE5ld0ZCU2l6ZSBhbmQgb25lIHdhbnRzIHRvIG1ha2UKICAgICAgICAgICAgICAgICAgICAgICBzdXJlIHRoZSBpbml0aWFsIHZpZXdlciBnZW9tZXRyeSB3aWxsIGJlIGJpZyBlbm91Z2gKICAgICAgICAgICAgICAgICAgICAgICB0byBoYW5kbGUgYWxsIHN1YnNlcXVlbnQgcmVzaXplcyAoZS5nLiB1bmRlciAteHJhbmRyLAogICAgICAgICAgICAgICAgICAgICAgIC1yZW1vdGUgaWQ6d2luZG93aWQsIHJlc2NhbGluZywgZXRjLikKCiAgICAgICAgICAgICAgICAgICAgICAgSW4gLXVuaXhwdyBtb2RlIHRoaXMgc2V0cyB0aGUgc2l6ZSBvZiB0aGUgbG9naW4gc2NyZWVuLgogICAgICAgICAgICAgICAgICAgICAgIFVzZSAib25jZTpXeEgiIGl0IGlnbm9yZSBwYWRnZW9tIGFmdGVyIHRoZSBsb2dpbgogICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbiBpcyBzZXQgdXAuCgotbyBsb2dmaWxlICAgICAgICAgICAgIFdyaXRlIHN0ZGVyciBtZXNzYWdlcyB0byBmaWxlICJsb2dmaWxlIiBpbnN0ZWFkIG9mIHRvCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRlcm1pbmFsLiAgU2FtZSBhcyAiLWxvZ2ZpbGUgZmlsZSIuICBUbyBhcHBlbmQKICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgZmlsZSB1c2UgIi1vYSBmaWxlIiBvciAiLWxvZ2FwcGVuZCBmaWxlIi4KICAgICAgICAgICAgICAgICAgICAgICBJZiAibG9nZmlsZSIgY29udGFpbnMgdGhlIHN0cmluZyAiJVZOQ0RJU1BMQVkiCiAgICAgICAgICAgICAgICAgICAgICAgaXQgaXMgZXhwYW5kZWQgdG8gdGhlIHZuYyBkaXNwbGF5ICh0aGUgbmFtZSBtYXkgbmVlZAogICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIGd1ZXNzZWQgYXQuKSAgIiVIT01FIiB3b3JrcyB0b28uCgotZmxhZyBmaWxlICAgICAgICAgICAgIFdyaXRlIHRoZSAiUE9SVD1OTk5OIiAoZS5nLiBQT1JUPTU5MDApIHN0cmluZyB0bwogICAgICAgICAgICAgICAgICAgICAgICJmaWxlIiBpbiBhZGRpdGlvbiB0byBzdGRvdXQuICBUaGlzIG9wdGlvbiBjb3VsZCBiZQogICAgICAgICAgICAgICAgICAgICAgIHVzZWZ1bCBieSB3cmFwcGVyIHNjcmlwdCB0byBkZXRlY3Qgd2hlbiB4MTF2bmMgaXMgcmVhZHkuCgotcm1mbGFnIGZpbGUgICAgICAgICAgIFJlbW92ZSAiZmlsZSIgYXQgZXhpdCB0byBzaWduYWwgd2hlbiB4MTF2bmMgaXMgZG9uZS4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgZmlsZSBpcyBjcmVhdGVkIGF0IHN0YXJ0dXAgaWYgaXQgZG9lcyBub3QgYWxyZWFkeQogICAgICAgICAgICAgICAgICAgICAgIGV4aXN0IG9yIGlmICJmaWxlIiBpcyBwcmVmaXhlZCB3aXRoICJjcmVhdGU6Ii4KICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgZmlsZSBpcyBjcmVhdGVkLCB0aGUgeDExdm5jIFBJRCBpcyBwbGFjZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZS4gIE90aGVyd2lzZSB0aGUgZmlsZXMgY29udGVudHMgaXMgbm90IGNoYW5nZWQuCiAgICAgICAgICAgICAgICAgICAgICAgVXNlIHByZWZpeCAibm9jcmVhdGU6IiB0byBwcmV2ZW50IGNyZWF0aW9uLgoKLXJjIGZpbGVuYW1lICAgICAgICAgICBVc2UgImZpbGVuYW1lIiBpbnN0ZWFkIG9mICRIT01FLy54MTF2bmNyYyBmb3IgcmMgZmlsZS4KLW5vcmMgICAgICAgICAgICAgICAgICBEbyBub3QgcHJvY2VzcyBhbnkgLngxMXZuY3JjIGZpbGUgZm9yIG9wdGlvbnMuCgotZW52IFZBUj1WQUxVRSAgICAgICAgIFNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJ1ZBUicgdG8gdmFsdWUgJ1ZBTFVFJwogICAgICAgICAgICAgICAgICAgICAgIGF0IHgxMXZuYyBzdGFydHVwLiAgVGhpcyBpcyBhIGNvbnZlbmllbmNlIHV0aWxpdHkgdG8KICAgICAgICAgICAgICAgICAgICAgICBhdm9pZCBzaGVsbCBzY3JpcHQgd3JhcHBlcnMsIGV0Yy4gdG8gc2V0IHRoZSBlbnYuIHZhci4KICAgICAgICAgICAgICAgICAgICAgICBZb3UgbWF5IHNwZWNpZnkgYXMgbWFueSBvZiB0aGVzZSBhcyBuZWVkZWQgb24gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCBsaW5lLgotcHJvZyAvcGF0aC90by94MTF2bmMgIFNldCB0aGUgZnVsbCBwYXRoIHRvIHRoZSB4MTF2bmMgcHJvZ3JhbSBmb3IgY2FzZXMgd2hlbgogICAgICAgICAgICAgICAgICAgICAgIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkIGZyb20gYXJndlswXSAoZS5nLiB0Y3BkL2luZXRkKQoKLWgsIC1oZWxwICAgICAgICAgICAgICBQcmludCB0aGlzIGhlbHAgdGV4dC4KLT8sIC1vcHRzICAgICAgICAgICAgICBPbmx5IGxpc3QgdGhlIHgxMXZuYyBvcHRpb25zLgotViwgLXZlcnNpb24gICAgICAgICAgIFByaW50IHByb2dyYW0gdmVyc2lvbiBhbmQgbGFzdCBtb2RpZmljYXRpb24gZGF0ZS4KLWxpY2Vuc2UgICAgICAgICAgICAgICBQcmludCBvdXQgbGljZW5zZSBpbmZvcm1hdGlvbi4gIFNhbWUgYXMgLWNvcHlpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgLXdhcnJhbnR5LgoKLWRiZyAgICAgICAgICAgICAgICAgICBJbnN0ZWFkIG9mIGV4aXRpbmcgYWZ0ZXIgY2xlYW5pbmcgdXAsIHJ1biBhIHNpbXBsZQogICAgICAgICAgICAgICAgICAgICAgICJkZWJ1ZyBjcmFzaCBzaGVsbCIgd2hlbiBmYXRhbCBlcnJvcnMgYXJlIHRyYXBwZWQuCgotcSwgLXF1aWV0ICAgICAgICAgICAgIEJlIHF1aWV0IGJ5IHByaW50aW5nIGxlc3MgaW5mb3JtYXRpb25hbCBvdXRwdXQgdG8KICAgICAgICAgICAgICAgICAgICAgICBzdGRlcnIuICh1c2UgLW5vcXVpZXQgdG8gdW5kbyBhbiBlYXJsaWVyIC1xdWlldC4pCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSAtcXVpZXQgb3B0aW9uIGRvZXMgbm90IGVsaW1pbmF0ZSBhbGwgaW5mb3JtYXRpb25hbAogICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwgaXQgb25seSByZWR1Y2VzIGl0LiAgSXQgaXMgaWdub3JlZCBpbiBtb3N0CiAgICAgICAgICAgICAgICAgICAgICAgYXV4aWxpYXJ5IHVzYWdlIG1vZGVzLCBlLmcuIC1zdG9yZXBhc3N3ZC4gIFRvIGVsaW1pbmF0ZQogICAgICAgICAgICAgICAgICAgICAgIGFsbCBvdXRwdXQgdXNlOiAyPi9kZXYvbnVsbCAxPiYyLCBldGMuCgotdiwgLXZlcmJvc2UgICAgICAgICAgIFByaW50IG91dCBtb3JlIGluZm9ybWF0aW9uIHRvIHN0ZGVyci4KCi1iZyAgICAgICAgICAgICAgICAgICAgR28gaW50byB0aGUgYmFja2dyb3VuZCBhZnRlciBzY3JlZW4gc2V0dXAuICBNZXNzYWdlcyB0bwogICAgICAgICAgICAgICAgICAgICAgIHN0ZGVyciBhcmUgbG9zdCB1bmxlc3MgLW8gbG9nZmlsZSBpcyB1c2VkLiAgU29tZXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgbGlrZSB0aGlzIGNvdWxkIGJlIHVzZWZ1bCBpbiBhIHNjcmlwdDoKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydD1gc3NoIC10ICRob3N0ICJ4MTF2bmMgLWRpc3BsYXkgOjAgLWJnIiB8IGdyZXAgUE9SVApgCiAgICAgICAgICAgICAgICAgICAgICAgIHBvcnQ9YGVjaG8gIiRwb3J0IiB8IHNlZCAtZSAncy9QT1JUPS8vJ2AKICAgICAgICAgICAgICAgICAgICAgICAgcG9ydD1gZXhwciAkcG9ydCAtIDU5MDBgCiAgICAgICAgICAgICAgICAgICAgICAgIHZuY3ZpZXdlciAkaG9zdDokcG9ydAoKLW1vZHR3ZWFrICAgICAgICAgICAgICBPcHRpb24gLW1vZHR3ZWFrIGF1dG9tYXRpY2FsbHkgdHJpZXMgdG8gYWRqdXN0IHRoZSBBbHRHcgotbm9tb2R0d2VhayAgICAgICAgICAgIGFuZCBTaGlmdCBtb2RpZmllcnMgZm9yIGRpZmZlcmluZyBsYW5ndWFnZSBrZXlib2FyZHMKICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuIGNsaWVudCBhbmQgaG9zdC4gIE90aGVyd2lzZSwgb25seSBhIHNpbmdsZSBrZXkKICAgICAgICAgICAgICAgICAgICAgICBwcmVzcy9yZWxlYXNlIG9mIGEgS2V5Y29kZSBpcyBzaW11bGF0ZWQgKGkuZS4gaWdub3JpbmcKICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3RhdGUgb2YgdGhlIG1vZGlmaWVyczogdGhpcyB1c3VhbGx5IHdvcmtzIGZvcgogICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWNhbCBrZXlib2FyZHMpLiAgQWxzbyB1c2VmdWwgaW4gcmVzb2x2aW5nIGNhc2VzCiAgICAgICAgICAgICAgICAgICAgICAgd2hlcmUgYSBLZXlzeW0gaXMgYm91bmQgdG8gbXVsdGlwbGUga2V5cyAoZS5nLiAiPCIgKyAiPiIKICAgICAgICAgICAgICAgICAgICAgICBhbmQgIiwiICsgIjwiIGtleXMpLiAgRGVmYXVsdDogLW1vZHR3ZWFrCgogICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBhcmUgaGF2aW5nIHRyb3VibGUgd2l0aCB3aXRoIGtleXMgYW5kIC14a2Igb3IKICAgICAgICAgICAgICAgICAgICAgICAtbm94a2IsIGFuZCBzaW1pbGFyIHRoaW5ncyBkb24ndCBoZWxwLCB0cnkgLW5vbW9kdHdlYWsuCgogICAgICAgICAgICAgICAgICAgICAgIE9uIHNvbWUgSFAtVVggc3lzdGVtcyBpdCBpcyBiZWVuIG5vdGVkIHRoYXQgdGhleSBoYXZlCiAgICAgICAgICAgICAgICAgICAgICAgYW4gb2RkIGtleW1hcHBpbmcgd2hlcmUgYSBzaW5nbGUga2V5Y29kZSB3aWxsIGhhdmUgYQogICAgICAgICAgICAgICAgICAgICAgIGtleXN5bSwgZS5nLiAiIyIsIHVwIHRvIHRocmVlIHRpbWVzLiAgWW91IGNhbiBjaGVjawogICAgICAgICAgICAgICAgICAgICAgIHZpYSAieG1vZG1hcCAtcGsiIG9yIHRoZSAtZGsgb3B0aW9uLiAgVGhlIGZhaWx1cmUKICAgICAgICAgICAgICAgICAgICAgICBpcyB3aGVuIHlvdSB0cnkgdG8gdHlwZSAiIyIgaXQgeWllbGRzICIzIi4gIElmIHlvdQogICAgICAgICAgICAgICAgICAgICAgIHNlZSB0aGlzIHByb2JsZW0gdHJ5IHNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgTU9EVFdFQUtfTE9XRVNUPTEgdG8gc2VlIGlmIGl0IGhlbHBzLgoKLXhrYiAgICAgICAgICAgICAgICAgICBXaGVuIGluIG1vZHR3ZWFrIG1vZGUsIHVzZSB0aGUgWEtFWUJPQVJEIGV4dGVuc2lvbiAoaWYKLW5veGtiICAgICAgICAgICAgICAgICB0aGUgWCBkaXNwbGF5IHN1cHBvcnRzIGl0KSB0byBkbyB0aGUgbW9kaWZpZXIgdHdlYWtpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBwb3dlcmZ1bCBhbmQgc2hvdWxkIGJlIHRyaWVkIGlmIHRoZXJlIGFyZSBzdGlsbAogICAgICAgICAgICAgICAgICAgICAgIGtleW1hcHBpbmcgcHJvYmxlbXMgd2hlbiB1c2luZyAtbW9kdHdlYWsgYnkgaXRzZWxmLgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIHRvIGNoZWNrIHdoZXRoZXIgc29tZSBjb21tb24ga2V5c3ltcywKICAgICAgICAgICAgICAgICAgICAgICBlLmcuICEsIEAsIFssIGFyZSBvbmx5IGFjY2Vzc2libGUgdmlhIC14a2IgbW9kZSBhbmQgaWYKICAgICAgICAgICAgICAgICAgICAgICBzbyB0aGVuIGF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSBtb2RlLiAgVG8gZGlzYWJsZSB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljIGRldGVjdGlvbiB1c2UgLW5veGtiLgoKICAgICAgICAgICAgICAgICAgICAgICBXaGVuIC14a2IgbW9kZSBpcyBhY3RpdmUgeW91IGNhbiBzZXQgdGhlc2UgZW52LiB2YXJzLgogICAgICAgICAgICAgICAgICAgICAgIFRoZXkgYXBwbHkgb25seSB3aGVuIHRoZXJlIGlzIGFtYmlndWl0eSBhcyB0byB3aGljaAogICAgICAgICAgICAgICAgICAgICAgIGtleSB0byBjaG9vc2UgKGkuZSB0aGUgbWFwcGluZyBpcyBub3Qgb25lLXRvLW9uZSkuCiAgICAgICAgICAgICAgICAgICAgICAgTk9LRVlISU5UUz0xOiBmb3IgdXAgYXNjaWkga2V5c3Ryb2tlcyBkbyBub3QgdXNlIHNjb3JlCiAgICAgICAgICAgICAgICAgICAgICAgaGludHMgc2F2ZWQgd2hlbiB0aGUga2V5IHdhcyBwcmVzc2VkIGRvd24uIE5PQU5ZRE9XTj0xOgogICAgICAgICAgICAgICAgICAgICAgIGZvciB1cCBrZXlzdHJva2VzIGRvIG5vdCByZXNvcnQgdG8gc2VhcmNoaW5nIHRocm91Z2gKICAgICAgICAgICAgICAgICAgICAgICBrZXlzIHRoYXQgYXJlIGN1cnJlbnRseSBwcmVzc2VkIGRvd24uICBLRVlTRE9XTj1OOgogICAgICAgICAgICAgICAgICAgICAgIHJlbWVtYmVyIHRoZSBsYXN0IE4ga2V5cyBwcmVzcyBkb3duIGZvciB0aWUtYnJlYWtpbmcKICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGFuIHVwIGtleXN0cm9rZSBjb21lcyBpbi4KCi1jYXBzbG9jayAgICAgICAgICAgICAgV2hlbiBpbiAtbW9kdHdlYWsgKHRoZSBkZWZhdWx0KSBvciAteGtiIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgaWYgYSBrZXlzeW0gaW4gdGhlIHJhbmdlIEEtWiBjb21lcyBpbiBjaGVjayB0aGUgWAogICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciB0byBzZWUgaWYgdGhlIENhcHNfTG9jayBpcyBzZXQuICBJZiBpdCBpcyBkbwogICAgICAgICAgICAgICAgICAgICAgIG5vdCBhcnRpZmljaWFsbHkgcHJlc3MgU2hpZnQgdG8gZ2VuZXJhdGUgdGhlIGtleXN5bS4KICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgZW5hYmxlIHRoZSBDYXBzTG9jayBrZXkgdG8gYmVoYXZlIGNvcnJlY3RseQogICAgICAgICAgICAgICAgICAgICAgIGluIHNvbWUgY2lyY3Vtc3RhbmNlczogbmFtZWx5ICpib3RoKiB0aGUgVk5DIHZpZXdlcgogICAgICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgYW5kIHRoZSB4MTF2bmMgWCBzZXJ2ZXIgYXJlIGluIHRoZSBDYXBzTG9jawogICAgICAgICAgICAgICAgICAgICAgIG9uIHN0YXRlLiAgSWYgb25lIHNpZGUgaGFzIENhcHNMb2NrIG9uIGFuZCB0aGUgb3RoZXIKICAgICAgICAgICAgICAgICAgICAgICBvZmYgYW5kIHRoZSBrZXlib2FyZCBpcyBub3QgYmVoYXZpbmcgYXMgeW91IHRoaW5rIGl0CiAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIHlvdSBzaG91bGQgY29ycmVjdCB0aGUgQ2Fwc0xvY2sgc3RhdGVzIChoaW50OgogICAgICAgICAgICAgICAgICAgICAgIHByZXNzaW5nIENhcHNMb2NrIGluc2lkZSBhbmQgb3V0c2lkZSBvZiB0aGUgdmlld2VyIGNhbgogICAgICAgICAgICAgICAgICAgICAgIGhlbHAgdG9nZ2xlIHRoZW0gYm90aCB0byB0aGUgY29ycmVjdCBzdGF0ZSkuICBIb3dldmVyLAogICAgICAgICAgICAgICAgICAgICAgIGZvciBiZXN0IHJlc3VsdHMgZG8gbm90IHVzZSB0aGlzIG9wdGlvbiwgYnV0IHJhdGhlcgogICAgICAgICAgICAgICAgICAgICAgICpvbmx5KiBlbmFibGUgQ2Fwc0xvY2sgb24gdGhlIFZOQyB2aWV3ZXIgc2lkZSAoaS5lLiBieQogICAgICAgICAgICAgICAgICAgICAgIHByZXNzaW5nIENhcHNMb2NrIG91dHNpZGUgb2YgdGhlIHZpZXdlciB3aW5kb3csIGFsc28KICAgICAgICAgICAgICAgICAgICAgICAtc2tpcF9sb2Nra2V5cyBiZWxvdykuICBBbHNvIHRyeSAtbm9tb2R0d2VhayBmb3IgYQogICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlIHdvcmthcm91bmQuCgotc2tpcF9sb2Nra2V5cyAgICAgICAgIEhhdmUgeDExdm5jIGlnbm9yZSBhbGwgQ2Fwc19Mb2NrLCBTaGlmdF9Mb2NrLCBOdW1fTG9jaywKLW5vc2tpcF9sb2Nra2V5cyAgICAgICBTY3JvbGxfTG9jayBrZXlzeW1zIHJlY2VpdmVkIGZyb20gdmlld2Vycy4gIFRoZSBpZGVhIGlzCiAgICAgICAgICAgICAgICAgICAgICAgeW91IHByZXNzIENhcHNfTG9jayBvbiB0aGUgVk5DIFZpZXdlciBzaWRlIGJ1dCB0aGF0IGRvZXMKICAgICAgICAgICAgICAgICAgICAgICBub3QgY2hhbmdlIHRoZSBsb2NrIHN0YXRlIGluIHRoZSB4MTF2bmMtc2lkZSBYIHNlcnZlci4KICAgICAgICAgICAgICAgICAgICAgICBOZXZlcnRoZWxlc3MgeW91ciBjYXBpdGFsaXplZCBsZXR0ZXJzIGNvbWUgaW4gb3ZlcgogICAgICAgICAgICAgICAgICAgICAgIHRoZSB3aXJlIGFuZCBhcmUgYXBwbGllZCBjb3JyZWN0bHkgdG8gdGhlIHgxMXZuYy1zaWRlCiAgICAgICAgICAgICAgICAgICAgICAgWCBzZXJ2ZXIuICBOb3RlIHRoaXMgbW9kZSBwcm9iYWJseSB3b24ndCBkbyB3aGF0IHlvdQogICAgICAgICAgICAgICAgICAgICAgIHdhbnQgaW4gLW5vbW9kdHdlYWsgbW9kZS4gIEFsc28sIGEga2x1ZGdlIGZvciBLUF9uCiAgICAgICAgICAgICAgICAgICAgICAgZGlnaXRzIGlzIGFsd2F5cyBkb25lIGluIHRoaXMgbW9kZTogdGhleSBhcmUgbWFwcGVkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciBkaWdpdCBrZXlzeW1zLiAgU2VlIGFsc28gLWNhcHNsb2NrIGFib3ZlLgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IGlzIC1ub3NraXBfbG9ja2tleXMuCgotc2tpcF9rZXljb2RlcyBzdHJpbmcgIElnbm9yZSB0aGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgZGVjaW1hbCBrZXljb2Rlcy4KICAgICAgICAgICAgICAgICAgICAgICBQZXJoYXBzIHRoZXNlIGFyZSBrZXljb2RlcyBub3Qgb24geW91ciBrZXlib2FyZCBidXQKICAgICAgICAgICAgICAgICAgICAgICB5b3VyIFggc2VydmVyIHRoaW5rcyBleGlzdC4gIEN1cnJlbnRseSBvbmx5IGFwcGxpZXMKICAgICAgICAgICAgICAgICAgICAgICB0byAteGtiIG1vZGUuICBVc2UgdGhpcyBvcHRpb24gdG8gaGVscCB4MTF2bmMgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgcmV2ZXJzZSBwcm9ibGVtIGl0IHRyaWVzIHRvIHNvbHZlOiBLZXlzeW0gLT4gS2V5Y29kZShzKQogICAgICAgICAgICAgICAgICAgICAgIHdoZW4gYW1iaWd1aXRpZXMgZXhpc3QgKG1vcmUgdGhhbiBvbmUgS2V5Y29kZSBwZXIKICAgICAgICAgICAgICAgICAgICAgICBLZXlzeW0pLiAgUnVuICd4bW9kbWFwIC1waycgdG8gc2VlIHlvdXIga2V5bWFwcGluZy4KICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlOiAiLXNraXBfa2V5Y29kZXMgOTQsMTE0Igotc2xvcHB5X2tleXMgICAgICAgICAgIEV4cGVyaW1lbnRhbCBvcHRpb24gdGhhdCB0cmllcyB0byBjb3JyZWN0IHNvbWUKICAgICAgICAgICAgICAgICAgICAgICAic2xvcHB5IiBrZXkgYmVoYXZpb3IuICBFLmcuIGlmIGF0IHRoZSB2aWV3ZXIgeW91CiAgICAgICAgICAgICAgICAgICAgICAgcHJlc3MgU2hpZnQrS2V5IGJ1dCB0aGVuIHJlbGVhc2UgdGhlIFNoaWZ0IGJlZm9yZQogICAgICAgICAgICAgICAgICAgICAgIEtleSB0aGF0IGNvdWxkIGdpdmUgcmlzZSB0byBleHRyYSB1bndhbnRlZCBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgb25seSBiZXR3ZWVuIGtleWJvYXJkcyBvZiBkaWZmZXJlbnQgbGFuZ3VhZ2VzKS4KICAgICAgICAgICAgICAgICAgICAgICBPbmx5IHVzZSB0aGlzIG9wdGlvbiBpZiB5b3Ugb2JzZXJ2ZSBwcm9ibGVtcyB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgc29tZSBrZXlzdHJva2VzLgotc2tpcF9kdXBzICAgICAgICAgICAgIFNvbWUgVk5DIHZpZXdlcnMgc2VuZCBpbXBvc3NpYmxlIHJlcGVhdGVkIGtleSBldmVudHMsCi1ub3NraXBfZHVwcyAgICAgICAgICAgZS5nLiBrZXktZG93biwga2V5LWRvd24sIGtleS11cCwga2V5LXVwIGFsbCBmb3IgdGhlIHNhbWUKICAgICAgICAgICAgICAgICAgICAgICBrZXksIG9yIDIwIGRvd25zIGluIGEgcm93IGZvciB0aGUgc2FtZSBtb2RpZmllciBrZXkhCiAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZyAtc2tpcF9kdXBzIG1lYW5zIHRvIHNraXAgdGhlc2UgZHVwbGljYXRlcyBhbmQKICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHByb2Nlc3MgdGhlIGZpcnN0IGV2ZW50LiBOb3RlOiBzb21lIFZOQyB2aWV3ZXJzCiAgICAgICAgICAgICAgICAgICAgICAgYXNzdW1lIHRoZXkgY2FuIHNlbmQgZG93bidzIHdpdGhvdXQgdGhlIGNvcnJlc3BvbmRpbmcKICAgICAgICAgICAgICAgICAgICAgICB1cCdzIGFuZCBzbyB5b3Ugc2hvdWxkIG5vdCBzZXQgdGhpcyBvcHRpb24gZm9yCiAgICAgICAgICAgICAgICAgICAgICAgdGhlc2Ugdmlld2VycyAoc3ltcHRvbTogc29tZSBrZXlzIGRvIG5vdCBhdXRvcmVwZWF0KQogICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IC1ub3NraXBfZHVwcwotYWRkX2tleXN5bXMgICAgICAgICAgIElmIGEgS2V5c3ltIGlzIHJlY2VpdmVkIGZyb20gYSBWTkMgdmlld2VyIGFuZCB0aGF0Ci1ub2FkZF9rZXlzeW1zICAgICAgICAgS2V5c3ltIGRvZXMgbm90IGV4aXN0IGluIHRoZSBYIHNlcnZlciwgdGhlbiBhZGQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgS2V5c3ltIHRvIHRoZSBYIHNlcnZlcidzIGtleWJvYXJkIG1hcHBpbmcgb24gYW4gdW51c2VkCiAgICAgICAgICAgICAgICAgICAgICAga2V5LiAgQWRkZWQgS2V5c3ltcyB3aWxsIGJlIHJlbW92ZWQgcGVyaW9kaWNhbGx5IGFuZAogICAgICAgICAgICAgICAgICAgICAgIGFsc28gd2hlbiB4MTF2bmMgZXhpdHMuICBEZWZhdWx0OiAtYWRkX2tleXN5bXMKLWNsZWFyX21vZHMgICAgICAgICAgICBBdCBzdGFydHVwIGFuZCBleGl0IGNsZWFyIHRoZSBtb2RpZmllciBrZXlzIGJ5IHNlbmRpbmcKICAgICAgICAgICAgICAgICAgICAgICBLZXlSZWxlYXNlIGZvciBlYWNoIG9uZS4gVGhlIExvY2sgbW9kaWZpZXJzIGFyZSBza2lwcGVkLgogICAgICAgICAgICAgICAgICAgICAgIFVzZWQgdG8gY2xlYXIgdGhlIHN0YXRlIGlmIHRoZSBkaXNwbGF5IHdhcyBhY2NpZGVudGFsbHkKICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IHdpdGggYW55IHByZXNzZWQgZG93bi4KLWNsZWFyX2tleXMgICAgICAgICAgICBBcyAtY2xlYXJfbW9kcywgZXhjZXB0IHRyeSB0byByZWxlYXNlIEFOWSBwcmVzc2VkIGtleS4KICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYW5kIC1jbGVhcl9tb2RzIGNhbiBpbnRlcmZlcmUKICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgcGVyc29uIHR5cGluZyBhdCB0aGUgcGh5c2ljYWwga2V5Ym9hcmQuCi1jbGVhcl9hbGwgICAgICAgICAgICAgQXMgLWNsZWFyX2tleXMsIGV4Y2VwdCB0cnkgdG8gcmVsZWFzZSBhbnkgQ2Fwc0xvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgTnVtTG9jaywgZXRjLiBsb2NrcyBhcyB3ZWxsLgoKLXJlbWFwIHN0cmluZyAgICAgICAgICBSZWFkIEtleXN5bSByZW1hcHBpbmdzIGZyb20gZmlsZSBuYW1lZCAic3RyaW5nIi4KICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQgaXMgb25lIHBhaXIgb2YgS2V5c3ltcyBwZXIgbGluZSAoY2FuIGJlIG5hbWUKICAgICAgICAgICAgICAgICAgICAgICBvciBoZXggdmFsdWUpIHNlcGFyYXRlZCBieSBhIHNwYWNlLiAgSWYgbm8gZmlsZSBuYW1lZAogICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmciIGV4aXN0cywgaXQgaXMgaW5zdGVhZCBpbnRlcnByZXRlZCBhcyB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgZm9ybToga2V5MS1rZXkyLGtleTMta2V5NCwuLi4gIFNlZSA8WDExL2tleXN5bWRlZi5oPgogICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciBmaWxlIGZvciBhIGxpc3Qgb2YgS2V5c3ltIG5hbWVzLCBvciB1c2UgeGV2KDEpLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyBtYXAgYSBrZXkgdG8gYSBidXR0b24gY2xpY2ssIHVzZSB0aGUgZmFrZSBLZXlzeW1zCiAgICAgICAgICAgICAgICAgICAgICAgIkJ1dHRvbjEiLCAuLi4sIGV0Yy4gRS5nOiAiLXJlbWFwIFN1cGVyX1ItQnV0dG9uMiIKICAgICAgICAgICAgICAgICAgICAgICAodXNlZnVsIGZvciBwYXN0aW5nIG9uIGEgbGFwdG9wKQoKICAgICAgICAgICAgICAgICAgICAgICBJIHVzZSB0aGVzZSBpZiB0aGUgbWFjaGluZSBJIGFtIHZpZXdpbmcgZnJvbSBkb2VzIG5vdAogICAgICAgICAgICAgICAgICAgICAgIGhhdmUgYSBzY3JvbGx3aGVlbCBvciBJIGRvbid0IGxpa2UgdXNpbmcgdGhlIG9uZSBpdCBoYXM6CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmVtYXAgU3VwZXJfUi1CdXR0b240LE1lbnUtQnV0dG9uNQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtcmVtYXAgS1BfQWRkLUJ1dHRvbjQsS1BfRW50ZXItQnV0dG9uNQoKICAgICAgICAgICAgICAgICAgICAgICB0aGUgZm9ybWVyIHdvdWxkIGJlIHVzZWQgb24gYSBQQywgdGhlIGxhdHRlciBvbiBhCiAgICAgICAgICAgICAgICAgICAgICAgTWFjQm9vay4gIFRoaXMgd2F5IHRob3NlIGxpdHRsZSB1c2VkIGtleXMgY2FuIGJlIHVzZWQKICAgICAgICAgICAgICAgICAgICAgICB0byBnZW5lcmF0ZSBiaWdnZXIgaG9wcyB0aGFuIHRoZSBVcCBhbmQgRG93biBhcnJvd3MKICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlLiAgT25lIGNhbiBzY3JvbGwgdGhyb3VnaCB0ZXh0IG9yIHdlYiBwYWdlcyBtb3JlCiAgICAgICAgICAgICAgICAgICAgICAgcXVpY2tseSB0aGlzIHdheSAoZXNwZWNpYWxseSBpZiB4MTF2bmMgc2Nyb2xsIGRldGVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgIGlzIGFjdGl2ZS4pCgogICAgICAgICAgICAgICAgICAgICAgIFVzZSBCdXR0b240NCwgQnV0dG9uMTIsIGV0Yy4gZm9yIG11bHRpcGxlIGNsaWNrcy4KCiAgICAgICAgICAgICAgICAgICAgICAgVG8gZGlzYWJsZSBhIGtleXN5bSAoaS5lLiBtYWtlIGl0IHNvIGl0IHdpbGwgbm90IGJlCiAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWQpLCByZW1hcCBpdCB0byAiTm9TeW1ib2wiIG9yICJOb25lIi4KCiAgICAgICAgICAgICAgICAgICAgICAgRGVhZCBrZXlzOiAiZGVhZCIgKG9yIHNpbGVudCwgbXV0ZSkga2V5cyBhcmUga2V5cyB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgZG8gbm90IHByb2R1Y2UgYSBjaGFyYWN0ZXIgYnV0IG11c3QgYmUgZm9sbG93ZWQgYnkgYSAybmQKICAgICAgICAgICAgICAgICAgICAgICBrZXlzdHJva2UuICBUaGlzIGlzIG9mdGVuIHVzZWQgZm9yIGFjY2VudGluZyBjaGFyYWN0ZXJzLAogICAgICAgICAgICAgICAgICAgICAgIGUuZy4gdG8gcHV0ICJgIiBvbiB0b3Agb2YgImEiIGJ5IHByZXNzaW5nIHRoZSBkZWFkCiAgICAgICAgICAgICAgICAgICAgICAga2V5IGFuZCB0aGVuICJhIi4gIE5vdGUgdGhhdCB0aGlzIGludGVycHJldGF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHBhcnQgb2YgY29yZSBYMTEsIGl0IGlzIHVwIHRvIHRoZSB0b29sa2l0IG9yCiAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gdG8gZGVjaWRlIGhvdyB0byByZWFjdCB0byB0aGUgc2VxdWVuY2UuCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIFgxMSBuYW1lcyBmb3IgdGhlc2Uga2V5c3ltcyBhcmUgImRlYWRfZ3JhdmUiLAogICAgICAgICAgICAgICAgICAgICAgICJkZWFkX2FjdXRlIiwgZXRjLiAgSG93ZXZlciBzb21lIFZOQyB2aWV3ZXJzIHNlbmQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAga2V5c3ltcyAiZ3JhdmUiLCAiYWN1dGUiIGluc3RlYWQgdGhlcmVieSBkaXNhYmxpbmcKICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWNjZW50aW5nLiAgVG8gd29yayBhcm91bmQgdGhpcyAtcmVtYXAgY2FuIGJlIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUgIi1yZW1hcCBncmF2ZS1kZWFkX2dyYXZlLGFjdXRlLWRlYWRfYWN1dGUiCiAgICAgICAgICAgICAgICAgICAgICAgQXMgYSBjb252ZW5pZW5jZSwgIi1yZW1hcCBERUFEIiBhcHBsaWVzIHRoZXNlIHJlbWFwczoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnICAgICBncmF2ZS1kZWFkX2dyYXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhICAgICBhY3V0ZS1kZWFkX2FjdXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjICAgICBhc2NpaWNpcmN1bS1kZWFkX2NpcmN1bWZsZXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgICAgIGFzY2lpdGlsZGUtZGVhZF90aWxkZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbSAgICAgbWFjcm9uLWRlYWRfbWFjcm9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiICAgICBicmV2ZS1kZWFkX2JyZXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEICAgICBhYm92ZWRvdC1kZWFkX2Fib3ZlZG90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkICAgICBkaWFlcmVzaXMtZGVhZF9kaWFlcmVzaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG8gICAgIGRlZ3JlZS1kZWFkX2Fib3ZlcmluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSAgICAgZG91YmxlYWN1dGUtZGVhZF9kb3VibGVhY3V0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciAgICAgY2Fyb24tZGVhZF9jYXJvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSAgICAgY2VkaWxsYS1kZWFkX2NlZGlsbGEKCiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGp1c3Qgd2FudCBhIHN1YnNldCB1c2UgdGhlIGZpcnN0IGxldHRlcgogICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLCBlLmcuICItcmVtYXAgREVBRD1nYSIgdG8gZ2V0IHRoZSBmaXJzdCB0d28uCiAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCByZW1hcHMgbWF5IGFsc28gYmUgc3VwcGxpZWQgdmlhIGNvbW1hcywKICAgICAgICAgICAgICAgICAgICAgICBlLmcuICAiLXJlbWFwIERFQUQ9Z2EsU3VwZXJfUi1CdXR0b24yIi4gIEZpbmFsbHksCiAgICAgICAgICAgICAgICAgICAgICAgIkRFQUQ9bWlzc2luZyIgbWVhbnMgdG8gYXBwbHkgYWxsIG9mIHRoZSBhYm92ZSBhcwogICAgICAgICAgICAgICAgICAgICAgIGxvbmcgYXMgdGhlIGxlZnQgaGFuZCBtZW1iZXIgaXMgbm90IGFscmVhZHkgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgWDExIGtleW1hcC4KCi1ub3JlcGVhdCAgICAgICAgICAgICAgT3B0aW9uIC1ub3JlcGVhdCBkaXNhYmxlcyBYIHNlcnZlciBrZXkgYXV0byByZXBlYXQgd2hlbgotcmVwZWF0ICAgICAgICAgICAgICAgIFZOQyBjbGllbnRzIGFyZSBjb25uZWN0ZWQgYW5kIFZOQyBrZXlib2FyZCBpbnB1dCBpcwogICAgICAgICAgICAgICAgICAgICAgIG5vdCBpZGxlIGZvciBtb3JlIHRoYW4gNSBtaW51dGVzLiAgVGhpcyB3b3JrcyBhcm91bmQgYQogICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGluZyBrZXlzdHJva2VzIGJ1ZyAodHJpZ2dlcmVkIGJ5IGxvbmcgcHJvY2Vzc2luZwogICAgICAgICAgICAgICAgICAgICAgIGRlbGF5cyBiZXR3ZWVuIGtleSBkb3duIGFuZCBrZXkgdXAgY2xpZW50IGV2ZW50czoKICAgICAgICAgICAgICAgICAgICAgICBlaXRoZXIgZnJvbSBsYXJnZSBzY3JlZW4gY2hhbmdlcyBvciBoaWdoIGxhdGVuY3kpLgogICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IC1ub3JlcGVhdAoKICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHNldCB0aGUgZW52LiB2YXIuIFgxMVZOQ19JRExFX1RJTUVPVVQgdG8gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGlkbGUgc2Vjb25kcyB5b3Ugd2FudCAoNW1pbiA9IDMwMHNlY3MpLgoKICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiB5b3VyIFZOQyB2aWV3ZXIgc2lkZSB3aWxsIGxpa2VseSBkbyBhdXRvcmVwZWF0aW5nLAogICAgICAgICAgICAgICAgICAgICAgIHNvIHRoaXMgaXMgbm8gbG9zcyB1bmxlc3Mgc29tZW9uZSBpcyBzaW11bHRhbmVvdXNseSBhdAogICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWFsIFggZGlzcGxheS4KCiAgICAgICAgICAgICAgICAgICAgICAgVXNlICItbm9yZXBlYXQgTiIgdG8gc2V0IGhvdyBtYW55IHRpbWVzIG5vcmVwZWF0IHdpbGwKICAgICAgICAgICAgICAgICAgICAgICBiZSByZXNldCBpZiBzb21ldGhpbmcgZWxzZSAoZS5nLiBYIHNlc3Npb24gbWFuYWdlcikKICAgICAgICAgICAgICAgICAgICAgICB1bmRvZXMgaXQuICBUaGUgZGVmYXVsdCBpcyAyLiAgVXNlIGEgbmVnYXRpdmUgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICBmb3IgdW5saW1pdGVkIHJlc2V0cy4KCi1ub2ZiICAgICAgICAgICAgICAgICAgSWdub3JlIHZpZGVvIGZyYW1lYnVmZmVyOiBvbmx5IHByb2Nlc3Mga2V5Ym9hcmQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlci4gIEludGVuZGVkIGZvciB1c2Ugd2l0aCBXaW4yVk5DIGFuZCB4MnZuYwogICAgICAgICAgICAgICAgICAgICAgIGR1YWwtbW9uaXRvciBzZXR1cHMuCi1ub2JlbGwgICAgICAgICAgICAgICAgRG8gbm90IHdhdGNoIGZvciBYQmVsbCBldmVudHMuIChubyBiZWVwcyB3aWxsIGJlIGhlYXJkKQogICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFhCZWxsIG1vbml0b3JpbmcgcmVxdWlyZXMgdGhlIFhLRVlCT0FSRCBleHRlbnNpb24uCi1ub3NlbCAgICAgICAgICAgICAgICAgRG8gbm90IG1hbmFnZSBleGNoYW5nZSBvZiBYIHNlbGVjdGlvbi9jdXRidWZmZXIgYmV0d2VlbgogICAgICAgICAgICAgICAgICAgICAgIFZOQyB2aWV3ZXJzIGFuZCB0aGUgWCBzZXJ2ZXIgYXQgYWxsLgotbm9wcmltYXJ5ICAgICAgICAgICAgIERvIG5vdCBwb2xsIHRoZSBQUklNQVJZIHNlbGVjdGlvbiBmb3IgY2hhbmdlcyB0byBzZW5kCiAgICAgICAgICAgICAgICAgICAgICAgYmFjayB0byBjbGllbnRzLiAgKFBSSU1BUlkgaXMgc3RpbGwgc2V0IG9uIHJlY2VpdmVkCiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcywgaG93ZXZlcikuCi1ub3NldHByaW1hcnkgICAgICAgICAgRG8gbm90IHNldCB0aGUgUFJJTUFSWSBzZWxlY3Rpb24gZm9yIGNoYW5nZXMgcmVjZWl2ZWQKICAgICAgICAgICAgICAgICAgICAgICBmcm9tIFZOQyBjbGllbnRzLgotbm9jbGlwYm9hcmQgICAgICAgICAgIERvIG5vdCBwb2xsIHRoZSBDTElQQk9BUkQgc2VsZWN0aW9uIGZvciBjaGFuZ2VzIHRvIHNlbmQKICAgICAgICAgICAgICAgICAgICAgICBiYWNrIHRvIGNsaWVudHMuICAoQ0xJUEJPQVJEIGlzIHN0aWxsIHNldCBvbiByZWNlaXZlZAogICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMsIGhvd2V2ZXIpLgotbm9zZXRjbGlwYm9hcmQgICAgICAgIERvIG5vdCBzZXQgdGhlIENMSVBCT0FSRCBzZWxlY3Rpb24gZm9yIGNoYW5nZXMKICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZCBmcm9tIFZOQyBjbGllbnRzLgotc2VsZGlyIHN0cmluZyAgICAgICAgIElmIGRpcmVjdGlvbiBzdHJpbmcgaXMgInNlbmQiLCBvbmx5IHNlbmQgdGhlIHNlbGVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgIHRvIHZpZXdlcnMsIGFuZCBpZiBpdCBpcyAicmVjdiIgb25seSByZWNlaXZlIGl0IGZyb20KICAgICAgICAgICAgICAgICAgICAgICB2aWV3ZXJzLiAgVG8gd29yayBhcm91bmQgYXBwcyBzZXR0aW5nIHRoZSBzZWxlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICB0b28gZnJlcXVlbnRseSBhbmQgbWVzc2luZyB1cCB0aGUgb3RoZXIgZW5kLiAgWW91IGNhbgogICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5IHN1cHBseSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGRpcmVjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkaW5nICJkZWJ1ZyIgdG8gdHVybiBvbiBkZWJ1Z2dpbmcgb3V0cHV0LgoKLWN1cnNvciBbbW9kZV0gICAgICAgICBTZXRzIGhvdyB0aGUgcG9pbnRlciBjdXJzb3Igc2hhcGUgKGxpdHRsZSBpY29uIGF0IHRoZQotbm9jdXJzb3IgICAgICAgICAgICAgIG1vdXNlIHBvaW50ZXIpIHNob3VsZCBiZSBoYW5kbGVkLiAgVGhlICJtb2RlIiBzdHJpbmcKICAgICAgICAgICAgICAgICAgICAgICBpcyBvcHRpb25hbCBhbmQgaXMgZGVzY3JpYmVkIGJlbG93LiAgVGhlIGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICBpcyB0byBzaG93IHNvbWUgc29ydCBvZiBjdXJzb3Igc2hhcGUocykuICBIb3cgdGhpcwogICAgICAgICAgICAgICAgICAgICAgIGlzIGRvbmUgZGVwZW5kcyBvbiB0aGUgVk5DIHZpZXdlciBhbmQgdGhlIFggc2VydmVyLgogICAgICAgICAgICAgICAgICAgICAgIFVzZSAtbm9jdXJzb3IgdG8gZGlzYWJsZSBjdXJzb3Igc2hhcGVzIGNvbXBsZXRlbHkuCgogICAgICAgICAgICAgICAgICAgICAgIFNvbWUgVk5DIHZpZXdlcnMgc3VwcG9ydCB0aGUgVGlnaHRWTkMgQ3Vyc29yUG9zVXBkYXRlcwogICAgICAgICAgICAgICAgICAgICAgIGFuZCBDdXJzb3JTaGFwZVVwZGF0ZXMgZXh0ZW5zaW9ucyAoY3V0cyBkb3duIG9uCiAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yayB0cmFmZmljIGJ5IG5vdCBoYXZpbmcgdG8gc2VuZCB0aGUgY3Vyc29yIGltYWdlCiAgICAgICAgICAgICAgICAgICAgICAgZXZlcnkgdGltZSB0aGUgcG9pbnRlciBpcyBtb3ZlZCksIGluIHdoaWNoIGNhc2UgdGhlc2UKICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zIGFyZSB1c2VkIChzZWUgLW5vY3Vyc29yc2hhcGUgYW5kIC1ub2N1cnNvcnBvcwogICAgICAgICAgICAgICAgICAgICAgIGJlbG93IHRvIGRpc2FibGUpLiAgRm9yIG90aGVyIHZpZXdlcnMgdGhlIGN1cnNvciBzaGFwZQogICAgICAgICAgICAgICAgICAgICAgIGlzIHdyaXR0ZW4gZGlyZWN0bHkgdG8gdGhlIGZyYW1lYnVmZmVyIGV2ZXJ5IHRpbWUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBpcyBtb3ZlZCBvciBjaGFuZ2VkIGFuZCBnZXRzIHNlbnQgYWxvbmcgd2l0aAogICAgICAgICAgICAgICAgICAgICAgIHRoZSBvdGhlciBmcmFtZWJ1ZmZlciB1cGRhdGVzLiAgSW4gdGhpcyBjYXNlLCB0aGVyZQogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc29tZSBsYWcgYmV0d2VlbiB0aGUgdm5jIHZpZXdlciBwb2ludGVyIGFuZAogICAgICAgICAgICAgICAgICAgICAgIHRoZSByZW1vdGUgY3Vyc29yIHBvc2l0aW9uLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgWCBkaXNwbGF5IHN1cHBvcnRzIHJldHJpZXZpbmcgdGhlIGN1cnNvciBzaGFwZQogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGZyb20gdGhlIFggc2VydmVyLCB0aGVuIHRoZSBkZWZhdWx0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIHRoYXQgbW9kZS4gIE9uIFNvbGFyaXMgdGhpcyBjYW4gYmUgZG9uZSB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIFNVTl9PVkwgZXh0ZW5zaW9uIHVzaW5nIC1vdmVybGF5IChzZWUgYWxzbyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAtb3ZlcmxheV9ub2N1cnNvciBvcHRpb24pLiAgQSBzaW1pbGFyIG92ZXJsYXkgc2NoZW1lCiAgICAgICAgICAgICAgICAgICAgICAgaXMgdXNlZCBvbiBJUklYLiAgWG9yZyAoZS5nLiBMaW51eCkgYW5kIHJlY2VudCBTb2xhcmlzCiAgICAgICAgICAgICAgICAgICAgICAgWHN1biBzZXJ2ZXJzIHN1cHBvcnQgdGhlIFhGSVhFUyBleHRlbnNpb24gdG8gcmV0cmlldmUKICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXhhY3QgY3Vyc29yIHNoYXBlIGZyb20gdGhlIFggc2VydmVyLiAgSWYgWEZJWEVTCiAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJlc2VudCBpdCBpcyBwcmVmZXJyZWQgb3ZlciBPdmVybGF5IGFuZCBpcyB1c2VkIGJ5CiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCAoc2VlIC1ub3hmaXhlcyBiZWxvdykuICBUaGlzIGNhbiBiZSBkaXNhYmxlZAogICAgICAgICAgICAgICAgICAgICAgIHdpdGggLW5vY3Vyc29yLCBhbmQgYWxzbyBzb21lIHZhbHVlcyBvZiB0aGUgIm1vZGUiCiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGJlbG93LgoKICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdW5kZXIgWEZJWEVTIGN1cnNvcnMgd2l0aCB0cmFuc3BhcmVuY3kgKGFscGhhCiAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCkgd2lsbCB1c3VhbGx5IG5vdCBiZSBleGFjdGx5IHJlcHJlc2VudGVkIGFuZCBvbmUKICAgICAgICAgICAgICAgICAgICAgICBtYXkgZmluZCBPdmVybGF5IHByZWZlcmFibGUuICBTZWUgYWxzbyB0aGUgLWFscGhhY3V0CiAgICAgICAgICAgICAgICAgICAgICAgYW5kIC1hbHBoYWZyYWMgb3B0aW9ucyBiZWxvdyBhcyBmdWRnZSBmYWN0b3JzIHRvIHRyeQogICAgICAgICAgICAgICAgICAgICAgIHRvIGltcHJvdmUgdGhlIHNpdHVhdGlvbiBmb3IgY3Vyc29ycyB3aXRoIHRyYW5zcGFyZW5jeQogICAgICAgICAgICAgICAgICAgICAgIGZvciBhIGdpdmVuIHRoZW1lLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgIm1vZGUiIHN0cmluZyBjYW4gYmUgdXNlZCB0byBmaW5lLXR1bmUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheWluZyBvZiBjdXJzb3Igc2hhcGVzLiAgSXQgY2FuIGJlIHVzZWQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgZm9sbG93aW5nIHdheXM6CgogICAgICAgICAgICAgICAgICAgICAgICItY3Vyc29yIGFycm93IiAtIGp1c3Qgc2hvdyB0aGUgc3RhbmRhcmQgYXJyb3cKICAgICAgICAgICAgICAgICAgICAgICBub3RoaW5nIG1vcmUgb3Igbm90aGluZyBsZXNzLgoKICAgICAgICAgICAgICAgICAgICAgICAiLWN1cnNvciBub25lIiAtIHNhbWUgYXMgIi1ub2N1cnNvciIKCiAgICAgICAgICAgICAgICAgICAgICAgIi1jdXJzb3IgWCIgLSB3aGVuIHRoZSBjdXJzb3IgYXBwZWFycyB0byBiZSBvbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICByb290IHdpbmRvdywgZHJhdyB0aGUgZmFtaWxpYXIgWCBzaGFwZS4gIFNvbWUgZGVza3RvcHMKICAgICAgICAgICAgICAgICAgICAgICBzdWNoIGFzIEdOT01FIGNvdmVyIHVwIHRoZSByb290IHdpbmRvdyBjb21wbGV0ZWx5LAogICAgICAgICAgICAgICAgICAgICAgIGFuZCBzbyB0aGlzIHdpbGwgbm90IHdvcmssIHRyeSAiWDEiLCBldGMsIHRvIHRyeSB0bwogICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0IHRoZSB0cmVlIGRlcHRoLiAgT24gaGlnaCBsYXRlbmN5IGxpbmtzIG9yIHNsb3cKICAgICAgICAgICAgICAgICAgICAgICBtYWNoaW5lcyB0aGVyZSB3aWxsIGJlIGEgdGltZSBsYWcgYmV0d2VlbiBleHBlY3RlZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0dWFsIGN1cnNvciBzaGFwZS4KCiAgICAgICAgICAgICAgICAgICAgICAgIi1jdXJzb3Igc29tZSIgLSBsaWtlICJYIiBidXQgdXNlIGFkZGl0aW9uYWwKICAgICAgICAgICAgICAgICAgICAgICBoZXVyaXN0aWNzIHRvIHRyeSB0byBndWVzcyBpZiB0aGUgd2luZG93IHNob3VsZCBoYXZlCiAgICAgICAgICAgICAgICAgICAgICAgYSB3aW5kb3dtYW5hZ2VyLWxpa2UgcmVzaXplciBjdXJzb3Igb3IgYSB0ZXh0IGlucHV0CiAgICAgICAgICAgICAgICAgICAgICAgSS1iZWFtIGN1cnNvci4gIFRoaXMgaXMgYSBjb21wbGV0ZSBoYWNrLCBidXQgbWF5IGJlCiAgICAgICAgICAgICAgICAgICAgICAgdXNlZnVsIGluIHNvbWUgc2l0dWF0aW9ucyBiZWNhdXNlIGl0IHByb3ZpZGVzIGEgbGl0dGxlCiAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBmZWVkYmFjayBhYm91dCB0aGUgY3Vyc29yIHNoYXBlLgoKICAgICAgICAgICAgICAgICAgICAgICAiLWN1cnNvciBtb3N0IiAtIHRyeSB0byBzaG93IGFzIG1hbnkgY3Vyc29ycyBhcwogICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlLiAgT2Z0ZW4gdGhpcyB3aWxsIG9ubHkgYmUgdGhlIHNhbWUgYXMgInNvbWUiCiAgICAgICAgICAgICAgICAgICAgICAgdW5sZXNzIHRoZSBkaXNwbGF5IGhhcyBvdmVybGF5IHZpc3VhbHMgb3IgWEZJWEVTCiAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucyBhdmFpbGFibGUuICBPbiBTb2xhcmlzIGFuZCBJUklYIGlmIFhGSVhFUwogICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBhdmFpbGFibGUsIC1vdmVybGF5IG1vZGUgd2lsbCBiZSBhdHRlbXB0ZWQuCgotY3Vyc29yX2RyYWcgICAgICAgICAgIFNob3cgY3Vyc29yIHNoYXBlIGNoYW5nZXMgZXZlbiB3aGVuIHRoZSBtb3VzZSBpcyBiZWluZwogICAgICAgICAgICAgICAgICAgICAgIGRyYWdnZWQgd2l0aCBhIG1vdXNlIGJ1dHRvbiBkb3duLiAgVGhpcyBpcyB1c2VmdWwgaWYgeW91CiAgICAgICAgICAgICAgICAgICAgICAgd2FudCB0byBiZSBhYmxlIHRvIHNlZSBEcmFnLWFuZC1Ecm9wIGN1cnNvciBpY29ucywgZXRjLgoKLWFycm93IG4gICAgICAgICAgICAgICBDaG9vc2UgYW4gYWx0ZXJuYXRlICJhcnJvdyIgY3Vyc29yIGZyb20gYSBzZXQgb2YKICAgICAgICAgICAgICAgICAgICAgICBzb21lIGNvbW1vbiBvbmVzLiAgbiBjYW4gYmUgMSB0byA2LiAgRGVmYXVsdCBpczogMQogICAgICAgICAgICAgICAgICAgICAgIElnbm9yZWQgd2hlbiBpbiBYRklYRVMgY3Vyc29yLWdyYWJiaW5nIG1vZGUuCgotbm94Zml4ZXMgICAgICAgICAgICAgIERvIG5vdCB1c2UgdGhlIFhGSVhFUyBleHRlbnNpb24gdG8gZHJhdyB0aGUgZXhhY3QgY3Vyc29yCiAgICAgICAgICAgICAgICAgICAgICAgc2hhcGUgZXZlbiBpZiBpdCBpcyBhdmFpbGFibGUuCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IFRvIHdvcmsgYXJvdW5kIGEgY3Jhc2ggaW4gWG9yZyAxLjUgYW5kIGxhdGVyCiAgICAgICAgICAgICAgICAgICAgICAgc29tZSBwZW9wbGUgbmVlZGVkIHRvIHVzZSAtbm94Zml4ZXMuICBUaGUgWG9yZyBjcmFzaAogICAgICAgICAgICAgICAgICAgICAgIG9jY3VycmVkIHJpZ2h0IGFmdGVyIGEgRGlzcGxheSBNYW5hZ2VyIChlLmcuIEdETSkgbG9naW4uCiAgICAgICAgICAgICAgICAgICAgICAgU3RhcnRpbmcgd2l0aCB4MTF2bmMgMC45LjkgaXQgdHJpZXMgdG8gYXV0b21hdGljYWxseQogICAgICAgICAgICAgICAgICAgICAgIGF2b2lkIHVzaW5nIFhGSVhFUyB1bnRpbCBpdCBpcyBzdXJlIGEgd2luZG93IG1hbmFnZXIKICAgICAgICAgICAgICAgICAgICAgICBpcyBydW5uaW5nLiAgU2VlIHRoZSAtcmVvcGVuIG9wdGlvbiBmb3IgbW9yZSBpbmZvIGFuZAogICAgICAgICAgICAgICAgICAgICAgIGhvdyB0byB1c2UgWDExVk5DX0FWT0lEX1dJTkRPV1M9bmV2ZXIgdG8gZGlzYWJsZSBpdC4KCi1hbHBoYWN1dCBuICAgICAgICAgICAgV2hlbiB1c2luZyB0aGUgWEZJWEVTIGV4dGVuc2lvbiBmb3IgdGhlIGN1cnNvciBzaGFwZSwKICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3JzIHdpdGggdHJhbnNwYXJlbmN5IHdpbGwgbm90IHVzdWFsbHkgYmUgZGlzcGxheWVkCiAgICAgICAgICAgICAgICAgICAgICAgZXhhY3RseSAoYnV0IG9wYXF1ZSBvbmVzIHdpbGwpLiAgVGhpcyBvcHRpb24gc2V0cyBuIGFzCiAgICAgICAgICAgICAgICAgICAgICAgYSBjdXRvZmYgZm9yIGN1cnNvcnMgdGhhdCBoYXZlIHRyYW5zcGFyZW5jeSAoImFscGhhCiAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCIgd2l0aCB2YWx1ZXMgcmFuZ2luZyBmcm9tIDAgdG8gMjU1KSBBbnkgY3Vyc29yCiAgICAgICAgICAgICAgICAgICAgICAgcGl4ZWwgd2l0aCBhbHBoYSB2YWx1ZSBsZXNzIHRoYW4gbiBiZWNvbWVzIGNvbXBsZXRlbHkKICAgICAgICAgICAgICAgICAgICAgICB0cmFuc3BhcmVudC4gIE90aGVyd2lzZSB0aGUgcGl4ZWwgaXMgY29tcGxldGVseSBvcGFxdWUuCiAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCAyNDAKCi1hbHBoYWZyYWMgZnJhY3Rpb24gICAgV2l0aCB0aGUgdGhyZXNob2xkIGluIC1hbHBoYWN1dCBzb21lIGN1cnNvcnMgd2lsbCBiZWNvbWUKICAgICAgICAgICAgICAgICAgICAgICBhbG1vc3QgY29tcGxldGVseSB0cmFuc3BhcmVudCBiZWNhdXNlIHRoZWlyIGFscGhhIHZhbHVlcwogICAgICAgICAgICAgICAgICAgICAgIGFyZSBub3QgaGlnaCBlbm91Z2guICBGb3IgdGhvc2UgY3Vyc29ycyBhZGp1c3QgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgYWxwaGEgdGhyZXNob2xkIHVudGlsIGZyYWN0aW9uIG9mIHRoZSBub24temVybyBhbHBoYQogICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgcGl4ZWxzIGJlY29tZSBvcGFxdWUuICBEZWZhdWx0IDAuMzMKLWFscGhhcmVtb3ZlICAgICAgICAgICBCeSBkZWZhdWx0LCBYRklYRVMgY3Vyc29ycyBwaXhlbHMgd2l0aCB0cmFuc3BhcmVuY3kgaGF2ZQogICAgICAgICAgICAgICAgICAgICAgIHRoZSBhbHBoYSBmYWN0b3IgbXVsdGlwbGllZCBpbnRvIHRoZSBSR0IgY29sb3IgdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4gdGhhdCBjb3JyZXNwb25kaW5nIHRvIGJsZW5kaW5nIHRoZSBjdXJzb3Igd2l0aCBhCiAgICAgICAgICAgICAgICAgICAgICAgYmxhY2sgYmFja2dyb3VuZCkuICBTcGVjaWZ5IHRoaXMgb3B0aW9uIHRvIHJlbW92ZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICBhbHBoYSBmYWN0b3IuICh1c2VmdWwgZm9yIGxpZ2h0IGNvbG9yZWQgc2VtaS10cmFuc3BhcmVudAogICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcnMpLgotbm9hbHBoYWJsZW5kICAgICAgICAgIEluIFhGSVhFUyBtb2RlIGRvIG5vdCBzZW5kIGN1cnNvciBhbHBoYSBjaGFubmVsIGRhdGEKICAgICAgICAgICAgICAgICAgICAgICB0byBMaWJWTkNTZXJ2ZXIuICBUaGUgZGVmYXVsdCBpcyB0byBzZW5kIGl0LiAgVGhlCiAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFibGVuZCBlZmZlY3Qgd2lsbCBvbmx5IGJlIHZpc2libGUgaW4gLW5vY3Vyc29yc2hhcGUKICAgICAgICAgICAgICAgICAgICAgICBtb2RlIG9yIGZvciBjbGllbnRzIHdpdGggY3Vyc29yc2hhcGV1cGRhdGVzIHR1cm5lZAogICAgICAgICAgICAgICAgICAgICAgIG9mZi4gKEhvd2V2ZXIgdGhlcmUgaXMgYSBoYWNrIGZvciAzMmJwcCB3aXRoIGRlcHRoIDI0LAogICAgICAgICAgICAgICAgICAgICAgIGl0IHVzZXMgdGhlIGV4dHJhIDggYml0cyB0byBzdG9yZSBjdXJzb3IgdHJhbnNwYXJlbmN5CiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHVzZSB3aXRoIGEgaGFja2VkIHZuY3ZpZXdlciB0aGF0IGFwcGxpZXMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNwYXJlbmN5IGxvY2FsbHkuICBTZWUgdGhlIEZBUSBmb3IgbW9yZSBpbmZvKS4KCi1ub2N1cnNvcnNoYXBlICAgICAgICAgRG8gbm90IHVzZSB0aGUgVGlnaHRWTkMgQ3Vyc29yU2hhcGVVcGRhdGVzIGV4dGVuc2lvbgogICAgICAgICAgICAgICAgICAgICAgIGV2ZW4gaWYgY2xpZW50cyBzdXBwb3J0IGl0LiAgU2VlIC1jdXJzb3IgYWJvdmUuCi1jdXJzb3Jwb3MgICAgICAgICAgICAgT3B0aW9uIC1jdXJzb3Jwb3MgZW5hYmxlcyBzZW5kaW5nIHRoZSBYIGN1cnNvciBwb3NpdGlvbgotbm9jdXJzb3Jwb3MgICAgICAgICAgIGJhY2sgdG8gYWxsIHZuYyBjbGllbnRzIHRoYXQgc3VwcG9ydCB0aGUgVGlnaHRWTkMKICAgICAgICAgICAgICAgICAgICAgICBDdXJzb3JQb3NVcGRhdGVzIGV4dGVuc2lvbi4gIE90aGVyIGNsaWVudHMgd2lsbCBiZSBhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VlIHRoZSBwb2ludGVyIG1vdGlvbnMuIERlZmF1bHQ6IC1jdXJzb3Jwb3MKLXh3YXJwcG9pbnRlciAgICAgICAgICBNb3ZlIHRoZSBwb2ludGVyIHdpdGggWFdhcnBQb2ludGVyKDNYKSBpbnN0ZWFkIG9mCi1ub3h3YXJwcG9pbnRlciAgICAgICAgdGhlIFhURVNUIGV4dGVuc2lvbi4gIFVzZSB0aGlzIGFzIGEgd29ya2Fyb3VuZAogICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBwb2ludGVyIG1vdGlvbiBiZWhhdmVzIGluY29ycmVjdGx5LCBlLmcuCiAgICAgICAgICAgICAgICAgICAgICAgb24gdG91Y2hzY3JlZW5zIG9yIG90aGVyIG5vbi1zdGFuZGFyZCBzZXR1cHMuCgogICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIGFsc28gc29tZXRpbWVzIG5lZWRlZCBvbiBYSU5FUkFNQSBkaXNwbGF5cyBhbmQgaXMKICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkIGJ5IGRlZmF1bHQgaWYgWElORVJBTUEgaXMgZm91bmQgdG8gYmUgYWN0aXZlLgogICAgICAgICAgICAgICAgICAgICAgIFRvIHByZXZlbnQgdGhpcywgdXNlIC1ub3h3YXJwcG9pbnRlci4KCi1hbHdheXNfaW5qZWN0ICAgICAgICAgRXZlbiBpZiB0aGVyZSBpcyBubyBkaXNwbGFjZW1lbnQgKGR4ID0gZHkgPSAwKSBmb3IgYQogICAgICAgICAgICAgICAgICAgICAgIFZOQyBtb3VzZSBldmVudCBmb3JjZSB0aGUgcG9pbnRlciB0byB0aGUgaW5kaWNhdGVkIHgseQogICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uIGFueXdheS4gIFJlY2VudCAoMjAwOSkgZ3VpIHRvb2xraXRzIChnbm9tZSkKICAgICAgICAgICAgICAgICAgICAgICBoYXZlIHByb2JsZW1zIHdpdGggeDExdm5jJ3Mgb3JpZ2luYWwgbW91c2UgaW5wdXQKICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gbWV0aG9kLiAgU28geDExdm5jJ3MgbW91c2UgaW5wdXQgaW5qZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kIGhhcyBiZWVuIG1vZGlmaWVkLiAgVG8gcmVnYWluIHRoZSBPTEQgYmVoYXZpb3IKICAgICAgICAgICAgICAgICAgICAgICB1c2UgdGhpcyBvcHRpb246IC1hbHdheXNfaW5qZWN0LiAgVGhlbiB4MTF2bmMgd2lsbAogICAgICAgICAgICAgICAgICAgICAgIGFsd2F5cyBmb3JjZSBwb3NpdGlvbmluZyB0aGUgbW91c2UgdG8gdGhlIHgseSBwb3NpdGlvbgogICAgICAgICAgICAgICAgICAgICAgIGV2ZW4gaWYgdGhhdCBwb3NpdGlvbiBoYXMgbm90IGNoYW5nZWQgc2luY2UgdGhlIHByZXZpb3VzCiAgICAgICAgICAgICAgICAgICAgICAgVk5DIGlucHV0IGV2ZW50LgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgZmlyc3QgcGxhY2UgdGhpcyBwcm9ibGVtIHdhcyBub3RpY2VkIHdhcyBpbiBnbm9tZQogICAgICAgICAgICAgICAgICAgICAgIHRlcm1pbmFsOiBpZiB5b3UgcHJlc3NlZCBhbmQgcmVsZWFzZWQgbW91c2UgYnV0dG9uIDMsIGEKICAgICAgICAgICAgICAgICAgICAgICBtZW51IHdhcyBwb3N0ZWQgYW5kIHRoZW4gaXRzIGZpcnN0IGVsZW1lbnQgJ05ldyBUZXJtaW5hbAogICAgICAgICAgICAgICAgICAgICAgIFdpbmRvdycgd2FzIGFjdGl2YXRlZC4gIFRoaXMgd2FzIGJlY2F1c2UgeDExdm5jIGluamVjdGVkCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vdXNlIHBvc2l0aW9uIHR3aWNlOiBvbmNlIG9uIEJ1dHRvblByZXNzIGFuZCBhZ2FpbgogICAgICAgICAgICAgICAgICAgICAgIG9uIEJ1dHRvblJlbGVhc2UuICBUaGUgdG9vbGtpdCBpbnRlcnByZXRlZCB0aGUgMm5kIG9uZQogICAgICAgICAgICAgICAgICAgICAgIGFzIG1vdXNlIG1vdGlvbiBldmVuIHRob3VnaCB0aGUgbW91c2UgaGFkbid0IG1vdmVkLgogICAgICAgICAgICAgICAgICAgICAgIFNvIG5vdyBieSBkZWZhdWx0IHgxMXZuYyB0cmllcyB0byBhdm9pZCBpbmplY3RpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgMm5kIG9uZS4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHdpdGggdGhlIG5ldyBkZWZhdWx0IHgxMXZuYyB3aWxsIGJlIG9ibGl2aW91cwogICAgICAgICAgICAgICAgICAgICAgIHRvIGFwcGxpY2F0aW9ucyBtb3ZpbmcgdGhlIHBvaW50ZXIgKHdhcnBpbmcpIG9yIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHVzZXIgYXQgdGhlIHBoeXNpY2FsIGRpc3BsYXkgbW92aW5nIGl0LiAgU28gaXQgbWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgZS5nLiwgaW5qZWN0IEJ1dHRvblJlbGVhc2UgYXQgdGhlIHdyb25nIHBvc2l0aW9uLgogICAgICAgICAgICAgICAgICAgICAgIElmIHRoaXMgKG9yIHNpbWlsYXIgc2NlbmFyaW9zKSBjYXVzZXMgcHJvYmxlbXMgaW4geW91cgogICAgICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50LCBzcGVjaWZ5IC1hbHdheXNfaW5qZWN0IGZvciB0aGUgb2xkIG1ldGhvZC4KCi1idXR0b25tYXAgc3RyaW5nICAgICAgU3RyaW5nIHRvIHJlbWFwIG1vdXNlIGJ1dHRvbnMuICBGb3JtYXQ6IElKSy1MTU4sIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICBtYXBzIGJ1dHRvbnMgSSAtPiBMLCBldGMuLCBlLmcuICAtYnV0dG9ubWFwIDEzLTMxCgogICAgICAgICAgICAgICAgICAgICAgIEJ1dHRvbiBwcmVzc2VzIGNhbiBhbHNvIGJlIG1hcHBlZCB0byBrZXlzdHJva2VzOiByZXBsYWNlCiAgICAgICAgICAgICAgICAgICAgICAgYSBidXR0b24gZGlnaXQgb24gdGhlIHJpZ2h0IG9mIHRoZSBkYXNoIHdpdGggOjxzeW0+OgogICAgICAgICAgICAgICAgICAgICAgIG9yIDo8c3ltMT4rPHN5bTI+OiBldGMuIGZvciBtdWx0aXBsZSBrZXlzLiBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgdmlld2luZyBtYWNoaW5lIGhhcyBhIG1vdXNlLXdoZWVsIChidXR0b25zIDQgNSkKICAgICAgICAgICAgICAgICAgICAgICBidXQgdGhlIHgxMXZuYyBzaWRlIGRvZXMgbm90LCB0aGVzZSB3aWxsIGRvIHNjcm9sbHM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1idXR0b25tYXAgMTIzNDUtMTIzOlByaW9yOjpOZXh0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtYnV0dG9ubWFwIDEyMzQ1LTEyMzpVcCtVcCtVcDo6RG93bitEb3duK0Rvd246CgogICAgICAgICAgICAgICAgICAgICAgIFNlZSA8WDExL2tleXN5bWRlZi5oPiBoZWFkZXIgZmlsZSBmb3IgYSBsaXN0IG9mIEtleXN5bXMsCiAgICAgICAgICAgICAgICAgICAgICAgb3IgdXNlIHRoZSB4ZXYoMSkgcHJvZ3JhbS4gIE5vdGU6IG1hcHBpbmcgb2YgYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICAgY2xpY2tzIHRvIEtleXN5bXMgbWF5IG5vdCB3b3JrIGlmIC1tb2R0d2VhayBvciAteGtiIGlzCiAgICAgICAgICAgICAgICAgICAgICAgbmVlZGVkIGZvciB0aGUgS2V5c3ltLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgaW5jbHVkZSBhIG1vZGlmaWVyIGxpa2UgIlNoaWZ0X0wiIHRoZQogICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyJ3MgdXAvZG93biBzdGF0ZSBpcyB0b2dnbGVkLCBlLmcuIHRvIHNlbmQKICAgICAgICAgICAgICAgICAgICAgICAiVGhlIiB1c2UgOlNoaWZ0X0wrdCtTaGlmdF9MK2grZTogKHRoZSAxc3Qgb25lIGlzCiAgICAgICAgICAgICAgICAgICAgICAgc2hpZnQgZG93biBhbmQgdGhlIDJuZCBvbmUgaXMgc2hpZnQgdXApLiAobm90ZTogdGhlCiAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgbW9kaWZpZXIgaXMgaWdub3JlZCBhbmQgbm90IHJlc2V0KQogICAgICAgICAgICAgICAgICAgICAgIFRvIGluY2x1ZGUgYnV0dG9uIGV2ZW50cyB1c2UgIkJ1dHRvbjEiLCAuLi4gZXRjLgoKICAgICAgICAgICAgICAgICAgICAgICAtYnV0dG9ubWFwIGN1cnJlbnRseSBkb2VzIG5vdCB3b3JrIG9uIE1hY09TWCBjb25zb2xlCiAgICAgICAgICAgICAgICAgICAgICAgb3IgaW4gLXJhd2ZiIG1vZGUuCgogICAgICAgICAgICAgICAgICAgICAgIFdvcmthcm91bmQ6IHVzZSAtYnV0dG9ubWFwIElKLi4uLUxNLi4uPW4gdG8gbGltaXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIG1vdXNlIGJ1dHRvbnMgdG8gbiwgZS5nLiAxMjMtMTIzPTMuICBUaGlzIHdpbGwKICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50IHgxMXZuYyBmcm9tIGNyYXNoaW5nIGlmIHRoZSBYIHNlcnZlciByZXBvcnRzCiAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgYXJlIDUgYnV0dG9ucyAoNC81IHNjcm9sbCB3aGVlbCksIGJ1dCB0aGVyZSBhcmUKICAgICAgICAgICAgICAgICAgICAgICBvbmx5IHJlYWxseSAzLgoKLW5vZHJhZ2dpbmcgICAgICAgICAgICBEbyBub3QgdXBkYXRlIHRoZSBkaXNwbGF5IGR1cmluZyBtb3VzZSBkcmFnZ2luZyBldmVudHMKICAgICAgICAgICAgICAgICAgICAgICAobW91c2UgYnV0dG9uIGhlbGQgZG93bikuICBHcmVhdGx5IGltcHJvdmVzIHJlc3BvbnNlIG9uCiAgICAgICAgICAgICAgICAgICAgICAgc2xvdyBzZXR1cHMsIGJ1dCB5b3UgbG9zZSBhbGwgdmlzdWFsIGZlZWRiYWNrIGZvciBkcmFncywKICAgICAgICAgICAgICAgICAgICAgICB0ZXh0IHNlbGVjdGlvbiwgYW5kIHNvbWUgbWVudSB0cmF2ZXJzYWxzLiAgSXQgb3ZlcnJpZGVzCiAgICAgICAgICAgICAgICAgICAgICAgYW55IC1wb2ludGVyX21vZGUgc2V0dGluZy4KCi1uY2FjaGUgbiAgICAgICAgICAgICAgQ2xpZW50LXNpZGUgY2FjaGluZyBzY2hlbWUuICBGcmFtZWJ1ZmZlciBtZW1vcnkgIm4iCiAgICAgICAgICAgICAgICAgICAgICAgKGFuIGludGVnZXIpIHRpbWVzIHRoYXQgb2YgdGhlIGZ1bGwgZGlzcGxheSBpcyBhbGxvY2F0ZWQKICAgICAgICAgICAgICAgICAgICAgICBiZWxvdyB0aGUgYWN0dWFsIGZyYW1lYnVmZmVyIHRvIGNhY2hlIHNjcmVlbiBjb250ZW50cwogICAgICAgICAgICAgICAgICAgICAgIGZvciByYXBpZCByZXRyaWV2YWwuICBTbyBhIFcgeCBIIGZyYW1idWZmZXIgaXMgZXhwYW5kZWQKICAgICAgICAgICAgICAgICAgICAgICB0byBhIFcgeCAobisxKSpIIG9uZS4gIFVzZSAwIHRvIGRpc2FibGUuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSAibiIgaXMgYWN0dWFsbHkgb3B0aW9uYWwsIHRoZSBkZWZhdWx0IGlzIDEwLgoKICAgICAgICAgICAgICAgICAgICAgICBGb3IgdGhpcyBhbmQgdGhlIG90aGVyIC1uY2FjaGUqIG9wdGlvbnMgYmVsb3cgeW91IGNhbgogICAgICAgICAgICAgICAgICAgICAgIGFiYnJldmlhdGUgIi1uY2FjaGUiIHdpdGggIi1uYyIuICBBbHNvLCAiLW5vbmMiCiAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgIi1uY2FjaGUgMCIKCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyBhbiBleHBlcmltZW50YWwgb3B0aW9uLCBjdXJyZW50bHkgaW1wbGVtZW50ZWQgaW4KICAgICAgICAgICAgICAgICAgICAgICBhbiBhd2t3YXJkIHdheSBpbiB0aGF0IGluIHRoZSBWTkMgVmlld2VyIHlvdSBjYW4gc2VlIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHBpeGVsIGNhY2hlIGNvbnRlbnRzIGlmIHlvdSBzY3JvbGwgZG93biwgZXRjLiAgU28geW91CiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBoYXZlIHRvIHNldCB0aGluZ3MgdXAgc28geW91IGNhbid0IHNlZSB0aGF0IHJlZ2lvbi4KICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGlzIG1ldGhvZCBpcyBzdWNjZXNzZnVsLCB0aGUgY2hhbmdlcyByZXF1aXJlZCBmb3IKICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRzIHRvIGRvIHRoaXMgbGVzcyBhd2t3YXJkbHkgd2lsbCBiZSBpbnZlc3RpZ2F0ZWQuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBTU1ZOQyB2aWV3ZXIgZG9lcyBhIGdvb2Qgam9iIGF0IGF1dG9tYXRpY2FsbHkgaGlkaW5nCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBpeGVsIGNhY2hlIHJlZ2lvbi4gIE9yIHVzZSBTU1ZOQydzIC15Y3JvcCBvcHRpb24KICAgICAgICAgICAgICAgICAgICAgICB0byBleHBsaWNpdGx5IGhpZGUgdGhlIHJlZ2lvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoaXMgbW9kZSBjb25zdW1lcyBhIGh1Z2UgYW1vdW50IG9mIG1lbW9yeSwKICAgICAgICAgICAgICAgICAgICAgICBib3RoIG9uIHRoZSB4MTF2bmMgc2VydmVyIHNpZGUgYW5kIG9uIHRoZSBWTkMgVmlld2VyCiAgICAgICAgICAgICAgICAgICAgICAgc2lkZS4gIElmIG49MiB0aGVuIHRoZSBhbW91bnQgb2YgUkFNIHVzZWQgaXMgcm91Z2hseQogICAgICAgICAgICAgICAgICAgICAgIHRyaXBsZWQgZm9yIGJvdGggeDExdm5jIGFuZCB0aGUgVk5DIFZpZXdlci4gIEFzIGEgcnVsZQogICAgICAgICAgICAgICAgICAgICAgIG9mIHRodW1iLCBub3RlIHRoYXQgMTI4MHgxMDI0IGF0IGRlcHRoIDI0IGlzIGFib3V0IDVNQgogICAgICAgICAgICAgICAgICAgICAgIG9mIHBpeGVsIGRhdGEuCgogICAgICAgICAgICAgICAgICAgICAgIEZvciByZWFzb25hYmxlIHJlc3BvbnNlIHdoZW4gY3ljbGluZyB0aHJvdWdoIDQgdG8gNgogICAgICAgICAgICAgICAgICAgICAgIGxhcmdlIChlLmcuIHdlYiBicm93c2VyKSB3aW5kb3dzIGEgdmFsdWUgbiBvZiA2IHRvIDEyCiAgICAgICAgICAgICAgICAgICAgICAgaXMgcmVjb21tZW5kZWQuICh0aGF0J3MgcmlnaHQ6IH4xMFggbW9yZSBtZW1vcnkuLi4pCgogICAgICAgICAgICAgICAgICAgICAgIEJlY2F1c2Ugb2YgdGhlIHdheSB3aW5kb3cgYmFja2luZ3N0b3JlIGFuZCBzYXZldW5kZXJzCiAgICAgICAgICAgICAgICAgICAgICAgYXJlIGltcGxlbWVudGVkLCBuIG11c3QgYmUgZXZlbi4gIEl0IHdpbGwgYmUgaW5jcmVtZW50ZWQKICAgICAgICAgICAgICAgICAgICAgICBieSAxIGlmIGl0IGlzIG5vdC4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIGFsc28gd29ya3MgZm9yIG5hdGl2ZSBNYWNPUyBYLCBidXQgbWF5IG5vdAogICAgICAgICAgICAgICAgICAgICAgIGJlIGFzIGVmZmVjdGl2ZSBhcyB0aGUgWCB2ZXJzaW9uLiAgVGhpcyBpcyBkdWUgdG8gYQogICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiB0aGluZ3MsIG9uZSBpcyB0aGUgZHJvcC1zaGFkb3cgY29tcG9zaXRpbmcKICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGxlYXZlcyBleHRyYSBhcmVhcyB0aGF0IG5lZWQgdG8gYmUgcmVwYWlyZWQgKHNlZQogICAgICAgICAgICAgICAgICAgICAgIC1uY2FjaGVfcGFkKS4gIEFub3RoZXIgaXMgdGhlIHdpbmRvdyBpY29uaWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9ucyBuZWVkIHRvIGJlIGF2b2lkZWQgKHNlZSAtbWFjaWNvbnRpbWUpLgogICAgICAgICAgICAgICAgICAgICAgIEl0IGFwcGVhcnMgdGhlIHRoYXQgdGhlICdTY2FsZScgYW5pbWF0aW9uIG1vZGUgZ2l2ZXMKICAgICAgICAgICAgICAgICAgICAgICBiZXR0ZXIgcmVzdWx0cyB0aGFuIHRoZSAnR2VuaWUnIG9uZS4gIEFsc28sIHdpbmRvdyBldmVudAogICAgICAgICAgICAgICAgICAgICAgIGRldGVjdGlvbiBub3QgYXMgYWNjdXJhdGUgYXMgdGhlIFggdmVyc2lvbi4KCi1uY2FjaGVfY3IgICAgICAgICAgICAgSW4gLW5jYWNoZSBtb2RlLCB0cnkgdG8gZG8gY29weXJlY3Qgb3BhcXVlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgICAgIG1vdmVzL2RyYWdzIGluc3RlYWQgb2Ygd2lyZWZyYW1lcyAodGhpcyBjYW4gaW5kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgcGFpbnRpbmcgZXJyb3JzKS4gIFRoZSB3aXJlZnJhbWUgd2lsbCBzdGlsbCBiZSB1c2VkIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICBtb3ZpbmcgYSB3aW5kb3cgd2hvc2Ugc2F2ZS11bmRlcnMgaGFzIG5vdCB5ZXQgYmVlbiBzZXQKICAgICAgICAgICAgICAgICAgICAgICBvciBoYXMgYmVlbiBpbnZhbGlkYXRlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgU29tZSBWTkMgVmlld2VycyBwcm92aWRlIGJldHRlciByZXNwb25zZSB0aGFuIG90aGVycwogICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhpcyBvcHRpb24uICBPbiBVbml4LCByZWFsdm5jIHZpZXdlciBnaXZlcwogICAgICAgICAgICAgICAgICAgICAgIHNtb290aGVyIGRyYWdzIHRoYW4gdGlnaHR2bmMgdmlld2VyLiAgUmVzcG9uc2UgbWF5IGFsc28KICAgICAgICAgICAgICAgICAgICAgICBiZSBjaG9wcHkgaWYgdGhlIHNlcnZlciBzaWRlIG1hY2hpbmUgaXMgdG9vIHNsb3cuCgogICAgICAgICAgICAgICAgICAgICAgIFNvbWV0aW1lcyBvbiB2ZXJ5IHNsb3cgbW9kZW0gY29ubmVjdGlvbnMsIHRoaXMgYWN0dWFsbHkKICAgICAgICAgICAgICAgICAgICAgICBnaXZlcyBhbiBpbXByb3ZlbWVudCBiZWNhdXNlIG5vIHBpeGVsIGRhdGEgYXQgYWxsCiAgICAgICAgICAgICAgICAgICAgICAgKG5vdCBldmVuIHRoZSBib3ggYW5pbWF0aW9uKSBpcyBzZW50IGR1cmluZyB0aGUgZHJhZy4KCi1uY2FjaGVfbm9fbW92ZXJhaXNlICAgSW4gLW5jYWNoZSBtb2RlLCBkbyBub3QgYXNzdW1lIHRoYXQgbW92aW5nIGEgd2luZG93CiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBjYXVzZSB0aGUgd2luZG93IG1hbmFnZXIgdG8gcmFpc2UgaXQgdG8gdGhlIHRvcAogICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBzdGFjay4gIFRoZSBkZWZhdWx0IGlzIHRvIGFzc3VtZSBpdCBkb2VzLCBhbmQKICAgICAgICAgICAgICAgICAgICAgICBzbyBhdCB0aGUgYmVnaW5uaW5nIG9mIGFueSB3aXJlZnJhbWUsIGV0Yywgd2luZG93IG1vdmVzCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHdpbmRvdyB3aWxsIGJlIHB1c2hlZCB0byB0b3AgaW4gdGhlIFZOQyB2aWV3ZXIuCgotbmNhY2hlX25vX2R0Y2hhbmdlICAgIEluIC1uY2FjaGUgbW9kZSwgZG8gbm90IHRyeSB0byBndWVzcyB3aGVuIHRoZSBkZXNrdG9wCiAgICAgICAgICAgICAgICAgICAgICAgKHZpZXdwb3J0KSBjaGFuZ2VzIHRvIGFub3RoZXIgb25lIChpLmUuIGFub3RoZXIKICAgICAgICAgICAgICAgICAgICAgICB3b3JrYXJlYSkuICBUaGUgZGVmYXVsdCBpcyB0byB0cnkgdG8gZ3Vlc3MgYW5kIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICBkZXRlY3RlZCB0cnkgdG8gbWFrZSB0aGUgdHJhbnNpc3Rpb24gbW9yZSBzbW9vdGhseS4KCi1uY2FjaGVfbm9fcm9vdHBpeG1hcCAgSW4gLW5jYWNoZSBtb2RlLCBkbyBub3QgdHJ5IHRvIHNuYXBzaG90IHRoZSBkZXNrdG9wCiAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZCB0byB1c2UgaW4gZ3Vlc3Npbmcgb3IgcmVjb25zdHJ1Y3Rpbmcgd2luZG93CiAgICAgICAgICAgICAgICAgICAgICAgc2F2ZS11bmRlcnMuCgotbmNhY2hlX2tlZXBfYW5pbXMgICAgIEluIC1uY2FjaGUgbW9kZSwgZG8gbm90IHRyeSB0byBkaXNhYmxlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXIgYW5pbWF0aW9ucyBhbmQgb3RoZXIgZWZmZWN0cyAodGhhdCB1c3VhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgZGVncmFkZSBuY2FjaGUgcGVyZm9ybWFuY2Ugb3IgY2F1c2UgcGFpbnRpbmcgZXJyb3JzKS4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byB0cnkgdG8gZGlzYWJsZSB0aGVtIG9uIEtERSAoYnV0IG5vdAogICAgICAgICAgICAgICAgICAgICAgIEdOT01FKSB3aGVuIFZOQyBjbGllbnRzIGFyZSBjb25uZWN0ZWQuCgogICAgICAgICAgICAgICAgICAgICAgIEZvciBvdGhlciB3aW5kb3cgbWFuYWdlcnMgb3IgZGVza3RvcHMgdGhhdCBwcm92aWRlCiAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9ucywgZWZmZWN0cywgY29tcG9zaXRpbmcsIHRyYW5zbHVjZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICBldGMuIHRoYXQgaW50ZXJmZXJlIHdpdGggdGhlIC1uY2FjaGUgbWV0aG9kIHlvdSB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0byBkaXNhYmxlIHRoZW0gbWFudWFsbHkuCgotbmNhY2hlX29sZF93bSAgICAgICAgIEluIC1uY2FjaGUgbW9kZSwgZW5hYmxlIHNvbWUgaGV1cmlzdGljcyBmb3Igb2xkIHN0eWxlCiAgICAgICAgICAgICAgICAgICAgICAgd2luZG93IG1hbmFnZXJzIHN1Y2ggYXMgZnZ3bSBhbmQgdHdtLgoKLW5jYWNoZV9wYWQgbiAgICAgICAgICBJbiAtbmNhY2hlIG1vZGUsIHBhZCBlYWNoIHdpbmRvdyB3aXRoIG4gcGl4ZWxzIGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICBjYWNoaW5nIHJlY3RhbmdsZXMuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHRyeSB0byBpbXByb3ZlCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNpdHVhdGlvbiB3aXRoIGRyb3BzaGFkb3dzIG9yIG90aGVyIGNvbXBvc2l0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgKGUuZy4gTWFjT1MgWCB3aW5kb3cgbWFuYWdlciksIGFsdGhvdWdoIGl0IGNvdWxkIG1ha2UKICAgICAgICAgICAgICAgICAgICAgICB0aGluZ3Mgd29yc2UuICBUaGUgZGVmYXVsdCBpcyAwIG9uIFVuaXggYW5kIDI0IG9uCiAgICAgICAgICAgICAgICAgICAgICAgTWFjT1MgWC4KLWRlYnVnX25jYWNoZSAgICAgICAgICBUdXJuIG9uIGRlYnVnZ2luZyBhbmQgcHJvZmlsaW5nIG91dHB1dCB1bmRlciAtbmNhY2hlLgoKLXdpcmVmcmFtZSBbc3RyXSAgICAgICBUcnkgdG8gZGV0ZWN0IHdpbmRvdyBtb3ZlcyBvciByZXNpemVzIHdoZW4gYSBtb3VzZQotbm93aXJlZnJhbWUgICAgICAgICAgIGJ1dHRvbiBpcyBoZWxkIGRvd24gYW5kIHNob3cgYSB3aXJlZnJhbWUgaW5zdGVhZCBvZgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBmdWxsIG9wYXF1ZSB3aW5kb3cuICBUaGlzIGlzIGJhc2VkIGNvbXBsZXRlbHkgb24KICAgICAgICAgICAgICAgICAgICAgICBoZXVyaXN0aWNzIGFuZCBtYXkgbm90IGFsd2F5cyB3b3JrOiBpdCBkZXBlbmRzIG9uIHlvdXIKICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cgbWFuYWdlciBhbmQgZXZlbiBob3cgeW91IG1vdmUgdGhpbmdzIGFyb3VuZC4KICAgICAgICAgICAgICAgICAgICAgICBTZWUgLXBvaW50ZXJfbW9kZSBiZWxvdyBmb3IgZGlzY3Vzc2lvbiBvZiB0aGUgImJvZ2dpbmcKICAgICAgICAgICAgICAgICAgICAgICBkb3duIiBwcm9ibGVtIHRoaXMgdHJpZXMgdG8gYXZvaWQuCiAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogLXdpcmVmcmFtZQoKICAgICAgICAgICAgICAgICAgICAgICBTaG9ydGVyIGFsaWFzZXM6ICAtd2YgW3N0cl0gIGFuZCAtbm93ZgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgInN0ciIgaXMgb3B0aW9uYWwgYW5kLCBvZiBjb3Vyc2UsIGlzCiAgICAgICAgICAgICAgICAgICAgICAgcGFja2VkIHdpdGggbWFueSB0dW5hYmxlIHBhcmFtZXRlcnMgZm9yIHRoaXMgc2NoZW1lOgoKICAgICAgICAgICAgICAgICAgICAgICBGb3JtYXQ6IHNoYWRlLGxpbmV3aWR0aCxwZXJjZW50LFQrQitMK1IsbW9kLHQxK3QyK3QzK3Q0CiAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogMHhmZiwyLDAsMzIrOCs4KzgsYWxsLDAuMTUrMC4zMCs1LjArMC4xMjUKCiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGxlYXZlIG5vdGhpbmcgYmV0d2VlbiBjb21tYXM6ICIsLCIgdGhlIGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyB1c2VkLiAgSWYgeW91IGRvbid0IHNwZWNpZnkgZW5vdWdoIGNvbW1hcywKICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHJhaWxpbmcgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHRzLgoKICAgICAgICAgICAgICAgICAgICAgICAic2hhZGUiIGluZGljYXRlIHRoZSAiY29sb3IiIGZvciB0aGUgd2lyZWZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgIHVzdWFsbHkgYSBncmV5c2NhbGU6IDAtMjU1LCBob3dldmVyIGZvciAxNiBhbmQgMzJicHAgeW91CiAgICAgICAgICAgICAgICAgICAgICAgY2FuIHNwZWNpZnkgYW4gcmdiLnR4dCBYIGNvbG9yIChlLmcuICJkb2RnZXJibHVlIikgb3IKICAgICAgICAgICAgICAgICAgICAgICBhIHZhbHVlID4gMjU1IGlzIHRyZWF0ZWQgYXMgUkdCIChlLmcuIHJlZCBpcyAweGZmMDAwMCkuCiAgICAgICAgICAgICAgICAgICAgICAgImxpbmV3aWR0aCIgc2V0cyB0aGUgd2lkdGggb2YgdGhlIHdpcmVmcmFtZSBpbiBwaXhlbHMuCiAgICAgICAgICAgICAgICAgICAgICAgInBlcmNlbnQiIGluZGljYXRlcyB0byBub3QgYXBwbHkgdGhlIHdpcmVmcmFtZSBzY2hlbWUKICAgICAgICAgICAgICAgICAgICAgICB0byB3aW5kb3dzIHdpdGggYXJlYSBsZXNzIHRoYW4gdGhpcyBwZXJjZW50IG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgc2NyZWVuLgoKICAgICAgICAgICAgICAgICAgICAgICAiVCtCK0wrUiIgaW5kaWNhdGVzIGZvdXIgaW50ZWdlcnMgZm9yIGhvdyBjbG9zZSBpbgogICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyB0aGUgcG9pbnRlciBoYXMgdG8gYmUgZnJvbSB0aGUgVG9wLCBCb3R0b20sIExlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgb3IgUmlnaHQgZWRnZXMgb2YgdGhlIHdpbmRvdyB0byBjb25zaWRlciB3aXJlZnJhbWluZy4KICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgc3BlZWR1cCB0byBxdWlja2x5IGV4Y2x1ZGUgYSB3aW5kb3cgZnJvbSBiZWluZwogICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtZWQ6IHNldCB0aGVtIGFsbCB0byB6ZXJvIHRvIG5vdCB0cnkgdGhlIHNwZWVkdXAKICAgICAgICAgICAgICAgICAgICAgICAoc2Nyb2xsaW5nIGFuZCBzZWxlY3RpbmcgdGV4dCB3aWxsIGxpa2VseSBiZSBzbG93ZXIpLgoKICAgICAgICAgICAgICAgICAgICAgICAibW9kIiBzcGVjaWZpZXMgaWYgYSBidXR0b24gZG93biBldmVudCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmlvciBvZiB0aGUgd2luZG93IHdpdGggYSBtb2RpZmllciBrZXkgKEFsdCwgU2hpZnQsCiAgICAgICAgICAgICAgICAgICAgICAgZXRjLikgZG93biBzaG91bGQgaW5kaWNhdGUgYSB3aXJlZnJhbWUgb3Bwb3J0dW5pdHkuCiAgICAgICAgICAgICAgICAgICAgICAgSXQgY2FuIGJlICIwIiBvciAibm9uZSIgdG8gc2tpcCBpdCwgIjEiIG9yICJhbGwiCiAgICAgICAgICAgICAgICAgICAgICAgdG8gYXBwbHkgaXQgdG8gYW55IG1vZGlmaWVyLCBvciAiU2hpZnQiLCAiQWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAiQ29udHJvbCIsICJNZXRhIiwgIlN1cGVyIiwgb3IgIkh5cGVyIiB0byBvbmx5CiAgICAgICAgICAgICAgICAgICAgICAgYXBwbHkgZm9yIHRoYXQgdHlwZSBvZiBtb2RpZmllciBrZXkuCgogICAgICAgICAgICAgICAgICAgICAgICJ0MSt0Mit0Myt0NCIgc3BlY2lmeSBmb3VyIGZsb2F0aW5nIHBvaW50IHRpbWVzIGluCiAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kczogdDEgaXMgaG93IGxvbmcgdG8gd2FpdCBmb3IgdGhlIHBvaW50ZXIgdG8gbW92ZSwKICAgICAgICAgICAgICAgICAgICAgICB0MiBpcyBob3cgbG9uZyB0byB3YWl0IGZvciB0aGUgd2luZG93IHRvIHN0YXJ0IG1vdmluZwogICAgICAgICAgICAgICAgICAgICAgIG9yIGJlaW5nIHJlc2l6ZWQgKGZvciBzb21lIHdpbmRvdyBtYW5hZ2VycyB0aGlzIGNhbiBiZQogICAgICAgICAgICAgICAgICAgICAgIHJhdGhlciBsb25nKSwgdDMgaXMgaG93IGxvbmcgdG8ga2VlcCBhIHdpcmVmcmFtZSBtb3ZpbmcKICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmUgcmVwYWludGluZyB0aGUgd2luZG93LiB0NCBpcyB0aGUgbWluaW11bSB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgYmV0d2VlbiBzZW5kaW5nIHdpcmVmcmFtZSAiYW5pbWF0aW9ucyIuICBJZiBhIHNsb3cKICAgICAgICAgICAgICAgICAgICAgICBsaW5rIGlzIGRldGVjdGVkLCB0aGVzZSB2YWx1ZXMgbWF5IGJlIGF1dG9tYXRpY2FsbHkKICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkIHRvIHNvbWV0aGluZyBiZXR0ZXIgZm9yIGEgc2xvdyBsaW5rLgoKLW5vd2lyZWZyYW1lbG9jYWwgICAgICBCeSBkZWZhdWx0LCBtb3VzZSBtb3Rpb24gYW5kIGJ1dHRvbiBwcmVzc2VzIG9mIGEKICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHNpdHRpbmcgYXQgdGhlIExPQ0FMIGRpc3BsYXkgYXJlIG1vbml0b3JlZCBmb3IKICAgICAgICAgICAgICAgICAgICAgICB3aXJlZnJhbWluZyBvcHBvcnR1bml0aWVzIChzbyB0aGF0IHRoZSBjaGFuZ2VzIHdpbGwgYmUKICAgICAgICAgICAgICAgICAgICAgICBzZW50IGVmZmljaWVudGx5IHRvIHRoZSBWTkMgY2xpZW50cykuICBVc2UgdGhpcyBvcHRpb24KICAgICAgICAgICAgICAgICAgICAgICB0byBkaXNhYmxlIHRoaXMgYmVoYXZpb3IuCgotd2lyZWNvcHlyZWN0IG1vZGUgICAgIFNpbmNlIHRoZSAtd2lyZWZyYW1lIG1lY2hhbmlzbSBldmlkZW50bHkgdHJhY2tzIG1vdmluZwotbm93aXJlY29weXJlY3QgICAgICAgIHdpbmRvd3MgYWNjdXJhdGVseSwgYSBzcGVlZHVwIGNhbiBiZSBvYnRhaW5lZCBieQogICAgICAgICAgICAgICAgICAgICAgIHRlbGxpbmcgdGhlIFZOQyB2aWV3ZXJzIHRvIGxvY2FsbHkgY29weSB0aGUgdHJhbnNsYXRlZAogICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyByZWdpb24uICBUaGlzIGlzIHRoZSBWTkMgQ29weVJlY3QgZW5jb2Rpbmc6CiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZyYW1lYnVmZmVyIHVwZGF0ZSBkb2Vzbid0IG5lZWQgdG8gc2VuZCB0aGUgYWN0dWFsCiAgICAgICAgICAgICAgICAgICAgICAgbmV3IGltYWdlIGRhdGEuCgogICAgICAgICAgICAgICAgICAgICAgIFNob3J0ZXIgYWxpYXNlczogIC13Y3IgW21vZGVdICBhbmQgLW5vd2NyCgogICAgICAgICAgICAgICAgICAgICAgICJtb2RlIiBjYW4gYmUgIm5ldmVyIiAoc2FtZSBhcyAtbm93aXJlY29weXJlY3QpCiAgICAgICAgICAgICAgICAgICAgICAgdG8gbmV2ZXIgdHJ5IHRoZSBjb3B5cmVjdCwgInRvcCIgbWVhbnMgb25seSBkbyBpdCBpZgogICAgICAgICAgICAgICAgICAgICAgIHRoZSB3aW5kb3cgd2FzIG5vdCBjb3ZlcmVkIGJ5IGFueSBvdGhlciB3aW5kb3dzLCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAiYWx3YXlzIiBtZWFucyB0byB0cmFuc2xhdGUgdGhlIG9yZ2luYWxseSB1bm9ic2N1cmVkCiAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uICh0aGlzIG1heSBsb29rIG9kZCBhcyB0aGUgcmVtYWluaW5nIHBpZWNlcyBjb21lCiAgICAgICAgICAgICAgICAgICAgICAgaW4sIGJ1dCBoZWxwcyBvbiBhIHNsb3cgbGluaykuICBEZWZhdWx0OiAiYWx3YXlzIgoKICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiB0aGVyZSBjYW4gYmUgcGFpbnRpbmcgZXJyb3JzIG9yIHNsb3cgcmVzcG9uc2UKICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHVzaW5nIC1zY2FsZSBzbyB5b3UgbWF5IHdhbnQgdG8gZGlzYWJsZSBDb3B5UmVjdAogICAgICAgICAgICAgICAgICAgICAgIGluIHRoaXMgY2FzZSAiLXdpcmVjb3B5cmVjdCBuZXZlciIgb24gdGhlIGNvbW1hbmQKICAgICAgICAgICAgICAgICAgICAgICBsaW5lIG9yIGJ5IHJlbW90ZS1jb250cm9sLiAgT3IgeW91IGNhbiBhbHNvIHVzZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAiLXNjYWxlIHh4eDpub2NyIiBzY2FsZSBvcHRpb24uCgotZGVidWdfd2lyZWZyYW1lICAgICAgIFR1cm4gb24gZGVidWdnaW5nIGluZm8gcHJpbnRvdXQgZm9yIHRoZSB3aXJlZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICBoZXVyaXN0aWNzLiAgIi1kd2YiIGlzIGFuIGFsaWFzLiAgU3BlY2lmeSBtdWx0aXBsZQogICAgICAgICAgICAgICAgICAgICAgIHRpbWVzIGZvciBtb3JlIG91dHB1dC4KCi1zY3JvbGxjb3B5cmVjdCBtb2RlICAgTGlrZSAtd2lyZWNvcHlyZWN0LCBidXQgdXNlIGhldXJpc3RpY3MgdG8gdHJ5IHRvIGd1ZXNzCi1ub3Njcm9sbGNvcHlyZWN0ICAgICAgaWYgYSB3aW5kb3cgaGFzIHNjcm9sbGVkIGl0cyBjb250ZW50cyAoZWl0aGVyIHZlcnRpY2FsbHkKICAgICAgICAgICAgICAgICAgICAgICBvciBob3Jpem9udGFsbHkpLiAgVGhpcyByZXF1aXJlcyB0aGUgUkVDT1JEIFggZXh0ZW5zaW9uCiAgICAgICAgICAgICAgICAgICAgICAgdG8gInNub29wIiBvbiBYIGFwcGxpY2F0aW9ucyAoY3VycmVudGx5IGZvciBjZXJ0YWluCiAgICAgICAgICAgICAgICAgICAgICAgWENvcHlBcmVhIGFuZCBYQ29uZmlndXJlV2luZG93IFggcHJvdG9jb2wgcmVxdWVzdHMpLgogICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVzOiBIaXR0aW5nIDxSZXR1cm4+IGluIGEgdGVybWluYWwgd2luZG93IHdoZW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yIHdhcyBhdCB0aGUgYm90dG9tLCB0aGUgdGV4dCBzY3JvbGxzIHVwIG9uZSBsaW5lLgogICAgICAgICAgICAgICAgICAgICAgIEhpdHRpbmcgPERvd24+IGFycm93IGluIGEgd2ViIGJyb3dzZXIgd2luZG93LCB0aGUgd2ViCiAgICAgICAgICAgICAgICAgICAgICAgcGFnZSBzY3JvbGxzIHVwIGEgc21hbGwgYW1vdW50LiAgT3Igc2Nyb2xsaW5nIHdpdGggYQogICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGJhciBvciBtb3VzZSB3aGVlbC4KCiAgICAgICAgICAgICAgICAgICAgICAgU2hvcnRlciBhbGlhc2VzOiAgLXNjciBbbW9kZV0gIGFuZCAtbm9zY3IKCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBzY2hlbWUgd2lsbCBub3QgYWx3YXlzIGRldGVjdCBzY3JvbGxzLCBidXQgd2hlbgogICAgICAgICAgICAgICAgICAgICAgIGl0IGRvZXMgdGhlcmUgaXMgYSBuaWNlIHNwZWVkdXAgZnJvbSB1c2luZyB0aGUgVk5DCiAgICAgICAgICAgICAgICAgICAgICAgQ29weVJlY3QgZW5jb2RpbmcgKHNlZSAtd2lyZWNvcHlyZWN0KS4gIFRoZSBzcGVlZHVwCiAgICAgICAgICAgICAgICAgICAgICAgaXMgYm90aCBpbiByZWR1Y2VkIG5ldHdvcmsgdHJhZmZpYyBhbmQgcmVkdWNlZCBYCiAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVidWZmZXIgcG9sbGluZy9jb3B5aW5nLiAgT24gdGhlIG90aGVyIGhhbmQsIGl0IG1heQogICAgICAgICAgICAgICAgICAgICAgIGluZHVjZSB1bmRlc2lyZWQgdHJhbnNpZW50cyAoZS5nLiBhIHRlcm1pbmFsIGN1cnNvcgogICAgICAgICAgICAgICAgICAgICAgIGJlaW5nIHNjcm9sbGVkIHVwIHdoZW4gaXQgc2hvdWxkIG5vdCBiZSkgb3Igb3RoZXIKICAgICAgICAgICAgICAgICAgICAgICBwYWludGluZyBlcnJvcnMgKHdpbmRvdyB0ZWFyaW5nLCBidW5jaGluZy11cCwgZXRjKS4KICAgICAgICAgICAgICAgICAgICAgICBUaGVzZSBhcmUgYXV0b21hdGljYWxseSByZXBhaXJlZCBpbiBhIHNob3J0IHBlcmlvZAogICAgICAgICAgICAgICAgICAgICAgIG9mIHRpbWUuICBJZiB0aGlzIGlzIHVuYWNjZXB0YWJsZSBkaXNhYmxlIHRoZSBmZWF0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCAtbm9zY3JvbGxjb3B5cmVjdC4KCiAgICAgICAgICAgICAgICAgICAgICAgU2NyZWVuIGNsZWFyaW5nIGtsdWRnZXM6ICBmb3IgdGVzdGluZyBhdCBsZWFzdCwgdGhlcmUKICAgICAgICAgICAgICAgICAgICAgICBhcmUgc29tZSAibWFnaWMga2V5IHNlcXVlbmNlcyIgKG11c3QgYmUgZG9uZSBpbiBsZXNzCiAgICAgICAgICAgICAgICAgICAgICAgdGhhbiAxIHNlY29uZCkgdG8gYWlkIHJlcGFpcmluZyBwYWludGluZyBlcnJvcnMgdGhhdAogICAgICAgICAgICAgICAgICAgICAgIG1heSBiZSBzZWVuIHdoZW4gdXNpbmcgdGhpcyBtb2RlOgoKICAgICAgICAgICAgICAgICAgICAgICAzIEFsdF9MJ3MgICBpbiBhIHJvdzogcmVzZW5kIHdob2xlIHNjcmVlbiwKICAgICAgICAgICAgICAgICAgICAgICA0IEFsdF9MJ3MgICBpbiBhIHJvdzogcmVyZWFkIGFuZCByZXNlbmQgd2hvbGUgc2NyZWVuLAogICAgICAgICAgICAgICAgICAgICAgIDMgU3VwZXJfTCdzIGluIGEgcm93OiBtYXJrIHdob2xlIHNjcmVlbiBmb3IgcG9sbGluZywKICAgICAgICAgICAgICAgICAgICAgICA0IFN1cGVyX0wncyBpbiBhIHJvdzogcmVzZXQgUkVDT1JEIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgNSBTdXBlcl9MJ3MgaW4gYSByb3c6IHRyeSB0byBwdXNoIGEgYmxhY2sgc2NyZWVuCgogICAgICAgICAgICAgICAgICAgICAgIG5vdGU6IEFsdF9MIGlzIHRoZSBMZWZ0ICJBbHQiIGtleSAoYSBzaW5nbGUga2V5KQogICAgICAgICAgICAgICAgICAgICAgIFN1cGVyX0wgaXMgdGhlIExlZnQgIlN1cGVyIiBrZXkgKFdpbmRvd3MgZmxhZykuCiAgICAgICAgICAgICAgICAgICAgICAgQm90aCBvZiB0aGVzZSBhcmUgbW9kaWZpZXIga2V5cywgYW5kIHNvIHNob3VsZCBub3QKICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0ZSBjaGFyYWN0ZXJzIHdoZW4gcHJlc3NlZCBieSB0aGVtc2VsdmVzLiAgQWxzbywKICAgICAgICAgICAgICAgICAgICAgICB5b3VyIFZOQyB2aWV3ZXIgbWF5IGhhdmUgaXRzIG93biByZWZyZXNoIGhvdC1rZXkKICAgICAgICAgICAgICAgICAgICAgICBvciBidXR0b24uCgogICAgICAgICAgICAgICAgICAgICAgICJtb2RlIiBjYW4gYmUgIm5ldmVyIiAoc2FtZSBhcyAtbm9zY3JvbGxjb3B5cmVjdCkKICAgICAgICAgICAgICAgICAgICAgICB0byBuZXZlciB0cnkgdGhlIGNvcHlyZWN0LCAia2V5cyIgbWVhbnMgdG8gdHJ5IGl0CiAgICAgICAgICAgICAgICAgICAgICAgaW4gcmVzcG9uc2UgdG8ga2V5c3Ryb2tlcyBvbmx5LCAibW91c2UiIG1lYW5zIHRvCiAgICAgICAgICAgICAgICAgICAgICAgdHJ5IGl0IGluIHJlc3BvbnNlIHRvIG1vdXNlIGV2ZW50cyBvbmx5LCAiYWx3YXlzIgogICAgICAgICAgICAgICAgICAgICAgIG1lYW5zIHRvIGRvIGJvdGguIERlZmF1bHQ6ICJhbHdheXMiCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IHRoZXJlIGNhbiBiZSBwYWludGluZyBlcnJvcnMgb3Igc2xvdyByZXNwb25zZQogICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdXNpbmcgLXNjYWxlIHNvIHlvdSBtYXkgd2FudCB0byBkaXNhYmxlIENvcHlSZWN0CiAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyBjYXNlICItc2Nyb2xsY29weXJlY3QgbmV2ZXIiIG9uIHRoZSBjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgICAgbGluZSBvciBieSByZW1vdGUtY29udHJvbC4gIE9yIHlvdSBjYW4gYWxzbyB1c2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIi1zY2FsZSB4eHg6bm9jciIgc2NhbGUgb3B0aW9uLgoKLXNjcl9hcmVhIG4gICAgICAgICAgICBTZXQgdGhlIG1pbmltdW0gYXJlYSBpbiBwaXhlbHMgZm9yIGEgcmVjdGFuZ2xlCiAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY29uc2lkZXJlZCBmb3IgdGhlIC1zY3JvbGxjb3B5cmVjdCBkZXRlY3Rpb24KICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWUuICBUaGlzIGlzIHRvIGF2b2lkIHdhc3RpbmcgdGhlIGVmZm9ydCBvbiBzbWFsbAogICAgICAgICAgICAgICAgICAgICAgIHJlY3RhbmdsZXMgdGhhdCB3b3VsZCBiZSBxdWlja2x5IHVwZGF0ZWQgdGhlIG5vcm1hbCB3YXkuCiAgICAgICAgICAgICAgICAgICAgICAgRS5nLiBzdXBwb3NlIGFuIGFwcCB1cGRhdGVkIHRoZSBwb3NpdGlvbiBvZiBpdHMgc2tpbm55CiAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsYmFyIGZpcnN0IGFuZCB0aGVuIHNoaWZ0ZWQgdGhlIGxhcmdlIHBhbmVsCiAgICAgICAgICAgICAgICAgICAgICAgaXQgY29udHJvbGxlZC4gIFdlIHdhbnQgdG8gYmUgc3VyZSB0byBza2lwIHRoZSBzbWFsbAogICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGJhciBhbmQgZ2V0IHRoZSBsYXJnZSBwYW5lbC4gRGVmYXVsdDogNjAwMDAKCi1zY3Jfc2tpcCBsaXN0ICAgICAgICAgU2tpcCBzY3JvbGwgZGV0ZWN0aW9uIGZvciBhcHBsaWNhdGlvbnMgbWF0Y2hpbmcKICAgICAgICAgICAgICAgICAgICAgICB0aGUgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygc3RyaW5ncyBpbiAibGlzdCIuCiAgICAgICAgICAgICAgICAgICAgICAgU29tZSBhcHBsaWNhdGlvbnMgaW1wbGVtZW50IHRoZWlyIHNjcm9sbGluZyBpbgogICAgICAgICAgICAgICAgICAgICAgIHN0cmFuZ2Ugd2F5cyB3aGVyZSB0aGUgWENvcHlBcmVhLCBldGMsIGFsc28gYXBwbGllcwogICAgICAgICAgICAgICAgICAgICAgIHRvIGludmlzaWJsZSBwb3J0aW9ucyBvZiB0aGUgd2luZG93OiBpZiB3ZSBDb3B5UmVjdAogICAgICAgICAgICAgICAgICAgICAgIHRob3NlIGFyZWFzIGl0IGxvb2tzIGF3ZnVsIGR1cmluZyB0aGUgc2Nyb2xsIGFuZAogICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIG1heSBiZSBwYWludGluZyBlcnJvcnMgbGVmdCBhZnRlciB0aGUgc2Nyb2xsLgogICAgICAgICAgICAgICAgICAgICAgIFNvZmZpY2UuYmluIGlzIHRoZSB3b3JzdCBrbm93biBvZmZlbmRlci4KCiAgICAgICAgICAgICAgICAgICAgICAgVXNlICIjIyIgdG8gZGVub3RlIHRoZSBzdGFydCBvZiB0aGUgYXBwbGljYXRpb24gY2xhc3MKICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiAiIyNYVGVybSIpIGFuZCAiKysiIHRvIGRlbm90ZSB0aGUgc3RhcnQKICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgYXBwbGljYXRpb24gaW5zdGFuY2UgbmFtZSAoZS5nLiAiKyt4dGVybSIpLgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdHJpbmcgeW91ciBsaXN0IGlzIG1hdGNoZWQgYWdhaW5zdCBpcyBvZiB0aGUgZm9ybQogICAgICAgICAgICAgICAgICAgICAgICJeXldNX05BTUUjI0NsYXNzKytJbnN0YW5jZTxzYW1lLWZvci1hbnktc3Vid2luZG93cz4iCiAgICAgICAgICAgICAgICAgICAgICAgVGhlICJ4bHNjbGllbnRzIC1sYSIgY29tbWFuZCB3aWxsIHByb3ZpZGUgdGhpcyBpbmZvLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiBhIHBhdHRlcm4gaXMgcHJlZml4ZWQgd2l0aCAiS0VZOiIgaXQgb25seSBhcHBsaWVzCiAgICAgICAgICAgICAgICAgICAgICAgdG8gS2V5c3Ryb2tlIGdlbmVyYXRlZCBzY3JvbGxzIChlLmcuIFVwIGFycm93KS4gIElmIGl0CiAgICAgICAgICAgICAgICAgICAgICAgaXMgcHJlZml4ZWQgd2l0aCAiTU9VU0U6IiBpdCBvbmx5IGFwcGxpZXMgdG8gTW91c2UKICAgICAgICAgICAgICAgICAgICAgICBpbmR1Y2VkIHNjcm9sbHMgKGUuZy4gZHJhZ2dpbmcgb24gYSBzY3JvbGxiYXIpLgogICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6ICMjU29mZmljZS5iaW4sIyNTdGFyT2ZmaWNlLCMjT3Blbk9mZmljZQoKLXNjcl9pbmMgbGlzdCAgICAgICAgICBPcHBvc2l0ZSBvZiAtc2NyX3NraXA6IHRoaXMgbGlzdCBpcyBjb25zdWx0ZWQgZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICBhbmQgaWYgdGhlcmUgaXMgYSBtYXRjaCB0aGUgd2luZG93IHdpbGwgYmUgbW9uaXRvcmVkCiAgICAgICAgICAgICAgICAgICAgICAgdmlhIFJFQ09SRCBmb3Igc2Nyb2xscyBpcnJlc3BlY3RpdmUgb2YgLXNjcl9za2lwLgogICAgICAgICAgICAgICAgICAgICAgIFVzZSAtc2NyX3NraXAgJyonIHRvIHNraXAgYW55dGhpbmcgdGhhdCBkb2VzIG5vdCBtYXRjaAogICAgICAgICAgICAgICAgICAgICAgIHlvdXIgLXNjcl9pbmMuICBVc2UgLXNjcl9pbmMgJyonIHRvIGluY2x1ZGUgZXZlcnl0aGluZy4KCi1zY3Jfa2V5cyBsaXN0ICAgICAgICAgRm9yIGtleXN0cm9rZSBzY3JvbGwgZGV0ZWN0aW9uLCBvbmx5IGFwcGx5IHRoZSBSRUNPUkQKICAgICAgICAgICAgICAgICAgICAgICBoZXVyaXN0aWNzIHRvIHRoZSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBrZXlzeW1zIGluCiAgICAgICAgICAgICAgICAgICAgICAgImxpc3QiLiAgWW91IG1heSBmaW5kIHRoZSBSRUNPUkQgb3ZlcmhlYWQgZm9yIGV2ZXJ5CiAgICAgICAgICAgICAgICAgICAgICAgb25lIG9mIHlvdXIga2V5c3Ryb2tlcyBkaXNydXB0cyB0eXBpbmcgdG9vIG11Y2gsIGJ1dCB5b3UKICAgICAgICAgICAgICAgICAgICAgICBkb24ndCB3YW50IHRvIHR1cm4gaXQgb2ZmIGNvbXBsZXRlbHkgd2l0aCAiLXNjciBtb3VzZSIKICAgICAgICAgICAgICAgICAgICAgICBhbmQgLXNjcl9wYXJtcyBkb2VzIG5vdCB3b3JrIG9yIGlzIHRvbyBjb25mdXNpbmcuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBsaXN0ZWQga2V5c3ltcyBjYW4gYmUgbnVtZXJpYyBvciB0aGUga2V5c3ltCiAgICAgICAgICAgICAgICAgICAgICAgbmFtZXMgaW4gdGhlIDxYMTEva2V5c3ltZGVmLmg+IGhlYWRlciBmaWxlIG9yIGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgeGV2KDEpIHByb2dyYW0uICBFeGFtcGxlOiAiLXNjcl9rZXlzIFVwLERvd24sUmV0dXJuIi4KICAgICAgICAgICAgICAgICAgICAgICBPbmUgcHJvYmFibHkgd2FudHMgdG8gaGF2ZSBhcHBsaWNhdGlvbiBzcGVjaWZpYyBsaXN0cwogICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGZvciB0ZXJtaW5hbHMsIGV0YykgYnV0IHRoYXQgaXMgdG9vIGlja3kgdG8gdGhpbmsKICAgICAgICAgICAgICAgICAgICAgICBhYm91dCBmb3Igbm93Li4uCgogICAgICAgICAgICAgICAgICAgICAgIElmICJsaXN0IiBiZWdpbnMgd2l0aCB0aGUgIi0iIGNoYXJhY3RlciB0aGUgbGlzdAogICAgICAgICAgICAgICAgICAgICAgIGlzIHRha2VuIGFzIGFuIGV4Y2x1ZGUgbGlzdDogYWxsIGtleXN5bXMgZXhjZXB0IHRob3NlCiAgICAgICAgICAgICAgICAgICAgICAgbGlzdCB3aWxsIGJlIGNvbnNpZGVyZWQuICBUaGUgc3BlY2lhbCBzdHJpbmcgImJ1aWx0aW4iCiAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kcyB0byBhbiBpbnRlcm5hbCBsaXN0IG9mIGtleXN5bXMgdGhhdCBhcmUgbGlrZWx5CiAgICAgICAgICAgICAgICAgICAgICAgdG8gY2F1c2Ugc2Nyb2xscy4gIEJUVywgYnkgZGVmYXVsdCBtb2RpZmllciBrZXlzLAogICAgICAgICAgICAgICAgICAgICAgIFNoaWZ0X0wsIENvbnRyb2xfUiwgZXRjLCBhcmUgc2tpcHBlZCBzaW5jZSB0aGV5IGFsbW9zdAogICAgICAgICAgICAgICAgICAgICAgIG5ldmVyIGluZHVjZSBzY3JvbGxpbmcgYnkgdGhlbXNlbHZlcy4KCi1zY3JfdGVybSBsaXN0ICAgICAgICAgWWV0IGFub3RoZXIgY29zbWV0aWMga2x1ZGdlLiAgQXBwbHkgc2hlbGwvdGVybWluYWwKICAgICAgICAgICAgICAgICAgICAgICBoZXVyaXN0aWNzIHRvIGFwcGxpY2F0aW9ucyBtYXRjaGluZyBjb21tYSBzZXBhcmF0ZWQKICAgICAgICAgICAgICAgICAgICAgICBsaXN0IChzYW1lIGFzIGZvciAtc2NyX3NraXAvLXNjcl9pbmMpLiAgRm9yIGV4YW1wbGUgYW4KICAgICAgICAgICAgICAgICAgICAgICBhbm5veWluZyB0cmFuc2llbnQgdW5kZXIgc2Nyb2xsIGRldGVjdGlvbiBpcyBpZiB5b3UKICAgICAgICAgICAgICAgICAgICAgICBoaXQgRW50ZXIgaW4gYSB0ZXJtaW5hbCBzaGVsbCB3aXRoIGZ1bGwgdGV4dCB3aW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNvbGlkIHRleHQgY3Vyc29yIGJsb2NrIHdpbGwgYmUgc2Nyb2xsZWQgdXAuCiAgICAgICAgICAgICAgICAgICAgICAgU28gZm9yIGEgc2hvcnQgdGltZSB0aGVyZSBhcmUgdHdvIChvciBtb3JlKSBibG9jawogICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcnMgb24gdGhlIHNjcmVlbi4gIFRoZXJlIGFyZSBzaW1pbGFyIHNjZW5hcmlvcywKICAgICAgICAgICAgICAgICAgICAgICAoZS5nLiBhbiBvdXRwdXQgbGluZSBpcyBkdXBsaWNhdGVkKS4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgdHJhbnNpZW50cyBhcmUgaW5kdWNlZCBieSB0aGUgYXBwcm94aW1hdGlvbiBvZgogICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbCBkZXRlY3Rpb24gKGUuZy4gaXQgZGV0ZWN0cyB0aGUgc2Nyb2xsLCBidXQgbm90CiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZhY3QgdGhhdCB0aGUgYmxvY2sgY3Vyc29yIHdhcyBjbGVhcmVkIGp1c3QgYmVmb3JlCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNjcm9sbCkuICBJbiBuZWFybHkgYWxsIGNhc2VzIHRoZXNlIHRyYW5zaWVudCBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgICBhcmUgcmVwYWlyZWQgd2hlbiB0aGUgdHJ1ZSBYIGZyYW1lYnVmZmVyIGlzIGNvbnN1bHRlZAogICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBub3JtYWwgcG9sbGluZy4gIEJ1dCB0aGV5IGFyZSBkaXN0cmFjdGluZywgc28KICAgICAgICAgICAgICAgICAgICAgICB3aGF0IHRoaXMgb3B0aW9uIHByb3ZpZGVzIGlzIGV4dHJhICJwYWRkaW5nIiBuZWFyIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbSBvZiB0aGUgdGVybWluYWwgd2luZG93OiBhIGZldyBleHRyYSBsaW5lcyBuZWFyCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGJvdHRvbSB3aWxsIG5vdCBiZSBzY3JvbGxlZCwgYnV0IHJhdGhlciB1cGRhdGVkCiAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgYWN0dWFsIFggZnJhbWVidWZmZXIuICBUaGlzIHVzdWFsbHkgcmVkdWNlcwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBhbm5veWluZyBhcnRpZmFjdHMuICBVc2UgIm5vbmUiIHRvIGRpc2FibGUuCiAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogInRlcm0iCgotc2NyX2tleXJlcGVhdCBsby1oaSAgIElmIGEga2V5IGlzIGhlbGQgZG93biAob3Igb3RoZXJ3aXNlIHJlcGVhdHMgcmFwaWRseSkgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBpbmR1Y2VzIGEgcmFwaWQgc2VxdWVuY2Ugb2Ygc2Nyb2xscyAoZS5nLiBob2xkaW5nCiAgICAgICAgICAgICAgICAgICAgICAgZG93biBhbiBBcnJvdyBrZXkpIHRoZSAic2Nyb2xsY29weXJlY3QiIGRldGVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgIGFuZCBvdmVyaGVhZCBtYXkgbm90IGJlIGFibGUgdG8ga2VlcCB1cC4gIEEgdGltZSBwZXIKICAgICAgICAgICAgICAgICAgICAgICBzaW5nbGUgc2Nyb2xsIGVzdGltYXRlIGlzIHBlcmZvcm1lZCBhbmQgaWYgdGhhdCBlc3RpbWF0ZQogICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3RzIGEgc3VzdGFpbmFibGUgc2Nyb2xscmF0ZSBvZiBrZXlzIHBlciBzZWNvbmQKICAgICAgICAgICAgICAgICAgICAgICBiZXR3ZWVuICJsbyIgYW5kICJoaSIgdGhlbiByZXBlYXRlZCBrZXlzIHdpbGwgYmUKICAgICAgICAgICAgICAgICAgICAgICBESVNDQVJERUQgdG8gbWFpbnRhaW4gdGhlIHNjcm9sbHJhdGUuIEZvciBleGFtcGxlIHlvdXIKICAgICAgICAgICAgICAgICAgICAgICBrZXkgYXV0b3JlcGVhdCBtYXkgYmUgMjUga2V5cy9zZWMsIGJ1dCBmb3IgYSBsYXJnZQogICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyBvciBzbG93IGxpbmsgb25seSA4IHNjcm9sbHMgcGVyIHNlY29uZCBjYW4gYmUKICAgICAgICAgICAgICAgICAgICAgICBzdXN0YWluZWQsIHRoZW4gcm91Z2hseSAyIG91dCBvZiBldmVyeSAzIHJlcGVhdGVkIGtleXMKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGRpc2NhcmRlZCBkdXJpbmcgdGhpcyBwZXJpb2QuIERlZmF1bHQ6ICI0LTIwIgoKLXNjcl9wYXJtcyBzdHJpbmcgICAgICBTZXQgdmFyaW91cyBwYXJhbWV0ZXJzIGZvciB0aGUgc2Nyb2xsY29weXJlY3QgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9ybWF0IGlzIHNpbWlsYXIgdG8gdGhhdCBmb3IgLXdpcmVmcmFtZSBhbmQgcGFja2VkCiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBsb3RzIG9mIHBhcmFtZXRlcnM6CgogICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdDogVCtCK0wrUix0MSt0Mit0MyxzMStzMitzMytzNCtzNQogICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IDArNjQrMzIrMzIsMC4wMiswLjEwKzAuOSwwLjAzKzAuMDYrMC41KzAuMSs1LjAKCiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGxlYXZlIG5vdGhpbmcgYmV0d2VlbiBjb21tYXM6ICIsLCIgdGhlIGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBpcyB1c2VkLiAgSWYgeW91IGRvbid0IHNwZWNpZnkgZW5vdWdoIGNvbW1hcywKICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHJhaWxpbmcgcGFyYW1ldGVycyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHRzLgoKICAgICAgICAgICAgICAgICAgICAgICAiVCtCK0wrUiIgaW5kaWNhdGVzIGZvdXIgaW50ZWdlcnMgZm9yIGhvdyBjbG9zZSBpbgogICAgICAgICAgICAgICAgICAgICAgIHBpeGVscyB0aGUgcG9pbnRlciBoYXMgdG8gYmUgZnJvbSB0aGUgVG9wLCBCb3R0b20sIExlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgb3IgUmlnaHQgZWRnZXMgb2YgdGhlIHdpbmRvdyB0byBjb25zaWRlciBzY3JvbGxjb3B5cmVjdC4KICAgICAgICAgICAgICAgICAgICAgICBJZiAtd2lyZWZyYW1lIG92ZXJsYXBzIGl0IHRha2VzIHByZWNlZGVuY2UuICBUaGlzIGlzIGEKICAgICAgICAgICAgICAgICAgICAgICBzcGVlZHVwIHRvIHF1aWNrbHkgZXhjbHVkZSBhIHdpbmRvdyBmcm9tIGJlaW5nIHdhdGNoZWQKICAgICAgICAgICAgICAgICAgICAgICBmb3Igc2Nyb2xsY29weXJlY3Q6IHNldCB0aGVtIGFsbCB0byB6ZXJvIHRvIG5vdCB0cnkKICAgICAgICAgICAgICAgICAgICAgICB0aGUgc3BlZWR1cCAodGhpbmdzIGxpa2Ugc2VsZWN0aW5nIHRleHQgd2lsbCBsaWtlbHkKICAgICAgICAgICAgICAgICAgICAgICBiZSBzbG93ZXIpLgoKICAgICAgICAgICAgICAgICAgICAgICAidDErdDIrdDMiIHNwZWNpZnkgdGhyZWUgZmxvYXRpbmcgcG9pbnQgdGltZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzIHRoYXQgYXBwbHkgdG8gc2Nyb2xsY29weXJlY3QgZGV0ZWN0aW9uIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAqS2V5c3Ryb2tlKiBpbnB1dDogdDEgaXMgaG93IGxvbmcgdG8gd2FpdCBhZnRlciBhIGtleQogICAgICAgICAgICAgICAgICAgICAgIGlzIHByZXNzZWQgZm9yIHRoZSBmaXJzdCBzY3JvbGwsIHQyIGlzIGhvdyBsb25nIHRvIGtlZXAKICAgICAgICAgICAgICAgICAgICAgICBsb29raW5nIGFmdGVyIGEgS2V5c3Ryb2tlIHNjcm9sbCBmb3IgbW9yZSBzY3JvbGxzLgogICAgICAgICAgICAgICAgICAgICAgIHQzIGlzIGhvdyBmcmVxdWVudGx5IHRvIHRyeSB0byB1cGRhdGUgc3Vycm91bmRpbmcKICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxiYXJzIG91dHNpZGUgb2YgdGhlIHNjcm9sbGluZyBhcmVhICgwLjAgdG8KICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlKQoKICAgICAgICAgICAgICAgICAgICAgICAiczErczIrczMrczQrczUiIHNwZWNpZnkgZml2ZSBmbG9hdGluZyBwb2ludCB0aW1lcwogICAgICAgICAgICAgICAgICAgICAgIGluIHNlY29uZHMgdGhhdCBhcHBseSB0byBzY3JvbGxjb3B5cmVjdCBkZXRlY3Rpb24gd2l0aAogICAgICAgICAgICAgICAgICAgICAgICpNb3VzZSogaW5wdXQ6IHMxIGlzIGhvdyBsb25nIHRvIHdhaXQgYWZ0ZXIgYSBtb3VzZQogICAgICAgICAgICAgICAgICAgICAgIGJ1dHRvbiBpcyBwcmVzc2VkIGZvciB0aGUgZmlyc3Qgc2Nyb2xsLCBzMiBpcyBob3cgbG9uZwogICAgICAgICAgICAgICAgICAgICAgIHRvIGtlZXAgd2FpdGluZyBmb3IgYWRkaXRpb25hbCBzY3JvbGxzIGFmdGVyIHRoZSBmaXJzdAogICAgICAgICAgICAgICAgICAgICAgIE1vdXNlIHNjcm9sbCB3YXMgZGV0ZWN0ZWQuICBzMyBpcyBob3cgZnJlcXVlbnRseSB0bwogICAgICAgICAgICAgICAgICAgICAgIHRyeSB0byB1cGRhdGUgc3Vycm91bmRpbmcgc2Nyb2xsYmFycyBvdXRzaWRlIG9mIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGluZyBhcmVhICgwLjAgdG8gZGlzYWJsZSkuICBzNCBpcyBob3cgbG9uZyB0bwogICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciBwb2ludGVyIG1vdGlvbiAodG8gdHJ5IHRvIGdldCBmZXdlciwgYmlnZ2VyCiAgICAgICAgICAgICAgICAgICAgICAgbW91c2Ugc2Nyb2xscykuIHM1IGlzIHRoZSBtYXhpbXVtIHRpbWUgdG8gc3BlbmQganVzdAogICAgICAgICAgICAgICAgICAgICAgIHVwZGF0aW5nIHRoZSBzY3JvbGwgd2luZG93IHdpdGhvdXQgdXBkYXRpbmcgdGhlIHJlc3QKICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgc2NyZWVuLgoKLWZpeHNjcmVlbiBzdHJpbmcgICAgICBQZXJpb2RpY2FsbHkgInJlcGFpciIgdGhlIHNjcmVlbiBiYXNlZCBvbiBzZXR0aW5ncwogICAgICAgICAgICAgICAgICAgICAgIGluICJzdHJpbmciLiAgSG9wZWZ1bGx5IHlvdSB3b24ndCBuZWVkIHRoaXMgb3B0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIGl0IGlzIGludGVuZGVkIGZvciBjYXNlcyB3aGVuIHRoZSAtc2Nyb2xsY29weXJlY3Qgb3IKICAgICAgICAgICAgICAgICAgICAgICAtd2lyZWNvcHlyZWN0IGZlYXR1cmVzIGxlYXZlIHRvbyBtYW55IHBhaW50aW5nIGVycm9ycywKICAgICAgICAgICAgICAgICAgICAgICBidXQgaXQgY2FuIGJlIHVzZWQgZm9yIGFueSBzY2VuYXJpby4gIFRoaXMgb3B0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgcGVyaW9kaWNhbGx5IHBlcmZvcm1zIGNvc3RseSBvcGVyYXRpb25zIGFuZCBzbwogICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlIHJlc3BvbnNlIG1heSBiZSByZWR1Y2VkIHdoZW4gaXQgaXMgb24uCiAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiB1c2UgMyBBbHRfTCdzICh0aGUgTGVmdCAiQWx0IiBrZXkpIHRhcHMgaW4KICAgICAgICAgICAgICAgICAgICAgICBhIHJvdyAoYXMgZGVzY3JpYmVkIHVuZGVyIC1zY3JvbGxjb3B5cmVjdCkgaW5zdGVhZCB0bwogICAgICAgICAgICAgICAgICAgICAgIG1hbnVhbGx5IHJlcXVlc3QgYSBzY3JlZW4gcmVwYWludCB3aGVuIGl0IGlzIG5lZWRlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgInN0cmluZyIgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBvbmUgb3IgbW9yZSBvZgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBmb2xsb3dpbmc6ICJWPXQiLCAiQz10IiwgIlg9dCIsIGFuZCAiOD10Ii4KICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGVzZSAidCIgc3RhbmRzIGZvciBhIHRpbWUgaW4gc2Vjb25kcyAoaXQgaXMKICAgICAgICAgICAgICAgICAgICAgICBhIGZsb2F0aW5nIHBvaW50IGV2ZW4gdGhvdWdoIG9uZSBzaG91bGQgdXN1YWxseSB1c2UKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPiAyIHRvIGF2b2lkIHdhc3RpbmcgcmVzb3VyY2VzKS4gIFYgc2V0cyBob3cKICAgICAgICAgICAgICAgICAgICAgICBmcmVxdWVudGx5IHRoZSBlbnRpcmUgc2NyZWVuIHNob3VsZCBiZSBzZW50IHRvIHZpZXdlcnMKICAgICAgICAgICAgICAgICAgICAgICAoaXQgaXMgbGlrZSB0aGUgMyBBbHRfTCdzKS4gIEMgc2V0cyBob3cgbG9uZyB0byB3YWl0CiAgICAgICAgICAgICAgICAgICAgICAgYWZ0ZXIgYSBDb3B5UmVjdCB0byByZXBhaW50IHRoZSBmdWxsIHNjcmVlbi4gIFggc2V0cwogICAgICAgICAgICAgICAgICAgICAgIGhvdyBmcmVxdWVudGx5IHRvIHJlcmVhZCB0aGUgZnVsbCBYMTEgZnJhbWVidWZmZXIgZnJvbQogICAgICAgICAgICAgICAgICAgICAgIHRoZSBYIHNlcnZlciBhbmQgcHVzaCBpdCBvdXQgdG8gY29ubmVjdGVkIHZpZXdlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgVXNlIG9mIFggc2hvdWxkIGJlIHJhcmUsIHBsZWFzZSByZXBvcnQgYSBidWcgaWYgeW91CiAgICAgICAgICAgICAgICAgICAgICAgZmluZCB5b3UgbmVlZCBpdC4gOD0gYXBwbGllcyBvbmx5IGZvciAtOHRvMjQgbW9kZTogaXQKICAgICAgICAgICAgICAgICAgICAgICBzZXRzIGhvdyBvZnRlbiB0aGUgbm9uLWRlZmF1bHQgdmlzdWFsIHJlZ2lvbnMgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuIChlLmcuIDhicHAgd2luZG93cykgYXJlIHJlZnJlc2hlZC4gIEV4YW1wbGVzOgogICAgICAgICAgICAgICAgICAgICAgIC1maXhzY3JlZW4gVj0xMCAtZml4c2NyZWVuIEM9MTAKCi1kZWJ1Z19zY3JvbGwgICAgICAgICAgVHVybiBvbiBkZWJ1Z2dpbmcgaW5mbyBwcmludG91dCBmb3IgdGhlIHNjcm9sbAogICAgICAgICAgICAgICAgICAgICAgIGhldXJpc3RpY3MuICAiLWRzIiBpcyBhbiBhbGlhcy4gIFNwZWNpZnkgaXQgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgICAgICB0aW1lcyBmb3IgbW9yZSBvdXRwdXQuCgotbm94cmVjb3JkICAgICAgICAgICAgIERpc2FibGUgYW55IHVzZSBvZiB0aGUgUkVDT1JEIGV4dGVuc2lvbi4gIFRoaXMgaXMKICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgdXNlZCBieSB0aGUgLXNjcm9sbGNvcHlyZWN0IHNjaGVtZSBhbmQgdG8KICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yIFggc2VydmVyIGdyYWJzLgoKLWdyYWJfYnVzdGVyICAgICAgICAgICBTb21lIG9mIHRoZSB1c2Ugb2YgdGhlIFJFQ09SRCBleHRlbnNpb24gY2FuIGxlYXZlIGEKLW5vZ3JhYl9idXN0ZXIgICAgICAgICB0aW55IHdpbmRvdyBmb3IgWEdyYWJTZXJ2ZXIgZGVhZGxvY2suICBUaGlzIGlzIG9ubHkgaWYKICAgICAgICAgICAgICAgICAgICAgICB0aGUgd2hvbGUtc2VydmVyIGdyYWJiaW5nIGFwcGxpY2F0aW9uIGV4cGVjdHMgbW91c2Ugb3IKICAgICAgICAgICAgICAgICAgICAgICBrZXlib2FyZCBpbnB1dCBiZWZvcmUgcmVsZWFzaW5nIHRoZSBncmFiLiAgSXQgaXMgdXN1YWxseQogICAgICAgICAgICAgICAgICAgICAgIGEgd2luZG93IG1hbmFnZXIgdGhhdCBkb2VzIHRoaXMuICB4MTF2bmMgdGFrZXMgY2FyZSB0bwogICAgICAgICAgICAgICAgICAgICAgIGF2b2lkIHRoZSBwcm9ibGVtLCBidXQgaWYgY2F1Z2h0IHgxMXZuYyB3aWxsIGZyZWV6ZS4KICAgICAgICAgICAgICAgICAgICAgICBXaXRob3V0IC1ncmFiX2J1c3RlciwgdGhlIG9ubHkgc29sdXRpb24gaXMgdG8gZ28gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWwgZGlzcGxheSBhbmQgZ2l2ZSBpdCBzb21lIGlucHV0IHRvIHNhdGlzZnkgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgZ3JhYmJpbmcgYXBwLiAgT3IgbWFudWFsbHkga2lsbCBhbmQgcmVzdGFydCB0aGUgd2luZG93CiAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlciBpZiB0aGF0IGlzIGZlYXNpYmxlLiAgV2l0aCAtZ3JhYl9idXN0ZXIsIHgxMXZuYwogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgZm9yayBhIGhlbHBlciB0aHJlYWQgYW5kIGlmIHgxMXZuYyBhcHBlYXJzIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgc3R1Y2sgaW4gYSBncmFiIGFmdGVyIGEgcGVyaW9kIG9mIHRpbWUgKDIwLTMwIHNlYykgdGhlbgogICAgICAgICAgICAgICAgICAgICAgIGl0IHdpbGwgaW5qZWN0IHNvbWUgdXNlciBpbnB1dDogYnV0dG9uIGNsaWNrcywgRXNjYXBlLAogICAgICAgICAgICAgICAgICAgICAgIG1vdXNlIG1vdGlvbiwgZXRjIHRvIHRyeSB0byBicmVhayB0aGUgZ3JhYi4gIElmIHlvdQogICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaWVuY2UgYSBsb3Qgb2YgZ3JhYiBkZWFkbG9jaywgcGxlYXNlIHJlcG9ydCBhIGJ1Zy4KCi1kZWJ1Z19ncmFicyAgICAgICAgICAgVHVybiBvbiBkZWJ1Z2dpbmcgaW5mbyBwcmludG91dCB3aXRoIHJlc3BlY3QgdG8KICAgICAgICAgICAgICAgICAgICAgICBYR3JhYlNlcnZlcigpIGRlYWRsb2NrIGZvciAtc2Nyb2xsY29weXJlY3QgbW9kZS4KCi1kZWJ1Z19zZWwgICAgICAgICAgICAgVHVybiBvbiBkZWJ1Z2dpbmcgaW5mbyBwcmludG91dCB3aXRoIHJlc3BlY3QgdG8KICAgICAgICAgICAgICAgICAgICAgICBQUklNQVJZLCBDTElQQk9BUkQsIGFuZCBDVVRCVUZGRVIwIHNlbGVjdGlvbnMuCgotcG9pbnRlcl9tb2RlIG4gICAgICAgIFZhcmlvdXMgcG9pbnRlciBtb3Rpb24gdXBkYXRlIHNjaGVtZXMuICItcG0iIGlzCiAgICAgICAgICAgICAgICAgICAgICAgYW4gYWxpYXMuICBUaGUgcHJvYmxlbSBpcyBwb2ludGVyIG1vdGlvbiBjYW4gY2F1c2UKICAgICAgICAgICAgICAgICAgICAgICByYXBpZCBjaGFuZ2VzIG9uIHRoZSBzY3JlZW46IGNvbnNpZGVyIHRoZSByYXBpZAogICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgd2hlbiB5b3UgZHJhZyBhIGxhcmdlIHdpbmRvdyBhcm91bmQgb3BhcXVlbHkuCiAgICAgICAgICAgICAgICAgICAgICAgTmVpdGhlciB4MTF2bmMncyBzY3JlZW4gcG9sbGluZyBhbmQgdm5jIGNvbXByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZXMgbm9yIHRoZSBiYW5kd2lkdGggdG8gdGhlIHZuY3ZpZXdlcnMgY2FuIGtlZXAKICAgICAgICAgICAgICAgICAgICAgICB1cCB0aGVzZSByYXBpZCBzY3JlZW4gY2hhbmdlczogZXZlcnl0aGluZyB3aWxsIGJvZyBkb3duCiAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBkcmFnZ2luZyBvciBzY3JvbGxpbmcuICBTbyBhIHNjaGVtZSBoYXMgdG8gYmUgdXNlZAogICAgICAgICAgICAgICAgICAgICAgIHRvICJlYXQiIG11Y2ggb2YgdGhhdCBwb2ludGVyIGlucHV0IGJlZm9yZSByZS1wb2xsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNjcmVlbiBhbmQgc2VuZGluZyBvdXQgZnJhbWVidWZmZXIgdXBkYXRlcy4gVGhlCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBudW1iZXIgIm4iIGNhbiBiZSAwIHRvIDQgYW5kIHNlbGVjdHMgb25lIG9mCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNjaGVtZXMgZGVzcmliZWQgYmVsb3cuCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgLXdpcmVmcmFtZSBhbmQgLXNjcm9sbGNvcHlyZWN0IG1vZGVzCiAgICAgICAgICAgICAgICAgICAgICAgY29tcGxlbWVudCAtcG9pbnRlcl9tb2RlIGJ5IGRldGVjdGluZyAoYW5kIGltcHJvdmluZykKICAgICAgICAgICAgICAgICAgICAgICBjZXJ0YWluIHBlcmlvZHMgb2YgInJhcGlkIHNjcmVlbiBjaGFuZ2UiLgoKICAgICAgICAgICAgICAgICAgICAgICBuPTA6IGRvZXMgdGhlIHNhbWUgYXMgLW5vZHJhZ2dpbmcuIChhbGwgc2NyZWVuIHBvbGxpbmcKICAgICAgICAgICAgICAgICAgICAgICBpcyBzdXNwZW5kZWQgaWYgYSBtb3VzZSBidXR0b24gaXMgcHJlc3NlZC4pCgogICAgICAgICAgICAgICAgICAgICAgIG49MTogd2FzIHRoZSBvcmlnaW5hbCBzY2hlbWUgdXNlZCB0byBhYm91dCBKYW4gMjAwNDoKICAgICAgICAgICAgICAgICAgICAgICBpdCBiYXNpY2FsbHkganVzdCBza2lwcyAtaW5wdXRfc2tpcCBrZXlib2FyZCBvciBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzIGJlZm9yZSByZXBvbGxpbmcgdGhlIHNjcmVlbi4KCiAgICAgICAgICAgICAgICAgICAgICAgbj0yIGlzIGFuIGltcHJvdmVkIHNjaGVtZTogYnkgd2F0Y2hpbmcgdGhlIGN1cnJlbnQgcmF0ZQogICAgICAgICAgICAgICAgICAgICAgIG9mIGlucHV0IGV2ZW50cyBpdCB0cmllcyB0byBkZXRlY3QgaWYgaXQgc2hvdWxkIHRyeSB0bwogICAgICAgICAgICAgICAgICAgICAgICJlYXQiIGFkZGl0aW9uYWwgcG9pbnRlciBldmVudHMgYmVmb3JlIGNvbnRpbnVpbmcuCgogICAgICAgICAgICAgICAgICAgICAgIG49MyBpcyBiYXNpY2FsbHkgYSBkeW5hbWljIC1ub2RyYWdnaW5nIG1vZGU6IGl0IGRldGVjdHMKICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSBtb3VzZSBtb3Rpb24gaGFzIHBhdXNlZCBhbmQgdGhlbiByZWZyZXNoZXMKICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGlzcGxheS4KCiAgICAgICAgICAgICAgICAgICAgICAgbj00IGF0dGVtcHRzIHRvIG1lYXN1cmVzIG5ldHdvcmsgcmF0ZXMgYW5kIGxhdGVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHZpZGVvIGNhcmQgcmVhZCByYXRlLCBhbmQgaG93IG1hbnkgdGlsZXMgaGF2ZSBiZWVuCiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCBvbiB0aGUgc2NyZWVuLiAgRnJvbSB0aGlzLCBpdCBhZ2dyZXNzaXZlbHkgdHJpZXMKICAgICAgICAgICAgICAgICAgICAgICB0byBwdXNoIHNjcmVlbiAiZnJhbWVzIiB3aGVuIGl0IGRlY2lkZXMgaXQgaGFzIGVub3VnaAogICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyB0byBkbyBzby4gIE5PVCBGSU5JU0hFRC4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgbiBpcyAyLiBOb3RlIHRoYXQgbW9kZXMgMiwgMywgNCB3aWxsIHNraXAKICAgICAgICAgICAgICAgICAgICAgICAtaW5wdXRfc2tpcCBrZXlib2FyZCBldmVudHMgKGJ1dCBpdCB3aWxsIG5vdCBjb3VudAogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgZXZlbnRzKS4gIEFsc28gbm90ZSB0aGF0IHRoZXNlIG1vZGVzIGFyZSBub3QKICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgaW4gLXRocmVhZHMgbW9kZSB3aGljaCBoYXMgaXRzIG93biBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQgaGFuZGxpbmcgbWVjaGFuaXNtLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyB0cnkgb3V0IHRoZSBkaWZmZXJlbnQgcG9pbnRlciBtb2RlcyB0byBzZWUgd2hpY2gKICAgICAgICAgICAgICAgICAgICAgICBvbmUgZ2l2ZXMgdGhlIGJlc3QgcmVzcG9uc2UgZm9yIHlvdXIgdXNhZ2UsIGl0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgY29udmVuaWVudCB0byB1c2UgdGhlIHJlbW90ZSBjb250cm9sIGZ1bmN0aW9uLCBmb3IKICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlICJ4MTF2bmMgLVIgcG06NCIgb3IgdGhlIHRjbC90ayBndWkgKFR1bmluZyAtPgogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfbW9kZSAtPiBuKS4KCi1pbnB1dF9za2lwIG4gICAgICAgICAgRm9yIHRoZSBwb2ludGVyIGhhbmRsaW5nIHdoZW4gbm9uLXRocmVhZGVkOiB0cnkgdG8KICAgICAgICAgICAgICAgICAgICAgICByZWFkIG4gdXNlciBpbnB1dCBldmVudHMgYmVmb3JlIHNjYW5uaW5nIGRpc3BsYXkuIG4gPCAwCiAgICAgICAgICAgICAgICAgICAgICAgbWVhbnMgdG8gYWN0IGFzIHRob3VnaCB0aGVyZSBpcyBhbHdheXMgdXNlciBpbnB1dC4KICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0OiAxMAoKLWFsbGlucHV0ICAgICAgICAgICAgICBIYXZlIHgxMXZuYyByZWFkIGFuZCBwcm9jZXNzIGFsbCBhdmFpbGFibGUgY2xpZW50IGlucHV0CiAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHByb2NlZWRpbmcuCgotaW5wdXRfZWFnZXJseSAgICAgICAgIFNpbWlsYXIgdG8gLWFsbGlucHV0IGJ1dCB1c2UgdGhlIGhhbmRsZUV2ZW50c0VhZ2VybHkKICAgICAgICAgICAgICAgICAgICAgICBtZWNoYW5pc20gYnVpbHQgaW50byBMaWJWTkNTZXJ2ZXIuCgotc3BlZWRzIHJkLGJ3LGxhdCAgICAgIHgxMXZuYyB0cmllcyB0byBlc3RpbWF0ZSBzb21lIHNwZWVkIHBhcmFtZXRlcnMgdGhhdAogICAgICAgICAgICAgICAgICAgICAgIGFyZSB1c2VkIHRvIG9wdGltaXplIHNjaGVkdWxpbmcgKGUuZy4gLXBvaW50ZXJfbW9kZQogICAgICAgICAgICAgICAgICAgICAgIDQsIC13aXJlZnJhbWUsIC1zY3JvbGxjb3B5cmVjdCkgYW5kIG90aGVyIHRoaW5ncy4KICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIC1zcGVlZHMgb3B0aW9uIHRvIHNldCB0aGVzZSBtYW51YWxseS4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgdHJpcGxlICJyZCxidyxsYXQiIGNvcnJlc3BvbmRzIHRvIHZpZGVvIGgvdwogICAgICAgICAgICAgICAgICAgICAgIHJlYWQgcmF0ZSBpbiBNQi9zZWMsIG5ldHdvcmsgYmFuZHdpZHRoIHRvIGNsaWVudHMgaW4KICAgICAgICAgICAgICAgICAgICAgICBLQi9zZWMsIGFuZCBuZXR3b3JrIGxhdGVuY3kgdG8gY2xpZW50cyBpbiBtaWxsaXNlY29uZHMsCiAgICAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LiAgSWYgYSB2YWx1ZSBpcyBsZWZ0IGJsYW5rLCBlLmcuICItc3BlZWRzCiAgICAgICAgICAgICAgICAgICAgICAgLDEwMCwxNSIsIHRoZW4gdGhlIGludGVybmFsIHNjaGVtZSBpcyB1c2VkIHRvIGVzdGltYXRlCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGVtcHR5IHZhbHVlKHMpLgoKICAgICAgICAgICAgICAgICAgICAgICBUeXBpY2FsIFBDIHZpZGVvIGNhcmRzIGhhdmUgcmVhZCByYXRlcyBvZiA1LTEwIE1CL3NlYy4KICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgZnJhbWVidWZmZXIgaXMgaW4gbWFpbiBtZW1vcnkgaW5zdGVhZCBvZiB2aWRlbwogICAgICAgICAgICAgICAgICAgICAgIGgvdyAoZS5nLiBTdW5SYXksIHNoYWRvd2ZiLCBkdW1teSBkcml2ZXIsIFh2ZmIpLCB0aGUKICAgICAgICAgICAgICAgICAgICAgICByZWFkIHJhdGUgbWF5IGJlIG11Y2ggZmFzdGVyLiAgIngxMXBlcmYgLWdldGltYWdlNTAwIgogICAgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIGdldCBhIGxvd2VyIGJvdW5kIChyZW1lbWJlciB0byBmYWN0b3IKICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgYnl0ZXMgcGVyIHBpeGVsKS4gIEl0IGlzIHVwIHRvIHlvdSB0byBlc3RpbWF0ZQogICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZXR3b3JrIGJhbmR3aXRoIGFuZCBsYXRlbmN5IHRvIGNsaWVudHMuICBGb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgbGF0ZW5jeSB0aGUgcGluZygxKSBjb21tYW5kIGNhbiBiZSB1c2VkLgoKICAgICAgICAgICAgICAgICAgICAgICBGb3IgY29udmVuaWVuY2UgdGhlcmUgYXJlIHNvbWUgYWxpYXNlcyBwcm92aWRlZCwKICAgICAgICAgICAgICAgICAgICAgICBlLmcuICItc3BlZWRzIG1vZGVtIi4gIFRoZSBhbGlhc2VzIGFyZTogIm1vZGVtIiBmb3IKICAgICAgICAgICAgICAgICAgICAgICA2LDQsMjAwOyAiZHNsIiBmb3IgNiwxMDAsNTA7IGFuZCAibGFuIiBmb3IgNiw1MDAwLDEKCi13bWR0IHN0cmluZyAgICAgICAgICAgRm9yIHNvbWUgZmVhdHVyZXMsIGUuZy4gLXdpcmVmcmFtZSBhbmQgLXNjcm9sbGNvcHlyZWN0LAogICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBoYXMgdG8gd29yayBhcm91bmQgaXNzdWVzIGZvciBjZXJ0YWluIHdpbmRvdwogICAgICAgICAgICAgICAgICAgICAgIG1hbmFnZXJzIG9yIGRlc2t0b3BzIChjdXJyZW50bHkga2RlIGFuZCB4ZmNlKS4KICAgICAgICAgICAgICAgICAgICAgICBCeSBkZWZhdWx0IGl0IHRyaWVzIHRvIGd1ZXNzIHdoaWNoIG9uZSwgYnV0IGl0IGNhbgogICAgICAgICAgICAgICAgICAgICAgIGd1ZXNzIGluY29ycmVjdGx5LiAgVXNlIHRoaXMgb3B0aW9uIHRvIGluZGljYXRlIHdoaWNoCiAgICAgICAgICAgICAgICAgICAgICAgd20vZHQuICAic3RyaW5nIiBjYW4gYmUgImdub21lIiwgImtkZSIsICJjZGUiLAogICAgICAgICAgICAgICAgICAgICAgICJ4ZmNlIiwgb3IgInJvb3QiIChjbGFzc2ljIFggd20pLiAgQW55dGhpbmcgZWxzZQogICAgICAgICAgICAgICAgICAgICAgIGlzIGludGVycHJldGVkIGFzICJyb290Ii4KCi1kZWJ1Z19wb2ludGVyICAgICAgICAgUHJpbnQgZGVidWdnaW5nIG91dHB1dCBmb3IgZXZlcnkgcG9pbnRlciBldmVudC4KLWRlYnVnX2tleWJvYXJkICAgICAgICBQcmludCBkZWJ1Z2dpbmcgb3V0cHV0IGZvciBldmVyeSBrZXlib2FyZCBldmVudC4KICAgICAgICAgICAgICAgICAgICAgICBTYW1lIGFzIC1kcCBhbmQgLWRrLCByZXNwZWN0aXZlbHkuICBVc2UgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgICAgICB0aW1lcyBmb3IgbW9yZSBvdXRwdXQuCgotZGVmZXIgdGltZSAgICAgICAgICAgIFRpbWUgaW4gbXMgdG8gZGVsYXkgc2VuZGluZyB1cGRhdGVzIHRvIGNvbm5lY3RlZCBjbGllbnRzCiAgICAgICAgICAgICAgICAgICAgICAgKGRlZmVyVXBkYXRlVGltZSkgIERlZmF1bHQ6IDIwCgotd2FpdCB0aW1lICAgICAgICAgICAgIFRpbWUgaW4gbXMgdG8gcGF1c2UgYmV0d2VlbiBzY3JlZW4gcG9sbHMuICBVc2VkIHRvIGN1dAogICAgICAgICAgICAgICAgICAgICAgIGRvd24gb24gbG9hZC4gIERlZmF1bHQ6IDIwCgotZXh0cmFfZmJ1ciBuICAgICAgICAgIFBlcmZvcm0gZXh0cmEgRnJhbWVCdWZmZXJVcGRhdGVSZXF1ZXN0cyBjaGVja3MgdG8KICAgICAgICAgICAgICAgICAgICAgICB0cnkgdG8gYmUgaW4gYmV0dGVyIHN5bmMgd2l0aCB0aGUgY2xpZW50J3MgcmVxdWVzdHMuCiAgICAgICAgICAgICAgICAgICAgICAgV2hhdCB0aGlzIGRvZXMgaXMgcGVyZm9ybSBleHRyYSBwb2xscyBvZiB0aGUgY2xpZW50CiAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0IGF0IGNyaXRpY2FsIHRpbWVzIChiZWZvcmUgJy1kZWZlcicgYW5kICctd2FpdCcKICAgICAgICAgICAgICAgICAgICAgICBjYWxscy4pICBUaGUgZGVmYXVsdCBpcyBuPTEuICBTZXQgdG8gYSBsYXJnZXIgbnVtYmVyIHRvCiAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0IG1vcmUgY2hlY2tzIG9yIHNldCB0byBuPTAgdG8gZGlzYWJsZS4gIEEgZG93bnNpZGUKICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGVzZSBleHRyYSBjYWxscyBpcyB0aGF0IG1vcmUgbW91c2UgaW5wdXQgbWF5IGJlCiAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIHRoYW4gZGVzaXJlZC4KCi13YWl0X3VpIGZhY3RvciAgICAgICAgRmFjdG9yIGJ5IHdoaWNoIHRvIGN1dCB0aGUgLXdhaXQgdGltZSBpZiB0aGVyZQogICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHJlY2VudCB1c2VyIGlucHV0IChwb2ludGVyIG9yIGtleWJvYXJkKS4KICAgICAgICAgICAgICAgICAgICAgICBJbXByb3ZlcyByZXNwb25zZSwgYnV0IGluY3JlYXNlcyB0aGUgbG9hZCB3aGVuZXZlciB5b3UKICAgICAgICAgICAgICAgICAgICAgICBhcmUgbW92aW5nIHRoZSBtb3VzZSBvciB0eXBpbmcuICBEZWZhdWx0OiAyLjAwCi1zZXRkZWZlciBuICAgICAgICAgICAgV2hlbiB0aGUgLXdhaXRfdWkgbWVjaGFuaXNtIGN1dHMgZG93biB0aGUgd2FpdCB0aW1lIG1zLAogICAgICAgICAgICAgICAgICAgICAgIHNldCB0aGUgZGVmZXIgdGltZSB0byB0aGUgc2FtZSBtcyB2YWx1ZS4gbj0xIHRvIGVuYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAwIHRvIGRpc2FibGUsIGFuZCAtMSB0byBzZXQgZGVmZXIgdG8gMCAobm8gZGVsYXkpLgogICAgICAgICAgICAgICAgICAgICAgIFNpbWlsYXJseSwgMiBhbmQgLTIgaW5kaWNhdGUgJ3VyZ2VudF91cGRhdGUnIG1vZGUgc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCB0byBwdXNoIHRoZSB1cGRhdGVzIGV2ZW4gc29vbmVyLiAgRGVmYXVsdDogMQotbm93YWl0X2JvZyAgICAgICAgICAgIERvIG5vdCBkZXRlY3QgaWYgdGhlIHNjcmVlbiBwb2xsaW5nIGlzICJib2dnaW5nIGRvd24iCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNsZWVwIG1vcmUuICBTb21lIGFjdGl2aXRpZXMgd2l0aCBubyB1c2VyIGlucHV0IGNhbgogICAgICAgICAgICAgICAgICAgICAgIHNsb3cgdGhpbmdzIGRvd24gYSBsb3Q6IGNvbnNpZGVyIGEgbGFyZ2UgdGVybWluYWwgd2luZG93CiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIGxvbmcgYnVpbGQgcnVubmluZyBpbiBpdCBjb250aW51b3VzbHkgc3RyZWFtaW5nCiAgICAgICAgICAgICAgICAgICAgICAgdGV4dCBvdXRwdXQuICBCeSBkZWZhdWx0IHgxMXZuYyB3aWxsIHRyeSB0byBkZXRlY3QgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICgzIHNjcmVlbiBwb2xscyBpbiBhIHJvdyBlYWNoIGxvbmdlciB0aGFuIDAuMjUgc2VjIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICBubyB1c2VyIGlucHV0KSwgYW5kIHNsZWVwIHVwIHRvIDEuNSBzZWNzIHRvIGxldCB0aGluZ3MKICAgICAgICAgICAgICAgICAgICAgICAiY2F0Y2ggdXAiLiAgVXNlIHRoaXMgb3B0aW9uIHRvIGRpc2FibGUgdGhhdCBkZXRlY3Rpb24uCi1zbG93X2ZiIHRpbWUgICAgICAgICAgRmxvYXRpbmcgcG9pbnQgdGltZSBpbiBzZWNvbmRzIHRvIGRlbGF5IGFsbCBzY3JlZW4KICAgICAgICAgICAgICAgICAgICAgICBwb2xsaW5nLiAgRm9yIHNwZWNpYWwgcHVycG9zZSB1c2FnZSB3aGVyZSBhIGxvdyBmcmFtZQogICAgICAgICAgICAgICAgICAgICAgIHJhdGUgaXMgYWNjZXB0YWJsZSBhbmQgZGVzaXJhYmxlLCBidXQgeW91IHdhbnQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgdXNlciBpbnB1dCBwcm9jZXNzZWQgYXQgdGhlIG5vcm1hbCByYXRlIHNvIHlvdSBjYW5ub3QKICAgICAgICAgICAgICAgICAgICAgICB1c2UgLXdhaXQuCi14cmVmcmVzaCB0aW1lICAgICAgICAgRmxvYXRpbmcgcG9pbnQgdGltZSBpbiBzZWNvbmRzIHRvIGluZGljYXRlIGhvdyBvZnRlbiB0bwogICAgICAgICAgICAgICAgICAgICAgIGRvIHRoZSBlcXVpdmFsZW50IG9mIHhyZWZyZXNoKDEpIHRvIGZvcmNlIGFsbCB3aW5kb3dzCiAgICAgICAgICAgICAgICAgICAgICAgKGluIHRoZSB2aWV3YWJsZSBhcmVhIGlmIC1pZCwgLXNpZCwgb3IgLWNsaXAgaXMgdXNlZCkKICAgICAgICAgICAgICAgICAgICAgICB0byByZXBhaW50IHRoZW1zZWx2ZXMuICBVc2UgdGhpcyBvbmx5IGlmIGFwcGxpY2F0aW9ucwogICAgICAgICAgICAgICAgICAgICAgIG1pc2JlaGF2ZSBieSBub3QgcmVwYWludGluZyB0aGVtc2VsdmVzIHByb3Blcmx5LgogICAgICAgICAgICAgICAgICAgICAgIFNlZSBhbHNvIC1ub3hkYW1hZ2UuCi1uYXAgICAgICAgICAgICAgICAgICAgTW9uaXRvciBhY3Rpdml0eSBhbmQgaWYgaXQgaXMgbG93IHRha2UgbG9uZ2VyIG5hcHMKLW5vbmFwICAgICAgICAgICAgICAgICBiZXR3ZWVuIHNjcmVlbiBwb2xscyB0byByZWFsbHkgY3V0IGRvd24gbG9hZCB3aGVuIGlkbGUuCiAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogdGFrZSBuYXBzCi1zYiB0aW1lICAgICAgICAgICAgICAgVGltZSBpbiBzZWNvbmRzIGFmdGVyIE5PIGFjdGl2aXR5IChlLmcuIHNjcmVlbiBibGFuaykKICAgICAgICAgICAgICAgICAgICAgICB0byByZWFsbHkgdGhyb3R0bGUgZG93biB0aGUgc2NyZWVuIHBvbGxzIChpLmUuIHNsZWVwCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFib3V0IDEuNSBzZWNzKS4gVXNlIDAgdG8gZGlzYWJsZS4gIERlZmF1bHQ6IDYwCiAgICAgICAgICAgICAgICAgICAgICAgU2V0IHRoZSBlbnYuIHZhci4gWDExVk5DX1NCX0ZBQ1RPUiB0byBzY2FsZSBpdC4KCi1yZWFkdGltZW91dCBuICAgICAgICAgU2V0IExpYlZOQ1NlcnZlciByZmJNYXhDbGllbnRXYWl0IHRvIG4gc2Vjb25kcy4gT24KICAgICAgICAgICAgICAgICAgICAgICBzbG93IGxpbmtzIHRoYXQgdGFrZSBhIGxvbmcgdGltZSB0byBwYWludCB0aGUgZmlyc3QKICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW4gTGliVk5DU2VydmVyIG1heSBoaXQgdGhlIHRpbWVvdXQgYW5kIGRyb3AgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi4gIERlZmF1bHQ6IDIwIHNlY29uZHMuCi1waW5nIG4gICAgICAgICAgICAgICAgU2VuZCBhIDF4MSBmcmFtZWJ1ZmZlciB1cGRhdGUgdG8gYWxsIGNsaWVudHMgZXZlcnkgbgogICAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgKGUuZy4gdG8gdHJ5IHRvIGtlZXAgYSBuZXR3b3JrIGNvbm5lY3Rpb24gYWxpdmUpCgotbm9mYnBtICAgICAgICAgICAgICAgIElmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgdGhlIEZCUE0gKEZyYW1lIEJ1ZmZlciBQb3dlcgotZmJwbSAgICAgICAgICAgICAgICAgIE1hbmFnZW1lbnQpIGV4dGVuc2lvbiAoaS5lLiBzb21lIFN1biBzeXN0ZW1zKSwgdGhlbgogICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnQgdGhlIHZpZGVvIGgvdyBmcm9tIGdvaW5nIGludG8gYSByZWR1Y2VkIHBvd2VyCiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgd2hlbiBWTkMgY2xpZW50cyBhcmUgY29ubmVjdGVkLgoKICAgICAgICAgICAgICAgICAgICAgICBGQlBNIGNhcGFibGUgdmlkZW8gaC93IHNhdmUgZW5lcmd5IHdoZW4gdGhlIHdvcmtzdGF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgaXMgaWRsZSBieSBnb2luZyBpbnRvIGxvdyBwb3dlciBzdGF0ZXMgKHNpbWlsYXIgdG8gRFBNUwogICAgICAgICAgICAgICAgICAgICAgIGZvciBtb25pdG9ycykuICBUaGlzIGludGVyZmVyZXMgd2l0aCB4MTF2bmMncyBwb2xsaW5nCiAgICAgICAgICAgICAgICAgICAgICAgb2YgdGhlIGZyYW1lYnVmZmVyIGRhdGEuCgogICAgICAgICAgICAgICAgICAgICAgICItbm9mYnBtIiBtZWFucyBwcmV2ZW50IEZCUE0gbG93IHBvd2VyIHN0YXRlcyB3aGVuZXZlcgogICAgICAgICAgICAgICAgICAgICAgIFZOQyBjbGllbnRzIGFyZSBjb25uZWN0ZWQsIHdoaWxlICItZmJwbSIgbWVhbnMgdG8gbm90CiAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvciB0aGUgRkJQTSBzdGF0ZSBhdCBhbGwuICBTZWUgdGhlIHhzZXQoMSkgbWFucGFnZQogICAgICAgICAgICAgICAgICAgICAgIGZvciBkZXRhaWxzLiAgLW5vZmJwbSBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgYXMgcnVubmluZwogICAgICAgICAgICAgICAgICAgICAgICJ4c2V0IGZicG0gZm9yY2Ugb24iIHBlcmlvZGljYWxseS4gIERlZmF1bHQ6IC1mYnBtCgotbm9kcG1zICAgICAgICAgICAgICAgIElmIHRoZSBzeXN0ZW0gc3VwcG9ydHMgdGhlIERQTVMgKERpc3BsYXkgUG93ZXIgTWFuYWdlbWVuCnQKLWRwbXMgICAgICAgICAgICAgICAgICBTaWduYWxpbmcpIGV4dGVuc2lvbiwgdGhlbiBwcmV2ZW50IHRoZSBtb25pdG9yIGZyb20KICAgICAgICAgICAgICAgICAgICAgICBnb2luZyBpbnRvIGEgcmVkdWNlZCBwb3dlciBzdGF0ZSB3aGVuIFZOQyBjbGllbnRzCiAgICAgICAgICAgICAgICAgICAgICAgYXJlIGNvbm5lY3RlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgRFBNUyByZWR1Y2VkIHBvd2VyIG1vbml0b3Igc3RhdGVzIGFyZSBhIGdvb2QgdGhpbmcKICAgICAgICAgICAgICAgICAgICAgICBhbmQgeW91IG5vcm1hbGx5IHdhbnQgdGhlIHBvd2VyIGRvd24gdG8gdGFrZSBwbGFjZQogICAgICAgICAgICAgICAgICAgICAgICh1c3VhbGx5IHgxMXZuYyBoYXMgbm8gcHJvYmxlbSBleHBvcnRpbmcgdGhlIGRpc3BsYXkgaW4KICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHN0YXRlKS4gIFlvdSBwcm9iYWJseSBvbmx5IHdhbnQgdG8gdXNlICItbm9kcG1zIgogICAgICAgICAgICAgICAgICAgICAgIHRvIHdvcmsgYXJvdW5kIHByb2JsZW1zIHdpdGggU2NyZWVuIFNhdmVycyBraWNraW5nCiAgICAgICAgICAgICAgICAgICAgICAgb24gaW4gRFBNUyBsb3cgcG93ZXIgc3RhdGVzLiAgVGhlcmUgaXMga25vd24gcHJvYmxlbQogICAgICAgICAgICAgICAgICAgICAgIHdpdGgga2Rlc2t0b3BfbG9jayBvbiBLREUgd2hlcmUgdGhlIHNjcmVlbiBzYXZlciBrZWVwcwogICAgICAgICAgICAgICAgICAgICAgIGtpY2tpbmcgaW4gZXZlcnkgdGltZSB1c2VyIGlucHV0IHN0b3BzIGZvciBhIHNlY29uZAogICAgICAgICAgICAgICAgICAgICAgIG9yIHR3by4gIFNwZWNpZnlpbmcgIi1ub2RwbXMiIHdvcmtzIGFyb3VuZCBpdC4KCiAgICAgICAgICAgICAgICAgICAgICAgIi1ub2RwbXMiIG1lYW5zIHByZXZlbnQgRFBNUyBsb3cgcG93ZXIgc3RhdGVzIHdoZW5ldmVyCiAgICAgICAgICAgICAgICAgICAgICAgVk5DIGNsaWVudHMgYXJlIGNvbm5lY3RlZCwgd2hpbGUgIi1kcG1zIiBtZWFucyB0byBub3QKICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yIHRoZSBEUE1TIHN0YXRlIGF0IGFsbC4gIFNlZSB0aGUgeHNldCgxKSBtYW5wYWdlCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGRldGFpbHMuICAtbm9kcG1zIGlzIGJhc2ljYWxseSB0aGUgc2FtZSBhcyBydW5uaW5nCiAgICAgICAgICAgICAgICAgICAgICAgInhzZXQgZHBtcyBmb3JjZSBvbiIgcGVyaW9kaWNhbGx5LiAgRGVmYXVsdDogLWRwbXMKCi1mb3JjZWRwbXMgICAgICAgICAgICAgSWYgdGhlIHN5c3RlbSBzdXBwb3J0cyB0aGUgRFBNUyAoRGlzcGxheSBQb3dlcgogICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZW1lbnQgU2lnbmFsaW5nKSBleHRlbnNpb24sIHRoZW4gdHJ5IHRvIGtlZXAgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgbW9uaXRvciBpbiBhIHBvd2VyZWQgb2ZmIHN0YXRlLiAgVGhpcyBpcyB0byBwcmV2ZW50CiAgICAgICAgICAgICAgICAgICAgICAgbm9zZXkgcGVvcGxlIGF0IHRoZSBwaHlzaWNhbCBkaXNwbGF5IGZyb20gdmlld2luZyB3aGF0CiAgICAgICAgICAgICAgICAgICAgICAgaXMgb24gdGhlIHNjcmVlbi4gIEJlIHN1cmUgdG8gbG9jayB0aGUgc2NyZWVuIGJlZm9yZQogICAgICAgICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RpbmcuCgogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIGZhciBmcm9tIGJ1bGxldCBwcm9vZiwgZS5nLiBzdXBwb3NlCiAgICAgICAgICAgICAgICAgICAgICAgc29tZW9uZSBhdHRhY2hlcyBhIG5vbi1EUE1TIG1vbml0b3IsIG9yIGxvYWRzIHRoZQogICAgICAgICAgICAgICAgICAgICAgIG1hY2hpbmUgc28gdGhhdCB0aGVyZSBpcyBhIGdhcCBvZiB0aW1lIGJlZm9yZSB4MTF2bmMKICAgICAgICAgICAgICAgICAgICAgICByZXN0b3JlcyB0aGUgcG93ZXJlZCBvZmYgc3RhdGU/ICBPbiBtYW55IG1hY2hpbmVzIGlmCiAgICAgICAgICAgICAgICAgICAgICAgaGUgZmxvb2RzIGl0IHdpdGgga2V5Ym9hcmQgYW5kIG1vdXNlIGlucHV0IGhlIGNhbiBzZWUKICAgICAgICAgICAgICAgICAgICAgICBmbGFzaGVzIG9mIHdoYXQgaXMgb24gdGhlIHNjcmVlbiBiZWZvcmUgdGhlIERQTVMgb2ZmCiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgaXMgcmVlc3RhYmxpc2hlZC4gIEZvciB0aGlzIHRvIHdvcmsgc2VjdXJlbHkKICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSB3b3VsZCBuZWVkIHRvIGJlIHN1cHBvcnQgaW4gdGhlIFggc2VydmVyIHRvIGRvCiAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBleGFjdGx5IHJhdGhlciB0aGFuIGFwcHJveGltYXRlbHkgd2l0aCBEUE1TLgoKLWNsaWVudGRwbXMgICAgICAgICAgICBBcyAtZm9yY2VkcG1zIGJ1dCBvbmx5IHdoZW4gVk5DIGNsaWVudHMgYXJlIGNvbm5lY3RlZC4KCi1ub3NlcnZlcmRwbXMgICAgICAgICAgVGhlIFVsdHJhVk5DIFNlcnZlcklucHV0IGV4dGVuc2lvbiBpcyBzdXBwb3J0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgdGhlIFZOQyB2aWV3ZXIgdG8gY2xpY2sgYSBidXR0b24gdGhhdCB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgdGhlIHNlcnZlciAoeDExdm5jKSB0byB0cnkgdG8gZGlzYWJsZSBrZXlib2FyZAogICAgICAgICAgICAgICAgICAgICAgIGFuZCBtb3VzZSBpbnB1dCBhdCB0aGUgcGh5c2ljYWwgZGlzcGxheSBhbmQgcHV0IHRoZQogICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3IgaW4gZHBtcyBwb3dlcmVkIG9mZiBzdGF0ZS4gIFVzZSB0aGlzIG9wdGlvbiB0bwogICAgICAgICAgICAgICAgICAgICAgIHNraXAgcG93ZXJpbmcgb2ZmIHRoZSBtb25pdG9yLgoKLW5vdWx0cmFleHQgICAgICAgICAgICBEaXNhYmxlIHRoZSBmb2xsb3dpbmcgVWx0cmFWTkMgZXh0ZW5zaW9uczogU2luZ2xlV2luZG93CiAgICAgICAgICAgICAgICAgICAgICAgYW5kIFNlcnZlcklucHV0LiAgVGhlIG90aGVycyBtYW5hZ2VkIGJ5IExpYlZOQ1NlcnZlcgogICAgICAgICAgICAgICAgICAgICAgICh0ZXh0Y2hhdCwgMS9uIHNjYWxpbmcsIHJmYkVuY29kaW5nVWx0cmEpIGFyZSBub3QuCgotY2hhdHdpbmRvdyAgICAgICAgICAgIFBsYWNlIGEgbG9jYWwgVWx0cmFWTkMgY2hhdCB3aW5kb3cgb24gdGhlIFgxMSBkaXNwbGF5CiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB4MTF2bmMgaXMgcG9sbGluZy4gIFRoYXQgd2F5IHRoZSBwZXJzb24gb24gdGhlIFZOQwogICAgICAgICAgICAgICAgICAgICAgIHZpZXdlci1zaWRlIGNhbiBjaGF0IHdpdGggdGhlIHBlcnNvbiBhdCB0aGUgcGh5c2ljYWwKICAgICAgICAgICAgICAgICAgICAgICBYMTEgY29uc29sZS4gKGUuZy4gaGVscGRlc2sgdy9vIHRlbGVwaG9uZSkKCiAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoaXMgdG8gd29yayB0aGUgU1NWTkMgcGFja2FnZSAodmVyc2lvbiAxLjAuMjEgb3IKICAgICAgICAgICAgICAgICAgICAgICBsYXRlcikgTVVTVCBCRSBpbnN0YWxsZWQgb24gdGhlIHN5c3RlbSB3aGVyZSB4MTF2bmMgcnVucwogICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgJ3Nzdm5jJyBjb21tYW5kIG11c3QgYmUgYXZhaWxhYmxlIGluICRQQVRILgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBzc3ZuY3ZpZXdlciBpcyB1c2VkIGFzIGEgY2hhdCB3aW5kb3cgaGVscGVyLgogICAgICAgICAgICAgICAgICAgICAgIFNlZSBodHRwOi8vd3d3LmthcmxydW5nZS5jb20veDExdm5jL3Nzdm5jLmh0bWwKCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaW1wbGllcyAnLXJmYnZlcnNpb24gMy42JyBzbyBhcyB0byB0cmljawogICAgICAgICAgICAgICAgICAgICAgIFVsdHJhVk5DIHZpZXdlcnMsIG90aGVyd2lzZSB0aGV5IGFzc3VtZSBjaGF0IGlzIG5vdAogICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZS4gIFRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgcmZidmVyc2lvbiwgcGxhY2UKICAgICAgICAgICAgICAgICAgICAgICBpdCBhZnRlciB0aGUgLWNoYXR3aW5kb3cgb3B0aW9uIG9uIHRoZSBjbWRsaW5lLgoKICAgICAgICAgICAgICAgICAgICAgICBTZWUgYWxzbyB0aGUgcmVtb3RlIGNvbnRyb2wgJ2NoYXRvbicgYW5kICdjaGF0b2ZmJwogICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbnMuICBUaGVzZSBjYW4gYWxzbyBiZSBzZXQgZnJvbSB0aGUgdGt4MTF2bmMgR1VJLgoKLW5veGRhbWFnZSAgICAgICAgICAgICBEbyBub3QgdXNlIHRoZSBYIERBTUFHRSBleHRlbnNpb24gdG8gZGV0ZWN0IGZyYW1lYnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyBldmVuIGlmIGl0IGlzIGF2YWlsYWJsZS4gIFVzZSAteGRhbWFnZSBpZiB5b3VyCiAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBpcyB0byBoYXZlIGl0IG9mZi4KCiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jJ3MgdXNlIG9mIHRoZSBEQU1BR0UgZXh0ZW5zaW9uOiAxKSBzaWduaWZpY2FudGx5CiAgICAgICAgICAgICAgICAgICAgICAgcmVkdWNlcyB0aGUgbG9hZCB3aGVuIHRoZSBzY3JlZW4gaXMgbm90IGNoYW5naW5nIG11Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIDIpIGRldGVjdHMgY2hhbmdlZCBhcmVhcyAoc21hbGwgb25lcyBieSBkZWZhdWx0KQogICAgICAgICAgICAgICAgICAgICAgIG1vcmUgcXVpY2tseS4KCiAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudGx5IHRoZSBEQU1BR0UgZXh0ZW5zaW9uIGlzIG92ZXJseSBjb25zZXJ2YXRpdmUKICAgICAgICAgICAgICAgICAgICAgICBhbmQgb2Z0ZW4gcmVwb3J0cyBsYXJnZSBhcmVhcyAoZS5nLiBhIHdob2xlIHRlcm1pbmFsCiAgICAgICAgICAgICAgICAgICAgICAgb3IgYnJvd3NlciB3aW5kb3cpIGFzIGRhbWFnZWQgZXZlbiB0aG91Z2ggdGhlIGFjdHVhbAogICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgcmVnaW9uIGlzIG11Y2ggc21hbGxlciAoc29tZXRpbWVzIGp1c3QgYSBmZXcKICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHMpLiAgU28gaGV1cmlzdGljcyB3ZXJlIGludHJvZHVjZWQgdG8gc2tpcCBsYXJnZQogICAgICAgICAgICAgICAgICAgICAgIGFyZWFzIGFuZCB1c2UgdGhlIGRhbWFnZSByZWN0YW5nbGVzIG9ubHkgYXMgImhpbnRzIgogICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgdHJhZGl0aW9uYWwgc2NhbmxpbmUgcG9sbGluZy4gIFRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgICAgICAgICAgICB0dW5pbmcgcGFyYW1ldGVycyBhcmUgaW50cm9kdWNlZCB0byBhZGp1c3QgdGhpcwogICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOgoKLXhkX2FyZWEgQSAgICAgICAgICAgICBTZXQgdGhlIGxhcmdlc3QgREFNQUdFIHJlY3RhbmdsZSBhcmVhICJBIiAoaW4KICAgICAgICAgICAgICAgICAgICAgICBwaXhlbHM6IHdpZHRoICogaGVpZ2h0KSB0byB0cnVzdCBhcyB0cnVseSBkYW1hZ2VkOgogICAgICAgICAgICAgICAgICAgICAgIHRoZSByZWN0YW5nbGUgd2lsbCBiZSBjb3BpZWQgZnJvbSB0aGUgZnJhbWVidWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAoc2xvdykgbm8gbWF0dGVyIHdoYXQuICBTZXQgdG8gemVybyB0byB0cnVzdCAqYWxsKgogICAgICAgICAgICAgICAgICAgICAgIHJlY3RhbmdsZXMuIERlZmF1bHQ6IDIwMDAwCi14ZF9tZW0gZiAgICAgICAgICAgICAgU2V0IGhvdyBsb25nIERBTUFHRSByZWN0YW5nbGVzIHNob3VsZCBiZSAicmVtZW1iZXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgImYiIGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGFuZCBpcyBpbiB1bml0cyBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBzY2FubGluZSByZXBlYXQgY3ljbGUgdGltZSAoMzIgaXRlcmF0aW9ucykuICBUaGUgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgICgxLjApIHNob3VsZCBnaXZlIG5vIHBhaW50aW5nIHByb2JsZW1zLiBJbmNyZWFzZSBpdCBpZgogICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGFyZSBwcm9ibGVtcyBvciBkZWNyZWFzZSBpdCB0byBsaXZlIG9uIHRoZSBlZGdlCiAgICAgICAgICAgICAgICAgICAgICAgKHBlcmhhcHMgdXNlZnVsIG9uIGEgc2xvdyBtYWNoaW5lKS4KCi1zaWdwaXBlIHN0cmluZyAgICAgICAgQnJva2VuIHBpcGUgKFNJR1BJUEUpIGhhbmRsaW5nLiAgInN0cmluZyIgY2FuIGJlCiAgICAgICAgICAgICAgICAgICAgICAgImlnbm9yZSIgb3IgImV4aXQiLiAgRm9yICJpZ25vcmUiIExpYlZOQ1NlcnZlcgogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgaGFuZGxlIHRoZSBhYnJ1cHQgbG9zcyBvZiBhIGNsaWVudCBhbmQgY29udGludWUsCiAgICAgICAgICAgICAgICAgICAgICAgZm9yICJleGl0IiB4MTF2bmMgd2lsbCBjbGVhbnVwIGFuZCBleGl0IGF0IHRoZSAxc3QKICAgICAgICAgICAgICAgICAgICAgICBicm9rZW4gY29ubmVjdGlvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gaXMgbm90IHJlYWxseSBuZWVkZWQgc2luY2UgTGliVk5DU2VydmVyCiAgICAgICAgICAgICAgICAgICAgICAgaXMgZG9pbmcgdGhlIGNvcnJlY3QgdGhpbmcgbm93IGZvciBxdWl0ZSBzb21lIHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgSG93ZXZlciwgZm9yIGNvbnZlbmllbmNlIHlvdSBjYW4gdXNlIGl0IHRvIGlnbm9yZSBvdGhlcgogICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbHMsIGUuZy4gIi1zaWdwaXBlIGlnbm9yZTpIVVAsSU5ULFRFUk0iIGluIGNhc2UKICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdvdWxkIGJlIHVzZWZ1bCBmb3Igc29tZSBzb3J0IG9mIGFwcGxpY2F0aW9uLgogICAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gYWxzbyBwdXQgImV4aXQ6Li4iIGluIHRoZSBsaXN0IHRvIGhhdmUgeDExdm5jCiAgICAgICAgICAgICAgICAgICAgICAgY2xlYW51cCBvbiB0aGUgbGlzdGVkIHNpZ25hbHMuICItc2lnIiBpcyBhbiBhbGlhcwogICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGlzIG9wdGlvbiBpZiB5b3UgZG9uJ3QgbGlrZSB0aGUgJ3BpcGUnLiBFeGFtcGxlOgogICAgICAgICAgICAgICAgICAgICAgIC1zaWcgaWdub3JlOklOVCxURVJNLGV4aXQ6VVNSMQoKLXRocmVhZHMgICAgICAgICAgICAgICBXaGV0aGVyIG9yIG5vdCB0byB1c2UgdGhlIHRocmVhZGVkIExpYlZOQ1NlcnZlcgotbm90aHJlYWRzICAgICAgICAgICAgIGFsZ29yaXRobSBbcmZiUnVuRXZlbnRMb29wXSBpZiBsaWJwdGhyZWFkIGlzIGF2YWlsYWJsZS4KICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIG1vZGUgbmV3IHRocmVhZHMgKG9uZSBmb3IgaW5wdXQgYW5kIG9uZQogICAgICAgICAgICAgICAgICAgICAgIGZvciBvdXRwdXQpIGFyZSBjcmVhdGVkIHRvIGhhbmRsZSBlYWNoIG5ldyBjbGllbnQuCiAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogLW5vdGhyZWFkcy4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkIHN0YWJpbGl0eSBpcyBtdWNoIGltcHJvdmVkIGluIHZlcnNpb24gMC45LjguCgogICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlIGNsaWVudHMgaW4gdGhyZWFkZWQgbW9kZSBzaG91bGQgYmUgc3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBaUkxFIGVuY29kaW5nIG9uIGFsbCBwbGF0Zm9ybXMuICBUaGUgVGlnaHQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgWmxpYiBlbmNvZGluZ3MgYXJlIGN1cnJlbnRseSBvbmx5IHN0YWJsZSBvbiBMaW51eCBmb3IKICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBjbGllbnRzLiAgQ29tcGlsZSB3aXRoIC1EVExTPV9fdGhyZWFkIGlmIHlvdXIKICAgICAgICAgICAgICAgICAgICAgICBPUyBhbmQgY29tcGlsZXIgYW5kIGxpbmtlciBzdXBwb3J0IGl0LgoKICAgICAgICAgICAgICAgICAgICAgICBGb3IgcmVzaXplcyAocmFuZHIsIGV0Yy4pIHNldCB0aGlzIGVudi4gdmFyLiB0byB0aGUgbnVtYgplcgogICAgICAgICAgICAgICAgICAgICAgIG9mIG1pbGxpc2Vjb25kcyB0byBzbGVlcDogWDExVk5DX1RIUkVBRFNfTkVXX0ZCX1NMRUVQCiAgICAgICAgICAgICAgICAgICAgICAgYXQgdmFyaW91cyBwbGFjZXMgaW4gdGhlIGRvX25ld19mYigpIGFjdGlvbi4gIFRoaXMgaXMgdG8KICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFyaW91cyBhY3Rpdml0aWVzIHNldHRsZS4gIERlZmF1bHQgaXMgYWJvdXQgNTAwbXMuCgogICAgICAgICAgICAgICAgICAgICAgIE11bHRpcGxlIGNsaWVudHMgaW4gdGhyZWFkZWQgbW9kZSBjb3VsZCB5aWVsZCBiZXR0ZXIKICAgICAgICAgICAgICAgICAgICAgICBwZXJmb3JtYW5jZSBmb3IgJ2NsYXNzLXJvb20nIGJyb2FkY2FzdGluZyB1c2FnZTsgYWxzbyBpbgogICAgICAgICAgICAgICAgICAgICAgIC1hcHBzaGFyZSBicm9hZGNhc3QgbW9kZS4gIFNlZSBhbHNvIHRoZSAtcmVmbGVjdCBvcHRpb24uCgotZnMgZiAgICAgICAgICAgICAgICAgIElmIHRoZSBmcmFjdGlvbiBvZiBjaGFuZ2VkIHRpbGVzIGluIGEgcG9sbCBpcyBncmVhdGVyCiAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBmLCB0aGUgd2hvbGUgc2NyZWVuIGlzIHVwZGF0ZWQuICBEZWZhdWx0OiAwLjc1Ci1nYXBzIG4gICAgICAgICAgICAgICAgSGV1cmlzdGljIHRvIGZpbGwgaW4gZ2FwcyBpbiByb3dzIG9yIGNvbHMgb2YgbiBvcgogICAgICAgICAgICAgICAgICAgICAgIGxlc3MgdGlsZXMuICBVc2VkIHRvIGltcHJvdmUgdGV4dCBwYWdpbmcuICBEZWZhdWx0OiA0Ci1ncm93IG4gICAgICAgICAgICAgICAgSGV1cmlzdGljIHRvIGdyb3cgaXNsYW5kcyBvZiBjaGFuZ2VkIHRpbGVzIG4gb3Igd2lkZXIKICAgICAgICAgICAgICAgICAgICAgICBieSBjaGVja2luZyB0aGUgdGlsZSBuZWFyIHRoZSBib3VuZGFyeS4gIERlZmF1bHQ6IDMKLWZ1enogbiAgICAgICAgICAgICAgICBUb2xlcmFuY2UgaW4gcGl4ZWxzIHRvIG1hcmsgYSB0aWxlcyBlZGdlcyBhcyBjaGFuZ2VkLgogICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQ6IDIKLWRlYnVnX3RpbGVzICAgICAgICAgICBQcmludCBkZWJ1Z2dpbmcgb3V0cHV0IGZvciB0aWxlcywgZmIgdXBkYXRlcywgZXRjLgoKLXNuYXBmYiAgICAgICAgICAgICAgICBJbnN0ZWFkIG9mIHBvbGxpbmcgdGhlIFggZGlzcGxheSBmcmFtZWJ1ZmZlciAoZmIpCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNoYW5nZXMsIHBlcmlvZGljYWxseSBjb3B5IGFsbCBvZiBYIGRpc3BsYXkgZmIKICAgICAgICAgICAgICAgICAgICAgICBpbnRvIG1haW4gbWVtb3J5IGFuZCBleGFtaW5lIHRoYXQgY29weSBmb3IgY2hhbmdlcy4KICAgICAgICAgICAgICAgICAgICAgICAoVGhpcyBzZXR0aW5nIGFsc28gYXBwbGllcyBmb3Igbm9uLVggLXJhd2ZiIG1vZGVzKS4KICAgICAgICAgICAgICAgICAgICAgICBVbmRlciBzb21lIGNpcmN1bXN0YW5jZXMgdGhpcyB3aWxsIGltcHJvdmUgaW50ZXJhY3RpdmUKICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwgb3IgYXQgbGVhc3QgbWFrZSB0aGluZ3MgbG9vayBzbW9vdGhlciwgYnV0IGluCiAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJzIChtb3N0ISkgaXQgd2lsbCBtYWtlIHRoZSByZXNwb25zZSB3b3JzZS4gIElmIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGgvdyBmYiBpcyBzdWNoIHRoYXQgcmVhZGluZyBzbWFsbCB0aWxlcyBpcyB2ZXJ5CiAgICAgICAgICAgICAgICAgICAgICAgc2xvdyB0aGlzIG1vZGUgY291bGQgaGVscC4gIFRvIGtlZXAgdGhlICJmcmFtZXJhdGUiCiAgICAgICAgICAgICAgICAgICAgICAgdXAgdGhlIHNjcmVlbiBzaXplIHggYnBwIGNhbm5vdCBiZSB0b28gbGFyZ2UuICBOb3RlIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICB0aGlzIG1vZGUgaXMgdmVyeSB3YXN0ZWZ1bCBvZiBtZW1vcnkgSS9PIHJlc291cmNlcwogICAgICAgICAgICAgICAgICAgICAgIChpdCBtYWtlcyBmdWxsIHNjcmVlbiBjb3BpZXMgZXZlbiBpZiBub3RoaW5nIGNoYW5nZXMpLgogICAgICAgICAgICAgICAgICAgICAgIEl0IG1heSBiZSBvZiB1c2UgaW4gdmlkZW8gY2FwdHVyZS1saWtlIGFwcGxpY2F0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICB3ZWJjYW1zLCBvciB3aGVyZSB3aW5kb3cgdGVhcmluZyBpcyBhIHByb2JsZW0uCgotcmF3ZmIgc3RyaW5nICAgICAgICAgIEluc3RlYWQgb2YgcG9sbGluZyBYLCBwb2xsIHRoZSBtZW1vcnkgb2JqZWN0IHNwZWNpZmllZAogICAgICAgICAgICAgICAgICAgICAgIGluICJzdHJpbmciLgoKICAgICAgICAgICAgICAgICAgICAgICBGb3IgZmlsZSBwb2xsaW5nLCB0byBtZW1vcnkgbWFwIG1tYXAoMikgYSBmaWxlIHVzZToKICAgICAgICAgICAgICAgICAgICAgICAibWFwOi9wYXRoL3RvL2EvZmlsZUBXeEh4QiIsIHdpdGggZnJhbWVidWZmZXIgV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgSGVpZ2h0LCBhbmQgQml0cyBwZXIgcGl4ZWwuICAibW1hcDouLi4iIGlzIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHNhbWUuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHRoZXJlIGlzIHRyb3VibGUgd2l0aCBtbWFwLCB1c2UgImZpbGU6Ly4uLiIKICAgICAgICAgICAgICAgICAgICAgICBmb3Igc2xvd2VyIGxzZWVrKDIpIGJhc2VkIHJlYWRpbmcuCgogICAgICAgICAgICAgICAgICAgICAgIFVzZSAic25hcDouLi4iIHRvIGltcGx5IC1zbmFwZmIgbW9kZSBhbmQgdGhlICJmaWxlOiIKICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3MgKHRoaXMgaXMgZm9yIHVuc2Vla2FibGUgZGV2aWNlcyB0aGF0IG9ubHkgcHJvdmlkZQogICAgICAgICAgICAgICAgICAgICAgIHRoZSBmYiBhbGwgYXQgb25jZSwgZS5nLiBhIHZpZGVvIGNhbWVyYSBwcm92aWRlcyB0aGUKICAgICAgICAgICAgICAgICAgICAgICB3aG9sZSBmcmFtZSkuCgogICAgICAgICAgICAgICAgICAgICAgIEZvciBzaGFyZWQgbWVtb3J5IHNlZ21lbnRzIHN0cmluZyBpcyBvZiB0aGUgZm9ybToKICAgICAgICAgICAgICAgICAgICAgICAic2htOk5AV3hIeEIiIHdoaWNoIHNwZWNpZmllcyBhIHNobWlkIE4gYW5kIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICBXeEh4QiBhcyBhYm92ZS4gIFNlZSBzaG1hdCgxKSBhbmQgaXBjcygxKQoKICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IHN1cHBseSBhIHR5cGUgIm1hcCIgaXMgYXNzdW1lZCBpZgogICAgICAgICAgICAgICAgICAgICAgIHRoZSBmaWxlIGV4aXN0cyAoc2VlIHRoZSBuZXh0IHBhcmFncmFwaHMgZm9yIHNvbWUKICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25zIHRvIHRoaXMuKQoKICAgICAgICAgICAgICAgICAgICAgICBJZiBzdHJpbmcgaXMgInNldHVwOmNtZCIsIHRoZW4gdGhlIGNvbW1hbmQgImNtZCIKICAgICAgICAgICAgICAgICAgICAgICBpcyBydW4gYW5kIHRoZSBmaXJzdCBsaW5lIGZyb20gaXQgaXMgcmVhZCBhbmQgdXNlZAogICAgICAgICAgICAgICAgICAgICAgIGFzICJzdHJpbmciLiAgVGhpcyBhbGxvd3MgaW5pdGlhbGl6aW5nIHRoZSBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgZGV0ZXJtaW5pbmcgV3hIeEIsIGV0Yy4gVGhlc2UgYXJlIG9mdGVuIGRvbmUgYXMgcm9vdAogICAgICAgICAgICAgICAgICAgICAgIHNvIHRha2UgY2FyZS4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0cmluZyBiZWdpbnMgd2l0aCAidmlkZW8iLCBzZWUgdGhlIFZJREVPNExJTlVYCiAgICAgICAgICAgICAgICAgICAgICAgZGlzY3Vzc2lvbiBiZWxvdyB3aGVyZSB0aGUgZGV2aWNlIG1heSBiZSBxdWVyaWVkIGZvcgogICAgICAgICAgICAgICAgICAgICAgIChhbmQgcG9zc2libHkgc2V0KSB0aGUgZnJhbWVidWZmZXIgcGFyYW1ldGVycy4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHN0cmluZyBiZWdpbnMgd2l0aCAiY29uc29sZSIsICIvZGV2L2ZiIiwKICAgICAgICAgICAgICAgICAgICAgICAiZmIiLCBvciAidnQiLCBzZWUgdGhlIExJTlVYIENPTlNPTEUgZGlzY3Vzc2lvbgogICAgICAgICAgICAgICAgICAgICAgIGJlbG93IHdoZXJlIHRoZSBmcmFtZWJ1ZmZlciBkZXZpY2UgaXMgb3BlbmVkIGFuZAogICAgICAgICAgICAgICAgICAgICAgIGtleXN0cm9rZXMgKGFuZCBwb3NzaWJseSBtb3VzZSBldmVudHMpIGFyZSBpbnNlcnRlZAogICAgICAgICAgICAgICAgICAgICAgIGludG8gdGhlIGNvbnNvbGUuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzdHJpbmcgYmVnaW5zIHdpdGggInZuYyIsIHNlZSB0aGUgVk5DIEhPU1QKICAgICAgICAgICAgICAgICAgICAgICBkaXNjdXNzaW9uIGJlbG93IHdoZXJlIHRoZSBmcmFtZWJ1ZmZlciBpcyB0YWtlbiBhcyB0aGF0CiAgICAgICAgICAgICAgICAgICAgICAgb2YgYW5vdGhlciByZW1vdGUgVk5DIHNlcnZlci4KCiAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgc3VmZml4ZXMgYXJlICI6Ui9HL0IiIGFuZCAiK08iIHRvIHNwZWNpZnkKICAgICAgICAgICAgICAgICAgICAgICByZWQsIGdyZWVuLCBhbmQgYmx1ZSBtYXNrcyAoaW4gaGV4KSBhbmQgYW4gb2Zmc2V0IGludG8KICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWVtb3J5IG9iamVjdC4gIElmIHRoZSBtYXNrcyBhcmUgbm90IHByb3ZpZGVkIHgxMXZuYwogICAgICAgICAgICAgICAgICAgICAgIGd1ZXNzZXMgdGhlbSBiYXNlZCBvbiB0aGUgYnBwIChpZiB0aGUgY29sb3JzIGxvb2sgd3JvbmcsCiAgICAgICAgICAgICAgICAgICAgICAgeW91IG5lZWQgdG8gcHJvdmlkZSB0aGUgbWFza3MuKQoKICAgICAgICAgICAgICAgICAgICAgICBBbm90aGVyIG9wdGlvbmFsIHN1ZmZpeCBpcyB0aGUgQnl0ZXMgUGVyIExpbmUgd2hpY2ggaW4KICAgICAgICAgICAgICAgICAgICAgICBzb21lIGNhc2VzIGlzIG5vdCBXeEIvOC4gIFNwZWNpZnkgaXQgYXMgV3hIeEItQlBMCiAgICAgICAgICAgICAgICAgICAgICAgZS5nLiA4MDB4NjAweDE2LTIwNDguICBUaGlzIGNvdWxkIGJlIGEgbm9ybWFsIHdpZHRoCiAgICAgICAgICAgICAgICAgICAgICAgMTAyNCBhdCAxNmJwcCBmYiwgYnV0IG9ubHkgd2lkdGggODAwIHNob3dzIHVwLgoKICAgICAgICAgICAgICAgICAgICAgICBTbyB0aGUgZnVsbCBmb3JtYXQgaXM6IG1vZGU6ZmlsZUBXeEh4QjpSL0cvQitPLUJQTAoKICAgICAgICAgICAgICAgICAgICAgICBFeGFtcGxlczoKICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIHNobToyMTAzMzc5MzNAODAweDYwMHgzMjpmZi9mZjAwL2ZmMDAwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgbWFwOi9kZXYvZmIwQDEwMjR4NzY4eDMyCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBtYXA6L3RtcC9YdmZiX3NjcmVlbjBANjQweDQ4MHg4KzMyMzIKICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIGZpbGU6L3RtcC9teS5wbm1AMjUweDIwMHgyNCszNwogICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgZmlsZTovZGV2L3VyYW5kb21AMTI4eDEyOHg4CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBzbmFwOi9kZXYvdmlkZW8wQDMyMHgyNDB4MjQgLTI0dG8zMgogICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgdmlkZW8wCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiB2aWRlbyAtcGlwZWlucHV0IFZJRAogICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgY29uc29sZQogICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgdnQyCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiB2bmM6c29tZWhvc3Q6MAoKICAgICAgICAgICAgICAgICAgICAgICAoc2VlIGlwY3MoMSkgYW5kIGZic2V0KDEpIGZvciB0aGUgZmlyc3QgdHdvIGV4YW1wbGVzKQoKICAgICAgICAgICAgICAgICAgICAgICBJbiBnZW5lcmFsIGFsbCB1c2VyIGlucHV0IGlzIGRpc2NhcmRlZCBieSBkZWZhdWx0IChzZWUKICAgICAgICAgICAgICAgICAgICAgICB0aGUgLXBpcGVpbnB1dCBvcHRpb24gZm9yIGhvdyB0byB1c2UgYSBoZWxwZXIgcHJvZ3JhbQogICAgICAgICAgICAgICAgICAgICAgIHRvIGluc2VydCkuICBNb3N0IG9mIHRoZSBYMTEgKHNjcmVlbiwga2V5Ym9hcmQsIG1vdXNlKQogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgZG8gbm90IG1ha2Ugc2Vuc2UgYW5kIG1hbnkgd2lsbCBjYXVzZSB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB0byBjcmFzaCwgc28gcGxlYXNlIHRoaW5rIHR3aWNlIGJlZm9yZSBzZXR0aW5nIG9yCiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdpbmcgdGhlbSBpbiBhIHJ1bm5pbmcgeDExdm5jLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgRE8gTk9UIHdhbnQgeDExdm5jIHRvIGNsb3NlIHRoZSBYIERJU1BMQVkgaW4KICAgICAgICAgICAgICAgICAgICAgICByYXdmYiBtb2RlLCBwcmVwZW5kIGEgIisiIGUuZy4gK2ZpbGU6L2Rldi9mYjAuLi4KICAgICAgICAgICAgICAgICAgICAgICBLZWVwaW5nIHRoZSBkaXNwbGF5IG9wZW4gZW5hYmxlcyB0aGUgZGVmYXVsdAogICAgICAgICAgICAgICAgICAgICAgIHJlbW90ZS1jb250cm9sIGNoYW5uZWwsIHdoaWNoIGNvdWxkIGJlIHVzZWZ1bC4KICAgICAgICAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCBpZiB5b3Ugc3BlY2lmeSAtbm92aWV3b25seSwgdGhlbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBtb3VzZSBhbmQga2V5Ym9hcmQgaW5wdXQgYXJlIFNUSUxMIHNlbnQgdG8gdGhlIFgKICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5LCB0aGlzIHVzYWdlIHNob3VsZCBiZSB2ZXJ5IHJhcmUsIGkuZS4gZG9pbmcKICAgICAgICAgICAgICAgICAgICAgICBzb21ldGhpbmcgc3RyYW5nZSB3aXRoIC9kZXYvZmIwLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgZGV2aWNlIGlzIG5vdCAic2Vla2FibGUiIChlLmcuIHdlYmNhbSkgdHJ5CiAgICAgICAgICAgICAgICAgICAgICAgcmVhZGluZyBpdCBhbGwgYXQgb25jZSBpbiBmdWxsIHNuYXBzIHZpYSB0aGUgInNuYXA6IgogICAgICAgICAgICAgICAgICAgICAgIG1vZGUgKG5vdGU6IHRoaXMgaXMgYSByZXNvdXJjZSBob2cpLiAgSWYgeW91IGFyZSB1c2luZwogICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IG9yIG1hcDogQU5EIHRoZSBkZXZpY2UgbmVlZHMgdG8gYmUgcmVvcGVuZWQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgKmV2ZXJ5KiBzbmFwZmIgc25hcHNob3QsIHNldCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGU6CiAgICAgICAgICAgICAgICAgICAgICAgU05BUEZCX1JBV0ZCX1JFU0VUPTEgYXMgd2VsbC4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgeDExdm5jIHRvIGR5bmFtaWNhbGx5IHRyYW5zZm9ybSBhIDI0YnBwCiAgICAgICAgICAgICAgICAgICAgICAgcmF3ZmIgdG8gMzJicHAgKG5vdGUgdGhhdCB0aGlzIHdpbGwgYmUgc2xvd2VyKSBhbHNvCiAgICAgICAgICAgICAgICAgICAgICAgc3VwcGx5IHRoZSAtMjR0bzMyIG9wdGlvbi4gIFRoaXMgd291bGQgYmUgdXNlZnVsIGZvciwKICAgICAgICAgICAgICAgICAgICAgICBzYXksIGEgdmlkZW8gY2FtZXJhIHRoYXQgZGVsaXZlcnMgdGhlIHBpeGVsIGRhdGEgYXMKICAgICAgICAgICAgICAgICAgICAgICAyNGJwcCBwYWNrZWQgUkdCLiAgVGhpcyBpcyB0aGUgZGVmYXVsdCB1bmRlciAidmlkZW8iCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZSBpZiB0aGUgYnBwIGlzIDI0LgoKICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxseSB0aGUgYml0cyBwZXIgcGl4ZWwsIEIsIGlzIDgsIDE2LCBvciAzMiAob3IKICAgICAgICAgICAgICAgICAgICAgICByYXJlbHkgMjQpLCBob3dldmVyIHRoZXJlIGlzIGFsc28gc29tZSBzdXBwb3J0IGZvcgogICAgICAgICAgICAgICAgICAgICAgIEIgPCA4IChlLmcuIG9sZCBncmFwaGljcyBkaXNwbGF5cyA0IGJwcCBvciAxIGJwcCkuCiAgICAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlIHlvdSBjZXJ0YWlubHkgbXVzdCBzdXBwbHkgdGhlIG1hc2tzIGFzCiAgICAgICAgICAgICAgICAgICAgICAgd2VsbDogV3hIeEI6Ui9HL0IuICBUaGUgcGl4ZWxzIHdpbGwgYmUgcGFkZGVkIG91dCB0bwogICAgICAgICAgICAgICAgICAgICAgIDggYnBwIHVzaW5nIGRlcHRoIDggdHJ1ZWNvbG9yLiAgVGhlIHNjaGVtZSBjdXJyZW50bHkKICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCB3b3JrIHdpdGggc25hcCBmYiAoYXNrIGlmIGludGVyZXN0ZWQuKSBCPTEKICAgICAgICAgICAgICAgICAgICAgICBtb25vY2hyb21lIGV4YW1wbGU6IGZpbGU6L2Rldi91cmFuZG9tQDEyOHgxMjh4MToxLzEvMQogICAgICAgICAgICAgICAgICAgICAgIFNvbWUgb3RoZXIgbGlrZSB0aGlzIGFyZSAxMjh4MTI4eDI6My8zLzMgMTI4eDEyOHg0OjcvNy83CgogICAgICAgICAgICAgICAgICAgICAgIEZvciBCIDwgOCBmcmFtZWJ1ZmZlcnMgeW91IGNhbiBhbHNvIHNldCB0aGUgZW52LiB2YXIKICAgICAgICAgICAgICAgICAgICAgICBSQVdGQl9DR0E9MSB0byB0cnkgYSBDR0EgbWFwcGluZyBmb3IgQj00IChlLmcuIGxpbnV4CiAgICAgICAgICAgICAgICAgICAgICAgdmdhMTZmYiBkcml2ZXIuKSAgTm90ZSB3aXRoIGxvdyBicHAgYW5kL29yIHJlc29sdXRpb24KICAgICAgICAgICAgICAgICAgICAgICBWR0EgYW5kIFZHQTE2IG1vZGVzIG9uIHRoZSBMaW51eCBjb25zb2xlIG9uZSdzIGF0dGVtcHQKICAgICAgICAgICAgICAgICAgICAgICB0byBleHBvcnQgdGhlbSB2aWEgeDExdm5jIGNhbiBvZnRlbiBiZSB0aHdhcnRlZCBkdWUgdG8KICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWFsIGNvbG9yIHBhbGV0dGVzLCBwaXhlbCBwYWNraW5ncywgYW5kIGV2ZW4gdmlkZW8KICAgICAgICAgICAgICAgICAgICAgICBwYWludGluZyBidWZmZXJpbmcuICBPVE9ILCBvZnRlbiBleHBlcmltZW50aW5nIHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgUkdCIG1hc2tzIGNhbiB5aWVsZCBzb21ldGhpbmcgcmVjb2duaXphYmxlLgoKICAgICAgICAgICAgICAgICAgICAgICBWSURFTzRMSU5VWDogb24gTGludXggc29tZSBhdHRlbXB0IGlzIG1hZGUgdG8gaGFuZGxlCiAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8gZGV2aWNlcyAod2ViY2FtcyBvciBUViB0dW5lcnMpIGF1dG9tYXRpY2FsbHkuCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGlkZWEgaXMgdGhlIFd4SHhCIHdpbGwgYmUgZXh0cmFjdGVkIGZyb20gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlIGl0c2VsZi4gIFNvIGlmIHlvdSBkbyBub3Qgc3VwcGx5ICJAV3hIeEIuLi4KICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHgxMXZuYyB3aWxsIHRyeSB0byBkZXRlcm1pbmUgdGhlbS4gIEl0IGZpcnN0CiAgICAgICAgICAgICAgICAgICAgICAgdHJpZXMgdGhlIHY0bCBBUEkgaWYgdGhhdCBzdXBwb3J0IGhhcyBiZWVuIGNvbXBpbGVkIGluLgogICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSBpdCB3aWxsIHJ1biB0aGUgdjRsLWluZm8oMSkgZXh0ZXJuYWwgcHJvZ3JhbQogICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGF2YWlsYWJsZS4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHNpbXBsZXN0IGV4YW1wbGVzIGFyZSAiLXJhd2ZiIHZpZGVvIiBhbmQgIi1yYXdmYgogICAgICAgICAgICAgICAgICAgICAgIHZpZGVvMSIgd2hpY2ggaW1wbHkgdGhlIGRldmljZSBmaWxlIC9kZXYvdmlkZW8gYW5kCiAgICAgICAgICAgICAgICAgICAgICAgL2Rldi92aWRlbzEsIHJlc3BlY3RpdmVseS4gIFlvdSBjYW4gYWxzbyBzdXBwbHkgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgL2RldiBpZiB5b3UgbGlrZSwgZS5nLiAiLXJhd2ZiIC9kZXYvdmlkZW8wIgoKICAgICAgICAgICAgICAgICAgICAgICBTaW5jZSB0aGUgdmlkZW8gY2FwdHVyZSBkZXZpY2UgZnJhbWVidWZmZXIgdXN1YWxseQogICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgY29udGludW91c2x5IChlLmcuIGJyaWdodG5lc3MgZmx1Y3R1YXRpb25zKSwKICAgICAgICAgICAgICAgICAgICAgICB5b3UgbWF5IHdhbnQgdG8gdXNlIHRoZSAtd2FpdCwgLXNsb3dfZmIsIG9yIC1kZWZlcgogICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgdG8gbG93ZXIgdGhlICJmcmFtZXJhdGUiIHRvIGN1dCBkb3duIG9uCiAgICAgICAgICAgICAgICAgICAgICAgbmV0d29yayBWTkMgdHJhZmZpYy4KCiAgICAgICAgICAgICAgICAgICAgICAgQSBtb3JlIHNvcGhpc3RpY2F0ZWQgdmlkZW8gZGV2aWNlIHNjaGVtZSBhbGxvd3MKICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXppbmcgdGhlIGRldmljZSdzIHNldHRpbmdzIHVzaW5nOgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgLXJhd2ZiIHZpZGVvOjxzZXR0aW5ncz4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHByZWZpeCBjb3VsZCBhbHNvIGJlLCBhcyBhYm92ZSwgZS5nLiAidmlkZW8xOiIgdG8KICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoZSBkZXZpY2UgZmlsZS4gIFRoZSB2NGwgQVBJIG11c3QgYmUgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgdG8gd29yay4gIE90aGVyd2lzZSwgeW91IHdpbGwgbmVlZCB0byB0cnkKICAgICAgICAgICAgICAgICAgICAgICB0byBpbml0aWFsaXplIHRoZSBkZXZpY2Ugd2l0aCBhbiBleHRlcm5hbCBwcm9ncmFtLAogICAgICAgICAgICAgICAgICAgICAgIGUuZy4geGF3dHYsIHNwY2F2aWV3LCBhbmQgaG9wZSB0aGV5IHBlcnNpc3Qgd2hlbiB4MTF2bmMKICAgICAgICAgICAgICAgICAgICAgICByZS1vcGVucyB0aGUgZGV2aWNlLgoKICAgICAgICAgICAgICAgICAgICAgICA8c2V0dGluZ3M+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Yga2V5PXZhbHVlIHBhaXJzLgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZXZpY2UncyBicmlnaHRuZXNzLCBjb2xvciwgY29udHJhc3QsIGFuZCBodWUgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgYmUgc2V0IHRvIHBlcmNlbnRhZ2VzLCBlLmcuIGJyPTgwLGNvPTUwLGNuPTQ0LGh1PTYwLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGV2aWNlIGZpbGVuYW1lIGNhbiBiZSBzZXQgdG9vIGlmIG5lZWRlZCAoaWYgaXQKICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBzdGFydCB3aXRoICJ2aWRlbyIpLCBlLmcuIGZuPS9kZXYvcWNhbS4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHdpZHRoLCBoZWlnaHQgYW5kIGJwcCBvZiB0aGUgZnJhbWVidWZmZXIgY2FuIGJlCiAgICAgICAgICAgICAgICAgICAgICAgc2V0IHZpYSwgZS5nLiwgdz0xNjAsaD0xMjAsYnBwPTE2LgoKICAgICAgICAgICAgICAgICAgICAgICBSZWxhdGVkIHRvIHRoZSBicHAgYWJvdmUsIHRoZSBwaXhlbCBmb3JtYXQgY2FuIGJlIHNldAogICAgICAgICAgICAgICAgICAgICAgIHZpYSB0aGUgZm10PVhYWCwgd2hlcmUgWFhYIGNhbiBiZSBvbmUgb2Y6IEdSRVksIEhJMjQwLAogICAgICAgICAgICAgICAgICAgICAgIFJHQjU1NSwgUkdCNTY1LCBSR0IyNCwgYW5kIFJHQjMyICh3aXRoIGJwcCA4LCA4LCAxNiwgMTYsCiAgICAgICAgICAgICAgICAgICAgICAgMjQsIGFuZCAzMiByZXNwZWN0aXZlbHkpLiAgU2VlIGh0dHA6Ly93d3cubGludXh0di5vcmcKICAgICAgICAgICAgICAgICAgICAgICBmb3IgbW9yZSBpbmZvIChWNEwgYXBpKS4KCiAgICAgICAgICAgICAgICAgICAgICAgRm9yIFRWL3JmIHR1bmVyIGNhcmRzIG9uZSBjYW4gc2V0IHRoZSB0dW5pbmcgbW9kZQogICAgICAgICAgICAgICAgICAgICAgIHZpYSB0dW49WFhYIHdoZXJlIFhYWCBjYW4gYmUgb25lIG9mIFBBTCwgTlRTQywgU0VDQU0sCiAgICAgICAgICAgICAgICAgICAgICAgb3IgQVVUTy4KCiAgICAgICAgICAgICAgICAgICAgICAgT25lIGNhbiBzd2l0Y2ggdGhlIGlucHV0IGNoYW5uZWwgYnkgdGhlIGlucD1YWFggc2V0dGluZywKICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBYWFggaXMgdGhlIG5hbWUgb2YgdGhlIGlucHV0IGNoYW5uZWwgKFRlbGV2aXNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9zaXRlMSwgUy1WaWRlbywgZXRjKS4gIFVzZSB0aGUgbmFtZSB0aGF0IGlzIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgdGhhdCBpcyBwcmludGVkIGF0IHN0YXJ0dXAuCgogICAgICAgICAgICAgICAgICAgICAgIEZvciBpbnB1dCBjaGFubmVscyB3aXRoIHR1bmVycyAoZS5nLiBUZWxldmlzaW9uKSBvbmUKICAgICAgICAgICAgICAgICAgICAgICBjYW4gY2hhbmdlIHdoaWNoIHN0YXRpb24gaXMgc2VsZWN0ZWQgYnkgdGhlIHN0YT1YWFgKICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5nLiAgWFhYIGlzIHRoZSBzdGF0aW9uIG51bWJlci4gIEN1cnJlbnRseSBvbmx5CiAgICAgICAgICAgICAgICAgICAgICAgdGhlIG50c2MtY2FibGUtdXMgKFVTIGNhYmxlKSBjaGFubmVscyBhcmUgYnVpbHQgaW50bwogICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYy4gIFNlZSB0aGUgLWZyZXF0YWIgb3B0aW9uIGJlbG93IHRvIHN1cHBseSBvbmUKICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHhhd3R2LiBJZiBYWFggaXMgZ3JlYXRlciB0aGFuIDUwMCwgdGhlbiBpdCBpcwogICAgICAgICAgICAgICAgICAgICAgIGludGVycHJldGVkIGFzIGEgcmF3IGZyZXF1ZW5jeSBpbiBLSHouCgogICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6CgogICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiB2aWRlbzpicj04MCx3PTMyMCxoPTI0MCxmbXQ9UkdCMzIsdHVuPU5UU0Msc3RhPTQ3CgogICAgICAgICAgICAgICAgICAgICAgIG9uZSBtaWdodCBuZWVkIHRvIGFkZCBpbnA9VGVsZXZpc2lvbiB0b28gZm9yIHRoZSBpbnB1dAogICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWwgdG8gYmUgVFYgaWYgdGhlIGNhcmQgZG9lc24ndCBjb21lIHVwIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGF0IG9uZS4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IG5vdCBhbGwgdmlkZW8gY2FwdHVyZSBkZXZpY2VzIHdpbGwgc3VwcG9ydAogICAgICAgICAgICAgICAgICAgICAgIGFsbCBvZiB0aGUgYWJvdmUgc2V0dGluZ3MuCgogICAgICAgICAgICAgICAgICAgICAgIFNlZSB0aGUgLXBpcGVpbnB1dCBWSUQgb3B0aW9uIGJlbG93IGZvciBhIHdheSB0byBjb250cm9sCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNldHRpbmdzIHRocm91Z2ggdGhlIFZOQyBWaWV3ZXIgdmlhIGtleXN0cm9rZXMuCiAgICAgICAgICAgICAgICAgICAgICAgQXMgYSBzaG9ydGN1dCwgaWYgdGhlIHN0cmluZyBiZWdpbnMgIlZpZGVvLi4iIGluc3RlYWQKICAgICAgICAgICAgICAgICAgICAgICBvZiAidmlkZW8uLiIgdGhlbiAtcGlwZWlucHV0IFZJRCBpcyBpbXBsaWVkLgoKICAgICAgICAgICAgICAgICAgICAgICBBcyBhYm92ZSwgaWYgeW91IHNwZWNpZnkgYSAiQFd4SHhCLi4uIiBhZnRlciB0aGUKICAgICAgICAgICAgICAgICAgICAgICA8c2V0dGluZ3M+IHN0cmluZyB0aGV5IGFyZSB1c2VkIHZlcmJhdGltOiB0aGUgZGV2aWNlCiAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHF1ZXJpZWQgZm9yIHRoZSBjdXJyZW50IHZhbHVlcy4gIE90aGVyd2lzZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2Ugd2lsbCBiZSBxdWVyaWVkLgoKICAgICAgICAgICAgICAgICAgICAgICBMSU5VWCBDT05TT0xFOiAgVGhlIGZvbGxvd2luZyBkZXNjcmliZXMgc29tZSB3YXlzIHRvCiAgICAgICAgICAgICAgICAgICAgICAgdmlldyBhbmQgcG9zc2libHkgaW50ZXJhY3Qgd2l0aCB0aGUgTGludXggdGV4dC9ncmFwaGljcwogICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUgKGkuZS4gbm90IFgxMSBYRnJlZTg2L1hvcmcpCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGU6IElmIHRoZSBMaWJWTkNTZXJ2ZXIgTGludXhWTkMgcHJvZ3JhbSBpcyBvbiB5b3VyCiAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtIHlvdSBtYXkgd2FudCB0byB1c2UgdGhhdCBpbnN0ZWFkIG9mIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgYmVjYXVzZSBpdCB3aWxsIGJlIGZhc3RlciBhbmQgbW9yZSBhY2N1cmF0ZQogICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgTGludXggdGV4dCBjb25zb2xlIGFuZCBpbmNsdWRlcyBtb3VzZSBzdXBwb3J0LgogICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGlzLCBob3dldmVyLCB0aGUgYmFzaWMgTGludXhWTkMgZnVuY3Rpb25hbGl0eSBpbgogICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBpZiB5b3UgcmVwbGFjZSAiY29uc29sZSIgd2l0aCAidnQiIGluIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGV4YW1wbGVzIGJlbG93LgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgcmF3ZmIgc3RyaW5nIGJlZ2lucyB3aXRoICJjb25zb2xlIiB0aGUKICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciBkZXZpY2UgL2Rldi9mYjAgaXMgb3BlbmVkIGFuZCAvZGV2L3R0eTAgaXMKICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQgdG9vLiAgVGhlIGxhdHRlciBpcyB1c2VkIHRvIGluamVjdCBrZXlzdHJva2VzCiAgICAgICAgICAgICAgICAgICAgICAgKG5vdCBhbGwgYXJlIHN1cHBvcnRlZCwgYnV0IHRoZSBiYXNpYyBvbmVzIGFyZSkuCiAgICAgICAgICAgICAgICAgICAgICAgWW91IHdpbGwgbmVlZCB0byBiZSByb290IHRvIGluamVjdCBrZXlzdHJva2VzLCBidXQKICAgICAgICAgICAgICAgICAgICAgICBub3QgbmVjZXNzYXJpbHkgdG8gb3BlbiAvZGV2L2ZiMC4gIC9kZXYvdHR5MCByZWZlcnMgdG8KICAgICAgICAgICAgICAgICAgICAgICB0aGUgYWN0aXZlIFZULCB0byBpbmRpY2F0ZSBvbmUgZXhwbGljaXRseSwgdXNlLCBlLmcuLAogICAgICAgICAgICAgICAgICAgICAgICJjb25zb2xlMiIgZm9yIC9kZXYvdHR5MiwgZXRjLiBieSBpbmRpY2F0aW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIFZUIG51bWJlci4KCiAgICAgICAgICAgICAgICAgICAgICAgRm9yIHRoZSBMaW51eCBmcmFtZWJ1ZmZlciBkZXZpY2UsIC9kZXYvZmIwLCAoZmIxLAogICAgICAgICAgICAgICAgICAgICAgIGV0YykgdG8gYmUgZW5hYmxlZCB0aGUgYXBwcm9wcmlhdGUga2VybmVsIGRyaXZlcnMgbXVzdAogICAgICAgICAgICAgICAgICAgICAgIGJlIGxvYWRlZC4gIEUuZy4gdmVzYWZiIG9yIHZnYTE2ZmIgYW5kIGFsc28gYnkgc2V0dGluZwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBib290IHBhcmFtZXRlciB2Z2E9MHgzMDEgKG9yIDB4MzE0LCAweDMxNywgZXRjLikKICAgICAgICAgICAgICAgICAgICAgICAoVGhlIHZnYT0uLi4gbWV0aG9kIGlzIHRoZSBwcmVmZXJyZWQgd2F5OyBzZXQgeW91cgogICAgICAgICAgICAgICAgICAgICAgIG1hY2hpbmVzIHVwIHRoYXQgd2F5LikgIE90aGVyd2lzZSB0aGVyZSB3aWxsIGJlIGEKICAgICAgICAgICAgICAgICAgICAgICAnTm8gc3VjaCBkZXZpY2UnIGVycm9yLiAgWW91IGNhbiBhbHNvIGxvYWQgYSBMaW51eAogICAgICAgICAgICAgICAgICAgICAgIGZyYW1lYnVmZmVyIGRyaXZlciBzcGVjaWZpYyB0byB5b3VyIG1ha2Ugb2YgdmlkZW8gY2FyZAogICAgICAgICAgICAgICAgICAgICAgIGZvciBtb3JlIGZ1bmN0aW9uYWxpdHkuICBPbmNlIHRoZSBtYWNoaW5lIGlzIGJvb3RlZCBvbmUKICAgICAgICAgICAgICAgICAgICAgICBjYW4gb2Z0ZW4gJ21vZHByb2JlJyB0aGUgZmIgZHJpdmVyIGFzIHJvb3QgdG8gb2J0YWluCiAgICAgICAgICAgICAgICAgICAgICAgYSBmcmFtZWJ1ZmZlciBkZXZpY2UuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBjYW5ub3QgZ2V0IC9kZXYvZmIwIHdvcmtpbmcgb24gTGludXgsIHRyeQogICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSBMaW51eFZOQyBlbXVsYXRpb24gbW9kZSBieSAiLXJhd2ZiIHZ0TiIKICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSBOID0gMSwgLi4uIDYgaXMgdGhlIExpbnV4IFZpcnR1YWwgVGVybWluYWwgKGFrYQogICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgY29uc29sZSkgeW91IHdpc2ggdG8gdmlldywgZS5nLiAiLXJhd2ZiIHZ0MiIuCiAgICAgICAgICAgICAgICAgICAgICAgVW5saWtlIC9kZXYvZmIgbW9kZSwgaXQgbmVlZCBub3QgYmUgdGhlIGFjdGl2ZSBWaXJ0dWFsCiAgICAgICAgICAgICAgICAgICAgICAgVGVybWluYWwuICBOb3RlIHRoYXQgdGhpcyBtb2RlIGNhbiBvbmx5IHNob3cgdGV4dCBhbmQKICAgICAgICAgICAgICAgICAgICAgICBub3QgZ3JhcGhpY3MuICB4MTF2bmMgcG9sbHMgdGhlIHRleHQgaW4gL2Rldi92Y3NhTgoKICAgICAgICAgICAgICAgICAgICAgICBTZXQgdGhlIGVudi4gdmFyLiBSQVdGQl9WQ1NBX0JXPTEgdG8gZGlzYWJsZSBjb2xvcnMgaW4KICAgICAgICAgICAgICAgICAgICAgICB0aGUgInZ0TiIgbW9kZSAoaS5lLiBibGFjayBhbmQgd2hpdGUgb25seS4pICBJZiB5b3UKICAgICAgICAgICAgICAgICAgICAgICBkbyBub3QgcHJlZmVyIHRoZSBkZWZhdWx0IDE2YnBwIHNldCBSQVdGQl9WQ1NBX0JQUCB0bwogICAgICAgICAgICAgICAgICAgICAgIDggb3IgMzIuICBJZiB5b3UgbmVlZCB0byB0d2VhayB0aGUgcmF3ZmIgcGFyYW1ldGVycyBieQogICAgICAgICAgICAgICAgICAgICAgIHVzaW5nIHRoZSAnY29uc29sZV9ndWVzcycgc3RyaW5nIHByaW50ZWQgYXQgc3RhcnR1cCwKICAgICAgICAgICAgICAgICAgICAgICBiZSBzdXJlIHRvIGluZGljYXRlIHRoZSBzbmFwOiBtZXRob2QuCgogICAgICAgICAgICAgICAgICAgICAgIHVpbnB1dDogSWYgdGhlIExpbnV4IHZlcnNpb24gYXBwZWFycyB0byBiZSAyLjYKICAgICAgICAgICAgICAgICAgICAgICBvciBsYXRlciBhbmQgdGhlICJ1aW5wdXQiIG1vZHVsZSBhcHBlYXJzIHRvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudCAobW9kcHJvYmUgdWlucHV0KSwgdGhlbiB0aGUgdWlucHV0IG1ldGhvZAogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mIC9kZXYvdHR5Ti4gIHVpbnB1dCBhbGxvd3MKICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRpb24gb2YgQk9USCBrZXlzdHJva2VzIGFuZCBtb3VzZSBpbnB1dCBhbmQgc28gaXQKICAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWQgd2hlbiBhY2Nlc3NpbmcgZ3JhcGhpY2FsIChlLmcuIFFULWVtYmVkZGVkKQogICAgICAgICAgICAgICAgICAgICAgIGxpbnV4IGNvbnNvbGUgYXBwcy4gIEl0IGFsc28gcHJvdmlkZXMgbW9yZSBhY2N1cmF0ZQogICAgICAgICAgICAgICAgICAgICAgIGtleXN0cm9rZSBpbnNlcnRpb24uICBTZWUgLXBpcGVpbnB1dCBVSU5QVVQgYmVsb3cgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzIG1vZGU7IHlvdSB3aWxsIGhhdmUgdG8gdXNlCiAgICAgICAgICAgICAgICAgICAgICAgLXBpcGVpbnB1dCBpZiB5b3Ugd2FudCB0byB0d2VhayBhbnkgVUlOUFVUIHBhcmFtZXRlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgWW91IG1heSBhbHNvIHdhbnQgdG8gYWxzbyB1c2UgdGhlIC1ub2RyYWdnaW5nIGFuZAogICAgICAgICAgICAgICAgICAgICAgIC1jdXJzb3Igbm9uZSBvcHRpb25zLiAgVXNlICJjb25zb2xlMCIsIGV0YyAgb3IKICAgICAgICAgICAgICAgICAgICAgICAtcGlwZWlucHV0IENPTlNPTEUgdG8gZm9yY2UgdGhlIC9kZXYvdHR5TiBtZXRob2QuCgogICAgICAgICAgICAgICAgICAgICAgIE5vdGUgeW91IGNhbiBjaGFuZ2UgdGhlIExpbnV4IFZUIHJlbW90ZWx5IHVzaW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGNodnQoMSkgY29tbWFuZCB0byBtYWtlIHRoZSBvbmUgeW91IHdhbnQgYmUgdGhlIGFjdGl2ZQogICAgICAgICAgICAgICAgICAgICAgIG9uZSAoZS5nLiAnY2h2dCAzJykuICBTb21ldGltZXMgc3dpdGNoaW5nIG91dCBhbmQgYmFjawogICAgICAgICAgICAgICAgICAgICAgIGNvcnJlY3RzIHRoZSBmcmFtZWJ1ZmZlcidzIGdyYXBoaWNzIHN0YXRlLiAgRm9yIHRoZQogICAgICAgICAgICAgICAgICAgICAgICItcmF3ZmIgdnROIiBtb2RlIHRoZXJlIGlzIG5vIG5lZWQgdG8gc3dpdGNoIHRoZSBWVCdzLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyBza2lwIGlucHV0IGluamVjdGluZyBlbnRpcmVseSB1c2UgImNvbnNvbGV4IgogICAgICAgICAgICAgICAgICAgICAgIG9yICJ2dHgiLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgc3RyaW5nICIvZGV2L2ZiMCIgKDEsIGV0Yy4pIGNhbiBiZSB1c2VkIGluc3RlYWQKICAgICAgICAgICAgICAgICAgICAgICBvZiAiY29uc29sZSIuICBUaGlzIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQKICAgICAgICAgICAgICAgICAgICAgICBmcmFtZWJ1ZmZlciBkZXZpY2UsIGUuZy4gL2Rldi9mYjEuICBBcyBhIHNob3J0Y3V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgICIvZGV2LyIgY2FuIGJlIGRyb3BwZWQuICBJZiB0aGUgbmFtZSBpcyBzb21ldGhpbmcKICAgICAgICAgICAgICAgICAgICAgICBub25zdGFuZGFyZCwgdXNlICJjb25zb2xlOi9kZXYvZm9vZmIiCgogICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgd2FudCB4MTF2bmMgdG8gZ3Vlc3MgdGhlIGZyYW1lYnVmZmVyJ3MKICAgICAgICAgICAgICAgICAgICAgICBXeEh4QiBhbmQgbWFza3MgYXV0b21hdGljYWxseSAoc29tZXRpbWVzIHRoZSBrZXJuZWwKICAgICAgICAgICAgICAgICAgICAgICBnaXZlcyBpbmNvcnJlY3QgaW5mb3JtYXRpb24pLCBzcGVjaWZ5IHRoZW0gd2l0aCBhIEBXeEh4QgogICAgICAgICAgICAgICAgICAgICAgIChhbmQgb3B0aW9uYWwgOlIvRy9CIG1hc2tzKSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCgogICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgY29uc29sZQogICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgL2Rldi9mYjAgICAgICAgICAgIChzYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgY29uc29sZTMgICAgICAgICAgIChmb3JjZSAvZGV2L3R0eTMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBjb25zb2xleCAgICAgICAgICAgKG5vIGtleXN0cm9rZXMgb3IgbW91c2UpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBjb25zb2xlOi9kZXYvbm9uc3RkCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1yYXdmYiBjb25zb2xlIC1waXBlaW5wdXQgVUlOUFVUOmFjY2VsPTQuMAogICAgICAgICAgICAgICAgICAgICAgICAgICAtcmF3ZmIgdnQzICAgICAgICAgICAgICAgICgvZGV2L3R0eTMgdy9vIC9kZXYvZmIwKQoKICAgICAgICAgICAgICAgICAgICAgICBWTkMgSE9TVDogaWYgdGhlIC1yYXdmYiBzdHJpbmcgaXMgb2YgdGhlIGZvcm0KICAgICAgICAgICAgICAgICAgICAgICAidm5jOmhvc3Q6TiIgdGhlbiB0aGUgVk5DIGRpc3BsYXkgIk4iIG9uIHRoZSByZW1vdGUKICAgICAgICAgICAgICAgICAgICAgICBWTkMgc2VydmVyICJob3N0IiBpcyBjb25uZWN0ZWQgdG8gKGkuZS4geDExdm5jIGFjdHMgYXMKICAgICAgICAgICAgICAgICAgICAgICBhIFZOQyBjbGllbnQgaXRzZWxmKSBhbmQgdGhhdCBmcmFtZWJ1ZmZlciBpcyBleHBvcnRlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBtb2RlIGlzIHJlYWxseSBvbmx5IG9mIHVzZSBpZiB5b3UgYXJlIHRyeWluZwogICAgICAgICAgICAgICAgICAgICAgIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgaW4gdGhlIGNhc2Ugb2YgbWFueSAoZS5nLiA+CiAgICAgICAgICAgICAgICAgICAgICAgMTApIHNpbXVsdGFuZW91cyBWTkMgdmlld2VycywgYW5kIHlvdSB0cnkgYSBkaXZpZGUKICAgICAgICAgICAgICAgICAgICAgICBhbmQgY29ucXVlciBzY2hlbWUgdG8gcmVkdWNlIGJhbmR3aWR0aCBhbmQgaW1wcm92ZQogICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNpdmVuZXNzLiAgKEhvd2V2ZXIsIGFub3RoZXIgdXNlciBmb3VuZCB0aGlzIG1vZGUKICAgICAgICAgICAgICAgICAgICAgICB1c2VmdWwgdG8gZXhwb3J0IGEgZGVtbyBkaXNwbGF5IHRocm91Z2ggYSBzbG93IGxpbms6CiAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBtdWx0aXBsZSBkZW1vIHZpZXdlcnMgY29ubmVjdGVkIHRvIHRoZSByZWZsZWN0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIG9uIHRoZSBmYXN0IHNpZGUgb2YgdGhlIGxpbmssIGFuZCBzbyBhdm9pZGVkCiAgICAgICAgICAgICAgICAgICAgICAgYWxsIG9mIHRoZSBkZW1vIHZpZXdlcnMgZ29pbmcgdGhyb3VnaCB0aGUgc2xvdyBsaW5rLikKCiAgICAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIGlmIHRoZXJlIHdpbGwgYmUgNjQgc2ltdWx0YW5lb3VzIFZOQwogICAgICAgICAgICAgICAgICAgICAgIHZpZXdlcnMgdGhpcyBjYW4gbGVhZCB0byBhIGxvdCBvZiByZWR1bmRhbnQgVk5DIHRyYWZmaWMKICAgICAgICAgICAgICAgICAgICAgICB0byBhbmQgZnJvbSB0aGUgc2VydmVyIGhvc3Q6TiwgZXh0cmEgQ1BVIHVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbGwgdmlld2VycyByZXNwb25zZSBjYW4gYmUgcmVkdWNlZCBieSBoYXZpbmcKICAgICAgICAgICAgICAgICAgICAgICB0byB3YWl0IGZvciB3cml0ZXMgdG8gdGhlIHNsb3dlc3QgY2xpZW50IHRvIGZpbmlzaC4KICAgICAgICAgICAgICAgICAgICAgICBIb3dldmVyLCBpZiB5b3Ugc2V0IHVwIDggcmVmbGVjdG9ycy9yZXBlYXRlcnMgc3RhcnRlZAogICAgICAgICAgICAgICAgICAgICAgIHdpdGggb3B0aW9uIC1yYXdmYiB2bmM6aG9zdDpOLCB0aGVuIHRoZXJlIGFyZSBvbmx5CiAgICAgICAgICAgICAgICAgICAgICAgOCBjb25uZWN0aW9ucyB0byBob3N0Ok4uICBFYWNoIHJlcGVhdGVyIHRoZW4gaGFuZGxlcwogICAgICAgICAgICAgICAgICAgICAgIDggdm5jIHZpZXdlciBjb25uZWN0aW9ucyB0aGVyZWJ5IHNwcmVhZGluZyB0aGUgbG9hZAogICAgICAgICAgICAgICAgICAgICAgIGFyb3VuZC4gIEluIGNsYXNzcm9vbSBicm9hZGNhc3QgdXNhZ2UsIHRyeSB0byBwdXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZXJzIG9uIGRpZmZlcmVudCBzd2l0Y2hlcy4gIFRoaXMgbW9kZSBpcyB0aGUgc2FtZQogICAgICAgICAgICAgICAgICAgICAgIGFzIC1yZWZsZWN0IGhvc3Q6Ti4gIFJlcGxhY2UgImhvc3Q6TiIgYnkgImxpc3RlbiIKICAgICAgICAgICAgICAgICAgICAgICBvciAibGlzdGVuOnBvcnQiIGZvciBhIHJldmVyc2UgY29ubmVjdGlvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmFsbCBwZXJmb3JtYW5jZSB3aWxsIG5vdCBiZSBhcyBnb29kIGFzIGEgc2luZ2xlCiAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0IGNvbm5lY3Rpb24gYmVjYXVzZSwgYW1vbmcgb3RoZXIgdGhpbmdzLAogICAgICAgICAgICAgICAgICAgICAgIHRoZXJlIGlzIGFuIGFkZGl0aW9uYWwgbGV2ZWwgb2YgZnJhbWVidWZmZXIgcG9sbGluZwogICAgICAgICAgICAgICAgICAgICAgIGFuZCBwb2ludGVyIG1vdGlvbiBjYW4gc3RpbGwgaW5kdWNlIG1hbnkgY2hhbmdlcyBwZXIKICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgdGhhdCBtdXN0IGJlIHByb3BhZ2F0ZWQuICBUaXA6IGlmIHRoZSByZW1vdGUgVk5DCiAgICAgICAgICAgICAgICAgICAgICAgaXMgeDExdm5jIGRvaW5nIHdpcmVmcmFtaW5nLCBvciBhbiBYIGRpc3BsYXkgdGhhdCBkb2VzCiAgICAgICAgICAgICAgICAgICAgICAgd2lyZWZyYW1pbmcgdGhhdCBnaXZlcyBtdWNoIGJldHRlciByZXNwb25zZSB0aGFuIG9wYXF1ZQogICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdyBkcmFnZ2luZy4gIENvbnNpZGVyIHRoZSAtbm9kcmFnZ2luZyBvcHRpb24gaWYKICAgICAgICAgICAgICAgICAgICAgICB0aGUgcHJvYmxlbSBpcyBzZXZlcmUuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBlbnYuIHZhci4gWDExVk5DX1JFRkxFQ1RfUEFTU1dPUkQgY2FuIGJlIHNldCB0bwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBwYXNzd29yZCBuZWVkZWQgdG8gbG9nIGludG8gdGhlIHZuYyBob3N0IHNlcnZlciwgb3IKICAgICAgICAgICAgICAgICAgICAgICB0byAiZmlsZTpwYXRoX3RvX2ZpbGUiIHRvIGluZGljYXRlIGEgZmlsZSBjb250YWluaW5nCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHBhc3N3b3JkIGFzIGl0cyBmaXJzdCBsaW5lLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyBzZXQgdGhlIHBpeGVsIGZvcm1hdCB0aGF0IHgxMXZuYyByZXF1ZXN0cyBhcyBhIFZOQwogICAgICAgICAgICAgICAgICAgICAgIENMSUVOVCBzZXQgdGhlIGVudi4gdmFyczogWDExVk5DX1JFRkxFQ1RfYml0c1BlclNhbXBsZQogICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19SRUZMRUNUX3NhbXBsZXNQZXJQaXhlbCwgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgWDExVk5DX1JFRkxFQ1RfYnl0ZXNQZXJQaXhlbDsgdGhlIGRlZmF1bHRzIGFyZSA4LCAzLCA0LgogICAgICAgICAgICAgICAgICAgICAgIDIsIDMsIDEgd291bGQgZ2l2ZSBhIGxvdyBjb2xvciBtb2RlLiAgU2VlIHRoZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgICAgICAgIHJmYkdldENsaWVudCgpIGluIGxpYnZuY2NsaWVudCBmb3IgbW9yZSBpbmZvLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgVk5DIEhPU1QgbW9kZSBpbXBsaWVzIC1zaGFyZWQuICBVc2UgLW5vc2hhcmVkIGFzCiAgICAgICAgICAgICAgICAgICAgICAgYSBzdWJzZXF1ZW50IGNtZGxpbmUgb3B0aW9uIHRvIGRpc2FibGUgc2hhcmluZy4KCi1mcmVxdGFiIGZpbGUgICAgICAgICAgRm9yIHVzZSB3aXRoICItcmF3ZmIgdmlkZW8iIGZvciBUViB0dW5lciBkZXZpY2VzIHRvCiAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmeSBzdGF0aW9uIGZyZXF1ZW5jaWVzLiAgSW5zdGVhZCBvZiB1c2luZyB0aGUgYnVpbHQKICAgICAgICAgICAgICAgICAgICAgICBpbiBudHNjLWNhYmxlLXVzIG1hcHBpbmcgb2Ygc3RhdGlvbiBudW1iZXIgdG8gZnJlcXVlbmN5LAogICAgICAgICAgICAgICAgICAgICAgIHVzZSB0aGUgZGF0YSBpbiBmaWxlLiAgRm9yIHN0YXRpb25zIHRoYXQgYXJlIG5vdAogICAgICAgICAgICAgICAgICAgICAgIG51bWVyaWMsIGUuZy4gU0UyMCwgdGhleSBhcmUgcGxhY2VkIGFib3ZlIHRoZSBoaWdoZXN0CiAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyZWQgc3RhdGlvbiBpbiB0aGUgb3JkZXIgdGhleSBhcmUgZm91bmQuICBFeGFtcGxlOgogICAgICAgICAgICAgICAgICAgICAgICItZnJlcXRhYiAvdXNyL1gxMVI2L3NoYXJlL3hhd3R2L2V1cm9wZS13ZXN0Lmxpc3QiCiAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBtYWtlIHlvdXIgb3duIGZyZXF0YWIgYnkgY29weWluZyB0aGUgeGF3dHYKICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuCgotcGlwZWlucHV0IGNtZCAgICAgICAgIFRoaXMgb3B0aW9uIGxldHMgeW91IHN1cHBseSBhbiBleHRlcm5hbCBjb21tYW5kIGluCiAgICAgICAgICAgICAgICAgICAgICAgImNtZCIgdGhhdCB4MTF2bmMgd2lsbCBwaXBlIGFsbCBvZiB0aGUgdXNlciBpbnB1dAogICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyB0byBpbiBhIHNpbXBsZSBmb3JtYXQuICBJbiAtcGlwZWlucHV0IG1vZGUgYnkKICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IHgxMXZuYyB3aWxsIG5vdCBwcm9jZXNzIGFueSBvZiB0aGUgdXNlciBpbnB1dAogICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cy4gIElmIHlvdSBwcmVmaXggImNtZCIgd2l0aCAidGVlOiIgaXQgd2lsbAogICAgICAgICAgICAgICAgICAgICAgIGJvdGggc2VuZCB0aGVtIHRvIHRoZSBwaXBlIGNvbW1hbmQgYW5kIHByb2Nlc3MgdGhlbS4KICAgICAgICAgICAgICAgICAgICAgICBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0IHJ1biAiLXBpcGVpbnB1dAogICAgICAgICAgICAgICAgICAgICAgIHRlZTovYmluL2NhdCIuICBBbm90aGVyIHByZWZpeCBpcyAicmVvcGVuIiB3aGljaAogICAgICAgICAgICAgICAgICAgICAgIG1lYW5zIHRvIHJlb3BlbiBwaXBlIGlmIGl0IGV4aXRzLiAgU2VwYXJhdGUgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXhlcyB3aXRoIGNvbW1hcy4KCiAgICAgICAgICAgICAgICAgICAgICAgSW4gY29tYmluYXRpb24gd2l0aCAtcmF3ZmIgb25lIG1pZ2h0IGJlIGFibGUgdG8KICAgICAgICAgICAgICAgICAgICAgICBkbyBhbXVzaW5nIHRoaW5ncyAoZS5nLiBjb250cm9sIG5vbi1YIGRldmljZXMpLgogICAgICAgICAgICAgICAgICAgICAgIFRvIGZhY2lsaXRhdGUgdGhpcywgaWYgLXJhd2ZiIGlzIGluIGVmZmVjdCB0aGVuIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIHN0b3JlZCBpbiBYMTFWTkNfUkFXRkJfU1RSIGZvciB0aGUgcGlwZSBjb21tYW5kCiAgICAgICAgICAgICAgICAgICAgICAgdG8gdXNlIGlmIGl0IHdhbnRzLiBEbyAnZW52IHwgZ3JlcCBYMTFWTkMnIGZvciBtb3JlLgoKICAgICAgICAgICAgICAgICAgICAgICBCdWlsdC1pbiBwaXBlaW5wdXQgbW9kZXMgKG5vIGV4dGVybmFsIHByb2dyYW0gcmVxdWlyZWQpOgoKICAgICAgICAgICAgICAgICAgICAgICBJZiBjbWQgaXMgIlZJRCIgYW5kIHlvdSBhcmUgdXNpbmcgdGhlIC1yYXdmYiBmb3IgYQogICAgICAgICAgICAgICAgICAgICAgIHZpZGVvIGNhcHR1cmUgZGV2aWNlLCB0aGVuIGFuIGludGVybmFsIGxpc3Qgb2Yga2V5Ym9hcmQKICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5ncyBpcyB1c2VkIHRvIHNldCBwYXJhbWV0ZXJzIG9mIHRoZSB2aWRlby4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWFwcGluZ3MgYXJlOgoKICAgICAgICAgICAgICAgICAgICAgICAgICJCIiBhbmQgImIiIGFkanVzdCB0aGUgYnJpZ2h0bmVzcyB1cCBhbmQgZG93bi4KICAgICAgICAgICAgICAgICAgICAgICAgICJIIiBhbmQgImgiIGFkanVzdCB0aGUgaHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgIkMiIGFuZCAiYyIgYWRqdXN0IHRoZSBjb2xvdXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAiTiIgYW5kICJuIiBhZGp1c3QgdGhlIGNvbnRyYXN0LgogICAgICAgICAgICAgICAgICAgICAgICAgIlMiIGFuZCAicyIgYWRqdXN0IHRoZSBzaXplIG9mIHRoZSBjYXB0dXJlIHNjcmVlbi4KICAgICAgICAgICAgICAgICAgICAgICAgICJJIiBhbmQgImkiIGN5Y2xlIHRocm91Z2ggaW5wdXQgY2hhbm5lbHMuCiAgICAgICAgICAgICAgICAgICAgICAgICBVcCBhbmQgRG93biBhcnJvd3MgYWRqdXN0IHRoZSBzdGF0aW9uIChpZiBhIHR1bmVyKQogICAgICAgICAgICAgICAgICAgICAgICAgRjEsIEYyLCAuLi4sIEY2IHdpbGwgc3dpdGNoIHRoZSB2aWRlbyBjYXB0dXJlIHBpeGVsCiAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQgdG8gSEkyNDAsIFJHQjU2NSwgUkdCMjQsIFJHQjMyLCBSR0I1NTUsIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgR1JFWSByZXNwZWN0aXZlbHkuICBTZWUgLXJhd2ZiIHZpZGVvIGZvciBkZXRhaWxzLgoKICAgICAgICAgICAgICAgICAgICAgICBJZiBjbWQgaXMgIkNPTlNPTEUiIG9yICJDT05TT0xFbiIgd2hlcmUgbgogICAgICAgICAgICAgICAgICAgICAgIGlzIGEgTGludXggY29uc29sZSBudW1iZXIsIHRoZW4gdGhlIGxpbnV4IGNvbnNvbGUKICAgICAgICAgICAgICAgICAgICAgICBrZXlzdHJva2UgaW5zZXJ0aW9uIHRvIC9kZXYvdHR5TiAoc2VlIC1yYXdmYiBjb25zb2xlKQogICAgICAgICAgICAgICAgICAgICAgIGlzIHBlcmZvcm1lZC4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgY21kIGJlZ2lucyB3aXRoICJVSU5QVVQiIHRoZW4gdGhlIExpbnV4IHVpbnB1dAogICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZSBpcyB1c2VkIHRvIGluc2VydCBib3RoIGtleXN0cm9rZSBhbmQgbW91c2UgZXZlbnRzCiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIExpbnV4IGNvbnNvbGUgKHNlZSAtcmF3ZmIgYWJvdmUpLiAgVGhpcyB1c3VhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhlIC9kZXYvaW5wdXQvdWlucHV0IGRldmljZSBmaWxlICh5b3UgbWF5IG5lZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGUgaXQgd2l0aCAibWtub2QgL2Rldi9pbnB1dC91aW5wdXQgYyAxMCAyMjMiCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIGluc2VydCB0aGUgbW9kdWxlIHdpdGggIm1vZHByb2JlIHVpbnB1dCIuCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBVSU5QVVQgbW9kZSBjdXJyZW50bHkgb25seSBkb2VzIFVTIGtleWJvYXJkcyAoYQogICAgICAgICAgICAgICAgICAgICAgIHNjYW4gY29kZSBvcHRpb24gbWF5IGJlIGFkZGVkKSwgYW5kIG5vdCBhbGwga2V5c3ltcwogICAgICAgICAgICAgICAgICAgICAgIGFyZSBzdXBwb3J0ZWQuICBCdXQgaXQgaXMgcHJvYmFibHkgbW9yZSBhY2N1cmF0ZSB0aGFuCiAgICAgICAgICAgICAgICAgICAgICAgdGhlICJDT05TT0xFIiBtZXRob2QuCgogICAgICAgICAgICAgICAgICAgICAgIFlvdSBtYXkgd2FudCB0byB1c2UgdGhlIG9wdGlvbnMgLWN1cnNvciBub25lIGFuZAogICAgICAgICAgICAgICAgICAgICAgIC1ub2RyYWdnaW5nIGluIHRoaXMgbW9kZS4KCiAgICAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbCB0dW5pbmcgb3B0aW9ucyBtYXkgYmUgc3VwcGxpZWQgdmlhOgogICAgICAgICAgICAgICAgICAgICAgIFVJTlBVVDpvcHQxLG9wdDIsLi4uIChhIGNvbW1hIHNlcGFyYXRlZCBsaXN0KS4gSWYgYW4KICAgICAgICAgICAgICAgICAgICAgICBvcHRpb24gYmVnaW5zIHdpdGggIi8iIGl0IGlzIHRha2VuIGFzIHRoZSB1aW5wdXQKICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgZmlsZS4KCiAgICAgICAgICAgICAgICAgICAgICAgV2hpY2ggdWlucHV0IGlzIGluamVjdGVkIGNhbiBiZSBjb250cm9sbGVkIGJ5IGFuIG9wdGlvbgogICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBtYWRlIG9mIHRoZSBjaGFyYWN0ZXJzICJLIiwgIk0iLCBhbmQgIkIiCiAgICAgICAgICAgICAgICAgICAgICAgKHNlZSB0aGUgLWlucHV0IG9wdGlvbiksIGUuZy4gIktNIiBhbGxvd3Mga2V5c3Ryb2tlCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIG1vdGlvbiBidXQgbm90IGJ1dHRvbiBjbGlja3MuCgogICAgICAgICAgICAgICAgICAgICAgIEEgVUlOUFVUIG9wdGlvbiBvZiB0aGUgZm9ybTogYWNjZWw9Ziwgb3IgYWNjZWw9ZngrZnkKICAgICAgICAgICAgICAgICAgICAgICBzZXRzIHRoZSBtb3VzZSBtb3Rpb24gImFjY2VsZXJhdGlvbiIuICBUaGlzIGlzIHVzZWQKICAgICAgICAgICAgICAgICAgICAgICB0byBjb3JyZWN0IHJhdyBtb3VzZSByZWxhdGl2ZSBtb3Rpb24gaW50byBob3cgbXVjaCB0aGUKICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBjdXJzb3IgbW92ZXMgKHgxMXZuYyBoYXMgbm8gY29udHJvbCBvdmVyLAogICAgICAgICAgICAgICAgICAgICAgIG9yIGtub3dsZWRnZSBvZiBob3cgdGhlIHdpbmRvd2luZyBhcHBsaWNhdGlvbiBpbnRlcnByZXRzCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJhdyBtb3VzZSBtb3Rpb25zKS4gIFR5cGljYWxseSB0aGUgYWNjZWxlcmF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFuIFggZGlzcGxheSBpcyAyIChzZWUgeHNldCAibSIgb3B0aW9uKS4gICJmIgogICAgICAgICAgICAgICAgICAgICAgIGlzIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLCBlLmcuIDMuMC4gIFVzZSAiZngrZnkiCiAgICAgICAgICAgICAgICAgICAgICAgaWYgeW91IG5lZWQgdG8gc3VwcGx5IGRpZmZlcmVudCBjb3JyZWN0aW9ucyBmb3IgeCBhbmQgeS4KCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogdGhlIGRlZmF1bHQgYWNjZWxlcmF0aW9uIGlzIDIuMCBzaW5jZSBpdCBzZWVtcwogICAgICAgICAgICAgICAgICAgICAgIGJvdGggWCBhbmQgcXQtZW1iZWRkZWQgb2Z0ZW4gKGJ1dCBub3QgYWx3YXlzKSB1c2UKICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHZhbHVlLgoKICAgICAgICAgICAgICAgICAgICAgICBFdmVuIHdpdGggYSBjb3JyZWN0IGFjY2VsIHNldHRpbmcgdGhlIG1vdXNlIHBvc2l0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBnZXQgb3V0IG9mIHN5bmMgKHByb2JhYmx5IGR1ZSB0byBhIG1vdXNlCiAgICAgICAgICAgICAgICAgICAgICAgInRocmVzaG9sZCIgc2V0dGluZyB3aGVyZSB0aGUgYWNjZWxlcmF0aW9uIGRvZSBub3QKICAgICAgICAgICAgICAgICAgICAgICBhcHBseSwgc2V0IHhzZXQoMSkpLiAgVGhlIG9wdGlvbiByZXNldD1OIHNldHMgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIG1zIChkZWZhdWx0IDE1MCkgYWZ0ZXIgd2hpY2ggdGhlIGN1cnNvciBpcwogICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRlZCB0byBiZSByZXNldCAoYnkgZm9yY2luZyB0aGUgbW91c2UgdG8gKDAsCiAgICAgICAgICAgICAgICAgICAgICAgMCkgdmlhIHNtYWxsIGluY3JlbWVudHMgYW5kIHRoZW4gYmFjayBvdXQgdG8gKHgsIHkpCiAgICAgICAgICAgICAgICAgICAgICAgaW4gMSBqdW1wKSwgVGhpcyBjb3JyZWN0aW9uIHNlZW1zIHRvIGJlIG5lZWRlZCBidXQgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgamVya2luZXNzIG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3Igd2l0aCBtZW51cywgZXRjLgogICAgICAgICAgICAgICAgICAgICAgIFVzZSByZXNldD0wIHRvIGRpc2FibGUuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBzZXQgdGhlIGVudi4gdmFyIFgxMVZOQ19VSU5QVVRfVEhSRVNIT0xEUyB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRocmVzaD1uIG1vZGUgd2lsbCBiZSBlbmFibGVkLiAgSXQgaXMgY3VycmVudGx5CiAgICAgICAgICAgICAgICAgICAgICAgbm90IHdvcmtpbmcgd2VsbC4gIElmIHxkeHwgPD0gdGhyZXNoIGFuZCB8ZHl8IDwgdGhyZXNoCiAgICAgICAgICAgICAgICAgICAgICAgbm8gYWNjZWxlcmF0aW9uIGlzIGFwcGxpZWQuICBVc2UgInRocmVzaD0rbiIgfGR4fCArCiAgICAgICAgICAgICAgICAgICAgICAgfGR5fCA8IHRocmVzaCB0byBiZSB1c2VkIGluc3RlYWQgKFgxMT8pCgogICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6CiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1waXBlaW5wdXQgVUlOUFVUOmFjY2VsPTQuMCAtY3Vyc29yIG5vbmUKCiAgICAgICAgICAgICAgICAgICAgICAgSWYgdGhlIHVpbnB1dCBkZXZpY2UgaGFzIGFuIGFic29sdXRlIHBvaW50ZXIgKGFzIG9wcG9zZWQKICAgICAgICAgICAgICAgICAgICAgICB0byBhIG5vcm1hbCBtb3VzZSB0aGF0IGlzIGEgcmVsYXRpdmUgcG9pbnRlcikgeW91IGNhbgogICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhlIG9wdGlvbiAiYWJzIi4gIE5vdGUgdGhhdCBhIHRvdWNocGFkCiAgICAgICAgICAgICAgICAgICAgICAgb24gYSBsYXB0b3AgaXMgYW4gYWJzb2x1dGUgZGV2aWNlIHRvIHNvbWUgZGVncmVlLgogICAgICAgICAgICAgICAgICAgICAgIFRoaXMgKHVzdWFsbHkpIGF2b2lkcyBhbGwgdGhlIHByb2JsZW1zIHdpdGggbW91c2UKICAgICAgICAgICAgICAgICAgICAgICBhY2NlbGVyYXRpb24uICBJZiB4MTF2bmMgaGFzIHRyb3VibGUgZGVkdWNpbmcgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSBvZiB0aGUgZGV2aWNlLCB1c2UgImFicz1XeEgiLiAgRnVydGhlcm1vcmUsCiAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGRldmljZSBpcyBhIHRvdWNoc2NyZWVuIChhc3N1bWVkIHRvIGhhdmUgYW4KICAgICAgICAgICAgICAgICAgICAgICBhYnNvbHV0ZSBwb2ludGVyKSB1c2UgInRvdWNoIiBvciAidG91Y2g9V3hIIi4KICAgICAgICAgICAgICAgICAgICAgICBGb3IgdG91Y2hzY3JlZW5zLCB3aGVuIGEgbW91c2UgYnV0dG9uIGlzIHByZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgYSBwcmVzc3VyZSBpbmNyZWFzZSBpcyBpbmplY3RlZCwgYW5kIHdoZW4gdGhlIGJ1dHRvbgogICAgICAgICAgICAgICAgICAgICAgIGlzIHJlbGVhc2VkIGEgcHJlc3N1cmUgb2YgemVybyBpcyBpbmplY3RlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgdG91Y2ggaGFzIGJlZW4gc2V0LCB1c2UgInRvdWNoX2Fsd2F5cz0xIiB0bwogICAgICAgICAgICAgICAgICAgICAgIGluZGljYXRlIHdoZW5ldmVyIHRoZSBtb3VzZSBtb3ZlcyB3aXRoIG5vIGJ1dHRvbgogICAgICAgICAgICAgICAgICAgICAgIHByZXNzZWQsIGEgdG91Y2ggZXZlbnQgb2YgemVybyBwcmVzc3VyZSBzaG91bGQgYmUKICAgICAgICAgICAgICAgICAgICAgICBzZW50IGFueXdheS4gIEFsc28gdXNlICJidG5fdG91Y2g9MSIgdG8gaW5kaWNhdGUgYQogICAgICAgICAgICAgICAgICAgICAgIEJUTl9UT1VDSCBrZXlzdHJva2UgcHJlc3Mgb3IgcmVsZWFzZSBzaG91bGQgYmUgc2VudAogICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQgb2YgYSBwcmVzc3VyZSBjaGFuZ2UuICBTZXQgImRyYWdza2lwPW4iIHRvCiAgICAgICAgICAgICAgICAgICAgICAgc2tpcCBuIGRyYWdnZWQgbW91c2UgdG91Y2hlcyAod2l0aCBwcmVzc3VyZSBhcHBsaWVkKQogICAgICAgICAgICAgICAgICAgICAgIGJlZm9yZSBpbmplY3Rpbmcgb25lLiAgVG8gaW5kaWNhdGUgdGhlIHByZXNzdXJlIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2VudCB3aGVuIHRoZXJlIGlzIGEgYnV0dG9uIGNsaWNrIGZvciBhCiAgICAgICAgICAgICAgICAgICAgICAgdG91Y2hzY3JlZW4gZGV2aWNlLCBzcGVjaWZ5IHByZXNzdXJlPW4sIGUuZy4gbj01LiBUaGUKICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0IGlzIG49MS4KCiAgICAgICAgICAgICAgICAgICAgICAgSWYgYSB0b3VjaCBzY3JlZW4gaXMgYmVpbmcgdXNlZCAoInRvdWNoIiBhYm92ZSkKICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXQgaXMgaGF2aW5nIGl0cyBpbnB1dCBwcm9jZXNzZWQgYnkgdHNsaWIsIHlvdSBjYW4KICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZ5IHRoZSB0c2xpYiBjYWxpYnJhdGlvbiBmaWxlIHZpYSB0c2xpYl9jYWw9PGZpbGU+LgogICAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlLCB0c2xpYl9jYWw9L2V0Yy9wb2ludGVyY2FsLiAgVG8gZ2V0IGFjY3VyYXRlCiAgICAgICAgICAgICAgICAgICAgICAgb3IgZXZlbiB1c2FibGUgcG9zaXRpb25pbmcgdGhpcyBpcyByZXF1aXJlZCB3aGVuIHRzbGliCiAgICAgICAgICAgICAgICAgICAgICAgaXMgaW4gdXNlLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgTGludXggdWlucHV0IG1lY2hhbmlzbSBjYW4gYmUgYnlwYXNzZWQgYW5kIG9uZSBjYW4KICAgICAgICAgICAgICAgICAgICAgICB3cml0ZSBpbnB1dCBldmVudHMgRElSRUNUTFkgdG8gdGhlIGRldmljZXMgaW5zdGVhZC4KICAgICAgICAgICAgICAgICAgICAgICBUbyBkbyB0aGlzLCBzcGVjaWZ5IG9uZSBvciBtb3JlIG9mIHRoZSBmb2xsb3dpbmcKICAgICAgICAgICAgICAgICAgICAgICBmb3IgdGhlIGlucHV0IGNsYXNzZXM6IGRpcmVjdF9yZWw9PGRldmljZT4KICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RfYWJzPTxkZXZpY2U+IGRpcmVjdF9idG49PGRldmljZT4gb3IKICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3Rfa2V5PTxkZXZpY2U+LiAgVGhlIDxkZXZpY2U+IGZpbGUgaXMgdXN1YWxseQogICAgICAgICAgICAgICAgICAgICAgIHNvbWV0aGluZyBsaWtlIC9kZXYvaW5wdXQvZXZlbnQxIGJ1dCB5b3UgY2FuIHNwZWNpZnkKICAgICAgICAgICAgICAgICAgICAgICBhbnkgZGV2aWNlIGZpbGUgb3IgcGlwZS4gIFlvdSBtdXN0IHNwZWNpZnkgZWFjaCBvbmUKICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgYWJvdmUgY2xhc3NlcyBldmVuIGlmIHRoZXkgY29ycmVzcG9uZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICBzYW1lIGRldmljZSBmaWxlIChyZWwvYWJzIGFuZCBidG4gYXJlIG9mdGVuIHRoZSBzYW1lLikKICAgICAgICAgICAgICAgICAgICAgICBMb29rIGF0IHRoZSBmaWxlIC9wcm9jL2J1cy9pbnB1dC9kZXZpY2VzIHRvIGdldCBhbiBpZGVhCiAgICAgICAgICAgICAgICAgICAgICAgd2hhdCBpcyBhdmFpbGFibGUgYW5kIHRoZSBkZXZpY2UgZmlsZW5hbWVzLiAgTm90ZToKICAgICAgICAgICAgICAgICAgICAgICBUaGUgL2Rldi9pbnB1dC9tb3VzZSogZGV2aWNlcyBkbyBub3Qgc2VlbSB0byB3b3JrLAogICAgICAgICAgICAgICAgICAgICAgIHVzZSB0aGUgY29ycmVzcG9uZGluZyAvZGV2L2lucHV0L2V2ZW50KiBmaWxlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgICAgQW55IGlucHV0IGNsYXNzIG5vdCBkaXJlY3RseSBzcGVjaWZpZWQgYXMgYWJvdmUgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZWQgdmlhIHRoZSB1aW5wdXQgbWVjaGFuaXNtLiAgVG8gZGlzYWJsZSBjcmVhdGluZyBhCiAgICAgICAgICAgICAgICAgICAgICAgdWlucHV0IGRldmljZSAoYW5kIHRoZXJlYnkgZGlzY2FyZGluZyB1bmhhbmRsZWQgaW5wdXQpLAogICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgIm5vdWlucHV0Ii4KCiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZXM6CgogICAgICAgICAgICAgICAgICAgICAgICAgLXBpcGVpbnB1dCBVSU5QVVQ6ZGlyZWN0X2Ficz0vZGV2L2lucHV0L2V2ZW50MQoKICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHdhcyB1c2VkIG9uIGEgcXRtb2tvIE5lbyBmcmVlcnVubmVyIChhcm1lbCk6CgogICAgICAgICAgICAgICAgICAgICAgICAgLXBpcGVpbnB1dCBVSU5QVVQ6dG91Y2gsdHNsaWJfY2FsPS9ldGMvcG9pbnRlcmNhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RfYWJzPS9kZXYvaW5wdXQvZXZlbnQxLG5vdWlucHV0LGRyYWdza2lwPTQKCiAgICAgICAgICAgICAgICAgICAgICAgKHdoZXJlIHRoZSBsb25nIGxpbmUgaGFzIGJlZW4gc3BsaXQgaW50byB0d28uKQoKICAgICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHNldCB0aGUgZW52LiB2YXIgWDExVk5DX1VJTlBVVF9ERUJVRz0xIG9yIGhpZ2hlcgogICAgICAgICAgICAgICAgICAgICAgIHRvIGdldCBkZWJ1Z2dpbmcgb3V0cHV0IGZvciBVSU5QVVQgbW9kZS4KCi1tYWNub2RpbSAgICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgZGlzYWJsZSBkaW1taW5nLgotbWFjbm9zbGVlcCAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRpc2FibGUgZGlzcGxheSBzbGVlcC4KLW1hY25vc2F2ZXIgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCBkaXNhYmxlIHNjcmVlbnNhdmVyLgotbWFjbm93YWl0ICAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRvIG5vdCB3YWl0IGZvciB0aGUKICAgICAgICAgICAgICAgICAgICAgICB1c2VyIHRvIHN3aXRjaCBiYWNrIHRvIGhpcyBkaXNwbGF5LgotbWFjd2hlZWwgbiAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIHNldCB0aGUgbW91c2Ugd2hlZWwKICAgICAgICAgICAgICAgICAgICAgICBzcGVlZCB0byBuIChkZWZhdWx0IDUpLgotbWFjbm9zd2FwICAgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRvIG5vdCBzd2FwIG1vdXNlCiAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9ucyAyIGFuZCAzLgotbWFjbm9yZXNpemUgICAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIGRvIG5vdCByZXNpemUgb3IgcmVzZXQKICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnJhbWVidWZmZXIgZXZlbiBpZiBpdCBpcyBkZXRlY3RlZCB0aGF0IHRoZSBzY3JlZW4KICAgICAgICAgICAgICAgICAgICAgICByZXNvbHV0aW9uIG9yIGRlcHRoIGhhcyBjaGFuZ2VkLgotbWFjaWNvbmFuaW0gbiAgICAgICAgIEZvciB0aGUgbmF0aXZlIE1hY09TWCBzZXJ2ZXIsIHNldCBuIHRvIHRoZSBudW1iZXIKICAgICAgICAgICAgICAgICAgICAgICBvZiBtaWxsaXNlY29uZHMgdGhhdCB0aGUgd2luZG93IGljb25pZnkvZGVpY29uaWZ5CiAgICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uIHRha2VzLiAgSW4gLW5jYWNoZSBtb2RlIHRoaXMgdmFsdWUgd2lsbCBiZQogICAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gc2tpcCB0aGUgYW5pbWF0aW9uIGlmIHBvc3NpYmxlLiAoZGVmYXVsdCA0MDApCi1tYWNtZW51ICAgICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgaW4gLW5jYWNoZSBjbGllbnQtc2lkZQogICAgICAgICAgICAgICAgICAgICAgIGNhY2hpbmcgbW9kZSwgdHJ5IHRvIGNhY2hlIHB1bGwgZG93biBtZW51cyAobm90IHBlcmZlY3QKICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHRoZXkgaGF2ZSBhbmltYXRlZCBmYWRlcywgZXRjLikKLW1hY3Vza2JkICAgICAgICAgICAgICBGb3IgdGhlIG5hdGl2ZSBNYWNPU1ggc2VydmVyLCB1c2UgdGhlIG9yaWdpbmFsCiAgICAgICAgICAgICAgICAgICAgICAga2V5c3Ryb2tlIGluc2VydGlvbiBjb2RlIGJhc2VkIG9uIGEgVVMga2V5Ym9hcmQuCi1tYWNub29wZW5nbCAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgZG8gbm90IHVzZSBPcGVuR0wgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVuIGNhcHR1cmUsIGJ1dCByYXRoZXIgdXNlIHRoZSBvcmlnaW5hbCwgZGVwcmVjYXRlZAogICAgICAgICAgICAgICAgICAgICAgIHJhdyBtZW1vcnkgYWNjZXNzIG1ldGhvZDogYWRkciA9IENHRGlzcGxheUJhc2VBZGRyZXNzKCkuCi1tYWNub3Jhd2ZiICAgICAgICAgICAgRm9yIHRoZSBuYXRpdmUgTWFjT1NYIHNlcnZlciwgZGlzYWJsZSB0aGUgcmF3IG1lbW9yeQogICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Mgc2NyZWVuIGNhcHR1cmUgbWV0aG9kLgoKICAgICAgICAgICAgICAgICAgICAgICBNQUNPU1ggTk9URTogVGhlcmUgYXJlIHNvbWUgZGVwcmVjYXRlZCBNYWNPU1ggaW50ZXJmYWNlcwogICAgICAgICAgICAgICAgICAgICAgIHRvIGluamVjdCBrZXlib2FyZCBhbmQgbW91c2UgZXZlbnRzIGFuZCB0aGUgcmF3IG1lbW9yeQogICAgICAgICAgICAgICAgICAgICAgIGFjY2VzcyBtZXRob2QgaXMgZGVwcmVjYXRlZCBhcyB3ZWxsIChob3dldmVyLCBPcGVuR0wKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHByZWZlcnJlZCBpZiBhdmFpbGFibGUgYmVjYXVzZSBpdCBpcyBmYXN0ZXIuKQogICAgICAgICAgICAgICAgICAgICAgIE9uZSBjYW4gZm9yY2Ugbm90IHVzaW5nIGFueSBkZXByZWNhdGVkIGludGVyZmFjZXMgYXQKICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlIHRpbWUgYnkgc2V0dGluZyAtRFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRD0xCiAgICAgICAgICAgICAgICAgICAgICAgaW4gQ1BQRkxBR1MuICBPciB0byB0dXJuIHRoZW0gb2ZmIG9uZSBieSBvbmU6CiAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfTE9DQUxFVkVOVFM9MSwKICAgICAgICAgICAgICAgICAgICAgICAtRFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9QT1NURVZFTlRTPTEgb3IKICAgICAgICAgICAgICAgICAgICAgICAtRFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRF9GUkFNRUJVRkZFUj0xCiAgICAgICAgICAgICAgICAgICAgICAgQXQgcnVuIHRpbWUsIGZvciB0ZXN0aW5nIGFuZCB3b3JrYXJvdW5kcywgb25lIGNhbgogICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGUgdGhlbSBieSB1c2luZzoKICAgICAgICAgICAgICAgICAgICAgICAtZW52IFgxMVZOQ19NQUNPU1hfTk9fREVQUkVDQVRFRD0xCiAgICAgICAgICAgICAgICAgICAgICAgLWVudiBYMTFWTkNfTUFDT1NYX05PX0RFUFJFQ0FURURfTE9DQUxFVkVOVFM9MQogICAgICAgICAgICAgICAgICAgICAgIC1lbnYgWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX1BPU1RFVkVOVFM9MSBvcgogICAgICAgICAgICAgICAgICAgICAgIC1lbnYgWDExVk5DX01BQ09TWF9OT19ERVBSRUNBVEVEX0ZSQU1FQlVGRkVSPTEKICAgICAgICAgICAgICAgICAgICAgICBOb3RlOiBXaGVuIGRvaW5nIGVpdGhlciBvZiB0aGVzZSBmb3IgdGhlIG1vdXNlIGlucHV0CiAgICAgICAgICAgICAgICAgICAgICAgbm90IGV2ZXJ5dGhpbmcgd29ya3MgY3VycmVudGx5LCBlLmcuIGRvdWJsZSBjbGlja3MgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgd2lyZWZyYW1pbmcuICBBbHNvLCBzY3JlZW4gcmVzb2x1dGlvbiBhbmQgcGl4ZWwgZGVwdGgKICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgZGV0ZWN0ZWQgdW5sZXNzIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQgZnJhbWVidWZmZXIgaW50ZXJmYWNlcyBhcmUgYWxsb3dlZC4KCiAgICAgICAgICAgICAgICAgICAgICAgQ29udmVyc2VseSwgaWYgeW91IGFyZSBjb21waWxpbmcgb24gYW4KICAgICAgICAgICAgICAgICAgICAgICBvbGRlciBtYWNoaW5lIHRoYXQgZG9lcyBub3QgaGF2ZSBzb21lIG9mCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5ld2VyIGludGVyZmFjZXMsIHlvdSBtYXkgbmVlZCB0byBzcGVjaWZ5CiAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX05PX0NHRVZFTlRDUkVBVEVTQ1JPTExXSEVFTEVWRU5UCiAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX05PX0NHRVZFTlRDUkVBVEVNT1VTRUVWRU5UIG9yCiAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX05PX0NHRVZFTlRDUkVBVEVLRVlCT0FSREVWRU5ULiAgVXNlCiAgICAgICAgICAgICAgICAgICAgICAgLURYMTFWTkNfTUFDT1NYX1VTRV9HRVRNQUlOREVWSUNFIHRvIHJlZ2FpbiB0aGUgdmVyeQogICAgICAgICAgICAgICAgICAgICAgIG9sZCBRdWlja0RyYXcgR2V0TWFpbkRldmljZSgpIGludGVyZmFjZSAocmFyZS4uLikKCi1ndWkgW2d1aS1vcHRzXSAgICAgICAgU3RhcnQgdXAgYSBzaW1wbGUgdGNsL3RrIGd1aSBiYXNlZCBvbiB0aGUgcmVtb3RlCiAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBvcHRpb25zIC1yZW1vdGUvLXF1ZXJ5IGRlc2NyaWJlZCBiZWxvdy4KICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlcyB0aGUgIndpc2giIHByb2dyYW0gdG8gYmUgaW5zdGFsbGVkIG9uIHRoZQogICAgICAgICAgICAgICAgICAgICAgIG1hY2hpbmUuICAiZ3VpLW9wdHMiIGlzIG5vdCByZXF1aXJlZDogdGhlIGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICBpcyB0byBzdGFydCB1cCBib3RoIHRoZSBmdWxsIGd1aSBhbmQgeDExdm5jIHdpdGggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpIHNob3dpbmcgdXAgb24gdGhlIFggZGlzcGxheSBpbiB0aGUgZW52aXJvbm1lbnQKICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZSBESVNQTEFZLgoKICAgICAgICAgICAgICAgICAgICAgICAiZ3VpLW9wdHMiIGNhbiBiZSBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGl0ZW1zLgogICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSB0aGVyZSBhcmUgdGhlc2UgdHlwZXMgb2YgaXRlbXM6IDEpIGEgZ3VpCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZSwgYSAyKSBndWkgInNpbXBsaWNpdHkiLCAzKSB0aGUgWCBkaXNwbGF5IHRoZQogICAgICAgICAgICAgICAgICAgICAgIGd1aSBzaG91bGQgZGlzcGxheSBvbiwgNCkgYSAidHJheSIgb3IgImljb24iIG1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIDUpIGEgZ3VpIGdlb21ldHJ5LgoKICAgICAgICAgICAgICAgICAgICAgICAxKSBUaGUgZ3VpIG1vZGUgY2FuIGJlICJzdGFydCIsICJjb25uIiwgb3IgIndhaXQiCiAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0IiBpcyB0aGUgZGVmYXVsdCBtb2RlIGFib3ZlIGFuZCBpcyBub3QgcmVxdWlyZWQuCiAgICAgICAgICAgICAgICAgICAgICAgImNvbm4iIG1lYW5zIGRvIG5vdCBhdXRvbWF0aWNhbGx5IHN0YXJ0IHVwIHgxMXZuYywKICAgICAgICAgICAgICAgICAgICAgICBidXQgaW5zdGVhZCBqdXN0IHRyeSB0byBjb25uZWN0IHRvIGFuIGV4aXN0aW5nIHgxMXZuYwogICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuICAid2FpdCIgbWVhbnMganVzdCBzdGFydCB0aGUgZ3VpIGFuZCBub3RoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAoeW91IHdpbGwgbGF0ZXIgaW5zdHJ1Y3QgdGhlIGd1aSB0byBzdGFydCB4MTF2bmMKICAgICAgICAgICAgICAgICAgICAgICBvciBjb25uZWN0IHRvIGFuIGV4aXN0aW5nIG9uZS4pCgogICAgICAgICAgICAgICAgICAgICAgIDIpIFRoZSBndWkgc2ltcGxpY2l0eSBpcyBvZmYgYnkgZGVmYXVsdCAoYSBwb3dlci11c2VyCiAgICAgICAgICAgICAgICAgICAgICAgZ3VpIHdpdGggYWxsIG9wdGlvbnMgaXMgcHJlc2VudGVkKSBUbyBzdGFydCB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgc29tZXRoaW5nIGxlc3MgZGF1bnRpbmcgc3VwcGx5IHRoZSBzdHJpbmcgInNpbXBsZSIKICAgICAgICAgICAgICAgICAgICAgICAoImV6IiBpcyBhbiBhbGlhcyBmb3IgdGhpcykuICBPbmNlIHRoZSBndWkgaXMKICAgICAgICAgICAgICAgICAgICAgICBzdGFydGVkIHlvdSBjYW4gdG9nZ2xlIGJldHdlZW4gdGhlIHR3byB3aXRoICJNaXNjIC0+CiAgICAgICAgICAgICAgICAgICAgICAgc2ltcGxlX2d1aSIuCgogICAgICAgICAgICAgICAgICAgICAgIDMpIE5vdGUgdGhlIHBvc3NpYmxlIGNvbmZ1c2lvbiByZWdhcmRpbmcgdGhlIHBvdGVudGlhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgdHdvIGRpZmZlcmVudCBYIGRpc3BsYXlzOiB4MTF2bmMgcG9sbHMgb25lLCBidXQgeW91CiAgICAgICAgICAgICAgICAgICAgICAgbWF5IHdhbnQgdGhlIGd1aSB0byBhcHBlYXIgb24gYW5vdGhlci4gIEZvciBleGFtcGxlLCBpZgogICAgICAgICAgICAgICAgICAgICAgIHlvdSBzc2ggaW4gYW5kIHgxMXZuYyBpcyBub3QgcnVubmluZyB5ZXQgeW91IG1heSB3YW50CiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGd1aSB0byBjb21lIGJhY2sgdG8geW91IHZpYSB5b3VyIHNzaCByZWRpcmVjdGVkIFgKICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5IChlLmcuIGxvY2FsaG9zdDoxMCkuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgc3BlY2lmeSBhIGd1aSBYIGRpc3BsYXkgaW4gImd1aS1vcHRzIgogICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIERJU1BMQVkgZW52aXJvbm1lbnQgdmFyaWFibGUgYW5kIC1kaXNwbGF5CiAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uIGFyZSB0cmllZCAoaW4gdGhhdCBvcmRlcikuICBSZWdhcmRpbmcgdGhlIHgxMXZuYwogICAgICAgICAgICAgICAgICAgICAgIFggZGlzcGxheSB0aGUgZ3VpIHdpbGwgdHJ5IHRvIGNvbW11bmljYXRpb24gd2l0aCwgaXQKICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCB0cmllcyAtZGlzcGxheSBhbmQgdGhlbiBESVNQTEFZLiAgRm9yIGV4YW1wbGUsCiAgICAgICAgICAgICAgICAgICAgICAgIngxMXZuYyAtZGlzcGxheSA6MCAtZ3VpIG90aGVyaG9zdDowIiwgd2lsbCByZW1vdGUKICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIGFuIHgxMXZuYyBwb2xsaW5nIDowIGFuZCBkaXNwbGF5IHRoZSBndWkgb24KICAgICAgICAgICAgICAgICAgICAgICBvdGhlcmhvc3Q6MCBUaGUgInRyYXkvaWNvbiIgbW9kZSBiZWxvdyByZXZlcnNlcyB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgcHJlZmVyZW5jZSwgcHJlZmVycmluZyB0byBkaXNwbGF5IG9uIHRoZSB4MTF2bmMgZGlzcGxheS4KCiAgICAgICAgICAgICAgICAgICAgICAgNCkgV2hlbiAidHJheSIgb3IgImljb24iIGlzIHNwZWNpZmllZCwgdGhlIGd1aQogICAgICAgICAgICAgICAgICAgICAgIHByZXNlbnRzIGl0c2VsZiBhcyBhIHNtYWxsIGljb24gd2l0aCBiZWhhdmlvciB0eXBpY2FsCiAgICAgICAgICAgICAgICAgICAgICAgb2YgYSAic3lzdGVtIHRyYXkiIG9yICJkb2NrIGFwcGxldCIuICBUaGUgY29sb3IKICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgaWNvbiBpbmRpY2F0ZXMgc3RhdHVzIChjb25uZWN0ZWQgY2xpZW50cykgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgdGhlcmUgaXMgYWxzbyBhIGJhbGxvb24gc3RhdHVzLiAgQ2xpY2tpbmcgb24gdGhlIGljb24KICAgICAgICAgICAgICAgICAgICAgICBnaXZlcyBhIG1lbnUgZnJvbSB3aGljaCBwcm9wZXJ0aWVzLCBldGMsIGNhbiBiZSBzZXQgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZ1bGwgZ3VpIGlzIGF2YWlsYWJsZSB1bmRlciAiQWR2YW5jZWQiLiAgVG8gYmUKICAgICAgICAgICAgICAgICAgICAgICBmdWxseSBmdW5jdGlvbmFsLCB0aGUgZ3VpIG1vZGUgc2hvdWxkIGJlICJzdGFydCIKICAgICAgICAgICAgICAgICAgICAgICAodGhlIGRlZmF1bHQpLgoKICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdHJheSBvciBpY29uIG1vZGUgd2lsbCBpbXBseSB0aGUgLWZvcmV2ZXIKICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgb3B0aW9uIChpZiB0aGUgeDExdm5jIHNlcnZlciBpcyBzdGFydGVkIGFsb25nCiAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgZ3VpKSB1bmxlc3MgLWNvbm5lY3Qgb3IgLWNvbm5lY3Rfb3JfZXhpdCBoYXMKICAgICAgICAgICAgICAgICAgICAgICBiZWVuIHNwZWNpZmllZC4gIFNvIHgxMXZuYyAoYW5kIHRoZSB0cmF5L2ljb24gZ3VpKQogICAgICAgICAgICAgICAgICAgICAgIHdpbGwgd2FpdCBmb3IgbW9yZSBjb25uZWN0aW9ucyBhZnRlciB0aGUgZmlyc3QgY2xpZW50CiAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdHMuICBJZiB5b3Ugd2FudCBvbmx5IG9uZSB2aWV3ZXIgY29ubmVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgdGhlIC1vbmNlIG9wdGlvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgRm9yICJpY29uIiB0aGUgZ3VpIGp1c3QgYSBzbWFsbCBzdGFuZGFsb25lIHdpbmRvdy4KICAgICAgICAgICAgICAgICAgICAgICBGb3IgInRyYXkiIGl0IHdpbGwgYXR0ZW1wdCB0byBlbWJlZCBpdHNlbGYgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgICAgInN5c3RlbSB0cmF5IiBpZiBwb3NzaWJsZS4gSWYgIj1zZXRwYXNzIiBpcyBhcHBlbmRlZCB0aGUKbgogICAgICAgICAgICAgICAgICAgICAgIGF0IHN0YXJ0dXAgdGhlIFgxMSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdG8gc2V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgIFZOQyBzZXNzaW9uIHBhc3N3b3JkLiAgSWYgPTxoZXhudW1iZXI+IGlzIGFwcGVuZGVkCiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpY29uIHdpbGwgYXR0ZW1wdCB0byBlbWJlZCBpdHNlbGYgaW4gdGhlIHdpbmRvdwogICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIGJ5IGhleG51bWJlci4gIFVzZSA9bm9hZHZhbmNlZCB0byBkaXNhYmxlIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGZ1bGwgZ3VpLiAoVG8gc3VwcGx5IG1vcmUgdGhhbiBvbmUsIHVzZSAiKyIgc2lnbikuCiAgICAgICAgICAgICAgICAgICAgICAgRS5nLiAtZ3VpIHRyYXk9c2V0cGFzcyBhbmQgLWd1aSBpY29uPTB4MzYwMDAyOAoKICAgICAgICAgICAgICAgICAgICAgICBPdGhlciBtb2RlczogImZ1bGwiLCB0aGUgZGVmYXVsdCBhbmQgbmVlZCBub3QgYmUKICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQuICAiLWd1aSBub25lIiwgZG8gbm90IHNob3cgYSBndWksIHVzZWZ1bAogICAgICAgICAgICAgICAgICAgICAgIHRvIG92ZXJyaWRlIGEgfi8ueDExdm5jcmMgc2V0dGluZywgZXRjLgoKICAgICAgICAgICAgICAgICAgICAgICA1KSBXaGVuICJnZW9tPStYK1kiIGlzIHNwZWNpZmllZCwgdGhhdCBnZW9tZXRyeQogICAgICAgICAgICAgICAgICAgICAgIGlzIHBhc3NlZCB0byB0aGUgZ3VpIHRvcGxldmVsLiAgVGhpcyBpcyB0aGUgaWNvbiBpbgogICAgICAgICAgICAgICAgICAgICAgIGljb24vdHJheSBtb2RlLCBvciB0aGUgZnVsbCBndWkgb3RoZXJ3aXNlLiAgWW91IGNhbgogICAgICAgICAgICAgICAgICAgICAgIGFsc28gc3BlY2lmeSB3aWR0aCBhbmQgaGVpZ2h0LCBpLmUuIFd4SCtYK1ksIGJ1dCBpdAogICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCByZWNvbW1lbmRlZC4gIEluICJ0cmF5IiBtb2RlIHRoZSBnZW9tZXRyeSBpcwogICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZWQgdW5sZXNzIHRoZSBzeXN0ZW0gdHJheSBtYW5hZ2VyIGRvZXMgbm90IHNlZW0KICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBydW5uaW5nLiAgT25lIGNvdWxkIGltYWdpbmUgdXNpbmcgc29tZXRoaW5nIGxpa2UKICAgICAgICAgICAgICAgICAgICAgICAiLWd1aSB0cmF5LGdlb209KzQwMDArNDAwMCIgd2l0aCBhIGRpc3BsYXkgbWFuYWdlcgogICAgICAgICAgICAgICAgICAgICAgIHRvIGtlZXAgdGhlIGd1aSBpbnZpc2libGUgdW50aWwgc29tZW9uZSBsb2dzIGluLi4uCgogICAgICAgICAgICAgICAgICAgICAgIE1vcmUgaWNvbiB0cmlja3MsICJpY29uPW1pbmltYWwiIGdpdmVzIGFuIGljb24ganVzdAogICAgICAgICAgICAgICAgICAgICAgIHdpdGggdGhlIFZOQyBkaXNwbGF5IG51bWJlci4gIFlvdSBjYW4gYWxzbyBzZXQgdGhlIGZvbnQKICAgICAgICAgICAgICAgICAgICAgICB3aXRoICJpY29uZm9udD0uLi4iLiAgVGhlIGZvbGxvd2luZyBjb3VsZCBiZSB1c2VmdWw6CiAgICAgICAgICAgICAgICAgICAgICAgIi1ndWkgaWNvbj1taW5pbWFsLGljb25mb250PTV4OCxnZW9tPTI0eDEwKzAtMCIKCiAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhbCBleGFtcGxlcyBvZiB0aGUgLWd1aSBvcHRpb246ICJ4MTF2bmMgLWd1aSIsCiAgICAgICAgICAgICAgICAgICAgICAgIngxMXZuYyAtZ3VpIGV6IiAieDExdm5jIC1ndWkgbG9jYWxob3N0OjEwIiwKICAgICAgICAgICAgICAgICAgICAgICAieDExdm5jIC1ndWkgY29ubixob3N0OjAiLCAieDExdm5jIC1ndWkgdHJheSxleiIKICAgICAgICAgICAgICAgICAgICAgICAieDExdm5jIC1ndWkgdHJheT1zZXRwYXNzIgoKICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgZG8gbm90IGludGVuZCB0byBzdGFydCB4MTF2bmMgZnJvbSB0aGUgZ3VpCiAgICAgICAgICAgICAgICAgICAgICAgKGkuZS4ganVzdCByZW1vdGUgY29udHJvbCBhbiBleGlzdGluZyBvbmUpLCB0aGVuIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGd1aSBwcm9jZXNzIGNhbiBydW4gb24gYSBkaWZmZXJlbnQgbWFjaGluZSBmcm9tIHRoZQogICAgICAgICAgICAgICAgICAgICAgIHgxMXZuYyBzZXJ2ZXIgYXMgbG9uZyBhcyBYIHBlcm1pc3Npb25zLCBldGMuIHBlcm1pdAogICAgICAgICAgICAgICAgICAgICAgIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgdHdvLgoKICAgICAgICAgICAgICAgICAgICAgICBGT05UUzogT24gc29tZSBzeXN0ZW1zIHRoZSB0ayBmb250cyBjYW4gYmUgdG9vIHNtYWxsLAogICAgICAgICAgICAgICAgICAgICAgIGphZ2dlZCwgb3Igb3RoZXJ3aXNlIHVucmVhZGFibGUuICBUaGVyZSBhcmUgNCBlbnYgdmFycwogICAgICAgICAgICAgICAgICAgICAgIHlvdSBjYW4gc2V0IHRvIGJlIHRoZSB0ayBmb250IHlvdSBwcmVmZXI6CgogICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19GT05UX0JPTEQgICBtYWluIGZvbnQgZm9yIG1lbnVzIGFuZCBidXR0b25zLgogICAgICAgICAgICAgICAgICAgICAgIFgxMVZOQ19GT05UX0ZJWEVEICBmb250IGZvciBmaXhlZCB3aWR0aCB0ZXh0LgoKICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfRk9OVF9CT0xEX1NNQUxMICB0cmF5IGljb24gZm9udC4KICAgICAgICAgICAgICAgICAgICAgICBYMTFWTkNfRk9OVF9SRUdfU01BTEwgICB0cmF5IGljb24gbWVudSBmb250LgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgbGFzdCB0d28gb25seSBhcHBseSBmb3IgdGhlIHRyYXkgaWNvbiBtb2RlLgoKICAgICAgICAgICAgICAgICAgICAgICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOgoKICAgICAgICAgICAgICAgICAgICAgICAtZW52IFgxMVZOQ19GT05UX0JPTEQ9J0hlbHZldGljYSAtMTYgYm9sZCcKICAgICAgICAgICAgICAgICAgICAgICAtZW52IFgxMVZOQ19GT05UX0ZJWEVEPSdDb3VyaWVyIC0xNCcKICAgICAgICAgICAgICAgICAgICAgICAtZW52IFgxMVZOQ19GT05UX1JFR19TTUFMTD0nSGVsdmV0aWNhIC0xMicKCiAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBwdXQgdGhlIGxpbmVzIGxpa2UgdGhlIGFib3ZlICh3aXRob3V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgIHF1b3RlcykgaW4geW91ciB+Ly54MTF2bmNyYyBmaWxlIHRvIGF2b2lkIGhhdmluZyB0bwogICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhlbSBvbiB0aGUgeDExdm5jIGNvbW1hbmQgbGluZS4KCi1yZW1vdGUgY29tbWFuZCAgICAgICAgUmVtb3RlbHkgY29udHJvbCBzb21lIGFzcGVjdHMgb2YgYW4gYWxyZWFkeSBydW5uaW5nCiAgICAgICAgICAgICAgICAgICAgICAgeDExdm5jIHNlcnZlci4gICItUiIgYW5kICItciIgYXJlIGFsaWFzZXMgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgIi1yZW1vdGUiLiAgQWZ0ZXIgdGhlIHJlbW90ZSBjb250cm9sIGNvbW1hbmQgaXMKICAgICAgICAgICAgICAgICAgICAgICBzZW50IHRvIHRoZSBydW5uaW5nIHNlcnZlciB0aGUgJ3gxMXZuYyAtcmVtb3RlIC4uLicKICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMgY29tbWFuZCBleGl0cy4gIFlvdSBjYW4gb2Z0ZW4gdXNlIHRoZSAtcXVlcnkKICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIChzZWUgYmVsb3cpIHRvIHNlZSBpZiB0aGUgeDExdm5jIHNlcnZlcgogICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZCB5b3VyIC1yZW1vdGUgY29tbWFuZC4KCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgY29tbXVuaWNhdGlvbiBjaGFubmVsIGlzIHRoYXQgb2YgWAogICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMgKHNwZWNpZmljYWxseSBYMTFWTkNfUkVNT1RFKSwgYW5kIHNvIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIG11c3QgYmUgcnVuIHdpdGggY29ycmVjdCBzZXR0aW5ncyBmb3IgRElTUExBWQogICAgICAgICAgICAgICAgICAgICAgIGFuZCBwb3NzaWJseSBYQVVUSE9SSVRZIHRvIGNvbm5lY3QgdG8gdGhlIFggc2VydmVyCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHNldCB0aGUgcHJvcGVydHkuICBBbHRlcm5hdGl2ZWx5LCB1c2UgdGhlIC1kaXNwbGF5CiAgICAgICAgICAgICAgICAgICAgICAgYW5kIC1hdXRoIG9wdGlvbnMgdG8gc2V0IHRoZW0gdG8gdGhlIGNvcnJlY3QgdmFsdWVzLgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBydW5uaW5nIHNlcnZlciBjYW5ub3QgdXNlIHRoZSAtbm92bmNjb25uZWN0IG9wdGlvbgogICAgICAgICAgICAgICAgICAgICAgIGJlY2F1c2UgdGhhdCBkaXNhYmxlcyB0aGUgY29tbXVuaWNhdGlvbiBjaGFubmVsLgogICAgICAgICAgICAgICAgICAgICAgIFNlZSBiZWxvdyBmb3IgYWx0ZXJuYXRlIGNoYW5uZWxzLgoKICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZTogJ3gxMXZuYyAtcmVtb3RlIHN0b3AnICh3aGljaCBpcyB0aGUgc2FtZSBhcwogICAgICAgICAgICAgICAgICAgICAgICd4MTF2bmMgLVIgc3RvcCcpIHdpbGwgY2xvc2UgZG93biB0aGUgeDExdm5jIHNlcnZlci4KICAgICAgICAgICAgICAgICAgICAgICAneDExdm5jIC1SIHNoYXJlZCcgd2lsbCBlbmFibGUgc2hhcmVkIGNvbm5lY3Rpb25zLCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAneDExdm5jIC1SIHNjYWxlOjMvNCcgd2lsbCByZXNjYWxlIHRoZSBkZXNrdG9wLgoKICAgICAgICAgICAgICAgICAgICAgICBUbyB1c2UgYSBkaWZmZXJlbnQgbmFtZSBmb3IgdGhlIFgxMSBwcm9wZXJ0eSAoZS5nLiB0bwogICAgICAgICAgICAgICAgICAgICAgIGhhdmUgc2VwYXJhdGUgY29tbXVuaWNhdGlvbiBjaGFubmVscyBmb3IgbXVsdGlwbGUKICAgICAgICAgICAgICAgICAgICAgICB4MTF2bmMncyBvbiB0aGUgc2FtZSBkaXNwbGF5KSBzZXQgdGhlIFgxMVZOQ19SRU1PVEUKICAgICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUgc3RyaW5nIHlvdSB3YW50LCBmb3IKICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlOiAtZW52IFgxMVZOQ19SRU1PVEU9WDExVk5DX1JFTU9URV8xMjM0NQogICAgICAgICAgICAgICAgICAgICAgIEJvdGggc2lkZXMgb2YgdGhlIGNoYW5uZWwgbXVzdCB1c2UgdGhlIHNhbWUgdW5pcXVlIG5hbWUuCgogICAgICAgICAgICAgICAgICAgICAgIFRvIHJ1biBhIGJ1bmNoIG9mIGNvbW1hbmRzIGluIGEgc2VxdWVuY2UgdXNlIHNvbWV0aGluZwogICAgICAgICAgICAgICAgICAgICAgIGxpa2U6IHgxMXZuYyAtUiAnc2NyaXB0OmZpcnN0Y21kO3NlY29uZGNtZDsuLi4nCgogICAgICAgICAgICAgICAgICAgICAgIFVzZSB4MTF2bmMgLVIgc2NyaXB0OmZpbGU9L3BhdGgvdG8vZmlsZSB0byByZWFkIGNvbW1hbmRzCiAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhIGZpbGUgKGNhbiBiZSBtdWx0aS1saW5lIGFuZCB1c2UgdGhlIGNvbW1lbnQgJyMnCiAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGluIHRoZSBub3JtYWwgd2F5LiAgVGhlICc7JyBzZXBhcmF0b3IgbXVzdAogICAgICAgICAgICAgICAgICAgICAgIHN0aWxsIGJlIHVzZWQgdG8gc2VwYXJhdGUgZWFjaCBjb21tYW5kLikKCiAgICAgICAgICAgICAgICAgICAgICAgVG8gbm90IHRyeSB0byBjb250YWN0IGFub3RoZXIgeDExdm5jIHByb2Nlc3MgYW5kIGluc3RlYWQKICAgICAgICAgICAgICAgICAgICAgICBqdXN0IHJ1biB0aGUgY29tbWFuZCAob3IgcXVlcnkpIGRpcmVjdGx5LCBwcmVmaXggdGhlCiAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZCB3aXRoIHRoZSBzdHJpbmcgIkRJUkVDVDoiCgogICAgICAgICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgLXJlbW90ZS8tUiBjb21tYW5kcyBhcmUgc3VwcG9ydGVkOgoKICAgICAgICAgICAgICAgICAgICAgICBzdG9wICAgICAgICAgICAgdGVybWluYXRlIHRoZSBzZXJ2ZXIsIHNhbWUgYXMgInF1aXQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJleGl0IiBvciAic2h1dGRvd24iLgogICAgICAgICAgICAgICAgICAgICAgIHBpbmcgICAgICAgICAgICBzZWUgaWYgdGhlIHgxMXZuYyBzZXJ2ZXIgcmVzcG9uZHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpczogYW5zPXBpbmc6PGRpc3BsYXk+CiAgICAgICAgICAgICAgICAgICAgICAgcGluZzpteXN0cmluZyAgIGFzIGFib3ZlLCBidXQgdXNlIHlvdXIgb3duIHVuaXF1ZSBzdHJpbmcKLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXM6IGFucz1waW5nOm15c3RyaW5nOjx4ZGlzcGxheT4KICAgICAgICAgICAgICAgICAgICAgICBibGFja2VuICAgICAgICAgdHJ5IHRvIHB1c2ggYSBibGFjayBmYiB1cGRhdGUgdG8gYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHMgKGR1ZSB0byB0aW1pbmdzIGEgY2xpZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdWxkIG1pc3MgaXQpLiBTYW1lIGFzICJ6ZXJvIiwgYWxzbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiemVybzp4MSx5MSx4Mix5MiIgZm9yIGEgcmVjdGFuZ2xlLgogICAgICAgICAgICAgICAgICAgICAgIHJlZnJlc2ggICAgICAgICBzZW5kIHRoZSBlbnRpcmUgZmIgdG8gYWxsIGNsaWVudHMuCiAgICAgICAgICAgICAgICAgICAgICAgcmVzZXQgICAgICAgICAgIHJlY3JlYXRlIHRoZSBmYiwgcG9sbGluZyBtZW1vcnksIGV0Yy4KICAgICAgICAgICAgICAgICAgICAgICBpZDp3aW5kb3dpZCAgICAgc2V0IC1pZCB3aW5kb3cgdG8gIndpbmRvd2lkIi4gZW1wdHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgInJvb3QiIHRvIGdvIGJhY2sgdG8gcm9vdCB3aW5kb3cKICAgICAgICAgICAgICAgICAgICAgICBzaWQ6d2luZG93aWQgICAgc2V0IC1zaWQgd2luZG93IHRvICJ3aW5kb3dpZCIKICAgICAgICAgICAgICAgICAgICAgICBpZF9jbWQ6Y21kICAgICAgY21kczogcmFpc2UsIGxvd2VyLCBtYXAsIHVubWFwLCBpY29uaWZ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlOmRYZFksIHJlc2l6ZTpkV2RILCBnZW9tOld4SCtYK1kuIGRYCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRZLCBkVywgYW5kIGRIIG11c3QgaGF2ZSBhIGxlYWRpbmcgIisiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yICItIiBlLmcuOiBtb3ZlOi0zMCsxMCByZXNpemU6KzIwKzM1CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsc286IHdtX2RlbGV0ZSwgd21fbmFtZTpzdHJpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljb25fbmFtZTpzdHJpbmcuIEFsc28gaWRfY21kOndpbj1OOmNtZAogICAgICAgICAgICAgICAgICAgICAgIHdhaXRtYXBwZWQgICAgICB3YWl0IHVudGlsIHN1YndpbiBpcyBtYXBwZWQuCiAgICAgICAgICAgICAgICAgICAgICAgbm93YWl0bWFwcGVkICAgIGRvIG5vdCB3YWl0IHVudGlsIHN1YndpbiBpcyBtYXBwZWQuCiAgICAgICAgICAgICAgICAgICAgICAgY2xpcDpXeEgrWCtZICAgIHNldCAtY2xpcCBtb2RlIHRvICJXeEgrWCtZIgogICAgICAgICAgICAgICAgICAgICAgIGZsYXNoY21hcCAgICAgICBlbmFibGUgIC1mbGFzaGNtYXAgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub2ZsYXNoY21hcCAgICAgZGlzYWJsZSAtZmxhc2hjbWFwIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgc2hpZnRjbWFwOm4gICAgIHNldCAtc2hpZnRjbWFwIHRvIG4uCiAgICAgICAgICAgICAgICAgICAgICAgbm90cnVlY29sb3IgICAgIGVuYWJsZSAgLW5vdHJ1ZWNvbG9yIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZWNvbG9yICAgICAgIGRpc2FibGUgLW5vdHJ1ZWNvbG9yIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheSAgICAgICAgIGVuYWJsZSAgLW92ZXJsYXkgbW9kZSAoaWYgYXBwbGljYWJsZSkuCiAgICAgICAgICAgICAgICAgICAgICAgbm9vdmVybGF5ICAgICAgIGRpc2FibGUgLW92ZXJsYXkgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBvdmVybGF5X2N1cnNvciAgaW4gLW92ZXJsYXkgbW9kZSwgZW5hYmxlIGN1cnNvciBkcmF3aW5nLgogICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfbm9jdXJzb3IgZGlzYWJsZSBjdXJzb3IgZHJhd2luZy4gc2FtZSBhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9vdmVybGF5X2N1cnNvci4KICAgICAgICAgICAgICAgICAgICAgICA4dG8yNCAgICAgICAgICAgZW5hYmxlICAtOHRvMjQgbW9kZSAoaWYgYXBwbGljYWJsZSkuCiAgICAgICAgICAgICAgICAgICAgICAgbm84dG8yNCAgICAgICAgIGRpc2FibGUgLTh0bzI0IG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgOHRvMjRfb3B0czpzdHIgIHNldCB0aGUgLTh0bzI0IG9wdHMgdG8gInN0ciIuCiAgICAgICAgICAgICAgICAgICAgICAgMjR0bzMyICAgICAgICAgIGVuYWJsZSAgLTI0dG8zMiBtb2RlIChpZiBhcHBsaWNhYmxlKS4KICAgICAgICAgICAgICAgICAgICAgICBubzI0dG8zMiAgICAgICAgZGlzYWJsZSAtMjR0bzMyIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgdmlzdWFsOnZpcyAgICAgIHNldCAtdmlzdWFsIHRvICJ2aXMiCiAgICAgICAgICAgICAgICAgICAgICAgc2NhbGU6ZnJhYyAgICAgIHNldCAtc2NhbGUgdG8gImZyYWMiCiAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfY3Vyc29yOmYgIHNldCAtc2NhbGVfY3Vyc29yIHRvICJmIgogICAgICAgICAgICAgICAgICAgICAgIHZpZXdvbmx5ICAgICAgICBlbmFibGUgIC12aWV3b25seSBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vdmlld29ubHkgICAgICBkaXNhYmxlIC12aWV3b25seSBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZCAgICAgICAgICBlbmFibGUgIC1zaGFyZWQgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub3NoYXJlZCAgICAgICAgZGlzYWJsZSAtc2hhcmVkIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgZm9yZXZlciAgICAgICAgIGVuYWJsZSAgLWZvcmV2ZXIgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub2ZvcmV2ZXIgICAgICAgZGlzYWJsZSAtZm9yZXZlciBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXQ6biAgICAgICByZXNldCAtdGltZW91dCB0byBuLCBpZiB0aGVyZSBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IG5vIGNsaWVudHMsIGV4aXQgdW5sZXNzIG9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0cyBpbiB0aGUgbmV4dCBuIHNlY3MuCiAgICAgICAgICAgICAgICAgICAgICAgdGlnaHRmaWxleGZlciAgIGVuYWJsZSAgZmlsZXRyYW5zZmVyIGZvciBORVcgY2xpZW50cy4KICAgICAgICAgICAgICAgICAgICAgICBub3RpZ2h0ZmlsZXhmZXIgZGlzYWJsZSBmaWxldHJhbnNmZXIgZm9yIE5FVyBjbGllbnRzLgogICAgICAgICAgICAgICAgICAgICAgIHVsdHJhZmlsZXhmZXIgICBlbmFibGUgIGZpbGV0cmFuc2ZlciBmb3IgY2xpZW50cy4KICAgICAgICAgICAgICAgICAgICAgICBub3VsdHJhZmlsZXhmZXIgZGlzYWJsZSBmaWxldHJhbnNmZXIgZm9yIGNsaWVudHMuCiAgICAgICAgICAgICAgICAgICAgICAgcmZidmVyc2lvbjpuLm0gIHNldCAtcmZidmVyc2lvbiBmb3IgbmV3IGNsaWVudHMuCiAgICAgICAgICAgICAgICAgICAgICAgaHR0cCAgICAgICAgICAgIGVuYWJsZSAgaHR0cCBjbGllbnQgY29ubmVjdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgICAgbm9odHRwICAgICAgICAgIGRpc2FibGUgaHR0cCBjbGllbnQgY29ubmVjdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgICAgZGVueSAgICAgICAgICAgIGRlbnkgYW55IG5ldyBjb25uZWN0aW9ucywgc2FtZSBhcyAibG9jayIKICAgICAgICAgICAgICAgICAgICAgICBub2RlbnkgICAgICAgICAgYWxsb3cgbmV3IGNvbm5lY3Rpb25zLCBzYW1lIGFzICJ1bmxvY2siCiAgICAgICAgICAgICAgICAgICAgICAgYXZhaGkgICAgICAgICAgIGVuYWJsZSAgYXZhaGkgc2VydmljZSBhZHZlcnRpc2luZy4KICAgICAgICAgICAgICAgICAgICAgICBub2F2YWhpICAgICAgICAgZGlzYWJsZSBhdmFoaSBzZXJ2aWNlIGFkdmVydGlzaW5nLgogICAgICAgICAgICAgICAgICAgICAgIG1kbnMgICAgICAgICAgICBlbmFibGUgIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgbm9tZG5zICAgICAgICAgIGRpc2FibGUgYXZhaGkgc2VydmljZSBhZHZlcnRpc2luZy4KICAgICAgICAgICAgICAgICAgICAgICB6ZXJvY29uZiAgICAgICAgZW5hYmxlICBhdmFoaSBzZXJ2aWNlIGFkdmVydGlzaW5nLgogICAgICAgICAgICAgICAgICAgICAgIG5vemVyb2NvbmYgICAgICBkaXNhYmxlIGF2YWhpIHNlcnZpY2UgYWR2ZXJ0aXNpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdDpob3N0ICAgIGRvIHJldmVyc2UgY29ubmVjdGlvbiB0byBob3N0LCAiaG9zdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgaG9zdHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaG9zdDpwb3J0cy4gIFNlZSAtY29ubmVjdC4gIFBhc3N3b3JkcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZCBhcyB3aXRoIGZ3ZCBjb25uZWN0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIFgxMVZOQ19SRVZFUlNFX0NPTk5FQ1RJT05fTk9fQVVUSD0xCiAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdDpob3N0IGRpc2Nvbm5lY3QgYW55IGNsaWVudHMgZnJvbSAiaG9zdCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZSBhcyAiY2xvc2U6aG9zdCIuICBVc2UgaG9zdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsIiB0byBjbG9zZSBhbGwgY3VycmVudCBjbGllbnRzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3Uga25vdyB0aGUgY2xpZW50IGludGVybmFsIGhleCBJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nLiAweDMgKHJldHVybmVkIGJ5ICItcXVlcnkgY2xpZW50cyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIFJGQl9DTElFTlRfSUQpIHlvdSBjYW4gdXNlIHRoYXQgdG9vLgogICAgICAgICAgICAgICAgICAgICAgIHByb3h5Omhvc3Q6cG9ydCBzZXQgcmV2ZXJzZSBjb25uZWN0aW9uIHByb3h5IChlbXB0eSB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlKS4KICAgICAgICAgICAgICAgICAgICAgICBhbGxvd29uY2U6aG9zdCAgRm9yIHRoZSBuZXh0IGNvbm5lY3Rpb24gb25seSwgYWxsb3cKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBmcm9tICJob3N0Ii4gSW4gLXNzbCBtb2RlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR3byBjb25uZWN0aW9ucyBhcmUgYWxsb3dlZCAoaS5lLiBGZXRjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZXJ0KSB1bmxlc3MgWDExVk5DX05PX1NTTF9BTExPV19UV0lDRT0xCiAgICAgICAgICAgICAgICAgICAgICAgYWxsb3c6aG9zdGxpc3QgIHNldCAtYWxsb3cgbGlzdCB0byAoY29tbWEgc2VwYXJhdGVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaG9zdGxpc3QiLiBTZWUgLWFsbG93IGFuZCAtbG9jYWxob3N0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEbyBub3QgdXNlIHdpdGggLWFsbG93IC9wYXRoL3RvL2ZpbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlICIraG9zdCIgdG8gYWRkIGEgc2luZ2xlIGhvc3QsIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgIi1ob3N0IiB0byBkZWxldGUgYSBzaW5nbGUgaG9zdAogICAgICAgICAgICAgICAgICAgICAgIGxvY2FsaG9zdCAgICAgICBlbmFibGUgIC1sb2NhbGhvc3QgbW9kZQogICAgICAgICAgICAgICAgICAgICAgIG5vbG9jYWxob3N0ICAgICBkaXNhYmxlIC1sb2NhbGhvc3QgbW9kZQogICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbjpzdHIgICAgICBzZXQgLWxpc3RlbiB0byBzdHIsIGVtcHR5IHRvIGRpc2FibGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9pcHY2ICAgICAgICAgIGVuYWJsZSAgLW5vaXB2NiBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIGlwdjYgICAgICAgICAgICBkaXNhYmxlIC1ub2lwdjYgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub2lwdjQgICAgICAgICAgZW5hYmxlICAtbm9pcHY0IG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgaXB2NCAgICAgICAgICAgIGRpc2FibGUgLW5vaXB2NCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIDYgICAgICAgICAgICAgICBlbmFibGUgIC02IElQdjYgbGlzdGVuaW5nIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm82ICAgICAgICAgICAgIGRpc2FibGUgLTYgSVB2NiBsaXN0ZW5pbmcgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBsb29rdXAgICAgICAgICAgZGlzYWJsZSAtbm9sb29rdXAgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub2xvb2t1cCAgICAgICAgZW5hYmxlICAtbm9sb29rdXAgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBsb29rdXAgICAgICAgICAgZGlzYWJsZSAtbm9sb29rdXAgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBpbnB1dDpzdHIgICAgICAgc2V0IC1pbnB1dCB0byAic3RyIiwgZW1wdHkgdG8gZGlzYWJsZS4KICAgICAgICAgICAgICAgICAgICAgICBncmFia2JkICAgICAgICAgZW5hYmxlICAtZ3JhYmtiZCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vZ3JhYmtiZCAgICAgICBkaXNhYmxlIC1ncmFia2JkIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgZ3JhYnB0ciAgICAgICAgIGVuYWJsZSAgLWdyYWJwdHIgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub2dyYWJwdHIgICAgICAgZGlzYWJsZSAtZ3JhYnB0ciBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIGdyYWJhbHdheXMgICAgICBlbmFibGUgIC1ncmFiYWx3YXlzIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9ncmFiYWx3YXlzICAgIGRpc2FibGUgLWdyYWJhbHdheXMgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBncmFibG9jYWw6biAgICAgc2V0IC1ncmFibG9jYWwgdG8gbi4KICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfaW5wdXQ6c3RyIHNldCB0aGUgSywgTSwgQiAtaW5wdXQgb24gYSBwZXItY2xpZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2lzLiAgc2VsZWN0IHdoaWNoIGNsaWVudCBhcyBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY29ubmVjdCwgZS5nLiBjbGllbnRfaW5wdXQ6aG9zdDpNQgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBjbGllbnRfaW5wdXQ6MHgyOksKICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHQ6Y21kICAgICAgc2V0IC1hY2NlcHQgImNtZCIgKGVtcHR5IHRvIGRpc2FibGUpLgogICAgICAgICAgICAgICAgICAgICAgIGFmdGVyYWNjZXB0OmNtZCBzZXQgLWFmdGVyYWNjZXB0IChlbXB0eSB0byBkaXNhYmxlKS4KICAgICAgICAgICAgICAgICAgICAgICBnb25lOmNtZCAgICAgICAgc2V0IC1nb25lICJjbWQiIChlbXB0eSB0byBkaXNhYmxlKS4KICAgICAgICAgICAgICAgICAgICAgICBub3NobSAgICAgICAgICAgZW5hYmxlICAtbm9zaG0gbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBzaG0gICAgICAgICAgICAgZGlzYWJsZSAtbm9zaG0gbW9kZSAoaS5lLiB1c2Ugc2htKS4KICAgICAgICAgICAgICAgICAgICAgICBmbGlwYnl0ZW9yZGVyICAgZW5hYmxlIC1mbGlwYnl0ZW9yZGVyIG1vZGUsIHlvdSBtYXkgbmVlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzZXQgbm9zaG0gZm9yIHRoaXMgdG8gZG8gc29tZXRoaW5nLgogICAgICAgICAgICAgICAgICAgICAgIG5vZmxpcGJ5dGVvcmRlciBkaXNhYmxlIC1mbGlwYnl0ZW9yZGVyIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgb25ldGlsZSAgICAgICAgIGVuYWJsZSAgLW9uZXRpbGUgbW9kZS4gKHlvdSBtYXkgbmVlZCB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQgc2htIGZvciB0aGlzIHRvIGRvIHNvbWV0aGluZykKICAgICAgICAgICAgICAgICAgICAgICBub29uZXRpbGUgICAgICAgZGlzYWJsZSAtb25ldGlsZSBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHNvbGlkICAgICAgICAgICBlbmFibGUgIC1zb2xpZCBtb2RlCiAgICAgICAgICAgICAgICAgICAgICAgbm9zb2xpZCAgICAgICAgIGRpc2FibGUgLXNvbGlkIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgc29saWRfY29sb3I6Y29sb3Igc2V0IC1zb2xpZCBjb2xvciAoYW5kIGFwcGx5IGl0KS4KICAgICAgICAgICAgICAgICAgICAgICBibGFja291dDpzdHIgICAgc2V0IC1ibGFja291dCAic3RyIiAoZW1wdHkgdG8gZGlzYWJsZSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSAtYmxhY2tvdXQgZm9yIHRoZSBmb3JtIG9mICJzdHIiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiYXNpY2FsbHk6IFd4SCtYK1ksLi4uKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgIitXeEgrWCtZIiB0byBhcHBlbmQgYSBzaW5nbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjdGFuZ2xlIHVzZSAiLVd4SCtYK1kiIHRvIGRlbGV0ZSBvbmUKICAgICAgICAgICAgICAgICAgICAgICB4aW5lcmFtYSAgICAgICAgZW5hYmxlICAteGluZXJhbWEgbW9kZS4gKGlmIGFwcGxpY2FibGUpCiAgICAgICAgICAgICAgICAgICAgICAgbm94aW5lcmFtYSAgICAgIGRpc2FibGUgLXhpbmVyYW1hIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgeHRyYXAgICAgICAgICAgIGVuYWJsZSAgLXh0cmFwIGlucHV0IG1vZGUoaWYgYXBwbGljYWJsZSkKICAgICAgICAgICAgICAgICAgICAgICBub3h0cmFwICAgICAgICAgZGlzYWJsZSAteHRyYXAgaW5wdXQgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICB4cmFuZHIgICAgICAgICAgZW5hYmxlICAteHJhbmRyIG1vZGUuIChpZiBhcHBsaWNhYmxlKQogICAgICAgICAgICAgICAgICAgICAgIG5veHJhbmRyICAgICAgICBkaXNhYmxlIC14cmFuZHIgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICB4cmFuZHJfbW9kZTptb2RlIHNldCB0aGUgLXhyYW5kciBtb2RlIHRvICJtb2RlIi4KICAgICAgICAgICAgICAgICAgICAgICByb3RhdGU6bW9kZSAgICAgc2V0IHRoZSAtcm90YXRlIG1vZGUgdG8gIm1vZGUiLgogICAgICAgICAgICAgICAgICAgICAgIHBhZGdlb206V3hIICAgICBzZXQgLXBhZGdlb20gdG8gV3hIIChlbXB0eSB0byBkaXNhYmxlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBXeEggaXMgImZvcmNlIiBvciAiZG8iIHRoZSBwYWRkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgZmIgaXMgaW1tZWRpYXRlbHkgYXBwbGllZC4KICAgICAgICAgICAgICAgICAgICAgICBxdWlldCAgICAgICAgICAgZW5hYmxlICAtcXVpZXQgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub3F1aWV0ICAgICAgICAgZGlzYWJsZSAtcXVpZXQgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBtb2R0d2VhayAgICAgICAgZW5hYmxlICAtbW9kdHdlYWsgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub21vZHR3ZWFrICAgICAgZW5hYmxlICAtbm9tb2R0d2VhayBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHhrYiAgICAgICAgICAgICBlbmFibGUgIC14a2IgbW9kdHdlYWsgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub3hrYiAgICAgICAgICAgZGlzYWJsZSAteGtiIG1vZHR3ZWFrIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgY2Fwc2xvY2sgICAgICAgIGVuYWJsZSAgLWNhcHNsb2NrIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9jYXBzbG9jayAgICAgIGRpc2FibGUgLWNhcHNsb2NrIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgc2tpcF9sb2Nra2V5cyAgIGVuYWJsZSAgLXNraXBfbG9ja2tleXMgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub3NraXBfbG9ja2tleXMgZGlzYWJsZSAtc2tpcF9sb2Nra2V5cyBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHNraXBfa2V5Y29kZXM6c3RyIGVuYWJsZSAteGtiIC1za2lwX2tleWNvZGVzICJzdHIiLgogICAgICAgICAgICAgICAgICAgICAgIHNsb3BweV9rZXlzICAgICBlbmFibGUgIC1zbG9wcHlfa2V5cyBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vc2xvcHB5X2tleXMgICBkaXNhYmxlIC1zbG9wcHlfa2V5cyBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHNraXBfZHVwcyAgICAgICBlbmFibGUgIC1za2lwX2R1cHMgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub3NraXBfZHVwcyAgICAgZGlzYWJsZSAtc2tpcF9kdXBzIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgYWRkX2tleXN5bXMgICAgIGVuYWJsZSAtYWRkX2tleXN5bXMgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub2FkZF9rZXlzeW1zICAgc3RvcCBhZGRpbmcga2V5c3ltcy4gdGhvc2UgYWRkZWQgd2lsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbCBiZSByZW1vdmVkIGF0IGV4aXQuCiAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfbW9kcyAgICAgIGVuYWJsZSAgLWNsZWFyX21vZHMgbW9kZSBhbmQgY2xlYXIgdGhlbS4KICAgICAgICAgICAgICAgICAgICAgICBub2NsZWFyX21vZHMgICAgZGlzYWJsZSAtY2xlYXJfbW9kcyBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIGNsZWFyX2tleXMgICAgICBlbmFibGUgIC1jbGVhcl9rZXlzIG1vZGUgYW5kIGNsZWFyIHRoZW0uCiAgICAgICAgICAgICAgICAgICAgICAgbm9jbGVhcl9rZXlzICAgIGRpc2FibGUgLWNsZWFyX2tleXMgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9sb2NrcyAgICAgZG8gdGhlIGNsZWFyX2xvY2tzIGFjdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICBjbGVhcl9hbGwgICAgICAgZG8gdGhlIGNsZWFyX2FsbCBhY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgICAga2V5c3RhdGUgICAgICAgIGhhdmUgeDExdm5jIHByaW50IGN1cnJlbnQga2V5c3RhdGUuCiAgICAgICAgICAgICAgICAgICAgICAgcmVtYXA6c3RyICAgICAgIHNldCAtcmVtYXAgInN0ciIgKGVtcHR5IHRvIGRpc2FibGUpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgLXJlbWFwIGZvciB0aGUgZm9ybSBvZiAic3RyIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmFzaWNhbGx5OiBrZXkxLWtleTIsa2V5My1rZXk0LC4uLikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlICIra2V5MS1rZXkyIiB0byBhcHBlbmQgYSBzaW5nbGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5bWFwcGluZywgdXNlICIta2V5MS1rZXkyIiB0byBkZWxldGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9yZXBlYXQgICAgICAgIGVuYWJsZSAgLW5vcmVwZWF0IG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ICAgICAgICAgIGRpc2FibGUgLW5vcmVwZWF0IG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9mYiAgICAgICAgICAgIGVuYWJsZSAgLW5vZmIgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBmYiAgICAgICAgICAgICAgZGlzYWJsZSAtbm9mYiBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIGJlbGwgICAgICAgICAgICBlbmFibGUgIGJlbGwgKGlmIHN1cHBvcnRlZCkuCiAgICAgICAgICAgICAgICAgICAgICAgbm9iZWxsICAgICAgICAgIGRpc2FibGUgYmVsbC4KICAgICAgICAgICAgICAgICAgICAgICBzZW5kYmVsbCAgICAgICAgcmluZyB0aGUgYmVsbCBub3cuCiAgICAgICAgICAgICAgICAgICAgICAgbm9zZWwgICAgICAgICAgIGVuYWJsZSAgLW5vc2VsIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgc2VsICAgICAgICAgICAgIGRpc2FibGUgLW5vc2VsIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9wcmltYXJ5ICAgICAgIGVuYWJsZSAgLW5vcHJpbWFyeSBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnkgICAgICAgICBkaXNhYmxlIC1ub3ByaW1hcnkgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub3NldHByaW1hcnkgICAgZW5hYmxlICAtbm9zZXRwcmltYXJ5IG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgc2V0cHJpbWFyeSAgICAgIGRpc2FibGUgLW5vc2V0cHJpbWFyeSBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vY2xpcGJvYXJkICAgICBlbmFibGUgIC1ub2NsaXBib2FyZCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIGNsaXBib2FyZCAgICAgICBkaXNhYmxlIC1ub2NsaXBib2FyZCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vc2V0Y2xpcGJvYXJkICBlbmFibGUgIC1ub3NldGNsaXBib2FyZCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHNldGNsaXBib2FyZCAgICBkaXNhYmxlIC1ub3NldGNsaXBib2FyZCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHNlbGRpcjpzdHIgICAgICBzZXQgLXNlbGRpciB0byAic3RyIgogICAgICAgICAgICAgICAgICAgICAgIHJlc2VuZF9jdXRidWZmZXIgcmVzZW5kIHRoZSBtb3N0IHJlY2VudCBDVVRCVUZGRVIwIGNvcHkKICAgICAgICAgICAgICAgICAgICAgICByZXNlbmRfY2xpcGJvYXJkIHJlc2VuZCB0aGUgbW9zdCByZWNlbnQgQ0xJUEJPQVJEIGNvcHkKICAgICAgICAgICAgICAgICAgICAgICByZXNlbmRfcHJpbWFyeSAgIHJlc2VuZCB0aGUgbW9zdCByZWNlbnQgUFJJTUFSWSBjb3B5CiAgICAgICAgICAgICAgICAgICAgICAgY3Vyc29yOm1vZGUgICAgIGVuYWJsZSAgLWN1cnNvciAibW9kZSIuCiAgICAgICAgICAgICAgICAgICAgICAgc2hvd19jdXJzb3IgICAgIGVuYWJsZSAgc2hvd2luZyBhIGN1cnNvci4KICAgICAgICAgICAgICAgICAgICAgICBub3Nob3dfY3Vyc29yICAgZGlzYWJsZSBzaG93aW5nIGEgY3Vyc29yLiAoc2FtZSBhcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9jdXJzb3IiKQogICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcl9kcmFnICAgICBlbmFibGUgIGN1cnNvciBjaGFuZ2VzIGR1cmluZyBkcmFnLgogICAgICAgICAgICAgICAgICAgICAgIG5vY3Vyc29yX2RyYWcgICBkaXNhYmxlIGN1cnNvciBjaGFuZ2VzIGR1cmluZyBkcmFnLgogICAgICAgICAgICAgICAgICAgICAgIGFycm93Om4gICAgICAgICBzZXQgLWFycm93IHRvIGFsdGVybmF0ZSBuLgogICAgICAgICAgICAgICAgICAgICAgIHhmaXhlcyAgICAgICAgICBlbmFibGUgIHhmaXhlcyBjdXJzb3Igc2hhcGUgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub3hmaXhlcyAgICAgICAgZGlzYWJsZSB4Zml4ZXMgY3Vyc29yIHNoYXBlIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgYWxwaGFjdXQ6biAgICAgIHNldCAtYWxwaGFjdXQgdG8gbi4KICAgICAgICAgICAgICAgICAgICAgICBhbHBoYWZyYWM6ZiAgICAgc2V0IC1hbHBoYWZyYWMgdG8gZi4KICAgICAgICAgICAgICAgICAgICAgICBhbHBoYXJlbW92ZSAgICAgZW5hYmxlICAtYWxwaGFyZW1vdmUgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub2FscGhhcmVtb3ZlICAgZGlzYWJsZSAtYWxwaGFyZW1vdmUgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBhbHBoYWJsZW5kICAgICAgZGlzYWJsZSAtbm9hbHBoYWJsZW5kIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9hbHBoYWJsZW5kICAgIGVuYWJsZSAgLW5vYWxwaGFibGVuZCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIGN1cnNvcnNoYXBlICAgICBkaXNhYmxlIC1ub2N1cnNvcnNoYXBlIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9jdXJzb3JzaGFwZSAgIGVuYWJsZSAgLW5vY3Vyc29yc2hhcGUgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3Jwb3MgICAgICAgZGlzYWJsZSAtbm9jdXJzb3Jwb3MgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub2N1cnNvcnBvcyAgICAgZW5hYmxlICAtbm9jdXJzb3Jwb3MgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICB4d2FycCAgICAgICAgICAgZW5hYmxlICAteHdhcnBwb2ludGVyIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm94d2FycCAgICAgICAgIGRpc2FibGUgLXh3YXJwcG9pbnRlciBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIGFsd2F5c19pbmplY3QgICBlbmFibGUgIC1hbHdheXNfaW5qZWN0IG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9hbHdheXNfaW5qZWN0IGRpc2FibGUgLWFsd2F5c19pbmplY3QgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBidXR0b25tYXA6c3RyICAgc2V0IC1idXR0b25tYXAgInN0ciIsIGVtcHR5IHRvIGRpc2FibGUKICAgICAgICAgICAgICAgICAgICAgICBkcmFnZ2luZyAgICAgICAgZGlzYWJsZSAtbm9kcmFnZ2luZyBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vZHJhZ2dpbmcgICAgICBlbmFibGUgIC1ub2RyYWdnaW5nIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlICAgICAgICAgIHJlZW5hYmxlIC1uY2FjaGUgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub25jYWNoZSAgICAgICAgZGlzYWJsZSAgLW5jYWNoZSBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9zaXplOm4gICBzZXQgLW5jYWNoZSBzaXplIHRvIG4uCiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlX2NyICAgICAgIGVuYWJsZSAgLW5jYWNoZV9jciBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vbmNhY2hlX2NyICAgICBkaXNhYmxlIC1uY2FjaGVfY3IgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfbm9fbW92ZXJhaXNlICAgICBlbmFibGUgIG5vX21vdmVyYWlzZSBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vbmNhY2hlX25vX21vdmVyYWlzZSAgIGRpc2FibGUgbm9fbW92ZXJhaXNlIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlX25vX2R0Y2hhbmdlICAgICAgZW5hYmxlICBuY2FjaGVfbm9fZHRjaGFuZ2UgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub25jYWNoZV9ub19kdGNoYW5nZSAgICBkaXNhYmxlIG5jYWNoZV9ub19kdGNoYW5nZSBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9vbGRfd20gICAgICAgICAgIGVuYWJsZSAgbmNhY2hlX29sZF93bSBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vbmNhY2hlX29sZF93bSAgICAgICAgIGRpc2FibGUgbmNhY2hlX29sZF93bSBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9ub19yb290cGl4bWFwICAgIGVuYWJsZSAgbmNhY2hlX25vX3Jvb3RwaXhtYXAuCiAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfbm9fcm9vdHBpeG1hcCAgZGlzYWJsZSBuY2FjaGVfbm9fcm9vdHBpeG1hcC4KICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfcmVzZXRfcm9vdHBpeG1hcCByZWNoZWNrIHRoZSByb290IHBpeG1hcCwgbmNycAogICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9rZWVwX2FuaW1zICAgICAgIGVuYWJsZSAgbmNhY2hlX2tlZXBfYW5pbXMuCiAgICAgICAgICAgICAgICAgICAgICAgbm9uY2FjaGVfa2VlcF9hbmltcyAgICAgZGlzYWJsZSBuY2FjaGVfa2VlcF9hbmltcy4KICAgICAgICAgICAgICAgICAgICAgICBuY2FjaGVfcGFkOm4gICAgc2V0IC1uY2FjaGVfcGFkIHRvIG4uCiAgICAgICAgICAgICAgICAgICAgICAgd2lyZWZyYW1lICAgICAgIGVuYWJsZSAgLXdpcmVmcmFtZSBtb2RlLiBzYW1lIGFzICJ3ZiIKICAgICAgICAgICAgICAgICAgICAgICBub3dpcmVmcmFtZSAgICAgZGlzYWJsZSAtd2lyZWZyYW1lIG1vZGUuIHNhbWUgYXMgIm5vd2YiCiAgICAgICAgICAgICAgICAgICAgICAgd2lyZWZyYW1lOnN0ciAgIGVuYWJsZSAgLXdpcmVmcmFtZSBtb2RlIHN0cmluZy4KICAgICAgICAgICAgICAgICAgICAgICB3aXJlZnJhbWVfbW9kZTpzdHIgZW5hYmxlICAtd2lyZWZyYW1lIG1vZGUgc3RyaW5nLgogICAgICAgICAgICAgICAgICAgICAgIHdpcmVmcmFtZWxvY2FsICBlbmFibGUgIHdpcmVmcmFtZWxvY2FsLiBzYW1lIGFzICJ3ZmwiCiAgICAgICAgICAgICAgICAgICAgICAgbm93aXJlZnJhbWUgICAgIGRpc2FibGUgd2lyZWZyYW1lbG9jYWwuIHNhbWUgYXMgIm5vd2ZsIgogICAgICAgICAgICAgICAgICAgICAgIHdpcmVjb3B5cmVjdDpzdHIgc2V0IC13aXJlY29weXJlY3Qgc3RyaW5nLiBzYW1lIGFzICJ3Y3I6CiIKICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxjb3B5cmVjdDpzdHIgc2V0IC1zY3JvbGxjb3B5cmVjdCBzdHJpbmcuIHNhbWUgInNjcgoiCiAgICAgICAgICAgICAgICAgICAgICAgbm9zY3JvbGxjb3B5cmVjdCBkaXNhYmxlIC1zY3JvbGxjb3B5cmVjdCBtb2RlLiAibm9zY3IiCiAgICAgICAgICAgICAgICAgICAgICAgc2NyX2FyZWE6biAgICAgIHNldCAtc2NyX2FyZWEgdG8gbgogICAgICAgICAgICAgICAgICAgICAgIHNjcl9za2lwOmxpc3QgICBzZXQgLXNjcl9za2lwIHRvICJsaXN0IgogICAgICAgICAgICAgICAgICAgICAgIHNjcl9pbmM6bGlzdCAgICBzZXQgLXNjcl9pbmMgdG8gImxpc3QiCiAgICAgICAgICAgICAgICAgICAgICAgc2NyX2tleXM6bGlzdCAgIHNldCAtc2NyX2tleXMgdG8gImxpc3QiCiAgICAgICAgICAgICAgICAgICAgICAgc2NyX3Rlcm06bGlzdCAgIHNldCAtc2NyX3Rlcm0gdG8gImxpc3QiCiAgICAgICAgICAgICAgICAgICAgICAgc2NyX2tleXJlcGVhdDpzdHIgc2V0IC1zY3Jfa2V5cmVwZWF0IHRvICJzdHIiCiAgICAgICAgICAgICAgICAgICAgICAgc2NyX3Bhcm1zOnN0ciAgIHNldCAtc2NyX3Bhcm1zIHBhcmFtZXRlcnMuCiAgICAgICAgICAgICAgICAgICAgICAgZml4c2NyZWVuOnN0ciAgIHNldCAtZml4c2NyZWVuIHRvICJzdHIiLgogICAgICAgICAgICAgICAgICAgICAgIG5veHJlY29yZCAgICAgICBkaXNhYmxlIGFsbCB1c2Ugb2YgUkVDT1JEIGV4dGVuc2lvbi4KICAgICAgICAgICAgICAgICAgICAgICB4cmVjb3JkICAgICAgICAgZW5hYmxlICB1c2Ugb2YgUkVDT1JEIGV4dGVuc2lvbi4KICAgICAgICAgICAgICAgICAgICAgICByZXNldF9yZWNvcmQgICAgcmVzZXQgUkVDT1JEIGV4dGVuc2lvbiAoaWYgYXZhaWwuKQogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfbW9kZTpuICBzZXQgLXBvaW50ZXJfbW9kZSB0byBuLiBzYW1lIGFzICJwbSIKICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9za2lwOm4gICAgc2V0IC1pbnB1dF9za2lwIHRvIG4uCiAgICAgICAgICAgICAgICAgICAgICAgYWxsaW5wdXQgICAgICAgIGVuYWJsZSAgdXNlIG9mIC1hbGxpbnB1dCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vYWxsaW5wdXQgICAgICBkaXNhYmxlIHVzZSBvZiAtYWxsaW5wdXQgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF9lYWdlcmx5ICAgZW5hYmxlICB1c2Ugb2YgLWlucHV0X2VhZ2VybHkgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub2lucHV0X2VhZ2VybHkgZGlzYWJsZSB1c2Ugb2YgLWlucHV0X2VhZ2VybHkgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBzc2x0aW1lb3V0Om4gICAgc2V0IC1zc2x0aW1lb3V0IHRvIG4uCiAgICAgICAgICAgICAgICAgICAgICAgc3BlZWRzOnN0ciAgICAgIHNldCAtc3BlZWRzIHRvIHN0ci4KICAgICAgICAgICAgICAgICAgICAgICB3bWR0OnN0ciAgICAgICAgc2V0IC13bWR0IHRvIHN0ci4KICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19wb2ludGVyICAgZW5hYmxlICAtZGVidWdfcG9pbnRlciwgc2FtZSBhcyAiZHAiCiAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z19wb2ludGVyIGRpc2FibGUgLWRlYnVnX3BvaW50ZXIsIHNhbWUgYXMgIm5vZHAiCiAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfa2V5Ym9hcmQgICBlbmFibGUgIC1kZWJ1Z19rZXlib2FyZCwgc2FtZSBhcyAiZGsiCiAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z19rZXlib2FyZCBkaXNhYmxlIC1kZWJ1Z19rZXlib2FyZCwgc2FtZSBhcyAibm9kayIKICAgICAgICAgICAgICAgICAgICAgICBrZXljb2RlOm4gICAgICAgaW5qZWN0IGtleXN0cm9rZSAna2V5Y29kZScgKHhtb2RtYXAgLXBrKQogICAgICAgICAgICAgICAgICAgICAgIGtleWNvZGU6bixkb3duICBpbmplY3QgJ2tleWNvZGUnIChkb3duPTAsMSkKICAgICAgICAgICAgICAgICAgICAgICBrZXlzeW06c3RyICAgICAgaW5qZWN0IGtleXN0cm9rZSAna2V5c3ltJyAobnVtYmVyL25hbWUpCiAgICAgICAgICAgICAgICAgICAgICAga2V5c3ltOnN0cixkb3duIGluamVjdCAna2V5c3ltJyAoZG93bj0wLDEpCiAgICAgICAgICAgICAgICAgICAgICAgcHRyOngseSxtYXNrICAgIGluamVjdCBwb2ludGVyIGV2ZW50IHgsIHksIGJ1dHRvbi1tYXNrCiAgICAgICAgICAgICAgICAgICAgICAgZmFrZWJ1dHRvbmV2ZW50OmJ1dHRvbixkb3duIGRpcmVjdCBYVGVzdEZha2VCdXR0b25FdmVudC4KICAgICAgICAgICAgICAgICAgICAgICBzbGVlcDp0ICAgICAgICAgc2xlZXAgZmxvYXRpbmcgcG9pbnQgdGltZSB0LgogICAgICAgICAgICAgICAgICAgICAgIGdldF94cHJvcDpwICAgICBnZXQgWCBwcm9wZXJ0eSBuYW1lZCAncCcuCiAgICAgICAgICAgICAgICAgICAgICAgc2V0X3hwcm9wOnA6dmFsIHNldCBYIHByb3BlcnR5IG5hbWVkICdwJyB0byAndmFsJy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAtPiBpZD1OTk46cCBmb3IgaGV4L2RlYyB3aW5kb3cgaWQuCiAgICAgICAgICAgICAgICAgICAgICAgd2luaW5mbzppZCAgICAgIGdldCBpbmZvIGFib3V0IFggd2luZG93IGlkLiAgdXNlICdyb290JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3Igcm9vdCB3aW5kb3csIHVzZSAraWQgZm9yIGNoaWxkcmVuLgogICAgICAgICAgICAgICAgICAgICAgIGdyYWJfc3RhdGUgICAgICBnZXQgc3RhdGUgb2YgcG9pbnRlciBhbmQga2V5Ym9hcmQgZ3JhYi4KICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX3BvcyAgICAgcHJpbnQgWFF1ZXJ5UG9pbnRlciB4LHkgY3Vyc29yIHBvc2l0aW9uLgogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfeCAgICAgICBwcmludCBYUXVlcnlQb2ludGVyIHggY3Vyc29yIHBvc2l0aW9uLgogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfeSAgICAgICBwcmludCBYUXVlcnlQb2ludGVyIHkgY3Vyc29yIHBvc2l0aW9uLgogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfc2FtZSAgICBwcmludCBYUXVlcnlQb2ludGVyIHB0ciBvbiBzYW1lIHNjcmVlbi4KICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX3Jvb3QgICAgcHJpbnQgWFF1ZXJ5UG9pbnRlciBjdXJyIHB0ciByb290d2luLgogICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJfbWFzayAgICBwcmludCBYUXVlcnlQb2ludGVyIGJ1dHRvbiBhbmQgbW9kcyBtYXNrCiAgICAgICAgICAgICAgICAgICAgICAgbW91c2VfeCAgICAgICAgIHByaW50IHgxMXZuYydzIGlkZWEgb2YgY3Vyc29yIHBvc2l0aW9uLgogICAgICAgICAgICAgICAgICAgICAgIG1vdXNlX3kgICAgICAgICBwcmludCB4MTF2bmMncyBpZGVhIG9mIGN1cnNvciBwb3NpdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICBub29wICAgICAgICAgICAgZG8gbm90aGluZy4KICAgICAgICAgICAgICAgICAgICAgICBkZWZlcjpuICAgICAgICAgc2V0IC1kZWZlciB0byBuIG1zLHNhbWUgYXMgZGVmZXJ1cGRhdGU6bgogICAgICAgICAgICAgICAgICAgICAgIHdhaXQ6biAgICAgICAgICBzZXQgLXdhaXQgdG8gbiBtcy4KICAgICAgICAgICAgICAgICAgICAgICBleHRyYV9mYnVyOm4gICAgc2V0IC1leHRyYV9mYnVyIHRvIG4uCiAgICAgICAgICAgICAgICAgICAgICAgd2FpdF91aTpmICAgICAgIHNldCAtd2FpdF91aSBmYWN0b3IgdG8gZi4KICAgICAgICAgICAgICAgICAgICAgICBzZXRkZWZlcjpuICAgICAgc2V0IC1zZXRkZWZlciB0byAtMiwtMSwwLDEsIG9yIDIuCiAgICAgICAgICAgICAgICAgICAgICAgd2FpdF9ib2cgICAgICAgIGRpc2FibGUgLW5vd2FpdF9ib2cgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub3dhaXRfYm9nICAgICAgZW5hYmxlICAtbm93YWl0X2JvZyBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHNsb3dfZmI6ZiAgICAgICBzZXQgLXNsb3dfZmIgdG8gZiBzZWNvbmRzLgogICAgICAgICAgICAgICAgICAgICAgIHhyZWZyZXNoOmYgICAgICBzZXQgLXhyZWZyZXNoIHRvIGYgc2Vjb25kcy4KICAgICAgICAgICAgICAgICAgICAgICByZWFkdGltZW91dDpuICAgc2V0IHJlYWQgdGltZW91dCB0byBuIHNlY29uZHMuCiAgICAgICAgICAgICAgICAgICAgICAgbmFwICAgICAgICAgICAgIGVuYWJsZSAgLW5hcCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vbmFwICAgICAgICAgICBkaXNhYmxlIC1uYXAgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBzYjpuICAgICAgICAgICAgc2V0IC1zYiB0byBuIHMsIHNhbWUgYXMgc2NyZWVuX2JsYW5rOm4KICAgICAgICAgICAgICAgICAgICAgICBmYnBtICAgICAgICAgICAgZGlzYWJsZSAtbm9mYnBtIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9mYnBtICAgICAgICAgIGVuYWJsZSAgLW5vZmJwbSBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIGRwbXMgICAgICAgICAgICBkaXNhYmxlIC1ub2RwbXMgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub2RwbXMgICAgICAgICAgZW5hYmxlICAtbm9kcG1zIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgZm9yY2VkcG1zICAgICAgIGVuYWJsZSAgLWZvcmNlZHBtcyBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vZm9yY2VkcG1zICAgICBkaXNhYmxlIC1mb3JjZWRwbXMgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRkcG1zICAgICAgZW5hYmxlICAtY2xpZW50ZHBtcyBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vY2xpZW50ZHBtcyAgICBkaXNhYmxlIC1jbGllbnRkcG1zIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9zZXJ2ZXJkcG1zICAgIGVuYWJsZSAgLW5vc2VydmVyZHBtcyBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcmRwbXMgICAgICBkaXNhYmxlIC1ub3NlcnZlcmRwbXMgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub3VsdHJhZXh0ICAgICAgZW5hYmxlICAtbm91bHRyYWV4dCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIHVsdHJhZXh0ICAgICAgICBkaXNhYmxlIC1ub3VsdHJhZXh0IG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgY2hhdHdpbmRvdyAgICAgIGVuYWJsZSAgbG9jYWwgY2hhdHdpbmRvdyBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vY2hhdHdpbmRvdyAgICBkaXNhYmxlIGxvY2FsIGNoYXR3aW5kb3cgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBjaGF0b24gICAgICAgICAgYmVnaW4gY2hhdCB1c2luZyBsb2NhbCB3aW5kb3cuCiAgICAgICAgICAgICAgICAgICAgICAgY2hhdG9mZiAgICAgICAgIGVuZCAgIGNoYXQgdXNpbmcgbG9jYWwgd2luZG93LgogICAgICAgICAgICAgICAgICAgICAgIHhkYW1hZ2UgICAgICAgICBlbmFibGUgIHhkYW1hZ2UgcG9sbGluZyBoaW50cy4KICAgICAgICAgICAgICAgICAgICAgICBub3hkYW1hZ2UgICAgICAgZGlzYWJsZSB4ZGFtYWdlIHBvbGxpbmcgaGludHMuCiAgICAgICAgICAgICAgICAgICAgICAgeGRfYXJlYTpBICAgICAgIHNldCAteGRfYXJlYSBtYXggcGl4ZWwgYXJlYSB0byAiQSIKICAgICAgICAgICAgICAgICAgICAgICB4ZF9tZW06ZiAgICAgICAgc2V0IC14ZF9tZW0gcmVtZW1icmFuY2UgdG8gImYiCiAgICAgICAgICAgICAgICAgICAgICAgZnM6ZnJhYyAgICAgICAgIHNldCAtZnMgZnJhY3Rpb24gdG8gImZyYWMiLCBlLmcuIDAuNQogICAgICAgICAgICAgICAgICAgICAgIGdhcHM6biAgICAgICAgICBzZXQgLWdhcHMgdG8gbi4KICAgICAgICAgICAgICAgICAgICAgICBncm93Om4gICAgICAgICAgc2V0IC1ncm93IHRvIG4uCiAgICAgICAgICAgICAgICAgICAgICAgZnV6ejpuICAgICAgICAgIHNldCAtZnV6eiB0byBuLgogICAgICAgICAgICAgICAgICAgICAgIHNuYXBmYiAgICAgICAgICBlbmFibGUgIC1zbmFwZmIgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub3NuYXBmYiAgICAgICAgZGlzYWJsZSAtc25hcGZiIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgcmF3ZmI6c3RyICAgICAgIHNldCAtcmF3ZmIgbW9kZSB0byAic3RyIi4KICAgICAgICAgICAgICAgICAgICAgICB1aW5wdXRfYWNjZWw6ZiAgc2V0IHVpbnB1dF9hY2NlbCB0byBmLgogICAgICAgICAgICAgICAgICAgICAgIHVpbnB1dF90aHJlc2g6biBzZXQgdWlucHV0X3RocmVzaCB0byBuLgogICAgICAgICAgICAgICAgICAgICAgIHVpbnB1dF9yZXNldDpuICBzZXQgdWlucHV0X3Jlc2V0IHRvIG4gbXMuCiAgICAgICAgICAgICAgICAgICAgICAgdWlucHV0X2Fsd2F5czpuIHNldCB1aW5wdXRfYWx3YXlzIHRvIDEvMC4KICAgICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc2l2ZTpuICAgc2V0IExpYlZOQ1NlcnZlciAtcHJvZ3Jlc3NpdmUgc2xpY2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0IHBhcmFtZXRlciB0byBuLgogICAgICAgICAgICAgICAgICAgICAgIGRlc2t0b3A6c3RyICAgICBzZXQgLWRlc2t0b3AgbmFtZSB0byBzdHIgZm9yIG5ldyBjbGllbnRzCi4KICAgICAgICAgICAgICAgICAgICAgICByZmJwb3J0Om4gICAgICAgc2V0IC1yZmJwb3J0IHRvIG4uCiAgICAgICAgICAgICAgICAgICAgICAgbWFjbm9zYXZlciAgICAgIGVuYWJsZSAgLW1hY25vc2F2ZXIgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBtYWNzYXZlciAgICAgICAgZGlzYWJsZSAtbWFjbm9zYXZlciBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG1hY25vd2FpdCAgICAgICBlbmFibGUgIC1tYWNub3dhaXQgIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbWFjd2FpdCAgICAgICAgIGRpc2FibGUgLW1hY25vd2FpdCAgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBtYWN3aGVlbDpuICAgICAgc2V0IC1tYWN3aGVlbCB0byBuLgogICAgICAgICAgICAgICAgICAgICAgIG1hY25vc3dhcCAgICAgICBlbmFibGUgIC1tYWNub3N3YXAgbW91c2UgYnV0dG9uIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbWFjc3dhcCAgICAgICAgIGRpc2FibGUgLW1hY25vc3dhcCBtb3VzZSBidXR0b24gbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBtYWNub3Jlc2l6ZSAgICAgZW5hYmxlICAtbWFjbm9yZXNpemUgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBtYWNyZXNpemUgICAgICAgZGlzYWJsZSAtbWFjbm9yZXNpemUgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBtYWNpY29uYW5pbTpuICAgc2V0IC1tYWNpY29uYW5pbSB0byBuLgogICAgICAgICAgICAgICAgICAgICAgIG1hY21lbnUgICAgICAgICBlbmFibGUgIC1tYWNtZW51ICBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG1hY25vbWVudSAgICAgICBkaXNhYmxlIC1tYWNtZW51ICBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG1hY3Vza2JkICAgICAgICBlbmFibGUgIC1tYWN1c2tiZCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG1hY25vdXNrYmQgICAgICBkaXNhYmxlIC1tYWN1c2tiZCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIGh0dHBwb3J0Om4gICAgICBzZXQgLWh0dHBwb3J0IHRvIG4uCiAgICAgICAgICAgICAgICAgICAgICAgaHR0cGRpcjpkaXIgICAgIHNldCAtaHR0cGRpciB0byBkaXIgKGFuZCBlbmFibGUgaHR0cCkuCiAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlaHR0cHByb3h5ICAgZW5hYmxlICAtZW5hYmxlaHR0cHByb3h5IG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgbm9lbmFibGVodHRwcHJveHkgZGlzYWJsZSAtZW5hYmxlaHR0cHByb3h5IG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgYWx3YXlzc2hhcmVkICAgICBlbmFibGUgIC1hbHdheXNzaGFyZWQgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub2Fsd2F5c3NoYXJlZCAgIGRpc2FibGUgLWFsd2F5c3NoYXJlZCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heSBpbnRlcmZlcmUgd2l0aCBvdGhlciBvcHRpb25zKQogICAgICAgICAgICAgICAgICAgICAgIG5ldmVyc2hhcmVkICAgICAgZW5hYmxlICAtbmV2ZXJzaGFyZWQgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICBub25ldmVyc2hhcmVkICAgIGRpc2FibGUgLW5ldmVyc2hhcmVkIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF5IGludGVyZmVyZSB3aXRoIG90aGVyIG9wdGlvbnMpCiAgICAgICAgICAgICAgICAgICAgICAgZG9udGRpc2Nvbm5lY3QgICBlbmFibGUgIC1kb250ZGlzY29ubmVjdCBtb2RlLgogICAgICAgICAgICAgICAgICAgICAgIG5vZG9udGRpc2Nvbm5lY3QgZGlzYWJsZSAtZG9udGRpc2Nvbm5lY3QgbW9kZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtYXkgaW50ZXJmZXJlIHdpdGggb3RoZXIgb3B0aW9ucykKICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z194ZXZlbnRzICAgZW5hYmxlICBkZWJ1Z2dpbmcgWCBldmVudHMuCiAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z194ZXZlbnRzIGRpc2FibGUgZGVidWdnaW5nIFggZXZlbnRzLgogICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3hkYW1hZ2UgICBlbmFibGUgIGRlYnVnZ2luZyBYIERBTUFHRSBtZWNoYW5pc20uCiAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z194ZGFtYWdlIGRpc2FibGUgZGVidWdnaW5nIFggREFNQUdFIG1lY2hhbmlzbS4KICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z193aXJlZnJhbWUgZW5hYmxlICAgZGVidWdnaW5nIHdpcmVmcmFtZSBtZWNoYW5pc20uCiAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z193aXJlZnJhbWUgZGlzYWJsZSBkZWJ1Z2dpbmcgd2lyZWZyYW1lIG1lY2hhbmlzbS4KICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zY3JvbGwgICAgZW5hYmxlICBkZWJ1Z2dpbmcgc2Nyb2xsY29weSBtZWNoYW5pc20uCiAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z19zY3JvbGwgIGRpc2FibGUgZGVidWdnaW5nIHNjcm9sbGNvcHkgbWVjaGFuaXNtLgogICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3RpbGVzICAgICBlbmFibGUgIC1kZWJ1Z190aWxlcwogICAgICAgICAgICAgICAgICAgICAgIG5vZGVidWdfdGlsZXMgICBkaXNhYmxlIC1kZWJ1Z190aWxlcwogICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX2dyYWJzICAgICBlbmFibGUgIC1kZWJ1Z19ncmFicwogICAgICAgICAgICAgICAgICAgICAgIG5vZGVidWdfZ3JhYnMgICBkaXNhYmxlIC1kZWJ1Z19ncmFicwogICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3NlbCAgICAgICBlbmFibGUgIC1kZWJ1Z19zZWwKICAgICAgICAgICAgICAgICAgICAgICBub2RlYnVnX3NlbCAgICAgZGlzYWJsZSAtZGVidWdfc2VsCiAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfbmNhY2hlICAgIGVuYWJsZSAgLWRlYnVnX25jYWNoZQogICAgICAgICAgICAgICAgICAgICAgIG5vZGVidWdfbmNhY2hlICBkaXNhYmxlIC1kZWJ1Z19uY2FjaGUKICAgICAgICAgICAgICAgICAgICAgICBkYmcgICAgICAgICAgICAgZW5hYmxlICAtZGJnIGNyYXNoIHNoZWxsCiAgICAgICAgICAgICAgICAgICAgICAgbm9kYmcgICAgICAgICAgIGRpc2FibGUgLWRiZyBjcmFzaCBzaGVsbAoKICAgICAgICAgICAgICAgICAgICAgICBub3JlbW90ZSAgICAgICAgZGlzYWJsZSB0aGUgLXJlbW90ZSBjb21tYW5kIHByb2Nlc3NpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGNhbm5vdCBiZSB0dXJuZWQgYmFjayBvbi4KCiAgICAgICAgICAgICAgICAgICAgICAgYmN4X3hhdHRhY2g6c3RyICBUaGlzIHJlbW90ZSBjb250cm9sIGNvbW1hbmQgaXMgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgdXNlIHdpdGggdGhlIEJBUkNPIHhhdHRhY2ggcHJvZ3JhbSBvciB0aGUgeDJ4IHByb2dyYW0uCiAgICAgICAgICAgICAgICAgICAgICAgQm90aCBvZiB0aGVzZSBwcm9ncmFtcyBhcmUgZm9yICdwb2ludGVyIGFuZCBrZXlib2FyZCcKICAgICAgICAgICAgICAgICAgICAgICBzaGFyaW5nIGJldHdlZW4gc2VwYXJhdGUgWCBkaXNwbGF5cy4gIEluIGdlbmVyYWwgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgdHdvIGRpc3BsYXlzIGFyZSB1c3VhbGx5IG5lYXJieSwgZS5nLiBvbiB0aGUgc2FtZSBkZXNrLAogICAgICAgICAgICAgICAgICAgICAgIGFuZCB0aGlzIGFsbG93cyB0aGUgdXNlciB0byBzaGFyZSBhIHNpbmdsZSBwb2ludGVyIGFuZAogICAgICAgICAgICAgICAgICAgICAgIGtleWJvYXJkIGJldHdlZW4gdGhlbS4gIFRoZSB1c2VyIG1vdmVzIHRoZSBtb3VzZSB0bwogICAgICAgICAgICAgICAgICAgICAgIGFuIGVkZ2UgYW5kIHRoZW4gdGhlIG1vdXNlIHBvaW50ZXIgYXBwZWFycyB0byAnanVtcCcKICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgb3RoZXIgZGlzcGxheSBzY3JlZW4uICBUaHVzIGl0IGVtdWxhdGVzIHdoYXQgYQogICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZSBYIHNlcnZlciB3b3VsZCBkbyBmb3IgdHdvIHNjcmVlbnMgKGUuZy4gOjAuMCBhbmQKICAgICAgICAgICAgICAgICAgICAgICA6MC4xKSBUaGUgaWxsdXNpb24gb2YgYSBzaW5nbGUgWHNlcnZlciB3aXRoIG11bHRpcGxlCiAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVucyBpcyBhY2hpZXZlZCBieSBmb3J3YXJkaW5nIGV2ZW50cyB0byB0aGUgMm5kCiAgICAgICAgICAgICAgICAgICAgICAgb25lIHZpYSB0aGUgWFRFU1QgZXh0ZW5zaW9uLgoKICAgICAgICAgICAgICAgICAgICAgICBXaGF0IHRoZSB4MTF2bmMgYmN4X3hhdHRhY2ggY29tbWFuZCBkb2VzIGlzIHRvIHBlcmZvcm0KICAgICAgICAgICAgICAgICAgICAgICBzb21lIHBvaW50ZXIgbW92ZW1lbnRzIHRvIHRyeSB0byBJTkRVQ0UgeGF0dGFjaC94MngKICAgICAgICAgICAgICAgICAgICAgICB0byAnanVtcCcgdG8gdGhlIG90aGVyIGRpc3BsYXkuICBJbiB3aGF0IGZvbGxvd3MgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgJ21hc3RlcicgZGlzcGxheSByZWZlcnMgdG8gdGhlIG9uZSB0aGF0IHdoZW4gaXQgaGFzCiAgICAgICAgICAgICAgICAgICAgICAgJ2ZvY3VzJyBpdCBpcyBiYXNpY2FsbHkgZG9pbmcgbm90aGluZyBiZXNpZGVzIHdhdGNoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgZm9yIHRoZSBtb3VzZSB0byBnbyBvdmVyIGFuIGVkZ2UuICBUaGUgJ3NsYXZlJwogICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXkgcmVmZXJzIHRvIHRoZSBvbmUgdG8gd2hpY2ggdGhlIG1vdXNlIGFuZAogICAgICAgICAgICAgICAgICAgICAgIGtleWJvYXJkIGlzIHJlZGlyZWN0ZWQgdG8gb25jZSBhbiBlZGdlIGluIHRoZSBtYXN0ZXIKICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBjcm9zc2VkLiAgTm90ZSB0aGF0IHRoZSB4MTF2bmMgZXhlY3V0aW5nIHRoZQogICAgICAgICAgICAgICAgICAgICAgIGJjeF94YXR0YWNoIGNvbW1hbmQgTVVTVCBiZSB0aGUgb25lIGNvbm5lY3RlZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICAqbWFzdGVyKiBkaXNwbGF5LgoKICAgICAgICAgICAgICAgICAgICAgICBBbHNvIG5vdGUgdGhhdCB3aGVuIGlucHV0IGlzIGJlaW5nIHJlZGlyZWN0ZWQgKHZpYQogICAgICAgICAgICAgICAgICAgICAgIFhURVNUKSBmcm9tIHRoZSBtYXN0ZXIgZGlzcGxheSB0byB0aGUgc2xhdmUgZGlzcGxheSwKICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFzdGVyIGRpc3BsYXkncyBwb2ludGVyIGFuZCBrZXlib2FyZCBhcmUgKmdyYWJiZWQqCiAgICAgICAgICAgICAgICAgICAgICAgYnkgeGF0dGFjaC94MnguICB4MTF2bmMgY2FuIHVzZSB0aGlzIGluZm8gdG8gdmVyaWZ5IHRoYXQKICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFzdGVyL3NsYXZlIG1vZGUgY2hhbmdlIGhhcyB0YWtlbiBwbGFjZSBjb3JyZWN0bHkuCiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHNwZWNpZnkgdGhlICJpZm5lZWRlZCIgb3B0aW9uIChzZWUgYmVsb3cpCiAgICAgICAgICAgICAgICAgICAgICAgYW5kIHRoZSBpbml0aWFsIGdyYWIgc3RhdGUgaXMgdGhhdCBvZiB0aGUgZGVzaXJlZAogICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIHN0YXRlLCB0aGVuIG5vIHBvaW50ZXIgbW92ZW1lbnRzIGFyZSBpbmplY3RlZAogICAgICAgICAgICAgICAgICAgICAgIGFuZCAiRE9ORSxHUkFCX09LIiBpcyByZXR1cm5lZC4KCiAgICAgICAgICAgICAgICAgICAgICAgInN0ciIgbXVzdCBjb250YWluIG9uZSBvZiAidXAiLCAiZG93biIsICJsZWZ0IiwKICAgICAgICAgICAgICAgICAgICAgICBvciAicmlnaHQiIHRvIGluZGljYXRlIHRoZSBkaXJlY3Rpb24gb2YgdGhlICdqdW1wJy4KICAgICAgICAgICAgICAgICAgICAgICAic3RyIiBtdXN0IGFsc28gY29udGFpbiBvbmUgb2YgIm1hc3Rlcl90b19zbGF2ZSIKICAgICAgICAgICAgICAgICAgICAgICBvciAic2xhdmVfdG9fbWFzdGVyIiB0byBpbmRpY2F0ZSB0aGUgdHlwZSBvZiBtb2RlCiAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlIGluZHVjZWQgYnkgdGhlIGp1bXAuICBVc2UgIk0yUyIgYW5kICJTMk0iCiAgICAgICAgICAgICAgICAgICAgICAgYXMgc2hvcnRlciBhbGlhc2VzLgoKICAgICAgICAgICAgICAgICAgICAgICAic3RyIiBtYXkgYmUgYSAiKyIgc2VwYXJhdGVkIGxpc3Qgb2YgYWRkaXRpb25hbAogICAgICAgICAgICAgICAgICAgICAgIHR1bmluZyBvcHRpb25zLiAgVGhlICJzaGlmdD1uIiBvcHRpb24gaW5kaWNhdGVzIGFuCiAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0IHNoaWZ0IHBvc2l0aW9uIGF3YXkgZnJvbSAoMCwwKSAoZGVmYXVsdCAyMCkuCiAgICAgICAgICAgICAgICAgICAgICAgImZpbmFsPXgreSIgc3BlY2lmaWVzIHRoZSBmaW5hbCBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yCiAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGVuZCBvZiB0aGUgbm9ybWFsIG1vdmUgc2VxdWVuY2U7IGRlZmF1bHQgMzArMzAuCiAgICAgICAgICAgICAgICAgICAgICAgImV4dHJhX21vdmU9eCt5IiBtZWFucyB0byBkbyBvbmUgbW9yZSBwb2ludGVyIG1vdmUKICAgICAgICAgICAgICAgICAgICAgICBhZnRlciAiZmluYWwiIHRvIHgreS4gICJkdD1uIiBzZXRzIHRoZSBzbGVlcCB0aW1lCiAgICAgICAgICAgICAgICAgICAgICAgaW4gbWlsbGlzZWNvbmRzIGJldHdlZW4gcG9pbnRlciBtb3ZlcyAoZGVmYXVsdDogNDBtcykKICAgICAgICAgICAgICAgICAgICAgICAicmV0cnk9biIgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWVzIGlmCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdyYWIgc3RhdGUgY2hhbmdlIGZhaWxzLiAiaWZuZWVkZWQiIG1lYW5zIHRvIG5vdAogICAgICAgICAgICAgICAgICAgICAgIGFwcGx5IHRoZSBwb2ludGVyIG1vdmVtZW50cyBpZiB0aGUgaW5pdGlhbCBncmFiIHN0YXRlIGlzCiAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBvZiB0aGUgZGVzaXJlZCBmaW5hbCBzdGF0ZS4gIm5vZ3JhYmNoZWNrIiBtZWFucwogICAgICAgICAgICAgICAgICAgICAgIHRvIG5vdCBjaGVjayBpZiB0aGUgZ3JhYiBzdGF0ZSBjaGFuZ2VkIGFzIGV4cGVjdGVkIGFuZAogICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYXBwbHkgdGhlIHBvaW50ZXIgbW92ZW1lbnRzIChkZWZhdWx0IGlzIHRvIGNoZWNrCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIGdyYWIgc3RhdGVzLikKCiAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IGRvIG5vdCBzcGVjaWZ5ICJ1cCIsIGV0Yy4sIHRvIGJjeF94YXR0YWNoCiAgICAgICAgICAgICAgICAgICAgICAgbm90aGluZyB3aWxsIGJlIGF0dGVtcHRlZCBhbmQgdGhlIGNvbW1hbmQgcmV0dXJucwogICAgICAgICAgICAgICAgICAgICAgIHRoZSBzdHJpbmcgRkFJTCxOT19ESVJFQ1RJT05fU1BFQ0lGSUVELiAgSWYgeW91IGRvCiAgICAgICAgICAgICAgICAgICAgICAgbm90IHNwZWNpZnkgIm1hc3Rlcl90b19zbGF2ZSIgb3IgIk0yUyIsIGV0Yy4sIHRvCiAgICAgICAgICAgICAgICAgICAgICAgYmN4X3hhdHRhY2ggbm90aGluZyB3aWxsIGJlIGF0dGVtcHRlZCBhbmQgdGhlIGNvbW1hbmQKICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIHRoZSBzdHJpbmcgRkFJTCxOT19NT0RFX0NIQU5HRV9TUEVDSUZJRUQuCgogICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIHJldHVybmVkIHN0cmluZyB3aWxsIGNvbnRhaW4gIkRPTkUiLgogICAgICAgICAgICAgICAgICAgICAgIEl0IHdpbGwgYmUgIkRPTkUsR1JBQl9PSyIgaWYgdGhlIGdyYWIgc3RhdGUgY2hhbmdlZAogICAgICAgICAgICAgICAgICAgICAgIGFzIGV4cGVjdGVkIChvciBpZiAiaWZuZWVkZWQiIHdhcyBzdXBwbGllZCBhbmQKICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5pdGlhbCBncmFiIHN0YXRlIHdhcyBhbHJlYWR5IHRoZSBkZXNpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgb25lLikgIElmIHRoZSBpbml0aWFsIGdyYWIgc3RhdGUgd2FzIGluY29ycmVjdCwKICAgICAgICAgICAgICAgICAgICAgICBidXQgdGhlIGZpbmFsIGdyYWIgc3RhdGUgd2FzIGNvcnJlY3QgdGhlbiBpdCBpcwogICAgICAgICAgICAgICAgICAgICAgICJET05FLEdSQUJfRkFJTF9JTklUIi4gIElmIHRoZSBpbml0aWFsIGdyYWIgc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICB3YXMgY29ycmVjdCwgYnV0IHRoZSBmaW5hbCBncmFiIHN0YXRlIHdhcyBpbmNvcnJlY3QKICAgICAgICAgICAgICAgICAgICAgICB0aGVuIGl0IGlzICJET05FLEdSQUJfRkFJTF9GSU5BTCIuICBJZiBib3RoIGFyZQogICAgICAgICAgICAgICAgICAgICAgIGluY29ycmVjdCBpdCB3aWxsIGJlICJET05FLEdSQUJfRkFJTCIuICBVbmRlciBncmFiCiAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZSB0aGUgc3RyaW5nIHdpbGwgYmUgZm9sbG93ZWQgYnkgIjpwMSxrMS1wMixrMiIKICAgICAgICAgICAgICAgICAgICAgICB3aGVyZSAgcDEsazEgaW5kaWNhdGVzIHRoZSBpbml0aWFsIHBvaW50ZXIgYW5kIGtleWJvYXJkCiAgICAgICAgICAgICAgICAgICAgICAgZ3JhYiBzdGF0ZXMgYW5kIHAyLGsyIHRoZSBmaW5hbCBvbmVzLiBJZiBHUkFCX0ZBSUwgb3IKICAgICAgICAgICAgICAgICAgICAgICBHUkFCX0ZBSUxfRklOQUwgb2NjdXJzLCB0aGUgYWN0aW9uIHdpbGwgYmUgcmV0cmllZCB1cAogICAgICAgICAgICAgICAgICAgICAgIHRvIDMgdGltZXM7IHRyeWluZyB0byByZXNldCB0aGUgc3RhdGUgYW5kIHNsZWVwaW5nIGEKICAgICAgICAgICAgICAgICAgICAgICBiaXQgYmV0d2VlbiBlYWNoIHRyeS4gIFNldCByZXRyeT1uIHRvIGFkanVzdCB0aGUgbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgICAgb2YgcmV0cmllcywgemVybyB0byBkaXNhYmxlIHJldHJpZXMuCgogICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGVzOgogICAgICAgICAgICAgICAgICAgICAgICAgICAtUiBiY3hfeGF0dGFjaDpkb3duK00yUwogICAgICAgICAgICAgICAgICAgICAgICAgICAtUiBiY3hfeGF0dGFjaDp1cCtTMk0KICAgICAgICAgICAgICAgICAgICAgICAgICAgLVIgYmN4X3hhdHRhY2g6dXArUzJNK25vZ3JhYmNoZWNrK2R0PTMwCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC1SIGJjeF94YXR0YWNoOmRvd24rTTJTK2V4dHJhX21vdmU9MTAwKzEwMAoKICAgICAgICAgICAgICAgICAgICAgICBvciB1c2UgLVEgaW5zdGVhZCBvZiAtUiB0byByZXRyaWV2ZSB0aGUgcmVzdWx0IHRleHQuCgogICAgICAgICAgICAgICAgICAgICAgIEVuZCBvZiB0aGUgYmN4X3hhdHRhY2g6c3RyIGRlc2NyaXB0aW9uLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgdm5jY29ubmVjdCgxKSBjb21tYW5kIGZyb20gc3RhbmRhcmQgVk5DCiAgICAgICAgICAgICAgICAgICAgICAgZGlzdHJpYnV0aW9ucyBtYXkgYWxzbyBiZSB1c2VkIGlmIHN0cmluZyBpcyBwcmVmaXhlZAogICAgICAgICAgICAgICAgICAgICAgIHdpdGggImNtZD0iIEUuZy4gJ3ZuY2Nvbm5lY3QgY21kPXN0b3AnLiAgVW5kZXIgc29tZQogICAgICAgICAgICAgICAgICAgICAgIGNpcmN1bXN0YW5jZXMgeHByb3AoMSkgY2FuIHVzZWQgaWYgaXQgc3VwcG9ydHMgLXNldAogICAgICAgICAgICAgICAgICAgICAgIChzZWUgdGhlIEZBUSkuCgogICAgICAgICAgICAgICAgICAgICAgIElmICItY29ubmVjdCAvcGF0aC90by9maWxlIiBoYXMgYmVlbiBzdXBwbGllZCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAgICBydW5uaW5nIHgxMXZuYyBzZXJ2ZXIgdGhlbiB0aGF0IGZpbGUgY2FuIGJlIHVzZWQgYXMgYQogICAgICAgICAgICAgICAgICAgICAgIGNvbW11bmljYXRpb24gY2hhbm5lbCAodGhpcyBpcyB0aGUgb25seSB3YXkgdG8gcmVtb3RlCiAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbCBvbmUgb2YgbWFueSB4MTF2bmMncyBwb2xsaW5nIHRoZSBzYW1lIFggZGlzcGxheSkKICAgICAgICAgICAgICAgICAgICAgICBTaW1wbHkgcnVuOiAneDExdm5jIC1jb25uZWN0IC9wYXRoL3RvL2ZpbGUgLXJlbW90ZSAuLi4nCiAgICAgICAgICAgICAgICAgICAgICAgb3IgeW91IGNhbiBkaXJlY3RseSB3cml0ZSB0byB0aGUgZmlsZSB2aWEgc29tZXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgbGlrZTogImVjaG8gY21kPXN0b3AgPiAvcGF0aC90by9maWxlIiwgZXRjLgoKLXF1ZXJ5IHZhcmlhYmxlICAgICAgICBMaWtlIC1yZW1vdGUsIGV4Y2VwdCBqdXN0IHF1ZXJ5IHRoZSB2YWx1ZSBvZgogICAgICAgICAgICAgICAgICAgICAgICJ2YXJpYWJsZSIuICAiLVEiIGlzIGFuIGFsaWFzIGZvciAiLXF1ZXJ5Ii4KICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXBsZSBxdWVyaWVzIGNhbiBiZSBkb25lIGJ5IHNlcGFyYXRpbmcgdmFyaWFibGVzCiAgICAgICAgICAgICAgICAgICAgICAgYnkgY29tbWFzLCBlLmcuIC1xdWVyeSB2YXIxLHZhcjIuIFRoZSByZXN1bHRzIGNvbWUKICAgICAgICAgICAgICAgICAgICAgICBiYWNrIGluIHRoZSBmb3JtIGFucz12YXIxOnZhbHVlMSxhbnM9dmFyMjp2YWx1ZTIsLi4uCiAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHN0YW5kYXJkIG91dHB1dC4gIElmIGEgdmFyaWFibGUgaXMgcmVhZC1vbmx5LAogICAgICAgICAgICAgICAgICAgICAgIGl0IGNvbWVzIGJhY2sgd2l0aCBwcmVmaXggImFybz0iIGluc3RlYWQgb2YgImFucz0iLgoKICAgICAgICAgICAgICAgICAgICAgICBTb21lIC1yZW1vdGUgY29tbWFuZHMgYXJlIHB1cmUgYWN0aW9ucyB0aGF0IGRvIG5vdCBtYWtlCiAgICAgICAgICAgICAgICAgICAgICAgc2Vuc2UgYXMgdmFyaWFibGVzLCBlLmcuICJzdG9wIiBvciAiZGlzY29ubmVjdCIsIGluCiAgICAgICAgICAgICAgICAgICAgICAgdGhlc2UgY2FzZXMgdGhlIHZhbHVlIHJldHVybmVkIGlzICJOL0EiLiAgVG8gZGlyZWN0IGEKICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSBzdHJhaWdodCB0byB0aGUgWDExVk5DX1JFTU9URSBwcm9wZXJ0eSBvciBjb25uZWN0CiAgICAgICAgICAgICAgICAgICAgICAgZmlsZSB1c2UgInFyeT0uLi4iIGluc3RlYWQgb2YgImNtZD0uLi4iCgogICAgICAgICAgICAgICAgICAgICAgIGFucz0gc3RvcCBxdWl0IGV4aXQgc2h1dGRvd24gcGluZyByZXNlbmRfY3V0YnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgcmVzZW5kX2NsaXBib2FyZCByZXNlbmRfcHJpbWFyeSBibGFja2VuIHplcm8gcmVmcmVzaAogICAgICAgICAgICAgICAgICAgICAgIHJlc2V0IGNsb3NlIGRpc2Nvbm5lY3QgaWRfY21kIGlkIHNpZCB3YWl0bWFwcGVkCiAgICAgICAgICAgICAgICAgICAgICAgbm93YWl0bWFwcGVkIGNsaXAgZmxhc2hjbWFwIG5vZmxhc2hjbWFwIHNoaWZ0Y21hcAogICAgICAgICAgICAgICAgICAgICAgIHRydWVjb2xvciBub3RydWVjb2xvciBvdmVybGF5IG5vb3ZlcmxheSBvdmVybGF5X2N1cnNvcgogICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlfeWVzY3Vyc29yIG5vb3ZlcmxheV9ub2N1cnNvciBub292ZXJsYXlfY3Vyc29yCiAgICAgICAgICAgICAgICAgICAgICAgbm9vdmVybGF5X3llc2N1cnNvciBvdmVybGF5X25vY3Vyc29yIDh0bzI0IG5vOHRvMjQKICAgICAgICAgICAgICAgICAgICAgICA4dG8yNF9vcHRzIDI0dG8zMiBubzI0dG8zMiB2aXN1YWwgc2NhbGUgc2NhbGVfY3Vyc29yCiAgICAgICAgICAgICAgICAgICAgICAgdmlld29ubHkgbm92aWV3b25seSBzaGFyZWQgbm9zaGFyZWQgZm9yZXZlciBub2ZvcmV2ZXIKICAgICAgICAgICAgICAgICAgICAgICBvbmNlIHRpbWVvdXQgdGlnaHRmaWxleGZlciBub3RpZ2h0ZmlsZXhmZXIgdWx0cmFmaWxleGZlcgogICAgICAgICAgICAgICAgICAgICAgIG5vdWx0cmFmaWxleGZlciByZmJ2ZXJzaW9uIGRlbnkgbG9jayBub2RlbnkgdW5sb2NrIGF2YWhpCiAgICAgICAgICAgICAgICAgICAgICAgbWRucyB6ZXJvY29uZiBub2F2YWhpIG5vbWRucyBub3plcm9jb25mIGNvbm5lY3QgcHJveHkKICAgICAgICAgICAgICAgICAgICAgICBhbGxvd29uY2UgYWxsb3cgbm9pcHY2IGlwdjYgbm9pcHY0IGlwdjQgbm82IDYgbG9jYWxob3N0CiAgICAgICAgICAgICAgICAgICAgICAgbm9sb2NhbGhvc3QgbGlzdGVuIGxvb2t1cCBub2xvb2t1cCBhY2NlcHQgYWZ0ZXJhY2NlcHQKICAgICAgICAgICAgICAgICAgICAgICBnb25lIHNobSBub3NobSBmbGlwYnl0ZW9yZGVyIG5vZmxpcGJ5dGVvcmRlciBvbmV0aWxlCiAgICAgICAgICAgICAgICAgICAgICAgbm9vbmV0aWxlIHNvbGlkX2NvbG9yIHNvbGlkIG5vc29saWQgYmxhY2tvdXQgeGluZXJhbWEKICAgICAgICAgICAgICAgICAgICAgICBub3hpbmVyYW1hIHh0cmFwIG5veHRyYXAgeHJhbmRyIG5veHJhbmRyIHhyYW5kcl9tb2RlCiAgICAgICAgICAgICAgICAgICAgICAgcm90YXRlIHBhZGdlb20gcXVpZXQgcSBub3F1aWV0IG1vZHR3ZWFrIG5vbW9kdHdlYWsgeGtiCiAgICAgICAgICAgICAgICAgICAgICAgbm94a2IgY2Fwc2xvY2sgbm9jYXBzbG9jayBza2lwX2xvY2trZXlzIG5vc2tpcF9sb2Nra2V5cwogICAgICAgICAgICAgICAgICAgICAgIHNraXBfa2V5Y29kZXMgc2xvcHB5X2tleXMgbm9zbG9wcHlfa2V5cyBza2lwX2R1cHMKICAgICAgICAgICAgICAgICAgICAgICBub3NraXBfZHVwcyBhZGRfa2V5c3ltcyBub2FkZF9rZXlzeW1zIGNsZWFyX21vZHMKICAgICAgICAgICAgICAgICAgICAgICBub2NsZWFyX21vZHMgY2xlYXJfa2V5cyBub2NsZWFyX2tleXMgY2xlYXJfYWxsCiAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJfbG9ja3Mga2V5c3RhdGUgcmVtYXAgcmVwZWF0IG5vcmVwZWF0IGZiIG5vZmIgYmVsbAogICAgICAgICAgICAgICAgICAgICAgIG5vYmVsbCBzZW5kYmVsbCBzZWwgbm9zZWwgcHJpbWFyeSBub3ByaW1hcnkgc2V0cHJpbWFyeQogICAgICAgICAgICAgICAgICAgICAgIG5vc2V0cHJpbWFyeSBjbGlwYm9hcmQgbm9jbGlwYm9hcmQgc2V0Y2xpcGJvYXJkCiAgICAgICAgICAgICAgICAgICAgICAgbm9zZXRjbGlwYm9hcmQgc2VsZGlyIGN1cnNvcnNoYXBlIG5vY3Vyc29yc2hhcGUKICAgICAgICAgICAgICAgICAgICAgICBjdXJzb3Jwb3Mgbm9jdXJzb3Jwb3MgY3Vyc29yX2RyYWcgbm9jdXJzb3JfZHJhZyBjdXJzb3IKICAgICAgICAgICAgICAgICAgICAgICBzaG93X2N1cnNvciBub3Nob3dfY3Vyc29yIG5vY3Vyc29yIGFycm93IHhmaXhlcyBub3hmaXhlcwogICAgICAgICAgICAgICAgICAgICAgIHhkYW1hZ2Ugbm94ZGFtYWdlIHhkX2FyZWEgeGRfbWVtIGFscGhhY3V0IGFscGhhZnJhYwogICAgICAgICAgICAgICAgICAgICAgIGFscGhhcmVtb3ZlIG5vYWxwaGFyZW1vdmUgYWxwaGFibGVuZCBub2FscGhhYmxlbmQKICAgICAgICAgICAgICAgICAgICAgICB4d2FycHBvaW50ZXIgeHdhcnAgbm94d2FycHBvaW50ZXIgbm94d2FycCBhbHdheXNfaW5qZWN0CiAgICAgICAgICAgICAgICAgICAgICAgbm9hbHdheXNfaW5qZWN0IGJ1dHRvbm1hcCBkcmFnZ2luZyBub2RyYWdnaW5nIG5jYWNoZV9jcgogICAgICAgICAgICAgICAgICAgICAgIG5vbmNhY2hlX2NyIG5jYWNoZV9ub19tb3ZlcmFpc2Ugbm9uY2FjaGVfbm9fbW92ZXJhaXNlCiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlX25vX2R0Y2hhbmdlIG5vbmNhY2hlX25vX2R0Y2hhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlX25vX3Jvb3RwaXhtYXAgbm9uY2FjaGVfbm9fcm9vdHBpeG1hcAogICAgICAgICAgICAgICAgICAgICAgIG5jYWNoZV9yZXNldF9yb290cGl4bWFwIG5jcnAgbmNhY2hlX2tlZXBfYW5pbXMKICAgICAgICAgICAgICAgICAgICAgICBub25jYWNoZV9rZWVwX2FuaW1zIG5jYWNoZV9vbGRfd20gbm9uY2FjaGVfb2xkX3dtCiAgICAgICAgICAgICAgICAgICAgICAgbmNhY2hlX3BhZCBuY2FjaGUgbm9uY2FjaGUgbmNhY2hlX3NpemUgZGVidWdfbmNhY2hlCiAgICAgICAgICAgICAgICAgICAgICAgbm9kZWJ1Z19uY2FjaGUgd2lyZWZyYW1lX21vZGUgd2lyZWZyYW1lIHdmIG5vd2lyZWZyYW1lCiAgICAgICAgICAgICAgICAgICAgICAgbm93ZiB3aXJlZnJhbWVsb2NhbCB3Zmwgbm93aXJlZnJhbWVsb2NhbCBub3dmbAogICAgICAgICAgICAgICAgICAgICAgIHdpcmVjb3B5cmVjdCB3Y3Igbm93aXJlY29weXJlY3Qgbm93Y3Igc2NyX2FyZWEKICAgICAgICAgICAgICAgICAgICAgICBzY3Jfc2tpcCBzY3JfaW5jIHNjcl9rZXlzIHNjcl90ZXJtIHNjcl9rZXlyZXBlYXQKICAgICAgICAgICAgICAgICAgICAgICBzY3JfcGFybXMgc2Nyb2xsY29weXJlY3Qgc2NyIG5vc2Nyb2xsY29weXJlY3QKICAgICAgICAgICAgICAgICAgICAgICBub3NjciBmaXhzY3JlZW4gbm94cmVjb3JkIHhyZWNvcmQgcmVzZXRfcmVjb3JkCiAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcl9tb2RlIHBtIGlucHV0X3NraXAgYWxsaW5wdXQgbm9hbGxpbnB1dAogICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2VhZ2VybHkgbm9pbnB1dF9lYWdlcmx5IGlucHV0IGdyYWJrYmQgbm9ncmFia2JkCiAgICAgICAgICAgICAgICAgICAgICAgZ3JhYnB0ciBub2dyYWJwdHIgZ3JhYmFsd2F5cyBub2dyYWJhbHdheXMgZ3JhYmxvY2FsCiAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50X2lucHV0IHNzbHRpbWVvdXQgc3BlZWRzIHdtZHQgZGVidWdfcG9pbnRlciBkcAogICAgICAgICAgICAgICAgICAgICAgIG5vZGVidWdfcG9pbnRlciBub2RwIGRlYnVnX2tleWJvYXJkIGRrIG5vZGVidWdfa2V5Ym9hcmQKICAgICAgICAgICAgICAgICAgICAgICBub2RrIGtleWNvZGUga2V5c3ltIHB0ciBmYWtlYnV0dG9uZXZlbnQgc2xlZXAgZ2V0X3hwcm9wCiAgICAgICAgICAgICAgICAgICAgICAgc2V0X3hwcm9wIHdpbmluZm8gYmN4X3hhdHRhY2ggZGVmZXJ1cGRhdGUgZGVmZXIKICAgICAgICAgICAgICAgICAgICAgICBzZXRkZWZlciBleHRyYV9mYnVyIHdhaXRfdWkgd2FpdF9ib2cgbm93YWl0X2JvZwogICAgICAgICAgICAgICAgICAgICAgIHNsb3dfZmIgeHJlZnJlc2ggd2FpdCByZWFkdGltZW91dCBuYXAgbm9uYXAgc2IKICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5fYmxhbmsgZmJwbSBub2ZicG0gZHBtcyBub2RwbXMgY2xpZW50ZHBtcwogICAgICAgICAgICAgICAgICAgICAgIG5vY2xpZW50ZHBtcyBmb3JjZWRwbXMgbm9mb3JjZWRwbXMgbm9zZXJ2ZXJkcG1zCiAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyZHBtcyBub3VsdHJhZXh0IHVsdHJhZXh0IGNoYXR3aW5kb3cgbm9jaGF0d2luZG93CiAgICAgICAgICAgICAgICAgICAgICAgY2hhdG9uIGNoYXRvZmYgZnMgZ2FwcyBncm93IGZ1enogc25hcGZiIG5vc25hcGZiCiAgICAgICAgICAgICAgICAgICAgICAgcmF3ZmIgdWlucHV0X2FjY2VsIHVpbnB1dF90aHJlc2ggdWlucHV0X3Jlc2V0CiAgICAgICAgICAgICAgICAgICAgICAgdWlucHV0X2Fsd2F5cyBwcm9ncmVzc2l2ZSByZmJwb3J0IGh0dHAgbm9odHRwIGh0dHBwb3J0CiAgICAgICAgICAgICAgICAgICAgICAgaHR0cGRpciBlbmFibGVodHRwcHJveHkgbm9lbmFibGVodHRwcHJveHkgYWx3YXlzc2hhcmVkCiAgICAgICAgICAgICAgICAgICAgICAgbm9hbHdheXNzaGFyZWQgbmV2ZXJzaGFyZWQgbm9hbHdheXNzaGFyZWQgZG9udGRpc2Nvbm5lY3QKICAgICAgICAgICAgICAgICAgICAgICBub2RvbnRkaXNjb25uZWN0IGRlc2t0b3AgZGVidWdfeGV2ZW50cyBub2RlYnVnX3hldmVudHMKICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z194ZXZlbnRzIGRlYnVnX3hkYW1hZ2Ugbm9kZWJ1Z194ZGFtYWdlCiAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfeGRhbWFnZSBkZWJ1Z193aXJlZnJhbWUgbm9kZWJ1Z193aXJlZnJhbWUKICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z193aXJlZnJhbWUgZGVidWdfc2Nyb2xsIG5vZGVidWdfc2Nyb2xsIGRlYnVnX3Njcm9sbAogICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3RpbGVzIGRidCBub2RlYnVnX3RpbGVzIG5vZGJ0IGRlYnVnX3RpbGVzCiAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfZ3JhYnMgbm9kZWJ1Z19ncmFicyBkZWJ1Z19zZWwgbm9kZWJ1Z19zZWwgZGJnCiAgICAgICAgICAgICAgICAgICAgICAgbm9kYmcgbWFjbm9zYXZlciBtYWNzYXZlciBub21hY25vc2F2ZXIgbWFjbm93YWl0IG1hY3dhaXQKICAgICAgICAgICAgICAgICAgICAgICBub21hY25vd2FpdCBtYWN3aGVlbCBtYWNub3N3YXAgbWFjc3dhcCBub21hY25vc3dhcAogICAgICAgICAgICAgICAgICAgICAgIG1hY25vcmVzaXplIG1hY3Jlc2l6ZSBub21hY25vcmVzaXplIG1hY2ljb25hbmltIG1hY21lbnUKICAgICAgICAgICAgICAgICAgICAgICBtYWNub21lbnUgbm9tYWNtZW51IG1hY3Vza2JkIG5vbWFjdXNrYmQgbm9yZW1vdGUKCiAgICAgICAgICAgICAgICAgICAgICAgYXJvPSAgbm9vcCBkaXNwbGF5IHZuY2Rpc3BsYXkgaWNvbl9tb2RlIGF1dG9wb3J0CiAgICAgICAgICAgICAgICAgICAgICAgbG9vcCBsb29wYmcgZGVza3RvcG5hbWUgZ3Vlc3NfZGVza3RvcCBndWVzc19kYnVzCiAgICAgICAgICAgICAgICAgICAgICAgaHR0cF91cmwgYXV0aCB4YXV0aCB1c2VycyByb290c2hpZnQgY2xpcHNoaWZ0IHNjYWxlX3N0cgogICAgICAgICAgICAgICAgICAgICAgIHNjYWxlZF94IHNjYWxlZF95IHNjYWxlX251bWVyIHNjYWxlX2Rlbm9tIHNjYWxlX2ZhY194CiAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfZmFjX3kgc2NhbGluZ19ibGVuZCBzY2FsaW5nX25vbXVsdDQgc2NhbGluZ19wYWQKICAgICAgICAgICAgICAgICAgICAgICBzY2FsaW5nX2ludGVycG9sYXRlIGluZXRkIHByaXZyZW1vdGUgdW5zYWZlIHNhZmVyIG5vY21kcwogICAgICAgICAgICAgICAgICAgICAgIHBhc3N3ZGZpbGUgdW5peHB3IHVuaXhwd19uaXMgdW5peHB3X2xpc3Qgc3NsIHNzbF9wZW0KICAgICAgICAgICAgICAgICAgICAgICBzc2x2ZXJpZnkgc3R1bm5lbCBzdHVubmVsX3BlbSBodHRwcyBodHRwc3JlZGlyIHVzZXB3CiAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdfc2htIGxvZ2ZpbGUgbyBmbGFnIHJtZmxhZyByYyBub3JjIGggaGVscCBWIHZlcnNpb24KICAgICAgICAgICAgICAgICAgICAgICBsYXN0bW9kIGJnIHNpZ3BpcGUgdGhyZWFkcyByZWFkcmF0ZSBuZXRyYXRlIG5ldGxhdGVuY3kKICAgICAgICAgICAgICAgICAgICAgICBwaXBlaW5wdXQgY2xpZW50cyBjbGllbnRfY291bnQgcGlkIGV4dF94dGVzdCBleHRfeHRyYXAKICAgICAgICAgICAgICAgICAgICAgICBleHRfeHJlY29yZCBleHRfeGtiIGV4dF94c2htIGV4dF94aW5lcmFtYSBleHRfb3ZlcmxheQogICAgICAgICAgICAgICAgICAgICAgIGV4dF94Zml4ZXMgZXh0X3hkYW1hZ2UgZXh0X3hyYW5kciByb290d2luIG51bV9idXR0b25zCiAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uX21hc2sgbW91c2VfeCBtb3VzZV95IGdyYWJfc3RhdGUgcG9pbnRlcl9wb3MKICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX3ggcG9pbnRlcl95IHBvaW50ZXJfc2FtZSBwb2ludGVyX3Jvb3QKICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyX21hc2sgYnBwIGRlcHRoIGluZGV4ZWRfY29sb3IgZHB5X3ggZHB5X3kgd2RweV94CiAgICAgICAgICAgICAgICAgICAgICAgd2RweV95IG9mZl94IG9mZl95IGNkcHlfeCBjZHB5X3kgY29mZl94IGNvZmZfeSByZmJhdXRoCiAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dkIHZpZXdwYXNzd2QKCi1RRCB2YXJpYWJsZSAgICAgICAgICAgSnVzdCBsaWtlIC1xdWVyeSB2YXJpYWJsZSwgYnV0IHJldHVybnMgdGhlIGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBmb3IgdGhhdCBwYXJhbWV0ZXIgKG5vIHJ1bm5pbmcgeDExdm5jIHNlcnZlcgogICAgICAgICAgICAgICAgICAgICAgIGlzIGNvbnN1bHRlZCkKCi1zeW5jICAgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCAtcmVtb3RlIGNvbW1hbmRzIGFyZSBydW4gYXN5bmNocm9ub3VzbHksIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICBpcywgdGhlIHJlcXVlc3QgaXMgcG9zdGVkIGFuZCB0aGUgcHJvZ3JhbSBpbW1lZGlhdGVseQogICAgICAgICAgICAgICAgICAgICAgIGV4aXRzLiAgVXNlIC1zeW5jIHRvIGhhdmUgdGhlIHByb2dyYW0gd2FpdCBmb3IgYW4KICAgICAgICAgICAgICAgICAgICAgICBhY2tub3dsZWRnZW1lbnQgZnJvbSB0aGUgeDExdm5jIHNlcnZlciB0aGF0IGNvbW1hbmQgd2FzCiAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkIChzb21laG93KS4gIE9uIHRoZSBvdGhlciBoYW5kIC1xdWVyeSByZXF1ZXN0cwogICAgICAgICAgICAgICAgICAgICAgIGFyZSBhbHdheXMgcHJvY2Vzc2VkIHN5bmNocm9ub3VzbHkgYmVjYXVzZSB0aGV5IGhhdmUKICAgICAgICAgICAgICAgICAgICAgICB0byB3YWl0IGZvciB0aGUgYW5zd2VyLgoKICAgICAgICAgICAgICAgICAgICAgICBBbHNvIG5vdGUgdGhhdCBpZiBib3RoIC1yZW1vdGUgYW5kIC1xdWVyeSByZXF1ZXN0cyBhcmUKICAgICAgICAgICAgICAgICAgICAgICBzdXBwbGllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCB0aGUgLXJlbW90ZSBpcyBwcm9jZXNzZWQKICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCAoc3luY2hyb25vdXNseTogbm8gbmVlZCBmb3IgLXN5bmMpLCBhbmQgdGhlbgogICAgICAgICAgICAgICAgICAgICAgIHRoZSAtcXVlcnkgcmVxdWVzdCBpcyBwcm9jZXNzZWQgaW4gdGhlIG5vcm1hbCB3YXkuCiAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBhbGxvd3MgZm9yIGEgcmVsaWFibGUgd2F5IHRvIHNlZSBpZiB0aGUgLXJlbW90ZQogICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgd2FzIHByb2Nlc3NlZCBieSBxdWVyeWluZyBmb3IgYW55IG5ldyBzZXR0aW5ncy4KICAgICAgICAgICAgICAgICAgICAgICBOb3RlIGhvd2V2ZXIgdGhhdCB0aGVyZSBpcyB0aW1lb3V0IG9mIGEgZmV3IHNlY29uZHMKICAgICAgICAgICAgICAgICAgICAgICAoc2VlIHRoZSBuZXh0IHBhcmFncmFwaCkgc28gaWYgdGhlIHgxMXZuYyB0YWtlcyBsb25nZXIKICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHRoYXQgdG8gcHJvY2VzcyB0aGUgcmVxdWVzdHMgdGhlIHJlcXVlc3RlciB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgdGhpbmsgdGhhdCBhIGZhaWx1cmUgaGFzIHRha2VuIHBsYWNlLgoKICAgICAgICAgICAgICAgICAgICAgICBUaGUgZGVmYXVsdCBpcyB0byB3YWl0IDMuNSBzZWNvbmRzLiAgT3IgaWYgY21kPXN0b3AKICAgICAgICAgICAgICAgICAgICAgICBvbmx5IDEuMCBzZWNvbmRzLiAgSWYgY21kIG1hdGNoZXMgJ3NjcmlwdDonIHRoZW4gaXQKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIHdhaXQgdXAgdG8gMTAuMCBzZWNvbmRzLiAgU2V0IFgxMVZOQ19TWU5DX1RJTUVPVVQKICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgbnVtYmVyIG9mIHNlY29uZHMgeW91IHdhbnQgaXQgdG8gd2FpdC4KCi1xdWVyeV9yZXRyaWVzIHN0ciAgICAgSWYgYSBxdWVyeSBmYWlscyB0byBnZXQgYSByZXNwb25zZSBmcm9tIGFuIHgxMXZuYwogICAgICAgICAgICAgICAgICAgICAgIHNlcnZlciwgcmV0cnkgdXAgdG8gbiB0aW1lcy4gICJzdHIiIGlzIHNwZWNpZmllZCBhcwogICAgICAgICAgICAgICAgICAgICAgIG5bOnRdWy9tYXRjaF0gIE9wdGlvbmFsbHkgdGhlIGRlbGF5IGJldHdlZW4gdHJpZXMgbWF5CiAgICAgICAgICAgICAgICAgICAgICAgYmUgc3BlY2lmaWVkIGJ5ICJ0IiBhIGZsb2F0aW5nIHBvaW50IHRpbWUgKGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICAwLjUgc2Vjb25kcy4pICBOb3RlOiB0aGUgcmVzcG9uc2UgaXMgbm90IGNoZWNrZWQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRpdHkgb3Igd2hldGhlciBpdCBjb3JyZXNwb25kcyB0byB0aGUgcXVlcnkgc2VudC4KICAgICAgICAgICAgICAgICAgICAgICBUaGUgcXVlcnkgInBpbmc6bXlzdHJpbmciIG1heSBiZSB1c2VkIHRvIGhlbHAgdW5pcXVlbHkKICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmeSB0aGUgcXVlcnkuICBPcHRpb25hbGx5LCBhIG1hdGNoaW5nIHN0cmluZyBhZnRlcgogICAgICAgICAgICAgICAgICAgICAgIGEgIi8iIHdpbGwgYmUgdXNlZCB0byBjaGVjayB0aGUgcmVzdWx0IHRleHQuICBVcCB0bwogICAgICAgICAgICAgICAgICAgICAgIG4gcmV0cmllcyB3aWxsIHRha2UgcGxhY2UgdW50aWwgdGhlIG1hdGNoaW5nIHN0cmluZyBpcwogICAgICAgICAgICAgICAgICAgICAgIGZvdW5kIGluIHRoZSBvdXRwdXQgdGV4dC4gIElmIHRoZSBtYXRjaCBzdHJpbmcgaXMgbmV2ZXIKICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCB0aGUgcHJvZ3JhbSdzIGV4aXQgY29kZSBpcyAxOyBpZiB0aGUgbWF0Y2ggaXMKICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCBpdCBleGl0cyB3aXRoIDAuICBOb3RlIHRoYXQgdGhlcmUgbWF5IGJlIHN0ZG91dAogICAgICAgICAgICAgICAgICAgICAgIHByaW50ZWQgZm9yIGVhY2ggcmV0cnkgKGkuZS4gbXVsdGlwbGUgbGluZXMgcHJpbnRlZAogICAgICAgICAgICAgICAgICAgICAgIG91dCB0byBzdGRvdXQuKQogICAgICAgICAgICAgICAgICAgICAgIEV4YW1wbGU6IC1xdWVyeV9yZXRyaWVzIDQ6MS41L2dyYWJfc3RhdGUKCi1yZW1vdGVfcHJlZml4IHN0ciAgICAgRW5hYmxlIGEgcmVtb3RlLWNvbnRyb2wgY29tbXVuaWNhdGlvbiBjaGFubmVsIGZvcgogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RlZCBWTkMgY2xpZW50cy4gIHN0ciBpcyBhIG5vbi1lbXB0eSBzdHJpbmcuIElmIGEKICAgICAgICAgICAgICAgICAgICAgICBWTkMgY2xpZW50IHNlbmRzIHJmYkN1dFRleHQgaGF2aW5nIHRoZSBwcmVmaXggInN0ciIKICAgICAgICAgICAgICAgICAgICAgICB0aGVuIHRoZSBwYXJ0IGFmdGVyIGl0IGlzIHByb2Nlc3NlZCBhcyB0aG91Z2ggaXQgd2VyZQogICAgICAgICAgICAgICAgICAgICAgIHNlbnQgdmlhICd4MTF2bmMgLXJlbW90ZSAuLi4nLiAgSWYgaXQgYmVnaW5zIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICBuZWl0aGVyICdjbWQ9JyBub3IgJ3FyeT0nIHRoZW4gJ3FyeT0nIGlzIGFzc3VtZWQuCiAgICAgICAgICAgICAgICAgICAgICAgQW55IGNvcnJlc3BvbmRpbmcgb3V0cHV0IHRleHQgZm9yIHRoYXQgcmVtb3RlIGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kIGlzIHNlbnQgYmFjayB0byBhbGwgY2xpZW50IGFzIHJmYkN1dFRleHQuCiAgICAgICAgICAgICAgICAgICAgICAgVGhlIHJldHVybmVkIG91dHB1dCBpcyBhbHNvIHByZWZpeGVkIHdpdGggInN0ciIuCiAgICAgICAgICAgICAgICAgICAgICAgRXhhbXBsZTogLXJlbW90ZV9wcmVmaXggRE9fVEhJUzoKCiAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGVuYWJsaW5nIC1yZW1vdGVfcHJlZml4IGFsbG93cyB0aGUgcmVtb3RlCiAgICAgICAgICAgICAgICAgICAgICAgVk5DIHZpZXdlcnMgdG8gcnVuIHgxMXZuYyAtcmVtb3RlIGNvbW1hbmRzLiAgRG8gbm90CiAgICAgICAgICAgICAgICAgICAgICAgdXNlIHRoaXMgb3B0aW9uIGlmIHRoZXkgYXJlIG5vdCB0byBiZSB0cnVzdGVkLgoKLW5vcmVtb3RlICAgICAgICAgICAgICBEbyBub3QgcHJvY2VzcyBhbnkgcmVtb3RlIGNvbnRyb2wgY29tbWFuZHMgb3IgcXVlcmllcy4KLXllc3JlbW90ZSAgICAgICAgICAgICBEbyBwcm9jZXNzIHJlbW90ZSBjb250cm9sIGNvbW1hbmRzIG9yIHF1ZXJpZXMuCiAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdDogLXllc3JlbW90ZQoKICAgICAgICAgICAgICAgICAgICAgICBBIG5vdGUgYWJvdXQgc2VjdXJpdHkgd3J0IHJlbW90ZSBjb250cm9sIGNvbW1hbmRzLgogICAgICAgICAgICAgICAgICAgICAgIElmIHNvbWVvbmUgY2FuIGNvbm5lY3QgdG8gdGhlIFggZGlzcGxheSBhbmQgY2hhbmdlCiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb3BlcnR5IFgxMVZOQ19SRU1PVEUsIHRoZW4gdGhleSBjYW4gcmVtb3RlbHkKICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sIHgxMXZuYy4gIE5vcm1hbGx5IGFjY2VzcyB0byB0aGUgWCBkaXNwbGF5IGlzCiAgICAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkLiAgTm90ZSB0aGF0IGlmIHRoZXkgY2FuIG1vZGlmeSBYMTFWTkNfUkVNT1RFCiAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIFggc2VydmVyLCB0aGV5IGhhdmUgZW5vdWdoIHBlcm1pc3Npb25zIHRvIGFsc28KICAgICAgICAgICAgICAgICAgICAgICBydW4gdGhlaXIgb3duIHgxMXZuYyBhbmQgdGh1cyBoYXZlIGNvbXBsZXRlIGNvbnRyb2wKICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZGVza3RvcC4gIElmIHRoZSAgIi1jb25uZWN0IC9wYXRoL3RvL2ZpbGUiCiAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbCBpcyBiZWluZyB1c2VkLCBvYnZpb3VzbHkgYW55b25lIHdobyBjYW4gd3JpdGUKICAgICAgICAgICAgICAgICAgICAgICB0byAvcGF0aC90by9maWxlIGNhbiByZW1vdGVseSBjb250cm9sIHgxMXZuYy4gIFNvIGJlCiAgICAgICAgICAgICAgICAgICAgICAgc3VyZSB0byBwcm90ZWN0IHRoZSBYIGRpc3BsYXkgYW5kIHRoYXQgZmlsZSdzIHdyaXRlCiAgICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMuICBTZWUgLXByaXZyZW1vdGUgYmVsb3cuCgogICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBhcmUgcGFyYW5vaWQgYW5kIGRvIG5vdCB0aGluayAtbm9yZW1vdGUgaXMKICAgICAgICAgICAgICAgICAgICAgICBlbm91Z2gsIHRvIGRpc2FibGUgdGhlIFgxMVZOQ19SRU1PVEUgcHJvcGVydHkgY2hhbm5lbAogICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlbHkgdXNlIC1ub3ZuY2Nvbm5lY3QsIG9yIHVzZSB0aGUgLXNhZmVyIG9wdGlvbgogICAgICAgICAgICAgICAgICAgICAgIHRoYXQgc2h1dHMgbWFueSB0aGluZ3Mgb2ZmLgoKLXVuc2FmZSAgICAgICAgICAgICAgICBBIGZldyByZW1vdGUgY29tbWFuZHMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQKICAgICAgICAgICAgICAgICAgICAgICAoY3VycmVudGx5OiBpZDpwaWNrLCBhY2NlcHQ6PGNtZD4sIGdvbmU6PGNtZD4sIGFuZAogICAgICAgICAgICAgICAgICAgICAgIHJhd2ZiOnNldHVwOjxjbWQ+KSBiZWNhdXNlIHRoZXkgYXJlIGFzc29jaWF0ZWQgd2l0aAogICAgICAgICAgICAgICAgICAgICAgIHJ1bm5pbmcgZXh0ZXJuYWwgcHJvZ3JhbXMuICBJZiB5b3Ugc3BlY2lmeSAtdW5zYWZlLCB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgdGhlc2UgcmVtb3RlLWNvbnRyb2wgY29tbWFuZHMgYXJlIGFsbG93ZWQuICBOb3RlIHRoYXQKICAgICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIHN0aWxsIHNwZWNpZnkgdGhlc2UgcGFyYW1ldGVycyBvbiB0aGUgY29tbWFuZAogICAgICAgICAgICAgICAgICAgICAgIGxpbmUsIHRoZXkganVzdCBjYW5ub3QgYmUgaW52b2tlZCB2aWEgcmVtb3RlLWNvbnRyb2wuCi1zYWZlciAgICAgICAgICAgICAgICAgRXF1aXZhbGVudCB0bzogLW5vdm5jY29ubmVjdCAtbm9yZW1vdGUgYW5kIHByb2hpYml0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgLWd1aSBhbmQgdGhlIC1jb25uZWN0IGZpbGUuIFNodXRzIG9mZiBjb21tdW5jYXRpb24KICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscy4KLXByaXZyZW1vdGUgICAgICAgICAgICBQZXJmb3JtIHNvbWUgc2FuaXR5IGNoZWNrcyBhbmQgZGlzYWJsZSByZW1vdGUtY29udHJvbAogICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzIGlmIGl0IGFwcGVhcnMgdGhhdCB0aGUgWCBESVNQTEFZIGFuZC9vcgogICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RmaWxlIGNhbiBiZSBhY2Nlc3NlZCBieSBvdGhlciB1c2Vycy4gIE9uY2UKICAgICAgICAgICAgICAgICAgICAgICByZW1vdGUtY29udHJvbCBpcyBkaXNhYmxlZCBpdCBjYW5ub3QgYmUgdHVybmVkIGJhY2sgb24uCi1ub2NtZHMgICAgICAgICAgICAgICAgTm8gZXh0ZXJuYWwgY29tbWFuZHMgKGUuZy4gc3lzdGVtKDMpLCBwb3BlbigzKSwgZXhlYygzKSkKICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHJ1biBhdCBhbGwuCi1hbGxvd2VkY21kcyBsaXN0ICAgICAgImxpc3QiIGNvbnRhaW5zIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG9ubHkKICAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbCBjb21tYW5kcyB0aGF0IGNhbiBiZSBydW4uICBUaGUgZnVsbCBsaXN0IG9mCiAgICAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBvcHRpb25zIGlzOgoKICAgICAgICAgICAgICAgICAgICAgICAgc3R1bm5lbCwgc3NsLCB1bml4cHcsIFdBSVQsIHplcm9jb25mLCBpZCwgYWNjZXB0LAogICAgICAgICAgICAgICAgICAgICAgICBhZnRlcmFjY2VwdCwgZ29uZSwgcGlwZWlucHV0LCB2NGwtaW5mbywgcmF3ZmItc2V0dXAsCiAgICAgICAgICAgICAgICAgICAgICAgIGR0LCBndWksIHNzaCwgc3RvcmVwYXNzd2QsIHBhc3N3ZGZpbGUsIGN1c3RvbV9wYXNzd2QsCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRhdXRoLCBjcmFzaC4KCiAgICAgICAgICAgICAgICAgICAgICAgU2VlIGVhY2ggb3B0aW9uJ3MgaGVscCB0byBsZWFybiB0aGUgYXNzb2NpYXRlZCBleHRlcm5hbAogICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQuICBOb3RlIHRoYXQgdGhlIC1ub2NtZHMgb3B0aW9uIHRha2VzIHByZWNlZGVuY2UKICAgICAgICAgICAgICAgICAgICAgICBhbmQgZGlzYWJsZXMgYWxsIGV4dGVybmFsIGNvbW1hbmRzLgoKLWRlbnlfYWxsICAgICAgICAgICAgICBGb3IgdXNlIHdpdGggLXJlbW90ZSBub2Rlbnk6IHN0YXJ0IG91dCBkZW55aW5nIGFsbAogICAgICAgICAgICAgICAgICAgICAgIGluY29taW5nIGNsaWVudHMgdW50aWwgIi1yZW1vdGUgbm9kZW55IiBpcyB1c2VkIHRvCiAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRoZW0gaW4uCgoKClRoZXNlIG9wdGlvbnMgYXJlIHBhc3NlZCB0byBMaWJWTkNTZXJ2ZXI6CgotcmZicG9ydCBwb3J0ICAgICAgICAgIFRDUCBwb3J0IGZvciBSRkIgcHJvdG9jb2wKLXJmYndhaXQgdGltZSAgICAgICAgICBtYXggdGltZSBpbiBtcyB0byB3YWl0IGZvciBSRkIgY2xpZW50Ci1yZmJhdXRoIHBhc3N3ZC1maWxlICAgdXNlIGF1dGhlbnRpY2F0aW9uIG9uIFJGQiBwcm90b2NvbAogICAgICAgICAgICAgICAgICAgICAgICh1c2UgJ3N0b3JlcGFzc3dkJyB0byBjcmVhdGUgYSBwYXNzd29yZCBmaWxlKQotcmZidmVyc2lvbiAzLnggICAgICAgIFNldCB0aGUgdmVyc2lvbiBvZiB0aGUgUkZCIHdlIGNob29zZSB0byBhZHZlcnRpc2UKLXBlcm1pdGZpbGV0cmFuc2ZlciAgICBwZXJtaXQgZmlsZSB0cmFuc2ZlciBzdXBwb3J0Ci1wYXNzd2QgcGxhaW4tcGFzc3dvcmQgdXNlIGF1dGhlbnRpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgKHVzZSBwbGFpbi1wYXNzd29yZCBhcyBwYXNzd29yZCwgVVNFIEFUIFlPVVIgUklTSykKLWRlZmVydXBkYXRlIHRpbWUgICAgICB0aW1lIGluIG1zIHRvIGRlZmVyIHVwZGF0ZXMgKGRlZmF1bHQgNDApCi1kZWZlcnB0cnVwZGF0ZSB0aW1lICAgdGltZSBpbiBtcyB0byBkZWZlciBwb2ludGVyIHVwZGF0ZXMgKGRlZmF1bHQgbm9uZSkKLWRlc2t0b3AgbmFtZSAgICAgICAgICBWTkMgZGVza3RvcCBuYW1lIChkZWZhdWx0ICJMaWJWTkNTZXJ2ZXIiKQotYWx3YXlzc2hhcmVkICAgICAgICAgIGFsd2F5cyB0cmVhdCBuZXcgY2xpZW50cyBhcyBzaGFyZWQKLW5ldmVyc2hhcmVkICAgICAgICAgICBuZXZlciB0cmVhdCBuZXcgY2xpZW50cyBhcyBzaGFyZWQKLWRvbnRkaXNjb25uZWN0ICAgICAgICBkb24ndCBkaXNjb25uZWN0IGV4aXN0aW5nIGNsaWVudHMgd2hlbiBhIG5ldyBub24tc2hhcmVkCiAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiBjb21lcyBpbiAocmVmdXNlIG5ldyBjb25uZWN0aW9uIGluc3RlYWQpCi1odHRwZGlyIGRpci1wYXRoICAgICAgZW5hYmxlIGh0dHAgc2VydmVyIHVzaW5nIGRpci1wYXRoIGhvbWUKLWh0dHBwb3J0IHBvcnRudW0gICAgICB1c2UgcG9ydG51bSBmb3IgaHR0cCBjb25uZWN0aW9uCi1lbmFibGVodHRwcHJveHkgICAgICAgZW5hYmxlIGh0dHAgcHJveHkgc3VwcG9ydAotcHJvZ3Jlc3NpdmUgaGVpZ2h0ICAgIGVuYWJsZSBwcm9ncmVzc2l2ZSB1cGRhdGluZyBmb3Igc2xvdyBsaW5rcwotbGlzdGVuIGlwYWRkciAgICAgICAgIGxpc3RlbiBmb3IgY29ubmVjdGlvbnMgb25seSBvbiBuZXR3b3JrIGludGVyZmFjZSB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgYWRkciBpcGFkZHIuICctbGlzdGVuIGxvY2FsaG9zdCcgYW5kIGhvc3RuYW1lIHdvcmsgdG9vLgoKbGlidm5jc2VydmVyLXRpZ2h0LWV4dGVuc2lvbiBvcHRpb25zOgotZGlzYWJsZWZpbGV0cmFuc2ZlciAgIGRpc2FibGUgZmlsZSB0cmFuc2ZlcgotZnRwcm9vdCBzdHJpbmcgICAgICAgIHNldCBmdHAgcm9vdAoKICAgUHJldHR5IHdpbGQgaHVoPyBDb250YWN0IG1lIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgcHJvYmxlbXMuCgogICBQZXJzb25hbGx5LCBJIHVzZToKeDExdm5jIC1yZmJhdXRoICRIT01FLy52bmMvcGFzc3dkIC1zb2xpZAo=