{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "OH7G6339EeYwJEgwCj9QzmtIXXBAp+11ZmJCiLm1oFY=",
    "height": "1236132",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "64000000",
      "GasUsed": "34492538"
    },
    "tx": "CvnFAQoML3ZtLm1fYWRkcGtnEufFAQooZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozORKqxQEKCXNwZW5kYm9vaxI9Z25vLmxhbmQvcC9nMXFwNXB0OGNkcTJmNmtmZGFtbjN5dXh3ZzZxdXFuZnB5ZXd6ejM5L3NwZW5kYm9vaxpkCgtnbm9tb2QudG9tbBJVbW9kdWxlID0gImduby5sYW5kL3AvZzFxcDVwdDhjZHEyZjZrZmRhbW4zeXV4d2c2cXVxbmZweWV3enozOS9zcGVuZGJvb2siCmdubyA9ICIwLjkiChrSwwEKDXNwZW5kYm9vay5nbm8Sv8MBLy8gUGFja2FnZSBzcGVuZGJvb2sgaXMgYSBwdXJlIGFsbG93YW5jZSBwcmltaXRpdmUgZm9yIHJlYWxtcyB0aGF0IG5lZWQgdG8KLy8gbGV0IG9uZSBwYXJ0eSBzcGVuZCBhbm90aGVyIHBhcnR5J3MgZnVuZHMsIHVwIHRvIGEgYm91bmRlZCBhbW91bnQsIG92ZXIKLy8gbWFueSB0cmFuc2FjdGlvbnMuIEl0IGlzIHRvICpkZWxlZ2F0ZWQgc3BlbmRpbmcqIHdoYXQgZHVlYm9vayBpcyB0bwovLyAqdGltZSo6IGl0IGhvbGRzIG5vIGNvaW5zLCBwZXJmb3JtcyBubyBlZmZlY3RzLCBpbXBvcnRzIG5vIGNoYWluIEFQSXMsCi8vIGFuZCBvd25zIG5vIHBhY2thZ2UtbGV2ZWwgc3RhdGUuIFRoZSBpbXBvcnRpbmcgcmVhbG0gb3ducyBhICpCb29rLAovLyBzdXBwbGllcyB0aGUgY2xvY2ssIGFuZCBwZXJmb3JtcyBpdHMgb3duIGVmZmVjdHMuCi8vCi8vICMgV2h5IHRoaXMgcGFja2FnZSBleGlzdHMKLy8KLy8gVGhlIGVjb3N5c3RlbSdzIGV4aXN0aW5nIGFsbG93YW5jZSBwcmltaXRpdmUsCi8vIGduby5sYW5kL3AvamFla3dvbi9hbGxvd2FuY2VzZW5kZXIvdjAsIGlzIHNjb3BlZCB0byBhIHNpbmdsZSBjYWxsIGFuZAovLyBzYXlzIHNvIGluIGl0cyBvd24gZG9jdW1lbnRhdGlvbjoKLy8KLy8JIkFsbG93YW5jZSBzdXJ2aXZlcyBhY3Jvc3MgTiB0eHMgYnV0IG5vdCBOKzEgdHhzLiIgVXNlIGEgc2Vzc2lvbgovLwljb3VudGVyIHBhdHRlcm4gaW4gdGhlIGdyYW50ZXIgcmVhbG07IHRoaXMgcGFja2FnZSdzIENsb3NlIGlzCi8vCWJpbmFyeSwgbm90IGRlYWRsaW5lLWJhc2VkLgovLwovLyBJdCB0aGVuIGRlY2xpbmVzIGJsb2NrLWhlaWdodCBleHBpcnkgb24gdGhlIGdyb3VuZHMgdGhhdCBpdCAid291bGQKLy8gcmVxdWlyZSBydW50aW1lIGNvb3BlcmF0aW9uIi4gVGhhdCBpcyB0cnVlIG9ubHkgZm9yIGEgcGFja2FnZSB0aGF0IHJlYWRzCi8vIHRoZSBjbG9jayBpdHNlbGYuIHNwZW5kYm9vayBkb2VzIG5vdDogZXZlcnkgb3BlcmF0aW9uIHRha2VzIGBub3dgIGFzIGFuCi8vIGFyZ3VtZW50LCB3aGljaCBtYWtlcyB0aGUgd2luZG93IGFyaXRobWV0aWMgYSBwdXJlIGZ1bmN0aW9uIGFuZCB0aGUKLy8gd2hvbGUgcGFja2FnZSB1bml0LXRlc3RhYmxlIHdpdGhvdXQgYSBjaGFpbi4gVGhyZWUgYXBwbGljYXRpb24gcmVhbG1zIGluCi8vIHRoZSBzZWFyY2hlZCBzb3VyY2VzIGVhY2ggaGFuZC1yb2xsZWQgdGhpcyBtZWNoYW5pc20gaW50ZXJuYWxseSByYXRoZXIKLy8gdGhhbiBpbXBvcnRpbmcgb25lOyBzZWUgRElTQ09WRVJZLm1kLgovLwovLyAjIFRoZSBvbmUgaWRlYQovLwovLyBBbiBhbGxvd2FuY2UgaXMgbm90IGEgYmFsYW5jZS4gSXQgaXMgYSAqcGVybWlzc2lvbiB3aXRoIGEgY2VpbGluZyB0aGF0Ci8vIHJlZmlsbHMqLiBUaGUgb3duZXIgc2F5cyAidGhpcyBzcGVuZGVyIG1heSBkcmF3IGF0IG1vc3QgUGVyUGVyaW9kIHBlcgovLyB3aW5kb3csIGF0IG1vc3QgVG90YWwgZXZlciwgdW50aWwgRXhwaXJlc0F0LCBhbmQgSSBjYW4gcmV2b2tlIGl0IG5vdyI6Ci8vCi8vCWlmIGVyciA6PSBib29rLlNwZW5kKGlkLCBzcGVuZGVyS2V5LCBub3csIGFtb3VudCk7IGVyciAhPSBuaWwgewovLwkJcGFuaWMoZXJyKSAvLyByZXZva2VkLCBleHBpcmVkLCBvdmVyIHRoZSB3aW5kb3cgY2FwLCBvdmVyIHRoZSB0b3RhbAovLwl9Ci8vCS8vIC4uLiB0aGUgcmVhbG0gbW92ZXMgdGhlIGNvaW5zIGhlcmUsIHVuZGVyIGl0cyBvd24gYXV0aG9yaXR5Ci8vCi8vIFNwZW5kIGNoZWNrcyBldmVyeSBib3VuZCBhbmQgQ09OU1VNRVMgdGhlIGFsbG93YW5jZSBpbiB0aGUgc2FtZSBjYWxsLAovLyBiZWZvcmUgcmV0dXJuaW5nLiBUaGUgcmVhbG0gdGhlbiBhY3RzLiBCZWNhdXNlIHRoZSByZWFsbSBwZXJmb3JtcyB0aGUKLy8gZWZmZWN0IGl0c2VsZiwgbm8gY2xvc3VyZSwgY2FsbGJhY2ssIG9yIGNhcGFiaWxpdHkgZXZlciBjcm9zc2VzIGEgcmVhbG0KLy8gYm91bmRhcnkuIHNwZW5kYm9vayBjYW5ub3QgYmUgaGFuZGVkIGNvZGUgdG8gcnVuLCBzbyBpdCBjYW5ub3QgYmUKLy8gdHJpY2tlZCBpbnRvIHJ1bm5pbmcgdGhlIHdyb25nIGNvZGUuCi8vCi8vICMgV2luZG93cyBhcmUgYW5jaG9yZWQsIG5vdCBzbGlkaW5nCi8vCi8vIEEgd2luZG93IGlzIGRlcml2ZWQgZnJvbSBhIGZpeGVkIG9yaWdpbiDigJQgdGhlIEFuY2hvciBzZXQgYXQgT3BlbiDigJQgYnkKLy8gaW50ZWdlciBkaXZpc2lvbjoKLy8KLy8JaW5kZXgobm93KSA9IChub3cgLSBBbmNob3IpIC8gUGVyaW9kTGVuZ3RoCi8vCi8vIHNvIHRoZSBib3VuZGFyaWVzIGFyZSB0aGUgc2FtZSBmb3IgZXZlcnlvbmUgYW5kIGEgc3BlbmRlciBjYW5ub3QgcmVzZXQgYQovLyB3aW5kb3cgYnkgY2hvb3Npbmcgd2hlbiB0byBjYWxsLiBBIHNsaWRpbmcgIlBlclBlcmlvZCBwZXIgdHJhaWxpbmcgTgovLyBibG9ja3MiIHdpbmRvdyB3b3VsZCBsZXQgYSBzcGVuZGVyIGRyYXcgdGhlIGZ1bGwgY2FwIGF0IHRoZSBlbmQgb2Ygb25lCi8vIHRyYWlsaW5nIHNwYW4gYW5kIGFnYWluIGF0IHRoZSBzdGFydCBvZiB0aGUgbmV4dDsgYW5jaG9yaW5nIHJlbW92ZXMgdGhlCi8vIGNob2ljZS4gVGhlIHJlZmlsbCBpcyBhIFJFU0VULCBub3QgYSBjYXJyeTogYW4gdW51c2VkIGFsbG93YW5jZSBkb2VzIG5vdAovLyBhY2N1bXVsYXRlIGludG8gdGhlIG5leHQgd2luZG93LCBiZWNhdXNlIHRoZSBwb2ludCBvZiB0aGUgY2FwIGlzIHRvIGJvdW5kCi8vIHdvcnN0LWNhc2UgbG9zcyBwZXIgd2luZG93LCBhbmQgYSBjYXJyeSB3b3VsZCB1bmJvdW5kIGl0LgovLwovLyBQZXJpb2RMZW5ndGggPT0gMCBtZWFucyBvbmUgd2luZG93IHRoYXQgbmV2ZXIgcm9sbHM6IGEgcHVyZSBsaWZldGltZQovLyBhbGxvd2FuY2UsIHdoZXJlIFBlclBlcmlvZCBpcyB0aGUgb25seSBjYXAgdGhhdCBtYXR0ZXJzLgovLwovLyAjIEFtZW5kbWVudHMgY2Fubm90IGVubGFyZ2UgdGhlIGxpdmUgd2luZG93Ci8vCi8vIEFuIG93bmVyIHdobyBjb3VsZCByYWlzZSBQZXJQZXJpb2QgbWlkLXdpbmRvdyB3b3VsZCBiZSBhYmxlIHRvIHVuZG8gdGhlCi8vIGJvdW5kIGEgc3BlbmRlciBpcyByZWx5aW5nIG9uLCBhbmQg4oCUIHdvcnNlIGluIHRoZSBvdGhlciBkaXJlY3Rpb24g4oCUIGFuCi8vIG93bmVyIHdobyBkcmFpbnMgYSByZWxhdGlvbnNoaXAgYW5kIHRoZW4gbG93ZXJzIHRlcm1zIHJldHJvYWN0aXZlbHkKLy8gY291bGQgc3RyYW5kIGEgc3BlbmRlciBtaWQtc2V0dGxlbWVudC4gVGhlIHJ1bGUgaGVyZSBpcyBvbmUtc2lkZWQgYW5kCi8vIGVuZm9yY2VkIGluIEFtZW5kOgovLwovLyAgIC0gVElHSFRFUi1PUi1FUVVBTCB0ZXJtcyBhcHBseSBJTU1FRElBVEVMWS4gTG93ZXJpbmcgYSBjZWlsaW5nIGNhbgovLyAgICAgbmV2ZXIgYXV0aG9yaXplIGEgZHJhdyB0aGF0IHdhcyBub3QgYWxyZWFkeSBhdXRob3JpemVkLCBzbyB0aGVyZSBpcwovLyAgICAgbm8gcmVhc29uIHRvIGRlbGF5IGl0LCBhbmQgZGVsYXlpbmcgaXQgd291bGQgbWFrZSB0aGUgb3duZXIncyBvbmx5Ci8vICAgICBmYXN0IHJlbWVkeSBSZXZva2UuCi8vICAgLSBMT09TRVIgdGVybXMgYXJlIFBFTkRJTkcgYW5kIHRha2UgZWZmZWN0IGF0IHRoZSBuZXh0IHdpbmRvdwovLyAgICAgYm91bmRhcnksIG5ldmVyIGluc2lkZSB0aGUgY3VycmVudCBvbmUuCi8vCi8vIFRoaXMgaXMgdGhlIHNhbWUgYWR2ZXJzYXJpYWwgcHJvYmxlbSB0aGF0IHIvc2FtY3Jldy9hZ2VudF9yZWdpc3RyeV92MgovLyBzb2x2ZXMgYnkgbG9ja2luZyBpdHMgcHJpY2Ugd2hpbGUgYW55IGNyZWRpdCBlbnRyeSBleGlzdHM7IHRoZSBzaGFwZQovLyBoZXJlIGlzIGEgZGVmZXJyYWwgcmF0aGVyIHRoYW4gYSBsb2NrLCBzbyB0ZXJtcyBjYW4gc3RpbGwgbW92ZS4KLy8KLy8gV2l0aCBQZXJpb2RMZW5ndGggPT0gMCB0aGVyZSBpcyBubyBuZXh0IGJvdW5kYXJ5LCBzbyBhIGxvb3NlbmluZwovLyBhbWVuZG1lbnQgaXMgcmVmdXNlZCB3aXRoIEVyck5vQm91bmRhcnkgcmF0aGVyIHRoYW4gc2lsZW50bHkgcXVldWVkCi8vIGZvcmV2ZXIuIFBlcmlvZExlbmd0aCBpdHNlbGYgaXMgSU1NVVRBQkxFOiBjaGFuZ2luZyBpdCB3b3VsZCBtb3ZlIGV2ZXJ5Ci8vIGZ1dHVyZSBib3VuZGFyeSwgd2hpY2ggaXMgYW4gZW5sYXJnZW1lbnQgdmVjdG9yIHdlYXJpbmcgYSBkaWZmZXJlbnQgaGF0LgovLwovLyAjIFN0YXRlIGdyb3d0aAovLwovLyBSZXZva2VkIGFsbG93YW5jZXMgYXJlIHJlbW92ZWQsIG5vdCBhcmNoaXZlZC4gSURzIGFyZSBhbGxvY2F0ZWQKLy8gbW9ub3RvbmljYWxseSBhbmQgbmV2ZXIgcmV1c2VkLCBzbyBhIHJldm9rZWQgSUQgY2FuIG5ldmVyIGJlIHJlc3VycmVjdGVkCi8vIGFuZCB0aGVyZSBpcyBub3RoaW5nIHRvIGtlZXAuIExpdmUgYWxsb3dhbmNlcyBhcmUgY2FwcGVkIHBlciBCb29rIGF0Ci8vIGNvbnN0cnVjdGlvbiwgc28gc3RvcmFnZSBpcyBib3VuZGVkIGJ5IG1heExpdmUgcmVnYXJkbGVzcyBvZiBob3cgbWFueQovLyBhbGxvd2FuY2VzIGhhdmUgZXZlciBleGlzdGVkLiBBdWRpdCBoaXN0b3J5IGJlbG9uZ3MgaW4gdGhlIGNvbnN1bWluZwovLyByZWFsbSdzIGV2ZW50cy4KLy8KLy8gQW4gRVhQSVJFRCBhbGxvd2FuY2UgaXMgbm90IHNlbGYtcmVtb3ZpbmcsIGFuZCBib3VuZGVkIHN0b3JhZ2UgaXMgbm90IHRoZQovLyBzYW1lIGFzIGEgdXNhYmxlIEJvb2s6IFNwZW5kIHJlZnVzZXMgaXQgZm9yZXZlciB3aGlsZSBpdCBzdGlsbCBob2xkcyBhCi8vIHNsb3QuIFJlYXAgZXhpc3RzIGZvciBleGFjdGx5IHRoYXQgYW5kIGlzIHBlcm1pc3Npb25sZXNzLCBiZWNhdXNlIGFuCi8vIGV4cGlyZWQgYWxsb3dhbmNlIGNhbiBhdXRob3JpemUgbm90aGluZyBhbmQgc28gcmVtb3ZpbmcgaXQgdGFrZXMgbm90aGluZwovLyBmcm9tIGFueW9uZS4KLy8KLy8gV2hhdCB0aGlzIHBhY2thZ2UgZG9lcyBOT1QgYm91bmQgaXMgaG93IG1hbnkgb2YgYSBCb29rJ3Mgc2xvdHMgT05FIG93bmVyCi8vIG1heSBob2xkIOKAlCBtYXhMaXZlIGlzIGEgc2luZ2xlIGdsb2JhbCBmaWd1cmUsIHNvIGFueSBvd25lciBwZXJtaXR0ZWQgdG8KLy8gT3BlbiBjYW4gZXhoYXVzdCBpdCBhbmQgbG9jayBvdXQgdGhlIHJlc3QuIFRoYXQgaXMgYSBwb2xpY3kgcXVlc3Rpb24gd2l0aAovLyBubyBhbnN3ZXIgYSBwcmltaXRpdmUgY2FuIHBpY2sgKHBlci1vd25lciBxdW90YT8gZmlyc3QtY29tZT8gb3duZXIKLy8gd2hpdGVsaXN0PyksIHNvIGl0IGlzIGxlZnQgd2hlcmUgdGhlIGF1dGhlbnRpY2F0aW9uIGFscmVhZHkgbGl2ZXM6IHRoZQovLyBjb25zdW1pbmcgcmVhbG0gZGVjaWRlcyB3aG8gbWF5IE9wZW4sIGFuZCBhIEJvb2sgc2hhcmVkIGFjcm9zcyBtdXR1YWxseQovLyB1bnRydXN0aW5nIG93bmVycyBuZWVkcyBpdHMgb3duIHBlci1vd25lciBjYXAgb24gdG9wIG9mIHRoaXMgb25lLiBOYW1lZAovLyBoZXJlIHJhdGhlciB0aGFuIGltcGxpZWQsIGJlY2F1c2UgImJvdW5kZWQiIHJlYWRzIGxpa2UgInNhZmUgdG8gc2hhcmUiLgovLwovLyAjIENvbnN1bWVyIGNvbnRyYWN0ICh0aGUgcGFydHMgdGhlIHBhY2thZ2UgY2Fubm90IGVuZm9yY2UpCi8vCi8vICAxLiBTVVBQTFkgQSBSRUFMIENMT0NLLiBzcGVuZGJvb2sgY2Fubm90IHZlcmlmeSB0aGF0IGBub3dgIGNhbWUgZnJvbQovLyAgICAgcnVudGltZS5DaGFpbkhlaWdodCgpIG9yIHRpbWUuTm93KCkuVW5peCgpLiBBIHJlYWxtIHRoYXQgbGV0cyBhCi8vICAgICBjYWxsZXIgY2hvb3NlIGBub3dgIGhhcyBoYW5kZWQgdGhlIHNwZW5kZXIgdGhlIHBvd2VyIHRvIHJvbGwgdGhlCi8vICAgICB3aW5kb3cgYXQgd2lsbCwgd2hpY2ggZGVmZWF0cyBldmVyeSBjYXAgaW4gdGhpcyBwYWNrYWdlLiBQYXNzIHRoZQovLyAgICAgY2hhaW4ncyBvd24gY2xvY2ssIGFuZCB1c2UgdGhlIHNhbWUgdW5pdHMgZm9yIHRoZSBsaWZlIG9mIHRoZSBCb29rLgovLwovLyAgMi4gQVVUSEVOVElDQVRFIFRIRSBTUEVOREVSIEtFWS4gc3BlbmRib29rIGNvbXBhcmVzIHRoZSBrZXkgc3RyaW5nIGl0Ci8vICAgICBpcyBnaXZlbiBhZ2FpbnN0IHRoZSBvbmUgcmVjb3JkZWQgYXQgT3Blbi4gSXQgY2Fubm90IHRlbGwgd2hldGhlcgovLyAgICAgdGhhdCBzdHJpbmcgaXMgdGhlIHJlYWwgY2FsbGVyLiBEZXJpdmUgaXQgZnJvbQovLyAgICAgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpLCBuZXZlciBmcm9tIGFuIGFyZ3VtZW50IHRoZSBjYWxsZXIgc3VwcGxpZXMuCi8vCi8vICAzLiBTUEVORCBCRUZPUkUgU0VORElORy4gU3BlbmQgY29uc3VtZXMgdGhlIGFsbG93YW5jZSBhbmQgcmV0dXJuczsgdGhlCi8vICAgICByZWFsbSB0aGVuIG1vdmVzIGNvaW5zLiBEb2luZyBpdCBpbiB0aGUgb3RoZXIgb3JkZXIgbWVhbnMgYSBmYWlsZWQKLy8gICAgIHNlbmQgbGVhdmVzIHRoZSBhbGxvd2FuY2UgY29uc3VtZWQsIG9yIGEgc3VjY2Vzc2Z1bCBzZW5kIGxlYXZlcyBpdAovLyAgICAgdW5jb25zdW1lZCDigJQgYm90aCBhcmUgcmVhbCBsb3NzZXMuIFN0YXRlIGZpcnN0LCBlZmZlY3Qgc2Vjb25kLgovLwovLyAgNC4gQU4gQUxMT1dBTkNFIElTIE5PVCBDVVNUT0RZLiBzcGVuZGJvb2sgYXV0aG9yaXppbmcgMTAwIGRvZXMgbm90IG1lYW4KLy8gICAgIDEwMCBleGlzdHMuIFRoZSByZWFsbSBtdXN0IGNoZWNrIGl0cyBvd24gaGVsZCBiYWxhbmNlIHNlcGFyYXRlbHk7Ci8vICAgICB0aGlzIHBhY2thZ2UgYm91bmRzIHBlcm1pc3Npb24sIG5vdCBzb2x2ZW5jeS4KcGFja2FnZSBzcGVuZGJvb2sKCmltcG9ydCAoCgkiZXJyb3JzIgoJInN0cmNvbnYiCgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgopCgovLyBNYXhMaXZlTGltaXQgaXMgdGhlIGxhcmdlc3QgbWF4TGl2ZSBhIEJvb2sgbWF5IGJlIGNvbnN0cnVjdGVkIHdpdGguIEl0Ci8vIGJvdW5kcyB0aGUgd29yc3QtY2FzZSBjb3N0IG9mIEl0ZXJhdGUsIHdoaWNoIHNjYW5zIHRoZSBsaXZlIHNldC4KY29uc3QgTWF4TGl2ZUxpbWl0ID0gMTAwMDAKCi8vIE1heEtleUxlbiBib3VuZHMgYW4gb3duZXIgb3Igc3BlbmRlciBrZXkuIEEgYmVjaDMyIGdubyBhZGRyZXNzIGlzIDQwCi8vIGNoYXJhY3RlcnM7IHRoZSBoZWFkcm9vbSBleGlzdHMgc28gYSByZWFsbSBtYXkgbmFtZXNwYWNlIGl0cyBrZXlzLgpjb25zdCBNYXhLZXlMZW4gPSAxMjgKCi8vIG1heEludDY0IGlzIHRoZSBvdmVyZmxvdyBib3VuZGFyeSBmb3IgZXZlcnkgYWNjdW11bGF0aW9uIGhlcmUuCmNvbnN0IG1heEludDY0ID0gaW50NjQoMTw8NjMgLSAxKQoKLy8gRXJyb3JzIHJldHVybmVkIGJ5IEJvb2sgb3BlcmF0aW9ucy4KdmFyICgKCUVyckludmFsaWRDb25maWcgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBpbnZhbGlkIGJvb2sgY29uZmlndXJhdGlvbiIpCglFcnJFbXB0eU93bmVyICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogZW1wdHkgb3duZXIga2V5IikKCUVyckVtcHR5U3BlbmRlciAgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBlbXB0eSBzcGVuZGVyIGtleSIpCglFcnJLZXlUb29Mb25nICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazoga2V5IGV4Y2VlZHMgTWF4S2V5TGVuIikKCUVyckludmFsaWROb3cgICAgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBub3cgbXVzdCBiZSBub24tbmVnYXRpdmUiKQoJRXJySW52YWxpZFRlcm1zICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGludmFsaWQgdGVybXMiKQoJRXJySW52YWxpZEFtb3VudCAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIikKCUVyckJvb2tGdWxsICAgICAgID0gZXJyb3JzLk5ldygic3BlbmRib29rOiBsaXZlIGFsbG93YW5jZSBjYXAgcmVhY2hlZCIpCglFcnJOb3RGb3VuZCAgICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogbm8gc3VjaCBsaXZlIGFsbG93YW5jZSIpCglFcnJOb3RFeHBpcmVkICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogYWxsb3dhbmNlIGhhcyBub3QgZXhwaXJlZCIpCglFcnJOb3RPd25lciAgICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogY2FsbGVyIGRvZXMgbm90IG93biB0aGlzIGFsbG93YW5jZSIpCglFcnJOb3RTcGVuZGVyICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogY2FsbGVyIGlzIG5vdCB0aGlzIGFsbG93YW5jZSdzIHNwZW5kZXIiKQoJRXJyRXhwaXJlZCAgICAgICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGFsbG93YW5jZSBoYXMgZXhwaXJlZCIpCglFcnJOb3RTdGFydGVkICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogYWxsb3dhbmNlIGhhcyBub3Qgc3RhcnRlZCIpCglFcnJQZXJpb2RFeGNlZWRlZCA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogYW1vdW50IGV4Y2VlZHMgdGhlIHdpbmRvdyBjYXAiKQoJRXJyVG90YWxFeGNlZWRlZCAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGFtb3VudCBleGNlZWRzIHRoZSBsaWZldGltZSBjYXAiKQoJRXJyTm9Cb3VuZGFyeSAgICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IG5vIHJlYWNoYWJsZSBuZXh0IHdpbmRvdyBib3VuZGFyeSIpCglFcnJPdmVyZmxvdyAgICAgICA9IGVycm9ycy5OZXcoInNwZW5kYm9vazogaW50NjQgb3ZlcmZsb3ciKQoJRXJySURFeGhhdXN0ZWQgICAgPSBlcnJvcnMuTmV3KCJzcGVuZGJvb2s6IGlkZW50aWZpZXIgc3BhY2UgZXhoYXVzdGVkIikKKQoKLy8gVGVybXMgYXJlIHRoZSBjZWlsaW5ncyBvbiBhbiBhbGxvd2FuY2UuIFplcm8gaGFzIGEgZGlzdGluY3QgbWVhbmluZyBpbgovLyB0aHJlZSBvZiB0aGUgZm91ciBmaWVsZHMgYW5kIGl0IGlzIG5ldmVyICJ6ZXJvIGFsbG93ZWQiOgovLwovLwlQZXJQZXJpb2QgICAgPiAwIHJlcXVpcmVkLiBUaGUgY2FwIHBlciB3aW5kb3cuCi8vCVBlcmlvZExlbmd0aCAwIG1lYW5zIE9ORSB3aW5kb3cgdGhhdCBuZXZlciByb2xscyAobGlmZXRpbWUpLgovLwlUb3RhbCAgICAgICAgMCBtZWFucyBubyBsaWZldGltZSBjYXAuCi8vCUV4cGlyZXNBdCAgICAwIG1lYW5zIG5vIGV4cGlyeS4KdHlwZSBUZXJtcyBzdHJ1Y3QgewoJUGVyUGVyaW9kICAgIGludDY0CglQZXJpb2RMZW5ndGggaW50NjQKCVRvdGFsICAgICAgICBpbnQ2NAoJRXhwaXJlc0F0ICAgIGludDY0Cn0KCi8vIHZhbGlkIHJlcG9ydHMgd2hldGhlciB0aGUgdGVybXMgYXJlIHNlbGYtY29uc2lzdGVudCwgZ2l2ZW4gdGhlIGFuY2hvciB0aGUKLy8gYWxsb3dhbmNlIGlzIChvciB3b3VsZCBiZSkgb3BlbmVkIGF0LgpmdW5jICh0IFRlcm1zKSB2YWxpZChhbmNob3IgaW50NjQpIGJvb2wgewoJaWYgdC5QZXJQZXJpb2QgPD0gMCB8fCB0LlBlcmlvZExlbmd0aCA8IDAgfHwgdC5Ub3RhbCA8IDAgewoJCXJldHVybiBmYWxzZQoJfQoJaWYgdC5FeHBpcmVzQXQgPCAwIHsKCQlyZXR1cm4gZmFsc2UKCX0KCS8vIEFuIGFsbG93YW5jZSB0aGF0IGhhcyBhbHJlYWR5IGV4cGlyZWQgYXQgaXRzIG93biBhbmNob3IgY2FuIG5ldmVyCgkvLyBhdXRob3JpemUgYW55dGhpbmcsIHNvIGFjY2VwdGluZyBpdCB3b3VsZCBvbmx5IGNyZWF0ZSBhIGxpdmUgZW50cnkKCS8vIHRoYXQgZXZlcnkgU3BlbmQgcmVmdXNlcy4KCWlmIHQuRXhwaXJlc0F0ICE9IDAgJiYgdC5FeHBpcmVzQXQgPD0gYW5jaG9yIHsKCQlyZXR1cm4gZmFsc2UKCX0KCS8vIEEgVG90YWwgYmVsb3cgUGVyUGVyaW9kIGlzIG5vdCBhbiBlcnJvciAtLSBpdCBpcyBhIG5hcnJvd2VyIGxpZmV0aW1lCgkvLyBjYXAsIHdoaWNoIFNwZW5kIGVuZm9yY2VzLiBBIFRvdGFsIG9mIGV4YWN0bHkgMCBpcyAidW5saW1pdGVkIi4KCXJldHVybiB0cnVlCn0KCi8vIHRpZ2h0ZXJPckVxdWFsVG8gcmVwb3J0cyB3aGV0aGVyIHQgaXMgd2Vha2x5IHRpZ2h0ZXIgdGhhbiB1IGluIGV2ZXJ5Ci8vIGRpbWVuc2lvbiwgaS5lLiB3aGV0aGVyIHQgY2FuIGF1dGhvcml6ZSBub3RoaW5nIHUgd291bGQgbm90IGhhdmUuIFRoaXMgaXMKLy8gdGhlIHByZWRpY2F0ZSB0aGF0IGRlY2lkZXMgd2hldGhlciBhbiBhbWVuZG1lbnQgYXBwbGllcyBpbW1lZGlhdGVseS4KLy8KLy8gVGhlIHplcm8tbWVhbnMtdW5saW1pdGVkIGZpZWxkcyBpbnZlcnQgdGhlIGNvbXBhcmlzb24sIHdoaWNoIGlzIHRoZSB3aG9sZQovLyBzdWJ0bGV0eTogVG90YWwgMCBpcyBMT09TRVIgdGhhbiBhbnkgcG9zaXRpdmUgVG90YWwsIGFuZCBFeHBpcmVzQXQgMCBpcwovLyBMT09TRVIgdGhhbiBhbnkgcG9zaXRpdmUgRXhwaXJlc0F0LiBSZWFkaW5nIHRob3NlIHR3byBhcyAic21hbGxlciBpcwovLyB0aWdodGVyIiB3b3VsZCBsZXQgYW4gb3duZXIgcmVtb3ZlIGEgbGlmZXRpbWUgY2FwIGFuZCBhbiBleHBpcnkKLy8gbWlkLXdpbmRvdyBhbmQgY2FsbCBpdCBhIHRpZ2h0ZW5pbmcuCmZ1bmMgKHQgVGVybXMpIHRpZ2h0ZXJPckVxdWFsVG8odSBUZXJtcykgYm9vbCB7CglpZiB0LlBlcmlvZExlbmd0aCAhPSB1LlBlcmlvZExlbmd0aCB7CgkJcmV0dXJuIGZhbHNlIC8vIGltbXV0YWJsZTsgc2VlIHRoZSBwYWNrYWdlIGRvYwoJfQoJaWYgdC5QZXJQZXJpb2QgPiB1LlBlclBlcmlvZCB7CgkJcmV0dXJuIGZhbHNlCgl9Cglzd2l0Y2ggewoJY2FzZSB1LlRvdGFsID09IDA6CgkJLy8gdSB3YXMgdW5saW1pdGVkOyBhbnl0aGluZyBpcyB0aWdodGVyIG9yIGVxdWFsLgoJY2FzZSB0LlRvdGFsID09IDAgfHwgdC5Ub3RhbCA+IHUuVG90YWw6CgkJcmV0dXJuIGZhbHNlCgl9Cglzd2l0Y2ggewoJY2FzZSB1LkV4cGlyZXNBdCA9PSAwOgoJCS8vIHUgbmV2ZXIgZXhwaXJlZDsgYW55IGV4cGlyeSBpcyB0aWdodGVyIG9yIGVxdWFsLgoJY2FzZSB0LkV4cGlyZXNBdCA9PSAwIHx8IHQuRXhwaXJlc0F0ID4gdS5FeHBpcmVzQXQ6CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gdHJ1ZQp9CgovLyBBbGxvd2FuY2UgaXMgb25lIG93bmVyJ3MgZ3JhbnQgdG8gb25lIHNwZW5kZXIuIEl0IGlzIHJldHVybmVkIEJZIFZBTFVFOgovLyBob2xkZXJzIGNhbm5vdCByZWFjaCBpbnRvIGEgQm9vayB0aHJvdWdoIGl0Lgp0eXBlIEFsbG93YW5jZSBzdHJ1Y3QgewoJSUQgICAgICAgIHVpbnQ2NAoJT3duZXIgICAgIHN0cmluZwoJU3BlbmRlciAgIHN0cmluZwoJVGVybXMgICAgIFRlcm1zCglBbmNob3IgICAgaW50NjQgLy8gd2luZG93IG9yaWdpbjsgYWxzbyB0aGUgZWFybGllc3Qgc3BlbmRhYmxlIGluc3RhbnQKCUNyZWF0ZWRBdCBpbnQ2NAoKCVNwZW50VG90YWwgIGludDY0IC8vIG92ZXIgdGhlIGFsbG93YW5jZSdzIHdob2xlIGxpZmUKCVNwZW50V2luZG93IGludDY0IC8vIHdpdGhpbiBXaW5kb3dJbmRleAoJV2luZG93SW5kZXggaW50NjQKCgkvLyBQZW5kaW5nIHRlcm1zLCBhcHBsaWVkIGF0IHRoZSBuZXh0IHdpbmRvdyBib3VuZGFyeS4gTWVhbmluZ2Z1bCBvbmx5CgkvLyB3aGVuIEhhc1BlbmRpbmcgaXMgdHJ1ZS4KCVBlbmRpbmcgICAgVGVybXMKCUhhc1BlbmRpbmcgYm9vbAp9CgovLyBJc0V4cGlyZWQgcmVwb3J0cyB3aGV0aGVyIHRoZSBhbGxvd2FuY2UgaXMgcGFzdCBpdHMgZXhwaXJ5IGF0IG5vdy4gQW4KLy8gYWxsb3dhbmNlIHdpdGggbm8gZXhwaXJ5IGlzIG5ldmVyIGV4cGlyZWQuCmZ1bmMgKGEgQWxsb3dhbmNlKSBJc0V4cGlyZWQobm93IGludDY0KSBib29sIHsKCXJldHVybiBhLlRlcm1zLkV4cGlyZXNBdCAhPSAwICYmIG5vdyA+PSBhLlRlcm1zLkV4cGlyZXNBdAp9CgovLyB3aW5kb3dJbmRleCByZXR1cm5zIHRoZSBhbmNob3JlZCB3aW5kb3cgbnVtYmVyIGNvbnRhaW5pbmcgbm93LiBBIGxpZmV0aW1lCi8vIGFsbG93YW5jZSAoUGVyaW9kTGVuZ3RoID09IDApIGlzIGFsd2F5cyBpbiB3aW5kb3cgMC4KLy8KLy8gbm93IDwgQW5jaG9yIGNhbm5vdCByZWFjaCBoZXJlOiBldmVyeSBjYWxsZXIgcmVqZWN0cyBpdCBmaXJzdCB3aXRoCi8vIEVyck5vdFN0YXJ0ZWQsIHdoaWNoIGtlZXBzIHRoaXMgZGl2aXNpb24gYXdheSBmcm9tIG5lZ2F0aXZlIG51bWVyYXRvcnMKLy8gd2hlcmUgR28ncyB0cnVuY2F0aW9uLXRvd2FyZC16ZXJvIHdvdWxkIGZvbGQgdHdvIHdpbmRvd3MgaW50byBvbmUuCmZ1bmMgKGEgQWxsb3dhbmNlKSB3aW5kb3dJbmRleChub3cgaW50NjQpIGludDY0IHsKCWlmIGEuVGVybXMuUGVyaW9kTGVuZ3RoID09IDAgewoJCXJldHVybiAwCgl9CglyZXR1cm4gKG5vdyAtIGEuQW5jaG9yKSAvIGEuVGVybXMuUGVyaW9kTGVuZ3RoCn0KCi8vIG5leHRCb3VuZGFyeSByZXR1cm5zIHRoZSBpbnN0YW50IHdpbmRvdyBpZHgrMSBiZWdpbnMsIGFuZCB3aGV0aGVyIHRoYXQKLy8gaW5zdGFudCBpcyByZWFjaGFibGUgYXQgYWxsLgovLwovLyBVbnJlYWNoYWJsZSBoYXMgdGhyZWUgY2F1c2VzIGFuZCB0aGV5IGNvbGxhcHNlIHRvIHRoZSBzYW1lIGFuc3dlciwgd2hpY2ggaXMKLy8gd2h5IHRoaXMgcmV0dXJucyBhIGJvb2wgcmF0aGVyIHRoYW4gYW4gZXJyb3I6IGEgbGlmZXRpbWUgYWxsb3dhbmNlIGhhcyBubwovLyBib3VuZGFyeSBieSBjb25zdHJ1Y3Rpb24sIGFuZCBhbiBhcml0aG1ldGljYWxseSB1bnJlcHJlc2VudGFibGUgYm91bmRhcnkKLy8gKFBlcmlvZExlbmd0aCBzbyBsYXJnZSwgb3IgdGhlIGNsb2NrIHNvIGZhciBhbG9uZywgdGhhdCBBbmNob3IgKyBzdGVwcyAqCi8vIFBlcmlvZExlbmd0aCBvdmVyZmxvd3MgaW50NjQpIGlzIG9uZSBubyBjbG9jayB3aWxsIGV2ZXIgcmVhY2guIENvbXB1dGluZyBpdAovLyB1bmd1YXJkZWQgd291bGQgd3JhcCB0byBhIHNtYWxsIG51bWJlciBhbmQgcmVwb3J0IGEgYm91bmRhcnkgaW4gdGhlIFBBU1QsCi8vIHdoaWNoIGlzIHRoZSBkYW5nZXJvdXMgZGlyZWN0aW9uOiBBbWVuZCB3b3VsZCBxdWV1ZSBhIGxvb3NlbmluZyBhcyB0aG91Z2gKLy8gaXQgd2VyZSBhYm91dCB0byB0YWtlIGVmZmVjdC4KZnVuYyAoYSBBbGxvd2FuY2UpIG5leHRCb3VuZGFyeShpZHggaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJcGwgOj0gYS5UZXJtcy5QZXJpb2RMZW5ndGgKCWlmIHBsID09IDAgfHwgaWR4IDwgMCB8fCBpZHggPT0gbWF4SW50NjQgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJc3RlcHMgOj0gaWR4ICsgMQoJaWYgc3RlcHMgPiBtYXhJbnQ2NC9wbCB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglvZmYgOj0gc3RlcHMgKiBwbAoJaWYgb2ZmID4gbWF4SW50NjQtYS5BbmNob3IgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIGEuQW5jaG9yICsgb2ZmLCB0cnVlCn0KCi8vIGF0IGNvbXB1dGVzIHRoZSBhbGxvd2FuY2UncyBlZmZlY3RpdmUgc3RhdGUgYXQgbm93IFdJVEhPVVQgbXV0YXRpbmcgaXQ6Ci8vIHRoZSB0ZXJtcyBpbiBmb3JjZSwgdGhlIHdpbmRvdyBpdCBmYWxscyBpbiwgYW5kIGhvdyBtdWNoIGhhcyBiZWVuIHNwZW50Ci8vIHdpdGhpbiB0aGF0IHdpbmRvdy4KLy8KLy8gU3BlbmQgYW5kIFJlbWFpbmluZyBCT1RIIGdvIHRocm91Z2ggdGhpcyBvbmUgZnVuY3Rpb24uIFRoYXQgaXMgZGVsaWJlcmF0ZQovLyAtLSBhIHJlYWQgdGhhdCBhbnN3ZXJlZCAiaG93IG11Y2ggaXMgbGVmdCIgd2l0aCBpdHMgb3duIGNvcHkgb2YgdGhlCi8vIHJvbGxvdmVyIGFuZCBhbWVuZG1lbnQgbG9naWMgd291bGQgYmUgYSBzZWNvbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlCi8vIHJ1bGUsIGZyZWUgdG8gZGlzYWdyZWUgd2l0aCB0aGUgb25lIHRoYXQgZW5mb3JjZXMgaXQsIGFuZCB0aGUKLy8gZGlzYWdyZWVtZW50IHdvdWxkIHN1cmZhY2UgYXMgYW4gYWxsb3dhbmNlIHRoYXQgcmVwb3J0cyBtb3JlIHRoYW4gaXQKLy8gaG9ub3JzIChvciBob25vcnMgbW9yZSB0aGFuIGl0IHJlcG9ydHMpLgpmdW5jIChhIEFsbG93YW5jZSkgYXQobm93IGludDY0KSAoVGVybXMsIGludDY0LCBpbnQ2NCkgewoJaWR4IDo9IGEud2luZG93SW5kZXgobm93KQoJaWYgaWR4ID09IGEuV2luZG93SW5kZXggewoJCXJldHVybiBhLlRlcm1zLCBpZHgsIGEuU3BlbnRXaW5kb3cKCX0KCS8vIFRoZSB3aW5kb3cgaGFzIHJvbGxlZC4gQSBwZW5kaW5nIGFtZW5kbWVudCB0YWtlcyBlZmZlY3QgZXhhY3RseSBoZXJlLAoJLy8gYW5kIHRoZSBpbi13aW5kb3cgc3BlbmQgcmVzZXRzIC0tIGl0IGRvZXMgbm90IGNhcnJ5LgoJdGVybXMgOj0gYS5UZXJtcwoJaWYgYS5IYXNQZW5kaW5nIHsKCQl0ZXJtcyA9IGEuUGVuZGluZwoJfQoJcmV0dXJuIHRlcm1zLCBpZHgsIDAKfQoKLy8gUmVtYWluaW5nIHJlcG9ydHMgaG93IG11Y2ggdGhlIHNwZW5kZXIgbWF5IGRyYXcgcmlnaHQgbm93OiB0aGUgbGVzc2VyIG9mCi8vIHdoYXQgdGhlIGN1cnJlbnQgd2luZG93IGxlYXZlcyBhbmQgd2hhdCB0aGUgbGlmZXRpbWUgY2FwIGxlYXZlcy4gSXQgaXMgMAovLyBmb3IgYW4gYWxsb3dhbmNlIHRoYXQgaXMgZXhwaXJlZCwgbm90IHlldCBzdGFydGVkLCBvciBmdWxseSBkcmF3bi4KLy8KLy8gSXQgaXMgYSBwcm9qZWN0aW9uLCBub3QgYSByZXNlcnZhdGlvbi4gTm90aGluZyBpcyBoZWxkLCBhbmQgdGhlIGZpZ3VyZSBjYW4KLy8gY2hhbmdlIGluIHRoZSBzYW1lIGJsb2NrIGlmIHNvbWVvbmUgZWxzZSdzIGNhbGwgYWR2YW5jZXMgdGhlIGNsb2NrIHBhc3QgYQovLyBib3VuZGFyeS4KZnVuYyAoYSBBbGxvd2FuY2UpIFJlbWFpbmluZyhub3cgaW50NjQpIGludDY0IHsKCWlmIG5vdyA8IGEuQW5jaG9yIHx8IGEuSXNFeHBpcmVkKG5vdykgewoJCXJldHVybiAwCgl9Cgl0ZXJtcywgXywgc3BlbnRXaW5kb3cgOj0gYS5hdChub3cpCglsZWZ0IDo9IHRlcm1zLlBlclBlcmlvZCAtIHNwZW50V2luZG93CglpZiBsZWZ0IDwgMCB7CgkJLy8gUmVhY2hhYmxlOiBhIHRpZ2h0ZW5pbmcgYW1lbmRtZW50IGNhbiBkcm9wIFBlclBlcmlvZCBiZWxvdyB3aGF0CgkJLy8gdGhlIHdpbmRvdyBhbHJlYWR5IHNwZW50LiBUaGUgYWxsb3dhbmNlIGlzIGRyYXduLCBub3QgbmVnYXRpdmUuCgkJbGVmdCA9IDAKCX0KCWlmIHRlcm1zLlRvdGFsICE9IDAgewoJCWxpZmVMZWZ0IDo9IHRlcm1zLlRvdGFsIC0gYS5TcGVudFRvdGFsCgkJaWYgbGlmZUxlZnQgPCAwIHsKCQkJbGlmZUxlZnQgPSAwCgkJfQoJCWlmIGxpZmVMZWZ0IDwgbGVmdCB7CgkJCWxlZnQgPSBsaWZlTGVmdAoJCX0KCX0KCXJldHVybiBsZWZ0Cn0KCi8vIEJvb2sgaG9sZHMgdGhlIGxpdmUgYWxsb3dhbmNlcyBvZiBvbmUgY29uc3VtaW5nIHJlYWxtLiBUaGUgemVybyB2YWx1ZSBpcwovLyBub3QgdXNhYmxlOyBjb25zdHJ1Y3Qgd2l0aCBOZXcuCnR5cGUgQm9vayBzdHJ1Y3QgewoJbWF4TGl2ZSBpbnQKCW5leHRJRCAgdWludDY0ICAgIC8vIG5ldmVyIGRlY3JlYXNlczsgSURzIGFyZSBuZXZlciByZXVzZWQKCWxpdmUgICAgKmF2bC5UcmVlIC8vIHBhZGRlZCBpZCAtPiBBbGxvd2FuY2UKfQoKLy8gTmV3IHJldHVybnMgYW4gZW1wdHkgQm9vay4gbWF4TGl2ZSBjYXBzIHNpbXVsdGFuZW91c2x5IGxpdmUgYWxsb3dhbmNlcwovLyBhbmQgbXVzdCBiZSBpbiBbMSwgTWF4TGl2ZUxpbWl0XS4KZnVuYyBOZXcobWF4TGl2ZSBpbnQpICgqQm9vaywgZXJyb3IpIHsKCWlmIG1heExpdmUgPCAxIHx8IG1heExpdmUgPiBNYXhMaXZlTGltaXQgewoJCXJldHVybiBuaWwsIEVyckludmFsaWRDb25maWcKCX0KCXJldHVybiAmQm9va3ttYXhMaXZlOiBtYXhMaXZlLCBuZXh0SUQ6IDEsIGxpdmU6IGF2bC5OZXdUcmVlKCl9LCBuaWwKfQoKLy8gTXVzdE5ldyBpcyBOZXcgYnV0IHBhbmljcyBvbiBlcnJvci4KZnVuYyBNdXN0TmV3KG1heExpdmUgaW50KSAqQm9vayB7CgliLCBlcnIgOj0gTmV3KG1heExpdmUpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYyhlcnIpCgl9CglyZXR1cm4gYgp9CgovLyBNYXhMaXZlIHJldHVybnMgdGhlIEJvb2sncyBjYXAgb24gc2ltdWx0YW5lb3VzbHkgbGl2ZSBhbGxvd2FuY2VzLgpmdW5jIChiICpCb29rKSBNYXhMaXZlKCkgaW50IHsgcmV0dXJuIGIubWF4TGl2ZSB9CgovLyBDb3VudCByZXR1cm5zIHRoZSBudW1iZXIgb2YgbGl2ZSBhbGxvd2FuY2VzLgpmdW5jIChiICpCb29rKSBDb3VudCgpIGludCB7IHJldHVybiBiLmxpdmUuU2l6ZSgpIH0KCi8vIGtleSBwYWRzIGFuIGlkIHRvIGEgZml4ZWQgd2lkdGggc28gYXZsJ3MgbGV4aWNhbCBvcmRlciBtYXRjaGVzIG51bWVyaWMKLy8gb3JkZXIuIDIwIGRpZ2l0cyBjb3ZlcnMgdGhlIHdob2xlIHVpbnQ2NCByYW5nZS4KZnVuYyBrZXkoaWQgdWludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdFVpbnQoaWQsIDEwKQoJZm9yIGxlbihzKSA8IDIwIHsKCQlzID0gIjAiICsgcwoJfQoJcmV0dXJuIHMKfQoKZnVuYyBjaGVja0tleXMob3duZXIsIHNwZW5kZXIgc3RyaW5nKSBlcnJvciB7CglpZiBvd25lciA9PSAiIiB7CgkJcmV0dXJuIEVyckVtcHR5T3duZXIKCX0KCWlmIHNwZW5kZXIgPT0gIiIgewoJCXJldHVybiBFcnJFbXB0eVNwZW5kZXIKCX0KCWlmIGxlbihvd25lcikgPiBNYXhLZXlMZW4gfHwgbGVuKHNwZW5kZXIpID4gTWF4S2V5TGVuIHsKCQlyZXR1cm4gRXJyS2V5VG9vTG9uZwoJfQoJcmV0dXJuIG5pbAp9CgovLyBPcGVuIHJlY29yZHMgYSBuZXcgYWxsb3dhbmNlIGFuZCByZXR1cm5zIGl0cyBpZC4gbm93IGJlY29tZXMgdGhlIHdpbmRvdwovLyBhbmNob3IgYW5kIHRoZSBlYXJsaWVzdCBpbnN0YW50IHRoZSBzcGVuZGVyIG1heSBkcmF3LgovLwovLyBBbiBvd25lciBtYXkgb3BlbiBzZXZlcmFsIGFsbG93YW5jZXMgZm9yIHRoZSBzYW1lIHNwZW5kZXI7IHRoZXkgYXJlCi8vIGluZGVwZW5kZW50LCBhbmQgdGhlIGlkcyBhcmUgd2hhdCB0ZWxsIHRoZW0gYXBhcnQuIHNwZW5kYm9vayBkb2VzIG5vdAovLyBtZXJnZSBvciBkZWR1cGxpY2F0ZSB0aGVtLCBiZWNhdXNlICJvbmUgYWxsb3dhbmNlIHBlciBwYWlyIiBpcyBhIHBvbGljeQovLyBzb21lIGNvbnN1bWluZyByZWFsbXMgd2FudCBhbmQgb3RoZXJzIGRvIG5vdCwgYW5kIGEgcHJpbWl0aXZlIHRoYXQKLy8gZGVjaWRlZCBpdCBoZXJlIGNvdWxkIG5vdCBiZSB0YWxrZWQgb3V0IG9mIGl0LgpmdW5jIChiICpCb29rKSBPcGVuKG93bmVyLCBzcGVuZGVyIHN0cmluZywgbm93IGludDY0LCB0ZXJtcyBUZXJtcykgKHVpbnQ2NCwgZXJyb3IpIHsKCWlmIGVyciA6PSBjaGVja0tleXMob3duZXIsIHNwZW5kZXIpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gMCwgZXJyCgl9CglpZiBub3cgPCAwIHsKCQlyZXR1cm4gMCwgRXJySW52YWxpZE5vdwoJfQoJaWYgIXRlcm1zLnZhbGlkKG5vdykgewoJCXJldHVybiAwLCBFcnJJbnZhbGlkVGVybXMKCX0KCWlmIGIubGl2ZS5TaXplKCkgPj0gYi5tYXhMaXZlIHsKCQlyZXR1cm4gMCwgRXJyQm9va0Z1bGwKCX0KCWlmIGIubmV4dElEID09IDAgewoJCXJldHVybiAwLCBFcnJJREV4aGF1c3RlZAoJfQoJaWQgOj0gYi5uZXh0SUQKCWIubmV4dElEKysKCWIubGl2ZS5TZXQoa2V5KGlkKSwgQWxsb3dhbmNlewoJCUlEOiAgICAgICAgaWQsCgkJT3duZXI6ICAgICBvd25lciwKCQlTcGVuZGVyOiAgIHNwZW5kZXIsCgkJVGVybXM6ICAgICB0ZXJtcywKCQlBbmNob3I6ICAgIG5vdywKCQlDcmVhdGVkQXQ6IG5vdywKCX0pCglyZXR1cm4gaWQsIG5pbAp9CgovLyBnZXQgZmV0Y2hlcyBhIGxpdmUgYWxsb3dhbmNlIGJ5IGlkLgovLwovLyBhdmwncyBHZXQgcmV0dXJucyBhIGJhcmUgYGFueWAgd2l0aCBubyBmb3VuZCBmbGFnLCBzbyBhYnNlbmNlIGlzIGEgbmlsCi8vIHZhbHVlLiBUaGF0IGlzIHNvdW5kIGhlcmUgb25seSBiZWNhdXNlIG5vdGhpbmcgbmlsIGlzIGV2ZXIgc3RvcmVkOiBTZXQgaXMKLy8gY2FsbGVkIGluIGV4YWN0bHkgdGhyZWUgcGxhY2VzIGFuZCBhbGwgdGhyZWUgcGFzcyBhbiBBbGxvd2FuY2UgdmFsdWUuCmZ1bmMgKGIgKkJvb2spIGdldChpZCB1aW50NjQpIChBbGxvd2FuY2UsIGJvb2wpIHsKCXYgOj0gYi5saXZlLkdldChrZXkoaWQpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBBbGxvd2FuY2V7fSwgZmFsc2UKCX0KCWEsIG9rIDo9IHYuKEFsbG93YW5jZSkKCWlmICFvayB7CgkJcmV0dXJuIEFsbG93YW5jZXt9LCBmYWxzZQoJfQoJcmV0dXJuIGEsIHRydWUKfQoKLy8gR2V0IHJldHVybnMgYSBjb3B5IG9mIGEgbGl2ZSBhbGxvd2FuY2UuCmZ1bmMgKGIgKkJvb2spIEdldChpZCB1aW50NjQpIChBbGxvd2FuY2UsIGVycm9yKSB7CglhLCBvayA6PSBiLmdldChpZCkKCWlmICFvayB7CgkJcmV0dXJuIEFsbG93YW5jZXt9LCBFcnJOb3RGb3VuZAoJfQoJcmV0dXJuIGEsIG5pbAp9CgovLyBSZW1haW5pbmcgcmVwb3J0cyB3aGF0IHRoZSBzcGVuZGVyIG9mIGlkIG1heSBkcmF3IGF0IG5vdywgb3IgMCBpZiB0aGVyZQovLyBpcyBubyBzdWNoIGxpdmUgYWxsb3dhbmNlLiBBIGNhbGxlciB0aGF0IG11c3QgZGlzdGluZ3Vpc2ggIm5vdGhpbmcgbGVmdCIKLy8gZnJvbSAibm8gc3VjaCBhbGxvd2FuY2UiIHNob3VsZCB1c2UgR2V0LgpmdW5jIChiICpCb29rKSBSZW1haW5pbmcoaWQgdWludDY0LCBub3cgaW50NjQpIGludDY0IHsKCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIGEuUmVtYWluaW5nKG5vdykKfQoKLy8gU3BlbmQgY29uc3VtZXMgYW1vdW50IGZyb20gYWxsb3dhbmNlIGlkIG9uIGJlaGFsZiBvZiBzcGVuZGVyIGFuZCByZXR1cm5zCi8vIG5pbCBpZiBldmVyeSBib3VuZCBwZXJtaXRzIGl0LiBUaGUgY2FsbGVyIHRoZW4gcGVyZm9ybXMgaXRzIG93biBlZmZlY3QuCi8vCi8vIE9uIGFueSBlcnJvciBOT1RISU5HIGlzIGNvbnN1bWVkLiBUaGUgd3JpdGUgaGFwcGVucyBvbmNlLCBhZnRlciB0aGUgbGFzdAovLyBjaGVjaywgc28gYSByZWZ1c2VkIFNwZW5kIGxlYXZlcyB0aGUgYm9vayBleGFjdGx5IGFzIGl0IHdhcy4KZnVuYyAoYiAqQm9vaykgU3BlbmQoaWQgdWludDY0LCBzcGVuZGVyIHN0cmluZywgbm93IGludDY0LCBhbW91bnQgaW50NjQpIGVycm9yIHsKCWlmIG5vdyA8IDAgewoJCXJldHVybiBFcnJJbnZhbGlkTm93Cgl9CglpZiBhbW91bnQgPD0gMCB7CgkJcmV0dXJuIEVyckludmFsaWRBbW91bnQKCX0KCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gRXJyTm90Rm91bmQKCX0KCWlmIGEuU3BlbmRlciAhPSBzcGVuZGVyIHsKCQlyZXR1cm4gRXJyTm90U3BlbmRlcgoJfQoJaWYgbm93IDwgYS5BbmNob3IgewoJCXJldHVybiBFcnJOb3RTdGFydGVkCgl9CglpZiBhLklzRXhwaXJlZChub3cpIHsKCQlyZXR1cm4gRXJyRXhwaXJlZAoJfQoKCXRlcm1zLCBpZHgsIHNwZW50V2luZG93IDo9IGEuYXQobm93KQoKCS8vIFdpbmRvdyBjYXAuIENoZWNrZWQgYXMgYSBzdWJ0cmFjdGlvbiBzbyB0aGUgc3VtIGNhbm5vdCBvdmVyZmxvdzoKCS8vIHNwZW50V2luZG93IGFuZCBQZXJQZXJpb2QgYXJlIGJvdGggPj0gMCBhbmQgUGVyUGVyaW9kID4gMC4KCWlmIGFtb3VudCA+IHRlcm1zLlBlclBlcmlvZC1zcGVudFdpbmRvdyB7CgkJcmV0dXJuIEVyclBlcmlvZEV4Y2VlZGVkCgl9CgkvLyBMaWZldGltZSBjYXAuCglpZiB0ZXJtcy5Ub3RhbCAhPSAwICYmIGFtb3VudCA+IHRlcm1zLlRvdGFsLWEuU3BlbnRUb3RhbCB7CgkJcmV0dXJuIEVyclRvdGFsRXhjZWVkZWQKCX0KCS8vIFNwZW50VG90YWwgaXMgdW5ib3VuZGVkIHdoZW4gVG90YWwgPT0gMCwgc28gaXQgaXMgdGhlIG9uZQoJLy8gYWNjdW11bGF0aW9uIHRoYXQgY2FuIGdlbnVpbmVseSByZWFjaCB0aGUgaW50NjQgY2VpbGluZy4KCWlmIGEuU3BlbnRUb3RhbCA+IG1heEludDY0LWFtb3VudCB7CgkJcmV0dXJuIEVyck92ZXJmbG93Cgl9CgoJYS5UZXJtcyA9IHRlcm1zCglpZiBpZHggIT0gYS5XaW5kb3dJbmRleCB7CgkJYS5IYXNQZW5kaW5nID0gZmFsc2UKCQlhLlBlbmRpbmcgPSBUZXJtc3t9Cgl9CglhLldpbmRvd0luZGV4ID0gaWR4CglhLlNwZW50V2luZG93ID0gc3BlbnRXaW5kb3cgKyBhbW91bnQKCWEuU3BlbnRUb3RhbCArPSBhbW91bnQKCWIubGl2ZS5TZXQoa2V5KGlkKSwgYSkKCXJldHVybiBuaWwKfQoKLy8gUmV2b2tlIHJlbW92ZXMgYW4gYWxsb3dhbmNlLiBPbmx5IGl0cyBvd25lciBtYXkgcmV2b2tlLCBhbmQgaXQgdGFrZXMKLy8gZWZmZWN0IGltbWVkaWF0ZWx5IC0tIHRoZXJlIGlzIG5vIHdpbmRvdyB0byB3YWl0IGZvciwgYmVjYXVzZSByZXZvY2F0aW9uCi8vIGlzIHRoZSBvd25lcidzIHJlbWVkeSBhbmQgYSBkZWxheWVkIHJlbWVkeSBpcyBub3Qgb25lLgovLwovLyBUaGUgaWQgaXMgbm90IHJldXNlZCwgc28gYSByZXZva2VkIGFsbG93YW5jZSBjYW5ub3QgYmUgcmVzdXJyZWN0ZWQ6IGEKLy8gbGF0ZXIgU3BlbmQgb24gaXQgcmV0dXJucyBFcnJOb3RGb3VuZCBmb3JldmVyLgpmdW5jIChiICpCb29rKSBSZXZva2UoaWQgdWludDY0LCBvd25lciBzdHJpbmcpIGVycm9yIHsKCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gRXJyTm90Rm91bmQKCX0KCWlmIGEuT3duZXIgIT0gb3duZXIgewoJCXJldHVybiBFcnJOb3RPd25lcgoJfQoJYi5saXZlLlJlbW92ZShrZXkoaWQpKQoJcmV0dXJuIG5pbAp9CgovLyBBbWVuZCBjaGFuZ2VzIGFuIGFsbG93YW5jZSdzIHRlcm1zLiBPbmx5IGl0cyBvd25lciBtYXkgYW1lbmQuCi8vCi8vIFBlcmlvZExlbmd0aCBpcyBpbW11dGFibGUgYW5kIG11c3QgYmUgcGFzc2VkIHVuY2hhbmdlZC4gVGVybXMgdGhhdCBhcmUKLy8gd2Vha2x5IHRpZ2h0ZXIgaW4gZXZlcnkgZGltZW5zaW9uIGFwcGx5IGltbWVkaWF0ZWx5OyBhbnl0aGluZyBsb29zZXIKLy8gYmVjb21lcyBwZW5kaW5nIGFuZCB0YWtlcyBlZmZlY3QgYXQgdGhlIG5leHQgd2luZG93IGJvdW5kYXJ5LiBBIGxpZmV0aW1lCi8vIGFsbG93YW5jZSBoYXMgbm8gbmV4dCBib3VuZGFyeSwgc28gYSBsb29zZW5pbmcgYW1lbmRtZW50IG9uIG9uZSBpcwovLyByZWZ1c2VkIHdpdGggRXJyTm9Cb3VuZGFyeS4KLy8KLy8gVGhlIHJldHVybmVkIGJvb2wgcmVwb3J0cyB3aGV0aGVyIHRoZSBhbWVuZG1lbnQgYXBwbGllZCBpbW1lZGlhdGVseQovLyAodHJ1ZSkgb3Igd2FzIHF1ZXVlZCAoZmFsc2UpLiBBIGNhbGxlciB0aGF0IGlnbm9yZXMgaXQgY2Fubm90IHRlbGwKLy8gd2hldGhlciB0aGUgbmV3IGNlaWxpbmcgaXMgaW4gZm9yY2UsIHdoaWNoIGlzIGV4YWN0bHkgdGhlIHRoaW5nIHdvcnRoCi8vIGtub3dpbmcuCmZ1bmMgKGIgKkJvb2spIEFtZW5kKGlkIHVpbnQ2NCwgb3duZXIgc3RyaW5nLCBub3cgaW50NjQsIHRlcm1zIFRlcm1zKSAoYm9vbCwgZXJyb3IpIHsKCWlmIG5vdyA8IDAgewoJCXJldHVybiBmYWxzZSwgRXJySW52YWxpZE5vdwoJfQoJYSwgb2sgOj0gYi5nZXQoaWQpCglpZiAhb2sgewoJCXJldHVybiBmYWxzZSwgRXJyTm90Rm91bmQKCX0KCWlmIGEuT3duZXIgIT0gb3duZXIgewoJCXJldHVybiBmYWxzZSwgRXJyTm90T3duZXIKCX0KCWlmIG5vdyA8IGEuQW5jaG9yIHsKCQlyZXR1cm4gZmFsc2UsIEVyck5vdFN0YXJ0ZWQKCX0KCWlmIGEuSXNFeHBpcmVkKG5vdykgewoJCXJldHVybiBmYWxzZSwgRXJyRXhwaXJlZAoJfQoJLy8gVmFsaWRhdGVkIGFnYWluc3QgdGhlIEFOQ0hPUiByYXRoZXIgdGhhbiBub3csIHdoaWNoIGlzIHRoZSBMT09TRVIgb2YKCS8vIHRoZSB0d28gYW5kIGlzIGRlbGliZXJhdGUuIHZhbGlkKCkgb25seSBuZWVkcyBFeHBpcmVzQXQgdG8gYmUgYWZ0ZXIgdGhlCgkvLyB3aW5kb3cgb3JpZ2luOyBhbiBvd25lciBuYW1pbmcgYW4gZXhwaXJ5IGJldHdlZW4gdGhlIGFuY2hvciBhbmQgbm93IGlzCgkvLyB0aWdodGVuaW5nIHRoZSBhbGxvd2FuY2UgdW50aWwgaXQgaXMgZGVhZCwgd2hpY2ggaXMgdGhlaXIgcHJlcm9nYXRpdmUuCgkvLyBSZXZva2UgaXMgdGhlIGNsZWFuZXIgd2F5IHRvIHNheSB0aGF0LCBhbmQgUmVhcCB0aGVuIHJlY2xhaW1zIHRoZSBzbG90LgoJaWYgIXRlcm1zLnZhbGlkKGEuQW5jaG9yKSB7CgkJcmV0dXJuIGZhbHNlLCBFcnJJbnZhbGlkVGVybXMKCX0KCWlmIHRlcm1zLlBlcmlvZExlbmd0aCAhPSBhLlRlcm1zLlBlcmlvZExlbmd0aCB7CgkJcmV0dXJuIGZhbHNlLCBFcnJJbnZhbGlkVGVybXMKCX0KCgkvLyBSb2xsIHRoZSB3aW5kb3cgZmlyc3QgaWYgdGhlIGNsb2NrIGhhcyBtb3ZlZCBwYXN0IGEgYm91bmRhcnksIHNvIGFuCgkvLyBhbWVuZG1lbnQgbWFkZSBhZnRlciBhIHF1aWV0IHN0cmV0Y2ggaXMganVkZ2VkIGFnYWluc3QgdGhlIHRlcm1zCgkvLyBhY3R1YWxseSBpbiBmb3JjZSByYXRoZXIgdGhhbiB0aGUgb25lcyBhIHN0YWxlIHJlY29yZCBzdGlsbCBob2xkcy4KCWN1ciwgaWR4LCBzcGVudFdpbmRvdyA6PSBhLmF0KG5vdykKCWlmIGlkeCAhPSBhLldpbmRvd0luZGV4IHsKCQlhLlRlcm1zID0gY3VyCgkJYS5XaW5kb3dJbmRleCA9IGlkeAoJCWEuU3BlbnRXaW5kb3cgPSBzcGVudFdpbmRvdwoJCWEuSGFzUGVuZGluZyA9IGZhbHNlCgkJYS5QZW5kaW5nID0gVGVybXN7fQoJfQoKCWlmIHRlcm1zLnRpZ2h0ZXJPckVxdWFsVG8oYS5UZXJtcykgewoJCWEuVGVybXMgPSB0ZXJtcwoJCS8vIEEgdGlnaHRlbmluZyBzdXBlcnNlZGVzIGEgcXVldWVkIGxvb3NlbmluZy4gTGVhdmluZyBpdCBxdWV1ZWQKCQkvLyB3b3VsZCBtZWFuIHRoZSBvd25lcidzIHRpZ2h0ZW5pbmcgc2lsZW50bHkgZXhwaXJlcyBhdCB0aGUgbmV4dAoJCS8vIGJvdW5kYXJ5IGFuZCB0aGUgbG9vc2VyIHRlcm1zIHRoZXkganVzdCByZXBsYWNlZCBjb21lIGJhY2suCgkJYS5IYXNQZW5kaW5nID0gZmFsc2UKCQlhLlBlbmRpbmcgPSBUZXJtc3t9CgkJYi5saXZlLlNldChrZXkoaWQpLCBhKQoJCXJldHVybiB0cnVlLCBuaWwKCX0KCgkvLyBBIGxvb3NlbmluZyBpcyBvbmx5IHF1ZXVlYWJsZSBpZiB0aGUgYm91bmRhcnkgaXQgd2FpdHMgZm9yIHdpbGwgYXJyaXZlCgkvLyB3aGlsZSB0aGUgYWxsb3dhbmNlIGlzIHN0aWxsIGFsaXZlLiBRdWV1ZWluZyBvbmUgdGhhdCBjYW5ub3QgYmUgcmVhY2hlZAoJLy8gd291bGQgcmVwb3J0ICJhY2NlcHRlZCwgcGVuZGluZyIgZm9yIHRlcm1zIHRoYXQgbmV2ZXIgdGFrZSBlZmZlY3QgLS0KCS8vIHRoZSBvd25lcidzIGFtZW5kbWVudCBzaWxlbnRseSBkaXNjYXJkZWQsIHdoaWNoIGlzIHRoZSBmYWlsdXJlIG1vZGUKCS8vIHRoaXMgcGFja2FnZSBpcyBsZWFzdCBhYmxlIHRvIGV4cGxhaW4gYWZ0ZXIgdGhlIGZhY3QuCgkvLwoJLy8gVHdvIHdheXMgaXQgaXMgdW5yZWFjaGFibGUuIFRoZSBhbGxvd2FuY2UgaGFzIG5vIGJvdW5kYXJ5IGF0IGFsbAoJLy8gKFBlcmlvZExlbmd0aCA9PSAwLCBvciBhbiB1bnJlcHJlc2VudGFibGUgb25lKSwgb3IgdGhlIGN1cnJlbnQgdGVybXMKCS8vIGV4cGlyZSBhdCBvciBiZWZvcmUgdGhlIG5leHQgYm91bmRhcnkuIFRoZSBzZWNvbmQgaXMgcmVhY2hhYmxlIGluCgkvLyBvcmRpbmFyeSB1c2U6IGEgdGlnaHRlbmluZyBvZiBFeHBpcmVzQXQgYXBwbGllcyBJTU1FRElBVEVMWSwgc28gYW4KCS8vIG93bmVyIGNhbiB0aWdodGVuIHRoZSBleHBpcnkgYmVsb3cgdGhlIG5leHQgYm91bmRhcnkgYW5kIHRoZW4gbG9vc2VuCgkvLyBQZXJQZXJpb2QsIGFuZCB3aXRob3V0IHRoaXMgY2hlY2sgdGhlIHNlY29uZCBjYWxsIHdvdWxkIGJlIGFjY2VwdGVkCgkvLyBhZ2FpbnN0IGEgd2luZG93IHRoYXQgbmV2ZXIgb3BlbnMuCgluYiwgb2sgOj0gYS5uZXh0Qm91bmRhcnkoYS5XaW5kb3dJbmRleCkKCWlmICFvayB7CgkJcmV0dXJuIGZhbHNlLCBFcnJOb0JvdW5kYXJ5Cgl9CglpZiBhLlRlcm1zLkV4cGlyZXNBdCAhPSAwICYmIG5iID49IGEuVGVybXMuRXhwaXJlc0F0IHsKCQlyZXR1cm4gZmFsc2UsIEVyck5vQm91bmRhcnkKCX0KCWEuUGVuZGluZyA9IHRlcm1zCglhLkhhc1BlbmRpbmcgPSB0cnVlCgliLmxpdmUuU2V0KGtleShpZCksIGEpCglyZXR1cm4gZmFsc2UsIG5pbAp9CgovLyBSZWFwIHJlbW92ZXMgYW4gYWxsb3dhbmNlIHRoYXQgaGFzIGV4cGlyZWQgYXQgbm93LCBhbmQgbWF5IGJlIGNhbGxlZCBieQovLyBhbnlvbmUuIEl0IHJldHVybnMgRXJyTm90Rm91bmQgZm9yIGFuIHVua25vd24gaWQgYW5kIEVyck5vdEV4cGlyZWQgZm9yIG9uZQovLyB0aGF0IGlzIHN0aWxsIGFsaXZlLgovLwovLyBQZXJtaXNzaW9ubGVzcyBvbiBwdXJwb3NlLCBhbmQgdGhlIHJlYXNvbmluZyBpcyB0aGUgd2hvbGUganVzdGlmaWNhdGlvbjoKLy8gYW4gZXhwaXJlZCBhbGxvd2FuY2UgY2FuIG5ldmVyIGF1dGhvcml6ZSBhbm90aGVyIGRyYXcsIHNvIHJlbW92aW5nIGl0IHRha2VzCi8vIG5vdGhpbmcgZnJvbSB0aGUgb3duZXIgYW5kIGdyYW50cyBub3RoaW5nIHRvIHRoZSBjYWxsZXIuIFdpdGhvdXQgaXQgYW4KLy8gZXhwaXJ5IGlzIGEgc2xvdyBsZWFrIGFnYWluc3QgbWF4TGl2ZSAtLSBTcGVuZCByZWZ1c2VzIHRoZSBkZWFkIGFsbG93YW5jZQovLyBmb3JldmVyIHdoaWxlIGl0IGhvbGRzIGEgc2xvdCwgc28gYSBCb29rIHNoYXJlZCBiZXR3ZWVuIG93bmVycyBjb3VsZCBmaWxsCi8vIHdpdGggY29ycHNlcyBhbmQgcmVmdXNlIG5ldyBPcGVucywgYW5kIHRoZSBvbmx5IHJlbWVkeSB3b3VsZCBiZSB0aGUgb3duZXIKLy8gb2YgZWFjaCBjb3Jwc2Ugbm90aWNpbmcgYW5kIGNhbGxpbmcgUmV2b2tlLgovLwovLyBUaGlzIHJlbGllcyBvbiBgbm93YCBleGFjdGx5IGFzIG11Y2ggYXMgU3BlbmQgZG9lcy4gQSByZWFsbSB0aGF0IGxldHMgYQovLyBjYWxsZXIgY2hvb3NlIGBub3dgIGhhcyBhbHJlYWR5IGJyb2tlbiBjb25zdW1lciBjb250cmFjdCBpdGVtIDEsIGFuZCBzdWNoIGEKLy8gcmVhbG0gd291bGQgbGV0IGEgY2FsbGVyIHJlYXAgYSBMSVZFIGFsbG93YW5jZSBieSBuYW1pbmcgYSBmdXR1cmUgaW5zdGFudC4KZnVuYyAoYiAqQm9vaykgUmVhcChpZCB1aW50NjQsIG5vdyBpbnQ2NCkgZXJyb3IgewoJaWYgbm93IDwgMCB7CgkJcmV0dXJuIEVyckludmFsaWROb3cKCX0KCWEsIG9rIDo9IGIuZ2V0KGlkKQoJaWYgIW9rIHsKCQlyZXR1cm4gRXJyTm90Rm91bmQKCX0KCWlmICFhLklzRXhwaXJlZChub3cpIHsKCQlyZXR1cm4gRXJyTm90RXhwaXJlZAoJfQoJYi5saXZlLlJlbW92ZShrZXkoaWQpKQoJcmV0dXJuIG5pbAp9CgovLyBJdGVyYXRlIGNhbGxzIGZuIGZvciBldmVyeSBsaXZlIGFsbG93YW5jZSBpbiBpZCBvcmRlciwgc3RvcHBpbmcgZWFybHkgaWYKLy8gZm4gcmV0dXJucyB0cnVlLiBUaGUgYWxsb3dhbmNlIGlzIHBhc3NlZCBieSB2YWx1ZSwgc28gZm4gY2Fubm90IG11dGF0ZQovLyB0aGUgYm9vayB0aHJvdWdoIGl0LgpmdW5jIChiICpCb29rKSBJdGVyYXRlKGZuIGZ1bmMoQWxsb3dhbmNlKSBib29sKSB7CgliLmxpdmUuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHYgYW55KSBib29sIHsKCQlyZXR1cm4gZm4odi4oQWxsb3dhbmNlKSkKCX0pCn0KIiIKEy9nbm8uTWVtUGFja2FnZVR5cGUSCwoJTVBVc2VyQWxsIg0yMDAwMDAwMHVnbm90EhEIgMCEPRIKNjQwMDB1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQI+F/3SD44LzJd5QXHh1vF/QcCo6KniXCcPaMD4J5RVpxJA0KW8d0Dfs5lPAU9DAeE1t0XSrJ7yobrNTAhVgi2v/otSxnulUoWYsJ1DyqxqKzLDh6a4a4OI9ifPHQJGT6e+SxooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ=="
  }
}