{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "UyvpCrkFIbDW1LP5g+3p3TFciXXPMK1ciYSDf01X400=",
    "height": "602876",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": [
          {
            "@type": "/tm.StorageDepositEvent",
            "bytes_delta": "17492",
            "fee_delta": "1749200ugnot",
            "pkg_path": "gno.land/r/g1ut6uspuh73e02yauxpmyt8g3wwddaq8utagvm3/upgrade_registry"
          }
        ],
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "34787199",
      "GasUsed": "23191456"
    },
    "tx": "CqJvCgwvdm0ubV9hZGRwa2cSkW8KKGcxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMS1W4KEHVwZ3JhZGVfcmVnaXN0cnkSRGduby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy91cGdyYWRlX3JlZ2lzdHJ5GmsKC2dub21vZC50b21sElxtb2R1bGUgPSAiZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3VwZ3JhZGVfcmVnaXN0cnkiCmdubyA9ICIwLjkiChqNbQoUdXBncmFkZV9yZWdpc3RyeS5nbm8S9GxwYWNrYWdlIHVwZ3JhZGVfcmVnaXN0cnkKCmltcG9ydCAoCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCSJzdHJpbmdzIgopCgovLyBDb250cmFjdEVudHJ5IHJlcHJlc2VudHMgYSByZWdpc3RlcmVkIGNvbnRyYWN0IGFuZCBpdHMgdXBncmFkZSBzdGF0dXMuCi8vCi8vIEFuIGVudHJ5J3MgQWRkcmVzcyBpcyBBTFdBWVMgdGhlIGFkZHJlc3MgdGhhdCBjYWxsZWQgUmVnaXN0ZXIg4oCUIGEKLy8gY29udHJhY3QgY2FuIG9ubHkgcmVnaXN0ZXIgaXRzZWxmLiBUaGF0IGNhbGwgaXMgdGhlIHByb29mIG9mIGNvbnRyb2w6Ci8vIG5vYm9keSBjYW4gY2xhaW0gYW4gYWRkcmVzcyB0aGV5IGRvbid0IGNvbW1hbmQsIHNvIGEgRGVwcmVjYXRlCi8vIHJlZGlyZWN0IG9uIGFuIGVudHJ5IGFsd2F5cyBvcmlnaW5hdGVzIGZyb20gd2hvZXZlciBnZW51aW5lbHkKLy8gY29udHJvbGxlZCB0aGUgY29udHJhY3QuIEVudHJpZXMgYXJlIHBlcm1hbmVudCBieSBkZXNpZ246IG1pZ3JhdGlvbgovLyBoaXN0b3J5IGlzIHdoYXQgY29uc3VtZXJzIHJlbHkgb24sIHNvIGl0IG11c3Qgbm90IGJlIGVyYXNhYmxlIChhbmQgYQovLyBkZWxldGUgd291bGQgcmVvcGVuIHJlLXJlZ2lzdHJhdGlvbiBzcXVhdHRpbmcpLgovLwovLyBPd25lcnNoaXAgaXMgdHdvLXN0ZXAgKHJlLWF1ZGl0IDIwMjYtMDktMDIpOiBSZWdpc3Rlci9UcmFuc2ZlciBvbmx5Ci8vIE5PTUlOQVRFIGFuIG93bmVyOyB0aGUgbm9taW5lZSBtdXN0IEFjY2VwdE93bmVyc2hpcC4gVW50aWwgdGhlbiB0aGUKLy8gZW50cnkgaXMgb3duZWQgYnkgdGhlIGNvbnRyYWN0IGl0c2VsZiwgc28gbm9ib2R5J3MgYWRkcmVzcyBjYW4gYmUKLy8gYXR0YWNoZWQgYXMgIm93bmVyIiB3aXRob3V0IHRoZWlyIGNvbnNlbnQuCnR5cGUgQ29udHJhY3RFbnRyeSBzdHJ1Y3QgewoJQWRkcmVzcyAgICAgIGFkZHJlc3MKCU93bmVyICAgICAgICBhZGRyZXNzIC8vIGN1cnJlbnQgbWFuYWdlciAoYWNjZXB0ZWQpCglQZW5kaW5nT3duZXIgYWRkcmVzcyAvLyBub21pbmF0ZWQsIG5vdCB5ZXQgYWNjZXB0ZWQ7IGVtcHR5IGlmIG5vbmUKCU5hbWUgICAgICAgICBzdHJpbmcKCURlcHJlY2F0ZWQgICBib29sCglTdWNjZXNzb3IgICAgYWRkcmVzcyAvLyBhZGRyZXNzIG9mIHRoZSB1cGdyYWRlZCBjb250cmFjdCwgZW1wdHkgaWYgY3VycmVudAp9Cgpjb25zdCAoCglNYXhOYW1lTGVuICA9IDY0CglNYXhDaGFpbkxlbiA9IDUwIC8vIEdldE1pZ3JhdGlvbkNoYWluIHRyYXZlcnNhbC9vdXRwdXQgYm91bmQgKG1hcmtlZCB3aGVuIGhpdCkKCgkvLyBSZW5kZXIgYm91bmRzIChyZS1hdWRpdCk6IHJlbmRlcmluZyBpcyBwYWdpbmF0ZWQgYW5kIHRoZSBwZXItcm93CgkvLyAibGF0ZXN0IiBhbm5vdGF0aW9uIHdhbGtzIGEgYm91bmRlZCBudW1iZXIgb2YgaG9wcywgc28gYW4KCS8vIGF0dGFja2VyLWJ1aWx0IGxvbmcgY2hhaW4gY2Fubm90IGJsb3cgdXAgdGhlIHJlYWxtIHBhZ2UuCglNYXhSZW5kZXJFbnRyaWVzID0gMTAwCglSZW5kZXJMYXRlc3RIb3BzID0gMTAKKQoKLy8gTk9URSAocmUtYXVkaXQpOiB0aGVyZSBpcyBkZWxpYmVyYXRlbHkgTk8gZ2xvYmFsIGVudHJ5IGNhcC4gRW50cmllcwovLyBhcmUgb25lLXBlci1hZGRyZXNzIGJ5IGNvbnN0cnVjdGlvbiAoc2VsZi1yZWdpc3RyYXRpb24pLCBzbyBzcGFtCi8vIGNvc3RzIGZ1bmRlZCBhY2NvdW50cyBhbmQgZ2FzOyBhIGhhcmQgY2FwIGNvbWJpbmVkIHdpdGggdGhlCi8vIHJlZ2lzdGVyZWQtc3VjY2Vzc29yIHJ1bGUgd291bGQgbGV0IGFuIGF0dGFja2VyIHNhdHVyYXRlIHRoZQovLyByZWdpc3RyeSBhbmQgcGVybWFuZW50bHkgZGlzYWJsZSBkZXByZWNhdGlvbiBmb3IgZXZlcnkgbGVnaXRpbWF0ZQovLyBlbnRyeS4KCnZhciAoCgllbnRyaWVzICAgICAgICBtYXBbYWRkcmVzc10qQ29udHJhY3RFbnRyeQoJZW50cnlBZGRycyAgICAgW11hZGRyZXNzIC8vIGluc2VydGlvbi1vcmRlcmVkIGZvciBkZXRlcm1pbmlzdGljIFJlbmRlcgoJb3duZXJDb250cmFjdHMgbWFwW2FkZHJlc3NdW11hZGRyZXNzCikKCmZ1bmMgaW5pdCgpIHsKCWVudHJpZXMgPSBtYWtlKG1hcFthZGRyZXNzXSpDb250cmFjdEVudHJ5KQoJZW50cnlBZGRycyA9IFtdYWRkcmVzc3t9Cglvd25lckNvbnRyYWN0cyA9IG1ha2UobWFwW2FkZHJlc3NdW11hZGRyZXNzKQp9CgovLyByZWplY3RTdHJheVNlbmQgYWJvcnRzIHdoZW4gY29pbnMgYXJlIGF0dGFjaGVkIHRvIGEgY2FsbCAoYXVkaXQgWTIpOgovLyB0aGlzIHJlYWxtIGhhbmRsZXMgbm8gZnVuZHMgYW5kIGhvbGRzIG5vIGJhbmtlciwgc28gYW4gYXR0YWNoZWQgc2VuZAovLyB3b3VsZCBzdHJhbmQgb24gdGhlIHJlYWxtIGFkZHJlc3MgZm9yZXZlci4gQWJvcnRpbmcgcmV2ZXJ0cyB0aGUKLy8gdHJhbnNmZXIgYmFjayB0byB0aGUgc2VuZGVyLiBGYWlscyBvcGVuIGZvciByZWFsbS1yb3V0ZWQgY2FsbHMsIHdob3NlCi8vIGF0dGFjaGVkIHNlbmQgbGFuZHMgb24gdGhlIGludGVybWVkaWFyeSByZWFsbSwgbmV2ZXIgaGVyZS4KZnVuYyByZWplY3RTdHJheVNlbmQoY3VyIHJlYWxtKSB7CglpZiBjdXIuUHJldmlvdXMoKS5Jc1VzZXJDYWxsKCkgJiYgbGVuKHVuc2FmZS5PcmlnaW5TZW5kKCkpID4gMCB7CgkJcGFuaWMoInRoaXMgcmVhbG0gZG9lcyBub3QgYWNjZXB0IGNvaW5zIikKCX0KfQoKLy8gaXNWYWxpZE5hbWUgcmVzdHJpY3RzIG5hbWVzIHRvIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgd2l0aAovLyB1bmRlcnNjb3Jlcy4gTmFtZXMgYXBwZWFyIGluIHJlbmRlcmVkIG1hcmtkb3duIGFuZCBxdWVyeSBvdXRwdXQsIHNvCi8vIG5vIGRlbGltaXRlciBvciBtYXJrZG93biBjaGFyYWN0ZXIgbWF5IGVudGVyIG9uZS4KZnVuYyBpc1ZhbGlkTmFtZShuYW1lIHN0cmluZykgYm9vbCB7CglpZiBuYW1lID09ICIiIHx8IGxlbihuYW1lKSA+IE1heE5hbWVMZW4gewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIF8sIGMgOj0gcmFuZ2UgbmFtZSB7CgkJaWYgISgoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICcwJyAmJiBjIDw9ICc5JykgfHwgYyA9PSAnXycpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoJcmV0dXJuIHRydWUKfQoKZnVuYyBvd25lckluZGV4UmVtb3ZlKG93bmVyLCBjb250cmFjdEFkZHIgYWRkcmVzcykgewoJb2xkIDo9IG93bmVyQ29udHJhY3RzW293bmVyXQoJZm9yIGksIGFkZHIgOj0gcmFuZ2Ugb2xkIHsKCQlpZiBhZGRyID09IGNvbnRyYWN0QWRkciB7CgkJCW93bmVyQ29udHJhY3RzW293bmVyXSA9IGFwcGVuZChvbGRbOmldLCBvbGRbaSsxOl0uLi4pCgkJCWJyZWFrCgkJfQoJfQoJaWYgbGVuKG93bmVyQ29udHJhY3RzW293bmVyXSkgPT0gMCB7CgkJZGVsZXRlKG93bmVyQ29udHJhY3RzLCBvd25lcikKCX0KfQoKLy8gLS0tLS0tLS0tLSB3cml0ZSBvcGVyYXRpb25zIC0tLS0tLS0tLS0KCi8vIFJlZ2lzdGVyIGFkZHMgdGhlIENBTExJTkcgY29udHJhY3QgdG8gdGhlIHJlZ2lzdHJ5IOKAlCB0aGUgZW50cnkncwovLyBhZGRyZXNzIGlzIHRoZSBjYWxsZXIncyBvd24gYWRkcmVzcywgd2hpY2ggaXMgdGhlIHByb29mIG9mIGNvbnRyb2wuCi8vIG93bmVyIE5PTUlOQVRFUyBhIG1hbmFnZXIgKHRlYW0gRU9BIG9yIGdvdmVybmFuY2UgcmVhbG0pOyBpdCBob2xkcyBubwovLyBwb3dlciB1bnRpbCBpdCBjYWxscyBBY2NlcHRPd25lcnNoaXAgKG5vYm9keSBjYW4gYmUgbWFkZSBhbiBvd25lcgovLyB3aXRob3V0IGNvbnNlbnQg4oCUIHJlLWF1ZGl0KS4gUGFzcyAiIiB0byBtYW5hZ2UgZnJvbSB0aGUgY29udHJhY3QKLy8gaXRzZWxmIOKAlCBidXQgbm90ZSAoYXVkaXQgWTQpOiBlbnRyaWVzIGFyZSBwZXJtYW5lbnQsIHNvIGFuIGVudHJ5Ci8vIG1hbmFnZWQgYnkgYSBjb250cmFjdCB0aGF0IGhhcyBubyBjb2RlIHBhdGggZm9yIGNhbGxpbmcgdGhpcwovLyByZWdpc3RyeSBhZ2FpbiBpcyBGUk9aRU4gYXMgYWN0aXZlIGZvcmV2ZXI6IG5ldmVyIGRlcHJlY2F0YWJsZSwKLy8gbmV2ZXIgdHJhbnNmZXJhYmxlLiBSZWFsbXMgcmVnaXN0ZXJpbmcgZnJvbSBpbml0KCkgc2hvdWxkIG5vbWluYXRlCi8vIGFuIEVPQSBvciBnb3Zlcm5hbmNlIG1hbmFnZXIgaW5zdGVhZC4KZnVuYyBSZWdpc3RlcihjdXIgcmVhbG0sIG5hbWUgc3RyaW5nLCBvd25lciBhZGRyZXNzKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWlmICFpc1ZhbGlkTmFtZShuYW1lKSB7CgkJcGFuaWMoIm5hbWUgbXVzdCBiZSAxLSIgKyBzdHJjb252Lkl0b2EoTWF4TmFtZUxlbikgKwoJCQkiIGNoYXJzLCBsb3dlcmNhc2UgYWxwaGFudW1lcmljIHdpdGggdW5kZXJzY29yZXMgb25seSIpCgl9Cgljb250cmFjdEFkZHIgOj0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpCglpZiBfLCBleGlzdHMgOj0gZW50cmllc1tjb250cmFjdEFkZHJdOyBleGlzdHMgewoJCXBhbmljKCJjb250cmFjdCBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICIgKyBzdHJpbmcoY29udHJhY3RBZGRyKSkKCX0KCXBlbmRpbmcgOj0gYWRkcmVzcygiIikKCWlmIG93bmVyICE9ICIiICYmIG93bmVyICE9IGNvbnRyYWN0QWRkciB7CgkJaWYgIW93bmVyLklzVmFsaWQoKSB7CgkJCXBhbmljKCJpbnZhbGlkIG93bmVyIGFkZHJlc3M6ICIgKyBzdHJpbmcob3duZXIpKQoJCX0KCQlwZW5kaW5nID0gb3duZXIKCX0KCgllbnRyaWVzW2NvbnRyYWN0QWRkcl0gPSAmQ29udHJhY3RFbnRyeXsKCQlBZGRyZXNzOiAgICAgIGNvbnRyYWN0QWRkciwKCQlPd25lcjogICAgICAgIGNvbnRyYWN0QWRkciwKCQlQZW5kaW5nT3duZXI6IHBlbmRpbmcsCgkJTmFtZTogICAgICAgICBuYW1lLAoJfQoJZW50cnlBZGRycyA9IGFwcGVuZChlbnRyeUFkZHJzLCBjb250cmFjdEFkZHIpCglvd25lckNvbnRyYWN0c1tjb250cmFjdEFkZHJdID0gYXBwZW5kKG93bmVyQ29udHJhY3RzW2NvbnRyYWN0QWRkcl0sIGNvbnRyYWN0QWRkcikKCXJldHVybiAicmVnaXN0ZXJlZCAiICsgbmFtZSArICIgYXQgIiArIHN0cmluZyhjb250cmFjdEFkZHIpCn0KCi8vIEFjY2VwdE93bmVyc2hpcCBjb21wbGV0ZXMgYSBub21pbmF0ZWQgb3duZXJzaGlwOiBvbmx5IHRoZSBwZW5kaW5nCi8vIG93bmVyIGNhbiBhY2NlcHQsIGFuZCBvbmx5IGFjY2VwdGFuY2UgbW92ZXMgdGhlIGVudHJ5IChhbmQgdGhlCi8vIG93bmVyQ29udHJhY3RzIGluZGV4KSB0byB0aGVtLgpmdW5jIEFjY2VwdE93bmVyc2hpcChjdXIgcmVhbG0sIGNvbnRyYWN0QWRkciBhZGRyZXNzKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWVudHJ5IDo9IG11c3RHZXQoY29udHJhY3RBZGRyKQoJYyA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmIGVudHJ5LlBlbmRpbmdPd25lciA9PSAiIiB8fCBjICE9IGVudHJ5LlBlbmRpbmdPd25lciB7CgkJcGFuaWMoImNhbGxlciBpcyBub3QgdGhlIHBlbmRpbmcgb3duZXIgb2YgIiArIHN0cmluZyhjb250cmFjdEFkZHIpKQoJfQoJb3duZXJJbmRleFJlbW92ZShlbnRyeS5Pd25lciwgY29udHJhY3RBZGRyKQoJb3duZXJDb250cmFjdHNbY10gPSBhcHBlbmQob3duZXJDb250cmFjdHNbY10sIGNvbnRyYWN0QWRkcikKCWVudHJ5Lk93bmVyID0gYwoJZW50cnkuUGVuZGluZ093bmVyID0gIiIKCXJldHVybiAib3duZXJzaGlwIGFjY2VwdGVkIGJ5ICIgKyBzdHJpbmcoYykKfQoKLy8gVHJhbnNmZXJPd25lcnNoaXAgTk9NSU5BVEVTIGEgbmV3IG93bmVyIGZvciBhIHJlZ2lzdHJ5IGVudHJ5OyB0aGUKLy8gbm9taW5lZSBtdXN0IEFjY2VwdE93bmVyc2hpcCB0byB0YWtlIGNvbnRyb2wgKHR3by1zdGVwIOKAlCByZS1hdWRpdCkuCi8vIFBhc3NpbmcgIiIgY2xlYXJzIGEgcGVuZGluZyBub21pbmF0aW9uLgpmdW5jIFRyYW5zZmVyT3duZXJzaGlwKGN1ciByZWFsbSwgY29udHJhY3RBZGRyLCBuZXdPd25lciBhZGRyZXNzKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWVudHJ5IDo9IG11c3RHZXQoY29udHJhY3RBZGRyKQoJaWYgZW50cnkuT3duZXIgIT0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpIHsKCQlwYW5pYygib25seSB0aGUgb3duZXIgY2FuIHRyYW5zZmVyIG93bmVyc2hpcCIpCgl9CglpZiBuZXdPd25lciA9PSAiIiB7CgkJZW50cnkuUGVuZGluZ093bmVyID0gIiIKCQlyZXR1cm4gInBlbmRpbmcgb3duZXJzaGlwIG5vbWluYXRpb24gY2xlYXJlZCIKCX0KCWlmICFuZXdPd25lci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIG5ldyBvd25lciBhZGRyZXNzOiAiICsgc3RyaW5nKG5ld093bmVyKSkKCX0KCWVudHJ5LlBlbmRpbmdPd25lciA9IG5ld093bmVyCglyZXR1cm4gIm93bmVyc2hpcCBub21pbmF0ZWQgdG8gIiArIHN0cmluZyhuZXdPd25lcikgKyAiIChwZW5kaW5nIGFjY2VwdGFuY2UpIgp9CgovLyBEZXByZWNhdGUgbWFya3MgYSBjb250cmFjdCBhcyBkZXByZWNhdGVkIGFuZCBwb2ludHMgdG8gaXRzIHN1Y2Nlc3Nvci4KLy8gT25seSB0aGUgZW50cnkncyBvd25lciBjYW4gZGVwcmVjYXRlLiBUaGUgc3VjY2Vzc29yIG11c3QgaXRzZWxmIGJlIGEKLy8gUkVHSVNURVJFRCBlbnRyeSDigJQgcmVnaXN0cmF0aW9uIGlzIHNlbGYtcHJvdmluZywgc28gYSBzdWNjZXNzb3IgY2FuCi8vIG5ldmVyIGJlIGEgZGFuZ2xpbmcgcG9pbnRlciBvciBhbiBhZGRyZXNzIHNxdWF0dGVkIGJ5IGEgdGhpcmQgcGFydHkg4oCUCi8vIGFuZCB0aGUgc3VjY2Vzc29yIGVudHJ5IG11c3QgYmUgT1dORUQgQlkgVEhFIENBTExFUiAocmUtYXVkaXQ6IHdpdGhvdXQKLy8gY29uc2VudCwgYW4gYXR0YWNrZXIgY291bGQgY2hhaW4gdGhlaXIgZW50cnkgSU5UTyBhIGxlZ2l0aW1hdGUKLy8gY29udHJhY3QsIGZvcmdpbmcgIm9mZmljaWFsIHByZWRlY2Vzc29yIiBwcm92ZW5hbmNlKS4gQ29uc2VudCBpcwovLyBjaGVja2VkIEFUIENBTEwgVElNRTogdHJhbnNmZXJyaW5nIHRoZSBzdWNjZXNzb3IgZW50cnkgYXdheSBsYXRlcgovLyBkb2VzIG5vdCB1bmxpbmsgYW4gZXhpc3RpbmcgY2hhaW4g4oCUIHRoZSBhdHRlc3RhdGlvbiBpcyB0aGF0IGJvdGgKLy8gZW5kcyBzaGFyZWQgYW4gb3duZXIgd2hlbiB0aGUgZGVwcmVjYXRpb24gd2FzIHJlY29yZGVkLgpmdW5jIERlcHJlY2F0ZShjdXIgcmVhbG0sIGNvbnRyYWN0QWRkciwgc3VjY2Vzc29yQWRkciBhZGRyZXNzKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWVudHJ5IDo9IG11c3RHZXQoY29udHJhY3RBZGRyKQoJaWYgZW50cnkuT3duZXIgIT0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpIHsKCQlwYW5pYygib25seSB0aGUgb3duZXIgY2FuIGRlcHJlY2F0ZSB0aGlzIGNvbnRyYWN0IikKCX0KCWlmIGVudHJ5LkRlcHJlY2F0ZWQgewoJCXBhbmljKCJjb250cmFjdCBpcyBhbHJlYWR5IGRlcHJlY2F0ZWQiKQoJfQoJaWYgc3VjY2Vzc29yQWRkciA9PSBjb250cmFjdEFkZHIgewoJCXBhbmljKCJzdWNjZXNzb3IgY2Fubm90IGJlIHRoZSBjb250cmFjdCBpdHNlbGYiKQoJfQoJc3VjYywgZXhpc3RzIDo9IGVudHJpZXNbc3VjY2Vzc29yQWRkcl0KCWlmICFleGlzdHMgewoJCXBhbmljKCJzdWNjZXNzb3IgaXMgbm90IGEgcmVnaXN0ZXJlZCBjb250cmFjdDogIiArIHN0cmluZyhzdWNjZXNzb3JBZGRyKSkKCX0KCWlmIHN1Y2MuT3duZXIgIT0gY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpIHsKCQlwYW5pYygic3VjY2Vzc29yIGVudHJ5IGlzIG5vdCBvd25lZCBieSB0aGUgY2FsbGVyOiAiICsgc3RyaW5nKHN1Y2Nlc3NvckFkZHIpKQoJfQoKCS8vIFByZXZlbnQgY2lyY3VsYXIgY2hhaW5zOiB3YWxrIGZyb20gc3VjY2Vzc29yIGFuZCBlbnN1cmUgd2UgZG9uJ3QKCS8vIGxvb3AgYmFjayB0byBjb250cmFjdEFkZHIuIFN1Y2Nlc3NvcnMgYXJlIGltbXV0YWJsZSBvbmNlIHNldCwgc28KCS8vIGEgY2hlY2sgb3ZlciB0aGUgZXhpc3RpbmcgY2hhaW4gaXMgY29tcGxldGUuCgl2aXNpdGVkIDo9IG1ha2UobWFwW2FkZHJlc3NdYm9vbCkKCXZpc2l0ZWRbY29udHJhY3RBZGRyXSA9IHRydWUKCXdhbGsgOj0gc3VjY2Vzc29yQWRkcgoJZm9yIGhvcHMgOj0gMDsgOyBob3BzKysgewoJCWlmIGhvcHMgPiBNYXhDaGFpbkxlbiB7CgkJCS8vIGJvdW5kZWQtd2FsayBkaXNjaXBsaW5lIChyb3VuZC0zIGF1ZGl0KTogYSBzdWNjZXNzb3IgY2hhaW4KCQkJLy8gdGhpcyBsb25nIGlzIHBhdGhvbG9naWNhbDsgcmVmdXNlIHJhdGhlciB0aGFuIHdhbGsgdW5ib3VuZGVkCgkJCXBhbmljKCJzdWNjZXNzb3IgY2hhaW4gdG9vIGxvbmcgdG8gdmVyaWZ5OyBjYW5ub3QgZGVwcmVjYXRlIikKCQl9CgkJaWYgdmlzaXRlZFt3YWxrXSB7CgkJCXBhbmljKCJkZXByZWNhdGluZyAiICsgc3RyaW5nKGNvbnRyYWN0QWRkcikgKyAiIHRvICIgKwoJCQkJc3RyaW5nKHN1Y2Nlc3NvckFkZHIpICsgIiB3b3VsZCBjcmVhdGUgYSBjaXJjdWxhciBtaWdyYXRpb24gY2hhaW4iKQoJCX0KCQllLCBleGlzdHMgOj0gZW50cmllc1t3YWxrXQoJCWlmICFleGlzdHMgfHwgIWUuRGVwcmVjYXRlZCB8fCBlLlN1Y2Nlc3NvciA9PSAiIiB7CgkJCWJyZWFrCgkJfQoJCXZpc2l0ZWRbd2Fsa10gPSB0cnVlCgkJd2FsayA9IGUuU3VjY2Vzc29yCgl9CgoJZW50cnkuRGVwcmVjYXRlZCA9IHRydWUKCWVudHJ5LlN1Y2Nlc3NvciA9IHN1Y2Nlc3NvckFkZHIKCXJldHVybiAiZGVwcmVjYXRlZCAiICsgZW50cnkuTmFtZSArICIsIHN1Y2Nlc3NvcjogIiArIHN0cmluZyhzdWNjZXNzb3JBZGRyKQp9CgovLyAtLS0tLS0tLS0tIHJlYWQtb25seSBxdWVyaWVzIC0tLS0tLS0tLS0KCi8vIEdldExhdGVzdCBmb2xsb3dzIHRoZSBtaWdyYXRpb24gY2hhaW4gZnJvbSBhIGNvbnRyYWN0IGFkZHJlc3MgYW5kCi8vIHJldHVybnMgdGhlIGxhdGVzdCBub24tZGVwcmVjYXRlZCBhZGRyZXNzLiBTYWZlIGFnYWluc3QgY2lyY3VsYXIgcmVmcy4KLy8KLy8gQ09TVCBXQVJOSU5HIChhdWRpdCBZMyk6IHVubGlrZSB0aGUgd3JpdGUtcGF0aCB3YWxrcywgdGhpcyByZWFkIGlzCi8vIGRlbGliZXJhdGVseSBVTkJPVU5ERUQgaW4gaG9wcyBzbyBpdCBhbHdheXMgcmVzb2x2ZXMgdGhlIHRydWUKLy8gZW5kcG9pbnQuIENoYWluIGxlbmd0aCBpcyBhdHRhY2tlci1idWlsZGFibGUsIHNvIGFuIG9uLWNoYWluCi8vIGludGVncmF0b3IgcmVzb2x2aW5nIGFuIFVOVFJVU1RFRCBhZGRyZXNzIGluc2lkZSBpdHMgb3duIHRyYW5zYWN0aW9uCi8vIG11c3QgdHJlYXQgdGhlIGdhcyBjb3N0IGFzIE8oY2hhaW4gbGVuZ3RoKSDigJQgd3JhcCBpdCwgYm91bmQgdGhlCi8vIGlucHV0IHNldCwgb3IgcmVzb2x2ZSBvZmYtY2hhaW4gdmlhIHF1ZXJ5LgpmdW5jIEdldExhdGVzdChjb250cmFjdEFkZHIgYWRkcmVzcykgYWRkcmVzcyB7Cgl2aXNpdGVkIDo9IG1ha2UobWFwW2FkZHJlc3NdYm9vbCkKCWN1cnJlbnQgOj0gY29udHJhY3RBZGRyCgoJZm9yIHsKCQllbnRyeSwgZXhpc3RzIDo9IGVudHJpZXNbY3VycmVudF0KCQlpZiAhZXhpc3RzIHsKCQkJcmV0dXJuIGN1cnJlbnQKCQl9CgkJaWYgIWVudHJ5LkRlcHJlY2F0ZWQgfHwgZW50cnkuU3VjY2Vzc29yID09ICIiIHsKCQkJcmV0dXJuIGN1cnJlbnQKCQl9CgkJaWYgdmlzaXRlZFtjdXJyZW50XSB7CgkJCXJldHVybiBjdXJyZW50IC8vIGJyZWFrIG9uIGNpcmN1bGFyCgkJfQoJCXZpc2l0ZWRbY3VycmVudF0gPSB0cnVlCgkJY3VycmVudCA9IGVudHJ5LlN1Y2Nlc3NvcgoJfQp9CgovLyBHZXRNaWdyYXRpb25DaGFpbiByZXR1cm5zIHRoZSBmdWxsIHVwZ3JhZGUgcGF0aCBzdGFydGluZyBmcm9tIHRoZQovLyBnaXZlbiBhZGRyZXNzLCBhdCBtb3N0IE1heENoYWluTGVuIGhvcHMuIEEgY2hhaW4gbG9uZ2VyIHRoYW4gdGhlCi8vIGJvdW5kIGlzIGV4cGxpY2l0bHkgbWFya2VkIGFzIHRydW5jYXRlZCAocmUtYXVkaXQ6IHNpbGVudCB0cnVuY2F0aW9uCi8vIHByZXNlbnRlZCBhIG1pZC1jaGFpbiBub2RlIGFzIHRoZSBlbmRwb2ludCkuCmZ1bmMgR2V0TWlncmF0aW9uQ2hhaW4oY29udHJhY3RBZGRyIGFkZHJlc3MpIHN0cmluZyB7Cgl2aXNpdGVkIDo9IG1ha2UobWFwW2FkZHJlc3NdYm9vbCkKCWN1cnJlbnQgOj0gY29udHJhY3RBZGRyCgl2YXIgcGFydHMgW11zdHJpbmcKCglmb3IgewoJCWlmIGxlbihwYXJ0cykgPj0gTWF4Q2hhaW5MZW4gewoJCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgIi4uLiAodHJ1bmNhdGVkIGF0ICIrc3RyY29udi5JdG9hKE1heENoYWluTGVuKSsKCQkJCSIgaG9wczsgdXNlIEdldExhdGVzdCBmb3IgdGhlIGVuZHBvaW50KSIpCgkJCWJyZWFrCgkJfQoJCWVudHJ5LCBleGlzdHMgOj0gZW50cmllc1tjdXJyZW50XQoJCWlmICFleGlzdHMgewoJCQlpZiBsZW4ocGFydHMpID09IDAgewoJCQkJcmV0dXJuICJub3QgZm91bmQ6ICIgKyBzdHJpbmcoY29udHJhY3RBZGRyKQoJCQl9CgkJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCBzdHJpbmcoY3VycmVudCkrIiAodW5yZWdpc3RlcmVkKSIpCgkJCWJyZWFrCgkJfQoJCWlmIHZpc2l0ZWRbY3VycmVudF0gewoJCQlwYXJ0cyA9IGFwcGVuZChwYXJ0cywgc3RyaW5nKGN1cnJlbnQpKyIgKGNpcmN1bGFyKSIpCgkJCWJyZWFrCgkJfQoJCXZpc2l0ZWRbY3VycmVudF0gPSB0cnVlCgoJCXRhZyA6PSAiIgoJCWlmIGVudHJ5LkRlcHJlY2F0ZWQgewoJCQl0YWcgPSAiIFtkZXByZWNhdGVkXSIKCQl9CgkJcGFydHMgPSBhcHBlbmQocGFydHMsIHN0cmluZyhlbnRyeS5BZGRyZXNzKSsiICgiK2VudHJ5Lk5hbWUrIikiK3RhZykKCgkJaWYgIWVudHJ5LkRlcHJlY2F0ZWQgfHwgZW50cnkuU3VjY2Vzc29yID09ICIiIHsKCQkJYnJlYWsKCQl9CgkJY3VycmVudCA9IGVudHJ5LlN1Y2Nlc3NvcgoJfQoKCXJldHVybiBzdHJpbmdzLkpvaW4ocGFydHMsICIgLT4gIikKfQoKLy8gR2V0SW5mbyByZXR1cm5zIGEgb25lLWxpbmUgc3VtbWFyeSBmb3IgYSBjb250cmFjdC4KZnVuYyBHZXRJbmZvKGNvbnRyYWN0QWRkciBhZGRyZXNzKSBzdHJpbmcgewoJZW50cnkgOj0gbXVzdEdldChjb250cmFjdEFkZHIpCglzdGF0dXMgOj0gImFjdGl2ZSIKCWlmIGVudHJ5LkRlcHJlY2F0ZWQgewoJCXN0YXR1cyA9ICJkZXByZWNhdGVkIC0+ICIgKyBzdHJpbmcoZW50cnkuU3VjY2Vzc29yKQoJfQoJcmV0dXJuIGVudHJ5Lk5hbWUgKyAiIHwgb3duZXI6ICIgKyBzdHJpbmcoZW50cnkuT3duZXIpICsgIiB8ICIgKyBzdGF0dXMKfQoKLy8gR2V0T3duZXJDb250cmFjdHMgcmV0dXJucyBhbGwgY29udHJhY3QgYWRkcmVzc2VzIHdob3NlIEFDQ0VQVEVEIG93bmVyCi8vIGlzIHRoZSBnaXZlbiBhZGRyZXNzIChub21pbmF0aW9ucyBkb24ndCBjb3VudCB1bnRpbCBhY2NlcHRlZCkuCmZ1bmMgR2V0T3duZXJDb250cmFjdHMob3duZXIgYWRkcmVzcykgc3RyaW5nIHsKCWFkZHJzLCBleGlzdHMgOj0gb3duZXJDb250cmFjdHNbb3duZXJdCglpZiAhZXhpc3RzIHx8IGxlbihhZGRycykgPT0gMCB7CgkJcmV0dXJuICJub25lIgoJfQoJcGFydHMgOj0gbWFrZShbXXN0cmluZywgbGVuKGFkZHJzKSkKCWZvciBpLCBhIDo9IHJhbmdlIGFkZHJzIHsKCQlwYXJ0c1tpXSA9IHN0cmluZyhhKQoJfQoJcmV0dXJuIHN0cmluZ3MuSm9pbihwYXJ0cywgIiwgIikKfQoKLy8gLS0tLS0tLS0tLSByZW5kZXIgLS0tLS0tLS0tLQoKLy8gcmVuZGVyTGF0ZXN0IHdhbGtzIGF0IG1vc3QgUmVuZGVyTGF0ZXN0SG9wcyBob3BzIGZvciB0aGUgcGVyLXJvdwovLyBhbm5vdGF0aW9uOyBsb25nZXIgY2hhaW5zIGFyZSBtYXJrZWQgcmF0aGVyIHRoYW4gd2Fsa2VkIChyZW5kZXIgZ2FzCi8vIGJvdW5kIOKAlCByZS1hdWRpdCkuCmZ1bmMgcmVuZGVyTGF0ZXN0KGNvbnRyYWN0QWRkciBhZGRyZXNzKSAoYWRkcmVzcywgYm9vbCkgewoJY3VycmVudCA6PSBjb250cmFjdEFkZHIKCWZvciBpIDo9IDA7IGkgPCBSZW5kZXJMYXRlc3RIb3BzOyBpKysgewoJCWVudHJ5LCBleGlzdHMgOj0gZW50cmllc1tjdXJyZW50XQoJCWlmICFleGlzdHMgfHwgIWVudHJ5LkRlcHJlY2F0ZWQgfHwgZW50cnkuU3VjY2Vzc29yID09ICIiIHsKCQkJcmV0dXJuIGN1cnJlbnQsIHRydWUKCQl9CgkJY3VycmVudCA9IGVudHJ5LlN1Y2Nlc3NvcgoJfQoJLy8gcm91bmQtMyBhdWRpdCBvZmYtYnktb25lOiB0aGUgbm9kZSByZWFjaGVkIE9OIHRoZSBidWRnZXQgYm91bmRhcnkKCS8vIG1heSBpdHNlbGYgYmUgdGVybWluYWwg4oCUIGNoZWNrIGJlZm9yZSBkZWNsYXJpbmcgdGhlIHdhbGsgaW5jb21wbGV0ZQoJZW50cnksIGV4aXN0cyA6PSBlbnRyaWVzW2N1cnJlbnRdCglpZiAhZXhpc3RzIHx8ICFlbnRyeS5EZXByZWNhdGVkIHx8IGVudHJ5LlN1Y2Nlc3NvciA9PSAiIiB7CgkJcmV0dXJuIGN1cnJlbnQsIHRydWUKCX0KCXJldHVybiBjdXJyZW50LCBmYWxzZQp9CgovLyBSZW5kZXIgcmV0dXJucyBhIG1hcmtkb3duIG92ZXJ2aWV3IG9mIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzLgovLyBOZXZlciBwYW5pY3MuCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgZW50cmllcyA9PSBuaWwgfHwgbGVuKGVudHJpZXMpID09IDAgewoJCXJldHVybiAiIyBVcGdyYWRlIFJlZ2lzdHJ5XG5cbk5vIGNvbnRyYWN0cyByZWdpc3RlcmVkLlxuIgoJfQoKCXZhciBiIHN0cmluZ3MuQnVpbGRlcgoJYi5Xcml0ZVN0cmluZygiIyBVcGdyYWRlIFJlZ2lzdHJ5XG5cbiIpCgliLldyaXRlU3RyaW5nKCIqKlJlZ2lzdGVyZWQgY29udHJhY3RzOioqICIgKyBzdHJjb252Lkl0b2EobGVuKGVudHJpZXMpKSArICJcblxuIikKCglzaG93IDo9IGVudHJ5QWRkcnMKCWlmIGxlbihzaG93KSA+IE1heFJlbmRlckVudHJpZXMgewoJCWIuV3JpdGVTdHJpbmcoIl9TaG93aW5nIHRoZSBtb3N0IHJlY2VudCAiICsgc3RyY29udi5JdG9hKE1heFJlbmRlckVudHJpZXMpICsKCQkJIiBlbnRyaWVzLl9cblxuIikKCQlzaG93ID0gc2hvd1tsZW4oc2hvdyktTWF4UmVuZGVyRW50cmllczpdCgl9CgoJdmFyIGFjdGl2ZSBbXXN0cmluZwoJdmFyIGRlcHJlY2F0ZWQgW11zdHJpbmcKCglmb3IgXywgYWRkciA6PSByYW5nZSBzaG93IHsKCQllbnRyeSA6PSBlbnRyaWVzW2FkZHJdCgkJaWYgZW50cnkgPT0gbmlsIHsKCQkJY29udGludWUKCQl9CgkJbGluZSA6PSAiLSAqKiIgKyBlbnRyeS5OYW1lICsgIioqIChgIiArIHN0cmluZyhhZGRyKSArICJgKSDigJQgb3duZXI6IGAiICsgc3RyaW5nKGVudHJ5Lk93bmVyKSArICJgIgoJCWlmIGVudHJ5LkRlcHJlY2F0ZWQgewoJCQlsaW5lICs9ICIg4oCUICoqREVQUkVDQVRFRCoqIC0+IGAiICsgc3RyaW5nKGVudHJ5LlN1Y2Nlc3NvcikgKyAiYCIKCQkJbGF0ZXN0LCBjb21wbGV0ZSA6PSByZW5kZXJMYXRlc3QoYWRkcikKCQkJaWYgIWNvbXBsZXRlIHsKCQkJCWxpbmUgKz0gIiAobG9uZyBjaGFpbjsgdXNlIEdldExhdGVzdCkiCgkJCX0gZWxzZSBpZiBsYXRlc3QgIT0gZW50cnkuU3VjY2Vzc29yIHsKCQkJCWxpbmUgKz0gIiAobGF0ZXN0OiBgIiArIHN0cmluZyhsYXRlc3QpICsgImApIgoJCQl9CgkJCWRlcHJlY2F0ZWQgPSBhcHBlbmQoZGVwcmVjYXRlZCwgbGluZSkKCQl9IGVsc2UgewoJCQlhY3RpdmUgPSBhcHBlbmQoYWN0aXZlLCBsaW5lKQoJCX0KCX0KCglpZiBsZW4oYWN0aXZlKSA+IDAgewoJCWIuV3JpdGVTdHJpbmcoIiMjIEFjdGl2ZVxuXG4iKQoJCWZvciBfLCBsIDo9IHJhbmdlIGFjdGl2ZSB7CgkJCWIuV3JpdGVTdHJpbmcobCArICJcbiIpCgkJfQoJCWIuV3JpdGVTdHJpbmcoIlxuIikKCX0KCglpZiBsZW4oZGVwcmVjYXRlZCkgPiAwIHsKCQliLldyaXRlU3RyaW5nKCIjIyBEZXByZWNhdGVkXG5cbiIpCgkJZm9yIF8sIGwgOj0gcmFuZ2UgZGVwcmVjYXRlZCB7CgkJCWIuV3JpdGVTdHJpbmcobCArICJcbiIpCgkJfQoJCWIuV3JpdGVTdHJpbmcoIlxuIikKCX0KCglyZXR1cm4gYi5TdHJpbmcoKQp9CgovLyAtLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLQoKZnVuYyBtdXN0R2V0KGFkZHIgYWRkcmVzcykgKkNvbnRyYWN0RW50cnkgewoJZW50cnksIG9rIDo9IGVudHJpZXNbYWRkcl0KCWlmICFvayB7CgkJcGFuaWMoImNvbnRyYWN0IG5vdCBmb3VuZDogIiArIHN0cmluZyhhZGRyKSkKCX0KCXJldHVybiBlbnRyeQp9CiINMTAwMDAwMDB1Z25vdBIRCP69liESCjY5NTc2dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQLByt0eNoR4xrTErjMti8CA4I3NiKhhSYHLbimc0RXCeAjACxxdfPjKeo3NQpWGvA2fZrh7z3rdIrnMkldgRP5MaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}