{ "name": "MockRbacModule", "structs": { "RoleValidity": [ { "name": "role_validity_start", "type": "uint64" }, { "name": "role_validity_end", "type": "uint64" } ] }, "methods": [ { "name": "contract_update", "args": [], "returns": { "type": "void", "desc": "None." }, "actions": { "create": [], "call": [ "UpdateApplication" ] }, "readonly": false, "desc": "Update D-ASA application.", "events": [], "recommendations": {} }, { "name": "rbac_rotate_arranger", "args": [ { "type": "address", "name": "new_arranger", "desc": "New arranger address." } ], "returns": { "type": "uint64", "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Rotate the arranger address.", "events": [], "recommendations": {} }, { "name": "rbac_set_op_daemon", "args": [ { "type": "address", "name": "address", "desc": "Operation daemon address." } ], "returns": { "type": "uint64", "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Non-normative helper to set the operation daemon address.", "events": [], "recommendations": {} }, { "name": "rbac_assign_role", "args": [ { "type": "uint8", "name": "role_id", "desc": "Role identifier." }, { "type": "address", "name": "role_address", "desc": "Account role address." }, { "type": "(uint64,uint64)", "struct": "RoleValidity", "name": "validity", "desc": "Inclusive validity interval for the assignment." } ], "returns": { "type": "uint64", "desc": "UNIX timestamp of the role assignment." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Assign a role to an address.", "events": [], "recommendations": {} }, { "name": "rbac_revoke_role", "args": [ { "type": "uint8", "name": "role_id", "desc": "Role identifier." }, { "type": "address", "name": "role_address", "desc": "Account role address." } ], "returns": { "type": "uint64", "desc": "UNIX timestamp of the role revocation." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Revoke a role from an address.", "events": [], "recommendations": {} }, { "name": "rbac_contract_suspension", "args": [ { "type": "bool", "name": "suspended", "desc": "Suspension status to apply." } ], "returns": { "type": "uint64", "desc": "UNIX timestamp of the suspension update." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set the asset-wide suspension status.", "events": [], "recommendations": {} }, { "name": "rbac_contract_default", "args": [ { "type": "bool", "name": "defaulted", "desc": "Default status" } ], "returns": { "type": "uint64" }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": false, "desc": "Set D-ASA default status", "events": [], "recommendations": {} }, { "name": "rbac_get_arranger", "args": [], "returns": { "type": "address", "desc": "Current arranger address." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get the arranger address.", "events": [], "recommendations": {} }, { "name": "rbac_get_address_roles", "args": [ { "type": "address", "name": "address", "desc": "Address to query." } ], "returns": { "type": "(bool,bool,bool,bool,bool)", "desc": "Roles mask in the order: account manager, primary dealer, trustee, authority, observer." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Non-normative helper to get the active roles assigned to an address.", "events": [], "recommendations": {} }, { "name": "rbac_get_role_validity", "args": [ { "type": "uint8", "name": "role_id", "desc": "Role identifier." }, { "type": "address", "name": "role_address", "desc": "Account role address." } ], "returns": { "type": "(uint64,uint64)", "struct": "RoleValidity", "desc": "Stored role validity interval." }, "actions": { "create": [], "call": [ "NoOp" ] }, "readonly": true, "desc": "Get the stored validity interval for a role assignment.", "events": [], "recommendations": {} } ], "arcs": [ 22, 28 ], "desc": "\n RBAC Module for testing\n ", "networks": {}, "state": { "schema": { "global": { "ints": 2, "bytes": 2 }, "local": { "ints": 0, "bytes": 0 } }, "keys": { "global": { "arranger": { "keyType": "AVMBytes", "valueType": "address", "key": "UjpBUlIj" }, "op_daemon": { "keyType": "AVMBytes", "valueType": "address", "key": "UjpPUEQj" }, "contract_suspended": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "Y29udHJhY3Rfc3VzcGVuZGVk" }, "defaulted": { "keyType": "AVMString", "valueType": "AVMUint64", "key": "ZGVmYXVsdGVk" } }, "local": {}, "box": {} }, "maps": { "global": {}, "local": {}, "box": { "account_manager": { "keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNTkcj" }, "primary_dealer": { "keyType": "address", "valueType": "RoleValidity", "prefix": "UjpQWUQj" }, "trustee": { "keyType": "address", "valueType": "RoleValidity", "prefix": "UjpUUlMj" }, "authority": { "keyType": "address", "valueType": "RoleValidity", "prefix": "UjpBVVQj" }, "observer": { "keyType": "address", "valueType": "RoleValidity", "prefix": "UjpNT0Mj" } } } }, "bareActions": { "create": [ "NoOp" ], "call": [] }, "sourceInfo": { "approval": { "sourceInfo": [ { "pc": [ 958 ], "errorMessage": "Defaulted" }, { "pc": [ 256, 345, 372, 402, 425, 448, 472, 528, 556, 577, 598, 620, 823, 840, 854, 869, 884 ], "errorMessage": "Invalid account role address" }, { "pc": [ 513, 813, 1011 ], "errorMessage": "Invalid role identifier" }, { "pc": [ 642, 672, 950 ], "errorMessage": "Not authorized" }, { "pc": [ 356 ], "errorMessage": "Time events must be sorted in strictly ascending order" }, { "pc": [ 910, 925 ], "errorMessage": "check BoxMap entry exists" }, { "pc": [ 689, 948 ], "errorMessage": "check self.arranger exists" }, { "pc": [ 956 ], "errorMessage": "check self.defaulted exists" }, { "pc": [ 633, 663 ], "errorMessage": "invalid number of bytes for arc4.bool" }, { "pc": [ 248, 276, 311, 496, 703, 786 ], "errorMessage": "invalid number of bytes for arc4.static_array" }, { "pc": [ 300, 486, 776 ], "errorMessage": "invalid number of bytes for arc4.uint8" }, { "pc": [ 323 ], "errorMessage": "invalid number of bytes for smart_contracts.abi_types.RoleValidity" } ], "pcOffsetMethod": "none" }, "clear": { "sourceInfo": [], "pcOffsetMethod": "none" } }, "source": { "approval": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIGludGNibG9jayAxIDAgMzIgNDAKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NSAweDUyM2E0MTUyNTIyMyAweDUyM2E1NDUyNTMyMyAweDUyM2E0MTU1NTQyMyAweDUyM2E0ZDRlNDcyMyAweDUyM2E1MDU5NDQyMyAweDUyM2E0ZDRmNDMyMyAiZGVmYXVsdGVkIiAweDUyM2E0ZjUwNDQyMyAiY29udHJhY3Rfc3VzcGVuZGVkIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2FmdGVyX2lmX2Vsc2VAMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4LTI5CiAgICAvLyAjIFJCQUMgUm9sZXMKICAgIC8vIHNlbGYuYXJyYW5nZXIgPSBHbG9iYWxTdGF0ZShBY2NvdW50KCksIGtleT1jc3QuUFJFRklYX0lEX0FSUkFOR0VSKQogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMwCiAgICAvLyBzZWxmLm9wX2RhZW1vbiA9IEdsb2JhbFN0YXRlKEFjY291bnQoKSwga2V5PWNzdC5QUkVGSVhfSURfT1BfREFFTU9OKQogICAgYnl0ZWMgOCAvLyAweDUyM2E0ZjUwNDQyMwogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjQ3LTQ4CiAgICAvLyAjIENvbnRyYWN0IEdvdmVybmFuY2UKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gRmFsc2UKICAgIGJ5dGVjIDkgLy8gImNvbnRyYWN0X3N1c3BlbmRlZCIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjUwLTUxCiAgICAvLyAjIENvbnRyYWN0IFBlcmZvcm1hbmNlCiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IEZhbHNlCiAgICBieXRlYyA3IC8vICJkZWZhdWx0ZWQiCiAgICBpbnRjXzEgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKCm1haW5fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gc21hcnRfY29udHJhY3RzL21vY2tfbW9kdWxlX3JiYWMvY29udHJhY3QucHk6NgogICAgLy8gY2xhc3MgTW9ja1JiYWNNb2R1bGUoUmJhY01vZHVsZSk6CiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogbWFpbl9jcmVhdGVAMjAKICAgIHB1c2hieXRlcyAweDkxNGYwNGViIC8vIG1ldGhvZCAiY29udHJhY3RfdXBkYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANQoKbWFpbl9zd2l0Y2hfY2FzZV9uZXh0QDY6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weTo2CiAgICAvLyBjbGFzcyBNb2NrUmJhY01vZHVsZShSYmFjTW9kdWxlKToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydAogICAgcHVzaGJ5dGVzcyAweDgyZjcxYjJkIDB4ZWYwNGY1ZDMgMHhkZjM0MzU1MCAweDNkYmU4MGJkIDB4MWUzZTQ4ZTcgMHgzOTI0MWZhMyAweDAxMGM4Mjk5IDB4NzQwNmFjZDIgMHgxYTcyYTJlZSAvLyBtZXRob2QgInJiYWNfcm90YXRlX2FycmFuZ2VyKGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX3NldF9vcF9kYWVtb24oYWRkcmVzcyl1aW50NjQiLCBtZXRob2QgInJiYWNfYXNzaWduX3JvbGUodWludDgsYWRkcmVzcywodWludDY0LHVpbnQ2NCkpdWludDY0IiwgbWV0aG9kICJyYmFjX3Jldm9rZV9yb2xlKHVpbnQ4LGFkZHJlc3MpdWludDY0IiwgbWV0aG9kICJyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb24oYm9vbCl1aW50NjQiLCBtZXRob2QgInJiYWNfY29udHJhY3RfZGVmYXVsdChib29sKXVpbnQ2NCIsIG1ldGhvZCAicmJhY19nZXRfYXJyYW5nZXIoKWFkZHJlc3MiLCBtZXRob2QgInJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXMoYWRkcmVzcykoYm9vbCxib29sLGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAicmJhY19nZXRfcm9sZV92YWxpZGl0eSh1aW50OCxhZGRyZXNzKSh1aW50NjQsdWludDY0KSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIHJiYWNfcm90YXRlX2FycmFuZ2VyIHJiYWNfc2V0X29wX2RhZW1vbiByYmFjX2Fzc2lnbl9yb2xlIHJiYWNfcmV2b2tlX3JvbGUgcmJhY19jb250cmFjdF9zdXNwZW5zaW9uIHJiYWNfY29udHJhY3RfZGVmYXVsdCByYmFjX2dldF9hcnJhbmdlciByYmFjX2dldF9hZGRyZXNzX3JvbGVzIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHkKICAgIGVycgoKbWFpbl9jb250cmFjdF91cGRhdGVfcm91dGVANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgPT0KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAmJgogICAgYXNzZXJ0CiAgICBiIGNvbnRyYWN0X3VwZGF0ZQoKbWFpbl9jcmVhdGVAMjA6CiAgICAvLyBzbWFydF9jb250cmFjdHMvbW9ja19tb2R1bGVfcmJhYy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgICYmCiAgICBhc3NlcnQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBzZWxmLmFycmFuZ2VyLnZhbHVlID0gVHhuLnNlbmRlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHNtYXJ0X2NvbnRyYWN0cy9tb2NrX21vZHVsZV9yYmFjL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuY29udHJhY3RfdXBkYXRlW3JvdXRpbmddKCkgLT4gdm9pZDoKY29udHJhY3RfdXBkYXRlOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2MS0xNjQKICAgIC8vICMgVGhlIHJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvbiBncmFudHMgdGhlIHVwZGF0ZSBwZXJtaXNzaW9ucyB0byB0aGUgQXJyYW5nZXIuCiAgICAvLyAjIOKaoO+4jyBXQVJOSU5HOiBBcHBsaWNhdGlvbiB1cGRhdGVzIG11c3QgYmUgZXhlY3V0ZWQgVkVSWSBjYXJlZnVsbHksIGFzIHRoZXkKICAgIC8vICMgbWlnaHQgaW50cm9kdWNlIGJyZWFraW5nIGNoYW5nZXMuCiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX3JvdGF0ZV9hcnJhbmdlcltyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcm90YXRlX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODEKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjcwCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzICE9IEdsb2JhbC56ZXJvX2FkZHJlc3MsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgZHVwCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4MwogICAgLy8gc2VsZi5hcnJhbmdlci52YWx1ZSA9IG5ld19hcnJhbmdlcgogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxODQKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19zZXRfb3BfZGFlbW9uW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19zZXRfb3BfZGFlbW9uOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE4NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnN0YXRpY19hcnJheTxhcmM0LnVpbnQ4LCAzMj4KICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDAKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMQogICAgLy8gc2VsZi5vcF9kYWVtb24udmFsdWUgPSBhZGRyZXNzCiAgICBieXRlYyA4IC8vIDB4NTIzYTRmNTA0NDIzCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIwMgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2Fzc2lnbl9yb2xlW3JvdXRpbmddKCkgLT4gdm9pZDoKcmJhY19hc3NpZ25fcm9sZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBsZW4KICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0IC8vIGludmFsaWQgbnVtYmVyIG9mIGJ5dGVzIGZvciBhcmM0LnVpbnQ4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgZHVwCiAgICBjb3ZlciAzCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAxNgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3Igc21hcnRfY29udHJhY3RzLmFiaV90eXBlcy5Sb2xlVmFsaWRpdHkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjcKICAgIC8vIHNlbGYuX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIyOAogICAgLy8gc2VsZi5fYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQoKQogICAgY2FsbHN1YiBfYXNzZXJ0X2lzX25vdF9jb250cmFjdF9kZWZhdWx0ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMjkKICAgIC8vIHNlbGYuX2Fzc2VydF92YWxpZF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCkpCiAgICB1bmNvdmVyIDIKICAgIGJ0b2kKICAgIGR1cAogICAgY292ZXIgMwogICAgZHVwCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzMAogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyAhPSBHbG9iYWwuemVyb19hZGRyZXNzLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgdW5jb3ZlciAzCiAgICAhPQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzIKICAgIC8vIHZhbGlkaXR5LnJvbGVfdmFsaWRpdHlfc3RhcnQgPCB2YWxpZGl0eS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgZGlnIDEKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDgKICAgIGV4dHJhY3RfdWludDY0CiAgICA8CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjMxLTIzMwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICB2YWxpZGl0eS5yb2xlX3ZhbGlkaXR5X3N0YXJ0IDwgdmFsaWRpdHkucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICksIGVyci5JTlZBTElEX1NPUlRJTkcKICAgIGFzc2VydCAvLyBUaW1lIGV2ZW50cyBtdXN0IGJlIHNvcnRlZCBpbiBzdHJpY3RseSBhc2NlbmRpbmcgb3JkZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMDgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGludGNfMyAvLyA0MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTA5CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLmFjY291bnRfbWFuYWdlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA0IC8vIDB4NTIzYTRkNGU0NzIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTAKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10gPSB2YWxpZGl0eS5jb3B5KCkKICAgIGRpZyAyCiAgICBib3hfcHV0CgpyYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDEyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzNgogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjA0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgNTAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lmX2Vsc2VANQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExMwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBub3QgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMwogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMTQKICAgIC8vIHNlbGYucHJpbWFyeV9kZWFsZXJbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTIKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjExNgogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKToKICAgIGR1cAogICAgcHVzaGludCA2MAogICAgPT0KICAgIGJ6IHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE3CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDMKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgICEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTE4CiAgICAvLyBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTIKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgZHVwCiAgICBwdXNoaW50IDcwCiAgICA9PQogICAgYnogcmJhY19hc3NpZ25fcm9sZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMjEKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3Mgbm90IGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyMgogICAgLy8gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXSA9IHZhbGlkaXR5LmNvcHkoKQogICAgZGlnIDIKICAgIGJveF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyMzUKICAgIC8vIHNlbGYuX3NldF9yb2xlKHJvbGVfaWQuYXNfdWludDY0KCksIHJvbGVfYWRkcmVzcywgdmFsaWRpdHkpCiAgICBiIHJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fc2V0X3JvbGVAMTIKCnJiYWNfYXNzaWduX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNAogICAgLy8gaWYgcm9sZV9pZCA9PSBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUik6CiAgICBkdXAKICAgIHB1c2hpbnQgODAKICAgID09CiAgICBieiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDEyCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTI1CiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIG5vdCBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyNgogICAgLy8gc2VsZi5vYnNlcnZlcltyb2xlX2FkZHJlc3NdID0gdmFsaWRpdHkuY29weSgpCiAgICBkaWcgMgogICAgYm94X3B1dAogICAgYiByYmFjX2Fzc2lnbl9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX3NldF9yb2xlQDEyCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19yZXZva2Vfcm9sZVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfcmV2b2tlX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU3CiAgICAvLyBzZWxmLl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9jYWxsZXJfaXNfYXJyYW5nZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNTgKICAgIC8vIHNlbGYuX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkKCkKICAgIGNhbGxzdWIgX2Fzc2VydF9pc19ub3RfY29udHJhY3RfZGVmYXVsdGVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjU5CiAgICAvLyBzZWxmLl9hc3NlcnRfdmFsaWRfcm9sZShyb2xlX2lkLmFzX3VpbnQ2NCgpKQogICAgYnRvaQogICAgZHVwbiAyCiAgICBjYWxsc3ViIF9hc3NlcnRfdmFsaWRfcm9sZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEyOQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgIT0gVUludDY0KGVudW1zLlJPTEVfQVJSQU5HRVIpLCBlcnIuSU5WQUxJRF9ST0xFCiAgICBkdXAKICAgIHB1c2hpbnQgMjAKICAgICE9CiAgICBhc3NlcnQgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzAKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGludGNfMyAvLyA0MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTMxCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzMgogICAgLy8gZGVsIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAoKcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNjEKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjIzOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAMzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzQKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDUwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzUKICAgIC8vIGFzc2VydCByb2xlX2FkZHJlc3MgaW4gc2VsZi5wcmltYXJ5X2RlYWxlciwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBieXRlYyA1IC8vIDB4NTIzYTUwNTk0NDIzCiAgICBkaWcgMgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzYKICAgIC8vIGRlbCBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxMzgKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSk6CiAgICBkdXAKICAgIHB1c2hpbnQgNjAKICAgID09CiAgICBieiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEzOQogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLnRydXN0ZWUsIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYnl0ZWNfMiAvLyAweDUyM2E1NDUyNTMyMwogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQwCiAgICAvLyBkZWwgc2VsZi50cnVzdGVlW3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDIKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKToKICAgIGR1cAogICAgcHVzaGludCA3MAogICAgPT0KICAgIGJ6IHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MTQzCiAgICAvLyBhc3NlcnQgcm9sZV9hZGRyZXNzIGluIHNlbGYuYXV0aG9yaXR5LCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NAogICAgLy8gZGVsIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI2MAogICAgLy8gc2VsZi5fZGVsZXRlX3JvbGUocm9sZV9pZC5hc191aW50NjQoKSwgcm9sZV9hZGRyZXNzKQogICAgYiByYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUuX2RlbGV0ZV9yb2xlQDEyCgpyYmFjX3Jldm9rZV9yb2xlX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIG1vZHVsZXMvcmJhYy5weToxNDYKICAgIC8vIGlmIHJvbGVfaWQgPT0gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgZHVwCiAgICBwdXNoaW50IDgwCiAgICA9PQogICAgYnogcmJhY19yZXZva2Vfcm9sZV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9kZWxldGVfcm9sZUAxMgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0NwogICAgLy8gYXNzZXJ0IHJvbGVfYWRkcmVzcyBpbiBzZWxmLm9ic2VydmVyLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIGRpZyAyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjE0OAogICAgLy8gZGVsIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2RlbAogICAgcG9wCiAgICBiIHJiYWNfcmV2b2tlX3JvbGVfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fZGVsZXRlX3JvbGVAMTIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X3N1c3BlbnNpb25bcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X3N1c3BlbnNpb246CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6ODIKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLmF1dGhvcml0eSwgVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIHR4biBTZW5kZXIKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyNzkKICAgIC8vIHNlbGYuY29udHJhY3Rfc3VzcGVuZGVkID0gc3VzcGVuZGVkCiAgICBieXRlYyA5IC8vICJjb250cmFjdF9zdXNwZW5kZWQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MAogICAgLy8gcmV0dXJuIEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGl0b2IKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXR1cm4KCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2NvbnRyYWN0X2RlZmF1bHRbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2NvbnRyYWN0X2RlZmF1bHQ6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5ib29sCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NzkKICAgIC8vIGFzc2VydCBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnRydXN0ZWUsIFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBieXRlY18yIC8vIDB4NTIzYTU0NTI1MzIzCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgYXNzZXJ0IC8vIE5vdCBhdXRob3JpemVkCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mjk1CiAgICAvLyBzZWxmLmRlZmF1bHRlZCA9IGRlZmF1bHRlZAogICAgYnl0ZWMgNyAvLyAiZGVmYXVsdGVkIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIG1vZHVsZXMvcmJhYy5weToyOTYKICAgIC8vIHJldHVybiBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI4MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYXJyYW5nZXJbcm91dGluZ10oKSAtPiB2b2lkOgpyYmFjX2dldF9hcnJhbmdlcjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMDkKICAgIC8vIHJldHVybiBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjI5OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfYWRkcmVzc19yb2xlc1tyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X2FkZHJlc3Nfcm9sZXM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzExCiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQgLy8gaW52YWxpZCBudW1iZXIgb2YgYnl0ZXMgZm9yIGFyYzQuc3RhdGljX2FycmF5PGFyYzQudWludDgsIDMyPgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMyOQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hY2NvdW50X21hbmFnZXIsIGFkZHJlc3MpLAogICAgYnl0ZWMgNCAvLyAweDUyM2E0ZDRlNDcyMwogICAgZGlnIDEKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMwCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLnByaW1hcnlfZGVhbGVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIGRpZyAyCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMQogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi50cnVzdGVlLCBhZGRyZXNzKSwKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIGRpZyAzCiAgICBjYWxsc3ViIF9yb2xlX2lzX2FjdGl2ZQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzMgogICAgLy8gc2VsZi5fcm9sZV9pc19hY3RpdmUoc2VsZi5hdXRob3JpdHksIGFkZHJlc3MpLAogICAgYnl0ZWNfMyAvLyAweDUyM2E0MTU1NTQyMwogICAgZGlnIDQKICAgIGNhbGxzdWIgX3JvbGVfaXNfYWN0aXZlCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzMzCiAgICAvLyBzZWxmLl9yb2xlX2lzX2FjdGl2ZShzZWxmLm9ic2VydmVyLCBhZGRyZXNzKSwKICAgIGJ5dGVjIDYgLy8gMHg1MjNhNGQ0ZjQzMjMKICAgIHVuY292ZXIgNQogICAgY2FsbHN1YiBfcm9sZV9pc19hY3RpdmUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDYKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgNQogICAgc2V0Yml0CiAgICBwdXNoaW50IDIKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBwdXNoaW50IDMKICAgIHVuY292ZXIgMwogICAgc2V0Yml0CiAgICBwdXNoaW50IDQKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgoKLy8gbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eVtyb3V0aW5nXSgpIC0+IHZvaWQ6CnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHk6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgbGVuCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC51aW50OAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBsZW4KICAgIGludGNfMiAvLyAzMgogICAgPT0KICAgIGFzc2VydCAvLyBpbnZhbGlkIG51bWJlciBvZiBieXRlcyBmb3IgYXJjNC5zdGF0aWNfYXJyYXk8YXJjNC51aW50OCwgMzI+CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzU0CiAgICAvLyByb2xlID0gcm9sZV9pZC5hc191aW50NjQoKQogICAgYnRvaQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1NQogICAgLy8gc2VsZi5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZSkKICAgIGR1cAogICAgY2FsbHN1YiBfYXNzZXJ0X3ZhbGlkX3JvbGUKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTcKICAgIC8vIGNhc2UgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKToKICAgIGludGNfMyAvLyA0MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2MgogICAgLy8gY2FzZSBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUik6CiAgICBwdXNoaW50cyA1MCA2MCA3MCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM1Ni0zODMKICAgIC8vIG1hdGNoIHJvbGU6CiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmFjY291bnRfbWFuYWdlciwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hY2NvdW50X21hbmFnZXJbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLnByaW1hcnlfZGVhbGVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLnRydXN0ZWUsIHJvbGVfYWRkcmVzcwogICAgLy8gICAgICAgICApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIC8vICAgICAgICAgcmV0dXJuIHNlbGYudHJ1c3RlZVtyb2xlX2FkZHJlc3NdCiAgICAvLyAgICAgY2FzZSBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLmF1dGhvcml0eSwgcm9sZV9hZGRyZXNzCiAgICAvLyAgICAgICAgICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgLy8gICAgICAgICByZXR1cm4gc2VsZi5hdXRob3JpdHlbcm9sZV9hZGRyZXNzXQogICAgLy8gICAgIGNhc2UgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpOgogICAgLy8gICAgICAgICBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgICAgICAgICBzZWxmLm9ic2VydmVyLCByb2xlX2FkZHJlc3MKICAgIC8vICAgICAgICAgKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICAvLyAgICAgICAgIHJldHVybiBzZWxmLm9ic2VydmVyW3JvbGVfYWRkcmVzc10KICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIG9wLmVycihlcnIuSU5WQUxJRF9ST0xFKQogICAgdW5jb3ZlciA1CiAgICBtYXRjaCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzFAMyByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzJANCByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANSByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzRANgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM4MwogICAgLy8gb3AuZXJyKGVyci5JTlZBTElEX1JPTEUpCiAgICBlcnIgLy8gSW52YWxpZCByb2xlIGlkZW50aWZpZXIKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfNEA2OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3OQogICAgLy8gc2VsZi5vYnNlcnZlciwgcm9sZV9hZGRyZXNzCiAgICBieXRlYyA2IC8vIDB4NTIzYTRkNGY0MzIzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6NTcKICAgIC8vIHJldHVybiByb2xlX2FkZHJlc3MgaW4gcm9sZV9tYXAKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6Mzc4LTM4MAogICAgLy8gYXNzZXJ0IHNlbGYuX2hhc19yb2xlKAogICAgLy8gICAgIHNlbGYub2JzZXJ2ZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM4MQogICAgLy8gcmV0dXJuIHNlbGYub2JzZXJ2ZXJbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA4OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0dXJuCgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzNANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzQKICAgIC8vIHNlbGYuYXV0aG9yaXR5LCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzMgLy8gMHg1MjNhNDE1NTU0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzMtMzc1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hdXRob3JpdHksIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM3NgogICAgLy8gcmV0dXJuIHNlbGYuYXV0aG9yaXR5W3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDgKCnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfc3dpdGNoX2Nhc2VfMkA0OgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2OQogICAgLy8gc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjXzIgLy8gMHg1MjNhNTQ1MjUzMjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjgtMzcwCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi50cnVzdGVlLCByb2xlX2FkZHJlc3MKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEVfQUREUkVTUwogICAgYXNzZXJ0IC8vIEludmFsaWQgYWNjb3VudCByb2xlIGFkZHJlc3MKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNzEKICAgIC8vIHJldHVybiBzZWxmLnRydXN0ZWVbcm9sZV9hZGRyZXNzXQogICAgYm94X2dldAogICAgcG9wCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QocmVhZG9ubHk9VHJ1ZSkKICAgIGIgcmJhY19nZXRfcm9sZV92YWxpZGl0eV9hZnRlcl9pbmxpbmVkX21vZHVsZXMucmJhYy5SYmFjTW9kdWxlLnJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlAOAoKcmJhY19nZXRfcm9sZV92YWxpZGl0eV9zd2l0Y2hfY2FzZV8xQDM6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzY0CiAgICAvLyBzZWxmLnByaW1hcnlfZGVhbGVyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDUgLy8gMHg1MjNhNTA1OTQ0MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNjMtMzY1CiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5wcmltYXJ5X2RlYWxlciwgcm9sZV9hZGRyZXNzCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFX0FERFJFU1MKICAgIGFzc2VydCAvLyBJbnZhbGlkIGFjY291bnQgcm9sZSBhZGRyZXNzCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6MzY2CiAgICAvLyByZXR1cm4gc2VsZi5wcmltYXJ5X2RlYWxlcltyb2xlX2FkZHJlc3NdCiAgICBib3hfZ2V0CiAgICBwb3AKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozMzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgYiByYmFjX2dldF9yb2xlX3ZhbGlkaXR5X2FmdGVyX2lubGluZWRfbW9kdWxlcy5yYmFjLlJiYWNNb2R1bGUucmJhY19nZXRfcm9sZV92YWxpZGl0eUA4CgpyYmFjX2dldF9yb2xlX3ZhbGlkaXR5X3N3aXRjaF9jYXNlXzBAMjoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTkKICAgIC8vIHNlbGYuYWNjb3VudF9tYW5hZ2VyLCByb2xlX2FkZHJlc3MKICAgIGJ5dGVjIDQgLy8gMHg1MjNhNGQ0ZTQ3MjMKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NwogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyBpbiByb2xlX21hcAogICAgZGlnIDEKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTozNTgtMzYwCiAgICAvLyBhc3NlcnQgc2VsZi5faGFzX3JvbGUoCiAgICAvLyAgICAgc2VsZi5hY2NvdW50X21hbmFnZXIsIHJvbGVfYWRkcmVzcwogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRV9BRERSRVNTCiAgICBhc3NlcnQgLy8gSW52YWxpZCBhY2NvdW50IHJvbGUgYWRkcmVzcwogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjM2MQogICAgLy8gcmV0dXJuIHNlbGYuYWNjb3VudF9tYW5hZ2VyW3JvbGVfYWRkcmVzc10KICAgIGJveF9nZXQKICAgIHBvcAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjMzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBiIHJiYWNfZ2V0X3JvbGVfdmFsaWRpdHlfYWZ0ZXJfaW5saW5lZF9tb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5yYmFjX2dldF9yb2xlX3ZhbGlkaXR5QDgKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fcm9sZV9pc19hY3RpdmUocm9sZV9tYXA6IGJ5dGVzLCByb2xlX2FkZHJlc3M6IGJ5dGVzKSAtPiB1aW50NjQ6Cl9yb2xlX2lzX2FjdGl2ZToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1OQogICAgLy8gZGVmIF9yb2xlX2lzX2FjdGl2ZShzZWxmLCByb2xlX21hcDogdHlwLlJiYWNSb2xlLCByb2xlX2FkZHJlc3M6IEFjY291bnQpIC0+IGJvb2w6CiAgICBwcm90byAyIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjU3CiAgICAvLyByZXR1cm4gcm9sZV9hZGRyZXNzIGluIHJvbGVfbWFwCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYwLTY0CiAgICAvLyByZXR1cm4gc2VsZi5faGFzX3JvbGUocm9sZV9tYXAsIHJvbGVfYWRkcmVzcykgYW5kICgKICAgIC8vICAgICByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vICAgICA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gICAgIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIC8vICkKICAgIGJ6IF9yb2xlX2lzX2FjdGl2ZV9ib29sX2ZhbHNlQDQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MQogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIGludGNfMSAvLyAwCiAgICBleHRyYWN0X3VpbnQ2NAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYyCiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MS02MgogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgPD0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MS02MwogICAgLy8gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcAogICAgLy8gPD0gcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X2VuZAogICAgYnogX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANAogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYzCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBmcmFtZV9kaWcgMQogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveE1hcCBlbnRyeSBleGlzdHMKICAgIHB1c2hpbnQgOAogICAgZXh0cmFjdF91aW50NjQKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2Mi02MwogICAgLy8gPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vIDw9IHJvbGVfbWFwW3JvbGVfYWRkcmVzc10ucm9sZV92YWxpZGl0eV9lbmQKICAgIGZyYW1lX2RpZyAwCiAgICA+PQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjYxLTYzCiAgICAvLyByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfc3RhcnQKICAgIC8vIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wCiAgICAvLyA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICBieiBfcm9sZV9pc19hY3RpdmVfYm9vbF9mYWxzZUA0CiAgICBpbnRjXzAgLy8gMQoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfbWVyZ2VANToKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2MC02NAogICAgLy8gcmV0dXJuIHNlbGYuX2hhc19yb2xlKHJvbGVfbWFwLCByb2xlX2FkZHJlc3MpIGFuZCAoCiAgICAvLyAgICAgcm9sZV9tYXBbcm9sZV9hZGRyZXNzXS5yb2xlX3ZhbGlkaXR5X3N0YXJ0CiAgICAvLyAgICAgPD0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIC8vICAgICA8PSByb2xlX21hcFtyb2xlX2FkZHJlc3NdLnJvbGVfdmFsaWRpdHlfZW5kCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKX3JvbGVfaXNfYWN0aXZlX2Jvb2xfZmFsc2VANDoKICAgIGludGNfMSAvLyAwCiAgICBiIF9yb2xlX2lzX2FjdGl2ZV9ib29sX21lcmdlQDUKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X2NhbGxlcl9pc19hcnJhbmdlcigpIC0+IHZvaWQ6Cl9hc3NlcnRfY2FsbGVyX2lzX2FycmFuZ2VyOgogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjY3CiAgICAvLyBhc3NlcnQgc2VsZi5faXNfYXJyYW5nZXIoVHhuLnNlbmRlciksIGVyci5VTkFVVEhPUklaRUQKICAgIHR4biBTZW5kZXIKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo1NAogICAgLy8gcmV0dXJuIHJvbGVfYWRkcmVzcyA9PSBzZWxmLmFycmFuZ2VyLnZhbHVlCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAweDUyM2E0MTUyNTIyMwogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFycmFuZ2VyIGV4aXN0cwogICAgPT0KICAgIC8vIG1vZHVsZXMvcmJhYy5weTo2NwogICAgLy8gYXNzZXJ0IHNlbGYuX2lzX2FycmFuZ2VyKFR4bi5zZW5kZXIpLCBlcnIuVU5BVVRIT1JJWkVECiAgICBhc3NlcnQgLy8gTm90IGF1dGhvcml6ZWQKICAgIHJldHN1YgoKCi8vIG1vZHVsZXMucmJhYy5SYmFjTW9kdWxlLl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZCgpIC0+IHZvaWQ6Cl9hc3NlcnRfaXNfbm90X2NvbnRyYWN0X2RlZmF1bHRlZDoKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo4OAogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmRlZmF1bHRlZCwgZXJyLkRFRkFVTFRFRAogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjIDcgLy8gImRlZmF1bHRlZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5kZWZhdWx0ZWQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gRGVmYXVsdGVkCiAgICByZXRzdWIKCgovLyBtb2R1bGVzLnJiYWMuUmJhY01vZHVsZS5fYXNzZXJ0X3ZhbGlkX3JvbGUocm9sZV9pZDogdWludDY0KSAtPiB2b2lkOgpfYXNzZXJ0X3ZhbGlkX3JvbGU6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTMKICAgIC8vIGRlZiBfYXNzZXJ0X3ZhbGlkX3JvbGUoc2VsZiwgcm9sZV9pZDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQtMTAxCiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk1CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgcHVzaGludCAyNQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0LTEwMQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYm56IF9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX3RydWVANgogICAgZnJhbWVfZGlnIC0xCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTYKICAgIC8vIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICBpbnRjXzMgLy8gNDAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NC0xMDEKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk3CiAgICAvLyBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICBwdXNoaW50IDUwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQtMTAxCiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5OAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICBwdXNoaW50IDYwCiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQtMTAxCiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgID09CiAgICBibnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2CiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5OQogICAgLy8gVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIHB1c2hpbnQgNzAKICAgIC8vIG1vZHVsZXMvcmJhYy5weTo5NC0xMDEKICAgIC8vIGFzc2VydCByb2xlX2lkIGluICgKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PUF9EQUVNT04pLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FDQ09VTlRfTUFOQUdFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfUFJJTUFSWV9ERUFMRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1RSVVNURUUpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX0FVVEhPUklUWSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgLy8gKSwgZXJyLklOVkFMSURfUk9MRQogICAgPT0KICAgIGJueiBfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF90cnVlQDYKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gbW9kdWxlcy9yYmFjLnB5OjEwMAogICAgLy8gVUludDY0KGVudW1zLlJPTEVfT0JTRVJWRVIpLAogICAgcHVzaGludCA4MAogICAgLy8gbW9kdWxlcy9yYmFjLnB5Ojk0LTEwMQogICAgLy8gYXNzZXJ0IHJvbGVfaWQgaW4gKAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09QX0RBRU1PTiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQUNDT1VOVF9NQU5BR0VSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9QUklNQVJZX0RFQUxFUiksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfVFJVU1RFRSksCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfQVVUSE9SSVRZKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9PQlNFUlZFUiksCiAgICAvLyApLCBlcnIuSU5WQUxJRF9ST0xFCiAgICA9PQogICAgYnogX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfZmFsc2VANwoKX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfdHJ1ZUA2OgogICAgaW50Y18wIC8vIDEKCl9hc3NlcnRfdmFsaWRfcm9sZV9ib29sX21lcmdlQDg6CiAgICAvLyBtb2R1bGVzL3JiYWMucHk6OTQtMTAxCiAgICAvLyBhc3NlcnQgcm9sZV9pZCBpbiAoCiAgICAvLyAgICAgVUludDY0KGVudW1zLlJPTEVfT1BfREFFTU9OKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BQ0NPVU5UX01BTkFHRVIpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX1BSSU1BUllfREVBTEVSKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9UUlVTVEVFKSwKICAgIC8vICAgICBVSW50NjQoZW51bXMuUk9MRV9BVVRIT1JJVFkpLAogICAgLy8gICAgIFVJbnQ2NChlbnVtcy5ST0xFX09CU0VSVkVSKSwKICAgIC8vICksIGVyci5JTlZBTElEX1JPTEUKICAgIGFzc2VydCAvLyBJbnZhbGlkIHJvbGUgaWRlbnRpZmllcgogICAgcmV0c3ViCgpfYXNzZXJ0X3ZhbGlkX3JvbGVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18xIC8vIDAKICAgIGIgX2Fzc2VydF92YWxpZF9yb2xlX2Jvb2xfbWVyZ2VAOAo=", "clear": "I3ByYWdtYSB2ZXJzaW9uIDExCiNwcmFnbWEgdHlwZXRyYWNrIGZhbHNlCgovLyBhbGdvcHkuYXJjNC5BUkM0Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbSgpIC0+IHVpbnQ2NDoKbWFpbjoKICAgIHB1c2hpbnQgMQogICAgcmV0dXJuCg==" }, "byteCode": { "approval": "CyAEAQAgKCYKBBUffHUGUjpBUlIjBlI6VFJTIwZSOkFVVCMGUjpNTkcjBlI6UFlEIwZSOk1PQyMJZGVmYXVsdGVkBlI6T1BEIxJjb250cmFjdF9zdXNwZW5kZWQxGEAAESkyA2cnCDIDZycJI2cnByNnMRtBAGeABJFPBOs2GgCOAQBOMRkURDEYRIIJBIL3Gy0E7wT10wTfNDVQBD2+gL0EHj5I5wQ5JB+jBAEMgpkEdAas0gQacqLuNhoAjgkAIAA8AFQBDgGhAb8B3QHnAjAAMRmBBBIxGBBEQgAOMRkUMRgUEEQpMQBnIkOIAsAiQzYaAUkVJBJEiAKzSTIDE0QpTGcyBxYoTFCwIkM2GgFJFSQSRIgClycITGcyBxYoTFCwIkM2GgFJFSISRDYaAklOAkkVJBJENhoDSU4DSRWBEBJEiAJoiAJuTwIXSU4DSYgCbDIDTwMTREsBI1tPAoEIWwxEJRJBABcnBEsDUEm9RQEUREsCvzIHFihMULAiQ0mBMhJBABEnBUsDUEm9RQEUREsCv0L/30mBPBJBABAqSwNQSb1FARRESwK/Qv/ISYFGEkEAECtLA1BJvUUBFERLAr9C/7FJgVASQf+qJwZLA1BJvUUBFERLAr9C/5k2GgFJFSISRDYaAklOAhUkEkSIAbuIAcEXRwKIAcNJgRQTRCUSQQAVJwRLAlBJvUUBRLxIMgcWKExQsCJDSYEyEkEADycFSwJQSb1FAUS8SEL/4UmBPBJBAA4qSwJQSb1FAUS8SEL/zEmBRhJBAA4rSwJQSb1FAUS8SEL/t0mBUBJB/7AnBksCUEm9RQFEvEhC/6E2GgFJFSISRCNTKzEAiAD4RCcJTGcyBxYoTFCwIkM2GgFJFSISRCNTKjEAiADaRCcHTGcyBxYoTFCwIkMjKWVEKExQsCJDNhoBSRUkEkQnBEsBiACzJwVLAogArCpLA4gApitLBIgAoCcGTwWIAJmAAQAjTwZUIk8FVIECTwRUgQNPA1SBBE8CVChMULAiQzYaAUkVIhJENhoCSU4CFSQSRBdJiACoJYMEMjxGUE8FjgUAPgAvACEAEwABACcGSwFQSb1FAUS+SChMULAiQytLAVBJvUUBRL5IQv/sKksBUEm9RQFEvkhC/94nBUsBUEm9RQFEvkhC/88nBEsBUEm9RQFEvkhC/8CKAgGAAIv+i/9QSb1FAUEAIIsBvkQjWzIHSYwADkEAEYsBvkSBCFuLAA9BAAQijACJI0L/+TEAIyllRBJEiSMnB2VEFESJigEAi/+BGRJAACeL/yUSQAAgi/+BMhJAABiL/4E8EkAAEIv/gUYSQAAIi/+BUBJBAAMiRIkjQv/6", "clear": "C4EBQw==" }, "compilerInfo": { "compiler": "puya", "compilerVersion": { "major": 5, "minor": 8, "patch": 1 } }, "events": [], "templateVariables": {} }