{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "vK7JECseo9rNJL4pypkNXZa0WgLFipvMHO3Y3YKHdvY=",
    "height": "422172",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "94300537",
      "GasUsed": "62867025"
    },
    "tx": "CqfzAgoML3ZtLm1fYWRkcGtnEpXzAgooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLY8gIKC3JlY2VpdmFibGVzEj9nbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcmVjZWl2YWJsZXMaZgoLZ25vbW9kLnRvbWwSV21vZHVsZSA9ICJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcmVjZWl2YWJsZXMiCmdubyA9ICIwLjkiChqe8QIKD3JlY2VpdmFibGVzLmdubxKJ8QIvLyBQYWNrYWdlIHJlY2VpdmFibGVzIHB1Ymxpc2hlcyBhIHJlY2VpdmFibGVzIGFnaW5nIHJlcG9ydCBhbmQgdGhlIHJlc3VsdGluZwovLyBhbGxvd2FuY2UgZm9yIGNyZWRpdCBsb3NzZXMgb3ZlciBpbnZvaWNlcyBoZWxkIGluIFtyL2ludm9pY2VzXS4KLy8KLy8gQW4gaXNzdWVyIHJlZ2lzdGVycyBhbiBhZ2luZyBzY2hlZHVsZSDigJQgYWdlIGJhbmRzIGluIEJMT0NLUyBhbmQgYSBsb3NzIHJhdGUKLy8gcGVyIGJhbmQg4oCUIGFuZCB0aGVuIG5hbWVzIHRoZSBpbnZvaWNlIGlkcyB0byBhZ2UuIFRoaXMgcmVhbG0gcmVhZHMgZXZlcnkKLy8gRkFDVCBmcm9tIHRoZSBpbnZvaWNlIHJlYWxtIChhbW91bnQsIGFtb3VudCBwYWlkLCBkdWUgaGVpZ2h0LCBzdGF0dXMpIGFuZAovLyBwcmljZXMgdGhlIHJlc3VsdCB3aXRoIFtwL2FnaW5nXS4gVGhlIHB1Ymxpc2hlZCByZXBvcnQgaXMgZnJvemVuOiB0aGUKLy8gcGVyLWJ1Y2tldCB1bnBhaWQgdG90YWxzLCB0aGUgcGVyLWJ1Y2tldCBwcm92aXNpb24sIHRoZSBncmFuZCBwcm92aXNpb24sIGFuZAovLyBhIHNuYXBzaG90IG9mIHRoZSBzY2hlZHVsZSB0aGF0IHByaWNlZCBpdC4KLy8KLy8gIyBUaGUgY2FsbGVyIHN1cHBsaWVzIHRoZSBzZWxlY3Rpb24sIHRoZSBjaGFpbiBzdXBwbGllcyB0aGUgZmFjdHMKLy8KLy8gVGhpcyBpcyB0aGUgY2VudHJhbCBkZXNpZ24gY29uc3RyYWludCBhbmQgaXQgaXMgYSBtZWFzdXJlZCBvbmUsIG5vdCBhCi8vIHByZWZlcmVuY2UuIFtyL2ludm9pY2VzXSBleHBvcnRzIG5vIHBlci1pc3N1ZXIgaWQgZW51bWVyYXRvciDigJQgaXRzIGludGVybmFsCi8vIGBJdGVyYXRlYCBpcyB1bmV4cG9ydGVkIGFuZCBub3RoaW5nIGFib3ZlIGl0IGNhbiB3YWxrIGFuIGlzc3VlcidzIHJlY29yZHMg4oCUCi8vIHNvIGEgcmVhbG0gaGVyZSBDQU5OT1QgZGVyaXZlICJldmVyeSBvcGVuIGludm9pY2UiIG9uIGl0cyBvd24uIEl0IHRoZXJlZm9yZQovLyB0YWtlcyB0aGUgaWQgbGlzdCBmcm9tIHRoZSBjYWxsZXIuCi8vCi8vIFRoZSBjb25zZXF1ZW5jZSBpcyBzdGF0ZWQgcmF0aGVyIHRoYW4gaGlkZGVuOiAqKmEgcmVwb3J0IGNhbiB1bmRlci1yZXBvcnQqKi4KLy8gQW4gaXNzdWVyIHdobyBvbWl0cyBhbiBvdmVyZHVlIGludm9pY2UgZnJvbSB0aGUgbGlzdCBnZXRzIGEgcHJvdmlzaW9uIHRoYXQKLy8gaXMgdG9vIHNtYWxsLCBhbmQgbm8gY2hlY2sgaGVyZSBjYW4gc2VlIHRoZSBvbWlzc2lvbi4gV2hhdCB0aGlzIHJlYWxtIGRvZXMKLy8gaW5zdGVhZCBpcyBwdWJsaXNoIGEgQ09WRVJBR0UgTElORSB3aXRoIGV2ZXJ5IHJlcG9ydCDigJQgaG93IG1hbnkgaWRzIHdlcmUKLy8gbGlzdGVkLCBob3cgbWFueSB3ZXJlIGFnZWQsIGhvdyBtYW55IHdlcmUgZmlsdGVyZWQgYW5kIHdoeSwgYW5kIGhvdyBtYW55Ci8vIG9wZW4gaW52b2ljZXMgYW5kIHN0b3JlZCByZWNvcmRzIHRoZSBpc3N1ZXIgaGVsZCBhdCB0aGF0IGhlaWdodCDigJQgc28gYQovLyByZWFkZXIgY2FuIGNvbXB1dGUgdGhlIHNob3J0ZmFsbCB0aGVtc2VsdmVzLiBTZWUgW0NvdmVyYWdlXS4KLy8KLy8gVW5kZXItcmVwb3J0aW5nIGlzIG1hZGUgVklTSUJMRSBoZXJlLiBJdCBpcyBub3QgcHJldmVudGVkLCBhbmQgYSByZWFkZXIgd2hvCi8vIHRyZWF0cyBhIHB1Ymxpc2hlZCBwcm92aXNpb24gYXMgY29tcGxldGUgd2l0aG91dCByZWFkaW5nIHRoZSBjb3ZlcmFnZSBsaW5lCi8vIGlzIHJlYWRpbmcgaXQgd3JvbmdseS4KLy8KLy8gIyBBZ2VzIGFyZSBpbiBCTE9DS1MKLy8KLy8gW3IvaW52b2ljZXNdIHN0b3JlcyBgZHVlSGVpZ2h0YCBhcyBhIGJsb2NrIGhlaWdodCwgc28gYW4gYWdlIGlzIGEgY291bnQgb2YKLy8gYmxvY2tzIGFuZCBldmVyeSBzY2hlZHVsZSBlZGdlIGlzIGEgY291bnQgb2YgYmxvY2tzLiBBICIzMC82MC85MCBkYXkiCi8vIHNjaGVkdWxlIGlzIGEgY29udmVyc2lvbiB0aGUgSVNTVUVSIG93bnMgYW5kIHRoaXMgcmVhbG0gbmV2ZXIgcGVyZm9ybXM6Ci8vIG5vdGhpbmcgaGVyZSBrbm93cyB0aGUgYmxvY2sgdGltZSwgYW5kIGNvbXBpbGluZyBhIGd1ZXNzIGluIHdvdWxkIG1ha2UgZXZlcnkKLy8gcHVibGlzaGVkIHJhdGUgd3JvbmcgYnkgd2hhdGV2ZXIgdGhlIGd1ZXNzIHdhcyBvZmYgYnkuCi8vCi8vICMgVGhpcyByZWFsbSB3cml0ZXMgbm8gbGVkZ2VyIGVudHJ5Ci8vCi8vIEEgcHJvdmlzaW9uIGlzIGFuIGFjY291bnRpbmcgZW50cnkg4oCUIGRlYml0IGEgY3JlZGl0LWxvc3MgZXhwZW5zZSwgY3JlZGl0IGFuCi8vIGFsbG93YW5jZSDigJQgYW5kIHRoaXMgcmVhbG0gZGVsaWJlcmF0ZWx5IGRvZXMgbm90IHBvc3QgaXQuIFtyL2Jvb2tzXSBkZXJpdmVzCi8vIHRoZSBvd25lciBvZiBhIGJvb2sgc3RydWN0dXJhbGx5IGZyb20gaXRzIGNhbGxlciwgc28gYSByZWFsbSB0aGF0IGNhbGxlZAovLyBgUG9zdE11bHRpYCB3b3VsZCBwb3N0IGludG8gSVRTIE9XTiBib29rIGFuZCBub3QgdGhlIGlzc3VlcidzLiBUaGVyZSBpcyBubwovLyBvd25lciBwYXJhbWV0ZXIgdG8gcGFzcyBhbmQgbm8gZGVsZWdhdGlvbiBwYXRoIHRvIHVzZS4KLy8KLy8gU28gW1Byb3Bvc2VkRW50cnldIHJldHVybnMgdGhlIGVudHJ5IGFzIGEgc3RyaW5nIGluIHRoZSBmb3JtIHIvYm9va3MnCi8vIGBQb3N0TXVsdGlgIGFjY2VwdHMsIGFuZCB0aGUgaXNzdWVyIHBvc3RzIGl0IHRoZW1zZWx2ZXMgZnJvbSB0aGVpciBvd24KLy8gYWNjb3VudC4gVGhlIHJlYWxtIHN0YXlzIGtleWxlc3Mgd2l0aCByZXNwZWN0IHRvIGV2ZXJ5IGxlZGdlciwgd2hpY2ggaXMgdGhlCi8vIHN0cm9uZ2VyIHBvc2l0aW9uOiBpdCBjYW5ub3Qgd3JpdGUgYSB3cm9uZyBlbnRyeSBiZWNhdXNlIGl0IGNhbm5vdCB3cml0ZS4KLy8KLy8gIyBDdXN0b2R5Ci8vCi8vIE5vbmUuIFRoaXMgcmVhbG0gaG9sZHMgbm8gY29pbnMsIGhhcyBubyB3aXRoZHJhd2FsIHBhdGgsIGFuZCByZWZ1c2VzIGEgdXNlcgovLyBjYWxsIHRoYXQgYXJyaXZlcyBjYXJyeWluZyBhbnkuIE5vdGhpbmcgaGVyZSBtb3ZlcyB2YWx1ZTsgYSBwcm92aXNpb24gaXMgYQovLyBzdGF0ZW1lbnQgYWJvdXQgdmFsdWUsIHdoaWNoIGlzIG5vdCB0aGUgc2FtZSB0aGluZy4KLy8KLy8gIyBMaW1pdGF0aW9ucwovLwovLyAgIC0gKipUaGUgcmVwb3J0IGlzIGEgc2VsZi1yZXBvcnQgb2YgYSBzZWxmLXJlcG9ydC4qKiByL2ludm9pY2VzJyBhbW91bnRzIGFyZQovLyAgICAgd2hhdGV2ZXIgYW4gaXNzdWVyIHR5cGVkOyBhbiBhZ2luZyBvZiB0aGVtIGluaGVyaXRzIHRoYXQgZW50aXJlbHkgYW5kCi8vICAgICB0aGVuIGxvb2tzIGxpa2UgYW4gYXVkaXRlZCBhcnRpZmFjdC4gTm8gYXVkaXQgaGFwcGVucyBoZXJlLgovLyAgIC0gKipJdCBjYW4gdW5kZXItcmVwb3J0LCBieSBjb25zdHJ1Y3Rpb24uKiogU2VlIGFib3ZlIGFuZCBbQ292ZXJhZ2VdLgovLyAgIC0gKipJdCBjYW5ub3Qgb3Zlci1yZXBvcnQgYW4gdW5saXN0ZWQgaW52b2ljZSoqLCBiZWNhdXNlIGV2ZXJ5IGZhY3QgY29tZXMKLy8gICAgIGZyb20gdGhlIGNoYWluIOKAlCBidXQgaXQgQ0FOIG92ZXItcmVwb3J0IGEgKmxpc3RlZCogb25lIHdob3NlIGFtb3VudCB0aGUKLy8gICAgIGlzc3VlciBpbmZsYXRlZCBpbiByL2ludm9pY2VzIGluIHRoZSBmaXJzdCBwbGFjZS4KLy8gICAtICoqTm8gd3JpdGUtb2ZmLioqIFtwL2FnaW5nXSBwcmljZXMgYW4gZXhwZWN0ZWQgbG9zcyBhbmQgbmV2ZXIgcmVtb3ZlcyBhbgovLyAgICAgb2JsaWdhdGlvbjsgYSByZWNlaXZhYmxlIHRoaXMgcmVwb3J0IHByb3Zpc2lvbnMgYXQgMTAwJSBpcyBzdGlsbCBhIGxpdmUKLy8gICAgIGludm9pY2UgaW4gci9pbnZvaWNlcy4gVm9pZGluZyBpcyB0aGF0IHJlYWxtJ3Mgb3BlcmF0aW9uLCBub3QgdGhpcyBvbmUncy4KLy8gICAtICoqQSBmcm96ZW4gcmVwb3J0IGRvZXMgbm90IHRyYWNrIHRoZSBpbnZvaWNlcy4qKiBBIHBheW1lbnQgbGFuZGluZyBhZnRlcgovLyAgICAgcHVibGljYXRpb24gbGVhdmVzIHRoZSBwdWJsaXNoZWQgZmlndXJlcyB1bnRvdWNoZWQsIHdoaWNoIGlzIHdoYXQKLy8gICAgICJmcm96ZW4iIG1lYW5zLiBUaGVyZSBpcyBubyBgVmVyaWZ5YCBoZXJlOiByZS1kZXJpdmluZyB3b3VsZCBuZWVkIHRoZSBpZAovLyAgICAgbGlzdCwgd2hpY2ggaXMgbm90IHN0b3JlZCAoc2VlIFtQdWJsaXNoXSkuCi8vICAgLSAqKkJ1Y2tldHMgYXJlIGZsb29yZWQgcGVyIGJ1Y2tldCoqLCBzbyB0aGUgcGVyLWJ1Y2tldCBjb2x1bW4gc3VtcyB0byB0aGUKLy8gICAgIGdyYW5kIHByb3Zpc2lvbiBleGFjdGx5IGFuZCBib3RoIGFyZSBhdCBvciBiZWxvdyB0aGUgdW5yb3VuZGVkIGZpZ3VyZS4KLy8gICAgIFtwL2FnaW5nXSdzIHBhY2thZ2UgZG9jIGNhcnJpZXMgdGhlIGNvdW50ZXJleGFtcGxlLgovLyAgIC0gKipObyBjcm9zcy1pc3N1ZXIgYWdncmVnYXRlLioqIFRoZXJlIGlzIG5vIGVudW1lcmF0b3IgYW5kIG5vIHRvdGFsCi8vICAgICBwcm92aXNpb24gYWNyb3NzIGlzc3VlcnM7IHN1Y2ggYSBmaWd1cmUgd291bGQgc3VtIHN0cmFuZ2VycycgYXNzZXJ0aW9ucy4KLy8KLy8gW3IvaW52b2ljZXNdOiAvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2ludm9pY2VzCi8vIFtyL2Jvb2tzXTogL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9ib29rcwovLyBbcC9hZ2luZ106IC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvYWdpbmcKcGFja2FnZSByZWNlaXZhYmxlcwoKaW1wb3J0ICgKCSJjaGFpbi9ydW50aW1lIgoJImNoYWluL3J1bnRpbWUvdW5zYWZlIgoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2FnaW5nIgoJImduby5sYW5kL3AvbnQvYXZsL3YwIgoJImduby5sYW5kL3AvbnQvbWFya2Rvd24vc2FuaXRpemUvdjAiCgkiZ25vLmxhbmQvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2ludm9pY2VzIgopCgovLyBSZWFsbVBhdGggaXMgdGhpcyByZWFsbSdzIG93biBwYXRoLCB1c2VkIHRvIGJ1aWxkIFJlbmRlciBsaW5rcy4KY29uc3QgUmVhbG1QYXRoID0gIi9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcmVjZWl2YWJsZXMiCgovLyBJbnZvaWNlc1BhdGggaXMgdGhlIHJlY2VpdmFibGVzIHNvdXJjZSBldmVyeSBmaWd1cmUgaGVyZSBpcyByZWFkIGZyb20uCi8vCi8vIEl0IGlzIHRha2VuIEJZIFZBTFVFIGZyb20gdGhhdCByZWFsbSdzIG93biBleHBvcnRlZCBjb25zdGFudCByYXRoZXIgdGhhbgovLyB0eXBlZCBvdXQgYWdhaW4sIHNvIHRoaXMgaXMgdGhlIGNvbXBpbGUtdGltZSBwaW4gaXRzZWxmIGFuZCBub3QgYSBzZWNvbmQKLy8gY29weSB0aGF0IGNvdWxkIGRyaWZ0LiBUaGUgY29udmVudGlvbiBpcyByL3N0YXRlbWVudHMnIEJvb2tzUGF0aC4KY29uc3QgSW52b2ljZXNQYXRoID0gaW52b2ljZXMuUmVhbG1QYXRoCgovLyBSYXRlU2NhbGUgaXMgdGhlIHVuaXQgb2YgYSBsb3NzIHJhdGUsIHJlLWV4cG9ydGVkIGJ5IHZhbHVlIGZyb20gW3AvYWdpbmddOgovLyBhIHJhdGUgb2YgMjUwMCBpcyAyNSUuIFJlLWV4cG9ydGVkIGJlY2F1c2UgZXZlcnkgcmF0ZSBpbiB0aGlzIHJlYWxtJ3MgQVBJCi8vIGlzIGluIHRoZXNlIHVuaXRzIGFuZCBhIGNhbGxlciBzaG91bGQgbm90IGhhdmUgdG8gZmluZCB0aGUgb3RoZXIgcGFja2FnZSB0bwovLyBsZWFybiB0aGUgZGVub21pbmF0b3IuCmNvbnN0IFJhdGVTY2FsZSA9IGFnaW5nLlJhdGVTY2FsZQoKLy8gTWF4SURzUGVyQ2FsbCBjYXBzIGhvdyBtYW55IGludm9pY2UgaWRzIG9uZSBbUHVibGlzaF0gbWF5IG5hbWUsIGFuZCBpdCBpcwovLyByL2ludm9pY2VzJyBvd24gcGVyLWlzc3VlciBzdG9yYWdlIGNhcCB0YWtlbiBieSB2YWx1ZS4KLy8KLy8gVGhhdCBjYXAgaXMgdGhlIHJpZ2h0IGJvdW5kIGFuZCBpdCBpcyB3b3J0aCBzYXlpbmcgd2h5LCBiZWNhdXNlIHRoZSB0d28KLy8gY2FuZGlkYXRlIGJvdW5kcyBkaWZmZXIgYnkgYSBmYWN0b3Igb2Ygc2l4dGVlbi4gW3AvYWdpbmddIGFjY2VwdHMgdXAgdG8KLy8gYGFnaW5nLk1heE9ibGlnYXRpb25zYCAoMTAyNCkgb2JsaWdhdGlvbnMgYW5kIG9mZmVycyBhIGNodW5raW5nIHByb3RvY29sIGZvcgovLyBtb3JlOyByL2ludm9pY2VzIHN0b3JlcyBhdCBtb3N0IGBNYXhSZWNvcmRzUGVySXNzdWVyYCAoNjQpIHJlY29yZHMgb2YgYW55Ci8vIHN0YXR1cyBwZXIgaXNzdWVyLiBBbiBpc3N1ZXIgdGhlcmVmb3JlIGNhbm5vdCBoYXZlIG1vcmUgdGhhbiA2NCBhZ2VhYmxlCi8vIGludm9pY2VzIGluIGV4aXN0ZW5jZSBhdCBvbmUgaGVpZ2h0LCBzbyAqKnRoaXMgcHJvZHVjdCBuZXZlciBjaHVua3MqKiwgYW5kCi8vIHAvYWdpbmcncyBkb2N1bWVudGVkIGNodW5rLWZsb29yaW5nIGVycm9yIOKAlCB3aGVyZSB0aGUgc3VtIG9mIHBlci1jaHVuawovLyBwcm92aXNpb25zIGlzIG5vdCB0aGUgcHJvdmlzaW9uIG9mIHRoZSB3aG9sZSDigJQgY2Fubm90IGFyaXNlIGhlcmUuIFRoZSB0d28KLy8gY2FwcyB3ZXJlIGNob3NlbiBpbmRlcGVuZGVudGx5IGFuZCBpdCBpcyB0aGVpciBpbmVxdWFsaXR5LCBub3QgYW55IGNvZGUKLy8gYmVsb3csIHRoYXQgbWFrZXMgdGhlIGNvbXBvc2l0aW9uIGV4YWN0Lgpjb25zdCBNYXhJRHNQZXJDYWxsID0gaW52b2ljZXMuTWF4UmVjb3Jkc1Blcklzc3VlcgoKLy8gUmVwb3J0c0FyZVVuY2FwcGVkIHJlY29yZHMgYSBkZWNpc2lvbiBieSBpdHMgYWJzZW5jZSwgYmVjYXVzZSBldmVyeSBvdGhlcgovLyByZWFsbSBpbiB0aGlzIHBvcnRmb2xpbyBjYXBzIGl0cyBwZXItb3duZXIgc3RhdGUgYW5kIGEgcmVhZGVyIHdpbGwgbG9vayBmb3IKLy8gdGhlIGNhcCBoZXJlLgovLwovLyBUaGVyZSBpcyBub25lLCBmb3Igci9zdGF0ZW1lbnRzJyByZWFzb25zLCB3aGljaCB0cmFuc2ZlciB1bmNoYW5nZWQ6IGtleXMgYXJlCi8vIHBlciBpc3N1ZXIgc28gYW4gaXNzdWVyIGNhbiBmaWxsIG9ubHkgdGhlaXIgb3duIGhpc3Rvcnk7IG5vdGhpbmcgaXRlcmF0ZXMgYQovLyBoaXN0b3J5IGV4Y2VwdCBSZW5kZXIsIHdoaWNoIHJlYWRzIHRoZSBuZXdlc3QgW1JlbmRlclJlcG9ydExpbWl0XSBieSBkaXJlY3QKLy8ga2V5IGxvb2t1cDsgYW5kIHRoZXJlIGlzIG5vIGVuZ2luZSBjYXAgYWJvdmUgdGhpcyByZWFsbSB0byBtaXJyb3IuIEVhY2gKLy8gcHVibGljYXRpb24gY29zdHMgaXRzIG93biBnYXMgYW5kIHN0b3JhZ2UgZGVwb3NpdC4KLy8KLy8gVGhlcmUgaXMgYWxzbyBubyByZXRyYWN0aW9uLCBhbmQgdGhhdCBpcyB0aGUgc2FtZSBkZWNpc2lvbiBmcm9tIHRoZSBvdGhlcgovLyBzaWRlLiBBIGBSZXRyYWN0YCB3b3VsZCBzcGxpdCB0aGUgc2VxdWVuY2UgYWxsb2NhdG9yIGZyb20gdGhlIGxpdmUgY291bnQg4oCUCi8vIHR3byBudW1iZXJzIHRoYXQgY2FuIGRpc2FncmVlIOKAlCBpbiBleGNoYW5nZSBmb3IgbGV0dGluZyBhbiBpc3N1ZXIgZGVsZXRlIGEKLy8gcmVwb3J0IHRoZXkgcmVncmV0LiBBIGZyb3plbiByZWNvcmQgdGhhdCBjYW4gYmUgZGVsZXRlZCBpcyBub3QgZnJvemVuLCBhbmQKLy8gdGhlIHJlYWxtIGhhcyBubyBjYXAgYW4gaXNzdWVyIGNvdWxkIGJlIGJyaWNrZWQgYWdhaW5zdC4KY29uc3QgUmVwb3J0c0FyZVVuY2FwcGVkID0gdHJ1ZQoKLy8gUmVuZGVyUmVwb3J0TGltaXQgY2FwcyBob3cgbWFueSBvZiBhbiBpc3N1ZXIncyByZXBvcnRzIG9uZSBSZW5kZXIgY2FsbAovLyBsaXN0cywgd2hpY2ggaXMgd2hhdCBrZWVwcyBhbiBpc3N1ZXIncyBwYWdlIGNvc3QgZmxhdCB3aGlsZSBoaXN0b3JpZXMgYXJlCi8vIHVuYm91bmRlZC4KY29uc3QgUmVuZGVyUmVwb3J0TGltaXQgPSAyMAoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFN0YXRlCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gcmVwb3J0IGlzIG9uZSBmcm96ZW4gYWdpbmcgcmVwb3J0LgovLwovLyBJdCBzdG9yZXMgdGhlIFthZ2luZy5TY2hlZHVsZV0gdGhhdCBwcmljZWQgaXQsIFdIT0xFLCBhbmQgdGhhdCBmaWVsZCBpcyB0aGUKLy8gcG9pbnQgb2YgdGhpcyBzdHJ1Y3QuIHAvYWdpbmcncyBvd24gZG9jIHdhcm5zIHRoYXQgYSBSZXBvcnQgY2FycmllcyBubwovLyByZWZlcmVuY2UgdG8gaXRzIFNjaGVkdWxlLCBzbyB0d28gc2NoZWR1bGVzIHdpdGggdGhlIHNhbWUgYnVja2V0IGNvdW50IHdpbGwKLy8gYWNjZXB0IGVhY2ggb3RoZXIncyByZXBvcnRzIGFuZCBzaWxlbnRseSBwcmljZSB0aGVtIG9uIHRoZSB3cm9uZyByYXRlcyB3aXRoCi8vIG5vIGVycm9yLiBSZXBsYWNpbmcgYSBzY2hlZHVsZSBpcyBsZWdpdGltYXRlIGhlcmUg4oCUIHJhdGVzIGNoYW5nZSDigJQgc28gdGhlCi8vIGhhemFyZCBpcyBsaXZlIHJhdGhlciB0aGFuIHRoZW9yZXRpY2FsLCBhbmQgc25hcHNob3R0aW5nIHJlbW92ZXMgdGhlCi8vIG9wcG9ydHVuaXR5IHN0cnVjdHVyYWxseTogbm8gYmFyZSByZXBvcnQgZXZlciBwZXJzaXN0cywgYW5kIGEgbGF0ZXIKLy8gW1NldFNjaGVkdWxlXSBjYW5ub3QgcmV0cm8tcHJpY2UgYW55dGhpbmcgYWxyZWFkeSBwdWJsaXNoZWQuCi8vCi8vIFRoZSBwcmljZWQgY29sdW1ucyBhcmUgc3RvcmVkIHJhdGhlciB0aGFuIHJlLWRlcml2ZWQgb24gcmVhZCwgYmVjYXVzZQovLyByZS1kZXJpdmluZyB3b3VsZCBtZWFuIGNhbGxpbmcgaW50byBwL2FnaW5nIGZyb20gZXZlcnkgYWNjZXNzb3IgYW5kIGEgdmlldwovLyB0aGF0IHJlY29tcHV0ZXMgaXMgYSBzZWNvbmQgcGxhY2UgZm9yIHRoZSBhcml0aG1ldGljIHRvIGxpdmUuCnR5cGUgcmVwb3J0IHN0cnVjdCB7CglhdCAgICBpbnQ2NCAgICAgICAgIC8vIGNoYWluIGhlaWdodCBhdCBwdWJsaWNhdGlvbgoJc2NoZWQgYWdpbmcuU2NoZWR1bGUgLy8gdGhlIHNjaGVkdWxlIHRoYXQgcHJpY2VkIHRoaXMgcmVwb3J0LCBzbmFwc2hvdHRlZAoJdW5wYWlkICAgW11pbnQ2NCAgICAgLy8gdW5wYWlkIHRvdGFsIHBlciBidWNrZXQsIHlvdW5nZXN0IGZpcnN0Cglwcm92QnlCICBbXWludDY0ICAgICAvLyBwcm92aXNpb24gcGVyIGJ1Y2tldCwgeW91bmdlc3QgZmlyc3QKCXRvdGFsICAgIGludDY0ICAgICAgIC8vIHN1bSBvZiB1bnBhaWQKCXByb3Zpc2lvbiBpbnQ2NCAgICAgIC8vIHN1bSBvZiBwcm92QnlCCgoJLy8gVGhlIGNvdmVyYWdlIGxpbmUuIFNlZSBbQ292ZXJhZ2VdIGZvciB3aGF0IGVhY2ggb25lIG1lYW5zIGFuZCB3aHkKCS8vIHRoZXkgYXJlIHN0b3JlZCByYXRoZXIgdGhhbiByZWNvbXB1dGFibGUuCglsaXN0ZWQgICBpbnQKCWFnZWQgICAgIGludAoJbm90T3BlbiAgaW50Cgl6ZXJvT3V0ICBpbnQKCW5vdER1ZSAgIGludAoJZHVwZXMgICAgaW50CglvcGVuQXQgICBpbnQKCXJlY29yZHNBdCBpbnQKfQoKLy8gcmVwb3J0cyBtYXBzICI8aXNzdWVyPnw8cGFkZGVkIHNlcT4iIHRvICpyZXBvcnQuCi8vCi8vIFRoZSBwb2ludGVyIG5ldmVyIGxlYXZlcyB0aGlzIGZpbGUuIEV2ZXJ5IGFjY2Vzc29yIGNvcGllcyBzY2FsYXJzIG91dCwgc28gbm8KLy8gY2FsbGVyIHJlY2VpdmVzIGEgaGFuZGxlIG9udG8gc3RvcmVkIHN0YXRlIOKAlCB0aGUgZGlzY2lwbGluZSByL2Jvb2tzIGFuZAovLyByL3N0YXRlbWVudHMgYm90aCBhcHBseS4KdmFyIHJlcG9ydHMgPSBhdmwuTmV3VHJlZSgpCgovLyBzY2hlZHVsZXMgbWFwcyBhbiBpc3N1ZXIncyBhZGRyZXNzIHN0cmluZyB0byB0aGVpciBjdXJyZW50Ci8vIFthZ2luZy5TY2hlZHVsZV0uIE9uZSBwZXIgaXNzdWVyOyBbU2V0U2NoZWR1bGVdIHJlcGxhY2VzIGl0Lgp2YXIgc2NoZWR1bGVzID0gYXZsLk5ld1RyZWUoKQoKLy8gY291bnRzIG1hcHMgYW4gaXNzdWVyJ3MgYWRkcmVzcyBzdHJpbmcgdG8gaG93IG1hbnkgcmVwb3J0cyB0aGV5IGhhdmUKLy8gcHVibGlzaGVkLiBJdCBpcyB0aGUgc2VxdWVuY2UgYWxsb2NhdG9yIGFzIHdlbGwgYXMgdGhlIGNvdW50LCBhbmQgdGhlIHR3bwovLyBjYW4gbmV2ZXIgZGlzYWdyZWUgYmVjYXVzZSBub3RoaW5nIGRlbGV0ZXMgYSByZXBvcnQuCnZhciBjb3VudHMgPSBhdmwuTmV3VHJlZSgpCgovLyByZXBDb3VudCBpcyB0aGUgZ2xvYmFsIHRvdGFsLCBtYWludGFpbmVkIGFsb25nc2lkZSB0aGUgdHJlZSBzbyB0aGUgaW5kZXgKLy8gcGFnZSBuZXZlciBpdGVyYXRlcy4KdmFyIHJlcENvdW50IGludAoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEd1YXJkcwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIHJlZnVzZUNvaW5zIHBhbmljcyBpZiBhIHVzZXIgY2FsbCBhcnJpdmVzIGNhcnJ5aW5nIGNvaW5zLiBBZG9wdGVkIGZyb20KLy8gci9ib29rcyBhbmQgci9zdGF0ZW1lbnRzLCB3aGljaCBmYWNlIHRoZSBpZGVudGljYWwgc2xvdDogbm8gd2l0aGRyYXdhbCBwYXRoLAovLyBzbyBhY2NlcHRlZCBjb2lucyBhcmUgc3RyYW5kZWQgcGVybWFuZW50bHkuCi8vCi8vIElzVXNlckNhbGwgcmF0aGVyIHRoYW4gSXNVc2VyLCBhbmQgdGhlIHJlYXNvbiBpcyBub3QgdGhlIGNhbm9uaWNhbAovLyBwYXltZW50LWd1YXJkIG9uZS4gVGhhdCBhZHZpY2UgaXMgZm9yIGEgcmVhbG0gdGhhdCBBQ0NFUFRTIHBheW1lbnQsIHdoZXJlCi8vIElzVXNlciBpcyBkYW5nZXJvdXNseSBicm9hZC4gVGhpcyBndWFyZCBSRUZVU0VTLCBzbyBhIGJyb2FkZXIgcHJlZGljYXRlCi8vIHdvdWxkIHJlZnVzZSBtb3JlIGFuZCAibW9yZSBjb25zZXJ2YXRpdmUiIGlzIHRoZSB3cm9uZyBmcmFtZS4gVGhlIHJlYWwKLy8gcmVhc29uIGlzIHRoYXQgT3JpZ2luU2VuZCBpcyBhIGZhY3QgYWJvdXQgdGhlIFRSQU5TQUNUSU9OIGFuZCBpcyBhIGZhaXRoZnVsCi8vIHJlY2VpcHQgb25seSBvbiB0aGUgZGlyZWN0IE1zZ0NhbGwgcGF0aDsgcGFpcmluZyBpdCB3aXRoIElzVXNlciBhZGRzIGEgZmFsc2UKLy8gcmVmdXNhbCBtb2RlIOKAlCBhIHBhbmljIG9uIGEgY2FsbCB0aGF0IGJyb3VnaHQgdGhpcyByZWFsbSBub3RoaW5nIOKAlCBhbmQgYnV5cwovLyBubyBwcm90ZWN0aW9uLgovLwovLyBUaGUgcmVzaWR1YWwgaXMgc3RhdGVkIHJhdGhlciB0aGFuIGd1YXJkZWQ6IGNvaW5zIGNhbiBzdGlsbCByZWFjaCB0aGlzCi8vIGFkZHJlc3MgdGhyb3VnaCBhbiBpbnRlcm1lZGlhcnkncyBleHBsaWNpdCBiYW5rZXIgc2VuZCwgd2hpY2ggbm8gcHJlZGljYXRlCi8vIGhlcmUgY2FuIHNlZS4gV2hhdCBtYWtlcyB0aGF0IHN1cnZpdmFibGUgaXMgdGhlIGFic2VuY2Ugb2YgYW55IGNvbnN1bXB0aW9uCi8vIHBhdGgg4oCUIG5vdGhpbmcgaW4gdGhpcyByZWFsbSBjYW4gc3BlbmQgd2hhdCBhcnJpdmVzLgovLwovLyBUaGUgSXNDdXJyZW50IGNoZWNrIGlzIGEgbm8tb3AgYXQgdG9kYXkncyBjYWxsIHNpdGVzLCB3aGVyZSB0aGUgZm9yd2FyZGVkCi8vIGN1ciBpcyBydW50aW1lLWN1cnJlbnQgYnkgY29uc3RydWN0aW9uLiBJdCBpcyBoZXJlIGJlY2F1c2UgdGhpcyByZWFsbSBpcwovLyBJTU1VVEFCTEUgYWZ0ZXIgYWRkcGtnLCBzbyBhIGZ1dHVyZSBzZWNvbmQgY2FsbGVyIGNhbm5vdCBiZSBtYWRlIHNhZmUgbGF0ZXIsCi8vIGFuZCBhIGhlbHBlciByZWFkaW5nIFByZXZpb3VzKCkgb2ZmIGFuIHVuY2hlY2tlZCByZWFsbSBwYXJhbWV0ZXIgaXMgYQovLyBkZXNpZ25hdGlvbi1mb3JnZXJ5IHNoYXBlIHdoZXRoZXIgb3Igbm90IGl0IGlzIHJlYWNoYWJsZSB0b2RheS4KZnVuYyByZWZ1c2VDb2lucyhjdXIgcmVhbG0pIHsKCWlmICFjdXIuSXNDdXJyZW50KCkgewoJCXBhbmljKCJyZWNlaXZhYmxlczogcmVmdXNlQ29pbnMgY2FsbGVkIHdpdGggYSByZWFsbSB0aGF0IGlzIG5vdCBjdXJyZW50IikKCX0KCWlmIGN1ci5QcmV2aW91cygpLklzVXNlckNhbGwoKSAmJiBsZW4odW5zYWZlLk9yaWdpblNlbmQoKSkgPiAwIHsKCQlwYW5pYygicmVjZWl2YWJsZXM6IHRoaXMgcmVhbG0gaG9sZHMgbm8gY29pbnMgYW5kIGhhcyBubyB3aXRoZHJhd2FsIHBhdGg7IHNlbmQgbm9uZSIpCgl9Cn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBQYXJzaW5nCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gcGFyc2VJbnQ2NExpc3QgcGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZGVjaW1hbCBpbnQ2NHMsIHJlamVjdGluZyBhbgovLyBlbXB0eSBsaXN0LCBhIGJsYW5rIGVsZW1lbnQsIGFuZCBtb3JlIHRoYW4gbWF4IGVsZW1lbnRzLgovLwovLyBUaGUgZWxlbWVudCBjYXAgaXMgZW5mb3JjZWQgQkVGT1JFIHRoZSBzbGljZSBncm93cywgc28gYSBjYWxsZXIgY2Fubm90IG1ha2UKLy8gdGhpcyByZWFsbSBhbGxvY2F0ZSBhIGxvbmcgbGlzdCBvbiB0aGUgd2F5IHRvIGEgcmVmdXNhbC4gVGhlIGB3aGF0YCB3b3JkIGlzCi8vIG9ubHkgZm9yIHRoZSBwYW5pYyBtZXNzYWdlLgpmdW5jIHBhcnNlSW50NjRMaXN0KHMgc3RyaW5nLCBtYXggaW50LCB3aGF0IHN0cmluZykgW11pbnQ2NCB7CglwYXJ0cyA6PSBzdHJpbmdzLlNwbGl0KHMsICIsIikKCWlmIGxlbihwYXJ0cykgPiBtYXggewoJCXBhbmljKCJyZWNlaXZhYmxlczogYXQgbW9zdCAiICsgc3RyY29udi5JdG9hKG1heCkgKyAiICIgKyB3aGF0ICsKCQkJInMsIGdvdCAiICsgc3RyY29udi5JdG9hKGxlbihwYXJ0cykpKQoJfQoJb3V0IDo9IG1ha2UoW11pbnQ2NCwgMCwgbGVuKHBhcnRzKSkKCWZvciBfLCBwIDo9IHJhbmdlIHBhcnRzIHsKCQl0IDo9IHN0cmluZ3MuVHJpbVNwYWNlKHApCgkJaWYgdCA9PSAiIiB7CgkJCXBhbmljKCJyZWNlaXZhYmxlczogZW1wdHkgIiArIHdoYXQgKyAiIGluICIgKyBzdHJjb252LlF1b3RlKHMpKQoJCX0KCQl2LCBlcnIgOj0gc3RyY29udi5QYXJzZUludCh0LCAxMCwgNjQpCgkJaWYgZXJyICE9IG5pbCB7CgkJCXBhbmljKCJyZWNlaXZhYmxlczogIiArIHN0cmNvbnYuUXVvdGUodCkgKyAiIGlzIG5vdCBhIHZhbGlkICIgKyB3aGF0KQoJCX0KCQlvdXQgPSBhcHBlbmQob3V0LCB2KQoJfQoJcmV0dXJuIG91dAp9CgovLyBwYXJzZUlEcyBwYXJzZXMgdGhlIGludm9pY2UtaWQgbGlzdCwgcmV0dXJuaW5nIGl0IHNvcnRlZCBhc2NlbmRpbmcgd2l0aAovLyBkdXBsaWNhdGVzIHJlbW92ZWQsIGFuZCBob3cgbWFueSBkdXBsaWNhdGVzIHdlcmUgZHJvcHBlZC4KLy8KLy8gRGVkdXBsaWNhdGlvbiBpcyBUSElTIHJlYWxtJ3MgcmVzcG9uc2liaWxpdHkgYW5kIHRoYXQgaXMgZXhwbGljaXQgaW4KLy8gcC9hZ2luZydzIGNvbnRyYWN0OiBhbiBPYmxpZ2F0aW9uICJjYXJyaWVzIG5vIGlkZW50aXR5Iiwgc28gdGhlIHNhbWUKLy8gb2JsaWdhdGlvbiBwYXNzZWQgdHdpY2UgaXMgY291bnRlZCB0d2ljZSBhbmQgdGhlIHByb3Zpc2lvbiBpcyBkb3VibGUuIEEKLy8gcmVwZWF0ZWQgaWQgaW4gYSBoYW5kLXdyaXR0ZW4gbGlzdCBvZiBzaXh0eS1mb3VyIGlzIGFuIG9yZGluYXJ5IG1pc3Rha2UsIGFuZAovLyB0aGUgcmVzdWx0aW5nIG92ZXItcHJvdmlzaW9uIGlzIGV4YWN0bHkgdGhlIGVycm9yIGNsYXNzIG5vdGhpbmcgZG93bnN0cmVhbQovLyBjYW4gZGV0ZWN0IOKAlCB0aGUgcmVwb3J0IHdvdWxkIHN0aWxsIGNyb3NzLWZvb3QuCi8vCi8vIER1cGxpY2F0ZXMgYXJlIERST1BQRUQgYW5kIENPVU5URUQgcmF0aGVyIHRoYW4gcmVmdXNlZCwgYmVjYXVzZSB0aGUgY291bnQKLy8gYXBwZWFycyBpbiB0aGUgY292ZXJhZ2UgbGluZSBhbmQgc28gdGhlIGNhbGxlciBsZWFybnMgYWJvdXQgaXQgZWl0aGVyIHdheSwKLy8gYW5kIGEgcmVmdXNhbCB3b3VsZCBtYWtlIGFuIGlzc3VlciByZS10eXBlIGEgc2l4dHktZm91ci1lbGVtZW50IGxpc3QgdG8gZml4Ci8vIGEgcmVwZWF0IHRoZSByZWFsbSBhbHJlYWR5IHVuZGVyc3Rvb2QuCi8vCi8vIEluc2VydGlvbiBzb3J0IG92ZXIgYXQgbW9zdCBNYXhJRHNQZXJDYWxsIGVsZW1lbnRzLCB3aGljaCBpcyA2NDogTyhuwrIpIGF0Ci8vIG49NjQgaXMgY2hlYXBlciBoZXJlIHRoYW4gaW1wb3J0aW5nIGEgc29ydC4KZnVuYyBwYXJzZUlEcyhpZHMgc3RyaW5nKSAoW11pbnQ2NCwgaW50KSB7CglyYXcgOj0gcGFyc2VJbnQ2NExpc3QoaWRzLCBNYXhJRHNQZXJDYWxsLCAiaW52b2ljZSBpZCIpCglvdXQgOj0gbWFrZShbXWludDY0LCAwLCBsZW4ocmF3KSkKCWR1cGVzIDo9IDAKCWZvciBfLCB2IDo9IHJhbmdlIHJhdyB7CgkJaWYgdiA8PSAwIHsKCQkJcGFuaWMoInJlY2VpdmFibGVzOiBpbnZvaWNlIGlkIG11c3QgYmUgcG9zaXRpdmUsIGdvdCAiICsKCQkJCXN0cmNvbnYuRm9ybWF0SW50KHYsIDEwKSkKCQl9CgkJaSA6PSAwCgkJZm9yIGkgPCBsZW4ob3V0KSAmJiBvdXRbaV0gPCB2IHsKCQkJaSsrCgkJfQoJCWlmIGkgPCBsZW4ob3V0KSAmJiBvdXRbaV0gPT0gdiB7CgkJCWR1cGVzKysKCQkJY29udGludWUKCQl9CgkJb3V0ID0gYXBwZW5kKG91dCwgMCkKCQljb3B5KG91dFtpKzE6XSwgb3V0W2k6XSkKCQlvdXRbaV0gPSB2Cgl9CglyZXR1cm4gb3V0LCBkdXBlcwp9CgovLyB2YWxpZENvZGUgcmVwb3J0cyB3aGV0aGVyIGEgc3RyaW5nIGlzIHVzYWJsZSBhcyBhIGxlZGdlciBhY2NvdW50IGNvZGUgaW4gYQovLyBbUHJvcG9zZWRFbnRyeV0gbGVnLgovLwovLyBJdCBpcyBhIFdISVRFTElTVCDigJQgQVNDSUkgbGV0dGVycywgZGlnaXRzLCBgLmAsIGBfYCBhbmQgYC1gIOKAlCBhbmQgdGhhdAovLyBjaG9pY2UgaXMgdGhlIGd1YXJkLCBub3QgYSBzaWRlIGVmZmVjdCBvZiBpdC4gVGhlIGxlZ3MgZm9ybWF0IHIvYm9va3MnCi8vIFBvc3RNdWx0aSBhY2NlcHRzIGlzIGBjb2RlOnNpZGU6YW1vdW50YCBqb2luZWQgYnkgY29tbWFzLCBzbyBhIGNvZGUKLy8gY29udGFpbmluZyBgOmAgb3IgYCxgIHdvdWxkIGluamVjdCBleHRyYSBsZWdzIGludG8gYW4gZW50cnkgdGhpcyByZWFsbQovLyBwcmVzZW50cyBhcyBpdHMgb3duIGFyaXRobWV0aWM6IGEgY2FsbGVyIGNvdWxkIG1ha2UgYSBvbmUtbGluZSBwcm92aXNpb24KLy8gcmVhZCBhcyBhIGJhbGFuY2VkIHRocmVlLWxpbmUgZW50cnkgY3JlZGl0aW5nIGFuIGFjY291bnQgb2YgdGhlaXIgY2hvb3NpbmcuCi8vIEEgYmxhY2tsaXN0IG9mIHRob3NlIHR3byBieXRlcyB3b3VsZCBjbG9zZSB0b2RheSdzIGZvcm1hdCBhbmQgbm90IHRoZSBjbGFzcy4KLy8KLy8gV2hhdCB0aGlzIGRvZXMgTk9UIGNoZWNrIGlzIHdoZXRoZXIgdGhlIGNvZGUgZXhpc3RzLCBvciBpcyB0aGUgcmlnaHQga2luZCwKLy8gaW4gYW55IGxlZGdlci4gVGhpcyByZWFsbSByZWFkcyBubyBsZWRnZXIgYW5kIGhhcyBubyB3YXkgdG87IHRoZSBlbnRyeSBpcyBhCi8vIFBST1BPU0FMIGFuZCB0aGUgcG9zdGluZyByZWFsbSB2YWxpZGF0ZXMgaXRzIG93biBjaGFydC4KZnVuYyB2YWxpZENvZGUocyBzdHJpbmcpIGJvb2wgewoJaWYgbGVuKHMpID09IDAgfHwgbGVuKHMpID4gMTYgewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQlzd2l0Y2ggewoJCWNhc2UgYyA+PSAnYScgJiYgYyA8PSAneic6CgkJY2FzZSBjID49ICdBJyAmJiBjIDw9ICdaJzoKCQljYXNlIGMgPj0gJzAnICYmIGMgPD0gJzknOgoJCWNhc2UgYyA9PSAnLicgfHwgYyA9PSAnXycgfHwgYyA9PSAnLSc6CgkJZGVmYXVsdDoKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoJcmV0dXJuIHRydWUKfQoKLy8gZm9ybWF0SW50NjRMaXN0IHJlbmRlcnMgYSBzbGljZSBhcyB0aGUgY29tbWEtc2VwYXJhdGVkIGZvcm0gdGhlIHNldHRlcnMKLy8gYWNjZXB0LCBzbyBhIHJvdW5kIHRyaXAgdGhyb3VnaCBbU2NoZWR1bGVPZl0gYW5kIFtTZXRTY2hlZHVsZV0gaXMgZXhhY3QuCmZ1bmMgZm9ybWF0SW50NjRMaXN0KHYgW11pbnQ2NCkgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCWZvciBpLCBuIDo9IHJhbmdlIHYgewoJCWlmIGkgPiAwIHsKCQkJc2IuV3JpdGVTdHJpbmcoIiwiKQoJCX0KCQlzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChuLCAxMCkpCgl9CglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFdyaXRlCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gU2V0U2NoZWR1bGUgcmVnaXN0ZXJzIG9yIHJlcGxhY2VzIHRoZSBjYWxsZXIncyBvd24gYWdpbmcgc2NoZWR1bGUgYW5kCi8vIHJldHVybnMgaXRzIGJ1Y2tldCBjb3VudC4KLy8KLy8gYGVkZ2VzYCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGJsb2NrIGFnZXMsIHBvc2l0aXZlIGFuZCBzdHJpY3RseQovLyBpbmNyZWFzaW5nOyBgcmF0ZXNgIGlzIG9uZSBtb3JlIG51bWJlciB0aGFuIHRoZXJlIGFyZSBlZGdlcywgZWFjaCBpbgovLyBbMCwgUmF0ZVNjYWxlXSBhbmQgbm9uLWRlY3JlYXNpbmcuIFNvCi8vCi8vCVNldFNjaGVkdWxlKCIyMTYwMDAsNDMyMDAwLDY0ODAwMCIsICIwLDEwMDAsMjUwMCw1MDAwIikKLy8KLy8gcmVhZHMgYXM6IG5vdGhpbmcgcHJvdmlzaW9uZWQgdW5kZXIgMjE2LDAwMCBibG9ja3MgcGFzdCBkdWUsIDEwJSBmcm9tIHRoZXJlCi8vIHRvIDQzMiwwMDAsIDI1JSB0byA2NDgsMDAwLCA1MCUgYmV5b25kLiBFdmVyeSBjb25zdHJhaW50IGlzIHAvYWdpbmcncyBhbmQgaXMKLy8gdmFsaWRhdGVkIGJ5IGBhZ2luZy5OZXdgIHJhdGhlciB0aGFuIHJlLWNoZWNrZWQgaGVyZTsgYSBzZWNvbmQgY29weSBvZgovLyBzb21lYm9keSBlbHNlJ3MgdmFsaWRhdGlvbiBpcyBhIHNlY29uZCBwbGFjZSBmb3IgaXQgdG8gZHJpZnQuCi8vCi8vIFRoZSBvd25lciBpcyBgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpYCBhbmQgdGhlcmUgaXMgbm8gb3duZXIgcGFyYW1ldGVyLCBzbwovLyBhdXRob3JpemF0aW9uIGlzIHN0cnVjdHVyYWwgcmF0aGVyIHRoYW4gYSBjaGVjazogdGhlcmUgaXMgbm8gYWRkcmVzcyB0bwovLyBmb3JnZSBhbmQgbm8gd2F5IHRvIHNldCBhIHNjaGVkdWxlIGZvciBzb21lYm9keSBlbHNlLgovLwovLyBSRVBMQUNFTUVOVCBJUyBTQUZFIGFuZCB0aGF0IGlzIGEgcHJvcGVydHkgb2YgW3JlcG9ydF0sIG5vdCBvZiB0aGlzCi8vIGZ1bmN0aW9uOiBldmVyeSBwdWJsaXNoZWQgcmVwb3J0IHNuYXBzaG90cyB0aGUgc2NoZWR1bGUgdGhhdCBwcmljZWQgaXQsIHNvIGEKLy8gbmV3IHNjaGVkdWxlIGFwcGxpZXMgb25seSB0byByZXBvcnRzIHB1Ymxpc2hlZCBhZnRlciBpdC4gTm90aGluZyBhbHJlYWR5Ci8vIGZyb3plbiBpcyByZS1wcmljZWQuCmZ1bmMgU2V0U2NoZWR1bGUoY3VyIHJlYWxtLCBlZGdlcywgcmF0ZXMgc3RyaW5nKSBpbnQgewoJcmVmdXNlQ29pbnMoY3VyKQoJaXNzdWVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoKCS8vIGFnaW5nLk1heEJ1Y2tldHMgaXMgdGhlIGJ1Y2tldCBjZWlsaW5nLCBzbyBhdCBtb3N0IE1heEJ1Y2tldHMtMSBlZGdlcwoJLy8gYW5kIGF0IG1vc3QgTWF4QnVja2V0cyByYXRlcy4gQm91bmRpbmcgdGhlIHBhcnNlIHNlcGFyYXRlbHkga2VlcHMgYQoJLy8gdGhvdXNhbmQtZWxlbWVudCBzdHJpbmcgZnJvbSBiZWluZyBtYXRlcmlhbGlzZWQgYmVmb3JlIGFnaW5nLk5ldwoJLy8gcmVmdXNlcyBpdC4KCWUgOj0gcGFyc2VJbnQ2NExpc3QoZWRnZXMsIGFnaW5nLk1heEJ1Y2tldHMtMSwgImVkZ2UiKQoJciA6PSBwYXJzZUludDY0TGlzdChyYXRlcywgYWdpbmcuTWF4QnVja2V0cywgInJhdGUiKQoKCXMsIGVyciA6PSBhZ2luZy5OZXcoZSwgcikKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJyZWNlaXZhYmxlczogIiArIGVyci5FcnJvcigpKQoJfQoJc2NoZWR1bGVzLlNldChpc3N1ZXIuU3RyaW5nKCksIHMpCglyZXR1cm4gcy5OdW1CdWNrZXRzKCkKfQoKLy8gUHVibGlzaCBmcmVlemVzIGFuIGFnaW5nIHJlcG9ydCBvdmVyIHRoZSBuYW1lZCBpbnZvaWNlcyBhdCB0aGUgY3VycmVudAovLyBoZWlnaHQgYW5kIHJldHVybnMgaXRzIHNlcXVlbmNlIG51bWJlciwgd2hpY2ggc3RhcnRzIGF0IDEgZm9yIGVhY2ggaXNzdWVyLgovLwovLyBgaWRzYCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBjYWxsZXIncyBvd24gaW52b2ljZSBpZHMgaW4KLy8gW3IvaW52b2ljZXNdLCBhdCBtb3N0IFtNYXhJRHNQZXJDYWxsXSBvZiB0aGVtLiBUaGUgY2FsbGVyIG11c3QgaGF2ZQovLyByZWdpc3RlcmVkIGEgc2NoZWR1bGUgZmlyc3QuCi8vCi8vICMgV2hhdCBlYWNoIGlkIGlzIGNoZWNrZWQgZm9yCi8vCi8vIEFuIGlkIHdpdGggbm8gcmVjb3JkIGZvciB0aGlzIGlzc3VlciBQQU5JQ1MgYW5kIGZhaWxzIHRoZSB3aG9sZSBjYWxsLiBUaGF0Ci8vIGlzIGRlbGliZXJhdGU6IGEgc2lsZW50bHktZHJvcHBlZCBpZCBpcyBhbiB1bmRlci1yZXBvcnQsIGFuZCB1bmRlci1yZXBvcnRpbmcKLy8gaXMgdGhlIG9uZSBlcnJvciB0aGlzIHByb2R1Y3QgY2Fubm90IGRldGVjdCBhZnRlciB0aGUgZmFjdC4gVGhlIGV4aXN0ZW5jZQovLyBwcm9iZSBpcyBhIHNlcGFyYXRlIGBIYXNJbnZvaWNlYCBjYWxsIHJhdGhlciB0aGFuIGxldHRpbmcgdGhlIG5leHQgcmVhZAovLyBwYW5pYywgYmVjYXVzZSByL2ludm9pY2VzJyBvd24gbWVzc2FnZSBpcyBgInVua25vd24gaW52b2ljZSJgIGFuZCBkb2VzIG5vdAovLyBzYXkgV0hJQ0gg4oCUIHVuaGVscGZ1bCBpbiBhIGxpc3Qgb2Ygc2l4dHktZm91ci4KLy8KLy8gQW4gaWQgdGhhdCBleGlzdHMgYnV0IGlzIG5vdCBhZ2VhYmxlIGlzIGZpbHRlcmVkLCBjb3VudGVkLCBhbmQgcmVwb3J0ZWQ6Ci8vCi8vICAgLSBub3QgYG9wZW5gIOKAlCBzZXR0bGVkIG9yIHZvaWRlZCwgc28gbm90aGluZyBpcyBvd2VkLiBDb3VudGVkIGBub3RPcGVuYC4KLy8gICAtIG9wZW4gd2l0aCBub3RoaW5nIG91dHN0YW5kaW5nLiBDb3VudGVkIGB6ZXJvT3V0YC4KLy8gICAtIG9wZW4sIG93ZWQsIGJ1dCBgZHVlSGVpZ2h0ID4gbm93YC4gQ291bnRlZCBgbm90RHVlYC4KLy8KLy8gVGhlIHRoaXJkIG9uZSBpcyBub3QgYW4gb3B0aW1pc2F0aW9uLiBgYWdpbmcuUmVwb3J0QXRgIHJlcXVpcmVzIGBEdWVBdCA8PQovLyBub3dgIGZvciBFVkVSWSBvYmxpZ2F0aW9uIGFuZCBmYWlscyB0aGUgd2hvbGUgY2FsbCBvbiB0aGUgZmlyc3QgdGhhdCBpcyBub3QsCi8vIHNvIGEgcmVwb3J0IG92ZXIgYSBsaXN0IGNvbnRhaW5pbmcgb25lIGN1cnJlbnQgaW52b2ljZSB3b3VsZCBwcm9kdWNlIG5vdGhpbmcKLy8gYXQgYWxsLiBQcmUtZmlsdGVyaW5nIGhlcmUgaXMgd2hhdCBtYWtlcyAiYWdlIGV2ZXJ5dGhpbmcgSSBoYXZlIiBhIHVzYWJsZQovLyBjYWxsLCBhbmQgdGhlIGNvdW50IGlzIHdoYXQgc3RvcHMgdGhlIGZpbHRlciBiZWluZyBpbnZpc2libGUuCi8vCi8vICMgVGhlIG91dHN0YW5kaW5nIGNyb3NzLWNoZWNrCi8vCi8vIGBhbW91bnQgLSBwYWlkYCBpcyBjb21wdXRlZCBoZXJlIGFuZCBjb21wYXJlZCBhZ2FpbnN0IHIvaW52b2ljZXMnCi8vIGBPdXRzdGFuZGluZ2AuIFN0YXRlIGl0cyByZWFjaCBleGFjdGx5LCBiZWNhdXNlIHRoZSBmbGF0dGVyaW5nIHJlYWRpbmcgaXMKLy8gYXZhaWxhYmxlOiBib3RoIHNpZGVzIGFyZSB0aGF0IHJlYWxtJ3Mgb3duIHR3byBudW1iZXJzLCBzbyB0aGlzIGlzIGEKLy8gQ09OU1RBTlQgVFJVRSBhZ2FpbnN0IGFueSBkaXNhZ3JlZW1lbnQgaW4gSVRTIGFyaXRobWV0aWMgYW5kIG11c3QgbmV2ZXIgYmUKLy8gcXVvdGVkIGFzIGNyb3NzLWNoZWNraW5nIGl0LiBXaGF0IGl0IGNhdGNoZXMgaXMgYSB0cmFuc2NyaXB0aW9uIGVycm9yIGluCi8vIFRISVMgcmVhbG0g4oCUIHJlYWRpbmcgYHBhaWRgIHdoZXJlIGBhbW91bnRgIGJlbG9uZ3MgaW4gYSBzaXgtdmFsdWUgcmV0dXJuLCBvcgovLyBzdWJ0cmFjdGluZyB0aGUgd3Jvbmcgd2F5IHJvdW5kIOKAlCB3aGljaCBpcyB0aGUgb25lIHBsYWNlIGluIHRoaXMgcGF0aCBzdWNoCi8vIGFuIGVycm9yIGNvdWxkIGhhcHBlbiwgYW5kIGFuIGluZmxhdGVkIG91dHN0YW5kaW5nIGlzIGFuIG92ZXItcHJvdmlzaW9uIHRoYXQKLy8gc3RpbGwgY3Jvc3MtZm9vdHMuCi8vCi8vICMgVGhlIGlkIGxpc3QgaXMgbm90IHN0b3JlZAovLwovLyBBIHJlcG9ydCBrZWVwcyB0aGUgZmlndXJlcyBhbmQgdGhlIGNvdmVyYWdlIGNvdW50cywgbm90IHRoZSBpZHMuIFN0b3JpbmcgNjQKLy8gaWRzIHBlciByZXBvcnQgd291bGQgcm91Z2hseSBkb3VibGUgdGhlIHJlY29yZCBmb3IgdGhlIHNha2Ugb2YgYSBgVmVyaWZ5YAovLyB0aGF0IGNvdWxkIG5vdCBtZWFuIG11Y2ggYW55d2F5OiB0aGUgaW52b2ljZXMga2VlcCBtb3ZpbmcsIHNvIHJlLWRlcml2aW5nCi8vIHdvdWxkIGFuc3dlciAiZG8gdGhlIGZpZ3VyZXMgc3RpbGwgaG9sZCBhdCB0b2RheSdzIGhlaWdodCIgYW5kIG5vdCAid2FzIHRoaXMKLy8gcmVwb3J0IHJpZ2h0IHdoZW4gbWFkZSIuIHIvc3RhdGVtZW50cyBkb2N1bWVudHMgdGhlIHNhbWUgZGlzdGluY3Rpb24gYWJvdXQKLy8gaXRzIG93biBWZXJpZnkuIFRoZSBob25lc3QgYXJ0aWZhY3QgaXMgdGhlIGZyb3plbiBmaWd1cmUgcGx1cyB0aGUgY292ZXJhZ2UKLy8gbGluZS4KZnVuYyBQdWJsaXNoKGN1ciByZWFsbSwgaWRzIHN0cmluZykgaW50NjQgewoJcmVmdXNlQ29pbnMoY3VyKQoJaXNzdWVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoJcyA6PSBtdXN0U2NoZWR1bGUoaXNzdWVyKQoJbm93IDo9IHJ1bnRpbWUuQ2hhaW5IZWlnaHQoKQoKCWxpc3QsIGR1cGVzIDo9IHBhcnNlSURzKGlkcykKCgkvLyBBbiBlbXB0eSBsaXN0IGlzIHJlZnVzZWQ7IGEgbGlzdCB0aGF0IEZJTFRFUlMgRE9XTiB0byBub3RoaW5nIGlzIG5vdC4KCS8vIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgdGhlIHNlY29uZCBvbmUgaXMgYSBzdGF0ZW1lbnQg4oCUICJJIGFnZWQgdHdlbnR5CgkvLyBpbnZvaWNlcyBhbmQgbm9uZSBvZiB0aGVtIGlzIG92ZXJkdWUsIHNvIHRoZSBwcm92aXNpb24gaXMgemVybyIgaXMgYQoJLy8gcmVhbCBhbmQgdXNlZnVsIHJlcG9ydCwgYW5kIGl0cyBjb3ZlcmFnZSBsaW5lIHByb3ZlcyB0aGUgd29yay4gQW4gZW1wdHkKCS8vIGxpc3Qgc2F5cyBub3RoaW5nIGFuZCB3b3VsZCBjb3N0IGEgcGVybWFuZW50IHN0b3JhZ2UgZGVwb3NpdCB0byBzYXkgaXQuCgkvLwoJLy8gVEhFIFJFRlVTQUwgSVMgUkVBTCBBTkQgVEhJUyBCUkFOQ0ggSVMgTk9UIFdIQVQgUEVSRk9STVMgSVQuIFRoZSBtZXNzYWdlCgkvLyBiZWxvdyBpcyBVTlJFQUNIQUJMRSBhbmQgdGhlIGJyYW5jaCBpcyBkZWZlbnNpdmUsIGtlcHQgZm9yIHRoZSByZWFzb24KCS8vIHRoZSB6ZXJvT3V0IGNvdW50ZXIgaXMga2VwdDogYW4gaW52YXJpYW50IHdvcnRoIHJlbHlpbmcgb24gaXMgd29ydGgKCS8vIHN0YXRpbmcgd2hlcmUgaXQgaXMgcmVsaWVkIG9uLiBXaGF0IGEgY2FsbGVyIGFjdHVhbGx5IHNlZXMsIG1lYXN1cmVkLAoJLy8gYW5kIGFzc2VydGVkIGJ5IFRlc3RBbkVtcHR5T3JNYWxmb3JtZWRJZExpc3RJc1JlZnVzZWQ6CgkvLwoJLy8gICAtIFB1Ymxpc2goIiIpICBwYW5pY3MgYHJlY2VpdmFibGVzOiBlbXB0eSBpbnZvaWNlIGlkIGluICIiYCwgcmFpc2VkIGluCgkvLyAgICAgcGFyc2VJbnQ2NExpc3QuIHN0cmluZ3MuU3BsaXQoIiIsICIsIikgeWllbGRzIE9ORSBibGFuayBlbGVtZW50IGFuZAoJLy8gICAgIG5vdCB6ZXJvIGVsZW1lbnRzLCBzbyB0aGUgYmxhbmstZWxlbWVudCBndWFyZCBmaXJlcyBmaXJzdC4KCS8vICAgLSBQdWJsaXNoKCIgIikgdGhlIHNhbWUsIHZpYSBUcmltU3BhY2UuCgkvLyAgIC0gYW55IGxpc3QgdGhhdCBwYXJzZXMgcmVhY2hlcyBoZXJlIHdpdGggbGVuKGxpc3QpID49IDEsIGJlY2F1c2UKCS8vICAgICBwYXJzZUlEcyBhcHBlbmRzIHRoZSBGSVJTVCBvZiBldmVyeSBkdXBsaWNhdGUgcnVuIGFuZCBkcm9wcyBvbmx5IHRoZQoJLy8gICAgIHJlcGVhdHMg4oCUIGRlZHVwIGNhbm5vdCBlbXB0eSBhIG5vbi1lbXB0eSBsaXN0LgoJLy8KCS8vIFRoZSBub3RlIHRoaXMgcmVwbGFjZXMgZG9jdW1lbnRlZCB0aGUgcmVmdXNhbCBieSBxdW90aW5nIGEgc3RyaW5nIHRoZQoJLy8gcmVhbG0gY2Fubm90IGVtaXQuIEEgY29tbWVudCBhc3NlcnRpbmcgYW4gdW5yZWFjaGFibGUgbWVzc2FnZSBpcyBhIGNsYWltCgkvLyBubyB0ZXN0IGNhbiBmYWlsIG9uLCBhbmQgdGhpcyByZWFsbSBpcyBpbW11dGFibGUgYWZ0ZXIgYWRkcGtnLgoJaWYgbGVuKGxpc3QpID09IDAgewoJCXBhbmljKCJyZWNlaXZhYmxlczogbmFtZSBhdCBsZWFzdCBvbmUgaW52b2ljZSBpZCB0byBhZ2UiKQoJfQoKCW9icyA6PSBtYWtlKFtdYWdpbmcuT2JsaWdhdGlvbiwgMCwgbGVuKGxpc3QpKQoJdmFyIG5vdE9wZW4sIHplcm9PdXQsIG5vdER1ZSBpbnQKCWZvciBfLCBpZCA6PSByYW5nZSBsaXN0IHsKCQlpZiAhaW52b2ljZXMuSGFzSW52b2ljZShpc3N1ZXIsIGlkKSB7CgkJCXBhbmljKCJyZWNlaXZhYmxlczogIiArIEludm9pY2VzUGF0aCArICIgaG9sZHMgbm8gaW52b2ljZSAiICsKCQkJCXN0cmNvbnYuRm9ybWF0SW50KGlkLCAxMCkgKyAiIGZvciAiICsgaXNzdWVyLlN0cmluZygpKQoJCX0KCQlfLCBhbW91bnQsIHBhaWQsIGR1ZUhlaWdodCwgXywgc3RhdHVzIDo9IGludm9pY2VzLkludm9pY2VJbmZvKGlzc3VlciwgaWQpCgkJaWYgc3RhdHVzICE9IGludm9pY2VzLlN0YXR1c09wZW4gewoJCQlub3RPcGVuKysKCQkJY29udGludWUKCQl9CgkJb3V0IDo9IGFtb3VudCAtIHBhaWQKCQlpZiBvdXQgIT0gaW52b2ljZXMuT3V0c3RhbmRpbmcoaXNzdWVyLCBpZCkgewoJCQlwYW5pYygicmVjZWl2YWJsZXM6IG91dHN0YW5kaW5nIG1pc21hdGNoIG9uIGludm9pY2UgIiArCgkJCQlzdHJjb252LkZvcm1hdEludChpZCwgMTApICsKCQkJCSI7IHRoaXMgcmVhbG0gdHJhbnNjcmliZWQgdGhlIHJlY29yZCB3cm9uZ2x5IikKCQl9CgkJaWYgb3V0IDw9IDAgewoJCQl6ZXJvT3V0KysKCQkJY29udGludWUKCQl9CgkJaWYgZHVlSGVpZ2h0ID4gbm93IHsKCQkJbm90RHVlKysKCQkJY29udGludWUKCQl9CgkJb2JzID0gYXBwZW5kKG9icywgYWdpbmcuT2JsaWdhdGlvbntBbW91bnQ6IG91dCwgRHVlQXQ6IGR1ZUhlaWdodH0pCgl9CgoJLy8gTXVzdFJlcG9ydCwgbm90IGEgc29mdCBlcnJvcjogYW4gZXJyb3IgcmV0dXJuIGRvZXMgbm90IHJldmVydCBhIEdubwoJLy8gdHJhbnNhY3Rpb24gYW5kIG9ubHkgYSBwYW5pYyBkb2VzLiBFdmVyeSByZWZ1c2FsIGJlbG93IGlzIHAvYWdpbmcncyBhbmQKCS8vIGV2ZXJ5IHByZWNvbmRpdGlvbiBpdCBuYW1lcyBoYXMgYmVlbiBlc3RhYmxpc2hlZCBhYm92ZSwgc28gYSBwYW5pYyBoZXJlCgkvLyBtZWFucyB0aGlzIHJlYWxtIGZpbHRlcmVkIHdyb25nbHkuCglyZXAsIGVyciA6PSBzLlJlcG9ydEF0KG9icywgbm93KQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoInJlY2VpdmFibGVzOiAiICsgZXJyLkVycm9yKCkpCgl9CglieUIsIGVyciA6PSBzLlByb3Zpc2lvbkJ5QnVja2V0KHJlcCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJyZWNlaXZhYmxlczogIiArIGVyci5FcnJvcigpKQoJfQoJcHJvdiwgZXJyIDo9IHMuUHJvdmlzaW9uKHJlcCkKCWlmIGVyciAhPSBuaWwgewoJCXBhbmljKCJyZWNlaXZhYmxlczogIiArIGVyci5FcnJvcigpKQoJfQoKCS8vIENyb3NzLWZvb3QgdGhlIGNvbHVtbiBhZ2FpbnN0IHRoZSBncmFuZCB0b3RhbC4gcC9hZ2luZyBET0NVTUVOVFMgdGhhdAoJLy8gdGhlIHBlci1idWNrZXQgZmxvb3IgbWFrZXMgdGhlc2UgYWdyZWUgZXhhY3RseSwgYW5kIGEgZG9jdW1lbnRlZAoJLy8gaWRlbnRpdHkgYWNyb3NzIGEgcGFja2FnZSBib3VuZGFyeSBpcyB3b3J0aCBvbmUgbG9vcCB0byBhc3NlcnQ6IHRoaXMKCS8vIHJlYWxtIHB1Ymxpc2hlcyBib3RoIG51bWJlcnMgc2lkZSBieSBzaWRlIGFuZCBhIHJlYWRlciB3aWxsIHN1YnRyYWN0CgkvLyB0aGVtLgoJdmFyIHN1bSBpbnQ2NAoJZm9yIF8sIGIgOj0gcmFuZ2UgYnlCIHsKCQlzdW0gKz0gYgoJfQoJaWYgc3VtICE9IHByb3YgewoJCXBhbmljKCJyZWNlaXZhYmxlczogcGVyLWJ1Y2tldCBwcm92aXNpb24gZG9lcyBub3Qgc3VtIHRvIHRoZSB0b3RhbCIpCgl9CgoJa2V5IDo9IGlzc3Vlci5TdHJpbmcoKQoJc2VxIDo9IGludDY0KGlzc3VlckNvdW50KGtleSkpICsgMQoJcmVwb3J0cy5TZXQocmVwS2V5KGtleSwgc2VxKSwgJnJlcG9ydHsKCQlhdDogICAgICAgIG5vdywKCQlzY2hlZDogICAgIHMsCgkJdW5wYWlkOiAgICByZXAuQnVja2V0cywKCQlwcm92QnlCOiAgIGJ5QiwKCQl0b3RhbDogICAgIHJlcC5Ub3RhbCwKCQlwcm92aXNpb246IHByb3YsCgkJbGlzdGVkOiAgICBsZW4obGlzdCksCgkJYWdlZDogICAgICBsZW4ob2JzKSwKCQlub3RPcGVuOiAgIG5vdE9wZW4sCgkJemVyb091dDogICB6ZXJvT3V0LAoJCW5vdER1ZTogICAgbm90RHVlLAoJCWR1cGVzOiAgICAgZHVwZXMsCgkJb3BlbkF0OiAgICBpbnZvaWNlcy5PcGVuT2YoaXNzdWVyKSwKCQlyZWNvcmRzQXQ6IGludm9pY2VzLlJlY29yZHNPZihpc3N1ZXIpLAoJfSkKCWNvdW50cy5TZXQoa2V5LCBpbnQoc2VxKSkKCXJlcENvdW50KysKCXJldHVybiBzZXEKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFJlYWRzIOKAlCBzY2hlZHVsZXMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBIYXNTY2hlZHVsZSByZXBvcnRzIHdoZXRoZXIgYW4gaXNzdWVyIGhhcyByZWdpc3RlcmVkIGEgc2NoZWR1bGUsIHNvIGEgcmVhZGVyCi8vIGNhbiBkaXN0aW5ndWlzaCB0aGF0IGZyb20gdGhlIHBhbmljIFtTY2hlZHVsZU9mXSByYWlzZXMuCmZ1bmMgSGFzU2NoZWR1bGUoaXNzdWVyIGFkZHJlc3MpIGJvb2wgewoJcmV0dXJuIHNjaGVkdWxlcy5IYXMoaXNzdWVyLlN0cmluZygpKQp9CgovLyBTY2hlZHVsZU9mIHJldHVybnMgYW4gaXNzdWVyJ3MgQ1VSUkVOVCBzY2hlZHVsZSBpbiB0aGUgY29tbWEtc2VwYXJhdGVkIGZvcm0KLy8gW1NldFNjaGVkdWxlXSBhY2NlcHRzLCBzbyB0aGUgcm91bmQgdHJpcCBpcyBleGFjdC4KLy8KLy8gVGhpcyBpcyB0aGUgc2NoZWR1bGUgdGhhdCB3b3VsZCBwcmljZSB0aGUgaXNzdWVyJ3MgTkVYVCByZXBvcnQsIG5vdAovLyBuZWNlc3NhcmlseSB0aGUgb25lIHRoYXQgcHJpY2VkIHRoZWlyIGxhc3QuIFtTY2hlZHVsZVVzZWRdIGFuc3dlcnMgdGhhdC4KZnVuYyBTY2hlZHVsZU9mKGlzc3VlciBhZGRyZXNzKSAoZWRnZXMsIHJhdGVzIHN0cmluZykgewoJcyA6PSBtdXN0U2NoZWR1bGUoaXNzdWVyKQoJcmV0dXJuIGZvcm1hdEludDY0TGlzdChzLkVkZ2VzKCkpLCBmb3JtYXRJbnQ2NExpc3Qocy5SYXRlcygpKQp9CgovLyBCdWNrZXRzIGlzIGhvdyBtYW55IGFnZSBiYW5kcyBhbiBpc3N1ZXIncyBjdXJyZW50IHNjaGVkdWxlIGhhcy4KZnVuYyBCdWNrZXRzKGlzc3VlciBhZGRyZXNzKSBpbnQgeyByZXR1cm4gbXVzdFNjaGVkdWxlKGlzc3VlcikuTnVtQnVja2V0cygpIH0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZWFkcyDigJQgZnJvemVuIHJlcG9ydHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBDb3VudCBpcyBob3cgbWFueSByZXBvcnRzIGFuIGlzc3VlciBoYXMgcHVibGlzaGVkLiBaZXJvIGZvciBhbiBhZGRyZXNzIHRoYXQKLy8gbmV2ZXIgaGFzLCB3aGljaCBpcyBub3QgYW4gZXJyb3IuCmZ1bmMgQ291bnQoaXNzdWVyIGFkZHJlc3MpIGludCB7IHJldHVybiBpc3N1ZXJDb3VudChpc3N1ZXIuU3RyaW5nKCkpIH0KCi8vIExhdGVzdCBpcyBhbiBpc3N1ZXIncyBoaWdoZXN0IHNlcXVlbmNlIG51bWJlciwgYW5kIHdoZXRoZXIgdGhleSBoYXZlCi8vIHB1Ymxpc2hlZCBhdCBhbGwuIFRoZSBzZWNvbmQgcmVzdWx0IG1hdHRlcnM6IHNlcXVlbmNlIG51bWJlcnMgc3RhcnQgYXQgMSwgc28KLy8gYSB6ZXJvIGZpcnN0IHJlc3VsdCBtZWFucyAibmV2ZXIgcHVibGlzaGVkIiBhbmQgbmV2ZXIgInJlcG9ydCAwIi4KZnVuYyBMYXRlc3QoaXNzdWVyIGFkZHJlc3MpIChpbnQ2NCwgYm9vbCkgewoJbiA6PSBpc3N1ZXJDb3VudChpc3N1ZXIuU3RyaW5nKCkpCglpZiBuID09IDAgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIGludDY0KG4pLCB0cnVlCn0KCi8vIFRvdGFsIGlzIGhvdyBtYW55IHJlcG9ydHMgZXhpc3QgYWNyb3NzIGV2ZXJ5IGlzc3Vlci4gSXQgaXMgYSBjb3VudCBhbmQKLy8gbm90aGluZyBtb3JlOyBzZWUgdGhlIHBhY2thZ2UgZG9jIG9uIHdoeSB0aGVyZSBpcyBubyBjcm9zcy1pc3N1ZXIgcHJvdmlzaW9uLgpmdW5jIFRvdGFsKCkgaW50IHsgcmV0dXJuIHJlcENvdW50IH0KCi8vIEhhcyByZXBvcnRzIHdoZXRoZXIgYSByZXBvcnQgZXhpc3RzLCBzbyBhIHJlYWRlciBjYW4gZGlzdGluZ3Vpc2ggaXQgZnJvbSB0aGUKLy8gcGFuaWNzIHRoZSBhY2Nlc3NvcnMgYmVsb3cgcmFpc2UgZm9yIGFuIHVua25vd24gb25lLgpmdW5jIEhhcyhpc3N1ZXIgYWRkcmVzcywgc2VxIGludDY0KSBib29sIHsKCXJldHVybiByZXBvcnRzLkhhcyhyZXBLZXkoaXNzdWVyLlN0cmluZygpLCBzZXEpKQp9CgovLyBQdWJsaXNoZWRBdCBpcyB0aGUgY2hhaW4gaGVpZ2h0IGEgcmVwb3J0IHdhcyBmcm96ZW4gYXQuIEl0IGlzIGFsc28gdGhlIGBub3dgCi8vIGV2ZXJ5IGFnZSBpbiBpdCB3YXMgbWVhc3VyZWQgYWdhaW5zdC4KZnVuYyBQdWJsaXNoZWRBdChpc3N1ZXIgYWRkcmVzcywgc2VxIGludDY0KSBpbnQ2NCB7CglyZXR1cm4gbXVzdFJlcG9ydChpc3N1ZXIsIHNlcSkuYXQKfQoKLy8gUHJvdmlzaW9uIGlzIHRoZSBhbGxvd2FuY2UgZm9yIGNyZWRpdCBsb3NzZXMgYSByZXBvcnQgY29uY2x1ZGVkOiB0aGUgc3VtIG9mCi8vIHRoZSBwZXItYnVja2V0IGNvbHVtbiwgZWFjaCBidWNrZXQgZmxvb3JlZC4KZnVuYyBQcm92aXNpb24oaXNzdWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgaW50NjQgewoJcmV0dXJuIG11c3RSZXBvcnQoaXNzdWVyLCBzZXEpLnByb3Zpc2lvbgp9CgovLyBVbnBhaWQgaXMgdGhlIHRvdGFsIG91dHN0YW5kaW5nIHRoZSByZXBvcnQgYWdlZC4gSXQgaXMgdGhlIGRlbm9taW5hdG9yIHRoZQovLyBwcm92aXNpb24gaXMgYSBmcmFjdGlvbiBvZiwgYW5kIGl0IGNvdmVycyBPTkxZIHRoZSBhZ2VkIGludm9pY2VzIOKAlCBub3QgdGhlCi8vIGlzc3VlcidzIHdob2xlIHJlY2VpdmFibGUgYm9vay4gU2VlIFtDb3ZlcmFnZV0uCmZ1bmMgVW5wYWlkKGlzc3VlciBhZGRyZXNzLCBzZXEgaW50NjQpIGludDY0IHsKCXJldHVybiBtdXN0UmVwb3J0KGlzc3Vlciwgc2VxKS50b3RhbAp9CgovLyBUb3RhbHMgcmV0dXJucyBhIHJlcG9ydCdzIGhlYWRsaW5lIGZpZ3VyZXMgdG9nZXRoZXIsIHdoaWNoIGlzIHRoZSBzaGFwZSBhCi8vIHJlYWRlciB3YW50cyBhbmQgdGhlIHNoYXBlIHRoYXQgY2Fubm90IGJlIGFzc2VtYmxlZCBmcm9tIHR3byByZWFkcyBhdAovLyBkaWZmZXJlbnQgaGVpZ2h0cy4KZnVuYyBUb3RhbHMoaXNzdWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgKHVucGFpZCwgcHJvdmlzaW9uIGludDY0LCBhZ2VkIGludCkgewoJciA6PSBtdXN0UmVwb3J0KGlzc3Vlciwgc2VxKQoJcmV0dXJuIHIudG90YWwsIHIucHJvdmlzaW9uLCByLmFnZWQKfQoKLy8gQnVja2V0Q291bnQgaXMgaG93IG1hbnkgYWdlIGJhbmRzIGEgZnJvemVuIHJlcG9ydCBoYXMsIHdoaWNoIGlzIHRoZSBidWNrZXQKLy8gY291bnQgb2YgdGhlIHNjaGVkdWxlIHRoYXQgcHJpY2VkIGl0IGFuZCBtYXkgZGlmZmVyIGZyb20gdGhlIGlzc3VlcidzCi8vIGN1cnJlbnQgc2NoZWR1bGUuCmZ1bmMgQnVja2V0Q291bnQoaXNzdWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgaW50IHsKCXJldHVybiBsZW4obXVzdFJlcG9ydChpc3N1ZXIsIHNlcSkudW5wYWlkKQp9CgovLyBCdWNrZXRBdCByZXR1cm5zIG9uZSBsaW5lIGl0ZW0gb2YgYSBmcm96ZW4gcmVwb3J0LCB5b3VuZ2VzdCBiYW5kIGZpcnN0LgovLwovLyBgbG9gIGFuZCBgaGlgIGFyZSB0aGUgYmFuZCdzIGFnZSByYW5nZSBpbiBCTE9DS1MsIGhhbGYtb3BlbiBbbG8sIGhpKTsgd2hlbgovLyBgdW5ib3VuZGVkYCBpcyB0cnVlIHRoZSBiYW5kIGhhcyBubyB1cHBlciBlZGdlIGFuZCBgaGlgIGlzIG1lYW5pbmdsZXNzLiBBbgovLyBhZ2UgZXF1YWwgdG8gYW4gZWRnZSBiZWxvbmdzIHRvIHRoZSBPTERFUiBiYW5kLiBgcmF0ZWAgaXMgaW4gW1JhdGVTY2FsZV0KLy8gdW5pdHMsIGB1bnBhaWRgIGlzIHRoZSBvdXRzdGFuZGluZyB0b3RhbCB0aGF0IGxhbmRlZCBpbiB0aGUgYmFuZCwgYW5kCi8vIGBwcm92aXNpb25gIGlzIGBmbG9vcih1bnBhaWQgw5cgcmF0ZSAvIFJhdGVTY2FsZSlgLgpmdW5jIEJ1Y2tldEF0KGlzc3VlciBhZGRyZXNzLCBzZXEgaW50NjQsIGkgaW50KSAobG8sIGhpIGludDY0LCB1bmJvdW5kZWQgYm9vbCwgcmF0ZSwgdW5wYWlkLCBwcm92aXNpb24gaW50NjQpIHsKCXIgOj0gbXVzdFJlcG9ydChpc3N1ZXIsIHNlcSkKCWlmIGkgPCAwIHx8IGkgPj0gbGVuKHIudW5wYWlkKSB7CgkJcGFuaWMoInJlY2VpdmFibGVzOiBidWNrZXQgIiArIHN0cmNvbnYuSXRvYShpKSArICIgaXMgb3V0IG9mIHJhbmdlIGZvciBhIHJlcG9ydCB3aXRoICIgKwoJCQlzdHJjb252Lkl0b2EobGVuKHIudW5wYWlkKSkgKyAiIGJ1Y2tldHMiKQoJfQoJbG8sIGhpLCB1bmJvdW5kZWQsIGVyciA6PSByLnNjaGVkLkJ1Y2tldFJhbmdlKGkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYygicmVjZWl2YWJsZXM6ICIgKyBlcnIuRXJyb3IoKSkKCX0KCXJldHVybiBsbywgaGksIHVuYm91bmRlZCwgci5zY2hlZC5SYXRlcygpW2ldLCByLnVucGFpZFtpXSwgci5wcm92QnlCW2ldCn0KCi8vIFNjaGVkdWxlVXNlZCByZXR1cm5zIHRoZSBzY2hlZHVsZSB0aGF0IFBSSUNFRCBhIGZyb3plbiByZXBvcnQsIGluIHRoZQovLyBjb21tYS1zZXBhcmF0ZWQgZm9ybSBbU2V0U2NoZWR1bGVdIGFjY2VwdHMuCi8vCi8vIFRoaXMgZXhpc3RzIGJlY2F1c2UgcC9hZ2luZyB3YXJucyB0aGF0IGEgcmVwb3J0IGNhcnJpZXMgbm8gcmVmZXJlbmNlIHRvIGl0cwovLyBzY2hlZHVsZSBhbmQgdHdvIHNjaGVkdWxlcyBvZiB0aGUgc2FtZSBidWNrZXQgY291bnQgd2lsbCBzaWxlbnRseSBhY2NlcHQKLy8gZWFjaCBvdGhlcidzIHJlcG9ydHMuIEhlcmUgdGhlIHJlZmVyZW5jZSBpcyBzdG9yZWQsIHNvIGEgcmVhZGVyIGNhbiBzZWUgdGhlCi8vIHJhdGVzIHRoYXQgcHJvZHVjZWQgdGhlIGZpZ3VyZSByYXRoZXIgdGhhbiBpbmZlcnJpbmcgdGhlbSBmcm9tIHdoYXRldmVyIHRoZQovLyBpc3N1ZXIgaGFzIHJlZ2lzdGVyZWQgdG9kYXkuCmZ1bmMgU2NoZWR1bGVVc2VkKGlzc3VlciBhZGRyZXNzLCBzZXEgaW50NjQpIChlZGdlcywgcmF0ZXMgc3RyaW5nKSB7CglyIDo9IG11c3RSZXBvcnQoaXNzdWVyLCBzZXEpCglyZXR1cm4gZm9ybWF0SW50NjRMaXN0KHIuc2NoZWQuRWRnZXMoKSksIGZvcm1hdEludDY0TGlzdChyLnNjaGVkLlJhdGVzKCkpCn0KCi8vIENvdmVyYWdlIGlzIHRoZSBwYXJ0IG9mIGEgcmVwb3J0IGEgcmVhZGVyIG11c3Qgbm90IHNraXAuCi8vCi8vIFRoaXMgcmVhbG0gY2Fubm90IGVudW1lcmF0ZSBhbiBpc3N1ZXIncyBpbnZvaWNlcyAoc2VlIHRoZSBwYWNrYWdlIGRvYyksIHNvIGEKLy8gcmVwb3J0IGNvdmVycyBleGFjdGx5IHRoZSBpZHMgdGhlIGlzc3VlciBuYW1lZC4gVGhlc2UgZWlnaHQgbnVtYmVycyBhcmUgd2hhdAovLyBsZXQgYSByZWFkZXIganVkZ2Ugd2hldGhlciB0aGF0IHdhcyBldmVyeXRoaW5nOgovLwovLyAgIC0gYGxpc3RlZGAg4oCUIGRpc3RpbmN0IGlkcyBpbiB0aGUgY2FsbCwgYWZ0ZXIgZGVkdXBsaWNhdGlvbi4KLy8gICAtIGBhZ2VkYCDigJQgaWRzIHRoYXQgYmVjYW1lIG9ibGlnYXRpb25zIGluIHRoZSByZXBvcnQuIFRoZSBwcm92aXNpb24gY292ZXJzCi8vICAgICB0aGVzZSBhbmQgbm90aGluZyBlbHNlLgovLyAgIC0gYG5vdE9wZW5gIOKAlCBzZXR0bGVkIG9yIHZvaWRlZCwgc28gbm90aGluZyBvd2VkLgovLyAgIC0gYHplcm9PdXRgIOKAlCBvcGVuIHdpdGggbm90aGluZyBvdXRzdGFuZGluZy4KLy8gICAtIGBub3REdWVgIOKAlCBvcGVuIGFuZCBvd2VkLCBidXQgbm90IHlldCBkdWUgYXQgYFB1Ymxpc2hlZEF0YC4KLy8gICAtIGBkdXBlc2Ag4oCUIHJlcGVhdGVkIGlkcyBkcm9wcGVkIGJlZm9yZSBhZ2luZy4KLy8gICAtIGBvcGVuQXRgIOKAlCBgaW52b2ljZXMuT3Blbk9mKGlzc3VlcilgIGF0IHB1YmxpY2F0aW9uOiBob3cgbWFueSBvcGVuCi8vICAgICBpbnZvaWNlcyB0aGUgaXNzdWVyIGFjdHVhbGx5IGhlbGQuCi8vICAgLSBgcmVjb3Jkc0F0YCDigJQgYGludm9pY2VzLlJlY29yZHNPZihpc3N1ZXIpYCBhdCBwdWJsaWNhdGlvbjogcmVjb3JkcyBvZgovLyAgICAgYW55IHN0YXR1cywgd2hpY2ggaXMgdGhlIGZpZ3VyZSByL2ludm9pY2VzJyBwZXItaXNzdWVyIGNhcCBhcHBsaWVzIHRvLgovLwovLyBUaGUgYXJpdGhtZXRpYyB0byBkbzogYGFnZWQgKyB6ZXJvT3V0ICsgbm90RHVlYCBpcyBob3cgbWFueSBPUEVOIGludm9pY2VzCi8vIHRoZSByZXBvcnQgYWNjb3VudGVkIGZvciwgc28gYG9wZW5BdGAgbWludXMgdGhhdCBpcyAqKmhvdyBtYW55IG9wZW4gaW52b2ljZXMKLy8gd2VyZSBsZWZ0IG91dCoqLiBBIG5vbi16ZXJvIHJlbWFpbmRlciBtZWFucyB0aGUgcHJvdmlzaW9uIGlzIHVuZGVyc3RhdGVkIGJ5Ci8vIGFuIHVua25vd24gYW1vdW50LCBhbmQgbm8gcGFydCBvZiB0aGlzIHJlYWxtIGNhbiBzYXkgYnkgaG93IG11Y2guCi8vCi8vIGBsaXN0ZWQgPSBhZ2VkICsgbm90T3BlbiArIHplcm9PdXQgKyBub3REdWVgIGFsd2F5cyBob2xkczsgYGR1cGVzYCBpcwovLyBvdXRzaWRlIGl0LCBoYXZpbmcgYmVlbiBkcm9wcGVkIGJlZm9yZSB0aGUgZmlsdGVyLgovLwovLyAjIEFDQ09VTlRFRCBGT1IgSVMgTk9UIFRIRSBTQU1FIEFTIEFUIFJJU0sKLy8KLy8gYG5vdER1ZWAgY291bnRzIHRvd2FyZCAiYWNjb3VudGVkIGZvciIgYW5kIGNhcnJpZXMgTk8gcHJvdmlzaW9uLiBUaGF0IGlzCi8vIHJpZ2h0IG9uIGl0cyBvd24gdGVybXMg4oCUIHRoZSBpbnZvaWNlIHdhcyBleGFtaW5lZCwgYW5kIHAvYWdpbmcgZGVsaWJlcmF0ZWx5Ci8vIHJlZnVzZXMgdG8gYnVja2V0IHNvbWV0aGluZyB0aGF0IGlzIG5vdCB5ZXQgZHVlIOKAlCBidXQgaXQgbWFrZXMgb25lIHJlYWRpbmcKLy8gd3JvbmcgaW4gYSB3YXkgdGhlIGFyaXRobWV0aWMgYWJvdmUgd2lsbCBub3QgY2F0Y2guIEEgcmVhZGVyIHdobyB0YWtlcwovLyBgYWdlZGAgKG9yIHRoZSBwcm92aXNpb24pIGFzICJ0aGUgcmVjZWl2YWJsZXMgYXQgcmlzayIgd2hpbGUgYG5vdER1ZWAgaXMKLy8gbm9uLXplcm8gaGFzIG1lYXN1cmVkIGEgU1RSSUNUIFNVQlNFVCBvZiB0aGUgb3BlbiBib29rOiB0aGUgb21pdHRlZCBwYXJ0IGlzCi8vIG5vdCBvbWl0dGVkIGJ5IG1pc3Rha2UsIGl0IGlzIG1lcmVseSBub3QgZHVlIHlldCwgYW5kIGl0IGJlY29tZXMgZHVlIGxhdGVyCi8vIHdpdGggbm8gZnVydGhlciBjYWxsIHRvIHRoaXMgcmVhbG0uCi8vCi8vIFNvIGBPbWl0dGVkT3BlbiA9PSAwYCBtZWFucyAiZXZlcnkgb3BlbiBpbnZvaWNlIHdhcyBleGFtaW5lZCIsIG5ldmVyICJldmVyeQovLyBvcGVuIGludm9pY2UgaXMgcHJvdmlzaW9uZWQiLiBUaGUgc2Vjb25kIHF1ZXN0aW9uIGlzIGFuc3dlcmVkIGJ5IHJlYWRpbmcKLy8gYG5vdER1ZWAgYmVzaWRlIHRoZSBwcm92aXNpb24sIGFuZCB0aGUgcmVuZGVyIHBhZ2VzIHByaW50IGJvdGggZm9yIGV4YWN0bHkKLy8gdGhpcyByZWFzb24uCmZ1bmMgQ292ZXJhZ2UoaXNzdWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgKGxpc3RlZCwgYWdlZCwgbm90T3BlbiwgemVyb091dCwgbm90RHVlLCBkdXBlcywgb3BlbkF0LCByZWNvcmRzQXQgaW50KSB7CglyIDo9IG11c3RSZXBvcnQoaXNzdWVyLCBzZXEpCglyZXR1cm4gci5saXN0ZWQsIHIuYWdlZCwgci5ub3RPcGVuLCByLnplcm9PdXQsIHIubm90RHVlLCByLmR1cGVzLCByLm9wZW5BdCwgci5yZWNvcmRzQXQKfQoKLy8gT21pdHRlZE9wZW4gaXMgdGhlIGNvdmVyYWdlIGFyaXRobWV0aWMgYXMgb25lIG51bWJlcjogaG93IG1hbnkgb2YgdGhlCi8vIGlzc3VlcidzIG9wZW4gaW52b2ljZXMgdGhlIHJlcG9ydCBkaWQgbm90IGFjY291bnQgZm9yLCBhdCB0aGUgaGVpZ2h0IGl0IHdhcwovLyBwdWJsaXNoZWQuCi8vCi8vIFplcm8gaXMgdGhlIGFuc3dlciBhIGNvbXBsZXRlIHJlcG9ydCBnaXZlcy4gQSBwb3NpdGl2ZSBhbnN3ZXIgbWVhbnMgdGhlCi8vIHByb3Zpc2lvbiBpcyB1bmRlcnN0YXRlZC4gQSBORUdBVElWRSBhbnN3ZXIgaXMgcG9zc2libGUgYW5kIGlzIG5vdCBhIGJ1ZwovLyBoZXJlOiBgb3BlbkF0YCBpcyByZWFkIGFmdGVyIHRoZSBsb29wLCBzbyBhbiBpbnZvaWNlIHNldHRsZWQgb3Igdm9pZGVkIGJ5IGEKLy8gdHJhbnNhY3Rpb24gYmV0d2VlbiDigJQgaW1wb3NzaWJsZSB3aXRoaW4gb25lIHRyYW5zYWN0aW9uLCBidXQgdGhlIGZpZ3VyZSBpcyBhCi8vIHNuYXBzaG90IGVpdGhlciB3YXkg4oCUIHdvdWxkIG1ha2UgdGhlIGFjY291bnRlZCBzZXQgbGFyZ2VyIHRoYW4gdGhlIG9wZW4KLy8gY291bnQuIEl0IGlzIHJldHVybmVkIHNpZ25lZCByYXRoZXIgdGhhbiBjbGFtcGVkLCBiZWNhdXNlIGEgY2xhbXAgd291bGQgdHVybgovLyBhbiBpbmNvbnNpc3RlbmN5IGludG8gYSBjbGVhbiB6ZXJvLgpmdW5jIE9taXR0ZWRPcGVuKGlzc3VlciBhZGRyZXNzLCBzZXEgaW50NjQpIGludCB7CglyIDo9IG11c3RSZXBvcnQoaXNzdWVyLCBzZXEpCglyZXR1cm4gci5vcGVuQXQgLSAoci5hZ2VkICsgci56ZXJvT3V0ICsgci5ub3REdWUpCn0KCi8vIFByb3Bvc2VkRW50cnkgcmV0dXJucyB0aGUgZG91YmxlIGVudHJ5IHRoYXQgcmVjb3JkcyBhIHJlcG9ydCdzIHByb3Zpc2lvbiwgaW4KLy8gdGhlIGBjb2RlOnNpZGU6YW1vdW50YCBmb3JtIHIvYm9va3MnIFBvc3RNdWx0aSBhY2NlcHRzIOKAlCBhbmQgdGhpcyByZWFsbSBkb2VzCi8vIE5PVCBwb3N0IGl0LgovLwovLyBJdCBjYW5ub3QuIHIvYm9va3MgZGVyaXZlcyBhIGJvb2sncyBvd25lciBzdHJ1Y3R1cmFsbHkgZnJvbSBpdHMgY2FsbGVyLCBzbyBhCi8vIHBvc3RpbmcgbWFkZSBmcm9tIGhlcmUgd291bGQgbGFuZCBpbiB0aGlzIHJlYWxtJ3Mgb3duIGJvb2sgcmF0aGVyIHRoYW4gdGhlCi8vIGlzc3VlcidzLCBhbmQgdGhlcmUgaXMgbm8gb3duZXIgcGFyYW1ldGVyIGFuZCBubyBkZWxlZ2F0aW9uIHBhdGguIFRoZSBpc3N1ZXIKLy8gcG9zdHMgdGhpcyBzdHJpbmcgdGhlbXNlbHZlcywgZnJvbSB0aGVpciBvd24gYWNjb3VudCwgaW50byB0aGVpciBvd24gYm9vay4KLy8gVGhhdCBrZWVwcyB0aGlzIHJlYWxtIGtleWxlc3Mgd2l0aCByZXNwZWN0IHRvIGV2ZXJ5IGxlZGdlcjogaXQgY2Fubm90IHdyaXRlCi8vIGEgd3JvbmcgZW50cnkgYmVjYXVzZSBpdCBjYW5ub3Qgd3JpdGUuCi8vCi8vIFRoZSBlbnRyeSBkZWJpdHMgYGV4cGVuc2VDb2RlYCBhbmQgY3JlZGl0cyBgYWxsb3dhbmNlQ29kZWAgZm9yIHRoZSB3aG9sZQovLyBwcm92aXNpb246Ci8vCi8vCVByb3Bvc2VkRW50cnkoaXNzdWVyLCBzZXEsICJFLUJBRERFQlQiLCAiQS1BTExPVyIpCi8vCSAg4oaSICJFLUJBRERFQlQ6RDoxMjUwLEEtQUxMT1c6QzoxMjUwIgovLwovLyBCb3RoIGNvZGVzIGdvIHRocm91Z2ggW3ZhbGlkQ29kZV0sIGFuIEFTQ0lJIHdoaXRlbGlzdCwgYW5kIHRoZSByZWFzb24gaXMgdGhlCi8vIGZvcm1hdCBpdHNlbGY6IGEgY29kZSBjb250YWluaW5nIGA6YCBvciBgLGAgd291bGQgaW5qZWN0IGV4dHJhIGxlZ3MgaW50byBhCi8vIHN0cmluZyB0aGlzIHJlYWxtIHByZXNlbnRzIGFzIGl0cyBvd24gYXJpdGhtZXRpYy4gV2hldGhlciBhIGNvZGUgRVhJU1RTLCBvcgovLyBpcyB0aGUgcmlnaHQga2luZCwgaW4gYW55IGxlZGdlciBpcyBub3QgY2hlY2tlZCBhbmQgY2Fubm90IGJlIOKAlCB0aGlzIHJlYWxtCi8vIHJlYWRzIG5vIGxlZGdlci4KLy8KLy8gQSB6ZXJvIHByb3Zpc2lvbiBpcyByZWZ1c2VkIHJhdGhlciB0aGFuIHJldHVybmVkIGFzIGEgYmFsYW5jZWQgcGFpciBvZgovLyB6ZXJvcywgd2hpY2ggd291bGQgYmUgYSBzdG9yYWdlIGRlcG9zaXQgc3BlbnQgdG8gcG9zdCBub3RoaW5nLgovLwovLyBJdCBpcyBhIFBST1BPU0FMIGluIHRoZSBmdWxsIHNlbnNlOiBub3RoaW5nIGhlcmUgcmVjb3JkcyB0aGF0IGl0IHdhcyBwb3N0ZWQsCi8vIHBvc3RpbmcgaXQgdHdpY2UgZG91YmxlLWNvdW50cywgYW5kIHRoZSBhbGxvd2FuY2UgaXQgY3JlZGl0cyBpcyBhIGNvbnRyYQovLyBhc3NldCB3aG9zZSBwcmV2aW91cyBiYWxhbmNlIHRoaXMgcmVhbG0gY2Fubm90IHNlZS4gQW4gaXNzdWVyIHByb3Zpc2lvbmluZwovLyBtb250aGx5IHBvc3RzIHRoZSBERUxUQSwgbm90IHRoaXMgZmlndXJlLCBhbmQgd29ya2luZyB0aGF0IG91dCBpcyB0aGVpcnMuCmZ1bmMgUHJvcG9zZWRFbnRyeShpc3N1ZXIgYWRkcmVzcywgc2VxIGludDY0LCBleHBlbnNlQ29kZSwgYWxsb3dhbmNlQ29kZSBzdHJpbmcpIHN0cmluZyB7CglyIDo9IG11c3RSZXBvcnQoaXNzdWVyLCBzZXEpCglpZiByLnByb3Zpc2lvbiA9PSAwIHsKCQlwYW5pYygicmVjZWl2YWJsZXM6IHRoZSBwcm92aXNpb24gaXMgemVybzsgdGhlcmUgaXMgbm8gZW50cnkgdG8gcG9zdCIpCgl9CglpZiAhdmFsaWRDb2RlKGV4cGVuc2VDb2RlKSB7CgkJcGFuaWMoInJlY2VpdmFibGVzOiAiICsgc3RyY29udi5RdW90ZShleHBlbnNlQ29kZSkgKwoJCQkiIGlzIG5vdCBhIHVzYWJsZSBhY2NvdW50IGNvZGU7IHdhbnQgMS0xNiBvZiBbQS1aYS16MC05Ll8tXSIpCgl9CglpZiAhdmFsaWRDb2RlKGFsbG93YW5jZUNvZGUpIHsKCQlwYW5pYygicmVjZWl2YWJsZXM6ICIgKyBzdHJjb252LlF1b3RlKGFsbG93YW5jZUNvZGUpICsKCQkJIiBpcyBub3QgYSB1c2FibGUgYWNjb3VudCBjb2RlOyB3YW50IDEtMTYgb2YgW0EtWmEtejAtOS5fLV0iKQoJfQoJaWYgZXhwZW5zZUNvZGUgPT0gYWxsb3dhbmNlQ29kZSB7CgkJcGFuaWMoInJlY2VpdmFibGVzOiB0aGUgZXhwZW5zZSBhbmQgYWxsb3dhbmNlIGFjY291bnRzIG11c3QgZGlmZmVyIikKCX0KCW4gOj0gc3RyY29udi5Gb3JtYXRJbnQoci5wcm92aXNpb24sIDEwKQoJcmV0dXJuIGV4cGVuc2VDb2RlICsgIjpEOiIgKyBuICsgIiwiICsgYWxsb3dhbmNlQ29kZSArICI6QzoiICsgbgp9CgovLyBTb3VyY2UgaXMgdGhlIHJlYWxtIGV2ZXJ5IGZpZ3VyZSBoZXJlIGlzIHJlYWQgZnJvbSwgYnkgdmFsdWUgZnJvbSBpdHMgb3duCi8vIGV4cG9ydGVkIGNvbnN0YW50LgpmdW5jIFNvdXJjZSgpIHN0cmluZyB7IHJldHVybiBJbnZvaWNlc1BhdGggfQoKLy8gSGVpZ2h0IGlzIHRoZSBjdXJyZW50IGNoYWluIGhlaWdodCwgd2hpY2ggaXMgdGhlIGBub3dgIGEgcmVwb3J0IHB1Ymxpc2hlZCBpbgovLyB0aGlzIHRyYW5zYWN0aW9uIHdvdWxkIGJlIGFnZWQgYWdhaW5zdC4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIEhlbHBlcnMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyByZXBLZXkgaXMgaXNzdWVyfHBhZGRlZFNlcS4gVGhlIHNlcXVlbmNlIGlzIGxlZnQtcGFkZGVkIHRvIDE5IGRpZ2l0cyDigJQgdGhlCi8vIHdpZHRoIG9mIE1heEludDY0IOKAlCBzbyBsZXhpY29ncmFwaGljIG9yZGVyIG92ZXIgYW4gaXNzdWVyJ3MgcHJlZml4IGlzCi8vIG51bWVyaWMgb3JkZXIgb3ZlciB0aGVpciByZXBvcnRzLiBBbiB1bnBhZGRlZCBkZWNpbWFsIHdvdWxkIHNvcnQgIjEwIiBiZWZvcmUKLy8gIjkiLiBUaGUgY29udmVudGlvbiBpcyByL2ludm9pY2VzJyBpbnZLZXksIGFkb3B0ZWQgcmF0aGVyIHRoYW4gcmUtZGVyaXZlZC4KZnVuYyByZXBLZXkoaXNzdWVyIHN0cmluZywgc2VxIGludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdEludChzZXEsIDEwKQoJZm9yIGxlbihzKSA8IDE5IHsKCQlzID0gIjAiICsgcwoJfQoJcmV0dXJuIGlzc3VlciArICJ8IiArIHMKfQoKLy8gaXNzdWVyQ291bnQgcmVhZHMgYW4gaXNzdWVyJ3MgcmVwb3J0IGNvdW50LCB0cmVhdGluZyBhbiBhYnNlbnQga2V5IGFzIHplcm8uCi8vCi8vIGF2bC5UcmVlLkdldCByZXR1cm5zIE9ORSB2YWx1ZSBhbmQgY2Fubm90IGRpc3Rpbmd1aXNoIGFuIGFic2VudCBrZXkgZnJvbSBhCi8vIG5pbC12YWx1ZWQgb25lLCBzbyB0aGUgdHdvLXZhbHVlIHR5cGUgYXNzZXJ0aW9uIGNhcnJpZXMgdGhlIGV4aXN0ZW5jZSBhbnN3ZXIKLy8gaW4gb25lIHRyYXZlcnNhbC4gT25seSB0aGlzIGZpbGUgZXZlciBTZXRzLCBhbmQgaXQgb25seSBldmVyIFNldHMgYW4gaW50LgpmdW5jIGlzc3VlckNvdW50KGlzc3VlciBzdHJpbmcpIGludCB7CgluLCBvayA6PSBjb3VudHMuR2V0KGlzc3VlcikuKGludCkKCWlmICFvayB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBuCn0KCmZ1bmMgbXVzdFNjaGVkdWxlKGlzc3VlciBhZGRyZXNzKSBhZ2luZy5TY2hlZHVsZSB7CglzLCBvayA6PSBzY2hlZHVsZXMuR2V0KGlzc3Vlci5TdHJpbmcoKSkuKGFnaW5nLlNjaGVkdWxlKQoJaWYgIW9rIHsKCQlwYW5pYygicmVjZWl2YWJsZXM6ICIgKyBpc3N1ZXIuU3RyaW5nKCkgKwoJCQkiIGhhcyBubyBhZ2luZyBzY2hlZHVsZTsgY2FsbCBTZXRTY2hlZHVsZSBmaXJzdCIpCgl9CglyZXR1cm4gcwp9CgpmdW5jIG11c3RSZXBvcnQoaXNzdWVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgKnJlcG9ydCB7CglyLCBvayA6PSByZXBvcnRzLkdldChyZXBLZXkoaXNzdWVyLlN0cmluZygpLCBzZXEpKS4oKnJlcG9ydCkKCWlmICFvayB7CgkJcGFuaWMoInJlY2VpdmFibGVzOiBubyByZXBvcnQgIiArIHN0cmNvbnYuRm9ybWF0SW50KHNlcSwgMTApICsKCQkJIiBmb3IgIiArIGlzc3Vlci5TdHJpbmcoKSkKCX0KCXJldHVybiByCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZW5kZXIKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBSZW5kZXIgc2VydmVzIHRoZSBpbmRleCBhdCAiIiwgYW4gaXNzdWVyJ3MgcGFnZSBhdCAiPGFkZHJlc3M+IiwgYW5kIG9uZQovLyByZXBvcnQgYXQgIjxhZGRyZXNzPi88c2VxPiIuCi8vCi8vIEV2ZXJ5IGNhbGxlci1zdXBwbGllZCBzdHJpbmcgcmVhY2hpbmcgdGhlIG91dHB1dCBnb2VzIHRocm91Z2ggdGhlIHNhbml0aXplci4KLy8gVGhlIHN1cmZhY2UgaXMgbmFycm93ZXIgaGVyZSB0aGFuIGluIHRoZSBzaWJsaW5nIHJlYWxtcyDigJQgdGhpcyByZWFsbSBzdG9yZXMKLy8gbm8gZnJlZSB0ZXh0LCBzbyB0aGUgb25seSB1bnRydXN0ZWQgYnl0ZXMgYXJlIHRoZSBwYXRoIGl0c2VsZiDigJQgYW5kIGl0IGlzCi8vIHN0aWxsIHRoZSBvbmUgaW5qZWN0aW9uLXNoYXBlZCBzdXJmYWNlIGEgcmVhbG0gd2l0aCBubyBjdXN0b2R5IGhhcy4KZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CglwIDo9IHN0cmluZ3MuVHJpbVNwYWNlKHN0cmluZ3MuVHJpbShwYXRoLCAiLyIpKQoJaWYgcCA9PSAiIiB7CgkJcmV0dXJuIHJlbmRlckluZGV4KCkKCX0KCWlmIGkgOj0gc3RyaW5ncy5JbmRleChwLCAiLyIpOyBpID49IDAgewoJCWlzc3VlciA6PSBhZGRyZXNzKHN0cmluZ3MuVHJpbVNwYWNlKHBbOmldKSkKCQlyZXN0IDo9IHN0cmluZ3MuVHJpbVNwYWNlKHN0cmluZ3MuVHJpbShwW2krMTpdLCAiLyIpKQoJCXNlcSwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQocmVzdCwgMTAsIDY0KQoJCWlmIGVyciAhPSBuaWwgewoJCQlyZXR1cm4gIiMgcmVjZWl2YWJsZXNcblxuYCIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KHJlc3QpICsKCQkJCSJgIGlzIG5vdCBhIHJlcG9ydCBudW1iZXIuXG4iCgkJfQoJCXJldHVybiByZW5kZXJSZXBvcnQoaXNzdWVyLCBzZXEpCgl9CglyZXR1cm4gcmVuZGVySXNzdWVyKGFkZHJlc3MocCkpCn0KCmZ1bmMgcmVuZGVySW5kZXgoKSBzdHJpbmcgewoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcoIiMgcmVjZWl2YWJsZXMg4oCUIGFnaW5nIGFuZCB0aGUgYWxsb3dhbmNlIGZvciBjcmVkaXQgbG9zc2VzXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiQSByZWNlaXZhYmxlcyBhZ2luZyByZXBvcnQgYW5kIHRoZSByZXN1bHRpbmcgcHJvdmlzaW9uLCAiKQoJc2IuV3JpdGVTdHJpbmcoInByaWNlZCBmcm9tIGludm9pY2VzIGluIFtgIiArIEludm9pY2VzUGF0aCArICJgXSgiICsKCQlJbnZvaWNlc1BhdGggKyAiKSDigJQgbmV2ZXIgZnJvbSBhbW91bnRzIHN1cHBsaWVkIGhlcmUuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIj4gKipBIHJlcG9ydCBjb3ZlcnMgdGhlIGludm9pY2VzIHRoZSBpc3N1ZXIgbmFtZWQsIGFuZCAiKQoJc2IuV3JpdGVTdHJpbmcoIm5vdGhpbmcgZWxzZS4qKiBgIiArIEludm9pY2VzUGF0aCArICJgIGV4cG9ydHMgbm8gIikKCXNiLldyaXRlU3RyaW5nKCJwZXItaXNzdWVyIGVudW1lcmF0b3IsIHNvIHRoaXMgcmVhbG0gY2Fubm90IGZpbmQgYW4gIikKCXNiLldyaXRlU3RyaW5nKCJpbnZvaWNlIHRoYXQgd2FzIGxlZnQgb3V0LiBFdmVyeSByZXBvcnQgdGhlcmVmb3JlICIpCglzYi5Xcml0ZVN0cmluZygicHVibGlzaGVzIGEgY292ZXJhZ2UgbGluZSwgYW5kIGBPbWl0dGVkT3BlbmAgaXMgdGhlIG9uZSAiKQoJc2IuV3JpdGVTdHJpbmcoIm51bWJlciB0aGF0IHNheXMgd2hldGhlciB0aGUgcHJvdmlzaW9uIGlzIGNvbXBsZXRlLiBBICIpCglzYi5Xcml0ZVN0cmluZygicHJvdmlzaW9uIHJlYWQgd2l0aG91dCBpdCBpcyBiZWluZyByZWFkIHdyb25nbHkuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIFN0YXRlXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiLSByZXBvcnRzIHB1Ymxpc2hlZDogKioiICsgc3RyY29udi5JdG9hKHJlcENvdW50KSArICIqKlxuIikKCXNiLldyaXRlU3RyaW5nKCItIHNvdXJjZTogYCIgKyBJbnZvaWNlc1BhdGggKyAiYFxuIikKCXNiLldyaXRlU3RyaW5nKCItIGNoYWluIGhlaWdodDogKioiICsKCQlzdHJjb252LkZvcm1hdEludChydW50aW1lLkNoYWluSGVpZ2h0KCksIDEwKSArICIqKlxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIlRoZXJlIGlzIGRlbGliZXJhdGVseSBubyB3YXkgdG8gZW51bWVyYXRlIGlzc3VlcnMgb3IgdG8gIikKCXNiLldyaXRlU3RyaW5nKCJhZ2dyZWdhdGUgYSBwcm92aXNpb24gYWNyb3NzIHRoZW06IHN1Y2ggYSB0b3RhbCB3b3VsZCBzdW0gIikKCXNiLldyaXRlU3RyaW5nKCJldmVyeSBzdHJhbmdlcidzIHNlbGYtcmVwb3J0ZWQgcmVjZWl2YWJsZS5cblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgQWdlcyBhcmUgaW4gQkxPQ0tTXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiQW4gaW52b2ljZSdzIGBkdWVIZWlnaHRgIGlzIGEgYmxvY2sgaGVpZ2h0LCBzbyBhbiBhZ2UgaXMgIikKCXNiLldyaXRlU3RyaW5nKCJhIGNvdW50IG9mIGJsb2NrcyBhbmQgZXZlcnkgc2NoZWR1bGUgZWRnZSBpcyBhIGNvdW50IG9mICIpCglzYi5Xcml0ZVN0cmluZygiYmxvY2tzLiBBIFwiMzAvNjAvOTAgZGF5XCIgc2NoZWR1bGUgaXMgYSBjb252ZXJzaW9uIHRoZSAiKQoJc2IuV3JpdGVTdHJpbmcoImlzc3VlciBvd25zOyBub3RoaW5nIGhlcmUga25vd3MgdGhlIGJsb2NrIHRpbWUsIGFuZCAiKQoJc2IuV3JpdGVTdHJpbmcoImNvbXBpbGluZyBhIGd1ZXNzIGluIHdvdWxkIG1ha2UgZXZlcnkgcHVibGlzaGVkIHJhdGUgIikKCXNiLldyaXRlU3RyaW5nKCJ3cm9uZyBieSB3aGF0ZXZlciB0aGUgZ3Vlc3Mgd2FzIG9mZiBieS5cblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgVGhpcyByZWFsbSBwb3N0cyBubyBlbnRyeVxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIkEgcHJvdmlzaW9uIGlzIGEgZG91YmxlIGVudHJ5LCBhbmQgYFByb3Bvc2VkRW50cnlgICIpCglzYi5Xcml0ZVN0cmluZygicmV0dXJucyBpdCBhcyBhIHN0cmluZyB0aGUgbGVkZ2VyJ3MgYFBvc3RNdWx0aWAgYWNjZXB0cyDigJQgIikKCXNiLldyaXRlU3RyaW5nKCJmb3IgdGhlICoqaXNzdWVyKiogdG8gcG9zdCBmcm9tIHRoZWlyIG93biBhY2NvdW50LiAiKQoJc2IuV3JpdGVTdHJpbmcoIkEgbGVkZ2VyIGRlcml2ZXMgYSBib29rJ3Mgb3duZXIgZnJvbSBpdHMgY2FsbGVyLCBzbyBhICIpCglzYi5Xcml0ZVN0cmluZygicG9zdGluZyBtYWRlIGZyb20gaGVyZSB3b3VsZCBsYW5kIGluIHRoaXMgcmVhbG0ncyBib29rICIpCglzYi5Xcml0ZVN0cmluZygiYW5kIG5vdCB0aGUgaXNzdWVyJ3MuIFRoZSByZWFsbSBzdGF5cyBrZXlsZXNzIHdpdGggIikKCXNiLldyaXRlU3RyaW5nKCJyZXNwZWN0IHRvIGV2ZXJ5IGxlZGdlcjogaXQgY2Fubm90IHdyaXRlIGEgd3JvbmcgZW50cnkgIikKCXNiLldyaXRlU3RyaW5nKCJiZWNhdXNlIGl0IGNhbm5vdCB3cml0ZS5cblxuIikKCglzYi5Xcml0ZVN0cmluZygiIyMgVXNhZ2VcblxuIikKCXNiLldyaXRlU3RyaW5nKCJgYGBcbiIpCglzYi5Xcml0ZVN0cmluZygiU2V0U2NoZWR1bGUoXCIyMTYwMDAsNDMyMDAwLDY0ODAwMFwiLCBcIjAsMTAwMCwyNTAwLDUwMDBcIilcbiIpCglzYi5Xcml0ZVN0cmluZygic2VxIDo9IFB1Ymxpc2goXCIxLDIsMyw3XCIpICAgLy8gdGhlIGNhbGxlcidzIG93biBpbnZvaWNlIGlkc1xuIikKCXNiLldyaXRlU3RyaW5nKCJUb3RhbHMoaXNzdWVyLCBzZXEpICAgICAgICAgICAvLyB1bnBhaWQsIHByb3Zpc2lvbiwgYWdlZFxuIikKCXNiLldyaXRlU3RyaW5nKCJDb3ZlcmFnZShpc3N1ZXIsIHNlcSkgICAgICAgICAvLyByZWFkIHRoaXMgb25lXG4iKQoJc2IuV3JpdGVTdHJpbmcoIk9taXR0ZWRPcGVuKGlzc3Vlciwgc2VxKSAgICAgIC8vIDAgbWVhbnMgY29tcGxldGVcbiIpCglzYi5Xcml0ZVN0cmluZygiUHJvcG9zZWRFbnRyeShpc3N1ZXIsIHNlcSwgXCJFLUJBRERFQlRcIiwgXCJBLUFMTE9XXCIpXG4iKQoJc2IuV3JpdGVTdHJpbmcoImBgYFxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIkF0IG1vc3QgKioiICsgc3RyY29udi5JdG9hKE1heElEc1BlckNhbGwpICsgIioqIGlkcyBwZXIgIikKCXNiLldyaXRlU3RyaW5nKCJjYWxsLCB3aGljaCBpcyB0aGUgc291cmNlIHJlYWxtJ3Mgb3duIHBlci1pc3N1ZXIgcmVjb3JkICIpCglzYi5Xcml0ZVN0cmluZygiY2FwLCBzbyBhbiBhZ2luZyBuZXZlciBoYXMgdG8gYmUgY2h1bmtlZC5cblxuIikKCXNiLldyaXRlU3RyaW5nKCJBbiBpc3N1ZXIncyByZXBvcnRzIGFyZSBhdCBgIiArIFJlYWxtUGF0aCArCgkJIjo8YWRkcmVzcz5gLCBhbmQgb25lIHJlcG9ydCBhdCBgIiArIFJlYWxtUGF0aCArCgkJIjo8YWRkcmVzcz4vPHNlcT5gLlxuIikKCXJldHVybiBzYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlcklzc3Vlcihpc3N1ZXIgYWRkcmVzcykgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKCIjIHJlY2VpdmFibGVzIOKAlCAiICsgc2FuaXRpemUuSW5saW5lVGV4dChpc3N1ZXIuU3RyaW5nKCkpICsgIlxuXG4iKQoKCW4gOj0gaXNzdWVyQ291bnQoaXNzdWVyLlN0cmluZygpKQoJaWYgSGFzU2NoZWR1bGUoaXNzdWVyKSB7CgkJZSwgciA6PSBTY2hlZHVsZU9mKGlzc3VlcikKCQlzYi5Xcml0ZVN0cmluZygiQ3VycmVudCBzY2hlZHVsZTogZWRnZXMgYCIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGUpICsKCQkJImAgKGJsb2NrcyksIHJhdGVzIGAiICsgc2FuaXRpemUuSW5saW5lVGV4dChyKSArICJgIChvZiAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQoUmF0ZVNjYWxlLCAxMCkgKyAiKS5cblxuIikKCX0gZWxzZSB7CgkJc2IuV3JpdGVTdHJpbmcoIk5vIGFnaW5nIHNjaGVkdWxlIHJlZ2lzdGVyZWQuXG5cbiIpCgl9CglpZiBuID09IDAgewoJCXNiLldyaXRlU3RyaW5nKCJObyByZXBvcnRzIHB1Ymxpc2hlZC5cbiIpCgkJcmV0dXJuIHNiLlN0cmluZygpCgl9CgoJc2IuV3JpdGVTdHJpbmcoIlJlcG9ydHMgcHVibGlzaGVkOiAqKiIgKyBzdHJjb252Lkl0b2EobikgKyAiKioiKQoJZmlyc3QgOj0gaW50NjQoMSkKCWlmIGludDY0KG4pID4gUmVuZGVyUmVwb3J0TGltaXQgewoJCWZpcnN0ID0gaW50NjQobikgLSBSZW5kZXJSZXBvcnRMaW1pdCArIDEKCQlzYi5Xcml0ZVN0cmluZygiLCBzaG93aW5nIHRoZSBuZXdlc3QgIiArCgkJCXN0cmNvbnYuSXRvYShSZW5kZXJSZXBvcnRMaW1pdCkpCgl9CglzYi5Xcml0ZVN0cmluZygiLlxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCJ8IHNlcSB8IGhlaWdodCB8IHVucGFpZCB8IHByb3Zpc2lvbiB8IGFnZWQgfCBvbWl0dGVkIG9wZW4gfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18XG4iKQoJZm9yIHNlcSA6PSBpbnQ2NChuKTsgc2VxID49IGZpcnN0OyBzZXEtLSB7CgkJcmVwIDo9IG11c3RSZXBvcnQoaXNzdWVyLCBzZXEpCgkJcyA6PSBzdHJjb252LkZvcm1hdEludChzZXEsIDEwKQoJCS8vIFRoZSBpc3N1ZXIgaXMgc2FuaXRpemVkIGhlcmUgZXZlbiB0aG91Z2ggaXQgaXMgVU5SRUFDSEFCTEUgYXMKCQkvLyBhdHRhY2tlciBieXRlcywgYW5kIHRoZSByZWFzb24gaXMgdGhlIHBvaW50LiBUaGlzIGxvb3AgcnVucyBvbmx5CgkJLy8gd2hlbiBuICE9IDAsIGFuZCBuIGNvbWVzIGZyb20gaXNzdWVyQ291bnQoaXNzdWVyLlN0cmluZygpKSwgd2hpY2gKCQkvLyBpcyBrZXllZCBleGNsdXNpdmVseSBieSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkuU3RyaW5nKCkg4oCUIHRoZQoJCS8vIG9ubHkgdGhyZWUgLlNldCBjYWxscyBpbiB0aGlzIGZpbGUgYXJlIHNvIGtleWVkIOKAlCBzbyBhIHBhdGgKCQkvLyBhbiBhdHRhY2tlciBjaG9zZSBoYXMgY291bnQgMCBhbmQgcmV0dXJucyBhYm92ZS4gVGhlIHZhbHVlIGhlcmUgaXMKCQkvLyBhbHdheXMgYSBnZW51aW5lIGJlY2gzMiBhZGRyZXNzLCB3aG9zZSBjaGFyc2V0IGhvbGRzIG5vIG1hcmtkb3duCgkJLy8gbWV0YWNoYXJhY3Rlci4KCQkvLwoJCS8vIFRoYXQgaXMgYSBmb3VyLXN0ZXAgcmVhY2hhYmlsaXR5IGFyZ3VtZW50LCBhbmQgdGhlIGhlYWRlciB0aGlydHkKCQkvLyBsaW5lcyB1cCBzYW5pdGl6ZXMgdGhlIHNhbWUgdmFsdWUuIEFuIGF1ZGl0IHJhaXNlZCB0aGUKCQkvLyBpbmNvbnNpc3RlbmN5IGFuZCByZXNvbHZlZCBpdCBieSByZS1kZXJpdmluZyB0aGUgYXJndW1lbnQ7IHRoZQoJCS8vIHNhbml0aXplciBjb3N0cyBub3RoaW5nIGFuZCBtZWFucyB0aGUgbmV4dCByZWFkZXIgZG9lcyBub3QgaGF2ZSB0by4KCQkvLyBBIGd1YXJkIHRoYXQgZGVwZW5kcyBvbiBhbiBhcmd1bWVudCBob2xkaW5nIGVsc2V3aGVyZSBpbiB0aGUgZmlsZQoJCS8vIGlzIG9uZSByZWZhY3RvciBmcm9tIGJlaW5nIHdyb25nLCBhbmQgdGhpcyByZWFsbSBpcyBpbW11dGFibGUKCQkvLyBhZnRlciBhZGRwa2cuCgkJc2IuV3JpdGVTdHJpbmcoInwgWyIgKyBzICsgIl0oIiArIFJlYWxtUGF0aCArICI6IiArCgkJCXNhbml0aXplLklubGluZVRleHQoaXNzdWVyLlN0cmluZygpKSArICIvIiArIHMgKyAiKSB8ICIgKwoJCQlzdHJjb252LkZvcm1hdEludChyZXAuYXQsIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5Gb3JtYXRJbnQocmVwLnRvdGFsLCAxMCkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KHJlcC5wcm92aXNpb24sIDEwKSArICIgfCAiICsKCQkJc3RyY29udi5JdG9hKHJlcC5hZ2VkKSArICIgfCAiICsKCQkJc3RyY29udi5JdG9hKHJlcC5vcGVuQXQtKHJlcC5hZ2VkK3JlcC56ZXJvT3V0K3JlcC5ub3REdWUpKSArICIgfFxuIikKCX0KCXJldHVybiBzYi5TdHJpbmcoKQp9CgpmdW5jIHJlbmRlclJlcG9ydChpc3N1ZXIgYWRkcmVzcywgc2VxIGludDY0KSBzdHJpbmcgewoJaWYgIUhhcyhpc3N1ZXIsIHNlcSkgewoJCXJldHVybiAiIyByZWNlaXZhYmxlc1xuXG5ObyByZXBvcnQgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KHNlcSwgMTApICsgIiBmb3IgYCIgKwoJCQlzYW5pdGl6ZS5JbmxpbmVUZXh0KGlzc3Vlci5TdHJpbmcoKSkgKyAiYC5cbiIKCX0KCXIgOj0gbXVzdFJlcG9ydChpc3N1ZXIsIHNlcSkKCgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglzYi5Xcml0ZVN0cmluZygiIyByZWNlaXZhYmxlcyDigJQgcmVwb3J0ICIgKyBzdHJjb252LkZvcm1hdEludChzZXEsIDEwKSArICJcblxuIikKCXNiLldyaXRlU3RyaW5nKCJJc3N1ZXIgYCIgKyBzYW5pdGl6ZS5JbmxpbmVUZXh0KGlzc3Vlci5TdHJpbmcoKSkgKwoJCSJgLCBmcm96ZW4gYXQgaGVpZ2h0ICoqIiArIHN0cmNvbnYuRm9ybWF0SW50KHIuYXQsIDEwKSArCgkJIioqLCBmcm9tIGAiICsgSW52b2ljZXNQYXRoICsgImAuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIi0gdW5wYWlkIGFnZWQ6ICoqIiArIHN0cmNvbnYuRm9ybWF0SW50KHIudG90YWwsIDEwKSArICIqKlxuIikKCXNiLldyaXRlU3RyaW5nKCItIHByb3Zpc2lvbjogKioiICsgc3RyY29udi5Gb3JtYXRJbnQoci5wcm92aXNpb24sIDEwKSArICIqKlxuIikKCXNiLldyaXRlU3RyaW5nKCItIHNjaGVkdWxlIHVzZWQ6IGVkZ2VzIGAiICsKCQlzYW5pdGl6ZS5JbmxpbmVUZXh0KGZvcm1hdEludDY0TGlzdChyLnNjaGVkLkVkZ2VzKCkpKSArCgkJImAsIHJhdGVzIGAiICsgc2FuaXRpemUuSW5saW5lVGV4dChmb3JtYXRJbnQ2NExpc3Qoci5zY2hlZC5SYXRlcygpKSkgKwoJCSJgXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIEJ1Y2tldHNcblxuIikKCXNiLldyaXRlU3RyaW5nKCJBZ2VzIGluICoqYmxvY2tzKiosIHlvdW5nZXN0IGJhbmQgZmlyc3QuIEEgYmFuZCBpcyAiKQoJc2IuV3JpdGVTdHJpbmcoImhhbGYtb3BlbiBgW2xvLCBoaSlgLCBzbyBhbiBhZ2UgZXF1YWwgdG8gYW4gZWRnZSBiZWxvbmdzICIpCglzYi5Xcml0ZVN0cmluZygidG8gdGhlIG9sZGVyIGJhbmQuXG5cbiIpCglzYi5Xcml0ZVN0cmluZygifCBiYW5kIHwgZnJvbSB8IHRvIHwgcmF0ZSB8IHVucGFpZCB8IHByb3Zpc2lvbiB8XG4iKQoJc2IuV3JpdGVTdHJpbmcoInwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIpCglyYXRlcyA6PSByLnNjaGVkLlJhdGVzKCkKCWZvciBpIDo9IHJhbmdlIHIudW5wYWlkIHsKCQlsbywgaGksIHVuYm91bmRlZCwgZXJyIDo9IHIuc2NoZWQuQnVja2V0UmFuZ2UoaSkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcGFuaWMoInJlY2VpdmFibGVzOiAiICsgZXJyLkVycm9yKCkpCgkJfQoJCXRvIDo9IHN0cmNvbnYuRm9ybWF0SW50KGhpLCAxMCkKCQlpZiB1bmJvdW5kZWQgewoJCQl0byA9ICLigJQiCgkJfQoJCXNiLldyaXRlU3RyaW5nKCJ8ICIgKyBzdHJjb252Lkl0b2EoaSkgKyAiIHwgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGxvLCAxMCkgKyAiIHwgIiArIHRvICsgIiB8ICIgKwoJCQlzdHJjb252LkZvcm1hdEludChyYXRlc1tpXSwgMTApICsgIiB8ICIgKwoJCQlzdHJjb252LkZvcm1hdEludChyLnVucGFpZFtpXSwgMTApICsgIiB8ICIgKwoJCQlzdHJjb252LkZvcm1hdEludChyLnByb3ZCeUJbaV0sIDEwKSArICIgfFxuIikKCX0KCXNiLldyaXRlU3RyaW5nKCJcblRoZSBwcm92aXNpb24gY29sdW1uIGlzIGZsb29yZWQgKipwZXIgYmFuZCoqLCBzbyBpdCAiKQoJc2IuV3JpdGVTdHJpbmcoInN1bXMgdG8gdGhlIHRvdGFsIGV4YWN0bHkgYW5kIGJvdGggYXJlIGF0IG9yIGJlbG93IHRoZSAiKQoJc2IuV3JpdGVTdHJpbmcoInVucm91bmRlZCBmaWd1cmUuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIENvdmVyYWdlXG5cbiIpCglvbWl0dGVkIDo9IHIub3BlbkF0IC0gKHIuYWdlZCArIHIuemVyb091dCArIHIubm90RHVlKQoJc2IuV3JpdGVTdHJpbmcoInwgbGlzdGVkIHwgYWdlZCB8IG5vdCBvcGVuIHwgbm90aGluZyBvd2VkIHwgbm90IHlldCBkdWUgfCBkdXBlcyBkcm9wcGVkIHwgb3BlbiB0aGVuIHwgcmVjb3JkcyB0aGVuIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18XG58ICIgKwoJCXN0cmNvbnYuSXRvYShyLmxpc3RlZCkgKyAiIHwgIiArIHN0cmNvbnYuSXRvYShyLmFnZWQpICsgIiB8ICIgKwoJCXN0cmNvbnYuSXRvYShyLm5vdE9wZW4pICsgIiB8ICIgKyBzdHJjb252Lkl0b2Eoci56ZXJvT3V0KSArICIgfCAiICsKCQlzdHJjb252Lkl0b2Eoci5ub3REdWUpICsgIiB8ICIgKyBzdHJjb252Lkl0b2Eoci5kdXBlcykgKyAiIHwgIiArCgkJc3RyY29udi5JdG9hKHIub3BlbkF0KSArICIgfCAiICsgc3RyY29udi5JdG9hKHIucmVjb3Jkc0F0KSArICIgfFxuXG4iKQoKCWlmIG9taXR0ZWQgPiAwIHsKCQlzYi5Xcml0ZVN0cmluZygiPiAqKlRoaXMgcmVwb3J0IGlzIGluY29tcGxldGUuKiogIiArCgkJCXN0cmNvbnYuSXRvYShvbWl0dGVkKSArICIgb2YgdGhlIGlzc3VlcidzIG9wZW4gaW52b2ljZXMgd2VyZSAiKQoJCXNiLldyaXRlU3RyaW5nKCJub3QgbmFtZWQgaW4gdGhlIGNhbGwsIHNvIHRoZSBwcm92aXNpb24gaXMgIikKCQlzYi5Xcml0ZVN0cmluZygidW5kZXJzdGF0ZWQgYnkgYW4gYW1vdW50IG5vdGhpbmcgaGVyZSBjYW4gZGV0ZXJtaW5lLlxuIikKCX0gZWxzZSBpZiBvbWl0dGVkID09IDAgewoJCXNiLldyaXRlU3RyaW5nKCJFdmVyeSBvcGVuIGludm9pY2UgdGhlIGlzc3VlciBoZWxkIGF0IHRoYXQgaGVpZ2h0IHdhcyAiKQoJCXNiLldyaXRlU3RyaW5nKCJhY2NvdW50ZWQgZm9yLlxuIikKCX0gZWxzZSB7CgkJc2IuV3JpdGVTdHJpbmcoIj4gVGhlIGFjY291bnRlZCBzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIG9wZW4gY291bnQgYnkgIiArCgkJCXN0cmNvbnYuSXRvYSgtb21pdHRlZCkgKyAiLCB3aGljaCBpcyByZXBvcnRlZCByYXRoZXIgdGhhbiAiKQoJCXNiLldyaXRlU3RyaW5nKCJjbGFtcGVkLiBTZWUgYE9taXR0ZWRPcGVuYC5cbiIpCgl9CglyZXR1cm4gc2IuU3RyaW5nKCkKfQoiDTEwMDAwMDAwdWdub3QSEgjypfdZEgsxODg2MDJ1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIW9DF2ySV4zjQumeJvrSn3/nxG7XBDVv+rkxV/YrsOmBJAOHMcC/Duqp+Rwvjl6qqnz/XvfoDXu+7wiVnkjGDfjNcqhxE1ADv5wExC8pS8fIw375WnYRCjgrWiUs6c2dmKixooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ=="
  }
}