{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "/VQ7ViG0RhTfBhe9jl8C2HiiOD2m3lLegi/JVBdC0hw=",
    "height": "330800",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "98991475",
      "GasUsed": "65994317"
    },
    "tx": "CrWGAwoML3ZtLm1fYWRkcGtnEqOGAwooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLmhQMKCnN0YXRlbWVudHMSPmduby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9zdGF0ZW1lbnRzGmUKC2dub21vZC50b21sElZtb2R1bGUgPSAiZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3N0YXRlbWVudHMiCmdubyA9ICIwLjkiChqvhAMKDnN0YXRlbWVudHMuZ25vEpuEAy8vIFBhY2thZ2Ugc3RhdGVtZW50cyBwdWJsaXNoZXMgY2xhc3NpZmllZCBmaW5hbmNpYWwgc3RhdGVtZW50cyBvdmVyIGEgY2hhcnQKLy8gb2YgYWNjb3VudHMgdGhpcyByZWFsbSBkb2VzIG5vdCBvd24sIGNhbm5vdCB3cml0ZSwgYW5kIGRpZCBub3Qgc3VwcGx5LgovLwovLyAjIEEgUFVCTElTSEVEIFNUQVRFTUVOVCBJUyBBIENMQUlNIEFCT1VUIEEgQ0xBSU0KLy8KLy8gUmVhZCB0aGlzIGJlZm9yZSB0cnVzdGluZyBhbnkgZmlndXJlIHRoaXMgcmVhbG0gcmV0dXJucywgYW5kIHJlYWQgaXQgYmVmb3JlCi8vIHB1Ymxpc2hpbmcgYW55dGhpbmcgaGVyZS4KLy8KLy8gW3IvYm9va3NdIHNheXMgb2YgaXRzZWxmLCBjb3JyZWN0bHk6ICoiYSBib29rIGlzIGEgc2V0IG9mIGNsYWltcyBieSBpdHMKLy8gb3duZXIiKi4gSXQgaG9sZHMgbm8gYXNzZXQsIHNvIG5vdGhpbmcgdGllcyBhbiBhY2NvdW50IHJlYWRpbmcgYENhc2ggNTAwMGAKLy8gdG8gNTAwMCByZWFsIHVnbm90IGFueXdoZXJlLiBBIHN0YXRlbWVudCBkZXJpdmVkIGZyb20gc3VjaCBhIGJvb2sgaW5oZXJpdHMKLy8gdGhhdCBjb21wbGV0ZWx5IOKAlCBhbmQgdGhlbiAqKmFkZHMgYSBsYXllciBvZiBhcHBhcmVudCBhdXRob3JpdHkqKiwgYmVjYXVzZQovLyBhIGJhbGFuY2Ugc2hlZXQgYXQgYSBzdGFibGUgb24tY2hhaW4gcGF0aCwgc3RhbXBlZCB3aXRoIGEgaGVpZ2h0IGFuZCBhCi8vIHNlcXVlbmNlIG51bWJlciwgbG9va3MgbGlrZSBhbiBhdWRpdGVkIGFydGlmYWN0LiBJdCBpcyBhIHNlbGYtcmVwb3J0IG9mIGEKLy8gc2VsZi1yZXBvcnQuCi8vCi8vIFRoaXMgcmVhbG0gcGVyZm9ybXMgbm8gYXVkaXQsIHZlcmlmaWVzIG5vIGV2ZW50LCBhbmQgaG9sZHMgbm8gY3VzdG9keS4gV2hhdAovLyBpdCBndWFyYW50ZWVzIGlzIG5hcnJvdyBhbmQgZXhhY3Q6IHRoZSBmaWd1cmVzIGJlbG93IGFyZSAqKmRlcml2ZWQqKiBmcm9tCi8vIHRoZSBvd25lcidzIGNoYXJ0IGF0IGEgaGVpZ2h0LCBieSBjb2RlIG5vYm9keSBjYW4gcGFyYW1ldGVyaXNlLCBhbmQgZnJvemVuLgovLyBUaGF0IHRoZSBjaGFydCBkZXNjcmliZXMgYW55dGhpbmcgcmVhbCBpcyBub3QgY2xhaW1lZCBoZXJlIGFuZCBpcyBub3QKLy8gY2hlY2thYmxlIGZyb20gaGVyZS4KLy8KLy8gIyBEZXJpdmVkLCBub3Qgc3VwcGxpZWQg4oCUIHdoaWNoIGlzIHRoZSB3aG9sZSByZWFzb24gdGhpcyByZWFsbSBleGlzdHMKLy8KLy8gRXZlcnkgZmlndXJlIGNvbWVzIGZyb20gW3IvYm9va3NdIHRocm91Z2ggaXRzIG93biByZWFkIHN1cmZhY2UuIEEgcHVibGlzaGVyCi8vIHNheXMgKndoZW4gdG8gZnJlZXplKjsgdGhleSBkbyBub3Qgc2F5IHdoYXQgdGhlIHN0YXRlbWVudCBzYXlzLiBUaGUKLy8gYWx0ZXJuYXRpdmUgZGVzaWduIOKAlCB0aGUgcHVibGlzaGVyIHBhc3NlcyB0aGUgcm93cyBpbiDigJQgd2FzIGNvbnNpZGVyZWQgaW4KLy8gRElTQ09WRVJZLm1kIMKnIDQgYW5kIGlzIGZhdGFsIHRvIHRoZSB0aGVzaXM6IGEgc3RhdGVtZW50IHdob3NlIGlucHV0cyBpdHMKLy8gcHVibGlzaGVyIHR5cGVkIGlzIGFuIGFzc2VydGlvbiBhYm91dCBub3RoaW5nLCBhbmQgdGhpcyByZWFsbSB3b3VsZCBiZSBhCi8vIHB1cmUgZnVuY3Rpb24gd2l0aCBhIHN0b3JhZ2UgYmlsbC4KLy8KLy8gVGhlIGNvbnNlcXVlbmNlIGlzIHRoYXQgKip0aGlzIGlzIHRoZSBmaXJzdCBmaXJzdC1wYXJ0eSByZWFsbS10by1yZWFsbQovLyBpbXBvcnQgaW4gdGhpcyBwb3J0Zm9saW8sIGFuZCBpdCBpcyBwZXJtYW5lbnQuKiogQnl0ZXMgYXJlIGltbXV0YWJsZSBhZnRlcgovLyBhZGRwa2csIHNvIHRoZXNlIHN0YXRlbWVudHMgcmVhZCB0aGUgW3IvYm9va3NdIGF0IFtCb29rc1BhdGhdIGZvcmV2ZXIuIElmCi8vIHRoYXQgcmVhbG0gZXZlciBnZXRzIGEgdjIsIHB1Ymxpc2hlZCBzdGF0ZW1lbnRzIGtlZXAgcmVhZGluZyB2MSDigJQgYXJndWFibHkKLy8gY29ycmVjdCBmb3IgYW4gYXVkaXRhYmxlIGFydGlmYWN0LCBhbmQgc3RpbGwgYSBjb3VwbGluZyBub3RoaW5nIGhlcmUgaGFzCi8vIGNhcnJpZWQgYmVmb3JlLgovLwovLyAjIFdoYXQgaXMgcHVibGlzaGVkIGFuZCB3aGF0IGlzIG5vdAovLwovLyBbUHVibGlzaF0gZnJlZXplcyB0aGUgdGhyZWUgZmlndXJlcyBhIGJhbGFuY2Ugc2hlZXQgbmVlZHMsIHRoZSB0aHJlZSBhbgovLyBpbmNvbWUgc3RhdGVtZW50IG5lZWRzLCBhbmQgdGhlIGFibm9ybWFsaXR5IGNlbnN1cy4gSXQgZG9lcyBOT1QgZnJlZXplIHRoZQovLyBjaGFydDogYWNjb3VudCBuYW1lcywgY29kZXMgYW5kIHRoZSBwb3N0aW5ncyBiZWhpbmQgdGhlbSBzdGF5IGluIFtyL2Jvb2tzXSwKLy8gd2hpY2gga2VlcHMgd3JpdGluZyB0aGVtLgovLwovLyBTbyBbVmVyaWZ5XSBhbnN3ZXJzICoqImRvIHRoZSBmcm96ZW4gZmlndXJlcyBzdGlsbCBob2xkPyIqKiBhbmQgTk9UICoqImlzCi8vIHRoZSBjaGFydCB1bnRvdWNoZWQ/IioqLiBUaGUgdHdvIGRpZmZlciBhbmQgdGhlIGRpZmZlcmVuY2UgaXMgZGVtb25zdHJhYmxlOgovLyBhIHBvc3RpbmcgdGhhdCBtb3ZlcyAxMDAgZnJvbSBvbmUgYXNzZXQgYWNjb3VudCB0byBhbm90aGVyIGxlYXZlcyBBc3NldHMsCi8vIENsYWltcywgdGhlIG5ldCBhbmQgdGhlIHJvdyBjb3VudCBhbGwgaWRlbnRpY2FsLCBhbmQgW1ZlcmlmeV0gc3RpbGwgcmVhZHMKLy8gdHJ1ZS4gSXQgaXMgYSByZWNvbmNpbGlhdGlvbiwgbm90IGEgc2VhbC4gVGhlIHNlYWwgb24gdGhlIGNoYXJ0J3Mgb3duCi8vIGhpc3RvcnkgaXMgW3IvYm9va3NdJyBhcHBlbmQtb25seSBqb3VybmFsLCBhbmQgdGhhdCBpcyB3aGVyZSB0byBsb29rLgovLwovLyAjIFRoZSBpbmNvbWUgc3RhdGVtZW50IGlzIGN1bXVsYXRpdmUgc2luY2UgaW5jZXB0aW9uCi8vCi8vIFtwL2pvdXJuYWxdJ3MgQ2xvc2UgaXMgYSBiYWNrZGF0aW5nIHNlYWw6IGl0IHJlZnVzZXMgZW50cmllcyBkYXRlZCBhdCBvcgovLyBiZWZvcmUgYSBjdXRvZmYgYW5kIHN3ZWVwcyBubyBub21pbmFsIGFjY291bnQgaW50byBlcXVpdHkuIFRoZXJlIGlzIG5vCi8vIHJldGFpbmVkLWVhcm5pbmdzIGFjY291bnQgYW5kIG5vIGNsb3NpbmcgZW50cnkgYW55d2hlcmUgaW4gdGhlIHN0YWNrLCBzbwovLyByZXZlbnVlIGFuZCBleHBlbnNlIGFjY3VtdWxhdGUgZnJvbSB0aGUgYm9vaydzIGZpcnN0IHBvc3RpbmcgZm9yZXZlci4KLy8KLy8gRXZlcnkgYWNjZXNzb3IgYW5kIGV2ZXJ5IHJlbmRlcmVkIGxpbmUgdGhlcmVmb3JlIGNhcnJpZXMgdGhlIHdvcmQKLy8gY3VtdWxhdGl2ZS4gQSByZWFkZXIgd2hvIHRha2VzIHRoZW0gZm9yIGEgcGVyaW9kIGZpZ3VyZSBtaXNyZWFkcyBldmVyeQovLyBzdGF0ZW1lbnQgdGhpcyByZWFsbSBwdWJsaXNoZXMuIEEgcGVyaW9kIHN0YXRlbWVudCBuZWVkcyBlbnRyeS1sZXZlbCBkYXRhOwovLyBzZWUgRElTQ09WRVJZLm1kIMKnIDYuOC4KLy8KLy8gIyBUaGUgYmFsYW5jZSBzaGVldCBpZGVudGl0eSBpcyBOT1Qgb2ZmZXJlZCBhcyBhIGNoZWNrCi8vCi8vIEFzc2V0cyBhbmQgQ2xhaW1zIGFyZSBib3RoIHJlcG9ydGVkLiBUaGVpciBlcXVhbGl0eSBpcyBub3QgZXhwb3NlZCBhcyBhCi8vIHZlcmRpY3QgYW55d2hlcmUsIGJlY2F1c2Ugb3ZlciBhIGNoYXJ0IGRyYXduIGZyb20gYSBbcC9qb3VybmFsXSBCb29rIGl0IGlzCi8vIGFsZ2VicmFpY2FsbHkgaWRlbnRpY2FsIHRvIGB0b3RhbERlYml0cyA9PSB0b3RhbENyZWRpdHNgLCB3aGljaCBbci9ib29rc10KLy8gZW5mb3JjZXMgb24gZXZlcnkgcG9zdCDigJQgYSBjb25zdGFudCB0cnVlLCBhbmQgdHJ1ZSBvZiBhIGNoYXJ0IHdob3NlIGV2ZXJ5Ci8vIGFjY291bnQgaXMgY2xhc3NpZmllZCBiYWNrd2FyZHMuIFtwL3N0YXRlbWVudHNdJyBwYWNrYWdlIGRvYyBjYXJyaWVzIHRoZQovLyBkZXJpdmF0aW9uLiBBIGBCYWxhbmNlcygpYCBoZXJlIHdvdWxkIGJlIHRoZSBmaWZ0aCBpbnN0YW5jZSBvZiB0aGUKLy8gdmFjdW91cy10cnVlIGNsYXNzIHRoaXMgcHJvamVjdCBrZWVwcyBmaW5kaW5nIGluIGl0cyBvd24gd29yay4KLy8KLy8gV2hhdCBzaGlwcyBpbnN0ZWFkIGlzIHRoZSBjZW5zdXM6IFtBYm5vcm1hbENvdW50XSBhbmQgW0Fibm9ybWFsSW5dIHJlcG9ydAovLyBldmVyeSBhY2NvdW50IHdob3NlIGJhbGFuY2UgcnVucyBhZ2FpbnN0IGl0cyBraW5kLiBUaGF0IHN1cnZpdmVzIGEgYmFsYW5jZWQKLy8gYm9vay4gSXRzIGluY29tcGxldGVuZXNzIGlzIGV4YWN0IGFuZCBpcyBzdGF0ZWQgYXQgW0Fibm9ybWFsQ291bnRdLgovLwovLyAjIE5PIENVU1RPRFkg4oCUIGFuZCByZWZ1c2luZyBjb2lucyBpcyBub3QgdGhlIHNhbWUgYXMgbm90IGhvbGRpbmcgdGhlbQovLwovLyBUaGVyZSBpcyBubyBjb2luaW8gaW1wb3J0LCBubyBwYXlhYmxlIHBhdGgsIG5vIGZlZSwgbm8gd2l0aGRyYXdhbCwgbm8KLy8gYWRtaW4uIFNvIFtQdWJsaXNoXSBSRUZVU0VTIGEgdHJhbnNhY3Rpb24gY2FycnlpbmcgY29pbnM6IGEgcmVhbG0gd2l0aCBubwovLyB3aXRoZHJhd2FsIHBhdGggdGhhdCBzaWxlbnRseSBhY2NlcHRzIHVnbm90IHN0cmFuZHMgaXQgcGVybWFuZW50bHksIGFuZAovLyAid2UgaG9sZCBubyBmdW5kcyIgd291bGQgdGhlbiBiZSB0cnVlIG9mIHRoZSBkZXNpZ24gYW5kIGZhbHNlIG9mIHRoZQovLyBiYWxhbmNlLgovLwovLyAjIE5vIGFkbWluLCBhbmQgbm8gY3Jvc3Mtb3duZXIgYWdncmVnYXRlIGJleW9uZCBhIGNvdW50Ci8vCi8vIFRoZSBkZXBsb3lpbmcgbmFtZXNwYWNlIGhhcyBubyBwcml2aWxlZ2UgaGVyZTogbm8gc2V0dGVyLCBubyBwYXVzZSwgbm8KLy8gYWJpbGl0eSB0byBwdWJsaXNoIG9yIHRvIHJlYWQgYW55dGhpbmcgYSBzdHJhbmdlciBjYW5ub3QgcmVhZC4gW1RvdGFsXSBpcyBhCi8vIGNvdW50IG9mIHB1YmxpY2F0aW9ucyBhbmQgbm90aGluZyBtb3JlLiBbci9ib29rc10gcmVmdXNlcyB0byBlbnVtZXJhdGUKLy8gYm9va3MgYmVjYXVzZSBzdWNoIGEgdG90YWwgd291bGQgc3VtIGV2ZXJ5IHN0cmFuZ2VyJ3Mgc2VsZi1yZXBvcnRlZAovLyBhc3NlcnRpb247IHRoZSBzYW1lIHJlYXNvbmluZyBhcHBsaWVzIG9uZSBsZXZlbCB1cCwgc28gdGhlcmUgaXMgbm8gd2F5IHRvCi8vIGVudW1lcmF0ZSBwdWJsaXNoZXJzIGFuZCBubyBjcm9zcy1vd25lciBmaWd1cmUgb2YgYW55IGtpbmQuCi8vCi8vICMgV2hhdCB0aGlzIHJlYWxtIGRvZXMgTk9UIGRvCi8vCi8vICAgLSBJdCBkb2VzIG5vdCBob2xkLCBtb3ZlLCBvciBwcmljZSBhbnkgYXNzZXQuCi8vICAgLSBJdCBkb2VzIG5vdCB2ZXJpZnkgdGhhdCBhbiBlbnRyeSBkZXNjcmliZXMgYSByZWFsIGV2ZW50LgovLyAgIC0gSXQgZG9lcyBub3QgZGV0ZWN0IGEgc2FtZS1zaWRlIG1pc2NsYXNzaWZpY2F0aW9uLiBTZWUgW0Fibm9ybWFsQ291bnRdLgovLyAgIC0gSXQgcHVibGlzaGVzIHR3byBzdGF0ZW1lbnRzIGFuZCBhIGNlbnN1cyDigJQgbm8gY2FzaC1mbG93IHN0YXRlbWVudCwgbm8KLy8gICAgIHN0YXRlbWVudCBvZiBjaGFuZ2VzIGluIGVxdWl0eSwgbm8gbm90ZXMsIG5vIGNvbXBhcmF0aXZlcy4KLy8KLy8gW3IvYm9va3NdOiAvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2Jvb2tzCi8vIFtwL2pvdXJuYWxdOiAvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2pvdXJuYWwKLy8gW3Avc3RhdGVtZW50c106IC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvc3RhdGVtZW50cwpwYWNrYWdlIHN0YXRlbWVudHMKCmltcG9ydCAoCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9qb3VybmFsIgoJc3RtdCAiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3N0YXRlbWVudHMiCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCgkiZ25vLmxhbmQvcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MCIKCSJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvYm9va3MiCikKCi8vIFJlYWxtUGF0aCBpcyB0aGlzIHJlYWxtJ3Mgb3duIHBhdGgsIHVzZWQgdG8gYnVpbGQgUmVuZGVyIGxpbmtzLgpjb25zdCBSZWFsbVBhdGggPSAiL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9zdGF0ZW1lbnRzIgoKLy8gQm9va3NQYXRoIGlzIHRoZSBsZWRnZXIgcmVhbG0gZXZlcnkgZmlndXJlIGhlcmUgaXMgZGVyaXZlZCBmcm9tLgovLwovLyBJdCBpcyB0YWtlbiBCWSBWQUxVRSBmcm9tIHRoYXQgcmVhbG0ncyBvd24gZXhwb3J0ZWQgY29uc3RhbnQgcmF0aGVyIHRoYW4KLy8gdHlwZWQgb3V0IGFnYWluLCBzbyB0aGlzIGlzIHRoZSBjb21waWxlLXRpbWUgcGluIGl0c2VsZiBhbmQgbm90IGEgc2Vjb25kCi8vIGNvcHkgb2YgaXQgdGhhdCBjb3VsZCBkcmlmdC4gQSByZWFkZXIgY2hlY2tpbmcgd2hpY2ggbGVkZ2VyIGEgc3RhdGVtZW50Ci8vIGRlc2NyaWJlcyBpcyByZWFkaW5nIHRoZSBpbXBvcnQsIG5vdCBhIHN0cmluZyBpbiBhIGRvYyBjb21tZW50Lgpjb25zdCBCb29rc1BhdGggPSBib29rcy5SZWFsbVBhdGgKCi8vIFB1YmxpY2F0aW9uc0FyZVVuY2FwcGVkIHJlY29yZHMgYSBkZWNpc2lvbiBieSBpdHMgYWJzZW5jZSwgYmVjYXVzZSBldmVyeQovLyBvdGhlciByZWFsbSBpbiB0aGlzIHBvcnRmb2xpbyBjYXBzIGl0cyBwZXItb3duZXIgc3RhdGUgYW5kIGEgcmVhZGVyIHdpbGwKLy8gbG9vayBmb3IgdGhlIGNhcCBoZXJlLgovLwovLyBUaGVyZSBpcyBub25lLCBhbmQgdGhlIHRocmVlIHJlYXNvbnMgYXJlOgovLwovLyAgIC0gKipObyBzaGFyZWQgcmVzb3VyY2UgaXMgY29uc3VtZWQuKiogS2V5cyBhcmUgcGVyIG93bmVyLCBsaWtlIHIvYm9va3MnCi8vICAgICBib29rcy4gQW4gb3duZXIgY2FuIGZpbGwgdGhlaXIgb3duIHB1YmxpY2F0aW9uIGhpc3RvcnkgYW5kIG5vYm9keQovLyAgICAgZWxzZSdzLCBhbmQgdGhlIGNvc3Qgb2YgZG9pbmcgc28gaXMgZ2FzIHBsdXMgYSBzdG9yYWdlIGRlcG9zaXQgZWFjaAovLyAgICAgdGltZS4gVGhhdCBpcyB0aGUgc2FtZSBncmllZmluZyBhcmd1bWVudCByL2Jvb2tzIG1ha2VzIGZvciBpdHMKLy8gICAgIHBlci1vd25lciBjYXBzLCBhbmQgaGVyZSBpdCBpcyBzdWZmaWNpZW50IG9uIGl0cyBvd24uCi8vICAgLSAqKk5vdGhpbmcgaXRlcmF0ZXMgdGhlbS4qKiBSZW5kZXIgcmVhZHMgdGhlIG5ld2VzdAovLyAgICAgW1JlbmRlclB1YmxpY2F0aW9uTGltaXRdIGJ5IHNlcXVlbmNlIG51bWJlciwgYnkgZGlyZWN0IGtleSBsb29rdXAsIHNvCi8vICAgICBwYWdlIGNvc3QgZG9lcyBub3QgZ3JvdyB3aXRoIHRoZSBjb3VudC4gTm8gYWNjZXNzb3Igd2Fsa3MgYSBwdWJsaXNoZXIncwovLyAgICAgaGlzdG9yeS4KLy8gICAtICoqVGhlcmUgaXMgbm8gZW5naW5lIGNhcCB0byBtaXJyb3IuKiogci9ib29rcyBjYXBzIGJlY2F1c2UgcC9qb3VybmFsCi8vICAgICBjYXBzIGFuZCB0aGUgaW50ZXJhY3Rpb24gb2YgaXRzIGNlaWxpbmcgd2l0aCBSZWRlcml2ZUZyb21Kb3VybmFsIGlzCi8vICAgICB1bm1lYXN1cmVkLiBObyBzdWNoIGNlaWxpbmcgZXhpc3RzIGFib3ZlIHRoaXMgcmVhbG0uCi8vCi8vIEEgY2FwIGFkZGVkIG9ubHkgc28gYSB0ZXN0IGNvdWxkIHJlYWNoIGl0IHdvdWxkIGJlIHdvcnNlIHRoYW4gbm9uZS4KY29uc3QgUHVibGljYXRpb25zQXJlVW5jYXBwZWQgPSB0cnVlCgovLyBSZW5kZXJQdWJsaWNhdGlvbkxpbWl0IGNhcHMgaG93IG1hbnkgb2YgYSBwdWJsaXNoZXIncyBzdGF0ZW1lbnRzIG9uZSBSZW5kZXIKLy8gY2FsbCBsaXN0cy4gUHVibGljYXRpb25zIGFyZSB1bmJvdW5kZWQgKHNlZSBbUHVibGljYXRpb25zQXJlVW5jYXBwZWRdKSwgc28KLy8gdGhpcyBpcyB3aGF0IGtlZXBzIGEgcHVibGlzaGVyJ3MgcGFnZSBjb3N0IGZsYXQuCmNvbnN0IFJlbmRlclB1YmxpY2F0aW9uTGltaXQgPSAyMAoKLy8gUmVuZGVyQWJub3JtYWxMaW1pdCBjYXBzIGhvdyBtYW55IGNlbnN1cyByb3dzIG9uZSBSZW5kZXIgY2FsbCBlbWl0cy4gQQovLyBjaGFydCBtYXkgaG9sZCBib29rcy5NYXhBY2NvdW50c1BlckJvb2sgYWNjb3VudHMgYW5kIGluIGEgcGF0aG9sb2dpY2FsIGJvb2sKLy8gZXZlcnkgb25lIG9mIHRoZW0gaXMgYWJub3JtYWwuCmNvbnN0IFJlbmRlckFibm9ybWFsTGltaXQgPSAyNQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFN0YXRlCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gcmVjb3JkIGlzIG9uZSBmcm96ZW4gc3RhdGVtZW50LiBJdCBzdG9yZXMgdGhlIFtzdG10LlN0YXRlbWVudF0gd2hvbGUgcmF0aGVyCi8vIHRoYW4gY29weWluZyBpdHMgdGVuIGZpZWxkcyBpbnRvIGEgcGFyYWxsZWwgc3RydWN0OiBhIHNlY29uZCBmaWVsZCBzZXQgaXMgYQovLyBzZWNvbmQgcGxhY2UgZm9yIHRoZSB0d28gdG8gZGlzYWdyZWUsIGFuZCBldmVyeSBmaWVsZCBoZXJlIGlzIGEgdmFsdWUgb3IgYQovLyBzbGljZSB0aGlzIHJlYWxtIGFsbG9jYXRlZC4KLy8KLy8gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIHNlcSBmaWVsZC4gT25lIHdhcyB3cml0dGVuIGhlcmUgYW5kIHJlYWQgbm93aGVyZSDigJQKLy8gZm91bmQgYnkgdGhlIHNhYm90YWdlIGhhcm5lc3MsIHdoaWNoIGNvdWxkIG5vdCBtYWtlIGRyb3BwaW5nIHRoZSBhc3NpZ25tZW50Ci8vIGZhaWwgYW55IHRlc3QuIEEgc3RvcmVkIGNvcHkgb2YgdGhlIHNlcXVlbmNlIHdvdWxkIGJlIGEgc2Vjb25kIHBsYWNlIGZvciB0aGUKLy8ga2V5IGFuZCB0aGUgcmVjb3JkIHRvIGRpc2FncmVlLCBhbmQgdGhlIGtleSBhbHJlYWR5IGNhcnJpZXMgaXQ6IGV2ZXJ5IHJlYWQKLy8gcGF0aCByZWFjaGVzIGEgcmVjb3JkIGJ5IGNvbnN0cnVjdGluZyBwdWJLZXkob3duZXIsIHNlcSkgZnJvbSBhIHNlcSBpdAovLyBhbHJlYWR5IGhvbGRzLCBzbyBhIGZpZWxkIHdvdWxkIG9ubHkgZXZlciBiZSBjaGVja2VkIGFnYWluc3QgaXRzIG93biBzb3VyY2UuCnR5cGUgcmVjb3JkIHN0cnVjdCB7CglhdCBpbnQ2NAoJc3Qgc3RtdC5TdGF0ZW1lbnQKfQoKLy8gcHVibGlzaGVkIG1hcHMgIjxvd25lcj58PHBhZGRlZCBzZXE+IiB0byAqcmVjb3JkLgovLwovLyBUaGUgcG9pbnRlciBuZXZlciBsZWF2ZXMgdGhpcyBmaWxlLiBFdmVyeSBhY2Nlc3NvciBjb3BpZXMgc2NhbGFycyBvdXQsIHNvIG5vCi8vIGNhbGxlciByZWNlaXZlcyBhIGhhbmRsZSBvbnRvIHN0b3JlZCBzdGF0ZSDigJQgdGhlIHNhbWUgZGlzY2lwbGluZSByL2Jvb2tzCi8vIGFwcGxpZXMgdG8gaXRzICpqb3VybmFsLkJvb2suCnZhciBwdWJsaXNoZWQgPSBhdmwuTmV3VHJlZSgpCgovLyBjb3VudHMgbWFwcyBhbiBvd25lcidzIGFkZHJlc3Mgc3RyaW5nIHRvIGhvdyBtYW55IHN0YXRlbWVudHMgdGhleSBoYXZlCi8vIHB1Ymxpc2hlZC4gSXQgaXMgdGhlIHNlcXVlbmNlIGFsbG9jYXRvciBhcyB3ZWxsIGFzIHRoZSBjb3VudC4KdmFyIGNvdW50cyA9IGF2bC5OZXdUcmVlKCkKCi8vIHB1YkNvdW50IGlzIHRoZSBnbG9iYWwgdG90YWwsIG1haW50YWluZWQgYWxvbmdzaWRlIHRoZSB0cmVlIHNvIHRoZSBpbmRleAovLyBwYWdlIG5ldmVyIGl0ZXJhdGVzLiBJdCBpcyBhIGNvdW50IGFuZCBub3RoaW5nIG1vcmU7IHNlZSB0aGUgcGFja2FnZSBkb2Mgb24KLy8gd2h5IHRoZXJlIGlzIG5vIHdheSB0byBlbnVtZXJhdGUgcHVibGlzaGVycy4KdmFyIHB1YkNvdW50IGludAoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEd1YXJkcwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIHJlZnVzZUNvaW5zIHBhbmljcyBpZiBhIHVzZXIgY2FsbCBhcnJpdmVzIGNhcnJ5aW5nIGNvaW5zLiBBZG9wdGVkIHZlcmJhdGltCi8vIGZyb20gci9ib29rcywgd2hpY2ggZmFjZXMgdGhlIGlkZW50aWNhbCBzbG90OiBubyB3aXRoZHJhd2FsIHBhdGgsIHNvCi8vIGFjY2VwdGVkIGNvaW5zIGFyZSBzdHJhbmRlZCBwZXJtYW5lbnRseS4KLy8KLy8gVGhlIGd1YXJkIGlzIG9uIElzVXNlckNhbGwgcmF0aGVyIHRoYW4gSXNVc2VyIGRlbGliZXJhdGVseSwgYW5kIHRoZSByZWFzb24KLy8gaXMgTk9UIHRoZSBvbmUgdGhlIGNhbm9uaWNhbCBwYXltZW50LWd1YXJkIGFkdmljZSBnaXZlcy4gVGhhdCBhZHZpY2UgaXMgYWJvdXQKLy8gYSByZWFsbSB0aGF0IEFDQ0VQVFMgcGF5bWVudCwgd2hlcmUgSXNVc2VyIGlzIGRhbmdlcm91c2x5IGJyb2FkIGJlY2F1c2UgdGhlCi8vIE1zZ1J1biBlcGhlbWVyYWwgY2FuIGNvbnN1bWUgdGhlIGVudmVsb3BlIGJlZm9yZSBmb3J3YXJkaW5nIGNvbnRyb2wgYW5kIHRoZQovLyByZWNlaXB0IGludmFyaWFudCBubyBsb25nZXIgaG9sZHMuIFRoaXMgZ3VhcmQgUkVGVVNFUywgc28gdGhlIGJyb2FkZXIKLy8gcHJlZGljYXRlIHdvdWxkIHJlZnVzZSBNT1JFLCBhbmQgIm1vcmUgY29uc2VydmF0aXZlIiBpcyB0aGUgd3JvbmcgZnJhbWUuCi8vCi8vIFRoZSByZWFsIHJlYXNvbiBpcyB0aGF0IE9yaWdpblNlbmQgaXMgYSBmYWN0IGFib3V0IHRoZSBUUkFOU0FDVElPTiwgbm90IGFib3V0Ci8vIHRoaXMgcmVhbG0uIEl0IGlzIGEgZmFpdGhmdWwgcmVjZWlwdCBvbmx5IG9uIHRoZSBkaXJlY3QgTXNnQ2FsbCBwYXRoLCB3aGVyZQovLyB0aGUgZW52ZWxvcGUncyBkZXN0aW5hdGlvbiBpcyB0aGlzIHJlYWxtLiBPbiBhIE1zZ1J1biBwYXRoIHRoZSBlbnZlbG9wZSBjYW4KLy8gYmUgbm9uLWVtcHR5IHdoaWxlIG5vdGhpbmcgYXJyaXZlcyBoZXJlIOKAlCBjb2lucyBzZW50IHRvIHRoZSBlcGhlbWVyYWwgZmxvdwovLyBiYWNrIHRvIHRoZSB1c2VyIOKAlCBzbyBwYWlyaW5nIGl0IHdpdGggSXNVc2VyIGJ1eXMgbm8gcHJvdGVjdGlvbiBhbmQgYWRkcyBhCi8vIEZBTFNFIFJFRlVTQUwgbW9kZTogYSBwYW5pYyBvbiBhIGNhbGwgdGhhdCBicm91Z2h0IHRoaXMgcmVhbG0gbm90aGluZy4KLy8gSXNVc2VyQ2FsbCBpcyB0aGUgbmFycm93ZXN0IHByZWRpY2F0ZSBjb3ZlcmluZyB0aGUgb25seSBwYXRoIG9uIHdoaWNoIGEKLy8gbm9uLWVtcHR5IGVudmVsb3BlIG1lYW5zIGNvaW5zIGFjdHVhbGx5IGNyZWRpdGVkIHRvIHRoaXMgYWRkcmVzcy4KLy8KLy8gVGhlIHJlc2lkdWFsIGlzIHN0YXRlZCByYXRoZXIgdGhhbiBndWFyZGVkOiBjb2lucyBjYW4gc3RpbGwgcmVhY2ggdGhpcwovLyByZWFsbSdzIGFkZHJlc3MgdGhyb3VnaCBhbiBpbnRlcm1lZGlhcnkncyBleHBsaWNpdCBiYW5rZXIgc2VuZCwgd2hpY2ggbm8KLy8gcHJlZGljYXRlIGhlcmUgY2FuIHNlZS4gV2hhdCBtYWtlcyB0aGF0IHN1cnZpdmFibGUgaXMgbm90IHRoaXMgZ3VhcmQgYnV0IHRoZQovLyBhYnNlbmNlIG9mIGFueSBjb25zdW1wdGlvbiBwYXRoIOKAlCBub3RoaW5nIGluIHRoaXMgcmVhbG0gY2FuIHNwZW5kIHdoYXQKLy8gYXJyaXZlcywgc28gYSBzdHJhbmRlZCBiYWxhbmNlIGlzIGluZXJ0IHJhdGhlciB0aGFuIGV4cGxvaXRhYmxlLgovLwovLyBBbiBlYXJsaWVyIHZlcnNpb24gb2YgdGhpcyBjb21tZW50IHNhaWQgIk9yaWdpblNlbmQgaXMgb25seSBtZWFuaW5nZnVsIGZvciBhCi8vIGRpcmVjdCBNc2dDYWxsIiwgd2hpY2ggaXMgZmFsc2UgYXMgd3JpdHRlbiDigJQgaXQgaXMgcmVhZGFibGUgb24gZXZlcnkgcGF0aCBhbmQKLy8gbWVyZWx5IHN0b3BzIGJlaW5nIGEgcmVjZWlwdC4gQW4gaW5kZXBlbmRlbnQgYXVkaXQgY2F1Z2h0IGl0LiBUaGUgcHJlZGljYXRlCi8vIHdhcyByaWdodCBhbmQgdGhlIHN0YXRlZCByZWFzb24gd2FzIG5vdCwgd2hpY2ggaXMgdGhlIHdvcnNlIG9mIHRoZSB0d28KLy8gZmFpbHVyZXM6IHRoZSBwcmVkaWNhdGUgaXMgcmUtZGVyaXZhYmxlIGZyb20gdGhlIHJlZmVyZW5jZXMgYW5kIGEgY29uZmlkZW50Ci8vIHdyb25nIHNlbnRlbmNlIGlzIHdoYXQgc3RvcHMgYSBtYWludGFpbmVyIHJlLWRlcml2aW5nIGl0LiBPbnl4J3MgVk0gdGlnaHRlbnMKLy8gSXNVc2VyQ2FsbCwgc28gdGhpcyBpcyBleGFjdGx5IHRoZSBjb21tZW50IHRoYXQgZ2V0cyBjb25zdWx0ZWQgYWZ0ZXIgdGhlCi8vIHNlbWFudGljcyBoYXZlIG1vdmVkIHVuZGVybmVhdGggaXQuCmZ1bmMgcmVmdXNlQ29pbnMoY3VyIHJlYWxtKSB7CgkvLyBBIG5vLW9wIGF0IHRvZGF5J3Mgc2luZ2xlIGNhbGwgc2l0ZTogUHVibGlzaCdzIGZpcnN0IGN1ciBpcwoJLy8gcnVudGltZS1jdXJyZW50IGJ5IGNvbnN0cnVjdGlvbiBhbmQgc3RheXMgY3VycmVudCB3aGVuIGZvcndhcmRlZCB0aHJvdWdoCgkvLyBhIG5vbi1jcm9zc2luZyBjYWxsLiBJdCBpcyBoZXJlIGJlY2F1c2UgdGhpcyByZWFsbSBpcyBJTU1VVEFCTEUgYWZ0ZXIKCS8vIGFkZHBrZywgc28gYSBmdXR1cmUgc2Vjb25kIGNhbGxlciBjYW5ub3QgYmUgbWFkZSBzYWZlIGxhdGVyIOKAlCBhbmQgYQoJLy8gaGVscGVyIHRoYXQgcmVhZHMgUHJldmlvdXMoKSBvZmYgYW4gdW5jaGVja2VkIHJlYWxtIHBhcmFtZXRlciBpcyBhCgkvLyBkZXNpZ25hdGlvbi1mb3JnZXJ5IHNoYXBlIHdoZXRoZXIgb3Igbm90IGl0IGlzIHJlYWNoYWJsZSB0b2RheS4KCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCXBhbmljKCJzdGF0ZW1lbnRzOiByZWZ1c2VDb2lucyBjYWxsZWQgd2l0aCBhIHJlYWxtIHRoYXQgaXMgbm90IGN1cnJlbnQiKQoJfQoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSA+IDAgewoJCXBhbmljKCJzdGF0ZW1lbnRzOiB0aGlzIHJlYWxtIGhvbGRzIG5vIGNvaW5zIGFuZCBoYXMgbm8gd2l0aGRyYXdhbCBwYXRoOyBzZW5kIG5vbmUiKQoJfQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gVGhlIGNyb3NzLXJlYWxtIHJlYWRzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gcGFyc2VLaW5kIHR1cm5zIG9uZSBvZiBbci9ib29rc10nIGZpdmUga2luZCB3b3JkcyBiYWNrIGludG8gYQovLyBbam91cm5hbC5LaW5kXSwgYW5kIFBBTklDUyBvbiBhbnl0aGluZyBlbHNlLgovLwovLyBUaGlzIGlzIHRoZSB1Z2x5IHNlYW0gYW5kIGl0IGlzIG5hbWVkIHJhdGhlciB0aGFuIGhpZGRlbi4gci9ib29rcyByZXR1cm5zIGFuCi8vIGFjY291bnQncyBraW5kIGFzIGBqb3VybmFsLktpbmQuU3RyaW5nKClgIOKAlCBhIHByZXNlbnRhdGlvbiBmb3JtYXQgdGhhdCBoYXMKLy8gYmVjb21lIGFuIEFQSSBhY3Jvc3MgYSByZWFsbSBib3VuZGFyeSDigJQgYW5kIG5vIEtpbmQgcGFyc2VyIGV4aXN0cyBhbnl3aGVyZQovLyBpbiB0aGlzIHBvcnRmb2xpbyAobWVhc3VyZWQgaW4gRElTQ09WRVJZLm1kIMKnIDcsIHN0ZXAgMmM6IHplcm8gaGl0cyBmb3IKLy8gUGFyc2VLaW5kLCBwYXJzZUtpbmQgYW5kIGtpbmRGcm9tU3RyaW5nOyByL2Jvb2tzJyBvd24ga2luZEZyb21Db2RlIG1hcHMgYQovLyBjb2RlIFBSRUZJWCB0byBhIGtpbmQgYW5kIGlzIHVuZXhwb3J0ZWQpLgovLwovLyBJdCBwYW5pY3MgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIGEgemVybyBLaW5kLCBhbmQgdGhlIHJlYXNvbiBpcyBzcGVjaWZpYzogdGhlCi8vIHplcm8gS2luZCBpcyByZXBvcnRlZCBDUkVESVQtTk9STUFMIGJ5IFtqb3VybmFsLktpbmQuSXNEZWJpdE5vcm1hbF0sIHNvIGEKLy8gc2lsZW50bHktdW5wYXJzZWQgd29yZCB3b3VsZCBub3QgZHJvcCB0aGUgcm93IOKAlCBpdCB3b3VsZCBmaWxlIGl0IHVuZGVyCi8vIGNsYWltcyBhbmQgcHJvZHVjZSBhIHN0YXRlbWVudCB0aGF0IGJhbGFuY2VzIGFuZCBtaXNzdGF0ZXMuIHAvc3RhdGVtZW50cycKLy8gRGVyaXZlIHdvdWxkIGNhdGNoIGl0IGFzIEVyckludmFsaWRLaW5kLCBhbmQgcmVseWluZyBvbiB0aGF0IHdvdWxkIG1ha2UgdGhpcwovLyByZWFsbSdzIGVycm9yIG1lc3NhZ2UgcG9pbnQgYXQgdGhlIHdyb25nIGxheWVyLgovLwovLyBUaGUgcm91bmQgdHJpcCBpcyBwaW5uZWQgaW4gdGhlIHN1aXRlIG92ZXIgYWxsIGZpdmUga2luZHMgcmF0aGVyIHRoYW4KLy8gYXNzdW1lZCwgYmVjYXVzZSB0aGUgY29udHJhY3QgaXMgYW5vdGhlciByZWFsbSdzIFN0cmluZyBtZXRob2QuCmZ1bmMgcGFyc2VLaW5kKHMgc3RyaW5nKSBqb3VybmFsLktpbmQgewoJc3dpdGNoIHMgewoJY2FzZSAiYXNzZXQiOgoJCXJldHVybiBqb3VybmFsLkFzc2V0CgljYXNlICJsaWFiaWxpdHkiOgoJCXJldHVybiBqb3VybmFsLkxpYWJpbGl0eQoJY2FzZSAiZXF1aXR5IjoKCQlyZXR1cm4gam91cm5hbC5FcXVpdHkKCWNhc2UgInJldmVudWUiOgoJCXJldHVybiBqb3VybmFsLlJldmVudWUKCWNhc2UgImV4cGVuc2UiOgoJCXJldHVybiBqb3VybmFsLkV4cGVuc2UKCX0KCXBhbmljKCJzdGF0ZW1lbnRzOiB1bnJlYWRhYmxlIGFjY291bnQga2luZCAiICsgc3RyY29udi5RdW90ZShzKSArCgkJIiBmcm9tICIgKyBCb29rc1BhdGgpCn0KCi8vIGNoYXJ0T2YgcmVhZHMgYW4gb3duZXIncyB3aG9sZSBjaGFydCBvdXQgb2YgW3IvYm9va3NdIGFzIGpvdXJuYWwuQWNjb3VudAovLyByb3dzLCByZWFkeSBmb3IgW3N0bXQuRGVyaXZlXS4KLy8KLy8gIyBPbmUgd2Fsaywgbm90IGEgcGFnaW5nIGxvb3AKLy8KLy8gYm9va3MuQ29kZXMgdGFrZXMgYSBgZnJvbWAgYW5kIGEgYGxpbWl0YCwgc28gdGhlIG9idmlvdXMgc2hhcGUgaXMgYSBwYWdpbmcKLy8gbG9vcCDigJQgYW5kIERJU0NPVkVSWS5tZCDCpyA2LjQgcGxhbm5lZCBvbmUsIGNvc3RpbmcgY2VpbChuL2xpbWl0KSBmdWxsIGNoYXJ0Ci8vIHdhbGtzIGJlY2F1c2UgdGhhdCBpdGVyYXRvciBoYXMgbm8gc2VlayBhbmQgaG9ub3VycyBgZnJvbWAgYnkgc2tpcHBpbmcuCi8vIFRoaXMgYXNrcyBmb3IgdGhlIHdob2xlIGNoYXJ0IGluIE9ORSBjYWxsIGluc3RlYWQsIHdpdGggbGltaXQgYXQgci9ib29rcycKLy8gb3duIGFjY291bnQgY2FwLCB3aGljaCBpcyBleGFjdGx5IG9uZSB3YWxrIGFuZCBpcyBzdHJpY3RseSBjaGVhcGVyIHRoYW4gYW55Ci8vIHBhZ2luZyBvZiBpdC4gVGhlIGNhcCBpcyByZWFkIGZyb20gdGhhdCByZWFsbSdzIGV4cG9ydGVkIGNvbnN0YW50LCBzbyB0aGUKLy8gcmVxdWVzdCBjYW4gbmV2ZXIgYmUgc2hvcnQgb2Ygd2hhdCBhIGJvb2sgbWF5IGhvbGQuCi8vCi8vIERyb3BwaW5nIHRoZSBsb29wIGFsc28gZHJvcHMgaXRzIGhhemFyZC4gYm9va3MuQ29kZXMnIGBmcm9tYCBpcyBJTkNMVVNJVkUg4oCUCi8vIHBhZ2luZyByZS1yZWFkcyB0aGUgbGFzdCBjb2RlIHJlY2VpdmVkIOKAlCBzbyBldmVyeSBwYWdpbmcgY2FsbGVyIG93ZXMgaXRzZWxmCi8vIGEgYm91bmRhcnkgZGVkdXAsIGFuZCBhIG1pc3NlZCBvbmUgZG91YmxlLWNvdW50cyBvbmUgYWNjb3VudCBwZXIgcGFnZQovLyBib3VuZGFyeS4gQSBkb3VibGUtY291bnRlZCBiYWxhbmNlIGlzIHRoZSBkZWZlY3QgdGhpcyBwcm9kdWN0IGlzIGxlYXN0IGFibGUKLy8gdG8gZGV0ZWN0OiB0aGUgc3RhdGVtZW50IHdvdWxkIHN0aWxsIGJhbGFuY2UuCi8vCi8vICMgVGhlIGFncmVlbWVudCBjaGVjayBpcyBub3QgZGVjb3JhdGlvbgovLwovLyBib29rcy5BY2NvdW50cyBhbmQgYm9va3MuQ29kZXMgYXJlIHR3byByZWFkcywgdGFrZW4gYXQgb25lIGluc3RhbnQgYnV0Ci8vIHRocm91Z2ggZGlmZmVyZW50IGNvZGUgcGF0aHMuIElmIHRoZXkgZGlzYWdyZWUgdGhpcyByZWZ1c2VzIHJhdGhlciB0aGFuCi8vIHB1Ymxpc2hpbmcgb3ZlciBhIHRydW5jYXRlZCBjaGFydCwgYmVjYXVzZSBhIGNoYXJ0IG1pc3Npbmcgcm93cyB5aWVsZHMgYQovLyBzdGF0ZW1lbnQgdGhhdCBpcyB3cm9uZyBpbiBhIHdheSBubyBpZGVudGl0eSBoZXJlIGNhbiBzZWUuCi8vCi8vICMgVGFpbnQKLy8KLy8gVGhlIFtdc3RyaW5nIGJvb2tzLkNvZGVzIHJldHVybnMgd2FzIGFsbG9jYXRlZCB1bmRlciB0aGF0IHJlYWxtIGFuZCByZWFjaGVzCi8vIGhlcmUgcmVhZG9ubHktdGFpbnRlZC4gTm90aGluZyBiZWxvdyBtdXRhdGVzIGl0IG9yIHN0b3JlcyBpdDogdGhlIGNvZGVzIGFyZQovLyByZWFkIG91dCBieSB2YWx1ZSwgYW5kIHRoZSByb3dzIGFyZSBhbGxvY2F0ZWQgaGVyZS4KZnVuYyBjaGFydE9mKG93bmVyIGFkZHJlc3MpIFtdam91cm5hbC5BY2NvdW50IHsKCW4gOj0gYm9va3MuQWNjb3VudHMob3duZXIpIC8vIHBhbmljcyBpZiB0aGUgb3duZXIgaGFzIG5vIGJvb2sKCWNvZGVzIDo9IGJvb2tzLkNvZGVzKG93bmVyLCAiIiwgYm9va3MuTWF4QWNjb3VudHNQZXJCb29rKQoJaWYgbGVuKGNvZGVzKSAhPSBuIHsKCQlwYW5pYygic3RhdGVtZW50czogIiArIEJvb2tzUGF0aCArICIgcmVwb3J0cyAiICsgc3RyY29udi5JdG9hKG4pICsKCQkJIiBhY2NvdW50cyBidXQgZW51bWVyYXRlZCAiICsgc3RyY29udi5JdG9hKGxlbihjb2RlcykpICsKCQkJIjsgcmVmdXNpbmcgdG8gcmVwb3J0IG9uIGEgcGFydGlhbCBjaGFydCIpCgl9CgoJcm93cyA6PSBtYWtlKFtdam91cm5hbC5BY2NvdW50LCAwLCBuKQoJZm9yIF8sIGNvZGUgOj0gcmFuZ2UgY29kZXMgewoJCW5hbWUsIGtpbmQsIGRlYml0cywgY3JlZGl0cywgYmFsYW5jZSA6PSBib29rcy5BY2NvdW50SW5mbyhvd25lciwgY29kZSkKCQlhIDo9IGpvdXJuYWwuQWNjb3VudHsKCQkJQ29kZTogICAgY29kZSwKCQkJTmFtZTogICAgbmFtZSwKCQkJS2luZDogICAgcGFyc2VLaW5kKGtpbmQpLAoJCQlEZWJpdHM6ICBkZWJpdHMsCgkJCUNyZWRpdHM6IGNyZWRpdHMsCgkJfQoJCS8vIFRoZSBiYWxhbmNlIHIvYm9va3MgcmVwb3J0ZWQsIGFnYWluc3QgdGhlIG9uZSB0aGlzIHJvdyBjb21wdXRlcy4KCQkvLwoJCS8vIFN0YXRlIGl0cyByZWFjaCBleGFjdGx5LCBiZWNhdXNlIHRoZSBmbGF0dGVyaW5nIHJlYWRpbmcgaXMKCQkvLyBhdmFpbGFibGU6IEJPVEggc2lkZXMgYXJlIGpvdXJuYWwuQWNjb3VudC5CYWxhbmNlIG92ZXIgdGhlIHNhbWUgdHdvCgkJLy8gY29sdW1ucywgc28gdGhpcyBpcyBhIENPTlNUQU5UIFRSVUUgYWdhaW5zdCBhbnkgZGlzYWdyZWVtZW50CgkJLy8gYmV0d2VlbiB0aGUgdHdvIHJlYWxtcycgYXJpdGhtZXRpYyBhbmQgbXVzdCBuZXZlciBiZSBxdW90ZWQgYXMKCQkvLyBjcm9zcy1jaGVja2luZyBpdC4gV2hhdCBpdCBkb2VzIGNhdGNoIGlzIGEgdHJhbnNjcmlwdGlvbiBlcnJvciBpbgoJCS8vIHRoZSBmb3VyIGFzc2lnbm1lbnRzIGFib3ZlIOKAlCBzd2FwcGluZyBEZWJpdHMgYW5kIENyZWRpdHMsIG9yCgkJLy8gcmVhZGluZyBhIGNvbHVtbiBvZmYgdGhlIHdyb25nIGNvZGUg4oCUIHdoaWNoIGlzIHRoaXMgcmVhbG0ncyBvd24KCQkvLyBjb2RlIGFuZCB0aGUgb25seSBwbGFjZSBpbiB0aGlzIHBhdGggd2hlcmUgdGhhdCBjb3VsZCBoYXBwZW4uCgkJaWYgYS5CYWxhbmNlKCkgIT0gYmFsYW5jZSB7CgkJCXBhbmljKCJzdGF0ZW1lbnRzOiBiYWxhbmNlIG1pc21hdGNoIGZvciBhY2NvdW50ICIgKyBjb2RlICsKCQkJCSI7IHRoaXMgcmVhbG0gdHJhbnNjcmliZWQgdGhlIGNoYXJ0IHdyb25nbHkiKQoJCX0KCQlyb3dzID0gYXBwZW5kKHJvd3MsIGEpCgl9CglyZXR1cm4gcm93cwp9CgovLyBkZXJpdmVMaXZlIHJlYWRzIHRoZSBvd25lcidzIGNoYXJ0IG5vdyBhbmQgY2xhc3NpZmllcyBpdC4gRXZlcnkgbGl2ZSBmaWd1cmUKLy8gaW4gdGhpcyByZWFsbSBnb2VzIHRocm91Z2ggaGVyZSwgc28gdGhlcmUgaXMgb25lIHBhdGggZnJvbSB0aGUgbGVkZ2VyIHRvIGEKLy8gc3RhdGVtZW50IGFuZCBubyBhY2Nlc3NvciBjYW4gZGVyaXZlIGRpZmZlcmVudGx5IGZyb20gUHVibGlzaC4KLy8KLy8gTXVzdERlcml2ZSwgbm90IERlcml2ZTogb24gdGhlIG11dGF0aW5nIHBhdGggYW4gZXJyb3IgcmV0dXJuIGRvZXMgbm90IHJldmVydAovLyBhIEdubyB0cmFuc2FjdGlvbiBhbmQgb25seSBhIHBhbmljIGRvZXMuCmZ1bmMgZGVyaXZlTGl2ZShvd25lciBhZGRyZXNzKSBzdG10LlN0YXRlbWVudCB7CglyZXR1cm4gc3RtdC5NdXN0RGVyaXZlKGNoYXJ0T2Yob3duZXIpKQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gV3JpdGUKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBQdWJsaXNoIGZyZWV6ZXMgdGhlIGNhbGxlcidzIG93biBzdGF0ZW1lbnQgYXQgdGhlIGN1cnJlbnQgaGVpZ2h0IGFuZCByZXR1cm5zCi8vIGl0cyBzZXF1ZW5jZSBudW1iZXIsIHdoaWNoIHN0YXJ0cyBhdCAxIGZvciBlYWNoIHB1Ymxpc2hlci4KLy8KLy8gVGhlIG93bmVyIGlzIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSBhbmQgdGhlcmUgaXMgbm8gb3duZXIgcGFyYW1ldGVyLCBzbwovLyBhdXRob3JpemF0aW9uIGlzIHN0cnVjdHVyYWwgcmF0aGVyIHRoYW4gYSBjaGVjazogdGhlcmUgaXMgbm8gYWRkcmVzcyBmb3IgYQovLyBjYWxsZXIgdG8gZm9yZ2UgYW5kIG5vIHdheSB0byBwdWJsaXNoIGEgc3RhdGVtZW50IGFib3V0IHNvbWVib2R5IGVsc2UncwovLyBib29rLiBBIHJlYWxtIHRoYXQgY2FsbHMgaW4gcHVibGlzaGVzIG92ZXIgaXRzIG93biBib29rIGZvciBmcmVlLCB3aGljaAovLyBhcnJpdmVzIGFzIGEgcHJvcGVydHkgb2YgdGhhdCBydWxlIHJhdGhlciB0aGFuIGFzIGEgZmVhdHVyZSDigJQgdGhlIHNhbWUgd2F5Ci8vIGl0IGRvZXMgaW4gci9ib29rcy4KLy8KLy8gQW4gRU1QVFkgQ0hBUlQgSVMgUkVGVVNFRCwgYW5kIHRoaXMgaXMgYSBkZWxpYmVyYXRlIGRpdmVyZ2VuY2UgZnJvbQovLyBwL3N0YXRlbWVudHMsIHdob3NlIGRvYyBjYWxscyB6ZXJvIHJvd3MgImEgbGVnaXRpbWF0ZSBzdGF0ZW1lbnQgb2Ygbm90aGluZyIuCi8vIEl0IGlzIGxlZ2l0aW1hdGUgZm9yIGEgcHVyZSBmdW5jdGlvbiBhbmQgbm90IHdvcnRoIGEgc3RvcmFnZSBkZXBvc2l0IGhlcmU6IGEKLy8gZnJvemVuIHJvdyBvZiB6ZXJvcyBhdCBhIHBlcm1hbmVudCBwYXRoIHJlYWRzIGFzIGEgc3RhdGVtZW50IHJhdGhlciB0aGFuIGFzCi8vIGFuIGFic2VuY2UsIGFuZCB0aGUgcHVibGlzaGVyIGhhcyBwYWlkIHRvIHNheSBub3RoaW5nLgovLwovLyBFdmVyeXRoaW5nIHRoYXQgY2FuIHJlZnVzZSBkb2VzIHNvIGJlZm9yZSB0aGlzIHJlYWxtIHdyaXRlcyBhbnl0aGluZy4KZnVuYyBQdWJsaXNoKGN1ciByZWFsbSkgaW50NjQgewoJcmVmdXNlQ29pbnMoY3VyKQoJb3duZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgoJcm93cyA6PSBjaGFydE9mKG93bmVyKQoJaWYgbGVuKHJvd3MpID09IDAgewoJCXBhbmljKCJzdGF0ZW1lbnRzOiB0aGlzIGJvb2sgaGFzIG5vIGFjY291bnRzOyB0aGVyZSBpcyBub3RoaW5nIHRvIHJlcG9ydCBvbiIpCgl9CglzdCA6PSBzdG10Lk11c3REZXJpdmUocm93cykKCglrZXkgOj0gb3duZXIuU3RyaW5nKCkKCXNlcSA6PSBpbnQ2NChvd25lckNvdW50KGtleSkpICsgMQoJcHVibGlzaGVkLlNldChwdWJLZXkoa2V5LCBzZXEpLCAmcmVjb3JkewoJCWF0OiBydW50aW1lLkNoYWluSGVpZ2h0KCksCgkJc3Q6IHN0LAoJfSkKCWNvdW50cy5TZXQoa2V5LCBpbnQoc2VxKSkKCXB1YkNvdW50KysKCXJldHVybiBzZXEKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJlYWRzIOKAlCB0aGUgZnJvemVuIHN0YXRlbWVudHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBDb3VudCBpcyBob3cgbWFueSBzdGF0ZW1lbnRzIGFuIG93bmVyIGhhcyBwdWJsaXNoZWQuIFplcm8gZm9yIGFuIGFkZHJlc3MKLy8gdGhhdCBoYXMgbmV2ZXIgcHVibGlzaGVkLCB3aGljaCBpcyBub3QgYW4gZXJyb3IuCmZ1bmMgQ291bnQob3duZXIgYWRkcmVzcykgaW50IHsgcmV0dXJuIG93bmVyQ291bnQob3duZXIuU3RyaW5nKCkpIH0KCi8vIExhdGVzdCBpcyBhbiBvd25lcidzIGhpZ2hlc3Qgc2VxdWVuY2UgbnVtYmVyLCBhbmQgd2hldGhlciB0aGV5IGhhdmUKLy8gcHVibGlzaGVkIGF0IGFsbC4gVGhlIHNlY29uZCByZXN1bHQgbWF0dGVyczogc2VxdWVuY2UgbnVtYmVycyBzdGFydCBhdCAxLCBzbwovLyBhIHplcm8gZmlyc3QgcmVzdWx0IG1lYW5zICJuZXZlciBwdWJsaXNoZWQiIGFuZCBuZXZlciAic3RhdGVtZW50IDAiLgpmdW5jIExhdGVzdChvd25lciBhZGRyZXNzKSAoaW50NjQsIGJvb2wpIHsKCW4gOj0gb3duZXJDb3VudChvd25lci5TdHJpbmcoKSkKCWlmIG4gPT0gMCB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gaW50NjQobiksIHRydWUKfQoKLy8gVG90YWwgaXMgaG93IG1hbnkgc3RhdGVtZW50cyBleGlzdCBhY3Jvc3MgZXZlcnkgcHVibGlzaGVyLiBJdCBpcyBhIGNvdW50IGFuZAovLyBub3RoaW5nIG1vcmU7IHNlZSB0aGUgcGFja2FnZSBkb2Mgb24gd2h5IHRoZXJlIGlzIG5vIGVudW1lcmF0aW9uIGFuZCBubwovLyBjcm9zcy1vd25lciBmaWd1cmUuCmZ1bmMgVG90YWwoKSBpbnQgeyByZXR1cm4gcHViQ291bnQgfQoKLy8gSGFzIHJlcG9ydHMgd2hldGhlciBhIHB1YmxpY2F0aW9uIGV4aXN0cywgc28gYSByZWFkZXIgY2FuIGRpc3Rpbmd1aXNoIGl0Ci8vIGZyb20gdGhlIHBhbmljcyBldmVyeSBhY2Nlc3NvciBiZWxvdyByYWlzZXMgZm9yIGFuIHVua25vd24gb25lLgpmdW5jIEhhcyhvd25lciBhZGRyZXNzLCBzZXEgaW50NjQpIGJvb2wgewoJcmV0dXJuIHB1Ymxpc2hlZC5IYXMocHViS2V5KG93bmVyLlN0cmluZygpLCBzZXEpKQp9CgovLyBQdWJsaXNoZWRBdCBpcyB0aGUgY2hhaW4gaGVpZ2h0IGEgc3RhdGVtZW50IHdhcyBmcm96ZW4gYXQuCmZ1bmMgUHVibGlzaGVkQXQob3duZXIgYWRkcmVzcywgc2VxIGludDY0KSBpbnQ2NCB7CglyZXR1cm4gbXVzdFJlY29yZChvd25lciwgc2VxKS5hdAp9CgovLyBSb3dzIGlzIGhvdyBtYW55IGFjY291bnRzIHRoZSBzdGF0ZW1lbnQgY2xhc3NpZmllZC4KZnVuYyBSb3dzKG93bmVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgaW50IHsKCXJldHVybiBtdXN0UmVjb3JkKG93bmVyLCBzZXEpLnN0LlJvd3MKfQoKLy8gQmFsYW5jZVNoZWV0IHJldHVybnMgYSBmcm96ZW4gc3RhdGVtZW50J3MgYmFsYW5jZSBzaGVldC4KLy8KLy8gY3VtdWxhdGl2ZU5ldCBhcHBlYXJzIGhlcmUgYXMgYW4gRVhQTElDSVQgUkVDT05DSUxJTkcgTElORSBiZWNhdXNlIG5vdGhpbmcKLy8gaW4gdGhpcyBzdGFjayBjbG9zZXMgYSBub21pbmFsIGFjY291bnQgaW50byBlcXVpdHkuIGNsYWltcyBpcwovLyBsaWFiaWxpdGllcyArIGVxdWl0eSArIGN1bXVsYXRpdmVOZXQsIHNvIGEgcmVhZGVyIHdobyBjaGVja3MgYXNzZXRzIGFnYWluc3QKLy8gbGlhYmlsaXRpZXMgKyBlcXVpdHkgYWxvbmUgYW5kIGZpbmRzIGl0IHNob3J0IGJ5IGV4YWN0bHkgY3VtdWxhdGl2ZU5ldCBpcwovLyBub3QgbG9va2luZyBhdCBhIGJ1Zy4KLy8KLy8gYXNzZXRzIGFuZCBjbGFpbXMgYXJlIGJvdGggcmV0dXJuZWQgYW5kIHRoZWlyIGVxdWFsaXR5IGlzIGRlbGliZXJhdGVseSBub3QKLy8gb2ZmZXJlZCBhcyBhIHZlcmRpY3Q7IHNlZSB0aGUgcGFja2FnZSBkb2MuCmZ1bmMgQmFsYW5jZVNoZWV0KG93bmVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgKGFzc2V0cywgbGlhYmlsaXRpZXMsIGVxdWl0eSwgY3VtdWxhdGl2ZU5ldCwgY2xhaW1zIGludDY0KSB7CglzIDo9IG11c3RSZWNvcmQob3duZXIsIHNlcSkuc3QKCXJldHVybiBzLkFzc2V0cywgcy5MaWFiaWxpdGllcywgcy5FcXVpdHksIHMuQ3VtdWxhdGl2ZU5ldCwgcy5DbGFpbXMKfQoKLy8gSW5jb21lU3RhdGVtZW50IHJldHVybnMgYSBmcm96ZW4gc3RhdGVtZW50J3MgaW5jb21lIHN0YXRlbWVudC4gRXZlcnkgZmlndXJlCi8vIGlzIENVTVVMQVRJVkUgU0lOQ0UgVEhFIEJPT0snUyBGSVJTVCBQT1NUSU5HLCBub3QgYSBwZXJpb2QgZmlndXJlOyBzZWUgdGhlCi8vIHBhY2thZ2UgZG9jLgpmdW5jIEluY29tZVN0YXRlbWVudChvd25lciBhZGRyZXNzLCBzZXEgaW50NjQpIChjdW11bGF0aXZlUmV2ZW51ZSwgY3VtdWxhdGl2ZUV4cGVuc2VzLCBjdW11bGF0aXZlTmV0IGludDY0KSB7CglzIDo9IG11c3RSZWNvcmQob3duZXIsIHNlcSkuc3QKCXJldHVybiBzLkN1bXVsYXRpdmVSZXZlbnVlLCBzLkN1bXVsYXRpdmVFeHBlbnNlcywgcy5DdW11bGF0aXZlTmV0Cn0KCi8vIFNlY3Rpb25Ub3RhbCByZXR1cm5zIHRoZSBmaWd1cmUgcHJlc2VudGVkIGZvciBvbmUgc2VjdGlvbjogImFzc2V0cyIsCi8vICJjbGFpbXMiIG9yICJwZXJmb3JtYW5jZSIuIFRoZSBwZXJmb3JtYW5jZSB0b3RhbCBpcyB0aGUgaW5jb21lIHN0YXRlbWVudCdzCi8vIGJvdHRvbSBsaW5lLCBub3QgdGhlIHN1bSBvZiBpdHMgdHdvIGNvbXBvbmVudHMuCmZ1bmMgU2VjdGlvblRvdGFsKG93bmVyIGFkZHJlc3MsIHNlcSBpbnQ2NCwgc2VjdGlvbiBzdHJpbmcpIGludDY0IHsKCXYsIGVyciA6PSBtdXN0UmVjb3JkKG93bmVyLCBzZXEpLnN0LlNlY3Rpb25Ub3RhbChwYXJzZVNlY3Rpb24oc2VjdGlvbikpCglpZiBlcnIgIT0gbmlsIHsKCQkvLyBVbnJlYWNoYWJsZTogcGFyc2VTZWN0aW9uIHBhbmljcyBvbiBhbnl0aGluZyBvdXRzaWRlIHRoZSB0aHJlZS4KCQlwYW5pYygic3RhdGVtZW50czogIiArIGVyci5FcnJvcigpKQoJfQoJcmV0dXJuIHYKfQoKLy8gQWJub3JtYWxDb3VudCBpcyBob3cgbWFueSBhY2NvdW50cyBpbiBhIGZyb3plbiBzdGF0ZW1lbnQgY2FycnkgYSBiYWxhbmNlCi8vIHJ1bm5pbmcgYWdhaW5zdCB0aGVpciBraW5kLgovLwovLyAjIFdoYXQgdGhlIGNlbnN1cyBjYXRjaGVzLCBhbmQgd2hhdCBpdCBjYW5ub3QKLy8KLy8gVGhpcyBpcyB0aGUgb25seSBwYXJ0aWFsIGFuc3dlciBpbiB0aGlzIHBvcnRmb2xpbyB0byBwL2pvdXJuYWwncyBjb25zdW1lcgovLyBvYmxpZ2F0aW9uIDcg4oCUIGEga2luZCBzZXQgd3JvbmdseSB3aGVuIGFuIGFjY291bnQgd2FzIG9wZW5lZCBpcyB1bmRldGVjdGFibGUKLy8gaW4gdGhhdCBwYWNrYWdlIGFuZCB1bmRldGVjdGFibGUgYW55d2hlcmUgZWxzZSBpbiBpdC4gVGhlIGFuc3dlciBpcyBzb3VuZCBhbmQKLy8gaW5jb21wbGV0ZSwgYW5kIHRoZSBpbmNvbXBsZXRlbmVzcyBpcyBleGFjdDoKLy8KLy8gICAtIEl0IENBVENIRVMgYSBtaXNjbGFzc2lmaWNhdGlvbiB0aGF0IGNyb3NzZXMgdGhlIGRlYml0L2NyZWRpdC1ub3JtYWwKLy8gICAgIGJvdW5kYXJ5IGFuZCB3aG9zZSBhY2NvdW50IGhhcyBhIG5vbi16ZXJvIGJhbGFuY2UuIEFuIGFjY291bnQgbmFtZWQKLy8gICAgICJBY2NvdW50cyBwYXlhYmxlIiBidXQgY29kZWQgMTIwMCBpcyBhbiBhc3NldCBpbiByL2Jvb2tzJyBzY2hlbWUsCi8vICAgICBhY2N1bXVsYXRlcyBjcmVkaXRzLCBhbmQgcmVhZHMgbmVnYXRpdmUgaGVyZS4KLy8gICAtIEl0IENBTk5PVCBDQVRDSCBhIG1pc2NsYXNzaWZpY2F0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgc2lkZToKLy8gICAgIGxpYWJpbGl0eSB0byBlcXVpdHkgdG8gcmV2ZW51ZSwgb3IgYXNzZXQgdG8gZXhwZW5zZS4gQm90aCBzdWJ0b3RhbHMKLy8gICAgIG1vdmUsIG5vIGJhbGFuY2UgZ29lcyBuZWdhdGl2ZSwgYW5kIG5vdGhpbmcgaW4gdGhpcyBwb3J0Zm9saW8gZGV0ZWN0cwovLyAgICAgaXQuIE9ibGlnYXRpb24gNyBpcyBOQVJST1dFRCwgTk9UIENMT1NFRC4KLy8gICAtIEl0IGhhcyBhIEZBTFNFLVBPU0lUSVZFIE1PREUgdGhhdCBpcyBub3QgYSBkZWZlY3QuIEEgZ2VudWluZSBjb250cmEKLy8gICAgIGFjY291bnQg4oCUIGFjY3VtdWxhdGVkIGRlcHJlY2lhdGlvbiB1bmRlciBhc3NldHMsIGEgc2FsZXMgcmV0dXJuIHVuZGVyCi8vICAgICByZXZlbnVlIOKAlCBpcyBsZWdpdGltYXRlbHkgYWJub3JtYWwtc2lnbmVkLiByL2Jvb2tzJyBjb2RlLXByZWZpeCBzY2hlbWUKLy8gICAgIGhhcyBubyBjb250cmEgcmFuZ2UsIHNvIHN1Y2ggYW4gYWNjb3VudCBpcyBpbmRpc3Rpbmd1aXNoYWJsZSBoZXJlIGZyb20gYQovLyAgICAgbWlzY29kZWQgb25lLgovLwovLyBTbyBhIG5vbi16ZXJvIGNvdW50IGlzIEEgRklORElORyBUTyBSRUFELCBuZXZlciBhIHZlcmRpY3QsIGFuZCBhIHplcm8gY291bnQKLy8gaXMgbm90IGEgY2xlYW4gYmlsbCBvZiBoZWFsdGguCmZ1bmMgQWJub3JtYWxDb3VudChvd25lciBhZGRyZXNzLCBzZXEgaW50NjQpIGludCB7CglyZXR1cm4gbGVuKG11c3RSZWNvcmQob3duZXIsIHNlcSkuc3QuQWJub3JtYWwpCn0KCi8vIEFibm9ybWFsSW4gY291bnRzIHRoZSBhYm5vcm1hbCBhY2NvdW50cyBwcmVzZW50ZWQgaW4gb25lIHNlY3Rpb246Ci8vICJhc3NldHMiLCAiY2xhaW1zIiBvciAicGVyZm9ybWFuY2UiLgpmdW5jIEFibm9ybWFsSW4ob3duZXIgYWRkcmVzcywgc2VxIGludDY0LCBzZWN0aW9uIHN0cmluZykgaW50IHsKCXJldHVybiBtdXN0UmVjb3JkKG93bmVyLCBzZXEpLnN0LkFibm9ybWFsSW4ocGFyc2VTZWN0aW9uKHNlY3Rpb24pKQp9CgovLyBBYm5vcm1hbEF0IHJldHVybnMgb25lIGNlbnN1cyByb3cgYnkgaXRzIHplcm8tYmFzZWQgaW5kZXguIFJvd3MgYXJlIGluCi8vIGFzY2VuZGluZyBhY2NvdW50LWNvZGUgb3JkZXIsIHdoaWNoIHAvc3RhdGVtZW50cyBlbmZvcmNlcyBhcyBhIHByZWNvbmRpdGlvbgovLyBvbiBpdHMgaW5wdXQgcmF0aGVyIHRoYW4gcmVseWluZyBvbiB0aGlzIHJlYWxtIHRvIHNvcnQuCi8vCi8vIHNlY3Rpb24gaXMgdGhlIHJvdydzIHN0YXRlbWVudCBzZWN0aW9uLCBkZXJpdmVkIGZyb20gaXRzIGtpbmQgdGhyb3VnaCB0aGUKLy8gc2FtZSBtYXBwaW5nIHRoZSB0b3RhbHMgd2VyZSBidWlsdCBmcm9tLgpmdW5jIEFibm9ybWFsQXQob3duZXIgYWRkcmVzcywgc2VxIGludDY0LCBpIGludCkgKGNvZGUsIG5hbWUsIGtpbmQsIHNlY3Rpb24gc3RyaW5nLCBiYWxhbmNlIGludDY0KSB7Cglyb3dzIDo9IG11c3RSZWNvcmQob3duZXIsIHNlcSkuc3QuQWJub3JtYWwKCWlmIGkgPCAwIHx8IGkgPj0gbGVuKHJvd3MpIHsKCQlwYW5pYygic3RhdGVtZW50czogbm8gY2Vuc3VzIHJvdyAiICsgc3RyY29udi5JdG9hKGkpICsKCQkJIjsgdGhpcyBzdGF0ZW1lbnQgaGFzICIgKyBzdHJjb252Lkl0b2EobGVuKHJvd3MpKSkKCX0KCWEgOj0gcm93c1tpXQoJc2VjLCBlcnIgOj0gc3RtdC5TZWN0aW9uT2YoYS5LaW5kKQoJaWYgZXJyICE9IG5pbCB7CgkJLy8gVW5yZWFjaGFibGU6IERlcml2ZSByZWZ1c2VzIGEgcm93IHdob3NlIGtpbmQgaXMgb3V0c2lkZSB0aGUgZml2ZS4KCQlwYW5pYygic3RhdGVtZW50czogIiArIGVyci5FcnJvcigpKQoJfQoJcmV0dXJuIGEuQ29kZSwgYS5OYW1lLCBhLktpbmQuU3RyaW5nKCksIHNlYy5TdHJpbmcoKSwgYS5CYWxhbmNlCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZWFkcyDigJQgdGhlIGxpdmUgY2hhcnQKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBUSEUgQ09TVCBERUNJU0lPTiBGT1IgRVZFUlkgQUNDRVNTT1IgQkVMT1csIFJFQ09SREVEIEJFQ0FVU0UgSVQgV0FTIE5PVC4KLy8KLy8gRWFjaCBvZiB0aGVzZSB0YWtlcyBhbiBgb3duZXIgYWRkcmVzc2AgdGhlIENBTExFUiBuYW1lcywgYW5kIGVhY2ggb25lIHdhbGtzCi8vIHRoYXQgc3RyYW5nZXIncyB3aG9sZSBjaGFydDogb25lIGJvb2tzLkNvZGVzIGNhbGwgcGx1cyB1cCB0bwovLyBib29rcy5NYXhBY2NvdW50c1BlckJvb2sgc2VwYXJhdGUgY3Jvc3MtcmVhbG0gYm9va3MuQWNjb3VudEluZm8gY2FsbHMuIE5vbmUKLy8gb2YgdGhlbSBpcyBhIGNyb3NzaW5nIGZ1bmN0aW9uLCBzbyBhbnlvbmUgY2FuIHRyaWdnZXIgdGhhdCBhZ2FpbnN0IGFueQovLyBhZGRyZXNzIGZvciBmcmVlLiBBbiBhdWRpdCByYWlzZWQgaXQ7IHRoaXMgYmxvY2sgaXMgdGhlIGFuc3dlciwgYW5kIHRoZQovLyByZWFsbSdzIG90aGVyIGNvc3QgZGVjaXNpb25zIGFyZSBkb2N1bWVudGVkIHNvIHRoaXMgb25lIGhhcyB0byBiZSB0b28uCi8vCi8vIFdIQVQgSVMgQU5EIElTIE5PVCBBVCBTVEFLRS4gVGhlIHF1ZXJ5aW5nIGNhbGxlciBwYXlzIHRoZSBnYXMuIE5vdGhpbmcgaXMKLy8gY2hhcmdlZCB0byB0aGUgb3duZXIsIG5vdGhpbmcgYWNjdW11bGF0ZXMgaW4gY2hhaW4gc3RhdGUsIGFuZCBubyBmaWd1cmUgaGVyZQovLyBjYW4gYmUgbW92ZWQgYnkgdGhlIHF1ZXJ5LiBUaGUgcmVzaWR1YWwgaXMgdGhhdCBhIHZtL3FyZW5kZXIgb3Igdm0vcWV2YWwKLy8gYWdhaW5zdCBhIGNoYXJ0IGF0IHRoZSBhY2NvdW50IGNhcCBpcyB0aGF0IG1hbnkgY3Jvc3MtcmVhbG0gY2FsbHMgb2YKLy8gTk9ERS1TSURFIHdvcmsg4oCUIGEgbm9kZS1vcGVyYXRvciBjb25zaWRlcmF0aW9uLCBub3QgYSBoYXphcmQgdG8gdGhpcyByZWFsbQovLyBvciB0byB0aGUgb3duZXIuIFtWZXJpZnldIGJlaW5nIHJlYWNoZWQgZnJvbSBbUmVuZGVyXSBpcyB0aGUgb25lIHBhcnQgdGhhdCBpcwovLyBpbnZvbHVudGFyeSBmb3IgYSB2aWV3ZXIgYW5kIHJlcGVhdGFibGUgYnkgYW55b25lOiBhIHB1YmxpYyBwYWdlIHBheXMgaXQgcGVyCi8vIHZpZXcuCi8vCi8vIFRIRSBERUNJU0lPTiBJUyBUTyBLRUVQIFRIRSBJTkxJTkUgQ0FMTC4gVGhlIGNoZWFwIGFsdGVybmF0aXZlIGlzIGZvcgovLyByZW5kZXJTdGF0ZW1lbnQgdG8gcHJpbnQgdGhlIGZyb3plbiBmaWd1cmVzIGFuZCBsaW5rIHRvIFtWZXJpZnldIGluc3RlYWQgb2YKLy8gY2FsbGluZyBpdC4gVGhhdCBpcyByZWZ1c2VkIGJlY2F1c2UgYSBwYWdlIHNob3dpbmcgZnJvemVuIGZpZ3VyZXMgd2l0aCBubwovLyBsaXZlIGNvbXBhcmlzb24gaXMgdGhlIGV4YWN0IGFydGlmYWN0IHRoaXMgcmVhbG0gZXhpc3RzIHRvIGltcHJvdmUgb24g4oCUIHRoZQovLyB3aG9sZSByZWFzb24gW1ZlcmlmeV0gYW5kIHRoZXNlIGFjY2Vzc29ycyBleGlzdCBpcyB0aGF0IGEgc3RhbGUgc3RhdGVtZW50IGJlCi8vIHZpc2libHkgc3RhbGUsIGFuZCBkZWZlcnJpbmcgdGhhdCB0byBhIHNlY29uZCBjbGljayBtYWtlcyB0aGUgY29tbW9uIHJlYWRpbmcKLy8gdGhlIHVuaW5mb3JtZWQgb25lLiBUaGUgYm91bmQgaXMgdGhlIHJlYWxtJ3Mgb3duIGFjY291bnQgY2FwLCBpdCBpcwovLyBkb3VibGUtY2xhbXBlZCBieSBib29rcy5Db2RlcywgYW5kIHRoZSBjb3N0IGlzIGZsYXQgcGVyIHZpZXcgcmF0aGVyIHRoYW4KLy8gZ3Jvd2luZy4KLy8KLy8gVEhFIEFYSVMgVEhBVCBET0VTIE5PVCBQUklDRSBUSElTLiBFbnRyaWVzLCBub3QgYWNjb3VudHMsIGFyZSB3aGF0IGEgYm9vawovLyBhY2N1bXVsYXRlcyB3aXRob3V0IGJvdW5kLCBzbyB0aGUgcXVlc3Rpb24gdGhhdCBkZWNpZGVzIHRoZSBjZWlsaW5nIGlzCi8vIHdoZXRoZXIgdGhpcyB3YWxrIGlzIHByaWNlZCBieSBlbnRyaWVzIGFzIHdlbGwgYXMgYnkgYWNjb3VudHMuIEl0IGlzIG5vdCwKLy8gYW5kIHRoZSByZWFzb24gaXMgU1RSVUNUVVJBTCByYXRoZXIgdGhhbiBtZWFzdXJlZDogYm9va3MuQWNjb3VudEluZm8gcmV0dXJucwovLyB0aGUgYWNjb3VudCdzIFNUT1JFRCBEZWJpdHMgYW5kIENyZWRpdHMgYW5kIGEgQmFsYW5jZSgpIG92ZXIgdGhlbSwgc28gaXQKLy8gUkVBRFMgTk8gRU5UUklFUyBBVCBBTEwgYW5kIHBlcmZvcm1zIG5vIGpvdXJuYWwgcmVwbGF5LiBjaGFydE9mIGRvZXMgb25lCi8vIGJvb2tzLkNvZGVzIHdhbGsgcGx1cyBvbmUgQWNjb3VudEluZm8gcGVyIGFjY291bnQsIGJvdW5kZWQgYnkgdGhlIGFjY291bnQKLy8gY2FwLiBTbyB0aGUgY2VpbGluZyBpcyB0aGUgTUFYIG9mIHRoZSBhY2NvdW50IGFuZCBlbnRyeSBheGVzIGFuZCBuZXZlciB0aGVpcgovLyBwcm9kdWN0LgovLwovLyBTYXkgaXQgYXMgIk8oMSkgaW4gZW50cmllcyBFWEFNSU5FRCIsIG5ldmVyIGFzICJPKDEpIGluIGdhcyIgLS0gdGhlIHNlY29uZCBpcwovLyB0aGUgb3ZlcmNsYWltIGF2YWlsYWJsZSBoZXJlIGFuZCB0aGUgbWVhc3VyZW1lbnQgYmVsb3cgcmVmdXRlcyBpdC4gQSBiaWdnZXIKLy8gYm9vayBpcyBhIGJpZ2dlciBzdG9yZSBhbmQgZXZlcnkgbG9va3VwIGludG8gaXQgdHJhdmVyc2VzIGEgZGVlcGVyIGF2bCB0cmVlLAovLyBzbyBjb3N0IGRvZXMgZ3JvdyB3aXRoIGVudHJpZXM6IHN1Yi1saW5lYXJseSwgaW4gdGhlIHN0b3JlJ3MgZGVwdGggcmF0aGVyCi8vIHRoYW4gaW4gdGhlIGVudHJ5IGNvdW50LiBUaGUgY2VpbGluZyBhcmd1bWVudCBuZWVkcyBvbmx5IHRoYXQgdGhlIGVudHJ5IHRlcm0KLy8gaXMgYWJzZW50IGZyb20gdGhlIFBST0RVQ1QsIHdoaWNoIHRoaXMgZ2l2ZXMgaXQuCi8vCi8vIEEgZ2FzIG1lYXN1cmVtZW50IGNoZWNrcyB0aGF0IGFuZCBkb2VzIG5vdCBlc3RhYmxpc2ggaXQsIHdoaWNoIGlzIHRoZSByaWdodAovLyB3YXkgcm91bmQgYW5kIHdhcyBub3QgaG93IHRoaXMgY29tbWVudCBmaXJzdCByZWFkLiBNZWFzdXJlZCBvbiB0aGUgcGlubmVkCi8vIG9ueXggdG9vbGNoYWluLCB0d28gYWNjb3VudHMgaGVsZCBjb25zdGFudCwgYXMgKDEwMSByZWFkcyBtaW51cyAxIHJlYWQpIC8gMTAwCi8vIHNvIHRoZSBzZXR1cCBjYW5jZWxzOiBhYm91dCA0NzZrIGdhcyBwZXIgcmVhZCBhZ2FpbnN0IGEgMy1lbnRyeSBib29rIGFuZAovLyBhYm91dCA1NjNrIGFnYWluc3Qgb25lIGF0IGJvb2tzLk1heEVudHJpZXNQZXJCb29rIC0tICsxOCUgYWNyb3NzIHRoZSB3aG9sZQovLyBlbnRyeSByYW5nZSwgb3Igcm91Z2hseSB0d2VudHkgZ2FzIHBlciBlbnRyeSwgSU4gVEhBVCBGSVhUVVJFLiBSZWFkIHRoZSBuZXh0Ci8vIHBhcmFncmFwaCBiZWZvcmUgcXVvdGluZyBlaXRoZXIgZmlndXJlOyB0aGUgcXVhbGlmaWVyIGlzIG5vdCBhIGhlZGdlIGFuZCB0aGUKLy8gcGVyY2VudGFnZSBpcyBub3QgYSBwcm9wZXJ0eSBvZiB0aGlzIHJlYWxtLiBXaGF0IHRoZSBmaWd1cmVzIGRvIGVzdGFibGlzaCBpcwovLyB0aGUgc2hhcGU6IGVudHJ5IGNvdW50IGFkZHMgYSByZWFsbS1zaXplIG92ZXJoZWFkIGFuZCBub3QgYSByZXBsYXksIHdoaWNoIGlzCi8vIHdoYXQgdGhlIHN0cnVjdHVyYWwgYXJndW1lbnQgcHJlZGljdHMuCi8vCi8vIFRIT1NFIFRXTyBGSUdVUkVTIEFSRSBFWEFDVExZIFJFUFJPRFVDSUJMRSBBTkQgQVJFIFNUSUxMIE5PVCBBIFBSSUNFLCBhbmQKLy8gdGhlIGRpc3RpbmN0aW9uIGlzIHRoZSB3aG9sZSBwb2ludCBvZiB0aGlzIHBhcmFncmFwaC4gVHdvIHNlcGFyYXRlCi8vIGludm9jYXRpb25zIG9mIHRoZSBzYW1lIGZvdXItY2FzZSBmaXh0dXJlIHJldHVybmVkIDQ3Niw0NzAgYW5kIDU2Miw4NzQgZ2FzCi8vIHBlciByZWFkLCBpZGVudGljYWwgdG8gdGhlIHVuaXQgLS0gc28gdGhpcyBpcyBub3QgcnVuLXRvLXJ1biBub2lzZSBhbmQgdGhlCi8vIHRvb2xjaGFpbiBpcyBkZXRlcm1pbmlzdGljLiBBZGQgTklORSBVTlJFTEFURUQgdGVzdCBjYXNlcyBhaGVhZCBvZiB0aGUgc2FtZQovLyBmb3VyIGFuZCB0aGUgY2FwIGZpZ3VyZSBiZWNvbWVzIDgyOCw2MDIsIHVwIDQ3JSwgd2hpbGUgdGhlIDMtZW50cnkgZmlndXJlCi8vIG1vdmVzIDMlLiBXaGF0IHRoZSBudW1iZXIgaXMgc2Vuc2l0aXZlIHRvIGlzIHRoZXJlZm9yZSB0aGUgdG90YWwgYXZsIHN0YXRlCi8vIHJlc2lkZW50IHdoZW4gdGhlIHJlYWQgaGFwcGVucywgbm90IHRoZSBlbnRyeSBjb3VudCB1bmRlciB0ZXN0LiBBIGZpZ3VyZQovLyBtZWFzdXJlZCBpbiBhIGZpeHR1cmUgaXMgYSBmaWd1cmUgYWJvdXQgdGhhdCBmaXh0dXJlOyBvbiBjaGFpbiB0aGUgcmVzaWRlbnQKLy8gc3RhdGUgaXMgdGhlIHdob2xlIHJlYWxtJ3MgaGlzdG9yeSBhbmQgbm90aGluZyBoZXJlIGJvdW5kcyBpdC4KLy8KLy8gVGhhdCBhbHNvIGV4cGxhaW5zIHRoZSB0d28gZGVzaWducyB0aGF0IGZhaWxlZCwgd2hpY2ggYXJlIGtlcHQgYmVjYXVzZSB0aGUKLy8gZmFpbHVyZSBpcyB0aGUgZXZpZGVuY2UuIERpZmZlcmVuY2luZyBzZXR1cC1vbmx5IGFnYWluc3Qgc2V0dXAtcGx1cy1vbmUtcmVhZAovLyBhdCB0aGUgY2FwIHB1dHMgYSB+NWU1IHNpZ25hbCBhZ2FpbnN0IGEgfjMuNWU5IHNldHVwLiBEaWZmZXJlbmNpbmcgYnkgVEVOCi8vIHJlYWRzIHJldHVybmVkIGEgTkVHQVRJVkUgbWFyZ2luYWw6IGVhY2ggY2FzZSBjYXJyaWVzIGl0cyBvd24gc2V0dXAsIGFuZCB0aGUKLy8gbGF0ZXIgY2FzZSdzIHNldHVwIHJ1bnMgYWdhaW5zdCBtb3JlIGFjY3VtdWxhdGVkIHN0YXRlIHRoYW4gdGhlIGVhcmxpZXIKLy8gb25lJ3MsIHNvIHRoZSBvcmRlciBlZmZlY3QgZXhjZWVkZWQgYSAxMC1yZWFkIHNpZ25hbCBhbmQgcmV2ZXJzZWQgaXRzIHNpZ24uCi8vIEEgaHVuZHJlZCByZWFkcyBjbGVhcnMgdGhhdDsgdGVuIGRvZXMgbm90LiBUaGUgY29uZm91bmQgd2FzIGZvdW5kIGJ5IHRoZSBzaWduCi8vIHJhdGhlciB0aGFuIGFyZ3VlZC4KLy8KLy8gQW4gZWFybGllciB2ZXJzaW9uIG9mIHRoaXMgY29tbWVudCBxdW90ZWQgMSwwNjAsNDA3IGFuZCAxLDA4NSw0OTUgZ2FzLAovLyAiKzIuNCUiLCAiYWJvdXQgc2l4IGdhcyBwZXIgZW50cnkiLiBUaG9zZSBjYW1lIGZyb20gb25lIG9mIHRoZSBjb25mb3VuZGVkCi8vIGRlc2lnbnMgYW5kIGRpZCBub3QgcmVwcm9kdWNlLiBUaGV5IGFyZSByZXBsYWNlZCByYXRoZXIgdGhhbiBkZWZlbmRlZC4gVGhlCi8vIHN0cnVjdHVyYWwgY2xhaW0gYWJvdmUgaXMgdGhlIG9uZSB0aGF0IHN1cnZpdmVzLCBhbmQgaXQgaXMgY2hlY2thYmxlIGZyb20KLy8gc291cmNlIGZvcmV2ZXIgd2hpbGUgYSBnYXMgZmlndXJlIGlzIG5vdC4KLy8KLy8gV0hBVCBUSElTIElTIE5PVC4gSXQgaXMgTk9UIHRoZSBjb3N0IGRlY2lzaW9uIGJvb2tzLlJlZGVyaXZlIG1ha2VzIGJ5IGJlaW5nCi8vIGEgY3Jvc3NpbmcgZnVuY3Rpb24uIFRoYXQgcmVhbG0ncyBkb2Mgc2F5cyBhIGZyZWUgcmVhZCB0aGVyZSAid291bGQgbGV0Ci8vIGFueW9uZSBtYWtlIGFuIG93bmVyJ3MgYm9vayBleHBlbnNpdmUgdG8gcXVlcnkiLCBhbmQgdGhlIGZpcnN0IHJlYWRpbmcgb2YKLy8gdGhpcyBmaW5kaW5nIHdhcyB0aGF0IHRoaXMgcmVhbG0gdW5kb2VzIHRoYXQgZGVjaXNpb24uIEl0IGRvZXMgbm90LCBhbmQgdGhlCi8vIGFuYWxvZ3kgd2FzIHdpdGhkcmF3biBvbiBldmlkZW5jZTogUmVkZXJpdmUgcmVwbGF5cyB0aGUgQVBQRU5ELU9OTFkgSk9VUk5BTCwKLy8gYm91bmRlZCBieSBlbnRyeSBjb3VudCBhbmQgZ3Jvd2luZyB3aXRob3V0IGJvdW5kLCB3aGlsZSBjaGFydE9mIGlzIGJvdW5kZWQKLy8gYnkgQUNDT1VOVFMgYXQgYSBmaXhlZCBjYXAuIFRoZSB0d28gZGlmZmVyIGJ5IG9yZGVycyBvZiBtYWduaXR1ZGUsIHdoaWNoIGlzCi8vIHdoeSBvbmUgaXMgZ2F0ZWQgYW5kIHRoZXNlIGFyZSBub3QuCgovLyBDdXJyZW50QmFsYW5jZVNoZWV0IGRlcml2ZXMgdGhlIG93bmVyJ3MgYmFsYW5jZSBzaGVldCBmcm9tIHRoZWlyIGNoYXJ0IE5PVywKLy8gcHVibGlzaGluZyBub3RoaW5nLiBJdCBleGlzdHMgc28gdGhhdCBhIGZhbHNlIFtWZXJpZnldIGlzIGRpYWdub3NhYmxlOiBhCi8vIHJlYWRlciBjYW4gc2VlIHdoaWNoIGZpZ3VyZSBtb3ZlZCBpbnN0ZWFkIG9mIG9ubHkgdGhhdCBvbmUgZGlkLgovLwovLyBFYWNoIG9mIHRoZSB0aHJlZSBDdXJyZW50IGFjY2Vzc29ycyByZS1yZWFkcyB0aGUgY2hhcnQsIHNvIGFza2luZyBmb3IgYWxsIG9mCi8vIHRoZW0gaXMgdGhyZWUgd2Fsa3MuIFtWZXJpZnldIGlzIHRoZSBzaW5nbGUtY2FsbCBmb3JtLgpmdW5jIEN1cnJlbnRCYWxhbmNlU2hlZXQob3duZXIgYWRkcmVzcykgKGFzc2V0cywgbGlhYmlsaXRpZXMsIGVxdWl0eSwgY3VtdWxhdGl2ZU5ldCwgY2xhaW1zIGludDY0KSB7CglzIDo9IGRlcml2ZUxpdmUob3duZXIpCglyZXR1cm4gcy5Bc3NldHMsIHMuTGlhYmlsaXRpZXMsIHMuRXF1aXR5LCBzLkN1bXVsYXRpdmVOZXQsIHMuQ2xhaW1zCn0KCi8vIEN1cnJlbnRJbmNvbWVTdGF0ZW1lbnQgZGVyaXZlcyB0aGUgb3duZXIncyBpbmNvbWUgc3RhdGVtZW50IGZyb20gdGhlaXIgY2hhcnQKLy8gbm93LiBDdW11bGF0aXZlIHNpbmNlIGluY2VwdGlvbjsgc2VlIHRoZSBwYWNrYWdlIGRvYy4KZnVuYyBDdXJyZW50SW5jb21lU3RhdGVtZW50KG93bmVyIGFkZHJlc3MpIChjdW11bGF0aXZlUmV2ZW51ZSwgY3VtdWxhdGl2ZUV4cGVuc2VzLCBjdW11bGF0aXZlTmV0IGludDY0KSB7CglzIDo9IGRlcml2ZUxpdmUob3duZXIpCglyZXR1cm4gcy5DdW11bGF0aXZlUmV2ZW51ZSwgcy5DdW11bGF0aXZlRXhwZW5zZXMsIHMuQ3VtdWxhdGl2ZU5ldAp9CgovLyBDdXJyZW50QWJub3JtYWxDb3VudCBydW5zIHRoZSBjZW5zdXMgb3ZlciB0aGUgb3duZXIncyBjaGFydCBub3cuIEl0cyByZWFjaAovLyBpcyBleGFjdGx5IFtBYm5vcm1hbENvdW50XSdzLgpmdW5jIEN1cnJlbnRBYm5vcm1hbENvdW50KG93bmVyIGFkZHJlc3MpIGludCB7CglyZXR1cm4gbGVuKGRlcml2ZUxpdmUob3duZXIpLkFibm9ybWFsKQp9CgovLyBDdXJyZW50Um93cyBpcyBob3cgbWFueSBhY2NvdW50cyB0aGUgb3duZXIncyBjaGFydCBob2xkcyByaWdodCBub3csIGFzIHRoaXMKLy8gcmVhbG0gcmVhZHMgaXQuIEl0IGFncmVlcyB3aXRoIGJvb2tzLkFjY291bnRzIGJ5IGNvbnN0cnVjdGlvbiDigJQgY2hhcnRPZgovLyByZWZ1c2VzIHdoZW4gdGhleSBkaXNhZ3JlZSDigJQgYW5kIGlzIGV4cG9zZWQgc28gYSByZWFkZXIgY29tcGFyaW5nIGEgZnJvemVuCi8vIHN0YXRlbWVudCdzIFJvd3MgYWdhaW5zdCB0aGUgbGl2ZSBjaGFydCBkb2VzIG5vdCBoYXZlIHRvIGNhbGwgdHdvIHJlYWxtcy4KZnVuYyBDdXJyZW50Um93cyhvd25lciBhZGRyZXNzKSBpbnQgeyByZXR1cm4gbGVuKGNoYXJ0T2Yob3duZXIpKSB9CgovLyBWZXJpZnkgcmUtZGVyaXZlcyB0aGUgb3duZXIncyBjaGFydCBub3cgYW5kIHJlcG9ydHMgd2hldGhlciBldmVyeSBmaWd1cmUgaW4KLy8gYSBmcm96ZW4gc3RhdGVtZW50IHN0aWxsIGhvbGRzLCBpbmNsdWRpbmcgdGhlIGNlbnN1cyByb3dzLgovLwovLyAjIFJlYWQgdGhlIGNlaWxpbmcgYmVmb3JlIHF1b3RpbmcgdGhpcwovLwovLyBBIHRydWUgcmVzdWx0IG1lYW5zIFRIRSBGUk9aRU4gRklHVVJFUyBTVElMTCBIT0xELiBJdCBkb2VzIE5PVCBtZWFuIHRoZQovLyBjaGFydCBpcyB1bnRvdWNoZWQsIGFuZCB0aGUgZ2FwIGlzIGRlbW9uc3RyYWJsZSByYXRoZXIgdGhhbiB0aGVvcmV0aWNhbDogYQovLyBwb3N0aW5nIHRoYXQgbW92ZXMgYW4gYW1vdW50IGJldHdlZW4gdHdvIGFzc2V0IGFjY291bnRzIGxlYXZlcyBBc3NldHMsCi8vIENsYWltcywgdGhlIG5ldCwgdGhlIHJvdyBjb3VudCBhbmQgdGhlIGNlbnN1cyBhbGwgaWRlbnRpY2FsLCBhbmQgdGhpcyBzdGlsbAovLyByZWFkcyB0cnVlLiBUaGUgc3VpdGUgcGlucyB0aGF0IGNhc2UuCi8vCi8vIEEgZmFsc2UgcmVzdWx0IGlzIGEgcmVhbCBkaWZmZXJlbmNlIGFuZCBub3RoaW5nIG1vcmU6IHRoZSBvd25lciBoYXMgcG9zdGVkCi8vIHNpbmNlLCB3aGljaCBpcyB0aGUgbm9ybWFsIGxpZmUgb2YgYSBib29rLiBJdCBpcyBub3QgZXZpZGVuY2Ugb2YKLy8gbWlzY29uZHVjdCwgYW5kIHRoaXMgcmVhbG0gb2ZmZXJzIG5vIG1lY2hhbmlzbSB0aGF0IHRyZWF0cyBpdCBhcyBzdWNoLgovLwovLyBXaGF0IHByb3ZlcyB0aGUgY2hhcnQncyBvd24gaGlzdG9yeSBpcyByL2Jvb2tzJyBhcHBlbmQtb25seSBqb3VybmFsLCB3aGVyZQovLyBhIHdyb25nIGVudHJ5IGlzIGNvcnJlY3RlZCBieSBhIHZpc2libGUgcmV2ZXJzYWwgcmF0aGVyIHRoYW4gYW4gZWRpdC4KZnVuYyBWZXJpZnkob3duZXIgYWRkcmVzcywgc2VxIGludDY0KSBib29sIHsKCXdhbnQgOj0gbXVzdFJlY29yZChvd25lciwgc2VxKS5zdAoJZ290IDo9IGRlcml2ZUxpdmUob3duZXIpCgoJaWYgd2FudC5Sb3dzICE9IGdvdC5Sb3dzIHx8CgkJd2FudC5Bc3NldHMgIT0gZ290LkFzc2V0cyB8fAoJCXdhbnQuTGlhYmlsaXRpZXMgIT0gZ290LkxpYWJpbGl0aWVzIHx8CgkJd2FudC5FcXVpdHkgIT0gZ290LkVxdWl0eSB8fAoJCXdhbnQuQ3VtdWxhdGl2ZVJldmVudWUgIT0gZ290LkN1bXVsYXRpdmVSZXZlbnVlIHx8CgkJd2FudC5DdW11bGF0aXZlRXhwZW5zZXMgIT0gZ290LkN1bXVsYXRpdmVFeHBlbnNlcyB8fAoJCXdhbnQuQ3VtdWxhdGl2ZU5ldCAhPSBnb3QuQ3VtdWxhdGl2ZU5ldCB8fAoJCXdhbnQuQ2xhaW1zICE9IGdvdC5DbGFpbXMgewoJCXJldHVybiBmYWxzZQoJfQoJaWYgbGVuKHdhbnQuQWJub3JtYWwpICE9IGxlbihnb3QuQWJub3JtYWwpIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWZvciBpLCBhIDo9IHJhbmdlIHdhbnQuQWJub3JtYWwgewoJCWIgOj0gZ290LkFibm9ybWFsW2ldCgkJaWYgYS5Db2RlICE9IGIuQ29kZSB8fCBhLktpbmQgIT0gYi5LaW5kIHx8IGEuQmFsYW5jZSAhPSBiLkJhbGFuY2UgewoJCQlyZXR1cm4gZmFsc2UKCQl9CgkJLy8gTmFtZSBpcyBkZWxpYmVyYXRlbHkgTk9UIGNvbXBhcmVkLiByL2Jvb2tzIGhhcyBubyByZW5hbWUgcGF0aCwgc28KCQkvLyBpdCBjYW5ub3QgY2hhbmdlOyBjb21wYXJpbmcgaXQgd291bGQgYXNzZXJ0IGEgcHJvcGVydHkgb2YgdGhhdAoJCS8vIHJlYWxtJ3MgQVBJIHN1cmZhY2UgZnJvbSBoZXJlLCB3aGVyZSBhIHJlYWRlciB3b3VsZCBtaXN0YWtlIGl0IGZvcgoJCS8vIGEgY2hlY2sgb24gdGhlIGNoYXJ0LgoJfQoJcmV0dXJuIHRydWUKfQoKLy8gSGVpZ2h0IGlzIHRoZSBjaGFpbiBoZWlnaHQgdGhpcyByZWFsbSBzdGFtcHMgcHVibGljYXRpb25zIHdpdGguIEV4cG9zZWQgc28gYQovLyBjYWxsZXIgY2FuIHByZWRpY3Qgd2hhdCBQdWJsaXNoIHdpbGwgcmVjb3JkLgpmdW5jIEhlaWdodCgpIGludDY0IHsgcmV0dXJuIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSB9CgovLyBMZWRnZXIgaXMgdGhlIHBhdGggb2YgdGhlIHJlYWxtIGV2ZXJ5IGZpZ3VyZSBoZXJlIGlzIGRlcml2ZWQgZnJvbS4gVGhlCi8vIGNvbnN0YW50IGlzIFtCb29rc1BhdGhdOyB0aGlzIGlzIHRoZSBhY2Nlc3NvciBmb3IgYSBjYWxsZXIgdGhhdCBjYW5ub3QgcmVhZAovLyBhIGNvbnN0YW50IG9mZiBhIHBhY2thZ2UuCmZ1bmMgTGVkZ2VyKCkgc3RyaW5nIHsgcmV0dXJuIEJvb2tzUGF0aCB9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gSW50ZXJuYWxzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gcHViS2V5IGlzIG93bmVyfHBhZGRlZFNlcS4gVGhlIHNlcXVlbmNlIGlzIGxlZnQtcGFkZGVkIHRvIDE5IGRpZ2l0cyDigJQgdGhlCi8vIHdpZHRoIG9mIE1heEludDY0IOKAlCBzbyB0aGF0IGxleGljb2dyYXBoaWMgb3JkZXIgb3ZlciBhbiBvd25lcidzIHByZWZpeCBpcwovLyBudW1lcmljIG9yZGVyIG92ZXIgdGhlaXIgc3RhdGVtZW50cy4gQW4gdW5wYWRkZWQgZGVjaW1hbCB3b3VsZCBzb3J0ICIxMCIKLy8gYmVmb3JlICI5Ii4gVGhlIGNvbnZlbnRpb24gaXMgci9pbnZvaWNlcycgaW52S2V5LCBhZG9wdGVkIHJhdGhlciB0aGFuCi8vIHJlLWRlcml2ZWQuCmZ1bmMgcHViS2V5KG93bmVyIHN0cmluZywgc2VxIGludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdEludChzZXEsIDEwKQoJZm9yIGxlbihzKSA8IDE5IHsKCQlzID0gIjAiICsgcwoJfQoJcmV0dXJuIG93bmVyICsgInwiICsgcwp9CgovLyBvd25lckNvdW50IHJlYWRzIGEgcHVibGlzaGVyJ3MgY291bnQsIHRyZWF0aW5nIGFuIGFic2VudCBrZXkgYXMgemVyby4KLy8KLy8gYXZsLlRyZWUuR2V0IHJldHVybnMgT05FIHZhbHVlIGFuZCBjYW5ub3QgZGlzdGluZ3Vpc2ggYW4gYWJzZW50IGtleSBmcm9tIGEKLy8gbmlsLXZhbHVlZCBvbmUsIHNvIHRoZSB0d28tdmFsdWUgdHlwZSBhc3NlcnRpb24gY2FycmllcyB0aGUgZXhpc3RlbmNlIGFuc3dlcgovLyBpbiBvbmUgdHJhdmVyc2FsLiBPbmx5IHRoaXMgZmlsZSBldmVyIFNldHMsIGFuZCBpdCBvbmx5IGV2ZXIgU2V0cyBhbiBpbnQuCmZ1bmMgb3duZXJDb3VudChvd25lciBzdHJpbmcpIGludCB7CgluLCBvayA6PSBjb3VudHMuR2V0KG93bmVyKS4oaW50KQoJaWYgIW9rIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIG4KfQoKZnVuYyBtdXN0UmVjb3JkKG93bmVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgKnJlY29yZCB7CglyLCBvayA6PSBwdWJsaXNoZWQuR2V0KHB1YktleShvd25lci5TdHJpbmcoKSwgc2VxKSkuKCpyZWNvcmQpCglpZiAhb2sgewoJCXBhbmljKCJzdGF0ZW1lbnRzOiBubyBzdGF0ZW1lbnQgIiArIHN0cmNvbnYuRm9ybWF0SW50KHNlcSwgMTApICsKCQkJIiBmb3IgIiArIG93bmVyLlN0cmluZygpKQoJfQoJcmV0dXJuIHIKfQoKLy8gcGFyc2VTZWN0aW9uIHR1cm5zIGEgc2VjdGlvbiB3b3JkIGludG8gYSBbc3RtdC5TZWN0aW9uXSBhbmQgcGFuaWNzIG9uCi8vIGFueXRoaW5nIGVsc2UuIFRoZSB0aHJlZSB3b3JkcyBhcmUgdGhhdCB0eXBlJ3Mgb3duIFN0cmluZyBvdXRwdXQsIHNvIHRoZQovLyByb3VuZCB0cmlwIGlzIGV4YWN0OyB0aGUgc3VpdGUgcGlucyBpdCByYXRoZXIgdGhhbiB0cnVzdGluZyB0aGlzIHRvIHN0YXkKLy8gdHJ1ZSBvZiBhbm90aGVyIHBhY2thZ2UncyBtZXRob2QuCmZ1bmMgcGFyc2VTZWN0aW9uKHNlY3Rpb24gc3RyaW5nKSBzdG10LlNlY3Rpb24gewoJc3dpdGNoIHN0cmluZ3MuVG9Mb3dlcihzdHJpbmdzLlRyaW1TcGFjZShzZWN0aW9uKSkgewoJY2FzZSAiYXNzZXRzIjoKCQlyZXR1cm4gc3RtdC5TZWN0aW9uQXNzZXRzCgljYXNlICJjbGFpbXMiOgoJCXJldHVybiBzdG10LlNlY3Rpb25DbGFpbXMKCWNhc2UgInBlcmZvcm1hbmNlIjoKCQlyZXR1cm4gc3RtdC5TZWN0aW9uUGVyZm9ybWFuY2UKCX0KCXBhbmljKCJzdGF0ZW1lbnRzOiB1bmtub3duIHNlY3Rpb24gIiArIHN0cmNvbnYuUXVvdGUoc2VjdGlvbikgKwoJCSI7IHdhbnQgYXNzZXRzLCBjbGFpbXMgb3IgcGVyZm9ybWFuY2UiKQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUmVuZGVyCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gUmVuZGVyIHNlcnZlcyB0aGUgaW5kZXggYXQgIiIsIGEgcHVibGlzaGVyJ3MgcGFnZSBhdCAiPGFkZHJlc3M+IiwgYW5kIG9uZQovLyBzdGF0ZW1lbnQgYXQgIjxhZGRyZXNzPi88c2VxPiIuCi8vCi8vIEV2ZXJ5IGNhbGxlci1zdXBwbGllZCBzdHJpbmcg4oCUIGFuIGFjY291bnQncyBjb2RlIGFuZCBuYW1lLCBib3RoIG9mIHRoZW0gYW4KLy8gb3duZXIncyBmcmVlIHRleHQgaW4gci9ib29rcyDigJQgZ29lcyB0aHJvdWdoIFtjZWxsXS4gRnJlZSB0ZXh0IHJlYWNoaW5nCi8vIFJlbmRlciB1bmVzY2FwZWQgaXMgdGhlIG9uZSBpbmplY3Rpb24tc2hhcGVkIHN1cmZhY2UgYSByZWFsbSB3aXRoIG5vIGN1c3RvZHkKLy8gc3RpbGwgaGFzLCBhbmQgaGVyZSB0aGUgYnl0ZXMgY29tZSBmcm9tIGEgVEhJUkQgcmVhbG0ncyBzdGF0ZSwgd2hpY2ggZG9lcwovLyBub3QgbWFrZSB0aGVtIHNhZmVyLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXAgOj0gc3RyaW5ncy5UcmltU3BhY2Uoc3RyaW5ncy5UcmltKHBhdGgsICIvIikpCglpZiBwID09ICIiIHsKCQlyZXR1cm4gcmVuZGVySW5kZXgoKQoJfQoJaWYgaSA6PSBzdHJpbmdzLkluZGV4KHAsICIvIik7IGkgPj0gMCB7CgkJb3duZXIgOj0gYWRkcmVzcyhzdHJpbmdzLlRyaW1TcGFjZShwWzppXSkpCgkJcmVzdCA6PSBzdHJpbmdzLlRyaW1TcGFjZShzdHJpbmdzLlRyaW0ocFtpKzE6XSwgIi8iKSkKCQlzZXEsIGVyciA6PSBzdHJjb252LlBhcnNlSW50KHJlc3QsIDEwLCA2NCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuICIjIHN0YXRlbWVudHNcblxuYCIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KHJlc3QpICsKCQkJCSJgIGlzIG5vdCBhIHN0YXRlbWVudCBudW1iZXIuXG4iCgkJfQoJCXJldHVybiByZW5kZXJTdGF0ZW1lbnQob3duZXIsIHNlcSkKCX0KCXJldHVybiByZW5kZXJQdWJsaXNoZXIoYWRkcmVzcyhwKSkKfQoKZnVuYyByZW5kZXJJbmRleCgpIHN0cmluZyB7Cgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglzYi5Xcml0ZVN0cmluZygiIyBzdGF0ZW1lbnRzIOKAlCBjbGFzc2lmaWVkIGZpbmFuY2lhbCBzdGF0ZW1lbnRzXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiQSBiYWxhbmNlIHNoZWV0LCBhIGN1bXVsYXRpdmUgaW5jb21lIHN0YXRlbWVudCBhbmQgYW4gIikKCXNiLldyaXRlU3RyaW5nKCJhYm5vcm1hbGl0eSBjZW5zdXMsICoqZGVyaXZlZCoqIGZyb20gYSBjaGFydCBvZiBhY2NvdW50cyAiKQoJc2IuV3JpdGVTdHJpbmcoImluIFtgIiArIEJvb2tzUGF0aCArICJgXSgiICsgQm9va3NQYXRoICsgIikg4oCUIG5ldmVyICIpCglzYi5Xcml0ZVN0cmluZygic3VwcGxpZWQgYnkgdGhlIHB1Ymxpc2hlci5cblxuIikKCglzYi5Xcml0ZVN0cmluZygiPiAqKkEgcHVibGlzaGVkIHN0YXRlbWVudCBpcyBhIGNsYWltIGFib3V0IGEgY2xhaW0uKiogIikKCXNiLldyaXRlU3RyaW5nKCJUaGUgbGVkZ2VyIGl0IHJlYWRzIGhvbGRzIG5vIGFzc2V0LCBzbyBub3RoaW5nIHRpZXMgYW4gIikKCXNiLldyaXRlU3RyaW5nKCJhY2NvdW50IHJlYWRpbmcgYENhc2ggNTAwMGAgdG8gNTAwMCByZWFsIHVnbm90IGFueXdoZXJlLiAiKQoJc2IuV3JpdGVTdHJpbmcoIkEgc3RhdGVtZW50IGRlcml2ZWQgZnJvbSBpdCBpbmhlcml0cyB0aGF0IGVudGlyZWx5IGFuZCAiKQoJc2IuV3JpdGVTdHJpbmcoInRoZW4gYWRkcyBhIGxheWVyIG9mIGFwcGFyZW50IGF1dGhvcml0eTogaXQgbG9va3MgbGlrZSBhbiAiKQoJc2IuV3JpdGVTdHJpbmcoImF1ZGl0ZWQgYXJ0aWZhY3QgYW5kIGlzIGEgc2VsZi1yZXBvcnQgb2YgYSBzZWxmLXJlcG9ydC4gIikKCXNiLldyaXRlU3RyaW5nKCJObyBhdWRpdCBpcyBwZXJmb3JtZWQgaGVyZSBhbmQgbm8gY3VzdG9keSBleGlzdHMuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIFN0YXRlXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiLSBzdGF0ZW1lbnRzIHB1Ymxpc2hlZDogKioiICsgc3RyY29udi5JdG9hKHB1YkNvdW50KSArICIqKlxuIikKCXNiLldyaXRlU3RyaW5nKCItIGxlZGdlcjogYCIgKyBCb29rc1BhdGggKyAiYFxuIikKCXNiLldyaXRlU3RyaW5nKCItIGNoYWluIGhlaWdodDogKioiICsgc3RyY29udi5Gb3JtYXRJbnQocnVudGltZS5DaGFpbkhlaWdodCgpLCAxMCkgKyAiKipcblxuIikKCXNiLldyaXRlU3RyaW5nKCJUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gd2F5IHRvIGVudW1lcmF0ZSBwdWJsaXNoZXJzIG9yICIpCglzYi5Xcml0ZVN0cmluZygidG8gYWdncmVnYXRlIGFjcm9zcyB0aGVtOiBzdWNoIGEgdG90YWwgd291bGQgc3VtIGV2ZXJ5ICIpCglzYi5Xcml0ZVN0cmluZygic3RyYW5nZXIncyBzZWxmLXJlcG9ydGVkIGFzc2VydGlvbi5cblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgV2hhdCBpcyBmcm96ZW4sIGFuZCB3aGF0IGlzIG5vdFxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoImBQdWJsaXNoYCBmcmVlemVzIHRoZSAqKmZpZ3VyZXMqKi4gSXQgZG9lcyBub3QgZnJlZXplIHRoZSAiKQoJc2IuV3JpdGVTdHJpbmcoImNoYXJ0IOKAlCBhY2NvdW50IGNvZGVzLCBuYW1lcyBhbmQgdGhlIHBvc3RpbmdzIGJlaGluZCB0aGVtICIpCglzYi5Xcml0ZVN0cmluZygic3RheSBpbiB0aGUgbGVkZ2VyLCB3aGljaCBrZWVwcyB3cml0aW5nIHRoZW0uIFNvICIpCglzYi5Xcml0ZVN0cmluZygiYFZlcmlmeWAgYW5zd2VycyAqXCJkbyB0aGUgZnJvemVuIGZpZ3VyZXMgc3RpbGwgaG9sZD9cIiogIikKCXNiLldyaXRlU3RyaW5nKCJhbmQgKipub3QqKiAqXCJpcyB0aGUgY2hhcnQgdW50b3VjaGVkP1wiKjogYSBwb3N0aW5nIHRoYXQgIikKCXNiLldyaXRlU3RyaW5nKCJtb3ZlcyBhbiBhbW91bnQgYmV0d2VlbiB0d28gYXNzZXQgYWNjb3VudHMgbGVhdmVzIGV2ZXJ5ICIpCglzYi5Xcml0ZVN0cmluZygiZmlndXJlIGlkZW50aWNhbCBhbmQgYFZlcmlmeWAgc3RpbGwgcmVhZHMgdHJ1ZS5cblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgVGhlIHRocmVlIHNlY3Rpb25zXG5cbiIpCglzYi5Xcml0ZVN0cmluZygifCBzZWN0aW9uIHwgYWNjb3VudCBraW5kcyB8IHByZXNlbnRlZCBhcyB8XG58LS0tfC0tLXwtLS18XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYGFzc2V0c2AgfCBhc3NldCB8IGJhbGFuY2Ugc2hlZXQsIGRlYml0IHNpZGUgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGBjbGFpbXNgIHwgbGlhYmlsaXR5LCBlcXVpdHkgfCBiYWxhbmNlIHNoZWV0LCBjcmVkaXQgc2lkZSB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYHBlcmZvcm1hbmNlYCB8IHJldmVudWUsIGV4cGVuc2UgfCBpbmNvbWUgc3RhdGVtZW50IHxcblxuIikKCXNiLldyaXRlU3RyaW5nKCJSZXZlbnVlIGFuZCBleHBlbnNlcyBhcmUgKipjdW11bGF0aXZlIHNpbmNlIHRoZSBib29rJ3MgIikKCXNiLldyaXRlU3RyaW5nKCJmaXJzdCBwb3N0aW5nKiosIG5vdCBwZXJpb2QgZmlndXJlczogbm90aGluZyBpbiB0aGlzICIpCglzYi5Xcml0ZVN0cmluZygic3RhY2sgY2xvc2VzIGEgbm9taW5hbCBhY2NvdW50IGludG8gZXF1aXR5LCBzbyB0aGUgbmV0ICIpCglzYi5Xcml0ZVN0cmluZygiYXBwZWFycyBvbiB0aGUgYmFsYW5jZSBzaGVldCBhcyBhbiBleHBsaWNpdCByZWNvbmNpbGluZyAiKQoJc2IuV3JpdGVTdHJpbmcoImxpbmUuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIFVzYWdlXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiYGBgXG5zZXEgOj0gUHVibGlzaCgpICAgICAgICAgICAgLy8gb3ZlciB0aGUgY2FsbGVyJ3Mgb3duIGJvb2tcbiIpCglzYi5Xcml0ZVN0cmluZygiQmFsYW5jZVNoZWV0KG93bmVyLCBzZXEpXG5JbmNvbWVTdGF0ZW1lbnQob3duZXIsIHNlcSlcbiIpCglzYi5Xcml0ZVN0cmluZygiQWJub3JtYWxDb3VudChvd25lciwgc2VxKSAgIC8vIGEgZmluZGluZyB0byByZWFkLCBub3QgYSB2ZXJkaWN0XG4iKQoJc2IuV3JpdGVTdHJpbmcoIlZlcmlmeShvd25lciwgc2VxKSAgICAgICAgICAvLyBkbyB0aGUgZmlndXJlcyBzdGlsbCBob2xkP1xuYGBgXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiQSBwdWJsaXNoZXIncyBzdGF0ZW1lbnRzIGFyZSBhdCBgIiArIFJlYWxtUGF0aCArCgkJIjo8YWRkcmVzcz5gLCBhbmQgb25lIHN0YXRlbWVudCBhdCBgIiArIFJlYWxtUGF0aCArCgkJIjo8YWRkcmVzcz4vPHNlcT5gLlxuIikKCXJldHVybiBzYi5TdHJpbmcoKQp9CgovLyBjZWxsIHByZXBhcmVzIGNhbGxlci1zdXBwbGllZCB0ZXh0IGZvciBhIEdGTSB0YWJsZSBjZWxsLCB0cnVuY2F0aW5nIGl0IGZvcgovLyBkaXNwbGF5IGZpcnN0LgovLwovLyBJdCBpcyByL2Jvb2tzJyBoZWxwZXIgb2YgdGhlIHNhbWUgbmFtZSwgYWRvcHRlZCB2ZXJiYXRpbSwgYmVjYXVzZSB0aGUgc2xvdCBpcwovLyBpZGVudGljYWwgYW5kIHRoZSB0ZXh0IGlzIGxpdGVyYWxseSB0aGUgc2FtZSBieXRlcyBvbmUgcmVhbG0gZnVydGhlciBvbi4KLy8gVGFibGVDZWxsIHJhdGhlciB0aGFuIElubGluZVRleHQ6IHRoZXNlIGJ5dGVzIGxhbmQgYmV0d2VlbiB0d28gYHxgCi8vIGRlbGltaXRlcnMgYW5kIElubGluZVRleHQgZG9lcyBub3QgZXNjYXBlIHRoZSBwaXBlIOKAlCBkZWxpYmVyYXRlbHksIHBlciB0aGUKLy8gc2FuaXRpemVyJ3Mgb3duIGRvYywgc28gdGhhdCBUYWJsZUNlbGwgY2FuIGVzY2FwZSBpdCB3aXRob3V0Ci8vIGRvdWJsZS1lc2NhcGluZy4gci9ib29rcyBzaGlwcGVkIElubGluZVRleHQgaW4gdGhpcyBzbG90IGZpcnN0IGFuZCBhbgovLyBhZHZlcnNhcmlhbCBhdWRpdCBmb3VuZCBpdC4KLy8KLy8gVGhlIGFjY291bnQgQ09ERSBuZWVkcyB0aGlzIGFzIG11Y2ggYXMgdGhlIG5hbWUgZG9lcy4gQSBHRk0gcm93IGlzIHNwbGl0Ci8vIGJlZm9yZSBpbmxpbmUgcGFyc2luZyBydW5zLCBzbyBhIGB8YCBpbnNpZGUgYSBiYWNrdGljayBzcGFuIGlzIG5vdCBwcm90ZWN0ZWQKLy8gYnkgdGhlIGJhY2t0aWNrcywgYW5kIHIvYm9va3MnIGtpbmRGcm9tQ29kZSBjb25zdHJhaW5zIG9ubHkgdGhlIGNvZGUncyBmaXJzdAovLyBjaGFyYWN0ZXIuCi8vCi8vIFRSVU5DQVRFIEJFRk9SRSBFU0NBUElORywgYW5kIG9uIGEgUlVORSBib3VuZGFyeS4gRXNjYXBpbmcgZmlyc3QgYW5kIGN1dHRpbmcKLy8gYWZ0ZXJ3YXJkcyBjYW4gc2xpY2UgYSBgXHxgIGluIGhhbGYgYW5kIGxlYXZlIGEgY2VsbCBlbmRpbmcgaW4gYSBiYXJlCi8vIGJhY2tzbGFzaDsgY3V0dGluZyBvbiBhIGJ5dGUgYm91bmRhcnkgY2FuIHNwbGl0IGEgbXVsdGktYnl0ZSBydW5lIGFuZCBlbWl0Ci8vIGludmFsaWQgVVRGLTguIEJ5IHRoZSB0aW1lIHRoZSBzYW5pdGl6ZXIgc2VlcyB0aGUgc3RyaW5nIHRoZSBkYW1hZ2UgaXMKLy8gdXBzdHJlYW0gb2YgaXQuCmZ1bmMgY2VsbChzIHN0cmluZykgc3RyaW5nIHsKCWNvbnN0IG1heFJ1bmVzID0gNDgKCWlmIHIgOj0gW11ydW5lKHMpOyBsZW4ocikgPiBtYXhSdW5lcyB7CgkJcyA9IHN0cmluZyhyWzptYXhSdW5lc10pICsgIuKApiIKCX0KCXJldHVybiBzYW5pdGl6ZS5UYWJsZUNlbGwocykKfQoKZnVuYyByZW5kZXJQdWJsaXNoZXIob3duZXIgYWRkcmVzcykgc3RyaW5nIHsKCW4gOj0gb3duZXJDb3VudChvd25lci5TdHJpbmcoKSkKCWlmIG4gPT0gMCB7CgkJcmV0dXJuICIjIHN0YXRlbWVudHNcblxuTm8gc3RhdGVtZW50IHB1Ymxpc2hlZCBieSBgIiArCgkJCXNhbml0aXplLklubGluZVRleHQob3duZXIuU3RyaW5nKCkpICsgImAuXG4iCgl9CgoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcoIiMgU3RhdGVtZW50cyBwdWJsaXNoZWQgYnkgIiArCgkJc2FuaXRpemUuSW5saW5lVGV4dChvd25lci5TdHJpbmcoKSkgKyAiXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiRGVyaXZlZCBmcm9tIHRoYXQgYWRkcmVzcydzIGJvb2sgaW4gW2AiICsgQm9va3NQYXRoICsKCQkiYF0oIiArIEJvb2tzUGF0aCArICI6IiArIG93bmVyLlN0cmluZygpICsgIikuICIpCglzYi5Xcml0ZVN0cmluZygiKipBIHN0YXRlbWVudCBpcyBhIGNsYWltIGFib3V0IGEgY2xhaW0qKiDigJQgc2VlIHRoZSAiKQoJc2IuV3JpdGVTdHJpbmcoIltpbmRleF0oIiArIFJlYWxtUGF0aCArICIpLlxuXG4iKQoKCXNob3duIDo9IG4KCWlmIHNob3duID4gUmVuZGVyUHVibGljYXRpb25MaW1pdCB7CgkJc2hvd24gPSBSZW5kZXJQdWJsaWNhdGlvbkxpbWl0Cgl9CglzYi5Xcml0ZVN0cmluZygifCBzZXEgfCBoZWlnaHQgfCByb3dzIHwgYXNzZXRzIHwgY2xhaW1zIHwgY3VtdWxhdGl2ZSBuZXQgfCBjZW5zdXMgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfFxuIikKCWZvciBzZXEgOj0gaW50NjQobik7IHNlcSA+IGludDY0KG4tc2hvd24pOyBzZXEtLSB7CgkJciwgb2sgOj0gcHVibGlzaGVkLkdldChwdWJLZXkob3duZXIuU3RyaW5nKCksIHNlcSkpLigqcmVjb3JkKQoJCWlmICFvayB7CgkJCS8vIFVucmVhY2hhYmxlOiBjb3VudHMgYW5kIHB1Ymxpc2hlZCBhcmUgd3JpdHRlbiB0b2dldGhlci4KCQkJY29udGludWUKCQl9CgkJc2IuV3JpdGVTdHJpbmcoInwgWyIgKyBzdHJjb252LkZvcm1hdEludChzZXEsIDEwKSArICJdKCIgKyBSZWFsbVBhdGggKwoJCQkiOiIgKyBvd25lci5TdHJpbmcoKSArICIvIiArIHN0cmNvbnYuRm9ybWF0SW50KHNlcSwgMTApICsgIikgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoci5hdCwgMTApICsgIiB8ICIgKwoJCQlzdHJjb252Lkl0b2Eoci5zdC5Sb3dzKSArICIgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoci5zdC5Bc3NldHMsIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoci5zdC5DbGFpbXMsIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoci5zdC5DdW11bGF0aXZlTmV0LCAxMCkgKyAiIHwgIiArCgkJCXN0cmNvbnYuSXRvYShsZW4oci5zdC5BYm5vcm1hbCkpICsgIiB8XG4iKQoJfQoJaWYgbiA+IHNob3duIHsKCQlzYi5Xcml0ZVN0cmluZygiXG5fU2hvd2luZyB0aGUgIiArIHN0cmNvbnYuSXRvYShzaG93bikgKwoJCQkiIG1vc3QgcmVjZW50IG9mICIgKyBzdHJjb252Lkl0b2EobikgKyAiIHN0YXRlbWVudHMuX1xuIikKCX0KCXJldHVybiBzYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlclN0YXRlbWVudChvd25lciBhZGRyZXNzLCBzZXEgaW50NjQpIHN0cmluZyB7CglyLCBvayA6PSBwdWJsaXNoZWQuR2V0KHB1YktleShvd25lci5TdHJpbmcoKSwgc2VxKSkuKCpyZWNvcmQpCglpZiAhb2sgewoJCXJldHVybiAiIyBzdGF0ZW1lbnRzXG5cbk5vIHN0YXRlbWVudCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoc2VxLCAxMCkgKyAiIGZvciBgIiArCgkJCXNhbml0aXplLklubGluZVRleHQob3duZXIuU3RyaW5nKCkpICsgImAuXG4iCgl9CglzIDo9IHIuc3QKCgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglzYi5Xcml0ZVN0cmluZygiIyBTdGF0ZW1lbnQgIiArIHN0cmNvbnYuRm9ybWF0SW50KHNlcSwgMTApICsgIiBvZiAiICsKCQlzYW5pdGl6ZS5JbmxpbmVUZXh0KG93bmVyLlN0cmluZygpKSArICJcblxuIikKCXNiLldyaXRlU3RyaW5nKCJGcm96ZW4gYXQgaGVpZ2h0ICoqIiArIHN0cmNvbnYuRm9ybWF0SW50KHIuYXQsIDEwKSArCgkJIioqIG92ZXIgKioiICsgc3RyY29udi5JdG9hKHMuUm93cykgKyAiKiogYWNjb3VudHMsIGRlcml2ZWQgZnJvbSBbYCIgKwoJCUJvb2tzUGF0aCArICJgXSgiICsgQm9va3NQYXRoICsgIjoiICsgb3duZXIuU3RyaW5nKCkgKyAiKS5cblxuIikKCglzYi5Xcml0ZVN0cmluZygiPiAqKlRoaXMgaXMgYSBjbGFpbSBhYm91dCBhIGNsYWltLioqIFRoZSBsZWRnZXIgaG9sZHMgbm8gIikKCXNiLldyaXRlU3RyaW5nKCJhc3NldCBhbmQgbm8gYXVkaXQgd2FzIHBlcmZvcm1lZC4gRXZlcnkgZmlndXJlIGJlbG93IGlzICIpCglzYi5Xcml0ZVN0cmluZygiZGVyaXZlZCBmYWl0aGZ1bGx5IGZyb20gd2hhdCB0aGlzIGFkZHJlc3Mgd3JvdGUgYWJvdXQgIikKCXNiLldyaXRlU3RyaW5nKCJpdHNlbGYuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIEJhbGFuY2Ugc2hlZXRcblxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IHwgfFxufC0tLXwtLS18XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYXNzZXRzIHwgIiArIHN0cmNvbnYuRm9ybWF0SW50KHMuQXNzZXRzLCAxMCkgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBsaWFiaWxpdGllcyB8ICIgKyBzdHJjb252LkZvcm1hdEludChzLkxpYWJpbGl0aWVzLCAxMCkgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBlcXVpdHkgfCAiICsgc3RyY29udi5Gb3JtYXRJbnQocy5FcXVpdHksIDEwKSArICIgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGN1bXVsYXRpdmUgbmV0IHwgIiArIHN0cmNvbnYuRm9ybWF0SW50KHMuQ3VtdWxhdGl2ZU5ldCwgMTApICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgKipjbGFpbXMqKiB8ICoqIiArIHN0cmNvbnYuRm9ybWF0SW50KHMuQ2xhaW1zLCAxMCkgKyAiKiogfFxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoImBjbGFpbXNgIGlzIGxpYWJpbGl0aWVzICsgZXF1aXR5ICsgY3VtdWxhdGl2ZSBuZXQuIFRoZSAiKQoJc2IuV3JpdGVTdHJpbmcoIm5ldCBpcyBhbiAqKmV4cGxpY2l0IHJlY29uY2lsaW5nIGxpbmUqKiwgYmVjYXVzZSBub3RoaW5nICIpCglzYi5Xcml0ZVN0cmluZygiaW4gdGhpcyBzdGFjayBjbG9zZXMgYSBub21pbmFsIGFjY291bnQgaW50byBlcXVpdHkg4oCUIGEgIikKCXNiLldyaXRlU3RyaW5nKCJyZWFkZXIgd2hvIGNoZWNrcyBhc3NldHMgYWdhaW5zdCBsaWFiaWxpdGllcyArIGVxdWl0eSAiKQoJc2IuV3JpdGVTdHJpbmcoImFsb25lIGFuZCBmaW5kcyBpdCBzaG9ydCBieSBleGFjdGx5IHRoZSBuZXQgaXMgbm90ICIpCglzYi5Xcml0ZVN0cmluZygibG9va2luZyBhdCBhIGJ1Zy5cblxuIikKCXNiLldyaXRlU3RyaW5nKCJUaGF0IGBhc3NldHNgIGFuZCBgY2xhaW1zYCBhZ3JlZSBpcyAqKm5vdCBvZmZlcmVkIGFzIGEgIikKCXNiLldyaXRlU3RyaW5nKCJjaGVjayoqOiBvdmVyIGFueSBjaGFydCB0aGUgbGVkZ2VyIGNhbiBwcm9kdWNlIHRoYXQgIikKCXNiLldyaXRlU3RyaW5nKCJlcXVhbGl0eSBpcyBhbGdlYnJhaWNhbGx5IGlkZW50aWNhbCB0byAqZGViaXRzIGVxdWFsICIpCglzYi5Xcml0ZVN0cmluZygiY3JlZGl0cyosIHdoaWNoIGl0IGVuZm9yY2VzIG9uIGV2ZXJ5IHBvc3QuIEl0IGlzIHRydWUgb2YgIikKCXNiLldyaXRlU3RyaW5nKCJhIGNoYXJ0IHdob3NlIGV2ZXJ5IGFjY291bnQgaXMgY2xhc3NpZmllZCBiYWNrd2FyZHMuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIEluY29tZSBzdGF0ZW1lbnQg4oCUIGN1bXVsYXRpdmUgc2luY2UgaW5jZXB0aW9uXG5cbiIpCglzYi5Xcml0ZVN0cmluZygifCB8IHxcbnwtLS18LS0tfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGN1bXVsYXRpdmUgcmV2ZW51ZSB8ICIgKyBzdHJjb252LkZvcm1hdEludChzLkN1bXVsYXRpdmVSZXZlbnVlLCAxMCkgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBjdW11bGF0aXZlIGV4cGVuc2VzIHwgIiArIHN0cmNvbnYuRm9ybWF0SW50KHMuQ3VtdWxhdGl2ZUV4cGVuc2VzLCAxMCkgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCAqKmN1bXVsYXRpdmUgbmV0KiogfCAqKiIgKyBzdHJjb252LkZvcm1hdEludChzLkN1bXVsYXRpdmVOZXQsIDEwKSArICIqKiB8XG5cbiIpCglzYi5Xcml0ZVN0cmluZygiKipOb3QgYSBwZXJpb2QgZmlndXJlLioqIFJldmVudWUgYW5kIGV4cGVuc2VzIGFjY3VtdWxhdGUgIikKCXNiLldyaXRlU3RyaW5nKCJmcm9tIHRoZSBib29rJ3MgZmlyc3QgcG9zdGluZyBmb3JldmVyOiB0aGUgbGVkZ2VyJ3MgY2xvc2UgIikKCXNiLldyaXRlU3RyaW5nKCJpcyBhIGJhY2tkYXRpbmcgc2VhbCBhbmQgc3dlZXBzIG5vIG5vbWluYWwgYWNjb3VudCBpbnRvICIpCglzYi5Xcml0ZVN0cmluZygiZXF1aXR5LlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBBYm5vcm1hbGl0eSBjZW5zdXNcblxuIikKCWlmIGxlbihzLkFibm9ybWFsKSA9PSAwIHsKCQlzYi5Xcml0ZVN0cmluZygiX05vIGFjY291bnQgY2FycmllZCBhIGJhbGFuY2UgYWdhaW5zdCBpdHMga2luZC5fXG5cbiIpCgl9IGVsc2UgewoJCXNiLldyaXRlU3RyaW5nKCIqKiIgKyBzdHJjb252Lkl0b2EobGVuKHMuQWJub3JtYWwpKSArICIqKiBhY2NvdW50KHMpICIpCgkJc2IuV3JpdGVTdHJpbmcoImNhcnJpZWQgYSBiYWxhbmNlIHJ1bm5pbmcgYWdhaW5zdCB0aGVpciBraW5kLlxuXG4iKQoJCXNiLldyaXRlU3RyaW5nKCJ8IGNvZGUgfCBuYW1lIHwga2luZCB8IHNlY3Rpb24gfCBiYWxhbmNlIHxcbiIpCgkJc2IuV3JpdGVTdHJpbmcoInwtLS18LS0tfC0tLXwtLS18LS0tfFxuIikKCQlmb3IgaSwgYSA6PSByYW5nZSBzLkFibm9ybWFsIHsKCQkJaWYgaSA+PSBSZW5kZXJBYm5vcm1hbExpbWl0IHsKCQkJCWJyZWFrCgkJCX0KCQkJc2VjTmFtZSA6PSAiaW52YWxpZCIKCQkJaWYgc2VjLCBlcnIgOj0gc3RtdC5TZWN0aW9uT2YoYS5LaW5kKTsgZXJyID09IG5pbCB7CgkJCQlzZWNOYW1lID0gc2VjLlN0cmluZygpCgkJCX0KCQkJc2IuV3JpdGVTdHJpbmcoInwgYCIgKyBjZWxsKGEuQ29kZSkgKyAiYCB8ICIgKyBjZWxsKGEuTmFtZSkgKwoJCQkJIiB8ICIgKyBhLktpbmQuU3RyaW5nKCkgKyAiIHwgIiArIHNlY05hbWUgKyAiIHwgIiArCgkJCQlzdHJjb252LkZvcm1hdEludChhLkJhbGFuY2UsIDEwKSArICIgfFxuIikKCQl9CgkJaWYgbGVuKHMuQWJub3JtYWwpID4gUmVuZGVyQWJub3JtYWxMaW1pdCB7CgkJCXNiLldyaXRlU3RyaW5nKCJcbl9TaG93aW5nICIgKyBzdHJjb252Lkl0b2EoUmVuZGVyQWJub3JtYWxMaW1pdCkgKwoJCQkJIiBvZiAiICsgc3RyY29udi5JdG9hKGxlbihzLkFibm9ybWFsKSkgKyAiIHJvd3MuX1xuIikKCQl9CgkJc2IuV3JpdGVTdHJpbmcoIlxuIikKCX0KCXNiLldyaXRlU3RyaW5nKCJBIGNlbnN1cyByb3cgaXMgKiphIGZpbmRpbmcgdG8gcmVhZCwgbmV2ZXIgYSB2ZXJkaWN0KiouICIpCglzYi5Xcml0ZVN0cmluZygiSXQgY2F0Y2hlcyBhIG1pc2NsYXNzaWZpY2F0aW9uIHRoYXQgY3Jvc3NlcyB0aGUgIikKCXNiLldyaXRlU3RyaW5nKCJkZWJpdC9jcmVkaXQtbm9ybWFsIGJvdW5kYXJ5OyBpdCAqKmNhbm5vdCoqIGNhdGNoIG9uZSAiKQoJc2IuV3JpdGVTdHJpbmcoInRoYXQgc3RheXMgb24gdGhlIHNhbWUgc2lkZSAobGlhYmlsaXR54oaUZXF1aXR54oaUcmV2ZW51ZSwgIikKCXNiLldyaXRlU3RyaW5nKCJhc3NldOKGlGV4cGVuc2UpLCBhbmQgYSBnZW51aW5lIGNvbnRyYSBhY2NvdW50IOKAlCAiKQoJc2IuV3JpdGVTdHJpbmcoImFjY3VtdWxhdGVkIGRlcHJlY2lhdGlvbiwgYSBzYWxlcyByZXR1cm4g4oCUIGlzICIpCglzYi5Xcml0ZVN0cmluZygibGVnaXRpbWF0ZWx5IGFibm9ybWFsLXNpZ25lZC4gQW4gZW1wdHkgY2Vuc3VzIGlzIG5vdCBhICIpCglzYi5Xcml0ZVN0cmluZygiY2xlYW4gYmlsbCBvZiBoZWFsdGguXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIERvZXMgaXQgc3RpbGwgaG9sZD9cblxuIikKCWlmICFib29rcy5IYXNCb29rKG93bmVyKSB7CgkJc2IuV3JpdGVTdHJpbmcoIl9UaGUgbGVkZ2VyIHJlcG9ydHMgbm8gYm9vayBmb3IgdGhpcyBhZGRyZXNzLl9cbiIpCgkJcmV0dXJuIHNiLlN0cmluZygpCgl9CglpZiBWZXJpZnkob3duZXIsIHNlcSkgewoJCXNiLldyaXRlU3RyaW5nKCIqKlZlcmlmeTogdHJ1ZSoqIOKAlCByZS1kZXJpdmluZyB0aGUgY2hhcnQgbm93ICIpCgkJc2IuV3JpdGVTdHJpbmcoInJlcHJvZHVjZXMgZXZlcnkgZmlndXJlIGFib3ZlLiBUaGlzIG1lYW5zIHRoZSAiKQoJCXNiLldyaXRlU3RyaW5nKCIqKmZpZ3VyZXMqKiBzdGlsbCBob2xkOyBpdCBkb2VzICoqbm90KiogbWVhbiB0aGUgIikKCQlzYi5Xcml0ZVN0cmluZygiY2hhcnQgaXMgdW50b3VjaGVkLiBBIHBvc3RpbmcgdGhhdCBtb3ZlcyBhbiBhbW91bnQgIikKCQlzYi5Xcml0ZVN0cmluZygiYmV0d2VlbiB0d28gYXNzZXQgYWNjb3VudHMgbGVhdmVzIGV2ZXJ5IGZpZ3VyZSBoZXJlICIpCgkJc2IuV3JpdGVTdHJpbmcoImlkZW50aWNhbC5cbiIpCgl9IGVsc2UgewoJCXNiLldyaXRlU3RyaW5nKCIqKlZlcmlmeTogZmFsc2UqKiDigJQgdGhlIGNoYXJ0IGhhcyBtb3ZlZCBzaW5jZSB0aGlzICIpCgkJc2IuV3JpdGVTdHJpbmcoInN0YXRlbWVudCB3YXMgZnJvemVuLiBUaGF0IGlzIHRoZSBub3JtYWwgbGlmZSBvZiBhICIpCgkJc2IuV3JpdGVTdHJpbmcoImJvb2sgYW5kIGlzIG5vdCBldmlkZW5jZSBvZiBhbnl0aGluZyBlbHNlLiBUaGUgIikKCQlzYi5Xcml0ZVN0cmluZygiY3VycmVudCBmaWd1cmVzIGFyZSBkZXJpdmFibGUgd2l0aCAiKQoJCXNiLldyaXRlU3RyaW5nKCJgQ3VycmVudEJhbGFuY2VTaGVldGAuXG4iKQoJfQoJcmV0dXJuIHNiLlN0cmluZygpCn0KIg0xMDAwMDAwMHVnbm90EhII5vWzXhILMTk3OTg0dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQN4GnwPGjTxlqhSkuI4QPOaLkwre2NJkzAsUepxCoV/lJByxhs0c9CiNiZHeSKrPDXxwAK680LrBSmNPldWjW3MaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}