{ "name": "EscrowContract", "structs": { "MediatorData": [ { "name": "address", "type": "address" }, { "name": "bond_amount", "type": "uint64" }, { "name": "is_bonded", "type": "uint64" }, { "name": "did_hash", "type": "byte[32]" } ] }, "methods": [ { "name": "deploy", "args": [], "returns": { "type": "void" }, "actions": { "create": [ "NoOp" ], "call": [] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "create_bounty", "args": [ { "type": "byte[]", "name": "bounty_id" }, { "type": "uint64", "name": "escrow_amount" }, { "type": "uint64", "name": "is_hitm" }, { "type": "uint64", "name": "asset_id" }, { "type": "uint64", "name": "review_days" }, { "type": "address", "name": "mediator" }, { "type": "address", "name": "treasury" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "claim_bounty", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "submit_work", "args": [ { "type": "byte[]", "name": "proof_url" }, { "type": "byte[]", "name": "proof_data" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "approve_work", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "reject_work", "args": [ { "type": "byte[]", "name": "reason" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "submit_dispute", "args": [ { "type": "byte[]", "name": "reason" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "vote_dispute", "args": [ { "type": "uint64", "name": "vote_option" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "resolve_dispute", "args": [ { "type": "byte[]", "name": "resolution" }, { "type": "byte[]", "name": "mediator_signature" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "auto_resolve_creator_win", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "timeout_dispute", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "auto_release", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "claim_abandoned", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "expire_claim", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "github_verify", "args": [ { "type": "byte[]", "name": "pr_url" }, { "type": "byte[]", "name": "test_hash" }, { "type": "byte[]", "name": "oidc_token" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "set_github_status", "args": [ { "type": "byte[]", "name": "status" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "get_bounty_info", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "register_arbitrator", "args": [ { "type": "address", "name": "address" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "deregister_arbitrator", "args": [ { "type": "address", "name": "address" } ], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "events": [], "recommendations": {} }, { "name": "delete_bounty", "args": [], "returns": { "type": "void" }, "actions": { "create": [], "call": [ "DeleteApplication" ] }, "readonly": false, "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "networks": {}, "state": { "schema": { "global": { "ints": 0, "bytes": 0 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": {}, "local": {}, "box": { "payout_type": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cGF5b3V0X3R5cGU=" }, "is_hitm": { "keyType": "AVMString", "valueType": "uint64", "key": "aXNfaGl0bQ==" }, "review_deadline": { "keyType": "AVMString", "valueType": "uint64", "key": "cmV2aWV3X2RlYWRsaW5l" }, "rejection_count": { "keyType": "AVMString", "valueType": "uint64", "key": "cmVqZWN0aW9uX2NvdW50" }, "escrow_amount": { "keyType": "AVMString", "valueType": "uint64", "key": "ZXNjcm93X2Ftb3VudA==" }, "asset_id": { "keyType": "AVMString", "valueType": "uint64", "key": "YXNzZXRfaWQ=" }, "creator_address": { "keyType": "AVMString", "valueType": "address", "key": "Y3JlYXRvcl9hZGRyZXNz" }, "agent_address": { "keyType": "AVMString", "valueType": "address", "key": "YWdlbnRfYWRkcmVzcw==" }, "proof_url": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cHJvb2ZfdXJs" }, "proof_data": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "cHJvb2ZfZGF0YQ==" }, "bounty_id": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "Ym91bnR5X2lk" }, "dispute_reason": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "ZGlzcHV0ZV9yZWFzb24=" }, "dispute_initiator": { "keyType": "AVMString", "valueType": "address", "key": "ZGlzcHV0ZV9pbml0aWF0b3I=" }, "claim_deadline": { "keyType": "AVMString", "valueType": "uint64", "key": "Y2xhaW1fZGVhZGxpbmU=" }, "claim_timestamp": { "keyType": "AVMString", "valueType": "uint64", "key": "Y2xhaW1fdGltZXN0YW1w" }, "github_status": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "Z2l0aHViX3N0YXR1cw==" }, "dispute_timestamp": { "keyType": "AVMString", "valueType": "uint64", "key": "ZGlzcHV0ZV90aW1lc3RhbXA=" }, "review_days": { "keyType": "AVMString", "valueType": "uint64", "key": "cmV2aWV3X2RheXM=" }, "state_box": { "keyType": "AVMString", "valueType": "uint64", "key": "c3RhdGU=" }, "mediator_data": { "keyType": "AVMString", "valueType": "MediatorData", "key": "bWVkaWF0b3JfZGF0YQ==" }, "treasury_address": { "keyType": "AVMString", "valueType": "address", "key": "dHJlYXN1cnlfYWRkcmVzcw==" }, "oidc_token": { "keyType": "AVMString", "valueType": "AVMBytes", "key": "b2lkY190b2tlbg==" }, "candidate_count": { "keyType": "AVMString", "valueType": "uint64", "key": "Y2FuZGlkYXRlX2NvdW50" }, "arbitrator_1": { "keyType": "AVMString", "valueType": "address", "key": "YXJiaXRyYXRvcl8x" }, "arbitrator_2": { "keyType": "AVMString", "valueType": "address", "key": "YXJiaXRyYXRvcl8y" }, "arbitrator_3": { "keyType": "AVMString", "valueType": "address", "key": "YXJiaXRyYXRvcl8z" }, "arbitrator_1_vote": { "keyType": "AVMString", "valueType": "uint64", "key": "YXJiaXRyYXRvcl8xX3ZvdGU=" }, "arbitrator_2_vote": { "keyType": "AVMString", "valueType": "uint64", "key": "YXJiaXRyYXRvcl8yX3ZvdGU=" }, "arbitrator_3_vote": { "keyType": "AVMString", "valueType": "uint64", "key": "YXJiaXRyYXRvcl8zX3ZvdGU=" } } }, "maps": { "global": {}, "local": {}, "box": {} } }, "bareActions": { "create": [], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 4164 ], "errorMessage": "Arbitrator already registered" }, { "pc": [ 4262 ], "errorMessage": "Arbitrator not registered" }, { "pc": [ 1030 ], "errorMessage": "Bounty already claimed" }, { "pc": [ 815 ], "errorMessage": "Bounty already initialized" }, { "pc": [ 2227 ], "errorMessage": "Bounty is not disputed" }, { "pc": [ 4377 ], "errorMessage": "Bounty must be fully closed/paid out before deletion" }, { "pc": [ 1024 ], "errorMessage": "Cannot claim your own bounty" }, { "pc": [ 3745 ], "errorMessage": "Claim deadline not yet reached" }, { "pc": [ 1053 ], "errorMessage": "Claiming agent must opt-in to the asset first" }, { "pc": [ 4441 ], "errorMessage": "Contract is not opted into the asset" }, { "pc": [ 3274 ], "errorMessage": "Dispute timeout not yet reached" }, { "pc": [ 4323 ], "errorMessage": "Failed to delete address box" }, { "pc": [ 4327 ], "errorMessage": "Failed to delete index box" }, { "pc": [ 4451 ], "errorMessage": "Failed to read contract balance" }, { "pc": [ 4445 ], "errorMessage": "Insufficient asset balance" }, { "pc": [ 4455 ], "errorMessage": "Insufficient contract balance" }, { "pc": [ 2912 ], "errorMessage": "Invalid mediator signature" }, { "pc": [ 1288 ], "errorMessage": "Invalid state for submit_work" }, { "pc": [ 2247 ], "errorMessage": "Invalid vote option" }, { "pc": [ 1181, 1307 ], "errorMessage": "Only claiming agent can submit work" }, { "pc": [ 1471 ], "errorMessage": "Only creator can approve work" }, { "pc": [ 4369 ], "errorMessage": "Only creator can delete application" }, { "pc": [ 1624 ], "errorMessage": "Only creator can reject work" }, { "pc": [ 2283 ], "errorMessage": "Sender is not an assigned arbitrator with a pending vote" }, { "pc": [ 4252 ], "errorMessage": "Sender must match address to deregister" }, { "pc": [ 4153 ], "errorMessage": "Sender must match address to register" }, { "pc": [ 1964, 2041, 2126, 4296 ], "errorMessage": "check Box exists" }, { "pc": [ 1179, 4114 ], "errorMessage": "check self.agent_address exists" }, { "pc": [ 2259, 2491 ], "errorMessage": "check self.arbitrator_1 exists" }, { "pc": [ 2267, 2312, 2399 ], "errorMessage": "check self.arbitrator_1_vote exists" }, { "pc": [ 2507, 2734 ], "errorMessage": "check self.arbitrator_2 exists" }, { "pc": [ 2320, 2407, 2744 ], "errorMessage": "check self.arbitrator_2_vote exists" }, { "pc": [ 2523, 2764 ], "errorMessage": "check self.arbitrator_3 exists" }, { "pc": [ 2327, 2414, 2774 ], "errorMessage": "check self.arbitrator_3_vote exists" }, { "pc": [ 3771, 3955, 4098 ], "errorMessage": "check self.bounty_id exists" }, { "pc": [ 3740 ], "errorMessage": "check self.claim_deadline exists" }, { "pc": [ 1022, 1469, 1622, 1732, 1827, 2588, 2621, 3065, 3199, 3361, 3596, 3683, 4109, 4367, 4392 ], "errorMessage": "check self.creator_address exists" }, { "pc": [ 3103, 3264 ], "errorMessage": "check self.dispute_timestamp exists" }, { "pc": [ 1475, 2357, 2916, 3131, 3278, 3445, 3602, 4103 ], "errorMessage": "check self.escrow_amount exists" }, { "pc": [ 1543, 2899, 2998, 3052, 3186, 3348, 3513, 3670 ], "errorMessage": "check self.mediator_data exists" }, { "pc": [ 4119 ], "errorMessage": "check self.rejection_count exists" }, { "pc": [ 3436 ], "errorMessage": "check self.review_deadline exists" }, { "pc": [ 1014, 1166, 1460, 1613, 1711, 2222, 2848, 3094, 3255, 3415, 3572, 3732, 3894, 4091, 4372 ], "errorMessage": "check self.state_box exists" }, { "pc": [ 1532, 1821, 2476, 2986, 3040, 3175, 3337, 3502, 3659 ], "errorMessage": "check self.treasury_address exists" }, { "pc": [ 711, 1123, 1139, 1586, 1684, 2803, 2820, 3835, 3851, 3867, 3967 ], "errorMessage": "invalid array length header" }, { "pc": [ 718, 1130, 1146, 1593, 1691, 2810, 2827, 3842, 3858, 3874, 3974 ], "errorMessage": "invalid number of bytes for arc4.dynamic_array" }, { "pc": [ 784, 795, 4133, 4232 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 731, 744, 757, 770, 2203 ], "errorMessage": "invalid number of bytes for arc4.uint64" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMiA2IDEwMDAwIDg2NDAwIFRNUExfQ0xBSU1fVElNRU9VVCBUTVBMX0RJU1BVVEVfVElNRU9VVAogICAgYnl0ZWNibG9jayAic3RhdGUiICJwYXlvdXRfdHlwZSIgMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwICJjcmVhdG9yX2FkZHJlc3MiICJ0cmVhc3VyeV9hZGRyZXNzIiAibWVkaWF0b3JfZGF0YSIgImVzY3Jvd19hbW91bnQiICJhc3NldF9pZCIgInJlamVjdGlvbl9jb3VudCIgMHg2MzYxNmU2NDVmNjE2NDY0NzI1ZiAiYWdlbnRfYWRkcmVzcyIgInByb29mX3VybCIgInByb29mX2RhdGEiICJib3VudHlfaWQiICJjYW5kaWRhdGVfY291bnQiICJhcmJpdHJhdG9yXzFfdm90ZSIgImFyYml0cmF0b3JfMl92b3RlIiAiYXJiaXRyYXRvcl8zX3ZvdGUiICJpc19oaXRtIiAweDUwNDE1OTRmNTU1NCAweDUyNDU0NjU1NGU0NCAiZ2l0aHViX3N0YXR1cyIgInJldmlld19kYXlzIiAicmV2aWV3X2RlYWRsaW5lIiAiZGlzcHV0ZV90aW1lc3RhbXAiICJhcmJpdHJhdG9yXzEiICJhcmJpdHJhdG9yXzIiICJhcmJpdHJhdG9yXzMiIDB4NzA2NTZlNjQ2OTZlNjcgMHg2MzYxNmU2NDVmNjk2NDc4NWYgImNsYWltX2RlYWRsaW5lIiAiZGlzcHV0ZV9yZWFzb24iIDB4NjQ2OTczNzA3NTc0NjU1ZjcyNjU3MzZmNmM3NjY1NjQ1ZjYxNjc2NTZlNzQ1Zjc3Njk2ZSAweDY0Njk3MzcwNzU3NDY1NWY3MjY1NzM2ZjZjNzY2NTY0NWY2MzcyNjU2MTc0NmY3MjVmNzc2OTZlIDB4NTM1MDRjNDk1NCAib2lkY190b2tlbiIKICAgIC8vIGVzY3Jvdy5weTo0NgogICAgLy8gY2xhc3MgRXNjcm93Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHB1c2hieXRlcyAweDFmZjBkN2QyIC8vIG1ldGhvZCAiZGVsZXRlX2JvdW50eSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIG1haW5fZGVsZXRlX2JvdW50eV9yb3V0ZUA0CgptYWluX3N3aXRjaF9jYXNlX25leHRANToKICAgIC8vIGVzY3Jvdy5weTo0NgogICAgLy8gY2xhc3MgRXNjcm93Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJ6IG1haW5fY3JlYXRlX05vT3BAMjYKICAgIHB1c2hieXRlc3MgMHgyODJmMTc3MCAweDRiYzg2N2E2IDB4MjUwOTkzN2MgMHg0MGMzMDY3ZiAweDc3OWVjNjNlIDB4ZTA1YmM5MzUgMHg3YjM1NzlhYiAweGI3NDAyMTUyIDB4ZmU2Y2UxMDIgMHg5NTVmY2M4MSAweGFhZTA0YjJjIDB4ODRmMGFlMjcgMHg4Yjc2YjI2YyAweGRhNzkxNzA0IDB4MTE3ZWY0ZDkgMHg3ZjU4OWNjMiAweDVhMWJhNmJiIDB4ZmRkODk5MDAgLy8gbWV0aG9kICJjcmVhdGVfYm91bnR5KGJ5dGVbXSx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYWRkcmVzcyxhZGRyZXNzKXZvaWQiLCBtZXRob2QgImNsYWltX2JvdW50eSgpdm9pZCIsIG1ldGhvZCAic3VibWl0X3dvcmsoYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJhcHByb3ZlX3dvcmsoKXZvaWQiLCBtZXRob2QgInJlamVjdF93b3JrKGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJzdWJtaXRfZGlzcHV0ZShieXRlW10pdm9pZCIsIG1ldGhvZCAidm90ZV9kaXNwdXRlKHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJyZXNvbHZlX2Rpc3B1dGUoYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJhdXRvX3Jlc29sdmVfY3JlYXRvcl93aW4oKXZvaWQiLCBtZXRob2QgInRpbWVvdXRfZGlzcHV0ZSgpdm9pZCIsIG1ldGhvZCAiYXV0b19yZWxlYXNlKCl2b2lkIiwgbWV0aG9kICJjbGFpbV9hYmFuZG9uZWQoKXZvaWQiLCBtZXRob2QgImV4cGlyZV9jbGFpbSgpdm9pZCIsIG1ldGhvZCAiZ2l0aHViX3ZlcmlmeShieXRlW10sYnl0ZVtdLGJ5dGVbXSl2b2lkIiwgbWV0aG9kICJzZXRfZ2l0aHViX3N0YXR1cyhieXRlW10pdm9pZCIsIG1ldGhvZCAiZ2V0X2JvdW50eV9pbmZvKCl2b2lkIiwgbWV0aG9kICJyZWdpc3Rlcl9hcmJpdHJhdG9yKGFkZHJlc3Mpdm9pZCIsIG1ldGhvZCAiZGVyZWdpc3Rlcl9hcmJpdHJhdG9yKGFkZHJlc3Mpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIGNyZWF0ZV9ib3VudHkgY2xhaW1fYm91bnR5IHN1Ym1pdF93b3JrIGFwcHJvdmVfd29yayByZWplY3Rfd29yayBzdWJtaXRfZGlzcHV0ZSB2b3RlX2Rpc3B1dGUgcmVzb2x2ZV9kaXNwdXRlIGF1dG9fcmVzb2x2ZV9jcmVhdG9yX3dpbiB0aW1lb3V0X2Rpc3B1dGUgYXV0b19yZWxlYXNlIGNsYWltX2FiYW5kb25lZCBleHBpcmVfY2xhaW0gZ2l0aHViX3ZlcmlmeSBzZXRfZ2l0aHViX3N0YXR1cyBnZXRfYm91bnR5X2luZm8gcmVnaXN0ZXJfYXJiaXRyYXRvciBkZXJlZ2lzdGVyX2FyYml0cmF0b3IKICAgIGVycgoKbWFpbl9jcmVhdGVfTm9PcEAyNjoKICAgIC8vIGVzY3Jvdy5weTo0NgogICAgLy8gY2xhc3MgRXNjcm93Q29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHB1c2hieXRlcyAweDczOWIwODg5IC8vIG1ldGhvZCAiZGVwbG95KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9kZXBsb3lfcm91dGVAMjcKICAgIGVycgoKbWFpbl9kZXBsb3lfcm91dGVAMjc6CiAgICAvLyBlc2Nyb3cucHk6MTQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCm1haW5fZGVsZXRlX2JvdW50eV9yb3V0ZUA0OgogICAgLy8gZXNjcm93LnB5Ojc5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICA9PQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICYmCiAgICBhc3NlcnQKICAgIGIgZGVsZXRlX2JvdW50eQoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5jcmVhdGVfYm91bnR5W3JvdXRpbmddKCkgLT4gdm9pZDoKY3JlYXRlX2JvdW50eToKICAgIC8vIGVzY3Jvdy5weToxNDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgOAogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50NjQKICAgIGJ0b2kKICAgIGNvdmVyIDQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGR1cAogICAgY292ZXIgNQogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGR1cAogICAgY292ZXIgNQogICAgbGVuCiAgICBwdXNoaW50IDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIGVzY3Jvdy5weToxNTgKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToxNTkKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjE2MAogICAgLy8gYXNzZXJ0IFR4bi5yZWtleV90byA9PSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICB0eG4gUmVrZXlUbwogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToxNjItMTYzCiAgICAvLyAjIFNFQ1VSSVRZIEZJWDogUHJldmVudCByZS1pbml0aWFsaXphdGlvbgogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLnN0YXRlX2JveC5tYXliZSgpCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gZXNjcm93LnB5OjE2NAogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMsICJCb3VudHkgYWxyZWFkeSBpbml0aWFsaXplZCIKICAgICEKICAgIGFzc2VydCAvLyBCb3VudHkgYWxyZWFkeSBpbml0aWFsaXplZAogICAgLy8gZXNjcm93LnB5OjE2Ni0xNjcKICAgIC8vICMgVmFsaWRhdGUgaW5wdXRzCiAgICAvLyBhc3NlcnQgYm91bnR5X2lkLmxlbmd0aCA8PSA2NAogICAgdW5jb3ZlciAzCiAgICBsZW4KICAgIHB1c2hpbnQgNjQKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToxNjgKICAgIC8vIGFzc2VydCBlc2Nyb3dfYW1vdW50ID4gMAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToxNjkKICAgIC8vIGFzc2VydCBpc19oaXRtIDw9IDEKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MTcyLTE3MwogICAgLy8gIyBPUFQtSU4gQVNBOiBJZiBhc3NldF9pZCA+IDAsIHRoZSBhcHAgYWNjb3VudCBtdXN0IG9wdC1pbiB0byBpdCBmaXJzdC4KICAgIC8vIGlmIGFzc2V0X2lkID4gMDoKICAgIGJ6IGNyZWF0ZV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBlc2Nyb3cucHk6MTc0LTE3OQogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXRfaWQsCiAgICAvLyAgICAgYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhc3NldF9hbW91bnQ9MCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGVzY3Jvdy5weToxNzYKICAgIC8vIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgLy8gZXNjcm93LnB5OjE3NwogICAgLy8gYXNzZXRfYW1vdW50PTAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBkaWcgMwogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGVzY3Jvdy5weToxNzQKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIHB1c2hpbnQgNCAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gZXNjcm93LnB5OjE3OAogICAgLy8gZmVlPTAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGVzY3Jvdy5weToxNzQtMTc5CiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD0wLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCmNyZWF0ZV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gZXNjcm93LnB5OjE4MS0xODIKICAgIC8vICMgSW5pdGlhbGl6ZSBzdGF0ZQogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoT1BFTikKICAgIGludGNfMSAvLyAwCiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToxODQtMTkwCiAgICAvLyAjIEluaXRpYWxpemUgbWVkaWF0b3IgZGF0YSBpbnNpZGUgYSBzaW5nbGUgYm94CiAgICAvLyBzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUgPSBNZWRpYXRvckRhdGEoCiAgICAvLyAgICAgYWRkcmVzcz1hcmM0LkFkZHJlc3MobWVkaWF0b3IpLAogICAgLy8gICAgIGJvbmRfYW1vdW50PWFyYzQuVUludDY0KDApLCAgIyBXaWxsIGJlIHBvcHVsYXRlZCB3aGVuIGJvbmRlZAogICAgLy8gICAgIGlzX2JvbmRlZD1hcmM0LlVJbnQ2NCgwKSwKICAgIC8vICAgICBkaWRfaGFzaD1hcmM0LlN0YXRpY0FycmF5W2FyYzQuQnl0ZSwgdHlwaW5nLkxpdGVyYWxbMzJdXS5mcm9tX2J5dGVzKEJ5dGVzKGIiXHgwMCIgKiAzMikpCiAgICAvLyApCiAgICBkaWcgMQogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBjb25jYXQKICAgIC8vIGVzY3Jvdy5weToxODQtMTg1CiAgICAvLyAjIEluaXRpYWxpemUgbWVkaWF0b3IgZGF0YSBpbnNpZGUgYSBzaW5nbGUgYm94CiAgICAvLyBzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUgPSBNZWRpYXRvckRhdGEoCiAgICBieXRlYyA1IC8vICJtZWRpYXRvcl9kYXRhIgogICAgLy8gZXNjcm93LnB5OjE4NC0xOTAKICAgIC8vICMgSW5pdGlhbGl6ZSBtZWRpYXRvciBkYXRhIGluc2lkZSBhIHNpbmdsZSBib3gKICAgIC8vIHNlbGYubWVkaWF0b3JfZGF0YS52YWx1ZSA9IE1lZGlhdG9yRGF0YSgKICAgIC8vICAgICBhZGRyZXNzPWFyYzQuQWRkcmVzcyhtZWRpYXRvciksCiAgICAvLyAgICAgYm9uZF9hbW91bnQ9YXJjNC5VSW50NjQoMCksICAjIFdpbGwgYmUgcG9wdWxhdGVkIHdoZW4gYm9uZGVkCiAgICAvLyAgICAgaXNfYm9uZGVkPWFyYzQuVUludDY0KDApLAogICAgLy8gICAgIGRpZF9oYXNoPWFyYzQuU3RhdGljQXJyYXlbYXJjNC5CeXRlLCB0eXBpbmcuTGl0ZXJhbFszMl1dLmZyb21fYnl0ZXMoQnl0ZXMoYiJceDAwIiAqIDMyKSkKICAgIC8vICkKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToxOTEKICAgIC8vIHNlbGYudHJlYXN1cnlfYWRkcmVzcy52YWx1ZSA9IHRyZWFzdXJ5CiAgICBieXRlYyA0IC8vICJ0cmVhc3VyeV9hZGRyZXNzIgogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToxOTIKICAgIC8vIHNlbGYuZXNjcm93X2Ftb3VudC52YWx1ZSA9IGVzY3Jvd19hbW91bnQKICAgIGRpZyA1CiAgICBpdG9iCiAgICBieXRlYyA2IC8vICJlc2Nyb3dfYW1vdW50IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjE5MwogICAgLy8gc2VsZi5ib3VudHlfaWQudmFsdWUgPSBib3VudHlfaWQKICAgIGJ5dGVjIDEzIC8vICJib3VudHlfaWQiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDEzIC8vICJib3VudHlfaWQiCiAgICBkaWcgNwogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjE5NAogICAgLy8gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18zIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICB0eG4gU2VuZGVyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MTk2CiAgICAvLyBpZiBpc19oaXRtID4gMDoKICAgIGRpZyA0CiAgICBieiBjcmVhdGVfYm91bnR5X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gZXNjcm93LnB5OjE5NwogICAgLy8gc2VsZi5pc19oaXRtLnZhbHVlID0gaXNfaGl0bQogICAgZGlnIDQKICAgIGl0b2IKICAgIGJ5dGVjIDE4IC8vICJpc19oaXRtIgogICAgc3dhcAogICAgYm94X3B1dAoKY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBlc2Nyb3cucHk6MTk4CiAgICAvLyBpZiBhc3NldF9pZCA+IDA6CiAgICBkaWcgMwogICAgYnogY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIGVzY3Jvdy5weToxOTkKICAgIC8vIHNlbGYuYXNzZXRfaWQudmFsdWUgPSBhc3NldF9pZAogICAgZGlnIDMKICAgIGl0b2IKICAgIGJ5dGVjIDcgLy8gImFzc2V0X2lkIgogICAgc3dhcAogICAgYm94X3B1dAoKY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBlc2Nyb3cucHk6MjAwCiAgICAvLyBpZiByZXZpZXdfZGF5cyA+IDA6CiAgICBkaWcgMgogICAgYnogY3JlYXRlX2JvdW50eV9hZnRlcl9pZl9lbHNlQDEwCiAgICAvLyBlc2Nyb3cucHk6MjAxCiAgICAvLyBzZWxmLnJldmlld19kYXlzLnZhbHVlID0gcmV2aWV3X2RheXMKICAgIGRpZyAyCiAgICBpdG9iCiAgICBieXRlYyAyMiAvLyAicmV2aWV3X2RheXMiCiAgICBzd2FwCiAgICBib3hfcHV0CgpjcmVhdGVfYm91bnR5X2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBlc2Nyb3cucHk6MjAzCiAgICAvLyBsb2coQnl0ZXMoYiJib3VudHlfY3JlYXRlZCIpKQogICAgcHVzaGJ5dGVzIDB4NjI2Zjc1NmU3NDc5NWY2MzcyNjU2MTc0NjU2NAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6MjA0CiAgICAvLyBsb2coYm91bnR5X2lkKQogICAgZGlnIDYKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjE0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LmNsYWltX2JvdW50eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmNsYWltX2JvdW50eToKICAgIC8vIGVzY3Jvdy5weToyMDgKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyMDkKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjIxMAogICAgLy8gYXNzZXJ0IFR4bi5yZWtleV90byA9PSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICB0eG4gUmVrZXlUbwogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyMTIKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBPUEVOCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjIxMwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgIT0gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsICJDYW5ub3QgY2xhaW0geW91ciBvd24gYm91bnR5IgogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgIT0KICAgIGFzc2VydCAvLyBDYW5ub3QgY2xhaW0geW91ciBvd24gYm91bnR5CiAgICAvLyBlc2Nyb3cucHk6MjE0CiAgICAvLyBhc3NlcnQgc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKSA9PSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpLCAiQm91bnR5IGFscmVhZHkgY2xhaW1lZCIKICAgIGNhbGxzdWIgX2dldF9hZ2VudF9hZGRyZXNzCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydCAvLyBCb3VudHkgYWxyZWFkeSBjbGFpbWVkCiAgICAvLyBlc2Nyb3cucHk6ODMKICAgIC8vIHZhbCwgZXhpc3RzID0gc2VsZi5hc3NldF9pZC5tYXliZSgpCiAgICBieXRlYyA3IC8vICJhc3NldF9pZCIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo4NAogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICAvLyBlc2Nyb3cucHk6MjE4CiAgICAvLyBpZiBhc3NldF9pZCA+IDA6CiAgICBieiBjbGFpbV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBlc2Nyb3cucHk6MjE5CiAgICAvLyBiYWxhbmNlLCBleGlzdHMgPSBvcC5Bc3NldEhvbGRpbmdHZXQuYXNzZXRfYmFsYW5jZShUeG4uc2VuZGVyLCBhc3NldF9pZCkKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGJ1cnkgMQogICAgLy8gZXNjcm93LnB5OjIyMAogICAgLy8gYXNzZXJ0IGV4aXN0cywgIkNsYWltaW5nIGFnZW50IG11c3Qgb3B0LWluIHRvIHRoZSBhc3NldCBmaXJzdCIKICAgIGFzc2VydCAvLyBDbGFpbWluZyBhZ2VudCBtdXN0IG9wdC1pbiB0byB0aGUgYXNzZXQgZmlyc3QKCmNsYWltX2JvdW50eV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyBlc2Nyb3cucHk6MjIyCiAgICAvLyBzZWxmLmFnZW50X2FkZHJlc3MudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlYyAxMCAvLyAiYWdlbnRfYWRkcmVzcyIKICAgIHR4biBTZW5kZXIKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToyMjMKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMQUlNRUQpCiAgICBpbnRjXzAgLy8gMQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjI3CiAgICAvLyBzZWxmLmNsYWltX2RlYWRsaW5lLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBjbGFpbV90aW1lb3V0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBlc2Nyb3cucHk6MjI1LTIyNgogICAgLy8gIyBTZXQgY2xhaW0gZGVhZGxpbmUKICAgIC8vIGNsYWltX3RpbWVvdXQgPSBUZW1wbGF0ZVZhcltVSW50NjRdKCJDTEFJTV9USU1FT1VUIikKICAgIGludGMgNiAvLyBUTVBMX0NMQUlNX1RJTUVPVVQKICAgIC8vIGVzY3Jvdy5weToyMjcKICAgIC8vIHNlbGYuY2xhaW1fZGVhZGxpbmUudmFsdWUgPSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCArIGNsYWltX3RpbWVvdXQKICAgICsKICAgIGl0b2IKICAgIGJ5dGVjIDMwIC8vICJjbGFpbV9kZWFkbGluZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weToyMjgKICAgIC8vIHNlbGYuY2xhaW1fdGltZXN0YW1wLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIHB1c2hieXRlcyAiY2xhaW1fdGltZXN0YW1wIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjIzMAogICAgLy8gbG9nKEJ5dGVzKGIiYm91bnR5X2NsYWltZWQiKSkKICAgIHB1c2hieXRlcyAweDYyNmY3NTZlNzQ3OTVmNjM2YzYxNjk2ZDY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjIwNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LnN1Ym1pdF93b3JrW3JvdXRpbmddKCkgLT4gdm9pZDoKc3VibWl0X3dvcms6CiAgICBpbnRjXzEgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICAvLyBlc2Nyb3cucHk6MjMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gZXNjcm93LnB5OjIzNAogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjIzNQogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjM2CiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjIzOAogICAgLy8gY3VycmVudCA9IHNlbGYuc3RhdGVfYm94LnZhbHVlCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gZXNjcm93LnB5OjI0MAogICAgLy8gaWYgY3VycmVudCA9PSBDTEFJTUVEOgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiBzdWJtaXRfd29ya19lbHNlX2JvZHlANgogICAgLy8gZXNjcm93LnB5OjI0MQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5hZ2VudF9hZGRyZXNzLnZhbHVlLCAiT25seSBjbGFpbWluZyBhZ2VudCBjYW4gc3VibWl0IHdvcmsiCiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyAxMCAvLyAiYWdlbnRfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFnZW50X2FkZHJlc3MgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY2xhaW1pbmcgYWdlbnQgY2FuIHN1Ym1pdCB3b3JrCiAgICAvLyBlc2Nyb3cucHk6MjQyCiAgICAvLyBhc3NlcnQgcHJvb2ZfdXJsLmxlbmd0aCA+IDAKICAgIGRpZyAyCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyNDMKICAgIC8vIGFzc2VydCBwcm9vZl91cmwubGVuZ3RoIDw9IE1BWF9VUkxfQllURVMKICAgIHB1c2hpbnQgNTEyCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjQ0CiAgICAvLyBhc3NlcnQgcHJvb2ZfZGF0YS5sZW5ndGggPiAwCiAgICBkaWcgMgogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjQ1CiAgICAvLyBhc3NlcnQgcHJvb2ZfZGF0YS5sZW5ndGggPD0gTUFYX1BST09GX0JZVEVTCiAgICBwdXNoaW50IDIwNDgKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyNDcKICAgIC8vIHNlbGYucHJvb2ZfdXJsLnZhbHVlID0gcHJvb2ZfdXJsCiAgICBieXRlYyAxMSAvLyAicHJvb2ZfdXJsIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAxMSAvLyAicHJvb2ZfdXJsIgogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjQ4CiAgICAvLyBzZWxmLnByb29mX2RhdGEudmFsdWUgPSBwcm9vZl9kYXRhCiAgICBieXRlYyAxMiAvLyAicHJvb2ZfZGF0YSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTIgLy8gInByb29mX2RhdGEiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjQ5CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChTVUJNSVRURUQpCiAgICBpbnRjXzIgLy8gMgogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MjUxLTI1MgogICAgLy8gIyBISVRNOiBTZXQgcmV2aWV3IGRlYWRsaW5lIGlmIGVuYWJsZWQKICAgIC8vIGlzX2hpdG1fdmFsLCBoaXRtX2V4aXN0cyA9IHNlbGYuaXNfaGl0bS5tYXliZSgpCiAgICBieXRlYyAxOCAvLyAiaXNfaGl0bSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIGJ1cnkgNQogICAgLy8gZXNjcm93LnB5OjI1MwogICAgLy8gaWYgaGl0bV9leGlzdHMgYW5kIGlzX2hpdG1fdmFsID09IDE6CiAgICBieiBzdWJtaXRfd29ya19hZnRlcl9pZl9lbHNlQDUKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGJ6IHN1Ym1pdF93b3JrX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gZXNjcm93LnB5OjI1NAogICAgLy8gcmV2aWV3X2RheXNfdmFsLCBkYXlzX2V4aXN0cyA9IHNlbGYucmV2aWV3X2RheXMubWF5YmUoKQogICAgYnl0ZWMgMjIgLy8gInJldmlld19kYXlzIgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjI1NQogICAgLy8gZGF5cyA9IHJldmlld19kYXlzX3ZhbCBpZiBkYXlzX2V4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAvLyBlc2Nyb3cucHk6MjU2CiAgICAvLyBzZWxmLnJldmlld19kZWFkbGluZS52YWx1ZSA9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wICsgZGF5cyAqIDg2NDAwCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBzd2FwCiAgICBpbnRjIDUgLy8gODY0MDAKICAgICoKICAgICsKICAgIGl0b2IKICAgIGJ5dGVjIDIzIC8vICJyZXZpZXdfZGVhZGxpbmUiCiAgICBzd2FwCiAgICBib3hfcHV0CgpzdWJtaXRfd29ya19hZnRlcl9pZl9lbHNlQDU6CiAgICAvLyBlc2Nyb3cucHk6MjU4CiAgICAvLyBsb2coQnl0ZXMoYiJ3b3JrX3N1Ym1pdHRlZCIpKQogICAgcHVzaGJ5dGVzIDB4Nzc2ZjcyNmI1ZjczNzU2MjZkNjk3NDc0NjU2NAogICAgbG9nCgpzdWJtaXRfd29ya19hZnRlcl9pZl9lbHNlQDE3OgogICAgLy8gZXNjcm93LnB5OjIzMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpzdWJtaXRfd29ya19lbHNlX2JvZHlANjoKICAgIC8vIGVzY3Jvdy5weToyNjAKICAgIC8vIGVsaWYgY3VycmVudCA9PSBSRUpFQ1RFRDoKICAgIGR1cAogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0IC8vIEludmFsaWQgc3RhdGUgZm9yIHN1Ym1pdF93b3JrCiAgICAvLyBlc2Nyb3cucHk6MjYxCiAgICAvLyBhZ2VudF92YWwsIGFnZW50X2V4aXN0cyA9IHNlbGYuYWdlbnRfYWRkcmVzcy5tYXliZSgpCiAgICBieXRlYyAxMCAvLyAiYWdlbnRfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ1cnkgNgogICAgLy8gZXNjcm93LnB5OjI2MgogICAgLy8gYXNzZXJ0IGFnZW50X2V4aXN0cyBhbmQgVHhuLnNlbmRlciA9PSBhZ2VudF92YWwsICJPbmx5IGNsYWltaW5nIGFnZW50IGNhbiBzdWJtaXQgd29yayIKICAgIGJ6IHN1Ym1pdF93b3JrX2Jvb2xfZmFsc2VAMTAKICAgIHR4biBTZW5kZXIKICAgIGRpZyA1CiAgICA9PQogICAgYnogc3VibWl0X3dvcmtfYm9vbF9mYWxzZUAxMAogICAgaW50Y18wIC8vIDEKCnN1Ym1pdF93b3JrX2Jvb2xfbWVyZ2VAMTE6CiAgICAvLyBlc2Nyb3cucHk6MjYyCiAgICAvLyBhc3NlcnQgYWdlbnRfZXhpc3RzIGFuZCBUeG4uc2VuZGVyID09IGFnZW50X3ZhbCwgIk9ubHkgY2xhaW1pbmcgYWdlbnQgY2FuIHN1Ym1pdCB3b3JrIgogICAgYXNzZXJ0IC8vIE9ubHkgY2xhaW1pbmcgYWdlbnQgY2FuIHN1Ym1pdCB3b3JrCiAgICAvLyBlc2Nyb3cucHk6MjY0CiAgICAvLyByZWpfdmFsLCByZWpfZXhpc3RzID0gc2VsZi5yZWplY3Rpb25fY291bnQubWF5YmUoKQogICAgYnl0ZWMgOCAvLyAicmVqZWN0aW9uX2NvdW50IgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjI2NQogICAgLy8gcmVqZWN0aW9ucyA9IHJlal92YWwgaWYgcmVqX2V4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAvLyBlc2Nyb3cucHk6MjY2CiAgICAvLyBhc3NlcnQgcmVqZWN0aW9ucyA8IE1BWF9SRUpFQ1RJT05TCiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPAogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjY4CiAgICAvLyBhc3NlcnQgcHJvb2ZfdXJsLmxlbmd0aCA+IDAKICAgIGRpZyAzCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyNjkKICAgIC8vIGFzc2VydCBwcm9vZl91cmwubGVuZ3RoIDw9IE1BWF9VUkxfQllURVMKICAgIHB1c2hpbnQgNTEyCiAgICA8PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjcwCiAgICAvLyBhc3NlcnQgcHJvb2ZfZGF0YS5sZW5ndGggPiAwCiAgICBkaWcgMwogICAgZHVwCiAgICBsZW4KICAgIGR1cAogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MjcxCiAgICAvLyBhc3NlcnQgcHJvb2ZfZGF0YS5sZW5ndGggPD0gTUFYX1BST09GX0JZVEVTCiAgICBwdXNoaW50IDIwNDgKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyNzMKICAgIC8vIHNlbGYucHJvb2ZfdXJsLnZhbHVlID0gcHJvb2ZfdXJsCiAgICBieXRlYyAxMSAvLyAicHJvb2ZfdXJsIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAxMSAvLyAicHJvb2ZfdXJsIgogICAgdW5jb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6Mjc0CiAgICAvLyBzZWxmLnByb29mX2RhdGEudmFsdWUgPSBwcm9vZl9kYXRhCiAgICBieXRlYyAxMiAvLyAicHJvb2ZfZGF0YSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTIgLy8gInByb29mX2RhdGEiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6Mjc1CiAgICAvLyBzZWxmLnJlamVjdGlvbl9jb3VudC52YWx1ZSA9IHJlamVjdGlvbnMgKyAxCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgYnl0ZWMgOCAvLyAicmVqZWN0aW9uX2NvdW50IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjI3NgogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoU1VCTUlUVEVEKQogICAgaW50Y18yIC8vIDIKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjI3OC0yNzkKICAgIC8vICMgSElUTTogUmVzZXQgcmV2aWV3IGRlYWRsaW5lIG9uIHJldmlzaW9uIGlmIGVuYWJsZWQKICAgIC8vIGlzX2hpdG1fdmFsLCBoaXRtX2V4aXN0cyA9IHNlbGYuaXNfaGl0bS5tYXliZSgpCiAgICBieXRlYyAxOCAvLyAiaXNfaGl0bSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIGJ1cnkgNQogICAgLy8gZXNjcm93LnB5OjI4MAogICAgLy8gaWYgaGl0bV9leGlzdHMgYW5kIGlzX2hpdG1fdmFsID09IDE6CiAgICBieiBzdWJtaXRfd29ya19hZnRlcl9pZl9lbHNlQDE0CiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiBzdWJtaXRfd29ya19hZnRlcl9pZl9lbHNlQDE0CiAgICAvLyBlc2Nyb3cucHk6MjgxCiAgICAvLyByZXZpZXdfZGF5c192YWwsIGRheXNfZXhpc3RzID0gc2VsZi5yZXZpZXdfZGF5cy5tYXliZSgpCiAgICBieXRlYyAyMiAvLyAicmV2aWV3X2RheXMiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6MjgyCiAgICAvLyBkYXlzID0gcmV2aWV3X2RheXNfdmFsIGlmIGRheXNfZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weToyODMKICAgIC8vIHNlbGYucmV2aWV3X2RlYWRsaW5lLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBkYXlzICogODY0MDAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIHN3YXAKICAgIGludGMgNSAvLyA4NjQwMAogICAgKgogICAgKwogICAgaXRvYgogICAgYnl0ZWMgMjMgLy8gInJldmlld19kZWFkbGluZSIKICAgIHN3YXAKICAgIGJveF9wdXQKCnN1Ym1pdF93b3JrX2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBlc2Nyb3cucHk6Mjg1CiAgICAvLyBsb2coQnl0ZXMoYiJ3b3JrX3JldmlzZV9zdWJtaXR0ZWQiKSkKICAgIHB1c2hieXRlcyAweDc3NmY3MjZiNWY3MjY1NzY2OTczNjU1ZjczNzU2MjZkNjk3NDc0NjU2NAogICAgbG9nCiAgICBiIHN1Ym1pdF93b3JrX2FmdGVyX2lmX2Vsc2VAMTcKCnN1Ym1pdF93b3JrX2Jvb2xfZmFsc2VAMTA6CiAgICBpbnRjXzEgLy8gMAogICAgYiBzdWJtaXRfd29ya19ib29sX21lcmdlQDExCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LmFwcHJvdmVfd29ya1tyb3V0aW5nXSgpIC0+IHZvaWQ6CmFwcHJvdmVfd29yazoKICAgIC8vIGVzY3Jvdy5weToyOTIKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyOTMKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjI5NAogICAgLy8gYXNzZXJ0IFR4bi5yZWtleV90byA9PSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICB0eG4gUmVrZXlUbwogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyOTYKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBTVUJNSVRURUQKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdGVfYm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weToyOTcKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCAiT25seSBjcmVhdG9yIGNhbiBhcHByb3ZlIHdvcmsiCiAgICB0eG4gU2VuZGVyCiAgICBieXRlY18zIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIE9ubHkgY3JlYXRvciBjYW4gYXBwcm92ZSB3b3JrCiAgICAvLyBlc2Nyb3cucHk6Mjk5CiAgICAvLyBlc2Nyb3dfYW1vdW50ID0gc2VsZi5lc2Nyb3dfYW1vdW50LnZhbHVlCiAgICBieXRlYyA2IC8vICJlc2Nyb3dfYW1vdW50IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZXNjcm93X2Ftb3VudCBleGlzdHMKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo4MwogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmFzc2V0X2lkLm1heWJlKCkKICAgIGJ5dGVjIDcgLy8gImFzc2V0X2lkIgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5Ojg0CiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAvLyBlc2Nyb3cucHk6MzAxCiAgICAvLyBzZWxmLl92ZXJpZnlfZXNjcm93X2JhbGFuY2UoYXNzZXRfaWQsIGVzY3Jvd19hbW91bnQpCiAgICBkdXAKICAgIGRpZyAyCiAgICBjYWxsc3ViIF92ZXJpZnlfZXNjcm93X2JhbGFuY2UKICAgIC8vIGVzY3Jvdy5weTozMDMKICAgIC8vIHNlbGYucGF5b3V0X3R5cGUudmFsdWUgPSBCeXRlcyhQQVlPVVQpCiAgICBieXRlY18xIC8vICJwYXlvdXRfdHlwZSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBieXRlYyAxOSAvLyAweDUwNDE1OTRmNTU1NAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjMwNAogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoQ0xPU0VEKQogICAgcHVzaGludCA1CiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTozMDYtMzA3CiAgICAvLyAjIDIlIHRyZWFzdXJ5LCAwLjI1JSBtZWRpYXRvciwgcmVtYWluZGVyIHRvIHdvcmtlcgogICAgLy8gZmVlX3RyZWFzdXJ5ID0gZXNjcm93X2Ftb3VudCAqIDIgLy8gMTAwCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIHB1c2hpbnQgMTAwCiAgICAvCiAgICAvLyBlc2Nyb3cucHk6MzA4CiAgICAvLyBmZWVfbWVkaWF0b3IgPSBlc2Nyb3dfYW1vdW50ICogMjUgLy8gMTAwMDAKICAgIGRpZyAyCiAgICBwdXNoaW50IDI1CiAgICAqCiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8KICAgIC8vIGVzY3Jvdy5weTozMDkKICAgIC8vIHJlbWFpbmluZ19hbW91bnQgPSBlc2Nyb3dfYW1vdW50IC0gZmVlX3RyZWFzdXJ5IC0gZmVlX21lZGlhdG9yCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICAtCiAgICBkaWcgMQogICAgLQogICAgLy8gZXNjcm93LnB5OjMxMQogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi50cmVhc3VyeV9hZGRyZXNzLnZhbHVlLCBmZWVfdHJlYXN1cnksIGFzc2V0X2lkKQogICAgYnl0ZWMgNCAvLyAidHJlYXN1cnlfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyZWFzdXJ5X2FkZHJlc3MgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjMxMgogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksIGZlZV9tZWRpYXRvciwgYXNzZXRfaWQpCiAgICBieXRlYyA1IC8vICJtZWRpYXRvcl9kYXRhIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWVkaWF0b3JfZGF0YSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMwogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTozMTMKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuX2dldF9hZ2VudF9hZGRyZXNzKCksIHJlbWFpbmluZ19hbW91bnQsIGFzc2V0X2lkKQogICAgY2FsbHN1YiBfZ2V0X2FnZW50X2FkZHJlc3MKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTozMTUKICAgIC8vIGxvZyhCeXRlcyhiIndvcmtfYXBwcm92ZWQiKSkKICAgIHB1c2hieXRlcyAweDc3NmY3MjZiNWY2MTcwNzA3MjZmNzY2NTY0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weToyOTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5yZWplY3Rfd29ya1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJlamVjdF93b3JrOgogICAgLy8gZXNjcm93LnB5OjMxNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgLy8gZXNjcm93LnB5OjMxOQogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjMyMAogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzIxCiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjMyMwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IFNVQk1JVFRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjMyNAogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsICJPbmx5IGNyZWF0b3IgY2FuIHJlamVjdCB3b3JrIgogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIHJlamVjdCB3b3JrCiAgICAvLyBlc2Nyb3cucHk6OTkKICAgIC8vIHZhbCwgZXhpc3RzID0gc2VsZi5yZWplY3Rpb25fY291bnQubWF5YmUoKQogICAgYnl0ZWMgOCAvLyAicmVqZWN0aW9uX2NvdW50IgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjEwMAogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjMyNQogICAgLy8gYXNzZXJ0IHNlbGYuX2dldF9yZWplY3Rpb25fY291bnQoKSA8IE1BWF9SRUpFQ1RJT05TCiAgICBkdXAKICAgIHB1c2hpbnQgMwogICAgPAogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzI3CiAgICAvLyBzZWxmLnJlamVjdGlvbl9jb3VudC52YWx1ZSA9IHNlbGYuX2dldF9yZWplY3Rpb25fY291bnQoKSArIDEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICBieXRlYyA4IC8vICJyZWplY3Rpb25fY291bnQiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MzI4CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChSRUpFQ1RFRCkKICAgIHB1c2hpbnQgMwogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MzMwCiAgICAvLyBsb2coQnl0ZXMoYiJ3b3JrX3JlamVjdGVkIikpCiAgICBwdXNoYnl0ZXMgMHg3NzZmNzI2YjVmNzI2NTZhNjU2Mzc0NjU2NAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6MzMxCiAgICAvLyBsb2cocmVhc29uKQogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6MzE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3Quc3VibWl0X2Rpc3B1dGVbcm91dGluZ10oKSAtPiB2b2lkOgpzdWJtaXRfZGlzcHV0ZToKICAgIGludGNfMSAvLyAwCiAgICBkdXBuIDYKICAgIHB1c2hieXRlcyAiIgogICAgZHVwbiAzCiAgICAvLyBlc2Nyb3cucHk6MzMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICAvLyBlc2Nyb3cucHk6MzM1CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzM2CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozMzcKICAgIC8vIGFzc2VydCBUeG4ucmVrZXlfdG8gPT0gQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgdHhuIFJla2V5VG8KICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzM5CiAgICAvLyBzdGF0ZSA9IHNlbGYuc3RhdGVfYm94LnZhbHVlCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIGR1cAogICAgLy8gZXNjcm93LnB5OjM0MAogICAgLy8gYXNzZXJ0IHN0YXRlID09IFNVQk1JVFRFRCBvciBzdGF0ZSA9PSBSRUpFQ1RFRAogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBibnogc3VibWl0X2Rpc3B1dGVfYm9vbF90cnVlQDMKICAgIGR1cAogICAgcHVzaGludCAzCiAgICA9PQogICAgYnogc3VibWl0X2Rpc3B1dGVfYm9vbF9mYWxzZUA0CgpzdWJtaXRfZGlzcHV0ZV9ib29sX3RydWVAMzoKICAgIGludGNfMCAvLyAxCgpzdWJtaXRfZGlzcHV0ZV9ib29sX21lcmdlQDU6CiAgICAvLyBlc2Nyb3cucHk6MzQwCiAgICAvLyBhc3NlcnQgc3RhdGUgPT0gU1VCTUlUVEVEIG9yIHN0YXRlID09IFJFSkVDVEVECiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozNDEKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgPT0KICAgIGJueiBzdWJtaXRfZGlzcHV0ZV9ib29sX3RydWVANwogICAgdHhuIFNlbmRlcgogICAgY2FsbHN1YiBfZ2V0X2FnZW50X2FkZHJlc3MKICAgID09CiAgICBieiBzdWJtaXRfZGlzcHV0ZV9ib29sX2ZhbHNlQDgKCnN1Ym1pdF9kaXNwdXRlX2Jvb2xfdHJ1ZUA3OgogICAgaW50Y18wIC8vIDEKCnN1Ym1pdF9kaXNwdXRlX2Jvb2xfbWVyZ2VAOToKICAgIC8vIGVzY3Jvdy5weTozNDEKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlIG9yIFR4bi5zZW5kZXIgPT0gc2VsZi5fZ2V0X2FnZW50X2FkZHJlc3MoKQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6MzQyCiAgICAvLyBhc3NlcnQgcmVhc29uLmxlbmd0aCA+IDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGxlbgogICAgZHVwCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozNDMKICAgIC8vIGFzc2VydCByZWFzb24ubGVuZ3RoIDw9IE1BWF9ESVNQVVRFX1JFQVNPTl9CWVRFUwogICAgcHVzaGludCAyNTYKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTozNDUKICAgIC8vIHNlbGYuZGlzcHV0ZV9yZWFzb24udmFsdWUgPSByZWFzb24KICAgIGJ5dGVjIDMxIC8vICJkaXNwdXRlX3JlYXNvbiIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMzEgLy8gImRpc3B1dGVfcmVhc29uIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjM0NgogICAgLy8gc2VsZi5kaXNwdXRlX2luaXRpYXRvci52YWx1ZSA9IFR4bi5zZW5kZXIKICAgIHB1c2hieXRlcyAiZGlzcHV0ZV9pbml0aWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MzQ3CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChESVNQVVRFRCkKICAgIHB1c2hpbnQgNAogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6MzQ4CiAgICAvLyBzZWxmLmRpc3B1dGVfdGltZXN0YW1wLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGl0b2IKICAgIGJ5dGVjIDI0IC8vICJkaXNwdXRlX3RpbWVzdGFtcCIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo3OQogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmNhbmRpZGF0ZV9jb3VudC5tYXliZSgpCiAgICBieXRlYyAxNCAvLyAiY2FuZGlkYXRlX2NvdW50IgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjgwCiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkdXAKICAgIGJ1cnkgNwogICAgLy8gZXNjcm93LnB5OjM1MgogICAgLy8gdHJlYXN1cnkgPSBzZWxmLnRyZWFzdXJ5X2FkZHJlc3MudmFsdWUKICAgIGJ5dGVjIDQgLy8gInRyZWFzdXJ5X2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDEwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmVhc3VyeV9hZGRyZXNzIGV4aXN0cwogICAgLy8gZXNjcm93LnB5OjM1MwogICAgLy8gY3JlYXRvciA9IHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlCiAgICBieXRlY18zIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidXJ5IDExCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICAvLyBlc2Nyb3cucHk6MzU0CiAgICAvLyB3b3JrZXIgPSBzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgYnVyeSA4CiAgICAvLyBlc2Nyb3cucHk6MzYwCiAgICAvLyBpZiBjb3VudCA+IFVJbnQ2NCgwKToKICAgIGJueiBzdWJtaXRfZGlzcHV0ZV9pZl9ib2R5QDEwCiAgICBkaWcgNwogICAgZHVwCiAgICBidXJ5IDEyCiAgICBkdXAKICAgIGJ1cnkgMTMKICAgIGJ1cnkgMTMKCnN1Ym1pdF9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMzU6CiAgICAvLyBlc2Nyb3cucHk6Mzk4CiAgICAvLyBzZWxmLmFyYml0cmF0b3JfMS52YWx1ZSA9IGFyYjEKICAgIGJ5dGVjIDI1IC8vICJhcmJpdHJhdG9yXzEiCiAgICBkaWcgMTMKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjM5OQogICAgLy8gc2VsZi5hcmJpdHJhdG9yXzIudmFsdWUgPSBhcmIyCiAgICBieXRlYyAyNiAvLyAiYXJiaXRyYXRvcl8yIgogICAgZGlnIDEzCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0MDAKICAgIC8vIHNlbGYuYXJiaXRyYXRvcl8zLnZhbHVlID0gYXJiMwogICAgYnl0ZWMgMjcgLy8gImFyYml0cmF0b3JfMyIKICAgIGRpZyAxMwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NDAyCiAgICAvLyBzZWxmLmFyYml0cmF0b3JfMV92b3RlLnZhbHVlID0gVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgaXRvYgogICAgYnl0ZWMgMTUgLy8gImFyYml0cmF0b3JfMV92b3RlIgogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0MDMKICAgIC8vIHNlbGYuYXJiaXRyYXRvcl8yX3ZvdGUudmFsdWUgPSBVSW50NjQoMCkKICAgIGJ5dGVjIDE2IC8vICJhcmJpdHJhdG9yXzJfdm90ZSIKICAgIGRpZyAxCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NDA0CiAgICAvLyBzZWxmLmFyYml0cmF0b3JfM192b3RlLnZhbHVlID0gVUludDY0KDApCiAgICBieXRlYyAxNyAvLyAiYXJiaXRyYXRvcl8zX3ZvdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NDA2CiAgICAvLyBsb2coQnl0ZXMoYiJkaXNwdXRlX3N1Ym1pdHRlZCIpKQogICAgcHVzaGJ5dGVzIDB4NjQ2OTczNzA3NTc0NjU1ZjczNzU2MjZkNjk3NDc0NjU2NAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NDA3CiAgICAvLyBsb2coYXJiMS5ieXRlcykKICAgIHVuY292ZXIgMgogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NDA4CiAgICAvLyBsb2coYXJiMi5ieXRlcykKICAgIHN3YXAKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjQwOQogICAgLy8gbG9nKGFyYjMuYnl0ZXMpCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTozMzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKc3VibWl0X2Rpc3B1dGVfaWZfYm9keUAxMDoKICAgIC8vIGVzY3Jvdy5weTozNjEKICAgIC8vIHNlZWQgPSBvcC5zaGEyNTYoVHhuLnR4X2lkICsgb3AuaXRvYihHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCkpCiAgICB0eG4gVHhJRAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgY29uY2F0CiAgICBzaGEyNTYKICAgIC8vIGVzY3Jvdy5weTozNjIKICAgIC8vIHN0YXJ0X2lkeCA9IG9wLmJ0b2koc2VlZCkgJSBjb3VudAogICAgYnRvaQogICAgZGlnIDYKICAgICUKICAgIC8vIGVzY3Jvdy5weTozNjYKICAgIC8vIGZvdW5kID0gRmFsc2UKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDYKICAgIC8vIGVzY3Jvdy5weTozNjcKICAgIC8vIHNlYXJjaGVkID0gVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSA0CiAgICBkaWcgOAogICAgYnVyeSAxNAogICAgYnVyeSA0CgpzdWJtaXRfZGlzcHV0ZV93aGlsZV90b3BAMTE6CiAgICAvLyBlc2Nyb3cucHk6MzY4CiAgICAvLyB3aGlsZSBzZWFyY2hlZCA8IGNvdW50IGFuZCBub3QgZm91bmQ6CiAgICBkaWcgMgogICAgZGlnIDYKICAgIDwKICAgIGJ6IHN1Ym1pdF9kaXNwdXRlX2FmdGVyX3doaWxlQDE3CiAgICBkaWcgNAogICAgYm56IHN1Ym1pdF9kaXNwdXRlX2FmdGVyX3doaWxlQDE3CiAgICAvLyBlc2Nyb3cucHk6MzY5CiAgICAvLyBjYW5kaWRhdGUgPSBCb3goQWNjb3VudCwga2V5PUJ5dGVzKGIiY2FuZF9hZGRyXyIpICsgb3AuaXRvYihpZHgpKS52YWx1ZQogICAgZGlnIDMKICAgIGl0b2IKICAgIGJ5dGVjIDkgLy8gMHg2MzYxNmU2NDVmNjE2NDY0NzI1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTIKICAgIGFzc2VydCAvLyBjaGVjayBCb3ggZXhpc3RzCiAgICAvLyBlc2Nyb3cucHk6MzcwCiAgICAvLyBpZiBjYW5kaWRhdGUgIT0gY3JlYXRvciBhbmQgY2FuZGlkYXRlICE9IHdvcmtlcjoKICAgIGRpZyA5CiAgICAhPQogICAgYnogc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAxNgogICAgZGlnIDkKICAgIGRpZyA3CiAgICAhPQogICAgYnogc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAxNgogICAgLy8gZXNjcm93LnB5OjM3MgogICAgLy8gZm91bmQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgYnVyeSA1CiAgICBkaWcgOQogICAgYnVyeSAxMwoKc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAxNjoKICAgIC8vIGVzY3Jvdy5weTozNzMKICAgIC8vIGlkeCA9IChpZHggKyAxKSAlIGNvdW50CiAgICBkaWcgMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGRpZyA2CiAgICAlCiAgICBidXJ5IDQKICAgIC8vIGVzY3Jvdy5weTozNzQKICAgIC8vIHNlYXJjaGVkID0gc2VhcmNoZWQgKyAxCiAgICBkaWcgMgogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGJ1cnkgMwogICAgYiBzdWJtaXRfZGlzcHV0ZV93aGlsZV90b3BAMTEKCnN1Ym1pdF9kaXNwdXRlX2FmdGVyX3doaWxlQDE3OgogICAgLy8gZXNjcm93LnB5OjM3Ni0zNzcKICAgIC8vICMgVHJ5IHRvIGZpbmQgYXJiMgogICAgLy8gZm91bmQgPSBGYWxzZQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgNQogICAgLy8gZXNjcm93LnB5OjM3OAogICAgLy8gc2VhcmNoZWQgPSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBidXJ5IDMKICAgIGRpZyA3CiAgICBidXJ5IDEyCgpzdWJtaXRfZGlzcHV0ZV93aGlsZV90b3BAMTg6CiAgICAvLyBlc2Nyb3cucHk6Mzc5CiAgICAvLyB3aGlsZSBzZWFyY2hlZCA8IGNvdW50IGFuZCBub3QgZm91bmQ6CiAgICBkaWcgMgogICAgZGlnIDYKICAgIDwKICAgIGJ6IHN1Ym1pdF9kaXNwdXRlX2FmdGVyX3doaWxlQDI1CiAgICBkaWcgNAogICAgYm56IHN1Ym1pdF9kaXNwdXRlX2FmdGVyX3doaWxlQDI1CiAgICAvLyBlc2Nyb3cucHk6MzgwCiAgICAvLyBjYW5kaWRhdGUgPSBCb3goQWNjb3VudCwga2V5PUJ5dGVzKGIiY2FuZF9hZGRyXyIpICsgb3AuaXRvYihpZHgpKS52YWx1ZQogICAgZGlnIDMKICAgIGl0b2IKICAgIGJ5dGVjIDkgLy8gMHg2MzYxNmU2NDVmNjE2NDY0NzI1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTIKICAgIGFzc2VydCAvLyBjaGVjayBCb3ggZXhpc3RzCiAgICAvLyBlc2Nyb3cucHk6MzgxCiAgICAvLyBpZiBjYW5kaWRhdGUgIT0gY3JlYXRvciBhbmQgY2FuZGlkYXRlICE9IHdvcmtlciBhbmQgY2FuZGlkYXRlICE9IGFyYjE6CiAgICBkaWcgOQogICAgIT0KICAgIGJ6IHN1Ym1pdF9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMjQKICAgIGRpZyA5CiAgICBkaWcgNwogICAgIT0KICAgIGJ6IHN1Ym1pdF9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMjQKICAgIGRpZyA5CiAgICBkaWcgMTMKICAgICE9CiAgICBieiBzdWJtaXRfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDI0CiAgICAvLyBlc2Nyb3cucHk6MzgzCiAgICAvLyBmb3VuZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBidXJ5IDUKICAgIGRpZyA5CiAgICBidXJ5IDEyCgpzdWJtaXRfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDI0OgogICAgLy8gZXNjcm93LnB5OjM4NAogICAgLy8gaWR4ID0gKGlkeCArIDEpICUgY291bnQKICAgIGRpZyAzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZGlnIDYKICAgICUKICAgIGJ1cnkgNAogICAgLy8gZXNjcm93LnB5OjM4NQogICAgLy8gc2VhcmNoZWQgPSBzZWFyY2hlZCArIDEKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnVyeSAzCiAgICBiIHN1Ym1pdF9kaXNwdXRlX3doaWxlX3RvcEAxOAoKc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfd2hpbGVAMjU6CiAgICAvLyBlc2Nyb3cucHk6Mzg3LTM4OAogICAgLy8gIyBUcnkgdG8gZmluZCBhcmIzCiAgICAvLyBmb3VuZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSA1CiAgICAvLyBlc2Nyb3cucHk6Mzg5CiAgICAvLyBzZWFyY2hlZCA9IFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIGJ1cnkgMwogICAgZGlnIDcKICAgIGJ1cnkgMTEKCnN1Ym1pdF9kaXNwdXRlX3doaWxlX3RvcEAyNjoKICAgIC8vIGVzY3Jvdy5weTozOTAKICAgIC8vIHdoaWxlIHNlYXJjaGVkIDwgY291bnQgYW5kIG5vdCBmb3VuZDoKICAgIGRpZyAyCiAgICBkaWcgNgogICAgPAogICAgYnogc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzNQogICAgZGlnIDQKICAgIGJueiBzdWJtaXRfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDM1CiAgICAvLyBlc2Nyb3cucHk6MzkxCiAgICAvLyBjYW5kaWRhdGUgPSBCb3goQWNjb3VudCwga2V5PUJ5dGVzKGIiY2FuZF9hZGRyXyIpICsgb3AuaXRvYihpZHgpKS52YWx1ZQogICAgZGlnIDMKICAgIGl0b2IKICAgIGJ5dGVjIDkgLy8gMHg2MzYxNmU2NDVmNjE2NDY0NzI1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGJ1cnkgMTIKICAgIGFzc2VydCAvLyBjaGVjayBCb3ggZXhpc3RzCiAgICAvLyBlc2Nyb3cucHk6MzkyCiAgICAvLyBpZiBjYW5kaWRhdGUgIT0gY3JlYXRvciBhbmQgY2FuZGlkYXRlICE9IHdvcmtlciBhbmQgY2FuZGlkYXRlICE9IGFyYjEgYW5kIGNhbmRpZGF0ZSAhPSBhcmIyOgogICAgZGlnIDkKICAgICE9CiAgICBieiBzdWJtaXRfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDMzCiAgICBkaWcgOQogICAgZGlnIDcKICAgICE9CiAgICBieiBzdWJtaXRfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDMzCiAgICBkaWcgOQogICAgZGlnIDEzCiAgICAhPQogICAgYnogc3VibWl0X2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgZGlnIDkKICAgIGRpZyAxMgogICAgIT0KICAgIGJ6IHN1Ym1pdF9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIGVzY3Jvdy5weTozOTQKICAgIC8vIGZvdW5kID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGJ1cnkgNQogICAgZGlnIDkKICAgIGJ1cnkgMTEKCnN1Ym1pdF9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMzM6CiAgICAvLyBlc2Nyb3cucHk6Mzk1CiAgICAvLyBpZHggPSAoaWR4ICsgMSkgJSBjb3VudAogICAgZGlnIDMKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBkaWcgNgogICAgJQogICAgYnVyeSA0CiAgICAvLyBlc2Nyb3cucHk6Mzk2CiAgICAvLyBzZWFyY2hlZCA9IHNlYXJjaGVkICsgMQogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDMKICAgIGIgc3VibWl0X2Rpc3B1dGVfd2hpbGVfdG9wQDI2CgpzdWJtaXRfZGlzcHV0ZV9ib29sX2ZhbHNlQDg6CiAgICBpbnRjXzEgLy8gMAogICAgYiBzdWJtaXRfZGlzcHV0ZV9ib29sX21lcmdlQDkKCnN1Ym1pdF9kaXNwdXRlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIHN1Ym1pdF9kaXNwdXRlX2Jvb2xfbWVyZ2VANQoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC52b3RlX2Rpc3B1dGVbcm91dGluZ10oKSAtPiB2b2lkOgp2b3RlX2Rpc3B1dGU6CiAgICBpbnRjXzEgLy8gMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDExCiAgICAvLyBlc2Nyb3cucHk6NDExCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBwdXNoaW50IDgKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQudWludDY0CiAgICBidG9pCiAgICBkdXAKICAgIC8vIGVzY3Jvdy5weTo0MTMKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo0MTQKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjQxNQogICAgLy8gYXNzZXJ0IFR4bi5yZWtleV90byA9PSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICB0eG4gUmVrZXlUbwogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo0MTcKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBESVNQVVRFRCwgIkJvdW50eSBpcyBub3QgZGlzcHV0ZWQiCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydCAvLyBCb3VudHkgaXMgbm90IGRpc3B1dGVkCiAgICAvLyBlc2Nyb3cucHk6NDE4CiAgICAvLyBhc3NlcnQgdm90ZV9vcHRpb24gPT0gVUludDY0KDEpIG9yIHZvdGVfb3B0aW9uID09IFVJbnQ2NCgyKSBvciB2b3RlX29wdGlvbiA9PSBVSW50NjQoMyksICJJbnZhbGlkIHZvdGUgb3B0aW9uIgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBibnogdm90ZV9kaXNwdXRlX2Jvb2xfdHJ1ZUA0CiAgICBkdXAKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgYm56IHZvdGVfZGlzcHV0ZV9ib29sX3RydWVANAogICAgZHVwCiAgICBwdXNoaW50IDMKICAgID09CiAgICBieiB2b3RlX2Rpc3B1dGVfYm9vbF9mYWxzZUA1Cgp2b3RlX2Rpc3B1dGVfYm9vbF90cnVlQDQ6CiAgICBpbnRjXzAgLy8gMQoKdm90ZV9kaXNwdXRlX2Jvb2xfbWVyZ2VANjoKICAgIC8vIGVzY3Jvdy5weTo0MTgKICAgIC8vIGFzc2VydCB2b3RlX29wdGlvbiA9PSBVSW50NjQoMSkgb3Igdm90ZV9vcHRpb24gPT0gVUludDY0KDIpIG9yIHZvdGVfb3B0aW9uID09IFVJbnQ2NCgzKSwgIkludmFsaWQgdm90ZSBvcHRpb24iCiAgICBhc3NlcnQgLy8gSW52YWxpZCB2b3RlIG9wdGlvbgogICAgLy8gZXNjcm93LnB5OjQyMAogICAgLy8gc2VuZGVyID0gVHhuLnNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgZHVwCiAgICBidXJ5IDE1CiAgICAvLyBlc2Nyb3cucHk6NDIxCiAgICAvLyB2b3RlZCA9IEZhbHNlCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSA0CiAgICAvLyBlc2Nyb3cucHk6NDIyCiAgICAvLyBpZiBzZW5kZXIgPT0gc2VsZi5hcmJpdHJhdG9yXzEudmFsdWUgYW5kIHNlbGYuYXJiaXRyYXRvcl8xX3ZvdGUudmFsdWUgPT0gVUludDY0KDApOgogICAgYnl0ZWMgMjUgLy8gImFyYml0cmF0b3JfMSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMSBleGlzdHMKICAgID09CiAgICBieiB2b3RlX2Rpc3B1dGVfZWxzZV9ib2R5QDkKICAgIGJ5dGVjIDE1IC8vICJhcmJpdHJhdG9yXzFfdm90ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMV92b3RlIGV4aXN0cwogICAgYnRvaQogICAgYm56IHZvdGVfZGlzcHV0ZV9lbHNlX2JvZHlAOQogICAgLy8gZXNjcm93LnB5OjQyMwogICAgLy8gc2VsZi5hcmJpdHJhdG9yXzFfdm90ZS52YWx1ZSA9IHZvdGVfb3B0aW9uCiAgICBkdXAKICAgIGl0b2IKICAgIGJ5dGVjIDE1IC8vICJhcmJpdHJhdG9yXzFfdm90ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0MjQKICAgIC8vIHZvdGVkID0gVHJ1ZQogICAgaW50Y18wIC8vIDEKICAgIGJ1cnkgMwoKdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMTc6CiAgICAvLyBlc2Nyb3cucHk6NDMyCiAgICAvLyBhc3NlcnQgdm90ZWQsICJTZW5kZXIgaXMgbm90IGFuIGFzc2lnbmVkIGFyYml0cmF0b3Igd2l0aCBhIHBlbmRpbmcgdm90ZSIKICAgIGRpZyAyCiAgICBhc3NlcnQgLy8gU2VuZGVyIGlzIG5vdCBhbiBhc3NpZ25lZCBhcmJpdHJhdG9yIHdpdGggYSBwZW5kaW5nIHZvdGUKICAgIC8vIGVzY3Jvdy5weTo0MzQKICAgIC8vIGxvZyhCeXRlcyhiImFyYml0cmF0b3Jfdm90ZWQiKSkKICAgIHB1c2hieXRlcyAweDYxNzI2MjY5NzQ3MjYxNzQ2ZjcyNWY3NjZmNzQ2NTY0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo0MzUKICAgIC8vIGxvZyhzZW5kZXIuYnl0ZXMpCiAgICBkaWcgMTMKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjQzNgogICAgLy8gbG9nKG9wLml0b2Iodm90ZV9vcHRpb24pKQogICAgZHVwCiAgICBpdG9iCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo0MzgtNDM5CiAgICAvLyAjIENoZWNrIGNvbnNlbnN1cwogICAgLy8gdjEgPSBzZWxmLmFyYml0cmF0b3JfMV92b3RlLnZhbHVlCiAgICBieXRlYyAxNSAvLyAiYXJiaXRyYXRvcl8xX3ZvdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmJpdHJhdG9yXzFfdm90ZSBleGlzdHMKICAgIGJ0b2kKICAgIGR1cAogICAgYnVyeSA3CiAgICAvLyBlc2Nyb3cucHk6NDQwCiAgICAvLyB2MiA9IHNlbGYuYXJiaXRyYXRvcl8yX3ZvdGUudmFsdWUKICAgIGJ5dGVjIDE2IC8vICJhcmJpdHJhdG9yXzJfdm90ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMl92b3RlIGV4aXN0cwogICAgYnRvaQogICAgYnVyeSA2CiAgICAvLyBlc2Nyb3cucHk6NDQxCiAgICAvLyB2MyA9IHNlbGYuYXJiaXRyYXRvcl8zX3ZvdGUudmFsdWUKICAgIGJ5dGVjIDE3IC8vICJhcmJpdHJhdG9yXzNfdm90ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfM192b3RlIGV4aXN0cwogICAgYnRvaQogICAgYnVyeSA1CiAgICAvLyBlc2Nyb3cucHk6NDQzCiAgICAvLyBjb25zZW5zdXNfb3B0aW9uID0gVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSAxMwogICAgLy8gZXNjcm93LnB5OjQ0NAogICAgLy8gaWYgdjEgIT0gVUludDY0KDApIGFuZCB2MSA9PSB2MjoKICAgIGJ6IHZvdGVfZGlzcHV0ZV9lbHNlX2JvZHlAMjAKICAgIGRpZyA1CiAgICBkaWcgNQogICAgPT0KICAgIGJ6IHZvdGVfZGlzcHV0ZV9lbHNlX2JvZHlAMjAKICAgIGRpZyA1CiAgICBidXJ5IDEyCgp2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzMzoKICAgIC8vIGVzY3Jvdy5weTo0NTMKICAgIC8vIGlmIGNvbnNlbnN1c19vcHRpb24gIT0gVUludDY0KDApOgogICAgZGlnIDExCiAgICBieiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzNQogICAgLy8gZXNjcm93LnB5OjQ1NwogICAgLy8gZXNjcm93X2Ftb3VudCA9IHNlbGYuZXNjcm93X2Ftb3VudC52YWx1ZQogICAgYnl0ZWMgNiAvLyAiZXNjcm93X2Ftb3VudCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVzY3Jvd19hbW91bnQgZXhpc3RzCiAgICBidG9pCiAgICBkdXAKICAgIGJ1cnkgMTIKICAgIC8vIGVzY3Jvdy5weTo4MwogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmFzc2V0X2lkLm1heWJlKCkKICAgIGJ5dGVjIDcgLy8gImFzc2V0X2lkIgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5Ojg0CiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkdXAKICAgIGJ1cnkgMTUKICAgIC8vIGVzY3Jvdy5weTo0NTkKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGRpZyAxCiAgICBjYWxsc3ViIF92ZXJpZnlfZXNjcm93X2JhbGFuY2UKICAgIC8vIGVzY3Jvdy5weTo0NjEKICAgIC8vIGZlZV90cmVhc3VyeSA9IGVzY3Jvd19hbW91bnQgKiAyIC8vIDEwMAogICAgZHVwCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgcHVzaGludCAxMDAKICAgIC8KICAgIGJ1cnkgOQogICAgLy8gZXNjcm93LnB5OjQ2MgogICAgLy8gZmVlX2FyYml0cmF0aW9uID0gZXNjcm93X2Ftb3VudCAqIDUgLy8gMTAwMDAKICAgIHB1c2hpbnQgNQogICAgKgogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvCiAgICBidXJ5IDEwCiAgICAvLyBlc2Nyb3cucHk6NDY0CiAgICAvLyB2MSA9IHNlbGYuYXJiaXRyYXRvcl8xX3ZvdGUudmFsdWUKICAgIGJ5dGVjIDE1IC8vICJhcmJpdHJhdG9yXzFfdm90ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMV92b3RlIGV4aXN0cwogICAgYnRvaQogICAgZHVwCiAgICBidXJ5IDcKICAgIC8vIGVzY3Jvdy5weTo0NjUKICAgIC8vIHYyID0gc2VsZi5hcmJpdHJhdG9yXzJfdm90ZS52YWx1ZQogICAgYnl0ZWMgMTYgLy8gImFyYml0cmF0b3JfMl92b3RlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJiaXRyYXRvcl8yX3ZvdGUgZXhpc3RzCiAgICBidG9pCiAgICBidXJ5IDYKICAgIC8vIGVzY3Jvdy5weTo0NjYKICAgIC8vIHYzID0gc2VsZi5hcmJpdHJhdG9yXzNfdm90ZS52YWx1ZQogICAgYnl0ZWMgMTcgLy8gImFyYml0cmF0b3JfM192b3RlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJiaXRyYXRvcl8zX3ZvdGUgZXhpc3RzCiAgICBidG9pCiAgICBidXJ5IDUKICAgIC8vIGVzY3Jvdy5weTo0NjgKICAgIC8vIHZvdGVkX2NvdW50ID0gVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgYnVyeSAzCiAgICAvLyBlc2Nyb3cucHk6NDY5CiAgICAvLyBpZiB2MSAhPSBVSW50NjQoMCk6CiAgICBieiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzOAogICAgLy8gZXNjcm93LnB5OjQ3MAogICAgLy8gdm90ZWRfY291bnQgPSB2b3RlZF9jb3VudCArIDEKICAgIGludGNfMCAvLyAxCiAgICBidXJ5IDIKCnZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDM4OgogICAgLy8gZXNjcm93LnB5OjQ3MQogICAgLy8gaWYgdjIgIT0gVUludDY0KDApOgogICAgZGlnIDQKICAgIGJ6IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQwCiAgICAvLyBlc2Nyb3cucHk6NDcyCiAgICAvLyB2b3RlZF9jb3VudCA9IHZvdGVkX2NvdW50ICsgMQogICAgZGlnIDEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDIKCnZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQwOgogICAgLy8gZXNjcm93LnB5OjQ3MwogICAgLy8gaWYgdjMgIT0gVUludDY0KDApOgogICAgZGlnIDMKICAgIGJ6IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQyCiAgICAvLyBlc2Nyb3cucHk6NDc0CiAgICAvLyB2b3RlZF9jb3VudCA9IHZvdGVkX2NvdW50ICsgMQogICAgZGlnIDEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBidXJ5IDIKCnZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQyOgogICAgLy8gZXNjcm93LnB5OjQ3NgogICAgLy8gZmVlX3Blcl9hcmJpdHJhdG9yID0gZmVlX2FyYml0cmF0aW9uIC8vIHZvdGVkX2NvdW50CiAgICBkaWcgOQogICAgZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgLwogICAgZHVwCiAgICBidXJ5IDExCiAgICAvLyBlc2Nyb3cucHk6NDc3CiAgICAvLyBhY3R1YWxfYXJiaXRyYXRpb25fcGF5b3V0ID0gZmVlX3Blcl9hcmJpdHJhdG9yICogdm90ZWRfY291bnQKICAgICoKICAgIC8vIGVzY3Jvdy5weTo0NzgKICAgIC8vIHJlbWFpbmluZ19hbW91bnQgPSBlc2Nyb3dfYW1vdW50IC0gZmVlX3RyZWFzdXJ5IC0gYWN0dWFsX2FyYml0cmF0aW9uX3BheW91dAogICAgZGlnIDExCiAgICBkaWcgOQogICAgZHVwCiAgICBjb3ZlciAzCiAgICAtCiAgICBzd2FwCiAgICAtCiAgICBidXJ5IDgKICAgIC8vIGVzY3Jvdy5weTo0ODAtNDgxCiAgICAvLyAjIFBheSBUcmVhc3VyeQogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi50cmVhc3VyeV9hZGRyZXNzLnZhbHVlLCBmZWVfdHJlYXN1cnksIGFzc2V0X2lkKQogICAgYnl0ZWMgNCAvLyAidHJlYXN1cnlfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyZWFzdXJ5X2FkZHJlc3MgZXhpc3RzCiAgICBzd2FwCiAgICBkaWcgMTQKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0CiAgICAvLyBlc2Nyb3cucHk6NDgzLTQ4NAogICAgLy8gIyBQYXkgdm90aW5nIGFyYml0cmF0b3JzCiAgICAvLyBpZiB2MSAhPSBVSW50NjQoMCk6CiAgICBkaWcgNQogICAgYnogdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VANDQKICAgIC8vIGVzY3Jvdy5weTo0ODUKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuYXJiaXRyYXRvcl8xLnZhbHVlLCBmZWVfcGVyX2FyYml0cmF0b3IsIGFzc2V0X2lkKQogICAgYnl0ZWMgMjUgLy8gImFyYml0cmF0b3JfMSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMSBleGlzdHMKICAgIGRpZyA5CiAgICBkaWcgMTQKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0Cgp2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUA0NDoKICAgIC8vIGVzY3Jvdy5weTo0ODYKICAgIC8vIGlmIHYyICE9IFVJbnQ2NCgwKToKICAgIGRpZyA0CiAgICBieiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUA0NgogICAgLy8gZXNjcm93LnB5OjQ4NwogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5hcmJpdHJhdG9yXzIudmFsdWUsIGZlZV9wZXJfYXJiaXRyYXRvciwgYXNzZXRfaWQpCiAgICBieXRlYyAyNiAvLyAiYXJiaXRyYXRvcl8yIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJiaXRyYXRvcl8yIGV4aXN0cwogICAgZGlnIDkKICAgIGRpZyAxNAogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKCnZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQ2OgogICAgLy8gZXNjcm93LnB5OjQ4OAogICAgLy8gaWYgdjMgIT0gVUludDY0KDApOgogICAgZGlnIDMKICAgIGJ6IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDQ4CiAgICAvLyBlc2Nyb3cucHk6NDg5CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLmFyYml0cmF0b3JfMy52YWx1ZSwgZmVlX3Blcl9hcmJpdHJhdG9yLCBhc3NldF9pZCkKICAgIGJ5dGVjIDI3IC8vICJhcmJpdHJhdG9yXzMiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hcmJpdHJhdG9yXzMgZXhpc3RzCiAgICBkaWcgOQogICAgZGlnIDE0CiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAoKdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VANDg6CiAgICAvLyBlc2Nyb3cucHk6NDkxCiAgICAvLyBpZiBjb25zZW5zdXNfb3B0aW9uID09IFVJbnQ2NCgxKToKICAgIGRpZyAxMQogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBieiB2b3RlX2Rpc3B1dGVfZWxzZV9ib2R5QDUwCiAgICAvLyBlc2Nyb3cucHk6NDkyCiAgICAvLyBzZWxmLnBheW91dF90eXBlLnZhbHVlID0gQnl0ZXMoUEFZT1VUKQogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gInBheW91dF90eXBlIgogICAgYnl0ZWMgMTkgLy8gMHg1MDQxNTk0ZjU1NTQKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo0OTMKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMT1NFRCkKICAgIHB1c2hpbnQgNQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NDk0CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpLCByZW1haW5pbmdfYW1vdW50LCBhc3NldF9pZCkKICAgIGNhbGxzdWIgX2dldF9hZ2VudF9hZGRyZXNzCiAgICBkaWcgNwogICAgZGlnIDE0CiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjQ5NQogICAgLy8gbG9nKEJ5dGVzKGIiZGlzcHV0ZV9yZXNvbHZlZF9hZ2VudF93aW4iKSkKICAgIGJ5dGVjIDMyIC8vIDB4NjQ2OTczNzA3NTc0NjU1ZjcyNjU3MzZmNmM3NjY1NjQ1ZjYxNjc2NTZlNzQ1Zjc3Njk2ZQogICAgbG9nCgp2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzNToKICAgIC8vIGVzY3Jvdy5weTo0MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUA1MDoKICAgIC8vIGVzY3Jvdy5weTo0OTYKICAgIC8vIGVsaWYgY29uc2Vuc3VzX29wdGlvbiA9PSBVSW50NjQoMik6CiAgICBkaWcgMTEKICAgIGludGNfMiAvLyAyCiAgICA9PQogICAgYnogdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUA1MgogICAgLy8gZXNjcm93LnB5OjQ5NwogICAgLy8gc2VsZi5wYXlvdXRfdHlwZS52YWx1ZSA9IEJ5dGVzKFJFRlVORCkKICAgIGJ5dGVjXzEgLy8gInBheW91dF90eXBlIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vICJwYXlvdXRfdHlwZSIKICAgIGJ5dGVjIDIwIC8vIDB4NTI0NTQ2NTU0ZTQ0CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NDk4CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChDTE9TRUQpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjQ5OQogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsIHJlbWFpbmluZ19hbW91bnQsIGFzc2V0X2lkKQogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgZGlnIDcKICAgIGRpZyAxNAogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo1MDAKICAgIC8vIGxvZyhCeXRlcyhiImRpc3B1dGVfcmVzb2x2ZWRfY3JlYXRvcl93aW4iKSkKICAgIGJ5dGVjIDMzIC8vIDB4NjQ2OTczNzA3NTc0NjU1ZjcyNjU3MzZmNmM3NjY1NjQ1ZjYzNzI2NTYxNzQ2ZjcyNWY3NzY5NmUKICAgIGxvZwogICAgYiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzNQoKdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUA1MjoKICAgIC8vIGVzY3Jvdy5weTo1MDIKICAgIC8vIHNlbGYucGF5b3V0X3R5cGUudmFsdWUgPSBCeXRlcyhTUExJVCkKICAgIGJ5dGVjXzEgLy8gInBheW91dF90eXBlIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vICJwYXlvdXRfdHlwZSIKICAgIGJ5dGVjIDM0IC8vIDB4NTM1MDRjNDk1NAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjUwMwogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoQ0xPU0VEKQogICAgcHVzaGludCA1CiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo1MDQKICAgIC8vIGhhbGZfYW1vdW50ID0gcmVtYWluaW5nX2Ftb3VudCAvLyAyCiAgICBkaWcgNgogICAgaW50Y18yIC8vIDIKICAgIC8KICAgIC8vIGVzY3Jvdy5weTo1MDUKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCBoYWxmX2Ftb3VudCwgYXNzZXRfaWQpCiAgICBieXRlY18zIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICBkaWcgMQogICAgZGlnIDE1CiAgICBkdXAKICAgIGNvdmVyIDQKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0CiAgICAvLyBlc2Nyb3cucHk6NTA2CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpLCBoYWxmX2Ftb3VudCwgYXNzZXRfaWQpCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjUwNwogICAgLy8gbG9nKEJ5dGVzKGIiZGlzcHV0ZV9yZXNvbHZlZF9zcGxpdCIpKQogICAgcHVzaGJ5dGVzIDB4NjQ2OTczNzA3NTc0NjU1ZjcyNjU3MzZmNmM3NjY1NjQ1ZjczNzA2YzY5NzQKICAgIGxvZwogICAgYiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzNQoKdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUAyMDoKICAgIC8vIGVzY3Jvdy5weTo0NDYKICAgIC8vIGVsaWYgdjEgIT0gVUludDY0KDApIGFuZCB2MSA9PSB2MzoKICAgIGRpZyA1CiAgICBieiB2b3RlX2Rpc3B1dGVfZWxzZV9ib2R5QDIzCiAgICBkaWcgNQogICAgZGlnIDQKICAgID09CiAgICBieiB2b3RlX2Rpc3B1dGVfZWxzZV9ib2R5QDIzCiAgICBkaWcgNQogICAgYnVyeSAxMgogICAgYiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzMwoKdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUAyMzoKICAgIC8vIGVzY3Jvdy5weTo0NDgKICAgIC8vIGVsaWYgdjIgIT0gVUludDY0KDApIGFuZCB2MiA9PSB2MzoKICAgIGRpZyA0CiAgICBieiB2b3RlX2Rpc3B1dGVfZWxzZV9ib2R5QDI2CiAgICBkaWcgNAogICAgZGlnIDQKICAgID09CiAgICBieiB2b3RlX2Rpc3B1dGVfZWxzZV9ib2R5QDI2CiAgICBkaWcgNAogICAgYnVyeSAxMgogICAgYiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzMwoKdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUAyNjoKICAgIC8vIGVzY3Jvdy5weTo0NTAKICAgIC8vIGVsaWYgdjEgIT0gVUludDY0KDApIGFuZCB2MiAhPSBVSW50NjQoMCkgYW5kIHYzICE9IFVJbnQ2NCgwKToKICAgIGRpZyA1CiAgICBieiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzMwogICAgZGlnIDQKICAgIGJ6IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDMzCiAgICBkaWcgMwogICAgYnogdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMzMKICAgIC8vIGVzY3Jvdy5weTo0NTEKICAgIC8vIGNvbnNlbnN1c19vcHRpb24gPSBVSW50NjQoMykKICAgIHB1c2hpbnQgMwogICAgYnVyeSAxMgogICAgYiB2b3RlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUAzMwoKdm90ZV9kaXNwdXRlX2Vsc2VfYm9keUA5OgogICAgLy8gZXNjcm93LnB5OjQyNQogICAgLy8gZWxpZiBzZW5kZXIgPT0gc2VsZi5hcmJpdHJhdG9yXzIudmFsdWUgYW5kIHNlbGYuYXJiaXRyYXRvcl8yX3ZvdGUudmFsdWUgPT0gVUludDY0KDApOgogICAgYnl0ZWMgMjYgLy8gImFyYml0cmF0b3JfMiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMiBleGlzdHMKICAgIGRpZyAxNAogICAgPT0KICAgIGJ6IHZvdGVfZGlzcHV0ZV9lbHNlX2JvZHlAMTIKICAgIGJ5dGVjIDE2IC8vICJhcmJpdHJhdG9yXzJfdm90ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfMl92b3RlIGV4aXN0cwogICAgYnRvaQogICAgYm56IHZvdGVfZGlzcHV0ZV9lbHNlX2JvZHlAMTIKICAgIC8vIGVzY3Jvdy5weTo0MjYKICAgIC8vIHNlbGYuYXJiaXRyYXRvcl8yX3ZvdGUudmFsdWUgPSB2b3RlX29wdGlvbgogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyAxNiAvLyAiYXJiaXRyYXRvcl8yX3ZvdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NDI3CiAgICAvLyB2b3RlZCA9IFRydWUKICAgIGludGNfMCAvLyAxCiAgICBidXJ5IDMKICAgIGIgdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMTcKCnZvdGVfZGlzcHV0ZV9lbHNlX2JvZHlAMTI6CiAgICAvLyBlc2Nyb3cucHk6NDI4CiAgICAvLyBlbGlmIHNlbmRlciA9PSBzZWxmLmFyYml0cmF0b3JfMy52YWx1ZSBhbmQgc2VsZi5hcmJpdHJhdG9yXzNfdm90ZS52YWx1ZSA9PSBVSW50NjQoMCk6CiAgICBieXRlYyAyNyAvLyAiYXJiaXRyYXRvcl8zIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXJiaXRyYXRvcl8zIGV4aXN0cwogICAgZGlnIDE0CiAgICA9PQogICAgYnogdm90ZV9kaXNwdXRlX2FmdGVyX2lmX2Vsc2VAMTcKICAgIGJ5dGVjIDE3IC8vICJhcmJpdHJhdG9yXzNfdm90ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFyYml0cmF0b3JfM192b3RlIGV4aXN0cwogICAgYnRvaQogICAgYm56IHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDE3CiAgICAvLyBlc2Nyb3cucHk6NDI5CiAgICAvLyBzZWxmLmFyYml0cmF0b3JfM192b3RlLnZhbHVlID0gdm90ZV9vcHRpb24KICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWMgMTcgLy8gImFyYml0cmF0b3JfM192b3RlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjQzMAogICAgLy8gdm90ZWQgPSBUcnVlCiAgICBpbnRjXzAgLy8gMQogICAgYnVyeSAzCiAgICBiIHZvdGVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDE3Cgp2b3RlX2Rpc3B1dGVfYm9vbF9mYWxzZUA1OgogICAgaW50Y18xIC8vIDAKICAgIGIgdm90ZV9kaXNwdXRlX2Jvb2xfbWVyZ2VANgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5yZXNvbHZlX2Rpc3B1dGVbcm91dGluZ10oKSAtPiB2b2lkOgpyZXNvbHZlX2Rpc3B1dGU6CiAgICBwdXNoYnl0ZXMgIiIKICAgIGR1cAogICAgLy8gZXNjcm93LnB5OjUwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgc3dhcAogICAgLy8gZXNjcm93LnB5OjUxMQogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjUxMgogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NTEzCiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjUxNQogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IERJU1BVVEVECiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIHB1c2hpbnQgNAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjUxNgogICAgLy8gYXNzZXJ0IHJlc29sdXRpb24gPT0gQnl0ZXMoYiJhZ2VudF93aW4iKSBvciByZXNvbHV0aW9uID09IEJ5dGVzKGIiY3JlYXRvcl93aW4iKQogICAgcHVzaGJ5dGVzIDB4NjE2NzY1NmU3NDVmNzc2OTZlCiAgICA9PQogICAgZHVwCiAgICBibnogcmVzb2x2ZV9kaXNwdXRlX2Jvb2xfdHJ1ZUAzCiAgICBkaWcgMgogICAgcHVzaGJ5dGVzIDB4NjM3MjY1NjE3NDZmNzI1Zjc3Njk2ZQogICAgPT0KICAgIGJ6IHJlc29sdmVfZGlzcHV0ZV9ib29sX2ZhbHNlQDQKCnJlc29sdmVfZGlzcHV0ZV9ib29sX3RydWVAMzoKICAgIGludGNfMCAvLyAxCgpyZXNvbHZlX2Rpc3B1dGVfYm9vbF9tZXJnZUA1OgogICAgLy8gZXNjcm93LnB5OjUxNgogICAgLy8gYXNzZXJ0IHJlc29sdXRpb24gPT0gQnl0ZXMoYiJhZ2VudF93aW4iKSBvciByZXNvbHV0aW9uID09IEJ5dGVzKGIiY3JlYXRvcl93aW4iKQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NTE3CiAgICAvLyBhc3NlcnQgbWVkaWF0b3Jfc2lnbmF0dXJlLmxlbmd0aCA+IDAKICAgIGRpZyAxCiAgICBkdXAKICAgIGxlbgogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NTE5LTUyMAogICAgLy8gIyBDcnlwdG9ncmFwaGljYWxseSB2ZXJpZnkgbWVkaWF0b3Igc2lnbmF0dXJlCiAgICAvLyBtZWRpYXRvcl9hZGRyID0gc2VsZi5tZWRpYXRvcl9kYXRhLnZhbHVlLmFkZHJlc3MuYnl0ZXMKICAgIGJ5dGVjIDUgLy8gIm1lZGlhdG9yX2RhdGEiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZWRpYXRvcl9kYXRhIGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICAvLyBlc2Nyb3cucHk6NTIxCiAgICAvLyBtZXNzYWdlID0gb3AuaXRvYihHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9pZC5pZCkgKyByZXNvbHV0aW9uCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uSUQKICAgIGl0b2IKICAgIGRpZyA1CiAgICBjb25jYXQKICAgIC8vIGVzY3Jvdy5weTo1MjIKICAgIC8vIGFzc2VydCBvcC5lZDI1NTE5dmVyaWZ5KG1lc3NhZ2UsIG1lZGlhdG9yX3NpZ25hdHVyZSwgbWVkaWF0b3JfYWRkciksICJJbnZhbGlkIG1lZGlhdG9yIHNpZ25hdHVyZSIKICAgIGNvdmVyIDIKICAgIGVkMjU1MTl2ZXJpZnkKICAgIGFzc2VydCAvLyBJbnZhbGlkIG1lZGlhdG9yIHNpZ25hdHVyZQogICAgLy8gZXNjcm93LnB5OjUyNAogICAgLy8gZXNjcm93X2Ftb3VudCA9IHNlbGYuZXNjcm93X2Ftb3VudC52YWx1ZQogICAgYnl0ZWMgNiAvLyAiZXNjcm93X2Ftb3VudCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVzY3Jvd19hbW91bnQgZXhpc3RzCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODMKICAgIC8vIHZhbCwgZXhpc3RzID0gc2VsZi5hc3NldF9pZC5tYXliZSgpCiAgICBieXRlYyA3IC8vICJhc3NldF9pZCIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo4NAogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBjb3ZlciAyCiAgICAvLyBlc2Nyb3cucHk6NTI2CiAgICAvLyBzZWxmLl92ZXJpZnlfZXNjcm93X2JhbGFuY2UoYXNzZXRfaWQsIGVzY3Jvd19hbW91bnQpCiAgICBkaWcgMQogICAgY2FsbHN1YiBfdmVyaWZ5X2VzY3Jvd19iYWxhbmNlCiAgICAvLyBlc2Nyb3cucHk6NTI4CiAgICAvLyBmZWVfdHJlYXN1cnkgPSBlc2Nyb3dfYW1vdW50ICogMiAvLyAxMDAKICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIHB1c2hpbnQgMTAwCiAgICAvCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNvdmVyIDMKICAgIC8vIGVzY3Jvdy5weTo1MjkKICAgIC8vIGZlZV9tZWRpYXRvciA9IGVzY3Jvd19hbW91bnQgKiAyNSAvLyAxMDAwMAogICAgZHVwCiAgICBwdXNoaW50IDI1CiAgICAqCiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8KICAgIGR1cAogICAgYnVyeSAxMAogICAgLy8gZXNjcm93LnB5OjUzMAogICAgLy8gcmVtYWluaW5nX2Ftb3VudCA9IGVzY3Jvd19hbW91bnQgLSBmZWVfdHJlYXN1cnkgLSBmZWVfbWVkaWF0b3IKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgLQogICAgc3dhcAogICAgLQogICAgYnVyeSA2CiAgICAvLyBlc2Nyb3cucHk6NTMyCiAgICAvLyBpZiByZXNvbHV0aW9uID09IEJ5dGVzKGIiYWdlbnRfd2luIik6CiAgICBkaWcgMgogICAgYnogcmVzb2x2ZV9kaXNwdXRlX2Vsc2VfYm9keUA3CiAgICAvLyBlc2Nyb3cucHk6NTMzCiAgICAvLyBzZWxmLnBheW91dF90eXBlLnZhbHVlID0gQnl0ZXMoUEFZT1VUKQogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gInBheW91dF90eXBlIgogICAgYnl0ZWMgMTkgLy8gMHg1MDQxNTk0ZjU1NTQKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo1MzQKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMT1NFRCkKICAgIHB1c2hpbnQgNQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NTM1CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLnRyZWFzdXJ5X2FkZHJlc3MudmFsdWUsIGZlZV90cmVhc3VyeSwgYXNzZXRfaWQpCiAgICBieXRlYyA0IC8vICJ0cmVhc3VyeV9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJlYXN1cnlfYWRkcmVzcyBleGlzdHMKICAgIGNvdmVyIDIKICAgIGR1cAogICAgY292ZXIgMwogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo1MzYKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KEFjY291bnQoc2VsZi5tZWRpYXRvcl9kYXRhLnZhbHVlLmFkZHJlc3MuYnl0ZXMpLCBmZWVfbWVkaWF0b3IsIGFzc2V0X2lkKQogICAgYnl0ZWMgNSAvLyAibWVkaWF0b3JfZGF0YSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1lZGlhdG9yX2RhdGEgZXhpc3RzCiAgICBleHRyYWN0IDAgMzIKICAgIGRpZyA2CiAgICBkaWcgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo1MzcKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuX2dldF9hZ2VudF9hZGRyZXNzKCksIHJlbWFpbmluZ19hbW91bnQsIGFzc2V0X2lkKQogICAgY2FsbHN1YiBfZ2V0X2FnZW50X2FkZHJlc3MKICAgIGRpZyA1CiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0CiAgICAvLyBlc2Nyb3cucHk6NTM4CiAgICAvLyBsb2coQnl0ZXMoYiJkaXNwdXRlX3Jlc29sdmVkX2FnZW50X3dpbiIpKQogICAgYnl0ZWMgMzIgLy8gMHg2NDY5NzM3MDc1NzQ2NTVmNzI2NTczNmY2Yzc2NjU2NDVmNjE2NzY1NmU3NDVmNzc2OTZlCiAgICBsb2cKCnJlc29sdmVfZGlzcHV0ZV9hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBlc2Nyb3cucHk6NTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJlc29sdmVfZGlzcHV0ZV9lbHNlX2JvZHlANzoKICAgIC8vIGVzY3Jvdy5weTo1NDAKICAgIC8vIHNlbGYucGF5b3V0X3R5cGUudmFsdWUgPSBCeXRlcyhSRUZVTkQpCiAgICBieXRlY18xIC8vICJwYXlvdXRfdHlwZSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBieXRlYyAyMCAvLyAweDUyNDU0NjU1NGU0NAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjU0MQogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoQ0xPU0VEKQogICAgcHVzaGludCA1CiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo1NDIKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYudHJlYXN1cnlfYWRkcmVzcy52YWx1ZSwgZmVlX3RyZWFzdXJ5LCBhc3NldF9pZCkKICAgIGJ5dGVjIDQgLy8gInRyZWFzdXJ5X2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50cmVhc3VyeV9hZGRyZXNzIGV4aXN0cwogICAgY292ZXIgMgogICAgZHVwCiAgICBjb3ZlciAzCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjU0MwogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksIGZlZV9tZWRpYXRvciwgYXNzZXRfaWQpCiAgICBieXRlYyA1IC8vICJtZWRpYXRvcl9kYXRhIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWVkaWF0b3JfZGF0YSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgZGlnIDYKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjU0NAogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsIHJlbWFpbmluZ19hbW91bnQsIGFzc2V0X2lkKQogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgZGlnIDUKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo1NDUKICAgIC8vIGxvZyhCeXRlcyhiImRpc3B1dGVfcmVzb2x2ZWRfY3JlYXRvcl93aW4iKSkKICAgIGJ5dGVjIDMzIC8vIDB4NjQ2OTczNzA3NTc0NjU1ZjcyNjU3MzZmNmM3NjY1NjQ1ZjYzNzI2NTYxNzQ2ZjcyNWY3NzY5NmUKICAgIGxvZwogICAgYiByZXNvbHZlX2Rpc3B1dGVfYWZ0ZXJfaWZfZWxzZUA4CgpyZXNvbHZlX2Rpc3B1dGVfYm9vbF9mYWxzZUA0OgogICAgaW50Y18xIC8vIDAKICAgIGIgcmVzb2x2ZV9kaXNwdXRlX2Jvb2xfbWVyZ2VANQoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5hdXRvX3Jlc29sdmVfY3JlYXRvcl93aW5bcm91dGluZ10oKSAtPiB2b2lkOgphdXRvX3Jlc29sdmVfY3JlYXRvcl93aW46CiAgICAvLyBlc2Nyb3cucHk6NTQ5CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NTUwCiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo1NTIKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBESVNQVVRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo1NTQKICAgIC8vIGNyZWF0ZWRfdHMgPSBzZWxmLmRpc3B1dGVfdGltZXN0YW1wLnZhbHVlCiAgICBieXRlYyAyNCAvLyAiZGlzcHV0ZV90aW1lc3RhbXAiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kaXNwdXRlX3RpbWVzdGFtcCBleGlzdHMKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo1NTYKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGNyZWF0ZWRfdHMgKyB0aW1lb3V0CiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBzd2FwCiAgICAvLyBlc2Nyb3cucHk6NTU1CiAgICAvLyB0aW1lb3V0ID0gVUludDY0KDE0ICogMjQgKiA2MCAqIDYwKSAgIyAxNCBkYXlzCiAgICBwdXNoaW50IDEyMDk2MDAKICAgIC8vIGVzY3Jvdy5weTo1NTYKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGNyZWF0ZWRfdHMgKyB0aW1lb3V0CiAgICArCiAgICA+CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo1NTgKICAgIC8vIHNlbGYucGF5b3V0X3R5cGUudmFsdWUgPSBCeXRlcyhSRUZVTkQpCiAgICBieXRlY18xIC8vICJwYXlvdXRfdHlwZSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBieXRlYyAyMCAvLyAweDUyNDU0NjU1NGU0NAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjU1OQogICAgLy8gc2VsZi5zdGF0ZV9ib3gudmFsdWUgPSBVSW50NjQoQ0xPU0VEKQogICAgcHVzaGludCA1CiAgICBpdG9iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo1NjEKICAgIC8vIGVzY3Jvd19hbW91bnQgPSBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUKICAgIGJ5dGVjIDYgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjgzCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNyAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODQKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTo1NjMKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjU2NQogICAgLy8gZmVlX3RyZWFzdXJ5ID0gZXNjcm93X2Ftb3VudCAqIDIgLy8gMTAwCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIHB1c2hpbnQgMTAwCiAgICAvCiAgICAvLyBlc2Nyb3cucHk6NTY2CiAgICAvLyBmZWVfbWVkaWF0b3IgPSBlc2Nyb3dfYW1vdW50ICogMjUgLy8gMTAwMDAKICAgIGRpZyAyCiAgICBwdXNoaW50IDI1CiAgICAqCiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8KICAgIC8vIGVzY3Jvdy5weTo1NjcKICAgIC8vIHJlbWFpbmluZ19hbW91bnQgPSBlc2Nyb3dfYW1vdW50IC0gZmVlX3RyZWFzdXJ5IC0gZmVlX21lZGlhdG9yCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICAtCiAgICBkaWcgMQogICAgLQogICAgLy8gZXNjcm93LnB5OjU2OQogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi50cmVhc3VyeV9hZGRyZXNzLnZhbHVlLCBmZWVfdHJlYXN1cnksIGFzc2V0X2lkKQogICAgYnl0ZWMgNCAvLyAidHJlYXN1cnlfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyZWFzdXJ5X2FkZHJlc3MgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjU3MAogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksIGZlZV9tZWRpYXRvciwgYXNzZXRfaWQpCiAgICBieXRlYyA1IC8vICJtZWRpYXRvcl9kYXRhIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWVkaWF0b3JfZGF0YSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMwogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo1NzEKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCByZW1haW5pbmdfYW1vdW50LCBhc3NldF9pZCkKICAgIGJ5dGVjXzMgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo1NzMKICAgIC8vIGxvZyhCeXRlcyhiImRpc3B1dGVfYXV0b19yZXNvbHZlZF9jcmVhdG9yX3dpbiIpKQogICAgcHVzaGJ5dGVzIDB4NjQ2OTczNzA3NTc0NjU1ZjYxNzU3NDZmNWY3MjY1NzM2ZjZjNzY2NTY0NWY2MzcyNjU2MTc0NmY3MjVmNzc2OTZlCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo1NDcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC50aW1lb3V0X2Rpc3B1dGVbcm91dGluZ10oKSAtPiB2b2lkOgp0aW1lb3V0X2Rpc3B1dGU6CiAgICAvLyBlc2Nyb3cucHk6NTc3CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NTc4CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo1ODAKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBESVNQVVRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBwdXNoaW50IDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo1ODIKICAgIC8vIGRpc3B1dGVfdHMgPSBzZWxmLmRpc3B1dGVfdGltZXN0YW1wLnZhbHVlCiAgICBieXRlYyAyNCAvLyAiZGlzcHV0ZV90aW1lc3RhbXAiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kaXNwdXRlX3RpbWVzdGFtcCBleGlzdHMKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo1ODMKICAgIC8vIGRpc3B1dGVfdGltZW91dCA9IFRlbXBsYXRlVmFyW1VJbnQ2NF0oIkRJU1BVVEVfVElNRU9VVCIpCiAgICBpbnRjIDcgLy8gVE1QTF9ESVNQVVRFX1RJTUVPVVQKICAgIC8vIGVzY3Jvdy5weTo1ODQKICAgIC8vIGFzc2VydCBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA+IGRpc3B1dGVfdHMgKyBkaXNwdXRlX3RpbWVvdXQsICJEaXNwdXRlIHRpbWVvdXQgbm90IHlldCByZWFjaGVkIgogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgY292ZXIgMgogICAgKwogICAgPgogICAgYXNzZXJ0IC8vIERpc3B1dGUgdGltZW91dCBub3QgeWV0IHJlYWNoZWQKICAgIC8vIGVzY3Jvdy5weTo1ODYKICAgIC8vIGVzY3Jvd19hbW91bnQgPSBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUKICAgIGJ5dGVjIDYgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjgzCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNyAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODQKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTo1ODgKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjU5MC01OTEKICAgIC8vICMgMiUgdHJlYXN1cnksIDAuMjUlIG1lZGlhdG9yLCByZW1haW5kZXIgc3BsaXQKICAgIC8vIGZlZV90cmVhc3VyeSA9IGVzY3Jvd19hbW91bnQgKiAyIC8vIDEwMAogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBwdXNoaW50IDEwMAogICAgLwogICAgLy8gZXNjcm93LnB5OjU5MgogICAgLy8gZmVlX21lZGlhdG9yID0gZXNjcm93X2Ftb3VudCAqIDI1IC8vIDEwMDAwCiAgICBkaWcgMgogICAgcHVzaGludCAyNQogICAgKgogICAgaW50YyA0IC8vIDEwMDAwCiAgICAvCiAgICAvLyBlc2Nyb3cucHk6NTkzCiAgICAvLyByZW1haW5pbmdfYW1vdW50ID0gZXNjcm93X2Ftb3VudCAtIGZlZV90cmVhc3VyeSAtIGZlZV9tZWRpYXRvcgogICAgdW5jb3ZlciAzCiAgICBkaWcgMgogICAgLQogICAgZGlnIDEKICAgIC0KICAgIC8vIGVzY3Jvdy5weTo1OTQKICAgIC8vIGhhbGZfYW1vdW50ID0gcmVtYWluaW5nX2Ftb3VudCAvLyAyCiAgICBpbnRjXzIgLy8gMgogICAgLwogICAgLy8gZXNjcm93LnB5OjU5NgogICAgLy8gc2VsZi5wYXlvdXRfdHlwZS52YWx1ZSA9IEJ5dGVzKFNQTElUKQogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gInBheW91dF90eXBlIgogICAgYnl0ZWMgMzQgLy8gMHg1MzUwNGM0OTU0CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NTk3CiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChDTE9TRUQpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjU5OQogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi50cmVhc3VyeV9hZGRyZXNzLnZhbHVlLCBmZWVfdHJlYXN1cnksIGFzc2V0X2lkKQogICAgYnl0ZWMgNCAvLyAidHJlYXN1cnlfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyZWFzdXJ5X2FkZHJlc3MgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjYwMAogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksIGZlZV9tZWRpYXRvciwgYXNzZXRfaWQpCiAgICBieXRlYyA1IC8vICJtZWRpYXRvcl9kYXRhIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWVkaWF0b3JfZGF0YSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMwogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo2MDEKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLCBoYWxmX2Ftb3VudCwgYXNzZXRfaWQpCiAgICBieXRlY18zIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0CiAgICAvLyBlc2Nyb3cucHk6NjAyCiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLl9nZXRfYWdlbnRfYWRkcmVzcygpLCBoYWxmX2Ftb3VudCwgYXNzZXRfaWQpCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjYwNAogICAgLy8gbG9nKEJ5dGVzKGIiZGlzcHV0ZV90aW1lb3V0X3NwbGl0IikpCiAgICBwdXNoYnl0ZXMgMHg2NDY5NzM3MDc1NzQ2NTVmNzQ2OTZkNjU2Zjc1NzQ1ZjczNzA2YzY5NzQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjU3NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LmF1dG9fcmVsZWFzZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmF1dG9fcmVsZWFzZToKICAgIC8vIGVzY3Jvdy5weTo2MDgKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2MDkKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjYxMQogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IFNVQk1JVFRFRAogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zdGF0ZV9ib3ggZXhpc3RzCiAgICBidG9pCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojg3CiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuaXNfaGl0bS5tYXliZSgpCiAgICBieXRlYyAxOCAvLyAiaXNfaGl0bSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo4OAogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjYxMgogICAgLy8gYXNzZXJ0IHNlbGYuX2dldF9pc19oaXRtKCkgPT0gMQogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2MTQKICAgIC8vIGRlYWRsaW5lID0gc2VsZi5yZXZpZXdfZGVhZGxpbmUudmFsdWUKICAgIGJ5dGVjIDIzIC8vICJyZXZpZXdfZGVhZGxpbmUiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5yZXZpZXdfZGVhZGxpbmUgZXhpc3RzCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6NjE1CiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPj0gZGVhZGxpbmUKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDw9CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2MTcKICAgIC8vIGVzY3Jvd19hbW91bnQgPSBzZWxmLmVzY3Jvd19hbW91bnQudmFsdWUKICAgIGJ5dGVjIDYgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjgzCiAgICAvLyB2YWwsIGV4aXN0cyA9IHNlbGYuYXNzZXRfaWQubWF5YmUoKQogICAgYnl0ZWMgNyAvLyAiYXNzZXRfaWQiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODQKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgVUludDY0KDApCiAgICBpbnRjXzEgLy8gMAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC8vIGVzY3Jvdy5weTo2MTkKICAgIC8vIHNlbGYuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZCwgZXNjcm93X2Ftb3VudCkKICAgIGR1cAogICAgZGlnIDIKICAgIGNhbGxzdWIgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZQogICAgLy8gZXNjcm93LnB5OjYyMQogICAgLy8gc2VsZi5wYXlvdXRfdHlwZS52YWx1ZSA9IEJ5dGVzKFBBWU9VVCkKICAgIGJ5dGVjXzEgLy8gInBheW91dF90eXBlIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18xIC8vICJwYXlvdXRfdHlwZSIKICAgIGJ5dGVjIDE5IC8vIDB4NTA0MTU5NGY1NTU0CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NjIyCiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChDTE9TRUQpCiAgICBwdXNoaW50IDUKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjYyNAogICAgLy8gZmVlX3RyZWFzdXJ5ID0gZXNjcm93X2Ftb3VudCAqIDIgLy8gMTAwCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDIKICAgICoKICAgIHB1c2hpbnQgMTAwCiAgICAvCiAgICAvLyBlc2Nyb3cucHk6NjI1CiAgICAvLyBmZWVfbWVkaWF0b3IgPSBlc2Nyb3dfYW1vdW50ICogMjUgLy8gMTAwMDAKICAgIGRpZyAyCiAgICBwdXNoaW50IDI1CiAgICAqCiAgICBpbnRjIDQgLy8gMTAwMDAKICAgIC8KICAgIC8vIGVzY3Jvdy5weTo2MjYKICAgIC8vIHJlbWFpbmluZ19hbW91bnQgPSBlc2Nyb3dfYW1vdW50IC0gZmVlX3RyZWFzdXJ5IC0gZmVlX21lZGlhdG9yCiAgICB1bmNvdmVyIDMKICAgIGRpZyAyCiAgICAtCiAgICBkaWcgMQogICAgLQogICAgLy8gZXNjcm93LnB5OjYyOAogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi50cmVhc3VyeV9hZGRyZXNzLnZhbHVlLCBmZWVfdHJlYXN1cnksIGFzc2V0X2lkKQogICAgYnl0ZWMgNCAvLyAidHJlYXN1cnlfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRyZWFzdXJ5X2FkZHJlc3MgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGRpZyA0CiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjYyOQogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoQWNjb3VudChzZWxmLm1lZGlhdG9yX2RhdGEudmFsdWUuYWRkcmVzcy5ieXRlcyksIGZlZV9tZWRpYXRvciwgYXNzZXRfaWQpCiAgICBieXRlYyA1IC8vICJtZWRpYXRvcl9kYXRhIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWVkaWF0b3JfZGF0YSBleGlzdHMKICAgIGV4dHJhY3QgMCAzMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMwogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo2MzAKICAgIC8vIHNlbGYuX3NlbmRfcGF5b3V0KHNlbGYuX2dldF9hZ2VudF9hZGRyZXNzKCksIHJlbWFpbmluZ19hbW91bnQsIGFzc2V0X2lkKQogICAgY2FsbHN1YiBfZ2V0X2FnZW50X2FkZHJlc3MKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBfc2VuZF9wYXlvdXQKICAgIC8vIGVzY3Jvdy5weTo2MzIKICAgIC8vIGxvZyhCeXRlcyhiImF1dG9fcmVsZWFzZWRfaGl0bSIpKQogICAgcHVzaGJ5dGVzIDB4NjE3NTc0NmY1ZjcyNjU2YzY1NjE3MzY1NjQ1ZjY4Njk3NDZkCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo2MDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5jbGFpbV9hYmFuZG9uZWRbcm91dGluZ10oKSAtPiB2b2lkOgpjbGFpbV9hYmFuZG9uZWQ6CiAgICAvLyBlc2Nyb3cucHk6NjM2CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NjM3CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2MzgKICAgIC8vIGFzc2VydCBUeG4ucmVrZXlfdG8gPT0gQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgdHhuIFJla2V5VG8KICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NjQwCiAgICAvLyBhc3NlcnQgc2VsZi5zdGF0ZV9ib3gudmFsdWUgPT0gUkVKRUNURUQKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdGVfYm94IGV4aXN0cwogICAgYnRvaQogICAgcHVzaGludCAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6OTkKICAgIC8vIHZhbCwgZXhpc3RzID0gc2VsZi5yZWplY3Rpb25fY291bnQubWF5YmUoKQogICAgYnl0ZWMgOCAvLyAicmVqZWN0aW9uX2NvdW50IgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjEwMAogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjY0MQogICAgLy8gYXNzZXJ0IHNlbGYuX2dldF9yZWplY3Rpb25fY291bnQoKSA+PSBNQVhfUkVKRUNUSU9OUwogICAgcHVzaGludCAzCiAgICA+PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NjQyCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjY0NAogICAgLy8gZXNjcm93X2Ftb3VudCA9IHNlbGYuZXNjcm93X2Ftb3VudC52YWx1ZQogICAgYnl0ZWMgNiAvLyAiZXNjcm93X2Ftb3VudCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVzY3Jvd19hbW91bnQgZXhpc3RzCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6ODMKICAgIC8vIHZhbCwgZXhpc3RzID0gc2VsZi5hc3NldF9pZC5tYXliZSgpCiAgICBieXRlYyA3IC8vICJhc3NldF9pZCIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo4NAogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5OjY0NgogICAgLy8gc2VsZi5fdmVyaWZ5X2VzY3Jvd19iYWxhbmNlKGFzc2V0X2lkLCBlc2Nyb3dfYW1vdW50KQogICAgZHVwCiAgICBkaWcgMgogICAgY2FsbHN1YiBfdmVyaWZ5X2VzY3Jvd19iYWxhbmNlCiAgICAvLyBlc2Nyb3cucHk6NjQ4CiAgICAvLyBzZWxmLnBheW91dF90eXBlLnZhbHVlID0gQnl0ZXMoUkVGVU5EKQogICAgYnl0ZWNfMSAvLyAicGF5b3V0X3R5cGUiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzEgLy8gInBheW91dF90eXBlIgogICAgYnl0ZWMgMjAgLy8gMHg1MjQ1NDY1NTRlNDQKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo2NDkKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMT1NFRCkKICAgIHB1c2hpbnQgNQogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAic3RhdGUiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NjUxCiAgICAvLyBmZWVfdHJlYXN1cnkgPSBlc2Nyb3dfYW1vdW50ICogMiAvLyAxMDAKICAgIGRpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgcHVzaGludCAxMDAKICAgIC8KICAgIC8vIGVzY3Jvdy5weTo2NTIKICAgIC8vIGZlZV9tZWRpYXRvciA9IGVzY3Jvd19hbW91bnQgKiAyNSAvLyAxMDAwMAogICAgZGlnIDIKICAgIHB1c2hpbnQgMjUKICAgICoKICAgIGludGMgNCAvLyAxMDAwMAogICAgLwogICAgLy8gZXNjcm93LnB5OjY1MwogICAgLy8gcmVtYWluaW5nX2Ftb3VudCA9IGVzY3Jvd19hbW91bnQgLSBmZWVfdHJlYXN1cnkgLSBmZWVfbWVkaWF0b3IKICAgIHVuY292ZXIgMwogICAgZGlnIDIKICAgIC0KICAgIGRpZyAxCiAgICAtCiAgICAvLyBlc2Nyb3cucHk6NjU1CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChzZWxmLnRyZWFzdXJ5X2FkZHJlc3MudmFsdWUsIGZlZV90cmVhc3VyeSwgYXNzZXRfaWQpCiAgICBieXRlYyA0IC8vICJ0cmVhc3VyeV9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHJlYXN1cnlfYWRkcmVzcyBleGlzdHMKICAgIHVuY292ZXIgMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3NlbmRfcGF5b3V0CiAgICAvLyBlc2Nyb3cucHk6NjU2CiAgICAvLyBzZWxmLl9zZW5kX3BheW91dChBY2NvdW50KHNlbGYubWVkaWF0b3JfZGF0YS52YWx1ZS5hZGRyZXNzLmJ5dGVzKSwgZmVlX21lZGlhdG9yLCBhc3NldF9pZCkKICAgIGJ5dGVjIDUgLy8gIm1lZGlhdG9yX2RhdGEiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZWRpYXRvcl9kYXRhIGV4aXN0cwogICAgZXh0cmFjdCAwIDMyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjY1NwogICAgLy8gc2VsZi5fc2VuZF9wYXlvdXQoc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUsIHJlbWFpbmluZ19hbW91bnQsIGFzc2V0X2lkKQogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBjYWxsc3ViIF9zZW5kX3BheW91dAogICAgLy8gZXNjcm93LnB5OjY1OQogICAgLy8gbG9nKEJ5dGVzKGIiYWJhbmRvbmVkX3JlZnVuZGVkX2NyZWF0b3IiKSkKICAgIHB1c2hieXRlcyAweDYxNjI2MTZlNjQ2ZjZlNjU2NDVmNzI2NTY2NzU2ZTY0NjU2NDVmNjM3MjY1NjE3NDZmNzIKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjYzNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LmV4cGlyZV9jbGFpbVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmV4cGlyZV9jbGFpbToKICAgIC8vIGVzY3Jvdy5weTo2NjMKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2NjQKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjY2NgogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IENMQUlNRUQKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdGVfYm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2NjgKICAgIC8vIGNsYWltX2RlYWRsaW5lID0gc2VsZi5jbGFpbV9kZWFkbGluZS52YWx1ZQogICAgYnl0ZWMgMzAgLy8gImNsYWltX2RlYWRsaW5lIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY2xhaW1fZGVhZGxpbmUgZXhpc3RzCiAgICBidG9pCiAgICAvLyBlc2Nyb3cucHk6NjY5CiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPiBjbGFpbV9kZWFkbGluZSwgIkNsYWltIGRlYWRsaW5lIG5vdCB5ZXQgcmVhY2hlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIDwKICAgIGFzc2VydCAvLyBDbGFpbSBkZWFkbGluZSBub3QgeWV0IHJlYWNoZWQKICAgIC8vIGVzY3Jvdy5weTo2NzEtNjcyCiAgICAvLyAjIFJlY29yZCBjbGFpbSBleHBpcnkKICAgIC8vIHNlbGYuc3RhdGVfYm94LnZhbHVlID0gVUludDY0KENMQUlNX0VYUElSRUQpCiAgICBwdXNoaW50IDcKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjY3MwogICAgLy8gbG9nKEJ5dGVzKGIiY2xhaW1fZXhwaXJlZCIpKQogICAgcHVzaGJ5dGVzIDB4NjM2YzYxNjk2ZDVmNjU3ODcwNjk3MjY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjY3NAogICAgLy8gbG9nKHNlbGYuYm91bnR5X2lkLnZhbHVlKQogICAgYnl0ZWMgMTMgLy8gImJvdW50eV9pZCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvdW50eV9pZCBleGlzdHMKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjY3NQogICAgLy8gbG9nKHNlbGYuX2dldF9hZ2VudF9hZGRyZXNzKCkuYnl0ZXMpCiAgICBjYWxsc3ViIF9nZXRfYWdlbnRfYWRkcmVzcwogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6Njc2CiAgICAvLyBsb2coQnl0ZXMoYiJrYXJtYV9wZW5hbHR5XzIwIikpCiAgICBwdXNoYnl0ZXMgMHg2YjYxNzI2ZDYxNWY3MDY1NmU2MTZjNzQ3OTVmMzIzMAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6Njc4LTY3OQogICAgLy8gIyBTRUNVUklUWSBGSVg6IFJldmVydCBhZ2VudCBhZGRyZXNzIHRvIHplcm8gYWRkcmVzcyBzbyBzb21lb25lIGVsc2UgY2FuIGNsYWltCiAgICAvLyBzZWxmLmFnZW50X2FkZHJlc3MudmFsdWUgPSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICBieXRlYyAxMCAvLyAiYWdlbnRfYWRkcmVzcyIKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NjgxLTY4MgogICAgLy8gIyBSZXZlcnQgdG8gT1BFTiBzbyBvdGhlcnMgY2FuIGNsYWltCiAgICAvLyBzZWxmLnN0YXRlX2JveC52YWx1ZSA9IFVJbnQ2NChPUEVOKQogICAgaW50Y18xIC8vIDAKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo2ODMKICAgIC8vIHNlbGYucmVqZWN0aW9uX2NvdW50LnZhbHVlID0gVUludDY0KDApCiAgICBieXRlYyA4IC8vICJyZWplY3Rpb25fY291bnQiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6Njg1CiAgICAvLyBsb2coQnl0ZXMoYiJib3VudHlfcmVvcGVuZWQiKSkKICAgIHB1c2hieXRlcyAweDYyNmY3NTZlNzQ3OTVmNzI2NTZmNzA2NTZlNjU2NAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuZ2l0aHViX3ZlcmlmeVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmdpdGh1Yl92ZXJpZnk6CiAgICAvLyBlc2Nyb3cucHk6Njg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQxNiAvLyBvbiBlcnJvcjogaW52YWxpZCBhcnJheSBsZW5ndGggaGVhZGVyCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZGlnIDEKICAgIGxlbgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5keW5hbWljX2FycmF5PGFyYzQudWludDg+CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYgLy8gb24gZXJyb3I6IGludmFsaWQgYXJyYXkgbGVuZ3RoIGhlYWRlcgogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGRpZyAxCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuZHluYW1pY19hcnJheTxhcmM0LnVpbnQ4PgogICAgZXh0cmFjdCAyIDAKICAgIC8vIGVzY3Jvdy5weTo2ODkKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2OTAKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjY5MQogICAgLy8gYXNzZXJ0IFR4bi5yZWtleV90byA9PSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICB0eG4gUmVrZXlUbwogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2OTMKICAgIC8vIGFzc2VydCBzZWxmLnN0YXRlX2JveC52YWx1ZSA9PSBTVUJNSVRURUQKICAgIGJ5dGVjXzAgLy8gInN0YXRlIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuc3RhdGVfYm94IGV4aXN0cwogICAgYnRvaQogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo2OTUtNjk2CiAgICAvLyAjIFN0b3JlIEdpdEh1YiB2ZXJpZmljYXRpb24gZGF0YQogICAgLy8gc2VsZi5wcm9vZl91cmwudmFsdWUgPSBwcl91cmwKICAgIGJ5dGVjIDExIC8vICJwcm9vZl91cmwiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDExIC8vICJwcm9vZl91cmwiCiAgICB1bmNvdmVyIDMKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo2OTcKICAgIC8vIHNlbGYuZ2l0aHViX3N0YXR1cy52YWx1ZSA9IEJ5dGVzKGIicGVuZGluZyIpCiAgICBieXRlYyAyMSAvLyAiZ2l0aHViX3N0YXR1cyIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMjEgLy8gImdpdGh1Yl9zdGF0dXMiCiAgICBieXRlYyAyOCAvLyAweDcwNjU2ZTY0Njk2ZTY3CiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6Njk5LTcwMAogICAgLy8gIyBTdG9yZSB0ZXN0IGhhc2ggaW4gcHJvb2ZfZGF0YQogICAgLy8gc2VsZi5wcm9vZl9kYXRhLnZhbHVlID0gdGVzdF9oYXNoCiAgICBieXRlYyAxMiAvLyAicHJvb2ZfZGF0YSIKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWMgMTIgLy8gInByb29mX2RhdGEiCiAgICB1bmNvdmVyIDIKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo3MDItNzAzCiAgICAvLyAjIFN0b3JlIE9JREMgdG9rZW4KICAgIC8vIHNlbGYub2lkY190b2tlbi52YWx1ZSA9IG9pZGNfdG9rZW4KICAgIGJ5dGVjIDM1IC8vICJvaWRjX3Rva2VuIgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlYyAzNSAvLyAib2lkY190b2tlbiIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo3MDUKICAgIC8vIGxvZyhCeXRlcyhiImdpdGh1Yl92ZXJpZmllZCIpKQogICAgcHVzaGJ5dGVzIDB4Njc2OTc0Njg3NTYyNWY3NjY1NzI2OTY2Njk2NTY0CiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo3MDYKICAgIC8vIGxvZyhzZWxmLmJvdW50eV9pZC52YWx1ZSkKICAgIGJ5dGVjIDEzIC8vICJib3VudHlfaWQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3VudHlfaWQgZXhpc3RzCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo3MDcKICAgIC8vIGxvZyhCeXRlcyhiInBlbmRpbmciKSkKICAgIGJ5dGVjIDI4IC8vIDB4NzA2NTZlNjQ2OTZlNjcKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjY4NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LnNldF9naXRodWJfc3RhdHVzW3JvdXRpbmddKCkgLT4gdm9pZDoKc2V0X2dpdGh1Yl9zdGF0dXM6CiAgICAvLyBlc2Nyb3cucHk6NzA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2IC8vIG9uIGVycm9yOiBpbnZhbGlkIGFycmF5IGxlbmd0aCBoZWFkZXIKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBkaWcgMQogICAgbGVuCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LmR5bmFtaWNfYXJyYXk8YXJjNC51aW50OD4KICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIC8vIGVzY3Jvdy5weTo3MTEKICAgIC8vIGFzc2VydCBUeG4udHlwZV9lbnVtID09IFRyYW5zYWN0aW9uVHlwZS5BcHBsaWNhdGlvbkNhbGwKICAgIHR4biBUeXBlRW51bQogICAgaW50Y18zIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo3MTIKICAgIC8vIGFzc2VydCBUeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk5vT3AKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjcxMwogICAgLy8gYXNzZXJ0IFR4bi5yZWtleV90byA9PSBBY2NvdW50KEJ5dGVzKDMyICogYiJceDAwIikpCiAgICB0eG4gUmVrZXlUbwogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo3MTUKICAgIC8vIGFzc2VydCBzdGF0dXMgPT0gQnl0ZXMoYiJwYXNzIikgb3Igc3RhdHVzID09IEJ5dGVzKGIiZmFpbCIpIG9yIHN0YXR1cyA9PSBCeXRlcyhiInBlbmRpbmciKQogICAgcHVzaGJ5dGVzIDB4NzA2MTczNzMKICAgID09CiAgICBibnogc2V0X2dpdGh1Yl9zdGF0dXNfYm9vbF90cnVlQDQKICAgIGR1cAogICAgcHVzaGJ5dGVzIDB4NjY2MTY5NmMKICAgID09CiAgICBibnogc2V0X2dpdGh1Yl9zdGF0dXNfYm9vbF90cnVlQDQKICAgIGR1cAogICAgYnl0ZWMgMjggLy8gMHg3MDY1NmU2NDY5NmU2NwogICAgPT0KICAgIGJ6IHNldF9naXRodWJfc3RhdHVzX2Jvb2xfZmFsc2VANQoKc2V0X2dpdGh1Yl9zdGF0dXNfYm9vbF90cnVlQDQ6CiAgICBpbnRjXzAgLy8gMQoKc2V0X2dpdGh1Yl9zdGF0dXNfYm9vbF9tZXJnZUA2OgogICAgLy8gZXNjcm93LnB5OjcxNQogICAgLy8gYXNzZXJ0IHN0YXR1cyA9PSBCeXRlcyhiInBhc3MiKSBvciBzdGF0dXMgPT0gQnl0ZXMoYiJmYWlsIikgb3Igc3RhdHVzID09IEJ5dGVzKGIicGVuZGluZyIpCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo3MTcKICAgIC8vIHNlbGYuZ2l0aHViX3N0YXR1cy52YWx1ZSA9IHN0YXR1cwogICAgYnl0ZWMgMjEgLy8gImdpdGh1Yl9zdGF0dXMiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDIxIC8vICJnaXRodWJfc3RhdHVzIgogICAgZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5OjcxOQogICAgLy8gbG9nKEJ5dGVzKGIiZ2l0aHViX3N0YXR1c191cGRhdGVkIikpCiAgICBwdXNoYnl0ZXMgMHg2NzY5NzQ2ODc1NjI1ZjczNzQ2MTc0NzU3MzVmNzU3MDY0NjE3NDY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjcyMAogICAgLy8gbG9nKHN0YXR1cykKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjcwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpzZXRfZ2l0aHViX3N0YXR1c19ib29sX2ZhbHNlQDU6CiAgICBpbnRjXzEgLy8gMAogICAgYiBzZXRfZ2l0aHViX3N0YXR1c19ib29sX21lcmdlQDYKCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuZ2V0X2JvdW50eV9pbmZvW3JvdXRpbmddKCkgLT4gdm9pZDoKZ2V0X2JvdW50eV9pbmZvOgogICAgLy8gZXNjcm93LnB5OjcyNAogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5OjcyNQogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NzI3CiAgICAvLyBsb2coQnl0ZXMoYiJib3VudHlfaW5mbyIpKQogICAgcHVzaGJ5dGVzIDB4NjI2Zjc1NmU3NDc5NWY2OTZlNjY2ZgogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NzI4CiAgICAvLyBsb2cob3AuaXRvYihzZWxmLnN0YXRlX2JveC52YWx1ZSkpCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIGl0b2IKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjcyOQogICAgLy8gbG9nKHNlbGYuYm91bnR5X2lkLnZhbHVlKQogICAgYnl0ZWMgMTMgLy8gImJvdW50eV9pZCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJvdW50eV9pZCBleGlzdHMKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjczMAogICAgLy8gbG9nKG9wLml0b2Ioc2VsZi5lc2Nyb3dfYW1vdW50LnZhbHVlKSkKICAgIGJ5dGVjIDYgLy8gImVzY3Jvd19hbW91bnQiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5lc2Nyb3dfYW1vdW50IGV4aXN0cwogICAgYnRvaQogICAgaXRvYgogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NzMxCiAgICAvLyBsb2coc2VsZi5jcmVhdG9yX2FkZHJlc3MudmFsdWUuYnl0ZXMpCiAgICBieXRlY18zIC8vICJjcmVhdG9yX2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jcmVhdG9yX2FkZHJlc3MgZXhpc3RzCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo3MzIKICAgIC8vIGxvZyhzZWxmLmFnZW50X2FkZHJlc3MudmFsdWUuYnl0ZXMpCiAgICBieXRlYyAxMCAvLyAiYWdlbnRfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFnZW50X2FkZHJlc3MgZXhpc3RzCiAgICBsb2cKICAgIC8vIGVzY3Jvdy5weTo3MzMKICAgIC8vIGxvZyhvcC5pdG9iKHNlbGYucmVqZWN0aW9uX2NvdW50LnZhbHVlKSkKICAgIGJ5dGVjIDggLy8gInJlamVjdGlvbl9jb3VudCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnJlamVjdGlvbl9jb3VudCBleGlzdHMKICAgIGJ0b2kKICAgIGl0b2IKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjcyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LnJlZ2lzdGVyX2FyYml0cmF0b3Jbcm91dGluZ10oKSAtPiB2b2lkOgpyZWdpc3Rlcl9hcmJpdHJhdG9yOgogICAgLy8gZXNjcm93LnB5OjczNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBlc2Nyb3cucHk6NzM3CiAgICAvLyBhc3NlcnQgVHhuLnR5cGVfZW51bSA9PSBUcmFuc2FjdGlvblR5cGUuQXBwbGljYXRpb25DYWxsCiAgICB0eG4gVHlwZUVudW0KICAgIGludGNfMyAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NzM4CiAgICAvLyBhc3NlcnQgVHhuLm9uX2NvbXBsZXRpb24gPT0gT25Db21wbGV0ZUFjdGlvbi5Ob09wCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGVzY3Jvdy5weTo3MzkKICAgIC8vIGFzc2VydCBUeG4ucmVrZXlfdG8gPT0gQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgdHhuIFJla2V5VG8KICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NzQxCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBhZGRyZXNzLCAiU2VuZGVyIG11c3QgbWF0Y2ggYWRkcmVzcyB0byByZWdpc3RlciIKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIFNlbmRlciBtdXN0IG1hdGNoIGFkZHJlc3MgdG8gcmVnaXN0ZXIKICAgIC8vIGVzY3Jvdy5weTo3NDMtNzQ0CiAgICAvLyAjIENoZWNrIGlmIGFscmVhZHkgcmVnaXN0ZXJlZAogICAgLy8ga2V5X2lkeCA9IEJ5dGVzKGIiY2FuZF9pZHhfIikgKyBhZGRyZXNzLmJ5dGVzCiAgICBieXRlYyAyOSAvLyAweDYzNjE2ZTY0NWY2OTY0Nzg1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgLy8gZXNjcm93LnB5Ojc0NQogICAgLy8gZHVtbXksIGV4aXN0cyA9IG9wLkJveC5nZXQoa2V5X2lkeCkKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBlc2Nyb3cucHk6NzQ2CiAgICAvLyBhc3NlcnQgbm90IGV4aXN0cywgIkFyYml0cmF0b3IgYWxyZWFkeSByZWdpc3RlcmVkIgogICAgIQogICAgYXNzZXJ0IC8vIEFyYml0cmF0b3IgYWxyZWFkeSByZWdpc3RlcmVkCiAgICAvLyBlc2Nyb3cucHk6NzkKICAgIC8vIHZhbCwgZXhpc3RzID0gc2VsZi5jYW5kaWRhdGVfY291bnQubWF5YmUoKQogICAgYnl0ZWMgMTQgLy8gImNhbmRpZGF0ZV9jb3VudCIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIC8vIGVzY3Jvdy5weTo4MAogICAgLy8gcmV0dXJuIHZhbCBpZiBleGlzdHMgZWxzZSBVSW50NjQoMCkKICAgIGludGNfMSAvLyAwCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgLy8gZXNjcm93LnB5Ojc1MC03NTEKICAgIC8vICMgV3JpdGUgdG8gcG9vbAogICAgLy8gQm94KEFjY291bnQsIGtleT1CeXRlcyhiImNhbmRfYWRkcl8iKSArIG9wLml0b2IoY291bnQpKS52YWx1ZSA9IGFkZHJlc3MKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWMgOSAvLyAweDYzNjE2ZTY0NWY2MTY0NjQ3MjVmCiAgICBkaWcgMQogICAgY29uY2F0CiAgICBkaWcgNAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5Ojc1MgogICAgLy8gQm94KFVJbnQ2NCwga2V5PWtleV9pZHgpLnZhbHVlID0gY291bnQKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5Ojc1NC03NTUKICAgIC8vICMgSW5jcmVtZW50IGNvdW50CiAgICAvLyBzZWxmLmNhbmRpZGF0ZV9jb3VudC52YWx1ZSA9IGNvdW50ICsgMQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGJ5dGVjIDE0IC8vICJjYW5kaWRhdGVfY291bnQiCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBlc2Nyb3cucHk6NzU3CiAgICAvLyBsb2coQnl0ZXMoYiJhcmJpdHJhdG9yX3JlZ2lzdGVyZWQiKSkKICAgIHB1c2hieXRlcyAweDYxNzI2MjY5NzQ3MjYxNzQ2ZjcyNWY3MjY1Njc2OTczNzQ2NTcyNjU2NAogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NzU4CiAgICAvLyBsb2coYWRkcmVzcy5ieXRlcykKICAgIGxvZwogICAgLy8gZXNjcm93LnB5OjczNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gZXNjcm93LkVzY3Jvd0NvbnRyYWN0LmRlcmVnaXN0ZXJfYXJiaXRyYXRvcltyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlcmVnaXN0ZXJfYXJiaXRyYXRvcjoKICAgIC8vIGVzY3Jvdy5weTo3NjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwbiAyCiAgICBsZW4KICAgIHB1c2hpbnQgMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gZXNjcm93LnB5Ojc2MgogICAgLy8gYXNzZXJ0IFR4bi50eXBlX2VudW0gPT0gVHJhbnNhY3Rpb25UeXBlLkFwcGxpY2F0aW9uQ2FsbAogICAgdHhuIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojc2MwogICAgLy8gYXNzZXJ0IFR4bi5vbl9jb21wbGV0aW9uID09IE9uQ29tcGxldGVBY3Rpb24uTm9PcAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0CiAgICAvLyBlc2Nyb3cucHk6NzY0CiAgICAvLyBhc3NlcnQgVHhuLnJla2V5X3RvID09IEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIHR4biBSZWtleVRvCiAgICBieXRlY18yIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAogICAgPT0KICAgIGFzc2VydAogICAgLy8gZXNjcm93LnB5Ojc2NgogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gYWRkcmVzcywgIlNlbmRlciBtdXN0IG1hdGNoIGFkZHJlc3MgdG8gZGVyZWdpc3RlciIKICAgIHR4biBTZW5kZXIKICAgIGRpZyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIFNlbmRlciBtdXN0IG1hdGNoIGFkZHJlc3MgdG8gZGVyZWdpc3RlcgogICAgLy8gZXNjcm93LnB5Ojc2OC03NjkKICAgIC8vICMgQ2hlY2sgaWYgcmVnaXN0ZXJlZAogICAgLy8ga2V5X2lkeCA9IEJ5dGVzKGIiY2FuZF9pZHhfIikgKyBhZGRyZXNzLmJ5dGVzCiAgICBieXRlYyAyOSAvLyAweDYzNjE2ZTY0NWY2OTY0Nzg1ZgogICAgc3dhcAogICAgY29uY2F0CiAgICBkdXBuIDIKICAgIC8vIGVzY3Jvdy5weTo3NzAKICAgIC8vIGR1bW15LCBleGlzdHMgPSBvcC5Cb3guZ2V0KGtleV9pZHgpCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIGVzY3Jvdy5weTo3NzEKICAgIC8vIGFzc2VydCBleGlzdHMsICJBcmJpdHJhdG9yIG5vdCByZWdpc3RlcmVkIgogICAgYXNzZXJ0IC8vIEFyYml0cmF0b3Igbm90IHJlZ2lzdGVyZWQKICAgIC8vIGVzY3Jvdy5weTo3OQogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmNhbmRpZGF0ZV9jb3VudC5tYXliZSgpCiAgICBieXRlYyAxNCAvLyAiY2FuZGlkYXRlX2NvdW50IgogICAgYm94X2dldAogICAgc3dhcAogICAgYnRvaQogICAgLy8gZXNjcm93LnB5OjgwCiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAvLyBlc2Nyb3cucHk6Nzc1CiAgICAvLyByZW1vdmVfaWR4ID0gaWR4X2JveC52YWx1ZQogICAgc3dhcAogICAgYm94X2dldAogICAgcG9wCiAgICBidG9pCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgLy8gZXNjcm93LnB5Ojc3NgogICAgLy8gbGFzdF9pZHggPSBjb3VudCAtIDEKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIC8vIGVzY3Jvdy5weTo3NzgKICAgIC8vIGlmIHJlbW92ZV9pZHggIT0gbGFzdF9pZHg6CiAgICAhPQogICAgYnogZGVyZWdpc3Rlcl9hcmJpdHJhdG9yX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gZXNjcm93LnB5Ojc3OS03ODAKICAgIC8vICMgU3dhcCB3aXRoIGxhc3QgZWxlbWVudAogICAgLy8gbGFzdF9hZGRyID0gQm94KEFjY291bnQsIGtleT1CeXRlcyhiImNhbmRfYWRkcl8iKSArIG9wLml0b2IobGFzdF9pZHgpKS52YWx1ZQogICAgZHVwCiAgICBpdG9iCiAgICBieXRlYyA5IC8vIDB4NjM2MTZlNjQ1ZjYxNjQ2NDcyNWYKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIC8vIGVzY3Jvdy5weTo3ODEKICAgIC8vIEJveChBY2NvdW50LCBrZXk9Qnl0ZXMoYiJjYW5kX2FkZHJfIikgKyBvcC5pdG9iKHJlbW92ZV9pZHgpKS52YWx1ZSA9IGxhc3RfYWRkcgogICAgZGlnIDIKICAgIGl0b2IKICAgIGJ5dGVjIDkgLy8gMHg2MzYxNmU2NDVmNjE2NDY0NzI1ZgogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIGVzY3Jvdy5weTo3ODIKICAgIC8vIEJveChVSW50NjQsIGtleT1CeXRlcyhiImNhbmRfaWR4XyIpICsgbGFzdF9hZGRyLmJ5dGVzKS52YWx1ZSA9IHJlbW92ZV9pZHgKICAgIGJ5dGVjIDI5IC8vIDB4NjM2MTZlNjQ1ZjY5NjQ3ODVmCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgYm94X3B1dAoKZGVyZWdpc3Rlcl9hcmJpdHJhdG9yX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIGVzY3Jvdy5weTo3ODQtNzg1CiAgICAvLyAjIERlbGV0ZSBsYXN0IGVsZW1lbnQgYm94IGFuZCByZXZlcnNlIG1hcHBpbmcgaW5kZXggYm94CiAgICAvLyBrZXlfYWRkciA9IEJ5dGVzKGIiY2FuZF9hZGRyXyIpICsgb3AuaXRvYihsYXN0X2lkeCkKICAgIGR1cAogICAgaXRvYgogICAgYnl0ZWMgOSAvLyAweDYzNjE2ZTY0NWY2MTY0NjQ3MjVmCiAgICBkaWcgMQogICAgY29uY2F0CiAgICAvLyBlc2Nyb3cucHk6Nzg2CiAgICAvLyBhc3NlcnQgb3AuQm94LmRlbGV0ZShrZXlfYWRkciksICJGYWlsZWQgdG8gZGVsZXRlIGFkZHJlc3MgYm94IgogICAgYm94X2RlbAogICAgYXNzZXJ0IC8vIEZhaWxlZCB0byBkZWxldGUgYWRkcmVzcyBib3gKICAgIC8vIGVzY3Jvdy5weTo3ODcKICAgIC8vIGFzc2VydCBvcC5Cb3guZGVsZXRlKGtleV9pZHgpLCAiRmFpbGVkIHRvIGRlbGV0ZSBpbmRleCBib3giCiAgICBkaWcgMwogICAgYm94X2RlbAogICAgYXNzZXJ0IC8vIEZhaWxlZCB0byBkZWxldGUgaW5kZXggYm94CiAgICAvLyBlc2Nyb3cucHk6Nzg5CiAgICAvLyBzZWxmLmNhbmRpZGF0ZV9jb3VudC52YWx1ZSA9IGxhc3RfaWR4CiAgICBieXRlYyAxNCAvLyAiY2FuZGlkYXRlX2NvdW50IgogICAgc3dhcAogICAgYm94X3B1dAogICAgLy8gZXNjcm93LnB5Ojc5MQogICAgLy8gbG9nKEJ5dGVzKGIiYXJiaXRyYXRvcl9kZXJlZ2lzdGVyZWQiKSkKICAgIHB1c2hieXRlcyAweDYxNzI2MjY5NzQ3MjYxNzQ2ZjcyNWY2NDY1NzI2NTY3Njk3Mzc0NjU3MjY1NjQKICAgIGxvZwogICAgLy8gZXNjcm93LnB5Ojc5MgogICAgLy8gbG9nKGFkZHJlc3MuYnl0ZXMpCiAgICBkaWcgMwogICAgbG9nCiAgICAvLyBlc2Nyb3cucHk6NzYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuZGVsZXRlX2JvdW50eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CmRlbGV0ZV9ib3VudHk6CiAgICAvLyBlc2Nyb3cucHk6Nzk2CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwgIk9ubHkgY3JlYXRvciBjYW4gZGVsZXRlIGFwcGxpY2F0aW9uIgogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMyAvLyAiY3JlYXRvcl9hZGRyZXNzIgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuY3JlYXRvcl9hZGRyZXNzIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIGRlbGV0ZSBhcHBsaWNhdGlvbgogICAgLy8gZXNjcm93LnB5Ojc5NwogICAgLy8gYXNzZXJ0IHNlbGYuc3RhdGVfYm94LnZhbHVlID09IENMT1NFRCwgIkJvdW50eSBtdXN0IGJlIGZ1bGx5IGNsb3NlZC9wYWlkIG91dCBiZWZvcmUgZGVsZXRpb24iCiAgICBieXRlY18wIC8vICJzdGF0ZSIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXRlX2JveCBleGlzdHMKICAgIGJ0b2kKICAgIHB1c2hpbnQgNQogICAgPT0KICAgIGFzc2VydCAvLyBCb3VudHkgbXVzdCBiZSBmdWxseSBjbG9zZWQvcGFpZCBvdXQgYmVmb3JlIGRlbGV0aW9uCiAgICAvLyBlc2Nyb3cucHk6Nzk5LTgwMAogICAgLy8gIyBTd2VlcCBhbGwgcmVtYWluaW5nIEFMR08gYW5kIGNsb3NlIG91dCB0aGUgY29udHJhY3QgYWNjb3VudAogICAgLy8gYXBwX2JhbGFuY2UsIGV4aXN0cyA9IG9wLkFjY3RQYXJhbXNHZXQuYWNjdF9iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgYWNjdF9wYXJhbXNfZ2V0IEFjY3RCYWxhbmNlCiAgICAvLyBlc2Nyb3cucHk6ODAxCiAgICAvLyBpZiBleGlzdHMgYW5kIGFwcF9iYWxhbmNlID4gMDoKICAgIGJ6IGRlbGV0ZV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUA1CiAgICBkdXAKICAgIGJ6IGRlbGV0ZV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUA1CiAgICAvLyBlc2Nyb3cucHk6ODAyLTgwNwogICAgLy8gaXR4bi5QYXltZW50KAogICAgLy8gICAgIHJlY2VpdmVyPXNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlLAogICAgLy8gICAgIGFtb3VudD1VSW50NjQoMCksCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyAgICAgY2xvc2VfcmVtYWluZGVyX3RvPXNlbGYuY3JlYXRvcl9hZGRyZXNzLnZhbHVlCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBlc2Nyb3cucHk6ODAzCiAgICAvLyByZWNlaXZlcj1zZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwKICAgIGJ5dGVjXzMgLy8gImNyZWF0b3JfYWRkcmVzcyIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNyZWF0b3JfYWRkcmVzcyBleGlzdHMKICAgIGR1cAogICAgaXR4bl9maWVsZCBDbG9zZVJlbWFpbmRlclRvCiAgICAvLyBlc2Nyb3cucHk6ODA0CiAgICAvLyBhbW91bnQ9VUludDY0KDApLAogICAgaW50Y18xIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBlc2Nyb3cucHk6ODAyCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzAgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBlc2Nyb3cucHk6ODA1CiAgICAvLyBmZWU9MCwKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gZXNjcm93LnB5OjgwMi04MDcKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICByZWNlaXZlcj1zZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZSwKICAgIC8vICAgICBhbW91bnQ9VUludDY0KDApLAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gICAgIGNsb3NlX3JlbWFpbmRlcl90bz1zZWxmLmNyZWF0b3JfYWRkcmVzcy52YWx1ZQogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCmRlbGV0ZV9ib3VudHlfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gZXNjcm93LnB5Ojc5NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgaW50Y18wIC8vIDEKICAgIHJldHVybgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5fZ2V0X2FnZW50X2FkZHJlc3MoKSAtPiBieXRlczoKX2dldF9hZ2VudF9hZGRyZXNzOgogICAgLy8gZXNjcm93LnB5Ojk0CiAgICAvLyBkZWYgX2dldF9hZ2VudF9hZGRyZXNzKHNlbGYpIC0+IEFjY291bnQ6CiAgICBwcm90byAwIDEKICAgIC8vIGVzY3Jvdy5weTo5NQogICAgLy8gdmFsLCBleGlzdHMgPSBzZWxmLmFnZW50X2FkZHJlc3MubWF5YmUoKQogICAgYnl0ZWMgMTAgLy8gImFnZW50X2FkZHJlc3MiCiAgICBib3hfZ2V0CiAgICAvLyBlc2Nyb3cucHk6OTYKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgYnogX2dldF9hZ2VudF9hZGRyZXNzX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIDAKCl9nZXRfYWdlbnRfYWRkcmVzc190ZXJuYXJ5X21lcmdlQDM6CiAgICAvLyBlc2Nyb3cucHk6OTYKICAgIC8vIHJldHVybiB2YWwgaWYgZXhpc3RzIGVsc2UgQWNjb3VudChCeXRlcygzMiAqIGIiXHgwMCIpKQogICAgc3dhcAogICAgcmV0c3ViCgpfZ2V0X2FnZW50X2FkZHJlc3NfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gZXNjcm93LnB5Ojk2CiAgICAvLyByZXR1cm4gdmFsIGlmIGV4aXN0cyBlbHNlIEFjY291bnQoQnl0ZXMoMzIgKiBiIlx4MDAiKSkKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICBiIF9nZXRfYWdlbnRfYWRkcmVzc190ZXJuYXJ5X21lcmdlQDMKCgovLyBlc2Nyb3cuRXNjcm93Q29udHJhY3QuX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShhc3NldF9pZDogdWludDY0LCBlc2Nyb3dfYW1vdW50OiB1aW50NjQpIC0+IHZvaWQ6Cl92ZXJpZnlfZXNjcm93X2JhbGFuY2U6CiAgICAvLyBlc2Nyb3cucHk6MTE2CiAgICAvLyBkZWYgX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZShzZWxmLCBhc3NldF9pZDogVUludDY0LCBlc2Nyb3dfYW1vdW50OiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIGVzY3Jvdy5weToxMTcKICAgIC8vIGlmIGFzc2V0X2lkID4gMDoKICAgIGZyYW1lX2RpZyAtMgogICAgYnogX3ZlcmlmeV9lc2Nyb3dfYmFsYW5jZV9lbHNlX2JvZHlAMgogICAgLy8gZXNjcm93LnB5OjExOQogICAgLy8gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgYXNzZXRfaWQKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBlc2Nyb3cucHk6MTE4LTEyMAogICAgLy8gYmFsYW5jZSwgZXhpc3RzID0gb3AuQXNzZXRIb2xkaW5nR2V0LmFzc2V0X2JhbGFuY2UoCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywgYXNzZXRfaWQKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMgogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICAvLyBlc2Nyb3cucHk6MTIxCiAgICAvLyBhc3NlcnQgZXhpc3RzLCAiQ29udHJhY3QgaXMgbm90IG9wdGVkIGludG8gdGhlIGFzc2V0IgogICAgYXNzZXJ0IC8vIENvbnRyYWN0IGlzIG5vdCBvcHRlZCBpbnRvIHRoZSBhc3NldAogICAgLy8gZXNjcm93LnB5OjEyMgogICAgLy8gYXNzZXJ0IGJhbGFuY2UgPj0gZXNjcm93X2Ftb3VudCwgIkluc3VmZmljaWVudCBhc3NldCBiYWxhbmNlIgogICAgZnJhbWVfZGlnIC0xCiAgICA+PQogICAgYXNzZXJ0IC8vIEluc3VmZmljaWVudCBhc3NldCBiYWxhbmNlCiAgICByZXRzdWIKCl92ZXJpZnlfZXNjcm93X2JhbGFuY2VfZWxzZV9ib2R5QDI6CiAgICAvLyBlc2Nyb3cucHk6MTI0CiAgICAvLyBhcHBfYmFsYW5jZSwgZXhpc3RzID0gb3AuQWNjdFBhcmFtc0dldC5hY2N0X2JhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBhY2N0X3BhcmFtc19nZXQgQWNjdEJhbGFuY2UKICAgIC8vIGVzY3Jvdy5weToxMjUKICAgIC8vIGFzc2VydCBleGlzdHMsICJGYWlsZWQgdG8gcmVhZCBjb250cmFjdCBiYWxhbmNlIgogICAgYXNzZXJ0IC8vIEZhaWxlZCB0byByZWFkIGNvbnRyYWN0IGJhbGFuY2UKICAgIC8vIGVzY3Jvdy5weToxMjYKICAgIC8vIGFzc2VydCBhcHBfYmFsYW5jZSA+PSBlc2Nyb3dfYW1vdW50LCAiSW5zdWZmaWNpZW50IGNvbnRyYWN0IGJhbGFuY2UiCiAgICBmcmFtZV9kaWcgLTEKICAgID49CiAgICBhc3NlcnQgLy8gSW5zdWZmaWNpZW50IGNvbnRyYWN0IGJhbGFuY2UKICAgIHJldHN1YgoKCi8vIGVzY3Jvdy5Fc2Nyb3dDb250cmFjdC5fc2VuZF9wYXlvdXQocmVjZWl2ZXI6IGJ5dGVzLCBhbW91bnQ6IHVpbnQ2NCwgYXNzZXRfaWQ6IHVpbnQ2NCkgLT4gdm9pZDoKX3NlbmRfcGF5b3V0OgogICAgLy8gZXNjcm93LnB5OjEyOAogICAgLy8gZGVmIF9zZW5kX3BheW91dChzZWxmLCByZWNlaXZlcjogQWNjb3VudCwgYW1vdW50OiBVSW50NjQsIGFzc2V0X2lkOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGVzY3Jvdy5weToxMjkKICAgIC8vIGlmIGFzc2V0X2lkID09IDA6CiAgICBmcmFtZV9kaWcgLTEKICAgIGJueiBfc2VuZF9wYXlvdXRfZWxzZV9ib2R5QDMKICAgIC8vIGVzY3Jvdy5weToxMzAtMTM0CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgLy8gZXNjcm93LnB5OjEzMAogICAgLy8gaXR4bi5QYXltZW50KAogICAgaW50Y18wIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgLy8gZXNjcm93LnB5OjEzMwogICAgLy8gZmVlPTAsCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGVzY3Jvdy5weToxMzAtMTM0CiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgcmVjZWl2ZXI9cmVjZWl2ZXIsCiAgICAvLyAgICAgYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBmZWU9MCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCl9zZW5kX3BheW91dF9lbHNlX2JvZHlAMzoKICAgIC8vIGVzY3Jvdy5weToxMzYtMTQxCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldF9pZCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICAgICBhc3NldF9hbW91bnQ9YW1vdW50LAogICAgLy8gICAgIGZlZT0wLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFzc2V0QW1vdW50CiAgICBmcmFtZV9kaWcgLTMKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gZXNjcm93LnB5OjEzNgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBlc2Nyb3cucHk6MTQwCiAgICAvLyBmZWU9MCwKICAgIGludGNfMSAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gZXNjcm93LnB5OjEzNi0xNDEKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0X2lkLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXJlY2VpdmVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1hbW91bnQsCiAgICAvLyAgICAgZmVlPTAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "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", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 8, "patch": 1 } }, "events": [], "templateVariables": { "CLAIM_TIMEOUT": { "type": "AVMUint64", "value": "AAAAAAAAAHg=" }, "DISPUTE_TIMEOUT": { "type": "AVMUint64", "value": "AAAAAAAAASw=" } } }