CiBPcGVuU1NMIENIQU5HRVMKIF9fX19fX19fX19fX19fXwoKIENoYW5nZXMgYmV0d2VlbiAwLjkuOGEgYW5kIDAuOS45ICBbeHggWFhYIHh4eHhdCgogICopIE5ldyBjYW5kaWRhdGUgZm9yIEJJR05VTSBhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24sIGJuX211bF9tb250LAogICAgIGRlZGljYXRlZCBNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uIHByb2NlZHVyZSwgaXMgaW50cm9kdWNlZC4KICAgICBCTl9NT05UX0NUWCBpcyBtb2RpZmllZCB0byBhbGxvdyBibl9tdWxfbW9udCB0byByZWFjaCBmb3IgaGlnaGVyCiAgICAgIjY0LWJpdCIgcGVyZm9ybWFuY2Ugb24gY2VydGFpbiAzMi1iaXQgdGFyZ2V0cy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTmV3IG9wdGlvbiBTU0xfT1BfTk9fQ09NUCB0byBkaXNhYmxlIHVzZSBvZiBjb21wcmVzc2lvbiBzZWxlY3RpdmVseQogICAgIGluIFNTTCBzdHJ1Y3R1cmVzLiBOZXcgU1NMIGN0cmwgdG8gc2V0IG1heGltdW0gc2VuZCBmcmFnbWVudCBzaXplLiAKICAgICBTYXZlIG1lbW9yeSBieSBzZWV0aW5nIHRoZSBJL08gYnVmZmVyIHNpemVzIGR5bmFtaWNhbGx5IGluc3RlYWQgb2YKICAgICB1c2luZyB0aGUgbWF4aW11bSBhdmFpbGFibGUgdmFsdWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbiAtViBmb3IgJ29wZW5zc2wgY2lwaGVycycuIFRoaXMgcHJpbnRzIHRoZSBjaXBoZXJzdWl0ZSBjb2RlCiAgICAgaW4gYWRkaXRpb24gdG8gdGhlIHRleHQgZGV0YWlscy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBWZXJ5LCB2ZXJ5IHByZWxpbWluYXJ5IEVYUEVSSU1FTlRBTCBzdXBwb3J0IGZvciBwcmludGluZyBvZiBnZW5lcmFsCiAgICAgQVNOMSBzdHJ1Y3R1cmVzLiBUaGlzIGN1cnJlbnRseSBwcm9kdWNlcyByYXRoZXIgdWdseSBvdXRwdXQgYW5kIGRvZXNuJ3QKICAgICBoYW5kbGUgc2V2ZXJhbCBjdXN0b21pc2VkIHN0cnVjdHVyZXMgYXQgYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEludGVncmF0ZWQgc3VwcG9ydCBmb3IgUFZLIGZpbGUgZm9ybWF0IGFuZCBzb21lIHJlbGF0ZWQgZm9ybWF0cyBzdWNoCiAgICAgYXMgTVMgUFVCTElDS0VZQkxPQiBhbmQgUFJJVkFURUtFWUJMT0IuIENvbW1hbmQgbGluZSBzd2l0Y2hlcyB0byBzdXBwb3J0CiAgICAgdGhlc2UgaW4gdGhlICdyc2EnIGFuZCAnZHNhJyB1dGlsaXRpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgUEtDUyMxIFJTQVB1YmxpY0tleSBmb3JtYXQgb24gcnNhIHV0aWxpdHkgY29tbWFuZCBsaW5lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSB0aGUgYW5jaWVudCBBU04xX01FVEhPRCBjb2RlLiBUaGlzIHdhcyBvbmx5IGV2ZXIgdXNlZCBpbiBvbmUKICAgICBwbGFjZSBmb3IgdGhlICh2ZXJ5IG9sZCkgIk5FVFNDQVBFIiBmb3JtYXQgY2VydGlmaWNhdGVzIHdoaWNoIGFyZSBub3cKICAgICBoYW5kbGVkIHVzaW5nIG5ldyBBU04xIGNvZGUgZXF1aXZhbGVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTGV0IHRoZSBUTFN2MV9tZXRob2QoKSBldGMuIGZ1bmN0aW9ucyByZXR1cm4gYSAnY29uc3QnIFNTTF9NRVRIT0QKICAgICBwb2ludGVyIGFuZCBtYWtlIHRoZSBTU0xfTUVUSE9EIHBhcmFtZXRlciBpbiBTU0xfQ1RYX25ldywKICAgICBTU0xfQ1RYX3NldF9zc2xfdmVyc2lvbiBhbmQgU1NMX3NldF9zc2xfbWV0aG9kICdjb25zdCcuCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBNb2RpZnkgQ1JMIGRpc3RyaWJ1dGlvbiBwb2ludHMgZXh0ZW5zaW9uIGNvZGUgdG8gcHJpbnQgb3V0IHByZXZpb3VzbHkKICAgICB1bnN1cHBvcnRlZCBmaWVsZHMuIEVuaGFuY2UgZXh0ZW5zaW9uIHNldHRpbmcgY29kZSB0byBhbGxvdyBzZXR0aW5nIG9mCiAgICAgYWxsIGZpZWxkcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgcHJpbnQgYW5kIHNldCBzdXBwb3J0IGZvciBJc3N1aW5nIERpc3RyaWJ1dGlvbiBQb2ludCBDUkwgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44YSBhbmQgMC45LjhiICBbWFggeHh4IFhYWFhdCgogICopIEFkZCBzdXBwb3J0IGZvciBidWlsZGluZyBvZiBlbmdpbmVzIHVuZGVyIGVuZ2luZS8gYXMgc2hhcmVkIGxpYnJhcmllcwogICAgIHVuZGVyIFZDKysgYnVpbGQgc3lzdGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvcnJlY3RlZCB0aGUgbnVtZXJvdXMgYnVncyBpbiB0aGUgV2luMzIgcGF0aCBzcGxpdHRlciBpbiBEU08uCiAgICAgSG9wZWZ1bGx5LCB3ZSB3aWxsIG5vdCBzZWUgYW55IGZhbHNlIGNvbWJpbmF0aW9uIG9mIHBhdGhzIGFueSBtb3JlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS44IGFuZCAwLjkuOGEgIFsxMSBPY3QgMjAwNV0KCiAgKikgUmVtb3ZlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFNTTF9PUF9NU0lFX1NTTFYyX1JTQV9QQURESU5HCiAgICAgKHBhcnQgb2YgU1NMX09QX0FMTCkuICBUaGlzIG9wdGlvbiB1c2VkIHRvIGRpc2FibGUgdGhlCiAgICAgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBtYW4taW4tdGhlLW1pZGRsZSBwcm90b2NvbC12ZXJzaW9uCiAgICAgcm9sbGJhY2sgaW4gdGhlIFNTTCAyLjAgc2VydmVyIGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBhIGJhZAogICAgIGlkZWEuICAoQ1ZFLTIwMDUtMjk2OSkKCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBZdXRha2EgT2l3YSAoUmVzZWFyY2ggQ2VudGVyCiAgICAgZm9yIEluZm9ybWF0aW9uIFNlY3VyaXR5LCBOYXRpb25hbCBJbnN0aXR1dGUgb2YgQWR2YW5jZWQgSW5kdXN0cmlhbAogICAgIFNjaWVuY2UgYW5kIFRlY2hub2xvZ3kgW0FJU1RdLCBKYXBhbildCgogICopIEFkZCB0d28gZnVuY3Rpb24gdG8gY2xlYXIgYW5kIHJldHVybiB0aGUgdmVyaWZ5IHBhcmFtZXRlciBmbGFncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBLZWVwIGNpcGhlcmxpc3RzIHNvcnRlZCBpbiB0aGUgc291cmNlIGluc3RlYWQgb2Ygc29ydGluZyB0aGVtIGF0CiAgICAgcnVudGltZSwgdGh1cyByZW1vdmluZyB0aGUgbmVlZCBmb3IgYSBsb2NrLgogICAgIFtOaWxzIExhcnNjaF0KCiAgKikgQXZvaWQgc29tZSBzbWFsbCBzdWJncm91cCBhdHRhY2tzIGluIERpZmZpZS1IZWxsbWFuLgogICAgIFtOaWNrIE1hdGhld3NvbiBhbmQgQmVuIExhdXJpZV0KCiAgKikgQWRkIGZ1bmN0aW9ucyBmb3Igd2VsbC1rbm93biBwcmltZXMuCiAgICAgW05pY2sgTWF0aGV3c29uXQoKICAqKSBFeHRlbmRlZCBXaW5kb3dzIENFIHN1cHBvcnQuCiAgICAgW1NhdG9zaGkgTmFrYW11cmEgYW5kIEFuZHkgUG9seWFrb3ZdCgogICopIEluaXRpYWxpemUgU1NMX01FVEhPRCBzdHJ1Y3R1cmVzIGF0IGNvbXBpbGUgdGltZSBpbnN0ZWFkIG9mIGR1cmluZwogICAgIHJ1bnRpbWUsIHRodXMgcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIGEgbG9jay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFBLQ1M3X2RlY3J5cHQoKSB3b3JrIGV2ZW4gaWYgbm8gY2VydGlmaWNhdGUgaXMgc3VwcGxpZWQgYnkKICAgICBhdHRlbXB0aW5nIHRvIGRlY3J5cHQgZWFjaCBlbmNyeXB0ZWQga2V5IGluIHR1cm4uIEFkZCBzdXBwb3J0IHRvCiAgICAgc21pbWUgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2ggYW5kIDAuOS44ICBbMDUgSnVsIDIwMDVdCgogICopIEFkZCBsaWJjcnlwdG8ucGMgYW5kIGxpYnNzbC5wYyBmb3IgdGhvc2Ugd2hvIGZlZWwgdGhleSBuZWVkIHRoZW0uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIENBLnNoIGFuZCBDQS5wbCBzbyB0aGV5IGRvbid0IGJ1bmRsZSB0aGUgQ1NSIGFuZCB0aGUgcHJpdmF0ZQogICAgIGtleSBpbnRvIHRoZSBzYW1lIGZpbGUgYW55IG1vcmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIGluaXRpYWwgc3VwcG9ydCBmb3IgV2luNjQsIGJvdGggSUE2NCBhbmQgQU1ENjQveDY0IGZsYXZvcnMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCAtdXRmOCBjb21tYW5kIGxpbmUgYW5kIGNvbmZpZyBmaWxlIG9wdGlvbiB0byAnY2EnLgogICAgIFtTdGVmYW4gPHN0ZkB1ZG9tYS5vcmddCgogICopIFJlbW92ZWQgdGhlIG1hY3JvIGRlc19jcnlwdCgpLCBhcyBpdCBzZWVtcyB0byBjb25mbGljdCB3aXRoIHNvbWUKICAgICBsaWJyYXJpZXMuICBVc2UgREVTX2NyeXB0KCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29ycmVjdCBuYW1pbmcgb2YgdGhlICdjaGlsJyBhbmQgJzQ3NThjY2EnIEVOR0lORXMuIFRoaXMKICAgICBpbnZvbHZlcyByZW5hbWluZyB0aGUgc291cmNlIGFuZCBnZW5lcmF0ZWQgc2hhcmVkLWxpYnMgZm9yCiAgICAgYm90aC4gVGhlIGVuZ2luZXMgd2lsbCBhY2NlcHQgdGhlIGNvcnJlY3RlZCBvciBsZWdhY3kgaWRzCiAgICAgKCduY2lwaGVyJyBhbmQgJzQ3NThfY2NhJyByZXNwZWN0aXZlbHkpIHdoZW4gYmluZGluZy4gTkIsCiAgICAgdGhpcyBvbmx5IGFwcGxpZXMgd2hlbiBidWlsZGluZyAnc2hhcmVkJy4KICAgICBbQ29yaW5uYSBWaW5zY2hlbiA8dmluc2NoZW5AcmVkaGF0LmNvbT4gYW5kIEdlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGF0dHJpYnV0ZSBmdW5jdGlvbnMgdG8gRVZQX1BLRVkgc3RydWN0dXJlLiBNb2RpZnkKICAgICBQS0NTMTJfY3JlYXRlKCkgdG8gcmVjb2duaXplIGEgQ1NQIG5hbWUgYXR0cmlidXRlIGFuZAogICAgIHVzZSBpdC4gTWFrZSAtQ1NQIG9wdGlvbiB3b3JrIGFnYWluIGluIHBrY3MxMiB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb25hbGl0eSB0byB0aGUgYm4gYmxpbmRpbmcgY29kZToKICAgICAtIGF1dG9tYXRpYyByZS1jcmVhdGlvbiBvZiB0aGUgQk5fQkxJTkRJTkcgcGFyYW1ldGVycyBhZnRlcgogICAgICAgYSBmaXhlZCBudW1iZXIgb2YgdXNlcyAoY3VycmVudGx5IDMyKQogICAgIC0gYWRkIG5ldyBmdW5jdGlvbiBmb3IgcGFyYW1ldGVyIGNyZWF0aW9uCiAgICAgLSBpbnRyb2R1Y2UgZmxhZ3MgdG8gY29udHJvbCB0aGUgdXBkYXRlIGJlaGF2aW91ciBvZiB0aGUKICAgICAgIEJOX0JMSU5ESU5HIHBhcmFtZXRlcnMKICAgICAtIGhpZGUgQk5fQkxJTkRJTkcgc3RydWN0dXJlCiAgICAgQWRkIGEgc2Vjb25kIEJOX0JMSU5ESU5HIHNsb3QgdG8gdGhlIFJTQSBzdHJ1Y3R1cmUgdG8gaW1wcm92ZQogICAgIHBlcmZvcm1hbmNlIHdoZW4gYSBzaW5nbGUgUlNBIG9iamVjdCBpcyBzaGFyZWQgYW1vbmcgc2V2ZXJhbAogICAgIHRocmVhZHMuCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRFRMUy4KICAgICBbTmFnZW5kcmEgTW9kYWR1Z3UgPG5hZ2VuZHJhQGNzLnN0YW5mb3JkLmVkdT4gYW5kIEJlbiBMYXVyaWVdCgogICopIEFkZCBzdXBwb3J0IGZvciBERVIgZW5jb2RlZCBwcml2YXRlIGtleXMgKFNTTF9GSUxFVFlQRV9BU04xKQogICAgIHRvIFNTTF9DVFhfdXNlX1ByaXZhdGVLZXlfZmlsZSgpIGFuZCBTU0xfdXNlX1ByaXZhdGVLZXlfZmlsZSgpCiAgICAgW1dhbHRlciBHb3VsZXRdCgogICopIFJlbW92ZSBidWdneSBhbmQgaW5jb21wbGV0ZXQgREggY2VydCBzdXBwb3J0IGZyb20KICAgICBzc2wvc3NsX3JzYS5jIGFuZCBzc2wvczNfYm90aC5jCiAgICAgW05pbHMgTGFyc2NoXQoKICAqKSBVc2UgU0hBLTEgaW5zdGVhZCBvZiBNRDUgYXMgdGhlIGRlZmF1bHQgZGlnZXN0IGFsZ29yaXRobSBmb3IKICAgICB0aGUgYXBwcy9vcGVuc3NsIGFwcGxpY2F0aW9ucy4KICAgICBbTmlscyBMYXJzY2hdCgogICopIENvbXBpbGUgY2xlYW4gd2l0aCAiLVdhbGwgLVdtaXNzaW5nLXByb3RvdHlwZXMKICAgICAtV3N0cmljdC1wcm90b3R5cGVzIC1XbWlzc2luZy1kZWNsYXJhdGlvbnMgLVdlcnJvciIuIEN1cnJlbnRseQogICAgIERFQlVHX1NBRkVTVEFDSyBtdXN0IGFsc28gYmUgc2V0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDaGFuZ2UgLi9Db25maWd1cmUgc28gdGhhdCBjZXJ0YWluIGFsZ29yaXRobXMgY2FuIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuCiAgICAgVGhlIG5ldyBjb3VudGVycGllY2UgdG8gIm5vLXh4eCIgaXMgImVuYWJsZS14eHgiLgoKICAgICBUaGUgcGF0ZW50ZWQgUkM1IGFuZCBNREMyIGFsZ29yaXRobXMgd2lsbCBub3cgYmUgZGlzYWJsZWQgdW5sZXNzCiAgICAgImVuYWJsZS1yYzUiIGFuZCAiZW5hYmxlLW1kYzIiLCByZXNwZWN0aXZlbHksIGFyZSBzcGVjaWZpZWQuCgogICAgIChJREVBIHJlbWFpbnMgZW5hYmxlZCBkZXNwaXRlIGJlaW5nIHBhdGVudGVkLiAgVGhpcyBpcyBiZWNhdXNlIElERUEKICAgICBpcyBmcmVxdWVudGx5IHJlcXVpcmVkIGZvciBpbnRlcm9wZXJhYmlsaXR5LCBhbmQgdGhlcmUgaXMgbm8gbGljZW5zZQogICAgIGZlZSBmb3Igbm9uLWNvbW1lcmNpYWwgdXNlLiAgQXMgYmVmb3JlLCAibm8taWRlYSIgY2FuIGJlIHVzZWQgdG8KICAgICBhdm9pZCB0aGlzIGFsZ29yaXRobS4pCgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBwcm9jZXNzaW5nIG9mIHByb3h5IGNlcnRpZmljYXRlcyAoc2VlIFJGQyAzODIwKS4gIFRoaXMgd29yayB3YXMKICAgICBzcG9uc29yZWQgYnkgS1RIIChUaGUgUm95YWwgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3kgaW4gU3RvY2tob2xtKSBhbmQKICAgICBFR0VFIChFbmFibGluZyBHcmlkcyBmb3IgRS1zY2llbmNlIGluIEV1cm9wZSkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUkM0IHBlcmZvcm1hbmNlIG92ZXJoYXVsIG9uIG1vZGVybiBhcmNoaXRlY3R1cmVzL2ltcGxlbWVudGF0aW9ucywgc3VjaAogICAgIGFzIEludGVsIFA0LCBJQS02NCBhbmQgQU1ENjQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE5ldyB1dGlsaXR5IGV4dHJhY3Qtc2VjdGlvbi5wbC4gVGhpcyBjYW4gYmUgdXNlZCBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlCiAgICAgc2VjdGlvbiBudW1iZXIgaW4gYSBwb2QgZmlsZSBpbnN0ZWFkIG9mIGhhdmluZyB0byB0cmVhdCBlYWNoIGZpbGUgYXMKICAgICBhIHNlcGFyYXRlIGNhc2UgaW4gTWFrZWZpbGUuIFRoaXMgY2FuIGJlIGRvbmUgYnkgYWRkaW5nIHR3byBsaW5lcyB0byB0aGUKICAgICBwb2QgZmlsZToKCiAgICAgPWZvciBjb21tZW50IG9wZW5zc2xfc2VjdGlvbjpYWFgKCiAgICAgVGhlIGJsYW5rIGxpbmUgaXMgbWFuZGF0b3J5LgoKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgYXJndW1lbnRzIC1jZXJ0Zm9ybSwgLWtleWZvcm0gYW5kIC1wYXNzIGZvciBzX2NsaWVudCBhbmQgc19zZXJ2ZXIKICAgICB0byBhbGxvdyBhbHRlcm5hdGl2ZSBmb3JtYXQga2V5IGFuZCBjZXJ0aWZpY2F0ZSBmaWxlcyBhbmQgcGFzc3BocmFzZQogICAgIHNvdXJjZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHN0cnVjdHVyZSBYNTA5X1ZFUklGWV9QQVJBTSB3aGljaCBjb21iaW5lcyBjdXJyZW50IHZlcmlmeSBwYXJhbWV0ZXJzLAogICAgIHVwZGF0ZSBhc3NvY2lhdGVkIHN0cnVjdHVyZXMgYW5kIGFkZCB2YXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zLgoKICAgICBBZGQgbmV3IHBvbGljeSByZWxhdGVkIHZlcmlmeSBwYXJhbWV0ZXJzLCBpbmNsdWRlIHBvbGljeSBjaGVja2luZyBpbiAKICAgICBzdGFuZGFyZCB2ZXJpZnkgY29kZS4gRW5oYW5jZSAnc21pbWUnIGFwcGxpY2F0aW9uIHdpdGggZXh0cmEgcGFyYW1ldGVycwogICAgIHRvIHN1cHBvcnQgcG9saWN5IGNoZWNraW5nIGFuZCBwcmludCBvdXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IGVuZ2luZSB0byBzdXBwb3J0IFZJQSBQYWRMb2NrIEFDRSBleHRlbnNpb25zIGluIHRoZSBWSUEgQzMKICAgICBOZWhlbWlhaCBwcm9jZXNzb3JzLiBUaGVzZSBleHRlbnNpb25zIHN1cHBvcnQgQUVTIGVuY3J5cHRpb24gaW4gaGFyZHdhcmUKICAgICBhcyB3ZWxsIGFzIFJORyAodGhvdWdoIFJORyBzdXBwb3J0IGlzIGN1cnJlbnRseSBkaXNhYmxlZCkuCiAgICAgW01pY2hhbCBMdWR2aWcgPG1pY2hhbEBsb2dpeC5jej4sIHdpdGggaGVscCBmcm9tIEFuZHkgUG9seWFrb3ZdCgogICopIERlcHJlY2F0ZSBCTl9bZ2V0fHNldF1fcGFyYW1zKCkgZnVuY3Rpb25zICh0aGV5IHdlcmUgaWdub3JlZCBpbnRlcm5hbGx5KS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBOZXcgRklQUyAxODAtMiBhbGdvcml0aG1zLCBTSEEtMjI0Ly0yNTYvLTM4NC8tNTEyIGFyZSBpbXBsZW1lbnRlZC4KICAgICBbQW5keSBQb2x5YWtvdiBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgcGVvcGxlXQoKICAqKSBJbXByb3ZlZCBQb3dlclBDIHBsYXRmb3JtIHN1cHBvcnQuIE1vc3Qgbm90YWJseSBCSUdOVU0gYXNzZW1ibGVyCiAgICAgaW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgSUJNLgogICAgIFtTdXJlc2ggQ2hhcmksIFBldGVyIFdhbHRlbmJlcmcsIEFuZHkgUG9seWFrb3ZdCgogICopIFRoZSBuZXcgJ1JTQV9nZW5lcmF0ZV9rZXlfZXgnIGZ1bmN0aW9uIG5vdyB0YWtlcyBhIEJJR05VTSBmb3IgdGhlIHB1YmxpYwogICAgIGV4cG9uZW50IHJhdGhlciB0aGFuICd1bnNpZ25lZCBsb25nJy4gVGhlcmUgaXMgYSBjb3JyZXNwb25kaW5nIGNoYW5nZSB0bwogICAgIHRoZSBuZXcgJ3JzYV9rZXlnZW4nIGVsZW1lbnQgb2YgdGhlIFJTQV9NRVRIT0Qgc3RydWN0dXJlLgogICAgIFtKZWx0ZSBKYW5zZW4sIEdlb2ZmIFRob3JwZV0KCiAgKikgRnVuY3Rpb25hbGl0eSBmb3IgY3JlYXRpbmcgdGhlIGluaXRpYWwgc2VyaWFsIG51bWJlciBmaWxlIGlzIG5vdwogICAgIG1vdmVkIGZyb20gQ0EucGwgdG8gdGhlICdjYScgdXRpbGl0eSB3aXRoIGEgbmV3IG9wdGlvbiAtY3JlYXRlX3NlcmlhbC4KCiAgICAgKEJlZm9yZSBPcGVuU1NMIDAuOS43ZSwgQ0EucGwgdXNlZCB0byBpbml0aWFsaXplIHRoZSBzZXJpYWwKICAgICBudW1iZXIgZmlsZSB0byAxLCB3aGljaCBpcyBib3VuZCB0byBjYXVzZSBwcm9ibGVtcy4gIFRvIGF2b2lkCiAgICAgdGhlIHByb2JsZW1zIHdoaWxlIHJlc3BlY3RpbmcgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGRpZmZlcmVudCAwLjkuNwogICAgIHBhdGNobGV2ZWxzLCAwLjkuN2UgIGVtcGxveWVkICdvcGVuc3NsIHg1MDkgLW5leHRfc2VyaWFsJyBpbgogICAgIENBLnBsIGZvciBzZXJpYWwgbnVtYmVyIGluaXRpYWxpemF0aW9uLiAgV2l0aCB0aGUgbmV3IHJlbGVhc2UgMC45LjgsCiAgICAgd2UgY2FuIGZpeCB0aGUgcHJvYmxlbSBkaXJlY3RseSBpbiB0aGUgJ2NhJyB1dGlsaXR5LikKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWR1Y2VkIGhlYWRlciBpbnRlcmRlcGVuY2llcyBieSBkZWNsYXJpbmcgbW9yZSBvcGFxdWUgb2JqZWN0cyBpbgogICAgIG9zc2xfdHlwLmguIEFzIGEgY29uc2VxdWVuY2UsIGluY2x1ZGluZyBzb21lIGhlYWRlcnMgKGVnLiBlbmdpbmUuaCkgd2lsbAogICAgIGdpdmUgZmV3ZXIgcmVjdXJzaXZlIGluY2x1ZGVzLCB3aGljaCBjb3VsZCBicmVhayBsYXp5IHNvdXJjZSBjb2RlIC0gc28KICAgICB0aGlzIGNoYW5nZSBpcyBjb3ZlcmVkIGJ5IHRoZSBPUEVOU1NMX05PX0RFUFJFQ0FURUQgc3ltYm9sLiBBcyBhbHdheXMsCiAgICAgZGV2ZWxvcGVycyBzaG91bGQgZGVmaW5lIHRoaXMgc3ltYm9sIHdoZW4gYnVpbGRpbmcgYW5kIHVzaW5nIG9wZW5zc2wgdG8KICAgICBlbnN1cmUgdGhleSB0cmFjayB0aGUgcmVjb21tZW5kZWQgYmVoYXZpb3VyLCBpbnRlcmZhY2VzLCBbZXRjXSwgYnV0CiAgICAgYmFja3dhcmRzLWNvbXBhdGlibGUgYmVoYXZpb3VyIHByZXZhaWxzIHdoZW4gdGhpcyBpc24ndCBkZWZpbmVkLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X1BPTElDWV9OT0RFX3ByaW50KCkgd2hpY2ggcHJpbnRzIG91dCBwb2xpY3kgbm9kZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBFVlAgZnVuY3Rpb24gRVZQX0NJUEhFUl9DVFhfcmFuZF9rZXkgYW5kIGFzc29jaWF0ZWQgZnVuY3Rpb25hbGl0eS4KICAgICBUaGlzIHdpbGwgZ2VuZXJhdGUgYSByYW5kb20ga2V5IG9mIHRoZSBhcHByb3ByaWF0ZSBsZW5ndGggYmFzZWQgb24gdGhlIAogICAgIGNpcGhlciBjb250ZXh0LiBUaGUgRVZQX0NJUEhFUiBjYW4gcHJvdmlkZSBpdHMgb3duIHJhbmRvbSBrZXkgZ2VuZXJhdGlvbgogICAgIHJvdXRpbmUgdG8gc3VwcG9ydCBrZXlzIG9mIGEgc3BlY2lmaWMgZm9ybS4gVGhpcyBpcyB1c2VkIGluIHRoZSBkZXMgYW5kIAogICAgIDNkZXMgcm91dGluZXMgdG8gZ2VuZXJhdGUgYSBrZXkgb2YgdGhlIGNvcnJlY3QgcGFyaXR5LiBVcGRhdGUgUy9NSU1FCiAgICAgY29kZSB0byB1c2UgbmV3IGZ1bmN0aW9ucyBhbmQgaGVuY2UgZ2VuZXJhdGUgY29ycmVjdCBwYXJpdHkgREVTIGtleXMuCiAgICAgQWRkIEVWUF9DSEVDS19ERVNfS0VZICNkZWZpbmUgdG8gcmV0dXJuIGFuIGVycm9yIGlmIHRoZSBrZXkgaXMgbm90IAogICAgIHZhbGlkICh3ZWFrIG9yIGluY29ycmVjdCBwYXJpdHkpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGxvY2FsIHNldCBvZiBDUkxzIHRoYXQgY2FuIGJlIHVzZWQgYnkgWDUwOV92ZXJpZnlfY2VydCgpIGFzIHdlbGwKICAgICBhcyBsb29raW5nIHRoZW0gdXAuIFRoaXMgaXMgdXNlZnVsIHdoZW4gdGhlIHZlcmlmaWVkIHN0cnVjdHVyZSBtYXkgY29udGFpbgogICAgIENSTHMsIGZvciBleGFtcGxlIFBLQ1MjNyBzaWduZWREYXRhLiBNb2RpZnkgUEtDUzdfdmVyaWZ5KCkgdG8gdXNlIGFueSBDUkxzCiAgICAgcHJlc2VudCB1bmxlc3MgdGhlIG5ldyBQS0NTN19OT19DUkwgZmxhZyBpcyBhc3NlcnRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFeHRlbmQgQVNOMSBvaWQgY29uZmlndXJhdGlvbiBtb2R1bGUuIEl0IG5vdyBhZGRpdGlvbmFsbHkgYWNjZXB0cyB0aGUKICAgICBzeW50YXg6CgogICAgIHNob3J0TmFtZSA9IHNvbWUgbG9uZyBuYW1lLCAxLjIuMy40CiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVpbXBsZW1lbnRlZCB0aGUgQk5fQ1RYIGltcGxlbWVudGF0aW9uLiBUaGVyZSBpcyBub3cgbm8gbW9yZSBzdGF0aWMKICAgICBsaW1pdGF0aW9uIG9uIHRoZSBudW1iZXIgb2YgdmFyaWFibGVzIGl0IGNhbiBoYW5kbGUgbm9yIHRoZSBkZXB0aCBvZiB0aGUKICAgICAic3RhY2siIGhhbmRsaW5nIGZvciBCTl9DVFhfc3RhcnQoKS9CTl9DVFhfZW5kKCkgcGFpcnMuIFRoZSBzdGFjawogICAgIGluZm9ybWF0aW9uIGNhbiBub3cgZXhwYW5kIGFzIHJlcXVpcmVkLCBhbmQgcmF0aGVyIHRoYW4gaGF2aW5nIGEgc2luZ2xlCiAgICAgc3RhdGljIGFycmF5IG9mIGJpZ251bXMsIEJOX0NUWCBub3cgdXNlcyBhIGxpbmtlZC1saXN0IG9mIHN1Y2ggYXJyYXlzCiAgICAgYWxsb3dpbmcgaXQgdG8gZXhwYW5kIG9uIGRlbWFuZCB3aGlsc3QgbWFpbnRhaW5pbmcgdGhlIHVzZWZ1bG5lc3Mgb2YKICAgICBCTl9DVFgncyAiYnVuZGxpbmciLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhIG1pc3NpbmcgQk5fQ1RYIHBhcmFtZXRlciB0byB0aGUgJ3JzYV9tb2RfZXhwJyBjYWxsYmFjayBpbiBSU0FfTUVUSE9ECiAgICAgdG8gYWxsb3cgYWxsIFJTQSBvcGVyYXRpb25zIHRvIGZ1bmN0aW9uIHVzaW5nIGEgc2luZ2xlIEJOX0NUWC4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBQcmVsaW1pbmFyeSBzdXBwb3J0IGZvciBjZXJ0aWZpY2F0ZSBwb2xpY3kgZXZhbHVhdGlvbiBhbmQgY2hlY2tpbmcuIFRoaXMKICAgICBpcyBpbml0aWFsbHkgaW50ZW5kZWQgdG8gcGFzcyB0aGUgdGVzdHMgb3V0bGluZWQgaW4gIkNvbmZvcm1hbmNlIFRlc3RpbmcKICAgICBvZiBSZWx5aW5nIFBhcnR5IENsaWVudCBDZXJ0aWZpY2F0ZSBQYXRoIFByb2Nlc3NpbmcgTG9naWMiIHYxLjA3LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIGJuX2R1cF9leHBhbmQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBpdCB3YXMgaW50cm9kdWNlZCBpbiAwLjkuNyBhbmQKICAgICByZW1haW5lZCB1bnVzZWQgYW5kIG5vdCB0aGF0IHVzZWZ1bC4gQSB2YXJpZXR5IG9mIG90aGVyIGxpdHRsZSBiaWdudW0KICAgICB0d2Vha3MgYW5kIGZpeGVzIGhhdmUgYWxzbyBiZWVuIG1hZGUgY29udGludWluZyBvbiBmcm9tIHRoZSBhdWRpdCAoc2VlCiAgICAgYmVsb3cpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIENvbnN0aWZ5IGFsbCBvciBhbG1vc3QgYWxsIGQyaSwgYzJpLCBzMmkgYW5kIHIyaSBmdW5jdGlvbnMsIGFsb25nIHdpdGgKICAgICBhc3NvY2lhdGVkIEFTTjEsIEVWUCBhbmQgU1NMIGZ1bmN0aW9ucyBhbmQgb2xkIEFTTjEgbWFjcm9zLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEJOX3plcm8oKSBvbmx5IG5lZWRzIHRvIHNldCAndG9wJyBhbmQgJ25lZycgdG8gemVybyBmb3IgY29ycmVjdCByZXN1bHRzLAogICAgIGFuZCB0aGlzIHNob3VsZCBuZXZlciBmYWlsLiBTbyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdGhlIHVzZSBvZgogICAgIEJOX3NldF93b3JkKCkgKHdoaWNoIGNhbiBmYWlsIGR1ZSB0byBuZWVkbGVzcyBleHBhbnNpb24pIGlzIG5vdyBkZXByZWNhdGVkOwogICAgIGlmIE9QRU5TU0xfTk9fREVQUkVDQVRFRCBpcyBkZWZpbmVkLCBCTl96ZXJvKCkgaXMgYSB2b2lkIG1hY3JvLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEJOX0NUWF9nZXQoKSBzaG91bGQgcmV0dXJuIHplcm8tdmFsdWVkIGJpZ251bXMsIHByb3ZpZGluZyB0aGUgc2FtZQogICAgIGluaXRpYWxpc2VkIHZhbHVlIGFzIEJOX25ldygpLgogICAgIFtHZW9mZiBUaG9ycGUsIHN1Z2dlc3RlZCBieSBVbGYgTfZsbGVyXQoKICAqKSBTdXBwb3J0IGZvciBpbmhpYml0QW55UG9saWN5IGNlcnRpZmljYXRlIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbiBhdWRpdCBvZiB0aGUgQklHTlVNIGNvZGUgaXMgdW5kZXJ3YXksIGZvciB3aGljaCBkZWJ1Z2dpbmcgY29kZSBpcwogICAgIGVuYWJsZWQgd2hlbiBCTl9ERUJVRyBpcyBkZWZpbmVkLiBUaGlzIG1ha2VzIHN0cmljdGVyIGVuZm9yY2VtZW50cyBvbiB3aGF0CiAgICAgaXMgY29uc2lkZXJlZCB2YWxpZCB3aGVuIHByb2Nlc3NpbmcgQklHTlVNcywgYW5kIGNhdXNlcyBleGVjdXRpb24gdG8KICAgICBhc3NlcnQoKSB3aGVuIGEgcHJvYmxlbSBpcyBkaXNjb3ZlcmVkLiBJZiBCTl9ERUJVR19SQU5EIGlzIGRlZmluZWQsCiAgICAgZnVydGhlciBzdGVwcyBhcmUgdGFrZW4gdG8gZGVsaWJlcmF0ZWx5IHBvbGx1dGUgdW51c2VkIGRhdGEgaW4gQklHTlVNCiAgICAgc3RydWN0dXJlcyB0byB0cnkgYW5kIGV4cG9zZSBmYXVsdHkgY29kZSBmdXJ0aGVyIG9uLiBGb3Igbm93LCBvcGVuc3NsIHdpbGwKICAgICAoaW4gaXRzIGRlZmF1bHQgbW9kZSBvZiBvcGVyYXRpb24pIGNvbnRpbnVlIHRvIHRvbGVyYXRlIHRoZSBpbmNvbnNpc3RlbnQKICAgICBmb3JtcyB0aGF0IGl0IGhhcyB0b2xlcmF0ZWQgaW4gdGhlIHBhc3QsIGJ1dCBhdXRob3JzIGFuZCBwYWNrYWdlcnMgc2hvdWxkCiAgICAgY29uc2lkZXIgdHJ5aW5nIG9wZW5zc2wgYW5kIHRoZWlyIG93biBhcHBsaWNhdGlvbnMgd2hlbiBjb21waWxlZCB3aXRoCiAgICAgdGhlc2UgZGVidWdnaW5nIHN5bWJvbHMgZGVmaW5lZC4gSXQgd2lsbCBoZWxwIGhpZ2hsaWdodCBwb3RlbnRpYWwgYnVncyBpbgogICAgIHRoZWlyIG93biBjb2RlLCBhbmQgd2lsbCBpbXByb3ZlIHRoZSB0ZXN0IGNvdmVyYWdlIGZvciBPcGVuU1NMIGl0c2VsZi4gQXQKICAgICBzb21lIHBvaW50LCB0aGVzZSB0aWdodGVyIHJ1bGVzIHdpbGwgYmVjb21lIG9wZW5zc2wncyBkZWZhdWx0IHRvIGltcHJvdmUKICAgICBtYWludGFpbmFiaWxpdHksIHRob3VnaCB0aGUgYXNzZXJ0KClzIGFuZCBvdGhlciBvdmVyaGVhZHMgd2lsbCByZW1haW4gb25seQogICAgIGluIGRlYnVnZ2luZyBjb25maWd1cmF0aW9ucy4gU2VlIGJuLmggZm9yIG1vcmUgZGV0YWlscy4KICAgICBbR2VvZmYgVGhvcnBlLCBOaWxzIExhcnNjaCwgVWxmIE32bGxlcl0KCiAgKikgQk5fQ1RYX2luaXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBhcyBCTl9DVFggaXMgYW4gb3BhcXVlIHN0cnVjdHVyZQogICAgIHRoYXQgY2FuIG9ubHkgYmUgb2J0YWluZWQgdGhyb3VnaCBCTl9DVFhfbmV3KCkgKHdoaWNoIGltcGxpY2l0bHkKICAgICBpbml0aWFsaXNlcyBpdCkuIFRoZSBwcmVzZW5jZSBvZiB0aGlzIGZ1bmN0aW9uIG9ubHkgbWFkZSBpdCBwb3NzaWJsZQogICAgIHRvIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBzdHJ1Y3R1cmUgKGFuZCBjYXVzZSBtZW1vcnkgbGVha3MpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEJlY2F1c2Ugb2YgdGhlIGNhbGxiYWNrLWJhc2VkIGFwcHJvYWNoIGZvciBpbXBsZW1lbnRpbmcgTEhBU0ggYXMgYQogICAgIHRlbXBsYXRlIHR5cGUsIGxoX2luc2VydCgpIGFkZHMgb3BhcXVlIG9iamVjdHMgdG8gaGFzaC10YWJsZXMgYW5kCiAgICAgbGhfZG9hbGwoKSBvciBsaF9kb2FsbF9hcmcoKSBhcmUgdHlwaWNhbGx5IHVzZWQgd2l0aCBhIGRlc3RydWN0b3IgY2FsbGJhY2sKICAgICB0byBjbGVhbiB1cCB0aG9zZSBjb3JyZXNwb25kaW5nIG9iamVjdHMgYmVmb3JlIGRlc3Ryb3lpbmcgdGhlIGhhc2ggdGFibGUKICAgICAoYW5kIGxvc2luZyB0aGUgb2JqZWN0IHBvaW50ZXJzKS4gU28gc29tZSBvdmVyLXplYWxvdXMgY29uc3RpZmljYXRpb25zIGluCiAgICAgTEhBU0ggaGF2ZSBiZWVuIHJlbGF4ZWQgc28gdGhhdCBsaF9pbnNlcnQoKSBkb2VzIG5vdCB0YWtlIChub3Igc3RvcmUpIHRoZQogICAgIG9iamVjdHMgYXMgImNvbnN0IiBhbmQgdGhlIGxoX2RvYWxsW19hcmddIGNhbGxiYWNrIHdyYXBwZXJzIGFyZSBub3QKICAgICBwcm90b3R5cGVkIHRvIGhhdmUgImNvbnN0IiByZXN0cmljdGlvbnMgb24gdGhlIG9iamVjdCBwb2ludGVycyB0aGV5IGFyZQogICAgIGdpdmVuIChhbmQgc28gYXJlbid0IHJlcXVpcmVkIHRvIGNhc3QgdGhlbSBhd2F5IGFueSBtb3JlKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBUaGUgdG1kaWZmLmggQVBJIHdhcyBzbyB1Z2x5IGFuZCBtaW5pbWFsIHRoYXQgb3VyIG93biB0aW1pbmcgdXRpbGl0eQogICAgIChzcGVlZCkgcHJlZmVycyB0byB1c2UgaXRzIG93biBpbXBsZW1lbnRhdGlvbi4gVGhlIHR3byBpbXBsZW1lbnRhdGlvbnMKICAgICBoYXZlbid0IGJlZW4gY29uc29saWRhdGVkIGFzIHlldCAodm9sdW50ZWVycz8pIGJ1dCB0aGUgdG1kaWZmIEFQSSBoYXMgaGFkCiAgICAgaXRzIG9iamVjdCB0eXBlIHByb3Blcmx5IGV4cG9zZWQgKE1TX1RNKSBpbnN0ZWFkIG9mIGNhc3RpbmcgdG8vZnJvbSAiY2hhcgogICAgICoiLiBUaGlzIG1heSBzdGlsbCBjaGFuZ2UgeWV0IGlmIHNvbWVvbmUgcmVhbGlzZXMgTVNfVE0gYW5kICJtc190aW1lXyoqKiIKICAgICBhcmVuJ3QgbmVjZXNzYXJpbHkgdGhlIGdyZWF0ZXN0IG5vbWVuY2xhdHVyZXMgLSBidXQgdGhpcyBpcyB3aGF0IHdhcyB1c2VkCiAgICAgaW50ZXJuYWxseSB0byB0aGUgaW1wbGVtZW50YXRpb24gc28gSSd2ZSB1c2VkIHRoYXQgZm9yIG5vdy4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBFbnN1cmUgdGhhdCBkZXByZWNhdGVkIGZ1bmN0aW9ucyBkbyBub3QgZ2V0IGNvbXBpbGVkIHdoZW4KICAgICBPUEVOU1NMX05PX0RFUFJFQ0FURUQgaXMgZGVmaW5lZC4gU29tZSAib3BlbnNzbCIgc3ViY29tbWFuZHMgYW5kIGEgZmV3IG9mCiAgICAgdGhlIHNlbGYtdGVzdHMgd2VyZSBzdGlsbCB1c2luZyBkZXByZWNhdGVkIGtleS1nZW5lcmF0aW9uIGZ1bmN0aW9ucyBzbwogICAgIHRoZXNlIGhhdmUgYmVlbiB1cGRhdGVkIGFsc28uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgUmVvcmdhbmlzZSBQS0NTIzcgY29kZSB0byBzZXBhcmF0ZSB0aGUgZGlnZXN0IGxvY2F0aW9uIGZ1bmN0aW9uYWxpdHkKICAgICBpbnRvIFBLQ1M3X2ZpbmRfZGlnZXN0KCksIGRpZ2VzdCBhZGR0aW9uIGludG8gUEtDUzdfYmlvX2FkZF9kaWdlc3QoKS4KICAgICBOZXcgZnVuY3Rpb24gUEtDUzdfc2V0X2RpZ2VzdCgpIHRvIHNldCB0aGUgZGlnZXN0IHR5cGUgZm9yIFBLQ1MjNwogICAgIGRpZ2VzdGVkRGF0YSB0eXBlLiBBZGQgYWRkaXRpb25hbCBjb2RlIHRvIGNvcnJlY3RseSBnZW5lcmF0ZSB0aGUKICAgICBkaWdlc3RlZERhdGEgdHlwZSBhbmQgYWRkIHN1cHBvcnQgZm9yIHRoaXMgdHlwZSBpbiBQS0NTNyBpbml0aWFsaXphdGlvbgogICAgIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb24gUEtDUzdfc2V0MF90eXBlX290aGVyKCkgdGhpcyBpbml0aWFsaXplcyBhIFBLQ1M3IAogICAgIHN0cnVjdHVyZSBvZiB0eXBlICJvdGhlciIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHByaW1lIGdlbmVyYXRpb24gbG9vcCBpbiBjcnlwdG8vYm4vYm5fcHJpbWUucGwgYnkgbWFraW5nCiAgICAgc3VyZSB0aGUgbG9vcCBkb2VzIGNvcnJlY3RseSBzdG9wIGFuZCBicmVha2luZyAoImRpdmlzaW9uIGJ5IHplcm8iKQogICAgIG1vZHVsdXMgb3BlcmF0aW9ucyBhcmUgbm90IHBlcmZvcm1lZC4gVGhlIChwcmUtZ2VuZXJhdGVkKSBwcmltZQogICAgIHRhYmxlIGNyeXB0by9ibi9ibl9wcmltZS5oIHdhcyBhbHJlYWR5IGNvcnJlY3QsIGJ1dCBpdCBjb3VsZCBub3QgYmUKICAgICByZS1nZW5lcmF0ZWQgb24gc29tZSBwbGF0Zm9ybXMgYmVjYXVzZSBvZiB0aGUgImRpdmlzaW9uIGJ5IHplcm8iCiAgICAgc2l0dWF0aW9uIGluIHRoZSBzY3JpcHQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFVwZGF0ZSBzdXBwb3J0IGZvciBFQ0MtYmFzZWQgVExTIGNpcGhlcnN1aXRlcyBhY2NvcmRpbmcgdG8KICAgICBkcmFmdC1pZXRmLXRscy1lY2MtMDMudHh0OiB0aGUgS0RGMSBrZXkgZGVyaXZhdGlvbiBmdW5jdGlvbiB3aXRoCiAgICAgU0hBLTEgbm93IGlzIG9ubHkgdXNlZCBmb3IgInNtYWxsIiBjdXJ2ZXMgKHdoZXJlIHRoZQogICAgIHJlcHJlc2VudGF0aW9uIG9mIGEgZmllbGQgZWxlbWVudCB0YWtlcyB1cCB0byAyNCBieXRlcyk7IGZvcgogICAgIGxhcmdlciBjdXJ2ZXMsIHRoZSBmaWVsZCBlbGVtZW50IHJlc3VsdGluZyBmcm9tIEVDREggaXMgZGlyZWN0bHkKICAgICB1c2VkIGFzIHByZW1hc3RlciBzZWNyZXQuCiAgICAgW0RvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgY29kZSBmb3Iga1ArbFEgdGltaW5ncyB0byBjcnlwdG8vZWMvZWN0ZXN0LmMsIGFuZCBhZGQgU0VDMgogICAgIGN1cnZlIHNlY3AxNjByMSB0byB0aGUgdGVzdHMuCiAgICAgW0RvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgdGhlIHBvc3NpYmlsaXR5IHRvIGxvYWQgc3ltYm9scyBnbG9iYWxseSB3aXRoIERTTy4KICAgICBbR/Z0eiBCYWJpbi1FYmVsbCA8YmFiaW4tZWJlbGxAdHJ1c3RjZW50ZXIuZGU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZnVuY3Rpb25zIEVSUl9zZXRfbWFyaygpIGFuZCBFUlJfcG9wX3RvX21hcmsoKSBmb3IgYmV0dGVyCiAgICAgY29udHJvbCBvZiB0aGUgZXJyb3Igc3RhY2suCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFNUT1JFIGluIEVOR0lORS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIFNUT1JFIHR5cGUuICBUaGUgaW50ZW50aW9uIGlzIHRvIHByb3ZpZGUgYSBjb21tb24gaW50ZXJmYWNlCiAgICAgdG8gY2VydGlmaWNhdGUgYW5kIGtleSBzdG9yZXMsIGJlIHRoZXkgc2ltcGxlIGZpbGUtYmFzZWQgc3RvcmVzLCBvcgogICAgIEhTTS10eXBlIHN0b3JlLCBvciBMREFQIHN0b3Jlcywgb3IuLi4KICAgICBOT1RFOiBUaGUgY29kZSBpcyBjdXJyZW50bHkgVU5URVNURUQgYW5kIGlzbid0IHJlYWxseSB1c2VkIGFueXdoZXJlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBhIGdlbmVyaWMgc3RydWN0dXJlIGNhbGxlZCBPUEVOU1NMX0lURU0uICBUaGlzIGNhbiBiZSB1c2VkIHRvCiAgICAgcGFzcyBhIGxpc3Qgb2YgYXJndW1lbnRzIHRvIGFueSBmdW5jdGlvbiBhcyB3ZWxsIGFzIHByb3ZpZGUgYSB3YXkKICAgICBmb3IgYSBmdW5jdGlvbiB0byBwYXNzIGRhdGEgYmFjayB0byB0aGUgY2FsbGVyLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZnVuY3Rpb25zIEJVRl9zdHJuZHVwKCkgYW5kIEJVRl9tZW1kdXAoKS4gIEJVRl9zdHJuZHVwKCkKICAgICB3b3JrcyBsaWtlIEJVRl9zdHJkdXAoKSBidXQgY2FuIGJlIHVzZWQgdG8gZHVwbGljYXRlIGEgcG9ydGlvbiBvZgogICAgIGEgc3RyaW5nLiAgVGhlIGNvcHkgZ2V0cyBOVUwtdGVybWluYXRlZC4gIEJVRl9tZW1kdXAoKSBkdXBsaWNhdGVzCiAgICAgYSBtZW1vcnkgYXJlYS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGZ1bmN0aW9uIHNrX2ZpbmRfZXgoKSB3aGljaCB3b3JrcyBsaWtlIHNrX2ZpbmQoKSwgYnV0IHdpbGwKICAgICByZXR1cm4gYW4gaW5kZXggdG8gYW4gZWxlbWVudCBldmVuIGlmIGFuIGV4YWN0IG1hdGNoIGNvdWxkbid0IGJlCiAgICAgZm91bmQuICBUaGUgaW5kZXggaXMgZ3VhcmFudGVlZCB0byBwb2ludCBhdCB0aGUgZWxlbWVudCB3aGVyZSB0aGUKICAgICBzZWFyY2hlZC1mb3Iga2V5IHdvdWxkIGJlIGluc2VydGVkIHRvIHByZXNlcnZlIHNvcnRpbmcgb3JkZXIuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBmdW5jdGlvbiBPQkpfYnNlYXJjaF9leCgpIHdoaWNoIHdvcmtzIGxpa2UgT0JKX2JzZWFyY2goKSBidXQKICAgICB0YWtlcyBhbiBleHRyYSBmbGFncyBhcmd1bWVudCBmb3Igb3B0aW9uYWwgZnVuY3Rpb25hbGl0eS4gIEN1cnJlbnRseSwKICAgICB0aGUgZm9sbG93aW5nIGZsYWdzIGFyZSBkZWZpbmVkOgoKCU9CSl9CU0VBUkNIX1ZBTFVFX09OX05PTUFUQ0gKCVRoaXMgb25lIGdldHMgT0JKX2JzZWFyY2hfZXgoKSB0byByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdAoJZWxlbWVudCB3aGVyZSB0aGUgY29tcGFyaW5nIGZ1bmN0aW9uIHJldHVybnMgYSBuZWdhdGl2ZSBvciB6ZXJvCgludW1iZXIuCgoJT0JKX0JTRUFSQ0hfRklSU1RfVkFMVUVfT05fTUFUQ0gKCVRoaXMgb25lIGdldHMgT0JKX2JzZWFyY2hfZXgoKSB0byByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBmaXJzdAoJZWxlbWVudCB3aGVyZSB0aGUgY29tcGFyaW5nIGZ1bmN0aW9uIHJldHVybnMgemVyby4gIFRoaXMgaXMgdXNlZnVsCglpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBlbGVtZW50IHdoZXJlIHRoZSBjb21wYXJpbmcgZnVuY3Rpb24KCXJldHVybnMgemVyby4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGNyZWF0ZSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMgd2l0aCAnb3BlbnNzbCBjYScKICAgICBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlIGJlY29tZXMgcGFydCBvZiB0aGUKICAgICBDQSBkYXRhYmFzZSBhbmQgdXNlcyB0aGUgc2FtZSBtZWNoYW5pc21zIGZvciBzZXJpYWwgbnVtYmVyIGdlbmVyYXRpb24KICAgICBhcyBhbGwgb3RoZXIgY2VydGlmaWNhdGUgc2lnbmluZy4gIFRoZSBuZXcgZmxhZyAnLXNlbGZzaWduJyBlbmFibGVzCiAgICAgdGhpcyBmdW5jdGlvbmFsaXR5LiAgQWRhcHQgQ0Euc2ggYW5kIENBLnBsLmluLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBmdW5jdGlvbmFsaXR5IHRvIGNoZWNrIHRoZSBwdWJsaWMga2V5IG9mIGEgY2VydGlmaWNhdGUgcmVxdWVzdAogICAgIGFnYWluc3QgYSBnaXZlbiBwcml2YXRlLiAgVGhpcyBpcyB1c2VmdWwgdG8gY2hlY2sgdGhhdCBhIGNlcnRpZmljYXRlCiAgICAgcmVxdWVzdCBjYW4gYmUgc2lnbmVkIGJ5IHRoYXQga2V5IChzZWxmLXNpZ25pbmcpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gaGF2ZSBtdWx0aXBsZSBhY3RpdmUgY2VydGlmaWNhdGVzIHdpdGggdGhlIHNhbWUKICAgICBzdWJqZWN0IGluIHRoZSBDQSBpbmRleCBmaWxlLiAgVGhpcyBpcyBkb25lIG9ubHkgaWYgdGhlIGtleXdvcmQKICAgICAndW5pcXVlX3N1YmplY3QnIGlzIHNldCB0byAnbm8nIGluIHRoZSBtYWluIENBIHNlY3Rpb24gKGRlZmF1bHQKICAgICBpZiAnQ0FfZGVmYXVsdCcpIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuICBUaGUgdmFsdWUgaXMgc2F2ZWQKICAgICB3aXRoIHRoZSBkYXRhYmFzZSBpdHNlbGYgaW4gYSBzZXBhcmF0ZSBpbmRleCBhdHRyaWJ1dGUgZmlsZSwKICAgICBuYW1lZCBsaWtlIHRoZSBpbmRleCBmaWxlIHdpdGggJy5hdHRyJyBhcHBlbmRlZCB0byB0aGUgbmFtZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBHZW5lcmF0ZSBtdXRpIHZhbHVlZCBBVkFzIHVzaW5nICcrJyBub3RhdGlvbiBpbiBjb25maWcgZmlsZXMgZm9yCiAgICAgcmVxIGFuZCBkaXJOYW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIG5hbWVDb25zdHJhaW50cyBjZXJ0aWZpY2F0ZSBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgcG9saWN5Q29uc3RyYWludHMgY2VydGlmaWNhdGUgZXh0ZW5zaW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIHBvbGljeU1hcHBpbmdzIGNlcnRpZmljYXRlIGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHN1cmUgdGhlIGRlZmF1bHQgRFNBX01FVEhPRCBpbXBsZW1lbnRhdGlvbiBvbmx5IHVzZXMgaXRzCiAgICAgZHNhX21vZF9leHAoKSBhbmQvb3IgYm5fbW9kX2V4cCgpIGhhbmRsZXJzIGlmIHRoZXkgYXJlIG5vbi1OVUxMLAogICAgIGFuZCBjaGFuZ2UgaXRzIG93biBoYW5kbGVycyB0byBiZSBOVUxMIHNvIGFzIHRvIHJlbW92ZSB1bm5lY2Vzc2FyeQogICAgIGluZGlyZWN0aW9uLiBUaGlzIGxldHMgYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb25zIGZhbGxiYWNrIHRvIHRoZQogICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gbW9yZSBlYXNpbHkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgU3VwcG9ydCBmb3IgZGlyZWN0b3J5TmFtZSBpbiBHZW5lcmFsTmFtZSByZWxhdGVkIGV4dGVuc2lvbnMKICAgICBpbiBjb25maWcgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBsaW5rIGFwcGxpY2F0aW9ucyB1c2luZyBNYWtlZmlsZS5zaGFyZWQuCiAgICAgTWFrZSB0aGF0IHBvc3NpYmxlIGV2ZW4gd2hlbiBsaW5raW5nIGFnYWluc3Qgc3RhdGljIGxpYnJhcmllcyEKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBTdXBwb3J0IGZvciBzaW5nbGUgcGFzcyBwcm9jZXNzaW5nIGZvciBTL01JTUUgc2lnbmluZy4gVGhpcyBub3cKICAgICBtZWFucyB0aGF0IFMvTUlNRSBzaWduaW5nIGNhbiBiZSBkb25lIGZyb20gYSBwaXBlLCBpbiBhZGRpdGlvbgogICAgIGNsZWFydGV4dCBzaWduaW5nIChtdWx0aXBhcnQvc2lnbmVkIHR5cGUpIGlzIGVmZmVjdGl2ZWx5IHN0cmVhbWluZwogICAgIGFuZCB0aGUgc2lnbmVkIGRhdGEgZG9lcyBub3QgbmVlZCB0byBiZSBhbGwgaGVsZCBpbiBtZW1vcnkuCgogICAgIFRoaXMgaXMgZG9uZSB3aXRoIGEgbmV3IGZsYWcgUEtDUzdfU1RSRUFNLiBXaGVuIHRoaXMgZmxhZyBpcyBzZXQKICAgICBQS0NTN19zaWduKCkgb25seSBpbml0aWFsaXplcyB0aGUgUEtDUzcgc3RydWN0dXJlIGFuZCB0aGUgYWN0dWFsIHNpZ25pbmcKICAgICBpcyBkb25lIGFmdGVyIHRoZSBkYXRhIGlzIG91dHB1dCAoYW5kIGRpZ2VzdHMgY2FsY3VsYXRlZCkgaW4KICAgICBTTUlNRV93cml0ZV9QS0NTNygpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBmdWxsIHN1cHBvcnQgZm9yIC1ycGF0aC8tUiwgYm90aCBpbiBzaGFyZWQgbGlicmFyaWVzIGFuZAogICAgIGFwcGxpY2F0aW9ucywgYXQgbGVhc3Qgb24gdGhlIHBsYXRmb3JtcyB3aGVyZSBpdCdzIGtub3duIGhvdwogICAgIHRvIGRvIGl0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIGNyeXB0by9lYy9lY19tdWx0LmMsIGltcGxlbWVudCBmYXN0IHBvaW50IG11bHRpcGxpY2F0aW9uIHdpdGgKICAgICBwcmVjb21wdXRhdGlvbiwgYmFzZWQgb24gd05BRiBzcGxpdHRpbmc6IEVDX0dST1VQX3ByZWNvbXB1dGVfbXVsdCgpCiAgICAgd2lsbCBub3cgY29tcHV0ZSBhIHRhYmxlIG9mIG11bHRpcGxlcyBvZiB0aGUgZ2VuZXJhdG9yIHRoYXQKICAgICBtYWtlcyBzdWJzZXF1ZW50IGludm9jYXRpb25zIG9mIEVDX1BPSU5Uc19tdWwoKSBvciBFQ19QT0lOVF9tdWwoKQogICAgIGZhc3RlciAobm90YWJseSBpbiB0aGUgY2FzZSBvZiBhIHNpbmdsZSBwb2ludCBtdWx0aXBsaWNhdGlvbiwKICAgICBzY2FsYXIgKiBnZW5lcmF0b3IpLgogICAgIFtOaWxzIExhcnNjaCwgQm9kbyBNb2VsbGVyXQoKICAqKSBJUHY2IHN1cHBvcnQgZm9yIGNlcnRpZmljYXRlIGV4dGVuc2lvbnMuIFRoZSB2YXJpb3VzIGV4dGVuc2lvbnMKICAgICB3aGljaCB1c2UgdGhlIElQOmEuYi5jLmQgY2FuIG5vdyB0YWtlIElQdjYgYWRkcmVzc2VzIHVzaW5nIHRoZQogICAgIGZvcm1hdHMgb2YgUkZDMTg4NCAyLjIgLiBJUHY2IGFkZHJlc3NlcyBhcmUgbm93IGFsc28gZGlzcGxheWVkCiAgICAgY29ycmVjdGx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIGFuIEVOR0lORSB0aGF0IGltcGxlbWVudHMgUlNBIGJ5IHBlcmZvcm1pbmcgcHJpdmF0ZSBrZXkKICAgICBleHBvbmVudGlhdGlvbnMgd2l0aCB0aGUgR01QIGxpYnJhcnkuIFRoZSBjb252ZXJzaW9ucyB0byBhbmQgZnJvbQogICAgIEdNUCdzIG1wel90IGZvcm1hdCBhcmVuJ3Qgb3B0aW1pc2VkIG5vciBhcmUgYW55IG1vbnRnb21lcnkgZm9ybXMKICAgICBjYWNoZWQsIGFuZCBvbiB4ODYgaXQgYXBwZWFycyBPcGVuU1NMJ3Mgb3duIHBlcmZvcm1hbmNlIGhhcyBjYXVnaHQgdXAuCiAgICAgSG93ZXZlciB0aGVyZSBhcmUgbGlrZWx5IHRvIGJlIG90aGVyIGFyY2hpdGVjdHVyZXMgd2hlcmUgR01QIGNvdWxkCiAgICAgcHJvdmlkZSBhIGJvb3N0LiBUaGlzIEVOR0lORSBpcyBub3QgYnVpbHQgaW4gYnkgZGVmYXVsdCwgYnV0IGl0IGNhbiBiZQogICAgIHNwZWNpZmllZCBhdCBDb25maWd1cmUgdGltZSBhbmQgc2hvdWxkIGJlIGFjY29tcGFuaWVkIGJ5IHRoZSBuZWNlc3NhcnkKICAgICBsaW5rZXIgYWRkaXRpb25zLCBlZzsKICAgICAgICAgLi9jb25maWcgLURPUEVOU1NMX1VTRV9HTVAgLWxnbXAKICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSAib3BlbnNzbCBlbmdpbmUiIHdpbGwgbm90IGRpc3BsYXkgRU5HSU5FL0RTTyBsb2FkIGZhaWx1cmUgZXJyb3JzIHdoZW4KICAgICB0ZXN0aW5nIGF2YWlsYWJpbGl0eSBvZiBlbmdpbmVzIHdpdGggIi10IiAtIHRoZSBvbGQgYmVoYXZpb3VyIGlzCiAgICAgcHJvZHVjZWQgYnkgaW5jcmVhc2luZyB0aGUgZmVhdHVyZSdzIHZlcmJvc2l0eSB3aXRoICItdHQiLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEVDRFNBIHJvdXRpbmVzOiB1bmRlciBjZXJ0YWluIGVycm9yIGNvbmRpdGlvbnMgdW5pbml0aWFsaXplZCBCTiBvYmplY3RzCiAgICAgY291bGQgYmUgZnJlZWQuIFNvbHV0aW9uOiBtYWtlIHN1cmUgaW5pdGlhbGl6YXRpb24gaXMgcGVyZm9ybWVkIGVhcmx5CiAgICAgZW5vdWdoLiAoUmVwb3J0ZWQgYW5kIGZpeCBzdXBwbGllZCBieSBOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPgogICAgIHZpYSBQUiM0NTkpCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEtleS1nZW5lcmF0aW9uIGNhbiBub3cgYmUgaW1wbGVtZW50ZWQgaW4gUlNBX01FVEhPRCwgRFNBX01FVEhPRAogICAgIGFuZCBESF9NRVRIT0QgKGVnLiBieSBFTkdJTkUgaW1wbGVtZW50YXRpb25zKSB0byBvdmVycmlkZSB0aGUgbm9ybWFsCiAgICAgc29mdHdhcmUgaW1wbGVtZW50YXRpb25zLiBGb3IgRFNBIGFuZCBESCwgcGFyYW1ldGVyIGdlbmVyYXRpb24gY2FuCiAgICAgYWxzbyBiZSBvdmVycmlkZW4gYnkgcHJvdmlkaW5nIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgY2FsbGJhY2tzLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIENoYW5nZSB0aGUgInByb2dyZXNzIiBtZWNoYW5pc20gdXNlZCBpbiBrZXktZ2VuZXJhdGlvbiBhbmQKICAgICBwcmltYWxpdHkgdGVzdGluZyB0byBmdW5jdGlvbnMgdGhhdCB0YWtlIGEgbmV3IEJOX0dFTkNCIHBvaW50ZXIgaW4KICAgICBwbGFjZSBvZiBjYWxsYmFjay9hcmd1bWVudCBwYWlycy4gVGhlIG5ldyBBUEkgZnVuY3Rpb25zIGhhdmUgIl9leCIKICAgICBwb3N0Zml4ZXMgYW5kIHRoZSBvbGRlciBmdW5jdGlvbnMgYXJlIHJlaW1wbGVtZW50ZWQgYXMgd3JhcHBlcnMgZm9yCiAgICAgdGhlIG5ldyBvbmVzLiBUaGUgT1BFTlNTTF9OT19ERVBSRUNBVEVEIHN5bWJvbCBjYW4gYmUgdXNlZCB0byBoaWRlCiAgICAgZGVjbGFyYXRpb25zIG9mIHRoZSBvbGQgZnVuY3Rpb25zIHRvIGhlbHAgKGdyYWNlZnVsKSBhdHRlbXB0cyB0bwogICAgIG1pZ3JhdGUgdG8gdGhlIG5ldyBmdW5jdGlvbnMuIEFsc28sIHRoZSBuZXcga2V5LWdlbmVyYXRpb24gQVBJCiAgICAgZnVuY3Rpb25zIG9wZXJhdGUgb24gYSBjYWxsZXItc3VwcGxpZWQga2V5LXN0cnVjdHVyZSBhbmQgcmV0dXJuCiAgICAgc3VjY2Vzcy9mYWlsdXJlIHJhdGhlciB0aGFuIHJldHVybmluZyBhIGtleSBvciBOVUxMIC0gdGhpcyBpcyB0bwogICAgIGhlbHAgbWFrZSAia2V5Z2VuIiBhbm90aGVyIG1lbWJlciBmdW5jdGlvbiBvZiBSU0FfTUVUSE9EIGV0Yy4KCiAgICAgRXhhbXBsZSBmb3IgdXNpbmcgdGhlIG5ldyBjYWxsYmFjayBpbnRlcmZhY2U6CgogICAgICAgICAgaW50ICgqbXlfY2FsbGJhY2spKGludCBhLCBpbnQgYiwgQk5fR0VOQ0IgKmNiKSA9IC4uLjsKICAgICAgICAgIHZvaWQgKm15X2FyZyA9IC4uLjsKICAgICAgICAgIEJOX0dFTkNCIG15X2NiOwoKICAgICAgICAgIEJOX0dFTkNCX3NldCgmbXlfY2IsIG15X2NhbGxiYWNrLCBteV9hcmcpOwoKICAgICAgICAgIHJldHVybiBCTl9pc19wcmltZV9leChzb21lX2JpZ251bSwgQk5fcHJpbWVfY2hlY2tzLCBOVUxMLCAmY2IpOwogICAgICAgICAgLyogRm9yIHRoZSBtZWFuaW5nIG9mIGEsIGIgaW4gY2FsbHMgdG8gbXlfY2FsbGJhY2soKSwgc2VlIHRoZQogICAgICAgICAgICogZG9jdW1lbnRhdGlvbiBvZiB0aGUgZnVuY3Rpb24gdGhhdCBjYWxscyB0aGUgY2FsbGJhY2suCiAgICAgICAgICAgKiBjYiB3aWxsIHBvaW50IHRvIG15X2NiOyBteV9hcmcgY2FuIGJlIHJldHJpZXZlZCBhcyBjYi0+YXJnLgogICAgICAgICAgICogbXlfY2FsbGJhY2sgc2hvdWxkIHJldHVybiAxIGlmIGl0IHdhbnRzIEJOX2lzX3ByaW1lX2V4KCkKICAgICAgICAgICAqIHRvIGNvbnRpbnVlLCBvciAwIHRvIHN0b3AuCiAgICAgICAgICAgKi8KCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ2hhbmdlIHRoZSBaTElCIGNvbXByZXNzaW9uIG1ldGhvZCB0byBiZSBzdGF0ZWZ1bCwgYW5kIG1ha2UgaXQKICAgICBhdmFpbGFibGUgdG8gVExTIHdpdGggdGhlIG51bWJlciBkZWZpbmVkIGluIAogICAgIGRyYWZ0LWlldGYtdGxzLWNvbXByZXNzaW9uLTA0LnR4dC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIEFTTi4xIHN0cnVjdHVyZXMgYW5kIGZ1bmN0aW9ucyBmb3IgQ2VydGlmaWNhdGVQYWlyLCB3aGljaAogICAgIGlzIGRlZmluZWQgYXMgZm9sbG93cyAoYWNjb3JkaW5nIHRvIFguNTA5XzR0aEVkaXRpb25EcmFmdFY2LnBkZik6CgogICAgIENlcnRpZmljYXRlUGFpciA6Oj0gU0VRVUVOQ0UgewogICAgICAgIGZvcndhcmQJCVswXQlDZXJ0aWZpY2F0ZSBPUFRJT05BTCwKICAgICAgICByZXZlcnNlCQlbMV0JQ2VydGlmaWNhdGUgT1BUSU9OQUwsCiAgICAgICAgLS0gYXQgbGVhc3Qgb25lIG9mIHRoZSBwYWlyIHNoYWxsIGJlIHByZXNlbnQgLS0gfQoKICAgICBBbHNvIGltcGxlbWVudCB0aGUgUEVNIGZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBjZXJ0aWZpY2F0ZQogICAgIHBhaXJzLCBhbmQgZGVmaW5lZCB0aGUgUEVNIHRhZyBhcyAiQ0VSVElGSUNBVEUgUEFJUiIuCgogICAgIFRoaXMgbmVlZGVkIHRvIGJlIGRlZmluZWQsIG1vc3RseSBmb3IgdGhlIHNha2Ugb2YgdGhlIExEQVAKICAgICBhdHRyaWJ1dGUgY3Jvc3NDZXJ0aWZpY2F0ZVBhaXIsIGJ1dCBtYXkgcHJvdmUgdXNlZnVsIGVsc2V3aGVyZSBhcwogICAgIHdlbGwuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBpbmhpYml0IHN5bWxpbmtpbmcgb2Ygc2hhcmVkIGxpYnJhcmllcyBpbgogICAgIE1ha2VmaWxlLnNoYXJlZCwgZm9yIEN5Z3dpbidzIHNha2UuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgRXh0ZW5kIHRoZSBCSUdOVU0gQVBJIGJ5IGNyZWF0aW5nIGEgZnVuY3Rpb24gCiAgICAgICAgICB2b2lkIEJOX3NldF9uZWdhdGl2ZShCSUdOVU0gKmEsIGludCBuZWcpOwogICAgIGFuZCBhIG1hY3JvIHRoYXQgYmVoYXZlIGxpa2UKICAgICAgICAgIGludCAgQk5faXNfbmVnYXRpdmUoY29uc3QgQklHTlVNICphKTsKCiAgICAgdG8gYXZvaWQgdGhlIG5lZWQgdG8gYWNjZXNzICdhLT5uZWcnIGRpcmVjdGx5IGluIGFwcGxpY2F0aW9ucy4KICAgICBbTmlscyBMYXJzY2hdCgogICopIEltcGxlbWVudCBmYXN0IG1vZHVsYXIgcmVkdWN0aW9uIGZvciBwc2V1ZG8tTWVyc2VubmUgcHJpbWVzCiAgICAgdXNlZCBpbiBOSVNUIGN1cnZlcyAoY3J5cHRvL2JuL2JuX25pc3QuYywgY3J5cHRvL2VjL2VjcF9uaXN0LmMpLgogICAgIEVDX0dST1VQX25ld19jdXJ2ZV9HRnAoKSB3aWxsIG5vdyBhdXRvbWF0aWNhbGx5IHVzZSB0aGlzCiAgICAgaWYgYXBwbGljYWJsZS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCBuZXcgbG9jayB0eXBlIChDUllQVE9fTE9DS19CTikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSBFTkdJTkUgZnJhbWV3b3JrIHRvIGF1dG9tYXRpY2FsbHkgbG9hZCBlbmdpbmVzCiAgICAgZHluYW1pY2FsbHkgZnJvbSBzcGVjaWZpYyBkaXJlY3RvcmllcyB1bmxlc3MgdGhleSBjb3VsZCBiZQogICAgIGZvdW5kIHRvIGFscmVhZHkgYmUgYnVpbHQgaW4gb3IgbG9hZGVkLiAgTW92ZSBhbGwgdGhlCiAgICAgY3VycmVudCBlbmdpbmVzIGV4Y2VwdCBmb3IgdGhlIGNyeXB0b2RldiBvbmUgdG8gYSBuZXcKICAgICBkaXJlY3RvcnkgZW5naW5lcy8uCiAgICAgVGhlIGVuZ2luZXMgaW4gZW5naW5lcy8gYXJlIGJ1aWx0IGFzIHNoYXJlZCBsaWJyYXJpZXMgaWYKICAgICB0aGUgInNoYXJlZCIgb3B0aW9ucyB3YXMgZ2l2ZW4gdG8gLi9Db25maWd1cmUgb3IgLi9jb25maWcuCiAgICAgT3RoZXJ3aXNlLCB0aGV5IGFyZSBpbnNlcnRlZCBpbiBsaWJjcnlwdG8uYS4KICAgICAvdXNyL2xvY2FsL3NzbC9lbmdpbmVzIGlzIHRoZSBkZWZhdWx0IGRpcmVjdG9yeSBmb3IgZHluYW1pYwogICAgIGVuZ2luZXMsIGJ1dCB0aGF0IGNhbiBiZSBvdmVycmlkZW4gYXQgY29uZmlndXJlIHRpbWUgdGhyb3VnaAogICAgIHRoZSB1c3VhbCB1c2Ugb2YgLS1wcmVmaXggYW5kL29yIC0tb3BlbnNzbGRpciwgYW5kIGF0IHJ1bgogICAgIHRpbWUgd2l0aCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgT1BFTlNTTF9FTkdJTkVTLgogICAgIFtHZW9mZiBUaG9ycGUgYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIE1ha2VmaWxlLnNoYXJlZCwgYSBoZWxwZXIgbWFrZWZpbGUgdG8gYnVpbGQgc2hhcmVkCiAgICAgbGlicmFyaWVzLiAgQWRkYXB0IE1ha2VmaWxlLm9yZy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdmVyc2lvbiBpbmZvIHRvIFdpbjMyIERMTHMuCiAgICAgW1BldGVyICdMdW5hJyBSdW5lc3RpZyIgPHBldGVyQHJ1bmVzdGlnLmNvbT5dCgogICopIEFkZCBuZXcgJ21lZGl1bSBsZXZlbCcgUEtDUyMxMiBBUEkuIENlcnRpZmljYXRlcyBhbmQga2V5cwogICAgIGNhbiBiZSBhZGRlZCB1c2luZyB0aGlzIEFQSSB0byBjcmVhdGVkIGFyYml0cmFyeSBQS0NTIzEyCiAgICAgZmlsZXMgd2hpbGUgYXZvaWRpbmcgdGhlIGxvdyBsZXZlbCBBUEkuCgogICAgIE5ldyBvcHRpb25zIHRvIFBLQ1MxMl9jcmVhdGUoKSwga2V5IG9yIGNlcnQgY2FuIGJlIE5VTEwgYW5kCiAgICAgd2lsbCB0aGVuIGJlIG9taXR0ZWQgZnJvbSB0aGUgb3V0cHV0IGZpbGUuIFRoZSBlbmNyeXB0aW9uCiAgICAgYWxnb3JpdGhtIE5JRHMgY2FuIGJlIHNldCB0byAtMSBmb3Igbm8gZW5jcnlwdGlvbiwgdGhlIG1hYwogICAgIGl0ZXJhdGlvbiBjb3VudCBjYW4gYmUgc2V0IHRvIDAgdG8gb21pdCB0aGUgbWFjLgoKICAgICBFbmhhbmNlIHBrY3MxMiB1dGlsaXR5IGJ5IG1ha2luZyB0aGUgLW5va2V5cyBhbmQgLW5vY2VydHMKICAgICBvcHRpb25zIHdvcmsgd2hlbiBjcmVhdGluZyBhIFBLQ1MjMTIgZmlsZS4gTmV3IG9wdGlvbiAtbm9tYWMKICAgICB0byBvbWl0IHRoZSBtYWMsIE5PTkUgY2FuIGJlIHNldCBmb3IgYW4gZW5jcnlwdGlvbiBhbGdvcml0aG0uCiAgICAgTmV3IGNvZGUgaXMgbW9kaWZpZWQgdG8gdXNlIHRoZSBlbmhhbmNlZCBQS0NTMTJfY3JlYXRlKCkKICAgICBpbnN0ZWFkIG9mIHRoZSBsb3cgbGV2ZWwgQVBJLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEV4dGVuZCBBU04xIGVuY29kZXIgdG8gc3VwcG9ydCBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZAogICAgIGVuY29kaW5nLiBUaGlzIGNhbiBvdXRwdXQgc2VxdWVuY2VzIHRhZ3MgYW5kIG9jdGV0IHN0cmluZ3MgaW4KICAgICB0aGlzIGZvcm0uIE1vZGlmeSBwazdfYXNuMS5jIHRvIHN1cHBvcnQgaW5kZWZpbml0ZSBsZW5ndGgKICAgICBlbmNvZGluZy4gVGhpcyBpcyBleHBlcmltZW50YWwgYW5kIG5lZWRzIGFkZGl0aW9uYWwgY29kZSB0bwogICAgIGJlIHVzZWZ1bCwgc3VjaCBhcyBhbiBBU04xIGJpbyBhbmQgc29tZSBlbmhhbmNlZCBzdHJlYW1pbmcKICAgICBQS0NTIzcgY29kZS4KCiAgICAgRXh0ZW5kIHRlbXBsYXRlIGVuY29kZSBmdW5jdGlvbmFsaXR5IHNvIHRoYXQgdGFnZ2luZyBpcyBwYXNzZWQKICAgICBkb3duIHRvIHRoZSB0ZW1wbGF0ZSBlbmNvZGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIExldCAnb3BlbnNzbCByZXEnIGZhaWwgaWYgYW4gYXJndW1lbnQgdG8gJy1uZXdrZXknIGlzIG5vdAogICAgIHJlY29nbml6ZWQgaW5zdGVhZCBvZiB1c2luZyBSU0EgYXMgYSBkZWZhdWx0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBFQ0MtYmFzZWQgY2lwaGVyc3VpdGVzIGZyb20gZHJhZnQtaWV0Zi10bHMtZWNjLTAxLnR4dC4KICAgICBBcyB0aGVzZSBhcmUgbm90IG9mZmljaWFsLCB0aGV5IGFyZSBub3QgaW5jbHVkZWQgaW4gIkFMTCI7CiAgICAgdGhlICJFQ0NkcmFmdCIgY2lwaGVyc3VpdGUgZ3JvdXAgYWxpYXMgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHRoZW0uCiAgICAgW1ZpcHVsIEd1cHRhIGFuZCBTdW1pdCBHdXB0YSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBBZGQgRUNESCBlbmdpbmUgc3VwcG9ydC4KICAgICBbTmlscyBHdXJhIGFuZCBEb3VnbGFzIFN0ZWJpbGEgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIEVDREggaW4gbmV3IGRpcmVjdG9yeSBjcnlwdG8vZWNkaC8uCiAgICAgW0RvdWdsYXMgU3RlYmlsYSAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBMZXQgQk5fcmFuZF9yYW5nZSgpIGFib3J0IHdpdGggYW4gZXJyb3IgYWZ0ZXIgMTAwIGl0ZXJhdGlvbnMKICAgICB3aXRob3V0IHN1Y2Nlc3MgKHdoaWNoIGluZGljYXRlcyBhIGJyb2tlbiBQUk5HKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgQk5fbW9kX3NxcnQoKSBzbyB0aGF0IGl0IHZlcmlmaWVzIHRoYXQgdGhlIGlucHV0IHZhbHVlCiAgICAgaXMgcmVhbGx5IHRoZSBzcXVhcmUgb2YgdGhlIHJldHVybiB2YWx1ZS4gIChQcmV2aW91c2x5LAogICAgIEJOX21vZF9zcXJ0IHdvdWxkIHNob3cgR0lHTyBiZWhhdmlvdXIuKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBuYW1lZCBlbGxpcHRpYyBjdXJ2ZXMgb3ZlciBiaW5hcnkgZmllbGRzIGZyb20gWDkuNjIsIFNFQ0csCiAgICAgYW5kIFdBUC9XVExTOyBhZGQgT0lEcyB0aGF0IHdlcmUgc3RpbGwgbWlzc2luZy4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEV4dGVuZCB0aGUgRUMgbGlicmFyeSBmb3IgZWxsaXB0aWMgY3VydmVzIG92ZXIgYmluYXJ5IGZpZWxkcwogICAgIChuZXcgZmlsZXMgZWMyX3NtcGwuYywgZWMyX3NtcHQuYywgZWMyX211bHQuYyBpbiBjcnlwdG8vZWMvKS4KICAgICBOZXcgRUNfTUVUSE9EOgoKICAgICAgICAgIEVDX0dGMm1fc2ltcGxlX21ldGhvZAoKICAgICBOZXcgQVBJIGZ1bmN0aW9uczoKCiAgICAgICAgICBFQ19HUk9VUF9uZXdfY3VydmVfR0YybQogICAgICAgICAgRUNfR1JPVVBfc2V0X2N1cnZlX0dGMm0KICAgICAgICAgIEVDX0dST1VQX2dldF9jdXJ2ZV9HRjJtCiAgICAgICAgICBFQ19QT0lOVF9zZXRfYWZmaW5lX2Nvb3JkaW5hdGVzX0dGMm0KICAgICAgICAgIEVDX1BPSU5UX2dldF9hZmZpbmVfY29vcmRpbmF0ZXNfR0YybQogICAgICAgICAgRUNfUE9JTlRfc2V0X2NvbXByZXNzZWRfY29vcmRpbmF0ZXNfR0YybQoKICAgICBQb2ludCBjb21wcmVzc2lvbiBmb3IgYmluYXJ5IGZpZWxkcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0IGZvcgogICAgIHBhdGVudCByZWFzb25zIChjb21waWxlIHdpdGggT1BFTlNTTF9FQ19CSU5fUFRfQ09NUCBkZWZpbmVkIHRvCiAgICAgZW5hYmxlIGl0KS4KCiAgICAgQXMgYmluYXJ5IHBvbHlub21pYWxzIGFyZSByZXByZXNlbnRlZCBhcyBCSUdOVU1zLCB2YXJpb3VzIG1lbWJlcnMKICAgICBvZiB0aGUgRUNfR1JPVVAgYW5kIEVDX1BPSU5UIGRhdGEgc3RydWN0dXJlcyBjYW4gYmUgc2hhcmVkCiAgICAgYmV0d2VlbiB0aGUgaW1wbGVtZW50YXRpb25zIGZvciBwcmltZSBmaWVsZHMgYW5kIGJpbmFyeSBmaWVsZHM7CiAgICAgdGhlIGFib3ZlIC4uLl9HRjJtIGZ1bmN0aW9ucyAoZXhjZXB0IGZvciBFWF9HUk9VUF9uZXdfY3VydmVfR0YybSkKICAgICBhcmUgZXNzZW50aWFsbHkgaWRlbnRpY2FsIHRvIHRoZWlyIC4uLl9HRnAgY291bnRlcnBhcnRzLgogICAgIChGb3Igc2ltcGxpY2l0eSwgdGhlICcuLi5fR0ZwJyBwcmVmaXggaGFzIGJlZW4gZHJvcHBlZCBmcm9tCiAgICAgdmFyaW91cyBpbnRlcm5hbCBtZXRob2QgbmFtZXMuKQoKICAgICBBbiBpbnRlcm5hbCAnZmllbGRfZGl2JyBtZXRob2QgKHNpbWlsYXIgdG8gJ2ZpZWxkX211bCcgYW5kCiAgICAgJ2ZpZWxkX3NxcicpIGhhcyBiZWVuIGFkZGVkOyB0aGlzIGlzIHVzZWQgb25seSBmb3IgYmluYXJ5IGZpZWxkcy4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIE9wdGlvbmFsbHkgZGlzcGF0Y2ggRUNfUE9JTlRfbXVsKCksIEVDX1BPSU5UX3ByZWNvbXB1dGVfbXVsdCgpCiAgICAgdGhyb3VnaCBtZXRob2RzICgnbXVsJywgJ3ByZWNvbXB1dGVfbXVsdCcpLgoKICAgICBUaGUgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbnMgKG5vdyBpbnRlcm5hbGx5IGNhbGxlZCAnZWNfd05BRl9tdWwnCiAgICAgYW5kICdlY193TkFGX3ByZWNvbXB1dGVkX211bHQnKSByZW1haW4gdGhlIGRlZmF1bHQgaWYgdGhlc2UKICAgICBtZXRob2RzIGFyZSB1bmRlZmluZWQuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBOZXcgZnVuY3Rpb24gRUNfR1JPVVBfZ2V0X2RlZ3JlZSwgd2hpY2ggaXMgZGVmaW5lZCB0aHJvdWdoCiAgICAgRUNfTUVUSE9ELiAgRm9yIGN1cnZlcyBvdmVyIHByaW1lIGZpZWxkcywgdGhpcyByZXR1cm5zIHRoZSBiaXQKICAgICBsZW5ndGggb2YgdGhlIG1vZHVsdXMuCgogICAgIFtTaGV1ZWxpbmcgQ2hhbmcgU2hhbnR6IGFuZCBEb3VnbGFzIFN0ZWJpbGEKICAgICAoU3VuIE1pY3Jvc3lzdGVtcyBMYWJvcmF0b3JpZXMpXQoKICAqKSBOZXcgZnVuY3Rpb25zIEVDX0dST1VQX2R1cCwgRUNfUE9JTlRfZHVwLgogICAgIChUaGVzZSBzaW1wbHkgY2FsbCAuLi5fbmV3ICBhbmQgLi4uX2NvcHkpLgoKICAgICBbU2hldWVsaW5nIENoYW5nIFNoYW50eiBhbmQgRG91Z2xhcyBTdGViaWxhCiAgICAgKFN1biBNaWNyb3N5c3RlbXMgTGFib3JhdG9yaWVzKV0KCiAgKikgQWRkIGJpbmFyeSBwb2x5bm9taWFsIGFyaXRobWV0aWMgc29mdHdhcmUgaW4gY3J5cHRvL2JuL2JuX2dmMm0uYy4KICAgICBQb2x5bm9taWFscyBhcmUgcmVwcmVzZW50ZWQgYXMgQklHTlVNcyAod2hlcmUgdGhlIHNpZ24gYml0IGlzIG5vdAogICAgIHVzZWQpIGluIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIFttYWNyb3NdOiAgCgogICAgICAgICAgQk5fR0YybV9hZGQKICAgICAgICAgIEJOX0dGMm1fc3ViICAgICAgICAgICAgIFs9IEJOX0dGMm1fYWRkXQogICAgICAgICAgQk5fR0YybV9tb2QgICAgICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX2Fycl0KICAgICAgICAgIEJOX0dGMm1fbW9kX211bCAgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9tdWxfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2Rfc3FyICAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX3Nxcl9hcnJdCiAgICAgICAgICBCTl9HRjJtX21vZF9pbnYKICAgICAgICAgIEJOX0dGMm1fbW9kX2V4cCAgICAgICAgIFt3cmFwcGVyIGZvciBCTl9HRjJtX21vZF9leHBfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2Rfc3FydCAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX3NxcnRfYXJyXQogICAgICAgICAgQk5fR0YybV9tb2Rfc29sdmVfcXVhZCAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX3NvbHZlX3F1YWRfYXJyXQogICAgICAgICAgQk5fR0YybV9jbXAgICAgICAgICAgICAgWz0gQk5fdWNtcF0KCiAgICAgKE5vdGUgdGhhdCBvbmx5IHRoZSAnbW9kJyBmdW5jdGlvbnMgYXJlIGFjdHVhbGx5IGZvciBmaWVsZHMgR0YoMl5tKS4KICAgICBCTl9HRjJtX2FkZCgpIGlzIG1pc25vbWVyLCBidXQgdGhpcyBpcyBmb3IgdGhlIHNha2Ugb2YgY29uc2lzdGVuY3kuKQoKICAgICBGb3Igc29tZSBmdW5jdGlvbnMsIGFuIHRoZSBpcnJlZHVjaWJsZSBwb2x5bm9taWFsIGRlZmluaW5nIGEKICAgICBmaWVsZCBjYW4gYmUgZ2l2ZW4gYXMgYW4gJ3Vuc2lnbmVkIGludFtdJyB3aXRoIHN0cmljdGx5CiAgICAgZGVjcmVhc2luZyBlbGVtZW50cyBnaXZpbmcgdGhlIGluZGljZXMgb2YgdGhvc2UgYml0cyB0aGF0IGFyZSBzZXQ7CiAgICAgaS5lLiwgcFtdIHJlcHJlc2VudHMgdGhlIHBvbHlub21pYWwKICAgICAgICAgIGYodCkgPSB0XnBbMF0gKyB0XnBbMV0gKyAuLi4gKyB0XnBba10KICAgICB3aGVyZQogICAgICAgICAgcFswXSA+IHBbMV0gPiAuLi4gPiBwW2tdID0gMC4KICAgICBUaGlzIGFwcGxpZXMgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgogICAgICAgICAgQk5fR0YybV9tb2RfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9tdWxfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9zcXJfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9pbnZfYXJyICAgICAgICBbd3JhcHBlciBmb3IgQk5fR0YybV9tb2RfaW52XQogICAgICAgICAgQk5fR0YybV9tb2RfZGl2X2FyciAgICAgICAgW3dyYXBwZXIgZm9yIEJOX0dGMm1fbW9kX2Rpdl0KICAgICAgICAgIEJOX0dGMm1fbW9kX2V4cF9hcnIKICAgICAgICAgIEJOX0dGMm1fbW9kX3NxcnRfYXJyCiAgICAgICAgICBCTl9HRjJtX21vZF9zb2x2ZV9xdWFkX2FycgogICAgICAgICAgQk5fR0YybV9wb2x5MmFycgogICAgICAgICAgQk5fR0YybV9hcnIycG9seQoKICAgICBDb252ZXJzaW9uIGNhbiBiZSBwZXJmb3JtZWQgYnkgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnM6CgogICAgICAgICAgQk5fR0YybV9wb2x5MmFycgogICAgICAgICAgQk5fR0YybV9hcnIycG9seQoKICAgICBibnRlc3QuYyBoYXMgYWRkaXRpb25hbCB0ZXN0cyBmb3IgYmluYXJ5IHBvbHlub21pYWwgYXJpdGhtZXRpYy4KCiAgICAgVHdvIGltcGxlbWVudGF0aW9ucyBmb3IgQk5fR0YybV9tb2RfZGl2KCkgYXJlIGF2YWlsYWJsZS4KICAgICBUaGUgZGVmYXVsdCBhbGdvcml0aG0gc2ltcGx5IHVzZXMgQk5fR0YybV9tb2RfaW52KCkgYW5kCiAgICAgQk5fR0YybV9tb2RfbXVsKCkuICBUaGUgYWx0ZXJuYXRpdmUgYWxnb3JpdGhtIGlzIGNvbXBpbGVkIGluIG9ubHkKICAgICBpZiBPUEVOU1NMX1NVTl9HRjJNX0RJViBpcyBkZWZpbmVkIChwYXRlbnQgcGVuZGluZzsgcmVhZCB0aGUKICAgICBjb3B5cmlnaHQgbm90aWNlIGluIGNyeXB0by9ibi9ibl9nZjJtLmMgYmVmb3JlIGVuYWJsaW5nIGl0KS4KCiAgICAgW1NoZXVlbGluZyBDaGFuZyBTaGFudHogYW5kIERvdWdsYXMgU3RlYmlsYQogICAgIChTdW4gTWljcm9zeXN0ZW1zIExhYm9yYXRvcmllcyldCgogICopIEFkZCBuZXcgZXJyb3IgY29kZSAnRVJSX1JfRElTQUJMRUQnIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBzb21lCiAgICAgZnVuY3Rpb25hbGl0eSBpcyBkaXNhYmxlZCBhdCBjb21waWxlLXRpbWUuCiAgICAgW0RvdWdsYXMgU3RlYmlsYSA8ZG91Z2xhcy5zdGViaWxhQHN1bi5jb20+XQoKICAqKSBDaGFuZ2UgZGVmYXVsdCBiZWhhdmlvdXIgb2YgJ29wZW5zc2wgYXNuMXBhcnNlJyBzbyB0aGF0IG1vcmUKICAgICBpbmZvcm1hdGlvbiBpcyB2aXNpYmxlIHdoZW4gdmlld2luZywgZS5nLiwgYSBjZXJ0aWZpY2F0ZToKCiAgICAgTW9kaWZ5IGFzbjFfcGFyc2UyIChjcnlwdG8vYXNuMS9hc24xX3Bhci5jKSBzbyB0aGF0IGluIG5vbi0nZHVtcCcKICAgICBtb2RlIHRoZSBjb250ZW50IG9mIG5vbi1wcmludGFibGUgT0NURVQgU1RSSU5HcyBpcyBvdXRwdXQgaW4gYQogICAgIHN0eWxlIHNpbWlsYXIgdG8gSU5URUdFUnMsIGJ1dCB3aXRoICdbSEVYIERVTVBdJyBwcmVwZW5kZWQgdG8KICAgICBhdm9pZCB0aGUgYXBwZWFyYW5jZSBvZiBhIHByaW50YWJsZSBzdHJpbmcuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgJ2FzbjFfZmxhZycgYW5kICdhc24xX2Zvcm0nIG1lbWJlciB0byBFQ19HUk9VUCB3aXRoIGFjY2VzcwogICAgIGZ1bmN0aW9ucwogICAgICAgICAgRUNfR1JPVVBfc2V0X2FzbjFfZmxhZygpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfYXNuMV9mbGFnKCkKICAgICAgICAgIEVDX0dST1VQX3NldF9wb2ludF9jb252ZXJzaW9uX2Zvcm0oKQogICAgICAgICAgRUNfR1JPVVBfZ2V0X3BvaW50X2NvbnZlcnNpb25fZm9ybSgpCiAgICAgVGhlc2UgY29udHJvbCBBU04xIGVuY29kaW5nIGRldGFpbHM6CiAgICAgLSBDdXJ2ZXMgKGkuZS4sIGdyb3VwcykgYXJlIGVuY29kZWQgZXhwbGljaXRseSB1bmxlc3MgYXNuMV9mbGFnCiAgICAgICBoYXMgYmVlbiBzZXQgdG8gT1BFTlNTTF9FQ19OQU1FRF9DVVJWRS4KICAgICAtIFBvaW50cyBhcmUgZW5jb2RlZCBpbiB1bmNvbXByZXNzZWQgZm9ybSBieSBkZWZhdWx0OyBvcHRpb25zIGZvcgogICAgICAgYXNuMV9mb3IgYXJlIGFzIGZvciBwb2ludDJvY3QsIG5hbWVseQogICAgICAgICAgUE9JTlRfQ09OVkVSU0lPTl9DT01QUkVTU0VECiAgICAgICAgICBQT0lOVF9DT05WRVJTSU9OX1VOQ09NUFJFU1NFRAogICAgICAgICAgUE9JTlRfQ09OVkVSU0lPTl9IWUJSSUQKCiAgICAgQWxzbyBhZGQgJ3NlZWQnIGFuZCAnc2VlZF9sZW4nIG1lbWJlcnMgdG8gRUNfR1JPVVAgd2l0aCBhY2Nlc3MKICAgICBmdW5jdGlvbnMKICAgICAgICAgIEVDX0dST1VQX3NldF9zZWVkKCkKICAgICAgICAgIEVDX0dST1VQX2dldDBfc2VlZCgpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfc2VlZF9sZW4oKQogICAgIFRoaXMgaXMgdXNlZCBvbmx5IGZvciBBU04xIHB1cnBvc2VzIChzbyBmYXIpLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgQWRkICdmaWVsZF90eXBlJyBtZW1iZXIgdG8gRUNfTUVUSE9ELCB3aGljaCBob2xkcyB0aGUgTklECiAgICAgb2YgdGhlIGFwcHJvcHJpYXRlIGZpZWxkIHR5cGUgT0lELiAgVGhlIG5ldyBmdW5jdGlvbgogICAgIEVDX01FVEhPRF9nZXRfZmllbGRfdHlwZSgpIHJldHVybnMgdGhpcyB2YWx1ZS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT5dCgogICopIEFkZCBmdW5jdGlvbnMgCiAgICAgICAgICBFQ19QT0lOVF9wb2ludDJibigpCiAgICAgICAgICBFQ19QT0lOVF9ibjJwb2ludCgpCiAgICAgICAgICBFQ19QT0lOVF9wb2ludDJoZXgoKQogICAgICAgICAgRUNfUE9JTlRfaGV4MnBvaW50KCkKICAgICBwcm92aWRpbmcgdXNlZnVsIGludGVyZmFjZXMgdG8gRUNfUE9JTlRfcG9pbnQyb2N0KCkgYW5kCiAgICAgRUNfUE9JTlRfb2N0MnBvaW50KCkuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBDaGFuZ2UgaW50ZXJuYWxzIG9mIHRoZSBFQyBsaWJyYXJ5IHNvIHRoYXQgdGhlIGZ1bmN0aW9ucwogICAgICAgICAgRUNfR1JPVVBfc2V0X2dlbmVyYXRvcigpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfZ2VuZXJhdG9yKCkKICAgICAgICAgIEVDX0dST1VQX2dldF9vcmRlcigpCiAgICAgICAgICBFQ19HUk9VUF9nZXRfY29mYWN0b3IoKQogICAgIGFyZSBpbXBsZW1lbnRlZCBkaXJlY3RseSBpbiBjcnlwdG8vZWMvZWNfbGliLmMgYW5kIG5vdCBkaXNwYXRjaGVkCiAgICAgdG8gbWV0aG9kcywgd2hpY2ggd291bGQgbGVhZCB0byB1bm5lY2Vzc2FyeSBjb2RlIGR1cGxpY2F0aW9uIHdoZW4KICAgICBhZGRpbmcgZGlmZmVyZW50IHR5cGVzIG9mIGN1cnZlcy4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT4gd2l0aCBpbnB1dCBieSBCb2RvIE1vZWxsZXJdCgogICopIEltcGxlbWVudCBjb21wdXRlX3dOQUYgKGNyeXB0by9lYy9lY19tdWx0LmMpIHdpdGhvdXQgQklHTlVNCiAgICAgYXJpdGhtZXRpYywgYW5kIHN1Y2ggdGhhdCBtb2RpZmllZCB3TkFGcyBhcmUgZ2VuZXJhdGVkCiAgICAgKHdoaWNoIGF2b2lkIGxlbmd0aCBleHBhbnNpb24gaW4gbWFueSBjYXNlcykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGEgZnVuY3Rpb24gRUNfR1JPVVBfY2hlY2tfZGlzY3JpbWluYW50KCkgKGRlZmluZWQgdmlhCiAgICAgRUNfTUVUSE9EKSB0aGF0IHZlcmlmaWVzIHRoYXQgdGhlIGN1cnZlIGRpc2NyaW1pbmFudCBpcyBub24temVyby4KCiAgICAgQWRkIGEgZnVuY3Rpb24gRUNfR1JPVVBfY2hlY2soKSB0aGF0IG1ha2VzIHNvbWUgc2FuaXR5IHRlc3RzCiAgICAgb24gYSBFQ19HUk9VUCwgaXRzIGdlbmVyYXRvciBhbmQgb3JkZXIuICBUaGlzIGluY2x1ZGVzCiAgICAgRUNfR1JPVVBfY2hlY2tfZGlzY3JpbWluYW50KCkuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBBZGQgRUNEU0EgaW4gbmV3IGRpcmVjdG9yeSBjcnlwdG8vZWNkc2EvLgoKICAgICBBZGQgYXBwbGljYXRpb25zICdvcGVuc3NsIGVjcGFyYW0nIGFuZCAnb3BlbnNzbCBlY2RzYScKICAgICAodGhlc2UgYXJlIGJhc2VkIG9uICdvcGVuc3NsIGRzYXBhcmFtJyBhbmQgJ29wZW5zc2wgZHNhJykuCgogICAgIEVDRFNBIHN1cHBvcnQgaXMgYWxzbyBpbmNsdWRlZCBpbiB2YXJpb3VzIG90aGVyIGZpbGVzIGFjcm9zcyB0aGUKICAgICBsaWJyYXJ5LiAgTW9zdCBub3RhYmx5LAogICAgIC0gJ29wZW5zc2wgcmVxJyBub3cgaGFzIGEgJy1uZXdrZXkgZWNkc2E6ZmlsZScgb3B0aW9uOwogICAgIC0gRVZQX1BLQ1M4MlBLRVkgKGNyeXB0by9ldnAvZXZwX3BrZXkuYykgbm93IGNhbiBoYW5kbGUgRUNEU0E7CiAgICAgLSBYNTA5X1BVQktFWV9nZXQgKGNyeXB0by9hc24xL3hfcHVia2V5LmMpIGFuZAogICAgICAgZDJpX1B1YmxpY0tleSAoY3J5cHRvL2FzbjEvZDJpX3B1LmMpIGhhdmUgYmVlbiBtb2RpZmllZCB0byBtYWtlCiAgICAgICB0aGVtIHN1aXRhYmxlIGZvciBFQ0RTQSB3aGVyZSBkb21haW4gcGFyYW1ldGVycyBtdXN0IGJlCiAgICAgICBleHRyYWN0ZWQgYmVmb3JlIHRoZSBzcGVjaWZpYyBwdWJsaWMga2V5OwogICAgIC0gRUNEU0EgZW5naW5lIHN1cHBvcnQgaGFzIGJlZW4gYWRkZWQuCiAgICAgW05pbHMgTGFyc2NoIDxubGFAdHJ1c3RjZW50ZXIuZGU+XQoKICAqKSBJbmNsdWRlIHNvbWUgbmFtZWQgZWxsaXB0aWMgY3VydmVzLCBhbmQgYWRkIE9JRHMgZnJvbSBYOS42MiwKICAgICBTRUNHLCBhbmQgV0FQL1dUTFMuICBFYWNoIGN1cnZlIGNhbiBiZSBvYnRhaW5lZCBmcm9tIHRoZSBuZXcKICAgICBmdW5jdGlvbgogICAgICAgICAgRUNfR1JPVVBfbmV3X2J5X2N1cnZlX25hbWUoKSwKICAgICBhbmQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIG5hbWVkIGN1cnZlcyBjYW4gYmUgb2J0YWluZWQgd2l0aAogICAgICAgICAgRUNfZ2V0X2J1aWx0aW5fY3VydmVzKCkuCiAgICAgQWxzbyBhZGQgYSAnY3VydmVfbmFtZScgbWVtYmVyIHRvIEVDX0dST1VQIG9iamVjdHMsIHdoaWNoIGNhbiBiZQogICAgIGFjY2Vzc2VkIHZpYQogICAgICAgICBFQ19HUk9VUF9zZXRfY3VydmVfbmFtZSgpCiAgICAgICAgIEVDX0dST1VQX2dldF9jdXJ2ZV9uYW1lKCkKICAgICBbTmlscyBMYXJzY2ggPGxhcnNjaEB0cnVzdGNlbnRlci5kZSwgQm9kbyBNb2VsbGVyXQogCiAgKikgUmVtb3ZlIGEgZmV3IGNhbGxzIHRvIGJuX3dleHBhbmQoKSBpbiBCTl9zcXIoKSAodGhlIG9uZSBpbiB0aGVyZQogICAgIHdhcyBhY3R1YWxseSBuZXZlciBuZWVkZWQpIGFuZCBpbiBCTl9tdWwoKS4gIFRoZSByZW1vdmFsIGluIEJOX211bCgpCiAgICAgcmVxdWlyZWQgYSBzbWFsbCBjaGFuZ2UgaW4gYm5fbXVsX3BhcnRfcmVjdXJzaXZlKCkgYW5kIHRoZSBhZGRpdGlvbgogICAgIG9mIHRoZSBmdW5jdGlvbnMgYm5fY21wX3BhcnRfd29yZHMoKSwgYm5fc3ViX3BhcnRfd29yZHMoKSBhbmQKICAgICBibl9hZGRfcGFydF93b3JkcygpLCB3aGljaCBkbyB0aGUgc2FtZSB0aGluZyBhcyBibl9jbXBfd29yZHMoKSwKICAgICBibl9zdWJfd29yZHMoKSBhbmQgYm5fYWRkX3dvcmRzKCkgZXhjZXB0IHRoZXkgdGFrZSBhcnJheXMgd2l0aAogICAgIGRpZmZlcmluZyBzaXplcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2ggYW5kIDAuOS43aSAgWzE0IE9jdCAyMDA1XQoKICAqKSBXcmFwcGVkIHRoZSBkZWZpbml0aW9uIG9mIEVWUF9NQVhfTURfU0laRSBpbiBhICNpZmRlZiBPUEVOU1NMX0ZJUFMuCiAgICAgVGhlIHZhbHVlIG5vdyBkaWZmZXJzIGRlcGVuZGluZyBvbiBpZiB5b3UgYnVpbGQgZm9yIEZJUFMgb3Igbm90LgogICAgIEJFV0FSRSEgIEEgcHJvZ3JhbSBsaW5rZWQgd2l0aCBhIHNoYXJlZCBGSVBTZWQgbGliY3J5cHRvIGNhbid0IGJlCiAgICAgc2FmZWx5IHJ1biB3aXRoIGEgbm9uLUZJUFNlZCBsaWJjcnlwdG8sIGFzIGl0IG1heSBjcmFzaCBiZWNhdXNlIG9mCiAgICAgdGhlIGRpZmZlcmVuY2UgaW5kdWNlZCBieSB0aGlzIGNoYW5nZS4KICAgICBbQW5keSBQb2x5YWtvdl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdnIGFuZCAwLjkuN2ggIFsxMSBPY3QgMjAwNV0KCiAgKikgUmVtb3ZlIHRoZSBmdW5jdGlvbmFsaXR5IG9mIFNTTF9PUF9NU0lFX1NTTFYyX1JTQV9QQURESU5HCiAgICAgKHBhcnQgb2YgU1NMX09QX0FMTCkuICBUaGlzIG9wdGlvbiB1c2VkIHRvIGRpc2FibGUgdGhlCiAgICAgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBtYW4taW4tdGhlLW1pZGRsZSBwcm90b2NvbC12ZXJzaW9uCiAgICAgcm9sbGJhY2sgaW4gdGhlIFNTTCAyLjAgc2VydmVyIGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBhIGJhZAogICAgIGlkZWEuICAoQ1ZFLTIwMDUtMjk2OSkKCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBZdXRha2EgT2l3YSAoUmVzZWFyY2ggQ2VudGVyCiAgICAgZm9yIEluZm9ybWF0aW9uIFNlY3VyaXR5LCBOYXRpb25hbCBJbnN0aXR1dGUgb2YgQWR2YW5jZWQgSW5kdXN0cmlhbAogICAgIFNjaWVuY2UgYW5kIFRlY2hub2xvZ3kgW0FJU1RdLCBKYXBhbildCgogICopIE1pbmltYWwgc3VwcG9ydCBmb3IgWDkuMzEgc2lnbmF0dXJlcyBhbmQgUFNTIHBhZGRpbmcgbW9kZXMuIFRoaXMgaXMKICAgICBtYWlubHkgZm9yIEZJUFMgY29tcGxpYW5jZSBhbmQgbm90IGZ1bGx5IGludGVncmF0ZWQgYXQgdGhpcyBzdGFnZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGb3IgRFNBIHNpZ25pbmcsIHVubGVzcyBEU0FfRkxBR19OT19FWFBfQ09OU1RUSU1FIGlzIHNldCwgcGVyZm9ybQogICAgIHRoZSBleHBvbmVudGlhdGlvbiB1c2luZyBhIGZpeGVkLWxlbmd0aCBleHBvbmVudC4gIChPdGhlcndpc2UsCiAgICAgdGhlIGluZm9ybWF0aW9uIGxlYWtlZCB0aHJvdWdoIHRpbWluZyBjb3VsZCBleHBvc2UgdGhlIHNlY3JldCBrZXkKICAgICBhZnRlciBtYW55IHNpZ25hdHVyZXM7IGNmLiBCbGVpY2hlbmJhY2hlcidzIGF0dGFjayBvbiBEU0Egd2l0aAogICAgIGJpYXNlZCBrLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIGEgbmV3IGZpeGVkLXdpbmRvdyBtb2RfZXhwIGltcGxlbWVudGF0aW9uIHRoZSBkZWZhdWx0IGZvcgogICAgIFJTQSwgRFNBLCBhbmQgREggcHJpdmF0ZS1rZXkgb3BlcmF0aW9ucyBzbyB0aGF0IHRoZSBzZXF1ZW5jZSBvZgogICAgIHNxdWFyZXMgYW5kIG11bHRpcGxpZXMgYW5kIHRoZSBtZW1vcnkgYWNjZXNzIHBhdHRlcm4gYXJlCiAgICAgaW5kZXBlbmRlbnQgb2YgdGhlIHBhcnRpY3VsYXIgc2VjcmV0IGtleS4gIFRoaXMgd2lsbCBtaXRpZ2F0ZQogICAgIGNhY2hlLXRpbWluZyBhbmQgcG90ZW50aWFsIHJlbGF0ZWQgYXR0YWNrcy4KCiAgICAgQk5fbW9kX2V4cF9tb250X2NvbnN0dGltZSgpIGlzIHRoZSBuZXcgZXhwb25lbnRpYXRpb24gaW1wbGVtZW50YXRpb24sCiAgICAgYW5kIHRoaXMgaXMgYXV0b21hdGljYWxseSB1c2VkIGJ5IEJOX21vZF9leHBfbW9udCgpIGlmIHRoZSBuZXcgZmxhZwogICAgIEJOX0ZMR19FWFBfQ09OU1RUSU1FIGlzIHNldCBmb3IgdGhlIGV4cG9uZW50LiAgUlNBLCBEU0EsIGFuZCBESAogICAgIHdpbGwgdXNlIHRoaXMgQk4gZmxhZyBmb3IgcHJpdmF0ZSBleHBvbmVudHMgdW5sZXNzIHRoZSBmbGFnCiAgICAgUlNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSwgRFNBX0ZMQUdfTk9fRVhQX0NPTlNUVElNRSwgb3IKICAgICBESF9GTEFHX05PX0VYUF9DT05TVFRJTUUsIHJlc3BlY3RpdmVseSwgaXMgc2V0LgoKICAgICBbTWF0dGhldyBEIFdvb2QgKEludGVsIENvcnApLCB3aXRoIHNvbWUgY2hhbmdlcyBieSBCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSB0aGUgY2xpZW50IGltcGxlbWVudGF0aW9uIGZvciBTU0x2MjNfbWV0aG9kKCkgYW5kCiAgICAgU1NMdjIzX2NsaWVudF9tZXRob2QoKSBzbyB0aGF0IGlzIHVzZXMgdGhlIFNTTCAzLjAvVExTIDEuMAogICAgIENsaWVudCBIZWxsbyBtZXNzYWdlIGZvcm1hdCBpZiB0aGUgU1NMX09QX05PX1NTTHYyIG9wdGlvbiBpcyBzZXQuCiAgICAgKFByZXZpb3VzbHksIHRoZSBTU0wgMi4wIGJhY2t3YXJkcyBjb21wYXRpYmxlIENsaWVudCBIZWxsbwogICAgIG1lc3NhZ2UgZm9ybWF0IHdvdWxkIGJlIHVzZWQgZXZlbiB3aXRoIFNTTF9PUF9OT19TU0x2Mi4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHNtaW1lLXR5cGUgTUlNRSBwYXJhbWV0ZXIgaW4gUy9NSU1FIG1lc3NhZ2VzIHdoaWNoIHNvbWUKICAgICBjbGllbnRzIG5lZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX01PTlRfQ1RYX3NldF9sb2NrZWQoKSB0byBzZXQgbW9udGdvbWVyeSBwYXJhbWV0ZXJzIGluCiAgICAgYSB0aHJlYWRzYWZlIG1hbm5lci4gTW9kaWZ5IHJzYSBjb2RlIHRvIHVzZSBuZXcgZnVuY3Rpb24gYW5kIGFkZCBjYWxscwogICAgIHRvIGRzYSBhbmQgZGggY29kZSAod2hpY2ggaGFkIHJhY2UgY29uZGl0aW9ucyBiZWZvcmUpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluY2x1ZGUgdGhlIGZpeGVkIGVycm9yIGxpYnJhcnkgY29kZSBpbiB0aGUgQyBlcnJvciBmaWxlIGRlZmluaXRpb25zCiAgICAgaW5zdGVhZCBvZiBmaXhpbmcgdGhlbSB1cCBhdCBydW50aW1lLiBUaGlzIGtlZXBzIHRoZSBlcnJvciBjb2RlCiAgICAgc3RydWN0dXJlcyBjb25zdGFudC4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2YgYW5kIDAuOS43ZyAgWzExIEFwciAyMDA1XQoKICBbTkI6IE9wZW5TU0wgMC45LjdoIGFuZCBsYXRlciAwLjkuNyBwYXRjaCBsZXZlbHMgd2VyZSByZWxlYXNlZCBhZnRlcgogIE9wZW5TU0wgMC45LjguXQoKICAqKSBGaXhlcyBmb3IgbmV3ZXIga2VyYmVyb3MgaGVhZGVycy4gTkI6IHRoZSBjYXN0cyBhcmUgbmVlZGVkIGJlY2F1c2UKICAgICB0aGUgJ2xlbmd0aCcgZmllbGQgaXMgc2lnbmVkIG9uIG9uZSB2ZXJzaW9uIGFuZCB1bnNpZ25lZCBvbiBhbm90aGVyCiAgICAgd2l0aCBubyAoPykgb2J2aW91cyB3YXkgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSwgd2l0aG91dCB0aGVzZSBWQysrCiAgICAgY29tcGxhaW5zLiBBbHNvIHRoZSAiZGVmaW5pdGlvbiIgb2YgRkFSIChibGFuaykgaXMgbm8gbG9uZ2VyIGluY2x1ZGVkCiAgICAgbm9yIGlzIHRoZSBlcnJvciBFTk9NRU0uIEtSQjVfUFJJVkFURSBoYXMgdG8gYmUgc2V0IHRvIDEgdG8gcGljayB1cAogICAgIHNvbWUgbmVlZGVkIGRlZmluaXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVuZG8gQ3lnd2luIGNoYW5nZS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkZWQgc3VwcG9ydCBmb3IgcHJveHkgY2VydGlmaWNhdGVzIGFjY29yZGluZyB0byBSRkMgMzgyMC4KICAgICBCZWNhdXNlIHRoZXkgbWF5IGJlIGEgc2VjdXJpdHkgdGhyZWFkIHRvIHVuYXdhcmUgYXBwbGljYXRpb25zLAogICAgIHRoZXkgbXVzdCBiZSBleHBsaWNpdGVseSBhbGxvd2VkIGluIHJ1bi10aW1lLiAgU2VlCiAgICAgZG9jcy9IT1dUTy9wcm94eV9jZXJ0aWZpY2F0ZXMudHh0IGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43ZSBhbmQgMC45LjdmICBbMjIgTWFyIDIwMDVdCgogICopIFVzZSAoU1NMX1JBTkRPTV9WQUxVRSAtIDQpIGJ5dGVzIG9mIHBzZXVkbyByYW5kb20gZGF0YSB3aGVuIGdlbmVyYXRpbmcKICAgICBzZXJ2ZXIgYW5kIGNsaWVudCByYW5kb20gdmFsdWVzLiBQcmV2aW91c2x5CiAgICAgKFNTTF9SQU5ET01fVkFMVUUgLSBzaXplb2YodGltZV90KSkgd291bGQgYmUgdXNlZCB3aGljaCB3b3VsZCByZXN1bHQgaW4KICAgICBsZXNzIHJhbmRvbSBkYXRhIHdoZW4gc2l6ZW9mKHRpbWVfdCkgPiA0IChzb21lIDY0IGJpdCBwbGF0Zm9ybXMpLgoKICAgICBUaGlzIGNoYW5nZSBoYXMgbmVnbGlnaWJsZSBzZWN1cml0eSBpbXBhY3QgYmVjYXVzZToKCiAgICAgMS4gU2VydmVyIGFuZCBjbGllbnQgcmFuZG9tIHZhbHVlcyBzdGlsbCBoYXZlIDI0IGJ5dGVzIG9mIHBzZXVkbyByYW5kb20KICAgICAgICBkYXRhLgoKICAgICAyLiBTZXJ2ZXIgYW5kIGNsaWVudCByYW5kb20gdmFsdWVzIGFyZSBzZW50IGluIHRoZSBjbGVhciBpbiB0aGUgaW5pdGlhbAogICAgICAgIGhhbmRzaGFrZS4KCiAgICAgMy4gVGhlIG1hc3RlciBzZWNyZXQgaXMgZGVyaXZlZCB1c2luZyB0aGUgcHJlbWFzdGVyIHNlY3JldCAoNDggYnl0ZXMgaW4KICAgICAgICBzaXplIGZvciBzdGF0aWMgUlNBIGNpcGhlcnN1aXRlcykgYXMgd2VsbCBhcyBjbGllbnQgc2VydmVyIGFuZCByYW5kb20KICAgICAgICB2YWx1ZXMuCgogICAgIFRoZSBPcGVuU1NMIHRlYW0gd291bGQgbGlrZSB0byB0aGFuayB0aGUgVUsgTklTQ0MgZm9yIGJyaW5naW5nIHRoaXMgaXNzdWUKICAgICB0byBvdXIgYXR0ZW50aW9uLiAKCiAgICAgW1N0ZXBoZW4gSGVuc29uLCByZXBvcnRlZCBieSBVSyBOSVNDQ10KCiAgKikgVXNlIFdpbmRvd3MgcmFuZG9tbmVzcyBjb2xsZWN0aW9uIG9uIEN5Z3dpbi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IGhhbmcgaW4gRUdEL1BSTkdEIHF1ZXJ5IHdoZW4gY29tbXVuaWNhdGlvbiBzb2NrZXQgaXMgY2xvc2VkCiAgICAgcHJlbWF0dXJlbHkgYnkgRUdEL1BSTkdELgogICAgIFtEYXJyZW4gVHVja2VyIDxkdHVja2VyQHppcC5jb20uYXU+IHZpYSBMdXR6IErkbmlja2UsIHJlc29sdmVzICMxMDE0XQoKICAqKSBQcm9tcHQgZm9yIHBhc3MgcGhyYXNlcyB3aGVuIGFwcHJvcHJpYXRlIGZvciBQS0NTMTIgaW5wdXQgZm9ybWF0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEJhY2stcG9ydCBvZiBzZWxlY3RlZCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgZnJvbSBkZXZlbG9wbWVudAogICAgIGJyYW5jaCwgYXMgd2VsbCBhcyBpbXByb3ZlZCBzdXBwb3J0IGZvciBQb3dlclBDIHBsYXRmb3Jtcy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgQWRkIGxvdHMgb2YgY2hlY2tzIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsdXJlLCBlcnJvciBjb2RlcyB0byBpbmRpY2F0ZQogICAgIGZhaWx1cmUgYW5kIGZyZWVpbmcgdXAgbWVtb3J5IGlmIGEgZmFpbHVyZSBvY2N1cnMuCiAgICAgW05hdXRpY3VzIE5ldHdvcmtzIFNTTCBUZWFtIDxvcGVuc3NsQG5hdXRpY3VzbmV0LmNvbT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyAtcGFzc2luIGFyZ3VtZW50IHRvIGRnc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUGVyZm9ybSBzb21lIGNoYXJhY3RlciBjb21wYXJpc29ucyBvZiBkaWZmZXJlbnQgdHlwZXMgaW4gWDUwOV9OQU1FX2NtcDoKICAgICB0aGlzIGlzIG5lZWRlZCBmb3Igc29tZSBjZXJ0aWZpY2F0ZXMgdGhhdCByZWVuY29kZSBETnMgaW50byBVVEY4U3RyaW5ncwogICAgIChpbiB2aW9sYXRpb24gb2YgUkZDMzI4MCkgYW5kIGNhbid0IG9yIHdvbnQgaXNzdWUgbmFtZSByb2xsb3ZlcgogICAgIGNlcnRpZmljYXRlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIGFuIGV4cGxpY2l0IGNoZWNrIGR1cmluZyBjZXJ0aWZpY2F0ZSB2YWxpZGF0aW9uIHRvIHNlZSB0aGF0CiAgICAgdGhlIENBIHNldHRpbmcgaW4gZWFjaCBjZXJ0aWZpY2F0ZSBvbiB0aGUgY2hhaW4gaXMgY29ycmVjdC4gIEFzIGEKICAgICBzaWRlIGVmZmVjdCBhbHdheXMgZG8gdGhlIGZvbGxvd2luZyBiYXNpYyBjaGVja3Mgb24gZXh0ZW5zaW9ucywKICAgICBub3QganVzdCB3aGVuIHRoZXJlJ3MgYW4gYXNzb2NpYXRlZCBwdXJwb3NlIHRvIHRoZSBjaGVjazoKCiAgICAgIC0gaWYgdGhlcmUgaXMgYW4gdW5oYW5kbGVkIGNyaXRpY2FsIGV4dGVuc2lvbiAodW5sZXNzIHRoZSB1c2VyCiAgICAgICAgaGFzIGNob3NlbiB0byBpZ25vcmUgdGhpcyBmYXVsdCkKICAgICAgLSBpZiB0aGUgcGF0aCBsZW5ndGggaGFzIGJlZW4gZXhjZWVkZWQgKGlmIG9uZSBpcyBzZXQgYXQgYWxsKQogICAgICAtIHRoYXQgY2VydGFpbiBleHRlbnNpb25zIGZpdCB0aGUgYXNzb2NpYXRlZCBwdXJwb3NlIChpZiBvbmUgaGFzCiAgICAgICAgYmVlbiBnaXZlbikKICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuN2QgYW5kIDAuOS43ZSAgWzI1IE9jdCAyMDA0XQoKICAqKSBBdm9pZCBhIHJhY2UgY29uZGl0aW9uIHdoZW4gQ1JMcyBhcmUgY2hlY2tlZCBpbiBhIG11bHRpIHRocmVhZGVkIAogICAgIGVudmlyb25tZW50LiBUaGlzIHdvdWxkIGhhcHBlbiBkdWUgdG8gdGhlIHJlb3JkZXJpbmcgb2YgdGhlIHJldm9rZWQKICAgICBlbnRyaWVzIGR1cmluZyBzaWduYXR1cmUgY2hlY2tpbmcgYW5kIHNlcmlhbCBudW1iZXIgbG9va3VwLiBOb3cgdGhlCiAgICAgZW5jb2RpbmcgaXMgY2FjaGVkIGFuZCB0aGUgc2VyaWFsIG51bWJlciBzb3J0IHBlcmZvcm1lZCB1bmRlciBhIGxvY2suCiAgICAgQWRkIG5ldyBTVEFDSyBmdW5jdGlvbiBza19pc19zb3J0ZWQoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgRGVsdGEgQ1JMIHRvIHRoZSBleHRlbnNpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIGZpeGVzIHRvIHMzX3BrdC5jIHNvIGFsZXJ0cyBhcmUgc2VudCBwcm9wZXJseS4KICAgICBbRGF2aWQgSG9sbWVzIDxkLmhvbG1lc0BmNS5jb20+XQoKICAqKSBSZWR1Y2UgdGhlIGNoYW5jZXMgb2YgZHVwbGljYXRlIGlzc3VlciBuYW1lIGFuZCBzZXJpYWwgbnVtYmVycyAoaW4KICAgICB2aW9sYXRpb24gb2YgUkZDMzI4MCkgdXNpbmcgdGhlIE9wZW5TU0wgY2VydGlmaWNhdGUgY3JlYXRpb24gdXRpbGl0aWVzLgogICAgIFRoaXMgaXMgZG9uZSBieSBjcmVhdGluZyBhIHJhbmRvbSA2NCBiaXQgdmFsdWUgZm9yIHRoZSBpbml0aWFsIHNlcmlhbAogICAgIG51bWJlciB3aGVuIGEgc2VyaWFsIG51bWJlciBmaWxlIGlzIGNyZWF0ZWQgb3Igd2hlbiBhIHNlbGYgc2lnbmVkCiAgICAgY2VydGlmaWNhdGUgaXMgY3JlYXRlZCB1c2luZyAnb3BlbnNzbCByZXEgLXg1MDknLiBUaGUgaW5pdGlhbCBzZXJpYWwKICAgICBudW1iZXIgZmlsZSBpcyBjcmVhdGVkIHVzaW5nICdvcGVuc3NsIHg1MDkgLW5leHRfc2VyaWFsJyBpbiBDQS5wbAogICAgIHJhdGhlciB0aGFuIGJlaW5nIGluaXRpYWxpemVkIHRvIDEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjdjIGFuZCAwLjkuN2QgIFsxNyBNYXIgMjAwNF0KCiAgKikgRml4IG51bGwtcG9pbnRlciBhc3NpZ25tZW50IGluIGRvX2NoYW5nZV9jaXBoZXJfc3BlYygpIHJldmVhbGVkICAgICAgICAgICAKICAgICBieSB1c2luZyB0aGUgQ29kZW5vbWljb24gVExTIFRlc3QgVG9vbCAoQ1ZFLTIwMDQtMDA3OSkgICAgICAgICAgICAgICAgICAgIAogICAgIFtKb2UgT3J0b24sIFN0ZXZlIEhlbnNvbl0gICAKCiAgKikgRml4IGZsYXcgaW4gU1NML1RMUyBoYW5kc2hha2luZyB3aGVuIHVzaW5nIEtlcmJlcm9zIGNpcGhlcnN1aXRlcwogICAgIChDVkUtMjAwNC0wMTEyKQogICAgIFtKb2UgT3J0b24sIFN0ZXZlIEhlbnNvbl0gICAKCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byBoYXZlIG11bHRpcGxlIGFjdGl2ZSBjZXJ0aWZpY2F0ZXMgd2l0aCB0aGUgc2FtZQogICAgIHN1YmplY3QgaW4gdGhlIENBIGluZGV4IGZpbGUuICBUaGlzIGlzIGRvbmUgb25seSBpZiB0aGUga2V5d29yZAogICAgICd1bmlxdWVfc3ViamVjdCcgaXMgc2V0IHRvICdubycgaW4gdGhlIG1haW4gQ0Egc2VjdGlvbiAoZGVmYXVsdAogICAgIGlmICdDQV9kZWZhdWx0Jykgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4gIFRoZSB2YWx1ZSBpcyBzYXZlZAogICAgIHdpdGggdGhlIGRhdGFiYXNlIGl0c2VsZiBpbiBhIHNlcGFyYXRlIGluZGV4IGF0dHJpYnV0ZSBmaWxlLAogICAgIG5hbWVkIGxpa2UgdGhlIGluZGV4IGZpbGUgd2l0aCAnLmF0dHInIGFwcGVuZGVkIHRvIHRoZSBuYW1lLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFg1MDkgdmVyaWZ5IGZpeGVzLiBEaXNhYmxlIGJyb2tlbiBjZXJ0aWZpY2F0ZSB3b3JrYXJvdW5kcyB3aGVuIAogICAgIFg1MDlfVl9GTEFHU19YNTA5X1NUUklDVCBpcyBzZXQuIENoZWNrIENSTCBpc3N1ZXIgaGFzIGNSTFNpZ24gc2V0IGlmCiAgICAga2V5VXNhZ2UgZXh0ZW5zaW9uIHByZXNlbnQuIERvbid0IGFjY2VwdCBDUkxzIHdpdGggdW5oYW5kbGVkIGNyaXRpY2FsCiAgICAgZXh0ZW5zaW9uczogc2luY2UgdmVyaWZ5IGN1cnJlbnRseSBkb2Vzbid0IHByb2Nlc3MgQ1JMIGV4dGVuc2lvbnMgdGhpcwogICAgIHJlamVjdHMgYSBDUkwgd2l0aCAqYW55KiBjcml0aWNhbCBleHRlbnNpb25zLiBBZGQgbmV3IHZlcmlmeSBlcnJvciBjb2RlcwogICAgIGZvciB0aGVzZSBjYXNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBXaGVuIGNyZWF0aW5nIGFuIE9DU1Agbm9uY2UgdXNlIGFuIE9DVEVUIFNUUklORyBpbnNpZGUgdGhlIGV4dG5WYWx1ZS4KICAgICBBIGNsYXJpZmljYXRpb24gb2YgUkZDMjU2MCB3aWxsIHJlcXVpcmUgdGhlIHVzZSBvZiBPQ1RFVCBTVFJJTkdzIGFuZCAKICAgICBzb21lIGltcGxlbWVudGF0aW9ucyBjYW5ub3QgaGFuZGxlIHRoZSBjdXJyZW50IHJhdyBmb3JtYXQuIFNpbmNlIE9wZW5TU0wKICAgICBjb3BpZXMgYW5kIGNvbXBhcmVzIE9DU1Agbm9uY2VzIGFzIG9wYXF1ZSBibG9icyB3aXRob3V0IGFueSBhdHRlbXB0IGF0CiAgICAgcGFyc2luZyB0aGVtIHRoaXMgc2hvdWxkIG5vdCBjcmVhdGUgYW55IGNvbXBhdGliaWxpdHkgaXNzdWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBtZCBmbGFnIEVWUF9NRF9DVFhfRkxBR19SRVVTRSB0aGlzIGFsbG93cyBtZF9kYXRhIHRvIGJlIHJldXNlZCB3aGVuCiAgICAgY2FsbGluZyBFVlBfTURfQ1RYX2NvcHlfZXgoKSB0byBhdm9pZCBjYWxsaW5nIE9QRU5TU0xfbWFsbG9jKCkuIFdpdGhvdXQKICAgICB0aGlzIEhNQUMgKGFuZCBvdGhlcikgb3BlcmF0aW9ucyBhcmUgc2V2ZXJhbCB0aW1lcyBzbG93ZXIgdGhhbiBPcGVuU1NMCiAgICAgPCAwLjkuNy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBQcmludCBvdXQgR2VuZXJhbGl6ZWRUaW1lIGFuZCBVVENUaW1lIGluIEFTTjFfU1RSSU5HX3ByaW50X2V4KCkuCiAgICAgW1BldGVyIFN5bHZlc3RlciA8UGV0ZXIuU3lsdmVzdGVyQEVkZWxXZWIuZnI+XQoKICAqKSBVc2UgdGhlIGNvcnJlY3QgY29udGVudCB3aGVuIHNpZ25pbmcgdHlwZSAib3RoZXIiLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43YiBhbmQgMC45LjdjICBbMzAgU2VwIDIwMDNdCgogICopIEZpeCB2YXJpb3VzIGJ1Z3MgcmV2ZWFsZWQgYnkgcnVubmluZyB0aGUgTklTQ0MgdGVzdCBzdWl0ZToKCiAgICAgU3RvcCBvdXQgb2YgYm91bmRzIHJlYWRzIGluIHRoZSBBU04xIGNvZGUgd2hlbiBwcmVzZW50ZWQgd2l0aAogICAgIGludmFsaWQgdGFncyAoQ1ZFLTIwMDMtMDU0MyBhbmQgQ1ZFLTIwMDMtMDU0NCkuCiAgICAgCiAgICAgRnJlZSB1cCBBU04xX1RZUEUgY29ycmVjdGx5IGlmIEFOWSB0eXBlIGlzIGludmFsaWQgKENWRS0yMDAzLTA1NDUpLgoKICAgICBJZiB2ZXJpZnkgY2FsbGJhY2sgaWdub3JlcyBpbnZhbGlkIHB1YmxpYyBrZXkgZXJyb3JzIGRvbid0IHRyeSB0byBjaGVjawogICAgIGNlcnRpZmljYXRlIHNpZ25hdHVyZSB3aXRoIHRoZSBOVUxMIHB1YmxpYyBrZXkuCgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyAtaWdub3JlX2VyciBvcHRpb24gaW4gb2NzcCBhcHBsaWNhdGlvbiB0byBzdG9wIHRoZSBzZXJ2ZXIKICAgICBleGl0aW5nIG9uIHRoZSBmaXJzdCBlcnJvciBpbiBhIHJlcXVlc3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gc3NsM19hY2NlcHQoKSAoc3NsL3MzX3NydnIuYykgb25seSBhY2NlcHQgYSBjbGllbnQgY2VydGlmaWNhdGUKICAgICBpZiB0aGUgc2VydmVyIHJlcXVlc3RlZCBvbmU6IGFzIHN0YXRlZCBpbiBUTFMgMS4wIGFuZCBTU0wgMy4wCiAgICAgc3BlY2lmaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gc3NsM19nZXRfY2xpZW50X2hlbGxvKCkgKHNzbC9zM19zcnZyLmMpLCB0b2xlcmF0ZSBhZGRpdGlvbmFsCiAgICAgZXh0cmEgZGF0YSBhZnRlciB0aGUgY29tcHJlc3Npb24gbWV0aG9kcyBub3Qgb25seSBmb3IgVExTIDEuMAogICAgIGJ1dCBhbHNvIGZvciBTU0wgMy4wIChhcyByZXF1aXJlZCBieSB0aGUgc3BlY2lmaWNhdGlvbikuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBNYXR0aGlhcyBMb2VwZmVdCgogICopIENoYW5nZSBYNTA5X2NlcnRpZmljYXRlX3R5cGUoKSB0byBtYXJrIHRoZSBrZXkgYXMgZXhwb3J0ZWQvZXhwb3J0YWJsZQogICAgIHdoZW4gaXQncyA1MTIgKmJpdHMqIGxvbmcsIG5vdCA1MTIgYnl0ZXMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIEFFU19jYmNfZW5jcnlwdCgpIHNvIGl0IG91dHB1dHMgZXhhY3QgbXVsdGlwbGUgb2YKICAgICBibG9ja3MgZHVyaW5nIGVuY3J5cHRpb24uCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVmFyaW91cyBmaXhlcyB0byBiYXNlNjQgQklPIGFuZCBub24gYmxvY2tpbmcgSS9PLiBPbiB3cml0ZSAKICAgICBmbHVzaGVzIHdlcmUgbm90IGhhbmRsZWQgcHJvcGVybHkgaWYgdGhlIEJJTyByZXRyaWVkLiBPbiByZWFkCiAgICAgZGF0YSB3YXMgbm90IGJlaW5nIGJ1ZmZlcmVkIHByb3Blcmx5IGFuZCBoYWQgdmFyaW91cyBsb2dpYyBidWdzLgogICAgIFRoaXMgYWxzbyBhZmZlY3RzIGJsb2NraW5nIEkvTyB3aGVuIHRoZSBkYXRhIGJlaW5nIGRlY29kZWQgaXMgYQogICAgIGNlcnRhaW4gc2l6ZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIFMvTUlNRSBidWdmaXhlcyBhbmQgY29tcGF0aWJpbGl0eSBjaGFuZ2VzOgogICAgIG91dHB1dCBjb3JyZWN0IGFwcGxpY2F0aW9uL3BrY3M3IE1JTUUgdHlwZSBpZgogICAgIFBLQ1M3X05PT0xETUlNRVRZUEUgaXMgc2V0LiBUb2xlcmF0ZSBzb21lIGJyb2tlbiBzaWduYXR1cmVzLgogICAgIE91dHB1dCBDUitMRiBmb3IgRU9MIGlmIFBLQ1M3X0NSTEZFT0wgaXMgc2V0ICh0aGlzIG1ha2VzIG9wZW5pbmcKICAgICBvZiBmaWxlcyBhcyAuZW1sIHdvcmspLiBDb3JyZWN0bHkgaGFuZGxlIHZlcnkgbG9uZyBsaW5lcyBpbiBNSU1FCiAgICAgcGFyc2VyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS43YSBhbmQgMC45LjdiICBbMTAgQXByIDIwMDNdCgogICopIENvdW50ZXJtZWFzdXJlIGFnYWluc3QgdGhlIEtsaW1hLVBva29ybnktUm9zYSBleHRlbnNpb24gb2YKICAgICBCbGVpY2hiYWNoZXIncyBhdHRhY2sgb24gUEtDUyAjMSB2MS41IHBhZGRpbmc6IHRyZWF0CiAgICAgYSBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBtaXNtYXRjaCBsaWtlIGEgZGVjcnlwdGlvbiBlcnJvcgogICAgIGluIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UgKHNzbC9zM19zcnZyLmMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFR1cm4gb24gUlNBIGJsaW5kaW5nIGJ5IGRlZmF1bHQgaW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICB0byBhdm9pZCBhIHRpbWluZyBhdHRhY2suIEFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQgaXQgY2FuIGNhbGwKICAgICBSU0FfYmxpbmRpbmdfb2ZmKCkgb3IgdXNlIHRoZSBuZXcgZmxhZyBSU0FfRkxBR19OT19CTElORElORy4KICAgICBUaGV5IHdvdWxkIGJlIGlsbC1hZHZpc2VkIHRvIGRvIHNvIGluIG1vc3QgY2FzZXMuCiAgICAgW0JlbiBMYXVyaWUsIFN0ZXZlIEhlbnNvbiwgR2VvZmYgVGhvcnBlLCBCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBSU0EgYmxpbmRpbmcgY29kZSBzbyB0aGF0IGl0IHdvcmtzIHdoZW4gdGhlIFBSTkcgaXMgbm90CiAgICAgc2VlZGVkIChpbiB0aGlzIGNhc2UsIHRoZSBzZWNyZXQgUlNBIGV4cG9uZW50IGlzIGFidXNlZCBhcwogICAgIGFuIHVucHJlZGljdGFibGUgc2VlZCAtLSBpZiBpdCBpcyBub3QgdW5wcmVkaWN0YWJsZSwgdGhlcmUKICAgICBpcyBubyBwb2ludCBpbiBibGluZGluZyBhbnl3YXkpLiAgTWFrZSBSU0EgYmxpbmRpbmcgdGhyZWFkLXNhZmUKICAgICBieSByZW1lbWJlcmluZyB0aGUgY3JlYXRvcidzIHRocmVhZCBJRCBpbiByc2EtPmJsaW5kaW5nIGFuZAogICAgIGhhdmluZyBhbGwgb3RoZXIgdGhyZWFkcyB1c2UgbG9jYWwgb25lLXRpbWUgYmxpbmRpbmcgZmFjdG9ycwogICAgICh0aGlzIHJlcXVpcmVzIG1vcmUgY29tcHV0YXRpb24gdGhhbiBzaGFyaW5nIHJzYS0+YmxpbmRpbmcsIGJ1dAogICAgIGF2b2lkcyBleGNlc3NpdmUgbG9ja2luZzsgYW5kIGlmIGFuIFJTQSBvYmplY3QgaXMgbm90IHNoYXJlZAogICAgIGJldHdlZW4gdGhyZWFkcywgYmxpbmRpbmcgd2lsbCBzdGlsbCBiZSB2ZXJ5IGZhc3QpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeGVkIGEgdHlwbyBidWcgdGhhdCB3b3VsZCBjYXVzZSBFTkdJTkVfc2V0X2RlZmF1bHQoKSB0byBzZXQgYW4KICAgICBFTkdJTkUgYXMgZGVmYXVsdHMgZm9yIGFsbCBzdXBwb3J0ZWQgYWxnb3JpdGhtcyBpcnJlc3BlY3RpdmUgb2YKICAgICB0aGUgJ2ZsYWdzJyBwYXJhbWV0ZXIuICdmbGFncycgaXMgbm93IGhvbm91cmVkLCBzbyBhcHBsaWNhdGlvbnMKICAgICBzaG91bGQgbWFrZSBzdXJlIHRoZXkgYXJlIHBhc3NpbmcgaXQgY29ycmVjdGx5LgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIFRhcmdldCAibWluZ3ciIG5vdyBhbGxvd3MgbmF0aXZlIFdpbmRvd3MgY29kZSB0byBiZSBnZW5lcmF0ZWQgaW4KICAgICB0aGUgQ3lnd2luIGVudmlyb25tZW50IGFzIHdlbGwgYXMgd2l0aCB0aGUgTWluR1cgY29tcGlsZXIuCiAgICAgW1VsZiBNb2VsbGVyXSAKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjcgYW5kIDAuOS43YSAgWzE5IEZlYiAyMDAzXQoKICAqKSBJbiBzc2wzX2dldF9yZWNvcmQgKHNzbC9zM19wa3QuYyksIG1pbmltaXplIGluZm9ybWF0aW9uIGxlYWtlZAogICAgIHZpYSB0aW1pbmcgYnkgcGVyZm9ybWluZyBhIE1BQyBjb21wdXRhdGlvbiBldmVuIGlmIGluY29ycnJlY3QKICAgICBibG9jayBjaXBoZXIgcGFkZGluZyBoYXMgYmVlbiBmb3VuZC4gIFRoaXMgaXMgYSBjb3VudGVybWVhc3VyZQogICAgIGFnYWluc3QgYWN0aXZlIGF0dGFja3Mgd2hlcmUgdGhlIGF0dGFja2VyIGhhcyB0byBkaXN0aW5ndWlzaAogICAgIGJldHdlZW4gYmFkIHBhZGRpbmcgYW5kIGEgTUFDIHZlcmlmaWNhdGlvbiBlcnJvci4gKENWRS0yMDAzLTAwNzgpCgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQnJpY2UgQ2FudmVsIChFUEZMKSwKICAgICBBbGFpbiBIaWx0Z2VuIChVQlMpLCBTZXJnZSBWYXVkZW5heSAoRVBGTCksIGFuZAogICAgIE1hcnRpbiBWdWFnbm91eCAoRVBGTCwgSWxpb24pXQoKICAqKSBNYWtlIHRoZSBuby1lcnIgb3B0aW9uIHdvcmsgYXMgaW50ZW5kZWQuICBUaGUgaW50ZW50aW9uIHdpdGggbm8tZXJyCiAgICAgaXMgbm90IHRvIGhhdmUgdGhlIHdob2xlIGVycm9yIHN0YWNrIGhhbmRsaW5nIHJvdXRpbmVzIHJlbW92ZWQgZnJvbQogICAgIGxpYmNyeXB0bywgaXQncyBvbmx5IGludGVuZGVkIHRvIHJlbW92ZSBhbGwgdGhlIGZ1bmN0aW9uIG5hbWUgYW5kCiAgICAgcmVhc29uIHRleHRzLCB0aGVyZWJ5IHJlbW92aW5nIHNvbWUgb2YgdGhlIGZvb3RwcmludCB0aGF0IG1heSBub3QKICAgICBiZSBpbnRlcmVzdGluZyBpZiB0aG9zZSBlcnJvcnMgYXJlbid0IGRpc3BsYXllZCBhbnl3YXkuCgogICAgIE5PVEU6IGl0J3Mgc3RpbGwgcG9zc2libGUgZm9yIGFueSBhcHBsaWNhdGlvbiBvciBtb2R1bGUgdG8gaGF2ZSBpdCdzCiAgICAgb3duIHNldCBvZiBlcnJvciB0ZXh0cyBpbnNlcnRlZC4gIFRoZSByb3V0aW5lcyBhcmUgdGhlcmUsIGp1c3Qgbm90CiAgICAgdXNlZCBieSBkZWZhdWx0IHdoZW4gbm8tZXJyIGlzIGdpdmVuLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBzdXBwb3J0IGZvciBGcmVlQlNEIG9uIElBNjQuCiAgICAgW2RpcmsubWV5ZXJAZGlub2V4LnN1Yi5vcmcgdmlhIFJpY2hhcmQgTGV2aXR0ZSwgcmVzb2x2ZXMgIzQ1NF0KCiAgKikgQWRqdXN0IERFU19jYmNfY2tzdW0oKSBzbyBpdCByZXR1cm5zIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBNSVQKICAgICBLZXJiZXJvcyBmdW5jdGlvbiBtaXRfZGVzX2NiY19ja3N1bSgpLiAgQmVmb3JlIHRoaXMgY2hhbmdlLAogICAgIHRoZSB2YWx1ZSByZXR1cm5lZCBieSBERVNfY2JjX2Nrc3VtKCkgd2FzIGxpa2UgdGhlIG9uZSBmcm9tCiAgICAgbWl0X2Rlc19jYmNfY2tzdW0oKSwgZXhjZXB0IHRoZSBieXRlcyB3ZXJlIHN3YXBwZWQuCiAgICAgW0tldmluIEdyZWFuZXkgPEtldmluLkdyZWFuZXlAaHAuY29tPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBkaXNhYmxlIHRoZSBhdXRvbWF0aWMgU1NMIGNoYWluIGJ1aWxkaW5nLgogICAgIEJlZm9yZSB0aGlzIGEgcmF0aGVyIHByaW1pdGl2ZSBjaGFpbiBidWlsZCB3YXMgYWx3YXlzIHBlcmZvcm1lZCBpbgogICAgIHNzbDNfb3V0cHV0X2NlcnRfY2hhaW4oKTogYW4gYXBwbGljYXRpb24gaGFkIG5vIHdheSB0byBzZW5kIHRoZSAKICAgICBjb3JyZWN0IGNoYWluIGlmIHRoZSBhdXRvbWF0aWMgb3BlcmF0aW9uIHByb2R1Y2VkIGFuIGluY29ycmVjdCByZXN1bHQuCgogICAgIE5vdyB0aGUgY2hhaW4gYnVpbGRlciBpcyBkaXNhYmxlZCBpZiBlaXRoZXI6CgogICAgIDEuIEV4dHJhIGNlcnRpZmljYXRlcyBhcmUgYWRkZWQgdmlhIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoKS4KCiAgICAgMi4gVGhlIG1vZGUgZmxhZyBTU0xfTU9ERV9OT19BVVRPX0NIQUlOIGlzIHNldC4KCiAgICAgVGhlIHJlYXNvbmluZyBiZWhpbmQgdGhpcyBpcyB0aGF0IGFuIGFwcGxpY2F0aW9uIHdvdWxkIG5vdCB3YW50IHRoZQogICAgIGF1dG8gY2hhaW4gYnVpbGRpbmcgdG8gdGFrZSBwbGFjZSBpZiBleHRyYSBjaGFpbiBjZXJ0aWZpY2F0ZXMgYXJlCiAgICAgcHJlc2VudCBhbmQgaXQgbWlnaHQgYWxzbyB3YW50IGEgbWVhbnMgb2Ygc2VuZGluZyBubyBhZGRpdGlvbmFsCiAgICAgY2VydGlmaWNhdGVzIChmb3IgZXhhbXBsZSB0aGUgY2hhaW4gaGFzIHR3byBjZXJ0aWZpY2F0ZXMgYW5kIHRoZQogICAgIHJvb3QgaXMgb21pdHRlZCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBidWlsZCB3aXRob3V0IHRoZSBFTkdJTkUgZnJhbWV3b3JrLgogICAgIFtTdGV2ZW4gUmVkZGllIDxzbXJAZXNzZW1lci5jb20uYXU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIFVuZGVyIFdpbjMyIGdtdGltZSgpIGNhbiByZXR1cm4gTlVMTDogY2hlY2sgcmV0dXJuIHZhbHVlIGluCiAgICAgT1BFTlNTTF9nbXRpbWUoKS4gQWRkIGVycm9yIGNvZGUgZm9yIGNhc2Ugd2hlcmUgZ210aW1lKCkgZmFpbHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRFNBIHJvdXRpbmVzOiB1bmRlciBjZXJ0YWluIGVycm9yIGNvbmRpdGlvbnMgdW5pbml0aWFsaXplZCBCTiBvYmplY3RzCiAgICAgY291bGQgYmUgZnJlZWQuIFNvbHV0aW9uOiBtYWtlIHN1cmUgaW5pdGlhbGl6YXRpb24gaXMgcGVyZm9ybWVkIGVhcmx5CiAgICAgZW5vdWdoLiAoUmVwb3J0ZWQgYW5kIGZpeCBzdXBwbGllZCBieSBJdmFuIEQgTmVzdGxlcm9kZSA8bmVzdGxlckBNSVQuRURVPiwKICAgICBOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPiB2aWEgUFIjNDU5KQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBbm90aGVyIGZpeCBmb3IgU1NMdjIgc2Vzc2lvbiBJRCBoYW5kbGluZzogdGhlIHNlc3Npb24gSUQgd2FzIGluY29ycmVjdGx5CiAgICAgY2hlY2tlZCBvbiByZWNvbm5lY3Qgb24gdGhlIGNsaWVudCBzaWRlLCB0aGVyZWZvcmUgc2Vzc2lvbiByZXN1bXB0aW9uCiAgICAgY291bGQgc3RpbGwgZmFpbCB3aXRoIGEgInNzbCBzZXNzaW9uIGlkIGlzIGRpZmZlcmVudCIgZXJyb3IuIFRoaXMKICAgICBiZWhhdmlvdXIgaXMgbWFza2VkIHdoZW4gU1NMX09QX0FMTCBpcyB1c2VkIGR1ZSB0bwogICAgIFNTTF9PUF9NSUNST1NPRlRfU0VTU19JRF9CVUcgYmVpbmcgc2V0LgogICAgIEJlaGF2aW91ciBvYnNlcnZlZCBieSBDcmlzcGluIEZsb3dlcmRheSA8Y3Jpc3BpbkBmbG93ZXJkYXkuY3g+IGFzCiAgICAgZm9sbG93dXAgdG8gUFIgIzM3Ny4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSUEtMzIgYXNzZW1ibGVyIHN1cHBvcnQgZW5oYW5jZW1lbnRzOiB1bmlmaWVkIEVMRiB0YXJnZXRzLCBzdXBwb3J0CiAgICAgZm9yIFNDTy9DYWxkZXJhIHBsYXRmb3JtcywgZml4IGZvciBDeWd3aW4gc2hhcmVkIGJ1aWxkLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgRnJlZUJTRCBvbiBzcGFyYzY0LiAgQXMgYSBjb25zZXF1ZW5jZSwgc3VwcG9ydCBmb3IKICAgICBGcmVlQlNEIG9uIG5vbi14ODYgcHJvY2Vzc29ycyBpcyBzZXBhcmF0ZSBmcm9tIHg4NiBwcm9jZXNzb3JzIG9uCiAgICAgdGhlIGNvbmZpZyBzY3JpcHQsIG11Y2ggbGlrZSB0aGUgTmV0QlNEIHN1cHBvcnQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSAmIEtyaXMgS2VubmF3YXkgPGtyaXNAb2JzZWN1cml0eS5vcmc+XQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmggYW5kIDAuOS43ICBbMzEgRGVjIDIwMDJdCgogIFtOQjogT3BlblNTTCAwLjkuNmkgYW5kIGxhdGVyIDAuOS42IHBhdGNoIGxldmVscyB3ZXJlIHJlbGVhc2VkIGFmdGVyCiAgT3BlblNTTCAwLjkuNy5dCgogICopIEZpeCBzZXNzaW9uIElEIGhhbmRsaW5nIGluIFNTTHYyIGNsaWVudCBjb2RlOiB0aGUgU0VSVkVSIEZJTklTSEVECiAgICAgY29kZSAoMDYpIHdhcyB0YWtlbiBhcyB0aGUgZmlyc3Qgb2N0ZXQgb2YgdGhlIHNlc3Npb24gSUQgYW5kIHRoZSBsYXN0CiAgICAgb2N0ZXQgd2FzIGlnbm9yZWQgY29uc2VxdWVudGx5LiBBcyBhIHJlc3VsdCBTU0x2MiBjbGllbnQgc2lkZSBzZXNzaW9uCiAgICAgY2FjaGluZyBjb3VsZCBub3QgaGF2ZSB3b3JrZWQgZHVlIHRvIHRoZSBzZXNzaW9uIElEIG1pc21hdGNoIGJldHdlZW4KICAgICBjbGllbnQgYW5kIHNlcnZlci4KICAgICBCZWhhdmlvdXIgb2JzZXJ2ZWQgYnkgQ3Jpc3BpbiBGbG93ZXJkYXkgPGNyaXNwaW5AZmxvd2VyZGF5LmN4PiBhcwogICAgIFBSICMzNzcuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIENoYW5nZSB0aGUgZGVjbGFyYXRpb24gb2YgbmVlZGVkIEtlcmJlcm9zIGxpYnJhcmllcyB0byB1c2UgRVhfTElCUwogICAgIGluc3RlYWQgb2YgdGhlIHNwZWNpYWwgKGFuZCBiYWRseSBzdXBwb3J0ZWQpIExJQktSQjUuICBMSUJLUkI1IGlzCiAgICAgcmVtb3ZlZCBlbnRpcmVseS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUaGUgaHdfbmNpcGhlci5jIGVuZ2luZSByZXF1aXJlcyBkeW5hbWljIGxvY2tzLiAgVW5mb3J0dW5hdGVseSwgaXQKICAgICBzZWVtcyB0aGF0IGluIHNwaXRlIG9mIGV4aXN0aW5nIGZvciBtb3JlIHRoYW4gYSB5ZWFyLCBtYW55IGFwcGxpY2F0aW9uCiAgICAgYXV0aG9yIGhhdmUgZG9uZSBub3RoaW5nIHRvIHByb3ZpZGUgdGhlIG5lY2Vzc2FyeSBjYWxsYmFja3MsIHdoaWNoCiAgICAgbWVhbnMgdGhhdCB0aGlzIHBhcnRpY3VsYXIgZW5naW5lIHdpbGwgbm90IHdvcmsgcHJvcGVybHkgYW55d2hlcmUuCiAgICAgVGhpcyBpcyBhIHZlcnkgdW5mb3J0dW5hdGUgc2l0dWF0aW9uIHdoaWNoIGZvcmNlcyB1cywgaW4gdGhlIG5hbWUKICAgICBvZiB1c2FiaWxpdHksIHRvIGdpdmUgdGhlIGh3X25jaXBoZXIuYyBhIHN0YXRpYyBsb2NrLCB3aGljaCBpcyBwYXJ0CiAgICAgb2YgbGliY3J5cHRvLgogICAgIE5PVEU6IFRoaXMgaXMgZm9yIHRoZSAwLjkuNyBzZXJpZXMgT05MWS4gIFRoaXMgaGFjayB3aWxsIG5ldmVyCiAgICAgYXBwZWFyIGluIDAuOS44IG9yIGxhdGVyLiAgV2UgRVhQRUNUIGFwcGxpY2F0aW9uIGF1dGhvcnMgdG8gaGF2ZQogICAgIGRlYWx0IHByb3Blcmx5IHdpdGggdGhpcyB3aGVuIDAuOS44IGlzIHJlbGVhc2VkICh1bmxlc3Mgd2UgYWN0dWFsbHkKICAgICBtYWtlIHN1Y2ggY2hhbmdlcyBpbiB0aGUgbGliY3J5cHRvIGxvY2tpbmcgY29kZSB0aGF0IGNoYW5nZXMgd2lsbAogICAgIGhhdmUgdG8gYmUgbWFkZSBhbnl3YXkpLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIGFzbjFfZDJpX3JlYWRfYmlvKCkgcmVwZWF0ZWRseSBjYWxsIEJJT19yZWFkKCkgdW50aWwgYWxsIGNvbnRlbnQKICAgICBvY3RldHMgaGF2ZSBiZWVuIHJlYWQsIEVPRiBvciBhbiBlcnJvciBvY2N1cnMuIFdpdGhvdXQgdGhpcyBjaGFuZ2UKICAgICBzb21lIHRydW5jYXRlZCBBU04xIHN0cnVjdHVyZXMgd2lsbCBub3QgcHJvZHVjZSBhbiBlcnJvci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEaXNhYmxlIEhlaW1kYWwgc3VwcG9ydCwgc2luY2UgaXQgaGFzbid0IGJlZW4gZnVsbHkgaW1wbGVtZW50ZWQuCiAgICAgU3RpbGwgZ2l2ZSB0aGUgcG9zc2liaWxpdHkgdG8gZm9yY2UgdGhlIHVzZSBvZiBIZWltZGFsLCBidXQgd2l0aAogICAgIHdhcm5pbmdzIGFuZCBhIHJlcXVlc3QgdGhhdCBwYXRjaGVzIGdldCBzZW50IHRvIG9wZW5zc2wtZGV2LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgVkMtQ0UgdGFyZ2V0LCBpbnRyb2R1Y2UgdGhlIFdJTkNFIHN5c25hbWUsIGFuZCBhZGQKICAgICBJTlNUQUxMLldDRSBhbmQgYXBwcm9wcmlhdGUgY29uZGl0aW9uYWxzIHRvIG1ha2UgaXQgYnVpbGQuCiAgICAgW1N0ZXZlbiBSZWRkaWUgPHNtckBlc3NlbWVyLmNvbS5hdT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ2hhbmdlIHRoZSBETEwgbmFtZXMgZm9yIEN5Z3dpbiB0byBjeWdjcnlwdG8teC55LnouZGxsIGFuZAogICAgIGN5Z3NzbC14Lnkuei5kbGwsIHdoZXJlIHgsIHkgYW5kIHogYXJlIHRoZSBtYWpvciwgbWlub3IgYW5kCiAgICAgZWRpdCBudW1iZXJzIG9mIHRoZSB2ZXJzaW9uLgogICAgIFtDb3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbnRyb2R1Y2Ugc2FmZSBzdHJpbmcgY29weSBhbmQgY2F0ZW5hdGlvbiBmdW5jdGlvbnMKICAgICAoQlVGX3N0cmxjcHkoKSBhbmQgQlVGX3N0cmxjYXQoKSkuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKSBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBdm9pZCB1c2luZyBmaXhlZC1zaXplIGJ1ZmZlcnMgZm9yIG9uZS1saW5lIEROcy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBZGQgQlVGX01FTV9ncm93X2NsZWFuKCkgdG8gYXZvaWQgaW5mb3JtYXRpb24gbGVha2FnZSB3aGVuCiAgICAgcmVzaXppbmcgYnVmZmVycyBjb250YWluaW5nIHNlY3JldHMsIGFuZCB1c2Ugd2hlcmUgYXBwcm9wcmlhdGUuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQXZvaWQgdXNpbmcgZml4ZWQgc2l6ZSBidWZmZXJzIGZvciBjb25maWd1cmF0aW9uIGZpbGUgbG9jYXRpb24uCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQXZvaWQgZmlsZW5hbWUgdHJ1bmNhdGlvbiBmb3IgdmFyaW91cyBDQSBmaWxlcy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBVc2Ugc2l6ZW9mIGluIHByZWZlcmVuY2UgdG8gbWFnaWMgbnVtYmVycy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBBdm9pZCBmaWxlbmFtZSB0cnVuY2F0aW9uIGluIGNlcnQgcmVxdWVzdHMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIGFzc2VydGlvbnMgdG8gY2hlY2sgZm9yIChzdXBwb3NlZGx5IGltcG9zc2libGUpIGJ1ZmZlcgogICAgIG92ZXJmbG93cy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBEb24ndCBjYWNoZSB0cnVuY2F0ZWQgRE5TIGVudHJpZXMgaW4gdGhlIGxvY2FsIGNhY2hlICh0aGlzIGNvdWxkCiAgICAgcG90ZW50aWFsbHkgbGVhZCB0byBhIHNwb29maW5nIGF0dGFjaykuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgRml4IHZhcmlvdXMgYnVmZmVycyB0byBiZSBsYXJnZSBlbm91Z2ggZm9yIGhleC9kZWNpbWFsCiAgICAgcmVwcmVzZW50YXRpb25zIGluIGEgcGxhdGZvcm0gaW5kZXBlbmRlbnQgbWFubmVyLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBDUllQVE9fcmVhbGxvY19jbGVhbigpIHRvIGF2b2lkIGluZm9ybWF0aW9uIGxlYWthZ2Ugd2hlbgogICAgIHJlc2l6aW5nIGJ1ZmZlcnMgY29udGFpbmluZyBzZWNyZXRzLCBhbmQgdXNlIHdoZXJlIGFwcHJvcHJpYXRlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEFkZCBCSU9faW5kZW50KCkgdG8gYXZvaWQgbXVjaCBzbGlnaHRseSB3b3JyeWluZyBjb2RlIHRvIGRvCiAgICAgaW5kZW50cy4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBDb252ZXJ0IHNwcmludGYoKS9CSU9fcHV0cygpIHRvIEJJT19wcmludGYoKS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBidWZmZXJfZ2V0cygpIGNvdWxkIHRlcm1pbmF0ZSB3aXRoIHRoZSBidWZmZXIgb25seSBoYWxmCiAgICAgZnVsbC4gRml4ZWQuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgQWRkIGFzc2VydGlvbnMgdG8gcHJldmVudCB1c2VyLXN1cHBsaWVkIGNyeXB0byBmdW5jdGlvbnMgZnJvbQogICAgIG92ZXJmbG93aW5nIGludGVybmFsIGJ1ZmZlcnMgYnkgaGF2aW5nIGxhcmdlIGJsb2NrIHNpemVzLCBldGMuCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgTmV3IE9QRU5TU0xfYXNzZXJ0KCkgbWFjcm8gKHNpbWlsYXIgdG8gYXNzZXJ0KCksIGJ1dCBlbmFibGVkCiAgICAgdW5jb25kaXRpb25hbGx5KS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGNvcHkgb2Yga2V5IGluIFJDNC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBpbmNvcnJlY3RseSBzaXplZCBidWZmZXJzIGZvciBJViBpbiBwZW0uaC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBGaXggb2ZmLWJ5LW9uZSBlcnJvciBpbiBFR0QgcGF0aC4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBJZiBSQU5ERklMRSBwYXRoIGlzIHRvbyBsb25nLCBpZ25vcmUgaW5zdGVhZCBvZiB0cnVuY2F0aW5nLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGluY29ycmVjdGx5IHNpemVkIFguNTA5IHN0cnVjdHVyZQogICAgIENCQ1BhcmFtZXRlci4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBFbGltaW5hdGUgdW51c2VkIGFuZCBkYW5nZXJvdXMgZnVuY3Rpb24ga251bWJlcigpLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIEVsaW1pbmF0ZSB1bnVzZWQgYW5kIGRhbmdlcm91cyBzdHJ1Y3R1cmUsIEtTU0xfRVJSLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIFByb3RlY3QgYWdhaW5zdCBvdmVybG9uZyBzZXNzaW9uIElEIGNvbnRleHQgbGVuZ3RoIGluIGFuIGVuY29kZWQKICAgICBzZXNzaW9uIG9iamVjdC4gU2luY2UgdGhlc2UgYXJlIGxvY2FsLCB0aGlzIGRvZXMgbm90IGFwcGVhciB0byBiZQogICAgIGV4cGxvaXRhYmxlLgogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIENoYW5nZSBmcm9tIHNlY3VyaXR5IHBhdGNoIChzZWUgMC45LjZlIGJlbG93KSB0aGF0IGRpZCBub3QgYWZmZWN0CiAgICAgdGhlIDAuOS42IHJlbGVhc2Ugc2VyaWVzOgoKICAgICBSZW1vdGUgYnVmZmVyIG92ZXJmbG93IGluIFNTTDMgcHJvdG9jb2wgLSBhbiBhdHRhY2tlciBjb3VsZAogICAgIHN1cHBseSBhbiBvdmVyc2l6ZWQgbWFzdGVyIGtleSBpbiBLZXJiZXJvcy1lbmFibGVkIHZlcnNpb25zLgogICAgIChDVkUtMjAwMi0wNjU3KQogICAgIFtCZW4gTGF1cmllIChDSEFUUyldCgogICopIENoYW5nZSB0aGUgU1NMIGtlcmI1IGNvZGVzIHRvIG1hdGNoIFJGQyAyNzEyLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE1ha2UgLW5hbWVvcHQgd29yayBmdWxseSBmb3IgcmVxIGFuZCBhZGQgLXJlcW9wdCBzd2l0Y2guCiAgICAgW01pY2hhZWwgQmVsbCA8bWljaGFlbC5iZWxsQHJ6Lmh1LWJlcmxpbi5kZT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgVGhlICJibG9jayBzaXplIiBmb3IgYmxvY2sgY2lwaGVycyBpbiBDRkIgYW5kIE9GQiBtb2RlIHNob3VsZCBiZSAxLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IFluZ3ZlIE55c2FldGVyIFBldHRlcnNlbiA8eW5ndmVAb3BlcmEuY29tPl0KCiAgKikgTWFrZSBzdXJlIHRlc3RzIGNhbiBiZSBwZXJmb3JtZWQgZXZlbiBpZiB0aGUgY29ycmVzcG9uZGluZyBhbGdvcml0aG1zCiAgICAgaGF2ZSBiZWVuIHJlbW92ZWQgZW50aXJlbHkuICBUaGlzIHdhcyBhbHNvIHRoZSBsYXN0IHN0ZXAgdG8gbWFrZQogICAgIE9wZW5TU0wgY29tcGlsYWJsZSB3aXRoIERKR1BQIHVuZGVyIGFsbCByZWFzb25hYmxlIGNvbmRpdGlvbnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSwgRG91ZyBLYXVmbWFuIDxka2F1Zm1hbkByYWh1bC5uZXQ+XQoKICAqKSBBZGQgY2lwaGVyIHNlbGVjdGlvbiBydWxlcyBDT01QTEVNRU5UT0ZBTEwgYW5kIENPTVBMRU1FTlRPRkRFRkFVTFQKICAgICB0byBhbGxvdyB2ZXJzaW9uIGluZGVwZW5kZW50IGRpc2FibGluZyBvZiBub3JtYWxseSB1bnNlbGVjdGVkIGNpcGhlcnMsCiAgICAgd2hpY2ggbWF5IGJlIGFjdGl2YXRlZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHNlbGVjdGluZyBhIHNpbmdsZSBjaXBoZXIuCgogICAgIChFLmcuLCBjaXBoZXIgbGlzdCBzdHJpbmcgIlJTQSIgZW5hYmxlcyBjaXBoZXJzdWl0ZXMgdGhhdCBhcmUgbGVmdAogICAgIG91dCBvZiAiQUxMIiBiZWNhdXNlIHRoZXkgZG8gbm90IHByb3ZpZGUgc3ltbWV0cmljIGVuY3J5cHRpb24uCiAgICAgIlJTQTohQ09NUExFTUVNRU5UT0ZBTEwiIGF2b2lkcyB0aGVzZSB1bnNhZmUgY2lwaGVyc3VpdGVzLikKICAgICBbTHV0eiBKYWVuaWNrZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYXBwcm9wcmlhdGUgc3VwcG9ydCBmb3Igc2VwYXJhdGUgcGxhdGZvcm0tZGVwZW5kZW50IGJ1aWxkCiAgICAgZGlyZWN0b3JpZXMuICBUaGUgcmVjb21tZW5kZWQgd2F5IHRvIG1ha2UgYSBwbGF0Zm9ybS1kZXBlbmRlbnQKICAgICBidWlsZCBkaXJlY3RvcnkgaXMgdGhlIGZvbGxvd2luZyAodGVzdGVkIG9uIExpbnV4KSwgbWF5YmUgd2l0aAogICAgIHNvbWUgbG9jYWwgdHdlYWtzOgoKCSMgUGxhY2UgeW91cnNlbGYgb3V0c2lkZSBvZiB0aGUgT3BlblNTTCBzb3VyY2UgdHJlZS4gIEluCgkjIHRoaXMgZXhhbXBsZSwgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIE9QRU5TU0xfU09VUkNFCgkjIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgYWJzb2x1dGUgT3BlblNTTCBzb3VyY2UgZGlyZWN0b3J5LgoJbWtkaXIgLXAgb2JqdHJlZS8iYHVuYW1lIC1zYC1gdW5hbWUgLXJgLWB1bmFtZSAtbWAiCgljZCBvYmp0cmVlLyJgdW5hbWUgLXNgLWB1bmFtZSAtcmAtYHVuYW1lIC1tYCIKCShjZCAkT1BFTlNTTF9TT1VSQ0U7IGZpbmQgLiAtdHlwZSBmKSB8IHdoaWxlIHJlYWQgRjsgZG8KCQlta2RpciAtcCBgZGlybmFtZSAkRmAKCQlsbiAtcyAkT1BFTlNTTF9TT1VSQ0UvJEYgJEYKCWRvbmUKCiAgICAgVG8gYmUgYWJzb2x1dGVseSBzdXJlIG5vdCB0byBkaXN0dXJiIHRoZSBzb3VyY2UgdHJlZSwgYSAibWFrZSBjbGVhbiIKICAgICBpcyBhIGdvb2QgdGhpbmcuICBJZiBpdCBpc24ndCBzdWNjZXNzZnVsbCwgZG9uJ3Qgd29ycnkgYWJvdXQgaXQsCiAgICAgaXQgcHJvYmFibHkgbWVhbnMgdGhlIHNvdXJjZSBkaXJlY3RvcnkgaXMgdmVyeSBjbGVhbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIHN1cmUgYW55IEVOR0lORSBjb250cm9sIGNvbW1hbmRzIG1ha2UgbG9jYWwgY29waWVzIG9mIHN0cmluZwogICAgIHBvaW50ZXJzIHBhc3NlZCB0byB0aGVtIHdoZW5ldmVyIG5lY2Vzc2FyeS4gT3RoZXJ3aXNlIGl0IGlzIHBvc3NpYmxlCiAgICAgdGhlIGNhbGxlciBtYXkgaGF2ZSBvdmVyd3JpdHRlbiAob3IgZGVhbGxvY2F0ZWQpIHRoZSBvcmlnaW5hbCBzdHJpbmcKICAgICBkYXRhIHdoZW4gYSBsYXRlciBFTkdJTkUgb3BlcmF0aW9uIHRyaWVzIHRvIHVzZSB0aGUgc3RvcmVkIHZhbHVlcy4KICAgICBbR/Z0eiBCYWJpbi1FYmVsbCA8YmFiaW5lYmVsbEB0cnVzdGNlbnRlci5kZT5dCgogICopIEltcHJvdmUgZGlhZ25vc3RpY3MgaW4gZmlsZSByZWFkaW5nIGFuZCBjb21tYW5kLWxpbmUgZGlnZXN0cy4KICAgICBbQmVuIExhdXJpZSBhaWRlZCBhbmQgYWJldHRlZCBieSBTb2xhciBEZXNpZ25lciA8c29sYXJAb3BlbndhbGwuY29tPl0KCiAgKikgQWRkIEFFUyBtb2RlcyBDRkIgYW5kIE9GQiB0byB0aGUgb2JqZWN0IGRhdGFiYXNlLiAgQ29ycmVjdCBhbgogICAgIGVycm9yIGluIEFFUy1DRkIgZGVjcnlwdGlvbi4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZW1vdmUgbW9zdCBjYWxscyB0byBFVlBfQ0lQSEVSX0NUWF9jbGVhbnVwKCkgaW4gZXZwX2VuYy5jLCB0aGlzIAogICAgIGFsbG93cyBleGlzdGluZyBFVlBfQ0lQSEVSX0NUWCBzdHJ1Y3R1cmVzIHRvIGJlIHJldXNlZCBhZnRlcgogICAgIGNhbGxpbmcgRVZQXypGaW5hbCgpLiBUaGlzIGJlaGF2aW91ciBpcyB1c2VkIGJ5IGVuY3J5cHRpb24KICAgICBCSU9zIGFuZCBzb21lIGFwcGxpY2F0aW9ucy4gVGhpcyBoYXMgdGhlIHNpZGUgZWZmZWN0IHRoYXQKICAgICBhcHBsaWNhdGlvbnMgbXVzdCBleHBsaWNpdGx5IGNsZWFuIHVwIGNpcGhlciBjb250ZXh0cyB3aXRoCiAgICAgRVZQX0NJUEhFUl9DVFhfY2xlYW51cCgpIG9yIHRoZXkgd2lsbCBsZWFrIG1lbW9yeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGVjayB0aGUgdmFsdWVzIG9mIGRuYSBhbmQgZG5iIGluIGJuX211bF9yZWN1cnNpdmUgYmVmb3JlIGNhbGxpbmcKICAgICBibl9tdWxfY29tYmEgKGEgbm9uIHplcm8gdmFsdWUgbWVhbnMgdGhlIGEgb3IgYiBhcnJheXMgZG8gbm90IGNvbnRhaW4KICAgICBuMiBlbGVtZW50cykgYW5kIGZhbGxiYWNrIHRvIGJuX211bF9ub3JtYWwgaWYgZWl0aGVyIGlzIG5vdCB6ZXJvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBlc2NhcGluZyBvZiBub24tQVNDSUkgY2hhcmFjdGVycyB3aGVuIHVzaW5nIHRoZSAtc3ViaiBvcHRpb24KICAgICBvZiB0aGUgIm9wZW5zc2wgcmVxIiBjb21tYW5kIGxpbmUgdG9vbC4gKFJvYmVydCBKb29wIDxqb29wQGZva3VzLmdtZC5kZT4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIE1ha2Ugb2JqZWN0IGRlZmluaXRpb25zIGNvbXBsaWFudCB0byBMREFQIChSRkMyMjU2KTogU04gaXMgdGhlIHNob3J0CiAgICAgZm9ybSBmb3IgInN1cm5hbWUiLCBzZXJpYWxOdW1iZXIgaGFzIG5vIHNob3J0IGZvcm0uCiAgICAgVXNlICJtYWlsIiBhcyB0aGUgc2hvcnQgbmFtZSBmb3IgInJmYzgyMk1haWxib3giIGFjY29yZGluZyB0byBSRkMyNzk4OwogICAgIHRoZXJlZm9yZSByZW1vdmUgIm1haWwiIHNob3J0IG5hbWUgZm9yICJpbnRlcm5ldCA3Ii4KICAgICBUaGUgT0lEIGZvciB1bmlxdWUgaWRlbnRpZmllcnMgaW4gWDUwOSBjZXJ0aWZpY2F0ZXMgaXMKICAgICB4NTAwVW5pcXVlSWRlbnRpZmllciwgbm90IHVuaXF1ZUlkZW50aWZpZXIuCiAgICAgU29tZSBtb3JlIE9JRCBhZGRpdGlvbnMuIChNaWNoYWVsIEJlbGwgPG1pY2hhZWwuYmVsbEByei5odS1iZXJsaW4uZGU+KQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBBZGQgYW4gImluaXQiIGNvbW1hbmQgdG8gdGhlIEVOR0lORSBjb25maWcgbW9kdWxlIGFuZCBhdXRvIGluaXRpYWxpemUKICAgICBFTkdJTkVzLiBXaXRob3V0IGFueSAiaW5pdCIgY29tbWFuZCB0aGUgRU5HSU5FIHdpbGwgYmUgaW5pdGlhbGl6ZWQgCiAgICAgYWZ0ZXIgYWxsIGN0cmwgY29tbWFuZHMgaGF2ZSBiZWVuIGV4ZWN1dGVkIG9uIGl0LiBJZiBpbml0PTEgdGhlIAogICAgIEVOR0lORSBpcyBpbml0YWlsaXplZCBhdCB0aGF0IHBvaW50IChjdHJscyBiZWZvcmUgdGhhdCBwb2ludCBhcmUgcnVuCiAgICAgb24gdGhlIHVuaW5pdGlhbGl6ZWQgRU5HSU5FIGFuZCBhZnRlciBvbiB0aGUgaW5pdGlhbGl6ZWQgb25lKS4gSWYKICAgICBpbml0PTAgdGhlbiB0aGUgRU5HSU5FIHdpbGwgbm90IGJlIGluaWF0aWFsaXplZCBhdCBhbGwuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSAnYXBwX3ZlcmlmeV9jYWxsYmFjaycgaW50ZXJmYWNlIHNvIHRoYXQgdGhlIHVzZXItZGVmaW5lZAogICAgIGFyZ3VtZW50IGlzIGFjdHVhbGx5IHBhc3NlZCB0byB0aGUgY2FsbGJhY2s6IEluIHRoZQogICAgIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKCkgcHJvdG90eXBlLCB0aGUgY2FsbGJhY2sKICAgICBkZWNsYXJhdGlvbiBoYXMgYmVlbiBjaGFuZ2VkIGZyb20KICAgICAgICAgIGludCAoKmNiKSgpCiAgICAgaW50bwogICAgICAgICAgaW50ICgqY2IpKFg1MDlfU1RPUkVfQ1RYICosdm9pZCAqKTsKICAgICBpbiBzc2xfdmVyaWZ5X2NlcnRfY2hhaW4gKHNzbC9zc2xfY2VydC5jKSwgdGhlIGNhbGwKICAgICAgICAgIGk9cy0+Y3R4LT5hcHBfdmVyaWZ5X2NhbGxiYWNrKCZjdHgpCiAgICAgaGFzIGJlZW4gY2hhbmdlZCBpbnRvCiAgICAgICAgICBpPXMtPmN0eC0+YXBwX3ZlcmlmeV9jYWxsYmFjaygmY3R4LCBzLT5jdHgtPmFwcF92ZXJpZnlfYXJnKS4KCiAgICAgVG8gdXBkYXRlIGFwcGxpY2F0aW9ucyB1c2luZyBTU0xfQ1RYX3NldF9jZXJ0X3ZlcmlmeV9jYWxsYmFjaygpLAogICAgIGEgZHVtbXkgYXJndW1lbnQgY2FuIGJlIGFkZGVkIHRvIHRoZWlyIGNhbGxiYWNrIGZ1bmN0aW9ucy4KICAgICBbRC4gSy4gU21ldHRlcnMgPHNtZXR0ZXJzQHBhcmMueGVyb3guY29tPl0KCiAgKikgQWRkZWQgdGhlICc0NzU4Y2NhJyBFTkdJTkUgdG8gc3VwcG9ydCBJQk0gNDc1OCBjYXJkcy4KICAgICBbTWF1cmljZSBHaXR0ZW5zIDxtYXVyaWNlQGdpdHRlbnMubmw+LCB0b3VjaHVwcyBieSBHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhbmQgT1BFTlNTTF9MT0FEX0NPTkYgZGVmaW5lIHdoaWNoIHdpbGwgY2F1c2UKICAgICBPcGVuU1NMX2FkZF9hbGxfYWxnb3JpdGhtcygpIHRvIGxvYWQgdGhlIG9wZW5zc2wuY25mIGNvbmZpZyBmaWxlLgogICAgIFRoaXMgYWxsb3dzIG9sZGVyIGFwcGxpY2F0aW9ucyB0byB0cmFuc3BhcmVudGx5IHN1cHBvcnQgY2VydGFpbgogICAgIE9wZW5TU0wgZmVhdHVyZXM6IHN1Y2ggYXMgY3J5cHRvIGFjY2VsZXJhdGlvbiBhbmQgZHluYW1pYyBFTkdJTkUgbG9hZGluZy4KICAgICBUd28gbmV3IGZ1bmN0aW9ucyBPUEVOU1NMX2FkZF9hbGxfYWxnb3JpdGhtc19ub2NvbmYoKSB3aGljaCB3aWxsIG5ldmVyCiAgICAgbG9hZCB0aGUgY29uZmlnIGZpbGUgYW5kIE9QRU5TU0xfYWRkX2FsbF9hbGdvcml0aG1zX2NvbmYoKSB3aGljaCB3aWxsCiAgICAgYWx3YXlzIGxvYWQgaXQgaGF2ZSBhbHNvIGJlZW4gYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRoZSBPRkIsIENGQiBhbmQgQ1RSIChhbGwgd2l0aCAxMjggYml0IGZlZWRiYWNrKSB0byBBRVMuCiAgICAgQWRqdXN0IE5JRHMgYW5kIEVWUCBsYXllci4KICAgICBbU3RlcGhlbiBTcHJ1bmsgPHN0ZXBoZW5Ac3BydW5rLm9yZz4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29uZmlnIG1vZHVsZXMgc3VwcG9ydCBpbiBvcGVuc3NsIHV0aWxpdHkuCgogICAgIE1vc3QgY29tbWFuZHMgbm93IGxvYWQgbW9kdWxlcyBmcm9tIHRoZSBjb25maWcgZmlsZSwKICAgICB0aG91Z2ggaW4gYSBmZXcgKHN1Y2ggYXMgdmVyc2lvbikgdGhpcyBpc24ndCBkb25lIAogICAgIGJlY2F1c2UgaXQgY291bGRuJ3QgYmUgdXNlZCBmb3IgYW55dGhpbmcuCgogICAgIEluIHRoZSBjYXNlIG9mIGNhIGFuZCByZXEgdGhlIGNvbmZpZyBmaWxlIHVzZWQgaXMKICAgICB0aGUgc2FtZSBhcyB0aGUgdXRpbGl0eSBpdHNlbGY6IHRoYXQgaXMgdGhlIC1jb25maWcKICAgICBjb21tYW5kIGxpbmUgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4KICAgICBhbHRlcm5hdGl2ZSBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgZGVmYXVsdCBiZWhhdmlvdXIgZnJvbSBPUEVOU1NMX2NvbmZpZygpLiBJZiBhcHBuYW1lIGlzIE5VTEwKICAgICB1c2UgIm9wZW5zc2xfY29uZiIgaWYgZmlsZW5hbWUgaXMgTlVMTCB1c2UgZGVmYXVsdCBvcGVuc3NsIGNvbmZpZyBmaWxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhbiBhcmd1bWVudCB0byBPUEVOU1NMX2NvbmZpZygpIHRvIGFsbG93IHRoZSB1c2Ugb2YgYW4gYWx0ZXJuYXRpdmUKICAgICBjb25maWcgc2VjdGlvbiBuYW1lLiBBZGQgYSBuZXcgZmxhZyB0byB0b2xlcmF0ZSBhIG1pc3NpbmcgY29uZmlnIGZpbGUKICAgICBhbmQgbW92ZSBjb2RlIHRvIENPTkZfbW9kdWxlc19sb2FkX2ZpbGUoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciBjcnlwdG8gYWNjZWxlcmF0b3IgY2FyZHMgZnJvbSBBY2NlbGVyYXRlZCBFbmNyeXB0aW9uCiAgICAgUHJvY2Vzc2luZywgd3d3LmFlcC5pZS4gIChVc2UgZW5naW5lICdhZXAnKQogICAgIFRoZSBzdXBwb3J0IHdhcyBjb3BpZWQgZnJvbSAwLjkuNmMgW2VuZ2luZV0gYW5kIGFkYXB0ZWQvY29ycmVjdGVkCiAgICAgdG8gd29yayB3aXRoIHRoZSBuZXcgZW5naW5lIGZyYW1ld29yay4KICAgICBbQUVQIEluYy4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgU3VwcG9ydCBmb3IgU3VyZVdhcmUgY3J5cHRvIGFjY2VsZXJhdG9yIGNhcmRzIGZyb20gQmFsdGltb3JlCiAgICAgVGVjaG5vbG9naWVzLiAgKFVzZSBlbmdpbmUgJ3N1cmV3YXJlJykKICAgICBUaGUgc3VwcG9ydCB3YXMgY29waWVkIGZyb20gMC45LjZjIFtlbmdpbmVdIGFuZCBhZGFwdGVkCiAgICAgdG8gd29yayB3aXRoIHRoZSBuZXcgZW5naW5lIGZyYW1ld29yay4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBIYXZlIHRoZSBDSElMIGVuZ2luZSBmb3JrLXNhZmUgKGFzIGRlZmluZWQgYnkgbkNpcGhlcikgYW5kIGFjdHVhbGx5CiAgICAgbWFrZSB0aGUgbmV3ZXIgRU5HSU5FIGZyYW1ld29yayBjb21tYW5kcyBmb3IgdGhlIENISUwgZW5naW5lIHdvcmsuCiAgICAgW1Rvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHByb2R1Y2Ugc2hhcmVkIGxpYnJhcmllcyBvbiBSZWxpYW50VU5JWC4KICAgICBbUm9iZXJ0IERhaGxlbSA8Um9iZXJ0LkRhaGxlbUBmZm0yLnNpZW1lbnMuZGU+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgY29uZmlndXJhdGlvbiB0YXJnZXQgZGVidWctbGludXgtcHByby4KICAgICBNYWtlICdvcGVuc3NsIHJzYScgdXNlIHRoZSBnZW5lcmFsIGtleSBsb2FkaW5nIHJvdXRpbmVzCiAgICAgaW1wbGVtZW50ZWQgaW4gYXBwcy5jLCBhbmQgbWFrZSB0aG9zZSByb3V0aW5lcyBhYmxlIHRvCiAgICAgaGFuZGxlIHRoZSBrZXkgZm9ybWF0IEZPUk1BVF9ORVRTQ0FQRSBhbmQgdGhlIHZhcmlhbnQKICAgICBGT1JNQVRfSUlTU0dDLgogICAgIFtUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAqKSBGaXggYSBjcmFzaGJ1ZyBhbmQgYSBsb2dpYyBidWcgaW4gaHdjcmhrX2xvYWRfcHVia2V5KCkuCiAgICAgW1Rvb21hcyBLaWlzayA8dml4QGN5YmVyLmVlPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgLWtleWZvcm0gdG8gcnNhdXRsLCBhbmQgZG9jdW1lbnQgLWVuZ2luZS4KICAgICBbUmljaGFyZCBMZXZpdHRlLCBpbnNwaXJlZCBieSBUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT5dCgogICopIENoYW5nZSBCSU9fbmV3X2ZpbGUgKGNyeXB0by9iaW8vYnNzX2ZpbGUuYykgdG8gdXNlIG5ldwogICAgIEJJT19SX05PX1NVQ0hfRklMRSBlcnJvciBjb2RlIHJhdGhlciB0aGFuIHRoZSBnZW5lcmljCiAgICAgRVJSX1JfU1lTX0xJQiBlcnJvciBjb2RlIGlmIGZvcGVuKCkgZmFpbHMgd2l0aCBFTk9FTlQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBuZXcgZnVuY3Rpb25zCiAgICAgICAgICBFUlJfcGVla19sYXN0X2Vycm9yCiAgICAgICAgICBFUlJfcGVla19sYXN0X2Vycm9yX2xpbmUKICAgICAgICAgIEVSUl9wZWVrX2xhc3RfZXJyb3JfbGluZV9kYXRhLgogICAgIFRoZXNlIGFyZSBzaW1pbGFyIHRvCiAgICAgICAgICBFUlJfcGVla19lcnJvcgogICAgICAgICAgRVJSX3BlZWtfZXJyb3JfbGluZQogICAgICAgICAgRVJSX3BlZWtfZXJyb3JfbGluZV9kYXRhLAogICAgIGJ1dCByZXBvcnQgb24gdGhlIGxhdGVzdCBlcnJvciByZWNvcmRlZCByYXRoZXIgdGhhbiB0aGUgZmlyc3Qgb25lCiAgICAgc3RpbGwgaW4gdGhlIGVycm9yIHF1ZXVlLgogICAgIFtCZW4gTGF1cmllLCBCb2RvIE1vZWxsZXJdCiAgICAgICAgCiAgKikgZGVmYXVsdF9hbGdvcml0aG1zIG9wdGlvbiBpbiBFTkdJTkUgY29uZmlnIG1vZHVsZS4gVGhpcyBhbGxvd3MgdGhpbmdzCiAgICAgbGlrZToKICAgICBkZWZhdWx0X2FsZ29yaXRobXMgPSBBTEwKICAgICBkZWZhdWx0X2FsZ29yaXRobXMgPSBSU0EsIERTQSwgUkFORCwgQ0lQSEVSUywgRElHRVNUUwogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFByZWxtaW5hcnkgRU5HSU5FIGNvbmZpZyBtb2R1bGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGV4cGVyaW1lbnRhbCBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSBBRVMgY29kZSB0byBmb2xsb3cgdGhlIHNhbWUgbmFtZSBzdHJ1Y3R1cmUgYXMgYWxsIG90aGVyCiAgICAgc3ltbWV0cmljIGNpcGhlcnMsIGFuZCBiZWhhdmUgdGhlIHNhbWUgd2F5LiAgTW92ZSBldmVyeXRoaW5nIHRvCiAgICAgdGhlIGRpcmVjdG9yeSBjcnlwdG8vYWVzLCB0aGVyZWJ5IG9ic29sZXRpbmcgY3J5cHRvL3Jpam5kYWVsLgogICAgIFtTdGVwaGVuIFNwcnVuayA8c3RlcGhlbkBzcHJ1bmsub3JnPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBTRUNVUklUWTogcmVtb3ZlIHVuc2FmZSBzZXRqbXAvc2lnbmFsIGludGVyYWN0aW9uIGZyb20gdWlfb3BlbnNzbC5jLgogICAgIFtCZW4gTGF1cmllIGFuZCBUaGVvIGRlIFJhYWR0XQoKICAqKSBBZGQgb3B0aW9uIHRvIG91dHB1dCBwdWJsaWMga2V5cyBpbiByZXEgY29tbWFuZC4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgbWFkd29sZkBvcGVuY2Eub3JnXQoKICAqKSBVc2Ugd05BRnMgaW4gRUNfUE9JTlRzX211bCgpIGZvciBpbXByb3ZlZCBlZmZpY2llbmN5CiAgICAgKHVwIHRvIGFib3V0IDEwJSBiZXR0ZXIgdGhhbiBiZWZvcmUgZm9yIFAtMTkyIGFuZCBQLTIyNCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9ucy9tYWNyb3MKCiAgICAgICAgICBTU0xfQ1RYX3NldF9tc2dfY2FsbGJhY2soY3R4LCBjYikKICAgICAgICAgIFNTTF9DVFhfc2V0X21zZ19jYWxsYmFja19hcmcoY3R4LCBhcmcpCiAgICAgICAgICBTU0xfc2V0X21zZ19jYWxsYmFjayhzc2wsIGNiKQogICAgICAgICAgU1NMX3NldF9tc2dfY2FsbGJhY2tfYXJnKHNzbCwgYXJnKQoKICAgICB0byByZXF1ZXN0IGNhbGxpbmcgYSBjYWxsYmFjayBmdW5jdGlvbgoKICAgICAgICAgIHZvaWQgY2IoaW50IHdyaXRlX3AsIGludCB2ZXJzaW9uLCBpbnQgY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sIFNTTCAqc3NsLCB2b2lkICphcmcpCgogICAgIHdoZW5ldmVyIGEgcHJvdG9jb2wgbWVzc2FnZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlY2VpdmVkCiAgICAgKHdyaXRlX3AgPT0gMCkgb3Igc2VudCAod3JpdGVfcCA9PSAxKS4gIEhlcmUgJ3ZlcnNpb24nIGlzIHRoZQogICAgIHByb3RvY29sIHZlcnNpb24gIGFjY29yZGluZyB0byB3aGljaCB0aGUgU1NMIGxpYnJhcnkgaW50ZXJwcmV0cwogICAgIHRoZSBjdXJyZW50IHByb3RvY29sIG1lc3NhZ2UgKFNTTDJfVkVSU0lPTiwgU1NMM19WRVJTSU9OLCBvcgogICAgIFRMUzFfVkVSU0lPTikuICAnY29udGVudF90eXBlJyBpcyAwIGluIHRoZSBjYXNlIG9mIFNTTCAyLjAsIG9yCiAgICAgdGhlIGNvbnRlbnQgdHlwZSBhcyBkZWZpbmVkIGluIHRoZSBTU0wgMy4wL1RMUyAxLjAgcHJvdG9jb2wKICAgICBzcGVjaWZpY2F0aW9uIChjaGFuZ2VfY2lwaGVyX3NwZWMoMjApLCBhbGVydCgyMSksIGhhbmRzaGFrZSgyMikpLgogICAgICdidWYnIGFuZCAnbGVuJyBwb2ludCB0byB0aGUgYWN0dWFsIG1lc3NhZ2UsICdzc2wnIHRvIHRoZQogICAgIFNTTCBvYmplY3QsIGFuZCAnYXJnJyBpcyB0aGUgYXBwbGljYXRpb24tZGVmaW5lZCB2YWx1ZSBzZXQgYnkKICAgICBTU0xbX0NUWF1fc2V0X21zZ19jYWxsYmFja19hcmcoKS4KCiAgICAgJ29wZW5zc2wgc19jbGllbnQnIGFuZCAnb3BlbnNzbCBzX3NlcnZlcicgaGF2ZSBuZXcgJy1tc2cnIG9wdGlvbnMKICAgICB0byBlbmFibGUgYSBjYWxsYmFjayB0aGF0IGRpc3BsYXlzIGFsbCBwcm90b2NvbCBtZXNzYWdlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgdGhlIHNoYXJlZCBsaWJyYXJ5IHN1cHBvcnQgc28gc2hhcmVkIGxpYnJhcmllcyBhcmUgYnVpbHQgYXMKICAgICBzb29uIGFzIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyBsaWJyYXJ5IGlzIGZpbmlzaGVkLCBhbmQgdGhlcmVieSBnZXQKICAgICBvcGVuc3NsIGFuZCB0aGUgdGVzdCBwcm9ncmFtcyBsaW5rZWQgYWdhaW5zdCB0aGUgc2hhcmVkIGxpYnJhcnkuCiAgICAgVGhpcyBzdGlsbCBvbmx5IGhhcHBlbnMgd2hlbiB0aGUga2V5d29yZCAic2hhcmQiIGhhcyBiZWVuIGdpdmVuIHRvCiAgICAgdGhlIGNvbmZpZ3VyYXRpb24gc2NyaXB0cy4KCiAgICAgTk9URTogc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBpcyBzdGlsbCBhbiBleHBlcmltZW50YWwgdGhpbmcsIGFuZAogICAgIGJhY2t3YXJkIGJpbmFyeSBjb21wYXRpYmlsaXR5IGlzIHN0aWxsIG5vdCBndWFyYW50ZWVkLgogICAgIFsiTWFjaWVqIFcuIFJvenlja2kiIDxtYWNyb0BkczIucGcuZ2RhLnBsPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgU3ViamVjdCBJbmZvcm1hdGlvbiBBY2Nlc3MgZXh0ZW5zaW9uLgogICAgIFtQZXRlciBTeWx2ZXN0ZXIgPFBldGVyLlN5bHZlc3RlckBFZGVsV2ViLmZyPl0KCiAgKikgTWFrZSBCVUZfTUVNX2dyb3coKSBiZWhhdmlvdXIgbW9yZSBjb25zaXN0ZW50OiBJbml0aWFsaXNlIHRvIHplcm8KICAgICBhZGRpdGlvbmFsIGJ5dGVzIHdoZW4gbmV3IG1lbW9yeSBoYWQgdG8gYmUgYWxsb2NhdGVkLCBub3QganVzdAogICAgIHdoZW4gcmV1c2luZyBhbiBleGlzdGluZyBidWZmZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGNvbW1hbmQgbGluZSBhbmQgY29uZmlndXJhdGlvbiBvcHRpb24gJ3V0ZjgnIGZvciB0aGUgcmVxIGNvbW1hbmQuCiAgICAgVGhpcyBhbGxvd3MgZmllbGQgdmFsdWVzIHRvIGJlIHNwZWNpZmllZCBhcyBVVEY4IHN0cmluZ3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIC1tdWx0aSBhbmQgLW1yIG9wdGlvbnMgdG8gIm9wZW5zc2wgc3BlZWQiIC0gZ2l2aW5nIG11bHRpcGxlIHBhcmFsbGVsCiAgICAgcnVucyBmb3IgdGhlIGZvcm1lciBhbmQgbWFjaGluZS1yZWFkYWJsZSBvdXRwdXQgZm9yIHRoZSBsYXR0ZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCAnLW5vZW1haWxETicgb3B0aW9uIHRvICdvcGVuc3NsIGNhJy4gIFRoaXMgcHJldmVudHMgaW5jbHVzaW9uCiAgICAgb2YgdGhlIGUtbWFpbCBhZGRyZXNzIGluIHRoZSBETiAoaS5lLiwgaXQgd2lsbCBnbyBpbnRvIGEgY2VydGlmaWNhdGUKICAgICBleHRlbnNpb24gb25seSkuICBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZSBvcHRpb24gJ2VtYWlsX2luX2RuID0gbm8nCiAgICAgaGFzIHRoZSBzYW1lIGVmZmVjdC4KICAgICBbTWFzc2ltaWxpYW5vIFBhbGEgbWFkd29sZkBvcGVuY2Eub3JnXQoKICAqKSBDaGFuZ2UgYWxsIGZ1bmN0aW9ucyB3aXRoIG5hbWVzIHN0YXJ0aW5nIHdpdGggZGVzXyB0byBiZSBzdGFydGluZwogICAgIHdpdGggREVTXyBpbnN0ZWFkLiAgQWRkIHdyYXBwZXJzIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aCBsaWJkZXMsCiAgICAgYnV0IGFyZSBuYW1lZCBfb3NzbF9vbGRfZGVzXyouICBGaW5hbGx5LCBhZGQgbWFjcm9zIHRoYXQgbWFwIHRoZQogICAgIGRlc18qIHN5bWJvbHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgX29zc2xfb2xkX2Rlc18qIGlmIGxpYmRlcwogICAgIGNvbXBhdGliaWxpdHkgaXMgZGVzaXJlZC4gIElmIE9wZW5TU0wgMC45LjZjIGNvbXBhdGliaWxpdHkgaXMKICAgICBkZXNpcmVkLCB0aGUgZGVzXyogc3ltYm9scyB3aWxsIGJlIG1hcHBlZCB0byBERVNfKiwgd2l0aCBvbmUKICAgICBleGNlcHRpb24uCgogICAgIFNpbmNlIHdlIHByb3ZpZGUgdHdvIGNvbXBhdGliaWxpdHkgbWFwcGluZ3MsIHRoZSB1c2VyIG5lZWRzIHRvCiAgICAgZGVmaW5lIHRoZSBtYWNybyBPUEVOU1NMX0RFU19MSUJERVNfQ09NUEFUSUJJTElUWSBpZiBsaWJkZXMKICAgICBjb21wYXRpYmlsaXR5IGlzIGRlc2lyZWQuICBUaGUgZGVmYXVsdCAoaS5lLiwgd2hlbiB0aGF0IG1hY3JvCiAgICAgaXNuJ3QgZGVmaW5lZCkgaXMgT3BlblNTTCAwLjkuNmMgY29tcGF0aWJpbGl0eS4KCiAgICAgVGhlcmUgYXJlIGFsc28gbWFjcm9zIHRoYXQgZW5hYmxlIGFuZCBkaXNhYmxlIHRoZSBzdXBwb3J0IG9mIG9sZAogICAgIGRlcyBmdW5jdGlvbnMgYWx0b2dldGhlci4gIFRob3NlIGFyZSBPUEVOU1NMX0VOQUJMRV9PTERfREVTX1NVUFBPUlQKICAgICBhbmQgT1BFTlNTTF9ESVNBQkxFX09MRF9ERVNfU1VQUE9SVC4gIElmIG5vbmUgb3IgYm90aCBvZiB0aG9zZQogICAgIGFyZSBkZWZpbmVkLCB0aGUgZGVmYXVsdCB3aWxsIGFwcGx5OiB0byBzdXBwb3J0IHRoZSBvbGQgZGVzIHJvdXRpbmVzLgoKICAgICBJbiBlaXRoZXIgY2FzZSwgb25lIG11c3QgaW5jbHVkZSBvcGVuc3NsL2Rlcy5oIHRvIGdldCB0aGUgY29ycmVjdAogICAgIGRlZmluaXRpb25zLiAgRG8gbm90IHRyeSB0byBqdXN0IGluY2x1ZGUgb3BlbnNzbC9kZXNfb2xkLmgsIHRoYXQKICAgICB3b24ndCB3b3JrLgoKICAgICBOT1RFOiBUaGlzIGlzIGEgbWFqb3IgYnJlYWsgb2YgYW4gb2xkIEFQSSBpbnRvIGEgbmV3IG9uZS4gIFNvZnR3YXJlCiAgICAgYXV0aG9ycyBhcmUgZW5jb3VyYWdlZCB0byBzd2l0Y2ggdG8gdGhlIERFU18gc3R5bGUgZnVuY3Rpb25zLiAgU29tZQogICAgIHRpbWUgaW4gdGhlIGZ1dHVyZSwgZGVzX29sZC5oIGFuZCB0aGUgbGliZGVzIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zCiAgICAgd2lsbCBiZSBkaXNhYmxlIChpLmUuIE9QRU5TU0xfRElTQUJMRV9PTERfREVTX1NVUFBPUlQgd2lsbCBiZSB0aGUKICAgICBkZWZhdWx0KSwgYW5kIHRoZW4gY29tcGxldGVseSByZW1vdmVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIFRlc3QgZm9yIGNlcnRpZmljYXRlcyB3aGljaCBjb250YWluIHVuc3VwcG9ydGVkIGNyaXRpY2FsIGV4dGVuc2lvbnMuCiAgICAgSWYgc3VjaCBhIGNlcnRpZmljYXRlIGlzIGZvdW5kIGR1cmluZyBhIHZlcmlmeSBvcGVyYXRpb24gaXQgaXMgCiAgICAgcmVqZWN0ZWQgYnkgZGVmYXVsdDogdGhpcyBiZWhhdmlvdXIgY2FuIGJlIG92ZXJyaWRkZW4gYnkgZWl0aGVyCiAgICAgaGFuZGxpbmcgdGhlIG5ldyBlcnJvciBYNTA5X1ZfRVJSX1VOSEFORExFRF9DUklUSUNBTF9FWFRFTlNJT04gb3IKICAgICBieSBzZXR0aW5nIHRoZSB2ZXJpZnkgZmxhZyBYNTA5X1ZfRkxBR19JR05PUkVfQ1JJVElDQUwuIEEgbmV3IGZ1bmN0aW9uCiAgICAgWDUwOV9zdXBwb3J0ZWRfZXh0ZW5zaW9uKCkgaGFzIGFsc28gYmVlbiBhZGRlZCB3aGljaCByZXR1cm5zIDEgaWYgYQogICAgIHBhcnRpY3VsYXIgZXh0ZW5zaW9uIGlzIHN1cHBvcnRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlIGJlaGF2aW91ciBvZiBFVlAgY2lwaGVyIGZ1bmN0aW9ucyBpbiBzaW1pbGFyIHdheSB0byBkaWdlc3RzCiAgICAgdG8gcmV0YWluIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgYmVoYXZpb3VyIG9mIEVWUF9EaWdlc3RJbml0KCkgYW5kIEVWUF9EaWdlc3RGaW5hbCgpIHRvIHJldGFpbgogICAgIGNvbXBhdGliaWxpdHkgd2l0aCBleGlzdGluZyBjb2RlLiBJbiBwYXJ0aWN1bGFyIHRoZSAnY3R4JyBwYXJhbWV0ZXIgZG9lcwogICAgIG5vdCBoYXZlIHRvIGJlIHRvIGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgY2FsbCB0byBFVlBfRGlnZXN0SW5pdCgpIGFuZAogICAgIGl0IGlzIHRpZGllZCB1cCBhZnRlciBhIGNhbGwgdG8gRVZQX0RpZ2VzdEZpbmFsKCkuIE5ldyBmdW5jdGlvbgogICAgIEVWUF9EaWdlc3RGaW5hbF9leCgpIHdoaWNoIGRvZXMgbm90IHRpZHkgdXAgdGhlIGN0eC4gU2ltaWxhcmx5IGZ1bmN0aW9uCiAgICAgRVZQX01EX0NUWF9jb3B5KCkgY2hhbmdlZCB0byBub3QgcmVxdWlyZSB0aGUgZGVzdGluYXRpb24gdG8gYmUKICAgICBpbml0aWFsaXplZCB2YWxpZCBhbmQgbmV3IGZ1bmN0aW9uIEVWUF9NRF9DVFhfY29weV9leCgpIGFkZGVkIHdoaWNoCiAgICAgcmVxdWlyZXMgdGhlIGRlc3RpbmF0aW9uIHRvIGJlIHZhbGlkLgoKICAgICBNb2RpZnkgYWxsIHRoZSBPcGVuU1NMIGRpZ2VzdCBjYWxscyB0byB1c2UgRVZQX0RpZ2VzdEluaXRfZXgoKSwKICAgICBFVlBfRGlnZXN0RmluYWxfZXgoKSBhbmQgRVZQX01EX0NUWF9jb3B5X2V4KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHNzbDNfZ2V0X21lc3NhZ2UgKHNzbC9zM19ib3RoLmMpIGFuZCB0aGUgZnVuY3Rpb25zIHVzaW5nIGl0CiAgICAgc28gdGhhdCBjb21wbGV0ZSAnSGFuZHNoYWtlJyBwcm90b2NvbCBzdHJ1Y3R1cmVzIGFyZSBrZXB0IGluIG1lbW9yeQogICAgIGluc3RlYWQgb2Ygb3ZlcndyaXRpbmcgJ21zZ190eXBlJyBhbmQgJ2xlbmd0aCcgd2l0aCAnYm9keScgZGF0YS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgYW4gaW1wbGVtZW50YXRpb24gb2YgU1NMX2FkZF9kaXJfY2VydF9zdWJqZWN0c190b19zdGFjayBmb3IgV2luMzIuCiAgICAgW01hc3NpbW8gU2FudGluIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIE1ham9yIHJlc3RydWN0dXJpbmcgdG8gdGhlIHVuZGVybHlpbmcgRU5HSU5FIGNvZGUuIFRoaXMgaW5jbHVkZXMKICAgICByZWR1Y3Rpb24gb2YgbGlua2VyIGJsb2F0LCBzZXBhcmF0aW9uIG9mIHB1cmUgIkVOR0lORSIgbWFuaXB1bGF0aW9uCiAgICAgKGluaXRpYWxpc2F0aW9uLCBldGMpIGZyb20gZnVuY3Rpb25hbGl0eSBkZWFsaW5nIHdpdGggaW1wbGVtZW50YXRpb25zCiAgICAgb2Ygc3BlY2lmaWMgY3J5cHRvIGl0ZXJmYWNlcy4gVGhpcyBjaGFuZ2UgYWxzbyBpbnRyb2R1Y2VzIGludGVncmF0ZWQKICAgICBzdXBwb3J0IGZvciBzeW1tZXRyaWMgY2lwaGVycyBhbmQgZGlnZXN0IGltcGxlbWVudGF0aW9ucyAtIHNvIEVOR0lORXMKICAgICBjYW4gbm93IGFjY2VsZXJhdGUgdGhlc2UgYnkgcHJvdmlkaW5nIEVWUF9DSVBIRVIgYW5kIEVWUF9NRAogICAgIGltcGxlbWVudGF0aW9ucyBvZiB0aGVpciBvd24uIFRoaXMgaXMgZGV0YWlsZWQgaW4gY3J5cHRvL2VuZ2luZS9SRUFETUUKICAgICBhcyBpdCBjb3VsZG4ndCBiZSBhZGVxdWF0ZWx5IGRlc2NyaWJlZCBoZXJlLiBIb3dldmVyLCB0aGVyZSBhcmUgYSBmZXcKICAgICBBUEkgY2hhbmdlcyB3b3J0aCBub3RpbmcgLSBzb21lIFJTQSwgRFNBLCBESCwgYW5kIFJBTkQgZnVuY3Rpb25zIHRoYXQKICAgICB3ZXJlIGNoYW5nZWQgaW4gdGhlIG9yaWdpbmFsIGludHJvZHVjdGlvbiBvZiBFTkdJTkUgY29kZSBoYXZlIG5vdwogICAgIHJldmVydGVkIGJhY2sgLSB0aGUgaG9va2luZyBmcm9tIHRoaXMgY29kZSB0byBFTkdJTkUgaXMgbm93IGEgZ29vZAogICAgIGRlYWwgbW9yZSBwYXNzaXZlIGFuZCBhdCBydW4tdGltZSwgb3BlcmF0aW9ucyBkZWFsIGRpcmVjdGx5IHdpdGgKICAgICBSU0FfTUVUSE9EcywgRFNBX01FVEhPRHMgKGV0YykgYXMgdGhleSBkaWQgYmVmb3JlLCByYXRoZXIgdGhhbgogICAgIGRlcmVmZXJlbmNpbmcgdGhyb3VnaCBhbiBFTkdJTkUgcG9pbnRlciBhbnkgbW9yZS4gQWxzbywgdGhlIEVOR0lORQogICAgIGZ1bmN0aW9ucyBkZWFsaW5nIHdpdGggQk5fTU9EX0VYUFtfQ1JUXSBoYW5kbGVycyBoYXZlIGJlZW4gcmVtb3ZlZCAtCiAgICAgdGhleSB3ZXJlIG5vdCBiZWluZyB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgYXMgdGhlcmUgaXMgbm8gY29uY2VwdCBvZiBhCiAgICAgQklHTlVNX01FVEhPRCBhbmQgdGhleSBjb3VsZCBub3QgYmUgZ2VuZXJhbGlzZWQgdG8gdGhlIG5ldwogICAgICdFTkdJTkVfVEFCTEUnIG1lY2hhbmlzbSB0aGF0IHVuZGVybGllcyB0aGUgbmV3IGNvZGUuIFNpbWlsYXJseSwKICAgICBFTkdJTkVfY3B5KCkgaGFzIGJlZW4gcmVtb3ZlZCBhcyBpdCBjYW5ub3QgYmUgY29uc2lzdGVudGx5IGRlZmluZWQgaW4KICAgICB0aGUgbmV3IGNvZGUuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQ2hhbmdlIEFTTjFfR0VORVJBTElaRURUSU1FX2NoZWNrKCkgdG8gYWxsb3cgZnJhY3Rpb25hbCBzZWNvbmRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSBta2RlZi5wbCB0byBzb3J0IHN5bWJvbHMgdGhhdCBnZXQgdGhlIHNhbWUgZW50cnkgbnVtYmVyLAogICAgIGFuZCBtYWtlIHN1cmUgdGhlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZ1bmN0aW9ucyBFUlJfbG9hZF8qCiAgICAgYmVjb21lIHBhcnQgb2YgbGliZWF5Lm51bSBhcyB3ZWxsLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbiBTU0xfcmVuZWdvdGlhdGVfcGVuZGluZygpLiAgVGhpcyByZXR1cm5zIHRydWUgb25jZQogICAgIHJlbmVnb3RpYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkIChlaXRoZXIgU1NMX3JlbmVnb3RpYXRlKCkgY2FsbAogICAgIG9yIEhlbGxvUmVxdWVzdC9DbGllbnRIZWxsbyByZWNldmVpdmVkIGZyb20gdGhlIHBlZXIpIGFuZCBiZWNvbWVzCiAgICAgZmFsc2Ugb25jZSBhIGhhbmRzaGFrZSBoYXMgYmVlbiBjb21wbGV0ZWQuCiAgICAgKEZvciBzZXJ2ZXJzLCBTU0xfcmVuZWdvdGlhdGUoKSBmb2xsb3dlZCBieSBTU0xfZG9faGFuZHNoYWtlKCkKICAgICBzZW5kcyBhIEhlbGxvUmVxdWVzdCwgYnV0IGRvZXMgbm90IGVuc3VyZSB0aGF0IGEgaGFuZHNoYWtlIHRha2VzCiAgICAgcGxhY2UuICBTU0xfcmVuZWdvdGlhdGVfcGVuZGluZygpIGlzIHVzZWZ1bCBmb3IgY2hlY2tpbmcgaWYgdGhlCiAgICAgY2xpZW50IGhhcyBmb2xsb3dlZCB0aGUgcmVxdWVzdC4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IFNTTCBvcHRpb24gU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OLgogICAgIEJ5IGRlZmF1bHQsIGNsaWVudHMgbWF5IHJlcXVlc3Qgc2Vzc2lvbiByZXN1bXB0aW9uIGV2ZW4gZHVyaW5nCiAgICAgcmVuZWdvdGlhdGlvbiAoaWYgc2Vzc2lvbiBJRCBjb250ZXh0cyBwZXJtaXQpOyB3aXRoIHRoaXMgb3B0aW9uLAogICAgIHNlc3Npb24gcmVzdW1wdGlvbiBpcyBwb3NzaWJsZSBvbmx5IGluIHRoZSBmaXJzdCBoYW5kc2hha2UuCgogICAgIFNTTF9PUF9BTEwgaXMgbm93IDB4MDAwMDBGRkZMIGluc3RlYWQgb2YgMHgwMDBGRkZGRkwuICBUaGlzIG1ha2VzCiAgICAgbW9yZSBiaXRzIGF2YWlsYWJsZSBmb3Igb3B0aW9ucyB0aGF0IHNob3VsZCBub3QgYmUgcGFydCBvZgogICAgIFNTTF9PUF9BTEwgKHN1Y2ggYXMgU1NMX09QX05PX1NFU1NJT05fUkVTVU1QVElPTl9PTl9SRU5FR09USUFUSU9OKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgc29tZSBkZW1vcyBmb3IgY2VydGlmaWNhdGUgYW5kIGNlcnRpZmljYXRlIHJlcXVlc3QgY3JlYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBtYXhpbXVtIGNlcnRpZmljYXRlIGNoYWluIHNpemUgYWNjZXB0ZWQgZnJvbSB0aGUgcGVlciBhcHBsaWNhdGlvbgogICAgIHNldHRhYmxlIChTU0wqX2dldC9zZXRfbWF4X2NlcnRfbGlzdCgpKSwgYXMgcHJvcG9zZWQgYnkKICAgICAiRG91Z2xhcyBFLiBFbmdlcnQiIDxkZWVuZ2VydEBhbmwuZ292Pi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIHNoYXJlZCBsaWJyYXJpZXMgZm9yIFVuaXh3YXJlLTcKICAgICAoQm95ZCBMeW5uIEdlcmJlciA8Z2VyYmVyYkB6ZW5lei5jb20+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIGEgImRlc3Ryb3kiIGhhbmRsZXIgdG8gRU5HSU5FcyB0aGF0IGFsbG93cyBzdHJ1Y3R1cmFsIGNsZWFudXAgdG8KICAgICBiZSBkb25lIHByaW9yIHRvIGRlc3RydWN0aW9uLiBVc2UgdGhpcyB0byB1bmxvYWQgZXJyb3Igc3RyaW5ncyBmcm9tCiAgICAgRU5HSU5FcyB0aGF0IGxvYWQgdGhlaXIgb3duIGVycm9yIHN0cmluZ3MuIE5COiBUaGlzIGFkZHMgdHdvIG5ldyBBUEkKICAgICBmdW5jdGlvbnMgdG8gImdldCIgYW5kICJzZXQiIHRoaXMgZGVzdHJveSBoYW5kbGVyIGluIGFuIEVOR0lORS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBbHRlciBhbGwgZXhpc3RpbmcgRU5HSU5FIGltcGxlbWVudGF0aW9ucyAoZXhjZXB0ICJvcGVuc3NsIiBhbmQKICAgICAib3BlbmJzZCIpIHRvIGR5bmFtaWNhbGx5IGluc3RhbnRpYXRlIHRoZWlyIG93biBlcnJvciBzdHJpbmdzLiBUaGlzCiAgICAgbWFrZXMgdGhlbSBtb3JlIGZsZXhpYmxlIHRvIGJlIGJ1aWx0IGJvdGggYXMgc3RhdGljYWxseS1saW5rZWQgRU5HSU5FcwogICAgIGFuZCBzZWxmLWNvbnRhaW5lZCBzaGFyZWQtbGlicmFyaWVzIGxvYWRhYmxlIHZpYSB0aGUgImR5bmFtaWMiIEVOR0lORS4KICAgICBBbHNvLCBhZGQgc3R1YiBjb2RlIHRvIGVhY2ggdGhhdCBtYWtlcyBidWlsZGluZyB0aGVtIGFzIHNlbGYtY29udGFpbmVkCiAgICAgc2hhcmVkLWxpYnJhcmllcyBlYXNpZXIgKHNlZSBSRUFETUUuRU5HSU5FKS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBBZGQgYSAiZHluYW1pYyIgRU5HSU5FIHRoYXQgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGJpbmRpbmcgRU5HSU5FCiAgICAgaW1wbGVtZW50YXRpb25zIGludG8gYXBwbGljYXRpb25zIHRoYXQgYXJlIGNvbXBsZXRlbHkgaW1wbGVtZW50ZWQgaW4KICAgICBzZWxmLWNvbnRhaW5lZCBzaGFyZWQtbGlicmFyaWVzLiBUaGUgImR5bmFtaWMiIEVOR0lORSBleHBvc2VzIGNvbnRyb2wKICAgICBjb21tYW5kcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB3aGF0IHNoYXJlZC1saWJyYXJ5IHRvIGxvYWQgYW5kCiAgICAgdG8gY29udHJvbCBhc3BlY3RzIG9mIHRoZSB3YXkgaXQgaXMgaGFuZGxlZC4gQWxzbywgbWFkZSBhbiB1cGRhdGUgdG8KICAgICB0aGUgUkVBRE1FLkVOR0lORSBmaWxlIHRoYXQgYnJpbmdzIGl0cyBpbmZvcm1hdGlvbiB1cC10by1kYXRlIGFuZAogICAgIHByb3ZpZGVzIHNvbWUgaW5mb3JtYXRpb24gYW5kIGluc3RydWN0aW9ucyBvbiB0aGUgImR5bmFtaWMiIEVOR0lORQogICAgIChpZS4gaG93IHRvIHVzZSBpdCwgaG93IHRvIGJ1aWxkICJkeW5hbWljIi1sb2FkYWJsZSBFTkdJTkVzLCBldGMpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIE1ha2UgaXQgcG9zc2libGUgdG8gdW5sb2FkIHJhbmdlcyBvZiBFUlIgc3RyaW5ncyB3aXRoIGEgbmV3CiAgICAgIkVSUl91bmxvYWRfc3RyaW5ncyIgZnVuY3Rpb24uCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGEgY29weSgpIGZ1bmN0aW9uIHRvIEVWUF9NRC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBFVlBfTUQgcm91dGluZXMgdGFrZSBhIGNvbnRleHQgcG9pbnRlciBpbnN0ZWFkIG9mIGp1c3QgdGhlCiAgICAgbWRfZGF0YSB2b2lkIHBvaW50ZXIuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZCBmbGFncyB0byBFVlBfTUQgYW5kIEVWUF9NRF9DVFguIEVWUF9NRF9GTEFHX09ORVNIT1QgaW5kaWNhdGVzCiAgICAgdGhhdCB0aGUgZGlnZXN0IGNhbiBvbmx5IHByb2Nlc3MgYSBzaW5nbGUgY2h1bmsgb2YgZGF0YQogICAgICh0eXBpY2FsbHkgYmVjYXVzZSBpdCBpcyBwcm92aWRlZCBieSBhIHBpZWNlIG9mCiAgICAgaGFyZHdhcmUpLiBFVlBfTURfQ1RYX0ZMQUdfT05FU0hPVCBpbmRpY2F0ZXMgdGhhdCB0aGUgYXBwbGljYXRpb24KICAgICBpcyBvbmx5IGdvaW5nIHRvIHByb3ZpZGUgYSBzaW5nbGUgY2h1bmsgb2YgZGF0YSwgYW5kIGhlbmNlIHRoZQogICAgIGZyYW1ld29yayBuZWVkbid0IGFjY3VtdWxhdGUgdGhlIGRhdGEgZm9yIG9uZXNob3QgZHJpdmVycy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQXMgd2l0aCAiRVJSIiwgbWFrZSBpdCBwb3NzaWJsZSB0byByZXBsYWNlIHRoZSB1bmRlcmx5aW5nICJleF9kYXRhIgogICAgIGZ1bmN0aW9ucy4gVGhpcyBjaGFuZ2UgYWxzbyBhbHRlcnMgdGhlIHN0b3JhZ2UgYW5kIG1hbmFnZW1lbnQgb2YgZ2xvYmFsCiAgICAgZXhfZGF0YSBzdGF0ZSAtIGl0J3Mgbm93IGFsbCBpbnNpZGUgZXhfZGF0YS5jIGFuZCBhbGwgImNsYXNzIiBjb2RlIChlZy4KICAgICBSU0EsIEJJTywgU1NMX0NUWCwgZXRjKSBubyBsb25nZXIgc3RvcmVzIGl0cyBvd24gU1RBQ0tTIGFuZCBwZXItY2xhc3MKICAgICBpbmRleCBjb3VudGVycy4gVGhlIEFQSSBmdW5jdGlvbnMgdGhhdCB1c2UgdGhpcyBzdGF0ZSBoYXZlIGJlZW4gY2hhbmdlZAogICAgIHRvIHRha2UgYSAiY2xhc3NfaW5kZXgiIHJhdGhlciB0aGFuIHBvaW50ZXJzIHRvIHRoZSBjbGFzcydzIGxvY2FsIFNUQUNLCiAgICAgYW5kIGNvdW50ZXIsIGFuZCB0aGVyZSBpcyBub3cgYW4gQVBJIGZ1bmN0aW9uIHRvIGR5bmFtaWNhbGx5IGNyZWF0ZSBuZXcKICAgICBjbGFzc2VzLiBUaGlzIGNlbnRyYWxpc2F0aW9uIGFsbG93cyB1cyB0byAoYSkgcGx1ZyBhIGxvdCBvZiB0aGUKICAgICB0aHJlYWQtc2FmZXR5IHByb2JsZW1zIHRoYXQgZXhpc3RlZCwgYW5kIChiKSBtYWtlcyBpdCBwb3NzaWJsZSB0byBjbGVhbgogICAgIHVwIGFsbCBhbGxvY2F0ZWQgc3RhdGUgdXNpbmcgIkNSWVBUT19jbGVhbnVwX2FsbF9leF9kYXRhKCkiLiBXLnIudC4gKGIpCiAgICAgc3VjaCBkYXRhIHdvdWxkIHByZXZpb3VzbHkgaGF2ZSBhbHdheXMgbGVha2VkIGluIGFwcGxpY2F0aW9uIGNvZGUgYW5kCiAgICAgd29ya2Fyb3VuZHMgd2VyZSBpbiBwbGFjZSB0byBtYWtlIHRoZSBtZW1vcnkgZGVidWdnaW5nIHR1cm4gYSBibGluZCBleWUKICAgICB0byBpdC4gQXBwbGljYXRpb24gY29kZSB0aGF0IGRvZXNuJ3QgdXNlIHRoaXMgbmV3IGZ1bmN0aW9uIHdpbGwgc3RpbGwKICAgICBsZWFrIGFzIGJlZm9yZSwgYnV0IHRoZWlyIG1lbW9yeSBkZWJ1Z2dpbmcgb3V0cHV0IHdpbGwgYW5ub3VuY2UgaXQgbm93CiAgICAgcmF0aGVyIHRoYW4gbGV0dGluZyBpdCBzbGlkZS4KCiAgICAgQmVzaWRlcyB0aGUgYWRkaXRpb24gb2YgQ1JZUFRPX2NsZWFudXBfYWxsX2V4X2RhdGEoKSwgYW5vdGhlciBBUEkgY2hhbmdlCiAgICAgaW5kdWNlZCBieSB0aGUgImV4X2RhdGEiIG92ZXJoYXVsIGlzIHRoYXQgWDUwOV9TVE9SRV9DVFhfaW5pdCgpIG5vdwogICAgIGhhcyBhIHJldHVybiB2YWx1ZSB0byBpbmRpY2F0ZSBzdWNjZXNzIG9yIGZhaWx1cmUuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTWFrZSBpdCBwb3NzaWJsZSB0byByZXBsYWNlIHRoZSB1bmRlcmx5aW5nICJFUlIiIGZ1bmN0aW9ucyBzdWNoIHRoYXQgdGhlCiAgICAgZ2xvYmFsIHN0YXRlICgyIExIQVNIIHRhYmxlcyBhbmQgMiBsb2NrcykgaXMgb25seSB1c2VkIGJ5IHRoZSAiZGVmYXVsdCIKICAgICBpbXBsZW1lbnRhdGlvbi4gVGhpcyBjaGFuZ2UgYWxzbyBhZGRzIHR3byBmdW5jdGlvbnMgdG8gImdldCIgYW5kICJzZXQiCiAgICAgdGhlIGltcGxlbWVudGF0aW9uIHByaW9yIHRvIGl0IGJlaW5nIGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBmaXJzdCB0aW1lCiAgICAgYW55IG90aGVyIEVSUiBmdW5jdGlvbiB0YWtlcyBwbGFjZS4gSWUuIGFuIGFwcGxpY2F0aW9uIGNhbiBjYWxsICJnZXQiLAogICAgIHBhc3MgdGhlIHJldHVybiB2YWx1ZSB0byBhIG1vZHVsZSBpdCBoYXMganVzdCBsb2FkZWQsIGFuZCB0aGF0IG1vZHVsZQogICAgIGNhbiBjYWxsIGl0cyBvd24gInNldCIgZnVuY3Rpb24gdXNpbmcgdGhhdCB2YWx1ZS4gVGhpcyBtZWFucyB0aGUKICAgICBtb2R1bGUncyAiRVJSIiBvcGVyYXRpb25zIHdpbGwgdXNlIChhbmQgbW9kaWZ5KSB0aGUgZXJyb3Igc3RhdGUgaW4gdGhlCiAgICAgYXBwbGljYXRpb24gYW5kIG5vdCBpbiBpdHMgb3duIHN0YXRpY2FsbHkgbGlua2VkIGNvcHkgb2YgT3BlblNTTCBjb2RlLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEdpdmUgREgsIERTQSwgYW5kIFJTQSB0eXBlcyB0aGVpciBvd24gIioqX3VwX3JlZigpIiBmdW5jdGlvbiB0byBpbmNyZW1lbnQKICAgICByZWZlcmVuY2UgY291bnRzLiBUaGlzIHBlcmZvcm1zIG5vcm1hbCBSRUZfUFJJTlQvUkVGX0NIRUNLIG1hY3JvcyBvbgogICAgIHRoZSBvcGVyYXRpb24sIGFuZCBwcm92aWRlcyBhIG1vcmUgZW5jYXBzdWxhdGVkIHdheSBmb3IgZXh0ZXJuYWwgY29kZQogICAgIChjcnlwdG8vZXZwLyBhbmQgc3NsLykgdG8gZG8gdGhpcy4gQWxzbyBjaGFuZ2VkIHRoZSBldnAgYW5kIHNzbCBjb2RlCiAgICAgdG8gdXNlIHRoZXNlIGZ1bmN0aW9ucyByYXRoZXIgdGhhbiBtYW51YWxseSBpbmNyZW1lbnRpbmcgdGhlIGNvdW50cy4KCiAgICAgQWxzbyByZW5hbWUgIkRTT191cCgpIiBmdW5jdGlvbiB0byBtb3JlIGRlc2NyaXB0aXZlICJEU09fdXBfcmVmKCkiLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBFVlAgdGVzdCBwcm9ncmFtLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgc3ltbWV0cmljIGNpcGhlciBzdXBwb3J0IHRvIEVOR0lORS4gRXhwZWN0IHRoZSBBUEkgdG8gY2hhbmdlIQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBOZXcgQ1JMIGZ1bmN0aW9uczogWDUwOV9DUkxfc2V0X3ZlcnNpb24oKSwgWDUwOV9DUkxfc2V0X2lzc3Vlcl9uYW1lKCkKICAgICBYNTA5X0NSTF9zZXRfbGFzdFVwZGF0ZSgpLCBYNTA5X0NSTF9zZXRfbmV4dFVwZGF0ZSgpLCBYNTA5X0NSTF9zb3J0KCksCiAgICAgWDUwOV9SRVZPS0VEX3NldF9zZXJpYWxOdW1iZXIoKSwgYW5kIFg1MDlfUkVWT0tFRF9zZXRfcmV2b2NhdGlvbkRhdGUoKS4KICAgICBUaGVzZSBhbGxvdyBhIENSTCB0byBiZSBidWlsdCB3aXRob3V0IGhhdmluZyB0byBhY2Nlc3MgWDUwOV9DUkwgZmllbGRzCiAgICAgZGlyZWN0bHkuIE1vZGlmeSAnY2EnIGFwcGxpY2F0aW9uIHRvIHVzZSBuZXcgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgU1NMX09QX1RMU19ST0xMQkFDS19CVUcgb3V0IG9mIHRoZSBTU0xfT1BfQUxMIGxpc3Qgb2YgcmVjb21tZW5kZWQKICAgICBidWcgd29ya2Fyb3VuZHMuIFJvbGxiYWNrIGF0dGFjayBkZXRlY3Rpb24gaXMgYSBzZWN1cml0eSBmZWF0dXJlLgogICAgIFRoZSBwcm9ibGVtIHdpbGwgb25seSBhcmlzZSBvbiBPcGVuU1NMIHNlcnZlcnMgd2hlbiBUTFN2MSBpcyBub3QKICAgICBhdmFpbGFibGUgKHNzbHYzX3NlcnZlcl9tZXRob2QoKSBvciBTU0xfT1BfTk9fVExTdjEpLgogICAgIFNvZnR3YXJlIGF1dGhvcnMgbm90IHdhbnRpbmcgdG8gc3VwcG9ydCBUTFN2MSB3aWxsIGhhdmUgc3BlY2lhbCByZWFzb25zCiAgICAgZm9yIHRoZWlyIGNob2ljZSBhbmQgY2FuIGV4cGxpY2l0bHkgZW5hYmxlIHRoaXMgb3B0aW9uLgogICAgIFtCb2RvIE1vZWxsZXIsIEx1dHogSmFlbmlja2VdCgogICopIFJhdGlvbmFsaXNlIEVWUCBzbyBpdCBjYW4gYmUgZXh0ZW5kZWQ6IGRvbid0IGluY2x1ZGUgYSB1bmlvbiBvZgogICAgIGNpcGhlci9kaWdlc3Qgc3RydWN0dXJlcywgYWRkIGluaXQvY2xlYW51cCBmdW5jdGlvbnMgZm9yIEVWUF9NRF9DVFgKICAgICAoc2ltaWxhciB0byB0aG9zZSBleGlzdGluZyBmb3IgRVZQX0NJUEhFUl9DVFgpLgogICAgIFVzYWdlIGV4YW1wbGU6CgogICAgICAgICBFVlBfTURfQ1RYIG1kOwoKICAgICAgICAgRVZQX01EX0NUWF9pbml0KCZtZCk7ICAgICAgICAgICAgIC8qIG5ldyBmdW5jdGlvbiBjYWxsICovCiAgICAgICAgIEVWUF9EaWdlc3RJbml0KCZtZCwgRVZQX3NoYTEoKSk7CiAgICAgICAgIEVWUF9EaWdlc3RVcGRhdGUoJm1kLCBpbiwgbGVuKTsKICAgICAgICAgRVZQX0RpZ2VzdEZpbmFsKCZtZCwgb3V0LCBOVUxMKTsKICAgICAgICAgRVZQX01EX0NUWF9jbGVhbnVwKCZtZCk7ICAgICAgICAgIC8qIG5ldyBmdW5jdGlvbiBjYWxsICovCgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBNYWtlIERFUyBrZXkgc2NoZWR1bGUgY29uZm9ybSB0byB0aGUgdXN1YWwgc2NoZW1lLCBhcyB3ZWxsIGFzCiAgICAgY29ycmVjdGluZyBpdHMgc3RydWN0dXJlLiBUaGlzIG1lYW5zIHRoYXQgY2FsbHMgdG8gREVTIGZ1bmN0aW9ucwogICAgIG5vdyBoYXZlIHRvIHBhc3MgYSBwb2ludGVyIHRvIGEgZGVzX2tleV9zY2hlZHVsZSBpbnN0ZWFkIG9mIGEKICAgICBwbGFpbiBkZXNfa2V5X3NjaGVkdWxlICh3aGljaCB3YXMgYWN0dWFsbHkgYWx3YXlzIGEgcG9pbnRlcgogICAgIGFueXdheSk6IEUuZy4sCgogICAgICAgICBkZXNfa2V5X3NjaGVkdWxlIGtzOwoKCSBkZXNfc2V0X2tleV9jaGVja2VkKC4uLiwgJmtzKTsKCSBkZXNfbmNiY19lbmNyeXB0KC4uLiwgJmtzLCAuLi4pOwoKICAgICAoTm90ZSB0aGF0IGEgbGF0ZXIgY2hhbmdlIHJlbmFtZXMgJ2Rlc18uLi4nIGludG8gJ0RFU18uLi4nLikKICAgICBbQmVuIExhdXJpZV0KCiAgKikgSW5pdGlhbCByZWR1Y3Rpb24gb2YgbGlua2VyIGJsb2F0OiB0aGUgdXNlIG9mIHNvbWUgZnVuY3Rpb25zLCBzdWNoIGFzCiAgICAgUEVNIGNhdXNlcyBsYXJnZSBhbW91bnRzIG9mIHVudXNlZCBmdW5jdGlvbnMgdG8gYmUgbGlua2VkIGluIGR1ZSB0bwogICAgIHBvb3Igb3JnYW5pc2F0aW9uLiBGb3IgZXhhbXBsZSBwZW1fYWxsLmMgY29udGFpbnMgZXZlcnkgUEVNIGZ1bmN0aW9uCiAgICAgd2hpY2ggaGFzIGEga25vY2sgb24gZWZmZWN0IG9mIGxpbmtpbmcgaW4gbGFyZ2UgYW1vdW50cyBvZiAodW51c2VkKQogICAgIEFTTjEgY29kZS4gR3JvdXBpbmcgdG9nZXRoZXIgc2ltaWxhciBmdW5jdGlvbnMgYW5kIHNwbGl0dGluZyB1bnJlbGF0ZWQKICAgICBmdW5jdGlvbnMgcHJldmVudHMgdGhpcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbnVwIG9mIEVWUCBtYWNyb3MuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIENoYW5nZSBoaXN0b3JpY2FsIHJlZmVyZW5jZXMgdG8ge05JRCxTTixMTn1fZGVzX2VkZSBhbmQgZWRlMyB0byBhZGQgdGhlCiAgICAgY29ycmVjdCBfZWNiIHN1ZmZpeC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGluaXRpYWwgT0NTUCByZXNwb25kZXIgc3VwcG9ydCB0byBvY3NwIGFwcGxpY2F0aW9uLiBUaGUKICAgICByZXZvY2F0aW9uIGluZm9ybWF0aW9uIGlzIGhhbmRsZWQgdXNpbmcgdGhlIHRleHQgYmFzZWQgaW5kZXgKICAgICB1c2UgYnkgdGhlIGNhIGFwcGxpY2F0aW9uLiBUaGUgcmVzcG9uZGVyIGNhbiBlaXRoZXIgaGFuZGxlCiAgICAgcmVxdWVzdHMgZ2VuZXJhdGVkIGludGVybmFsbHksIHN1cHBsaWVkIGluIGZpbGVzIChmb3IgZXhhbXBsZQogICAgIHZpYSBhIENHSSBzY3JpcHQpIG9yIHVzaW5nIGFuIGludGVybmFsIG1pbmltYWwgc2VydmVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjb25maWd1cmF0aW9uIGNob2ljZXMgdG8gZ2V0IHpsaWIgY29tcHJlc3Npb24gZm9yIFRMUy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2VzIHRvIEtlcmJlcm9zIFNTTCBmb3IgUkZDIDI3MTIgY29tcGxpYW5jZToKICAgICAxLiAgSW1wbGVtZW50ZWQgcmVhbCBLZXJiZXJvc1dyYXBwZXIsIGluc3RlYWQgb2YganVzdCB1c2luZwogICAgICAgICBLUkI1IEFQX1JFUSBtZXNzYWdlLiAgW1RoYW5rcyB0byBTaW1vbiBXaWxraW5zb24gPHN4d0BzeHcub3JnLnVrPl0KICAgICAyLiAgSW1wbGVtZW50ZWQgb3B0aW9uYWwgYXV0aGVudGljYXRvciBmaWVsZCBvZiBLZXJiZXJvc1dyYXBwZXIuCgogICAgIEFkZGVkIG9wZW5zc2wtc3R5bGUgQVNOLjEgbWFjcm9zIGZvciBLZXJiZXJvcyB0aWNrZXQsIGFwX3JlcSwKICAgICBhbmQgYXV0aGVudGljYXRvciBzdHJ1Y3RzOyBzZWUgY3J5cHRvL2tyYjUvLgoKICAgICBHZW5lcmFsaXplZCBLZXJiZXJvcyBjYWxscyB0byBzdXBwb3J0IG11bHRpcGxlIEtlcmJlcm9zIGxpYnJhcmllcy4KICAgICBbVmVybiBTdGFhdHMgPHN0YWF0c3ZyQGFzYy5ocGMubWlsPiwKICAgICAgSmVmZnJleSBBbHRtYW4gPGphbHRtYW5AY29sdW1iaWEuZWR1PgogICAgICB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDYXVzZSAnb3BlbnNzbCBzcGVlZCcgdG8gdXNlIGZ1bGx5IGhhcmQtY29kZWQgRFNBIGtleXMgYXMgaXQKICAgICBhbHJlYWR5IGRvZXMgd2l0aCBSU0EuIHRlc3Rkc2EuaCBub3cgaGFzICdwcml2X2tleS9wdWJfa2V5JwogICAgIHZhbHVlcyBmb3IgZWFjaCBvZiB0aGUga2V5IHNpemVzIHJhdGhlciB0aGFuIGhhdmluZyBqdXN0CiAgICAgcGFyYW1ldGVycyAoYW5kICdzcGVlZCcgZ2VuZXJhdGluZyBrZXlzIGVhY2ggdGltZSkuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgU3BlZWQgdXAgRVZQIHJvdXRpbmVzLgogICAgIEJlZm9yZToKZW5jcnlwdAp0eXBlICAgICAgICAgICAgICA4IGJ5dGVzICAgICA2NCBieXRlcyAgICAyNTYgYnl0ZXMgICAxMDI0IGJ5dGVzICAgODE5MiBieXRlcwpkZXMtY2JjICAgICAgICAgICA0NDA4Ljg1ayAgICAgNTU2MC41MWsgICAgIDU3NzguNDZrICAgICA1ODYyLjIwayAgICAgNTgyNS4xNmsKZGVzLWNiYyAgICAgICAgICAgNDM4OS41NWsgICAgIDU1NzEuMTdrICAgICA1NzkyLjIzayAgICAgNTg0Ni45MWsgICAgIDU4MzIuMTFrCmRlcy1jYmMgICAgICAgICAgIDQzOTQuMzJrICAgICA1NTc1LjkyayAgICAgNTgwNy40NGsgICAgIDU4NDguMzdrICAgICA1ODQxLjMwawpkZWNyeXB0CmRlcy1jYmMgICAgICAgICAgIDM0ODIuNjZrICAgICA1MDY5LjQ5ayAgICAgNTQ5Ni4zOWsgICAgIDU2MTQuMTZrICAgICA1NjM5LjI4awpkZXMtY2JjICAgICAgICAgICAzNDgwLjc0ayAgICAgNTA2OC43NmsgICAgIDU1MTAuMzRrICAgICA1NjA5Ljg3ayAgICAgNTYzNS41MmsKZGVzLWNiYyAgICAgICAgICAgMzQ4My43MmsgICAgIDUwNjcuNjJrICAgICA1NTA0LjYwayAgICAgNTcwOC4wMWsgICAgIDU3MjQuODBrCiAgICAgQWZ0ZXI6CmVuY3J5cHQKZGVzLWNiYyAgICAgICAgICAgNDY2MC4xNmsgICAgIDU2NTAuMTlrICAgICA1ODA3LjE5ayAgICAgNTgyNy4xM2sgICAgIDU3ODMuMzJrCmRlY3J5cHQKZGVzLWNiYyAgICAgICAgICAgMzYyNC45NmsgICAgIDUyNTguMjFrICAgICA1NTMwLjkxayAgICAgNTYyNC4zMGsgICAgIDU2MjguMjZrCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZGVkIHRoZSBPUzItRU1YIHRhcmdldC4KICAgICBbIkJyaWFuIEhhdmFyZCIgPGJyaWFuaEBraGVsZGFyLmFwYW5hLm9yZy5hdT4gYW5kIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmV3cml0ZSBhcHBzIHRvIHVzZSBOQ09ORiByb3V0aW5lcyBpbnN0ZWFkIG9mIHRoZSBvbGQgQ09ORi4gTmV3IGZ1bmN0aW9ucwogICAgIHRvIHN1cHBvcnQgTkNPTkYgcm91dGluZXMgaW4gZXh0ZW5zaW9uIGNvZGUuIE5ldyBmdW5jdGlvbiBDT05GX3NldF9uY29uZigpCiAgICAgdG8gYWxsb3cgZnVuY3Rpb25zIHdoaWNoIHRha2UgYW4gTkNPTkYgdG8gYWxzbyBoYW5kbGUgdGhlIG9sZCBMSEFTSAogICAgIHN0cnVjdHVyZTogdGhpcyBtZWFucyB0aGF0IHRoZSBvbGQgQ09ORiBjb21wYXRpYmxlIHJvdXRpbmVzIGNhbiBiZQogICAgIHJldGFpbmVkIChpbiBwYXJ0aWN1bGFyIHdydCBleHRlbnNpb25zKSB3aXRob3V0IGhhdmluZyB0byBkdXBsaWNhdGUgdGhlCiAgICAgY29kZS4gTmV3IGZ1bmN0aW9uIFg1MDlWM19hZGRfZXh0X25jb25mX3NrIHRvIGFkZCBleHRlbnNpb25zIHRvIGEgc3RhY2suCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSB0aGUgZ2VuZXJhbCB1c2VyIGludGVyZmFjZSB3aXRoIG1lY2hhbmlzbXMgZm9yIGlubmVyIGNvbnRyb2wKICAgICBhbmQgd2l0aCBwb3NzaWJpbGl0aWVzIHRvIGhhdmUgeWVzL25vIGtpbmQgb2YgcHJvbXB0cy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgYWxsIGNhbGxzIHRvIGxvdyBsZXZlbCBkaWdlc3Qgcm91dGluZXMgaW4gdGhlIGxpYnJhcnkgYW5kCiAgICAgYXBwbGljYXRpb25zIHRvIHVzZSBFVlAuIEFkZCBtaXNzaW5nIGNhbGxzIHRvIEhNQUNfY2xlYW51cCgpIGFuZAogICAgIGRvbid0IGFzc3VtZSBITUFDX0NUWCBjYW4gYmUgY29waWVkIHVzaW5nIG1lbWNweSgpLgogICAgIFtWZXJkb24gV2Fsa2VyIDxWV2Fsa2VyQG5vdmVsbC5jb20+LCBTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gY29udHJvbCBlbmdpbmVzIHRocm91Z2ggY29udHJvbCBuYW1lcyBidXQgd2l0aAogICAgIGFyYml0cmFyeSBhcmd1bWVudHMgaW5zdGVhZCBvZiBqdXN0IGEgc3RyaW5nLgogICAgIENoYW5nZSB0aGUga2V5IGxvYWRlcnMgdG8gdGFrZSBhIFVJX01FVEhPRCBpbnN0ZWFkIG9mIGEgY2FsbGJhY2sKICAgICBmdW5jdGlvbiBwb2ludGVyLiAgTk9URTogdGhpcyBicmVha3MgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyCiAgICAgdmVyc2lvbnMgb2YgT3BlblNTTCBbZW5naW5lXS4KICAgICBBZGFwdCB0aGUgbkNpcGhlciBjb2RlIGZvciB0aGVzZSBuZXcgY29uZGl0aW9ucyBhbmQgYWRkIGEgY2FyZCBpbnNlcnRpb24KICAgICBjYWxsYmFjay4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBFbmhhbmNlIHRoZSBnZW5lcmFsIHVzZXIgaW50ZXJmYWNlIHdpdGggbWVjaGFuaXNtcyB0byBiZXR0ZXIgc3VwcG9ydAogICAgIGRpYWxvZyBib3ggaW50ZXJmYWNlcywgYXBwbGljYXRpb24tZGVmaW5lZCBwcm9tcHRzLCB0aGUgcG9zc2liaWxpdHkKICAgICB0byB1c2UgZGVmYXVsdHMgKGZvciBleGFtcGxlIGRlZmF1bHQgcGFzc3dvcmRzIGZyb20gc29tZXdoZXJlIGVsc2UpCiAgICAgYW5kIGludGVycnVwdHMvY2FuY2VsbGF0aW9ucy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUaWR5IHVwIFBLQ1MjMTIgYXR0cmlidXRlIGhhbmRsaW5nLiBBZGQgc3VwcG9ydCBmb3IgdGhlIENTUCBuYW1lCiAgICAgYXR0cmlidXRlIGluIFBLQ1MjMTIgZmlsZXMsIGFkZCBuZXcgLUNTUCBvcHRpb24gdG8gcGtjczEyIHV0aWxpdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGEgbWVtb3J5IGxlYWsgaW4gJ3NrX2R1cCgpJyBpbiB0aGUgY2FzZSByZWFsbG9jYXRpb24gZmFpbHMuIChBbHNvCiAgICAgdGlkeSB1cCBzb21lIHVubmVjZXNzYXJpbHkgd2VpcmQgY29kZSBpbiAnc2tfbmV3KCknKS4KICAgICBbR2VvZmYsIHJlcG9ydGVkIGJ5IERpZWdvIFRhcnRhcmEgPGR0YXJ0YXJhQG5vdmFtZW5zLmNvbT5dCgogICopIENoYW5nZSB0aGUga2V5IGxvYWRpbmcgcm91dGluZXMgZm9yIEVOR0lORXMgdG8gdXNlIHRoZSBzYW1lIGtpbmQKICAgICBjYWxsYmFjayAocGVtX3Bhc3N3b3JkX2NiKSBhcyBhbGwgb3RoZXIgcm91dGluZXMgdGhhdCBuZWVkIHRoaXMKICAgICBraW5kIG9mIGNhbGxiYWNrLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluY3JlYXNlIEVOVFJPUFlfTkVFREVEIHRvIDMyIGJ5dGVzLCBhcyBSaWpuZGFlbCBjYW4gb3BlcmF0ZSB3aXRoCiAgICAgMjU2IGJpdCAoPTMyIGJ5dGUpIGtleXMuIE9mIGNvdXJzZSBzZWVkaW5nIHdpdGggbW9yZSBlbnRyb3B5IGJ5dGVzCiAgICAgdGhhbiB0aGlzIG1pbmltdW0gdmFsdWUgaXMgcmVjb21tZW5kZWQuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIE5ldyByYW5kb20gc2VlZGVyIGZvciBPcGVuVk1TLCB1c2luZyB0aGUgc3lzdGVtIHByb2Nlc3Mgc3RhdGlzdGljcwogICAgIHRoYXQgYXJlIGVhc2lseSByZWFjaGFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgV2luZG93cyBhcHBhcmVudGx5IGNhbid0IHRyYW5zcGFyZW50bHkgaGFuZGxlIGdsb2JhbAogICAgIHZhcmlhYmxlcyBkZWZpbmVkIGluIERMTHMuIEluaXRpYWxpc2F0aW9ucyBzdWNoIGFzOgoKICAgICAgICBjb25zdCBBU04xX0lURU0gKml0ID0gJkFTTjFfSU5URUdFUl9pdDsKCiAgICAgd29udCBjb21waWxlLiBUaGlzIGlzIHVzZWQgYnkgdGhlIGFueSBhcHBsaWNhdGlvbnMgdGhhdCBuZWVkIHRvCiAgICAgZGVjbGFyZSB0aGVpciBvd24gQVNOMSBtb2R1bGVzLiBUaGlzIHdhcyBmaXhlZCBieSBhZGRpbmcgdGhlIG9wdGlvbgogICAgIEVYUE9SVF9WQVJfQVNfRk4gdG8gYWxsIFdpbjMyIHBsYXRmb3JtcywgYWx0aG91Z2ggdGhpcyBpc24ndCBzdHJpY3RseQogICAgIG5lZWRlZCBmb3Igc3RhdGljIGxpYnJhcmllcyB1bmRlciBXaW4zMi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIFg1MDlfUFVSUE9TRV9zZXQoKSBhbmQgWDUwOV9UUlVTVF9zZXQoKSB0byBoYW5kbGUKICAgICBzZXR0aW5nIG9mIHB1cnBvc2UgYW5kIHRydXN0IGZpZWxkcy4gTmV3IFg1MDlfU1RPUkUgdHJ1c3QgYW5kCiAgICAgcHVycG9zZSBmdW5jdGlvbnMgYW5kIHRpZHkgdXAgc2V0dGluZyBpbiBvdGhlciBTU0wgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBjb3BpZXMgb2YgWDUwOV9TVE9SRV9DVFggZmllbGRzIGFuZCBjYWxsYmFja3MgdG8gWDUwOV9TVE9SRQogICAgIHN0cnVjdHVyZS4gVGhlc2UgYXJlIGluaGVyaXRlZCBieSBYNTA5X1NUT1JFX0NUWCB3aGVuIGl0IGlzIAogICAgIGluaXRpYWxpc2VkLiBUaGlzIGFsbG93cyB2YXJpb3VzIGRlZmF1bHRzIHRvIGJlIHNldCBpbiB0aGUKICAgICBYNTA5X1NUT1JFIHN0cnVjdHVyZSAoc3VjaCBhcyBmbGFncyBmb3IgQ1JMIGNoZWNraW5nIGFuZCBjdXN0b20KICAgICBwdXJwb3NlIG9yIHRydXN0IHNldHRpbmdzKSBmb3IgZnVuY3Rpb25zIHdoaWNoIG9ubHkgdXNlIFg1MDlfU1RPUkVfQ1RYCiAgICAgaW50ZXJuYWxseSBzdWNoIGFzIFMvTUlNRS4KCiAgICAgTW9kaWZ5IFg1MDlfU1RPUkVfQ1RYX3B1cnBvc2VfaW5oZXJpdCgpIHNvIGl0IG9ubHkgc2V0cyBwdXJwb3NlcyBhbmQKICAgICB0cnVzdCBzZXR0aW5ncyBpZiB0aGV5IGFyZSBub3Qgc2V0IGluIFg1MDlfU1RPUkUuIFRoaXMgYWxsb3dzIFg1MDlfU1RPUkUKICAgICBwdXJwb3NlcyBhbmQgdHJ1c3QgKGluIFMvTUlNRSBmb3IgZXhhbXBsZSkgdG8gb3ZlcnJpZGUgYW55IHNldCBieSBkZWZhdWx0LgoKICAgICBBZGQgY29tbWFuZCBsaW5lIG9wdGlvbnMgZm9yIENSTCBjaGVja2luZyB0byBzbWltZSwgc19jbGllbnQgYW5kIHNfc2VydmVyCiAgICAgYXBwbGljYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgQ1JMIGJhc2VkIHJldm9jYXRpb24gY2hlY2tpbmcuIElmIHRoZSBDUkwgY2hlY2tpbmcgZmxhZyhzKQogICAgIGFyZSBzZXQgdGhlbiB0aGUgQ1JMIGlzIGxvb2tlZCB1cCBpbiB0aGUgWDUwOV9TVE9SRSBzdHJ1Y3R1cmUgYW5kCiAgICAgaXRzIHZhbGlkaXR5IGFuZCBzaWduYXR1cmUgY2hlY2tlZCwgdGhlbiBpZiB0aGUgY2VydGlmaWNhdGUgaXMgZm91bmQKICAgICBpbiB0aGUgQ1JMIHRoZSB2ZXJpZnkgZmFpbHMgd2l0aCBhIHJldm9rZWQgZXJyb3IuCgogICAgIFZhcmlvdXMgbmV3IENSTCByZWxhdGVkIGNhbGxiYWNrcyBhZGRlZCB0byBYNTA5X1NUT1JFX0NUWCBzdHJ1Y3R1cmUuCgogICAgIENvbW1hbmQgbGluZSBvcHRpb25zIGFkZGVkIHRvICd2ZXJpZnknIGFwcGxpY2F0aW9uIHRvIHN1cHBvcnQgdGhpcy4KCiAgICAgVGhpcyBuZWVkcyBzb21lIGFkZGl0aW9uYWwgd29yaywgc3VjaCBhcyBiZWluZyBhYmxlIHRvIGhhbmRsZSBtdWx0aXBsZQogICAgIENSTHMgd2l0aCBkaWZmZXJlbnQgdGltZXMsIGV4dGVuc2lvbiBiYXNlZCBsb29rdXAgKHJhdGhlciB0aGFuIGp1c3QKICAgICBieSBzdWJqZWN0IG5hbWUpIGFuZCB1bHRpbWF0ZWx5IG1vcmUgY29tcGxldGUgVjIgQ1JMIGV4dGVuc2lvbgogICAgIGhhbmRsaW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGdlbmVyYWwgdXNlciBpbnRlcmZhY2UgQVBJIChjcnlwdG8vdWkvKS4gIFRoaXMgaXMgZGVzaWduZWQKICAgICB0byByZXBsYWNlIHRoaW5ncyBsaWtlIGRlc19yZWFkX3Bhc3N3b3JkIGFuZCBmcmllbmRzIChiYWNrd2FyZAogICAgIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zIHVzaW5nIHRoaXMgbmV3IEFQSSBhcmUgcHJvdmlkZWQpLgogICAgIFRoZSBwdXJwb3NlIGlzIHRvIHJlbW92ZSBwcm9tcHRpbmcgZnVuY3Rpb25zIGZyb20gdGhlIERFUyBjb2RlCiAgICAgc2VjdGlvbiBhcyB3ZWxsIGFzIHByb3ZpZGUgZm9yIHByb21wdGluZyB0aHJvdWdoIGRpYWxvZyBib3hlcyBpbgogICAgIGEgd2luZG93IHN5c3RlbSBhbmQgdGhlIGxpa2UuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkICJleF9kYXRhIiBzdXBwb3J0IHRvIEVOR0lORSBzbyBpbXBsZW1lbnRhdGlvbnMgY2FuIGFkZCBzdGF0ZSBhdCBhCiAgICAgcGVyLXN0cnVjdHVyZSBsZXZlbCByYXRoZXIgdGhhbiBoYXZpbmcgdG8gc3RvcmUgaXQgZ2xvYmFsbHkuCiAgICAgW0dlb2ZmXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIGZvciBFTkdJTkUgc3RydWN0dXJlcyB0byBiZSBjb3BpZWQgd2hlbiByZXRyaWV2ZWQgYnkKICAgICBFTkdJTkVfYnlfaWQoKSBpZiB0aGUgRU5HSU5FIHNwZWNpZmllcyBhIG5ldyBmbGFnOiBFTkdJTkVfRkxBR1NfQllfSURfQ09QWS4KICAgICBUaGlzIGNhdXNlcyB0aGUgIm9yaWdpbmFsIiBFTkdJTkUgc3RydWN0dXJlIHRvIGFjdCBsaWtlIGEgdGVtcGxhdGUsCiAgICAgYW5hbG9nb3VzIHRvIHRoZSBSU0EgdnMuIFJTQV9NRVRIT0QgdHlwZSBvZiBzZXBhcmF0aW9uLiBCZWNhdXNlIG9mIHRoaXMKICAgICBvcGVyYXRpb25hbCBzdGF0ZSBjYW4gYmUgbG9jYWxpc2VkIHRvIGVhY2ggRU5HSU5FIHN0cnVjdHVyZSwgZGVzcGl0ZSB0aGUKICAgICBmYWN0IHRoZXkgYWxsIHNoYXJlIHRoZSBzYW1lICJtZXRob2RzIi4gTmV3IEVOR0lORSBzdHJ1Y3R1cmVzIHJldHVybmVkIGluCiAgICAgdGhpcyBjYXNlIGhhdmUgbm8gZnVuY3Rpb25hbCByZWZlcmVuY2VzIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBzaW5nbGUKICAgICBzdHJ1Y3R1cmFsIHJlZmVyZW5jZS4gVGhpcyBtYXRjaGVzIHRoZSBzaW5nbGUgc3RydWN0dXJhbCByZWZlcmVuY2UgcmV0dXJuZWQKICAgICBieSBFTkdJTkVfYnlfaWQoKSBub3JtYWxseSwgd2hlbiBpdCBpcyBpbmNyZW1lbnRlZCBvbiB0aGUgcHJlLWV4aXN0aW5nCiAgICAgRU5HSU5FIHN0cnVjdHVyZS4KICAgICBbR2VvZmZdCgogICopIEZpeCBBU04xIGRlY29kZXIgd2hlbiBkZWNvZGluZyB0eXBlIEFOWSBhbmQgVl9BU04xX09USEVSOiBzaW5jZSB0aGlzCiAgICAgbmVlZHMgdG8gbWF0Y2ggYW55IG90aGVyIHR5cGUgYXQgYWxsIHdlIG5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdGhlCiAgICAgdGFnIGNhY2hlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZXMgdG8gdGhlICJvcGVuc3NsIGVuZ2luZSIgdXRpbGl0eSB0byBpbmNsdWRlOwogICAgIC0gdmVyYm9zaXR5IGxldmVscyAoJy12JywgJy12dicsIGFuZCAnLXZ2dicpIHRoYXQgcHJvdmlkZSBpbmZvcm1hdGlvbgogICAgICAgYWJvdXQgYW4gRU5HSU5FJ3MgYXZhaWxhYmxlIGNvbnRyb2wgY29tbWFuZHMuCiAgICAgLSBleGVjdXRpbmcgY29udHJvbCBjb21tYW5kcyBmcm9tIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdXNpbmcgdGhlCiAgICAgICAnLXByZScgYW5kICctcG9zdCcgc3dpdGNoZXMuICctcG9zdCcgaXMgb25seSB1c2VkIGlmICctdCcgaXMKICAgICAgIHNwZWNpZmllZCBhbmQgdGhlIEVOR0lORSBpcyBzdWNjZXNzZnVsbHkgaW5pdGlhbGlzZWQuIFRoZSBzeW50YXggZm9yCiAgICAgICB0aGUgaW5kaXZpZHVhbCBjb21tYW5kcyBhcmUgY29sb24tc2VwYXJhdGVkLCBmb3IgZXhhbXBsZTsKCSBvcGVuc3NsIGVuZ2luZSBjaGlsIC1wcmUgRk9SS19DSEVDSzowIC1wcmUgU09fUEFUSDovbGliL3Rlc3Quc28KICAgICBbR2VvZmZdCgogICopIE5ldyBkeW5hbWljIGNvbnRyb2wgY29tbWFuZCBzdXBwb3J0IGZvciBFTkdJTkVzLiBFTkdJTkVzIGNhbiBub3cKICAgICBkZWNsYXJlIHRoZWlyIG93biBjb21tYW5kcyAobnVtYmVycyksIG5hbWVzIChzdHJpbmdzKSwgZGVzY3JpcHRpb25zLAogICAgIGFuZCBpbnB1dCB0eXBlcyBmb3IgcnVuLXRpbWUgZGlzY292ZXJ5IGJ5IGNhbGxpbmcgYXBwbGljYXRpb25zLiBBCiAgICAgc3Vic2V0IG9mIHRoZXNlIGNvbW1hbmRzIGFyZSBpbXBsaWNpdGx5IGNsYXNzZWQgYXMgImV4ZWN1dGFibGUiCiAgICAgZGVwZW5kaW5nIG9uIHRoZWlyIGlucHV0IHR5cGUsIGFuZCBvbmx5IHRoZXNlIGNhbiBiZSBpbnZva2VkIHRocm91Z2gKICAgICB0aGUgbmV3IHN0cmluZy1iYXNlZCBBUEkgZnVuY3Rpb24gRU5HSU5FX2N0cmxfY21kX3N0cmluZygpLiAoRWcuIHRoaXMKICAgICBjYW4gYmUgYmFzZWQgb24gdXNlciBpbnB1dCwgY29uZmlnIGZpbGVzLCBldGMpLiBUaGUgZGlzdGluY3Rpb24gaXMKICAgICB0aGF0ICJleGVjdXRhYmxlIiBjb21tYW5kcyBjYW5ub3QgcmV0dXJuIGFueXRoaW5nIG90aGVyIHRoYW4gYSBib29sZWFuCiAgICAgcmVzdWx0IGFuZCBjYW4gb25seSBzdXBwb3J0IG51bWVyaWMgb3Igc3RyaW5nIGlucHV0LCB3aGVyZWFzIHNvbWUKICAgICBkaXNjb3ZlcmFibGUgY29tbWFuZHMgbWF5IG9ubHkgYmUgZm9yIGRpcmVjdCB1c2UgdGhyb3VnaAogICAgIEVOR0lORV9jdHJsKCksIGVnLiBzdXBwb3J0aW5nIHRoZSBleGNoYW5nZSBvZiBiaW5hcnkgZGF0YSwgZnVuY3Rpb24KICAgICBwb2ludGVycywgb3Igb3RoZXIgY3VzdG9tIHVzZXMuIFRoZSAiZXhlY3V0YWJsZSIgY29tbWFuZHMgYXJlIHRvCiAgICAgc3VwcG9ydCBwYXJhbWV0ZXJpc2F0aW9ucyBvZiBFTkdJTkUgYmVoYXZpb3VyIHRoYXQgY2FuIGJlCiAgICAgdW5hbWJpZ3VvdXNseSBkZWZpbmVkIGJ5IEVOR0lORXMgYW5kIHVzZWQgY29uc2lzdGVudGx5IGFjcm9zcyBhbnkKICAgICBPcGVuU1NMLWJhc2VkIGFwcGxpY2F0aW9uLiBDb21tYW5kcyBoYXZlIGJlZW4gYWRkZWQgdG8gYWxsIHRoZQogICAgIGV4aXN0aW5nIGhhcmR3YXJlLXN1cHBvcnRpbmcgRU5HSU5Fcywgbm90aWNlYWJseSAiU09fUEFUSCIgdG8gYWxsb3cKICAgICBjb250cm9sIG92ZXIgc2hhcmVkLWxpYnJhcnkgcGF0aHMgd2l0aG91dCBzb3VyY2UgY29kZSBhbHRlcmF0aW9ucy4KICAgICBbR2VvZmZdCgogICopIENoYW5nZWQgYWxsIEVOR0lORSBpbXBsZW1lbnRhdGlvbnMgdG8gZHluYW1pY2FsbHkgYWxsb2NhdGUgdGhlaXIKICAgICBFTkdJTkVzIHJhdGhlciB0aGFuIGRlY2xhcmluZyB0aGVtIHN0YXRpY2FsbHkuIEFwYXJ0IGZyb20gdGhpcyBiZWluZwogICAgIG5lY2Vzc2FyeSB3aXRoIHRoZSByZW1vdmFsIG9mIHRoZSBFTkdJTkVfRkxBR1NfTUFMTE9DRUQgZGlzdGluY3Rpb24sCiAgICAgdGhpcyBhbHNvIGFsbG93cyB0aGUgaW1wbGVtZW50YXRpb25zIHRvIGNvbXBpbGUgd2l0aG91dCB1c2luZyB0aGUKICAgICBpbnRlcm5hbCBlbmdpbmVfaW50LmggaGVhZGVyLgogICAgIFtHZW9mZl0KCiAgKikgTWlub3IgYWRqdXN0bWVudCB0byAicmFuZCIgY29kZS4gUkFORF9nZXRfcmFuZF9tZXRob2QoKSBub3cgcmV0dXJucyBhCiAgICAgJ2NvbnN0JyB2YWx1ZS4gQW55IGNvZGUgdGhhdCBzaG91bGQgYmUgYWJsZSB0byBtb2RpZnkgYSBSQU5EX01FVEhPRAogICAgIHNob3VsZCBhbHJlYWR5IGhhdmUgbm9uLWNvbnN0IHBvaW50ZXJzIHRvIGl0IChpZS4gdGhleSBzaG91bGQgb25seQogICAgIG1vZGlmeSB0aGVpciBvd24gb25lcykuCiAgICAgW0dlb2ZmXQoKICAqKSBNYWRlIGEgdmFyaWV0eSBvZiBsaXR0bGUgdHdlYWtzIHRvIHRoZSBFTkdJTkUgY29kZS4KICAgICAtICJhdGFsbGEiIGFuZCAidWJzZWMiIHN0cmluZyBkZWZpbml0aW9ucyB3ZXJlIG1vdmVkIGZyb20gaGVhZGVyIGZpbGVzCiAgICAgICB0byBDIGNvZGUuICJudXJvbiIgc3RyaW5nIGRlZmluaXRpb25zIHdlcmUgcGxhY2VkIGluIHZhcmlhYmxlcwogICAgICAgcmF0aGVyIHRoYW4gaGFyZC1jb2RlZCAtIGFsbG93aW5nIHBhcmFtZXRlcmlzYXRpb24gb2YgdGhlc2UgdmFsdWVzCiAgICAgICBsYXRlciBvbiB2aWEgY3RybCgpIGNvbW1hbmRzLgogICAgIC0gUmVtb3ZlZCB1bnVzZWQgIiNpZiAwIidkIGNvZGUuCiAgICAgLSBGaXhlZCBlbmdpbmUgbGlzdCBpdGVyYXRpb24gY29kZSBzbyBpdCB1c2VzIEVOR0lORV9mcmVlKCkgdG8gcmVsZWFzZQogICAgICAgc3RydWN0dXJhbCByZWZlcmVuY2VzLgogICAgIC0gQ29uc3RpZmllZCB0aGUgUkFORF9NRVRIT0QgZWxlbWVudCBvZiBFTkdJTkUgc3RydWN0dXJlcy4KICAgICAtIENvbnN0aWZpZWQgdmFyaW91cyBnZXQvc2V0IGZ1bmN0aW9ucyBhcyBhcHByb3ByaWF0ZSBhbmQgYWRkZWQKICAgICAgIG1pc3NpbmcgZnVuY3Rpb25zIChpbmNsdWRpbmcgYSBjYXRjaC1hbGwgRU5HSU5FX2NweSB0aGF0IGR1cGxpY2F0ZXMKICAgICAgIGFsbCBFTkdJTkUgdmFsdWVzIG9udG8gYSBuZXcgRU5HSU5FIGV4Y2VwdCByZWZlcmVuY2UgY291bnRzL3N0YXRlKS4KICAgICAtIFJlbW92ZWQgTlVMTCBwYXJhbWV0ZXIgY2hlY2tzIGluIGdldC9zZXQgZnVuY3Rpb25zLiBTZXR0aW5nIGEgbWV0aG9kCiAgICAgICBvciBmdW5jdGlvbiB0byBOVUxMIGlzIGEgd2F5IG9mIGNhbmNlbGxpbmcgb3V0IGEgcHJldmlvdXNseSBzZXQKICAgICAgIHZhbHVlLiAgUGFzc2luZyBhIE5VTEwgRU5HSU5FIHBhcmFtZXRlciBpcyBqdXN0IHBsYWluIHN0dXBpZCBhbnl3YXkKICAgICAgIGFuZCBkb2Vzbid0IGp1c3RpZnkgdGhlIGV4dHJhIGVycm9yIHN5bWJvbHMgYW5kIGNvZGUuCiAgICAgLSBEZXByZWNhdGUgdGhlIEVOR0lORV9GTEFHU19NQUxMT0NFRCBkZWZpbmUgYW5kIG1vdmUgdGhlIGFyZWEgZm9yCiAgICAgICBmbGFncyBmcm9tIGVuZ2luZV9pbnQuaCB0byBlbmdpbmUuaC4KICAgICAtIENoYW5nZWQgcHJvdG90eXBlcyBmb3IgRU5HSU5FIGhhbmRsZXIgZnVuY3Rpb25zIChpbml0KCksIGZpbmlzaCgpLAogICAgICAgY3RybCgpLCBrZXktbG9hZCBmdW5jdGlvbnMsIGV0YykgdG8gdGFrZSBhbiAoRU5HSU5FKikgcGFyYW1ldGVyLgogICAgIFtHZW9mZl0KCiAgKikgSW1wbGVtZW50IGJpbmFyeSBpbnZlcnNpb24gYWxnb3JpdGhtIGZvciBCTl9tb2RfaW52ZXJzZSBpbiBhZGRpdGlvbgogICAgIHRvIHRoZSBhbGdvcml0aG0gdXNpbmcgbG9uZyBkaXZpc2lvbi4gIFRoZSBiaW5hcnkgYWxnb3JpdGhtIGNhbiBiZQogICAgIHVzZWQgb25seSBpZiB0aGUgbW9kdWx1cyBpcyBvZGQuICBPbiAzMi1iaXQgc3lzdGVtcywgaXQgaXMgZmFzdGVyCiAgICAgb25seSBmb3IgcmVsYXRpdmVseSBzbWFsbCBtb2R1bGkgKHJvdWdobHkgMjAtMzAlIGZvciAxMjgtYml0IG1vZHVsaSwKICAgICByb3VnaGx5IDUtMTUlIGZvciAyNTYtYml0IG1vZHVsaSksIHNvIHdlIHVzZSBpdCBvbmx5IGZvciBtb2R1bGkKICAgICB1cCB0byA0NTAgYml0cy4gIEluIDY0LWJpdCBlbnZpcm9ubWVudHMsIHRoZSBiaW5hcnkgYWxnb3JpdGhtCiAgICAgYXBwZWFycyB0byBiZSBhZHZhbnRhZ2VvdXMgZm9yIG11Y2ggbG9uZ2VyIG1vZHVsaTsgaGVyZSB3ZSB1c2UgaXQKICAgICBmb3IgbW9kdWxpIHVwIHRvIDIwNDggYml0cy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXdyaXRlIENIT0lDRSBmaWVsZCBzZXR0aW5nIGluIEFTTjFfaXRlbV9leF9kMmkoKS4gVGhlIG9sZCBjb2RlCiAgICAgY291bGQgbm90IHN1cHBvcnQgdGhlIGNvbWJpbmUgZmxhZyBpbiBjaG9pY2UgZmllbGRzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhICdjb3B5X2V4dGVuc2lvbnMnIG9wdGlvbiB0byB0aGUgJ2NhJyB1dGlsaXR5LiBUaGlzIGNvcGllcwogICAgIGV4dGVuc2lvbnMgZnJvbSBhIGNlcnRpZmljYXRlIHJlcXVlc3QgdG8gdGhlIGNlcnRpZmljYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFsbG93IG11bHRpcGxlICdjZXJ0b3B0JyBhbmQgJ25hbWVvcHQnIG9wdGlvbnMgdG8gYmUgc2VwYXJhdGVkCiAgICAgYnkgY29tbWFzLiBBZGQgJ25hbW9wdCcgYW5kICdjZXJ0b3B0JyBvcHRpb25zIHRvIHRoZSAnY2EnIGNvbmZpZwogICAgIGZpbGU6IHRoaXMgYWxsb3dzIHRoZSBkaXNwbGF5IG9mIHRoZSBjZXJ0aWZpY2F0ZSBhYm91dCB0byBiZQogICAgIHNpZ25lZCB0byBiZSBjdXN0b21pc2VkLCB0byBhbGxvdyBjZXJ0YWluIGZpZWxkcyB0byBiZSBpbmNsdWRlZAogICAgIG9yIGV4Y2x1ZGVkIGFuZCBleHRlbnNpb24gZGV0YWlscy4gVGhlIG9sZCBzeXN0ZW0gZGlkbid0IGRpc3BsYXkKICAgICBtdWx0aWNoYXJhY3RlciBzdHJpbmdzIHByb3Blcmx5LCBvbWl0dGVkIGZpZWxkcyBub3QgaW4gdGhlIHBvbGljeQogICAgIGFuZCBjb3VsZG4ndCBkaXNwbGF5IGFkZGl0aW9uYWwgZGV0YWlscyBzdWNoIGFzIGV4dGVuc2lvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRnVuY3Rpb24gRUNfUE9JTlRzX211bCBmb3IgbXVsdGlwbGUgc2NhbGFyIG11bHRpcGxpY2F0aW9uCiAgICAgb2YgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBlbGxpcHRpYyBjdXJ2ZSBwb2ludHMKICAgICAgICAgIFxzdW0gc2NhbGFyc1tpXSpwb2ludHNbaV0sCiAgICAgb3B0aW9uYWxseSBpbmNsdWRpbmcgdGhlIGdlbmVyYXRvciBkZWZpbmVkIGZvciB0aGUgRUNfR1JPVVA6CiAgICAgICAgICBzY2FsYXIqZ2VuZXJhdG9yICsgIFxzdW0gc2NhbGFyc1tpXSpwb2ludHNbaV0uCgogICAgIEVDX1BPSU5UX211bCBpcyBhIHNpbXBsZSB3cmFwcGVyIGZ1bmN0aW9uIGZvciB0aGUgdHlwaWNhbCBjYXNlCiAgICAgdGhhdCB0aGUgcG9pbnQgbGlzdCBoYXMganVzdCBvbmUgaXRlbSAoYmVzaWRlcyB0aGUgb3B0aW9uYWwKICAgICBnZW5lcmF0b3IpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpcnN0IEVDX01FVEhPRHMgZm9yIGN1cnZlcyBvdmVyIEdGKHApOgoKICAgICBFQ19HRnBfc2ltcGxlX21ldGhvZCgpIHVzZXMgdGhlIGJhc2ljIEJOX21vZF9tdWwgYW5kIEJOX21vZF9zcXIKICAgICBvcGVyYXRpb25zIGFuZCBwcm92aWRlcyB2YXJpb3VzIG1ldGhvZCBmdW5jdGlvbnMgdGhhdCBjYW4gYWxzbwogICAgIG9wZXJhdGUgd2l0aCBmYXN0ZXIgaW1wbGVtZW50YXRpb25zIG9mIG1vZHVsYXIgYXJpdGhtZXRpYy4gICAgIAoKICAgICBFQ19HRnBfbW9udF9tZXRob2QoKSByZXVzZXMgbW9zdCBmdW5jdGlvbnMgdGhhdCBhcmUgcGFydCBvZgogICAgIEVDX0dGcF9zaW1wbGVfbWV0aG9kLCBidXQgdXNlcyBNb250Z29tZXJ5IGFyaXRobWV0aWMuCgogICAgIFtCb2RvIE1vZWxsZXI7IHBvaW50IGFkZGl0aW9uIGFuZCBwb2ludCBkb3VibGluZwogICAgIGltcGxlbWVudGF0aW9uIGRpcmVjdGx5IGRlcml2ZWQgZnJvbSBzb3VyY2UgY29kZSBwcm92aWRlZCBieQogICAgIExlbmthIEZpYmlrb3ZhIDxmaWJpa292YUBleHAtbWF0aC51bmktZXNzZW4uZGU+XQoKICAqKSBGcmFtZXdvcmsgZm9yIGVsbGlwdGljIGN1cnZlcyAoY3J5cHRvL2VjL2VjLmgsIGNyeXB0by9lYy9lY19sY2wuaCwKICAgICBjcnlwdG8vZWMvZWNfbGliLmMpOgoKICAgICBDdXJ2ZXMgYXJlIEVDX0dST1VQIG9iamVjdHMgKHdpdGggYW4gb3B0aW9uYWwgZ3JvdXAgZ2VuZXJhdG9yKQogICAgIGJhc2VkIG9uIEVDX01FVEhPRHMgdGhhdCBhcmUgYnVpbHQgaW50byB0aGUgbGlicmFyeS4KCiAgICAgUG9pbnRzIGFyZSBFQ19QT0lOVCBvYmplY3RzIGJhc2VkIG9uIEVDX0dST1VQIG9iamVjdHMuCgogICAgIE1vc3Qgb2YgdGhlIGZyYW1ld29yayB3b3VsZCBiZSBhYmxlIHRvIGhhbmRsZSBjdXJ2ZXMgb3ZlciBhcmJpdHJhcnkKICAgICBmaW5pdGUgZmllbGRzLCBidXQgYXMgdGhlcmUgYXJlIG5vIG9idmlvdXMgdHlwZXMgZm9yIGZpZWxkcyBvdGhlcgogICAgIHRoYW4gR0YocCksIHNvbWUgZnVuY3Rpb25zIGFyZSBsaW1pdGVkIHRvIHRoYXQgZm9yIG5vdy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgdGhlIC1IVFRQIG9wdGlvbiB0byBzX3NlcnZlci4gIEl0IGlzIHNpbWlsYXIgdG8gLVdXVywgYnV0IHJlcXVpcmVzCiAgICAgdGhhdCB0aGUgZmlsZSBjb250YWlucyBhIGNvbXBsZXRlIEhUVFAgcmVzcG9uc2UuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBlYyBkaXJlY3RvcnkgdG8gbWtkZWYucGwgYW5kIG1rZmlsZXMucGwuIEluIG1rZGVmLnBsCiAgICAgY2hhbmdlIHRoZSBkZWYgYW5kIG51bSBmaWxlIHByaW50ZiBmb3JtYXQgc3BlY2lmaWVyIGZyb20gIiUtNDBzWFhYIgogICAgIHRvICIlLTM5cyBYWFgiLiBUaGUgbGF0dGVyIHdpbGwgYWx3YXlzIGd1YXJhbnRlZSBhIHNwYWNlIGFmdGVyIHRoZQogICAgIGZpZWxkIHdoaWxlIHRoZSBmb3JtZXIgd2lsbCBjYXVzZSB0aGVtIHRvIHJ1biB0b2dldGhlciBpZiB0aGUgZmllbGQKICAgICBpcyA0MCBvZiBtb3JlIGNoYXJhY3RlcnMgbG9uZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb25zdGlmeSB0aGUgY2lwaGVyIGFuZCBkaWdlc3QgJ21ldGhvZCcgZnVuY3Rpb25zIGFuZCBzdHJ1Y3R1cmVzCiAgICAgYW5kIG1vZGlmeSByZWxhdGVkIGZ1bmN0aW9ucyB0byB0YWtlIGNvbnN0YW50IEVWUF9NRCBhbmQgRVZQX0NJUEhFUgogICAgIHBvaW50ZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEhpZGUgQk5fQ1RYIHN0cnVjdHVyZSBkZXRhaWxzIGluIGJuX2xjbC5oIGluc3RlYWQgb2YgcHVibGlzaGluZyB0aGVtCiAgICAgaW4gPG9wZW5zc2wvYm4uaD4uICBBbHNvIGZ1cnRoZXIgaW5jcmVhc2UgQk5fQ1RYX05VTSB0byAzMi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNb2RpZnkgRVZQX0RpZ2VzdCooKSByb3V0aW5lcyBzbyB0aGV5IG5vdyByZXR1cm4gdmFsdWVzLiBBbHRob3VnaCB0aGUKICAgICBpbnRlcm5hbCBzb2Z0d2FyZSByb3V0aW5lcyBjYW4gbmV2ZXIgZmFpbCBhZGRpdGlvbmFsIGhhcmR3YXJlIHZlcnNpb25zCiAgICAgbWlnaHQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2xlYW4gdXAgY3J5cHRvL2Vyci9lcnIuaCBhbmQgY2hhbmdlIHNvbWUgZXJyb3IgY29kZXMgdG8gYXZvaWQgY29uZmxpY3RzOgoKICAgICBQcmV2aW91c2x5IEVSUl9SX0ZBVEFMIHdhcyB0b28gc21hbGwgYW5kIGNvaW5jaWRlZCB3aXRoIEVSUl9MSUJfUEtDUzcKICAgICAoPSBFUlJfUl9QS0NTN19MSUIpOyBpdCBpcyBub3cgNjQgaW5zdGVhZCBvZiAzMi4KCiAgICAgQVNOMSBlcnJvciBjb2RlcwogICAgICAgICAgRVJSX1JfTkVTVEVEX0FTTjFfRVJST1IKICAgICAgICAgIC4uLgogICAgICAgICAgRVJSX1JfTUlTU0lOR19BU04xX0VPUwogICAgIHdlcmUgNCAuLiA5LCBjb25mbGljdGluZyB3aXRoCiAgICAgICAgICBFUlJfTElCX1JTQSAoPSBFUlJfUl9SU0FfTElCKQogICAgICAgICAgLi4uCiAgICAgICAgICBFUlJfTElCX1BFTSAoPSBFUlJfUl9QRU1fTElCKS4KICAgICBUaGV5IGFyZSBub3cgNTggLi4gNjMgKGkuZS4sIGp1c3QgYmVsb3cgRVJSX1JfRkFUQUwpLgoKICAgICBBZGQgbmV3IGVycm9yIGNvZGUgJ0VSUl9SX0lOVEVSTkFMX0VSUk9SJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEb24ndCBvdmVydXNlIGxvY2tzIGluIGNyeXB0by9lcnIvZXJyLmM6IEZvciBkYXRhIHJldHJpZXZhbCwgQ1JZUFRPX3JfbG9jawogICAgIHN1ZmZpY2VzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBvcHRpb24gJy1zdWJqIGFyZycgZm9yICdvcGVuc3NsIHJlcScgYW5kICdvcGVuc3NsIGNhJy4gIFRoaXMKICAgICBzZXRzIHRoZSBzdWJqZWN0IG5hbWUgZm9yIGEgbmV3IHJlcXVlc3Qgb3Igc3VwZXJzZWRlcyB0aGUKICAgICBzdWJqZWN0IG5hbWUgaW4gYSBnaXZlbiByZXF1ZXN0LiBGb3JtYXRzIHRoYXQgY2FuIGJlIHBhcnNlZCBhcmUKICAgICAgICAgICdDTj1Tb21lIE5hbWUsIE9VPW15T1UsIEM9SVQnCiAgICAgYW5kCiAgICAgICAgICAnQ049U29tZSBOYW1lL09VPW15T1UvQz1JVCcuCgogICAgIEFkZCBvcHRpb25zICctYmF0Y2gnIGFuZCAnLXZlcmJvc2UnIHRvICdvcGVuc3NsIHJlcScuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGhhY2ttYXN0ZXJzLm5ldD5dCgogICopIEludHJvZHVjZSB0aGUgcG9zc2liaWxpdHkgdG8gYWNjZXNzIGdsb2JhbCB2YXJpYWJsZXMgdGhyb3VnaAogICAgIGZ1bmN0aW9ucyBvbiBwbGF0Zm9ybSB3ZXJlIHRoYXQncyB0aGUgYmVzdCB3YXkgdG8gaGFuZGxlIGV4cG9ydGluZwogICAgIGdsb2JhbCB2YXJpYWJsZXMgaW4gc2hhcmVkIGxpYnJhcmllcy4gIFRvIGVuYWJsZSB0aGlzIGZ1bmN0aW9uYWxpdHksCiAgICAgb25lIG11c3QgY29uZmlndXJlIHdpdGggIkVYUE9SVF9WQVJfQVNfRk4iIG9yIGRlZmluZWQgdGhlIEMgbWFjcm8KICAgICAiT1BFTlNTTF9FWFBPUlRfVkFSX0FTX0ZVTkNUSU9OIiBpbiBjcnlwdG8vb3BlbnNzbGNvbmYuaCAodGhlIGxhdHRlcgogICAgIGlzIG5vcm1hbGx5IGRvbmUgYnkgQ29uZmlndXJlIG9yIHNvbWV0aGluZyBzaW1pbGFyKS4KCiAgICAgVG8gaW1wbGVtZW50IGEgZ2xvYmFsIHZhcmlhYmxlLCB1c2UgdGhlIG1hY3JvIE9QRU5TU0xfSU1QTEVNRU5UX0dMT0JBTAogICAgIGluIHRoZSBzb3VyY2UgZmlsZSAoZm9vLmMpIGxpa2UgdGhpczoKCglPUEVOU1NMX0lNUExFTUVOVF9HTE9CQUwoaW50LGZvbyk9MTsKCU9QRU5TU0xfSU1QTEVNRU5UX0dMT0JBTChkb3VibGUsYmFyKTsKCiAgICAgVG8gZGVjbGFyZSBhIGdsb2JhbCB2YXJpYWJsZSwgdXNlIHRoZSBtYWNyb3MgT1BFTlNTTF9ERUNMQVJFX0dMT0JBTAogICAgIGFuZCBPUEVOU1NMX0dMT0JBTF9SRUYgaW4gdGhlIGhlYWRlciBmaWxlIChmb28uaCkgbGlrZSB0aGlzOgoKCU9QRU5TU0xfREVDTEFSRV9HTE9CQUwoaW50LGZvbyk7CgkjZGVmaW5lIGZvbyBPUEVOU1NMX0dMT0JBTF9SRUYoZm9vKQoJT1BFTlNTTF9ERUNMQVJFX0dMT0JBTChkb3VibGUsYmFyKTsKCSNkZWZpbmUgYmFyIE9QRU5TU0xfR0xPQkFMX1JFRihiYXIpCgogICAgIFRoZSAjZGVmaW5lcyBhcmUgdmVyeSBpbXBvcnRhbnQsIGFuZCB0aGVyZWZvcmUgc28gaXMgaW5jbHVkaW5nIHRoZQogICAgIGhlYWRlciBmaWxlIGV2ZXJ5d2hlcmUgd2hlcmUgdGhlIGRlZmluZWQgZ2xvYmFscyBhcmUgdXNlZC4KCiAgICAgVGhlIG1hY3JvIE9QRU5TU0xfRVhQT1JUX1ZBUl9BU19GVU5DVElPTiBhbHNvIGFmZmVjdHMgdGhlIGRlZmluaXRpb24KICAgICBvZiBBU04uMSBpdGVtcywgYnV0IHRoYXQgc3RydWN0dXJlIGlzIGEgYml0IGRpZmZlcmVudC4KCiAgICAgVGhlIGxhcmdlc3QgY2hhbmdlIGlzIGluIHV0aWwvbWtkZWYucGwgd2hpY2ggaGFzIGJlZW4gZW5oYW5jZWQgd2l0aAogICAgIGJldHRlciBhbmQgZWFzaWVyIHRvIHVuZGVyc3RhbmQgbG9naWMgdG8gY2hvb3NlIHdoaWNoIHN5bWJvbHMgc2hvdWxkCiAgICAgZ28gaW50byB0aGUgV2luZG93cyAuZGVmIGZpbGVzIGFzIHdlbGwgYXMgYSBudW1iZXIgb2YgZml4ZXMgYW5kIGNvZGUKICAgICBjbGVhbnVwIChhbW9uZyBvdGhlcnMsIGFsZ29yaXRobSBrZXl3b3JkcyBhcmUgbm93IHNvcnRlZAogICAgIGxleGljb2dyYXBoaWNhbGx5IHRvIGF2b2lkIGNvbnN0YW50IHJld3JpdGVzKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbiBCTl9kaXYoKSBrZWVwIGEgY29weSBvZiB0aGUgc2lnbiBvZiAnbnVtJyBiZWZvcmUgd3JpdGluZyB0aGUKICAgICByZXN1bHQgdG8gJ3JtJyBiZWNhdXNlIGlmIHJtPT1udW0gdGhlIHZhbHVlIHdpbGwgYmUgb3ZlcndyaXR0ZW4KICAgICBhbmQgcHJvZHVjZSB0aGUgd3JvbmcgcmVzdWx0IGlmICdudW0nIGlzIG5lZ2F0aXZlOiB0aGlzIGNhdXNlZAogICAgIHByb2JsZW1zIHdpdGggQk5fbW9kKCkgYW5kIEJOX25ubW9kKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRnVuY3Rpb24gT0NTUF9yZXF1ZXN0X3ZlcmlmeSgpLiBUaGlzIGNoZWNrcyB0aGUgc2lnbmF0dXJlIG9uIGFuCiAgICAgT0NTUCByZXF1ZXN0IGFuZCB2ZXJpZmllcyB0aGUgc2lnbmVyIGNlcnRpZmljYXRlLiBUaGUgc2lnbmVyCiAgICAgY2VydGlmaWNhdGUgaXMganVzdCBjaGVja2VkIGZvciBhIGdlbmVyaWMgcHVycG9zZSBhbmQgT0NTUCByZXF1ZXN0CiAgICAgdHJ1c3Qgc2V0dGluZ3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIE9DU1BfY2hlY2tfdmFsaWRpdHkoKSBmdW5jdGlvbiB0byBjaGVjayB0aGUgdmFsaWRpdHkgb2YgT0NTUAogICAgIHJlc3BvbnNlcy4gT0NTUCByZXNwb25zZXMgYXJlIHByZXBhcmVkIGluIHJlYWwgdGltZSBhbmQgbWF5IG9ubHkKICAgICBiZSBhIGZldyBzZWNvbmRzIG9sZC4gU2ltcGx5IGNoZWNraW5nIHRoYXQgdGhlIGN1cnJlbnQgdGltZSBsaWVzCiAgICAgYmV0d2VlbiB0aGlzVXBkYXRlIGFuZCBuZXh0VXBkYXRlIG1heCByZWplY3Qgb3RoZXJ3aXNlIHZhbGlkIHJlc3BvbnNlcwogICAgIGNhdXNlZCBieSBlaXRoZXIgT0NTUCByZXNwb25kZXIgb3IgY2xpZW50IGNsb2NrIGluYWNjdXJhY3kuIEluc3RlYWQKICAgICB3ZSBhbGxvdyB0aGlzVXBkYXRlIGFuZCBuZXh0VXBkYXRlIHRvIGZhbGwgd2l0aGluIGEgY2VydGFpbiBwZXJpb2Qgb2YKICAgICB0aGUgY3VycmVudCB0aW1lLiBUaGUgYWdlIG9mIHRoZSByZXNwb25zZSBjYW4gYWxzbyBvcHRpb25hbGx5IGJlCiAgICAgY2hlY2tlZC4gVHdvIG5ldyBvcHRpb25zIC12YWxpZGl0eV9wZXJpb2QgYW5kIC1zdGF0dXNfYWdlIGFkZGVkIHRvCiAgICAgb2NzcCB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIElmIHNpZ25hdHVyZSBvciBwdWJsaWMga2V5IGFsZ29yaXRobSBpcyB1bnJlY29nbml6ZWQgcHJpbnQgb3V0IGl0cwogICAgIE9JRCByYXRoZXIgdGhhdCBqdXN0IFVOS05PV04uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIE9DU1BfY2VydF90b19pZCgpIHRvIHRvbGVyYXRlIGEgTlVMTCBzdWJqZWN0IGNlcnRpZmljYXRlIGFuZAogICAgIE9DU1BfY2VydF9pZF9uZXcoKSBhIE5VTEwgc2VyaWFsTnVtYmVyLiBUaGlzIGFsbG93cyBhIHBhcnRpYWwgY2VydGlmaWNhdGUKICAgICBJRCB0byBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgaXNzdWVyIGNlcnRpZmljYXRlIGFsb25lIHdoaWNoIGNhbiB0aGVuIGJlCiAgICAgcGFzc2VkIHRvIE9DU1BfaWRfaXNzdWVyX2NtcCgpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBjb21waWxhdGlvbiBvcHRpb24gQVNOMV9JVEVNX0ZVTkNUSU9OUy4gVGhpcyBjYXVzZXMgdGhlIG5ldwogICAgIEFTTjEgbW9kdWxlcyB0byBleHBvcnQgZnVuY3Rpb25zIHJldHVybmluZyBBU04xX0lURU0gcG9pbnRlcnMKICAgICBpbnN0ZWFkIG9mIHRoZSBBU04xX0lURU0gc3RydWN0dXJlcyB0aGVtc2VsdmVzLiBUaGlzIGFkZHMgc2V2ZXJhbAogICAgIG5ldyBtYWNyb3Mgd2hpY2ggYWxsb3cgdGhlIHVuZGVybHlpbmcgQVNOMSBmdW5jdGlvbi9zdHJ1Y3R1cmUgdG8KICAgICBiZSBhY2Nlc3NlZCB0cmFuc3BhcmVudGx5LiBBcyBhIHJlc3VsdCBjb2RlIHNob3VsZCBub3QgdXNlIEFTTjFfSVRFTQogICAgIHJlZmVyZW5jZXMgZGlyZWN0bHkgKHN1Y2ggYXMgJlg1MDlfaXQpIGJ1dCBpbnN0ZWFkIHVzZSB0aGUgcmVsZXZhbnQKICAgICBtYWNyb3MgKHN1Y2ggYXMgQVNOMV9JVEVNX3JwdHIoWDUwOSkpLiBUaGlzIG9wdGlvbiBpcyB0byBhbGxvdwogICAgIHVzZSBvZiB0aGUgbmV3IEFTTjEgY29kZSBvbiBwbGF0Zm9ybXMgd2hlcmUgZXhwb3J0aW5nIHN0cnVjdHVyZXMKICAgICBpcyBwcm9ibGVtYXRpY2FsIChmb3IgZXhhbXBsZSBpbiBzaGFyZWQgbGlicmFyaWVzKSBidXQgZXhwb3J0aW5nCiAgICAgZnVuY3Rpb25zIHJldHVybmluZyBwb2ludGVycyB0byBzdHJ1Y3R1cmVzIGlzIG5vdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igb3ZlcnJpZGluZyB0aGUgZ2VuZXJhdGlvbiBvZiBTU0wvVExTIHNlc3Npb24gSURzLgogICAgIFRoZXNlIGNhbGxiYWNrcyBjYW4gYmUgcmVnaXN0ZXJlZCBlaXRoZXIgaW4gYW4gU1NMX0NUWCBvciBwZXIgU1NMLgogICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgaXMgdG8gYWxsb3cgYXBwbGljYXRpb25zIHRvIGNvbnRyb2wsIGlmIHRoZXkgd2lzaCwKICAgICB0aGUgYXJiaXRyYXJ5IHZhbHVlcyBjaG9zZW4gZm9yIHVzZSBhcyBzZXNzaW9uIElEcywgcGFydGljdWxhcmx5IGFzIGl0CiAgICAgY2FuIGJlIHVzZWZ1bCBmb3Igc2Vzc2lvbiBjYWNoaW5nIGluIG11bHRpcGxlLXNlcnZlciBlbnZpcm9ubWVudHMuIEEKICAgICBjb21tYW5kLWxpbmUgc3dpdGNoIGZvciB0ZXN0aW5nIHRoaXMgKGFuZCBhbnkgY2xpZW50IGNvZGUgdGhhdCB3aXNoZXMKICAgICB0byB1c2Ugc3VjaCBhIGZlYXR1cmUpIGhhcyBiZWVuIGFkZGVkIHRvICJzX3NlcnZlciIuCiAgICAgW0dlb2ZmIFRob3JwZSwgTHV0eiBKYWVuaWNrZV0KCiAgKikgTW9kaWZ5IG1rZGVmLnBsIHRvIHJlY29nbmlzZSBhbmQgcGFyc2UgcHJlcHJvY2Vzc29yIGNvbmRpdGlvbmFscwogICAgIG9mIHRoZSBmb3JtICcjaWYgZGVmaW5lZCguLi4pIHx8IGRlZmluZWQoLi4uKSB8fCAuLi4nIGFuZAogICAgICcjaWYgIWRlZmluZWQoLi4uKSAmJiAhZGVmaW5lZCguLi4pICYmIC4uLicuICBUaGlzIGFsc28gYXZvaWRzCiAgICAgdGhlIGdyb3dpbmcgbnVtYmVyIG9mIHNwZWNpYWwgY2FzZXMgaXQgd2FzIHByZXZpb3VzbHkgaGFuZGxpbmcuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBhbGwgY29uZmlndXJhdGlvbiBtYWNyb3MgYXZhaWxhYmxlIGZvciBhcHBsaWNhdGlvbiBieSBtYWtpbmcKICAgICBzdXJlIHRoZXkgYXJlIGF2YWlsYWJsZSBpbiBvcGVuc3NsY29uZi5oLCBieSBnaXZpbmcgdGhlbSBuYW1lcyBzdGFydGluZwogICAgIHdpdGggIk9QRU5TU0xfIiB0byBhdm9pZCBjb25mbGljdHMgd2l0aCBvdGhlciBwYWNrYWdlcyBhbmQgYnkgbWFraW5nCiAgICAgc3VyZSBlX29zMi5oIHdpbGwgY292ZXIgYWxsIHBsYXRmb3JtLXNwZWNpZmljIGNhc2VzIHRvZ2V0aGVyIHdpdGgKICAgICBvcGVuc3NsY29uZi5oLgogICAgIEFkZGl0aW9uYWxseSwgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGRlZmluZSBjb25maWd1cmF0aW9uL3BsYXRmb3JtLQogICAgIHNwZWNpZmljIG5hbWVzIChjYWxsZWQgInN5c3RlbSBpZGVudGl0aWVzIikuICBJbiB0aGUgQyBjb2RlLCB0aGVzZQogICAgIGFyZSBwcmVmaXhlZCB3aXRoICJPUEVOU1NMX1NZU05BTUVfIi4gIGVfb3MyLmggd2lsbCBjcmVhdGUgYW5vdGhlcgogICAgIG1hY3JvIHdpdGggdGhlIG5hbWUgYmVnaW5uaW5nIHdpdGggIk9QRU5TU0xfU1lTXyIsIHdoaWNoIGlzIGRldGVybWluZWQKICAgICBmcm9tICJPUEVOU1NMX1NZU05BTUVfKiIgb3IgY29tcGlsZXItc3BlY2lmaWMgbWFjcm9zIGRlcGVuZGluZyBvbgogICAgIHdoYXQgaXMgYXZhaWxhYmxlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBvcHRpb24gLXNldF9zZXJpYWwgdG8gJ3JlcScgYW5kICd4NTA5JyB0aGlzIGFsbG93cyB0aGUgc2VyaWFsCiAgICAgbnVtYmVyIHRvIHVzZSB0byBiZSBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gUHJldmlvdXNseSBzZWxmCiAgICAgc2lnbmVkIGNlcnRpZmljYXRlcyB3ZXJlIGhhcmQgY29kZWQgd2l0aCBzZXJpYWwgbnVtYmVyIDAgYW5kIHRoZSAKICAgICBDQSBvcHRpb25zIG9mICd4NTA5JyBoYWQgdG8gdXNlIGEgc2VyaWFsIG51bWJlciBpbiBhIGZpbGUgd2hpY2ggd2FzCiAgICAgYXV0byBpbmNyZW1lbnRlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgb3B0aW9ucyB0byAnY2EnIHV0aWxpdHkgdG8gc3VwcG9ydCBWMiBDUkwgZW50cnkgZXh0ZW5zaW9ucy4KICAgICBDdXJyZW50bHkgQ1JMIHJlYXNvbiwgaW52YWxpZGl0eSBkYXRlIGFuZCBob2xkIGluc3RydWN0aW9uIGFyZQogICAgIHN1cHBvcnRlZC4gQWRkIG5ldyBDUkwgZXh0ZW5zaW9ucyB0byBWMyBjb2RlIGFuZCBzb21lIG5ldyBvYmplY3RzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBFVlBfQ0lQSEVSX0NUWF9zZXRfcGFkZGluZygpIHRoaXMgaXMgdXNlZCB0bwogICAgIGRpc2FibGUgc3RhbmRhcmQgYmxvY2sgcGFkZGluZyAoYWthIFBLQ1MjNSBwYWRkaW5nKSBpbiB0aGUgRVZQCiAgICAgQVBJLCB3aGljaCB3YXMgcHJldmlvdXNseSBtYW5kYXRvcnkuIFRoaXMgbWVhbnMgdGhhdCB0aGUgZGF0YSBpcwogICAgIG5vdCBwYWRkZWQgaW4gYW55IHdheSBhbmQgc28gdGhlIHRvdGFsIGxlbmd0aCBtdWNoIGJlIGEgbXVsdGlwbGUKICAgICBvZiB0aGUgYmxvY2sgc2l6ZSwgb3RoZXJ3aXNlIGFuIGVycm9yIG9jY3Vycy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIChpbmNvbXBsZXRlKSBPQ1NQIFNTTCBzdXBwb3J0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBPQ1NQX3BhcnNlX3VybCgpLiBUaGlzIHNwbGl0cyB1cCBhIFVSTCBpbnRvIGl0cyBob3N0LAogICAgIHBvcnQgYW5kIHBhdGggY29tcG9uZW50czogcHJpbWFyaWx5IHRvIHBhcnNlIE9DU1AgVVJMcy4gTmV3IC11cmwKICAgICBvcHRpb24gdG8gb2NzcCB1dGlsaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBub25jZSBiZWhhdmlvci4gVGhlIHJldHVybiB2YWx1ZSBvZiBPQ1NQX2NoZWNrX25vbmNlKCkgbm93IAogICAgIHJlZmxlY3RzIHRoZSB2YXJpb3VzIGNoZWNrcyBwZXJmb3JtZWQuIEFwcGxpY2F0aW9ucyBjYW4gZGVjaWRlCiAgICAgd2hldGhlciB0byB0b2xlcmF0ZSBjZXJ0YWluIHNpdHVhdGlvbnMgc3VjaCBhcyBhbiBhYnNlbnQgbm9uY2UKICAgICBpbiBhIHJlc3BvbnNlIHdoZW4gb25lIHdhcyBwcmVzZW50IGluIGEgcmVxdWVzdDogdGhlIG9jc3AgYXBwbGljYXRpb24KICAgICBqdXN0IHByaW50cyBvdXQgYSB3YXJuaW5nLiBOZXcgZnVuY3Rpb24gT0NTUF9hZGQxX2Jhc2ljX25vbmNlKCkKICAgICB0aGlzIGlzIHRvIGFsbG93IHJlc3BvbmRlcnMgdG8gaW5jbHVkZSBhIG5vbmNlIGluIGEgcmVzcG9uc2UgZXZlbiBpZgogICAgIHRoZSByZXF1ZXN0IGlzIG5vbmNlLWxlc3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRGlzYWJsZSBzdGRpbiBidWZmZXJpbmcgaW4gbG9hZF9jZXJ0IChhcHBzL2FwcHMuYykgc28gdGhhdCBubyBjZXJ0cyBhcmUKICAgICBza2lwcGVkIHdoZW4gdXNpbmcgb3BlbnNzbCB4NTA5IG11bHRpcGxlIHRpbWVzIG9uIGEgc2luZ2xlIGlucHV0IGZpbGUsCiAgICAgZS5nLiAiKG9wZW5zc2wgeDUwOSAtb3V0IGNlcnQxOyBvcGVuc3NsIHg1MDkgLW91dCBjZXJ0MikgPGNlcnRzIi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIEFTTjFfVVRDVElNRV9zZXRfc3RyaW5nKCkgYW5kIEFTTjFfR0VORVJBTElaRURUSU1FX3NldF9zdHJpbmcoKQogICAgIHNldCBzdHJpbmcgdHlwZTogdG8gaGFuZGxlIHNldHRpbmcgQVNOMV9USU1FIHN0cnVjdHVyZXMuIEZpeCBjYQogICAgIHV0aWxpdHkgdG8gY29ycmVjdGx5IGluaXRpYWxpemUgcmV2b2NhdGlvbiBkYXRlIG9mIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbiBTU0xfT1BfQ0lQSEVSX1NFUlZFUl9QUkVGRVJFTkNFIGFsbG93cyB0aGUgc2VydmVyIHRvIG92ZXJyaWRlCiAgICAgdGhlIGNsaWVudHMgcHJlZmVycmVkIGNpcGhlcnN1aXRlcyBhbmQgcmF0aGVyIHVzZSBpdHMgb3duIHByZWZlcmVuY2VzLgogICAgIFNob3VsZCBoZWxwIHRvIHdvcmsgYXJvdW5kIE0kIFNHQyAoU2VydmVyIEdhdGVkIENyeXB0b2dyYXBoeSkgYnVnIGluCiAgICAgSW50ZXJuZXQgRXhwbG9yZXIgYnkgZW5zdXJpbmcgdW5jaGFuZ2VkIGhhc2ggbWV0aG9kIGR1cmluZyBzdGVwdXAuCiAgICAgKEFsc28gcmVwbGFjZXMgdGhlIGJyb2tlbi9kZWFjdGl2YXRlZCBTU0xfT1BfTk9OX0VYUE9SVF9GSVJTVCBvcHRpb24uKQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBNYWtlIG1rZGVmLnBsIHJlY29nbmlzZSBhbGwgREVDTEFSRV9BU04xIG1hY3JvcywgY2hhbmdlIHJpam5kYWVsCiAgICAgdG8gYWVzIGFuZCBhZGQgYSBuZXcgJ2V4aXN0JyBvcHRpb24gdG8gcHJpbnQgb3V0IHN5bWJvbHMgdGhhdCBkb24ndAogICAgIGFwcGVhciB0byBleGlzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRpdGlvbmFsIG9wdGlvbnMgdG8gb2NzcCB1dGlsaXR5IHRvIGFsbG93IGZsYWdzIHRvIGJlIHNldCBhbmQKICAgICBhZGRpdGlvbmFsIGNlcnRpZmljYXRlcyBzdXBwbGllZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdGhlIG9wdGlvbiAtVkFmaWxlIHRvICdvcGVuc3NsIG9jc3AnLCBzbyB0aGUgdXNlciBjYW4gZ2l2ZSB0aGUKICAgICBPQ1NQIGNsaWVudCBhIG51bWJlciBvZiBjZXJ0aWZpY2F0ZSB0byBvbmx5IHZlcmlmeSB0aGUgcmVzcG9uc2UKICAgICBzaWduYXR1cmUgYWdhaW5zdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBVcGRhdGUgUmlqbmRhZWwgY29kZSB0byB2ZXJzaW9uIDMuMCBhbmQgY2hhbmdlIEVWUCBBRVMgY2lwaGVycyB0bwogICAgIGhhbmRsZSB0aGUgbmV3IEFQSS4gQ3VycmVudGx5IG9ubHkgRUNCLCBDQkMgbW9kZXMgc3VwcG9ydGVkLiBBZGQgbmV3CiAgICAgQUVTIE9JRHMuCgogICAgIEFkZCBUTFMgQUVTIGNpcGhlcnN1aXRlcyBhcyBkZXNjcmliZWQgaW4gUkZDMzI2OCwgIkFkdmFuY2VkCiAgICAgRW5jcnlwdGlvbiBTdGFuZGFyZCAoQUVTKSBDaXBoZXJzdWl0ZXMgZm9yIFRyYW5zcG9ydCBMYXllcgogICAgIFNlY3VyaXR5IChUTFMpIi4gIChJbiBiZXRhIHZlcnNpb25zIG9mIE9wZW5TU0wgMC45LjcsIHRoZXNlIHdlcmUKICAgICBub3QgZW5hYmxlZCBieSBkZWZhdWx0IGFuZCB3ZXJlIG5vdCBwYXJ0IG9mIHRoZSAiQUxMIiBjaXBoZXJzdWl0ZQogICAgIGFsaWFzIGJlY2F1c2UgdGhleSB3ZXJlIG5vdCB5ZXQgb2ZmaWNpYWw7IHRoZXkgY291bGQgYmUKICAgICBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSBzcGVjaWZ5aW5nIHRoZSAiQUVTZHJhZnQiIGNpcGhlcnN1aXRlCiAgICAgZ3JvdXAgYWxpYXMuICBJbiB0aGUgZmluYWwgcmVsZWFzZSBvZiBPcGVuU1NMIDAuOS43LCB0aGUgZ3JvdXAKICAgICBhbGlhcyBpcyBjYWxsZWQgIkFFUyIgYW5kIGlzIHBhcnQgb2YgIkFMTCIuKQogICAgIFtCZW4gTGF1cmllLCBTdGV2ZSAgSGVuc29uLCBCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBPQ1NQX2NvcHlfbm9uY2UoKSB0byBjb3B5IG5vbmNlIHZhbHVlIChpZiBwcmVzZW50KSBmcm9tCiAgICAgcmVxdWVzdCB0byByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGdW5jdGlvbnMgZm9yIE9DU1AgcmVzcG9uZGVycy4gT0NTUF9yZXF1ZXN0X29uZXJlcV9jb3VudCgpLAogICAgIE9DU1BfcmVxdWVzdF9vbmVyZXFfZ2V0MCgpLCBPQ1NQX29uZXJlcV9nZXQwX2lkKCkgYW5kIE9DU1BfaWRfZ2V0MF9pbmZvKCkKICAgICBleHRyYWN0IGluZm9ybWF0aW9uIGZyb20gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0LiBPQ1NQX3Jlc3BvbnNlX2NyZWF0ZSgpCiAgICAgY3JlYXRlcyBhIHJlc3BvbnNlIGFuZCBvcHRpb25hbGx5IGFkZHMgYSBiYXNpYyByZXNwb25zZSBzdHJ1Y3R1cmUuCiAgICAgT0NTUF9iYXNpY19hZGQxX3N0YXR1cygpIGFkZHMgYSBjb21wbGV0ZSBzaW5nbGUgcmVzcG9uc2UgdG8gYSBiYXNpYwogICAgIHJlc3BvbnNlIGFuZCByZXR1cm5zIHRoZSBPQ1NQX1NJTkdMRVJFU1Agc3RydWN0dXJlIGp1c3QgYWRkZWQgKHRvIGFsbG93CiAgICAgZXh0ZW5zaW9ucyB0byBiZSBpbmNsdWRlZCBmb3IgZXhhbXBsZSkuIE9DU1BfYmFzaWNfYWRkMV9jZXJ0KCkgYWRkcyBhCiAgICAgY2VydGlmaWNhdGUgdG8gYSBiYXNpYyByZXNwb25zZSBhbmQgT0NTUF9iYXNpY19zaWduKCkgc2lnbnMgYSBiYXNpYwogICAgIHJlc3BvbnNlIHdpdGggdmFyaW91cyBmbGFncy4gTmV3IGhlbHBlciBmdW5jdGlvbnMgQVNOMV9USU1FX2NoZWNrKCkKICAgICAoY2hlY2tzIHZhbGlkaXR5IG9mIEFTTjFfVElNRSBzdHJ1Y3R1cmUpIGFuZCBBU04xX1RJTUVfdG9fZ2VuZXJhbGl6ZWR0aW1lKCkKICAgICAoY29udmVydHMgQVNOMV9USU1FIHRvIEdlbmVyYWxpemVkVGltZSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVmFyaW91cyBuZXcgZnVuY3Rpb25zLiBFVlBfRGlnZXN0KCkgY29tYmluZXMgRVZQX0RpZ2VzdHtJbml0LFVwZGF0ZSxGaW5hbH0oKQogICAgIGluIGEgc2luZ2xlIG9wZXJhdGlvbi4gWDUwOV9nZXQwX3B1YmtleV9iaXRzdHIoKSBleHRyYWN0cyB0aGUgcHVibGljX2tleQogICAgIHN0cnVjdHVyZSBmcm9tIGEgY2VydGlmaWNhdGUuIFg1MDlfcHVia2V5X2RpZ2VzdCgpIGRpZ2VzdHMgdGhlIHB1YmxpY19rZXkKICAgICBjb250ZW50czogdGhpcyBpcyB1c2VkIGluIHZhcmlvdXMga2V5IGlkZW50aWZpZXJzLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHNrX3NvcnQoKSB0b2xlcmF0ZSBhIE5VTEwgYXJndW1lbnQuCiAgICAgW1N0ZXZlIEhlbnNvbiByZXBvcnRlZCBieSBNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBjb211bmUubW9kZW5hLml0Pl0KCiAgKikgTmV3IE9DU1AgdmVyaWZ5IGZsYWcgT0NTUF9UUlVTVE9USEVSLiBXaGVuIHNldCB0aGUgIm90aGVyIiBjZXJ0aWZpY2F0ZXMKICAgICBwYXNzZWQgYnkgdGhlIGZ1bmN0aW9uIGFyZSB0cnVzdGVkIGltcGxpY2l0bHkuIElmIGFueSBvZiB0aGVtIHNpZ25lZCB0aGUKICAgICByZXNwb25zZSB0aGVuIGl0IGlzIGFzc3VtZWQgdG8gYmUgdmFsaWQgYW5kIGlzIG5vdCB2ZXJpZmllZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBQS0NTN19zZXRfdHlwZSgpIGluaXRpYWxpc2UgY29udGVudF90eXBlIGluIFBLQ1M3X0VOQ19DT05URU5UCiAgICAgdG8gZGF0YS4gVGhpcyB3YXMgcHJldmlvdXNseSBwYXJ0IG9mIHRoZSBQS0NTNyBBU04xIGNvZGUuIFRoaXMKICAgICB3YXMgY2F1c2luZyBwcm9ibGVtcyB3aXRoIE9wZW5TU0wgY3JlYXRlZCBQS0NTIzEyIGFuZCBQS0NTIzcgc3RydWN0dXJlcy4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBLZW5uZXRoIFIuIFJvYmluZXR0ZQoJCQkJPHN1cHBvcnRAc2VjdXJlbmV0dGVybS5jb20+XQoKICAqKSBBZGQgQ1JZUFRPX3B1c2hfaW5mbygpIGFuZCBDUllQVE9fcG9wX2luZm8oKSBjYWxscyB0byBuZXcgQVNOMQogICAgIHJvdXRpbmVzOiB3aXRob3V0IHRoZXNlIHRyYWNpbmcgbWVtb3J5IGxlYWtzIGlzIHZlcnkgcGFpbmZ1bC4KICAgICBGaXggbGVha3MgaW4gUEtDUzEyIGFuZCBQS0NTNyByb3V0aW5lcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFg1MDlfdGltZV9hZGooKSBjb3BlIHdpdGggdGhlIG5ldyBiZWhhdmlvdXIgb2YgQVNOMV9USU1FX25ldygpLgogICAgIFByZXZpb3VzbHkgaXQgaW5pdGlhbGlzZWQgdGhlICd0eXBlJyBhcmd1bWVudCB0byBWX0FTTjFfVVRDVElNRSB3aGljaAogICAgIGVmZmVjdGl2ZWx5IG1lYW50IEdlbmVyYWxpemVkVGltZSB3b3VsZCBuZXZlciBiZSB1c2VkLiBOb3cgaXQKICAgICBpcyBpbml0aWFsaXNlZCB0byAtMSBidXQgWDUwOV90aW1lX2FkaigpIG5vdyBoYXMgdG8gY2hlY2sgdGhlIHZhbHVlCiAgICAgYW5kIHVzZSBBU04xX1RJTUVfc2V0KCkgaWYgdGhlIHZhbHVlIGlzIG5vdCBWX0FTTjFfVVRDVElNRSBvcgogICAgIFZfQVNOMV9HRU5FUkFMSVpFRFRJTUUsIHdpdGhvdXQgdGhpcyBpdCBhbHdheXMgdXNlcyBHZW5lcmFsaXplZFRpbWUuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgS2VubmV0aCBSLiBSb2JpbmV0dGUKCQkJCTxzdXBwb3J0QHNlY3VyZW5ldHRlcm0uY29tPl0KCiAgKikgRml4ZXMgdG8gQk5fdG9fQVNOMV9JTlRFR0VSIHdoZW4gYm4gaXMgemVyby4gVGhpcyB3b3VsZCBwcmV2aW91c2x5CiAgICAgcmVzdWx0IGluIGEgemVybyBsZW5ndGggaW4gdGhlIEFTTjFfSU5URUdFUiBzdHJ1Y3R1cmUgd2hpY2ggd2FzCiAgICAgbm90IGNvbnNpc3RlbnQgd2l0aCB0aGUgc3RydWN0dXJlIHdoZW4gZDJpX0FTTjFfSU5URUdFUigpIHdhcyB1c2VkCiAgICAgYW5kIHdvdWxkIGNhdXNlIEFTTjFfSU5URUdFUl9jbXAoKSB0byBmYWlsLiBFbmhhbmNlIHMyaV9BU04xX0lOVEVHRVIoKQogICAgIHRvIGNvcGUgd2l0aCBoZXggYW5kIG5lZ2F0aXZlIGludGVnZXJzLiBGaXggYnVnIGluIGkyYV9BU04xX0lOVEVHRVIoKQogICAgIHdoZXJlIGl0IGRpZCBub3QgcHJpbnQgb3V0IGEgbWludXMgZm9yIG5lZ2F0aXZlIEFTTjFfSU5URUdFUi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VtbWFyeSBwcmludG91dCB0byBvY3NwIHV0aWxpdHkuIFRoZSB2YXJpb3VzIGZ1bmN0aW9ucyB3aGljaAogICAgIGNvbnZlcnQgc3RhdHVzIHZhbHVlcyB0byBzdHJpbmdzIGhhdmUgYmVlbiByZW5hbWVkIHRvOgogICAgIE9DU1BfcmVzcG9uc2Vfc3RhdHVzX3N0cigpLCBPQ1NQX2NlcnRfc3RhdHVzX3N0cigpIGFuZAogICAgIE9DU1BfY3JsX3JlYXNvbl9zdHIoKSBhbmQgYXJlIG5vIGxvbmdlciBzdGF0aWMuIE5ldyBvcHRpb25zCiAgICAgdG8gdmVyaWZ5IG5vbmNlIHZhbHVlcyBhbmQgdG8gZGlzYWJsZSB2ZXJpZmljYXRpb24uIE9DU1AgcmVzcG9uc2UKICAgICBwcmludG91dCBmb3JtYXQgY2xlYW5lZCB1cC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYWRkaXRpb25hbCBPQ1NQIGNlcnRpZmljYXRlIGNoZWNrcy4gVGhlc2UgYXJlIHRob3NlIHNwZWNpZmllZAogICAgIGluIFJGQzI1NjAuIFRoaXMgY29uc2lzdHMgb2YgdHdvIHNlcGFyYXRlIGNoZWNrczogdGhlIENBIG9mIHRoZQogICAgIGNlcnRpZmljYXRlIGJlaW5nIGNoZWNrZWQgbXVzdCBlaXRoZXIgYmUgdGhlIE9DU1Agc2lnbmVyIGNlcnRpZmljYXRlCiAgICAgb3IgdGhlIGlzc3VlciBvZiB0aGUgT0NTUCBzaWduZXIgY2VydGlmaWNhdGUuIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUKICAgICBPQ1NQIHNpZ25lciBjZXJ0aWZpY2F0ZSBtdXN0IGNvbnRhaW4gdGhlIE9DU1Agc2lnbmluZyBleHRlbmRlZCBrZXkKICAgICB1c2FnZS4gVGhpcyBjaGVjayBpcyBwZXJmb3JtZWQgYnkgYXR0ZW1wdGluZyB0byBtYXRjaCB0aGUgT0NTUAogICAgIHNpZ25lciBvciB0aGUgT0NTUCBzaWduZXIgQ0EgdG8gdGhlIGlzc3Vlck5hbWVIYXNoIGFuZCBpc3N1ZXJLZXlIYXNoCiAgICAgaW4gdGhlIE9DU1BfQ0VSVElEIHN0cnVjdHVyZXMgb2YgdGhlIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgT0NTUCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYWRkZWQgdG8gT0NTUF9iYXNpY192ZXJpZnkoKQogICAgIGFuZCByZWxhdGVkIHJvdXRpbmVzLiBUaGlzIHVzZXMgdGhlIHN0YW5kYXJkIE9wZW5TU0wgY2VydGlmaWNhdGUKICAgICB2ZXJpZnkgcm91dGluZXMgdG8gcGVyZm9ybSBpbml0aWFsIGNoZWNrcyAoanVzdCBDQSB2YWxpZGl0eSkgYW5kCiAgICAgdG8gb2J0YWluIHRoZSBjZXJ0aWZpY2F0ZSBjaGFpbi4gVGhlbiBhZGRpdGlvbmFsIGNoZWNrcyB3aWxsIGJlCiAgICAgcGVyZm9ybWVkIG9uIHRoZSBjaGFpbi4gQ3VycmVudGx5IHRoZSByb290IENBIGlzIGNoZWNrZWQgdG8gc2VlCiAgICAgaWYgaXQgaXMgZXhwbGljaXRseSB0cnVzdGVkIGZvciBPQ1NQIHNpZ25pbmcuIFRoaXMgaXMgdXNlZCB0byBzZXQKICAgICBhIHJvb3QgQ0EgYXMgYSBnbG9iYWwgc2lnbmluZyByb290OiB0aGF0IGlzIGFueSBjZXJ0aWZpY2F0ZSB0aGF0CiAgICAgY2hhaW5zIHRvIHRoYXQgQ0EgaXMgYW4gYWNjZXB0YWJsZSBPQ1NQIHNpZ25pbmcgY2VydGlmaWNhdGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3ICctZXh0ZmlsZSAuLi4nIG9wdGlvbiB0byAnb3BlbnNzbCBjYScgZm9yIHJlYWRpbmcgWC41MDl2MwogICAgIGV4dGVuc2lvbnMgZnJvbSBhIHNlcGFyYXRlIGNvbmZpZ3VyYXRpb24gZmlsZS4KICAgICBBcyB3aGVuIHJlYWRpbmcgZXh0ZW5zaW9ucyBmcm9tIHRoZSBtYWluIGNvbmZpZ3VyYXRpb24gZmlsZSwKICAgICB0aGUgJy1leHRlbnNpb25zIC4uLicgb3B0aW9uIG1heSBiZSB1c2VkIGZvciBzcGVjaWZ5aW5nIHRoZQogICAgIHNlY3Rpb24gdG8gdXNlLgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBjb211bmUubW9kZW5hLml0Pl0KCiAgKikgTmV3IE9DU1AgdXRpbGl0eS4gQWxsb3dzIE9DU1AgcmVxdWVzdHMgdG8gYmUgZ2VuZXJhdGVkIG9yCiAgICAgcmVhZC4gVGhlIHJlcXVlc3QgY2FuIGJlIHNlbnQgdG8gYSByZXNwb25kZXIgYW5kIHRoZSBvdXRwdXQKICAgICBwYXJzZWQsIG91dHB1dGVkIG9yIHByaW50ZWQgaW4gdGV4dCBmb3JtLiBOb3QgY29tcGxldGUgeWV0OgogICAgIHN0aWxsIG5lZWRzIHRvIGNoZWNrIHRoZSBPQ1NQIHJlc3BvbnNlIHZhbGlkaXR5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBzdWJjb21tYW5kcyBmb3IgJ29wZW5zc2wgY2EnOgogICAgICdvcGVuc3NsIGNhIC1zdGF0dXMgPHNlcmlhbD4nIHByaW50cyB0aGUgc3RhdHVzIG9mIHRoZSBjZXJ0IHdpdGgKICAgICB0aGUgZ2l2ZW4gc2VyaWFsIG51bWJlciAoYWNjb3JkaW5nIHRvIHRoZSBpbmRleCBmaWxlKS4KICAgICAnb3BlbnNzbCBjYSAtdXBkYXRlZGInIHVwZGF0ZXMgdGhlIGV4cGlyeSBzdGF0dXMgb2YgY2VydGlmaWNhdGVzCiAgICAgaW4gdGhlIGluZGV4IGZpbGUuCiAgICAgW01hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+XQoKICAqKSBOZXcgJy1uZXdyZXEtbm9kZXMnIGNvbW1hbmQgb3B0aW9uIHRvIENBLnBsLiAgVGhpcyBpcyBsaWtlCiAgICAgJy1uZXdyZXEnLCBidXQgY2FsbHMgJ29wZW5zc2wgcmVxJyB3aXRoIHRoZSAnLW5vZGVzJyBvcHRpb24KICAgICBzbyB0aGF0IHRoZSByZXN1bHRpbmcga2V5IGlzIG5vdCBlbmNyeXB0ZWQuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRqbUBtaW5kcm90Lm9yZz5dCgogICopIE5ldyBjb25maWd1cmF0aW9uIGZvciB0aGUgR05VIEh1cmQuCiAgICAgW0pvbmF0aGFuIEJhcnRsZXR0IDxqb2hubnliQHdvbGZyYW0uY29tPiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbml0aWFsIGNvZGUgdG8gaW1wbGVtZW50IE9DU1AgYmFzaWMgcmVzcG9uc2UgdmVyaWZ5LiBUaGlzCiAgICAgaXMgY3VycmVudGx5IGluY29tcGxldGUuIEN1cnJlbnRseSBqdXN0IGZpbmRzIHRoZSBzaWduZXIncwogICAgIGNlcnRpZmljYXRlIGFuZCB2ZXJpZmllcyB0aGUgc2lnbmF0dXJlIG9uIHRoZSByZXNwb25zZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgU1NMZWF5X3ZlcnNpb24gY29kZSBTU0xFQVlfRElSIHRvIGRldGVybWluZSB0aGUgY29tcGlsZWQtaW4KICAgICB2YWx1ZSBvZiBPUEVOU1NMRElSLiAgVGhpcyBpcyBhdmFpbGFibGUgdmlhIHRoZSBuZXcgJy1kJyBvcHRpb24KICAgICB0byAnb3BlbnNzbCB2ZXJzaW9uJywgYW5kIGlzIGFsc28gaW5jbHVkZWQgaW4gJ29wZW5zc2wgdmVyc2lvbiAtYScuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWxsb3dpbmcgZGVmaW5pbmcgbWVtb3J5IGFsbG9jYXRpb24gY2FsbGJhY2tzIHRoYXQgd2lsbCBiZSBnaXZlbgogICAgIGZpbGUgbmFtZSBhbmQgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gaW4gYWRkaXRpb25hbCBhcmd1bWVudHMKICAgICAoYSBjb25zdCBjaGFyKiBhbmQgYW4gaW50KS4gIFRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IHJlbWFpbnMsIGFzCiAgICAgd2VsbCBhcyB0aGUgb3JpZ2luYWwgcG9zc2liaWxpdHkgdG8ganVzdCByZXBsYWNlIG1hbGxvYygpLAogICAgIHJlYWxsb2MoKSBhbmQgZnJlZSgpIGJ5IGZ1bmN0aW9ucyB0aGF0IGRvIG5vdCBrbm93IGFib3V0IHRoZXNlCiAgICAgYWRkaXRpb25hbCBhcmd1bWVudHMuICBUbyByZWdpc3RlciBhbmQgZmluZCBvdXQgdGhlIGN1cnJlbnQKICAgICBzZXR0aW5ncyBmb3IgZXh0ZW5kZWQgYWxsb2NhdGlvbiBmdW5jdGlvbnMsIHRoZSBmb2xsb3dpbmcKICAgICBmdW5jdGlvbnMgYXJlIHByb3ZpZGVkOgoKCUNSWVBUT19zZXRfbWVtX2V4X2Z1bmN0aW9ucwoJQ1JZUFRPX3NldF9sb2NrZWRfbWVtX2V4X2Z1bmN0aW9ucwoJQ1JZUFRPX2dldF9tZW1fZXhfZnVuY3Rpb25zCglDUllQVE9fZ2V0X2xvY2tlZF9tZW1fZXhfZnVuY3Rpb25zCgogICAgIFRoZXNlIHdvcmsgdGhlIHNhbWUgd2F5IGFzIENSWVBUT19zZXRfbWVtX2Z1bmN0aW9ucyBhbmQgZnJpZW5kcy4KICAgICBDUllQVE9fZ2V0X1tsb2NrZWRfXW1lbV9mdW5jdGlvbnMgbm93IHdyaXRlcyAwIHdoZXJlIHN1Y2ggYW4KICAgICBleHRlbmRlZCBhbGxvY2F0aW9uIGZ1bmN0aW9uIGlzIGVuYWJsZWQuCiAgICAgU2ltaWxhcmx5LCBDUllQVE9fZ2V0X1tsb2NrZWRfXW1lbV9leF9mdW5jdGlvbnMgd3JpdGVzIDAgd2hlcmUKICAgICBhIGNvbnZlbnRpb25hbCBhbGxvY2F0aW9uIGZ1bmN0aW9uIGlzIGVuYWJsZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBGaW5pc2ggb2ZmIHJlbW92aW5nIHRoZSByZW1haW5pbmcgTEhBU0ggZnVuY3Rpb24gcG9pbnRlciBjYXN0cy4KICAgICBUaGVyZSBzaG91bGQgbm8gbG9uZ2VyIGJlIGFueSBwcm90b3R5cGUtY2FzdGluZyByZXF1aXJlZCB3aGVuIHVzaW5nCiAgICAgdGhlIExIQVNIIGFic3RyYWN0aW9uLCBhbmQgYW55IGNhc3RzIHRoYXQgcmVtYWluIGFyZSAiYnVncyIuIFNlZQogICAgIHRoZSBjYWxsYmFjayB0eXBlcyBhbmQgbWFjcm9zIGF0IHRoZSBoZWFkIG9mIGxoYXNoLmggZm9yIGRldGFpbHMKICAgICAoYW5kICJPQkpfY2xlYW51cCIgaW4gY3J5cHRvL29iamVjdHMvb2JqX2RhdC5jIGFzIGFuIGV4YW1wbGUpLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZCBhdXRvbWF0aWMgcXVlcnkgb2YgRUdEIHNvY2tldHMgaW4gUkFORF9wb2xsKCkgZm9yIHRoZSB1bml4IHZhcmlhbnQuCiAgICAgSWYgL2Rldi9bdV1yYW5kb20gZGV2aWNlcyBhcmUgbm90IGF2YWlsYWJsZSBvciBkbyBub3QgcmV0dXJuIGVub3VnaAogICAgIGVudHJvcHksIEVHRCBzdHlsZSBzb2NrZXRzIChzZXJ2ZWQgYnkgRUdEIG9yIFBSTkdEKSB3aWxsIGF1dG9tYXRpY2FsbHkKICAgICBiZSBxdWVyaWVkLgogICAgIFRoZSBsb2NhdGlvbnMgL3Zhci9ydW4vZWdkLXBvb2wsIC9kZXYvZWdkLXBvb2wsIC9ldGMvZWdkLXBvb2wsIGFuZAogICAgIC9ldGMvZW50cm9weSB3aWxsIGJlIHF1ZXJpZWQgb25jZSBlYWNoIGluIHRoaXMgc2VxdWVuY2UsIHF1ZXJpbmcgc3RvcHMKICAgICB3aGVuIGVub3VnaCBlbnRyb3B5IHdhcyBjb2xsZWN0ZWQgd2l0aG91dCBxdWVyeWluZyBtb3JlIHNvY2tldHMuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIENoYW5nZSB0aGUgVW5peCBSQU5EX3BvbGwoKSB2YXJpYW50IHRvIGJlIGFibGUgdG8gcG9sbCBzZXZlcmFsCiAgICAgcmFuZG9tIGRldmljZXMsIGFzIHNwZWNpZmllZCBieSBERVZSQU5ET00sIHVudGlsIGEgc3VmZmljaWVudCBhbW91bnQKICAgICBvZiBkYXRhIGhhcyBiZWVuIGNvbGxlY3RlZC4gICBXZSBzcGVuZCBhdCBtb3N0IDEwIG1zIG9uIGVhY2ggZmlsZQogICAgIChzZWxlY3QgdGltZW91dCkgYW5kIHJlYWQgaW4gbm9uLWJsb2NraW5nIG1vZGUuICBERVZSQU5ET00gbm93CiAgICAgZGVmYXVsdHMgdG8gdGhlIGxpc3QgIi9kZXYvdXJhbmRvbSIsICIvZGV2L3JhbmRvbSIsICIvZGV2L3NyYW5kb20iCiAgICAgKHByZXZpb3VzbHkgaXQgd2FzIGp1c3QgdGhlIHN0cmluZyAiL2Rldi91cmFuZG9tIiksIHNvIG9uIHR5cGljYWwKICAgICBwbGF0Zm9ybXMgdGhlIDEwIG1zIGRlbGF5IHdpbGwgbmV2ZXIgb2NjdXIuCiAgICAgQWxzbyBzZXBhcmF0ZSBvdXQgdGhlIFVuaXggdmFyaWFudCB0byBpdHMgb3duIGZpbGUsIHJhbmRfdW5peC5jLgogICAgIEZvciBWTVMsIHRoZXJlJ3MgYSBjdXJyZW50bHktZW1wdHkgcmFuZF92bXMuYy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNb3ZlIE9DU1AgY2xpZW50IHJlbGF0ZWQgcm91dGluZXMgdG8gb2NzcF9jbC5jLiBUaGVzZQogICAgIHByb3ZpZGUgdXRpbGl0eSBmdW5jdGlvbnMgd2hpY2ggYW4gYXBwbGljYXRpb24gbmVlZGluZwogICAgIHRvIGlzc3VlIGEgcmVxdWVzdCB0byBhbiBPQ1NQIHJlc3BvbmRlciBhbmQgYW5hbHlzZSB0aGUKICAgICByZXNwb25zZSB3aWxsIHR5cGljYWxseSBuZWVkOiBhcyBvcHBvc2VkIHRvIHRob3NlIHdoaWNoIGFuCiAgICAgT0NTUCByZXNwb25kZXIgaXRzZWxmIHdvdWxkIG5lZWQgd2hpY2ggd2lsbCBiZSBhZGRlZCBsYXRlci4KCiAgICAgT0NTUF9yZXF1ZXN0X3NpZ24oKSBzaWducyBhbiBPQ1NQIHJlcXVlc3Qgd2l0aCBhbiBBUEkgc2ltaWxhcgogICAgIHRvIFBLQ1M3X3NpZ24oKS4gT0NTUF9yZXNwb25zZV9zdGF0dXMoKSByZXR1cm5zIHN0YXR1cyBvZiBPQ1NQCiAgICAgcmVzcG9uc2UuIE9DU1BfcmVzcG9uc2VfZ2V0MV9iYXNpYygpIGV4dHJhY3RzIGJhc2ljIHJlc3BvbnNlCiAgICAgZnJvbSByZXNwb25zZS4gT0NTUF9yZXNwX2ZpbmRfc3RhdHVzKCk6IGZpbmRzIGFuZCBleHRyYWN0cyBzdGF0dXMKICAgICBpbmZvcm1hdGlvbiBmcm9tIGFuIE9DU1BfQ0VSVElEIHN0cnVjdHVyZSAod2hpY2ggd2lsbCBiZSBjcmVhdGVkCiAgICAgd2hlbiB0aGUgcmVxdWVzdCBzdHJ1Y3R1cmUgaXMgYnVpbHQpLiBUaGVzZSBhcmUgYnVpbHQgZnJvbSBsb3dlcgogICAgIGxldmVsIGZ1bmN0aW9ucyB3aGljaCB3b3JrIG9uIE9DU1BfU0lOR0xFUkVTUCBzdHJ1Y3R1cmVzIGJ1dAogICAgIHdvbnQgbm9ybWFsbHkgYmUgdXNlZCB1bmxlc3MgdGhlIGFwcGxpY2F0aW9uIHdpc2hlcyB0byBleGFtaW5lCiAgICAgZXh0ZW5zaW9ucyBpbiB0aGUgT0NTUCByZXNwb25zZSBmb3IgZXhhbXBsZS4KCiAgICAgUmVwbGFjZSBub25jZSByb3V0aW5lcyB3aXRoIGEgcGFpciBvZiBmdW5jdGlvbnMuCiAgICAgT0NTUF9yZXF1ZXN0X2FkZDFfbm9uY2UoKSBhZGRzIGEgbm9uY2UgdmFsdWUgYW5kIG9wdGlvbmFsbHkKICAgICBnZW5lcmF0ZXMgYSByYW5kb20gdmFsdWUuIE9DU1BfY2hlY2tfbm9uY2UoKSBjaGVja3MgdGhlCiAgICAgdmFsaWRpdHkgb2YgdGhlIG5vbmNlIGluIGFuIE9DU1AgcmVzcG9uc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIGZ1bmN0aW9uIE9DU1BfcmVxdWVzdF9hZGQoKSB0byBPQ1NQX3JlcXVlc3RfYWRkMF9pZCgpLgogICAgIFRoaXMgZG9lc24ndCBjb3B5IHRoZSBzdXBwbGllZCBPQ1NQX0NFUlRJRCBhbmQgYXZvaWRzIHRoZQogICAgIG5lZWQgdG8gZnJlZSB1cCB0aGUgbmV3bHkgY3JlYXRlZCBpZC4gQ2hhbmdlIHJldHVybiB0eXBlCiAgICAgdG8gT0NTUF9PTkVSRVEgdG8gcmV0dXJuIHRoZSBpbnRlcm5hbCBPQ1NQX09ORVJFUSBzdHJ1Y3R1cmUuCiAgICAgVGhpcyBjYW4gdGhlbiBiZSB1c2VkIHRvIGFkZCBleHRlbnNpb25zIHRvIHRoZSByZXF1ZXN0LgogICAgIERlbGV0ZWQgT0NTUF9yZXF1ZXN0X25ldygpLCBzaW5jZSBtb3N0IG9mIGl0cyBmdW5jdGlvbmFsaXR5CiAgICAgaXMgbm93IGluIE9DU1BfUkVRVUVTVF9uZXcoKSAoYW5kIHRoZSBjYXNlIGluc2Vuc2l0aXZlIG5hbWUKICAgICBjbGFzaCkgYXBhcnQgZnJvbSB0aGUgYWJpbGl0eSB0byBzZXQgdGhlIHJlcXVlc3QgbmFtZSB3aGljaAogICAgIHdpbGwgYmUgYWRkZWQgZWxzZXdoZXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFVwZGF0ZSBPQ1NQIEFQSS4gUmVtb3ZlIG9ic29sZXRlIGV4dGVuc2lvbnMgYXJndW1lbnQgZnJvbQogICAgIHZhcmlvdXMgZnVuY3Rpb25zLiBFeHRlbnNpb25zIGFyZSBub3cgaGFuZGxlZCB1c2luZyB0aGUgbmV3CiAgICAgT0NTUCBleHRlbnNpb24gY29kZS4gTmV3IHNpbXBsZSBPQ1NQIEhUVFAgZnVuY3Rpb24gd2hpY2ggCiAgICAgY2FuIGJlIHVzZWQgdG8gc2VuZCByZXF1ZXN0cyBhbmQgcGFyc2UgdGhlIHJlc3BvbnNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgUEtDUyM3IChTL01JTUUpIGNvZGUgdG8gd29yayB3aXRoIG5ldyBBU04xLiBUd28gbmV3CiAgICAgQVNOMV9JVEVNIHN0cnVjdHVyZXMgaGVscCB3aXRoIHNpZ24gYW5kIHZlcmlmeS4gUEtDUzdfQVRUUl9TSUdOCiAgICAgdXNlcyB0aGUgc3BlY2lhbCByZW9yZGVyIHZlcnNpb24gb2YgU0VUIE9GIHRvIHNvcnQgdGhlIGF0dHJpYnV0ZXMKICAgICBhbmQgcmVvcmRlciB0aGVtIHRvIG1hdGNoIHRoZSBlbmNvZGVkIG9yZGVyLiBUaGlzIHJlc29sdmVzIGEgbG9uZwogICAgIHN0YW5kaW5nIHByb2JsZW06IGEgdmVyaWZ5IG9uIGEgUEtDUzcgc3RydWN0dXJlIGp1c3QgYWZ0ZXIgc2lnbmluZwogICAgIGl0IHVzZWQgdG8gZmFpbCBiZWNhdXNlIHRoZSBhdHRyaWJ1dGUgb3JkZXIgZGlkIG5vdCBtYXRjaCB0aGUKICAgICBlbmNvZGVkIG9yZGVyLiBQS0NTN19BVFRSX1ZFUklGWSBkb2VzIG5vdCByZW9yZGVyIHRoZSBhdHRyaWJ1dGVzOgogICAgIGl0IHVzZXMgdGhlIHJlY2VpdmVkIG9yZGVyLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byB0b2xlcmF0ZSBzb21lIGJyb2tlbgogICAgIHNvZnR3YXJlIHRoYXQgZG9lcyBub3Qgb3JkZXIgU0VUIE9GLiBUaGlzIGlzIGhhbmRsZWQgYnkgZW5jb2RpbmcKICAgICBhcyBhIFNFUVVFTkNFIE9GIGJ1dCB1c2luZyBpbXBsaWNpdCB0YWdnaW5nICh3aXRoIFVOSVZFUlNBTCBjbGFzcykKICAgICB0byBwcm9kdWNlIHRoZSByZXF1aXJlZCBTRVQgT0YuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSGF2ZSBtazFtZi5wbCBnZW5lcmF0ZSB0aGUgbWFjcm9zIE9QRU5TU0xfQlVJTERfU0hMSUJDUllQVE8gYW5kCiAgICAgT1BFTlNTTF9CVUlMRF9TSExJQlNTTCBhbmQgdXNlIHRoZW0gYXBwcm9wcmlhdGVseSBpbiB0aGUgaGVhZGVyCiAgICAgZmlsZXMgdG8gZ2V0IGNvcnJlY3QgZGVjbGFyYXRpb25zIG9mIHRoZSBBU04uMSBpdGVtIHZhcmlhYmxlcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZXdyaXRlIG9mIFBLQ1MjMTIgY29kZSB0byB1c2UgbmV3IEFTTjEgZnVuY3Rpb25hbGl0eS4gUmVwbGFjZSBtYW55CiAgICAgUEtDUyMxMiBtYWNyb3Mgd2l0aCByZWFsIGZ1bmN0aW9ucy4gRml4IHR3byB1bnJlbGF0ZWQgQVNOMSBidWdzOgogICAgIGFzbjFfY2hlY2tfdGxlbigpIHdvdWxkIHNvbWV0aW1lcyBhdHRlbXB0IHRvIHVzZSAnY3R4JyB3aGVuIGl0IHdhcwogICAgIE5VTEwgYW5kIEFTTjFfVFlQRSB3YXMgbm90IGRlcmVmZXJlbmNlZCBwcm9wZXJseSBpbiBhc24xX2V4X2MyaSgpLgogICAgIE5ldyBBU04xIG1hY3JvOiBERUNMQVJFX0FTTjFfSVRFTSgpIHdoaWNoIGp1c3QgZGVjbGFyZXMgdGhlIHJlbGV2YW50CiAgICAgQVNOMV9JVEVNIGFuZCBubyB3cmFwcGVyIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIG9yIEFTTjFfaXRlbV9kMmlfZnAoKSBhbmQgQVNOMV9pdGVtX2QyaV9iaW8oKS4gVGhlc2UKICAgICByZXBsYWNlIHRoZSBvbGQgZnVuY3Rpb24gcG9pbnRlciBiYXNlZCBJL08gcm91dGluZXMuIENoYW5nZSBtb3N0IG9mCiAgICAgdGhlICpfZDJpX2JpbygpIGFuZCAqX2QyaV9mcCgpIGZ1bmN0aW9ucyB0byB1c2UgdGhlc2UuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRW5oYW5jZSBta2RlZi5wbCB0byBiZSBtb3JlIGFjY2VwdGluZyBhYm91dCBzcGFjaW5nIGluIEMgcHJlcHJvY2Vzc29yCiAgICAgbGluZXMsIHJlY29nbmljZSBtb3JlICJhbGdvcml0aG1zIiB0aGF0IGNhbiBiZSBkZXNlbGVjdGVkLCBhbmQgbWFrZQogICAgIGl0IGNvbXBsYWluIGFib3V0IGFsZ29yaXRobSBkZXNlbGVjdGlvbiB0aGF0IGlzbid0IHJlY29nbmlzZWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTmV3IEFTTjEgZnVuY3Rpb25zIHRvIGhhbmRsZSBkdXAsIHNpZ24sIHZlcmlmeSwgZGlnZXN0LCBwYWNrIGFuZAogICAgIHVucGFjayBvcGVyYXRpb25zIGluIHRlcm1zIG9mIEFTTjFfSVRFTS4gTW9kaWZ5IGV4aXN0aW5nIHdyYXBwZXJzCiAgICAgdG8gdXNlIG5ldyBmdW5jdGlvbnMuIEFkZCBOT19BU04xX09MRCB3aGljaCBjYW4gYmUgc2V0IHRvIHJlbW92ZQogICAgIHNvbWUgb2xkIHN0eWxlIEFTTjEgZnVuY3Rpb25zOiB0aGlzIGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZiBvbGQKICAgICBjb2RlIHdpbGwgc3RpbGwgd29yayB3aGVuIHRoZXNlIGV2ZW50dWFsbHkgZ28gYXdheS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZXh0ZW5zaW9uIGZ1bmN0aW9ucyBmb3IgT0NTUCBzdHJ1Y3R1cmVzLCB0aGVzZSBmb2xsb3cgdGhlCiAgICAgc2FtZSBjb252ZW50aW9ucyBhcyBjZXJ0aWZpY2F0ZXMgYW5kIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlWM19hZGQxX2kyZCgpLiBUaGlzIGF1dG9tYXRpY2FsbHkgZW5jb2RlcyBhbmQKICAgICBhZGRzIGFuIGV4dGVuc2lvbi4gSXRzIGJlaGF2aW91ciBjYW4gYmUgY3VzdG9taXNlZCB3aXRoIHZhcmlvdXMKICAgICBmbGFncyB0byBhcHBlbmQsIHJlcGxhY2Ugb3IgZGVsZXRlLiBWYXJpb3VzIHdyYXBwZXJzIGFkZGVkIGZvcgogICAgIGNlcnRpZmNhdGVzIGFuZCBDUkxzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0byBhdm9pZCBjYWxsaW5nIHRoZSB1bmRlcmx5aW5nIEFTTjEgcHJpbnQgcm91dGluZSB3aGVuCiAgICAgYW4gZXh0ZW5zaW9uIGNhbm5vdCBiZSBwYXJzZWQuIENvcnJlY3QgYSB0eXBvIGluIHRoZQogICAgIE9DU1BfU0VSVklDRUxPQyBleHRlbnNpb24uIFRpZHkgdXAgcHJpbnQgT0NTUCBmb3JtYXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBta2RlZi5wbCBwYXJzZSBzb21lIG9mIHRoZSBBU04xIG1hY3JvcyBhbmQgYWRkIGFwcm9wcmlhdGUKICAgICBlbnRyaWVzIGZvciB2YXJpYWJsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9uYWxpdHkgdG8gYXBwcy9vcGVuc3NsLmMgZm9yIGRldGVjdGluZyBsb2NraW5nCiAgICAgcHJvYmxlbXM6IEFzIHRoZSBwcm9ncmFtIGlzIHNpbmdsZS10aHJlYWRlZCwgYWxsIHdlIGhhdmUKICAgICB0byBkbyBpcyByZWdpc3RlciBhIGxvY2tpbmcgY2FsbGJhY2sgdXNpbmcgYW4gYXJyYXkgZm9yCiAgICAgc3RvcmluZyB3aGljaCBsb2NrcyBhcmUgY3VycmVudGx5IGhlbGQgYnkgdGhlIHByb2dyYW0uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXNlIGEgbG9jayBhcm91bmQgdGhlIGNhbGwgdG8gQ1JZUFRPX2dldF9leF9uZXdfaW5kZXgoKSBpbgogICAgIFNTTF9nZXRfZXhfZGF0YV9YNTA5X1NUT1JFX2lkeCgpLCB3aGljaCBpcyB1c2VkIGluCiAgICAgc3NsX3ZlcmlmeV9jZXJ0X2NoYWluKCkgYW5kIHRodXMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZQogICAgIGR1cmluZyBUTFMvU1NMIGhhbmRzaGFrZXMgc28gdGhhdCB0aHJlYWQtc2FmZXR5IGlzIGVzc2VudGlhbC4KICAgICBVbmZvcnR1bmF0ZWx5LCB0aGUgZXhfZGF0YSBkZXNpZ24gaXMgbm90IGF0IGFsbCBzdWl0ZWQKICAgICBmb3IgbXVsdGktdGhyZWFkZWQgdXNlLCBzbyBpdCBwcm9iYWJseSBzaG91bGQgYmUgYWJvbGlzaGVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZGVkIEJyb2FkY29tICJ1YnNlYyIgRU5HSU5FIHRvIE9wZW5TU0wuCiAgICAgW0Jyb2FkY29tLCB0d2Vha2VkIGFuZCBpbnRlZ3JhdGVkIGJ5IEdlb2ZmIFRob3JwZV0KCiAgKikgTW92ZSBjb21tb24gZXh0ZW5zaW9uIHByaW50aW5nIGNvZGUgdG8gbmV3IGZ1bmN0aW9uCiAgICAgWDUwOVYzX3ByaW50X2V4dGVuc2lvbnMoKS4gUmVvcmdhbmlzZSBPQ1NQIHByaW50IHJvdXRpbmVzIGFuZAogICAgIGltcGxlbWVudCBzb21lIG5lZWRlZCBPQ1NQIEFTTjEgZnVuY3Rpb25zLiBBZGQgT0NTUCBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X3NpZ25hdHVyZV9wcmludCgpIHRvIHJlbW92ZSBkdXBsaWNhdGlvbiBpbiBzb21lCiAgICAgcHJpbnQgcm91dGluZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgc3BlY2lhbCBtZWFuaW5nIHdoZW4gU0VUIE9GIGFuZCBTRVFVRU5DRSBPRiBmbGFncyBhcmUgYm90aAogICAgIHNldCAodGhpcyB3YXMgdHJlYXRlZCBleGFjdGx5IHRoZSBzYW1lIGFzIFNFVCBPRiBwcmV2aW91c2x5KS4gVGhpcwogICAgIGlzIHVzZWQgdG8gcmVvcmRlciB0aGUgU1RBQ0sgcmVwcmVzZW50aW5nIHRoZSBzdHJ1Y3R1cmUgdG8gbWF0Y2ggdGhlCiAgICAgZW5jb2RpbmcuIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGdldCByb3VuZCBhIHByb2JsZW0gd2hlcmUgYSBQS0NTNwogICAgIHN0cnVjdHVyZSB3aGljaCB3YXMgc2lnbmVkIGNvdWxkIG5vdCBiZSB2ZXJpZmllZCBiZWNhdXNlIHRoZSBTVEFDSwogICAgIG9yZGVyIGRpZCBub3QgcmVmbGVjdCB0aGUgZW5jb2RlZCBvcmRlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZWltcGxlbWVudCB0aGUgT0NTUCBBU04xIG1vZHVsZSB1c2luZyB0aGUgbmV3IGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlIHRoZSBYNTA5VjMgY29kZSB0byBwZXJtaXQgdGhlIHVzZSBvZiBhbiBBU04xX0lURU0gc3RydWN0dXJlCiAgICAgZm9yIGl0cyBBU04xIG9wZXJhdGlvbnMuIFRoZSBvbGQgc3R5bGUgZnVuY3Rpb24gcG9pbnRlcnMgc3RpbGwgZXhpc3QKICAgICBmb3Igbm93IGJ1dCB0aGV5IHdpbGwgZXZlbnR1YWxseSBnbyBhd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1lcmdlIGluIHJlcGxhY2VtZW50IEFTTjEgY29kZSBmcm9tIHRoZSBBU04xIGJyYW5jaC4gVGhpcyBhbG1vc3QKICAgICBjb21wbGV0ZWx5IHJlcGxhY2VzIHRoZSBvbGQgQVNOMSBmdW5jdGlvbmFsaXR5IHdpdGggYSB0YWJsZSBkcml2ZW4KICAgICBlbmNvZGVyIGFuZCBkZWNvZGVyIHdoaWNoIGludGVycHJldHMgYW4gQVNOMV9JVEVNIHN0cnVjdHVyZSBkZXNjcmliaW5nCiAgICAgdGhlIEFTTjEgbW9kdWxlLiBDb21wYXRpYmlsaXR5IHdpdGggdGhlIGV4aXN0aW5nIEFTTjEgQVBJIChpMmQsZDJpKSBpcwogICAgIGxhcmdlbHkgbWFpbnRhaW5lZC4gQWxtb3N0IGFsbCBvZiB0aGUgb2xkIGFzbjFfbWFjLmggbWFjcm8gYmFzZWQgQVNOMQogICAgIGhhcyBhbHNvIGJlZW4gY29udmVydGVkIHRvIHRoZSBuZXcgZm9ybS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgQk5fbW9kX2V4cF9yZWNwIHNvIHRoYXQgbmVnYXRpdmUgbW9kdWxpIGFyZSB0b2xlcmF0ZWQKICAgICAodGhlIHNpZ24gaXMgaWdub3JlZCkuICBTaW1pbGFybHksIGlnbm9yZSB0aGUgc2lnbiBpbiBCTl9NT05UX0NUWF9zZXQKICAgICBzbyB0aGF0IEJOX21vZF9leHBfbW9udCBhbmQgQk5fbW9kX2V4cF9tb250X3dvcmQgd29yawogICAgIGZvciBuZWdhdGl2ZSBtb2R1bGkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IEJOX3VhZGQgYW5kIEJOX3VzdWI6IEFsd2F5cyByZXR1cm4gbm9uLW5lZ2F0aXZlIHJlc3VsdHMgaW5zdGVhZAogICAgIG9mIG5vdCB0b3VjaGluZyB0aGUgcmVzdWx0J3Mgc2lnbiBiaXQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQk5fZGl2IGJ1Z2ZpeDogSWYgdGhlIHJlc3VsdCBpcyAwLCB0aGUgc2lnbiAocmVzLT5uZWcpIG11c3Qgbm90IGJlCiAgICAgc2V0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZWQgdGhlIExIQVNIIGNvZGUgdG8gdXNlIHByb3RvdHlwZXMgZm9yIGNhbGxiYWNrcywgYW5kIGNyZWF0ZWQKICAgICBtYWNyb3MgdG8gZGVjbGFyZSBhbmQgaW1wbGVtZW50IHRoaW4gKG9wdGlvbmFsbHkgc3RhdGljKSBmdW5jdGlvbnMKICAgICB0aGF0IHByb3ZpZGUgdHlwZS1zYWZldHkgYW5kIGF2b2lkIGZ1bmN0aW9uIHBvaW50ZXIgY2FzdGluZyBmb3IgdGhlCiAgICAgdHlwZS1zcGVjaWZpYyBjYWxsYmFja3MuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgQWRkZWQgS2VyYmVyb3MgQ2lwaGVyIFN1aXRlcyB0byBiZSB1c2VkIHdpdGggVExTLCBhcyB3cml0dGVuIGluCiAgICAgUkZDIDI3MTIuCiAgICAgW1ZlZXJzIFN0YWF0cyA8c3RhYXRzdnJAYXNjLmhwYy5taWw+LAogICAgICBKZWZmcmV5IEFsdG1hbiA8amFsdG1hbkBjb2x1bWJpYS5lZHU+LCB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBSZWZvcm1hdCB0aGUgRkFRIHNvIHRoZSBkaWZmZXJlbnQgcXVlc3Rpb25zIGFuZCBhbnN3ZXJzIGNhbiBiZSBkaXZpZGVkCiAgICAgaW4gc2VjdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBzdWJqZWN0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEhhdmUgdGhlIHpsaWIgY29tcHJlc3Npb24gY29kZSBsb2FkIFpMSUIuRExMIGR5bmFtaWNhbGx5IHVuZGVyCiAgICAgV2luZG93cy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXcgZnVuY3Rpb24gQk5fbW9kX3NxcnQgZm9yIGNvbXB1dGluZyBzcXVhcmUgcm9vdHMgbW9kdWxvIGEgcHJpbWUKICAgICAodXNpbmcgdGhlIHByb2JhYmlsaXN0aWMgVG9uZWxsaS1TaGFua3MgYWxnb3JpdGhtIHVubGVzcwogICAgIHAgPT0gMyAobW9kIDQpICBvciAgcCA9PSA1IChtb2QgOCksICB3aGljaCBhcmUgY2FzZXMgdGhhdCBjYW4KICAgICBiZSBoYW5kbGVkIGRldGVybWluaXN0aWNhbGx5KS4KICAgICBbTGVua2EgRmliaWtvdmEgPGZpYmlrb3ZhQGV4cC1tYXRoLnVuaS1lc3Nlbi5kZT4sIEJvZG8gTW9lbGxlcl0KCiAgKikgTWFrZSBCTl9tb2RfaW52ZXJzZSBmYXN0ZXIgYnkgZXhwbGljaXRseSBoYW5kbGluZyBzbWFsbCBxdW90aWVudHMKICAgICBpbiB0aGUgRXVjbGlkIGxvb3AuIChTcGVlZCBnYWluIGFib3V0IDIwJSBmb3Igc21hbGwgbW9kdWxpIFsyNTYgb3IKICAgICA1MTIgYml0c10sIGFib3V0IDMwJSBmb3IgbGFyZ2VyIG9uZXMgWzEwMjQgb3IgMjA0OCBiaXRzXS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX2tyb25lY2tlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggQk5fZ2NkIHNvIHRoYXQgaXQgd29ya3Mgb24gbmVnYXRpdmUgaW5wdXRzOyB0aGUgcmVzdWx0IGlzCiAgICAgcG9zaXRpdmUgdW5sZXNzIGJvdGggcGFyYW1ldGVycyBhcmUgemVyby4KICAgICBQcmV2aW91c2x5IHNvbWV0aGluZyByZWFzb25hYmx5IGNsb3NlIHRvIGFuIGluZmluaXRlIGxvb3Agd2FzCiAgICAgcG9zc2libGUgYmVjYXVzZSBudW1iZXJzIGNvdWxkIGJlIGdyb3dpbmcgaW5zdGVhZCBvZiBzaHJpbmtpbmcKICAgICBpbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgRXVjbGlkJ3MgYWxnb3JpdGhtLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBCTl9pc193b3JkKCkgYW5kIEJOX2lzX29uZSgpIG1hY3JvcyB0byB0YWtlIGludG8gYWNjb3VudCB0aGUKICAgICBzaWduIG9mIHRoZSBudW1iZXIgaW4gcXVlc3Rpb24uCgogICAgIEZpeCBCTl9pc193b3JkKGEsdykgdG8gd29yayBjb3JyZWN0bHkgZm9yIHcgPT0gMC4KCiAgICAgVGhlIG9sZCBCTl9pc193b3JkKGEsdykgbWFjcm8gaXMgbm93IGNhbGxlZCBCTl9hYnNfaXNfd29yZChhLHcpCiAgICAgYmVjYXVzZSBpdHMgdGVzdCBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgJ2EnIGVxdWFscyAndycuCiAgICAgTm90ZSB0aGF0IEJOX2Fic19pc193b3JkIGRvZXMgKm5vdCogaGFuZGxlIHcgPT0gMCByZWxpYWJseTsKICAgICBpdCBleGlzdHMgbW9zdGx5IGZvciB1c2UgaW4gdGhlIGltcGxlbWVudGF0aW9ucyBvZiBCTl9pc196ZXJvKCksCiAgICAgQk5faXNfb25lKCksIGFuZCBCTl9pc193b3JkKCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX3N3YXAuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXNlIEJOX25ubW9kIGluc3RlYWQgb2YgQk5fbW9kIGluIGNyeXB0by9ibi9ibl9leHAuYyBzbyB0aGF0CiAgICAgdGhlIGV4cG9uZW50aWF0aW9uIGZ1bmN0aW9ucyBhcmUgbW9yZSBsaWtlbHkgdG8gcHJvZHVjZSByZWFzb25hYmxlCiAgICAgcmVzdWx0cyBvbiBuZWdhdGl2ZSBpbnB1dHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIEJOX21vZF9tdWwgc28gdGhhdCB0aGUgcmVzdWx0IGlzIGFsd2F5cyBub24tbmVnYXRpdmUuCiAgICAgUHJldmlvdXNseSwgaXQgY291bGQgYmUgbmVnYXRpdmUgaWYgb25lIG9mIHRoZSBmYWN0b3JzIHdhcyBuZWdhdGl2ZTsKICAgICBJIGRvbid0IHRoaW5rIGFueW9uZSByZWFsbHkgd2FudGVkIHRoYXQgYmVoYXZpb3VyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vdmUgQk5fbW9kXy4uLiBmdW5jdGlvbnMgaW50byBuZXcgZmlsZSBjcnlwdG8vYm4vYm5fbW9kLmMKICAgICAoZXhjZXB0IGZvciBleHBvbmVudGlhdGlvbiwgd2hpY2ggc3RheXMgaW4gY3J5cHRvL2JuL2JuX2V4cC5jLAogICAgIGFuZCBCTl9tb2RfbXVsX3JlY2lwcm9jYWwsIHdoaWNoIHN0YXlzIGluIGNyeXB0by9ibi9ibl9yZWNwLmMpCiAgICAgYW5kIGFkZCBuZXcgZnVuY3Rpb25zOgoKICAgICAgICAgIEJOX25ubW9kCiAgICAgICAgICBCTl9tb2Rfc3FyCiAgICAgICAgICBCTl9tb2RfYWRkCiAgICAgICAgICBCTl9tb2RfYWRkX3F1aWNrCiAgICAgICAgICBCTl9tb2Rfc3ViCiAgICAgICAgICBCTl9tb2Rfc3ViX3F1aWNrCiAgICAgICAgICBCTl9tb2RfbHNoaWZ0MQogICAgICAgICAgQk5fbW9kX2xzaGlmdDFfcXVpY2sKICAgICAgICAgIEJOX21vZF9sc2hpZnQKICAgICAgICAgIEJOX21vZF9sc2hpZnRfcXVpY2sKCiAgICAgVGhlc2UgZnVuY3Rpb25zIGFsd2F5cyBnZW5lcmF0ZSBub24tbmVnYXRpdmUgcmVzdWx0cy4KCiAgICAgQk5fbm5tb2Qgb3RoZXJ3aXNlIGlzIGxpa2UgQk5fbW9kIChpZiBCTl9tb2QgY29tcHV0ZXMgYSByZW1haW5kZXIgIHIKICAgICBzdWNoIHRoYXQgIHxtfCA8IHIgPCAwLCAgQk5fbm5tb2Qgd2lsbCBvdXRwdXQgIHJlbSArIHxtfCAgaW5zdGVhZCkuCgogICAgIEJOX21vZF9YWFhfcXVpY2sociwgYSwgW2IsXSBtKSBnZW5lcmF0ZXMgdGhlIHNhbWUgcmVzdWx0IGFzCiAgICAgQk5fbW9kX1hYWChyLCBhLCBbYixdIG0sIGN0eCksIGJ1dCByZXF1aXJlcyB0aGF0ICBhICBbYW5kICBiXQogICAgIGJlIHJlZHVjZWQgbW9kdWxvICBtLgogICAgIFtMZW5rYSBGaWJpa292YSA8ZmliaWtvdmFAZXhwLW1hdGgudW5pLWVzc2VuLmRlPiwgQm9kbyBNb2VsbGVyXQoKI2lmIDAKICAgICBUaGUgZm9sbG93aW5nIGVudHJ5IGFjY2lkZW50aWx5IGFwcGVhcmVkIGluIHRoZSBDSEFOR0VTIGZpbGUKICAgICBkaXN0cmlidXRlZCB3aXRoIE9wZW5TU0wgMC45LjcuICBUaGUgbW9kaWZpY2F0aW9ucyBkZXNjcmliZWQgaW4KICAgICBpdCBkbyAqbm90KiBhcHBseSB0byBPcGVuU1NMIDAuOS43LgoKICAqKSBSZW1vdmUgYSBmZXcgY2FsbHMgdG8gYm5fd2V4cGFuZCgpIGluIEJOX3NxcigpICh0aGUgb25lIGluIHRoZXJlCiAgICAgd2FzIGFjdHVhbGx5IG5ldmVyIG5lZWRlZCkgYW5kIGluIEJOX211bCgpLiAgVGhlIHJlbW92YWwgaW4gQk5fbXVsKCkKICAgICByZXF1aXJlZCBhIHNtYWxsIGNoYW5nZSBpbiBibl9tdWxfcGFydF9yZWN1cnNpdmUoKSBhbmQgdGhlIGFkZGl0aW9uCiAgICAgb2YgdGhlIGZ1bmN0aW9ucyBibl9jbXBfcGFydF93b3JkcygpLCBibl9zdWJfcGFydF93b3JkcygpIGFuZAogICAgIGJuX2FkZF9wYXJ0X3dvcmRzKCksIHdoaWNoIGRvIHRoZSBzYW1lIHRoaW5nIGFzIGJuX2NtcF93b3JkcygpLAogICAgIGJuX3N1Yl93b3JkcygpIGFuZCBibl9hZGRfd29yZHMoKSBleGNlcHQgdGhleSB0YWtlIGFycmF5cyB3aXRoCiAgICAgZGlmZmVyaW5nIHNpemVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCiNlbmRpZgoKICAqKSBJbiAnb3BlbnNzbCBwYXNzd2QnLCB2ZXJpZnkgcGFzc3dvcmRzIHJlYWQgZnJvbSB0aGUgdGVybWluYWwKICAgICB1bmxlc3MgdGhlICctc2FsdCcgb3B0aW9uIGlzIHVzZWQgKHdoaWNoIHVzdWFsbHkgbWVhbnMgdGhhdAogICAgIHZlcmlmaWNhdGlvbiB3b3VsZCBqdXN0IHdhc3RlIHVzZXIncyB0aW1lIHNpbmNlIHRoZSByZXN1bHRpbmcKICAgICBoYXNoIGlzIGdvaW5nIHRvIGJlIGNvbXBhcmVkIHdpdGggc29tZSBnaXZlbiBwYXNzd29yZCBoYXNoKQogICAgIG9yIHRoZSBuZXcgJy1ub3ZlcmlmeScgb3B0aW9uIGlzIHVzZWQuCgogICAgIFRoaXMgaXMgYW4gaW5jb21wYXRpYmxlIGNoYW5nZSwgYnV0IGl0IGRvZXMgbm90IGFmZmVjdAogICAgIG5vbi1pbnRlcmFjdGl2ZSB1c2Ugb2YgJ29wZW5zc2wgcGFzc3dkJyAocGFzc3dvcmRzIG9uIHRoZSBjb21tYW5kCiAgICAgbGluZSwgJy1zdGRpbicgb3B0aW9uLCAnLWluIC4uLicgb3B0aW9uKSBhbmQgdGh1cyBzaG91bGQgbm90CiAgICAgY2F1c2UgYW55IHByb2JsZW1zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBSU0FyZWYsIHNpbmNlIHRoZXJlJ3Mgbm8gbW9yZSBuZWVkIGZvciBpdC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIERTTyBsb2FkIGFsb25nIGEgcGF0aCBnaXZlbiB0aHJvdWdoIGFuIGVudmlyb25tZW50IHZhcmlhYmxlCiAgICAgKFNITElCX1BBVEgpIHdpdGggc2hsX2xvYWQoKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDb25zdGlmeSB0aGUgRU5HSU5FIGNvZGUgYXMgYSByZXN1bHQgb2YgQklHTlVNIGNvbnN0aWZpY2F0aW9uLgogICAgIEFsc28gY29uc3RpZnkgdGhlIFJTQSBjb2RlIGFuZCBtb3N0IHRoaW5ncyByZWxhdGVkIHRvIGl0LiAgSW4gYQogICAgIGZldyBwbGFjZXMsIG1vc3Qgbm90YWJsZSBpbiB0aGUgZGVwdGggb2YgdGhlIEFTTi4xIGNvZGUsIHVnbHkKICAgICBjYXN0cyBiYWNrIHRvIG5vbi1jb25zdCB3ZXJlIHJlcXVpcmVkICh0byBiZSBzb2x2ZWQgYXQgYSBsYXRlcgogICAgIHRpbWUpCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSBpdCBzbyB0aGUgb3BlbnNzbCBhcHBsaWNhdGlvbiBoYXMgYWxsIGVuZ2luZXMgbG9hZGVkIGJ5IGRlZmF1bHQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQ29uc3RpZnkgdGhlIEJJR05VTSByb3V0aW5lcyBhIGxpdHRsZSBtb3JlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKCglFTkdJTkVfbG9hZF9jc3dpZnQoKQoJRU5HSU5FX2xvYWRfY2hpbCgpCglFTkdJTkVfbG9hZF9hdGFsbGEoKQoJRU5HSU5FX2xvYWRfbnVyb24oKQoJRU5HSU5FX2xvYWRfYnVpbHRpbl9lbmdpbmVzKCkKCiAgICAgVGhhdCB3YXksIGFuIGFwcGxpY2F0aW9uIGNhbiBpdHNlbGYgY2hvb3NlIGlmIGV4dGVybmFsIGVuZ2luZXMgdGhhdAogICAgIGFyZSBidWlsdC1pbiBpbiBPcGVuU1NMIHNoYWxsIGV2ZXIgYmUgdXNlZCBvciBub3QuICBUaGUgYmVuZWZpdCBpcwogICAgIHRoYXQgYXBwbGljYXRpb25zIHdvbid0IGhhdmUgdG8gYmUgbGlua2VkIHdpdGggbGliZGwgb3Igb3RoZXIgZHNvCiAgICAgbGlicmFyaWVzIHVubGVzcyBpdCdzIHJlYWxseSBuZWVkZWQuCgogICAgIENoYW5nZWQgJ29wZW5zc2wgZW5naW5lJyB0byBsb2FkIGFsbCBlbmdpbmVzIG9uIGRlbWFuZC4KICAgICBDaGFuZ2VkIHRoZSBlbmdpbmUgaGVhZGVyIGZpbGVzIHRvIGF2b2lkIHRoZSBkdXBsaWNhdGlvbiBvZiBzb21lCiAgICAgZGVjbGFyYXRpb25zICh0aGV5IGRpZmZlcmVkISkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgJ29wZW5zc2wgZW5naW5lJyBjYW4gbm93IGxpc3QgY2FwYWJpbGl0aWVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEJldHRlciBlcnJvciByZXBvcnRpbmcgaW4gJ29wZW5zc2wgZW5naW5lJy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBOZXZlciBjYWxsIGxvYWRfZGhfcGFyYW0oTlVMTCkgaW4gc19zZXJ2ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGVuZ2luZSBhcHBsaWNhdGlvbi4gIEl0IGNhbiBjdXJyZW50bHkgbGlzdCBlbmdpbmVzIGJ5IG5hbWUgYW5kCiAgICAgaWRlbnRpdHksIGFuZCB0ZXN0IGlmIHRoZXkgYXJlIGFjdHVhbGx5IGF2YWlsYWJsZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbXByb3ZlIFJQTSBzcGVjaWZpY2F0aW9uIGZpbGUgYnkgZm9yY2luZyBzeW1ib2xpYyBsaW5raW5nIGFuZCBtYWtpbmcKICAgICBzdXJlIHRoZSBpbnN0YWxsZWQgZG9jdW1lbnRhdGlvbiBpcyBhbHNvIG93bmVkIGJ5IHJvb3Qucm9vdC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPl0KCiAgKikgR2l2ZSB0aGUgT3BlblNTTCBhcHBsaWNhdGlvbnMgbW9yZSBwb3NzaWJpbGl0aWVzIHRvIG1ha2UgdXNlIG9mCiAgICAga2V5cyAocHVibGljIGFzIHdlbGwgYXMgcHJpdmF0ZSkgaGFuZGxlZCBieSBlbmdpbmVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBPQ1NQIGNvZGUgdGhhdCBjb21lcyBmcm9tIENlcnRDby4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgVk1TIHN1cHBvcnQgZm9yIHRoZSBSaWpuZGFlbCBjb2RlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZGVkIHVudGVzdGVkIHN1cHBvcnQgZm9yIE51cm9uIGNyeXB0byBhY2NlbGVyYXRvci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIGV4dGVybmFsIGNyeXB0b2dyYXBoaWMgZGV2aWNlcy4gIFRoaXMgY29kZSB3YXMKICAgICBwcmV2aW91c2x5IGRpc3RyaWJ1dGVkIHNlcGFyYXRlbHkgYXMgdGhlICJlbmdpbmUiIGJyYW5jaC4KICAgICBbR2VvZmYgVGhvcnBlLCBSaWNoYXJkIExldml0dGVdCgogICopIFJld29yayB0aGUgZmlsZW5hbWUtdHJhbnNsYXRpb24gaW4gdGhlIERTTyBjb2RlLiBJdCBpcyBub3cgcG9zc2libGUgdG8KICAgICBoYXZlIGZhciBncmVhdGVyIGNvbnRyb2wgb3ZlciBob3cgYSAibmFtZSIgaXMgdHVybmVkIGludG8gYSBmaWxlbmFtZQogICAgIGRlcGVuZGluZyBvbiB0aGUgb3BlcmF0aW5nIGVudmlyb25tZW50IGFuZCBhbnkgb2RkaXRpZXMgYWJvdXQgdGhlCiAgICAgZGlmZmVyZW50IHNoYXJlZCBsaWJyYXJ5IGZpbGVuYW1lcyBvbiBlYWNoIHN5c3RlbS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBTdXBwb3J0IHRocmVhZHMgb24gRnJlZUJTRC1lbGYgaW4gQ29uZmlndXJlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBmb3IgU0hBMSBhc3NlbWJseSBwcm9ibGVtIHdpdGggTUFTTTogaXQgcHJvZHVjZXMKICAgICB3YXJuaW5ncyBhYm91dCBjb3JydXB0IGxpbmUgbnVtYmVyIGluZm9ybWF0aW9uIHdoZW4gYXNzZW1ibGluZwogICAgIHdpdGggZGVidWdnaW5nIGluZm9ybWF0aW9uLiBUaGlzIGlzIGNhdXNlZCBieSB0aGUgb3ZlcmxhcHBpbmcKICAgICBvZiB0d28gc2VjdGlvbnMuCiAgICAgW0Jlcm5kIE1hdHRoZXMgPG1haW5idWdAY2Vsb2NvbS5kZT4sIFN0ZXZlIEhlbnNvbl0KCiAgKikgTkNPTkYgY2hhbmdlcy4KICAgICBOQ09ORl9nZXRfbnVtYmVyKCkgaGFzIG5vIGVycm9yIGNoZWNraW5nIGF0IGFsbC4gIEFzIGEgcmVwbGFjZW1lbnQsCiAgICAgTkNPTkZfZ2V0X251bWJlcl9lKCkgaXMgZGVmaW5lZCAoX2UgZm9yICJlcnJvciBjaGVja2luZyIpIGFuZCBpcwogICAgIHByb21vdGVkIHN0cm9uZ2x5LiAgVGhlIG9sZCBOQ09ORl9nZXRfbnVtYmVyIGlzIGtlcHQgYXJvdW5kIGZvcgogICAgIGJpbmFyeSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgogICAgIE1ha2UgaXQgcG9zc2libGUgZm9yIG1ldGhvZHMgdG8gbG9hZCBmcm9tIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgQklPLAogICAgIGJ5IHByb3ZpZGluZyBhIGZ1bmN0aW9uIHBvaW50ZXIgdGhhdCBpcyBnaXZlbiBhIG5hbWUgaW5zdGVhZCBvZiBhIEJJTy4KICAgICBGb3IgZXhhbXBsZSwgdGhpcyBjb3VsZCBiZSB1c2VkIHRvIGxvYWQgY29uZmlndXJhdGlvbiBkYXRhIGZyb20gYW4KICAgICBMREFQIHNlcnZlci4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggZm9yIG5vbiBibG9ja2luZyBhY2NlcHQgQklPcy4gQWRkZWQgbmV3IEkvTyBzcGVjaWFsIHJlYXNvbgogICAgIEJJT19SUl9BQ0NFUFQgdG8gY292ZXIgdGhpcyBjYXNlLiBQcmV2aW91c2x5IHVzZSBvZiBhY2NlcHQgQklPcwogICAgIHdpdGggbm9uIGJsb2NraW5nIEkvTyB3YXMgbm90IHBvc3NpYmxlIGJlY2F1c2Ugbm8gcmV0cnkgY29kZSB3YXMKICAgICBpbXBsZW1lbnRlZC4gQWxzbyBhZGRlZCBuZXcgU1NMIGNvZGUgU1NMX1dBTlRfQUNDRVBUIHRvIGNvdmVyCiAgICAgdGhpcyBjYXNlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZGVkIHRoZSBiZWdpbm5pbmdzIG9mIFJpam5kYWVsIHN1cHBvcnQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCBmb3IgYnVnIGluIERpcmVjdG9yeVN0cmluZyBtYXNrIHNldHRpbmcuIEFkZCBzdXBwb3J0IGZvcgogICAgIFg1MDlfTkFNRV9wcmludF9leCgpIGluICdyZXEnIGFuZCBYNTA5X3ByaW50X2V4KCkgZnVuY3Rpb24KICAgICB0byBhbGxvdyBjZXJ0aWZpY2F0ZSBwcmludGluZyB0byBtb3JlIGNvbnRyb2xsYWJsZSwgYWRkaXRpb25hbAogICAgICdjZXJ0b3B0JyBvcHRpb24gdG8gJ3g1MDknIHRvIGFsbG93IG5ldyBwcmludGluZyBvcHRpb25zIHRvIGJlCiAgICAgc2V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENsZWFuIG9sZCBFQVkgTUQ1IGhhY2sgZnJvbSBlX29zLmguCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZsIGFuZCAwLjkuNm0gIFsxNyBNYXIgMjAwNF0KCiAgKikgRml4IG51bGwtcG9pbnRlciBhc3NpZ25tZW50IGluIGRvX2NoYW5nZV9jaXBoZXJfc3BlYygpIHJldmVhbGVkCiAgICAgYnkgdXNpbmcgdGhlIENvZGVub21pY29uIFRMUyBUZXN0IFRvb2wgKENWRS0yMDA0LTAwNzkpCiAgICAgW0pvZSBPcnRvbiwgU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmsgYW5kIDAuOS42bCAgWzA0IE5vdiAyMDAzXQoKICAqKSBGaXggYWRkaXRpb25hbCBidWcgcmV2ZWFsZWQgYnkgdGhlIE5JU0NDIHRlc3Qgc3VpdGU6CgogICAgIFN0b3AgYnVnIHRyaWdnZXJpbmcgbGFyZ2UgcmVjdXJzaW9uIHdoZW4gcHJlc2VudGVkIHdpdGgKICAgICBjZXJ0YWluIEFTTi4xIHRhZ3MgKENWRS0yMDAzLTA4NTEpCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZqIGFuZCAwLjkuNmsgIFszMCBTZXAgMjAwM10KCiAgKikgRml4IHZhcmlvdXMgYnVncyByZXZlYWxlZCBieSBydW5uaW5nIHRoZSBOSVNDQyB0ZXN0IHN1aXRlOgoKICAgICBTdG9wIG91dCBvZiBib3VuZHMgcmVhZHMgaW4gdGhlIEFTTjEgY29kZSB3aGVuIHByZXNlbnRlZCB3aXRoCiAgICAgaW52YWxpZCB0YWdzIChDVkUtMjAwMy0wNTQzIGFuZCBDVkUtMjAwMy0wNTQ0KS4KICAgICAKICAgICBJZiB2ZXJpZnkgY2FsbGJhY2sgaWdub3JlcyBpbnZhbGlkIHB1YmxpYyBrZXkgZXJyb3JzIGRvbid0IHRyeSB0byBjaGVjawogICAgIGNlcnRpZmljYXRlIHNpZ25hdHVyZSB3aXRoIHRoZSBOVUxMIHB1YmxpYyBrZXkuCgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHNzbDNfYWNjZXB0KCkgKHNzbC9zM19zcnZyLmMpIG9ubHkgYWNjZXB0IGEgY2xpZW50IGNlcnRpZmljYXRlCiAgICAgaWYgdGhlIHNlcnZlciByZXF1ZXN0ZWQgb25lOiBhcyBzdGF0ZWQgaW4gVExTIDEuMCBhbmQgU1NMIDMuMAogICAgIHNwZWNpZmljYXRpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIHNzbDNfZ2V0X2NsaWVudF9oZWxsbygpIChzc2wvczNfc3J2ci5jKSwgdG9sZXJhdGUgYWRkaXRpb25hbAogICAgIGV4dHJhIGRhdGEgYWZ0ZXIgdGhlIGNvbXByZXNzaW9uIG1ldGhvZHMgbm90IG9ubHkgZm9yIFRMUyAxLjAKICAgICBidXQgYWxzbyBmb3IgU1NMIDMuMCAoYXMgcmVxdWlyZWQgYnkgdGhlIHNwZWNpZmljYXRpb24pLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTWF0dGhpYXMgTG9lcGZlXQoKICAqKSBDaGFuZ2UgWDUwOV9jZXJ0aWZpY2F0ZV90eXBlKCkgdG8gbWFyayB0aGUga2V5IGFzIGV4cG9ydGVkL2V4cG9ydGFibGUKICAgICB3aGVuIGl0J3MgNTEyICpiaXRzKiBsb25nLCBub3QgNTEyIGJ5dGVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42aSBhbmQgMC45LjZqICBbMTAgQXByIDIwMDNdCgogICopIENvdW50ZXJtZWFzdXJlIGFnYWluc3QgdGhlIEtsaW1hLVBva29ybnktUm9zYSBleHRlbnNpb24gb2YKICAgICBCbGVpY2hiYWNoZXIncyBhdHRhY2sgb24gUEtDUyAjMSB2MS41IHBhZGRpbmc6IHRyZWF0CiAgICAgYSBwcm90b2NvbCB2ZXJzaW9uIG51bWJlciBtaXNtYXRjaCBsaWtlIGEgZGVjcnlwdGlvbiBlcnJvcgogICAgIGluIHNzbDNfZ2V0X2NsaWVudF9rZXlfZXhjaGFuZ2UgKHNzbC9zM19zcnZyLmMpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFR1cm4gb24gUlNBIGJsaW5kaW5nIGJ5IGRlZmF1bHQgaW4gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KICAgICB0byBhdm9pZCBhIHRpbWluZyBhdHRhY2suIEFwcGxpY2F0aW9ucyB0aGF0IGRvbid0IHdhbnQgaXQgY2FuIGNhbGwKICAgICBSU0FfYmxpbmRpbmdfb2ZmKCkgb3IgdXNlIHRoZSBuZXcgZmxhZyBSU0FfRkxBR19OT19CTElORElORy4KICAgICBUaGV5IHdvdWxkIGJlIGlsbC1hZHZpc2VkIHRvIGRvIHNvIGluIG1vc3QgY2FzZXMuCiAgICAgW0JlbiBMYXVyaWUsIFN0ZXZlIEhlbnNvbiwgR2VvZmYgVGhvcnBlLCBCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBSU0EgYmxpbmRpbmcgY29kZSBzbyB0aGF0IGl0IHdvcmtzIHdoZW4gdGhlIFBSTkcgaXMgbm90CiAgICAgc2VlZGVkIChpbiB0aGlzIGNhc2UsIHRoZSBzZWNyZXQgUlNBIGV4cG9uZW50IGlzIGFidXNlZCBhcwogICAgIGFuIHVucHJlZGljdGFibGUgc2VlZCAtLSBpZiBpdCBpcyBub3QgdW5wcmVkaWN0YWJsZSwgdGhlcmUKICAgICBpcyBubyBwb2ludCBpbiBibGluZGluZyBhbnl3YXkpLiAgTWFrZSBSU0EgYmxpbmRpbmcgdGhyZWFkLXNhZmUKICAgICBieSByZW1lbWJlcmluZyB0aGUgY3JlYXRvcidzIHRocmVhZCBJRCBpbiByc2EtPmJsaW5kaW5nIGFuZAogICAgIGhhdmluZyBhbGwgb3RoZXIgdGhyZWFkcyB1c2UgbG9jYWwgb25lLXRpbWUgYmxpbmRpbmcgZmFjdG9ycwogICAgICh0aGlzIHJlcXVpcmVzIG1vcmUgY29tcHV0YXRpb24gdGhhbiBzaGFyaW5nIHJzYS0+YmxpbmRpbmcsIGJ1dAogICAgIGF2b2lkcyBleGNlc3NpdmUgbG9ja2luZzsgYW5kIGlmIGFuIFJTQSBvYmplY3QgaXMgbm90IHNoYXJlZAogICAgIGJldHdlZW4gdGhyZWFkcywgYmxpbmRpbmcgd2lsbCBzdGlsbCBiZSB2ZXJ5IGZhc3QpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42aCBhbmQgMC45LjZpICBbMTkgRmViIDIwMDNdCgogICopIEluIHNzbDNfZ2V0X3JlY29yZCAoc3NsL3MzX3BrdC5jKSwgbWluaW1pemUgaW5mb3JtYXRpb24gbGVha2VkCiAgICAgdmlhIHRpbWluZyBieSBwZXJmb3JtaW5nIGEgTUFDIGNvbXB1dGF0aW9uIGV2ZW4gaWYgaW5jb3JycmVjdAogICAgIGJsb2NrIGNpcGhlciBwYWRkaW5nIGhhcyBiZWVuIGZvdW5kLiAgVGhpcyBpcyBhIGNvdW50ZXJtZWFzdXJlCiAgICAgYWdhaW5zdCBhY3RpdmUgYXR0YWNrcyB3aGVyZSB0aGUgYXR0YWNrZXIgaGFzIHRvIGRpc3Rpbmd1aXNoCiAgICAgYmV0d2VlbiBiYWQgcGFkZGluZyBhbmQgYSBNQUMgdmVyaWZpY2F0aW9uIGVycm9yLiAoQ1ZFLTIwMDMtMDA3OCkKCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBCcmljZSBDYW52ZWwgKEVQRkwpLAogICAgIEFsYWluIEhpbHRnZW4gKFVCUyksIFNlcmdlIFZhdWRlbmF5IChFUEZMKSwgYW5kCiAgICAgTWFydGluIFZ1YWdub3V4IChFUEZMLCBJbGlvbildCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS42ZyBhbmQgMC45LjZoICBbNSBEZWMgMjAwMl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9QRU5TU0xfY2xlYW5zZSgpLCB3aGljaCBpcyB1c2VkIHRvIGNsZWFuc2UgYSBzZWN0aW9uIG9mCiAgICAgbWVtb3J5IGZyb20gaXQncyBjb250ZW50cy4gIFRoaXMgaXMgZG9uZSB3aXRoIGEgY291bnRlciB0aGF0IHdpbGwKICAgICBwbGFjZSBhbHRlcm5hdGluZyB2YWx1ZXMgaW4gZWFjaCBieXRlLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBzb2x2ZQogICAgIHR3byBpc3N1ZXM6IDEpIHRoZSByZW1vdmFsIG9mIGNhbGxzIHRvIG1lbXNldCgpIGJ5IGhpZ2hseSBvcHRpbWl6aW5nCiAgICAgY29tcGlsZXJzLCBhbmQgMikgY2xlYW5zaW5nIHdpdGggb3RoZXIgdmFsdWVzIHRoYW4gMCwgc2luY2UgdGhvc2UgY2FuCiAgICAgYmUgcmVhZCB0aHJvdWdoIG9uIGNlcnRhaW4gbWVkaWEsIGZvciBleGFtcGxlIGEgc3dhcCBzcGFjZSBvbiBkaXNrLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEJ1Z2ZpeDogY2xpZW50IHNpZGUgc2Vzc2lvbiBjYWNoaW5nIGRpZCBub3Qgd29yayB3aXRoIGV4dGVybmFsIGNhY2hpbmcsCiAgICAgYmVjYXVzZSB0aGUgc2Vzc2lvbi0+Y2lwaGVyIHNldHRpbmcgd2FzIG5vdCByZXN0b3JlZCB3aGVuIHJlbG9hZGluZwogICAgIGZyb20gdGhlIGV4dGVybmFsIGNhY2hlLiBUaGlzIHByb2JsZW0gd2FzIG1hc2tlZCwgd2hlbgogICAgIFNTTF9PUF9ORVRTQ0FQRV9SRVVTRV9DSVBIRVJfQ0hBTkdFX0JVRyAocGFydCBvZiBTU0xfT1BfQUxMKSB3YXMgc2V0LgogICAgIChGb3VuZCBieSBTdGV2ZSBIYXNsYW0gPHN0ZXZlQGFyYXFuaWQuZGR0cy5uZXQ+LikKICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGNsaWVudF9jZXJ0aWZpY2F0ZSAoc3NsL3MyX2NsbnQuYyk6IFRoZSBwZXJtaXNzaWJsZSB0b3RhbAogICAgIGxlbmd0aCBvZiB0aGUgUkVRVUVTVC1DRVJUSUZJQ0FURSBtZXNzYWdlIGlzIDE4IC4uIDM0LCBub3QgMTcgLi4gMzMuCiAgICAgW1plZXYgTGllYmVyIDx6ZWV2LWxAeWFob28uY29tPl0KCiAgKikgVW5kbyBhbiB1bmRvY3VtZW50ZWQgY2hhbmdlIGludHJvZHVjZWQgaW4gMC45LjZlIHdoaWNoIGNhdXNlZAogICAgIHJlcGVhdGVkIGNhbGxzIHRvIE9wZW5TU0xfYWRkX2FsbF9jaXBoZXJzKCkgYW5kIAogICAgIE9wZW5TU0xfYWRkX2FsbF9kaWdlc3RzKCkgdG8gYmUgaWdub3JlZCwgZXZlbiBhZnRlciBjYWxsaW5nCiAgICAgRVZQX2NsZWFudXAoKS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGFuZ2UgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiByZWFkZXIgdG8gZGVhbCB3aXRoIGxhc3QgbGluZSBub3QKICAgICBiZWluZyBwcm9wZXJseSB0ZXJtaW5hdGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIENoYW5nZSBYNTA5X05BTUVfY21wKCkgc28gaXQgYXBwbGllcyB0aGUgc3BlY2lhbCBydWxlcyBvbiBoYW5kbGluZwogICAgIEROIHZhbHVlcyB0aGF0IGFyZSBvZiB0eXBlIFByaW50YWJsZVN0cmluZywgYXMgd2VsbCBhcyBSRE5zIG9mIHR5cGUKICAgICBlbWFpbEFkZHJlc3Mgd2hlcmUgdGhlIHZhbHVlIGhhcyB0aGUgdHlwZSBpYTVTdHJpbmcuCiAgICAgW3N0ZWZhbmtAdmFsaWNlcnQuY29tIHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBhIFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX1NUT1JFIGZsYWcgdG8gdGFrZSBvdmVyIGhhbGYKICAgICB0aGUgam9iIFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMX0xPT0tVUCB3YXMgaW5jb25zaXN0ZW50bHkKICAgICBkb2luZywgZGVmaW5lIGEgbmV3IGZsYWcgKFNTTF9TRVNTX0NBQ0hFX05PX0lOVEVSTkFMKSB0byBiZQogICAgIHRoZSBiaXR3aXNlLU9SIG9mIHRoZSB0d28gZm9yIHVzZSBieSB0aGUgbWFqb3JpdHkgb2YgYXBwbGljYXRpb25zCiAgICAgd2FudGluZyB0aGlzIGJlaGF2aW91ciwgYW5kIHVwZGF0ZSB0aGUgZG9jcy4gVGhlIGRvY3VtZW50ZWQKICAgICBiZWhhdmlvdXIgYW5kIGFjdHVhbCBiZWhhdmlvdXIgd2VyZSBpbmNvbnNpc3RlbnQgYW5kIGhhZCBiZWVuCiAgICAgY2hhbmdpbmcgYW55d2F5LCBzbyB0aGlzIGlzIG1vcmUgYSBidWctZml4IHRoYW4gYSBiZWhhdmlvdXJhbAogICAgIGNoYW5nZS4KICAgICBbR2VvZmYgVGhvcnBlLCBkaWFnbm9zZWQgYnkgTmFkYXYgSGFyJ0VsXQoKICAqKSBEb24ndCBpbXBvc2UgYSAxNi1ieXRlIGxlbmd0aCBtaW5pbXVtIG9uIHNlc3Npb24gSURzIGluIHNzbC9zM19jbG50LmMKICAgICAodGhlIFNTTCAzLjAgYW5kIFRMUyAxLjAgc3BlY2lmaWNhdGlvbnMgYWxsb3cgYW55IGxlbmd0aCB1cCB0byAzMiBieXRlcykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGluaXRpYWxpemF0aW9uIGNvZGUgcmFjZSBjb25kaXRpb25zIGluCiAgICAgICAgU1NMdjIzX21ldGhvZCgpLCAgU1NMdjIzX2NsaWVudF9tZXRob2QoKSwgICBTU0x2MjNfc2VydmVyX21ldGhvZCgpLAogICAgICAgIFNTTHYyX21ldGhvZCgpLCAgIFNTTHYyX2NsaWVudF9tZXRob2QoKSwgICAgU1NMdjJfc2VydmVyX21ldGhvZCgpLAogICAgICAgIFNTTHYzX21ldGhvZCgpLCAgIFNTTHYzX2NsaWVudF9tZXRob2QoKSwgICAgU1NMdjNfc2VydmVyX21ldGhvZCgpLAogICAgICAgIFRMU3YxX21ldGhvZCgpLCAgIFRMU3YxX2NsaWVudF9tZXRob2QoKSwgICAgVExTdjFfc2VydmVyX21ldGhvZCgpLAogICAgICAgIHNzbDJfZ2V0X2NpcGhlcl9ieV9jaGFyKCksCiAgICAgICAgc3NsM19nZXRfY2lwaGVyX2J5X2NoYXIoKS4KICAgICBbUGF0cmljayBNY0Nvcm1pY2sgPHBhdHJpY2tAdGVsbG1lLmNvbT4sIEJvZG8gTW9lbGxlcl0KCiAgKikgUmVvcmRlciBjbGVhbnVwIHNlcXVlbmNlIGluIFNTTF9DVFhfZnJlZSgpOiBvbmx5IHJlbW92ZSB0aGUgZXhfZGF0YSBhZnRlcgogICAgIHRoZSBjYWNoZWQgc2Vzc2lvbnMgYXJlIGZsdXNoZWQsIGFzIHRoZSByZW1vdmVfY2IoKSBtaWdodCB1c2UgZXhfZGF0YQogICAgIGNvbnRlbnRzLiBCdWcgZm91bmQgYnkgU2FtIFZhcnNoYXZjaGlrIDxtcnNhbUBjb3VyaWVyLW10YS5jb20+CiAgICAgKHNlZSBbb3BlbnNzbC5vcmcgIzIxMl0pLgogICAgIFtHZW9mZiBUaG9ycGUsIEx1dHogSmFlbmlja2VdCgogICopIEZpeCB0eXBvIGluIE9CSl90eHQyb2JqIHdoaWNoIGluY29ycmVjdGx5IHBhc3NlZCB0aGUgY29udGVudAogICAgIGxlbmd0aCwgaW5zdGVhZCBvZiB0aGUgZW5jb2RpbmcgbGVuZ3RoIHRvIGQyaV9BU04xX09CSkVDVC4KICAgICBbU3RldmUgSGVuc29uXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmYgYW5kIDAuOS42ZyAgWzkgQXVnIDIwMDJdCgogICopIFtJbiAwLjkuNmctZW5naW5lIHJlbGVhc2U6XQogICAgIEZpeCBjcnlwdG8vZW5naW5lL3ZlbmRvcl9kZWZucy9jc3dpZnQuaCBmb3IgV0lOMzIgKHVzZSAnX3N0ZGNhbGwnKS4KICAgICBbTHlubiBHYXppcyA8bGdhemlzQHJhaW5ib3cuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZlIGFuZCAwLjkuNmYgIFs4IEF1ZyAyMDAyXQoKICAqKSBGaXggQVNOMSBjaGVja3MuIENoZWNrIGZvciBvdmVyZmxvdyBieSBjb21wYXJpbmcgd2l0aCBMT05HX01BWAogICAgIGFuZCBnZXQgZml4IHRoZSBoZWFkZXIgbGVuZ3RoIGNhbGN1bGF0aW9uLgogICAgIFtGbG9yaWFuIFdlaW1lciA8V2VpbWVyQENFUlQuVW5pLVN0dXR0Z2FydC5ERT4sCglBbG9uIEthbnRvciA8YWxvbmtAY2hlY2twb2ludC5jb20+IChhbmQgb3RoZXJzKSwKCVN0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIHByb3BlciBlcnJvciBoYW5kbGluZyBpbnN0ZWFkIG9mICdhc3NlcnRpb25zJyBpbiBidWZmZXIKICAgICBvdmVyZmxvdyBjaGVja3MgYWRkZWQgaW4gMC45LjZlLiAgVGhpcyBwcmV2ZW50cyBEb1MgKHRoZQogICAgIGFzc2VydGlvbnMgY291bGQgY2FsbCBhYm9ydCgpKS4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPiwgQm9kbyBNb2VsbGVyXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmQgYW5kIDAuOS42ZSAgWzMwIEp1bCAyMDAyXQoKICAqKSBBZGQgdmFyaW91cyBzYW5pdHkgY2hlY2tzIHRvIGFzbjFfZ2V0X2xlbmd0aCgpIHRvIHJlamVjdAogICAgIHRoZSBBU04xIGxlbmd0aCBieXRlcyBpZiB0aGV5IGV4Y2VlZCBzaXplb2YobG9uZyksIHdpbGwgYXBwZWFyCiAgICAgbmVnYXRpdmUgb3IgdGhlIGNvbnRlbnQgbGVuZ3RoIGV4Y2VlZHMgdGhlIGxlbmd0aCBvZiB0aGUKICAgICBzdXBwbGllZCBidWZmZXIuCiAgICAgW1N0ZXZlIEhlbnNvbiwgQWRpIFN0YXYgPHN0YXZAbWVyY3VyeS5jby5pbD4sIEphbWVzIFlvbmFuIDxqaW1AbnRscC5jb20+XQoKICAqKSBGaXggY2lwaGVyIHNlbGVjdGlvbiByb3V0aW5lczogY2lwaGVycyB3aXRob3V0IGVuY3J5cHRpb24gaGFkIG5vIGZsYWdzCiAgICAgZm9yIHRoZSBjaXBoZXIgc3RyZW5ndGggc2V0IGFuZCB3aGVyZSB0aGVyZWZvcmUgbm90IGhhbmRsZWQgY29ycmVjdGx5CiAgICAgYnkgdGhlIHNlbGVjdGlvbiByb3V0aW5lcyAoUFIgIzEzMCkuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBFVlBfZHNhX3NoYSBtYWNyby4KICAgICBbTmlscyBMYXJzY2hdCgogICopIE5ldyBvcHRpb24KICAgICAgICAgIFNTTF9PUF9ET05UX0lOU0VSVF9FTVBUWV9GUkFHTUVOVFMKICAgICBmb3IgZGlzYWJsaW5nIHRoZSBTU0wgMy4wL1RMUyAxLjAgQ0JDIHZ1bG5lcmFiaWxpdHkgY291bnRlcm1lYXN1cmUKICAgICB0aGF0IHdhcyBhZGRlZCBpbiBPcGVuU1NMIDAuOS42ZC4KCiAgICAgQXMgdGhlIGNvdW50ZXJtZWFzdXJlIHR1cm5lZCBvdXQgdG8gYmUgaW5jb21wYXRpYmxlIHdpdGggc29tZQogICAgIGJyb2tlbiBTU0wgaW1wbGVtZW50YXRpb25zLCB0aGUgbmV3IG9wdGlvbiBpcyBwYXJ0IG9mIFNTTF9PUF9BTEwuCiAgICAgU1NMX09QX0FMTCBpcyB1c3VhbGx5IGVtcGxveWVkIHdoZW4gY29tcGF0aWJpbGl0eSB3aXRoIHdlaXJkIFNTTAogICAgIGltcGxlbWVudGF0aW9ucyBpcyBkZXNpcmVkIChlLmcuICctYnVncycgb3B0aW9uIHRvICdzX2NsaWVudCcgYW5kCiAgICAgJ3Nfc2VydmVyJyksIHNvIHRoZSBuZXcgb3B0aW9uIGlzIGF1dG9tYXRpY2FsbHkgc2V0IGluIG1hbnkKICAgICBhcHBsaWNhdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlcyBpbiBzZWN1cml0eSBwYXRjaDoKCiAgICAgQ2hhbmdlcyBtYXJrZWQgIihDSEFUUykiIHdlcmUgc3BvbnNvcmVkIGJ5IHRoZSBEZWZlbnNlIEFkdmFuY2VkCiAgICAgUmVzZWFyY2ggUHJvamVjdHMgQWdlbmN5IChEQVJQQSkgYW5kIEFpciBGb3JjZSBSZXNlYXJjaCBMYWJvcmF0b3J5LAogICAgIEFpciBGb3JjZSBNYXRlcmllbCBDb21tYW5kLCBVU0FGLCB1bmRlciBhZ3JlZW1lbnQgbnVtYmVyCiAgICAgRjMwNjAyLTAxLTItMDUzNy4KCiAgKikgQWRkIHZhcmlvdXMgc2FuaXR5IGNoZWNrcyB0byBhc24xX2dldF9sZW5ndGgoKSB0byByZWplY3QKICAgICB0aGUgQVNOMSBsZW5ndGggYnl0ZXMgaWYgdGhleSBleGNlZWQgc2l6ZW9mKGxvbmcpLCB3aWxsIGFwcGVhcgogICAgIG5lZ2F0aXZlIG9yIHRoZSBjb250ZW50IGxlbmd0aCBleGNlZWRzIHRoZSBsZW5ndGggb2YgdGhlCiAgICAgc3VwcGxpZWQgYnVmZmVyLiAoQ1ZFLTIwMDItMDY1OSkKICAgICBbU3RldmUgSGVuc29uLCBBZGkgU3RhdiA8c3RhdkBtZXJjdXJ5LmNvLmlsPiwgSmFtZXMgWW9uYW4gPGppbUBudGxwLmNvbT5dCgogICopIEFzc2VydGlvbnMgZm9yIHZhcmlvdXMgcG90ZW50aWFsIGJ1ZmZlciBvdmVyZmxvd3MsIG5vdCBrbm93biB0bwogICAgIGhhcHBlbiBpbiBwcmFjdGljZS4KICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKICAqKSBWYXJpb3VzIHRlbXBvcmFyeSBidWZmZXJzIHRvIGhvbGQgQVNDSUkgdmVyc2lvbnMgb2YgaW50ZWdlcnMgd2VyZQogICAgIHRvbyBzbWFsbCBmb3IgNjQgYml0IHBsYXRmb3Jtcy4gKENWRS0yMDAyLTA2NTUpCiAgICAgW01hdHRoZXcgQnluZy1NYWRkaWNrIDxtYm1AYWxkaWdpdGFsLmNvLnVrPiBhbmQgQmVuIExhdXJpZSAoQ0hBVFMpPgoKICAqKSBSZW1vdGUgYnVmZmVyIG92ZXJmbG93IGluIFNTTDMgcHJvdG9jb2wgLSBhbiBhdHRhY2tlciBjb3VsZAogICAgIHN1cHBseSBhbiBvdmVyc2l6ZWQgc2Vzc2lvbiBJRCB0byBhIGNsaWVudC4gKENWRS0yMDAyLTA2NTYpCiAgICAgW0JlbiBMYXVyaWUgKENIQVRTKV0KCiAgKikgUmVtb3RlIGJ1ZmZlciBvdmVyZmxvdyBpbiBTU0wyIHByb3RvY29sIC0gYW4gYXR0YWNrZXIgY291bGQKICAgICBzdXBwbHkgYW4gb3ZlcnNpemVkIGNsaWVudCBtYXN0ZXIga2V5LiAoQ1ZFLTIwMDItMDY1NikKICAgICBbQmVuIExhdXJpZSAoQ0hBVFMpXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmMgYW5kIDAuOS42ZCAgWzkgTWF5IDIwMDJdCgogICopIEZpeCBjcnlwdG8vYXNuMS9hX3NpZ24uYyBzbyB0aGF0ICdwYXJhbWV0ZXJzJyBpcyBvbWl0dGVkIChub3QKICAgICBlbmNvZGVkIGFzIE5VTEwpIHdpdGggaWQtZHNhLXdpdGgtc2hhMS4KICAgICBbTmlscyBMYXJzY2ggPG5sYUB0cnVzdGNlbnRlci5kZT47IHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgQm9kbyBNb2VsbGVyXQoKICAqKSBDaGVjayB2YXJpb3VzIFg1MDlfLi4uKCkgcmV0dXJuIHZhbHVlcyBpbiBhcHBzL3JlcS5jLgogICAgIFtOaWxzIExhcnNjaCA8bmxhQHRydXN0Y2VudGVyLmRlPl0KCiAgKikgRml4IEJBU0U2NCBkZWNvZGUgKEVWUF9EZWNvZGVVcGRhdGUpIGZvciBkYXRhIHdpdGggQ1IvTEYgZW5kZWQgbGluZXM6CiAgICAgYW4gZW5kLW9mLWZpbGUgY29uZGl0aW9uIHdvdWxkIGVycm9ub3VzbHkgYmUgZmxhZ2dlZCwgd2hlbiB0aGUgQ1JMRgogICAgIHdhcyBqdXN0IGF0IHRoZSBlbmQgb2YgYSBwcm9jZXNzZWQgYmxvY2suIFRoZSBidWcgd2FzIGRpc2NvdmVyZWQgd2hlbgogICAgIHByb2Nlc3NpbmcgZGF0YSB0aHJvdWdoIGEgYnVmZmVyaW5nIG1lbW9yeSBCSU8gaGFuZGluZyB0aGUgZGF0YSB0byBhCiAgICAgQkFTRTY0LWRlY29kaW5nIEJJTy4gQnVnIGZ1bmQgYW5kIHBhdGNoIHN1Ym1pdHRlZCBieSBQYXZlbCBUc2Vrb3YKICAgICA8cHRzZWtvdkBzeW50cmV4LmNvbT4gYW5kIE5lZGVsY2hvIFN0YW5ldi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSW1wbGVtZW50IGEgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBhIHZ1bG5lcmFiaWxpdHkgcmVjZW50bHkgZm91bmQKICAgICBpbiBDQkMgY2lwaGVyc3VpdGVzIGluIFNTTCAzLjAvVExTIDEuMDogU2VuZCBhbiBlbXB0eSBmcmFnbWVudAogICAgIGJlZm9yZSBhcHBsaWNhdGlvbiBkYXRhIGNodW5rcyB0byBhdm9pZCB0aGUgdXNlIG9mIGtub3duIElWcwogICAgIHdpdGggZGF0YSBwb3RlbnRpYWxseSBjaG9zZW4gYnkgdGhlIGF0dGFja2VyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBsZW5ndGggY2hlY2tzIGluIHNzbDNfZ2V0X2NsaWVudF9oZWxsbygpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRMUy9TU0wgbGlicmFyeSBidWdmaXg6IHVzZSBzLT5zMy0+aW5fcmVhZF9hcHBfZGF0YSBkaWZmZXJlbnRseQogICAgIHRvIHByZXZlbnQgc3NsM19yZWFkX2ludGVybmFsKCkgZnJvbSBpbmNvcnJlY3RseSBhc3N1bWluZyB0aGF0CiAgICAgc3NsM19yZWFkX2J5dGVzKCkgZm91bmQgYXBwbGljYXRpb24gZGF0YSB3aGlsZSBoYW5kc2hha2UKICAgICBwcm9jZXNzaW5nIHdhcyBlbmFibGVkIHdoZW4gaW4gZmFjdCBzLT5zMy0+aW5fcmVhZF9hcHBfZGF0YSB3YXMKICAgICBtZXJlbHkgYXV0b21hdGljYWxseSBjbGVhcmVkIGR1cmluZyB0aGUgaW5pdGlhbCBoYW5kc2hha2UuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBGaXggb2JqZWN0IGRlZmluaXRpb25zIGZvciBQcml2YXRlIGFuZCBFbnRlcnByaXNlOiB0aGV5IHdlcmUgbm90CiAgICAgcmVjb2duaXplZCBpbiB0aGVpciBzaG9ydG5hbWUgKD1sb3dlcmNhc2UpIHJlcHJlc2VudGF0aW9uLiBFeHRlbmQKICAgICBvYmpfZGF0LnBsIHRvIGlzc3VlIGFuIGVycm9yIHdoZW4gdXNpbmcgdW5kZWZpbmVkIGtleXdvcmRzIGluc3RlYWQKICAgICBvZiBzaWxlbnRseSBpZ25vcmluZyB0aGUgcHJvYmxlbSAoU3Zlbm5pbmcgU29yZW5zZW4KICAgICA8c3NzQHNzcy5kbnNhbGlhcy5uZXQ+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IERIX2dlbmVyYXRlX3BhcmFtZXRlcnMoKSBzbyB0aGF0IGl0IHdvcmtzIGZvciAnbm9uLXN0YW5kYXJkJwogICAgIGdlbmVyYXRvcnMsIGkuZS4gZ2VuZXJhdG9ycyBvdGhlciB0aGFuIDIgYW5kIDUuICAoUHJldmlvdXNseSwgdGhlCiAgICAgY29kZSBkaWQgbm90IHByb3Blcmx5IGluaXRpYWxpc2UgdGhlICdhZGQnIGFuZCAncmVtJyB2YWx1ZXMgdG8KICAgICBCTl9nZW5lcmF0ZV9wcmltZSgpLikKCiAgICAgSW4gdGhlIG5ldyBnZW5lcmFsIGNhc2UsIHdlIGRvIG5vdCBpbnNpc3QgdGhhdCAnZ2VuZXJhdG9yJyBpcwogICAgIGFjdHVhbGx5IGEgcHJpbWl0aXZlIHJvb3Q6IFRoaXMgcmVxdWlyZW1lbnQgaXMgcmF0aGVyIHBvaW50bGVzczsKICAgICBhIGdlbmVyYXRvciBvZiB0aGUgb3JkZXItcSBzdWJncm91cCBpcyBqdXN0IGFzIGdvb2QsIGlmIG5vdAogICAgIGJldHRlci4KICAgICBbQm9kbyBNb2VsbGVyXQogCiAgKikgTWFwIG5ldyBYNTA5IHZlcmlmaWNhdGlvbiBlcnJvcnMgdG8gYWxlcnRzLiBEaXNjb3ZlcmVkIGFuZCBzdWJtaXR0ZWQgYnkKICAgICBUb20gV3UgPHRvbUBhcmNvdC5jb20+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggc3NsM19wZW5kaW5nKCkgKHNzbC9zM19saWIuYykgdG8gcHJldmVudCBTU0xfcGVuZGluZygpIGZyb20KICAgICByZXR1cm5pbmcgbm9uLXplcm8gYmVmb3JlIHRoZSBkYXRhIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVjZWl2ZWQKICAgICB3aGVuIHVzaW5nIG5vbi1ibG9ja2luZyBJL08uCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBKb2huIEh1Z2hlc10KCiAgKikgU29tZSBvZiB0aGUgY2lwaGVycyBtaXNzZWQgdGhlIHN0cmVuZ3RoIGVudHJ5IChTU0xfTE9XIGV0YykuCiAgICAgW0JlbiBMYXVyaWUsIEx1dHogSmFlbmlja2VdCgogICopIEZpeCBidWcgaW4gU1NMX2NsZWFyKCk6IGJhZCBzZXNzaW9ucyB3ZXJlIG5vdCByZW1vdmVkIChmb3VuZCBieQogICAgIFlvcmFtIFphaGF2aSA8WW9yYW1aQGdpbGlhbi5jb20+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgQWRkIGluZm9ybWF0aW9uIGFib3V0IEN5Z1dpbiAxLjMgYW5kIG9uLCBhbmQgcHJlc2VydmUgcHJvcGVyCiAgICAgY29uZmlndXJhdGlvbiBmb3IgdGhlIHZlcnNpb25zIGJlZm9yZSB0aGF0LgogICAgIFtDb3Jpbm5hIFZpbnNjaGVuIDx2aW5zY2hlbkByZWRoYXQuY29tPiBhbmQgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBNYWtlIHJlbW92YWwgZnJvbSBzZXNzaW9uIGNhY2hlIChTU0xfQ1RYX3JlbW92ZV9zZXNzaW9uKCkpIG1vcmUgcm9idXN0OgogICAgIGNoZWNrIHdoZXRoZXIgd2UgZGVhbCB3aXRoIGEgY29weSBvZiBhIHNlc3Npb24gYW5kIGRvIG5vdCBkZWxldGUgZnJvbQogICAgIHRoZSBjYWNoZSBpbiB0aGlzIGNhc2UuIFByb2JsZW0gcmVwb3J0ZWQgYnkgIkl6aGFyIFNob3NoYW5pIExldmkiCiAgICAgPGl6aGFyQGNoZWNrcG9pbnQuY29tPi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRG8gbm90IHN0b3JlIHNlc3Npb24gZGF0YSBpbnRvIHRoZSBpbnRlcm5hbCBzZXNzaW9uIGNhY2hlLCBpZiBpdAogICAgIGlzIG5ldmVyIGludGVuZGVkIHRvIGJlIGxvb2tlZCB1cCAoU1NMX1NFU1NfQ0FDSEVfTk9fSU5URVJOQUxfTE9PS1VQCiAgICAgZmxhZyBpcyBzZXQpLiBQcm9wb3NlZCBieSBBc2xhbSA8YXNsYW1AZnVuay5jb20+LgogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBIYXZlIEFTTjFfQklUX1NUUklOR19zZXRfYml0KCkgcmVhbGx5IGNsZWFyIGEgYml0IHdoZW4gdGhlIHJlcXVlc3RlZAogICAgIHZhbHVlIGlzIDAuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgW0luIDAuOS42ZC1lbmdpbmUgcmVsZWFzZTpdCiAgICAgRml4IGEgY3Jhc2hidWcgYW5kIGEgbG9naWMgYnVnIGluIGh3Y3Joa19sb2FkX3B1YmtleSgpLgogICAgIFtUb29tYXMgS2lpc2sgPHZpeEBjeWJlci5lZT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIHRoZSBjb25maWd1cmF0aW9uIHRhcmdldCBsaW51eC1zMzkweC4KICAgICBbTmVhbGUgRmVyZ3Vzb24gPE5lYWxlLkZlcmd1c29uQFNvZnR3YXJlQUctVVNBLmNvbT4gdmlhIFJpY2hhcmQgTGV2aXR0ZV0KCiAgKikgVGhlIGVhcmxpZXIgYnVnZml4IGZvciB0aGUgU1NMM19TVF9TV19IRUxMT19SRVFfQyBjYXNlIG9mCiAgICAgc3NsM19hY2NlcHQgKHNzbC9zM19zcnZyLmMpIGluY29ycmVjdGx5IHVzZWQgYSBsb2NhbCBmbGFnCiAgICAgdmFyaWFibGUgYXMgYW4gaW5kaWNhdGlvbiB0aGF0IGEgQ2xpZW50SGVsbG8gbWVzc2FnZSBoYXMgYmVlbgogICAgIHJlY2VpdmVkLiAgQXMgdGhlIGZsYWcgdmFsdWUgd2lsbCBiZSBsb3N0IGJldHdlZW4gbXVsdGlwbGUKICAgICBpbnZvY2F0aW9ucyBvZiBzc2wzX2FjY2VwdCB3aGVuIHVzaW5nIG5vbi1ibG9ja2luZyBJL08sIHRoZQogICAgIGZ1bmN0aW9uIG1heSBub3QgYmUgYXdhcmUgdGhhdCBhIGhhbmRzaGFrZSBoYXMgYWN0dWFsbHkgdGFrZW4KICAgICBwbGFjZSwgdGh1cyBwcmV2ZW50aW5nIGEgbmV3IHNlc3Npb24gZnJvbSBiZWluZyBhZGRlZCB0byB0aGUKICAgICBzZXNzaW9uIGNhY2hlLgoKICAgICBUbyBhdm9pZCB0aGlzIHByb2JsZW0sIHdlIG5vdyBzZXQgcy0+bmV3X3Nlc3Npb24gdG8gMiBpbnN0ZWFkIG9mCiAgICAgdXNpbmcgYSBsb2NhbCB2YXJpYWJsZS4KICAgICBbTHV0eiBKYWVuaWNrZSwgQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXg6IFJldHVybiAtMSBmcm9tIHNzbDNfZ2V0X3NlcnZlcl9kb25lIChzc2wzL3MzX2NsbnQuYykKICAgICBpZiB0aGUgU1NMX1JfTEVOR1RIX01JU01BVENIIGVycm9yIGlzIGRldGVjdGVkLgogICAgIFtHZW9mZiBUaG9ycGUsIEJvZG8gTW9lbGxlcl0KCiAgKikgTmV3ICdzaGFyZWRfbGRmbGFnJyBjb2x1bW4gaW4gQ29uZmlndXJlIHBsYXRmb3JtIHRhYmxlLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBFVlBfQ0lQSEVSX21vZGUgbWFjcm8uCiAgICAgWyJEYW4gUy4gQ2FtcGVyIiA8ZGFuQGJ0aS5uZXQ+XQoKICAqKSBGaXggc3NsM19yZWFkX2J5dGVzIChzc2wvczNfcGt0LmMpOiBUbyBpZ25vcmUgbWVzc2FnZXMgb2YgdW5rbm93bgogICAgIHR5cGUsIHdlIG11c3QgdGhyb3cgdGhlbSBhd2F5IGJ5IHNldHRpbmcgcnItPmxlbmd0aCB0byAwLgogICAgIFtEIFAgQ2hhbmcgPGRwY0BxdWFseXMuY29tPl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjZiIGFuZCAwLjkuNmMgIFsyMSBkZWMgMjAwMV0KCiAgKikgRml4IEJOX3JhbmRfcmFuZ2UgYnVnIHBvaW50ZWQgb3V0IGJ5IERvbWluaWt1cyBTY2hlcmtsCiAgICAgPERvbWluaWt1cy5TY2hlcmtsQGJpb2RhdGEuY29tPi4gIChUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24KICAgICB3b3JrZWQgaW5jb3JyZWN0bHkgZm9yIHRob3NlIGNhc2VzIHdoZXJlICByYW5nZSA9IDEwLi4uXzIgIGFuZAogICAgIDMqcmFuZ2UgIGlzIHR3byBiaXRzIGxvbmdlciB0aGFuICByYW5nZS4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgT25seSBhZGQgc2lnbmluZyB0aW1lIHRvIFBLQ1M3IHN0cnVjdHVyZXMgaWYgaXQgaXMgbm90IGFscmVhZHkKICAgICBwcmVzZW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBjcnlwdG8vb2JqZWN0cy9vYmplY3RzLmg6ICJsZC1jZSIgc2hvdWxkIGJlICJpZC1jZSIsCiAgICAgT0JKX2xkX2NlIHNob3VsZCBiZSBPQkpfaWRfY2UuCiAgICAgQWxzbyBzb21lIGlwLXBkYSBPSURzIGluIGNyeXB0by9vYmplY3RzL29iamVjdHMudHh0IHdlcmUKICAgICBpbmNvcnJlY3QgKGNmLiBSRkMgMzAzOSkuCiAgICAgW01hdHQgQ29vcGVyLCBGcmVkZXJpYyBHaXVkaWNlbGxpLCBCb2RvIE1vZWxsZXJdCgogICopIFJlbGVhc2UgQ1JZUFRPX0xPQ0tfRFlOTE9DSyB3aGVuIENSWVBUT19kZXN0cm95X2R5bmxvY2tpZCgpCiAgICAgcmV0dXJucyBlYXJseSBiZWNhdXNlIGl0IGhhcyBub3RoaW5nIHRvIGRvLgogICAgIFtBbmR5IFNjaG5laWRlciA8YW5keS5zY2huZWlkZXJAYmpzcy5jby51az5dCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEZpeCBtdXRleCBjYWxsYmFjayByZXR1cm4gdmFsdWVzIGluIGNyeXB0by9lbmdpbmUvaHdfbmNpcGhlci5jLgogICAgIFtBbmR5IFNjaG5laWRlciA8YW5keS5zY2huZWlkZXJAYmpzcy5jby51az5dCgogICopIFtJbiAwLjkuNmMtZW5naW5lIHJlbGVhc2U6XQogICAgIEFkZCBzdXBwb3J0IGZvciBDcnlwdG9ncmFwaGljIEFwcGxpYW5jZSdzIGtleXNlcnZlciB0ZWNobm9sb2d5LgogICAgIChVc2UgZW5naW5lICdrZXljbGllbnQnKQogICAgIFtDcnlwdG9ncmFwaGljIEFwcGxpYW5jZXMgYW5kIEdlb2ZmIFRob3JwZV0KCiAgKikgQWRkIGEgY29uZmlndXJhdGlvbiBlbnRyeSBmb3IgT1MvMzkwIFVuaXguICBUaGUgQyBjb21waWxlciAnYzg5JwogICAgIGlzIGNhbGxlZCB2aWEgdG9vbHMvYzg5LnNoIGJlY2F1c2UgYXJndW1lbnRzIGhhdmUgdG8gYmUKICAgICByZWFycmFuZ2VkIChhbGwgJy1MJyBvcHRpb25zIG11c3QgYXBwZWFyIGJlZm9yZSB0aGUgZmlyc3Qgb2JqZWN0CiAgICAgbW9kdWxlcykuCiAgICAgW1JpY2hhcmQgU2hhcGlybyA8cnNoYXBpcm9AYWJpbml0aW8uY29tPl0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgQWRkIHN1cHBvcnQgZm9yIEJyb2FkY29tIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcywgYmFja3BvcnRlZAogICAgIGZyb20gMC45LjcuCiAgICAgW0Jyb2FkY29tLCBOYWxpbiBEYWh5YWJoYWkgPG5hbGluQHJlZGhhdC5jb20+LCBNYXJrIENveF0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgQWRkIHN1cHBvcnQgZm9yIFN1cmVXYXJlIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcyBmcm9tIAogICAgIEJhbHRpbW9yZSBUZWNobm9sb2dpZXMuICAoVXNlIGVuZ2luZSAnc3VyZXdhcmUnKQogICAgIFtCYWx0aW1vcmUgVGVjaG5vbG9naWVzIGFuZCBNYXJrIENveF0KCiAgKikgW0luIDAuOS42Yy1lbmdpbmUgcmVsZWFzZTpdCiAgICAgQWRkIHN1cHBvcnQgZm9yIGNyeXB0byBhY2NlbGVyYXRvciBjYXJkcyBmcm9tIEFjY2VsZXJhdGVkCiAgICAgRW5jcnlwdGlvbiBQcm9jZXNzaW5nLCB3d3cuYWVwLmllLiAgKFVzZSBlbmdpbmUgJ2FlcCcpCiAgICAgW0FFUCBJbmMuIGFuZCBNYXJrIENveF0KCiAgKikgQWRkIGEgY29uZmlndXJhdGlvbiBlbnRyeSBmb3IgZ2NjIG9uIFVuaXhXYXJlLgogICAgIFtHYXJ5IEJlbnNvbiA8Z2JlbnNvbkByZWRoYXQuY29tPl0KCiAgKikgQ2hhbmdlIHNzbC9zMl9jbG50LmMgYW5kIHNzbC9zMl9zcnZyLmMgc28gdGhhdCByZWNlaXZlZCBoYW5kc2hha2UKICAgICBtZXNzYWdlcyBhcmUgc3RvcmVkIGluIGEgc2luZ2xlIHBpZWNlIChmaXhlZC1sZW5ndGggcGFydCBhbmQKICAgICB2YXJpYWJsZS1sZW5ndGggcGFydCBjb21iaW5lZCkgYW5kIGZpeCB2YXJpb3VzIGJ1Z3MgZm91bmQgb24gdGhlIHdheS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEaXNhYmxlIGNhY2hpbmcgaW4gQklPX2dldGhvc3RieW5hbWUoKSwgZGlyZWN0bHkgdXNlIGdldGhvc3RieW5hbWUoKQogICAgIGluc3RlYWQuICBCSU9fZ2V0aG9zdGJ5bmFtZSgpIGRvZXMgbm90IGtub3cgd2hhdCB0aW1lb3V0cyBhcmUKICAgICBhcHByb3ByaWF0ZSwgc28gZW50cmllcyB3b3VsZCBzdGF5IGluIGNhY2hlIGV2ZW4gd2hlbiB0aGV5IGhhdmUKICAgICBiZWNvbWUgaW52YWxpZC4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtIHBvaW50ZWQgb3V0IGJ5IFJpY2ggU2FseiA8cnNhbHpAem9sZXJhLmNvbT4KCiAgKikgQ2hhbmdlIHNzbDIzX2dldF9jbGllbnRfaGVsbG8gKHNzbC9zMjNfc3J2ci5jKSBiZWhhdmlvdXIgd2hlbgogICAgIGZhY2VkIHdpdGggYSBwYXRob2xvZ2ljYWxseSBzbWFsbCBDbGllbnRIZWxsbyBmcmFnbWVudCB0aGF0IGRvZXMKICAgICBub3QgY29udGFpbiBjbGllbnRfdmVyc2lvbjogSW5zdGVhZCBvZiBhYm9ydGluZyB3aXRoIGFuIGVycm9yLAogICAgIHNpbXBseSBjaG9vc2UgdGhlIGhpZ2hlc3QgYXZhaWxhYmxlIHByb3RvY29sIHZlcnNpb24gKGkuZS4sCiAgICAgVExTIDEuMCB1bmxlc3MgaXQgaXMgZGlzYWJsZWQpLiAgSW4gcHJhY3RpY2UsIENsaWVudEhlbGxvCiAgICAgbWVzc2FnZXMgYXJlIG5ldmVyIHNlbnQgbGlrZSB0aGlzLCBidXQgdGhpcyBjaGFuZ2UgZ2l2ZXMgdXMKICAgICBzdHJpY3RseSBjb3JyZWN0IGJlaGF2aW91ciBhdCBsZWFzdCBmb3IgVExTLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBTU0wgaGFuZHNoYWtlIGZ1bmN0aW9ucyBhbmQgU1NMX2NsZWFyKCkgc3VjaCB0aGF0IFNTTF9jbGVhcigpCiAgICAgbmV2ZXIgcmVzZXRzIHMtPm1ldGhvZCB0byBzLT5jdHgtPm1ldGhvZCB3aGVuIGNhbGxlZCBmcm9tIHdpdGhpbgogICAgIG9uZSBvZiB0aGUgU1NMIGhhbmRzaGFrZSBmdW5jdGlvbnMuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSBwb2ludGVkIG91dCBieSBOaWtvIEJhcmljXQoKICAqKSBJbiBzc2wzX2dldF9jbGllbnRfaGVsbG8gKHNzbC9zM19zcnZyLmMpLCBnZW5lcmF0ZSBhIGZhdGFsIGFsZXJ0CiAgICAgKHNlbnQgdXNpbmcgdGhlIGNsaWVudCdzIHZlcnNpb24gbnVtYmVyKSBpZiBjbGllbnRfdmVyc2lvbiBpcwogICAgIHNtYWxsZXIgdGhhbiB0aGUgcHJvdG9jb2wgdmVyc2lvbiBpbiB1c2UuICBBbHNvIGNoYW5nZQogICAgIHNzbDIzX2dldF9jbGllbnRfaGVsbG8gKHNzbC9zMjNfc3J2ci5jKSB0byBzZWxlY3QgVExTIDEuMCBpZgogICAgIHRoZSBjbGllbnQgZGVtYW5kZWQgU1NMIDMuMCBidXQgb25seSBUTFMgMS4wIGlzIGVuYWJsZWQ7IHRoZW4KICAgICB0aGUgY2xpZW50IHdpbGwgYXQgbGVhc3Qgc2VlIHRoYXQgYWxlcnQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHNzbDNfZ2V0X21lc3NhZ2UgKHNzbC9zM19ib3RoLmMpIHRvIGhhbmRsZSBtZXNzYWdlIGZyYWdtZW50YXRpb24KICAgICBjb3JyZWN0bHkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQXZvaWQgaW5maW5pdGUgbG9vcCBpbiBzc2wzX2dldF9tZXNzYWdlIChzc2wvczNfYm90aC5jKSBpZiBhCiAgICAgY2xpZW50IHJlY2VpdmVzIEhlbGxvUmVxdWVzdCB3aGlsZSBpbiBhIGhhbmRzaGFrZS4KICAgICBbQm9kbyBNb2VsbGVyOyBidWcgbm90aWNlZCBieSBBbmR5IFNjaG5laWRlciA8YW5keS5zY2huZWlkZXJAYmpzcy5jby51az5dCgogICopIEJ1Z2ZpeCBpbiBzc2wzX2FjY2VwdCAoc3NsL3MzX3NydnIuYyk6IENhc2UgU1NMM19TVF9TV19IRUxMT19SRVFfQwogICAgIHNob3VsZCBlbmQgaW4gJ2JyZWFrJywgbm90ICdnb3RvIGVuZCcgd2hpY2ggY2lyY3VtZW50cyB2YXJpb3VzCiAgICAgY2xlYW51cHMgZG9uZSBpbiBzdGF0ZSBTU0xfU1RfT0suICAgQnV0IHNlc3Npb24gcmVsYXRlZCBzdHVmZgogICAgIG11c3QgYmUgZGlzYWJsZWQgZm9yIFNTTF9TVF9PSyBpbiB0aGUgY2FzZSB0aGF0IHdlIGp1c3Qgc2VudCBhCiAgICAgSGVsbG9SZXF1ZXN0LgoKICAgICBBbHNvIGF2b2lkIHNvbWUgb3ZlcmhlYWQgYnkgbm90IGNhbGxpbmcgc3NsX2luaXRfd2Jpb19idWZmZXIoKQogICAgIGJlZm9yZSBqdXN0IHNlbmRpbmcgYSBIZWxsb1JlcXVlc3QuCiAgICAgW0JvZG8gTW9lbGxlciwgRXJpYyBSZXNjb3JsYSA8ZWtyQHJ0Zm0uY29tPl0KCiAgKikgRml4IHNzbC9zM19lbmMuYywgc3NsL3QxX2VuYy5jIGFuZCBzc2wvczNfcGt0LmMgc28gdGhhdCB3ZSBkb24ndAogICAgIHJldmVhbCB3aGV0aGVyIGlsbGVnYWwgYmxvY2sgY2lwaGVyIHBhZGRpbmcgd2FzIGZvdW5kIG9yIGEgTUFDCiAgICAgdmVyaWZpY2F0aW9uIGVycm9yIG9jY3VyZWQuICAoTmVpdGhlciBTU0xlcnIoKSBjb2RlcyBub3IgYWxlcnRzCiAgICAgYXJlIGRpcmVjdGx5IHZpc2libGUgdG8gcG90ZW50aWFsIGF0dGFja2VycywgYnV0IHRoZSBpbmZvcm1hdGlvbgogICAgIG1heSBsZWFrIHZpYSBsb2dmaWxlcy4pCgogICAgIFNpbWlsYXIgY2hhbmdlcyBhcmUgbm90IHJlcXVpcmVkIGZvciB0aGUgU1NMIDIuMCBpbXBsZW1lbnRhdGlvbgogICAgIGJlY2F1c2UgdGhlIG51bWJlciBvZiBwYWRkaW5nIGJ5dGVzIGlzIHNlbnQgaW4gY2xlYXIgZm9yIFNTTCAyLjAsCiAgICAgYW5kIHRoZSBleHRyYSBieXRlcyBhcmUganVzdCBpZ25vcmVkLiAgSG93ZXZlciBzc2wvczJfcGt0LmMKICAgICBmYWlsZWQgdG8gdmVyaWZ5IHRoYXQgdGhlIHB1cnBvcnRlZCBudW1iZXIgb2YgcGFkZGluZyBieXRlcyBpcyBpbgogICAgIHRoZSBsZWdhbCByYW5nZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgT3BlblVOSVgtOCBzdXBwb3J0IGluY2x1ZGluZyBzaGFyZWQgbGlicmFyaWVzCiAgICAgKEJveWQgTHlubiBHZXJiZXIgPGdlcmJlcmJAemVuZXouY29tPikuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEltcHJvdmUgUlNBX3BhZGRpbmdfY2hlY2tfUEtDUzFfT0FFUCgpIGNoZWNrIGFnYWluIHRvIGF2b2lkCiAgICAgJ3dyaXN0d2F0Y2ggYXR0YWNrJyB1c2luZyBodWdlIGVuY29kaW5nIHBhcmFtZXRlcnMgKGNmLgogICAgIEphbWVzIEguIE1hbmdlcidzIENSWVBUTyAyMDAxIHBhcGVyKS4gIE5vdGUgdGhhdCB0aGUKICAgICBSU0FfUEtDUzFfT0FFUF9QQURESU5HIGNhc2Ugb2YgUlNBX3ByaXZhdGVfZGVjcnlwdCgpIGRvZXMgbm90IHVzZQogICAgIGVuY29kaW5nIHBhcmFtZXRlcnMgYW5kIGhlbmNlIHdhcyBub3QgdnVsbmVyYWJsZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCTl9zcXIoKSBidWcgZml4LgogICAgIFtVbGYgTfZsbGVyLCByZXBvcnRlZCBieSBKaW0gRWxsaXMgPGppbS5lbGxpc0BjYXZpdW0uY29tPl0KCiAgKikgUmFiaW4tTWlsbGVyIHRlc3QgYW5hbHlzZXMgYXNzdW1lIHVuaWZvcm1seSBkaXN0cmlidXRlZCB3aXRuZXNzZXMsCiAgICAgc28gdXNlIEJOX3BzZXVkb19yYW5kX3JhbmdlKCkgaW5zdGVhZCBvZiB1c2luZyBCTl9wc2V1ZG9fcmFuZCgpCiAgICAgZm9sbG93ZWQgYnkgbW9kdWxhciByZWR1Y3Rpb24uCiAgICAgW0JvZG8gTW9lbGxlcjsgcG9pbnRlZCBvdXQgYnkgQWRhbSBZb3VuZyA8QVlvdW5nMUBOQ1NVUy5KTkouQ09NPl0KCiAgKikgQWRkIEJOX3BzZXVkb19yYW5kX3JhbmdlKCkgd2l0aCBvYnZpb3VzIGZ1bmN0aW9uYWxpdHk6IEJOX3JhbmRfcmFuZ2UoKQogICAgIGVxdWl2YWxlbnQgYmFzZWQgb24gQk5fcHNldWRvX3JhbmQoKSBpbnN0ZWFkIG9mIEJOX3JhbmQoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBzM19zcnZyLmM6IGFsbG93IHNlbmRpbmcgb2YgbGFyZ2UgY2xpZW50IGNlcnRpZmljYXRlIGxpc3RzICg+IDE2IGtCKS4KICAgICBUaGlzIGZ1bmN0aW9uIHdhcyBicm9rZW4sIGFzIHRoZSBjaGVjayBmb3IgYSBuZXcgY2xpZW50IGhlbGxvIG1lc3NhZ2UKICAgICB0byBoYW5kbGUgU0dDIGRpZCBub3QgYWxsb3cgdGhlc2UgbGFyZ2UgbWVzc2FnZXMuCiAgICAgKFRyYWNrZWQgZG93biBieSAiRG91Z2xhcyBFLiBFbmdlcnQiIDxkZWVuZ2VydEBhbmwuZ292Pi4pCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEFkZCBhbGVydCBkZXNjcmlwdGlvbnMgZm9yIFRMU3YxIHRvIFNTTF9hbGVydF9kZXNjX3N0cmluZ1tfbG9uZ10oKS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGJ1Z2d5IGJlaGF2aW91ciBvZiBCSU9fZ2V0X251bV9yZW5lZ290aWF0ZXMoKSBhbmQgQklPX2N0cmwoKQogICAgIGZvciBCSU9fQ19HRVRfV1JJVEVfQlVGX1NJWkUgKCJTdGVwaGVuIEhpbnRvbiIgPHNoaW50b25AbmV0b3BpYS5jb20+KS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgUmV3b3JrIHRoZSBjb25maWd1cmF0aW9uIGFuZCBzaGFyZWQgbGlicmFyeSBzdXBwb3J0IGZvciBUcnU2NCBVbml4LgogICAgIFRoZSBjb25maWd1cmF0aW9uIHBhcnQgbWFrZXMgdXNlIG9mIG1vZGVybiBjb21waWxlciBmZWF0dXJlcyBhbmQKICAgICBzdGlsbCByZXRhaW5zIG9sZCBjb21waWxlciBiZWhhdmlvciBmb3IgdGhvc2UgdGhhdCBydW4gb2xkZXIgdmVyc2lvbnMKICAgICBvZiB0aGUgT1MuICBUaGUgc2hhcmVkIGxpYnJhcnkgc3VwcG9ydCBwYXJ0IGluY2x1ZGVzIGEgdmFyaWFudCB0aGF0CiAgICAgdXNlcyB0aGUgUlBBVEggZmVhdHVyZSwgYW5kIGlzIGF2YWlsYWJsZSB0aHJvdWdoIHRoZSBzcGVjaWFsCiAgICAgY29uZmlndXJhdGlvbiB0YXJnZXQgImFscGhhLWNjLXJwYXRoIiwgd2hpY2ggd2lsbCBuZXZlciBiZSBzZWxlY3RlZAogICAgIGF1dG9tYXRpY2FsbHkuCiAgICAgW1RpbSBNb29uZXkgPG1vb25leUBkb2diZXJ0LmNjLm5kc3UuTm9EYWsuZWR1PiB2aWEgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBJbiBzc2wzX2dldF9rZXlfZXhjaGFuZ2UgKHNzbC9zM19jbG50LmMpLCBjYWxsIHNzbDNfZ2V0X21lc3NhZ2UoKQogICAgIHdpdGggdGhlIHNhbWUgbWVzc2FnZSBzaXplIGFzIGluIHNzbDNfZ2V0X2NlcnRpZmljYXRlX3JlcXVlc3QoKS4KICAgICBPdGhlcndpc2UsIGlmIG5vIFNlcnZlcktleUV4Y2hhbmdlIG1lc3NhZ2Ugb2NjdXJzLCBDZXJ0aWZpY2F0ZVJlcXVlc3QKICAgICBtZXNzYWdlcyBtaWdodCBpbmFkdmVydGVudGx5IGJlIHJlamVjdCBhcyB0b28gbG9uZy4KICAgICBbUGV0ciBMYW1wYSA8bGFtcGFAZmVlLnZ1dGJyLmN6Pl0KCiAgKikgRW5oYW5jZWQgc3VwcG9ydCBmb3IgSUEtNjQgVW5peCBwbGF0Zm9ybXMgKHdlbGwsIExpbnV4IGFuZCBIUC1VWCkuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE1vZGlmaWVkIFNTTCBsaWJyYXJ5IHN1Y2ggdGhhdCB0aGUgdmVyaWZ5X2NhbGxiYWNrIHRoYXQgaGFzIGJlZW4gc2V0CiAgICAgc3BlY2lmaWNseSBmb3IgYW4gU1NMIG9iamVjdCB3aXRoIFNTTF9zZXRfdmVyaWZ5KCkgaXMgYWN0dWFsbHkgYmVpbmcKICAgICB1c2VkLiBCZWZvcmUgdGhlIGNoYW5nZSwgYSB2ZXJpZnlfY2FsbGJhY2sgc2V0IHdpdGggdGhpcyBmdW5jdGlvbiB3YXMKICAgICBpZ25vcmVkIGFuZCB0aGUgdmVyaWZ5X2NhbGxiYWNrKCkgc2V0IGluIHRoZSBTU0xfQ1RYIGF0IHRoZSB0aW1lIG9mCiAgICAgdGhlIGNhbGwgd2FzIHVzZWQuIE5ldyBmdW5jdGlvbiBYNTA5X1NUT1JFX0NUWF9zZXRfdmVyaWZ5X2NiKCkgaW50cm9kdWNlZAogICAgIHRvIGFsbG93IHRoZSBuZWNlc3Nhcnkgc2V0dGluZ3MuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEluaXRpYWxpemUgc3RhdGljIHZhcmlhYmxlIGluIGNyeXB0by9kc2EvZHNhX2xpYi5jIGFuZCBjcnlwdG8vZGgvZGhfbGliLmMKICAgICBleHBsaWNpdGx5IHRvIE5VTEwsIGFzIGF0IGxlYXN0IG9uIFNvbGFyaXMgOCB0aGlzIHNlZW1zIG5vdCBhbHdheXMgdG8gYmUKICAgICBkb25lIGF1dG9tYXRpY2FsbHkgKGluIGNvbnRyYWRpY3Rpb24gdG8gdGhlIHJlcXVpcmVtZW50cyBvZiB0aGUgQwogICAgIHN0YW5kYXJkKS4gVGhpcyBtYWRlIHByb2JsZW1zIHdoZW4gdXNlZCBmcm9tIE9wZW5TU0guCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEluIE9wZW5TU0wgMC45LjZhIGFuZCAwLjkuNmIsIGNyeXB0by9kaC9kaF9rZXkuYyBpZ25vcmVkCiAgICAgZGgtPmxlbmd0aCBhbmQgYWx3YXlzIHVzZWQKCiAgICAgICAgICBCTl9yYW5kX3JhbmdlKHByaXZfa2V5LCBkaC0+cCkuCgogICAgIEJOX3JhbmRfcmFuZ2UoKSBpcyBub3QgbmVjZXNzYXJ5IGZvciBEaWZmaWUtSGVsbG1hbiwgYW5kIHRoaXMKICAgICBzcGVjaWZpYyByYW5nZSBtYWtlcyBEaWZmaWUtSGVsbG1hbiB1bm5lY2Vzc2FyaWx5IGluZWZmaWNpZW50IGlmCiAgICAgZGgtPmxlbmd0aCAocmVjb21tZW5kZWQgZXhwb25lbnQgbGVuZ3RoKSBpcyBtdWNoIHNtYWxsZXIgdGhhbiB0aGUKICAgICBsZW5ndGggb2YgZGgtPnAuICBXZSBjb3VsZCB1c2UgQk5fcmFuZF9yYW5nZSgpIGlmIHRoZSBvcmRlciBvZgogICAgIHRoZSBzdWJncm91cCB3YXMgc3RvcmVkIGluIHRoZSBESCBzdHJ1Y3R1cmUsIGJ1dCB3ZSBvbmx5IGhhdmUKICAgICBkaC0+bGVuZ3RoLgoKICAgICBTbyBzd2l0Y2ggYmFjayB0bwoKICAgICAgICAgIEJOX3JhbmQocHJpdl9rZXksIGwsIC4uLikKCiAgICAgd2hlcmUgJ2wnIGlzIGRoLT5sZW5ndGggaWYgdGhpcyBpcyBkZWZpbmVkLCBvciBCTl9udW1fYml0cyhkaC0+cCktMQogICAgIG90aGVyd2lzZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbgoKICAgICAgICAgIFJTQV9lYXlfcHVibGljX2VuY3J5cHQKICAgICAgICAgIFJTQV9lYXlfcHJpdmF0ZV9kZWNyeXB0CiAgICAgICAgICBSU0FfZWF5X3ByaXZhdGVfZW5jcnlwdCAoc2lnbmluZykKICAgICAgICAgIFJTQV9lYXlfcHVibGljX2RlY3J5cHQgKHNpZ25hdHVyZSB2ZXJpZmljYXRpb24pCgogICAgIChkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBmb3IgUlNBX3B1YmxpY19lbmNyeXB0LAogICAgIFJTQV9wcml2YXRlX2RlY3J5cHQsIFJTQV9wcml2YXRlX2VuY3J5cHQsIFJTQV9wdWJsaWNfZGVjcnlwdCksCiAgICAgYWx3YXlzIHJlamVjdCBudW1iZXJzID49IG4uCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gY3J5cHRvL3JhbmQvbWRfcmFuZC5jLCB1c2UgYSBuZXcgc2hvcnQtdGltZSBsb2NrIENSWVBUT19MT0NLX1JBTkQyCiAgICAgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvICdsb2NraW5nX3RocmVhZCcuICBUaGlzIGlzIG5lY2Vzc2FyeSBvbgogICAgIHN5c3RlbXMgd2hlcmUgYWNjZXNzIHRvICdsb2NraW5nX3RocmVhZCcgKGFuICd1bnNpZ25lZCBsb25nJwogICAgIHZhcmlhYmxlKSBpcyBub3QgYXRvbWljLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIGNyeXB0by9yYW5kL21kX3JhbmQuYywgc2V0ICdsb2NraW5nX3RocmVhZCcgdG8gY3VycmVudCB0aHJlYWQncyBJRAogICAgICpiZWZvcmUqIHNldHRpbmcgdGhlICdjcnlwdG9fbG9ja19yYW5kJyBmbGFnLiAgVGhlIHByZXZpb3VzIGNvZGUgaGFkCiAgICAgYSByYWNlIGNvbmRpdGlvbiBpZiAwIGlzIGEgdmFsaWQgdGhyZWFkIElELgogICAgIFtUcmF2aXMgVml0ZWsgPHZpdGVrQHJvZ3Vld2F2ZS5jb20+XQoKICAqKSBBZGQgc3VwcG9ydCBmb3Igc2hhcmVkIGxpYnJhcmllcyB1bmRlciBJcml4LgogICAgIFtBbGJlcnQgQ2hpbi1BLVlvdW5nIDxjaGluYUB0aGV3cml0dGVud29yZC5jb20+XQoKICAqKSBBZGQgY29uZmlndXJhdGlvbiBvcHRpb24gdG8gYnVpbGQgb24gTGludXggb24gYm90aCBiaWctZW5kaWFuIGFuZAogICAgIGxpdHRsZS1lbmRpYW4gTUlQUy4KICAgICBbUmFsZiBCYWVjaGxlIDxyYWxmQHVuaS1rb2JsZW56LmRlPl0KCiAgKikgQWRkIHRoZSBwb3NzaWJpbGl0eSB0byBjcmVhdGUgc2hhcmVkIGxpYnJhcmllcyBvbiBIUC1VWC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKIENoYW5nZXMgYmV0d2VlbiAwLjkuNmEgYW5kIDAuOS42YiAgWzkgSnVsIDIwMDFdCgogICopIENoYW5nZSBzc2xlYXlfcmFuZF9ieXRlcyAoY3J5cHRvL3JhbmQvbWRfcmFuZC5jKQogICAgIHRvIGF2b2lkIGEgU1NMZWF5L09wZW5TU0wgUFJORyB3ZWFrbmVzcyBwb2ludGVkIG91dCBieQogICAgIE1hcmtrdS1KdWhhbmkgTy4gU2FhcmluZW4gPG1hcmtrdS1qdWhhbmkuc2FhcmluZW5Abm9raWEuY29tPjoKICAgICBQUk5HIHN0YXRlIHJlY292ZXJ5IHdhcyBwb3NzaWJsZSBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mCiAgICAgb25lIFBSTkcgcmVxdWVzdCBhcHByb3ByaWF0ZWx5IHNpemVkIHRvIGdhaW4ga25vd2xlZGdlIG9uCiAgICAgJ21kJyBmb2xsb3dlZCBieSBlbm91Z2ggY29uc2VjdXRpdmUgMS1ieXRlIFBSTkcgcmVxdWVzdHMKICAgICB0byB0cmF2ZXJzZSBhbGwgb2YgJ3N0YXRlJy4KCiAgICAgMS4gV2hlbiB1cGRhdGluZyAnbWRfbG9jYWwnICh0aGUgY3VycmVudCB0aHJlYWQncyBjb3B5IG9mICdtZCcpCiAgICAgICAgZHVyaW5nIFBSTkcgb3V0cHV0IGdlbmVyYXRpb24sIGhhc2ggYWxsIG9mIHRoZSBwcmV2aW91cwogICAgICAgICdtZF9sb2NhbCcgdmFsdWUsIG5vdCBqdXN0IHRoZSBoYWxmIHVzZWQgZm9yIFBSTkcgb3V0cHV0LgoKICAgICAyLiBNYWtlIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJvbSAnc3RhdGUnIGluY2x1ZGVkIGludG8gdGhlIGhhc2gKICAgICAgICBpbmRlcGVuZGVudCBmcm9tIHRoZSBudW1iZXIgb2YgUFJORyBieXRlcyByZXF1ZXN0ZWQuCgogICAgIFRoZSBmaXJzdCBtZWFzdXJlIGFsb25lIHdvdWxkIGJlIHN1ZmZpY2llbnQgdG8gYXZvaWQKICAgICBNYXJra3UtSnVoYW5pJ3MgYXR0YWNrLiAgKEFjdHVhbGx5IGl0IGhhZCBuZXZlciBvY2N1cnJlZAogICAgIHRvIG1lIHRoYXQgdGhlIGhhbGYgb2YgJ21kX2xvY2FsJyB1c2VkIGZvciBjaGFpbmluZyB3YXMgdGhlCiAgICAgaGFsZiBmcm9tIHdoaWNoIFBSTkcgb3V0cHV0IGJ5dGVzIHdlcmUgdGFrZW4gLS0gSSBoYWQgYWx3YXlzCiAgICAgYXNzdW1lZCB0aGF0IHRoZSBzZWNyZXQgaGFsZiB3b3VsZCBiZSB1c2VkLikgIFRoZSBzZWNvbmQKICAgICBtZWFzdXJlIG1ha2VzIHN1cmUgdGhhdCBhZGRpdGlvbmFsIGRhdGEgZnJvbSAnc3RhdGUnIGlzIG5ldmVyCiAgICAgbWl4ZWQgaW50byAnbWRfbG9jYWwnIGluIHNtYWxsIHBvcnRpb25zOyB0aGlzIGhldXJpc3RpY2FsbHkKICAgICBmdXJ0aGVyIHN0cmVuZ3RoZW5zIHRoZSBQUk5HLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBjcnlwdG8vYm4vYXNtL21pcHMzLnMuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIFdoZW4gb25seSB0aGUga2V5IGlzIGdpdmVuIHRvICJlbmMiLCB0aGUgSVYgaXMgdW5kZWZpbmVkLiBQcmludCBvdXQKICAgICBhbiBlcnJvciBtZXNzYWdlIGluIHRoaXMgY2FzZS4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiAgKikgSGFuZGxlIHNwZWNpYWwgY2FzZSB3aGVuIFg1MDlfTkFNRSBpcyBlbXB0eSBpbiBYNTA5IHByaW50aW5nIHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluIGRzYV9kb192ZXJpZnkgKGNyeXB0by9kc2EvZHNhX29zc2wuYyksIHZlcmlmeSB0aGF0IHIgYW5kIHMgYXJlCiAgICAgcG9zaXRpdmUgYW5kIGxlc3MgdGhhbiBxLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIERvbid0IGNoYW5nZSAqcG9pbnRlciBpbiBDUllQVE9fYWRkX2xvY2soKSBpcyBhZGRfbG9ja19jYWxsYmFjayBpcwogICAgIHVzZWQ6IGl0IGlzbid0IHRocmVhZCBzYWZlIGFuZCB0aGUgYWRkX2xvY2tfY2FsbGJhY2sgc2hvdWxkIGhhbmRsZQogICAgIHRoYXQgaXRzZWxmLgogICAgIFtQYXVsIFJvc2UgPFBhdWwuUm9zZUBicmlkZ2UuY29tPl0KCiAgKikgVmVyaWZ5IHRoYXQgaW5jb21pbmcgZGF0YSBvYmV5cyB0aGUgYmxvY2sgc2l6ZSBpbgogICAgIHNzbDNfZW5jIChzc2wvczNfZW5jLmMpIGFuZCB0bHMxX2VuYyAoc3NsL3QxX2VuYy5jKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggT0FFUCBjaGVjay4KICAgICBbVWxmIE32bGxlciwgQm9kbyBN9mxsZXJdCgogICopIFRoZSBjb3VudGVybWVhc3VyZSBhZ2FpbnN0IEJsZWljaGJhY2hlcidzIGF0dGFjayBvbiBQS0NTICMxIHYxLjUKICAgICBSU0EgZW5jcnlwdGlvbiB3YXMgYWNjaWRlbnRhbGx5IHJlbW92ZWQgaW4gczNfc3J2ci5jIGluIE9wZW5TU0wgMC45LjUKICAgICB3aGVuIGZpeGluZyB0aGUgc2VydmVyIGJlaGF2aW91ciBmb3IgYmFja3dhcmRzLWNvbXBhdGlibGUgJ2NsaWVudAogICAgIGhlbGxvJyBtZXNzYWdlcy4gIChOb3RlIHRoYXQgdGhlIGF0dGFjayBpcyBpbXByYWN0aWNhbCBhZ2FpbnN0CiAgICAgU1NMIDMuMCBhbmQgVExTIDEuMCBhbnl3YXkgYmVjYXVzZSBsZW5ndGggYW5kIHZlcnNpb24gY2hlY2tpbmcKICAgICBtZWFucyB0aGF0IHRoZSBwcm9iYWJpbGl0eSBvZiBndWVzc2luZyBhIHZhbGlkIGNpcGhlcnRleHQgaXMKICAgICBhcm91bmQgMl4tNDA7IHNlZSBzZWN0aW9uIDUgaW4gQmxlaWNoZW5iYWNoZXIncyBDUllQVE8gJzk4CiAgICAgcGFwZXIuKQoKICAgICBCZWZvcmUgMC45LjUsIHRoZSBjb3VudGVybWVhc3VyZSAoaGlkZSB0aGUgZXJyb3IgYnkgZ2VuZXJhdGluZyBhCiAgICAgcmFuZG9tICdkZWNyeXB0aW9uIHJlc3VsdCcpIGRpZCBub3Qgd29yayBwcm9wZXJseSBiZWNhdXNlCiAgICAgRVJSX2NsZWFyX2Vycm9yKCkgd2FzIG1pc3NpbmcsIG1lYW5pbmcgdGhhdCBTU0xfZ2V0X2Vycm9yKCkgd291bGQKICAgICBkZXRlY3QgdGhlIHN1cHBvc2VkbHkgaWdub3JlZCBlcnJvci4KCiAgICAgQm90aCBwcm9ibGVtcyBhcmUgbm93IGZpeGVkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIGNyeXB0by9iaW8vYmZfYnVmZi5jLCBpbmNyZWFzZSBERUZBVUxUX0JVRkZFUl9TSVpFIHRvIDQwOTYKICAgICAocHJldmlvdXNseSBpdCB3YXMgMTAyNCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IGZvciBjb21wYXRpYmlsaXR5IG1vZGUgdHJ1c3Qgc2V0dGluZ3M6IGlnbm9yZSB0cnVzdCBzZXR0aW5ncwogICAgIHVubGVzcyBzb21lIHZhbGlkIHRydXN0IG9yIHJlamVjdCBzZXR0aW5ncyBhcmUgcHJlc2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggZm9yIGJsb3dmaXNoIEVWUDogaXRzIGEgdmFyaWFibGUgbGVuZ3RoIGNpcGhlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdmFyaW91cyBidWdzIHJlbGF0ZWQgdG8gRFNBIFMvTUlNRSB2ZXJpZmljYXRpb24uIEhhbmRsZSBtaXNzaW5nCiAgICAgcGFyYW1ldGVycyBpbiBEU0EgcHVibGljIGtleSBzdHJ1Y3R1cmVzIGFuZCByZXR1cm4gYW4gZXJyb3IgaW4gdGhlCiAgICAgRFNBIHJvdXRpbmVzIGlmIHBhcmFtZXRlcnMgYXJlIGFic2VudC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiB2ZXJzaW9ucyB1cCB0byAwLjkuNiwgUkFORF9maWxlX25hbWUoKSByZXNvcnRlZCB0byBmaWxlICIucm5kIgogICAgIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpZiBuZWl0aGVyICRSQU5ERklMRSBub3IgJEhPTUUgd2FzIHNldC4KICAgICBSQU5EX2ZpbGVfbmFtZSgpIGluIDAuOS42YSByZXR1cm5lZCBOVUxMIGluIHRoaXMgY2FzZS4gIFRoaXMgaGFzCiAgICAgY2F1c2VkIHNvbWUgY29uZnVzaW9uIHRvIFdpbmRvd3MgdXNlcnMgd2hvIGhhdmVuJ3QgZGVmaW5lZCAkSE9NRS4KICAgICBUaHVzIFJBTkRfZmlsZV9uYW1lKCkgaXMgY2hhbmdlZCBhZ2FpbjogZV9vcy5oIGNhbiBkZWZpbmUgYQogICAgIERFRkFVTFRfSE9NRSwgd2hpY2ggd2lsbCBiZSB1c2VkIGlmICRIT01FIGlzIG5vdCBzZXQuCiAgICAgRm9yIFdpbmRvd3MsIHdlIHVzZSAiQzoiOyBvbiBvdGhlciBwbGF0Zm9ybXMsIHdlIHN0aWxsIHJlcXVpcmUKICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCgogICopIE1vdmUgJ2lmICghaW5pdGlhbGl6ZWQpIFJBTkRfcG9sbCgpJyBpbnRvIHJlZ2lvbnMgcHJvdGVjdGVkIGJ5CiAgICAgQ1JZUFRPX0xPQ0tfUkFORC4gIFRoaXMgaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IGF2b2lkcwogICAgIGhhdmluZyBtdWx0aXBsZSB0aHJlYWRzIGNhbGwgUkFORF9wb2xsKCkgY29uY3VycmVudGx5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIGNyeXB0by9yYW5kL21kX3JhbmQuYywgcmVwbGFjZSAnYWRkX2RvX25vdF9sb2NrJyBmbGFnIGJ5IGEKICAgICBjb21iaW5hdGlvbiBvZiBhIGZsYWcgYW5kIGEgdGhyZWFkIElEIHZhcmlhYmxlLgogICAgIE90aGVyd2lzZSB3aGlsZSBvbmUgdGhyZWFkIGlzIGluIHNzbGVheV9yYW5kX2J5dGVzICh3aGljaCBzZXRzIHRoZQogICAgIGZsYWcpLCAqb3RoZXIqIHRocmVhZHMgY2FuIGVudGVyIHNzbGVheV9hZGRfYnl0ZXMgd2l0aG91dCBvYmV5aW5nCiAgICAgdGhlIENSWVBUT19MT0NLX1JBTkQgbG9jayAoYW5kIG1heSBldmVuIGlsbGVnYWxseSByZWxlYXNlIHRoZSBsb2NrCiAgICAgdGhhdCB0aGV5IGRvIG5vdCBob2xkIGFmdGVyIHRoZSBmaXJzdCB0aHJlYWQgdW5zZXRzIGFkZF9kb19ub3RfbG9jaykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIGJjdGVzdCBhZ2FpbjogJy14JyBleHByZXNzaW9ucyBhcmUgbm90IGF2YWlsYWJsZSBpbiBhbGwKICAgICB2ZXJzaW9ucyBvZiAndGVzdCcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjYgYW5kIDAuOS42YSAgWzUgQXByIDIwMDFdCgogICopIEZpeCBhIGNvdXBsZSBvZiBtZW1vcnkgbGVha3MgaW4gUEtDUzdfZGF0YURlY29kZSgpCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgSGV5dW4gWmhlbmcgPGh6aGVuZ0BhdGRzcHJpbnQuY29tPl0KCiAgKikgQ2hhbmdlIENvbmZpZ3VyZSBhbmQgTWFrZWZpbGVzIHRvIHByb3ZpZGUgRVhFX0VYVCwgd2hpY2ggd2lsbCBjb250YWluCiAgICAgdGhlIGRlZmF1bHQgZXh0ZW5zaW9uIGZvciBleGVjdXRhYmxlcywgaWYgYW55LiAgQWxzbywgbWFrZSB0aGUgcGVybAogICAgIHNjcmlwdHMgdGhhdCB1c2Ugc3ltbGluaygpIHRvIHRlc3QgaWYgaXQgcmVhbGx5IGV4aXN0cyBhbmQgdXNlICJjcCIKICAgICBpZiBpdCBkb2Vzbid0LiAgQWxsIHRoaXMgbWFkZSBPcGVuU1NMIGNvbXBpbGFibGUgYW5kIGluc3RhbGxhYmxlIGluCiAgICAgQ3lnV2luLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBmb3IgYXNuMV9HZXRTZXF1ZW5jZSgpIGZvciBpbmRlZmluaXRlIGxlbmd0aCBjb25zdHJ1Y3RlZCBkYXRhLgogICAgIElmIFNFUVVFTkNFIGlzIGxlbmd0aCBpcyBpbmRlZmluaXRlIGp1c3Qgc2V0IGMtPnNsZW4gdG8gdGhlIHRvdGFsCiAgICAgYW1vdW50IG9mIGRhdGEgYXZhaWxhYmxlLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IHNoaWdlQEZyZWVCU0Qub3JnXQogICAgIFtUaGlzIGNoYW5nZSBkb2VzIG5vdCBhcHBseSB0byAwLjkuNy5dCgogICopIENoYW5nZSBiY3Rlc3QgdG8gYXZvaWQgaGVyZS1kb2N1bWVudHMgaW5zaWRlIGNvbW1hbmQgc3Vic3RpdHV0aW9uCiAgICAgKHdvcmthcm91bmQgZm9yIEZyZWVCU0QgL2Jpbi9zaCBidWcpLgogICAgIEZvciBjb21wYXRpYmlsaXR5IHdpdGggVWx0cml4LCBhdm9pZCBzaGVsbCBmdW5jdGlvbnMgKGludHJvZHVjZWQKICAgICBpbiB0aGUgYmN0ZXN0IHZlcnNpb24gdGhhdCBzZWFyY2hlcyBhbG9uZyAkUEFUSCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVuYW1lICdkZXNfZW5jcnlwdCcgdG8gJ2Rlc19lbmNyeXB0MScuICBUaGlzIGF2b2lkcyB0aGUgY2xhc2hlcwogICAgIHdpdGggZGVzX2VuY3J5cHQoKSBkZWZpbmVkIG9uIHNvbWUgb3BlcmF0aW5nIHN5c3RlbXMsIGxpa2UgU29sYXJpcwogICAgIGFuZCBVbml4V2FyZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBDaGVjayB0aGUgcmVzdWx0IG9mIFJTQS1DUlQgKHNlZSBELiBCb25laCwgUi4gRGVNaWxsbywgUi4gTGlwdG9uOgogICAgIE9uIHRoZSBJbXBvcnRhbmNlIG9mIEVsaW1pbmF0aW5nIEVycm9ycyBpbiBDcnlwdG9ncmFwaGljCiAgICAgQ29tcHV0YXRpb25zLCBKLiBDcnlwdG9sb2d5IDE0ICgyMDAxKSAyLCAxMDEtMTE5LAogICAgIGh0dHA6Ly90aGVvcnkuc3RhbmZvcmQuZWR1L35kYWJvL3BhcGVycy9mYXVsdHMucHMuZ3opLgogICAgIFtVbGYgTW9lbGxlcl0KICAKICAqKSBNSVBTIGFzc2VtYmxlciBCSUdOVU0gZGl2aXNpb24gYnVnIGZpeC4gCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIERpc2FibGVkIGluY29ycmVjdCBBbHBoYSBhc3NlbWJsZXIgY29kZS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBGaXggUEtDUyM3IGRlY29kZSByb3V0aW5lcyBzbyB0aGV5IGNvcnJlY3RseSB1cGRhdGUgdGhlIGxlbmd0aAogICAgIGFmdGVyIHJlYWRpbmcgYW4gRU9DIGZvciB0aGUgRVhQTElDSVQgdGFnLgogICAgIFtTdGV2ZSBIZW5zb25dCiAgICAgW1RoaXMgY2hhbmdlIGRvZXMgbm90IGFwcGx5IHRvIDAuOS43Ll0KCiAgKikgRml4IGJ1ZyBpbiBQS0NTIzEyIGtleSBnZW5lcmF0aW9uIHJvdXRpbmVzLiBUaGlzIHdhcyB0cmlnZ2VyZWQKICAgICBpZiBhIDNERVMga2V5IHdhcyBnZW5lcmF0ZWQgd2l0aCBhIDAgaW5pdGlhbCBieXRlLiBJbmNsdWRlCiAgICAgUEtDUzEyX0JST0tFTl9LRVlHRU4gY29tcGlsYXRpb24gb3B0aW9uIHRvIHJldGFpbiB0aGUgb2xkCiAgICAgKGJ1dCBicm9rZW4pIGJlaGF2aW91ci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIGJjdGVzdCB0byBzZWFyY2ggZm9yIGEgd29ya2luZyBiYyBhbG9uZyAkUEFUSCBhbmQgcHJpbnQKICAgICBpdCB3aGVuIGZvdW5kLgogICAgIFtUaW0gUmljZSA8dGltQG11bHRpdGFsZW50cy5uZXQ+IHZpYSBSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBtZW1vcnkgbGVha3MgaW4gZXJyLmM6IGZyZWUgZXJyX2RhdGEgc3RyaW5nIGlmIG5lY2Vzc2FyeTsKICAgICBkb24ndCB3cml0ZSB0byB0aGUgd3JvbmcgaW5kZXggaW4gRVJSX3NldF9lcnJvcl9kYXRhLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEltcGxlbWVudCBzc2wyM19wZWVrIChhbmFsb2dvdXMgdG8gc3NsMjNfcmVhZCksIHdoaWNoIHByZXZpb3VzbHkKICAgICBkaWQgbm90IGV4aXN0LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlcGxhY2UgcmR0c2Mgd2l0aCBfZW1pdCBzdGF0ZW1lbnRzIGZvciBWQysrIHZlcnNpb24gNS4KICAgICBbSmVyZW15IENvb3BlciA8amVyZW15QGJheW1vby5vcmc+XQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIHJldXNlIFNTTHYyIHNlc3Npb25zLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEluIGNvcHlfZW1haWwoKSBjaGVjayBmb3IgPj0gMCBhcyBhIHJldHVybiB2YWx1ZSBmb3IKICAgICBYNTA5X05BTUVfZ2V0X2luZGV4X2J5X05JRCgpIHNpbmNlIDAgaXMgYSB2YWxpZCBpbmRleC4KICAgICBbU3RldmUgSGVuc29uIHJlcG9ydGVkIGJ5IE1hc3NpbWlsaWFubyBQYWxhIDxtYWR3b2xmQG9wZW5zY2Eub3JnPl0KCiAgKikgQXZvaWQgY29yZWR1bXAgd2l0aCB1bnN1cHBvcnRlZCBvciBpbnZhbGlkIHB1YmxpYyBrZXlzIGJ5IGNoZWNraW5nIGlmCiAgICAgWDUwOV9nZXRfcHVia2V5KCkgZmFpbHMgaW4gUEtDUzdfdmVyaWZ5KCkuIEZpeCBtZW1vcnkgbGVhayB3aGVuCiAgICAgUEtDUzdfdmVyaWZ5KCkgZmFpbHMgd2l0aCBub24gZGV0YWNoZWQgZGF0YS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEb24ndCB1c2UgZ2V0ZW52IGluIGxpYnJhcnkgZnVuY3Rpb25zIHdoZW4gcnVuIGFzIHNldHVpZC9zZXRnaWQuCiAgICAgTmV3IGZ1bmN0aW9uIE9QRU5TU0xfaXNzZXR1Z2lkKCkuCiAgICAgW1VsZiBNb2VsbGVyXQoKICAqKSBBdm9pZCBmYWxzZSBwb3NpdGl2ZXMgaW4gbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIGNvZGUgKGNyeXB0by9tZW1fZGJnLmMpCiAgICAgZHVlIHRvIGluY29ycmVjdCBoYW5kbGluZyBvZiBtdWx0aS10aHJlYWRpbmc6CgogICAgIDEuIEZpeCB0aW1pbmcgZ2xpdGNoIGluIHRoZSBNZW1DaGVja19vZmYoKSBwb3J0aW9uIG9mIENSWVBUT19tZW1fY3RybCgpLgoKICAgICAyLiBGaXggbG9naWNhbCBnbGl0Y2ggaW4gaXNfTWVtQ2hlY2tfb24oKSBha2EgQ1JZUFRPX2lzX21lbV9jaGVja19vbigpLgoKICAgICAzLiBDb3VudCBob3cgbWFueSB0aW1lcyBNZW1DaGVja19vZmYoKSBoYXMgYmVlbiBjYWxsZWQgc28gdGhhdAogICAgICAgIG5lc3RlZCB1c2UgY2FuIGJlIHRyZWF0ZWQgY29ycmVjdGx5LiAgVGhpcyBhbHNvIGF2b2lkcyAKICAgICAgICBpbmJhbmQtc2lnbmFsbGluZyBpbiB0aGUgcHJldmlvdXMgY29kZSAod2hpY2ggcmVsaWVkIG9uIHRoZQogICAgICAgIGFzc3VtcHRpb24gdGhhdCB0aHJlYWQgSUQgMCBpcyBpbXBvc3NpYmxlKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgIi1yYW5kIiBvcHRpb24gYWxzbyB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIuCiAgICAgW0x1dHogSmFlbmlja2VdCgogICopIEZpeCBDUFUgZGV0ZWN0aW9uIG9uIElyaXggNi54LgogICAgIFtLdXJ0IEhvY2tlbmJ1cnkgPGtob2NrZW5iQHN0ZXZlbnMtdGVjaC5lZHU+IGFuZAogICAgICAiQnJ1Y2UgVy4gRm9yc2JlcmciIDxicnVjZS5mb3JzYmVyZ0BiYWVzeXN0ZW1zLmNvbT5dCgogICopIEZpeCBYNTA5X05BTUUgYnVnIHdoaWNoIHByb2R1Y2VkIGluY29ycmVjdCBlbmNvZGluZyBpZiBYNTA5X05BTUUKICAgICB3YXMgZW1wdHkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAgICBbVGhpcyBjaGFuZ2UgZG9lcyBub3QgYXBwbHkgdG8gMC45LjcuXQoKICAqKSBVc2UgdGhlIGNhY2hlZCBlbmNvZGluZyBvZiBhbiBYNTA5X05BTUUgc3RydWN0dXJlIHJhdGhlciB0aGFuCiAgICAgY29weWluZyBpdC4gVGhpcyBpcyBhcHBhcmVudGx5IHRoZSByZWFzb24gZm9yIHRoZSBsaWJzYWZlICJlcnJvcnMiCiAgICAgYnV0IHRoZSBjb2RlIGlzIGFjdHVhbGx5IGNvcnJlY3QuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyBmdW5jdGlvbiBCTl9yYW5kX3JhbmdlKCksIGFuZCBmaXggRFNBX3NpZ25fc2V0dXAoKSB0byBwcmV2ZW50CiAgICAgQmxlaWNoZW5iYWNoZXIncyBEU0EgYXR0YWNrLgogICAgIEV4dGVuZCBCTl9bcHNldWRvX11yYW5kOiBBcyBiZWZvcmUsIHRvcD0xIGZvcmNlcyB0aGUgaGlnaGVzdCB0d28gYml0cwogICAgIHRvIGJlIHNldCBhbmQgdG9wPTAgZm9yY2VzIHRoZSBoaWdoZXN0IGJpdCB0byBiZSBzZXQ7IHRvcD0tMSBpcyBuZXcKICAgICBhbmQgbGVhdmVzIHRoZSBoaWdoZXN0IGJpdCByYW5kb20uCiAgICAgW1VsZiBNb2VsbGVyLCBCb2RvIE1vZWxsZXJdCgogICopIEluIHRoZSBOQ09ORl8uLi4tYmFzZWQgaW1wbGVtZW50YXRpb25zIGZvciBDT05GXy4uLiBxdWVyaWVzCiAgICAgKGNyeXB0by9jb25mL2NvbmZfbGliLmMpLCBpZiB0aGUgaW5wdXQgTEhBU0ggaXMgTlVMTCwgYXZvaWQgdXNpbmcKICAgICBhIHRlbXBvcmFyeSBDT05GIHN0cnVjdHVyZSB3aXRoIHRoZSBkYXRhIGNvbXBvbmVudCBzZXQgdG8gTlVMTAogICAgICh3aGljaCBnaXZlcyBzZWdtZW50YXRpb24gZmF1bHRzIGluIGxoX3JldHJpZXZlKS4KICAgICBJbnN0ZWFkLCB1c2UgTlVMTCBmb3IgdGhlIENPTkYgcG9pbnRlciBpbiBDT05GX2dldF9zdHJpbmcgYW5kCiAgICAgQ09ORl9nZXRfbnVtYmVyICh3aGljaCBtYXkgdXNlIGVudmlyb25tZW50IHZhcmlhYmxlcykgYW5kIGRpcmVjdGx5CiAgICAgcmV0dXJuIE5VTEwgZnJvbSBDT05GX2dldF9zZWN0aW9uLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW4gZm9yIEVCQ0RJQy4KICAgICBbVWxmIE1vZWxsZXJdCgogICopIFRvbGVyYXRlIG5vblJlcHVkaWF0aW9uIGFzIGJlaW5nIHZhbGlkIGZvciBTL01JTUUgc2lnbmluZyBhbmQgY2VydFNpZ24KICAgICBrZXlVc2FnZSBpZiBiYXNpY0NvbnN0cmFpbnRzIGFic2VudCBmb3IgYSBDQS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFNNSU1FX3dyaXRlX1BLQ1M3KCkgd3JpdGUgbWFpbCBoZWFkZXIgdmFsdWVzIHdpdGggYSBmb3JtYXQgdGhhdAogICAgIGlzIG1vcmUgZ2VuZXJhbGx5IGFjY2VwdGVkIChubyBzcGFjZXMgYmVmb3JlIHRoZSBzZW1pY29sb24pLCBzaW5jZQogICAgIHNvbWUgcHJvZ3JhbXMgY2FuJ3QgcGFyc2UgdGhvc2UgdmFsdWVzIHByb3Blcmx5IG90aGVyd2lzZS4gIEFsc28gbWFrZQogICAgIHN1cmUgQklPJ3MgdGhhdCBicmVhayBsaW5lcyBhZnRlciBlYWNoIHdyaXRlIGRvIG5vdCBjcmVhdGUgaW52YWxpZAogICAgIGhlYWRlcnMuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFrZSB0aGUgQ1JMIGVuY29kaW5nIHJvdXRpbmVzIHdvcmsgd2l0aCBlbXB0eSBTRVFVRU5DRSBPRi4gVGhlCiAgICAgbWFjcm9zIHByZXZpb3VzbHkgdXNlZCB3b3VsZCBub3QgZW5jb2RlIGFuIGVtcHR5IFNFUVVFTkNFIE9GCiAgICAgYW5kIGJyZWFrIHRoZSBzaWduYXR1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KICAgICBbVGhpcyBjaGFuZ2UgZG9lcyBub3QgYXBwbHkgdG8gMC45LjcuXQoKICAqKSBaZXJvIHRoZSBwcmVtYXN0ZXIgc2VjcmV0IGFmdGVyIGRlcml2aW5nIHRoZSBtYXN0ZXIgc2VjcmV0IGluCiAgICAgREggY2lwaGVyc3VpdGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzb21lIEVWUF9hZGRfZGlnZXN0X2FsaWFzIHJlZ2lzdHJhdGlvbnMgKGFzIGZvdW5kIGluCiAgICAgT3BlblNTTF9hZGRfYWxsX2RpZ2VzdHMoKSkgdG8gU1NMX2xpYnJhcnlfaW5pdCgpCiAgICAgYWthIE9wZW5TU0xfYWRkX3NzbF9hbGdvcml0aG1zKCkuICBUaGlzIHByb3ZpZGVzIGltcHJvdmVkCiAgICAgY29tcGF0aWJpbGl0eSB3aXRoIHBlZXJzIHVzaW5nIFguNTA5IGNlcnRpZmljYXRlcwogICAgIHdpdGggdW5jb252ZW50aW9uYWwgQWxnb3JpdGhtSWRlbnRpZmllciBPSURzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBmb3IgSXJpeCB3aXRoIE5PX0FTTS4KICAgICBbIkJydWNlIFcuIEZvcnNiZXJnIiA8YnJ1Y2UuZm9yc2JlcmdAYmFlc3lzdGVtcy5jb20+XQoKICAqKSAuL2NvbmZpZyBzY3JpcHQgZml4ZXMuCiAgICAgW1VsZiBNb2VsbGVyLCBSaWNoYXJkIExldml0dGVdCgogICopIEZpeCAnb3BlbnNzbCBwYXNzd2QgLTEnLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENoYW5nZSBQS0NTMTJfa2V5X2dlbl9hc2MoKSBzbyBpdCBjYW4gY29wZSB3aXRoIG5vbiBudWxsCiAgICAgdGVybWluYXRlZCBzdHJpbmdzIHdob3NlIGxlbmd0aCBpcyBwYXNzZWQgaW4gdGhlIHBhc3NsZW4KICAgICBwYXJhbWV0ZXIsIGZvciBleGFtcGxlIGZyb20gUEVNIGNhbGxiYWNrcy4gVGhpcyB3YXMgZG9uZQogICAgIGJ5IGFkZGluZyBhbiBleHRyYSBsZW5ndGggcGFyYW1ldGVyIHRvIGFzYzJ1bmkoKS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSA8b2RkaXNzZXlAc2Ftc3VuZy5jby5rcj5dCgogICopIEZpeCBDIGNvZGUgZ2VuZXJhdGVkIGJ5ICdvcGVuc3NsIGRzYXBhcmFtIC1DJzogSWYgYSBCTl9iaW4yYm4KICAgICBjYWxsIGZhaWxlZCwgZnJlZSB0aGUgRFNBIHN0cnVjdHVyZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggdG8gdW5pMmFzYygpIHRvIGNvcGUgd2l0aCB6ZXJvIGxlbmd0aCBVbmljb2RlIHN0cmluZ3MuCiAgICAgVGhlc2UgYXJlIHByZXNlbnQgaW4gc29tZSBQS0NTIzEyIGZpbGVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluY3JlYXNlIHMyLT53YnVmIGFsbG9jYXRpb24gYnkgb25lIGJ5dGUgaW4gc3NsMl9uZXcgKHNzbC9zMl9saWIuYykuCiAgICAgT3RoZXJ3aXNlIGRvX3NzbF93cml0ZSAoc3NsL3MyX3BrdC5jKSB3aWxsIHdyaXRlIGJleW9uZCBidWZmZXIgbGltaXRzCiAgICAgd2hlbiB3cml0aW5nIGEgMzI3NjcgYnl0ZSByZWNvcmQuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSByZXBvcnRlZCBieSBFcmljIERheSA8ZWRheUBjb25jZW50cmljLm5ldD5dCgogICopIEluIFJTQV9lYXlfcHVibGljX3tlbixlZH1jcnlwdCBhbmQgUlNBX2VheV9tb2RfZXhwIChyc2FfZWF5LmMpLAogICAgIG9idGFpbiBsb2NrIENSWVBUT19MT0NLX1JTQSBiZWZvcmUgc2V0dGluZyByc2EtPl9tZXRob2RfbW9kX3tuLHAscX0uCgogICAgIChSU0Egb2JqZWN0cyBoYXZlIGEgcmVmZXJlbmNlIGNvdW50IGFjY2VzcyB0byB3aGljaCBpcyBwcm90ZWN0ZWQKICAgICBieSBDUllQVE9fTE9DS19SU0EgW3NlZSByc2FfbGliLmMsIHMzX3NydnIuYywgc3NsX2NlcnQuYywgc3NsX3JzYS5jXSwKICAgICBzbyB0aGV5IGFyZSBtZWFudCB0byBiZSBzaGFyZWQgYmV0d2VlbiB0aHJlYWRzLikKICAgICBbQm9kbyBNb2VsbGVyLCBHZW9mZiBUaG9ycGU7IG9yaWdpbmFsIHBhdGNoIHN1Ym1pdHRlZCBieQogICAgICJSZWRkaWUsIFN0ZXZlbiIgPFN0ZXZlbi5SZWRkaWVAY2EuY29tPl0KCiAgKikgRml4IGEgZGVhZGxvY2sgaW4gQ1JZUFRPX21lbV9sZWFrcygpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFVzZSBiZXR0ZXIgdGVzdCBwYXR0ZXJucyBpbiBibnRlc3QuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIHJhbmRfd2luLmMgZml4IGZvciBCb3JsYW5kIEMuCiAgICAgW1VsZiBN9mxsZXJdCiAKICAqKSBCTl9yc2hpZnQgYnVnZml4IGZvciBuID09IDAuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIGEgJ2JjdGVzdCcgc2NyaXB0IHRoYXQgY2hlY2tzIGZvciBzb21lIGtub3duICdiYycgYnVncwogICAgIHNvIHRoYXQgJ21ha2UgdGVzdCcgZG9lcyBub3QgYWJvcnQganVzdCBiZWNhdXNlICdiYycgaXMgYnJva2VuLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFN0b3JlIHZlcmlmeV9yZXN1bHQgd2l0aGluIFNTTF9TRVNTSU9OIGFsc28gZm9yIGNsaWVudCBzaWRlIHRvCiAgICAgYXZvaWQgcG90ZW50aWFsIHNlY3VyaXR5IGhvbGUuIChSZS11c2VkIHNlc3Npb25zIG9uIHRoZSBjbGllbnQgc2lkZQogICAgIGFsd2F5cyByZXN1bHRlZCBpbiB2ZXJpZnlfcmVzdWx0PT1YNTA5X1ZfT0ssIG5vdCB1c2luZyB0aGUgb3JpZ2luYWwKICAgICByZXN1bHQgb2YgdGhlIHNlcnZlciBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24uKQogICAgIFtMdXR6IEphZW5pY2tlXQoKICAqKSBGaXggc3NsM19wZW5kaW5nOiBJZiB0aGUgcmVjb3JkIGluIHMtPnMzLT5ycmVjIGlzIG5vdCBvZiB0eXBlCiAgICAgU1NMM19SVF9BUFBMSUNBVElPTl9EQVRBLCByZXR1cm4gMC4KICAgICBTaW1pbGFybHksIGNoYW5nZSBzc2wyX3BlbmRpbmcgdG8gcmV0dXJuIDAgaWYgU1NMX2luX2luaXQocykgaXMgdHJ1ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggU1NMX3BlZWs6CiAgICAgQm90aCBzc2wyX3BlZWsgYW5kIHNzbDNfcGVlaywgd2hpY2ggd2VyZSB0b3RhbGx5IGJyb2tlbiBpbiBlYXJsaWVyCiAgICAgcmVsZWFzZXMsIGhhdmUgYmVlbiByZS1pbXBsZW1lbnRlZCBieSByZW5hbWluZyB0aGUgcHJldmlvdXMKICAgICBpbXBsZW1lbnRhdGlvbnMgb2Ygc3NsMl9yZWFkIGFuZCBzc2wzX3JlYWQgdG8gc3NsMl9yZWFkX2ludGVybmFsCiAgICAgYW5kIHNzbDNfcmVhZF9pbnRlcm5hbCwgcmVzcGVjdGl2ZWx5LCBhbmQgYWRkaW5nICdwZWVrJyBwYXJhbWV0ZXJzCiAgICAgdG8gdGhlbS4gIFRoZSBuZXcgc3NsWzIzXV97cmVhZCxwZWVrfSBmdW5jdGlvbnMgYXJlIGNhbGxzIHRvCiAgICAgc3NsWzIzXV9yZWFkX2ludGVybmFsIHdpdGggdGhlICdwZWVrJyBmbGFnIHNldCBhcHByb3ByaWF0ZWx5LgogICAgIEEgJ3BlZWsnIHBhcmFtZXRlciBoYXMgYWxzbyBiZWVuIGFkZGVkIHRvIHNzbDNfcmVhZF9ieXRlcywgd2hpY2gKICAgICBkb2VzIHRoZSBhY3R1YWwgd29yayBmb3Igc3NsM19yZWFkX2ludGVybmFsLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluaXRpYWxpc2UgImV4X2RhdGEiIG1lbWJlciBvZiBSU0EvRFNBL0RIIHN0cnVjdHVyZXMgcHJpb3IgdG8gY2FsbGluZwogICAgIHRoZSBtZXRob2Qtc3BlY2lmaWMgImluaXQoKSIgaGFuZGxlci4gQWxzbyBjbGVhbiB1cCBleF9kYXRhIGFmdGVyCiAgICAgY2FsbGluZyB0aGUgbWV0aG9kLXNwZWNpZmljICJmaW5pc2goKSIgaGFuZGxlci4gUHJldmlvdXNseSwgdGhpcyB3YXMKICAgICBoYXBwZW5pbmcgdGhlIG90aGVyIHdheSByb3VuZC4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBJbmNyZWFzZSBCTl9DVFhfTlVNICh0aGUgbnVtYmVyIG9mIEJJR05VTXMgaW4gYSBCTl9DVFgpIHRvIDE2LgogICAgIFRoZSBwcmV2aW91cyB2YWx1ZSwgMTIsIHdhcyBub3QgYWx3YXlzIHN1ZmZpY2llbnQgZm9yIEJOX21vZF9leHAoKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIHN1cmUgdGhhdCBzaGFyZWQgbGlicmFyaWVzIGdldCB0aGUgaW50ZXJuYWwgbmFtZSBlbmdpbmUgd2l0aAogICAgIHRoZSBmdWxsIHZlcnNpb24gbnVtYmVyIGFuZCBub3QganVzdCAwLiAgVGhpcyBzaG91bGQgbWFyayB0aGUKICAgICBzaGFyZWQgbGlicmFyaWVzIGFzIG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlLiAgT2YgY291cnNlLCB0aGlzIHNob3VsZAogICAgIGJlIGNoYW5nZWQgYWdhaW4gd2hlbiB3ZSBjYW4gZ3VhcmFudGVlIGJhY2t3YXJkIGJpbmFyeSBjb21wYXRpYmlsaXR5LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCB0eXBvIGluIGdldF9jZXJ0X2J5X3N1YmplY3QoKSBpbiBieV9kaXIuYwogICAgIFtKZWFuLU1hcmMgRGVzcGVycmllciA8amVhbi1tYXJjLmRlc3BlcnJpZXJAY2VydHBsdXMuY29tPl0KCiAgKikgUmV3b3JrIHRoZSBzeXN0ZW0gdG8gZ2VuZXJhdGUgc2hhcmVkIGxpYnJhcmllczoKCiAgICAgLSBNYWtlIG5vdGUgb2YgdGhlIGV4cGVjdGVkIGV4dGVuc2lvbiBmb3IgdGhlIHNoYXJlZCBsaWJyYXJpZXMgYW5kCiAgICAgICBpZiB0aGVyZSBpcyBhIG5lZWQgZm9yIHN5bWJvbGljIGxpbmtzIGZyb20gZm9yIGV4YW1wbGUgbGliY3J5cHRvLnNvLjAKICAgICAgIHRvIGxpYmNyeXB0by5zby4wLjkuNy4gIFRoZXJlIGlzIGV4dGVuZGVkIGluZm8gaW4gQ29uZmlndXJlIGZvcgogICAgICAgdGhhdC4KCiAgICAgLSBNYWtlIGFzIGZldyByZWJ1aWxkcyBvZiB0aGUgc2hhcmVkIGxpYnJhcmllcyBhcyBwb3NzaWJsZS4KCiAgICAgLSBTdGlsbCBhdm9pZCBsaW5raW5nIHRoZSBPcGVuU1NMIHByb2dyYW1zIHdpdGggdGhlIHNoYXJlZCBsaWJyYXJpZXMuCgogICAgIC0gV2hlbiBpbnN0YWxsaW5nLCBpbnN0YWxsIHRoZSBzaGFyZWQgbGlicmFyaWVzIHNlcGFyYXRlbHkgZnJvbSB0aGUKICAgICAgIHN0YXRpYyBvbmVzLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEZpeCBTU0xfQ1RYX3NldF9yZWFkX2FoZWFkIG1hY3JvIHRvIGFjdHVhbGx5IHVzZSBpdHMgYXJndW1lbnQuCgogICAgIENvcHkgU1NMX0NUWCdzIHJlYWRfYWhlYWQgZmxhZyB0byBTU0wgb2JqZWN0IGRpcmVjdGx5IGluIFNTTF9uZXcKICAgICBhbmQgbm90IGluIFNTTF9jbGVhciBiZWNhdXNlIHRoZSBsYXR0ZXIgaXMgYWxzbyB1c2VkIGJ5IHRoZQogICAgIGFjY2VwdC9jb25uZWN0IGZ1bmN0aW9uczsgcHJldmlvdXNseSwgdGhlIHNldHRpbmdzIG1hZGUgYnkKICAgICBTU0xfc2V0X3JlYWRfYWhlYWQgd291bGQgYmUgbG9zdCBkdXJpbmcgdGhlIGhhbmRzaGFrZS4KICAgICBbQm9kbyBNb2VsbGVyOyBwcm9ibGVtcyByZXBvcnRlZCBieSBBbmRlcnMgR2VydHogPGdlcnR6QGVwYWN0LnNlPl0gICAgIAoKICAqKSBDb3JyZWN0IHV0aWwvbWtkZWYucGwgdG8gYmUgc2VsZWN0aXZlIGFib3V0IGRpc2FibGVkIGFsZ29yaXRobXMuCiAgICAgUHJldmlvdXNseSwgaXQgd291bGQgY3JlYXRlIGVudHJpZXMgZm9yIGRpc2FibGVlZCBhbGdvcml0aG1zIG5vCiAgICAgbWF0dGVyIHdoYXQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkZWQgc2V2ZXJhbCBuZXcgbWFudWFsIHBhZ2VzIGZvciBTU0xfKiBmdW5jdGlvbi4KICAgICBbTHV0eiBKYWVuaWNrZV0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjVhIGFuZCAwLjkuNiAgWzI0IFNlcCAyMDAwXQoKICAqKSBJbiBzc2wyM19nZXRfY2xpZW50X2hlbGxvLCBnZW5lcmF0ZSBhbiBlcnJvciBtZXNzYWdlIHdoZW4gZmFjZWQKICAgICB3aXRoIGFuIGluaXRpYWwgU1NMIDMuMC9UTFMgcmVjb3JkIHRoYXQgaXMgdG9vIHNtYWxsIHRvIGNvbnRhaW4gdGhlCiAgICAgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBDbGllbnRIZWxsbyBtZXNzYWdlLCBpLmUuIGNsaWVudF92ZXJzaW9uLgogICAgIChOb3RlIHRoYXQgdGhpcyBpcyBhIHBhdGhvbG9naWMgY2FzZSB0aGF0IHByb2JhYmx5IGhhcyBuZXZlciBoYXBwZW5lZAogICAgIGluIHJlYWwgbGlmZS4pICBUaGUgcHJldmlvdXMgYXBwcm9hY2ggd2FzIHRvIHVzZSB0aGUgdmVyc2lvbiBudW1iZXIKICAgICBmcm9tIHRoZSByZWNvcmQgaGVhZGVyIGFzIGEgc3Vic3RpdHV0ZTsgYnV0IG91ciBwcm90b2NvbCBjaG9pY2UKICAgICBzaG91bGQgbm90IGRlcGVuZCBvbiB0aGF0IG9uZSBiZWNhdXNlIGl0IGlzIG5vdCBhdXRoZW50aWNhdGVkCiAgICAgYnkgdGhlIEZpbmlzaGVkIG1lc3NhZ2VzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vcmUgcm9idXN0IHJhbmRvbW5lc3MgZ2F0aGVyaW5nIGZ1bmN0aW9ucyBmb3IgV2luZG93cy4KICAgICBbSmVmZnJleSBBbHRtYW4gPGphbHRtYW5AY29sdW1iaWEuZWR1Pl0KCiAgKikgRm9yIGNvbXBhdGliaWxpdHkgcmVhc29ucyBpZiB0aGUgZmxhZyBYNTA5X1ZfRkxBR19JU1NVRVJfQ0hFQ0sgaXMKICAgICBub3Qgc2V0IHRoZW4gd2UgZG9uJ3Qgc2V0dXAgdGhlIGVycm9yIGNvZGUgZm9yIGlzc3VlciBjaGVjayBlcnJvcnMKICAgICB0byBhdm9pZCBwb3NzaWJseSBvdmVyd3JpdGluZyBvdGhlciBlcnJvcnMgd2hpY2ggdGhlIGNhbGxiYWNrIGRvZXMKICAgICBoYW5kbGUuIElmIGFuIGFwcGxpY2F0aW9uIGRvZXMgc2V0IHRoZSBmbGFnIHRoZW4gd2UgYXNzdW1lIGl0IGtub3dzCiAgICAgd2hhdCBpdCBpcyBkb2luZyBhbmQgY2FuIGhhbmRsZSB0aGUgbmV3IGluZm9ybWF0aW9uYWwgY29kZXMKICAgICBhcHByb3ByaWF0ZWx5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmb3IgYSBuYXN0eSBidWcgaW4gQVNOMV9UWVBFIGhhbmRsaW5nLiBBU04xX1RZUEUgaXMgdXNlZCBmb3IKICAgICBhIGdlbmVyYWwgIkFOWSIgdHlwZSwgYXMgc3VjaCBpdCBzaG91bGQgYmUgYWJsZSB0byBkZWNvZGUgYW55dGhpbmcKICAgICBpbmNsdWRpbmcgdGFnZ2VkIHR5cGVzLiBIb3dldmVyIGl0IGRpZG4ndCBjaGVjayB0aGUgY2xhc3Mgc28gaXQgd291bGQKICAgICB3cm9uZ2x5IGludGVycHJldCB0YWdnZWQgdHlwZXMgaW4gdGhlIHNhbWUgd2F5IGFzIHRoZWlyIHVuaXZlcnNhbAogICAgIGNvdW50ZXJwYXJ0IGFuZCB1bmtub3duIHR5cGVzIHdlcmUganVzdCByZWplY3RlZC4gQ2hhbmdlZCBzbyB0aGF0IHRoZQogICAgIHRhZ2dlZCBhbmQgdW5rbm93biB0eXBlcyBhcmUgaGFuZGxlZCBpbiB0aGUgc2FtZSB3YXkgYXMgYSBTRVFVRU5DRToKICAgICB0aGF0IGlzIHRoZSBlbmNvZGluZyBpcyBzdG9yZWQgaW50YWN0LiBUaGVyZSBpcyBhbHNvIGEgbmV3IHR5cGUKICAgICAiVl9BU04xX09USEVSIiB3aGljaCBpcyB1c2VkIHdoZW4gdGhlIGNsYXNzIGlzIG5vdCB1bml2ZXJzYWwsIGluIHRoaXMKICAgICBjYXNlIHdlIGhhdmUgbm8gaWRlYSB3aGF0IHRoZSBhY3R1YWwgdHlwZSBpcyBzbyB3ZSBqdXN0IGx1bXAgdGhlbSBhbGwKICAgICB0b2dldGhlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBPbiBWTVMsIHN0ZG91dCBtYXkgdmVyeSB3ZWxsIGxlYWQgdG8gYSBmaWxlIHRoYXQgaXMgd3JpdHRlbiB0bwogICAgIGluIGEgcmVjb3JkLW9yaWVudGVkIGZhc2hpb24uICBUaGF0IG1lYW5zIHRoYXQgZXZlcnkgd3JpdGUoKSB3aWxsCiAgICAgd3JpdGUgYSBzZXBhcmF0ZSByZWNvcmQsIHdoaWNoIHdpbGwgYmUgcmVhZCBzZXBhcmF0ZWx5IGJ5IHRoZQogICAgIHByb2dyYW1zIHRyeWluZyB0byByZWFkIGZyb20gaXQuICBUaGlzIGNhbiBiZSB2ZXJ5IGNvbmZ1c2luZy4KCiAgICAgVGhlIHNvbHV0aW9uIGlzIHRvIHB1dCBhIEJJTyBmaWx0ZXIgaW4gdGhlIHdheSB0aGF0IHdpbGwgYnVmZmVyCiAgICAgdGV4dCB1bnRpbCBhIGxpbmVmZWVkIGlzIHJlYWNoZWQsIGFuZCB0aGVuIHdyaXRlIGV2ZXJ5dGhpbmcgYQogICAgIGxpbmUgYXQgYSB0aW1lLCBzbyBldmVyeSByZWNvcmQgd3JpdHRlbiB3aWxsIGJlIGFuIGFjdHVhbCBsaW5lLAogICAgIG5vdCBjaHVua3Mgb2YgbGluZXMgYW5kIG5vdCAodXN1YWxseSBkb2Vzbid0IGhhcHBlbiwgYnV0IEkndmUKICAgICBzZWVuIGl0IG9uY2UpIHNldmVyYWwgbGluZXMgaW4gb25lIHJlY29yZC4gIEJJT19mX2xpbmVidWZmZXIoKSBpcwogICAgIHRoZSBhbnN3ZXIuCgogICAgIEN1cnJlbnRseSwgaXQncyBhIFZNUy1vbmx5IG1ldGhvZCwgYmVjYXVzZSB0aGF0J3Mgd2hlcmUgaXQgaGFzCiAgICAgYmVlbiB0ZXN0ZWQgd2VsbCBlbm91Z2guCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmVtb3ZlICdvcHRpbWl6ZWQnIHNxdWFyaW5nIHZhcmlhbnQgaW4gQk5fbW9kX211bF9tb250Z29tZXJ5LAogICAgIGl0IGNhbiByZXR1cm4gaW5jb3JyZWN0IHJlc3VsdHMuCiAgICAgKE5vdGU6IFRoZSBidWdneSB2YXJpYW50IHdhcyBub3QgZW5hYmxlZCBpbiBPcGVuU1NMIDAuOS41YSwKICAgICBidXQgaXQgd2FzIGluIDAuOS42LWJldGFbMTJdLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBEaXNhYmxlIHRoZSBjaGVjayBmb3IgY29udGVudCBiZWluZyBwcmVzZW50IHdoZW4gdmVyaWZ5aW5nIGRldGFjaGVkCiAgICAgc2lnbmF0dXJlcyBpbiBwazdfc21pbWUuYy4gU29tZSB2ZXJzaW9ucyBvZiBOZXRzY2FwZSAod3JvbmdseSkKICAgICBpbmNsdWRlIHplcm8gbGVuZ3RoIGNvbnRlbnQgd2hlbiBzaWduaW5nIG1lc3NhZ2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBCSU9fc2h1dGRvd25fd3IgbWFjcm8sIHdoaWNoIGludm9rZXMgdGhlIEJJT19DX1NIVVRET1dOX1dSCiAgICAgQklPX2N0cmwgKGZvciBCSU8gcGFpcnMpLgogICAgIFtCb2RvIE32bGxlcl0KCiAgKikgQWRkIERTTyBtZXRob2QgZm9yIFZNUy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBCdWcgZml4OiBNb250Z29tZXJ5IG11bHRpcGxpY2F0aW9uIGNvdWxkIHByb2R1Y2UgcmVzdWx0cyB3aXRoIHRoZQogICAgIHdyb25nIHNpZ24uCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBSUE0gc3BlY2lmaWNhdGlvbiBvcGVuc3NsLnNwZWMgYW5kIG1vZGlmeSBpdCB0byBidWlsZCB0aHJlZQogICAgIHBhY2thZ2VzLiAgVGhlIGRlZmF1bHQgcGFja2FnZSBjb250YWlucyBhcHBsaWNhdGlvbnMsIGFwcGxpY2F0aW9uCiAgICAgZG9jdW1lbnRhdGlvbiBhbmQgcnVuLXRpbWUgbGlicmFyaWVzLiAgVGhlIGRldmVsIHBhY2thZ2UgY29udGFpbnMKICAgICBpbmNsdWRlIGZpbGVzLCBzdGF0aWMgbGlicmFyaWVzIGFuZCBmdW5jdGlvbiBkb2N1bWVudGF0aW9uLiAgVGhlCiAgICAgZG9jIHBhY2thZ2UgY29udGFpbnMgdGhlIGNvbnRlbnRzIG9mIHRoZSBkb2MgZGlyZWN0b3J5LiAgVGhlIG9yaWdpbmFsCiAgICAgb3BlbnNzbC5zcGVjIHdhcyBwcm92aWRlZCBieSBEYW1pZW4gTWlsbGVyIDxkam1AbWluZHJvdC5vcmc+LgogICAgIFtSaWNoYXJkIExldml0dGVdCiAgICAgCiAgKikgQWRkIGEgbGFyZ2UgbnVtYmVyIG9mIGRvY3VtZW50YXRpb24gZmlsZXMgZm9yIG1hbnkgU1NMIHJvdXRpbmVzLgogICAgIFtMdXR6IEphZW5pY2tlIDxMdXR6LkphZW5pY2tlQGFldC5UVS1Db3R0YnVzLkRFPl0KCiAgKikgQWRkIGEgY29uZmlndXJhdGlvbiBlbnRyeSBmb3IgU29ueSBOZXdzIDQuCiAgICAgW05BS0FKSSBIaXJveXVraSA8bmFrYWppQHR1dHJwLnR1dC5hYy5qcD5dCgogICopIERvbid0IHNldCB0aGUgdHdvIG1vc3Qgc2lnbmlmaWNhbnQgYml0cyB0byBvbmUgd2hlbiBnZW5lcmF0aW5nIGEKICAgICByYW5kb20gbnVtYmVyIDwgcSBpbiB0aGUgRFNBIGxpYnJhcnkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIE5ldyBTU0wgQVBJIG1vZGUgJ1NTTF9NT0RFX0FVVE9fUkVUUlknLiAgVGhpcyBkaXNhYmxlcyB0aGUgZGVmYXVsdAogICAgIGJlaGF2aW91ciB0aGF0IFNTTF9yZWFkIG1heSByZXN1bHQgaW4gU1NMX0VSUk9SX1dBTlRfUkVBRCAoZXZlbiBpZgogICAgIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydCBpcyBibG9ja2luZykgaWYgYSBoYW5kc2hha2UgdG9vayBwbGFjZS4KICAgICAoVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzIG5lZWRlZCBieSBhcHBsaWNhdGlvbnMgc3VjaCBhcyBzX2NsaWVudAogICAgIGFuZCBzX3NlcnZlciB0aGF0IHVzZSBzZWxlY3QoKSB0byBkZXRlcm1pbmUgd2hlbiB0byB1c2UgU1NMX3JlYWQ7CiAgICAgYnV0IGZvciBhcHBsaWNhdGlvbnMgdGhhdCBrbm93IGluIGFkdmFuY2Ugd2hlbiB0byBleHBlY3QgZGF0YSwgaXQKICAgICBqdXN0IG1ha2VzIHRoaW5ncyBtb3JlIGNvbXBsaWNhdGVkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgUkFORF9lZ2RfYnl0ZXMoKSwgd2hpY2ggZ2l2ZXMgY29udHJvbCBvdmVyIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZAogICAgIGZyb20gRUdELgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYSBmZXcgbW9yZSBFQkNESUMgY29uZGl0aW9uYWxzIHRoYXQgbWFrZSBgcmVxJyBhbmQgYHg1MDknCiAgICAgd29yayBiZXR0ZXIgb24gc3VjaCBzeXN0ZW1zLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoUC5TaWVtZW5zLkRlPl0KCiAgKikgQWRkIHR3byBkZW1vIHByb2dyYW1zIGZvciBQS0NTMTJfcGFyc2UoKSBhbmQgUEtDUzEyX2NyZWF0ZSgpLgogICAgIFVwZGF0ZSBQS0NTMTJfcGFyc2UoKSBzbyBpdCBjb3BpZXMgdGhlIGZyaWVuZGx5TmFtZSBhbmQgdGhlCiAgICAga2V5aWQgdG8gdGhlIGNlcnRpZmljYXRlcyBhdXggaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYnVnIGluIFBLQ1M3X3ZlcmlmeSgpIHdoaWNoIGNhdXNlZCBhbiBpbmZpbml0ZSBsb29wCiAgICAgaWYgdGhlcmUgd2FzIG1vcmUgdGhhbiBvbmUgc2lnbmF0dXJlLgogICAgIFtTdmVuIFVzenBlbGthdCA8c3VAY2Vsb2NvbS5kZT5dCgogICopIE1ham9yIGNoYW5nZSBpbiB1dGlsL21rZGVmLnBsIHRvIGluY2x1ZGUgZXh0cmEgaW5mb3JtYXRpb24KICAgICBhYm91dCBlYWNoIHN5bWJvbCwgYXMgd2VsbCBhcyBwcmVzZW50aWcgdmFyaWFibGVzIGFzIHdlbGwKICAgICBhcyBmdW5jdGlvbnMuICBUaGlzIGNoYW5nZSBtZWFucyB0aGF0IHRoZXJlJ3MgbiBtb3JlIG5lZWQKICAgICB0byByZWJ1aWxkIHRoZSAubnVtIGZpbGVzIHdoZW4gc29tZSBhbGdvcml0aG1zIGFyZSBleGNsdWRlZC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBbGxvdyB0aGUgdmVyaWZ5IHRpbWUgdG8gYmUgc2V0IGJ5IGFuIGFwcGxpY2F0aW9uLAogICAgIHJhdGhlciB0aGFuIGFsd2F5cyB1c2luZyB0aGUgY3VycmVudCB0aW1lLgogICAgIFtTdGV2ZSBIZW5zb25dCiAgCiAgKikgUGhhc2UgMiB2ZXJpZnkgY29kZSByZW9yZ2FuaXNhdGlvbi4gVGhlIGNlcnRpZmljYXRlCiAgICAgdmVyaWZ5IGNvZGUgbm93IGxvb2tzIHVwIGFuIGlzc3VlciBjZXJ0aWZpY2F0ZSBieSBhCiAgICAgbnVtYmVyIG9mIGNyaXRlcmlhOiBzdWJqZWN0IG5hbWUsIGF1dGhvcml0eSBrZXkgaWQKICAgICBhbmQga2V5IHVzYWdlLiBJdCBhbHNvIHZlcmlmaWVzIHNlbGYgc2lnbmVkIGNlcnRpZmljYXRlcwogICAgIGJ5IHRoZSBzYW1lIGNyaXRlcmlhLiBUaGUgbWFpbiBjb21wYXJpc29uIGZ1bmN0aW9uIGlzCiAgICAgWDUwOV9jaGVja19pc3N1ZWQoKSB3aGljaCBwZXJmb3JtcyB0aGVzZSBjaGVja3MuCiAKICAgICBMb3Qgb2YgY2hhbmdlcyB3ZXJlIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBzdXBwb3J0IHRoaXMKICAgICB3aXRob3V0IGNvbXBsZXRlbHkgcmV3cml0aW5nIHRoZSBsb29rdXAgY29kZS4KIAogICAgIEF1dGhvcml0eSBhbmQgc3ViamVjdCBrZXkgaWRlbnRpZmllciBhcmUgbm93IGNhY2hlZC4KIAogICAgIFRoZSBMSEFTSCAnY2VydHMnIGlzIFg1MDlfU1RPUkUgaGFzIG5vdyBiZWVuIHJlcGxhY2VkCiAgICAgYnkgYSBTVEFDS19PRihYNTA5X09CSkVDVCkuIFRoaXMgaXMgbWFpbmx5IGJlY2F1c2UgYW4KICAgICBMSEFTSCBjYW4ndCBzdG9yZSBvciByZXRyaWV2ZSBtdWx0aXBsZSBvYmplY3RzIHdpdGgKICAgICB0aGUgc2FtZSBoYXNoIHZhbHVlLgoKICAgICBBcyBhIHJlc3VsdCB2YXJpb3VzIGZ1bmN0aW9ucyAod2hpY2ggd2VyZSBhbGwgaW50ZXJuYWwKICAgICB1c2Ugb25seSkgaGF2ZSBjaGFuZ2VkIHRvIGhhbmRsZSB0aGUgbmV3IFg1MDlfU1RPUkUKICAgICBzdHJ1Y3R1cmUuIFRoaXMgd2lsbCBicmVhayBhbnl0aGluZyB0aGF0IG1lc3NlZCByb3VuZAogICAgIHdpdGggWDUwOV9TVE9SRSBpbnRlcm5hbGx5LgogCiAgICAgVGhlIGZ1bmN0aW9ucyBYNTA5X1NUT1JFX2FkZF9jZXJ0KCkgbm93IGNoZWNrcyBmb3IgYW4KICAgICBleGFjdCBtYXRjaCwgcmF0aGVyIHRoYW4ganVzdCBzdWJqZWN0IG5hbWUuCiAKICAgICBUaGUgWDUwOV9TVE9SRSBBUEkgZG9lc24ndCBkaXJlY3RseSBzdXBwb3J0IHRoZSByZXRyaWV2YWwKICAgICBvZiBtdWx0aXBsZSBjZXJ0aWZpY2F0ZXMgbWF0Y2hpbmcgYSBnaXZlbiBjcml0ZXJpYSwgaG93ZXZlcgogICAgIHRoaXMgY2FuIGJlIHdvcmtlZCByb3VuZCBieSBwZXJmb3JtaW5nIGEgbG9va3VwIGZpcnN0CiAgICAgKHdoaWNoIHdpbGwgZmlsbCB0aGUgY2FjaGUgd2l0aCBjYW5kaWRhdGUgY2VydGlmaWNhdGVzKQogICAgIGFuZCB0aGVuIGV4YW1pbmluZyB0aGUgY2FjaGUgZm9yIG1hdGNoZXMuIFRoaXMgaXMgcHJvYmFibHkKICAgICB0aGUgYmVzdCB3ZSBjYW4gZG8gd2l0aG91dCB0aHJvd2luZyBvdXQgWDUwOV9MT09LVVAKICAgICBlbnRpcmVseSAobWF5YmUgbGF0ZXIuLi4pLgogCiAgICAgVGhlIFg1MDlfVkVSSUZZX0NUWCBzdHJ1Y3R1cmUgaGFzIGJlZW4gZW5oYW5jZWQgY29uc2lkZXJhYmx5LgogCiAgICAgQWxsIGNlcnRpZmljYXRlIGxvb2t1cCBvcGVyYXRpb25zIG5vdyBnbyB2aWEgYSBnZXRfaXNzdWVyKCkKICAgICBjYWxsYmFjay4gQWx0aG91Z2ggdGhpcyBjdXJyZW50bHkgdXNlcyBhbiBYNTA5X1NUT1JFIGl0CiAgICAgY2FuIGJlIHJlcGxhY2VkIGJ5IGN1c3RvbSBsb29rdXBzLiBUaGlzIGlzIGEgc2ltcGxlIHdheQogICAgIHRvIGJ5cGFzcyB0aGUgWDUwOV9TVE9SRSBoYWNrZXJ5IG5lY2Vzc2FyeSB0byBtYWtlIHRoaXMKICAgICB3b3JrIGFuZCBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2UgbW9yZSBlZmZpY2llbnQgdGVjaG5pcXVlcwogICAgIGluIGZ1dHVyZS4gQSB2ZXJ5IHNpbXBsZSB2ZXJzaW9uIHdoaWNoIHVzZXMgYSBzaW1wbGUKICAgICBTVEFDSyBmb3IgaXRzIHRydXN0ZWQgY2VydGlmaWNhdGUgc3RvcmUgaXMgYWxzbyBwcm92aWRlZAogICAgIHVzaW5nIFg1MDlfU1RPUkVfQ1RYX3RydXN0ZWRfc3RhY2soKS4KIAogICAgIFRoZSB2ZXJpZnlfY2IoKSBhbmQgdmVyaWZ5KCkgY2FsbGJhY2tzIG5vdyBoYXZlIGVxdWl2YWxlbnRzCiAgICAgaW4gdGhlIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZS4KIAogICAgIFg1MDlfU1RPUkVfQ1RYIGFsc28gaGFzIGEgJ2ZsYWdzJyBmaWVsZCB3aGljaCBjYW4gYmUgdXNlZAogICAgIHRvIGN1c3RvbWlzZSB0aGUgdmVyaWZ5IGJlaGF2aW91ci4KICAgICBbU3RldmUgSGVuc29uXQogCiAgKikgQWRkIG5ldyBQS0NTIzcgc2lnbmluZyBvcHRpb24gUEtDUzdfTk9TTUlNRUNBUCB3aGljaCAKICAgICBleGNsdWRlcyBTL01JTUUgY2FwYWJpbGl0aWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdoZW4gYSBjZXJ0aWZpY2F0ZSByZXF1ZXN0IGlzIHJlYWQgaW4ga2VlcCBhIGNvcHkgb2YgdGhlCiAgICAgb3JpZ2luYWwgZW5jb2Rpbmcgb2YgdGhlIHNpZ25lZCBkYXRhIGFuZCB1c2UgaXQgd2hlbiBvdXRwdXRpbmcKICAgICBhZ2Fpbi4gU2lnbmF0dXJlcyB0aGVuIHVzZSB0aGUgb3JpZ2luYWwgZW5jb2RpbmcgcmF0aGVyIHRoYW4KICAgICBhIGRlY29kZWQsIGVuY29kZWQgdmVyc2lvbiB3aGljaCBtYXkgY2F1c2UgcHJvYmxlbXMgaWYgdGhlCiAgICAgcmVxdWVzdCBpcyBpbXByb3Blcmx5IGVuY29kZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIGNvbnNpc3RlbmN5IHdpdGggb3RoZXIgQklPX3B1dHMgaW1wbGVtZW50YXRpb25zLCBjYWxsCiAgICAgYnVmZmVyX3dyaXRlKGIsIC4uLikgZGlyZWN0bHkgaW4gYnVmZmVyX3B1dHMgaW5zdGVhZCBvZiBjYWxsaW5nCiAgICAgQklPX3dyaXRlKGIsIC4uLikuCgogICAgIEluIEJJT19wdXRzLCBpbmNyZW1lbnQgYi0+bnVtX3dyaXRlIGFzIGluIEJJT193cml0ZS4KICAgICBbUGV0ZXIuU3lsdmVzdGVyQEVkZWxXZWIuZnJdCgogICopIEZpeCBCTl9tdWxfd29yZCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIHdvcmQgaXMgMC4gKFdlIGhhdmUgdG8gdXNlCiAgICAgQk5femVybywgd2UgbWF5IG5vdCByZXR1cm4gYSBCSUdOVU0gd2l0aCBhbiBhcnJheSBjb25zaXN0aW5nIG9mCiAgICAgd29yZHMgc2V0IHRvIHplcm8uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEF2b2lkIGNhbGxpbmcgYWJvcnQoKSBmcm9tIHdpdGhpbiB0aGUgbGlicmFyeSB3aGVuIHByb2JsZW1zIGFyZQogICAgIGRldGVjdGVkLCBleGNlcHQgaWYgcHJlcHJvY2Vzc29yIHN5bWJvbHMgaGF2ZSBiZWVuIGRlZmluZWQKICAgICAoc3VjaCBhcyBSRUZfQ0hFQ0ssIEJOX0RFQlVHIGV0Yy4pLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBvcGVuc3NsIGFwcGxpY2F0aW9uICdyc2F1dGwnLiBUaGlzIHV0aWxpdHkgY2FuIGJlCiAgICAgdXNlZCBmb3IgbG93IGxldmVsIFJTQSBvcGVyYXRpb25zLiBERVIgcHVibGljIGtleQogICAgIEJJTy9mcCByb3V0aW5lcyBhbHNvIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBDb25maWd1cmUgZW50cnkgYW5kIHBhdGNoZXMgZm9yIGNvbXBpbGluZyBvbiBRTlggNC4KICAgICBbQW5kcmVhcyBTY2huZWlkZXIgPGFuZHJlYXNAZHMzLmV0ZWNoLmZoLWhhbWJ1cmcuZGU+XQoKICAqKSBBIGRlbW8gc3RhdGUtbWFjaGluZSBpbXBsZW1lbnRhdGlvbiB3YXMgc3BvbnNvcmVkIGJ5CiAgICAgTnVyb24gKGh0dHA6Ly93d3cubnVyb24uY29tLykgYW5kIGlzIG5vdyBhdmFpbGFibGUgaW4KICAgICBkZW1vcy9zdGF0ZV9tYWNoaW5lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBOZXcgb3B0aW9ucyBhZGRlZCB0byB0aGUgJ2Rnc3QnIHV0aWxpdHkgZm9yIHNpZ25hdHVyZQogICAgIGdlbmVyYXRpb24gYW5kIHZlcmlmaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVbnJlY29nbml6ZWQgUEtDUyM3IGNvbnRlbnQgdHlwZXMgYXJlIG5vdyBoYW5kbGVkIHZpYSBhCiAgICAgY2F0Y2ggYWxsIEFTTjFfVFlQRSBzdHJ1Y3R1cmUuIFRoaXMgYWxsb3dzIHVuc3VwcG9ydGVkCiAgICAgdHlwZXMgdG8gYmUgc3RvcmVkIGFzIGEgImJsb2IiIGFuZCBhbiBhcHBsaWNhdGlvbiBjYW4KICAgICBlbmNvZGUgYW5kIGRlY29kZSBpdCBtYW51YWxseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdmFyaW91cyBzaWduZWQvdW5zaWduZWQgaXNzdWVzIHRvIG1ha2UgYV9zdHJleC5jCiAgICAgY29tcGlsZSB1bmRlciBWQysrLgogICAgIFtPc2NhciBKYWNvYnNzb24gPG9zY2FyLmphY29ic3NvbkBjZWxvY29tLmNvbT5dCgogICopIEFTTjEgZml4ZXMuIGkyZF9BU04xX09CSkVDVCB3YXMgbm90IHJldHVybmluZyB0aGUgY29ycmVjdAogICAgIGxlbmd0aCBpZiBwYXNzZWQgYSBidWZmZXIuIEFTTjFfSU5URUdFUl90b19CTiBmYWlsZWQKICAgICBpZiBwYXNzZWQgYSBOVUxMIEJOIGFuZCBpdHMgYXJndW1lbnQgd2FzIG5lZ2F0aXZlLgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IFN2ZW4gSGVpYmVyZyA8c3ZlbkB0YXJ0dS5jeWJlci5lZT5dCgogICopIE1vZGlmaWNhdGlvbiB0byBQS0NTIzcgZW5jb2Rpbmcgcm91dGluZXMgdG8gb3V0cHV0IGRlZmluaXRlCiAgICAgbGVuZ3RoIGVuY29kaW5nLiBTaW5jZSBjdXJyZW50bHkgdGhlIHdob2xlIHN0cnVjdHVyZXMgYXJlIGluCiAgICAgbWVtb3J5IHRoZXJlJ3Mgbm90IHJlYWwgcG9pbnQgaW4gdXNpbmcgaW5kZWZpbml0ZSBsZW5ndGggCiAgICAgY29uc3RydWN0ZWQgZW5jb2RpbmcuIEhvd2V2ZXIgaWYgT3BlblNTTCBpcyBjb21waWxlZCB3aXRoCiAgICAgdGhlIGZsYWcgUEtDUzdfSU5ERUZJTklURV9FTkNPRElORyB0aGUgb2xkIGZvcm0gaXMgdXNlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBCSU9fdnByaW50ZigpIGFuZCBCSU9fdnNucHJpbnRmKCkuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkZWQgbW9yZSBwcmVmaXhlcyB0byBwYXJzZSBmb3IgaW4gdGhlIHRoZSBzdHJpbmdzIHdyaXR0ZW4KICAgICB0aHJvdWdoIGEgbG9nZ2luZyBiaW8sIHRvIGNvdmVyIGFsbCB0aGUgbGV2ZWxzIHRoYXQgYXJlIGF2YWlsYWJsZQogICAgIHRocm91Z2ggc3lzbG9nLiAgVGhlIHByZWZpeGVzIGFyZSBub3c6CgoJUEFOSUMsIEVNRVJHLCBFTVIJPT4JTE9HX0VNRVJHCglBTEVSVCwgQUxSCQk9PglMT0dfQUxFUlQKCUNSSVQsIENSSQkJPT4JTE9HX0NSSVQKCUVSUk9SLCBFUlIJCT0+CUxPR19FUlIKCVdBUk5JTkcsIFdBUk4sIFdBUgk9PglMT0dfV0FSTklORwoJTk9USUNFLCBOT1RFLCBOT1QJPT4JTE9HX05PVElDRQoJSU5GTywgSU5GCQk9PglMT0dfSU5GTwoJREVCVUcsIERCRwkJPT4JTE9HX0RFQlVHCgogICAgIGFuZCBhcyBiZWZvcmUsIGlmIG5vbmUgb2YgdGhvc2UgcHJlZml4ZXMgYXJlIHByZXNlbnQgYXQgdGhlCiAgICAgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcsIExPR19FUlIgaXMgY2hvc2VuLgoKICAgICBPbiBXaW4zMiwgdGhlIExPR18qIGxldmVscyBhcmUgbWFwcGVkIGFjY29yZGluZyB0byB0aGlzOgoKCUxPR19FTUVSRywgTE9HX0FMRVJULCBMT0dfQ1JJVCwgTE9HX0VSUgk9PiBFVkVOVExPR19FUlJPUl9UWVBFCglMT0dfV0FSTklORwkJCQk9PiBFVkVOVExPR19XQVJOSU5HX1RZUEUKCUxPR19OT1RJQ0UsIExPR19JTkZPLCBMT0dfREVCVUcJCT0+IEVWRU5UTE9HX0lORk9STUFUSU9OX1RZUEUKCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTWFkZSBpdCBwb3NzaWJsZSB0byByZWNvbmZpZ3VyZSB3aXRoIGp1c3QgdGhlIGNvbmZpZ3VyYXRpb24KICAgICBhcmd1bWVudCAicmVjb25mIiBvciAicmVjb25maWd1cmUiLiAgVGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKICAgICBhcmUgc3RvcmVkIGluIE1ha2VmaWxlLnNzbCBpbiB0aGUgdmFyaWFibGUgQ09ORklHVVJFX0FSR1MsCiAgICAgYW5kIGFyZSByZXRyaWV2ZWQgZnJvbSB0aGVyZSB3aGVuIHJlY29uZmlndXJpbmcuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgTUQ0IGltcGxlbWVudGVkLgogICAgIFtBc3NhciBXZXN0ZXJsdW5kIDxhc3NhckBzaWNzLnNlPiwgUmljaGFyZCBMZXZpdHRlXQoKICAqKSBBZGQgdGhlIGFyZ3VtZW50cyAtQ0FmaWxlIGFuZCAtQ0FwYXRoIHRvIHRoZSBwa2NzMTIgdXRpbGl0eS4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSBUaGUgb2JqX2RhdC5wbCBzY3JpcHQgd2FzIG1lc3NpbmcgdXAgdGhlIHNvcnRpbmcgb2Ygb2JqZWN0CiAgICAgbmFtZXMuIFRoZSByZWFzb24gd2FzIHRoYXQgaXQgY29tcGFyZWQgdGhlIHF1b3RlZCB2ZXJzaW9uCiAgICAgb2Ygc3RyaW5ncyBhcyBhIHJlc3VsdCAiT0NTUCIgPiAiT0NTUCBTaWduaW5nIiBiZWNhdXNlCiAgICAgIiA+IFNQQUNFLiBDaGFuZ2VkIHNjcmlwdCB0byBzdG9yZSB1bnF1b3RlZCB2ZXJzaW9ucyBvZgogICAgIG5hbWVzIGFuZCBhZGQgcXVvdGVzIG9uIG91dHB1dC4gSXQgd2FzIGFsc28gb21pdHRpbmcgc29tZQogICAgIG5hbWVzIGZyb20gdGhlIGxvb2t1cCB0YWJsZSBpZiB0aGV5IHdlcmUgZ2l2ZW4gYSBkZWZhdWx0CiAgICAgdmFsdWUgKHRoYXQgaXMgaWYgU04gaXMgbWlzc2luZyBpdCBpcyBnaXZlbiB0aGUgc2FtZQogICAgIHZhbHVlIGFzIExOIGFuZCB2aWNlIHZlcnNhKSwgdGhlc2UgYXJlIG5vdyBhZGRlZCBvbiB0aGUKICAgICBncm91bmRzIHRoYXQgaWYgYW4gb2JqZWN0IGhhcyBhIG5hbWUgd2Ugc2hvdWxkIGJlIGFibGUgdG8KICAgICBsb29rIGl0IHVwLiBGaW5hbGx5IGFkZGVkIHdhcm5pbmcgb3V0cHV0IHdoZW4gZHVwbGljYXRlCiAgICAgc2hvcnQgb3IgbG9uZyBuYW1lcyBhcmUgZm91bmQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlcyBuZWVkZWQgZm9yIFRhbmRlbSBOU0suCiAgICAgW1Njb3R0IFVyb2ZmIDxzY290dEB4eXByby5jb20+XQoKICAqKSBGaXggU1NMIDIuMCByb2xsYmFjayBjaGVja2luZzogRHVlIHRvIGFuIG9mZi1ieS1vbmUgZXJyb3IgaW4KICAgICBSU0FfcGFkZGluZ19jaGVja19TU0x2MjMoKSwgc3BlY2lhbCBwYWRkaW5nIHdhcyBuZXZlciBkZXRlY3RlZAogICAgIGFuZCB0aHVzIHRoZSBTU0wgMy4wL1RMUyAxLjAgY291bnRlcm1lYXN1cmUgYWdhaW5zdCBwcm90b2NvbAogICAgIHZlcnNpb24gcm9sbGJhY2sgYXR0YWNrcyB3YXMgbm90IGVmZmVjdGl2ZS4KCiAgICAgSW4gczIzX2NsbnQuYywgZG9uJ3QgdXNlIHNwZWNpYWwgcm9sbGJhY2stYXR0YWNrIGRldGVjdGlvbiBwYWRkaW5nCiAgICAgKFJTQV9TU0xWMjNfUEFERElORykgaWYgU1NMIDIuMCBpcyB0aGUgb25seSBwcm90b2NvbCBlbmFibGVkIGluIHRoZQogICAgIGNsaWVudDsgc2ltaWxhcmx5LCBpbiBzMjNfc3J2ci5jLCBkb24ndCBkbyB0aGUgcm9sbGJhY2sgY2hlY2sgaWYKICAgICBTU0wgMi4wIGlzIHRoZSBvbmx5IHByb3RvY29sIGVuYWJsZWQgaW4gdGhlIHNlcnZlci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNYWtlIGl0IHBvc3NpYmxlIHRvIGdldCBoZXhkdW1wcyBvZiB1bnByaW50YWJsZSBkYXRhIHdpdGggJ29wZW5zc2wKICAgICBhc24xcGFyc2UnLiAgQnkgaW1wbGljYXRpb24sIHRoZSBmdW5jdGlvbnMgQVNOMV9wYXJzZV9kdW1wKCkgYW5kCiAgICAgQklPX2R1bXBfaW5kZW50KCkgYXJlIGFkZGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbnMgQVNOMV9TVFJJTkdfcHJpbnRfZXgoKSBhbmQgWDUwOV9OQU1FX3ByaW50X2V4KCkKICAgICB0aGVzZSBwcmludCBvdXQgc3RyaW5ncyBhbmQgbmFtZSBzdHJ1Y3R1cmVzIGJhc2VkIG9uIHZhcmlvdXMKICAgICBmbGFncyBpbmNsdWRpbmcgUkZDMjI1MyBzdXBwb3J0IGFuZCBwcm9wZXIgaGFuZGxpbmcgb2YKICAgICBtdWx0aWJ5dGUgY2hhcmFjdGVycy4gQWRkZWQgb3B0aW9ucyB0byB0aGUgJ3g1MDknIHV0aWxpdHkgCiAgICAgdG8gYWxsb3cgdGhlIHZhcmlvdXMgZmxhZ3MgdG8gYmUgc2V0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFZhcmlvdXMgZml4ZXMgdG8gdXNlIEFTTjFfVElNRSBpbnN0ZWFkIG9mIEFTTjFfVVRDVElNRS4KICAgICBBbHNvIGNoYW5nZSB0aGUgZnVuY3Rpb25zIFg1MDlfY21wX2N1cnJlbnRfdGltZSgpIGFuZAogICAgIFg1MDlfZ210aW1lX2FkaigpIHdvcmsgd2l0aCBhbiBBU04xX1RJTUUgc3RydWN0dXJlLAogICAgIHRoaXMgd2lsbCBlbmFibGUgY2VydGlmaWNhdGVzIHVzaW5nIEdlbmVyYWxpemVkVGltZSBpbiB2YWxpZGl0eQogICAgIGRhdGVzIHRvIGJlIGNoZWNrZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgTkVHX1BVQktFWV9CVUcgY29kZSAod2hpY2ggdG9sZXJhdGVzIGludmFsaWQKICAgICBuZWdhdGl2ZSBwdWJsaWMga2V5IGVuY29kaW5ncykgb24gYnkgZGVmYXVsdCwKICAgICBOT19ORUdfUFVCS0VZX0JVRyBjYW4gYmUgc2V0IHRvIGRpc2FibGUgaXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIGMyaV9BU04xX09CSkVDVCgpIHdoaWNoIGFjdHMgb24gQVNOMV9PQkpFQ1QKICAgICBjb250ZW50IG9jdGV0cy4gQW4gaTJjX0FTTjFfT0JKRUNUIGlzIHVubmVjZXNzYXJ5IGJlY2F1c2UKICAgICB0aGUgZW5jb2RpbmcgY2FuIGJlIHRyaXZpYWxseSBvYnRhaW5lZCBmcm9tIHRoZSBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgY3J5cHRvL2Vyci5jIGxvY2tpbmcgYnVnZml4OiBVc2Ugd3JpdGUgbG9ja3MgKENSWVBUT193X1t1bl1sb2NrKSwKICAgICBub3QgcmVhZCBsb2NrcyAoQ1JZUFRPX3JfW3VuXWxvY2spLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEEgZmlyc3QgYXR0ZW1wdCBhdCBjcmVhdGluZyBvZmZpY2lhbCBzdXBwb3J0IGZvciBzaGFyZWQKICAgICBsaWJyYXJpZXMgdGhyb3VnaCBjb25maWd1cmF0aW9uLiAgSSd2ZSBrZXB0IGl0IHNvIHRoZQogICAgIGRlZmF1bHQgaXMgc3RhdGljIGxpYnJhcmllcyBvbmx5LCBhbmQgdGhlIE9wZW5TU0wgcHJvZ3JhbXMKICAgICBhcmUgYWx3YXlzIHN0YXRpY2FsbHkgbGlua2VkIGZvciBub3csIGJ1dCB0aGVyZSBhcmUKICAgICBwcmVwYXJhdGlvbnMgZm9yIGR5bmFtaWMgbGlua2luZyBpbiBwbGFjZS4KICAgICBUaGlzIGhhcyBiZWVuIHRlc3RlZCBvbiBMaW51eCBhbmQgVHJ1NjQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgUmFuZG9tbmVzcyBwb2xsaW5nIGZ1bmN0aW9uIGZvciBXaW45eCwgYXMgZGVzY3JpYmVkIGluOgogICAgIFBldGVyIEd1dG1hbm4sIFNvZnR3YXJlIEdlbmVyYXRpb24gb2YgUHJhY3RpY2FsbHkgU3Ryb25nCiAgICAgUmFuZG9tIE51bWJlcnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBzbyBQUk5HIGlzIHNlZWRlZCBpbiByZXEgaWYgdXNpbmcgYW4gYWxyZWFkeSBleGlzdGluZwogICAgIERTQSBrZXkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IG9wdGlvbnMgdG8gc21pbWUgYXBwbGljYXRpb24uIC1pbmZvcm0gYW5kIC1vdXRmb3JtCiAgICAgYWxsb3cgYWx0ZXJuYXRpdmUgZm9ybWF0cyBmb3IgdGhlIFMvTUlNRSBtZXNzYWdlIGluY2x1ZGluZwogICAgIFBFTSBhbmQgREVSLiBUaGUgLWNvbnRlbnQgb3B0aW9uIGFsbG93cyB0aGUgY29udGVudCB0byBiZQogICAgIHNwZWNpZmllZCBzZXBhcmF0ZWx5LiBUaGlzIHNob3VsZCBhbGxvdyB0aGluZ3MgbGlrZSBOZXRzY2FwZQogICAgIGZvcm0gc2lnbmluZyBvdXRwdXQgZWFzaWVyIHRvIHZlcmlmeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdGhlIEFTTjEgZW5jb2Rpbmcgb2YgdGFncyB1c2luZyB0aGUgJ2xvbmcgZm9ybScuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IEFTTjEgZnVuY3Rpb25zLCBpMmNfKiBhbmQgYzJpXyogZm9yIElOVEVHRVIgYW5kIEJJVAogICAgIFNUUklORyB0eXBlcy4gVGhlc2UgY29udmVydCBjb250ZW50IG9jdGV0cyB0byBhbmQgZnJvbSB0aGUKICAgICB1bmRlcmx5aW5nIHR5cGUuIFRoZSBhY3R1YWwgdGFnIGFuZCBsZW5ndGggb2N0ZXRzIGFyZQogICAgIGFscmVhZHkgYXNzdW1lZCB0byBoYXZlIGJlZW4gcmVhZCBpbiBhbmQgY2hlY2tlZC4gVGhlc2UKICAgICBhcmUgbmVlZGVkIGJlY2F1c2UgYWxsIG90aGVyIHN0cmluZyB0eXBlcyBoYXZlIHZpcnR1YWxseQogICAgIGlkZW50aWNhbCBoYW5kbGluZyBhcGFydCBmcm9tIHRoZSB0YWcuIEJ5IGhhdmluZyB2ZXJzaW9ucwogICAgIG9mIHRoZSBBU04xIGZ1bmN0aW9ucyB0aGF0IGp1c3Qgb3BlcmF0ZSBvbiBjb250ZW50IG9jdGV0cwogICAgIElNUExJQ0lUIHRhZ2dpbmcgY2FuIGJlIGhhbmRsZWQgcHJvcGVybHkuIEl0IGFsc28gYWxsb3dzCiAgICAgdGhlIEFTTjFfRU5VTUVSQVRFRCBjb2RlIHRvIGJlIGN1dCBkb3duIGJlY2F1c2UgQVNOMV9FTlVNRVJBVEVECiAgICAgYW5kIEFTTjFfSU5URUdFUiBhcmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHRhZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIGhhbmRsaW5nIG9mIE9JRCBvYmplY3RzIGFzIGZvbGxvd3M6CgogICAgIC0gTmV3IG9iamVjdCBpZGVudGlmaWVycyBhcmUgaW5zZXJ0ZWQgaW4gb2JqZWN0cy50eHQsIGZvbGxvd2luZwogICAgICAgdGhlIHN5bnRheCBnaXZlbiBpbiBvYmplY3RzLlJFQURNRS4KICAgICAtIG9iamVjdHMucGwgaXMgdXNlZCB0byBwcm9jZXNzIG9ial9tYWMubnVtIGFuZCBjcmVhdGUgYSBuZXcKICAgICAgIG9ial9tYWMuaC4KICAgICAtIG9ial9kYXQucGwgaXMgdXNlZCB0byBjcmVhdGUgYSBuZXcgb2JqX2RhdC5oLCB1c2luZyB0aGUgZGF0YSBpbgogICAgICAgb2JqX21hYy5oLgoKICAgICBUaGlzIGlzIGN1cnJlbnRseSBraW5kIG9mIGEgaGFjaywgYW5kIHRoZSBwZXJsIGNvZGUgaW4gb2JqZWN0cy5wbAogICAgIGlzbid0IHZlcnkgZWxlZ2FudCwgYnV0IGl0IHdvcmtzIGFzIEkgaW50ZW5kZWQuICBUaGUgc2ltcGxlc3Qgd2F5CiAgICAgdG8gY2hlY2sgdGhhdCBpdCB3b3JrZWQgY29ycmVjdGx5IGlzIHRvIGxvb2sgaW4gb2JqX2RhdC5oIGFuZAogICAgIGNoZWNrIHRoZSBhcnJheSBuaWRfb2JqcyBhbmQgbWFrZSBzdXJlIHRoZSBvYmplY3RzIGhhdmVuJ3QgbW92ZWQKICAgICBhcm91bmQgKHRoaXMgaXMgaW1wb3J0YW50ISkuICBBZGRpdGlvbnMgYXJlIE9LLCBhcyB3ZWxsIGFzCiAgICAgY29uc2lzdGVudCBuYW1lIGNoYW5nZXMuIAogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBCU0Qtc3R5bGUgTUQ1LWJhc2VkIHBhc3N3b3JkcyB0byAnb3BlbnNzbCBwYXNzd2QnIChvcHRpb24gJy0xJykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkaXRpb24gb2YgdGhlIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIgJy1yYW5kIGZpbGUnIHRvICdvcGVuc3NsIHJlcScuCiAgICAgVGhlIGdpdmVuIGZpbGUgYWRkcyB0byB3aGF0ZXZlciBoYXMgYWxyZWFkeSBiZWVuIHNlZWRlZCBpbnRvIHRoZQogICAgIHJhbmRvbSBwb29sIHRocm91Z2ggdGhlIFJBTkRGSUxFIGNvbmZpZ3VyYXRpb24gZmlsZSBvcHRpb24gb3IKICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZSwgb3IgdGhlIGRlZmF1bHQgcmFuZG9tIHN0YXRlIGZpbGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgbWtzdGFjay5wbCBub3cgc29ydHMgZWFjaCBtYWNybyBncm91cCBpbnRvIGxleGljYWwgb3JkZXIuCiAgICAgUHJldmlvdXNseSB0aGUgb3V0cHV0IG9yZGVyIGRlcGVuZGVkIG9uIHRoZSBvcmRlciB0aGUgZmlsZXMKICAgICBhcHBlYXJlZCBpbiB0aGUgZGlyZWN0b3J5LCByZXN1bHRpbmcgaW4gbmVlZGxlc3MgcmV3cml0aW5nCiAgICAgb2Ygc2FmZXN0YWNrLmggLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBhdGNoZXMgdG8gbWFrZSBPcGVuU1NMIGNvbXBpbGUgdW5kZXIgV2luMzIgYWdhaW4uIE1vc3RseQogICAgIHdvcmsgYXJvdW5kcyBmb3IgdGhlIFZDKysgcHJvYmxlbSB0aGF0IGl0IHRyZWF0cyBmdW5jKCkgYXMKICAgICBmdW5jKHZvaWQpLiBBbHNvIHN0cmlwcGVkIG91dCB0aGUgcGFydHMgb2YgbWtkZWYucGwgdGhhdAogICAgIGFkZGVkIGV4dHJhIHR5cGVzYWZlIGZ1bmN0aW9uczogdGhlc2Ugbm8gbG9uZ2VyIGV4aXN0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pc2F0aW9uIG9mIHRoZSBzdGFjayBjb2RlLiBUaGUgbWFjcm9zIGFyZSBub3cgYWxsIAogICAgIGNvbGxlY3RlZCBpbiBzYWZlc3RhY2suaCAuIEVhY2ggbWFjcm8gaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZgogICAgIGEgInN0YWNrIG1hY3JvIiBvZiB0aGUgZm9ybSBTS01fPG5hbWU+KHR5cGUsIGEsIGIpLiBUaGUgCiAgICAgREVCVUdfU0FGRVNUQUNLIGlzIG5vdyBoYW5kbGVkIGluIHRlcm1zIG9mIGZ1bmN0aW9uIGNhc3RzLAogICAgIHRoaXMgaGFzIHRoZSBhZHZhbnRhZ2Ugb2YgcmV0YWluaW5nIHR5cGUgc2FmZXR5IHdpdGhvdXQgdGhlCiAgICAgdXNlIG9mIGFkZGl0aW9uYWwgZnVuY3Rpb25zLiBJZiBERUJVR19TQUZFU1RBQ0sgaXMgbm90IGRlZmluZWQKICAgICB0aGVuIHRoZSBub24gdHlwZXNhZmUgbWFjcm9zIGFyZSB1c2VkIGluc3RlYWQuIEFsc28gbW9kaWZpZWQgdGhlCiAgICAgbWtzdGFjay5wbCBzY3JpcHQgdG8gaGFuZGxlIHRoZSBuZXcgZm9ybS4gTmVlZHMgdGVzdGluZyB0byBzZWUKICAgICBpZiB3aGljaCAoaWYgYW55KSBjb21waWxlcnMgaXQgY2hva2VzIGFuZCBtYXliZSBtYWtlIERFQlVHX1NBRkVTVEFDSwogICAgIHRoZSBkZWZhdWx0IGlmIG5vIG1ham9yIHByb2JsZW1zLiBTaW1pbGFyIGJlaGF2aW91ciBmb3IgQVNOMV9TRVRfT0YKICAgICBhbmQgUEtDUzEyX1NUQUNLX09GLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFdoZW4gc29tZSB2ZXJzaW9ucyBvZiBJSVMgdXNlIHRoZSAnTkVUJyBmb3JtIG9mIHByaXZhdGUga2V5IHRoZQogICAgIGtleSBkZXJpdmF0aW9uIGFsZ29yaXRobSBpcyBkaWZmZXJlbnQuIE5vcm1hbGx5IE1ENShwYXNzd29yZCkgaXMKICAgICB1c2VkIGFzIGEgMTI4IGJpdCBSQzQga2V5LiBJbiB0aGUgbW9kaWZpZWQgY2FzZQogICAgIE1ENShNRDUocGFzc3dvcmQpICsgIlNHQ0tFWVNBTFQiKSAgaXMgdXNlZCBpbnN0ZWQuIEFkZGVkIHNvbWUKICAgICBuZXcgZnVuY3Rpb25zIGkyZF9SU0FfTkVUKCksIGQyaV9SU0FfTkVUKCkgZXRjIHdoaWNoIGFyZSB0aGUgc2FtZQogICAgIGFzIHRoZSBvbGQgTmV0c2NhcGVfUlNBIGZ1bmN0aW9ucyBleGNlcHQgdGhleSBoYXZlIGFuIGFkZGl0aW9uYWwKICAgICAnc2dja2V5JyBwYXJhbWV0ZXIgd2hpY2ggdXNlcyB0aGUgbW9kaWZpZWQgYWxnb3JpdGhtLiBBbHNvIGFkZGVkCiAgICAgYW4gLXNnY2tleSBjb21tYW5kIGxpbmUgb3B0aW9uIHRvIHRoZSByc2EgdXRpbGl0eS4gVGhhbmtzIHRvIAogICAgIEFkcmlhbiBQZWNrIDxiZXJ0aWVAbmNpcGhlci5jb20+IGZvciBwb3N0aW5nIGRldGFpbHMgb2YgdGhlIG1vZGlmaWVkCiAgICAgYWxnb3JpdGhtIHRvIG9wZW5zc2wtZGV2LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFRoZSBldnBfbG9jYWwuaCBtYWNyb3Mgd2VyZSB1c2luZyAnYy4jI2tuYW1lJyB3aGljaCByZXN1bHRlZCBpbgogICAgIGludmFsaWQgZXhwYW5zaW9uIG9uIHNvbWUgc3lzdGVtcyAoU0NPIDUuMC41IGZvciBleGFtcGxlKS4KICAgICBDb3JyZWN0ZWQgdG8gJ2Mua25hbWUnLgogICAgIFtQaGlsbGlwIFBvcmNoIDxyb290QHRoZXBvcmNoLmNvbT5dCgogICopIE5ldyBYNTA5X2dldDFfZW1haWwoKSBhbmQgWDUwOV9SRVFfZ2V0MV9lbWFpbCgpIGZ1bmN0aW9ucyB0aGF0IHJldHVybgogICAgIGEgU1RBQ0sgb2YgZW1haWwgYWRkcmVzc2VzIGZyb20gYSBjZXJ0aWZpY2F0ZSBvciByZXF1ZXN0LCB0aGVzZSBsb29rCiAgICAgaW4gdGhlIHN1YmplY3QgbmFtZSBhbmQgdGhlIHN1YmplY3QgYWx0ZXJuYXRpdmUgbmFtZSBleHRlbnNpb25zIGFuZCAKICAgICBvbWl0IGFueSBkdXBsaWNhdGUgYWRkcmVzc2VzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlLWltcGxlbWVudCBCTl9tb2RfZXhwMl9tb250IHVzaW5nIGluZGVwZW5kZW50IChhbmQgbGFyZ2VyKSB3aW5kb3dzLgogICAgIFRoaXMgbWFrZXMgRFNBIHZlcmlmaWNhdGlvbiBhYm91dCAyICUgZmFzdGVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluY3JlYXNlIG1heGltdW0gd2luZG93IHNpemUgaW4gQk5fbW9kX2V4cF8uLi4gdG8gNiBiaXRzIGluc3RlYWQgb2YgNQogICAgIChtZWFuaW5nIHRoYXQgbm93IDJeNSB2YWx1ZXMgd2lsbCBiZSBwcmVjb21wdXRlZCwgd2hpY2ggaXMgb25seSA0IEtCCiAgICAgcGx1cyBvdmVyaGVhZCBmb3IgMTAyNCBiaXQgbW9kdWxpKS4KICAgICBUaGlzIG1ha2VzIGV4cG9uZW50aWF0aW9ucyBhYm91dCAwLjUgJSBmYXN0ZXIgZm9yIDEwMjQgYml0CiAgICAgZXhwb25lbnRzIChhcyBtZWFzdXJlZCBieSAib3BlbnNzbCBzcGVlZCByc2EyMDQ4IikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVuYW1lIG1lbW9yeSBoYW5kbGluZyBtYWNyb3MgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggb3RoZXIKICAgICBzb2Z0d2FyZToKICAgICAgICAgIE1hbGxvYyAgICAgICAgID0+ICBPUEVOU1NMX21hbGxvYwogICAgICAgICAgTWFsbG9jX2xvY2tlZCAgPT4gIE9QRU5TU0xfbWFsbG9jX2xvY2tlZAogICAgICAgICAgUmVhbGxvYyAgICAgICAgPT4gIE9QRU5TU0xfcmVhbGxvYwogICAgICAgICAgRnJlZSAgICAgICAgICAgPT4gIE9QRU5TU0xfZnJlZQogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIE5ldyBmdW5jdGlvbiBCTl9tb2RfZXhwX21vbnRfd29yZCBmb3Igc21hbGwgYmFzZXMgKHJvdWdobHkgMTUlCiAgICAgZmFzdGVyIHRoYW4gQk5fbW9kX2V4cF9tb250LCBpLmUuIDclIGZvciBhIGZ1bGwgREggZXhjaGFuZ2UpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEN5Z1dpbjMyIHN1cHBvcnQuCiAgICAgW0pvaG4gSmFydmllIDxqamFydmllQG5ld3NndXkuY29tPl0KCiAgKikgVGhlIHR5cGUtc2FmZSBzdGFjayBjb2RlIGhhcyBiZWVuIHJlamlnZ2VkLiBJdCBpcyBub3cgb25seSBjb21waWxlZAogICAgIGluIHdoZW4gT3BlblNTTCBpcyBjb25maWd1cmVkIHdpdGggdGhlIERFQlVHX1NBRkVTVEFDSyBvcHRpb24gYW5kCiAgICAgYnkgZGVmYXVsdCBhbGwgdHlwZS1zcGVjaWZpYyBzdGFjayBmdW5jdGlvbnMgYXJlICIjZGVmaW5lImQgYmFjayB0bwogICAgIHN0YW5kYXJkIHN0YWNrIGZ1bmN0aW9ucy4gVGhpcyByZXN1bHRzIGluIG1vcmUgc3RyZWFtbGluZWQgb3V0cHV0CiAgICAgYnV0IHJldGFpbnMgdGhlIHR5cGUtc2FmZXR5IGNoZWNraW5nIHBvc3NpYmlsaXRpZXMgb2YgdGhlIG9yaWdpbmFsCiAgICAgYXBwcm9hY2guCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgVGhlIFNUQUNLIGNvZGUgaGFzIGJlZW4gY2xlYW5lZCB1cCwgYW5kIGNlcnRhaW4gdHlwZSBkZWNsYXJhdGlvbnMKICAgICB0aGF0IGRpZG4ndCBtYWtlIGEgbG90IG9mIHNlbnNlIGhhdmUgYmVlbiBicm91Z2h0IGluIGxpbmUuIFRoaXMgaGFzCiAgICAgYWxzbyBpbnZvbHZlZCBhIGNsZWFudXAgb2Ygc29ydHMgaW4gc2FmZXN0YWNrLmggdG8gbW9yZSBjb3JyZWN0bHkKICAgICBtYXAgdHlwZS1zYWZlIHN0YWNrIGZ1bmN0aW9ucyBvbnRvIHRoZWlyIHBsYWluIHN0YWNrIGNvdW50ZXJwYXJ0cy4KICAgICBUaGlzIHdvcmsgaGFzIGFsc28gcmVzdWx0ZWQgaW4gYSB2YXJpZXR5IG9mICJjb25zdCJpZmljYXRpb25zIG9mCiAgICAgbG90cyBvZiB0aGUgY29kZSwgZXNwZWNpYWxseSAiX2NtcCIgb3BlcmF0aW9ucyB3aGljaCBzaG91bGQgbm9ybWFsbHkKICAgICBiZSBwcm90b3R5cGVkIHdpdGggImNvbnN0IiBwYXJhbWV0ZXJzIGFueXdheS4KICAgICBbR2VvZmYgVGhvcnBlXQoKICAqKSBXaGVuIGdlbmVyYXRpbmcgYnl0ZXMgZm9yIHRoZSBmaXJzdCB0aW1lIGluIG1kX3JhbmQuYywgJ3N0aXIgdGhlIHBvb2wnCiAgICAgYnkgc2VlZGluZyB3aXRoIFNUQVRFX1NJWkUgZHVtbXkgYnl0ZXMgKHdpdGggemVybyBlbnRyb3B5IGNvdW50KS4KICAgICAoVGhlIFBSTkcgc3RhdGUgY29uc2lzdHMgb2YgdHdvIHBhcnRzLCB0aGUgbGFyZ2UgcG9vbCAnc3RhdGUnIGFuZCAnbWQnLAogICAgIHdoZXJlIGFsbCBvZiAnbWQnIGlzIHVzZWQgZWFjaCB0aW1lIHRoZSBQUk5HIGlzIHVzZWQsIGJ1dCAnc3RhdGUnCiAgICAgaXMgdXNlZCBvbmx5IGluZGV4ZWQgYnkgYSBjeWNsaWMgY291bnRlci4gQXMgZW50cm9weSBtYXkgbm90IGJlCiAgICAgd2VsbCBkaXN0cmlidXRlZCBmcm9tIHRoZSBiZWdpbm5pbmcsICdtZCcgaXMgaW1wb3J0YW50IGFzIGEKICAgICBjaGFpbmluZyB2YXJpYWJsZS4gSG93ZXZlciwgdGhlIG91dHB1dCBmdW5jdGlvbiBjaGFpbnMgb25seSBoYWxmCiAgICAgb2YgJ21kJywgaS5lLiA4MCBiaXRzLiAgc3NsZWF5X3JhbmRfYWRkLCBvbiB0aGUgb3RoZXIgaGFuZCwgY2hhaW5zCiAgICAgYWxsIG9mICdtZCcsIGFuZCBzZWVkaW5nIHdpdGggU1RBVEVfU0laRSBkdW1teSBieXRlcyB3aWxsIHJlc3VsdAogICAgIGluIGFsbCBvZiAnc3RhdGUnIGJlaW5nIHJld3JpdHRlbiwgd2l0aCB0aGUgbmV3IHZhbHVlcyBkZXBlbmRpbmcKICAgICBvbiB2aXJ0dWFsbHkgYWxsIG9mICdtZCcuICBUaGlzIG92ZXJjb21lcyB0aGUgODAgYml0IGxpbWl0YXRpb24uKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIHNzbC9zMl9jbG50LmMgYW5kIHNzbC9zM19jbG50LmMsIGNhbGwgRVJSX2NsZWFyX2Vycm9yKCkgd2hlbgogICAgIHRoZSBoYW5kc2hha2UgaXMgY29udGludWVkIGFmdGVyIHNzbF92ZXJpZnlfY2VydF9jaGFpbigpOwogICAgIG90aGVyd2lzZSwgaWYgU1NMX1ZFUklGWV9OT05FIGlzIHNldCwgcmVtYWluaW5nIGVycm9yIGNvZGVzCiAgICAgY2FuIGxlYWQgdG8gJ3VuZXhwbGFpbmFibGUnIGNvbm5lY3Rpb24gYWJvcnRzIGxhdGVyLgogICAgIFtCb2RvIE1vZWxsZXI7IHByb2JsZW0gdHJhY2tlZCBkb3duIGJ5IEx1dHogSmFlbmlja2VdCgogICopIE1ham9yIEVWUCBBUEkgY2lwaGVyIHJldmlzaW9uLgogICAgIEFkZCBob29rcyBmb3IgZXh0cmEgRVZQIGZlYXR1cmVzLiBUaGlzIGFsbG93cyB2YXJpb3VzIGNpcGhlcgogICAgIHBhcmFtZXRlcnMgdG8gYmUgc2V0IGluIHRoZSBFVlAgaW50ZXJmYWNlLiBTdXBwb3J0IGFkZGVkIGZvciB2YXJpYWJsZQogICAgIGtleSBsZW5ndGggY2lwaGVycyB2aWEgdGhlIEVWUF9DSVBIRVJfQ1RYX3NldF9rZXlfbGVuZ3RoKCkgZnVuY3Rpb24gYW5kCiAgICAgc2V0dGluZyBvZiBSQzIgYW5kIFJDNSBwYXJhbWV0ZXJzLgoKICAgICBNb2RpZnkgRVZQX09wZW5Jbml0KCkgYW5kIEVWUF9TZWFsSW5pdCgpIHRvIGNvcGUgd2l0aCB2YXJpYWJsZSBrZXkgbGVuZ3RoCiAgICAgY2lwaGVycy4KCiAgICAgUmVtb3ZlIGxvdHMgb2YgZHVwbGljYXRlZCBjb2RlIGZyb20gdGhlIEVWUCBsaWJyYXJ5LiBGb3IgZXhhbXBsZSAqZXZlcnkqCiAgICAgY2lwaGVyIGluaXQoKSBmdW5jdGlvbiBoYW5kbGVzIHRoZSAnaXYnIGluIHRoZSBzYW1lIHdheSBhY2NvcmRpbmcgdG8gdGhlCiAgICAgY2lwaGVyIG1vZGUuIFRoZXkgYWxzbyBhbGwgZG8gbm90aGluZyBpZiB0aGUgJ2tleScgcGFyYW1ldGVyIGlzIE5VTEwgYW5kCiAgICAgZm9yIENGQiBhbmQgT0ZCIG1vZGVzIHRoZXkgemVybyBjdHgtPm51bS4KCiAgICAgTmV3IGZ1bmN0aW9uYWxpdHkgYWxsb3dzIHJlbW92YWwgb2YgUy9NSU1FIGNvZGUgUkMyIGhhY2suCgogICAgIE1vc3Qgb2YgdGhlIHJvdXRpbmVzIGhhdmUgdGhlIHNhbWUgZm9ybSBhbmQgc28gY2FuIGJlIGRlY2xhcmVkIGluIHRlcm1zCiAgICAgb2YgbWFjcm9zLgoKICAgICBCeSBzaGlmdGluZyB0aGlzIHRvIHRoZSB0b3AgbGV2ZWwgRVZQX0NpcGhlckluaXQoKSBpdCBjYW4gYmUgcmVtb3ZlZCBmcm9tCiAgICAgYWxsIGluZGl2aWR1YWwgY2lwaGVycy4gSWYgdGhlIGNpcGhlciB3YW50cyB0byBoYW5kbGUgSVZzIG9yIGtleXMKICAgICBkaWZmZXJlbnRseSBpdCBjYW4gc2V0IHRoZSBFVlBfQ0lQSF9DVVNUT01fSVYgb3IgRVZQX0NJUEhfQUxXQVlTX0NBTExfSU5JVAogICAgIGZsYWdzLgoKICAgICBDaGFuZ2UgbG90cyBvZiBmdW5jdGlvbnMgbGlrZSBFVlBfRW5jcnlwdFVwZGF0ZSgpIHRvIG5vdyByZXR1cm4gYQogICAgIHZhbHVlOiBhbHRob3VnaCBzb2Z0d2FyZSB2ZXJzaW9ucyBvZiB0aGUgYWxnb3JpdGhtcyBjYW5ub3QgZmFpbAogICAgIGFueSBpbnN0YWxsZWQgaGFyZHdhcmUgdmVyc2lvbnMgY2FuLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCBTU0xfT1BfVExTX1JPTExCQUNLX0JVRzogSW4gc3NsM19nZXRfY2xpZW50X2tleV9leGNoYW5nZSwgaWYKICAgICB0aGlzIG9wdGlvbiBpcyBzZXQsIHRvbGVyYXRlIGJyb2tlbiBjbGllbnRzIHRoYXQgc2VuZCB0aGUgbmVnb3RpYXRlZAogICAgIHByb3RvY29sIHZlcnNpb24gbnVtYmVyIGluc3RlYWQgb2YgdGhlIHJlcXVlc3RlZCBwcm90b2NvbCB2ZXJzaW9uCiAgICAgbnVtYmVyLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIENhbGwgZGhfdG1wX2NiIChzZXQgYnkgLi4uX1RNUF9ESF9DQikgd2l0aCBjb3JyZWN0ICdpc19leHBvcnQnIGZsYWc7CiAgICAgaS5lLiBub24temVybyBmb3IgZXhwb3J0IGNpcGhlcnN1aXRlcywgemVybyBvdGhlcndpc2UuCiAgICAgUHJldmlvdXMgdmVyc2lvbnMgaGFkIHRoaXMgZmxhZyBpbnZlcnRlZCwgaW5jb25zaXN0ZW50IHdpdGgKICAgICByc2FfdG1wX2NiICguLi5fVE1QX1JTQV9DQikuCiAgICAgW0JvZG8gTW9lbGxlcjsgcHJvYmxlbSByZXBvcnRlZCBieSBBbWl0IENob3ByYV0KCiAgKikgQWRkIG1pc3NpbmcgRFNBIGxpYnJhcnkgdGV4dCBzdHJpbmcuIFdvcmsgYXJvdW5kIGZvciBzb21lIElJUwogICAgIGtleSBmaWxlcyB3aXRoIGludmFsaWQgU0VRVUVOQ0UgZW5jb2RpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgZG9jdW1lbnQgKGRvYy9zdGFuZGFyZHMudHh0KSB0aGF0IGxpc3QgYWxsIGtpbmRzIG9mIHN0YW5kYXJkcwogICAgIGFuZCBzbyBvbiB0aGF0IGFyZSBpbXBsZW1lbnRlZCBpbiBPcGVuU1NMLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEVuaGFuY2UgY19yZWhhc2ggc2NyaXB0LiBPbGQgdmVyc2lvbiB3b3VsZCBtaXNoYW5kbGUgY2VydGlmaWNhdGVzCiAgICAgd2l0aCB0aGUgc2FtZSBzdWJqZWN0IG5hbWUgaGFzaCBhbmQgd291bGRuJ3QgaGFuZGxlIENSTHMgYXQgYWxsLgogICAgIEFkZGVkIC1maW5nZXJwcmludCBvcHRpb24gdG8gY3JsIHV0aWxpdHksIHRvIHN1cHBvcnQgbmV3IGNfcmVoYXNoCiAgICAgZmVhdHVyZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRWxpbWluYXRlIG5vbi1BTlNJIGRlY2xhcmF0aW9ucyBpbiBjcnlwdG8uaCBhbmQgc3RhY2suaC4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgRml4IGZvciBTU0wgc2VydmVyIHB1cnBvc2UgY2hlY2tpbmcuIFNlcnZlciBjaGVja2luZyB3YXMKICAgICByZWplY3RpbmcgY2VydGlmaWNhdGVzIHdoaWNoIGhhZCBleHRlbmRlZCBrZXkgdXNhZ2UgcHJlc2VudAogICAgIGJ1dCBubyBzc2wgY2xpZW50IHB1cnBvc2UuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcmVwb3J0ZWQgYnkgUmVuZSBHcm9zc2VyIDxncm9zc2VyQGhpc29sdXRpb25zLmNvbT5dCgogICopIE1ha2UgUEtDUyMxMiBjb2RlIHdvcmsgd2l0aCBubyBwYXNzd29yZC4gVGhlIFBLQ1MjMTIgc3BlYwogICAgIGlzIGEgbGl0dGxlIHVuY2xlYXIgYWJvdXQgaG93IGEgYmxhbmsgcGFzc3dvcmQgaXMgaGFuZGxlZC4KICAgICBTaW5jZSB0aGUgcGFzc3dvcmQgaW4gZW5jb2RlZCBhcyBhIEJNUFN0cmluZyB3aXRoIHRlcm1pbmF0aW5nCiAgICAgZG91YmxlIE5VTEwgYSB6ZXJvIGxlbmd0aCBwYXNzd29yZCB3b3VsZCBlbmQgdXAgYXMganVzdCB0aGUKICAgICBkb3VibGUgTlVMTC4gSG93ZXZlciBubyBwYXNzd29yZCBhdCBhbGwgaXMgZGlmZmVyZW50IGFuZCBpcwogICAgIGhhbmRsZWQgZGlmZmVyZW50bHkgaW4gdGhlIFBLQ1MjMTIga2V5IGdlbmVyYXRpb24gY29kZS4gTlMKICAgICB0cmVhdHMgYSBibGFuayBwYXNzd29yZCBhcyB6ZXJvIGxlbmd0aC4gTVNJRSB0cmVhdHMgaXQgYXMgbm8KICAgICBwYXNzd29yZCBvbiBleHBvcnQ6IGJ1dCBpdCB3aWxsIHRyeSBib3RoIG9uIGltcG9ydC4gV2Ugbm93IGRvCiAgICAgdGhlIHNhbWU6IFBLQ1MxMl9wYXJzZSgpIHRyaWVzIHplcm8gbGVuZ3RoIGFuZCBubyBwYXNzd29yZCBpZgogICAgIHRoZSBwYXNzd29yZCBpcyBzZXQgdG8gIiIgb3IgTlVMTCAoTlVMTCBpcyBub3cgYSB2YWxpZCBwYXNzd29yZDoKICAgICBpdCB3YXNuJ3QgYmVmb3JlKSBhcyBkb2VzIHRoZSBwa2NzMTIgYXBwbGljYXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnZml4ZXMgaW4gYXBwcy94NTA5LmM6IEF2b2lkIGEgbWVtb3J5IGxlYWs7IGFuZCBkb24ndCB1c2UKICAgICBwZXJyb3Igd2hlbiBQRU1fcmVhZF9iaW9fWDUwOV9SRVEgZmFpbHMsIHRoZSBlcnJvciBtZXNzYWdlIG11c3QKICAgICBiZSBvYnRhaW5lZCBmcm9tIHRoZSBlcnJvciBxdWV1ZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCAndGhyZWFkX2hhc2gnIG1lbW9yeSBsZWFrIGluIGNyeXB0by9lcnIvZXJyLmMgYnkgZnJlZWluZwogICAgIGl0IGluIEVSUl9yZW1vdmVfc3RhdGUgaWYgYXBwcm9wcmlhdGUsIGFuZCBjaGFuZ2UgRVJSX2dldF9zdGF0ZQogICAgIGFjY29yZGluZ2x5IHRvIGF2b2lkIHJhY2UgY29uZGl0aW9ucyAodGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZQogICAgIHRocmVhZF9oYXNoIGlzIG5vIGxvbmdlciBjb25zdGFudCBvbmNlIHNldCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQnVnZml4IGZvciBsaW51eC1lbGYgbWFrZWZpbGUub25lLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBSU0FfZ2V0X2RlZmF1bHRfbWV0aG9kKCkgd2lsbCBub3cgY2F1c2UgYSBkZWZhdWx0CiAgICAgUlNBX01FVEhPRCB0byBiZSBjaG9zZW4gaWYgb25lIGRvZXNuJ3QgZXhpc3QgYWxyZWFkeS4KICAgICBQcmV2aW91c2x5IHRoaXMgd2FzIG9ubHkgc2V0IGR1cmluZyBhIGNhbGwgdG8gUlNBX25ldygpCiAgICAgb3IgUlNBX25ld19tZXRob2QoTlVMTCkgbWVhbmluZyBpdCB3YXMgcG9zc2libGUgZm9yCiAgICAgUlNBX2dldF9kZWZhdWx0X21ldGhvZCgpIHRvIHJldHVybiBOVUxMLgogICAgIFtHZW9mZiBUaG9ycGVdCgogICopIEFkZGVkIG5hdGl2ZSBuYW1lIHRyYW5zbGF0aW9uIHRvIHRoZSBleGlzdGluZyBEU08gY29kZQogICAgIHRoYXQgd2lsbCBjb252ZXJ0IChpZiB0aGUgZmxhZyB0byBkbyBzbyBpcyBzZXQpIGZpbGVuYW1lcwogICAgIHRoYXQgYXJlIHN1ZmZpY2llbnRseSBzbWFsbCBhbmQgaGF2ZSBubyBwYXRoIGluZm9ybWF0aW9uCiAgICAgaW50byBhIGNhbm9uaWNhbCBuYXRpdmUgZm9ybS4gRWcuICJibGFoIiBjb252ZXJ0ZWQgdG8KICAgICAibGliYmxhaC5zbyIgb3IgImJsYWguZGxsIiBldGMuCiAgICAgW0dlb2ZmIFRob3JwZV0KCiAgKikgTmV3IGZ1bmN0aW9uIEVSUl9lcnJvcl9zdHJpbmdfbihlLCBidWYsIGxlbikgd2hpY2ggaXMgbGlrZQogICAgIEVSUl9lcnJvcl9zdHJpbmcoZSwgYnVmKSwgYnV0IHdyaXRlcyBhdCBtb3N0ICdsZW4nIGJ5dGVzCiAgICAgaW5jbHVkaW5nIHRoZSAwIHRlcm1pbmF0b3IuICBGb3IgRVJSX2Vycm9yX3N0cmluZ19uLCAnYnVmJwogICAgIG1heSBub3QgYmUgTlVMTC4KICAgICBbRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPiwgQm9kbyBNb2VsbGVyXQoKICAqKSBDT05GIGxpYnJhcnkgcmV3b3JrZWQgdG8gYmVjb21lIG1vcmUgZ2VuZXJhbC4gIEEgbmV3IENPTkYKICAgICBjb25maWd1cmF0aW9uIGZpbGUgcmVhZGVyICJjbGFzcyIgaXMgaW1wbGVtZW50ZWQgYXMgd2VsbCBhcyBhCiAgICAgbmV3IGZ1bmN0aW9ucyAoTkNPTkZfKiwgZm9yICJOZXcgQ09ORiIpIHRvIGhhbmRsZSBpdC4gIFRoZSBub3cKICAgICBvbGQgQ09ORl8qIGZ1bmN0aW9ucyBhcmUgc3RpbGwgdGhlcmUsIGJ1dCBhcmUgcmVpbXBsZW1lbnRlZCB0bwogICAgIHdvcmsgaW4gdGVybXMgb2YgdGhlIG5ldyBmdW5jdGlvbnMuICBBbHNvLCBhIHNldCBvZiBmdW5jdGlvbnMKICAgICB0byBoYW5kbGUgdGhlIGludGVybmFsIHN0b3JhZ2Ugb2YgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YSBpcwogICAgIHByb3ZpZGVkIHRvIG1ha2UgaXQgZWFzaWVyIHRvIHdyaXRlIG5ldyBjb25maWd1cmF0aW9uIGZpbGUKICAgICByZWFkZXIgImNsYXNzZXMiIChJIGNhbiBkZWZpbml0ZWx5IHNlZSBzb21ldGhpbmcgcmVhZGluZyBhCiAgICAgY29uZmlndXJhdGlvbiBmaWxlIGluIFhNTCBmb3JtYXQsIGZvciBleGFtcGxlKSwgY2FsbGVkIF9DT05GXyosCiAgICAgb3IgInRoZSBjb25maWd1cmF0aW9uIHN0b3JhZ2UgQVBJIi4uLgoKICAgICBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gZmlsZSByZWFkaW5nIGZ1bmN0aW9ucyBhcmU6CgogICAgICAgIE5DT05GX25ldywgTkNPTkZfZnJlZSwgTkNPTkZfbG9hZCwgTkNPTkZfbG9hZF9mcCwgTkNPTkZfbG9hZF9iaW8sCiAgICAgICAgTkNPTkZfZ2V0X3NlY3Rpb24sIE5DT05GX2dldF9zdHJpbmcsIE5DT05GX2dldF9udW1icmUKCiAgICAgICAgTkNPTkZfZGVmYXVsdCwgTkNPTkZfV0lOMzIKCiAgICAgICAgTkNPTkZfZHVtcF9mcCwgTkNPTkZfZHVtcF9iaW8KCiAgICAgTkNPTkZfZGVmYXVsdCBhbmQgTkNPTkZfV0lOMzIgYXJlIG1ldGhvZCAob3IgImNsYXNzIikgY2hvb3NlcnMsCiAgICAgTkNPTkZfbmV3IGNyZWF0ZXMgYSBuZXcgQ09ORiBvYmplY3QuICBUaGlzIHdvcmtzIGluIHRoZSBzYW1lIHdheQogICAgIGFzIG90aGVyIGludGVyZmFjZXMgaW4gT3BlblNTTCwgbGlrZSB0aGUgQklPIGludGVyZmFjZS4KICAgICBOQ09ORl9kdW1wXyogZHVtcCB0aGUgaW50ZXJuYWwgc3RvcmFnZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLAogICAgIHdoaWNoIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nLiAgQWxsIG90aGVyIGZ1bmN0aW9ucyB0YWtlIHRoZSBzYW1lCiAgICAgYXJndW1lbnRzIGFzIHRoZSBvbGQgQ09ORl8qIGZ1bmN0aW9ucyB3dGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUKICAgICBmaXJzdCB0aGF0IG11c3QgYmUgYSBgQ09ORiAqJyBpbnN0ZWFkIG9mIGEgYExIQVNIIConLgoKICAgICBUbyBtYWtlIGl0IGVhc2VyIHRvIHVzZSB0aGUgbmV3IGNsYXNzZXMgd2l0aCB0aGUgb2xkIENPTkZfKiBmdW5jdGlvbnMsCiAgICAgdGhlIGZ1bmN0aW9uIENPTkZfc2V0X2RlZmF1bHRfbWV0aG9kIGlzIHByb3ZpZGVkLgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCAnLXRsczEnIG9wdGlvbiB0byAnb3BlbnNzbCBjaXBoZXJzJywgd2hpY2ggd2FzIGFscmVhZHkKICAgICBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYnV0IGhhZCBub3QgYmVlbiBpbXBsZW1lbnRlZC4KICAgICAoVGhpcyBvcHRpb24gaXMgbm90IHlldCByZWFsbHkgdXNlZnVsIGJlY2F1c2UgZXZlbiB0aGUgYWRkaXRpb25hbAogICAgIGV4cGVyaW1lbnRhbCBUTFMgMS4wIGNpcGhlcnMgYXJlIGN1cnJlbnRseSB0cmVhdGVkIGFzIFNTTCAzLjAgY2lwaGVycy4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5pdGlhbCBEU08gY29kZSBhZGRlZCBpbnRvIGxpYmNyeXB0byBmb3IgbGV0dGluZyBPcGVuU1NMIChhbmQKICAgICBPcGVuU1NMLWJhc2VkIGFwcGxpY2F0aW9ucykgbG9hZCBzaGFyZWQgbGlicmFyaWVzIGFuZCBiaW5kIHRvCiAgICAgdGhlbSBpbiBhIHBvcnRhYmxlIHdheS4KICAgICBbR2VvZmYgVGhvcnBlLCB3aXRoIGNvbnRyaWJ1dGlvbnMgZnJvbSBSaWNoYXJkIExldml0dGVdCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS41IGFuZCAwLjkuNWEgIFsxIEFwciAyMDAwXQoKICAqKSBNYWtlIHN1cmUgX2xyb3RsIGFuZCBfbHJvdHIgYXJlIG9ubHkgdXNlZCB3aXRoIE1TVkMuCgogICopIFVzZSBsb2NrIENSWVBUT19MT0NLX1JBTkQgY29ycmVjdGx5IGluIHNzbGVheV9yYW5kX3N0YXR1cwogICAgICh0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBSQU5EX3N0YXR1cykuCgogICopIFJlbmFtZSBvcGVuc3NsIHg1MDkgb3B0aW9uICctY3JsZXh0Jywgd2hpY2ggd2FzIGFkZGVkIGluIDAuOS41LAogICAgIHRvICctY2xyZXh0JyAoPSBjbGVhciBleHRlbnNpb25zKSwgYXMgaW50ZW5kZWQgYW5kIGRvY3VtZW50ZWQuCiAgICAgW0JvZG8gTW9lbGxlcjsgaW5jb25zaXN0ZW5jeSBwb2ludGVkIG91dCBieSBNaWNoYWVsIEF0dGlsaQogICAgIDxhdHRpbGlAYW1heG8uY29tPl0KCiAgKikgRml4IGZvciBITUFDLiBJdCB3YXNuJ3QgemVyb2luZyB0aGUgcmVzdCBvZiB0aGUgYmxvY2sgaWYgdGhlIGtleSBsZW5ndGgKICAgICB3YXMgbGFyZ2VyIHRoYW4gdGhlIE1EIGJsb2NrIHNpemUuICAgICAgCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgWW9zdCBXaWxsaWFtIDxZb3N0V0B0Y2UuY29tPl0KCiAgKikgTW9kZXJuaXNlIFBLQ1MxMl9wYXJzZSgpIHNvIGl0IHVzZXMgU1RBQ0tfT0YoWDUwOSkgZm9yIGl0cyBjYSBhcmd1bWVudAogICAgIGZpeCBhIGxlYWsgd2hlbiB0aGUgY2EgYXJndW1lbnQgd2FzIHBhc3NlZCBhcyBOVUxMLiBTdG9wIFg1MDlfUFVCS0VZX3NldCgpCiAgICAgdXNpbmcgdGhlIHBhc3NlZCBrZXk6IGlmIHRoZSBwYXNzZWQga2V5IHdhcyBhIHByaXZhdGUga2V5IHRoZSByZXN1bHQKICAgICBvZiBYNTA5X3ByaW50KCksIGZvciBleGFtcGxlLCB3b3VsZCBiZSB0byBwcmludCBvdXQgYWxsIHRoZSBwcml2YXRlIGtleQogICAgIGNvbXBvbmVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgZGVzX3F1YWRfY2tzdW0oKSBieXRlIG9yZGVyIGJ1ZyBmaXguCiAgICAgW1VsZiBN9mxsZXIsIHVzaW5nIHRoZSBwcm9ibGVtIGRlc2NyaXB0aW9uIGluIGtyYjQtMC45LjcsIHdoZXJlCiAgICAgIHRoZSBzb2x1dGlvbiBpcyBhdHRyaWJ1dGVkIHRvIERlcnJpY2sgSiBCcmFzaGVhciA8c2hhZG93QERFTUVOVElBLk9SRz5dCgogICopIEZpeCBzbyBWX0FTTjFfQVBQX0NIT09TRSB3b3JrcyBhZ2FpbjogaG93ZXZlciBpdHMgdXNlIGlzIHN0cm9uZ2x5CiAgICAgZGlzY291cmFnZWQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgQnJpYW4gS29ydmVyIDxicmlhbmtAY3Muc3RhbmZvcmQuZWR1Pl0KCiAgKikgRm9yIGVhc2lseSB0ZXN0aW5nIGluIHNoZWxsIHNjcmlwdHMgd2hldGhlciBzb21lIGNvbW1hbmQKICAgICAnb3BlbnNzbCBYWFgnIGV4aXN0cywgdGhlIG5ldyBwc2V1ZG8tY29tbWFuZCAnb3BlbnNzbCBuby1YWFgnCiAgICAgcmV0dXJucyB3aXRoIGV4aXQgY29kZSAwIGlmZiBubyBjb21tYW5kIG9mIHRoZSBnaXZlbiBuYW1lIGlzIGF2YWlsYWJsZS4KICAgICAnbm8tWFhYJyBpcyBwcmludGVkIGluIHRoaXMgY2FzZSwgJ1hYWCcgb3RoZXJ3aXNlLiAgSW4gYm90aCBjYXNlcywKICAgICB0aGUgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0IGFuZCBub3RoaW5nIGlzIHByaW50ZWQgdG8gc3RkZXJyLgogICAgIEFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZSBhbHdheXMgaWdub3JlZC4KCiAgICAgU2luY2UgZm9yIGVhY2ggY2lwaGVyIHRoZXJlIGlzIGEgY29tbWFuZCBvZiB0aGUgc2FtZSBuYW1lLAogICAgIHRoZSAnbm8tY2lwaGVyJyBjb21waWxhdGlvbiBzd2l0Y2hlcyBjYW4gYmUgdGVzdGVkIHRoaXMgd2F5LgoKICAgICAoJ29wZW5zc2wgbm8tWFhYJyBpcyBub3QgYWJsZSB0byBkZXRlY3QgcHNldWRvLWNvbW1hbmRzIHN1Y2gKICAgICBhcyAncXVpdCcsICdsaXN0LVhYWC1jb21tYW5kcycsIG9yICduby1YWFgnIGl0c2VsZi4pCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVXBkYXRlIHRlc3Qgc3VpdGUgc28gdGhhdCAnbWFrZSB0ZXN0JyBzdWNjZWVkcyBpbiAnbm8tcnNhJyBjb25maWd1cmF0aW9uLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZvciBTU0xfW0NUWF9dc2V0X3RtcF9kaCwgZG9uJ3QgY3JlYXRlIGEgREgga2V5IGlmIFNTTF9PUF9TSU5HTEVfREhfVVNFCiAgICAgaXMgc2V0OyBpdCB3aWxsIGJlIHRocm93biBhd2F5IGFueXdheSBiZWNhdXNlIGVhY2ggaGFuZHNoYWtlIGNyZWF0ZXMKICAgICBpdHMgb3duIGtleS4KICAgICBzc2xfY2VydF9kdXAsIHdoaWNoIGlzIHVzZWQgYnkgU1NMX25ldywgbm93IGNvcGllcyBESCBrZXlzIGluIGFkZGl0aW9uCiAgICAgdG8gcGFyYW1ldGVycyAtLSBpbiBwcmV2aW91cyB2ZXJzaW9ucyAoc2luY2UgT3BlblNTTCAwLjkuMykgdGhlCiAgICAgJ2RlZmF1bHQga2V5JyBmcm9tIFNTTF9DVFhfc2V0X3RtcF9kaCB3b3VsZCBhbHdheXMgYmUgbG9zdCwgbWVhbmluaW5nCiAgICAgeW91IGVmZmVjdGl2bHkgZ290IFNTTF9PUF9TSU5HTEVfREhfVVNFIHdoZW4gdXNpbmcgdGhpcyBtYWNyby4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgc19jbGllbnQgb3B0aW9uIC1pZ25fZW9mOiBFT0YgYXQgc3RkaW4gaXMgaWdub3JlZCwgYW5kCiAgICAgJ1EnIGFuZCAnUicgbG9zZSB0aGVpciBzcGVjaWFsIG1lYW5pbmdzIChxdWl0L3JlbmVnb3RpYXRlKS4KICAgICBUaGlzIGlzIHBhcnQgb2Ygd2hhdCAtcXVpZXQgZG9lczsgdW5saWtlIC1xdWlldCwgLWlnbl9lb2YKICAgICBkb2VzIG5vdCBzdXBwcmVzcyBhbnkgb3V0cHV0LgogICAgIFtSaWNoYXJkIExldml0dGVdCgogICopIEFkZCBjb21wYXRpYmlsaXR5IG9wdGlvbnMgdG8gdGhlIHB1cnBvc2UgYW5kIHRydXN0IGNvZGUuIFRoZQogICAgIHB1cnBvc2UgWDUwOV9QVVJQT1NFX0FOWSBpcyAiYW55IHB1cnBvc2UiIHdoaWNoIGF1dG9tYXRpY2FsbHkKICAgICBhY2NlcHRzIGEgY2VydGlmaWNhdGUgb3IgQ0EsIHRoaXMgd2FzIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIsCiAgICAgd2l0aCBhbGwgdGhlIGFzc29jaWF0ZWQgc2VjdXJpdHkgaXNzdWVzLgoKICAgICBYNTA5X1RSVVNUX0NPTVBBVCBpcyB0aGUgb2xkIHRydXN0IGJlaGF2aW91cjogb25seSBhbmQKICAgICBhdXRvbWF0aWNhbGx5IHRydXN0IHNlbGYgc2lnbmVkIHJvb3RzIGluIGNlcnRpZmljYXRlIHN0b3JlLiBBCiAgICAgbmV3IHRydXN0IHNldHRpbmcgWDUwOV9UUlVTVF9ERUZBVUxUIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGF0CiAgICAgYSBwdXJwb3NlIGhhcyBubyBhc3NvY2lhdGVkIHRydXN0IHNldHRpbmcgYW5kIGl0IHNob3VsZCBpbnN0ZWFkCiAgICAgdXNlIHRoZSB2YWx1ZSBpbiB0aGUgZGVmYXVsdCBwdXJwb3NlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCB0aGUgUEtDUyM4IERTQSBwcml2YXRlIGtleSBjb2RlIHNvIGl0IGRlY29kZXMga2V5cyBhZ2FpbgogICAgIGFuZCBmaXggYSBtZW1vcnkgbGVhay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiB1dGlsL21rZXJyLnBsICh3aGljaCBpbXBsZW1lbnRzICdtYWtlIGVycm9ycycpLCBwcmVzZXJ2ZQogICAgIHJlYXNvbiBzdHJpbmdzIGZyb20gdGhlIHByZXZpb3VzIHZlcnNpb24gb2YgdGhlIC5jIGZpbGUsIGFzCiAgICAgdGhlIGRlZmF1bHQgdG8gaGF2ZSBvbmx5IGRvd25jYXNlIGxldHRlcnMgKGFuZCBkaWdpdHMpIGluCiAgICAgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgcmVhc29ucyBjb2RlcyBpcyBub3QgYWx3YXlzIGFwcHJvcHJpYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIEVSUl9sb2FkX0VSUl9zdHJpbmdzKCksIGJ1aWxkIGFuIEVSUl9MSUJfU1lTIGVycm9yIHJlYXNvbiB0YWJsZQogICAgIHVzaW5nIHN0cmVycm9yLiAgUHJldmlvdXNseSwgRVJSX3JlYXNvbl9lcnJvcl9zdHJpbmcoKSByZXR1cm5lZAogICAgIGxpYnJhcnkgbmFtZXMgYXMgcmVhc29uIHN0cmluZ3MgZm9yIFNZU2VycjsgYnV0IFNZU2VyciBpcyBhIHNwZWNpYWwKICAgICBjYXNlIHdoZXJlIHNtYWxsIG51bWJlcnMgYXJlIGVycm5vIHZhbHVlcywgbm90IGxpYnJhcnkgbnVtYmVycy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgJy1kc2FwYXJhbScgb3B0aW9uIHRvICdvcGVuc3NsIGRocGFyYW0nIGFwcGxpY2F0aW9uLiAgVGhpcwogICAgIGNvbnZlcnRzIERTQSBwYXJhbWV0ZXJzIGludG8gREggcGFyYW1ldGVycy4gKFdoZW4gY3JlYXRpbmcgcGFyYW1ldGVycywKICAgICBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBpcyB1c2VkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbmNsdWRlICdsZW5ndGgnIChyZWNvbW1lbmRlZCBleHBvbmVudCBsZW5ndGgpIGluIEMgY29kZSBnZW5lcmF0ZWQKICAgICBieSAnb3BlbnNzbCBkaHBhcmFtIC1DJy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHNldF9sYWJlbCBpbiBwZXJsYXNtIHdhcyBhbHJlYWR5IGJlaW5nIHVzZWQKICAgICBzbyBjb3VsZG4ndCBiZSB1c2VkIGFzIGEgImZpbGUgc2NvcGUiIGZsYWcuIE1vdmVkIHRvIHRoaXJkIGFyZ3VtZW50CiAgICAgd2hpY2ggd2FzIGZyZWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW4gUEVNX0FTTjFfd3JpdGVfYmlvIGFuZCBzb21lIG90aGVyIGZ1bmN0aW9ucywgdXNlIFJBTkRfcHNldWRvX2J5dGVzCiAgICAgaW5zdGVhZCBvZiBSQU5EX2J5dGVzIGZvciBlbmNyeXB0aW9uIElWcyBhbmQgc2FsdHMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW5jbHVkZSBSQU5EX3N0YXR1cygpIGludG8gUkFORF9NRVRIT0QgaW5zdGVhZCBvZiBpbXBsZW1lbnRpbmcKICAgICBpdCBvbmx5IGZvciBtZF9yYW5kLmMgIE90aGVyd2lzZSByZXBsYWNpbmcgdGhlIFBSTkcgYnkgY2FsbGluZwogICAgIFJBTkRfc2V0X3JhbmRfbWV0aG9kIHdvdWxkIGJlIGltcG9zc2libGUuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRG9uJ3QgbGV0IERTQV9nZW5lcmF0ZV9rZXkoKSBlbnRlciBhbiBpbmZpbml0ZSBsb29wIGlmIHRoZSByYW5kb20KICAgICBudW1iZXIgZ2VuZXJhdGlvbiBmYWlscy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgJ3JhbmQnIGFwcGxpY2F0aW9uIGZvciBjcmVhdGluZyBwc2V1ZG8tcmFuZG9tIG91dHB1dC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGRlZCBjb25maWd1cmF0aW9uIHN1cHBvcnQgZm9yIExpbnV4L0lBNjQKICAgICBbUm9sZiBIYWJlcnJlY2tlciA8cm9sZkBzdXNlLmRlPl0KCiAgKikgQXNzZW1ibGVyIG1vZHVsZSBzdXBwb3J0IGZvciBNaW5ndzMyLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTaGFyZWQgbGlicmFyeSBzdXBwb3J0IGZvciBIUFVYIChpbiBzaGxpYi8pLgogICAgIFtMdXR6IEphZW5pY2tlIDxMdXR6LkphZW5pY2tlQGFldC5UVS1Db3R0YnVzLkRFPiBhbmQgQW5vbnltb3VzXQoKICAqKSBTaGFyZWQgbGlicmFyeSBzdXBwb3J0IGZvciBTb2xhcmlzIGdjYy4KICAgICBbTHV0eiBCZWhua2UgPGJlaG5rZUB0cnVzdGNlbnRlci5kZT5dCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS40IGFuZCAwLjkuNSAgWzI4IEZlYiAyMDAwXQoKICAqKSBQS0NTN19lbmNyeXB0KCkgd2FzIGFkZGluZyB0ZXh0IE1JTUUgaGVhZGVycyB0d2ljZSBiZWNhdXNlIHRoZXkKICAgICB3ZXJlIGFkZGVkIG1hbnVhbGx5IGFuZCBieSBTTUlNRV9jcmxmX2NvcHkoKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbiBibnRlc3QuYyBkb24ndCBjYWxsIEJOX3JhbmQgd2l0aCB6ZXJvIGJpdHMgYXJndW1lbnQuCiAgICAgW1N0ZXZlIEhlbnNvbiwgcG9pbnRlZCBvdXQgYnkgQW5kcmV3IFcuIEdyYXkgPGFncmF5QGljb25zaW5jLmNvbT5dCgogICopIEJOX211bCBidWdmaXg6IEluIGJuX211bF9wYXJ0X3JlY3Vyc2lvbigpIG9ubHkgdGhlIGE+YVtuXSAmJiBiPmJbbl0KICAgICBjYXNlIHdhcyBpbXBsZW1lbnRlZC4gVGhpcyBjYXVzZWQgQk5fZGl2X3JlY3AoKSB0byBmYWlsIG9jY2FzaW9uYWxseS4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIGFuIG9wdGlvbmFsIHNlY29uZCBhcmd1bWVudCB0byB0aGUgc2V0X2xhYmVsKCkgaW4gdGhlIHBlcmwKICAgICBhc3NlbWJseSBsYW5ndWFnZSBidWlsZGVyLiBJZiB0aGlzIGFyZ3VtZW50IGV4aXN0cyBhbmQgaXMgc2V0CiAgICAgdG8gMSBpdCBzaWduYWxzIHRoYXQgdGhlIGFzc2VtYmxlciBzaG91bGQgdXNlIGEgc3ltYm9sIHdob3NlIAogICAgIHNjb3BlIGlzIHRoZSBlbnRpcmUgZmlsZSwgbm90IGp1c3QgdGhlIGN1cnJlbnQgZnVuY3Rpb24uIFRoaXMKICAgICBpcyBuZWVkZWQgd2l0aCBNQVNNIHdoaWNoIHVzZXMgdGhlIGZvcm1hdCBsYWJlbDo6IGZvciB0aGlzIHNjb3BlLgogICAgIFtTdGV2ZSBIZW5zb24sIHBvaW50ZWQgb3V0IGJ5IFBldGVyIFJ1bmVzdGlnIDxwZXRlckBydW5lc3RpZy5jb20+XQoKICAqKSBDaGFuZ2UgdGhlIEFTTjEgdHlwZXMgc28gdGhleSBhcmUgdHlwZWRlZnMgYnkgZGVmYXVsdC4gQmVmb3JlCiAgICAgYWxtb3N0IGFsbCB0eXBlcyB3ZXJlICNkZWZpbmUnZCB0byBBU04xX1NUUklORyB3aGljaCB3YXMgY2F1c2luZwogICAgIFNUQUNLX09GKCkgcHJvYmxlbXM6IHlvdSBjb3VsZG4ndCBkZWNsYXJlIFNUQUNLX09GKEFTTjFfVVRGOFNUUklORykKICAgICBmb3IgZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgbmFtZXMgb2YgbmV3IGZ1bmN0aW9ucyB0byB0aGUgbmV3IGdldDEvZ2V0MCBuYW1pbmcKICAgICBjb252ZW50aW9uOiBBZnRlciAnZ2V0MScsIHRoZSBjYWxsZXIgb3ducyBhIHJlZmVyZW5jZSBjb3VudAogICAgIGFuZCBoYXMgdG8gY2FsbCAuLi5fZnJlZTsgJ2dldDAnIHJldHVybnMgYSBwb2ludGVyIHRvIHNvbWUKICAgICBkYXRhIHN0cnVjdHVyZSB3aXRob3V0IGluY3JlbWVudGluZyByZWZlcmVuY2UgY291bnRlcnMuCiAgICAgKFNvbWUgb2YgdGhlIGV4aXN0aW5nICdnZXQnIGZ1bmN0aW9ucyBpbmNyZW1lbnQgYSByZWZlcmVuY2UKICAgICBjb3VudGVyLCBzb21lIGRvbid0LikKICAgICBTaW1pbGFybHksICdzZXQxJyBhbmQgJ2FkZDEnIGZ1bmN0aW9ucyBpbmNyZWFzZSByZWZlcmVuY2UKICAgICBjb3VudGVycyBvciBkdXBsaWNhdGUgb2JqZWN0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBmb3IgdGhlIHBvc3NpYmlsaXR5IG9mIHRlbXAgUlNBIGtleSBnZW5lcmF0aW9uIGZhaWx1cmU6CiAgICAgdGhlIGNvZGUgdXNlZCB0byBhc3N1bWUgaXQgYWx3YXlzIHdvcmtlZCBhbmQgY3Jhc2hlZCBvbiBmYWlsdXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBwb3RlbnRpYWwgYnVmZmVyIG92ZXJydW4gcHJvYmxlbSBpbiBCSU9fcHJpbnRmKCkuCiAgICAgW1VsZiBN9mxsZXIsIHVzaW5nIHB1YmxpYyBkb21haW4gY29kZSBieSBQYXRyaWNrIFBvd2VsbDsgcHJvYmxlbQogICAgICBwb2ludGVkIG91dCBieSBEYXZpZCBTYWNlcmRvdGUgPGRhczMzQGNvcm5lbGwuZWR1Pl0KCiAgKikgU3VwcG9ydCBFR0QgPGh0dHA6Ly93d3cubG90aGFyLmNvbS90ZWNoL2NyeXB0by8+LiAgTmV3IGZ1bmN0aW9ucwogICAgIFJBTkRfZWdkKCkgYW5kIFJBTkRfc3RhdHVzKCkuICBJbiB0aGUgY29tbWFuZCBsaW5lIGFwcGxpY2F0aW9uLAogICAgIHRoZSBFR0Qgc29ja2V0IGNhbiBiZSBzcGVjaWZpZWQgbGlrZSBhIHNlZWQgZmlsZSB1c2luZyBSQU5ERklMRQogICAgIG9yIC1yYW5kLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBbGxvdyB0aGUgc3RyaW5nIENFUlRJRklDQVRFIHRvIGJlIHRvbGVyYXRlZCBpbiBQS0NTIzcgc3RydWN0dXJlcy4KICAgICBTb21lIENBcyAoZS5nLiBWZXJpc2lnbikgZGlzdHJpYnV0ZSBjZXJ0aWZpY2F0ZXMgaW4gdGhpcyBmb3JtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlbW92ZSB0aGUgU1NMX0FMTE9XX0FESCBjb21waWxlIG9wdGlvbiBhbmQgc2V0IHRoZSBkZWZhdWx0IGNpcGhlcgogICAgIGxpc3QgdG8gZXhjbHVkZSB0aGVtLiBUaGlzIG1lYW5zIHRoYXQgbm8gc3BlY2lhbCBjb21waWxhdGlvbiBvcHRpb24KICAgICBpcyBuZWVkZWQgdG8gdXNlIGFub255bW91cyBESDogaXQganVzdCBuZWVkcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUKICAgICBjaXBoZXIgbGlzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2UgdGhlIEVWUF9NRF9DVFhfdHlwZSBtYWNybyBzbyBpdHMgbWVhbmluZyBjb25zaXN0ZW50IHdpdGgKICAgICBFVlBfTURfdHlwZS4gVGhlIG9sZCBmdW5jdGlvbmFsaXR5IGlzIGF2YWlsYWJsZSBpbiBhIG5ldyBtYWNybyBjYWxsZWQKICAgICBFVlBfTURfbWQoKS4gQ2hhbmdlIGNvZGUgdGhhdCB1c2VzIGl0IGFuZCB1cGRhdGUgZG9jcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSAuLi5fY3RybCBmdW5jdGlvbnMgbm93IGhhdmUgY29ycmVzcG9uZGluZyAuLi5fY2FsbGJhY2tfY3RybCBmdW5jdGlvbnMKICAgICB3aGVyZSB0aGUgJ3ZvaWQgKicgYXJndW1lbnQgaXMgcmVwbGFjZWQgYnkgYSBmdW5jdGlvbiBwb2ludGVyIGFyZ3VtZW50LgogICAgIFByZXZpb3VzbHkgJ3ZvaWQgKicgd2FzIGFidXNlZCB0byBwb2ludCB0byBmdW5jdGlvbnMsIHdoaWNoIHdvcmtzIG9uCiAgICAgbWFueSBwbGF0Zm9ybXMsIGJ1dCBpcyBub3QgY29ycmVjdC4gIEFzIHRoZXNlIGZ1bmN0aW9ucyBhcmUgdXN1YWxseQogICAgIGNhbGxlZCBieSBtYWNyb3MgZGVmaW5lZCBpbiBPcGVuU1NMIGhlYWRlciBmaWxlcywgbW9zdCBzb3VyY2UgY29kZQogICAgIHNob3VsZCB3b3JrIHdpdGhvdXQgY2hhbmdlcy4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKICAqKSA8b3BlbnNzbC9vcGVuc3NsY29uZi5oPiAod2hpY2ggaXMgY3JlYXRlZCBieSBDb25maWd1cmUpIG5vdyBjb250YWlucwogICAgIHNlY3Rpb25zIHdpdGggaW5mb3JtYXRpb24gb24gLUQuLi4gY29tcGlsZXIgc3dpdGNoZXMgdXNlZCBmb3IKICAgICBjb21waWxpbmcgdGhlIGxpYnJhcnkgc28gdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHNlZSB0aGVtLiAgVG8gZW5hYmxlCiAgICAgb25lIG9mIHRoZXNlIHNlY3Rpb25zLCBhIHByZS1wcm9jZXNzb3Igc3ltYm9sIE9QRU5TU0xfLi4uX0RFRklORVMKICAgICBtdXN0IGJlIGRlZmluZWQuICBFLmcuLAogICAgICAgICNkZWZpbmUgT1BFTlNTTF9BTEdPUklUSE1fREVGSU5FUwogICAgICAgICNpbmNsdWRlIDxvcGVuc3NsL29wZW5zc2xjb25mLmg+CiAgICAgZGVmaW5lcyBhbGwgcGVydGluZW50IE5PXzxhbGdvPiBzeW1ib2xzLCBzdWNoIGFzIE5PX0lERUEsIE5PX1JTQSwgZXRjLgogICAgIFtSaWNoYXJkIExldml0dGUsIFVsZiBhbmQgQm9kbyBN9mxsZXJdCgogICopIEJ1Z2ZpeDogVG9sZXJhdGUgZnJhZ21lbnRhdGlvbiBhbmQgaW50ZXJsZWF2aW5nIGluIHRoZSBTU0wgMy9UTFMKICAgICByZWNvcmQgbGF5ZXIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQ2hhbmdlIHRoZSAnb3RoZXInIHR5cGUgaW4gY2VydGlmaWNhdGUgYXV4IGluZm8gdG8gYSBTVEFDS19PRgogICAgIFg1MDlfQUxHT1IuIEFsdGhvdWdoIG5vdCBhbiBBbGdvcml0aG1JZGVudGlmaWVyIGFzIHN1Y2ggaXQgaGFzCiAgICAgdGhlIHJlcXVpcmVkIEFTTjEgZm9ybWF0OiBhcmJpdHJhcnkgdHlwZXMgZGV0ZXJtaW5lZCBieSBhbiBPSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNvbWUgUEVNX3dyaXRlX1g1MDlfUkVRX05FVygpIGZ1bmN0aW9ucyBhbmQgYSBjb21tYW5kIGxpbmUKICAgICBhcmd1bWVudCB0byAncmVxJy4gVGhpcyBpcyBub3QgYmVjYXVzZSB0aGUgZnVuY3Rpb24gaXMgbmV3ZXIgb3IKICAgICBiZXR0ZXIgdGhhbiBvdGhlcnMgaXQganVzdCB1c2VzIHRoZSB3b3JrICdORVcnIGluIHRoZSBjZXJ0aWZpY2F0ZQogICAgIHJlcXVlc3QgaGVhZGVyIGxpbmVzLiBTb21lIHNvZnR3YXJlIG5lZWRzIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVvcmdhbmlzZSBwYXNzd29yZCBjb21tYW5kIGxpbmUgYXJndW1lbnRzOiBub3cgcGFzc3dvcmRzIGNhbiBiZQogICAgIG9idGFpbmVkIGZyb20gdmFyaW91cyBzb3VyY2VzLiBEZWxldGUgdGhlIFBFTV9jYiBmdW5jdGlvbiBhbmQgbWFrZQogICAgIGl0IHRoZSBkZWZhdWx0IGJlaGF2aW91cjogaS5lLiBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTCBhbmQgdGhlCiAgICAgdXNyZGF0YSBhcmd1bWVudCBpcyBub3QgTlVMTCBpbnRlcnByZXQgaXQgYXMgYSBudWxsIHRlcm1pbmF0ZWQgcGFzcwogICAgIHBocmFzZS4gSWYgdXNyZGF0YSBhbmQgdGhlIGNhbGxiYWNrIGFyZSBOVUxMIHRoZW4gdGhlIHBhc3MgcGhyYXNlCiAgICAgaXMgcHJvbXB0ZWQgZm9yIGFzIHVzdWFsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBzdXBwb3J0IGZvciB0aGUgQ29tcGFxIEF0YWxsYSBjcnlwdG8gYWNjZWxlcmF0b3IuIElmIGl0IGlzIGluc3RhbGxlZCwKICAgICB0aGUgc3VwcG9ydCBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQuIFRoZSByZXN1bHRpbmcgYmluYXJpZXMgd2lsbAogICAgIGF1dG9kZXRlY3QgdGhlIGNhcmQgYW5kIHVzZSBpdCBpZiBwcmVzZW50LgogICAgIFtCZW4gTGF1cmllIGFuZCBDb21wYXEgSW5jLl0KCiAgKikgV29yayBhcm91bmQgZm9yIE5ldHNjYXBlIGhhbmcgYnVnLiBUaGlzIHNlbmRzIGNlcnRpZmljYXRlIHJlcXVlc3QKICAgICBhbmQgc2VydmVyIGRvbmUgaW4gb25lIHJlY29yZC4gU2luY2UgdGhpcyBpcyBwZXJmZWN0bHkgbGVnYWwgaW4gdGhlCiAgICAgU1NML1RMUyBwcm90b2NvbCBpdCBpc24ndCBhICJidWciIG9wdGlvbiBhbmQgaXMgb24gYnkgZGVmYXVsdC4gU2VlCiAgICAgdGhlIGJ1Z3MvU1NMdjMgZW50cnkgZm9yIG1vcmUgaW5mby4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBIUC1VWCB0dW5lLXVwOiBuZXcgdW5pZmllZCBjb25maWdzLCBIUCBDIGNvbXBpbGVyIGJ1ZyB3b3JrYXJvdW5kLgogICAgIFtBbmR5IFBvbHlha292XQoKICAqKSBBZGQgLXJhbmQgYXJndW1lbnQgdG8gc21pbWUgYW5kIHBrY3MxMiBhcHBsaWNhdGlvbnMgYW5kIHJlYWQvd3JpdGUKICAgICBvZiBzZWVkIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3ICdwYXNzd2QnIHRvb2wgZm9yIGNyeXB0KDMpIGFuZCBhcHIxIHBhc3N3b3JkIGhhc2hlcy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgY29tbWFuZCBsaW5lIHBhc3N3b3JkIG9wdGlvbnMgdG8gdGhlIHJlbWFpbmluZyBhcHBsaWNhdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnIGZpeCBmb3IgQk5fZGl2X3JlY3AoKSBmb3IgbnVtZXJhdG9ycyB3aXRoIGFuIGV2ZW4gbnVtYmVyIG9mCiAgICAgYml0cy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTW9yZSB0ZXN0cyBpbiBibnRlc3QuYywgYW5kIGNoYW5nZWQgdGVzdF9ibiBvdXRwdXQuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIC4vY29uZmlnIHJlY29nbml6ZXMgTWFjT1MgWCBub3cuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEJ1ZyBmaXggZm9yIEJOX2RpdigpIHdoZW4gdGhlIGZpcnN0IHdvcmRzIG9mIG51bSBhbmQgZGl2c29yIGFyZQogICAgIGVxdWFsIChpdCBnYXZlIHdyb25nIHJlc3VsdHMgaWYgKHJlbT0objEtcSpkMCkmQk5fTUFTSzIpIDwgZDApLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdmFyaW91cyBicm9rZW4gUEtDUyM4IGZvcm1hdHMsIGFuZCBjb21tYW5kIGxpbmUKICAgICBvcHRpb25zIHRvIHByb2R1Y2UgdGhlbS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIEJOX0NUWF9zdGFydCgpLCBCTl9DVFhfZ2V0KCkgYW5kIEJUX0NUWF9lbmQoKSB0bwogICAgIGdldCB0ZW1wb3JhcnkgQklHTlVNcyBmcm9tIGEgQk5fQ1RYLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDb3JyZWN0IHJldHVybiB2YWx1ZXMgaW4gQk5fbW9kX2V4cF9tb250KCkgYW5kIEJOX21vZF9leHAyX21vbnQoKQogICAgIGZvciBwID09IDAuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENoYW5nZSB0aGUgU1NMZWF5X2FkZF9hbGxfKigpIGZ1bmN0aW9ucyB0byBPcGVuU1NMX2FkZF9hbGxfKigpIGFuZAogICAgIGluY2x1ZGUgYSAjZGVmaW5lIGZyb20gdGhlIG9sZCBuYW1lIHRvIHRoZSBuZXcuIFRoZSBvcmlnaW5hbCBpbnRlbnQKICAgICB3YXMgdGhhdCBzdGF0aWNhbGx5IGxpbmtlZCBiaW5hcmllcyBjb3VsZCBmb3IgZXhhbXBsZSBqdXN0IGNhbGwKICAgICBTU0xlYXlfYWRkX2FsbF9jaXBoZXJzKCkgdG8ganVzdCBhZGQgY2lwaGVycyB0byB0aGUgdGFibGUgYW5kIG5vdAogICAgIGxpbmsgd2l0aCBkaWdlc3RzLiBUaGlzIG5ldmVyIHdvcmtlZCBiZWNheXNlIFNTTGVheV9hZGRfYWxsX2RpZ2VzdHMoKQogICAgIGFuZCBTU0xlYXlfYWRkX2FsbF9jaXBoZXJzKCkgd2VyZSBpbiB0aGUgc2FtZSBzb3VyY2UgZmlsZSBzbyBjYWxsaW5nCiAgICAgb25lIHdvdWxkIGxpbmsgd2l0aCB0aGUgb3RoZXIuIFRoZXkgYXJlIG5vdyBpbiBzZXBhcmF0ZSBzb3VyY2UgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IC1ub3RleHQgb3B0aW9uIHRvICdjYScgYW5kIGEgLXB1YmtleSBvcHRpb24gdG8gJ3Nwa2FjJy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBVc2UgYSBsZXNzIHVudXN1YWwgZm9ybSBvZiB0aGUgTWlsbGVyLVJhYmluIHByaW1hbGl0eSB0ZXN0IChpdCB1c2VkCiAgICAgYSBiaW5hcnkgYWxnb3JpdGhtIGZvciBleHBvbmVudGlhdGlvbiBpbnRlZ3JhdGVkIGludG8gdGhlIE1pbGxlci1SYWJpbgogICAgIGxvb3AsIG91ciBzdGFuZGFyZCBtb2RleHAgYWxnb3JpdGhtcyBhcmUgZmFzdGVyKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdXBwb3J0IGZvciB0aGUgRUJDRElDIGNoYXJhY3RlciBzZXQgY29tcGxldGVkLgogICAgIFtNYXJ0aW4gS3JhZW1lciA8TWFydGluLktyYWVtZXJATWNoLlNOSS5EZT5dCgogICopIFNvdXJjZSBjb2RlIGNsZWFudXBzOiB1c2UgY29uc3Qgd2hlcmUgYXBwcm9wcmlhdGUsIGVsaW1pbmF0ZSBjYXN0cywKICAgICB1c2Ugdm9pZCAqIGluc3RlYWQgb2YgY2hhciAqIGluIGxoYXNoLgogICAgIFtVbGYgTfZsbGVyXSAKCiAgKikgQnVnZml4OiBzc2wzX3NlbmRfc2VydmVyX2tleV9leGNoYW5nZSB3YXMgbm90IHJlc3RhcnRhYmxlCiAgICAgKHRoZSBzdGF0ZSB3YXMgbm90IGNoYW5nZWQgdG8gU1NMM19TVF9TV19LRVlfRVhDSF9CLCBhbmQgYmVjYXVzZSBvZgogICAgIHRoaXMgdGhlIHNlcnZlciBjb3VsZCBvdmVyd3JpdGUgZXBoZW1lcmFsIGtleXMgdGhhdCB0aGUgY2xpZW50CiAgICAgaGFzIGFscmVhZHkgc2VlbikuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgVHVybiBEU0FfaXNfcHJpbWUgaW50byBhIG1hY3JvIHRoYXQgY2FsbHMgQk5faXNfcHJpbWUsCiAgICAgdXNpbmcgNTAgaXRlcmF0aW9ucyBvZiB0aGUgUmFiaW4tTWlsbGVyIHRlc3QuCgogICAgIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIG5vdyB1c2VzIEJOX2lzX3ByaW1lX2Zhc3R0ZXN0ICh3aXRoIDUwCiAgICAgaXRlcmF0aW9ucyBvZiB0aGUgUmFiaW4tTWlsbGVyIHRlc3QgYXMgcmVxdWlyZWQgYnkgdGhlIGFwcGVuZGl4CiAgICAgdG8gRklQUyBQVUIgMTg2Wy0xXSkgaW5zdGVhZCBvZiBEU0FfaXNfcHJpbWUuCiAgICAgQXMgQk5faXNfcHJpbWVfZmFzdHRlc3QgaW5jbHVkZXMgdHJpYWwgZGl2aXNpb24sIERTQSBwYXJhbWV0ZXIKICAgICBnZW5lcmF0aW9uIGJlY29tZXMgbXVjaCBmYXN0ZXIuCgogICAgIFRoaXMgaW1wbGllcyBhIGNoYW5nZSBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9ucyBpbiBEU0FfaXNfcHJpbWUKICAgICBhbmQgRFNBX2dlbmVyYXRlX3BhcmFtZXRlcnM6IFRoZSBjYWxsYmFjayBmdW5jdGlvbiBpcyBjYWxsZWQgb25jZQogICAgIGZvciBlYWNoIHBvc2l0aXZlIHdpdG5lc3MgaW4gdGhlIFJhYmluLU1pbGxlciB0ZXN0LCBub3QganVzdAogICAgIG9jY2FzaW9uYWxseSBpbiB0aGUgaW5uZXIgbG9vcDsgYW5kIHRoZSBwYXJhbWV0ZXJzIHRvIHRoZQogICAgIGNhbGxiYWNrIGZ1bmN0aW9uIG5vdyBwcm92aWRlIGFuIGl0ZXJhdGlvbiBjb3VudCBmb3IgdGhlIG91dGVyCiAgICAgbG9vcCByYXRoZXIgdGhhbiBmb3IgdGhlIGN1cnJlbnQgaW52b2NhdGlvbiBvZiB0aGUgaW5uZXIgbG9vcC4KICAgICBEU0FfZ2VuZXJhdGVfcGFyYW1ldGVycyBhZGRpdGlvbmFsbHkgY2FuIGNhbGwgdGhlIGNhbGxiYWNrCiAgICAgZnVuY3Rpb24gd2l0aCBhbiAnaXRlcmF0aW9uIGNvdW50JyBvZiAtMSwgbWVhbmluZyB0aGF0IGEKICAgICBjYW5kaWRhdGUgaGFzIHBhc3NlZCB0aGUgdHJpYWwgZGl2aXNpb24gdGVzdCAod2hlbiBxIGlzIGdlbmVyYXRlZCAKICAgICBmcm9tIGFuIGFwcGxpY2F0aW9uLXByb3ZpZGVkIHNlZWQsIHRyaWFsIGRpdmlzaW9uIGlzIHNraXBwZWQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBmdW5jdGlvbiBCTl9pc19wcmltZV9mYXN0dGVzdCB0aGF0IG9wdGlvbmFsbHkgZG9lcyB0cmlhbAogICAgIGRpdmlzaW9uIGJlZm9yZSBzdGFydGluZyB0aGUgUmFiaW4tTWlsbGVyIHRlc3QgYW5kIGhhcwogICAgIGFuIGFkZGl0aW9uYWwgQk5fQ1RYICogYXJndW1lbnQgKHdoZXJlYXMgQk5faXNfcHJpbWUgYWx3YXlzCiAgICAgaGFzIHRvIGFsbG9jYXRlIGF0IGxlYXN0IG9uZSBCTl9DVFgpLgogICAgICdjYWxsYmFjaygxLCAtMSwgY2JfYXJnKScgaXMgY2FsbGVkIHdoZW4gYSBudW1iZXIgaGFzIHBhc3NlZCB0aGUKICAgICB0cmlhbCBkaXZpc2lvbiBzdGFnZS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBGaXggZm9yIGJ1ZyBpbiBDUkwgZW5jb2RpbmcuIFRoZSB2YWxpZGl0eSBkYXRlcyB3ZXJlbid0IGJlaW5nIGhhbmRsZWQKICAgICBhcyBBU04xX1RJTUUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IC1wa2NzMTIgb3B0aW9uIHRvIENBLnBsIHNjcmlwdCB0byB3cml0ZSBvdXQgYSBQS0NTIzEyIGZpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIEJOX3BzZXVkb19yYW5kKCkuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIENsZWFuIHVwIEJOX21vZF9tdWxfbW9udGdvbWVyeSgpOiByZXBsYWNlIHRoZSBicm9rZW4gKGFuZCB1bnJlYWRhYmxlKQogICAgIGJpZ251bSB2ZXJzaW9uIG9mIEJOX2Zyb21fbW9udGdvbWVyeSgpIHdpdGggdGhlIHdvcmtpbmcgY29kZSBmcm9tCiAgICAgU1NMZWF5IDAuOS4wICh0aGUgd29yZCBiYXNlZCB2ZXJzaW9uIGlzIGZhc3RlciBhbnl3YXkpLCBhbmQgY2xlYW4gdXAKICAgICB0aGUgY29tbWVudHMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEF2b2lkIGEgcmFjZSBjb25kaXRpb24gaW4gczJfY2xudC5jIChmdW5jdGlvbiBnZXRfc2VydmVyX2hlbGxvKSB0aGF0CiAgICAgbWFkZSBpdCBpbXBvc3NpYmxlIHRvIHVzZSB0aGUgc2FtZSBTU0xfU0VTU0lPTiBkYXRhIHN0cnVjdHVyZSBpbgogICAgIFNTTDIgY2xpZW50cyBpbiBtdWx0aXBsZSB0aHJlYWRzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFRoZSByZXR1cm4gdmFsdWUgb2YgUkFORF9sb2FkX2ZpbGUoKSBubyBsb25nZXIgY291bnRzIGJ5dGVzIG9idGFpbmVkCiAgICAgYnkgc3RhdCgpLiAgUkFORF9sb2FkX2ZpbGUoLi4uLCAtMSkgaXMgbmV3IGFuZCB1c2VzIHRoZSBjb21wbGV0ZSBmaWxlCiAgICAgdG8gc2VlZCB0aGUgUFJORyAocHJldmlvdXNseSBhbiBleHBsaWNpdCBieXRlIGNvdW50IHdhcyByZXF1aXJlZCkuCiAgICAgW1VsZiBN9mxsZXIsIEJvZG8gTfZsbGVyXQoKICAqKSBDbGVhbiB1cCBDUllQVE9fRVhfREFUQSBmdW5jdGlvbnMsIHNvbWUgb2YgdGhlc2UgZGlkbid0IGhhdmUgcHJvdG90eXBlcwogICAgIHVzZWQgKGNoYXIgKikgaW5zdGVhZCBvZiAodm9pZCAqKSBhbmQgaGFkIGNhc3RzIGFsbCBvdmVyIHRoZSBwbGFjZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIEJOX2dlbmVyYXRlX3ByaW1lKCkgcmV0dXJuIE5VTEwgb24gZXJyb3IgaWYgcmV0IT1OVUxMLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBSZXRhaW4gc291cmNlIGNvZGUgY29tcGF0aWJpbGl0eSBmb3IgQk5fcHJpbWVfY2hlY2tzIG1hY3JvOgogICAgIEJOX2lzX3ByaW1lKC4uLiwgQk5fcHJpbWVfY2hlY2tzLCAuLi4pIG5vdyB1c2VzCiAgICAgQk5fcHJpbWVfY2hlY2tzX2Zvcl9zaXplIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mCiAgICAgUmFiaW4tTWlsbGVyIGl0ZXJhdGlvbnMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIERpZmZpZS1IZWxsbWFuIHVzZXMgInNhZmUiIHByaW1lczogREhfY2hlY2soKSByZXR1cm4gY29kZSByZW5hbWVkIHRvCiAgICAgREhfQ0hFQ0tfUF9OT1RfU0FGRV9QUklNRS4KICAgICAoQ2hlY2sgaWYgdGhpcyBpcyB0cnVlPyBPcGVuUEdQIGNhbGxzIHRoZW0gInN0cm9uZyIuKQogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBNZXJnZSB0aGUgZnVuY3Rpb25hbGl0eSBvZiAiZGgiIGFuZCAiZ2VuZGgiIHByb2dyYW1zIGludG8gYSBuZXcgcHJvZ3JhbQogICAgICJkaHBhcmFtIi4gVGhlIG9sZCBwcm9ncmFtcyBhcmUgcmV0YWluZWQgZm9yIG5vdyBidXQgd2lsbCBoYW5kbGUgREgga2V5cwogICAgIChpbnN0ZWFkIG9mIHBhcmFtZXRlcnMpIGluIGZ1dHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIHRoZSBjaXBoZXJzLCBzX3NlcnZlciBhbmQgc19jbGllbnQgcHJvZ3JhbXMgY2hlY2sgdGhlIHJldHVybiB2YWx1ZXMKICAgICB3aGVuIGEgbmV3IGNpcGhlciBsaXN0IGlzIHNldC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIHRoZSBTU0wvVExTIGNpcGhlciBtZWNoYW5pc20gdG8gY29ycmVjdGx5IGhhbmRsZSB0aGUgVExTIDU2Yml0CiAgICAgY2lwaGVycy4gQmVmb3JlIHdoZW4gdGhlIDU2Yml0IGNpcGhlcnMgd2VyZSBlbmFibGVkIHRoZSBzb3J0aW5nIHdhcwogICAgIHdyb25nLgoKICAgICBUaGUgc3ludGF4IGZvciB0aGUgY2lwaGVyIHNvcnRpbmcgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBzb3J0aW5nIGJ5CiAgICAgY2lwaGVyLXN0cmVuZ3RoICh1c2luZyB0aGUgc3RyZW5ndGhfYml0cyBoYXJkIGNvZGVkIGluIHRoZSB0YWJsZXMpLgogICAgIFRoZSBuZXcgY29tbWFuZCBpcyAiQFNUUkVOR1RIIiAoc2VlIGFsc28gZG9jL2FwcHMvY2lwaGVycy5wb2QpLgoKICAgICBGaXggYSBidWcgaW4gdGhlIGNpcGhlci1jb21tYW5kIHBhcnNlcjogd2hlbiBzdXBwbHlpbmcgYSBjaXBoZXIgY29tbWFuZAogICAgIHN0cmluZyB3aXRoIGFuICJ1bmRlZmluZWQiIHN5bWJvbCAobmVpdGhlciBjb21tYW5kIG5vciBhbHBoYW51bWVyaWMKICAgICBbQS1aYS16MC05XSwgc3NsX3NldF9jaXBoZXJfbGlzdCB1c2VkIHRvIGhhbmcgaW4gYW4gZW5kbGVzcyBsb29wLiBOb3cKICAgICBhbiBlcnJvciBpcyBmbGFnZ2VkLgoKICAgICBEdWUgdG8gdGhlIHN0cmVuZ3RoLXNvcnRpbmcgZXh0ZW5zaW9uLCB0aGUgY29kZSBvZiB0aGUKICAgICBzc2xfY3JlYXRlX2NpcGhlcl9saXN0KCkgZnVuY3Rpb24gd2FzIGNvbXBsZXRlbHkgcmVhcnJhbmdlZC4gSSBob3BlIHRoYXQKICAgICB0aGUgcmVhZGFiaWxpdHkgd2FzIGFsc28gaW5jcmVhc2VkIDotKQogICAgIFtMdXR6IEphZW5pY2tlIDxMdXR6LkphZW5pY2tlQGFldC5UVS1Db3R0YnVzLkRFPl0KCiAgKikgTWlub3IgY2hhbmdlIHRvICd4NTA5JyB1dGlsaXR5LiBUaGUgLUNBY3JlYXRlc2VyaWFsIG9wdGlvbiBub3cgdXNlcyAxCiAgICAgZm9yIHRoZSBmaXJzdCBzZXJpYWwgbnVtYmVyIGFuZCBwbGFjZXMgMiBpbiB0aGUgc2VyaWFsIG51bWJlciBmaWxlLiBUaGlzCiAgICAgYXZvaWRzIHByb2JsZW1zIHdoZW4gdGhlIHJvb3QgQ0EgaXMgY3JlYXRlZCB3aXRoIHNlcmlhbCBudW1iZXIgemVybyBhbmQKICAgICB0aGUgZmlyc3QgdXNlciBjZXJ0aWZpY2F0ZSBoYXMgdGhlIHNhbWUgaXNzdWVyIG5hbWUgYW5kIHNlcmlhbCBudW1iZXIKICAgICBhcyB0aGUgcm9vdCBDQS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBYNTA5X0FUVFJJQlVURSB1dGlsaXRpZXMsIGNoYW5nZSB0aGUgJ3JlcScgcHJvZ3JhbSBzbyBpdCB1c2VzCiAgICAgdGhlIG5ldyBjb2RlLiBBZGQgZG9jdW1lbnRhdGlvbiBmb3IgdGhpcyBzdHVmZi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VzIHRvIFg1MDlfQVRUUklCVVRFIHV0aWxpdGllcy4gVGhlc2UgaGF2ZSBiZWVuIHJlbmFtZWQgZnJvbQogICAgIFg1MDlfKigpIHRvIFg1MDlhdF8qKCkgb24gdGhlIGdyb3VuZHMgdGhhdCB0aGV5IGRvbid0IGhhbmRsZSBYNTA5CiAgICAgc3RydWN0dXJlcyBhbmQgYmVoYXZlIGluIGFuIGFuYWxhZ291cyB3YXkgdG8gdGhlIFg1MDl2MyBmdW5jdGlvbnM6CiAgICAgdGhleSBzaG91bGRuJ3QgYmUgY2FsbGVkIGRpcmVjdGx5IGJ1dCB3cmFwcGVyIGZ1bmN0aW9ucyBzaG91bGQgYmUgdXNlZAogICAgIGluc3RlYWQuCgogICAgIFNvIHdlIGFsc28gbm93IGhhdmUgc29tZSB3cmFwcGVyIGZ1bmN0aW9ucyB0aGF0IGNhbGwgdGhlIFg1MDlhdCBmdW5jdGlvbnMKICAgICB3aGVuIHBhc3NlZCBjZXJ0aWZpY2F0ZSByZXF1ZXN0cy4gKFRPIERPOiBzaW1pbGFyIHRoaW5ncyBjYW4gYmUgZG9uZSB3aXRoCiAgICAgUEtDUyM3IHNpZ25lZCBhbmQgdW5zaWduZWQgYXR0cmlidXRlcywgUEtDUyMxMiBhdHRyaWJ1dGVzIGFuZCBhIGZldyBvdGhlcgogICAgIHRoaW5ncy4gU29tZSBvZiB0aGVzZSBuZWVkIHNvbWUgZDJpIG9yIGkyZCBhbmQgcHJpbnQgZnVuY3Rpb25hbGl0eQogICAgIGJlY2F1c2UgdGhleSBoYW5kbGUgbW9yZSBjb21wbGV4IHN0cnVjdHVyZXMuKQogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBtaXNzaW5nICNpZm5kZWZzIHRoYXQgY2F1c2VkIG1pc3Npbmcgc3ltYm9scyB3aGVuIGJ1aWxkaW5nIGxpYnNzbAogICAgIGFzIGEgc2hhcmVkIGxpYnJhcnkgd2l0aG91dCBSU0EuICBVc2UgI2lmbmRlZiBOT19TU0wyIGluc3RlYWQgb2YKICAgICBOT19SU0EgaW4gc3NsL3MyKi5jLiAKICAgICBbS3JpcyBLZW5uYXdheSA8a3Jpc0BodWIuZnJlZWJzZC5vcmc+LCBtb2RpZmllZCBieSBVbGYgTfZsbGVyXQoKICAqKSBQcmVjYXV0aW9ucyBhZ2FpbnN0IHVzaW5nIHRoZSBQUk5HIHVuaW5pdGlhbGl6ZWQ6IFJBTkRfYnl0ZXMoKSBub3cKICAgICBoYXMgYSByZXR1cm4gdmFsdWUgd2hpY2ggaW5kaWNhdGVzIHRoZSBxdWFsaXR5IG9mIHRoZSByYW5kb20gZGF0YQogICAgICgxID0gb2ssIDAgPSBub3Qgc2VlZGVkKS4gIEFsc28gYW4gZXJyb3IgaXMgcmVjb3JkZWQgb24gdGhlIHRocmVhZCdzCiAgICAgZXJyb3IgcXVldWUuIE5ldyBmdW5jdGlvbiBSQU5EX3BzZXVkb19ieXRlcygpIGdlbmVyYXRlcyBvdXRwdXQgdGhhdCBpcwogICAgIGd1YXJhbnRlZWQgdG8gYmUgdW5pcXVlIGJ1dCBub3QgdW5wcmVkaWN0YWJsZS4gUkFORF9hZGQgaXMgbGlrZQogICAgIFJBTkRfc2VlZCwgYnV0IHRha2VzIGFuIGV4dHJhIGFyZ3VtZW50IGZvciBhbiBlbnRyb3B5IGVzdGltYXRlCiAgICAgKFJBTkRfc2VlZCBhbHdheXMgYXNzdW1lcyBmdWxsIGVudHJvcHkpLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBEbyBtb3JlIGl0ZXJhdGlvbnMgb2YgUmFiaW4tTWlsbGVyIHByb2JhYmxlIHByaW1lIHRlc3QgKHNwZWNpZmljYWxseSwKICAgICAzIGZvciAxMDI0LWJpdCBwcmltZXMsIDYgZm9yIDUxMi1iaXQgcHJpbWVzLCAxMiBmb3IgMjU2LWJpdCBwcmltZXMKICAgICBpbnN0ZWFkIG9mIG9ubHkgMiBmb3IgYWxsIGxlbmd0aHM7IHNlZSBCTl9wcmltZV9jaGVja3NfZm9yX3NpemUgZGVmaW5pdGlvbgogICAgIGluIGNyeXB0by9ibi9ibl9wcmltZS5jIGZvciB0aGUgY29tcGxldGUgdGFibGUpLiAgVGhpcyBndWFyYW50ZWVzIGEKICAgICBmYWxzZS1wb3NpdGl2ZSByYXRlIG9mIGF0IG1vc3QgMl4tODAgZm9yIHJhbmRvbSBpbnB1dC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBSZXdyaXRlIHNzbDNfcmVhZF9uIChzc2wvczNfcGt0LmMpIGF2b2lkaW5nIGEgY291cGxlIG9mIGJ1Z3MuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlfQ1RYX3JnZXRfY2hhaW4oKSAocmVuYW1lZCB0byBYNTA5X0NUWF9nZXQxX2NoYWluCiAgICAgaW4gdGhlIDAuOS41IHJlbGVhc2UpLCB0aGlzIHJldHVybnMgdGhlIGNoYWluCiAgICAgZnJvbSBhbiBYNTA5X0NUWCBzdHJ1Y3R1cmUgd2l0aCBhIGR1cCBvZiB0aGUgc3RhY2sgYW5kIGFsbAogICAgIHRoZSBYNTA5IHJlZmVyZW5jZSBjb3VudHMgdXBwZWQ6IHNvIHRoZSBzdGFjayB3aWxsIGV4aXN0CiAgICAgYWZ0ZXIgWDUwOV9DVFhfY2xlYW51cCgpIGhhcyBiZWVuIGNhbGxlZC4gTW9kaWZ5IHBrY3MxMi5jCiAgICAgdG8gdXNlIHRoaXMuCgogICAgIEFsc28gbWFrZSBTU0xfU0VTU0lPTl9wcmludCgpIHByaW50IG91dCB0aGUgdmVyaWZ5IHJldHVybgogICAgIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG1hbnBhZ2UgZm9yIHRoZSBwa2NzMTIgY29tbWFuZC4gQWxzbyBjaGFuZ2UgdGhlIGRlZmF1bHQKICAgICBiZWhhdmlvdXIgc28gTUFDIGl0ZXJhdGlvbiBjb3VudHMgYXJlIHVzZWQgdW5sZXNzIHRoZSBuZXcKICAgICAtbm9tYWNpdGVyIG9wdGlvbiBpcyB1c2VkLiBUaGlzIGltcHJvdmVzIGZpbGUgc2VjdXJpdHkgYW5kCiAgICAgb25seSBvbGRlciB2ZXJzaW9ucyBvZiBNU0lFICg0LjAgZm9yIGV4YW1wbGUpIG5lZWQgaXQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSG9ub3IgdGhlIG5vLXh4eCBDb25maWd1cmUgb3B0aW9ucyB3aGVuIGNyZWF0aW5nIC5ERUYgZmlsZXMuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCBQS0NTIzEwIGF0dHJpYnV0ZXMgdG8gZmllbGQgdGFibGU6IGNoYWxsZW5nZVBhc3N3b3JkLCAKICAgICB1bnN0cnVjdHVyZWROYW1lIGFuZCB1bnN0cnVjdHVyZWRBZGRyZXNzLiBUaGVzZSBhcmUgdGFrZW4gZnJvbQogICAgIGRyYWZ0IFBLQ1MjOSB2Mi4wIGJ1dCBhcmUgY29tcGF0aWJsZSB3aXRoIHYxLjIgcHJvdmlkZWQgbm8gCiAgICAgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXJzIGFyZSB1c2VkLgoKICAgICBNb3JlIGNoYW5nZXMgdG8gWDUwOV9BVFRSSUJVVEUgY29kZTogYWxsb3cgdGhlIHNldHRpbmcgb2YgdHlwZXMKICAgICBiYXNlZCBvbiBzdHJpbmdzLiBSZW1vdmUgdGhlICdsb2MnIHBhcmFtZXRlciB3aGVuIGFkZGluZwogICAgIGF0dHJpYnV0ZXMgYmVjYXVzZSB0aGVzZSB3aWxsIGJlIGEgU0VUIE9GIGVuY29kaW5nIHdoaWNoIGlzIHNvcnRlZAogICAgIGluIEFTTjEgb3JkZXIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBjaGFuZ2VzIHRvIHRoZSAncmVxJyB1dGlsaXR5IHRvIGFsbG93IHJlcXVlc3QgZ2VuZXJhdGlvbgogICAgIGF1dG9tYXRpb24uIFRoaXMgd2lsbCBhbGxvdyBhbiBhcHBsaWNhdGlvbiB0byBqdXN0IGdlbmVyYXRlIGEgdGVtcGxhdGUKICAgICBmaWxlIGNvbnRhaW5pbmcgYWxsIHRoZSBmaWVsZCB2YWx1ZXMgYW5kIGhhdmUgcmVxIGNvbnN0cnVjdCB0aGUKICAgICByZXF1ZXN0LgoKICAgICBJbml0aWFsIHN1cHBvcnQgZm9yIFg1MDlfQVRUUklCVVRFIGhhbmRsaW5nLiBTdGFja3Mgb2YgdGhlc2UgYXJlCiAgICAgdXNlZCBhbGwgb3ZlciB0aGUgcGxhY2UgaW5jbHVkaW5nIGNlcnRpZmljYXRlIHJlcXVlc3RzIGFuZCBQS0NTIzcKICAgICBzdHJ1Y3R1cmVzLiBUaGV5IGFyZSBjdXJyZW50bHkgaGFuZGxlZCBtYW51YWxseSB3aGVyZSBuZWNlc3Nhcnkgd2l0aAogICAgIHNvbWUgcHJpbWl0aXZlIHdyYXBwZXJzIGZvciBQS0NTIzcuIFRoZSBuZXcgZnVuY3Rpb25zIGJlaGF2ZSBpbiBhCiAgICAgbWFubmVyIGFuYWxvZ291cyB0byB0aGUgWDUwOSBleHRlbnNpb24gZnVuY3Rpb25zOiB0aGV5IGFsbG93CiAgICAgYXR0cmlidXRlcyB0byBiZSBsb29rZWQgdXAgYnkgTklEIGFuZCBhZGRlZC4KCiAgICAgTGF0ZXIgc29tZXRoaW5nIHNpbWlsYXIgdG8gdGhlIFg1MDlWMyBjb2RlIHdvdWxkIGJlIGRlc2lyYWJsZSB0bwogICAgIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHRoZSBlbmNvZGluZywgZGVjb2RpbmcgYW5kIHByaW50aW5nIG9mIHRoZQogICAgIG1vcmUgY29tcGxleCB0eXBlcy4gVGhlIHN0cmluZyB0eXBlcyBsaWtlIGNoYWxsZW5nZVBhc3N3b3JkIGNhbgogICAgIGJlIGhhbmRsZWQgYnkgdGhlIHN0cmluZyB0YWJsZSBmdW5jdGlvbnMuCgogICAgIEFsc28gbW9kaWZpZWQgdGhlIG11bHRpIGJ5dGUgc3RyaW5nIHRhYmxlIGhhbmRsaW5nLiBOb3cgdGhlcmUgaXMKICAgICBhICdnbG9iYWwgbWFzaycgd2hpY2ggbWFza3Mgb3V0IGNlcnRhaW4gdHlwZXMuIFRoZSB0YWJsZSBpdHNlbGYKICAgICBjYW4gdXNlIHRoZSBmbGFnIFNUQUJMRV9OT19NQVNLIHRvIGlnbm9yZSB0aGUgbWFzayBzZXR0aW5nOiB0aGlzCiAgICAgaXMgdXNlZnVsIHdoZW4gZm9yIGV4YW1wbGUgdGhlcmUgaXMgb25seSBvbmUgcGVybWlzc2libGUgdHlwZQogICAgIChhcyBpbiBjb3VudHJ5TmFtZSkgYW5kIHVzaW5nIHRoZSBtYXNrIG1pZ2h0IHJlc3VsdCBpbiBubyB2YWxpZAogICAgIHR5cGVzIGF0IGFsbC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDbGVhbiB1cCAnRmluaXNoZWQnIGhhbmRsaW5nLCBhbmQgYWRkIGZ1bmN0aW9ucyBTU0xfZ2V0X2ZpbmlzaGVkIGFuZAogICAgIFNTTF9nZXRfcGVlcl9maW5pc2hlZCB0byBhbGxvdyBhcHBsaWNhdGlvbnMgdG8gb2J0YWluIHRoZSBsYXRlc3QKICAgICBGaW5pc2hlZCBtZXNzYWdlcyBzZW50IHRvIHRoZSBwZWVyIG9yIGV4cGVjdGVkIGZyb20gdGhlIHBlZXIsCiAgICAgcmVzcGVjdGl2ZWx5LiAgKFNTTF9nZXRfcGVlcl9maW5pc2hlZCBpcyB1c3VhbGx5IHRoZSBGaW5pc2hlZCBtZXNzYWdlCiAgICAgYWN0dWFsbHkgcmVjZWl2ZWQgZnJvbSB0aGUgcGVlciwgb3RoZXJ3aXNlIHRoZSBwcm90b2NvbCB3aWxsIGJlIGFib3J0ZWQuKQoKICAgICBBcyB0aGUgRmluaXNoZWQgbWVzc2FnZSBhcmUgbWVzc2FnZSBkaWdlc3RzIG9mIHRoZSBjb21wbGV0ZSBoYW5kc2hha2UKICAgICAod2l0aCBhIHRvdGFsIG9mIDE5MiBiaXRzIGZvciBUTFMgMS4wIGFuZCBtb3JlIGZvciBTU0wgMy4wKSwgdGhleSBjYW4KICAgICBiZSB1c2VkIGZvciBleHRlcm5hbCBhdXRoZW50aWNhdGlvbiBwcm9jZWR1cmVzIHdoZW4gdGhlIGF1dGhlbnRpY2F0aW9uCiAgICAgcHJvdmlkZWQgYnkgU1NML1RMUyBpcyBub3QgZGVzaXJlZCBvciBpcyBub3QgZW5vdWdoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEVuaGFuY2VkIHN1cHBvcnQgZm9yIEFscGhhIExpbnV4IGlzIGFkZGVkLiBOb3cgLi9jb25maWcgY2hlY2tzIGlmCiAgICAgdGhlIGhvc3Qgc3VwcG9ydHMgQldYIGV4dGVuc2lvbiBhbmQgaWYgQ29tcGFxIEMgaXMgcHJlc2VudCBvbiB0aGUKICAgICAkUEFUSC4gSnVzdCBleHBsb2l0aW5nIG9mIHRoZSBCV1ggZXh0ZW5zaW9uIHJlc3VsdHMgaW4gMjAtMzAlCiAgICAgcGVyZm9ybWFuY2Uga2ljayBmb3Igc29tZSBhbGdvcml0aG1zLCBlLmcuIERFUyBhbmQgUkM0IHRvIG1lbnRpb24KICAgICBhIGNvdXBsZS4gQ29tcGFxIEMgaW4gdHVybiBnZW5lcmF0ZXMgfjIwJSBmYXN0ZXIgY29kZSBmb3IgTUQ1IGFuZAogICAgIFNIQTEuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFkZCBzdXBwb3J0IGZvciBNUyAiZmFzdCBTR0MiLiBUaGlzIGlzIGFyZ3VhYmx5IGEgdmlvbGF0aW9uIG9mIHRoZQogICAgIFNTTDMvVExTIHByb3RvY29sLiBOZXRzY2FwZSBTR0MgZG9lcyB0d28gaGFuZHNoYWtlczogdGhlIGZpcnN0IHdpdGgKICAgICB3ZWFrIGNyeXB0byBhbmQgYWZ0ZXIgY2hlY2tpbmcgdGhlIGNlcnRpZmljYXRlIGlzIFNHQyBhIHNlY29uZCBvbmUKICAgICB3aXRoIHN0cm9uZyBjcnlwdG8uIE1TIFNHQyBzdG9wcyB0aGUgZmlyc3QgaGFuZHNoYWtlIGFmdGVyIHJlY2VpdmluZwogICAgIHRoZSBzZXJ2ZXIgY2VydGlmaWNhdGUgbWVzc2FnZSBhbmQgc2VuZHMgYSBzZWNvbmQgY2xpZW50IGhlbGxvLiBTaW5jZQogICAgIGEgc2VydmVyIHdpbGwgdHlwaWNhbGx5IGRvIGFsbCB0aGUgdGltZSBjb25zdW1pbmcgb3BlcmF0aW9ucyBiZWZvcmUKICAgICBleHBlY3RpbmcgYW55IGZ1cnRoZXIgbWVzc2FnZXMgZnJvbSB0aGUgY2xpZW50IChzZXJ2ZXIga2V5IGV4Y2hhbmdlCiAgICAgaXMgdGhlIG1vc3QgZXhwZW5zaXZlKSB0aGVyZSBpcyBsaXR0bGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28uCgogICAgIFRvIGdldCBPcGVuU1NMIHRvIHN1cHBvcnQgTVMgU0dDIHdlIGhhdmUgdG8gcGVybWl0IGEgc2Vjb25kIGNsaWVudAogICAgIGhlbGxvIG1lc3NhZ2UgYWZ0ZXIgd2UgaGF2ZSBzZW50IHNlcnZlciBkb25lLiBJbiBhZGRpdGlvbiB3ZSBoYXZlIHRvCiAgICAgcmVzZXQgdGhlIE1BQyBpZiB3ZSBkbyBnZXQgdGhpcyBzZWNvbmQgY2xpZW50IGhlbGxvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGZ1bmN0aW9uICdkMmlfQXV0b1ByaXZhdGVLZXkoKScgdGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZGVjaWRlCiAgICAgaWYgYSBERVIgZW5jb2RlZCBwcml2YXRlIGtleSBpcyBSU0Egb3IgRFNBIHRyYWRpdGlvbmFsIGZvcm1hdC4gQ2hhbmdlZAogICAgIGQyaV9Qcml2YXRlS2V5X2JpbygpIHRvIHVzZSBpdC4gVGhpcyBpcyBvbmx5IG5lZWRlZCBmb3IgdGhlICJ0cmFkaXRpb25hbCIKICAgICBmb3JtYXQgREVSIGVuY29kZWQgcHJpdmF0ZSBrZXkuIE5ld2VyIGNvZGUgc2hvdWxkIHVzZSBQS0NTIzggZm9ybWF0IHdoaWNoCiAgICAgaGFzIHRoZSBrZXkgdHlwZSBlbmNvZGVkIGluIHRoZSBBU04xIHN0cnVjdHVyZS4gQWRkZWQgREVSIHByaXZhdGUga2V5CiAgICAgc3VwcG9ydCB0byBwa2NzOCBhcHBsaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTU0wgMy9UTFMgMSBzZXJ2ZXJzIG5vdyBkb24ndCByZXF1ZXN0IGNlcnRpZmljYXRlcyB3aGVuIGFuIGFub255bW91cwogICAgIGNpcGhlcnN1aXRlcyBoYXMgYmVlbiBzZWxlY3RlZCAoYXMgcmVxdWlyZWQgYnkgdGhlIFNTTCAzL1RMUyAxCiAgICAgc3BlY2lmaWNhdGlvbnMpLiAgRXhjZXB0aW9uOiBXaGVuIFNTTF9WRVJJRllfRkFJTF9JRl9OT19QRUVSX0NFUlQKICAgICBpcyBzZXQsIHdlIGludGVycHJldCB0aGlzIGFzIGEgcmVxdWVzdCB0byB2aW9sYXRlIHRoZSBzcGVjaWZpY2F0aW9uCiAgICAgKHRoZSB3b3JzdCB0aGF0IGNhbiBoYXBwZW4gaXMgYSBoYW5kc2hha2UgZmFpbHVyZSwgYW5kICdjb3JyZWN0JwogICAgIGJlaGF2aW91ciB3b3VsZCByZXN1bHQgaW4gYSBoYW5kc2hha2UgZmFpbHVyZSBhbnl3YXkpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEluIFNTTF9DVFhfYWRkX3Nlc3Npb24sIHRha2UgaW50byBhY2NvdW50IHRoYXQgdGhlcmUgbWlnaHQgYmUgbXVsdGlwbGUKICAgICBTU0xfU0VTU0lPTiBzdHJ1Y3R1cmVzIHdpdGggdGhlIHNhbWUgc2Vzc2lvbiBJRCAoZS5nLiB3aGVuIHR3byB0aHJlYWRzCiAgICAgY29uY3VycmVudGx5IG9idGFpbiB0aGVtIGZyb20gYW4gZXh0ZXJuYWwgY2FjaGUpLgogICAgIFRoZSBpbnRlcm5hbCBjYWNoZSBjYW4gaGFuZGxlIG9ubHkgb25lIFNTTF9TRVNTSU9OIHdpdGggYSBnaXZlbiBJRCwKICAgICBzbyBpZiB0aGVyZSdzIGEgY29uZmxpY3QsIHdlIG5vdyB0aHJvdyBvdXQgdGhlIG9sZCBvbmUgdG8gYWNoaWV2ZQogICAgIGNvbnNpc3RlbmN5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBPSURzIGZvciBpZGVhIGFuZCBibG93ZmlzaCBpbiBDQkMgbW9kZS4gVGhpcyB3aWxsIGFsbG93IGJvdGgKICAgICB0byBiZSB1c2VkIGluIFBLQ1MjNSB2Mi4wIGFuZCBTL01JTUUuICBBbHNvIGFkZCBjaGVja2luZyB0bwogICAgIHNvbWUgcm91dGluZXMgdGhhdCB1c2UgY2lwaGVyIE9JRHM6IHNvbWUgY2lwaGVycyBkbyBub3QgaGF2ZSBPSURzCiAgICAgZGVmaW5lZCBhbmQgc28gdGhleSBjYW5ub3QgYmUgdXNlZCBmb3IgUy9NSU1FIGFuZCBQS0NTIzUgdjIuMCBmb3IKICAgICBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNpbXBsaWZ5IHRoZSB0cnVzdCBzZXR0aW5nIHN0cnVjdHVyZSBhbmQgY29kZS4gTm93IHdlIGp1c3QgaGF2ZQogICAgIHR3byBzZXF1ZW5jZXMgb2YgT0lEcyBmb3IgdHJ1c3RlZCBhbmQgcmVqZWN0ZWQgc2V0dGluZ3MuIFRoZXNlIHdpbGwKICAgICB0eXBpY2FsbHkgaGF2ZSB2YWx1ZXMgdGhlIHNhbWUgYXMgdGhlIGV4dGVuZGVkIGtleSB1c2FnZSBleHRlbnNpb24KICAgICBhbmQgYW55IGFwcGxpY2F0aW9uIHNwZWNpZmljIHB1cnBvc2VzLgoKICAgICBUaGUgdHJ1c3QgY2hlY2tpbmcgY29kZSBub3cgaGFzIGEgZGVmYXVsdCBiZWhhdmlvdXI6IGl0IHdpbGwganVzdAogICAgIGNoZWNrIGZvciBhbiBvYmplY3Qgd2l0aCB0aGUgc2FtZSBOSUQgYXMgdGhlIHBhc3NlZCBpZC4gRnVuY3Rpb25zIGNhbgogICAgIGJlIHByb3ZpZGVkIHRvIG92ZXJyaWRlIGVpdGhlciB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgb3IgdGhlIGJlaGF2aW91cgogICAgIGZvciBhIGdpdmVuIGlkLiBTU0wgY2xpZW50LCBzZXJ2ZXIgYW5kIGVtYWlsIGFscmVhZHkgaGF2ZSBmdW5jdGlvbnMKICAgICBpbiBwbGFjZSBmb3IgY29tcGF0aWJpbGl0eTogdGhleSBjaGVjayB0aGUgTklEIGFuZCBhbHNvIHJldHVybiAidHJ1c3RlZCIKICAgICBpZiB0aGUgY2VydGlmaWNhdGUgaXMgc2VsZiBzaWduZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGQyaSxpMmQgYmlvL2ZwIGZ1bmN0aW9ucyBmb3IgUHJpdmF0ZUtleTogdGhlc2UgY29udmVydCB0aGUKICAgICB0cmFkaXRpb25hbCBmb3JtYXQgaW50byBhbiBFVlBfUEtFWSBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgcGFzc3dvcmQgY2FsbGJhY2sgZnVuY3Rpb24gUEVNX2NiKCkgd2hpY2ggZWl0aGVyIHByb21wdHMgZm9yCiAgICAgYSBwYXNzd29yZCBpZiB1c3JfZGF0YSBpcyBOVUxMIG9yIG90aGVyd2lzZSBhc3N1bWVzIGl0IGlzIGEgbnVsbAogICAgIHRlcm1pbmF0ZWQgcGFzc3dvcmQuIEFsbG93IHBhc3N3b3JkcyB0byBiZSBwYXNzZWQgb24gY29tbWFuZCBsaW5lCiAgICAgZW52aXJvbm1lbnQgb3IgY29uZmlnIGZpbGVzIGluIGEgZmV3IG1vcmUgdXRpbGl0aWVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGJ1bmNoIG9mIERFUiBhbmQgUEVNIGZ1bmN0aW9ucyB0byBoYW5kbGUgUEtDUyM4IGZvcm1hdCBwcml2YXRlCiAgICAga2V5cy4gQWRkIHNvbWUgc2hvcnQgbmFtZXMgZm9yIFBLQ1MjOCBQQkUgYWxnb3JpdGhtcyBhbmQgYWxsb3cgdGhlbQogICAgIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lIGZvciB0aGUgcGtjczggYW5kIHBrY3MxMiB1dGlsaXRpZXMuCiAgICAgVXBkYXRlIGRvY3VtZW50YXRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgQVNOMSAiTlVMTCIgdHlwZS4gVGhpcyBjb3VsZCBiZSBoYW5kbGVkIGJlZm9yZSBieSB1c2luZwogICAgIEFTTjFfVFlQRSBidXQgdGhlcmUgd2Fzbid0IGFueSBmdW5jdGlvbiB0aGF0IHdvdWxkIHRyeSB0byByZWFkIGEgTlVMTAogICAgIGFuZCBwcm9kdWNlIGFuIGVycm9yIGlmIGl0IGNvdWxkbid0LiBGb3IgY29tcGF0aWJpbGl0eSB3ZSBhbHNvIGhhdmUKICAgICBBU04xX05VTExfbmV3KCkgYW5kIEFTTjFfTlVMTF9mcmVlKCkgZnVuY3Rpb25zIGJ1dCB0aGVzZSBhcmUgZmFrZWQgYW5kCiAgICAgZG9uJ3QgYWxsb2NhdGUgYW55dGhpbmcgYmVjYXVzZSB0aGV5IGRvbid0IG5lZWQgdG8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBNYWNPUyBpcyBub3cgcHJvdmlkZWQuIEV4YW1pbmUgSU5TVEFMTC5NYWNPUwogICAgIGZvciBkZXRhaWxzLgogICAgIFtBbmR5IFBvbHlha292LCBSb3kgV29vZHMgPHJveUBjZW50aWNzeXN0ZW1zLmNhPl0KCiAgKikgUmVidWlsZCBvZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gcm91dGluZXMgdXNlZCBieSBPcGVuU1NMIGNvZGUgYW5kCiAgICAgcG9zc2libHkgb3RoZXJzIGFzIHdlbGwuICBUaGUgcHVycG9zZSBpcyB0byBtYWtlIGFuIGludGVyZmFjZSB0aGF0CiAgICAgcHJvdmlkZSBob29rcyBzbyBhbnlvbmUgY2FuIGJ1aWxkIGEgc2VwYXJhdGUgc2V0IG9mIGFsbG9jYXRpb24gYW5kCiAgICAgZGVhbGxvY2F0aW9uIHJvdXRpbmVzIHRvIGJlIHVzZWQgYnkgT3BlblNTTCwgZm9yIGV4YW1wbGUgbWVtb3J5CiAgICAgcG9vbCBpbXBsZW1lbnRhdGlvbnMsIG9yIHNvbWV0aGluZyBlbHNlLCB3aGljaCB3YXMgcHJldmlvdXNseSBoYXJkCiAgICAgc2luY2UgTWFsbG9jKCksIFJlYWxsb2MoKSBhbmQgRnJlZSgpIHdlcmUgZGVmaW5lZCBhcyBtYWNyb3MgaGF2aW5nCiAgICAgdGhlIHZhbHVlcyBtYWxsb2MsIHJlYWxsb2MgYW5kIGZyZWUsIHJlc3BlY3RpdmVseSAoZXhjZXB0IGZvciBXaW4zMgogICAgIGNvbXBpbGF0aW9ucykuICBUaGUgc2FtZSBpcyBwcm92aWRlZCBmb3IgbWVtb3J5IGRlYnVnZ2luZyBjb2RlLgogICAgIE9wZW5TU0wgYWxyZWFkeSBjb21lcyB3aXRoIGZ1bmN0aW9uYWxpdHkgdG8gZmluZCBtZW1vcnkgbGVha3MsIGJ1dAogICAgIHRoaXMgZ2l2ZXMgcGVvcGxlIGEgY2hhbmNlIHRvIGRlYnVnIG90aGVyIG1lbW9yeSBwcm9ibGVtcy4KCiAgICAgV2l0aCB0aGVzZSBjaGFuZ2VzLCBhIG5ldyBzZXQgb2YgZnVuY3Rpb25zIGFuZCBtYWNyb3MgaGF2ZSBhcHBlYXJlZDoKCiAgICAgICBDUllQVE9fc2V0X21lbV9kZWJ1Z19mdW5jdGlvbnMoKQkgICAgICAgIFtGXQogICAgICAgQ1JZUFRPX2dldF9tZW1fZGVidWdfZnVuY3Rpb25zKCkgICAgICAgICBbRl0KICAgICAgIENSWVBUT19kYmdfc2V0X29wdGlvbnMoKQkgICAgICAgICAgICAgICAgW0ZdCiAgICAgICBDUllQVE9fZGJnX2dldF9vcHRpb25zKCkgICAgICAgICAgICAgICAgIFtGXQogICAgICAgQ1JZUFRPX21hbGxvY19kZWJ1Z19pbml0KCkgICAgICAgICAgICAgICBbTV0KCiAgICAgVGhlIG1lbW9yeSBkZWJ1ZyBmdW5jdGlvbnMgYXJlIE5VTEwgYnkgZGVmYXVsdCwgdW5sZXNzIHRoZSBsaWJyYXJ5CiAgICAgaXMgY29tcGlsZWQgd2l0aCBDUllQVE9fTURFQlVHIG9yIGZyaWVuZHMgaXMgZGVmaW5lZC4gIElmIHNvbWVvbmUKICAgICB3YW50cyB0byBkZWJ1ZyBtZW1vcnkgYW55d2F5LCBDUllQVE9fbWFsbG9jX2RlYnVnX2luaXQoKSAod2hpY2gKICAgICBnaXZlcyB0aGUgc3RhbmRhcmQgZGVidWdnaW5nIGZ1bmN0aW9ucyB0aGF0IGNvbWUgd2l0aCBPcGVuU1NMKSBvcgogICAgIENSWVBUT19zZXRfbWVtX2RlYnVnX2Z1bmN0aW9ucygpICh0ZWxscyBPcGVuU1NMIHRvIHVzZSBmdW5jdGlvbnMKICAgICBwcm92aWRlZCBieSB0aGUgbGlicmFyeSB1c2VyKSBtdXN0IGJlIHVzZWQuICBXaGVuIHRoZSBzdGFuZGFyZAogICAgIGRlYnVnZ2luZyBmdW5jdGlvbnMgYXJlIHVzZWQsIENSWVBUT19kYmdfc2V0X29wdGlvbnMgY2FuIGJlIHVzZWQgdG8KICAgICByZXF1ZXN0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb246CiAgICAgQ1JZUFRPX2RiZ19zZXRfb3B0aW9ucyhWX0NZUlBUT19NREVCVUdfeHh4KSBjb3JyZXNwb25kcyB0byBzZXR0aW5nCiAgICAgdGhlIENSWVBUT19NREVCVUdfeHh4IG1hY3JvIHdoZW4gY29tcGlsaW5nIHRoZSBsaWJyYXJ5LiAgIAoKICAgICBBbHNvLCB0aGluZ3MgbGlrZSBDUllQVE9fc2V0X21lbV9mdW5jdGlvbnMgd2lsbCBhbHdheXMgZ2l2ZSB0aGUKICAgICBleHBlY3RlZCByZXN1bHQgKHRoZSBuZXcgc2V0IG9mIGZ1bmN0aW9ucyBpcyB1c2VkIGZvciBhbGxvY2F0aW9uCiAgICAgYW5kIGRlYWxsb2NhdGlvbikgYXQgYWxsIHRpbWVzLCByZWdhcmRsZXNzIG9mIHBsYXRmb3JtIGFuZCBjb21waWxlcgogICAgIG9wdGlvbnMuCgogICAgIFRvIGZpbmlzaCBpdCB1cCwgc29tZSBmdW5jdGlvbnMgdGhhdCB3ZXJlIG5ldmVyIHVzZSBpbiBhbnkgb3RoZXIKICAgICB3YXkgdGhhbiB0aHJvdWdoIG1hY3JvcyBoYXZlIGEgbmV3IEFQSSBhbmQgbmV3IHNlbWFudGljOgoKICAgICAgIENSWVBUT19kYmdfbWFsbG9jKCkKICAgICAgIENSWVBUT19kYmdfcmVhbGxvYygpCiAgICAgICBDUllQVE9fZGJnX2ZyZWUoKQoKICAgICBBbGwgbWFjcm9zIG9mIHZhbHVlIGhhdmUgcmV0YWluZWQgdGhlaXIgb2xkIHN5bnRheC4KICAgICBbUmljaGFyZCBMZXZpdHRlIGFuZCBCb2RvIE1vZWxsZXJdCgogICopIFNvbWUgUy9NSU1FIGZpeGVzLiBUaGUgT0lEIGZvciBTTUlNRUNhcGFiaWxpdGllcyB3YXMgd3JvbmcsIHRoZQogICAgIG9yZGVyaW5nIG9mIFNNSU1FQ2FwYWJpbGl0aWVzIHdhc24ndCBpbiAic3RyZW5ndGggb3JkZXIiIGFuZCB0aGVyZQogICAgIHdhcyBhIG1pc3NpbmcgTlVMTCBpbiB0aGUgQWxnb3JpdGhtSWRlbnRpZmllciBmb3IgdGhlIFNIQTEgc2lnbmF0dXJlCiAgICAgYWxnb3JpdGhtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNvbWUgQVNOMSB0eXBlcyB3aXRoIGlsbGVnYWwgemVybyBsZW5ndGggZW5jb2RpbmcgKElOVEVHRVIsCiAgICAgRU5VTUVSQVRFRCBhbmQgT0JKRUNUIElERU5USUZJRVIpIGNob2tlZCB0aGUgQVNOMSByb3V0aW5lcy4KICAgICBbRnJhbnMgSGV5bWFucyA8ZmhleW1hbnNAaXNhc2VydmVyLmJlPiwgbW9kaWZpZWQgYnkgU3RldmUgSGVuc29uXQoKICAqKSBNZXJnZSBpbiBteSBTL01JTUUgbGlicmFyeSBmb3IgT3BlblNTTC4gVGhpcyBwcm92aWRlcyBhIHNpbXBsZQogICAgIFMvTUlNRSBBUEkgb24gdG9wIG9mIHRoZSBQS0NTIzcgY29kZSwgYSBNSU1FIHBhcnNlciAod2l0aCBlbm91Z2gKICAgICBmdW5jdGlvbmFsaXR5IHRvIGhhbmRsZSBtdWx0aXBhcnQvc2lnbmVkIHByb3Blcmx5KSBhbmQgYSB1dGlsaXR5CiAgICAgY2FsbGVkICdzbWltZScgdG8gY2FsbCBhbGwgdGhpcyBzdHVmZi4gVGhpcyBpcyBiYXNlZCBvbiBjb2RlIEkKICAgICBvcmlnaW5hbGx5IHdyb3RlIGZvciBDZWxvIHdobyBoYXZlIGtpbmRseSBhbGxvd2VkIGl0IHRvIGJlCiAgICAgaW5jbHVkZWQgaW4gT3BlblNTTC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgdmFyaWFudHMgZGVzX3NldF9rZXlfY2hlY2tlZCBhbmQgZGVzX3NldF9rZXlfdW5jaGVja2VkIG9mCiAgICAgZGVzX3NldF9rZXkgKGFrYSBkZXNfa2V5X3NjaGVkKS4gIEdsb2JhbCB2YXJpYWJsZSBkZXNfY2hlY2tfa2V5CiAgICAgZGVjaWRlcyB3aGljaCBvZiB0aGVzZSBpcyBjYWxsZWQgYnkgZGVzX3NldF9rZXk7IHRoaXMgd2F5CiAgICAgZGVzX2NoZWNrX2tleSBiZWhhdmVzIGFzIGl0IGFsd2F5cyBkaWQsIGJ1dCBhcHBsaWNhdGlvbnMgYW5kCiAgICAgdGhlIGxpYnJhcnkgaXRzZWxmLCB3aGljaCB3YXMgYnVnZ3kgZm9yIGRlc19jaGVja19rZXkgPT0gMSwKICAgICBoYXZlIGEgY2xlYW5lciB3YXkgdG8gcGljayB0aGUgdmVyc2lvbiB0aGV5IG5lZWQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFBLQ1MxMl9uZXdwYXNzKCkgd2hpY2ggY2hhbmdlcyB0aGUgcGFzc3dvcmQgb2YgYQogICAgIFBLQ1MxMiBzdHJ1Y3R1cmUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IFg1MDlfVFJVU1QgYW5kIFg1MDlfUFVSUE9TRSBzbyBpdCBhbHNvIHVzZXMgYSBzdGF0aWMgYW5kCiAgICAgZHluYW1pYyBtaXguIEluIGJvdGggY2FzZXMgdGhlIGlkcyBjYW4gYmUgdXNlZCBhcyBhbiBpbmRleCBpbnRvIHRoZQogICAgIHRhYmxlLiBBbHNvIG1vZGlmaWVkIHRoZSBYNTA5X1RSVVNUX2FkZCgpIGFuZCBYNTA5X1BVUlBPU0VfYWRkKCkKICAgICBmdW5jdGlvbnMgc28gdGhleSBhY2NlcHQgYSBsaXN0IG9mIHRoZSBmaWVsZCB2YWx1ZXMgYW5kIHRoZQogICAgIGFwcGxpY2F0aW9uIGRvZXNuJ3QgbmVlZCB0byBkaXJlY3RseSBtYW5pcHVsYXRlIHRoZSBYNTA5X1RSVVNUCiAgICAgc3RydWN0dXJlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vZGlmeSB0aGUgQVNOMV9TVFJJTkdfVEFCTEUgc3R1ZmYgc28gaXQgYWxzbyB1c2VzIGJzZWFyY2ggYW5kIGRvZXNuJ3QKICAgICBuZWVkIGluaXRpYWxpc2luZy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlIHdheSB0aGUgVjMgZXh0ZW5zaW9uIGNvZGUgbG9va3MgdXAgZXh0ZW5zaW9ucy4gVGhpcyBub3cKICAgICB3b3JrcyBpbiBhIHNpbWlsYXIgd2F5IHRvIHRoZSBvYmplY3QgY29kZTogd2UgaGF2ZSBzb21lICJzdGFuZGFyZCIKICAgICBleHRlbnNpb25zIGluIGEgc3RhdGljIHRhYmxlIHdoaWNoIGlzIHNlYXJjaGVkIHdpdGggT0JKX2JzZWFyY2goKQogICAgIGFuZCB0aGUgYXBwbGljYXRpb24gY2FuIGFkZCBkeW5hbWljIG9uZXMgaWYgbmVlZGVkLiBUaGUgZmlsZQogICAgIGNyeXB0by94NTA5djMvZXh0X2RhdC5oIG5vdyBoYXMgdGhlIGluZm86IHRoaXMgZmlsZSBuZWVkcyB0byBiZQogICAgIHVwZGF0ZWQgd2hlbmV2ZXIgYSBuZXcgZXh0ZW5zaW9uIGlzIGFkZGVkIHRvIHRoZSBjb3JlIGNvZGUgYW5kIGtlcHQKICAgICBpbiBleHRfbmlkIG9yZGVyLiBUaGVyZSBpcyBhIHNpbXBsZSBwcm9ncmFtICd0YWJ0ZXN0LmMnIHdoaWNoIGNoZWNrcwogICAgIHRoaXMuIE5ldyBleHRlbnNpb25zIGFyZSBub3QgYWRkZWQgdG9vIG9mdGVuIHNvIHRoaXMgZmlsZSBjYW4gcmVhZGlseQogICAgIGJlIG1haW50YWluZWQgbWFudWFsbHkuCgogICAgIFRoZXJlIGFyZSB0d28gYmlnIGFkdmFudGFnZXMgaW4gZG9pbmcgdGhpbmdzIHRoaXMgd2F5LiBUaGUgZXh0ZW5zaW9ucwogICAgIGNhbiBiZSBsb29rZWQgdXAgaW1tZWRpYXRlbHkgYW5kIG5vIGxvbmdlciBuZWVkIHRvIGJlICJhZGRlZCIgdXNpbmcKICAgICBYNTA5VjNfYWRkX3N0YW5kYXJkX2V4dGVuc2lvbnMoKTogdGhpcyBmdW5jdGlvbiBub3cgZG9lcyBub3RoaW5nLgogICAgIFtTaWRlIG5vdGU6IEkgZ2V0ICpsb3RzKiBvZiBlbWFpbCBzYXlpbmcgdGhlIGV4dGVuc2lvbiBjb2RlIGRvZXNuJ3QKICAgICAgd29yayBiZWNhdXNlIHBlb3BsZSBmb3JnZXQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uXQogICAgIEFsc28gbm8gZHluYW1pYyBhbGxvY2F0aW9uIGlzIGRvbmUgdW5sZXNzIG5ldyBleHRlbnNpb25zIGFyZSBhZGRlZDoKICAgICBzbyBpZiB3ZSBkb24ndCBhZGQgY3VzdG9tIGV4dGVuc2lvbnMgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsCiAgICAgWDUwOVYzX0VYVF9jbGVhbnVwKCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGVuYyB1dGlsaXR5J3Mgc2FsdGluZyBhcyBmb2xsb3dzOiBtYWtlIHNhbHRpbmcgdGhlIGRlZmF1bHQuIEFkZCBhCiAgICAgbWFnaWMgaGVhZGVyLCBzbyB1bnNhbHRlZCBmaWxlcyBmYWlsIGdyYWNlZnVsbHkgaW5zdGVhZCBvZiBqdXN0IGRlY3J5cHRpbmcKICAgICB0byBnYXJiYWdlLiBUaGlzIGlzIGJlY2F1c2Ugbm90IHNhbHRpbmcgaXMgYSBiaWcgc2VjdXJpdHkgaG9sZSwgc28gcGVvcGxlCiAgICAgc2hvdWxkIGJlIGRpc2NvdXJhZ2VkIGZyb20gZG9pbmcgaXQuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeGVzIGFuZCBlbmhhbmNlbWVudHMgdG8gdGhlICd4NTA5JyB1dGlsaXR5LiBJdCBhbGxvd2VkIGEgbWVzc2FnZQogICAgIGRpZ2VzdCB0byBiZSBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSBidXQgaXQgb25seSB1c2VkIHRoaXMKICAgICBwYXJhbWV0ZXIgd2hlbiBzaWduaW5nIGEgY2VydGlmaWNhdGUuIE1vZGlmaWVkIHNvIGFsbCByZWxldmFudAogICAgIG9wZXJhdGlvbnMgYXJlIGFmZmVjdGVkIGJ5IHRoZSBkaWdlc3QgcGFyYW1ldGVyIGluY2x1ZGluZyB0aGUKICAgICAtZmluZ2VycHJpbnQgYW5kIC14NTA5dG9yZXEgb3B0aW9ucy4gQWxzbyAteDUwOXRvcmVxIGNob2tlZCBpZiBhCiAgICAgRFNBIGtleSB3YXMgdXNlZCBiZWNhdXNlIGl0IGRpZG4ndCBmaXggdGhlIGRpZ2VzdC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIGNlcnRpZmljYXRlIGNoYWluIHZlcmlmeSBjb2RlLiBDdXJyZW50bHkgdGVzdHMgdGhlIHVudHJ1c3RlZAogICAgIGNlcnRpZmljYXRlcyBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgdmVyaWZ5IHB1cnBvc2UgKHdoaWNoIGlzIHNldAogICAgIHdoZW4gdGhlIFg1MDlfU1RPUkVfQ1RYIHN0cnVjdHVyZSBpcyBzZXQgdXApIGFuZCBjaGVja3MgdGhlIHBhdGhsZW5ndGguCgogICAgIFRoZXJlIGlzIGEgTk9fQ0hBSU5fVkVSSUZZIGNvbXBpbGF0aW9uIG9wdGlvbiB0byBrZWVwIHRoZSBvbGQgYmVoYXZpb3VyOgogICAgIHRoaXMgaXMgYmVjYXVzZSBpdCB3aWxsIHJlamVjdCBjaGFpbnMgd2l0aCBpbnZhbGlkIGV4dGVuc2lvbnMgd2hlcmVhcwogICAgIGV2ZXJ5IHByZXZpb3VzIHZlcnNpb24gb2YgT3BlblNTTCBhbmQgU1NMZWF5IG1hZGUgbm8gY2hlY2tzIGF0IGFsbC4KCiAgICAgVHJ1c3QgY29kZTogY2hlY2tzIHRoZSByb290IENBIGZvciB0aGUgcmVsZXZhbnQgdHJ1c3Qgc2V0dGluZ3MuIFRydXN0CiAgICAgc2V0dGluZ3MgaGF2ZSBhbiBpbml0aWFsIHZhbHVlIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmVyaWZ5IHB1cnBvc2U6IGUuZy4KICAgICBpZiB0aGUgdmVyaWZ5IHB1cnBvc2UgaXMgZm9yIFNTTCBjbGllbnQgdXNlIGl0IGV4cGVjdHMgdGhlIENBIHRvIGJlCiAgICAgdHJ1c3RlZCBmb3IgU1NMIGNsaWVudCB1c2UuIEhvd2V2ZXIgdGhlIGRlZmF1bHQgdmFsdWUgY2FuIGJlIGNoYW5nZWQgdG8KICAgICBwZXJtaXQgY3VzdG9tIHRydXN0IHNldHRpbmdzOiBvbmUgZXhhbXBsZSBvZiB0aGlzIHdvdWxkIGJlIHRvIG9ubHkgdHJ1c3QKICAgICBjZXJ0aWZpY2F0ZXMgZnJvbSBhIHNwZWNpZmljICJzZWN1cmUiIHNldCBvZiBDQXMuCgogICAgIEFsc28gYWRkZWQgWDUwOV9TVE9SRV9DVFhfbmV3KCkgYW5kIFg1MDlfU1RPUkVfQ1RYX2ZyZWUoKSBmdW5jdGlvbnMKICAgICB3aGljaCBzaG91bGQgYmUgdXNlZCBmb3IgdmVyc2lvbiBwb3J0YWJpbGl0eTogZXNwZWNpYWxseSBzaW5jZSB0aGUKICAgICB2ZXJpZnkgc3RydWN0dXJlIGlzIGxpa2VseSB0byBjaGFuZ2UgbW9yZSBvZnRlbiBub3cuCgogICAgIFNTTCBpbnRlZ3JhdGlvbi4gQWRkIHB1cnBvc2UgYW5kIHRydXN0IHRvIFNTTF9DVFggYW5kIFNTTCBhbmQgZnVuY3Rpb25zCiAgICAgdG8gc2V0IHRoZW0uIElmIG5vdCBzZXQgdGhlbiBhc3N1bWUgU1NMIGNsaWVudHMgd2lsbCB2ZXJpZnkgU1NMIHNlcnZlcnMKICAgICBhbmQgdmljZSB2ZXJzYS4KCiAgICAgVHdvIG5ldyBvcHRpb25zIHRvIHRoZSB2ZXJpZnkgcHJvZ3JhbTogLXVudHJ1c3RlZCBhbGxvd3MgYSBzZXQgb2YKICAgICB1bnRydXN0ZWQgY2VydGlmaWNhdGVzIHRvIGJlIHBhc3NlZCBpbiBhbmQgLXB1cnBvc2Ugd2hpY2ggc2V0cyB0aGUKICAgICBpbnRlbmRlZCBwdXJwb3NlIG9mIHRoZSBjZXJ0aWZpY2F0ZS4gSWYgYSBwdXJwb3NlIGlzIHNldCB0aGVuIHRoZQogICAgIG5ldyBjaGFpbiB2ZXJpZnkgY29kZSBpcyB1c2VkIHRvIGNoZWNrIGV4dGVuc2lvbiBjb25zaXN0ZW5jeS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBTdXBwb3J0IGZvciB0aGUgYXV0aG9yaXR5IGluZm9ybWF0aW9uIGFjY2VzcyBleHRlbnNpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IFJTQSBhbmQgRFNBIFBFTSByZWFkIHJvdXRpbmVzIHRvIHRyYW5zcGFyZW50bHkgaGFuZGxlCiAgICAgUEtDUyM4IGZvcm1hdCBwcml2YXRlIGtleXMuIE5ldyAqX1BVQktFWV8qIGZ1bmN0aW9ucyB0aGF0IGhhbmRsZQogICAgIHB1YmxpYyBrZXlzIGluIGEgZm9ybWF0IGNvbXBhdGlibGUgd2l0aCBjZXJ0aWZpY2F0ZQogICAgIFN1YmplY3RQdWJsaWNLZXlJbmZvIHN0cnVjdHVyZXMuIFVuZm9ydHVuYXRlbHkgdGhlcmUgd2VyZSBhbHJlYWR5CiAgICAgZnVuY3Rpb25zIGNhbGxlZCAqX1B1YmxpY0tleV8qIHdoaWNoIHVzZWQgdmFyaW91cyBvZGQgZm9ybWF0cyBzbwogICAgIHRoZXNlIGFyZSByZXRhaW5lZCBmb3IgY29tcGF0aWJpbGl0eTogaG93ZXZlciB0aGUgRFNBIHZhcmlhbnRzIHdlcmUKICAgICBuZXZlciBpbiBhIHB1YmxpYyByZWxlYXNlIHNvIHRoZXkgaGF2ZSBiZWVuIGRlbGV0ZWQuIENoYW5nZWQgZHNhL3JzYQogICAgIHV0aWxpdGllcyB0byBoYW5kbGUgdGhlIG5ldyBmb3JtYXQ6IG5vdGUgbm8gcmVsZWFzZXMgZXZlciBoYW5kbGVkIHB1YmxpYwogICAgIGtleXMgc28gd2Ugc2hvdWxkIGJlIE9LLgoKICAgICBUaGUgcHJpbWFyeSBtb3RpdmF0aW9uIGZvciB0aGlzIGNoYW5nZSBpcyB0byBhdm9pZCB0aGUgc2FtZSBmaWFzY28KICAgICB0aGF0IGRvZ3MgcHJpdmF0ZSBrZXlzOiB0aGVyZSBhcmUgc2V2ZXJhbCBpbmNvbXBhdGlibGUgcHJpdmF0ZSBrZXkKICAgICBmb3JtYXRzIHNvbWUgb2Ygd2hpY2ggYXJlIHN0YW5kYXJkIGFuZCBzb21lIE9wZW5TU0wgc3BlY2lmaWMgYW5kCiAgICAgcmVxdWlyZSB2YXJpb3VzIGV2aWwgaGFja3MgdG8gYWxsb3cgcGFydGlhbCB0cmFuc3BhcmVudCBoYW5kbGluZyBhbmQKICAgICBldmVuIHRoZW4gaXQgZG9lc24ndCB3b3JrIHdpdGggREVSIGZvcm1hdHMuIEdpdmVuIHRoZSBvcHRpb24gYW55dGhpbmcKICAgICBvdGhlciB0aGFuIFBLQ1MjOCBzaG91bGQgYmUgZHVtcGVkOiBidXQgdGhlIG90aGVyIGZvcm1hdHMgaGF2ZSB0bwogICAgIHN0YXkgaW4gdGhlIG5hbWUgb2YgY29tcGF0aWJpbGl0eS4KCiAgICAgV2l0aCBwdWJsaWMga2V5cyBhbmQgdGhlIGJlbmVmaXQgb2YgaGluZHNpZ2h0IG9uZSBzdGFuZGFyZCBmb3JtYXQgCiAgICAgaXMgdXNlZCB3aGljaCB3b3JrcyB3aXRoIEVWUF9QS0VZLCBSU0Egb3IgRFNBIHN0cnVjdHVyZXM6IHRob3VnaAogICAgIGl0IGNsZWFybHkgcmV0dXJucyBhbiBlcnJvciBpZiB5b3UgdHJ5IHRvIHJlYWQgdGhlIHdyb25nIGtpbmQgb2Yga2V5LgoKICAgICBBZGRlZCBhIC1wdWJrZXkgb3B0aW9uIHRvIHRoZSAneDUwOScgdXRpbGl0eSB0byBvdXRwdXQgdGhlIHB1YmxpYyBrZXkuCiAgICAgQWxzbyByZW5hbWUgdGhlIEVWUF9QS0VZX2dldF8qKCkgdG8gRVZQX1BLRVlfcmdldF8qKCkKICAgICAocmVuYW1lZCB0byBFVlBfUEtFWV9nZXQxXyooKSBpbiB0aGUgT3BlblNTTCAwLjkuNSByZWxlYXNlKSBhbmQgYWRkCiAgICAgRVZQX1BLRVlfcnNldF8qKCkgZnVuY3Rpb25zIChyZW5hbWVkIHRvIEVWUF9QS0VZX3NldDFfKigpKQogICAgIHRoYXQgZG8gdGhlIHNhbWUgYXMgdGhlIEVWUF9QS0VZX2Fzc2lnbl8qKCkgZXhjZXB0IHRoZXkgdXAgdGhlCiAgICAgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBhZGRlZCBrZXkgKHRoZXkgZG9uJ3QgInN3YWxsb3ciIHRoZQogICAgIHN1cHBsaWVkIGtleSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZXMgdG8gY3J5cHRvL3g1MDkvYnlfZmlsZS5jIHRoZSBjb2RlIHRvIHJlYWQgaW4gY2VydGlmaWNhdGVzIGFuZAogICAgIENSTHMgd291bGQgZmFpbCBpZiB0aGUgZmlsZSBjb250YWluZWQgbm8gY2VydGlmaWNhdGVzIG9yIG5vIENSTHM6CiAgICAgYWRkZWQgYSBuZXcgZnVuY3Rpb24gdG8gcmVhZCBpbiBib3RoIHR5cGVzIGFuZCByZXR1cm4gdGhlIG51bWJlcgogICAgIHJlYWQ6IHRoaXMgbWVhbnMgdGhhdCBpZiBub25lIGFyZSByZWFkIGl0IHdpbGwgYmUgYW4gZXJyb3IuIFRoZQogICAgIERFUiB2ZXJzaW9ucyBvZiB0aGUgY2VydGlmaWNhdGUgYW5kIENSTCByZWFkZXIgd291bGQgYWx3YXlzIGZhaWwKICAgICBiZWNhdXNlIGl0IGlzbid0IHBvc3NpYmxlIHRvIG1peCBjZXJ0aWZpY2F0ZXMgYW5kIENSTHMgaW4gREVSIGZvcm1hdAogICAgIHdpdGhvdXQgY2hva2luZyBvbmUgb3IgdGhlIG90aGVyIHJvdXRpbmUuIENoYW5nZWQgdGhpcyB0byBqdXN0IHJlYWQKICAgICBhIGNlcnRpZmljYXRlOiB0aGlzIGlzIHRoZSBiZXN0IHdlIGNhbiBkby4gQWxzbyBtb2RpZmllZCB0aGUgY29kZQogICAgIGluIGFwcHMvdmVyaWZ5LmMgdG8gdGFrZSBub3RpY2Ugb2YgcmV0dXJuIGNvZGVzOiBpdCB3YXMgcHJldmlvdXNseQogICAgIGF0dGVtcHRpbmcgdG8gcmVhZCBpbiBjZXJ0aWZpY2F0ZXMgZnJvbSBOVUxMIHBvaW50ZXJzIGFuZCBpZ25vcmluZwogICAgIGFueSBlcnJvcnM6IHRoaXMgaXMgb25lIHJlYXNvbiB3aHkgdGhlIGNlcnQgYW5kIENSTCByZWFkZXIgc2VlbWVkCiAgICAgdG8gd29yay4gSXQgZG9lc24ndCBjaGVjayByZXR1cm4gY29kZXMgZnJvbSB0aGUgZGVmYXVsdCBjZXJ0aWZpY2F0ZQogICAgIHJvdXRpbmVzOiB0aGVzZSBtYXkgd2VsbCBmYWlsIGlmIHRoZSBjZXJ0aWZpY2F0ZXMgYXJlbid0IGluc3RhbGxlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb2RlIHRvIHN1cHBvcnQgb3RoZXJOYW1lIG9wdGlvbiBpbiBHZW5lcmFsTmFtZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXJzdCB1cGRhdGUgdG8gdmVyaWZ5IGNvZGUuIENoYW5nZSB0aGUgdmVyaWZ5IHV0aWxpdHkKICAgICBzbyBpdCB3YXJucyBpZiBpdCBpcyBwYXNzZWQgYSBzZWxmIHNpZ25lZCBjZXJ0aWZpY2F0ZToKICAgICBmb3IgY29uc2lzdGVuY3kgd2l0aCB0aGUgbm9ybWFsIGJlaGF2aW91ci4gWDUwOV92ZXJpZnkKICAgICBoYXMgYmVlbiBtb2RpZmllZCB0byBpdCB3aWxsIG5vdyB2ZXJpZnkgYSBzZWxmIHNpZ25lZAogICAgIGNlcnRpZmljYXRlIGlmICpleGFjdGx5KiB0aGUgc2FtZSBjZXJ0aWZpY2F0ZSBhcHBlYXJzCiAgICAgaW4gdGhlIHN0b3JlOiBpdCB3YXMgcHJldmlvdXNseSBpbXBvc3NpYmxlIHRvIHRydXN0IGEKICAgICBzaW5nbGUgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUuIFRoaXMgbWVhbnMgdGhhdDoKICAgICBvcGVuc3NsIHZlcmlmeSBzcy5wZW0KICAgICBub3cgZ2l2ZXMgYSB3YXJuaW5nIGFib3V0IGEgc2VsZiBzaWduZWQgY2VydGlmaWNhdGUgYnV0CiAgICAgb3BlbnNzbCB2ZXJpZnkgLUNBZmlsZSBzcy5wZW0gc3MucGVtCiAgICAgaXMgT0suCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRm9yIHNlcnZlcnMsIHN0b3JlIHZlcmlmeV9yZXN1bHQgaW4gU1NMX1NFU1NJT04gZGF0YSBzdHJ1Y3R1cmUKICAgICAoYW5kIGFkZCBpdCB0byBleHRlcm5hbCBzZXNzaW9uIHJlcHJlc2VudGF0aW9uKS4KICAgICBUaGlzIGlzIG5lZWRlZCB3aGVuIGNsaWVudCBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb25zIGZhaWxzLAogICAgIGJ1dCBhbiBhcHBsaWNhdGlvbi1wcm92aWRlZCB2ZXJpZmljYXRpb24gY2FsbGJhY2sgKHNldCBieQogICAgIFNTTF9DVFhfc2V0X2NlcnRfdmVyaWZ5X2NhbGxiYWNrKSBhbGxvd3MgYWNjZXB0aW5nIHRoZSBzZXNzaW9uCiAgICAgYW55d2F5IChpLmUuIGxlYXZlcyB4NTA5X3N0b3JlX2N0eC0+ZXJyb3IgIT0gWDUwOV9WX09LCiAgICAgYnV0IHJldHVybnMgMSk6IFdoZW4gdGhlIHNlc3Npb24gaXMgcmV1c2VkLCB3ZSBoYXZlIHRvIHNldAogICAgIHNzbC0+dmVyaWZ5X3Jlc3VsdCB0byB0aGUgYXBwcm9wcmlhdGUgZXJyb3IgY29kZSB0byBhdm9pZAogICAgIHNlY3VyaXR5IGhvbGVzLgogICAgIFtCb2RvIE1vZWxsZXIsIHByb2JsZW0gcG9pbnRlZCBvdXQgYnkgTHV0eiBKYWVuaWNrZV0KCiAgKikgRml4IGEgYnVnIGluIHRoZSBuZXcgUEtDUyM3IGNvZGU6IGl0IGRpZG4ndCBjb25zaWRlciB0aGUKICAgICBjYXNlIGluIFBLQ1M3X2RhdGFJbml0KCkgd2hlcmUgdGhlIHNpZ25lZCBQS0NTNyBzdHJ1Y3R1cmUKICAgICBkaWRuJ3QgY29udGFpbiBhbnkgZXhpc3RpbmcgZGF0YSBiZWNhdXNlIGl0IHdhcyBiZWluZyBjcmVhdGVkLgogICAgIFtQby1DaGVuZyBDaGVuIDxwb2NoZW5nQG5zdC5jb20udHc+LCBzbGlnaHRseSBtb2RpZmllZCBieSBTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIHNhbHQgdG8gdGhlIGtleSBkZXJpdmF0aW9uIHJvdXRpbmVzIGluIGVuYy5jLiBUaGlzCiAgICAgZm9ybXMgdGhlIGZpcnN0IDggYnl0ZXMgb2YgdGhlIGVuY3J5cHRlZCBmaWxlLiBBbHNvIGFkZCBhCiAgICAgLVMgb3B0aW9uIHRvIGFsbG93IGEgc2FsdCB0byBiZSBpbnB1dCBvbiB0aGUgY29tbWFuZCBsaW5lLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBYNTA5X2NtcCgpLiBPZGRseSBlbm91Z2ggdGhlcmUgd2Fzbid0IGEgZnVuY3Rpb24KICAgICB0byBjb21wYXJlIHR3byBjZXJ0aWZpY2F0ZXMuIFdlIGRvIHRoaXMgYnkgd29ya2luZyBvdXQgdGhlIFNIQTEKICAgICBoYXNoIGFuZCBjb21wYXJpbmcgdGhhdC4gWDUwOV9jbXAoKSB3aWxsIGJlIG5lZWRlZCBieSB0aGUgdHJ1c3QKICAgICBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNTTF9nZXQxX3Nlc3Npb24oKSBpcyBsaWtlIFNTTF9nZXRfc2Vzc2lvbigpLCBidXQgaW5jcmVtZW50cwogICAgIHRoZSByZWZlcmVuY2UgY291bnQgaW4gdGhlIFNTTF9TRVNTSU9OIHJldHVybmVkLgogICAgIFtHZW9mZiBUaG9ycGUgPGdlb2ZmQGV1LmMyLm5ldD5dCgogICopIEZpeCBmb3IgJ3JlcSc6IGl0IHdhcyBhZGRpbmcgYSBudWxsIHRvIHJlcXVlc3QgYXR0cmlidXRlcy4KICAgICBBbHNvIGNoYW5nZSB0aGUgWDUwOV9MT09LVVAgYW5kIFg1MDlfSU5GTyBjb2RlIHRvIGhhbmRsZQogICAgIGNlcnRpZmljYXRlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgNDAgYW5kIDY0IGJpdCBSQzIgYW5kIFJDNCBhbGdvcml0aG1zOiBkb2N1bWVudAogICAgIHRoZSAnZW5jJyBjb21tYW5kLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0aGUgcG9zc2liaWxpdHkgdG8gYWRkIGV4dHJhIGluZm9ybWF0aW9uIHRvIHRoZSBtZW1vcnkgbGVhawogICAgIGRldGVjdGluZyBvdXRwdXQsIHRvIGZvcm0gdHJhY2ViYWNrcywgc2hvd2luZyBmcm9tIHdoZXJlIGVhY2gKICAgICBhbGxvY2F0aW9uIHdhcyBvcmlnaW5hdGVkOiBDUllQVE9fcHVzaF9pbmZvKCJjb25zdGFudCBzdHJpbmciKSBhZGRzCiAgICAgdGhlIHN0cmluZyBwbHVzIGN1cnJlbnQgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlciB0byBhIHBlci10aHJlYWQKICAgICBzdGFjaywgQ1JZUFRPX3BvcF9pbmZvKCkgZG9lcyB0aGUgb2J2aW91cywgQ1JZUFRPX3JlbW92ZV9hbGxfaW5mbygpCiAgICAgaXMgbGlrZSBjYWxsaW5nIENZUlBUT19wb3BfaW5mbygpIHVudGlsIHRoZSBzdGFjayBpcyBlbXB0eS4KICAgICBBbHNvIHVwZGF0ZWQgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIGNvZGUgdG8gYmUgbXVsdGktdGhyZWFkLXNhZmUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZV0KCiAgKikgQWRkIG9wdGlvbnMgLXRleHQgYW5kIC1ub291dCB0byBwa2NzNyB1dGlsaXR5IGFuZCBkZWxldGUgdGhlCiAgICAgZW5jcnlwdGlvbiBvcHRpb25zIHdoaWNoIG5ldmVyIGRpZCBhbnl0aGluZy4gVXBkYXRlIGRvY3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG9wdGlvbnMgdG8gc29tZSBvZiB0aGUgdXRpbGl0aWVzIHRvIGFsbG93IHRoZSBwYXNzIHBocmFzZQogICAgIHRvIGJlIGluY2x1ZGVkIG9uIGVpdGhlciB0aGUgY29tbWFuZCBsaW5lIChub3QgcmVjb21tZW5kZWQgb24KICAgICBPU2VzIGxpa2UgVW5peCkgb3IgcmVhZCBmcm9tIHRoZSBlbnZpcm9ubWVudC4gVXBkYXRlIHRoZQogICAgIG1hbnBhZ2VzIGFuZCBmaXggYSBmZXcgYnVncy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBmZXcgbWFucGFnZXMgZm9yIHNvbWUgb2YgdGhlIG9wZW5zc2wgY29tbWFuZHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHRoZSAtcmV2b2tlIG9wdGlvbiBpbiBjYS4gSXQgd2FzIGZyZWVpbmcgdXAgbWVtb3J5IHR3aWNlLAogICAgIGxlYWtpbmcgYW5kIG5vdCBmaW5kaW5nIGFscmVhZHkgcmV2b2tlZCBjZXJ0aWZpY2F0ZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRXh0ZW5zaXZlIGNoYW5nZXMgdG8gc3VwcG9ydCBjZXJ0aWZpY2F0ZSBhdXhpbGlhcnkgaW5mb3JtYXRpb24uCiAgICAgVGhpcyBpbnZvbHZlcyB0aGUgdXNlIG9mIFg1MDlfQ0VSVF9BVVggc3RydWN0dXJlIGFuZCBYNTA5X0FVWAogICAgIGZ1bmN0aW9ucy4gQW4gWDUwOV9BVVggZnVuY3Rpb24gc3VjaCBhcyBQRU1fcmVhZF9YNTA5X0FVWCgpCiAgICAgY2FuIHN0aWxsIHJlYWQgaW4gYSBjZXJ0aWZpY2F0ZSBmaWxlIGluIHRoZSB1c3VhbCB3YXkgYnV0IGl0CiAgICAgd2lsbCBhbHNvIHJlYWQgaW4gYW55IGFkZGl0aW9uYWwgImF1eGlsaWFyeSBpbmZvcm1hdGlvbiIuIEJ5CiAgICAgZG9pbmcgdGhpbmdzIHRoaXMgd2F5IGEgZmFpciBkZWdyZWUgb2YgY29tcGF0aWJpbGl0eSBjYW4gYmUKICAgICByZXRhaW5lZDogZXhpc3RpbmcgY2VydGlmaWNhdGVzIGNhbiBoYXZlIHRoaXMgaW5mb3JtYXRpb24gYWRkZWQKICAgICB1c2luZyB0aGUgbmV3ICd4NTA5JyBvcHRpb25zLiAKCiAgICAgQ3VycmVudCBhdXhpbGlhcnkgaW5mb3JtYXRpb24gaW5jbHVkZXMgYW4gImFsaWFzIiBhbmQgc29tZSB0cnVzdAogICAgIHNldHRpbmdzLiBUaGUgdHJ1c3Qgc2V0dGluZ3Mgd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgaW4gZW5oYW5jZWQKICAgICBjZXJ0aWZpY2F0ZSBjaGFpbiB2ZXJpZmljYXRpb24gcm91dGluZXM6IGN1cnJlbnRseSBhIGNlcnRpZmljYXRlCiAgICAgY2FuIG9ubHkgYmUgdHJ1c3RlZCBpZiBpdCBpcyBzZWxmIHNpZ25lZCBhbmQgdGhlbiBpdCBpcyB0cnVzdGVkCiAgICAgZm9yIGFsbCBwdXJwb3Nlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggYXNzZW1ibGVyIGZvciBBbHBoYSAodGVzdGVkIG9ubHkgb24gREVDIE9TRiBub3QgTGludXggb3IgKkJTRCkuCiAgICAgVGhlIHByb2JsZW0gd2FzIHRoYXQgb25lIG9mIHRoZSByZXBsYWNlbWVudCByb3V0aW5lcyBoYWQgbm90IGJlZW4gd29ya2luZwogICAgIHNpbmNlIFNTTGVheSByZWxlYXNlcy4gIEZvciBub3cgdGhlIG9mZmVuZGluZyByb3V0aW5lIGhhcyBiZWVuIHJlcGxhY2VkCiAgICAgd2l0aCBub24tb3B0aW1pc2VkIGFzc2VtYmxlci4gIEV2ZW4gc28sIHRoaXMgbm93IGdpdmVzIGFyb3VuZCA5NSUKICAgICBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBmb3IgMTAyNCBiaXQgUlNBIHNpZ25zLgogICAgIFtNYXJrIENveF0KCiAgKikgSGFjayB0byBmaXggUEtDUyM3IGRlY3J5cHRpb24gd2hlbiB1c2VkIHdpdGggc29tZSB1bm9ydGhvZG94IFJDMiAKICAgICBoYW5kbGluZy4gTW9zdCBjbGllbnRzIGhhdmUgdGhlIGVmZmVjdGl2ZSBrZXkgc2l6ZSBpbiBiaXRzIGVxdWFsIHRvCiAgICAgdGhlIGtleSBsZW5ndGggaW4gYml0czogc28gYSA0MCBiaXQgUkMyIGtleSB1c2VzIGEgNDAgYml0ICg1IGJ5dGUpIGtleS4KICAgICBBIGZldyBob3dldmVyIGRvbid0IGRvIHRoaXMgYW5kIGluc3RlYWQgdXNlIHRoZSBzaXplIG9mIHRoZSBkZWNyeXB0ZWQga2V5CiAgICAgdG8gZGV0ZXJtaW5lIHRoZSBSQzIga2V5IGxlbmd0aCBhbmQgdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgdG8gZGV0ZXJtaW5lCiAgICAgdGhlIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoLiBJbiB0aGlzIGNhc2UgdGhlIGVmZmVjdGl2ZSBrZXkgbGVuZ3RoIGNhbiBzdGlsbAogICAgIGJlIDQwIGJpdHMgYnV0IHRoZSBrZXkgbGVuZ3RoIGNhbiBiZSAxNjggYml0cyBmb3IgZXhhbXBsZS4gVGhpcyBpcyBmaXhlZAogICAgIGJ5IG1hbnVhbGx5IGZvcmNpbmcgYW4gUkMyIGtleSBpbnRvIHRoZSBFVlBfUEtFWSBzdHJ1Y3R1cmUgYmVjYXVzZSB0aGUKICAgICBFVlAgY29kZSBjYW4ndCBjdXJyZW50bHkgaGFuZGxlIHVudXN1YWwgUkMyIGtleSBzaXplczogaXQgYWx3YXlzIGFzc3VtZXMKICAgICB0aGUga2V5IGxlbmd0aCBhbmQgZWZmZWN0aXZlIGtleSBsZW5ndGggYXJlIGVxdWFsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyB0aGF0IHNob3VsZCBzaW1wbGlmeSB0aGUgY3JlYXRpb24gb2YgCiAgICAgWDUwOV9OQU1FIHN0cnVjdHVyZXMuIE5vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gZG86CiAgICAgWDUwOV9OQU1FX2FkZF9lbnRyeV9ieV90eHQobm0sICJDTiIsIE1CU1RSSU5HX0FTQywgIlN0ZXZlIiwgLTEsIC0xLCAwKTsKICAgICBhbmQgaGF2ZSBpdCBhdXRvbWF0aWNhbGx5IHdvcmsgb3V0IHRoZSBjb3JyZWN0IGZpZWxkIHR5cGUgYW5kIGZpbGwgaW4KICAgICB0aGUgc3RydWN0dXJlcy4gVGhlIG1vcmUgYWR2ZW50dXJvdXMgY2FuIHRyeToKICAgICBYNTA5X05BTUVfYWRkX2VudHJ5X2J5X3R4dChubSwgZmllbGQsIE1CU1RSSU5HX1VURjgsIHN0ciwgLTEsIC0xLCAwKTsKICAgICBhbmQgaXQgd2lsbCAoaG9wZWZ1bGx5KSB3b3JrIG91dCB0aGUgY29ycmVjdCBtdWx0aWJ5dGUgZW5jb2RpbmcuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ2hhbmdlIHRoZSAncmVxJyB1dGlsaXR5IHRvIHVzZSB0aGUgbmV3IGZpZWxkIGhhbmRsaW5nIGFuZCBtdWx0aWJ5dGUKICAgICBjb3B5IHJvdXRpbmVzLiBCZWZvcmUgdGhlIEROIGZpZWxkIGNyZWF0aW9uIHdhcyBoYW5kbGVkIGluIGFuIGFkIGhvYwogICAgIHdheSBpbiByZXEsIGNhLCBhbmQgeDUwOSB3aGljaCB3YXMgcmF0aGVyIGJyb2tlbiBhbmQgZGlkbid0IHN1cHBvcnQKICAgICBCTVBTdHJpbmdzIG9yIFVURjhTdHJpbmdzLiBTaW5jZSBzb21lIHNvZnR3YXJlIGRvZXNuJ3QgaW1wbGVtZW50CiAgICAgQk1QU3RyaW5ncyBvciBVVEY4U3RyaW5ncyB5ZXQsIHRoZXkgY2FuIGJlIGVuYWJsZWQgdXNpbmcgdGhlIGNvbmZpZyBmaWxlCiAgICAgdXNpbmcgdGhlIGRpcnN0cmluZ190eXBlIG9wdGlvbi4gU2VlIHRoZSBuZXcgY29tbWVudCBpbiB0aGUgZGVmYXVsdAogICAgIG9wZW5zc2wuY25mIGZvciBtb3JlIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBjcnlwdG8vcmFuZC9tZF9yYW5kLmMgbW9yZSByb2J1c3Q6CiAgICAgLSBBc3N1cmUgdW5pcXVlIHJhbmRvbSBudW1iZXJzIGFmdGVyIGZvcmsoKS4KICAgICAtIE1ha2Ugc3VyZSB0aGF0IGNvbmN1cnJlbnQgdGhyZWFkcyBhY2Nlc3MgdGhlIGdsb2JhbCBjb3VudGVyIGFuZAogICAgICAgbWQgc2VyaWFsaXphYmx5IHNvIHRoYXQgd2UgbmV2ZXIgbG9zZSBlbnRyb3B5IGluIHRoZW0KICAgICAgIG9yIHVzZSBleGFjdGx5IHRoZSBzYW1lIHN0YXRlIGluIG11bHRpcGxlIHRocmVhZHMuCiAgICAgICBBY2Nlc3MgdG8gdGhlIGxhcmdlIHN0YXRlIGlzIG5vdCBhbHdheXMgc2VyaWFsaXphYmxlIGJlY2F1c2UKICAgICAgIHRoZSBhZGRpdGlvbmFsIGxvY2tpbmcgY291bGQgYmUgYSBwZXJmb3JtYW5jZSBraWxsZXIsIGFuZAogICAgICAgbWQgc2hvdWxkIGJlIGxhcmdlIGVub3VnaCBhbnl3YXkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZpbGUgYXBwcy9hcHBfcmFuZC5jIHdpdGggY29tbW9ubHkgbmVlZGVkIGZ1bmN0aW9uYWxpdHkKICAgICBmb3IgaGFuZGxpbmcgdGhlIHJhbmRvbSBzZWVkIGZpbGUuCgogICAgIFVzZSB0aGUgcmFuZG9tIHNlZWQgZmlsZSBpbiBzb21lIGFwcGxpY2F0aW9ucyB0aGF0IHByZXZpb3VzbHkgZGlkIG5vdDoKICAgICAgICAgIGNhLAogICAgICAgICAgZHNhcGFyYW0gLWdlbmtleSAod2hpY2ggYWxzbyBpZ25vcmVkIGl0cyAnLXJhbmQnIG9wdGlvbiksIAogICAgICAgICAgc19jbGllbnQsCiAgICAgICAgICBzX3NlcnZlciwKICAgICAgICAgIHg1MDkgKHdoZW4gc2lnbmluZykuCiAgICAgRXhjZXB0IG9uIHN5c3RlbXMgd2l0aCAvZGV2L3VyYW5kb20sIGl0IGlzIGNydWNpYWwgdG8gaGF2ZSBhIHJhbmRvbQogICAgIHNlZWQgZmlsZSBhdCBsZWFzdCBmb3Iga2V5IGNyZWF0aW9uLCBEU0Egc2lnbmluZywgYW5kIGZvciBESCBleGNoYW5nZXM7CiAgICAgZm9yIFJTQSBzaWduYXR1cmVzIHdlIGNvdWxkIGRvIHdpdGhvdXQgb25lLgoKICAgICBnZW5kaCBhbmQgZ2VuZHNhICh1bmxpa2UgZ2VucnNhKSB1c2VkIHRvIHJlYWQgb25seSB0aGUgZmlyc3QgYnl0ZQogICAgIG9mIGVhY2ggZmlsZSBsaXN0ZWQgaW4gdGhlICctcmFuZCcgb3B0aW9uLiAgVGhlIGZ1bmN0aW9uIGFzIHByZXZpb3VzbHkKICAgICBmb3VuZCBpbiBnZW5yc2EgaXMgbm93IGluIGFwcF9yYW5kLmMgYW5kIGlzIHVzZWQgYnkgYWxsIHByb2dyYW1zCiAgICAgdGhhdCBzdXBwb3J0ICctcmFuZCcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW4gUkFORF93cml0ZV9maWxlLCB1c2UgbW9kZSAwNjAwIGZvciBjcmVhdGluZyBmaWxlczsKICAgICBkb24ndCBqdXN0IGNobW9kIHdoZW4gaXQgbWF5IGJlIHRvbyBsYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFJlcG9ydCBhbiBlcnJvciBmcm9tIFg1MDlfU1RPUkVfbG9hZF9sb2NhdGlvbnMKICAgICB3aGVuIFg1MDlfTE9PS1VQX2xvYWRfZmlsZSBvciBYNTA5X0xPT0tVUF9hZGRfZGlyIGZhaWxlZC4KICAgICBbQmlsbCBQZXJyeV0KCiAgKikgTmV3IGZ1bmN0aW9uIEFTTjFfbWJzdHJpbmdfY29weSgpIHRoaXMgY29waWVzIGEgc3RyaW5nIGluIGVpdGhlcgogICAgIEFTQ0lJLCBVbmljb2RlLCBVbml2ZXJzYWwgKDQgYnl0ZXMgcGVyIGNoYXJhY3Rlcikgb3IgVVRGOCBmb3JtYXQKICAgICBpbnRvIGFuIEFTTjFfU1RSSU5HIHR5cGUuIEEgbWFzayBvZiBwZXJtaXNzaWJsZSB0eXBlcyBpcyBwYXNzZWQKICAgICBhbmQgaXQgY2hvb3NlcyB0aGUgIm1pbmltYWwiIHR5cGUgdG8gdXNlIG9yIGFuIGVycm9yIGlmIG5vdCB0eXBlCiAgICAgaXMgc3VpdGFibGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGZ1bmN0aW9uIGVxdWl2YWxlbnRzIHRvIHRoZSB2YXJpb3VzIG1hY3JvcyBpbiBhc24xLmguIFRoZSBvbGQKICAgICBtYWNyb3MgYXJlIHJldGFpbmVkIHdpdGggYW4gTV8gcHJlZml4LiBDb2RlIGluc2lkZSB0aGUgbGlicmFyeSBjYW4KICAgICB1c2UgdGhlIE1fIG1hY3Jvcy4gRXh0ZXJuYWwgY29kZSAoaW5jbHVkaW5nIHRoZSBvcGVuc3NsIHV0aWxpdHkpCiAgICAgc2hvdWxkICpOT1QqIGluIG9yZGVyIHRvIGJlICJzaGFyZWQgbGlicmFyeSBmcmllbmRseSIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHZhcmlvdXMgZnVuY3Rpb25zIHRoYXQgY2FuIGNoZWNrIGEgY2VydGlmaWNhdGUncyBleHRlbnNpb25zCiAgICAgdG8gc2VlIGlmIGl0IHVzYWJsZSBmb3IgdmFyaW91cyBwdXJwb3NlcyBzdWNoIGFzIFNTTCBjbGllbnQsCiAgICAgc2VydmVyIG9yIFMvTUlNRSBhbmQgQ0FzIG9mIHRoZXNlIHR5cGVzLiBUaGlzIGlzIGN1cnJlbnRseSAKICAgICBWRVJZIEVYUEVSSU1FTlRBTCBidXQgd2lsbCB1bHRpbWF0ZWx5IGJlIHVzZWQgZm9yIGNlcnRpZmljYXRlIGNoYWluCiAgICAgdmVyaWZpY2F0aW9uLiBBbHNvIGFkZGVkIGEgLXB1cnBvc2UgZmxhZyB0byB4NTA5IHV0aWxpdHkgdG8KICAgICBwcmludCBvdXQgYWxsIHRoZSBwdXJwb3Nlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBDUllQVE9fRVhfREFUQSB0byBYNTA5IGNlcnRpZmljYXRlIHN0cnVjdHVyZSBhbmQgYXNzb2NpYXRlZAogICAgIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgWDUwOVYzX3tYNTA5LENSTCxSRVZPS0VEfV9nZXRfZDJpKCkgZnVuY3Rpb25zLiBUaGVzZSB3aWxsIHNlYXJjaAogICAgIGZvciwgb2J0YWluIGFuZCBkZWNvZGUgYW5kIGV4dGVuc2lvbiBhbmQgb2J0YWluIGl0cyBjcml0aWNhbCBmbGFnLgogICAgIFRoaXMgYWxsb3dzIGFsbCB0aGUgbmVjZXNzYXJ5IGV4dGVuc2lvbiBjb2RlIHRvIGJlIGhhbmRsZWQgaW4gYQogICAgIHNpbmdsZSBmdW5jdGlvbiBjYWxsLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJDNCB0dW5lLXVwIGZlYXR1cmluZyAzMC00MCUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgb24gbW9zdCBSSVNDCiAgICAgcGxhdGZvcm1zLiBTZWUgY3J5cHRvL3JjNC9yYzRfZW5jLmMgZm9yIGZ1cnRoZXIgZGV0YWlscy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgTmV3IC1ub291dCBvcHRpb24gdG8gYXNuMXBhcnNlLiBUaGlzIGNhdXNlcyBubyBvdXRwdXQgdG8gYmUgcHJvZHVjZWQKICAgICBpdHMgbWFpbiB1c2UgaXMgd2hlbiBjb21iaW5lZCB3aXRoIC1zdHJwYXJzZSBhbmQgLW91dCB0byBleHRyYWN0IGRhdGEKICAgICBmcm9tIGEgZmlsZSAod2hpY2ggbWF5IG5vdCBiZSBpbiBBU04uMSBmb3JtYXQpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBmb3IgcGtjczEyIHByb2dyYW0uIEl0IHdhcyBoYXNoaW5nIGFuIGludmFsaWQgY2VydGlmaWNhdGUgcG9pbnRlcgogICAgIHdoZW4gcHJvZHVjaW5nIHRoZSBsb2NhbCBrZXkgaWQuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIE5ldyBvcHRpb24gLWRocGFyYW0gaW4gc19zZXJ2ZXIuIFRoaXMgYWxsb3dzIGEgREggcGFyYW1ldGVyIGZpbGUgdG8gYmUKICAgICBzdGF0ZWQgZXhwbGljaXRseS4gSWYgaXQgaXMgbm90IHN0YXRlZCB0aGVuIGl0IHRyaWVzIHRoZSBmaXJzdCBzZXJ2ZXIKICAgICBjZXJ0aWZpY2F0ZSBmaWxlLiBUaGUgcHJldmlvdXMgYmVoYXZpb3VyIGhhcmQgY29kZWQgdGhlIGZpbGVuYW1lCiAgICAgInNlcnZlci5wZW0iLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCAtcHViaW4gYW5kIC1wdWJvdXQgb3B0aW9ucyB0byB0aGUgcnNhIGFuZCBkc2EgY29tbWFuZHMuIFRoZXNlIGFsbG93CiAgICAgYSBwdWJsaWMga2V5IHRvIGJlIGlucHV0IG9yIG91dHB1dC4gRm9yIGV4YW1wbGU6CiAgICAgb3BlbnNzbCByc2EgLWluIGtleS5wZW0gLXB1Ym91dCAtb3V0IHB1YmtleS5wZW0KICAgICBBbHNvIGFkZGVkIG5lY2Vzc2FyeSBEU0EgcHVibGljIGtleSBmdW5jdGlvbnMgdG8gaGFuZGxlIHRoaXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHNvIFBLQ1M3X2RhdGFWZXJpZnkoKSBkb2Vzbid0IGNyYXNoIGlmIG5vIGNlcnRpZmljYXRlcyBhcmUgY29udGFpbmVkCiAgICAgaW4gdGhlIG1lc3NhZ2UuIFRoaXMgd2FzIGhhbmRsZWQgYnkgYWxsb3dpbmcKICAgICBYNTA5X2ZpbmRfYnlfaXNzdWVyX2FuZF9zZXJpYWwoKSB0byB0b2xlcmF0ZSBhIE5VTEwgcGFzc2VkIHRvIGl0LgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IFNhbXBvIEtlbGxvbWFraSA8c2FtcG9AbWFpbC5uZXVyb25pby5wdD5dCgogICopIEZpeCBmb3IgYnVnIGluIGQyaV9BU04xX2J5dGVzKCk6IG90aGVyIEFTTjEgZnVuY3Rpb25zIGFkZCBhbiBleHRyYSBudWxsCiAgICAgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5ncyB3aGVyZWFzIHRoaXMgZGlkbid0LiBUaGlzIHdvdWxkIGNhdXNlIHByb2JsZW1zCiAgICAgaWYgc3RyaW5ncyByZWFkIHdpdGggZDJpX0FTTjFfYnl0ZXMoKSB3ZXJlIGxhdGVyIG1vZGlmaWVkLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEFybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEZpeCBmb3IgYmFzZTY0IGRlY29kZSBidWcuIFdoZW4gYSBiYXNlNjQgYmlvIHJlYWRzIG9ubHkgb25lIGxpbmUgb2YKICAgICBkYXRhIGFuZCBpdCBjb250YWlucyBFT0YgaXQgd2lsbCBlbmQgdXAgcmV0dXJuaW5nIGFuIGVycm9yLiBUaGlzIGlzCiAgICAgY2F1c2VkIGJ5IGlucHV0IDQ2IGJ5dGVzIGxvbmcuIFRoZSBjYXVzZSBpcyBkdWUgdG8gdGhlIHdheSBiYXNlNjQKICAgICBCSU9zIGZpbmQgdGhlIHN0YXJ0IG9mIGJhc2U2NCBlbmNvZGVkIGRhdGEuIFRoZXkgZG8gdGhpcyBieSB0cnlpbmcgYQogICAgIHRyaWFsIGRlY29kZSBvbiBlYWNoIGxpbmUgdW50aWwgdGhleSBmaW5kIG9uZSB0aGF0IHdvcmtzLiBXaGVuIHRoZXkKICAgICBkbyBhIGZsYWcgaXMgc2V0IGFuZCBpdCBzdGFydHMgYWdhaW4ga25vd2luZyBpdCBjYW4gcGFzcyBhbGwgdGhlCiAgICAgZGF0YSBkaXJlY3RseSB0aHJvdWdoIHRoZSBkZWNvZGVyLiBVbmZvcnR1bmF0ZWx5IGl0IGRvZXNuJ3QgcmVzZXQKICAgICB0aGUgY29udGV4dCBpdCB1c2VzLiBUaGlzIG1lYW5zIHRoYXQgaWYgRU9GIGlzIHJlYWNoZWQgYW4gYXR0ZW1wdAogICAgIGlzIG1hZGUgdG8gcGFzcyB0d28gRU9GcyB0aHJvdWdoIHRoZSBjb250ZXh0IGFuZCB0aGlzIGNhdXNlcyB0aGUKICAgICByZXN1bHRpbmcgZXJyb3IuIFRoaXMgY2FuIGFsc28gY2F1c2Ugb3RoZXIgcHJvYmxlbXMgYXMgd2VsbC4gQXMgaXMKICAgICB1c3VhbCB3aXRoIHRoZXNlIHByb2JsZW1zIGl0IHRha2VzICphZ2VzKiB0byBmaW5kIGFuZCB0aGUgZml4IGlzCiAgICAgdHJpdmlhbDogbW92ZSBvbmUgbGluZS4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBpYW5AdW5zLm5zLmFjLnl1IChJdmFuIE5lamdlYmF1ZXIpIF0KCiAgKikgVWdseSB3b3JrYXJvdW5kIHRvIGdldCBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgd29ya2luZyB1bmRlciBXaW5kb3dzLiBUaGUKICAgICBvbGQgY29kZSB3b3VsZG4ndCB3b3JrIGJlY2F1c2UgaXQgbmVlZGVkIHRvIHNlbGVjdCgpIG9uIHNvY2tldHMgYW5kIHRoZQogICAgIHR0eSAoZm9yIGtleXByZXNzZXMgYW5kIHRvIHNlZSBpZiBkYXRhIGNvdWxkIGJlIHdyaXR0ZW4pLiBXaW4zMiBvbmx5CiAgICAgc3VwcG9ydHMgc2VsZWN0KCkgb24gc29ja2V0cyBzbyB3ZSBzZWxlY3QoKSB3aXRoIGEgMXMgdGltZW91dCBvbiB0aGUKICAgICBzb2NrZXRzIGFuZCB0aGVuIHNlZSBpZiBhbnkgY2hhcmFjdGVycyBhcmUgd2FpdGluZyB0byBiZSByZWFkLCBpZiBub25lCiAgICAgYXJlIHByZXNlbnQgdGhlbiB3ZSByZXRyeSwgd2UgYWxzbyBhc3N1bWUgd2UgY2FuIGFsd2F5cyB3cml0ZSBkYXRhIHRvCiAgICAgdGhlIHR0eS4gVGhpcyBpc24ndCBuaWNlIGJlY2F1c2UgdGhlIGNvZGUgdGhlbiBibG9ja3MgdW50aWwgd2UndmUKICAgICByZWNlaXZlZCBhIGNvbXBsZXRlIGxpbmUgb2YgZGF0YSBhbmQgaXQgaXMgZWZmZWN0aXZlbHkgcG9sbGluZyB0aGUKICAgICBrZXlib2FyZCBhdCAxcyBpbnRlcnZhbHM6IGhvd2V2ZXIgaXQncyBxdWl0ZSBhIGJpdCBiZXR0ZXIgdGhhbiBub3QKICAgICB3b3JraW5nIGF0IGFsbCA6LSkgQSBkZWRpY2F0ZWQgV2luZG93cyBhcHBsaWNhdGlvbiBtaWdodCBoYW5kbGUgdGhpcwogICAgIHdpdGggYW4gZXZlbnQgbG9vcCBmb3IgZXhhbXBsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBFbmhhbmNlIFJTQV9NRVRIT0Qgc3RydWN0dXJlLiBOb3cgdGhlcmUgYXJlIHR3byBleHRyYSBtZXRob2RzLCByc2Ffc2lnbgogICAgIGFuZCByc2FfdmVyaWZ5LiBXaGVuIHRoZSBSU0FfRkxBR1NfU0lHTl9WRVIgb3B0aW9uIGlzIHNldCB0aGVzZSBmdW5jdGlvbnMKICAgICB3aWxsIGJlIGNhbGxlZCB3aGVuIFJTQV9zaWduKCkgYW5kIFJTQV92ZXJpZnkoKSBhcmUgdXNlZC4gVGhpcyBpcyB1c2VmdWwKICAgICBpZiByc2FfcHViX2RlYygpIGFuZCByc2FfcHJpdl9lbmMoKSBlcXVpdmFsZW50cyBhcmUgbm90IGF2YWlsYWJsZS4KICAgICBGb3IgdGhpcyB0byB3b3JrIHByb3Blcmx5IFJTQV9wdWJsaWNfZGVjcnlwdCgpIGFuZCBSU0FfcHJpdmF0ZV9lbmNyeXB0KCkKICAgICBzaG91bGQgKm5vdCogYmUgdXNlZDogUlNBX3NpZ24oKSBhbmQgUlNBX3ZlcmlmeSgpIG11c3QgYmUgdXNlZCBpbnN0ZWFkLgogICAgIFRoaXMgbmVjZXNzaXRhdGVkIHRoZSBzdXBwb3J0IG9mIGFuIGV4dHJhIHNpZ25hdHVyZSB0eXBlIE5JRF9tZDVfc2hhMQogICAgIGZvciBTU0wgc2lnbmF0dXJlcyBhbmQgbW9kaWZpY2F0aW9ucyB0byB0aGUgU1NMIGxpYnJhcnkgdG8gdXNlIGl0IGluc3RlYWQKICAgICBvZiBjYWxsaW5nIFJTQV9wdWJsaWNfZGVjcnlwdCgpIGFuZCBSU0FfcHJpdmF0ZV9lbmNyeXB0KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIG5ldyAtdmVyaWZ5IC1DQWZpbGUgYW5kIC1DQXBhdGggb3B0aW9ucyB0byB0aGUgY3JsIHByb2dyYW0sIHRoZXNlCiAgICAgd2lsbCBsb29rdXAgYSBDUkwgaXNzdWVycyBjZXJ0aWZpY2F0ZSBhbmQgdmVyaWZ5IHRoZSBzaWduYXR1cmUgaW4gYQogICAgIHNpbWlsYXIgd2F5IHRvIHRoZSB2ZXJpZnkgcHJvZ3JhbS4gVGlkeSB1cCB0aGUgY3JsIHByb2dyYW0gc28gaXQKICAgICBubyBsb25nZXIgYWNjZXNzZXMgc3RydWN0dXJlcyBkaXJlY3RseS4gTWFrZSB0aGUgQVNOMSBDUkwgcGFyc2luZyBhIGJpdAogICAgIGxlc3Mgc3RyaWN0LiBJdCB3aWxsIG5vdyBwZXJtaXQgQ1JMIGV4dGVuc2lvbnMgZXZlbiBpZiBpdCBpcyBub3QKICAgICBhIFYyIENSTDogdGhpcyB3aWxsIGFsbG93IGl0IHRvIHRvbGVyYXRlIHNvbWUgYnJva2VuIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbGl6ZSBhbGwgbm9uLWF1dG9tYXRpYyB2YXJpYWJsZXMgZWFjaCB0aW1lIG9uZSBvZiB0aGUgb3BlbnNzbAogICAgIHN1Yi1wcm9ncmFtcyBpcyBzdGFydGVkICh0aGlzIGlzIG5lY2Vzc2FyeSBhcyB0aGV5IG1heSBiZSBzdGFydGVkCiAgICAgbXVsdGlwbGUgdGltZXMgZnJvbSB0aGUgIk9wZW5TU0w+IiBwcm9tcHQpLgogICAgIFtMZW5uYXJ0IEJhbmcsIEJvZG8gTW9lbGxlcl0KCiAgKikgUHJlbGltaW5hcnkgY29tcGlsYXRpb24gb3B0aW9uIFJTQV9OVUxMIHdoaWNoIGRpc2FibGVzIFJTQSBjcnlwdG8gd2l0aG91dAogICAgIHJlbW92aW5nIGFsbCBvdGhlciBSU0EgZnVuY3Rpb25hbGl0eSAodGhpcyBpcyB3aGF0IE5PX1JTQSBkb2VzKS4gVGhpcwogICAgIGlzIHNvIChmb3IgZXhhbXBsZSkgdGhvc2UgaW4gdGhlIFVTIGNhbiBkaXNhYmxlIHRob3NlIG9wZXJhdGlvbnMgY292ZXJlZAogICAgIGJ5IHRoZSBSU0EgcGF0ZW50IHdoaWxlIGFsbG93aW5nIHN0b3JhZ2UgYW5kIHBhcnNpbmcgb2YgUlNBIGtleXMgYW5kIFJTQQogICAgIGtleSBnZW5lcmF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5vbi1jb3B5aW5nIGludGVyZmFjZSB0byBCSU8gcGFpcnMuCiAgICAgKHN0aWxsIGxhcmdlbHkgdW50ZXN0ZWQpCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIEFOUzFfdGFnMnN0cigpIHRvIGNvbnZlcnQgYW4gQVNOMSB0YWcgdG8gYSBkZXNjcmlwdGl2ZQogICAgIEFTQ0lJIHN0cmluZy4gVGhpcyB3YXMgaGFuZGxlZCBpbmRlcGVuZGVudGx5IGluIHZhcmlvdXMgcGxhY2VzIGJlZm9yZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgZnVuY3Rpb25zIFVURjhfZ2V0YygpIGFuZCBVVEY4X3B1dGMoKSB0aGF0IHBhcnNlIGFuZCBnZW5lcmF0ZQogICAgIFVURjggc3RyaW5ncyBhIGNoYXJhY3RlciBhdCBhIHRpbWUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXNlIGNsaWVudF92ZXJzaW9uIGZyb20gY2xpZW50IGhlbGxvIHRvIHNlbGVjdCB0aGUgcHJvdG9jb2wKICAgICAoczIzX3NydnIuYykgYW5kIGZvciBSU0EgY2xpZW50IGtleSBleGNoYW5nZSB2ZXJpZmljYXRpb24KICAgICAoczNfc3J2ci5jKSwgYXMgcmVxdWlyZWQgYnkgdGhlIFNTTCAzLjAvVExTIDEuMCBzcGVjaWZpY2F0aW9ucy4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBZGQgdmFyaW91cyB1dGlsaXR5IGZ1bmN0aW9ucyB0byBoYW5kbGUgU1BLQUNzLCB0aGVzZSB3ZXJlIHByZXZpb3VzbHkKICAgICBoYW5kbGVkIGJ5IHBva2luZyByb3VuZCBpbiB0aGUgc3RydWN0dXJlIGludGVybmFscy4gQWRkZWQgbmV3IGZ1bmN0aW9uCiAgICAgTkVUU0NBUEVfU1BLSV9wcmludCgpIHRvIHByaW50IG91dCBTUEtBQyBhbmQgYSBuZXcgdXRpbGl0eSAnc3BrYWMnIHRvCiAgICAgcHJpbnQsIHZlcmlmeSBhbmQgZ2VuZXJhdGUgU1BLQUNzLiBCYXNlZCBvbiBhbiBvcmlnaW5hbCBpZGVhIGZyb20KICAgICBNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBjb211bmUubW9kZW5hLml0PiBidXQgZXh0ZW5zaXZlbHkgbW9kaWZpZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUklQRU1EMTYwIGlzIG9wZXJhdGlvbmFsIG9uIGFsbCBwbGF0Zm9ybXMgYW5kIGlzIGJhY2sgaW4gJ21ha2UgdGVzdCcuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIEFsbG93IHRoZSBjb25maWcgZmlsZSBleHRlbnNpb24gc2VjdGlvbiB0byBiZSBvdmVyd3JpdHRlbiBvbiB0aGUKICAgICBjb21tYW5kIGxpbmUuIEJhc2VkIG9uIGFuIG9yaWdpbmFsIGlkZWEgZnJvbSBNYXNzaW1pbGlhbm8gUGFsYQogICAgIDxtYWR3b2xmQGNvbXVuZS5tb2RlbmEuaXQ+LiBUaGUgbmV3IG9wdGlvbiBpcyBjYWxsZWQgLWV4dGVuc2lvbnMKICAgICBhbmQgY2FuIGJlIGFwcGxpZWQgdG8gY2EsIHJlcSBhbmQgeDUwOS4gQWxzbyAtcmVxZXh0cyB0byBvdmVycmlkZQogICAgIHRoZSByZXF1ZXN0IGV4dGVuc2lvbnMgaW4gcmVxIGFuZCAtY3JsZXh0cyB0byBvdmVycmlkZSB0aGUgY3JsIGV4dGVuc2lvbnMKICAgICBpbiBjYS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGZlYXR1cmUgdG8gdGhlIFNQS0FDIGhhbmRsaW5nIGluIGNhLiAgTm93IHlvdSBjYW4gaW5jbHVkZQogICAgIHRoZSBzYW1lIGZpZWxkIG11bHRpcGxlIHRpbWVzIGJ5IHByZWNlZGluZyBpdCBieSAiWFhYWC4iIGZvciBleGFtcGxlOgogICAgIDEuT1U9IlVuaXQgbmFtZSAxIgogICAgIDIuT1U9IlVuaXQgbmFtZSAyIgogICAgIHRoaXMgaXMgdGhlIHNhbWUgc3ludGF4IGFzIHVzZWQgaW4gdGhlIHJlcSBjb25maWcgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBjZXJ0aWZpY2F0ZSBleHRlbnNpb25zIHRvIGJlIGFkZGVkIHRvIGNlcnRpZmljYXRlIHJlcXVlc3RzLiBUaGVzZQogICAgIGFyZSBzcGVjaWZpZWQgaW4gYSAncmVxX2V4dGVuc2lvbnMnIG9wdGlvbiBvZiB0aGUgcmVxIHNlY3Rpb24gb2YgdGhlCiAgICAgY29uZmlnIGZpbGUuIFRoZXkgY2FuIGJlIHByaW50ZWQgb3V0IHdpdGggdGhlIC10ZXh0IG9wdGlvbiB0byByZXEgYnV0CiAgICAgYXJlIG90aGVyd2lzZSBpZ25vcmVkIGF0IHByZXNlbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGEgaG9ycmlibGUgYnVnIGluIGVuY19yZWFkKCkgaW4gY3J5cHRvL2V2cC9iaW9fZW5jLmM6IGlmIHRoZSBmaXJzdAogICAgIGRhdGEgcmVhZCBjb25zaXN0cyBvZiBvbmx5IHRoZSBmaW5hbCBibG9jayBpdCB3b3VsZCBub3QgZGVjcnlwdGVkIGJlY2F1c2UKICAgICBFVlBfQ2lwaGVyVXBkYXRlKCkgd291bGQgY29ycmVjdGx5IHJlcG9ydCB6ZXJvIGJ5dGVzIGhhZCBiZWVuIGRlY3J5cHRlZC4KICAgICBBIG1pc3BsYWNlZCAnYnJlYWsnIGFsc28gbWVhbnQgdGhlIGRlY3J5cHRlZCBmaW5hbCBibG9jayBtaWdodCBub3QgYmUKICAgICBjb3BpZWQgdW50aWwgdGhlIG5leHQgcmVhZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBJbml0aWFsIHN1cHBvcnQgZm9yIERIX01FVEhPRC4gQWdhaW4gYmFzZWQgb24gUlNBX01FVEhPRC4gQWxzbyBhZGRlZAogICAgIGEgZmV3IGV4dHJhIHBhcmFtZXRlcnMgdG8gdGhlIERIIHN0cnVjdHVyZTogdGhlc2Ugd2lsbCBiZSB1c2VmdWwgaWYKICAgICBmb3IgZXhhbXBsZSB3ZSB3YW50IHRoZSB2YWx1ZSBvZiAncScgb3IgaW1wbGVtZW50IFg5LjQyIERILgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluaXRpYWwgc3VwcG9ydCBmb3IgRFNBX01FVEhPRC4gVGhpcyBpcyBiYXNlZCBvbiB0aGUgUlNBX01FVEhPRCBhbmQKICAgICBwcm92aWRlcyBob29rcyB0aGF0IGFsbG93IHRoZSBkZWZhdWx0IERTQSBmdW5jdGlvbnMgb3IgZnVuY3Rpb25zIG9uIGEKICAgICAicGVyIGtleSIgYmFzaXMgdG8gYmUgcmVwbGFjZWQuIFRoaXMgYWxsb3dzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBhbmQKICAgICBoYXJkd2FyZSBrZXkgc3RvcmFnZSB0byBiZSBoYW5kbGVkIHdpdGhvdXQgbWFqb3IgbW9kaWZpY2F0aW9uIHRvIHRoZQogICAgIGxpYnJhcnkuIEFsc28gYWRkZWQgbG93IGxldmVsIG1vZGV4cCBob29rcyBhbmQgQ1JZUFRPX0VYIHN0cnVjdHVyZSBhbmQgCiAgICAgYXNzb2NpYXRlZCBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgbmV3IGZsYWcgdG8gbWVtb3J5IEJJT3MsIEJJT19GTEFHX01FTV9SRE9OTFkuIFRoaXMgbWFya3MgdGhlIEJJTwogICAgIGFzICJyZWFkIG9ubHkiOiBpdCBjYW4ndCBiZSB3cml0dGVuIHRvIGFuZCB0aGUgYnVmZmVyIGl0IHBvaW50cyB0byB3aWxsCiAgICAgbm90IGJlIGZyZWVkLiBSZWFkaW5nIGZyb20gYSByZWFkIG9ubHkgQklPIGlzIG11Y2ggbW9yZSBlZmZpY2llbnQgdGhhbgogICAgIGEgbm9ybWFsIG1lbW9yeSBCSU8uIFRoaXMgd2FzIGFkZGVkIGJlY2F1c2UgdGhlcmUgYXJlIHNldmVyYWwgdGltZXMgd2hlbgogICAgIGFuIGFyZWEgb2YgbWVtb3J5IG5lZWRzIHRvIGJlIHJlYWQgZnJvbSBhIEJJTy4gVGhlIHByZXZpb3VzIG1ldGhvZCB3YXMKICAgICB0byBjcmVhdGUgYSBtZW1vcnkgQklPIGFuZCB3cml0ZSB0aGUgZGF0YSB0byBpdCwgdGhpcyByZXN1bHRzIGluIHR3bwogICAgIGNvcGllcyBvZiB0aGUgZGF0YSBhbmQgYW4gTyhuXjIpIHJlYWRpbmcgYWxnb3JpdGhtLiBUaGVyZSBpcyBhIG5ldwogICAgIGZ1bmN0aW9uIEJJT19uZXdfbWVtX2J1ZigpIHdoaWNoIGNyZWF0ZXMgYSByZWFkIG9ubHkgbWVtb3J5IEJJTyBmcm9tCiAgICAgYW4gYXJlYSBvZiBtZW1vcnkuIEFsc28gbW9kaWZpZWQgdGhlIFBLQ1MjNyByb3V0aW5lcyB0byB1c2UgcmVhZCBvbmx5CiAgICAgbWVtb3J5IEJJT3MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQnVnZml4OiBzc2wyM19nZXRfY2xpZW50X2hlbGxvIGRpZCBub3Qgd29yayBwcm9wZXJseSB3aGVuIGNhbGxlZCBpbgogICAgIHN0YXRlIFNTTDIzX1NUX1NSX0NMTlRfSEVMTE9fQiwgaS5lLiB3aGVuIHRoZSBmaXJzdCA3IGJ5dGVzIG9mCiAgICAgYSBTU0x2Mi1jb21wYXRpYmxlIGNsaWVudCBoZWxsbyBmb3IgU1NMdjMgb3IgVExTdjEgY291bGQgYmUgcmVhZCwKICAgICBidXQgYSByZXRyeSBjb25kaXRpb24gb2NjdXJlZCB3aGlsZSB0cnlpbmcgdG8gcmVhZCB0aGUgcmVzdC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBUaGUgUEtDUzdfRU5DX0NPTlRFTlRfbmV3KCkgZnVuY3Rpb24gd2FzIHNldHRpbmcgdGhlIGNvbnRlbnQgdHlwZSBhcwogICAgIE5JRF9wa2NzN19lbmNyeXB0ZWQgYnkgZGVmYXVsdDogdGhpcyB3YXMgd3Jvbmcgc2luY2UgdGhpcyBzaG91bGQgYWxtb3N0CiAgICAgYWx3YXlzIGJlIE5JRF9wa2NzN19kYXRhLiBBbHNvIG1vZGlmaWVkIHRoZSBQS0NTN19zZXRfdHlwZSgpIHRvIGhhbmRsZQogICAgIHRoZSBlbmNyeXB0ZWQgZGF0YSB0eXBlOiB0aGlzIGlzIGEgbW9yZSBzZW5zaWJsZSBwbGFjZSB0byBwdXQgaXQgYW5kIGl0CiAgICAgYWxsb3dzIHRoZSBQS0NTIzEyIGNvZGUgdG8gYmUgdGlkaWVkIHVwIHRoYXQgZHVwbGljYXRlZCB0aGlzCiAgICAgZnVuY3Rpb25hbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDaGFuZ2VkIG9ial9kYXQucGwgc2NyaXB0IHNvIGl0IHRha2VzIGl0cyBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzIG9uCiAgICAgdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBzaG91bGQgYXZvaWQgc2hlbGwgZXNjYXBlIHJlZGlyZWN0aW9uIHByb2JsZW1zCiAgICAgdW5kZXIgV2luMzIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgSW5pdGlhbCBzdXBwb3J0IGZvciBjZXJ0aWZpY2F0ZSBleHRlbnNpb24gcmVxdWVzdHMsIHRoZXNlIGFyZSBpbmNsdWRlZAogICAgIGluIHRoaW5ncyBsaWtlIFhlbnJvbGwgY2VydGlmaWNhdGUgcmVxdWVzdHMuIEluY2x1ZGVkIGZ1bmN0aW9ucyB0byBhbGxvdwogICAgIGV4dGVuc2lvbnMgdG8gYmUgb2J0YWluZWQgYW5kIGFkZGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIC1jcmxmIG9wdGlvbiB0byBzX2NsaWVudCBhbmQgc19zZXJ2ZXIgZm9yIHNlbmRpbmcgbmV3bGluZXMgYXMKICAgICBDUkxGIChhcyByZXF1aXJlZCBieSBtYW55IHByb3RvY29scykuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiBDaGFuZ2VzIGJldHdlZW4gMC45LjNhIGFuZCAwLjkuNCAgWzA5IEF1ZyAxOTk5XQogIAogICopIEluc3RhbGwgbGliUlNBZ2x1ZS5hIHdoZW4gT3BlblNTTCBpcyBidWlsdCB3aXRoIFJTQXJlZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQSBmZXcgbW9yZSBgYCNpZm5kZWYgTk9fRlBfQVBJIC8gI2VuZGlmJycgcGFpcnMgZm9yIGNvbnNpc3RlbmN5LgogICAgIFtBbmRyaWphIEFudG9uaWpldmljIDxUaGVBbnRvbnkyQGJpZ2Zvb3QuY29tPl0KCiAgKikgRml4IC1zdGFydGRhdGUgYW5kIC1lbmRkYXRlICh3aGljaCB3YXMgbWlzc2luZykgYXJndW1lbnRzIHRvICdjYScKICAgICBwcm9ncmFtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiBEU0FfZHVwX0RILCB3aGljaCBkdXBsaWNhdGVzIERTQSBwYXJhbWV0ZXJzL2tleXMgYXMKICAgICBESCBwYXJhbWV0ZXJzL2tleXMgKHEgaXMgbG9zdCBkdXJpbmcgdGhhdCBjb252ZXJzaW9uLCBidXQgdGhlIHJlc3VsdGluZwogICAgIERIIHBhcmFtZXRlcnMgY29udGFpbiBpdHMgbGVuZ3RoKS4KCiAgICAgRm9yIDEwMjQtYml0IHAsIERTQV9nZW5lcmF0ZV9wYXJhbWV0ZXJzIGZvbGxvd2VkIGJ5IERTQV9kdXBfREggaXMKICAgICBtdWNoIGZhc3RlciB0aGFuIERIX2dlbmVyYXRlX3BhcmFtZXRlcnMgKHdoaWNoIGNyZWF0ZXMgcGFyYW1ldGVycwogICAgIHdoZXJlIHAgPSAyKnEgKyAxKSwgYW5kIGFsc28gdGhlIHNtYWxsZXIgcSBtYWtlcyBESCBjb21wdXRhdGlvbnMKICAgICBtdWNoIG1vcmUgZWZmaWNpZW50ICgxNjAtYml0IGV4cG9uZW50aWF0aW9uIGluc3RlYWQgb2YgMTAyNC1iaXQKICAgICBleHBvbmVudGlhdGlvbik7IHNvIHRoaXMgcHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byBzdXBwb3J0IERIRQogICAgIGNpcGhlcnN1aXRlcyBpbiBTU0wvVExTIHNlcnZlcnMgKHNlZSBzc2wvc3NsdGVzdC5jKS4gIEl0IGlzIG9mCiAgICAgdXR0ZXIgaW1wb3J0YW5jZSB0byB1c2UKICAgICAgICAgU1NMX0NUWF9zZXRfb3B0aW9ucyhzX2N0eCwgU1NMX09QX1NJTkdMRV9ESF9VU0UpOwogICAgIG9yCiAgICAgICAgIFNTTF9zZXRfb3B0aW9ucyhzX2N0eCwgU1NMX09QX1NJTkdMRV9ESF9VU0UpOwogICAgIHdoZW4gc3VjaCBESCBwYXJhbWV0ZXJzIGFyZSB1c2VkLCBiZWNhdXNlIG90aGVyd2lzZSBzbWFsbCBzdWJncm91cAogICAgIGF0dGFja3MgbWF5IGJlY29tZSBwb3NzaWJsZSEKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBBdm9pZCBtZW1vcnkgbGVhayBpbiBpMmRfREhwYXJhbXMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWxsb3cgdGhlIC1rIG9wdGlvbiB0byBiZSB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBlbmMgcHJvZ3JhbToKICAgICB0aGlzIGFsbG93cyB0aGUgc2FtZSBlbmNyeXB0ZWQgbWVzc2FnZSB0byBiZSByZWFkIGJ5IG11bHRpcGxlIHJlY2lwaWVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IGZ1bmN0aW9uIE9CSl9vYmoydHh0KGJ1ZiwgYnVmX2xlbiwgYSwgbm9fbmFtZSksIHRoaXMgY29udmVydHMKICAgICBhbiBBU04xX09CSkVDVCB0byBhIHRleHQgc3RyaW5nLiBJZiB0aGUgIm5vX25hbWUiIHBhcmFtZXRlciBpcyBzZXQgdGhlbgogICAgIGl0IHdpbGwgYWx3YXlzIHVzZSB0aGUgbnVtZXJpY2FsIGZvcm0gb2YgdGhlIE9JRCwgZXZlbiBpZiBpdCBoYXMgYSBzaG9ydAogICAgIG9yIGxvbmcgbmFtZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBhbiBleHRyYSBSU0EgZmxhZzogUlNBX0ZMQUdfRVhUX1BLRVkuIFByZXZpb3VzbHkgdGhlIHJzYV9tb2RfZXhwCiAgICAgbWV0aG9kIG9ubHkgZ290IGNhbGxlZCBpZiBwLHEsZG1wMSxkbXExLGlxbXAgY29tcG9uZW50cyB3ZXJlIHByZXNlbnQsCiAgICAgb3RoZXJ3aXNlIGJuX21vZF9leHAgd2FzIGNhbGxlZC4gSW4gdGhlIGNhc2Ugb2YgaGFyZHdhcmUga2V5cyBmb3IgZXhhbXBsZQogICAgIG5vIHByaXZhdGUga2V5IGNvbXBvbmVudHMgbmVlZCBiZSBwcmVzZW50IGFuZCBpdCBtaWdodCBzdG9yZSBleHRyYSBkYXRhCiAgICAgaW4gdGhlIFJTQSBzdHJ1Y3R1cmUsIHdoaWNoIGNhbm5vdCBiZSBhY2Nlc3NlZCBmcm9tIGJuX21vZF9leHAuCiAgICAgQnkgc2V0dGluZyBSU0FfRkxBR19FWFRfUEtFWSByc2FfbW9kX2V4cCB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgZm9yCiAgICAgcHJpdmF0ZSBrZXkgb3BlcmF0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCBzdXBwb3J0IGZvciBTUEFSQyBMaW51eC4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgcGVtX3Bhc3N3b3JkX2NiIGZ1bmN0aW9uIHR5cGUgaW5jb21wYXRpYmx5IGNoYW5nZWQgZnJvbQogICAgICAgICAgdHlwZWRlZiBpbnQgcGVtX3Bhc3N3b3JkX2NiKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCByd2ZsYWcpOwogICAgIHRvCiAgICAgICAgICAuLi4uKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGludCByd2ZsYWcsIHZvaWQgKnVzZXJkYXRhKTsKICAgICBzbyB0aGF0IGFwcGxpY2F0aW9ucyBjYW4gcGFzcyBkYXRhIHRvIHRoZWlyIGNhbGxiYWNrczoKICAgICBUaGUgUEVNW19BU04xXV97cmVhZCx3cml0ZX0uLi4gZnVuY3Rpb25zIGFuZCBtYWNyb3Mgbm93IHRha2UgYW4KICAgICBhZGRpdGlvbmFsIHZvaWQgKiBhcmd1bWVudCwgd2hpY2ggaXMganVzdCBoYW5kZWQgdGhyb3VnaCB3aGVuZXZlcgogICAgIHRoZSBwYXNzd29yZCBjYWxsYmFjayBpcyBjYWxsZWQuCiAgICAgW0RhbWllbiBNaWxsZXIgPGRtaWxsZXJAaWxvZ2ljLmNvbS5hdT47IHRpbnkgY2hhbmdlcyBieSBCb2RvIE1vZWxsZXJdCgogICAgIE5ldyBmdW5jdGlvbiBTU0xfQ1RYX3NldF9kZWZhdWx0X3Bhc3N3ZF9jYl91c2VyZGF0YS4KCiAgICAgQ29tcGF0aWJpbGl0eSBub3RlOiBBcyBtYW55IEMgaW1wbGVtZW50YXRpb25zIHB1c2ggZnVuY3Rpb24gYXJndW1lbnRzCiAgICAgb250byB0aGUgc3RhY2sgaW4gcmV2ZXJzZSBvcmRlciwgdGhlIG5ldyBsaWJyYXJ5IHZlcnNpb24gaXMgbGlrZWx5IHRvCiAgICAgaW50ZXJvcGVyYXRlIHdpdGggcHJvZ3JhbXMgdGhhdCBoYXZlIGJlZW4gY29tcGlsZWQgd2l0aCB0aGUgb2xkCiAgICAgcGVtX3Bhc3N3b3JkX2NiIGRlZmluaXRpb24gKFBFTV93aGF0ZXZlciB0YWtlcyBzb21lIGRhdGEgdGhhdAogICAgIGhhcHBlbnMgdG8gYmUgb24gdGhlIHN0YWNrIGFzIGl0cyBsYXN0IGFyZ3VtZW50LCBhbmQgdGhlIGNhbGxiYWNrCiAgICAganVzdCBpZ25vcmVzIHRoaXMgZ2FyYmFnZSk7IGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgd2hhdHNvZXZlciB0aGF0CiAgICAgdGhpcyB3aWxsIHdvcmsuCgogICopIFRoZSAtRFBMQVRGT1JNPSJcIiQoUExBVEZPUk0pXCIiIGRlZmluaXRpb24gYW5kIHRoZSBzaW1pbGFyIC1EQ0ZMQUdTPS4uLgogICAgIChib3RoIGluIGNyeXB0by9NYWtlZmlsZS5zc2wgZm9yIHVzZSBieSBjcnlwdG8vY3ZlcnNpb24uYykgY2F1c2VkCiAgICAgcHJvYmxlbXMgbm90IG9ubHkgb24gV2luZG93cywgYnV0IGFsc28gb24gc29tZSBVbml4IHBsYXRmb3Jtcy4KICAgICBUbyBhdm9pZCBwcm9ibGVtYXRpYyBjb21tYW5kIGxpbmVzLCB0aGVzZSBkZWZpbml0aW9ucyBhcmUgbm93IGluIGFuCiAgICAgYXV0by1nZW5lcmF0ZWQgZmlsZSBjcnlwdG8vYnVpbGRpbmYuaCAoY3JlYXRlZCBieSBjcnlwdG8vTWFrZWZpbGUuc3NsCiAgICAgZm9yIHN0YW5kYXJkICJtYWtlIiBidWlsZHMsIGJ5IHV0aWwvbWsxbWYucGwgZm9yICJtazFtZiIgYnVpbGRzKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBNSVBTIElJSS9JViBhc3NlbWJsZXIgbW9kdWxlIGlzIHJlaW1wbGVtZW50ZWQuCiAgICAgW0FuZHkgUG9seWFrb3ZdCgogICopIE1vcmUgREVTIGxpYnJhcnkgY2xlYW51cHM6IHJlbW92ZSByZWZlcmVuY2VzIHRvIHNyYW5kL3JhbmQgYW5kCiAgICAgZGVsZXRlIGFuIHVudXNlZCBmaWxlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgdGhlIHRoZSBmcmVlIE5ldHdpZGUgYXNzZW1ibGVyIChOQVNNKSB1bmRlciBXaW4zMiwKICAgICBzaW5jZSBub3QgbWFueSBwZW9wbGUgaGF2ZSBNQVNNIChtbCkgYW5kIGl0IGNhbiBiZSBoYXJkIHRvIG9idGFpbi4KICAgICBUaGlzIGlzIGN1cnJlbnRseSBleHBlcmltZW50YWwgYnV0IGl0IHNlZW1zIHRvIHdvcmsgT0sgYW5kIHBhc3MgYWxsCiAgICAgdGhlIHRlc3RzLiBDaGVjayBvdXQgSU5TVEFMTC5XMzIgZm9yIGluZm8uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IG1lbW9yeSBsZWFrcyBpbiBzM19jbG50LmM6IEFsbCBub24tYW5vbnltb3VzIFNTTDMvVExTMSBjb25uZWN0aW9ucwogICAgIHdpdGhvdXQgdGVtcG9yYXJ5IGtleXMga2VwdCBhbiBleHRyYSBjb3B5IG9mIHRoZSBzZXJ2ZXIga2V5LAogICAgIGFuZCBjb25uZWN0aW9ucyB3aXRoIHRlbXBvcmFyeSBrZXlzIGRpZCBub3QgZnJlZSBldmVyeXRoaW5nIGluIGNhc2UKICAgICBvZiBhbiBlcnJvci4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb24gUlNBX2NoZWNrX2tleSBhbmQgbmV3IG9wZW5zc2wgcnNhIG9wdGlvbiAtY2hlY2sKICAgICBmb3IgdmVyaWZ5aW5nIHRoZSBjb25zaXN0ZW5jeSBvZiBSU0Ega2V5cy4KICAgICBbVWxmIE1vZWxsZXIsIEJvZG8gTW9lbGxlcl0KCiAgKikgVmFyaW91cyBjaGFuZ2VzIHRvIG1ha2UgV2luMzIgY29tcGlsZSB3b3JrOiAKICAgICAxLiBDYXN0cyB0byBhdm9pZCAibG9zcyBvZiBkYXRhIiB3YXJuaW5ncyBpbiBwNV9jcnB0Mi5jCiAgICAgMi4gQ2hhbmdlIHVuc2lnbmVkIGludCB0byBpbnQgaW4gYl9kdW1wLmMgdG8gYXZvaWQgInNpZ25lZC91bnNpZ25lZAogICAgICAgIGNvbXBhcmlzb24iIHdhcm5pbmdzLgogICAgIDMuIEFkZCBza188VFlQRT5fc29ydCB0byBERUYgZmlsZSBnZW5lcmF0b3IgYW5kIGRvIG1ha2UgdXBkYXRlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBhIGRlYnVnZ2luZyBvcHRpb24gdG8gUEtDUyM1IHYyIGtleSBnZW5lcmF0aW9uIGZ1bmN0aW9uOiB3aGVuCiAgICAgeW91ICNkZWZpbmUgREVCVUdfUEtDUzVWMiBwYXNzd29yZHMsIHNhbHRzLCBpdGVyYXRpb24gY291bnRzIGFuZAogICAgIGRlcml2ZWQga2V5cyBhcmUgcHJpbnRlZCB0byBzdGRlcnIuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29weSB0aGUgZmxhZ3MgaW4gQVNOMV9TVFJJTkdfZHVwKCkuCiAgICAgW1JvbWFuIEUuIFBhdmxvdiA8cHJlQG1vLm1zay5ydT5dCgogICopIFRoZSB4NTA5IGFwcGxpY2F0aW9uIG1pc2hhbmRsZWQgc2lnbmluZyByZXF1ZXN0cyBjb250YWluaW5nIERTQQogICAgIGtleXMgd2hlbiB0aGUgc2lnbmluZyBrZXkgd2FzIGFsc28gRFNBIGFuZCB0aGUgcGFyYW1ldGVycyBkaWRuJ3QgbWF0Y2guCgogICAgIEl0IHdhcyBzdXBwb3NlZCB0byBvbWl0IHRoZSBwYXJhbWV0ZXJzIHdoZW4gdGhleSBtYXRjaGVkIHRoZSBzaWduaW5nIGtleToKICAgICB0aGUgdmVyaWZ5aW5nIHNvZnR3YXJlIHdhcyB0aGVuIHN1cHBvc2VkIHRvIGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBDQSdzCiAgICAgcGFyYW1ldGVycyBpZiB0aGV5IHdlcmUgYWJzZW50IGZyb20gdGhlIGVuZCB1c2VyIGNlcnRpZmljYXRlLgoKICAgICBPbWl0dGluZyBwYXJhbWV0ZXJzIGlzIG5vIGxvbmdlciByZWNvbW1lbmRlZC4gVGhlIHRlc3Qgd2FzIGFsc28KICAgICB0aGUgd3Jvbmcgd2F5IHJvdW5kISBUaGlzIHdhcyBwcm9iYWJseSBkdWUgdG8gdW51c3VhbCBiZWhhdmlvdXIgaW4KICAgICBFVlBfY21wX3BhcmFtZXRlcnMoKSB3aGljaCByZXR1cm5zIDEgaWYgdGhlIHBhcmFtZXRlcnMgbWF0Y2guIAogICAgIFRoaXMgbWVhbnQgdGhhdCBwYXJhbWV0ZXJzIHdlcmUgb21pdHRlZCB3aGVuIHRoZXkgKmRpZG4ndCogbWF0Y2ggYW5kCiAgICAgdGhlIGNlcnRpZmljYXRlIHdhcyB1c2VsZXNzLiBDZXJ0aWZpY2F0ZXMgc2lnbmVkIHdpdGggJ2NhJyBkaWRuJ3QgaGF2ZQogICAgIHRoaXMgYnVnLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IERvdWcgRXJpY2tzb24gPERvdWcuRXJpY2tzb25AUGFydC5ORVQ+XQoKICAqKSBNZW1vcnkgbGVhayBjaGVja2luZyAoLURDUllQVE9fTURFQlVHKSBoYWQgc29tZSBwcm9ibGVtcy4KICAgICBUaGUgaW50ZXJmYWNlIGlzIGFzIGZvbGxvd3M6CiAgICAgQXBwbGljYXRpb25zIGNhbiB1c2UKICAgICAgICAgQ1JZUFRPX21lbV9jdHJsKENSWVBUT19NRU1fQ0hFQ0tfT04pIGFrYSBNZW1DaGVja19zdGFydCgpLAogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19PRkYpIGFrYSBNZW1DaGVja19zdG9wKCk7CiAgICAgIm9mZiIgaXMgbm93IHRoZSBkZWZhdWx0LgogICAgIFRoZSBsaWJyYXJ5IGludGVybmFsbHkgdXNlcwogICAgICAgICBDUllQVE9fbWVtX2N0cmwoQ1JZUFRPX01FTV9DSEVDS19ESVNBQkxFKSBha2EgTWVtQ2hlY2tfb2ZmKCksCiAgICAgICAgIENSWVBUT19tZW1fY3RybChDUllQVE9fTUVNX0NIRUNLX0VOQUJMRSkgYWthIE1lbUNoZWNrX29uKCkKICAgICB0byBkaXNhYmxlIG1lbW9yeS1jaGVja2luZyB0ZW1wb3JhcmlseS4KCiAgICAgU29tZSBpbmNvbnNpc3RlbnQgc3RhdGVzIHRoYXQgcHJldmlvdXNseSB3ZXJlIHBvc3NpYmxlIChhbmQgd2VyZQogICAgIGV2ZW4gdGhlIGRlZmF1bHQpIGFyZSBub3cgYXZvaWRlZC4KCiAgICAgLURDUllQVE9fTURFQlVHX1RJTUUgaXMgbmV3IGFuZCBhZGRpdGlvbmFsbHkgc3RvcmVzIHRoZSBjdXJyZW50IHRpbWUKICAgICB3aXRoIGVhY2ggbWVtb3J5IGNodW5rIGFsbG9jYXRlZDsgdGhpcyBpcyBvY2Nhc2lvbmFsbHkgbW9yZSBoZWxwZnVsCiAgICAgdGhhbiBqdXN0IGhhdmluZyBhIGNvdW50ZXIuCgogICAgIC1EQ1JZUFRPX01ERUJVR19USFJFQUQgaXMgYWxzbyBuZXcgYW5kIGFkZHMgdGhlIHRocmVhZCBJRC4KCiAgICAgLURDUllQVE9fTURFQlVHX0FMTCBlbmFibGVzIGFsbCBvZiB0aGUgYWJvdmUsIHBsdXMgYW55IGZ1dHVyZQogICAgIGV4dGVuc2lvbnMuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW50cm9kdWNlICJtb2RlIiBmb3IgU1NMIHN0cnVjdHVyZXMgKHdpdGggZGVmYXVsdHMgaW4gU1NMX0NUWCksCiAgICAgd2hpY2ggbGFyZ2VseSBwYXJhbGxlbHMgIm9wdGlvbnMiLCBidXQgaXMgZm9yIGNoYW5naW5nIEFQSSBiZWhhdmlvdXIsCiAgICAgd2hlcmVhcyAib3B0aW9ucyIgYXJlIGFib3V0IHByb3RvY29sIGJlaGF2aW91ci4KICAgICBJbml0aWFsICJtb2RlIiBmbGFncyBhcmU6CgogICAgIFNTTF9NT0RFX0VOQUJMRV9QQVJUSUFMX1dSSVRFICAgQWxsb3cgU1NMX3dyaXRlIHRvIHJlcG9ydCBzdWNjZXNzIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgc2luZ2xlIHJlY29yZCBoYXMgYmVlbiB3cml0dGVuLgogICAgIFNTTF9NT0RFX0FDQ0VQVF9NT1ZJTkdfV1JJVEVfQlVGRkVSICBEb24ndCBpbnNpc3QgdGhhdCBTU0xfd3JpdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHJpZXMgdXNlIHRoZSBzYW1lIGJ1ZmZlciBsb2NhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCdXQgYWxsIG9mIHRoZSBjb250ZW50cyBtdXN0IGJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3BpZWQhKQogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeDogU1NMX3NldF9vcHRpb25zIGlnbm9yZWQgaXRzIHBhcmFtZXRlciwgb25seSBTU0xfQ1RYX3NldF9vcHRpb25zCiAgICAgd29ya2VkLgoKICAqKSBGaXggcHJvYmxlbXMgd2l0aCBuby1obWFjIGV0Yy4KICAgICBbVWxmIE32bGxlciwgcG9pbnRlZCBvdXQgYnkgQnJpYW4gV2VsbGluZ3RvbiA8YndlbGxpbmdAdGlzbGFicy5jb20+XQoKICAqKSBOZXcgZnVuY3Rpb25zIFJTQV9nZXRfZGVmYXVsdF9tZXRob2QoKSwgUlNBX3NldF9tZXRob2QoKSBhbmQKICAgICBSU0FfZ2V0X21ldGhvZCgpLiBUaGVzZSBhbGxvd3MgcmVwbGFjZW1lbnQgb2YgUlNBX01FVEhPRHMgd2l0aG91dCBoYXZpbmcKICAgICB0byBtZXNzIGFyb3VuZCB3aXRoIHRoZSBpbnRlcm5hbHMgb2YgYW4gUlNBIHN0cnVjdHVyZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggbWVtb3J5IGxlYWtzIGluIERTQV9kb19zaWduIGFuZCBEU0FfaXNfcHJpbWUuCiAgICAgQWxzbyByZWFsbHkgZW5hYmxlIG1lbW9yeSBsZWFrIGNoZWNrcyBpbiBvcGVuc3NsLmMgYW5kIGluIHNvbWUKICAgICB0ZXN0IHByb2dyYW1zLgogICAgIFtDaGFkIEMuIE11bGxpZ2FuLCBCb2RvIE1vZWxsZXJdCgogICopIEZpeCBhIGJ1ZyBpbiBkMmlfQVNOMV9JTlRFR0VSKCkgYW5kIGkyZF9BU04xX0lOVEVHRVIoKSB3aGljaCBjYW4gbWVzcwogICAgIHVwIHRoZSBsZW5ndGggb2YgbmVnYXRpdmUgaW50ZWdlcnMuIFRoaXMgaGFzIG5vdyBiZWVuIHNpbXBsaWZpZWQgdG8ganVzdAogICAgIHN0b3JlIHRoZSBsZW5ndGggd2hlbiBpdCBpcyBmaXJzdCBkZXRlcm1pbmVkIGFuZCB1c2UgaXQgbGF0ZXIsIHJhdGhlcgogICAgIHRoYW4gdHJ5aW5nIHRvIGtlZXAgdHJhY2sgb2Ygd2hlcmUgZGF0YSBpcyBjb3BpZWQgYW5kIHVwZGF0aW5nIGl0IHRvCiAgICAgcG9pbnQgdG8gdGhlIGVuZC4KICAgICBbU3RldmUgSGVuc29uLCByZXBvcnRlZCBieSBCcmllbiBXaGVlbGVyCiAgICAgIDxid2hlZWxlckBhdXRoZW50aWNhLXNlY3VyaXR5LmNvbT5dCgogICopIEFkZCBhIG5ldyBmdW5jdGlvbiBQS0NTN19zaWduYXR1cmVWZXJpZnkuIFRoaXMgYWxsb3dzIHRoZSB2ZXJpZmljYXRpb24KICAgICBvZiBhIFBLQ1MjNyBzaWduYXR1cmUgYnV0IHdpdGggdGhlIHNpZ25pbmcgY2VydGlmaWNhdGUgcGFzc2VkIHRvIHRoZQogICAgIGZ1bmN0aW9uIGl0c2VsZi4gVGhpcyBjb250cmFzdHMgd2l0aCBQS0NTN19kYXRhVmVyaWZ5IHdoaWNoIGFzc3VtZXMgdGhlCiAgICAgY2VydGlmaWNhdGUgaXMgcHJlc2VudCBpbiB0aGUgUEtDUyM3IHN0cnVjdHVyZS4gVGhpcyBpc24ndCBhbHdheXMgdGhlCiAgICAgY2FzZTogY2VydGlmaWNhdGVzIGNhbiBiZSBvbWl0dGVkIGZyb20gYSBQS0NTIzcgc3RydWN0dXJlIGFuZCBiZQogICAgIGRpc3RyaWJ1dGVkIGJ5ICJvdXQgb2YgYmFuZCIgbWVhbnMgKHN1Y2ggYXMgYSBjZXJ0aWZpY2F0ZSBkYXRhYmFzZSkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ29tcGxldGUgdGhlIFBFTV8qIG1hY3JvcyB3aXRoIERFQ0xBUkVfUEVNIHZlcnNpb25zIHRvIHJlcGxhY2UgdGhlCiAgICAgZnVuY3Rpb24gcHJvdG90eXBlcyBpbiBwZW0uaCwgYWxzbyBjaGFuZ2UgdXRpbC9ta2RlZi5wbCB0byBhZGQgdGhlCiAgICAgbmVjZXNzYXJ5IGZ1bmN0aW9uIG5hbWVzLiAKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBtazFtZi5wbCAodXNlZCBieSBXaW5kb3dzIGJ1aWxkcykgZGlkIG5vdCBwcm9wZXJseSByZWFkIHRoZQogICAgIG9wdGlvbnMgc2V0IGJ5IENvbmZpZ3VyZSBpbiB0aGUgdG9wIGxldmVsIE1ha2VmaWxlLCBhbmQgQ29uZmlndXJlCiAgICAgd2FzIG5vdCBldmVuIGFibGUgdG8gd3JpdGUgbW9yZSB0aGFuIG9uZSBvcHRpb24gY29ycmVjdGx5LgogICAgIEZpeGVkLCBub3cgIm5vLWlkZWEgbm8tcmM1IC1EQ1JZUFRPX01ERUJVRyIgZXRjLiB3b3JrcyBhcyBpbnRlbmRlZC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBOZXcgZnVuY3Rpb25zIENPTkZfbG9hZF9iaW8oKSBhbmQgQ09ORl9sb2FkX2ZwKCkgdG8gYWxsb3cgYSBjb25maWcKICAgICBmaWxlIHRvIGJlIGxvYWRlZCBmcm9tIGEgQklPIG9yIEZJTEUgcG9pbnRlci4gVGhlIEJJTyB2ZXJzaW9uIHdpbGwKICAgICBmb3IgZXhhbXBsZSBhbGxvdyBtZW1vcnkgQklPcyB0byBjb250YWluIGNvbmZpZyBpbmZvLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE5ldyBmdW5jdGlvbiAiQ1JZUFRPX251bV9sb2NrcyIgdGhhdCByZXR1cm5zIENSWVBUT19OVU1fTE9DS1MuCiAgICAgV2hvZXZlciBob3BlcyB0byBhY2hpZXZlIHNoYXJlZC1saWJyYXJ5IGNvbXBhdGliaWxpdHkgYWNyb3NzIHZlcnNpb25zCiAgICAgbXVzdCB1c2UgdGhpcywgbm90IHRoZSBjb21waWxlLXRpbWUgbWFjcm8uCiAgICAgKEV4ZXJjaXNlIDAuOS40OiBXaGljaCBpcyB0aGUgbWluaW11bSBsaWJyYXJ5IHZlcnNpb24gcmVxdWlyZWQgYnkKICAgICBzdWNoIHByb2dyYW1zPykKICAgICBOb3RlOiBBbGwgdGhpcyBhcHBsaWVzIG9ubHkgdG8gbXVsdGktdGhyZWFkZWQgcHJvZ3JhbXMsIG90aGVycyBkb24ndAogICAgIG5lZWQgbG9ja3MuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgQWRkIG1pc3NpbmcgY2FzZSB0byBzM19jbG50LmMgc3RhdGUgbWFjaGluZSAtLSBvbmUgb2YgdGhlIG5ldyBTU0wgdGVzdHMKICAgICB0aHJvdWdoIGEgQklPIHBhaXIgdHJpZ2dlcmVkIHRoZSBkZWZhdWx0IGNhc2UsIGkuZS4KICAgICBTU0xlcnIoLi4uLFNTTF9SX1VOS05PV05fU1RBVEUpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyAiQklPIHBhaXIiIGNvbmNlcHQgKGNyeXB0by9iaW8vYnNzX2Jpby5jKSBzbyB0aGF0IGFwcGxpY2F0aW9ucwogICAgIGNhbiB1c2UgdGhlIFNTTCBsaWJyYXJ5IGV2ZW4gaWYgbm9uZSBvZiB0aGUgc3BlY2lmaWMgQklPcyBpcwogICAgIGFwcHJvcHJpYXRlLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEZpeCBhIGJ1ZyBpbiBpMmRfRFNBUHVibGljS2V5KCkgd2hpY2ggbWVhbnQgaXQgcmV0dXJuZWQgdGhlIHdyb25nIHZhbHVlCiAgICAgZm9yIHRoZSBlbmNvZGVkIGxlbmd0aC4KICAgICBbSmVvbiBLeW91bmdIbyA8a2hqZW9uQHNkcy5zYW1zdW5nLmNvLmtyPl0KCiAgKikgQWRkIGluaXRpYWwgZG9jdW1lbnRhdGlvbiBvZiB0aGUgWDUwOVYzIGZ1bmN0aW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgcGFpciBvZiBmdW5jdGlvbnMgUEVNX3dyaXRlX1BLQ1M4UHJpdmF0ZUtleSgpIGFuZCAKICAgICBQRU1fd3JpdGVfYmlvX1BLQ1M4UHJpdmF0ZUtleSgpIHRoYXQgYXJlIGVxdWl2YWxlbnQgdG8KICAgICBQRU1fd3JpdGVfUHJpdmF0ZUtleSgpIGFuZCBQRU1fd3JpdGVfYmlvX1ByaXZhdGVLZXkoKSBidXQgdXNlIHRoZSBtb3JlCiAgICAgc2VjdXJlIFBLQ1MjOCBwcml2YXRlIGtleSBmb3JtYXQgd2l0aCBhIGhpZ2ggaXRlcmF0aW9uIGNvdW50LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBkZXRlcm1pbmF0aW9uIG9mIFBlcmwgaW50ZXJwcmV0ZXI6IEEgcGVybCBvciBwZXJsNQogICAgIF9kaXJlY3RvcnlfIGluICRQQVRIIHdhcyBhbHNvIGFjY2VwdGVkIGFzIHRoZSBpbnRlcnByZXRlci4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IGRlbW9zL3NpZ24vc2lnbi5jOiB3ZWxsIHRoZXJlIHdhc24ndCBhbnl0aGluZyBzdHJpY3RseSBzcGVha2luZwogICAgIHdyb25nIHdpdGggaXQgYnV0IGl0IHdhcyB2ZXJ5IG9sZCBhbmQgZGlkIHRoaW5ncyBsaWtlIGNhbGxpbmcKICAgICBQRU1fQVNOMV9yZWFkKCkgZGlyZWN0bHkgYW5kIHVzZWQgTUQ1IGZvciB0aGUgaGFzaCBub3QgdG8gbWVudGlvbiBzb21lCiAgICAgdW51c3VhbCBmb3JtYXR0aW5nLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBkZW1vcy9zZWxmc2lnbi5jOiBpdCB1c2VkIG9ic29sZXRlIGFuZCBkZWxldGVkIGZ1bmN0aW9ucywgY2hhbmdlZAogICAgIHRvIHVzZSB0aGUgbmV3IGV4dGVuc2lvbiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEltcGxlbWVudCB0aGUgUEVNX3JlYWQvUEVNX3dyaXRlIGZ1bmN0aW9ucyBpbiBjcnlwdG8vcGVtL3BlbV9hbGwuYwogICAgIHdpdGggbWFjcm9zLiBUaGlzIHNob3VsZCBtYWtlIGl0IGVhc2llciB0byBjaGFuZ2UgdGhlaXIgZm9ybSwgYWRkIGV4dHJhCiAgICAgYXJndW1lbnRzIGV0Yy4gRml4IGEgZmV3IFBFTSBwcm90b3R5cGVzIHdoaWNoIGRpZG4ndCBoYXZlIGNpcGhlciBhcyBhCiAgICAgY29uc3RhbnQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHRvIGNvbmZpZ3VyYXRpb24gdGFibGUgYSBuZXcgZW50cnkgdGhhdCBjYW4gc3BlY2lmeSBhbiBhbHRlcm5hdGl2ZQogICAgIG5hbWUgZm9yIHVuaXN0ZC5oIChmb3IgcHJlLVBPU0lYIHN5c3RlbXMpOyB3ZSBuZWVkIHRoaXMgZm9yIE5lWFRzdGVwLAogICAgIGFjY29yZGluZyB0byBNYXJrIENyaXNwaW4gPE1SQ0BQYW5kYS5DT00+LgogICAgIFtCb2RvIE1vZWxsZXJdCgojaWYgMAogICopIERFUyBDQkMgZGlkIG5vdCB1cGRhdGUgdGhlIElWLiBXZWlyZC4KICAgICBbQmVuIExhdXJpZV0KI2Vsc2UKICAgICBkZXNfY2JjX2VuY3J5cHQgZG9lcyBub3QgdXBkYXRlIHRoZSBJViwgYnV0IGRlc19uY2JjX2VuY3J5cHQgZG9lcy4KICAgICBDaGFuZ2luZyB0aGUgYmVoYXZpb3VyIG9mIHRoZSBmb3JtZXIgbWlnaHQgYnJlYWsgZXhpc3RpbmcgcHJvZ3JhbXMgLS0KICAgICB3aGVyZSBJViB1cGRhdGluZyBpcyBuZWVkZWQsIGRlc19uY2JjX2VuY3J5cHQgY2FuIGJlIHVzZWQuCiNlbmRpZgoKICAqKSBXaGVuIGJudGVzdCBpcyBydW4gZnJvbSAibWFrZSB0ZXN0IiBpdCBkcml2ZXMgYmMgdG8gY2hlY2sgaXRzCiAgICAgY2FsY3VsYXRpb25zLCBhcyB3ZWxsIGFzIGludGVybmFsbHkgY2hlY2tpbmcgdGhlbS4gSWYgYW4gaW50ZXJuYWwgY2hlY2sKICAgICBmYWlscywgaXQgbmVlZHMgdG8gY2F1c2UgYmMgdG8gZ2l2ZSBhIG5vbi16ZXJvIHJlc3VsdCBvciBtYWtlIHRlc3QgY2FycmllcwogICAgIG9uIHdpdGhvdXQgbm90aWNpbmcgdGhlIGZhaWx1cmUuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBERVMgbGlicmFyeSBjbGVhbnVwcy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFBLQ1MjNSB2Mi4wIFBCRSBhbGdvcml0aG1zLiBUaGlzIHdpbGwgcGVybWl0IFBLQ1MjOCB0byBiZQogICAgIHVzZWQgd2l0aCBhbnkgY2lwaGVyIHVubGlrZSBQS0NTIzUgdjEuNSB3aGljaCBjYW4gYXQgbW9zdCBoYW5kbGUgNjQgYml0CiAgICAgY2lwaGVycy4gTk9URTogYWx0aG91Z2ggdGhlIGtleSBkZXJpdmF0aW9uIGZ1bmN0aW9uIGhhcyBiZWVuIHZlcmlmaWVkCiAgICAgYWdhaW5zdCBzb21lIHB1Ymxpc2hlZCB0ZXN0IHZlY3RvcnMgaXQgaGFzIG5vdCBiZWVuIGV4dGVuc2l2ZWx5IHRlc3RlZAogICAgIHlldC4gQWRkZWQgYSAtdjIgImNpcGhlciIgb3B0aW9uIHRvIHBrY3M4IGFwcGxpY2F0aW9uIHRvIGFsbG93IHRoZSB1c2UKICAgICBvZiB2Mi4wLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEluc3RlYWQgb2YgIm1rZGlyIC1wIiwgd2hpY2ggaXMgbm90IGZ1bGx5IHBvcnRhYmxlLCB1c2UgbmV3CiAgICAgUGVybCBzY3JpcHQgInV0aWwvbWtkaXItcC5wbCIuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmV3cml0ZSB0aGUgd2F5IHBhc3N3b3JkIGJhc2VkIGVuY3J5cHRpb24gKFBCRSkgaXMgaGFuZGxlZC4gSXQgdXNlZCB0bwogICAgIGFzc3VtZSB0aGF0IHRoZSBBU04xIEFsZ29yaXRobUlkZW50aWZpZXIgcGFyYW1ldGVyIHdhcyBhIFBCRVBhcmFtZXRlcgogICAgIHN0cnVjdHVyZS4gVGhpcyB3YXMgdHJ1ZSBmb3IgdGhlIFBLQ1MjNSB2MS41IGFuZCBQS0NTIzEyIFBCRSBhbGdvcml0aG1zCiAgICAgYnV0IGRvZXNuJ3QgYXBwbHkgdG8gUEtDUyM1IHYyLjAgd2hlcmUgaXQgY2FuIGJlIHNvbWV0aGluZyBlbHNlLiBOb3cKICAgICB0aGUgJ3BhcmFtZXRlcicgZmllbGQgb2YgdGhlIEFsZ29yaXRobUlkZW50aWZpZXIgaXMgcGFzc2VkIHRvIHRoZQogICAgIHVuZGVybHlpbmcga2V5IGdlbmVyYXRpb24gZnVuY3Rpb24gc28gaXQgbXVzdCBkbyBpdHMgb3duIEFTTjEgcGFyc2luZy4KICAgICBUaGlzIGhhcyBhbHNvIGNoYW5nZWQgdGhlIEVWUF9QQkVfQ2lwaGVySW5pdCgpIGZ1bmN0aW9uIHdoaWNoIG5vdyBoYXMgYQogICAgICdwYXJhbWV0ZXInIGFyZ3VtZW50IGluc3RlYWQgb2YgbGl0ZXJhbCBzYWx0IGFuZCBpdGVyYXRpb24gY291bnQgdmFsdWVzCiAgICAgYW5kIHRoZSBmdW5jdGlvbiBFVlBfUEJFX0FMR09SX0NpcGhlckluaXQoKSBoYXMgYmVlbiBkZWxldGVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFN1cHBvcnQgZm9yIFBLQ1MjNSB2MS41IGNvbXBhdGlibGUgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiBhbGdvcml0aG1zCiAgICAgYW5kIFBLQ1MjOCBmdW5jdGlvbmFsaXR5LiBOZXcgJ3BrY3M4JyBhcHBsaWNhdGlvbiBsaW5rZWQgdG8gb3BlbnNzbC4KICAgICBOZWVkZWQgdG8gY2hhbmdlIHRoZSBQRU1fU1RSSU5HX0VWUF9QS0VZIHZhbHVlIHdoaWNoIHdhcyBqdXN0ICJQUklWQVRFCiAgICAgS0VZIiBiZWNhdXNlIHRoaXMgY2xhc2hlZCB3aXRoIFBLQ1MjOCB1bmVuY3J5cHRlZCBzdHJpbmcuIFNpbmNlIHRoaXMKICAgICB2YWx1ZSB3YXMganVzdCB1c2VkIGFzIGEgIm1hZ2ljIHN0cmluZyIgYW5kIG5vdCB1c2VkIGRpcmVjdGx5IGl0cwogICAgIHZhbHVlIGRvZXNuJ3QgbWF0dGVyLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEludHJvZHVjZSBzb21lIHNlbWJsYW5jZSBvZiBjb25zdCBjb3JyZWN0bmVzcyB0byBCTi4gU2hhbWUgQyBkb2Vzbid0CiAgICAgc3VwcG9ydCBtdXRhYmxlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSAibGludXgtc3BhcmM2NCIgY29uZmlndXJhdGlvbiAodWx0cmFwZW5ndWluKS4KICAgICBbUmF5IE1pbGxlciA8cmF5Lm1pbGxlckBvdWNzLm94LmFjLnVrPl0KICAgICAibGludXgtc3BhcmMiIGNvbmZpZ3VyYXRpb24uCiAgICAgW0NocmlzdGlhbiBGb3JzdGVyIDxmb0BoYXdvLnN0dy51bmktZXJsYW5nZW4uZGU+XQoKICAqKSBjb25maWcgbm93IGdlbmVyYXRlcyBuby14eHggb3B0aW9ucyBmb3IgbWlzc2luZyBjaXBoZXJzLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBTdXBwb3J0IHRoZSBFQkNESUMgY2hhcmFjdGVyIHNldCAod29yayBpbiBwcm9ncmVzcykuCiAgICAgRmlsZSBlYmNkaWMuYyBub3QgeWV0IGluY2x1ZGVkIGJlY2F1c2UgaXQgaGFzIGEgZGlmZmVyZW50IGxpY2Vuc2UuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBTdXBwb3J0IEJTMjAwMC9PU0QtUE9TSVguCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+XQoKICAqKSBNYWtlIGNhbGxiYWNrcyBmb3Iga2V5IGdlbmVyYXRpb24gdXNlIHZvaWQgKiBpbnN0ZWFkIG9mIGNoYXIgKi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBTL01JTUUgc2FtcGxlcyBjb21waWxlIChub3QgeWV0IHRlc3RlZCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEFkZGl0aW9uYWwgdHlwZXNhZmUgc3RhY2tzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBOZXcgY29uZmlndXJhdGlvbiB2YXJpYW50cyAiYnNkaS1lbGYtZ2NjIiAoQlNEL09TIDQueCkuCiAgICAgW0JvZG8gTW9lbGxlcl0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4zIGFuZCAwLjkuM2EgIFsyOSBNYXkgMTk5OV0KCiAgKikgTmV3IGNvbmZpZ3VyYXRpb24gdmFyaWFudCAic2NvNS1nY2MiLgoKICAqKSBVcGRhdGVkIHNvbWUgZGVtb3MuCiAgICAgW1NlYW4gTyBSaW9yZGFpbiwgV2FkZSBTY2hvbGluZV0KCiAgKikgQWRkIG1pc3NpbmcgQklPX2ZyZWUgYXQgZXhpdCBvZiBwa2NzMTIgYXBwbGljYXRpb24uCiAgICAgW1d1IFpoaWdhbmddCgogICopIEZpeCBtZW1vcnkgbGVhayBpbiBjb25mLmMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgVXBkYXRlcyBmb3IgV2luMzIgdG8gYXNzZW1ibGVyIHZlcnNpb24gb2YgTUQ1LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFNldCAjISBwYXRoIHRvIHBlcmwgaW4gYXBwcy9kZXJfY2hvcCB0byB3aGVyZSB3ZSBmb3VuZCBpdAogICAgIGluc3RlYWQgb2YgdXNpbmcgYSBmaXhlZCBwYXRoLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIFNIQSBsaWJyYXJ5IGNoYW5nZXMgZm9yIGlyaXg2NC1taXBzNC1jYy4KICAgICBbQW5keSBQb2x5YWtvdl0KCiAgKikgSW1wcm92ZW1lbnRzIGZvciBWTVMgc3VwcG9ydC4KICAgICBbUmljaGFyZCBMZXZpdHRlXQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjJiIGFuZCAwLjkuMyAgWzI0IE1heSAxOTk5XQoKICAqKSBCaWdudW0gbGlicmFyeSBidWcgZml4LiBJUklYIDYgcGFzc2VzICJtYWtlIHRlc3QiIG5vdyEKICAgICBUaGlzIGFsc28gYXZvaWRzIHRoZSBwcm9ibGVtcyB3aXRoIFNDNC4yIGFuZCB1bnBhdGNoZWQgU0M1LiAgCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBza19udW0sIHNrX3ZhbHVlIGFuZCBza19zZXQgdG8gcmVwbGFjZSB0aGUgcHJldmlvdXMgbWFjcm9zLgogICAgIFRoZXNlIGFyZSByZXF1aXJlZCBiZWNhdXNlIG9mIHRoZSB0eXBlc2FmZSBzdGFjayB3b3VsZCBvdGhlcndpc2UgYnJlYWsgCiAgICAgZXhpc3RpbmcgY29kZS4gSWYgb2xkIGNvZGUgdXNlZCBhIHN0cnVjdHVyZSBtZW1iZXIgd2hpY2ggdXNlZCB0byBiZSBTVEFDSwogICAgIGFuZCBpcyBub3cgU1RBQ0tfT0YgKGZvciBleGFtcGxlIGNlcnQgaW4gYSBQS0NTN19TSUdORUQgc3RydWN0dXJlKSB3aXRoCiAgICAgc2tfbnVtIG9yIHNrX3ZhbHVlIGl0IHdvdWxkIHByb2R1Y2UgYW4gZXJyb3IgYmVjYXVzZSB0aGUgbnVtLCBkYXRhIG1lbWJlcnMKICAgICBhcmUgbm90IHByZXNlbnQgaW4gU1RBQ0tfT0YuIE5vdyBpdCBqdXN0IHByb2R1Y2VzIGEgd2FybmluZy4gc2tfc2V0CiAgICAgcmVwbGFjZXMgdGhlIG9sZCBtZXRob2Qgb2YgYXNzaWduaW5nIGEgdmFsdWUgdG8gc2tfdmFsdWUKICAgICAoZS5nLiBza192YWx1ZSh4LCBpKSA9IHkpIHdoaWNoIHRoZSBsaWJyYXJ5IHVzZWQgaW4gYSBmZXcgY2FzZXMuIEFueSBjb2RlCiAgICAgdGhhdCBkb2VzIHRoaXMgd2lsbCBubyBsb25nZXIgd29yayAoYW5kIHNob3VsZCB1c2Ugc2tfc2V0IGluc3RlYWQpIGJ1dAogICAgIHRoaXMgY291bGQgYmUgcmVnYXJkZWQgYXMgYSAicXVlc3Rpb25hYmxlIiBiZWhhdmlvdXIgYW55d2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCBtb3N0IG9mIHRoZSBvdGhlciBQS0NTIzcgYnVncy4gVGhlICJleHBlcmltZW50YWwiIGNvZGUgY2FuIG5vdwogICAgIGNvcnJlY3RseSBoYW5kbGUgZW5jcnlwdGVkIFMvTUlNRSBkYXRhLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSB0eXBlIG9mIHZhcmlvdXMgREVTIGZ1bmN0aW9uIGFyZ3VtZW50cyBmcm9tIGRlc19jYmxvY2sKICAgICAod2hpY2ggbWVhbnMsIGluIGZ1bmN0aW9uIGFyZ3VtZW50IGRlY2xhcmF0aW9ucywgcG9pbnRlciB0byBjaGFyKQogICAgIHRvIGRlc19jYmxvY2sgKiAobWVhbmluZyBwb2ludGVyIHRvIGFycmF5IHdpdGggOCBjaGFyIGVsZW1lbnRzKSwKICAgICB3aGljaCBhbGxvd3MgdGhlIGNvbXBpbGVyIHRvIGRvIG1vcmUgdHlwZWNoZWNraW5nOyBpdCB3YXMgbGlrZQogICAgIHRoYXQgYmFjayBpbiBTU0xlYXksIGJ1dCB3aXRoIGxvdHMgb2YgdWdseSBjYXN0cy4KCiAgICAgSW50cm9kdWNlIG5ldyB0eXBlIGNvbnN0X2Rlc19jYmxvY2suCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgUmVvcmdhbmlzZSB0aGUgUEtDUyM3IGxpYnJhcnkgYW5kIGdldCByaWQgb2Ygc29tZSBvZiB0aGUgbW9yZSBvYnZpb3VzCiAgICAgcHJvYmxlbXM6IGZpbmQgUmVjaXBpZW50SW5mbyBzdHJ1Y3R1cmUgdGhhdCBtYXRjaGVzIHJlY2lwaWVudCBjZXJ0aWZpY2F0ZQogICAgIGFuZCBpbml0aWFsaXNlIHRoZSBBU04xIHN0cnVjdHVyZXMgcHJvcGVybHkgYmFzZWQgb24gcGFzc2VkIGNpcGhlci4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBCZWxhdGVkbHkgbWFrZSB0aGUgQk4gdGVzdHMgYWN0dWFsbHkgY2hlY2sgdGhlIHJlc3VsdHMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEZpeCB0aGUgZW5jb2RpbmcgYW5kIGRlY29kaW5nIG9mIG5lZ2F0aXZlIEFTTjEgSU5URUdFUlMgYW5kIGNvbnZlcnNpb24KICAgICB0byBhbmQgZnJvbSBCTnM6IGl0IHdhcyBjb21wbGV0ZWx5IGJyb2tlbi4gTmV3IGNvbXBpbGF0aW9uIG9wdGlvbgogICAgIE5FR19QVUJLRVlfQlVHIHRvIGFsbG93IGZvciBzb21lIGJyb2tlbiBjZXJ0aWZpY2F0ZXMgdGhhdCBlbmNvZGUgcHVibGljCiAgICAga2V5IGVsZW1lbnRzIGFzIG5lZ2F0aXZlIGludGVnZXJzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFJlb3JnYW5pemUgYW5kIHNwZWVkIHVwIE1ENS4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBWTVMgc3VwcG9ydC4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxyaWNoYXJkQGxldml0dGUub3JnPl0KCiAgKikgTmV3IG9wdGlvbiAtb3V0IHRvIGFzbjFwYXJzZSB0byBhbGxvdyB0aGUgcGFyc2VkIHN0cnVjdHVyZSB0byBiZQogICAgIG91dHB1dCB0byBhIGZpbGUuIFRoaXMgaXMgbW9zdCB1c2VmdWwgd2hlbiBjb21iaW5lZCB3aXRoIHRoZSAtc3RycGFyc2UKICAgICBvcHRpb24gdG8gZXhhbWluZSB0aGUgb3V0cHV0IG9mIHRoaW5ncyBsaWtlIE9DVEVUIFNUUklOR1MuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSBTU0wgbGlicmFyeSBhIGxpdHRsZSBtb3JlIGZvb2wtcHJvb2YgYnkgbm90IHJlcXVpcmluZyBhbnkgbG9uZ2VyCiAgICAgdGhhdCBTU0xfc2V0X3thY2NlcHQsY29ubmVjdH1fc3RhdGUgYmUgY2FsbGVkIGJlZm9yZQogICAgIFNTTF97YWNjZXB0LGNvbm5lY3R9IG1heSBiZSB1c2VkIChTU0xfc2V0Xy4uLl9zdGF0ZSBpcyBvbWl0dGVkCiAgICAgaW4gbWFueSBhcHBsaWNhdGlvbnMgYmVjYXVzZSB1c3VhbGx5IGV2ZXJ5dGhpbmcgKmFwcGVhcmVkKiB0byB3b3JrIGFzCiAgICAgaW50ZW5kZWQgYW55d2F5IC0tIG5vdyBpdCByZWFsbHkgd29ya3MgYXMgaW50ZW5kZWQpLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE1vdmUgb3BlbnNzbC5jbmYgb3V0IG9mIGxpYi8uCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCB2YXJpb3VzIHRoaW5ncyB0byBsZXQgT3BlblNTTCBldmVuIHBhc3MgYGBlZ2NjIC1waXBlIC1PMiAtV2FsbAogICAgIC1Xc2hhZG93IC1XcG9pbnRlci1hcml0aCAtV2Nhc3QtYWxpZ24gLVdtaXNzaW5nLXByb3RvdHlwZXMKICAgICAtV21pc3NpbmctZGVjbGFyYXRpb25zIC1XbmVzdGVkLWV4dGVybnMgLVdpbmxpbmUnJyB3aXRoIEVHQ1MgMS4xLjIrIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBWYXJpb3VzIGZpeGVzIHRvIHRoZSBFVlAgYW5kIFBLQ1MjNyBjb2RlLiBJdCBtYXkgbm93IGJlIGFibGUgdG8KICAgICBoYW5kbGUgUEtDUyM3IGVudmVsb3BlZCBkYXRhIHByb3Blcmx5LgogICAgIFtTZWJhc3RpYW4gQWtlcm1hbiA8c2FrQHBhcmFsbGVsY29uc3VsdGluZy5jb20+LCBtb2RpZmllZCBieSBTdGV2ZV0KCiAgKikgQ3JlYXRlIGEgZHVwbGljYXRlIG9mIHRoZSBTU0xfQ1RYJ3MgQ0VSVCBpbiBTU0xfbmV3IGluc3RlYWQgb2YKICAgICBjb3B5aW5nIHBvaW50ZXJzLiAgVGhlIGNlcnRfc3QgaGFuZGxpbmcgaXMgY2hhbmdlZCBieSB0aGlzIGluCiAgICAgdmFyaW91cyB3YXlzIChhbmQgdGh1cyB3aGF0IHVzZWQgdG8gYmUga25vd24gYXMgY3R4LT5kZWZhdWx0X2NlcnQKICAgICBpcyBub3cgY2FsbGVkIGN0eC0+Y2VydCwgc2luY2Ugd2UgZG9uJ3QgcmVzb3J0IHRvIHMtPmN0eC0+W2RlZmF1bHRfXWNlcnQKICAgICBhbnkgbG9uZ2VyIHdoZW4gcy0+Y2VydCBkb2VzIG5vdCBnaXZlIHVzIHdoYXQgd2UgbmVlZCkuCiAgICAgc3NsX2NlcnRfaW5zdGFudGlhdGUgYmVjb21lcyBvYnNvbGV0ZSBieSB0aGlzIGNoYW5nZS4KICAgICBBcyBzb29uIGFzIHdlJ3ZlIGdvdCB0aGUgbmV3IGNvZGUgcmlnaHQgKHBvc3NpYmx5IGl0IGFscmVhZHkgaXM/KSwKICAgICB3ZSBoYXZlIHNvbHZlZCBhIGNvdXBsZSBvZiBidWdzIG9mIHRoZSBlYXJsaWVyIGNvZGUgd2hlcmUgcy0+Y2VydAogICAgIHdhcyB1c2VkIGFzIGlmIGl0IGNvdWxkIG5vdCBoYXZlIGJlZW4gc2hhcmVkIHdpdGggb3RoZXIgU1NMIHN0cnVjdHVyZXMuCgogICAgIE5vdGUgdGhhdCB1c2luZyB0aGUgU1NMIEFQSSBpbiBjZXJ0YWluIGRpcnR5IHdheXMgbm93IHdpbGwgcmVzdWx0CiAgICAgaW4gZGlmZmVyZW50IGJlaGF2aW91ciB0aGFuIG9ic2VydmVkIHdpdGggZWFybGllciBsaWJyYXJ5IHZlcnNpb25zOgogICAgIENoYW5naW5nIHNldHRpbmdzIGZvciBhbiBTU0xfQ1RYICpjdHggYWZ0ZXIgaGF2aW5nIGRvbmUgcyA9IFNTTF9uZXcoY3R4KQogICAgIGRvZXMgbm90IGluZmx1ZW5jZSBzIGFzIGl0IHVzZWQgdG8uCiAgICAgCiAgICAgSW4gb3JkZXIgdG8gY2xlYW4gdXAgdGhpbmdzIG1vcmUgdGhvcm91Z2hseSwgaW5zaWRlIFNTTF9TRVNTSU9OCiAgICAgd2UgZG9uJ3QgdXNlIENFUlQgYW55IGxvbmdlciwgYnV0IGEgbmV3IHN0cnVjdHVyZSBTRVNTX0NFUlQKICAgICB0aGF0IGhvbGRzIHBlci1zZXNzaW9uIGRhdGEgKGlmIGF2YWlsYWJsZSk7IGN1cnJlbnRseSwgdGhpcyBpcwogICAgIHRoZSBwZWVyJ3MgY2VydGlmaWNhdGUgY2hhaW4gYW5kLCBmb3IgY2xpZW50cywgdGhlIHNlcnZlcidzIGNlcnRpZmljYXRlCiAgICAgYW5kIHRlbXBvcmFyeSBrZXkuICBDRVJUIGhvbGRzIG9ubHkgdGhvc2UgdmFsdWVzIHRoYXQgY2FuIGhhdmUKICAgICBtZWFuaW5nZnVsIGRlZmF1bHRzIGluIGFuIFNTTF9DVFguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9uIFg1MDlWM19FWFRfaTJkKCkgdG8gY3JlYXRlIGFuIFg1MDlfRVhURU5TSU9OIHN0cnVjdHVyZQogICAgIGZyb20gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiBWYXJpb3VzIFBLQ1MjNyBmaXhlczogcmVtb3ZlIHNvbWUKICAgICBldmlsIGNhc3RzIGFuZCBzZXQgdGhlIGVuY19kaWdfYWxnIGZpZWxkIHByb3Blcmx5IGJhc2VkIG9uIHRoZSBzaWduaW5nCiAgICAga2V5IHR5cGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWxsb3cgUEtDUyMxMiBwYXNzd29yZCB0byBiZSBzZXQgZnJvbSB0aGUgY29tbWFuZCBsaW5lIG9yIHRoZQogICAgIGVudmlyb25tZW50LiBMZXQgJ2NhJyBnZXQgaXRzIGNvbmZpZyBmaWxlIG5hbWUgZnJvbSB0aGUgZW52aXJvbm1lbnQKICAgICB2YXJpYWJsZXMgIk9QRU5TU0xfQ09ORiIgb3IgIlNTTEVBWV9DT05GIiAoZm9yIGNvbnNpc3RlbmN5IHdpdGggJ3JlcScKICAgICBhbmQgJ3g1MDknKS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBbGxvdyBjZXJ0aWZpY2F0ZSBwb2xpY2llcyBleHRlbnNpb24gdG8gdXNlIGFuIElBNVNUUklORyBmb3IgdGhlCiAgICAgb3JnYW5pemF0aW9uIGZpZWxkLiBUaGlzIGlzIGNvbnRyYXJ5IHRvIHRoZSBQS0lYIGRlZmluaXRpb24gYnV0CiAgICAgVmVyaVNpZ24gdXNlcyBpdCBhbmQgSUU1IG9ubHkgcmVjb2duaXNlcyB0aGlzIGZvcm0uIERvY3VtZW50ICd4NTA5JwogICAgIGV4dGVuc2lvbiBvcHRpb24uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIFBFREFOVElDIGNvbXBpbGVyIGZsYWcgdG8gYWxsb3cgY29tcGlsYXRpb24gd2l0aCBnY2MgLXBlZGFudGljLAogICAgIHdpdGhvdXQgZGlzYWxsb3dpbmcgaW5saW5lIGFzc2VtYmxlciBhbmQgdGhlIGxpa2UgZm9yIG5vbi1wZWRhbnRpYyBidWlsZHMuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFN1cHBvcnQgQm9ybGFuZCBDKysgYnVpbGRlci4KICAgICBbSmFuZXogSmVyZSA8ampAdm9pZC5zaT4sIG1vZGlmaWVkIGJ5IFVsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgTWluZ3czMi4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgU0hBLTEgY2xlYW51cHMgYW5kIHBlcmZvcm1hbmNlIGVuaGFuY2VtZW50cy4KICAgICBbQW5keSBQb2x5YWtvdiA8YXBwcm9AZnkuY2hhbG1lcnMuc2U+XQoKICAqKSBTcGFyYyB2OHBsdXMgYXNzZW1ibGVyIGZvciB0aGUgYmlnbnVtIGxpYnJhcnkuCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgQWNjZXB0IGFueSAteHh4IGFuZCAreHh4IGNvbXBpbGVyIG9wdGlvbnMgaW4gQ29uZmlndXJlLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBVcGRhdGUgSFBVWCBjb25maWd1cmF0aW9uLgogICAgIFtBbm9ueW1vdXNdCiAgCiAgKikgQWRkIG1pc3Npbmcgc2tfPHR5cGU+X3Vuc2hpZnQoKSBmdW5jdGlvbiB0byBzYWZlc3RhY2suaAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBOZXcgZnVuY3Rpb24gU1NMX0NUWF91c2VfY2VydGlmaWNhdGVfY2hhaW5fZmlsZSB0aGF0IHNldHMgdGhlCiAgICAgImV4dHJhX2NlcnQicyBpbiBhZGRpdGlvbiB0byB0aGUgY2VydGlmaWNhdGUuICAoVGhpcyBtYWtlcyBzZW5zZQogICAgIG9ubHkgZm9yICJQRU0iIGZvcm1hdCBmaWxlcywgYXMgY2hhaW5zIGFzIGEgd2hvbGUgYXJlIG5vdAogICAgIERFUi1lbmNvZGVkLikKICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdXBwb3J0IHZlcmlmeV9kZXB0aCBmcm9tIHRoZSBTU0wgQVBJLgogICAgIHg1MDlfdmZ5LmMgaGFkIHdoYXQgY2FuIGJlIGNvbnNpZGVyZWQgYW4gb2ZmLWJ5LW9uZS1lcnJvcjoKICAgICBJdHMgZGVwdGggKHdoaWNoIHdhcyBub3QgcGFydCBvZiB0aGUgZXh0ZXJuYWwgaW50ZXJmYWNlKQogICAgIHdhcyBhY3R1YWxseSBjb3VudGluZyB0aGUgbnVtYmVyIG9mIGNlcnRpZmljYXRlcyBpbiBhIGNoYWluOwogICAgIG5vdyBpdCByZWFsbHkgY291bnRzIHRoZSBkZXB0aC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBCdWdmaXggaW4gY3J5cHRvL3g1MDkveDUwOV9jbXAuYzogVGhlIFNTTGVyciBtYWNybyB3YXMgdXNlZAogICAgIGluc3RlYWQgb2YgWDUwOWVyciwgd2hpY2ggb2Z0ZW4gcmVzdWx0ZWQgaW4gY29uZnVzaW5nIGVycm9yCiAgICAgbWVzc2FnZXMgc2luY2UgdGhlIGVycm9yIGNvZGVzIGFyZSBub3QgZ2xvYmFsbHkgdW5pcXVlCiAgICAgKGUuZy4gYW4gYWxsZWdlZCBlcnJvciBpbiBzc2wzX2FjY2VwdCB3aGVuIGEgY2VydGlmaWNhdGUKICAgICBkaWRuJ3QgbWF0Y2ggdGhlIHByaXZhdGUga2V5KS4KCiAgKikgTmV3IGZ1bmN0aW9uIFNTTF9DVFhfc2V0X3Nlc3Npb25faWRfY29udGV4dCB0aGF0IGFsbG93cyB0byBzZXQgYSBkZWZhdWx0CiAgICAgdmFsdWUgKHNvIHRoYXQgeW91IGRvbid0IG5lZWQgU1NMX3NldF9zZXNzaW9uX2lkX2NvbnRleHQgZm9yIGVhY2gKICAgICBjb25uZWN0aW9uIHVzaW5nIHRoZSBTU0xfQ1RYKS4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBPQUVQIGRlY29kaW5nIGJ1ZyBmaXguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFN1cHBvcnQgSU5TVEFMTF9QUkVGSVggZm9yIHBhY2thZ2UgYnVpbGRlcnMsIGFzIHByb3Bvc2VkIGJ5CiAgICAgRGF2aWQgSGFycmlzLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyBDb25maWd1cmUgb3B0aW9ucyAidGhyZWFkcyIgYW5kICJuby10aHJlYWRzIi4gIEZvciBzeXN0ZW1zCiAgICAgd2hlcmUgdGhlIHByb3BlciBjb21waWxlciBvcHRpb25zIGFyZSBrbm93biAoY3VycmVudGx5IFNvbGFyaXMKICAgICBhbmQgTGludXgpLCAidGhyZWFkcyIgaXMgdGhlIGRlZmF1bHQuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IHNjcmlwdCB1dGlsL21rbGluay5wbCBhcyBhIGZhc3RlciBzdWJzdGl0dXRlIGZvciB1dGlsL21rbGluay5zaC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBJbnN0YWxsIHZhcmlvdXMgc2NyaXB0cyB0byAkKE9QRU5TU0xESVIpL21pc2MsIG5vdCB0bwogICAgICQoSU5TVEFMTFRPUCkvYmluIC0tIHRoZXkgc2hvdWxkbid0IGNsdXR0ZXIgZGlyZWN0b3JpZXMKICAgICBzdWNoIGFzIC91c3IvbG9jYWwvYmluLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopICJtYWtlIGxpbnV4LXNoYXJlZCIgdG8gYnVpbGQgc2hhcmVkIGxpYnJhcmllcy4KICAgICBbTmllbHMgUG9wcGUgPG5pZWxzQG5ldGJveC5vcmc+XQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbiBuby08Y2lwaGVyPiAocnNhLCBpZGVhLCByYzUsIC4uLikuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEFkZCB0aGUgUEtDUyMxMiBBUEkgZG9jdW1lbnRhdGlvbiB0byBvcGVuc3NsLnR4dC4gUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IKICAgICBleHRlbnNpb24gYWRkaW5nIGluIHg1MDkgdXRpbGl0eS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBSZW1vdmUgTk9QUk9UTyBzZWN0aW9ucyBhbmQgZXJyb3IgY29kZSBjb21tZW50cy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgUGFydGlhbCByZXdyaXRlIG9mIHRoZSBERUYgZmlsZSBnZW5lcmF0b3IgdG8gbm93IHBhcnNlIHRoZSBBTlNJCiAgICAgcHJvdG90eXBlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBOZXcgQ29uZmlndXJlIG9wdGlvbnMgLS1wcmVmaXg9RElSIGFuZCAtLW9wZW5zc2xkaXI9RElSLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBDb21wbGV0ZSByZXdyaXRlIG9mIHRoZSBlcnJvciBjb2RlIHNjcmlwdChzKS4gSXQgaXMgYWxsIG5vdyBoYW5kbGVkCiAgICAgYnkgb25lIHNjcmlwdCBhdCB0aGUgdG9wIGxldmVsIHdoaWNoIGhhbmRsZXMgZXJyb3IgY29kZSBnYXRoZXJpbmcsCiAgICAgaGVhZGVyIHJld3JpdGluZyBhbmQgQyBzb3VyY2UgZmlsZSBnZW5lcmF0aW9uLiBJdCBzaG91bGQgYmUgbXVjaCBiZXR0ZXIKICAgICB0aGFuIHRoZSBvbGQgbWV0aG9kOiBpdCBub3cgdXNlcyBhIG1vZGlmaWVkIHZlcnNpb24gb2YgVWxmJ3MgcGFyc2VyIHRvCiAgICAgcmVhZCB0aGUgQU5TSSBwcm90b3R5cGVzIGluIGFsbCBoZWFkZXIgZmlsZXMgKHRodXMgdGhlIG9sZCBLJlIgZGVmaW5pdGlvbnMKICAgICBhcmVuJ3QgbmVlZGVkIGZvciBlcnJvciBjcmVhdGlvbiBhbnkgbW9yZSkgYW5kIGRvIGEgYmV0dGVyIGpvYiBvZgogICAgIHRyYW5zbGF0aW5nIGZ1bmN0aW9uIGNvZGVzIGludG8gbmFtZXMuIFRoZSBvbGQgJ0FTTjEgZXJyb3IgY29kZSBpbWJlZGRlZAogICAgIGluIGEgY29tbWVudCcgaXMgbm8gbG9uZ2VyIG5lY2Vzc2FyeSBhbmQgaXQgZG9lc24ndCB1c2UgLmVyciBmaWxlcyB3aGljaAogICAgIGhhdmUgbm93IGJlZW4gZGVsZXRlZC4gQWxzbyB0aGUgZXJyb3IgY29kZSBjYWxsIGRvZXNuJ3QgaGF2ZSB0byBhcHBlYXIgYWxsCiAgICAgb24gb25lIGxpbmUgKHdoaWNoIHJlc3VsdGVkIGluIHNvbWUgbGFyZ2UgbGluZXMuLi4pLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENoYW5nZSAjaW5jbHVkZSBmaWxlbmFtZXMgZnJvbSA8Zm9vLmg+IHRvIDxvcGVuc3NsL2Zvby5oPi4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBDaGFuZ2UgYmVoYXZpb3VyIG9mIHNzbDJfcmVhZCB3aGVuIGZhY2luZyBsZW5ndGgtMCBwYWNrZXRzOiBEb24ndCByZXR1cm4KICAgICAwICh3aGljaCB1c3VhbGx5IGluZGljYXRlcyBhIGNsb3NlZCBjb25uZWN0aW9uKSwgYnV0IGNvbnRpbnVlIHJlYWRpbmcuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgRml4IHNvbWUgcmFjZSBjb25kaXRpb25zLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEFkZCBzdXBwb3J0IGZvciBDUkwgZGlzdHJpYnV0aW9uIHBvaW50cyBleHRlbnNpb24uIEFkZCBDZXJ0aWZpY2F0ZQogICAgIFBvbGljaWVzIGFuZCBDUkwgZGlzdHJpYnV0aW9uIHBvaW50cyBkb2N1bWVudGF0aW9uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgdGhlIGF1dG9nZW5lcmF0ZWQgaGVhZGVyIGZpbGUgcGFydHMgdG8gY3J5cHRvL29wZW5zc2xjb25mLmguCiAgICAgW1VsZiBN9mxsZXJdCgogICopIEZpeCBuZXcgNTYtYml0IERFUyBleHBvcnQgY2lwaGVyc3VpdGVzOiB0aGV5IHdlcmUgdXNpbmcgNyBieXRlcyBpbnN0ZWFkIG9mCiAgICAgOCBvZiBrZXlpbmcgbWF0ZXJpYWwuIE1lcmxpbiBoYXMgYWxzbyBjb25maXJtZWQgaW50ZXJvcCB3aXRoIHRoaXMgZml4CiAgICAgYmV0d2VlbiBPcGVuU1NMIGFuZCBCYWx0aW1vcmUgQy9TU0wgMi4wIGFuZCBKL1NTTCAyLjAuCiAgICAgW01lcmxpbiBIdWdoZXMgPG1lcmxpbkBiYWx0aW1vcmUuaWU+XQoKICAqKSBGaXggbG90cyBvZiB3YXJuaW5ncy4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KIAogICopIEluIGFkZF9jZXJ0X2RpcigpIGluIGNyeXB0by94NTA5L2J5X2Rpci5jLCBicmVhayBvdXQgb2YgdGhlIGxvb3AgaWYKICAgICB0aGUgZGlyZWN0b3J5IHNwZWMgZGlkbid0IGVuZCB3aXRoIGEgTElTVF9TRVBBUkFUT1JfQ0hBUi4KICAgICBbUmljaGFyZCBMZXZpdHRlIDxsZXZpdHRlQHN0YWNrZW4ua3RoLnNlPl0KIAogICopIEZpeCBwcm9ibGVtcyB3aXRoIHNpemVvZihsb25nKSA9PSA4LgogICAgIFtBbmR5IFBvbHlha292IDxhcHByb0BmeS5jaGFsbWVycy5zZT5dCgogICopIENoYW5nZSBmdW5jdGlvbnMgdG8gQU5TSSBDLgogICAgIFtVbGYgTfZsbGVyXQoKICAqKSBGaXggdHlwb3MgaW4gZXJyb3IgY29kZXMuCiAgICAgW01hcnRpbiBLcmFlbWVyIDxNYXJ0aW4uS3JhZW1lckBNY2hQLlNpZW1lbnMuRGU+LCBVbGYgTfZsbGVyXQoKICAqKSBSZW1vdmUgZGVmdW5jdCBhc3NlbWJsZXIgZmlsZXMgZnJvbSBDb25maWd1cmUuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIFNQQVJDIHY4IGFzc2VtYmxlciBCSUdOVU0gaW1wbGVtZW50YXRpb24uCiAgICAgW0FuZHkgUG9seWFrb3YgPGFwcHJvQGZ5LmNoYWxtZXJzLnNlPl0KCiAgKikgU3VwcG9ydCBmb3IgQ2VydGlmaWNhdGUgUG9saWNpZXMgZXh0ZW5zaW9uOiBib3RoIHByaW50IGFuZCBzZXQuCiAgICAgVmFyaW91cyBhZGRpdGlvbnMgdG8gc3VwcG9ydCB0aGUgcjJpIG1ldGhvZCB0aGlzIHVzZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQSBsb3Qgb2YgY29uc3RpZmljYXRpb24sIGFuZCBmaXggYSBidWcgaW4gWDUwOV9OQU1FX29uZWxpbmUoKSB0aGF0IGNvdWxkCiAgICAgcmV0dXJuIGEgY29uc3Qgc3RyaW5nIHdoZW4geW91IGFyZSBleHBlY3RpbmcgYW4gYWxsb2NhdGVkIGJ1ZmZlci4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIEFTTjEgdHlwZXMgVVRGOFN0cmluZyBhbmQgVklTSUJMRVNUUklORywgYWxzbyB0aGUgQ0hPSUNFCiAgICAgdHlwZXMgRGlyZWN0b3J5U3RyaW5nIGFuZCBEaXNwbGF5VGV4dC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29kZSB0byBhbGxvdyByMmkgZXh0ZW5zaW9ucyB0byBhY2Nlc3MgdGhlIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UsCiAgICAgYWRkIGFuIExIQVNIIGRhdGFiYXNlIGRyaXZlciBhbmQgYWRkIHNldmVyYWwgY3R4IGhlbHBlciBmdW5jdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IGFuIGV2aWwgYnVnIGluIGJuX2V4cGFuZDIoKSB3aGljaCBjYXVzZWQgdmFyaW91cyBCTiBmdW5jdGlvbnMgdG8KICAgICBmYWlsIHdoZW4gdGhleSBleHRlbmRlZCB0aGUgc2l6ZSBvZiBhIEJJR05VTS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBWYXJpb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHRvIGhhbmRsZSBTWE5ldCBleHRlbnNpb24uIE1vZGlmeSBta2RlZi5wbCB0bwogICAgIHN1cHBvcnQgdHlwZXNhZmUgc3RhY2suCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4IHR5cG8gaW4gU1NMX1tnc11ldF9vcHRpb25zKCkuCiAgICAgW05pbHMgRnJvc3RiZXJnIDxuaWxzQG1lZGNvbS5zZT5dCgogICopIERlbGV0ZSB2YXJpb3VzIGZ1bmN0aW9ucyBhbmQgZmlsZXMgdGhhdCBiZWxvbmdlZCB0byB0aGUgKG5vdyBvYnNvbGV0ZSkKICAgICBvbGQgWDUwOVYzIGhhbmRsaW5nIGNvZGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IENvbmZpZ3VyZSBvcHRpb24gInJzYXJlZiIuCiAgICAgW1VsZiBN9mxsZXJdCgogICopIERvbid0IGF1dG8tZ2VuZXJhdGUgcGVtLmguCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgSW50cm9kdWNlIHR5cGUtc2FmZSBBU04uMSBTRVRzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb252ZXJ0IHZhcmlvdXMgYWRkaXRpb25hbCBjYXN0ZWQgc3RhY2tzIHRvIHR5cGUtc2FmZSBTVEFDS19PRigpIHZhcmlhbnRzLgogICAgIFtCZW4gTGF1cmllLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBTdGV2ZSBIZW5zb25dCgogICopIEludHJvZHVjZSB0eXBlLXNhZmUgU1RBQ0tzLiBUaGlzIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBicmVhayBsb3RzIG9mIGNvZGUKICAgICB0aGF0IGxpbmtzIHdpdGggT3BlblNTTCAod2VsbCBhdCBsZWFzdCBjYXVzZSBsb3RzIG9mIHdhcm5pbmdzKSwgYnV0IGZlYXIKICAgICBub3Q6IHRoZSBjb252ZXJzaW9uIGlzIHRyaXZpYWwsIGFuZCBpdCBlbGltaW5hdGVzIGxvYWRzIG9mIGV2aWwgY2FzdHMuIEEKICAgICBmZXcgU1RBQ0tlZCB0aGluZ3MgaGF2ZSBiZWVuIGNvbnZlcnRlZCBhbHJlYWR5LiBGZWVsIGZyZWUgdG8gY29udmVydCBtb3JlLgogICAgIEluIHRoZSBmdWxsbmVzcyBvZiB0aW1lLCBJJ2xsIGRvIGF3YXkgd2l0aCB0aGUgU1RBQ0sgdHlwZSBhbHRvZ2V0aGVyLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgYG9wZW5zc2wgY2EgLXJldm9rZSA8Y2VydGZpbGU+JyBmYWNpbGl0eSB3aGljaCByZXZva2VzIGEgY2VydGlmaWNhdGUKICAgICBzcGVjaWZpZWQgaW4gPGNlcnRmaWxlPiBieSB1cGRhdGluZyB0aGUgZW50cnkgaW4gdGhlIGluZGV4LnR4dCBmaWxlLgogICAgIFRoaXMgd2F5IG9uZSBubyBsb25nZXIgaGFzIHRvIGVkaXQgdGhlIGluZGV4LnR4dCBmaWxlIG1hbnVhbGx5IGZvcgogICAgIHJldm9raW5nIGEgY2VydGlmaWNhdGUuIFRoZSAtcmV2b2tlIG9wdGlvbiBkb2VzIHRoZSBnb3J5IGRldGFpbHMgbm93LgogICAgIFtNYXNzaW1pbGlhbm8gUGFsYSA8bWFkd29sZkBvcGVuY2Eub3JnPiwgUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IGBvcGVuc3NsIGNybCAtbm9vdXQgLXRleHQnIGNvbWJpbmF0aW9uIHdoZXJlIGAtbm9vdXQnIGtpbGxlZCB0aGUKICAgICBgLXRleHQnIG9wdGlvbiBhdCBhbGwgYW5kIHRoaXMgd2F5IHRoZSBgLW5vb3V0IC10ZXh0JyBjb21iaW5hdGlvbiB3YXMKICAgICBpbmNvbnNpc3RlbnQgaW4gYG9wZW5zc2wgY3JsJyB3aXRoIHRoZSBmcmllbmRzIGluIGBvcGVuc3NsIHg1MDl8cnNhfGRzYScuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2Ugc3VyZSBhIGNvcnJlc3BvbmRpbmcgcGxhaW4gdGV4dCBlcnJvciBtZXNzYWdlIGV4aXN0cyBmb3IgdGhlCiAgICAgWDUwOV9WX0VSUl9DRVJUX1JFVk9LRUQvMjMgZXJyb3IgbnVtYmVyIHdoaWNoIGNhbiBvY2N1ciB3aGVuIGEKICAgICB2ZXJpZnkgY2FsbGJhY2sgZnVuY3Rpb24gZGV0ZXJtaW5lZCB0aGF0IGEgY2VydGlmaWNhdGUgd2FzIHJldm9rZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEJ1Z2ZpeDogSW4gdGVzdC90ZXN0ZW5jLCBkb24ndCB0ZXN0ICJvcGVuc3NsIDxjaXBoZXI+IiBmb3IKICAgICBjaXBoZXJzIHRoYXQgd2VyZSBleGNsdWRlZCwgZS5nLiBieSAtRE5PX0lERUEuICBBbHNvLCB0ZXN0CiAgICAgYWxsIGF2YWlsYWJsZSBjaXBlcnMgaW5jbHVkaW5nIHJjNSwgd2hpY2ggd2FzIGZvcmdvdHRlbiB1bnRpbCBub3cuCiAgICAgSW4gb3JkZXIgdG8gbGV0IHRoZSB0ZXN0aW5nIHNoZWxsIHNjcmlwdCBrbm93IHdoaWNoIGFsZ29yaXRobXMKICAgICBhcmUgYXZhaWxhYmxlLCBhIG5ldyAodXAgdG8gbm93IHVuZG9jdW1lbnRlZCkgY29tbWFuZAogICAgICJvcGVuc3NsIGxpc3QtY2lwaGVyLWNvbW1hbmRzIiBpcyB1c2VkLgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIEJ1Z2ZpeDogc19jbGllbnQgb2NjYXNpb25hbGx5IHdvdWxkIHNsZWVwIGluIHNlbGVjdCgpIHdoZW4KICAgICBpdCBzaG91bGQgaGF2ZSBjaGVja2VkIFNTTF9wZW5kaW5nKCkgZmlyc3QuCiAgICAgW0JvZG8gTW9lbGxlcl0KCiAgKikgTmV3IGZ1bmN0aW9ucyBEU0FfZG9fc2lnbiBhbmQgRFNBX2RvX3ZlcmlmeSB0byBwcm92aWRlIGFjY2VzcyB0bwogICAgIHRoZSByYXcgRFNBIHZhbHVlcyBwcmlvciB0byBBU04uMSBlbmNvZGluZy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgVHdlYWtzIHRvIENvbmZpZ3VyZQogICAgIFtOaWVscyBQb3BwZSA8bmllbHNAbmV0Ym94Lm9yZz5dCgogICopIEFkZCBzdXBwb3J0IGZvciBQS0NTIzUgdjIuMCBBU04xIFBCRVMyIHN0cnVjdHVyZXMuIE5vIG90aGVyIHN1cHBvcnQsCiAgICAgeWV0Li4uCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTmV3IHZhcmlhYmxlcyAkKFJBTkxJQikgYW5kICQoUEVSTCkgaW4gdGhlIE1ha2VmaWxlcy4KICAgICBbVWxmIE32bGxlcl0KCiAgKikgTmV3IGNvbmZpZyBvcHRpb24gdG8gYXZvaWQgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGlsbGVnYWwgb24gdGhlIDgwMzg2LgogICAgIFRoZSBkZWZhdWx0IGNvZGUgaXMgZmFzdGVyLCBidXQgcmVxdWlyZXMgYXQgbGVhc3QgYSA0ODYuCiAgICAgW1VsZiBN9mxsZXJdCiAgCiAgKikgR290IHJpZCBvZiBvbGQgU1NMMl9DTElFTlRfVkVSU0lPTiAoaW5jb25zaXN0ZW50bHkgdXNlZCkgYW5kCiAgICAgU1NMMl9TRVJWRVJfVkVSU0lPTiAobm90IHVzZWQgYXQgYWxsKSBtYWNyb3MsIHdoaWNoIGFyZSBub3cgdGhlCiAgICAgc2FtZSBhcyBTU0wyX1ZFUlNJT04gYW55d2F5LgogICAgIFtCb2RvIE1vZWxsZXJdCgogICopIE5ldyAiLXNob3djZXJ0cyIgb3B0aW9uIGZvciBzX2NsaWVudC4KICAgICBbQm9kbyBNb2VsbGVyXQoKICAqKSBTdGlsbCBtb3JlIFBLQ1MjMTIgaW50ZWdyYXRpb24uIEFkZCBwa2NzMTIgYXBwbGljYXRpb24gdG8gb3BlbnNzbAogICAgIGFwcGxpY2F0aW9uLiBWYXJpb3VzIGNsZWFudXBzIGFuZCBmaXhlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb3JlIFBLQ1MjMTIgaW50ZWdyYXRpb24uIEFkZCBuZXcgcGtjczEyIGRpcmVjdG9yeSB3aXRoIE1ha2VmaWxlLnNzbCBhbmQKICAgICBtb2RpZnkgZXJyb3Igcm91dGluZXMgdG8gd29yayBpbnRlcm5hbGx5LiBBZGQgZXJyb3IgY29kZXMgYW5kIFBCRSBpbml0CiAgICAgdG8gbGlicmFyeSBzdGFydHVwIHJvdXRpbmVzLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZ1cnRoZXIgUEtDUyMxMiBpbnRlZ3JhdGlvbi4gQWRkZWQgcGFzc3dvcmQgYmFzZWQgZW5jcnlwdGlvbiwgUEtDUyM4IGFuZAogICAgIHBhY2tpbmcgZnVuY3Rpb25zIHRvIGFzbjEgYW5kIGV2cC4gQ2hhbmdlZCBmdW5jdGlvbiBuYW1lcyBhbmQgZXJyb3IKICAgICBjb2RlcyBhbG9uZyB0aGUgd2F5LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIFBLQ1MxMiBpbnRlZ3JhdGlvbjogYW5kIHNvIGl0IGJlZ2lucy4uLiBGaXJzdCBvZiBzZXZlcmFsIHBhdGNoZXMgdG8KICAgICBzbG93bHkgaW50ZWdyYXRlIFBLQ1MjMTIgZnVuY3Rpb25hbGl0eSBpbnRvIE9wZW5TU0wuIEFkZCBQS0NTIzEyCiAgICAgb2JqZWN0cyB0byBvYmplY3RzLmgKICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgYSBuZXcgJ2luZGVudCcgb3B0aW9uIHRvIHNvbWUgWDUwOVYzIGV4dGVuc2lvbiBjb2RlLiBJbml0aWFsIEFTTjEKICAgICBhbmQgZGlzcGxheSBzdXBwb3J0IGZvciBUaGF3dGUgc3Ryb25nIGV4dHJhbmV0IGV4dGVuc2lvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgTGludXhQUEMgc3VwcG9ydC4KICAgICBbSmVmZiBEdWJydWxlIDxpZ29yQHBvYm94Lm9yZz5dCgogICopIEdldCByaWQgb2YgcmVkdW5kYW50IEJOIGZpbGUgYm5fbXVsdy5jLCBhbmQgcmVuYW1lIGJuX2RpdjY0IHRvCiAgICAgYm5fZGl2X3dvcmRzIGluIGFscGhhLnMuCiAgICAgW0hhbm5lcyBSZWluZWNrZSA8SC5SZWluZWNrZUBody5hYy51az4gYW5kIEJlbiBMYXVyaWVdCgogICopIE1ha2Ugc3VyZSB0aGUgUlNBIE9BRVAgdGVzdCBpcyBza2lwcGVkIHVuZGVyIC1EUlNBcmVmIGJlY2F1c2UKICAgICBPQUVQIGlzbid0IHN1cHBvcnRlZCB3aGVuIE9wZW5TU0wgaXMgYnVpbHQgd2l0aCBSU0FyZWYuCiAgICAgW1VsZiBNb2VsbGVyIDx1bGZAZml0dWcuZGU+XQoKICAqKSBNb3ZlIGRlZmluaXRpb25zIG9mIElTX1NFVC9JU19TRVFVRU5DRSBpbnNpZGUgY3J5cHRvL2FzbjEvYXNuMS5oIAogICAgIHNvIHRoZXkgbm8gbG9uZ2VyIGFyZSBtaXNzaW5nIHVuZGVyIC1ETk9QUk9UTy4gCiAgICAgW1NvcmVuIFMuIEpvcnZhbmcgPHNvcmVuQHQuZGs+XQoKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjFjIGFuZCAwLjkuMmIgIFsyMiBNYXIgMTk5OV0KCiAgKikgTWFrZSBTU0xfZ2V0X3BlZXJfY2VydF9jaGFpbigpIHdvcmsgaW4gc2VydmVycy4gVW5mb3J0dW5hdGVseSwgaXQgc3RpbGwKICAgICBkb2Vzbid0IHdvcmsgd2hlbiB0aGUgc2Vzc2lvbiBpcyByZXVzZWQuIENvbWluZyBzb29uIQogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYSBzZWN1cml0eSBob2xlLCB0aGF0IGFsbG93cyBzZXNzaW9ucyB0byBiZSByZXVzZWQgaW4gdGhlIHdyb25nCiAgICAgY29udGV4dCB0aHVzIGJ5cGFzc2luZyBjbGllbnQgY2VydCBwcm90ZWN0aW9uISBBbGwgc29mdHdhcmUgdGhhdCB1c2VzCiAgICAgY2xpZW50IGNlcnRzIGFuZCBzZXNzaW9uIGNhY2hlcyBpbiBtdWx0aXBsZSBjb250ZXh0cyBORUVEUyBQQVRDSElORyB0bwogICAgIGFsbG93IHNlc3Npb24gcmV1c2UhIEEgZnVsbGVyIHNvbHV0aW9uIGlzIGluIHRoZSB3b3Jrcy4KICAgICBbQmVuIExhdXJpZSwgcHJvYmxlbSBwb2ludGVkIG91dCBieSBIb2xnZXIgUmVpZiwgQm9kbyBNb2VsbGVyIChhbmQgPz8/KV0KCiAgKikgU29tZSBtb3JlIHNvdXJjZSB0cmVlIGNsZWFudXBzIChyZW1vdmVkIG9ic29sZXRlIGZpbGVzCiAgICAgY3J5cHRvL2JmL2FzbS9iZjU4Ni5wbCwgdGVzdC90ZXN0LnR4dCBhbmQgY3J5cHRvL3NoYS9hc20vZi5zOyBjaGFuZ2VkCiAgICAgcGVybWlzc2lvbiBvbiAiY29uZmlnIiBzY3JpcHQgdG8gYmUgZXhlY3V0YWJsZSkgYW5kIGEgZml4IGZvciB0aGUgSU5TVEFMTAogICAgIGRvY3VtZW50LgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgUmVtb3ZlIHNvbWUgbGVnYWN5IGFuZCBlcnJvbmVvdXMgdXNlcyBvZiBtYWxsb2MsIGZyZWUgaW5zdGVhZCBvZgogICAgIE1hbGxvYywgRnJlZS4KICAgICBbTGVubmFydCBCYW5nIDxsb2JAbmV0c3RyZWFtLnNlPiwgd2l0aCBtaW5vciBjaGFuZ2VzIGJ5IFN0ZXZlXQoKICAqKSBNYWtlIHJzYV9vYWVwX3Rlc3QgcmV0dXJuIG5vbi16ZXJvIG9uIGVycm9yLgogICAgIFtVbGYgTW9lbGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIG5hdGl2ZSBTb2xhcmlzIHNoYXJlZCBsaWJyYXJpZXMuIENvbmZpZ3VyZQogICAgIHNvbGFyaXMtc3BhcmMtc2M0LXBpYywgbWFrZSwgdGhlbiBydW4gc2hsaWIvc29sYXJpcy1zYzQuc2guIEl0J2QgYmUgbmljZQogICAgIGlmIHNvbWVvbmUgd291bGQgbWFrZSB0aGF0IGxhc3Qgc3RlcCBhdXRvbWF0aWMuCiAgICAgW01hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQEFkTm92dW0uQ0g+XQoKICAqKSBjdHhfc2l6ZSB3YXMgbm90IGJ1aWx0IHdpdGggdGhlIHJpZ2h0IGNvbXBpbGVyIGR1cmluZyAibWFrZSBsaW5rcyIuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDaGFuZ2UgdGhlIG1lYW5pbmcgb2YgJ0FMTCcgaW4gdGhlIGNpcGhlciBsaXN0LiBJdCBub3cgbWVhbnMgImV2ZXJ5dGhpbmcKICAgICBleGNlcHQgTlVMTCBjaXBoZXJzIi4gVGhpcyBtZWFucyB0aGUgZGVmYXVsdCBjaXBoZXIgbGlzdCB3aWxsIG5vIGxvbmdlcgogICAgIGVuYWJsZSBOVUxMIGNpcGhlcnMuIFRoZXkgbmVlZCB0byBiZSBzcGVjaWZpY2FsbHkgZW5hYmxlZCBlLmcuIHdpdGgKICAgICB0aGUgc3RyaW5nICJERUZBVUxUOmVOVUxMIi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggdG8gUlNBIHByaXZhdGUgZW5jcnlwdGlvbiByb3V0aW5lczogaWYgcCA8IHEgdGhlbiBpdCB3b3VsZAogICAgIG9jY2FzaW9uYWxseSBwcm9kdWNlIGFuIGludmFsaWQgcmVzdWx0LiBUaGlzIHdpbGwgb25seSBoYXBwZW4gd2l0aAogICAgIGV4dGVybmFsbHkgZ2VuZXJhdGVkIGtleXMgYmVjYXVzZSBPcGVuU1NMIChhbmQgU1NMZWF5KSBlbnN1cmUgcCA+IHEuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQmUgbGVzcyByZXN0cmljdGl2ZSBhbmQgYWxsb3cgYWxzbyBgcGVybCB1dGlsL3BlcmxwYXRoLnBsCiAgICAgL3BhdGgvdG8vYmluL3BlcmwnIGluIGFkZGl0aW9uIHRvIGBwZXJsIHV0aWwvcGVybHBhdGgucGwgL3BhdGgvdG8vYmluJywKICAgICBiZWNhdXNlIHRoaXMgd2F5IG9uZSBjYW4gYWxzbyB1c2UgYW4gaW50ZXJwcmV0ZXIgbmFtZWQgYHBlcmw1JyAod2hpY2ggaXMKICAgICB1c3VhbGx5IHRoZSBuYW1lIG9mIFBlcmwgNS54eHggb24gcGxhdGZvcm1zIHdoZXJlIGFuIFBlcmwgNC54IGlzIHN0aWxsCiAgICAgaW5zdGFsbGVkIGFzIGBwZXJsJykuCiAgICAgW01hdHRoaWFzIExvZXBmZSA8TWF0dGhpYXMuTG9lcGZlQGFkbm92dW0uY2g+XQoKICAqKSBMZXQgdXRpbC9jbGVhbi1kZXBlbmQucGwgd29yayBhbHNvIHdpdGggb2xkZXIgUGVybCA1LjAweCB2ZXJzaW9ucy4KICAgICBbTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIEZpeCBNYWtlZmlsZS5vcmcgc28gQ0MsQ0ZMQUcgZXRjIGFyZSBwYXNzZWQgdG8gJ21ha2UgbGlua3MnIGFkZAogICAgIGFkdmFwaTMyLmxpYiB0byBXaW4zMiBidWlsZCBhbmQgY2hhbmdlIHRoZSBwZW0gdGVzdCBjb21wYXJpc2lvbgogICAgIHRvIGZjLmV4ZSAodGhhbmtzIHRvIFVscmljaCBLcm9lbmVyIDxrcm9uZXJ1QHlhaG9vLmNvbT4gZm9yIHRoZQogICAgIHN1Z2dlc3Rpb24pLiBGaXggbWlzcGxhY2VkIEFTTkkgcHJvdG90eXBlcyBhbmQgZGVjbGFyYXRpb25zIGluIGV2cC5oCiAgICAgYW5kIGNyeXB0by9kZXMvZWRlX2NiY21fZW5jLmMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgREVTIHF1YWQgY2hlY2tzdW0gd2FzIGJyb2tlbiBvbiBiaWctZW5kaWFuIGFyY2hpdGVjdHVyZXMuIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDb21tZW50IG91dCB0d28gZnVuY3Rpb25zIGluIGJpby5oIHRoYXQgYXJlbid0IGltcGxlbWVudGVkLiBGaXggdXAgdGhlCiAgICAgV2luMzIgdGVzdCBiYXRjaCBmaWxlIHNvIGl0IChtaWdodCkgd29yayBhZ2Fpbi4gVGhlIFdpbjMyIHRlc3QgYmF0Y2ggZmlsZQogICAgIGlzIGhvcnJpYmxlOiBJIGZlZWwgaWxsLi4uLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1vdmUgdmFyaW91cyAjaWZkZWZzIGFyb3VuZCBzbyBOT19TWVNMT0csIE5PX0RJUkVOVCBldGMgYXJlIG5vdyBzZWxlY3RlZAogICAgIGluIGVfb3MuaC4gQXVkaXQgb2YgaGVhZGVyIGZpbGVzIHRvIGNoZWNrIEFOU0kgYW5kIG5vbiBBTlNJCiAgICAgc2VjdGlvbnM6IDEwIGZ1bmN0aW9ucyB3ZXJlIGFic2VudCBmcm9tIG5vbiBBTlNJIHNlY3Rpb24gYW5kIG5vdCBleHBvcnRlZAogICAgIGZyb20gV2luZG93cyBETExzLiBGaXhlZCB1cCBsaWJlYXkubnVtIGZvciBuZXcgZnVuY3Rpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgYG9wZW5zc2wgdmVyc2lvbicgb3V0cHV0IGxpbmVzIGNvbnNpc3RlbnQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCBXaW4zMiBzeW1ib2wgZXhwb3J0IGxpc3RzIGZvciBCSU8gZnVuY3Rpb25zOiBBZGRlZAogICAgIEJJT19nZXRfZXhfbmV3X2luZGV4LCBCSU9fZ2V0X2V4X251bSwgQklPX2dldF9leF9kYXRhIGFuZCBCSU9fc2V0X2V4X2RhdGEKICAgICB0byBtcy9saWJlYXl7MTYsMzJ9LmRlZi4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgU2Vjb25kIHJvdW5kIG9mIGZpeGluZyB0aGUgT3BlblNTTCBwZXJsLyBzdHVmZi4gSXQgbm93IGF0IGxlYXN0IGNvbXBpbGVkCiAgICAgZmluZSB1bmRlciBVbml4IGFuZCBwYXNzZXMgc29tZSB0cml2aWFsIHRlc3RzIEkndmUgbm93IGFkZGVkLiBCdXQgdGhlCiAgICAgd2hvbGUgc3R1ZmYgaXMgaG9ycmlibHkgaW5jb21wbGV0ZSwgc28gYSBSRUFETUUuMVNUIHdpdGggYSBkaXNjbGFpbWVyIHdhcwogICAgIGFkZGVkIHRvIG1ha2Ugc3VyZSBubyBvbmUgZXhwZWN0cyB0aGF0IHRoaXMgc3R1ZmYgcmVhbGx5IHdvcmtzIGluIHRoZQogICAgIE9wZW5TU0wgMC45LjIgcmVsZWFzZS4gIEFkZGl0aW9uYWxseSBJJ3ZlIHN0YXJ0ZWQgdG8gY2xlYW4gdGhlIFhTIHNvdXJjZXMKICAgICB1cCBhbmQgZml4ZWQgYSBmZXcgbGl0dGxlIGJ1Z3MgYW5kIGluY29uc2lzdGVuY2llcyBpbiBPcGVuU1NMLntwbSx4c30gYW5kCiAgICAgb3BlbnNzbF9iaW8ueHMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgZ2VuZXJhdGlvbiBvZiB0d28gcGFydCBhZGRyZXNzZXMgaW4gcGVybC4KICAgICBbS2VuamkgTWl5YWtlIDxrZW5qaUBtaXlha2Uub3JnPiwgaW50ZWdyYXRlZCBieSBCZW4gTGF1cmllXQoKICAqKSBBZGQgY29uZmlnIGVudHJ5IGZvciBMaW51eCBvbiBNSVBTLgogICAgIFtKb2huIFRvYmV5IDxqdG9iZXlAY2hhbm5lbDEuY29tPl0KCiAgKikgTWFrZSBsaW5rcyB3aGVuZXZlciBDb25maWd1cmUgaXMgcnVuLCB1bmxlc3Mgd2UgYXJlIG9uIFdpbmRvemUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIFBlcm1pdCBleHRlbnNpb25zIHRvIGJlIGFkZGVkIHRvIENSTHMgdXNpbmcgY3JsX3NlY3Rpb24gaW4gb3BlbnNzbC5jbmYuCiAgICAgQ3VycmVudGx5IG9ubHkgaXNzdWVyQWx0TmFtZSBhbmQgQXV0aG9yaXR5S2V5SWRlbnRpZmllciBtYWtlIGFueSBzZW5zZQogICAgIGluIENSTHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgdXNlZnVsIGtsdWRnZSB0byBhbGxvdyBwYWNrYWdlIG1haW50YWluZXJzIHRvIHNwZWNpZnkgY29tcGlsZXIgYW5kCiAgICAgb3RoZXIgcGxhdGZvcm1zIGRldGFpbHMgb24gdGhlIGNvbW1hbmQgbGluZSB3aXRob3V0IGhhdmluZyB0byBwYXRjaCB0aGUKICAgICBDb25maWd1cmUgc2NyaXB0IGV2ZXJ5dGltZTogT25lIG5vdyBjYW4gdXNlIGBgcGVybCBDb25maWd1cmUKICAgICA8aWQ+OjxkZXRhaWxzPicnLCBpLmUuIHBsYXRmb3JtIGlkcyBhcmUgYWxsb3dlZCB0byBoYXZlIGRldGFpbHMgYXBwZW5kZWQKICAgICB0byB0aGVtIChzZXBlcmF0ZWQgYnkgY29sb25zKS4gVGhpcyBpcyB0cmVhdGVkIGFzIHRoZXJlIHdvdWxkIGJlIGEgc3RhdGljCiAgICAgcHJlLWNvbmZpZ3VyZWQgZW50cnkgaW4gQ29uZmlndXJlJ3MgJXRhYmxlIHVuZGVyIGtleSA8aWQ+IHdpdGggdmFsdWUKICAgICA8ZGV0YWlscz4gYW5kIGBgcGVybCBDb25maWd1cmUgPGlkPicnIGlzIGNhbGxlZC4gIFNvLCB3aGVuIHlvdSB3YW50IHRvCiAgICAgcGVyZm9ybSBhIHF1aWNrIHRlc3QtY29tcGlsZSB1bmRlciBGcmVlQlNEIDMuMSB3aXRoIHBnY2MgYW5kIHdpdGhvdXQKICAgICBhc3NlbWJsZXIgc3R1ZmYgeW91IGNhbiB1c2UgYGBwZXJsIENvbmZpZ3VyZSAiRnJlZUJTRC1lbGY6cGdjYzotTzY6OjoiJycKICAgICBub3csIHdoaWNoIG92ZXJyaWRlcyB0aGUgRnJlZUJTRC1lbGYgZW50cnkgb24tdGhlLWZseS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRGlzYWJsZSBuZXcgVExTMSBjaXBoZXJzdWl0ZXMgYnkgZGVmYXVsdDogdGhleSBhcmVuJ3Qgb2ZmaWNpYWwgeWV0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBbGxvdyBEU08gZmxhZ3MgbGlrZSAtZnBpYywgLWZQSUMsIC1LUElDIGV0Yy4gdG8gYmUgc3BlY2lmaWVkCiAgICAgb24gdGhlIGBwZXJsIENvbmZpZ3VyZSAuLi4nIGNvbW1hbmQgbGluZS4gVGhpcyB3YXkgb25lIGNhbiBjb21waWxlCiAgICAgT3BlblNTTCBsaWJyYXJpZXMgd2l0aCBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIChQSUMpIHdoaWNoIGlzIG5lZWRlZAogICAgIGZvciBsaW5raW5nIGl0IGludG8gRFNPcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgUmVtYXJrYWJseSwgZXhwb3J0IGNpcGhlcnMgd2VyZSB0b3RhbGx5IGJyb2tlbiBhbmQgbm8tb25lIGhhZCBub3RpY2VkIQogICAgIEZpeGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBDbGVhbmVkIHVwIHRoZSBMSUNFTlNFIGRvY3VtZW50OiBUaGUgb2ZmaWNpYWwgY29udGFjdCBmb3IgYW55IGxpY2Vuc2UKICAgICBxdWVzdGlvbnMgbm93IGlzIHRoZSBPcGVuU1NMIGNvcmUgdGVhbSB1bmRlciBvcGVuc3NsLWNvcmVAb3BlbnNzbC5vcmcuCiAgICAgQW5kIGFkZCBhIHBhcmFncmFwaCBhYm91dCB0aGUgZHVhbC1saWNlbnNlIHNpdHVhdGlvbiB0byBtYWtlIHN1cmUgcGVvcGxlCiAgICAgcmVjb2duaXplIHRoYXQgX0JPVEhfIHRoZSBPcGVuU1NMIGxpY2Vuc2UgX0FORF8gdGhlIFNTTGVheSBsaWNlbnNlIGFwcGx5CiAgICAgdG8gdGhlIE9wZW5TU0wgdG9vbGtpdC4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgR2VuZXJhbCBzb3VyY2UgdHJlZSBtYWtlZmlsZSBjbGVhbnVwczogTWFkZSBgbWFraW5nIHh4eCBpbiB5eXkuLi4nCiAgICAgZGlzcGxheSBjb25zaXN0ZW50IGluIHRoZSBzb3VyY2UgdHJlZSBhbmQgcmVwbGFjZWQgYC9iaW4vcm0nIGJ5IGBybScuCiAgICAgQWRkaXRvbmFsbHkgY2xlYW5lZCB1cCB0aGUgYG1ha2UgbGlua3MnIHRhcmdldDogUmVtb3ZlIHVubmVjZXNzYXJ5CiAgICAgc2VtaWNvbG9ucywgc3Vic2VxdWVudCByZWR1bmRhbnQgcmVtb3ZlcywgaW5saW5lIHBvaW50LnNoIGludG8gbWtsaW5rLnNoCiAgICAgdG8gc3BlZWQgcHJvY2Vzc2luZyBhbmQgbm8gbG9uZ2VyIGNsdXR0ZXIgdGhlIGRpc3BsYXkgd2l0aCBjb25mdXNpbmcKICAgICBzdHVmZi4gSW5zdGVhZCBvbmx5IHRoZSBhY3R1YWxseSBkb25lIGxpbmtzIGFyZSBkaXNwbGF5ZWQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFBlcm1pdCBudWxsIGVuY3J5cHRpb24gY2lwaGVyc3VpdGVzLCB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiBvbmx5LiBJdCB1c2VkCiAgICAgdG8gYmUgbmVjZXNzYXJ5IHRvIHNldCB0aGUgcHJlcHJvY2Vzc29yIGRlZmluZSBTU0xfQUxMT1dfRU5VTEwgdG8gZG8gdGhpcy4KICAgICBJdCBpcyBub3cgbmVjZXNzYXJ5IHRvIHNldCBTU0xfRk9SQklEX0VOVUxMIHRvIHByZXZlbnQgdGhlIHVzZSBvZiBudWxsCiAgICAgZW5jcnlwdGlvbi4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQWRkIGEgYnVuY2ggb2YgZml4ZXMgdG8gdGhlIFBLQ1MjNyBzdHVmZi4gSXQgdXNlZCB0byBzb21ldGltZXMgcmVvcmRlcgogICAgIHNpZ25lZCBhdHRyaWJ1dGVzIHdoZW4gdmVyaWZ5aW5nIHNpZ25hdHVyZXMgKHRoaXMgd291bGQgYnJlYWsgdGhlbSksIAogICAgIHRoZSBkZXRhY2hlZCBkYXRhIGVuY29kaW5nIHdhcyB3cm9uZyBhbmQgcHVibGljIGtleXMgb2J0YWluZWQgdXNpbmcKICAgICBYNTA5X2dldF9wdWJrZXkoKSB3ZXJlbid0IGZyZWVkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCB0ZXh0IGRvY3VtZW50YXRpb24gZm9yIHRoZSBCVUZGRVIgZnVuY3Rpb25zLiBBbHNvIGFkZGVkIGEgd29yayBhcm91bmQKICAgICB0byBhIFdpbjk1IGNvbnNvbGUgYnVnLiBUaGlzIHdhcyB0cmlnZ2VyZWQgYnkgdGhlIHBhc3N3b3JkIHJlYWQgc3R1ZmY6IHRoZQogICAgIGxhc3QgY2hhcmFjdGVyIHR5cGVkIGdldHMgY2FycmllZCBvdmVyIHRvIHRoZSBuZXh0IGZyZWFkKCkuIElmIHlvdSB3ZXJlIAogICAgIGdlbmVyYXRpbmcgYSBuZXcgY2VydCByZXF1ZXN0IHVzaW5nICdyZXEnIGZvciBleGFtcGxlIHRoZW4gdGhlIGxhc3QKICAgICBjaGFyYWN0ZXIgb2YgdGhlIHBhc3NwaHJhc2Ugd291bGQgYmUgQ1Igd2hpY2ggd291bGQgdGhlbiBlbnRlciB0aGUgZmlyc3QKICAgICBmaWVsZCBhcyBibGFuay4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGRlZCB0aGUgbmV3IGBJbmNsdWRlcyBPcGVuU1NMIENyeXB0b2dyYXBoeSBTb2Z0d2FyZScgYnV0dG9uIGFzCiAgICAgZG9jL29wZW5zc2xfYnV0dG9uLntnaWYsaHRtbH0gd2hpY2ggaXMgc2ltaWxhciBpbiBzdHlsZSB0byB0aGUgb2xkIFNTTGVheQogICAgIGJ1dHRvbiBhbmQgY2FuIGJlIHVzZWQgYnkgYXBwbGljYXRpb25zIGJhc2VkIG9uIE9wZW5TU0wgdG8gc2hvdyB0aGUKICAgICByZWxhdGlvbnNoaXAgdG8gdGhlIE9wZW5TU0wgcHJvamVjdC4gIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmUgY29uZnVzaW5nIHZhcmlhYmxlcyBpbiBmdW5jdGlvbiBzaWduYXR1cmVzIGluIGZpbGVzCiAgICAgc3NsL3NzbF9saWIuYyBhbmQgc3NsL3NzbC5oLgogICAgIFtMZW5uYXJ0IEJvbmcgPGxvYkBrdWx0aGVhLnN0YWNrZW4ua3RoLnNlPl0KCiAgKikgRG9uJ3QgaW5zdGFsbCBic3NfZmlsZS5jIHVuZGVyIFBSRUZJWC9pbmNsdWRlLwogICAgIFtMZW5uYXJ0IEJvbmcgPGxvYkBrdWx0aGVhLnN0YWNrZW4ua3RoLnNlPl0KCiAgKikgR2V0IHRoZSBXaW4zMiBjb21waWxlIHdvcmtpbmcgYWdhaW4uIE1vZGlmeSBta2RlZi5wbCBzbyBpdCBjYW4gaGFuZGxlCiAgICAgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBoYXMgc3VwcG9ydCBmb3IgTlQgc3BlY2lmaWMKICAgICBzdHVmZi4gRml4IG1rMW1mLnBsIGFuZCBWQy0zMi5wbCB0byBzdXBwb3J0IE5UIGRpZmZlcmVuY2VzIGFsc28uIFZhcmlvdXMKICAgICAjaWZkZWYgV0lOMzIgYW5kIFdJTk5UcyBzcHJpbmtsZWQgYWJvdXQgdGhlIHBsYWNlIGFuZCBzb21lIGNoYW5nZXMgZnJvbQogICAgIHVuc2lnbmVkIHRvIHNpZ25lZCB0eXBlczogdGhpcyB3YXMga2lsbGluZyB0aGUgV2luMzIgY29tcGlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgbmV3IGNlcnRpZmljYXRlIGZpbGUgdG8gc3RhY2sgZnVuY3Rpb25zLAogICAgIFNTTF9hZGRfZGlyX2NlcnRfc3ViamVjdHNfdG9fc3RhY2soKSBhbmQKICAgICBTU0xfYWRkX2ZpbGVfY2VydF9zdWJqZWN0c190b19zdGFjaygpLiAgVGhlc2UgbGFyZ2VseSBzdXBwbGFudAogICAgIFNTTF9sb2FkX2NsaWVudF9DQV9maWxlKCksIGFuZCBjYW4gYmUgdXNlZCB0byBhZGQgbXVsdGlwbGUgY2VydHMgZWFzaWx5CiAgICAgdG8gYSBzdGFjayAodXN1YWxseSB0aGlzIGlzIHRoZW4gaGFuZGVkIHRvIFNTTF9DVFhfc2V0X2NsaWVudF9DQV9saXN0KCkpLgogICAgIFRoaXMgbWVhbnMgdGhhdCBBcGFjaGUtU1NMIGFuZCBzaW1pbGFyIHBhY2thZ2VzIGRvbid0IGhhdmUgdG8gbWVzcyBhcm91bmQKICAgICB0byBhZGQgYXMgbWFueSBDQXMgYXMgdGhleSB3YW50IHRvIHRoZSBwcmVmZXJyZWQgbGlzdC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRXhwZXJpbWVudCB3aXRoIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gQ3VycmVudGx5IG9ubHkgcGFydGlhbGx5IGFwcGxpZWQgdG8KICAgICBzc2wvc3NsX2xpYi5jLgogICAgIFNlZSBodHRwOi8vd3d3LnN0YWNrLm5sL35kaW1pdHJpL2RveHlnZW4vaW5kZXguaHRtbCwgYW5kIHJ1biBkb3h5Z2VuIHdpdGgKICAgICBvcGVuc3NsLmRveHkgYXMgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KICAgICBbQmVuIExhdXJpZV0KICAKICAqKSBHZXQgcmlkIG9mIHJlbWFpbmluZyBDKystc3R5bGUgY29tbWVudHMgd2hpY2ggc3RyaWN0IEMgY29tcGlsZXJzIGhhdGUuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIHBvaW50ZWQgb3V0IGJ5IENhcmxvcyBBbWVuZ3VhbF0KCiAgKikgQ2hhbmdlZCBCTl9SRUNVUlNJT04gaW4gYm5fbW9udC5jIHRvIEJOX1JFQ1VSU0lPTl9NT05UIHNvIGl0IGlzIG5vdAogICAgIGNvbXBpbGVkIGluIGJ5IGRlZmF1bHQ6IGl0IGhhcyBwcm9ibGVtcyB3aXRoIGxhcmdlIGtleXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIGEgYnVuY2ggb2YgU1NMX3h4eCgpIGZ1bmN0aW9ucyBmb3IgY29uZmlndXJpbmcgdGhlIHRlbXBvcmFyeSBSU0EgYW5kCiAgICAgREggcHJpdmF0ZSBrZXlzIGFuZC9vciBjYWxsYmFjayBmdW5jdGlvbnMgd2hpY2ggZGlyZWN0bHkgY29ycmVzcG9uZCB0bwogICAgIHRoZWlyIFNTTF9DVFhfeHh4KCkgY291bnRlcnBhcnRzIGJ1dCB3b3JrIG9uIGEgcGVyLWNvbm5lY3Rpb24gYmFzaXMuIFRoaXMKICAgICBpcyBuZWVkZWQgZm9yIGFwcGxpY2F0aW9ucyB3aGljaCBoYXZlIHRvIGNvbmZpZ3VyZSBjZXJ0aWZpY2F0ZXMgb24gYQogICAgIHBlci1jb25uZWN0aW9uIGJhc2lzIChlLmcuIEFwYWNoZSttb2Rfc3NsKSBpbnN0ZWFkIG9mIGEgcGVyLWNvbnRleHQgYmFzaXMKICAgICAoZS5nLiBzX3NlcnZlcikuIAogICAgICAgIEZvciB0aGUgUlNBIGNlcnRpZmljYXRlIHNpdHVhdGlvbiBpcyBtYWtlcyBubyBkaWZmZXJlbmNlLCBidXQKICAgICBmb3IgdGhlIERTQSBjZXJ0aWZpY2F0ZSBzaXR1YXRpb24gdGhpcyBmaXhlcyB0aGUgIm5vIHNoYXJlZCBjaXBoZXIiCiAgICAgcHJvYmxlbSB3aGVyZSB0aGUgT3BlblNTTCBjaXBoZXIgc2VsZWN0aW9uIHByb2NlZHVyZSBmYWlsZWQgYmVjYXVzZSB0aGUKICAgICB0ZW1wb3Jhcnkga2V5cyB3ZXJlIG5vdCBvdmVydGFrZW4gZnJvbSB0aGUgY29udGV4dCBhbmQgdGhlIEFQSSBwcm92aWRlZAogICAgIG5vIHdheSB0byByZWNvbmZpZ3VyZSB0aGVtLiAKICAgICAgICBUaGUgbmV3IGZ1bmN0aW9ucyBub3cgbGV0IGFwcGxpY2F0aW9ucyByZWNvbmZpZ3VyZSB0aGUgc3R1ZmYgYW5kIHRoZXkKICAgICBhcmUgaW4gZGV0YWlsOiBTU0xfbmVlZF90bXBfUlNBLCBTU0xfc2V0X3RtcF9yc2EsIFNTTF9zZXRfdG1wX2RoLAogICAgIFNTTF9zZXRfdG1wX3JzYV9jYWxsYmFjayBhbmQgU1NMX3NldF90bXBfZGhfY2FsbGJhY2suICBBZGRpdGlvbmFsbHkgYSBuZXcKICAgICBub24tcHVibGljLUFQSSBmdW5jdGlvbiBzc2xfY2VydF9pbnN0YW50aWF0ZSgpIGlzIHVzZWQgYXMgYSBoZWxwZXIKICAgICBmdW5jdGlvbiBhbmQgYWxzbyB0byByZWR1Y2UgY29kZSByZWR1bmRhbmN5IGluc2lkZSBzc2xfcnNhLmMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1vdmUgc19zZXJ2ZXIgLWRjZXJ0IGFuZCAtZGtleSBvcHRpb25zIG91dCBvZiB0aGUgdW5kb2N1bWVudGVkIGZlYXR1cmUKICAgICBhcmVhIGJlY2F1c2UgdGhleSBhcmUgdXNlZnVsIGZvciB0aGUgRFNBIHNpdHVhdGlvbiBhbmQgc2hvdWxkIGJlCiAgICAgcmVjb2duaXplZCBieSB0aGUgdXNlcnMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEZpeCB0aGUgY2lwaGVyIGRlY2lzaW9uIHNjaGVtZSBmb3IgZXhwb3J0IGNpcGhlcnM6IHRoZSBleHBvcnQgYml0cyBhcmUKICAgICAqbm90KiB3aXRoaW4gU1NMX01LRVlfTUFTSyBvciBTU0xfQVVUSF9NQVNLLCB0aGV5IGFyZSB3aXRoaW4KICAgICBTU0xfRVhQX01BU0suICBTbywgdGhlIG9yaWdpbmFsIHZhcmlhYmxlIGhhcyB0byBiZSB1c2VkIGluc3RlYWQgb2YgdGhlCiAgICAgYWxyZWFkeSBtYXNrZWQgdmFyaWFibGUuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIEZpeCAncG9ydCcgdmFyaWFibGUgZnJvbSBgaW50JyB0byBgdW5zaWduZWQgaW50JyBpbiBjcnlwdG8vYmlvL2Jfc29jay5jCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIENoYW5nZSB0eXBlIG9mIGFub3RoZXIgbWRfbGVuIHZhcmlhYmxlIGluIHBrN19kb2l0LmM6UEtDUzdfZGF0YUZpbmFsKCkKICAgICBmcm9tIGBpbnQnIHRvIGB1bnNpZ25lZCBpbnQnIGJlY2F1c2UgaXQncyBhIGxlbmd0aCBhbmQgaW5pdGlhbGl6ZWQgYnkKICAgICBFVlBfRGlnZXN0RmluYWwoKSB3aGljaCBleHBlY3RzIGFuIGB1bnNpZ25lZCBpbnQgKicuCiAgICAgW1JpY2hhcmQgTGV2aXR0ZSA8bGV2aXR0ZUBzdGFja2VuLmt0aC5zZT5dCgogICopIERvbid0IGhhcmQtY29kZSBwYXRoIHRvIFBlcmwgaW50ZXJwcmV0ZXIgb24gc2hlYmFuZyBsaW5lIG9mIENvbmZpZ3VyZQogICAgIHNjcmlwdC4gSW5zdGVhZCB1c2UgdGhlIHVzdWFsIFNoZWxsLT5QZXJsIHRyYW5zaXRpb24gdHJpY2suCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1ha2UgYG9wZW5zc2wgeDUwOSAtbm9vdXQgLW1vZHVsdXMnIGZ1bmN0aW9uYWwgYWxzbyBmb3IgRFNBIGNlcnRpZmljYXRlcwogICAgIChpbiBhZGRpdGlvbiB0byBSU0EgY2VydGlmaWNhdGVzKSB0byBtYXRjaCB0aGUgYmVoYXZpb3VyIG9mIGBvcGVuc3NsIGRzYQogICAgIC1ub291dCAtbW9kdWx1cycgYXMgaXQncyBhbHJlYWR5IHRoZSBjYXNlIGZvciBgb3BlbnNzbCByc2EgLW5vb3V0CiAgICAgLW1vZHVsdXMnLiAgRm9yIFJTQSB0aGUgLW1vZHVsdXMgaXMgdGhlIHJlYWwgIm1vZHVsdXMiIHdoaWxlIGZvciBEU0EKICAgICBjdXJyZW50bHkgdGhlIHB1YmxpYyBrZXkgaXMgcHJpbnRlZCAoYSBkZWNpc2lvbiB3aGljaCB3YXMgYWxyZWFkeSBkb25lIGJ5CiAgICAgYG9wZW5zc2wgZHNhIC1tb2R1bHVzJyBpbiB0aGUgcGFzdCkgd2hpY2ggc2VydmVzIGEgc2ltaWxhciBwdXJwb3NlLgogICAgIEFkZGl0aW9uYWxseSB0aGUgTk9fUlNBIG5vIGxvbmdlciBjb21wbGV0ZWx5IHJlbW92ZXMgdGhlIHdob2xlIC1tb2R1bHVzCiAgICAgb3B0aW9uOyBpdCBub3cgb25seSBhdm9pZHMgdXNpbmcgdGhlIFJTQSBzdHVmZi4gU2FtZSBhcHBsaWVzIHRvIE5PX0RTQQogICAgIG5vdywgdG9vLgogICAgIFtSYWxmIFMuICBFbmdlbHNjaGFsbF0KCiAgKikgQWRkIEFybmUgQW5zcGVyJ3MgcmVsaWFibGUgQklPIC0gdGhpcyBpcyBhbiBlbmNyeXB0ZWQsIGJsb2NrLWRpZ2VzdGVkCiAgICAgQklPLiBTZWUgdGhlIHNvdXJjZSAoY3J5cHRvL2V2cC9iaW9fb2suYykgZm9yIG1vcmUgaW5mby4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgRHVtcCB0aGUgb2xkIHl1Y2t5IHJlcSBjb2RlIHRoYXQgdHJpZWQgKGFuZCBmYWlsZWQpIHRvIGFsbG93IHJhdyBPSURzCiAgICAgdG8gYmUgYWRkZWQuIE5vdyBib3RoICdyZXEnIGFuZCAnY2EnIGNhbiB1c2UgbmV3IG9iamVjdHMgZGVmaW5lZCBpbiB0aGUKICAgICBjb25maWcgZmlsZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgY29vbCBCSU8gdGhhdCBkb2VzIHN5c2xvZyAob3IgZXZlbnQgbG9nIG9uIE5UKS4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPiwgaW50ZWdyYXRlZCBieSBCZW4gTGF1cmllXQoKICAqKSBBZGQgc3VwcG9ydCBmb3IgbmV3IFRMUyBjaXBoZXJzdWl0ZXMsIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9SQzRfNTZfTUQ1LAogICAgIFRMU19SU0FfRVhQT1JUNTZfV0lUSF9SQzJfQ0JDXzU2X01ENSBhbmQKICAgICBUTFNfUlNBX0VYUE9SVDU2X1dJVEhfREVTX0NCQ19TSEEsIGFzIHNwZWNpZmllZCBpbiAiNTYtYml0IEV4cG9ydCBDaXBoZXIKICAgICBTdWl0ZXMgRm9yIFRMUyIsIGRyYWZ0LWlldGYtdGxzLTU2LWJpdC1jaXBoZXJzdWl0ZXMtMDAudHh0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgcHJlbGltaW5hcnkgY29uZmlnIGluZm8gZm9yIG5ldyBleHRlbnNpb24gY29kZS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNYWtlIFJTQV9OT19QQURESU5HIHJlYWxseSB1c2Ugbm8gcGFkZGluZy4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEdlbmVyYXRlIGVycm9ycyB3aGVuIHByaXZhdGUvcHVibGljIGtleSBjaGVjayBpcyBkb25lLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBPdmVyaGF1bCBmb3IgJ2NybCcgdXRpbGl0eS4gTmV3IGZ1bmN0aW9uIFg1MDlfQ1JMX3ByaW50LiBQYXJ0aWFsIHN1cHBvcnQKICAgICBmb3Igc29tZSBDUkwgZXh0ZW5zaW9ucyBhbmQgbmV3IG9iamVjdHMgYWRkZWQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVhbGx5IGZpeCB0aGUgQVNOMSBJTVBMSUNJVCBidWcgdGhpcyB0aW1lLi4uIFBhcnRpYWwgc3VwcG9ydCBmb3IgcHJpdmF0ZQogICAgIGtleSB1c2FnZSBleHRlbnNpb24gYW5kIGZ1bGxlciBzdXBwb3J0IGZvciBhdXRob3JpdHkga2V5IGlkLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBPQUVQIGVuY3J5cHRpb24gZm9yIHRoZSBPcGVuU1NMIGNyeXB0byBsaWJyYXJ5LiBPQUVQIGlzIHRoZSBpbXByb3ZlZAogICAgIHBhZGRpbmcgbWV0aG9kIGZvciBSU0EsIHdoaWNoIGlzIHJlY29tbWVuZGVkIGZvciBuZXcgYXBwbGljYXRpb25zIGluIFBLQ1MKICAgICAjMSB2Mi4wIChSRkMgMjQzNywgT2N0b2JlciAxOTk4KS4KICAgICBPQUVQIChPcHRpbWFsIEFzeW1tZXRyaWMgRW5jcnlwdGlvbiBQYWRkaW5nKSBoYXMgYmV0dGVyIHRoZW9yZXRpY2FsCiAgICAgZm91bmRhdGlvbnMgdGhhbiB0aGUgYWQtaG9jIHBhZGRpbmcgdXNlZCBpbiBQS0NTICMxIHYxLjUuIEl0IGlzIHNlY3VyZQogICAgIGFnYWluc3QgQmxlaWNoYmFjaGVyJ3MgYXR0YWNrIG9uIFJTQS4KICAgICBbVWxmIE1vZWxsZXIgPHVsZkBmaXR1Zy5kZT4sIHJlZm9ybWF0dGVkLCBjb3JyZWN0ZWQgYW5kIGludGVncmF0ZWQgYnkKICAgICAgQmVuIExhdXJpZV0KCiAgKikgVXBkYXRlcyB0byB0aGUgbmV3IFNTTCBjb21wcmVzc2lvbiBjb2RlCiAgICAgW0VyaWMgQS4gWW91bmcsIChmcm9tIGNoYW5nZXMgdG8gQzJOZXQgU1NMZWF5LCBpbnRlZ3JhdGVkIGJ5IE1hcmsgQ294KV0KCiAgKikgRml4IHNvIHRoYXQgdGhlIHZlcnNpb24gbnVtYmVyIGluIHRoZSBtYXN0ZXIgc2VjcmV0LCB3aGVuIHBhc3NlZAogICAgIHZpYSBSU0EsIGNoZWNrcyB0aGF0IGlmIFRMUyB3YXMgcHJvcG9zZWQsIGJ1dCB3ZSByb2xsIGJhY2sgdG8gU1NMdjMKICAgICAoYmVjYXVzZSB0aGUgc2VydmVyIHdpbGwgbm90IGFjY2VwdCBoaWdoZXIpLCB0aGF0IHRoZSB2ZXJzaW9uIG51bWJlcgogICAgIGlzIDB4MDMsMHgwMSwgbm90IDB4MDMsMHgwMAogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIFJ1biBleHRlbnNpdmUgbWVtb3J5IGxlYWsgY2hlY2tzIG9uIFNTTCBhcHBzLiBGaXhlZCAqbG90cyogb2YgbWVtb3J5CiAgICAgbGVha3MgaW4gc3NsLyByZWxhdGluZyB0byBuZXcgWDUwOV9nZXRfcHVia2V5KCkgYmVoYXZpb3VyLiBBbHNvIGZpeGVzCiAgICAgaW4gYXBwcy8gYW5kIGFuIHVucmVsYXRlZCBsZWFrIGluIGNyeXB0by9kc2EvZHNhX3ZyZi5jCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgU3VwcG9ydCBmb3IgUkFXIGV4dGVuc2lvbnMgd2hlcmUgYW4gYXJiaXRyYXJ5IGV4dGVuc2lvbiBjYW4gYmUKICAgICBjcmVhdGVkIGJ5IGluY2x1ZGluZyBpdHMgREVSIGVuY29kaW5nLiBTZWUgYXBwcy9vcGVuc3NsLmNuZiBmb3IKICAgICBhbiBleGFtcGxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2Ugc3VyZSBsYXRlc3QgUGVybCB2ZXJzaW9ucyBkb24ndCBpbnRlcnByZXQgc29tZSBnZW5lcmF0ZWQgQyBhcnJheQogICAgIGNvZGUgYXMgUGVybCBhcnJheSBjb2RlIGluIHRoZSBjcnlwdG8vZXJyL2Vycl9nZW5jLnBsIHNjcmlwdC4KICAgICBbTGFycyBXZWJlciA8M3dlYmVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBNb2RpZnkgbXMvZG9fbXMuYmF0IHRvIG5vdCBnZW5lcmF0ZSBhc3NlbWJseSBsYW5ndWFnZSBtYWtlZmlsZXMgc2luY2UKICAgICBub3QgbWFueSBwZW9wbGUgaGF2ZSB0aGUgYXNzZW1ibGVyLiBWYXJpb3VzIFdpbjMyIGNvbXBpbGF0aW9uIGZpeGVzIGFuZAogICAgIHVwZGF0ZSB0byB0aGUgSU5TVEFMTC5XMzIgZmlsZSB3aXRoIChob3BlZnVsbHkpIG1vcmUgYWNjdXJhdGUgV2luMzIKICAgICBidWlsZCBpbnN0cnVjdGlvbnMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGNvbmZpZ3VyZSBzY3JpcHQgJ0NvbmZpZ3VyZScgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgY3J5cHRvL2RhdGUuaAogICAgIGZpbGUgdW5kZXIgV2luMzIgYW5kIGFsc28gYnVpbGQgcGVtLmggZnJvbSBwZW0ub3JnLiBOZXcgc2NyaXB0CiAgICAgdXRpbC9ta2ZpbGVzLnBsIHRvIGNyZWF0ZSB0aGUgTUlORk8gZmlsZSBvbiBlbnZpcm9ubWVudHMgdGhhdCBjYW4ndCBkbyBhCiAgICAgJ21ha2UgZmlsZXMnOiBwZXJsIHV0aWwvbWtmaWxlcy5wbCA+TUlORk8gc2hvdWxkIHdvcmsuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFqb3IgcmV3b3JrIG9mIERFUyBmdW5jdGlvbiBkZWNsYXJhdGlvbnMsIGluIHRoZSBwdXJzdWl0IG9mIGNvcnJlY3RuZXNzCiAgICAgYW5kIHB1cml0eS4gQXMgYSByZXN1bHQsIG1hbnkgZXZpbCBjYXN0cyBldmFwb3JhdGVkLCBhbmQgc29tZSB3ZWlyZG5lc3MsCiAgICAgdG9vLiBZb3UgbWF5IGZpbmQgdGhpcyBjYXVzZXMgd2FybmluZ3MgaW4geW91ciBjb2RlLiBaYXBwaW5nIHlvdXIgZXZpbAogICAgIGNhc3RzIHdpbGwgcHJvYmFibHkgZml4IHRoZW0uIE1vc3RseS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IGZvciBhIHR5cG8gaW4gYXNuMS5oLiBCdWcgZml4IHRvIG9iamVjdCBjcmVhdGlvbiBzY3JpcHQKICAgICBvYmpfZGF0LnBsLiBJdCBjb25zaWRlcmVkIGEgemVybyBpbiBhbiBvYmplY3QgZGVmaW5pdGlvbiB0byBtZWFuCiAgICAgImVuZCBvZiBvYmplY3QiOiBub25lIG9mIHRoZSBvYmplY3RzIGluIG9iamVjdHMuaCBoYXZlIGFueSB6ZXJvcwogICAgIHNvIGl0IHdhc24ndCBzcG90dGVkLgogICAgIFtTdGV2ZSBIZW5zb24sIHJlcG9ydGVkIGJ5IEVyd2FubiBBQkFMRUEgPGVhYmFsZWFAY2VydHBsdXMuY29tPl0KCiAgKikgQWRkIHN1cHBvcnQgZm9yIFRyaXBsZSBERVMgQ2lwaGVyIEJsb2NrIENoYWluaW5nIHdpdGggT3V0cHV0IEZlZWRiYWNrCiAgICAgTWFza2luZyAoQ0JDTSkuIEluIHRoZSBhYnNlbmNlIG9mIHRlc3QgdmVjdG9ycywgdGhlIGJlc3QgSSBoYXZlIGJlZW4gYWJsZQogICAgIHRvIGRvIGlzIGNoZWNrIHRoYXQgdGhlIGRlY3J5cHQgdW5kb2VzIHRoZSBlbmNyeXB0LCBzbyBmYXIuIFNlbmQgbWUgdGVzdAogICAgIHZlY3RvcnMgaWYgeW91IGhhdmUgdGhlbS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgQ29ycmVjdCBjYWxjdWxhdGlvbiBvZiBrZXkgbGVuZ3RoIGZvciBleHBvcnQgY2lwaGVycyAodG9vIG11Y2ggc3BhY2Ugd2FzCiAgICAgYWxsb2NhdGVkIGZvciBudWxsIGNpcGhlcnMpLiBUaGlzIGhhcyBub3QgYmVlbiB0ZXN0ZWQhCiAgICAgW0JlbiBMYXVyaWVdCgogICopIE1vZGlmaWNhdGlvbnMgdG8gdGhlIG1rZGVmLnBsIGZvciBXaW4zMiBERUYgZmlsZSBjcmVhdGlvbi4gVGhlIHVzYWdlCiAgICAgbWVzc2FnZSBpcyBub3cgY29ycmVjdCAoaXQgdW5kZXJzdGFuZHMgImNyeXB0byIgYW5kICJzc2wiIG9uIGl0cwogICAgIGNvbW1hbmQgbGluZSkuIFRoZXJlIGlzIGFsc28gbm93IGFuICJ1cGRhdGUiIG9wdGlvbi4gVGhpcyB3aWxsIHVwZGF0ZQogICAgIHRoZSB1dGlsL3NzbGVheS5udW0gYW5kIHV0aWwvbGliZWF5Lm51bSBmaWxlcyB3aXRoIGFueSBuZXcgZnVuY3Rpb25zLgogICAgIElmIHlvdSBkbyBhOiAKICAgICBwZXJsIHV0aWwvbWtkZWYucGwgY3J5cHRvIHNzbCB1cGRhdGUKICAgICBpdCB3aWxsIHVwZGF0ZSB0aGVtLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE92ZXJoYXVsZWQgdGhlIFBlcmwgaW50ZXJmYWNlIChwZXJsLyopOgogICAgIC0gcG9ydGVkIEJOIHN0dWZmIHRvIE9wZW5TU0wncyBkaWZmZXJlbnQgQk4gbGlicmFyeQogICAgIC0gbWFkZSB0aGUgcGVybC8gc291cmNlIHRyZWUgQ1ZTLWF3YXJlCiAgICAgLSByZW5hbWVkIHRoZSBwYWNrYWdlIGZyb20gU1NMZWF5IHRvIE9wZW5TU0wgKHRoZSBmaWxlcyBzdGlsbCBjb250YWluCiAgICAgICB0aGVpciBoaXN0b3J5IGJlY2F1c2UgSSd2ZSBjb3BpZWQgdGhlbSBpbiB0aGUgcmVwb3NpdG9yeSkKICAgICAtIHJlbW92ZWQgb2Jzb2xldGUgZmlsZXMgKHRoZSB0ZXN0IHNjcmlwdHMgd2lsbCBiZSByZXBsYWNlZAogICAgICAgYnkgYmV0dGVyIFRlc3Q6Okhhcm5lc3MgdmFyaWFudHMgaW4gdGhlIGZ1dHVyZSkKICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRmlyc3QgY3V0IGZvciBhIHZlcnkgY29uc2VydmF0aXZlIHNvdXJjZSB0cmVlIGNsZWFudXA6CiAgICAgMS4gbWVyZ2UgdmFyaW91cyBvYnNvbGV0ZSByZWFkbWUgdGV4dHMgaW50byBkb2Mvc3NsZWF5LnR4dAogICAgIHdoZXJlIHdlIGNvbGxlY3QgdGhlIG9sZCBkb2N1bWVudHMgYW5kIHJlYWRtZSB0ZXh0cy4KICAgICAyLiByZW1vdmUgdGhlIGZpcnN0IHBhcnQgb2YgZmlsZXMgd2hlcmUgSSdtIGFscmVhZHkgc3VyZSB0aGF0IHdlIG5vCiAgICAgbG9uZ2VyIG5lZWQgdGhlbSBiZWNhdXNlIG9mIHRocmVlIHJlYXNvbnM6IGVpdGhlciB0aGV5IGFyZSBqdXN0IHRlbXBvcmFyeQogICAgIGZpbGVzIHdoaWNoIHdlcmUgbGVmdCBieSBFcmljIG9yIHRoZXkgYXJlIHByZXNlcnZlZCBvcmlnaW5hbCBmaWxlcyB3aGVyZQogICAgIEkndmUgdmVyaWZpZWQgdGhhdCB0aGUgZGlmZiBpcyBhbHNvIGF2YWlsYWJsZSBpbiB0aGUgQ1ZTIHZpYSAiY3ZzIGRpZmYKICAgICAtclNTTGVheV8wXzhfMWIiIG9yIHRoZXkgd2VyZSByZW5hbWVkIChhcyBpdCB3YXMgZGVmaW5pdGVseSB0aGUgY2FzZSBmb3IKICAgICB0aGUgY3J5cHRvL21kLyBzdHVmZikuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIE1vcmUgZXh0ZW5zaW9uIGNvZGUuIEluY29tcGxldGUgc3VwcG9ydCBmb3Igc3ViamVjdCBhbmQgaXNzdWVyIGFsdAogICAgIG5hbWUsIGlzc3VlciBhbmQgYXV0aG9yaXR5IGtleSBpZC4gQ2hhbmdlIHRoZSBpMnYgZnVuY3Rpb24gcGFyYW1ldGVycwogICAgIGFuZCBhZGQgYW4gZXh0cmEgJ2NybCcgcGFyYW1ldGVyIGluIHRoZSBYNTA5VjNfQ1RYIHN0cnVjdHVyZTogZ3Vlc3MKICAgICB3aGF0IHRoYXQncyBmb3IgOi0pIEZpeCB0byBBU04xIG1hY3JvIHdoaWNoIG1lc3NlZCB1cAogICAgIElNUExJQ0lUIHRhZyBhbmQgYWRkIGZfZW51bS5jIHdoaWNoIGFkZHMgYTJpLCBpMmEgZm9yIEVOVU1FUkFURUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUHJlbGltaW5hcnkgc3VwcG9ydCBmb3IgRU5VTUVSQVRFRCB0eXBlLiBUaGlzIGlzIGxhcmdlbHkgY29waWVkIGZyb20gdGhlCiAgICAgSU5URUdFUiBjb2RlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBuZXcgZnVuY3Rpb24sIEVWUF9NRF9DVFhfY29weSgpIHRvIHJlcGxhY2UgZnJlcXVlbnQgdXNlIG9mIG1lbWNweS4KICAgICBbRXJpYyBBLiBZb3VuZywgKGZyb20gY2hhbmdlcyB0byBDMk5ldCBTU0xlYXksIGludGVncmF0ZWQgYnkgTWFyayBDb3gpXQoKICAqKSBNYWtlIHN1cmUgYG1ha2UgcmVoYXNoJyB0YXJnZXQgcmVhbGx5IGZpbmRzIHRoZSBgb3BlbnNzbCcgcHJvZ3JhbS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbCwgTWF0dGhpYXMgTG9lcGZlIDxNYXR0aGlhcy5Mb2VwZmVAYWRub3Z1bS5jaD5dCgogICopIFNxdWVlemUgYW5vdGhlciA3JSBvZiBzcGVlZCBvdXQgb2YgTUQ1IGFzc2VtYmxlciwgYXQgbGVhc3Qgb24gYSBQMi4gSSdkCiAgICAgbGlrZSB0byBoZWFyIGFib3V0IGl0IGlmIHRoaXMgc2xvd3MgZG93biBvdGhlciBwcm9jZXNzb3JzLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBBZGQgQ3lnV2luMzIgcGxhdGZvcm0gaW5mb3JtYXRpb24gdG8gQ29uZmlndXJlIHNjcmlwdC4KICAgICBbQWxhbiBCYXRpZSA8YmF0aWVAYWFoei5qZi5pbnRlbC5jb20+XQoKICAqKSBGaXhlZCBtcy8zMmFsbC5iYXQgc2NyaXB0OiBgbm9fYXNtJyAtPiBgbm8tYXNtJwogICAgIFtSYWluZXIgVy4gR2VybGluZyA8Z2VybGluZ0BtcGctZ3YubXBnLmRlPl0KICAKICAqKSBOZXcgcHJvZ3JhbSBuc2VxIHRvIG1hbmlwdWxhdGUgbmV0c2NhcGUgY2VydGlmaWNhdGUgc2VxdWVuY2VzCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9kaWZ5IGNybDJwa2NzNyBzbyBpdCBzdXBwb3J0cyBtdWx0aXBsZSAtY2VydGZpbGUgYXJndW1lbnRzLiBGaXggYQogICAgIGZldyB0eXBvcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXhlcyB0byBCTiBjb2RlLiAgUHJldmlvdXNseSB0aGUgZGVmYXVsdCB3YXMgdG8gZGVmaW5lIEJOX1JFQ1VSU0lPTgogICAgIGJ1dCB0aGUgQk4gY29kZSBoYWQgc29tZSBwcm9ibGVtcyB0aGF0IHdvdWxkIGNhdXNlIGZhaWx1cmVzIHdoZW4KICAgICBkb2luZyBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gYW5kIHNvbWUgb3RoZXIgZnVuY3Rpb25zLgogICAgIFtFcmljIEEuIFlvdW5nLCAoZnJvbSBjaGFuZ2VzIHRvIEMyTmV0IFNTTGVheSwgaW50ZWdyYXRlZCBieSBNYXJrIENveCldCgogICopIEFkZCBBU04xIGFuZCBQRU0gY29kZSB0byBzdXBwb3J0IG5ldHNjYXBlIGNlcnRpZmljYXRlIHNlcXVlbmNlcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQVNOMSBhbmQgUEVNIGNvZGUgdG8gc3VwcG9ydCBuZXRzY2FwZSBjZXJ0aWZpY2F0ZSBzZXF1ZW5jZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQWRkIHNldmVyYWwgUEtJWCBhbmQgcHJpdmF0ZSBleHRlbmRlZCBrZXkgdXNhZ2UgT0lEcy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNb2RpZnkgdGhlICdjYScgcHJvZ3JhbSB0byBoYW5kbGUgdGhlIG5ldyBleHRlbnNpb24gY29kZS4gTW9kaWZ5CiAgICAgb3BlbnNzbC5jbmYgZm9yIG5ldyBleHRlbnNpb24gZm9ybWF0LCBhZGQgY29tbWVudHMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTW9yZSBYNTA5IFYzIGNoYW5nZXMuIEZpeCB0eXBvIGluIHYzX2JpdHN0ci5jLiBBZGQgc3VwcG9ydCB0byAncmVxJwogICAgIGFuZCBhZGQgYSBzYW1wbGUgdG8gb3BlbnNzbC5jbmYgc28gcmVxIC14NTA5IG5vdyBhZGRzIGFwcHJvcHJpYXRlCiAgICAgQ0EgZXh0ZW5zaW9ucy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBDb250aW51ZWQgWDUwOSBWMyBjaGFuZ2VzLiBBZGQgdG8gb3RoZXIgbWFrZWZpbGVzLCBpbnRlZ3JhdGUgd2l0aCB0aGUKICAgICBlcnJvciBjb2RlLCBhZGQgaW5pdGlhbCBzdXBwb3J0IHRvIFg1MDlfcHJpbnQoKSBhbmQgeDUwOSBhcHBsaWNhdGlvbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBUYWtlcyBhIGRlZXAgYnJlYXRoIGFuZCBzdGFydCBhZGRkaW5nIFg1MDkgVjMgZXh0ZW5zaW9uIHN1cHBvcnQgY29kZS4gQWRkCiAgICAgZmlsZXMgaW4gY3J5cHRvL3g1MDl2My4gTW92ZSBvcmlnaW5hbCBzdHVmZiB0byBjcnlwdG8veDUwOXYzL29sZC4gQWxsIHRoaXMKICAgICBzdHVmZiBpcyBjdXJyZW50bHkgaXNvbGF0ZWQgYW5kIGlzbid0IGV2ZW4gY29tcGlsZWQgeWV0LgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvbnRpbnVpbmcgcGF0Y2hlcyBmb3IgR2VuZXJhbGl6ZWRUaW1lLiBGaXggdXAgY2VydGlmaWNhdGUgYW5kIENSTAogICAgIEFTTjEgdG8gdXNlIEFTTjFfVElNRSBhbmQgbW9kaWZ5IHByaW50IHJvdXRpbmVzIHRvIHVzZSBBU04xX1RJTUVfcHJpbnQuCiAgICAgUmVtb3ZlZCB0aGUgdmVyc2lvbnMgY2hlY2sgZnJvbSBYNTA5IHJvdXRpbmVzIHdoZW4gbG9hZGluZyBleHRlbnNpb25zOgogICAgIHRoaXMgYWxsb3dzIGNlcnRhaW4gYnJva2VuIGNlcnRpZmljYXRlcyB0aGF0IGRvbid0IHNldCB0aGUgdmVyc2lvbgogICAgIHByb3Blcmx5IHRvIGJlIHByb2Nlc3NlZC4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBEZWFsIHdpdGggaXJyaXRhdGluZyBzaGl0IHRvIGRvIHdpdGggZGVwZW5kZW5jaWVzLCBpbiBZQUFIVyAoWWV0IEFub3RoZXIKICAgICBBZCBIb2MgV2F5KSAtIE1ha2VmaWxlLnNzbHMgbm93IGFsbCBjb250YWluIGxvY2FsIGRlcGVuZGVuY2llcywgd2hpY2gKICAgICBjYW4gc3RpbGwgYmUgcmVnZW5lcmF0ZWQgd2l0aCAibWFrZSBkZXBlbmQiLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTcGVsbGluZyBtaXN0YWtlIGluIEMgdmVyc2lvbiBvZiBDQVNULTEyOC4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgYnkgSmVyZW15IEh5bHRvbiA8amVyZW15QGNucmkucmVzdG9uLnZhLnVzPl0KCiAgKikgQ2hhbmdlcyB0byB0aGUgZXJyb3IgZ2VuZXJhdGlvbiBjb2RlLiBUaGUgcGVybCBzY3JpcHQgZXJyLWNvZGUucGwgCiAgICAgbm93IHJlYWRzIGluIHRoZSBvbGQgZXJyb3IgY29kZXMgYW5kIHJldGFpbnMgdGhlIG9sZCBudW1iZXJzLCBvbmx5CiAgICAgYWRkaW5nIG5ldyBvbmVzIGlmIG5lY2Vzc2FyeS4gSXQgYWxzbyBvbmx5IGNoYW5nZXMgdGhlIC5lcnIgZmlsZXMgaWYgbmV3CiAgICAgY29kZXMgYXJlIGFkZGVkLiBUaGUgbWFrZWZpbGVzIGhhdmUgYmVlbiBtb2RpZmllZCB0byBvbmx5IGluc2VydCBlcnJvcnMKICAgICB3aGVuIG5lZWRlZCAodG8gYXZvaWQgbmVlZGxlc3NseSBtb2RpZnlpbmcgaGVhZGVyIGZpbGVzKS4gVGhpcyBpcyBkb25lCiAgICAgYnkgb25seSBpbnNlcnRpbmcgZXJyb3JzIGlmIHRoZSAuZXJyIGZpbGUgaXMgbmV3ZXIgdGhhbiB0aGUgYXV0byBnZW5lcmF0ZWQKICAgICBDIGZpbGUuIFRvIHJlYnVpbGQgYWxsIHRoZSBlcnJvciBjb2RlcyBmcm9tIHNjcmF0Y2ggKHRoZSBvbGQgYmVoYXZpb3VyKQogICAgIGVpdGhlciBtb2RpZnkgY3J5cHRvL01ha2VmaWxlLnNzbCB0byBwYXNzIHRoZSAtcmVnZW4gZmxhZyB0byBlcnJfY29kZS5wbAogICAgIG9yIGRlbGV0ZSBhbGwgdGhlIC5lcnIgZmlsZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgQ0FTVC0xMjggd2FzIGluY29ycmVjdGx5IGltcGxlbWVudGVkIGZvciBzaG9ydCBrZXlzLiBUaGUgQyB2ZXJzaW9uIGhhcwogICAgIGJlZW4gZml4ZWQsIGJ1dCBpcyB1bnRlc3RlZC4gVGhlIGFzc2VtYmxlciB2ZXJzaW9ucyBhcmUgYWxzbyBmaXhlZCwgYnV0CiAgICAgbmV3IGFzc2VtYmxlciBIQVMgTk9UIEJFRU4gR0VORVJBVEVEIEZPUiBXSU4zMiAtIHRoZSBNYWtlZmlsZSBuZWVkcyBmaXhpbmcKICAgICB0byByZWdlbmVyYXRlIGl0IGlmIG5lZWRlZC4KICAgICBbQmVuIExhdXJpZSwgcmVwb3J0ZWQgKHdpdGggZml4IGZvciBDIHZlcnNpb24pIGJ5IEp1bi1pY2hpcm8gaXRvanVuCiAgICAgIEhhZ2lubyA8aXRvanVuQGthbWUubmV0Pl0KCiAgKikgRmlsZSB3YXMgb3BlbmVkIGluY29ycmVjdGx5IGluIHJhbmRmaWxlLmMuCiAgICAgW1VsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIEJlZ2lubmluZyBvZiBzdXBwb3J0IGZvciBHZW5lcmFsaXplZFRpbWUuIGQyaSwgaTJkLCBjaGVjayBhbmQgcHJpbnQKICAgICBmdW5jdGlvbnMuIEFsc28gQVNOMV9USU1FIHN1aXRlIHdoaWNoIGlzIGEgQ0hPSUNFIG9mIFVUQ1RpbWUgb3IKICAgICBHZW5lcmFsaXplZFRpbWUuIEFTTjFfVElNRSBpcyB0aGUgcHJvcGVyIHR5cGUgdXNlZCBpbiBjZXJ0aWZpY2F0ZXMgZXQKICAgICBhbDogaXQncyBqdXN0IGFsbW9zdCBhbHdheXMgYSBVVENUaW1lLiBOb3RlIHRoaXMgcGF0Y2ggYWRkcyBuZXcgZXJyb3IKICAgICBjb2RlcyBzbyBkbyBhICJtYWtlIGVycm9ycyIgaWYgdGhlcmUgYXJlIHByb2JsZW1zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIENvcnJlY3QgTGludXggMSByZWNvZ25pdGlvbiBpbiBjb25maWcuCiAgICAgW1VsZiBN9mxsZXIgPHVsZkBmaXR1Zy5kZT5dCgogICopIFJlbW92ZSBwb2ludGxlc3MgTUQ1IGhhc2ggd2hlbiB1c2luZyBEU0Ega2V5cyBpbiBjYS4KICAgICBbQW5vbnltb3VzIDxub2JvZHlAcmVwbGF5LmNvbT5dCgogICopIEdlbmVyYXRlIGFuIGVycm9yIGlmIGdpdmVuIGFuIGVtcHR5IHN0cmluZyBhcyBhIGNlcnQgZGlyZWN0b3J5LiBBbHNvCiAgICAgZ2VuZXJhdGUgYW4gZXJyb3IgaWYgaGFuZGVkIE5VTEwgKHByZXZpb3VzbHkgcmV0dXJuZWQgMCB0byBpbmRpY2F0ZSBhbgogICAgIGVycm9yLCBidXQgZGlkbid0IHNldCBvbmUpLgogICAgIFtCZW4gTGF1cmllLCByZXBvcnRlZCBieSBBbm9ueW1vdXMgPG5vYm9keUByZXBsYXkuY29tPl0KCiAgKikgQWRkIHByb3RvdHlwZXMgdG8gU1NMIG1ldGhvZHMuIE1ha2UgU1NMX3dyaXRlJ3MgYnVmZmVyIGNvbnN0LCBhdCBsYXN0LgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIGR1bW15IGZ1bmN0aW9uIEJOX3JlZl9tb2RfZXhwKCkgaW4gcnNhcmVmLmMgdG8gaGF2ZSB0aGUgY29ycmVjdAogICAgIHBhcmFtZXRlcnMuIFRoaXMgd2FzIGNhdXNpbmcgYSB3YXJuaW5nIHdoaWNoIGtpbGxlZCBvZmYgdGhlIFdpbjMyIGNvbXBpbGUuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgUmVtb3ZlIEMrKyBzdHlsZSBjb21tZW50cyBmcm9tIGNyeXB0by9ibi9ibl9sb2NhbC5oLgogICAgIFtOZWlsIENvc3RpZ2FuIDxuZWlsLmNvc3RpZ2FuQGNlbG9jb20uY29tPl0KCiAgKikgVGhlIGZ1bmN0aW9uIE9CSl90eHQybmlkIHdhcyBicm9rZW4uIEl0IHdhcyBzdXBwb3NlZCB0byByZXR1cm4gYSBuaWQKICAgICBiYXNlZCBvbiBhIHRleHQgc3RyaW5nLCBsb29raW5nIHVwIHNob3J0IGFuZCBsb25nIG5hbWVzIGFuZCBmaW5hbGx5CiAgICAgImRvdCIgZm9ybWF0LiBUaGUgImRvdCIgZm9ybWF0IHN0dWZmIGRpZG4ndCB3b3JrLiBBZGRlZCBuZXcgZnVuY3Rpb24KICAgICBPQkpfdHh0Mm9iaiB0byBkbyB0aGUgc2FtZSBidXQgcmV0dXJuIGFuIEFTTjFfT0JKRUNUIGFuZCByZXdyb3RlIAogICAgIE9CSl90eHQybmlkIHRvIHVzZSBpdC4gT0JKX3R4dDJvYmogY2FuIGFsc28gcmV0dXJuIG9iamVjdHMgZXZlbiBpZiB0aGUKICAgICBPSUQgaXMgbm90IHBhcnQgb2YgdGhlIHRhYmxlLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEFkZCBwcm90b3R5cGVzIHRvIFg1MDkgbG9va3VwL3ZlcmlmeSBtZXRob2RzLCBmaXhpbmcgYSBidWcgaW4KICAgICBYNTA5X0xPT0tVUF9ieV9hbGlhcygpLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBTb3J0IG9wZW5zc2wgZnVuY3Rpb25zIGJ5IG5hbWUuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEdldCB0aGUgZ2VuZHNhIHByb2dyYW0gd29ya2luZyAoaG9wZWZ1bGx5KSBhbmQgYWRkIGl0IHRvIGFwcCBsaXN0LiBSZW1vdmUKICAgICBlbmNyeXB0aW9uIGZyb20gc2FtcGxlIERTQSBrZXlzIChpbiBjYXNlIGFueW9uZSBpcyBpbnRlcmVzdGVkIHRoZSBwYXNzd29yZAogICAgIHdhcyAiMTIzNCIpLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIE1ha2UgX2FsbF8gKl9mcmVlIGZ1bmN0aW9ucyBhY2NlcHQgYSBOVUxMIHBvaW50ZXIuCiAgICAgW0ZyYW5zIEhleW1hbnMgPGZoZXltYW5zQGlzYXNlcnZlci5iZT5dCgogICopIElmIGEgREgga2V5IGlzIGdlbmVyYXRlZCBpbiBzM19zcnZyLmMsIGRvbid0IGJsb3cgaXQgYnkgdHJ5aW5nIHRvIHVzZQogICAgIE5VTEwgcG9pbnRlcnMuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBzX3NlcnZlciBzaG91bGQgc2VuZCB0aGUgQ0FmaWxlIGFzIGFjY2VwdGFibGUgQ0FzLCBub3QgaXRzIG93biBjZXJ0LgogICAgIFtCb2RvIE1vZWxsZXIgPDNtb2VsbGVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBEb24ndCBibG93IGl0IGZvciBudW1lcmljIC1uZXdrZXkgYXJndW1lbnRzIHRvIGFwcHMvcmVxLgogICAgIFtCb2RvIE1vZWxsZXIgPDNtb2VsbGVyQGluZm9ybWF0aWsudW5pLWhhbWJ1cmcuZGU+XQoKICAqKSBUZW1wIGtleSAiZm9yIGV4cG9ydCIgdGVzdHMgd2VyZSB3cm9uZyBpbiBzM19zcnZyLmMuCiAgICAgW0Fub255bW91cyA8bm9ib2R5QHJlcGxheS5jb20+XQoKICAqKSBBZGQgcHJvdG90eXBlIGZvciB0ZW1wIGtleSBjYWxsYmFjayBmdW5jdGlvbnMKICAgICBTU0xfQ1RYX3NldF90bXBfe3JzYSxkaH1fY2FsbGJhY2soKS4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgTWFrZSBESF9mcmVlKCkgdG9sZXJhdGUgYmVpbmcgcGFzc2VkIGEgTlVMTCBwb2ludGVyIChsaWtlIFJTQV9mcmVlKCkgYW5kCiAgICAgRFNBX2ZyZWUoKSkuIE1ha2UgWDUwOV9QVUJLRVlfc2V0KCkgY2hlY2sgZm9yIGVycm9ycyBpbiBkMmlfUHVibGljS2V5KCkuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgWDUwOV9uYW1lX2FkZF9lbnRyeSgpIGZyZWVkIHRoZSB3cm9uZyB0aGluZyBhZnRlciBhbiBlcnJvci4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgcnNhX2VheS5jIHdvdWxkIGF0dGVtcHQgdG8gZnJlZSBhIE5VTEwgY29udGV4dC4KICAgICBbQXJuZSBBbnNwZXIgPGFybmVAYXRzLmN5YmVyLmVlPl0KCiAgKikgQklPX3Nfc29ja2V0KCkgaGFkIGEgYnJva2VuIHNob3VsZF9yZXRyeSgpIG9uIFdpbmRvemUuCiAgICAgW0FybmUgQW5zcGVyIDxhcm5lQGF0cy5jeWJlci5lZT5dCgogICopIEJJT19mX2J1ZmZlcigpIGRpZG4ndCBwYXNzIG9uIEJJT19DVFJMX0ZMVVNILgogICAgIFtBcm5lIEFuc3BlciA8YXJuZUBhdHMuY3liZXIuZWU+XQoKICAqKSBNYWtlIHN1cmUgdGhlIGFscmVhZHkgZXhpc3RpbmcgWDUwOV9TVE9SRS0+ZGVwdGggdmFyaWFibGUgaXMgaW5pdGlhbGl6ZWQKICAgICBpbiBYNTA5X1NUT1JFX25ldygpLCBidXQgZG9jdW1lbnQgdGhlIGZhY3QgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIHN0aWxsCiAgICAgdW51c2VkIGluIHRoZSBjZXJ0aWZpY2F0ZSB2ZXJpZmljYXRpb24gcHJvY2Vzcy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgRml4IHRoZSB2YXJpb3VzIGxpYnJhcnkgYW5kIGFwcHMgZmlsZXMgdG8gZnJlZSB1cCBwa2V5cyBvYnRhaW5lZCBmcm9tCiAgICAgWDUwOV9QVUJLRVlfZ2V0KCkgZXQgYWwuIEFsc28gYWxsb3cgeDUwOS5jIHRvIGhhbmRsZSBuZXRzY2FwZSBleHRlbnNpb25zLgogICAgIFtTdGV2ZSBIZW5zb25dCgogICopIEZpeCByZWZlcmVuY2UgY291bnRpbmcgaW4gWDUwOV9QVUJLRVlfZ2V0KCkuIFRoaXMgbWFrZXMKICAgICBkZW1vcy9tYXVyaWNlL2V4YW1wbGUyLmMgd29yaywgYW1vbmdzdCBvdGhlcnMsIHByb2JhYmx5LgogICAgIFtTdGV2ZSBIZW5zb24gYW5kIEJlbiBMYXVyaWVdCgogICopIEZpcnN0IGN1dCBvZiBhIGNsZWFudXAgZm9yIGFwcHMvLiBGaXJzdCB0aGUgYHNzbGVheScgcHJvZ3JhbSBpcyBub3cgbmFtZWQKICAgICBgb3BlbnNzbCcgYW5kIHNlY29uZCwgdGhlIHNob3J0Y3V0IHN5bWxpbmtzIGZvciB0aGUgYG9wZW5zc2wgPGNvbW1hbmQ+JwogICAgIGFyZSBubyBsb25nZXIgY3JlYXRlZC4gVGhpcyB3YXkgd2UgaGF2ZSBhIHNpbmdsZSBhbmQgY29uc2lzdGVudCBjb21tYW5kCiAgICAgbGluZSBpbnRlcmZhY2UgYG9wZW5zc2wgPGNvbW1hbmQ+Jywgc2ltaWxhciB0byBgY3ZzIDxjb21tYW5kPicuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGwsIFBhdWwgU3V0dG9uIGFuZCBCZW4gTGF1cmllXQoKICAqKSBjYS5jOiBtb3ZlIHRlc3QgZm9yIERTQSBrZXlzIGluc2lkZSAjaWZuZGVmIE5PX0RTQS4gTWFrZSBwdWJrZXkKICAgICBCSVQgU1RSSU5HIHdyYXBwZXIgYWx3YXlzIGhhdmUgemVybyB1bnVzZWQgYml0cy4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBBZGQgQ0EucGwsIHBlcmwgdmVyc2lvbiBvZiBDQS5zaCwgYWRkIGV4dGVuZGVkIGtleSB1c2FnZSBPSUQuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgTWFrZSB0aGUgdG9wLWxldmVsIElOU1RBTEwgZG9jdW1lbnRhdGlvbiBlYXNpZXIgdG8gdW5kZXJzdGFuZC4KICAgICBbUGF1bCBTdXR0b25dCgogICopIE1ha2VmaWxlcyB1cGRhdGVkIHRvIGV4aXQgaWYgYW4gZXJyb3Igb2NjdXJzIGluIGEgc3ViLWRpcmVjdG9yeQogICAgIG1ha2UgKGluY2x1ZGluZyBpZiB1c2VyIHByZXNzZXMgXkMpIFtQYXVsIFN1dHRvbl0KCiAgKikgTWFrZSBNb250Z29tZXJ5IGNvbnRleHQgc3R1ZmYgZXhwbGljaXQgaW4gUlNBIGRhdGEgc3RydWN0dXJlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggYnVpbGQgb3JkZXIgb2YgcGVtIGFuZCBlcnIgdG8gYWxsb3cgZm9yIGdlbmVyYXRlZCBwZW0uaC4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHJlbnVtYmVyaW5nIGJ1ZyBpbiBYNTA5X05BTUVfZGVsZXRlX2VudHJ5KCkuCiAgICAgW0JlbiBMYXVyaWVdCgogICopIEVuaGFuY2VkIHRoZSBlcnItaW5zLnBsIHNjcmlwdCBzbyBpdCBtYWtlcyB0aGUgZXJyb3IgbGlicmFyeSBudW1iZXIgCiAgICAgZ2xvYmFsIGFuZCBjYW4gYWRkIGEgbGlicmFyeSBuYW1lLiBUaGlzIGlzIG5lZWRlZCBmb3IgZXh0ZXJuYWwgQVNOMSBhbmQKICAgICBvdGhlciBlcnJvciBsaWJyYXJpZXMuCiAgICAgW1N0ZXZlIEhlbnNvbl0KCiAgKikgRml4ZWQgc2tfaW5zZXJ0IHdoaWNoIG5ldmVyIHdvcmtlZCBwcm9wZXJseS4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBGaXggQVNOMSBtYWNyb3Mgc28gdGhleSBjYW4gaGFuZGxlIGluZGVmaW5pdGUgbGVuZ3RoIGNvbnN0cnV0ZWQgCiAgICAgRVhQTElDSVQgdGFncy4gU29tZSBub24gc3RhbmRhcmQgY2VydGlmaWNhdGVzIHVzZSB0aGVzZTogdGhleSBjYW4gbm93CiAgICAgYmUgcmVhZCBpbi4KICAgICBbU3RldmUgSGVuc29uXQoKICAqKSBNZXJnZWQgdGhlIHZhcmlvdXMgb2xkL29ic29sZXRlIFNTTGVheSBkb2N1bWVudGF0aW9uIGZpbGVzIChkb2MveHh4LmRvYykKICAgICBpbnRvIGEgc2luZ2xlIGRvYy9zc2xlYXkudHh0IGJ1bmRsZS4gVGhpcyB3YXkgdGhlIGluZm9ybWF0aW9uIGlzIHN0aWxsCiAgICAgcHJlc2VydmVkIGJ1dCBubyBsb25nZXIgbWVzc2VzIHVwIHRoaXMgZGlyZWN0b3J5LiBOb3cgaXQncyBuZXcgcm9vbSBmb3IKICAgICB0aGUgbmV3IHNldCBvZiBkb2N1bWVuYXRpb24gZmlsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIFNFVHMgd2VyZSBpbmNvcnJlY3RseSBERVIgZW5jb2RlZC4gVGhpcyB3YXMgYSBtYWpvciBwYWluLCBiZWNhdXNlIHRoZXkKICAgICBzaGFyZWQgY29kZSB3aXRoIFNFUVVFTkNFcywgd2hpY2ggYXJlbid0IGNvZGVkIHRoZSBzYW1lLiBUaGlzIG1lYW5zIHRoYXQKICAgICBhbG1vc3QgZXZlcnl0aGluZyB0byBkbyB3aXRoIFNFVHMgb3IgU0VRVUVOQ0VzIGhhcyBlaXRoZXIgY2hhbmdlZCBuYW1lIG9yCiAgICAgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICBbQmVuIExhdXJpZSwgYmFzZWQgb24gYSBwYXJ0aWFsIGZpeCBieSBHUCBKYXlhbiA8Z3BAbnNqLmNvLmpwPl0KCiAgKikgRml4IHRlc3QgZGF0YSB0byB3b3JrIHdpdGggdGhlIGFib3ZlLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBGaXggdGhlIFJTQSBoZWFkZXIgZGVjbGFyYXRpb25zIHRoYXQgaGlkIGEgYnVnIEkgZml4ZWQgaW4gMC45LjBiIGJ1dAogICAgIHdhcyBhbHJlYWR5IGZpeGVkIGJ5IEVyaWMgZm9yIDAuOS4xIGl0IHNlZW1zLgogICAgIFtCZW4gTGF1cmllIC0gcG9pbnRlZCBvdXQgYnkgVWxmIE32bGxlciA8dWxmQGZpdHVnLmRlPl0KCiAgKikgQXV0b2RldGVjdCBGcmVlQlNEMy4KICAgICBbQmVuIExhdXJpZV0KCiAgKikgRml4IHZhcmlvdXMgYnVncyBpbiBDb25maWd1cmUuIFRoaXMgYWZmZWN0cyB0aGUgZm9sbG93aW5nIHBsYXRmb3JtczoKICAgICBuZXh0c3RlcAogICAgIG5jci1zY2RlCiAgICAgdW5peHdhcmUtMi4wCiAgICAgdW5peHdhcmUtMi4wLXBlbnRpdW0KICAgICBzY281LWNjLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBFbGltaW5hdGUgZ2VuZXJhdGVkIGZpbGVzIGZyb20gQ1ZTLiBSZW9yZGVyIHRlc3RzIHRvIHJlZ2VuZXJhdGUgZmlsZXMKICAgICBiZWZvcmUgdGhleSBhcmUgbmVlZGVkLgogICAgIFtCZW4gTGF1cmllXQoKICAqKSBHZW5lcmF0ZSBNYWtlZmlsZS5zc2wgZnJvbSBNYWtlZmlsZS5vcmcgKHRvIGtlZXAgQ1ZTIGhhcHB5KS4KICAgICBbQmVuIExhdXJpZV0KCgogQ2hhbmdlcyBiZXR3ZWVuIDAuOS4xYiBhbmQgMC45LjFjICBbMjMtRGVjLTE5OThdCgogICopIEFkZGVkIE9QRU5TU0xfVkVSU0lPTl9OVU1CRVIgdG8gY3J5cHRvL2NyeXB0by5oIGFuZCAKICAgICBjaGFuZ2VkIFNTTGVheSB0byBPcGVuU1NMIGluIHZlcnNpb24gc3RyaW5ncy4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KICAKICAqKSBTb21lIGZpeHVwcyB0byB0aGUgdG9wLWxldmVsIGRvY3VtZW50cy4KICAgICBbUGF1bCBTdXR0b25dCgogICopIEZpeGVkIHRoZSBuYXN0eSBidWcgd2hlcmUgcnNhcmVmLmggd2FzIG5vdCBmb3VuZCB1bmRlciBjb21waWxlLXRpbWUKICAgICBiZWNhdXNlIHRoZSBzeW1saW5rIHRvIGluY2x1ZGUvIHdhcyBtaXNzaW5nLgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBJbmNvcnBvcmF0ZWQgdGhlIHBvcHVsYXIgbm8tUlNBL0RTQS1vbmx5IHBhdGNoZXMgCiAgICAgd2hpY2ggYWxsb3cgdG8gY29tcGlsZSBhIFJTQS1mcmVlIFNTTGVheS4KICAgICBbQW5kcmV3IENvb2tlIC8gSW50ZXJyYWRlciBMZHQuLCBSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBGaXhlZCBuYXN0eSByZWhhc2ggcHJvYmxlbSB1bmRlciBgbWFrZSAtZiBNYWtlZmlsZS5zc2wgbGlua3MnCiAgICAgd2hlbiAic3NsZWF5IiBpcyBzdGlsbCBub3QgZm91bmQuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIG1vcmUgcGxhdGZvcm1zIHRvIENvbmZpZ3VyZTogQ3JheSBUM0UsIEhQVVggMTEsIAogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsLCBCZWNrbWFubiA8YmVja21hbkBhY2wubGFubC5nb3Y+XQoKICAqKSBVcGRhdGVkIHRoZSBSRUFETUUgZmlsZS4KICAgICBbUmFsZiBTLiBFbmdlbHNjaGFsbF0KCiAgKikgQWRkZWQgdmFyaW91cyAuY3ZzaWdub3JlIGZpbGVzIGluIHRoZSBDVlMgcmVwb3NpdG9yeSBzdWJkaXJzCiAgICAgdG8gbWFrZSBhICJjdnMgdXBkYXRlIiByZWFsbHkgc2lsZW50LgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZWNvbXBpbGVkIHRoZSBlcnJvci1kZWZpbml0aW9uIGhlYWRlciBmaWxlcyBhbmQgYWRkZWQKICAgICBtaXNzaW5nIHN5bWJvbHMgdG8gdGhlIFdpbjMyIGxpbmtlciB0YWJsZXMuCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIENsZWFuZWQgdXAgdGhlIHRvcC1sZXZlbCBkb2N1bWVudHM7CiAgICAgbyBuZXcgZmlsZXM6IENIQU5HRVMgYW5kIExJQ0VOU0UKICAgICBvIG1lcmdlZCBWRVJTSU9OLCBISVNUT1JZKiBhbmQgUkVBRE1FKiBmaWxlcyBhIENIQU5HRVMuU1NMZWF5IAogICAgIG8gbWVyZ2VkIENPUFlSSUdIVCBpbnRvIExJQ0VOU0UKICAgICBvIHJlbW92ZWQgb2Jzb2xldGUgVE9ETyBmaWxlCiAgICAgbyByZW5hbWVkIE1JQ1JPU09GVCB0byBJTlNUQUxMLlczMgogICAgIFtSYWxmIFMuIEVuZ2Vsc2NoYWxsXQoKICAqKSBSZW1vdmVkIGR1bW15IGZpbGVzIGZyb20gdGhlIDAuOS4xYiBzb3VyY2UgdHJlZTogCiAgICAgY3J5cHRvL2FzbjEveCBjcnlwdG8vYmlvL2NkIGNyeXB0by9iaW8vZmcgY3J5cHRvL2Jpby9ncmVwIGNyeXB0by9iaW8vdmkKICAgICBjcnlwdG8vYm4vYXNtLy4uLi4uLmFkZC5jIGNyeXB0by9ibi9hc20vYS5vdXQgY3J5cHRvL2RzYS9mIGNyeXB0by9tZDUvZgogICAgIGNyeXB0by9wZW0vZ21vbi5vdXQgY3J5cHRvL3Blcmxhc20vZiBjcnlwdG8vcGtjczcvYnVpbGQgY3J5cHRvL3JzYS9mCiAgICAgY3J5cHRvL3NoYS9hc20vZiBjcnlwdG8vdGhyZWFkcy9mIG1zL3p6eiBzc2wvZiBzc2wvZi5tYWsgdGVzdC9mCiAgICAgdXRpbC9mLm1hayB1dGlsL3BsL2YgdXRpbC9wbC9mLm1hayBjcnlwdG8vYmYvYmZfbG9jbC5vbGQgYXBwcy9mCiAgICAgW1JhbGYgUy4gRW5nZWxzY2hhbGxdCgogICopIEFkZGVkIHZhcmlvdXMgcGxhdGZvcm0gcG9ydGFiaWxpdHkgZml4ZXMuCiAgICAgW01hcmsgSi4gQ294XQoKICAqKSBUaGUgR2VuZXNpcyBvZiB0aGUgT3BlblNTTCBycGplY3Q6CiAgICAgV2Ugc3RhcnQgd2l0aCB0aGUgbGF0ZXN0ICh1bnJlbGVhc2VkKSBTU0xlYXkgdmVyc2lvbiAwLjkuMWIgd2hpY2ggRXJpYyBBLgogICAgIFlvdW5nIGFuZCBUaW0gSi4gSHVkc29uIGNyZWF0ZWQgd2hpbGUgdGhleSB3ZXJlIHdvcmtpbmcgZm9yIEMyTmV0IHVudGlsCiAgICAgc3VtbWVyIDE5OTguCiAgICAgW1RoZSBPcGVuU1NMIFByb2plY3RdCiAKCiBDaGFuZ2VzIGJldHdlZW4gMC45LjBiIGFuZCAwLjkuMWIgIFtub3QgcmVsZWFzZWRdCgogICopIFVwZGF0ZWQgYSBmZXcgQ0EgY2VydGlmaWNhdGVzIHVuZGVyIGNlcnRzLwogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIHNvbWUgQklHTlVNIGFwaSBzdHVmZi4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgVmFyaW91cyBwbGF0Zm9ybSBwb3J0czogT3BlbkJTRCwgVWx0cml4LCBJUklYIDY0Yml0LCBOZXRCU0QsIAogICAgIERHVVggeDg2LCBMaW51eCBBbHBoYSwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBOZXcgQ09NUCBsaWJyYXJ5IFtjcnlwdG8vY29tcC9dIGZvciBTU0wgUmVjb3JkIExheWVyIENvbXByZXNzaW9uOiAKICAgICBSTEUgKGR1bW15IGltcGxlbWVudGVkKSBhbmQgWkxJQiAocmVhbGx5IGltcGxlbWVudGVkIHdoZW4gWkxJQiBpcwogICAgIGF2YWlsYWJsZSkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZCAtc3RycGFyc2Ugb3B0aW9uIHRvIGFzbjFwYXJzIHByb2dyYW0gd2hpY2ggcGFyc2VzIG5lc3RlZCAKICAgICBiaW5hcnkgc3RydWN0dXJlcyAKICAgICBbRHIgU3RlcGhlbiBIZW5zb24gPHNoZW5zb25AYmlnZm9vdC5jb20+XQoKICAqKSBBZGRlZCAib2lkX2ZpbGUiIHRvIHNzbGVheS5jbmYgZm9yICJjYSIgYW5kICJyZXEiIHByb2dyYW1zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBEU0EgZml4IGZvciAiY2EiIHByb2dyYW0uCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkICItZ2Vua2V5IiBvcHRpb24gdG8gImRzYXBhcmFtIiBwcm9ncmFtLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBSSVBFIE1EMTYwIChybWQxNjApIG1lc3NhZ2UgZGlnZXN0LgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCAtYSAoYWxsKSBvcHRpb24gdG8gInNzbGVheSB2ZXJzaW9uIiBjb21tYW5kLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBQTEFURk9STSBkZWZpbmUgd2hpY2ggaXMgdGhlIGlkIGdpdmVuIHRvIENvbmZpZ3VyZS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgTWVtQ2hlY2tfWFhYWCBmdW5jdGlvbnMgdG8gY3J5cHRvL21lbS5jIGZvciBtZW1vcnkgY2hlY2tpbmcuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIHRoZSBBU04uMSBwYXJzZXIgcm91dGluZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEV4dGVuZGVkIEJJTyByb3V0aW5lcyB0byBzdXBwb3J0IFJFVVNFQUREUiwgc2VlaywgdGVsbCwgZXRjLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBhIEJOX0NUWCB0byB0aGUgQk4gbGlicmFyeS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdGhlIHdlYWsga2V5IHZhbHVlcyBpbiBERVMgbGlicmFyeQogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBDaGFuZ2VkIEFQSSBpbiBFVlAgbGlicmFyeSBmb3IgY2lwaGVyIGFsaWFzZXMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIHN1cHBvcnQgZm9yIFJDMi82NGJpdCBjaXBoZXIuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIENvbnZlcnRlZCB0aGUgbGhhc2ggbGlicmFyeSB0byB0aGUgY3J5cHRvL21lbS5jIGZ1bmN0aW9ucy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgQWRkZWQgbW9yZSByZWNvZ25pemVkIEFTTi4xIG9iamVjdCBpZHMuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIG1vcmUgUlNBIHBhZGRpbmcgY2hlY2tzIGZvciBTU0wvVExTLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBCSU8gcHJveHkvZmlsdGVyIGZ1bmN0aW9uYWxpdHkuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGVkIGV4dHJhX2NlcnRzIHRvIFNTTF9DVFggd2hpY2ggY2FuIGJlIHVzZWQKICAgICBzZW5kIGV4dHJhIENBIGNlcnRpZmljYXRlcyB0byB0aGUgY2xpZW50IGluIHRoZSBDQSBjZXJ0IGNoYWluIHNlbmRpbmcKICAgICBwcm9jZXNzLiBJdCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIFNTTF9DVFhfYWRkX2V4dHJhX2NoYWluX2NlcnQoKS4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgTm93IEZvcnRlenphIGlzIGRlbmllZCBpbiB0aGUgYXV0aGVudGljYXRpb24gcGhhc2UgYmVjYXVzZQogICAgIHRoaXMgaXMga2V5IGV4Y2hhbmdlIG1lY2hhbmlzbSBpcyBub3Qgc3VwcG9ydGVkIGJ5IFNTTGVheSBhdCBhbGwuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEFkZGl0aW9uYWwgUEtDUzEgY2hlY2tzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBTdXBwb3J0IHRoZSBzdHJpbmcgIlRMU3YxIiBmb3IgYWxsIFRMUyB2MSBjaXBoZXJzLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBZGRlZCBmdW5jdGlvbiBTU0xfZ2V0X2V4X2RhdGFfWDUwOV9TVE9SRV9DVFhfaWR4KCkgd2hpY2ggZ2l2ZXMgdGhlCiAgICAgZXhfZGF0YSBpbmRleCBvZiB0aGUgU1NMIGNvbnRleHQgaW4gdGhlIFg1MDlfU1RPUkVfQ1RYIGV4X2RhdGEuCiAgICAgW0VyaWMgQS4gWW91bmddCgogICopIEZpeGVkIGEgZmV3IG1lbW9yeSBsZWFrcy4KICAgICBbRXJpYyBBLiBZb3VuZ10KCiAgKikgRml4ZWQgdmFyaW91cyBjb2RlIGFuZCBjb21tZW50IHR5cG9zLgogICAgIFtFcmljIEEuIFlvdW5nXQoKICAqKSBBIG1pbm9yIGJ1ZyBpbiBzc2wvczNfY2xudC5jIHdoZXJlIHRoZXJlIHdvdWxkIGFsd2F5cyBiZSA0IDAgCiAgICAgYnl0ZXMgc2VudCBpbiB0aGUgY2xpZW50IHJhbmRvbS4KICAgICBbRWR3YXJkIEJpc2hvcCA8ZWJpc2hvcEBzcHlnbGFzcy5jb20+XQoK