{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "6YAo4a3SzLoDPUU4orBOpKlYs4qH5O6yrlfBpAJZNzE=",
    "height": "612731",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": [
          {
            "@type": "/tm.StorageDepositEvent",
            "bytes_delta": "38660",
            "fee_delta": "3866000ugnot",
            "pkg_path": "gno.land/r/g1ut6uspuh73e02yauxpmyt8g3wwddaq8utagvm3/permbook_demo"
          }
        ],
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "62022058",
      "GasUsed": "41348039"
    },
    "tx": "Cu2dAQoML3ZtLm1fYWRkcGtnEtudAQooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKenQEKDXBlcm1ib29rX2RlbW8SQWduby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9wZXJtYm9va19kZW1vGmgKC2dub21vZC50b21sElltb2R1bGUgPSAiZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3Blcm1ib29rX2RlbW8iCmdubyA9ICIwLjkiChremwEKEXBlcm1ib29rX2RlbW8uZ25vEsebAS8vIFBhY2thZ2UgcGVybWJvb2tfZGVtbyBpcyB0aGUgcmVmZXJlbmNlIGNvbnN1bWVyIGZvciB0aGUgcGVybWJvb2sKLy8gcGVybWlzc2lvbiBwcmltaXRpdmUuIEl0IGV4aXN0cyB0byBtYWtlIHBlcm1ib29rJ3MgY2VudHJhbCBjbGFpbQovLyBmYWxzaWZpYWJsZSBvbiBhIGxpdmUgY2hhaW4uCi8vCi8vIFRoYXQgY2xhaW0gaXM6IGEgcGVybWlzc2lvbiByZXZva2VkIGluIHRyYW5zYWN0aW9uIE4gaXMgcmVmdXNlZCBpbgovLyB0cmFuc2FjdGlvbiBOKzEuIEEgcHVyZSBwYWNrYWdlIGNhbm5vdCBkZW1vbnN0cmF0ZSB0aGlzIOKAlCBhIHZtL3FldmFsIGlzIGEKLy8gc2luZ2xlIGVwaGVtZXJhbCBldmFsdWF0aW9uIGFuZCBub3RoaW5nIGl0IHdyaXRlcyBzdXJ2aXZlcyBpdC4gT25seSBhCi8vIHJlYWxtLCBjYWxsZWQgYWNyb3NzIHNldmVyYWwgdHJhbnNhY3Rpb25zLCBjYW4gc2hvdyBhIGdyYW50IHRha2luZyBlZmZlY3QKLy8gYW5kIHRoZW4gYSByZXZva2UgdGFraW5nIGl0IGF3YXkuIFNvIHRoaXMgcmVhbG0gaXMgbm90IGEgZGVjb3JhdGlvbiBvbiB0aGUKLy8gcHJpbWl0aXZlOyBpdCBpcyB0aGUgZXhwZXJpbWVudC4KLy8KLy8gIyBXaGF0IGl0IGRvZXMKLy8KLy8gVHdvIHBlcm1pc3Npb24tZ2F0ZWQgYWN0aW9ucywgZGVsaWJlcmF0ZWx5IHRyaXZpYWwgc28gdGhhdCB0aGUgb25seQovLyBpbnRlcmVzdGluZyB0aGluZyBhYm91dCB0aGVtIGlzIHRoZSBnYXRlOgovLwovLyAgIC0gYnVtcCAgIOKAlCBpbmNyZW1lbnRzIGEgY291bnRlciBhbmQgcmVjb3JkcyB3aG8gZGlkIGl0Ci8vICAgLSBub3RpY2Ug4oCUIHJlcGxhY2VzIGEgc2hvcnQgcHVibGljIG5vdGljZQovLwovLyBOZWl0aGVyIGFjdGlvbiBpcyByZWFjaGFibGUgd2l0aG91dCB0aGUgY29ycmVzcG9uZGluZyBwZXJtaXNzaW9uLiBUaGUKLy8gZGVwbG95ZXIgaXMgdGhlIGJvb2sncyBhZG1pbiBhbmQgaXMgdGhlIG9ubHkgYWNjb3VudCB0aGF0IG1heSBncmFudCBvcgovLyByZXZva2UuIEhvbGRpbmcgImJ1bXAiIGNvbmZlcnMgbm8gYXV0aG9yaXR5IG92ZXIgdGhlIGJvb2sgaXRzZWxmOiBhIGhvbGRlcgovLyBjYW5ub3QgZ3JhbnQsIGNhbm5vdCByZXZva2UsIGFuZCBjYW5ub3Qgbm9taW5hdGUuIFRoYXQgc2VwYXJhdGlvbiBpcyB0aGUKLy8gcHJvcGVydHkgYmVpbmcgZGVtb25zdHJhdGVkLgovLwovLyAjIEhvdyBpdCB3aXJlcyBwZXJtYm9vayBjb3JyZWN0bHkKLy8KLy8gVGhpcyByZWFsbSBpcyBhbHNvIHRoZSB3b3JrZWQgZXhhbXBsZSBvZiBwZXJtYm9vaydzIGNvbnN1bWVyIGNvbnRyYWN0OgovLwovLyAgIC0gZXZlcnkgcGVybWJvb2sgbXV0YXRvciBpcyBjYWxsZWQgZnJvbSBhIENST1NTSU5HIGVudHJ5cG9pbnQsIHBhc3NpbmcKLy8gICAgIHRoYXQgZW50cnlwb2ludCdzIG93biBjdXIsIHNvIHRoZSBwcmluY2lwYWwgcGVybWJvb2sgcmVzb2x2ZXMgaXMgdGhpcwovLyAgICAgcmVhbG0ncyBpbW1lZGlhdGUgY2FsbGVyIChjb250cmFjdCAxKTsKLy8gICAtIHRoZSAqQm9vayBpcyBhbiB1bmV4cG9ydGVkIHBhY2thZ2UtbGV2ZWwgdmFyIGFuZCBpcyBuZXZlciByZXR1cm5lZAovLyAgICAgYWNyb3NzIGEgcmVhbG0gYm91bmRhcnkgKGNvbnRyYWN0IDIpOwovLyAgIC0gSGFzIGlzIGFza2VkIGFib3V0IGFuIGFkZHJlc3MgdGhpcyByZWFsbSBkZXJpdmVkIGl0c2VsZiBmcm9tCi8vICAgICBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCksIG5ldmVyIGFib3V0IGEgcGFyYW1ldGVyIChjb250cmFjdCAzKTsKLy8gICAtIHRoZSBsaW1pdHMgYXJlIGNob3NlbiBvbmNlLCBhdCBpbml0LCBhbmQgZG9jdW1lbnRlZCBiZWxvdyAoY29udHJhY3QgNCkuCi8vCi8vIFRoaXMgcmVhbG0gaG9sZHMgbm8gY29pbnMgYW5kIGltcG9ydHMgbm8gYmFua2VyLiBFdmVyeSBjcm9zc2luZyBlbnRyeXBvaW50Ci8vIHJlamVjdHMgYXR0YWNoZWQgY29pbnM7IHRoZSByZWFkIHZpZXdzIGFyZSBub24tY3Jvc3NpbmcsIHdoaWNoIE1zZ0NhbGwgd2lsbAovLyBub3QgZGlzcGF0Y2ggdG8sIHNvIG5vIHRyYW5zYWN0aW9uIGNhbiBhdHRhY2ggY29pbnMgdG8gb25lLgpwYWNrYWdlIHBlcm1ib29rX2RlbW8KCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vcnVudGltZSIKCSJjaGFpbi9ydW50aW1lL3Vuc2FmZSIKCSJzdHJjb252IgoKCSJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcGVybWJvb2siCgkiZ25vLmxhbmQvcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MCIKKQoKLy8gVGhlIHBlcm1pc3Npb24gbmFtZXMgdGhpcyByZWFsbSBnYXRlcyBvbi4gVGhleSBhcmUgY29uc3RhbnRzIHJhdGhlciB0aGFuCi8vIGNhbGxlci1zdXBwbGllZCBzdHJpbmdzIGZvciB0aGUgZ2F0ZWQgYWN0aW9ucywgc28gYSB0eXBvIGNhbm5vdCBzaWxlbnRseQovLyBjcmVhdGUgYW4gdW5lbmZvcmNlZCBnYXRlLgpjb25zdCAoCglQZXJtQnVtcCAgID0gImJ1bXAiCglQZXJtTm90aWNlID0gIm5vdGljZSIKKQoKY29uc3QgKAoJLy8gVGhlIGJvb2sncyBsaW1pdHMuIERlbGliZXJhdGVseSBmYXIgYmVsb3cgcGVybWJvb2sncyBjZWlsaW5nczogdGhpcwoJLy8gcmVhbG0gbmVlZHMgdHdvIHBlcm1pc3Npb25zIGFuZCBhIGhhbmRmdWwgb2YgaG9sZGVycywgYW5kIGEgYm91bmQKCS8vIHNob3VsZCBkZXNjcmliZSB3aGF0IHRoZSBhcHBsaWNhdGlvbiBhY3R1YWxseSBkb2VzIHJhdGhlciB0aGFuIHRoZQoJLy8gbW9zdCB0aGUgbGlicmFyeSB3b3VsZCB0b2xlcmF0ZS4gQSBmZXcgc3BhcmUgc2xvdHMgYXJlIGxlZnQgc28gdGhlCgkvLyBwZXJtaXNzaW9uIGxpbWl0IGNhbiBiZSBleGVyY2lzZWQgb24tY2hhaW4gd2l0aG91dCB3ZWRnaW5nIHRoZSBkZW1vLgoJTWF4UGVybWlzc2lvbnMgPSA4CglNYXhIb2xkZXJzICAgICA9IDMyCglNYXhOYW1lTGVuICAgICA9IDI0CgoJLy8gTWF4Tm90aWNlTGVuIGJvdW5kcyB0aGUgcHVibGljIG5vdGljZS4gQSBCWVRFIGxlbmd0aCwgbm90IGEgcnVuZQoJLy8gY291bnQsIGJlY2F1c2UgaXRzIGpvYiBpcyB0byBib3VuZCBzdG9yYWdlLgoJTWF4Tm90aWNlTGVuID0gMjAwCgoJLy8gTWF4TGlzdGVkIGNhcHMgaG93IG1hbnkgcm93cyBhbnkgc2luZ2xlIHF1ZXJ5IG9yIHZpZXcgcmV0dXJucywgc28gbm8KCS8vIHJlYWQgaXMgdW5ib3VuZGVkIHJlZ2FyZGxlc3Mgb2YgaG93IGZ1bGwgdGhlIGJvb2sgaXMuCglNYXhMaXN0ZWQgPSA1MAopCgovLyBib29rIGlzIHRoZSBwZXJtaXNzaW9uIHNldC4gSXQgaXMgdW5leHBvcnRlZCBhbmQgbmV2ZXIgcmV0dXJuZWQ6IGhhbmRpbmcgYQovLyAqcGVybWJvb2suQm9vayBhY3Jvc3MgYSByZWFsbSBib3VuZGFyeSB3b3VsZCBoYW5kIG91dCBldmVyeSBtdXRhdG9yIG9uIGl0LAovLyBhbmQgYm9ycm93IHJ1bGUgIzIgY29tbWl0cyB0aG9zZSB3cml0ZXMgdW5kZXIgVEhJUyByZWFsbSdzIGF1dGhvcml0eQovLyAocGVybWJvb2sgY29uc3VtZXIgY29udHJhY3QgMikuCnZhciBib29rICpwZXJtYm9vay5Cb29rCgovLyBUaGUgc3RhdGUgdGhlIGdhdGVkIGFjdGlvbnMgbW92ZS4gVGhpcyBpcyB0aGUgb2JzZXJ2YWJsZSBldmlkZW5jZSB0aGF0IGEKLy8gZ2F0ZSB3YXMgb3BlbiBhdCBvbmUgaGVpZ2h0IGFuZCBjbG9zZWQgYXQgYW5vdGhlci4KdmFyICgKCWJ1bXBzICAgICAgICAgIGludDY0CglsYXN0QnVtcGVyICAgICBhZGRyZXNzCglsYXN0QnVtcEhlaWdodCBpbnQ2NAoKCW5vdGljZSAgICAgICAgICAgc3RyaW5nCglub3RpY2VBdXRob3IgICAgIGFkZHJlc3MKCW5vdGljZVNldEF0QmxvY2sgaW50NjQKKQoKLy8gZGVtb0xpbWl0cyBhcmUgdGhlIGxpbWl0cyBldmVyeSBCb29rIHRoaXMgcmVhbG0gY29uc3RydWN0cyBpcyBnaXZlbi4KZnVuYyBkZW1vTGltaXRzKCkgcGVybWJvb2suTGltaXRzIHsKCXJldHVybiBwZXJtYm9vay5MaW1pdHN7CgkJTWF4UGVybWlzc2lvbnM6ICAgICAgICAgIE1heFBlcm1pc3Npb25zLAoJCU1heEhvbGRlcnNQZXJQZXJtaXNzaW9uOiBNYXhIb2xkZXJzLAoJCU1heE5hbWVMZW46ICAgICAgICAgICAgICBNYXhOYW1lTGVuLAoJfQp9CgpmdW5jIGluaXQoKSB7CgkvLyBUaGUgcGFja2FnZSBkZXBsb3llciBiZWNvbWVzIHRoZSBib29rJ3MgYWRtaW46IG9uLWNoYWluLCBBZGRQYWNrYWdlCgkvLyBydW5zIGluaXQgd2l0aCB0aGUgbWVzc2FnZSBjcmVhdG9yIGFzIG9yaWdpbiBjYWxsZXIsIGFuZCBhCgkvLyBNc2dBZGRQYWNrYWdlJ3MgY3JlYXRvciBpcyBuZXZlciB6ZXJvLgoJLy8KCS8vIFVuZGVyIGBnbm8gdGVzdGAgdGhlcmUgaXMgbm8gTXNnQWRkUGFja2FnZSwgc28gdGhlIG9yaWdpbiBjb250ZXh0IGlzCgkvLyBlbXB0eSBhbmQgdGhlIGFkZHJlc3MgaXMgaW52YWxpZDsgdGhlIHRlc3QgZmlsZSdzIG93biBpbml0IGNvbnN0cnVjdHMKCS8vIHRoZSBib29rIGluc3RlYWQuIE9uLWNoYWluIHRoYXQgYnJhbmNoIGlzIHVucmVhY2hhYmxlLCBhbmQgaWYgaXQgZXZlcgoJLy8gd2VyZSByZWFjaGVkIHRoZSByZWFsbSB3b3VsZCBkZXBsb3kgSU5FUlQg4oCUIGJvb2sgc3RheXMgbmlsIGFuZCBldmVyeQoJLy8gZW50cnlwb2ludCBhYm9ydHMgcmF0aGVyIHRoYW4gcnVubmluZyB1bmdhdGVkLiBGb3IgYSByZWFsbSB0aGF0IGhvbGRzCgkvLyBubyB2YWx1ZSBhbmQgZ2F0ZXMgdHdvIHRyaXZpYWwgYWN0aW9ucywgaW5lcnQgaXMgdGhlIHNhZmUgZGlyZWN0aW9uLgoJLy8gVGVzdEluZXJ0UmVhbG1GYWlsc0Nsb3NlZCBleGVyY2lzZXMgZXhhY3RseSB0aGF0IHN0YXRlLCBzbyB0aGUgY2xhaW0KCS8vIGlzIHRlc3QtYmFja2VkIHJhdGhlciB0aGFuIGFyZ3VlZC4KCS8vCgkvLyBBbiBhdWRpdCBvZiB0aGlzIGZpbGUgcmVjb21tZW5kZWQgcGFuaWNraW5nIGhlcmUgaW5zdGVhZCwgdG8gbWFrZSB0aGUKCS8vIGludmFyaWFudCBzdHJ1Y3R1cmFsLiBUaGF0IHdhcyB0cmllZCBhbmQgcmVqZWN0ZWQgb24gZXZpZGVuY2U6IHRoZQoJLy8gcmVhbG0ncyBpbml0IHJ1bnMgYmVmb3JlIHRoZSB0ZXN0IGZpbGUncywgc28gYSBwYW5pYyBtYWtlcyB0aGUgd2hvbGUKCS8vIHBhY2thZ2UgdW5sb2FkYWJsZSB1bmRlciBgZ25vIHRlc3RgIOKAlAoJLy8KCS8vCXBlcm1ib29rX2RlbW86IG5vIGRlcGxveS10aW1lIGFkbWluIChjb2RlPWdub1Vua25vd25FcnJvcikKCS8vCUZBSUw6IDAgYnVpbGQgZXJyb3JzLCAxIHRlc3QgZXJyb3JzCgkvLwoJLy8gd2hpY2ggdHJhZGVzIGFsbCAxNiB0ZXN0cywgaW5jbHVkaW5nIHRoZSBjZW50cmFsIGF1dGhvcml6YXRpb24gY2xhaW0sCgkvLyBmb3IgYSBndWFyZCBvbiBhIGJyYW5jaCB0aGUgYXVkaXQgaXRzZWxmIGNvdWxkIG5vdCByZWFjaCBvbi1jaGFpbi4KCS8vIFRoZSBlYXJseSByZXR1cm4gcGx1cyBhIGZhaWwtY2xvc2VkIHRlc3QgaXMgdGhlIGJldHRlciB0cmFkZS4KCS8vCgkvLyBUaGUgZGVwbG95LXRpbWUgb2JsaWdhdGlvbiB0aGlzIGxlYXZlcyBpcyByZWFsIGFuZCBiZWxvbmdzIGluIHRoZQoJLy8gcnVuYm9vaywgbm90IGluIHRoZSBjb2RlOiBjaGVjayBSZWFkeSgpIGltbWVkaWF0ZWx5IGFmdGVyIGRlcGxveWluZwoJLy8gYW5kIHRyZWF0IGZhbHNlIGFzIGEgRkFJTEVEIGRlcGxveSwgYmVjYXVzZSBpdCBpcyB1bnJlY292ZXJhYmxlIOKAlAoJLy8gbm90aGluZyBhc3NpZ25zIGJvb2sgYWZ0ZXIgaW5pdCwgc28gYSBmcmVzaCBwYXRoIGlzIHRoZSBvbmx5IHJlbWVkeS4KCWRlcGxveWVyIDo9IHVuc2FmZS5PcmlnaW5DYWxsZXIoKQoJaWYgIWRlcGxveWVyLklzVmFsaWQoKSB7CgkJcmV0dXJuCgl9CgliLCBlcnIgOj0gcGVybWJvb2suTmV3KGRlcGxveWVyLCBkZW1vTGltaXRzKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9Cglib29rID0gYgp9CgovLyBSZWFkeSByZXBvcnRzIHdoZXRoZXIgaW5pdCBjYXB0dXJlZCBhIGRlcGxveS10aW1lIGFkbWluIGFuZCBjb25zdHJ1Y3RlZAovLyB0aGUgYm9vay4gRmFsc2UgbWVhbnMgdGhlIHJlYWxtIGlzIGluZXJ0OyBzZWUgdGhlIG5vdGUgaW4gaW5pdC4KZnVuYyBSZWFkeSgpIGJvb2wgeyByZXR1cm4gYm9vayAhPSBuaWwgfQoKLy8gcmVqZWN0U3RyYXlTZW5kIGFib3J0cyBpZiBhbiBFT0EgYXR0YWNoZWQgY29pbnMgdG8gYW4gZW50cnlwb2ludCB0aGF0IGhhcwovLyBubyB1c2UgZm9yIHRoZW0uIFRoaXMgcmVhbG0gbmV2ZXIgaG9sZHMgdmFsdWU7IHdpdGhvdXQgdGhpcyBndWFyZCBhCi8vIG1pc3R5cGVkIHNlbmQgd291bGQgYmUgc2lsZW50bHkgYWJzb3JiZWQgYnkgdGhlIHJlYWxtIGJhbmsuCmZ1bmMgcmVqZWN0U3RyYXlTZW5kKGN1ciByZWFsbSkgewoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSA+IDAgewoJCXBhbmljKCJ0aGlzIGVudHJ5cG9pbnQgZG9lcyBub3QgYWNjZXB0IGNvaW5zIikKCX0KfQoKLy8gLS0tIHRoZSBnYXRlZCBhY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gRWFjaCBvbmUgYXNrcyBwZXJtYm9vayBhYm91dCBhbiBhZGRyZXNzIElUIGRlcml2ZWQgZnJvbSBpdHMgb3duIGNyb3NzaW5nCi8vIGZyYW1lLiBUaGUgYWRkcmVzcyBpcyBuZXZlciBhIHBhcmFtZXRlciAoY29uc3VtZXIgY29udHJhY3QgMykuCgovLyBCdW1wIGluY3JlbWVudHMgdGhlIGNvdW50ZXIuIFJlcXVpcmVzIHRoZSAiYnVtcCIgcGVybWlzc2lvbi4KLy8KLy8gVGhpcyBpcyB0aGUgZXhwZXJpbWVudDogY2FsbCBpdCB3aXRoIHRoZSBwZXJtaXNzaW9uIGFuZCBpdCBzdWNjZWVkczsgaGF2ZQovLyB0aGUgYWRtaW4gcmV2b2tlLCBjYWxsIGl0IGFnYWluIGluIGEgbGF0ZXIgdHJhbnNhY3Rpb24sIGFuZCBpdCBhYm9ydHMuCmZ1bmMgQnVtcChjdXIgcmVhbG0pIHN0cmluZyB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmICFib29rLkhhcyhQZXJtQnVtcCwgY2FsbGVyKSB7CgkJcGFuaWMoInBlcm1pc3Npb24gZGVuaWVkOiAiICsgUGVybUJ1bXApCgl9CgoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJYnVtcHMrKwoJbGFzdEJ1bXBlciA9IGNhbGxlcgoJbGFzdEJ1bXBIZWlnaHQgPSBub3cKCgljaGFpbi5FbWl0KCJCdW1wZWQiLAoJCSJieSIsIGNhbGxlci5TdHJpbmcoKSwKCQkiY291bnQiLCBpdG9hKGJ1bXBzKSwKCQkiaGVpZ2h0IiwgaXRvYShub3cpLAoJKQoJcmV0dXJuICJidW1wICIgKyBpdG9hKGJ1bXBzKSArICIgYXQgaGVpZ2h0ICIgKyBpdG9hKG5vdykKfQoKLy8gU2V0Tm90aWNlIHJlcGxhY2VzIHRoZSBwdWJsaWMgbm90aWNlLiBSZXF1aXJlcyB0aGUgIm5vdGljZSIgcGVybWlzc2lvbi4KLy8KLy8gSXQgZXhpc3RzIHNvIHRoZSBkZW1vIHNob3dzIHR3byBJTkRFUEVOREVOVCBwZXJtaXNzaW9ucyBvbiBvbmUgYm9vazoKLy8gaG9sZGluZyAiYnVtcCIgZG9lcyBub3QgbGV0IGFuIGFkZHJlc3Mgc2V0IHRoZSBub3RpY2UsIGFuZCByZXZva2luZyBvbmUKLy8gbGVhdmVzIHRoZSBvdGhlciBpbnRhY3QuCmZ1bmMgU2V0Tm90aWNlKGN1ciByZWFsbSwgdGV4dCBzdHJpbmcpIHN0cmluZyB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWlmICFib29rLkhhcyhQZXJtTm90aWNlLCBjYWxsZXIpIHsKCQlwYW5pYygicGVybWlzc2lvbiBkZW5pZWQ6ICIgKyBQZXJtTm90aWNlKQoJfQoJaWYgdGV4dCA9PSAiIiB7CgkJcGFuaWMoIm5vdGljZSBtdXN0IG5vdCBiZSBlbXB0eSIpCgl9CglpZiBsZW4odGV4dCkgPiBNYXhOb3RpY2VMZW4gewoJCXBhbmljKCJub3RpY2UgZXhjZWVkcyAiICsgaXRvYShNYXhOb3RpY2VMZW4pICsgIiBieXRlcyIpCgl9CgoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoJbm90aWNlID0gdGV4dAoJbm90aWNlQXV0aG9yID0gY2FsbGVyCglub3RpY2VTZXRBdEJsb2NrID0gbm93CgoJY2hhaW4uRW1pdCgiTm90aWNlU2V0IiwgImJ5IiwgY2FsbGVyLlN0cmluZygpLCAiaGVpZ2h0IiwgaXRvYShub3cpKQoJcmV0dXJuICJub3RpY2Ugc2V0IGF0IGhlaWdodCAiICsgaXRvYShub3cpCn0KCi8vIC0tLSBhZG1pbmlzdHJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vCi8vIEV2ZXJ5IG9uZSBvZiB0aGVzZSBpcyBhIGNyb3NzaW5nIGVudHJ5cG9pbnQgdGhhdCB0aHJlYWRzIGl0cyBPV04gY3VyIGludG8KLy8gcGVybWJvb2ssIHNvIHBlcm1ib29rIHJlc29sdmVzIHRoaXMgcmVhbG0ncyBpbW1lZGlhdGUgY2FsbGVyIGFzIHRoZQovLyBwcmluY2lwYWwgKGNvbnN1bWVyIGNvbnRyYWN0IDEpLiBOb25lIG9mIHRoZW0gdGFrZXMgYSBjYWxsZXIgYWRkcmVzcyBhcyBhbgovLyBhcmd1bWVudDsgdGhlcmUgaXMgbm90aGluZyBoZXJlIHRvIGZvcmdlLgoKLy8gR3JhbnQgZ2l2ZXMgYWRkciBhIHBlcm1pc3Npb24uIEFkbWluIG9ubHkuCmZ1bmMgR3JhbnQoY3VyIHJlYWxtLCBwZXJtIHN0cmluZywgYWRkciBhZGRyZXNzKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWlmIGVyciA6PSBib29rLkdyYW50KDAsIGN1ciwgcGVybSwgYWRkcik7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWNoYWluLkVtaXQoIkdyYW50ZWQiLCAicGVybWlzc2lvbiIsIHBlcm0sICJ0byIsIGFkZHIuU3RyaW5nKCkpCglyZXR1cm4gImdyYW50ZWQgIiArIHBlcm0gKyAiIHRvICIgKyBhZGRyLlN0cmluZygpCn0KCi8vIFJldm9rZSByZW1vdmVzIGEgcGVybWlzc2lvbiBmcm9tIGFkZHIuIEFkbWluIG9ubHkuCi8vCi8vIFRoZSByZXZva2UgaXMgY29tbWl0dGVkIGJ5IHRoaXMgdHJhbnNhY3Rpb24uIEFueSBsYXRlciB0cmFuc2FjdGlvbiB0aGF0Ci8vIHJlYWNoZXMgYSBnYXRlIG9uIHRoYXQgcGVybWlzc2lvbiBpcyByZWZ1c2VkIOKAlCB0aGF0IGlzIHRoZSBjbGFpbS4KZnVuYyBSZXZva2UoY3VyIHJlYWxtLCBwZXJtIHN0cmluZywgYWRkciBhZGRyZXNzKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWlmIGVyciA6PSBib29rLlJldm9rZSgwLCBjdXIsIHBlcm0sIGFkZHIpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgljaGFpbi5FbWl0KCJSZXZva2VkIiwgInBlcm1pc3Npb24iLCBwZXJtLCAiZnJvbSIsIGFkZHIuU3RyaW5nKCkpCglyZXR1cm4gInJldm9rZWQgIiArIHBlcm0gKyAiIGZyb20gIiArIGFkZHIuU3RyaW5nKCkKfQoKLy8gUmV2b2tlQWxsIHJlbW92ZXMgZXZlcnkgcGVybWlzc2lvbiBhZGRyIGhvbGRzIGFuZCByZXBvcnRzIGhvdyBtYW55LgovLyBBZG1pbiBvbmx5LgpmdW5jIFJldm9rZUFsbChjdXIgcmVhbG0sIGFkZHIgYWRkcmVzcykgc3RyaW5nIHsKCXJlamVjdFN0cmF5U2VuZChjdXIpCgluLCBlcnIgOj0gYm9vay5SZXZva2VBbGwoMCwgY3VyLCBhZGRyKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJY2hhaW4uRW1pdCgiUmV2b2tlZEFsbCIsICJmcm9tIiwgYWRkci5TdHJpbmcoKSwgImNvdW50IiwgaXRvYShpbnQ2NChuKSkpCglyZXR1cm4gInJldm9rZWQgIiArIGl0b2EoaW50NjQobikpICsgIiBwZXJtaXNzaW9uKHMpIGZyb20gIiArIGFkZHIuU3RyaW5nKCkKfQoKLy8gRHJvcFBlcm1pc3Npb24gcmVtb3ZlcyBhIHBlcm1pc3Npb24gYW5kIGV2ZXJ5IGdyYW50IG9mIGl0LiBBZG1pbiBvbmx5LgpmdW5jIERyb3BQZXJtaXNzaW9uKGN1ciByZWFsbSwgcGVybSBzdHJpbmcpIHN0cmluZyB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJaWYgZXJyIDo9IGJvb2suRHJvcFBlcm1pc3Npb24oMCwgY3VyLCBwZXJtKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJY2hhaW4uRW1pdCgiUGVybWlzc2lvbkRyb3BwZWQiLCAicGVybWlzc2lvbiIsIHBlcm0pCglyZXR1cm4gImRyb3BwZWQgIiArIHBlcm0KfQoKLy8gTm9taW5hdGVBZG1pbiByZWNvcmRzIGEgbm9taW5lZSBmb3IgdGhlIGFkbWluIHJvbGUuIEFkbWluIG9ubHkuIFRoZQovLyBoYW5kb2ZmIGRvZXMgbm90IHRha2UgZWZmZWN0IHVudGlsIHRoZSBub21pbmVlIGNhbGxzIEFjY2VwdEFkbWluLgpmdW5jIE5vbWluYXRlQWRtaW4oY3VyIHJlYWxtLCBub21pbmVlIGFkZHJlc3MpIHN0cmluZyB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJaWYgZXJyIDo9IGJvb2suTm9taW5hdGVBZG1pbigwLCBjdXIsIG5vbWluZWUpOyBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CgljaGFpbi5FbWl0KCJBZG1pbk5vbWluYXRlZCIsICJub21pbmVlIiwgbm9taW5lZS5TdHJpbmcoKSkKCXJldHVybiAibm9taW5hdGVkICIgKyBub21pbmVlLlN0cmluZygpCn0KCi8vIENhbmNlbE5vbWluYXRpb24gd2l0aGRyYXdzIGEgcGVuZGluZyBub21pbmF0aW9uLiBBZG1pbiBvbmx5LgpmdW5jIENhbmNlbE5vbWluYXRpb24oY3VyIHJlYWxtKSBzdHJpbmcgewoJcmVqZWN0U3RyYXlTZW5kKGN1cikKCWlmIGVyciA6PSBib29rLkNhbmNlbE5vbWluYXRpb24oMCwgY3VyKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJY2hhaW4uRW1pdCgiQWRtaW5Ob21pbmF0aW9uQ2FuY2VsbGVkIikKCXJldHVybiAibm9taW5hdGlvbiBjYW5jZWxsZWQiCn0KCi8vIEFjY2VwdEFkbWluIGNvbXBsZXRlcyBhIHBlbmRpbmcgaGFuZG9mZi4gT25seSB0aGUgbm9taW5lZSBtYXkgY2FsbCBpdC4KZnVuYyBBY2NlcHRBZG1pbihjdXIgcmVhbG0pIHN0cmluZyB7CglyZWplY3RTdHJheVNlbmQoY3VyKQoJaWYgZXJyIDo9IGJvb2suQWNjZXB0QWRtaW4oMCwgY3VyKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoZXJyKQoJfQoJd2hvIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJY2hhaW4uRW1pdCgiQWRtaW5BY2NlcHRlZCIsICJhZG1pbiIsIHdoby5TdHJpbmcoKSkKCXJldHVybiAiYWRtaW4gaXMgbm93ICIgKyB3aG8uU3RyaW5nKCkKfQoKLy8gLS0tIHJlYWQtb25seSB2aWV3cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8KLy8gTm9uZSBvZiB0aGVzZSBhdXRob3JpemVzIGFueXRoaW5nLCBhbmQgbm9uZSBvZiB0aGVtIGF1dGhlbnRpY2F0ZXMgaXRzCi8vIGNhbGxlci4gVGhleSBhbnN3ZXIgcXVlc3Rpb25zIGFib3V0IGFuIGFkZHJlc3MgKHBlcm1ib29rIGNvbnN1bWVyCi8vIGNvbnRyYWN0IDMpLgoKLy8gSGVpZ2h0IHJldHVybnMgdGhlIGNoYWluIGhlaWdodCB0aGlzIHJlYWxtIGlzIHJlYWRpbmcgYXMgIm5vdyIuCmZ1bmMgSGVpZ2h0KCkgaW50NjQgeyByZXR1cm4gcnVudGltZS5DaGFpbkhlaWdodCgpIH0KCi8vIEFkbWluIHJldHVybnMgdGhlIGJvb2sncyBjdXJyZW50IGFkbWluLgpmdW5jIEFkbWluKCkgc3RyaW5nIHsgcmV0dXJuIGJvb2suQWRtaW4oKS5TdHJpbmcoKSB9CgovLyBQZW5kaW5nQWRtaW4gcmV0dXJucyB0aGUgbm9taW5hdGVkLWJ1dC1ub3QteWV0LWFjY2VwdGVkIGFkbWluLCBvciAiIi4KZnVuYyBQZW5kaW5nQWRtaW4oKSBzdHJpbmcgeyByZXR1cm4gYm9vay5QZW5kaW5nQWRtaW4oKS5TdHJpbmcoKSB9CgovLyBIYXMgcmVwb3J0cyB3aGV0aGVyIGFkZHIgaG9sZHMgcGVybS4gVGhpcyBpcyB0aGUgcHJpbWl0aXZlJ3MgY29yZSBxdWVyeSwKLy8gZXhwb3NlZCB2ZXJiYXRpbSBzbyBpdCBjYW4gYmUgY2hlY2tlZCBmcm9tIG9mZi1jaGFpbi4KZnVuYyBIYXMocGVybSBzdHJpbmcsIGFkZHIgYWRkcmVzcykgYm9vbCB7IHJldHVybiBib29rLkhhcyhwZXJtLCBhZGRyKSB9CgovLyBDYW5CdW1wIHJlcG9ydHMgd2hldGhlciBhZGRyIHdvdWxkIGJlIGFsbG93ZWQgdG8gY2FsbCBCdW1wIHJpZ2h0IG5vdy4KZnVuYyBDYW5CdW1wKGFkZHIgYWRkcmVzcykgYm9vbCB7IHJldHVybiBib29rLkhhcyhQZXJtQnVtcCwgYWRkcikgfQoKLy8gUGVybWlzc2lvbnNPZiByZXR1cm5zIHRoZSBwZXJtaXNzaW9ucyBhZGRyIGhvbGRzLCBjb21tYS1zZXBhcmF0ZWQgaW4KLy8gbGV4aWNvZ3JhcGhpYyBvcmRlciwgb3IgIiIgZm9yIG5vbmUuIE5hbWVzIGFyZSByZXN0cmljdGVkIGJ5IHBlcm1ib29rIHRvCi8vIGxvd2VyY2FzZSBhbHBoYW51bWVyaWNzIGFuZCB1bmRlcnNjb3JlLCBzbyBhIGNvbW1hIGNhbiBuZXZlciBhcHBlYXIgaW4KLy8gb25lIGFuZCB0aGlzIGVuY29kaW5nIGlzIHVuYW1iaWd1b3VzLgpmdW5jIFBlcm1pc3Npb25zT2YoYWRkciBhZGRyZXNzKSBzdHJpbmcgewoJcmV0dXJuIGpvaW4oYm9vay5QZXJtaXNzaW9ucyhhZGRyKSkKfQoKLy8gUGVybWlzc2lvbkNvdW50IHJldHVybnMgaG93IG1hbnkgZGlzdGluY3QgcGVybWlzc2lvbnMgY3VycmVudGx5IGV4aXN0LgpmdW5jIFBlcm1pc3Npb25Db3VudCgpIGludCB7IHJldHVybiBib29rLlBlcm1pc3Npb25Db3VudCgpIH0KCi8vIFBlcm1pc3Npb25zIHJldHVybnMgdXAgdG8gTWF4TGlzdGVkIHBlcm1pc3Npb24gbmFtZXMsIGNvbW1hLXNlcGFyYXRlZCBpbgovLyBsZXhpY29ncmFwaGljIG9yZGVyLgpmdW5jIFBlcm1pc3Npb25zKCkgc3RyaW5nIHsKCXJldHVybiBqb2luKGJvb2suUGVybWlzc2lvbk5hbWVzKDAsIE1heExpc3RlZCkpCn0KCi8vIEhvbGRlckNvdW50IHJldHVybnMgaG93IG1hbnkgYWRkcmVzc2VzIGhvbGQgcGVybSwgb3IgMCBpZiBpdCBkb2VzIG5vdAovLyBleGlzdC4KZnVuYyBIb2xkZXJDb3VudChwZXJtIHN0cmluZykgaW50IHsgcmV0dXJuIGJvb2suSG9sZGVyQ291bnQocGVybSkgfQoKLy8gSG9sZGVycyByZXR1cm5zIHVwIHRvIE1heExpc3RlZCBob2xkZXJzIG9mIHBlcm0sIGNvbW1hLXNlcGFyYXRlZCBpbgovLyBzb3J0ZWQgb3JkZXIuCmZ1bmMgSG9sZGVycyhwZXJtIHN0cmluZykgc3RyaW5nIHsKCWhzIDo9IGJvb2suSG9sZGVycyhwZXJtLCAwLCBNYXhMaXN0ZWQpCglvdXQgOj0gIiIKCWZvciBpLCBoIDo9IHJhbmdlIGhzIHsKCQlpZiBpID4gMCB7CgkJCW91dCArPSAiLCIKCQl9CgkJb3V0ICs9IGguU3RyaW5nKCkKCX0KCXJldHVybiBvdXQKfQoKLy8gQnVtcHMgcmV0dXJucyBob3cgbWFueSB0aW1lcyBCdW1wIGhhcyBzdWNjZWVkZWQuCmZ1bmMgQnVtcHMoKSBpbnQ2NCB7IHJldHVybiBidW1wcyB9CgovLyBMYXN0QnVtcCBkZXNjcmliZXMgdGhlIG1vc3QgcmVjZW50IHN1Y2Nlc3NmdWwgQnVtcCwgb3IgIm5vbmUiLgpmdW5jIExhc3RCdW1wKCkgc3RyaW5nIHsKCWlmIGJ1bXBzID09IDAgewoJCXJldHVybiAibm9uZSIKCX0KCXJldHVybiBsYXN0QnVtcGVyLlN0cmluZygpICsgIiBhdCBoZWlnaHQgIiArIGl0b2EobGFzdEJ1bXBIZWlnaHQpCn0KCi8vIE5vdGljZSByZXR1cm5zIHRoZSBjdXJyZW50IHB1YmxpYyBub3RpY2UsIG9yICIiLgpmdW5jIE5vdGljZSgpIHN0cmluZyB7IHJldHVybiBub3RpY2UgfQoKLy8gTGltaXRzIHJlcG9ydHMgdGhlIGJvb2sncyBmaXhlZCBsaW1pdHMuCmZ1bmMgTGltaXRzKCkgc3RyaW5nIHsKCWwgOj0gYm9vay5MaW1pdHMoKQoJcmV0dXJuICJwZXJtaXNzaW9ucz0iICsgaXRvYShpbnQ2NChsLk1heFBlcm1pc3Npb25zKSkgKwoJCSIgaG9sZGVycz0iICsgaXRvYShpbnQ2NChsLk1heEhvbGRlcnNQZXJQZXJtaXNzaW9uKSkgKwoJCSIgbmFtZWxlbj0iICsgaXRvYShpbnQ2NChsLk1heE5hbWVMZW4pKQp9CgovLyAtLS0gcmVuZGVyaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gcmVhbG1QYXRoIGlzIHRoaXMgcmVhbG0ncyBnbm93ZWIgcHJlZml4LCB1c2VkIHRvIGJ1aWxkIHZpZXcgbGlua3MuCmNvbnN0IHJlYWxtUGF0aCA9ICIvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3Blcm1ib29rX2RlbW8iCgovLyBSZW5kZXIgc2VydmVzIHRocmVlIHZpZXdzLCBzZWxlY3RlZCBieSBwYXRoLgovLwovLwkoZW1wdHkpICBzdW1tYXJ5LCB0aGUgcGVybWlzc2lvbiB0YWJsZSwgYW5kIHRoZSBnYXRlZCBzdGF0ZQovLwlob2xkZXJzICBldmVyeSBwZXJtaXNzaW9uIHdpdGggaXRzIGhvbGRlcnMsIHVwIHRvIE1heExpc3RlZCBlYWNoCi8vCWFib3V0ICAgIHdoYXQgdGhpcyByZWFsbSBpcyBhbmQgd2h5IGl0IGV4aXN0cwovLwovLyBBbiBpbmVydCByZWFsbSAoc2VlIGluaXQpIHJlcG9ydHMgdGhhdCBpbnN0ZWFkIG9mIHJlbmRlcmluZy4gRXZlcnkgdmlldwovLyByZWFkcyB0aGUgYm9vaywgc28gd2l0aG91dCB0aGlzIHRoZSBnbm93ZWIgcGFnZSB3b3VsZCBhYm9ydCBvbiBhIG5pbAovLyBkZXJlZmVyZW5jZSDigJQgd2hpY2ggaXMgZXhhY3RseSB0aGUgbW9tZW50IGFuIG9wZXJhdG9yIG5lZWRzIGl0IHRvIHNheSB3aGF0Ci8vIGlzIHdyb25nLiBUaGUgdHlwZWQgcmVhZCBmdW5jdGlvbnMgc3RpbGwgYWJvcnQgd2hlbiBpbmVydDsgUmVhZHkgaXMgdGhlCi8vIHByb2JlIHRoYXQgYW5zd2VycyB0aGUgcXVlc3Rpb24gd2l0aG91dCBwYW5pY2tpbmcuCmZ1bmMgUmVuZGVyKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJaWYgIVJlYWR5KCkgewoJCXJldHVybiAiIyBQZXJtaXNzaW9uIGRlbW9cblxuIiArCgkJCSJUaGlzIHJlYWxtIGlzICoqaW5lcnQqKjogaW5pdCBjYXB0dXJlZCBubyBkZXBsb3ktdGltZSBhZG1pbiwgc28gIiArCgkJCSJubyBwZXJtaXNzaW9uIGJvb2sgZXhpc3RzLiBFdmVyeSBlbnRyeXBvaW50IGFib3J0cyBhbmQgbm90aGluZyAiICsKCQkJInJ1bnMgdW5nYXRlZC4gVGhlIHN0YXRlIGlzIHVucmVjb3ZlcmFibGUg4oCUIHJlZGVwbG95IHRvIGEgZnJlc2ggIiArCgkJCSJwYXRoLlxuIgoJfQoKCXN3aXRjaCBub3JtYWxpemVQYXRoKHBhdGgpIHsKCWNhc2UgImhvbGRlcnMiOgoJCXJldHVybiByZW5kZXJIZWFkZXIoKSArIHJlbmRlckhvbGRlcnMoKQoJY2FzZSAiYWJvdXQiOgoJCXJldHVybiByZW5kZXJIZWFkZXIoKSArIHJlbmRlckFib3V0KCkKCWRlZmF1bHQ6CgkJcmV0dXJuIHJlbmRlckhlYWRlcigpICsgcmVuZGVyUGVybWlzc2lvbnMoKSArIHJlbmRlclN0YXRlKCkKCX0KfQoKZnVuYyByZW5kZXJIZWFkZXIoKSBzdHJpbmcgewoJcyA6PSAiIyBQZXJtaXNzaW9uIGRlbW9cblxuIgoJcyArPSAiUmVmZXJlbmNlIGNvbnN1bWVyIGZvciBbcGVybWJvb2tdKC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcGVybWJvb2spLlxuXG4iCglzICs9ICItIGhlaWdodDogIiArIGl0b2EocnVudGltZS5DaGFpbkhlaWdodCgpKSArICJcbiIKCXMgKz0gIi0gYWRtaW46ICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGJvb2suQWRtaW4oKS5TdHJpbmcoKSkgKyAiXG4iCglpZiBwIDo9IGJvb2suUGVuZGluZ0FkbWluKCk7IHAgIT0gYWRkcmVzcygiIikgewoJCXMgKz0gIi0gcGVuZGluZyBhZG1pbjogIiArIHNhbml0aXplLklubGluZVRleHQocC5TdHJpbmcoKSkgKyAiXG4iCgl9CglzICs9ICItIHBlcm1pc3Npb25zOiAiICsgaXRvYShpbnQ2NChib29rLlBlcm1pc3Npb25Db3VudCgpKSkgKwoJCSIgLyAiICsgaXRvYShpbnQ2NChNYXhQZXJtaXNzaW9ucykpICsgIlxuXG4iCglzICs9ICJbc3VtbWFyeV0oIiArIHJlYWxtUGF0aCArICIpIMK3ICIKCXMgKz0gIltob2xkZXJzXSgiICsgcmVhbG1QYXRoICsgIjpob2xkZXJzKSDCtyAiCglzICs9ICJbYWJvdXRdKCIgKyByZWFsbVBhdGggKyAiOmFib3V0KVxuXG4iCglyZXR1cm4gcwp9CgpmdW5jIHJlbmRlclBlcm1pc3Npb25zKCkgc3RyaW5nIHsKCW5hbWVzIDo9IGJvb2suUGVybWlzc2lvbk5hbWVzKDAsIE1heExpc3RlZCkKCglzIDo9ICIjIyBQZXJtaXNzaW9uc1xuXG4iCglpZiBsZW4obmFtZXMpID09IDAgewoJCXJldHVybiBzICsgIl9ub25lIGdyYW50ZWQgeWV0Ll9cblxuIgoJfQoJcyArPSAifCBwZXJtaXNzaW9uIHwgaG9sZGVycyB8IGdhdGVzIHxcbnwtLS18LS0tfC0tLXxcbiIKCWZvciBfLCBuIDo9IHJhbmdlIG5hbWVzIHsKCQlzICs9ICJ8ICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KG4pICsKCQkJIiB8ICIgKyBpdG9hKGludDY0KGJvb2suSG9sZGVyQ291bnQobikpKSArCgkJCSIgfCAiICsgZ2F0ZUZvcihuKSArICIgfFxuIgoJfQoJaWYgYm9vay5QZXJtaXNzaW9uQ291bnQoKSA+IGxlbihuYW1lcykgewoJCXMgKz0gIlxuU2hvd2luZyB0aGUgZmlyc3QgIiArIGl0b2EoaW50NjQobGVuKG5hbWVzKSkpICsgIiBvZiAiICsKCQkJaXRvYShpbnQ2NChib29rLlBlcm1pc3Npb25Db3VudCgpKSkgKyAiLlxuIgoJfQoJcmV0dXJuIHMgKyAiXG4iCn0KCi8vIGdhdGVGb3IgbmFtZXMgdGhlIGVudHJ5cG9pbnQgYSBwZXJtaXNzaW9uIG9wZW5zLCBvciBzYXlzIGl0IG9wZW5zIG5vbmUuCi8vIEEgcGVybWlzc2lvbiB3aXRoIG5vIGdhdGUgaXMgbm90IGEgYnVnOiB0aGUgYWRtaW4gbWF5IGdyYW50IGEgbmFtZSB0aGlzCi8vIHJlYWxtIGRvZXMgbm90IHJlYWQsIGFuZCBzYXlpbmcgc28gcGxhaW5seSBpcyBiZXR0ZXIgdGhhbiBpbXBseWluZyBldmVyeQovLyBwZXJtaXNzaW9uIGlzIGVuZm9yY2VkIHNvbWV3aGVyZS4KZnVuYyBnYXRlRm9yKHBlcm0gc3RyaW5nKSBzdHJpbmcgewoJc3dpdGNoIHBlcm0gewoJY2FzZSBQZXJtQnVtcDoKCQlyZXR1cm4gImBCdW1wYCIKCWNhc2UgUGVybU5vdGljZToKCQlyZXR1cm4gImBTZXROb3RpY2VgIgoJZGVmYXVsdDoKCQlyZXR1cm4gIl9ubyBlbnRyeXBvaW50IHJlYWRzIHRoaXNfIgoJfQp9CgpmdW5jIHJlbmRlckhvbGRlcnMoKSBzdHJpbmcgewoJbmFtZXMgOj0gYm9vay5QZXJtaXNzaW9uTmFtZXMoMCwgTWF4TGlzdGVkKQoKCXMgOj0gIiMjIEhvbGRlcnNcblxuIgoJaWYgbGVuKG5hbWVzKSA9PSAwIHsKCQlyZXR1cm4gcyArICJfbm9uZSBncmFudGVkIHlldC5fXG5cbiIKCX0KCWZvciBfLCBuIDo9IHJhbmdlIG5hbWVzIHsKCQl0b3RhbCA6PSBib29rLkhvbGRlckNvdW50KG4pCgkJcyArPSAiKioiICsgc2FuaXRpemUuSW5saW5lVGV4dChuKSArICIqKiDigJQgIiArIGl0b2EoaW50NjQodG90YWwpKSArICIgaG9sZGVyKHMpXG5cbiIKCQlmb3IgXywgaCA6PSByYW5nZSBib29rLkhvbGRlcnMobiwgMCwgTWF4TGlzdGVkKSB7CgkJCXMgKz0gIi0gIiArIHNhbml0aXplLklubGluZVRleHQoaC5TdHJpbmcoKSkgKyAiXG4iCgkJfQoJCWlmIHRvdGFsID4gTWF4TGlzdGVkIHsKCQkJcyArPSAiXG5fU2hvd2luZyB0aGUgZmlyc3QgIiArIGl0b2EoaW50NjQoTWF4TGlzdGVkKSkgKyAiIG9mICIgKwoJCQkJaXRvYShpbnQ2NCh0b3RhbCkpICsgIi5fXG4iCgkJfQoJCXMgKz0gIlxuIgoJfQoJcmV0dXJuIHMKfQoKZnVuYyByZW5kZXJTdGF0ZSgpIHN0cmluZyB7CglzIDo9ICIjIyBHYXRlZCBzdGF0ZVxuXG4iCglzICs9ICItIGJ1bXBzOiAiICsgaXRvYShidW1wcykgKyAiXG4iCglzICs9ICItIGxhc3QgYnVtcDogIgoJaWYgYnVtcHMgPT0gMCB7CgkJcyArPSAiX25vbmVfXG4iCgl9IGVsc2UgewoJCXMgKz0gc2FuaXRpemUuSW5saW5lVGV4dChsYXN0QnVtcGVyLlN0cmluZygpKSArCgkJCSIgYXQgaGVpZ2h0ICIgKyBpdG9hKGxhc3RCdW1wSGVpZ2h0KSArICJcbiIKCX0KCXMgKz0gIlxuIyMjIE5vdGljZVxuXG4iCglpZiBub3RpY2UgPT0gIiIgewoJCXJldHVybiBzICsgIl9ub25lIHNldC5fXG5cbiIKCX0KCS8vIEJsb2NrcXVvdGUsIG5vdCBJbmxpbmVUZXh0OiB0aGUgc2xvdCBJUyBhIGJsb2NrcXVvdGUsIHNvIHRoZSBoZWxwZXIKCS8vIHdob3NlIGNvbnRyYWN0IGNvdmVycyB0aGUgc2xvdCBpcyB0aGUgb25lIHRvIHVzZS4gQmxvY2txdW90ZSBlbWl0cwoJLy8gaXRzIG93biBlbnZlbG9wZSwgc28gbm8gbWFudWFsICI+ICIgcHJlZml4IGhlcmUuCglzICs9IHNhbml0aXplLkJsb2NrcXVvdGUobm90aWNlKQoJcyArPSAic2V0IGJ5ICIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KG5vdGljZUF1dGhvci5TdHJpbmcoKSkgKwoJCSIgYXQgaGVpZ2h0ICIgKyBpdG9hKG5vdGljZVNldEF0QmxvY2spICsgIlxuXG4iCglyZXR1cm4gcwp9CgpmdW5jIHJlbmRlckFib3V0KCkgc3RyaW5nIHsKCXJldHVybiAiIyMgQWJvdXRcblxuIiArCgkJIlR3byBwZXJtaXNzaW9uLWdhdGVkIGVudHJ5cG9pbnRzLCBkZWxpYmVyYXRlbHkgdHJpdmlhbCBzbyB0aGF0IHRoZSAiICsKCQkib25seSBpbnRlcmVzdGluZyB0aGluZyBhYm91dCB0aGVtIGlzIHRoZSBnYXRlOlxuXG4iICsKCQkiLSBgQnVtcGAgcmVxdWlyZXMgYCIgKyBQZXJtQnVtcCArICJgXG4iICsKCQkiLSBgU2V0Tm90aWNlYCByZXF1aXJlcyBgIiArIFBlcm1Ob3RpY2UgKyAiYFxuXG4iICsKCQkiVGhlIGRlcGxveWVyIGlzIHRoZSBib29rJ3MgYWRtaW4gYW5kIGlzIHRoZSBvbmx5IGFjY291bnQgdGhhdCBtYXkgIiArCgkJImdyYW50IG9yIHJldm9rZS4gKipIb2xkaW5nIGEgcGVybWlzc2lvbiBjb25mZXJzIG5vIGF1dGhvcml0eSBvdmVyICIgKwoJCSJ0aGUgYm9vayoqOiBhIGhvbGRlciBjYW5ub3QgZ3JhbnQsIGNhbm5vdCByZXZva2UsIGFuZCBjYW5ub3QgIiArCgkJIm5vbWluYXRlIGFuIGFkbWluLlxuXG4iICsKCQkiVGhlIGNsYWltIHRoaXMgcmVhbG0gbWFrZXMgZmFsc2lmaWFibGUgaXMgdGhhdCBhIHBlcm1pc3Npb24gcmV2b2tlZCAiICsKCQkiaW4gb25lIHRyYW5zYWN0aW9uIGlzIHJlZnVzZWQgaW4gdGhlIG5leHQuIEdyYW50IGAiICsgUGVybUJ1bXAgKwoJCSJgLCBjYWxsIGBCdW1wYCDigJQgaXQgc3VjY2VlZHMuIFJldm9rZSwgY2FsbCBgQnVtcGAgYWdhaW4g4oCUIGl0ICIgKwoJCSJhYm9ydHMuIEEgcHVyZSBwYWNrYWdlIGNhbm5vdCBzaG93IHRoYXQ7IG9ubHkgYSByZWFsbSBjYWxsZWQgYWNyb3NzICIgKwoJCSJzZXZlcmFsIHRyYW5zYWN0aW9ucyBjYW4uXG5cbiIgKwoJCSJUaGlzIHJlYWxtIGhvbGRzIG5vIGNvaW5zIGFuZCBpbXBvcnRzIG5vIGJhbmtlci4gRXZlcnkgY3Jvc3NpbmcgIiArCgkJImVudHJ5cG9pbnQgcmVqZWN0cyBhdHRhY2hlZCBjb2lucywgYW5kIHRoZSByZWFkIHZpZXdzIGFyZSAiICsKCQkibm9uLWNyb3NzaW5nIHNvIG5vIHRyYW5zYWN0aW9uIGNhbiBhdHRhY2ggY29pbnMgdG8gb25lLlxuXG4iICsKCQkiLSBtYXggcGVybWlzc2lvbnM6ICIgKyBpdG9hKGludDY0KE1heFBlcm1pc3Npb25zKSkgKyAiXG4iICsKCQkiLSBtYXggaG9sZGVycyBwZXIgcGVybWlzc2lvbjogIiArIGl0b2EoaW50NjQoTWF4SG9sZGVycykpICsgIlxuIiArCgkJIi0gbWF4IHBlcm1pc3Npb24gbmFtZSBsZW5ndGg6ICIgKyBpdG9hKGludDY0KE1heE5hbWVMZW4pKSArICJcbiIgKwoJCSItIG1heCBub3RpY2UgbGVuZ3RoOiAiICsgaXRvYShpbnQ2NChNYXhOb3RpY2VMZW4pKSArICIgYnl0ZXNcbiIKfQoKLy8gbm9ybWFsaXplUGF0aCByZWR1Y2VzIGEgZ25vd2ViIHJlbmRlciBwYXRoIHRvIGEgYmFyZSB2aWV3IG5hbWUsIHNvICIiLAovLyAiLyIsICJob2xkZXJzIiBhbmQgIi9ob2xkZXJzLyIgYWxsIHNlbGVjdCB0aGUgc2FtZSB2aWV3LgpmdW5jIG5vcm1hbGl6ZVBhdGgocGF0aCBzdHJpbmcpIHN0cmluZyB7Cglmb3IgbGVuKHBhdGgpID4gMCAmJiBwYXRoWzBdID09ICcvJyB7CgkJcGF0aCA9IHBhdGhbMTpdCgl9Cglmb3IgbGVuKHBhdGgpID4gMCAmJiBwYXRoW2xlbihwYXRoKS0xXSA9PSAnLycgewoJCXBhdGggPSBwYXRoWzpsZW4ocGF0aCktMV0KCX0KCXJldHVybiBwYXRoCn0KCi8vIC0tLSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBqb2luIGNvbW1hLXNlcGFyYXRlcyBuYW1lcy4gU2FmZSBiZWNhdXNlIHBlcm1ib29rIHJlc3RyaWN0cyBwZXJtaXNzaW9uCi8vIG5hbWVzIHRvIGxvd2VyY2FzZSBhbHBoYW51bWVyaWNzIGFuZCB1bmRlcnNjb3JlLCBzbyBubyBuYW1lIGNhbiBjb250YWluCi8vIHRoZSBkZWxpbWl0ZXIuCmZ1bmMgam9pbihuYW1lcyBbXXN0cmluZykgc3RyaW5nIHsKCW91dCA6PSAiIgoJZm9yIGksIG4gOj0gcmFuZ2UgbmFtZXMgewoJCWlmIGkgPiAwIHsKCQkJb3V0ICs9ICIsIgoJCX0KCQlvdXQgKz0gbgoJfQoJcmV0dXJuIG91dAp9CgpmdW5jIGl0b2EobiBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKSB9CiINMTAwMDAwMDB1Z25vdBISCNSGkzsSCzEyNDA0NnVnbm90GqgBCjoKEy90bS5QdWJLZXlTZWNwMjU2azESIwohAhb0MXbJJXjONC6Z4m+tKff+fEbtcENW/6uTFX9iuw6YEkCwFskB6971cIZBUbKE1r0kDb0PLsGRKczmq8+qpi3XtlRyXch/cmp262N/ju6qFPkfm/dWXdsvy4U7dcnC0lOXGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl"
  }
}