Transaction executed successfully

Transaction Details

Inspect execution, participants, message data, gas usage, events and raw transaction data.

Transaction hash
979F5956B01030C3FA974456E6CE2BD96208083DC4580CC0FD4E9CCBDA44CE05

Transaction overview

Status
Success
Execution completed
Block
#424886
Included in block
Message Type
m_addpkg
Primary message

Execution summary

TX INDEX
0
Position in block
GAS WANTED
360,121,200
Requested gas limit
GAS USED
150,390,337
Gas consumed
FEE
1080363ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g1manfred47kzduec920z88wfr64ylksmdcedlf541000000ugnot
Message #2
m_addpkg
Caller
Arguments
g1manfred47kzduec920z88wfr64ylksmdcedlf56000000ugnot
Message #3
m_addpkg
Caller
Arguments
g1manfred47kzduec920z88wfr64ylksmdcedlf55000000ugnot

Execution log

msg:0,success:true,log:,events:[] msg:1,success:true,log:,events:[] msg:2,success:true,log:,events:[]

Events

No events emitted by this transaction.

Raw encoded transaction

CtyPBgoML3ZtLm1fYWRkcGtnEsqPBgooZzFtYW5mcmVkNDdremR1ZWM5MjB6ODh3ZnI2NHlsa3NtZGNlZGxmNRKNjwYKBWZvcmdlEhhnbm8ubGFuZC9wL21vdWwvZm9yZ2UvdjEa6T0KCVJFQURNRS5tZBLbPSMgZm9yZ2UKClRoZSBkb21haW4gZW5naW5lIG9mIGFuIG9uLWNoYWluIHNvZnR3YXJlIGZvcmdlOiByZXBvcywgcm9sZXMsIGFuIGFwcGVuZC1vbmx5CnJlZmVyZW5jZSBsb2csIGlzc3VlcywgY2hhbmdlIHJlcXVlc3RzIGFuZCByZXZpZXdzLiBQdXJlIGdubywgbm8gY2hhaW4gaW1wb3J0cywKbm8gcmVhbG0gZ2xvYmFscy4gVGhlIHJlYWxtIHRoYXQgd2lyZXMgaXQgdG8gZ25vLmxhbmQgaXMKW2Bnbm8ubGFuZC9yL21vdWwvZm9yZ2UvdjBgXSguLi8uLi8uLi8uLi9yL21vdWwvZm9yZ2UvdjApLgoKIyMgUGFja2FnZXMgYW5kIHJlbGVhc2VzOiB0aGUgYnJpZGdlIHRvIGEgZGVwbG95ZWQgcGF0aAoKQSByZXBvIGlkIGlzIGA8bmFtZXNwYWNlPi88bmFtZT5gLCBleGFjdGx5IHR3byBwYXJ0cywgc28gYHIvbW91bC9ob21lYCBjYW4gbmV2ZXIKYmUgb25lLiBXaXRob3V0IGEgbWFwcGluZyB0aGVyZSBpcyBubyB3YXkgdG8gYXNrICp3aGljaCByZXBvIHB1Ymxpc2hlcyB0aGlzCnBhY2thZ2UgcGF0aCosIHdoaWNoIGlzIHRoZSBmaXJzdCBxdWVzdGlvbiBhbnlvbmUgYXJyaXZpbmcgZnJvbSBhbiBleHBsb3JlciBoYXMuCgpgUHVibGlzaFBhY2thZ2VgIHJlY29yZHMgdGhlIGNsYWltIGFuZCBpbmRleGVzIGl0IGZvcmdlLXdpZGUsIHNvIGBQYWNrYWdlUmVwb2AKYW5zd2VycyBmcm9tIHRoZSBwYXRoIGFsb25lIHdpdGhvdXQgc2Nhbm5pbmcgZXZlcnkgcmVwby4gT25lIHJlcG8gcHVibGlzaGVzIG1hbnkKcGF0aHMgKG1vdWwvZ25vLWNvbnRyYWN0cyBwdWJsaXNoZXMgMTkzIG9mIHRoZW0pLCBhbmQgYSBwYXRoIG1heSBiZSBjbGFpbWVkIGJ5CmV4YWN0bHkgb25lIHJlcG86IHNpbGVudGx5IGxldHRpbmcgYSBzZWNvbmQgcmVwbyB0YWtlIGl0IHdvdWxkIGJlIGEgY2FwdHVyZSBvZgphbm90aGVyIHByb2plY3QncyBwYWNrYWdlIGluIGV2ZXJ5IGV4cGxvcmVyIHJlYWRpbmcgdGhpcyBpbmRleC4KCioqVGhlIGNsYWltIGlzIG5vdCB2ZXJpZmllZCwgYW5kIGNhbm5vdCBiZS4qKiBBIHJlYWxtIGNhbm5vdCBhc2sgdGhlIGNoYWluIHdobwpkZXBsb3llZCBhIHBhdGguIFdoYXQgaXMgZ3VhcmFudGVlZCBpcyB0aGF0IHNvbWVvbmUgd2l0aCB3cml0ZSBhY2Nlc3MgdG8gdGhlCnJlcG8gc2FpZCBpdCwgdW5kZXIgYSBuYW1lc3BhY2UgYHIvc3lzL3VzZXJzYCBnb3Zlcm5zLiBXZWlnaCBpdCB0aGUgd2F5IHlvdQp3ZWlnaCBhIGBnby5tb2RgOiBpdCBzYXlzIHdoZXJlIHRoZSBhdXRob3Igc2F5cyB0aGUgc291cmNlIGxpdmVzLgoKQSBgUmVsZWFzZWAgaXMgYSB0YWcsIG5vdGVzLCBhbmQgdGhlIG9iamVjdCB0aGUgdGFnIG5hbWVzLiBBIHRhZyBjYW5ub3QgYmUKcmUtY3V0LCBiZWNhdXNlIGEgY29uc3VtZXIgd2hvIHBpbm5lZCBgdjEuMi4wYCBhbmQgbGF0ZXIgcmVjZWl2ZWQgZGlmZmVyZW50CmJ5dGVzIGhhcyBiZWVuIGxpZWQgdG8uIFdpdGhkcmF3aW5nIG9uZSBpcyBgWWFua1JlbGVhc2VgLCB3aGljaCBsZWF2ZXMgaXQKdmlzaWJsZTogYSB2ZXJzaW9uIHRoYXQgdmFuaXNoZWQgcmVhZHMgYXMgIm5ldmVyIHB1Ymxpc2hlZCIgcmF0aGVyIHRoYW4gImRvIG5vdAp1c2UgdGhpcyIuIFJlbGVhc2VzIGl0ZXJhdGUgaW4gKipjdXQgb3JkZXIsIG5ldmVyIHRhZyBvcmRlcioqIOKAlCB0YWdzIGFyZSBub3QKcmVxdWlyZWQgdG8gYmUgc2VtdmVyIGhlcmUgKGduby5sYW5kJ3Mgb3duIHBhY2thZ2VzIGFyZSBgdjBgIGFuZCBgdjFgKSwgc28gYW55CnZlcnNpb24gc29ydCB3b3VsZCBwcmVzZW50IGB2MTBgIGJlZm9yZSBgdjJgIGFuZCBjYWxsIGl0IG5ld2VzdC4KCiMjIFdoYXQgaXQgc3RvcmVzLCBhbmQgd2hhdCBpdCByZWZ1c2VzIHRvIHN0b3JlCgpJdCBkb2VzIG5vdCBzdG9yZSBjb2RlLiBHaXQgb2JqZWN0cyBzdGF5IGluIGdpdCwgYmVoaW5kIHdoYXRldmVyIG1pcnJvciBhIHJlcG8KZGVjbGFyZXMgKGFuIGh0dHBzIHJlbW90ZSwgYW4gSVBGUyBDSUQsIGEgcGVlcikuIE9uIGduby5sYW5kIGEgcmVhbG0gd3JpdGUgbG9ja3MKYSBzdG9yYWdlIGRlcG9zaXQgb2YgMTAwdWdub3QgcGVyIGJ5dGUsIHNvIGEgMSBNQiByZXBvc2l0b3J5IHdvdWxkIGNvc3QgYWJvdXQKMTAwIEdOT1QgdG8gcGFyayBvbiBjaGFpbiBhbmQgbW9yZSBvbiBldmVyeSBwdXNoLiBBbmNob3JpbmcgaXMgdGhlIG9ubHkgc2hhcGUKdGhhdCBzdXJ2aXZlcyBjb250YWN0IHdpdGggcmVhbCByZXBvc2l0b3JpZXMuCgpXaGF0IGl0IGRvZXMgc3RvcmUgaXMgdGhlIHBhcnQgYSBmb3JnZSBpcyBhY3R1YWxseSB0cnVzdGVkIGZvciwgYW5kIHRoYXQgZ2l0CmFsb25lIGRvZXMgbm90IGF1dGhlbnRpY2F0ZToKCjEuICoqV2hpY2ggb2JqZWN0IGEgcmVmIHBvaW50cyBhdCoqLCBpbiB3aGF0IG9yZGVyIGl0IGdvdCB0aGVyZSwgYW5kIHdobyBzYWlkCiAgIHNvOiBhbiBhcHBlbmQtb25seSwgaGFzaC1jaGFpbmVkIHJlZmVyZW5jZSBsb2cuCjIuICoqV2hvIG1heSBtb3ZlIHdoaWNoIHJlZioqLCBhbmQgdW5kZXIgd2hhdCByZXZpZXcgcG9saWN5LgozLiAqKlRoZSBzb2NpYWwgbGF5ZXIqKjogaXNzdWVzLCBjaGFuZ2UgcmVxdWVzdHMgYW5kIHJldmlld3MgYm91bmQgdG8gYWRkcmVzc2VzCiAgIHJhdGhlciB0aGFuIHRvIHBsYXRmb3JtIGFjY291bnRzLgo0LiAqKlRoZSBtZXJnZSBkZWNpc2lvbioqLCByZWNvcmRlZCBhcyBvbmUgbW9yZSBlbnRyeSBpbiB0aGUgc2FtZSBsb2cuCjUuICoqV2hpY2ggZGVwbG95ZWQgcGFja2FnZSBwYXRocyBhIHJlcG8gcHVibGlzaGVzKiosIGFuZCAqKndoaWNoIHJlbGVhc2VzIGl0CiAgIGhhcyBjdXQqKi4gU2VlIGJlbG93OiB0aGVzZSB0d28gYXJlIHdoYXQgbGV0IGFuIGV4cGxvcmVyIHN0YXJ0IGZyb20gYQogICBgZ25vLmxhbmQvLi4uYCBwYXRoIGFuZCBmaW5kIHRoZSByZXBvIGJlaGluZCBpdC4KCiMjIFRoZSByZWZlcmVuY2UgbG9nCgpFdmVyeSByZWYgbW92ZSBhcHBlbmRzIGEgYExvZ0VudHJ5YDogcmVmIG5hbWUsIG9sZCBvYmplY3QsIG5ldyBvYmplY3QsIGFjdG9yLApibG9jayBoZWlnaHQsIGtpbmQgKGBjcmVhdGVgLCBgdXBkYXRlYCwgYGZvcmNlYCwgYGRlbGV0ZWAsIGBtZXJnZWApLCBhbiBvcHRpb25hbApub3RlLCBhbmQgYSBgRGlnZXN0YCBjb21taXR0aW5nIHRvIHRoZSBwcmV2aW91cyBlbnRyeSdzIGRpZ2VzdC4gUHVibGlzaApgTG9nSGVhZCgpYCBhbnl3aGVyZSBvZmYgY2hhaW4gYW5kIHRoZSBlbnRpcmUgaGlzdG9yeSBvZiBldmVyeSByZWYgYmVjb21lcwpmYWxzaWZpYWJsZS4gYFZlcmlmeUxvZygpYCByZWNvbXB1dGVzIHRoZSBjaGFpbjsgYSBjbGllbnQgc2hvdWxkIHJ1biB0aGUgc2FtZQpjb21wdXRhdGlvbiBvdmVyIHRoZSB2YWx1ZXMgaXQgcmVhZCBiYWNrLCBzaW5jZSBhIHRyYW5zcGFyZW5jeSBsb2cgbm9ib2R5CnZlcmlmaWVzIGlzIGp1c3QgYSBsb2cuCgpNb3ZlcyBhcmUgY29tcGFyZS1hbmQtc3dhcDoKCmBgYGdvCnIuU2V0UmVmKGFjdG9yLCBoZWlnaHQsICJyZWZzL2hlYWRzL21haW4iLCBleHBlY3RlZE9JRCwgbmV3T0lELCAic2hpcCBpdCIpCmBgYAoKYGV4cGVjdGVkT0lEYCBpcyB0aGUgdGlwIHRoZSBjYWxsZXIgbGFzdCBzYXcsIGVtcHR5IHRvIGNyZWF0ZSB0aGUgcmVmLiBBIHN0YWxlCmV4cGVjdGF0aW9uIHJldHVybnMgYEVyclN0YWxlUmVmYCBpbnN0ZWFkIG9mIG92ZXJ3cml0aW5nLiBUaGF0IGlzIGdpdCdzCmAtLWZvcmNlLXdpdGgtbGVhc2VgLCBleGNlcHQgdGhlIGxlYXNlIGlzIGhlbGQgYnkgY29uc2Vuc3VzIHJhdGhlciB0aGFuIGJ5IHRoZQpzZXJ2ZXIgeW91IGFyZSBwdXNoaW5nIHRvLiBgRm9yY2VTZXRSZWZgIHNraXBzIHRoZSBleHBlY3RhdGlvbiwgbmVlZHMKYFJvbGVNYWludGFpbmVyYCwgYW5kIGlzIHBlcm1hbmVudGx5IHJlY29yZGVkIGFzIGBLaW5kRm9yY2VgOiBhIGZvcmNlLXB1c2ggaXMKbm90IGZvcmJpZGRlbiBoZXJlLCBpdCBpcyBtYWRlIGltcG9zc2libGUgdG8gaGlkZS4KClRoZSBjaGFpbiBoYXMgbm8gb2JqZWN0cywgc28gaXQgY2Fubm90IGNoZWNrIHRoYXQgYSBuZXcgdGlwIGRlc2NlbmRzIGZyb20gdGhlCm9sZCBvbmUsIGFuZCB0aGlzIHBhY2thZ2UgZG9lcyBub3QgcHJldGVuZCBvdGhlcndpc2UuIE9yZGVyaW5nLCBhdHRyaWJ1dGlvbiBhbmQKcG9saWN5IGFyZSBvbiBjaGFpbjsgYW5jZXN0cnkgaXMgdmVyaWZpZWQgYnkgYSBjbGllbnQgdGhhdCBob2xkcyB0aGUgcmVwby4gVGhpcwppcyB0aGUgc2FtZSBzcGxpdCBhcyBnaXR0dWYncyByZWZlcmVuY2Ugc3RhdGUgbG9nLCB3aXRoIHRoZSBsb2cgbW92ZWQgb3V0IG9mIHRoZQpyZXBvc2l0b3J5IGFuZCBpbnRvIGEgcGxhY2Ugbm8gbWFpbnRhaW5lciBjYW4gcmV3cml0ZS4KCiMjIFJvbGVzCgpgUm9sZU5vbmUgPCBSb2xlUmVhZGVyIDwgUm9sZVdyaXRlciA8IFJvbGVNYWludGFpbmVyIDwgUm9sZUFkbWluIDwgUm9sZU93bmVyYCwKdG90YWxseSBvcmRlcmVkIHNvIGV2ZXJ5IGNoZWNrIGlzIG9uZSBjb21wYXJpc29uLiBXcml0ZXJzIG1vdmUgcmVmcywgbWFpbnRhaW5lcnMKZm9yY2UgYW5kIG1lcmdlLCBhZG1pbnMgbWFuYWdlIG1lbWJlcnMgYW5kIHBvbGljeS4gVGhlIGxhc3Qgb3duZXIgY2Fubm90IGJlCmRlbW90ZWQuIEFueW9uZSBjYW4gb3BlbiBhbiBpc3N1ZSBvciBhIGNoYW5nZSByZXF1ZXN0IHdpdGhvdXQgYSByb2xlOiB0aGUgc3BhbQpnYXRlIGlzIHRoYXQgdGhlIGF1dGhvciBwYXlzIGdhcyBhbmQgbG9ja3MgdGhlIGRlcG9zaXQgZm9yIHRoZWlyIG93biBieXRlcy4KCiMjIFJldmlld3MgdGhhdCBjYW5ub3QgZ28gc3RhbGUgdW5ub3RpY2VkCgpBIGBSZXZpZXdgIG5hbWVzIHRoZSBvYmplY3QgaWQgaXQgcmV2aWV3ZWQsIG5vdCB0aGUgY2hhbmdlLiBQdXNoIGEgbmV3IGhlYWQgYW5kCmV2ZXJ5IGVhcmxpZXIgYXBwcm92YWwgc3RvcHMgY291bnRpbmcsIGJlY2F1c2UgaXQgYXBwcm92ZWQgc29tZXRoaW5nIHRoYXQgaXMgbm8KbG9uZ2VyIHdoYXQgd291bGQgYmUgbWVyZ2VkLiBOb3RoaW5nIGhhcyB0byByZW1lbWJlciB0byBkaXNtaXNzIGl0LCBhbmQgbm8Kc2V0dGluZyBjYW4gdHVybiB0aGUgYmVoYXZpb3VyIG9mZi4gT25seSBhIHdyaXRlcidzIGFwcHJvdmFsIGNvdW50cyB0b3dhcmQKYFJlcXVpcmVkQXBwcm92YWxzYDsgYW55b25lIGVsc2UncyByZXZpZXcgaXMgc2lnbmFsLCBub3QgYXV0aG9yaXR5LiBBCmByZXF1ZXN0LWNoYW5nZXNgIHZlcmRpY3QgZnJvbSBhIHdyaXRlciBibG9ja3MgdGhlIG1lcmdlIHdoaWxlIGl0IHN0YW5kcy4KCmBNZXJnZUNoYW5nZWAgaXMgYSBjb21wYXJlLWFuZC1zd2FwIG9uIHRoZSB0YXJnZXQgcmVmIHBsdXMgYSBwb2xpY3kgY2hlY2ssIGFuZAppdCB3cml0ZXMgYSBgS2luZE1lcmdlYCBlbnRyeSBuYW1pbmcgdGhlIGNoYW5nZSBpdCBjYW1lIGZyb20uCgojIyBBUEkgc2hhcGUKCkVycm9ycywgbmV2ZXIgcGFuaWNzOiB0aGlzIHBhY2thZ2UgaXMgcHVyZSwgc28gYSByZWFsbSB0dXJucyBhbiBlcnJvciBpbnRvIGFuCmFib3J0ICh0aGUgb25seSB3YXkgdG8gcmV2ZXJ0IHN0YXRlIGluIGdubykgYW5kIGEgdGVzdCBhc3NlcnRzIG9uIHRoZSB2YWx1ZS4KRXZlcnkgY29sbGVjdGlvbiBpcyBhbiBgYXZsLlRyZWVgLCBzbyBldmVyeSBsaXN0aW5nIGlzIG9yZGVyZWQgYW5kIHBhZ2luYXRhYmxlLAphbmQgbm8gaXRlcmF0aW9uIHdhbGtzIHVuYm91bmRlZCBzdGF0ZS4gVGhlIGNhbGxlciBzdXBwbGllcyB0aGUgYWN0b3IgYWRkcmVzcwphbmQgdGhlIGJsb2NrIGhlaWdodCwgd2hpY2ggaXMgd2hhdCBtYWtlcyB0aGUgd2hvbGUgZW5naW5lIHVuaXQtdGVzdGFibGUgd2l0aCBubwpjaGFpbiBhdCBhbGwuCgpgYGBnbwpmIDo9IGZvcmdlLk5ldygpCnIsIF8gOj0gZi5DcmVhdGVSZXBvKGFsaWNlLCBoZWlnaHQsICJtb3VsL2ZvcmdlIiwgImFuIG9uLWNoYWluIGZvcmdlIiwgIiIpCnIuU2V0TWVtYmVyKGFsaWNlLCBib2IsIGZvcmdlLlJvbGVNYWludGFpbmVyKQpyLlNldFJlZihhbGljZSwgaGVpZ2h0LCAicmVmcy9oZWFkcy9tYWluIiwgIiIsIG9pZCwgImluaXRpYWwgaW1wb3J0IikKYywgXyA6PSByLk9wZW5DaGFuZ2UoY2Fyb2wsIGhlaWdodCwgInRpdGxlIiwgImJvZHkiLCAiIiwgInJlZnMvaGVhZHMvZmVhdCIsIGhlYWQsICJyZWZzL2hlYWRzL21haW4iKQpyLlJldmlld0NoYW5nZShib2IsIGhlaWdodCwgYy5JRCwgZm9yZ2UuVmVyZGljdEFwcHJvdmUsICJsZ3RtIikKci5NZXJnZUNoYW5nZShib2IsIGhlaWdodCwgYy5JRCwgb2lkLCBtZXJnZWQsICJtZXJnZSBjaGFuZ2UgMCIpCmBgYAoKIyMgTGltaXRzCgpFdmVyeSBzdG9yZWQgc3RyaW5nIGlzIGJvdW5kZWQgKHNlZSB0aGUgYE1heCpgIGNvbnN0YW50cykgYmVjYXVzZSBhbiB1bmJvdW5kZWQKZmllbGQgaXMgYW4gdW5ib3VuZGVkIGRlcG9zaXQuIFJlZiBuYW1lcyBhcmUgYSBgcmVmcy9gLXJvb3RlZCBzdWJzZXQgb2YKZ2l0LWNoZWNrLXJlZi1mb3JtYXQ7IG9iamVjdCBpZHMgYXJlIDQwIG9yIDY0IGxvd2VyY2FzZSBoZXggY2hhcmFjdGVyczsgcmVwbyBpZHMKYXJlIGA8bmFtZXNwYWNlPi88bmFtZT5gLCB3aGVyZSB0aGUgbmFtZSBpcyBhIGxvd2VyY2FzZSBzbHVnIGFuZCB0aGUgbmFtZXNwYWNlIGlzCmVpdGhlciBhIHNsdWcgKGEgY2xhaW1lZCB1c2VyIG5hbWUpIG9yIGEgYmVjaDMyIGFkZHJlc3MuIFRoZSB0d28gc2hhcGVzIGNhbm5vdApjb2xsaWRlOiBhbiBhZGRyZXNzIGlzIDQwIGNoYXJhY3RlcnMgYW5kIGEgc2x1ZyBjYXBzIGF0IDM5LgoKVGhpcyBwYWNrYWdlIHZhbGlkYXRlcyB0aGUgKipzaGFwZSoqIG9mIGEgbmFtZXNwYWNlIGFuZCBub3RoaW5nIGVsc2UuIFdoZXRoZXIgYQpjYWxsZXIgbWF5IGNsYWltIG9uZSBpcyBhbiBvd25lcnNoaXAgcXVlc3Rpb24gdGhhdCBuZWVkcyBhIGNoYWluLCBzbyBpdCBsaXZlcyBpbgp0aGUgcmVhbG06IGEgbmFtZSBtdXN0IGJlIGhlbGQgaW4gYHIvc3lzL3VzZXJzYCwgYW4gYWRkcmVzcyBtdXN0IGJlIHRoZSBjYWxsZXIncwpvd24uCgpPbmUgZWNvbm9taWMgcnVsZSBzaG93cyB1cCBpbiB0aGUgQVBJOiBkZWxldGluZyBpcyBwcml2aWxlZ2VkLiBPbiBnbm8ubGFuZCB0aGUKc3RvcmFnZS1kZXBvc2l0IHJlZnVuZCBnb2VzIHRvIHdob2V2ZXIgZnJlZXMgdGhlIGJ5dGVzLCBub3QgdG8gd2hvZXZlciBwYWlkIGZvcgp0aGVtLCBzbyBhbiBvcGVuIGRlbGV0ZSBwYXRoIHBheXMgZm9yIHZhbmRhbGlzbS4gYERlbGV0ZVJlZmAgbmVlZHMKYFJvbGVNYWludGFpbmVyYCwgYW5kIGlzc3VlcywgY29tbWVudHMgYW5kIHJldmlld3MgaGF2ZSBubyBkZWxldGUgYXQgYWxsLgoKPCEtLSBCRUdJTiBHTk9DT05UUkFDVFMgRk9PVEVSIChnZW5lcmF0ZWQgYnkgYG1ha2UgcmVhZG1lc2A7IGRvIG5vdCBlZGl0IGJlbG93KSAtLT4KCi0tLQoKUGFydCBvZiAqKlttb3VsL2duby1jb250cmFjdHNdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VsL2duby1jb250cmFjdHMpKiog4oCUIG1vdWwncyB2ZXJzaW9uZWQgZ25vLmxhbmQgY29udHJhY3RzLiBTZWUgdGhlIHJlcG9zaXRvcnkgZm9yIHRoZSBmdWxsIGNhdGFsb2csIGJ1aWxkL3Rlc3QgdG9vbGluZywgYW5kIHVzYWdlLgoKKipEZXBlbmRlbmN5IGdyYXBoOioqCgohW2duby5sYW5kL3AvbW91bC9mb3JnZS92MSBkZXBlbmRlbmN5IGdyYXBoXShodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vbW91bC9nbm8tY29udHJhY3RzL21haW4vX2Fzc2V0cy9nbm8ubGFuZC9wL21vdWwvZm9yZ2UvdjEvZGVwcy5wbmcpCgo+IOKaoO+4jyAqKkRpc2NsYWltZXI6KiogcHJvdmlkZWQgYXMtaXMsIHdpdGhvdXQgd2FycmFudHk7IG5vdCBzZWN1cml0eS1hdWRpdGVkLiBGdWxsIGRpc2NsYWltZXI6IFtESVNDTEFJTUVSXShodHRwczovL2dpdGh1Yi5jb20vbW91bC9nbm8tY29udHJhY3RzL2Jsb2IvbWFpbi9ESVNDTEFJTUVSLm1kKS4KCjwhLS0gRU5EIEdOT0NPTlRSQUNUUyBGT09URVIgLS0+ChqpTAoKY2hhbmdlLmdubxKaTHBhY2thZ2UgZm9yZ2UKCmltcG9ydCAiZ25vLmxhbmQvcC9udC9hdmwvdjAiCgovLyBDaGFuZ2Ugc3RhdGVzLgpjb25zdCAoCglTdGF0ZU9wZW4gICA9ICJvcGVuIgoJU3RhdGVNZXJnZWQgPSAibWVyZ2VkIgoJU3RhdGVDbG9zZWQgPSAiY2xvc2VkIgopCgovLyBSZXZpZXcgdmVyZGljdHMuCmNvbnN0ICgKCVZlcmRpY3RBcHByb3ZlICAgICAgICA9ICJhcHByb3ZlIgoJVmVyZGljdFJlcXVlc3RDaGFuZ2VzID0gInJlcXVlc3QtY2hhbmdlcyIKCVZlcmRpY3RDb21tZW50ICAgICAgICA9ICJjb21tZW50IgopCgovLyBDaGFuZ2UgaXMgYSBjaGFuZ2UgcmVxdWVzdCAoYSBwdWxsIHJlcXVlc3QpOiBhIGNsYWltIHRoYXQgVGFyZ2V0UmVmIHNob3VsZCBiZQovLyBtb3ZlZCB0byBpbmNsdWRlIEhlYWRPSUQsIHBsdXMgdGhlIHJldmlld3Mgb2YgdGhhdCBjbGFpbS4KLy8KLy8gUmV2aWV3cyBhcmUgYm91bmQgdG8gdGhlIG9iamVjdCBpZCB0aGV5IHJldmlld2VkLCBub3QgdG8gdGhlIGNoYW5nZS4gUHVzaCBhCi8vIG5ldyBoZWFkIGFuZCBldmVyeSBlYXJsaWVyIGFwcHJvdmFsIHN0b3BzIGNvdW50aW5nOiBub3QgYnkgYSBwb2xpY3kgdG9nZ2xlIGEKLy8gbWFpbnRhaW5lciBjYW4gc3dpdGNoIG9mZiwgYnV0IGJlY2F1c2UgdGhlIGFwcHJvdmFsIG5hbWVzIGFuIG9iamVjdCB0aGF0IGlzCi8vIG5vIGxvbmdlciB3aGF0IGlzIGJlaW5nIG1lcmdlZC4KdHlwZSBDaGFuZ2Ugc3RydWN0IHsKCUlEICAgICAgICAgaW50NjQKCVRpdGxlICAgICAgc3RyaW5nCglCb2R5ICAgICAgIHN0cmluZwoJQXV0aG9yICAgICBhZGRyZXNzCglTb3VyY2VSZXBvIHN0cmluZyAvLyBmb3JnZSByZXBvIGlkLCBvciBhIG1pcnJvciBsb2NhdG9yOyAiIiBtZWFucyB0aGlzIHJlcG8KCVNvdXJjZVJlZiAgc3RyaW5nCglIZWFkT0lEICAgIHN0cmluZwoJVGFyZ2V0UmVmICBzdHJpbmcKCVN0YXRlICAgICAgc3RyaW5nCglDcmVhdGVkQXQgIGludDY0CglVcGRhdGVkQXQgIGludDY0CgoJTWVyZ2VkT0lEIHN0cmluZyAvLyB0aGUgb2JqZWN0IFRhcmdldFJlZiBtb3ZlZCB0bwoJTWVyZ2VkQnkgIGFkZHJlc3MKCU1lcmdlZEF0ICBpbnQ2NAoKCXJldmlld3MgICAgICphdmwuVHJlZSAvLyBhZGRyZXNzIHN0cmluZyAtPiAqUmV2aWV3IChsYXRlc3QgcGVyIHJldmlld2VyKQoJY29tbWVudHMgICAgKmF2bC5UcmVlIC8vIHBhZGRlZCBpZCAtPiAqQ29tbWVudAoJbmV4dENvbW1lbnQgaW50NjQKfQoKLy8gUmV2aWV3IGlzIG9uZSByZXZpZXdlcidzIHZlcmRpY3Qgb24gb25lIG9iamVjdCBpZC4KdHlwZSBSZXZpZXcgc3RydWN0IHsKCVJldmlld2VyIGFkZHJlc3MKCVZlcmRpY3QgIHN0cmluZwoJT0lEICAgICAgc3RyaW5nIC8vIHRoZSBoZWFkIHRoZSByZXZpZXdlciBhY3R1YWxseSBsb29rZWQgYXQKCUJvZHkgICAgIHN0cmluZwoJSGVpZ2h0ICAgaW50NjQKfQoKLy8gT3BlbkNoYW5nZSBmaWxlcyBhIGNoYW5nZSByZXF1ZXN0LiBQZXJtaXNzaW9ubGVzcywgbGlrZSBhbiBpc3N1ZTogdGhlCi8vIHByb3Bvc2FsIGNvc3RzIGl0cyBhdXRob3IgZ2FzIGFuZCBkZXBvc2l0LCBhbmQgY29zdHMgYSBtYWludGFpbmVyIG5vdGhpbmcKLy8gdW50aWwgdGhleSBjaG9vc2UgdG8gbG9vay4KZnVuYyAociAqUmVwbykgT3BlbkNoYW5nZShhY3RvciBhZGRyZXNzLCBoZWlnaHQgaW50NjQsIHRpdGxlLCBib2R5LCBzb3VyY2VSZXBvLCBzb3VyY2VSZWYsIGhlYWRPSUQsIHRhcmdldFJlZiBzdHJpbmcpICgqQ2hhbmdlLCBlcnJvcikgewoJaWYgci5BcmNoaXZlZCB7CgkJcmV0dXJuIG5pbCwgRXJyUmVwb0FyY2hpdmVkCgl9CglpZiB0aXRsZSA9PSAiIiB8fCAhVmFsaWRMaW5lKHRpdGxlLCBNYXhUaXRsZUxlbikgewoJCXJldHVybiBuaWwsIEVyckludmFsaWRUZXh0Cgl9CglpZiAhVmFsaWRUZXh0KGJvZHksIE1heEJvZHlMZW4pIHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkVGV4dAoJfQoJaWYgc291cmNlUmVwbyAhPSAiIiAmJiAhVmFsaWRSZXBvSUQoc291cmNlUmVwbykgJiYgIVZhbGlkTWlycm9yKHNvdXJjZVJlcG8pIHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkUmVwb0lECgl9CglpZiBzb3VyY2VSZWYgIT0gIiIgJiYgIVZhbGlkUmVmTmFtZShzb3VyY2VSZWYpIHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkUmVmTmFtZQoJfQoJaWYgIVZhbGlkT0lEKGhlYWRPSUQpIHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkT0lECgl9CglpZiAhVmFsaWRSZWZOYW1lKHRhcmdldFJlZikgewoJCXJldHVybiBuaWwsIEVyckludmFsaWRSZWZOYW1lCgl9CgljIDo9ICZDaGFuZ2V7CgkJSUQ6ICAgICAgICAgci5uZXh0Q2hhbmdlLAoJCVRpdGxlOiAgICAgIHRpdGxlLAoJCUJvZHk6ICAgICAgIGJvZHksCgkJQXV0aG9yOiAgICAgYWN0b3IsCgkJU291cmNlUmVwbzogc291cmNlUmVwbywKCQlTb3VyY2VSZWY6ICBzb3VyY2VSZWYsCgkJSGVhZE9JRDogICAgaGVhZE9JRCwKCQlUYXJnZXRSZWY6ICB0YXJnZXRSZWYsCgkJU3RhdGU6ICAgICAgU3RhdGVPcGVuLAoJCUNyZWF0ZWRBdDogIGhlaWdodCwKCQlVcGRhdGVkQXQ6ICBoZWlnaHQsCgkJcmV2aWV3czogICAgYXZsLk5ld1RyZWUoKSwKCQljb21tZW50czogICBhdmwuTmV3VHJlZSgpLAoJfQoJci5jaGFuZ2VzLlNldChzZXFLZXkoYy5JRCksIGMpCglyLm5leHRDaGFuZ2UrKwoJcmV0dXJuIGMsIG5pbAp9CgovLyBVcGRhdGVDaGFuZ2VIZWFkIHJlcG9pbnRzIGFuIG9wZW4gY2hhbmdlIGF0IGEgbmV3IG9iamVjdC4gVGhlIGF1dGhvciBtYXkKLy8gYWx3YXlzIHVwZGF0ZSB0aGVpciBvd247IGEgd3JpdGVyIG1heSB1cGRhdGUgYW55b25lJ3MgKHRoZSAibWFpbnRhaW5lciBwdXNoZWQKLy8gYSBmaXh1cCIgY2FzZSkuCmZ1bmMgKHIgKlJlcG8pIFVwZGF0ZUNoYW5nZUhlYWQoYWN0b3IgYWRkcmVzcywgaGVpZ2h0LCBpZCBpbnQ2NCwgaGVhZE9JRCBzdHJpbmcpIGVycm9yIHsKCWMgOj0gci5DaGFuZ2UoaWQpCglpZiBjID09IG5pbCB7CgkJcmV0dXJuIEVyckNoYW5nZU5vdEZvdW5kCgl9CglpZiBjLlN0YXRlICE9IFN0YXRlT3BlbiB7CgkJcmV0dXJuIEVyckNoYW5nZU5vdE9wZW4KCX0KCWlmIGMuQXV0aG9yICE9IGFjdG9yICYmICFyLkNhbihhY3RvciwgUm9sZVdyaXRlcikgewoJCXJldHVybiBFcnJVbmF1dGhvcml6ZWQKCX0KCWlmICFWYWxpZE9JRChoZWFkT0lEKSB7CgkJcmV0dXJuIEVyckludmFsaWRPSUQKCX0KCWlmIGhlYWRPSUQgPT0gYy5IZWFkT0lEIHsKCQlyZXR1cm4gRXJyU2FtZU9JRAoJfQoJYy5IZWFkT0lEID0gaGVhZE9JRAoJYy5VcGRhdGVkQXQgPSBoZWlnaHQKCXJldHVybiBuaWwKfQoKLy8gUmV2aWV3Q2hhbmdlIHJlY29yZHMgYSB2ZXJkaWN0IGFnYWluc3QgdGhlIGNoYW5nZSdzIGN1cnJlbnQgaGVhZC4gQW55b25lIG1heQovLyByZXZpZXc7IG9ubHkgYSB3cml0ZXIncyBhcHByb3ZhbCBjb3VudHMgdG93YXJkIHRoZSBtZXJnZSBwb2xpY3kgKHNlZQovLyBDb3VudEFwcHJvdmFscyk6IGFuIHVucHJpdmlsZWdlZCByZXZpZXcgaXMgc2lnbmFsLCBub3QgYXV0aG9yaXR5LgpmdW5jIChyICpSZXBvKSBSZXZpZXdDaGFuZ2UoYWN0b3IgYWRkcmVzcywgaGVpZ2h0LCBpZCBpbnQ2NCwgdmVyZGljdCwgYm9keSBzdHJpbmcpIGVycm9yIHsKCWlmIHIuQXJjaGl2ZWQgewoJCXJldHVybiBFcnJSZXBvQXJjaGl2ZWQKCX0KCWMgOj0gci5DaGFuZ2UoaWQpCglpZiBjID09IG5pbCB7CgkJcmV0dXJuIEVyckNoYW5nZU5vdEZvdW5kCgl9CglpZiBjLlN0YXRlICE9IFN0YXRlT3BlbiB7CgkJcmV0dXJuIEVyckNoYW5nZU5vdE9wZW4KCX0KCXN3aXRjaCB2ZXJkaWN0IHsKCWNhc2UgVmVyZGljdEFwcHJvdmUsIFZlcmRpY3RSZXF1ZXN0Q2hhbmdlcywgVmVyZGljdENvbW1lbnQ6CglkZWZhdWx0OgoJCXJldHVybiBFcnJJbnZhbGlkVmVyZGljdAoJfQoJaWYgdmVyZGljdCA9PSBWZXJkaWN0QXBwcm92ZSAmJiBhY3RvciA9PSBjLkF1dGhvciAmJiAhci5BbGxvd1NlbGZBcHByb3ZhbCB7CgkJcmV0dXJuIEVyclNlbGZBcHByb3ZhbAoJfQoJaWYgIVZhbGlkVGV4dChib2R5LCBNYXhDb21tZW50TGVuKSB7CgkJcmV0dXJuIEVyckludmFsaWRUZXh0Cgl9CgljLnJldmlld3MuU2V0KGFjdG9yLlN0cmluZygpLCAmUmV2aWV3ewoJCVJldmlld2VyOiBhY3RvciwKCQlWZXJkaWN0OiAgdmVyZGljdCwKCQlPSUQ6ICAgICAgYy5IZWFkT0lELAoJCUJvZHk6ICAgICBib2R5LAoJCUhlaWdodDogICBoZWlnaHQsCgl9KQoJYy5VcGRhdGVkQXQgPSBoZWlnaHQKCXJldHVybiBuaWwKfQoKLy8gQ29tbWVudENoYW5nZSBhcHBlbmRzIGEgcmVwbHkgdG8gYSBjaGFuZ2UgcmVxdWVzdC4KZnVuYyAociAqUmVwbykgQ29tbWVudENoYW5nZShhY3RvciBhZGRyZXNzLCBoZWlnaHQsIGlkIGludDY0LCBib2R5IHN0cmluZykgKCpDb21tZW50LCBlcnJvcikgewoJaWYgci5BcmNoaXZlZCB7CgkJcmV0dXJuIG5pbCwgRXJyUmVwb0FyY2hpdmVkCgl9CgljIDo9IHIuQ2hhbmdlKGlkKQoJaWYgYyA9PSBuaWwgewoJCXJldHVybiBuaWwsIEVyckNoYW5nZU5vdEZvdW5kCgl9CglpZiBib2R5ID09ICIiIHx8ICFWYWxpZFRleHQoYm9keSwgTWF4Q29tbWVudExlbikgewoJCXJldHVybiBuaWwsIEVyckludmFsaWRUZXh0Cgl9CgljbSA6PSAmQ29tbWVudHtJRDogYy5uZXh0Q29tbWVudCwgQXV0aG9yOiBhY3RvciwgQm9keTogYm9keSwgQ3JlYXRlZEF0OiBoZWlnaHR9CgljLmNvbW1lbnRzLlNldChzZXFLZXkoY20uSUQpLCBjbSkKCWMubmV4dENvbW1lbnQrKwoJYy5VcGRhdGVkQXQgPSBoZWlnaHQKCXJldHVybiBjbSwgbmlsCn0KCi8vIENsb3NlQ2hhbmdlIHdpdGhkcmF3cyBvciByZWplY3RzIGEgY2hhbmdlLiBBdXRob3Igb3IgbWFpbnRhaW5lci4KZnVuYyAociAqUmVwbykgQ2xvc2VDaGFuZ2UoYWN0b3IgYWRkcmVzcywgaGVpZ2h0LCBpZCBpbnQ2NCkgZXJyb3IgewoJYyA6PSByLkNoYW5nZShpZCkKCWlmIGMgPT0gbmlsIHsKCQlyZXR1cm4gRXJyQ2hhbmdlTm90Rm91bmQKCX0KCWlmIGMuU3RhdGUgIT0gU3RhdGVPcGVuIHsKCQlyZXR1cm4gRXJyQ2hhbmdlTm90T3BlbgoJfQoJaWYgYy5BdXRob3IgIT0gYWN0b3IgJiYgIXIuQ2FuKGFjdG9yLCBSb2xlTWFpbnRhaW5lcikgewoJCXJldHVybiBFcnJVbmF1dGhvcml6ZWQKCX0KCWMuU3RhdGUgPSBTdGF0ZUNsb3NlZAoJYy5VcGRhdGVkQXQgPSBoZWlnaHQKCXJldHVybiBuaWwKfQoKLy8gQ291bnRBcHByb3ZhbHMgY291bnRzIGFwcHJvdmFscyB0aGF0IHN0aWxsIGFwcGx5OiBjYXN0IGJ5IGEgd3JpdGVyIG9yIGFib3ZlLAovLyBhZ2FpbnN0IHRoZSBjaGFuZ2UncyBjdXJyZW50IGhlYWQsIGFuZCAodW5sZXNzIHRoZSByZXBvIGFsbG93cyBpdCkgbm90IHRoZQovLyBhdXRob3IncyBvd24uCmZ1bmMgKHIgKlJlcG8pIENvdW50QXBwcm92YWxzKGMgKkNoYW5nZSkgaW50IHsKCW4gOj0gMAoJYy5yZXZpZXdzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCXJ2IDo9IHZhbHVlLigqUmV2aWV3KQoJCWlmIHJ2LlZlcmRpY3QgIT0gVmVyZGljdEFwcHJvdmUgfHwgcnYuT0lEICE9IGMuSGVhZE9JRCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQlpZiBydi5SZXZpZXdlciA9PSBjLkF1dGhvciAmJiAhci5BbGxvd1NlbGZBcHByb3ZhbCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQlpZiAhci5DYW4ocnYuUmV2aWV3ZXIsIFJvbGVXcml0ZXIpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCW4rKwoJCXJldHVybiBmYWxzZQoJfSkKCXJldHVybiBuCn0KCi8vIENvdW50QmxvY2tpbmcgY291bnRzIHdyaXRlcnMgd2hvIHJlcXVlc3RlZCBjaGFuZ2VzIG9uIHRoZSBjdXJyZW50IGhlYWQuCmZ1bmMgKHIgKlJlcG8pIENvdW50QmxvY2tpbmcoYyAqQ2hhbmdlKSBpbnQgewoJbiA6PSAwCgljLnJldmlld3MuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcnYgOj0gdmFsdWUuKCpSZXZpZXcpCgkJaWYgcnYuVmVyZGljdCA9PSBWZXJkaWN0UmVxdWVzdENoYW5nZXMgJiYgcnYuT0lEID09IGMuSGVhZE9JRCAmJiByLkNhbihydi5SZXZpZXdlciwgUm9sZVdyaXRlcikgewoJCQluKysKCQl9CgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIG4KfQoKLy8gTWVyZ2VDaGFuZ2UgbW92ZXMgVGFyZ2V0UmVmIHRvIG1lcmdlZE9JRCBhbmQgcmVjb3JkcyB0aGUgbW92ZSBhcyBvbmUgbW9yZQovLyBlbnRyeSBpbiB0aGUgcmVmZXJlbmNlIGxvZywgdGFnZ2VkIHdpdGggdGhlIGNoYW5nZSBpdCBjYW1lIGZyb20uCi8vCi8vIGV4cGVjdGVkVGFyZ2V0T0lEIGlzIGEgY29tcGFyZS1hbmQtc3dhcCBvbiB0aGUgdGFyZ2V0IHJlZiAoIiIgd2hlbiB0aGUgcmVmCi8vIGRvZXMgbm90IGV4aXN0IHlldCk6IGEgY2hhbmdlIGFwcHJvdmVkIGFnYWluc3Qgb25lIGJhc2UgY2Fubm90IGJlIG1lcmdlZCBvbnRvCi8vIGEgYmFzZSB0aGF0IG1vdmVkIHVuZGVybmVhdGggaXQuIG1lcmdlZE9JRCBpcyBjb21wdXRlZCBvZmYgY2hhaW4gYnkgd2hvZXZlcgovLyBwZXJmb3JtcyB0aGUgbWVyZ2U6IHRoZSBjaGFpbiByZWNvcmRzIHRoZSBjbGFpbSwgc2lnbmVkLCBvcmRlcmVkIGFuZAovLyBhdHRyaWJ1dGVkLCBhbmQgYSBjbGllbnQgd2l0aCB0aGUgb2JqZWN0cyB2ZXJpZmllcyB0aGF0IHRoZSByZXN1bHQgYWN0dWFsbHkKLy8gY29udGFpbnMgSGVhZE9JRC4KZnVuYyAociAqUmVwbykgTWVyZ2VDaGFuZ2UoYWN0b3IgYWRkcmVzcywgaGVpZ2h0LCBpZCBpbnQ2NCwgZXhwZWN0ZWRUYXJnZXRPSUQsIG1lcmdlZE9JRCwgbm90ZSBzdHJpbmcpICgqTG9nRW50cnksIGVycm9yKSB7CglpZiByLkFyY2hpdmVkIHsKCQlyZXR1cm4gbmlsLCBFcnJSZXBvQXJjaGl2ZWQKCX0KCWMgOj0gci5DaGFuZ2UoaWQpCglpZiBjID09IG5pbCB7CgkJcmV0dXJuIG5pbCwgRXJyQ2hhbmdlTm90Rm91bmQKCX0KCWlmIGMuU3RhdGUgIT0gU3RhdGVPcGVuIHsKCQlyZXR1cm4gbmlsLCBFcnJDaGFuZ2VOb3RPcGVuCgl9CglpZiAhci5DYW4oYWN0b3IsIFJvbGVNYWludGFpbmVyKSB7CgkJcmV0dXJuIG5pbCwgRXJyVW5hdXRob3JpemVkCgl9CglpZiAhVmFsaWRPSUQobWVyZ2VkT0lEKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZE9JRAoJfQoJaWYgIVZhbGlkTGluZShub3RlLCBNYXhOb3RlTGVuKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZFRleHQKCX0KCWlmIHIuQ291bnRCbG9ja2luZyhjKSA+IDAgewoJCXJldHVybiBuaWwsIEVyckNoYW5nZXNSZXF1ZXN0ZWQKCX0KCWlmIHIuQ291bnRBcHByb3ZhbHMoYykgPCByLlJlcXVpcmVkQXBwcm92YWxzIHsKCQlyZXR1cm4gbmlsLCBFcnJOb3RFbm91Z2hBcHByb3ZhbAoJfQoJY3VyIDo9IHIuUmVmKGMuVGFyZ2V0UmVmKQoJc3dpdGNoIHsKCWNhc2UgY3VyID09IG5pbCAmJiBleHBlY3RlZFRhcmdldE9JRCAhPSAiIjoKCQlyZXR1cm4gbmlsLCBFcnJSZWZOb3RGb3VuZAoJY2FzZSBjdXIgIT0gbmlsICYmIGN1ci5PSUQgIT0gZXhwZWN0ZWRUYXJnZXRPSUQ6CgkJcmV0dXJuIG5pbCwgRXJyU3RhbGVSZWYKCWNhc2UgY3VyICE9IG5pbCAmJiBjdXIuT0lEID09IG1lcmdlZE9JRDoKCQlyZXR1cm4gbmlsLCBFcnJTYW1lT0lECgl9CglvbGQgOj0gIiIKCWlmIGN1ciAhPSBuaWwgewoJCW9sZCA9IGN1ci5PSUQKCX0KCXIucmVmcy5TZXQoYy5UYXJnZXRSZWYsICZSZWZ7TmFtZTogYy5UYXJnZXRSZWYsIE9JRDogbWVyZ2VkT0lELCBVcGRhdGVkQXQ6IGhlaWdodCwgVXBkYXRlZEJ5OiBhY3Rvcn0pCgllIDo9IHIuYXBwZW5kTG9nKGFjdG9yLCBoZWlnaHQsIGMuVGFyZ2V0UmVmLCBvbGQsIG1lcmdlZE9JRCwgS2luZE1lcmdlLCBjLklELCBub3RlKQoJYy5TdGF0ZSA9IFN0YXRlTWVyZ2VkCgljLk1lcmdlZE9JRCA9IG1lcmdlZE9JRAoJYy5NZXJnZWRCeSA9IGFjdG9yCgljLk1lcmdlZEF0ID0gaGVpZ2h0CgljLlVwZGF0ZWRBdCA9IGhlaWdodAoJcmV0dXJuIGUsIG5pbAp9CgovLyBDaGFuZ2UgcmV0dXJucyBhIGNoYW5nZSBieSBpZCwgb3IgbmlsLgpmdW5jIChyICpSZXBvKSBDaGFuZ2UoaWQgaW50NjQpICpDaGFuZ2UgewoJdiA6PSByLmNoYW5nZXMuR2V0KHNlcUtleShpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoJcmV0dXJuIHYuKCpDaGFuZ2UpCn0KCi8vIEl0ZXJhdGVDaGFuZ2VzIHdhbGtzIGNoYW5nZSByZXF1ZXN0cyBuZXdlc3QtZmlyc3QuCmZ1bmMgKHIgKlJlcG8pIEl0ZXJhdGVDaGFuZ2VzKG9mZnNldCwgY291bnQgaW50LCBjYiBmdW5jKCpDaGFuZ2UpIGJvb2wpIHsKCWlmIGNvdW50IDw9IDAgewoJCWNvdW50ID0gci5jaGFuZ2VzLlNpemUoKQoJfQoJci5jaGFuZ2VzLlJldmVyc2VJdGVyYXRlQnlPZmZzZXQob2Zmc2V0LCBjb3VudCwgZnVuYyhfIHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlyZXR1cm4gY2IodmFsdWUuKCpDaGFuZ2UpKQoJfSkKfQoKLy8gT3BlbkNoYW5nZUNvdW50IGNvdW50cyBjaGFuZ2UgcmVxdWVzdHMgc3RpbGwgb3Blbi4KZnVuYyAociAqUmVwbykgT3BlbkNoYW5nZUNvdW50KCkgaW50IHsKCW4gOj0gMAoJci5jaGFuZ2VzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCWlmIHZhbHVlLigqQ2hhbmdlKS5TdGF0ZSA9PSBTdGF0ZU9wZW4gewoJCQluKysKCQl9CgkJcmV0dXJuIGZhbHNlCgl9KQoJcmV0dXJuIG4KfQoKLy8gUmV2aWV3Q291bnQgaXMgdGhlIG51bWJlciBvZiByZXZpZXdlcnMgd2hvIGhhdmUgd2VpZ2hlZCBpbiAobGF0ZXN0IHZlcmRpY3QKLy8gcGVyIHJldmlld2VyLCBvbiBhbnkgaGVhZCkuCmZ1bmMgKGMgKkNoYW5nZSkgUmV2aWV3Q291bnQoKSBpbnQgeyByZXR1cm4gYy5yZXZpZXdzLlNpemUoKSB9CgovLyBSZXZpZXcgcmV0dXJucyBhIHJldmlld2VyJ3MgbGF0ZXN0IHZlcmRpY3QsIG9yIG5pbC4KZnVuYyAoYyAqQ2hhbmdlKSBSZXZpZXcoYSBhZGRyZXNzKSAqUmV2aWV3IHsKCXYgOj0gYy5yZXZpZXdzLkdldChhLlN0cmluZygpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCXJldHVybiB2LigqUmV2aWV3KQp9CgovLyBJdGVyYXRlUmV2aWV3cyB3YWxrcyByZXZpZXdzIGluIHJldmlld2VyLWFkZHJlc3Mgb3JkZXIuCmZ1bmMgKGMgKkNoYW5nZSkgSXRlcmF0ZVJldmlld3MoY2IgZnVuYygqUmV2aWV3KSBib29sKSB7CgljLnJldmlld3MuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcmV0dXJuIGNiKHZhbHVlLigqUmV2aWV3KSkKCX0pCn0KCi8vIENvbW1lbnRDb3VudCBpcyB0aGUgbnVtYmVyIG9mIHJlcGxpZXMgb24gdGhlIGNoYW5nZS4KZnVuYyAoYyAqQ2hhbmdlKSBDb21tZW50Q291bnQoKSBpbnQgeyByZXR1cm4gYy5jb21tZW50cy5TaXplKCkgfQoKLy8gSXRlcmF0ZUNvbW1lbnRzIHdhbGtzIHJlcGxpZXMgb2xkZXN0LWZpcnN0LgpmdW5jIChjICpDaGFuZ2UpIEl0ZXJhdGVDb21tZW50cyhvZmZzZXQsIGNvdW50IGludCwgY2IgZnVuYygqQ29tbWVudCkgYm9vbCkgewoJaWYgY291bnQgPD0gMCB7CgkJY291bnQgPSBjLmNvbW1lbnRzLlNpemUoKQoJfQoJYy5jb21tZW50cy5JdGVyYXRlQnlPZmZzZXQob2Zmc2V0LCBjb3VudCwgZnVuYyhfIHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlyZXR1cm4gY2IodmFsdWUuKCpDb21tZW50KSkKCX0pCn0KCi8vIFN0YWxlIHJlcG9ydHMgd2hldGhlciBhIHJldmlldyBubyBsb25nZXIgYXBwbGllcyB0byB0aGUgY2hhbmdlJ3MgaGVhZC4KZnVuYyAoYyAqQ2hhbmdlKSBTdGFsZShydiAqUmV2aWV3KSBib29sIHsgcmV0dXJuIHJ2Lk9JRCAhPSBjLkhlYWRPSUQgfQoaxjkKD2NoYW5nZV90ZXN0LmdubxKyOXBhY2thZ2UgZm9yZ2UKCmltcG9ydCAoCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgoJImduby5sYW5kL3AvbnQvdXJlcXVpcmUvdjAiCikKCi8vIG9wZW5DaGFuZ2Ugc2V0cyB1cCBhIHJlcG8gd2l0aCBtYWluIGF0IG9pZCgiYSIpIGFuZCBvbmUgb3BlbiBjaGFuZ2UgcHJvcG9zaW5nCi8vIG9pZCgiYiIpLCBhdXRob3JlZCBieSBjYXJvbCAoYSB3cml0ZXIpLgpmdW5jIG9wZW5DaGFuZ2UodCAqdGVzdGluZy5UKSAoKlJlcG8sICpDaGFuZ2UpIHsKCXQuSGVscGVyKCkKCV8sIHIgOj0gbmV3UmVwbyh0KQoJXywgZXJyIDo9IHIuU2V0UmVmKGFsaWNlLCAxMDAsICJyZWZzL2hlYWRzL21haW4iLCAiIiwgb2lkKCJhIiksICJpbml0aWFsIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJYywgZXJyIDo9IHIuT3BlbkNoYW5nZShjYXJvbCwgMTAxLCAiYWRkIHRoZSBsb2ciLCAiY2xvc2VzICMxIiwgIiIsICJyZWZzL2hlYWRzL2ZlYXQiLCBvaWQoImIiKSwgInJlZnMvaGVhZHMvbWFpbiIpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCXJldHVybiByLCBjCn0KCmZ1bmMgVGVzdE9wZW5DaGFuZ2VWYWxpZGF0aW9uKHQgKnRlc3RpbmcuVCkgewoJXywgciA6PSBuZXdSZXBvKHQpCgoJXywgZXJyIDo9IHIuT3BlbkNoYW5nZShldmUsIDEwMSwgIiIsICIiLCAiIiwgIiIsIG9pZCgiYiIpLCAicmVmcy9oZWFkcy9tYWluIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyckludmFsaWRUZXh0KQoJXywgZXJyID0gci5PcGVuQ2hhbmdlKGV2ZSwgMTAxLCAidCIsICIiLCAiIiwgIiIsICJiZWVmIiwgInJlZnMvaGVhZHMvbWFpbiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJJbnZhbGlkT0lEKQoJXywgZXJyID0gci5PcGVuQ2hhbmdlKGV2ZSwgMTAxLCAidCIsICIiLCAiIiwgIiIsIG9pZCgiYiIpLCAibWFpbiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJJbnZhbGlkUmVmTmFtZSkKCV8sIGVyciA9IHIuT3BlbkNoYW5nZShldmUsIDEwMSwgInQiLCAiIiwgIk5PVC9hbi9pZCIsICIiLCBvaWQoImIiKSwgInJlZnMvaGVhZHMvbWFpbiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJJbnZhbGlkUmVwb0lEKQoKCS8vIEEgZm9yayBvciBhIHBsYWluIGdpdCByZW1vdGUgYXJlIGJvdGggbGVnYWwgc291cmNlczogdGhlIG9iamVjdHMgbGl2ZQoJLy8gb2ZmIGNoYWluIGVpdGhlciB3YXkuCgljLCBlcnIgOj0gci5PcGVuQ2hhbmdlKGV2ZSwgMTAxLCAiZnJvbSBhIGZvcmsiLCAiIiwgImV2ZS9mb3JnZSIsICJyZWZzL2hlYWRzL2ZlYXQiLCBvaWQoImIiKSwgInJlZnMvaGVhZHMvbWFpbiIpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgU3RhdGVPcGVuLCBjLlN0YXRlKQoJYzIsIGVyciA6PSByLk9wZW5DaGFuZ2UoZXZlLCAxMDEsICJmcm9tIGEgcmVtb3RlIiwgIiIsICJodHRwczovL2V4YW1wbGUuY29tL3guZ2l0IiwgInJlZnMvaGVhZHMvZmVhdCIsIG9pZCgiYiIpLCAicmVmcy9oZWFkcy9tYWluIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxKSwgYzIuSUQpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIHIuT3BlbkNoYW5nZUNvdW50KCkpCn0KCmZ1bmMgVGVzdEFwcHJvdmFsc0FyZUJvdW5kVG9UaGVSZXZpZXdlZE9iamVjdCh0ICp0ZXN0aW5nLlQpIHsKCXIsIGMgOj0gb3BlbkNoYW5nZSh0KQoKCXVyZXF1aXJlLk5vRXJyb3IodCwgci5SZXZpZXdDaGFuZ2UoYm9iLCAxMDIsIDAsIFZlcmRpY3RBcHByb3ZlLCAibGd0bSIpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCByLkNvdW50QXBwcm92YWxzKGMpKQoKCS8vIFB1c2ggYSBuZXcgaGVhZDogdGhlIGFwcHJvdmFsIG5hbWVkIGFuIG9iamVjdCB0aGF0IGlzIG5vIGxvbmdlciB3aGF0CgkvLyB3b3VsZCBiZSBtZXJnZWQsIHNvIGl0IHN0b3BzIGNvdW50aW5nLiBOb3RoaW5nIGhhZCB0byByZW1lbWJlciB0bwoJLy8gZGlzbWlzcyBpdC4KCXVyZXF1aXJlLk5vRXJyb3IodCwgci5VcGRhdGVDaGFuZ2VIZWFkKGNhcm9sLCAxMDMsIDAsIG9pZCgiYyIpKSkKCXVhc3NlcnQuRXF1YWwodCwgMCwgci5Db3VudEFwcHJvdmFscyhjKSkKCXVhc3NlcnQuVHJ1ZSh0LCBjLlN0YWxlKGMuUmV2aWV3KGJvYikpKQoKCXVyZXF1aXJlLk5vRXJyb3IodCwgci5SZXZpZXdDaGFuZ2UoYm9iLCAxMDQsIDAsIFZlcmRpY3RBcHByb3ZlLCAic3RpbGwgbGd0bSIpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCByLkNvdW50QXBwcm92YWxzKGMpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCBjLlJldmlld0NvdW50KCksICJvbmUgdmVyZGljdCBwZXIgcmV2aWV3ZXIsIGxhdGVzdCB3aW5zIikKfQoKZnVuYyBUZXN0QXBwcm92YWxXZWlnaHQodCAqdGVzdGluZy5UKSB7CglyLCBjIDo9IG9wZW5DaGFuZ2UodCkKCgkvLyBBbnlvbmUgbWF5IHJldmlldzsgb25seSBhIHdyaXRlcidzIGFwcHJvdmFsIGNvdW50cyB0b3dhcmQgcG9saWN5LgoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlJldmlld0NoYW5nZShldmUsIDEwMiwgMCwgVmVyZGljdEFwcHJvdmUsICJhcyBhIHVzZXI6IHdvcmtzIikpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuUmV2aWV3Q2hhbmdlKGRhdmUsIDEwMiwgMCwgVmVyZGljdEFwcHJvdmUsICJyZWFkZXIgaGVyZSIpKQoJdWFzc2VydC5FcXVhbCh0LCAyLCBjLlJldmlld0NvdW50KCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIHIuQ291bnRBcHByb3ZhbHMoYyksICJ1bnByaXZpbGVnZWQgcmV2aWV3IGlzIHNpZ25hbCwgbm90IGF1dGhvcml0eSIpCgoJLy8gVGhlIGF1dGhvciBjYW5ub3QgYXBwcm92ZSB0aGVpciBvd24gY2hhbmdlLCB1bmxlc3MgdGhlIHJlcG8gc2F5cyBzby4KCXVhc3NlcnQuRXJyb3JJcyh0LCByLlJldmlld0NoYW5nZShjYXJvbCwgMTAyLCAwLCBWZXJkaWN0QXBwcm92ZSwgIm1pbmUiKSwgRXJyU2VsZkFwcHJvdmFsKQoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlNldFBvbGljeShhbGljZSwgMSwgdHJ1ZSkpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuUmV2aWV3Q2hhbmdlKGNhcm9sLCAxMDIsIDAsIFZlcmRpY3RBcHByb3ZlLCAibWluZSIpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCByLkNvdW50QXBwcm92YWxzKGMpKQoKCXVhc3NlcnQuRXJyb3JJcyh0LCByLlJldmlld0NoYW5nZShib2IsIDEwMiwgMCwgImxndG0/IiwgIiIpLCBFcnJJbnZhbGlkVmVyZGljdCkKCXVhc3NlcnQuRXJyb3JJcyh0LCByLlJldmlld0NoYW5nZShib2IsIDEwMiwgOSwgVmVyZGljdEFwcHJvdmUsICIiKSwgRXJyQ2hhbmdlTm90Rm91bmQpCn0KCmZ1bmMgVGVzdE1lcmdlUG9saWN5KHQgKnRlc3RpbmcuVCkgewoJciwgYyA6PSBvcGVuQ2hhbmdlKHQpCgoJLy8gRGVmYXVsdCBwb2xpY3kgaXMgb25lIGFwcHJvdmFsLgoJXywgZXJyIDo9IHIuTWVyZ2VDaGFuZ2UoYm9iLCAxMDUsIDAsIG9pZCgiYSIpLCBvaWQoImUiKSwgIm1lcmdlICMwIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyck5vdEVub3VnaEFwcHJvdmFsKQoKCXVyZXF1aXJlLk5vRXJyb3IodCwgci5SZXZpZXdDaGFuZ2UoYm9iLCAxMDYsIDAsIFZlcmRpY3RBcHByb3ZlLCAibGd0bSIpKQoKCS8vIEEgd3JpdGVyIGNhbm5vdCBtZXJnZSwgaG93ZXZlciB3ZWxsIHJldmlld2VkLgoJXywgZXJyID0gci5NZXJnZUNoYW5nZShjYXJvbCwgMTA3LCAwLCBvaWQoImEiKSwgb2lkKCJlIiksICIiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyVW5hdXRob3JpemVkKQoKCS8vIEEgYmxvY2tpbmcgcmV2aWV3IHN0b3BzIHRoZSBtZXJnZSB3aGlsZSBpdCBzdGFuZHMuCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuUmV2aWV3Q2hhbmdlKGFsaWNlLCAxMDcsIDAsIFZlcmRpY3RSZXF1ZXN0Q2hhbmdlcywgIm5lZWRzIGEgdGVzdCIpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCByLkNvdW50QmxvY2tpbmcoYykpCglfLCBlcnIgPSByLk1lcmdlQ2hhbmdlKGJvYiwgMTA4LCAwLCBvaWQoImEiKSwgb2lkKCJlIiksICIiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyQ2hhbmdlc1JlcXVlc3RlZCkKCXVyZXF1aXJlLk5vRXJyb3IodCwgci5SZXZpZXdDaGFuZ2UoYWxpY2UsIDEwOSwgMCwgVmVyZGljdEFwcHJvdmUsICJ0ZXN0IGFkZGVkIikpCgoJLy8gVGhlIGJhc2UgbW92ZWQ6IHRoZSBjaGFuZ2Ugd2FzIGFwcHJvdmVkIGFnYWluc3QgYSB0cmVlIHRoYXQgbm8gbG9uZ2VyCgkvLyBleGlzdHMsIHNvIHRoZSBtZXJnZSBpcyByZWZ1c2VkIHJhdGhlciB0aGFuIHNpbGVudGx5IHJlYmFzZWQuCglfLCBlcnIgPSByLk1lcmdlQ2hhbmdlKGJvYiwgMTEwLCAwLCBvaWQoIjkiKSwgb2lkKCJlIiksICIiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyU3RhbGVSZWYpCgoJZSwgZXJyIDo9IHIuTWVyZ2VDaGFuZ2UoYm9iLCAxMTEsIDAsIG9pZCgiYSIpLCBvaWQoImUiKSwgIm1lcmdlIGNoYW5nZSAwIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJdWFzc2VydC5FcXVhbCh0LCBLaW5kTWVyZ2UsIGUuS2luZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIGUuQ2hhbmdlSUQsICJ0aGUgbG9nIGVudHJ5IG5hbWVzIHRoZSBjaGFuZ2UgaXQgY2FtZSBmcm9tIikKCXVhc3NlcnQuRXF1YWwodCwgb2lkKCJhIiksIGUuT2xkT0lEKQoJdWFzc2VydC5FcXVhbCh0LCBvaWQoImUiKSwgci5SZWYoInJlZnMvaGVhZHMvbWFpbiIpLk9JRCwgInRoZSByZWYgbW92ZWQiKQoJdWFzc2VydC5FcXVhbCh0LCBTdGF0ZU1lcmdlZCwgYy5TdGF0ZSkKCXVhc3NlcnQuRXF1YWwodCwgYm9iLlN0cmluZygpLCBjLk1lcmdlZEJ5LlN0cmluZygpKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgxMTEpLCBjLk1lcmdlZEF0KQoJdWFzc2VydC5FcXVhbCh0LCAwLCByLk9wZW5DaGFuZ2VDb3VudCgpKQoKCW9rLCBfIDo9IHIuVmVyaWZ5TG9nKCkKCXVhc3NlcnQuVHJ1ZSh0LCBvaykKCgkvLyBBIG1lcmdlZCBjaGFuZ2UgaXMgY2xvc2VkIHRvIGV2ZXJ5dGhpbmcuCglfLCBlcnIgPSByLk1lcmdlQ2hhbmdlKGJvYiwgMTEyLCAwLCBvaWQoImUiKSwgb2lkKCJmIiksICIiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyQ2hhbmdlTm90T3BlbikKCXVhc3NlcnQuRXJyb3JJcyh0LCByLlVwZGF0ZUNoYW5nZUhlYWQoY2Fyb2wsIDExMiwgMCwgb2lkKCJkIikpLCBFcnJDaGFuZ2VOb3RPcGVuKQoJdWFzc2VydC5FcnJvcklzKHQsIHIuUmV2aWV3Q2hhbmdlKGJvYiwgMTEyLCAwLCBWZXJkaWN0QXBwcm92ZSwgIiIpLCBFcnJDaGFuZ2VOb3RPcGVuKQoJdWFzc2VydC5FcnJvcklzKHQsIHIuQ2xvc2VDaGFuZ2UoY2Fyb2wsIDExMiwgMCksIEVyckNoYW5nZU5vdE9wZW4pCn0KCmZ1bmMgVGVzdE1lcmdlQ3JlYXRlc01pc3NpbmdSZWYodCAqdGVzdGluZy5UKSB7CglfLCByIDo9IG5ld1JlcG8odCkKCWMsIGVyciA6PSByLk9wZW5DaGFuZ2UoY2Fyb2wsIDEwMSwgImZpcnN0IGJyYW5jaCIsICIiLCAiIiwgInJlZnMvaGVhZHMvZmVhdCIsIG9pZCgiYiIpLCAicmVmcy9oZWFkcy9tYWluIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlNldFBvbGljeShhbGljZSwgMCwgZmFsc2UpKQoKCV8sIGVyciA9IHIuTWVyZ2VDaGFuZ2UoYm9iLCAxMDIsIDAsIG9pZCgiYSIpLCBvaWQoImIiKSwgIiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJSZWZOb3RGb3VuZCwgImEgdGFyZ2V0IHRoYXQgZG9lcyBub3QgZXhpc3QgdGFrZXMgbm8gZXhwZWN0YXRpb24iKQoKCWUsIGVyciA6PSByLk1lcmdlQ2hhbmdlKGJvYiwgMTAzLCAwLCAiIiwgb2lkKCJiIiksICJmaXJzdCBtZXJnZSIpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgS2luZE1lcmdlLCBlLktpbmQpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBlLk9sZE9JRCkKCXVhc3NlcnQuRXF1YWwodCwgb2lkKCJiIiksIHIuUmVmKCJyZWZzL2hlYWRzL21haW4iKS5PSUQpCgl1YXNzZXJ0LkVxdWFsKHQsIFN0YXRlTWVyZ2VkLCBjLlN0YXRlKQp9CgpmdW5jIFRlc3RDaGFuZ2VDb21tZW50c0FuZENsb3NlKHQgKnRlc3RpbmcuVCkgewoJciwgYyA6PSBvcGVuQ2hhbmdlKHQpCgoJY20sIGVyciA6PSByLkNvbW1lbnRDaGFuZ2UoZXZlLCAxMDIsIDAsICJkb2VzIHRoaXMgY292ZXIgdGhlIGZvcmNlIGNhc2U/IikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgY20uSUQpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGMuQ29tbWVudENvdW50KCkpCglfLCBlcnIgPSByLkNvbW1lbnRDaGFuZ2UoZXZlLCAxMDIsIDAsICIiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJySW52YWxpZFRleHQpCgoJdWFzc2VydC5FcnJvcklzKHQsIHIuQ2xvc2VDaGFuZ2UoZXZlLCAxMDMsIDApLCBFcnJVbmF1dGhvcml6ZWQpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuQ2xvc2VDaGFuZ2UoY2Fyb2wsIDEwMywgMCksICJ0aGUgYXV0aG9yIG1heSB3aXRoZHJhdyIpCgl1YXNzZXJ0LkVxdWFsKHQsIFN0YXRlQ2xvc2VkLCBjLlN0YXRlKQoKCXVhc3NlcnQuVHJ1ZSh0LCByLkNoYW5nZSg0MikgPT0gbmlsKQoJdWFzc2VydC5FcnJvcklzKHQsIHIuVXBkYXRlQ2hhbmdlSGVhZChjYXJvbCwgMTA0LCA0Miwgb2lkKCJkIikpLCBFcnJDaGFuZ2VOb3RGb3VuZCkKfQoKZnVuYyBUZXN0Q2hhbmdlSXRlcmF0aW9uSXNOZXdlc3RGaXJzdCh0ICp0ZXN0aW5nLlQpIHsKCV8sIHIgOj0gbmV3UmVwbyh0KQoJZm9yIF8sIHRpdGxlIDo9IHJhbmdlIFtdc3RyaW5neyJvbmUiLCAidHdvIiwgInRocmVlIn0gewoJCV8sIGVyciA6PSByLk9wZW5DaGFuZ2UoY2Fyb2wsIDEwMSwgdGl0bGUsICIiLCAiIiwgIiIsIG9pZCgiYiIpLCAicmVmcy9oZWFkcy9tYWluIikKCQl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCX0KCgl2YXIgZ290IFtdc3RyaW5nCglyLkl0ZXJhdGVDaGFuZ2VzKDAsIDAsIGZ1bmMoYyAqQ2hhbmdlKSBib29sIHsKCQlnb3QgPSBhcHBlbmQoZ290LCBjLlRpdGxlKQoJCXJldHVybiBmYWxzZQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgInRocmVlLHR3byxvbmUiLCBqb2luKGdvdCkpCgoJdmFyIHJldmlld2VycyBbXXN0cmluZwoJYyA6PSByLkNoYW5nZSgwKQoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlJldmlld0NoYW5nZShib2IsIDEwMiwgMCwgVmVyZGljdEFwcHJvdmUsICIiKSkKCXVyZXF1aXJlLk5vRXJyb3IodCwgci5SZXZpZXdDaGFuZ2UoYWxpY2UsIDEwMiwgMCwgVmVyZGljdENvbW1lbnQsICIiKSkKCWMuSXRlcmF0ZVJldmlld3MoZnVuYyhydiAqUmV2aWV3KSBib29sIHsKCQlyZXZpZXdlcnMgPSBhcHBlbmQocmV2aWV3ZXJzLCBydi5WZXJkaWN0KQoJCXJldHVybiBmYWxzZQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgMiwgbGVuKHJldmlld2VycykpCn0KGogSCgplcnJvcnMuZ25vEvkRcGFja2FnZSBmb3JnZQoKaW1wb3J0ICJlcnJvcnMiCgovLyBTdGFibGUsIG1hY2hpbmUtcmVhZGFibGUgZXJyb3IgdmFsdWVzLiBDYWxsZXJzIChyZWFsbXMsIGNsaWVudHMsIGluZGV4ZXJzKQovLyBzaG91bGQgc3dpdGNoIG9uIHRoZXNlIHJhdGhlciB0aGFuIG9uIG1lc3NhZ2UgdGV4dDogYSByZWFsbSB0dXJucyB0aGVtIGludG8KLy8gcGFuaWNzLCBhbmQgdGhlIHBhbmljIHN0cmluZyBpcyB0aGUgb25seSB0aGluZyBhIHVzZXIgc2Vlcy4KdmFyICgKCUVyckludmFsaWRSZXBvSUQgICAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IGludmFsaWQgcmVwbyBpZCIpCglFcnJJbnZhbGlkUmVmTmFtZSAgICA9IGVycm9ycy5OZXcoImZvcmdlOiBpbnZhbGlkIHJlZiBuYW1lIikKCUVyckludmFsaWRPSUQgICAgICAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IGludmFsaWQgb2JqZWN0IGlkIikKCUVyckludmFsaWRUZXh0ICAgICAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IGludmFsaWQgdGV4dCIpCglFcnJJbnZhbGlkUm9sZSAgICAgICA9IGVycm9ycy5OZXcoImZvcmdlOiBpbnZhbGlkIHJvbGUiKQoJRXJySW52YWxpZFZlcmRpY3QgICAgPSBlcnJvcnMuTmV3KCJmb3JnZTogaW52YWxpZCByZXZpZXcgdmVyZGljdCIpCglFcnJJbnZhbGlkTWlycm9yICAgICA9IGVycm9ycy5OZXcoImZvcmdlOiBpbnZhbGlkIG1pcnJvciBsb2NhdG9yIikKCUVyclRvb0xvbmcgICAgICAgICAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IHZhbHVlIHRvbyBsb25nIikKCUVyclRvb01hbnkgICAgICAgICAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IHRvbyBtYW55IGVudHJpZXMiKQoJRXJyUmVwb0V4aXN0cyAgICAgICAgPSBlcnJvcnMuTmV3KCJmb3JnZTogcmVwbyBhbHJlYWR5IGV4aXN0cyIpCglFcnJSZXBvTm90Rm91bmQgICAgICA9IGVycm9ycy5OZXcoImZvcmdlOiByZXBvIG5vdCBmb3VuZCIpCglFcnJSZXBvQXJjaGl2ZWQgICAgICA9IGVycm9ycy5OZXcoImZvcmdlOiByZXBvIGlzIGFyY2hpdmVkIikKCUVyclJlZk5vdEZvdW5kICAgICAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IHJlZiBub3QgZm91bmQiKQoJRXJyUmVmRXhpc3RzICAgICAgICAgPSBlcnJvcnMuTmV3KCJmb3JnZTogcmVmIGFscmVhZHkgZXhpc3RzIikKCUVyclN0YWxlUmVmICAgICAgICAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IHN0YWxlIHJlZiAoY29tcGFyZS1hbmQtc3dhcCBmYWlsZWQpIikKCUVyclVuYXV0aG9yaXplZCAgICAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IHVuYXV0aG9yaXplZCIpCglFcnJJc3N1ZU5vdEZvdW5kICAgICA9IGVycm9ycy5OZXcoImZvcmdlOiBpc3N1ZSBub3QgZm91bmQiKQoJRXJySXNzdWVDbG9zZWQgICAgICAgPSBlcnJvcnMuTmV3KCJmb3JnZTogaXNzdWUgaXMgY2xvc2VkIikKCUVyckNoYW5nZU5vdEZvdW5kICAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IGNoYW5nZSBub3QgZm91bmQiKQoJRXJyQ2hhbmdlTm90T3BlbiAgICAgPSBlcnJvcnMuTmV3KCJmb3JnZTogY2hhbmdlIGlzIG5vdCBvcGVuIikKCUVyclNlbGZBcHByb3ZhbCAgICAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IHNlbGYtYXBwcm92YWwgaXMgbm90IGFsbG93ZWQiKQoJRXJyTm90RW5vdWdoQXBwcm92YWwgPSBlcnJvcnMuTmV3KCJmb3JnZTogbm90IGVub3VnaCBhcHByb3ZhbHMiKQoJRXJyQ2hhbmdlc1JlcXVlc3RlZCAgPSBlcnJvcnMuTmV3KCJmb3JnZTogY2hhbmdlcyByZXF1ZXN0ZWQgYnkgYSByZXZpZXdlciIpCglFcnJTYW1lT0lEICAgICAgICAgICA9IGVycm9ycy5OZXcoImZvcmdlOiByZWYgYWxyZWFkeSBwb2ludHMgYXQgdGhhdCBvYmplY3QiKQoJRXJyTGFzdE93bmVyICAgICAgICAgPSBlcnJvcnMuTmV3KCJmb3JnZTogY2Fubm90IGRlbW90ZSB0aGUgbGFzdCBvd25lciIpCglFcnJJbnZhbGlkUGtnUGF0aCAgICA9IGVycm9ycy5OZXcoImZvcmdlOiBpbnZhbGlkIHBhY2thZ2UgcGF0aCIpCglFcnJJbnZhbGlkVGFnICAgICAgICA9IGVycm9ycy5OZXcoImZvcmdlOiBpbnZhbGlkIHJlbGVhc2UgdGFnIikKCUVyclBhY2thZ2VDbGFpbWVkICAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IHBhY2thZ2UgcGF0aCBpcyBjbGFpbWVkIGJ5IGFub3RoZXIgcmVwbyIpCglFcnJQYWNrYWdlTm90Rm91bmQgICA9IGVycm9ycy5OZXcoImZvcmdlOiBwYWNrYWdlIG5vdCBmb3VuZCIpCglFcnJSZWxlYXNlRXhpc3RzICAgICA9IGVycm9ycy5OZXcoImZvcmdlOiByZWxlYXNlIGFscmVhZHkgZXhpc3RzIikKCUVyclJlbGVhc2VOb3RGb3VuZCAgID0gZXJyb3JzLk5ldygiZm9yZ2U6IHJlbGVhc2Ugbm90IGZvdW5kIikKKQoaj2AKCWZvcmdlLmdubxKBYC8vIFBhY2thZ2UgZm9yZ2UgaXMgdGhlIGRvbWFpbiBlbmdpbmUgb2YgYW4gb24tY2hhaW4gc29mdHdhcmUgZm9yZ2U6IHJlcG9zLAovLyByb2xlcywgYW4gYXBwZW5kLW9ubHkgcmVmZXJlbmNlIGxvZywgaXNzdWVzIGFuZCBjaGFuZ2UgcmVxdWVzdHMgKHB1bGwKLy8gcmVxdWVzdHMpLCB3aXRoIG5vIGNoYWluIGltcG9ydHMgb2YgaXRzIG93bi4KLy8KLy8gV2hhdCBpdCBkb2VzIE5PVCBkbywgb24gcHVycG9zZTogc3RvcmUgYmxvYnMsIHRyZWVzIG9yIHBhY2tmaWxlcy4gR2l0IG9iamVjdHMKLy8gc3RheSB3aGVyZXZlciBnaXQgYWxyZWFkeSBwdXRzIHRoZW0gKGEgbWlycm9yLCBhbiBJUEZTIENJRCwgYSBwZWVyKSBhbmQgdGhpcwovLyBwYWNrYWdlIHJlY29yZHMgd2hhdCBhIGZvcmdlIGlzIGFjdHVhbGx5IHRydXN0ZWQgZm9yIGFuZCB3aGF0IGdpdCBhbG9uZSBkb2VzCi8vIG5vdCBhdXRoZW50aWNhdGU6Ci8vCi8vICAxLiB3aGljaCBvYmplY3QgaWQgYSByZWYgcG9pbnRzIGF0LCBpbiB3aGF0IG9yZGVyIGl0IGdvdCB0aGVyZSwgYW5kIHdobyBzYWlkCi8vICAgICBzbzogYW4gYXBwZW5kLW9ubHksIGhhc2gtY2hhaW5lZCByZWZlcmVuY2UgbG9nICh0aGUgc2FtZSBzaGFwZSBhcwovLyAgICAgZ2l0dHVmJ3MgcmVmZXJlbmNlIHN0YXRlIGxvZywgd2l0aCBjb25zZW5zdXMgcGxheWluZyB0aGUgbm90YXJ5KTsKLy8gIDIuIHdobyBpcyBhbGxvd2VkIHRvIG1vdmUgd2hpY2ggcmVmLCBhbmQgdW5kZXIgd2hhdCByZXZpZXcgcG9saWN5OwovLyAgMy4gdGhlIHNvY2lhbCBsYXllcjogaXNzdWVzLCBjaGFuZ2UgcmVxdWVzdHMsIHJldmlld3M6IGJvdW5kIHRvIGFkZHJlc3NlcwovLyAgICAgcmF0aGVyIHRoYW4gdG8gcGxhdGZvcm0gYWNjb3VudHM7Ci8vICA0LiB0aGUgbWVyZ2UgZGVjaXNpb24gaXRzZWxmLCByZWNvcmRlZCBhcyBvbmUgbW9yZSBlbnRyeSBpbiB0aGUgc2FtZSBsb2cuCi8vCi8vIFRoZSBjaGFpbiBjYW5ub3Qgc2VlIHRoZSBvYmplY3QgZ3JhcGgsIHNvIGl0IGNhbm5vdCB2ZXJpZnkgdGhhdCBhIG5ldyB0aXAKLy8gZGVzY2VuZHMgZnJvbSB0aGUgb2xkIG9uZS4gSXQgZG9lcyBub3QgcHJldGVuZCB0bzogZXZlcnkgcmVmIG1vdmUgaXMgYQovLyBjb21wYXJlLWFuZC1zd2FwIGFnYWluc3QgdGhlIHRpcCB0aGUgY2FsbGVyIGV4cGVjdGVkIChnaXQncwovLyAtLWZvcmNlLXdpdGgtbGVhc2UsIG1vdmVkIHNvbWV3aGVyZSB0aGUgZm9yZ2Ugb3BlcmF0b3IgY2Fubm90IHJld3JpdGUpLCBhbnkKLy8gbW92ZSB0aGF0IGFiYW5kb25zIHRoYXQgZGlzY2lwbGluZSBpcyByZWNvcmRlZCBhcyBhIGZvcmNlLCBhbmQgYW5jZXN0cnkgaXMKLy8gY2hlY2tlZCBieSBhIGNsaWVudCB0aGF0IGhhcyB0aGUgb2JqZWN0cy4gT3JkZXJpbmcsIGF0dHJpYnV0aW9uIGFuZCBwb2xpY3kKLy8gYXJlIG9uIGNoYWluOyBwcm9vZiBpcyBsb2NhbC4KLy8KLy8gQWxsIHN0YXRlIGxpdmVzIGluIGF2bCB0cmVlcyBzbyBldmVyeSBsaXN0aW5nIGlzIG9yZGVyZWQgYW5kIHBhZ2luYXRhYmxlLCBhbmQKLy8gZXZlcnkgbXV0YXRpb24gdGFrZXMgdGhlIGFjdG9yIGFuZCB0aGUgYmxvY2sgaGVpZ2h0IGZyb20gdGhlIGNhbGxlcjogdGhlCi8vIHBhY2thZ2UgaXMgcHVyZSwgZGV0ZXJtaW5pc3RpYyBhbmQgdW5pdC10ZXN0YWJsZSB3aXRob3V0IGEgY2hhaW4uCi8vCi8vIExpdmUgZGVtbzogZ25vLmxhbmQvci9tb3VsL2ZvcmdlL3YwLgpwYWNrYWdlIGZvcmdlCgppbXBvcnQgKAoJInN0cmNvbnYiCgkic3RyaW5ncyIKCgkiZ25vLmxhbmQvcC9udC9hdmwvdjAiCikKCi8vIFJvbGUgaXMgYSByZXBvLXNjb3BlZCBjYXBhYmlsaXR5IGxldmVsLiBSb2xlcyBhcmUgdG90YWxseSBvcmRlcmVkOiBldmVyeQovLyBjaGVjayBpcyAiYXQgbGVhc3QgdGhpcyByb2xlIiwgc28gdGhlcmUgaXMgb25lIGNvbXBhcmlzb24gdG8gYXVkaXQuCnR5cGUgUm9sZSBpbnQKCmNvbnN0ICgKCVJvbGVOb25lICAgICAgIFJvbGUgPSBpb3RhIC8vIG5vdCBhIG1lbWJlcgoJUm9sZVJlYWRlciAgICAgICAgICAgICAgICAgLy8gZXhwbGljaXQgcmVhZCAoYWxsIHJlcG9zIGFyZSBwdWJsaWMgaW4gdjApCglSb2xlV3JpdGVyICAgICAgICAgICAgICAgICAvLyBtb3ZlIG5vbi1wcm90ZWN0ZWQgcmVmcywgdXBkYXRlIG93biBjaGFuZ2VzCglSb2xlTWFpbnRhaW5lciAgICAgICAgICAgICAvLyBmb3JjZS1tb3ZlIHJlZnMsIG1lcmdlIGNoYW5nZXMsIHRyaWFnZSBpc3N1ZXMKCVJvbGVBZG1pbiAgICAgICAgICAgICAgICAgIC8vIG1hbmFnZSBtZW1iZXJzIGFuZCByZXBvIHNldHRpbmdzCglSb2xlT3duZXIgICAgICAgICAgICAgICAgICAvLyBhZG1pbiArIHRyYW5zZmVyOyBhdCBsZWFzdCBvbmUgYWx3YXlzIGV4aXN0cwopCgovLyBTdHJpbmcgcmVuZGVycyB0aGUgcm9sZSBhcyB0aGUgbG93ZXJjYXNlIHRva2VuIHVzZWQgYnkgdGhlIHJlYWxtIEFQSS4KZnVuYyAociBSb2xlKSBTdHJpbmcoKSBzdHJpbmcgewoJc3dpdGNoIHIgewoJY2FzZSBSb2xlUmVhZGVyOgoJCXJldHVybiAicmVhZGVyIgoJY2FzZSBSb2xlV3JpdGVyOgoJCXJldHVybiAid3JpdGVyIgoJY2FzZSBSb2xlTWFpbnRhaW5lcjoKCQlyZXR1cm4gIm1haW50YWluZXIiCgljYXNlIFJvbGVBZG1pbjoKCQlyZXR1cm4gImFkbWluIgoJY2FzZSBSb2xlT3duZXI6CgkJcmV0dXJuICJvd25lciIKCWRlZmF1bHQ6CgkJcmV0dXJuICJub25lIgoJfQp9CgovLyBQYXJzZVJvbGUgaXMgdGhlIGludmVyc2Ugb2YgUm9sZS5TdHJpbmcuCmZ1bmMgUGFyc2VSb2xlKHMgc3RyaW5nKSAoUm9sZSwgZXJyb3IpIHsKCXN3aXRjaCBzIHsKCWNhc2UgIm5vbmUiOgoJCXJldHVybiBSb2xlTm9uZSwgbmlsCgljYXNlICJyZWFkZXIiOgoJCXJldHVybiBSb2xlUmVhZGVyLCBuaWwKCWNhc2UgIndyaXRlciI6CgkJcmV0dXJuIFJvbGVXcml0ZXIsIG5pbAoJY2FzZSAibWFpbnRhaW5lciI6CgkJcmV0dXJuIFJvbGVNYWludGFpbmVyLCBuaWwKCWNhc2UgImFkbWluIjoKCQlyZXR1cm4gUm9sZUFkbWluLCBuaWwKCWNhc2UgIm93bmVyIjoKCQlyZXR1cm4gUm9sZU93bmVyLCBuaWwKCX0KCXJldHVybiBSb2xlTm9uZSwgRXJySW52YWxpZFJvbGUKfQoKLy8gRm9yZ2UgaXMgdGhlIHRvcC1sZXZlbCByZWdpc3RyeTogcmVwbyBpZCAtPiByZXBvLgp0eXBlIEZvcmdlIHN0cnVjdCB7CglyZXBvcyAqYXZsLlRyZWUgLy8gIjxuYW1lc3BhY2U+LzxuYW1lPiIgLT4gKlJlcG8KCS8vIHBhY2thZ2VzIGlzIHRoZSBmb3JnZS13aWRlIGluZGV4IGJlaGluZCBQYWNrYWdlUmVwbzogYSBkZXBsb3llZCBwYWNrYWdlCgkvLyBwYXRoIHJlc29sdmVzIHRvIHRoZSByZXBvIGNsYWltaW5nIGl0IHdpdGhvdXQgc2Nhbm5pbmcgZXZlcnkgcmVwby4gSXQKCS8vIGxpdmVzIGhlcmUgcmF0aGVyIHRoYW4gb25seSBvbiB0aGUgcmVwbyBiZWNhdXNlIHRoZSBxdWVzdGlvbiBhbiBleHBsb3JlcgoJLy8gYXNrcyBzdGFydHMgZnJvbSB0aGUgcGF0aCBhbmQgZG9lcyBub3Qga25vdyB0aGUgcmVwbyB5ZXQuCglwYWNrYWdlcyAqYXZsLlRyZWUgLy8gcGFja2FnZSBwYXRoIC0+ICpQYWNrYWdlCn0KCi8vIE5ldyByZXR1cm5zIGFuIGVtcHR5IGZvcmdlLgpmdW5jIE5ldygpICpGb3JnZSB7CglyZXR1cm4gJkZvcmdle3JlcG9zOiBhdmwuTmV3VHJlZSgpLCBwYWNrYWdlczogYXZsLk5ld1RyZWUoKX0KfQoKLy8gUmVwbyBpcyBvbmUgcmVwb3NpdG9yeS4gTm90aGluZyBoZXJlIGlzIHRoZSBjb2RlOiBNaXJyb3JzIHNheXMgd2hlcmUgdGhlCi8vIG9iamVjdHMgY2FuIGJlIGZldGNoZWQsIFJlZnMgc2F5cyB3aGF0IHRoZSBvYmplY3RzIGFyZSBzdXBwb3NlZCB0byBiZS4KdHlwZSBSZXBvIHN0cnVjdCB7CglJRCAgICAgICAgICBzdHJpbmcgLy8gIjxuYW1lc3BhY2U+LzxuYW1lPiIsIGltbXV0YWJsZQoJRGVzY3JpcHRpb24gc3RyaW5nCglEZWZhdWx0UmVmICBzdHJpbmcgLy8gZnVsbHktcXVhbGlmaWVkLCBlLmcuICJyZWZzL2hlYWRzL21haW4iCglNaXJyb3JzICAgICBbXXN0cmluZwoJUGFyZW50SUQgICAgc3RyaW5nIC8vIGZvcmsgbGluZWFnZSwgIiIgZm9yIGEgcm9vdCByZXBvCglDcmVhdGVkQXQgICBpbnQ2NCAgLy8gYmxvY2sgaGVpZ2h0CglBcmNoaXZlZCAgICBib29sCgoJLy8gTWVyZ2UgcG9saWN5LgoJUmVxdWlyZWRBcHByb3ZhbHMgaW50ICAvLyBhcHByb3ZhbHMgbmVlZGVkIHRvIG1lcmdlIGEgY2hhbmdlCglBbGxvd1NlbGZBcHByb3ZhbCBib29sIC8vIG1heSB0aGUgY2hhbmdlIGF1dGhvcidzIG93biBhcHByb3ZhbCBjb3VudAoKCW1lbWJlcnMgKmF2bC5UcmVlIC8vIGFkZHJlc3Mgc3RyaW5nIC0+IFJvbGUKCXJlZnMgICAgKmF2bC5UcmVlIC8vIHJlZiBuYW1lIC0+ICpSZWYKCWxvZyAgICAgKmF2bC5UcmVlIC8vIHBhZGRlZCBzZXEgLT4gKkxvZ0VudHJ5IChhcHBlbmQtb25seSkKCWlzc3VlcyAgKmF2bC5UcmVlIC8vIHBhZGRlZCBpZCAtPiAqSXNzdWUKCWNoYW5nZXMgKmF2bC5UcmVlIC8vIHBhZGRlZCBpZCAtPiAqQ2hhbmdlCgoJcGFja2FnZXMgKmF2bC5UcmVlIC8vIHBhY2thZ2UgcGF0aCAtPiAqUGFja2FnZSAodGhpcyByZXBvJ3MgaGFsZiBvZiB0aGUgaW5kZXgpCglyZWxlYXNlcyAqYXZsLlRyZWUgLy8gdGFnIC0+ICpSZWxlYXNlCgkvLyByZWxlYXNlT3JkZXIgaXMgY3V0IG9yZGVyLCB3aGljaCBpcyB0aGUgb25seSBvcmRlciB0aGUgZm9yZ2Uga25vd3MgdG8gYmUKCS8vIHRydWUuIFRhZ3MgYXJlIG5vdCByZXF1aXJlZCB0byBiZSBzZW12ZXIsIHNvIHNvcnRpbmcgdGhlIHJlbGVhc2UgdHJlZSBieQoJLy8ga2V5IHdvdWxkIHByZXNlbnQgdjEwIGJlZm9yZSB2MiBhbmQgY2FsbCBpdCBuZXdlc3QuCglyZWxlYXNlT3JkZXIgKmF2bC5UcmVlIC8vIHBhZGRlZCBzZXEgLT4gdGFnCgoJaGVhZCAgICAgICBzdHJpbmcgLy8gZGlnZXN0IG9mIHRoZSBsYXN0IGxvZyBlbnRyeSAoIiIgd2hlbiB0aGUgbG9nIGlzIGVtcHR5KQoJbmV4dFNlcSAgICBpbnQ2NAoJbmV4dElzc3VlICBpbnQ2NAoJbmV4dENoYW5nZSBpbnQ2NAp9CgovLyBDcmVhdGVSZXBvIHJlZ2lzdGVycyBhIHJlcG8gb3duZWQgYnkgYWN0b3IuCmZ1bmMgKGYgKkZvcmdlKSBDcmVhdGVSZXBvKGFjdG9yIGFkZHJlc3MsIGhlaWdodCBpbnQ2NCwgaWQsIGRlc2NyaXB0aW9uLCBkZWZhdWx0UmVmIHN0cmluZykgKCpSZXBvLCBlcnJvcikgewoJaWYgIVZhbGlkUmVwb0lEKGlkKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZFJlcG9JRAoJfQoJaWYgIVZhbGlkVGV4dChkZXNjcmlwdGlvbiwgTWF4RGVzY0xlbikgewoJCXJldHVybiBuaWwsIEVyckludmFsaWRUZXh0Cgl9CglpZiBkZWZhdWx0UmVmID09ICIiIHsKCQlkZWZhdWx0UmVmID0gInJlZnMvaGVhZHMvbWFpbiIKCX0KCWlmICFWYWxpZFJlZk5hbWUoZGVmYXVsdFJlZikgewoJCXJldHVybiBuaWwsIEVyckludmFsaWRSZWZOYW1lCgl9CglpZiBmLnJlcG9zLkhhcyhpZCkgewoJCXJldHVybiBuaWwsIEVyclJlcG9FeGlzdHMKCX0KCXIgOj0gJlJlcG97CgkJSUQ6ICAgICAgICAgICAgICAgIGlkLAoJCURlc2NyaXB0aW9uOiAgICAgICBkZXNjcmlwdGlvbiwKCQlEZWZhdWx0UmVmOiAgICAgICAgZGVmYXVsdFJlZiwKCQlDcmVhdGVkQXQ6ICAgICAgICAgaGVpZ2h0LAoJCVJlcXVpcmVkQXBwcm92YWxzOiAxLAoJCW1lbWJlcnM6ICAgICAgICAgICBhdmwuTmV3VHJlZSgpLAoJCXJlZnM6ICAgICAgICAgICAgICBhdmwuTmV3VHJlZSgpLAoJCWxvZzogICAgICAgICAgICAgICBhdmwuTmV3VHJlZSgpLAoJCWlzc3VlczogICAgICAgICAgICBhdmwuTmV3VHJlZSgpLAoJCWNoYW5nZXM6ICAgICAgICAgICBhdmwuTmV3VHJlZSgpLAoJCS8vIEEgZm9yayByb3V0ZXMgdGhyb3VnaCBoZXJlIHRvbywgYW5kIGluaGVyaXRzIG5laXRoZXI6IHRoZSBwYXJlbnQKCQkvLyBwdWJsaXNoZXMgdGhvc2UgcGFja2FnZSBwYXRocyBhbmQgY3V0IHRob3NlIHJlbGVhc2VzLCBub3QgdGhlIGNoaWxkLgoJCXBhY2thZ2VzOiAgICAgYXZsLk5ld1RyZWUoKSwKCQlyZWxlYXNlczogICAgIGF2bC5OZXdUcmVlKCksCgkJcmVsZWFzZU9yZGVyOiBhdmwuTmV3VHJlZSgpLAoJfQoJci5tZW1iZXJzLlNldChhY3Rvci5TdHJpbmcoKSwgUm9sZU93bmVyKQoJZi5yZXBvcy5TZXQoaWQsIHIpCglyZXR1cm4gciwgbmlsCn0KCi8vIEZvcmsgcmVnaXN0ZXJzIG5ld0lEIGFzIGEgZm9yayBvZiBzcmNJRCBhbmQgY29waWVzIHRoZSBwYXJlbnQncyBjdXJyZW50IHJlZnMKLy8gaW50byB0aGUgY2hpbGQncyBsb2csIHNvIHRoZSBmb3JrIHJlY29yZHMgZXhhY3RseSB3aGF0IGl0IGZvcmtlZCBmcm9tLiBUaGUKLy8gb2JqZWN0cyBhcmUgbm90IGNvcGllZDogdGhleSBuZXZlciB3ZXJlIG9uIGNoYWluOiBzbyB0aGUgY2hpbGQgaW5oZXJpdHMgdGhlCi8vIHBhcmVudCdzIG1pcnJvcnMgYXMgaXRzIGluaXRpYWwgZmV0Y2ggbG9jYXRvcnMuCmZ1bmMgKGYgKkZvcmdlKSBGb3JrKGFjdG9yIGFkZHJlc3MsIGhlaWdodCBpbnQ2NCwgc3JjSUQsIG5ld0lEIHN0cmluZykgKCpSZXBvLCBlcnJvcikgewoJc3JjIDo9IGYuUmVwbyhzcmNJRCkKCWlmIHNyYyA9PSBuaWwgewoJCXJldHVybiBuaWwsIEVyclJlcG9Ob3RGb3VuZAoJfQoJY2hpbGQsIGVyciA6PSBmLkNyZWF0ZVJlcG8oYWN0b3IsIGhlaWdodCwgbmV3SUQsIHNyYy5EZXNjcmlwdGlvbiwgc3JjLkRlZmF1bHRSZWYpCglpZiBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCWNoaWxkLlBhcmVudElEID0gc3JjSUQKCWNoaWxkLk1pcnJvcnMgPSBhcHBlbmQoW11zdHJpbmd7fSwgc3JjLk1pcnJvcnMuLi4pCglub3RlIDo9ICJmb3JrIG9mICIgKyBzcmNJRCArICIgYXQgc2VxICIgKyBzdHJjb252LkZvcm1hdEludChzcmMubmV4dFNlcSwgMTApCglpZiBsZW4obm90ZSkgPiBNYXhOb3RlTGVuIHsKCQlub3RlID0gImZvcmsgb2YgIiArIHNyY0lECgl9CgluIDo9IDAKCXNyYy5yZWZzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcmVmIDo9IHZhbHVlLigqUmVmKQoJCWNoaWxkLmFwcGVuZExvZyhhY3RvciwgaGVpZ2h0LCByZWYuTmFtZSwgIiIsIHJlZi5PSUQsIEtpbmRDcmVhdGUsIDAsIG5vdGUpCgkJY2hpbGQucmVmcy5TZXQocmVmLk5hbWUsICZSZWZ7TmFtZTogcmVmLk5hbWUsIE9JRDogcmVmLk9JRCwgVXBkYXRlZEF0OiBoZWlnaHQsIFVwZGF0ZWRCeTogYWN0b3J9KQoJCW4rKwoJCXJldHVybiBuID49IDMyIC8vIGEgZm9yayByZWNvcmRzIGEgc25hcHNob3QsIG5vdCBhbiB1bmJvdW5kZWQgY29weQoJfSkKCXJldHVybiBjaGlsZCwgbmlsCn0KCi8vIFJlcG8gcmV0dXJucyB0aGUgcmVwbywgb3IgbmlsLgpmdW5jIChmICpGb3JnZSkgUmVwbyhpZCBzdHJpbmcpICpSZXBvIHsKCXYgOj0gZi5yZXBvcy5HZXQoaWQpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoJcmV0dXJuIHYuKCpSZXBvKQp9CgovLyBIYXNSZXBvIHJlcG9ydHMgd2hldGhlciB0aGUgaWQgaXMgdGFrZW4uCmZ1bmMgKGYgKkZvcmdlKSBIYXNSZXBvKGlkIHN0cmluZykgYm9vbCB7IHJldHVybiBmLnJlcG9zLkhhcyhpZCkgfQoKLy8gU2l6ZSBpcyB0aGUgbnVtYmVyIG9mIHJlcG9zLgpmdW5jIChmICpGb3JnZSkgU2l6ZSgpIGludCB7IHJldHVybiBmLnJlcG9zLlNpemUoKSB9CgovLyBJdGVyYXRlUmVwb3Mgd2Fsa3MgcmVwb3MgaW4gaWQgb3JkZXIsIG5ld2VzdC1sYXN0LCBhbmQgc3RvcHMgd2hlbiBjYiByZXR1cm5zCi8vIHRydWUuIG9mZnNldC9jb3VudCBwYWdlIHRoZSB3YWxrOyBjb3VudCA8PSAwIG1lYW5zICJ0byB0aGUgZW5kIi4KZnVuYyAoZiAqRm9yZ2UpIEl0ZXJhdGVSZXBvcyhvZmZzZXQsIGNvdW50IGludCwgY2IgZnVuYygqUmVwbykgYm9vbCkgewoJaWYgY291bnQgPD0gMCB7CgkJY291bnQgPSBmLnJlcG9zLlNpemUoKQoJfQoJZi5yZXBvcy5JdGVyYXRlQnlPZmZzZXQob2Zmc2V0LCBjb3VudCwgZnVuYyhfIHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlyZXR1cm4gY2IodmFsdWUuKCpSZXBvKSkKCX0pCn0KCi8vIEl0ZXJhdGVOYW1lc3BhY2Ugd2Fsa3MgdGhlIHJlcG9zIG9mIG9uZSBuYW1lc3BhY2UgaW4gaWQgb3JkZXIuCmZ1bmMgKGYgKkZvcmdlKSBJdGVyYXRlTmFtZXNwYWNlKG5zIHN0cmluZywgY2IgZnVuYygqUmVwbykgYm9vbCkgewoJZi5yZXBvcy5JdGVyYXRlKG5zKyIvIiwgbnMrIjAiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgeyAvLyAnMCcgaXMgJy8nKzEKCQlyZXR1cm4gY2IodmFsdWUuKCpSZXBvKSkKCX0pCn0KCi8vIFJvbGVPZiByZXR1cm5zIHRoZSBtZW1iZXIncyByb2xlLCBSb2xlTm9uZSB3aGVuIG5vdCBhIG1lbWJlci4KZnVuYyAociAqUmVwbykgUm9sZU9mKGEgYWRkcmVzcykgUm9sZSB7Cgl2IDo9IHIubWVtYmVycy5HZXQoYS5TdHJpbmcoKSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gUm9sZU5vbmUKCX0KCXJldHVybiB2LihSb2xlKQp9CgovLyBDYW4gcmVwb3J0cyB3aGV0aGVyIGEgaG9sZHMgYXQgbGVhc3QgdGhlIGdpdmVuIHJvbGUuCmZ1bmMgKHIgKlJlcG8pIENhbihhIGFkZHJlc3MsIG1pbiBSb2xlKSBib29sIHsgcmV0dXJuIHIuUm9sZU9mKGEpID49IG1pbiB9CgovLyBNZW1iZXJDb3VudCBpcyB0aGUgbnVtYmVyIG9mIG1lbWJlcnMgd2l0aCBhbiBleHBsaWNpdCByb2xlLgpmdW5jIChyICpSZXBvKSBNZW1iZXJDb3VudCgpIGludCB7IHJldHVybiByLm1lbWJlcnMuU2l6ZSgpIH0KCi8vIEl0ZXJhdGVNZW1iZXJzIHdhbGtzIG1lbWJlcnMgaW4gYWRkcmVzcyBvcmRlci4KZnVuYyAociAqUmVwbykgSXRlcmF0ZU1lbWJlcnMoY2IgZnVuYyhhZGRyIHN0cmluZywgcm9sZSBSb2xlKSBib29sKSB7CglyLm1lbWJlcnMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoa2V5IHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlyZXR1cm4gY2Ioa2V5LCB2YWx1ZS4oUm9sZSkpCgl9KQp9CgovLyBTZXRNZW1iZXIgZ3JhbnRzIG9yIHJldm9rZXMgYSByb2xlLiBBZG1pbnMgbWFuYWdlIG1lbWJlcnM7IG9ubHkgYW4gb3duZXIgbWF5Ci8vIG1pbnQgYW5vdGhlciBvd25lciwgYW5kIHRoZSBsYXN0IG93bmVyIGNhbm5vdCBiZSBkZW1vdGVkOiBhIHJlcG8gd2l0aCBubwovLyBvd25lciBpcyBhIHJlcG8gbm9ib2R5IGNhbiBldmVyIHVuYXJjaGl2ZS4KZnVuYyAociAqUmVwbykgU2V0TWVtYmVyKGFjdG9yIGFkZHJlc3MsIHRhcmdldCBhZGRyZXNzLCByb2xlIFJvbGUpIGVycm9yIHsKCWlmIHJvbGUgPCBSb2xlTm9uZSB8fCByb2xlID4gUm9sZU93bmVyIHsKCQlyZXR1cm4gRXJySW52YWxpZFJvbGUKCX0KCWlmICFyLkNhbihhY3RvciwgUm9sZUFkbWluKSB7CgkJcmV0dXJuIEVyclVuYXV0aG9yaXplZAoJfQoJaWYgcm9sZSA9PSBSb2xlT3duZXIgJiYgIXIuQ2FuKGFjdG9yLCBSb2xlT3duZXIpIHsKCQlyZXR1cm4gRXJyVW5hdXRob3JpemVkCgl9CgljdXIgOj0gci5Sb2xlT2YodGFyZ2V0KQoJaWYgY3VyID09IFJvbGVPd25lciAmJiByb2xlICE9IFJvbGVPd25lciB7CgkJaWYgIXIuQ2FuKGFjdG9yLCBSb2xlT3duZXIpIHsKCQkJcmV0dXJuIEVyclVuYXV0aG9yaXplZCAvLyBhbiBhZG1pbiBjYW5ub3QgZGVtb3RlIGFuIG93bmVyCgkJfQoJCWlmIHIub3duZXJDb3VudCgpID09IDEgewoJCQlyZXR1cm4gRXJyTGFzdE93bmVyCgkJfQoJfQoJaWYgcm9sZSA9PSBSb2xlTm9uZSB7CgkJci5tZW1iZXJzLlJlbW92ZSh0YXJnZXQuU3RyaW5nKCkpCgkJcmV0dXJuIG5pbAoJfQoJci5tZW1iZXJzLlNldCh0YXJnZXQuU3RyaW5nKCksIHJvbGUpCglyZXR1cm4gbmlsCn0KCmZ1bmMgKHIgKlJlcG8pIG93bmVyQ291bnQoKSBpbnQgewoJbiA6PSAwCglyLm1lbWJlcnMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJaWYgdmFsdWUuKFJvbGUpID09IFJvbGVPd25lciB7CgkJCW4rKwoJCX0KCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gbgp9CgovLyBTZXREZXNjcmlwdGlvbiB1cGRhdGVzIHRoZSBvbmUtbGluZSBkZXNjcmlwdGlvbi4KZnVuYyAociAqUmVwbykgU2V0RGVzY3JpcHRpb24oYWN0b3IgYWRkcmVzcywgZGVzY3JpcHRpb24gc3RyaW5nKSBlcnJvciB7CglpZiAhci5DYW4oYWN0b3IsIFJvbGVBZG1pbikgewoJCXJldHVybiBFcnJVbmF1dGhvcml6ZWQKCX0KCWlmICFWYWxpZFRleHQoZGVzY3JpcHRpb24sIE1heERlc2NMZW4pIHsKCQlyZXR1cm4gRXJySW52YWxpZFRleHQKCX0KCXIuRGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgoJcmV0dXJuIG5pbAp9CgovLyBTZXRNaXJyb3JzIHJlcGxhY2VzIHRoZSBmZXRjaCBsb2NhdG9ycy4gVGhlIGZpcnN0IG9uZSBpcyB0aGUgY2Fub25pY2FsCi8vIHJlbW90ZTsgdGhlIHJlc3QgYXJlIGZhbGxiYWNrcy4gVGhlIGNoYWluIHJlY29yZHMgdGhlbSwgaXQgbmV2ZXIgZmV0Y2hlcy4KZnVuYyAociAqUmVwbykgU2V0TWlycm9ycyhhY3RvciBhZGRyZXNzLCBtaXJyb3JzIFtdc3RyaW5nKSBlcnJvciB7CglpZiAhci5DYW4oYWN0b3IsIFJvbGVNYWludGFpbmVyKSB7CgkJcmV0dXJuIEVyclVuYXV0aG9yaXplZAoJfQoJaWYgbGVuKG1pcnJvcnMpID4gTWF4TWlycm9ycyB7CgkJcmV0dXJuIEVyclRvb01hbnkKCX0KCWZvciBfLCBtIDo9IHJhbmdlIG1pcnJvcnMgewoJCWlmICFWYWxpZE1pcnJvcihtKSB7CgkJCXJldHVybiBFcnJJbnZhbGlkTWlycm9yCgkJfQoJfQoJci5NaXJyb3JzID0gYXBwZW5kKFtdc3RyaW5ne30sIG1pcnJvcnMuLi4pCglyZXR1cm4gbmlsCn0KCi8vIFNldERlZmF1bHRSZWYgcG9pbnRzIHRoZSByZXBvIGF0IGFub3RoZXIgZGVmYXVsdCBicmFuY2guCmZ1bmMgKHIgKlJlcG8pIFNldERlZmF1bHRSZWYoYWN0b3IgYWRkcmVzcywgbmFtZSBzdHJpbmcpIGVycm9yIHsKCWlmICFyLkNhbihhY3RvciwgUm9sZU1haW50YWluZXIpIHsKCQlyZXR1cm4gRXJyVW5hdXRob3JpemVkCgl9CglpZiAhVmFsaWRSZWZOYW1lKG5hbWUpIHsKCQlyZXR1cm4gRXJySW52YWxpZFJlZk5hbWUKCX0KCXIuRGVmYXVsdFJlZiA9IG5hbWUKCXJldHVybiBuaWwKfQoKLy8gU2V0UG9saWN5IHNldHMgdGhlIG1lcmdlIHBvbGljeTogaG93IG1hbnkgYXBwcm92YWxzIGEgY2hhbmdlIG5lZWRzLCBhbmQKLy8gd2hldGhlciB0aGUgYXV0aG9yJ3Mgb3duIGFwcHJvdmFsIGNvdW50cy4KZnVuYyAociAqUmVwbykgU2V0UG9saWN5KGFjdG9yIGFkZHJlc3MsIHJlcXVpcmVkQXBwcm92YWxzIGludCwgYWxsb3dTZWxmQXBwcm92YWwgYm9vbCkgZXJyb3IgewoJaWYgIXIuQ2FuKGFjdG9yLCBSb2xlQWRtaW4pIHsKCQlyZXR1cm4gRXJyVW5hdXRob3JpemVkCgl9CglpZiByZXF1aXJlZEFwcHJvdmFscyA8IDAgfHwgcmVxdWlyZWRBcHByb3ZhbHMgPiAxNiB7CgkJcmV0dXJuIEVyclRvb01hbnkKCX0KCXIuUmVxdWlyZWRBcHByb3ZhbHMgPSByZXF1aXJlZEFwcHJvdmFscwoJci5BbGxvd1NlbGZBcHByb3ZhbCA9IGFsbG93U2VsZkFwcHJvdmFsCglyZXR1cm4gbmlsCn0KCi8vIFNldEFyY2hpdmVkIGZyZWV6ZXMgKG9yIHVuZnJlZXplcykgdGhlIHJlcG8uIEFuIGFyY2hpdmVkIHJlcG8gdGFrZXMgbm8KLy8gbXV0YXRpb24gZXhjZXB0IHVuYXJjaGl2aW5nOiB0aGUgbG9nIHN0YXlzIHJlYWRhYmxlIGZvcmV2ZXIuCmZ1bmMgKHIgKlJlcG8pIFNldEFyY2hpdmVkKGFjdG9yIGFkZHJlc3MsIGFyY2hpdmVkIGJvb2wpIGVycm9yIHsKCWlmICFyLkNhbihhY3RvciwgUm9sZUFkbWluKSB7CgkJcmV0dXJuIEVyclVuYXV0aG9yaXplZAoJfQoJci5BcmNoaXZlZCA9IGFyY2hpdmVkCglyZXR1cm4gbmlsCn0KCi8vIENvdW50cyBmb3IgcmVuZGVyaW5nLgpmdW5jIChyICpSZXBvKSBSZWZDb3VudCgpIGludCAgICB7IHJldHVybiByLnJlZnMuU2l6ZSgpIH0KZnVuYyAociAqUmVwbykgSXNzdWVDb3VudCgpIGludCAgeyByZXR1cm4gci5pc3N1ZXMuU2l6ZSgpIH0KZnVuYyAociAqUmVwbykgQ2hhbmdlQ291bnQoKSBpbnQgeyByZXR1cm4gci5jaGFuZ2VzLlNpemUoKSB9CgovLyBzZXFLZXkgemVyby1wYWRzIGFuIGlkIHRvIGEgZml4ZWQgd2lkdGggc28gYXZsIGtleXMgc29ydCBudW1lcmljYWxseS4KLy8gdWZtdCBoYXMgbm8gd2lkdGggZmxhZ3MgaW4gZ25vLCBzbyB0aGUgcGFkZGluZyBpcyBkb25lIGJ5IGhhbmQ6ICIlMDE2ZCIKLy8gc2lsZW50bHkgcmV0dXJucyB0aGUgYmFyZSBudW1iZXIgYW5kIHdvdWxkIHNvcnQgMTAgYmVmb3JlIDIuCmZ1bmMgc2VxS2V5KG4gaW50NjQpIHN0cmluZyB7CglzIDo9IHN0cmNvbnYuRm9ybWF0SW50KG4sIDEwKQoJaWYgbGVuKHMpID49IDE2IHsKCQlyZXR1cm4gcwoJfQoJcmV0dXJuIHN0cmluZ3MuUmVwZWF0KCIwIiwgMTYtbGVuKHMpKSArIHMKfQoauioKDmZvcmdlX3Rlc3QuZ25vEqcqcGFja2FnZSBmb3JnZQoKaW1wb3J0ICgKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCgkiZ25vLmxhbmQvcC9udC91cmVxdWlyZS92MCIKKQoKZnVuYyBUZXN0Q3JlYXRlUmVwbyh0ICp0ZXN0aW5nLlQpIHsKCWYgOj0gTmV3KCkKCglyLCBlcnIgOj0gZi5DcmVhdGVSZXBvKGFsaWNlLCA0MiwgIm1vdWwvZm9yZ2UiLCAiZGVzYyIsICIiKQoJdXJlcXVpcmUuTm9FcnJvcih0LCBlcnIpCgl1YXNzZXJ0LkVxdWFsKHQsICJyZWZzL2hlYWRzL21haW4iLCByLkRlZmF1bHRSZWYsICJkZWZhdWx0IHJlZiBkZWZhdWx0cyIpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDQyKSwgci5DcmVhdGVkQXQpCgl1YXNzZXJ0LkVxdWFsKHQsICJvd25lciIsIHIuUm9sZU9mKGFsaWNlKS5TdHJpbmcoKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgZi5TaXplKCkpCgoJXywgZXJyID0gZi5DcmVhdGVSZXBvKGJvYiwgNDMsICJtb3VsL2ZvcmdlIiwgIiIsICIiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyUmVwb0V4aXN0cykKCglfLCBlcnIgPSBmLkNyZWF0ZVJlcG8oYm9iLCA0MywgIk1vdWwvRm9yZ2UiLCAiIiwgIiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJJbnZhbGlkUmVwb0lEKQoKCV8sIGVyciA9IGYuQ3JlYXRlUmVwbyhib2IsIDQzLCAibW91bC9vdGhlciIsICIiLCAibWFpbiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJJbnZhbGlkUmVmTmFtZSkKCgl1YXNzZXJ0LlRydWUodCwgZi5SZXBvKCJtb3VsL25vcGUiKSA9PSBuaWwsICJtaXNzaW5nIHJlcG8gaXMgbmlsIikKCXVhc3NlcnQuVHJ1ZSh0LCBmLkhhc1JlcG8oIm1vdWwvZm9yZ2UiKSkKfQoKZnVuYyBUZXN0TWVtYmVyc2hpcCh0ICp0ZXN0aW5nLlQpIHsKCV8sIHIgOj0gbmV3UmVwbyh0KQoKCXVhc3NlcnQuVHJ1ZSh0LCByLkNhbihib2IsIFJvbGVXcml0ZXIpLCAibWFpbnRhaW5lciBjb3ZlcnMgd3JpdGVyIikKCXVhc3NlcnQuRmFsc2UodCwgci5DYW4oY2Fyb2wsIFJvbGVNYWludGFpbmVyKSkKCXVhc3NlcnQuRXF1YWwodCwgIm5vbmUiLCByLlJvbGVPZihldmUpLlN0cmluZygpKQoJdWFzc2VydC5FcXVhbCh0LCA0LCByLk1lbWJlckNvdW50KCkpCgoJLy8gQSB3cml0ZXIgY2Fubm90IGhhbmQgb3V0IHJvbGVzLgoJdWFzc2VydC5FcnJvcklzKHQsIHIuU2V0TWVtYmVyKGNhcm9sLCBldmUsIFJvbGVXcml0ZXIpLCBFcnJVbmF1dGhvcml6ZWQpCgoJLy8gQW4gYWRtaW4gY2FuIHByb21vdGUgdXAgdG8gYWRtaW4sIGJ1dCBjYW5ub3QgbWludCBhbiBvd25lci4uLgoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlNldE1lbWJlcihhbGljZSwgYm9iLCBSb2xlQWRtaW4pKQoJdWFzc2VydC5FcnJvcklzKHQsIHIuU2V0TWVtYmVyKGJvYiwgZXZlLCBSb2xlT3duZXIpLCBFcnJVbmF1dGhvcml6ZWQpCgkvLyAuLi5ub3IgZGVtb3RlIG9uZS4KCXVhc3NlcnQuRXJyb3JJcyh0LCByLlNldE1lbWJlcihib2IsIGFsaWNlLCBSb2xlUmVhZGVyKSwgRXJyVW5hdXRob3JpemVkKQoKCS8vIFRoZSBsYXN0IG93bmVyIGNhbm5vdCBkZW1vdGUgdGhlbXNlbHZlczogYSByZXBvIHdpdGggbm8gb3duZXIgaXMgYSByZXBvCgkvLyBub2JvZHkgY2FuIGV2ZXIgYWRtaW5pc3RlciBhZ2Fpbi4KCXVhc3NlcnQuRXJyb3JJcyh0LCByLlNldE1lbWJlcihhbGljZSwgYWxpY2UsIFJvbGVSZWFkZXIpLCBFcnJMYXN0T3duZXIpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuU2V0TWVtYmVyKGFsaWNlLCBib2IsIFJvbGVPd25lcikpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuU2V0TWVtYmVyKGFsaWNlLCBhbGljZSwgUm9sZVJlYWRlcikpCgl1YXNzZXJ0LkVxdWFsKHQsICJyZWFkZXIiLCByLlJvbGVPZihhbGljZSkuU3RyaW5nKCkpCgoJLy8gUmV2b2tpbmcgcmVtb3ZlcyB0aGUgbWVtYmVyIG91dHJpZ2h0LgoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlNldE1lbWJlcihib2IsIGRhdmUsIFJvbGVOb25lKSkKCXVhc3NlcnQuRXF1YWwodCwgIm5vbmUiLCByLlJvbGVPZihkYXZlKS5TdHJpbmcoKSkKCXVhc3NlcnQuRXF1YWwodCwgMywgci5NZW1iZXJDb3VudCgpKQoKCXVhc3NlcnQuRXJyb3JJcyh0LCByLlNldE1lbWJlcihib2IsIGV2ZSwgUm9sZSg5OSkpLCBFcnJJbnZhbGlkUm9sZSkKfQoKZnVuYyBUZXN0UmVwb1NldHRpbmdzKHQgKnRlc3RpbmcuVCkgewoJXywgciA6PSBuZXdSZXBvKHQpCgoJdWFzc2VydC5FcnJvcklzKHQsIHIuU2V0RGVzY3JpcHRpb24oY2Fyb2wsICJub3BlIiksIEVyclVuYXV0aG9yaXplZCkKCXVyZXF1aXJlLk5vRXJyb3IodCwgci5TZXREZXNjcmlwdGlvbihhbGljZSwgImFuIG9uLWNoYWluIGZvcmdlIGZvciBnbm8iKSkKCXVhc3NlcnQuRXF1YWwodCwgImFuIG9uLWNoYWluIGZvcmdlIGZvciBnbm8iLCByLkRlc2NyaXB0aW9uKQoKCXVhc3NlcnQuRXJyb3JJcyh0LCByLlNldE1pcnJvcnMoY2Fyb2wsIFtdc3RyaW5neyJodHRwczovL2V4YW1wbGUuY29tL3guZ2l0In0pLCBFcnJVbmF1dGhvcml6ZWQpCgl1YXNzZXJ0LkVycm9ySXModCwgci5TZXRNaXJyb3JzKGJvYiwgW11zdHJpbmd7Im5vcGUifSksIEVyckludmFsaWRNaXJyb3IpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuU2V0TWlycm9ycyhib2IsIFtdc3RyaW5neyJodHRwczovL2dpdGh1Yi5jb20vbW91bC9nbm8tY29udHJhY3RzLmdpdCJ9KSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgbGVuKHIuTWlycm9ycykpCgoJdWFzc2VydC5FcnJvcklzKHQsIHIuU2V0UG9saWN5KGNhcm9sLCAyLCBmYWxzZSksIEVyclVuYXV0aG9yaXplZCkKCXVhc3NlcnQuRXJyb3JJcyh0LCByLlNldFBvbGljeShhbGljZSwgOTksIGZhbHNlKSwgRXJyVG9vTWFueSkKCXVyZXF1aXJlLk5vRXJyb3IodCwgci5TZXRQb2xpY3koYWxpY2UsIDIsIHRydWUpKQoJdWFzc2VydC5FcXVhbCh0LCAyLCByLlJlcXVpcmVkQXBwcm92YWxzKQoJdWFzc2VydC5UcnVlKHQsIHIuQWxsb3dTZWxmQXBwcm92YWwpCgoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlNldERlZmF1bHRSZWYoYm9iLCAicmVmcy9oZWFkcy90cnVuayIpKQoJdWFzc2VydC5FcXVhbCh0LCAicmVmcy9oZWFkcy90cnVuayIsIHIuRGVmYXVsdFJlZikKCgkvLyBBbiBhcmNoaXZlZCByZXBvIHRha2VzIG5vIHdyaXRlcyBhdCBhbGwuCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuU2V0QXJjaGl2ZWQoYWxpY2UsIHRydWUpKQoJXywgZXJyIDo9IHIuU2V0UmVmKGFsaWNlLCAxMDEsICJyZWZzL2hlYWRzL3RydW5rIiwgIiIsIG9pZCgiYSIpLCAiIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyclJlcG9BcmNoaXZlZCkKCV8sIGVyciA9IHIuT3Blbklzc3VlKGV2ZSwgMTAxLCAiaGVsbG8iLCAiIiwgbmlsKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyUmVwb0FyY2hpdmVkKQoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlNldEFyY2hpdmVkKGFsaWNlLCBmYWxzZSkpCn0KCmZ1bmMgVGVzdEZvcmtTbmFwc2hvdHNSZWZzKHQgKnRlc3RpbmcuVCkgewoJZiwgciA6PSBuZXdSZXBvKHQpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuU2V0TWlycm9ycyhhbGljZSwgW11zdHJpbmd7Imh0dHBzOi8vZ2l0aHViLmNvbS9tb3VsL2duby1jb250cmFjdHMuZ2l0In0pKQoJXywgZXJyIDo9IHIuU2V0UmVmKGFsaWNlLCAxMDEsICJyZWZzL2hlYWRzL21haW4iLCAiIiwgb2lkKCJhIiksICJpbml0aWFsIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJXywgZXJyID0gci5TZXRSZWYoYWxpY2UsIDEwMiwgInJlZnMvdGFncy92MC4xLjAiLCAiIiwgb2lkKCJiIiksICJ0YWciKQoJdXJlcXVpcmUuTm9FcnJvcih0LCBlcnIpCgoJY2hpbGQsIGVyciA6PSBmLkZvcmsoZXZlLCAxMTAsICJtb3VsL2ZvcmdlIiwgImV2ZS9mb3JnZSIpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgIm1vdWwvZm9yZ2UiLCBjaGlsZC5QYXJlbnRJRCkKCXVhc3NlcnQuRXF1YWwodCwgIm93bmVyIiwgY2hpbGQuUm9sZU9mKGV2ZSkuU3RyaW5nKCksICJ0aGUgZm9ya2VyIG93bnMgdGhlIGZvcmsiKQoJdWFzc2VydC5FcXVhbCh0LCAyLCBjaGlsZC5SZWZDb3VudCgpLCAicmVmcyBhcmUgc25hcHNob3R0ZWQiKQoJdWFzc2VydC5FcXVhbCh0LCAyLCBjaGlsZC5Mb2dTaXplKCksICJhbmQgdGhlIHNuYXBzaG90IGlzIGluIHRoZSBsb2ciKQoJdWFzc2VydC5FcXVhbCh0LCBvaWQoImEiKSwgY2hpbGQuUmVmKCJyZWZzL2hlYWRzL21haW4iKS5PSUQpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGxlbihjaGlsZC5NaXJyb3JzKSwgInRoZSBmb3JrIGluaGVyaXRzIHdoZXJlIHRvIGZldGNoIG9iamVjdHMiKQoKCW9rLCBiYWQgOj0gY2hpbGQuVmVyaWZ5TG9nKCkKCXVhc3NlcnQuVHJ1ZSh0LCBvaywgImZvcmsgbG9nIGlzIGEgdmFsaWQgY2hhaW4iKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgtMSksIGJhZCkKCglfLCBlcnIgPSBmLkZvcmsoZXZlLCAxMTEsICJtb3VsL25vcGUiLCAiZXZlL25vcGUiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyUmVwb05vdEZvdW5kKQoJXywgZXJyID0gZi5Gb3JrKGV2ZSwgMTExLCAibW91bC9mb3JnZSIsICJldmUvZm9yZ2UiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyUmVwb0V4aXN0cykKfQoKZnVuYyBUZXN0SXRlcmF0ZVJlcG9zQW5kTmFtZXNwYWNlKHQgKnRlc3RpbmcuVCkgewoJZiA6PSBOZXcoKQoJZm9yIF8sIGlkIDo9IHJhbmdlIFtdc3RyaW5neyJhbGljZS9vbmUiLCAiYWxpY2UvdHdvIiwgImJvYi90aHJlZSJ9IHsKCQlfLCBlcnIgOj0gZi5DcmVhdGVSZXBvKGFsaWNlLCAxLCBpZCwgIiIsICIiKQoJCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJfQoKCXZhciBhbGwgW11zdHJpbmcKCWYuSXRlcmF0ZVJlcG9zKDAsIDAsIGZ1bmMociAqUmVwbykgYm9vbCB7CgkJYWxsID0gYXBwZW5kKGFsbCwgci5JRCkKCQlyZXR1cm4gZmFsc2UKCX0pCgl1YXNzZXJ0LkVxdWFsKHQsICJhbGljZS9vbmUsYWxpY2UvdHdvLGJvYi90aHJlZSIsIGpvaW4oYWxsKSkKCgl2YXIgbnMgW11zdHJpbmcKCWYuSXRlcmF0ZU5hbWVzcGFjZSgiYWxpY2UiLCBmdW5jKHIgKlJlcG8pIGJvb2wgewoJCW5zID0gYXBwZW5kKG5zLCByLklEKQoJCXJldHVybiBmYWxzZQoJfSkKCXVhc3NlcnQuRXF1YWwodCwgImFsaWNlL29uZSxhbGljZS90d28iLCBqb2luKG5zKSkKCgl2YXIgcGFnZSBbXXN0cmluZwoJZi5JdGVyYXRlUmVwb3MoMSwgMSwgZnVuYyhyICpSZXBvKSBib29sIHsKCQlwYWdlID0gYXBwZW5kKHBhZ2UsIHIuSUQpCgkJcmV0dXJuIGZhbHNlCgl9KQoJdWFzc2VydC5FcXVhbCh0LCAiYWxpY2UvdHdvIiwgam9pbihwYWdlKSkKfQoKZnVuYyBqb2luKHNzIFtdc3RyaW5nKSBzdHJpbmcgewoJb3V0IDo9ICIiCglmb3IgaSwgcyA6PSByYW5nZSBzcyB7CgkJaWYgaSA+IDAgewoJCQlvdXQgKz0gIiwiCgkJfQoJCW91dCArPSBzCgl9CglyZXR1cm4gb3V0Cn0KGj8KC2dub21vZC50b21sEjBtb2R1bGUgPSAiZ25vLmxhbmQvcC9tb3VsL2ZvcmdlL3YxIgpnbm8gPSAiMC45IgoapAgKEGhlbHBlcnNfdGVzdC5nbm8SjwhwYWNrYWdlIGZvcmdlCgppbXBvcnQgKAoJInN0cmluZ3MiCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC90ZXN0dXRpbHMvdjAiCgkiZ25vLmxhbmQvcC9udC91cmVxdWlyZS92MCIKKQoKLy8gRGV0ZXJtaW5pc3RpYywgY2hlY2tzdW0tdmFsaWQgdGVzdCBhZGRyZXNzZXMuCnZhciAoCglhbGljZSA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiYWxpY2UiKSAvLyBvd25lcgoJYm9iICAgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImJvYiIpICAgLy8gbWFpbnRhaW5lcgoJY2Fyb2wgPSB0ZXN0dXRpbHMuVGVzdEFkZHJlc3MoImNhcm9sIikgLy8gd3JpdGVyCglkYXZlICA9IHRlc3R1dGlscy5UZXN0QWRkcmVzcygiZGF2ZSIpICAvLyByZWFkZXIKCWV2ZSAgID0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJldmUiKSAgIC8vIHN0cmFuZ2VyCikKCi8vIG9pZCBidWlsZHMgYSB3ZWxsLWZvcm1lZCA0MC1oZXggb2JqZWN0IGlkIG91dCBvZiBvbmUgaGV4IGRpZ2l0LgpmdW5jIG9pZChjIHN0cmluZykgc3RyaW5nIHsgcmV0dXJuIHN0cmluZ3MuUmVwZWF0KGMsIDQwKSB9CgovLyBuZXdSZXBvIHJldHVybnMgYSByZXBvIG93bmVkIGJ5IGFsaWNlIHdpdGggdGhlIHN0YW5kYXJkIGNhc3Q6IGJvYgovLyBtYWludGFpbmVyLCBjYXJvbCB3cml0ZXIsIGRhdmUgcmVhZGVyLCBldmUgbm90aGluZy4KZnVuYyBuZXdSZXBvKHQgKnRlc3RpbmcuVCkgKCpGb3JnZSwgKlJlcG8pIHsKCXQuSGVscGVyKCkKCWYgOj0gTmV3KCkKCXIsIGVyciA6PSBmLkNyZWF0ZVJlcG8oYWxpY2UsIDEwMCwgIm1vdWwvZm9yZ2UiLCAiYW4gb24tY2hhaW4gZm9yZ2UiLCAiIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlNldE1lbWJlcihhbGljZSwgYm9iLCBSb2xlTWFpbnRhaW5lcikpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuU2V0TWVtYmVyKGFsaWNlLCBjYXJvbCwgUm9sZVdyaXRlcikpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuU2V0TWVtYmVyKGFsaWNlLCBkYXZlLCBSb2xlUmVhZGVyKSkKCXJldHVybiBmLCByCn0KGs4gCglpc3N1ZS5nbm8SwCBwYWNrYWdlIGZvcmdlCgppbXBvcnQgImduby5sYW5kL3AvbnQvYXZsL3YwIgoKLy8gSXNzdWUgaXMgYSBkaXNjdXNzaW9uIHRocmVhZCBib3VuZCB0byBhIHJlcG8uIEFueW9uZSB3aXRoIGFuIGFkZHJlc3MgbWF5IG9wZW4KLy8gb25lOiB0aGUgc3BhbSBnYXRlIGlzIG5vdCBhIG1vZGVyYXRvciwgaXQgaXMgdGhhdCB0aGUgYXV0aG9yIHBheXMgZ2FzIGFuZAovLyBsb2NrcyB0aGUgc3RvcmFnZSBkZXBvc2l0IGZvciBldmVyeSBieXRlIHRoZXkgd3JpdGUuCnR5cGUgSXNzdWUgc3RydWN0IHsKCUlEICAgICAgICBpbnQ2NAoJVGl0bGUgICAgIHN0cmluZwoJQm9keSAgICAgIHN0cmluZwoJQXV0aG9yICAgIGFkZHJlc3MKCU9wZW4gICAgICBib29sCglMYWJlbHMgICAgW11zdHJpbmcKCUNyZWF0ZWRBdCBpbnQ2NAoJVXBkYXRlZEF0IGludDY0CgoJY29tbWVudHMgICAgKmF2bC5UcmVlIC8vIHBhZGRlZCBpZCAtPiAqQ29tbWVudAoJbmV4dENvbW1lbnQgaW50NjQKfQoKLy8gQ29tbWVudCBpcyBvbmUgcmVwbHksIG9uIGFuIGlzc3VlIG9yIG9uIGEgY2hhbmdlIHJlcXVlc3QuCnR5cGUgQ29tbWVudCBzdHJ1Y3QgewoJSUQgICAgICAgIGludDY0CglBdXRob3IgICAgYWRkcmVzcwoJQm9keSAgICAgIHN0cmluZwoJQ3JlYXRlZEF0IGludDY0Cn0KCi8vIE9wZW5Jc3N1ZSBmaWxlcyBhbiBpc3N1ZS4gUGVybWlzc2lvbmxlc3MgYnkgZGVzaWduLgpmdW5jIChyICpSZXBvKSBPcGVuSXNzdWUoYWN0b3IgYWRkcmVzcywgaGVpZ2h0IGludDY0LCB0aXRsZSwgYm9keSBzdHJpbmcsIGxhYmVscyBbXXN0cmluZykgKCpJc3N1ZSwgZXJyb3IpIHsKCWlmIHIuQXJjaGl2ZWQgewoJCXJldHVybiBuaWwsIEVyclJlcG9BcmNoaXZlZAoJfQoJaWYgdGl0bGUgPT0gIiIgfHwgIVZhbGlkTGluZSh0aXRsZSwgTWF4VGl0bGVMZW4pIHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkVGV4dAoJfQoJaWYgIVZhbGlkVGV4dChib2R5LCBNYXhCb2R5TGVuKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZFRleHQKCX0KCWlmIGVyciA6PSBjaGVja0xhYmVscyhsYWJlbHMpOyBlcnIgIT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBlcnIKCX0KCWkgOj0gJklzc3VlewoJCUlEOiAgICAgICAgci5uZXh0SXNzdWUsCgkJVGl0bGU6ICAgICB0aXRsZSwKCQlCb2R5OiAgICAgIGJvZHksCgkJQXV0aG9yOiAgICBhY3RvciwKCQlPcGVuOiAgICAgIHRydWUsCgkJTGFiZWxzOiAgICBhcHBlbmQoW11zdHJpbmd7fSwgbGFiZWxzLi4uKSwKCQlDcmVhdGVkQXQ6IGhlaWdodCwKCQlVcGRhdGVkQXQ6IGhlaWdodCwKCQljb21tZW50czogIGF2bC5OZXdUcmVlKCksCgl9CglyLmlzc3Vlcy5TZXQoc2VxS2V5KGkuSUQpLCBpKQoJci5uZXh0SXNzdWUrKwoJcmV0dXJuIGksIG5pbAp9CgovLyBDb21tZW50SXNzdWUgYXBwZW5kcyBhIHJlcGx5LiBDbG9zZWQgaXNzdWVzIHN0aWxsIHRha2UgY29tbWVudHMgKGNsb3NpbmcgaXMgYQovLyB0cmlhZ2Ugc3RhdGUsIG5vdCBhIGdhZyk7IGFuIGFyY2hpdmVkIHJlcG8gdGFrZXMgbm9uZS4KZnVuYyAociAqUmVwbykgQ29tbWVudElzc3VlKGFjdG9yIGFkZHJlc3MsIGhlaWdodCwgaWQgaW50NjQsIGJvZHkgc3RyaW5nKSAoKkNvbW1lbnQsIGVycm9yKSB7CglpZiByLkFyY2hpdmVkIHsKCQlyZXR1cm4gbmlsLCBFcnJSZXBvQXJjaGl2ZWQKCX0KCWkgOj0gci5Jc3N1ZShpZCkKCWlmIGkgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBFcnJJc3N1ZU5vdEZvdW5kCgl9CglpZiBib2R5ID09ICIiIHx8ICFWYWxpZFRleHQoYm9keSwgTWF4Q29tbWVudExlbikgewoJCXJldHVybiBuaWwsIEVyckludmFsaWRUZXh0Cgl9CgljIDo9ICZDb21tZW50e0lEOiBpLm5leHRDb21tZW50LCBBdXRob3I6IGFjdG9yLCBCb2R5OiBib2R5LCBDcmVhdGVkQXQ6IGhlaWdodH0KCWkuY29tbWVudHMuU2V0KHNlcUtleShjLklEKSwgYykKCWkubmV4dENvbW1lbnQrKwoJaS5VcGRhdGVkQXQgPSBoZWlnaHQKCXJldHVybiBjLCBuaWwKfQoKLy8gU2V0SXNzdWVPcGVuIGNsb3NlcyBvciByZW9wZW5zIGFuIGlzc3VlLiBUaGUgYXV0aG9yIGNhbiBhbHdheXMgY2xvc2UgdGhlaXIKLy8gb3duOyBtYWludGFpbmVycyBjYW4gY2xvc2UgYW55b25lJ3MuCmZ1bmMgKHIgKlJlcG8pIFNldElzc3VlT3BlbihhY3RvciBhZGRyZXNzLCBoZWlnaHQsIGlkIGludDY0LCBvcGVuIGJvb2wpIGVycm9yIHsKCWlmIHIuQXJjaGl2ZWQgewoJCXJldHVybiBFcnJSZXBvQXJjaGl2ZWQKCX0KCWkgOj0gci5Jc3N1ZShpZCkKCWlmIGkgPT0gbmlsIHsKCQlyZXR1cm4gRXJySXNzdWVOb3RGb3VuZAoJfQoJaWYgaS5BdXRob3IgIT0gYWN0b3IgJiYgIXIuQ2FuKGFjdG9yLCBSb2xlTWFpbnRhaW5lcikgewoJCXJldHVybiBFcnJVbmF1dGhvcml6ZWQKCX0KCWkuT3BlbiA9IG9wZW4KCWkuVXBkYXRlZEF0ID0gaGVpZ2h0CglyZXR1cm4gbmlsCn0KCi8vIFNldElzc3VlTGFiZWxzIHJlcGxhY2VzIGFuIGlzc3VlJ3MgbGFiZWxzLiBUcmlhZ2UgaXMgYSBtYWludGFpbmVyIGFjdGlvbi4KZnVuYyAociAqUmVwbykgU2V0SXNzdWVMYWJlbHMoYWN0b3IgYWRkcmVzcywgaGVpZ2h0LCBpZCBpbnQ2NCwgbGFiZWxzIFtdc3RyaW5nKSBlcnJvciB7CglpZiByLkFyY2hpdmVkIHsKCQlyZXR1cm4gRXJyUmVwb0FyY2hpdmVkCgl9CglpIDo9IHIuSXNzdWUoaWQpCglpZiBpID09IG5pbCB7CgkJcmV0dXJuIEVycklzc3VlTm90Rm91bmQKCX0KCWlmICFyLkNhbihhY3RvciwgUm9sZU1haW50YWluZXIpIHsKCQlyZXR1cm4gRXJyVW5hdXRob3JpemVkCgl9CglpZiBlcnIgOj0gY2hlY2tMYWJlbHMobGFiZWxzKTsgZXJyICE9IG5pbCB7CgkJcmV0dXJuIGVycgoJfQoJaS5MYWJlbHMgPSBhcHBlbmQoW11zdHJpbmd7fSwgbGFiZWxzLi4uKQoJaS5VcGRhdGVkQXQgPSBoZWlnaHQKCXJldHVybiBuaWwKfQoKLy8gSXNzdWUgcmV0dXJucyBhbiBpc3N1ZSBieSBpZCwgb3IgbmlsLgpmdW5jIChyICpSZXBvKSBJc3N1ZShpZCBpbnQ2NCkgKklzc3VlIHsKCXYgOj0gci5pc3N1ZXMuR2V0KHNlcUtleShpZCkpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoJcmV0dXJuIHYuKCpJc3N1ZSkKfQoKLy8gSXRlcmF0ZUlzc3VlcyB3YWxrcyBpc3N1ZXMgbmV3ZXN0LWZpcnN0LgpmdW5jIChyICpSZXBvKSBJdGVyYXRlSXNzdWVzKG9mZnNldCwgY291bnQgaW50LCBjYiBmdW5jKCpJc3N1ZSkgYm9vbCkgewoJaWYgY291bnQgPD0gMCB7CgkJY291bnQgPSByLmlzc3Vlcy5TaXplKCkKCX0KCXIuaXNzdWVzLlJldmVyc2VJdGVyYXRlQnlPZmZzZXQob2Zmc2V0LCBjb3VudCwgZnVuYyhfIHN0cmluZywgdmFsdWUgYW55KSBib29sIHsKCQlyZXR1cm4gY2IodmFsdWUuKCpJc3N1ZSkpCgl9KQp9CgovLyBPcGVuSXNzdWVDb3VudCBjb3VudHMgaXNzdWVzIHN0aWxsIG9wZW4uCmZ1bmMgKHIgKlJlcG8pIE9wZW5Jc3N1ZUNvdW50KCkgaW50IHsKCW4gOj0gMAoJci5pc3N1ZXMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJaWYgdmFsdWUuKCpJc3N1ZSkuT3BlbiB7CgkJCW4rKwoJCX0KCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gbgp9CgovLyBDb21tZW50Q291bnQgaXMgdGhlIG51bWJlciBvZiByZXBsaWVzIG9uIHRoZSBpc3N1ZS4KZnVuYyAoaSAqSXNzdWUpIENvbW1lbnRDb3VudCgpIGludCB7IHJldHVybiBpLmNvbW1lbnRzLlNpemUoKSB9CgovLyBJdGVyYXRlQ29tbWVudHMgd2Fsa3MgcmVwbGllcyBvbGRlc3QtZmlyc3QuCmZ1bmMgKGkgKklzc3VlKSBJdGVyYXRlQ29tbWVudHMob2Zmc2V0LCBjb3VudCBpbnQsIGNiIGZ1bmMoKkNvbW1lbnQpIGJvb2wpIHsKCWlmIGNvdW50IDw9IDAgewoJCWNvdW50ID0gaS5jb21tZW50cy5TaXplKCkKCX0KCWkuY29tbWVudHMuSXRlcmF0ZUJ5T2Zmc2V0KG9mZnNldCwgY291bnQsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcmV0dXJuIGNiKHZhbHVlLigqQ29tbWVudCkpCgl9KQp9CgpmdW5jIGNoZWNrTGFiZWxzKGxhYmVscyBbXXN0cmluZykgZXJyb3IgewoJaWYgbGVuKGxhYmVscykgPiBNYXhMYWJlbHMgewoJCXJldHVybiBFcnJUb29NYW55Cgl9Cglmb3IgXywgbCA6PSByYW5nZSBsYWJlbHMgewoJCWlmICFWYWxpZExhYmVsKGwpIHsKCQkJcmV0dXJuIEVyckludmFsaWRUZXh0CgkJfQoJfQoJcmV0dXJuIG5pbAp9ChrqGQoOaXNzdWVfdGVzdC5nbm8S1xlwYWNrYWdlIGZvcmdlCgppbXBvcnQgKAoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKCSJnbm8ubGFuZC9wL250L3VyZXF1aXJlL3YwIgopCgpmdW5jIFRlc3RJc3N1ZUxpZmVjeWNsZSh0ICp0ZXN0aW5nLlQpIHsKCV8sIHIgOj0gbmV3UmVwbyh0KQoKCS8vIEZpbGluZyBhbiBpc3N1ZSBuZWVkcyBubyByb2xlOiB0aGUgZ2F0ZSBpcyB0aGF0IHRoZSBhdXRob3IgcGF5cyBmb3IgdGhlCgkvLyBieXRlcyB0aGV5IHdyaXRlLgoJaSwgZXJyIDo9IHIuT3Blbklzc3VlKGV2ZSwgMjAwLCAiUmVuZGVyIGVhdHMgdGhlIGxhc3QgbmV3bGluZSIsICJTdGVwczpcbjEuIOKApiIsIFtdc3RyaW5neyJidWcifSkKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgwKSwgaS5JRCkKCXVhc3NlcnQuVHJ1ZSh0LCBpLk9wZW4pCgl1YXNzZXJ0LkVxdWFsKHQsIGV2ZS5TdHJpbmcoKSwgaS5BdXRob3IuU3RyaW5nKCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIHIuSXNzdWVDb3VudCgpKQoJdWFzc2VydC5FcXVhbCh0LCAxLCByLk9wZW5Jc3N1ZUNvdW50KCkpCgoJYywgZXJyIDo9IHIuQ29tbWVudElzc3VlKGJvYiwgMjAxLCAwLCAicmVwcm9kdWNlZCIpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIGMuSUQpCgl1YXNzZXJ0LkVxdWFsKHQsIDEsIGkuQ29tbWVudENvdW50KCkpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KDIwMSksIGkuVXBkYXRlZEF0KQoKCS8vIFRoZSBhdXRob3IgbWF5IGNsb3NlIHRoZWlyIG93bjsgYSBzdHJhbmdlciBtYXkgbm90IGNsb3NlIHNvbWVvbmUgZWxzZSdzLgoJdWFzc2VydC5FcnJvcklzKHQsIHIuU2V0SXNzdWVPcGVuKGNhcm9sLCAyMDIsIDAsIGZhbHNlKSwgRXJyVW5hdXRob3JpemVkKQoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlNldElzc3VlT3BlbihldmUsIDIwMiwgMCwgZmFsc2UpKQoJdWFzc2VydC5GYWxzZSh0LCBpLk9wZW4pCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIHIuT3Blbklzc3VlQ291bnQoKSkKCgkvLyBDbG9zZWQgaXMgYSB0cmlhZ2Ugc3RhdGUsIG5vdCBhIGdhZy4KCV8sIGVyciA9IHIuQ29tbWVudElzc3VlKGV2ZSwgMjAzLCAwLCAic3RpbGwgaGFwcGVuaW5nIG9uIHBlYXJsIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoKCS8vIE1haW50YWluZXJzIGNhbiByZW9wZW4gYW5kIGxhYmVsLgoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlNldElzc3VlT3Blbihib2IsIDIwNCwgMCwgdHJ1ZSkpCgl1YXNzZXJ0LkVycm9ySXModCwgci5TZXRJc3N1ZUxhYmVscyhldmUsIDIwNSwgMCwgW11zdHJpbmd7InAxIn0pLCBFcnJVbmF1dGhvcml6ZWQpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuU2V0SXNzdWVMYWJlbHMoYm9iLCAyMDUsIDAsIFtdc3RyaW5neyJidWciLCAicDEifSkpCgl1YXNzZXJ0LkVxdWFsKHQsIDIsIGxlbihpLkxhYmVscykpCn0KCmZ1bmMgVGVzdElzc3VlVmFsaWRhdGlvbih0ICp0ZXN0aW5nLlQpIHsKCV8sIHIgOj0gbmV3UmVwbyh0KQoKCV8sIGVyciA6PSByLk9wZW5Jc3N1ZShldmUsIDIwMCwgIiIsICJib2R5IiwgbmlsKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJySW52YWxpZFRleHQsICJhIHRpdGxlIGlzIHJlcXVpcmVkIikKCV8sIGVyciA9IHIuT3Blbklzc3VlKGV2ZSwgMjAwLCAidHdvXG5saW5lcyIsICIiLCBuaWwpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJJbnZhbGlkVGV4dCwgImEgdGl0bGUgaXMgb25lIGxpbmUiKQoJXywgZXJyID0gci5PcGVuSXNzdWUoZXZlLCAyMDAsICJvayIsICIiLCBbXXN0cmluZ3siYSxiIn0pCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJJbnZhbGlkVGV4dCwgImxhYmVscyBhcmUgY29tbWEtZnJlZSIpCglfLCBlcnIgPSByLk9wZW5Jc3N1ZShldmUsIDIwMCwgIm9rIiwgIiIsIFtdc3RyaW5neyIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSIsICIxMCIsICIxMSJ9KQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyVG9vTWFueSkKCglfLCBlcnIgPSByLkNvbW1lbnRJc3N1ZShldmUsIDIwMCwgNywgIm5vIHN1Y2ggaXNzdWUiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJySXNzdWVOb3RGb3VuZCkKCXVhc3NlcnQuRXJyb3JJcyh0LCByLlNldElzc3VlT3Blbihib2IsIDIwMCwgNywgZmFsc2UpLCBFcnJJc3N1ZU5vdEZvdW5kKQoKCXVyZXF1aXJlLk5vRXJyb3IodCwgZnVuYygpIGVycm9yIHsgXywgZXJyIDo9IHIuT3Blbklzc3VlKGV2ZSwgMjAwLCAib2siLCAiIiwgbmlsKTsgcmV0dXJuIGVyciB9KCkpCglfLCBlcnIgPSByLkNvbW1lbnRJc3N1ZShldmUsIDIwMSwgMCwgIiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJJbnZhbGlkVGV4dCwgImFuIGVtcHR5IGNvbW1lbnQgaXMgbm90IGEgY29tbWVudCIpCn0KCmZ1bmMgVGVzdElzc3VlSXRlcmF0aW9uSXNOZXdlc3RGaXJzdCh0ICp0ZXN0aW5nLlQpIHsKCV8sIHIgOj0gbmV3UmVwbyh0KQoJZm9yIF8sIHRpdGxlIDo9IHJhbmdlIFtdc3RyaW5neyJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQifSB7CgkJXywgZXJyIDo9IHIuT3Blbklzc3VlKGV2ZSwgMjAwLCB0aXRsZSwgIiIsIG5pbCkKCQl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCX0KCgl2YXIgZ290IFtdc3RyaW5nCglyLkl0ZXJhdGVJc3N1ZXMoMCwgMCwgZnVuYyhpICpJc3N1ZSkgYm9vbCB7CgkJZ290ID0gYXBwZW5kKGdvdCwgaS5UaXRsZSkKCQlyZXR1cm4gZmFsc2UKCX0pCgl1YXNzZXJ0LkVxdWFsKHQsICJ0aGlyZCxzZWNvbmQsZmlyc3QiLCBqb2luKGdvdCkpCgoJdmFyIHBhZ2UgW11zdHJpbmcKCXIuSXRlcmF0ZUlzc3VlcygxLCAxLCBmdW5jKGkgKklzc3VlKSBib29sIHsKCQlwYWdlID0gYXBwZW5kKHBhZ2UsIGkuVGl0bGUpCgkJcmV0dXJuIGZhbHNlCgl9KQoJdWFzc2VydC5FcXVhbCh0LCAic2Vjb25kIiwgam9pbihwYWdlKSkKCglpIDo9IHIuSXNzdWUoMCkKCXVyZXF1aXJlLk5vdEVxdWFsKHQsIG5pbCwgaSkKCWZvciBuIDo9IDA7IG4gPCAzOyBuKysgewoJCV8sIGVyciA6PSByLkNvbW1lbnRJc3N1ZShldmUsIDIwMSwgMCwgInBpbmciKQoJCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJfQoJdmFyIGJvZGllcyBbXXN0cmluZwoJaS5JdGVyYXRlQ29tbWVudHMoMCwgMiwgZnVuYyhjICpDb21tZW50KSBib29sIHsKCQlib2RpZXMgPSBhcHBlbmQoYm9kaWVzLCBjLkJvZHkpCgkJcmV0dXJuIGZhbHNlCgl9KQoJdWFzc2VydC5FcXVhbCh0LCAicGluZyxwaW5nIiwgam9pbihib2RpZXMpKQp9Chr2KQoHcGtnLmdubxLqKXBhY2thZ2UgZm9yZ2UKCmltcG9ydCAic3RyaW5ncyIKCi8vIE1heFBrZ1BhdGhMZW4gYm91bmRzIGEgcHVibGlzaGVkIHBhY2thZ2UgcGF0aC4gZ25vLmxhbmQncyBvd24gcGF0aHMgYXJlIGZhcgovLyBzaG9ydGVyOyB0aGUgY2FwIGV4aXN0cyBiZWNhdXNlIGV2ZXJ5IHN0b3JlZCBieXRlIGlzIGEgc3RvcmFnZSBkZXBvc2l0Ci8vIHNvbWVib2R5IHBheXMuCmNvbnN0IE1heFBrZ1BhdGhMZW4gPSAyNTYKCi8vIFBhY2thZ2UgaXMgdGhlIGNsYWltIHRoYXQgYSByZXBvIHB1Ymxpc2hlcyBhIGRlcGxveWVkIHBhY2thZ2UgcGF0aC4KLy8KLy8gVGhpcyBpcyB0aGUgam9pbiBub3RoaW5nIGVsc2UgaW4gdGhlIGZvcmdlIGNvdWxkIGV4cHJlc3MuIEEgcmVwbyBpZCBpcwovLyAiPG5hbWVzcGFjZT4vPG5hbWU+IiwgZXhhY3RseSB0d28gcGFydHMsIHNvIGByL21vdWwvaG9tZWAgY2FuIG5ldmVyIGJlIG9uZToKLy8gdGhlcmUgd2FzIG5vIHdheSB0byBhc2sgIndoaWNoIHJlcG8gcHVibGlzaGVzIHRoaXMgcGFja2FnZSBwYXRoIiwgd2hpY2ggaXMKLy8gdGhlIGZpcnN0IHF1ZXN0aW9uIGEgcmVhZGVyIGFycml2aW5nIGZyb20gYW4gZXhwbG9yZXIgaGFzLgovLwovLyBUaGUgY2xhaW0gaXMgZGVsaWJlcmF0ZWx5IG9uZS1kaXJlY3Rpb25hbCBhbmQgdW52ZXJpZmllZC4gQSByZWFsbSBjYW5ub3QgYXNrCi8vIHRoZSBjaGFpbiB3aG8gZGVwbG95ZWQgYSBwYXRoLCBzbyB0aGUgZm9yZ2UgY2Fubm90IGNoZWNrIHRoYXQgdGhlIHJlcG8gcmVhbGx5Ci8vIGlzIHRoZSBzb3VyY2Ugb2YgdGhlIHBhY2thZ2UuIFdoYXQgaXQgY2FuIGd1YXJhbnRlZSBpcyB0aGF0IG9ubHkgc29tZW9uZSB3aXRoCi8vIHdyaXRlIGFjY2VzcyB0byB0aGUgcmVwbyBzYWlkIHNvLCBhbmQgdGhhdCB0aGUgbmFtZXNwYWNlIG9mIHRoZSByZXBvIGlzCi8vIGdvdmVybmVkIGJ5IHIvc3lzL3VzZXJzLiBBIHJlYWRlciB3ZWlnaHMgdGhlIGNsYWltIHRoZSB3YXkgdGhleSB3ZWlnaCBhCi8vIGdvLm1vZDogaXQgc2F5cyB3aGVyZSB0aGUgYXV0aG9yIHNheXMgdGhlIHNvdXJjZSBsaXZlcy4KdHlwZSBQYWNrYWdlIHN0cnVjdCB7CglQYXRoICAgICAgICBzdHJpbmcgLy8gImduby5sYW5kL3IvbW91bC9ob21lIiwgdGhlIGRlcGxveWVkIHBhY2thZ2UgcGF0aAoJUmVwb0lEICAgICAgc3RyaW5nCglSZWYgICAgICAgICBzdHJpbmcgLy8gdGhlIHJlZiB0aGlzIHdhcyBwdWJsaXNoZWQgZnJvbSwgIiIgaWYgdW5zdGF0ZWQKCU9JRCAgICAgICAgIHN0cmluZyAvLyB0aGUgb2JqZWN0IGlkLCAiIiBpZiB1bnN0YXRlZAoJVGFnICAgICAgICAgc3RyaW5nIC8vIHRoZSByZWxlYXNlIHRhZywgIiIgaWYgbm90IHB1Ymxpc2hlZCBhcyBwYXJ0IG9mIG9uZQoJUHVibGlzaGVkQXQgaW50NjQgIC8vIGJsb2NrIGhlaWdodAoJUHVibGlzaGVkQnkgYWRkcmVzcwp9CgovLyBWYWxpZFBrZ1BhdGggcmVwb3J0cyB3aGV0aGVyIHMgaXMgYSBwbGF1c2libGUgZ25vIHBhY2thZ2UgcGF0aC4KLy8KLy8gRGVsaWJlcmF0ZWx5IHNoYWxsb3c6IGl0IGNoZWNrcyBzaGFwZSwgbm90IGV4aXN0ZW5jZSwgYmVjYXVzZSBhIHJlYWxtIGNhbm5vdAovLyBhc2sgdGhlIGNoYWluIHdoZXRoZXIgYSBwYXRoIGlzIGRlcGxveWVkIGFuZCBhIGNoZWNrIHRoYXQgb25seSBzb21ldGltZXMKLy8gd29ya3MgaXMgd29yc2UgdGhhbiBvbmUgdGhhdCBuZXZlciBjbGFpbXMgdG8uCmZ1bmMgVmFsaWRQa2dQYXRoKHMgc3RyaW5nKSBib29sIHsKCWlmIHMgPT0gIiIgfHwgbGVuKHMpID4gTWF4UGtnUGF0aExlbiB7CgkJcmV0dXJuIGZhbHNlCgl9CglpZiBzdHJpbmdzLkNvbnRhaW5zKHMsICIuLiIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KHMsICIvIikgewoJCXJldHVybiBmYWxzZQoJfQoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChzLCAiLyIpCglpZiBsZW4ocGFydHMpIDwgMyB7CgkJcmV0dXJuIGZhbHNlCgl9Cglmb3IgXywgcCA6PSByYW5nZSBwYXJ0cyB7CgkJaWYgcCA9PSAiIiB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQlmb3IgaSA6PSAwOyBpIDwgbGVuKHApOyBpKysgewoJCQljIDo9IHBbaV0KCQkJb2sgOj0gKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHx8CgkJCQkoYyA+PSAnMCcgJiYgYyA8PSAnOScpIHx8IGMgPT0gJy4nIHx8IGMgPT0gJy0nIHx8IGMgPT0gJ18nCgkJCWlmICFvayB7CgkJCQlyZXR1cm4gZmFsc2UKCQkJfQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCi8vIFB1Ymxpc2hQYWNrYWdlIHJlY29yZHMgdGhhdCB0aGlzIHJlcG8gcHVibGlzaGVzIHBhdGgsIGFuZCBpbmRleGVzIGl0Ci8vIGZvcmdlLXdpZGUgc28gUGFja2FnZVJlcG8gY2FuIGFuc3dlciB3aXRob3V0IHNjYW5uaW5nIGV2ZXJ5IHJlcG8uCi8vCi8vIFJlLXB1Ymxpc2hpbmcgdGhlIHNhbWUgcGF0aCBmcm9tIHRoZSBzYW1lIHJlcG8gb3ZlcndyaXRlcyB0aGUgZW50cnksIHdoaWNoIGlzCi8vIHdoYXQgYSByZWRlcGxveSBpcy4gUHVibGlzaGluZyBhIHBhdGggYW5vdGhlciByZXBvIGFscmVhZHkgY2xhaW1zIGlzIHJlZnVzZWQ6Ci8vIHNpbGVudGx5IG1vdmluZyBpdCB3b3VsZCBsZXQgYW55IHJlcG8gb3duZXIgY2FwdHVyZSBhbm90aGVyIHByb2plY3QncwovLyBwYWNrYWdlIHBhdGggaW4gYW4gZXhwbG9yZXIuCmZ1bmMgKGYgKkZvcmdlKSBQdWJsaXNoUGFja2FnZShhY3RvciBhZGRyZXNzLCBoZWlnaHQgaW50NjQsIHJlcG9JRCwgcGF0aCwgcmVmLCBvaWQsIHRhZyBzdHJpbmcpICgqUGFja2FnZSwgZXJyb3IpIHsKCXIgOj0gZi5SZXBvKHJlcG9JRCkKCWlmIHIgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBFcnJSZXBvTm90Rm91bmQKCX0KCWlmIHIuQXJjaGl2ZWQgewoJCXJldHVybiBuaWwsIEVyclJlcG9BcmNoaXZlZAoJfQoJaWYgIXIuQ2FuKGFjdG9yLCBSb2xlV3JpdGVyKSB7CgkJcmV0dXJuIG5pbCwgRXJyVW5hdXRob3JpemVkCgl9CglpZiAhVmFsaWRQa2dQYXRoKHBhdGgpIHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkUGtnUGF0aAoJfQoJaWYgcmVmICE9ICIiICYmICFWYWxpZFJlZk5hbWUocmVmKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZFJlZk5hbWUKCX0KCWlmIG9pZCAhPSAiIiAmJiAhVmFsaWRPSUQob2lkKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZE9JRAoJfQoJaWYgdGFnICE9ICIiICYmICFWYWxpZFRleHQodGFnLCBNYXhUYWdMZW4pIHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkVGV4dAoJfQoJaWYgb3duZXIgOj0gZi5wYWNrYWdlcy5HZXQocGF0aCk7IG93bmVyICE9IG5pbCB7CgkJaWYgZXhpc3RpbmcgOj0gb3duZXIuKCpQYWNrYWdlKTsgZXhpc3RpbmcuUmVwb0lEICE9IHJlcG9JRCB7CgkJCXJldHVybiBuaWwsIEVyclBhY2thZ2VDbGFpbWVkCgkJfQoJfQoKCXAgOj0gJlBhY2thZ2V7CgkJUGF0aDogICAgICAgIHBhdGgsCgkJUmVwb0lEOiAgICAgIHJlcG9JRCwKCQlSZWY6ICAgICAgICAgcmVmLAoJCU9JRDogICAgICAgICBvaWQsCgkJVGFnOiAgICAgICAgIHRhZywKCQlQdWJsaXNoZWRBdDogaGVpZ2h0LAoJCVB1Ymxpc2hlZEJ5OiBhY3RvciwKCX0KCWYucGFja2FnZXMuU2V0KHBhdGgsIHApCglyLnBhY2thZ2VzLlNldChwYXRoLCBwKQoJcmV0dXJuIHAsIG5pbAp9CgovLyBVbnB1Ymxpc2hQYWNrYWdlIHdpdGhkcmF3cyB0aGUgY2xhaW0uIFRoZSBwYWNrYWdlIHN0YXlzIG9uIGNoYWluOyBvbmx5IHRoZQovLyByZXBvJ3MgYXNzZXJ0aW9uIGFib3V0IGl0IGdvZXMgYXdheS4KZnVuYyAoZiAqRm9yZ2UpIFVucHVibGlzaFBhY2thZ2UoYWN0b3IgYWRkcmVzcywgcmVwb0lELCBwYXRoIHN0cmluZykgZXJyb3IgewoJciA6PSBmLlJlcG8ocmVwb0lEKQoJaWYgciA9PSBuaWwgewoJCXJldHVybiBFcnJSZXBvTm90Rm91bmQKCX0KCWlmICFyLkNhbihhY3RvciwgUm9sZVdyaXRlcikgewoJCXJldHVybiBFcnJVbmF1dGhvcml6ZWQKCX0KCWlmIF8sIHJlbW92ZWQgOj0gci5wYWNrYWdlcy5SZW1vdmUocGF0aCk7ICFyZW1vdmVkIHsKCQlyZXR1cm4gRXJyUGFja2FnZU5vdEZvdW5kCgl9CglmLnBhY2thZ2VzLlJlbW92ZShwYXRoKQoJcmV0dXJuIG5pbAp9CgovLyBQYWNrYWdlUmVwbyBpcyB0aGUgbG9va3VwIGFuIGV4cGxvcmVyIG1ha2VzOiBnaXZlbiBhIGRlcGxveWVkIHBhdGgsIHdoaWNoCi8vIHJlcG8gY2xhaW1zIHRvIHB1Ymxpc2ggaXQuIFJldHVybnMgIiIgd2hlbiBub2JvZHkgZG9lcy4KZnVuYyAoZiAqRm9yZ2UpIFBhY2thZ2VSZXBvKHBhdGggc3RyaW5nKSBzdHJpbmcgewoJdiA6PSBmLnBhY2thZ2VzLkdldChwYXRoKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiAiIgoJfQoJcmV0dXJuIHYuKCpQYWNrYWdlKS5SZXBvSUQKfQoKLy8gUGFja2FnZUF0IHJldHVybnMgdGhlIGZ1bGwgY2xhaW0gZm9yIGEgcGF0aCwgb3IgbmlsLgpmdW5jIChmICpGb3JnZSkgUGFja2FnZUF0KHBhdGggc3RyaW5nKSAqUGFja2FnZSB7Cgl2IDo9IGYucGFja2FnZXMuR2V0KHBhdGgpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoJcmV0dXJuIHYuKCpQYWNrYWdlKQp9CgovLyBQYWNrYWdlQ291bnQgaXMgaG93IG1hbnkgcGF0aHMgdGhlIHdob2xlIGZvcmdlIGNsYWltcy4KZnVuYyAoZiAqRm9yZ2UpIFBhY2thZ2VDb3VudCgpIGludCB7IHJldHVybiBmLnBhY2thZ2VzLlNpemUoKSB9CgovLyBJdGVyYXRlUGFja2FnZXMgd2Fsa3MgZXZlcnkgY2xhaW1lZCBwYXRoIGluIHRoZSBmb3JnZSwgaW4gcGF0aCBvcmRlci4KZnVuYyAoZiAqRm9yZ2UpIEl0ZXJhdGVQYWNrYWdlcyhvZmZzZXQsIGNvdW50IGludCwgY2IgZnVuYygqUGFja2FnZSkgYm9vbCkgewoJaWYgY291bnQgPD0gMCB7CgkJY291bnQgPSBmLnBhY2thZ2VzLlNpemUoKQoJfQoJZi5wYWNrYWdlcy5JdGVyYXRlQnlPZmZzZXQob2Zmc2V0LCBjb3VudCwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCXJldHVybiBjYih2LigqUGFja2FnZSkpCgl9KQp9CgovLyBQYWNrYWdlQ291bnQgaXMgaG93IG1hbnkgcGF0aHMgdGhpcyByZXBvIGNsYWltcy4KZnVuYyAociAqUmVwbykgUGFja2FnZUNvdW50KCkgaW50IHsgcmV0dXJuIHIucGFja2FnZXMuU2l6ZSgpIH0KCi8vIEl0ZXJhdGVQYWNrYWdlcyB3YWxrcyB0aGUgcGF0aHMgdGhpcyByZXBvIGNsYWltcywgaW4gcGF0aCBvcmRlci4KZnVuYyAociAqUmVwbykgSXRlcmF0ZVBhY2thZ2VzKG9mZnNldCwgY291bnQgaW50LCBjYiBmdW5jKCpQYWNrYWdlKSBib29sKSB7CglpZiBjb3VudCA8PSAwIHsKCQljb3VudCA9IHIucGFja2FnZXMuU2l6ZSgpCgl9CglyLnBhY2thZ2VzLkl0ZXJhdGVCeU9mZnNldChvZmZzZXQsIGNvdW50LCBmdW5jKF8gc3RyaW5nLCB2IGFueSkgYm9vbCB7CgkJcmV0dXJuIGNiKHYuKCpQYWNrYWdlKSkKCX0pCn0KGqEuCgxwa2dfdGVzdC5nbm8SkC5wYWNrYWdlIGZvcmdlCgppbXBvcnQgKAoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKCSJnbm8ubGFuZC9wL250L3VyZXF1aXJlL3YwIgopCgpmdW5jIFRlc3RWYWxpZFBrZ1BhdGgodCAqdGVzdGluZy5UKSB7CgljYXNlcyA6PSBbXXN0cnVjdCB7CgkJbmFtZSBzdHJpbmcKCQlwYXRoIHN0cmluZwoJCXdhbnQgYm9vbAoJfXsKCQl7ImEgcmVhbG0iLCAiZ25vLmxhbmQvci9tb3VsL2hvbWUiLCB0cnVlfSwKCQl7ImEgcHVyZSBwYWNrYWdlIiwgImduby5sYW5kL3AvbW91bC9mb3JnZS92MSIsIHRydWV9LAoJCXsiZGVlcCIsICJnbm8ubGFuZC9yL21vdWwveC9kYWlseS9hc2NpaWFydC92MCIsIHRydWV9LAoJCXsiYW4gYWRkcmVzcyBuYW1lc3BhY2UiLCAiZ25vLmxhbmQvci9nMWFiYy90aGluZyIsIHRydWV9LAoJCXsidW5kZXJzY29yZXMgYW5kIGRhc2hlcyIsICJnbm8ubGFuZC9yL25zL2EtYl9jIiwgdHJ1ZX0sCgkJLy8gU2hhcGUgb25seS4gQSByZWFsbSBjYW5ub3QgYXNrIHRoZSBjaGFpbiB3aGV0aGVyIGEgcGF0aCBpcyBkZXBsb3llZCwKCQkvLyBzbyBhbnl0aGluZyBzdHJpY3RlciB3b3VsZCBiZSBhIGNoZWNrIHRoYXQgb25seSBzb21ldGltZXMgd29ya3MuCgkJeyJub3QgZGVwbG95ZWQgYnV0IHdlbGwgZm9ybWVkIiwgImduby5sYW5kL3Ivbm9ib2R5L25vdGhpbmciLCB0cnVlfSwKCQl7ImVtcHR5IiwgIiIsIGZhbHNlfSwKCQl7InR3byBwYXJ0cyIsICJnbm8ubGFuZC9yIiwgZmFsc2V9LAoJCXsiYSB0cmF2ZXJzYWwiLCAiZ25vLmxhbmQvci8uLi9ldGMiLCBmYWxzZX0sCgkJeyJ0cmFpbGluZyBzbGFzaCIsICJnbm8ubGFuZC9yL21vdWwvaG9tZS8iLCBmYWxzZX0sCgkJeyJhbiBlbXB0eSBlbGVtZW50IiwgImduby5sYW5kLy9yL21vdWwiLCBmYWxzZX0sCgkJeyJhIHNwYWNlIiwgImduby5sYW5kL3IvbW91bC9teSBob21lIiwgZmFsc2V9LAoJCXsiYSBjb2xvbiIsICJnbm8ubGFuZC9yL21vdWwvaG9tZTp0YWIiLCBmYWxzZX0sCgl9Cglmb3IgXywgdGMgOj0gcmFuZ2UgY2FzZXMgewoJCXQuUnVuKHRjLm5hbWUsIGZ1bmModCAqdGVzdGluZy5UKSB7CgkJCXVhc3NlcnQuRXF1YWwodCwgdGMud2FudCwgVmFsaWRQa2dQYXRoKHRjLnBhdGgpKQoJCX0pCgl9Cn0KCmZ1bmMgVGVzdFB1Ymxpc2hQYWNrYWdlSW5kZXhlc0ZvcmdlV2lkZSh0ICp0ZXN0aW5nLlQpIHsKCWYsIHIgOj0gbmV3UmVwbyh0KQoKCXAsIGVyciA6PSBmLlB1Ymxpc2hQYWNrYWdlKGNhcm9sLCAyMDAsIHIuSUQsICJnbm8ubGFuZC9yL21vdWwvaG9tZSIsICJyZWZzL2hlYWRzL21haW4iLCBvaWQoImEiKSwgIiIpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgImduby5sYW5kL3IvbW91bC9ob21lIiwgcC5QYXRoKQoJdWFzc2VydC5FcXVhbCh0LCByLklELCBwLlJlcG9JRCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMjAwKSwgcC5QdWJsaXNoZWRBdCkKCgkvLyBUaGUgbG9va3VwIGFuIGV4cGxvcmVyIG1ha2VzOiBpdCBzdGFydHMgZnJvbSB0aGUgcGF0aCBhbmQgZG9lcyBub3Qga25vdwoJLy8gdGhlIHJlcG8geWV0LCB3aGljaCBpcyB0aGUgd2hvbGUgcmVhc29uIHRoZSBpbmRleCBpcyBmb3JnZS13aWRlLgoJdWFzc2VydC5FcXVhbCh0LCByLklELCBmLlBhY2thZ2VSZXBvKCJnbm8ubGFuZC9yL21vdWwvaG9tZSIpKQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgZi5QYWNrYWdlUmVwbygiZ25vLmxhbmQvci9zb21lb25lL2Vsc2UiKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgZi5QYWNrYWdlQ291bnQoKSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgci5QYWNrYWdlQ291bnQoKSkKfQoKLy8gT25lIHJlcG8gcHVibGlzaGVzIG1hbnkgcGF0aHM6IGduby1jb250cmFjdHMgcHVibGlzaGVzIDE5My4KZnVuYyBUZXN0UHVibGlzaE1hbnlQYWNrYWdlcyh0ICp0ZXN0aW5nLlQpIHsKCWYsIHIgOj0gbmV3UmVwbyh0KQoKCXBhdGhzIDo9IFtdc3RyaW5newoJCSJnbm8ubGFuZC9yL21vdWwvaG9tZSIsCgkJImduby5sYW5kL3AvbW91bC9mb3JnZS92MSIsCgkJImduby5sYW5kL3IvbW91bC9ibG9nIiwKCX0KCWZvciBfLCBwYXRoIDo9IHJhbmdlIHBhdGhzIHsKCQlfLCBlcnIgOj0gZi5QdWJsaXNoUGFja2FnZShhbGljZSwgMjAwLCByLklELCBwYXRoLCAiIiwgIiIsICIiKQoJCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJfQoJdWFzc2VydC5FcXVhbCh0LCAzLCByLlBhY2thZ2VDb3VudCgpKQoKCXZhciBzZWVuIFtdc3RyaW5nCglyLkl0ZXJhdGVQYWNrYWdlcygwLCAwLCBmdW5jKHAgKlBhY2thZ2UpIGJvb2wgewoJCXNlZW4gPSBhcHBlbmQoc2VlbiwgcC5QYXRoKQoJCXJldHVybiBmYWxzZQoJfSkKCS8vIFBhdGggb3JkZXIsIHdoaWNoIGlzIHdoYXQgdGhlIHRyZWUgZ2l2ZXMgYW5kIHdoYXQgYSBmaWxlIGxpc3Qgd2FudHMuCgl1cmVxdWlyZS5FcXVhbCh0LCAzLCBsZW4oc2VlbikpCgl1YXNzZXJ0LkVxdWFsKHQsICJnbm8ubGFuZC9wL21vdWwvZm9yZ2UvdjEiLCBzZWVuWzBdKQoJdWFzc2VydC5FcXVhbCh0LCAiZ25vLmxhbmQvci9tb3VsL2Jsb2ciLCBzZWVuWzFdKQoJdWFzc2VydC5FcXVhbCh0LCAiZ25vLmxhbmQvci9tb3VsL2hvbWUiLCBzZWVuWzJdKQp9CgovLyBSZS1wdWJsaXNoaW5nIHRoZSBzYW1lIHBhdGggZnJvbSB0aGUgc2FtZSByZXBvIGlzIGEgcmVkZXBsb3ksIGFuZCBvdmVyd3JpdGVzLgpmdW5jIFRlc3RSZXB1Ymxpc2hPdmVyd3JpdGVzKHQgKnRlc3RpbmcuVCkgewoJZiwgciA6PSBuZXdSZXBvKHQpCgoJXywgZXJyIDo9IGYuUHVibGlzaFBhY2thZ2UoYWxpY2UsIDIwMCwgci5JRCwgImduby5sYW5kL3IvbW91bC9ob21lIiwgIiIsIG9pZCgiYSIpLCAidjEuMC4wIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJXywgZXJyID0gZi5QdWJsaXNoUGFja2FnZShhbGljZSwgMzAwLCByLklELCAiZ25vLmxhbmQvci9tb3VsL2hvbWUiLCAiIiwgb2lkKCJiIiksICJ2MS4xLjAiKQoJdXJlcXVpcmUuTm9FcnJvcih0LCBlcnIpCgoJdWFzc2VydC5FcXVhbCh0LCAxLCBmLlBhY2thZ2VDb3VudCgpKQoJZ290IDo9IGYuUGFja2FnZUF0KCJnbm8ubGFuZC9yL21vdWwvaG9tZSIpCgl1cmVxdWlyZS5UcnVlKHQsIGdvdCAhPSBuaWwpCgl1YXNzZXJ0LkVxdWFsKHQsIG9pZCgiYiIpLCBnb3QuT0lEKQoJdWFzc2VydC5FcXVhbCh0LCAidjEuMS4wIiwgZ290LlRhZykKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMzAwKSwgZ290LlB1Ymxpc2hlZEF0KQp9CgovLyBTaWxlbnRseSBtb3ZpbmcgYSBjbGFpbWVkIHBhdGggd291bGQgbGV0IGFueSByZXBvIG93bmVyIGNhcHR1cmUgYW5vdGhlcgovLyBwcm9qZWN0J3MgcGFja2FnZSBpbiBldmVyeSBleHBsb3JlciB0aGF0IHJlYWRzIHRoaXMgaW5kZXguCmZ1bmMgVGVzdFB1Ymxpc2hSZWZ1c2VzQW5vdGhlclJlcG9zUGF0aCh0ICp0ZXN0aW5nLlQpIHsKCWYsIHIgOj0gbmV3UmVwbyh0KQoJXywgZXJyIDo9IGYuUHVibGlzaFBhY2thZ2UoYWxpY2UsIDIwMCwgci5JRCwgImduby5sYW5kL3IvbW91bC9ob21lIiwgIiIsICIiLCAiIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoKCW90aGVyLCBlcnIgOj0gZi5DcmVhdGVSZXBvKGV2ZSwgMjEwLCAiZXZlL3NxdWF0IiwgIiIsICIiKQoJdXJlcXVpcmUuTm9FcnJvcih0LCBlcnIpCgoJXywgZXJyID0gZi5QdWJsaXNoUGFja2FnZShldmUsIDIyMCwgb3RoZXIuSUQsICJnbm8ubGFuZC9yL21vdWwvaG9tZSIsICIiLCAiIiwgIiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJQYWNrYWdlQ2xhaW1lZCkKCXVhc3NlcnQuRXF1YWwodCwgci5JRCwgZi5QYWNrYWdlUmVwbygiZ25vLmxhbmQvci9tb3VsL2hvbWUiKSkKfQoKZnVuYyBUZXN0UHVibGlzaEF1dGhvcml0eUFuZFZhbGlkYXRpb24odCAqdGVzdGluZy5UKSB7CglmLCByIDo9IG5ld1JlcG8odCkKCgkvLyBkYXZlIGlzIGEgcmVhZGVyLCBldmUgaXMgbm90aGluZzogbmVpdGhlciBtYXkgcHVibGlzaC4KCV8sIGVyciA6PSBmLlB1Ymxpc2hQYWNrYWdlKGRhdmUsIDIwMCwgci5JRCwgImduby5sYW5kL3IvbW91bC9ob21lIiwgIiIsICIiLCAiIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyclVuYXV0aG9yaXplZCkKCV8sIGVyciA9IGYuUHVibGlzaFBhY2thZ2UoZXZlLCAyMDAsIHIuSUQsICJnbm8ubGFuZC9yL21vdWwvaG9tZSIsICIiLCAiIiwgIiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJVbmF1dGhvcml6ZWQpCgoJXywgZXJyID0gZi5QdWJsaXNoUGFja2FnZShhbGljZSwgMjAwLCAibm9ib2R5L25vdGhpbmciLCAiZ25vLmxhbmQvci94L3kiLCAiIiwgIiIsICIiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyUmVwb05vdEZvdW5kKQoKCV8sIGVyciA9IGYuUHVibGlzaFBhY2thZ2UoYWxpY2UsIDIwMCwgci5JRCwgIm5vdCBhIHBhdGgiLCAiIiwgIiIsICIiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJySW52YWxpZFBrZ1BhdGgpCgoJXywgZXJyID0gZi5QdWJsaXNoUGFja2FnZShhbGljZSwgMjAwLCByLklELCAiZ25vLmxhbmQvci9tb3VsL2hvbWUiLCAibWFpbiIsICIiLCAiIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyckludmFsaWRSZWZOYW1lKQoKCV8sIGVyciA9IGYuUHVibGlzaFBhY2thZ2UoYWxpY2UsIDIwMCwgci5JRCwgImduby5sYW5kL3IvbW91bC9ob21lIiwgIiIsICJub3RoZXgiLCAiIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyckludmFsaWRPSUQpCgoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlNldEFyY2hpdmVkKGFsaWNlLCB0cnVlKSkKCV8sIGVyciA9IGYuUHVibGlzaFBhY2thZ2UoYWxpY2UsIDIwMCwgci5JRCwgImduby5sYW5kL3IvbW91bC9ob21lIiwgIiIsICIiLCAiIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyclJlcG9BcmNoaXZlZCkKfQoKZnVuYyBUZXN0VW5wdWJsaXNoQ2xlYXJzQm90aEhhbHZlc09mVGhlSW5kZXgodCAqdGVzdGluZy5UKSB7CglmLCByIDo9IG5ld1JlcG8odCkKCV8sIGVyciA6PSBmLlB1Ymxpc2hQYWNrYWdlKGFsaWNlLCAyMDAsIHIuSUQsICJnbm8ubGFuZC9yL21vdWwvaG9tZSIsICIiLCAiIiwgIiIpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCgl1YXNzZXJ0LkVycm9ySXModCwgZi5VbnB1Ymxpc2hQYWNrYWdlKGRhdmUsIHIuSUQsICJnbm8ubGFuZC9yL21vdWwvaG9tZSIpLCBFcnJVbmF1dGhvcml6ZWQpCgl1YXNzZXJ0LkVycm9ySXModCwgZi5VbnB1Ymxpc2hQYWNrYWdlKGFsaWNlLCByLklELCAiZ25vLmxhbmQvci9ub3RoaW5nIiksIEVyclBhY2thZ2VOb3RGb3VuZCkKCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGYuVW5wdWJsaXNoUGFja2FnZShhbGljZSwgci5JRCwgImduby5sYW5kL3IvbW91bC9ob21lIikpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIGYuUGFja2FnZUNvdW50KCkpCgl1YXNzZXJ0LkVxdWFsKHQsIDAsIHIuUGFja2FnZUNvdW50KCkpCgl1YXNzZXJ0LkVxdWFsKHQsICIiLCBmLlBhY2thZ2VSZXBvKCJnbm8ubGFuZC9yL21vdWwvaG9tZSIpKQp9CgovLyBBIGZvcmsgaXMgbm90IGEgcHVibGlzaGVyIG9mIGl0cyBwYXJlbnQncyBwYXRocy4KZnVuYyBUZXN0Rm9ya0luaGVyaXRzTm9QYWNrYWdlcyh0ICp0ZXN0aW5nLlQpIHsKCWYsIHIgOj0gbmV3UmVwbyh0KQoJXywgZXJyIDo9IGYuUHVibGlzaFBhY2thZ2UoYWxpY2UsIDIwMCwgci5JRCwgImduby5sYW5kL3IvbW91bC9ob21lIiwgIiIsICIiLCAiIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoKCWNoaWxkLCBlcnIgOj0gZi5Gb3JrKGV2ZSwgMjEwLCByLklELCAiZXZlL2ZvcmdlIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJdWFzc2VydC5FcXVhbCh0LCAwLCBjaGlsZC5QYWNrYWdlQ291bnQoKSkKCXVhc3NlcnQuRXF1YWwodCwgci5JRCwgZi5QYWNrYWdlUmVwbygiZ25vLmxhbmQvci9tb3VsL2hvbWUiKSkKfQoajD8KB3JlZi5nbm8SgD9wYWNrYWdlIGZvcmdlCgppbXBvcnQgKAoJImNyeXB0by9zaGEyNTYiCgkiZW5jb2RpbmcvaGV4IgoJInN0cmNvbnYiCgkic3RyaW5ncyIKKQoKLy8gTG9nIGVudHJ5IGtpbmRzLgpjb25zdCAoCglLaW5kQ3JlYXRlID0gImNyZWF0ZSIgLy8gYSByZWYgdGhhdCBkaWQgbm90IGV4aXN0IG5vdyBwb2ludHMgc29tZXdoZXJlCglLaW5kVXBkYXRlID0gInVwZGF0ZSIgLy8gY29tcGFyZS1hbmQtc3dhcCBzdWNjZWVkZWQKCUtpbmRGb3JjZSAgPSAiZm9yY2UiICAvLyB0aGUgdGlwIHdhcyByZXBsYWNlZCB3aXRob3V0IGEgbWF0Y2hpbmcgZXhwZWN0YXRpb24KCUtpbmREZWxldGUgPSAiZGVsZXRlIiAvLyB0aGUgcmVmIGlzIGdvbmUgKHRoZSBsb2cgaXMgbm90KQoJS2luZE1lcmdlICA9ICJtZXJnZSIgIC8vIGFuIHVwZGF0ZSBwZXJmb3JtZWQgYnkgbWVyZ2luZyBhIGNoYW5nZSByZXF1ZXN0CikKCi8vIFJlZiBpcyB0aGUgY3VycmVudCBzdGF0ZSBvZiBvbmUgcmVmZXJlbmNlLiBUaGUgaGlzdG9yeSBvZiBob3cgaXQgZ290IGhlcmUgaXMKLy8gaW4gdGhlIHJlcG8gbG9nLCB3aGljaCBub3RoaW5nIGNhbiByZXdyaXRlLgp0eXBlIFJlZiBzdHJ1Y3QgewoJTmFtZSAgICAgIHN0cmluZwoJT0lEICAgICAgIHN0cmluZwoJVXBkYXRlZEF0IGludDY0CglVcGRhdGVkQnkgYWRkcmVzcwp9CgovLyBMb2dFbnRyeSBpcyBvbmUgbGluayBvZiB0aGUgcmVwbydzIHJlZmVyZW5jZSBsb2cuIFRoZSBsb2cgaXMgYXBwZW5kLW9ubHkgYW5kCi8vIGhhc2gtY2hhaW5lZDogRGlnZXN0IGNvbW1pdHMgdG8gZXZlcnkgZWFybGllciBlbnRyeSwgc28gcHVibGlzaGluZyBhIHNpbmdsZQovLyBkaWdlc3QgKGluIGEgcmVsZWFzZSBub3RlLCBhIHBhY2thZ2UgbWFuaWZlc3QsIGEgdHdlZXQpIHBpbnMgdGhlIGVudGlyZQovLyBoaXN0b3J5IG9mIGV2ZXJ5IHJlZiB1cCB0byB0aGF0IHBvaW50Lgp0eXBlIExvZ0VudHJ5IHN0cnVjdCB7CglTZXEgICAgICBpbnQ2NAoJUmVmICAgICAgc3RyaW5nCglPbGRPSUQgICBzdHJpbmcgLy8gIiIgd2hlbiB0aGUgcmVmIGRpZCBub3QgZXhpc3QKCU5ld09JRCAgIHN0cmluZyAvLyAiIiBvbiBkZWxldGUKCUFjdG9yICAgIGFkZHJlc3MKCUhlaWdodCAgIGludDY0CglLaW5kICAgICBzdHJpbmcKCUNoYW5nZUlEIGludDY0IC8vIHRoZSBtZXJnZWQgY2hhbmdlLCAwIG90aGVyd2lzZQoJTm90ZSAgICAgc3RyaW5nCglEaWdlc3QgICBzdHJpbmcgLy8gaGV4IHNoYTI1NiBvdmVyIHRoZSBwcmV2aW91cyBkaWdlc3QgYW5kIHRoaXMgZW50cnkKfQoKLy8gRW50cnlEaWdlc3QgY29tcHV0ZXMgdGhlIGNoYWluIGRpZ2VzdCBvZiBlIGdpdmVuIHRoZSBwcmV2aW91cyBlbnRyeSdzIGRpZ2VzdC4KLy8gSXQgaXMgZXhwb3J0ZWQgc28gYW4gb2ZmLWNoYWluIHZlcmlmaWVyIGNhbiByZWNvbXB1dGUgdGhlIGNoYWluIGJ5dGUgZm9yIGJ5dGUKLy8gZnJvbSB0aGUgdmFsdWVzIGl0IHJlYWQgYmFjazsgdGhlIGZpZWxkIG9yZGVyIGJlbG93IGlzIHRoZSB3aXJlIGZvcm1hdCBhbmQKLy8gbXVzdCBub3QgY2hhbmdlIHdpdGhpbiBhIHZlcnNpb24uCmZ1bmMgRW50cnlEaWdlc3QocHJldiBzdHJpbmcsIGUgKkxvZ0VudHJ5KSBzdHJpbmcgewoJZmllbGRzIDo9IFtdc3RyaW5newoJCXByZXYsCgkJc3RyY29udi5Gb3JtYXRJbnQoZS5TZXEsIDEwKSwKCQllLlJlZiwKCQllLk9sZE9JRCwKCQllLk5ld09JRCwKCQllLkFjdG9yLlN0cmluZygpLAoJCXN0cmNvbnYuRm9ybWF0SW50KGUuSGVpZ2h0LCAxMCksCgkJZS5LaW5kLAoJCXN0cmNvbnYuRm9ybWF0SW50KGUuQ2hhbmdlSUQsIDEwKSwKCQllLk5vdGUsCgl9CglzdW0gOj0gc2hhMjU2LlN1bTI1NihbXWJ5dGUoc3RyaW5ncy5Kb2luKGZpZWxkcywgIlxuIikpKQoJcmV0dXJuIGhleC5FbmNvZGVUb1N0cmluZyhzdW1bOl0pCn0KCi8vIGFwcGVuZExvZyB3cml0ZXMgb25lIGVudHJ5IGFuZCBhZHZhbmNlcyB0aGUgY2hhaW4gaGVhZC4gQ2FsbGVycyBoYXZlIGFscmVhZHkKLy8gYXV0aG9yaXplZCBhbmQgdmFsaWRhdGVkOyB0aGlzIG5ldmVyIGZhaWxzLgpmdW5jIChyICpSZXBvKSBhcHBlbmRMb2coYWN0b3IgYWRkcmVzcywgaGVpZ2h0IGludDY0LCByZWYsIG9sZE9JRCwgbmV3T0lELCBraW5kIHN0cmluZywgY2hhbmdlSUQgaW50NjQsIG5vdGUgc3RyaW5nKSAqTG9nRW50cnkgewoJZSA6PSAmTG9nRW50cnl7CgkJU2VxOiAgICAgIHIubmV4dFNlcSwKCQlSZWY6ICAgICAgcmVmLAoJCU9sZE9JRDogICBvbGRPSUQsCgkJTmV3T0lEOiAgIG5ld09JRCwKCQlBY3RvcjogICAgYWN0b3IsCgkJSGVpZ2h0OiAgIGhlaWdodCwKCQlLaW5kOiAgICAga2luZCwKCQlDaGFuZ2VJRDogY2hhbmdlSUQsCgkJTm90ZTogICAgIG5vdGUsCgl9CgllLkRpZ2VzdCA9IEVudHJ5RGlnZXN0KHIuaGVhZCwgZSkKCXIubG9nLlNldChzZXFLZXkoZS5TZXEpLCBlKQoJci5oZWFkID0gZS5EaWdlc3QKCXIubmV4dFNlcSsrCglyZXR1cm4gZQp9CgovLyBTZXRSZWYgbW92ZXMgYSByZWYgYnkgY29tcGFyZS1hbmQtc3dhcDogZXhwZWN0ZWRPSUQgbXVzdCBiZSB0aGUgdGlwIHRoZQovLyBjYWxsZXIgbGFzdCBzYXcgKCIiIHRvIGNyZWF0ZSBhIHJlZiB0aGF0IGRvZXMgbm90IGV4aXN0IHlldCkuIFRoaXMgaXMgZ2l0J3MKLy8gLS1mb3JjZS13aXRoLWxlYXNlLCBleGNlcHQgdGhlIGxlYXNlIGlzIGhlbGQgYnkgY29uc2Vuc3VzIHJhdGhlciB0aGFuIGJ5IHRoZQovLyBzZXJ2ZXIgeW91IGFyZSBwdXNoaW5nIHRvLCBzbyBhIGNvbmN1cnJlbnQgcHVzaCBjYW5ub3QgYmUgc2lsZW50bHkgbG9zdCBhbmQgYQovLyByZXdyaXR0ZW4gaGlzdG9yeSBjYW5ub3QgYmUgcHJlc2VudGVkIGFzIGlmIGl0IGhhZCBhbHdheXMgYmVlbiB0aGF0IHdheS4KLy8KLy8gVGhlIGNoYWluIGNhbm5vdCBjaGVjayB0aGF0IG5ld09JRCBkZXNjZW5kcyBmcm9tIGV4cGVjdGVkT0lEOiBpdCBoYXMgbm8KLy8gb2JqZWN0cy4gVGhhdCBjaGVjayBiZWxvbmdzIHRvIGEgY2xpZW50IGhvbGRpbmcgdGhlIHJlcG8sIHdoaWNoIGlzIGV4YWN0bHkKLy8gd2h5IGV2ZXJ5IG1vdmUgaXMgcmVjb3JkZWQgcmF0aGVyIHRoYW4gbWVyZWx5IGFwcGxpZWQuCmZ1bmMgKHIgKlJlcG8pIFNldFJlZihhY3RvciBhZGRyZXNzLCBoZWlnaHQgaW50NjQsIG5hbWUsIGV4cGVjdGVkT0lELCBuZXdPSUQsIG5vdGUgc3RyaW5nKSAoKkxvZ0VudHJ5LCBlcnJvcikgewoJaWYgci5BcmNoaXZlZCB7CgkJcmV0dXJuIG5pbCwgRXJyUmVwb0FyY2hpdmVkCgl9CglpZiAhci5DYW4oYWN0b3IsIFJvbGVXcml0ZXIpIHsKCQlyZXR1cm4gbmlsLCBFcnJVbmF1dGhvcml6ZWQKCX0KCWlmICFWYWxpZFJlZk5hbWUobmFtZSkgewoJCXJldHVybiBuaWwsIEVyckludmFsaWRSZWZOYW1lCgl9CglpZiAhVmFsaWRPSUQobmV3T0lEKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZE9JRAoJfQoJaWYgIVZhbGlkTGluZShub3RlLCBNYXhOb3RlTGVuKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZFRleHQKCX0KCWN1ciA6PSByLlJlZihuYW1lKQoJc3dpdGNoIHsKCWNhc2UgY3VyID09IG5pbCAmJiBleHBlY3RlZE9JRCAhPSAiIjoKCQlyZXR1cm4gbmlsLCBFcnJSZWZOb3RGb3VuZAoJY2FzZSBjdXIgIT0gbmlsICYmIGV4cGVjdGVkT0lEID09ICIiOgoJCXJldHVybiBuaWwsIEVyclJlZkV4aXN0cwoJY2FzZSBjdXIgIT0gbmlsICYmIGN1ci5PSUQgIT0gZXhwZWN0ZWRPSUQ6CgkJcmV0dXJuIG5pbCwgRXJyU3RhbGVSZWYKCWNhc2UgY3VyICE9IG5pbCAmJiBjdXIuT0lEID09IG5ld09JRDoKCQlyZXR1cm4gbmlsLCBFcnJTYW1lT0lECgl9CglraW5kIDo9IEtpbmRVcGRhdGUKCW9sZCA6PSAiIgoJaWYgY3VyID09IG5pbCB7CgkJa2luZCA9IEtpbmRDcmVhdGUKCX0gZWxzZSB7CgkJb2xkID0gY3VyLk9JRAoJfQoJci5yZWZzLlNldChuYW1lLCAmUmVme05hbWU6IG5hbWUsIE9JRDogbmV3T0lELCBVcGRhdGVkQXQ6IGhlaWdodCwgVXBkYXRlZEJ5OiBhY3Rvcn0pCglyZXR1cm4gci5hcHBlbmRMb2coYWN0b3IsIGhlaWdodCwgbmFtZSwgb2xkLCBuZXdPSUQsIGtpbmQsIDAsIG5vdGUpLCBuaWwKfQoKLy8gRm9yY2VTZXRSZWYgbW92ZXMgYSByZWYgd2l0aG91dCBhbiBleHBlY3RhdGlvbi4gSXQgbmVlZHMgUm9sZU1haW50YWluZXIgYW5kCi8vIGlzIHBlcm1hbmVudGx5IHJlY29yZGVkIGFzIEtpbmRGb3JjZTogdGhlIHBvaW50IGlzIG5vdCB0byBmb3JiaWQgYSBmb3JjZS1wdXNoCi8vIChzb21ldGltZXMgaXQgaXMgdGhlIHJpZ2h0IGNhbGwpIGJ1dCB0byBtYWtlIG9uZSBpbXBvc3NpYmxlIHRvIGhpZGUuCmZ1bmMgKHIgKlJlcG8pIEZvcmNlU2V0UmVmKGFjdG9yIGFkZHJlc3MsIGhlaWdodCBpbnQ2NCwgbmFtZSwgbmV3T0lELCBub3RlIHN0cmluZykgKCpMb2dFbnRyeSwgZXJyb3IpIHsKCWlmIHIuQXJjaGl2ZWQgewoJCXJldHVybiBuaWwsIEVyclJlcG9BcmNoaXZlZAoJfQoJaWYgIXIuQ2FuKGFjdG9yLCBSb2xlTWFpbnRhaW5lcikgewoJCXJldHVybiBuaWwsIEVyclVuYXV0aG9yaXplZAoJfQoJaWYgIVZhbGlkUmVmTmFtZShuYW1lKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZFJlZk5hbWUKCX0KCWlmICFWYWxpZE9JRChuZXdPSUQpIHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkT0lECgl9CglpZiAhVmFsaWRMaW5lKG5vdGUsIE1heE5vdGVMZW4pIHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkVGV4dAoJfQoJb2xkIDo9ICIiCglpZiBjdXIgOj0gci5SZWYobmFtZSk7IGN1ciAhPSBuaWwgewoJCWlmIGN1ci5PSUQgPT0gbmV3T0lEIHsKCQkJcmV0dXJuIG5pbCwgRXJyU2FtZU9JRAoJCX0KCQlvbGQgPSBjdXIuT0lECgl9CglyLnJlZnMuU2V0KG5hbWUsICZSZWZ7TmFtZTogbmFtZSwgT0lEOiBuZXdPSUQsIFVwZGF0ZWRBdDogaGVpZ2h0LCBVcGRhdGVkQnk6IGFjdG9yfSkKCXJldHVybiByLmFwcGVuZExvZyhhY3RvciwgaGVpZ2h0LCBuYW1lLCBvbGQsIG5ld09JRCwgS2luZEZvcmNlLCAwLCBub3RlKSwgbmlsCn0KCi8vIERlbGV0ZVJlZiByZW1vdmVzIGEgcmVmIGJ5IGNvbXBhcmUtYW5kLXN3YXAuIFRoZSByZWYgZGlzYXBwZWFycyBmcm9tIHRoZQovLyBjdXJyZW50IHN0YXRlOyB0aGUgbG9nIGtlZXBzIGV2ZXJ5IG9iamVjdCBpdCBldmVyIHBvaW50ZWQgYXQuCi8vCi8vIE1haW50YWluZXItb25seSBmb3IgYW4gZWNvbm9taWMgcmVhc29uIGFzIG11Y2ggYXMgYSBzYWZldHkgb25lOiBvbiBnbm8ubGFuZAovLyB0aGUgc3RvcmFnZS1kZXBvc2l0IHJlZnVuZCBnb2VzIHRvIHdob2V2ZXIgZnJlZXMgdGhlIGJ5dGVzLCBub3QgdG8gd2hvZXZlcgovLyBwYWlkIGZvciB0aGVtIChgcmVjZWl2ZXIgOj0gY2FsbGVyYCBpbiB0aGUgdm0ga2VlcGVyJ3MgZGVwb3NpdCBwYXRoLCBnbm8KLy8gbWFzdGVyIDIwMjYtMDktMTkpLCBzbyBhbiBvcGVuIGRlbGV0ZSBwYXRoIHBheXMgZm9yIHZhbmRhbGlzbS4KZnVuYyAociAqUmVwbykgRGVsZXRlUmVmKGFjdG9yIGFkZHJlc3MsIGhlaWdodCBpbnQ2NCwgbmFtZSwgZXhwZWN0ZWRPSUQsIG5vdGUgc3RyaW5nKSAoKkxvZ0VudHJ5LCBlcnJvcikgewoJaWYgci5BcmNoaXZlZCB7CgkJcmV0dXJuIG5pbCwgRXJyUmVwb0FyY2hpdmVkCgl9CglpZiAhci5DYW4oYWN0b3IsIFJvbGVNYWludGFpbmVyKSB7CgkJcmV0dXJuIG5pbCwgRXJyVW5hdXRob3JpemVkCgl9CglpZiAhVmFsaWRMaW5lKG5vdGUsIE1heE5vdGVMZW4pIHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkVGV4dAoJfQoJY3VyIDo9IHIuUmVmKG5hbWUpCglpZiBjdXIgPT0gbmlsIHsKCQlyZXR1cm4gbmlsLCBFcnJSZWZOb3RGb3VuZAoJfQoJaWYgY3VyLk9JRCAhPSBleHBlY3RlZE9JRCB7CgkJcmV0dXJuIG5pbCwgRXJyU3RhbGVSZWYKCX0KCWlmIG5hbWUgPT0gci5EZWZhdWx0UmVmIHsKCQlyZXR1cm4gbmlsLCBFcnJVbmF1dGhvcml6ZWQgLy8gdGhlIGRlZmF1bHQgYnJhbmNoIGlzIG5vdCBkZWxldGFibGUKCX0KCXIucmVmcy5SZW1vdmUobmFtZSkKCXJldHVybiByLmFwcGVuZExvZyhhY3RvciwgaGVpZ2h0LCBuYW1lLCBjdXIuT0lELCAiIiwgS2luZERlbGV0ZSwgMCwgbm90ZSksIG5pbAp9CgovLyBSZWYgcmV0dXJucyB0aGUgY3VycmVudCBzdGF0ZSBvZiBhIHJlZiwgb3IgbmlsLgpmdW5jIChyICpSZXBvKSBSZWYobmFtZSBzdHJpbmcpICpSZWYgewoJdiA6PSByLnJlZnMuR2V0KG5hbWUpCglpZiB2ID09IG5pbCB7CgkJcmV0dXJuIG5pbAoJfQoJcmV0dXJuIHYuKCpSZWYpCn0KCi8vIEl0ZXJhdGVSZWZzIHdhbGtzIHJlZnMgaW4gbmFtZSBvcmRlci4KZnVuYyAociAqUmVwbykgSXRlcmF0ZVJlZnMoY2IgZnVuYygqUmVmKSBib29sKSB7CglyLnJlZnMuSXRlcmF0ZSgiIiwgIiIsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcmV0dXJuIGNiKHZhbHVlLigqUmVmKSkKCX0pCn0KCi8vIExvZ0hlYWQgaXMgdGhlIGRpZ2VzdCBvZiB0aGUgbGFzdCBlbnRyeSwgIiIgZm9yIGFuIGVtcHR5IGxvZy4gUGluIHRoaXMgdmFsdWUKLy8gYW55d2hlcmUgb2ZmIGNoYWluIGFuZCB0aGUgd2hvbGUgaGlzdG9yeSBiZWNvbWVzIGZhbHNpZmlhYmxlLgpmdW5jIChyICpSZXBvKSBMb2dIZWFkKCkgc3RyaW5nIHsgcmV0dXJuIHIuaGVhZCB9CgovLyBMb2dTaXplIGlzIHRoZSBudW1iZXIgb2YgZW50cmllcyBldmVyIGFwcGVuZGVkLgpmdW5jIChyICpSZXBvKSBMb2dTaXplKCkgaW50IHsgcmV0dXJuIHIubG9nLlNpemUoKSB9CgovLyBMb2dFbnRyeUF0IHJldHVybnMgb25lIGVudHJ5IGJ5IHNlcXVlbmNlIG51bWJlciwgb3IgbmlsLgpmdW5jIChyICpSZXBvKSBMb2dFbnRyeUF0KHNlcSBpbnQ2NCkgKkxvZ0VudHJ5IHsKCXYgOj0gci5sb2cuR2V0KHNlcUtleShzZXEpKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCXJldHVybiB2LigqTG9nRW50cnkpCn0KCi8vIEl0ZXJhdGVMb2cgd2Fsa3MgdGhlIGxvZyBvbGRlc3QtZmlyc3QuCmZ1bmMgKHIgKlJlcG8pIEl0ZXJhdGVMb2cob2Zmc2V0LCBjb3VudCBpbnQsIGNiIGZ1bmMoKkxvZ0VudHJ5KSBib29sKSB7CglpZiBjb3VudCA8PSAwIHsKCQljb3VudCA9IHIubG9nLlNpemUoKQoJfQoJci5sb2cuSXRlcmF0ZUJ5T2Zmc2V0KG9mZnNldCwgY291bnQsIGZ1bmMoXyBzdHJpbmcsIHZhbHVlIGFueSkgYm9vbCB7CgkJcmV0dXJuIGNiKHZhbHVlLigqTG9nRW50cnkpKQoJfSkKfQoKLy8gSXRlcmF0ZUxvZ1JldmVyc2Ugd2Fsa3MgdGhlIGxvZyBuZXdlc3QtZmlyc3QsIHdoaWNoIGlzIHdoYXQgYSBVSSB3YW50cy4KZnVuYyAociAqUmVwbykgSXRlcmF0ZUxvZ1JldmVyc2Uob2Zmc2V0LCBjb3VudCBpbnQsIGNiIGZ1bmMoKkxvZ0VudHJ5KSBib29sKSB7CglpZiBjb3VudCA8PSAwIHsKCQljb3VudCA9IHIubG9nLlNpemUoKQoJfQoJci5sb2cuUmV2ZXJzZUl0ZXJhdGVCeU9mZnNldChvZmZzZXQsIGNvdW50LCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCXJldHVybiBjYih2YWx1ZS4oKkxvZ0VudHJ5KSkKCX0pCn0KCi8vIFZlcmlmeUxvZyByZWNvbXB1dGVzIHRoZSB3aG9sZSBkaWdlc3QgY2hhaW4gYW5kIHJlcG9ydHMgdGhlIGZpcnN0IGVudHJ5IHdob3NlCi8vIGRpZ2VzdCBkb2VzIG5vdCBmb2xsb3cgZnJvbSBpdHMgcHJlZGVjZXNzb3IuIEl0IHNob3VsZCBiZSBpbXBvc3NpYmxlIG9uIGEKLy8gbGl2ZSBjaGFpbjogaXQgaXMgaGVyZSBiZWNhdXNlIGEgdHJhbnNwYXJlbmN5IGxvZyBub2JvZHkgY2FuIHZlcmlmeSBpcyBqdXN0Ci8vIGEgbG9nLCBhbmQgYSBjbGllbnQgc2hvdWxkIGJlIHJ1bm5pbmcgdGhpcyBhZ2FpbnN0IHRoZSB2YWx1ZXMgaXQgcmVhZCBiYWNrLgpmdW5jIChyICpSZXBvKSBWZXJpZnlMb2coKSAoYm9vbCwgaW50NjQpIHsKCXByZXYgOj0gIiIKCWJhZCA6PSBpbnQ2NCgtMSkKCXIubG9nLkl0ZXJhdGUoIiIsICIiLCBmdW5jKF8gc3RyaW5nLCB2YWx1ZSBhbnkpIGJvb2wgewoJCWUgOj0gdmFsdWUuKCpMb2dFbnRyeSkKCQlpZiBFbnRyeURpZ2VzdChwcmV2LCBlKSAhPSBlLkRpZ2VzdCB7CgkJCWJhZCA9IGUuU2VxCgkJCXJldHVybiB0cnVlCgkJfQoJCXByZXYgPSBlLkRpZ2VzdAoJCXJldHVybiBmYWxzZQoJfSkKCXJldHVybiBiYWQgPCAwLCBiYWQKfQoa3CsKDHJlZl90ZXN0LmdubxLLK3BhY2thZ2UgZm9yZ2UKCmltcG9ydCAoCgkidGVzdGluZyIKCgkiZ25vLmxhbmQvcC9udC91YXNzZXJ0L3YwIgoJImduby5sYW5kL3AvbnQvdXJlcXVpcmUvdjAiCikKCmZ1bmMgVGVzdFNldFJlZkNvbXBhcmVBbmRTd2FwKHQgKnRlc3RpbmcuVCkgewoJXywgciA6PSBuZXdSZXBvKHQpCgoJLy8gQ3JlYXRlOiB0aGUgZXhwZWN0YXRpb24gaXMgInRoaXMgcmVmIGRvZXMgbm90IGV4aXN0Ii4KCWUsIGVyciA6PSByLlNldFJlZihjYXJvbCwgMTAxLCAicmVmcy9oZWFkcy9tYWluIiwgIiIsIG9pZCgiYSIpLCAiaW5pdGlhbCBpbXBvcnQiKQoJdXJlcXVpcmUuTm9FcnJvcih0LCBlcnIpCgl1YXNzZXJ0LkVxdWFsKHQsIEtpbmRDcmVhdGUsIGUuS2luZCkKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMCksIGUuU2VxKQoJdWFzc2VydC5FcXVhbCh0LCAiIiwgZS5PbGRPSUQpCgl1YXNzZXJ0LkVxdWFsKHQsIG9pZCgiYSIpLCByLlJlZigicmVmcy9oZWFkcy9tYWluIikuT0lEKQoJdWFzc2VydC5FcXVhbCh0LCBjYXJvbC5TdHJpbmcoKSwgci5SZWYoInJlZnMvaGVhZHMvbWFpbiIpLlVwZGF0ZWRCeS5TdHJpbmcoKSkKCgkvLyBDcmVhdGluZyB0d2ljZSBpcyBhIG1pc3Rha2UsIG5vdCBhbiBvdmVyd3JpdGUuCglfLCBlcnIgPSByLlNldFJlZihjYXJvbCwgMTAyLCAicmVmcy9oZWFkcy9tYWluIiwgIiIsIG9pZCgiYiIpLCAiIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyclJlZkV4aXN0cykKCgkvLyBBIHN0YWxlIGV4cGVjdGF0aW9uIGlzIGV4YWN0bHkgdGhlIGxvc3QtcHVzaCBjYXNlIC0tZm9yY2Utd2l0aC1sZWFzZQoJLy8gZXhpc3RzIHRvIGNhdGNoLCBhbmQgaGVyZSB0aGUgbGVhc2UgaXMgaGVsZCBieSBjb25zZW5zdXMuCglfLCBlcnIgPSByLlNldFJlZihjYXJvbCwgMTAyLCAicmVmcy9oZWFkcy9tYWluIiwgb2lkKCI5IiksIG9pZCgiYiIpLCAiIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyclN0YWxlUmVmKQoKCS8vIEEgZnJlc2ggZXhwZWN0YXRpb24gc3VjY2VlZHMgYW5kIGNoYWlucyBvbnRvIHRoZSBwcmV2aW91cyBlbnRyeS4KCWUyLCBlcnIgOj0gci5TZXRSZWYoY2Fyb2wsIDEwMywgInJlZnMvaGVhZHMvbWFpbiIsIG9pZCgiYSIpLCBvaWQoImIiKSwgImZpeCB0aGUgdGhpbmciKQoJdXJlcXVpcmUuTm9FcnJvcih0LCBlcnIpCgl1YXNzZXJ0LkVxdWFsKHQsIEtpbmRVcGRhdGUsIGUyLktpbmQpCgl1YXNzZXJ0LkVxdWFsKHQsIG9pZCgiYSIpLCBlMi5PbGRPSUQpCgl1YXNzZXJ0LkVxdWFsKHQsIEVudHJ5RGlnZXN0KGUuRGlnZXN0LCBlMiksIGUyLkRpZ2VzdCwgImRpZ2VzdCBjb21taXRzIHRvIGl0cyBwcmVkZWNlc3NvciIpCgl1YXNzZXJ0LkVxdWFsKHQsIGUyLkRpZ2VzdCwgci5Mb2dIZWFkKCkpCgoJLy8gTm8tb3Agd3JpdGVzIGFyZSByZWplY3RlZDogdGhleSB3b3VsZCBjb3N0IGEgZGVwb3NpdCBhbmQgcmVjb3JkIG5vdGhpbmcuCglfLCBlcnIgPSByLlNldFJlZihjYXJvbCwgMTA0LCAicmVmcy9oZWFkcy9tYWluIiwgb2lkKCJiIiksIG9pZCgiYiIpLCAiIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyclNhbWVPSUQpCgoJLy8gVXBkYXRpbmcgYSByZWYgdGhhdCBkb2VzIG5vdCBleGlzdCBpcyBub3QgYSBjcmVhdGUuCglfLCBlcnIgPSByLlNldFJlZihjYXJvbCwgMTA0LCAicmVmcy9oZWFkcy9vdGhlciIsIG9pZCgiYSIpLCBvaWQoImIiKSwgIiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJSZWZOb3RGb3VuZCkKfQoKZnVuYyBUZXN0U2V0UmVmQXV0aG9yaXphdGlvbkFuZFZhbGlkYXRpb24odCAqdGVzdGluZy5UKSB7CglfLCByIDo9IG5ld1JlcG8odCkKCglfLCBlcnIgOj0gci5TZXRSZWYoZXZlLCAxMDEsICJyZWZzL2hlYWRzL21haW4iLCAiIiwgb2lkKCJhIiksICIiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyVW5hdXRob3JpemVkLCAiYSBzdHJhbmdlciBjYW5ub3QgbW92ZSBhIHJlZiIpCglfLCBlcnIgPSByLlNldFJlZihkYXZlLCAxMDEsICJyZWZzL2hlYWRzL21haW4iLCAiIiwgb2lkKCJhIiksICIiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyVW5hdXRob3JpemVkLCAiYSByZWFkZXIgY2Fubm90IG1vdmUgYSByZWYiKQoKCV8sIGVyciA9IHIuU2V0UmVmKGNhcm9sLCAxMDEsICJtYWluIiwgIiIsIG9pZCgiYSIpLCAiIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyckludmFsaWRSZWZOYW1lKQoJXywgZXJyID0gci5TZXRSZWYoY2Fyb2wsIDEwMSwgInJlZnMvaGVhZHMvbWFpbiIsICIiLCAiZGVhZGJlZWYiLCAiIikKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyckludmFsaWRPSUQpCglfLCBlcnIgPSByLlNldFJlZihjYXJvbCwgMTAxLCAicmVmcy9oZWFkcy9tYWluIiwgIiIsIG9pZCgiYSIpLCAidHdvXG5saW5lcyIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJJbnZhbGlkVGV4dCwgImEgbm90ZSBpcyBvbmUgbGluZTogaXQgaXMgYSBkaWdlc3QgZmllbGQiKQp9CgpmdW5jIFRlc3RGb3JjZUFuZERlbGV0ZSh0ICp0ZXN0aW5nLlQpIHsKCV8sIHIgOj0gbmV3UmVwbyh0KQoJXywgZXJyIDo9IHIuU2V0UmVmKGNhcm9sLCAxMDEsICJyZWZzL2hlYWRzL21haW4iLCAiIiwgb2lkKCJhIiksICJpbml0aWFsIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJXywgZXJyID0gci5TZXRSZWYoY2Fyb2wsIDEwMiwgInJlZnMvaGVhZHMvd2lwIiwgIiIsIG9pZCgiYyIpLCAid2lwIikKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoKCS8vIEEgd3JpdGVyIGNhbm5vdCBmb3JjZS4gQSBtYWludGFpbmVyIGNhbiwgYW5kIGl0IGlzIG9uIHRoZSByZWNvcmQgZm9yZXZlci4KCV8sIGVyciA9IHIuRm9yY2VTZXRSZWYoY2Fyb2wsIDEwMywgInJlZnMvaGVhZHMvbWFpbiIsIG9pZCgiZCIpLCAicmV3cml0ZSIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJVbmF1dGhvcml6ZWQpCgllLCBlcnIgOj0gci5Gb3JjZVNldFJlZihib2IsIDEwMywgInJlZnMvaGVhZHMvbWFpbiIsIG9pZCgiZCIpLCAiZHJvcCB0aGUgYmFkIGNvbW1pdCIpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgS2luZEZvcmNlLCBlLktpbmQpCgl1YXNzZXJ0LkVxdWFsKHQsIG9pZCgiYSIpLCBlLk9sZE9JRCwgInRoZSBhYmFuZG9uZWQgdGlwIHN0YXlzIGluIHRoZSBsb2ciKQoKCS8vIERlbGV0ZSBpcyBjb21wYXJlLWFuZC1zd2FwIHRvbywgYW5kIHRoZSBkZWZhdWx0IGJyYW5jaCBpcyBub3QgZGVsZXRhYmxlLgoJXywgZXJyID0gci5EZWxldGVSZWYoYm9iLCAxMDQsICJyZWZzL2hlYWRzL21haW4iLCBvaWQoImQiKSwgIiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJVbmF1dGhvcml6ZWQpCglfLCBlcnIgPSByLkRlbGV0ZVJlZihib2IsIDEwNCwgInJlZnMvaGVhZHMvd2lwIiwgb2lkKCI5IiksICIiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyU3RhbGVSZWYpCglfLCBlcnIgPSByLkRlbGV0ZVJlZihjYXJvbCwgMTA0LCAicmVmcy9oZWFkcy93aXAiLCBvaWQoImMiKSwgIiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJVbmF1dGhvcml6ZWQpCglkZSwgZXJyIDo9IHIuRGVsZXRlUmVmKGJvYiwgMTA0LCAicmVmcy9oZWFkcy93aXAiLCBvaWQoImMiKSwgIm1lcmdlZCIpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgS2luZERlbGV0ZSwgZGUuS2luZCkKCXVhc3NlcnQuRXF1YWwodCwgIiIsIGRlLk5ld09JRCkKCXVhc3NlcnQuRXF1YWwodCwgMSwgci5SZWZDb3VudCgpLCAidGhlIHJlZiBpcyBnb25lIikKCXVhc3NlcnQuRXF1YWwodCwgNCwgci5Mb2dTaXplKCksICJ0aGUgaGlzdG9yeSBvZiBpdCBpcyBub3QiKQoKCV8sIGVyciA9IHIuRGVsZXRlUmVmKGJvYiwgMTA1LCAicmVmcy9oZWFkcy93aXAiLCAiIiwgIiIpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJSZWZOb3RGb3VuZCkKfQoKZnVuYyBUZXN0TG9nQ2hhaW5WZXJpZmllcyh0ICp0ZXN0aW5nLlQpIHsKCV8sIHIgOj0gbmV3UmVwbyh0KQoJdXJlcXVpcmUuRXF1YWwodCwgIiIsIHIuTG9nSGVhZCgpKQoKCWZvciBpLCBvIDo9IHJhbmdlIFtdc3RyaW5neyJhIiwgImIiLCAiYyIsICJkIn0gewoJCWV4cGVjdGVkIDo9ICIiCgkJaWYgaSA+IDAgewoJCQlleHBlY3RlZCA9IHIuUmVmKCJyZWZzL2hlYWRzL21haW4iKS5PSUQKCQl9CgkJXywgZXJyIDo9IHIuU2V0UmVmKGNhcm9sLCBpbnQ2NCgxMDAraSksICJyZWZzL2hlYWRzL21haW4iLCBleHBlY3RlZCwgb2lkKG8pLCAic3RlcCIpCgkJdXJlcXVpcmUuTm9FcnJvcih0LCBlcnIpCgl9Cgl1YXNzZXJ0LkVxdWFsKHQsIDQsIHIuTG9nU2l6ZSgpKQoKCW9rLCBiYWQgOj0gci5WZXJpZnlMb2coKQoJdWFzc2VydC5UcnVlKHQsIG9rLCAiYW4gdW50b3VjaGVkIGxvZyB2ZXJpZmllcyIpCgl1YXNzZXJ0LkVxdWFsKHQsIGludDY0KC0xKSwgYmFkKQoKCS8vIFJld3JpdGUgaGlzdG9yeSB0aGUgb25seSB3YXkgaXQgY2FuIGJlIHJld3JpdHRlbiBoZXJlOiByZWFjaGluZyBpbnRvIHRoZQoJLy8gcGFja2FnZSdzIG93biBtZW1vcnksIGFuZCB0aGUgY2hhaW4gZGV0ZWN0cyBpdCBhdCB0aGUgZG9jdG9yZWQgZW50cnkuCglyLkxvZ0VudHJ5QXQoMSkuTmV3T0lEID0gb2lkKCJmIikKCW9rLCBiYWQgPSByLlZlcmlmeUxvZygpCgl1YXNzZXJ0LkZhbHNlKHQsIG9rLCAiYSBkb2N0b3JlZCBlbnRyeSBicmVha3MgdGhlIGNoYWluIikKCXVhc3NlcnQuRXF1YWwodCwgaW50NjQoMSksIGJhZCkKfQoKZnVuYyBUZXN0TG9nSXRlcmF0aW9uKHQgKnRlc3RpbmcuVCkgewoJXywgciA6PSBuZXdSZXBvKHQpCglmb3IgaSwgbyA6PSByYW5nZSBbXXN0cmluZ3siYSIsICJiIiwgImMifSB7CgkJZXhwZWN0ZWQgOj0gIiIKCQlpZiBpID4gMCB7CgkJCWV4cGVjdGVkID0gci5SZWYoInJlZnMvaGVhZHMvbWFpbiIpLk9JRAoJCX0KCQlfLCBlcnIgOj0gci5TZXRSZWYoY2Fyb2wsIGludDY0KDEwMCtpKSwgInJlZnMvaGVhZHMvbWFpbiIsIGV4cGVjdGVkLCBvaWQobyksICIiKQoJCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJfQoKCXZhciBmd2QgW11zdHJpbmcKCXIuSXRlcmF0ZUxvZygwLCAwLCBmdW5jKGUgKkxvZ0VudHJ5KSBib29sIHsKCQlmd2QgPSBhcHBlbmQoZndkLCBlLk5ld09JRFs6MV0pCgkJcmV0dXJuIGZhbHNlCgl9KQoJdWFzc2VydC5FcXVhbCh0LCAiYSxiLGMiLCBqb2luKGZ3ZCkpCgoJdmFyIHJldiBbXXN0cmluZwoJci5JdGVyYXRlTG9nUmV2ZXJzZSgwLCAyLCBmdW5jKGUgKkxvZ0VudHJ5KSBib29sIHsKCQlyZXYgPSBhcHBlbmQocmV2LCBlLk5ld09JRFs6MV0pCgkJcmV0dXJuIGZhbHNlCgl9KQoJdWFzc2VydC5FcXVhbCh0LCAiYyxiIiwgam9pbihyZXYpLCAibmV3ZXN0LWZpcnN0LCBwYWdpbmF0ZWQiKQoKCXZhciBuYW1lcyBbXXN0cmluZwoJci5JdGVyYXRlUmVmcyhmdW5jKHJlZiAqUmVmKSBib29sIHsKCQluYW1lcyA9IGFwcGVuZChuYW1lcywgcmVmLk5hbWUpCgkJcmV0dXJuIGZhbHNlCgl9KQoJdWFzc2VydC5FcXVhbCh0LCAicmVmcy9oZWFkcy9tYWluIiwgam9pbihuYW1lcykpCgl1YXNzZXJ0LlRydWUodCwgci5Mb2dFbnRyeUF0KDk5KSA9PSBuaWwpCn0KGtElCgtyZWxlYXNlLmdubxLBJXBhY2thZ2UgZm9yZ2UKCmltcG9ydCAic3RyaW5ncyIKCi8vIFNpemUgY2FwcyBmb3IgYSByZWxlYXNlLgpjb25zdCAoCglNYXhUYWdMZW4gICAgID0gNjQKCU1heFJlbE5hbWVMZW4gPSAyMDAKCU1heE5vdGVzTGVuICAgPSA4MTkyCikKCi8vIFJlbGVhc2UgaXMgYSBuYW1lZCBwb2ludCBpbiBhIHJlcG8ncyBoaXN0b3J5LCB3aXRoIG5vdGVzLgovLwovLyBBIHRhZyByZWYgYWxyZWFkeSBzYXlzICJ0aGlzIG5hbWUgcG9pbnRzIGF0IHRoaXMgb2JqZWN0Ii4gQSByZWxlYXNlIHNheXMgd2h5Ci8vIGFueW9uZSBzaG91bGQgY2FyZTogd2hhdCBjaGFuZ2VkLCB3aGV0aGVyIGl0IGlzIHJlYWR5LCBhbmQgd2hpY2ggZGVwbG95ZWQKLy8gcGFja2FnZSBwYXRocyBjYW1lIG91dCBvZiBpdC4gVGhhdCBsYXN0IHBhcnQgaXMgdGhlIG9uZSBhbiBleHBsb3JlciB3YW50cywKLy8gYW5kIGl0IGlzIGFsc28gdGhlIG9ubHkgaG9uZXN0IGJyaWRnZSBiZXR3ZWVuIGEgZ2l0IG9iamVjdCBpZCBhbmQgYW4gb24tY2hhaW4KLy8gZGVwbG95LCBiZWNhdXNlIHRoZSBjaGFpbiBjYW5ub3QgdmVyaWZ5IGVpdGhlciBhZ2FpbnN0IHRoZSBvdGhlci4KdHlwZSBSZWxlYXNlIHN0cnVjdCB7CglUYWcgICAgICAgIHN0cmluZyAvLyAidjEuMi4wIiwgdGhlIGtleTsgaW1tdXRhYmxlIG9uY2UgY3V0CglOYW1lICAgICAgIHN0cmluZyAvLyBodW1hbiB0aXRsZSwgbWF5IGJlIGVtcHR5CglOb3RlcyAgICAgIHN0cmluZyAvLyBtYXJrZG93biwgbWF5IGJlIGVtcHR5CglPSUQgICAgICAgIHN0cmluZyAvLyB0aGUgb2JqZWN0IHRoaXMgcmVsZWFzZSBuYW1lcwoJUmVmICAgICAgICBzdHJpbmcgLy8gdGhlIHRhZyByZWYsICIiIGlmIHRoZSByZWxlYXNlIGRvZXMgbm90IGhhdmUgb25lCglQcmVyZWxlYXNlIGJvb2wKCUNyZWF0ZWRBdCAgaW50NjQgLy8gYmxvY2sgaGVpZ2h0CglDcmVhdGVkQnkgIGFkZHJlc3MKCVlhbmtlZCAgICAgYm9vbCAvLyB3aXRoZHJhd247IGtlcHQsIGJlY2F1c2UgYSB2ZXJzaW9uIHRoYXQgZXhpc3RlZCBjYW5ub3QgdW4tZXhpc3QKCVlhbmtSZWFzb24gc3RyaW5nCn0KCi8vIFZhbGlkVGFnIHJlcG9ydHMgd2hldGhlciBzIGlzIHVzYWJsZSBhcyBhIHJlbGVhc2UgdGFnLgovLwovLyBOb3Qgc2VtdmVyLWVuZm9yY2luZzogZ25vLmxhbmQncyBvd24gcGFja2FnZXMgdmVyc2lvbiBhcyB2MCwgdjEgd2l0aCBubyBtaW5vcgovLyBvciBwYXRjaCwgYW5kIGEgZm9yZ2UgdGhhdCByZWZ1c2VkIHRob3NlIHdvdWxkIHJlZnVzZSBpdHMgb3duIGVjb3N5c3RlbS4KLy8gT3JkZXJpbmcgaXMgdGhlcmVmb3JlIGxleGljYWwgb3ZlciBhIHBhZGRlZCBmb3JtLCBub3Qgc2VtYW50aWMsIGFuZAovLyBMYXRlc3RSZWxlYXNlIHNheXMgc28uCmZ1bmMgVmFsaWRUYWcocyBzdHJpbmcpIGJvb2wgewoJaWYgcyA9PSAiIiB8fCBsZW4ocykgPiBNYXhUYWdMZW4gewoJCXJldHVybiBmYWxzZQoJfQoJaWYgc3RyaW5ncy5Db250YWlucyhzLCAiLi4iKSB8fCBzdHJpbmdzLkNvbnRhaW5zKHMsICIvIikgewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQlvayA6PSAoYyA+PSAnYScgJiYgYyA8PSAneicpIHx8IChjID49ICdBJyAmJiBjIDw9ICdaJykgfHwKCQkJKGMgPj0gJzAnICYmIGMgPD0gJzknKSB8fCBjID09ICcuJyB8fCBjID09ICctJyB8fCBjID09ICdfJyB8fCBjID09ICcrJwoJCWlmICFvayB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCi8vIEN1dFJlbGVhc2UgcmVjb3JkcyBhIHJlbGVhc2UuIFRoZSB0YWcgaXMgdGhlIGtleSBhbmQgY2Fubm90IGJlIHJlLWN1dDogYQovLyBjb25zdW1lciB0aGF0IHBpbm5lZCB2MS4yLjAgYW5kIGdvdCBkaWZmZXJlbnQgYnl0ZXMgbGF0ZXIgaGFzIGJlZW4gbGllZCB0bywKLy8gYW5kIHRoZSB3aG9sZSBwb2ludCBvZiBhIHRhZyBpcyB0aGF0IGl0IGRvZXMgbm90IG1vdmUuIFdpdGhkcmF3aW5nIG9uZSBpcwovLyBZYW5rUmVsZWFzZSwgd2hpY2ggbGVhdmVzIGl0IHZpc2libGUuCmZ1bmMgKHIgKlJlcG8pIEN1dFJlbGVhc2UoYWN0b3IgYWRkcmVzcywgaGVpZ2h0IGludDY0LCB0YWcsIG5hbWUsIG5vdGVzLCBvaWQsIHJlZiBzdHJpbmcsIHByZXJlbGVhc2UgYm9vbCkgKCpSZWxlYXNlLCBlcnJvcikgewoJaWYgci5BcmNoaXZlZCB7CgkJcmV0dXJuIG5pbCwgRXJyUmVwb0FyY2hpdmVkCgl9CglpZiAhci5DYW4oYWN0b3IsIFJvbGVXcml0ZXIpIHsKCQlyZXR1cm4gbmlsLCBFcnJVbmF1dGhvcml6ZWQKCX0KCWlmICFWYWxpZFRhZyh0YWcpIHsKCQlyZXR1cm4gbmlsLCBFcnJJbnZhbGlkVGFnCgl9CglpZiAhVmFsaWRUZXh0KG5hbWUsIE1heFJlbE5hbWVMZW4pIHx8ICFWYWxpZFRleHQobm90ZXMsIE1heE5vdGVzTGVuKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZFRleHQKCX0KCWlmIG9pZCAhPSAiIiAmJiAhVmFsaWRPSUQob2lkKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZE9JRAoJfQoJaWYgcmVmICE9ICIiICYmICFWYWxpZFJlZk5hbWUocmVmKSB7CgkJcmV0dXJuIG5pbCwgRXJySW52YWxpZFJlZk5hbWUKCX0KCWlmIHIucmVsZWFzZXMuSGFzKHRhZykgewoJCXJldHVybiBuaWwsIEVyclJlbGVhc2VFeGlzdHMKCX0KCglyZWwgOj0gJlJlbGVhc2V7CgkJVGFnOiAgICAgICAgdGFnLAoJCU5hbWU6ICAgICAgIG5hbWUsCgkJTm90ZXM6ICAgICAgbm90ZXMsCgkJT0lEOiAgICAgICAgb2lkLAoJCVJlZjogICAgICAgIHJlZiwKCQlQcmVyZWxlYXNlOiBwcmVyZWxlYXNlLAoJCUNyZWF0ZWRBdDogIGhlaWdodCwKCQlDcmVhdGVkQnk6ICBhY3RvciwKCX0KCXIucmVsZWFzZXMuU2V0KHRhZywgcmVsKQoJci5yZWxlYXNlT3JkZXIuU2V0KHNlcUtleShpbnQ2NChyLnJlbGVhc2VzLlNpemUoKSkpLCB0YWcpCglyZXR1cm4gcmVsLCBuaWwKfQoKLy8gWWFua1JlbGVhc2UgbWFya3MgYSByZWxlYXNlIHdpdGhkcmF3biB3aXRob3V0IGRlbGV0aW5nIGl0LgovLwovLyBEZWxldGluZyB3b3VsZCBtYWtlIGEgcGlubmVkIHZlcnNpb24gc2lsZW50bHkgdmFuaXNoLCB3aGljaCByZWFkcyB0byBhCi8vIGNvbnN1bWVyIGFzICJ0aGlzIHdhcyBuZXZlciBwdWJsaXNoZWQiIHJhdGhlciB0aGFuICJkbyBub3QgdXNlIHRoaXMiLgpmdW5jIChyICpSZXBvKSBZYW5rUmVsZWFzZShhY3RvciBhZGRyZXNzLCB0YWcsIHJlYXNvbiBzdHJpbmcpIGVycm9yIHsKCWlmICFyLkNhbihhY3RvciwgUm9sZVdyaXRlcikgewoJCXJldHVybiBFcnJVbmF1dGhvcml6ZWQKCX0KCWlmICFWYWxpZFRleHQocmVhc29uLCBNYXhOb3RlTGVuKSB7CgkJcmV0dXJuIEVyckludmFsaWRUZXh0Cgl9Cgl2IDo9IHIucmVsZWFzZXMuR2V0KHRhZykKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gRXJyUmVsZWFzZU5vdEZvdW5kCgl9CglyZWwgOj0gdi4oKlJlbGVhc2UpCglyZWwuWWFua2VkID0gdHJ1ZQoJcmVsLllhbmtSZWFzb24gPSByZWFzb24KCXJldHVybiBuaWwKfQoKLy8gUmVsZWFzZSByZXR1cm5zIG9uZSByZWxlYXNlIGJ5IHRhZywgb3IgbmlsLgpmdW5jIChyICpSZXBvKSBSZWxlYXNlKHRhZyBzdHJpbmcpICpSZWxlYXNlIHsKCXYgOj0gci5yZWxlYXNlcy5HZXQodGFnKQoJaWYgdiA9PSBuaWwgewoJCXJldHVybiBuaWwKCX0KCXJldHVybiB2LigqUmVsZWFzZSkKfQoKLy8gUmVsZWFzZUNvdW50IGlzIGhvdyBtYW55IHJlbGVhc2VzIHRoaXMgcmVwbyBoYXMgY3V0LCB5YW5rZWQgb25lcyBpbmNsdWRlZC4KZnVuYyAociAqUmVwbykgUmVsZWFzZUNvdW50KCkgaW50IHsgcmV0dXJuIHIucmVsZWFzZXMuU2l6ZSgpIH0KCi8vIEl0ZXJhdGVSZWxlYXNlcyB3YWxrcyByZWxlYXNlcyBuZXdlc3QtY3V0IGZpcnN0LgovLwovLyBDdXQgb3JkZXIsIG5vdCB0YWcgb3JkZXI6IHRhZ3MgYXJlIG5vdCByZXF1aXJlZCB0byBiZSBzZW12ZXIgaGVyZSAoZ25vLmxhbmQncwovLyBvd24gcGFja2FnZXMgYXJlIHYwIGFuZCB2MSksIHNvIHRoZXJlIGlzIG5vIHRvdGFsIG9yZGVyIHRvIHNvcnQgYnkgdGhhdCB3b3VsZAovLyBub3QgYmUgd3JvbmcgZm9yIHNvbWVib2R5LiBXaGVuIHRoZXkgd2VyZSBjdXQgaXMgYSBmYWN0IHRoZSBmb3JnZSBkb2VzIGtub3cuCmZ1bmMgKHIgKlJlcG8pIEl0ZXJhdGVSZWxlYXNlcyhvZmZzZXQsIGNvdW50IGludCwgY2IgZnVuYygqUmVsZWFzZSkgYm9vbCkgewoJaWYgY291bnQgPD0gMCB7CgkJY291bnQgPSByLnJlbGVhc2VPcmRlci5TaXplKCkKCX0KCXIucmVsZWFzZU9yZGVyLlJldmVyc2VJdGVyYXRlQnlPZmZzZXQob2Zmc2V0LCBjb3VudCwgZnVuYyhfIHN0cmluZywgdiBhbnkpIGJvb2wgewoJCXJlbCA6PSByLnJlbGVhc2VzLkdldCh2LihzdHJpbmcpKQoJCWlmIHJlbCA9PSBuaWwgewoJCQlyZXR1cm4gZmFsc2UKCQl9CgkJcmV0dXJuIGNiKHJlbC4oKlJlbGVhc2UpKQoJfSkKfQoKLy8gTGF0ZXN0UmVsZWFzZSBpcyB0aGUgbW9zdCByZWNlbnRseSBjdXQgcmVsZWFzZSB0aGF0IGlzIG5laXRoZXIgYSBwcmVyZWxlYXNlCi8vIG5vciB5YW5rZWQsIG9yIG5pbC4gIk1vc3QgcmVjZW50bHkgY3V0IiwgbmV2ZXIgImhpZ2hlc3QgdmVyc2lvbiI6IHNlZQovLyBJdGVyYXRlUmVsZWFzZXMuCmZ1bmMgKHIgKlJlcG8pIExhdGVzdFJlbGVhc2UoKSAqUmVsZWFzZSB7Cgl2YXIgb3V0ICpSZWxlYXNlCglyLkl0ZXJhdGVSZWxlYXNlcygwLCAwLCBmdW5jKHJlbCAqUmVsZWFzZSkgYm9vbCB7CgkJaWYgcmVsLlByZXJlbGVhc2UgfHwgcmVsLllhbmtlZCB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQlvdXQgPSByZWwKCQlyZXR1cm4gdHJ1ZQoJfSkKCXJldHVybiBvdXQKfQoasCcKEHJlbGVhc2VfdGVzdC5nbm8SmydwYWNrYWdlIGZvcmdlCgppbXBvcnQgKAoJInRlc3RpbmciCgoJImduby5sYW5kL3AvbnQvdWFzc2VydC92MCIKCSJnbm8ubGFuZC9wL250L3VyZXF1aXJlL3YwIgopCgpmdW5jIFRlc3RWYWxpZFRhZyh0ICp0ZXN0aW5nLlQpIHsKCWNhc2VzIDo9IFtdc3RydWN0IHsKCQluYW1lIHN0cmluZwoJCXRhZyAgc3RyaW5nCgkJd2FudCBib29sCgl9ewoJCXsic2VtdmVyIiwgInYxLjIuMCIsIHRydWV9LAoJCS8vIGduby5sYW5kJ3Mgb3duIHBhY2thZ2VzIGFyZSB2MCBhbmQgdjEgd2l0aCBubyBtaW5vciBvciBwYXRjaC4gQSB0YWcKCQkvLyBydWxlIHRoYXQgcmVmdXNlZCB0aG9zZSB3b3VsZCByZWZ1c2UgdGhlIGVjb3N5c3RlbSBpdCBzZXJ2ZXMuCgkJeyJhIGdubyB2ZXJzaW9uIiwgInYwIiwgdHJ1ZX0sCgkJeyJhIHByZXJlbGVhc2UiLCAidjEuMC4wLXJjLjEiLCB0cnVlfSwKCQl7ImJ1aWxkIG1ldGFkYXRhIiwgInYxLjAuMCtidWlsZC41IiwgdHJ1ZX0sCgkJeyJub3QgdmVyc2lvbiBzaGFwZWQgYXQgYWxsIiwgImdlbmVzaXMtc25hcHNob3QiLCB0cnVlfSwKCQl7ImVtcHR5IiwgIiIsIGZhbHNlfSwKCQl7ImEgc2xhc2giLCAicmVsZWFzZS92MSIsIGZhbHNlfSwKCQl7ImEgdHJhdmVyc2FsIiwgInYxLi4wIiwgZmFsc2V9LAoJCXsiYSBzcGFjZSIsICJ2MSAwIiwgZmFsc2V9LAoJfQoJZm9yIF8sIHRjIDo9IHJhbmdlIGNhc2VzIHsKCQl0LlJ1bih0Yy5uYW1lLCBmdW5jKHQgKnRlc3RpbmcuVCkgewoJCQl1YXNzZXJ0LkVxdWFsKHQsIHRjLndhbnQsIFZhbGlkVGFnKHRjLnRhZykpCgkJfSkKCX0KfQoKZnVuYyBUZXN0Q3V0UmVsZWFzZSh0ICp0ZXN0aW5nLlQpIHsKCV8sIHIgOj0gbmV3UmVwbyh0KQoKCXJlbCwgZXJyIDo9IHIuQ3V0UmVsZWFzZShjYXJvbCwgMzAwLCAidjEuMC4wIiwgIkZpcnN0IiwgIml0IHdvcmtzIiwgb2lkKCJhIiksICJyZWZzL3RhZ3MvdjEuMC4wIiwgZmFsc2UpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgInYxLjAuMCIsIHJlbC5UYWcpCgl1YXNzZXJ0LkVxdWFsKHQsICJGaXJzdCIsIHJlbC5OYW1lKQoJdWFzc2VydC5FcXVhbCh0LCBpbnQ2NCgzMDApLCByZWwuQ3JlYXRlZEF0KQoJdWFzc2VydC5GYWxzZSh0LCByZWwuUHJlcmVsZWFzZSkKCXVhc3NlcnQuRXF1YWwodCwgMSwgci5SZWxlYXNlQ291bnQoKSkKCglnb3QgOj0gci5SZWxlYXNlKCJ2MS4wLjAiKQoJdXJlcXVpcmUuVHJ1ZSh0LCBnb3QgIT0gbmlsKQoJdWFzc2VydC5FcXVhbCh0LCAiaXQgd29ya3MiLCBnb3QuTm90ZXMpCgl1YXNzZXJ0LlRydWUodCwgci5SZWxlYXNlKCJ2OS45LjkiKSA9PSBuaWwpCn0KCi8vIEEgY29uc3VtZXIgd2hvIHBpbm5lZCB2MS4yLjAgYW5kIGxhdGVyIGdvdCBkaWZmZXJlbnQgYnl0ZXMgaGFzIGJlZW4gbGllZCB0by4KLy8gVGhlIHdob2xlIHBvaW50IG9mIGEgdGFnIGlzIHRoYXQgaXQgZG9lcyBub3QgbW92ZS4KZnVuYyBUZXN0Q3V0UmVsZWFzZUlzSW1tdXRhYmxlKHQgKnRlc3RpbmcuVCkgewoJXywgciA6PSBuZXdSZXBvKHQpCgoJXywgZXJyIDo9IHIuQ3V0UmVsZWFzZShhbGljZSwgMzAwLCAidjEuMC4wIiwgIkZpcnN0IiwgIiIsIG9pZCgiYSIpLCAiIiwgZmFsc2UpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCV8sIGVyciA9IHIuQ3V0UmVsZWFzZShhbGljZSwgNDAwLCAidjEuMC4wIiwgIlNlY29uZCIsICIiLCBvaWQoImIiKSwgIiIsIGZhbHNlKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyUmVsZWFzZUV4aXN0cykKCXVhc3NlcnQuRXF1YWwodCwgb2lkKCJhIiksIHIuUmVsZWFzZSgidjEuMC4wIikuT0lEKQp9CgovLyBDdXQgb3JkZXIsIG5ldmVyIHRhZyBvcmRlcjogYSBsZXhpY2FsIHNvcnQgcHJlc2VudHMgdjEwIGJlZm9yZSB2MiBhbmQgY2FsbHMKLy8gaXQgbmV3ZXN0LCBhbmQgdGhlcmUgaXMgbm8gc2VtdmVyIHRvIHNvcnQgYnkgYmVjYXVzZSB0aGUgdGFncyBhcmUgbm90Ci8vIHJlcXVpcmVkIHRvIGJlIHNlbXZlci4KZnVuYyBUZXN0SXRlcmF0ZVJlbGVhc2VzSXNDdXRPcmRlck5vdFRhZ09yZGVyKHQgKnRlc3RpbmcuVCkgewoJXywgciA6PSBuZXdSZXBvKHQpCgoJZm9yIGksIHRhZyA6PSByYW5nZSBbXXN0cmluZ3sidjIuMC4wIiwgInYxMC4wLjAiLCAidjMuMC4wIn0gewoJCV8sIGVyciA6PSByLkN1dFJlbGVhc2UoYWxpY2UsIGludDY0KDMwMCtpKSwgdGFnLCAiIiwgIiIsICIiLCAiIiwgZmFsc2UpCgkJdXJlcXVpcmUuTm9FcnJvcih0LCBlcnIpCgl9CgoJdmFyIHNlZW4gW11zdHJpbmcKCXIuSXRlcmF0ZVJlbGVhc2VzKDAsIDAsIGZ1bmMocmVsICpSZWxlYXNlKSBib29sIHsKCQlzZWVuID0gYXBwZW5kKHNlZW4sIHJlbC5UYWcpCgkJcmV0dXJuIGZhbHNlCgl9KQoJdXJlcXVpcmUuRXF1YWwodCwgMywgbGVuKHNlZW4pKQoJdWFzc2VydC5FcXVhbCh0LCAidjMuMC4wIiwgc2VlblswXSkKCXVhc3NlcnQuRXF1YWwodCwgInYxMC4wLjAiLCBzZWVuWzFdKQoJdWFzc2VydC5FcXVhbCh0LCAidjIuMC4wIiwgc2VlblsyXSkKfQoKZnVuYyBUZXN0TGF0ZXN0UmVsZWFzZVNraXBzUHJlcmVsZWFzZUFuZFlhbmtlZCh0ICp0ZXN0aW5nLlQpIHsKCV8sIHIgOj0gbmV3UmVwbyh0KQoKCV8sIGVyciA6PSByLkN1dFJlbGVhc2UoYWxpY2UsIDMwMCwgInYxLjAuMCIsICIiLCAiIiwgIiIsICIiLCBmYWxzZSkKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJdWFzc2VydC5FcXVhbCh0LCAidjEuMC4wIiwgci5MYXRlc3RSZWxlYXNlKCkuVGFnKQoKCS8vIEEgcHJlcmVsZWFzZSBpcyBjdXQgbGF0ZXIgYW5kIGlzIHN0aWxsIG5vdCB0aGUgbGF0ZXN0LgoJXywgZXJyID0gci5DdXRSZWxlYXNlKGFsaWNlLCAzMTAsICJ2Mi4wLjAtcmMuMSIsICIiLCAiIiwgIiIsICIiLCB0cnVlKQoJdXJlcXVpcmUuTm9FcnJvcih0LCBlcnIpCgl1YXNzZXJ0LkVxdWFsKHQsICJ2MS4wLjAiLCByLkxhdGVzdFJlbGVhc2UoKS5UYWcpCgoJXywgZXJyID0gci5DdXRSZWxlYXNlKGFsaWNlLCAzMjAsICJ2Mi4wLjAiLCAiIiwgIiIsICIiLCAiIiwgZmFsc2UpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgInYyLjAuMCIsIHIuTGF0ZXN0UmVsZWFzZSgpLlRhZykKCgkvLyBZYW5raW5nIG1vdmVzIGl0IGJhY2ssIGFuZCBkb2VzIG5vdCBkZWxldGUgaXQuCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIHIuWWFua1JlbGVhc2UoYWxpY2UsICJ2Mi4wLjAiLCAiYnJva2VuIG1pZ3JhdGlvbiIpKQoJdWFzc2VydC5FcXVhbCh0LCAidjEuMC4wIiwgci5MYXRlc3RSZWxlYXNlKCkuVGFnKQoJdWFzc2VydC5FcXVhbCh0LCAzLCByLlJlbGVhc2VDb3VudCgpKQoJeWFua2VkIDo9IHIuUmVsZWFzZSgidjIuMC4wIikKCXVyZXF1aXJlLlRydWUodCwgeWFua2VkICE9IG5pbCkKCXVhc3NlcnQuVHJ1ZSh0LCB5YW5rZWQuWWFua2VkKQoJdWFzc2VydC5FcXVhbCh0LCAiYnJva2VuIG1pZ3JhdGlvbiIsIHlhbmtlZC5ZYW5rUmVhc29uKQp9CgpmdW5jIFRlc3RMYXRlc3RSZWxlYXNlSXNOaWxXaGVuVGhlcmVJc05vbmUodCAqdGVzdGluZy5UKSB7CglfLCByIDo9IG5ld1JlcG8odCkKCXVhc3NlcnQuVHJ1ZSh0LCByLkxhdGVzdFJlbGVhc2UoKSA9PSBuaWwpCgoJXywgZXJyIDo9IHIuQ3V0UmVsZWFzZShhbGljZSwgMzAwLCAidjEuMC4wLXJjLjEiLCAiIiwgIiIsICIiLCAiIiwgdHJ1ZSkKCXVyZXF1aXJlLk5vRXJyb3IodCwgZXJyKQoJdWFzc2VydC5UcnVlKHQsIHIuTGF0ZXN0UmVsZWFzZSgpID09IG5pbCkKfQoKZnVuYyBUZXN0UmVsZWFzZUF1dGhvcml0eUFuZFZhbGlkYXRpb24odCAqdGVzdGluZy5UKSB7CglfLCByIDo9IG5ld1JlcG8odCkKCglfLCBlcnIgOj0gci5DdXRSZWxlYXNlKGRhdmUsIDMwMCwgInYxLjAuMCIsICIiLCAiIiwgIiIsICIiLCBmYWxzZSkKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyclVuYXV0aG9yaXplZCkKCV8sIGVyciA9IHIuQ3V0UmVsZWFzZShldmUsIDMwMCwgInYxLjAuMCIsICIiLCAiIiwgIiIsICIiLCBmYWxzZSkKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyclVuYXV0aG9yaXplZCkKCglfLCBlcnIgPSByLkN1dFJlbGVhc2UoYWxpY2UsIDMwMCwgInJlbGVhc2UvdjEiLCAiIiwgIiIsICIiLCAiIiwgZmFsc2UpCgl1YXNzZXJ0LkVycm9ySXModCwgZXJyLCBFcnJJbnZhbGlkVGFnKQoKCV8sIGVyciA9IHIuQ3V0UmVsZWFzZShhbGljZSwgMzAwLCAidjEuMC4wIiwgIiIsICIiLCAibm90aGV4IiwgIiIsIGZhbHNlKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJySW52YWxpZE9JRCkKCglfLCBlcnIgPSByLkN1dFJlbGVhc2UoYWxpY2UsIDMwMCwgInYxLjAuMCIsICIiLCAiIiwgIiIsICJ2MS4wLjAiLCBmYWxzZSkKCXVhc3NlcnQuRXJyb3JJcyh0LCBlcnIsIEVyckludmFsaWRSZWZOYW1lKQoKCXVhc3NlcnQuRXJyb3JJcyh0LCByLllhbmtSZWxlYXNlKGRhdmUsICJ2MS4wLjAiLCAiIiksIEVyclVuYXV0aG9yaXplZCkKCXVhc3NlcnQuRXJyb3JJcyh0LCByLllhbmtSZWxlYXNlKGFsaWNlLCAidjkuOS45IiwgIiIpLCBFcnJSZWxlYXNlTm90Rm91bmQpCgoJdXJlcXVpcmUuTm9FcnJvcih0LCByLlNldEFyY2hpdmVkKGFsaWNlLCB0cnVlKSkKCV8sIGVyciA9IHIuQ3V0UmVsZWFzZShhbGljZSwgMzAwLCAidjEuMC4wIiwgIiIsICIiLCAiIiwgIiIsIGZhbHNlKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJyUmVwb0FyY2hpdmVkKQp9CgpmdW5jIFRlc3RGb3JrSW5oZXJpdHNOb1JlbGVhc2VzKHQgKnRlc3RpbmcuVCkgewoJZiwgciA6PSBuZXdSZXBvKHQpCglfLCBlcnIgOj0gci5DdXRSZWxlYXNlKGFsaWNlLCAzMDAsICJ2MS4wLjAiLCAiIiwgIiIsICIiLCAiIiwgZmFsc2UpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCgljaGlsZCwgZXJyIDo9IGYuRm9yayhldmUsIDMxMCwgci5JRCwgImV2ZS9mb3JnZSIpCgl1cmVxdWlyZS5Ob0Vycm9yKHQsIGVycikKCXVhc3NlcnQuRXF1YWwodCwgMCwgY2hpbGQuUmVsZWFzZUNvdW50KCkpCgl1YXNzZXJ0LlRydWUodCwgY2hpbGQuTGF0ZXN0UmVsZWFzZSgpID09IG5pbCkKfQoa3DEKDHZhbGlkYXRlLmdubxLLMXBhY2thZ2UgZm9yZ2UKCmltcG9ydCAic3RyaW5ncyIKCi8vIFNpemUgY2Fwcy4gRXZlcnkgc3RyaW5nIHRoZSBjaGFpbiBzdG9yZXMgaXMgYm91bmRlZDogYW4gdW5ib3VuZGVkIGZpZWxkIGlzIGFuCi8vIHVuYm91bmRlZCBzdG9yYWdlIGRlcG9zaXQsIGFuZCBvbiBnbm8ubGFuZCB0aGUgZGVwb3NpdCBpcyBwYWlkIHBlciBieXRlIGJ5Ci8vIHdob2V2ZXIgd3JpdGVzIGl0ICgxMDB1Z25vdC9ieXRlIGF0IHRoZSB0aW1lIG9mIHdyaXRpbmcpLgpjb25zdCAoCglNYXhSZXBvUGFydExlbiA9IDM5ICAgLy8gcGVyIHNpZGUgb2YgIjxuYW1lc3BhY2U+LzxuYW1lPiIKCU1heFJlZk5hbWVMZW4gID0gMjU1ICAvLyBnaXQncyBvd24gbGltaXQgZm9yIGEgc2luZ2xlIHJlZiBuYW1lCglNYXhUaXRsZUxlbiAgICA9IDIwMCAgLy8gaXNzdWUgLyBjaGFuZ2UgdGl0bGUKCU1heEJvZHlMZW4gICAgID0gODE5MiAvLyBpc3N1ZSAvIGNoYW5nZSBib2R5CglNYXhDb21tZW50TGVuICA9IDQwOTYKCU1heERlc2NMZW4gICAgID0gNTEyCglNYXhOb3RlTGVuICAgICA9IDE0MCAvLyBzaW5nbGUtbGluZSBub3RlIGF0dGFjaGVkIHRvIGEgbG9nIGVudHJ5CglNYXhNaXJyb3JMZW4gICA9IDUxMgoJTWF4TWlycm9ycyAgICAgPSA4CglNYXhMYWJlbHMgICAgICA9IDEwCglNYXhMYWJlbExlbiAgICA9IDMyCikKCi8vIFZhbGlkT0lEIHJlcG9ydHMgd2hldGhlciBzIGlzIGEgZ2l0IG9iamVjdCBpZDogNDAgKFNIQS0xKSBvciA2NCAoU0hBLTI1NikKLy8gbG93ZXJjYXNlIGhleCBjaGFyYWN0ZXJzLiBDYXNlIGlzIGZpeGVkIHNvIHRoZSBzYW1lIG9iamVjdCBhbHdheXMgaGFzIHRoZQovLyBzYW1lIG9uLWNoYWluIGtleSBhbmQgdGhlIHNhbWUgZGlnZXN0LWNoYWluIGlucHV0LgpmdW5jIFZhbGlkT0lEKHMgc3RyaW5nKSBib29sIHsKCWlmIGxlbihzKSAhPSA0MCAmJiBsZW4ocykgIT0gNjQgewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIGkgOj0gMDsgaSA8IGxlbihzKTsgaSsrIHsKCQljIDo9IHNbaV0KCQlpZiAoYyA8ICcwJyB8fCBjID4gJzknKSAmJiAoYyA8ICdhJyB8fCBjID4gJ2YnKSB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCi8vIFZhbGlkUmVmTmFtZSByZXBvcnRzIHdoZXRoZXIgcyBpcyBhIGZ1bGx5LXF1YWxpZmllZCByZWYgbmFtZSB0aGlzIGZvcmdlCi8vIGFjY2VwdHM6IGEgInJlZnMvIi1yb290ZWQgc3Vic2V0IG9mIGdpdC1jaGVjay1yZWYtZm9ybWF0KDEpLgovLwovLyBEZWxpYmVyYXRlbHkgc3RyaWN0ZXIgdGhhbiBnaXQ6IHRoZSBuYW1lIG11c3QgYmUgZnVsbHkgcXVhbGlmaWVkLCBzbyB0aGVyZSBpcwovLyBuZXZlciBhbiBhbWJpZ3VpdHkgYmV0d2VlbiAibWFpbiIgdGhlIGJyYW5jaCBhbmQgIm1haW4iIHRoZSB0YWcsIGFuZCBhIGNsaWVudAovLyBjYW4gbWFwIGFuIG9uLWNoYWluIG5hbWUgb250byBhIGxvY2FsIHJlZiB3aXRob3V0IGEgbG9va3VwIHRhYmxlLgpmdW5jIFZhbGlkUmVmTmFtZShzIHN0cmluZykgYm9vbCB7CglpZiBzID09ICIiIHx8IGxlbihzKSA+IE1heFJlZk5hbWVMZW4gewoJCXJldHVybiBmYWxzZQoJfQoJaWYgIXN0cmluZ3MuSGFzUHJlZml4KHMsICJyZWZzLyIpIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWlmIHN0cmluZ3MuQ29udGFpbnMocywgIi4uIikgfHwgc3RyaW5ncy5Db250YWlucyhzLCAiQHsiKSB7CgkJcmV0dXJuIGZhbHNlCgl9CglpZiBzdHJpbmdzLkhhc1N1ZmZpeChzLCAiLyIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KHMsICIuIikgewoJCXJldHVybiBmYWxzZQoJfQoJcGFydHMgOj0gc3RyaW5ncy5TcGxpdChzLCAiLyIpCglpZiBsZW4ocGFydHMpIDwgMiB7CgkJcmV0dXJuIGZhbHNlCgl9Cglmb3IgXywgcCA6PSByYW5nZSBwYXJ0cyB7CgkJaWYgcCA9PSAiIiB8fCBwID09ICJAIiB7CgkJCXJldHVybiBmYWxzZQoJCX0KCQlpZiBzdHJpbmdzLkhhc1ByZWZpeChwLCAiLiIpIHx8IHN0cmluZ3MuSGFzU3VmZml4KHAsICIubG9jayIpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJCWZvciBpIDo9IDA7IGkgPCBsZW4ocCk7IGkrKyB7CgkJCWlmICFyZWZCeXRlT0socFtpXSkgewoJCQkJcmV0dXJuIGZhbHNlCgkJCX0KCQl9Cgl9CglyZXR1cm4gdHJ1ZQp9CgovLyByZWZCeXRlT0sgcmVqZWN0cyB0aGUgYnl0ZXMgZ2l0IGl0c2VsZiByZWplY3RzIGluIGEgcmVmIGNvbXBvbmVudDogQVNDSUkKLy8gY29udHJvbCBjaGFyYWN0ZXJzLCBzcGFjZSwgREVMLCBhbmQgdGhlIHBhdGhzcGVjL3JldmlzaW9uIG1ldGFjaGFyYWN0ZXJzLgpmdW5jIHJlZkJ5dGVPSyhjIGJ5dGUpIGJvb2wgewoJaWYgYyA8PSAweDIwIHx8IGMgPT0gMHg3ZiB7CgkJcmV0dXJuIGZhbHNlCgl9Cglzd2l0Y2ggYyB7CgljYXNlICd+JywgJ14nLCAnOicsICc/JywgJyonLCAnWycsICdcXCc6CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gdHJ1ZQp9CgovLyBWYWxpZFJlcG9JRCByZXBvcnRzIHdoZXRoZXIgcyBpcyAiPG5hbWVzcGFjZT4vPG5hbWU+Ii4gVGhlIG5hbWUgaXMgYWx3YXlzIGEKLy8gbG93ZXJjYXNlIHNsdWc7IHRoZSBuYW1lc3BhY2UgaXMgZWl0aGVyIGEgc2x1ZyAoYSBjbGFpbWVkIHVzZXIgbmFtZSkgb3IgYQovLyBiZWNoMzIgYWRkcmVzcyAodGhlIGNhbGxlcidzIG93bikuIFRoZSB0d28gc2hhcGVzIGNhbm5vdCBjb2xsaWRlOiBhbiBhZGRyZXNzCi8vIGlzIDQwIGNoYXJhY3RlcnMgYW5kIGEgc2x1ZyBjYXBzIGF0IE1heFJlcG9QYXJ0TGVuLCB3aGljaCBpcyAzOS4KLy8KLy8gVGhpcyBsYXllciB2YWxpZGF0ZXMgdGhlIFNIQVBFIG9ubHkuIFdoZXRoZXIgdGhlIGNhbGxlciBtYXkgY2xhaW0gYSBnaXZlbgovLyBuYW1lc3BhY2UgaXMgYW4gb3duZXJzaGlwIHF1ZXN0aW9uIHRoYXQgbmVlZHMgYSBjaGFpbiwgc28gaXQgYmVsb25ncyB0byB0aGUKLy8gcmVhbG0gKHNlZSB0aGUgcmVhbG0ncyBSRUFETUUpLgpmdW5jIFZhbGlkUmVwb0lEKHMgc3RyaW5nKSBib29sIHsKCW5zLCBuYW1lLCBvayA6PSBTcGxpdFJlcG9JRChzKQoJaWYgIW9rIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXJldHVybiAodmFsaWRTbHVnKG5zKSB8fCBBZGRyZXNzTmFtZXNwYWNlKG5zKSkgJiYgdmFsaWRTbHVnKG5hbWUpCn0KCi8vIFNwbGl0UmVwb0lEIHNwbGl0cyAiPG5hbWVzcGFjZT4vPG5hbWU+IiBpbnRvIGl0cyB0d28gaGFsdmVzLiBJdCBkb2VzIG5vdAovLyB2YWxpZGF0ZSBlaXRoZXIgaGFsZjsgb2sgaXMgZmFsc2Ugb25seSB3aGVuIHRoZSBpZCBpcyBub3QgdHdvIHNsYXNoLXNlcGFyYXRlZAovLyBub24tZW1wdHkgcGFydHMuCmZ1bmMgU3BsaXRSZXBvSUQocyBzdHJpbmcpIChucywgbmFtZSBzdHJpbmcsIG9rIGJvb2wpIHsKCWkgOj0gc3RyaW5ncy5JbmRleChzLCAiLyIpCglpZiBpIDw9IDAgfHwgaSA9PSBsZW4ocyktMSB8fCBzdHJpbmdzLkNvdW50KHMsICIvIikgIT0gMSB7CgkJcmV0dXJuICIiLCAiIiwgZmFsc2UKCX0KCXJldHVybiBzWzppXSwgc1tpKzE6XSwgdHJ1ZQp9CgovLyBBZGRyZXNzTmFtZXNwYWNlIHJlcG9ydHMgd2hldGhlciBucyBpcyBzaGFwZWQgbGlrZSBhIGdubyBiZWNoMzIgYWRkcmVzcywgdGhlCi8vIG5hbWVzcGFjZSBldmVyeSBhY2NvdW50IG93bnMgd2l0aG91dCByZWdpc3RlcmluZyBhbnl0aGluZy4gVGhlIHJlYWxtIHN0aWxsCi8vIGNoZWNrcyB0aGF0IGl0IGlzIHRoZSBDQUxMRVIncyBhZGRyZXNzOyB0aGlzIG9ubHkgc2F5cyB3aGljaCBvZiB0aGUgdHdvCi8vIG93bmVyc2hpcCBydWxlcyBhcHBsaWVzLgpmdW5jIEFkZHJlc3NOYW1lc3BhY2UobnMgc3RyaW5nKSBib29sIHsKCWlmIGxlbihucykgIT0gNDAgfHwgIXN0cmluZ3MuSGFzUHJlZml4KG5zLCAiZzEiKSB7CgkJcmV0dXJuIGZhbHNlCgl9Cglmb3IgaSA6PSAyOyBpIDwgbGVuKG5zKTsgaSsrIHsKCQlpZiAhc3RyaW5ncy5Db250YWluc1J1bmUoYmVjaDMyQ2hhcnNldCwgcnVuZShuc1tpXSkpIHsKCQkJcmV0dXJuIGZhbHNlCgkJfQoJfQoJcmV0dXJuIHRydWUKfQoKLy8gYmVjaDMyQ2hhcnNldCBpcyBiZWNoMzIncyBkYXRhIGFscGhhYmV0OiBsb3dlcmNhc2UgYWxwaGFudW1lcmljcyBtaW51cyB0aGUKLy8gZm91ciBjaGFyYWN0ZXJzIGl0IGRyb3BzIHRvIGF2b2lkIHRyYW5zY3JpcHRpb24gZXJyb3JzICgxLCBiLCBpLCBvKS4KY29uc3QgYmVjaDMyQ2hhcnNldCA9ICIwMjM0NTY3ODlhY2RlZmdoamtsbW5wcXJzdHV2d3h5eiIKCi8vIHZhbGlkU2x1ZzogMS4uTWF4UmVwb1BhcnRMZW4gY2hhcnMsIFthLXowLTldIGF0IGJvdGggZW5kcywgW2EtejAtOS1fLl0gaW5zaWRlLAovLyBubyAiLi4iLCBubyAiLS0iLiBNaXhlZCBjYXNlIGlzIHJlamVjdGVkIHJhdGhlciB0aGFuIGZvbGRlZDogdHdvIGlkcyB0aGF0Ci8vIGRpZmZlciBvbmx5IGluIGNhc2Ugd291bGQgYmUgdHdvIGF2bCBrZXlzIGFuZCBvbmUgaHVtYW4tdmlzaWJsZSBuYW1lLgpmdW5jIHZhbGlkU2x1ZyhzIHN0cmluZykgYm9vbCB7CglpZiBzID09ICIiIHx8IGxlbihzKSA+IE1heFJlcG9QYXJ0TGVuIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWlmICFhbG51bShzWzBdKSB8fCAhYWxudW0oc1tsZW4ocyktMV0pIHsKCQlyZXR1cm4gZmFsc2UKCX0KCWlmIHN0cmluZ3MuQ29udGFpbnMocywgIi4uIikgfHwgc3RyaW5ncy5Db250YWlucyhzLCAiLS0iKSB7CgkJcmV0dXJuIGZhbHNlCgl9Cglmb3IgaSA6PSAwOyBpIDwgbGVuKHMpOyBpKysgewoJCWMgOj0gc1tpXQoJCWlmIGFsbnVtKGMpIHx8IGMgPT0gJy0nIHx8IGMgPT0gJ18nIHx8IGMgPT0gJy4nIHsKCQkJY29udGludWUKCQl9CgkJcmV0dXJuIGZhbHNlCgl9CglyZXR1cm4gdHJ1ZQp9CgpmdW5jIGFsbnVtKGMgYnl0ZSkgYm9vbCB7CglyZXR1cm4gKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB8fCAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCn0KCi8vIFZhbGlkVGV4dCByZXBvcnRzIHdoZXRoZXIgcyBmaXRzIGluIG1heCBieXRlcyBhbmQgY2FycmllcyBubyBjb250cm9sCi8vIGNoYXJhY3RlcnMgb3RoZXIgdGhhbiBuZXdsaW5lIGFuZCB0YWIuIFJlbmRlciBvdXRwdXQgaXMgbWFya2Rvd24gc2VydmVkIGJ5Ci8vIGdub3dlYiwgc28gYSBzdHJheSBjb250cm9sIGJ5dGUgaXMgYSByZW5kZXJpbmcgYnVnIGZvciBldmVyeSByZWFkZXIgZm9yZXZlci4KZnVuYyBWYWxpZFRleHQocyBzdHJpbmcsIG1heCBpbnQpIGJvb2wgewoJaWYgbGVuKHMpID4gbWF4IHsKCQlyZXR1cm4gZmFsc2UKCX0KCWZvciBpIDo9IDA7IGkgPCBsZW4ocyk7IGkrKyB7CgkJYyA6PSBzW2ldCgkJaWYgYyA9PSAnXG4nIHx8IGMgPT0gJ1x0JyB7CgkJCWNvbnRpbnVlCgkJfQoJCWlmIGMgPCAweDIwIHx8IGMgPT0gMHg3ZiB7CgkJCXJldHVybiBmYWxzZQoJCX0KCX0KCXJldHVybiB0cnVlCn0KCi8vIFZhbGlkTGluZSByZXBvcnRzIHdoZXRoZXIgcyBpcyBzaW5nbGUtbGluZSB0ZXh0IHdpdGhpbiBtYXggYnl0ZXMuIFVzZWQgZm9yCi8vIHRpdGxlcyBhbmQgZm9yIGxvZy1lbnRyeSBub3Rlcywgd2hpY2ggYXJlIGZpZWxkcyBvZiB0aGUgZGlnZXN0IGNoYWluOiBhCi8vIG5ld2xpbmUgdGhlcmUgd291bGQgbGV0IG9uZSBub3RlIGltcGVyc29uYXRlIHR3by4KZnVuYyBWYWxpZExpbmUocyBzdHJpbmcsIG1heCBpbnQpIGJvb2wgewoJaWYgc3RyaW5ncy5Db250YWluc0FueShzLCAiXG5cdCIpIHsKCQlyZXR1cm4gZmFsc2UKCX0KCXJldHVybiBWYWxpZFRleHQocywgbWF4KQp9CgovLyBWYWxpZE1pcnJvciByZXBvcnRzIHdoZXRoZXIgcyBsb29rcyBsaWtlIGEgZmV0Y2ggbG9jYXRvci4gVGhlIGNoYWluIGRvZXMgbm90Ci8vIHJlc29sdmUgaXQ6IGl0IG9ubHkgcmVjb3JkcyB3aGVyZSB0aGUgbWFpbnRhaW5lcnMgc2F5IHRoZSBvYmplY3RzIGFyZTogc28KLy8gdGhlIGNoZWNrIGlzIGEgc2hhcGUgY2hlY2ssIG5vdCBhIHByb21pc2UgdGhhdCBhbnl0aGluZyBpcyByZWFjaGFibGUuCmZ1bmMgVmFsaWRNaXJyb3IocyBzdHJpbmcpIGJvb2wgewoJaWYgIVZhbGlkTGluZShzLCBNYXhNaXJyb3JMZW4pIHx8IHMgPT0gIiIgewoJCXJldHVybiBmYWxzZQoJfQoJZm9yIF8sIHAgOj0gcmFuZ2UgW11zdHJpbmd7Imh0dHBzOi8vIiwgImh0dHA6Ly8iLCAiZ2l0Oi8vIiwgInNzaDovLyIsICJpcGZzOi8vIiwgImlwbnM6Ly8iLCAiYXI6Ly8iLCAicmFkOi8vIiwgImdpdEAifSB7CgkJaWYgc3RyaW5ncy5IYXNQcmVmaXgocywgcCkgewoJCQlyZXR1cm4gdHJ1ZQoJCX0KCX0KCXJldHVybiBmYWxzZQp9CgovLyBWYWxpZExhYmVsIHJlcG9ydHMgd2hldGhlciBzIGlzIGFuIGlzc3VlIGxhYmVsLgpmdW5jIFZhbGlkTGFiZWwocyBzdHJpbmcpIGJvb2wgewoJcmV0dXJuIHMgIT0gIiIgJiYgVmFsaWRMaW5lKHMsIE1heExhYmVsTGVuKSAmJiAhc3RyaW5ncy5Db250YWlucyhzLCAiLCIpCn0KGpcpChF2YWxpZGF0ZV90ZXN0LmdubxKBKXBhY2thZ2UgZm9yZ2UKCmltcG9ydCAoCgkic3RyaW5ncyIKCSJ0ZXN0aW5nIgoKCSJnbm8ubGFuZC9wL250L3Rlc3R1dGlscy92MCIKCSJnbm8ubGFuZC9wL250L3Vhc3NlcnQvdjAiCikKCmZ1bmMgVGVzdFZhbGlkT0lEKHQgKnRlc3RpbmcuVCkgewoJY2FzZXMgOj0gW11zdHJ1Y3QgewoJCW5hbWUgc3RyaW5nCgkJaW4gICBzdHJpbmcKCQl3YW50IGJvb2wKCX17CgkJeyJzaGExIiwgc3RyaW5ncy5SZXBlYXQoImEiLCA0MCksIHRydWV9LAoJCXsic2hhMjU2Iiwgc3RyaW5ncy5SZXBlYXQoIjAiLCA2NCksIHRydWV9LAoJCXsibWl4ZWQgaGV4IiwgIjAxMjM0NTY3ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1NjciLCB0cnVlfSwKCQl7ImVtcHR5IiwgIiIsIGZhbHNlfSwKCQl7InRvbyBzaG9ydCIsIHN0cmluZ3MuUmVwZWF0KCJhIiwgMzkpLCBmYWxzZX0sCgkJeyJiZXR3ZWVuIGxlbmd0aHMiLCBzdHJpbmdzLlJlcGVhdCgiYSIsIDQxKSwgZmFsc2V9LAoJCXsidXBwZXJjYXNlIiwgc3RyaW5ncy5SZXBlYXQoIkEiLCA0MCksIGZhbHNlfSwKCQl7Im5vbiBoZXgiLCBzdHJpbmdzLlJlcGVhdCgieiIsIDQwKSwgZmFsc2V9LAoJCXsiYWJicmV2aWF0ZWQiLCAiZGVhZGJlZWYiLCBmYWxzZX0sCgl9Cglmb3IgXywgdGMgOj0gcmFuZ2UgY2FzZXMgewoJCXVhc3NlcnQuRXF1YWwodCwgdGMud2FudCwgVmFsaWRPSUQodGMuaW4pLCB0Yy5uYW1lKQoJfQp9CgpmdW5jIFRlc3RWYWxpZFJlZk5hbWUodCAqdGVzdGluZy5UKSB7CgljYXNlcyA6PSBbXXN0cnVjdCB7CgkJbmFtZSBzdHJpbmcKCQlpbiAgIHN0cmluZwoJCXdhbnQgYm9vbAoJfXsKCQl7ImJyYW5jaCIsICJyZWZzL2hlYWRzL21haW4iLCB0cnVlfSwKCQl7Im5lc3RlZCBicmFuY2giLCAicmVmcy9oZWFkcy9mZWF0L29uLWNoYWluLWxvZyIsIHRydWV9LAoJCXsidGFnIiwgInJlZnMvdGFncy92MS4wLjAiLCB0cnVlfSwKCQl7InN0YXNoLWxpa2UiLCAicmVmcy9zdGFzaCIsIHRydWV9LAoJCXsidW5xdWFsaWZpZWQiLCAibWFpbiIsIGZhbHNlfSwKCQl7ImVtcHR5IiwgIiIsIGZhbHNlfSwKCQl7ImRvdWJsZSBzbGFzaCIsICJyZWZzL2hlYWRzLy9tYWluIiwgZmFsc2V9LAoJCXsiZG91YmxlIGRvdCIsICJyZWZzL2hlYWRzL2EuLmIiLCBmYWxzZX0sCgkJeyJhdCBicmFjZSIsICJyZWZzL2hlYWRzL2FAezB9IiwgZmFsc2V9LAoJCXsidHJhaWxpbmcgc2xhc2giLCAicmVmcy9oZWFkcy8iLCBmYWxzZX0sCgkJeyJ0cmFpbGluZyBkb3QiLCAicmVmcy9oZWFkcy9tYWluLiIsIGZhbHNlfSwKCQl7ImRvdCBwcmVmaXgiLCAicmVmcy9oZWFkcy8uaGlkZGVuIiwgZmFsc2V9LAoJCXsibG9jayBzdWZmaXgiLCAicmVmcy9oZWFkcy9tYWluLmxvY2siLCBmYWxzZX0sCgkJeyJzcGFjZSIsICJyZWZzL2hlYWRzL215IGJyYW5jaCIsIGZhbHNlfSwKCQl7ImNhcmV0IiwgInJlZnMvaGVhZHMvbWFpbl4iLCBmYWxzZX0sCgkJeyJjb2xvbiIsICJyZWZzL2hlYWRzL2E6YiIsIGZhbHNlfSwKCQl7InRpbGRlIiwgInJlZnMvaGVhZHMvbWFpbn4xIiwgZmFsc2V9LAoJCXsicXVlc3Rpb24iLCAicmVmcy9oZWFkcy93aGF0PyIsIGZhbHNlfSwKCQl7InN0YXIiLCAicmVmcy9oZWFkcy8qIiwgZmFsc2V9LAoJCXsiYmFja3NsYXNoIiwgInJlZnMvaGVhZHMvYVxcYiIsIGZhbHNlfSwKCQl7ImNvbnRyb2wiLCAicmVmcy9oZWFkcy9hXHgwMWIiLCBmYWxzZX0sCgkJeyJ0b28gbG9uZyIsICJyZWZzL2hlYWRzLyIgKyBzdHJpbmdzLlJlcGVhdCgiYSIsIDMwMCksIGZhbHNlfSwKCX0KCWZvciBfLCB0YyA6PSByYW5nZSBjYXNlcyB7CgkJdWFzc2VydC5FcXVhbCh0LCB0Yy53YW50LCBWYWxpZFJlZk5hbWUodGMuaW4pLCB0Yy5uYW1lKQoJfQp9CgpmdW5jIFRlc3RWYWxpZFJlcG9JRCh0ICp0ZXN0aW5nLlQpIHsKCWNhc2VzIDo9IFtdc3RydWN0IHsKCQluYW1lIHN0cmluZwoJCWluICAgc3RyaW5nCgkJd2FudCBib29sCgl9ewoJCXsic2ltcGxlIiwgIm1vdWwvZm9yZ2UiLCB0cnVlfSwKCQl7ImRpZ2l0cyIsICJuczAvcmVwbzkiLCB0cnVlfSwKCQl7ImRvdHMgYW5kIGRhc2hlcyIsICJtb3VsL2duby1jb250cmFjdHMueCIsIHRydWV9LAoJCXsidW5kZXJzY29yZSIsICJtb3VsL215X3JlcG8iLCB0cnVlfSwKCQl7Im5vIHNsYXNoIiwgImZvcmdlIiwgZmFsc2V9LAoJCXsidHdvIHNsYXNoZXMiLCAiYS9iL2MiLCBmYWxzZX0sCgkJeyJlbXB0eSBucyIsICIvZm9yZ2UiLCBmYWxzZX0sCgkJeyJlbXB0eSBuYW1lIiwgIm1vdWwvIiwgZmFsc2V9LAoJCXsidXBwZXJjYXNlIiwgIk1vdWwvZm9yZ2UiLCBmYWxzZX0sCgkJeyJsZWFkaW5nIGRhc2giLCAibW91bC8tZm9yZ2UiLCBmYWxzZX0sCgkJeyJ0cmFpbGluZyBkb3QiLCAibW91bC9mb3JnZS4iLCBmYWxzZX0sCgkJeyJkb3VibGUgZG90IiwgIm1vdWwvZm8uLnJnZSIsIGZhbHNlfSwKCQl7ImRvdWJsZSBkYXNoIiwgIm1vdWwvZm8tLXJnZSIsIGZhbHNlfSwKCQl7InNwYWNlIiwgIm1vdWwvbXkgZm9yZ2UiLCBmYWxzZX0sCgkJeyJ0b28gbG9uZyIsICJtb3VsLyIgKyBzdHJpbmdzLlJlcGVhdCgiYSIsIDQwKSwgZmFsc2V9LAoJfQoJZm9yIF8sIHRjIDo9IHJhbmdlIGNhc2VzIHsKCQl1YXNzZXJ0LkVxdWFsKHQsIHRjLndhbnQsIFZhbGlkUmVwb0lEKHRjLmluKSwgdGMubmFtZSkKCX0KfQoKZnVuYyBUZXN0QWRkcmVzc05hbWVzcGFjZSh0ICp0ZXN0aW5nLlQpIHsKCWFkZHIgOj0gdGVzdHV0aWxzLlRlc3RBZGRyZXNzKCJhbGljZSIpLlN0cmluZygpCgljYXNlcyA6PSBbXXN0cnVjdCB7CgkJbmFtZSBzdHJpbmcKCQlpbiAgIHN0cmluZwoJCXdhbnQgYm9vbAoJfXsKCQl7ImEgcmVhbCBhZGRyZXNzIiwgYWRkciwgdHJ1ZX0sCgkJeyJ3cm9uZyBwcmVmaXgiLCAieDEiICsgYWRkclsyOl0sIGZhbHNlfSwKCQl7InRvbyBzaG9ydCIsIGFkZHJbOjM5XSwgZmFsc2V9LAoJCXsidG9vIGxvbmciLCBhZGRyICsgImEiLCBmYWxzZX0sCgkJeyJiZWNoMzIgZHJvcHMgYiBpIG8gMSIsICJnMSIgKyBzdHJpbmdzLlJlcGVhdCgiYiIsIDM4KSwgZmFsc2V9LAoJCXsidXBwZXJjYXNlIiwgIkcxIiArIGFkZHJbMjpdLCBmYWxzZX0sCgkJeyJhIHNsdWcgaXMgbm90IGFuIGFkZHJlc3MiLCAibW91bCIsIGZhbHNlfSwKCX0KCWZvciBfLCB0YyA6PSByYW5nZSBjYXNlcyB7CgkJdWFzc2VydC5FcXVhbCh0LCB0Yy53YW50LCBBZGRyZXNzTmFtZXNwYWNlKHRjLmluKSwgdGMubmFtZSkKCX0KCgkvLyBBbiBhZGRyZXNzIG5hbWVzcGFjZSBpcyBhIHZhbGlkIHJlcG8gaWQsIGFuZCBpdCBjYW5ub3QgY29sbGlkZSB3aXRoIGEKCS8vIGNsYWltZWQgbmFtZTogNDAgY2hhcmFjdGVycyBpcyBwYXN0IHRoZSBzbHVnIGNhcC4KCXVhc3NlcnQuVHJ1ZSh0LCBWYWxpZFJlcG9JRChhZGRyKyIvZm9yZ2UiKSkKCXVhc3NlcnQuRmFsc2UodCwgVmFsaWRSZXBvSUQoc3RyaW5ncy5SZXBlYXQoImEiLCA0MCkrIi9mb3JnZSIpKQoJdWFzc2VydC5GYWxzZSh0LCBWYWxpZFJlcG9JRChhZGRyKyIvIithZGRyKSwgInRoZSBuYW1lIGhhbGYgaXMgYWx3YXlzIGEgc2x1ZyIpCn0KCmZ1bmMgVGVzdFNwbGl0UmVwb0lEKHQgKnRlc3RpbmcuVCkgewoJbnMsIG5hbWUsIG9rIDo9IFNwbGl0UmVwb0lEKCJtb3VsL2ZvcmdlIikKCXVhc3NlcnQuVHJ1ZSh0LCBvaykKCXVhc3NlcnQuRXF1YWwodCwgIm1vdWwiLCBucykKCXVhc3NlcnQuRXF1YWwodCwgImZvcmdlIiwgbmFtZSkKCglmb3IgXywgYmFkIDo9IHJhbmdlIFtdc3RyaW5neyIiLCAibW91bCIsICIvZm9yZ2UiLCAibW91bC8iLCAiYS9iL2MifSB7CgkJXywgXywgb2sgOj0gU3BsaXRSZXBvSUQoYmFkKQoJCXVhc3NlcnQuRmFsc2UodCwgb2ssIGJhZCkKCX0KfQoKZnVuYyBUZXN0VmFsaWRUZXh0QW5kTGluZSh0ICp0ZXN0aW5nLlQpIHsKCXVhc3NlcnQuVHJ1ZSh0LCBWYWxpZFRleHQoImhlbGxvXG53b3JsZFx0dGFiIiwgNjQpKQoJdWFzc2VydC5GYWxzZSh0LCBWYWxpZFRleHQoImJlbGxceDA3IiwgNjQpKQoJdWFzc2VydC5GYWxzZSh0LCBWYWxpZFRleHQoInRvbyBsb25nIiwgMykpCgl1YXNzZXJ0LlRydWUodCwgVmFsaWRUZXh0KCIiLCAzKSkKCgl1YXNzZXJ0LlRydWUodCwgVmFsaWRMaW5lKCJhIHNpbmdsZSBsaW5lIiwgNjQpKQoJdWFzc2VydC5GYWxzZSh0LCBWYWxpZExpbmUoInR3b1xubGluZXMiLCA2NCkpCgl1YXNzZXJ0LkZhbHNlKHQsIFZhbGlkTGluZSgiYVx0dGFiIiwgNjQpKQp9CgpmdW5jIFRlc3RWYWxpZE1pcnJvckFuZExhYmVsKHQgKnRlc3RpbmcuVCkgewoJY2FzZXMgOj0gW11zdHJ1Y3QgewoJCWluICAgc3RyaW5nCgkJd2FudCBib29sCgl9ewoJCXsiaHR0cHM6Ly9naXRodWIuY29tL21vdWwvZ25vLWNvbnRyYWN0cy5naXQiLCB0cnVlfSwKCQl7ImdpdEBnaXRodWIuY29tOm1vdWwvZ25vLWNvbnRyYWN0cy5naXQiLCB0cnVlfSwKCQl7ImlwZnM6Ly9iYWZ5YmVpaGR3ZGNlZmdoNGRxa2p2Njd1emNtdzdvamVlNnhlZHpkZXRvanV6amV2dGVueHF1dnlrdSIsIHRydWV9LAoJCXsicmFkOi8vejNncWNKVW9BMW45SGFIS3VmWnM1RkNTR2F6djUiLCB0cnVlfSwKCQl7ImFyOi8vMVFLUGFmMUFtc0tfdFNTZFVndFZERVlHTHVRQk9LVE5yIiwgdHJ1ZX0sCgkJeyJmdHA6Ly9leGFtcGxlLmNvbS9yZXBvLmdpdCIsIGZhbHNlfSwKCQl7Im5vdCBhIHVybCIsIGZhbHNlfSwKCQl7IiIsIGZhbHNlfSwKCX0KCWZvciBfLCB0YyA6PSByYW5nZSBjYXNlcyB7CgkJdWFzc2VydC5FcXVhbCh0LCB0Yy53YW50LCBWYWxpZE1pcnJvcih0Yy5pbiksIHRjLmluKQoJfQoKCXVhc3NlcnQuVHJ1ZSh0LCBWYWxpZExhYmVsKCJidWciKSkKCXVhc3NlcnQuRmFsc2UodCwgVmFsaWRMYWJlbCgiIikpCgl1YXNzZXJ0LkZhbHNlKHQsIFZhbGlkTGFiZWwoImEsYiIpKQoJdWFzc2VydC5GYWxzZSh0LCBWYWxpZExhYmVsKHN0cmluZ3MuUmVwZWF0KCJ4IiwgMzMpKSkKfQoKZnVuYyBUZXN0UGFyc2VSb2xlUm91bmRUcmlwKHQgKnRlc3RpbmcuVCkgewoJZm9yIF8sIHIgOj0gcmFuZ2UgW11Sb2xle1JvbGVOb25lLCBSb2xlUmVhZGVyLCBSb2xlV3JpdGVyLCBSb2xlTWFpbnRhaW5lciwgUm9sZUFkbWluLCBSb2xlT3duZXJ9IHsKCQlnb3QsIGVyciA6PSBQYXJzZVJvbGUoci5TdHJpbmcoKSkKCQl1YXNzZXJ0Lk5vRXJyb3IodCwgZXJyLCByLlN0cmluZygpKQoJCXVhc3NlcnQuRXF1YWwodCwgaW50KHIpLCBpbnQoZ290KSwgci5TdHJpbmcoKSkKCX0KCV8sIGVyciA6PSBQYXJzZVJvbGUoInJvb3QiKQoJdWFzc2VydC5FcnJvcklzKHQsIGVyciwgRXJySW52YWxpZFJvbGUpCn0KIg00MTAwMDAwMHVnbm90CqhrCgwvdm0ubV9hZGRwa2cSl2sKKGcxbWFuZnJlZDQ3a3pkdWVjOTIwejg4d2ZyNjR5bGtzbWRjZWRsZjUS3GoKBXBpbG90Ehhnbm8ubGFuZC9wL21vdWwvcGlsb3QvdjAaxhsKCVJFQURNRS5tZBK4GyMgYGduby5sYW5kL3AvbW91bC9waWxvdC92MGAKCkEgcmVhbG0tZHJpdmVuIGFjY291bnQ6ICoqb25lIHJlYWxtIGhvbGRzIHRoZSBmdW5kcyBhbmQgdGhlIGlkZW50aXR5LCBhIGtleSBwaWxvdHMgaXQsIGFuZAppdHMgcG93ZXJzIGFycml2ZSBhZnRlcndhcmRzIGFzIHNlcGFyYXRlIHJlYWxtcyBpdCBuZXZlciBpbXBvcnRzLioqIFRoZSBnbm8gYW5zd2VyIHRvIGEKR25vc2lzIFNhZmUgd2l0aCBtb2R1bGVzLgoKTGl2ZSBpbnN0YW5jZTogW2ByL21vdWwvcGlsb3RgXSguLi8uLi8uLi9yL21vdWwvcGlsb3QpLiBBIHBvd2VyOgpbYHIvbW91bC94L3BpbG90ZGVtb2BdKC4uLy4uLy4uL3IvbW91bC94L3BpbG90ZGVtbykuCgojIyBXaHkgaXQgaXMgbm90IGp1c3QgYSBtdWx0aXNpZwoKZ25vIGhhcyAqKm5vIGR5bmFtaWMgY2FsbCoqOiBhIHJlYWxtIGNhbm5vdCBpbnZva2UgYW4gYXJiaXRyYXJ5IHBhY2thZ2UgcGF0aCB3aXRoCnJ1bnRpbWUtYnVpbHQgYXJndW1lbnRzLiBTbyBhbiBhY2NvdW50IGNhbiBuZXZlciBleGVjdXRlIGFyYml0cmFyeSBjYWxsZGF0YSB0aGUgd2F5IGEgU2FmZQpkb2VzLiBFdmVyeSBvdXRib3VuZCBhY3Rpb24gaGFzIHRvIGJlIEdvIGNvZGUgaW4gc29tZSByZWFsbS4KClRoZSBpbnZlcnNpb24gdGhhdCBtYWtlcyBpdCB3b3JrOiB0aGUgYWNjb3VudCBpcyBkZXBsb3llZCBvbmNlIGFuZCBzdG9yZXMgYE1vZHVsZWAgdmFsdWVzCmhhbmRlZCB0byBpdCBieSByZWFsbXMgdGhhdCBkaWQgbm90IGV4aXN0IGF0IHRoZSB0aW1lLiBUaGUgcG93ZXIgaXMgdGhlIGNhbGxkYXRhLCBwdWJsaXNoZWQKYXMgcmVhZGFibGUgc291cmNlLCBhbmQgaW5zdGFsbGluZyBvbmUgY29zdHMgbm8gcmVkZXBsb3kgb2YgdGhlIGFjY291bnQuCgojIyBUaGUgdHdvIGdyYW50cywgYW5kIHRoZSBvbmx5IGRpZmZlcmVuY2UgdGhhdCBtYXR0ZXJzCgp8IHwgYEdyYW50UHVyc2VgIHwgYEdyYW50SWRlbnRpdHlgIHwKfC0tLXwtLS18LS0tfAp8IHNwZW5kcyB8IHRoZSBtYWluIHRyZWFzdXJ5LCBtZXRlcmVkIHwgaXRzIG93biBzdWItdHJlYXN1cnkgYGFjY291bnQjc3VicGF0aGAgfAp8IGNhbiBhY3QgYXMgdGhlIGFjY291bnQgdG93YXJkIG90aGVyIHJlYWxtcyB8IG5vIHwgeWVzIHwKfCBgUmV2b2tlYCB0YWtlcyBpdCBiYWNrIHwgKip5ZXMsIGltbWVkaWF0ZWx5KiogfCAqKm5vLCBuZXZlcioqIHwKCkEgYFB1cnNlYCBpcyBhIHR5cGUgdGhpcyBwYWNrYWdlIGRlY2xhcmVzLCBzbyBldmVyeSBjYWxsIG9uIG9uZSByZS1lbnRlcnMgdGhpcyBjb2RlIGFuZApyZS1yZWFkcyB0aGUgbGl2ZSByb3N0ZXIgYW5kIGJ1ZGdldC4gQSBtb2R1bGUgdGhhdCBzdGFzaGVkIGEgcHVyc2UgYW5kIGNhbGxzIGl0IGEgeWVhciBsYXRlcgpzdGlsbCBnb2VzIHRocm91Z2ggdGhlIGNoZWNrLgoKQSBzdWItaWRlbnRpdHkgdG9rZW4gaXMgdGhlIG9wcG9zaXRlLiBUaGUgdG9rZW4gaXRzZWxmIGNhbm5vdCBiZSBwZXJzaXN0ZWQsIGJ1dApgYmFua2VyLk5ld0JhbmtlcmAgYXV0aG9yaXplcyBhdCBjb25zdHJ1Y3Rpb24gYW5kIHJlLWNoZWNrcyBub3RoaW5nIGV2ZXIgYWdhaW4sIHNvIGEgbW9kdWxlCmNhbiBtaW50IG9uZSBmcm9tIHRoZSBsZW50IHRva2VuIGFuZCBrZWVwIGl0LiBgUmV2b2tlYCBzaHV0cyB0aGUgYWNjb3VudCdzIGRvb3IgYW5kIGRvZXMgbm90CnJlYWNoIHRoYXQgYmFua2VyLiBUaGUgYmxhc3QgcmFkaXVzIGlzIGV4YWN0bHkgd2hhdCB0aGUgc3ViLWFkZHJlc3Mgd2FzIGZ1bmRlZCB3aXRoLCBhbmQgaXQKaXMgcGVybWFuZW50LiBHcmFudCBhbiBpZGVudGl0eSBvbmx5IHRvIGNvZGUgeW91IGhhdmUgcmVhZCwgYW5kIG5vdGUgdGhhdCB5b3UgY2FuIHJlYWQgaXQ6Cm1vZHVsZSBzb3VyY2UgaXMgb24gY2hhaW4gYmVmb3JlIHlvdSBhcHByb3ZlIGl0LgoKIyMgU2hhcGUKCmBgYGdvCi8vIG9uY2UsIGZyb20gdGhlIGFjY291bnQgcmVhbG0KYWNjdCA6PSBwaWxvdC5OZXcoMCwgY3VyKQoKLy8gdGhlIG93bmVyLCB0aHJvdWdoIHRoZSBhY2NvdW50IHJlYWxtJ3MgY3Jvc3NpbmcgZnVuY3Rpb25zCmFjY3QuQXBwcm92ZSgwLCBjdXIsICJnbm8ubGFuZC9yL3lvdS9zb21lcG93ZXIvdjAiLCAicG93ZXIiLCBwaWxvdC5HcmFudFB1cnNlLCAxXzAwMCkKYWNjdC5GdW5kKDAsIGN1ciwgcGF0aCwgNTAwKQphY2N0LlNldEJ1ZGdldCgwLCBjdXIsIHBhdGgsIDJfMDAwKQphY2N0LlJldm9rZSgwLCBjdXIsIHBhdGgpCmFjY3QuRXhlYygwLCBjdXIsIHBhdGgsIGFyZ3MpCgovLyB0aGUgbW9kdWxlIHJlYWxtLCB3aXRoIGl0cyBvd24gY3VyOiB0aGUgYWNjb3VudCByZWFkcyB0aGUgcGF0aCBmcm9tIHRoZQovLyBydW50aW1lIGFuZCBuZXZlciBmcm9tIGFuIGFyZ3VtZW50CmggOj0gYWNjb3VudC5IYW5kbGUoKQpoLlJlZ2lzdGVyKDAsIGN1ciwgc2VsZikKcHVyc2UgOj0gaC5QdXJzZUZvcigwLCBjdXIpCmBgYAoKIyMgQm90aCByZWFsbXMgaW4gdGhlIHBhaXIgbXVzdCBiZSBwdWJsaWMKCkEgbW9kdWxlJ3Mgb2JqZWN0IGlzIHBlcnNpc3RlZCBpbiB0aGUgYWNjb3VudCdzIHJvc3RlciwgYW5kIGEgdmFsdWUgb2YgYSB0eXBlIGRlZmluZWQgaW4gYQpwcml2YXRlIHJlYWxtIGNhbm5vdCBiZSBwZXJzaXN0ZWQgYnkgYW55b25lIGVsc2UuIEEgcHJpdmF0ZSBhY2NvdW50IHJlYWxtIGNhbm5vdCBiZSBpbXBvcnRlZAphdCBhbGwsIGFuZCBhIHJlZGVwbG95IHdvdWxkIHdpcGUgdGhlIG93bmVyLCB0aGUgcm9zdGVyIGFuZCBldmVyeSBidWRnZXQgd2hpbGUgbGVhdmluZyB0aGUKY29pbnMgYXQgdGhlIGFkZHJlc3MuIGBwcml2YXRlID0gdHJ1ZWAgaXMgd3JvbmcgZm9yIGJvdGggaGFsdmVzLCBhbmQgZWFjaCBgZ25vbW9kLnRvbWxgIHNheXMKc28uCgo8IS0tIEJFR0lOIEdOT0NPTlRSQUNUUyBGT09URVIgKGdlbmVyYXRlZCBieSBgbWFrZSByZWFkbWVzYDsgZG8gbm90IGVkaXQgYmVsb3cpIC0tPgoKLS0tCgpQYXJ0IG9mICoqW21vdWwvZ25vLWNvbnRyYWN0c10oaHR0cHM6Ly9naXRodWIuY29tL21vdWwvZ25vLWNvbnRyYWN0cykqKiDigJQgbW91bCdzIHZlcnNpb25lZCBnbm8ubGFuZCBjb250cmFjdHMuIFNlZSB0aGUgcmVwb3NpdG9yeSBmb3IgdGhlIGZ1bGwgY2F0YWxvZywgYnVpbGQvdGVzdCB0b29saW5nLCBhbmQgdXNhZ2UuCgoqKkRlcGVuZGVuY3kgZ3JhcGg6KioKCiFbZ25vLmxhbmQvcC9tb3VsL3BpbG90L3YwIGRlcGVuZGVuY3kgZ3JhcGhdKGh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9tb3VsL2duby1jb250cmFjdHMvbWFpbi9fYXNzZXRzL2duby5sYW5kL3AvbW91bC9waWxvdC92MC9kZXBzLnBuZykKCj4g4pqg77iPICoqRGlzY2xhaW1lcjoqKiBwcm92aWRlZCBhcy1pcywgd2l0aG91dCB3YXJyYW50eTsgbm90IHNlY3VyaXR5LWF1ZGl0ZWQuIEZ1bGwgZGlzY2xhaW1lcjogW0RJU0NMQUlNRVJdKGh0dHBzOi8vZ2l0aHViLmNvbS9tb3VsL2duby1jb250cmFjdHMvYmxvYi9tYWluL0RJU0NMQUlNRVIubWQpLgoKPCEtLSBFTkQgR05PQ09OVFJBQ1RTIEZPT1RFUiAtLT4KGj8KC2dub21vZC50b21sEjBtb2R1bGUgPSAiZ25vLmxhbmQvcC9tb3VsL3BpbG90L3YwIgpnbm8gPSAiMC45Igoark4KCXBpbG90LmdubxKgTi8vIFBhY2thZ2UgcGlsb3QgaXMgYSByZWFsbS1kcml2ZW4gYWNjb3VudDogb25lIHJlYWxtIGhvbGRzIHRoZSBmdW5kcyBhbmQgdGhlCi8vIGlkZW50aXR5LCBhIGtleSBwaWxvdHMgaXQsIGFuZCBpdHMgcG93ZXJzIGFyZSBzZXBhcmF0ZSByZWFsbXMgaW5zdGFsbGVkCi8vIGFmdGVyd2FyZHMgd2l0aG91dCBldmVyIHJlZGVwbG95aW5nIGl0LiBUaGUgZ25vIGFuc3dlciB0byBhIEdub3NpcyBTYWZlCi8vIHdpdGggbW9kdWxlcy4KLy8KLy8gQW4gYWNjb3VudCByZWFsbSBrZWVwcyBhICpQaWxvdCBwcml2YXRlIGFuZCBoYW5kcyBtb2R1bGVzIGEgbmFycm93Ci8vIFtBY2NvdW50XSBoYW5kbGUuIEV2ZXJ5dGhpbmcgcHJpdmlsZWdlZCBzdGF5cyBvbiAqUGlsb3QsIHdoaWNoIGlzIG5ldmVyCi8vIHJldHVybmVkLCBzbyBhIG1vZHVsZSBjYW4gb25seSByZWFjaCB0aGUgdHdvIG1ldGhvZHMgaXQgbmVlZHMuCi8vCi8vIFR3byB3YXlzIHRvIGRlbGVnYXRlLCBhbmQgdGhleSBkaWZmZXIgaW4gZXhhY3RseSBvbmUgcHJvcGVydHk6Ci8vCi8vICAgLSBBIFtQdXJzZV0gaXMgcmV2b2NhYmxlLiBFdmVyeSBtZXRob2Qgb24gaXQgcmUtZW50ZXJzIHRoZSBkZWNsYXJpbmcKLy8gICAgIHBhY2thZ2UgYW5kIHJlLWNoZWNrcyB0aGUgbGl2ZSByb3N0ZXIgYW5kIGJ1ZGdldCwgc28gUmV2b2tlIGFuZAovLyAgICAgU2V0QnVkZ2V0IHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5LCBldmVuIG9uIGEgcHVyc2UgYSBtb2R1bGUgcmV0YWluZWQuCi8vICAgLSBBIHN1Yi1pZGVudGl0eSB0b2tlbiAocmxtLlN1YikgaXMgcGVybWFuZW50LiBJdCBsZXRzIHRoZSBtb2R1bGUgYWN0IGFzCi8vICAgICAiPGFjY291bnQ+IzxzdWJwYXRoPiIgdG93YXJkIGFueSBvdGhlciByZWFsbSwgd2hpY2ggYSBwdXJzZSBjYW5ub3QgZG8sCi8vICAgICBidXQgdGhlIG1vZHVsZSBjYW4gbWludCBhIGJhbmtlciBmcm9tIGl0IGFuZCBrZWVwIGl0IGZvcmV2ZXIuIFJlbW92aW5nCi8vICAgICB0aGUgbW9kdWxlIGRvZXMgbm90IHRha2UgdGhhdCBiYWNrOyBvbmx5IGVtcHR5aW5nIHRoZSBzdWItYWRkcmVzcyBkb2VzLgovLyAgICAgR3JhbnQgb25lIG9ubHkgdG8gY29kZSB5b3UgaGF2ZSByZWFkLgovLwovLyBMaXZlIGluc3RhbmNlOiByL21vdWwvcGlsb3QuIERlbW8gbW9kdWxlOiByL21vdWwveC9waWxvdGRlbW8uCnBhY2thZ2UgcGlsb3QKCmltcG9ydCAoCgkiY2hhaW4iCgkiY2hhaW4vYmFua2VyIgoJImVycm9ycyIKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L3VmbXQvdjAiCikKCi8vIE1vZHVsZSBpcyBpbXBsZW1lbnRlZCBieSBhIG1vZHVsZSByZWFsbSBhbmQgaW5zdGFsbGVkIGludG8gYW4gYWNjb3VudC4KLy8gVGhlIGFjY291bnQgbmV2ZXIgaW1wb3J0cyBpdDogaXQgbGVhcm5zIHRoZSBtb2R1bGUgb25seSBhcyB0aGlzIGludGVyZmFjZS4KLy8KLy8gUnVuIGlzIHRocmVhZGVkICh0aGUgbGVhZGluZyBpbnQga2VlcHMgaXQgb3V0IG9mIGNyb3NzaW5nLWZ1bmN0aW9uCi8vIHRlcnJpdG9yeSwgd2hpY2ggYSAvcC8gcGFja2FnZSBtYXkgbm90IGRlY2xhcmUpLiBybG0gaXMgd2hhdGV2ZXIgdGhlCi8vIGFjY291bnQgY2hvc2UgdG8gZGVsZWdhdGU6IGl0cyBvd24gc3ViLWlkZW50aXR5IHRva2VuIGZvciBhIHRydXN0ZWQKLy8gbW9kdWxlLCBvciBhIHplcm8gdmFsdWUgd2hlbiB0aGUgbW9kdWxlIHdhcyBpbnN0YWxsZWQgcHVyc2Utb25seS4KdHlwZSBNb2R1bGUgaW50ZXJmYWNlIHsKCU5hbWUoKSBzdHJpbmcKCVJ1bihfIGludCwgcmxtIHJlYWxtLCBhcmdzIHN0cmluZykgc3RyaW5nCn0KCi8vIEdyYW50IHNheXMgd2hhdCBhIG1vZHVsZSB3YXMgZ2l2ZW4uCnR5cGUgR3JhbnQgdWludDgKCmNvbnN0ICgKCS8vIEdyYW50UHVyc2UgaXMgZnVuZHMgb25seSwgcmV2b2NhYmxlIGF0IGFueSB0aW1lLgoJR3JhbnRQdXJzZSBHcmFudCA9IGlvdGEKCS8vIEdyYW50SWRlbnRpdHkgYWxzbyBsZW5kcyB0aGUgYWNjb3VudCdzIHN1Yi1pZGVudGl0eS4gUGVybWFuZW50LgoJR3JhbnRJZGVudGl0eQopCgpmdW5jIChnIEdyYW50KSBTdHJpbmcoKSBzdHJpbmcgewoJaWYgZyA9PSBHcmFudElkZW50aXR5IHsKCQlyZXR1cm4gImlkZW50aXR5IgoJfQoJcmV0dXJuICJwdXJzZSIKfQoKdmFyICgKCUVyck5vdE93bmVyICAgICA9IGVycm9ycy5OZXcoInBpbG90OiBub3QgdGhlIG93bmVyIikKCUVyck5vdEFwcHJvdmVkICA9IGVycm9ycy5OZXcoInBpbG90OiBwYXRoIG5vdCBhcHByb3ZlZCIpCglFcnJOb3RJbnN0YWxsZWQgPSBlcnJvcnMuTmV3KCJwaWxvdDogbW9kdWxlIG5vdCBpbnN0YWxsZWQiKQoJRXJyUmV2b2tlZCAgICAgID0gZXJyb3JzLk5ldygicGlsb3Q6IG1vZHVsZSByZXZva2VkIikKCUVyck92ZXJCdWRnZXQgICA9IGVycm9ycy5OZXcoInBpbG90OiBvdmVyIGJ1ZGdldCIpCglFcnJTdGFsZVJlYWxtICAgPSBlcnJvcnMuTmV3KCJwaWxvdDogc3RhbGUgcmVhbG0gdmFsdWUiKQoJRXJyQmFkTmFtZSAgICAgID0gZXJyb3JzLk5ldygicGlsb3Q6IGEgcGF0aCBhbmQgYSBzdWJwYXRoIGFyZSBbYS16QS1aMC05Ll8vLV0gYW5kIG5vdCBlbXB0eSIpCikKCnR5cGUgc2xvdCBzdHJ1Y3QgewoJbW9kICAgICBNb2R1bGUKCXN1YnBhdGggc3RyaW5nCglncmFudCAgIEdyYW50CglidWRnZXQgIGludDY0CglzcGVudCAgIGludDY0CglydW5zICAgIGludDY0CglsaXZlICAgIGJvb2wKfQoKLy8gUGlsb3QgaXMgdGhlIGFjY291bnQuIFRoZSByZWFsbSB0aGF0IGNvbnN0cnVjdHMgaXQgb3ducyBpdCBhbmQgbXVzdCBub3QKLy8gaGFuZCBpdCBvdXQ7IGhhbmQgb3V0IFtQaWxvdC5IYW5kbGVdIGluc3RlYWQuCnR5cGUgUGlsb3Qgc3RydWN0IHsKCW93bmVyICAgYWRkcmVzcwoJaG9zdCAgICBzdHJpbmcgICAgICAgIC8vIHRoZSBhY2NvdW50IHJlYWxtJ3Mgb3duIHBrZ3BhdGgKCXZhdWx0ICAgYmFua2VyLkJhbmtlciAvLyBvdmVyIGhvc3QncyBhZGRyZXNzLCBtaW50ZWQgb25jZSBhdCBOZXcKCXNsb3RzICAgKmF2bC5UcmVlICAgICAvLyBtb2R1bGUgcGtncGF0aCAtPiAqc2xvdAoJaGFuZGxlICAqQWNjb3VudAp9CgovLyBBY2NvdW50IGlzIHRoZSBtb2R1bGUtZmFjaW5nIGhhbGY6IHR3byBtZXRob2RzLCBib3RoIGtleWVkIG9uIHRoZSBjYWxsaW5nCi8vIHJlYWxtJ3MgT1dOIHBrZ3BhdGgsIHdoaWNoIGEgcmVhbG0gY2Fubm90IGZvcmdlIGZvciBhbm90aGVyLgp0eXBlIEFjY291bnQgc3RydWN0IHsKCXAgKlBpbG90Cn0KCi8vIE5ldyBidWlsZHMgYW4gYWNjb3VudCBvd25lZCBieSB0aGUgY2FsbGVyIG9mIHRoZSBjcm9zc2luZyBmdW5jdGlvbiB0aGF0Ci8vIHJlYWNoZXMgaXQuIENhbGwgaXQgb25jZSwgZnJvbSB0aGUgYWNjb3VudCByZWFsbSwgcGFzc2luZyB0aGF0IHJlYWxtJ3MgY3VyLgpmdW5jIE5ldyhfIGludCwgcmxtIHJlYWxtKSAqUGlsb3QgewoJYXNzZXJ0Q3VycmVudCgwLCBybG0pCglwIDo9ICZQaWxvdHsKCQlvd25lcjogcmxtLlByZXZpb3VzKCkuQWRkcmVzcygpLAoJCWhvc3Q6ICBybG0uUGtnUGF0aCgpLAoJCXZhdWx0OiBiYW5rZXIuTmV3QmFua2VyKGJhbmtlci5CYW5rZXJUeXBlUmVhbG1TZW5kLCBybG0pLAoJCXNsb3RzOiBhdmwuTmV3VHJlZSgpLAoJfQoJcC5oYW5kbGUgPSAmQWNjb3VudHtwOiBwfQoJcmV0dXJuIHAKfQoKLy8gYXNzZXJ0UGxhaW4gaXMgd2h5IFJlbmRlciBjYW4gaW50ZXJwb2xhdGUgYSBwYXRoIHdpdGhvdXQgZXNjYXBpbmcgaXQ6IHRoZQovLyBvbmx5IHR3byBzdHJpbmdzIGEgY2FsbGVyIGV2ZXIgcHV0cyBpbiB0aGUgcm9zdGVyIGFyZSBjaGVja2VkIGhlcmUsIGF0IHdyaXRlCi8vIHRpbWUsIGFnYWluc3QgdGhlIGNoYXJzZXQgYSBwYWNrYWdlIHBhdGggYW5kIGEgc3VicGF0aCBhcmUgYnVpbHQgZnJvbS4KZnVuYyBhc3NlcnRQbGFpbihzIHN0cmluZykgewoJaWYgcyA9PSAiIiB7CgkJcGFuaWMoRXJyQmFkTmFtZSkKCX0KCWZvciBpIDo9IDA7IGkgPCBsZW4ocyk7IGkrKyB7CgkJYyA6PSBzW2ldCgkJc3dpdGNoIHsKCQljYXNlIGMgPj0gJ2EnICYmIGMgPD0gJ3onLCBjID49ICdBJyAmJiBjIDw9ICdaJywgYyA+PSAnMCcgJiYgYyA8PSAnOSc6CgkJY2FzZSBjID09ICcuJywgYyA9PSAnLycsIGMgPT0gJy0nLCBjID09ICdfJzoKCQlkZWZhdWx0OgoJCQlwYW5pYyhFcnJCYWROYW1lKQoJCX0KCX0KfQoKZnVuYyBhc3NlcnRDdXJyZW50KF8gaW50LCBybG0gcmVhbG0pIHsKCWlmICFybG0uSXNDdXJyZW50KCkgewoJCXBhbmljKEVyclN0YWxlUmVhbG0pCgl9Cn0KCi8vIEFzc2VydE93bmVyIHBhbmljcyB1bmxlc3MgdGhlIHVzZXIgYmVoaW5kIHJsbSBvd25zIHRoZSBhY2NvdW50LiBPbmx5IHRoZQovLyBhY2NvdW50IHJlYWxtIG1heSBjYWxsIHRoaXM6IHJsbSBtdXN0IGJlIGl0cyBvd24gbGl2ZSBjdXIsIHNvIHRoYXQKLy8gcmxtLlByZXZpb3VzKCkgaXMgdGhlIHNpZ25lciBhbmQgbm90IHNvbWUgaW50ZXJtZWRpYXJ5J3MgY2FsbGVyLgpmdW5jIChwICpQaWxvdCkgQXNzZXJ0T3duZXIoXyBpbnQsIHJsbSByZWFsbSkgewoJYXNzZXJ0Q3VycmVudCgwLCBybG0pCglpZiBybG0uUGtnUGF0aCgpICE9IHAuaG9zdCB7CgkJcGFuaWMoRXJyTm90T3duZXIpCgl9CglpZiBybG0uUHJldmlvdXMoKS5BZGRyZXNzKCkgIT0gcC5vd25lciB7CgkJcGFuaWMoRXJyTm90T3duZXIpCgl9Cn0KCi8vIEhhbmRsZSBpcyB3aGF0IGFuIGFjY291bnQgcmVhbG0gZXhwb3NlcyB0byBtb2R1bGVzLgpmdW5jIChwICpQaWxvdCkgSGFuZGxlKCkgKkFjY291bnQgeyByZXR1cm4gcC5oYW5kbGUgfQoKZnVuYyAocCAqUGlsb3QpIE93bmVyKCkgYWRkcmVzcyB7IHJldHVybiBwLm93bmVyIH0KZnVuYyAocCAqUGlsb3QpIEhvc3QoKSBzdHJpbmcgICB7IHJldHVybiBwLmhvc3QgfQoKLy8gQWRkcmVzcyBpcyB0aGUgYWNjb3VudCdzIG1haW4gdHJlYXN1cnkuCmZ1bmMgKHAgKlBpbG90KSBBZGRyZXNzKCkgYWRkcmVzcyB7IHJldHVybiBjaGFpbi5QYWNrYWdlQWRkcmVzcyhwLmhvc3QpIH0KCi8vIFN1YkFkZHJlc3MgaXMgb25lIG1vZHVsZSdzIG93biB0cmVhc3VyeSwgZGVyaXZhYmxlIG9mZi1jaGFpbiBieSBhbnlvbmUuCmZ1bmMgKHAgKlBpbG90KSBTdWJBZGRyZXNzKHBhdGggc3RyaW5nKSBhZGRyZXNzIHsKCXMgOj0gcC5tdXN0U2xvdChwYXRoKQoJcmV0dXJuIGNoYWluLkRlcml2ZVBrZ1N1YkFkZHIocC5ob3N0LCBzLnN1YnBhdGgpCn0KCmZ1bmMgKHAgKlBpbG90KSBtdXN0U2xvdChwYXRoIHN0cmluZykgKnNsb3QgewoJcywgb2sgOj0gcC5zbG90cy5HZXQocGF0aCkuKCpzbG90KQoJaWYgIW9rIHsKCQlwYW5pYyhFcnJOb3RJbnN0YWxsZWQpCgl9CglyZXR1cm4gcwp9CgovLyBBcHByb3ZlIGF1dGhvcmlzZXMgYSBwYWNrYWdlIHBhdGggdG8gaW5zdGFsbCBpdHNlbGYgbGF0ZXIuIFRoZSBjb2RlIGRvZXMKLy8gbm90IGhhdmUgdG8gZXhpc3QgeWV0LCB3aGljaCBpcyB0aGUgd2hvbGUgcG9pbnQ6IHRoZSBhY2NvdW50IGlzIGRlcGxveWVkCi8vIG9uY2UgYW5kIGxlYXJucyBuZXcgcG93ZXJzIGFmdGVyd2FyZHMuCmZ1bmMgKHAgKlBpbG90KSBBcHByb3ZlKF8gaW50LCBybG0gcmVhbG0sIHBhdGgsIHN1YnBhdGggc3RyaW5nLCBncmFudCBHcmFudCwgYnVkZ2V0IGludDY0KSB7CglwLkFzc2VydE93bmVyKDAsIHJsbSkKCWFzc2VydFBsYWluKHBhdGgpCglhc3NlcnRQbGFpbihzdWJwYXRoKQoJaWYgb2xkLCBvayA6PSBwLnNsb3RzLkdldChwYXRoKS4oKnNsb3QpOyBvayB7CgkJb2xkLnN1YnBhdGggPSBzdWJwYXRoCgkJb2xkLmdyYW50ID0gZ3JhbnQKCQlvbGQuYnVkZ2V0ID0gYnVkZ2V0CgkJb2xkLnNwZW50ID0gMCAvLyBhIG5ldyBhcHByb3ZhbCBpcyBhIG5ldyBhbGxvd2FuY2UKCQlyZXR1cm4KCX0KCXAuc2xvdHMuU2V0KHBhdGgsICZzbG90e3N1YnBhdGg6IHN1YnBhdGgsIGdyYW50OiBncmFudCwgYnVkZ2V0OiBidWRnZXR9KQp9CgovLyBTZXRCdWRnZXQgaXMgdGhlIGxpdmUga25vYi4gSXQgYXBwbGllcyB0byBhIHB1cnNlIGEgbW9kdWxlIGFscmVhZHkgaG9sZHMuCmZ1bmMgKHAgKlBpbG90KSBTZXRCdWRnZXQoXyBpbnQsIHJsbSByZWFsbSwgcGF0aCBzdHJpbmcsIGJ1ZGdldCBpbnQ2NCkgewoJcC5Bc3NlcnRPd25lcigwLCBybG0pCglwLm11c3RTbG90KHBhdGgpLmJ1ZGdldCA9IGJ1ZGdldAp9CgovLyBSZXZva2Ugc3RvcHMgYSBtb2R1bGUuIEl0IHRha2VzIGJhY2sgaXRzIHB1cnNlIGltbWVkaWF0ZWx5OyBpdCBkb2VzIE5PVAovLyB0YWtlIGJhY2sgYSBzdWItaWRlbnRpdHkgdGhhdCB3YXMgZ3JhbnRlZCwgbm9yIGFueSBiYW5rZXIgbWludGVkIGZyb20gb25lLgpmdW5jIChwICpQaWxvdCkgUmV2b2tlKF8gaW50LCBybG0gcmVhbG0sIHBhdGggc3RyaW5nKSB7CglwLkFzc2VydE93bmVyKDAsIHJsbSkKCXAubXVzdFNsb3QocGF0aCkubGl2ZSA9IGZhbHNlCn0KCi8vIEZ1bmQgbW92ZXMgY29pbnMgZnJvbSB0aGUgYWNjb3VudCdzIG1haW4gdHJlYXN1cnkgaW50byBhIG1vZHVsZSdzCi8vIHN1Yi10cmVhc3VyeS4gRm9yIGFuIGlkZW50aXR5IGdyYW50IHRoaXMgaXMgdGhlIHBlcm1hbmVudCBibGFzdCByYWRpdXMuCmZ1bmMgKHAgKlBpbG90KSBGdW5kKF8gaW50LCBybG0gcmVhbG0sIHBhdGggc3RyaW5nLCBhbW91bnQgaW50NjQpIHsKCXAuQXNzZXJ0T3duZXIoMCwgcmxtKQoJcyA6PSBwLm11c3RTbG90KHBhdGgpCglwLnZhdWx0LlNlbmRDb2lucyhwLkFkZHJlc3MoKSwgY2hhaW4uRGVyaXZlUGtnU3ViQWRkcihwLmhvc3QsIHMuc3VicGF0aCksCgkJY2hhaW4uTmV3Q29pbnMoY2hhaW4uTmV3Q29pbigidWdub3QiLCBhbW91bnQpKSkKfQoKLy8gRXhlYyBkcml2ZXMgYW4gaW5zdGFsbGVkIG1vZHVsZS4gcmxtIG11c3QgYmUgdGhlIGFjY291bnQgcmVhbG0ncyBvd24gbGl2ZQovLyBjdXI6IGFuIGlkZW50aXR5IGdyYW50IG1pbnRzIGl0cyBzdWItdG9rZW4gZnJvbSBpdCwgd2hpY2ggb25seSB0aGUgYWNjb3VudAovLyByZWFsbSdzIG5hbWVzcGFjZSBjYW4gZG8uCmZ1bmMgKHAgKlBpbG90KSBFeGVjKF8gaW50LCBybG0gcmVhbG0sIHBhdGgsIGFyZ3Mgc3RyaW5nKSBzdHJpbmcgewoJcC5Bc3NlcnRPd25lcigwLCBybG0pCglzIDo9IHAubXVzdFNsb3QocGF0aCkKCWlmICFzLmxpdmUgewoJCXBhbmljKEVyclJldm9rZWQpCgl9CglzLnJ1bnMrKwoJaWYgcy5ncmFudCA9PSBHcmFudElkZW50aXR5IHsKCQlyZXR1cm4gcy5tb2QuUnVuKDAsIHJsbS5TdWIocy5zdWJwYXRoKSwgYXJncykKCX0KCXJldHVybiBzLm1vZC5SdW4oMCwgcmxtLCBhcmdzKQp9CgovLyBSZWdpc3RlciBpcyBjYWxsZWQgQlkgdGhlIG1vZHVsZSByZWFsbSwgd2l0aCBpdHMgb3duIGxpdmUgY3VyLiBUaGUgYWNjb3VudAovLyByZWFkcyB0aGUgcGF0aCBmcm9tIHRoZSBydW50aW1lIGFuZCBuZXZlciBmcm9tIGFuIGFyZ3VtZW50LgpmdW5jIChhICpBY2NvdW50KSBSZWdpc3RlcihfIGludCwgcmxtIHJlYWxtLCBtIE1vZHVsZSkgewoJYXNzZXJ0Q3VycmVudCgwLCBybG0pCglwYXRoIDo9IHJsbS5Qa2dQYXRoKCkKCXMsIG9rIDo9IGEucC5zbG90cy5HZXQocGF0aCkuKCpzbG90KQoJaWYgIW9rIHsKCQlwYW5pYyhFcnJOb3RBcHByb3ZlZCkKCX0KCXMubW9kID0gbQoJcy5saXZlID0gdHJ1ZQp9CgovLyBQdXJzZUZvciBoYW5kcyB0aGUgY2FsbGluZyBtb2R1bGUgaXRzIHJldm9jYWJsZSBwdXJzZS4KZnVuYyAoYSAqQWNjb3VudCkgUHVyc2VGb3IoXyBpbnQsIHJsbSByZWFsbSkgKlB1cnNlIHsKCWFzc2VydEN1cnJlbnQoMCwgcmxtKQoJcGF0aCA6PSBybG0uUGtnUGF0aCgpCglpZiBfLCBvayA6PSBhLnAuc2xvdHMuR2V0KHBhdGgpLigqc2xvdCk7ICFvayB7CgkJcGFuaWMoRXJyTm90QXBwcm92ZWQpCgl9CglyZXR1cm4gJlB1cnNle3A6IGEucCwgcGF0aDogcGF0aH0KfQoKLy8gUHVyc2UgaXMgYSBjYXBhYmlsaXR5IHRoaXMgcGFja2FnZSBkZWNsYXJlcywgc28gZXZlcnkgdXNlIG9mIGl0IHJ1bnMgaGVyZQovLyBhbmQgaXMgcmUtY2hlY2tlZCBhZ2FpbnN0IGxpdmUgc3RhdGUuIFRoYXQgaXMgd2hhdCBtYWtlcyBpdCByZXZvY2FibGUsCi8vIHdoZXJlIGEgYmFua2VyIG1pbnRlZCBmcm9tIGEgbGVudCByZWFsbSB0b2tlbiBpcyBub3QuCnR5cGUgUHVyc2Ugc3RydWN0IHsKCXAgICAgKlBpbG90CglwYXRoIHN0cmluZwp9CgovLyBQYXkgc3BlbmRzIGZyb20gdGhlIGFjY291bnQncyBtYWluIHRyZWFzdXJ5LCBhZ2FpbnN0IHRoZSBtb2R1bGUncyBidWRnZXQuCmZ1bmMgKHUgKlB1cnNlKSBQYXkodG8gYWRkcmVzcywgYW1vdW50IGludDY0KSB7CglzLCBvayA6PSB1LnAuc2xvdHMuR2V0KHUucGF0aCkuKCpzbG90KQoJaWYgIW9rIHsKCQlwYW5pYyhFcnJOb3RJbnN0YWxsZWQpCgl9CglpZiAhcy5saXZlIHsKCQlwYW5pYyhFcnJSZXZva2VkKQoJfQoJaWYgYW1vdW50IDw9IDAgfHwgYW1vdW50ID4gcy5idWRnZXQtcy5zcGVudCB7CgkJcGFuaWMoRXJyT3ZlckJ1ZGdldCkKCX0KCXMuc3BlbnQgKz0gYW1vdW50Cgl1LnAudmF1bHQuU2VuZENvaW5zKHUucC5BZGRyZXNzKCksIHRvLCBjaGFpbi5OZXdDb2lucyhjaGFpbi5OZXdDb2luKCJ1Z25vdCIsIGFtb3VudCkpKQp9CgovLyBMZWZ0IGlzIHdoYXQgdGhpcyBtb2R1bGUgbWF5IHN0aWxsIHNwZW5kLgpmdW5jICh1ICpQdXJzZSkgTGVmdCgpIGludDY0IHsKCXMsIG9rIDo9IHUucC5zbG90cy5HZXQodS5wYXRoKS4oKnNsb3QpCglpZiAhb2sgfHwgIXMubGl2ZSB7CgkJcmV0dXJuIDAKCX0KCXJldHVybiBzLmJ1ZGdldCAtIHMuc3BlbnQKfQoKLy8gUmVuZGVyIGlzIHRoZSBhY2NvdW50IHBhZ2UuIFRoZSBhY2NvdW50IHJlYWxtIGZvcndhcmRzIGl0cyBSZW5kZXIgaGVyZS4KZnVuYyAocCAqUGlsb3QpIFJlbmRlcihwYXRoIHN0cmluZykgc3RyaW5nIHsKCXZhciBzYiBzdHJpbmdzLkJ1aWxkZXIKCXNiLldyaXRlU3RyaW5nKCIjICIgKyBwLmhvc3QgKyAiXG5cbiIpCglzYi5Xcml0ZVN0cmluZygifCB8IHxcbnwtLS18LS0tfFxuIikKCXNiLldyaXRlU3RyaW5nKCJ8IG93bmVyIHwgIiArIHAub3duZXIuU3RyaW5nKCkgKyAiIHxcbiIpCglzYi5Xcml0ZVN0cmluZygifCB0cmVhc3VyeSB8ICIgKyBwLkFkZHJlc3MoKS5TdHJpbmcoKSArICIgfFxuIikKCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCBiYWxhbmNlIHwgJWQgdWdub3QgfFxuXG4iLCBwLmJhbGFuY2UocC5BZGRyZXNzKCkpKSkKCglpZiBwLnNsb3RzLlNpemUoKSA9PSAwIHsKCQlzYi5Xcml0ZVN0cmluZygiTm8gcG93ZXIgaW5zdGFsbGVkIHlldC5cbiIpCgkJcmV0dXJuIHNiLlN0cmluZygpCgl9CgoJc2IuV3JpdGVTdHJpbmcoIiMjIHBvd2Vyc1xuXG4iKQoJc2IuV3JpdGVTdHJpbmcoInwgcGF0aCB8IGdyYW50IHwgaWRlbnRpdHkgfCBzdGF0ZSB8IGxlZnQgfCBydW5zIHwgc3ViLXRyZWFzdXJ5IHxcbiIpCglzYi5Xcml0ZVN0cmluZygifC0tLXwtLS18LS0tfC0tLXwtLS18LS0tfC0tLXxcbiIpCglwLnNsb3RzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGtleSBzdHJpbmcsIHYgYW55KSBib29sIHsKCQlzIDo9IHYuKCpzbG90KQoJCXN0YXRlIDo9ICJhcHByb3ZlZCIKCQlpZiBzLmxpdmUgewoJCQlzdGF0ZSA9ICJpbnN0YWxsZWQiCgkJfSBlbHNlIGlmIHMubW9kICE9IG5pbCB7CgkJCXN0YXRlID0gInJldm9rZWQiCgkJfQoJCXN1YiA6PSBjaGFpbi5EZXJpdmVQa2dTdWJBZGRyKHAuaG9zdCwgcy5zdWJwYXRoKQoJCXNiLldyaXRlU3RyaW5nKHVmbXQuU3ByaW50ZigifCBgJXNgIHwgJXMgfCBgJXMjJXNgIHwgJXMgfCAlZCB8ICVkIHwgJWQgdWdub3QgfFxuIiwKCQkJa2V5LCBzLmdyYW50LlN0cmluZygpLCBwLmhvc3QsIHMuc3VicGF0aCwgc3RhdGUsCgkJCXMuYnVkZ2V0LXMuc3BlbnQsIHMucnVucywgcC5iYWxhbmNlKHN1YikpKQoJCXJldHVybiBmYWxzZQoJfSkKCXJldHVybiBzYi5TdHJpbmcoKQp9CgpmdW5jIChwICpQaWxvdCkgYmFsYW5jZShhZGRyIGFkZHJlc3MpIGludDY0IHsKCXJldHVybiBiYW5rZXIuTmV3UmVhZG9ubHlCYW5rZXIoKS5HZXRDb2luKGFkZHIsICJ1Z25vdCIpCn0KIgw2MDAwMDAwdWdub3QKk1cKDC92bS5tX2FkZHBrZxKCVwooZzFtYW5mcmVkNDdremR1ZWM5MjB6ODh3ZnI2NHlsa3NtZGNlZGxmNRLHVgoGZmFjYWRlEipnbm8ubGFuZC9yL21vdWwveC91cGdyYWRlL3NjaGVtYS9mYWNhZGUvdjAauQkKCVJFQURNRS5tZBKrCSMgYGduby5sYW5kL3IvbW91bC94L3VwZ3JhZGUvc2NoZW1hL2ZhY2FkZS92MGAKClRoZSAqKnBlcm1hbmVudCBlbnRyeSBwb2ludCoqIG9mIHBhdHRlcm4gRy4gSG9sZHMgb25lIGBDYWxsKGN1ciwgdmVyYiwgcGF5bG9hZClgCnNpZ25hdHVyZSBmb3JldmVyIGFuZCBtb3ZlcyB0aGUgQVBJIGludG8gZGF0YSBlYWNoIGhhbmRsZXIgZGVjbGFyZXM6IGl0IHBhcnNlcyB0aGUKc2NoZW1hLCBjaGVja3MgYXJpdHkgYmVmb3JlIGRpc3BhdGNoLCBlbnVtZXJhdGVzIHZlcmJzIHdpdGhvdXQgYSB0cmFuc2FjdGlvbiwgYW5kCnJlZnVzZXMgYW4gdXBncmFkZSB3aG9zZSBzY2hlbWEgd291bGQgYnJlYWsgYW4gZXhpc3RpbmcgY2FsbGVyLgoKU2VlIFt0aGUgcGF0dGVybl0oLi4vUkVBRE1FLm1kKSBhbmQgW3RoZSBleHBsb3JhdGlvbl0oLi4vLi4vUkVBRE1FLm1kKS4KCjwhLS0gQkVHSU4gR05PQ09OVFJBQ1RTIEZPT1RFUiAoZ2VuZXJhdGVkIGJ5IGBtYWtlIHJlYWRtZXNgOyBkbyBub3QgZWRpdCBiZWxvdykgLS0+CgotLS0KClBhcnQgb2YgKipbbW91bC9nbm8tY29udHJhY3RzXShodHRwczovL2dpdGh1Yi5jb20vbW91bC9nbm8tY29udHJhY3RzKSoqIOKAlCBtb3VsJ3MgdmVyc2lvbmVkIGduby5sYW5kIGNvbnRyYWN0cy4gU2VlIHRoZSByZXBvc2l0b3J5IGZvciB0aGUgZnVsbCBjYXRhbG9nLCBidWlsZC90ZXN0IHRvb2xpbmcsIGFuZCB1c2FnZS4KCioqRGVwZW5kZW5jeSBncmFwaDoqKgoKIVtnbm8ubGFuZC9yL21vdWwveC91cGdyYWRlL3NjaGVtYS9mYWNhZGUvdjAgZGVwZW5kZW5jeSBncmFwaF0oaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL21vdWwvZ25vLWNvbnRyYWN0cy9tYWluL19hc3NldHMvZ25vLmxhbmQvci9tb3VsL3gvdXBncmFkZS9zY2hlbWEvZmFjYWRlL3YwL2RlcHMucG5nKQoKPiDwn6eqICoqSGlnaGx5IGV4cGVyaW1lbnRhbCDigJQgcG90ZW50aWFsbHkgdmliZS1jb2RlZC4qKiBOb3QgYXVkaXRlZDsgbWF5IGJyZWFrLCBjaGFuZ2UsIG9yIGJlIHJlbW92ZWQgYXQgYW55IHRpbWUuIERvIG5vdCB1c2Ugd2l0aCBhbnl0aGluZyBvZiB2YWx1ZS4gRnVsbCBkaXNjbGFpbWVyOiBbRElTQ0xBSU1FUl0oaHR0cHM6Ly9naXRodWIuY29tL21vdWwvZ25vLWNvbnRyYWN0cy9ibG9iL21haW4vRElTQ0xBSU1FUi5tZCkuCgo8IS0tIEVORCBHTk9DT05UUkFDVFMgRk9PVEVSIC0tPgoa/EgKCmZhY2FkZS5nbm8S7UgvLyB1bnRydXN0ZWQtcmVuZGVyOiBldmVyeSBzdHJpbmcgUmVuZGVyIGVjaG9lcyBpcyBlaXRoZXIgYSB2ZXJiIG5hbWUgdmFsaWRhdGVkCi8vIGJ5IHBhcnNlU2NoZW1hIGFnYWluc3QgW2EtejAtOV9dIGF0IGFjY2VwdCB0aW1lLCBvciBhIHBhY2thZ2UgcGF0aCByZWFkIG9mZiBhCi8vIGNyb3NzaW5nIGZyYW1lLiBObyBjYWxsZXItdHlwZWQgcGF5bG9hZCBpcyBldmVyIHJlbmRlcmVkLgovLwovLyBQYWNrYWdlIGZhY2FkZSBpcyB0aGUgcGVybWFuZW50IGVudHJ5IHBvaW50IG9mIHRoZSAiQVBJIGFzIGRhdGEiIHVwZ3JhZGUKLy8gcGF0dGVybiAocGF0dGVybiBHIG9mIHRoZSBleHBsb3JhdGlvbjsgc2VlIC4uLy4uL1JFQURNRS5tZCkuCi8vCi8vIFBhdHRlcm5zIEUgYW5kIEYgcHV0IGEgR28gaW50ZXJmYWNlIGF0IHRoZSBwZXJtYW5lbnQgcGF0aCwgd2hpY2ggZml4ZXMgdGhlCi8vIG1ldGhvZCBzZXQgYXQgZGVwbG95OiBhZGRpbmcgYW4gb3BlcmF0aW9uIGxhdGVyIG5lZWRzIGEgd2hvbGUgZXh0cmEgcmVhbG0uCi8vIFRoaXMgb25lIHB1dHMgYSBzaW5nbGUgZW50cnkgcG9pbnQgdGhlcmUgaW5zdGVhZCwKLy8KLy8JQ2FsbChjdXIgcmVhbG0sIHZlcmIsIHBheWxvYWQgc3RyaW5nKSBzdHJpbmcKLy8KLy8gYW5kIG1vdmVzIHRoZSBBUEkgaW50byBEQVRBIHRoYXQgZWFjaCBpbXBsZW1lbnRhdGlvbiBkZWNsYXJlcy4gVGhlIHNpZ25hdHVyZQovLyB0aGF0IGNhbiBuZXZlciBjaGFuZ2UgaXMgdGhhdCBvbmUgbGluZTsgZXZlcnl0aGluZyB0aGUgYXBwbGljYXRpb24gZG9lcyBjYW4KLy8gc3RpbGwgZ3Jvdy4KLy8KLy8gVGhyZWUgdGhpbmdzIGZhbGwgb3V0IG9mIHRoZSBBUEkgYmVpbmcgZGF0YSwgYW5kIHRoZXkgYXJlIHRoZSByZWFzb24gdG8gcGF5Ci8vIHRoZSBwcmljZSBiZWxvdzoKLy8KLy8gIDEuIENhbGxlcnMgY2FuIEVOVU1FUkFURSBpdC4gVmVyYnMsIFNpZ25hdHVyZSBhbmQgU2NoZW1hVGV4dCBhbnN3ZXIgd2l0aG91dAovLyAgICAgYSB0cmFuc2FjdGlvbiwgc28gYSBjbGllbnQgZGlzY292ZXJzIHRoZSBBUEkgaW5zdGVhZCBvZiBiZWluZyBjb21waWxlZAovLyAgICAgYWdhaW5zdCBpdC4KLy8gIDIuIFBheWxvYWRzIGFyZSBDSEVDS0VEIGJlZm9yZSB0aGUgaGFuZGxlciBydW5zLCBzbyBhbiBhcml0eSBtaXN0YWtlIGlzIG9uZQovLyAgICAgYWJvcnQgd2l0aCBhIHJlYWRhYmxlIG1lc3NhZ2UgcmF0aGVyIHRoYW4gd2hhdGV2ZXIgdGhlIGhhbmRsZXIgZG9lcyB3aXRoCi8vICAgICB0aGUgd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy4KLy8gIDMuIFVwZ3JhZGVzIGNhbiBiZSBESUZGRUQuIEFjY2VwdCByZWZ1c2VzIGEgaGFuZGxlciB3aG9zZSBzY2hlbWEgd291bGQgZHJvcAovLyAgICAgb3IgcmVzaGFwZSBhIHZlcmIgc29tZSBleGlzdGluZyBjYWxsZXIgZGVwZW5kcyBvbiwgd2hpY2ggbm8gYW1vdW50IG9mIEdvCi8vICAgICBpbnRlcmZhY2Ugc2F0aXNmYWN0aW9uIGNhbiBjYXRjaDogYSBoYW5kbGVyIGlzIGZyZWUgdG8gc2F0aXNmeSBIYW5kbGVyCi8vICAgICBhbmQgYW5zd2VyIG5vdGhpbmcuCi8vCi8vIFRoZSBwcmljZSBpcyB0aGUgdHlwZSBzeXN0ZW0uIEFyZ3VtZW50cyBhcmUgc3RyaW5ncyBhIGNhbGxlciBlbmNvZGVzLCBhbmQgYQovLyBtaXNzcGVsbGVkIHZlcmIgaXMgYW4gYWJvcnQgYXQgcnVudGltZSByYXRoZXIgdGhhbiBhIGNvbXBpbGUgZXJyb3IuIFBhdHRlcm4gRgovLyBpcyB0aGUgb3RoZXIgc2lkZSBvZiB0aGF0IHRyYWRlIGFuZCBib3RoIHNoaXAgaGVyZSBvbiBwdXJwb3NlLgovLwovLyBTdGF0ZSBpcyBkZWxpYmVyYXRlbHkgb3V0IG9mIHNjb3BlLiBUaGVzZSBoYW5kbGVycyBhcmUgcHVyZTsgd2hlcmUgYW4KLy8gYXBwbGljYXRpb24ncyBkYXRhIHNob3VsZCBsaXZlIGlzIHBhdHRlcm4gQydzIHF1ZXN0aW9uLCBhbmQgdGhlIGFuc3dlciBkb2VzCi8vIG5vdCBjaGFuZ2UgYmVjYXVzZSB0aGUgZW50cnkgcG9pbnQgYmVjYW1lIGEgc3RyaW5nLgpwYWNrYWdlIGZhY2FkZQoKaW1wb3J0ICgKCSJzdHJpbmdzIgoKCSJnbm8ubGFuZC9wL250L2F2bC92MCIKCSJnbm8ubGFuZC9wL250L293bmFibGUvdjAiCgkiZ25vLmxhbmQvcC9udC91Zm10L3YwIgopCgpjb25zdCBvd25lciBhZGRyZXNzID0gImcxbWFuZnJlZDQ3a3pkdWVjOTIwejg4d2ZyNjR5bGtzbWRjZWRsZjUiIC8vIEBtb3VsCgpjb25zdCBwcmVmaXggPSAiZ25vLmxhbmQvci9tb3VsL3gvdXBncmFkZS9zY2hlbWEvaW1wbC8iCgovLyBzZXAgaXMgdGhlIHBheWxvYWQgc2VwYXJhdG9yLiBBIHNpbmdsZSBieXRlLCBiZWNhdXNlIHRoZSBwb2ludCBoZXJlIGlzIHRoZQovLyBzaGFwZSBvZiB0aGUgYm91bmRhcnkgYW5kIG5vdCB0aGUgZW5jb2Rpbmc6IGEgcmVhbCBvbmUgd291bGQgbmVlZCBlc2NhcGluZywKLy8gYW5kIGNob29zaW5nIGl0IGlzIGEgZGVjaXNpb24gdGhpcyBwYXR0ZXJuIGRvZXMgbm90IG1ha2UgZm9yIHlvdS4KY29uc3Qgc2VwID0gInwiCgovLyBIYW5kbGVyIGlzIHRoZSB3aG9sZSBpbnRlcmZhY2UgYW4gaW1wbGVtZW50YXRpb24gc2F0aXNmaWVzLiBJdCBuZXZlciBjaGFuZ2VzLAovLyBiZWNhdXNlIGV2ZXJ5dGhpbmcgdGhhdCB3b3VsZCBoYXZlIGNoYW5nZWQgaXQgaXMgaW4gU2NoZW1hIGluc3RlYWQuCnR5cGUgSGFuZGxlciBpbnRlcmZhY2UgewoJLy8gU2NoZW1hIGRlY2xhcmVzIHRoZSBBUEksIG9uZSB2ZXJiIHBlciBsaW5lLCAibmFtZSBhcmcxIGFyZzIiLgoJU2NoZW1hKCkgc3RyaW5nCgkvLyBJbnZva2UgcnVucyBhIHZlcmIuIFRoZSBmYWNhZGUgaGFzIGFscmVhZHkgY2hlY2tlZCB0aGF0IHRoZSB2ZXJiIGV4aXN0cwoJLy8gYW5kIHRoYXQgYXJncyBoYXMgZXhhY3RseSB0aGUgZGVjbGFyZWQgYXJpdHkuCglJbnZva2UodmVyYiBzdHJpbmcsIGFyZ3MgW11zdHJpbmcpIHN0cmluZwp9Cgp0eXBlIHZlcmIgc3RydWN0IHsKCW5hbWUgICBzdHJpbmcKCXBhcmFtcyBbXXN0cmluZwp9Cgp2YXIgKAoJT3duYWJsZSA9IG93bmFibGUuTmV3V2l0aEFkZHJlc3Mob3duZXIpCgoJY2FuZGlkYXRlcyA9IGF2bC5OZXdUcmVlKCkgLy8gcGtncGF0aCAtPiBIYW5kbGVyCglsaXZlICAgICAgIEhhbmRsZXIKCWxpdmVQYXRoICAgc3RyaW5nCglsaXZlVmVyYnMgID0gYXZsLk5ld1RyZWUoKSAvLyB2ZXJiIG5hbWUgLT4gKnZlcmIsIGZvciBsb29rdXAKCWxpdmVPcmRlciAgW11zdHJpbmcgICAgICAgIC8vIHRoZSBzYW1lIHZlcmJzIGluIERFQ0xBUkFUSU9OIG9yZGVyLCBmb3IgbGlzdGluZwopCgovLyBQcm9wb3NlIG5vbWluYXRlcyB0aGUgY2FsbGluZyByZWFsbSwgZXhhY3RseSBhcyBpbiBwYXR0ZXJuIEYuIEl0cyBzY2hlbWEgaXMKLy8gcGFyc2VkIGhlcmUgc28gYSBtYWxmb3JtZWQgb25lIGlzIHJlamVjdGVkIGF0IHByb3Bvc2FsIHJhdGhlciB0aGFuIGF0IGFjY2VwdC4KZnVuYyBQcm9wb3NlKGN1ciByZWFsbSwgaCBIYW5kbGVyKSB7CgljYWxsZXIgOj0gY3VyLlByZXZpb3VzKCkuUGtnUGF0aCgpCglpZiAhc3RyaW5ncy5IYXNQcmVmaXgoY2FsbGVyLCBwcmVmaXgpIHsKCQlwYW5pYygidW5hdXRob3JpemVkOiAiICsgY2FsbGVyICsgIiBpcyBub3QgdW5kZXIgIiArIHByZWZpeCkKCX0KCWlmIGggPT0gbmlsIHsKCQlwYW5pYygiaGFuZGxlciBtdXN0IG5vdCBiZSBuaWwiKQoJfQoJcGFyc2VTY2hlbWEoaC5TY2hlbWEoKSkgLy8gcGFuaWNzIGlmIG1hbGZvcm1lZAoJY2FuZGlkYXRlcy5TZXQoY2FsbGVyLCBoKQp9CgovLyBBY2NlcHQgcHJvbW90ZXMgYSBjYW5kaWRhdGUsIGFuZCByZWZ1c2VzIG9uZSB0aGF0IHdvdWxkIGJyZWFrIGFuIGV4aXN0aW5nCi8vIGNhbGxlci4gVGhpcyBpcyB0aGUgY2hlY2sgYSBHbyBpbnRlcmZhY2UgY2Fubm90IGV4cHJlc3MuCmZ1bmMgQWNjZXB0KGN1ciByZWFsbSwgcGtnUGF0aCBzdHJpbmcpIHsKCWgsIG5leHQsIG9yZGVyIDo9IHJlc29sdmUoY3VyLCBwa2dQYXRoKQoJYXNzZXJ0Tm9SZWdyZXNzaW9uKG5leHQpCglsaXZlLCBsaXZlUGF0aCwgbGl2ZVZlcmJzLCBsaXZlT3JkZXIgPSBoLCBwa2dQYXRoLCBuZXh0LCBvcmRlcgp9CgovLyBBY2NlcHRCcmVha2luZyBwcm9tb3RlcyBhIGNhbmRpZGF0ZSB0aGF0IEFjY2VwdCByZWZ1c2VzLgovLwovLyBJdCBleGlzdHMgYmVjYXVzZSB0aGUgZGlmZiBpcyBTWU1NRVRSSUMsIHdoaWNoIGlzIG5vdCBvYnZpb3VzIHVudGlsIGl0IGJpdGVzOgovLyBvbmNlIHYxIGhhcyBhZGRlZCBhIHZlcmIsIHJvbGxpbmcgYmFjayB0byB2MCBkcm9wcyB0aGF0IHZlcmIgYW5kIGlzIGEKLy8gcmVncmVzc2lvbiBieSBleGFjdGx5IHRoZSBzYW1lIHJ1bGUgdGhhdCBwcm90ZWN0cyBjYWxsZXJzIGdvaW5nIGZvcndhcmQuIEEKLy8gcGF0dGVybiB0aGF0IGNhbiBvbmx5IG1vdmUgZm9yd2FyZCBpcyB3b3JzZSB0aGFuIG9uZSB3aXRoIG5vIGRpZmYgYXQgYWxsLCBzbwovLyB0aGUgZXNjYXBlIGhhdGNoIGlzIHJlcXVpcmVkLCBhbmQgbWFraW5nIGl0IGEgc2VwYXJhdGUgZnVuY3Rpb24gaXMgdGhlIHBvaW50OgovLyB0aGUgb3duZXIgaGFzIHRvIHR5cGUgYSBkaWZmZXJlbnQgd29yZCwgYW5kIHRoZSBhdWRpdCBsb2cgc2hvd3Mgd2hpY2ggb25lLgovLwovLyBVc2UgaXQgdG8gcm9sbCBiYWNrLCBhbmQgdG8gcmV0aXJlIGEgdmVyYiBub2JvZHkgY2FsbHMgYW55IG1vcmUuIE5vdCB0byBtYWtlCi8vIGFuIHVwZ3JhZGUgZ28gdGhyb3VnaC4KZnVuYyBBY2NlcHRCcmVha2luZyhjdXIgcmVhbG0sIHBrZ1BhdGggc3RyaW5nKSB7CgloLCBuZXh0LCBvcmRlciA6PSByZXNvbHZlKGN1ciwgcGtnUGF0aCkKCWxpdmUsIGxpdmVQYXRoLCBsaXZlVmVyYnMsIGxpdmVPcmRlciA9IGgsIHBrZ1BhdGgsIG5leHQsIG9yZGVyCn0KCi8vIHJlc29sdmUgaXMgdGhlIG93bmVyIGNoZWNrIGFuZCB0aGUgbG9va3VwIGJvdGggYWNjZXB0cyBzaGFyZS4KZnVuYyByZXNvbHZlKGN1ciByZWFsbSwgcGtnUGF0aCBzdHJpbmcpIChIYW5kbGVyLCAqYXZsLlRyZWUsIFtdc3RyaW5nKSB7CglPd25hYmxlLkFzc2VydE93bmVkQnkoY3VyLlByZXZpb3VzKCkuQWRkcmVzcygpKQoJdiA6PSBjYW5kaWRhdGVzLkdldChwa2dQYXRoKQoJaWYgdiA9PSBuaWwgewoJCXBhbmljKCJubyBjYW5kaWRhdGUgYXQgIiArIHBrZ1BhdGgpCgl9CgloIDo9IHYuKEhhbmRsZXIpCgl0LCBvcmRlciA6PSBwYXJzZVNjaGVtYShoLlNjaGVtYSgpKQoJcmV0dXJuIGgsIHQsIG9yZGVyCn0KCi8vIGFzc2VydE5vUmVncmVzc2lvbiBpcyB0aGUgdXBncmFkZSBkaWZmLiBBIG5ldyBzY2hlbWEgbWF5IEFERCB2ZXJicyBhbmQgbWF5IG5vdAovLyByZW1vdmUgb25lIG9yIGNoYW5nZSBpdHMgYXJpdHksIGJlY2F1c2UgYSBjYWxsZXIgY29tcGlsZWQgYWdhaW5zdCB0aGUgb2xkIG9uZQovLyBpcyBzdGlsbCBvdXQgdGhlcmUgY2FsbGluZyBpdC4KZnVuYyBhc3NlcnROb1JlZ3Jlc3Npb24obmV4dCAqYXZsLlRyZWUpIHsKCS8vIFdhbGsgaW4gREVDTEFSQVRJT04gb3JkZXIsIG5vdCBhdmwgb3JkZXIsIHNvIHRoZSB2ZXJiIG5hbWVkIGluIHRoZSBhYm9ydAoJLy8gaXMgdGhlIGZpcnN0IG9uZSBhIHJlYWRlciBvZiB0aGUgbGl2ZSBzY2hlbWEgd291bGQgcmVhY2guIEl0ZXJhdGluZyB0aGUKCS8vIHRyZWUgcmVwb3J0cyB3aGljaGV2ZXIgdmlvbGF0aW9uIGhhcHBlbnMgdG8gc29ydCBmaXJzdCwgd2hpY2ggbWFrZXMgdGhlCgkvLyBtZXNzYWdlIGRlcGVuZCBvbiBhIHZlcmIncyBzcGVsbGluZy4KCWZvciBfLCBuYW1lIDo9IHJhbmdlIGxpdmVPcmRlciB7CgkJb2xkIDo9IGxpdmVWZXJicy5HZXQobmFtZSkuKCp2ZXJiKQoJCW4gOj0gbmV4dC5HZXQobmFtZSkKCQlpZiBuID09IG5pbCB7CgkJCXBhbmljKCJzY2hlbWEgcmVncmVzc2lvbjogdGhlIGNhbmRpZGF0ZSBkcm9wcyB2ZXJiICIgKyBuYW1lICsgIiwgd2hpY2ggYW4gZXhpc3RpbmcgY2FsbGVyIG1heSBzdGlsbCBjYWxsOyBBY2NlcHRCcmVha2luZyBvdmVycmlkZXMiKQoJCX0KCQlpZiBsZW4obi4oKnZlcmIpLnBhcmFtcykgIT0gbGVuKG9sZC5wYXJhbXMpIHsKCQkJcGFuaWMoInNjaGVtYSByZWdyZXNzaW9uOiB0aGUgY2FuZGlkYXRlIGNoYW5nZXMgdGhlIGFyaXR5IG9mIHZlcmIgIiArIG5hbWUgKyAiOyBBY2NlcHRCcmVha2luZyBvdmVycmlkZXMiKQoJCX0KCX0KfQoKLy8gQ2FsbCBpcyB0aGUgb25lIHNpZ25hdHVyZSB0aGlzIHJlYWxtIGlzIGNvbW1pdHRlZCB0byBmb3JldmVyLgpmdW5jIENhbGwoY3VyIHJlYWxtLCB2ZXJiTmFtZSwgcGF5bG9hZCBzdHJpbmcpIHN0cmluZyB7Cglhc3NlcnRMaXZlKCkKCXYgOj0gbGl2ZVZlcmJzLkdldCh2ZXJiTmFtZSkKCWlmIHYgPT0gbmlsIHsKCQlwYW5pYygidW5rbm93biB2ZXJiICIgKyB2ZXJiTmFtZSArICIsIGtub3duOiAiICsgc3RyaW5ncy5Kb2luKFZlcmJzKCksICIsICIpKQoJfQoJc3BlYyA6PSB2LigqdmVyYikKCWFyZ3MgOj0gW11zdHJpbmd7fQoJaWYgcGF5bG9hZCAhPSAiIiB7CgkJYXJncyA9IHN0cmluZ3MuU3BsaXQocGF5bG9hZCwgc2VwKQoJfQoJaWYgbGVuKGFyZ3MpICE9IGxlbihzcGVjLnBhcmFtcykgewoJCXBhbmljKHVmbXQuU3ByaW50ZigidmVyYiAlcyB0YWtlcyAlZCBhcmd1bWVudChzKSwgZ290ICVkLCBzaWduYXR1cmUgaXMgJXMiLAoJCQl2ZXJiTmFtZSwgbGVuKHNwZWMucGFyYW1zKSwgbGVuKGFyZ3MpLCBTaWduYXR1cmUodmVyYk5hbWUpKSkKCX0KCXJldHVybiBsaXZlLkludm9rZSh2ZXJiTmFtZSwgYXJncykKfQoKLy8gVmVyYnMgbGlzdHMgdGhlIGFjY2VwdGVkIEFQSSBpbiBERUNMQVJBVElPTiBvcmRlciwgd2hpY2ggaXMgdGhlIG9yZGVyIHRoZQovLyBoYW5kbGVyIHdyb3RlIGl0IGluIGFuZCB0aGUgb3JkZXIgYSByZWFkZXIgb2YgdGhlIHNjaGVtYSBleHBlY3RzLiBJdGVyYXRpbmcKLy8gdGhlIGF2bCB0cmVlIGluc3RlYWQgd291bGQgbGlzdCB0aGVtIGFscGhhYmV0aWNhbGx5LCBzaWxlbnRseTogY2F1Z2h0IGJ5IGEKLy8gdGVzdCwgbm90IGJ5IGEgY29tcGlsZXIuCmZ1bmMgVmVyYnMoKSBbXXN0cmluZyB7CglyZXR1cm4gbGl2ZU9yZGVyCn0KCi8vIFNpZ25hdHVyZSBpcyBvbmUgdmVyYidzIHNoYXBlLCBhcyBhIGNhbGxlciB3b3VsZCB3cml0ZSBpdC4KZnVuYyBTaWduYXR1cmUobmFtZSBzdHJpbmcpIHN0cmluZyB7Cgl2IDo9IGxpdmVWZXJicy5HZXQobmFtZSkKCWlmIHYgPT0gbmlsIHsKCQlyZXR1cm4gIiIKCX0KCXJldHVybiBuYW1lICsgIigiICsgc3RyaW5ncy5Kb2luKHYuKCp2ZXJiKS5wYXJhbXMsICIsICIpICsgIikiCn0KCi8vIFNjaGVtYVRleHQgaXMgdGhlIHdob2xlIGFjY2VwdGVkIEFQSSBpbiB0aGUgZGVjbGFyYXRpb24gZm9ybWF0LCBzbyBhIGNsaWVudAovLyBjYW4gcmVhZCBiYWNrIGV4YWN0bHkgd2hhdCB0aGUgaGFuZGxlciBkZWNsYXJlZC4KZnVuYyBTY2hlbWFUZXh0KCkgc3RyaW5nIHsKCW91dCA6PSAiIgoJZm9yIF8sIG4gOj0gcmFuZ2UgVmVyYnMoKSB7CgkJdiA6PSBsaXZlVmVyYnMuR2V0KG4pLigqdmVyYikKCQlvdXQgKz0gbgoJCWZvciBfLCBwIDo9IHJhbmdlIHYucGFyYW1zIHsKCQkJb3V0ICs9ICIgIiArIHAKCQl9CgkJb3V0ICs9ICJcbiIKCX0KCXJldHVybiBvdXQKfQoKLy8gTGl2ZSBpcyB0aGUgcGFja2FnZSBwYXRoIGN1cnJlbnRseSBzZXJ2aW5nLCBvciAiIiBiZWZvcmUgdGhlIGZpcnN0IEFjY2VwdC4KZnVuYyBMaXZlKCkgc3RyaW5nIHsKCXJldHVybiBsaXZlUGF0aAp9CgovLyBDYW5kaWRhdGVzIGxpc3RzIGV2ZXJ5IHBhdGggdGhhdCBoYXMgbm9taW5hdGVkIGl0c2VsZiwgaW4gb3JkZXIuCmZ1bmMgQ2FuZGlkYXRlcygpIFtdc3RyaW5nIHsKCW91dCA6PSBbXXN0cmluZ3t9CgljYW5kaWRhdGVzLkl0ZXJhdGUoIiIsICIiLCBmdW5jKGsgc3RyaW5nLCBfIGFueSkgYm9vbCB7CgkJb3V0ID0gYXBwZW5kKG91dCwgaykKCQlyZXR1cm4gZmFsc2UKCX0pCglyZXR1cm4gb3V0Cn0KCmZ1bmMgYXNzZXJ0TGl2ZSgpIHsKCWlmIGxpdmUgPT0gbmlsIHsKCQlwYW5pYygibm8gaGFuZGxlciBhY2NlcHRlZCIpCgl9Cn0KCi8vIHBhcnNlU2NoZW1hIHR1cm5zIHRoZSBkZWNsYXJhdGlvbiB0ZXh0IGludG8gdmVyYnMsIGFuZCBpcyB0aGUgb25seSB2YWxpZGF0aW9uCi8vIG9mIGEgbmFtZSB0aGF0IFJlbmRlciBsYXRlciBlY2hvZXMuCmZ1bmMgcGFyc2VTY2hlbWEodGV4dCBzdHJpbmcpICgqYXZsLlRyZWUsIFtdc3RyaW5nKSB7Cgl0IDo9IGF2bC5OZXdUcmVlKCkKCW9yZGVyIDo9IFtdc3RyaW5ne30KCWZvciBfLCBsaW5lIDo9IHJhbmdlIHN0cmluZ3MuU3BsaXQodGV4dCwgIlxuIikgewoJCWxpbmUgPSBzdHJpbmdzLlRyaW1TcGFjZShsaW5lKQoJCWlmIGxpbmUgPT0gIiIgewoJCQljb250aW51ZQoJCX0KCQlmaWVsZHMgOj0gc3RyaW5ncy5TcGxpdChsaW5lLCAiICIpCgkJbmFtZSA6PSBmaWVsZHNbMF0KCQlhc3NlcnRJZGVudChuYW1lKQoJCXBhcmFtcyA6PSBbXXN0cmluZ3t9CgkJZm9yIF8sIGYgOj0gcmFuZ2UgZmllbGRzWzE6XSB7CgkJCWlmIGYgPT0gIiIgewoJCQkJY29udGludWUKCQkJfQoJCQlhc3NlcnRJZGVudChmKQoJCQlwYXJhbXMgPSBhcHBlbmQocGFyYW1zLCBmKQoJCX0KCQlpZiB0LkdldChuYW1lKSAhPSBuaWwgewoJCQlwYW5pYygibWFsZm9ybWVkIHNjaGVtYTogdmVyYiAiICsgbmFtZSArICIgZGVjbGFyZWQgdHdpY2UiKQoJCX0KCQl0LlNldChuYW1lLCAmdmVyYntuYW1lOiBuYW1lLCBwYXJhbXM6IHBhcmFtc30pCgkJb3JkZXIgPSBhcHBlbmQob3JkZXIsIG5hbWUpCgl9CglpZiB0LlNpemUoKSA9PSAwIHsKCQlwYW5pYygibWFsZm9ybWVkIHNjaGVtYTogbm8gdmVyYnMgZGVjbGFyZWQiKQoJfQoJcmV0dXJuIHQsIG9yZGVyCn0KCmZ1bmMgYXNzZXJ0SWRlbnQocyBzdHJpbmcpIHsKCWlmIHMgPT0gIiIgewoJCXBhbmljKCJtYWxmb3JtZWQgc2NoZW1hOiBlbXB0eSBuYW1lIikKCX0KCWZvciBfLCBjIDo9IHJhbmdlIHMgewoJCWlmICEoYyA+PSAnYScgJiYgYyA8PSAneicpICYmICEoYyA+PSAnMCcgJiYgYyA8PSAnOScpICYmIGMgIT0gJ18nIHsKCQkJcGFuaWMoIm1hbGZvcm1lZCBzY2hlbWE6ICIgKyBzICsgIiBpcyBub3QgW2EtejAtOV9dIikKCQl9Cgl9Cn0KCmZ1bmMgUmVuZGVyKF8gc3RyaW5nKSBzdHJpbmcgewoJaWYgbGl2ZSA9PSBuaWwgewoJCXJldHVybiB1Zm10LlNwcmludGYoInNjaGVtYS9mYWNhZGUvdjA6IG5vIGhhbmRsZXIgYWNjZXB0ZWQgKCVkIGNhbmRpZGF0ZShzKSlcbiIsIGNhbmRpZGF0ZXMuU2l6ZSgpKQoJfQoJb3V0IDo9IHVmbXQuU3ByaW50Zigic2NoZW1hL2ZhY2FkZS92MDogJXNcbiIsIGxpdmVQYXRoKQoJZm9yIF8sIG4gOj0gcmFuZ2UgVmVyYnMoKSB7CgkJb3V0ICs9ICItICIgKyBTaWduYXR1cmUobikgKyAiXG4iCgl9CglyZXR1cm4gb3V0Cn0KGqUBCgtnbm9tb2QudG9tbBKVAW1vZHVsZSA9ICJnbm8ubGFuZC9yL21vdWwveC91cGdyYWRlL3NjaGVtYS9mYWNhZGUvdjAiCmdubyA9ICIwLjkiCiMgcHVibGljOiBldmVyeSBpbXBsZW1lbnRhdGlvbiByZWFsbSBpbXBvcnRzIGl0IHRvIGRlY2xhcmUgaXRzIHNjaGVtYSBhbmQgcmVnaXN0ZXIKGq0CChdyZW5kZXJfZXhhbXBsZV90ZXN0LmdubxKRAnBhY2thZ2UgZmFjYWRlCgovLyBFeGFtcGxlUmVuZGVyIHBpbnMgdGhlIGZhY2FkZSBiZWZvcmUgYW55IGhhbmRsZXIgcmVhbG0gZXhpc3RzLiBOb3RoaW5nIGlzCi8vIGltcG9ydGVkIGhlcmUsIHNvIHRoZXJlIGlzIG5vIGNhbmRpZGF0ZSBhbmQgbm90aGluZyBhY2NlcHRlZC4KZnVuYyBFeGFtcGxlUmVuZGVyKCkgewoJcHJpbnQoUmVuZGVyKCIiKSkKCS8vIE91dHB1dDoKCS8vIHNjaGVtYS9mYWNhZGUvdjA6IG5vIGhhbmRsZXIgYWNjZXB0ZWQgKDAgY2FuZGlkYXRlKHMpKQp9CiIMNTAwMDAwMHVnbm90EhQI4I241wISDDEwODAzNjN1Z25vdBqoAQo6ChMvdG0uUHViS2V5U2VjcDI1NmsxEiMKIQIAUko/jSwAOonEP0X+r2647UW246Nfe75rO0n/ni2DyBJAWqz+ok4qfi1dQ7aSqMX5pC0XZWqDfcTzJdeqtYO9vrsNQ0a7BRUfyUtjEs55tTNCYPDVdToFjsUanx85l9EbQxooZzFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFsdXV4ZQ==

Raw transaction data

Raw JSON data