{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "mnEjc8QEmSLydVQoBsTDxN//zdk4qVZSo9tCVfdByOA=",
    "height": "358572",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "115273104",
      "GasUsed": "76848736"
    },
    "tx": "CubIAwoML3ZtLm1fYWRkcGtnEtTIAwooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKXyAMKCWludmVudG9yeRI9Z25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2ludmVudG9yeRpkCgtnbm9tb2QudG9tbBJVbW9kdWxlID0gImduby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9pbnZlbnRvcnkiCmdubyA9ICIwLjkiChrjxgMKDWludmVudG9yeS5nbm8S0MYDLy8gUGFja2FnZSBpbnZlbnRvcnkgaXMgYSBwZXItb3duZXIgaW52ZW50b3J5IHN1Yi1sZWRnZXIgd2hvc2UgY29zdCBvZiBnb29kcwovLyBzb2xkIGlzIERFUklWRUQgZnJvbSB0aGUgbG90cyBvbiBoYW5kIHJhdGhlciB0aGFuIGFzc2VydGVkIGJ5IGEgY2FsbGVyLgovLwovLyAjIFdoYXQgdGhpcyByZWFsbSBpcyBmb3IKLy8KLy8gQSBnZW5lcmFsIGxlZGdlciB0YWtlcyBhIGRlYml0IGNvZGUsIGEgY3JlZGl0IGNvZGUgYW5kIGFuIGFtb3VudCBmcm9tCi8vIHdob2V2ZXIgaXMgcG9zdGluZy4gVGhhdCBpcyB0aGUgcmlnaHQgZGVzaWduIGZvciBhIGxlZGdlciwgYW5kIGl0IG1lYW5zCi8vIGduby5sYW5kL3IvLi4uL2Jvb2tzIHN0cnVjdHVyYWxseSBDQU5OT1Qga25vdyB0aGF0IGFuIGVudHJ5IHdhcyBhIHNoaXBtZW50LAovLyBvciB0aGF0IHRoZSBjb3N0IGNoYXJnZWQgZm9yIHRoYXQgc2hpcG1lbnQgaXMgdGhlIGNvc3QgdGhlIGdvb2RzIHdlcmUKLy8gYWN0dWFsbHkgYm91Z2h0IGF0LiBOb3RoaW5nIHN0b3BzIGEgc2hpcHBlciBmcm9tIGJvb2tpbmcgYSBmbGF0dGVyaW5nCi8vIG51bWJlciwgYW5kIG5vdGhpbmcgaW4gdGhlIGJvb2sgY2FuIHRlbGwgYWZ0ZXJ3YXJkcy4KLy8KLy8gVGhpcyByZWFsbSBjbG9zZXMgdGhhdCBnYXAgZm9yIG9uZSBjbGFzcyBvZiBlbnRyeS4gSXQgaG9sZHMgZWFjaCBpdGVtJ3MKLy8gY29zdCBsb3RzIGFzIHN0YXRlLCBhbmQgd2hlbiBnb29kcyBzaGlwIGl0IGNvbXB1dGVzIHRoZSBjaGFyZ2UgZnJvbSB0aG9zZQovLyBsb3RzIGJ5IHRoZSBpdGVtJ3MgZGVjbGFyZWQgY29zdGluZyBtZXRob2QuIFRoZSBhbW91bnQgaXMgbmV2ZXIgYQovLyBwYXJhbWV0ZXI6IFtTaGlwXSB0YWtlcyBhIFFVQU5USVRZIGFuZCByZXR1cm5zIHRoZSBjb3N0IGl0IGRlcml2ZWQuCi8vCi8vIFRoZSByZXN1bHRpbmcgY2xhaW1zIGFyZSBuYXJyb3cgYW5kIGNoZWNrYWJsZSBieSBhbnlvbmUsIHdoaWNoIGlzIHRoZSBwb2ludC4KLy8gUGVyIGl0ZW0sIGZyb20gcC9sb3RzJyBvd24gY3Jvc3MtZm9vdDoKLy8KLy8JcmVjZWl2ZWRDb3N0ID09IGNoYXJnZWRDb3N0ICsgY29zdE9uSGFuZAovLwovLyBhbmQsIGFjcm9zcyBhIHdob2xlIHJlZ2lzdGVyLCBhZ2FpbnN0IHRoZSBsZWRnZXIgdGhlIHJlYWxtIHBvc3RlZCB0bzoKLy8KLy8JYmFsYW5jZSgxMzAwKSA9PSBzdW0gb2YgY29zdE9uSGFuZCBvdmVyIGl0ZW1zCi8vCWJhbGFuY2UoNTAwMCkgPT0gc3VtIG9mIGNoYXJnZWRDb3N0IG92ZXIgaXRlbXMKLy8JYmFsYW5jZSgzOTAwKSA9PSBzdW0gb2YgcmVjZWl2ZWRDb3N0IG92ZXIgaXRlbXMKLy8KLy8gQWxsIGZvdXIgYXJlIGV4cG9ydGVkIOKAlCBbSXRlbUNyb3NzRm9vdF0sIFtDcm9zc0Zvb3RJbnZlbnRvcnldLAovLyBbQ3Jvc3NGb290Q09HU10sIFtDcm9zc0Zvb3RDb250cmlidXRlZF0g4oCUIGFuZCBhbGwgYXJlIEZSRUUgcmVhZHMsCi8vIGRlbGliZXJhdGVseTsgc2VlICJXaHkgdGhlIGludmFyaWFudHMgYXJlIGZyZWUgcmVhZHMiIGJlbG93LgovLwovLyBOb3RlIHdoYXQgdGhlIHRocmVlIGxlZGdlciBpZGVudGl0aWVzIGFyZSBOT1QuIEVhY2ggY29tcGFyZXMgYSB3YWxrIG9mIHRoZQovLyBsb3RzIGFnYWluc3QgYW4gYWNjb3VudCBiYWxhbmNlLCBhbmQgdGhlIHR3byBhcmUgbWFpbnRhaW5lZCBieSBkaWZmZXJlbnQKLy8gY29kZTogdGhlIHBvb2wgY291bnRzIGZvciBpdHNlbGYgaW5zaWRlIHAvbG90cywgd2hpbGUgdGhpcyByZWFsbSBwb3N0cyB0bwovLyB0aGUgYm9vay4gQSBkaXNhZ3JlZW1lbnQgaXMgdGhlcmVmb3JlIGEgcmVhbCBzaWduYWwgYW5kIG5vdCBhIHRhdXRvbG9neS4KLy8gVGhhdCBpcyB0aGUgc2FtZSByZWFzb24gcC9sb3RzIGtlZXBzIGNvdW50ZXJzIGJlc2lkZSBpdHMgbG90cy4KLy8KLy8gIyBUaGUgY2hhcnQgaXMgdGhyZWUgYWNjb3VudHMgYW5kIGlzIGZpeGVkCi8vCi8vCTEzMDAgIEludmVudG9yeSAgICAgICAgICAgICAgICAoYXNzZXQsICAgZGViaXQtbm9ybWFsKQovLwk1MDAwICBDb3N0IG9mIGdvb2RzIHNvbGQgICAgICAgKGV4cGVuc2UsIGRlYml0LW5vcm1hbCkKLy8JMzkwMCAgSW52ZW50b3J5IGNvbnRyaWJ1dGVkICAgIChlcXVpdHksICBjcmVkaXQtbm9ybWFsKQovLwovLyBBIHJlY2VpcHQgaXMgZGViaXQgMTMwMCAvIGNyZWRpdCAzOTAwLiBBIHNoaXBtZW50IGlzIGRlYml0IDUwMDAgLyBjcmVkaXQKLy8gMTMwMCBmb3IgdGhlIERFUklWRUQgY29zdC4gVGhlcmUgaXMgbm8gT3BlbkFjY291bnQgZW50cnlwb2ludCBhbmQgdGhlCi8vIHVuZGVybHlpbmcgYm9vayBpcyBjcmVhdGVkIHdpdGggYSBoYXJkIGNhcCBvZiB0aHJlZSBhY2NvdW50cywgc28gdGhlIGNoYXJ0Ci8vIGNhbm5vdCBncm93LiBUaGUgYWNjb3VudGluZyBlcXVhdGlvbiBvZmZzZXRzIGF0IDAgPSAwIG9uIGFuIGVtcHR5IHJlZ2lzdGVyCi8vIGFuZCBhZnRlciBldmVyeSBwb3N0aW5nLCBiZWNhdXNlIDEzMDAgKyA1MDAwID09IDM5MDAgaXMgdGhlIHJlZ2lzdGVyLXdpZGUKLy8gcmVzdGF0ZW1lbnQgb2YgZWFjaCBwb29sJ3Mgb3duIGNyb3NzLWZvb3QuCi8vCi8vICMgMzkwMCBJUyBBIFBMVUcsIEFORCBUSElTIFJFQUxNIElTIEZPUkNFRCBUTyBQSUNLIE9ORQovLwovLyBUaGlzIGlzIHRoZSBkZXNpZ24ncyBvbmUgdW5hdm9pZGFibGUgYXNzZXJ0aW9uIGFib3V0IHRoZSB3b3JsZCwgc28gaXQgaXMKLy8gc3RhdGVkIGhlcmUgcmF0aGVyIHRoYW4gYnVyaWVkLgovLwovLyBnbm8ubGFuZC9yLy4uLi9hc3NldHMgZmFjZWQgdGhlIHNhbWUgcXVlc3Rpb24gYWJvdXQgYW4gYXNzZXQncyBjb3N0IGJhc2lzCi8vIGFuZCBhbnN3ZXJlZCBieSBOT1QgQk9PS0lORyBJVDogdGhlIG9ubHkgaG9uZXN0IGNyZWRpdCBsZWdzIHdlcmUgYQovLyBsaWFiaWxpdHkgKCIyMDAwIEFjcXVpc2l0aW9uIHBheWFibGUiKSBvciBhbiBlcXVpdHkgcGx1ZyAoIjMwMDAgQ29udHJpYnV0ZWQKLy8gY2FwaXRhbCIpLCBib3RoIG9mIHdoaWNoIGFzc2VydCBob3cgdGhlIGFzc2V0IHdhcyBmdW5kZWQsIHdoaWNoIHRoYXQgcmVhbG0KLy8gZG9lcyBub3Qga25vdy4gSXQga2VwdCB0aGUgY29zdCBpbiByZWdpc3RlciBzdGF0ZSBhcyBkYXRhIGluc3RlYWQuCi8vCi8vIFRoYXQgYW5zd2VyIGlzIG5vdCBhdmFpbGFibGUgaGVyZSwgYW5kIHRoZSBkaWZmZXJlbmNlIGlzIHN0cnVjdHVyYWwgcmF0aGVyCi8vIHRoYW4gYSBtYXR0ZXIgb2YgdGFzdGUuIFRoZSBwcm9kdWN0IElTIGNvc3Qgb2YgZ29vZHMgc29sZC4gQSBzaGlwbWVudCBkZWJpdHMKLy8gNTAwMCBhbmQgY3JlZGl0cyAxMzAwLCBzbyAxMzAwIG11c3QgY2FycnkgYSBiYWxhbmNlLCBzbyB0aGUgcmVjZWlwdCBtdXN0Ci8vIHJlYWNoIHRoZSBib29rIOKAlCBhbmQgYSBkZWJpdCB0byAxMzAwIG5lZWRzIGEgY3JlZGl0IGxlZy4gVGhlIGNob2ljZSBpcwovLyB0aGVyZWZvcmUgbm90ICJib29rIGl0IG9yIG5vdCIgYnV0ICJ3aGljaCBwbHVnIiwgYW5kIGV2ZXJ5IGNhbmRpZGF0ZQovLyBhc3NlcnRzIHNvbWV0aGluZyB1bm9ic2VydmFibGU6Ci8vCi8vICAgLSAyMDAwIEFjY291bnRzIHBheWFibGUgYXNzZXJ0cyB0aGUgZ29vZHMgd2VyZSBib3VnaHQgb24gY3JlZGl0IGFuZCB0aGF0Ci8vICAgICBhIGxpYWJpbGl0eSBpcyBvdXRzdGFuZGluZy4gVGhpcyByZWFsbSBjYW5ub3Qgc2VlIGEgcGF5bWVudCwgc28gdGhlCi8vICAgICBsaWFiaWxpdHkgd291bGQgbmV2ZXIgYmUgcmVsaWV2ZWQgYW5kIHdvdWxkIGdyb3cgd2l0aG91dCBib3VuZC4KLy8gICAtIDEwMDAgQ2FzaCBhc3NlcnRzIHRoZSBnb29kcyB3ZXJlIHBhaWQgZm9yIGluIGNhc2ggZnJvbSBhIGJhbGFuY2UgdGhpcwovLyAgICAgcmVhbG0gZG9lcyBub3QgaG9sZCBhbmQgY2Fubm90IHZlcmlmeS4gSXQgaG9sZHMgbm8gY29pbnMgYXQgYWxsLgovLyAgIC0gMzkwMCBJbnZlbnRvcnkgY29udHJpYnV0ZWQgYXNzZXJ0cyB0aGUgZ29vZHMgd2VyZSBjb250cmlidXRlZCBieSB0aGUKLy8gICAgIG93bmVyLiBJdCBpcyB3cm9uZyBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSB0aGUgb3RoZXIgdHdvIGFyZSwgYW5kIGl0IGlzCi8vICAgICB0aGUgb25seSBvbmUgb2YgdGhlIHRocmVlIHRoYXQgaXMgU0VMRi1DT05TSVNURU5UIHdpdGhvdXQgYW4KLy8gICAgIHVub2JzZXJ2YWJsZSBzZWNvbmQgZXZlbnQ6IGEgY29udHJpYnV0aW9uIGlzIGNvbXBsZXRlIG9uIGFycml2YWwuCi8vCi8vIFNvIDM5MDAgd2FzIGNob3NlbiBiZWNhdXNlIGl0IG5lZWRzIG5vIGZvbGxvdy11cCB0cmFuc2FjdGlvbiB0byBzdGF5Ci8vIGNvaGVyZW50LCBub3QgYmVjYXVzZSBpdCBpcyB0cnVlLiBSZWFkIGl0IGFzICJnb29kcyBhcnJpdmVkIGZyb20gc29tZXdoZXJlCi8vIHRoaXMgbGVkZ2VyIGRvZXMgbm90IG1vZGVsIi4gQSByZWdpc3RlciB3aG9zZSBnb29kcyB3ZXJlIGluIGZhY3QgcHVyY2hhc2VkCi8vIG9uIGNyZWRpdCBpcyB1bmRlcnN0YXRpbmcgbGlhYmlsaXRpZXMgYW5kIG92ZXJzdGF0aW5nIGVxdWl0eSBieSBleGFjdGx5Ci8vIGJhbGFuY2UoMzkwMCksIGFuZCBubyBjb2RlIHBhdGggaGVyZSBjYW4gZGV0ZWN0IHRoYXQuIFBhaXJpbmcgdGhpcwovLyBzdWItbGVkZ2VyIHdpdGggYSByZWFsIHBheWFibGVzIGxlZGdlciBpcyBvdXQgb2Ygc2NvcGUgZm9yIHYxIGFuZCBpcyB0aGUKLy8gaG9uZXN0IGZpeC4KLy8KLy8gIyBDb3N0aW5nIG1ldGhvZCBpcyBwZXIgaXRlbSBhbmQgaXMgRklYRUQgYXQgY3JlYXRpb24KLy8KLy8gQW4gaXRlbSBpcyBhZGRlZCBieSBbQWRkRklGT10sIFtBZGRMSUZPXSBvciBbQWRkV0FWR10g4oCUIHRocmVlIGVudHJ5cG9pbnRzCi8vIHJhdGhlciB0aGFuIG9uZSB0YWtpbmcgYSBtZXRob2QgY29kZSwgZm9sbG93aW5nIHIvYXNzZXRzJyBQbGFjZSAvCi8vIFBsYWNlRGVjbGluaW5nIHByZWNlZGVudCwgc28gYSBjYWxsZXIgbmV2ZXIgaGFzIHRvIGtub3cgYW4gZW51bSdzIG51bWJlcmluZy4KLy8KLy8gcC9sb3RzIGZpeGVzIHRoZSBtZXRob2QgYXQgcG9vbCBjb25zdHJ1Y3Rpb24gYW5kIGRvY3VtZW50cyB3aHk6IGNoYW5naW5nIGl0Ci8vIG1pZC1saWZlIHdvdWxkIHJlY29zdCBub3RoaW5nIGFscmVhZHkgY2hhcmdlZCBidXQgd291bGQgY2hhbmdlIHdoYXQgdGhlIG5leHQKLy8gc2hpcG1lbnQgY29zdHMsIHdoaWNoIGlzIGEgcmVzdGF0ZW1lbnQgYSBzdWItbGVkZ2VyIG11c3Qgbm90IGJlIGFibGUgdG8gbWFrZQovLyBzaWxlbnRseS4gVGhpcyByZWFsbSBpbmhlcml0cyB0aGF0IGFuZCBhZGRzIG5vdGhpbmc6IHRoZXJlIGlzIG5vIGVudHJ5cG9pbnQKLy8gdGhhdCBjaGFuZ2VzIGFuIGl0ZW0ncyBtZXRob2QuIEFuIG93bmVyIHdobyBtdXN0IHN3aXRjaCBvcGVucyBhIG5ldyBTS1UgYW5kCi8vIGRpc2Nsb3NlcyBpdC4KLy8KLy8gVGhlIHRocmVlIG1ldGhvZHMgZGlmZmVyIG9ic2VydmFibHksIHdoaWNoIGlzIHRoZSBwb2ludCBvZiBoYXZpbmcgdGhlbToKLy8gRklGTyBhbmQgTElGTyBjaGFyZ2UgZGlmZmVyZW50IGFtb3VudHMgd2hlbmV2ZXIgdW5pdCBjb3N0cyBkaWZmZXIsIGFuZCBXQVZHCi8vIHJlLWFuY2hvcnMgZXZlcnkgcmVjZWlwdCBpbnRvIGEgc2luZ2xlIG1lcmdlZCBsb3Qgc28gaXQgaG9sZHMgZXhhY3RseSBvbmUKLy8gbG90IGFuZCBjYW4gbmV2ZXIgaGl0IHRoZSBwZXItaXRlbSBsb3QgY2FwLgovLwovLyBUaGF0IGV4ZW1wdGlvbiBpcyBub3QgYSBmcmVlIHdpbiwgYW5kIHRoZSB0cmFkZSBpcyB0aGUgb3RoZXIgd2F5IHJvdW5kIGZyb20KLy8gaG93IGl0IHJlYWRzLiBXQVZHIGVzY2FwZXMgdGhlIExPVCBjYXAgYW5kIGluIGV4Y2hhbmdlIGFjcXVpcmVzIGEgcmVmdXNhbAovLyBGSUZPIGFuZCBMSUZPIGRvIG5vdCBoYXZlOiBhIG1lcmdlZCBsb3QgbXVzdCBzYXRpc2Z5IHAvbG90cycgcGVyLWxvdAovLyBvdmVyZmxvdyBwcmVjb25kaXRpb24gYENvc3QgPD0gbWF4SW50NjQvUXR5YCwgYW5kIHR3byBsb3RzIHRoYXQgZWFjaCBzYXRpc2Z5Ci8vIGl0IHNlcGFyYXRlbHkgY2FuIG1lcmdlIGludG8gb25lIHRoYXQgZG9lcyBub3QuIFNvIHVuZGVyIFdBVkcgYSByZWNlaXB0IGNhbgovLyBiZSByZWZ1c2VkIGZvciB0aGUgcG9vbCdzIEFDQ1VNVUxBVEVEIEhJU1RPUlkgcmF0aGVyIHRoYW4gZm9yIGFueXRoaW5nIGFib3V0Ci8vIHRoZSByZWNlaXB0IOKAlCB0aGUgc2FtZSByZWNlaXB0IGEgRklGTyBpdGVtIHdvdWxkIGhhdmUgdGFrZW4uIEl0IGlzIGEgZmFyCi8vIGNvcm5lciBvZiB0aGUgYXJpdGhtZXRpYyBhbmQgbm90IGEgcHJhY3RpY2FsIGJvdW5kLCBidXQgaXQgaXMgdGhlIHJlYXNvbgovLyBbTG90Q2FwYWNpdHldIGlzIHRoZSB3cm9uZyB0aGluZyB0byB3YXRjaCBmb3IgYSBXQVZHIGl0ZW06IGl0cyBmaWd1cmUgaXMgYQovLyBib3VuZCBXQVZHIHdpbGwgbmV2ZXIgYXBwcm9hY2gsIHNvIGEgY2FsbGVyIHNpemluZyBoZWFkcm9vbSBmcm9tIGl0IGlzCi8vIHJlYWRpbmcgdGhlIG9uZSBsaW1pdCB0aGF0IGRvZXMgbm90IGFwcGx5LiBTZWUgcC9sb3RzJyBQb29sLlJlY2VpdmUuCi8vCi8vICMgQSBaRVJPLUNPU1QgUE9TVElORyBJUyBTS0lQUEVELCBBTkQgVEhBVCBJUyBOT1QgQSBTSE9SVENVVAovLwovLyBwL2pvdXJuYWwgcmVqZWN0cyBhIHBvc3Rpbmcgb2YgemVybyAoRXJySW52YWxpZEFtb3VudCkg4oCUIGNvcnJlY3RseTsgYSB6ZXJvCi8vIGVudHJ5IGlzIG5vdCBhbiBldmVudC4gQnV0IGJvdGggb2YgdGhpcyByZWFsbSdzIHBvc3RpbmdzIGNhbiBsZWdpdGltYXRlbHkgYmUKLy8gemVybzoKLy8KLy8gICAtIFtSZWNlaXZlXSB3aXRoIGNvc3QgMCBpcyBmcmVlIGdvb2RzLCB3aGljaCBwL2xvdHMgYWNjZXB0cyAoRXJyQmFkQ29zdCBpcwovLyAgICAgb25seSBmb3IgYSBORUdBVElWRSBjb3N0KS4KLy8gICAtIFtTaGlwXSBvdXQgb2YgbG90cyB0aGF0IGNvc3Qgbm90aGluZyBkZXJpdmVzIGEgY2hhcmdlIG9mIDAuCi8vCi8vIEluIGJvdGggY2FzZXMgdGhlIHBvb2wgaXMgdXBkYXRlZCBhbmQgTk9USElORyBpcyBwb3N0ZWQuIFRoZSBpZGVudGl0aWVzCi8vIGFib3ZlIGFyZSBwcmVzZXJ2ZWQgZXhhY3RseSwgYmVjYXVzZSBhIHplcm8gY29udHJpYnV0aW9uIHRvIHRoZSBsZWRnZXIgc2lkZQovLyBpcyBtYXRjaGVkIGJ5IGEgemVybyBjb250cmlidXRpb24gdG8gdGhlIHdhbGsgc2lkZS4gVGhlIHNhbWUgY2hvaWNlIHIvYXNzZXRzCi8vIG1ha2VzIGZvciBhIGRlZ2VuZXJhdGUgZGVjbGluaW5nIHNjaGVkdWxlLCBmb3IgdGhlIHNhbWUgcmVhc29uLgovLwovLyAjIFdoYXQgdGhpcyByZWFsbSBkb2VzIE5PVCBkbwovLwovLyAgIC0gTm8gY3VzdG9keS4gSXQgaG9sZHMgbm8gY29pbnMsIGhhcyBubyB3aXRoZHJhd2FsIHBhdGgsIGFuZCByZWZ1c2VzIGEKLy8gICAgIHVzZXIgY2FsbCB0aGF0IGFycml2ZXMgY2FycnlpbmcgYW55LiBBIGNvc3QgaXMgYSBudW1iZXIgYW4gb3duZXIgdHlwZWQuCi8vICAgLSBObyB3cml0ZS1vZmYsIHNocmlua2FnZSBvciByZXZhbHVhdGlvbi4gU2hyaW5rYWdlIGlzIGEgcmVhbCBpbnZlbnRvcnkKLy8gICAgIGV2ZW50IGFuZCBpdHMgYWJzZW5jZSBpcyBhIHJlYWwgbGltaXRhdGlvbjogdGhlcmUgaXMgY3VycmVudGx5IG5vIHdheSB0bwovLyAgICAgcmVtb3ZlIGdvb2RzIHdpdGhvdXQgY2hhcmdpbmcgdGhlbSB0byA1MDAwLCBzbyBhIGxvc3MgaXMgaW5kaXN0aW5ndWlzaC0KLy8gICAgIGFibGUgZnJvbSBhIHNhbGUuIFRoZSBwb3N0aW5nIGl0IG5lZWRzIGlzIGEgZGViaXQgdG8gYSA1LXNlcmllcyBsb3NzCi8vICAgICBhY2NvdW50IGFnYWluc3QgYSBjcmVkaXQgdG8gMTMwMCwgd2hpY2ggbWVhbnMgYSBmb3VydGggYWNjb3VudCBhbmQgYQovLyAgICAgZm91cnRoIGVudHJ5cG9pbnQuIERlbGliZXJhdGVseSBkZWZlcnJlZCB0byBrZWVwIHRoZSBjaGFydCBmaXhlZCBhdAovLyAgICAgdGhyZWUgZm9yIHYxLCBhbmQgbmFtZWQgaGVyZSByYXRoZXIgdGhhbiBkaXNjb3ZlcmVkIGxhdGVyLgovLyAgIC0gTm8gcmV2ZW51ZS4gQSBzaGlwbWVudCBib29rcyBpdHMgQ09TVCwgbmV2ZXIgYSBzYWxlIHByaWNlLiBSZXZlbnVlCi8vICAgICBiZWxvbmdzIHRvIGEgcmVjZWl2YWJsZXMgbGVkZ2VyIChyL2ludm9pY2VzKSBhbmQgdHlpbmcgdGhlIHR3byB0b2dldGhlcgovLyAgICAgd291bGQgcmVxdWlyZSB0aGlzIHJlYWxtIHRvIGxlYXJuIHdoYXQgd2FzIHNvbGQgZm9yIGhvdyBtdWNoLgovLyAgIC0gTm8gcGVyaW9kIGNsb3NlLiBwL2pvdXJuYWwgY2FuIHNlYWwgYSBib29rIHVwIHRvIGEgSEVJR0hUOyBzZWFsaW5nIGEKLy8gICAgIGRlcml2ZWQgYm9vayBjb3VsZCBvbmx5IG1ha2UgdGhlIG5leHQgZGVyaXZhdGlvbiB1bnBvc3RhYmxlLiBUaGUKLy8gICAgIGNhcGFiaWxpdHkgZXhpc3RzIGluIHRoZSBlbmdpbmUgYW5kIGlzIGRlbGliZXJhdGVseSBub3QgZXhwb3NlZC4KLy8gICAtIE5vIGJ1bGsgcmVjZWl2ZSBvciBzaGlwLiBPbmUgaXRlbSBwZXIgY2FsbCDigJQgc2VlIHRoZSBib3VuZCBiZWxvdy4KLy8gICAtIE5vIHRydXRoLiBBIHN1Yi1sZWRnZXIgaXMgYSBzZXQgb2YgY2xhaW1zIGJ5IGl0cyBvd25lci4gV2l0aCBubyBjdXN0b2R5Ci8vICAgICB0aGVyZSBpcyBub3RoaW5nIHR5aW5nICJyZWNlaXZlZCAxMDAgdW5pdHMgYXQgY29zdCA1MDAwIiB0byBhIHJlYWwKLy8gICAgIGhvbGRpbmcuIFRoZSBpbnZhcmlhbnRzIGhlcmUgcHJvdmUgdGhhdCB0aGUgcG9zdGluZ3MgZm9sbG93IGZyb20gdGhlCi8vICAgICBzdG9yZWQgbG90czsgdGhleSBwcm92ZSBub3RoaW5nIGFib3V0IHRoZSB3b3JsZC4KLy8KLy8gIyBXaHkgdGhlIGludmFyaWFudHMgYXJlIGZyZWUgcmVhZHMsIGFuZCB3aGF0IHRoZSBib3VuZCBjb3N0cwovLwovLyByL2Jvb2tzIGV4cG9zZXMgUmVkZXJpdmUgYXMgYW4gb3duZXItb25seSBjcm9zc2luZyBmdW5jdGlvbiwgdG8gY29udGFpbiB0aGUKLy8gY29zdCBvZiBhIGZ1bGwgcmUtd2Fsay4gVGhpcyByZWFsbSBkaXZlcmdlcywgZGVsaWJlcmF0ZWx5IGFuZCBmb3IgdGhlIHNhbWUKLy8gcmVhc29uIHIvYXNzZXRzIGRvZXM6IHRoZSBkZXJpdmF0aW9uIElTIHRoZSBwcm9kdWN0LCBhbmQgYSBjbGFpbSBvbmx5IGl0cwovLyBvd25lciBjYW4gY2hlY2sgaXMgbm90IGEgY2xhaW0gd29ydGggbWFraW5nLiBbUmVkZXJpdmVdLCBbSXRlbUNyb3NzRm9vdF0sCi8vIHRoZSB0aHJlZSByZWdpc3RlciBjcm9zcy1mb290cyBhbmQgW1JlbmRlcl0gYXJlIGFsbCBmcmVlIHJlYWRzLCBzbyBhbnkgdGhpcmQKLy8gcGFydHkgY2FuIHZlcmlmeSBhIHJlZ2lzdGVyIGZyb20gdm0vcWV2YWwgd2l0aCBubyBrZXkuCi8vCi8vIE1heExvdHNQZXJJdGVtIGlzIDY0IGFnYWluc3QgcC9sb3RzJyBvd24gTWF4TG90c0xpbWl0IG9mIDEwMjQsIGFuZCB0aGUgZ2FwCi8vIGlzIG5vdCB0aW1pZGl0eS4gcC9sb3RzJyBhdWRpdCBsZWZ0IHRoZSBjb3N0IG9mIGl0cyBPKGxpdmUgbG90cykgd2Fsa3MKLy8gZXhwbGljaXRseSBVTlBSSUNFRCBhbmQgcmVjb3JkZWQgdGhhdCBhIHJlYWxtIHJlbmRlcmluZyBtYW55IHBvb2xzIG11c3QKLy8gbWVhc3VyZSBpdHMgb3duIGdhcy4gVGhpcyByZWFsbSBpcyB0aGF0IHJlYWxtLCBzbyB0aGUgZmlndXJlcyBhcmUgbWVhc3VyZWQKLy8gcmF0aGVyIHRoYW4gcmVhc29uZWQgYWJvdXQsIHVuZGVyIHRoZSBwaW5uZWQgb255eCB0b29sY2hhaW4uCi8vCi8vIFRoZXJlIGFyZSBUV08gY29zdCBheGVzLCBub3Qgb25lLCBhbmQgdGhpcyBwYXJhZ3JhcGggdXNlZCB0byBuYW1lIG9ubHkgdGhlCi8vIGZpcnN0OiBNYXhJdGVtc1BlclJlZ2lzdGVyKk1heExvdHNQZXJJdGVtIGxpdmUgbG90cywgYW5kIHNlcGFyYXRlbHkKLy8gTWF4RW50cmllc1BlclJlZ2lzdGVyIHBvc3RpbmdzLiBJdCBjYWxsZWQgNjQgaXRlbXMgb2YgNjQgbGl2ZSBsb3RzICJ0aGUgd29yc3QKLy8gY2FzZSB0aGlzIHJlYWxtIGNhbiBob2xkIiwgd2hpY2ggaXMgZmFsc2Ug4oCUIGEgcmVnaXN0ZXIgY2FuIHNpdCBhdCB0aGUgbG90IGNhcAovLyBhbmQgdGhlIGVudHJ5IGNhcCBBVCBPTkNFLiBJdCB3YXMgYWxzbyBjbGFpbWVkIGluIHJldmlldyB0aGF0IHRoZSB0d28gYXJlCi8vIG11dHVhbGx5IGV4Y2x1c2l2ZSBieSBjb25zdHJ1Y3Rpb247IHRoYXQgaXMgd3JvbmcgdG9vLiBBIG9uZS11bml0IEZJRk8KLy8gc2hpcG1lbnQgZHJhd3MgZnJvbSB0aGUgb2xkZXN0IGxvdCwgd2hpY2ggaG9sZHMgMTAwIHVuaXRzLCBzbyA2NCBvZiB0aGVtCi8vIG5ldmVyIGV4aGF1c3QgaXQ6IDY0IGl0ZW1zIHggNjQgcmVjZWlwdHMgdGhlbiA2NCBpdGVtcyB4IDY0IG9uZS11bml0Ci8vIHNoaXBtZW50cyBsZWF2ZXMgNDA5NiBsaXZlIGxvdHMgYW5kIGV4YWN0bHkgODE5MiBlbnRyaWVzLiBUaGUgZmlndXJlcyBiZWxvdwovLyB3ZXJlIHRha2VuIG9uIGEgcmVnaXN0ZXIgYXNzZXJ0ZWQgaW4tZml4dHVyZSB0byBzaXQgYXQgYWxsIHRocmVlIGNhcHMKLy8gc2ltdWx0YW5lb3VzbHksIHNvIHRoZSBjb21iaW5lZCBzaGFwZSBpcyBtZWFzdXJlZCBhbmQgbm90IGFyZ3VlZCBhYm91dC4KLy8KLy8gRnJlZSByZWFkcywgbmV0IG9mIGEgdHJpdmlhbC1yZWFkIGJhc2VsaW5lIG9uIHRoZSBzYW1lIHJlZ2lzdGVyOgovLwovLwlSZWRlcml2ZSAgICAgICAgICAgICAgICAgNTA2LDQ4Niw1MjMKLy8JUmVuZGVyLCByZWdpc3RlciBwYWdlICAgIDE4NiwxNzksNDc0Ci8vCUNyb3NzRm9vdCAgICAgICAgICAgICAgICAgOTYsMjEzLDc0MQovLwlSZW5kZXIsIGl0ZW0gcGFnZSAgICAgICAgICA2LDQ2Nyw2MjEKLy8JUmVuZGVyLCBpbmRleCAgICAgICAgICAgICAgICAxOTIsNzE2Ci8vCi8vIFRoZSBkZWFyZXN0IGlzIDE2LjklIG9mIHRoZSAzLDAwMCwwMDAsMDAwIG1heEdhc1F1ZXJ5LiBUaGUgdHdvIGF4ZXMgZG8gbm90Ci8vIGNvbXBvc2UgaW4gYW55IHNpbmdsZSByZWFkJ3MgcHJpY2UsIGJlY2F1c2Ugbm8gc2luZ2xlIHJlYWQgd2Fsa3MgYm90aDoKLy8gUmVkZXJpdmUgd2Fsa3MgcG9zdGluZ3MgYW5kIHJlYWRzIG5vIGxvdCwgd2hpbGUgQ3Jvc3NGb290IGFuZCBSZW5kZXIgd2FsawovLyBsb3RzIGFuZCByZWFkIHRocmVlIGFjY291bnRzIHBsdXMgRW50cnlDb3VudC4gTWVhc3VyZWQgcmF0aGVyIHRoYW4gaW5mZXJyZWQg4oCUCi8vIFJlZGVyaXZlIGF0IHRoZSBsb3QgY2FwIGFncmVlcyB3aXRoIHRoZSBzYW1lIHJlYWQgb24gYSBsb3QtY2hlYXAgcmVnaXN0ZXIKLy8gKDUwNiw0OTUsMzQ1KSB0byAwLjAwMiUsIHdoaWNoIGlzIHdoYXQgcHJvdmVzIHRoZSBsb3QgYXhpcyBkb2VzIG5vdCBwcmljZSBpdC4KLy8gU28gdGhlIGNlaWxpbmcgaXMgdGhlIE1BWCBvZiB0aGUgdHdvIGF4ZXMgYW5kIG5ldmVyIHRoZWlyIHByb2R1Y3QuCi8vCi8vIEEgYm91bmQgaXMgbm90IGEgcHJpY2UsIGFuZCBvbmUgaXRlbSBwZXIgY2FsbCBpcyB3aGF0IGtlZXBzIHRoZSB3cml0ZSBzaWRlCi8vIGNoZWFwOiBbUmVjZWl2ZV0gYW5kIFtTaGlwXSBlYWNoIHRvdWNoIGV4YWN0bHkgb25lIHBvb2wuIE1lYXN1cmVkIG9uIHRoZSBzYW1lCi8vIHRvb2xjaGFpbiwgbmV0IG9mIHRoZSBzYW1lIGtpbmQgb2YgYmFzZWxpbmU6Ci8vCi8vCVJlY2VpdmUgY3JlYXRpbmcgdGhlIDY0dGggbG90ICAgICAgICA5MzAsNjc2Ci8vCVNoaXAgb2YgYWxsIE9uSGFuZCwgZHJvcHBpbmcgYWxsIDY0IGxvdHMgIDExLDgzNyw1OTMKLy8JUmVjZWl2ZSByZWZ1c2VkIGF0IHRoZSBsb3QgY2FwICAgICAgIDMwNCw0NTQKLy8KLy8gVGhlIGRlYXJlc3Qgd3JpdGUgaXMgMi4zJSBvZiB0aGUgZGVhcmVzdCByZWFkLCBzbyB0aGUgcmVhZCBzaWRlIGlzIHdoYXQgdGhlCi8vIGNhcHMgZXhpc3QgZm9yLiBTZWUgREVQTE9ZX1JFQURJTkVTUy5tZCBmb3IgdGhlIHRyYW5zY3JpcHQsIHRoZSBwZXItaGVhZGVyCi8vIEdBUyBwYWlyaW5nIHJ1bGUsIGFuZCB0aGUgdHdvIGxpbWl0cyBvZiB0aGVzZSBmaWd1cmVzOiB0aGV5IGNhbWUgZnJvbQovLyB0aHJvd2F3YXkgdGVzdCBmaWxlcyB0aGF0IHdlcmUgZGVsZXRlZCByYXRoZXIgdGhhbiBjb21taXR0ZWQsIHNvIHRoZXkgYXJlCi8vIHJlcHJvZHVjaWJsZSBidXQgTk9UIGd1YXJkZWQgYnkgdGhlIHN1aXRlOyBhbmQgZ25vIHRlc3QncyBHQVMgbGluZSBjb3ZlcnMgYQovLyB3aG9sZSB0ZXN0IGZ1bmN0aW9uLCBzbyBhIGZpZ3VyZSBpcyBvbmx5IGEgY2FsbCdzIG93biBwcmljZSB3aGVuIHRoZSBmaXh0dXJlCi8vIHRoYXQgZW5hYmxlcyBpdCBsaXZlcyBpbiBhIHNlcGFyYXRlIHRlc3QuIEJvdGggaGFsdmVzIGJpdDogdGhlIHJlZnVzZWQKLy8gcmVjZWlwdCBmaXJzdCBtZWFzdXJlZCBhdCA1MywxMjMsMDE5IOKAlCAxNzR4IGl0cyByZWFsIHByaWNlIOKAlCBiZWNhdXNlIGl0cwovLyA2NC1sb3QgZml4dHVyZSBzaGFyZWQgaXRzIEdBUyBsaW5lLgovLwovLyAjIERlcGxveSBvcmRlcgovLwovLyBUaGlzIHJlYWxtIGltcG9ydHMgcC9qb3VybmFsIGFuZCBwL2xvdHMsIHNvIG9uIGFueSBjaGFpbiB0aGUgb3JkZXIgaXMKLy8gcC9qb3VybmFsLCBwL2xvdHMsIHRoZW4gdGhpcyByZWFsbS4gVGhlIG9yZGVyIGlzIHN0YXRlZCBhbmQgdGhlIGRlcGxveW1lbnQKLy8gU1RBVEUgb2YgZWl0aGVyIGltcG9ydCBkZWxpYmVyYXRlbHkgaXMgbm90OiBhIHNlbnRlbmNlIGFib3V0IHdoYXQgaXMKLy8gZGVwbG95ZWQgaXMgdHJ1ZSBhdCBzaWduaW5nIHRpbWUgYXQgYmVzdCwgYW5kIGFkZHBrZyBmcmVlemVzIGl0IOKAlCByL2Fzc2V0cwovLyBjYXJyaWVzIGV4YWN0bHkgdGhhdCBmb3NzaWwuIFRoZSBpbXBvcnQgcmVsYXRpb24gaXMgdGhlIGR1cmFibGUgZmFjdC4KcGFja2FnZSBpbnZlbnRvcnkKCmltcG9ydCAoCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9qb3VybmFsIgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9sb3RzIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCikKCi8vIFJlYWxtUGF0aCBpcyB0aGlzIHJlYWxtJ3Mgb3duIHBhdGgsIHVzZWQgdG8gYnVpbGQgUmVuZGVyIGxpbmtzLgpjb25zdCBSZWFsbVBhdGggPSAiL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9pbnZlbnRvcnkiCgovLyBUaGUgZml4ZWQgY2hhcnQuIFRoZSBjb2RlcyBmb2xsb3cgci9ib29rcycgY29udmVudGlvbiwgd2hlcmUgYW4gYWNjb3VudCdzCi8vIExFQURJTkcgRElHSVQgZml4ZXMgaXRzIGtpbmQ6IDEgYXNzZXQsIDIgbGlhYmlsaXR5LCAzIGVxdWl0eSwgNCByZXZlbnVlLAovLyA1IGV4cGVuc2UuIEEgc2l4LXNlcmllcyBjb2RlIHdvdWxkIGJlIGFuIGludmFsaWQgYWNjb3VudCB1bmRlciB0aGF0Ci8vIGNvbnZlbnRpb24sIHdoaWNoIGlzIHdoeSBjb3N0IG9mIGdvb2RzIHNvbGQgaXMgNTAwMCBhbmQgbm90IHRoZSA2MDAwIHNvbWUKLy8gY2hhcnRzIHVzZS4KY29uc3QgKAoJSW52ZW50b3J5Q29kZSA9ICIxMzAwIgoJSW52ZW50b3J5TmFtZSA9ICJJbnZlbnRvcnkiCgoJQ09HU0NvZGUgPSAiNTAwMCIKCUNPR1NOYW1lID0gIkNvc3Qgb2YgZ29vZHMgc29sZCIKCglDb250cmliQ29kZSA9ICIzOTAwIgoJQ29udHJpYk5hbWUgPSAiSW52ZW50b3J5IGNvbnRyaWJ1dGVkIgopCgovLyBNYXhJdGVtc1BlclJlZ2lzdGVyIGNhcHMgb25lIG93bmVyJ3MgU0tVIGNvdW50LiBFdmVyeSByZWdpc3Rlci13aWRlCi8vIGNyb3NzLWZvb3Qgd2Fsa3MgZXZlcnkgaXRlbSdzIGxvdHMsIGFuZCB0aGlzIGJvdW5kIGlzIGhhbGYgb2Ygd2hhdCBrZWVwcwovLyB0aG9zZSByZWFkcyBhZmZvcmRhYmxlIGZvciBldmVyeW9uZS4KY29uc3QgTWF4SXRlbXNQZXJSZWdpc3RlciA9IDY0CgovLyBNYXhMb3RzUGVySXRlbSBjYXBzIG9uZSBpdGVtJ3MgTElWRSBsb3RzLCB3ZWxsIGJlbG93IHAvbG90cycgTWF4TG90c0xpbWl0IG9mCi8vIDEwMjQuIEl0IGlzIHRoZSBvdGhlciBoYWxmIG9mIHRoZSByZWFkIGJvdW5kOiB0aGUgd29yc3QgY2FzZSBhIHJlZ2lzdGVyLXdpZGUKLy8gd2FsayBtdXN0IHZpc2l0IGlzIE1heEl0ZW1zUGVyUmVnaXN0ZXIqTWF4TG90c1Blckl0ZW0gbG90cy4KLy8KLy8gRXhoYXVzdGVkIGxvdHMgYXJlIGRyb3BwZWQgYnkgcC9sb3RzLCBzbyB0aGlzIGJvdW5kcyBjb25jdXJyZW50IGxvdHMgYW5kIG5vdAovLyB0aGUgbnVtYmVyIG9mIHJlY2VpcHRzIGFuIGl0ZW0gbWF5IGV2ZXIgdGFrZS4gQSBXQVZHIGl0ZW0gbWVyZ2VzIGV2ZXJ5Ci8vIHJlY2VpcHQgaW50byBvbmUgbG90IGFuZCBzbyBjYW4gbmV2ZXIgcmVhY2ggaXQg4oCUIHdoaWNoIG1lYW5zIHRoaXMgaXMgTk9UIHRoZQovLyBiaW5kaW5nIGNvbnN0cmFpbnQgZm9yIGEgV0FWRyBpdGVtLCBhbmQgdGhhdCBpdGVtIGhhcyBhIG1lcmdlLW92ZXJmbG93Ci8vIHJlZnVzYWwgb2YgaXRzIG93biBpbnN0ZWFkLiBTZWUgdGhlIHBhY2thZ2UgZG9jLgpjb25zdCBNYXhMb3RzUGVySXRlbSA9IDY0CgovLyBNYXhFbnRyaWVzUGVyUmVnaXN0ZXIgY2FwcyBvbmUgb3duZXIncyBqb3VybmFsLCBmYXIgYmVsb3cgam91cm5hbCdzCi8vIE1heEVudHJpZXNMaW1pdCBvZiAxMDAwMDAwIGJlY2F1c2UgUmVkZXJpdmUgaXMgbGluZWFyIGluIHRoZSBwb3N0aW5nIGNvdW50Ci8vIGFuZCBpcyBhIGZyZWUgcmVhZCBoZXJlLgovLwovLyBBIHJlZ2lzdGVyIHRoYXQgZmlsbHMgcmVmdXNlcyBmdXJ0aGVyIHJlY2VpcHRzIGFuZCBzaGlwbWVudHMgcmF0aGVyIHRoYW4KLy8gZHJvcHBpbmcgaGlzdG9yeS4gVGhlcmUgaXMgZGVsaWJlcmF0ZWx5IG5vIEFyY2hpdmUg4oCUIGl0IHdvdWxkIGRlc3Ryb3kgdGhlCi8vIHJlY29yZCB0aGUgaW52YXJpYW50cyBhcmUgY2hlY2tlZCBhZ2FpbnN0IOKAlCBzbyB0aGUgcmVtZWR5IGlzIGEgc2Vjb25kCi8vIHJlZ2lzdGVyIHVuZGVyIGEgc2Vjb25kIGFkZHJlc3MsIHdoaWNoIGlzIGEgcmVhbCBsaW1pdGF0aW9uIGFuZCBub3QgYQovLyBoaWRkZW4gb25lLgpjb25zdCBNYXhFbnRyaWVzUGVyUmVnaXN0ZXIgPSA4MTkyCgovLyBNYXhTS1VMZW4gYm91bmRzIGEgU0tVLCB3aGljaCBpcyBhbiBhdmwga2V5LCBhIFJlbmRlciB0YWJsZSBjZWxsIGFuZCBhCi8vIFJlbmRlciBwYXRoIGNvbXBvbmVudCBhbGwgYXQgb25jZS4KY29uc3QgTWF4U0tVTGVuID0gMzIKCi8vIE1heEl0ZW1OYW1lTGVuIGJvdW5kcyBhbiBpdGVtJ3MgaHVtYW4gbmFtZS4gRXZlcnkgbmFtZSBpcyBhIGNhbmRpZGF0ZSBmb3IKLy8gUmVuZGVyIG91dHB1dC4KY29uc3QgTWF4SXRlbU5hbWVMZW4gPSA2NAoKLy8gUmVuZGVySXRlbUxpbWl0IGNhcHMgaG93IG1hbnkgaXRlbXMgb25lIHJlZ2lzdGVyIHBhZ2UgdGFidWxhdGVzLgpjb25zdCBSZW5kZXJJdGVtTGltaXQgPSAyNQoKLy8gUmVuZGVyTG90TGltaXQgY2FwcyBob3cgbWFueSBsb3RzIG9uZSBpdGVtIHBhZ2UgdGFidWxhdGVzLgpjb25zdCBSZW5kZXJMb3RMaW1pdCA9IDIwCgovLyBtYXhJbnQ2NCBpcyB0aGUgbGFyZ2VzdCBpbnQ2NC4gSXQgaXMgYSBwcmVjb25kaXRpb24gb2YgdGhlIGNvdW50ZXIgZ3VhcmRzCi8vIGJlbG93LCBzbyBpdCBpcyBwaW5uZWQgQlkgQkVIQVZJT1VSIGluIHRoZSBzdWl0ZSByYXRoZXIgdGhhbiBieSBhIHRlc3QgdGhhdAovLyByZXN0YXRlcyB0aGUgbGl0ZXJhbDogVGVzdE1heEludDY0SXNUaGVJbnQ2NE1heGltdW0gcHJvdmVzIGl0IHdyYXBzIHdoZW4KLy8gaW5jcmVtZW50ZWQuCmNvbnN0IG1heEludDY0IGludDY0ID0gOTIyMzM3MjAzNjg1NDc3NTgwNwoKLy8gcmVnaXN0ZXIgaXMgb25lIG93bmVyJ3MgaW52ZW50b3J5IHN1Yi1sZWRnZXIgYW5kIHRoZSBib29rIGl0cyBwb3N0aW5ncyBnbwovLyB0by4KLy8KLy8gVGhlIGJvb2sgYW5kIGV2ZXJ5IHBvb2wgYXJlIFBPSU5URVJTIGFuZCBub25lIGlzIGV2ZXIgcmV0dXJuZWQgYnkgYW55Ci8vIGV4cG9ydGVkIGZ1bmN0aW9uIOKAlCBwL2pvdXJuYWwgY29uc3VtZXIgb2JsaWdhdGlvbiA0IGFuZCB0aGUgaWRlbnRpY2FsIHJ1bGUKLy8gZm9yIHAvbG90czogYSAqQm9vayBpcyBhIG11dGFibGUgaGFuZGxlIGFuZCBhICpQb29sIGlzIGEgbXV0YWJsZSBoYW5kbGUsIGFuZAovLyBoYW5kaW5nIGVpdGhlciBhY3Jvc3MgYSByZWFsbSBib3VuZGFyeSB3b3VsZCBoYW5kIG91dCB0aGUgcmlnaHQgdG8gcG9zdCBvcgovLyB0byBjb25zdW1lLgp0eXBlIHJlZ2lzdGVyIHN0cnVjdCB7Cglib29rICAgICAqam91cm5hbC5Cb29rCglpdGVtcyAgICAqYXZsLlRyZWUgLy8gc2t1IC0+ICppdGVtCglvcGVuZWRBdCBpbnQ2NAp9CgovLyBpdGVtIGlzIG9uZSBzdG9jay1rZWVwaW5nIHVuaXQgYW5kIGl0cyBjb3N0IHBvb2wuCnR5cGUgaXRlbSBzdHJ1Y3QgewoJLy8gc2t1IGlzIGNhcnJpZWQgaW4gdGhlIHZhbHVlIGFzIHdlbGwgYXMgdGhlIHRyZWUga2V5LiBUaGUga2V5IElTIHRoZQoJLy8gc2t1IGhlcmUg4oCUIHVubGlrZSByL2Fzc2V0cywgd2hvc2Uga2V5cyBhcmUgemVyby1wYWRkZWQgaWRzIOKAlCBzbyB0aGlzCgkvLyBpcyBhIGNvbnZlbmllbmNlIHJhdGhlciB0aGFuIGEgc2Vjb25kIGVuY29kaW5nIHRvIGtlZXAgaW4gc3RlcC4KCXNrdSAgICAgc3RyaW5nCgluYW1lICAgIHN0cmluZwoJcG9vbCAgICAqbG90cy5Qb29sCglhZGRlZEF0IGludDY0CgoJLy8gVGhlIHBvc3RlZCBjb3VudGVycywgbWFpbnRhaW5lZCBJTkRFUEVOREVOVExZIG9mIHRoZSBwb29sLiBFYWNoIGlzIHRoZQoJLy8gY3VtdWxhdGl2ZSBhbW91bnQgdGhpcyByZWFsbSBhY3R1YWxseSBwb3N0ZWQgZm9yIHRoaXMgaXRlbSwgc28KCS8vIGNvbXBhcmluZyBvbmUgYWdhaW5zdCB0aGUgcG9vbCdzIG93biBmaWd1cmUgY29tcGFyZXMgdHdvIHRoaW5ncyByYXRoZXIKCS8vIHRoYW4gcmVzdGF0aW5nIG9uZS4gVGhhdCBpcyB0aGUgd2hvbGUgb2YgW0ludmFyaWFudF0uCglwb3N0ZWRSZWN2IGludDY0Cglwb3N0ZWRDT0dTIGludDY0Cn0KCi8vIHJlZ3MgbWFwcyBhbiBvd25lcidzIGFkZHJlc3Mgc3RyaW5nIHRvIHRoYXQgb3duZXIncyAqcmVnaXN0ZXIuCnZhciByZWdzID0gYXZsLk5ld1RyZWUoKQoKLy8gcmVnQ291bnQgaXMgbWFpbnRhaW5lZCBhbG9uZ3NpZGUgdGhlIHRyZWUgc28gdGhlIGluZGV4IHBhZ2UgbmV2ZXIgaGFzIHRvCi8vIGl0ZXJhdGUgaXQuCnZhciByZWdDb3VudCBpbnQKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBHdWFyZHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyByZWZ1c2VDb2lucyBwYW5pY3MgaWYgYSB1c2VyIGNhbGwgYXJyaXZlcyBjYXJyeWluZyBjb2lucy4KLy8KLy8gVGhpcyByZWFsbSBoYXMgbm8gd2l0aGRyYXdhbCBwYXRoLCBzbyBhY2NlcHRlZCBjb2lucyB3b3VsZCBiZSBzdHJhbmRlZAovLyBwZXJtYW5lbnRseS4gVGhlIGd1YXJkIGlzIG9uIElzVXNlckNhbGwgcmF0aGVyIHRoYW4gSXNVc2VyIGRlbGliZXJhdGVseToKLy8gT3JpZ2luU2VuZCBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIGEgZGlyZWN0IE1zZ0NhbGwsIGFuZCB0aGUgTXNnUnVuCi8vIGVwaGVtZXJhbCBjYW4gY29uc3VtZSB0aGUgZW52ZWxvcGUgYmVmb3JlIGZvcndhcmRpbmcgY29udHJvbCwgc28gSXNVc2VyCi8vIHdvdWxkIGJlIHRoZSB3cm9uZyBwcmVkaWNhdGUuCi8vCi8vIFRoZSBJc0N1cnJlbnQoKSBjaGVjayBpcyBhIHNlcGFyYXRlIGNvbmNlcm4gYW5kIGlzIG5vdCBhYm91dCBjb2luczogdGhpcyBpcwovLyBhIG5vbi1jcm9zc2luZyBoZWxwZXIgcmVhZGluZyBpZGVudGl0eSBvZmYgYSByZWFsbSBQQVJBTUVURVIsIHdoaWNoIGlzIHRoZQovLyBkZXNpZ25hdGlvbi1mb3JnZXJ5IHNoYXBlIChzZWN1cml0eS5tZCBDbGFzcyAyKSB3aGV0aGVyIG9yIG5vdCBhIGNhbGxlcgovLyBleGVyY2lzaW5nIGl0IGV4aXN0cyB0b2RheS4gSXQgaXMgYSBuby1vcCBhdCBldmVyeSBjYWxsIHNpdGUgaGVyZSwgYW5kIHRoYXQKLy8gY2xhaW0gaGFzIG9uZSBtb3JlIGhvcCBpbiB0aGlzIHJlYWxtIHRoYW4gaW4gaXRzIHNpYmxpbmdzOiBhZGRJdGVtIGlzIGl0c2VsZgovLyBub24tY3Jvc3NpbmcgYW5kIGZvcndhcmRzIHRoZSBjdXIgaXQgd2FzIGdpdmVuLCBzbyB0aGUgY2hhaW4gaXMKLy8gQWRkRklGTy9BZGRMSUZPL0FkZFdBVkcgLT4gYWRkSXRlbSAtPiBoZXJlLiBFdmVyeSBsaW5rIGZvcndhcmRzIGEgY3Jvc3NpbmcKLy8gZW50cnlwb2ludCdzIE9XTiBmaXJzdCBjdXIsIHdoaWNoIGlzIHJ1bnRpbWUtY3VycmVudCBieSBjb25zdHJ1Y3Rpb24gYW5kCi8vIHN0YXlzIGN1cnJlbnQgdGhyb3VnaCBhbnkgbnVtYmVyIG9mIG5vbi1jcm9zc2luZyBjYWxscyDigJQgc28gdGhlIGd1YXJkIHN0aWxsCi8vIG5ldmVyIGZpcmVzLCBhbmQgdGhlIGV4dHJhIGhvcCBpcyBleGFjdGx5IHdoeSBoYXZpbmcgaXQgYXQgdGhlIHBvaW50IG9mIFVTRQovLyByYXRoZXIgdGhhbiBhdCB0aGUgZW50cnlwb2ludHMgaXMgdGhlIHJpZ2h0IHBsYWNlbWVudC4gSXQgaXMga2VwdCBiZWNhdXNlCi8vIHRoaXMgcmVhbG0gaXMgSU1NVVRBQkxFIGFmdGVyIGFkZHBrZy4gcC9jb2luaW8gZ3VhcmRzIHRoZSBzYW1lIHNoYXBlIGluCi8vIFJlY2VpdmUsIFBheW91dCBhbmQgU3dlZXA7IHRoaXMgaXMgdGhhdCBob3VzZSBwcmVjZWRlbnQgYXBwbGllZC4KLy8KLy8gTm8gY291bnQgb2YgdGhlIGNhbGwgc2l0ZXMgaXMgd3JpdHRlbiBkb3duLCBwZXIgQ0xBVURFLm1kIMKnIDRhLgpmdW5jIHJlZnVzZUNvaW5zKGN1ciByZWFsbSkgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoImludmVudG9yeTogcmVmdXNlQ29pbnMgY2FsbGVkIHdpdGggYSByZWFsbSB0aGF0IGlzIG5vdCBjdXJyZW50IikKCX0KCWlmIGN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSAmJiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgPiAwIHsKCQlwYW5pYygiaW52ZW50b3J5OiB0aGlzIHJlYWxtIGhvbGRzIG5vIGNvaW5zIGFuZCBoYXMgbm8gd2l0aGRyYXdhbCBwYXRoOyBzZW5kIG5vbmUiKQoJfQp9CgovLyBtdXN0T3duUmVnaXN0ZXIgcmV0dXJucyB0aGUgQ0FMTEVSJ1MgcmVnaXN0ZXIsIGFuZCB0aGVyZSBpcyBubyB2YXJpYW50IHRoYXQKLy8gcmV0dXJucyBhbnlvbmUgZWxzZSdzLiBFdmVyeSBtdXRhdGluZyBlbnRyeXBvaW50IGdvZXMgdGhyb3VnaCB0aGlzLCBzbwovLyBvd25lcnNoaXAgaXMgaW1wbGljaXQgaW4gdGhlIGNhbGwuCi8vCi8vICJPd25lcnNoaXAgaXMgbmV2ZXIgYSBwYXJhbWV0ZXIiIGlzIHdoYXQgdGhpcyBjb21tZW50IHVzZWQgdG8gY29uY2x1ZGUsIGFuZAovLyBpdCBpcyB0cnVlIG9mIHRoZSBTSUdOQVRVUkUgYW5kIHdhcyBuZXZlciB0cnVlIG9mIHRoZSByZWFsbSBWQUxVRTogdGhlIG93bmVyCi8vIGlzIGRlcml2ZWQgZnJvbSBjdXIsIHNvIGFuIHVuY3VycmVudCBjdXIgSVMgYW4gb3duZXJzaGlwIHBhcmFtZXRlci4gVGhhdCBpcwovLyB0aGUgc2FtZSBDbGFzcyAyIHNoYXBlIHJlZnVzZUNvaW5zIGNhcnJpZXMgYWJvdmUgYW5kIHRoZSBtb3JlIGNvbnNlcXVlbnRpYWwKLy8gaGFsZiBvZiBpdCwgYmVjYXVzZSB0aGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGRlY2lkZXMgd2hvIG93bnMgdGhlIHJlZ2lzdGVyCi8vIHJhdGhlciB0aGFuIG9uZSB0aGF0IG9ubHkgcmVmdXNlcyBjb2lucy4gVGhlIGFkZEl0ZW0gaG9wIGRlc2NyaWJlZCBhYm92ZQovLyBhcHBsaWVzIGhlcmUgdG9vLiBUaGUgZ3VhcmQgaXMgYSBuby1vcCB0b2RheSBmb3IgdGhlIHNhbWUgcmVhc29uLCBrZXB0IGZvcgovLyB0aGUgc2FtZSByZWFzb24sIGFuZCBpdHMgY2FsbCBzaXRlcyBhcmUgbGlrZXdpc2Ugbm90IGNvdW50ZWQgaGVyZS4gU2VlCi8vIEFVRElULm1kLgpmdW5jIG11c3RPd25SZWdpc3RlcihjdXIgcmVhbG0pICpyZWdpc3RlciB7CglpZiAhY3VyLklzQ3VycmVudCgpIHsKCQlwYW5pYygiaW52ZW50b3J5OiBtdXN0T3duUmVnaXN0ZXIgY2FsbGVkIHdpdGggYSByZWFsbSB0aGF0IGlzIG5vdCBjdXJyZW50IikKCX0KCW93bmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJciwgb2sgOj0gcmVnKG93bmVyKQoJaWYgIW9rIHsKCQlwYW5pYygiaW52ZW50b3J5OiBubyByZWdpc3RlciBmb3IgIiArIG93bmVyLlN0cmluZygpICsgIjsgY2FsbCBPcGVuUmVnaXN0ZXIgZmlyc3QiKQoJfQoJcmV0dXJuIHIKfQoKLy8gcmVnIGxvb2tzIGFuIG93bmVyJ3MgcmVnaXN0ZXIgdXAuIGF2bCdzIEdldCByZXR1cm5zIGEgYmFyZSBgYW55YCBhbmQgc2lnbmFscwovLyBhYnNlbmNlIHdpdGggbmlsLCBzbyB0aGUgbmlsIHRlc3QgSVMgdGhlIGxvb2t1cCByZXN1bHQgYW5kIG5vdCBhIGRlZmVuc2l2ZQovLyBleHRyYSDigJQgZXZlcnkgdmFsdWUgdGhpcyByZWFsbSBzdG9yZXMgaXMgYSBub24tbmlsIHBvaW50ZXIuCmZ1bmMgcmVnKG93bmVyIGFkZHJlc3MpICgqcmVnaXN0ZXIsIGJvb2wpIHsKCXYgOj0gcmVncy5HZXQob3duZXIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgZmFsc2UKCX0KCXJldHVybiB2LigqcmVnaXN0ZXIpLCB0cnVlCn0KCmZ1bmMgbXVzdFJlZyhvd25lciBhZGRyZXNzKSAqcmVnaXN0ZXIgewoJciwgb2sgOj0gcmVnKG93bmVyKQoJaWYgIW9rIHsKCQlwYW5pYygiaW52ZW50b3J5OiBubyByZWdpc3RlciBmb3IgIiArIG93bmVyLlN0cmluZygpKQoJfQoJcmV0dXJuIHIKfQoKZnVuYyBtdXN0SXRlbShyICpyZWdpc3Rlciwgc2t1IHN0cmluZykgKml0ZW0gewoJdiA6PSByLml0ZW1zLkdldChza3UpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoImludmVudG9yeTogbm8gaXRlbSAiICsgc2FuaXRpemUuSW5saW5lVGV4dChza3UpKQoJfQoJcmV0dXJuIHYuKCppdGVtKQp9CgovLyBjaGVja1NLVSB2YWxpZGF0ZXMgYSBTS1UgYWdhaW5zdCBhIGRlbGliZXJhdGVseSBuYXJyb3cgY2hhcnNldDoKLy8gQS1aLCBhLXosIDAtOSwgJy4nLCAnXycgYW5kICctJy4KLy8KLy8gVGhlIHJlc3RyaWN0aW9uIGJ1eXMgdGhyZWUgdGhpbmdzIGF0IG9uY2UsIHdoaWNoIGlzIHdoeSBpdCBpcyB3b3J0aCBpbXBvc2luZwovLyBvbiBhIGNhbGxlci4gQSBTS1UgaXMgYW4gYXZsIEtFWSwgc28gaXRzIGJ5dGUgb3JkZXIgaXMgdGhlIFJlbmRlciB0YWJsZSdzCi8vIHJvdyBvcmRlci4gSXQgaXMgYSBSZW5kZXIgUEFUSCBDT01QT05FTlQsIHNvIGEgJy8nIHdvdWxkIGZvcmdlIGEgcm91dGUgYW5kIGEKLy8gJz8nIG9yICcjJyB3b3VsZCB0cnVuY2F0ZSBvbmUuIEFuZCBpdCBpcyBhIG1hcmtkb3duIFRBQkxFIENFTEwsIHNvIGEgJ3wnCi8vIHdvdWxkIGZvcmdlIGEgY29sdW1uLiBFc2NhcGluZyBhdCBlYWNoIHVzZSBzaXRlIHdvdWxkIGJlIHRocmVlIGNoYW5jZXMgdG8KLy8gbWlzcyBvbmU7IGEgY2hhcnNldCBpcyBjaGVja2VkIG9uY2UsIGhlcmUsIG9uIHRoZSB3YXkgaW4uCi8vCi8vIENhc2UgaXMgc2lnbmlmaWNhbnQgYW5kICJza3UtMSIgYW5kICJTS1UtMSIgYXJlIGRpZmZlcmVudCBpdGVtcy4gVGhhdCBpcyBhCi8vIHJlYWwgc2hhcnAgZWRnZSBmb3IgYSBodW1hbiBvcGVyYXRvciBhbmQgaXMgdGhlIGhvbmVzdCByZWFkaW5nIG9mIGEga2V5OgovLyBmb2xkaW5nIGNhc2Ugd291bGQgbWVhbiB0aGlzIHJlYWxtLCBub3QgdGhlIG93bmVyLCBkZWNpZGVzIHdoaWNoIFNLVXMKLy8gY29sbGlkZS4KZnVuYyBjaGVja1NLVShza3Ugc3RyaW5nKSB7CglpZiBza3UgPT0gIiIgewoJCXBhbmljKCJpbnZlbnRvcnk6IHNrdSBtdXN0IG5vdCBiZSBibGFuayIpCgl9CglpZiBsZW4oc2t1KSA+IE1heFNLVUxlbiB7CgkJcGFuaWMoImludmVudG9yeTogc2t1IHRvbyBsb25nLCBtYXggIiArIHN0cmNvbnYuSXRvYShNYXhTS1VMZW4pKQoJfQoJZm9yIGkgOj0gMDsgaSA8IGxlbihza3UpOyBpKysgewoJCWMgOj0gc2t1W2ldCgkJc3dpdGNoIHsKCQljYXNlIGMgPj0gJ0EnICYmIGMgPD0gJ1onOgoJCWNhc2UgYyA+PSAnYScgJiYgYyA8PSAneic6CgkJY2FzZSBjID49ICcwJyAmJiBjIDw9ICc5JzoKCQljYXNlIGMgPT0gJy4nIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy0nOgoJCWRlZmF1bHQ6CgkJCXBhbmljKCJpbnZlbnRvcnk6IHNrdSBtYXkgdXNlIG9ubHkgbGV0dGVycywgZGlnaXRzLCAnLicsICdfJyBhbmQgJy0nIikKCQl9Cgl9Cn0KCmZ1bmMgY2hlY2tJdGVtTmFtZShuYW1lIHN0cmluZykgewoJaWYgc3RyaW5ncy5UcmltU3BhY2UobmFtZSkgPT0gIiIgewoJCXBhbmljKCJpbnZlbnRvcnk6IG5hbWUgbXVzdCBub3QgYmUgYmxhbmsiKQoJfQoJaWYgbGVuKG5hbWUpID4gTWF4SXRlbU5hbWVMZW4gewoJCXBhbmljKCJpbnZlbnRvcnk6IG5hbWUgdG9vIGxvbmcsIG1heCAiICsgc3RyY29udi5JdG9hKE1heEl0ZW1OYW1lTGVuKSkKCX0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFdyaXRlcwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIE9wZW5SZWdpc3RlciBjcmVhdGVzIHRoZSBjYWxsZXIncyByZWdpc3RlciBhbmQgb3BlbnMgaXRzIHRocmVlIGFjY291bnRzLiBJdAovLyBwYW5pY3MgaWYgdGhlIGNhbGxlciBhbHJlYWR5IGhhcyBvbmUuCi8vCi8vIFRoZSBjaGFydCBpcyBvcGVuZWQgSEVSRSByYXRoZXIgdGhhbiBvbiBkZW1hbmQsIGFuZCB0aGUgYm9vayBpcyBjcmVhdGVkIHdpdGgKLy8gYSBjYXAgb2YgZXhhY3RseSB0aHJlZSBhY2NvdW50cy4gQm90aCBmYWN0cyBhcmUgbG9hZC1iZWFyaW5nOiB0aGV5IGFyZSB3aHkKLy8gdGhpcyByZWFsbSBpcyBpdHMgYm9vaydzIG9ubHkgd3JpdGVyIGFuZCB3aHkgdGhlIGNyb3NzLWZvb3QgaWRlbnRpdGllcyBhcmUKLy8gZXhhY3QgcmF0aGVyIHRoYW4gYXBwcm94aW1hdGUuCmZ1bmMgT3BlblJlZ2lzdGVyKGN1ciByZWFsbSkgewoJcmVmdXNlQ29pbnMoY3VyKQoJb3duZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglrZXkgOj0gb3duZXIuU3RyaW5nKCkKCWlmIHJlZ3MuSGFzKGtleSkgewoJCXBhbmljKCJpbnZlbnRvcnk6IHRoaXMgYWRkcmVzcyBhbHJlYWR5IGhhcyBhIHJlZ2lzdGVyIikKCX0KCgliIDo9IGpvdXJuYWwuTXVzdE5ldygzLCBNYXhFbnRyaWVzUGVyUmVnaXN0ZXIpCgliLk11c3RPcGVuKEludmVudG9yeUNvZGUsIEludmVudG9yeU5hbWUsIGpvdXJuYWwuQXNzZXQpCgliLk11c3RPcGVuKENPR1NDb2RlLCBDT0dTTmFtZSwgam91cm5hbC5FeHBlbnNlKQoJYi5NdXN0T3BlbihDb250cmliQ29kZSwgQ29udHJpYk5hbWUsIGpvdXJuYWwuRXF1aXR5KQoKCXJlZ3MuU2V0KGtleSwgJnJlZ2lzdGVyewoJCWJvb2s6ICAgICBiLAoJCWl0ZW1zOiAgICBhdmwuTmV3VHJlZSgpLAoJCW9wZW5lZEF0OiBydW50aW1lLkNoYWluSGVpZ2h0KCksCgl9KQoJcmVnQ291bnQrKwp9CgovLyBBZGRGSUZPIGFkZHMgYW4gaXRlbSB3aG9zZSBzaGlwbWVudHMgYXJlIGNvc3RlZCBvbGRlc3QtbG90LWZpcnN0LgpmdW5jIEFkZEZJRk8oY3VyIHJlYWxtLCBza3UsIG5hbWUgc3RyaW5nKSB7CglhZGRJdGVtKGN1ciwgc2t1LCBuYW1lLCBsb3RzLkZJRk8pCn0KCi8vIEFkZExJRk8gYWRkcyBhbiBpdGVtIHdob3NlIHNoaXBtZW50cyBhcmUgY29zdGVkIG5ld2VzdC1sb3QtZmlyc3QuCmZ1bmMgQWRkTElGTyhjdXIgcmVhbG0sIHNrdSwgbmFtZSBzdHJpbmcpIHsKCWFkZEl0ZW0oY3VyLCBza3UsIG5hbWUsIGxvdHMuTElGTykKfQoKLy8gQWRkV0FWRyBhZGRzIGFuIGl0ZW0gd2hvc2UgcmVjZWlwdHMgYXJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHJlLWFuY2hvcmVkIGxvdAovLyBhbmQgd2hvc2Ugc2hpcG1lbnRzIGFyZSBjb3N0ZWQgYXQgdGhlIGJsZW5kZWQgdW5pdCBjb3N0LgovLwovLyBBIFdBVkcgaXRlbSBob2xkcyBleGFjdGx5IG9uZSBsb3QgaG93ZXZlciBtYW55IHJlY2VpcHRzIGl0IHRha2VzLCBzbyBpdCBjYW4KLy8gbmV2ZXIgcmVhY2ggTWF4TG90c1Blckl0ZW0uIEl0IGNhbiBzdGlsbCByZWZ1c2UgYSByZWNlaXB0OiB0aGUgTUVSR0UgaGFzIGFuCi8vIG92ZXJmbG93IHByZWNvbmRpdGlvbiB0aGUgb3RoZXIgdHdvIG1ldGhvZHMgbmV2ZXIgZXZhbHVhdGUsIGFuZCBpdCBpcyBhCi8vIHByb3BlcnR5IG9mIHRoZSBwb29sJ3MgYWNjdW11bGF0ZWQgaGlzdG9yeSByYXRoZXIgdGhhbiBvZiB0aGUgcmVjZWlwdC4gU2VlCi8vIHRoZSBwYWNrYWdlIGRvYzsgdGhlIHByYWN0aWNhbCBjb25zZXF1ZW5jZSBpcyB0aGF0IFtMb3RDYXBhY2l0eV0gaXMgbm90IHRoZQovLyBmaWd1cmUgdG8gd2F0Y2ggZm9yIGEgV0FWRyBpdGVtLgpmdW5jIEFkZFdBVkcoY3VyIHJlYWxtLCBza3UsIG5hbWUgc3RyaW5nKSB7CglhZGRJdGVtKGN1ciwgc2t1LCBuYW1lLCBsb3RzLldBVkcpCn0KCmZ1bmMgYWRkSXRlbShjdXIgcmVhbG0sIHNrdSwgbmFtZSBzdHJpbmcsIG0gbG90cy5NZXRob2QpIHsKCXJlZnVzZUNvaW5zKGN1cikKCXIgOj0gbXVzdE93blJlZ2lzdGVyKGN1cikKCWNoZWNrU0tVKHNrdSkKCWNoZWNrSXRlbU5hbWUobmFtZSkKCglpZiByLml0ZW1zLkhhcyhza3UpIHsKCQlwYW5pYygiaW52ZW50b3J5OiBpdGVtICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KHNrdSkgKyAiIGFscmVhZHkgZXhpc3RzIikKCX0KCWlmIHIuaXRlbXMuU2l6ZSgpID49IE1heEl0ZW1zUGVyUmVnaXN0ZXIgewoJCXBhbmljKCJpbnZlbnRvcnk6IHJlZ2lzdGVyIGlzIGZ1bGwsIG1heCAiICsgc3RyY29udi5JdG9hKE1heEl0ZW1zUGVyUmVnaXN0ZXIpICsgIiBpdGVtcyIpCgl9CgoJcCwgZXJyIDo9IGxvdHMuTmV3UG9vbChtLCBNYXhMb3RzUGVySXRlbSkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCXIuaXRlbXMuU2V0KHNrdSwgJml0ZW17CgkJc2t1OiAgICAgc2t1LAoJCW5hbWU6ICAgIG5hbWUsCgkJcG9vbDogICAgcCwKCQlhZGRlZEF0OiBydW50aW1lLkNoYWluSGVpZ2h0KCksCgl9KQp9CgovLyBSZWNlaXZlIHRha2VzIHF0eSB1bml0cyBjb3N0aW5nIGNvc3QgaW4gdG90YWwgaW50byB0aGUgaXRlbSdzIHBvb2wgYW5kIHBvc3RzCi8vIGRlYml0IDEzMDAgLyBjcmVkaXQgMzkwMCwgcmV0dXJuaW5nIHRoZSBlbnRyeSBpZC4KLy8KLy8gQSBjb3N0IG9mIFpFUk8gaXMgYWNjZXB0ZWQg4oCUIGZyZWUgZ29vZHMg4oCUIGFuZCBwb3N0cyBub3RoaW5nOyB0aGUgcmV0dXJuZWQgaWQKLy8gaXMgdGhlbiAwLCB3aGljaCBpcyBub3QgYSB2YWxpZCBlbnRyeSBpZCBhbmQgaXMgdGhlIHNpZ25hbCB0aGF0IG5vIGVudHJ5IHdhcwovLyBtYWRlLiBTZWUgdGhlIHBhY2thZ2UgZG9jLgovLwovLyBQYW5pY3MgaWYgdGhlIGl0ZW0gZG9lcyBub3QgZXhpc3QsIGlmIHF0eSBpcyBub3QgcG9zaXRpdmUsIGlmIGNvc3QgaXMKLy8gbmVnYXRpdmUsIGlmIHRoZSBwb29sJ3MgbG90IGNhcCBpcyByZWFjaGVkLCBpZiBhIFdBVkcgbWVyZ2Ugd291bGQgYnJlYWNoIHRoZQovLyBwZXItbG90IG92ZXJmbG93IHByZWNvbmRpdGlvbiDigJQgYSByZWZ1c2FsIHRoYXQgZGVwZW5kcyBvbiB0aGUgaXRlbSdzIGhpc3RvcnkKLy8gYW5kIG5vdCBvbiB0aGlzIHJlY2VpcHQsIHNlZSBbQWRkV0FWR10g4oCUIG9yIGlmIHRoZSBib29rIGlzIGZ1bGwuIEV2ZXJ5Ci8vIG9uZSBvZiB0aG9zZSBhYm9ydHMgdGhlIHdob2xlIHRyYW5zYWN0aW9uLCB3aGljaCBpcyB3aGF0IG1ha2VzIHRoZQovLyBwb29sLXRoZW4tcG9zdCBvcmRlciBzYWZlOiBhbiBlcnJvciByZXR1cm4gd291bGQgTk9UIHJldmVydCB0aGUgcG9vbCB1cGRhdGUsCi8vIGEgcGFuaWMgZG9lcy4KZnVuYyBSZWNlaXZlKGN1ciByZWFsbSwgc2t1IHN0cmluZywgcXR5LCBjb3N0IGludDY0KSB1aW50NjQgewoJcmVmdXNlQ29pbnMoY3VyKQoJciA6PSBtdXN0T3duUmVnaXN0ZXIoY3VyKQoJaXQgOj0gbXVzdEl0ZW0ociwgc2t1KQoKCWlmIGVyciA6PSBpdC5wb29sLlJlY2VpdmUocXR5LCBjb3N0KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCS8vIEd1YXJkIHRoZSByZWFsbSdzIG93biBjb3VudGVyIGJlZm9yZSBjb21taXR0aW5nIGl0LiBUaGUgYm91bmQgYXJndW1lbnQKCS8vIHNheXMgdGhpcyBjYW5ub3QgZmlyZSDigJQgcG9zdGVkUmVjdiB0cmFja3MgcG9vbC5SZWNlaXZlZENvc3QoKSBleGFjdGx5LAoJLy8gYW5kIHAvbG90cyBhbHJlYWR5IHJlZnVzZWQgdG8gbGV0IHRoYXQgb3ZlcmZsb3cg4oCUIGFuZCBpdCBpcyB3cml0dGVuCgkvLyBhbnl3YXksIGJlY2F1c2UgInVucmVhY2hhYmxlIiBpcyBhbiBhcmd1bWVudCBhYm91dCBjb2RlIHRoYXQgbWF5IGJlCgkvLyBlZGl0ZWQgYW5kIHRoZSBjb3N0IG9mIGJlaW5nIHdyb25nIGhlcmUgaXMgYSBzaWxlbnRseSBuZWdhdGl2ZQoJLy8gaW52ZW50b3J5IGZpZ3VyZS4gcC9sb3RzJyBDb3N0T25IYW5kIG1ha2VzIHRoZSBzYW1lIHRyYWRlIGZvciB0aGUgc2FtZQoJLy8gcmVhc29uLgoJaWYgaXQucG9zdGVkUmVjdiA+IG1heEludDY0LWNvc3QgewoJCXBhbmljKCJpbnZlbnRvcnk6IHBvc3RlZCByZWNlaXB0IGNvdW50ZXIgd291bGQgb3ZlcmZsb3ciKQoJfQoJaXQucG9zdGVkUmVjdiArPSBjb3N0CgoJaWYgY29zdCA9PSAwIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIHIuYm9vay5NdXN0UG9zdChydW50aW1lLkNoYWluSGVpZ2h0KCksICJyZWNlaXZlICIrc2t1LCBbXWpvdXJuYWwuUG9zdGluZ3sKCQl7QWNjb3VudDogSW52ZW50b3J5Q29kZSwgU2lkZTogam91cm5hbC5EZWJpdCwgQW1vdW50OiBjb3N0fSwKCQl7QWNjb3VudDogQ29udHJpYkNvZGUsIFNpZGU6IGpvdXJuYWwuQ3JlZGl0LCBBbW91bnQ6IGNvc3R9LAoJfSkKfQoKLy8gU2hpcCBjb25zdW1lcyBxdHkgdW5pdHMgZnJvbSB0aGUgaXRlbSdzIHBvb2wgYW5kIHBvc3RzIGRlYml0IDUwMDAgLwovLyBjcmVkaXQgMTMwMCBmb3IgdGhlIGNvc3QgaXQgREVSSVZFRCwgcmV0dXJuaW5nIHRoYXQgY29zdC4KLy8KLy8gVGhlIGNvc3QgaXMgbmV2ZXIgYSBwYXJhbWV0ZXIuIEl0IGlzIHdoYXRldmVyIHRoZSBpdGVtJ3MgY29zdGluZyBtZXRob2QKLy8gY2hhcmdlcyBhZ2FpbnN0IHRoZSBsb3RzIG9uIGhhbmQsIHdoaWNoIGlzIHRoZSB3aG9sZSBwcm9kdWN0LgovLwovLyBBIGRlcml2ZWQgY29zdCBvZiBaRVJPIHBvc3RzIG5vdGhpbmcg4oCUIGdvb2RzIHRoYXQgY29zdCBub3RoaW5nIHRvIGFjcXVpcmUKLy8gY29zdCBub3RoaW5nIHRvIHNoaXAuIFRoZSByZXR1cm4gdmFsdWUgaXMgdGhlbiAwIGFuZCBzbyBpcyBpbmRpc3Rpbmd1aXNoYWJsZQovLyBmcm9tICJubyBlbnRyeSBtYWRlIiwgZGVsaWJlcmF0ZWx5OiBib3RoIGZhY3RzIGFyZSB0aGUgc2FtZSBmYWN0IGhlcmUuCi8vCi8vIFBhbmljcyBpZiB0aGUgaXRlbSBkb2VzIG5vdCBleGlzdCwgaWYgcXR5IGlzIG5vdCBwb3NpdGl2ZSwgaWYgcXR5IGV4Y2VlZHMKLy8gdGhlIHF1YW50aXR5IG9uIGhhbmQgKHAvbG90cyBmYWlscyBjbG9zZWQgd2l0aCBFcnJJbnN1ZmZpY2llbnQgYW5kIGNvbnN1bWVzCi8vIG5vdGhpbmcpLCBvciBpZiB0aGUgYm9vayBpcyBmdWxsLgpmdW5jIFNoaXAoY3VyIHJlYWxtLCBza3Ugc3RyaW5nLCBxdHkgaW50NjQpIGludDY0IHsKCXJlZnVzZUNvaW5zKGN1cikKCXIgOj0gbXVzdE93blJlZ2lzdGVyKGN1cikKCWl0IDo9IG11c3RJdGVtKHIsIHNrdSkKCgljaGFyZ2UsIGVyciA6PSBpdC5wb29sLkNvbnN1bWUocXR5KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoKCS8vIFNhbWUgdHJhZGUgYXMgUmVjZWl2ZSdzIGd1YXJkLCBhbmQgdGhlIHNhbWUgYm91bmQgYXJndW1lbnQ6IHBvc3RlZENPR1MKCS8vIHRyYWNrcyBwb29sLkNoYXJnZWRDb3N0KCksIHdob3NlIGFjY3VtdWxhdGlvbiBwL2xvdHMgZ3VhcmRzLgoJaWYgaXQucG9zdGVkQ09HUyA+IG1heEludDY0LWNoYXJnZSB7CgkJcGFuaWMoImludmVudG9yeTogcG9zdGVkIENPR1MgY291bnRlciB3b3VsZCBvdmVyZmxvdyIpCgl9CglpdC5wb3N0ZWRDT0dTICs9IGNoYXJnZQoKCWlmIGNoYXJnZSA9PSAwIHsKCQlyZXR1cm4gMAoJfQoJci5ib29rLk11c3RQb3N0KHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSwgInNoaXAgIitza3UsIFtdam91cm5hbC5Qb3N0aW5newoJCXtBY2NvdW50OiBDT0dTQ29kZSwgU2lkZTogam91cm5hbC5EZWJpdCwgQW1vdW50OiBjaGFyZ2V9LAoJCXtBY2NvdW50OiBJbnZlbnRvcnlDb2RlLCBTaWRlOiBqb3VybmFsLkNyZWRpdCwgQW1vdW50OiBjaGFyZ2V9LAoJfSkKCXJldHVybiBjaGFyZ2UKfQoKLy8gUmVuYW1lIGNoYW5nZXMgYW4gaXRlbSdzIGh1bWFuIG5hbWUuIFRoZSBTS1UsIHRoZSBjb3N0aW5nIG1ldGhvZCBhbmQgZXZlcnkKLy8gbG90IGFyZSBpbW11dGFibGU7IGEgbmFtZSBpcyBwcmVzZW50YXRpb24gb25seSBhbmQgbm90aGluZyBkZXJpdmVzIGZyb20gaXQuCmZ1bmMgUmVuYW1lKGN1ciByZWFsbSwgc2t1LCBuYW1lIHN0cmluZykgewoJcmVmdXNlQ29pbnMoY3VyKQoJciA6PSBtdXN0T3duUmVnaXN0ZXIoY3VyKQoJaXQgOj0gbXVzdEl0ZW0ociwgc2t1KQoJY2hlY2tJdGVtTmFtZShuYW1lKQoJaXQubmFtZSA9IG5hbWUKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJlYWRzIOKAlCByZWdpc3RlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIEhhc1JlZ2lzdGVyIHJlcG9ydHMgd2hldGhlciBhbiBhZGRyZXNzIGhhcyBvcGVuZWQgYSByZWdpc3Rlci4KZnVuYyBIYXNSZWdpc3Rlcihvd25lciBhZGRyZXNzKSBib29sIHsgcmV0dXJuIHJlZ3MuSGFzKG93bmVyLlN0cmluZygpKSB9CgovLyBSZWdpc3RlcnMgaXMgaG93IG1hbnkgcmVnaXN0ZXJzIGV4aXN0IGFjcm9zcyB0aGUgcmVhbG0uCmZ1bmMgUmVnaXN0ZXJzKCkgaW50IHsgcmV0dXJuIHJlZ0NvdW50IH0KCi8vIE9wZW5lZEF0IGlzIHRoZSBoZWlnaHQgYW4gb3duZXIncyByZWdpc3RlciB3YXMgb3BlbmVkIGF0LgpmdW5jIE9wZW5lZEF0KG93bmVyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIG11c3RSZWcob3duZXIpLm9wZW5lZEF0IH0KCi8vIEl0ZW1Db3VudCBpcyBob3cgbWFueSBpdGVtcyBhbiBvd25lcidzIHJlZ2lzdGVyIGhvbGRzLgpmdW5jIEl0ZW1Db3VudChvd25lciBhZGRyZXNzKSBpbnQgeyByZXR1cm4gbXVzdFJlZyhvd25lcikuaXRlbXMuU2l6ZSgpIH0KCi8vIEhlaWdodCBpcyB0aGUgY3VycmVudCBjaGFpbiBoZWlnaHQsIHNvIGEgcmVhZGVyIGNhbiBkYXRlIGV2ZXJ5IG90aGVyIGZpZ3VyZQovLyBvbiB0aGlzIHBhZ2Ugd2l0aG91dCBhIHNlY29uZCBxdWVyeS4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gU0tVcyBsaXN0cyBhbiBvd25lcidzIFNLVXMgaW4ga2V5IG9yZGVyLCBzdGFydGluZyBhdCBvciBhZnRlciBmcm9tIGFuZAovLyByZXR1cm5pbmcgYXQgbW9zdCBsaW1pdCBvZiB0aGVtLiBBbiBlbXB0eSBmcm9tIHN0YXJ0cyBhdCB0aGUgYmVnaW5uaW5nLgovLwovLyBUaGlzIGVudW1lcmF0b3IgZXhpc3RzIGJlY2F1c2UgaXRzIGFic2VuY2UgaXMgYSBrbm93biBkZWZlY3QgZWxzZXdoZXJlIGluCi8vIHRoaXMgcG9ydGZvbGlvOiByL2Jvb2tzIGV4cG9zZXMgbm8gYWNjb3VudCBlbnVtZXJhdG9yLCBzbyBhIHRoaXJkIHBhcnR5Ci8vIGNhbm5vdCBkaXNjb3ZlciB3aGF0IHRvIGFzayBpdCBhYm91dCB3aXRob3V0IGFscmVhZHkga25vd2luZy4gQSBzdWItbGVkZ2VyCi8vIHdob3NlIGludmFyaWFudHMgYXJlIHBlci1pdGVtIGlzIHVzZWxlc3MgdG8gYSB2ZXJpZmllciB3aG8gY2Fubm90IGxpc3QgdGhlCi8vIGl0ZW1zLCBzbyB0aGUgbGlzdCBpcyBwYXJ0IG9mIHRoZSBwcm9kdWN0IHJhdGhlciB0aGFuIGFuIGFmdGVydGhvdWdodC4KLy8KLy8gQSBub24tcG9zaXRpdmUgbGltaXQgcmV0dXJucyBub3RoaW5nIHJhdGhlciB0aGFuIGV2ZXJ5dGhpbmcuIFRoZSBjYXAgaXMgdGhlCi8vIGl0ZW0gY2FwLCBzbyBhIGNhbGxlciBtYXkgYWx3YXlzIHBhZ2UgdGhlIHdob2xlIHJlZ2lzdGVyLgpmdW5jIFNLVXMob3duZXIgYWRkcmVzcywgZnJvbSBzdHJpbmcsIGxpbWl0IGludCkgW11zdHJpbmcgewoJciA6PSBtdXN0UmVnKG93bmVyKQoJaWYgbGltaXQgPD0gMCB7CgkJcmV0dXJuIG5pbAoJfQoJaWYgbGltaXQgPiBNYXhJdGVtc1BlclJlZ2lzdGVyIHsKCQlsaW1pdCA9IE1heEl0ZW1zUGVyUmVnaXN0ZXIKCX0KCW91dCA6PSBtYWtlKFtdc3RyaW5nLCAwLCBsaW1pdCkKCXIuaXRlbXMuSXRlcmF0ZShmcm9tLCAiIiwgZnVuYyhrIHN0cmluZywgXyBhbnkpIGJvb2wgewoJCWlmIGxlbihvdXQpID49IGxpbWl0IHsKCQkJcmV0dXJuIHRydWUKCQl9CgkJb3V0ID0gYXBwZW5kKG91dCwgaykKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gb3V0Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZWFkcyDigJQgaXRlbQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIEhhc0l0ZW0gcmVwb3J0cyB3aGV0aGVyIGFuIG93bmVyJ3MgcmVnaXN0ZXIgaG9sZHMgYSBTS1UuCmZ1bmMgSGFzSXRlbShvd25lciBhZGRyZXNzLCBza3Ugc3RyaW5nKSBib29sIHsKCXIsIG9rIDo9IHJlZyhvd25lcikKCWlmICFvayB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gci5pdGVtcy5IYXMoc2t1KQp9CgovLyBJdGVtTmFtZSBpcyBhbiBpdGVtJ3MgaHVtYW4gbmFtZS4KZnVuYyBJdGVtTmFtZShvd25lciBhZGRyZXNzLCBza3Ugc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIG11c3RJdGVtKG11c3RSZWcob3duZXIpLCBza3UpLm5hbWUKfQoKLy8gTWV0aG9kIGlzIGFuIGl0ZW0ncyBjb3N0aW5nIG1ldGhvZCwgYXMgImZpZm8iLCAibGlmbyIgb3IKLy8gIndlaWdodGVkLWF2ZXJhZ2UiLgpmdW5jIE1ldGhvZChvd25lciBhZGRyZXNzLCBza3Ugc3RyaW5nKSBzdHJpbmcgewoJcmV0dXJuIG11c3RJdGVtKG11c3RSZWcob3duZXIpLCBza3UpLnBvb2wuTWV0aG9kKCkuU3RyaW5nKCkKfQoKLy8gQWRkZWRBdCBpcyB0aGUgaGVpZ2h0IGFuIGl0ZW0gd2FzIGFkZGVkIGF0LgpmdW5jIEFkZGVkQXQob3duZXIgYWRkcmVzcywgc2t1IHN0cmluZykgaW50NjQgewoJcmV0dXJuIG11c3RJdGVtKG11c3RSZWcob3duZXIpLCBza3UpLmFkZGVkQXQKfQoKLy8gT25IYW5kIGlzIHRoZSBxdWFudGl0eSBvZiBhbiBpdGVtIG9uIGhhbmQsIERFUklWRUQgYnkgd2Fsa2luZyBpdHMgbGl2ZSBsb3RzCi8vIHJhdGhlciB0aGFuIHJlYWQgZnJvbSBhIGNvdW50ZXIg4oCUIHdoaWNoIGlzIHdoYXQgbWFrZXMgW0l0ZW1Dcm9zc0Zvb3RRdHldIGEKLy8gY29tcGFyaXNvbiByYXRoZXIgdGhhbiBhIHRhdXRvbG9neS4KZnVuYyBPbkhhbmQob3duZXIgYWRkcmVzcywgc2t1IHN0cmluZykgaW50NjQgewoJcmV0dXJuIG11c3RJdGVtKG11c3RSZWcob3duZXIpLCBza3UpLnBvb2wuUXR5T25IYW5kKCkKfQoKLy8gQ29zdE9uSGFuZCBpcyB0aGUgY2FycnlpbmcgdmFsdWUgb2YgYW4gaXRlbSdzIGxpdmUgbG90czogdGhlIGZpZ3VyZSB0aGlzCi8vIGl0ZW0gY29udHJpYnV0ZXMgdG8gdGhlIDEzMDAgYmFsYW5jZS4gRGVyaXZlZCwgZm9yIHRoZSBzYW1lIHJlYXNvbiBhcwovLyBbT25IYW5kXS4KZnVuYyBDb3N0T25IYW5kKG93bmVyIGFkZHJlc3MsIHNrdSBzdHJpbmcpIGludDY0IHsKCWMsIGVyciA6PSBtdXN0SXRlbShtdXN0UmVnKG93bmVyKSwgc2t1KS5wb29sLkNvc3RPbkhhbmQoKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIGMKfQoKLy8gUmVjZWl2ZWQgaXMgYW4gaXRlbSdzIGN1bXVsYXRpdmUgcmVjZWl2ZWQgcXVhbnRpdHkgYW5kIGNvc3QuCmZ1bmMgUmVjZWl2ZWQob3duZXIgYWRkcmVzcywgc2t1IHN0cmluZykgKHF0eSwgY29zdCBpbnQ2NCkgewoJcCA6PSBtdXN0SXRlbShtdXN0UmVnKG93bmVyKSwgc2t1KS5wb29sCglyZXR1cm4gcC5SZWNlaXZlZFF0eSgpLCBwLlJlY2VpdmVkQ29zdCgpCn0KCi8vIENoYXJnZWQgaXMgYW4gaXRlbSdzIGN1bXVsYXRpdmUgc2hpcHBlZCBxdWFudGl0eSBhbmQgdGhlIGNvc3QgY2hhcmdlZCBvdXQKLy8gZm9yIGl0LiBUaGUgY29zdCBmaWd1cmUgaXMgZGVyaXZlZDogbm8gY2FsbGVyIGhhcyBldmVyIHN1cHBsaWVkIGl0LgpmdW5jIENoYXJnZWQob3duZXIgYWRkcmVzcywgc2t1IHN0cmluZykgKHF0eSwgY29zdCBpbnQ2NCkgewoJcCA6PSBtdXN0SXRlbShtdXN0UmVnKG93bmVyKSwgc2t1KS5wb29sCglyZXR1cm4gcC5Db25zdW1lZFF0eSgpLCBwLkNoYXJnZWRDb3N0KCkKfQoKLy8gUmVjZWlwdHMgaXMgaG93IG1hbnkgcmVjZWlwdHMgYW4gaXRlbSBoYXMgdGFrZW4sIGluY2x1ZGluZyB0aG9zZSB3aG9zZSBsb3RzCi8vIGFyZSBleGhhdXN0ZWQgYW5kIGRyb3BwZWQuIEl0IGlzIE5PVCB0aGUgbGl2ZSBsb3QgY291bnQg4oCUIHNlZSBbTG90Q291bnRdLgpmdW5jIFJlY2VpcHRzKG93bmVyIGFkZHJlc3MsIHNrdSBzdHJpbmcpIGludDY0IHsKCXJldHVybiBtdXN0SXRlbShtdXN0UmVnKG93bmVyKSwgc2t1KS5wb29sLlJlY2VpcHRDb3VudCgpCn0KCi8vIExvdENvdW50IGlzIGhvdyBtYW55IExJVkUgbG90cyBhbiBpdGVtIGhvbGRzLiBFeGhhdXN0ZWQgbG90cyBhcmUgZHJvcHBlZC4KZnVuYyBMb3RDb3VudChvd25lciBhZGRyZXNzLCBza3Ugc3RyaW5nKSBpbnQgewoJcmV0dXJuIG11c3RJdGVtKG11c3RSZWcob3duZXIpLCBza3UpLnBvb2wuTG90Q291bnQoKQp9CgovLyBMb3RBdCByZXBvcnRzIHRoZSBpJ3RoIGxpdmUgbG90IG9mIGFuIGl0ZW0gaW4gcmVjZWlwdCBvcmRlciwgYW5kIHdoZXRoZXIgaQovLyB3YXMgaW4gcmFuZ2UuIEl0IHJldHVybnMgcHJpbWl0aXZlcyByYXRoZXIgdGhhbiBhIHAvbG90cy5Mb3Qgc28gdGhhdCB0aGUKLy8gZmlndXJlcyBhcmUgcmVhZGFibGUgZnJvbSB2bS9xZXZhbCB3aXRob3V0IHRoZSBjYWxsZXIga25vd2luZyB0aGF0IHR5cGUuCmZ1bmMgTG90QXQob3duZXIgYWRkcmVzcywgc2t1IHN0cmluZywgaSBpbnQpIChxdHksIGNvc3QsIGNvbnN1bWVkLCByZW1haW5pbmcsIHJlbWFpbmluZ0Nvc3QgaW50NjQsIG9rIGJvb2wpIHsKCWwsIGZvdW5kIDo9IG11c3RJdGVtKG11c3RSZWcob3duZXIpLCBza3UpLnBvb2wuTG90KGkpCglpZiAhZm91bmQgewoJCXJldHVybiAwLCAwLCAwLCAwLCAwLCBmYWxzZQoJfQoJcmMsIGVyciA6PSBsLlJlbWFpbmluZ0Nvc3QoKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIGwuUXR5LCBsLkNvc3QsIGwuQ29uc3VtZWQsIGwuUmVtYWluaW5nKCksIHJjLCB0cnVlCn0KCi8vIENhcGFjaXR5IHJlcG9ydHMgaG93IG11Y2ggcm9vbSBhbiBvd25lcidzIHJlZ2lzdGVyIGhhcyBsZWZ0LgpmdW5jIENhcGFjaXR5KG93bmVyIGFkZHJlc3MpIChpdGVtc0xlZnQsIGVudHJpZXNMZWZ0IGludCkgewoJciA6PSBtdXN0UmVnKG93bmVyKQoJcmV0dXJuIE1heEl0ZW1zUGVyUmVnaXN0ZXIgLSByLml0ZW1zLlNpemUoKSwgTWF4RW50cmllc1BlclJlZ2lzdGVyIC0gci5ib29rLkVudHJ5Q291bnQoKQp9CgovLyBMb3RDYXBhY2l0eSByZXBvcnRzIGhvdyBtYW55IGZ1cnRoZXIgbGl2ZSBsb3RzIG9uZSBpdGVtIGNhbiBob2xkLiBBIFdBVkcKLy8gaXRlbSBtZXJnZXMgaW50byBvbmUgbG90LCBzbyBpdHMgZmlndXJlIGlzIGEgYm91bmQgaXQgd2lsbCBuZXZlciBhcHByb2FjaCDigJQKLy8gYW5kIHJlYWRpbmcgaGVhZHJvb20gb2ZmIGl0IGZvciBhIFdBVkcgaXRlbSBpcyB0aGVyZWZvcmUgcmVhZGluZyB0aGUgd3JvbmcKLy8gbGltaXQsIGJlY2F1c2UgdGhlIHJlZnVzYWwgdGhhdCBDQU4gYmluZCB0aGVyZSBpcyBhIG1lcmdlIG92ZXJmbG93IHRoaXMKLy8gZmlndXJlIGtub3dzIG5vdGhpbmcgYWJvdXQuIFNlZSBbQWRkV0FWR10uCmZ1bmMgTG90Q2FwYWNpdHkob3duZXIgYWRkcmVzcywgc2t1IHN0cmluZykgaW50IHsKCXJldHVybiBNYXhMb3RzUGVySXRlbSAtIG11c3RJdGVtKG11c3RSZWcob3duZXIpLCBza3UpLnBvb2wuTG90Q291bnQoKQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUmVhZHMg4oCUIHRoZSBsZWRnZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBCYWxhbmNlIHJldHVybnMgYW4gYWNjb3VudCdzIGJhbGFuY2UgaW4gaXRzIE5PUk1BTCBkaXJlY3Rpb24gYW5kIHdoZXRoZXIgdGhlCi8vIGNvZGUgZXhpc3RzLiBBbGwgdGhyZWUgb2YgdGhpcyByZWFsbSdzIGFjY291bnRzIGFyZSBub3JtYWwsIHNvIGFsbCB0aHJlZQovLyByZWFkIG5vbi1uZWdhdGl2ZS4KZnVuYyBCYWxhbmNlKG93bmVyIGFkZHJlc3MsIGNvZGUgc3RyaW5nKSAoaW50NjQsIGJvb2wpIHsKCXJldHVybiBtdXN0UmVnKG93bmVyKS5ib29rLkJhbGFuY2UoY29kZSkKfQoKLy8gUmF3QmFsYW5jZSByZXR1cm5zIGRlYml0cyBtaW51cyBjcmVkaXRzIHJlZ2FyZGxlc3Mgb2Yga2luZC4gU3VtbWVkIG92ZXIgdGhlCi8vIHRocmVlIGFjY291bnRzIGl0IGlzIGV4YWN0bHkgemVybyBpbiBhIGJhbGFuY2VkIGJvb2ssIHdoaWNoIGlzIHdoYXQgbWFrZXMgaXQKLy8gdGhlIHVzZWZ1bCBmaWd1cmUgZm9yIGEgY29uc2lzdGVuY3kgY2hlY2sgYW5kIHRoZSB3cm9uZyBvbmUgZm9yIGEgcmVwb3J0LgpmdW5jIFJhd0JhbGFuY2Uob3duZXIgYWRkcmVzcywgY29kZSBzdHJpbmcpIChpbnQ2NCwgYm9vbCkgewoJYSwgb2sgOj0gbXVzdFJlZyhvd25lcikuYm9vay5BY2NvdW50KGNvZGUpCglpZiAhb2sgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIGEuUmF3RGVsdGEoKSwgdHJ1ZQp9CgovLyBBY2NvdW50S2luZCByZXR1cm5zIGFuIGFjY291bnQncyBraW5kIGFzIGEgd29yZCwgYW5kIHdoZXRoZXIgaXQgZXhpc3RzLgpmdW5jIEFjY291bnRLaW5kKG93bmVyIGFkZHJlc3MsIGNvZGUgc3RyaW5nKSAoc3RyaW5nLCBib29sKSB7CglhLCBvayA6PSBtdXN0UmVnKG93bmVyKS5ib29rLkFjY291bnQoY29kZSkKCWlmICFvayB7CgkJcmV0dXJuICIiLCBmYWxzZQoJfQoJcmV0dXJuIGEuS2luZC5TdHJpbmcoKSwgdHJ1ZQp9CgovLyBJbnZlbnRvcnlEZWJpdCBpcyB0aGUgMTMwMCBiYWxhbmNlOiB0aGUgdmFsdWUgb2YgZ29vZHMgb24gaGFuZCBwZXIgdGhlCi8vIGxlZGdlci4KZnVuYyBJbnZlbnRvcnlEZWJpdChvd25lciBhZGRyZXNzKSBpbnQ2NCB7CgliLCBvayA6PSBtdXN0UmVnKG93bmVyKS5ib29rLkJhbGFuY2UoSW52ZW50b3J5Q29kZSkKCWlmICFvayB7CgkJcGFuaWMoImludmVudG9yeTogcmVnaXN0ZXIgaGFzIG5vICIgKyBJbnZlbnRvcnlDb2RlICsgIiBhY2NvdW50IikKCX0KCXJldHVybiBiCn0KCi8vIENPR1NEZWJpdCBpcyB0aGUgNTAwMCBiYWxhbmNlOiBldmVyeXRoaW5nIGV2ZXIgY2hhcmdlZCBvdXQgYXMgY29zdCBvZiBnb29kcwovLyBzb2xkLgpmdW5jIENPR1NEZWJpdChvd25lciBhZGRyZXNzKSBpbnQ2NCB7CgliLCBvayA6PSBtdXN0UmVnKG93bmVyKS5ib29rLkJhbGFuY2UoQ09HU0NvZGUpCglpZiAhb2sgewoJCXBhbmljKCJpbnZlbnRvcnk6IHJlZ2lzdGVyIGhhcyBubyAiICsgQ09HU0NvZGUgKyAiIGFjY291bnQiKQoJfQoJcmV0dXJuIGIKfQoKLy8gQ29udHJpYnV0ZWRDcmVkaXQgaXMgdGhlIDM5MDAgYmFsYW5jZS4gUmVhZCBpdCBhcyAiZ29vZHMgYXJyaXZlZCBmcm9tCi8vIHNvbWV3aGVyZSB0aGlzIGxlZGdlciBkb2VzIG5vdCBtb2RlbCIg4oCUIHNlZSB0aGUgcGFja2FnZSBkb2Mgb24gd2h5IDM5MDAgaXMgYQovLyBwbHVnIHRoaXMgcmVhbG0gaXMgZm9yY2VkIHRvIHBpY2suCmZ1bmMgQ29udHJpYnV0ZWRDcmVkaXQob3duZXIgYWRkcmVzcykgaW50NjQgewoJYiwgb2sgOj0gbXVzdFJlZyhvd25lcikuYm9vay5CYWxhbmNlKENvbnRyaWJDb2RlKQoJaWYgIW9rIHsKCQlwYW5pYygiaW52ZW50b3J5OiByZWdpc3RlciBoYXMgbm8gIiArIENvbnRyaWJDb2RlICsgIiBhY2NvdW50IikKCX0KCXJldHVybiBiCn0KCi8vIEVudHJ5Q291bnQgaXMgaG93IG1hbnkgZW50cmllcyBhbiBvd25lcidzIGJvb2sgaG9sZHMuCmZ1bmMgRW50cnlDb3VudChvd25lciBhZGRyZXNzKSBpbnQgeyByZXR1cm4gbXVzdFJlZyhvd25lcikuYm9vay5FbnRyeUNvdW50KCkgfQoKLy8gVG90YWxzIGFyZSB0aGUgYm9vaydzIHRvdGFsIGRlYml0cyBhbmQgY3JlZGl0cy4KZnVuYyBUb3RhbHMob3duZXIgYWRkcmVzcykgKGRlYml0cywgY3JlZGl0cyBpbnQ2NCkgewoJYiA6PSBtdXN0UmVnKG93bmVyKS5ib29rCglyZXR1cm4gYi5Ub3RhbERlYml0cygpLCBiLlRvdGFsQ3JlZGl0cygpCn0KCi8vIElzQmFsYW5jZWQgcmVwb3J0cyB3aGV0aGVyIHRvdGFsIGRlYml0cyBlcXVhbCB0b3RhbCBjcmVkaXRzLgpmdW5jIElzQmFsYW5jZWQob3duZXIgYWRkcmVzcykgYm9vbCB7IHJldHVybiBtdXN0UmVnKG93bmVyKS5ib29rLklzQmFsYW5jZWQoKSB9CgovLyBFcXVhdGlvbiByZXBvcnRzIHRoZSBhY2NvdW50aW5nIGVxdWF0aW9uOiBkZWJpdC1ub3JtYWwgYWdhaW5zdAovLyBjcmVkaXQtbm9ybWFsLCBhbmQgd2hldGhlciB0aGV5IG9mZnNldC4gRm9yIHRoaXMgcmVhbG0gdGhhdCBpcwovLyAxMzAwICsgNTAwMCBhZ2FpbnN0IDM5MDAsIHdoaWNoIG9mZnNldHMgYXQgMCA9IDAgb24gYW4gZW1wdHkgcmVnaXN0ZXIgYW5kCi8vIGFmdGVyIGV2ZXJ5IHBvc3RpbmcuCi8vCi8vIFJFQUQgVEhFIFNJR04gQkVGT1JFIFBSRVNFTlRJTkcgRUlUSEVSIEZJR1VSRS4gam91cm5hbCBwYXJ0aXRpb25zIFJBVwovLyBERUxUQVMg4oCUIGRlYml0cyBtaW51cyBjcmVkaXRzIOKAlCBzbyBjcmVkaXROb3JtYWwgaXMgTkVHQVRJVkUgd2hlbmV2ZXIgMzkwMAovLyBjYXJyaWVzIGEgY3JlZGl0IGJhbGFuY2UsIGFuZCBgb2Zmc2V0c2AgbWVhbnMgZGViaXROb3JtYWwgKyBjcmVkaXROb3JtYWwKLy8gPT0gMCwgbm90IGRlYml0Tm9ybWFsID09IGNyZWRpdE5vcm1hbC4gVGhlIHRleHRib29rICJhc3NldHMgPSBlcXVpdHkiIGhhcwovLyBib3RoIHNpZGVzIHBvc2l0aXZlOyB0aGlzIGRvZXMgbm90LiBBIGNhbGxlciByZW5kZXJpbmcgYSBiYWxhbmNlIHNoZWV0Ci8vIHdhbnRzIC1jcmVkaXROb3JtYWwuIFRoZSBmaXJzdCB0ZXN0IHdyaXR0ZW4gYWdhaW5zdCB0aGlzIGZ1bmN0aW9uIGFzc2VydGVkCi8vIHRoZSByaWdodCBtYWduaXR1ZGUgd2l0aCB0aGUgd3Jvbmcgc2lnbiBhbmQgd2FzIHJlZCBmb3IgaXQsIHdoaWNoIGlzIHdoeQovLyB0aGlzIHBhcmFncmFwaCBleGlzdHMgcmF0aGVyIHRoYW4gYSByZWFkZXIgZGlzY292ZXJpbmcgaXQuCi8vCi8vIFdoYXQgYG9mZnNldHNgIGRvZXMgTk9UIHByb3ZlIGlzIGpvdXJuYWwncyBvYmxpZ2F0aW9uIDcsIGluaGVyaXRlZCBoZXJlCi8vIHZlcmJhdGltOiB0aGUgdHdvIHN1YnRvdGFscyBhcmUgYSBwYXJ0aXRpb24gb2YgdGhlIHNhbWUgYWRkZW5kcywgc28KLy8gcmVjbGFzc2lmeWluZyBldmVyeSBhY2NvdW50IGluIHRoZSBjaGFydCBjaGFuZ2VzIGJvdGggYW5kIGxlYXZlcyBgb2Zmc2V0c2AKLy8gdHJ1ZS4gQSBLaW5kIHNldCB3cm9uZ2x5IGF0IE9wZW4gdGltZSBpcyBpbnZpc2libGUgdG8gaXQuIFdoYXQgcGlucyB0aGlzCi8vIHJlYWxtJ3MgY2hhcnQgaXMgdGhlIFBBSVIg4oCUIGRlYml0Tm9ybWFsID09IEludmVudG9yeURlYml0ICsgQ09HU0RlYml0IGFuZAovLyBjcmVkaXROb3JtYWwgPT0gLUNvbnRyaWJ1dGVkQ3JlZGl0IOKAlCBhbmQgdGhlIHN1aXRlIGFzc2VydHMgZXhhY3RseSB0aGF0LgovLwovLyBTaGFycGVyIHRoYW4gdGhhdCwgYmVjYXVzZSB0aGUgcGFydGl0aW9uIGlzIGFyaXRobWV0aWNhbGx5IGluZXJ0OiB0aGUgdHdvCi8vIHN1YnRvdGFscyBhcmUgYWRkZWQgYmFjayB0b2dldGhlciwgc28gYG9mZnNldHNgIHJlZHVjZXMgdG8KLy8gzqMgZGViaXRzID09IM6jIGNyZWRpdHMgb3ZlciB0aGUgd2hvbGUgY2hhcnQsIHdoaWNoIGlzIHRoZSBGSVJTVCBvZiB0aGUgdGhyZWUKLy8gY29uanVuY3RzIFtJc0JhbGFuY2VkXSBjaGVja3MuIEEgYmFsYW5jZWQgYm9vayB0aGVyZWZvcmUgYWx3YXlzIG9mZnNldHMsIGFuZAovLyBgb2Zmc2V0c2AgY2FycmllcyBubyBmYWN0IFtJc0JhbGFuY2VkXSBoYXMgbm90IGFscmVhZHkgY2FycmllZCBtb3JlCi8vIHN0cm9uZ2x5LiBUaGUgaW5mb3JtYXRpdmUgaGFsZiBvZiB0aGlzIGZ1bmN0aW9uIGlzIHRoZSBQQUlSIE9GIEZJR1VSRVMsIG5vdAovLyB0aGUgYm9vbGVhbiDigJQgdGhlIGZpZ3VyZXMgbW92ZSB3aGVuIGEgS2luZCBjaGFuZ2VzIGFuZCB0aGUgYm9vbGVhbiBkb2VzIG5vdC4KLy8gKFRoZSB0d28gd2Fsa3MgYWNjdW11bGF0ZSBpbiBkaWZmZXJlbnQgb3JkZXJzLCBzbyBhIG1pZC1zdW0gb3ZlcmZsb3cgY291bGQKLy8gaW4gcHJpbmNpcGxlIHNlcGFyYXRlIHRoZW0uIEF0IDgxOTIgZW50cmllcyBpdCB3b3VsZCB0YWtlIGFtb3VudHMgbm8KLy8gcmVnaXN0ZXIgY2FuIHJlYWNoLCBhbmQgaXQgaXMgbm90IGEgc2Vjb25kIGluZGVwZW5kZW50IGNoZWNrLikKZnVuYyBFcXVhdGlvbihvd25lciBhZGRyZXNzKSAoZGViaXROb3JtYWwsIGNyZWRpdE5vcm1hbCBpbnQ2NCwgb2Zmc2V0cyBib29sKSB7CglyZXR1cm4gbXVzdFJlZyhvd25lcikuYm9vay5BY2NvdW50aW5nRXF1YXRpb24oKQp9CgovLyBSZWRlcml2ZSByZS13YWxrcyBldmVyeSBwb3N0aW5nIGluIHRoZSBib29rIGFuZCByZXBvcnRzIHdoZXRoZXIgdGhlIGFjY291bnQKLy8gdG90YWxzIGFncmVlIHdpdGggdGhlIGpvdXJuYWwuCi8vCi8vIEl0IGlzIGEgRlJFRSByZWFkLCB1bmxpa2Ugci9ib29rcycgb3duZXItb25seSBlcXVpdmFsZW50LCBmb3IgdGhlIHJlYXNvbgovLyBnaXZlbiBpbiB0aGUgcGFja2FnZSBkb2MuIFRoZSBjb3N0IGlzIGxpbmVhciBpbiB0aGUgcG9zdGluZyBjb3VudCwgd2hpY2ggaXMKLy8gd2hhdCBNYXhFbnRyaWVzUGVyUmVnaXN0ZXIgYm91bmRzLgpmdW5jIFJlZGVyaXZlKG93bmVyIGFkZHJlc3MpIChkZWJpdHMsIGNyZWRpdHMgaW50NjQsIGFncmVlcyBib29sKSB7CglyZXR1cm4gbXVzdFJlZyhvd25lcikuYm9vay5SZWRlcml2ZUZyb21Kb3VybmFsKCkKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFRoZSBpbnZhcmlhbnRzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gSW52YXJpYW50IGlzIHRoZSBwZXItaXRlbSBkZXJpdmF0aW9uIGNoZWNrLCBhbmQgaXQgaXMgdGhpcyByZWFsbSdzIGNlbnRyYWwKLy8gY2xhaW06Ci8vCi8vCXBvc3RlZENPR1MgPT0gcG9vbC5DaGFyZ2VkQ29zdCgpCi8vCi8vIFRoZSBsZWZ0IGZpZ3VyZSBpcyB3aGF0IHRoaXMgcmVhbG0gcG9zdGVkIHRvIDUwMDAgZm9yIHRoZSBpdGVtOyB0aGUgcmlnaHQgaXMKLy8gd2hhdCB0aGUgcG9vbCBzYXlzIGl0IGNoYXJnZWQuIFRoZXkgYXJlIG1haW50YWluZWQgYnkgZGlmZmVyZW50IGNvZGUgaW4KLy8gZGlmZmVyZW50IHBhY2thZ2VzLCBzbyBhIGZhbHNlIGhlcmUgbWVhbnMgdGhlIHJlYWxtIHBvc3RlZCBhbiBhbW91bnQgaXRzIG93bgovLyBsb3RzIGRvIG5vdCBpbXBseSDigJQgd2hpY2ggbm8gY29kZSBwYXRoIGluIHRoaXMgcmVhbG0gY2FuIHByb2R1Y2UsIGFuZCB3aGljaAovLyBpcyBleGFjdGx5IHdoeSBpdCBpcyB3b3J0aCBleHBvcnRpbmcuIEEgY2xhaW0gaXMgd29ydGggbW9yZSBjaGVja2FibGUgYnkgYQovLyBzdHJhbmdlciB0aGFuIGFzc2VydGVkIGluIGEgY29tbWVudC4KLy8KLy8gVGhlIHJlY2VpcHQgc2lkZSBpcyBjaGVja2VkIHRoZSBzYW1lIHdheSBieSBbSW52YXJpYW50UmVjZWlwdHNdLgpmdW5jIEludmFyaWFudChvd25lciBhZGRyZXNzLCBza3Ugc3RyaW5nKSAocG9zdGVkLCBkZXJpdmVkIGludDY0LCBhZ3JlZXMgYm9vbCkgewoJaXQgOj0gbXVzdEl0ZW0obXVzdFJlZyhvd25lciksIHNrdSkKCWQgOj0gaXQucG9vbC5DaGFyZ2VkQ29zdCgpCglyZXR1cm4gaXQucG9zdGVkQ09HUywgZCwgaXQucG9zdGVkQ09HUyA9PSBkCn0KCi8vIEludmFyaWFudFJlY2VpcHRzIGlzIFtJbnZhcmlhbnRdIGZvciB0aGUgcmVjZWlwdCBzaWRlOgovLwovLwlwb3N0ZWRSZWN2ID09IHBvb2wuUmVjZWl2ZWRDb3N0KCkKZnVuYyBJbnZhcmlhbnRSZWNlaXB0cyhvd25lciBhZGRyZXNzLCBza3Ugc3RyaW5nKSAocG9zdGVkLCBkZXJpdmVkIGludDY0LCBhZ3JlZXMgYm9vbCkgewoJaXQgOj0gbXVzdEl0ZW0obXVzdFJlZyhvd25lciksIHNrdSkKCWQgOj0gaXQucG9vbC5SZWNlaXZlZENvc3QoKQoJcmV0dXJuIGl0LnBvc3RlZFJlY3YsIGQsIGl0LnBvc3RlZFJlY3YgPT0gZAp9CgovLyBJdGVtQ3Jvc3NGb290IGlzIHAvbG90cycgb3duIGNvc3QgaWRlbnRpdHkgZm9yIG9uZSBpdGVtOgovLwovLwlyZWNlaXZlZENvc3QgPT0gY2hhcmdlZENvc3QgKyBjb3N0T25IYW5kCi8vCi8vIFJlY2VpdmVkIGFuZCBjaGFyZ2VkIGFyZSBjb3VudGVyczsgb24taGFuZCBpcyBhIHdhbGsgb2YgdGhlIGxpdmUgbG90cy4gVGhlCi8vIGlkZW50aXR5IHRoZXJlZm9yZSBjb21wYXJlcyB0d28gaW5kZXBlbmRlbnRseSBtYWludGFpbmVkIHRoaW5ncywgd2hpY2ggaXMKLy8gd2h5IHAvbG90cyBrZWVwcyB0aGVtIGFwYXJ0LgpmdW5jIEl0ZW1Dcm9zc0Zvb3Qob3duZXIgYWRkcmVzcywgc2t1IHN0cmluZykgKHJlY2VpdmVkLCBjaGFyZ2VkLCBvbkhhbmQgaW50NjQsIGZvb3RzIGJvb2wpIHsKCXJldHVybiBtdXN0SXRlbShtdXN0UmVnKG93bmVyKSwgc2t1KS5wb29sLkNyb3NzRm9vdENvc3QoKQp9CgovLyBJdGVtQ3Jvc3NGb290UXR5IGlzIHRoZSBxdWFudGl0eSBpZGVudGl0eSBmb3Igb25lIGl0ZW06Ci8vCi8vCXJlY2VpdmVkUXR5ID09IGNvbnN1bWVkUXR5ICsgcXR5T25IYW5kCi8vCi8vIEl0IGlzIG5vdCBpbXBsaWVkIGJ5IFtJdGVtQ3Jvc3NGb290XTogY29zdHMgYW5kIHF1YW50aXRpZXMgY2FuIGRpc2FncmVlCi8vIGluZGVwZW5kZW50bHksIGFuZCBhIGJ1ZyB0aGF0IG1vdmVkIGNvc3Qgd2l0aG91dCBtb3ZpbmcgcXVhbnRpdHkgd291bGQgYmUKLy8gaW52aXNpYmxlIHRvIHRoZSBjb3N0IGlkZW50aXR5IGFsb25lLgpmdW5jIEl0ZW1Dcm9zc0Zvb3RRdHkob3duZXIgYWRkcmVzcywgc2t1IHN0cmluZykgKHJlY2VpdmVkLCBjb25zdW1lZCwgb25IYW5kIGludDY0LCBmb290cyBib29sKSB7CglyZXR1cm4gbXVzdEl0ZW0obXVzdFJlZyhvd25lciksIHNrdSkucG9vbC5Dcm9zc0Zvb3RRdHkoKQp9CgovLyBDcm9zc0Zvb3RJbnZlbnRvcnkgaXMgdGhlIHJlZ2lzdGVyLXdpZGUgY2hlY2sgb24gMTMwMDogdGhlIHN1bSBvZiBldmVyeQovLyBpdGVtJ3MgY2FycnlpbmcgdmFsdWUgYWdhaW5zdCB0aGUgbGVkZ2VyIGJhbGFuY2UuCi8vCi8vIFRoZSBpZGVudGl0eSBpcyBFWEFDVCwgbm90IGFwcHJveGltYXRlLCBhbmQgdGhlIHJlYXNvbiBpcyBzdHJ1Y3R1cmFsOiB0aGlzCi8vIHJlYWxtIGV4cG9zZXMgbm8gZ2VuZXJhbCBwb3N0aW5nIGVudHJ5cG9pbnQsIHNvIGl0IGlzIGl0cyBib29rJ3Mgb25seQovLyB3cml0ZXIuIEFkZGluZyBhIGdlbmVyYWwgUG9zdCB3b3VsZCBkZXN0cm95IHRoaXMgY2hlY2ssIHdoaWNoIGlzIHRoZSBjb3N0IG9mCi8vIGFkZGluZyBvbmUuCmZ1bmMgQ3Jvc3NGb290SW52ZW50b3J5KG93bmVyIGFkZHJlc3MpIChzdW1PbkhhbmQsIGJhbGFuY2UgaW50NjQsIGFncmVlcyBib29sKSB7CglyIDo9IG11c3RSZWcob3duZXIpCgl2YXIgc3VtIGludDY0Cgl2YXIgZmFpbGVkIGJvb2wKCXIuaXRlbXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQljLCBlcnIgOj0gdi4oKml0ZW0pLnBvb2wuQ29zdE9uSGFuZCgpCgkJaWYgZXJyICE9IG5pbCB7CgkJCWZhaWxlZCA9IHRydWUKCQkJcmV0dXJuIHRydWUKCQl9CgkJc3VtICs9IGMKCQlyZXR1cm4gZmFsc2UKCX0pCgliIDo9IEludmVudG9yeURlYml0KG93bmVyKQoJaWYgZmFpbGVkIHsKCQkvLyBBIHBvb2wgdGhhdCBjYW5ub3QgdmFsdWUgaXRzZWxmIG1ha2VzIHRoZSBzdW0gbWVhbmluZ2xlc3MsIHNvIHRoZQoJCS8vIGNoZWNrIFJFUE9SVFMgZGlzYWdyZWVtZW50IHJhdGhlciB0aGFuIHBhbmlja2luZyBvciBxdWlldGx5CgkJLy8gcmV0dXJuaW5nIGEgc2hvcnQgc3VtLiBBIHBhcnRpYWwgdG90YWwgY29tcGFyZWQgYWdhaW5zdCBhIGZ1bGwKCQkvLyBiYWxhbmNlIGlzIHRoZSBzaGFwZSBvZiBhIGZhbHNlIHBhc3MuCgkJcmV0dXJuIDAsIGIsIGZhbHNlCgl9CglyZXR1cm4gc3VtLCBiLCBzdW0gPT0gYgp9CgovLyBDcm9zc0Zvb3RDT0dTIGlzIHRoZSByZWdpc3Rlci13aWRlIGNoZWNrIG9uIDUwMDA6IHRoZSBzdW0gb2YgZXZlcnkgaXRlbSdzCi8vIGNoYXJnZWQgY29zdCBhZ2FpbnN0IHRoZSBsZWRnZXIgYmFsYW5jZS4KZnVuYyBDcm9zc0Zvb3RDT0dTKG93bmVyIGFkZHJlc3MpIChzdW1DaGFyZ2VkLCBiYWxhbmNlIGludDY0LCBhZ3JlZXMgYm9vbCkgewoJciA6PSBtdXN0UmVnKG93bmVyKQoJdmFyIHN1bSBpbnQ2NAoJci5pdGVtcy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCXN1bSArPSB2LigqaXRlbSkucG9vbC5DaGFyZ2VkQ29zdCgpCgkJcmV0dXJuIGZhbHNlCgl9KQoJYiA6PSBDT0dTRGViaXQob3duZXIpCglyZXR1cm4gc3VtLCBiLCBzdW0gPT0gYgp9CgovLyBDcm9zc0Zvb3RDb250cmlidXRlZCBpcyB0aGUgcmVnaXN0ZXItd2lkZSBjaGVjayBvbiAzOTAwOiB0aGUgc3VtIG9mIGV2ZXJ5Ci8vIGl0ZW0ncyByZWNlaXZlZCBjb3N0IGFnYWluc3QgdGhlIGxlZGdlciBiYWxhbmNlLgpmdW5jIENyb3NzRm9vdENvbnRyaWJ1dGVkKG93bmVyIGFkZHJlc3MpIChzdW1SZWNlaXZlZCwgYmFsYW5jZSBpbnQ2NCwgYWdyZWVzIGJvb2wpIHsKCXIgOj0gbXVzdFJlZyhvd25lcikKCXZhciBzdW0gaW50NjQKCXIuaXRlbXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQlzdW0gKz0gdi4oKml0ZW0pLnBvb2wuUmVjZWl2ZWRDb3N0KCkKCQlyZXR1cm4gZmFsc2UKCX0pCgliIDo9IENvbnRyaWJ1dGVkQ3JlZGl0KG93bmVyKQoJcmV0dXJuIHN1bSwgYiwgc3VtID09IGIKfQoKLy8gQ3Jvc3NGb290IHJlcG9ydHMgYWxsIGZvdXIgcmVnaXN0ZXItd2lkZSBhZ3JlZW1lbnRzIGFzIHNlcGFyYXRlIGJvb2xzLgovLwovLyBUaGV5IGFyZSByZXR1cm5lZCBTRVBBUkFURUxZIGFuZCB0aGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gc2luZ2xlIGFnZ3JlZ2F0ZQovLyBib29sOiBhIG9uZS13b3JkIHZlcmRpY3Qgb3ZlciBmb3VyIGNoZWNrcyBpcyB0aGUgc2hhcGUgdGhhdCBnZXRzIHF1b3RlZAovLyB3aXRob3V0IGl0cyBjb3ZlcmFnZSwgYW5kIGEgcmVhZGVyIHdobyB3YW50cyB0aGUgZmlndXJlcyBiZWhpbmQgYW55IG9uZSBvZgovLyB0aGVzZSBoYXMgW0Nyb3NzRm9vdEludmVudG9yeV0sIFtDcm9zc0Zvb3RDT0dTXSwgW0Nyb3NzRm9vdENvbnRyaWJ1dGVkXSBhbmQKLy8gW0VxdWF0aW9uXS4KZnVuYyBDcm9zc0Zvb3Qob3duZXIgYWRkcmVzcykgKGludmVudG9yeUFncmVlcywgY29nc0FncmVlcywgY29udHJpYnV0ZWRBZ3JlZXMsIGVxdWF0aW9uT2Zmc2V0cyBib29sKSB7CglfLCBfLCBpbnYgOj0gQ3Jvc3NGb290SW52ZW50b3J5KG93bmVyKQoJXywgXywgY29ncyA6PSBDcm9zc0Zvb3RDT0dTKG93bmVyKQoJXywgXywgY29udHJpYiA6PSBDcm9zc0Zvb3RDb250cmlidXRlZChvd25lcikKCV8sIF8sIG9mZnNldHMgOj0gRXF1YXRpb24ob3duZXIpCglyZXR1cm4gaW52LCBjb2dzLCBjb250cmliLCBvZmZzZXRzCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZW5kZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBSZW5kZXIgc2hvd3MgdGhlIHJlYWxtIGluZGV4IGF0ICIvIiwgb25lIG93bmVyJ3MgcmVnaXN0ZXIgYXQgIi88YWRkcmVzcz4iLAovLyBhbmQgb25lIGl0ZW0gYXQgIi88YWRkcmVzcz4vPHNrdT4iLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXAgOj0gc3RyaW5ncy5UcmltU3BhY2Uoc3RyaW5ncy5UcmltKHBhdGgsICIvIikpCglpZiBwID09ICIiIHsKCQlyZXR1cm4gcmVuZGVySW5kZXgoKQoJfQoJaWYgaSA6PSBzdHJpbmdzLkluZGV4KHAsICIvIik7IGkgPj0gMCB7CgkJcmV0dXJuIHJlbmRlckl0ZW0oYWRkcmVzcyhwWzppXSksIHBbaSsxOl0pCgl9CglyZXR1cm4gcmVuZGVyUmVnaXN0ZXIoYWRkcmVzcyhwKSkKfQoKZnVuYyByZW5kZXJJbmRleCgpIHN0cmluZyB7Cgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglzYi5Xcml0ZVN0cmluZygiIyBpbnZlbnRvcnkg4oCUIGEgc3ViLWxlZGdlciB3aG9zZSBDT0dTIGlzIGRlcml2ZWRcblxuIikKCXNiLldyaXRlU3RyaW5nKCJDb3N0IGxvdHMgaGVsZCBhcyBzdGF0ZSwgdGhlIGNvc3Qgb2YgYSBzaGlwbWVudCAqKmRlcml2ZWQqKiAiKQoJc2IuV3JpdGVTdHJpbmcoImZyb20gdGhvc2UgbG90cyBieSB0aGUgaXRlbSdzIGNvc3RpbmcgbWV0aG9kLCBhbmQgKipubyAiKQoJc2IuV3JpdGVTdHJpbmcoImN1c3RvZHkgb2YgYW55dGhpbmcqKi5cblxuIikKCglzYi5Xcml0ZVN0cmluZygiPiBBIGdlbmVyYWwgbGVkZ2VyIHRha2VzIHRoZSBhbW91bnQgZnJvbSBpdHMgY2FsbGVyLCBzbyBpdCAiKQoJc2IuV3JpdGVTdHJpbmcoImNhbm5vdCB0ZWxsIGEgY29ycmVjdGx5IGNvc3RlZCBzaGlwbWVudCBmcm9tIGEgZmxhdHRlcmluZyAiKQoJc2IuV3JpdGVTdHJpbmcoIm9uZS4gVGhpcyByZWFsbSBuZXZlciB0YWtlcyBhbiBhbW91bnQ6IGBTaGlwYCB0YWtlcyBhICIpCglzYi5Xcml0ZVN0cmluZygicXVhbnRpdHkgYW5kIHJldHVybnMgdGhlIGNvc3QgaXQgZGVyaXZlZC4gVGhhdCBpcyB0aGUgd2hvbGUgIikKCXNiLldyaXRlU3RyaW5nKCJwcm9kdWN0LCBhbmQgaXQgcHJvdmVzIGFyaXRobWV0aWMg4oCUIG5vdCB0cnV0aC4gTm90aGluZyBoZXJlICIpCglzYi5Xcml0ZVN0cmluZygidGllcyBhIGNvc3QgZmlndXJlIHRvIGEgcmVhbCBob2xkaW5nLlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBTdGF0ZVxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIi0gcmVnaXN0ZXJzIG9wZW5lZDogKioiICsgc3RyY29udi5JdG9hKHJlZ0NvdW50KSArICIqKlxuIikKCXNiLldyaXRlU3RyaW5nKCItIGNoYWluIGhlaWdodDogKioiICsgc3RyY29udi5Gb3JtYXRJbnQocnVudGltZS5DaGFpbkhlaWdodCgpLCAxMCkgKyAiKipcblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgVGhlIGNoYXJ0IGlzIHRocmVlIGFjY291bnRzIGFuZCBpcyBmaXhlZFxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgY29kZSB8IG5hbWUgfCBraW5kIHwgbm9ybWFsIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifC0tLXwtLS18LS0tfC0tLXxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBgIiArIEludmVudG9yeUNvZGUgKyAiYCB8ICIgKyBJbnZlbnRvcnlOYW1lICsgIiB8IGFzc2V0IHwgZGViaXQgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGAiICsgQ09HU0NvZGUgKyAiYCB8ICIgKyBDT0dTTmFtZSArICIgfCBleHBlbnNlIHwgZGViaXQgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGAiICsgQ29udHJpYkNvZGUgKyAiYCB8ICIgKyBDb250cmliTmFtZSArICIgfCBlcXVpdHkgfCBjcmVkaXQgfFxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIkEgcmVjZWlwdCBpcyBkZWJpdCBgIiArIEludmVudG9yeUNvZGUgKyAiYCAvIGNyZWRpdCBgIikKCXNiLldyaXRlU3RyaW5nKENvbnRyaWJDb2RlICsgImAuIEEgc2hpcG1lbnQgaXMgZGViaXQgYCIgKyBDT0dTQ29kZSkKCXNiLldyaXRlU3RyaW5nKCJgIC8gY3JlZGl0IGAiICsgSW52ZW50b3J5Q29kZSArICJgIGZvciB0aGUgZGVyaXZlZCBjb3N0LiAiKQoJc2IuV3JpdGVTdHJpbmcoIlRoZXJlIGlzIG5vIHdheSB0byBvcGVuIGEgZm91cnRoIGFjY291bnQuXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiKipgIiArIENvbnRyaWJDb2RlICsgImAgaXMgYSBwbHVnLioqIEEgZGViaXQgdG8gaW52ZW50b3J5ICIpCglzYi5Xcml0ZVN0cmluZygibmVlZHMgYSBjcmVkaXQgbGVnLCBhbmQgZXZlcnkgY2FuZGlkYXRlIGFzc2VydHMgc29tZXRoaW5nICIpCglzYi5Xcml0ZVN0cmluZygidGhpcyByZWFsbSBjYW5ub3Qgb2JzZXJ2ZSDigJQgYSBwYXlhYmxlIGl0IHdvdWxkIG5ldmVyICIpCglzYi5Xcml0ZVN0cmluZygicmVsaWV2ZSwgYSBjYXNoIGJhbGFuY2UgaXQgZG9lcyBub3QgaG9sZCwgb3IgYSAiKQoJc2IuV3JpdGVTdHJpbmcoImNvbnRyaWJ1dGlvbi4gVGhlIGNvbnRyaWJ1dGlvbiB3YXMgY2hvc2VuIGJlY2F1c2UgaXQgaXMgIikKCXNiLldyaXRlU3RyaW5nKCJ0aGUgb25seSBvbmUgdGhhdCBzdGF5cyBjb2hlcmVudCB3aXRoIG5vIGZvbGxvdy11cCBldmVudCwgIikKCXNiLldyaXRlU3RyaW5nKCIqKm5vdCoqIGJlY2F1c2UgaXQgaXMgdHJ1ZS4gQSByZWdpc3RlciB3aG9zZSBnb29kcyB3ZXJlICIpCglzYi5Xcml0ZVN0cmluZygiYm91Z2h0IG9uIGNyZWRpdCB1bmRlcnN0YXRlcyBsaWFiaWxpdGllcyBieSBleGFjdGx5IHRoaXMgIikKCXNiLldyaXRlU3RyaW5nKCJiYWxhbmNlLlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBDb3N0aW5nIG1ldGhvZHNcblxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGVudHJ5cG9pbnQgfCBtZXRob2QgfCBsb3RzIGhlbGQgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8LS0tfC0tLXwtLS18XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYEFkZEZJRk9gIHwgIiArIGxvdHMuRklGTy5TdHJpbmcoKSArICIgfCBvbmUgcGVyIGxpdmUgcmVjZWlwdCB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYEFkZExJRk9gIHwgIiArIGxvdHMuTElGTy5TdHJpbmcoKSArICIgfCBvbmUgcGVyIGxpdmUgcmVjZWlwdCB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYEFkZFdBVkdgIHwgIiArIGxvdHMuV0FWRy5TdHJpbmcoKSArICIgfCBhbHdheXMgZXhhY3RseSBvbmUgfFxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIkZpeGVkIGF0IGNyZWF0aW9uLiBDaGFuZ2luZyBhbiBpdGVtJ3MgbWV0aG9kIG1pZC1saWZlICIpCglzYi5Xcml0ZVN0cmluZygid291bGQgcmVjb3N0IG5vdGhpbmcgYWxyZWFkeSBjaGFyZ2VkIGJ1dCB3b3VsZCBjaGFuZ2Ugd2hhdCAiKQoJc2IuV3JpdGVTdHJpbmcoInRoZSBuZXh0IHNoaXBtZW50IGNvc3RzLCB3aGljaCBpcyBhIHJlc3RhdGVtZW50IGEgIikKCXNiLldyaXRlU3RyaW5nKCJzdWItbGVkZ2VyIG11c3Qgbm90IGJlIGFibGUgdG8gbWFrZSBzaWxlbnRseS5cblxuIikKCXNiLldyaXRlU3RyaW5nKCJcIkFsd2F5cyBleGFjdGx5IG9uZVwiIGRvZXMgbm90IG1lYW4gdW5jb25zdHJhaW5lZC4gQSAiKQoJc2IuV3JpdGVTdHJpbmcobG90cy5XQVZHLlN0cmluZygpICsgIiBpdGVtIGVzY2FwZXMgdGhlIGxpdmUtbG90IGJvdW5kIGFuZCAiKQoJc2IuV3JpdGVTdHJpbmcoImdhaW5zIGEgcmVmdXNhbCB0aGUgb3RoZXIgdHdvIG5ldmVyIGV2YWx1YXRlOiBtZXJnaW5nIGEgIikKCXNiLldyaXRlU3RyaW5nKCJyZWNlaXB0IGludG8gdGhlIHNpbmdsZSBsb3QgY2FuIGJyZWFjaCB0aGF0IGxvdCdzIG93biAiKQoJc2IuV3JpdGVTdHJpbmcoIm92ZXJmbG93IHByZWNvbmRpdGlvbiwgYW5kIHdoZXRoZXIgaXQgZG9lcyBkZXBlbmRzIG9uIHRoZSAiKQoJc2IuV3JpdGVTdHJpbmcoIml0ZW0ncyBhY2N1bXVsYXRlZCBoaXN0b3J5IHJhdGhlciB0aGFuIG9uIHRoZSByZWNlaXB0LiBTbyAiKQoJc2IuV3JpdGVTdHJpbmcoImBMb3RDYXBhY2l0eWAgaXMgdGhlIHdyb25nIGhlYWRyb29tIGZpZ3VyZSBmb3IgYSAiKQoJc2IuV3JpdGVTdHJpbmcobG90cy5XQVZHLlN0cmluZygpICsgIiBpdGVtIOKAlCBpdCByZXBvcnRzIHRoZSBvbmUgbGltaXQgdGhhdCAiKQoJc2IuV3JpdGVTdHJpbmcoImNhbm5vdCBiaW5kIHRoZXJlLlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBCb3VuZHNcblxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGJvdW5kIHwgdmFsdWUgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8LS0tfC0tLXxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBpdGVtcyBwZXIgcmVnaXN0ZXIgfCAiICsgc3RyY29udi5JdG9hKE1heEl0ZW1zUGVyUmVnaXN0ZXIpICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgbGl2ZSBsb3RzIHBlciBpdGVtIHwgIiArIHN0cmNvbnYuSXRvYShNYXhMb3RzUGVySXRlbSkgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBlbnRyaWVzIHBlciByZWdpc3RlciB8ICIgKyBzdHJjb252Lkl0b2EoTWF4RW50cmllc1BlclJlZ2lzdGVyKSArICIgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IHNrdSBsZW5ndGggfCAiICsgc3RyY29udi5JdG9hKE1heFNLVUxlbikgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBuYW1lIGxlbmd0aCB8ICIgKyBzdHJjb252Lkl0b2EoTWF4SXRlbU5hbWVMZW4pICsgIiB8XG5cbiIpCglzYi5Xcml0ZVN0cmluZygiVGhlIGVudHJ5IGJvdW5kIGlzICoqcmVnaXN0ZXItd2lkZSBhbmQgc2hhcmVkKiosIG5vdCBwZXIgIikKCXNiLldyaXRlU3RyaW5nKCJpdGVtLCBhbmQgdGhhdCBpcyB0aGUgb25lIGJvdW5kIGhlcmUgd2l0aCBhIGJsYXN0IHJhZGl1cyAiKQoJc2IuV3JpdGVTdHJpbmcoIndpZGVyIHRoYW4gdGhlIHRoaW5nIGl0IGxpbWl0cy4gRXZlcnkgY29zdGVkIHJlY2VpcHQgYW5kICIpCglzYi5Xcml0ZVN0cmluZygiZXZlcnkgY29zdGVkIHNoaXBtZW50IG9mIGV2ZXJ5IFNLVSBzcGVuZHMgb25lIGVudHJ5IG91dCBvZiAiKQoJc2IuV3JpdGVTdHJpbmcoInRoZSBzYW1lICIgKyBzdHJjb252Lkl0b2EoTWF4RW50cmllc1BlclJlZ2lzdGVyKSArICIsIGFuZCAiKQoJc2IuV3JpdGVTdHJpbmcoImVudHJpZXMgYXJlIG5ldmVyIGZyZWVkIOKAlCBleGhhdXN0ZWQgbG90cyBhcmUgZHJvcHBlZCwgIikKCXNiLldyaXRlU3RyaW5nKCJwb3N0aW5ncyBhcmUgbm90LiBTbyBhIHNpbmdsZSBoaWdoLXR1cm5vdmVyIFNLVSBjYW4gc3BlbmQgIikKCXNiLldyaXRlU3RyaW5nKCJ0aGUgd2hvbGUgYnVkZ2V0IGFuZCBsZWF2ZSB0aGUgb3RoZXIgIikKCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShNYXhJdGVtc1BlclJlZ2lzdGVyLTEpICsgIiBpdGVtcyB1bmFibGUgdG8gIikKCXNiLldyaXRlU3RyaW5nKCJyZWNlaXZlIG9yIHNoaXAsIGVhY2ggd2l0aCBjYXBhY2l0eSBvZiBpdHMgb3duIHRvIHNwYXJlLiAiKQoJc2IuV3JpdGVTdHJpbmcoIlRoZXJlIGlzIGRlbGliZXJhdGVseSBubyBhcmNoaXZlIGFuZCBubyByZXNldCDigJQgZWl0aGVyICIpCglzYi5Xcml0ZVN0cmluZygid291bGQgZGVzdHJveSB0aGUgcmVjb3JkIHRoZSBjcm9zcy1mb290cyBhcmUgY2hlY2tlZCAiKQoJc2IuV3JpdGVTdHJpbmcoImFnYWluc3Qg4oCUIHNvIHRoZSByZW1lZHkgaXMgYSBzZWNvbmQgcmVnaXN0ZXIgdW5kZXIgYSAiKQoJc2IuV3JpdGVTdHJpbmcoInNlY29uZCBhZGRyZXNzLCBhbmQgYnVzeSBTS1VzIGFyZSB3b3J0aCBzZXBhcmF0aW5nIGJlZm9yZSAiKQoJc2IuV3JpdGVTdHJpbmcoInRoZXkgYXJlIGJ1c3kuIFdhdGNoIGBDYXBhY2l0eWAncyBzZWNvbmQgZmlndXJlLCB3aGljaCAiKQoJc2IuV3JpdGVTdHJpbmcoImNvdW50cyBkb3duIGZvciB0aGUgcmVnaXN0ZXIgYW5kIG5vdCBmb3Igb25lIGl0ZW0uXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiQSBTS1UgbWF5IHVzZSBvbmx5IGxldHRlcnMsIGRpZ2l0cywgYC5gLCBgX2AgYW5kIGAtYDogaXQgaXMgIikKCXNiLldyaXRlU3RyaW5nKCJhbiBpbmRleCBrZXksIGEgcGFnZSBwYXRoIGFuZCBhIHRhYmxlIGNlbGwgYXQgb25jZSwgYW5kIGEgIikKCXNiLldyaXRlU3RyaW5nKCJjaGFyc2V0IGNoZWNrZWQgb24gdGhlIHdheSBpbiBiZWF0cyBlc2NhcGluZyBhdCB0aHJlZSB1c2UgIikKCXNiLldyaXRlU3RyaW5nKCJzaXRlcy4gQ2FzZSBpcyBzaWduaWZpY2FudC5cblxuIikKCXNiLldyaXRlU3RyaW5nKCJUaGVyZSBpcyAqKm5vIHdyaXRlLW9mZioqOiBnb29kcyBjYW5ub3QgbGVhdmUgd2l0aG91dCAiKQoJc2IuV3JpdGVTdHJpbmcoImJlaW5nIGNoYXJnZWQgdG8gYCIgKyBDT0dTQ29kZSArICJgLCBzbyBzaHJpbmthZ2UgaXMgIikKCXNiLldyaXRlU3RyaW5nKCJpbmRpc3Rpbmd1aXNoYWJsZSBmcm9tIGEgc2FsZS4gQSByZWFsIGxpbWl0YXRpb24sIG5hbWVkICIpCglzYi5Xcml0ZVN0cmluZygicmF0aGVyIHRoYW4gaGlkZGVuLlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBSZWFkaW5nIGEgcmVnaXN0ZXJcblxuIikKCXNiLldyaXRlU3RyaW5nKCJgIiArIFJlYWxtUGF0aCArICI6PGFkZHJlc3M+YFxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoImAiICsgUmVhbG1QYXRoICsgIjo8YWRkcmVzcz4vPHNrdT5gXG4iKQoJcmV0dXJuIHNiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVyUmVnaXN0ZXIob3duZXIgYWRkcmVzcykgc3RyaW5nIHsKCXIsIG9rIDo9IHJlZyhvd25lcikKCWlmICFvayB7CgkJcmV0dXJuICIjIE5vIHJlZ2lzdGVyXG5cbk5vIHJlZ2lzdGVyIGV4aXN0cyBmb3IgYCIgKwoJCQlzYW5pdGl6ZS5JbmxpbmVUZXh0KG93bmVyLlN0cmluZygpKSArICJgLlxuIgoJfQoKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKCIjIFJlZ2lzdGVyIG9mICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KG93bmVyLlN0cmluZygpKSArICJcblxuIikKCXNiLldyaXRlU3RyaW5nKCItIG9wZW5lZCBhdCBoZWlnaHQ6ICoqIiArIHN0cmNvbnYuRm9ybWF0SW50KHIub3BlbmVkQXQsIDEwKSArICIqKlxuIikKCXNiLldyaXRlU3RyaW5nKCItIGNoYWluIGhlaWdodDogKioiICsgc3RyY29udi5Gb3JtYXRJbnQocnVudGltZS5DaGFpbkhlaWdodCgpLCAxMCkgKyAiKipcbiIpCglzYi5Xcml0ZVN0cmluZygiLSBpdGVtczogKioiICsgc3RyY29udi5JdG9hKHIuaXRlbXMuU2l6ZSgpKSArICIqKiAvICIgKwoJCXN0cmNvbnYuSXRvYShNYXhJdGVtc1BlclJlZ2lzdGVyKSArICJcbiIpCglzYi5Xcml0ZVN0cmluZygiLSBlbnRyaWVzOiAqKiIgKyBzdHJjb252Lkl0b2Eoci5ib29rLkVudHJ5Q291bnQoKSkgKyAiKiogLyAiICsKCQlzdHJjb252Lkl0b2EoTWF4RW50cmllc1BlclJlZ2lzdGVyKSArICJcblxuIikKCglzdW1PbkhhbmQsIGludkJhbCwgaW52T0sgOj0gQ3Jvc3NGb290SW52ZW50b3J5KG93bmVyKQoJc3VtQ2hhcmdlZCwgY29nc0JhbCwgY29nc09LIDo9IENyb3NzRm9vdENPR1Mob3duZXIpCglzdW1SZWN2LCBjb250cmliQmFsLCBjb250cmliT0sgOj0gQ3Jvc3NGb290Q29udHJpYnV0ZWQob3duZXIpCglkbiwgY24sIG9mZnNldHMgOj0gRXF1YXRpb24ob3duZXIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIENyb3NzLWZvb3RcblxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGFjY291bnQgfCBzdW0gb3ZlciBpdGVtcyB8IGxlZGdlciBiYWxhbmNlIHwgYWdyZWVzIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifC0tLXwtLS18LS0tfC0tLXxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBgIiArIEludmVudG9yeUNvZGUgKyAiYCBvbiBoYW5kIHwgIiArCgkJc3RyY29udi5Gb3JtYXRJbnQoc3VtT25IYW5kLCAxMCkgKyAiIHwgIiArCgkJc3RyY29udi5Gb3JtYXRJbnQoaW52QmFsLCAxMCkgKyAiIHwgKioiICsgeWVzbm8oaW52T0spICsgIioqIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBgIiArIENPR1NDb2RlICsgImAgY2hhcmdlZCB8ICIgKwoJCXN0cmNvbnYuRm9ybWF0SW50KHN1bUNoYXJnZWQsIDEwKSArICIgfCAiICsKCQlzdHJjb252LkZvcm1hdEludChjb2dzQmFsLCAxMCkgKyAiIHwgKioiICsgeWVzbm8oY29nc09LKSArICIqKiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgYCIgKyBDb250cmliQ29kZSArICJgIHJlY2VpdmVkIHwgIiArCgkJc3RyY29udi5Gb3JtYXRJbnQoc3VtUmVjdiwgMTApICsgIiB8ICIgKwoJCXN0cmNvbnYuRm9ybWF0SW50KGNvbnRyaWJCYWwsIDEwKSArICIgfCAqKiIgKyB5ZXNubyhjb250cmliT0spICsgIioqIHxcblxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGZpZ3VyZSB8IHZhbHVlIHxcbnwtLS18LS0tfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IGRlYml0LW5vcm1hbCB0b3RhbCB8ICIgKyBzdHJjb252LkZvcm1hdEludChkbiwgMTApICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgY3JlZGl0LW5vcm1hbCB0b3RhbCB8ICIgKyBzdHJjb252LkZvcm1hdEludChjbiwgMTApICsgIiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgZXF1YXRpb24gb2Zmc2V0cyB8ICoqIiArIHllc25vKG9mZnNldHMpICsgIioqIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCBib29rIGJhbGFuY2VkIHwgKioiICsgeWVzbm8oci5ib29rLklzQmFsYW5jZWQoKSkgKyAiKiogfFxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIlRob3NlIGxhc3QgdHdvIHJvd3MgYXJlICoqbm90IHR3byBpbmRlcGVuZGVudCBjaGVja3MqKiwgIikKCXNiLldyaXRlU3RyaW5nKCJhbmQgYSByZWFkZXIgY291bnRpbmcgYWdyZWVtZW50cyB3b3VsZCBvdmVyLWNvdW50IGhlcmUuICIpCglzYi5Xcml0ZVN0cmluZygiVGhlIGVxdWF0aW9uIHBhcnRpdGlvbnMgYWNjb3VudHMgaW50byBkZWJpdC1ub3JtYWwgYW5kICIpCglzYi5Xcml0ZVN0cmluZygiY3JlZGl0LW5vcm1hbCBhbmQgdGhlbiBhZGRzIHRoZSB0d28gc3VidG90YWxzIGJhY2sgIikKCXNiLldyaXRlU3RyaW5nKCJ0b2dldGhlciwgc28gXCJvZmZzZXRzXCIgcmVkdWNlcyB0byB0b3RhbCBkZWJpdHMgZXF1YWwgIikKCXNiLldyaXRlU3RyaW5nKCJ0b3RhbCBjcmVkaXRzIOKAlCB3aGljaCBpcyB0aGUgZmlyc3Qgb2YgdGhlIHRocmVlIHRoaW5ncyAiKQoJc2IuV3JpdGVTdHJpbmcoIlwiYmFsYW5jZWRcIiBjaGVja3MuIEEgYmFsYW5jZWQgYm9vayBhbHdheXMgb2Zmc2V0cy4gIikKCXNiLldyaXRlU3RyaW5nKCJOZWl0aGVyIHJvdyBjYW4gc2VlIGFuIGFjY291bnQgKipjbGFzc2lmaWVkKiogd3JvbmdseTogIikKCXNiLldyaXRlU3RyaW5nKCJyZWNsYXNzaWZ5aW5nIHRoZSB3aG9sZSBjaGFydCBtb3ZlcyB0aGUgdHdvIHRvdGFscyBhYm92ZSAiKQoJc2IuV3JpdGVTdHJpbmcoImFuZCBsZWF2ZXMgYm90aCBib29sZWFucyB0cnVlLiBXaGF0IHBpbnMgdGhlICIpCglzYi5Xcml0ZVN0cmluZygiY2xhc3NpZmljYXRpb24gaXMgdGhlIGNyb3NzLWZvb3QgdGFibGUsIHdoZXJlIGVhY2ggIikKCXNiLldyaXRlU3RyaW5nKCJhY2NvdW50J3MgbGVkZ2VyIGJhbGFuY2UgaXMgY29tcGFyZWQgYWdhaW5zdCBhIGZpZ3VyZSAiKQoJc2IuV3JpdGVTdHJpbmcoImRlcml2ZWQgZnJvbSB0aGUgaXRlbXMgaW5kZXBlbmRlbnRseSBvZiB0aGUgY2hhcnQuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIEl0ZW1zXG5cbiIpCglpZiByLml0ZW1zLlNpemUoKSA9PSAwIHsKCQlzYi5Xcml0ZVN0cmluZygiX05vbmUgYWRkZWQgeWV0Ll9cbiIpCgkJcmV0dXJuIHNiLlN0cmluZygpCgl9CglzYi5Xcml0ZVN0cmluZygifCBza3UgfCBuYW1lIHwgbWV0aG9kIHwgbG90cyB8IG9uIGhhbmQgfCBjb3N0IG9uIGhhbmQgfCByZWNlaXZlZCB8IGNoYXJnZWQgfCBvayB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIpCgoJc2hvd24gOj0gMAoJdG90YWwgOj0gci5pdGVtcy5TaXplKCkKCXIuaXRlbXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQlpZiBzaG93biA+PSBSZW5kZXJJdGVtTGltaXQgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCQlpdCA6PSB2LigqaXRlbSkKCQljb2gsIGVyciA6PSBpdC5wb29sLkNvc3RPbkhhbmQoKQoJCW9rIDo9IGVyciA9PSBuaWwgJiYgaXQucG9zdGVkQ09HUyA9PSBpdC5wb29sLkNoYXJnZWRDb3N0KCkKCQlfLCBfLCBfLCBmb290cyA6PSBpdC5wb29sLkNyb3NzRm9vdENvc3QoKQoJCXNiLldyaXRlU3RyaW5nKCJ8IFsiICsgY2VsbChpdC5za3UpICsgIl0oIiArIFJlYWxtUGF0aCArICI6IiArCgkJCW93bmVyLlN0cmluZygpICsgIi8iICsgaXQuc2t1ICsgIikgfCAiICsgY2VsbChpdC5uYW1lKSArICIgfCAiICsKCQkJY2VsbChpdC5wb29sLk1ldGhvZCgpLlN0cmluZygpKSArICIgfCAiICsKCQkJc3RyY29udi5JdG9hKGl0LnBvb2wuTG90Q291bnQoKSkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGl0LnBvb2wuUXR5T25IYW5kKCksIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoY29oLCAxMCkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGl0LnBvb2wuUmVjZWl2ZWRDb3N0KCksIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoaXQucG9vbC5DaGFyZ2VkQ29zdCgpLCAxMCkgKyAiIHwgIiArCgkJCXllc25vKG9rICYmIGZvb3RzKSArICIgfFxuIikKCQlzaG93bisrCgkJcmV0dXJuIGZhbHNlCgl9KQoJaWYgc2hvd24gPCB0b3RhbCB7CgkJc2IuV3JpdGVTdHJpbmcoIlxuX1Nob3dpbmcgIiArIHN0cmNvbnYuSXRvYShzaG93bikgKyAiIG9mICIgKwoJCQlzdHJjb252Lkl0b2EodG90YWwpICsgIiBpdGVtcy5fXG4iKQoJfQoJcmV0dXJuIHNiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVySXRlbShvd25lciBhZGRyZXNzLCBza3Ugc3RyaW5nKSBzdHJpbmcgewoJciwgb2sgOj0gcmVnKG93bmVyKQoJaWYgIW9rIHsKCQlyZXR1cm4gIiMgTm8gcmVnaXN0ZXJcblxuTm8gcmVnaXN0ZXIgZXhpc3RzIGZvciBgIiArCgkJCXNhbml0aXplLklubGluZVRleHQob3duZXIuU3RyaW5nKCkpICsgImAuXG4iCgl9Cgl2IDo9IHIuaXRlbXMuR2V0KHNrdSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gIiMgTm8gaXRlbVxuXG5ObyBpdGVtIGAiICsgc2FuaXRpemUuSW5saW5lVGV4dChza3UpICsKCQkJImAgaW4gdGhlIHJlZ2lzdGVyIG9mIGAiICsgc2FuaXRpemUuSW5saW5lVGV4dChvd25lci5TdHJpbmcoKSkgKyAiYC5cbiIKCX0KCWl0IDo9IHYuKCppdGVtKQoKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKCIjICIgKyBjZWxsKGl0LnNrdSkgKyAiIOKAlCAiICsgY2VsbChpdC5uYW1lKSArICJcblxuIikKCXNiLldyaXRlU3RyaW5nKCItIG93bmVyOiBgIiArIHNhbml0aXplLklubGluZVRleHQob3duZXIuU3RyaW5nKCkpICsgImBcbiIpCglzYi5Xcml0ZVN0cmluZygiLSBjb3N0aW5nIG1ldGhvZDogKioiICsgY2VsbChpdC5wb29sLk1ldGhvZCgpLlN0cmluZygpKSArICIqKlxuIikKCXNiLldyaXRlU3RyaW5nKCItIGFkZGVkIGF0IGhlaWdodDogKioiICsgc3RyY29udi5Gb3JtYXRJbnQoaXQuYWRkZWRBdCwgMTApICsgIioqXG4iKQoJc2IuV3JpdGVTdHJpbmcoIi0gcmVjZWlwdHMgdGFrZW46ICoqIiArIHN0cmNvbnYuRm9ybWF0SW50KGl0LnBvb2wuUmVjZWlwdENvdW50KCksIDEwKSArICIqKlxuIikKCXNiLldyaXRlU3RyaW5nKCItIGxpdmUgbG90czogKioiICsgc3RyY29udi5JdG9hKGl0LnBvb2wuTG90Q291bnQoKSkgKyAiKiogLyAiICsKCQlzdHJjb252Lkl0b2EoTWF4TG90c1Blckl0ZW0pICsgIlxuXG4iKQoKCXJlY3YsIGNoYXJnZWQsIG9uSGFuZCwgZm9vdHMgOj0gaXQucG9vbC5Dcm9zc0Zvb3RDb3N0KCkKCXJxLCBjcSwgcU9uSGFuZCwgcUZvb3RzIDo9IGl0LnBvb2wuQ3Jvc3NGb290UXR5KCkKCXNiLldyaXRlU3RyaW5nKCIjIyBDcm9zcy1mb290XG5cbiIpCglzYi5Xcml0ZVN0cmluZygifCBpZGVudGl0eSB8IHJlY2VpdmVkIHwgb3V0IHwgb24gaGFuZCB8IGZvb3RzIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifC0tLXwtLS18LS0tfC0tLXwtLS18XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgY29zdCB8ICIgKyBzdHJjb252LkZvcm1hdEludChyZWN2LCAxMCkgKyAiIHwgIiArCgkJc3RyY29udi5Gb3JtYXRJbnQoY2hhcmdlZCwgMTApICsgIiB8ICIgKwoJCXN0cmNvbnYuRm9ybWF0SW50KG9uSGFuZCwgMTApICsgIiB8ICoqIiArIHllc25vKGZvb3RzKSArICIqKiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgcXVhbnRpdHkgfCAiICsgc3RyY29udi5Gb3JtYXRJbnQocnEsIDEwKSArICIgfCAiICsKCQlzdHJjb252LkZvcm1hdEludChjcSwgMTApICsgIiB8ICIgKwoJCXN0cmNvbnYuRm9ybWF0SW50KHFPbkhhbmQsIDEwKSArICIgfCAqKiIgKyB5ZXNubyhxRm9vdHMpICsgIioqIHxcblxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IHBvc3RlZCB2cyBkZXJpdmVkIHwgcG9zdGVkIHwgZGVyaXZlZCB8IGFncmVlcyB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwtLS18LS0tfC0tLXwtLS18XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgY29zdCBvZiBnb29kcyBzb2xkIHwgIiArIHN0cmNvbnYuRm9ybWF0SW50KGl0LnBvc3RlZENPR1MsIDEwKSArCgkJIiB8ICIgKyBzdHJjb252LkZvcm1hdEludChpdC5wb29sLkNoYXJnZWRDb3N0KCksIDEwKSArICIgfCAqKiIgKwoJCXllc25vKGl0LnBvc3RlZENPR1MgPT0gaXQucG9vbC5DaGFyZ2VkQ29zdCgpKSArICIqKiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgcmVjZWlwdHMgfCAiICsgc3RyY29udi5Gb3JtYXRJbnQoaXQucG9zdGVkUmVjdiwgMTApICsKCQkiIHwgIiArIHN0cmNvbnYuRm9ybWF0SW50KGl0LnBvb2wuUmVjZWl2ZWRDb3N0KCksIDEwKSArICIgfCAqKiIgKwoJCXllc25vKGl0LnBvc3RlZFJlY3YgPT0gaXQucG9vbC5SZWNlaXZlZENvc3QoKSkgKyAiKiogfFxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBMaXZlIGxvdHNcblxuIikKCWFsbCA6PSBpdC5wb29sLkxvdHMoKQoJaWYgbGVuKGFsbCkgPT0gMCB7CgkJc2IuV3JpdGVTdHJpbmcoIl9ObyBsb3RzIG9uIGhhbmQuX1xuIikKCQlyZXR1cm4gc2IuU3RyaW5nKCkKCX0KCXNiLldyaXRlU3RyaW5nKCJ8ICMgfCBxdHkgfCBjb3N0IHwgY29uc3VtZWQgfCByZW1haW5pbmcgfCByZW1haW5pbmcgY29zdCB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIpCglzaG93biA6PSAwCglmb3IgaSwgbCA6PSByYW5nZSBhbGwgewoJCWlmIHNob3duID49IFJlbmRlckxvdExpbWl0IHsKCQkJYnJlYWsKCQl9CgkJcmMsIGVyciA6PSBsLlJlbWFpbmluZ0Nvc3QoKQoJCXJjcyA6PSBzdHJjb252LkZvcm1hdEludChyYywgMTApCgkJaWYgZXJyICE9IG5pbCB7CgkJCS8vIEEgbG90IHRoYXQgY2Fubm90IHZhbHVlIGl0c2VsZiBpcyBzaG93biBhcyBzdWNoIHJhdGhlciB0aGFuIGFzCgkJCS8vIGEgemVybzogYSB6ZXJvIGluIGEgY29zdCBjb2x1bW4gcmVhZHMgYXMgYSBmYWN0LgoJCQlyY3MgPSAiKippbnZhbGlkKioiCgkJfQoJCXNiLldyaXRlU3RyaW5nKCJ8ICIgKyBzdHJjb252Lkl0b2EoaSkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGwuUXR5LCAxMCkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGwuQ29zdCwgMTApICsgIiB8ICIgKwoJCQlzdHJjb252LkZvcm1hdEludChsLkNvbnN1bWVkLCAxMCkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGwuUmVtYWluaW5nKCksIDEwKSArICIgfCAiICsgcmNzICsgIiB8XG4iKQoJCXNob3duKysKCX0KCWlmIHNob3duIDwgbGVuKGFsbCkgewoJCXNiLldyaXRlU3RyaW5nKCJcbl9TaG93aW5nICIgKyBzdHJjb252Lkl0b2Eoc2hvd24pICsgIiBvZiAiICsKCQkJc3RyY29udi5JdG9hKGxlbihhbGwpKSArICIgbG90cy5fXG4iKQoJfQoJcmV0dXJuIHNiLlN0cmluZygpCn0KCi8vIGNlbGwgcmVuZGVycyBhIGNhbGxlci1zdXBwbGllZCBzdHJpbmcgaW50byBhIHRhYmxlIGNlbGwuIEEgYmxhbmsgdmFsdWUgd291bGQKLy8gY29sbGFwc2UgdGhlIGNvbHVtbiwgc28gaXQgaXMgc2hvd24gYXMgYSBkYXNoLgpmdW5jIGNlbGwocyBzdHJpbmcpIHN0cmluZyB7CglpZiBzdHJpbmdzLlRyaW1TcGFjZShzKSA9PSAiIiB7CgkJcmV0dXJuICLigJQiCgl9CglyZXR1cm4gc2FuaXRpemUuVGFibGVDZWxsKHMpCn0KCmZ1bmMgeWVzbm8oYiBib29sKSBzdHJpbmcgewoJaWYgYiB7CgkJcmV0dXJuICJ5ZXMiCgl9CglyZXR1cm4gIm5vIgp9CiINMTAwMDAwMDB1Z25vdBISCKC2920SCzIzMDU0OHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkAh2audo5y6Gvw24yrLpbyBE9iLlXftt8G9zOieGIBOgUWgehWBwPstEljVbyAe1ljD8WOq6cA8iG4U7wIkk3ryGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}