{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "h4ZgQlGcGHArXkNMNShOcM+lqAdclnpD2QOCwvIlzPs=",
    "height": "612427",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": [
          {
            "@type": "/tm.StorageDepositEvent",
            "bytes_delta": "21065",
            "fee_delta": "2106500ugnot",
            "pkg_path": "gno.land/p/g1ut6uspuh73e02yauxpmyt8g3wwddaq8utagvm3/permbook"
          }
        ],
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "52136592",
      "GasUsed": "34757728"
    },
    "tx": "CrKQAQoML3ZtLm1fYWRkcGtnEqCQAQooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLjjwEKCHBlcm1ib29rEjxnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcGVybWJvb2saYwoLZ25vbW9kLnRvbWwSVG1vZHVsZSA9ICJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcGVybWJvb2siCmdubyA9ICIwLjkiChqyjgEKDHBlcm1ib29rLmdubxKgjgEvLyBQYWNrYWdlIHBlcm1ib29rIGlzIGEgYm91bmRlZCwgYXV0aG9yaXphdGlvbi1jYXJyeWluZyBmYWNhZGUgb3ZlcgovLyBnbm8ubGFuZC9wL250L2dyb3Vwcy92MC4gSXQgbGV0cyBhIHJlYWxtIGRlZmluZSBuYW1lZCBwZXJtaXNzaW9ucywgZ3JhbnQKLy8gdGhlbSB0byBhZGRyZXNzZXMsIHJldm9rZSB0aGVtLCBhbmQgYXNrICJkb2VzIHRoaXMgYWRkcmVzcyBjdXJyZW50bHkgaG9sZAovLyB0aGlzIHBlcm1pc3Npb24iIHdpdGhvdXQgaXRlcmF0aW5nIGFueXRoaW5nLgovLwovLyBJdCBob2xkcyBubyBjb2lucywgaW1wb3J0cyBubyBiYW5rZXIsIHN0b3JlcyBubyBjYWxsYmFja3MsIGFuZCBvd25zIG5vCi8vIHBhY2thZ2UtbGV2ZWwgc3RhdGUuIFRoZSBpbXBvcnRpbmcgcmVhbG0gYWxsb2NhdGVzIGEgKkJvb2sgYW5kIGtlZXBzIGl0Ci8vIHByaXZhdGUuCi8vCi8vICMgV2hhdCB0aGlzIHBhY2thZ2UgYWRkcywgYW5kIHdoYXQgaXQgZG9lcyBub3QKLy8KLy8gSXQgYWRkcyBleGFjdGx5IGZvdXIgdGhpbmdzIHRvIGdyb3VwcywgYW5kIGRlbGliZXJhdGVseSBub3RoaW5nIGVsc2U6Ci8vCi8vICAxLiBhbiBBRE1JTiBib3VuZCB0byB0aGUgYm9vaywgd2l0aCBhIHR3by1zdGVwIGhhbmRvZmY7Ci8vICAyLiBCT1VORFMgb24gcGVybWlzc2lvbiBjb3VudCwgaG9sZGVycyBwZXIgcGVybWlzc2lvbiwgYW5kIG5hbWUgc2hhcGU7Ci8vICAzLiBwZXJtaXNzaW9uIHNlbWFudGljcyBpbnN0ZWFkIG9mIG1lbWJlcnNoaXAgc2VtYW50aWNzIOKAlCBubyBiYXNlIHNldCwgbm8KLy8gICAgIG1ldGFkYXRhIHNsb3QsIGFuZCBhbiBlbXB0eSBwZXJtaXNzaW9uIGlzIHBydW5lZCByYXRoZXIgdGhhbiBrZXB0OwovLyAgNC4gYSBjcm9zcy1yZWFsbSBzdXJmYWNlIHRoYXQgaXMgc2FmZSBieSBDT05TVFJVQ1RJT04g4oCUIHRoZSAqZ3JvdXBzLkdyb3VwCi8vICAgICBpcyB1bmV4cG9ydGVkIGFuZCBubyBtZXRob2QgcmV0dXJucyBhIG11dGFibGUgaGFuZGxlIHRvIGl0LgovLwovLyBFdmVyeXRoaW5nIGVsc2Ug4oCUIHRoZSBCKy10cmVlIHJlZ2lzdHJ5LCB0aGUgbWVtYmVyIHNldHMsIG9yZGVyZWQKLy8gaXRlcmF0aW9uLCB0aGUgcmVhZG9ubHkgdmlld3Mg4oCUIGNvbWVzIGZyb20gZ3JvdXBzLiBUaGlzIHBhY2thZ2Ugd3JpdGVzIG5vCi8vIGRhdGEtc3RydWN0dXJlIGNvZGUuCi8vCi8vICMgVGhlIHF1ZXJ5Ci8vCi8vCWlmICFib29rLkhhcygid2l0aGRyYXciLCB3aG8pIHsKLy8JCXBhbmljKCJub3QgYXV0aG9yaXplZCIpCi8vCX0KLy8KLy8gSGFzIGNvc3RzIHR3byBpbmRlcGVuZGVudCBCKy10cmVlIGRlc2NlbnRzOiBPKGxvZyBQKSB0byBmaW5kIHRoZQovLyBwZXJtaXNzaW9uLCBPKGxvZyBIKSB0byBmaW5kIHRoZSBob2xkZXIuIEl0IGlzIE5PVCBhIGZ1bmN0aW9uIG9mIGhvdyBtYW55Ci8vIHBlcm1pc3Npb25zIGB3aG9gIGFscmVhZHkgaG9sZHMuIFRoYXQgbWF0dGVyczogZXZlcnkgb3RoZXIgbmFtZWQtcGVybWlzc2lvbgovLyBpbXBsZW1lbnRhdGlvbiBzdXJ2ZXllZCBhbnN3ZXJzIHRoaXMgYnkgaXRlcmF0aW5nIHRoZSBzdWJqZWN0J3MKLy8gcGVybWlzc2lvbnMsIHdoaWNoIG1ha2VzIHRoZSBtb3N0LXByaXZpbGVnZWQgYWRkcmVzcyB0aGUgbW9zdCBleHBlbnNpdmUgdG8KLy8gY2hlY2sg4oCUIHRoZSB3cm9uZyBhc3ltcHRvdGljIGZvciBhbiBhdXRob3JpemF0aW9uIGNoZWNrIG9uIGEgaG90IHBhdGguCi8vCi8vICMgQXV0aG9yaXphdGlvbgovLwovLyBNdXRhdG9ycyB0YWtlIChfIGludCwgcmxtIHJlYWxtKSBhbmQgaWRlbnRpZnkgdGhlIHByaW5jaXBhbCBhcwovLyBybG0uUHJldmlvdXMoKS5BZGRyZXNzKCksIGFmdGVyIGFzc2VydGluZyBybG0uSXNDdXJyZW50KCkuIFRoZSBjb25zdW1pbmcKLy8gcmVhbG0gdGhyZWFkcyBpdHMgb3duIGN1cjoKLy8KLy8JZnVuYyBHcmFudChjdXIgcmVhbG0sIHBlcm0gc3RyaW5nLCBhZGRyIGFkZHJlc3MpIHsKLy8JCWlmIGVyciA6PSBib29rLkdyYW50KDAsIGN1ciwgcGVybSwgYWRkcik7IGVyciAhPSBuaWwgewovLwkJCXBhbmljKGVycikKLy8JCX0KLy8JfQovLwovLyBJc0N1cnJlbnQoKSByZWplY3RzIGEgc3RhbGUgb3Igc3Rhc2hlZCByZWFsbSB2YWx1ZSwgc28gYSBob3N0aWxlIHJlYWxtCi8vIGNhbm5vdCByZXBsYXkgYW4gb2xkIGN1ciB0byBpbXBlcnNvbmF0ZSB0aGUgYWRtaW4uIFRoaXMgaXMgdGhlIHNhbWUgc2hhcGUKLy8gYXMgcC9udC9vd25hYmxlL3YwIGFuZCBwL250L293bmFibGUvdjAvZXh0cy9hdXRob3JpemFibGUuCi8vCi8vICMgTGlmZWN5Y2xlIG9mIGEgcGVybWlzc2lvbgovLwovLyBBIHBlcm1pc3Npb24gY29tZXMgaW50byBleGlzdGVuY2Ugb24gaXRzIGZpcnN0IGdyYW50IGFuZCBjZWFzZXMgdG8gZXhpc3QKLy8gd2hlbiBpdHMgbGFzdCBob2xkZXIgaXMgcmV2b2tlZC4gVGhlcmUgaXMgbm8gY3JlYXRlIHN0ZXAgYW5kIG5vIHJlc2VydmVkCi8vIG5hbWUuIEhhcyByZXR1cm5zIGZhbHNlIGVpdGhlciB3YXksIHNvIHRoZSBkaXN0aW5jdGlvbiBpcyBpbnZpc2libGUgdG8gYQovLyBjYWxsZXIgYW5kIHRoZSBib29rIGRvZXMgbm90IGFjY3VtdWxhdGUgZW1wdHkgYnVja2V0cy4KLy8KLy8JKGFic2VudCkg4pSA4pSAR3JhbnTilIDilIA+IGhlbGQgYnkgMS4uTWF4SG9sZGVyc1BlclBlcm1pc3Npb24g4pSA4pSAUmV2b2tlIGxhc3TilIDilIA+IChhYnNlbnQpCi8vCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIOKUggovLwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICDilJTilIDilIAgRHJvcFBlcm1pc3Npb24g4pSA4pSAPiAoYWJzZW50KQovLwovLyAjIEFkbWluIGhhbmRvZmYgaXMgdHdvLXN0ZXAKLy8KLy8gTm9taW5hdGVBZG1pbiByZWNvcmRzIGEgbm9taW5lZTsgb25seSBBY2NlcHRBZG1pbiwgY2FsbGVkIGJ5IHRoYXQgbm9taW5lZSwKLy8gbW92ZXMgdGhlIGFkbWluLiBBIG9uZS1zdGVwIHRyYW5zZmVyIHRvIGEgd2VsbC1mb3JtZWQtYnV0LXVub3duZWQgYWRkcmVzcwovLyBpcyBwZXJtYW5lbnRseSBmYXRhbCDigJQgYWRkcmVzcy5Jc1ZhbGlkIG9ubHkgY2hlY2tzIGJlY2gzMiBmb3JtLCBzbyBhCi8vIG1pc3R5cGVkIGFkZHJlc3MgcGFzc2VzIHZhbGlkYXRpb24gYW5kIGxlYXZlcyBhIGJvb2sgbm9ib2R5IGNhbiBldmVyIGdyYW50Ci8vIG9yIHJldm9rZSBvbiBhZ2Fpbi4gVGhpcyBpcyB0aGUgWTQgZmluZGluZyBmcm9tIHRoZSBhdWRpdCBvZiBDb3NtaWMgQnVsbCdzCi8vIG93biByL3Blcm1pc3Npb25fcmVnaXN0cnksIGNhcnJpZWQgZm9yd2FyZC4KLy8KLy8gIyBDb25zdW1lciBjb250cmFjdCDigJQgdGhlIHBhcnRzIHRoaXMgcGFja2FnZSBDQU5OT1QgZW5mb3JjZQovLwovLyAgMS4gVEhSRUFEIEEgTElWRSBjdXIuIHJsbS5Jc0N1cnJlbnQoKSBwcm92ZXMgdGhlIHJlYWxtIHZhbHVlIGNhbWUgZnJvbSBhCi8vICAgICBsaXZlIGNyb3NzaW5nIGZyYW1lLCBhbmQgcmxtLlByZXZpb3VzKCkuQWRkcmVzcygpIGlzIHRoZW4gdGhlIHByaW5jaXBhbAovLyAgICAgdGhhdCBjcm9zc2VkIGludG8geW91ciByZWFsbS4gQSBjb25zdW1lciB0aGF0IHdyYXBzIGEgcGVybWJvb2sgbXV0YXRvcgovLyAgICAgaW4gYSBOT04tY3Jvc3NpbmcgZXhwb3J0ZWQgaGVscGVyIHJlc29sdmVzIGl0cyBpbXBvcnRlcidzIGNhbGxlcgovLyAgICAgaW5zdGVhZCBvZiBpdHMgaW1wb3J0ZXIg4oCUIENsYXNzLTIgZGVzaWduYXRpb24gZm9yZ2VyeSwgaW4gdGhlIGNvbnN1bWVyLgovLyAgICAgQ2FsbCBwZXJtYm9vayBtdXRhdG9ycyBmcm9tIHlvdXIgb3duIGNyb3NzaW5nIGVudHJ5cG9pbnRzLCBwYXNzaW5nIHRoYXQKLy8gICAgIGVudHJ5cG9pbnQncyBvd24gY3VyLgovLwovLyAgMi4gRE8gTk9UIExFQUsgVEhFICpCb29rLiBObyBtZXRob2QgaGVyZSByZXR1cm5zIGEgbXV0YWJsZSBoYW5kbGUsIGJ1dCBhCi8vICAgICBjb25zdW1lciB0aGF0IGV4cG9ydHMgaXRzICpCb29rIOKAlCBvciByZXR1cm5zIGl0IGZyb20gYSBmdW5jdGlvbgovLyAgICAgcmVhY2hhYmxlIGJ5IGFub3RoZXIgcmVhbG0g4oCUIGhhbmRzIG91dCBldmVyeSBtdXRhdG9yIG9uIGl0LCBhbmQKLy8gICAgIGJvcnJvdyBydWxlICMyIGNvbW1pdHMgdGhvc2Ugd3JpdGVzIHVuZGVyIFlPVVIgcmVhbG0ncyBhdXRob3JpdHkuIEtlZXAKLy8gICAgIGl0IGluIGFuIHVuZXhwb3J0ZWQgcGFja2FnZS1sZXZlbCB2YXJpYWJsZS4KLy8KLy8gIDMuIEhhcyBBTlNXRVJTIEFCT1VUIEFOIEFERFJFU1MsIE5PVCBBQk9VVCBZT1VSIENBTExFUi4gSXQgcGVyZm9ybXMgbm8KLy8gICAgIGF1dGhlbnRpY2F0aW9uLiBEZXJpdmUgdGhlIGFkZHJlc3MgZnJvbSB5b3VyIG93biBjcm9zc2luZyBlbnRyeXBvaW50J3MKLy8gICAgIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSBhbmQgcGFzcyBpdCBpbi4KLy8KLy8gIDQuIENIT09TRSBMSU1JVFMgREVMSUJFUkFURUxZLiBUaGV5IGFyZSBmaXhlZCBmb3IgdGhlIGxpZmUgb2YgYSBCb29rLiBBCi8vICAgICBjb25zdW1lciB0aGF0IG5lZWRzIGRpZmZlcmVudCBib3VuZHMgbGF0ZXIgbXVzdCBhbGxvY2F0ZSBhIHNlY29uZCBCb29rOwovLyAgICAgbm90aGluZyBoZXJlIG1pZ3JhdGVzIHN0YXRlIGJldHdlZW4gdGhlbS4KLy8KLy8gIyBOb3RlIG9uIHRoZSBncm91cHMgYmFzZSBzZXQKLy8KLy8gQSBncm91cHMuR3JvdXAgY2FycmllcyBhIGJhc2UgYWRkcmVzcyBzZXQgYWxvbmdzaWRlIGl0cyBuYW1lZCByb2xlcy4gVGhpcwovLyBwYWNrYWdlIG5ldmVyIHdyaXRlcyB0byBpdCwgc28gaXQgaXMgcHJvdmFibHkgZW1wdHkgZm9yIGFueSBCb29rLCBhbmQKLy8gImluIHRoZSBiYXNlIHNldCIgY2FuIG5ldmVyIG1lYW4gImhvbGRzIGEgcGVybWlzc2lvbiIuCnBhY2thZ2UgcGVybWJvb2sKCmltcG9ydCAoCgkiZXJyb3JzIgoKCSJnbm8ubGFuZC9wL250L2dyb3Vwcy92MCIKKQoKLy8gQ2VpbGluZ3Mgb24gd2hhdCBMaW1pdHMgbWF5IGJlIGNvbmZpZ3VyZWQgdG8uIFRoZXkgYm91bmQgd29yc3QtY2FzZSBnYXMKLy8gYW5kIHN0b3JhZ2UgZm9yIGFueSBCb29rLCBob3dldmVyIHRoZSBjb25zdW1lciBjb25maWd1cmVzIGl0LgovLwovLyBNYXhQZXJtaXNzaW9uc0NlaWxpbmcgaXMgdGhlIG9uZSB0aGF0IGJvdW5kcyBHQVMgcmF0aGVyIHRoYW4gbWVyZWx5Ci8vIHN0b3JhZ2UuIFRocmVlIG9wZXJhdGlvbnMgd2FsayBldmVyeSBwZXJtaXNzaW9uIGluIHRoZSBib29rIGF0IE8oUCBsb2cgSCkKLy8g4oCUIFBlcm1pc3Npb25zLCBIYXNBbnksIGFuZCBSZXZva2VBbGwg4oCUIGFuZCB0aGlzIGNlaWxpbmcgaXMgd2hhdCBib3VuZHMKLy8gdGhlbS4gRXZlcnl0aGluZyBlbHNlIGlzIGxvZ2FyaXRobWljIG9yIHBhZ2luYXRlZDsgc2VlIGVhY2ggbWV0aG9kJ3Mgb3duCi8vIGRvYyBmb3IgaXRzIGNvc3QsIHdoaWNoIGlzIGF1dGhvcml0YXRpdmUuCi8vCi8vIEluIHBhcnRpY3VsYXIgSGFzQW55IGlzIE5PVCBhIGNoZWFwIHZhcmlhbnQgb2YgSGFzLiBIYXMgaXMgdHdvIHRyZWUKLy8gZGVzY2VudHM7IEhhc0FueSBpcyBhIGZ1bGwgd2FsayBvZiB0aGUgcmVnaXN0cnkuIERvIG5vdCBwdXQgSGFzQW55IG9uIGEKLy8gaG90IGF1dGhvcml6YXRpb24gcGF0aCBvciBpbnNpZGUgYSBwZXItaXRlbSByZW5kZXIgbG9vcC4KLy8KLy8gVGhlc2UgY2VpbGluZ3MgYXJlIG5vdCB0aGUgb2JqZWN0aW9uIHRoaXMgcGFja2FnZSByYWlzZXMgYWdhaW5zdCBhIHNoYXJlZAovLyByZWdpc3RyeS4gQSBzaGFyZWQgcmVnaXN0cnkncyBjYXBzIGFyZSByaXZhbHJvdXMgYW5kIHVucmFpc2FibGUgYmVjYXVzZQovLyBvbmUgaW1tdXRhYmxlIHJlYWxtIGhvbGRzIGV2ZXJ5IHRlbmFudCdzIHN0YXRlOyBoZXJlIGEgY29uc3VtZXIgdGhhdCBuZWVkcwovLyBtb3JlIHNpbXBseSBhbGxvY2F0ZXMgYW5vdGhlciBCb29rIGluIGl0cyBvd24gcmVhbG0sIGF0IG5vIGNvc3QgdG8gYW55b25lCi8vIGVsc2UuCmNvbnN0ICgKCU1heFBlcm1pc3Npb25zQ2VpbGluZyA9IDI1NgoJTWF4SG9sZGVyc0NlaWxpbmcgICAgID0gMTAwMDAKCU1heE5hbWVMZW5DZWlsaW5nICAgICA9IDY0CikKCi8vIERlZmF1bHQgbGltaXRzLCB1c2VkIGJ5IE5ld0RlZmF1bHQuCmNvbnN0ICgKCURlZmF1bHRNYXhQZXJtaXNzaW9ucyAgICAgICAgICA9IDY0CglEZWZhdWx0TWF4SG9sZGVyc1BlclBlcm1pc3Npb24gPSAxMDI0CglEZWZhdWx0TWF4TmFtZUxlbiAgICAgICAgICAgICAgPSAzMgopCgp2YXIgKAoJRXJyVW5hdXRob3JpemVkICAgICAgPSBlcnJvcnMuTmV3KCJwZXJtYm9vazogY2FsbGVyIGlzIG5vdCB0aGUgYWRtaW4iKQoJRXJyTm90TGl2ZVJlYWxtICAgICAgPSBlcnJvcnMuTmV3KCJwZXJtYm9vazogcmxtIGlzIG5vdCB0aGUgY2FsbGVyJ3MgbGl2ZSBjdXIiKQoJRXJySW52YWxpZEFkZHJlc3MgICAgPSBlcnJvcnMuTmV3KCJwZXJtYm9vazogaW52YWxpZCBhZGRyZXNzIikKCUVyckludmFsaWROYW1lICAgICAgID0gZXJyb3JzLk5ldygicGVybWJvb2s6IHBlcm1pc3Npb24gbmFtZSBtdXN0IGJlIDEuLk1heE5hbWVMZW4gY2hhcnMsIGxvd2VyY2FzZSBhbHBoYW51bWVyaWMgYW5kIHVuZGVyc2NvcmUgb25seSIpCglFcnJJbnZhbGlkTGltaXRzICAgICA9IGVycm9ycy5OZXcoInBlcm1ib29rOiBsaW1pdHMgbXVzdCBiZSBwb3NpdGl2ZSBhbmQgd2l0aGluIHRoZSBwYWNrYWdlIGNlaWxpbmdzIikKCUVyckFscmVhZHlHcmFudGVkICAgID0gZXJyb3JzLk5ldygicGVybWJvb2s6IGFkZHJlc3MgYWxyZWFkeSBob2xkcyB0aGlzIHBlcm1pc3Npb24iKQoJRXJyTm90R3JhbnRlZCAgICAgICAgPSBlcnJvcnMuTmV3KCJwZXJtYm9vazogYWRkcmVzcyBkb2VzIG5vdCBob2xkIHRoaXMgcGVybWlzc2lvbiIpCglFcnJQZXJtaXNzaW9uTGltaXQgICA9IGVycm9ycy5OZXcoInBlcm1ib29rOiBwZXJtaXNzaW9uIGxpbWl0IHJlYWNoZWQgZm9yIHRoaXMgYm9vayIpCglFcnJIb2xkZXJMaW1pdCAgICAgICA9IGVycm9ycy5OZXcoInBlcm1ib29rOiBob2xkZXIgbGltaXQgcmVhY2hlZCBmb3IgdGhpcyBwZXJtaXNzaW9uIikKCUVyck5vUGVuZGluZ0FkbWluICAgID0gZXJyb3JzLk5ldygicGVybWJvb2s6IG5vIHBlbmRpbmcgYWRtaW4gbm9taW5hdGlvbiIpCglFcnJOb3RQZW5kaW5nQWRtaW4gICA9IGVycm9ycy5OZXcoInBlcm1ib29rOiBjYWxsZXIgaXMgbm90IHRoZSBwZW5kaW5nIGFkbWluIikKCUVyclNhbWVBZG1pbiAgICAgICAgID0gZXJyb3JzLk5ldygicGVybWJvb2s6IG5vbWluZWUgaXMgYWxyZWFkeSB0aGUgYWRtaW4iKQoJRXJyVW5rbm93blBlcm1pc3Npb24gPSBlcnJvcnMuTmV3KCJwZXJtYm9vazogbm8gc3VjaCBwZXJtaXNzaW9uIikKKQoKLy8gTGltaXRzIGFyZSBmaXhlZCBhdCBjb25zdHJ1Y3Rpb24gYW5kIG5ldmVyIGNoYW5nZSBmb3IgdGhlIGxpZmUgb2YgYSBCb29rLgp0eXBlIExpbWl0cyBzdHJ1Y3QgewoJLy8gTWF4UGVybWlzc2lvbnMgYm91bmRzIGhvdyBtYW55IGRpc3RpbmN0IHBlcm1pc3Npb24gbmFtZXMgbWF5IGV4aXN0IGF0CgkvLyBvbmNlLiBCZWNhdXNlIFBlcm1pc3Npb25zIGFuZCBSZXZva2VBbGwgd2FsayBhbGwgb2YgdGhlbSwgdGhpcyBib3VuZHMKCS8vIGdhcywgbm90IGp1c3Qgc3RvcmFnZS4KCU1heFBlcm1pc3Npb25zIGludAoKCS8vIE1heEhvbGRlcnNQZXJQZXJtaXNzaW9uIGJvdW5kcyBob3cgbWFueSBhZGRyZXNzZXMgbWF5IGhvbGQgYW55IG9uZQoJLy8gcGVybWlzc2lvbi4gTm8gb3BlcmF0aW9uIGl0ZXJhdGVzIGhvbGRlcnMgdW5wYWdpbmF0ZWQsIHNvIHRoaXMgYm91bmRzCgkvLyBzdG9yYWdlIHJhdGhlciB0aGFuIGdhcy4KCU1heEhvbGRlcnNQZXJQZXJtaXNzaW9uIGludAoKCS8vIE1heE5hbWVMZW4gYm91bmRzIHBlcm1pc3Npb24tbmFtZSBsZW5ndGguCglNYXhOYW1lTGVuIGludAp9CgovLyBEZWZhdWx0TGltaXRzIHJldHVybnMgdGhlIGxpbWl0cyB1c2VkIGJ5IE5ld0RlZmF1bHQuCmZ1bmMgRGVmYXVsdExpbWl0cygpIExpbWl0cyB7CglyZXR1cm4gTGltaXRzewoJCU1heFBlcm1pc3Npb25zOiAgICAgICAgICBEZWZhdWx0TWF4UGVybWlzc2lvbnMsCgkJTWF4SG9sZGVyc1BlclBlcm1pc3Npb246IERlZmF1bHRNYXhIb2xkZXJzUGVyUGVybWlzc2lvbiwKCQlNYXhOYW1lTGVuOiAgICAgICAgICAgICAgRGVmYXVsdE1heE5hbWVMZW4sCgl9Cn0KCmZ1bmMgKGwgTGltaXRzKSB2YWxpZCgpIGJvb2wgewoJcmV0dXJuIGwuTWF4UGVybWlzc2lvbnMgPiAwICYmIGwuTWF4UGVybWlzc2lvbnMgPD0gTWF4UGVybWlzc2lvbnNDZWlsaW5nICYmCgkJbC5NYXhIb2xkZXJzUGVyUGVybWlzc2lvbiA+IDAgJiYgbC5NYXhIb2xkZXJzUGVyUGVybWlzc2lvbiA8PSBNYXhIb2xkZXJzQ2VpbGluZyAmJgoJCWwuTWF4TmFtZUxlbiA+IDAgJiYgbC5NYXhOYW1lTGVuIDw9IE1heE5hbWVMZW5DZWlsaW5nCn0KCi8vIEJvb2sgaXMgYSBib3VuZGVkIHNldCBvZiBuYW1lZCBwZXJtaXNzaW9ucyB3aXRoIGFuIGFkbWluLiBUaGUgemVybyB2YWx1ZQovLyBpcyBub3QgdXNhYmxlOyBjb25zdHJ1Y3Qgd2l0aCBOZXcgb3IgTmV3RGVmYXVsdC4KLy8KLy8gU0VDVVJJVFk6IGtlZXAgYSAqQm9vayBpbiBhbiB1bmV4cG9ydGVkIHZhcmlhYmxlLiBJdCBpcyB0aGUgY2FwYWJpbGl0eS4KLy8gRXZlcnkgbXV0YXRvciBvbiBpdCBpcyBnYXRlZCBvbiB0aGUgYWRtaW4sIGJ1dCBhIHJlYWxtIHRoYXQgcmVjZWl2ZXMgdGhlCi8vIHBvaW50ZXIgaXRzZWxmIGNhbiBpbnZva2UgdGhvc2UgbXV0YXRvcnMsIGFuZCBib3Jyb3cgcnVsZSAjMiBjb21taXRzIHRoZQovLyB3cml0ZXMgdW5kZXIgdGhlIEFMTE9DQVRJTkcgcmVhbG0ncyBhdXRob3JpdHkuCnR5cGUgQm9vayBzdHJ1Y3QgewoJZyAgICAgICAgICAgICpncm91cHMuR3JvdXAKCWFkbWluICAgICAgICBhZGRyZXNzCglwZW5kaW5nQWRtaW4gYWRkcmVzcwoJbGltICAgICAgICAgIExpbWl0cwp9CgovLyBOZXcgY29uc3RydWN0cyBhbiBlbXB0eSBCb29rIG93bmVkIGJ5IGFkbWluLCB3aXRoIGV4cGxpY2l0IGxpbWl0cy4KZnVuYyBOZXcoYWRtaW4gYWRkcmVzcywgbGltIExpbWl0cykgKCpCb29rLCBlcnJvcikgewoJaWYgIWFkbWluLklzVmFsaWQoKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZEFkZHJlc3MKCX0KCWlmICFsaW0udmFsaWQoKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZExpbWl0cwoJfQoJcmV0dXJuICZCb29rewoJCWc6ICAgICBncm91cHMuTmV3R3JvdXAoKSwKCQlhZG1pbjogYWRtaW4sCgkJbGltOiAgIGxpbSwKCX0sIG5pbAp9CgovLyBOZXdEZWZhdWx0IGNvbnN0cnVjdHMgYW4gZW1wdHkgQm9vayBvd25lZCBieSBhZG1pbiwgd2l0aCBEZWZhdWx0TGltaXRzLgpmdW5jIE5ld0RlZmF1bHQoYWRtaW4gYWRkcmVzcykgKCpCb29rLCBlcnJvcikgewoJcmV0dXJuIE5ldyhhZG1pbiwgRGVmYXVsdExpbWl0cygpKQp9CgovLyAtLS0gYXV0aG9yaXphdGlvbiAtLS0KCi8vIHByaW5jaXBhbCByZXR1cm5zIHRoZSBhZGRyZXNzIHRoYXQgY3Jvc3NlZCBpbnRvIHRoZSBjYWxsZXIncyByZWFsbSwgYWZ0ZXIKLy8gcHJvdmluZyBybG0gaXMgYSBsaXZlIGNyb3NzaW5nIGZyYW1lIHJhdGhlciB0aGFuIGEgc3Rhc2hlZCB2YWx1ZS4KZnVuYyBwcmluY2lwYWwoXyBpbnQsIHJsbSByZWFsbSkgKGFkZHJlc3MsIGVycm9yKSB7CglpZiAhcmxtLklzQ3VycmVudCgpIHsKCQlyZXR1cm4gYWRkcmVzcygiIiksIEVyck5vdExpdmVSZWFsbQoJfQoJcmV0dXJuIHJsbS5QcmV2aW91cygpLkFkZHJlc3MoKSwgbmlsCn0KCi8vIGFzc2VydEFkbWluIHJlc29sdmVzIHRoZSBwcmluY2lwYWwgZnJvbSBybG0gYW5kIHJlcXVpcmVzIGl0IHRvIGJlIHRoZQovLyBib29rJ3MgYWRtaW4uCmZ1bmMgKGIgKkJvb2spIGFzc2VydEFkbWluKF8gaW50LCBybG0gcmVhbG0pIGVycm9yIHsKCXdobywgZXJyIDo9IHByaW5jaXBhbCgwLCBybG0pCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglpZiB3aG8gIT0gYi5hZG1pbiB7CgkJcmV0dXJuIEVyclVuYXV0aG9yaXplZAoJfQoJcmV0dXJuIG5pbAp9CgovLyAtLS0gZ3JhbnQgYW5kIHJldm9rZSAtLS0KCi8vIEdyYW50IGdpdmVzIGFkZHIgdGhlIG5hbWVkIHBlcm1pc3Npb24uIEFkbWluIG9ubHkuCi8vCi8vIFRoZSBwZXJtaXNzaW9uIGlzIGNyZWF0ZWQgaWYgaXQgZG9lcyBub3QgZXhpc3QuIEdyYW50aW5nIGEgcGVybWlzc2lvbiB0aGUKLy8gYWRkcmVzcyBhbHJlYWR5IGhvbGRzIHJldHVybnMgRXJyQWxyZWFkeUdyYW50ZWQgcmF0aGVyIHRoYW4gc2lsZW50bHkKLy8gc3VjY2VlZGluZywgc28gYSBjb25zdW1lciBjYW5ub3QgbWlzdGFrZSBhIG5vLW9wIGZvciBhIHN0YXRlIGNoYW5nZS4KZnVuYyAoYiAqQm9vaykgR3JhbnQoXyBpbnQsIHJsbSByZWFsbSwgcGVybSBzdHJpbmcsIGFkZHIgYWRkcmVzcykgZXJyb3IgewoJaWYgZXJyIDo9IGIuYXNzZXJ0QWRtaW4oMCwgcmxtKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoJaWYgIWIudmFsaWROYW1lKHBlcm0pIHsKCQlyZXR1cm4gRXJySW52YWxpZE5hbWUKCX0KCWlmICFhZGRyLklzVmFsaWQoKSB7CgkJcmV0dXJuIEVyckludmFsaWRBZGRyZXNzCgl9CgoJciwgZm91bmQgOj0gYi5nLkdldFJvbGUocGVybSkKCWlmICFmb3VuZCB7CgkJaWYgYi5nLlJvbGVDb3VudCgpID49IGIubGltLk1heFBlcm1pc3Npb25zIHsKCQkJcmV0dXJuIEVyclBlcm1pc3Npb25MaW1pdAoJCX0KCQl2YXIgZXJyIGVycm9yCgkJciwgZXJyID0gYi5nLkFkZFJvbGUocGVybSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuIGVycgoJCX0KCX0KCgltZW1iZXJzIDo9IHIuTWVtYmVycygpCglpZiBtZW1iZXJzLkhhcyhhZGRyKSB7CgkJcmV0dXJuIEVyckFscmVhZHlHcmFudGVkCgl9CglpZiBtZW1iZXJzLlNpemUoKSA+PSBiLmxpbS5NYXhIb2xkZXJzUGVyUGVybWlzc2lvbiB7CgkJLy8gTm8gcm9sbGJhY2sgaXMgbmVlZGVkIGhlcmUsIGFuZCBhZGRpbmcgb25lIHdvdWxkIGJlIGRlYWQgY29kZS4KCQkvLwoJCS8vIFJlYWNoaW5nIHRoaXMgYnJhbmNoIHJlcXVpcmVzIFNpemUoKSA+PSBNYXhIb2xkZXJzUGVyUGVybWlzc2lvbiwKCQkvLyBhbmQgTGltaXRzLnZhbGlkIGd1YXJhbnRlZXMgTWF4SG9sZGVyc1BlclBlcm1pc3Npb24gPj0gMSwgc28KCQkvLyBTaXplKCkgPj0gMS4gQSBwZXJtaXNzaW9uIGNyZWF0ZWQgbW9tZW50cyBhZ28gYWJvdmUgaGFzIFNpemUoKSAwCgkJLy8gYW5kIHRoZXJlZm9yZSBjYW5ub3QgcmVhY2ggdGhpcyBicmFuY2ggYXQgYWxsLiBTbyB0aGUgcGVybWlzc2lvbgoJCS8vIHRoaXMgcmVqZWN0cyBhbHdheXMgcHJlLWV4aXN0ZWQgd2l0aCBob2xkZXJzLCBhbmQgcmV0dXJuaW5nIGxlYXZlcwoJCS8vIG5vIG9ycGhhbiBlbXB0eSBidWNrZXQgb2NjdXB5aW5nIGEgTWF4UGVybWlzc2lvbnMgc2xvdC4KCQkvLwoJCS8vIFRoYXQgYXJndW1lbnQgZGVwZW5kcyBvbiBMaW1pdHMudmFsaWQgcmVqZWN0aW5nIGEgemVybyBob2xkZXIKCQkvLyBsaW1pdC4gSWYgdGhhdCBldmVyIGNoYW5nZXMsIHRoaXMgYnJhbmNoIG5lZWRzIGFuIHVuZG8uCgkJcmV0dXJuIEVyckhvbGRlckxpbWl0Cgl9CgoJbWVtYmVycy5BZGQoYWRkcikKCXJldHVybiBuaWwKfQoKLy8gUmV2b2tlIHJlbW92ZXMgdGhlIG5hbWVkIHBlcm1pc3Npb24gZnJvbSBhZGRyLiBBZG1pbiBvbmx5LgovLwovLyBSZXZva2luZyB0aGUgbGFzdCBob2xkZXIgcmVtb3ZlcyB0aGUgcGVybWlzc2lvbiBpdHNlbGYsIGZyZWVpbmcgaXRzIHNsb3QKLy8gYWdhaW5zdCBNYXhQZXJtaXNzaW9ucy4gSGFzIHJlcG9ydHMgZmFsc2UgZWl0aGVyIHdheSwgc28gdGhpcyBpcyBpbnZpc2libGUKLy8gdG8gYSBjYWxsZXIgYW5kIGtlZXBzIHRoZSBib29rIGZyb20gYWNjdW11bGF0aW5nIGVtcHR5IGJ1Y2tldHMuCmZ1bmMgKGIgKkJvb2spIFJldm9rZShfIGludCwgcmxtIHJlYWxtLCBwZXJtIHN0cmluZywgYWRkciBhZGRyZXNzKSBlcnJvciB7CglpZiBlcnIgOj0gYi5hc3NlcnRBZG1pbigwLCBybG0pOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglpZiAhYi5yZXZva2VPbmUocGVybSwgYWRkcikgewoJCXJldHVybiBFcnJOb3RHcmFudGVkCgl9CglyZXR1cm4gbmlsCn0KCi8vIHJldm9rZU9uZSByZW1vdmVzIGFkZHIgZnJvbSBwZXJtIGFuZCBwcnVuZXMgdGhlIHBlcm1pc3Npb24gaWYgaXQgaXMgbGVmdAovLyBlbXB0eS4gUmVwb3J0cyB3aGV0aGVyIGFkZHIgYWN0dWFsbHkgaGVsZCBpdC4gTm8gYXV0aG9yaXphdGlvbjogZXZlcnkKLy8gY2FsbGVyIGlzIGluc2lkZSB0aGlzIHBhY2thZ2UgYW5kIGhhcyBhbHJlYWR5IGdhdGVkIG9uIHRoZSBhZG1pbi4KZnVuYyAoYiAqQm9vaykgcmV2b2tlT25lKHBlcm0gc3RyaW5nLCBhZGRyIGFkZHJlc3MpIGJvb2wgewoJciwgZm91bmQgOj0gYi5nLkdldFJvbGUocGVybSkKCWlmICFmb3VuZCB7CgkJcmV0dXJuIGZhbHNlCgl9CgltZW1iZXJzIDo9IHIuTWVtYmVycygpCglpZiAhbWVtYmVycy5SZW1vdmUoYWRkcikgewoJCXJldHVybiBmYWxzZQoJfQoJaWYgbWVtYmVycy5TaXplKCkgPT0gMCB7CgkJYi5nLlJlbW92ZVJvbGUocGVybSkKCX0KCXJldHVybiB0cnVlCn0KCi8vIFJldm9rZUFsbCByZW1vdmVzIGFkZHIgZnJvbSBldmVyeSBwZXJtaXNzaW9uIGluIHRoZSBib29rIGFuZCByZXBvcnRzIGhvdwovLyBtYW55IHdlcmUgcmVtb3ZlZC4gQWRtaW4gb25seS4KLy8KLy8gQ29zdCBpcyBPKFAgbG9nIEgpIGluIHRoZSBib29rJ3MgcGVybWlzc2lvbiBjb3VudCDigJQgYm91bmRlZCBieQovLyBNYXhQZXJtaXNzaW9ucywgd2hpY2ggaXMgd2h5IHRoYXQgbGltaXQgaGFzIGEgY2VpbGluZy4KLy8KLy8gSW1wbGVtZW50YXRpb24gbm90ZTogdGhlIHBlcm1pc3Npb24gbmFtZXMgYXJlIGNvbGxlY3RlZCBGSVJTVCwgaW50byBhCi8vIHZhbHVlIHNsaWNlLCBhbmQgdGhlIHJlZ2lzdHJ5IGlzIG11dGF0ZWQgb25seSBhZnRlciB0aGF0IHdhbGsgcmV0dXJucy4KLy8gZ3JvdXBzIGRvY3VtZW50cyB0aGF0IG11dGF0aW5nIHRoZSByb2xlIHJlZ2lzdHJ5IG1pZC1pdGVyYXRpb24gY2FuIHBhbmljCi8vIGFuZCBhYm9ydCB0aGUgdHJhbnNhY3Rpb24uCmZ1bmMgKGIgKkJvb2spIFJldm9rZUFsbChfIGludCwgcmxtIHJlYWxtLCBhZGRyIGFkZHJlc3MpIChpbnQsIGVycm9yKSB7CglpZiBlcnIgOj0gYi5hc3NlcnRBZG1pbigwLCBybG0pOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CgluYW1lcyA6PSBiLmcuUm9sZXNDb250YWluaW5nKGFkZHIpCgluIDo9IDAKCWZvciBfLCBwZXJtIDo9IHJhbmdlIG5hbWVzIHsKCQlpZiBiLnJldm9rZU9uZShwZXJtLCBhZGRyKSB7CgkJCW4rKwoJCX0KCX0KCXJldHVybiBuLCBuaWwKfQoKLy8gRHJvcFBlcm1pc3Npb24gcmVtb3ZlcyBhIHBlcm1pc3Npb24gYW5kIGV2ZXJ5IGdyYW50IG9mIGl0LiBBZG1pbiBvbmx5LgovLwovLyBDb3N0IGlzIE8obG9nIFApOiBncm91cHMgZGlzY2FyZHMgdGhlIHdob2xlIG1lbWJlciBzZXQgd2l0aCB0aGUgcm9sZSBhbmQKLy8gZG9lcyBub3Qgd2FsayBpdCwgc28gdGhpcyBpcyBzYWZlIGZvciBhIHBlcm1pc3Npb24gd2l0aCBtYW55IGhvbGRlcnMuCmZ1bmMgKGIgKkJvb2spIERyb3BQZXJtaXNzaW9uKF8gaW50LCBybG0gcmVhbG0sIHBlcm0gc3RyaW5nKSBlcnJvciB7CglpZiBlcnIgOj0gYi5hc3NlcnRBZG1pbigwLCBybG0pOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gZXJyCgl9CglpZiAhYi5nLlJlbW92ZVJvbGUocGVybSkgewoJCXJldHVybiBFcnJVbmtub3duUGVybWlzc2lvbgoJfQoJcmV0dXJuIG5pbAp9CgovLyAtLS0gYWRtaW4gaGFuZG9mZiAtLS0KCi8vIE5vbWluYXRlQWRtaW4gcmVjb3JkcyBhIG5vbWluZWUgZm9yIHRoZSBhZG1pbiByb2xlLiBBZG1pbiBvbmx5LiBUaGUKLy8gaGFuZG9mZiBkb2VzIE5PVCB0YWtlIGVmZmVjdCB1bnRpbCB0aGUgbm9taW5lZSBjYWxscyBBY2NlcHRBZG1pbiwgYW5kIGEKLy8gbm9taW5hdGlvbiBtYXkgYmUgd2l0aGRyYXduIHdpdGggQ2FuY2VsTm9taW5hdGlvbiB1bnRpbCB0aGVuLgpmdW5jIChiICpCb29rKSBOb21pbmF0ZUFkbWluKF8gaW50LCBybG0gcmVhbG0sIG5vbWluZWUgYWRkcmVzcykgZXJyb3IgewoJaWYgZXJyIDo9IGIuYXNzZXJ0QWRtaW4oMCwgcmxtKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoJaWYgIW5vbWluZWUuSXNWYWxpZCgpIHsKCQlyZXR1cm4gRXJySW52YWxpZEFkZHJlc3MKCX0KCWlmIG5vbWluZWUgPT0gYi5hZG1pbiB7CgkJcmV0dXJuIEVyclNhbWVBZG1pbgoJfQoJYi5wZW5kaW5nQWRtaW4gPSBub21pbmVlCglyZXR1cm4gbmlsCn0KCi8vIENhbmNlbE5vbWluYXRpb24gd2l0aGRyYXdzIGEgcGVuZGluZyBub21pbmF0aW9uLiBBZG1pbiBvbmx5LgpmdW5jIChiICpCb29rKSBDYW5jZWxOb21pbmF0aW9uKF8gaW50LCBybG0gcmVhbG0pIGVycm9yIHsKCWlmIGVyciA6PSBiLmFzc2VydEFkbWluKDAsIHJsbSk7IGVyciAhPSBuaWwgewoJCXJldHVybiBlcnIKCX0KCWlmIGIucGVuZGluZ0FkbWluID09IGFkZHJlc3MoIiIpIHsKCQlyZXR1cm4gRXJyTm9QZW5kaW5nQWRtaW4KCX0KCWIucGVuZGluZ0FkbWluID0gYWRkcmVzcygiIikKCXJldHVybiBuaWwKfQoKLy8gQWNjZXB0QWRtaW4gY29tcGxldGVzIGEgcGVuZGluZyBoYW5kb2ZmLiBPbmx5IHRoZSBub21pbmVlIG1heSBjYWxsIGl0LgpmdW5jIChiICpCb29rKSBBY2NlcHRBZG1pbihfIGludCwgcmxtIHJlYWxtKSBlcnJvciB7Cgl3aG8sIGVyciA6PSBwcmluY2lwYWwoMCwgcmxtKQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoJaWYgYi5wZW5kaW5nQWRtaW4gPT0gYWRkcmVzcygiIikgewoJCXJldHVybiBFcnJOb1BlbmRpbmdBZG1pbgoJfQoJaWYgd2hvICE9IGIucGVuZGluZ0FkbWluIHsKCQlyZXR1cm4gRXJyTm90UGVuZGluZ0FkbWluCgl9CgliLmFkbWluID0gd2hvCgliLnBlbmRpbmdBZG1pbiA9IGFkZHJlc3MoIiIpCglyZXR1cm4gbmlsCn0KCi8vIC0tLSBxdWVyaWVzIC0tLQovLwovLyBRdWVyaWVzIHBlcmZvcm0gTk8gY2FsbGVyIGF1dGhlbnRpY2F0aW9uLiBUaGV5IGFuc3dlciBxdWVzdGlvbnMgYWJvdXQgYW4KLy8gYWRkcmVzcywgbm90IGFib3V0IHlvdXIgY2FsbGVyLiBTZWUgY29uc3VtZXItY29udHJhY3QgY2xhdXNlIDMuCgovLyBIYXMgcmVwb3J0cyB3aGV0aGVyIGFkZHIgY3VycmVudGx5IGhvbGRzIHRoZSBuYW1lZCBwZXJtaXNzaW9uLgovLwovLyBUd28gQistdHJlZSBkZXNjZW50cywgTyhsb2cgUCArIGxvZyBIKS4gSW5kZXBlbmRlbnQgb2YgaG93IG1hbnkgb3RoZXIKLy8gcGVybWlzc2lvbnMgYWRkciBob2xkcy4gTmV2ZXIgcGFuaWNzOyB1bmtub3duIHBlcm1pc3Npb25zIHJlcG9ydCBmYWxzZS4KZnVuYyAoYiAqQm9vaykgSGFzKHBlcm0gc3RyaW5nLCBhZGRyIGFkZHJlc3MpIGJvb2wgewoJciwgZm91bmQgOj0gYi5nLkdldFJvbGUocGVybSkKCWlmICFmb3VuZCB7CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gci5NZW1iZXJzKCkuSGFzKGFkZHIpCn0KCi8vIEhhc0FueSByZXBvcnRzIHdoZXRoZXIgYWRkciBob2xkcyBhbnkgcGVybWlzc2lvbiBhdCBhbGwuIE8oUCBsb2cgSCkuCmZ1bmMgKGIgKkJvb2spIEhhc0FueShhZGRyIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIGIuZy5IYXNBbnkoYWRkcikKfQoKLy8gUGVybWlzc2lvbnMgcmV0dXJucyB0aGUgbmFtZXMgYWRkciBob2xkcywgaW4gbGV4aWNvZ3JhcGhpYyBvcmRlciwgb3IgbmlsLgovLyBPKFAgbG9nIEgpIOKAlCBib3VuZGVkIGJ5IE1heFBlcm1pc3Npb25zLgpmdW5jIChiICpCb29rKSBQZXJtaXNzaW9ucyhhZGRyIGFkZHJlc3MpIFtdc3RyaW5nIHsKCXJldHVybiBiLmcuUm9sZXNDb250YWluaW5nKGFkZHIpCn0KCi8vIFBlcm1pc3Npb25Db3VudCByZXR1cm5zIGhvdyBtYW55IGRpc3RpbmN0IHBlcm1pc3Npb25zIGN1cnJlbnRseSBleGlzdC4KZnVuYyAoYiAqQm9vaykgUGVybWlzc2lvbkNvdW50KCkgaW50IHsKCXJldHVybiBiLmcuUm9sZUNvdW50KCkKfQoKLy8gUGVybWlzc2lvbk5hbWVzIHJldHVybnMgdXAgdG8gY291bnQgcGVybWlzc2lvbiBuYW1lcyBpbiBsZXhpY29ncmFwaGljCi8vIG9yZGVyLCBzdGFydGluZyBhdCBvZmZzZXQuIFBhZ2luYXRlZCBzbyB0aGUgY2FsbGVyLCBub3QgdGhlIGJvb2ssIGNob29zZXMKLy8gaG93IG11Y2ggd29yayBhIHNpbmdsZSBjYWxsIGRvZXMuCmZ1bmMgKGIgKkJvb2spIFBlcm1pc3Npb25OYW1lcyhvZmZzZXQsIGNvdW50IGludCkgW11zdHJpbmcgewoJaWYgY291bnQgPD0gMCB7CgkJcmV0dXJuIG5pbAoJfQoJdmFyIG91dCBbXXN0cmluZwoJYi5nLkl0ZXJhdGVSb2xlcyhvZmZzZXQsIGNvdW50LCBmdW5jKHJyICpncm91cHMuUmVhZG9ubHlSb2xlKSBib29sIHsKCQlvdXQgPSBhcHBlbmQob3V0LCByci5OYW1lKCkpCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIG91dAp9CgovLyBIb2xkZXJDb3VudCByZXR1cm5zIGhvdyBtYW55IGFkZHJlc3NlcyBob2xkIHRoZSBuYW1lZCBwZXJtaXNzaW9uLCBvciAwIGlmCi8vIGl0IGRvZXMgbm90IGV4aXN0LgpmdW5jIChiICpCb29rKSBIb2xkZXJDb3VudChwZXJtIHN0cmluZykgaW50IHsKCXIsIGZvdW5kIDo9IGIuZy5HZXRSb2xlKHBlcm0pCglpZiAhZm91bmQgewoJCXJldHVybiAwCgl9CglyZXR1cm4gci5NZW1iZXJzKCkuU2l6ZSgpCn0KCi8vIEhvbGRlcnMgcmV0dXJucyB1cCB0byBjb3VudCBob2xkZXJzIG9mIHRoZSBuYW1lZCBwZXJtaXNzaW9uLCBpbiBzb3J0ZWQKLy8gb3JkZXIsIHN0YXJ0aW5nIGF0IG9mZnNldC4gUGFnaW5hdGVkIGZvciB0aGUgc2FtZSByZWFzb24gYXMKLy8gUGVybWlzc2lvbk5hbWVzLiBSZXR1cm5zIG5pbCBmb3IgYW4gdW5rbm93biBwZXJtaXNzaW9uLgpmdW5jIChiICpCb29rKSBIb2xkZXJzKHBlcm0gc3RyaW5nLCBvZmZzZXQsIGNvdW50IGludCkgW11hZGRyZXNzIHsKCWlmIGNvdW50IDw9IDAgewoJCXJldHVybiBuaWwKCX0KCXIsIGZvdW5kIDo9IGIuZy5HZXRSb2xlKHBlcm0pCglpZiAhZm91bmQgewoJCXJldHVybiBuaWwKCX0KCXZhciBvdXQgW11hZGRyZXNzCglyLk1lbWJlcnMoKS5JdGVyYXRlQnlPZmZzZXQob2Zmc2V0LCBjb3VudCwgZnVuYyhhIGFkZHJlc3MpIGJvb2wgewoJCW91dCA9IGFwcGVuZChvdXQsIGEpCgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIG91dAp9CgovLyBBZG1pbiByZXR1cm5zIHRoZSBib29rJ3MgY3VycmVudCBhZG1pbi4KZnVuYyAoYiAqQm9vaykgQWRtaW4oKSBhZGRyZXNzIHsKCXJldHVybiBiLmFkbWluCn0KCi8vIFBlbmRpbmdBZG1pbiByZXR1cm5zIHRoZSBub21pbmF0ZWQtYnV0LW5vdC15ZXQtYWNjZXB0ZWQgYWRtaW4sIG9yIHRoZQovLyBlbXB0eSBhZGRyZXNzIGlmIHRoZXJlIGlzIG5vIHBlbmRpbmcgbm9taW5hdGlvbi4KZnVuYyAoYiAqQm9vaykgUGVuZGluZ0FkbWluKCkgYWRkcmVzcyB7CglyZXR1cm4gYi5wZW5kaW5nQWRtaW4KfQoKLy8gSXNBZG1pbiByZXBvcnRzIHdoZXRoZXIgYWRkciBpcyB0aGUgYm9vaydzIGFkbWluLgpmdW5jIChiICpCb29rKSBJc0FkbWluKGFkZHIgYWRkcmVzcykgYm9vbCB7CglyZXR1cm4gYWRkciA9PSBiLmFkbWluCn0KCi8vIExpbWl0cyByZXR1cm5zIHRoZSBib29rJ3MgZml4ZWQgbGltaXRzLgpmdW5jIChiICpCb29rKSBMaW1pdHMoKSBMaW1pdHMgewoJcmV0dXJuIGIubGltCn0KCi8vIC0tLSBuYW1lcyAtLS0KCi8vIHZhbGlkTmFtZSByZXN0cmljdHMgcGVybWlzc2lvbiBuYW1lcyB0byBsb3dlcmNhc2UgYWxwaGFudW1lcmljcyBhbmQKLy8gdW5kZXJzY29yZXMsIHdpdGhpbiB0aGUgYm9vaydzIE1heE5hbWVMZW4uCi8vCi8vIEJleW9uZCBoeWdpZW5lIHRoaXMgaXMgYSBzZWN1cml0eSBwcm9wZXJ0eTogcGVybWlzc2lvbiBuYW1lcyBlbmQgdXAgaW4KLy8gY29tcG9zaXRlIHRydXN0IGRlY2lzaW9ucyBhbmQgaW4gcmVuZGVyZWQgb3V0cHV0LCBzbyBubyBkZWxpbWl0ZXIsCi8vIHdoaXRlc3BhY2UsIG9yIG1hcmtkb3duIGNoYXJhY3RlciBtYXkgZW50ZXIgb25lLgpmdW5jIChiICpCb29rKSB2YWxpZE5hbWUobmFtZSBzdHJpbmcpIGJvb2wgewoJaWYgbmFtZSA9PSAiIiB8fCBsZW4obmFtZSkgPiBiLmxpbS5NYXhOYW1lTGVuIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWZvciBfLCBjIDo9IHJhbmdlIG5hbWUgewoJCWlmICEoKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IGMgPT0gJ18nKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KIg0xMDAwMDAwMHVnbm90EhIIoKrcMRILMTA0Mjc0dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQCbzjWUrvP0bWWAzhHkreVEgS3DhaJP+fbh0TUMdKzoVWz9DbV1qxwI2vkO3jbadyG79XeTCuSuFen/zab6iG80aKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}