{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "LCqNyIPSqMTRMYo6nsdKgYTsJVebWz5LTyjikfzzPHk=",
    "height": "608171",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": [
          {
            "@type": "/tm.StorageDepositEvent",
            "bytes_delta": "48820",
            "fee_delta": "4882000ugnot",
            "pkg_path": "gno.land/r/g1ut6uspuh73e02yauxpmyt8g3wwddaq8utagvm3/bounty_panel"
          }
        ],
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "81538827",
      "GasUsed": "54359218"
    },
    "tx": "ComCAgoML3ZtLm1fYWRkcGtnEveBAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxK6gQIKDGJvdW50eV9wYW5lbBJAZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2JvdW50eV9wYW5lbBr9/wEKEGJvdW50eV9wYW5lbC5nbm8S5/8BLy8gUmVhbG0gYm91bnR5X3BhbmVsIGlzIGEgcHVibGljIGJvdW50eSBib2FyZCB3aG9zZSByZXNvbHV0aW9uCi8vIGF1dGhvcml0eSBpcyBzZXBhcmF0ZWQgZnJvbSBpdHMgZnVuZGluZyBhdXRob3JpdHkuCi8vCi8vIEEgZnVuZGVyIGVzY3Jvd3MgR05PVCBiZWhpbmQgYSBib3VudHkgYW5kLCBBVCBDUkVBVElPTiwgbmFtZXMgYSBwYW5lbAovLyBvZiByZXNvbHZlcnMgYW5kIGFuIE0tb2YtTiB0aHJlc2hvbGQuIENvbnRyaWJ1dG9ycyBzdWJtaXQgd29yawovLyBvbi1jaGFpbiBkdXJpbmcgYSBzdWJtaXNzaW9uIHdpbmRvdy4gQWZ0ZXIgdGhhdCB3aW5kb3cgY2xvc2VzIHRoZQovLyBwYW5lbCB2b3RlcyBvbiB0aGUgY29tcGV0aW5nIHN1Ym1pc3Npb25zLCBhbmQgdGhlIGZpcnN0IHN1Ym1pc3Npb24gdG8KLy8gcmVhY2ggTSB2b3RlcyB3aW5zIHRoZSBlc2Nyb3cuIE5laXRoZXIgdGhlIHBhbmVsIG5vciB0aGUgdGhyZXNob2xkIGNhbgovLyBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi8vCi8vIFdIWSBUSElTIEVYSVNUUyAoc2VlIERJU0NPVkVSWS5tZCk6IHRoZSBzaWJsaW5nIHJlYWxtIGBncmFudHNgIGFscmVhZHkKLy8gaW1wbGVtZW50cyBlc2Nyb3dlZCByZXdhcmRzLCBvbi1jaGFpbiBzdWJtaXNzaW9ucywgcmVzdHJpY3RlZCBhd2FyZAovLyBhbmQgYSBwZXJtaXNzaW9ubGVzcyByZWZ1bmQgdmFsdmUg4oCUIGJ1dCB0aGVyZSB0aGUgcmVzb2x2ZXIgSVMgdGhlCi8vIGZ1bmRlci4gT24gYSBwdWJsaWMgYm91bnR5IHdpdGggb3BlbiBzdWJtaXNzaW9ucyB0aGF0IGlzIHRoZSB3cm9uZwovLyB0cnVzdCBtb2RlbDogdGhlIGRlY2lkaW5nIHBhcnR5IGhhcyBhIGZpbmFuY2lhbCBpbnRlcmVzdCBpbiB0aGUKLy8gb3V0Y29tZSBhbmQgc2VlcyBldmVyeSBzdWJtaXNzaW9uIGJlZm9yZSBkZWNpZGluZy4gVGhpcyByZWFsbSBleGlzdHMKLy8gZm9yIGV4YWN0bHkgdGhhdCBkZWx0YSBhbmQgcmV1c2VzIGV2ZXJ5dGhpbmcgZWxzZS4KLy8KLy8gQ09NUE9TSVRJT046IGFsbCBiYWxhbmNlIGFjY291bnRpbmcgaXMgZGVsZWdhdGVkIHRvIGZlZWxlZGdlciwgYWxsCi8vIGNvaW4gbW92ZW1lbnQgdG8gY29pbmlvLCBhbmQgYWxsIGZyZWUtdGV4dCByZW5kZXIgb3V0cHV0IHRvIHRoZQovLyBlY29zeXN0ZW0gc2FuaXRpemVyIHAvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAuIFRoaXMgcmVhbG0gb3ducyBvbmx5Ci8vIHRoZSBib3VudHkgc3RhdGUgbWFjaGluZTogYm91bnR5IHJlY29yZHMsIHBhbmVscywgc3VibWlzc2lvbnMsIHZvdGVzLAovLyBvcGVuLWVzY3JvdyB0b3RhbCwgZGVhZGxpbmVzLCBhbmQgcm9sZXMuCi8vCi8vIExJRkVDWUNMRSAodGVybWluYWwgc3RhdGVzIGFyZSBmcm96ZW47IG9uZSB0cmFuc2l0aW9uIHBlciBib3VudHkpOgovLwovLwlDcmVhdGVCb3VudHkgKEVPQSArIC1zZW5kKSAgOiBlc2Nyb3cgLT4gb3BlblRvdGFsLCBzdGF0dXMgT3BlbjsKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwgKyB0aHJlc2hvbGQgKyBmZWUgYnBzIGFsbAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkFQU0hPVFRFRCBhdCBjcmVhdGlvbgovLwlTdWJtaXQgKGFsc28gcmUtc3VibWl0KSAgICAgOiB3aGlsZSBPcGVuIGFuZCBoZWlnaHQgPAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXREZWFkbGluZTsga2V5ZWQgYnkgdGhlIGNhbGxlcidzCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG93biBhZGRyZXNzOyBmdW5kZXIgYW5kIHBhbmVsIGJhcnJlZAovLwlWb3RlIChwYW5lbCBvbmx5KSAgICAgICAgICAgOiB3aGlsZSBPcGVuIGFuZCBzdWJtaXREZWFkbGluZSA8PQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPCByZXNvbHZlRGVhZGxpbmU7IG9uZSBsaXZlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvdGUgcGVyIHJlc29sdmVyLCBjaGFuZ2VhYmxlIHVudGlsCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aHJlc2hvbGQgaXMgcmVhY2hlZDsgdGhlIE10aCB2b3RlCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBhIHN1Ym1pc3Npb24gYXdhcmRzIHRoZSBib3VudHkKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRPTUlDQUxMWSAoT3BlbiAtPiBBd2FyZGVkKQovLwlDYW5jZWxCb3VudHkgKGZ1bmRlciBvbmx5KSAgOiBPcGVuIC0+IENhbmNlbGxlZCwgZmVlLWZyZWUgcmVmdW5kIOKAlAovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTkxZIHdoaWxlIG5vIHN1Ym1pc3Npb24gZXhpc3RzCi8vCUV4cGlyZUJvdW50eSAoQU5ZT05FKSAgICAgICA6IE9wZW4gLT4gRXhwaXJlZCBvbmNlIGhlaWdodCA+PQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlRGVhZGxpbmUgKyBFeHBpcnlHcmFjZUJsb2NrczsKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmVlLWZyZWUgcmVmdW5kIHRvIHRoZSBmdW5kZXIg4oCUIHRoZQovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtaXNzaW9ubGVzcyB2YWx2ZSBhZ2FpbnN0IGEgcGFuZWwKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBuZXZlciByZXNvbHZlcyAoYnV0IHNlZSBUSEUgT05FCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENBVkVBVCBiZWxvdykKLy8JQ2xhaW0gLyBDbGFpbUFsbCAoYW55b25lKSAgIDogcGF5cyBvdXQgdGhlIGNhbGxlcidzIG93biBsZWRnZXIKLy8JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFsYW5jZSAod2lubmluZ3MgYW5kIHJlZnVuZHMpCi8vCVdpdGhkcmF3RmVlcyAoZmVlIHJlY2lwaWVudCk6IHBheXMgb3V0IHRoZSBmZWUgcG90Ci8vCi8vIFdIWSBUSEUgV0lORE9XUyBETyBOT1QgT1ZFUkxBUDogc3VibWlzc2lvbnMgY2xvc2UgYXQgc3VibWl0RGVhZGxpbmUKLy8gYW5kIHZvdGluZyBvcGVucyBhdCB0aGUgc2FtZSBoZWlnaHQuIEEgcmVzb2x2ZXIgdGhlcmVmb3JlIHZvdGVzIG9ubHkKLy8gb24gY29udGVudCB0aGF0IGNhbiBubyBsb25nZXIgY2hhbmdlLCB3aGljaCByZW1vdmVzIHRoZSBiYWl0LWFuZC0KLy8gc3dpdGNoIHdoZXJlIGEgc3VibWlzc2lvbiBjb2xsZWN0cyB2b3RlcyBhbmQgaXMgdGhlbiBlZGl0ZWQuIEl0IGFsc28KLy8gbWVhbnMgbm8gc3VibWlzc2lvbiBjYW4gYmUgYWRkZWQgaW4gcmVzcG9uc2UgdG8gdGhlIHZvdGVzIGFscmVhZHkKLy8gY2FzdC4KLy8KLy8gVEhFIE9ORSBDQVZFQVQgT04gVEhFIEVYUElSWSBWQUxWRSwgc3RhdGVkIHJhdGhlciB0aGFuIGdsb3NzZWQ6IGJvdGgKLy8gd2F5cyBvdXQgb2YgYW4gT3BlbiBib3VudHkg4oCUIGF3YXJkIGFuZCByZWZ1bmQg4oCUIGNyZWRpdCB0aGUgc2hhcmVkCi8vIGZlZWxlZGdlciwgc28gYm90aCBmYWlsIHdoaWxlIHRoYXQgbGVkZ2VyIGlzIHNhdHVyYXRlZCBhdCB0aGUgaW50NjQKLy8gYm91bmRhcnksIGFuZCB0aGUgZXNjcm93IGlzIHRlbXBvcmFyaWx5IGltbW92YWJsZSBpbiBCT1RIIGRpcmVjdGlvbnMKLy8gdW50aWwgc29tZSBhY2NvdW50IGNsYWltcyBkb3duLiBOb3RoaW5nIGlzIGxvc3QgYW5kIHRoZSB2YWx2ZSB3b3JrcwovLyBhZ2FpbiBhcyBzb29uIGFzIHRoZSBsZWRnZXIgaGFzIGhlYWRyb29tICh0aGlzIGlzIGV4ZXJjaXNlZCBpbgovLyBUZXN0U2F0dXJhdGVkQXdhcmRDYW5ub3RUcmFwRnVuZHMpLiBUaGUgc3RhdGUgcmVxdWlyZXMgbGlhYmlsaXRpZXMKLy8gd2l0aGluIH41MCBvZiAyXjYzLTEgdWdub3QsIHdoaWNoIGV4Y2VlZHMgdGhlIHJlYWwgR05PVCBzdXBwbHkgYnkKLy8gb3JkZXJzIG9mIG1hZ25pdHVkZSBhbmQgaXMgdW5yZWFjaGFibGUgYWJzZW50IGEgY2hhaW4tbGV2ZWwgbWludGluZwovLyBidWcsIHNpbmNlIGV2ZXJ5IGNyZWRpdCBpcyBiYWNrZWQgYnkgYW4gZXNjcm93ZWQgLXNlbmQuIFNvOiB0aGUKLy8gdmFsdmUgbWFrZXMgZnVuZC10cmFwcGluZyBpbXBvc3NpYmxlIHVuZGVyIGFueSByZWFjaGFibGUgY29uZGl0aW9uLAovLyB3aGljaCBpcyBhIHdlYWtlciBjbGFpbSB0aGFuICJpbXBvc3NpYmxlIiBhbmQgaXMgdGhlIHRydWUgb25lLgovLwovLyBXSFkgQ0FOQ0VMIElTIFJFU1RSSUNURUQ6IGluIGBncmFudHNgIHRoZSBjcmVhdG9yIG1heSBjYW5jZWwgYXQgYW55Ci8vIHRpbWUgd2hpbGUgb3Blbi4gSGVyZSwgb25jZSBhIHNpbmdsZSBjb250cmlidXRvciBoYXMgc3VibWl0dGVkIHdvcmssCi8vIHRoZSBmdW5kZXIgY2FuIG5vIGxvbmdlciB1bmlsYXRlcmFsbHkgcmVjbGFpbSB0aGUgZXNjcm93IOKAlCBvbmx5IHRoZQovLyBwYW5lbCAoYnkgYXdhcmRpbmcpIG9yIHRoZSBleHBpcnkgdmFsdmUgKGFmdGVyIHRoZSByZXNvbHV0aW9uIHdpbmRvdykKLy8gY2FuIGVuZCB0aGUgYm91bnR5LiBUaGlzIGlzIHRoZSBjb25jcmV0ZSBhbnRpLWhhcnZlc3QgZ3VhcmFudGVlIHRoYXQKLy8gYSBwdWJsaWMgYm91bnR5IG5lZWRzIGFuZCBhIGdyYW50IHByb2dyYW1tZSBkb2VzIG5vdC4KLy8KLy8gQVVUSE9SSVpBVElPTjogZXZlcnkgaWRlbnRpdHkgaXMgZGVyaXZlZCBmcm9tIHRoZSBjcm9zc2luZwovLyBlbnRyeXBvaW50J3MgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpIOKAlCBubyBmdW5jdGlvbiB0YWtlcyBhIGNhbGxlcgovLyBpZGVudGl0eSBhcyBhIHBhcmFtZXRlci4gU3VibWlzc2lvbnMsIHZvdGVzIGFuZCBjbGFpbWFibGUgYmFsYW5jZXMKLy8gYXJlIGtleWVkIGJ5IHRoYXQgcnVudGltZS1kZXJpdmVkIGFkZHJlc3MsIHNvIGFsdGVyaW5nIGFub3RoZXIgdXNlcidzCi8vIHN1Ym1pc3Npb24sIGNhc3RpbmcgYW5vdGhlciByZXNvbHZlcidzIHZvdGUsIG9yIGNsYWltaW5nIGFub3RoZXIKLy8gdXNlcidzIHdpbm5pbmdzIGlzIGltcG9zc2libGUgYnkgY29uc3RydWN0aW9uLgovLwovLyBQQU5FTCBJTlRFR1JJVFksIGZpeGVkIGF0IGNyZWF0aW9uIGFuZCBpbW11dGFibGUgdGhlcmVhZnRlcjogdGhlCi8vIHBhbmVsIGlzIG5vbi1lbXB0eSwgZnJlZSBvZiBkdXBsaWNhdGVzLCBldmVyeSBtZW1iZXIgaXMgYSB2YWxpZAovLyBiZWNoMzIgYWRkcmVzcywgYW5kIDEgPD0gdGhyZXNob2xkIDw9IHBhbmVsU2l6ZS4gUGFuZWwgbWVtYmVycyBtYXkKLy8gbm90IHN1Ym1pdCB3b3JrLCBzbyBhIHJlc29sdmVyIGNhbm5vdCB2b3RlIGZvciB0aGVpciBvd24gc3VibWlzc2lvbi4KLy8gVGhlIGZ1bmRlciBNQVkgYmUgYSBwYW5lbCBtZW1iZXIg4oCUIGJhcnJpbmcgdGhlbSB3b3VsZCBiZQovLyB1bmVuZm9yY2VhYmxlIHRoZWF0cmUgKGEgZnVuZGVyIGNhbiBhbHdheXMgbmFtZSBhbiBhZGRyZXNzIHRoZXkKLy8gY29udHJvbCksIGFuZCB0aGUgcGFuZWwgaXMgcHVibGljIG9uLWNoYWluIGZyb20gY3JlYXRpb24sIHNvIGEKLy8gc2VsZi1yZXNvbHZlZCBib3VudHkgaXMgdmlzaWJsZSB0byBjb250cmlidXRvcnMgQkVGT1JFIHRoZXkgc3BlbmQKLy8gZWZmb3J0LiBEaXNjbG9zdXJlIGJlYXRzIGEgcHJvaGliaXRpb24gdGhhdCBjYW5ub3QgYmUgZW5mb3JjZWQuCi8vCi8vIEZFRSBNT0RFTDogZmVlID0gZmxvb3IoYW1vdW50ICogYnBzIC8gMTAwMDApLCByb3VuZGluZyBmYXZvcnMgdGhlCi8vIHdpbm5lcjsgbm8gbWluaW11bSBmZWU7IGJwcyBzbmFwc2hvdHRlZCBpbnRvIHRoZSBib3VudHkgYXQgY3JlYXRpb24sCi8vIHNvIFNldEZlZUJwcyBhZmZlY3RzIGZ1dHVyZSBib3VudGllcyBvbmx5IChjbG9zZXMgdGhlIGF3YXJkLXRpbWUKLy8gYWRtaW4gcmFjZSksIGFuZCBDcmVhdGVCb3VudHkgdGFrZXMgdGhlIGNhbGxlcidzIG93biBtYXhGZWVCcHMKLy8gY2VpbGluZywgcmVqZWN0aW5nIGNyZWF0aW9uIGlmIHRoZSBsaXZlIGZlZSBleGNlZWRzIHdoYXQgdGhlIGZ1bmRlcgovLyBzaWduZWQgZm9yIChjbG9zZXMgdGhlIGNyZWF0aW9uLXRpbWUgcmFjZSk7IGhhcmQgY29tcGlsZS10aW1lIGNhcAovLyBNYXhGZWVCcHMgKDEwJSk7IHJlZnVuZHMgKGNhbmNlbC9leHBpcmUpIGFyZSBhbHdheXMgZmVlLWZyZWUuCi8vCi8vIE1PTkVUQVJZIElOVkFSSUFOVCAoY29uc2VydmF0aW9uKTogbGV0IEggYmUgdWdub3QgaGVsZCBhdCB0aGlzCi8vIHJlYWxtJ3MgYWRkcmVzcywgQiA9IG9wZW5Ub3RhbCAozqMgYW1vdW50IG92ZXIgT3BlbiBib3VudGllcyksIFUgdGhlCi8vIGxlZGdlcidzIGNsYWltYWJsZSBiYWxhbmNlcywgRiB0aGUgZmVlIHBvdCwgUyA+PSAwIG91dC1vZi1iYW5kCi8vIHN1cnBsdXM6Ci8vCi8vCUggPT0gQiArIFUgKyBGICsgUwovLwovLyBFdmVyeSB0cmFuc2l0aW9uIG1vdmVzIHZhbHVlIGJldHdlZW4gZXhhY3RseSB0d28gdGVybXMgaW5zaWRlIG9uZQovLyB0cmFuc2FjdGlvbjogQ3JlYXRlQm91bnR5IHJhaXNlcyBIIGFuZCBCIHRvZ2V0aGVyIChjb2luaW8uUmVjZWl2ZSBpcwovLyB0aGUgcmVjZWlwdC1ndWFyYW50ZWVkIHNoYXBlKTsgYXdhcmQvY2FuY2VsL2V4cGlyZSBtb3ZlIGFtb3VudCBmcm9tIEIKLy8gaW50byBVK0Ygd2l0aCBmZWVsZWRnZXIgZ3VhcmFudGVlaW5nIGNyZWRpdGVkICsgZmVlID09IGFtb3VudDsgY2xhaW1zCi8vIGFuZCBmZWUgd2l0aGRyYXdhbCBkZWJpdCB0aGUgbGVkZ2VyIGJlZm9yZSBjb2luaW8uUGF5b3V0IG1vdmVzIHRoZQovLyBpZGVudGljYWwgYW1vdW50IG91dCAoY2hlY2tzLWVmZmVjdHMtaW50ZXJhY3Rpb25zKTsgYW55IHBhbmljIGFib3J0cwovLyB0aGUgd2hvbGUgdHJhbnNhY3Rpb247IHRoaXMgcmVhbG0gbmV2ZXIgaXNzdWVzIG9yIHJlbW92ZXMgY29pbnMuCi8vIFN1cnBsdXMgaXMgcmVjb3ZlcmFibGUgb25seSB2aWEgU3dlZXBEZW5vbSAoZmVlIHJlY2lwaWVudCksIHdoaWNoCi8vIHJlc2VydmVzIExpYWJpbGl0aWVzKCkgPSBCICsgVSArIEYuCi8vCi8vIE9OTFkgR05PVDogQ3JlYXRlQm91bnR5IHJlamVjdHMgYW55IGVudmVsb3BlIHRoYXQgaXMgbm90IGV4YWN0bHkgb25lCi8vIHBvc2l0aXZlIHVnbm90IGNvaW4gKGNvaW5pby5SZWNlaXZlKS4gRXZlcnkgb3RoZXIgZW50cnlwb2ludCByZWplY3RzCi8vIGF0dGFjaGVkIGNvaW5zIG91dHJpZ2h0IHJhdGhlciB0aGFuIGNvbnZlcnRpbmcgdGhlbSB0byBzd2VlcGFibGUKLy8gc3VycGx1cy4KcGFja2FnZSBib3VudHlfcGFuZWwKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoJInN0cmluZ3MiCgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9jb2luaW8iCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2ZlZWxlZGdlciIKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L21hcmtkb3duL3Nhbml0aXplL3YwIgopCgovLyBSZWFsbVBhdGggaXMgdGhpcyByZWFsbSdzIG93biBwYXRoLCB1c2VkIHRvIGJ1aWxkIFJlbmRlciBsaW5rcy4KY29uc3QgUmVhbG1QYXRoID0gIi9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvYm91bnR5X3BhbmVsIgoKLy8gRGVub20gaXMgdGhlIG9ubHkgYXNzZXQgdGhpcyByZWFsbSBhY2NlcHRzLgpjb25zdCBEZW5vbSA9ICJ1Z25vdCIKCi8vIE1heEZlZUJwcyBpcyB0aGUgaGFyZCBwcm90b2NvbC1mZWUgY2FwOiAxMDAwIGJwcyA9IDEwJS4KY29uc3QgTWF4RmVlQnBzID0gaW50NjQoMTAwMCkKCi8vIEJvdW50eSBzdGF0dXMgdmFsdWVzLgpjb25zdCAoCglTdGF0dXNPcGVuICAgICAgPSAib3BlbiIKCVN0YXR1c0F3YXJkZWQgICA9ICJhd2FyZGVkIgoJU3RhdHVzQ2FuY2VsbGVkID0gImNhbmNlbGxlZCIKCVN0YXR1c0V4cGlyZWQgICA9ICJleHBpcmVkIgopCgovLyBJbnB1dCBib3VuZHMuCmNvbnN0ICgKCU1heFRpdGxlTGVuID0gODAKCU1heERlc2NMZW4gID0gMjAwMAoKCS8vIE1heFVSSUxlbiBib3VuZHMgYSBzdWJtaXNzaW9uJ3MgY29udGVudCByZWZlcmVuY2UuIFN1Ym1pc3Npb25zCgkvLyBjYXJyeSBhIFJFRkVSRU5DRSAoYSBVUkwgb3IgY29udGVudCBoYXNoKSwgbm90IHRoZSB3b3JrIGl0c2VsZiDigJQKCS8vIHRoZSBjaGFpbiBjYW5ub3QganVkZ2UgcXVhbGl0eSwgYW5kIHN0b3JpbmcgYnVsayBjb250ZW50IHdvdWxkCgkvLyBwdXNoIGFuIHVuYm91bmRlZCBjb3N0IG9udG8gZXZlcnkgZnV0dXJlIHJlYWRlciBvZiB0aGlzIHJlYWxtLgoJTWF4VVJJTGVuID0gNTAwCgoJLy8gTWF4UGFuZWxTaXplIGJvdW5kcyBwYW5lbCBwYXJzaW5nLCBzdG9yYWdlIGFuZCBSZW5kZXIgY29zdC4KCU1heFBhbmVsU2l6ZSA9IGludDY0KDE2KQoKCS8vIE1heFN1Ym1pc3Npb25zIGJvdW5kcyBwZXItYm91bnR5IHN0YXRlIGdyb3d0aC4gRWFjaCBzdWJtaXNzaW9uCgkvLyBhbHNvIGNvc3RzIGl0cyBzdWJtaXR0ZXIgYSBzdG9yYWdlIGRlcG9zaXQsIHNvIHRoaXMgaXMgYSBjZWlsaW5nCgkvLyBvbiBhIGNvc3QgdGhhdCBpcyBhbHJlYWR5IGJvcm5lIGJ5IHRoZSBwYXJ0eSBjcmVhdGluZyBpdC4KCU1heFN1Ym1pc3Npb25zID0gaW50NjQoNTAwKQoKCS8vIE1pbkR1cmF0aW9uQmxvY2tzIC8gTWF4RHVyYXRpb25CbG9ja3MgYm91bmQgZWFjaCBjb25maWd1cmFibGUKCS8vIHdpbmRvdyAofjVzIGJsb2NrczogMSBibG9jayB0byB+NTgwIGRheXMpLgoJTWluRHVyYXRpb25CbG9ja3MgPSBpbnQ2NCgxKQoJTWF4RHVyYXRpb25CbG9ja3MgPSBpbnQ2NCgxMF8wMDBfMDAwKQoKCS8vIEV4cGlyeUdyYWNlQmxvY2tzIGFmdGVyIHRoZSByZXNvbHV0aW9uIGRlYWRsaW5lLCBhbiBPcGVuIGJvdW50eQoJLy8gYmVjb21lcyBleHBpcmFibGUgYnkgYW55b25lICh+OCBtaW51dGVzIGF0IDVzIGJsb2NrcyDigJQgc2hvcnQKCS8vIGJlY2F1c2UgdGhpcyBpcyBhIHRlc3RuZXQgZGVwbG95bWVudDsgYSBwcm9kdWN0aW9uIGZvcmsgd291bGQKCS8vIHJhaXNlIGl0KS4gVGhlIGdyYWNlIGV4aXN0cyBzbyB0aGF0ICJ0aGUgcGFuZWwgbWF5IHN0aWxsIHZvdGUiCgkvLyBhbmQgImFueW9uZSBtYXkgZXhwaXJlIiBhcmUgbmV2ZXIgc2ltdWx0YW5lb3VzbHkgdHJ1ZS4KCUV4cGlyeUdyYWNlQmxvY2tzID0gaW50NjQoMTAwKQoKCS8vIE1heFJlbmRlclJvd3MgYm91bmRzIFJlbmRlciBvdXRwdXQuIFJlbmRlciBpcyByZWFjaGFibGUgYnkgYW55CgkvLyB2aWV3ZXIgdGhyb3VnaCBnbm93ZWIgYW5kIHZtL3FyZW5kZXIsIHNvIGl0cyBjb3N0IGxhbmRzIG9uIHRoaXJkCgkvLyBwYXJ0aWVzIHJhdGhlciB0aGFuIG9uIHdob2V2ZXIgZ3JldyB0aGUgc3RhdGUuCglNYXhSZW5kZXJSb3dzID0gMjAKKQoKdHlwZSBzdWJtaXNzaW9uIHN0cnVjdCB7Cgl1cmkgICAgc3RyaW5nIC8vIGNvbnRlbnQgcmVmZXJlbmNlIChVUkwgb3IgaGFzaCkKCWhlaWdodCBpbnQ2NCAgLy8gYmxvY2sgaGVpZ2h0IG9mIHRoZSBsYXRlc3QgKHJlKXN1Ym1pc3Npb24KCXZvdGVzICBpbnQ2NCAgLy8gbGl2ZSBwYW5lbCB2b3RlcyBjdXJyZW50bHkgbmFtaW5nIHRoaXMgc3VibWlzc2lvbgp9Cgp0eXBlIGJvdW50eSBzdHJ1Y3QgewoJaWQgICAgICAgICAgaW50NjQKCWZ1bmRlciAgICAgIGFkZHJlc3MKCXRpdGxlICAgICAgIHN0cmluZwoJZGVzY3JpcHRpb24gc3RyaW5nCglhbW91bnQgICAgICBpbnQ2NAoJZmVlQnBzICAgICAgaW50NjQgLy8gc25hcHNob3R0ZWQgYXQgY3JlYXRpb24sIGNoYXJnZWQgYXQgYXdhcmQKCglwYW5lbCAgICAgKmF2bC5UcmVlIC8vIHJlc29sdmVyIGFkZHJlc3Mgc3RyaW5nIC0+IHN0cnVjdHt9e30KCXBhbmVsU2l6ZSBpbnQ2NAoJdGhyZXNob2xkIGludDY0IC8vIHZvdGVzIHJlcXVpcmVkIHRvIGF3YXJkICgxIDw9IHRocmVzaG9sZCA8PSBwYW5lbFNpemUpCgoJc3VibWl0RGVhZGxpbmUgIGludDY0IC8vIHN1Ym1pc3Npb25zIGNsb3NlIGhlcmU7IHZvdGluZyBvcGVucyBoZXJlCglyZXNvbHZlRGVhZGxpbmUgaW50NjQgLy8gdm90aW5nIGNsb3NlcyBoZXJlCgoJc3RhdHVzIHN0cmluZwoJd2lubmVyIGFkZHJlc3MgLy8gc2V0IGlmZiBzdGF0dXMgPT0gU3RhdHVzQXdhcmRlZAoKCXN1YnMgICAgKmF2bC5UcmVlIC8vIHN1Ym1pdHRlciBhZGRyZXNzIHN0cmluZyAtPiAqc3VibWlzc2lvbgoJbnVtU3VicyBpbnQ2NAoJYmFsbG90cyAqYXZsLlRyZWUgLy8gcmVzb2x2ZXIgYWRkcmVzcyBzdHJpbmcgLT4gc3VibWl0dGVyIGFkZHJlc3Mgc3RyaW5nCn0KCnZhciAoCglhZG1pbiAgICAgICAgYWRkcmVzcyAvLyBtYXkgc2V0IGZlZSwgZmVlIHJlY2lwaWVudCwgc3VjY2Vzc29yIGFkbWluCglmZWVSZWNpcGllbnQgYWRkcmVzcyAvLyBtYXkgd2l0aGRyYXcgZmVlcyBhbmQgc3dlZXAgc3VycGx1cwoJZmVlQnBzICAgICAgIGludDY0ICAgLy8gZmVlIHNuYXBzaG90dGVkIGludG8gTkVXIGJvdW50aWVzCgoJc2VsZiAgICAgIGFkZHJlc3MgLy8gdGhpcyByZWFsbSdzIGFkZHJlc3MsIGNhcHR1cmVkIGF0IGRlcGxveQoJbmV4dElEICAgIGludDY0CglvcGVuVG90YWwgaW50NjQgLy8gPT0gzqMgYW1vdW50IG92ZXIgYm91bnRpZXMgd2l0aCBzdGF0dXMgT3BlbgoKCWJvdW50aWVzID0gYXZsLk5ld1RyZWUoKSAvLyBwYWRJRChpZCkgLT4gKmJvdW50eQoJbGVkZ2VyICAgPSBmZWVsZWRnZXIuTXVzdE5ldyhNYXhGZWVCcHMpCikKCmZ1bmMgaW5pdCgpIHsKCWFkbWluID0gdW5zYWZlLk9yaWdpbkNhbGxlcigpCglmZWVSZWNpcGllbnQgPSBhZG1pbgoJc2VsZiA9IHVuc2FmZS5DdXJyZW50UmVhbG0oKS5BZGRyZXNzKCkKfQoKLy8gcmVqZWN0U3RyYXlTZW5kIGFib3J0cyB3aGVuIGNvaW5zIGFyZSBhdHRhY2hlZCB0byBhIG5vbi1wYXlhYmxlIGNhbGwuCi8vIFRoaXMgcmVhbG0gZG9lcyBob2xkIGZ1bmRzLCBzbyBhIHN0cmF5IHNlbmQgd291bGQgbm90IGJlIGxvc3Qgb3V0cmlnaHQKLy8g4oCUIGl0IHdvdWxkIGJlY29tZSBzd2VlcGFibGUgc3VycGx1cyBiZWxvbmdpbmcgdG8gdGhlIGZlZSByZWNpcGllbnQsCi8vIHNpbGVudGx5IGNvbnZlcnRpbmcgYSB1c2VyJ3MgY29pbnMgaW50byBwcm90b2NvbCByZXZlbnVlLiBBYm9ydGluZwovLyByZXZlcnRzIHRoZSB0cmFuc2ZlciB0byB0aGUgc2VuZGVyIGluc3RlYWQuIEd1YXJkZWQgb24gSXNVc2VyQ2FsbCwgbm90Ci8vIElzVXNlciwgYmVjYXVzZSBhIE1zZ1J1biBlcGhlbWVyYWwgY2FuIGNvbnN1bWUgdGhlIE9yaWdpblNlbmQgZW52ZWxvcGUKLy8gYmVmb3JlIGZvcndhcmRpbmcgY29udHJvbC4KLy8KLy8gU0NPUEUsIHByZWNpc2VseTogdGhlIGd1YXJkIHJlYWRzIHRoZSBPUklHSU5BVElORyB0cmFuc2FjdGlvbidzCi8vIGVudmVsb3BlLCBzbyBpdCBvbmx5IGluc3BlY3RzIGRpcmVjdCBFT0EgY2FsbHMuIEZvciBhIHJlYWxtLXJvdXRlZAovLyBjYWxsIHRoZSAtc2VuZCBlbnZlbG9wZSBpcyBkZWxpdmVyZWQgdG8gdGhlIElOVEVSTUVESUFSWSByZWFsbSdzCi8vIGFkZHJlc3MsIHNvIHRoZXJlIGlzIG5vdGhpbmcgYXQgdGhpcyByZWFsbSB0byByZWplY3QgYW5kIHRoZSBndWFyZAovLyBkZWxpYmVyYXRlbHkgZmFpbHMgb3Blbi4gVGhhdCBpcyBub3QgYSBob2xlOiBhbiBpbnRlcm1lZGlhcnkgdGhhdAovLyBzZXBhcmF0ZWx5IHNlbmRzIGNvaW5zIHRvIHRoaXMgcmVhbG0ncyBhZGRyZXNzIGlzIG1ha2luZyBhbiBvcmRpbmFyeQovLyB0cmFuc2Zlciwgd2hpY2ggbm8gZ3VhcmQgaW4gYW55IGVudHJ5cG9pbnQgY291bGQgaW50ZXJjZXB0LCBhbmQKLy8gd2hpY2ggbGFuZHMgYXMgc3VycGx1cyByZWNvdmVyYWJsZSB0aHJvdWdoIFN3ZWVwRGVub20uIENvaW5zIGNhbgovLyBvbmx5IGJlY29tZSBFU0NST1cgdGhyb3VnaCBDcmVhdGVCb3VudHkuCmZ1bmMgcmVqZWN0U3RyYXlTZW5kKGN1ciByZWFsbSkgewoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSA+IDAgewoJCXBhbmljKCJ0aGlzIGVudHJ5cG9pbnQgZG9lcyBub3QgYWNjZXB0IGNvaW5zIikKCX0KfQoKLy8gQ3JlYXRlQm91bnR5IGVzY3Jvd3MgdGhlIGF0dGFjaGVkIEdOT1QgYXMgYSBuZXcgb3BlbiBib3VudHkgYW5kCi8vIHJldHVybnMgaXRzIGlkLiBPbmx5IGRpcmVjdCBFT0EgY2FsbHMgd2l0aCAtc2VuZCBhcmUgYWNjZXB0ZWQuCi8vCi8vIHBhbmVsQ1NWIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgcmVzb2x2ZXIgYWRkcmVzc2VzOyB0aHJlc2hvbGQgaXMKLy8gaG93IG1hbnkgb2YgdGhlbSBtdXN0IG5hbWUgdGhlIHNhbWUgc3VibWlzc2lvbiBmb3IgaXQgdG8gd2luLgovLyBTdWJtaXNzaW9ucyBhcmUgYWNjZXB0ZWQgZm9yIHN1Ym1pdEJsb2NrcyBmcm9tIG5vdywgYWZ0ZXIgd2hpY2ggdGhlCi8vIHBhbmVsIGhhcyByZXNvbHZlQmxvY2tzIHRvIGRlY2lkZS4KLy8KLy8gVGhlIGN1cnJlbnQgcHJvdG9jb2wgZmVlIGlzIHNuYXBzaG90dGVkIGludG8gdGhlIGJvdW50eSBhbmQgbXVzdCBub3QKLy8gZXhjZWVkIG1heEZlZUJwcywgdGhlIGNlaWxpbmcgdGhlIGNhbGxlciBzaWduZWQgZm9yOyBwYXNzIE1heEZlZUJwcyB0bwovLyBhY2NlcHQgYW55IGxlZ2FsIGZlZS4KZnVuYyBDcmVhdGVCb3VudHkoY3VyIHJlYWxtLCB0aXRsZSwgZGVzY3JpcHRpb24sIHBhbmVsQ1NWIHN0cmluZywgdGhyZXNob2xkLCBzdWJtaXRCbG9ja3MsIHJlc29sdmVCbG9ja3MsIG1heEZlZUJwcyBpbnQ2NCkgaW50NjQgewoJZnVuZGVyLCBhbW91bnQgOj0gY29pbmlvLlJlY2VpdmUoMCwgY3VyLCBEZW5vbSkKCWlmIGZlZUJwcyA+IG1heEZlZUJwcyB7CgkJcGFuaWMoImN1cnJlbnQgZmVlICIgKyBpdG9hKGZlZUJwcykgKyAiIGJwcyBleGNlZWRzIHRoZSBjYWxsZXIncyBtYXhpbXVtICIgKyBpdG9hKG1heEZlZUJwcykpCgl9Cglhc3NlcnRWYWxpZFRpdGxlKHRpdGxlKQoJaWYgbGVuKGRlc2NyaXB0aW9uKSA9PSAwIHx8IGxlbihkZXNjcmlwdGlvbikgPiBNYXhEZXNjTGVuIHsKCQlwYW5pYygiZGVzY3JpcHRpb24gbXVzdCBiZSAxLSIgKyBzdHJjb252Lkl0b2EoTWF4RGVzY0xlbikgKyAiIGJ5dGVzIikKCX0KCWFzc2VydER1cmF0aW9uKCJzdWJtaXRCbG9ja3MiLCBzdWJtaXRCbG9ja3MpCglhc3NlcnREdXJhdGlvbigicmVzb2x2ZUJsb2NrcyIsIHJlc29sdmVCbG9ja3MpCgoJcGFuZWwsIHBhbmVsU2l6ZSA6PSBwYXJzZVBhbmVsKHBhbmVsQ1NWKQoJaWYgdGhyZXNob2xkIDwgMSB8fCB0aHJlc2hvbGQgPiBwYW5lbFNpemUgewoJCXBhbmljKCJ0aHJlc2hvbGQgbXVzdCBiZSBpbiBbMSwgcGFuZWwgc2l6ZSAiICsgaXRvYShwYW5lbFNpemUpICsgIl0iKQoJfQoKCW5ld09wZW5Ub3RhbCwgb2sgOj0gY2hlY2tlZEFkZChvcGVuVG90YWwsIGFtb3VudCkKCWlmICFvayB7CgkJcGFuaWMoIm9wZW4gZXNjcm93IG92ZXJmbG93IikKCX0KCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgluZXh0SUQrKwoJYiA6PSAmYm91bnR5ewoJCWlkOiAgICAgICAgICAgICAgbmV4dElELAoJCWZ1bmRlcjogICAgICAgICAgZnVuZGVyLAoJCXRpdGxlOiAgICAgICAgICAgdGl0bGUsCgkJZGVzY3JpcHRpb246ICAgICBkZXNjcmlwdGlvbiwKCQlhbW91bnQ6ICAgICAgICAgIGFtb3VudCwKCQlmZWVCcHM6ICAgICAgICAgIGZlZUJwcywKCQlwYW5lbDogICAgICAgICAgIHBhbmVsLAoJCXBhbmVsU2l6ZTogICAgICAgcGFuZWxTaXplLAoJCXRocmVzaG9sZDogICAgICAgdGhyZXNob2xkLAoJCXN1Ym1pdERlYWRsaW5lOiAgbm93ICsgc3VibWl0QmxvY2tzLAoJCXJlc29sdmVEZWFkbGluZTogbm93ICsgc3VibWl0QmxvY2tzICsgcmVzb2x2ZUJsb2NrcywKCQlzdGF0dXM6ICAgICAgICAgIFN0YXR1c09wZW4sCgkJc3ViczogICAgICAgICAgICBhdmwuTmV3VHJlZSgpLAoJCWJhbGxvdHM6ICAgICAgICAgYXZsLk5ld1RyZWUoKSwKCX0KCWJvdW50aWVzLlNldChwYWRJRChiLmlkKSwgYikKCW9wZW5Ub3RhbCA9IG5ld09wZW5Ub3RhbAoKCWNoYWluLkVtaXQoIkJvdW50eUNyZWF0ZWQiLAoJCSJpZCIsIGl0b2EoYi5pZCksCgkJImZ1bmRlciIsIGZ1bmRlci5TdHJpbmcoKSwKCQkiYW1vdW50IiwgaXRvYShhbW91bnQpLAoJCSJmZWVCcHMiLCBpdG9hKGIuZmVlQnBzKSwKCQkicGFuZWxTaXplIiwgaXRvYShwYW5lbFNpemUpLAoJCSJ0aHJlc2hvbGQiLCBpdG9hKHRocmVzaG9sZCksCgkJInN1Ym1pdERlYWRsaW5lIiwgaXRvYShiLnN1Ym1pdERlYWRsaW5lKSwKCQkicmVzb2x2ZURlYWRsaW5lIiwgaXRvYShiLnJlc29sdmVEZWFkbGluZSksCgkpCglyZXR1cm4gYi5pZAp9CgovLyBTdWJtaXQgcmVjb3JkcyAob3IgcmVwbGFjZXMpIHRoZSBjYWxsZXIncyBzdWJtaXNzaW9uIHRvIGFuIG9wZW4gYm91bnR5Ci8vIGJlZm9yZSBpdHMgc3VibWlzc2lvbiBkZWFkbGluZS4gT25lIHN1Ym1pc3Npb24gcGVyIGFkZHJlc3MgcGVyIGJvdW50eQovLyDigJQgcmUtc3VibWl0dGluZyByZXBsYWNlcyB0aGUgY2FsbGVyJ3Mgb3duIHJlZmVyZW5jZSBvbmx5LiBUaGUgZnVuZGVyCi8vIGFuZCBldmVyeSBwYW5lbCBtZW1iZXIgYXJlIGJhcnJlZCwgc28gbm8gcmVzb2x2ZXIgY2FuIHZvdGUgZm9yIHRoZWlyCi8vIG93biB3b3JrLgpmdW5jIFN1Ym1pdChjdXIgcmVhbG0sIGlkIGludDY0LCB1cmkgc3RyaW5nKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJc3VibWl0dGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYiA6PSBtdXN0R2V0Qm91bnR5KGlkKQoJaWYgYi5zdGF0dXMgIT0gU3RhdHVzT3BlbiB7CgkJcGFuaWMoImJvdW50eSBpcyBub3Qgb3BlbiIpCgl9CglpZiBydW50aW1lLkNoYWluSGVpZ2h0KCkgPj0gYi5zdWJtaXREZWFkbGluZSB7CgkJcGFuaWMoInN1Ym1pc3Npb24gd2luZG93IGhhcyBjbG9zZWQiKQoJfQoJaWYgc3VibWl0dGVyID09IGIuZnVuZGVyIHsKCQlwYW5pYygidGhlIGZ1bmRlciBjYW5ub3Qgc3VibWl0IHRvIHRoZWlyIG93biBib3VudHkiKQoJfQoJaWYgYi5wYW5lbC5IYXMoc3VibWl0dGVyLlN0cmluZygpKSB7CgkJcGFuaWMoImEgcGFuZWwgcmVzb2x2ZXIgY2Fubm90IHN1Ym1pdCB0byBhIGJvdW50eSB0aGV5IGp1ZGdlIikKCX0KCWlmIGxlbih1cmkpID09IDAgfHwgbGVuKHVyaSkgPiBNYXhVUklMZW4gewoJCXBhbmljKCJ1cmkgbXVzdCBiZSAxLSIgKyBzdHJjb252Lkl0b2EoTWF4VVJJTGVuKSArICIgYnl0ZXMiKQoJfQoKCWtleSA6PSBzdWJtaXR0ZXIuU3RyaW5nKCkKCWlmIHYgOj0gYi5zdWJzLkdldChrZXkpOyB2ICE9IG5pbCB7CgkJcyA6PSB2Ligqc3VibWlzc2lvbikKCQlzLnVyaSA9IHVyaQoJCXMuaGVpZ2h0ID0gcnVudGltZS5DaGFpbkhlaWdodCgpCgl9IGVsc2UgewoJCWlmIGIubnVtU3VicyA+PSBNYXhTdWJtaXNzaW9ucyB7CgkJCXBhbmljKCJib3VudHkgaGFzIHJlYWNoZWQgaXRzIHN1Ym1pc3Npb24gY2FwIikKCQl9CgkJYi5udW1TdWJzKysKCQliLnN1YnMuU2V0KGtleSwgJnN1Ym1pc3Npb257dXJpOiB1cmksIGhlaWdodDogcnVudGltZS5DaGFpbkhlaWdodCgpfSkKCX0KCgljaGFpbi5FbWl0KCJTdWJtaXR0ZWQiLCAiaWQiLCBpdG9hKGlkKSwgInN1Ym1pdHRlciIsIGtleSkKfQoKLy8gVm90ZSBjYXN0cyAob3IgY2hhbmdlcykgdGhlIGNhbGxpbmcgcmVzb2x2ZXIncyB2b3RlIGZvciBvbmUgb2YgdGhlCi8vIGJvdW50eSdzIHN1Ym1pc3Npb25zLiBPbmx5IHBhbmVsIG1lbWJlcnMgbWF5IHZvdGUsIGFuZCBvbmx5IGFmdGVyIHRoZQovLyBzdWJtaXNzaW9uIHdpbmRvdyBoYXMgY2xvc2VkIGFuZCBiZWZvcmUgdGhlIHJlc29sdXRpb24gZGVhZGxpbmUuIEEKLy8gcmVzb2x2ZXIgaG9sZHMgZXhhY3RseSBvbmUgbGl2ZSB2b3RlLCBjaGFuZ2VhYmxlIHVudGlsIHRoZSB0aHJlc2hvbGQKLy8gaXMgcmVhY2hlZC4KLy8KLy8gVGhlIHZvdGUgdGhhdCBicmluZ3MgYSBzdWJtaXNzaW9uIHRvIHRoZSB0aHJlc2hvbGQgYXdhcmRzIHRoZSBib3VudHkKLy8gaW4gdGhlIHNhbWUgdHJhbnNhY3Rpb246IHRoZSBlc2Nyb3cgbGVhdmVzIHRoZSBvcGVuIHBvb2wgYW5kIGlzCi8vIGNyZWRpdGVkIHRvIHRoZSB3aW5uZXIncyBjbGFpbWFibGUgYmFsYW5jZSBhdCB0aGUgZmVlIHNuYXBzaG90dGVkIGF0Ci8vIGNyZWF0aW9uLiBUZXJtaW5hbC4KZnVuYyBWb3RlKGN1ciByZWFsbSwgaWQgaW50NjQsIGNhbmRpZGF0ZSBhZGRyZXNzKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJcmVzb2x2ZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCgliIDo9IG11c3RHZXRCb3VudHkoaWQpCglpZiBiLnN0YXR1cyAhPSBTdGF0dXNPcGVuIHsKCQlwYW5pYygiYm91bnR5IGlzIG5vdCBvcGVuIikKCX0KCWlmICFiLnBhbmVsLkhhcyhyZXNvbHZlci5TdHJpbmcoKSkgewoJCXBhbmljKCJvbmx5IGEgcGFuZWwgcmVzb2x2ZXIgbWF5IHZvdGUiKQoJfQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJaWYgbm93IDwgYi5zdWJtaXREZWFkbGluZSB7CgkJcGFuaWMoInZvdGluZyBvcGVucyB3aGVuIHRoZSBzdWJtaXNzaW9uIHdpbmRvdyBjbG9zZXMiKQoJfQoJaWYgbm93ID49IGIucmVzb2x2ZURlYWRsaW5lIHsKCQlwYW5pYygicmVzb2x1dGlvbiB3aW5kb3cgaGFzIGNsb3NlZCIpCgl9CgoJY2FuZEtleSA6PSBjYW5kaWRhdGUuU3RyaW5nKCkKCWN2IDo9IGIuc3Vicy5HZXQoY2FuZEtleSkKCWlmIGN2ID09IG5pbCB7CgkJcGFuaWMoImNhbmRpZGF0ZSBtdXN0IGhhdmUgc3VibWl0dGVkIHRvIHRoaXMgYm91bnR5IikKCX0KCWNhbmQgOj0gY3YuKCpzdWJtaXNzaW9uKQoKCXJLZXkgOj0gcmVzb2x2ZXIuU3RyaW5nKCkKCWlmIHByZXYgOj0gYi5iYWxsb3RzLkdldChyS2V5KTsgcHJldiAhPSBuaWwgewoJCXByZXZLZXkgOj0gcHJldi4oc3RyaW5nKQoJCWlmIHByZXZLZXkgPT0gY2FuZEtleSB7CgkJCXBhbmljKCJhbHJlYWR5IHZvdGVkIGZvciB0aGlzIHN1Ym1pc3Npb24iKQoJCX0KCQkvLyBXaXRoZHJhdyB0aGUgcmVzb2x2ZXIncyBwcmV2aW91cyB2b3RlIGJlZm9yZSByZWNvcmRpbmcgdGhlIG5ldwoJCS8vIG9uZSwgc28gdGhlIHBlci1zdWJtaXNzaW9uIGNvdW50cyBhbHdheXMgc3VtIHRvIHRoZSBudW1iZXIgb2YKCQkvLyBsaXZlIGJhbGxvdHMuCgkJcHYgOj0gYi5zdWJzLkdldChwcmV2S2V5KQoJCXB2Ligqc3VibWlzc2lvbikudm90ZXMtLQoJfQoJYi5iYWxsb3RzLlNldChyS2V5LCBjYW5kS2V5KQoJY2FuZC52b3RlcysrCgoJY2hhaW4uRW1pdCgiVm90ZWQiLAoJCSJpZCIsIGl0b2EoaWQpLAoJCSJyZXNvbHZlciIsIHJLZXksCgkJImNhbmRpZGF0ZSIsIGNhbmRLZXksCgkJInZvdGVzIiwgaXRvYShjYW5kLnZvdGVzKSwKCQkidGhyZXNob2xkIiwgaXRvYShiLnRocmVzaG9sZCksCgkpCgoJaWYgY2FuZC52b3RlcyA+PSBiLnRocmVzaG9sZCB7CgkJYXdhcmQoYiwgY2FuZGlkYXRlLCBjYW5kLnZvdGVzKQoJfQp9CgovLyBhd2FyZCBtb3ZlcyBhbiBPcGVuIGJvdW50eSdzIGVzY3JvdyBpbnRvIHRoZSB3aW5uZXIncyBjbGFpbWFibGUKLy8gYmFsYW5jZSBhdCB0aGUgc25hcHNob3R0ZWQgZmVlIGFuZCBmaW5hbGl6ZXMgdGhlIHN0YXR1cy4gVGhlIGNhbGxlcgovLyBoYXMgYWxyZWFkeSB2ZXJpZmllZCBhdXRob3JpemF0aW9uLCBzdGF0dXMgYW5kIHRoZSB0aHJlc2hvbGQuCmZ1bmMgYXdhcmQoYiAqYm91bnR5LCB3aW5uZXIgYWRkcmVzcywgdm90ZXMgaW50NjQpIHsKCWNyZWRpdGVkLCBmZWUsIGVyciA6PSBsZWRnZXIuRGVwb3NpdCh3aW5uZXIuU3RyaW5nKCksIGIuYW1vdW50LCBiLmZlZUJwcykKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCW9wZW5Ub3RhbCAtPSBiLmFtb3VudCAvLyA+PSAwOiBvcGVuVG90YWwgPT0gzqMgb3BlbiBhbW91bnRzID49IGIuYW1vdW50CgliLnN0YXR1cyA9IFN0YXR1c0F3YXJkZWQKCWIud2lubmVyID0gd2lubmVyCgoJY2hhaW4uRW1pdCgiQm91bnR5QXdhcmRlZCIsCgkJImlkIiwgaXRvYShiLmlkKSwKCQkid2lubmVyIiwgd2lubmVyLlN0cmluZygpLAoJCSJjcmVkaXRlZCIsIGl0b2EoY3JlZGl0ZWQpLAoJCSJmZWUiLCBpdG9hKGZlZSksCgkJInZvdGVzIiwgaXRvYSh2b3RlcyksCgkpCn0KCi8vIENhbmNlbEJvdW50eSBjbG9zZXMgYW4gb3BlbiBib3VudHkgYW5kIHJlZnVuZHMgaXRzIGVzY3JvdyB0byB0aGUKLy8gZnVuZGVyLCBmZWUtZnJlZS4gT25seSB0aGUgZnVuZGVyIG1heSBjYW5jZWwsIGFuZCBPTkxZIHdoaWxlIG5vCi8vIGNvbnRyaWJ1dG9yIGhhcyBzdWJtaXR0ZWQ6IG9uY2Ugd29yayBleGlzdHMsIHRoZSBmdW5kZXIgY2Fubm90Ci8vIHVuaWxhdGVyYWxseSByZWNsYWltIHRoZSBlc2Nyb3cuIFRlcm1pbmFsLgpmdW5jIENhbmNlbEJvdW50eShjdXIgcmVhbG0sIGlkIGludDY0KSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJYiA6PSBtdXN0R2V0Qm91bnR5KGlkKQoJaWYgY2FsbGVyICE9IGIuZnVuZGVyIHsKCQlwYW5pYygib25seSB0aGUgYm91bnR5IGZ1bmRlciBtYXkgY2FuY2VsIikKCX0KCWlmIGIuc3RhdHVzICE9IFN0YXR1c09wZW4gewoJCXBhbmljKCJib3VudHkgaXMgbm90IG9wZW4iKQoJfQoJaWYgYi5udW1TdWJzID4gMCB7CgkJcGFuaWMoImNhbm5vdCBjYW5jZWwgYSBib3VudHkgdGhhdCBoYXMgc3VibWlzc2lvbnM7IGl0IG11c3QgYmUgcmVzb2x2ZWQgb3IgZXhwaXJlIikKCX0KCXJlZnVuZE9wZW4oYiwgU3RhdHVzQ2FuY2VsbGVkKQoJY2hhaW4uRW1pdCgiQm91bnR5Q2FuY2VsbGVkIiwgImlkIiwgaXRvYShpZCksICJmdW5kZXIiLCBiLmZ1bmRlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYi5hbW91bnQpKQp9CgovLyBFeHBpcmVCb3VudHkgY2xvc2VzIGFuIG9wZW4gYm91bnR5IHdob3NlIHJlc29sdXRpb24gZGVhZGxpbmUgcGFzc2VkCi8vIG1vcmUgdGhhbiBFeHBpcnlHcmFjZUJsb2NrcyBhZ28sIHJlZnVuZGluZyB0aGUgZnVuZGVyIGZlZS1mcmVlLiBBTllPTkUKLy8gbWF5IGNhbGwgaXQg4oCUIHRoaXMgaXMgdGhlIHBlcm1pc3Npb25sZXNzIHZhbHZlIHRoYXQgZ3VhcmFudGVlcyBlc2Nyb3cKLy8gY2FuIG5ldmVyIGJlIHRyYXBwZWQgYnkgYW4gaW5hY3RpdmUgb3IgZGVhZGxvY2tlZCBwYW5lbC4gVGVybWluYWwuCmZ1bmMgRXhwaXJlQm91bnR5KGN1ciByZWFsbSwgaWQgaW50NjQpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgliIDo9IG11c3RHZXRCb3VudHkoaWQpCglpZiBiLnN0YXR1cyAhPSBTdGF0dXNPcGVuIHsKCQlwYW5pYygiYm91bnR5IGlzIG5vdCBvcGVuIikKCX0KCWlmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA8IGIucmVzb2x2ZURlYWRsaW5lK0V4cGlyeUdyYWNlQmxvY2tzIHsKCQlwYW5pYygiYm91bnR5IGlzIG5vdCBleHBpcmFibGUgeWV0IikKCX0KCXJlZnVuZE9wZW4oYiwgU3RhdHVzRXhwaXJlZCkKCWNoYWluLkVtaXQoIkJvdW50eUV4cGlyZWQiLCAiaWQiLCBpdG9hKGIuaWQpLCAiZnVuZGVyIiwgYi5mdW5kZXIuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGIuYW1vdW50KSkKfQoKLy8gcmVmdW5kT3BlbiBtb3ZlcyBhbiBPcGVuIGJvdW50eSdzIGVzY3JvdyBpbnRvIHRoZSBmdW5kZXIncyBjbGFpbWFibGUKLy8gYmFsYW5jZSBmZWUtZnJlZSBhbmQgZmluYWxpemVzIHRoZSBzdGF0dXMuIENhbGxlcnMgaGF2ZSBhbHJlYWR5Ci8vIHZlcmlmaWVkIGF1dGhvcml6YXRpb24gYW5kIHN0YXR1cy4KZnVuYyByZWZ1bmRPcGVuKGIgKmJvdW50eSwgdGVybWluYWwgc3RyaW5nKSB7CglpZiBfLCBfLCBlcnIgOj0gbGVkZ2VyLkRlcG9zaXQoYi5mdW5kZXIuU3RyaW5nKCksIGIuYW1vdW50LCAwKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJb3BlblRvdGFsIC09IGIuYW1vdW50CgliLnN0YXR1cyA9IHRlcm1pbmFsCn0KCi8vIENsYWltIHNlbmRzIGFtb3VudCB1Z25vdCBvZiB0aGUgY2FsbGVyJ3MgY2xhaW1hYmxlIGJhbGFuY2UgKHdpbm5pbmdzCi8vIGFuZCByZWZ1bmRzKSBiYWNrIHRvIHRoZSBjYWxsZXIuCmZ1bmMgQ2xhaW0oY3VyIHJlYWxtLCBhbW91bnQgaW50NjQpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBlcnIgOj0gbGVkZ2VyLldpdGhkcmF3KGNhbGxlci5TdHJpbmcoKSwgYW1vdW50KTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGNhbGxlciwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkNsYWltIiwgInRvIiwgY2FsbGVyLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyBDbGFpbUFsbCBzZW5kcyB0aGUgY2FsbGVyJ3MgZW50aXJlIGNsYWltYWJsZSBiYWxhbmNlIGJhY2sgdG8gdGhlCi8vIGNhbGxlci4gRmFpbHMgaWYgdGhlcmUgaXMgbm90aGluZyB0byBjbGFpbS4KZnVuYyBDbGFpbUFsbChjdXIgcmVhbG0pIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglhbW91bnQsIGVyciA6PSBsZWRnZXIuV2l0aGRyYXdBbGwoY2FsbGVyLlN0cmluZygpKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJaWYgYW1vdW50ID09IDAgewoJCXBhbmljKCJub3RoaW5nIHRvIGNsYWltIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBjYWxsZXIsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJDbGFpbSIsICJ0byIsIGNhbGxlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gV2l0aGRyYXdGZWVzIHNlbmRzIHRoZSBhY2NydWVkIGZlZSBwb3QgdG8gdGhlIGZlZSByZWNpcGllbnQuIE9ubHkgdGhlCi8vIGZlZSByZWNpcGllbnQgbWF5IGNhbGwgaXQuCmZ1bmMgV2l0aGRyYXdGZWVzKGN1ciByZWFsbSkgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGNhbGxlciAhPSBmZWVSZWNpcGllbnQgewoJCXBhbmljKCJvbmx5IHRoZSBmZWUgcmVjaXBpZW50IG1heSB3aXRoZHJhdyBmZWVzIikKCX0KCWlmIGxlZGdlci5GZWVzQWNjcnVlZCgpID09IDAgewoJCXBhbmljKCJubyBmZWVzIGFjY3J1ZWQiKQoJfQoJYW1vdW50IDo9IGxlZGdlci5XaXRoZHJhd0ZlZXMoKQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGZlZVJlY2lwaWVudCwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkZlZXNXaXRoZHJhd24iLCAidG8iLCBmZWVSZWNpcGllbnQuU3RyaW5nKCksICJhbW91bnQiLCBpdG9hKGFtb3VudCkpCn0KCi8vIFN3ZWVwRGVub20gc2VuZHMgdGhlIHN1cnBsdXMgb2YgYSBzaW5nbGUgZGVub21pbmF0aW9uIHRvIHRoZSBmZWUKLy8gcmVjaXBpZW50LiBGb3IgdWdub3Qgb25seSB0aGUgZXhjZXNzIG92ZXIgTGlhYmlsaXRpZXMoKSBtb3Zlczsgb3RoZXIKLy8gZGVub21zIG1vdmUgd2hvbGx5LiBPbmx5IHRoZSBmZWUgcmVjaXBpZW50IG1heSBjYWxsIGl0LgpmdW5jIFN3ZWVwRGVub20oY3VyIHJlYWxtLCBkZW5vbSBzdHJpbmcpIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBjYWxsZXIgIT0gZmVlUmVjaXBpZW50IHsKCQlwYW5pYygib25seSB0aGUgZmVlIHJlY2lwaWVudCBtYXkgc3dlZXAgc3VycGx1cyIpCgl9CglyZXNlcnZlIDo9IGludDY0KDApCglpZiBkZW5vbSA9PSBEZW5vbSB7CgkJcmVzZXJ2ZSA9IExpYWJpbGl0aWVzKCkKCX0KCXN3ZXB0IDo9IGNvaW5pby5Td2VlcCgwLCBjdXIsIGZlZVJlY2lwaWVudCwgZGVub20sIHJlc2VydmUpCgljaGFpbi5FbWl0KCJTdXJwbHVzU3dlcHQiLCAidG8iLCBmZWVSZWNpcGllbnQuU3RyaW5nKCksICJjb2lucyIsIGl0b2Eoc3dlcHQpK2Rlbm9tKQp9CgovLyBTZXRGZWVCcHMgc2V0cyB0aGUgcHJvdG9jb2wgZmVlIHNuYXBzaG90dGVkIGludG8gRlVUVVJFIGJvdW50aWVzIGF0Ci8vIGNyZWF0aW9uLiBFeGlzdGluZyBib3VudGllcyBrZWVwIHRoZSBmZWUgdGhleSB3ZXJlIGNyZWF0ZWQgdW5kZXIuCi8vIEFkbWluIG9ubHk7IGJvdW5kZWQgYnkgWzAsIE1heEZlZUJwc10uCmZ1bmMgU2V0RmVlQnBzKGN1ciByZWFsbSwgYnBzIGludDY0KSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJYXNzZXJ0QWRtaW4oY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJaWYgYnBzIDwgMCB8fCBicHMgPiBNYXhGZWVCcHMgewoJCXBhbmljKCJmZWUgYnBzIG91dCBvZiByYW5nZSBbMCwgIiArIGl0b2EoTWF4RmVlQnBzKSArICJdIikKCX0KCW9sZCA6PSBmZWVCcHMKCWZlZUJwcyA9IGJwcwoJY2hhaW4uRW1pdCgiRmVlQnBzQ2hhbmdlZCIsICJvbGQiLCBpdG9hKG9sZCksICJuZXciLCBpdG9hKGJwcykpCn0KCi8vIFNldEZlZVJlY2lwaWVudCByZS1wb2ludHMgdGhlIGZlZS9zdXJwbHVzIHJvbGUsIGluY2x1ZGluZyB0aGUgcG90Ci8vIGFjY3J1ZWQgc28gZmFyLiBBZG1pbiBvbmx5OyB6ZXJvIGFkZHJlc3MgcmVqZWN0ZWQuCmZ1bmMgU2V0RmVlUmVjaXBpZW50KGN1ciByZWFsbSwgbmV4dCBhZGRyZXNzKSB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJYXNzZXJ0QWRtaW4oY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJdmFyIHplcm8gYWRkcmVzcwoJaWYgbmV4dCA9PSB6ZXJvIHsKCQlwYW5pYygiZW1wdHkgZmVlIHJlY2lwaWVudCIpCgl9CglvbGQgOj0gZmVlUmVjaXBpZW50CglmZWVSZWNpcGllbnQgPSBuZXh0CgljaGFpbi5FbWl0KCJGZWVSZWNpcGllbnRDaGFuZ2VkIiwgIm9sZCIsIG9sZC5TdHJpbmcoKSwgIm5ldyIsIG5leHQuU3RyaW5nKCkpCn0KCi8vIFRyYW5zZmVyQWRtaW4gaGFuZHMgdGhlIGFkbWluIHJvbGUgdG8gbmV4dC4gQWRtaW4gb25seTsgemVybyBhZGRyZXNzCi8vIHJlamVjdGVkLiBPbmUtc3RlcCAoZG9jdW1lbnRlZCB0cmFkZS1vZmYsIG1hdGNoaW5nIHRoZSBzaWJsaW5ncykuCmZ1bmMgVHJhbnNmZXJBZG1pbihjdXIgcmVhbG0sIG5leHQgYWRkcmVzcykgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWFzc2VydEFkbWluKGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSkKCXZhciB6ZXJvIGFkZHJlc3MKCWlmIG5leHQgPT0gemVybyB7CgkJcGFuaWMoImVtcHR5IGFkbWluIGFkZHJlc3MiKQoJfQoJYWRtaW4gPSBuZXh0CgljaGFpbi5FbWl0KCJBZG1pblRyYW5zZmVycmVkIiwgIm5ld0FkbWluIiwgbmV4dC5TdHJpbmcoKSkKfQoKLy8gLS0tIHJlYWQtb25seSB2aWV3cyAtLS0KCi8vIEJvdW50eUluZm8gcmV0dXJucyBhIGJvdW50eSdzIHNjYWxhciBmaWVsZHMgYnkgdmFsdWUuCmZ1bmMgQm91bnR5SW5mbyhpZCBpbnQ2NCkgKGZ1bmRlciBhZGRyZXNzLCB0aXRsZSBzdHJpbmcsIGFtb3VudCwgZmVlQnBzLCBzdWJtaXREZWFkbGluZSwgcmVzb2x2ZURlYWRsaW5lIGludDY0LCBzdGF0dXMgc3RyaW5nLCB3aW5uZXIgYWRkcmVzcywgbnVtU3VibWlzc2lvbnMsIHBhbmVsU2l6ZSwgdGhyZXNob2xkIGludDY0KSB7CgliIDo9IG11c3RHZXRCb3VudHkoaWQpCglyZXR1cm4gYi5mdW5kZXIsIGIudGl0bGUsIGIuYW1vdW50LCBiLmZlZUJwcywgYi5zdWJtaXREZWFkbGluZSwgYi5yZXNvbHZlRGVhZGxpbmUsIGIuc3RhdHVzLCBiLndpbm5lciwgYi5udW1TdWJzLCBiLnBhbmVsU2l6ZSwgYi50aHJlc2hvbGQKfQoKLy8gRGVzY3JpcHRpb24gcmV0dXJucyBhIGJvdW50eSdzIHJhdyBkZXNjcmlwdGlvbiB0ZXh0LgpmdW5jIERlc2NyaXB0aW9uKGlkIGludDY0KSBzdHJpbmcgeyByZXR1cm4gbXVzdEdldEJvdW50eShpZCkuZGVzY3JpcHRpb24gfQoKLy8gU3VibWlzc2lvbk9mIHJldHVybnMgYWRkcidzIGNvbnRlbnQgcmVmZXJlbmNlLCBzdWJtaXNzaW9uIGhlaWdodCBhbmQKLy8gY3VycmVudCB2b3RlIGNvdW50IGZvciBhIGJvdW50eSwgd2l0aCBvayByZXBvcnRpbmcgd2hldGhlciBhCi8vIHN1Ym1pc3Npb24gZXhpc3RzLgpmdW5jIFN1Ym1pc3Npb25PZihpZCBpbnQ2NCwgYWRkciBhZGRyZXNzKSAodXJpIHN0cmluZywgaGVpZ2h0LCB2b3RlcyBpbnQ2NCwgb2sgYm9vbCkgewoJYiA6PSBtdXN0R2V0Qm91bnR5KGlkKQoJdiA6PSBiLnN1YnMuR2V0KGFkZHIuU3RyaW5nKCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICIiLCAwLCAwLCBmYWxzZQoJfQoJcyA6PSB2Ligqc3VibWlzc2lvbikKCXJldHVybiBzLnVyaSwgcy5oZWlnaHQsIHMudm90ZXMsIHRydWUKfQoKLy8gSXNQYW5lbE1lbWJlciByZXBvcnRzIHdoZXRoZXIgYWRkciBtYXkgdm90ZSBvbiBhIGJvdW50eS4KZnVuYyBJc1BhbmVsTWVtYmVyKGlkIGludDY0LCBhZGRyIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIG11c3RHZXRCb3VudHkoaWQpLnBhbmVsLkhhcyhhZGRyLlN0cmluZygpKQp9CgovLyBQYW5lbCByZXR1cm5zIGEgYm91bnR5J3MgcmVzb2x2ZXIgYWRkcmVzc2VzIGFzIGEgY29tbWEtc2VwYXJhdGVkCi8vIGxpc3QsIGluIHNvcnRlZCBvcmRlci4KZnVuYyBQYW5lbChpZCBpbnQ2NCkgc3RyaW5nIHsKCWIgOj0gbXVzdEdldEJvdW50eShpZCkKCW91dCA6PSAiIgoJYi5wYW5lbC5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrZXkgc3RyaW5nLCBfIGFueSkgYm9vbCB7CgkJaWYgb3V0ICE9ICIiIHsKCQkJb3V0ICs9ICIsIgoJCX0KCQlvdXQgKz0ga2V5CgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIG91dAp9CgovLyBWb3RlT2YgcmV0dXJucyB0aGUgc3VibWlzc2lvbiBhIHJlc29sdmVyIGN1cnJlbnRseSB2b3RlcyBmb3IsIHdpdGggb2sKLy8gcmVwb3J0aW5nIHdoZXRoZXIgdGhhdCByZXNvbHZlciBoYXMgdm90ZWQgYXQgYWxsLgpmdW5jIFZvdGVPZihpZCBpbnQ2NCwgcmVzb2x2ZXIgYWRkcmVzcykgKGNhbmRpZGF0ZSBzdHJpbmcsIG9rIGJvb2wpIHsKCWIgOj0gbXVzdEdldEJvdW50eShpZCkKCXYgOj0gYi5iYWxsb3RzLkdldChyZXNvbHZlci5TdHJpbmcoKSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gIiIsIGZhbHNlCgl9CglyZXR1cm4gdi4oc3RyaW5nKSwgdHJ1ZQp9CgovLyBWb3Rlc0Nhc3QgcmV0dXJucyBob3cgbWFueSByZXNvbHZlcnMgY3VycmVudGx5IGhvbGQgYSBsaXZlIHZvdGUuCmZ1bmMgVm90ZXNDYXN0KGlkIGludDY0KSBpbnQ2NCB7IHJldHVybiBpbnQ2NChtdXN0R2V0Qm91bnR5KGlkKS5iYWxsb3RzLlNpemUoKSkgfQoKLy8gQWRtaW4gcmV0dXJucyB0aGUgY3VycmVudCBhZG1pbi4KZnVuYyBBZG1pbigpIGFkZHJlc3MgeyByZXR1cm4gYWRtaW4gfQoKLy8gRmVlUmVjaXBpZW50IHJldHVybnMgd2hvIG1heSB3aXRoZHJhdyBmZWVzIGFuZCBzd2VlcCBzdXJwbHVzLgpmdW5jIEZlZVJlY2lwaWVudCgpIGFkZHJlc3MgeyByZXR1cm4gZmVlUmVjaXBpZW50IH0KCi8vIEZlZUJwcyByZXR1cm5zIHRoZSBmZWUgdGhhdCB3aWxsIGJlIHNuYXBzaG90dGVkIGludG8gbmV3bHkgY3JlYXRlZAovLyBib3VudGllcyAoZXhpc3RpbmcgYm91bnRpZXMga2VlcCB0aGVpciBvd24gc25hcHNob3QpLgpmdW5jIEZlZUJwcygpIGludDY0IHsgcmV0dXJuIGZlZUJwcyB9CgovLyBGZWVPbiBwcmV2aWV3cyB0aGUgZmVlIGFuZCBuZXQgcGF5b3V0IGZvciBhIGJvdW50eSBvZiBhbW91bnQgYXQgdGhlCi8vIENVUlJFTlQgRmVlQnBzLgpmdW5jIEZlZU9uKGFtb3VudCBpbnQ2NCkgKGZlZSwgY3JlZGl0ZWQgaW50NjQpIHsKCWYsIGVyciA6PSBmZWVsZWRnZXIuRmVlRm9yKGFtb3VudCwgZmVlQnBzKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJcmV0dXJuIGYsIGFtb3VudCAtIGYKfQoKLy8gTnVtQm91bnRpZXMgcmV0dXJucyBob3cgbWFueSBib3VudGllcyBoYXZlIGV2ZXIgYmVlbiBjcmVhdGVkLgpmdW5jIE51bUJvdW50aWVzKCkgaW50NjQgeyByZXR1cm4gbmV4dElEIH0KCi8vIE9wZW5Ub3RhbCByZXR1cm5zIHRoZSBlc2Nyb3cgaGVsZCBieSBvcGVuIGJvdW50aWVzICh0aGUgQiB0ZXJtKS4KZnVuYyBPcGVuVG90YWwoKSBpbnQ2NCB7IHJldHVybiBvcGVuVG90YWwgfQoKLy8gQmFsYW5jZU9mIHJldHVybnMgYWRkcidzIGNsYWltYWJsZSBiYWxhbmNlICh3aW5uaW5ncyArIHJlZnVuZHMpLgpmdW5jIEJhbGFuY2VPZihhZGRyIGFkZHJlc3MpIGludDY0IHsgcmV0dXJuIGxlZGdlci5CYWxhbmNlT2YoYWRkci5TdHJpbmcoKSkgfQoKLy8gVXNlcnNUb3RhbCByZXR1cm5zIHRoZSBzdW0gb2YgYWxsIGNsYWltYWJsZSBiYWxhbmNlcyAodGhlIFUgdGVybSkuCmZ1bmMgVXNlcnNUb3RhbCgpIGludDY0IHsgcmV0dXJuIGxlZGdlci5Vc2Vyc1RvdGFsKCkgfQoKLy8gRmVlc0FjY3J1ZWQgcmV0dXJucyB0aGUgZmVlIHBvdCAodGhlIEYgdGVybSkuCmZ1bmMgRmVlc0FjY3J1ZWQoKSBpbnQ2NCB7IHJldHVybiBsZWRnZXIuRmVlc0FjY3J1ZWQoKSB9CgovLyBMaWFiaWxpdGllcyByZXR1cm5zIGV2ZXJ5dGhpbmcgdGhpcyByZWFsbSBvd2VzOgovLyBvcGVuVG90YWwgKyBVc2Vyc1RvdGFsICsgRmVlc0FjY3J1ZWQuCmZ1bmMgTGlhYmlsaXRpZXMoKSBpbnQ2NCB7IHJldHVybiBvcGVuVG90YWwgKyBsZWRnZXIuTGlhYmlsaXRpZXMoKSB9CgovLyBIZWxkIHJldHVybnMgdGhlIHVnbm90IGFjdHVhbGx5IGhlbGQgYXQgdGhlIHJlYWxtIGFkZHJlc3MgKEgpLgpmdW5jIEhlbGQoKSBpbnQ2NCB7IHJldHVybiBjb2luaW8uSGVsZEF0KHNlbGYsIERlbm9tKSB9CgovLyBTdXJwbHVzIHJldHVybnMgSGVsZCgpIC0gTGlhYmlsaXRpZXMoKSAodGhlIFMgdGVybSkuCmZ1bmMgU3VycGx1cygpIGludDY0IHsgcmV0dXJuIEhlbGQoKSAtIExpYWJpbGl0aWVzKCkgfQoKLy8gQWRkcmVzcyByZXR1cm5zIHRoaXMgcmVhbG0ncyBhZGRyZXNzICh0aGUgZXNjcm93IHRhcmdldCkuCmZ1bmMgQWRkcmVzcygpIGFkZHJlc3MgeyByZXR1cm4gc2VsZiB9CgovLyBIZWlnaHQgcmV0dXJucyB0aGUgY3VycmVudCBjaGFpbiBoZWlnaHQgKGRlYWRsaW5lIGFyaXRobWV0aWMgYWlkKS4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gUmVuZGVyIHNob3dzIHRoZSBib2FyZCBhdCAiIiBhbmQgYSBib3VudHkgZGV0YWlsIGF0ICI8aWQ+Ii4gRnJlZSB0ZXh0Ci8vICh0aXRsZXMgYXJlIGNoYXJzZXQtcmVzdHJpY3RlZDsgZGVzY3JpcHRpb25zIGFuZCBVUklzIGFyZSBub3QpIHBhc3NlcwovLyB0aHJvdWdoIHRoZSBlY29zeXN0ZW0gc2FuaXRpemVyIGJlZm9yZSBoaXR0aW5nIG1hcmtkb3duLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCWlmIHBhdGggIT0gIiIgewoJCXJldHVybiByZW5kZXJCb3VudHkocGF0aCkKCX0KCWhlbGQgOj0gSGVsZCgpCglsaWFiIDo9IExpYWJpbGl0aWVzKCkKCXN0YXR1cyA6PSAiT0siCglpZiBoZWxkIDwgbGlhYiB7CgkJc3RhdHVzID0gIlZJT0xBVEVEIgoJfQoJb3V0IDo9ICIjIEJvdW50eSBwYW5lbFxuXG4iCglvdXQgKz0gIkVzY3Jvd2VkIEdOT1QgYm91bnRpZXMgcmVzb2x2ZWQgYnkgYSBwYW5lbCBuYW1lZCBhdCBjcmVhdGlvbiwgbm90IGJ5IHRoZSBmdW5kZXIuXG5cbiIKCW91dCArPSAiIyMgQ29uZmlndXJhdGlvblxuXG4iCglvdXQgKz0gIi0gZmVlIGZvciBuZXcgYm91bnRpZXM6ICIgKyBpdG9hKGZlZUJwcykgKyAiIGJwcyAoY2FwICIgKyBpdG9hKE1heEZlZUJwcykgKwoJCSIgYnBzOyBlYWNoIGJvdW50eSBrZWVwcyB0aGUgZmVlIHNuYXBzaG90dGVkIGF0IGl0cyBjcmVhdGlvbilcbiIKCW91dCArPSAiLSBmZWUgcmVjaXBpZW50OiAiICsgZmVlUmVjaXBpZW50LlN0cmluZygpICsgIlxuIgoJb3V0ICs9ICItIGFkbWluOiAiICsgYWRtaW4uU3RyaW5nKCkgKyAiXG5cbiIKCW91dCArPSAiIyMgQWNjb3VudGluZyAoSCA9PSBCICsgVSArIEYgKyBTKVxuXG4iCglvdXQgKz0gIi0gb3BlbiBlc2Nyb3cgKEIpOiAiICsgaXRvYShvcGVuVG90YWwpICsgRGVub20gKyAiXG4iCglvdXQgKz0gIi0gY2xhaW1hYmxlIChVKTogIiArIGl0b2EobGVkZ2VyLlVzZXJzVG90YWwoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBmZWVzIGFjY3J1ZWQgKEYpOiAiICsgaXRvYShsZWRnZXIuRmVlc0FjY3J1ZWQoKSkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBoZWxkIChIKTogIiArIGl0b2EoaGVsZCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBjb25zZXJ2YXRpb246ICIgKyBzdGF0dXMgKyAiXG5cbiIKCW91dCArPSAiIyMgTGF0ZXN0IGJvdW50aWVzXG5cbiIKCWlmIG5leHRJRCA9PSAwIHsKCQlvdXQgKz0gIk5vIGJvdW50aWVzIHlldC5cbiIKCQlyZXR1cm4gb3V0Cgl9CglzaG93biA6PSAwCglib3VudGllcy5SZXZlcnNlSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQliIDo9IHYuKCpib3VudHkpCgkJb3V0ICs9ICItIFsjIiArIGl0b2EoYi5pZCkgKyAiXSgiICsgUmVhbG1QYXRoICsgIjoiICsgaXRvYShiLmlkKSArICIpIFsiICsKCQkJYi5zdGF0dXMgKyAiXSAiICsgYi50aXRsZSArICIg4oCUICIgKyBpdG9hKGIuYW1vdW50KSArIERlbm9tICsKCQkJIiAoIiArIGl0b2EoYi5udW1TdWJzKSArICIgc3VibWlzc2lvbnMsICIgKyBpdG9hKGIudGhyZXNob2xkKSArICItb2YtIiArIGl0b2EoYi5wYW5lbFNpemUpICsgIilcbiIKCQlzaG93bisrCgkJcmV0dXJuIHNob3duID49IE1heFJlbmRlclJvd3MKCX0pCglpZiBpbnQ2NChzaG93bikgPCBuZXh0SUQgewoJCW91dCArPSAiXG4+IFshTk9URV1cbj4gU2hvd2luZyB0aGUgIiArIHN0cmNvbnYuSXRvYShzaG93bikgKyAiIG1vc3QgcmVjZW50IG9mICIgKwoJCQlpdG9hKG5leHRJRCkgKyAiLiBVc2UgQm91bnR5SW5mbyhpZCkgZm9yIGFueSBzcGVjaWZpYyBib3VudHkuXG4iCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgcmVuZGVyQm91bnR5KHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWQsIGVyciA6PSBzdHJjb252LlBhcnNlSW50KHBhdGgsIDEwLCA2NCkKCWlmIGVyciAhPSBuaWwgewoJCXJldHVybiAiPiBbIVdBUk5JTkddXG4+IGludmFsaWQgYm91bnR5IGlkXG4iCgl9Cgl2IDo9IGJvdW50aWVzLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuICI+IFshV0FSTklOR11cbj4gdW5rbm93biBib3VudHkgaWRcbiIKCX0KCWIgOj0gdi4oKmJvdW50eSkKCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCglvdXQgOj0gIiMgQm91bnR5ICMiICsgaXRvYShiLmlkKSArICI6ICIgKyBiLnRpdGxlICsgIlxuXG4iCglvdXQgKz0gIi0gc3RhdHVzOiAiICsgYi5zdGF0dXMgKyAiXG4iCglvdXQgKz0gIi0gZnVuZGVyOiAiICsgYi5mdW5kZXIuU3RyaW5nKCkgKyAiXG4iCglvdXQgKz0gIi0gYW1vdW50OiAiICsgaXRvYShiLmFtb3VudCkgKyBEZW5vbSArICJcbiIKCW91dCArPSAiLSBmZWUgKHNuYXBzaG90KTogIiArIGl0b2EoYi5mZWVCcHMpICsgIiBicHNcbiIKCW91dCArPSAiLSByZXNvbHV0aW9uOiAiICsgaXRvYShiLnRocmVzaG9sZCkgKyAiIG9mICIgKyBpdG9hKGIucGFuZWxTaXplKSArICIgcGFuZWwgdm90ZXNcbiIKCW91dCArPSAiLSBzdWJtaXNzaW9ucyBjbG9zZTogYmxvY2sgIiArIGl0b2EoYi5zdWJtaXREZWFkbGluZSkgKyAiXG4iCglvdXQgKz0gIi0gcmVzb2x1dGlvbiBjbG9zZXM6IGJsb2NrICIgKyBpdG9hKGIucmVzb2x2ZURlYWRsaW5lKSArICIgKG5vdyAiICsgaXRvYShub3cpICsgIilcbiIKCW91dCArPSAiLSBzdWJtaXNzaW9uczogIiArIGl0b2EoYi5udW1TdWJzKSArICJcbiIKCWlmIGIuc3RhdHVzID09IFN0YXR1c0F3YXJkZWQgewoJCW91dCArPSAiLSB3aW5uZXI6ICIgKyBiLndpbm5lci5TdHJpbmcoKSArICJcbiIKCX0KCglvdXQgKz0gIlxuIyMgRGVzY3JpcHRpb25cblxuIiArIHNhbml0aXplLklubGluZVRleHQoYi5kZXNjcmlwdGlvbikgKyAiXG4iCgoJb3V0ICs9ICJcbiMjIFBhbmVsXG5cbiIKCWIucGFuZWwuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgXyBhbnkpIGJvb2wgewoJCW91dCArPSAiLSAiICsga2V5ICsgIlxuIgoJCXJldHVybiBmYWxzZQoJfSkKCglvdXQgKz0gIlxuIyMgU3VibWlzc2lvbnNcblxuIgoJaWYgYi5udW1TdWJzID09IDAgewoJCW91dCArPSAiTm8gc3VibWlzc2lvbnMgeWV0LlxuIgoJCXJldHVybiBvdXQKCX0KCXNob3duIDo9IDAKCWIuc3Vicy5JdGVyYXRlKCIiLCAiIiwgZnVuYyhrZXkgc3RyaW5nLCBzdiBhbnkpIGJvb2wgewoJCXMgOj0gc3YuKCpzdWJtaXNzaW9uKQoJCW91dCArPSAiLSAiICsga2V5ICsgIiDigJQgIiArIGl0b2Eocy52b3RlcykgKyAiIHZvdGUocyksIGJsb2NrICIgKyBpdG9hKHMuaGVpZ2h0KSArCgkJCSJcbiAgLSAiICsgc2FuaXRpemUuSW5saW5lVGV4dChzLnVyaSkgKyAiXG4iCgkJc2hvd24rKwoJCXJldHVybiBzaG93biA+PSBNYXhSZW5kZXJSb3dzCgl9KQoJaWYgaW50NjQoc2hvd24pIDwgYi5udW1TdWJzIHsKCQlvdXQgKz0gIlxuPiBbIU5PVEVdXG4+IFNob3dpbmcgIiArIHN0cmNvbnYuSXRvYShzaG93bikgKyAiIG9mICIgKyBpdG9hKGIubnVtU3VicykgKwoJCQkiIHN1Ym1pc3Npb25zLiBVc2UgU3VibWlzc2lvbk9mKGlkLCBhZGRyKSBmb3IgYW55IHNwZWNpZmljIG9uZS5cbiIKCX0KCXJldHVybiBvdXQKfQoKLy8gLS0tIGludGVybmFscyAtLS0KCmZ1bmMgYXNzZXJ0QWRtaW4oY2FsbGVyIGFkZHJlc3MpIHsKCWlmIGNhbGxlciAhPSBhZG1pbiB7CgkJcGFuaWMoImFkbWluIG9ubHkiKQoJfQp9CgpmdW5jIG11c3RHZXRCb3VudHkoaWQgaW50NjQpICpib3VudHkgewoJdiA6PSBib3VudGllcy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKCJ1bmtub3duIGJvdW50eSBpZCIpCgl9CglyZXR1cm4gdi4oKmJvdW50eSkKfQoKZnVuYyBhc3NlcnREdXJhdGlvbihuYW1lIHN0cmluZywgYmxvY2tzIGludDY0KSB7CglpZiBibG9ja3MgPCBNaW5EdXJhdGlvbkJsb2NrcyB8fCBibG9ja3MgPiBNYXhEdXJhdGlvbkJsb2NrcyB7CgkJcGFuaWMobmFtZSArICIgb3V0IG9mIHJhbmdlIFsiICsgaXRvYShNaW5EdXJhdGlvbkJsb2NrcykgKyAiLCAiICsgaXRvYShNYXhEdXJhdGlvbkJsb2NrcykgKyAiXSIpCgl9Cn0KCi8vIHBhcnNlUGFuZWwgdHVybnMgYSBjb21tYS1zZXBhcmF0ZWQgcmVzb2x2ZXIgbGlzdCBpbnRvIGEgbWVtYmVyc2hpcAovLyB0cmVlLiBFdmVyeSBlbnRyeSBtdXN0IGJlIGEgdmFsaWQsIG5vbi1lbXB0eSwgbm9uLWR1cGxpY2F0ZSBiZWNoMzIKLy8gYWRkcmVzcy4gVmFsaWRpdHkgaXMgY2hlY2tlZCBoZXJlIHJhdGhlciB0aGFuIHRydXN0ZWQ6IGEgbWlzdHlwZWQKLy8gcmVzb2x2ZXIgYWRkcmVzcyB3b3VsZCBzaWxlbnRseSBzaHJpbmsgdGhlIGVmZmVjdGl2ZSBwYW5lbCBhbmQgY291bGQKLy8gbWFrZSB0aGUgdGhyZXNob2xkIHBlcm1hbmVudGx5IHVucmVhY2hhYmxlLCB3aGljaCBpcyBhIGZ1bmQtdHJhcHBpbmcKLy8gc2hhcGUgZXZlbiB3aXRoIHRoZSBleHBpcnkgdmFsdmUgaW4gcGxhY2UuCmZ1bmMgcGFyc2VQYW5lbChjc3Ygc3RyaW5nKSAoKmF2bC5UcmVlLCBpbnQ2NCkgewoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChjc3YsICIsIikKCXBhbmVsIDo9IGF2bC5OZXdUcmVlKCkKCWNvdW50IDo9IGludDY0KDApCglmb3IgXywgcCA6PSByYW5nZSBwYXJ0cyB7CgkJa2V5IDo9IHN0cmluZ3MuVHJpbVNwYWNlKHApCgkJaWYga2V5ID09ICIiIHsKCQkJcGFuaWMoInBhbmVsIGNvbnRhaW5zIGFuIGVtcHR5IGVudHJ5IikKCQl9CgkJaWYgIWFkZHJlc3Moa2V5KS5Jc1ZhbGlkKCkgewoJCQlwYW5pYygicGFuZWwgY29udGFpbnMgYW4gaW52YWxpZCBhZGRyZXNzOiAiICsga2V5KQoJCX0KCQlpZiBwYW5lbC5IYXMoa2V5KSB7CgkJCXBhbmljKCJwYW5lbCBjb250YWlucyBhIGR1cGxpY2F0ZSBhZGRyZXNzOiAiICsga2V5KQoJCX0KCQljb3VudCsrCgkJaWYgY291bnQgPiBNYXhQYW5lbFNpemUgewoJCQlwYW5pYygicGFuZWwgZXhjZWVkcyAiICsgaXRvYShNYXhQYW5lbFNpemUpICsgIiByZXNvbHZlcnMiKQoJCX0KCQlwYW5lbC5TZXQoa2V5LCBzdHJ1Y3R7fXt9KQoJfQoJaWYgY291bnQgPT0gMCB7CgkJcGFuaWMoInBhbmVsIG11c3QgbmFtZSBhdCBsZWFzdCBvbmUgcmVzb2x2ZXIiKQoJfQoJcmV0dXJuIHBhbmVsLCBjb3VudAp9CgovLyBhc3NlcnRWYWxpZFRpdGxlIGJvdW5kcyBsZW5ndGggYW5kIHJlc3RyaWN0cyB0aGUgY2hhcnNldCBzbyB0aXRsZXMgYXJlCi8vIGxpc3Qtc2FmZSBpbiBSZW5kZXIgd2l0aG91dCBlc2NhcGluZy4KZnVuYyBhc3NlcnRWYWxpZFRpdGxlKHRpdGxlIHN0cmluZykgewoJaWYgbGVuKHRpdGxlKSA9PSAwIHx8IGxlbih0aXRsZSkgPiBNYXhUaXRsZUxlbiB7CgkJcGFuaWMoInRpdGxlIG11c3QgYmUgMS0iICsgc3RyY29udi5JdG9hKE1heFRpdGxlTGVuKSArICIgY2hhcmFjdGVycyIpCgl9Cglmb3IgaSA6PSAwOyBpIDwgbGVuKHRpdGxlKTsgaSsrIHsKCQljIDo9IHRpdGxlW2ldCgkJc3dpdGNoIHsKCQljYXNlIGMgPj0gJ2EnICYmIGMgPD0gJ3onOgoJCWNhc2UgYyA+PSAnQScgJiYgYyA8PSAnWic6CgkJY2FzZSBjID49ICcwJyAmJiBjIDw9ICc5JzoKCQljYXNlIGMgPT0gJyAnIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy0nOgoJCWRlZmF1bHQ6CgkJCXBhbmljKCJ0aXRsZSBtYXkgb25seSBjb250YWluIGxldHRlcnMsIGRpZ2l0cywgc3BhY2UsIF8gYW5kIC0iKQoJCX0KCX0KfQoKLy8gcGFkSUQgcmVuZGVycyBhbiBpZCBhcyBhIGZpeGVkLXdpZHRoIGtleSBzbyBhdmwgaXRlcmF0aW9uIG9yZGVyIGlzCi8vIG51bWVyaWMgb3JkZXIuCmZ1bmMgcGFkSUQoaWQgaW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkKCWZvciBsZW4ocykgPCAxMiB7CgkJcyA9ICIwIiArIHMKCX0KCXJldHVybiBzCn0KCmZ1bmMgaXRvYShuIGludDY0KSBzdHJpbmcgewoJcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKQp9CgpmdW5jIGNoZWNrZWRBZGQoYSwgYiBpbnQ2NCkgKGludDY0LCBib29sKSB7CglzdW0gOj0gYSArIGIKCWlmIChiID4gMCAmJiBzdW0gPCBhKSB8fCAoYiA8IDAgJiYgc3VtID4gYSkgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHN1bSwgdHJ1ZQp9ChpnCgtnbm9tb2QudG9tbBJYbW9kdWxlID0gImduby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9ib3VudHlfcGFuZWwiCmdubyA9ICIwLjkiCiINMTAwMDAwMDB1Z25vdBISCJa84U0SCzE2MzA3OHVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkBTIEhT17btApLkvXeKw6CAQu2q52CxjIdADWzQuOo1lW8fCyZaDERc4m9uNDTM/cx+QWG00WiVY6kHVgn5/YdWGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}