{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "n+DQa6tbC1LJjAjnQgtduCkvu9PL6K0ozh3LKw063DM=",
    "height": "488838",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "47571475",
      "GasUsed": "31714307"
    },
    "tx": "CtC0AQoML3ZtLm1fYWRkcGtnEr60AQooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxKBtAEKB2F1Y3Rpb24SO2duby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9hdWN0aW9uGtOyAQoLYXVjdGlvbi5nbm8SwrIBLy8gUmVhbG0gYXVjdGlvbiBpcyBhbiBhc2NlbmRpbmcgKEVuZ2xpc2gpIGF1Y3Rpb24gc2V0dGxlZCBpbiB1Z25vdCwgaG9sZGluZwovLyByZWFsIGNvaW5zLiBBIFNFTExFUiBsaXN0cyBhIGxvdCB3aXRoIGEgcmVzZXJ2ZSBwcmljZSBhbmQgYSBkdXJhdGlvbjsKLy8gQklEREVSUyByYWlzZSBlYWNoIG90aGVyIGJ5IGF0dGFjaGluZyBjb2luczsgdGhlIHN0YW5kaW5nIGhpZ2ggYmlkIGlzCi8vIGVzY3Jvd2VkIGJ5IHRoZSByZWFsbSBhbmQgZXZlcnkgT1VUQklEIGJpZCBiZWNvbWVzIGEgcHVsbC1jbGFpbWFibGUgcmVmdW5kOwovLyBhdCBjbG9zZSB0aGUgd2lubmVyJ3MgcGF5bWVudCBpcyBjcmVkaXRlZCB0byB0aGUgc2VsbGVyLCB0aGUgcHJvdG9jb2wgZmVlCi8vIHNwbGl0dGluZyBvZmYgYXQgdGhlIGxlZGdlci4gQSBiaWQgbGFuZGluZyBpbnNpZGUgdGhlIGFudGktc25pcGUgd2luZG93Ci8vIGV4dGVuZHMgdGhlIGVuZCwgc28gdGhlIGF1Y3Rpb24gY2xvc2VzIG9ubHkgd2hlbiBiaWRkaW5nIGFjdHVhbGx5IHN0b3BzLgovLwovLyBJdCBpcyB0aGUgb25lIG1hcmtldCBzaGFwZSB0aGlzIHBvcnRmb2xpbyBuZXZlciBoYWQ6IENPTVBFVElUSVZFIFBSSUNFCi8vIERJU0NPVkVSWSB3aXRoIGVzY3Jvd2VkIHNldHRsZW1lbnQuIFRoZSByb3V0aW5nIHJlYWxtcyBtb3ZlIGEga25vd24gYW1vdW50Ci8vIHRvIGtub3duIHBhcnRpZXMgKHIvZmVlX3NwbGl0LCByL3JldnNoYXJlKSwgdGhlIGRpc2J1cnNlbWVudCByZWFsbXMgcGF5IGEKLy8ga25vd24gdG90YWwgb3V0IG9uIGEgc2NoZWR1bGUgKHIvdmVzdGluZywgci9wYXlyb2xsLCByL2J1ZGdldHMpLCB0aGUgY3JlZGl0Ci8vIHJlYWxtIGxlbmRzIHByaW5jaXBhbCBvdXQgYW5kIHRha2VzIGEgbGFyZ2VyIHRvdGFsIGJhY2sgKHIvbG9hbnMpLCBhbmQKLy8gci9jcm93ZGZ1bmQgUE9PTFMgbWFueSBjb250cmlidXRpb25zIHRvd2FyZCBvbmUgc2hhcmVkIGdvYWwuIEFuIGF1Y3Rpb24gaXMKLy8gbm9uZSBvZiB0aG9zZTogTiByaXZhbCBiaWRkZXJzLCBvbmUgZXNjcm93ZWQgd2lubmVyLCBhdXRvbWF0aWMgcmVmdW5kcyBmb3IKLy8gdGhlIHJlc3QsIGFuZCBhIHByaWNlIG5vYm9keSBrbm93cyBpbiBhZHZhbmNlLiBTZWUgW0RJU0NPVkVSWS5tZF0uCi8vCi8vICMgQ3VzdG9keSDigJQgdGhlIGNvbnNlcnZhdGlvbiBpbnZhcmlhbnQgaXMgdGhlIHByb2R1Y3QKLy8KLy8gQSBjdXN0b2RpYWwgcmVhbG0sIHNvIHRoZSBtb25ldGFyeSBpbnZhcmlhbnQgZ292ZXJucyBpdCBleGFjdGx5IGFzIGl0IGRvZXMKLy8gci9sb2FucyBhbmQgci9zdWJzY3JpcHRpb25zLCB3aXRoIG9uZSBleHRyYSBidWNrZXQgZm9yIHRoZSBlc2Nyb3dlZCBiaWRzOgovLwovLwlIZWxkID09IGxvY2tlZCArIGZlZWxlZGdlci5MaWFiaWxpdGllcygpCi8vCi8vIHdoZXJlIGBsb2NrZWRgIGlzIHRoZSBzdW0gb2YgdGhlIENVUlJFTlQgaGlnaCBiaWRzIGFjcm9zcyBhbGwgb3BlbiBhdWN0aW9ucwovLyAoY29pbnMgdGhlIHJlYWxtIGhvbGRzIGJ1dCB0aGF0IGFyZSBub3QgeWV0IGNsYWltYWJsZSBieSBhbnlvbmUpLCBhbmQgdGhlCi8vIGxlZGdlciBob2xkcyB0aGUgdHdvIGNsYWltYWJsZSBraW5kcyDigJQgT1VUQklEIHJlZnVuZHMgYW5kLCBhZnRlciBjbG9zZSwKLy8gU0VMTEVSIHByb2NlZWRzIOKAlCBwbHVzIHRoZSBmZWUgcG90LiBFdmVyeSB2YWx1ZSB0cmFuc2l0aW9uIHByZXNlcnZlcyB0aGUKLy8gZXF1YWxpdHk7IHNlZSB0aGUgREVMVEEtZm9ybSBjb25zZXJ2YXRpb24gdGVzdC4KLy8KLy8gUmVmdW5kcyBhcmUgUFVMTCwgbmV2ZXIgcHVzaDogYW4gb3V0YmlkIGJpZCBpcyBjcmVkaXRlZCB0byB0aGUgYmlkZGVyJ3MKLy8gY2xhaW1hYmxlIGJhbGFuY2UgKGZlZSAwIOKAlCBhIHJlZnVuZCBpcyBhIGZ1bGwgcmV0dXJuLCBub3QgYSBmZWUgZXZlbnQpIGFuZAovLyB0aGUgYmlkZGVyIHdpdGhkcmF3cyBpdCB3aXRoIFtDbGFpbV0uIE5vdGhpbmcgaXMgc2VudCB0byBhIHRoaXJkIHBhcnR5Ci8vIGR1cmluZyBzb21lb25lIGVsc2UncyBCaWQsIHNvIGEgYmlkIGNhbm5vdCBiZSBncmllZmVkIGJ5IGEgaG9zdGlsZSBwcmV2aW91cwovLyBiaWRkZXIgYW5kIHRoZXJlIGlzIG5vIGNyb3NzLWNhbGwgcmVlbnRyYW5jeSBzdXJmYWNlIGluIHRoZSBiaWQgcGF0aC4KLy8KLy8gIyBXaGF0IHRoZSByZWFsbSBzZXR0bGVzLCBhbmQgd2hhdCBpdCBkb2VzIE5PVAovLwovLyBUaGUgcmVhbG0gc2V0dGxlcyBQQVlNRU5UIGFuZCByZWNvcmRzIHRoZSBXSU5ORVI7IGl0IGRvZXMgbm90IGN1c3RvZHkgb3IKLy8gZGVsaXZlciB0aGUgbG90LCB3aGljaCBpcyBpZGVudGlmaWVkIGJ5IGEgZnJlZS10ZXh0IGRlc2NyaXB0aW9uIGFuZCBjaGFuZ2VzCi8vIGhhbmRzIG9mZi1jaGFpbiAob3IgYnkgYSBkb3duc3RyZWFtIHJlYWxtIHJlYWRpbmcgW1dpbm5lcl0pLiBUaGlzIGlzIHRoZQovLyBzY29wZSBkZWNpc2lvbiwgc3RhdGVkIHJhdGhlciB0aGFuIGRpc2NvdmVyZWQ6IGFuIG9uLWNoYWluLWFzc2V0IGF1Y3Rpb24KLy8gKGdyYzIwL2dyYzcyMSBjdXN0b2R5KSBpcyBhIHYyLCBhbmQgaXQgaXMgZXhhY3RseSB0aGUgZXNjcm93LW9mLXRoZS1hc3NldAovLyBzdXJmYWNlIHRoaXMgdjEgZGVsaWJlcmF0ZWx5IG9taXRzLiBBIHdpbm5lciBwYXlzIGFuZCBpcyByZWNvcmRlZDsgZGVsaXZlcnkKLy8gaXMgdGhlIHBhcnRpZXMnIGNvbmNlcm4sIGFzIGl0IGlzIGZvciByL2xvYW5zJyBvZmYtY2hhaW4gdXNlIG9mIHByaW5jaXBhbC4KLy8KLy8gUkVBTE0tQ0FMTEVSIENBVkVBVCwgaW5oZXJpdGVkIGZyb20gdGhlIHNpYmxpbmdzOiBjb2luaW8ncyByZWNlaXB0IGd1YXJkCi8vIGFkbWl0cyBvbmx5IEVPQSBwYXllcnMsIHNvIGV2ZXJ5IEJJRERFUiBpcyBhbiBFT0EuIFRoZSBTRUxMRVIgaXMgd2hvZXZlcgovLyBjYWxscyBbQ3JlYXRlQXVjdGlvbl07IGEgcmVhbG0gbWF5IGNyZWF0ZSBhbiBhdWN0aW9uLCBidXQgbGlrZSByZXZzaGFyZSdzCi8vIG1lbWJlcnMgYSByZWFsbSBzZWxsZXIgbXVzdCBleHBvc2UgaXRzIG93biBjcm9zc2luZyBwYXRoIHRvIFtDbGFpbV0gb3IgaXRzCi8vIHByb2NlZWRzIHN0cmFuZCDigJQgdGhlIHNlbGxlcidzIGNvbmNlcm4sIG5vdCBhIHJlYWxtIG9yIHRoaXJkLXBhcnR5IGhhemFyZC4KLy8gYXNzZXJ0Tm9TZW5kIHJlYWRzIHRoZSBPUklHSU4gZW52ZWxvcGUsIHNvIGV2ZXJ5IG5vbi1wYXlhYmxlIGZ1bmN0aW9uCi8vIHJlZnVzZXMgYW55IHRyYW5zYWN0aW9uIHRoYXQgYXR0YWNoZWQgY29pbnMgYW55d2hlcmUuCnBhY2thZ2UgYXVjdGlvbgoKaW1wb3J0ICgKCSJjaGFpbiIKCSJjaGFpbi9ydW50aW1lIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9jb2luaW8iCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2ZlZWxlZGdlciIKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L21hcmtkb3duL3Nhbml0aXplL3YwIgopCgovLyBEZW5vbSBpcyB0aGUgb25seSBhc3NldCB0aGlzIHJlYWxtIGFjY2VwdHMuCmNvbnN0IERlbm9tID0gInVnbm90IgoKLy8gTWF4RmVlQnBzIGlzIHRoZSBoYXJkIHByb3RvY29sLWZlZSBjYXA6IDEwMDAgYnBzID0gMTAlLiBUaGUgZmVlIGFwcGxpZXMgb25seQovLyB0byB0aGUgV0lOTkVSJ3MgcGF5bWVudCBhdCBjbG9zZSwgbmV2ZXIgdG8gYSByZWZ1bmQuCmNvbnN0IE1heEZlZUJwcyA9IGludDY0KDEwMDApCgovLyBBdWN0aW9uIHN0YXR1cyB2YWx1ZXMuIFNldHRsZWQsIENsb3NlZCBhbmQgQ2FuY2VsbGVkIGFyZSB0ZXJtaW5hbC4KY29uc3QgKAoJQXVjdGlvbk9wZW4gICAgICA9ICJvcGVuIiAgICAgIC8vIGFjY2VwdGluZyBiaWRzIHVudGlsIGVuZEhlaWdodAoJQXVjdGlvblNldHRsZWQgICA9ICJzZXR0bGVkIiAgIC8vIGNsb3NlZCBXSVRIIGEgd2lubmVyOyBwcm9jZWVkcyBjcmVkaXRlZAoJQXVjdGlvbkNsb3NlZCAgICA9ICJjbG9zZWQiICAgIC8vIGNsb3NlZCB3aXRoIE5PIGJpZHM7IG5vdGhpbmcgdG8gc2V0dGxlCglBdWN0aW9uQ2FuY2VsbGVkID0gImNhbmNlbGxlZCIgLy8gc2VsbGVyIGNhbmNlbGxlZCBiZWZvcmUgYW55IGJpZAopCgovLyBNaW5JbmNyZW1lbnRCcHMgaXMgdGhlIG1pbmltdW0gcmFpc2Ugb3ZlciB0aGUgc3RhbmRpbmcgaGlnaCBiaWQ6IDUwMCA9IDUlLgovLyBJdCBzdG9wcyBwZW5ueS1pbmNyZW1lbnQgZ3JpZWZpbmcgd2l0aG91dCBhIHBlci1hdWN0aW9uIGtub2IuCmNvbnN0IE1pbkluY3JlbWVudEJwcyA9IGludDY0KDUwMCkKCi8vIElucHV0IGJvdW5kcy4KY29uc3QgKAoJLy8gTWluQmlkIGlzIHRoZSBkdXN0IGZsb29yIGZvciBhbnkgYmlkIGFuZCBhbnkgbm9uLXplcm8gcmVzZXJ2ZTsgTWF4QmlkCgkvLyBrZWVwcyBldmVyeSBiaWQsIHRoZSBpbmNyZW1lbnQgYW5kIHRoZSBmZWUgc3BsaXQgZmFyIGZyb20gaW50NjQKCS8vIG92ZXJmbG93LiBUaGUgYmlkZGVyIG11c3QgQVRUQUNIIHRoZSBiaWQsIHNvIHRoZSByZWFsIGNlaWxpbmcgaXMgdGhlaXIKCS8vIGJhbGFuY2UuCglNaW5CaWQgPSBpbnQ2NCgxXzAwMCkKCU1heEJpZCA9IGludDY0KDFfMDAwXzAwMF8wMDBfMDAwKSAvLyAxLDAwMCwwMDAgR05PVAoKCS8vIER1cmF0aW9uIGFuZCBhbnRpLXNuaXBlIGJvdW5kcywgaW4gYmxvY2tzLiBUaGUgZmxvb3Iga2VlcHMgYW4gYXVjdGlvbgoJLy8gb2ZmIGEgb25lLWJsb2NrIHRyZWFkbWlsbDsgdGhlIGNlaWxpbmcga2VlcHMgaGVpZ2h0IGFyaXRobWV0aWMgZmFyIGZyb20KCS8vIG92ZXJmbG93LiBBIDAgYW50aS1zbmlwZSB3aW5kb3cgZGlzYWJsZXMgdGhlIGV4dGVuc2lvbi4KCU1pbkR1cmF0aW9uICA9IGludDY0KDEwKQoJTWF4RHVyYXRpb24gID0gaW50NjQoN181MDBfMDAwKQoJTWF4QW50aVNuaXBlID0gaW50NjQoN181MDBfMDAwKQoKCS8vIE1heExvdExlbiBib3VuZHMgdGhlIHN0b3JlZCBsb3QgZGVzY3JpcHRpb24uCglNYXhMb3RMZW4gPSAyMDAKCgkvLyBNYXhBdWN0aW9uc1BlclNlbGxlciBib3VuZHMgb25lIHNlbGxlcidzIHN0b3JlZCBhdWN0aW9uczsgdGVybWluYWwKCS8vIGF1Y3Rpb25zIGRvIE5PVCBmcmVlIHRoZSBzbG90LCBiZWNhdXNlIGEgc2V0dGxlZC9jbG9zZWQvY2FuY2VsbGVkCgkvLyBhdWN0aW9uIGlzIGEgcGVybWFuZW50IHJlY29yZCBhIGJpZGRlciBhbmQgYXVkaXRvciBtYXkgbmVlZCB0byByZWFkLgoJTWF4QXVjdGlvbnNQZXJTZWxsZXIgPSA1MAoKCS8vIFJlbmRlckxpbWl0IGJvdW5kcyBldmVyeSByZW5kZXJlZCBsaXN0IOKAlCBhbiB1bmJvdW5kZWQgUmVuZGVyIHdhcyBZRUxMT1cKCS8vIGluIHRocmVlIHByaW9yIGF1ZGl0cy4KCVJlbmRlckxpbWl0ID0gMjAKKQoKdHlwZSBhdWN0aW9uIHN0cnVjdCB7CglpZCAgICAgICAgICAgIGludDY0CglzZWxsZXIgICAgICAgIGFkZHJlc3MKCWxvdCAgICAgICAgICAgc3RyaW5nIC8vIGZyZWUtdGV4dCBkZXNjcmlwdGlvbiBvZiB0aGUgbG90IChkZWxpdmVyeSBpcyBvZmYtY2hhaW4pCglyZXNlcnZlICAgICAgIGludDY0ICAvLyBmaXJzdCBiaWQgbXVzdCBtZWV0IG1heChyZXNlcnZlLCBNaW5CaWQpCglhbnRpU25pcGUgICAgIGludDY0ICAvLyBhIGJpZCB3aXRoaW4gdGhpcyBtYW55IGJsb2NrcyBvZiBlbmQgZXh0ZW5kcyBlbmQgdG8gbm93K2FudGlTbmlwZQoJZmVlQnBzICAgICAgICBpbnQ2NCAgLy8gc25hcHNob3QgYXQgY3JlYXRlOyBhcHBsaWVkIHRvIHRoZSB3aW5uZXIncyBwYXltZW50IGF0IGNsb3NlCgllbmRIZWlnaHQgICAgIGludDY0CgloaWdoQmlkICAgICAgIGludDY0CgloaWdoQmlkZGVyICAgIGFkZHJlc3MgLy8gIiIgdW50aWwgdGhlIGZpcnN0IGJpZAoJc3RhdHVzICAgICAgICBzdHJpbmcKCWNyZWF0ZWRIZWlnaHQgaW50NjQKfQoKdmFyICgKCWFkbWluICAgICAgICBhZGRyZXNzCglwZW5kaW5nQWRtaW4gYWRkcmVzcwoJZmVlUmVjaXBpZW50IGFkZHJlc3MKCWZlZUJwcyAgICAgICBpbnQ2NCAvLyBzbmFwc2hvdHRlZCBpbnRvIE5FVyBhdWN0aW9ucwoKCXNlbGYgICBhZGRyZXNzCgluZXh0SUQgaW50NjQKCWxvY2tlZCBpbnQ2NCAvLyDOoyBjdXJyZW50IGhpZ2ggYmlkcyBvZiBPUEVOIGF1Y3Rpb25zIChoZWxkLCBub3QgeWV0IGNsYWltYWJsZSkKCglhdWN0aW9ucyAgPSBhdmwuTmV3VHJlZSgpIC8vIHBhZElEKGlkKSAgICAgICAtPiAqYXVjdGlvbgoJc2VsbGVyTnVtID0gYXZsLk5ld1RyZWUoKSAvLyBzZWxsZXIuU3RyaW5nKCkgLT4gKmludDY0LCBzdG9yZWQgYXVjdGlvbnMKCWxlZGdlciAgICA9IGZlZWxlZGdlci5NdXN0TmV3KE1heEZlZUJwcykKKQoKZnVuYyBpbml0KCkgewoJYWRtaW4gPSB1bnNhZmUuT3JpZ2luQ2FsbGVyKCkKCWZlZVJlY2lwaWVudCA9IGFkbWluCglzZWxmID0gdW5zYWZlLkN1cnJlbnRSZWFsbSgpLkFkZHJlc3MoKQp9CgovLyAtLS0gc2VsbGVyIHNpZGUgLS0tCgovLyBDcmVhdGVBdWN0aW9uIGxpc3RzIGEgbG90IGZvciBhc2NlbmRpbmctYmlkIHNhbGUuIFRoZSBjYWxsZXIgYmVjb21lcyB0aGUKLy8gc2VsbGVyLiBgcmVzZXJ2ZWAgaXMgMCAobm8gcmVzZXJ2ZSkgb3IgYSBmbG9vciBpbiBbTWluQmlkLCBNYXhCaWRdIHRoZSBmaXJzdAovLyBiaWQgbXVzdCBtZWV0OyB0aGUgYXVjdGlvbiBydW5zIGZvciBgZHVyYXRpb25CbG9ja3NgIGJsb2NrczsgYSBiaWQgbGFuZGluZwovLyB3aXRoaW4gYGFudGlTbmlwZWAgYmxvY2tzIG9mIHRoZSBlbmQgZXh0ZW5kcyB0aGUgZW5kIHRvIG5vdythbnRpU25pcGUgKDAKLy8gZGlzYWJsZXMpLiBUaGUgY3VycmVudCBwcm90b2NvbCBmZWUgaXMgc25hcHNob3R0ZWQgaW4uIFJldHVybnMgdGhlIGlkLgpmdW5jIENyZWF0ZUF1Y3Rpb24oY3VyIHJlYWxtLCBsb3Qgc3RyaW5nLCByZXNlcnZlLCBkdXJhdGlvbkJsb2NrcywgYW50aVNuaXBlIGludDY0KSBpbnQ2NCB7Cglhc3NlcnROb1NlbmQoKQoJc2VsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgbGVuKGxvdCkgPT0gMCB8fCBsZW4obG90KSA+IE1heExvdExlbiB7CgkJcGFuaWMoImxvdCBkZXNjcmlwdGlvbiBtdXN0IGJlIDEuLiIgKyBpdG9hKE1heExvdExlbikgKyAiIGJ5dGVzIikKCX0KCWlmIHJlc2VydmUgIT0gMCAmJiAocmVzZXJ2ZSA8IE1pbkJpZCB8fCByZXNlcnZlID4gTWF4QmlkKSB7CgkJcGFuaWMoInJlc2VydmUgbXVzdCBiZSAwIG9yICIgKyBpdG9hKE1pbkJpZCkgKyAiLi4iICsgaXRvYShNYXhCaWQpICsgRGVub20pCgl9CglpZiBkdXJhdGlvbkJsb2NrcyA8IE1pbkR1cmF0aW9uIHx8IGR1cmF0aW9uQmxvY2tzID4gTWF4RHVyYXRpb24gewoJCXBhbmljKCJkdXJhdGlvbkJsb2NrcyBtdXN0IGJlICIgKyBpdG9hKE1pbkR1cmF0aW9uKSArICIuLiIgKyBpdG9hKE1heER1cmF0aW9uKSkKCX0KCWlmIGFudGlTbmlwZSA8IDAgfHwgYW50aVNuaXBlID4gTWF4QW50aVNuaXBlIHsKCQlwYW5pYygiYW50aVNuaXBlIG11c3QgYmUgMC4uIiArIGl0b2EoTWF4QW50aVNuaXBlKSkKCX0KCgluIDo9IGNvdW50ZXIoc2VsbGVyTnVtLCBzZWxsZXIpCglpZiAqbiA+PSBNYXhBdWN0aW9uc1BlclNlbGxlciB7CgkJcGFuaWMoInBlci1zZWxsZXIgYXVjdGlvbiBsaW1pdCByZWFjaGVkIikKCX0KCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCgllbmQsIG9rIDo9IGFkZENoZWNrZWQobm93LCBkdXJhdGlvbkJsb2NrcykKCWlmICFvayB7CgkJcGFuaWMoImVuZC1oZWlnaHQgb3ZlcmZsb3ciKQoJfQoJaWQgOj0gbmV4dElECgluZXh0SUQrKwoJYXVjdGlvbnMuU2V0KHBhZElEKGlkKSwgJmF1Y3Rpb257CgkJaWQ6ICAgICAgICAgICAgaWQsCgkJc2VsbGVyOiAgICAgICAgc2VsbGVyLAoJCWxvdDogICAgICAgICAgIGxvdCwKCQlyZXNlcnZlOiAgICAgICByZXNlcnZlLAoJCWFudGlTbmlwZTogICAgIGFudGlTbmlwZSwKCQlmZWVCcHM6ICAgICAgICBmZWVCcHMsCgkJZW5kSGVpZ2h0OiAgICAgZW5kLAoJCWhpZ2hCaWRkZXI6ICAgICIiLAoJCXN0YXR1czogICAgICAgIEF1Y3Rpb25PcGVuLAoJCWNyZWF0ZWRIZWlnaHQ6IG5vdywKCX0pCgkqbisrCgoJY2hhaW4uRW1pdCgiQXVjdGlvbkNyZWF0ZWQiLAoJCSJhdWN0aW9uSWQiLCBpdG9hKGlkKSwKCQkic2VsbGVyIiwgc2VsbGVyLlN0cmluZygpLAoJCSJyZXNlcnZlIiwgaXRvYShyZXNlcnZlKSwKCQkiZW5kSGVpZ2h0IiwgaXRvYShlbmQpLAoJCSJhbnRpU25pcGUiLCBpdG9hKGFudGlTbmlwZSksCgkJImZlZUJwcyIsIGl0b2EoZmVlQnBzKSwKCSkKCXJldHVybiBpZAp9CgovLyBDYW5jZWwgd2l0aGRyYXdzIGFuIGF1Y3Rpb24gdGhhdCBoYXMgbm90IHlldCByZWNlaXZlZCBhIGJpZC4gU2VsbGVyIG9ubHkuCi8vIE9uY2UgYW55IGJpZCBzdGFuZHMsIHRoZSBhdWN0aW9uIGNhbiBvbmx5IHJ1biB0byBjbG9zZSDigJQgYSBzZWxsZXIgY2Fubm90Ci8vIHB1bGwgdGhlIGxvdCBvdXQgZnJvbSB1bmRlciBhIGNvbW1pdHRlZCBiaWRkZXIuCmZ1bmMgQ2FuY2VsKGN1ciByZWFsbSwgYXVjdGlvbklEIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJYSA6PSBtdXN0QXVjdGlvbihhdWN0aW9uSUQpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gYS5zZWxsZXIgewoJCXBhbmljKCJvbmx5IHRoZSBzZWxsZXIgbWF5IGNhbmNlbCIpCgl9CglpZiBhLnN0YXR1cyAhPSBBdWN0aW9uT3BlbiB7CgkJcGFuaWMoImF1Y3Rpb24gaXMgIiArIGEuc3RhdHVzKQoJfQoJaWYgYS5oaWdoQmlkZGVyICE9ICIiIHsKCQlwYW5pYygiY2Fubm90IGNhbmNlbCBhZnRlciBhIGJpZCIpCgl9CglhLnN0YXR1cyA9IEF1Y3Rpb25DYW5jZWxsZWQKCWNoYWluLkVtaXQoIkF1Y3Rpb25DYW5jZWxsZWQiLCAiYXVjdGlvbklkIiwgaXRvYShhdWN0aW9uSUQpLCAic2VsbGVyIiwgYS5zZWxsZXIuU3RyaW5nKCkpCn0KCi8vIC0tLSBiaWRkZXIgc2lkZSAtLS0KCi8vIEJpZCByYWlzZXMgdGhlIHN0YW5kaW5nIGhpZ2ggYmlkIG9uIGFuIG9wZW4gYXVjdGlvbi4gVGhlIGNhbGxlciBhdHRhY2hlcyB0aGUKLy8gYmlkOyBpdCBtdXN0IGJlYXQgdGhlIGN1cnJlbnQgaGlnaCBiaWQgYnkgYXQgbGVhc3QgTWluSW5jcmVtZW50QnBzIChvciBtZWV0Ci8vIG1heChyZXNlcnZlLCBNaW5CaWQpIGlmIGl0IGlzIHRoZSBmaXJzdCBiaWQpLCBhbmQgdGhlIGF1Y3Rpb24gbXVzdCBzdGlsbCBiZQovLyBvcGVuIGFuZCBiZWZvcmUgaXRzIGVuZC4gVGhlIHByZXZpb3VzIGhpZ2ggYmlkZGVyJ3MgZXNjcm93ZWQgYmlkIGJlY29tZXMgYQovLyBwdWxsLWNsYWltYWJsZSByZWZ1bmQuIEEgYmlkIGluc2lkZSB0aGUgYW50aS1zbmlwZSB3aW5kb3cgZXh0ZW5kcyB0aGUgZW5kLgpmdW5jIEJpZChjdXIgcmVhbG0sIGF1Y3Rpb25JRCBpbnQ2NCkgewoJYmlkZGVyLCBhbW91bnQgOj0gY29pbmlvLlJlY2VpdmUoMCwgY3VyLCBEZW5vbSkKCWEgOj0gbXVzdEF1Y3Rpb24oYXVjdGlvbklEKQoJaWYgYS5zdGF0dXMgIT0gQXVjdGlvbk9wZW4gewoJCXBhbmljKCJhdWN0aW9uIGlzICIgKyBhLnN0YXR1cykKCX0KCW5vdyA6PSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlmIG5vdyA+PSBhLmVuZEhlaWdodCB7CgkJcGFuaWMoImF1Y3Rpb24gaGFzIGVuZGVkOyBjYWxsIENsb3NlIikKCX0KCWlmIGJpZGRlciA9PSBhLnNlbGxlciB7CgkJcGFuaWMoInNlbGxlciBjYW5ub3QgYmlkIG9uIHRoZWlyIG93biBhdWN0aW9uIikKCX0KCWlmIGFtb3VudCA+IE1heEJpZCB7CgkJcGFuaWMoImJpZCBleGNlZWRzIHRoZSBtYXhpbXVtICIgKyBpdG9hKE1heEJpZCkgKyBEZW5vbSkKCX0KCW1pbiA6PSBtaW5OZXh0QmlkKGEpCglpZiBhbW91bnQgPCBtaW4gewoJCXBhbmljKCJiaWQgIiArIGl0b2EoYW1vdW50KSArICIgaXMgYmVsb3cgdGhlIG1pbmltdW0gbmV4dCBiaWQgIiArIGl0b2EobWluKSArIERlbm9tKQoJfQoKCS8vIFJlZnVuZCB0aGUgcHJldmlvdXMgaGlnaCBiaWRkZXIgKHB1bGwpLCB0aGVuIHJlbG9jayBhdCB0aGUgbmV3IGhpZ2ggYmlkLgoJLy8gY29pbmlvIGFscmVhZHkgcmVjZWl2ZWQgYGFtb3VudGAsIHNvIEhlbGQgcm9zZSBieSBhbW91bnQ7IG1vdmluZyB0aGUgb2xkCgkvLyBoaWdoIGJpZCBmcm9tIGBsb2NrZWRgIGludG8gdGhlIGxlZGdlciBhbmQgbG9ja2luZyB0aGUgbmV3IG9uZSBrZWVwcwoJLy8gSGVsZCA9PSBsb2NrZWQgKyBMaWFiaWxpdGllcyBleGFjdGx5LgoJaWYgYS5oaWdoQmlkZGVyICE9ICIiIHsKCQlsZWRnZXIuTXVzdERlcG9zaXQoYS5oaWdoQmlkZGVyLlN0cmluZygpLCBhLmhpZ2hCaWQsIDApCgkJbG9ja2VkIC09IGEuaGlnaEJpZAoJfQoJbG9ja2VkICs9IGFtb3VudAoKCWEuaGlnaEJpZCA9IGFtb3VudAoJYS5oaWdoQmlkZGVyID0gYmlkZGVyCgoJZXh0ZW5kZWQgOj0gZmFsc2UKCWlmIGEuYW50aVNuaXBlID4gMCAmJiBhLmVuZEhlaWdodC1ub3cgPCBhLmFudGlTbmlwZSB7CgkJLy8gQ2hlY2tlZCBsaWtlIHRoZSBjcmVhdGUtdGltZSBlbmQgKG92ZXJmbG93IGlzIHVucmVhY2hhYmxlIHVuZGVyIHRoZQoJCS8vIGhlaWdodCBib3VuZHMsIGJ1dCB0aGUgY2hlY2tlZC1hcml0aG1ldGljIHJ1bGUgaG9sZHMgZXZlcnl3aGVyZSkuCgkJZW5kLCBvayA6PSBhZGRDaGVja2VkKG5vdywgYS5hbnRpU25pcGUpCgkJaWYgIW9rIHsKCQkJcGFuaWMoImFudGktc25pcGUgZW5kLWhlaWdodCBvdmVyZmxvdyIpCgkJfQoJCWEuZW5kSGVpZ2h0ID0gZW5kCgkJZXh0ZW5kZWQgPSB0cnVlCgl9CgoJY2hhaW4uRW1pdCgiQmlkIiwKCQkiYXVjdGlvbklkIiwgaXRvYShhdWN0aW9uSUQpLAoJCSJiaWRkZXIiLCBiaWRkZXIuU3RyaW5nKCksCgkJImFtb3VudCIsIGl0b2EoYW1vdW50KSwKCQkiZW5kSGVpZ2h0IiwgaXRvYShhLmVuZEhlaWdodCksCgkJImV4dGVuZGVkIiwgYm9vbFN0cihleHRlbmRlZCksCgkpCn0KCi8vIC0tLSBjbG9zZSAocGVybWlzc2lvbmxlc3MsIGxpa2UgYSBzaWJsaW5nIHJlYWxtJ3MgdmFsdmUpIC0tLQoKLy8gQ2xvc2UgZmluYWxpemVzIGFuIGF1Y3Rpb24gd2hvc2UgZW5kIGhlaWdodCBoYXMgcGFzc2VkLiBBbnlvbmUgbWF5IGNhbGwgaXQ7Ci8vIG5vIGF1Y3Rpb24ncyB0ZXJtaW5hbCBzdGF0ZSBtYXkgZGVwZW5kIG9uIGEgcGFydHkgYWN0aW5nLiBXaXRoIGEgd2lubmVyLCB0aGUKLy8gaGlnaCBiaWQgaXMgY3JlZGl0ZWQgdG8gdGhlIHNlbGxlciAoZmVlIHNwbGl0IGF0IHRoZSBsZWRnZXIpIGFuZCB0aGUgYXVjdGlvbgovLyBpcyBTZXR0bGVkOyB3aXRoIG5vIGJpZHMgaXQgaXMgQ2xvc2VkLiBUaGUgd2lubmVyJ3MgZXNjcm93ZWQgcGF5bWVudCBtb3ZlcwovLyBmcm9tIGBsb2NrZWRgIGludG8gdGhlIHNlbGxlcidzIGNsYWltYWJsZSBiYWxhbmNlLgpmdW5jIENsb3NlKGN1ciByZWFsbSwgYXVjdGlvbklEIGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJYSA6PSBtdXN0QXVjdGlvbihhdWN0aW9uSUQpCglpZiBhLnN0YXR1cyAhPSBBdWN0aW9uT3BlbiB7CgkJcGFuaWMoImF1Y3Rpb24gaXMgIiArIGEuc3RhdHVzKQoJfQoJaWYgcnVudGltZS5DaGFpbkhlaWdodCgpIDwgYS5lbmRIZWlnaHQgewoJCXBhbmljKCJhdWN0aW9uIGhhcyBub3QgZW5kZWQ7IGVuZHMgYXQgaGVpZ2h0ICIgKyBpdG9hKGEuZW5kSGVpZ2h0KSkKCX0KCWlmIGEuaGlnaEJpZGRlciA9PSAiIiB7CgkJYS5zdGF0dXMgPSBBdWN0aW9uQ2xvc2VkCgkJY2hhaW4uRW1pdCgiQXVjdGlvbkNsb3NlZCIsICJhdWN0aW9uSWQiLCBpdG9hKGF1Y3Rpb25JRCksICJzZWxsZXIiLCBhLnNlbGxlci5TdHJpbmcoKSkKCQlyZXR1cm4KCX0KCWNyZWRpdGVkLCBmZWUgOj0gbGVkZ2VyLk11c3REZXBvc2l0KGEuc2VsbGVyLlN0cmluZygpLCBhLmhpZ2hCaWQsIGEuZmVlQnBzKQoJbG9ja2VkIC09IGEuaGlnaEJpZAoJYS5zdGF0dXMgPSBBdWN0aW9uU2V0dGxlZAoJY2hhaW4uRW1pdCgiQXVjdGlvblNldHRsZWQiLAoJCSJhdWN0aW9uSWQiLCBpdG9hKGF1Y3Rpb25JRCksCgkJInNlbGxlciIsIGEuc2VsbGVyLlN0cmluZygpLAoJCSJ3aW5uZXIiLCBhLmhpZ2hCaWRkZXIuU3RyaW5nKCksCgkJInByaWNlIiwgaXRvYShhLmhpZ2hCaWQpLAoJCSJjcmVkaXRlZCIsIGl0b2EoY3JlZGl0ZWQpLAoJCSJmZWUiLCBpdG9hKGZlZSksCgkpCn0KCi8vIC0tLSBjbGFpbXMgKHB1bGw6IHJlZnVuZHMgYW5kIHNlbGxlciBwcm9jZWVkcykgLS0tCgovLyBDbGFpbSBzZW5kcyBhbW91bnQgdWdub3Qgb2YgdGhlIGNhbGxlcidzIGNsYWltYWJsZSBiYWxhbmNlIOKAlCBvdXRiaWQgcmVmdW5kcwovLyBhbmQsIGlmIHRoZSBjYWxsZXIgaXMgYSBzZWxsZXIgb2YgYSBzZXR0bGVkIGF1Y3Rpb24sIHByb2NlZWRzIOKAlCB0byB0aGUKLy8gY2FsbGVyLgpmdW5jIENsYWltKGN1ciByZWFsbSwgYW1vdW50IGludDY0KSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgZXJyIDo9IGxlZGdlci5XaXRoZHJhdyhjYWxsZXIuU3RyaW5nKCksIGFtb3VudCk7IGVyciAhPSBuaWwgewoJCXBhbmljKGVycikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBjYWxsZXIsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJDbGFpbSIsICJ0byIsIGNhbGxlci5TdHJpbmcoKSwgImFtb3VudCIsIGl0b2EoYW1vdW50KSkKfQoKLy8gQ2xhaW1BbGwgc2VuZHMgdGhlIGNhbGxlcidzIGVudGlyZSBjbGFpbWFibGUgYmFsYW5jZSB0byB0aGUgY2FsbGVyLgpmdW5jIENsYWltQWxsKGN1ciByZWFsbSkgewoJYXNzZXJ0Tm9TZW5kKCkKCWNhbGxlciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCWFtb3VudCwgZXJyIDo9IGxlZGdlci5XaXRoZHJhd0FsbChjYWxsZXIuU3RyaW5nKCkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglpZiBhbW91bnQgPT0gMCB7CgkJcGFuaWMoIm5vdGhpbmcgdG8gY2xhaW0iKQoJfQoJY29pbmlvLlBheW91dCgwLCBjdXIsIGNhbGxlciwgRGVub20sIGFtb3VudCkKCWNoYWluLkVtaXQoIkNsYWltIiwgInRvIiwgY2FsbGVyLlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyAtLS0gYWRtaW5pc3RyYXRpb24gKHR3by1zdGVwIHRyYW5zZmVyLCB0aGUgaG91c2UgcGF0dGVybikgLS0tCgpmdW5jIFNldEZlZUJwcyhjdXIgcmVhbG0sIGJwcyBpbnQ2NCkgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBhZG1pbiB7CgkJcGFuaWMoImFkbWluIG9ubHkiKQoJfQoJaWYgYnBzIDwgMCB8fCBicHMgPiBNYXhGZWVCcHMgewoJCXBhbmljKCJmZWUgbXVzdCBiZSAwLi4iICsgaXRvYShNYXhGZWVCcHMpICsgIiBicHMiKQoJfQoJZmVlQnBzID0gYnBzCgljaGFpbi5FbWl0KCJGZWVTZXQiLCAiYnBzIiwgaXRvYShicHMpKQp9CgpmdW5jIFNldEZlZVJlY2lwaWVudChjdXIgcmVhbG0sIHJlY2lwaWVudCBhZGRyZXNzKSB7Cglhc3NlcnROb1NlbmQoKQoJaWYgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpICE9IGFkbWluIHsKCQlwYW5pYygiYWRtaW4gb25seSIpCgl9CglpZiAhcmVjaXBpZW50LklzVmFsaWQoKSB7CgkJcGFuaWMoImludmFsaWQgcmVjaXBpZW50IikKCX0KCWZlZVJlY2lwaWVudCA9IHJlY2lwaWVudAoJY2hhaW4uRW1pdCgiRmVlUmVjaXBpZW50U2V0IiwgInRvIiwgcmVjaXBpZW50LlN0cmluZygpKQp9CgpmdW5jIFdpdGhkcmF3RmVlcyhjdXIgcmVhbG0pIHsKCWFzc2VydE5vU2VuZCgpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gZmVlUmVjaXBpZW50IHsKCQlwYW5pYygiZmVlIHJlY2lwaWVudCBvbmx5IikKCX0KCWFtb3VudCA6PSBsZWRnZXIuV2l0aGRyYXdGZWVzKCkKCWlmIGFtb3VudCA9PSAwIHsKCQlwYW5pYygibm8gZmVlcyBhY2NydWVkIikKCX0KCWNvaW5pby5QYXlvdXQoMCwgY3VyLCBmZWVSZWNpcGllbnQsIERlbm9tLCBhbW91bnQpCgljaGFpbi5FbWl0KCJGZWVzV2l0aGRyYXduIiwgInRvIiwgZmVlUmVjaXBpZW50LlN0cmluZygpLCAiYW1vdW50IiwgaXRvYShhbW91bnQpKQp9CgovLyBTd2VlcERlbm9tIHJlY292ZXJzIG91dC1vZi1iYW5kIGNvaW5zIHRvIHRoZSBmZWUgcmVjaXBpZW50LiBGb3IgdGhlIGxlZGdlcgovLyBkZW5vbSB0aGUgcmVzZXJ2ZSBpcyBsb2NrZWQgKyBMaWFiaWxpdGllcygpIOKAlCBlc2Nyb3dlZCBoaWdoIGJpZHMsIGNsYWltYWJsZQovLyByZWZ1bmRzLCBzZWxsZXIgcHJvY2VlZHMgYW5kIHRoZSBmZWUgcG90IGFyZSBhbGwgc3RydWN0dXJhbGx5IHVucmVhY2hhYmxlLgpmdW5jIFN3ZWVwRGVub20oY3VyIHJlYWxtLCBkZW5vbSBzdHJpbmcpIHsKCWFzc2VydE5vU2VuZCgpCglpZiBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gZmVlUmVjaXBpZW50IHsKCQlwYW5pYygiZmVlIHJlY2lwaWVudCBvbmx5IikKCX0KCXJlc2VydmUgOj0gaW50NjQoMCkKCWlmIGRlbm9tID09IERlbm9tIHsKCQlyZXNlcnZlID0gbG9ja2VkICsgbGVkZ2VyLkxpYWJpbGl0aWVzKCkKCX0KCXN3ZXB0IDo9IGNvaW5pby5Td2VlcCgwLCBjdXIsIGZlZVJlY2lwaWVudCwgZGVub20sIHJlc2VydmUpCgljaGFpbi5FbWl0KCJTdXJwbHVzU3dlcHQiLCAidG8iLCBmZWVSZWNpcGllbnQuU3RyaW5nKCksICJjb2lucyIsIGl0b2Eoc3dlcHQpK2Rlbm9tKQp9CgpmdW5jIFRyYW5zZmVyQWRtaW4oY3VyIHJlYWxtLCBzdWNjZXNzb3IgYWRkcmVzcykgewoJYXNzZXJ0Tm9TZW5kKCkKCWlmIGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKSAhPSBhZG1pbiB7CgkJcGFuaWMoImFkbWluIG9ubHkiKQoJfQoJaWYgIXN1Y2Nlc3Nvci5Jc1ZhbGlkKCkgewoJCXBhbmljKCJpbnZhbGlkIHN1Y2Nlc3NvciIpCgl9CglwZW5kaW5nQWRtaW4gPSBzdWNjZXNzb3IKCWNoYWluLkVtaXQoIkFkbWluVHJhbnNmZXJTdGFnZWQiLCAidG8iLCBzdWNjZXNzb3IuU3RyaW5nKCkpCn0KCmZ1bmMgQWNjZXB0QWRtaW4oY3VyIHJlYWxtKSB7Cglhc3NlcnROb1NlbmQoKQoJY2FsbGVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJaWYgcGVuZGluZ0FkbWluID09ICIiIHx8IGNhbGxlciAhPSBwZW5kaW5nQWRtaW4gewoJCXBhbmljKCJubyBhZG1pbiB0cmFuc2ZlciBzdGFnZWQgZm9yIGNhbGxlciIpCgl9CglhZG1pbiA9IHBlbmRpbmdBZG1pbgoJcGVuZGluZ0FkbWluID0gIiIKCWNoYWluLkVtaXQoIkFkbWluVHJhbnNmZXJyZWQiLCAidG8iLCBjYWxsZXIuU3RyaW5nKCkpCn0KCi8vIC0tLSB2aWV3cyAobm9uLWNyb3NzaW5nOiBjcm9zcy1yZWFsbSByZWFkYWJsZSkgLS0tCgovLyBBdWN0aW9uSW5mbyByZXR1cm5zIGFuIGF1Y3Rpb24ncyB0ZXJtcyBhbmQgc3RhbmRpbmcgc3RhdGUuIExvdCB0ZXh0IGlzIGEKLy8gc2VwYXJhdGUgdmlldyAoW0xvdF0pIHNvIHRoaXMgc3RheXMgYSBudW1lcmljL2FkZHJlc3MgdHVwbGUuCmZ1bmMgQXVjdGlvbkluZm8oYXVjdGlvbklEIGludDY0KSAoc2VsbGVyIGFkZHJlc3MsIHJlc2VydmUsIGhpZ2hCaWQsIGVuZEhlaWdodCwgYW50aVNuaXBlLCBmZWVCcHMsIGNyZWF0ZWRIZWlnaHQgaW50NjQsIGhpZ2hCaWRkZXIgYWRkcmVzcywgc3RhdHVzIHN0cmluZykgewoJYSA6PSBtdXN0QXVjdGlvbihhdWN0aW9uSUQpCglyZXR1cm4gYS5zZWxsZXIsIGEucmVzZXJ2ZSwgYS5oaWdoQmlkLCBhLmVuZEhlaWdodCwgYS5hbnRpU25pcGUsIGEuZmVlQnBzLCBhLmNyZWF0ZWRIZWlnaHQsIGEuaGlnaEJpZGRlciwgYS5zdGF0dXMKfQoKLy8gTG90IHJldHVybnMgdGhlIGF1Y3Rpb24ncyBmcmVlLXRleHQgbG90IGRlc2NyaXB0aW9uLgpmdW5jIExvdChhdWN0aW9uSUQgaW50NjQpIHN0cmluZyB7IHJldHVybiBtdXN0QXVjdGlvbihhdWN0aW9uSUQpLmxvdCB9CgovLyBNaW5OZXh0QmlkIGlzIHRoZSBzbWFsbGVzdCBiaWQgdGhhdCB3b3VsZCBiZSBhY2NlcHRlZCByaWdodCBub3c6IHRoZSBmaXJzdAovLyBiaWQncyBmbG9vciB3aGVuIHRoZXJlIGFyZSBubyBiaWRzLCBlbHNlIHRoZSBzdGFuZGluZyBoaWdoIGJpZCBwbHVzIHRoZQovLyBtaW5pbXVtIGluY3JlbWVudC4KZnVuYyBNaW5OZXh0QmlkKGF1Y3Rpb25JRCBpbnQ2NCkgaW50NjQgeyByZXR1cm4gbWluTmV4dEJpZChtdXN0QXVjdGlvbihhdWN0aW9uSUQpKSB9CgovLyBIaWdoQmlkIGlzIHRoZSBzdGFuZGluZyBoaWdoIGJpZCAoMCBpZiBub25lKS4KZnVuYyBIaWdoQmlkKGF1Y3Rpb25JRCBpbnQ2NCkgaW50NjQgeyByZXR1cm4gbXVzdEF1Y3Rpb24oYXVjdGlvbklEKS5oaWdoQmlkIH0KCi8vIEhpZ2hCaWRkZXIgaXMgdGhlIHN0YW5kaW5nIGhpZ2ggYmlkZGVyICgiIiBpZiBub25lKS4KZnVuYyBIaWdoQmlkZGVyKGF1Y3Rpb25JRCBpbnQ2NCkgYWRkcmVzcyB7IHJldHVybiBtdXN0QXVjdGlvbihhdWN0aW9uSUQpLmhpZ2hCaWRkZXIgfQoKLy8gV2lubmVyIGlzIHRoZSBoaWdoIGJpZGRlciBvbmNlIHRoZSBhdWN0aW9uIGhhcyBTZXR0bGVkLCBlbHNlICIiLgpmdW5jIFdpbm5lcihhdWN0aW9uSUQgaW50NjQpIGFkZHJlc3MgewoJYSA6PSBtdXN0QXVjdGlvbihhdWN0aW9uSUQpCglpZiBhLnN0YXR1cyA9PSBBdWN0aW9uU2V0dGxlZCB7CgkJcmV0dXJuIGEuaGlnaEJpZGRlcgoJfQoJcmV0dXJuICIiCn0KCi8vIEVuZEhlaWdodCBpcyB0aGUgY3VycmVudCBlbmQgaGVpZ2h0ICh3aGljaCBhbnRpLXNuaXBlIG1heSBoYXZlIGV4dGVuZGVkKS4KZnVuYyBFbmRIZWlnaHQoYXVjdGlvbklEIGludDY0KSBpbnQ2NCB7IHJldHVybiBtdXN0QXVjdGlvbihhdWN0aW9uSUQpLmVuZEhlaWdodCB9CgovLyBSZXNlcnZlIGlzIHRoZSBhdWN0aW9uJ3MgcmVzZXJ2ZSBwcmljZSAoMCBpZiBub25lKS4KZnVuYyBSZXNlcnZlKGF1Y3Rpb25JRCBpbnQ2NCkgaW50NjQgeyByZXR1cm4gbXVzdEF1Y3Rpb24oYXVjdGlvbklEKS5yZXNlcnZlIH0KCi8vIFN0YXR1cyBpcyB0aGUgYXVjdGlvbidzIHN0YXR1cyBzdHJpbmcuCmZ1bmMgU3RhdHVzKGF1Y3Rpb25JRCBpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIG11c3RBdWN0aW9uKGF1Y3Rpb25JRCkuc3RhdHVzIH0KCi8vIFNlbGxlciBpcyB0aGUgYXVjdGlvbidzIHNlbGxlci4KZnVuYyBTZWxsZXIoYXVjdGlvbklEIGludDY0KSBhZGRyZXNzIHsgcmV0dXJuIG11c3RBdWN0aW9uKGF1Y3Rpb25JRCkuc2VsbGVyIH0KCi8vIElzT3BlbiByZXBvcnRzIHdoZXRoZXIgdGhlIGF1Y3Rpb24gaXMgb3BlbiBhbmQgc3RpbGwgYmVmb3JlIGl0cyBlbmQuCmZ1bmMgSXNPcGVuKGF1Y3Rpb25JRCBpbnQ2NCkgYm9vbCB7CglhIDo9IG11c3RBdWN0aW9uKGF1Y3Rpb25JRCkKCXJldHVybiBhLnN0YXR1cyA9PSBBdWN0aW9uT3BlbiAmJiBydW50aW1lLkNoYWluSGVpZ2h0KCkgPCBhLmVuZEhlaWdodAp9CgovLyBJc0Nsb3NlYWJsZSByZXBvcnRzIHdoZXRoZXIgQ2xvc2Ugd291bGQgc3VjY2VlZCByaWdodCBub3cuCmZ1bmMgSXNDbG9zZWFibGUoYXVjdGlvbklEIGludDY0KSBib29sIHsKCWEgOj0gbXVzdEF1Y3Rpb24oYXVjdGlvbklEKQoJcmV0dXJuIGEuc3RhdHVzID09IEF1Y3Rpb25PcGVuICYmIHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKSA+PSBhLmVuZEhlaWdodAp9CgovLyBCbG9ja3NMZWZ0IGlzIGhvdyBtYW55IGJsb2NrcyB1bnRpbCB0aGUgZW5kICgwIG9uY2UgZW5kZWQpLgpmdW5jIEJsb2Nrc0xlZnQoYXVjdGlvbklEIGludDY0KSBpbnQ2NCB7CglhIDo9IG11c3RBdWN0aW9uKGF1Y3Rpb25JRCkKCWxlZnQgOj0gYS5lbmRIZWlnaHQgLSBydW50aW1lLkNoYWluSGVpZ2h0KCkKCWlmIGxlZnQgPCAwIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGxlZnQKfQoKZnVuYyBIYXNBdWN0aW9uKGF1Y3Rpb25JRCBpbnQ2NCkgYm9vbCB7IHJldHVybiBhdWN0aW9ucy5HZXQocGFkSUQoYXVjdGlvbklEKSkgIT0gbmlsIH0KCmZ1bmMgQXVjdGlvbnNPZihzZWxsZXIgYWRkcmVzcykgaW50NjQgewoJdiA6PSBzZWxsZXJOdW0uR2V0KHNlbGxlci5TdHJpbmcoKSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuICp2LigqaW50NjQpCn0KCmZ1bmMgQWRtaW4oKSBhZGRyZXNzICAgICAgICAgICAgICB7IHJldHVybiBhZG1pbiB9CmZ1bmMgUGVuZGluZ0FkbWluKCkgYWRkcmVzcyAgICAgICB7IHJldHVybiBwZW5kaW5nQWRtaW4gfQpmdW5jIEZlZVJlY2lwaWVudCgpIGFkZHJlc3MgICAgICAgeyByZXR1cm4gZmVlUmVjaXBpZW50IH0KZnVuYyBGZWVCcHMoKSBpbnQ2NCAgICAgICAgICAgICAgIHsgcmV0dXJuIGZlZUJwcyB9CmZ1bmMgTnVtQXVjdGlvbnMoKSBpbnQ2NCAgICAgICAgICB7IHJldHVybiBuZXh0SUQgfQpmdW5jIENsYWltYWJsZU9mKGEgYWRkcmVzcykgaW50NjQgeyByZXR1cm4gbGVkZ2VyLkJhbGFuY2VPZihhLlN0cmluZygpKSB9CmZ1bmMgRmVlc0FjY3J1ZWQoKSBpbnQ2NCAgICAgICAgICB7IHJldHVybiBsZWRnZXIuRmVlc0FjY3J1ZWQoKSB9CmZ1bmMgTGlhYmlsaXRpZXMoKSBpbnQ2NCAgICAgICAgICB7IHJldHVybiBsZWRnZXIuTGlhYmlsaXRpZXMoKSB9CmZ1bmMgTG9ja2VkKCkgaW50NjQgICAgICAgICAgICAgICB7IHJldHVybiBsb2NrZWQgfQpmdW5jIEhlbGQoKSBpbnQ2NCAgICAgICAgICAgICAgICAgeyByZXR1cm4gY29pbmlvLkhlbGRBdChzZWxmLCBEZW5vbSkgfQpmdW5jIEFkZHJlc3MoKSBhZGRyZXNzICAgICAgICAgICAgeyByZXR1cm4gc2VsZiB9CmZ1bmMgSGVpZ2h0KCkgaW50NjQgICAgICAgICAgICAgICB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gLS0tIGludGVybmFscyAtLS0KCi8vIG1pbk5leHRCaWQgaXMgdGhlIHNtYWxsZXN0IGFjY2VwdGFibGUgYmlkOiB0aGUgZmlyc3QtYmlkIGZsb29yIHdoZW4gbm8gYmlkCi8vIHN0YW5kcywgZWxzZSB0aGUgaGlnaCBiaWQgcGx1cyBjZWlsKGhpZ2hCaWTCt01pbkluY3JlbWVudEJwcy8xMDAwMCkuIGhpZ2hCaWQKLy8gaXMgYm91bmRlZCBieSBNYXhCaWQsIHNvIHRoZSBpbmNyZW1lbnQgcHJvZHVjdCBjYW5ub3Qgb3ZlcmZsb3cuCmZ1bmMgbWluTmV4dEJpZChhICphdWN0aW9uKSBpbnQ2NCB7CglpZiBhLmhpZ2hCaWRkZXIgPT0gIiIgewoJCWlmIGEucmVzZXJ2ZSA+IE1pbkJpZCB7CgkJCXJldHVybiBhLnJlc2VydmUKCQl9CgkJcmV0dXJuIE1pbkJpZAoJfQoJcmV0dXJuIGEuaGlnaEJpZCArIGNlaWxEaXYoYS5oaWdoQmlkKk1pbkluY3JlbWVudEJwcywgMTBfMDAwKQp9CgpmdW5jIG11c3RBdWN0aW9uKGlkIGludDY0KSAqYXVjdGlvbiB7Cgl2IDo9IGF1Y3Rpb25zLkdldChwYWRJRChpZCkpCglpZiB2ID09IG5pbCB7CgkJcGFuaWMoInVua25vd24gYXVjdGlvbiAiICsgaXRvYShpZCkpCgl9CglyZXR1cm4gdi4oKmF1Y3Rpb24pCn0KCmZ1bmMgYXNzZXJ0Tm9TZW5kKCkgewoJaWYgIXVuc2FmZS5PcmlnaW5TZW5kKCkuSXNaZXJvKCkgewoJCXBhbmljKCJ0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGFjY2VwdCBjb2lucyIpCgl9Cn0KCmZ1bmMgY291bnRlcih0cmVlICphdmwuVHJlZSwgYSBhZGRyZXNzKSAqaW50NjQgewoJayA6PSBhLlN0cmluZygpCglpZiB2IDo9IHRyZWUuR2V0KGspOyB2ICE9IG5pbCB7CgkJcmV0dXJuIHYuKCppbnQ2NCkKCX0KCW4gOj0gaW50NjQoMCkKCXRyZWUuU2V0KGssICZuKQoJcmV0dXJuICZuCn0KCi8vIGNlaWxEaXYgcmV0dXJucyBjZWlsKGEvYikgZm9yIGI+MDsgYSBhc3N1bWVkIG5vbi1uZWdhdGl2ZS4KZnVuYyBjZWlsRGl2KGEsIGIgaW50NjQpIGludDY0IHsKCWlmIGEgPD0gMCB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiAoYSArIGIgLSAxKSAvIGIKfQoKZnVuYyBhZGRDaGVja2VkKGEsIGIgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJcyA6PSBhICsgYgoJaWYgKGIgPiAwICYmIHMgPCBhKSB8fCAoYiA8IDAgJiYgcyA+IGEpIHsKCQlyZXR1cm4gMCwgZmFsc2UKCX0KCXJldHVybiBzLCB0cnVlCn0KCmZ1bmMgcGFkSUQoaWQgaW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkKCWZvciBsZW4ocykgPCAxMiB7CgkJcyA9ICIwIiArIHMKCX0KCXJldHVybiBzCn0KCmZ1bmMgaXRvYShuIGludDY0KSBzdHJpbmcgeyByZXR1cm4gc3RyY29udi5Gb3JtYXRJbnQobiwgMTApIH0KCmZ1bmMgYm9vbFN0cihiIGJvb2wpIHN0cmluZyB7CglpZiBiIHsKCQlyZXR1cm4gInRydWUiCgl9CglyZXR1cm4gImZhbHNlIgp9CgpmdW5jIGhhc1ByZWZpeChzLCBwIHN0cmluZykgYm9vbCB7IHJldHVybiBsZW4ocykgPj0gbGVuKHApICYmIHNbOmxlbihwKV0gPT0gcCB9CgovLyAtLS0gUmVuZGVyIC0tLQoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7Cglzd2l0Y2ggewoJY2FzZSBwYXRoID09ICIiOgoJCXJldHVybiByZW5kZXJIb21lKCkKCWNhc2UgaGFzUHJlZml4KHBhdGgsICJhdWN0aW9uLyIpOgoJCXJldHVybiByZW5kZXJBdWN0aW9uKHBhdGhbbGVuKCJhdWN0aW9uLyIpOl0pCglkZWZhdWx0OgoJCXJldHVybiAidW5rbm93biBwYXRoOyB0cnkgXCJcIiBvciBcImF1Y3Rpb24vPGlkPlwiXG4iCgl9Cn0KCmZ1bmMgcmVuZGVySG9tZSgpIHN0cmluZyB7CglvdXQgOj0gIiMgYXVjdGlvbiDigJQgYXNjZW5kaW5nIGF1Y3Rpb25zIHNldHRsZWQgaW4gdWdub3RcblxuIgoJb3V0ICs9ICJBdWN0aW9uczogIiArIGl0b2EobmV4dElEKSArICIgwrcgZXNjcm93ZWQgaGlnaCBiaWRzOiAiICsgaXRvYShsb2NrZWQpICsgRGVub20gKwoJCSIgwrcgY2xhaW1hYmxlK2ZlZXMgaGVsZDogIiArIGl0b2EobGVkZ2VyLkxpYWJpbGl0aWVzKCkpICsgRGVub20gKwoJCSIgwrcgZmVlcyBhY2NydWVkOiAiICsgaXRvYShsZWRnZXIuRmVlc0FjY3J1ZWQoKSkgKyBEZW5vbSArICJcblxuIgoJb3V0ICs9ICJUaGUgcmVhbG0gZXNjcm93cyB0aGUgc3RhbmRpbmcgaGlnaCBiaWQgb2YgZXZlcnkgb3BlbiBhdWN0aW9uOyBhbiBvdXRiaWQgYmlkIGlzIHJlZnVuZGVkIGFzIGEgcHVsbC1jbGFpbWFibGUgYmFsYW5jZS5cblxuIgoJb3V0ICs9ICJ8IGlkIHwgc2VsbGVyIHwgbG90IHwgcmVzZXJ2ZSB8IGhpZ2ggYmlkIHwgaGlnaCBiaWRkZXIgfCBzdGF0dXMgfFxufC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIKCXNob3duIDo9IGludDY0KDApCglmb3IgaWQgOj0gbmV4dElEIC0gMTsgaWQgPj0gMCAmJiBzaG93biA8IFJlbmRlckxpbWl0OyBpZC0tIHsKCQl2IDo9IGF1Y3Rpb25zLkdldChwYWRJRChpZCkpCgkJaWYgdiA9PSBuaWwgewoJCQljb250aW51ZQoJCX0KCQlhIDo9IHYuKCphdWN0aW9uKQoJCW91dCArPSAifCAiICsgaXRvYShhLmlkKSArICIgfCAiICsgc2FuaXRpemUuVGFibGVDZWxsKGEuc2VsbGVyLlN0cmluZygpKSArICIgfCAiICsKCQkJc2FuaXRpemUuVGFibGVDZWxsKGEubG90KSArICIgfCAiICsgaXRvYShhLnJlc2VydmUpICsgRGVub20gKyAiIHwgIiArCgkJCWl0b2EoYS5oaWdoQmlkKSArIERlbm9tICsgIiB8ICIgKyBzYW5pdGl6ZS5UYWJsZUNlbGwoaGlnaEJpZGRlclN0cihhKSkgKyAiIHwgIiArIGEuc3RhdHVzICsgIiB8XG4iCgkJc2hvd24rKwoJfQoJaWYgbmV4dElEID4gc2hvd24gewoJCW91dCArPSAiXG4oIiArIGl0b2Eoc2hvd24pICsgIiBtb3N0IHJlY2VudCBvZiAiICsgaXRvYShuZXh0SUQpICsgIilcbiIKCX0KCXJldHVybiBvdXQKfQoKZnVuYyByZW5kZXJBdWN0aW9uKGlkU3RyIHN0cmluZykgc3RyaW5nIHsKCWlkLCBlcnIgOj0gc3RyY29udi5QYXJzZUludChpZFN0ciwgMTAsIDY0KQoJaWYgZXJyICE9IG5pbCB7CgkJcmV0dXJuICJiYWQgYXVjdGlvbiBpZFxuIgoJfQoJdiA6PSBhdWN0aW9ucy5HZXQocGFkSUQoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAidW5rbm93biBhdWN0aW9uICIgKyBpZFN0ciArICJcbiIKCX0KCWEgOj0gdi4oKmF1Y3Rpb24pCglub3cgOj0gcnVudGltZS5DaGFpbkhlaWdodCgpCglvdXQgOj0gIiMgYXVjdGlvbiAiICsgaXRvYShhLmlkKSArICJcblxuIgoJb3V0ICs9ICItIGxvdDogIiArIHNhbml0aXplLklubGluZVRleHQoYS5sb3QpICsgIlxuIgoJb3V0ICs9ICItIHNlbGxlcjogIiArIGEuc2VsbGVyLlN0cmluZygpICsgIlxuIgoJb3V0ICs9ICItIHJlc2VydmU6ICIgKyBpdG9hKGEucmVzZXJ2ZSkgKyBEZW5vbSArICIgwrcgZmVlOiAiICsgaXRvYShhLmZlZUJwcykgKyAiIGJwc1xuIgoJb3V0ICs9ICItIGhpZ2ggYmlkOiAiICsgaXRvYShhLmhpZ2hCaWQpICsgRGVub20gKyAiIMK3IGhpZ2ggYmlkZGVyOiAiICsgaGlnaEJpZGRlclN0cihhKSArICJcbiIKCW91dCArPSAiLSBzdGF0dXM6ICIgKyBhLnN0YXR1cyArICIgwrcgY3JlYXRlZCBhdCBoZWlnaHQgIiArIGl0b2EoYS5jcmVhdGVkSGVpZ2h0KSArCgkJIiDCtyBlbmRzIGF0IGhlaWdodCAiICsgaXRvYShhLmVuZEhlaWdodCkKCWlmIGEuYW50aVNuaXBlID4gMCB7CgkJb3V0ICs9ICIgwrcgYW50aS1zbmlwZSAiICsgaXRvYShhLmFudGlTbmlwZSkgKyAiIGJsb2NrcyIKCX0KCW91dCArPSAiXG4iCglpZiBhLnN0YXR1cyA9PSBBdWN0aW9uT3BlbiB7CgkJbGVmdCA6PSBhLmVuZEhlaWdodCAtIG5vdwoJCWlmIGxlZnQgPCAwIHsKCQkJbGVmdCA9IDAKCQl9CgkJc3RhdGUgOj0gImFjY2VwdGluZyBiaWRzIgoJCWlmIG5vdyA+PSBhLmVuZEhlaWdodCB7CgkJCXN0YXRlID0gImVuZGVkIOKAlCBhd2FpdGluZyBDbG9zZSIKCQl9CgkJb3V0ICs9ICItICIgKyBzdGF0ZSArICIgwrcgYmxvY2tzIGxlZnQgIiArIGl0b2EobGVmdCkgKyAiIMK3IG1pbmltdW0gbmV4dCBiaWQgIiArIGl0b2EobWluTmV4dEJpZChhKSkgKyBEZW5vbSArICJcbiIKCX0KCWlmIGEuc3RhdHVzID09IEF1Y3Rpb25TZXR0bGVkIHsKCQlvdXQgKz0gIi0gd2lubmVyOiAiICsgYS5oaWdoQmlkZGVyLlN0cmluZygpICsgIiBhdCAiICsgaXRvYShhLmhpZ2hCaWQpICsgRGVub20gKyAiXG4iCgl9CglyZXR1cm4gb3V0Cn0KCmZ1bmMgaGlnaEJpZGRlclN0cihhICphdWN0aW9uKSBzdHJpbmcgewoJaWYgYS5oaWdoQmlkZGVyID09ICIiIHsKCQlyZXR1cm4gIihub25lKSIKCX0KCXJldHVybiBhLmhpZ2hCaWRkZXIuU3RyaW5nKCkKfQoaYgoLZ25vbW9kLnRvbWwSU21vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvYXVjdGlvbiIKZ25vID0gIjAuOSIKIg0xMDAwMDAwMHVnbm90EhEIpoivLRIKOTUxNDR1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIW9DF2ySV4zjQumeJvrSn3/nxG7XBDVv+rkxV/YrsOmBJAeuE0l6CGdy087/7SRJJV34IQ2ToSdvKFb7an3R7UM51w7I5EMPgapWmMykDDBaLCIHBdVP2BVk8pc2BbPROt0xooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ=="
  }
}