Transaction executed successfully

Transaction Details

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

Transaction hash
5A5CA0047AB43BF3AF605CC08DB43F667DADDF0AC50C3E21D042097A53608A58

Transaction overview

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

Execution summary

TX INDEX
1
Position in block
GAS WANTED
110,000,000
Requested gas limit
GAS USED
67,724,515
Gas consumed
FEE
220000ugnot
Transaction fee

Participants

Sender
Package / Realm
Not available
Memo
None

Message

Message #1
m_addpkg
Caller
Arguments
g136j0m08pkm2lwwde9dmlx8uee26llent9s5cpf28000000ugnot

Execution log

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

Events

No events emitted by this transaction.

Raw encoded transaction

CuP8AgoML3ZtLm1fYWRkcGtnEtH8AgooZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZhKU/AIKCW1lbWJhX2RhbxIcZ25vLmxhbmQvci9zYW1jcmV3L21lbWJhX2Rhbxr3MgoUYXBwc3RvcmVfYWRhcHRlci5nbm8S3jJwYWNrYWdlIG1lbWJhX2RhbwppbXBvcnQoInN0cmluZ3MiOyJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfaG9zdCI7Imduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9hcHBzdG9yZV92MyIpCmZ1bmMgYXBwc3RvcmVTdGF0ZShhIG1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVBY3Rpb24pbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZVN0YXRlewogb3duZXI6PW1lbWJhX2FwcHN0b3JlX3YzLkdldE93bmVyKCk7czo9bWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZVN0YXRle093bmVyOm93bmVyLFBlbmRpbmdPd25lcjptZW1iYV9hcHBzdG9yZV92My5HZXRQZW5kaW5nT3duZXIoKSxUcmVhc3VyeTptZW1iYV9hcHBzdG9yZV92My5HZXRUcmVhc3VyeSgpLEZlZTptZW1iYV9hcHBzdG9yZV92My5HZXRSZWdpc3RyYXRpb25GZWUoKSxQYXVzZWQ6bWVtYmFfYXBwc3RvcmVfdjMuSXNQYXVzZWQoKSxTZWFsZWQ6bWVtYmFfYXBwc3RvcmVfdjMuSXNTZWVkaW5nU2VhbGVkKCksT3duZXJDdXJhdG9yOm1lbWJhX2FwcHN0b3JlX3YzLklzQ3VyYXRvcihzdHJpbmcob3duZXIpKSxEQU9DdXJhdG9yOm1lbWJhX2FwcHN0b3JlX3YzLklzQ3VyYXRvcihzdHJpbmcoYXBwc3RvcmVQb2xpY3kuREFPKCkpKSxTdWNjZXNzb3JDdXJhdG9yOm1lbWJhX2FwcHN0b3JlX3YzLklzQ3VyYXRvcihzdHJpbmcoYXBwc3RvcmVQb2xpY3kuU3VjY2Vzc29yKCkpKX0KIGlmIGEuS2luZCgpPT1tZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlQWRkQ3VyYXRvcnx8YS5LaW5kKCk9PW1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVSZW1vdmVDdXJhdG9ye3MuU3ViamVjdEN1cmF0b3I9bWVtYmFfYXBwc3RvcmVfdjMuSXNDdXJhdG9yKHN0cmluZyhhLlJlY2lwaWVudCgpKSl9CiBpZiBhLklzTGlzdGluZygpe2w6PW1lbWJhX2FwcHN0b3JlX3YzLkdldEdvdmVybmFuY2VMaXN0aW5nKGEuUGF0aCgpLGEuS2luZCgpPT1tZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlQ2xlYXJGbGFncyk7cy5MaXN0aW5nPW1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVMaXN0aW5ne0V4aXN0czpsLkV4aXN0cyxDb250ZW50SGFzaDpsLkNvbnRlbnRIYXNoLFN0YXR1czpsLlN0YXR1cyxSZWFzb246bC5SZWFzb24sQ3JlZGl0OmwuQ3JlZGl0LEZsYWdzOmwuRmxhZ3MsQ2xlYXJLZXlzOmwuQ2xlYXJLZXlzfX0KIHJldHVybiBzCn0KZnVuYyBwcm9wb3NlQXBwc3RvcmUoY3VyIHJlYWxtLGEgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZUFjdGlvbil1aW50NjR7cmV0dXJuIGhvc3QuUHJvcG9zZUFwcHN0b3JlKGEsYXBwc3RvcmVTdGF0ZShhKSxjdXIpfQpmdW5jIFByb3Bvc2VBcHBzdG9yZUFjY2VwdChjdXIgcmVhbG0pdWludDY0e3JldHVybiBwcm9wb3NlQXBwc3RvcmUoY3VyLGFwcHN0b3JlUG9saWN5LkFjY2VwdCgpKX0KZnVuYyBQcm9wb3NlQXBwc3RvcmVSZXR1cm4oY3VyIHJlYWxtKXVpbnQ2NHtyZXR1cm4gcHJvcG9zZUFwcHN0b3JlKGN1cixhcHBzdG9yZVBvbGljeS5SZXR1cm4oKSl9CmZ1bmMgUHJvcG9zZUFwcHN0b3JlQWJvcnRSZXR1cm4oY3VyIHJlYWxtKXVpbnQ2NHtyZXR1cm4gcHJvcG9zZUFwcHN0b3JlKGN1cixhcHBzdG9yZVBvbGljeS5BYm9ydFJldHVybigpKX0KZnVuYyBQcm9wb3NlQXBwc3RvcmVUcmVhc3VyeShjdXIgcmVhbG0pdWludDY0e3JldHVybiBwcm9wb3NlQXBwc3RvcmUoY3VyLGFwcHN0b3JlUG9saWN5LlNldFRyZWFzdXJ5KCkpfQpmdW5jIFByb3Bvc2VBcHBzdG9yZUZlZShjdXIgcmVhbG0sZmVlIGludDY0KXVpbnQ2NHtyZXR1cm4gcHJvcG9zZUFwcHN0b3JlKGN1cixtZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlUmVnaXN0cmF0aW9uRmVlKGZlZSkpfQpmdW5jIFByb3Bvc2VBcHBzdG9yZUN1cmF0b3IoY3VyIHJlYWxtLHdobyBhZGRyZXNzLGdyYW50IGJvb2wpdWludDY0e3JldHVybiBwcm9wb3NlQXBwc3RvcmUoY3VyLG1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVDdXJhdG9yKHdobyxncmFudCkpfQpmdW5jIFByb3Bvc2VBcHBzdG9yZVVucGF1c2UoY3VyIHJlYWxtKXVpbnQ2NHtyZXR1cm4gcHJvcG9zZUFwcHN0b3JlKGN1cixtZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlUmVzdW1lKCkpfQpmdW5jIFByb3Bvc2VBcHBzdG9yZVNlYWwoY3VyIHJlYWxtKXVpbnQ2NHtyZXR1cm4gcHJvcG9zZUFwcHN0b3JlKGN1cixtZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlU2VhbEltcG9ydCgpKX0KZnVuYyBQcm9wb3NlQXBwc3RvcmVBcHByb3ZlKGN1ciByZWFsbSxwYXRoIHN0cmluZyl1aW50NjR7cmV0dXJuIHByb3Bvc2VBcHBzdG9yZShjdXIsbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZU1vZGVyYXRpb24obWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZUFwcHJvdmUscGF0aCwiIikpfQpmdW5jIFByb3Bvc2VBcHBzdG9yZVJlamVjdChjdXIgcmVhbG0scGF0aCxyZWFzb24gc3RyaW5nKXVpbnQ2NHtyZXR1cm4gcHJvcG9zZUFwcHN0b3JlKGN1cixtZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlTW9kZXJhdGlvbihtZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlUmVqZWN0LHBhdGgscmVhc29uKSl9CmZ1bmMgUHJvcG9zZUFwcHN0b3JlRGVsaXN0KGN1ciByZWFsbSxwYXRoIHN0cmluZyl1aW50NjR7cmV0dXJuIHByb3Bvc2VBcHBzdG9yZShjdXIsbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZU1vZGVyYXRpb24obWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZURlbGlzdCxwYXRoLCIiKSl9CmZ1bmMgUHJvcG9zZUFwcHN0b3JlUmVzdG9yZShjdXIgcmVhbG0scGF0aCBzdHJpbmcpdWludDY0e3JldHVybiBwcm9wb3NlQXBwc3RvcmUoY3VyLG1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVNb2RlcmF0aW9uKG1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVSZXN0b3JlLHBhdGgsIiIpKX0KZnVuYyBQcm9wb3NlQXBwc3RvcmVDbGVhckZsYWdzKGN1ciByZWFsbSxwYXRoIHN0cmluZyl1aW50NjR7cmV0dXJuIHByb3Bvc2VBcHBzdG9yZShjdXIsbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZU1vZGVyYXRpb24obWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZUNsZWFyRmxhZ3MscGF0aCwiIikpfQpmdW5jIEVtZXJnZW5jeVBhdXNlQXBwc3RvcmUoY3VyIHJlYWxtKXthOj1tZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlUmVzdW1lKCk7YmVmb3JlOj1hcHBzdG9yZVN0YXRlKGEpO2hvc3QuUHJlcGFyZUFwcHN0b3JlRW1lcmdlbmN5UGF1c2UoYmVmb3JlLGN1cik7ZXhwZWN0ZWQ6PWJlZm9yZTtleHBlY3RlZC5QYXVzZWQ9dHJ1ZTttZW1iYV9hcHBzdG9yZV92My5QYXVzZShjcm9zcyhjdXIpLHRydWUpO2lmIGFwcHN0b3JlU3RhdGUoYSkhPWV4cGVjdGVke3BhbmljKCJhcHBzdG9yZSBwYXVzZSBwb3N0Y29uZGl0aW9uIG1pc21hdGNoIil9fQpmdW5jIGV4ZWN1dGVBcHBzdG9yZShjdXIgcmVhbG0saWQgdWludDY0KXsKIHByb3Bvc2VkOj1ob3N0LlByb3Bvc2FsKGlkKS5BcHBzdG9yZUFjdGlvbjtiZWZvcmU6PWFwcHN0b3JlU3RhdGUocHJvcG9zZWQpO2E6PWhvc3QuQ29uc3VtZUFwcHN0b3JlKGlkLGJlZm9yZSxjdXIpO2V4cGVjdGVkOj1iZWZvcmUKIHN3aXRjaCBhLktpbmQoKXsKIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZUFjY2VwdDoKICBleHBlY3RlZC5Pd25lcj1hcHBzdG9yZVBvbGljeS5EQU8oKTtleHBlY3RlZC5QZW5kaW5nT3duZXI9IiI7ZXhwZWN0ZWQuT3duZXJDdXJhdG9yPXRydWU7ZXhwZWN0ZWQuREFPQ3VyYXRvcj10cnVlO2lmIGJlZm9yZS5Pd25lcj09YXBwc3RvcmVQb2xpY3kuU3VjY2Vzc29yKCl7ZXhwZWN0ZWQuU3VjY2Vzc29yQ3VyYXRvcj1mYWxzZX07bWVtYmFfYXBwc3RvcmVfdjMuQWNjZXB0T3duZXJzaGlwKGNyb3NzKGN1cikpCiBjYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVSZXR1cm46ZXhwZWN0ZWQuUGVuZGluZ093bmVyPWEuUmVjaXBpZW50KCk7bWVtYmFfYXBwc3RvcmVfdjMuVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSxhLlJlY2lwaWVudCgpKQogY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlQWJvcnRSZXR1cm46ZXhwZWN0ZWQuUGVuZGluZ093bmVyPSIiO21lbWJhX2FwcHN0b3JlX3YzLkNhbmNlbE93bmVyc2hpcFRyYW5zZmVyKGNyb3NzKGN1cikpCiBjYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVGZWU6ZXhwZWN0ZWQuRmVlPWEuRmVlKCk7bWVtYmFfYXBwc3RvcmVfdjMuU2V0UmVnaXN0cmF0aW9uRmVlKGNyb3NzKGN1ciksYS5GZWUoKSkKIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZVRyZWFzdXJ5OmV4cGVjdGVkLlRyZWFzdXJ5PWEuUmVjaXBpZW50KCk7bWVtYmFfYXBwc3RvcmVfdjMuU2V0VHJlYXN1cnkoY3Jvc3MoY3VyKSxhLlJlY2lwaWVudCgpKQogY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlVW5wYXVzZTpleHBlY3RlZC5QYXVzZWQ9ZmFsc2U7bWVtYmFfYXBwc3RvcmVfdjMuUGF1c2UoY3Jvc3MoY3VyKSxmYWxzZSkKIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZVNlYWw6ZXhwZWN0ZWQuU2VhbGVkPXRydWU7bWVtYmFfYXBwc3RvcmVfdjMuRmluYWxpemVTZWVkKGNyb3NzKGN1cikpCiBjYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVBZGRDdXJhdG9yLG1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVSZW1vdmVDdXJhdG9yOgogIGdyYW50Oj1hLktpbmQoKT09bWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZUFkZEN1cmF0b3I7ZXhwZWN0ZWQuU3ViamVjdEN1cmF0b3I9Z3JhbnQ7aWYgYS5SZWNpcGllbnQoKT09YmVmb3JlLk93bmVye2V4cGVjdGVkLk93bmVyQ3VyYXRvcj1ncmFudH07aWYgYS5SZWNpcGllbnQoKT09YXBwc3RvcmVQb2xpY3kuREFPKCl7ZXhwZWN0ZWQuREFPQ3VyYXRvcj1ncmFudH07aWYgYS5SZWNpcGllbnQoKT09YXBwc3RvcmVQb2xpY3kuU3VjY2Vzc29yKCl7ZXhwZWN0ZWQuU3VjY2Vzc29yQ3VyYXRvcj1ncmFudH07aWYgZ3JhbnR7bWVtYmFfYXBwc3RvcmVfdjMuQWRkQ3VyYXRvcihjcm9zcyhjdXIpLGEuUmVjaXBpZW50KCkpfWVsc2V7bWVtYmFfYXBwc3RvcmVfdjMuUmVtb3ZlQ3VyYXRvcihjcm9zcyhjdXIpLGEuUmVjaXBpZW50KCkpfQogY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlQXBwcm92ZTpleHBlY3RlZC5MaXN0aW5nLlN0YXR1cz0ibGl2ZSI7bWVtYmFfYXBwc3RvcmVfdjMuQXBwcm92ZUFwcChjcm9zcyhjdXIpLGEuUGF0aCgpKQogY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkFwcHN0b3JlUmVqZWN0OmV4cGVjdGVkLkxpc3RpbmcuU3RhdHVzPSJyZWplY3RlZCI7ZXhwZWN0ZWQuTGlzdGluZy5SZWFzb249YS5SZWFzb24oKTtleHBlY3RlZC5MaXN0aW5nLkNyZWRpdD10cnVlO21lbWJhX2FwcHN0b3JlX3YzLlJlamVjdEFwcChjcm9zcyhjdXIpLGEuUGF0aCgpLGEuUmVhc29uKCkpCiBjYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVEZWxpc3Q6ZXhwZWN0ZWQuTGlzdGluZy5TdGF0dXM9ImRlbGlzdGVkIjttZW1iYV9hcHBzdG9yZV92My5EZWxpc3RBcHAoY3Jvc3MoY3VyKSxhLlBhdGgoKSkKIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZVJlc3RvcmU6ZXhwZWN0ZWQuTGlzdGluZy5TdGF0dXM9InBlbmRpbmciO21lbWJhX2FwcHN0b3JlX3YzLlJlc3RvcmVBcHAoY3Jvc3MoY3VyKSxhLlBhdGgoKSkKIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZUNsZWFyRmxhZ3M6CiAga2V5czo9c3RyaW5ncy5TcGxpdChiZWZvcmUuTGlzdGluZy5DbGVhcktleXMsIiwiKTtpZiBsZW4oa2V5cyk+bWVtYmFfYXBwc3RvcmVfdjMuTWF4Q2xlYXJCYXRjaHx8bGVuKGtleXMpPmJlZm9yZS5MaXN0aW5nLkZsYWdze3BhbmljKCJpbnZhbGlkIGFwcHN0b3JlIGNsZWFyIGJhdGNoIil9O2V4cGVjdGVkLkxpc3RpbmcuRmxhZ3MtPWxlbihrZXlzKTtleHBlY3RlZC5MaXN0aW5nLkNsZWFyS2V5cz0iIgogIG1lbWJhX2FwcHN0b3JlX3YzLkNsZWFyRmxhZ3MoY3Jvc3MoY3VyKSxhLlBhdGgoKSkKICBmb3IgXyx3aG86PXJhbmdlIGtleXN7aWYgbWVtYmFfYXBwc3RvcmVfdjMuSGFzR292ZXJuYW5jZUZsYWcoYS5QYXRoKCksd2hvKXtwYW5pYygiYXBwc3RvcmUgY2xlYXIgZGVkdXBlIHBvc3Rjb25kaXRpb24gbWlzbWF0Y2giKX19CiBkZWZhdWx0OnBhbmljKCJ1bnN1cHBvcnRlZCBhcHBzdG9yZSBhY3Rpb24iKQogfQogYWZ0ZXI6PWFwcHN0b3JlU3RhdGUoYSk7aWYgYS5LaW5kKCk9PW1lbWJhX3dlaWdodGVkX2hvc3QuQXBwc3RvcmVDbGVhckZsYWdze2FmdGVyLkxpc3RpbmcuQ2xlYXJLZXlzPSIifQogaWYgYWZ0ZXIhPWV4cGVjdGVke3BhbmljKCJhcHBzdG9yZSBwb3N0Y29uZGl0aW9uIG1pc21hdGNoIil9CiBpZiBhLktpbmQoKT09bWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcHBzdG9yZUFjY2VwdCYmbWVtYmFfYXBwc3RvcmVfdjMuSXNDdXJhdG9yKHN0cmluZyhiZWZvcmUuT3duZXIpKXtwYW5pYygiYXBwc3RvcmUgcHJldmlvdXMgY3VyYXRvciByZXRhaW5lZCIpfQp9Chr9HQoSYXJjYWRlX2FkYXB0ZXIuZ25vEuYdLy8gRml4ZWQgYXJjYWRlIGRpc3BhdGNoOyBubyBzY29yZS13cml0aW5nLCBmZWUgb3IgYXJiaXRyYXJ5LWNhbGwgYXV0aG9yaXR5LgpwYWNrYWdlIG1lbWJhX2RhbwppbXBvcnQgKAogICAgImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9ob3N0IgogICAgImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9hcmNhZGVfbGVhZGVyYm9hcmRfdjEiCikKZnVuYyBhcmNhZGVTdGF0ZShhIG1lbWJhX3dlaWdodGVkX2hvc3QuQXJjYWRlQWN0aW9uKW1lbWJhX3dlaWdodGVkX2hvc3QuQXJjYWRlU3RhdGV7CiAgICBvd25lcjo9bWVtYmFfYXJjYWRlX2xlYWRlcmJvYXJkX3YxLkdldE93bmVyKCk7c3ViamVjdDo9ZmFsc2UKICAgIGlmIGEuQXR0ZXN0ZXIoKSE9IiJ7c3ViamVjdD1tZW1iYV9hcmNhZGVfbGVhZGVyYm9hcmRfdjEuSXNBdHRlc3RlcihzdHJpbmcoYS5BdHRlc3RlcigpKSl9CiAgICByZXR1cm4gbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcmNhZGVTdGF0ZXtPd25lcjpvd25lcixQZW5kaW5nT3duZXI6bWVtYmFfYXJjYWRlX2xlYWRlcmJvYXJkX3YxLkdldFBlbmRpbmdPd25lcigpLFBhdXNlZDptZW1iYV9hcmNhZGVfbGVhZGVyYm9hcmRfdjEuSXNQYXVzZWQoKSxPd25lckxpc3RlZDptZW1iYV9hcmNhZGVfbGVhZGVyYm9hcmRfdjEuSXNBdHRlc3RlcihzdHJpbmcob3duZXIpKSxEQU9MaXN0ZWQ6bWVtYmFfYXJjYWRlX2xlYWRlcmJvYXJkX3YxLklzQXR0ZXN0ZXIoc3RyaW5nKGFyY2FkZVBvbGljeS5EQU8oKSkpLFN1Y2Nlc3Nvckxpc3RlZDptZW1iYV9hcmNhZGVfbGVhZGVyYm9hcmRfdjEuSXNBdHRlc3RlcihzdHJpbmcoYXJjYWRlUG9saWN5LlN1Y2Nlc3NvcigpKSksU3ViamVjdExpc3RlZDpzdWJqZWN0fQp9CmZ1bmMgUHJvcG9zZUFyY2FkZUFjY2VwdChjdXIgcmVhbG0pdWludDY0e2E6PWFyY2FkZVBvbGljeS5BY2NlcHQoKTtyZXR1cm4gaG9zdC5Qcm9wb3NlQXJjYWRlKGEsYXJjYWRlU3RhdGUoYSksY3VyKX0KZnVuYyBQcm9wb3NlQXJjYWRlUmV0dXJuKGN1ciByZWFsbSl1aW50NjR7YTo9YXJjYWRlUG9saWN5LlJldHVybigpO3JldHVybiBob3N0LlByb3Bvc2VBcmNhZGUoYSxhcmNhZGVTdGF0ZShhKSxjdXIpfQpmdW5jIFByb3Bvc2VBcmNhZGVBYm9ydFJldHVybihjdXIgcmVhbG0pdWludDY0e2E6PWFyY2FkZVBvbGljeS5BYm9ydFJldHVybigpO3JldHVybiBob3N0LlByb3Bvc2VBcmNhZGUoYSxhcmNhZGVTdGF0ZShhKSxjdXIpfQpmdW5jIFByb3Bvc2VBcmNhZGVBZGRBdHRlc3RlcihjdXIgcmVhbG0sd2hvIGFkZHJlc3MpdWludDY0e2E6PWFyY2FkZVBvbGljeS5BZGRBdHRlc3Rlcih3aG8pO3JldHVybiBob3N0LlByb3Bvc2VBcmNhZGUoYSxhcmNhZGVTdGF0ZShhKSxjdXIpfQpmdW5jIFByb3Bvc2VBcmNhZGVSZW1vdmVBdHRlc3RlcihjdXIgcmVhbG0sd2hvIGFkZHJlc3MpdWludDY0e2E6PW1lbWJhX3dlaWdodGVkX2hvc3QuQXJjYWRlUmV2b2tlQXR0ZXN0ZXIod2hvKTtyZXR1cm4gaG9zdC5Qcm9wb3NlQXJjYWRlKGEsYXJjYWRlU3RhdGUoYSksY3VyKX0KZnVuYyBQcm9wb3NlQXJjYWRlVW5wYXVzZShjdXIgcmVhbG0pdWludDY0e2E6PW1lbWJhX3dlaWdodGVkX2hvc3QuQXJjYWRlUmVzdW1lKCk7cmV0dXJuIGhvc3QuUHJvcG9zZUFyY2FkZShhLGFyY2FkZVN0YXRlKGEpLGN1cil9CmZ1bmMgRW1lcmdlbmN5UGF1c2VBcmNhZGUoY3VyIHJlYWxtKXsKICAgIGE6PW1lbWJhX3dlaWdodGVkX2hvc3QuQXJjYWRlUmVzdW1lKCk7YmVmb3JlOj1hcmNhZGVTdGF0ZShhKTtob3N0LlByZXBhcmVBcmNhZGVFbWVyZ2VuY3lQYXVzZShiZWZvcmUsY3VyKTtleHBlY3RlZDo9YmVmb3JlO2V4cGVjdGVkLlBhdXNlZD10cnVlCiAgICBtZW1iYV9hcmNhZGVfbGVhZGVyYm9hcmRfdjEuUGF1c2UoY3Jvc3MoY3VyKSx0cnVlKQogICAgaWYgYXJjYWRlU3RhdGUoYSkhPWV4cGVjdGVke3BhbmljKCJhcmNhZGUgcGF1c2UgcG9zdGNvbmRpdGlvbiBtaXNtYXRjaCIpfQp9CmZ1bmMgZXhlY3V0ZUFyY2FkZShjdXIgcmVhbG0saWQgdWludDY0KXsKICAgIHByb3Bvc2VkOj1ob3N0LlByb3Bvc2FsKGlkKS5BcmNhZGVBY3Rpb247YmVmb3JlOj1hcmNhZGVTdGF0ZShwcm9wb3NlZCk7YTo9aG9zdC5Db25zdW1lQXJjYWRlKGlkLGJlZm9yZSxjdXIpO2V4cGVjdGVkOj1iZWZvcmUKICAgIHN3aXRjaCBhLktpbmQoKXsKICAgIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcmNhZGVBY2NlcHRPd25lcjoKICAgICAgICBleHBlY3RlZC5Pd25lcj1hcmNhZGVQb2xpY3kuREFPKCk7ZXhwZWN0ZWQuUGVuZGluZ093bmVyPSIiO2V4cGVjdGVkLk93bmVyTGlzdGVkPWJlZm9yZS5EQU9MaXN0ZWQ7bWVtYmFfYXJjYWRlX2xlYWRlcmJvYXJkX3YxLkFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpKQogICAgY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkFyY2FkZVJldHVybk93bmVyOgogICAgICAgIGV4cGVjdGVkLlBlbmRpbmdPd25lcj1hLlJlY2lwaWVudCgpO21lbWJhX2FyY2FkZV9sZWFkZXJib2FyZF92MS5UcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLGEuUmVjaXBpZW50KCkpCiAgICBjYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuQXJjYWRlQWJvcnRSZXR1cm46CiAgICAgICAgZXhwZWN0ZWQuUGVuZGluZ093bmVyPSIiO21lbWJhX2FyY2FkZV9sZWFkZXJib2FyZF92MS5DYW5jZWxPd25lcnNoaXBUcmFuc2Zlcihjcm9zcyhjdXIpKQogICAgY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkFyY2FkZVVucGF1c2U6CiAgICAgICAgZXhwZWN0ZWQuUGF1c2VkPWZhbHNlO21lbWJhX2FyY2FkZV9sZWFkZXJib2FyZF92MS5QYXVzZShjcm9zcyhjdXIpLGZhbHNlKQogICAgY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkFyY2FkZUFkZEF0dGVzdGVyLG1lbWJhX3dlaWdodGVkX2hvc3QuQXJjYWRlUmVtb3ZlQXR0ZXN0ZXI6CiAgICAgICAgbGlzdGVkOj1hLktpbmQoKT09bWVtYmFfd2VpZ2h0ZWRfaG9zdC5BcmNhZGVBZGRBdHRlc3RlcjtleHBlY3RlZC5TdWJqZWN0TGlzdGVkPWxpc3RlZAogICAgICAgIGlmIGEuQXR0ZXN0ZXIoKT09YmVmb3JlLk93bmVye2V4cGVjdGVkLk93bmVyTGlzdGVkPWxpc3RlZH07aWYgYS5BdHRlc3RlcigpPT1hcmNhZGVQb2xpY3kuREFPKCl7ZXhwZWN0ZWQuREFPTGlzdGVkPWxpc3RlZH07aWYgYS5BdHRlc3RlcigpPT1hcmNhZGVQb2xpY3kuU3VjY2Vzc29yKCl7ZXhwZWN0ZWQuU3VjY2Vzc29yTGlzdGVkPWxpc3RlZH0KICAgICAgICBpZiBsaXN0ZWR7bWVtYmFfYXJjYWRlX2xlYWRlcmJvYXJkX3YxLkFkZEF0dGVzdGVyKGNyb3NzKGN1ciksYS5BdHRlc3RlcigpKX1lbHNle21lbWJhX2FyY2FkZV9sZWFkZXJib2FyZF92MS5SZW1vdmVBdHRlc3Rlcihjcm9zcyhjdXIpLGEuQXR0ZXN0ZXIoKSl9CiAgICBkZWZhdWx0OnBhbmljKCJ1bnN1cHBvcnRlZCBhcmNhZGUgYWN0aW9uIikKICAgIH0KICAgIGlmIGFyY2FkZVN0YXRlKGEpIT1leHBlY3RlZHtwYW5pYygiYXJjYWRlIHBvc3Rjb25kaXRpb24gbWlzbWF0Y2giKX0KICAgIC8vIE93bmVyc2hpcCBvcGVyYXRpb25zIHByZXNlcnZlIGV4cGxpY2l0IGFwcG9pbnRtZW50cy4gSXNBdHRlc3RlciBpcyB0aGUKICAgIC8vIGFsbG93bGlzdCBiaXQ7IGl0IGlzIG5vdCB0aGUgb2xkIG93bmVyJ3MgaW1wbGljaXQgYXV0aG9yaXR5LgogICAgaWYgYS5LaW5kKCk9PW1lbWJhX3dlaWdodGVkX2hvc3QuQXJjYWRlQWNjZXB0T3duZXIgJiYgbWVtYmFfYXJjYWRlX2xlYWRlcmJvYXJkX3YxLklzQXR0ZXN0ZXIoc3RyaW5nKGJlZm9yZS5Pd25lcikpIT1iZWZvcmUuT3duZXJMaXN0ZWR7cGFuaWMoImFyY2FkZSBvbGQgb3duZXIgYXBwb2ludG1lbnQgY2hhbmdlZCIpfQp9ChrPHQoSYmFkZ2VzX2FkYXB0ZXIuZ25vErgdLy8gRml4ZWQgYmFkZ2VzIGFkbWluaXN0cmF0aW9uIGFuZCBhdXRob3JpdHkgcmV0dXJuLiBPcGVyYXRpb25hbCBiYWRnZSBtaW50aW5nCi8vIHJlbWFpbnMgd2l0aCBleHBsaWNpdGx5IGFwcG9pbnRlZCBhZG1pbnM7IG5vIGFyYml0cmFyeSBtaW50IHJvdXRlIGlzIGV4cG9zZWQuCnBhY2thZ2UgbWVtYmFfZGFvCgppbXBvcnQgKAoJImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9ob3N0IgoJImduby5sYW5kL3Ivc2FtY3Jldy9nbm9idWlsZGVyc19iYWRnZXNfdjIiCikKCmZ1bmMgYmFkZ2VzU3RhdGUoYSBtZW1iYV93ZWlnaHRlZF9ob3N0LkJhZGdlc0FjdGlvbikgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5CYWRnZXNTdGF0ZSB7Cglvd25lciA6PSBnbm9idWlsZGVyc19iYWRnZXNfdjIuR2V0T3duZXIoKQoJc3ViamVjdCA6PSBmYWxzZQoJaWYgYS5TdWJqZWN0KCkgIT0gIiIgeyBzdWJqZWN0ID0gZ25vYnVpbGRlcnNfYmFkZ2VzX3YyLklzQWRtaW4oYS5TdWJqZWN0KCkpIH0KCXJldHVybiBtZW1iYV93ZWlnaHRlZF9ob3N0LkJhZGdlc1N0YXRlewoJCU93bmVyOiBvd25lciwgUGVuZGluZ093bmVyOiBnbm9idWlsZGVyc19iYWRnZXNfdjIuR2V0UGVuZGluZ093bmVyKCksCgkJUGF1c2VkOiBnbm9idWlsZGVyc19iYWRnZXNfdjIuSXNQYXVzZWQoKSwgQWRtaW5Db3VudDogZ25vYnVpbGRlcnNfYmFkZ2VzX3YyLkdldEFkbWluQ291bnQoKSwKCQlPd25lckFkbWluOiBnbm9idWlsZGVyc19iYWRnZXNfdjIuSXNBZG1pbihvd25lciksIERBT0FkbWluOiBnbm9idWlsZGVyc19iYWRnZXNfdjIuSXNBZG1pbihiYWRnZXNQb2xpY3kuREFPKCkpLAoJCVN1Y2Nlc3NvckFkbWluOiBnbm9idWlsZGVyc19iYWRnZXNfdjIuSXNBZG1pbihiYWRnZXNQb2xpY3kuU3VjY2Vzc29yKCkpLCBTdWJqZWN0QWRtaW46IHN1YmplY3QsCgl9Cn0KZnVuYyBwcm9wb3NlQmFkZ2VzKGN1ciByZWFsbSwgYSBtZW1iYV93ZWlnaHRlZF9ob3N0LkJhZGdlc0FjdGlvbikgdWludDY0IHsgcmV0dXJuIGhvc3QuUHJvcG9zZUJhZGdlcyhhLCBiYWRnZXNTdGF0ZShhKSwgY3VyKSB9CmZ1bmMgUHJvcG9zZUJhZGdlc0FjY2VwdChjdXIgcmVhbG0pIHVpbnQ2NCB7IHJldHVybiBwcm9wb3NlQmFkZ2VzKGN1ciwgYmFkZ2VzUG9saWN5LkFjY2VwdCgpKSB9CmZ1bmMgUHJvcG9zZUJhZGdlc1JldHVybihjdXIgcmVhbG0pIHVpbnQ2NCB7IHJldHVybiBwcm9wb3NlQmFkZ2VzKGN1ciwgYmFkZ2VzUG9saWN5LlJldHVybigpKSB9CmZ1bmMgUHJvcG9zZUJhZGdlc0Fib3J0UmV0dXJuKGN1ciByZWFsbSkgdWludDY0IHsgcmV0dXJuIHByb3Bvc2VCYWRnZXMoY3VyLCBiYWRnZXNQb2xpY3kuQWJvcnRSZXR1cm4oKSkgfQpmdW5jIFByb3Bvc2VCYWRnZXNBZGRBZG1pbihjdXIgcmVhbG0sIHdobyBhZGRyZXNzKSB1aW50NjQgeyByZXR1cm4gcHJvcG9zZUJhZGdlcyhjdXIsIGJhZGdlc1BvbGljeS5BZGRBZG1pbih3aG8pKSB9CmZ1bmMgUHJvcG9zZUJhZGdlc1JlbW92ZUFkbWluKGN1ciByZWFsbSwgd2hvIGFkZHJlc3MpIHVpbnQ2NCB7IHJldHVybiBwcm9wb3NlQmFkZ2VzKGN1ciwgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5CYWRnZXNSZXZva2VBZG1pbih3aG8pKSB9CmZ1bmMgUHJvcG9zZUJhZGdlc1VucGF1c2UoY3VyIHJlYWxtKSB1aW50NjQgeyByZXR1cm4gcHJvcG9zZUJhZGdlcyhjdXIsIG1lbWJhX3dlaWdodGVkX2hvc3QuQmFkZ2VzUmVzdW1lKCkpIH0KZnVuYyBFbWVyZ2VuY3lQYXVzZUJhZGdlcyhjdXIgcmVhbG0pIHsKCWEgOj0gbWVtYmFfd2VpZ2h0ZWRfaG9zdC5CYWRnZXNSZXN1bWUoKQoJYmVmb3JlIDo9IGJhZGdlc1N0YXRlKGEpCglob3N0LlByZXBhcmVCYWRnZXNFbWVyZ2VuY3lQYXVzZShiZWZvcmUsIGN1cikKCWV4cGVjdGVkIDo9IGJlZm9yZQoJZXhwZWN0ZWQuUGF1c2VkID0gdHJ1ZQoJZ25vYnVpbGRlcnNfYmFkZ2VzX3YyLlBhdXNlKGNyb3NzKGN1cikpCglpZiBiYWRnZXNTdGF0ZShhKSAhPSBleHBlY3RlZCB7IHBhbmljKCJiYWRnZXMgcGF1c2UgcG9zdGNvbmRpdGlvbiBtaXNtYXRjaCIpIH0KfQpmdW5jIGV4ZWN1dGVCYWRnZXMoY3VyIHJlYWxtLCBpZCB1aW50NjQpIHsKCXByb3Bvc2VkIDo9IGhvc3QuUHJvcG9zYWwoaWQpLkJhZGdlc0FjdGlvbgoJYmVmb3JlIDo9IGJhZGdlc1N0YXRlKHByb3Bvc2VkKQoJYSA6PSBob3N0LkNvbnN1bWVCYWRnZXMoaWQsIGJlZm9yZSwgY3VyKQoJZXhwZWN0ZWQgOj0gYmVmb3JlCglzd2l0Y2ggYS5LaW5kKCkgewoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkJhZGdlc0FjY2VwdE93bmVyOgoJCWV4cGVjdGVkLk93bmVyID0gYmFkZ2VzUG9saWN5LkRBTygpCgkJZXhwZWN0ZWQuUGVuZGluZ093bmVyID0gIiIKCQlleHBlY3RlZC5Pd25lckFkbWluID0gdHJ1ZQoJCWV4cGVjdGVkLkRBT0FkbWluID0gdHJ1ZQoJCWlmICFiZWZvcmUuREFPQWRtaW4geyBleHBlY3RlZC5BZG1pbkNvdW50KysgfQoJCWlmIGJlZm9yZS5Pd25lckFkbWluIHsgZXhwZWN0ZWQuQWRtaW5Db3VudC0tIH0KCQlpZiBiZWZvcmUuT3duZXIgPT0gYmFkZ2VzUG9saWN5LlN1Y2Nlc3NvcigpIHsgZXhwZWN0ZWQuU3VjY2Vzc29yQWRtaW4gPSBmYWxzZSB9CgkJZ25vYnVpbGRlcnNfYmFkZ2VzX3YyLkFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpKQoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkJhZGdlc1JldHVybk93bmVyOgoJCWV4cGVjdGVkLlBlbmRpbmdPd25lciA9IGEuUmVjaXBpZW50KCkKCQlnbm9idWlsZGVyc19iYWRnZXNfdjIuVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSwgYS5SZWNpcGllbnQoKSkKCWNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5CYWRnZXNBYm9ydFJldHVybjoKCQlleHBlY3RlZC5QZW5kaW5nT3duZXIgPSAiIgoJCWdub2J1aWxkZXJzX2JhZGdlc192Mi5DYW5jZWxPd25lcnNoaXBUcmFuc2Zlcihjcm9zcyhjdXIpKQoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkJhZGdlc1VucGF1c2U6CgkJZXhwZWN0ZWQuUGF1c2VkID0gZmFsc2UKCQlnbm9idWlsZGVyc19iYWRnZXNfdjIuVW5wYXVzZShjcm9zcyhjdXIpKQoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkJhZGdlc0FkZEFkbWluLCBtZW1iYV93ZWlnaHRlZF9ob3N0LkJhZGdlc1JlbW92ZUFkbWluOgoJCWdyYW50IDo9IGEuS2luZCgpID09IG1lbWJhX3dlaWdodGVkX2hvc3QuQmFkZ2VzQWRkQWRtaW4KCQlleHBlY3RlZC5TdWJqZWN0QWRtaW4gPSBncmFudAoJCWlmIGdyYW50IHsgZXhwZWN0ZWQuQWRtaW5Db3VudCsrIH0gZWxzZSB7IGV4cGVjdGVkLkFkbWluQ291bnQtLSB9CgkJaWYgYS5TdWJqZWN0KCkgPT0gYmFkZ2VzUG9saWN5LlN1Y2Nlc3NvcigpIHsgZXhwZWN0ZWQuU3VjY2Vzc29yQWRtaW4gPSBncmFudCB9CgkJaWYgZ3JhbnQgeyBnbm9idWlsZGVyc19iYWRnZXNfdjIuQWRkQWRtaW4oY3Jvc3MoY3VyKSwgYS5TdWJqZWN0KCkpIH0gZWxzZSB7IGdub2J1aWxkZXJzX2JhZGdlc192Mi5SZW1vdmVBZG1pbihjcm9zcyhjdXIpLCBhLlN1YmplY3QoKSkgfQoJZGVmYXVsdDoKCQlwYW5pYygidW5zdXBwb3J0ZWQgYmFkZ2VzIGFjdGlvbiIpCgl9CglpZiBiYWRnZXNTdGF0ZShhKSAhPSBleHBlY3RlZCB7IHBhbmljKCJiYWRnZXMgcG9zdGNvbmRpdGlvbiBtaXNtYXRjaCIpIH0KCWlmIGEuS2luZCgpID09IG1lbWJhX3dlaWdodGVkX2hvc3QuQmFkZ2VzQWNjZXB0T3duZXIgJiYgZ25vYnVpbGRlcnNfYmFkZ2VzX3YyLklzQWRtaW4oYmVmb3JlLk93bmVyKSB7IHBhbmljKCJiYWRnZXMgcHJldmlvdXMgb3duZXIgYWRtaW4gcmV0YWluZWQiKSB9Cn0KGpMnChRjaGFubmVsc19hZGFwdGVyLmdubxL6Ji8vIEZpeGVkIGNoYW5uZWxzIGF1dGhvcml0eSBhbmQgbWVtYmVyc2hpcC4gQ29udGVudCBtb2RlcmF0aW9uIHJlbWFpbnMgd2l0aCB0aGUKLy8gY3VycmVudCBvd25lciBhbmQgYXBwb2ludGVkIHRhcmdldCBhZG1pbnM7IHZvdGVzIGNhbm5vdCBjYWxsIGFyYml0cmFyeSBjb2RlLgpwYWNrYWdlIG1lbWJhX2RhbwoKaW1wb3J0ICgKCSJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfaG9zdCIKCWNoYW5uZWxzICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZGFvX2NoYW5uZWxzX3YyIgopCgpmdW5jIGNoYW5uZWxzU3RhdGUoYSBtZW1iYV93ZWlnaHRlZF9ob3N0LkNoYW5uZWxzQWN0aW9uKSBtZW1iYV93ZWlnaHRlZF9ob3N0LkNoYW5uZWxzU3RhdGUgewoJb3duZXI6PWNoYW5uZWxzLkdldE93bmVyKCkKCXN1YmplY3RSb2xlczo9IiIKCWlmIGEuU3ViamVjdCgpIT0iIiB7IHN1YmplY3RSb2xlcz1jaGFubmVscy5HZXRNZW1iZXJSb2xlcyhhLlN1YmplY3QoKSkgfQoJczo9bWVtYmFfd2VpZ2h0ZWRfaG9zdC5DaGFubmVsc1N0YXRlewoJCU93bmVyOm93bmVyLCBQZW5kaW5nT3duZXI6Y2hhbm5lbHMuR2V0UGVuZGluZ093bmVyKCksIFBhdXNlZDpjaGFubmVscy5Jc1BhdXNlZCgpLAoJCU1lbWJlckNvdW50OmNoYW5uZWxzLkdldE1lbWJlckNvdW50KCksIE1lbWJlcnNoaXBSZXZpc2lvbjpjaGFubmVscy5HZXRNZW1iZXJzaGlwUmV2aXNpb24oKSwgT3duZXJSb2xlczpjaGFubmVscy5HZXRNZW1iZXJSb2xlcyhvd25lciksCgkJT3duZXJNZW1iZXI6Y2hhbm5lbHMuSXNNZW1iZXIob3duZXIpLCBEQU9NZW1iZXI6Y2hhbm5lbHMuSXNNZW1iZXIoY2hhbm5lbHNQb2xpY3kuREFPKCkpLAoJCVN1Y2Nlc3Nvck1lbWJlcjpjaGFubmVscy5Jc01lbWJlcihjaGFubmVsc1BvbGljeS5TdWNjZXNzb3IoKSksCgkJU3ViamVjdE1lbWJlcjphLlN1YmplY3QoKSE9IiIgJiYgY2hhbm5lbHMuSXNNZW1iZXIoYS5TdWJqZWN0KCkpLAoJCURBT1JvbGVzOmNoYW5uZWxzLkdldE1lbWJlclJvbGVzKGNoYW5uZWxzUG9saWN5LkRBTygpKSwKCQlTdWNjZXNzb3JSb2xlczpjaGFubmVscy5HZXRNZW1iZXJSb2xlcyhjaGFubmVsc1BvbGljeS5TdWNjZXNzb3IoKSksIFN1YmplY3RSb2xlczpzdWJqZWN0Um9sZXMsCgl9CglzLkNoYW5uZWxDb3VudCxzLkNoYW5uZWxFeGlzdHMscy5DaGFubmVsRGVzY3JpcHRpb24scy5DaGFubmVsVHlwZSxzLkNoYW5uZWxSZWFkUm9sZXMscy5DaGFubmVsV3JpdGVSb2xlcz1jaGFubmVscy5HZXRDaGFubmVsU3RhdGUoYS5OYW1lKCkpCglyZXR1cm4gcwp9CmZ1bmMgcHJvcG9zZUNoYW5uZWxzKGN1ciByZWFsbSxhIG1lbWJhX3dlaWdodGVkX2hvc3QuQ2hhbm5lbHNBY3Rpb24pIHVpbnQ2NCB7IHJldHVybiBob3N0LlByb3Bvc2VDaGFubmVscyhhLGNoYW5uZWxzU3RhdGUoYSksY3VyKSB9CmZ1bmMgUHJvcG9zZUNoYW5uZWxzQWNjZXB0KGN1ciByZWFsbSkgdWludDY0IHsgcmV0dXJuIHByb3Bvc2VDaGFubmVscyhjdXIsY2hhbm5lbHNQb2xpY3kuQWNjZXB0KCkpIH0KZnVuYyBQcm9wb3NlQ2hhbm5lbHNSZXR1cm4oY3VyIHJlYWxtKSB1aW50NjQgeyByZXR1cm4gcHJvcG9zZUNoYW5uZWxzKGN1cixjaGFubmVsc1BvbGljeS5SZXR1cm4oKSkgfQpmdW5jIFByb3Bvc2VDaGFubmVsc0Fib3J0UmV0dXJuKGN1ciByZWFsbSkgdWludDY0IHsgcmV0dXJuIHByb3Bvc2VDaGFubmVscyhjdXIsY2hhbm5lbHNQb2xpY3kuQWJvcnRSZXR1cm4oKSkgfQpmdW5jIFByb3Bvc2VDaGFubmVsc0FkZE1lbWJlcihjdXIgcmVhbG0sd2hvIGFkZHJlc3Mscm9sZXMgc3RyaW5nKSB1aW50NjQgeyByZXR1cm4gcHJvcG9zZUNoYW5uZWxzKGN1cixjaGFubmVsc1BvbGljeS5BZGRNZW1iZXIod2hvLHJvbGVzKSkgfQpmdW5jIFByb3Bvc2VDaGFubmVsc1JlbW92ZU1lbWJlcihjdXIgcmVhbG0sd2hvIGFkZHJlc3MpIHVpbnQ2NCB7IHJldHVybiBwcm9wb3NlQ2hhbm5lbHMoY3VyLGNoYW5uZWxzUG9saWN5LlJlbW92ZU1lbWJlcih3aG8pKSB9CmZ1bmMgUHJvcG9zZUNoYW5uZWxzU2V0Um9sZXMoY3VyIHJlYWxtLHdobyBhZGRyZXNzLHJvbGVzIHN0cmluZykgdWludDY0IHsgcmV0dXJuIHByb3Bvc2VDaGFubmVscyhjdXIsY2hhbm5lbHNQb2xpY3kuU2V0Um9sZXMod2hvLHJvbGVzKSkgfQpmdW5jIFByb3Bvc2VDaGFubmVsc0NyZWF0ZVRleHQoY3VyIHJlYWxtLG5hbWUsZGVzY3JpcHRpb24gc3RyaW5nKSB1aW50NjQgeyByZXR1cm4gcHJvcG9zZUNoYW5uZWxzKGN1cixjaGFubmVsc1BvbGljeS5DcmVhdGVUZXh0KG5hbWUsZGVzY3JpcHRpb24pKSB9CmZ1bmMgUHJvcG9zZUNoYW5uZWxzVW5wYXVzZShjdXIgcmVhbG0pIHVpbnQ2NCB7IHJldHVybiBwcm9wb3NlQ2hhbm5lbHMoY3VyLG1lbWJhX3dlaWdodGVkX2hvc3QuQ2hhbm5lbHNSZXN1bWUoKSkgfQpmdW5jIEVtZXJnZW5jeVBhdXNlQ2hhbm5lbHMoY3VyIHJlYWxtKSB7CglhOj1tZW1iYV93ZWlnaHRlZF9ob3N0LkNoYW5uZWxzUmVzdW1lKCkKCWJlZm9yZTo9Y2hhbm5lbHNTdGF0ZShhKQoJaG9zdC5QcmVwYXJlQ2hhbm5lbHNFbWVyZ2VuY3lQYXVzZShiZWZvcmUsY3VyKQoJZXhwZWN0ZWQ6PWJlZm9yZTsgZXhwZWN0ZWQuUGF1c2VkPXRydWUKCWNoYW5uZWxzLlBhdXNlUmVhbG0oY3Jvc3MoY3VyKSkKCWlmIGNoYW5uZWxzU3RhdGUoYSkhPWV4cGVjdGVkIHsgcGFuaWMoImNoYW5uZWxzIHBhdXNlIHBvc3Rjb25kaXRpb24gbWlzbWF0Y2giKSB9Cn0KZnVuYyBleGVjdXRlQ2hhbm5lbHMoY3VyIHJlYWxtLGlkIHVpbnQ2NCkgewoJcHJvcG9zZWQ6PWhvc3QuUHJvcG9zYWwoaWQpLkNoYW5uZWxzQWN0aW9uCgliZWZvcmU6PWNoYW5uZWxzU3RhdGUocHJvcG9zZWQpCglhOj1ob3N0LkNvbnN1bWVDaGFubmVscyhpZCxiZWZvcmUsY3VyKQoJZXhwZWN0ZWQ6PWJlZm9yZQoJc3dpdGNoIGEuS2luZCgpIHsKCWNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5DaGFubmVsc0FjY2VwdE93bmVyOgoJCWV4cGVjdGVkLk93bmVyPWNoYW5uZWxzUG9saWN5LkRBTygpO2V4cGVjdGVkLlBlbmRpbmdPd25lcj0iIgoJCWV4cGVjdGVkLk93bmVyUm9sZXM9ImFkbWluIjtleHBlY3RlZC5EQU9Sb2xlcz0iYWRtaW4iO2V4cGVjdGVkLk93bmVyTWVtYmVyPXRydWU7ZXhwZWN0ZWQuREFPTWVtYmVyPXRydWUKCQlleHBlY3RlZC5NZW1iZXJzaGlwUmV2aXNpb24rKwoJCWlmIGJlZm9yZS5Pd25lcj09Y2hhbm5lbHNQb2xpY3kuU3VjY2Vzc29yKCkgeyBleHBlY3RlZC5TdWNjZXNzb3JSb2xlcz0iIjtleHBlY3RlZC5TdWNjZXNzb3JNZW1iZXI9ZmFsc2UgfQoJCWNoYW5uZWxzLkFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpKQoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkNoYW5uZWxzUmV0dXJuT3duZXI6CgkJZXhwZWN0ZWQuUGVuZGluZ093bmVyPWEuUmVjaXBpZW50KCkKCQljaGFubmVscy5Qcm9wb3NlT3duZXIoY3Jvc3MoY3VyKSxhLlJlY2lwaWVudCgpKQoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkNoYW5uZWxzQWJvcnRSZXR1cm46CgkJZXhwZWN0ZWQuUGVuZGluZ093bmVyPSIiCgkJY2hhbm5lbHMuQ2FuY2VsUGVuZGluZ093bmVyKGNyb3NzKGN1cikpCgljYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuQ2hhbm5lbHNBZGRNZW1iZXI6CgkJZXhwZWN0ZWQuTWVtYmVyQ291bnQrKztleHBlY3RlZC5NZW1iZXJzaGlwUmV2aXNpb24rKztleHBlY3RlZC5TdWJqZWN0Um9sZXM9YS5Sb2xlcygpO2V4cGVjdGVkLlN1YmplY3RNZW1iZXI9dHJ1ZQoJCWNoYW5uZWxzLkFkZE1lbWJlcihjcm9zcyhjdXIpLGEuU3ViamVjdCgpLGEuUm9sZXMoKSkKCWNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5DaGFubmVsc1JlbW92ZU1lbWJlcjoKCQlleHBlY3RlZC5NZW1iZXJDb3VudC0tO2V4cGVjdGVkLk1lbWJlcnNoaXBSZXZpc2lvbisrO2V4cGVjdGVkLlN1YmplY3RSb2xlcz0iIjtleHBlY3RlZC5TdWJqZWN0TWVtYmVyPWZhbHNlCgkJaWYgYS5TdWJqZWN0KCk9PWNoYW5uZWxzUG9saWN5LlN1Y2Nlc3NvcigpIHsgZXhwZWN0ZWQuU3VjY2Vzc29yUm9sZXM9IiI7ZXhwZWN0ZWQuU3VjY2Vzc29yTWVtYmVyPWZhbHNlIH0KCQljaGFubmVscy5SZW1vdmVNZW1iZXIoY3Jvc3MoY3VyKSxhLlN1YmplY3QoKSkKCWNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5DaGFubmVsc1NldFJvbGVzOgoJCWV4cGVjdGVkLk1lbWJlcnNoaXBSZXZpc2lvbisrO2V4cGVjdGVkLlN1YmplY3RSb2xlcz1hLlJvbGVzKCkKCQljaGFubmVscy5VcGRhdGVNZW1iZXJSb2xlcyhjcm9zcyhjdXIpLGEuU3ViamVjdCgpLGEuUm9sZXMoKSkKCWNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5DaGFubmVsc0NyZWF0ZVRleHQ6CgkJZXhwZWN0ZWQuQ2hhbm5lbENvdW50Kys7ZXhwZWN0ZWQuQ2hhbm5lbEV4aXN0cz10cnVlCgkJZXhwZWN0ZWQuQ2hhbm5lbERlc2NyaXB0aW9uPWEuRGVzY3JpcHRpb24oKTtleHBlY3RlZC5DaGFubmVsVHlwZT0idGV4dCIKCQlleHBlY3RlZC5DaGFubmVsUmVhZFJvbGVzPSJhZG1pbixkZXYsb3BzLG1lbWJlciI7ZXhwZWN0ZWQuQ2hhbm5lbFdyaXRlUm9sZXM9ImFkbWluLGRldixvcHMsbWVtYmVyIgoJCWNoYW5uZWxzLkNyZWF0ZUNoYW5uZWwoY3Jvc3MoY3VyKSxhLk5hbWUoKSxhLkRlc2NyaXB0aW9uKCksInRleHQiKQoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkNoYW5uZWxzVW5wYXVzZToKCQlleHBlY3RlZC5QYXVzZWQ9ZmFsc2UKCQljaGFubmVscy5VbnBhdXNlUmVhbG0oY3Jvc3MoY3VyKSkKCWRlZmF1bHQ6IHBhbmljKCJ1bnN1cHBvcnRlZCBjaGFubmVscyBhY3Rpb24iKQoJfQoJaWYgY2hhbm5lbHNTdGF0ZShhKSE9ZXhwZWN0ZWQgeyBwYW5pYygiY2hhbm5lbHMgcG9zdGNvbmRpdGlvbiBtaXNtYXRjaCIpIH0KCWlmIGEuS2luZCgpPT1tZW1iYV93ZWlnaHRlZF9ob3N0LkNoYW5uZWxzQWNjZXB0T3duZXIgJiYgY2hhbm5lbHMuSXNNZW1iZXIoYmVmb3JlLk93bmVyKSB7IHBhbmljKCJjaGFubmVscyBwcmV2aW91cyBvd25lciBtZW1iZXJzaGlwIHJldGFpbmVkIikgfQp9ChruOAoSZXNjcm93X2FkYXB0ZXIuZ25vEtc4cGFja2FnZSBtZW1iYV9kYW8KaW1wb3J0KCJjaGFpbiI7ImNoYWluL2JhbmtlciI7ImNoYWluL3J1bnRpbWUiOyJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfaG9zdCI7Imduby5sYW5kL3Ivc2FtY3Jldy9lc2Nyb3dfdjQiKQpmdW5jIGVzY3Jvd1N0YXRlKGEgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5Fc2Nyb3dBY3Rpb24pbWVtYmFfd2VpZ2h0ZWRfaG9zdC5Fc2Nyb3dTdGF0ZXsKIHA6PWVzY3Jvd192NC5QYXVzZVN0YXRlKCk7aWYgcC5QYXVzZWQhPWVzY3Jvd192NC5Jc1BhdXNlZCgpe3BhbmljKCJpbnZhbGlkIGVzY3JvdyBwYXVzZSByZWFkIil9CiBzOj1tZW1iYV93ZWlnaHRlZF9ob3N0LkVzY3Jvd1N0YXRle093bmVyOmFkZHJlc3MoZXNjcm93X3Y0LkdldEFkbWluKCkpLFBlbmRpbmdPd25lcjphZGRyZXNzKGVzY3Jvd192NC5HZXRQZW5kaW5nQWRtaW4oKSksRmVlUmVjaXBpZW50OmFkZHJlc3MoZXNjcm93X3Y0LkdldEZlZVJlY2lwaWVudCgpKSxQZW5kaW5nRmVlUmVjaXBpZW50OmFkZHJlc3MoZXNjcm93X3Y0LkdldFBlbmRpbmdGZWVSZWNpcGllbnQoKSksUGF1c2VkOnAuUGF1c2VkLFBhdXNlZEF0OnAuUGF1c2VkQXQsRXhpdHNSZW9wZW5BdDpwLkV4aXRzUmVvcGVuQXQsQ29vbGRvd25VbnRpbDpwLkNvb2xkb3duVW50aWwsRXhpdHNPcGVuOnAuRXhpdHNPcGVufQogaWYgYS5Jc1Jlc29sdXRpb24oKXsKICBjOj1lc2Nyb3dfdjQuR2V0R292ZXJuYW5jZUNvbnRyYWN0KGEuQ29udHJhY3RJRCgpKTtzLkNvbnRyYWN0PW1lbWJhX3dlaWdodGVkX2hvc3QuRXNjcm93Q29udHJhY3R7RXhpc3RzOmMuRXhpc3RzLElEOmMuSUQsQ29udGVudEhhc2g6Yy5Db250ZW50SGFzaCxTdGF0dXM6Yy5TdGF0dXMsQ2xpZW50OmMuQ2xpZW50LEZyZWVsYW5jZXI6Yy5GcmVlbGFuY2VyLENvdW50OmMuQ291bnR9CiAgZm9yIGksbTo9cmFuZ2UgYy5NaWxlc3RvbmVze3MuQ29udHJhY3QuTWlsZXN0b25lc1tpXT1tZW1iYV93ZWlnaHRlZF9ob3N0LkVzY3Jvd01pbGVzdG9uZXtJRDptLklELEFtb3VudDptLkFtb3VudCxTdGF0dXM6bS5TdGF0dXMsRnVuZGVkQXQ6bS5GdW5kZWRBdCxDb21wbGV0ZWRBdDptLkNvbXBsZXRlZEF0LERpc3B1dGVkQXQ6bS5EaXNwdXRlZEF0LFByZURpc3B1dGVTdGF0dXM6bS5QcmVEaXNwdXRlU3RhdHVzfX0KIH0KIGlmIGEuS2luZCgpPT1tZW1iYV93ZWlnaHRlZF9ob3N0LkVzY3Jvd1BheUZyZWVsYW5jZXJ7Zjo9ZXNjcm93X3Y0LkdldEdvdmVybmFuY2VGZWVUZXJtcygpO3MuRmVlcz1tZW1iYV93ZWlnaHRlZF9ob3N0LkVzY3Jvd0ZlZVRlcm1ze1Jhd0JQUzpmLlJhd0JQUyxFZmZlY3RpdmVCUFM6Zi5FZmZlY3RpdmVCUFMsUmF3VHJlYXN1cnk6Zi5SYXdUcmVhc3VyeSxGYWxsYmFja1RyZWFzdXJ5OmYuRmFsbGJhY2tUcmVhc3VyeSxFZmZlY3RpdmVUcmVhc3VyeTpmLkVmZmVjdGl2ZVRyZWFzdXJ5fX0KIHJldHVybiBzCn0KZnVuYyBwcm9wb3NlRXNjcm93KGN1ciByZWFsbSxhIG1lbWJhX3dlaWdodGVkX2hvc3QuRXNjcm93QWN0aW9uKXVpbnQ2NHtyZXR1cm4gaG9zdC5Qcm9wb3NlRXNjcm93KGEsZXNjcm93U3RhdGUoYSksY3VyKX0KZnVuYyBQcm9wb3NlRXNjcm93QWNjZXB0KGN1ciByZWFsbSl1aW50NjR7cmV0dXJuIHByb3Bvc2VFc2Nyb3coY3VyLGVzY3Jvd1BvbGljeS5BY2NlcHQoKSl9CmZ1bmMgUHJvcG9zZUVzY3Jvd1JldHVybihjdXIgcmVhbG0pdWludDY0e3JldHVybiBwcm9wb3NlRXNjcm93KGN1cixlc2Nyb3dQb2xpY3kuUmV0dXJuKCkpfQpmdW5jIFByb3Bvc2VFc2Nyb3dBYm9ydFJldHVybihjdXIgcmVhbG0pdWludDY0e3JldHVybiBwcm9wb3NlRXNjcm93KGN1cixlc2Nyb3dQb2xpY3kuQWJvcnRSZXR1cm4oKSl9CmZ1bmMgUHJvcG9zZUVzY3Jvd1VucGF1c2UoY3VyIHJlYWxtKXVpbnQ2NHtyZXR1cm4gcHJvcG9zZUVzY3JvdyhjdXIsbWVtYmFfd2VpZ2h0ZWRfaG9zdC5Fc2Nyb3dSZXN1bWUoKSl9CmZ1bmMgUHJvcG9zZUVzY3Jvd1JlZnVuZChjdXIgcmVhbG0saWQgc3RyaW5nLGluZGV4IGludCl1aW50NjR7cmV0dXJuIHByb3Bvc2VFc2Nyb3coY3VyLG1lbWJhX3dlaWdodGVkX2hvc3QuRXNjcm93UmVzb2x1dGlvbihpZCxpbmRleCx0cnVlKSl9CmZ1bmMgUHJvcG9zZUVzY3Jvd1BheUZyZWVsYW5jZXIoY3VyIHJlYWxtLGlkIHN0cmluZyxpbmRleCBpbnQpdWludDY0e3JldHVybiBwcm9wb3NlRXNjcm93KGN1cixtZW1iYV93ZWlnaHRlZF9ob3N0LkVzY3Jvd1Jlc29sdXRpb24oaWQsaW5kZXgsZmFsc2UpKX0KLy8gUHJvcG9zZUVzY3Jvd0ZlZVJlY2lwaWVudCBzdGFnZXMgcmVjaXBpZW50IGFzIHRoZSBmYWxsYmFjayBmZWUgcmVjaXBpZW50OwovLyByZWNpcGllbnQgdGhlbiBhY2NlcHRzIG9uIGVzY3Jvd192NCB3aXRoIGl0cyBvd24gQWNjZXB0RmVlUmVjaXBpZW50IGNhbGwuCmZ1bmMgUHJvcG9zZUVzY3Jvd0ZlZVJlY2lwaWVudChjdXIgcmVhbG0scmVjaXBpZW50IGFkZHJlc3MpdWludDY0e3JldHVybiBwcm9wb3NlRXNjcm93KGN1cixtZW1iYV93ZWlnaHRlZF9ob3N0LkVzY3Jvd0ZlZVJlY2lwaWVudChyZWNpcGllbnQpKX0KZnVuYyBFbWVyZ2VuY3lQYXVzZUVzY3JvdyhjdXIgcmVhbG0pe2E6PW1lbWJhX3dlaWdodGVkX2hvc3QuRXNjcm93UmVzdW1lKCk7YmVmb3JlOj1lc2Nyb3dTdGF0ZShhKTtob3N0LlByZXBhcmVFc2Nyb3dFbWVyZ2VuY3lQYXVzZShiZWZvcmUsY3VyKTtoOj1ydW50aW1lLkNoYWluSGVpZ2h0KCk7ZXhwZWN0ZWQ6PWJlZm9yZTtleHBlY3RlZC5QYXVzZWQ9dHJ1ZTtleHBlY3RlZC5QYXVzZWRBdD1oO2V4cGVjdGVkLkV4aXRzUmVvcGVuQXQ9aCtlc2Nyb3dfdjQuTWF4UGF1c2VCbGtzO2V4cGVjdGVkLkV4aXRzT3Blbj1mYWxzZTtlc2Nyb3dfdjQuUGF1c2UoY3Jvc3MoY3VyKSk7aWYgZXNjcm93U3RhdGUoYSkhPWV4cGVjdGVke3BhbmljKCJlc2Nyb3cgcGF1c2UgcG9zdGNvbmRpdGlvbiBtaXNtYXRjaCIpfX0KCnR5cGUgZXNjcm93QmFsYW5jZSBzdHJ1Y3R7d2hvIGFkZHJlc3M7YmVmb3JlLGRlbHRhLHdhbnQgaW50NjR9CmZ1bmMgZXNjcm93Q3JlZGl0KHJvd3MgW11lc2Nyb3dCYWxhbmNlLHdobyBhZGRyZXNzLGFtb3VudCBpbnQ2NClbXWVzY3Jvd0JhbGFuY2V7CiBpZiBhbW91bnQ9PTB7cmV0dXJuIHJvd3N9O2lmIGFtb3VudDwwfHwhd2hvLklzVmFsaWQoKXtwYW5pYygiaW52YWxpZCBlc2Nyb3cgY3JlZGl0Iil9CiBpZiB3aG89PWVzY3Jvd1BvbGljeS5EQU8oKXx8d2hvPT1jaGFpbi5QYWNrYWdlQWRkcmVzcyhtZW1iYV93ZWlnaHRlZF9ob3N0LkVzY3Jvd1BhdGgpe3BhbmljKCJlc2Nyb3cgcGF5b3V0IGNhbm5vdCBiZSB0cmFwcGVkIGluIGdvdmVybmFuY2Ugb3IgZXNjcm93Iil9CiBmb3IgaTo9cmFuZ2Ugcm93c3tpZiByb3dzW2ldLndobz09d2hve3Jvd3NbaV0uZGVsdGErPWFtb3VudDtyZXR1cm4gcm93c319CiByZXR1cm4gYXBwZW5kKHJvd3MsZXNjcm93QmFsYW5jZXt3aG86d2hvLGRlbHRhOmFtb3VudH0pCn0KLy8gR2xvYmFsIHNvbHZlbmN5IGlzIGNoZWNrZWQgYXQgZXhlY3V0aW9uLCBub3QgZnJvemVuIGF0IHByb3Bvc2FsIGNyZWF0aW9uOgovLyB1bnJlbGF0ZWQgZnVuZGluZyBvciBkdXN0IG1heSBhcnJpdmUgd2hpbGUgbWVtYmVycyB2b3RlLiBBZ2dyZWdhdGUgYWxpYXNlcy4KZnVuYyBlc2Nyb3dTZXR0bGVtZW50KGEgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5Fc2Nyb3dBY3Rpb24scyBtZW1iYV93ZWlnaHRlZF9ob3N0LkVzY3Jvd1N0YXRlKShbXWVzY3Jvd0JhbGFuY2UsaW50NjQpewogcmVhbG1BZGRyOj1jaGFpbi5QYWNrYWdlQWRkcmVzcyhtZW1iYV93ZWlnaHRlZF9ob3N0LkVzY3Jvd1BhdGgpO2Ftb3VudDo9cy5Db250cmFjdC5NaWxlc3RvbmVzW2EuTWlsZXN0b25lKCldLkFtb3VudAogbGlhYmxlOj1lc2Nyb3dfdjQuVG90YWxMaWFiaWxpdGllcygpO2Juazo9YmFua2VyLk5ld1JlYWRvbmx5QmFua2VyKCkKIGlmIGFtb3VudDw9MHx8bGlhYmxlPGFtb3VudHx8Ym5rLkdldENvaW4ocmVhbG1BZGRyLCJ1Z25vdCIpPGxpYWJsZXtwYW5pYygiZXNjcm93IGlzIG5vdCBzb2x2ZW50Iil9CiByb3dzOj1bXWVzY3Jvd0JhbGFuY2V7e3dobzpyZWFsbUFkZHIsZGVsdGE6LWFtb3VudH19CiBpZiBhLktpbmQoKT09bWVtYmFfd2VpZ2h0ZWRfaG9zdC5Fc2Nyb3dSZWZ1bmRDbGllbnR7cm93cz1lc2Nyb3dDcmVkaXQocm93cyxzLkNvbnRyYWN0LkNsaWVudCxhbW91bnQpfWVsc2V7CiAgYnBzOj1zLkZlZXMuRWZmZWN0aXZlQlBTO2lmIGJwczwwfHxicHM+NTAwe3BhbmljKCJpbnZhbGlkIGVzY3JvdyBwYXlvdXQgdGVybXMiKX0KICBmZWU6PShhbW91bnQvMTAwMDApKmJwcysoKGFtb3VudCUxMDAwMCkqYnBzKS8xMDAwMAogIHJvd3M9ZXNjcm93Q3JlZGl0KHJvd3Mscy5Db250cmFjdC5GcmVlbGFuY2VyLGFtb3VudC1mZWUpO3Jvd3M9ZXNjcm93Q3JlZGl0KHJvd3Mscy5GZWVzLkVmZmVjdGl2ZVRyZWFzdXJ5LGZlZSkKIH0KIGZvciBpOj1yYW5nZSByb3dzewogIHI6PSZyb3dzW2ldO3IuYmVmb3JlPWJuay5HZXRDb2luKHIud2hvLCJ1Z25vdCIpCiAgaWYgci5iZWZvcmU8MHx8KHIuZGVsdGE8MCYmci5iZWZvcmU8IC1yLmRlbHRhKXx8KHIuZGVsdGE+MCYmci5iZWZvcmU+OTIyMzM3MjAzNjg1NDc3NTgwNy1yLmRlbHRhKXtwYW5pYygiaW52YWxpZCBlc2Nyb3cgYmFsYW5jZSBkZWx0YSIpfQogIHIud2FudD1yLmJlZm9yZStyLmRlbHRhCiB9CiByZXR1cm4gcm93cyxsaWFibGUtYW1vdW50Cn0KZnVuYyBleGVjdXRlRXNjcm93KGN1ciByZWFsbSxpZCB1aW50NjQpewogcHJvcG9zZWQ6PWhvc3QuUHJvcG9zYWwoaWQpLkVzY3Jvd0FjdGlvbjtiZWZvcmU6PWVzY3Jvd1N0YXRlKHByb3Bvc2VkKTt2YXIgYmFsYW5jZXMgW11lc2Nyb3dCYWxhbmNlO3ZhciBsaWFiaWxpdHlBZnRlciBpbnQ2NAogaWYgcHJvcG9zZWQuSXNSZXNvbHV0aW9uKCl7YmFsYW5jZXMsbGlhYmlsaXR5QWZ0ZXI9ZXNjcm93U2V0dGxlbWVudChwcm9wb3NlZCxiZWZvcmUpfQogYTo9aG9zdC5Db25zdW1lRXNjcm93KGlkLGJlZm9yZSxjdXIpO2V4cGVjdGVkOj1iZWZvcmUKIHN3aXRjaCBhLktpbmQoKXsKIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5Fc2Nyb3dBY2NlcHRPd25lcjpleHBlY3RlZC5Pd25lcj1lc2Nyb3dQb2xpY3kuREFPKCk7ZXhwZWN0ZWQuUGVuZGluZ093bmVyPSIiO2VzY3Jvd192NC5BY2NlcHRPd25lcnNoaXAoY3Jvc3MoY3VyKSkKIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5Fc2Nyb3dSZXR1cm5Pd25lcjpleHBlY3RlZC5QZW5kaW5nT3duZXI9YS5SZWNpcGllbnQoKTtlc2Nyb3dfdjQuVHJhbnNmZXJPd25lcnNoaXAoY3Jvc3MoY3VyKSxhLlJlY2lwaWVudCgpKQogY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkVzY3Jvd0Fib3J0UmV0dXJuOmV4cGVjdGVkLlBlbmRpbmdPd25lcj0iIjtlc2Nyb3dfdjQuQ2FuY2VsT3duZXJzaGlwVHJhbnNmZXIoY3Jvc3MoY3VyKSkKIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5Fc2Nyb3dVbnBhdXNlOmV4cGVjdGVkLlBhdXNlZD1mYWxzZTtleHBlY3RlZC5QYXVzZWRBdD0wO2V4cGVjdGVkLkV4aXRzUmVvcGVuQXQ9MDtleHBlY3RlZC5FeGl0c09wZW49dHJ1ZTtleHBlY3RlZC5Db29sZG93blVudGlsPXJ1bnRpbWUuQ2hhaW5IZWlnaHQoKStlc2Nyb3dfdjQuUGF1c2VDb29sZG93bkJsa3M7ZXNjcm93X3Y0LlVucGF1c2UoY3Jvc3MoY3VyKSkKIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5Fc2Nyb3dTZXRGZWVSZWNpcGllbnQ6ZXhwZWN0ZWQuUGVuZGluZ0ZlZVJlY2lwaWVudD1hLlJlY2lwaWVudCgpO2VzY3Jvd192NC5Qcm9wb3NlRmVlUmVjaXBpZW50KGNyb3NzKGN1ciksYS5SZWNpcGllbnQoKSkKIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5Fc2Nyb3dSZWZ1bmRDbGllbnQsbWVtYmFfd2VpZ2h0ZWRfaG9zdC5Fc2Nyb3dQYXlGcmVlbGFuY2VyOgogIHJlZnVuZDo9YS5LaW5kKCk9PW1lbWJhX3dlaWdodGVkX2hvc3QuRXNjcm93UmVmdW5kQ2xpZW50CiAgZXhwZWN0ZWQuQ29udHJhY3QuTWlsZXN0b25lc1thLk1pbGVzdG9uZSgpXS5TdGF0dXM9InJlbGVhc2VkIjtpZiByZWZ1bmR7ZXhwZWN0ZWQuQ29udHJhY3QuTWlsZXN0b25lc1thLk1pbGVzdG9uZSgpXS5TdGF0dXM9InJlZnVuZGVkIn0KICAvLyBlc2Nyb3dfdjQgc2V0dGxlcyB0aGUgY29udHJhY3Qgb25jZSBldmVyeSBtaWxlc3RvbmUgaXMgcmVsZWFzZWQgb3IKICAvLyByZWZ1bmRlZDogY29tcGxldGVkIGlmIGFsbCB3ZXJlIHJlbGVhc2VkLCBjYW5jZWxsZWQgb3RoZXJ3aXNlLgogIGV4cGVjdGVkLkNvbnRyYWN0LlN0YXR1cz0iYWN0aXZlIjthbGxSZWxlYXNlZCxhbGxUZXJtaW5hbDo9dHJ1ZSx0cnVlCiAgZm9yIGk6PTA7aTxleHBlY3RlZC5Db250cmFjdC5Db3VudDtpKyt7bTo9ZXhwZWN0ZWQuQ29udHJhY3QuTWlsZXN0b25lc1tpXTtpZiBtLlN0YXR1cz09ImRpc3B1dGVkIntleHBlY3RlZC5Db250cmFjdC5TdGF0dXM9ImRpc3B1dGVkIn07aWYgbS5TdGF0dXMhPSJyZWxlYXNlZCJ7YWxsUmVsZWFzZWQ9ZmFsc2V9O2lmIG0uU3RhdHVzIT0icmVsZWFzZWQiJiZtLlN0YXR1cyE9InJlZnVuZGVkInthbGxUZXJtaW5hbD1mYWxzZX19CiAgaWYgYWxsVGVybWluYWx7ZXhwZWN0ZWQuQ29udHJhY3QuU3RhdHVzPSJjYW5jZWxsZWQiO2lmIGFsbFJlbGVhc2Vke2V4cGVjdGVkLkNvbnRyYWN0LlN0YXR1cz0iY29tcGxldGVkIn19CiAgZXNjcm93X3Y0LlJlc29sdmVEaXNwdXRlKGNyb3NzKGN1ciksYS5Db250cmFjdElEKCksYS5NaWxlc3RvbmUoKSxyZWZ1bmQpCiBkZWZhdWx0OnBhbmljKCJ1bnN1cHBvcnRlZCBlc2Nyb3cgYWN0aW9uIikKIH0KIGlmIGVzY3Jvd1N0YXRlKGEpIT1leHBlY3RlZHtwYW5pYygiZXNjcm93IHBvc3Rjb25kaXRpb24gbWlzbWF0Y2giKX0KIGlmIGEuSXNSZXNvbHV0aW9uKCl7CiAgaWYgZXNjcm93X3Y0LlRvdGFsTGlhYmlsaXRpZXMoKSE9bGlhYmlsaXR5QWZ0ZXJ7cGFuaWMoImVzY3JvdyBsaWFiaWxpdHkgcG9zdGNvbmRpdGlvbiBtaXNtYXRjaCIpfQogIGJuazo9YmFua2VyLk5ld1JlYWRvbmx5QmFua2VyKCk7Zm9yIF8scjo9cmFuZ2UgYmFsYW5jZXN7aWYgYm5rLkdldENvaW4oci53aG8sInVnbm90IikhPXIud2FudHtwYW5pYygiZXNjcm93IGJhbGFuY2UgcG9zdGNvbmRpdGlvbiBtaXNtYXRjaCIpfX0KICBpZiBibmsuR2V0Q29pbihjaGFpbi5QYWNrYWdlQWRkcmVzcyhtZW1iYV93ZWlnaHRlZF9ob3N0LkVzY3Jvd1BhdGgpLCJ1Z25vdCIpPGxpYWJpbGl0eUFmdGVye3BhbmljKCJlc2Nyb3cgc29sdmVuY3kgcG9zdGNvbmRpdGlvbiBtaXNtYXRjaCIpfQogfQp9ChriGwoQZmVlZF9hZGFwdGVyLmdubxLNGy8vIEZpeGVkIGZlZWQgYXV0aG9yaXR5IGFuZCBtb2RlcmF0b3IgYXBwb2ludG1lbnQuIENvbnRlbnQgbW9kZXJhdGlvbiBzdGF5cwovLyB3aXRoIHRoZSBjdXJyZW50IG93bmVyIG9yIGV4cGxpY2l0bHkgYXBwb2ludGVkIG1vZGVyYXRvcnMuCnBhY2thZ2UgbWVtYmFfZGFvCgppbXBvcnQgKAoJImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9ob3N0IgoJImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9mZWVkX3YxIgopCgpmdW5jIGZlZWRTdGF0ZShhIG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZEFjdGlvbikgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5GZWVkU3RhdGUgewoJb3duZXIgOj0gbWVtYmFfZmVlZF92MS5HZXRPd25lcigpCglzdWJqZWN0IDo9IGZhbHNlCglpZiBhLlN1YmplY3QoKSAhPSAiIiB7IHN1YmplY3QgPSBtZW1iYV9mZWVkX3YxLklzTW9kZXJhdG9yKGEuU3ViamVjdCgpKSB9CglyZXR1cm4gbWVtYmFfd2VpZ2h0ZWRfaG9zdC5GZWVkU3RhdGV7CgkJT3duZXI6IG93bmVyLCBQZW5kaW5nT3duZXI6IG1lbWJhX2ZlZWRfdjEuR2V0UGVuZGluZ093bmVyKCksCgkJUGF1c2VkOiBtZW1iYV9mZWVkX3YxLklzUGF1c2VkKCksIE1vZGVyYXRvckNvdW50OiBtZW1iYV9mZWVkX3YxLkdldE1vZGVyYXRvckNvdW50KCksCgkJT3duZXJNb2RlcmF0b3I6IG1lbWJhX2ZlZWRfdjEuSXNNb2RlcmF0b3Iob3duZXIpLCBEQU9Nb2RlcmF0b3I6IG1lbWJhX2ZlZWRfdjEuSXNNb2RlcmF0b3IoZmVlZFBvbGljeS5EQU8oKSksCgkJU3VjY2Vzc29yTW9kZXJhdG9yOiBtZW1iYV9mZWVkX3YxLklzTW9kZXJhdG9yKGZlZWRQb2xpY3kuU3VjY2Vzc29yKCkpLCBTdWJqZWN0TW9kZXJhdG9yOiBzdWJqZWN0LAoJfQp9CmZ1bmMgcHJvcG9zZUZlZWQoY3VyIHJlYWxtLCBhIG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZEFjdGlvbikgdWludDY0IHsgcmV0dXJuIGhvc3QuUHJvcG9zZUZlZWQoYSwgZmVlZFN0YXRlKGEpLCBjdXIpIH0KZnVuYyBQcm9wb3NlRmVlZEFjY2VwdChjdXIgcmVhbG0pIHVpbnQ2NCB7IHJldHVybiBwcm9wb3NlRmVlZChjdXIsIGZlZWRQb2xpY3kuQWNjZXB0KCkpIH0KZnVuYyBQcm9wb3NlRmVlZFJldHVybihjdXIgcmVhbG0pIHVpbnQ2NCB7IHJldHVybiBwcm9wb3NlRmVlZChjdXIsIGZlZWRQb2xpY3kuUmV0dXJuKCkpIH0KZnVuYyBQcm9wb3NlRmVlZEFib3J0UmV0dXJuKGN1ciByZWFsbSkgdWludDY0IHsgcmV0dXJuIHByb3Bvc2VGZWVkKGN1ciwgZmVlZFBvbGljeS5BYm9ydFJldHVybigpKSB9CmZ1bmMgUHJvcG9zZUZlZWRBZGRNb2RlcmF0b3IoY3VyIHJlYWxtLCB3aG8gYWRkcmVzcykgdWludDY0IHsgcmV0dXJuIHByb3Bvc2VGZWVkKGN1ciwgZmVlZFBvbGljeS5BZGRNb2RlcmF0b3Iod2hvKSkgfQpmdW5jIFByb3Bvc2VGZWVkUmVtb3ZlTW9kZXJhdG9yKGN1ciByZWFsbSwgd2hvIGFkZHJlc3MpIHVpbnQ2NCB7IHJldHVybiBwcm9wb3NlRmVlZChjdXIsIG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZFJldm9rZU1vZGVyYXRvcih3aG8pKSB9CmZ1bmMgUHJvcG9zZUZlZWRVbnBhdXNlKGN1ciByZWFsbSkgdWludDY0IHsgcmV0dXJuIHByb3Bvc2VGZWVkKGN1ciwgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5GZWVkUmVzdW1lKCkpIH0KZnVuYyBFbWVyZ2VuY3lQYXVzZUZlZWQoY3VyIHJlYWxtKSB7CglhIDo9IG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZFJlc3VtZSgpCgliZWZvcmUgOj0gZmVlZFN0YXRlKGEpCglob3N0LlByZXBhcmVGZWVkRW1lcmdlbmN5UGF1c2UoYmVmb3JlLCBjdXIpCglleHBlY3RlZCA6PSBiZWZvcmUKCWV4cGVjdGVkLlBhdXNlZCA9IHRydWUKCW1lbWJhX2ZlZWRfdjEuUGF1c2VSZWFsbShjcm9zcyhjdXIpKQoJaWYgZmVlZFN0YXRlKGEpICE9IGV4cGVjdGVkIHsgcGFuaWMoImZlZWQgcGF1c2UgcG9zdGNvbmRpdGlvbiBtaXNtYXRjaCIpIH0KfQpmdW5jIGV4ZWN1dGVGZWVkKGN1ciByZWFsbSwgaWQgdWludDY0KSB7Cglwcm9wb3NlZCA6PSBob3N0LlByb3Bvc2FsKGlkKS5GZWVkQWN0aW9uCgliZWZvcmUgOj0gZmVlZFN0YXRlKHByb3Bvc2VkKQoJYSA6PSBob3N0LkNvbnN1bWVGZWVkKGlkLCBiZWZvcmUsIGN1cikKCWV4cGVjdGVkIDo9IGJlZm9yZQoJc3dpdGNoIGEuS2luZCgpIHsKCWNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5GZWVkQWNjZXB0T3duZXI6CgkJZXhwZWN0ZWQuT3duZXIgPSBmZWVkUG9saWN5LkRBTygpCgkJZXhwZWN0ZWQuUGVuZGluZ093bmVyID0gIiIKCQlleHBlY3RlZC5Pd25lck1vZGVyYXRvciA9IGJlZm9yZS5EQU9Nb2RlcmF0b3IKCQltZW1iYV9mZWVkX3YxLkFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpKQoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkZlZWRSZXR1cm5Pd25lcjoKCQlleHBlY3RlZC5QZW5kaW5nT3duZXIgPSBhLlJlY2lwaWVudCgpCgkJbWVtYmFfZmVlZF92MS5UcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLCBhLlJlY2lwaWVudCgpKQoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkZlZWRBYm9ydFJldHVybjoKCQlleHBlY3RlZC5QZW5kaW5nT3duZXIgPSAiIgoJCW1lbWJhX2ZlZWRfdjEuQ2FuY2VsT3duZXJzaGlwVHJhbnNmZXIoY3Jvc3MoY3VyKSkKCWNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5GZWVkVW5wYXVzZToKCQlleHBlY3RlZC5QYXVzZWQgPSBmYWxzZQoJCW1lbWJhX2ZlZWRfdjEuVW5wYXVzZVJlYWxtKGNyb3NzKGN1cikpCgljYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZEFkZE1vZGVyYXRvciwgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5GZWVkUmVtb3ZlTW9kZXJhdG9yOgoJCWdyYW50IDo9IGEuS2luZCgpID09IG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZEFkZE1vZGVyYXRvcgoJCWV4cGVjdGVkLlN1YmplY3RNb2RlcmF0b3IgPSBncmFudAoJCWlmIGdyYW50IHsgZXhwZWN0ZWQuTW9kZXJhdG9yQ291bnQrKyB9IGVsc2UgeyBleHBlY3RlZC5Nb2RlcmF0b3JDb3VudC0tIH0KCQlpZiBhLlN1YmplY3QoKSA9PSBmZWVkUG9saWN5LlN1Y2Nlc3NvcigpIHsgZXhwZWN0ZWQuU3VjY2Vzc29yTW9kZXJhdG9yID0gZ3JhbnQgfQoJCWlmIGEuU3ViamVjdCgpID09IGZlZWRQb2xpY3kuREFPKCkgeyBleHBlY3RlZC5EQU9Nb2RlcmF0b3IgPSBncmFudDsgZXhwZWN0ZWQuT3duZXJNb2RlcmF0b3IgPSBncmFudCB9CgkJaWYgZ3JhbnQgeyBtZW1iYV9mZWVkX3YxLkFkZE1vZGVyYXRvcihjcm9zcyhjdXIpLCBhLlN1YmplY3QoKSkgfSBlbHNlIHsgbWVtYmFfZmVlZF92MS5SZW1vdmVNb2RlcmF0b3IoY3Jvc3MoY3VyKSwgYS5TdWJqZWN0KCkpIH0KCWRlZmF1bHQ6CgkJcGFuaWMoInVuc3VwcG9ydGVkIGZlZWQgYWN0aW9uIikKCX0KCWlmIGZlZWRTdGF0ZShhKSAhPSBleHBlY3RlZCB7IHBhbmljKCJmZWVkIHBvc3Rjb25kaXRpb24gbWlzbWF0Y2giKSB9CglpZiBhLktpbmQoKSA9PSBtZW1iYV93ZWlnaHRlZF9ob3N0LkZlZWRBY2NlcHRPd25lciAmJiBtZW1iYV9mZWVkX3YxLklzTW9kZXJhdG9yKGJlZm9yZS5Pd25lcikgeyBwYW5pYygiZmVlZCBwcmV2aW91cyBvd25lciBtb2RlcmF0b3IgcmV0YWluZWQiKSB9Cn0KGpAnChRmZWVkYmFja19hZGFwdGVyLmdubxL3Ji8vIEZpeGVkIGZlZWRiYWNrIGF1dGhvcml0eSBhbmQgbWVtYmVyc2hpcC4gQ29udGVudCBtb2RlcmF0aW9uIHJlbWFpbnMgd2l0aCB0aGUKLy8gY3VycmVudCBvd25lciBhbmQgYXBwb2ludGVkIHRhcmdldCBhZG1pbnM7IHZvdGVzIGNhbm5vdCBjYWxsIGFyYml0cmFyeSBjb2RlLgpwYWNrYWdlIG1lbWJhX2RhbwoKaW1wb3J0ICgKCSJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfaG9zdCIKCWZlZWRiYWNrICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZmVlZGJhY2tfdjIiCikKCmZ1bmMgZmVlZGJhY2tTdGF0ZShhIG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZGJhY2tBY3Rpb24pIG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZGJhY2tTdGF0ZSB7Cglvd25lcjo9ZmVlZGJhY2suR2V0T3duZXIoKQoJc3ViamVjdFJvbGVzOj0iIgoJaWYgYS5TdWJqZWN0KCkhPSIiIHsgc3ViamVjdFJvbGVzPWZlZWRiYWNrLkdldE1lbWJlclJvbGVzKGEuU3ViamVjdCgpKSB9CglzOj1tZW1iYV93ZWlnaHRlZF9ob3N0LkZlZWRiYWNrU3RhdGV7CgkJT3duZXI6b3duZXIsIFBlbmRpbmdPd25lcjpmZWVkYmFjay5HZXRQZW5kaW5nT3duZXIoKSwgUGF1c2VkOmZlZWRiYWNrLklzUGF1c2VkKCksCgkJTWVtYmVyQ291bnQ6ZmVlZGJhY2suR2V0TWVtYmVyQ291bnQoKSwgTWVtYmVyc2hpcFJldmlzaW9uOmZlZWRiYWNrLkdldE1lbWJlcnNoaXBSZXZpc2lvbigpLCBPd25lclJvbGVzOmZlZWRiYWNrLkdldE1lbWJlclJvbGVzKG93bmVyKSwKCQlPd25lck1lbWJlcjpmZWVkYmFjay5Jc01lbWJlcihvd25lciksIERBT01lbWJlcjpmZWVkYmFjay5Jc01lbWJlcihmZWVkYmFja1BvbGljeS5EQU8oKSksCgkJU3VjY2Vzc29yTWVtYmVyOmZlZWRiYWNrLklzTWVtYmVyKGZlZWRiYWNrUG9saWN5LlN1Y2Nlc3NvcigpKSwKCQlTdWJqZWN0TWVtYmVyOmEuU3ViamVjdCgpIT0iIiAmJiBmZWVkYmFjay5Jc01lbWJlcihhLlN1YmplY3QoKSksCgkJREFPUm9sZXM6ZmVlZGJhY2suR2V0TWVtYmVyUm9sZXMoZmVlZGJhY2tQb2xpY3kuREFPKCkpLAoJCVN1Y2Nlc3NvclJvbGVzOmZlZWRiYWNrLkdldE1lbWJlclJvbGVzKGZlZWRiYWNrUG9saWN5LlN1Y2Nlc3NvcigpKSwgU3ViamVjdFJvbGVzOnN1YmplY3RSb2xlcywKCX0KCXMuQ2hhbm5lbENvdW50LHMuQ2hhbm5lbEV4aXN0cyxzLkNoYW5uZWxEZXNjcmlwdGlvbixzLkNoYW5uZWxUeXBlLHMuQ2hhbm5lbFJlYWRSb2xlcyxzLkNoYW5uZWxXcml0ZVJvbGVzPWZlZWRiYWNrLkdldENoYW5uZWxTdGF0ZShhLk5hbWUoKSkKCXJldHVybiBzCn0KZnVuYyBwcm9wb3NlRmVlZGJhY2soY3VyIHJlYWxtLGEgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5GZWVkYmFja0FjdGlvbikgdWludDY0IHsgcmV0dXJuIGhvc3QuUHJvcG9zZUZlZWRiYWNrKGEsZmVlZGJhY2tTdGF0ZShhKSxjdXIpIH0KZnVuYyBQcm9wb3NlRmVlZGJhY2tBY2NlcHQoY3VyIHJlYWxtKSB1aW50NjQgeyByZXR1cm4gcHJvcG9zZUZlZWRiYWNrKGN1cixmZWVkYmFja1BvbGljeS5BY2NlcHQoKSkgfQpmdW5jIFByb3Bvc2VGZWVkYmFja1JldHVybihjdXIgcmVhbG0pIHVpbnQ2NCB7IHJldHVybiBwcm9wb3NlRmVlZGJhY2soY3VyLGZlZWRiYWNrUG9saWN5LlJldHVybigpKSB9CmZ1bmMgUHJvcG9zZUZlZWRiYWNrQWJvcnRSZXR1cm4oY3VyIHJlYWxtKSB1aW50NjQgeyByZXR1cm4gcHJvcG9zZUZlZWRiYWNrKGN1cixmZWVkYmFja1BvbGljeS5BYm9ydFJldHVybigpKSB9CmZ1bmMgUHJvcG9zZUZlZWRiYWNrQWRkTWVtYmVyKGN1ciByZWFsbSx3aG8gYWRkcmVzcyxyb2xlcyBzdHJpbmcpIHVpbnQ2NCB7IHJldHVybiBwcm9wb3NlRmVlZGJhY2soY3VyLGZlZWRiYWNrUG9saWN5LkFkZE1lbWJlcih3aG8scm9sZXMpKSB9CmZ1bmMgUHJvcG9zZUZlZWRiYWNrUmVtb3ZlTWVtYmVyKGN1ciByZWFsbSx3aG8gYWRkcmVzcykgdWludDY0IHsgcmV0dXJuIHByb3Bvc2VGZWVkYmFjayhjdXIsZmVlZGJhY2tQb2xpY3kuUmVtb3ZlTWVtYmVyKHdobykpIH0KZnVuYyBQcm9wb3NlRmVlZGJhY2tTZXRSb2xlcyhjdXIgcmVhbG0sd2hvIGFkZHJlc3Mscm9sZXMgc3RyaW5nKSB1aW50NjQgeyByZXR1cm4gcHJvcG9zZUZlZWRiYWNrKGN1cixmZWVkYmFja1BvbGljeS5TZXRSb2xlcyh3aG8scm9sZXMpKSB9CmZ1bmMgUHJvcG9zZUZlZWRiYWNrQ3JlYXRlVGV4dChjdXIgcmVhbG0sbmFtZSxkZXNjcmlwdGlvbiBzdHJpbmcpIHVpbnQ2NCB7IHJldHVybiBwcm9wb3NlRmVlZGJhY2soY3VyLGZlZWRiYWNrUG9saWN5LkNyZWF0ZVRleHQobmFtZSxkZXNjcmlwdGlvbikpIH0KZnVuYyBQcm9wb3NlRmVlZGJhY2tVbnBhdXNlKGN1ciByZWFsbSkgdWludDY0IHsgcmV0dXJuIHByb3Bvc2VGZWVkYmFjayhjdXIsbWVtYmFfd2VpZ2h0ZWRfaG9zdC5GZWVkYmFja1Jlc3VtZSgpKSB9CmZ1bmMgRW1lcmdlbmN5UGF1c2VGZWVkYmFjayhjdXIgcmVhbG0pIHsKCWE6PW1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZGJhY2tSZXN1bWUoKQoJYmVmb3JlOj1mZWVkYmFja1N0YXRlKGEpCglob3N0LlByZXBhcmVGZWVkYmFja0VtZXJnZW5jeVBhdXNlKGJlZm9yZSxjdXIpCglleHBlY3RlZDo9YmVmb3JlOyBleHBlY3RlZC5QYXVzZWQ9dHJ1ZQoJZmVlZGJhY2suUGF1c2VSZWFsbShjcm9zcyhjdXIpKQoJaWYgZmVlZGJhY2tTdGF0ZShhKSE9ZXhwZWN0ZWQgeyBwYW5pYygiZmVlZGJhY2sgcGF1c2UgcG9zdGNvbmRpdGlvbiBtaXNtYXRjaCIpIH0KfQpmdW5jIGV4ZWN1dGVGZWVkYmFjayhjdXIgcmVhbG0saWQgdWludDY0KSB7Cglwcm9wb3NlZDo9aG9zdC5Qcm9wb3NhbChpZCkuRmVlZGJhY2tBY3Rpb24KCWJlZm9yZTo9ZmVlZGJhY2tTdGF0ZShwcm9wb3NlZCkKCWE6PWhvc3QuQ29uc3VtZUZlZWRiYWNrKGlkLGJlZm9yZSxjdXIpCglleHBlY3RlZDo9YmVmb3JlCglzd2l0Y2ggYS5LaW5kKCkgewoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkZlZWRiYWNrQWNjZXB0T3duZXI6CgkJZXhwZWN0ZWQuT3duZXI9ZmVlZGJhY2tQb2xpY3kuREFPKCk7ZXhwZWN0ZWQuUGVuZGluZ093bmVyPSIiCgkJZXhwZWN0ZWQuT3duZXJSb2xlcz0iYWRtaW4iO2V4cGVjdGVkLkRBT1JvbGVzPSJhZG1pbiI7ZXhwZWN0ZWQuT3duZXJNZW1iZXI9dHJ1ZTtleHBlY3RlZC5EQU9NZW1iZXI9dHJ1ZQoJCWV4cGVjdGVkLk1lbWJlckNvdW50Kys7ZXhwZWN0ZWQuTWVtYmVyc2hpcFJldmlzaW9uKysKCQlleHBlY3RlZC5TdWNjZXNzb3JSb2xlcz0ibWVtYmVyIjtleHBlY3RlZC5TdWNjZXNzb3JNZW1iZXI9dHJ1ZQoJCWZlZWRiYWNrLkFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpKQoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkZlZWRiYWNrUmV0dXJuT3duZXI6CgkJZXhwZWN0ZWQuUGVuZGluZ093bmVyPWEuUmVjaXBpZW50KCkKCQlmZWVkYmFjay5UcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLGEuUmVjaXBpZW50KCkpCgljYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZGJhY2tBYm9ydFJldHVybjoKCQlleHBlY3RlZC5QZW5kaW5nT3duZXI9IiIKCQlmZWVkYmFjay5DYW5jZWxPd25lcnNoaXBUcmFuc2Zlcihjcm9zcyhjdXIpKQoJY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LkZlZWRiYWNrQWRkTWVtYmVyOgoJCWV4cGVjdGVkLk1lbWJlckNvdW50Kys7ZXhwZWN0ZWQuTWVtYmVyc2hpcFJldmlzaW9uKys7ZXhwZWN0ZWQuU3ViamVjdFJvbGVzPWEuUm9sZXMoKTtleHBlY3RlZC5TdWJqZWN0TWVtYmVyPXRydWUKCQlmZWVkYmFjay5BZGRNZW1iZXIoY3Jvc3MoY3VyKSxhLlN1YmplY3QoKSxhLlJvbGVzKCkpCgljYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZGJhY2tSZW1vdmVNZW1iZXI6CgkJZXhwZWN0ZWQuTWVtYmVyQ291bnQtLTtleHBlY3RlZC5NZW1iZXJzaGlwUmV2aXNpb24rKztleHBlY3RlZC5TdWJqZWN0Um9sZXM9IiI7ZXhwZWN0ZWQuU3ViamVjdE1lbWJlcj1mYWxzZQoJCWlmIGEuU3ViamVjdCgpPT1mZWVkYmFja1BvbGljeS5TdWNjZXNzb3IoKSB7IGV4cGVjdGVkLlN1Y2Nlc3NvclJvbGVzPSIiO2V4cGVjdGVkLlN1Y2Nlc3Nvck1lbWJlcj1mYWxzZSB9CgkJZmVlZGJhY2suUmVtb3ZlTWVtYmVyKGNyb3NzKGN1ciksYS5TdWJqZWN0KCkpCgljYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZGJhY2tTZXRSb2xlczoKCQlleHBlY3RlZC5NZW1iZXJzaGlwUmV2aXNpb24rKztleHBlY3RlZC5TdWJqZWN0Um9sZXM9YS5Sb2xlcygpCgkJZmVlZGJhY2suVXBkYXRlTWVtYmVyUm9sZXMoY3Jvc3MoY3VyKSxhLlN1YmplY3QoKSxhLlJvbGVzKCkpCgljYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuRmVlZGJhY2tDcmVhdGVUZXh0OgoJCWV4cGVjdGVkLkNoYW5uZWxDb3VudCsrO2V4cGVjdGVkLkNoYW5uZWxFeGlzdHM9dHJ1ZQoJCWV4cGVjdGVkLkNoYW5uZWxEZXNjcmlwdGlvbj1hLkRlc2NyaXB0aW9uKCk7ZXhwZWN0ZWQuQ2hhbm5lbFR5cGU9InRleHQiCgkJZXhwZWN0ZWQuQ2hhbm5lbFJlYWRSb2xlcz0iYWRtaW4sZGV2LG9wcyxtZW1iZXIiO2V4cGVjdGVkLkNoYW5uZWxXcml0ZVJvbGVzPSJhZG1pbixkZXYsb3BzLG1lbWJlciIKCQlmZWVkYmFjay5DcmVhdGVDaGFubmVsKGNyb3NzKGN1ciksYS5OYW1lKCksYS5EZXNjcmlwdGlvbigpLCJ0ZXh0IikKCWNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5GZWVkYmFja1VucGF1c2U6CgkJZXhwZWN0ZWQuUGF1c2VkPWZhbHNlCgkJZmVlZGJhY2suVW5wYXVzZVJlYWxtKGNyb3NzKGN1cikpCglkZWZhdWx0OiBwYW5pYygidW5zdXBwb3J0ZWQgZmVlZGJhY2sgYWN0aW9uIikKCX0KCWlmIGZlZWRiYWNrU3RhdGUoYSkhPWV4cGVjdGVkIHsgcGFuaWMoImZlZWRiYWNrIHBvc3Rjb25kaXRpb24gbWlzbWF0Y2giKSB9CglpZiBhLktpbmQoKT09bWVtYmFfd2VpZ2h0ZWRfaG9zdC5GZWVkYmFja0FjY2VwdE93bmVyICYmIGZlZWRiYWNrLkdldE1lbWJlclJvbGVzKGJlZm9yZS5Pd25lcikhPSJtZW1iZXIiIHsgcGFuaWMoImZlZWRiYWNrIHByZXZpb3VzIG93bmVyIGFkbWluIHJldGFpbmVkIikgfQp9ChpDCgtnbm9tb2QudG9tbBI0bW9kdWxlID0gImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iCmdubyA9ICIwLjkiChqpFQoSbWFya2V0X2FkYXB0ZXIuZ25vEpIVLy8gRml4ZWQtdGFyZ2V0IGFkYXB0ZXIuIE5vIGNhbGxiYWNrLCBhcmJpdHJhcnkgY2FsbCwgb3IgcmVjb3ZlcmVkIHBhbmljIHBhdGguCnBhY2thZ2UgbWVtYmFfZGFvCgppbXBvcnQgKAogICAgImduby5sYW5kL3Avc2FtY3Jldy9tZW1iYV93ZWlnaHRlZF9ob3N0IgogICAgImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9tYXJrZXRfY29uZmlnIgopCgpmdW5jIG1hcmtldFN0YXRlKGEgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5NYXJrZXRBY3Rpb24pIG1lbWJhX3dlaWdodGVkX2hvc3QuTWFya2V0U3RhdGUgewogICAgYnBzIDo9IGludDY0KDApCiAgICBpZiBhLktpbmQoKSA9PSBtZW1iYV93ZWlnaHRlZF9ob3N0Lk1hcmtldFNldEZlZSB7CiAgICAgICAgYnBzID0gaW50NjQobWVtYmFfbWFya2V0X2NvbmZpZy5HZXRGZWVCUFMoc3RyaW5nKGEuTGFuZSgpKSkpCiAgICB9CiAgICByZXR1cm4gbWVtYmFfd2VpZ2h0ZWRfaG9zdC5NYXJrZXRTdGF0ZXtBZG1pbjogbWVtYmFfbWFya2V0X2NvbmZpZy5HZXRBZG1pbigpLCBQZW5kaW5nQWRtaW46IG1lbWJhX21hcmtldF9jb25maWcuR2V0UGVuZGluZ0FkbWluKCksIFRyZWFzdXJ5OiBtZW1iYV9tYXJrZXRfY29uZmlnLkdldFRyZWFzdXJ5KCksIEJQUzogYnBzfQp9CgpmdW5jIFByb3Bvc2VNYXJrZXRBY2NlcHQoY3VyIHJlYWxtKSB1aW50NjQgewogICAgYSA6PSBtZW1iYV93ZWlnaHRlZF9ob3N0Lk1hcmtldEFjY2VwdCgpCiAgICByZXR1cm4gaG9zdC5Qcm9wb3NlTWFya2V0KGEsIG1hcmtldFN0YXRlKGEpLCBjdXIpCn0KZnVuYyBQcm9wb3NlTWFya2V0RmVlKGN1ciByZWFsbSwgbGFuZSBzdHJpbmcsIGJwcyBpbnQ2NCkgdWludDY0IHsKICAgIGEgOj0gbWVtYmFfd2VpZ2h0ZWRfaG9zdC5NYXJrZXRGZWUobWVtYmFfd2VpZ2h0ZWRfaG9zdC5NYXJrZXRMYW5lKGxhbmUpLCBicHMpCiAgICByZXR1cm4gaG9zdC5Qcm9wb3NlTWFya2V0KGEsIG1hcmtldFN0YXRlKGEpLCBjdXIpCn0KZnVuYyBQcm9wb3NlTWFya2V0VHJlYXN1cnkoY3VyIHJlYWxtKSB1aW50NjQgewogICAgYSA6PSBtYXJrZXRQb2xpY3kuU2V0VHJlYXN1cnkoKQogICAgcmV0dXJuIGhvc3QuUHJvcG9zZU1hcmtldChhLCBtYXJrZXRTdGF0ZShhKSwgY3VyKQp9CmZ1bmMgUHJvcG9zZU1hcmtldFJldHVybihjdXIgcmVhbG0pIHVpbnQ2NCB7CiAgICBhIDo9IG1hcmtldFBvbGljeS5SZXR1cm5BZG1pbigpCiAgICByZXR1cm4gaG9zdC5Qcm9wb3NlTWFya2V0KGEsIG1hcmtldFN0YXRlKGEpLCBjdXIpCn0KZnVuYyBQcm9wb3NlTWFya2V0QWJvcnRSZXR1cm4oY3VyIHJlYWxtKSB1aW50NjQgewogICAgYSA6PSBtYXJrZXRQb2xpY3kuQWJvcnRSZXR1cm4oKQogICAgcmV0dXJuIGhvc3QuUHJvcG9zZU1hcmtldChhLCBtYXJrZXRTdGF0ZShhKSwgY3VyKQp9CgpmdW5jIGV4ZWN1dGVNYXJrZXQoY3VyIHJlYWxtLCBpZCB1aW50NjQpIHsKICAgIHByb3Bvc2VkIDo9IGhvc3QuUHJvcG9zYWwoaWQpLk1hcmtldEFjdGlvbgogICAgYmVmb3JlIDo9IG1hcmtldFN0YXRlKHByb3Bvc2VkKQogICAgYSA6PSBob3N0LkNvbnN1bWVNYXJrZXQoaWQsIGJlZm9yZSwgY3VyKQogICAgZXhwZWN0ZWQgOj0gYmVmb3JlCiAgICBzd2l0Y2ggYS5LaW5kKCkgewogICAgY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0Lk1hcmtldEFjY2VwdEFkbWluOgogICAgICAgIGV4cGVjdGVkLkFkbWluID0gbWFya2V0UG9saWN5LkRBTygpCiAgICAgICAgZXhwZWN0ZWQuUGVuZGluZ0FkbWluID0gIiIKICAgICAgICBtZW1iYV9tYXJrZXRfY29uZmlnLkFjY2VwdEFkbWluKGNyb3NzKGN1cikpCiAgICBjYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuTWFya2V0U2V0RmVlOgogICAgICAgIGV4cGVjdGVkLkJQUyA9IGEuQlBTKCkKICAgICAgICBtZW1iYV9tYXJrZXRfY29uZmlnLlNldEZlZUJQUyhjcm9zcyhjdXIpLCBzdHJpbmcoYS5MYW5lKCkpLCBhLkJQUygpKQogICAgY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0Lk1hcmtldFNldFRyZWFzdXJ5OgogICAgICAgIGV4cGVjdGVkLlRyZWFzdXJ5ID0gYS5SZWNpcGllbnQoKQogICAgICAgIG1lbWJhX21hcmtldF9jb25maWcuU2V0VHJlYXN1cnkoY3Jvc3MoY3VyKSwgYS5SZWNpcGllbnQoKSkKICAgIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5NYXJrZXRSZXR1cm5BZG1pbjoKICAgICAgICBleHBlY3RlZC5QZW5kaW5nQWRtaW4gPSBhLlJlY2lwaWVudCgpCiAgICAgICAgbWVtYmFfbWFya2V0X2NvbmZpZy5UcmFuc2ZlckFkbWluKGNyb3NzKGN1ciksIGEuUmVjaXBpZW50KCkpCiAgICBjYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuTWFya2V0QWJvcnRSZXR1cm46CiAgICAgICAgZXhwZWN0ZWQuUGVuZGluZ0FkbWluID0gIiIKICAgICAgICBtZW1iYV9tYXJrZXRfY29uZmlnLkNhbmNlbEFkbWluVHJhbnNmZXIoY3Jvc3MoY3VyKSkKICAgIGRlZmF1bHQ6CiAgICAgICAgcGFuaWMoInVuc3VwcG9ydGVkIG1hcmtldCBhY3Rpb24iKQogICAgfQogICAgLy8gU3RhZ2UtcmV0dXJuIGRlbGliZXJhdGVseSByZXRhaW5zIERBTyBhZG1pbiB1bnRpbCB0aGUgc3VjY2Vzc29yIGFjY2VwdHMKICAgIC8vIHNlcGFyYXRlbHkuIEEgbWlzbWF0Y2ggYWJvcnRzIHRoZSBlbnRpcmUgdHJhbnNhY3Rpb24sIGluY2x1ZGluZyBDb25zdW1lLgogICAgaWYgbWFya2V0U3RhdGUoYSkgIT0gZXhwZWN0ZWQgeyBwYW5pYygibWFya2V0IHBvc3Rjb25kaXRpb24gbWlzbWF0Y2giKSB9Cn0KGq4uCg1tZW1iYV9kYW8uZ25vEpwuLy8gRm91bmRpbmcgTWVtYmEgREFPIGNhbmRpZGF0ZS4gSW5pdGlhbCByb2xlcyBmb2xsb3cgdGhlIGFwcHJvdmVkIHBvbGljeS4KLy8gS2VlcCB0aGUgaG9zdCBwcml2YXRlLiBUaGlzIHJlYWxtIHN1cHBvcnRzIGdvdmVybmVkIHJvbGUgY2hhbmdlcywgc2FtZS1wZXJzb24ga2V5IHJlY292ZXJ5IGFuZCB0aGUgZml4ZWQgYXBwbGljYXRpb24gYWRhcHRlcnMgbmFtZWQgaW4gUmVuZGVyLgpwYWNrYWdlIG1lbWJhX2RhbwoKaW1wb3J0ICgKICAgICJjaGFpbiIKICAgICJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfaG9zdCIKICAgICJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfcG9saWN5IgopCgp2YXIgaG9zdCAqbWVtYmFfd2VpZ2h0ZWRfaG9zdC5Ib3N0CnZhciBmZWVkYmFja1BvbGljeSA9IG1lbWJhX3dlaWdodGVkX2hvc3QuTmV3RmVlZGJhY2tQb2xpY3koY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iKSwgImcxMzZqMG0wOHBrbTJsd3dkZTlkbWx4OHVlZTI2bGxlbnQ5czVjcGYiKQp2YXIgY2hhbm5lbHNQb2xpY3kgPSBtZW1iYV93ZWlnaHRlZF9ob3N0Lk5ld0NoYW5uZWxzUG9saWN5KGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZGFvIiksICJnMTM2ajBtMDhwa20ybHd3ZGU5ZG1seDh1ZWUyNmxsZW50OXM1Y3BmIikKdmFyIGZlZWRQb2xpY3kgPSBtZW1iYV93ZWlnaHRlZF9ob3N0Lk5ld0ZlZWRQb2xpY3koY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iKSwgImcxMzZqMG0wOHBrbTJsd3dkZTlkbWx4OHVlZTI2bGxlbnQ5czVjcGYiKQp2YXIgYmFkZ2VzUG9saWN5ID0gbWVtYmFfd2VpZ2h0ZWRfaG9zdC5OZXdCYWRnZXNQb2xpY3koY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iKSwgImcxMzZqMG0wOHBrbTJsd3dkZTlkbWx4OHVlZTI2bGxlbnQ5czVjcGYiKQp2YXIgZXNjcm93UG9saWN5ID0gbWVtYmFfd2VpZ2h0ZWRfaG9zdC5OZXdFc2Nyb3dQb2xpY3koY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iKSwgImcxMzZqMG0wOHBrbTJsd3dkZTlkbWx4OHVlZTI2bGxlbnQ5czVjcGYiKQp2YXIgYXBwc3RvcmVQb2xpY3kgPSBtZW1iYV93ZWlnaHRlZF9ob3N0Lk5ld0FwcHN0b3JlUG9saWN5KGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZGFvIiksICJnMTM2ajBtMDhwa20ybHd3ZGU5ZG1seDh1ZWUyNmxsZW50OXM1Y3BmIiwgImcxanc3Nmx4dnpqYWZ3Mmt5amhkbnp3Z2djZnR5aG5sZmphZXIydTAiKQp2YXIgYXJjYWRlUG9saWN5ID0gbWVtYmFfd2VpZ2h0ZWRfaG9zdC5OZXdBcmNhZGVQb2xpY3koY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iKSwgImcxMzZqMG0wOHBrbTJsd3dkZTlkbWx4OHVlZTI2bGxlbnQ5czVjcGYiKQp2YXIgcXVlc3RQb2xpY3kgPSBtZW1iYV93ZWlnaHRlZF9ob3N0Lk5ld1F1ZXN0UG9saWN5KGNoYWluLlBhY2thZ2VBZGRyZXNzKCJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfZGFvIiksICJnMTM2ajBtMDhwa20ybHd3ZGU5ZG1seDh1ZWUyNmxsZW50OXM1Y3BmIikKdmFyIHJldmlld3NQb2xpY3kgPSBtZW1iYV93ZWlnaHRlZF9ob3N0Lk5ld1Jldmlld3NQb2xpY3koY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iKSwgImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9yZXZpZXdzX3YyIiwgImcxMzZqMG0wOHBrbTJsd3dkZTlkbWx4OHVlZTI2bGxlbnQ5czVjcGYiKQp2YXIgbWFya2V0UG9saWN5ID0gbWVtYmFfd2VpZ2h0ZWRfaG9zdC5OZXdNYXJrZXRQb2xpY3koY2hhaW4uUGFja2FnZUFkZHJlc3MoImduby5sYW5kL3Ivc2FtY3Jldy9tZW1iYV9kYW8iKSwgImcxanc3Nmx4dnpqYWZ3Mmt5amhkbnp3Z2djZnR5aG5sZmphZXIydTAiLCAiZzEzNmowbTA4cGttMmx3d2RlOWRtbHg4dWVlMjZsbGVudDlzNWNwZiIpCgpmdW5jIGluaXQoY3VyIHJlYWxtKSB7CiAgICBob3N0ID0gbWVtYmFfd2VpZ2h0ZWRfaG9zdC5OZXdXaXRoQXBwbGljYXRpb25zKFtdbWVtYmFfd2VpZ2h0ZWRfaG9zdC5TZWF0ewogICAgICAgIHtNZW1iZXI6IG1lbWJhX3dlaWdodGVkX3BvbGljeS5NZW1iZXJ7UGVyc29uSUQ6ICJ6eHhtYSIsIEFkZHJlc3M6ICJnMTc0N3Q1bTJmMDhwbHFqbHJqazJxMHFsZDc0NjVoeHo4Z2t4NTljIiwgRm91bmRlcjogdHJ1ZX0sIEFkbWluOiB0cnVlLCBGaW5hbmNlOiB0cnVlfSwKICAgICAgICB7TWVtYmVyOiBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuTWVtYmVye1BlcnNvbklEOiAibWlrYWVsIiwgQWRkcmVzczogImcxbHlland3bXhlZjV0bjhueDY5c2F5a21nbThybHI0eHE5eWVoM3oiLCBGb3VuZGVyOiBmYWxzZX0sIEFkbWluOiBmYWxzZSwgRmluYW5jZTogZmFsc2V9LAogICAgICAgIHtNZW1iZXI6IG1lbWJhX3dlaWdodGVkX3BvbGljeS5NZW1iZXJ7UGVyc29uSUQ6ICJnaG9zdCIsIEFkZHJlc3M6ICJnMTJ5ZzluaDRuY21hNDRlbWdtOG1zeGU4YWF2enl3dDBwOTV0YW52IiwgRm91bmRlcjogZmFsc2V9LCBBZG1pbjogZmFsc2UsIEZpbmFuY2U6IGZhbHNlfSwKICAgICAgICB7TWVtYmVyOiBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuTWVtYmVye1BlcnNvbklEOiAibWlrZWNpdG8iLCBBZGRyZXNzOiAiZzFjdnI0OHI3bDdsa212cDc3Y3I2emcyemh1MjZqZ2Z3cjB5OHBldyIsIEZvdW5kZXI6IGZhbHNlfSwgQWRtaW46IGZhbHNlLCBGaW5hbmNlOiBmYWxzZX0sCiAgICAgICAge01lbWJlcjogbWVtYmFfd2VpZ2h0ZWRfcG9saWN5Lk1lbWJlcntQZXJzb25JRDogImRhdmlkIiwgQWRkcmVzczogImcxcmF5ZmdrbHdsMGFzcHo0ODh3dnJjcnZ0N3QycXV5NnEwNmxnazIiLCBGb3VuZGVyOiBmYWxzZX0sIEFkbWluOiBmYWxzZSwgRmluYW5jZTogZmFsc2V9LAogICAgICAgIHtNZW1iZXI6IG1lbWJhX3dlaWdodGVkX3BvbGljeS5NZW1iZXJ7UGVyc29uSUQ6ICJsb3VycyIsIEFkZHJlc3M6ICJnMW52eHo5NHVrbWdnZng0bWxsZHdhZTNjcGRlOTlxbWxkdGNnbTl1IiwgRm91bmRlcjogZmFsc2V9LCBBZG1pbjogZmFsc2UsIEZpbmFuY2U6IGZhbHNlfSwKICAgICAgICB7TWVtYmVyOiBtZW1iYV93ZWlnaHRlZF9wb2xpY3kuTWVtYmVye1BlcnNvbklEOiAiZGFkaWRvdSIsIEFkZHJlc3M6ICJnMWpqZXV2NDhqM3Btc21udmdhOGp3Zm5jMmFtZnl2OWMzMHp4MDR5IiwgRm91bmRlcjogZmFsc2V9LCBBZG1pbjogZmFsc2UsIEZpbmFuY2U6IGZhbHNlfSwKICAgIH0sIG1lbWJhX3dlaWdodGVkX2hvc3QuQXBwbGljYXRpb25Qb2xpY2llc3tNYXJrZXQ6bWFya2V0UG9saWN5LCBSZXZpZXdzOnJldmlld3NQb2xpY3ksIFF1ZXN0OnF1ZXN0UG9saWN5LCBBcmNhZGU6YXJjYWRlUG9saWN5LCBBcHBzdG9yZTphcHBzdG9yZVBvbGljeSwgRXNjcm93OmVzY3Jvd1BvbGljeSwgQmFkZ2VzOmJhZGdlc1BvbGljeSwgRmVlZDpmZWVkUG9saWN5LCBDaGFubmVsczpjaGFubmVsc1BvbGljeSwgRmVlZGJhY2s6ZmVlZGJhY2tQb2xpY3l9LCBjdXIpCn0KCmZ1bmMgUHJvcG9zZVJvbGUoY3VyIHJlYWxtLCB0YXJnZXQgYWRkcmVzcywgcm9sZSBzdHJpbmcsIGdyYW50IGJvb2wpIHVpbnQ2NCB7CiAgICByZXR1cm4gaG9zdC5Qcm9wb3NlUm9sZSh0YXJnZXQsIG1lbWJhX3dlaWdodGVkX2hvc3QuUm9sZShyb2xlKSwgZ3JhbnQsIGN1cikKfQpmdW5jIFByb3Bvc2VSZWNvdmVyeShjdXIgcmVhbG0sIHBlcnNvbklEIHN0cmluZywgb2xkQWRkcmVzcywgbmV3QWRkcmVzcyBhZGRyZXNzKSB1aW50NjQgewogICAgcmV0dXJuIGhvc3QuUHJvcG9zZVJlY292ZXJ5KHBlcnNvbklELCBvbGRBZGRyZXNzLCBuZXdBZGRyZXNzLCBjdXIpCn0KZnVuYyBWb3RlKGN1ciByZWFsbSwgaWQgdWludDY0LCB2b3RlIHN0cmluZykgeyBob3N0LlZvdGUoaWQsIG1lbWJhX3dlaWdodGVkX3BvbGljeS5Wb3RlKHZvdGUpLCBjdXIpIH0KZnVuYyBFeGVjdXRlKGN1ciByZWFsbSwgaWQgdWludDY0KSB7IGlmIGhvc3QuUHJvcG9zYWwoaWQpLkZlZWRiYWNrIHsgZXhlY3V0ZUZlZWRiYWNrKGN1ciwgaWQpOyByZXR1cm4gfTsgaWYgaG9zdC5Qcm9wb3NhbChpZCkuQ2hhbm5lbHMgeyBleGVjdXRlQ2hhbm5lbHMoY3VyLCBpZCk7IHJldHVybiB9OyBpZiBob3N0LlByb3Bvc2FsKGlkKS5GZWVkIHsgZXhlY3V0ZUZlZWQoY3VyLCBpZCk7IHJldHVybiB9OyBpZiBob3N0LlByb3Bvc2FsKGlkKS5CYWRnZXMgeyBleGVjdXRlQmFkZ2VzKGN1ciwgaWQpOyByZXR1cm4gfTsgaWYgaG9zdC5Qcm9wb3NhbChpZCkuRXNjcm93IHsgZXhlY3V0ZUVzY3JvdyhjdXIsIGlkKTsgcmV0dXJuIH07IGlmIGhvc3QuUHJvcG9zYWwoaWQpLkFwcHN0b3JlIHsgZXhlY3V0ZUFwcHN0b3JlKGN1ciwgaWQpOyByZXR1cm4gfTsgaWYgaG9zdC5Qcm9wb3NhbChpZCkuQXJjYWRlIHsgZXhlY3V0ZUFyY2FkZShjdXIsIGlkKTsgcmV0dXJuIH07IGlmIGhvc3QuUHJvcG9zYWwoaWQpLlF1ZXN0IHsgZXhlY3V0ZVF1ZXN0KGN1ciwgaWQpOyByZXR1cm4gfTsKICAgIGlmIGhvc3QuUHJvcG9zYWwoaWQpLlJldmlld3MgeyBleGVjdXRlUmV2aWV3cyhjdXIsIGlkKTsgcmV0dXJuIH0KICAgIGlmIGhvc3QuUHJvcG9zYWwoaWQpLk1hcmtldCB7IGV4ZWN1dGVNYXJrZXQoY3VyLCBpZCkgfSBlbHNlIHsgaG9zdC5FeGVjdXRlKGlkLCBjdXIpIH0KfQpmdW5jIEdldENvbmZpZ0pTT04oKSBzdHJpbmcgeyByZXR1cm4gaG9zdC5Db25maWdKU09OKCkgfQpmdW5jIEdldE1lbWJlcnNKU09OKCkgc3RyaW5nIHsgcmV0dXJuIGhvc3QuTWVtYmVyc0pTT04oKSB9CmZ1bmMgR2V0UHJvcG9zYWxKU09OKGlkIHVpbnQ2NCkgc3RyaW5nIHsgcmV0dXJuIGhvc3QuUHJvcG9zYWxKU09OKGlkKSB9CmZ1bmMgR2V0UHJvcG9zYWxzSlNPTihiZWZvcmUgdWludDY0LCBsaW1pdCBpbnQpIHN0cmluZyB7IHJldHVybiBob3N0LlByb3Bvc2Fsc0pTT04oYmVmb3JlLCBsaW1pdCkgfQpmdW5jIEdldEJhbGxvdEpTT04ocHJvcG9zYWxJRCBzdHJpbmcsIHZvdGVyIGFkZHJlc3MpIHN0cmluZyB7IHJldHVybiBob3N0LkJhbGxvdEpTT04ocHJvcG9zYWxJRCwgdm90ZXIpIH0KZnVuYyBHZXRQZW5kaW5nVm90ZXNKU09OKHZvdGVyIGFkZHJlc3MsIGJlZm9yZSBzdHJpbmcsIGxpbWl0IGludCkgc3RyaW5nIHsgcmV0dXJuIGhvc3QuUGVuZGluZ1ZvdGVzSlNPTih2b3RlciwgYmVmb3JlLCBsaW1pdCkgfQoKZnVuYyBSZW5kZXIocGF0aCBzdHJpbmcpIHN0cmluZyB7CiAgICByZXR1cm4gIiMgTWVtYmEgREFPXG5cbiMjIE1lbWJlcnMgKDcpXG5cbk9uZSBmb3VuZGVyIHdpdGggMiB2b3RpbmcgcG9pbnRzIGFuZCBzaXggZXF1YWwgY29yZSBkZXZlbG9wZXJzIHdpdGggMSBwb2ludCBlYWNoLlxuXG5Sb2xlIGNoYW5nZXMgYW5kIG1lbWJlci1rZXkgcmVjb3ZlcnkgcmVxdWlyZSA2IHBvaW50cyBhbmQgYXQgbGVhc3QgNCBwZW9wbGUgYWZ0ZXIgMjQgaG91cnMsIG9yIDUgY29yZSBkZXZlbG9wZXJzIGFmdGVyIDcyIGhvdXJzLiBWb3RpbmcgY2xvc2VzIGFmdGVyIDcgZGF5czsgcXVhbGlmaWVkIHByb3Bvc2FscyByZXRhaW4gdGhlaXIgZXhlY3V0aW9uIGRlbGF5LlxuXG5GaXhlZCBnb3Zlcm5hbmNlIG9mIG1hcmtldCBjb25maWcsIHJldmlld3MsIHF1ZXN0cywgYXJjYWRlLCBBcHAgU3RvcmUsIGVzY3JvdywgYmFkZ2VzLCBmZWVkLCBjaGFubmVscyBhbmQgZmVlZGJhY2sgaXMgYXZhaWxhYmxlLiBBIHJldHVybiBwcm9wb3NhbCBvbmx5IHN0YWdlcyB0aGUgY29uZmlndXJlZCBzdWNjZXNzb3I7IHNlcGFyYXRlIGFjY2VwdGFuY2UgaXMgcmVxdWlyZWQuIERBTyBzdGF0ZSBtaWdyYXRpb24gYW5kIHRyZWFzdXJ5IHNwZW5kaW5nIGFyZSBub3QgZW5hYmxlZC4iCn0KGrUOChFxdWVzdF9hZGFwdGVyLmdubxKfDi8vIENsb3NlZCwgZml4ZWQtdGFyZ2V0IHF1ZXN0IGF1dGhvcml0eSBhZGFwdGVyLiBOZXZlciByZWNvdmVyIGRpc3BhdGNoIGZhaWx1cmVzLgpwYWNrYWdlIG1lbWJhX2RhbwoKaW1wb3J0ICgKICAgICJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfaG9zdCIKICAgICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfcXVlc3RfYXR0ZXN0YXRpb25fdjEiCikKZnVuYyBxdWVzdFN0YXRlKCkgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5RdWVzdFN0YXRlIHsKICAgIHJldHVybiBtZW1iYV93ZWlnaHRlZF9ob3N0LlF1ZXN0U3RhdGV7T3duZXI6YWRkcmVzcyhtZW1iYV9xdWVzdF9hdHRlc3RhdGlvbl92MS5HZXRPd25lcigpKSxQZW5kaW5nT3duZXI6YWRkcmVzcyhtZW1iYV9xdWVzdF9hdHRlc3RhdGlvbl92MS5HZXRQZW5kaW5nT3duZXIoKSksU2lnbmVyOm1lbWJhX3F1ZXN0X2F0dGVzdGF0aW9uX3YxLkdldFNpZ25lcigpfQp9CmZ1bmMgUHJvcG9zZVF1ZXN0QWNjZXB0KGN1ciByZWFsbSkgdWludDY0IHsgcmV0dXJuIGhvc3QuUHJvcG9zZVF1ZXN0KHF1ZXN0UG9saWN5LkFjY2VwdCgpLHF1ZXN0U3RhdGUoKSxjdXIpIH0KZnVuYyBQcm9wb3NlUXVlc3RTaWduZXIoY3VyIHJlYWxtLCBrZXkgc3RyaW5nKSB1aW50NjQgeyByZXR1cm4gaG9zdC5Qcm9wb3NlUXVlc3QobWVtYmFfd2VpZ2h0ZWRfaG9zdC5RdWVzdFNpZ25lcihrZXkpLHF1ZXN0U3RhdGUoKSxjdXIpIH0KZnVuYyBQcm9wb3NlUXVlc3RSZXR1cm4oY3VyIHJlYWxtKSB1aW50NjQgeyByZXR1cm4gaG9zdC5Qcm9wb3NlUXVlc3QocXVlc3RQb2xpY3kuUmV0dXJuKCkscXVlc3RTdGF0ZSgpLGN1cikgfQpmdW5jIFByb3Bvc2VRdWVzdEFib3J0UmV0dXJuKGN1ciByZWFsbSkgdWludDY0IHsgcmV0dXJuIGhvc3QuUHJvcG9zZVF1ZXN0KHF1ZXN0UG9saWN5LkFib3J0UmV0dXJuKCkscXVlc3RTdGF0ZSgpLGN1cikgfQpmdW5jIGV4ZWN1dGVRdWVzdChjdXIgcmVhbG0saWQgdWludDY0KSB7CiAgICBiZWZvcmU6PXF1ZXN0U3RhdGUoKTthOj1ob3N0LkNvbnN1bWVRdWVzdChpZCxiZWZvcmUsY3VyKTtleHBlY3RlZDo9YmVmb3JlCiAgICBzd2l0Y2ggYS5LaW5kKCkgewogICAgY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LlF1ZXN0QWNjZXB0T3duZXI6CiAgICAgICAgZXhwZWN0ZWQuT3duZXI9cXVlc3RQb2xpY3kuREFPKCk7ZXhwZWN0ZWQuUGVuZGluZ093bmVyPSIiO21lbWJhX3F1ZXN0X2F0dGVzdGF0aW9uX3YxLkFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpKQogICAgY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LlF1ZXN0U2V0U2lnbmVyOgogICAgICAgIGV4cGVjdGVkLlNpZ25lcj1hLktleSgpO21lbWJhX3F1ZXN0X2F0dGVzdGF0aW9uX3YxLlNldFNpZ25lcihjcm9zcyhjdXIpLGEuS2V5KCkpCiAgICBjYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuUXVlc3RSZXR1cm5Pd25lcjoKICAgICAgICBleHBlY3RlZC5QZW5kaW5nT3duZXI9YS5SZWNpcGllbnQoKTttZW1iYV9xdWVzdF9hdHRlc3RhdGlvbl92MS5UcmFuc2Zlck93bmVyc2hpcChjcm9zcyhjdXIpLGEuUmVjaXBpZW50KCkpCiAgICBjYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuUXVlc3RBYm9ydFJldHVybjoKICAgICAgICBleHBlY3RlZC5QZW5kaW5nT3duZXI9IiI7bWVtYmFfcXVlc3RfYXR0ZXN0YXRpb25fdjEuQ2FuY2VsT3duZXJzaGlwVHJhbnNmZXIoY3Jvc3MoY3VyKSkKICAgIGRlZmF1bHQ6cGFuaWMoInVuc3VwcG9ydGVkIHF1ZXN0IGFjdGlvbiIpCiAgICB9CiAgICBpZiBxdWVzdFN0YXRlKCkhPWV4cGVjdGVkIHsgcGFuaWMoInF1ZXN0IHBvc3Rjb25kaXRpb24gbWlzbWF0Y2giKSB9Cn0KGp8XChNyZXZpZXdzX2FkYXB0ZXIuZ25vEocXLy8gRml4ZWQgcmV2aWV3cyB0YXJnZXQgY2hvc2VuIG9uY2UgZHVyaW5nIGdlbmVyYXRpb24uIE5ldmVyIGltcG9ydHMgYm90aCB2ZXJzaW9ucy4KcGFja2FnZSBtZW1iYV9kYW8KaW1wb3J0ICgKICAgICJnbm8ubGFuZC9wL3NhbWNyZXcvbWVtYmFfd2VpZ2h0ZWRfaG9zdCIKICAgICJnbm8ubGFuZC9yL3NhbWNyZXcvbWVtYmFfcmV2aWV3c192MiIKKQpmdW5jIHJldmlld3NTdGF0ZShhIG1lbWJhX3dlaWdodGVkX2hvc3QuUmV2aWV3c0FjdGlvbikgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5SZXZpZXdzU3RhdGUgewogICAgcyA6PSBtZW1iYV93ZWlnaHRlZF9ob3N0LlJldmlld3NTdGF0ZXtNb2RlcmF0b3I6YWRkcmVzcyhtZW1iYV9yZXZpZXdzX3YyLkdldE1vZGVyYXRvcigpKSxQZW5kaW5nTW9kZXJhdG9yOmFkZHJlc3MobWVtYmFfcmV2aWV3c192Mi5HZXRQZW5kaW5nTW9kZXJhdG9yKCkpfQogICAgaWYgYS5JRCgpICE9IDAgewogICAgICAgIGkgOj0gbWVtYmFfcmV2aWV3c192Mi5HZXRNb2RlcmF0aW9uU3RhdGUoYS5JRCgpKQogICAgICAgIHMuSXRlbSA9IG1lbWJhX3dlaWdodGVkX2hvc3QuUmV2aWV3c0l0ZW17SUQ6aS5JRCwgUmV2aWV3OmkuUmV2aWV3LCBQYXJlbnRJRDppLlBhcmVudElELCBTdWJqZWN0OmkuU3ViamVjdCwgQXV0aG9yOmkuQXV0aG9yLCBSYXRpbmc6aS5SYXRpbmcsIEJvZHlIYXNoOmkuQm9keUhhc2gsIENyZWF0ZWRBdDppLkNyZWF0ZWRBdCwgRWRpdGVkQXQ6aS5FZGl0ZWRBdCwgSGlkZGVuOmkuSGlkZGVuLCBEZWxldGVkOmkuRGVsZXRlZCwgRmxhZ2dlZDppLkZsYWdnZWR9CiAgICB9CiAgICByZXR1cm4gcwp9CmZ1bmMgUHJvcG9zZVJldmlld3NBY2NlcHQoY3VyIHJlYWxtKSB1aW50NjQgeyBhIDo9IHJldmlld3NQb2xpY3kuQWNjZXB0KCk7IHJldHVybiBob3N0LlByb3Bvc2VSZXZpZXdzKGEscmV2aWV3c1N0YXRlKGEpLGN1cikgfQpmdW5jIFByb3Bvc2VSZXZpZXdzUmV0dXJuKGN1ciByZWFsbSkgdWludDY0IHsgYSA6PSByZXZpZXdzUG9saWN5LlJldHVybigpOyByZXR1cm4gaG9zdC5Qcm9wb3NlUmV2aWV3cyhhLHJldmlld3NTdGF0ZShhKSxjdXIpIH0KZnVuYyBQcm9wb3NlUmV2aWV3c0Fib3J0UmV0dXJuKGN1ciByZWFsbSkgdWludDY0IHsgYSA6PSByZXZpZXdzUG9saWN5LkFib3J0UmV0dXJuKCk7IHJldHVybiBob3N0LlByb3Bvc2VSZXZpZXdzKGEscmV2aWV3c1N0YXRlKGEpLGN1cikgfQpmdW5jIFByb3Bvc2VSZXZpZXdzSGlkZVJldmlldyhjdXIgcmVhbG0sIGlkIHVpbnQ2NCkgdWludDY0IHsgYSA6PSByZXZpZXdzUG9saWN5LkhpZGVSZXZpZXcoaWQpOyByZXR1cm4gaG9zdC5Qcm9wb3NlUmV2aWV3cyhhLHJldmlld3NTdGF0ZShhKSxjdXIpIH0KZnVuYyBQcm9wb3NlUmV2aWV3c0hpZGVDb21tZW50KGN1ciByZWFsbSwgaWQgdWludDY0KSB1aW50NjQgeyBhIDo9IHJldmlld3NQb2xpY3kuSGlkZUNvbW1lbnQoaWQpOyByZXR1cm4gaG9zdC5Qcm9wb3NlUmV2aWV3cyhhLHJldmlld3NTdGF0ZShhKSxjdXIpIH0KZnVuYyBQcm9wb3NlUmV2aWV3c1VuaGlkZShjdXIgcmVhbG0sIGlkIHVpbnQ2NCkgdWludDY0IHsgYSA6PSByZXZpZXdzUG9saWN5LlVuaGlkZShpZCk7IHJldHVybiBob3N0LlByb3Bvc2VSZXZpZXdzKGEscmV2aWV3c1N0YXRlKGEpLGN1cikgfQpmdW5jIGV4ZWN1dGVSZXZpZXdzKGN1ciByZWFsbSwgaWQgdWludDY0KSB7CiAgICBwcm9wb3NlZCA6PSBob3N0LlByb3Bvc2FsKGlkKS5SZXZpZXdzQWN0aW9uCiAgICBiZWZvcmUgOj0gcmV2aWV3c1N0YXRlKHByb3Bvc2VkKQogICAgYSA6PSBob3N0LkNvbnN1bWVSZXZpZXdzKGlkLGJlZm9yZSxjdXIpCiAgICBleHBlY3RlZCA6PSBiZWZvcmUKICAgIHN3aXRjaCBhLktpbmQoKSB7CiAgICBjYXNlIG1lbWJhX3dlaWdodGVkX2hvc3QuUmV2aWV3c0FjY2VwdE1vZGVyYXRvcjoKICAgICAgICBleHBlY3RlZC5Nb2RlcmF0b3IgPSByZXZpZXdzUG9saWN5LkRBTygpOyBleHBlY3RlZC5QZW5kaW5nTW9kZXJhdG9yID0gIiIKICAgICAgICBtZW1iYV9yZXZpZXdzX3YyLkFjY2VwdE93bmVyc2hpcChjcm9zcyhjdXIpKQogICAgY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LlJldmlld3NSZXR1cm5Nb2RlcmF0b3I6CiAgICAgICAgZXhwZWN0ZWQuUGVuZGluZ01vZGVyYXRvciA9IGEuUmVjaXBpZW50KCkKICAgICAgICBtZW1iYV9yZXZpZXdzX3YyLlRyYW5zZmVyT3duZXJzaGlwKGNyb3NzKGN1ciksYS5SZWNpcGllbnQoKSkKICAgIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5SZXZpZXdzQWJvcnRSZXR1cm46CiAgICAgICAgZXhwZWN0ZWQuUGVuZGluZ01vZGVyYXRvciA9ICIiCiAgICAgICAgbWVtYmFfcmV2aWV3c192Mi5DYW5jZWxPd25lcnNoaXBUcmFuc2Zlcihjcm9zcyhjdXIpKQogICAgY2FzZSBtZW1iYV93ZWlnaHRlZF9ob3N0LlJldmlld3NIaWRlUmV2aWV3OgogICAgICAgIGV4cGVjdGVkLkl0ZW0uSGlkZGVuID0gdHJ1ZQogICAgICAgIG1lbWJhX3Jldmlld3NfdjIuSGlkZVJldmlldyhjcm9zcyhjdXIpLGEuSUQoKSkKICAgIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5SZXZpZXdzSGlkZUNvbW1lbnQ6CiAgICAgICAgZXhwZWN0ZWQuSXRlbS5IaWRkZW4gPSB0cnVlCiAgICAgICAgbWVtYmFfcmV2aWV3c192Mi5IaWRlQ29tbWVudChjcm9zcyhjdXIpLGEuSUQoKSkKICAgIGNhc2UgbWVtYmFfd2VpZ2h0ZWRfaG9zdC5SZXZpZXdzVW5oaWRlOgogICAgICAgIGV4cGVjdGVkLkl0ZW0uSGlkZGVuID0gZmFsc2U7IGV4cGVjdGVkLkl0ZW0uRmxhZ2dlZCA9IGZhbHNlCiAgICAgICAgbWVtYmFfcmV2aWV3c192Mi5VbmhpZGUoY3Jvc3MoY3VyKSxhLklEKCkpCiAgICBkZWZhdWx0OiBwYW5pYygidW5zdXBwb3J0ZWQgcmV2aWV3cyBhY3Rpb24iKQogICAgfQogICAgaWYgcmV2aWV3c1N0YXRlKGEpICE9IGV4cGVjdGVkIHsgcGFuaWMoInJldmlld3MgcG9zdGNvbmRpdGlvbiBtaXNtYXRjaCIpIH0KfQoiIgoTL2duby5NZW1QYWNrYWdlVHlwZRILCglNUFVzZXJBbGwiDTI4MDAwMDAwdWdub3QSEgiA3vNoEgsyMjAwMDB1Z25vdBqIAwrNAQoSL3RtLlB1YktleU11bHRpc2lnErYBCAISOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDXU7K848tqANWyscQogEgTFVEXmW3vBUKP59RlEEvX+0SOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDKOOJ3rhkJhDgSaVn8LeWBXf9fD3IHUtT4nWr6t2RpngSOgoTL3RtLlB1YktleVNlY3AyNTZrMRIjCiEDIOV/XirsLZoGpqv9CvKHp1VH1UALFVlXp85ozdflgQASiwEKBQgDEgGgEkD9pE1ZLsm7wfgXbhw6jnyePceCAjwCRN3H2Zi4edJHbBTz577sEFEvbu/Z0/SRnE9PpLIpXRxC14kt8lX1Vd8ZEkBmf+N83iTeEJ2knAoBPPGXb8FEOVQo4v5JZEexY62SKX8bu6cWKTL+YUhQ3l1GE0n/Tv+8VV3fc85d4Jsl4i8hGihnMXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcXFxcWx1dXhl

Raw transaction data

Raw JSON data