{
  "jsonrpc": "2.0",
  "id": "",
  "result": {
    "hash": "7/5VVPj3m82u4tEJWPWqhrSvfr289+/ZeYCb7gxm0zI=",
    "height": "474634",
    "index": 0,
    "tx_result": {
      "ResponseBase": {
        "Error": null,
        "Data": null,
        "Events": null,
        "Log": "msg:0,success:true,log:,events:[]",
        "Info": ""
      },
      "GasWanted": "127212294",
      "GasUsed": "84808196"
    },
    "tx": "Crz5AwoML3ZtLm1fYWRkcGtnEqr5AwooZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMxLt+AMKCGNhc2hmbG93Ejxnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvY2FzaGZsb3cavPcDCgxjYXNoZmxvdy5nbm8SqvcDLy8gUGFja2FnZSBjYXNoZmxvdyBwdWJsaXNoZXMgYSBkaXJlY3QtbWV0aG9kIHN0YXRlbWVudCBvZiBjYXNoIGZsb3dzIG92ZXIgYQovLyBib29rIHRoaXMgcmVhbG0gZG9lcyBub3Qgb3duLCBjYW5ub3Qgd3JpdGUsIGFuZCBkaWQgbm90IHN1cHBseS4KLy8KLy8gIyBXaGF0IGl0IGlzLCBpbiBvbmUgc2VudGVuY2UKLy8KLy8gQW4gb3duZXIgb2YgYSBib29rIGluIFtyL2Jvb2tzXSBkZWNsYXJlcyB3aGljaCBvZiB0aGVpciBhY2NvdW50IGNvZGVzIGhvbGQKLy8gY2FzaCBhbmQgd2hhdCBldmVyeSBvdGhlciBjb2RlJ3MgbW92ZW1lbnQgaXMgZm9yOyB0aGlzIHJlYWxtIHRoZW4gcmVhZHMgdGhlCi8vIGVudHJpZXMgaW4gYSB3aW5kb3cgc3RyYWlnaHQgb3V0IG9mIHRoYXQgbGVkZ2VyLCBoYW5kcyB0aGVtIHRvIFtwL2Nhc2hmbG93XSwKLy8gYW5kIGZyZWV6ZXMgdGhlIHJlc3VsdGluZyBzdGF0ZW1lbnQgYXQgYSBzZXF1ZW5jZSBudW1iZXIuCi8vCi8vICMgQSBQVUJMSVNIRUQgU1RBVEVNRU5UIElTIEEgQ0xBSU0gQUJPVVQgQSBDTEFJTSDigJQgYW5kIGhlcmUsIGFib3V0IFRXTwovLwovLyBbci9zdGF0ZW1lbnRzXSBhbHJlYWR5IHNheXMgdGhpcyBvZiBpdHNlbGYgYW5kIGl0IGlzIHRydWUgaGVyZSB3aXRoIG9uZQovLyBleHRyYSBsYXllci4gQSBib29rIGlzIGEgc2V0IG9mIGNsYWltcyBieSBpdHMgb3duZXI7IG5vdGhpbmcgdGllcyBhbiBhY2NvdW50Ci8vIHJlYWRpbmcgYENhc2ggNTAwMGAgdG8gNTAwMCByZWFsIHVnbm90IGFueXdoZXJlLiBBIGNhc2gtZmxvdyBzdGF0ZW1lbnQKLy8gZGVyaXZlZCBmcm9tIHN1Y2ggYSBib29rIGluaGVyaXRzIHRoYXQgY29tcGxldGVseSwgYW5kIHRoZW4gYWRkcyBhIFNFQ09ORAovLyBjYWxsZXIgZGVjbGFyYXRpb24gb24gdG9wOiB3aGljaCBjb2RlcyBhcmUgY2FzaCBhdCBhbGwuCi8vCi8vIFtwL2Nhc2hmbG93XSBzdGF0ZXMgdGhlIGNvbnNlcXVlbmNlIGV4YWN0bHkgYW5kIGl0IGlzIHJlcGVhdGVkIGhlcmUgcmF0aGVyCi8vIHRoYW4gbGlua2VkLCBiZWNhdXNlIGl0IGlzIHRoZSBzaW5nbGUgbW9zdCBpbXBvcnRhbnQgc2VudGVuY2UgYWJvdXQgdGhpcwovLyByZWFsbTogKiJBIHJlYWxtIHRoYXQgZGVjbGFyZXMgYSByZWNlaXZhYmxlIGFzIGNhc2ggcHJvZHVjZXMgYSBwbGF1c2libGUsCi8vIHdyb25nIHN0YXRlbWVudC4gVGhlIGRlY2xhcmF0aW9uIGlzIHRoZSB0cnVzdCBib3VuZGFyeS4iKgovLwovLyBTbyB3aGF0IHRoaXMgcmVhbG0gZ3VhcmFudGVlcyBpcyBuYXJyb3c6Ci8vCi8vICAgLSB0aGUgRU5UUklFUyBhcmUgcmVhZCBmcm9tIFtyL2Jvb2tzXSwgbm90IHN1cHBsaWVkIGJ5IHRoZSBwdWJsaXNoZXI7Ci8vICAgLSB0aGUgQ0xBU1NJRklDQVRJT04gaXMgdGhlIHB1Ymxpc2hlcidzIG93biBkZWNsYXJlZCBwb2xpY3ksIGZyb3plbiB3aXRoCi8vICAgICB0aGUgc3RhdGVtZW50IHNvIGEgcmVhZGVyIHNlZXMgd2hhdCBpdCB3YXM7Ci8vICAgLSB0aGUgQVJJVEhNRVRJQyBpcyBbcC9jYXNoZmxvd10ncywgd2hpY2ggbm9ib2R5IGhlcmUgY2FuIHBhcmFtZXRlcmlzZS4KLy8KLy8gVGhhdCB0aGUgY2hhcnQgZGVzY3JpYmVzIGFueXRoaW5nIHJlYWwsIGFuZCB0aGF0IHRoZSBjb2RlcyBjYWxsZWQgY2FzaCBob2xkCi8vIGNhc2gsIGFyZSBub3QgY2xhaW1lZCBoZXJlIGFuZCBhcmUgbm90IGNoZWNrYWJsZSBmcm9tIGhlcmUuCi8vCi8vICMgRGVyaXZlZCwgbm90IHN1cHBsaWVkIOKAlCBhbmQgdGhlIG9uZSBmaWd1cmUgdGhhdCBpcyBzdXBwbGllZAovLwovLyBFdmVyeSBmaWd1cmUgY29tZXMgZnJvbSBbci9ib29rc10gdGhyb3VnaCBpdHMgb3duIHJlYWQgc3VyZmFjZSwgZXhjZXB0IG9uZS4KLy8gW3AvY2FzaGZsb3ddIGNhbm5vdCBkZXJpdmUgYW4gT1BFTklORyBjYXNoIHBvc2l0aW9uIGZyb20gYSB3aW5kb3ctZmlsdGVyZWQKLy8gZW50cnkgc2xpY2Ug4oCUIGEgd2luZG93IGNhcnJpZXMgcGVyaW9kIG1vdmVtZW50LCBub3QgYSBjdW11bGF0aXZlIHBvc2l0aW9uIOKAlAovLyBzbyBgb3BlbmluZ2AgaXMgYW4gYXJndW1lbnQgdG8gW1B1Ymxpc2hdIGFuZCBpcyBlY2hvZWQgaW50byB0aGUgcmVwb3J0Ci8vIHVuY2hhbmdlZC4gW0Nsb3NpbmddIGlzIGBPcGVuaW5nICsgTmV0Q2hhbmdlYCBhbmQgaXMgdGhlcmVmb3JlIG9ubHkgYXMgZ29vZAovLyBhcyBhIG51bWJlciB0aGUgcHVibGlzaGVyIHR5cGVkLgovLwovLyBUaGlzIHJlYWxtIGRvZXMgbm90IGxlYXZlIGl0IGF0IHRoYXQuIFNlZSBbT3BlbmluZ1JlY29uY2lsZWRdOiB3aGVuIHRoZQovLyB3aW5kb3cgZXh0ZW5kcyBwYXN0IGV2ZXJ5IGVudHJ5IHRoZSBib29rIGhvbGRzLCB0aGUgc3VtIG9mIHRoZSBkZWNsYXJlZCBjYXNoCi8vIGFjY291bnRzJyBiYWxhbmNlcyBpcyB0aGUgY3VtdWxhdGl2ZSBjYXNoIHBvc2l0aW9uLCBhbmQgdGhhdCBpcyBjb21wYXJhYmxlCi8vIHRvIFtDbG9zaW5nXS4gV2hlcmUgdGhlIGNvbXBhcmlzb24gaXMgYXZhaWxhYmxlLCBbUHVibGlzaF0gUkVGVVNFUyB0bwovLyBwdWJsaXNoIGEgc3RhdGVtZW50IHRoYXQgZmFpbHMgaXQuIFdoZXJlIGl0IGlzIG5vdCBhdmFpbGFibGUsIHRoZSByZXBvcnQKLy8gc2F5cyBzbyBhbmQgdGhlIGZpZ3VyZSBzdGFuZHMgYXMgYSBkZWNsYXJhdGlvbi4KLy8KLy8gIyBUaGUgd2luZG93IGlzIFJFRlVTRUQgd2hlbiBpdCBpcyB0b28gd2lkZSwgbmV2ZXIgY2h1bmtlZAovLwovLyBbcC9jYXNoZmxvd10gaXMgZXhwbGljaXQgdGhhdCBpdCBkb2VzIG5vIHBhZ2luZyBhbmQgbm8gbWVyZ2luZywgYmVjYXVzZQovLyBtZXJnaW5nIHJlcG9ydHMgYWNyb3NzIHBhZ2VzIHdvdWxkIG1ha2UgdGhlIHVucmVzb2x2ZWQgc2V0IGFuIGFydGlmYWN0IG9mCi8vIHRoZSBwYWdpbmcuIEl0cyBlbnRyeSBjYXAgaXMgNDA5NiwgZXhhY3RseSBbYm9va3MuTWF4RW50cmllc1BlckJvb2tdLCBzbyB0aGUKLy8gcHJpbWl0aXZlIGNhbiBhbHdheXMgYWNjZXB0IGEgd2hvbGUgYm9vayBhbmQgdGhlIGJpbmRpbmcgY29uc3RyYWludCBpcyBub3QKLy8gaXRzIGNhcCDigJQgaXQgaXMgdGhlIGNyb3NzLXJlYWxtIGNhbGwgYnVkZ2V0LCB0d28gcmVhZHMgcGVyIGVudHJ5LgovLwovLyBTbyB0aGlzIHJlYWxtIGRlY2xhcmVzIFtNYXhXaW5kb3dFbnRyaWVzXSBhbmQgcmVmdXNlcyBhIHdpbmRvdyBob2xkaW5nIG1vcmUsCi8vIHRlbGxpbmcgdGhlIGNhbGxlciB0byBuYXJyb3cgaXQuIEEgY2h1bmstYW5kLW1lcmdlIHdvdWxkIGJlIGNoZWFwZXIgdG8gdXNlCi8vIGFuZCB3b3VsZCB2aW9sYXRlIHRoZSBwcmltaXRpdmUncyBvd24gc3RhdGVkIHJ1bGUuCi8vCi8vICMgV2luZG93IHNlbGVjdGlvbiByZXN0cyBvbiBhIHByZW1pc2UgT1dORUQgQlkgQU5PVEhFUiBSRUFMTQovLwovLyBFbnRyaWVzIGFyZSBsb2NhdGVkIGJ5IGJpbmFyeSBzZWFyY2ggb3ZlciBlbnRyeSBJRCwgd2hpY2ggaXMgY29ycmVjdCBvbmx5Ci8vIGJlY2F1c2UgYEF0YCBpcyBub24tZGVjcmVhc2luZyBpbiBJRC4gVGhhdCBpcyBub3QgYSBwcm9wZXJ0eSBvZiBbcC9qb3VybmFsXSwKLy8gd2hpY2ggcmVmdXNlcyBvbmx5IGEgbmVnYXRpdmUgYGF0YCBhbmQgb25lIGF0IG9yIGJlZm9yZSB0aGUgY2xvc2UgY3V0b2ZmLiBJdAovLyBpcyBhIHByb3BlcnR5IG9mIFtyL2Jvb2tzXSwgd2hpY2ggZGF0ZXMgZXZlcnkgZW50cnkgd2l0aAovLyBgcnVudGltZS5DaGFpbkhlaWdodCgpYCBhdCBhbGwgdGhyZWUgb2YgaXRzIHBvc3RpbmcgY2FsbCBzaXRlcyBhbmQgZXhwb3NlcwovLyBubyBgYXRgLXRha2luZyBlbnRyeXBvaW50LiBbci9ib29rc10gZGVjbGFyZXMgdGhlIG9ibGlnYXRpb24gaW4gaXRzIG93bgovLyBwYWNrYWdlIGRvYy4KLy8KLy8gVGhlIGZhaWx1cmUgbW9kZSBpZiB0aGF0IHByZW1pc2UgZXZlciBicmVha3MgaXMgdGhlIGRhbmdlcm91cyBraW5kOiBhCi8vIHN0YXRlbWVudCBvdmVyIEZFV0VSIGVudHJpZXMgdGhhbiB0aGUgd2luZG93IGhvbGRzLCB3aGljaCBzdGlsbCBiYWxhbmNlcyBhbmQKLy8gc3RpbGwgcmVjb25jaWxlcy4gU28gdGhlIHByZW1pc2UgaXMgY2hlY2tlZCByYXRoZXIgdGhhbiBhc3N1bWVkIOKAlAovLyBbc2Nhbl0gdmVyaWZpZXMgYEF0YCBpcyBub24tZGVjcmVhc2luZyBhY3Jvc3MgZXZlcnkgZW50cnkgaXQgcmVhZHMgKGZyZWUsCi8vIHNpbmNlIGVhY2ggYEF0YCBpcyBhbHJlYWR5IGluIGhhbmQpIGFuZCBwcm9iZXMgdGhlIHR3byBlbnRyaWVzIGltbWVkaWF0ZWx5Ci8vIG91dHNpZGUgdGhlIGxvY2F0ZWQgcmFuZ2UgdG8gcHJvdmUgdGhlIHJhbmdlIGlzIG1heGltYWwuIEEgdmlvbGF0aW9uIHBhbmljcwovLyBpbnN0ZWFkIG9mIHB1Ymxpc2hpbmcuCi8vCi8vIFJFU0lEVUFMLCBzdGF0ZWQgd2l0aCBpdHMgYm91bmRhcnk6IHRoYXQgbWFrZXMgYSB2aW9sYXRpb24gYXQgb3IgYWRqYWNlbnQgdG8KLy8gdGhlIHdpbmRvdyBlZGdlcyBsb3VkLiBBIHZpb2xhdGlvbiBkZWVwIG91dHNpZGUgdGhlIHNjYW5uZWQgcmFuZ2UgaXMKLy8gaW52aXNpYmxlIHdpdGhvdXQgYSBmdWxsIHNjYW4sIHdoaWNoIGlzIHRoZSBjb3N0IHRoaXMgZGVzaWduIGV4aXN0cyB0bwovLyBhdm9pZC4gW09wZW5pbmdSZWNvbmNpbGVkXSBjbG9zZXMgaXQgZm9yIHRoZSBvbmUgd2luZG93IHNoYXBlIHdoZXJlIHRoZQovLyBjdW11bGF0aXZlIGNyb3NzLWNoZWNrIGFwcGxpZXMsIGFuZCBub3doZXJlIGVsc2UuCi8vCi8vICMgRW50cnkgSURzIGFyZSByZWxpZWQgdXBvbiB0byBiZSBkZW5zZSwgYW5kIHRoZSBhcmd1bWVudCBpcyBzdHJ1Y3R1cmFsCi8vCi8vIFRoZSBiaW5hcnkgc2VhcmNoIGluZGV4ZXMgZW50cmllcyAxLi5bYm9va3MuRW50cnlDb3VudF0uIFRoYXQgaXMgc291bmQKLy8gYmVjYXVzZSBbcC9qb3VybmFsXSBhbGxvY2F0ZXMgYGlkIDo9IG5leHRJRDsgbmV4dElEKytgIGFuZCB3cml0ZXMgdGhlIGVudHJ5Ci8vIGltbWVkaWF0ZWx5LCBpbiBvbmUgZnVuY3Rpb24gd2l0aCBubyBlcnJvciByZXR1cm4gYmV0d2VlbiB0aGUgdHdvLCBpbnRvIGEKLy8gdHJlZSB0aGF0IGhhcyBubyBkZWxldGU7IGEgcG9zdCB0aGF0IGZhaWxzIHBhbmljcyBhbmQgcmV2ZXJ0cyB0aGUgd2hvbGUKLy8gdHJhbnNhY3Rpb24uIFNvIHRoZXJlIGFyZSBubyBnYXBzIGFuZCBubyByZXVzZS4gSXQgaXMgc3RhdGVkIGhlcmUgYmVjYXVzZSBpdAovLyBpcyBhIHByZW1pc2UsIG5vdCBhbiBvYnNlcnZhdGlvbjogW0VudHJ5SW5mb10gcGFuaWNzIG9uIGFuIGFic2VudCBJRCwgc28gYQovLyBnYXAgd291bGQgYWJvcnQgdGhlIHNjYW4gbG91ZGx5IHJhdGhlciB0aGFuIHNrZXcgYSBmaWd1cmUuCi8vCi8vICMgQSByZXZlcnNhbCBsYW5kcyBpbiB0aGUgcGVyaW9kIGl0IHdhcyBNQURFCi8vCi8vIFtyL2Jvb2tzXSBkYXRlcyBhIHJldmVyc2luZyBlbnRyeSBhdCB0aGUgY3VycmVudCBoZWlnaHQsIG5vdCBhdCB0aGUgcmV2ZXJzZWQKLy8gZW50cnkncyBkYXRlLCBhbmQgW3AvY2FzaGZsb3ddIGRlbGliZXJhdGVseSBkb2VzIG5vdCBzcGVjaWFsLWNhc2UgcmV2ZXJzYWxzOgovLyBhIHJldmVyc2luZyBlbnRyeSB0aGF0IHRvdWNoZXMgY2FzaCBtb3ZlZCBjYXNoLiBTbyByZXZlcnNpbmcgYSBwcmlvci1wZXJpb2QKLy8gZW50cnkgc2hvd3MgYXMgbW92ZW1lbnQgaW4gdGhlIENVUlJFTlQgcGVyaW9kIGFuZCB0aGUgY29ycmVjdGVkIHBlcmlvZCdzCi8vIHB1Ymxpc2hlZCBzdGF0ZW1lbnQgZG9lcyBub3QgY2hhbmdlLiBUaGF0IGlzIHJpZ2h0IGZvciBhIGNhc2gtZmxvdyBzdGF0ZW1lbnQKLy8gYW5kIHN1cnByaXNpbmcgdG8gYSByZWFkZXIgZXhwZWN0aW5nIG90aGVyd2lzZSwgd2hpY2ggaXMgd2h5IGl0IGlzIGhlcmUuCi8vCi8vICMgTk8gQ1VTVE9EWSwgYW5kIG5vIHJlLWRlcml2YXRpb24gc2VhbAovLwovLyBUaGVyZSBpcyBubyBjb2luaW8gaW1wb3J0LCBubyBwYXlhYmxlIHBhdGgsIG5vIGZlZSwgbm8gd2l0aGRyYXdhbCwgbm8gYWRtaW4uCi8vIFtQdWJsaXNoXSBhbmQgW0RlY2xhcmVQb2xpY3ldIHJlZnVzZSBhIHRyYW5zYWN0aW9uIGNhcnJ5aW5nIGNvaW5zLgovLwovLyBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgTk8gYFZlcmlmeWAgYWNjZXNzb3IgcmUtZGVyaXZpbmcgYSBzdG9yZWQgcmVwb3J0IGFuZAovLyBjb21wYXJpbmcuIEZvciBhIHdpbmRvdyB0aGF0IGNsb3NlZCBiZWZvcmUgdGhlIHB1YmxpY2F0aW9uIGhlaWdodCBzdWNoIGEKLy8gY2hlY2sgaXMgYSBDT05TVEFOVCBUUlVFIGJ5IGNvbnN0cnVjdGlvbjogZW50cmllcyBhcmUgZGF0ZWQgYXQgdGhlIGNoYWluCi8vIGhlaWdodCBhbmQgdGhlIGpvdXJuYWwgaXMgYXBwZW5kLW9ubHksIHNvIG5vIGVudHJ5IGNhbiBsYXRlciBmYWxsIGludG8gYQovLyBjbG9zZWQgd2luZG93LCBhbmQgdGhlIGNoYXJ0IGNhbm5vdCBsb3NlIGFuIGFjY291bnQuIFNoaXBwaW5nIGl0IHdvdWxkIGJlCi8vIHRoZSBmaWZ0aCBpbnN0YW5jZSBvZiB0aGUgdmFjdW91cy10cnVlIGNsYXNzIHRoaXMgcHJvamVjdCBrZWVwcyBmaW5kaW5nIGluCi8vIGl0cyBvd24gd29yay4gV2hhdCBzaGlwcyBpbnN0ZWFkIGlzIFtSZXNjYW5dLCB3aG9zZSBub24tdmFjdWl0eSBpcyBleGFjdCBhbmQKLy8gbmFycm93OiBpdCByZS1sb2NhdGVzIHRoZSB3aW5kb3cgTk9XIGFuZCBzbyB0ZXN0cyB0aGUgc2VsZWN0aW9uIHByZW1pc2UKLy8gYWJvdmUsIG5vdCB0aGUgbGVkZ2VyJ3MgY29udGVudHMuCi8vCi8vICMgTm8gY3Jvc3Mtb3duZXIgYWdncmVnYXRlIGJleW9uZCBhIGNvdW50Ci8vCi8vIFtyL2Jvb2tzXSBzY29wZXMgZXZlcnkgcmVhZCB0byBvbmUgb3duZXIsIGFuZCBhIGNhc2gtZmxvdyBzdGF0ZW1lbnQgbWl4aW5nCi8vIG93bmVycyB3b3VsZCBhc3NlcnQgYSBjbGFpbSBubyBzaW5nbGUgb3duZXIgY2FuIG1ha2UuIFtUb3RhbF0gaXMgYSBjb3VudCBhbmQKLy8gdGhlcmUgaXMgbm8gd2F5IHRvIGVudW1lcmF0ZSBwdWJsaXNoZXJzLgovLwovLyAjIExpbWl0cywgc3RhdGVkIHBsYWlubHkKLy8KLy8gICAtIGBvcGVuaW5nYCBpcyBjYWxsZXItc3VwcGxpZWQsIGFuZCB2ZXJpZmllZCBvbmx5IHdoZXJlCi8vICAgICBbT3BlbmluZ1JlY29uY2lsZWRdIHNheXMgaXQgd2FzLgovLyAgIC0gVGhlIHBvbGljeSBpcyBjYWxsZXItZGVjbGFyZWQgYW5kIGlzIHRoZSB0cnVzdCBib3VuZGFyeS4gQSB3cm9uZyBjYXNoCi8vICAgICBkZWNsYXJhdGlvbiB5aWVsZHMgYSBwbGF1c2libGUsIHdyb25nIHN0YXRlbWVudCBhbmQgbm8gb24tY2hhaW4gY2hlY2sKLy8gICAgIGhlcmUgY2FuIGRldGVjdCBpdC4KLy8gICAtIFRoZSBjb3N0IGJvdW5kIGlzIHJlYXNvbmVkIGFnYWluc3QgYSBsaXZlIHByZWNlZGVudCAoW3Ivc3RhdGVtZW50c10KLy8gICAgIHBlcmZvcm1zIHJvdWdobHkgMTMwIGNyb3NzLXJlYWxtIHJlYWRzIHBlciByZXBvcnQpLCBub3QgbWVhc3VyZWQgaW4gZ2FzLgovLyAgIC0gTWVtb3MgYW5kIGFjY291bnQgY29kZXMgYW5kIG5hbWVzIGFyZSBhbiBvd25lcidzIGZyZWUgdGV4dCBpbiBbci9ib29rc10KLy8gICAgIGFuZCBhcmUgdW5zYW5pdGl6ZWQgdGhlcmUuIEV2ZXJ5IG9uZSBvZiB0aGVtIGdvZXMgdGhyb3VnaCBbY2VsbF0gYmVmb3JlCi8vICAgICBpdCByZWFjaGVzIFtSZW5kZXJdLgovLyAgIC0gVGhlIGNoYXJ0IHJlY29uc3RydWN0aW9uIGhlcmUgaXMgYSBzZWNvbmQgY29weSBvZiBbci9zdGF0ZW1lbnRzXScKLy8gICAgIHVuZXhwb3J0ZWQgYGNoYXJ0T2ZgLiBQcm9tb3RpbmcgaXQgd291bGQgbW9kaWZ5IGEgbGl2ZSByZWFsbS4KLy8KLy8gW3IvYm9va3NdOiAvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2Jvb2tzCi8vIFtyL3N0YXRlbWVudHNdOiAvci9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3N0YXRlbWVudHMKLy8gW3AvY2FzaGZsb3ddOiAvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2Nhc2hmbG93Ci8vIFtwL2pvdXJuYWxdOiAvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2pvdXJuYWwKLy8gW3AvcGVyaW9kc106IC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvcGVyaW9kcwpwYWNrYWdlIGNhc2hmbG93CgppbXBvcnQgKAoJImNoYWluL3J1bnRpbWUiCgkiY2hhaW4vcnVudGltZS91bnNhZmUiCgkic3RyY29udiIKCSJzdHJpbmdzIgoKCWNmICJnbm8ubGFuZC9wL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvY2FzaGZsb3ciCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL2pvdXJuYWwiCgkiZ25vLmxhbmQvcC9nMXV0NnVzcHVoNzNlMDJ5YXV4cG15dDhnM3d3ZGRhcTh1dGFndm0zL3BlcmlvZHMiCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCgkiZ25vLmxhbmQvcC9udC9tYXJrZG93bi9zYW5pdGl6ZS92MCIKCSJnbm8ubGFuZC9yL2cxdXQ2dXNwdWg3M2UwMnlhdXhwbXl0OGczd3dkZGFxOHV0YWd2bTMvYm9va3MiCikKCi8vIFJlYWxtUGF0aCBpcyB0aGlzIHJlYWxtJ3Mgb3duIHBhdGgsIHVzZWQgdG8gYnVpbGQgUmVuZGVyIGxpbmtzLgpjb25zdCBSZWFsbVBhdGggPSAiL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9jYXNoZmxvdyIKCi8vIEJvb2tzUGF0aCBpcyB0aGUgbGVkZ2VyIHJlYWxtIGV2ZXJ5IGVudHJ5IGhlcmUgaXMgcmVhZCBmcm9tLgovLwovLyBUYWtlbiBCWSBWQUxVRSBmcm9tIHRoYXQgcmVhbG0ncyBvd24gZXhwb3J0ZWQgY29uc3RhbnQgcmF0aGVyIHRoYW4gdHlwZWQgb3V0Ci8vIGFnYWluLCBzbyB0aGlzIGlzIHRoZSBjb21waWxlLXRpbWUgcGluIGl0c2VsZiBhbmQgbm90IGEgc2Vjb25kIGNvcHkgdGhhdAovLyBjb3VsZCBkcmlmdC4gQSByZWFkZXIgY2hlY2tpbmcgd2hpY2ggbGVkZ2VyIGEgc3RhdGVtZW50IGRlc2NyaWJlcyBpcyByZWFkaW5nCi8vIHRoZSBpbXBvcnQuCmNvbnN0IEJvb2tzUGF0aCA9IGJvb2tzLlJlYWxtUGF0aAoKLy8gTWF4V2luZG93RW50cmllcyBib3VuZHMgaG93IG1hbnkgZW50cmllcyBvbmUgW1B1Ymxpc2hdIG1heSByZWFkLgovLwovLyBUaGlzIGlzIHRoZSDCpzcuNCByZWZ1c2FsIGJvdW5kIGFuZCB0aGUgbnVtYmVyIGhhcyBhIGRlcml2YXRpb24gcmF0aGVyIHRoYW4gYQovLyBmZWVsLiBSZWFkaW5nIG9uZSBlbnRyeSBjb3N0cyBUV08gY3Jvc3MtcmVhbG0gcmVhZHMg4oCUIFtib29rcy5FbnRyeUluZm9dIGZvcgovLyB0aGUgaGVhZGVyIGFuZCBbYm9va3MuRW50cnlMZWdzXSBmb3IgdGhlIHBvc3RpbmdzIOKAlCBiZWNhdXNlIHIvYm9va3MgcmV0dXJucwovLyB0aGVtIHNlcGFyYXRlbHkuIEFkZCB0aGUgY2hhcnQgcmVjb25zdHJ1Y3Rpb24sIHdoaWNoIGlzIG9uZSBbYm9va3MuQWNjb3VudHNdLAovLyBvbmUgW2Jvb2tzLkNvZGVzXSBhdCB0aGUgY2hhcnQgY2FwIGFuZCBvbmUgW2Jvb2tzLkFjY291bnRJbmZvXSBwZXIgYWNjb3VudCwKLy8gYW5kIHRoZSBsaXZlIHByZWNlZGVudCBbci9zdGF0ZW1lbnRzXSBwYXlzIGFib3V0IDEzMCByZWFkcyBwZXIgcmVwb3J0LiBBZGQKLy8gdGhlIHNlYXJjaDogMipjZWlsKGxvZzIoTisxKSkgKyA0IGhlYWRlciByZWFkcyB0byBsb2NhdGUgYW5kIHByb3ZlIHRoZSByYW5nZS4KLy8KLy8gQXQgMjU2IHRoZSB3aG9sZSBwdWJsaXNoIGlzIGFib3V0IDY2NiBwbGFpbiByZWFkcywgcm91Z2hseSBmaXZlIHRpbWVzIGEKLy8gcmVwb3J0IFtyL3N0YXRlbWVudHNdIHBlcmZvcm1zIG9uIHRoaXMgY2hhaW4gdG9kYXkuIEF0IHIvYm9va3MnIG93biBlbnRyeSBjYXAKLy8gb2YgNDA5NiBpdCB3b3VsZCBiZSBhYm91dCA4LDM1MCwgd2hpY2ggaXMgdGhlIGZpZ3VyZSB0aGUgZGlzY292ZXJ5IGdhdGUgZm9yCi8vIHIvcmVjZWl2YWJsZXMgdXNlZCB0byBkZWZlciB0aGlzIHByb2R1Y3QuCi8vCi8vIEl0IGlzIGEgUkVGVVNBTCBhbmQgbm90IGEgdHJ1bmNhdGlvbjogYSB3aW5kb3cgaG9sZGluZyBtb3JlIGVudHJpZXMgdGhhbiB0aGlzCi8vIHBhbmljcyBhbmQgbmFtZXMgdGhlIGNvdW50LCBhbmQgdGhlIGNhbGxlciBuYXJyb3dzIHRoZSB3aW5kb3cuIFB1Ymxpc2hpbmcgYQovLyBzdGF0ZW1lbnQgb3ZlciBhIHNpbGVudGx5LXRydW5jYXRlZCBlbnRyeSBzZXQgaXMgdGhlIG9uZSBmYWlsdXJlIHRoaXMgcHJvZHVjdAovLyBpcyBsZWFzdCBhYmxlIHRvIGRldGVjdCwgYmVjYXVzZSBhIHNob3J0IHN0YXRlbWVudCBzdGlsbCBiYWxhbmNlcy4KY29uc3QgTWF4V2luZG93RW50cmllcyA9IDI1NgoKLy8gUG9saWN5SXNSZXBsYWNlYWJsZSByZWNvcmRzIGEgZGVjaXNpb24gYSByZWFkZXIgd2lsbCBsb29rIGZvci4KLy8KLy8gW0RlY2xhcmVQb2xpY3ldIG92ZXJ3cml0ZXMgYW4gb3duZXIncyBwcmV2aW91cyBkZWNsYXJhdGlvbiBhbmQga2VlcHMgbm8KLy8gaGlzdG9yeSBvZiBpdC4gVGhhdCBpcyBzYWZlIG9ubHkgYmVjYXVzZSBldmVyeSBbUHVibGlzaF0gRlJFRVpFUyBhIGNvcHkgb2YKLy8gdGhlIHBvbGljeSBpdCB1c2VkIGludG8gdGhlIHJlY29yZDogYSBwdWJsaXNoZWQgc3RhdGVtZW50IGlzIHJlYWRhYmxlIHdpdGgKLy8gdGhlIGNsYXNzaWZpY2F0aW9uIHRoYXQgcHJvZHVjZWQgaXQgZm9yZXZlciwgdmlhIFtQb2xpY3lPZl0sIGFuZCBjaGFuZ2luZwovLyB0aGUgbGl2ZSBwb2xpY3kgY2Fubm90IHJlc3RhdGUgYSBwdWJsaXNoZWQgZmlndXJlLgovLwovLyBUaGUgYWx0ZXJuYXRpdmUg4oCUIHZlcnNpb25lZCBwb2xpY2llcyB3aXRoIHJlcG9ydHMgcG9pbnRpbmcgYXQgYSB2ZXJzaW9uIOKAlCBpcwovLyB0aGUgc2FtZSBpbmZvcm1hdGlvbiB3aXRoIGFuIGV4dHJhIGluZGlyZWN0aW9uIGFuZCBvbmUgbW9yZSBwbGFjZSBmb3IgdGhlCi8vIHR3byB0byBkaXNhZ3JlZS4KY29uc3QgUG9saWN5SXNSZXBsYWNlYWJsZSA9IHRydWUKCi8vIFB1YmxpY2F0aW9uc0FyZVVuY2FwcGVkIG1pcnJvcnMgW3Ivc3RhdGVtZW50c10nIGRlY2lzaW9uIGZvciB0aGUgc2FtZSB0aHJlZQovLyByZWFzb25zLCB3aGljaCBob2xkIGhlcmUgdW5jaGFuZ2VkOiBrZXlzIGFyZSBwZXIgb3duZXIgc28gYW4gb3duZXIgY2FuIG9ubHkKLy8gZmlsbCB0aGVpciBvd24gaGlzdG9yeTsgbm8gYWNjZXNzb3IgYW5kIG5vIFtSZW5kZXJdIHBhdGggd2Fsa3MgYSBwdWJsaXNoZXIncwovLyB3aG9sZSBoaXN0b3J5OyBhbmQgdGhlcmUgaXMgbm8gZW5naW5lIGNhcCBhYm92ZSB0aGlzIHJlYWxtIHRvIG1pcnJvci4KY29uc3QgUHVibGljYXRpb25zQXJlVW5jYXBwZWQgPSB0cnVlCgovLyBSZW5kZXJQdWJsaWNhdGlvbkxpbWl0IGNhcHMgaG93IG1hbnkgb2YgYSBwdWJsaXNoZXIncyBzdGF0ZW1lbnRzIG9uZQovLyBbUmVuZGVyXSBjYWxsIGxpc3RzLgpjb25zdCBSZW5kZXJQdWJsaWNhdGlvbkxpbWl0ID0gMjAKCi8vIFJlbmRlckNlbnN1c0xpbWl0IGNhcHMgaG93IG1hbnkgdW5yZXNvbHZlZCBvciBuZXQtemVybyByb3dzIG9uZSBbUmVuZGVyXQovLyBjYWxsIGVtaXRzLiBBIHdpbmRvdyBtYXkgaG9sZCBbTWF4V2luZG93RW50cmllc10gZW50cmllcyBhbmQgaW4gYSBib29rIHdpdGgKLy8gbm8gcG9saWN5IHJ1bGVzIGV2ZXJ5IG9uZSBvZiB0aGVtIGlzIHVucmVzb2x2ZWQuCmNvbnN0IFJlbmRlckNlbnN1c0xpbWl0ID0gMjUKCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBTdGF0ZQovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIHBvbGljeSBpcyBvbmUgb3duZXIncyBmcm96ZW4gZGVjbGFyYXRpb24uIFRoZSBzbGljZXMgYXJlIGFsbG9jYXRlZCBoZXJlIGZyb20KLy8gdGhlIGNhbGxlcidzIHBhcnNlZCBzdHJpbmdzIGFuZCBuZXZlciBoYW5kZWQgb3V0OiBbUG9saWN5Q2FzaF0gYW5kCi8vIFtQb2xpY3lSdWxlc10gcmUtZW5jb2RlIHRoZW0gaW50byBhIGZyZXNoIHN0cmluZy4KdHlwZSBwb2xpY3kgc3RydWN0IHsKCWNhc2ggIFtdc3RyaW5nCglydWxlcyBbXWNmLkNsYXNzaWZpY2F0aW9uCglhdCAgICBpbnQ2NAp9CgovLyByZWNvcmQgaXMgb25lIGZyb3plbiBzdGF0ZW1lbnQuCi8vCi8vIEl0IHN0b3JlcyB0aGUgW2NmLlJlcG9ydF0gd2hvbGUgcmF0aGVyIHRoYW4gY29weWluZyBpdHMgZmllbGRzIGludG8gYQovLyBwYXJhbGxlbCBzdHJ1Y3Qg4oCUIGEgc2Vjb25kIGZpZWxkIHNldCBpcyBhIHNlY29uZCBwbGFjZSBmb3IgdGhlIHR3byB0bwovLyBkaXNhZ3JlZSDigJQgcGx1cyB0aGUgdGhyZWUgdGhpbmdzIHRoZSByZXBvcnQgY2Fubm90IGNhcnJ5OiB0aGUgcG9saWN5IHRoYXQKLy8gcHJvZHVjZWQgaXQsIHRoZSBlbnRyeS1JRCByYW5nZSB0aGF0IHdhcyByZWFkLCBhbmQgdGhlIGN1bXVsYXRpdmUKLy8gY3Jvc3MtY2hlY2sgcmVzdWx0LgovLwovLyBUaGVyZSBpcyBkZWxpYmVyYXRlbHkgbm8gc2VxIGZpZWxkLiBFdmVyeSByZWFkIHBhdGggcmVhY2hlcyBhIHJlY29yZCBieQovLyBjb25zdHJ1Y3RpbmcgcHViS2V5IGZyb20gYSBzZXEgaXQgYWxyZWFkeSBob2xkcywgc28gYSBzdG9yZWQgY29weSB3b3VsZCBvbmx5Ci8vIGV2ZXIgYmUgY2hlY2tlZCBhZ2FpbnN0IGl0cyBvd24gc291cmNlLiBbci9zdGF0ZW1lbnRzXSByZWNvcmRzIHRoZSBzYW1lCi8vIGRlY2lzaW9uIGFuZCB0aGUgcmVhc29uIGl0IHdhcyBmb3VuZDogYSBzYWJvdGFnZSBoYXJuZXNzIGNvdWxkIG5vdCBtYWtlCi8vIGRyb3BwaW5nIHRoZSBhc3NpZ25tZW50IGZhaWwgYW55IHRlc3QuCnR5cGUgcmVjb3JkIHN0cnVjdCB7CglhdCAgaW50NjQKCXJlcCBjZi5SZXBvcnQKCXBvbCBwb2xpY3kKCgkvLyBsbyBhbmQgaGkgYXJlIHRoZSBpbmNsdXNpdmUgZW50cnktSUQgcmFuZ2UgcmVhZC4gaGkgPCBsbyBtZWFucyB0aGUKCS8vIHdpbmRvdyBoZWxkIG5vIGVudHJpZXMsIHdoaWNoIGlzIGEgbGVnaXRpbWF0ZSBxdWlldCBwZXJpb2QuCglsbyB1aW50NjQKCWhpIHVpbnQ2NAoKCS8vIHJlY29uY2lsZWQgaXMgd2hldGhlciB0aGUgY3VtdWxhdGl2ZSBjcm9zcy1jaGVjayBBUFBMSUVELiBJdCBpcyBuZXZlcgoJLy8gc3RvcmVkIGZhbHNlLWFmdGVyLWZhaWxpbmc6IGEgZmFpbGVkIGNoZWNrIHBhbmljcyBpbiBbUHVibGlzaF0sIHNvIHRoaXMKCS8vIGRpc3Rpbmd1aXNoZXMgImNoZWNrZWQgYW5kIGFncmVlZCIgZnJvbSAibm90IGNoZWNrYWJsZSIsIG5ldmVyCgkvLyAiY2hlY2tlZCBhbmQgZGlzYWdyZWVkIi4KCXJlY29uY2lsZWQgYm9vbAoKCS8vIGNhc2ggaXMgdGhlIGRlY2xhcmVkIGNhc2ggYWNjb3VudHMnIHN1bW1lZCBiYWxhbmNlIGF0IHB1YmxpY2F0aW9uLCByZWFkCgkvLyBmcm9tIFtib29rcy5CYWxhbmNlXS4gTWVhbmluZ2Z1bCBvbmx5IHdoZW4gcmVjb25jaWxlZC4KCWNhc2ggaW50NjQKfQoKLy8gcG9saWNpZXMgbWFwcyBhbiBvd25lcidzIGFkZHJlc3Mgc3RyaW5nIHRvICpwb2xpY3kuCnZhciBwb2xpY2llcyA9IGF2bC5OZXdUcmVlKCkKCi8vIHB1Ymxpc2hlZCBtYXBzICI8b3duZXI+fDxwYWRkZWQgc2VxPiIgdG8gKnJlY29yZC4KLy8KLy8gVGhlIHBvaW50ZXIgbmV2ZXIgbGVhdmVzIHRoaXMgZmlsZS4gRXZlcnkgYWNjZXNzb3IgY29waWVzIHNjYWxhcnMgb3V0LCBzbyBubwovLyBjYWxsZXIgcmVjZWl2ZXMgYSBoYW5kbGUgb250byBzdG9yZWQgc3RhdGUuCnZhciBwdWJsaXNoZWQgPSBhdmwuTmV3VHJlZSgpCgovLyBjb3VudHMgbWFwcyBhbiBvd25lcidzIGFkZHJlc3Mgc3RyaW5nIHRvIGhvdyBtYW55IHN0YXRlbWVudHMgdGhleSBoYXZlCi8vIHB1Ymxpc2hlZC4gSXQgaXMgdGhlIHNlcXVlbmNlIGFsbG9jYXRvciBhcyB3ZWxsIGFzIHRoZSBjb3VudC4KdmFyIGNvdW50cyA9IGF2bC5OZXdUcmVlKCkKCi8vIHB1YkNvdW50IGlzIHRoZSBnbG9iYWwgdG90YWwsIG1haW50YWluZWQgYWxvbmdzaWRlIHRoZSB0cmVlIHNvIHRoZSBpbmRleAovLyBwYWdlIG5ldmVyIGl0ZXJhdGVzLgp2YXIgcHViQ291bnQgaW50CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gR3VhcmRzCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gcmVmdXNlQ29pbnMgcGFuaWNzIGlmIGEgZGlyZWN0IGNhbGxlciBhdHRhY2hlZCBjb2lucy4KLy8KLy8gVGhpcyByZWFsbSBoYXMgbm8gYmFua2VyLCBubyB3aXRoZHJhd2FsIHBhdGggYW5kIG5vdGhpbmcgdGhhdCBjYW4gc3BlbmQgd2hhdAovLyBhcnJpdmVzLCBzbyBhIHNpbGVudGx5LWFjY2VwdGVkIHNlbmQgd291bGQgYmUgc3RyYW5kZWQgcGVybWFuZW50bHkgYW5kICJ3ZQovLyBob2xkIG5vIGZ1bmRzIiB3b3VsZCBiZSB0cnVlIG9mIHRoZSBkZXNpZ24gYW5kIGZhbHNlIG9mIHRoZSBiYWxhbmNlLgovLwovLyBUaGUgcmVzaWR1YWwgaXMgc3RhdGVkIHJhdGhlciB0aGFuIGd1YXJkZWQ6IGNvaW5zIGNhbiBzdGlsbCByZWFjaCB0aGlzCi8vIHJlYWxtJ3MgYWRkcmVzcyB0aHJvdWdoIGFuIGludGVybWVkaWFyeSdzIGV4cGxpY2l0IGJhbmtlciBzZW5kLCB3aGljaCBubwovLyBwcmVkaWNhdGUgaGVyZSBjYW4gc2VlLiBXaGF0IG1ha2VzIHRoYXQgc3Vydml2YWJsZSBpcyB0aGUgYWJzZW5jZSBvZiBhbnkKLy8gY29uc3VtcHRpb24gcGF0aCwgbm90IHRoaXMgZ3VhcmQuCi8vCi8vIFRoZSBJc0N1cnJlbnQgY2hlY2sgaXMgYSBuby1vcCBhdCBib3RoIG9mIHRvZGF5J3MgY2FsbCBzaXRlcyDigJQgYSBjcm9zc2luZwovLyBmdW5jdGlvbidzIGZpcnN0IGBjdXJgIGlzIHJ1bnRpbWUtY3VycmVudCBieSBjb25zdHJ1Y3Rpb24gYW5kIHN0YXlzIGN1cnJlbnQKLy8gd2hlbiBmb3J3YXJkZWQgdGhyb3VnaCBhIG5vbi1jcm9zc2luZyBjYWxsLiBJdCBpcyBoZXJlIGJlY2F1c2UgdGhpcyByZWFsbSBpcwovLyBJTU1VVEFCTEUgYWZ0ZXIgYWRkcGtnLCBzbyBhIGZ1dHVyZSB0aGlyZCBjYWxsZXIgY2Fubm90IGJlIG1hZGUgc2FmZSBsYXRlciwKLy8gYW5kIGEgaGVscGVyIHRoYXQgcmVhZHMgUHJldmlvdXMoKSBvZmYgYW4gdW5jaGVja2VkIHJlYWxtIHBhcmFtZXRlciBpcyBhCi8vIGRlc2lnbmF0aW9uLWZvcmdlcnkgc2hhcGUgd2hldGhlciBvciBub3QgaXQgaXMgcmVhY2hhYmxlIHRvZGF5LgpmdW5jIHJlZnVzZUNvaW5zKGN1ciByZWFsbSkgewoJaWYgIWN1ci5Jc0N1cnJlbnQoKSB7CgkJcGFuaWMoImNhc2hmbG93OiByZWZ1c2VDb2lucyBjYWxsZWQgd2l0aCBhIHJlYWxtIHRoYXQgaXMgbm90IGN1cnJlbnQiKQoJfQoJaWYgY3VyLlByZXZpb3VzKCkuSXNVc2VyQ2FsbCgpICYmIGxlbih1bnNhZmUuT3JpZ2luU2VuZCgpKSA+IDAgewoJCXBhbmljKCJjYXNoZmxvdzogdGhpcyByZWFsbSBob2xkcyBubyBjb2lucyBhbmQgaGFzIG5vIHdpdGhkcmF3YWwgcGF0aDsgc2VuZCBub25lIikKCX0KfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFRoZSBjcm9zcy1yZWFsbSByZWFkcwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIHBhcnNlS2luZCB0dXJucyBvbmUgb2YgW3IvYm9va3NdJyBmaXZlIGtpbmQgd29yZHMgYmFjayBpbnRvIGEKLy8gW2pvdXJuYWwuS2luZF0gYW5kIFBBTklDUyBvbiBhbnl0aGluZyBlbHNlLgovLwovLyBUaGlzIGlzIHRoZSBzYW1lIHNlYW0gW3Ivc3RhdGVtZW50c10gbmFtZXMgaW4gaXRzIG93biBjb3B5LCBhbmQgdGhlIHJlYXNvbgovLyBpdCBwYW5pY3MgaXMgdGhlIHNhbWUgYW5kIGlzIHNwZWNpZmljOiB0aGUgemVybyBbam91cm5hbC5LaW5kXSBpcyByZXBvcnRlZAovLyBDUkVESVQtTk9STUFMIGJ5IElzRGViaXROb3JtYWwsIHNvIGEgc2lsZW50bHktdW5wYXJzZWQgd29yZCB3b3VsZCBub3QgZHJvcAovLyB0aGUgcm93IOKAlCBpdCB3b3VsZCBtaXNmaWxlIGl0IGFuZCBwcm9kdWNlIGEgc3RhdGVtZW50IHRoYXQgYmFsYW5jZXMgYW5kCi8vIG1pc3N0YXRlcy4gVGhlIGZpdmUgd29yZHMgYXJlIHRoYXQgdHlwZSdzIG93biBTdHJpbmcgb3V0cHV0LCBhbmQgdGhlIHN1aXRlCi8vIHBpbnMgdGhlIHJvdW5kIHRyaXAgb3ZlciBhbGwgZml2ZSByYXRoZXIgdGhhbiB0cnVzdGluZyBpdCB0byBzdGF5IHRydWUuCmZ1bmMgcGFyc2VLaW5kKHMgc3RyaW5nKSBqb3VybmFsLktpbmQgewoJc3dpdGNoIHMgewoJY2FzZSAiYXNzZXQiOgoJCXJldHVybiBqb3VybmFsLkFzc2V0CgljYXNlICJsaWFiaWxpdHkiOgoJCXJldHVybiBqb3VybmFsLkxpYWJpbGl0eQoJY2FzZSAiZXF1aXR5IjoKCQlyZXR1cm4gam91cm5hbC5FcXVpdHkKCWNhc2UgInJldmVudWUiOgoJCXJldHVybiBqb3VybmFsLlJldmVudWUKCWNhc2UgImV4cGVuc2UiOgoJCXJldHVybiBqb3VybmFsLkV4cGVuc2UKCX0KCXBhbmljKCJjYXNoZmxvdzogIiArIEJvb2tzUGF0aCArICIgcmVwb3J0ZWQgYW4gdW5rbm93biBhY2NvdW50IGtpbmQgIiArCgkJc3RyY29udi5RdW90ZShzKSkKfQoKLy8gY2hhcnRPZiByZWFkcyB0aGUgb3duZXIncyB3aG9sZSBjaGFydCBvZiBhY2NvdW50cyBpbiBvbmUgcGFzcy4KLy8KLy8gT05FIGNhbGwgZm9yIHRoZSBjb2RlcywgYXQgci9ib29rcycgb3duIGFjY291bnQgY2FwLiBUaGF0IGl0ZXJhdG9yIGhhcyBubwovLyBzZWVrIGFuZCBob25vdXJzIGBmcm9tYCBieSBza2lwcGluZywgc28gb25lIGNhbGwgd2Fsa3MgdGhlIHdob2xlIGNoYXJ0Ci8vIGhvd2V2ZXIgc21hbGwgdGhlIGxpbWl0IGlzIOKAlCBwYWdpbmcgaXQgd291bGQgY29zdCBjZWlsKG4vbGltaXQpIGZ1bGwgd2Fsa3MsCi8vIGFuZCBbYm9va3MuQ29kZXNdJyBgZnJvbWAgaXMgSU5DTFVTSVZFIHNvIGV2ZXJ5IHBhZ2luZyBjYWxsZXIgYWxzbyBvd2VzCi8vIGl0c2VsZiBhIGJvdW5kYXJ5IGRlZHVwLiBBIG1pc3NlZCBvbmUgZG91YmxlLWNvdW50cyBhbiBhY2NvdW50LCBhbmQgYQovLyBkb3VibGUtY291bnRlZCBiYWxhbmNlIGlzIGEgZGVmZWN0IHRoaXMgcHJvZHVjdCBjYW5ub3Qgc2VlOiB0aGUgc3RhdGVtZW50Ci8vIHdvdWxkIHN0aWxsIGJhbGFuY2UuCi8vCi8vIFRoZSBhZ3JlZW1lbnQgY2hlY2sgaXMgbm90IGRlY29yYXRpb24uIFtib29rcy5BY2NvdW50c10gYW5kIFtib29rcy5Db2Rlc10KLy8gYXJlIHR3byByZWFkcyB0aHJvdWdoIGRpZmZlcmVudCBjb2RlIHBhdGhzOyBpZiB0aGV5IGRpc2FncmVlIHRoaXMgcmVmdXNlcwovLyByYXRoZXIgdGhhbiBkZXJpdmluZyBvdmVyIGEgdHJ1bmNhdGVkIGNoYXJ0LCBiZWNhdXNlIFtjZi5EZXJpdmVdIHJlamVjdHMgYQovLyBwb3N0aW5nIG5hbWluZyBhbiBhY2NvdW50IGFic2VudCBmcm9tIHRoZSBjaGFydCBhbmQgYSB0cnVuY2F0ZWQgY2hhcnQgdHVybnMKLy8gYW4gb3JkaW5hcnkgZW50cnkgaW50byBFcnJVbmtub3duQWNjb3VudCBwb2ludGluZyBhdCB0aGUgd3JvbmcgbGF5ZXIuCi8vCi8vIFRBSU5UOiB0aGUgW11zdHJpbmcgW2Jvb2tzLkNvZGVzXSByZXR1cm5zIHdhcyBhbGxvY2F0ZWQgdW5kZXIgdGhhdCByZWFsbSBhbmQKLy8gYXJyaXZlcyByZWFkb25seS10YWludGVkLiBOb3RoaW5nIGhlcmUgbXV0YXRlcyBpdCBvciBzdG9yZXMgaXQg4oCUIGNvZGVzIGFyZQovLyByZWFkIG91dCBieSB2YWx1ZSBhbmQgdGhlIHJvd3MgYXJlIGFsbG9jYXRlZCBoZXJlLgovLwovLyBUaGlzIGlzIGEgc2Vjb25kIGNvcHkgb2YgW3Ivc3RhdGVtZW50c10nIHVuZXhwb3J0ZWQgY2hhcnRPZiwgZm9yY2VkOiB0aGF0Ci8vIHJlYWxtIGlzIGxpdmUgYW5kIMKnNiBmb3JiaWRzIG1vZGlmeWluZyBpdCB0byBwcm9tb3RlIHRoZSBoZWxwZXIuCmZ1bmMgY2hhcnRPZihvd25lciBhZGRyZXNzKSBbXWpvdXJuYWwuQWNjb3VudCB7CgluIDo9IGJvb2tzLkFjY291bnRzKG93bmVyKSAvLyBwYW5pY3MgaWYgdGhlIG93bmVyIGhhcyBubyBib29rCgljb2RlcyA6PSBib29rcy5Db2Rlcyhvd25lciwgIiIsIGJvb2tzLk1heEFjY291bnRzUGVyQm9vaykKCWlmIGxlbihjb2RlcykgIT0gbiB7CgkJcGFuaWMoImNhc2hmbG93OiAiICsgQm9va3NQYXRoICsgIiByZXBvcnRzICIgKyBzdHJjb252Lkl0b2EobikgKwoJCQkiIGFjY291bnRzIGJ1dCBlbnVtZXJhdGVkICIgKyBzdHJjb252Lkl0b2EobGVuKGNvZGVzKSkgKwoJCQkiOyByZWZ1c2luZyB0byByZXBvcnQgb24gYSBwYXJ0aWFsIGNoYXJ0IikKCX0KCglyb3dzIDo9IG1ha2UoW11qb3VybmFsLkFjY291bnQsIDAsIG4pCglmb3IgXywgY29kZSA6PSByYW5nZSBjb2RlcyB7CgkJbmFtZSwga2luZCwgZGViaXRzLCBjcmVkaXRzLCBiYWxhbmNlIDo9IGJvb2tzLkFjY291bnRJbmZvKG93bmVyLCBjb2RlKQoJCWEgOj0gam91cm5hbC5BY2NvdW50ewoJCQlDb2RlOiAgICBjb2RlLAoJCQlOYW1lOiAgICBuYW1lLAoJCQlLaW5kOiAgICBwYXJzZUtpbmQoa2luZCksCgkJCURlYml0czogIGRlYml0cywKCQkJQ3JlZGl0czogY3JlZGl0cywKCQl9CgkJLy8gU3RhdGUgaXRzIHJlYWNoIGV4YWN0bHksIGJlY2F1c2UgdGhlIGZsYXR0ZXJpbmcgcmVhZGluZyBpcwoJCS8vIGF2YWlsYWJsZTogQk9USCBzaWRlcyBhcmUgam91cm5hbC5BY2NvdW50LkJhbGFuY2Ugb3ZlciB0aGUgc2FtZSB0d28KCQkvLyBjb2x1bW5zLCBzbyB0aGlzIGlzIGEgQ09OU1RBTlQgVFJVRSBhZ2FpbnN0IGFueSBkaXNhZ3JlZW1lbnQgYmV0d2VlbgoJCS8vIHRoZSB0d28gcmVhbG1zJyBhcml0aG1ldGljIGFuZCBtdXN0IG5ldmVyIGJlIHF1b3RlZCBhcyBjcm9zcy1jaGVja2luZwoJCS8vIGl0LiBXaGF0IGl0IGNhdGNoZXMgaXMgYSB0cmFuc2NyaXB0aW9uIGVycm9yIGluIHRoZSBmb3VyIGFzc2lnbm1lbnRzCgkJLy8gYWJvdmUg4oCUIHN3YXBwaW5nIERlYml0cyBhbmQgQ3JlZGl0cywgb3IgcmVhZGluZyBhIGNvbHVtbiBvZmYgdGhlCgkJLy8gd3JvbmcgY29kZSDigJQgd2hpY2ggaXMgdGhpcyByZWFsbSdzIG93biBjb2RlIGFuZCB0aGUgb25seSBwbGFjZSBpbgoJCS8vIHRoaXMgcGF0aCB3aGVyZSB0aGF0IGNvdWxkIGhhcHBlbi4KCQlpZiBhLkJhbGFuY2UoKSAhPSBiYWxhbmNlIHsKCQkJcGFuaWMoImNhc2hmbG93OiBiYWxhbmNlIG1pc21hdGNoIGZvciBhY2NvdW50ICIgKyBjb2RlICsKCQkJCSI7IHRoaXMgcmVhbG0gdHJhbnNjcmliZWQgdGhlIGNoYXJ0IHdyb25nbHkiKQoJCX0KCQlyb3dzID0gYXBwZW5kKHJvd3MsIGEpCgl9CglyZXR1cm4gcm93cwp9CgovLyBsb3dlckJvdW5kIGlzIHRoZSBzbWFsbGVzdCBlbnRyeSBJRCBpbiAxLi5uIHdob3NlIEF0IGlzID49IHRhcmdldCwgb3IgbisxIGlmCi8vIHRoZXJlIGlzIG5vbmUuCi8vCi8vIENvcnJlY3Qgb25seSB1bmRlciB0aGUgbm9uLWRlY3JlYXNpbmctQXQgcHJlbWlzZSBpbiB0aGUgcGFja2FnZSBkb2MuIEEKLy8gdmlvbGF0aW9uIG1ha2VzIHRoaXMgbGFuZCBzb21ld2hlcmUgYXJiaXRyYXJ5IHJhdGhlciB0aGFuIHdyb25nLWJ5LW9uZSwKLy8gd2hpY2ggaXMgd2h5IFtzY2FuXSBwcm9iZXMgdGhlIGxvY2F0ZWQgYm91bmRhcmllcyByYXRoZXIgdGhhbiB0cnVzdGluZyB0aGUKLy8gcmVzdWx0LgpmdW5jIGxvd2VyQm91bmQob3duZXIgYWRkcmVzcywgbiB1aW50NjQsIHRhcmdldCBpbnQ2NCkgdWludDY0IHsKCWxvLCBoaSA6PSB1aW50NjQoMSksIG4rMQoJZm9yIGxvIDwgaGkgewoJCW1pZCA6PSBsbyArIChoaS1sbykvMgoJCWF0LCBfLCBfLCBfLCBfIDo9IGJvb2tzLkVudHJ5SW5mbyhvd25lciwgbWlkKQoJCWlmIGF0ID49IHRhcmdldCB7CgkJCWhpID0gbWlkCgkJfSBlbHNlIHsKCQkJbG8gPSBtaWQgKyAxCgkJfQoJfQoJcmV0dXJuIGxvCn0KCi8vIHNjYW4gbG9jYXRlcyBhbmQgcmVhZHMgZXZlcnkgZW50cnkgaW4gdywgYW5kIHJldHVybnMgdGhlbSB3aXRoIHRoZSBpbmNsdXNpdmUKLy8gSUQgcmFuZ2UgYW5kIHdoZXRoZXIgdGhlIHdpbmRvdyBleHRlbmRzIHBhc3QgZXZlcnkgZW50cnkgdGhlIGJvb2sgaG9sZHMuCi8vCi8vIFRoZSBsYXN0IHJldHVybiB2YWx1ZSBpcyB3aGF0IG1ha2VzIHRoZSBjdW11bGF0aXZlIGNyb3NzLWNoZWNrIHNvdW5kOyBzZWUKLy8gW09wZW5pbmdSZWNvbmNpbGVkXS4gSXQgaXMgdHJ1ZSBmb3IgYW4gZW1wdHkgYm9vayBhcyB3ZWxsLCB3aGVyZSBldmVyeQovLyBiYWxhbmNlIGlzIG5lY2Vzc2FyaWx5IHplcm8gYmVjYXVzZSBiYWxhbmNlcyBjb21lIG9ubHkgZnJvbSBwb3N0aW5ncy4KLy8KLy8gRXZlcnkgY2hlY2sgaGVyZSBpcyBhIHBhbmljIHJhdGhlciB0aGFuIGEgcmV0dXJuLCBiZWNhdXNlIHRoaXMgaXMgcmVhY2hlZAovLyBmcm9tIGEgbXV0YXRpbmcgcGF0aCBhbmQgaW4gR25vIG9ubHkgYSBwYW5pYyByZXZlcnRzIGEgdHJhbnNhY3Rpb24uCmZ1bmMgc2Nhbihvd25lciBhZGRyZXNzLCB3IHBlcmlvZHMuV2luZG93KSAoW11qb3VybmFsLkVudHJ5LCB1aW50NjQsIHVpbnQ2NCwgYm9vbCkgewoJbiA6PSBib29rcy5FbnRyeUNvdW50KG93bmVyKSAvLyBwYW5pY3MgaWYgdGhlIG93bmVyIGhhcyBubyBib29rCglpZiBuID09IDAgewoJCXJldHVybiBuaWwsIDEsIDAsIHRydWUKCX0KCWxhc3QgOj0gdWludDY0KG4pCgoJZmlyc3RBdCwgXywgXywgXywgXyA6PSBib29rcy5FbnRyeUluZm8ob3duZXIsIDEpCglsYXN0QXQsIF8sIF8sIF8sIF8gOj0gYm9va3MuRW50cnlJbmZvKG93bmVyLCBsYXN0KQoJaWYgbGFzdEF0IDwgZmlyc3RBdCB7CgkJcGFuaWMoImNhc2hmbG93OiAiICsgQm9va3NQYXRoICsgIiBlbnRyeSAxIGlzIGRhdGVkICIgKwoJCQlzdHJjb252LkZvcm1hdEludChmaXJzdEF0LCAxMCkgKyAiIGFuZCBlbnRyeSAiICsKCQkJc3RyY29udi5Gb3JtYXRVaW50KGxhc3QsIDEwKSArICIgaXMgZGF0ZWQgIiArCgkJCXN0cmNvbnYuRm9ybWF0SW50KGxhc3RBdCwgMTApICsKCQkJIjsgZW50cnkgZGF0ZXMgYXJlIG5vdCBub24tZGVjcmVhc2luZyBhbmQgd2luZG93IHNlbGVjdGlvbiBpcyB1bnNvdW5kIikKCX0KCXBhc3RFbmQgOj0gdy5VbnRpbCA+IGxhc3RBdAoKCWxvIDo9IGxvd2VyQm91bmQob3duZXIsIGxhc3QsIHcuRnJvbSkKCWhpIDo9IGxvd2VyQm91bmQob3duZXIsIGxhc3QsIHcuVW50aWwpIC0gMQoKCS8vIFRIRVJFIEFSRSBOTyBNQVhJTUFMSVRZIFBST0JFUyBIRVJFLCBERUxJQkVSQVRFTFkuIFR3byB1c2VkIHRvIHNpdCBhdAoJLy8gdGhpcyBwb2ludCDigJQgcmVhZGluZyB0aGUgZW50cnkganVzdCBiZWxvdyBsbyBhbmQgdGhlIGVudHJ5IGp1c3QgYWJvdmUgaGkKCS8vIGFuZCByZWZ1c2luZyBpZiBlaXRoZXIgZmVsbCBpbnNpZGUgdGhlIHdpbmRvdyDigJQgYW5kIHRoZXkgd2VyZSBSRU1PVkVECgkvLyBiZWNhdXNlIHRoZXkgYXJlIHRhdXRvbG9naWVzIHRoYXQgY2FuIG5ldmVyIGZpcmUuIEJvdGggcHJvYmVkIGNvbmRpdGlvbnMKCS8vIGFyZSBuZWdhdGlvbnMgb2YgW2xvd2VyQm91bmRdJ3Mgb3duIGxvb3AgaW52YXJpYW50czoKCS8vCgkvLwloaSBpcyBvbmx5IGV2ZXIgYXNzaWduZWQgYSBtaWQgYXQgd2hpY2ggYXQobWlkKSA+PSB0YXJnZXQgd2FzCgkvLwlPQlNFUlZFRCwgc28gYW4gZXhpdCB2YWx1ZSBMIDw9IG4gY2FycmllcyBhdChMKSA+PSB0YXJnZXQsIGFuZAoJLy8JYGF0KGhpKzEpIDwgdy5VbnRpbGAgaXMgdW5yZWFjaGFibGUuCgkvLwlsbyBpcyBvbmx5IGV2ZXIgYXNzaWduZWQgbWlkKzEgYXQgd2hpY2ggYXQobWlkKSA8IHRhcmdldCB3YXMKCS8vCU9CU0VSVkVELCBzbyBhbiBleGl0IHZhbHVlIEwgPiAxIGNhcnJpZXMgYXQoTC0xKSA8IHRhcmdldCwgYW5kCgkvLwlgYXQobG8tMSkgPj0gdy5Gcm9tYCBpcyB1bnJlYWNoYWJsZS4KCS8vCgkvLyBOZWl0aGVyIGRlcml2YXRpb24gdXNlcyB0aGUgbm9uLWRlY3JlYXNpbmctQXQgcHJlbWlzZSwgd2hpY2ggaXMgd2hhdAoJLy8gbWFrZXMgdGhlbSBkZWFkIHJhdGhlciB0aGFuIG1lcmVseSByZWR1bmRhbnQ6IHRoZXkgd2VyZSB3cml0dGVuIHRvIGNhdGNoCgkvLyBhIFZJT0xBVElPTiBvZiB0aGF0IHByZW1pc2UgYW5kIGFyZSB2YWN1b3VzIGluIGV4YWN0bHkgdGhhdCBjYXNlLiBUaGV5CgkvLyBjb3N0IHR3byBjcm9zcy1yZWFsbSByZWFkcyBwZXIgUHVibGlzaCBhbmQgYWR2ZXJ0aXNlZCBhIGd1YXJhbnRlZSB0aGV5CgkvLyBuZXZlciBwcm92aWRlZC4gTWVhc3VyZWQsIHdpdGggYSBzYWJvdGFnZSBjb250cm9sLCBpbgoJLy8gVGVzdExvd2VyQm91bmRzUG9zdGNvbmRpdGlvbnNIb2xkT3ZlckFTY3JhbWJsZWRCb29rLgoJLy8KCS8vIFdIQVQgQ0FUQ0hFUyBBIE1JU0xPQ0FURUQgUkFOR0UgSU5TVEVBRCwgYWxsIHRocmVlIGxpdmUgYW5kIHBpbm5lZDoKCS8vICAgLSB0aGUgZW5kcG9pbnQgY2hlY2sgYWJvdmUsIHdoZW4gZW50cnkgMSBvdXRyYW5rcyBlbnRyeSBuOwoJLy8gICAtIHRoZSBgYXQgPCBwcmV2YCBjaGVjayBpbiB0aGUgcmVhZCBsb29wIGJlbG93OwoJLy8gICAtIHRoZSBgIXcuQ29udGFpbnMoYXQpYCBjaGVjayBpbiB0aGUgcmVhZCBsb29wIGJlbG93LCB3aGljaCBpcyB0aGUgb25lCgkvLyAgICAgdGhhdCBmaXJlcyBvbiB0aGUgY29tbW9uIGRpcCBjYXNlLgoJLy8gQW5kIHdoZW4gYSBkaXAgbWFrZXMgdGhlIHNlYXJjaCByZXR1cm4gYW4gRU1QVFkgcmFuZ2Ug4oCUIGhpIDwgbG8sIHNvIHRoZQoJLy8gbG9vcCBuZXZlciBydW5zIGFuZCBub25lIG9mIHRoZSB0aHJlZSBjYW4gc3BlYWsg4oCUIHRoZSBuZXQgaXMgUHVibGlzaCdzCgkvLyBjdW11bGF0aXZlIGNyb3NzLWNoZWNrIGFnYWluc3QgdGhlIGxpdmUgY2FzaCBiYWxhbmNlLCB3aGljaCBpcyB3aHkgdGhhdAoJLy8gY2hlY2sgaXMgbm90IGFuIG9wdGlvbmFsIG5pY2V0eS4gU2VlIFtPcGVuaW5nUmVjb25jaWxlZF0gZm9yIGl0cyBzY29wZSwKCS8vIGFuZCBub3RlIHRoZSByZXNpZHVhbCBob25lc3RseTogYSB3aW5kb3cgdGhhdCBkb2VzIG5vdCBleHRlbmQgcGFzdCB0aGUKCS8vIGxhc3QgZW50cnkgaGFzIG5vIGN1bXVsYXRpdmUgY2hlY2ssIHNvIGEgZGlwIHRoYXQgcHJvZHVjZXMgYW4gZW1wdHkKCS8vIHJhbmdlIGluc2lkZSBhIGNsb3NlZCB3aW5kb3cgaXMgdW5kZXItcmVwb3J0ZWQgYW5kIG9ubHkKCS8vIE9wZW5pbmdSZWNvbmNpbGVkJ3MgZmFsc2UgcmVhZGluZyBkaXNjbG9zZXMgaXQuCglpZiBoaSA8IGxvIHsKCQlyZXR1cm4gbmlsLCBsbywgaGksIHBhc3RFbmQKCX0KCWNvdW50IDo9IGhpIC0gbG8gKyAxCglpZiBjb3VudCA+IHVpbnQ2NChNYXhXaW5kb3dFbnRyaWVzKSB7CgkJcGFuaWMoImNhc2hmbG93OiB0aGUgd2luZG93IGhvbGRzICIgKyBzdHJjb252LkZvcm1hdFVpbnQoY291bnQsIDEwKSArCgkJCSIgZW50cmllcyBhbmQgdGhlIGxpbWl0IGlzICIgKyBzdHJjb252Lkl0b2EoTWF4V2luZG93RW50cmllcykgKwoJCQkiOyBuYXJyb3cgdGhlIHdpbmRvdy4gVGhpcyByZWFsbSByZWZ1c2VzIHJhdGhlciB0aGFuIHJlYWRpbmcgYSAiICsKCQkJInBhcnRpYWwgc2V0LCBiZWNhdXNlIGEgc3RhdGVtZW50IG92ZXIgZmV3ZXIgZW50cmllcyB0aGFuIHRoZSAiICsKCQkJIndpbmRvdyBob2xkcyBzdGlsbCBiYWxhbmNlcyIpCgl9CgoJb3V0IDo9IG1ha2UoW11qb3VybmFsLkVudHJ5LCAwLCBpbnQoY291bnQpKQoJcHJldiA6PSBpbnQ2NCgtMSkKCWZvciBpZCA6PSBsbzsgaWQgPD0gaGk7IGlkKysgewoJCWF0LCBtZW1vLCBsZWdzLCByZXZlcnNhbE9mLCB0b3RhbCA6PSBib29rcy5FbnRyeUluZm8ob3duZXIsIGlkKQoJCWlmIGF0IDwgcHJldiB7CgkJCXBhbmljKCJjYXNoZmxvdzogZW50cnkgIiArIHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApICsgIiBpcyBkYXRlZCAiICsKCQkJCXN0cmNvbnYuRm9ybWF0SW50KGF0LCAxMCkgKyAiIGFmdGVyIGVudHJ5ICIgKwoJCQkJc3RyY29udi5Gb3JtYXRVaW50KGlkLTEsIDEwKSArICIgZGF0ZWQgIiArCgkJCQlzdHJjb252LkZvcm1hdEludChwcmV2LCAxMCkgKwoJCQkJIjsgZW50cnkgZGF0ZXMgYXJlIG5vdCBub24tZGVjcmVhc2luZyBhbmQgd2luZG93IHNlbGVjdGlvbiBpcyB1bnNvdW5kIikKCQl9CgkJcHJldiA9IGF0CgkJaWYgIXcuQ29udGFpbnMoYXQpIHsKCQkJcGFuaWMoImNhc2hmbG93OiBlbnRyeSAiICsgc3RyY29udi5Gb3JtYXRVaW50KGlkLCAxMCkgKyAiIGlzIGRhdGVkICIgKwoJCQkJc3RyY29udi5Gb3JtYXRJbnQoYXQsIDEwKSArICIgYW5kIGlzIG91dHNpZGUgdGhlIHdpbmRvdzsgdGhlICIgKwoJCQkJImxvY2F0ZWQgcmFuZ2UgaXMgd3JvbmciKQoJCX0KCQllIDo9IGpvdXJuYWwuRW50cnl7CgkJCUlEOiAgICAgICAgIGlkLAoJCQlBdDogICAgICAgICBhdCwKCQkJTWVtbzogICAgICAgbWVtbywKCQkJUG9zdGluZ3M6ICAgcGFyc2VMZWdzKG93bmVyLCBpZCwgYm9va3MuRW50cnlMZWdzKG93bmVyLCBpZCkpLAoJCQlSZXZlcnNhbE9mOiByZXZlcnNhbE9mLAoJCX0KCQlpZiBsZW4oZS5Qb3N0aW5ncykgIT0gbGVncyB7CgkJCXBhbmljKCJjYXNoZmxvdzogZW50cnkgIiArIHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApICsgIiByZXBvcnRzICIgKwoJCQkJc3RyY29udi5JdG9hKGxlZ3MpICsgIiBsZWdzIGFuZCBlbmNvZGVkICIgKwoJCQkJc3RyY29udi5JdG9hKGxlbihlLlBvc3RpbmdzKSkgKyAiOyByZWZ1c2luZyBhIHBhcnRpYWwgZW50cnkiKQoJCX0KCQkvLyBTYW1lIHJlYWNoIGFzIGNoYXJ0T2YncyBiYWxhbmNlIGNoZWNrIGFuZCB3b3J0aCB0aGUgc2FtZSBjYXV0aW9uOgoJCS8vIGJvdGggc2lkZXMgYXJlIGpvdXJuYWwuRW50cnkuVG90YWwgb3ZlciB0aGUgc2FtZSBwb3N0aW5ncywgc28gdGhpcwoJCS8vIGNhdGNoZXMgYSBkZWNvZGluZyBlcnJvciBpbiBwYXJzZUxlZ3Mg4oCUIGEgZHJvcHBlZCBsZWcsIGEgZmxpcHBlZAoJCS8vIHNpZGUsIGEgbWlzcGFyc2VkIGFtb3VudCDigJQgYW5kIGlzIE5PVCBhIGNyb3NzLWNoZWNrIG9mIHIvYm9va3MnCgkJLy8gYXJpdGhtZXRpYy4gQSBmbGlwcGVkIHNpZGUgaXMgdGhlIG9uZSB0aGF0IG1hdHRlcnM6IGl0IGludmVydHMgdGhlCgkJLy8gY2FzaCBkaXJlY3Rpb24gb2YgdGhlIGxlZyBhbmQgdGhlIHN0YXRlbWVudCB3b3VsZCBzdGlsbCByZWNvbmNpbGUuCgkJaWYgZS5Ub3RhbCgpICE9IHRvdGFsIHsKCQkJcGFuaWMoImNhc2hmbG93OiBlbnRyeSAiICsgc3RyY29udi5Gb3JtYXRVaW50KGlkLCAxMCkgKwoJCQkJIiB0b3RhbHMgIiArIHN0cmNvbnYuRm9ybWF0SW50KGUuVG90YWwoKSwgMTApICsKCQkJCSIgYXMgZGVjb2RlZCBhbmQgIiArIHN0cmNvbnYuRm9ybWF0SW50KHRvdGFsLCAxMCkgKwoJCQkJIiBhcyByZXBvcnRlZDsgdGhpcyByZWFsbSBkZWNvZGVkIHRoZSBsZWdzIHdyb25nbHkiKQoJCX0KCQlvdXQgPSBhcHBlbmQob3V0LCBlKQoJfQoJcmV0dXJuIG91dCwgbG8sIGhpLCBwYXN0RW5kCn0KCi8vIHBhcnNlTGVncyBkZWNvZGVzIHRoZSAiY29kZTpzaWRlOmFtb3VudCwuLi4iIGZvcm0gW2Jvb2tzLkVudHJ5TGVnc10gcmV0dXJucy4KLy8KLy8gVGhhdCBmb3JtIGlzIFtib29rcy5Qb3N0TXVsdGldJ3MgaW5wdXQgZm9ybWF0LCBzbyB0aGlzIGlzIHRoZSBpbnZlcnNlIG9mIGEKLy8gcGFyc2VyIGxpdmluZyBpbiB0aGUgcmVhbG0gdGhlIHN0cmluZyBjYW1lIGZyb20uIEl0IGlzIGR1cGxpY2F0ZWQgcmF0aGVyCi8vIHRoYW4gc2hhcmVkIGZvciB0aGUgc2FtZSByZWFzb24gY2hhcnRPZiBpczogci9ib29rcyBpcyBsaXZlLgovLwovLyBJdCBpcyBTVFJJQ1RFUiB0aGFuIHIvYm9va3MnIG93biBwYXJzZXIgaW4gb25lIGRpcmVjdGlvbiBhbmQgZGVsaWJlcmF0ZWx5Ci8vIHNvLiByL2Jvb2tzIGFjY2VwdHMgIkQiLCAiRFIiIGFuZCAiREVCSVQiIGZvciBhIHNpZGUgYmVjYXVzZSBhIGh1bWFuIHR5cGVzCi8vIGl0cyBpbnB1dDsgW2Jvb2tzLkVudHJ5TGVnc10gZW1pdHMgb25seSAiRCIgb3IgIkMiLCBzbyBhbnl0aGluZyBlbHNlIGhlcmUKLy8gbWVhbnMgdGhlIGZvcm1hdCBjaGFuZ2VkIHVuZGVybmVhdGggdGhpcyByZWFsbSBhbmQgdGhlIHJpZ2h0IG91dGNvbWUgaXMgYQovLyByZWZ1c2FsIHJhdGhlciB0aGFuIGEgdG9sZXJhbnQgcmVhZC4gSXQgaXMgbm90IHN0cmljdGVyIGFib3V0IGxlZyBjb3VudDoKLy8gci9ib29rcyByZWZ1c2VzIGZld2VyIHRoYW4gdHdvIG9uIHRoZSB3YXkgSU4sIGFuZCByZS1hc3NlcnRpbmcgdGhhdCBvbiB0aGUKLy8gd2F5IG91dCB3b3VsZCBkdXBsaWNhdGUgYW5vdGhlciByZWFsbSdzIGludmFyaWFudCBpbiBhIHBsYWNlIHRoYXQgY2Fubm90Ci8vIGVuZm9yY2UgaXQuCmZ1bmMgcGFyc2VMZWdzKG93bmVyIGFkZHJlc3MsIGlkIHVpbnQ2NCwgbGVncyBzdHJpbmcpIFtdam91cm5hbC5Qb3N0aW5nIHsKCXdoZXJlIDo9ICIgaW4gZW50cnkgIiArIHN0cmNvbnYuRm9ybWF0VWludChpZCwgMTApICsgIiBvZiAiICsgb3duZXIuU3RyaW5nKCkKCWlmIGxlZ3MgPT0gIiIgewoJCXBhbmljKCJjYXNoZmxvdzogIiArIEJvb2tzUGF0aCArICIgcmV0dXJuZWQgbm8gbGVncyIgKyB3aGVyZSkKCX0KCXBhcnRzIDo9IHN0cmluZ3MuU3BsaXQobGVncywgIiwiKQoJaWYgbGVuKHBhcnRzKSA+IGpvdXJuYWwuTWF4UG9zdGluZ3NQZXJFbnRyeSB7CgkJcGFuaWMoImNhc2hmbG93OiAiICsgc3RyY29udi5JdG9hKGxlbihwYXJ0cykpICsgIiBsZWdzIiArIHdoZXJlICsKCQkJIiBleGNlZWRzIGpvdXJuYWwuTWF4UG9zdGluZ3NQZXJFbnRyeSIpCgl9CglvdXQgOj0gbWFrZShbXWpvdXJuYWwuUG9zdGluZywgMCwgbGVuKHBhcnRzKSkKCWZvciBpLCByYXcgOj0gcmFuZ2UgcGFydHMgewoJCWF0IDo9ICIgYXQgbGVnICIgKyBzdHJjb252Lkl0b2EoaSsxKSArIHdoZXJlCgkJZiA6PSBzdHJpbmdzLlNwbGl0KHJhdywgIjoiKQoJCWlmIGxlbihmKSAhPSAzIHsKCQkJcGFuaWMoImNhc2hmbG93OiBleHBlY3RlZCBjb2RlOnNpZGU6YW1vdW50IiArIGF0KQoJCX0KCQlpZiBmWzBdID09ICIiIHsKCQkJcGFuaWMoImNhc2hmbG93OiBlbXB0eSBhY2NvdW50IGNvZGUiICsgYXQpCgkJfQoJCXZhciBzaWRlIGpvdXJuYWwuU2lkZQoJCXN3aXRjaCBmWzFdIHsKCQljYXNlICJEIjoKCQkJc2lkZSA9IGpvdXJuYWwuRGViaXQKCQljYXNlICJDIjoKCQkJc2lkZSA9IGpvdXJuYWwuQ3JlZGl0CgkJZGVmYXVsdDoKCQkJcGFuaWMoImNhc2hmbG93OiAiICsgQm9va3NQYXRoICsgIiBlbmNvZGVkIHNpZGUgIiArCgkJCQlzdHJjb252LlF1b3RlKGZbMV0pICsgYXQgKyAiOyB3YW50IEQgb3IgQyIpCgkJfQoJCWFtb3VudCwgZXJyIDo9IHN0cmNvbnYuUGFyc2VJbnQoZlsyXSwgMTAsIDY0KQoJCWlmIGVyciAhPSBuaWwgewoJCQlwYW5pYygiY2FzaGZsb3c6IGFtb3VudCBpcyBub3QgYW4gaW50ZWdlciIgKyBhdCkKCQl9CgkJaWYgYW1vdW50IDw9IDAgewoJCQlwYW5pYygiY2FzaGZsb3c6IGFtb3VudCBtdXN0IGJlIHBvc2l0aXZlIiArIGF0KQoJCX0KCQlvdXQgPSBhcHBlbmQob3V0LCBqb3VybmFsLlBvc3Rpbmd7QWNjb3VudDogZlswXSwgU2lkZTogc2lkZSwgQW1vdW50OiBhbW91bnR9KQoJfQoJcmV0dXJuIG91dAp9CgovLyBsaXZlQ2FzaCBzdW1zIHRoZSBkZWNsYXJlZCBjYXNoIGFjY291bnRzJyBiYWxhbmNlcyBub3cuCi8vCi8vIEV2ZXJ5IGNhc2ggY29kZSBpcyBhIFtqb3VybmFsLkFzc2V0XSDigJQgW2NmLkRlcml2ZV0gcmVmdXNlcyBhIHBvbGljeSB0aGF0Ci8vIGRlY2xhcmVzIGEgbm9uLWFzc2V0IGFzIGNhc2gg4oCUIHNvIGVhY2ggYmFsYW5jZSBpcyBkZWJpdC1ub3JtYWwgYW5kIHRoZSBzdW0KLy8gaXMgdGhlIGJvb2sncyBjdW11bGF0aXZlIG5ldCBjYXNoIG1vdmVtZW50IHNpbmNlIGl0cyBmaXJzdCBwb3N0aW5nLiBUaGF0IGlzCi8vIHRoZSBmaWd1cmUgW09wZW5pbmdSZWNvbmNpbGVkXSBjb21wYXJlcyBhZ2FpbnN0LgpmdW5jIGxpdmVDYXNoKG93bmVyIGFkZHJlc3MsIGNhc2ggW11zdHJpbmcpIGludDY0IHsKCXRvdGFsIDo9IGludDY0KDApCglmb3IgXywgY29kZSA6PSByYW5nZSBjYXNoIHsKCQliLCBvayA6PSBib29rcy5CYWxhbmNlKG93bmVyLCBjb2RlKQoJCWlmICFvayB7CgkJCXBhbmljKCJjYXNoZmxvdzogZGVjbGFyZWQgY2FzaCBhY2NvdW50ICIgKyBjb2RlICsKCQkJCSIgaXMgbm90IGluIHRoZSBvd25lcidzIGNoYXJ0IikKCQl9CgkJc3VtLCBvazIgOj0gY2hlY2tlZEFkZCh0b3RhbCwgYikKCQlpZiAhb2syIHsKCQkJcGFuaWMoImNhc2hmbG93OiB0aGUgZGVjbGFyZWQgY2FzaCBhY2NvdW50cycgYmFsYW5jZXMgb3ZlcmZsb3cgaW50NjQiKQoJCX0KCQl0b3RhbCA9IHN1bQoJfQoJcmV0dXJuIHRvdGFsCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBEZWNsYXJpbmcgYSBwb2xpY3kKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBEZWNsYXJlUG9saWN5IHJlY29yZHMgdGhlIGNhbGxlcidzIG93biBjbGFzc2lmaWNhdGlvbiBwb2xpY3kgZm9yIHRoZWlyIG93bgovLyBib29rLCByZXBsYWNpbmcgYW55IHByZXZpb3VzIG9uZS4KLy8KLy8gYGNhc2hgIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYWNjb3VudCBjb2RlcyB0aGF0IGhvbGQgY2FzaCwgc3RyaWN0bHkKLy8gYXNjZW5kaW5nIOKAlCBmb3IgZXhhbXBsZSBgMTAxMCwxMDIwYC4gSXQgbXVzdCBiZSBub24tZW1wdHkgYW5kIGV2ZXJ5IGNvZGUKLy8gbXVzdCBiZSBhbiBhc3NldCBpbiB0aGUgY2FsbGVyJ3MgY2hhcnQuCi8vCi8vIGBydWxlc2AgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBgY29kZTpjYXRlZ29yeWAgcGFpcnMsIHN0cmljdGx5Ci8vIGFzY2VuZGluZyBieSBjb2RlLCB3aGVyZSBjYXRlZ29yeSBpcyBgb3BlcmF0aW5nYCwgYGludmVzdGluZ2Agb3IKLy8gYGZpbmFuY2luZ2Ag4oCUIGZvciBleGFtcGxlIGA0MDAwOm9wZXJhdGluZywxNTAwOmludmVzdGluZywzMDAwOmZpbmFuY2luZ2AuCi8vIEEgY29kZSBhYnNlbnQgZnJvbSBgcnVsZXNgIGlzIE5PVCBkZWZhdWx0ZWQgdG8gYW55dGhpbmc6IGFuIGVudHJ5IHRvdWNoaW5nCi8vIGl0IGlzIHJlcG9ydGVkIHVucmVzb2x2ZWQsIGJ5IG5hbWUsIGJlY2F1c2UgYSBkZWZhdWx0IGJ1Y2tldCB0dXJucyBhIG1pc3NpbmcKLy8gZGVjbGFyYXRpb24gaW50byBhIGZpZ3VyZSBub2JvZHkgcXVlc3Rpb25zLiBgcnVsZXNgIG1heSBiZSBlbXB0eS4KLy8KLy8gVGhlIG93bmVyIGlzIGBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKClgIGFuZCB0aGVyZSBpcyBOTyBvd25lciBwYXJhbWV0ZXIuCi8vIFtyL2Jvb2tzXSBkZXJpdmVzIGEgYm9vaydzIG93bmVyIHRoZSBzYW1lIHdheSBhbmQgbm8gbXV0YXRpbmcgZnVuY3Rpb24gdGhlcmUKLy8gdGFrZXMgb25lIGVpdGhlciwgc28gdGhlIG9ubHkgcGFydHkgd2hvIGNhbiBkZWNsYXJlIGEgcG9saWN5IGZvciBhIGJvb2sgaXMKLy8gdGhlIG9ubHkgcGFydHkgd2hvIGNhbiB3cml0ZSB0byBpdC4gQW4gb3duZXIgcGFyYW1ldGVyIHdvdWxkIG1vdmUgdGhlIHRydXN0Ci8vIGJvdW5kYXJ5IHRvIHdob2V2ZXIgY2FsbGVkIHRoaXMuCi8vCi8vIFRoZSBkZWNsYXJhdGlvbiBpcyB2YWxpZGF0ZWQgYWdhaW5zdCB0aGUgY2FsbGVyJ3MgTElWRSBjaGFydCBieSBkZXJpdmluZwovLyBvdmVyIGFuIGVtcHR5IGVudHJ5IHNldDogW2NmLkRlcml2ZV0gdmFsaWRhdGVzIHRoZSB3aW5kb3csIHRoZSBjaGFydCBhbmQgdGhlCi8vIHBvbGljeSBiZWZvcmUgaXQgcmVhZHMgYW4gZW50cnksIHNvIGEgbmlsIGVudHJ5IHNsaWNlIGV4ZXJjaXNlcyBleGFjdGx5IHRoZQovLyBkZWNsYXJhdGlvbidzIHZhbGlkaXR5IGFuZCBub3RoaW5nIGVsc2UuIEEgcG9saWN5IHRoYXQgaXMgdmFsaWQgbm93IHN0YXlzCi8vIHZhbGlkLCBiZWNhdXNlIFtyL2Jvb2tzXSBoYXMgbm8gd2F5IHRvIHJlbW92ZSBhbiBhY2NvdW50IGZyb20gYSBjaGFydC4KZnVuYyBEZWNsYXJlUG9saWN5KGN1ciByZWFsbSwgY2FzaCwgcnVsZXMgc3RyaW5nKSB7CglyZWZ1c2VDb2lucyhjdXIpCglvd25lciA6PSBjdXIuUHJldmlvdXMoKS5BZGRyZXNzKCkKCgljIDo9IHBhcnNlQ2FzaChjYXNoKQoJciA6PSBwYXJzZVJ1bGVzKHJ1bGVzKQoKCWlmIF8sIGVyciA6PSBjZi5EZXJpdmUoCgkJY2hhcnRPZihvd25lciksIG5pbCwKCQlwZXJpb2RzLldpbmRvd3tGcm9tOiAwLCBVbnRpbDogMX0sCgkJY2YuUG9saWN5e0Nhc2g6IGMsIFJ1bGVzOiByfSwKCQkwLAoJKTsgZXJyICE9IG5pbCB7CgkJcGFuaWMoImNhc2hmbG93OiAiICsgZXJyLkVycm9yKCkpCgl9CgoJcG9saWNpZXMuU2V0KG93bmVyLlN0cmluZygpLCAmcG9saWN5ewoJCWNhc2g6ICBjLAoJCXJ1bGVzOiByLAoJCWF0OiAgICBydW50aW1lLkNoYWluSGVpZ2h0KCksCgl9KQp9CgovLyBwYXJzZUNhc2ggZGVjb2RlcyB0aGUgY2FzaC1jb2RlIGxpc3QuIE9yZGVyIGFuZCBkdXBsaWNhdGlvbiBhcmUgTk9UIGNoZWNrZWQKLy8gaGVyZTogW2NmLkRlcml2ZV0ncyB2YWxpZGF0ZVBvbGljeSByZXF1aXJlcyBzdHJpY3RseSBhc2NlbmRpbmcgY29kZXMgYW5kCi8vIHNheXMgc28gd2l0aCBpdHMgb3duIGVycm9yLCBhbmQgYSBzZWNvbmQgY29weSBvZiB0aGF0IHJ1bGUgaGVyZSB3b3VsZCBiZSBhCi8vIHNlY29uZCBwbGFjZSBmb3IgdGhlIHR3byB0byBkaXNhZ3JlZS4KZnVuYyBwYXJzZUNhc2goY2FzaCBzdHJpbmcpIFtdc3RyaW5nIHsKCWlmIGNhc2ggPT0gIiIgewoJCXBhbmljKCJjYXNoZmxvdzogbm8gY2FzaCBhY2NvdW50cyBkZWNsYXJlZDsgZm9ybWF0IGlzIFwiMTAxMCwxMDIwXCIiKQoJfQoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChjYXNoLCAiLCIpCglpZiBsZW4ocGFydHMpID4gYm9va3MuTWF4QWNjb3VudHNQZXJCb29rIHsKCQlwYW5pYygiY2FzaGZsb3c6ICIgKyBzdHJjb252Lkl0b2EobGVuKHBhcnRzKSkgKwoJCQkiIGNhc2ggY29kZXMgZXhjZWVkcyBib29rcy5NYXhBY2NvdW50c1BlckJvb2siKQoJfQoJb3V0IDo9IG1ha2UoW11zdHJpbmcsIDAsIGxlbihwYXJ0cykpCglmb3IgaSwgcmF3IDo9IHJhbmdlIHBhcnRzIHsKCQljb2RlIDo9IHN0cmluZ3MuVHJpbVNwYWNlKHJhdykKCQlpZiBjb2RlID09ICIiIHsKCQkJcGFuaWMoImNhc2hmbG93OiBlbXB0eSBjYXNoIGNvZGUgYXQgcG9zaXRpb24gIiArIHN0cmNvbnYuSXRvYShpKzEpKQoJCX0KCQlvdXQgPSBhcHBlbmQob3V0LCBjb2RlKQoJfQoJcmV0dXJuIG91dAp9CgovLyBwYXJzZVJ1bGVzIGRlY29kZXMgdGhlIGNvZGU6Y2F0ZWdvcnkgbGlzdC4gQW4gZW1wdHkgc3RyaW5nIGlzIGEgbGVnaXRpbWF0ZQovLyBlbXB0eSBwb2xpY3kg4oCUIGV2ZXJ5IGVudHJ5IHRvdWNoaW5nIGEgbm9uLWNhc2ggYWNjb3VudCBpcyB0aGVuIHVucmVzb2x2ZWQsCi8vIHdoaWNoIGlzIGEgdHJ1ZSByZXBvcnQgb2YgYSBib29rIHdob3NlIG93bmVyIGhhcyBkZWNsYXJlZCBub3RoaW5nLgpmdW5jIHBhcnNlUnVsZXMocnVsZXMgc3RyaW5nKSBbXWNmLkNsYXNzaWZpY2F0aW9uIHsKCWlmIHN0cmluZ3MuVHJpbVNwYWNlKHJ1bGVzKSA9PSAiIiB7CgkJcmV0dXJuIG5pbAoJfQoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChydWxlcywgIiwiKQoJaWYgbGVuKHBhcnRzKSA+IGJvb2tzLk1heEFjY291bnRzUGVyQm9vayB7CgkJcGFuaWMoImNhc2hmbG93OiAiICsgc3RyY29udi5JdG9hKGxlbihwYXJ0cykpICsKCQkJIiBydWxlcyBleGNlZWRzIGJvb2tzLk1heEFjY291bnRzUGVyQm9vayIpCgl9CglvdXQgOj0gbWFrZShbXWNmLkNsYXNzaWZpY2F0aW9uLCAwLCBsZW4ocGFydHMpKQoJZm9yIGksIHJhdyA6PSByYW5nZSBwYXJ0cyB7CgkJYXQgOj0gIiBhdCBydWxlICIgKyBzdHJjb252Lkl0b2EoaSsxKQoJCWYgOj0gc3RyaW5ncy5TcGxpdChzdHJpbmdzLlRyaW1TcGFjZShyYXcpLCAiOiIpCgkJaWYgbGVuKGYpICE9IDIgewoJCQlwYW5pYygiY2FzaGZsb3c6IGV4cGVjdGVkIGNvZGU6Y2F0ZWdvcnkiICsgYXQpCgkJfQoJCWNvZGUgOj0gc3RyaW5ncy5UcmltU3BhY2UoZlswXSkKCQlpZiBjb2RlID09ICIiIHsKCQkJcGFuaWMoImNhc2hmbG93OiBlbXB0eSBhY2NvdW50IGNvZGUiICsgYXQpCgkJfQoJCW91dCA9IGFwcGVuZChvdXQsIGNmLkNsYXNzaWZpY2F0aW9uewoJCQlDb2RlOiAgICAgY29kZSwKCQkJQ2F0ZWdvcnk6IHBhcnNlQ2F0ZWdvcnkoc3RyaW5ncy5UcmltU3BhY2UoZlsxXSkpLAoJCX0pCgl9CglyZXR1cm4gb3V0Cn0KCi8vIHBhcnNlQ2F0ZWdvcnkgdHVybnMgYSBjYXRlZ29yeSB3b3JkIGludG8gYSBbY2YuQ2F0ZWdvcnldIGFuZCBwYW5pY3Mgb24KLy8gYW55dGhpbmcgZWxzZS4gVGhlIHRocmVlIHdvcmRzIGFyZSB0aGF0IHR5cGUncyBvd24gU3RyaW5nIG91dHB1dDsgdGhlIHN1aXRlCi8vIHBpbnMgdGhlIHJvdW5kIHRyaXAgb3ZlciBhbGwgdGhyZWUgcmF0aGVyIHRoYW4gdHJ1c3RpbmcgYW5vdGhlciBwYWNrYWdlJ3MKLy8gbWV0aG9kIHRvIHN0YXkgcHV0LgovLwovLyBJdCBwYW5pY3MgcmF0aGVyIHRoYW4gcmV0dXJuaW5nIHRoZSB6ZXJvIENhdGVnb3J5IGJlY2F1c2UgdGhlIHplcm8gdmFsdWUgaXMKLy8gZGVsaWJlcmF0ZWx5IGludmFsaWQgaW4gW3AvY2FzaGZsb3ddIGFuZCBhIHNpbGVudGx5LXplcm8gcnVsZSB3b3VsZCByZWFjaAovLyB2YWxpZGF0ZVBvbGljeSBhcyBFcnJJbnZhbGlkQ2F0ZWdvcnksIHBvaW50aW5nIGEgcmVhZGVyIGF0IHRoZSB3cm9uZyBsYXllci4KZnVuYyBwYXJzZUNhdGVnb3J5KHMgc3RyaW5nKSBjZi5DYXRlZ29yeSB7Cglzd2l0Y2ggcyB7CgljYXNlICJvcGVyYXRpbmciOgoJCXJldHVybiBjZi5DYXRlZ29yeU9wZXJhdGluZwoJY2FzZSAiaW52ZXN0aW5nIjoKCQlyZXR1cm4gY2YuQ2F0ZWdvcnlJbnZlc3RpbmcKCWNhc2UgImZpbmFuY2luZyI6CgkJcmV0dXJuIGNmLkNhdGVnb3J5RmluYW5jaW5nCgl9CglwYW5pYygiY2FzaGZsb3c6IHVua25vd24gY2F0ZWdvcnkgIiArIHN0cmNvbnYuUXVvdGUocykgKwoJCSI7IHdhbnQgb3BlcmF0aW5nLCBpbnZlc3Rpbmcgb3IgZmluYW5jaW5nIikKfQoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIFB1Ymxpc2hpbmcKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBQdWJsaXNoIGZyZWV6ZXMgYSBzdGF0ZW1lbnQgb2YgY2FzaCBmbG93cyBvdmVyIFtmcm9tLCB1bnRpbCkgYW5kIHJldHVybnMgaXRzCi8vIHNlcXVlbmNlIG51bWJlciwgd2hpY2ggY291bnRzIGZyb20gMSBwZXIgcHVibGlzaGVyLgovLwovLyBUaGUgd2luZG93IGlzIGhhbGYtb3BlbjogYGZyb21gIGlzIGluY2x1ZGVkIGFuZCBgdW50aWxgIGlzIG5vdC4gVGhlIHVuaXQgaXMKLy8gd2hhdGV2ZXIgW3IvYm9va3NdIGRhdGVzIHdpdGgsIHdoaWNoIGlzIGJsb2NrIGhlaWdodC4KLy8KLy8gYG9wZW5pbmdgIGlzIHRoZSBjYWxsZXIncyBkZWNsYXJlZCBvcGVuaW5nIGNhc2ggcG9zaXRpb24uIEl0IGNhbm5vdCBiZQovLyBkZXJpdmVkIGZyb20gYSB3aW5kb3dlZCBlbnRyeSBzZXQgYW5kIGlzIGVjaG9lZCBpbnRvIHRoZSByZXBvcnQgdW5jaGFuZ2VkOwovLyBzZWUgW09wZW5pbmdSZWNvbmNpbGVkXSBmb3IgdGhlIG9uZSB3aW5kb3cgc2hhcGUgd2hlcmUgdGhpcyByZWFsbSBjYW4gYW5kCi8vIGRvZXMgY2hlY2sgaXQuCi8vCi8vIFRoZSBvd25lciBpcyBgY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpYC4gVGhlcmUgaXMgTk8gb3duZXIgcGFyYW1ldGVyIGFuZCBubwovLyB3YXkgdG8gcHVibGlzaCBvdmVyIHNvbWVvbmUgZWxzZSdzIGJvb2ssIGZvciB0aGUgcmVhc29uIGdpdmVuIGF0Ci8vIFtEZWNsYXJlUG9saWN5XS4KLy8KLy8gSXQgUEFOSUNTLCByYXRoZXIgdGhhbiByZXR1cm5pbmcgYW4gZXJyb3IsIG9uOiBubyBib29rLCBubyBkZWNsYXJlZCBwb2xpY3ksCi8vIGFuIGludmFsaWQgd2luZG93LCBhIHdpbmRvdyBob2xkaW5nIG1vcmUgdGhhbiBbTWF4V2luZG93RW50cmllc10gZW50cmllcywgYQovLyB2aW9sYXRpb24gb2YgdGhlIGVudHJ5LWRhdGluZyBwcmVtaXNlIGF0IGVpdGhlciB3aW5kb3cgZWRnZSwgYSBkaXNhZ3JlZW1lbnQKLy8gYmV0d2VlbiB0aGUgY2hhcnQncyB0d28gcmVhZHMgb3IgYW4gZW50cnkncyB0d28gcmVhZHMsIGFueSBbY2YuRGVyaXZlXSBlcnJvciwKLy8gYW5kIGEgZmFpbGVkIGN1bXVsYXRpdmUgY3Jvc3MtY2hlY2suIEFuIGVycm9yIHJldHVybiB3b3VsZCBub3QgcmV2ZXJ0IGEgR25vCi8vIHRyYW5zYWN0aW9uOyBvbmx5IGEgcGFuaWMgZG9lcy4KZnVuYyBQdWJsaXNoKGN1ciByZWFsbSwgZnJvbSwgdW50aWwsIG9wZW5pbmcgaW50NjQpIGludDY0IHsKCXJlZnVzZUNvaW5zKGN1cikKCW93bmVyIDo9IGN1ci5QcmV2aW91cygpLkFkZHJlc3MoKQoKCXBvbCA6PSBtdXN0UG9saWN5KG93bmVyKQoJdyA6PSBwZXJpb2RzLldpbmRvd3tGcm9tOiBmcm9tLCBVbnRpbDogdW50aWx9CglpZiAhdy5WYWxpZCgpIHsKCQlwYW5pYygiY2FzaGZsb3c6IHdpbmRvdyBbIiArIHN0cmNvbnYuRm9ybWF0SW50KGZyb20sIDEwKSArICIsICIgKwoJCQlzdHJjb252LkZvcm1hdEludCh1bnRpbCwgMTApICsgIikgaXMgbm90IGEgcGVyaW9kOyB3YW50IDAgPD0gZnJvbSA8IHVudGlsIikKCX0KCgljaGFydCA6PSBjaGFydE9mKG93bmVyKQoJZW50cmllcywgbG8sIGhpLCBwYXN0RW5kIDo9IHNjYW4ob3duZXIsIHcpCgoJLy8gQSBDT1BZIG9mIHRoZSBzdG9yZWQgcG9saWN5IGdvZXMgdG8gRGVyaXZlLCBub3QgdGhlIHN0b3JlZCBzbGljZXMuIFRoZQoJLy8gcHJpbWl0aXZlIGRvZXMgbm90IG11dGF0ZSBhIFBvbGljeSwgYnV0IGhhbmRpbmcgc3RvcmVkIHN0YXRlIHRvIGNvZGUgaW4KCS8vIGFub3RoZXIgcGFja2FnZSBpcyB0aGUga2luZCBvZiB0aGluZyB0aGF0IHN0YXlzIHNhZmUgb25seSB1bnRpbCB0aGF0CgkvLyBwYWNrYWdlIGNoYW5nZXMsIGFuZCB0aGlzIHJlYWxtIGlzIGltbXV0YWJsZSBhZnRlciBhZGRwa2cuCglyZXAsIGVyciA6PSBjZi5EZXJpdmUoY2hhcnQsIGVudHJpZXMsIHcsIGNmLlBvbGljeXsKCQlDYXNoOiAgY29weUNvZGVzKHBvbC5jYXNoKSwKCQlSdWxlczogY29weVJ1bGVzKHBvbC5ydWxlcyksCgl9LCBvcGVuaW5nKQoJaWYgZXJyICE9IG5pbCB7CgkJcGFuaWMoImNhc2hmbG93OiAiICsgZXJyLkVycm9yKCkpCgl9CgoJLy8gRGVyaXZlIGZpbHRlcnMgdGhlIHdpbmRvdyBpdHNlbGYsIHNvIHRoaXMgYXNzZXJ0cyB0aGF0IHRoZSBzY2FuIGhhbmRlZAoJLy8gaXQgZXhhY3RseSB0aGUgd2luZG93J3MgZW50cmllcyBhbmQgbm90aGluZyBpdCBoYWQgdG8gZGlzY2FyZC4gQQoJLy8gZGlzYWdyZWVtZW50IHdvdWxkIG1lYW4gc2NhbidzIHJhbmdlIGNoZWNrIGFib3ZlIGlzIHdyb25nLCBhbmQgdGhlIHR3bwoJLy8gYXJlIGluZGVwZW5kZW50IGNvZGUuCglpZiByZXAuRW50cmllcyAhPSBsZW4oZW50cmllcykgewoJCXBhbmljKCJjYXNoZmxvdzogIiArIHN0cmNvbnYuSXRvYShsZW4oZW50cmllcykpICsKCQkJIiBlbnRyaWVzIHdlcmUgcmVhZCBhbmQgdGhlIHJlcG9ydCBjb3VudHMgIiArCgkJCXN0cmNvbnYuSXRvYShyZXAuRW50cmllcykgKyAiIGluIHRoZSB3aW5kb3ciKQoJfQoKCS8vIFRIRSBDVU1VTEFUSVZFIENST1NTLUNIRUNLLiBTb3VuZCBvbmx5IHdoZW4gdGhlIHdpbmRvdyBleHRlbmRzIHBhc3QKCS8vIGV2ZXJ5IGVudHJ5IHRoZSBib29rIGhvbGRzOiB0aGVuIHRoZSB3aW5kb3cncyBuZXQgY2hhbmdlIHBsdXMgYSBjb3JyZWN0CgkvLyBvcGVuaW5nIGlzIHRoZSBib29rJ3Mgd2hvbGUgY2FzaCBtb3ZlbWVudCwgd2hpY2ggaXMgd2hhdCB0aGUgZGVjbGFyZWQKCS8vIGNhc2ggYWNjb3VudHMnIGJhbGFuY2VzIHN1bSB0by4gU2VlIFtPcGVuaW5nUmVjb25jaWxlZF0gZm9yIHdoeSBhCgkvLyBmYWlsdXJlIGlzIGEgcmVmdXNhbCByYXRoZXIgdGhhbiBhIGZsYWcgb24gdGhlIHJlY29yZC4KCWxpdmUgOj0gaW50NjQoMCkKCWlmIHBhc3RFbmQgewoJCWxpdmUgPSBsaXZlQ2FzaChvd25lciwgcG9sLmNhc2gpCgkJaWYgbGl2ZSAhPSByZXAuQ2xvc2luZyB7CgkJCXBhbmljKCJjYXNoZmxvdzogcmVmdXNpbmcgdG8gcHVibGlzaC4gVGhlIHdpbmRvdyBleHRlbmRzIHBhc3QgZXZlcnkgIiArCgkJCQkiZW50cnkgaW4gdGhlIGJvb2ssIHNvIHRoZSBkZWNsYXJlZCBvcGVuaW5nIG9mICIgKwoJCQkJc3RyY29udi5Gb3JtYXRJbnQob3BlbmluZywgMTApICsgIiBwbHVzIHRoZSB3aW5kb3cncyBuZXQgY2hhbmdlIG9mICIgKwoJCQkJc3RyY29udi5Gb3JtYXRJbnQocmVwLk5ldENoYW5nZSwgMTApICsgIiBzaG91bGQgZXF1YWwgdGhlIGRlY2xhcmVkICIgKwoJCQkJImNhc2ggYWNjb3VudHMnIGJhbGFuY2Ugb2YgIiArIHN0cmNvbnYuRm9ybWF0SW50KGxpdmUsIDEwKSArCgkJCQkiLCBhbmQgaXQgaXMgIiArIHN0cmNvbnYuRm9ybWF0SW50KHJlcC5DbG9zaW5nLCAxMCkgKwoJCQkJIi4gRWl0aGVyIHRoZSBvcGVuaW5nIGlzIHdyb25nIG9yIHRoZSBlbnRyeSBzY2FuIGlzIGluY29tcGxldGUiKQoJCX0KCX0KCglzZXEgOj0gaW50NjQob3duZXJDb3VudChvd25lci5TdHJpbmcoKSkgKyAxKQoJcHVibGlzaGVkLlNldChwdWJLZXkob3duZXIuU3RyaW5nKCksIHNlcSksICZyZWNvcmR7CgkJYXQ6ICAgICAgICAgcnVudGltZS5DaGFpbkhlaWdodCgpLAoJCXJlcDogICAgICAgIHJlcCwKCQlwb2w6ICAgICAgICBwb2xpY3l7Y2FzaDogY29weUNvZGVzKHBvbC5jYXNoKSwgcnVsZXM6IGNvcHlSdWxlcyhwb2wucnVsZXMpLCBhdDogcG9sLmF0fSwKCQlsbzogICAgICAgICBsbywKCQloaTogICAgICAgICBoaSwKCQlyZWNvbmNpbGVkOiBwYXN0RW5kLAoJCWNhc2g6ICAgICAgIGxpdmUsCgl9KQoJY291bnRzLlNldChvd25lci5TdHJpbmcoKSwgaW50KHNlcSkpCglwdWJDb3VudCsrCglyZXR1cm4gc2VxCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZWFkaW5nIGEgcHVibGlzaGVkIHN0YXRlbWVudAovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIENvdW50IGlzIGhvdyBtYW55IHN0YXRlbWVudHMgYW4gb3duZXIgaGFzIHB1Ymxpc2hlZC4KZnVuYyBDb3VudChvd25lciBhZGRyZXNzKSBpbnQgeyByZXR1cm4gb3duZXJDb3VudChvd25lci5TdHJpbmcoKSkgfQoKLy8gTGF0ZXN0IGlzIHRoZSBuZXdlc3Qgc2VxdWVuY2UgbnVtYmVyIGZvciBhbiBvd25lciwgYW5kIGZhbHNlIGlmIHRoZXkgaGF2ZQovLyBwdWJsaXNoZWQgbm9uZS4KZnVuYyBMYXRlc3Qob3duZXIgYWRkcmVzcykgKGludDY0LCBib29sKSB7CgluIDo9IG93bmVyQ291bnQob3duZXIuU3RyaW5nKCkpCglpZiBuID09IDAgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIGludDY0KG4pLCB0cnVlCn0KCi8vIFRvdGFsIGlzIGhvdyBtYW55IHN0YXRlbWVudHMgZXZlcnkgcHVibGlzaGVyIGhhcyBwdWJsaXNoZWQgdG9nZXRoZXIuIFRoZXJlCi8vIGlzIGRlbGliZXJhdGVseSBubyB3YXkgdG8gZW51bWVyYXRlIHRoZSBwdWJsaXNoZXJzOyBzZWUgdGhlIHBhY2thZ2UgZG9jLgpmdW5jIFRvdGFsKCkgaW50IHsgcmV0dXJuIHB1YkNvdW50IH0KCi8vIEhhcyByZXBvcnRzIHdoZXRoZXIgYSBzdGF0ZW1lbnQgZXhpc3RzLgpmdW5jIEhhcyhvd25lciBhZGRyZXNzLCBzZXEgaW50NjQpIGJvb2wgewoJcmV0dXJuIHB1Ymxpc2hlZC5IYXMocHViS2V5KG93bmVyLlN0cmluZygpLCBzZXEpKQp9CgovLyBQdWJsaXNoZWRBdCBpcyB0aGUgYmxvY2sgaGVpZ2h0IGEgc3RhdGVtZW50IHdhcyBmcm96ZW4gYXQuCmZ1bmMgUHVibGlzaGVkQXQob3duZXIgYWRkcmVzcywgc2VxIGludDY0KSBpbnQ2NCB7CglyZXR1cm4gbXVzdFJlY29yZChvd25lciwgc2VxKS5hdAp9CgovLyBXaW5kb3cgaXMgdGhlIHBlcmlvZCBhIHN0YXRlbWVudCBjb3ZlcnMsIGhhbGYtb3BlbjogYGZyb21gIGlzIGluLCBgdW50aWxgIGlzCi8vIG91dC4KZnVuYyBXaW5kb3cob3duZXIgYWRkcmVzcywgc2VxIGludDY0KSAoZnJvbSwgdW50aWwgaW50NjQpIHsKCXcgOj0gbXVzdFJlY29yZChvd25lciwgc2VxKS5yZXAuV2luZG93CglyZXR1cm4gdy5Gcm9tLCB3LlVudGlsCn0KCi8vIFRvdGFscyBpcyB0aGUgZm91ciBjdW11bGF0aXZlIGZpZ3VyZXMuIGBjbG9zaW5nYCBpcyBgb3BlbmluZyArIG5ldENoYW5nZWAsCi8vIGFuZCBgb3BlbmluZ2Agd2FzIHN1cHBsaWVkIGJ5IHRoZSBwdWJsaXNoZXIg4oCUIHNlZSBbT3BlbmluZ1JlY29uY2lsZWRdIGZvcgovLyB3aGV0aGVyIHRoaXMgcmVhbG0gd2FzIGFibGUgdG8gY2hlY2sgaXQuCi8vCi8vIGB1bmF0dHJpYnV0ZWRgIGlzIHRoZSBuZXQgbW92ZW1lbnQgb2YgdGhlIGVudHJpZXMgaW4gdGhlIHVucmVzb2x2ZWQgY2Vuc3VzCi8vIGFuZCBpcyBwYXJ0IG9mIGBuZXRDaGFuZ2VgLCBub3QgYWRkaXRpb25hbCB0byBpdC4KZnVuYyBUb3RhbHMob3duZXIgYWRkcmVzcywgc2VxIGludDY0KSAob3BlbmluZywgbmV0Q2hhbmdlLCB1bmF0dHJpYnV0ZWQsIGNsb3NpbmcgaW50NjQpIHsKCXIgOj0gbXVzdFJlY29yZChvd25lciwgc2VxKS5yZXAKCXJldHVybiByLk9wZW5pbmcsIHIuTmV0Q2hhbmdlLCByLlVuYXR0cmlidXRlZCwgci5DbG9zaW5nCn0KCi8vIExpbmVPZiBpcyBvbmUgY2F0ZWdvcnkncyBncm9zcyBmbG93cy4gYGNhdGVnb3J5YCBpcyBgb3BlcmF0aW5nYCwgYGludmVzdGluZ2AKLy8gb3IgYGZpbmFuY2luZ2A7IGFueXRoaW5nIGVsc2UgcGFuaWNzLgovLwovLyBJbmZsb3dzIGFuZCBvdXRmbG93cyBhcmUgR1JPU1MgYW5kIGJvdGggbm9uLW5lZ2F0aXZlLiBBIGNhdGVnb3J5IHdpdGggMSwwMDAKLy8gaW4gYW5kIDEsMDAwIG91dCBpcyBub3QgdGhlIHNhbWUgYnVzaW5lc3MgYXMgb25lIHdpdGggbm90aGluZyBoYXBwZW5pbmcsIGFuZAovLyBhIG5ldCBvZiB6ZXJvIGlzIGFsbCBhIG5ldHRlZCBmaWd1cmUgY291bGQgc2F5IGFib3V0IGVpdGhlci4KZnVuYyBMaW5lT2Yob3duZXIgYWRkcmVzcywgc2VxIGludDY0LCBjYXRlZ29yeSBzdHJpbmcpIChpbmZsb3dzLCBvdXRmbG93cywgbmV0IGludDY0LCBlbnRyaWVzIGludCkgewoJbCwgZXJyIDo9IG11c3RSZWNvcmQob3duZXIsIHNlcSkucmVwLkxpbmUocGFyc2VDYXRlZ29yeShjYXRlZ29yeSkpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYygiY2FzaGZsb3c6ICIgKyBlcnIuRXJyb3IoKSkKCX0KCXJldHVybiBsLkluZmxvd3MsIGwuT3V0Zmxvd3MsIGwuTmV0KCksIGwuRW50cmllcwp9CgovLyBTY29wZSBpcyB0aGUgc3RhdGVtZW50J3Mgb3duIGNvdmVyYWdlIGxpbmUsIGFuZCBpdCBpcyB0aGUgdGhpbmcgdG8gcmVhZAovLyBiZWZvcmUgcXVvdGluZyBhbnkgZmlndXJlIGFib3ZlLgovLwovLyAgIC0gYGVudHJpZXNgIGlzIGhvdyBtYW55IGVudHJpZXMgZmVsbCBpbiB0aGUgd2luZG93LCBpbmNsdWRpbmcgdGhlIG9uZXMKLy8gICAgIHRoYXQgbW92ZWQgbm8gY2FzaC4gWmVybyBpcyBhIHF1aWV0IHBlcmlvZCwgbm90IGFuIGVycm9yLgovLyAgIC0gYGNhc2hFbnRyaWVzYCBpcyBob3cgbWFueSB0b3VjaGVkIGEgZGVjbGFyZWQgY2FzaCBhY2NvdW50IGF0IGFsbC4KLy8gICAtIGBuZXRaZXJvYCBpcyBob3cgbWFueSB0b3VjaGVkIGNhc2ggYW5kIG1vdmVkIG5vbmUgb24gbmV0IOKAlCBhIHRyYW5zZmVyCi8vICAgICBiZXR3ZWVuIHR3byBjYXNoIGFjY291bnRzLiBDbGFzc2lmaWNhdGlvbiBpcyBub3QgYXR0ZW1wdGVkIGZvciB0aGVtOgovLyAgICAgdGhlcmUgaXMgbm90aGluZyB0byBhdHRyaWJ1dGUuCi8vICAgLSBgdW5yZXNvbHZlZGAgaXMgaG93IG1hbnkgY291bGQgbm90IGJlIGNsYXNzaWZpZWQuIEEgc3RhdGVtZW50IHdpdGgKLy8gICAgIHVucmVzb2x2ZWQgZW50cmllcyBpcyBzdGlsbCBhcml0aG1ldGljYWxseSB3aG9sZSDigJQgdGhlIHJlc2lkdWFsIGlzIGluCi8vICAgICBgdW5hdHRyaWJ1dGVkYCDigJQgYnV0IGl0cyBTUExJVCBpcyBpbmNvbXBsZXRlLgpmdW5jIFNjb3BlKG93bmVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgKGVudHJpZXMsIGNhc2hFbnRyaWVzLCBuZXRaZXJvLCB1bnJlc29sdmVkIGludCkgewoJciA6PSBtdXN0UmVjb3JkKG93bmVyLCBzZXEpLnJlcAoJcmV0dXJuIHIuRW50cmllcywgci5DYXNoRW50cmllcywgbGVuKHIuTmV0WmVybyksIGxlbihyLlVucmVzb2x2ZWQpCn0KCi8vIEVudHJ5UmFuZ2UgaXMgdGhlIGluY2x1c2l2ZSBbci9ib29rc10gZW50cnktSUQgcmFuZ2UgdGhpcyBzdGF0ZW1lbnQgd2FzCi8vIGRlcml2ZWQgZnJvbS4gYG9rYCBpcyBmYWxzZSB3aGVuIHRoZSB3aW5kb3cgaGVsZCBubyBlbnRyaWVzLgovLwovLyBJdCBpcyBzdG9yZWQgYmVjYXVzZSBpdCBpcyB0aGUgZXZpZGVuY2UgZm9yIHRoZSBzdGF0ZW1lbnQncyBzY29wZTogYSByZWFkZXIKLy8gY2FuIHRha2UgdGhlIHR3byBJRHMgdG8gW3IvYm9va3NdIGFuZCByZWFkIHRoZSBlbnRyaWVzIHRoZW1zZWx2ZXMuIEEKLy8gc3RhdGVtZW50IGlzIHRoZSBvbmx5IGFydGlmYWN0IGhlcmUsIGFuZCB0aGlzIGlzIHdoYXQgbWFrZXMgaXQgY2hlY2thYmxlCi8vIGFnYWluc3QgaXRzIHNvdXJjZS4KZnVuYyBFbnRyeVJhbmdlKG93bmVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgKGxvLCBoaSB1aW50NjQsIG9rIGJvb2wpIHsKCXIgOj0gbXVzdFJlY29yZChvd25lciwgc2VxKQoJaWYgci5oaSA8IHIubG8gewoJCXJldHVybiAwLCAwLCBmYWxzZQoJfQoJcmV0dXJuIHIubG8sIHIuaGksIHRydWUKfQoKLy8gQ29tcGxldGUgcmVwb3J0cyB3aGV0aGVyIGV2ZXJ5IGluLXdpbmRvdyBlbnRyeSB0aGF0IG1vdmVkIGNhc2ggd2FzCi8vIGF0dHJpYnV0ZWQgdG8gYSBjYXRlZ29yeS4KLy8KLy8gQSBjb21wbGV0ZSBzdGF0ZW1lbnQgaXMgbm90IGEgY29ycmVjdCBvbmUuIENvbXBsZXRlbmVzcyBpcyBhIHByb3BlcnR5IG9mIHRoZQovLyBQT0xJQ1kncyBjb3ZlcmFnZSwgYW5kIGEgcG9saWN5IHRoYXQgY2xhc3NpZmllcyBldmVyeSBhY2NvdW50IHdyb25nbHkgaXMKLy8gY29tcGxldGUuIFtwL2Nhc2hmbG93XSBzYXlzIHRoaXMgb2YgaXRzIG93biBhY2Nlc3NvciBhbmQgaXQgaXMgd29ydGgKLy8gcmVwZWF0aW5nIGF0IHRoZSByZWFsbSBib3VuZGFyeSwgd2hlcmUgdGhlIHdvcmQgd2lsbCBiZSBxdW90ZWQuCmZ1bmMgQ29tcGxldGUob3duZXIgYWRkcmVzcywgc2VxIGludDY0KSBib29sIHsKCXJldHVybiBtdXN0UmVjb3JkKG93bmVyLCBzZXEpLnJlcC5Db21wbGV0ZSgpCn0KCi8vIFJlY29uY2lsZXMgcmVwb3J0cyB3aGV0aGVyIHRoZSBhdHRyaWJ1dGVkIGxpbmVzIHBsdXMgdGhlIHVuYXR0cmlidXRlZAovLyByZXNpZHVhbCBlcXVhbCB0aGUgbmV0IGNoYW5nZS4KLy8KLy8gT24gYSBzdGF0ZW1lbnQgcHVibGlzaGVkIGhlcmUgaXQgaXMgQUxXQVlTIFRSVUUsIGJlY2F1c2UgW2NmLkRlcml2ZV0KLy8gcHJvZHVjZXMgaXQgdGhhdCB3YXkgYW5kIG5vdGhpbmcgYmV0d2VlbiB0aGVyZSBhbmQgc3RvcmFnZSB0b3VjaGVzIHRoZQovLyBmaWd1cmVzLiBJdCBpcyBleHBvc2VkIGFueXdheSwgYW5kIHRoZSByZWFzb24gaXMgbmFycm93OiBpdCBpcyB0aGUgb25lIGNoZWNrCi8vIGEgcmVhZGVyIGNhbiBydW4gYWdhaW5zdCBhIHN0b3JlZCByZXBvcnQgd2l0aG91dCByZS1yZWFkaW5nIHRoZSBsZWRnZXIsIGFuZAovLyBhbiBleHBvc2VkIGNvbnN0YW50LXRydWUgdGhhdCBpcyBET0NVTUVOVEVEIGFzIG9uZSBpcyBiZXR0ZXIgdGhhbiBhIHJlYWRlcgovLyBhc3N1bWluZyB0aGUgaW52YXJpYW50IGhvbGRzIHdpdGhvdXQgZXZlciBiZWluZyB0b2xkIHdoZXJlIGl0IGNvbWVzIGZyb20uCi8vIEl0IG11c3Qgbm90IGJlIHF1b3RlZCBhcyBldmlkZW5jZSB0aGF0IGEgc3RhdGVtZW50IGlzIHJpZ2h0LgpmdW5jIFJlY29uY2lsZXMob3duZXIgYWRkcmVzcywgc2VxIGludDY0KSBib29sIHsKCXJldHVybiBtdXN0UmVjb3JkKG93bmVyLCBzZXEpLnJlcC5SZWNvbmNpbGVzKCkKfQoKLy8gT3BlbmluZ1JlY29uY2lsZWQgcmVwb3J0cyB3aGV0aGVyIHRoaXMgcmVhbG0gd2FzIGFibGUgdG8gY2hlY2sgdGhlCi8vIHB1Ymxpc2hlcidzIGRlY2xhcmVkIG9wZW5pbmcgcG9zaXRpb24gYWdhaW5zdCB0aGUgbGVkZ2VyIOKAlCBhbmQsIGJlY2F1c2UgYQovLyBmYWlsZWQgY2hlY2sgUkVGVVNFUyB0byBwdWJsaXNoLCBpdCBiZWluZyB0cnVlIG1lYW5zIHRoZSBjaGVjayBwYXNzZWQuCi8vCi8vICMgV2hlbiBpdCBhcHBsaWVzCi8vCi8vIE9ubHkgd2hlbiB0aGUgd2luZG93IGV4dGVuZGVkIHBhc3QgZXZlcnkgZW50cnkgdGhlIGJvb2sgaGVsZCBhdCBwdWJsaWNhdGlvbi4KLy8gVGhlbiB0aGUgd2luZG93J3MgbmV0IGNoYW5nZSBjb3ZlcnMgYWxsIG1vdmVtZW50IGZyb20gYGZyb21gIG9ud2FyZCwgdGhlCi8vIGRlY2xhcmVkIGNhc2ggYWNjb3VudHMnIHN1bW1lZCBiYWxhbmNlIGNvdmVycyBhbGwgbW92ZW1lbnQgZXZlciwgYW5kIHRoZQovLyBkaWZmZXJlbmNlIGJldHdlZW4gdGhlbSBpcyBleGFjdGx5IHRoZSBtb3ZlbWVudCBiZWZvcmUgYGZyb21gIOKAlCB3aGljaCBpcwovLyB3aGF0IGEgY29ycmVjdCBvcGVuaW5nIGlzLiBBbiBlbXB0eSBib29rIHF1YWxpZmllcyB0b286IHdpdGggbm8gcG9zdGluZ3MKLy8gZXZlcnkgYmFsYW5jZSBpcyB6ZXJvLCBzbyB0aGUgY2hlY2sgcmVxdWlyZXMgYW4gb3BlbmluZyBvZiB6ZXJvLgovLwovLyBJdCBkb2VzIE5PVCBhcHBseSB0byBhIHdpbmRvdyB0aGF0IGNsb3NlZCBiZWZvcmUgbGF0ZXIgZW50cmllcyB3ZXJlIHBvc3RlZC4KLy8gVGhlcmUgdGhlIGJhbGFuY2VzIGNhcnJ5IHBvc3Qtd2luZG93IG1vdmVtZW50IHRoZSBzdGF0ZW1lbnQgcmlnaHRseSBleGNsdWRlcywKLy8gYW5kIGNvbXBhcmluZyB0aGVtIHdvdWxkIGJlIGNvbXBhcmluZyB0d28gZGlmZmVyZW50IHBlcmlvZHMuCi8vCi8vICMgV2hhdCBpdCBwcm92ZXMsIGFuZCB0aGUgc2Vjb25kIHRoaW5nIGl0IHByb3ZlcwovLwovLyBGaXJzdCwgdGhhdCB0aGUgZGVjbGFyZWQgb3BlbmluZyBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGxlZGdlci4gU2Vjb25kIOKAlCBhbmQKLy8gdGhpcyBpcyB3aHkgaXQgaXMgd29ydGggaXRzIGNvc3Qg4oCUIHRoYXQgVEhFIEVOVFJZIFNDQU4gV0FTIENPTVBMRVRFLiBBIHNjYW4KLy8gdGhhdCBzaWxlbnRseSBtaXNzZWQgZW50cmllcyBwcm9kdWNlcyBhIHNob3J0IG5ldCBjaGFuZ2UsIGFuZCBhIHNob3J0IG5ldAovLyBjaGFuZ2UgZmFpbHMgdGhpcyBjb21wYXJpc29uLiBUaGF0IGlzIHRoZSBvbmUgbWVjaGFuaWNhbCBjb250cm9sIHRoaXMgcmVhbG0KLy8gaGFzIGFnYWluc3QgdGhlIHNpbGVudC11bmRlci1yZXBvcnRpbmcgZmFpbHVyZSBtb2RlIHRoZSBwYWNrYWdlIGRvYyBuYW1lcywKLy8gYW5kIGl0IGNvdmVycyBleGFjdGx5IHRoZSB3aW5kb3cgc2hhcGUgd2hlcmUgaXQgaXMgYXZhaWxhYmxlLgovLwovLyAjIFdoYXQgaXQgZG9lcyBub3QgcHJvdmUKLy8KLy8gTm90aGluZyBhYm91dCB3aGV0aGVyIHRoZSBjb2RlcyBjYWxsZWQgY2FzaCBob2xkIGNhc2guIEJvdGggc2lkZXMgb2YgdGhlCi8vIGNvbXBhcmlzb24gYXJlIHRoZSBzYW1lIG93bmVyJ3Mgc2VsZi1yZXBvcnQsIHJlYWQgdGhyb3VnaCB0aGUgc2FtZSByZWFsbS4KLy8gSXQgaXMgYW4gaW50ZXJuYWwgY29uc2lzdGVuY3kgY2hlY2ssIG5vdCBhIGN1c3RvZHkgYXR0ZXN0YXRpb24uCmZ1bmMgT3BlbmluZ1JlY29uY2lsZWQob3duZXIgYWRkcmVzcywgc2VxIGludDY0KSBib29sIHsKCXJldHVybiBtdXN0UmVjb3JkKG93bmVyLCBzZXEpLnJlY29uY2lsZWQKfQoKLy8gUmVjb25jaWxlZENhc2ggaXMgdGhlIGRlY2xhcmVkIGNhc2ggYWNjb3VudHMnIHN1bW1lZCBiYWxhbmNlIGF0IHB1YmxpY2F0aW9uLAovLyBhbmQgZmFsc2UgaWYgW09wZW5pbmdSZWNvbmNpbGVkXSBkb2VzIG5vdCBhcHBseSB0byB0aGlzIHN0YXRlbWVudC4gVGhlCi8vIGZpZ3VyZSBpcyBtZWFuaW5nbGVzcyB3aGVuIG9rIGlzIGZhbHNlIGFuZCBpcyByZXR1cm5lZCBhcyB6ZXJvLgpmdW5jIFJlY29uY2lsZWRDYXNoKG93bmVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgKGludDY0LCBib29sKSB7CglyIDo9IG11c3RSZWNvcmQob3duZXIsIHNlcSkKCWlmICFyLnJlY29uY2lsZWQgewoJCXJldHVybiAwLCBmYWxzZQoJfQoJcmV0dXJuIHIuY2FzaCwgdHJ1ZQp9CgovLyBVbnJlc29sdmVkQ291bnQgaXMgaG93IG1hbnkgZW50cmllcyBjb3VsZCBub3QgYmUgY2xhc3NpZmllZC4KZnVuYyBVbnJlc29sdmVkQ291bnQob3duZXIgYWRkcmVzcywgc2VxIGludDY0KSBpbnQgewoJcmV0dXJuIGxlbihtdXN0UmVjb3JkKG93bmVyLCBzZXEpLnJlcC5VbnJlc29sdmVkKQp9CgovLyBVbnJlc29sdmVkQXQgaXMgb25lIHVucmVzb2x2ZWQgZW50cnksIGJ5IGluZGV4IGludG8gdGhlIGNlbnN1cy4KLy8KLy8gICAtIGByZWFzb25gIGlzIGBjb25mbGljdGAgKHRoZSBub24tY2FzaCBsZWdzIGNsYXNzaWZ5IHRvIG1vcmUgdGhhbiBvbmUKLy8gICAgIGNhdGVnb3J5KSwgYHVuZGVjbGFyZWRgIChhIG5vbi1jYXNoIGxlZydzIGFjY291bnQgaGFzIG5vIHBvbGljeSBydWxlKSBvcgovLyAgICAgYHVuYmFsYW5jZWRgLgovLyAgIC0gYG5ldGAgaXMgdGhlIGVudHJ5J3MgbmV0IGNhc2ggbW92ZW1lbnQsIHdoaWNoIGlzIHJlYWwgbW92ZW1lbnQgdGhlCi8vICAgICBzdGF0ZW1lbnQgY291bGQgbm90IGF0dHJpYnV0ZS4KLy8gICAtIGBjYXRlZ29yaWVzYCBpcyB0aGUgY29uZmxpY3RpbmcgY2F0ZWdvcmllcywgY29tbWEtc2VwYXJhdGVkLCBmb3IgYQovLyAgICAgY29uZmxpY3QuCi8vICAgLSBgY29kZXNgIGlzIHRoZSB1bmRlY2xhcmVkIGFjY291bnQgY29kZXMsIGNvbW1hLXNlcGFyYXRlZCwgZm9yIGFuCi8vICAgICB1bmRlY2xhcmVkIGVudHJ5LiBEZWNsYXJpbmcgdGhlbSBtYXkgcmVzb2x2ZSB0aGUgZW50cnksIHdoaWNoIGlzIHdoeQovLyAgICAgYHVuZGVjbGFyZWRgIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgY29uZmxpY3RgIHdoZW4gYm90aCBhcHBseS4KZnVuYyBVbnJlc29sdmVkQXQob3duZXIgYWRkcmVzcywgc2VxIGludDY0LCBpIGludCkgKGlkIHVpbnQ2NCwgcmVhc29uIHN0cmluZywgbmV0IGludDY0LCBjYXRlZ29yaWVzLCBjb2RlcyBzdHJpbmcpIHsKCXJvd3MgOj0gbXVzdFJlY29yZChvd25lciwgc2VxKS5yZXAuVW5yZXNvbHZlZAoJaWYgaSA8IDAgfHwgaSA+PSBsZW4ocm93cykgewoJCXBhbmljKCJjYXNoZmxvdzogdW5yZXNvbHZlZCBpbmRleCAiICsgc3RyY29udi5JdG9hKGkpICsgIiBvdXQgb2YgcmFuZ2UgMC4uIiArCgkJCXN0cmNvbnYuSXRvYShsZW4ocm93cyktMSkpCgl9Cgl1IDo9IHJvd3NbaV0KCWNhdHMgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKHUuQ2F0ZWdvcmllcykpCglmb3IgXywgYyA6PSByYW5nZSB1LkNhdGVnb3JpZXMgewoJCWNhdHMgPSBhcHBlbmQoY2F0cywgYy5TdHJpbmcoKSkKCX0KCXJldHVybiB1LkVudHJ5SUQsIHUuUmVhc29uLlN0cmluZygpLCB1Lk5ldCwKCQlzdHJpbmdzLkpvaW4oY2F0cywgIiwiKSwgc3RyaW5ncy5Kb2luKHUuQ29kZXMsICIsIikKfQoKLy8gTmV0WmVyb0NvdW50IGlzIGhvdyBtYW55IGluLXdpbmRvdyBlbnRyaWVzIHRvdWNoZWQgY2FzaCBhbmQgbW92ZWQgbm9uZSBvbgovLyBuZXQuCmZ1bmMgTmV0WmVyb0NvdW50KG93bmVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgaW50IHsKCXJldHVybiBsZW4obXVzdFJlY29yZChvd25lciwgc2VxKS5yZXAuTmV0WmVybykKfQoKLy8gTmV0WmVyb0F0IGlzIG9uZSBuZXQtemVybyBlbnRyeSdzIElELCBieSBpbmRleC4KZnVuYyBOZXRaZXJvQXQob3duZXIgYWRkcmVzcywgc2VxIGludDY0LCBpIGludCkgdWludDY0IHsKCWlkcyA6PSBtdXN0UmVjb3JkKG93bmVyLCBzZXEpLnJlcC5OZXRaZXJvCglpZiBpIDwgMCB8fCBpID49IGxlbihpZHMpIHsKCQlwYW5pYygiY2FzaGZsb3c6IG5ldC16ZXJvIGluZGV4ICIgKyBzdHJjb252Lkl0b2EoaSkgKyAiIG91dCBvZiByYW5nZSAwLi4iICsKCQkJc3RyY29udi5JdG9hKGxlbihpZHMpLTEpKQoJfQoJcmV0dXJuIGlkc1tpXQp9CgovLyBQb2xpY3lPZiBpcyB0aGUgY2xhc3NpZmljYXRpb24gcG9saWN5IHRoYXQgcHJvZHVjZWQgYSBwdWJsaXNoZWQgc3RhdGVtZW50LAovLyByZS1lbmNvZGVkIGluIFtEZWNsYXJlUG9saWN5XSdzIG93biBpbnB1dCBmb3JtYXQuCi8vCi8vIEl0IGlzIHRoZSBzdGF0ZW1lbnQncyBwb2xpY3ksIGZyb3plbiB3aXRoIGl0LCBOT1QgdGhlIG93bmVyJ3MgY3VycmVudCBvbmUuCi8vIFtQb2xpY3lJc1JlcGxhY2VhYmxlXSBleHBsYWlucyB3aHkgYm90aCBleGlzdDogYSByZWFkZXIgb2YgYSBwdWJsaXNoZWQKLy8gZmlndXJlIG5lZWRzIHRoZSBkZWNsYXJhdGlvbiB0aGF0IHByb2R1Y2VkIGl0LCBhbmQgYW4gb3duZXIgbmVlZHMgdG8gYmUgYWJsZQovLyB0byBjb3JyZWN0IGEgZGVjbGFyYXRpb24gd2l0aG91dCByZXN0YXRpbmcgaGlzdG9yeS4KZnVuYyBQb2xpY3lPZihvd25lciBhZGRyZXNzLCBzZXEgaW50NjQpIChjYXNoLCBydWxlcyBzdHJpbmcpIHsKCXAgOj0gbXVzdFJlY29yZChvd25lciwgc2VxKS5wb2wKCXJldHVybiBlbmNvZGVDYXNoKHAuY2FzaCksIGVuY29kZVJ1bGVzKHAucnVsZXMpCn0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBSZWFkaW5nIHRoZSBsaXZlIGxlZGdlcgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCi8vIEhhc1BvbGljeSByZXBvcnRzIHdoZXRoZXIgYW4gb3duZXIgaGFzIGRlY2xhcmVkIGEgcG9saWN5LgpmdW5jIEhhc1BvbGljeShvd25lciBhZGRyZXNzKSBib29sIHsgcmV0dXJuIHBvbGljaWVzLkhhcyhvd25lci5TdHJpbmcoKSkgfQoKLy8gUG9saWN5Q2FzaCBpcyB0aGUgb3duZXIncyBDVVJSRU5UIGRlY2xhcmVkIGNhc2ggY29kZXMsIGNvbW1hLXNlcGFyYXRlZC4KZnVuYyBQb2xpY3lDYXNoKG93bmVyIGFkZHJlc3MpIHN0cmluZyB7CglyZXR1cm4gZW5jb2RlQ2FzaChtdXN0UG9saWN5KG93bmVyKS5jYXNoKQp9CgovLyBQb2xpY3lSdWxlcyBpcyB0aGUgb3duZXIncyBDVVJSRU5UIGRlY2xhcmVkIHJ1bGVzLCBjb21tYS1zZXBhcmF0ZWQKLy8gYGNvZGU6Y2F0ZWdvcnlgIHBhaXJzLgpmdW5jIFBvbGljeVJ1bGVzKG93bmVyIGFkZHJlc3MpIHN0cmluZyB7CglyZXR1cm4gZW5jb2RlUnVsZXMobXVzdFBvbGljeShvd25lcikucnVsZXMpCn0KCi8vIFBvbGljeURlY2xhcmVkQXQgaXMgdGhlIGhlaWdodCB0aGUgb3duZXIncyBjdXJyZW50IHBvbGljeSB3YXMgZGVjbGFyZWQgYXQuCmZ1bmMgUG9saWN5RGVjbGFyZWRBdChvd25lciBhZGRyZXNzKSBpbnQ2NCB7IHJldHVybiBtdXN0UG9saWN5KG93bmVyKS5hdCB9CgovLyBMaXZlQ2FzaCBpcyB0aGUgZGVjbGFyZWQgY2FzaCBhY2NvdW50cycgc3VtbWVkIGJhbGFuY2UgcmlnaHQgbm93LgovLwovLyBUaGlzIGlzIHRoZSBib29rJ3MgY3VtdWxhdGl2ZSBuZXQgY2FzaCBtb3ZlbWVudCBzaW5jZSBpdHMgZmlyc3QgcG9zdGluZywgYW5kCi8vIGl0IGlzIGEgTElWRSBmaWd1cmUg4oCUIGl0IG1vdmVzIHdpdGggZXZlcnkgcG9zdGluZy4gSXQgaXMgbm90IGEgcHVibGlzaGVkCi8vIHN0YXRlbWVudCBhbmQgbXVzdCBub3QgYmUgcXVvdGVkIGFzIG9uZS4KZnVuYyBMaXZlQ2FzaChvd25lciBhZGRyZXNzKSBpbnQ2NCB7CglyZXR1cm4gbGl2ZUNhc2gob3duZXIsIG11c3RQb2xpY3kob3duZXIpLmNhc2gpCn0KCi8vIFJlc2NhbiByZS1sb2NhdGVzIGEgcHVibGlzaGVkIHN0YXRlbWVudCdzIHdpbmRvdyBpbiB0aGUgbGVkZ2VyIE5PVyBhbmQKLy8gcmVwb3J0cyB3aGV0aGVyIHRoZSBlbnRyeSBjb3VudCBhbmQgdGhlIG5ldCBjaGFuZ2Ugc3RpbGwgYWdyZWUgd2l0aCB3aGF0IHdhcwovLyBmcm96ZW4uCi8vCi8vICMgV2h5IHRoaXMgZXhpc3RzIGFuZCB0aGUgcmUtZGVyaXZhdGlvbiBhY2Nlc3NvciBkb2VzIG5vdAovLwovLyBUaGUgcGFja2FnZSBkb2Mgc2F5cyB0aGVyZSBpcyBubyBgVmVyaWZ5YCBoZXJlLCBiZWNhdXNlIHJlLWRlcml2aW5nIGEKLy8gc3RhdGVtZW50IG92ZXIgYSB3aW5kb3cgdGhhdCBoYXMgY2xvc2VkIGlzIGEgQ09OU1RBTlQgVFJVRTogZW50cmllcyBhcmUKLy8gZGF0ZWQgYXQgdGhlIGNoYWluIGhlaWdodCBhbmQgdGhlIGpvdXJuYWwgaXMgYXBwZW5kLW9ubHksIHNvIG5vdGhpbmcgY2FuCi8vIGxhdGVyIGZhbGwgaW50byBhIGNsb3NlZCB3aW5kb3cuCi8vCi8vIFRoaXMgaXMgdGhlIHBhcnQgb2YgdGhhdCBjb21wYXJpc29uIHdoaWNoIGlzIE5PVCBjb25zdGFudC4gV2luZG93IHNlbGVjdGlvbgovLyBpcyBhIGJpbmFyeSBzZWFyY2ggcmVzdGluZyBvbiBhIHByZW1pc2Ugb3duZWQgYnkgW3IvYm9va3NdIOKAlCB0aGF0IGVudHJ5Ci8vIGRhdGVzIGFyZSBub24tZGVjcmVhc2luZyBpbiBlbnRyeSBJRCDigJQgYW5kIG5vdGhpbmcgZnJlZXplcyB0aGF0IHByZW1pc2UuCi8vIEEgZnV0dXJlIGNoYW5nZSB0aGVyZSBjb3VsZCBicmVhayBpdCBzaWxlbnRseS4gUmUtbG9jYXRpbmcgdGhlIHJhbmdlIGFuZAovLyBjb21wYXJpbmcgaXMgdGhlcmVmb3JlIGEgcmVhbCB0ZXN0IG9mIHRoZSBzZWxlY3Rpb24sIGFuZCBpdCBpcyB0aGUgb25seQovLyBjaGVjayBoZXJlIHdob3NlIGFuc3dlciBjYW4gY2hhbmdlIGZvciBhIHJlYXNvbiB0aGF0IG1hdHRlcnMuCi8vCi8vICMgV2hhdCBpdCBjb3N0cyBhbmQgd2hhdCBpdCBkb2VzIG5vdCBjb3ZlcgovLwovLyBJdCBpcyBhIHBsYWluIHJlYWQsIHNvIHRoZSBjYWxsZXIgcGF5cy4gSXQgcmUtcmVhZHMgdGhlIHdpbmRvdydzIGVudHJpZXMsCi8vIHdoaWNoIGlzIHVwIHRvIDIqW01heFdpbmRvd0VudHJpZXNdIGNyb3NzLXJlYWxtIHJlYWRzIHBsdXMgdGhlIHNlYXJjaC4KLy8KLy8gSXQgY29tcGFyZXMgdGhlIGVudHJ5IENPVU5UIGFuZCB0aGUgTkVUIENIQU5HRSwgbm90IGV2ZXJ5IGxpbmUuIFRoZSBuZXQKLy8gY2hhbmdlIGlzIHRoZSBmaWd1cmUgdGhhdCBtb3ZlcyBpZiB0aGUgZW50cnkgc2V0IGNoYW5nZWQsIGFuZCBpdCBpcyBkZXJpdmVkCi8vIGZyb20gdGhlIHBvc3RpbmdzIHJhdGhlciB0aGFuIGZyb20gdGhlIHBvbGljeSwgc28gYSBkaXNhZ3JlZW1lbnQgcG9pbnRzIGF0Ci8vIHRoZSBsZWRnZXIgb3IgdGhlIHNlbGVjdGlvbiByYXRoZXIgdGhhbiBhdCBhIHJlY2xhc3NpZmljYXRpb24uIEEgZmFsc2UKLy8gcmV0dXJuIG1lYW5zIGRvIG5vdCB0cnVzdCB0aGUgc3RhdGVtZW50IGFuZCBkb2VzIG5vdCBzYXkgd2hpY2ggb2YgdGhlIHR3bwovLyBpdCBpcy4KZnVuYyBSZXNjYW4ob3duZXIgYWRkcmVzcywgc2VxIGludDY0KSAoZW50cmllcyBpbnQsIG5ldENoYW5nZSBpbnQ2NCwgYWdyZWVzIGJvb2wpIHsKCXIgOj0gbXVzdFJlY29yZChvd25lciwgc2VxKQoJZXMsIF8sIF8sIF8gOj0gc2Nhbihvd25lciwgci5yZXAuV2luZG93KQoJcmVwLCBlcnIgOj0gY2YuRGVyaXZlKGNoYXJ0T2Yob3duZXIpLCBlcywgci5yZXAuV2luZG93LCBjZi5Qb2xpY3l7CgkJQ2FzaDogIGNvcHlDb2RlcyhyLnBvbC5jYXNoKSwKCQlSdWxlczogY29weVJ1bGVzKHIucG9sLnJ1bGVzKSwKCX0sIHIucmVwLk9wZW5pbmcpCglpZiBlcnIgIT0gbmlsIHsKCQlwYW5pYygiY2FzaGZsb3c6ICIgKyBlcnIuRXJyb3IoKSkKCX0KCXJldHVybiByZXAuRW50cmllcywgcmVwLk5ldENoYW5nZSwKCQlyZXAuRW50cmllcyA9PSByLnJlcC5FbnRyaWVzICYmIHJlcC5OZXRDaGFuZ2UgPT0gci5yZXAuTmV0Q2hhbmdlCn0KCi8vIEhlaWdodCBpcyB0aGUgY3VycmVudCBibG9jayBoZWlnaHQsIHNvIGEgcmVhZGVyIGNhbiB0ZWxsIGhvdyBvbGQgYQovLyBzdGF0ZW1lbnQgaXMgd2l0aG91dCBhIHNlY29uZCBxdWVyeS4KZnVuYyBIZWlnaHQoKSBpbnQ2NCB7IHJldHVybiBydW50aW1lLkNoYWluSGVpZ2h0KCkgfQoKLy8gTGVkZ2VyIGlzIHRoZSByZWFsbSBldmVyeSBlbnRyeSBoZXJlIGlzIHJlYWQgZnJvbS4KZnVuYyBMZWRnZXIoKSBzdHJpbmcgeyByZXR1cm4gQm9va3NQYXRoIH0KCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBJbnRlcm5hbHMKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgovLyBwdWJLZXkgaXMgb3duZXJ8cGFkZGVkU2VxLiBUaGUgc2VxdWVuY2UgaXMgbGVmdC1wYWRkZWQgdG8gMTkgZGlnaXRzIOKAlCB0aGUKLy8gd2lkdGggb2YgTWF4SW50NjQg4oCUIHNvIGxleGljb2dyYXBoaWMgb3JkZXIgb3ZlciBhbiBvd25lcidzIHByZWZpeCBpcyBudW1lcmljCi8vIG9yZGVyIG92ZXIgdGhlaXIgc3RhdGVtZW50cy4gQW4gdW5wYWRkZWQgZGVjaW1hbCB3b3VsZCBzb3J0ICIxMCIgYmVmb3JlICI5Ii4KLy8gVGhlIGNvbnZlbnRpb24gaXMgci9pbnZvaWNlcycgaW52S2V5LCBhZG9wdGVkIHJhdGhlciB0aGFuIHJlLWRlcml2ZWQuCmZ1bmMgcHViS2V5KG93bmVyIHN0cmluZywgc2VxIGludDY0KSBzdHJpbmcgewoJcyA6PSBzdHJjb252LkZvcm1hdEludChzZXEsIDEwKQoJZm9yIGxlbihzKSA8IDE5IHsKCQlzID0gIjAiICsgcwoJfQoJcmV0dXJuIG93bmVyICsgInwiICsgcwp9CgovLyBvd25lckNvdW50IHJlYWRzIGEgcHVibGlzaGVyJ3MgY291bnQsIHRyZWF0aW5nIGFuIGFic2VudCBrZXkgYXMgemVyby4KLy8KLy8gYXZsLlRyZWUuR2V0IHJldHVybnMgT05FIHZhbHVlIGFuZCBjYW5ub3QgZGlzdGluZ3Vpc2ggYW4gYWJzZW50IGtleSBmcm9tIGEKLy8gbmlsLXZhbHVlZCBvbmUsIHNvIHRoZSB0d28tdmFsdWUgdHlwZSBhc3NlcnRpb24gY2FycmllcyB0aGUgZXhpc3RlbmNlIGFuc3dlcgovLyBpbiBvbmUgdHJhdmVyc2FsLiBPbmx5IHRoaXMgZmlsZSBldmVyIFNldHMsIGFuZCBpdCBvbmx5IGV2ZXIgU2V0cyBhbiBpbnQuCmZ1bmMgb3duZXJDb3VudChvd25lciBzdHJpbmcpIGludCB7CgluLCBvayA6PSBjb3VudHMuR2V0KG93bmVyKS4oaW50KQoJaWYgIW9rIHsKCQlyZXR1cm4gMAoJfQoJcmV0dXJuIG4KfQoKZnVuYyBtdXN0UmVjb3JkKG93bmVyIGFkZHJlc3MsIHNlcSBpbnQ2NCkgKnJlY29yZCB7CglyLCBvayA6PSBwdWJsaXNoZWQuR2V0KHB1YktleShvd25lci5TdHJpbmcoKSwgc2VxKSkuKCpyZWNvcmQpCglpZiAhb2sgewoJCXBhbmljKCJjYXNoZmxvdzogbm8gc3RhdGVtZW50ICIgKyBzdHJjb252LkZvcm1hdEludChzZXEsIDEwKSArCgkJCSIgZm9yICIgKyBvd25lci5TdHJpbmcoKSkKCX0KCXJldHVybiByCn0KCmZ1bmMgbXVzdFBvbGljeShvd25lciBhZGRyZXNzKSAqcG9saWN5IHsKCXAsIG9rIDo9IHBvbGljaWVzLkdldChvd25lci5TdHJpbmcoKSkuKCpwb2xpY3kpCglpZiAhb2sgewoJCXBhbmljKCJjYXNoZmxvdzogIiArIG93bmVyLlN0cmluZygpICsgIiBoYXMgZGVjbGFyZWQgbm8gcG9saWN5OyBjYWxsICIgKwoJCQkiRGVjbGFyZVBvbGljeSBmaXJzdC4gV2hpY2ggY29kZXMgaG9sZCBjYXNoIGNhbm5vdCBiZSBndWVzc2VkIGFuZCAiICsKCQkJImEgZ3Vlc3Mgd291bGQgYmUgYSBmaWd1cmUgbm9ib2R5IHF1ZXN0aW9ucyIpCgl9CglyZXR1cm4gcAp9CgpmdW5jIGNvcHlDb2RlcyhpbiBbXXN0cmluZykgW11zdHJpbmcgewoJb3V0IDo9IG1ha2UoW11zdHJpbmcsIGxlbihpbikpCgljb3B5KG91dCwgaW4pCglyZXR1cm4gb3V0Cn0KCmZ1bmMgY29weVJ1bGVzKGluIFtdY2YuQ2xhc3NpZmljYXRpb24pIFtdY2YuQ2xhc3NpZmljYXRpb24gewoJb3V0IDo9IG1ha2UoW11jZi5DbGFzc2lmaWNhdGlvbiwgbGVuKGluKSkKCWNvcHkob3V0LCBpbikKCXJldHVybiBvdXQKfQoKZnVuYyBlbmNvZGVDYXNoKGNhc2ggW11zdHJpbmcpIHN0cmluZyB7IHJldHVybiBzdHJpbmdzLkpvaW4oY2FzaCwgIiwiKSB9CgpmdW5jIGVuY29kZVJ1bGVzKHJ1bGVzIFtdY2YuQ2xhc3NpZmljYXRpb24pIHN0cmluZyB7CglwYXJ0cyA6PSBtYWtlKFtdc3RyaW5nLCAwLCBsZW4ocnVsZXMpKQoJZm9yIF8sIHIgOj0gcmFuZ2UgcnVsZXMgewoJCXBhcnRzID0gYXBwZW5kKHBhcnRzLCByLkNvZGUrIjoiK3IuQ2F0ZWdvcnkuU3RyaW5nKCkpCgl9CglyZXR1cm4gc3RyaW5ncy5Kb2luKHBhcnRzLCAiLCIpCn0KCi8vIGNoZWNrZWRBZGQgaXMgaW50NjQgYWRkaXRpb24gdGhhdCByZXBvcnRzIG92ZXJmbG93IGluc3RlYWQgb2Ygd3JhcHBpbmcuCi8vIExvY2FsIGJlY2F1c2UgYSAvcC8gaW1wb3J0IGZvciBvbmUgZnVuY3Rpb24gd291bGQgYmUgYSBkZXBlbmRlbmN5IHRoaXMKLy8gcmVhbG0ncyBjbG9zdXJlIGRvZXMgbm90IG5lZWQsIGFuZCB0aGUgc2FtZSBmb3VyIGxpbmVzIGFwcGVhciBpbiBwL2pvdXJuYWwsCi8vIHAvcGVyaW9kcyBhbmQgcC9jYXNoZmxvdy4KZnVuYyBjaGVja2VkQWRkKGEsIGIgaW50NjQpIChpbnQ2NCwgYm9vbCkgewoJcyA6PSBhICsgYgoJaWYgKGEgPiAwICYmIGIgPiAwICYmIHMgPCAwKSB8fCAoYSA8IDAgJiYgYiA8IDAgJiYgcyA+PSAwKSB7CgkJcmV0dXJuIDAsIGZhbHNlCgl9CglyZXR1cm4gcywgdHJ1ZQp9CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gUmVuZGVyCi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLy8gUmVuZGVyIHNlcnZlcyB0aGUgaW5kZXggYXQgIiIsIGEgcHVibGlzaGVyJ3MgcGFnZSBhdCAiPGFkZHJlc3M+IiwgYW5kIG9uZQovLyBzdGF0ZW1lbnQgYXQgIjxhZGRyZXNzPi88c2VxPiIuCi8vCi8vIEV2ZXJ5IGNhbGxlci1zdXBwbGllZCBzdHJpbmcgcmVhY2hpbmcgdGhpcyBwYWdlIOKAlCBhbiBhY2NvdW50IGNvZGUsIGFuIGVudHJ5Ci8vIG1lbW8g4oCUIGlzIGFuIG93bmVyJ3MgZnJlZSB0ZXh0IGluIFtyL2Jvb2tzXSBhbmQgYXJyaXZlcyB1bnNhbml0aXplZCwgYmVjYXVzZQovLyB0aGF0IHJlYWxtIGRvZXMgbm90IHNhbml0aXplIHdoYXQgaXQgc3RvcmVzLiBGcmVlIHRleHQgcmVhY2hpbmcgYSBwYWdlCi8vIHVuZXNjYXBlZCBpcyB0aGUgb25lIGluamVjdGlvbi1zaGFwZWQgc3VyZmFjZSBhIHJlYWxtIHdpdGggbm8gY3VzdG9keSBzdGlsbAovLyBoYXMsIGFuZCB0aGUgYnl0ZXMgY29taW5nIGZyb20gYSBUSElSRCByZWFsbSdzIHN0YXRlIGRvZXMgbm90IG1ha2UgdGhlbQovLyBzYWZlci4gRXZlcnl0aGluZyBnb2VzIHRocm91Z2ggW2NlbGxdLgpmdW5jIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXAgOj0gc3RyaW5ncy5UcmltU3BhY2Uoc3RyaW5ncy5UcmltKHBhdGgsICIvIikpCglpZiBwID09ICIiIHsKCQlyZXR1cm4gcmVuZGVySW5kZXgoKQoJfQoJaWYgaSA6PSBzdHJpbmdzLkluZGV4KHAsICIvIik7IGkgPj0gMCB7CgkJb3duZXIgOj0gYWRkcmVzcyhwWzppXSkKCQlzZXEsIGVyciA6PSBzdHJjb252LlBhcnNlSW50KHBbaSsxOl0sIDEwLCA2NCkKCQlpZiBlcnIgIT0gbmlsIHsKCQkJcmV0dXJuICIjIE5vdCBmb3VuZFxuXG5FeHBlY3RlZCBgPGFkZHJlc3M+LzxzZXF1ZW5jZT5gLlxuIgoJCX0KCQlyZXR1cm4gcmVuZGVyU3RhdGVtZW50KG93bmVyLCBzZXEpCgl9CglyZXR1cm4gcmVuZGVyUHVibGlzaGVyKGFkZHJlc3MocCkpCn0KCmZ1bmMgcmVuZGVySW5kZXgoKSBzdHJpbmcgewoJdmFyIHNiIHN0cmluZ3MuQnVpbGRlcgoJc2IuV3JpdGVTdHJpbmcoIiMgU3RhdGVtZW50cyBvZiBjYXNoIGZsb3dzXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiRGlyZWN0LW1ldGhvZCBjYXNoLWZsb3cgc3RhdGVtZW50cyBkZXJpdmVkIGZyb20gYm9va3MgaW4gYCIpCglzYi5Xcml0ZVN0cmluZyhCb29rc1BhdGgpCglzYi5Xcml0ZVN0cmluZygiYC5cblxuIikKCXNiLldyaXRlU3RyaW5nKCJBIHN0YXRlbWVudCBoZXJlIGlzICoqYSBjbGFpbSBhYm91dCBhIGNsYWltKiouIFRoZSBlbnRyaWVzIGFyZSByZWFkICIpCglzYi5Xcml0ZVN0cmluZygiZnJvbSB0aGUgbGVkZ2VyIHJhdGhlciB0aGFuIHN1cHBsaWVkLCBhbmQgdGhlIGFyaXRobWV0aWMgaXMgIikKCXNiLldyaXRlU3RyaW5nKCJgcC9jYXNoZmxvd2AncyDigJQgYnV0IHdoaWNoIGFjY291bnRzIGhvbGQgKmNhc2gqIGlzIGRlY2xhcmVkIGJ5IHRoZSAiKQoJc2IuV3JpdGVTdHJpbmcoImJvb2sncyBvd24gb3duZXIsIGFuZCBub3RoaW5nIG9uIGNoYWluIGNhbiBjaGVjayB0aGF0IGRlY2xhcmF0aW9uLiAiKQoJc2IuV3JpdGVTdHJpbmcoIlRoZSBvcGVuaW5nIHBvc2l0aW9uIGlzIGRlY2xhcmVkIHRvbzsgYSBzdGF0ZW1lbnQgc2F5cyB3aGV0aGVyIHRoaXMgIikKCXNiLldyaXRlU3RyaW5nKCJyZWFsbSB3YXMgYWJsZSB0byByZWNvbmNpbGUgaXQuXG5cbiIpCglzYi5Xcml0ZVN0cmluZygiLSBTdGF0ZW1lbnRzIHB1Ymxpc2hlZDogKioiKQoJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKHB1YkNvdW50KSkKCXNiLldyaXRlU3RyaW5nKCIqKlxuLSBXaW5kb3cgZW50cnkgbGltaXQ6ICoqIikKCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShNYXhXaW5kb3dFbnRyaWVzKSkKCXNiLldyaXRlU3RyaW5nKCIqKiBlbnRyaWVzIOKAlCBhIHdpZGVyIHdpbmRvdyBpcyByZWZ1c2VkLCBuZXZlciB0cnVuY2F0ZWRcbi0gSGVpZ2h0OiAqKiIpCglzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChydW50aW1lLkNoYWluSGVpZ2h0KCksIDEwKSkKCXNiLldyaXRlU3RyaW5nKCIqKlxuXG4iKQoJc2IuV3JpdGVTdHJpbmcoIlRoZXJlIGlzIG5vIHdheSB0byBlbnVtZXJhdGUgcHVibGlzaGVycyBoZXJlOiBhIGNhc2gtZmxvdyBzdGF0ZW1lbnQgIikKCXNiLldyaXRlU3RyaW5nKCJpcyBvbmUgb3duZXIncywgYW5kIGFuIGluZGV4IG9mIHRoZW0gd291bGQgYmUgYSBsaXN0IHRoaXMgcmVhbG0gaGFzICIpCglzYi5Xcml0ZVN0cmluZygibm8gc3RhbmRpbmcgdG8gcHVibGlzaC4gVmlldyBvbmUgYXQgYCIpCglzYi5Xcml0ZVN0cmluZyhSZWFsbVBhdGgpCglzYi5Xcml0ZVN0cmluZygiOjxhZGRyZXNzPmAuXG4iKQoJcmV0dXJuIHNiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVyUHVibGlzaGVyKG93bmVyIGFkZHJlc3MpIHN0cmluZyB7CgluIDo9IG93bmVyQ291bnQob3duZXIuU3RyaW5nKCkpCglpZiBuID09IDAgewoJCXJldHVybiAiIyBObyBzdGF0ZW1lbnRzXG5cbmAiICsgY2VsbChvd25lci5TdHJpbmcoKSkgKwoJCQkiYCBoYXMgcHVibGlzaGVkIG5vbmUuXG4iCgl9Cgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCglzYi5Xcml0ZVN0cmluZygiIyBTdGF0ZW1lbnRzIG9mIGNhc2ggZmxvd3NcblxuKipQdWJsaXNoZXI6KiogYCIpCglzYi5Xcml0ZVN0cmluZyhjZWxsKG93bmVyLlN0cmluZygpKSkKCXNiLldyaXRlU3RyaW5nKCJgXG5cbioqUHVibGlzaGVkOioqICIpCglzYi5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EobikpCglzYi5Xcml0ZVN0cmluZygiXG5cbiIpCgoJc2hvd24gOj0gbgoJaWYgc2hvd24gPiBSZW5kZXJQdWJsaWNhdGlvbkxpbWl0IHsKCQlzaG93biA9IFJlbmRlclB1YmxpY2F0aW9uTGltaXQKCX0KCXNiLldyaXRlU3RyaW5nKCJ8IHNlcSB8IHdpbmRvdyB8IG5ldCBjaGFuZ2UgfCBjbG9zaW5nIHwgZW50cmllcyB8IHVucmVzb2x2ZWQgfCBvcGVuaW5nIHJlY29uY2lsZWQgfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8LS0tfC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfFxuIikKCWZvciBzZXEgOj0gaW50NjQobik7IHNlcSA+IGludDY0KG4tc2hvd24pOyBzZXEtLSB7CgkJciA6PSBtdXN0UmVjb3JkKG93bmVyLCBzZXEpCgkJc2IuV3JpdGVTdHJpbmcoInwgWyIpCgkJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQoc2VxLCAxMCkpCgkJc2IuV3JpdGVTdHJpbmcoIl0oIikKCQlzYi5Xcml0ZVN0cmluZyhSZWFsbVBhdGgpCgkJc2IuV3JpdGVTdHJpbmcoIjoiKQoJCXNiLldyaXRlU3RyaW5nKG93bmVyLlN0cmluZygpKQoJCXNiLldyaXRlU3RyaW5nKCIvIikKCQlzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChzZXEsIDEwKSkKCQlzYi5Xcml0ZVN0cmluZygiKSB8IFsiKQoJCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHIucmVwLldpbmRvdy5Gcm9tLCAxMCkpCgkJc2IuV3JpdGVTdHJpbmcoIiwgIikKCQlzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChyLnJlcC5XaW5kb3cuVW50aWwsIDEwKSkKCQlzYi5Xcml0ZVN0cmluZygiKSB8ICIpCgkJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQoci5yZXAuTmV0Q2hhbmdlLCAxMCkpCgkJc2IuV3JpdGVTdHJpbmcoIiB8ICIpCgkJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQoci5yZXAuQ2xvc2luZywgMTApKQoJCXNiLldyaXRlU3RyaW5nKCIgfCAiKQoJCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShyLnJlcC5FbnRyaWVzKSkKCQlzYi5Xcml0ZVN0cmluZygiIHwgIikKCQlzYi5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EobGVuKHIucmVwLlVucmVzb2x2ZWQpKSkKCQlzYi5Xcml0ZVN0cmluZygiIHwgIikKCQlzYi5Xcml0ZVN0cmluZyh5ZXNObyhyLnJlY29uY2lsZWQpKQoJCXNiLldyaXRlU3RyaW5nKCIgfFxuIikKCX0KCWlmIG4gPiBzaG93biB7CgkJc2IuV3JpdGVTdHJpbmcoIlxuX1Nob3dpbmcgdGhlIG5ld2VzdCAiKQoJCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShzaG93bikpCgkJc2IuV3JpdGVTdHJpbmcoIiBvZiAiKQoJCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShuKSkKCQlzYi5Xcml0ZVN0cmluZygiLl9cbiIpCgl9CglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKZnVuYyByZW5kZXJTdGF0ZW1lbnQob3duZXIgYWRkcmVzcywgc2VxIGludDY0KSBzdHJpbmcgewoJaWYgIXB1Ymxpc2hlZC5IYXMocHViS2V5KG93bmVyLlN0cmluZygpLCBzZXEpKSB7CgkJcmV0dXJuICIjIE5vdCBmb3VuZFxuXG5ObyBzdGF0ZW1lbnQgIiArIHN0cmNvbnYuRm9ybWF0SW50KHNlcSwgMTApICsKCQkJIiBmb3IgYCIgKyBjZWxsKG93bmVyLlN0cmluZygpKSArICJgLlxuIgoJfQoJciA6PSBtdXN0UmVjb3JkKG93bmVyLCBzZXEpCgl2YXIgc2Igc3RyaW5ncy5CdWlsZGVyCgoJc2IuV3JpdGVTdHJpbmcoIiMgU3RhdGVtZW50IG9mIGNhc2ggZmxvd3MgIyIpCglzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChzZXEsIDEwKSkKCXNiLldyaXRlU3RyaW5nKCJcblxuKipQdWJsaXNoZXI6KiogYCIpCglzYi5Xcml0ZVN0cmluZyhjZWxsKG93bmVyLlN0cmluZygpKSkKCXNiLldyaXRlU3RyaW5nKCJgXG5cbioqV2luZG93OioqIFsiKQoJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQoci5yZXAuV2luZG93LkZyb20sIDEwKSkKCXNiLldyaXRlU3RyaW5nKCIsICIpCglzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChyLnJlcC5XaW5kb3cuVW50aWwsIDEwKSkKCXNiLldyaXRlU3RyaW5nKCIpIOKAlCBoYWxmLW9wZW4sIGJ5IGJsb2NrIGhlaWdodFxuXG4qKkZyb3plbiBhdCBoZWlnaHQ6KiogIikKCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHIuYXQsIDEwKSkKCXNiLldyaXRlU3RyaW5nKCJcblxuKipMZWRnZXI6KiogYCIpCglzYi5Xcml0ZVN0cmluZyhCb29rc1BhdGgpCglzYi5Xcml0ZVN0cmluZygiYFxuXG4iKQoKCXNiLldyaXRlU3RyaW5nKCIjIyBBY3Rpdml0aWVzXG5cbnwgY2F0ZWdvcnkgfCBpbmZsb3dzIHwgb3V0Zmxvd3MgfCBuZXQgfCBlbnRyaWVzIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifC0tLXwtLS18LS0tfC0tLXwtLS18XG4iKQoJZm9yIF8sIGwgOj0gcmFuZ2Ugci5yZXAuTGluZXMgewoJCXNiLldyaXRlU3RyaW5nKCJ8ICIpCgkJc2IuV3JpdGVTdHJpbmcobC5DYXRlZ29yeS5TdHJpbmcoKSkKCQlzYi5Xcml0ZVN0cmluZygiIHwgIikKCQlzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChsLkluZmxvd3MsIDEwKSkKCQlzYi5Xcml0ZVN0cmluZygiIHwgIikKCQlzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChsLk91dGZsb3dzLCAxMCkpCgkJc2IuV3JpdGVTdHJpbmcoIiB8ICIpCgkJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQobC5OZXQoKSwgMTApKQoJCXNiLldyaXRlU3RyaW5nKCIgfCAiKQoJCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShsLkVudHJpZXMpKQoJCXNiLldyaXRlU3RyaW5nKCIgfFxuIikKCX0KCglzYi5Xcml0ZVN0cmluZygiXG4jIyBSZWNvbmNpbGlhdGlvblxuXG58IHwgfFxufC0tLXwtLS18XG58IG9wZW5pbmcgKGRlY2xhcmVkKSB8ICIpCglzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChyLnJlcC5PcGVuaW5nLCAxMCkpCglzYi5Xcml0ZVN0cmluZygiIHxcbnwgbmV0IGNoYW5nZSB8ICIpCglzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChyLnJlcC5OZXRDaGFuZ2UsIDEwKSkKCXNiLldyaXRlU3RyaW5nKCIgfFxufCBvZiB3aGljaCB1bmF0dHJpYnV0ZWQgfCAiKQoJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRJbnQoci5yZXAuVW5hdHRyaWJ1dGVkLCAxMCkpCglzYi5Xcml0ZVN0cmluZygiIHxcbnwgY2xvc2luZyB8ICIpCglzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdEludChyLnJlcC5DbG9zaW5nLCAxMCkpCglzYi5Xcml0ZVN0cmluZygiIHxcblxuIikKCglpZiByLnJlY29uY2lsZWQgewoJCXNiLldyaXRlU3RyaW5nKCI+ICoqT3BlbmluZyByZWNvbmNpbGVkLioqIFRoZSB3aW5kb3cgZXh0ZW5kZWQgcGFzdCBldmVyeSBlbnRyeSAiKQoJCXNiLldyaXRlU3RyaW5nKCJpbiB0aGUgYm9vaywgc28gdGhlIGRlY2xhcmVkIGNhc2ggYWNjb3VudHMnIGJhbGFuY2Ugb2YgKioiKQoJCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHIuY2FzaCwgMTApKQoJCXNiLldyaXRlU3RyaW5nKCIqKiBpcyB0aGUgd2hvbGUgYm9vaydzIGNhc2ggbW92ZW1lbnQsIGFuZCBpdCBlcXVhbHMgdGhlIGNsb3NpbmcgIikKCQlzYi5Xcml0ZVN0cmluZygiZmlndXJlIGFib3ZlLiBUaGF0IGFsc28gbWVhbnMgdGhlIGVudHJ5IHNjYW4gd2FzIGNvbXBsZXRlLiBJdCAiKQoJCXNiLldyaXRlU3RyaW5nKCJzYXlzIG5vdGhpbmcgYWJvdXQgd2hldGhlciB0aG9zZSBhY2NvdW50cyBob2xkIGNhc2guXG5cbiIpCgl9IGVsc2UgewoJCXNiLldyaXRlU3RyaW5nKCI+ICoqT3BlbmluZyBOT1QgcmVjb25jaWxlZC4qKiBUaGUgd2luZG93IGNsb3NlZCBiZWZvcmUgbGF0ZXIgIikKCQlzYi5Xcml0ZVN0cmluZygiZW50cmllcyB3ZXJlIHBvc3RlZCwgc28gdGhlIGNhc2ggYWNjb3VudHMnIGN1cnJlbnQgYmFsYW5jZXMgIikKCQlzYi5Xcml0ZVN0cmluZygiY2FycnkgbW92ZW1lbnQgdGhpcyBzdGF0ZW1lbnQgcmlnaHRseSBleGNsdWRlcyBhbmQgY2Fubm90IGJlICIpCgkJc2IuV3JpdGVTdHJpbmcoImNvbXBhcmVkIHRvIGl0LiBUaGUgb3BlbmluZyBwb3NpdGlvbiBhYm92ZSBpcyB0aGUgcHVibGlzaGVyJ3MgIikKCQlzYi5Xcml0ZVN0cmluZygiZGVjbGFyYXRpb24gYW5kIHRoaXMgcmVhbG0gZGlkIG5vdCBjaGVjayBpdC5cblxuIikKCX0KCglzYi5Xcml0ZVN0cmluZygiIyMgU2NvcGVcblxuIikKCWlmIHIuaGkgPCByLmxvIHsKCQlzYi5Xcml0ZVN0cmluZygiLSBFbnRyaWVzIHJlYWQ6ICoqbm9uZSoqIOKAlCB0aGUgd2luZG93IGhvbGRzIG5vIGVudHJpZXNcbiIpCgl9IGVsc2UgewoJCXNiLldyaXRlU3RyaW5nKCItIEVudHJpZXMgcmVhZDogKioiKQoJCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0VWludChyLmhpLXIubG8rMSwgMTApKQoJCXNiLldyaXRlU3RyaW5nKCIqKiwgbGVkZ2VyIElEcyAiKQoJCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0VWludChyLmxvLCAxMCkpCgkJc2IuV3JpdGVTdHJpbmcoIuKAkyIpCgkJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5Gb3JtYXRVaW50KHIuaGksIDEwKSkKCQlzYi5Xcml0ZVN0cmluZygiIChyZWFkIHRoZW0gaW4gYCIpCgkJc2IuV3JpdGVTdHJpbmcoQm9va3NQYXRoKQoJCXNiLldyaXRlU3RyaW5nKCJgIHRvIGNoZWNrIHRoaXMgc3RhdGVtZW50IGFnYWluc3QgaXRzIHNvdXJjZSlcbiIpCgl9CglzYi5Xcml0ZVN0cmluZygiLSBJbi13aW5kb3cgZW50cmllczogKioiKQoJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKHIucmVwLkVudHJpZXMpKQoJc2IuV3JpdGVTdHJpbmcoIioqLCBvZiB3aGljaCAqKiIpCglzYi5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2Eoci5yZXAuQ2FzaEVudHJpZXMpKQoJc2IuV3JpdGVTdHJpbmcoIioqIHRvdWNoZWQgYSBkZWNsYXJlZCBjYXNoIGFjY291bnRcbi0gV2luZG93IGVudHJ5IGxpbWl0OiAqKiIpCglzYi5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2EoTWF4V2luZG93RW50cmllcykpCglzYi5Xcml0ZVN0cmluZygiKipcbi0gU3BsaXQgY29tcGxldGU6ICoqIikKCXNiLldyaXRlU3RyaW5nKHllc05vKHIucmVwLkNvbXBsZXRlKCkpKQoJc2IuV3JpdGVTdHJpbmcoIioqXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcoIiMjIFBvbGljeSBhcyBwdWJsaXNoZWRcblxuLSBDYXNoIGFjY291bnRzOiBgIikKCXNiLldyaXRlU3RyaW5nKGNlbGwoZW5jb2RlQ2FzaChyLnBvbC5jYXNoKSkpCglzYi5Xcml0ZVN0cmluZygiYFxuLSBSdWxlczogYCIpCglydWxlcyA6PSBlbmNvZGVSdWxlcyhyLnBvbC5ydWxlcykKCWlmIHJ1bGVzID09ICIiIHsKCQlydWxlcyA9ICIobm9uZSBkZWNsYXJlZCkiCgl9CglzYi5Xcml0ZVN0cmluZyhjZWxsKHJ1bGVzKSkKCXNiLldyaXRlU3RyaW5nKCJgXG4tIERlY2xhcmVkIGF0IGhlaWdodDogIikKCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHIucG9sLmF0LCAxMCkpCglzYi5Xcml0ZVN0cmluZygiXG5cblRoaXMgaXMgdGhlIHBvbGljeSB0aGF0IHByb2R1Y2VkIHRoZSBmaWd1cmVzIGFib3ZlLCBmcm96ZW4gd2l0aCAiKQoJc2IuV3JpdGVTdHJpbmcoInRoZW0uIFRoZSBvd25lcidzIGN1cnJlbnQgcG9saWN5IG1heSBkaWZmZXIuIEEgY29kZSBhYnNlbnQgZnJvbSB0aGUgIikKCXNiLldyaXRlU3RyaW5nKCJydWxlcyBpcyBub3QgZGVmYXVsdGVkIOKAlCBhbiBlbnRyeSB0b3VjaGluZyBpdCBpcyBsaXN0ZWQgYmVsb3cuXG5cbiIpCgoJc2IuV3JpdGVTdHJpbmcocmVuZGVyQ2Vuc3VzKHIpKQoJcmV0dXJuIHNiLlN0cmluZygpCn0KCmZ1bmMgcmVuZGVyQ2Vuc3VzKHIgKnJlY29yZCkgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCglzYi5Xcml0ZVN0cmluZygiIyMgVW5yZXNvbHZlZFxuXG4iKQoJaWYgbGVuKHIucmVwLlVucmVzb2x2ZWQpID09IDAgewoJCXNiLldyaXRlU3RyaW5nKCJOb25lLiBFdmVyeSBpbi13aW5kb3cgZW50cnkgdGhhdCBtb3ZlZCBjYXNoIHdhcyBhdHRyaWJ1dGVkLlxuXG4iKQoJfSBlbHNlIHsKCQlzYi5Xcml0ZVN0cmluZygiVGhlc2UgZW50cmllcyBtb3ZlZCBjYXNoIHRoYXQgdGhlIHBvbGljeSBjb3VsZCBub3QgYXR0cmlidXRlLiAiKQoJCXNiLldyaXRlU3RyaW5nKCJUaGVpciBuZXQgbW92ZW1lbnQgaXMgaW4gKip1bmF0dHJpYnV0ZWQqKiBhYm92ZSwgc28gdGhlICIpCgkJc2IuV3JpdGVTdHJpbmcoImFyaXRobWV0aWMgaXMgd2hvbGUgYW5kIHRoZSAqc3BsaXQqIGlzIG5vdC5cblxuIikKCQlzYi5Xcml0ZVN0cmluZygifCBlbnRyeSB8IHJlYXNvbiB8IG5ldCB8IGRldGFpbCB8XG58LS0tfC0tLXwtLS18LS0tfFxuIikKCQlzaG93biA6PSBsZW4oci5yZXAuVW5yZXNvbHZlZCkKCQlpZiBzaG93biA+IFJlbmRlckNlbnN1c0xpbWl0IHsKCQkJc2hvd24gPSBSZW5kZXJDZW5zdXNMaW1pdAoJCX0KCQlmb3IgaSA6PSAwOyBpIDwgc2hvd247IGkrKyB7CgkJCXUgOj0gci5yZXAuVW5yZXNvbHZlZFtpXQoJCQlzYi5Xcml0ZVN0cmluZygifCAiKQoJCQlzYi5Xcml0ZVN0cmluZyhzdHJjb252LkZvcm1hdFVpbnQodS5FbnRyeUlELCAxMCkpCgkJCXNiLldyaXRlU3RyaW5nKCIgfCAiKQoJCQlzYi5Xcml0ZVN0cmluZyh1LlJlYXNvbi5TdHJpbmcoKSkKCQkJc2IuV3JpdGVTdHJpbmcoIiB8ICIpCgkJCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuRm9ybWF0SW50KHUuTmV0LCAxMCkpCgkJCXNiLldyaXRlU3RyaW5nKCIgfCAiKQoJCQlzYi5Xcml0ZVN0cmluZyhjZWxsKGNlbnN1c0RldGFpbCh1KSkpCgkJCXNiLldyaXRlU3RyaW5nKCIgfFxuIikKCQl9CgkJaWYgbGVuKHIucmVwLlVucmVzb2x2ZWQpID4gc2hvd24gewoJCQlzYi5Xcml0ZVN0cmluZygiXG5fU2hvd2luZyAiKQoJCQlzYi5Xcml0ZVN0cmluZyhzdHJjb252Lkl0b2Eoc2hvd24pKQoJCQlzYi5Xcml0ZVN0cmluZygiIG9mICIpCgkJCXNiLldyaXRlU3RyaW5nKHN0cmNvbnYuSXRvYShsZW4oci5yZXAuVW5yZXNvbHZlZCkpKQoJCQlzYi5Xcml0ZVN0cmluZygiLl9cbiIpCgkJfQoJCXNiLldyaXRlU3RyaW5nKCJcbiIpCgl9CgoJc2IuV3JpdGVTdHJpbmcoIiMjIE5ldC16ZXJvIGNhc2ggZW50cmllc1xuXG4iKQoJaWYgbGVuKHIucmVwLk5ldFplcm8pID09IDAgewoJCXNiLldyaXRlU3RyaW5nKCJOb25lLlxuIikKCQlyZXR1cm4gc2IuU3RyaW5nKCkKCX0KCXNiLldyaXRlU3RyaW5nKCJUaGVzZSB0b3VjaGVkIGEgZGVjbGFyZWQgY2FzaCBhY2NvdW50IGFuZCBtb3ZlZCBub25lIG9uIG5ldCDigJQgYSAiKQoJc2IuV3JpdGVTdHJpbmcoInRyYW5zZmVyIGJldHdlZW4gY2FzaCBhY2NvdW50cy4gVGhleSBhcmUgbm90IGNsYXNzaWZpZWQgYmVjYXVzZSAiKQoJc2IuV3JpdGVTdHJpbmcoInRoZXJlIGlzIG5vdGhpbmcgdG8gYXR0cmlidXRlLlxuXG4iKQoJc2hvd24gOj0gbGVuKHIucmVwLk5ldFplcm8pCglpZiBzaG93biA+IFJlbmRlckNlbnN1c0xpbWl0IHsKCQlzaG93biA9IFJlbmRlckNlbnN1c0xpbWl0Cgl9CglpZHMgOj0gbWFrZShbXXN0cmluZywgMCwgc2hvd24pCglmb3IgaSA6PSAwOyBpIDwgc2hvd247IGkrKyB7CgkJaWRzID0gYXBwZW5kKGlkcywgc3RyY29udi5Gb3JtYXRVaW50KHIucmVwLk5ldFplcm9baV0sIDEwKSkKCX0KCXNiLldyaXRlU3RyaW5nKCJFbnRyaWVzOiAiKQoJc2IuV3JpdGVTdHJpbmcoc3RyaW5ncy5Kb2luKGlkcywgIiwgIikpCglpZiBsZW4oci5yZXAuTmV0WmVybykgPiBzaG93biB7CgkJc2IuV3JpdGVTdHJpbmcoIiBfKCIpCgkJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKHNob3duKSkKCQlzYi5Xcml0ZVN0cmluZygiIG9mICIpCgkJc2IuV3JpdGVTdHJpbmcoc3RyY29udi5JdG9hKGxlbihyLnJlcC5OZXRaZXJvKSkpCgkJc2IuV3JpdGVTdHJpbmcoIilfIikKCX0KCXNiLldyaXRlU3RyaW5nKCJcbiIpCglyZXR1cm4gc2IuU3RyaW5nKCkKfQoKLy8gY2Vuc3VzRGV0YWlsIGlzIHRoZSBhY3Rpb25hYmxlIGhhbGYgb2YgYW4gdW5yZXNvbHZlZCByb3c6IHRoZSB1bmRlY2xhcmVkCi8vIGNvZGVzIGZvciBhbiB1bmRlY2xhcmVkIGVudHJ5LCB0aGUgY29uZmxpY3RpbmcgY2F0ZWdvcmllcyBmb3IgYSBjb25mbGljdC4KZnVuYyBjZW5zdXNEZXRhaWwodSBjZi5VbnJlc29sdmVkKSBzdHJpbmcgewoJaWYgbGVuKHUuQ29kZXMpID4gMCB7CgkJcmV0dXJuICJ1bmRlY2xhcmVkOiAiICsgc3RyaW5ncy5Kb2luKHUuQ29kZXMsICIsICIpCgl9CglpZiBsZW4odS5DYXRlZ29yaWVzKSA+IDAgewoJCWNhdHMgOj0gbWFrZShbXXN0cmluZywgMCwgbGVuKHUuQ2F0ZWdvcmllcykpCgkJZm9yIF8sIGMgOj0gcmFuZ2UgdS5DYXRlZ29yaWVzIHsKCQkJY2F0cyA9IGFwcGVuZChjYXRzLCBjLlN0cmluZygpKQoJCX0KCQlyZXR1cm4gImNhdGVnb3JpZXM6ICIgKyBzdHJpbmdzLkpvaW4oY2F0cywgIiwgIikKCX0KCXJldHVybiAi4oCUIgp9CgovLyBjZWxsIHRydW5jYXRlcyBhbmQgZXNjYXBlcyBhIHN0cmluZyBmb3IgYSBtYXJrZG93biB0YWJsZSBjZWxsLgovLwovLyBUaGUgdHJ1bmNhdGlvbiBpcyBmaXJzdCBhbmQgaXMgbm90IGNvc21ldGljOiBhbiBhY2NvdW50IG5hbWUgbWF5IGJlCi8vIGJvb2tzLk1heE5hbWVMZW4gYnl0ZXMgYW5kIGEgbWVtbyBib29rcy5NYXhNZW1vTGVuLCBhbmQgYSB0YWJsZSByb3cgY2FycnlpbmcKLy8gZWl0aGVyIHdob2xlIGlzIHVucmVhZGFibGUuIFRoZSBlc2NhcGUgaXMgc2FuaXRpemUuVGFibGVDZWxsLCB3aGljaCBpcyB3aGF0Ci8vIGtlZXBzIGFuIG93bmVyJ3MgZnJlZSB0ZXh0IGZyb20gYnJlYWtpbmcgb3V0IG9mIHRoZSBjZWxsLgpmdW5jIGNlbGwocyBzdHJpbmcpIHN0cmluZyB7Cgljb25zdCBtYXhSdW5lcyA9IDQ4CglpZiByIDo9IFtdcnVuZShzKTsgbGVuKHIpID4gbWF4UnVuZXMgewoJCXMgPSBzdHJpbmcocls6bWF4UnVuZXNdKSArICLigKYiCgl9CglyZXR1cm4gc2FuaXRpemUuVGFibGVDZWxsKHMpCn0KCmZ1bmMgeWVzTm8oYiBib29sKSBzdHJpbmcgewoJaWYgYiB7CgkJcmV0dXJuICJ5ZXMiCgl9CglyZXR1cm4gIm5vIgp9ChpjCgtnbm9tb2QudG9tbBJUbW9kdWxlID0gImduby5sYW5kL3IvZzF1dDZ1c3B1aDczZTAyeWF1eHBteXQ4ZzN3d2RkYXE4dXRhZ3ZtMy9jYXNoZmxvdyIKZ25vID0gIjAuOSIKIg0xMDAwMDAwMHVnbm90EhIIjOyoeRILMjU0NDI2dWdub3QaqAEKOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiECFvQxdskleM40Lpnib60p9/58Ru1wQ1b/q5MVf2K7DpgSQKXSbaqWr9+mjOQxASfjp/Cw0cwUMV2hwp9JMVd1laCwFcmuU12RvDNVYjKIiURgGkiEFX/7SBErM8PtAq9z5NMaKGcxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxbHV1eGU="
  }
}