diff --git a/examples/amm/out/ConstantProductAMM.arc56.json b/examples/amm/out/ConstantProductAMM.arc56.json new file mode 100644 index 0000000000..cd5f673940 --- /dev/null +++ b/examples/amm/out/ConstantProductAMM.arc56.json @@ -0,0 +1,506 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "ConstantProductAMM", + "structs": {}, + "methods": [ + { + "name": "set_governor", + "args": [ + { + "type": "account", + "name": "new_governor" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {}, + "desc": "sets the governor of the contract, may only be called by the current governor" + }, + { + "name": "bootstrap", + "args": [ + { + "type": "pay", + "name": "seed", + "desc": "Initial Payment transaction to the app account so it can opt in to assets and create pool token." + }, + { + "type": "asset", + "name": "a_asset", + "desc": "One of the two assets this pool should allow swapping between." + }, + { + "type": "asset", + "name": "b_asset", + "desc": "The other of the two assets this pool should allow swapping between." + } + ], + "returns": { + "type": "uint64", + "desc": "The asset id of the pool token created." + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {}, + "desc": "bootstraps the contract by opting into the assets and creating the pool token.\nNote this method will fail if it is attempted more than once on the same contract since the assets and pool token application state values are marked as static and cannot be overridden." + }, + { + "name": "mint", + "args": [ + { + "type": "axfer", + "name": "a_xfer", + "desc": "Asset Transfer Transaction of asset A as a deposit to the pool in exchange for pool tokens." + }, + { + "type": "axfer", + "name": "b_xfer", + "desc": "Asset Transfer Transaction of asset B as a deposit to the pool in exchange for pool tokens." + }, + { + "type": "asset", + "name": "pool_asset", + "desc": "The asset ID of the pool token so that we may distribute it.", + "defaultValue": { + "source": "global", + "data": "cG9vbF90b2tlbg==", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "a_asset", + "desc": "The asset ID of the Asset A so that we may inspect our balance.", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYQ==", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "b_asset", + "desc": "The asset ID of the Asset B so that we may inspect our balance.", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYg==", + "type": "AVMString" + } + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {}, + "desc": "mint pool tokens given some amount of asset A and asset B.\nGiven some amount of Asset A and Asset B in the transfers, mint some number of pool tokens commensurate with the pools current balance and circulating supply of pool tokens." + }, + { + "name": "burn", + "args": [ + { + "type": "axfer", + "name": "pool_xfer", + "desc": "Asset Transfer Transaction of the pool token for the amount the sender wishes to redeem" + }, + { + "type": "asset", + "name": "pool_asset", + "desc": "Asset ID of the pool token so we may inspect balance.", + "defaultValue": { + "source": "global", + "data": "cG9vbF90b2tlbg==", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "a_asset", + "desc": "Asset ID of Asset A so we may inspect balance and distribute it", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYQ==", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "b_asset", + "desc": "Asset ID of Asset B so we may inspect balance and distribute it", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYg==", + "type": "AVMString" + } + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {}, + "desc": "burn pool tokens to get back some amount of asset A and asset B" + }, + { + "name": "swap", + "args": [ + { + "type": "axfer", + "name": "swap_xfer", + "desc": "Asset Transfer Transaction of either Asset A or Asset B" + }, + { + "type": "asset", + "name": "a_asset", + "desc": "Asset ID of asset A so we may inspect balance and possibly transfer it", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYQ==", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "b_asset", + "desc": "Asset ID of asset B so we may inspect balance and possibly transfer it", + "defaultValue": { + "source": "global", + "data": "YXNzZXRfYg==", + "type": "AVMString" + } + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {}, + "desc": "Swap some amount of either asset A or asset B for the other" + } + ], + "state": { + "schema": { + "global": { + "ints": 4, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "asset_a": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNzZXRfYQ==" + }, + "asset_b": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNzZXRfYg==" + }, + "governor": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Z292ZXJub3I=" + }, + "pool_token": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cG9vbF90b2tlbg==" + }, + "ratio": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cmF0aW8=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 124, + 142, + 186, + 237, + 277 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 342 + ], + "errorMessage": "Only the account set in global_state.governor may call this method" + }, + { + "pc": [ + 668, + 681, + 694 + ], + "errorMessage": "account opted into asset" + }, + { + "pc": [ + 379, + 590, + 614, + 850, + 969 + ], + "errorMessage": "amount minimum not met" + }, + { + "pc": [ + 352 + ], + "errorMessage": "application has already been bootstrapped" + }, + { + "pc": [ + 542, + 584, + 828, + 955 + ], + "errorMessage": "asset a incorrect" + }, + { + "pc": [ + 385 + ], + "errorMessage": "asset a must be less than asset b" + }, + { + "pc": [ + 550, + 608, + 836, + 963 + ], + "errorMessage": "asset b incorrect" + }, + { + "pc": [ + 429, + 448 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 996 + ], + "errorMessage": "asset id incorrect" + }, + { + "pc": [ + 534, + 820, + 860 + ], + "errorMessage": "asset pool incorrect" + }, + { + "pc": [ + 655 + ], + "errorMessage": "bootstrap method needs to be called first" + }, + { + "pc": [ + 403, + 426, + 538, + 582, + 678, + 824, + 899, + 951, + 981, + 1011 + ], + "errorMessage": "check self.asset_a exists" + }, + { + "pc": [ + 410, + 445, + 546, + 606, + 691, + 832, + 910, + 959, + 985, + 1029 + ], + "errorMessage": "check self.asset_b exists" + }, + { + "pc": [ + 340 + ], + "errorMessage": "check self.governor exists" + }, + { + "pc": [ + 350, + 417, + 530, + 638, + 654, + 665, + 816, + 858 + ], + "errorMessage": "check self.pool_token exists" + }, + { + "pc": [ + 361 + ], + "errorMessage": "group size not 2" + }, + { + "pc": [ + 316 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 127, + 145, + 189, + 240, + 280 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 369, + 574, + 598, + 844 + ], + "errorMessage": "receiver not app address" + }, + { + "pc": [ + 632, + 1040 + ], + "errorMessage": "send amount too low" + }, + { + "pc": [ + 558, + 566, + 868, + 977 + ], + "errorMessage": "sender invalid" + }, + { + "pc": [ + 200, + 210, + 250, + 290 + ], + "errorMessage": "transaction type is axfer" + }, + { + "pc": [ + 155 + ], + "errorMessage": "transaction type is pay" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwMDAgNCAxMDAwMDAwMDAwMAogICAgYnl0ZWNibG9jayAiYXNzZXRfYSIgImFzc2V0X2IiICJwb29sX3Rva2VuIiAiZ292ZXJub3IiICJyYXRpbyIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9lbnRyeXBvaW50QDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fZW50cnlwb2ludEAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDkKICAgIHB1c2hieXRlc3MgMHgwOGE5NTZmNyAweDZiNTlkOTY1IDB4NWNiZjFlMmQgMHgxNDM2YzJhYyAweDRhODhlMDU1IC8vIG1ldGhvZCAic2V0X2dvdmVybm9yKGFjY291bnQpdm9pZCIsIG1ldGhvZCAiYm9vdHN0cmFwKHBheSxhc3NldCxhc3NldCl1aW50NjQiLCBtZXRob2QgIm1pbnQoYXhmZXIsYXhmZXIsYXNzZXQsYXNzZXQsYXNzZXQpdm9pZCIsIG1ldGhvZCAiYnVybihheGZlcixhc3NldCxhc3NldCxhc3NldCl2b2lkIiwgbWV0aG9kICJzd2FwKGF4ZmVyLGFzc2V0LGFzc2V0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfZ292ZXJub3Jfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19taW50X3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fYnVybl9yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N3YXBfcm91dGVANgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2dvdmVybm9yX3JvdXRlQDI6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIC8vIGFtbS9jb250cmFjdC5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgc2V0X2dvdmVybm9yCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib290c3RyYXBfcm91dGVAMzoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGJvb3RzdHJhcAogICAgaXRvYgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19taW50X3JvdXRlQDQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6ODEtODcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTg3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgY2FsbHN1YiBtaW50CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19idXJuX3JvdXRlQDU6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQ3LTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGRlZmF1bHRfYXJncz17CiAgICAvLyAgICAgICAgICJwb29sX2Fzc2V0IjogInBvb2xfdG9rZW4iLAogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIGNhbGxzdWIgYnVybgogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc3dhcF9yb3V0ZUA2OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNC0yMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFtbS9jb250cmFjdC5weToyNwogICAgLy8gY2xhc3MgQ29uc3RhbnRQcm9kdWN0QU1NKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMyAvLyBheGZlcgogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGF4ZmVyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNC0yMDkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIGNhbGxzdWIgc3dhcAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDk6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTM6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcKICAgIC8vIGNsYXNzIENvbnN0YW50UHJvZHVjdEFNTShBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uc2V0X2dvdmVybm9yKG5ld19nb3Zlcm5vcjogYnl0ZXMpIC0+IHZvaWQ6CnNldF9nb3Zlcm5vcjoKICAgIC8vIGFtbS9jb250cmFjdC5weTo0My00NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBzZXRfZ292ZXJub3Ioc2VsZiwgbmV3X2dvdmVybm9yOiBBY2NvdW50KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDYKICAgIC8vIHNlbGYuX2NoZWNrX2lzX2dvdmVybm9yKCkKICAgIGNhbGxzdWIgX2NoZWNrX2lzX2dvdmVybm9yCiAgICAvLyBhbW0vY29udHJhY3QucHk6NDcKICAgIC8vIHNlbGYuZ292ZXJub3IgPSBuZXdfZ292ZXJub3IKICAgIGJ5dGVjXzMgLy8gImdvdmVybm9yIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY2hlY2tfaXNfZ292ZXJub3IoKSAtPiB2b2lkOgpfY2hlY2tfaXNfZ292ZXJub3I6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjYyLTI2MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY2hlY2tfaXNfZ292ZXJub3Ioc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gVHhuLnNlbmRlciA9PSBzZWxmLmdvdmVybm9yCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAiZ292ZXJub3IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ292ZXJub3IgZXhpc3RzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2NC0yNjYKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgVHhuLnNlbmRlciA9PSBzZWxmLmdvdmVybm9yCiAgICAvLyApLCAiT25seSB0aGUgYWNjb3VudCBzZXQgaW4gZ2xvYmFsX3N0YXRlLmdvdmVybm9yIG1heSBjYWxsIHRoaXMgbWV0aG9kIgogICAgYXNzZXJ0IC8vIE9ubHkgdGhlIGFjY291bnQgc2V0IGluIGdsb2JhbF9zdGF0ZS5nb3Zlcm5vciBtYXkgY2FsbCB0aGlzIG1ldGhvZAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5ib290c3RyYXAoc2VlZDogdWludDY0LCBhX2Fzc2V0OiB1aW50NjQsIGJfYXNzZXQ6IHVpbnQ2NCkgLT4gdWludDY0Ogpib290c3RyYXA6CiAgICAvLyBhbW0vY29udHJhY3QucHk6NDktNTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgYm9vdHN0cmFwKHNlbGYsIHNlZWQ6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uLCBhX2Fzc2V0OiBBc3NldCwgYl9hc3NldDogQXNzZXQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBhc3NlcnQgbm90IHNlbGYucG9vbF90b2tlbiwgImFwcGxpY2F0aW9uIGhhcyBhbHJlYWR5IGJlZW4gYm9vdHN0cmFwcGVkIgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBoYXMgYWxyZWFkeSBiZWVuIGJvb3RzdHJhcHBlZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjY3CiAgICAvLyBzZWxmLl9jaGVja19pc19nb3Zlcm5vcigpCiAgICBjYWxsc3ViIF9jaGVja19pc19nb3Zlcm5vcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBhc3NlcnQgR2xvYmFsLmdyb3VwX3NpemUgPT0gMiwgImdyb3VwIHNpemUgbm90IDIiCiAgICBnbG9iYWwgR3JvdXBTaXplCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyBncm91cCBzaXplIG5vdCAyCiAgICAvLyBhbW0vY29udHJhY3QucHk6NjkKICAgIC8vIGFzc2VydCBzZWVkLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weTo3MQogICAgLy8gYXNzZXJ0IHNlZWQuYW1vdW50ID49IDMwMF8wMDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IiAgIyAwLjMgQWxnb3MKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDMwMDAwMCAvLyAzMDAwMDAKICAgID49CiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBhc3NlcnQgYV9hc3NldC5pZCA8IGJfYXNzZXQuaWQsICJhc3NldCBhIG11c3QgYmUgbGVzcyB0aGFuIGFzc2V0IGIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgPAogICAgYXNzZXJ0IC8vIGFzc2V0IGEgbXVzdCBiZSBsZXNzIHRoYW4gYXNzZXQgYgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjczCiAgICAvLyBzZWxmLmFzc2V0X2EgPSBhX2Fzc2V0CiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgZnJhbWVfZGlnIC0yCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc0CiAgICAvLyBzZWxmLmFzc2V0X2IgPSBiX2Fzc2V0CiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBzZWxmLnBvb2xfdG9rZW4gPSBzZWxmLl9jcmVhdGVfcG9vbF90b2tlbigpCiAgICBjYWxsc3ViIF9jcmVhdGVfcG9vbF90b2tlbgogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6NzcKICAgIC8vIHNlbGYuX2RvX29wdF9pbihzZWxmLmFzc2V0X2EpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgY2FsbHN1YiBfZG9fb3B0X2luCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzgKICAgIC8vIHNlbGYuX2RvX29wdF9pbihzZWxmLmFzc2V0X2IpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgY2FsbHN1YiBfZG9fb3B0X2luCiAgICAvLyBhbW0vY29udHJhY3QucHk6NzkKICAgIC8vIHJldHVybiBzZWxmLnBvb2xfdG9rZW4uaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jcmVhdGVfcG9vbF90b2tlbigpIC0+IHVpbnQ2NDoKX2NyZWF0ZV9wb29sX3Rva2VuOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI2OC0yNjkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2NyZWF0ZV9wb29sX3Rva2VuKHNlbGYpIC0+IEFzc2V0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcxLTI3OQogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgdW5pdF9uYW1lPWIiZGJ0IiwKICAgIC8vICAgICB0b3RhbD1UT1RBTF9TVVBQTFksCiAgICAvLyAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICBtYW5hZ2VyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgcmVzZXJ2ZT1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcyCiAgICAvLyBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBwdXNoYnl0ZXMgMHg0NDUwNTQyZAogICAgc3dhcAogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgyZAogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldFVuaXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzYKICAgIC8vIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjc3CiAgICAvLyByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRSZXNlcnZlCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3NQogICAgLy8gZGVjaW1hbHM9MywKICAgIHB1c2hpbnQgMyAvLyAzCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzQKICAgIC8vIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIGludGMgNCAvLyAxMDAwMDAwMDAwMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjczCiAgICAvLyB1bml0X25hbWU9YiJkYnQiLAogICAgcHVzaGJ5dGVzIDB4NjQ2Mjc0CiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcxCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgcHVzaGludCAzIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI3MS0yNzkKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgYXNzZXRfbmFtZT1iIkRQVC0iICsgc2VsZi5hc3NldF9hLnVuaXRfbmFtZSArIGIiLSIgKyBzZWxmLmFzc2V0X2IudW5pdF9uYW1lLAogICAgLy8gICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgdG90YWw9VE9UQUxfU1VQUExZLAogICAgLy8gICAgIGRlY2ltYWxzPTMsCiAgICAvLyAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHJlc2VydmU9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyNzEtMjgwCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIGFzc2V0X25hbWU9YiJEUFQtIiArIHNlbGYuYXNzZXRfYS51bml0X25hbWUgKyBiIi0iICsgc2VsZi5hc3NldF9iLnVuaXRfbmFtZSwKICAgIC8vICAgICB1bml0X25hbWU9YiJkYnQiLAogICAgLy8gICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICBkZWNpbWFscz0zLAogICAgLy8gICAgIG1hbmFnZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2Fzc2V0CiAgICBpdHhuIENyZWF0ZWRBc3NldElECiAgICAvLyBhbW0vY29udHJhY3QucHk6MjcwLTI4MQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgICAgICBhc3NldF9uYW1lPWIiRFBULSIgKyBzZWxmLmFzc2V0X2EudW5pdF9uYW1lICsgYiItIiArIHNlbGYuYXNzZXRfYi51bml0X25hbWUsCiAgICAvLyAgICAgICAgIHVuaXRfbmFtZT1iImRidCIsCiAgICAvLyAgICAgICAgIHRvdGFsPVRPVEFMX1NVUFBMWSwKICAgIC8vICAgICAgICAgZGVjaW1hbHM9MywKICAgIC8vICAgICAgICAgbWFuYWdlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgICAgICByZXNlcnZlPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgKQogICAgLy8gICAgIC5zdWJtaXQoKQogICAgLy8gICAgIC5jcmVhdGVkX2Fzc2V0CiAgICAvLyApCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9kb19vcHRfaW4oYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKX2RvX29wdF9pbjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyODMtMjg0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9kb19vcHRfaW4oc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6Mjg2CiAgICAvLyByZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToyODUtMjg5CiAgICAvLyBkb19hc3NldF90cmFuc2ZlcigKICAgIC8vICAgICByZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGFzc2V0PWFzc2V0LAogICAgLy8gICAgIGFtb3VudD1VSW50NjQoMCksCiAgICAvLyApCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIGFtbS9jb250cmFjdC5weToyODgKICAgIC8vIGFtb3VudD1VSW50NjQoMCksCiAgICBpbnRjXzAgLy8gMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI4NS0yODkKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKAogICAgLy8gICAgIHJlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYW1vdW50PVVJbnQ2NCgwKSwKICAgIC8vICkKICAgIGNhbGxzdWIgZG9fYXNzZXRfdHJhbnNmZXIKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5kb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcjogYnl0ZXMsIGFzc2V0OiB1aW50NjQsIGFtb3VudDogdWludDY0KSAtPiB2b2lkOgpkb19hc3NldF90cmFuc2ZlcjoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTYtMzU3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGRvX2Fzc2V0X3RyYW5zZmVyKCosIHJlY2VpdmVyOiBBY2NvdW50LCBhc3NldDogQXNzZXQsIGFtb3VudDogVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzU4LTM2MgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMwogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTgKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMyAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzU4LTM2MgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PWFtb3VudCwKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1yZWNlaXZlciwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLm1pbnQoYV94ZmVyOiB1aW50NjQsIGJfeGZlcjogdWludDY0LCBwb29sX2Fzc2V0OiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB2b2lkOgptaW50OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjgxLTk1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgInBvb2xfYXNzZXQiOiAicG9vbF90b2tlbiIsCiAgICAvLyAgICAgICAgICJhX2Fzc2V0IjogImFzc2V0X2EiLAogICAgLy8gICAgICAgICAiYl9hc3NldCI6ICJhc3NldF9iIiwKICAgIC8vICAgICB9LAogICAgLy8gKQogICAgLy8gZGVmIG1pbnQoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBhX3hmZXI6IGd0eG4uQXNzZXRUcmFuc2ZlclRyYW5zYWN0aW9uLAogICAgLy8gICAgIGJfeGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgcG9vbF9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYV9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYl9hc3NldDogQXNzZXQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA1IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTEKICAgIC8vIHNlbGYuX2NoZWNrX2Jvb3RzdHJhcHBlZCgpCiAgICBjYWxsc3ViIF9jaGVja19ib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTMtMTE0CiAgICAvLyAjIHdlbGwtZm9ybWVkIG1pbnQKICAgIC8vIGFzc2VydCBwb29sX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBwb29sIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjExNQogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE2CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMTcKICAgIC8vIGFzc2VydCBhX3hmZXIuc2VuZGVyID09IFR4bi5zZW5kZXIsICJzZW5kZXIgaW52YWxpZCIKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgU2VuZGVyCiAgICB0eG4gU2VuZGVyCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlciBpbnZhbGlkCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgYl94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEyMgogICAgLy8gYV94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtNQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTIwLTEyMwogICAgLy8gIyB2YWxpZCBhc3NldCBhIHhmZXIKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgYV94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTI0CiAgICAvLyBhc3NlcnQgYV94ZmVyLnhmZXJfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTUKICAgIGd0eG5zIFhmZXJBc3NldAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxMjUKICAgIC8vIGFzc2VydCBhX3hmZXIuYXNzZXRfYW1vdW50ID4gMCwgImFtb3VudCBtaW5pbXVtIG5vdCBtZXQiCiAgICBmcmFtZV9kaWcgLTUKICAgIGd0eG5zIEFzc2V0QW1vdW50CiAgICBkdXAKICAgIGFzc2VydCAvLyBhbW91bnQgbWluaW11bSBub3QgbWV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTI5CiAgICAvLyBiX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIGFtbS9jb250cmFjdC5weToxMjctMTMwCiAgICAvLyAjIHZhbGlkIGFzc2V0IGIgeGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBiX3hmZXIuYXNzZXRfcmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgInJlY2VpdmVyIG5vdCBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyByZWNlaXZlciBub3QgYXBwIGFkZHJlc3MKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzEKICAgIC8vIGFzc2VydCBiX3hmZXIueGZlcl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBiIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gYXNzZXJ0IGJfeGZlci5hc3NldF9hbW91bnQgPiAwLCAiYW1vdW50IG1pbmltdW0gbm90IG1ldCIKICAgIGZyYW1lX2RpZyAtNAogICAgZ3R4bnMgQXNzZXRBbW91bnQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGFtb3VudCBtaW5pbXVtIG5vdCBtZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzUKICAgIC8vIHBvb2xfYmFsYW5jZT1zZWxmLl9jdXJyZW50X3Bvb2xfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9wb29sX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzYKICAgIC8vIGFfYmFsYW5jZT1zZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzcKICAgIC8vIGJfYmFsYW5jZT1zZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpLAogICAgY2FsbHN1YiBfY3VycmVudF9iX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToxMzQtMTQwCiAgICAvLyB0b19taW50ID0gdG9rZW5zX3RvX21pbnQoCiAgICAvLyAgICAgcG9vbF9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCksCiAgICAvLyAgICAgYV9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICAvLyAgICAgYl9iYWxhbmNlPXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICAvLyAgICAgYV9hbW91bnQ9YV94ZmVyLmFzc2V0X2Ftb3VudCwKICAgIC8vICAgICBiX2Ftb3VudD1iX3hmZXIuYXNzZXRfYW1vdW50LAogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGNhbGxzdWIgdG9rZW5zX3RvX21pbnQKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDEKICAgIC8vIGFzc2VydCB0b19taW50ID4gMCwgInNlbmQgYW1vdW50IHRvbyBsb3ciCiAgICBkdXAKICAgIGFzc2VydCAvLyBzZW5kIGFtb3VudCB0b28gbG93CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTQzLTE0NAogICAgLy8gIyBtaW50IHRva2VucwogICAgLy8gZG9fYXNzZXRfdHJhbnNmZXIocmVjZWl2ZXI9VHhuLnNlbmRlciwgYXNzZXQ9c2VsZi5wb29sX3Rva2VuLCBhbW91bnQ9dG9fbWludCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgZG9fYXNzZXRfdHJhbnNmZXIKICAgIC8vIGFtbS9jb250cmFjdC5weToxNDUKICAgIC8vIHNlbGYuX3VwZGF0ZV9yYXRpbygpCiAgICBjYWxsc3ViIF91cGRhdGVfcmF0aW8KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2NoZWNrX2Jvb3RzdHJhcHBlZCgpIC0+IHZvaWQ6Cl9jaGVja19ib290c3RyYXBwZWQ6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjUxLTI1MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY2hlY2tfYm9vdHN0cmFwcGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTMKICAgIC8vIGFzc2VydCBzZWxmLnBvb2xfdG9rZW4sICJib290c3RyYXAgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBmaXJzdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICBhc3NlcnQgLy8gYm9vdHN0cmFwIG1ldGhvZCBuZWVkcyB0byBiZSBjYWxsZWQgZmlyc3QKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX2N1cnJlbnRfcG9vbF9iYWxhbmNlKCkgLT4gdWludDY0OgpfY3VycmVudF9wb29sX2JhbGFuY2U6CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjkxLTI5MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY3VycmVudF9wb29sX2JhbGFuY2Uoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjkzCiAgICAvLyByZXR1cm4gc2VsZi5wb29sX3Rva2VuLmJhbGFuY2UoR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcykKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wb29sX3Rva2VuIGV4aXN0cwogICAgYXNzZXRfaG9sZGluZ19nZXQgQXNzZXRCYWxhbmNlCiAgICBhc3NlcnQgLy8gYWNjb3VudCBvcHRlZCBpbnRvIGFzc2V0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLl9jdXJyZW50X2FfYmFsYW5jZSgpIC0+IHVpbnQ2NDoKX2N1cnJlbnRfYV9iYWxhbmNlOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5NS0yOTYKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX2N1cnJlbnRfYV9iYWxhbmNlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI5NwogICAgLy8gcmV0dXJuIHNlbGYuYXNzZXRfYS5iYWxhbmNlKEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MpCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIGFzc2V0X2hvbGRpbmdfZ2V0IEFzc2V0QmFsYW5jZQogICAgYXNzZXJ0IC8vIGFjY291bnQgb3B0ZWQgaW50byBhc3NldAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fY3VycmVudF9iX2JhbGFuY2UoKSAtPiB1aW50NjQ6Cl9jdXJyZW50X2JfYmFsYW5jZToKICAgIC8vIGFtbS9jb250cmFjdC5weToyOTktMzAwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF9jdXJyZW50X2JfYmFsYW5jZShzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozMDEKICAgIC8vIHJldHVybiBzZWxmLmFzc2V0X2IuYmFsYW5jZShHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBhc3NldF9ob2xkaW5nX2dldCBBc3NldEJhbGFuY2UKICAgIGFzc2VydCAvLyBhY2NvdW50IG9wdGVkIGludG8gYXNzZXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC50b2tlbnNfdG9fbWludChwb29sX2JhbGFuY2U6IHVpbnQ2NCwgYV9iYWxhbmNlOiB1aW50NjQsIGJfYmFsYW5jZTogdWludDY0LCBhX2Ftb3VudDogdWludDY0LCBiX2Ftb3VudDogdWludDY0KSAtPiB1aW50NjQ6CnRva2Vuc190b19taW50OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMyMi0zMzAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdG9rZW5zX3RvX21pbnQoCiAgICAvLyAgICAgKiwKICAgIC8vICAgICBwb29sX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBhX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBiX2JhbGFuY2U6IFVJbnQ2NCwKICAgIC8vICAgICBhX2Ftb3VudDogVUludDY0LAogICAgLy8gICAgIGJfYW1vdW50OiBVSW50NjQsCiAgICAvLyApIC0+IFVJbnQ2NDoKICAgIHByb3RvIDUgMQogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzEKICAgIC8vIGlzX2luaXRpYWxfbWludCA9IGFfYmFsYW5jZSA9PSBhX2Ftb3VudCBhbmQgYl9iYWxhbmNlID09IGJfYW1vdW50CiAgICBmcmFtZV9kaWcgLTQKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGJ6IHRva2Vuc190b19taW50X2Jvb2xfZmFsc2VAMwogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBieiB0b2tlbnNfdG9fbWludF9ib29sX2ZhbHNlQDMKICAgIGludGNfMSAvLyAxCiAgICBiIHRva2Vuc190b19taW50X2Jvb2xfbWVyZ2VANAoKdG9rZW5zX3RvX21pbnRfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKCnRva2Vuc190b19taW50X2Jvb2xfbWVyZ2VANDoKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzIKICAgIC8vIGlmIGlzX2luaXRpYWxfbWludDoKICAgIGJ6IHRva2Vuc190b19taW50X2FmdGVyX2lmX2Vsc2VANgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzMwogICAgLy8gcmV0dXJuIG9wLnNxcnQoYV9hbW91bnQgKiBiX2Ftb3VudCkgLSBTQ0FMRQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIHNxcnQKICAgIGludGNfMiAvLyAxMDAwCiAgICAtCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKdG9rZW5zX3RvX21pbnRfYWZ0ZXJfaWZfZWxzZUA2OgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNAogICAgLy8gaXNzdWVkID0gVE9UQUxfU1VQUExZIC0gcG9vbF9iYWxhbmNlCiAgICBpbnRjIDQgLy8gMTAwMDAwMDAwMDAKICAgIGZyYW1lX2RpZyAtNQogICAgLQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjMzNQogICAgLy8gYV9yYXRpbyA9IFNDQUxFICogYV9hbW91bnQgLy8gKGFfYmFsYW5jZSAtIGFfYW1vdW50KQogICAgaW50Y18yIC8vIDEwMDAKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIC8KICAgIGR1cAogICAgZnJhbWVfYnVyeSAwCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzM2CiAgICAvLyBiX3JhdGlvID0gU0NBTEUgKiBiX2Ftb3VudCAvLyAoYl9iYWxhbmNlIC0gYl9hbW91bnQpCiAgICBpbnRjXzIgLy8gMTAwMAogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzcKICAgIC8vIGlmIGFfcmF0aW8gPCBiX3JhdGlvOgogICAgPAogICAgYnogdG9rZW5zX3RvX21pbnRfZWxzZV9ib2R5QDgKICAgIC8vIGFtbS9jb250cmFjdC5weTozMzgKICAgIC8vIHJldHVybiBhX3JhdGlvICogaXNzdWVkIC8vIFNDQUxFCiAgICBmcmFtZV9kaWcgMAogICAgKgogICAgaW50Y18yIC8vIDEwMDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgp0b2tlbnNfdG9fbWludF9lbHNlX2JvZHlAODoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDAKICAgIC8vIHJldHVybiBiX3JhdGlvICogaXNzdWVkIC8vIFNDQUxFCiAgICBmcmFtZV9kaWcgMQogICAgKgogICAgaW50Y18yIC8vIDEwMDAKICAgIC8KICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5fdXBkYXRlX3JhdGlvKCkgLT4gdm9pZDoKX3VwZGF0ZV9yYXRpbzoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTUtMjU2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIF91cGRhdGVfcmF0aW8oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI1NwogICAgLy8gYV9iYWxhbmNlID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgY2FsbHN1YiBfY3VycmVudF9hX2JhbGFuY2UKICAgIC8vIGFtbS9jb250cmFjdC5weToyNTgKICAgIC8vIGJfYmFsYW5jZSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjYwCiAgICAvLyBzZWxmLnJhdGlvID0gYV9iYWxhbmNlICogU0NBTEUgLy8gYl9iYWxhbmNlCiAgICBzd2FwCiAgICBpbnRjXzIgLy8gMTAwMAogICAgKgogICAgc3dhcAogICAgLwogICAgYnl0ZWMgNCAvLyAicmF0aW8iCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LkNvbnN0YW50UHJvZHVjdEFNTS5idXJuKHBvb2xfeGZlcjogdWludDY0LCBwb29sX2Fzc2V0OiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB2b2lkOgpidXJuOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE0Ny0xNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAicG9vbF9hc3NldCI6ICJwb29sX3Rva2VuIiwKICAgIC8vICAgICAgICAgImFfYXNzZXQiOiAiYXNzZXRfYSIsCiAgICAvLyAgICAgICAgICJiX2Fzc2V0IjogImFzc2V0X2IiLAogICAgLy8gICAgIH0sCiAgICAvLyApCiAgICAvLyBkZWYgYnVybigKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHBvb2xfeGZlcjogZ3R4bi5Bc3NldFRyYW5zZmVyVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgcG9vbF9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYV9hc3NldDogQXNzZXQsCiAgICAvLyAgICAgYl9hc3NldDogQXNzZXQsCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byA0IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzAKICAgIC8vIHNlbGYuX2NoZWNrX2Jvb3RzdHJhcHBlZCgpCiAgICBjYWxsc3ViIF9jaGVja19ib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzIKICAgIC8vIGFzc2VydCBwb29sX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gInBvb2xfdG9rZW4iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucG9vbF90b2tlbiBleGlzdHMKICAgIGZyYW1lX2RpZyAtMwogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBwb29sIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3MwogICAgLy8gYXNzZXJ0IGFfYXNzZXQgPT0gc2VsZi5hc3NldF9hLCAiYXNzZXQgYSBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9hIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGEgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc0CiAgICAvLyBhc3NlcnQgYl9hc3NldCA9PSBzZWxmLmFzc2V0X2IsICJhc3NldCBiIGluY29ycmVjdCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYiBpbmNvcnJlY3QKICAgIC8vIGFtbS9jb250cmFjdC5weToxNzcKICAgIC8vIHBvb2xfeGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIEFzc2V0UmVjZWl2ZXIKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICA9PQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE3Ni0xNzgKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgcG9vbF94ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJyZWNlaXZlciBub3QgYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gcmVjZWl2ZXIgbm90IGFwcCBhZGRyZXNzCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTc5CiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gYXNzZXJ0IHBvb2xfeGZlci54ZmVyX2Fzc2V0ID09IHNlbGYucG9vbF90b2tlbiwgImFzc2V0IHBvb2wgaW5jb3JyZWN0IgogICAgZnJhbWVfZGlnIC00CiAgICBndHhucyBYZmVyQXNzZXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwb29sX3Rva2VuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnBvb2xfdG9rZW4gZXhpc3RzCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IHBvb2wgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MTgxCiAgICAvLyBhc3NlcnQgcG9vbF94ZmVyLnNlbmRlciA9PSBUeG4uc2VuZGVyLCAic2VuZGVyIGludmFsaWQiCiAgICBmcmFtZV9kaWcgLTQKICAgIGd0eG5zIFNlbmRlcgogICAgdHhuIFNlbmRlcgogICAgPT0KICAgIGFzc2VydCAvLyBzZW5kZXIgaW52YWxpZAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4My0xODUKICAgIC8vICMgR2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgdG9rZW5zIGlzc3VlZAogICAgLy8gIyAhaW1wb3J0YW50OiB0aGlzIGhhcHBlbnMgcHJpb3IgdG8gcmVjZWl2aW5nIHRoZSBjdXJyZW50IGF4ZmVyIG9mIHBvb2wgdG9rZW5zCiAgICAvLyBwb29sX2JhbGFuY2UgPSBzZWxmLl9jdXJyZW50X3Bvb2xfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X3Bvb2xfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4OAogICAgLy8gc3VwcGx5PXNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE4Ni0xOTAKICAgIC8vIGFfYW10ID0gdG9rZW5zX3RvX2J1cm4oCiAgICAvLyAgICAgcG9vbF9iYWxhbmNlPXBvb2xfYmFsYW5jZSwKICAgIC8vICAgICBzdXBwbHk9c2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKSwKICAgIC8vICAgICBhbW91bnQ9cG9vbF94ZmVyLmFzc2V0X2Ftb3VudCwKICAgIC8vICkKICAgIGRpZyAxCiAgICBzd2FwCiAgICBkaWcgMwogICAgY2FsbHN1YiB0b2tlbnNfdG9fYnVybgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE5MwogICAgLy8gc3VwcGx5PXNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCksCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjE5MS0xOTUKICAgIC8vIGJfYW10ID0gdG9rZW5zX3RvX2J1cm4oCiAgICAvLyAgICAgcG9vbF9iYWxhbmNlPXBvb2xfYmFsYW5jZSwKICAgIC8vICAgICBzdXBwbHk9c2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKSwKICAgIC8vICAgICBhbW91bnQ9cG9vbF94ZmVyLmFzc2V0X2Ftb3VudCwKICAgIC8vICkKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgdW5jb3ZlciAzCiAgICBjYWxsc3ViIHRva2Vuc190b19idXJuCiAgICAvLyBhbW0vY29udHJhY3QucHk6MTk3LTE5OAogICAgLy8gIyBTZW5kIGJhY2sgY29tbWVuc3VyYXRlIGFtdCBvZiBhCiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1zZWxmLmFzc2V0X2EsIGFtb3VudD1hX2FtdCkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhc3NldF9hIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZG9fYXNzZXRfdHJhbnNmZXIKICAgIC8vIGFtbS9jb250cmFjdC5weToyMDAtMjAxCiAgICAvLyAjIFNlbmQgYmFjayBjb21tZW5zdXJhdGUgYW10IG9mIGIKICAgIC8vIGRvX2Fzc2V0X3RyYW5zZmVyKHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFzc2V0PXNlbGYuYXNzZXRfYiwgYW1vdW50PWJfYW10KQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwMgogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19idXJuKHBvb2xfYmFsYW5jZTogdWludDY0LCBzdXBwbHk6IHVpbnQ2NCwgYW1vdW50OiB1aW50NjQpIC0+IHVpbnQ2NDoKdG9rZW5zX3RvX2J1cm46CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzQzLTM0NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0b2tlbnNfdG9fYnVybigqLCBwb29sX2JhbGFuY2U6IFVJbnQ2NCwgc3VwcGx5OiBVSW50NjQsIGFtb3VudDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIC8vIGFtbS9jb250cmFjdC5weTozNDUKICAgIC8vIGlzc3VlZCA9IFRPVEFMX1NVUFBMWSAtIHBvb2xfYmFsYW5jZSAtIGFtb3VudAogICAgaW50YyA0IC8vIDEwMDAwMDAwMDAwCiAgICBmcmFtZV9kaWcgLTMKICAgIC0KICAgIGZyYW1lX2RpZyAtMQogICAgLQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0NgogICAgLy8gcmV0dXJuIHN1cHBseSAqIGFtb3VudCAvLyBpc3N1ZWQKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICAqCiAgICBzd2FwCiAgICAvCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLnN3YXAoc3dhcF94ZmVyOiB1aW50NjQsIGFfYXNzZXQ6IHVpbnQ2NCwgYl9hc3NldDogdWludDY0KSAtPiB2b2lkOgpzd2FwOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIwNC0yMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYV9hc3NldCI6ICJhc3NldF9hIiwKICAgIC8vICAgICAgICAgImJfYXNzZXQiOiAiYXNzZXRfYiIsCiAgICAvLyAgICAgfSwKICAgIC8vICkKICAgIC8vIGRlZiBzd2FwKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgc3dhcF94ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICAgICBhX2Fzc2V0OiBBc3NldCwKICAgIC8vICAgICBiX2Fzc2V0OiBBc3NldCwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXAKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjMKICAgIC8vIHNlbGYuX2NoZWNrX2Jvb3RzdHJhcHBlZCgpCiAgICBjYWxsc3ViIF9jaGVja19ib290c3RyYXBwZWQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMjUKICAgIC8vIGFzc2VydCBhX2Fzc2V0ID09IHNlbGYuYXNzZXRfYSwgImFzc2V0IGEgaW5jb3JyZWN0IgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgPT0KICAgIGFzc2VydCAvLyBhc3NldCBhIGluY29ycmVjdAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyNgogICAgLy8gYXNzZXJ0IGJfYXNzZXQgPT0gc2VsZi5hc3NldF9iLCAiYXNzZXQgYiBpbmNvcnJlY3QiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc3NldF9iIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgYXNzZXJ0IC8vIGFzc2V0IGIgaW5jb3JyZWN0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjI4CiAgICAvLyBhc3NlcnQgc3dhcF94ZmVyLmFzc2V0X2Ftb3VudCA+IDAsICJhbW91bnQgbWluaW11bSBub3QgbWV0IgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBc3NldEFtb3VudAogICAgZHVwCiAgICBhc3NlcnQgLy8gYW1vdW50IG1pbmltdW0gbm90IG1ldAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIyOQogICAgLy8gYXNzZXJ0IHN3YXBfeGZlci5zZW5kZXIgPT0gVHhuLnNlbmRlciwgInNlbmRlciBpbnZhbGlkIgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBTZW5kZXIKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gc2VuZGVyIGludmFsaWQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzIKICAgIC8vIGNhc2Ugc2VsZi5hc3NldF9hOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImFzc2V0X2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYSBleGlzdHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzYKICAgIC8vIGNhc2Ugc2VsZi5hc3NldF9iOgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gImFzc2V0X2IiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNzZXRfYiBleGlzdHMKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzEKICAgIC8vIG1hdGNoIHN3YXBfeGZlci54ZmVyX2Fzc2V0OgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBYZmVyQXNzZXQKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzEtMjQxCiAgICAvLyBtYXRjaCBzd2FwX3hmZXIueGZlcl9hc3NldDoKICAgIC8vICAgICBjYXNlIHNlbGYuYXNzZXRfYToKICAgIC8vICAgICAgICAgaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2EKICAgIC8vICAgICBjYXNlIHNlbGYuYXNzZXRfYjoKICAgIC8vICAgICAgICAgaW5fc3VwcGx5ID0gc2VsZi5fY3VycmVudF9hX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfc3VwcGx5ID0gc2VsZi5fY3VycmVudF9iX2JhbGFuY2UoKQogICAgLy8gICAgICAgICBvdXRfYXNzZXQgPSBzZWxmLmFzc2V0X2IKICAgIC8vICAgICBjYXNlIF86CiAgICAvLyAgICAgICAgIGFzc2VydCBGYWxzZSwgImFzc2V0IGlkIGluY29ycmVjdCIKICAgIG1hdGNoIHN3YXBfc3dpdGNoX2Nhc2VfMEAxIHN3YXBfc3dpdGNoX2Nhc2VfMUAyCiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQxCiAgICAvLyBhc3NlcnQgRmFsc2UsICJhc3NldCBpZCBpbmNvcnJlY3QiCiAgICBlcnIgLy8gYXNzZXQgaWQgaW5jb3JyZWN0Cgpzd2FwX3N3aXRjaF9jYXNlXzBAMToKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzMKICAgIC8vIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYl9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYl9iYWxhbmNlCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzQKICAgIC8vIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2FfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2FfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzNQogICAgLy8gb3V0X2Fzc2V0ID0gc2VsZi5hc3NldF9hCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2EgZXhpc3RzCiAgICBiIHN3YXBfc3dpdGNoX2Nhc2VfbmV4dEA0Cgpzd2FwX3N3aXRjaF9jYXNlXzFAMjoKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzcKICAgIC8vIGluX3N1cHBseSA9IHNlbGYuX2N1cnJlbnRfYV9iYWxhbmNlKCkKICAgIGNhbGxzdWIgX2N1cnJlbnRfYV9iYWxhbmNlCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGFtbS9jb250cmFjdC5weToyMzgKICAgIC8vIG91dF9zdXBwbHkgPSBzZWxmLl9jdXJyZW50X2JfYmFsYW5jZSgpCiAgICBjYWxsc3ViIF9jdXJyZW50X2JfYmFsYW5jZQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjIzOQogICAgLy8gb3V0X2Fzc2V0ID0gc2VsZi5hc3NldF9iCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNzZXRfYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBmcmFtZV9idXJ5IDEKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzc2V0X2IgZXhpc3RzCgpzd2FwX3N3aXRjaF9jYXNlX25leHRANDoKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDMtMjQ1CiAgICAvLyB0b19zd2FwID0gdG9rZW5zX3RvX3N3YXAoCiAgICAvLyAgICAgaW5fYW1vdW50PXN3YXBfeGZlci5hc3NldF9hbW91bnQsIGluX3N1cHBseT1pbl9zdXBwbHksIG91dF9zdXBwbHk9b3V0X3N1cHBseQogICAgLy8gKQogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyAwCiAgICB1bmNvdmVyIDIKICAgIGNhbGxzdWIgdG9rZW5zX3RvX3N3YXAKICAgIC8vIGFtbS9jb250cmFjdC5weToyNDYKICAgIC8vIGFzc2VydCB0b19zd2FwID4gMCwgInNlbmQgYW1vdW50IHRvbyBsb3ciCiAgICBkdXAKICAgIGFzc2VydCAvLyBzZW5kIGFtb3VudCB0b28gbG93CiAgICAvLyBhbW0vY29udHJhY3QucHk6MjQ4CiAgICAvLyBkb19hc3NldF90cmFuc2ZlcihyZWNlaXZlcj1UeG4uc2VuZGVyLCBhc3NldD1vdXRfYXNzZXQsIGFtb3VudD10b19zd2FwKQogICAgdHhuIFNlbmRlcgogICAgZnJhbWVfZGlnIDEKICAgIHVuY292ZXIgMgogICAgY2FsbHN1YiBkb19hc3NldF90cmFuc2ZlcgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjI0OQogICAgLy8gc2VsZi5fdXBkYXRlX3JhdGlvKCkKICAgIGNhbGxzdWIgX3VwZGF0ZV9yYXRpbwogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYW1tLmNvbnRyYWN0LnRva2Vuc190b19zd2FwKGluX2Ftb3VudDogdWludDY0LCBpbl9zdXBwbHk6IHVpbnQ2NCwgb3V0X3N1cHBseTogdWludDY0KSAtPiB1aW50NjQ6CnRva2Vuc190b19zd2FwOgogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0OS0zNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdG9rZW5zX3RvX3N3YXAoKiwgaW5fYW1vdW50OiBVSW50NjQsIGluX3N1cHBseTogVUludDY0LCBvdXRfc3VwcGx5OiBVSW50NjQpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM1MQogICAgLy8gaW5fdG90YWwgPSBTQ0FMRSAqIChpbl9zdXBwbHkgLSBpbl9hbW91bnQpICsgKGluX2Ftb3VudCAqIEZBQ1RPUikKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0zCiAgICAtCiAgICBpbnRjXzIgLy8gMTAwMAogICAgKgogICAgZnJhbWVfZGlnIC0zCiAgICBwdXNoaW50IDk5NSAvLyA5OTUKICAgICoKICAgIHN3YXAKICAgIGRpZyAxCiAgICArCiAgICAvLyBhbW0vY29udHJhY3QucHk6MzUyCiAgICAvLyBvdXRfdG90YWwgPSBpbl9hbW91bnQgKiBGQUNUT1IgKiBvdXRfc3VwcGx5CiAgICBzd2FwCiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIC8vIGFtbS9jb250cmFjdC5weTozNTMKICAgIC8vIHJldHVybiBvdXRfdG90YWwgLy8gaW5fdG90YWwKICAgIHN3YXAKICAgIC8KICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmFtbS5jb250cmFjdC5Db25zdGFudFByb2R1Y3RBTU0uX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGFtbS9jb250cmFjdC5weToyOAogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFtbS9jb250cmFjdC5weTozMi0zMwogICAgLy8gIyBUaGUgYXNzZXQgaWQgb2YgYXNzZXQgQQogICAgLy8gc2VsZi5hc3NldF9hID0gQXNzZXQoKQogICAgYnl0ZWNfMCAvLyAiYXNzZXRfYSIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjM0LTM1CiAgICAvLyAjIFRoZSBhc3NldCBpZCBvZiBhc3NldCBCCiAgICAvLyBzZWxmLmFzc2V0X2IgPSBBc3NldCgpCiAgICBieXRlY18xIC8vICJhc3NldF9iIgogICAgaW50Y18wIC8vIDAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzYtMzcKICAgIC8vICMgVGhlIGN1cnJlbnQgZ292ZXJub3Igb2YgdGhpcyBjb250cmFjdCwgYWxsb3dlZCB0byBkbyBhZG1pbiB0eXBlIGFjdGlvbnMKICAgIC8vIHNlbGYuZ292ZXJub3IgPSBUeG4uc2VuZGVyCiAgICBieXRlY18zIC8vICJnb3Zlcm5vciIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhbW0vY29udHJhY3QucHk6MzgtMzkKICAgIC8vICMgVGhlIGFzc2V0IGlkIG9mIHRoZSBQb29sIFRva2VuLCB1c2VkIHRvIHRyYWNrIHNoYXJlIG9mIHBvb2wgdGhlIGhvbGRlciBtYXkgcmVjb3ZlcgogICAgLy8gc2VsZi5wb29sX3Rva2VuID0gQXNzZXQoKQogICAgYnl0ZWNfMiAvLyAicG9vbF90b2tlbiIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYW1tL2NvbnRyYWN0LnB5OjQwLTQxCiAgICAvLyAjIFRoZSByYXRpbyBiZXR3ZWVuIGFzc2V0cyAoQSpTY2FsZS9CKQogICAgLy8gc2VsZi5yYXRpbyA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNCAvLyAicmF0aW8iCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hbW0uY29udHJhY3QuQ29uc3RhbnRQcm9kdWN0QU1NLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAFAAHoBwSAyK+gJSYFB2Fzc2V0X2EHYXNzZXRfYgpwb29sX3Rva2VuCGdvdmVybm9yBXJhdGlvMRhAAAOIA/iIAAFDigABMRtBAOeCBQQIqVb3BGtZ2WUEXL8eLQQUNsKsBEqI4FU2GgCOBQACABQAQABzAJsiiTEZFEQxGEQ2GgEXwByIALgjiTEZFEQxGEQxFiMJSTgQIxJENhoBF8AwNhoCF8AwiACtFoAEFR98dUxQsCOJMRkURDEYRDEWgQIJSTgQJRJEMRYjCUk4ECUSRDYaARfAMDYaAhfAMDYaAxfAMIgBISOJMRkURDEYRDEWIwlJOBAlEkQ2GgEXwDA2GgIXwDA2GgMXwDCIAhcjiTEZFEQxGEQxFiMJSTgQJRJENhoBF8AwNhoCF8AwiAJ5I4kxGUAABjEYFEQjiSKJigEAiAAFK4v/Z4mKAAAxACIrZUQSRImKAwEiKmVEFESI/+gyBIECEkSL/TgHMgoSRIv9OAiB4KcSD0SL/ov/DEQoi/5nKYv/Z4gAFipMZyIoZUSIAE4iKWVEiABHIiplRImKAAGxIihlRHEDRIAERFBULUxQgAEtUCIpZURxA0RQMgpJsiqyKYEDsiMhBLIigANkYnSyJbImgQOyECKyAbO0PImKAQAyCov/IogAAYmKAwCxi/2yFIv/shKL/rIRJbIQIrIBs4mKBQCIAHkiKmVEi/0SRCIoZUSL/hJEIillRIv/EkSL+zgAMQASRIv8OAAxABJEi/s4FDIKEkSL+zgRIihlRBJEi/s4EklEi/w4FDIKEkSL/DgRIillRBJEi/w4EklEiAAniAAxiAA7TwRPBIgAQUlEMQAiKmVETwKI/22IAI2JigAAIiplRESJigABMgoiKmVEcABEiYoAATIKIihlRHAARImKAAEyCiIpZURwAESJigUBgABJi/yL/hJBAAyL/Yv/EkEABCNCAAEiQQALi/6L/wuSJAmMAIkhBIv7CSSL/guL/Iv+CQpJjAAki/8Li/2L/wkKSYwBDEEACIsACyQKjACJiwELJAqMAImKAACI/4SI/45MJAtMCicETGeJigQAiP9bIiplRIv9EkQiKGVEi/4SRCIpZUSL/xJEi/w4FDIKEkSL/DgSSUSL/DgRIiplRBJEi/w4ADEAEkSI/ymI/zNLAUxLA4gAJYj/NU8CTE8DiAAaMQAiKGVETwOI/mgxACIpZURPAoj+XYj/fYmKAwEhBIv9CYv/CYv+i/8LTAqJigMAgABJiP7UIihlRIv+EkQiKWVEi/8SRIv9OBJJRIv9OAAxABJEIihlRCIpZUSL/TgRjgIAAQATAIj+w4wAiP6xIihlTIwBREIAD4j+pIwAiP6sIillTIwBRIsCiwBPAogAD0lEMQCLAU8CiP3XiP73iYoDAYv+i/0JJAuL/YHjBwtMSwEITIv/C0wKiYoAACgiZykiZysxAGcqImcnBCJniQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/examples/amm/puya.log b/examples/amm/puya.log index f75ebb7e3c..682ce7f060 100644 --- a/examples/amm/puya.log +++ b/examples/amm/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['amm'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['amm'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing amm/out/module.awst debug: Sealing block@0: // L12 @@ -1962,6 +1962,7 @@ debug: examples.amm.contract.tokens_to_mint f-stack on first store: [] debug: examples.amm.contract.ConstantProductAMM.swap f-stack entry: ['in_supply#0', 'out_asset#0'] debug: examples.amm.contract.ConstantProductAMM.swap f-stack on first store: ['tmp%2#0'] info: Writing amm/out/ConstantProductAMM.arc32.json +info: Writing amm/out/ConstantProductAMM.arc56.json info: Writing amm/out/ConstantProductAMM.approval.teal info: Writing amm/out/ConstantProductAMM.clear.teal info: Writing amm/out/ConstantProductAMM.approval.bin diff --git a/examples/arc_28/out/EventEmitter.approval.mir b/examples/arc_28/out/EventEmitter.approval.mir index 4274f22d63..63bbda1108 100644 --- a/examples/arc_28/out/EventEmitter.approval.mir +++ b/examples/arc_28/out/EventEmitter.approval.mir @@ -107,16 +107,16 @@ emit_swapped_block@0: ( concat (𝕡) a#0,b#0 | encoded_tuple_buffer%2#0 method Swapped(uint64,uint64) (𝕡) a#0,b#0 | encoded_tuple_buffer%2#0,Method(Swapped(uint64,uint64)) l-load encoded_tuple_buffer%2#0 1 (𝕡) a#0,b#0 | Method(Swapped(uint64,uint64)),encoded_tuple_buffer%2#0 - concat (𝕡) a#0,b#0 | tmp%0#0 - l-load-copy tmp%0#0 0 (𝕡) a#0,b#0 | tmp%0#0,tmp%0#0 (copy) - log (𝕡) a#0,b#0 | tmp%0#0 + concat (𝕡) a#0,b#0 | event%0#0 + l-load-copy event%0#0 0 (𝕡) a#0,b#0 | event%0#0,event%0#0 (copy) + log (𝕡) a#0,b#0 | event%0#0 // arc_28/contract.py:15 // arc4.emit("Swapped(uint64,uint64)", b, a) - l-load-copy tmp%0#0 0 (𝕡) a#0,b#0 | tmp%0#0,tmp%0#0 (copy) - log (𝕡) a#0,b#0 | tmp%0#0 + l-load-copy event%0#0 0 (𝕡) a#0,b#0 | event%0#0,event%0#0 (copy) + log (𝕡) a#0,b#0 | event%0#0 // arc_28/contract.py:16 // arc4.emit("Swapped", b, a) - l-load tmp%0#0 0 (𝕡) a#0,b#0 | tmp%0#0 + l-load event%0#0 0 (𝕡) a#0,b#0 | event%0#0 log (𝕡) a#0,b#0 | retsub @@ -140,7 +140,7 @@ emit_ufixed_block@0: ( concat (𝕡) a#0,b#0 | encoded_tuple_buffer%2#0 method AnEvent(ufixed256x16,ufixed64x2) (𝕡) a#0,b#0 | encoded_tuple_buffer%2#0,Method(AnEvent(ufixed256x16,ufixed64x2)) l-load encoded_tuple_buffer%2#0 1 (𝕡) a#0,b#0 | Method(AnEvent(ufixed256x16,ufixed64x2)),encoded_tuple_buffer%2#0 - concat (𝕡) a#0,b#0 | tmp%0#0 + concat (𝕡) a#0,b#0 | event%0#0 log (𝕡) a#0,b#0 | retsub diff --git a/examples/arc_28/out/EventEmitter.arc56.json b/examples/arc_28/out/EventEmitter.arc56.json new file mode 100644 index 0000000000..c17764ebfd --- /dev/null +++ b/examples/arc_28/out/EventEmitter.arc56.json @@ -0,0 +1,219 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "EventEmitter", + "structs": {}, + "methods": [ + { + "name": "emit_swapped", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [ + { + "name": "Swapped", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ] + }, + { + "name": "Swapped", + "args": [ + { + "type": "uint64", + "name": "field1" + }, + { + "type": "uint64", + "name": "field2" + } + ] + } + ], + "recommendations": {} + }, + { + "name": "emit_ufixed", + "args": [ + { + "type": "ufixed256x16", + "name": "a" + }, + { + "type": "ufixed64x2", + "name": "b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [ + { + "name": "AnEvent", + "args": [ + { + "type": "ufixed256x16", + "name": "field1" + }, + { + "type": "ufixed64x2", + "name": "field2" + } + ] + } + ], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [ + { + "name": "Swapped", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ] + }, + { + "name": "Swapped", + "args": [ + { + "type": "uint64", + "name": "field1" + }, + { + "type": "uint64", + "name": "field2" + } + ] + }, + { + "name": "AnEvent", + "args": [ + { + "type": "ufixed256x16", + "name": "field1" + }, + { + "type": "ufixed64x2", + "name": "field2" + } + ] + } + ], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 43, + 61 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 84 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 46, + 64 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDBhOTU0MmNkIDB4NzFhMzE1MWYgLy8gbWV0aG9kICJlbWl0X3N3YXBwZWQodWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJlbWl0X3VmaXhlZCh1Zml4ZWQyNTZ4MTYsdWZpeGVkNjR4Mil2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF91Zml4ZWRfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF9zd2FwcGVkX3JvdXRlQDI6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBFdmVudEVtaXR0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGVtaXRfc3dhcHBlZAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZW1pdF91Zml4ZWRfcm91dGVAMzoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGVtaXRfdWZpeGVkCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgRXZlbnRFbWl0dGVyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXJjXzI4LmNvbnRyYWN0LkV2ZW50RW1pdHRlci5lbWl0X3N3YXBwZWQoYTogYnl0ZXMsIGI6IGJ5dGVzKSAtPiB2b2lkOgplbWl0X3N3YXBwZWQ6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTItMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGVtaXRfc3dhcHBlZChzZWxmLCBhOiBhcmM0LlVJbnQ2NCwgYjogYXJjNC5VSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIGFyY18yOC9jb250cmFjdC5weToxNAogICAgLy8gYXJjNC5lbWl0KFN3YXBwZWQoYiwgYSkpCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgxY2NiZDkyNSAvLyBtZXRob2QgIlN3YXBwZWQodWludDY0LHVpbnQ2NCkiCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTUKICAgIC8vIGFyYzQuZW1pdCgiU3dhcHBlZCh1aW50NjQsdWludDY0KSIsIGIsIGEpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjXzI4L2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhcmM0LmVtaXQoIlN3YXBwZWQiLCBiLCBhKQogICAgbG9nCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmVtaXRfdWZpeGVkKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gdm9pZDoKZW1pdF91Zml4ZWQ6CiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MTgtMjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZW1pdF91Zml4ZWQoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBhOiBhcmM0LkJpZ1VGaXhlZE54TVt0eXBpbmcuTGl0ZXJhbFsyNTZdLCB0eXBpbmcuTGl0ZXJhbFsxNl1dLAogICAgLy8gICAgIGI6IGFyYzQuVUZpeGVkTnhNW3R5cGluZy5MaXRlcmFsWzY0XSwgdHlwaW5nLkxpdGVyYWxbMl1dLAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBhcmNfMjgvY29udHJhY3QucHk6MjQKICAgIC8vIGFyYzQuZW1pdCgiQW5FdmVudCh1Zml4ZWQyNTZ4MTYsdWZpeGVkNjR4MikiLCBhLCBiKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4NzM4OWIxYmEgLy8gbWV0aG9kICJBbkV2ZW50KHVmaXhlZDI1NngxNix1Zml4ZWQ2NHgyKSIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hcmNfMjguY29udHJhY3QuRXZlbnRFbWl0dGVyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAQCIAAFDigABMRtBADuCAgQKlULNBHGjFR82GgCOAgACABQjiTEZFEQxGEQ2GgE2GgKIACEiiTEZFEQxGEQ2GgE2GgKIACUiiTEZQAAGMRgURCKJI4mKAgCL/4v+UIAEHMvZJUxQSbBJsLCJigIAi/6L/1CABHOJsbpMULCJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/examples/arc_28/out/EventEmitter.destructured.ir b/examples/arc_28/out/EventEmitter.destructured.ir index 78f46ee11d..0f4bcc536e 100644 --- a/examples/arc_28/out/EventEmitter.destructured.ir +++ b/examples/arc_28/out/EventEmitter.destructured.ir @@ -46,17 +46,17 @@ contract examples.arc_28.contract.EventEmitter: subroutine examples.arc_28.contract.EventEmitter.emit_swapped(a: bytes, b: bytes) -> void: block@0: // L12 let encoded_tuple_buffer%2#0: bytes = (concat b#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) - (log tmp%0#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) + (log event%0#0) + (log event%0#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: block@0: // L18 let encoded_tuple_buffer%2#0: bytes = (concat a#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return program clear-state: diff --git a/examples/arc_28/out/EventEmitter.ssa.ir b/examples/arc_28/out/EventEmitter.ssa.ir index e7563fd07f..39ef432e55 100644 --- a/examples/arc_28/out/EventEmitter.ssa.ir +++ b/examples/arc_28/out/EventEmitter.ssa.ir @@ -61,20 +61,20 @@ contract examples.arc_28.contract.EventEmitter: let encoded_tuple_buffer%0#0: bytes = 0x let encoded_tuple_buffer%1#0: bytes = (concat encoded_tuple_buffer%0#0 b#0) let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) let current_tail_offset%1#0: uint64 = 16u let encoded_tuple_buffer%3#0: bytes = 0x let encoded_tuple_buffer%4#0: bytes = (concat encoded_tuple_buffer%3#0 b#0) let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 a#0) - let tmp%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) - (log tmp%1#0) + let event%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) + (log event%1#0) let current_tail_offset%2#0: uint64 = 16u let encoded_tuple_buffer%6#0: bytes = 0x let encoded_tuple_buffer%7#0: bytes = (concat encoded_tuple_buffer%6#0 b#0) let encoded_tuple_buffer%8#0: bytes = (concat encoded_tuple_buffer%7#0 a#0) - let tmp%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) - (log tmp%2#0) + let event%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) + (log event%2#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: @@ -83,8 +83,8 @@ contract examples.arc_28.contract.EventEmitter: let encoded_tuple_buffer%0#0: bytes = 0x let encoded_tuple_buffer%1#0: bytes = (concat encoded_tuple_buffer%0#0 a#0) let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return subroutine examples.arc_28.contract.EventEmitter.__algopy_default_create() -> void: diff --git a/examples/arc_28/out/EventEmitter.ssa.opt_pass_1.ir b/examples/arc_28/out/EventEmitter.ssa.opt_pass_1.ir index 96159c6b02..fc9973ea1a 100644 --- a/examples/arc_28/out/EventEmitter.ssa.opt_pass_1.ir +++ b/examples/arc_28/out/EventEmitter.ssa.opt_pass_1.ir @@ -47,24 +47,24 @@ contract examples.arc_28.contract.EventEmitter: block@0: // L12 let encoded_tuple_buffer%1#0: bytes = b#0 let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) let encoded_tuple_buffer%4#0: bytes = b#0 let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 a#0) - let tmp%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) - (log tmp%1#0) + let event%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) + (log event%1#0) let encoded_tuple_buffer%7#0: bytes = b#0 let encoded_tuple_buffer%8#0: bytes = (concat encoded_tuple_buffer%7#0 a#0) - let tmp%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) - (log tmp%2#0) + let event%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) + (log event%2#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: block@0: // L18 let encoded_tuple_buffer%1#0: bytes = a#0 let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return program clear-state: diff --git a/examples/arc_28/out/EventEmitter.ssa.opt_pass_2.ir b/examples/arc_28/out/EventEmitter.ssa.opt_pass_2.ir index 78f46ee11d..0f4bcc536e 100644 --- a/examples/arc_28/out/EventEmitter.ssa.opt_pass_2.ir +++ b/examples/arc_28/out/EventEmitter.ssa.opt_pass_2.ir @@ -46,17 +46,17 @@ contract examples.arc_28.contract.EventEmitter: subroutine examples.arc_28.contract.EventEmitter.emit_swapped(a: bytes, b: bytes) -> void: block@0: // L12 let encoded_tuple_buffer%2#0: bytes = (concat b#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) - (log tmp%0#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) + (log event%0#0) + (log event%0#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: block@0: // L18 let encoded_tuple_buffer%2#0: bytes = (concat a#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return program clear-state: diff --git a/examples/arc_28/out/module.awst b/examples/arc_28/out/module.awst index 0051446976..eb1abee1c2 100644 --- a/examples/arc_28/out/module.awst +++ b/examples/arc_28/out/module.awst @@ -6,13 +6,13 @@ contract EventEmitter extends (algopy.arc4.ARC4Contract) abimethod emit_swapped(a: arc4.uint64, b: arc4.uint64): void { - log(concat(Method("Swapped(uint64,uint64)"), new examples.arc_28.contract.Swapped(a=b, b=a))) - log(concat(Method("Swapped(uint64,uint64)"), arc4_encode((b, a), arc4.tuple))) - log(concat(Method("Swapped(uint64,uint64)"), arc4_encode((b, a), arc4.tuple))) + emit('Swapped(uint64,uint64)', new examples.arc_28.contract.Swapped(a=b, b=a)) + emit('Swapped(uint64,uint64)', new Swapped(field1=b, field2=a)) + emit('Swapped(uint64,uint64)', new Swapped(field1=b, field2=a)) } abimethod emit_ufixed(a: arc4.ufixed256x16, b: arc4.ufixed64x2): void { - log(concat(Method("AnEvent(ufixed256x16,ufixed64x2)"), arc4_encode((a, b), arc4.tuple))) + emit('AnEvent(ufixed256x16,ufixed64x2)', new AnEvent(field1=a, field2=b)) } } \ No newline at end of file diff --git a/examples/arc_28/out_O2/EventEmitter.destructured.ir b/examples/arc_28/out_O2/EventEmitter.destructured.ir index 78f46ee11d..0f4bcc536e 100644 --- a/examples/arc_28/out_O2/EventEmitter.destructured.ir +++ b/examples/arc_28/out_O2/EventEmitter.destructured.ir @@ -46,17 +46,17 @@ contract examples.arc_28.contract.EventEmitter: subroutine examples.arc_28.contract.EventEmitter.emit_swapped(a: bytes, b: bytes) -> void: block@0: // L12 let encoded_tuple_buffer%2#0: bytes = (concat b#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) - (log tmp%0#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) + (log event%0#0) + (log event%0#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: block@0: // L18 let encoded_tuple_buffer%2#0: bytes = (concat a#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return program clear-state: diff --git a/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir b/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir index 027ba867d2..c65cfeac65 100644 --- a/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir +++ b/examples/arc_28/out_unoptimized/EventEmitter.destructured.ir @@ -59,24 +59,24 @@ contract examples.arc_28.contract.EventEmitter: block@0: // L12 let encoded_tuple_buffer%1#0: bytes = (concat 0x b#0) let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 a#0) - let tmp%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) + (log event%0#0) let encoded_tuple_buffer%4#0: bytes = (concat 0x b#0) let encoded_tuple_buffer%5#0: bytes = (concat encoded_tuple_buffer%4#0 a#0) - let tmp%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) - (log tmp%1#0) + let event%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%5#0) + (log event%1#0) let encoded_tuple_buffer%7#0: bytes = (concat 0x b#0) let encoded_tuple_buffer%8#0: bytes = (concat encoded_tuple_buffer%7#0 a#0) - let tmp%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) - (log tmp%2#0) + let event%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%8#0) + (log event%2#0) return subroutine examples.arc_28.contract.EventEmitter.emit_ufixed(a: bytes, b: bytes) -> void: block@0: // L18 let encoded_tuple_buffer%1#0: bytes = (concat 0x a#0) let encoded_tuple_buffer%2#0: bytes = (concat encoded_tuple_buffer%1#0 b#0) - let tmp%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) - (log tmp%0#0) + let event%0#0: bytes = (concat method "AnEvent(ufixed256x16,ufixed64x2)" encoded_tuple_buffer%2#0) + (log event%0#0) return subroutine examples.arc_28.contract.EventEmitter.__algopy_default_create() -> void: diff --git a/examples/arc_28/puya.log b/examples/arc_28/puya.log index efa3f4d8e7..f5025eb4fc 100644 --- a/examples/arc_28/puya.log +++ b/examples/arc_28/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc_28'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc_28'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing arc_28/out/module.awst debug: Sealing block@0: // L12 @@ -551,10 +551,10 @@ debug: Replacing redundant declaration let encoded_tuple_buffer%5#0: bytes = (co debug: Replacing redundant declaration let encoded_tuple_buffer%8#0: bytes = (concat b#0 a#0) with copy of existing registers (Register(source_location=arc_28/contract.py:14:18-31, ir_type=bytes, name='encoded_tuple_buffer%2', version=0),) debug: Found equivalence set: encoded_tuple_buffer%2#0, encoded_tuple_buffer%5#0, encoded_tuple_buffer%8#0 debug: Replacing {encoded_tuple_buffer%5#0, encoded_tuple_buffer%8#0} with encoded_tuple_buffer%2#0 made 2 modifications -debug: Replacing redundant declaration let tmp%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) with copy of existing registers (Register(source_location=arc_28/contract.py:14:8-32, ir_type=bytes, name='tmp%0', version=0),) -debug: Replacing redundant declaration let tmp%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) with copy of existing registers (Register(source_location=arc_28/contract.py:14:8-32, ir_type=bytes, name='tmp%0', version=0),) -debug: Found equivalence set: tmp%0#0, tmp%1#0, tmp%2#0 -debug: Replacing {tmp%1#0, tmp%2#0} with tmp%0#0 made 2 modifications +debug: Replacing redundant declaration let event%1#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) with copy of existing registers (Register(source_location=arc_28/contract.py:14:8-32, ir_type=bytes, name='event%0', version=0),) +debug: Replacing redundant declaration let event%2#0: bytes = (concat method "Swapped(uint64,uint64)" encoded_tuple_buffer%2#0) with copy of existing registers (Register(source_location=arc_28/contract.py:14:8-32, ir_type=bytes, name='event%0', version=0),) +debug: Found equivalence set: event%0#0, event%1#0, event%2#0 +debug: Replacing {event%1#0, event%2#0} with event%0#0 made 2 modifications debug: Optimizer: Remove Calls To No Op Subroutines debug: Optimizing subroutine examples.arc_28.contract.EventEmitter.emit_ufixed debug: Optimizer: Constant Replacer @@ -706,20 +706,21 @@ debug: Inserted __puya_arc4_router_____algopy_default_create@7.ops[1]: 'l-store- debug: Replaced __puya_arc4_router_____algopy_default_create@7.ops[3]: 'v-load tmp%16#0' with 'l-load tmp%16#0' debug: Inserted __puya_arc4_router_____algopy_default_create@7.ops[5]: 'l-store-copy tmp%17#0 0' debug: Replaced __puya_arc4_router_____algopy_default_create@7.ops[7]: 'v-load tmp%17#0' with 'l-load tmp%17#0' -debug: Inserted emit_swapped_block@0.ops[7]: 'l-store-copy tmp%0#0 0' -debug: Replaced emit_swapped_block@0.ops[9]: 'v-load tmp%0#0' with 'l-load tmp%0#0' +debug: Inserted emit_swapped_block@0.ops[7]: 'l-store-copy event%0#0 0' +debug: Replaced emit_swapped_block@0.ops[9]: 'v-load event%0#0' with 'l-load event%0#0' debug: Inserted emit_swapped_block@0.ops[3]: 'l-store-copy encoded_tuple_buffer%2#0 0' debug: Replaced emit_swapped_block@0.ops[6]: 'v-load encoded_tuple_buffer%2#0' with 'l-load encoded_tuple_buffer%2#0' -debug: Inserted emit_swapped_block@0.ops[11]: 'l-store-copy tmp%0#0 0' -debug: Replaced emit_swapped_block@0.ops[13]: 'v-load tmp%0#0' with 'l-load tmp%0#0' -debug: Inserted emit_swapped_block@0.ops[14]: 'l-store-copy tmp%0#0 0' -debug: Replaced emit_swapped_block@0.ops[16]: 'v-load tmp%0#0' with 'l-load tmp%0#0' -debug: Inserted emit_ufixed_block@0.ops[7]: 'l-store-copy tmp%0#0 0' -debug: Replaced emit_ufixed_block@0.ops[9]: 'v-load tmp%0#0' with 'l-load tmp%0#0' +debug: Inserted emit_swapped_block@0.ops[11]: 'l-store-copy event%0#0 0' +debug: Replaced emit_swapped_block@0.ops[13]: 'v-load event%0#0' with 'l-load event%0#0' +debug: Inserted emit_swapped_block@0.ops[14]: 'l-store-copy event%0#0 0' +debug: Replaced emit_swapped_block@0.ops[16]: 'v-load event%0#0' with 'l-load event%0#0' +debug: Inserted emit_ufixed_block@0.ops[7]: 'l-store-copy event%0#0 0' +debug: Replaced emit_ufixed_block@0.ops[9]: 'v-load event%0#0' with 'l-load event%0#0' debug: Inserted emit_ufixed_block@0.ops[3]: 'l-store-copy encoded_tuple_buffer%2#0 0' debug: Replaced emit_ufixed_block@0.ops[6]: 'v-load encoded_tuple_buffer%2#0' with 'l-load encoded_tuple_buffer%2#0' debug: Found 3 edge set/s for examples.arc_28.contract.EventEmitter.__puya_arc4_router__ info: Writing arc_28/out/EventEmitter.arc32.json +info: Writing arc_28/out/EventEmitter.arc56.json info: Writing arc_28/out/EventEmitter.approval.teal info: Writing arc_28/out/EventEmitter.clear.teal info: Writing arc_28/out/EventEmitter.approval.bin diff --git a/examples/auction/out/Auction.arc56.json b/examples/auction/out/Auction.arc56.json new file mode 100644 index 0000000000..00ad153d70 --- /dev/null +++ b/examples/auction/out/Auction.arc56.json @@ -0,0 +1,360 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Auction", + "structs": {}, + "methods": [ + { + "name": "opt_into_asset", + "args": [ + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "start_auction", + "args": [ + { + "type": "uint64", + "name": "starting_price" + }, + { + "type": "uint64", + "name": "length" + }, + { + "type": "axfer", + "name": "axfer" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "opt_in", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "bid", + "args": [ + { + "type": "pay", + "name": "pay" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "claim_bids", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "claim_asset", + "args": [ + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 4, + "bytes": 1 + }, + "local": { + "ints": 1, + "bytes": 0 + } + }, + "keys": { + "global": { + "auction_end": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXVjdGlvbl9lbmQ=" + }, + "previous_bid": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cHJldmlvdXNfYmlk" + }, + "asa_amount": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNhX2Ftb3VudA==" + }, + "asa": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNh" + }, + "previous_bidder": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "cHJldmlvdXNfYmlkZGVy" + } + }, + "local": { + "claimable_amount": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y2xhaW0=", + "desc": "The claimable amount" + } + }, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 277 + ], + "errorMessage": "ASA already opted in" + }, + { + "pc": [ + 374 + ], + "errorMessage": "Bid must be higher than previous bid" + }, + { + "pc": [ + 144, + 162, + 192, + 201, + 223, + 235 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 271 + ], + "errorMessage": "Only creator can opt in to ASA" + }, + { + "pc": [ + 313 + ], + "errorMessage": "auction already started" + }, + { + "pc": [ + 353 + ], + "errorMessage": "auction has ended" + }, + { + "pc": [ + 464 + ], + "errorMessage": "auction has not ended" + }, + { + "pc": [ + 307 + ], + "errorMessage": "auction must be started by creator" + }, + { + "pc": [ + 321 + ], + "errorMessage": "axfer must transfer to this app" + }, + { + "pc": [ + 275 + ], + "errorMessage": "check self.asa exists" + }, + { + "pc": [ + 478 + ], + "errorMessage": "check self.asa_amount exists" + }, + { + "pc": [ + 311, + 351, + 462 + ], + "errorMessage": "check self.auction_end exists" + }, + { + "pc": [ + 404 + ], + "errorMessage": "check self.claimable_amount exists for account" + }, + { + "pc": [ + 370, + 418 + ], + "errorMessage": "check self.previous_bid exists" + }, + { + "pc": [ + 410, + 469, + 473 + ], + "errorMessage": "check self.previous_bidder exists" + }, + { + "pc": [ + 258 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 147, + 165, + 195, + 204, + 226, + 238 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 362 + ], + "errorMessage": "payment sender must match transaction sender" + }, + { + "pc": [ + 183 + ], + "errorMessage": "transaction type is axfer" + }, + { + "pc": [ + 214 + ], + "errorMessage": "transaction type is pay" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgNAogICAgYnl0ZWNibG9jayAiYXVjdGlvbl9lbmQiICJwcmV2aW91c19iaWQiICJwcmV2aW91c19iaWRkZXIiICJhc2EiICJhc2FfYW1vdW50IiAiY2xhaW0iCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBjbGFzcyBBdWN0aW9uKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTAKICAgIHB1c2hieXRlc3MgMHgyODI2YjIwMiAweGYwYWE3MDIzIDB4MzBjNmQ1OGEgMHhkYjdmZTg0MyAweGU2NTQ2MjViIDB4MWVjMTJiZWYgLy8gbWV0aG9kICJvcHRfaW50b19hc3NldChhc3NldCl2b2lkIiwgbWV0aG9kICJzdGFydF9hdWN0aW9uKHVpbnQ2NCx1aW50NjQsYXhmZXIpdm9pZCIsIG1ldGhvZCAib3B0X2luKCl2b2lkIiwgbWV0aG9kICJiaWQocGF5KXZvaWQiLCBtZXRob2QgImNsYWltX2JpZHMoKXZvaWQiLCBtZXRob2QgImNsYWltX2Fzc2V0KGFzc2V0KXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW50b19hc3NldF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3N0YXJ0X2F1Y3Rpb25fcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW5fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iaWRfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbGFpbV9iaWRzX3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fY2xhaW1fYXNzZXRfcm91dGVANwogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb3B0X2ludG9fYXNzZXRfcm91dGVAMjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3B0X2ludG9fYXNzZXQKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3N0YXJ0X2F1Y3Rpb25fcm91dGVAMzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHN0YXJ0X2F1Y3Rpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbl9yb3V0ZUA0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iaWRfcm91dGVANToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzEgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYmlkCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbGFpbV9iaWRzX3JvdXRlQDY6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xhaW1fYmlkcwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xhaW1fYXNzZXRfcm91dGVANzoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY2xhaW1fYXNzZXQKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTYKICAgIC8vIGNsYXNzIEF1Y3Rpb24oQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE0CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDE0OgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxNgogICAgLy8gY2xhc3MgQXVjdGlvbihBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5vcHRfaW50b19hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpvcHRfaW50b19hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjUtMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG9wdF9pbnRvX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyNy0yOAogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjktMzAKICAgIC8vICMgVmVyaWZ5IGEgQVNBIGhhc24ndCBhbHJlYWR5IGJlZW4gb3B0ZWQgaW50bwogICAgLy8gYXNzZXJ0IHNlbGYuYXNhLmlkID09IDAsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEFTQSBhbHJlYWR5IG9wdGVkIGluCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjMxLTMyCiAgICAvLyAjIFNhdmUgQVNBIElEIGluIGdsb2JhbCBzdGF0ZQogICAgLy8gc2VsZi5hc2EgPSBhc3NldAogICAgYnl0ZWNfMyAvLyAiYXNhIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNC0zOAogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIHhmZXJfYXNzZXQ9YXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBhc3NldF9yZWNlaXZlcj1HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBYZmVyQXNzZXQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTozNC0zNQogICAgLy8gIyBTdWJtaXQgb3B0LWluIHRyYW5zYWN0aW9uOiAwIGFzc2V0IHRyYW5zZmVyIHRvIHNlbGYKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIGludGNfMiAvLyBheGZlcgogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM4CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgeGZlcl9hc3NldD1hc3NldCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uc3RhcnRfYXVjdGlvbihzdGFydGluZ19wcmljZTogdWludDY0LCBsZW5ndGg6IHVpbnQ2NCwgYXhmZXI6IHVpbnQ2NCkgLT4gdm9pZDoKc3RhcnRfYXVjdGlvbjoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NDAtNDYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHN0YXJ0X2F1Y3Rpb24oCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBzdGFydGluZ19wcmljZTogVUludDY0LAogICAgLy8gICAgIGxlbmd0aDogVUludDY0LAogICAgLy8gICAgIGF4ZmVyOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0NwogICAgLy8gYXNzZXJ0IFR4bi5zZW5kZXIgPT0gR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgImF1Y3Rpb24gbXVzdCBiZSBzdGFydGVkIGJ5IGNyZWF0b3IiCiAgICB0eG4gU2VuZGVyCiAgICBnbG9iYWwgQ3JlYXRvckFkZHJlc3MKICAgID09CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBtdXN0IGJlIHN0YXJ0ZWQgYnkgY3JlYXRvcgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo0OS01MAogICAgLy8gIyBFbnN1cmUgdGhlIGF1Y3Rpb24gaGFzbid0IGFscmVhZHkgYmVlbiBzdGFydGVkCiAgICAvLyBhc3NlcnQgc2VsZi5hdWN0aW9uX2VuZCA9PSAwLCAiYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXVjdGlvbl9lbmQgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQgLy8gYXVjdGlvbiBhbHJlYWR5IHN0YXJ0ZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NTQKICAgIC8vIGF4ZmVyLmFzc2V0X3JlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjUyLTU1CiAgICAvLyAjIFZlcmlmeSBheGZlcgogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBheGZlci5hc3NldF9yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiYXhmZXIgbXVzdCB0cmFuc2ZlciB0byB0aGlzIGFwcCIKICAgIGFzc2VydCAvLyBheGZlciBtdXN0IHRyYW5zZmVyIHRvIHRoaXMgYXBwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU3LTU4CiAgICAvLyAjIFNldCBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IGF4ZmVyLmFzc2V0X2Ftb3VudAogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldEFtb3VudAogICAgYnl0ZWMgNCAvLyAiYXNhX2Ftb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzZWxmLmF1Y3Rpb25fZW5kID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgKyBsZW5ndGgKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2MAogICAgLy8gc2VsZi5wcmV2aW91c19iaWQgPSBzdGFydGluZ19wcmljZQogICAgYnl0ZWNfMSAvLyAicHJldmlvdXNfYmlkIgogICAgZnJhbWVfZGlnIC0zCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmJpZChwYXk6IHVpbnQ2NCkgLT4gdm9pZDoKYmlkOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYmlkKHNlbGYsIHBheTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NjgtNjkKICAgIC8vICMgRW5zdXJlIGF1Y3Rpb24gaGFzbid0IGVuZGVkCiAgICAvLyBhc3NlcnQgR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAgPCBzZWxmLmF1Y3Rpb25fZW5kLCAiYXVjdGlvbiBoYXMgZW5kZWQiCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXVjdGlvbl9lbmQgZXhpc3RzCiAgICA8CiAgICBhc3NlcnQgLy8gYXVjdGlvbiBoYXMgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzEtNzIKICAgIC8vICMgVmVyaWZ5IHBheW1lbnQgdHJhbnNhY3Rpb24KICAgIC8vIGFzc2VydCBwYXkuc2VuZGVyID09IFR4bi5zZW5kZXIsICJwYXltZW50IHNlbmRlciBtdXN0IG1hdGNoIHRyYW5zYWN0aW9uIHNlbmRlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgU2VuZGVyCiAgICBkdXAKICAgIHR4biBTZW5kZXIKICAgID09CiAgICBhc3NlcnQgLy8gcGF5bWVudCBzZW5kZXIgbXVzdCBtYXRjaCB0cmFuc2FjdGlvbiBzZW5kZXIKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCBwYXkuYW1vdW50ID4gc2VsZi5wcmV2aW91c19iaWQsICJCaWQgbXVzdCBiZSBoaWdoZXIgdGhhbiBwcmV2aW91cyBiaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5wcmV2aW91c19iaWQgZXhpc3RzCiAgICBkaWcgMQogICAgPAogICAgYXNzZXJ0IC8vIEJpZCBtdXN0IGJlIGhpZ2hlciB0aGFuIHByZXZpb3VzIGJpZAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3NS03NgogICAgLy8gIyBzZXQgZ2xvYmFsIHN0YXRlCiAgICAvLyBzZWxmLnByZXZpb3VzX2JpZCA9IHBheS5hbW91bnQKICAgIGJ5dGVjXzEgLy8gInByZXZpb3VzX2JpZCIKICAgIGRpZyAxCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo3NwogICAgLy8gc2VsZi5wcmV2aW91c19iaWRkZXIgPSBwYXkuc2VuZGVyCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICB1bmNvdmVyIDIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojc5LTgwCiAgICAvLyAjIFVwZGF0ZSBjbGFpbWFibGUgYW1vdW50CiAgICAvLyBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0gPSBwYXkuYW1vdW50CiAgICB0eG4gU2VuZGVyCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLmNsYWltX2JpZHMoKSAtPiB2b2lkOgpjbGFpbV9iaWRzOgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Mi04MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xhaW1fYmlkcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg0CiAgICAvLyBhbW91bnQgPSBvcmlnaW5hbF9hbW91bnQgPSBzZWxmLmNsYWltYWJsZV9hbW91bnRbVHhuLnNlbmRlcl0KICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jbGFpbWFibGVfYW1vdW50IGV4aXN0cyBmb3IgYWNjb3VudAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo4Ni04NwogICAgLy8gIyBzdWJ0cmFjdCBwcmV2aW91cyBiaWQgaWYgc2VuZGVyIGlzIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaWYgVHhuLnNlbmRlciA9PSBzZWxmLnByZXZpb3VzX2JpZGRlcjoKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgPT0KICAgIGJ6IGNsYWltX2JpZHNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhbW91bnQgLT0gc2VsZi5wcmV2aW91c19iaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJwcmV2aW91c19iaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgIHN3YXAKICAgIC0KICAgIGZyYW1lX2J1cnkgMQoKY2xhaW1fYmlkc19hZnRlcl9pZl9lbHNlQDI6CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkwLTkzCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICAvLyAgICAgYW1vdW50PWFtb3VudCwKICAgIC8vICAgICByZWNlaXZlcj1UeG4uc2VuZGVyLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5MgogICAgLy8gcmVjZWl2ZXI9VHhuLnNlbmRlciwKICAgIHR4biBTZW5kZXIKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBpdHhuLlBheW1lbnQoCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTAtOTMKICAgIC8vIGl0eG4uUGF5bWVudCgKICAgIC8vICAgICBhbW91bnQ9YW1vdW50LAogICAgLy8gICAgIHJlY2VpdmVyPVR4bi5zZW5kZXIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5NQogICAgLy8gc2VsZi5jbGFpbWFibGVfYW1vdW50W1R4bi5zZW5kZXJdID0gb3JpZ2luYWxfYW1vdW50IC0gYW1vdW50CiAgICB0eG4gU2VuZGVyCiAgICBmcmFtZV9kaWcgMAogICAgdW5jb3ZlciAyCiAgICAtCiAgICBieXRlYyA1IC8vICJjbGFpbSIKICAgIHN3YXAKICAgIGFwcF9sb2NhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmF1Y3Rpb24uY29udHJhY3QuQXVjdGlvbi5jbGFpbV9hc3NldChhc3NldDogdWludDY0KSAtPiB2b2lkOgpjbGFpbV9hc3NldDoKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6OTctOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNsYWltX2Fzc2V0KHNlbGYsIGFzc2V0OiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wID4gc2VsZi5hdWN0aW9uX2VuZCwgImF1Y3Rpb24gaGFzIG5vdCBlbmRlZCIKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJhdWN0aW9uX2VuZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hdWN0aW9uX2VuZCBleGlzdHMKICAgID4KICAgIGFzc2VydCAvLyBhdWN0aW9uIGhhcyBub3QgZW5kZWQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAwLTEwNgogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjEwMwogICAgLy8gYXNzZXRfY2xvc2VfdG89c2VsZi5wcmV2aW91c19iaWRkZXIsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAicHJldmlvdXNfYmlkZGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnByZXZpb3VzX2JpZGRlciBleGlzdHMKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTA0CiAgICAvLyBhc3NldF9yZWNlaXZlcj1zZWxmLnByZXZpb3VzX2JpZGRlciwKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucHJldmlvdXNfYmlkZGVyIGV4aXN0cwogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNCAvLyAiYXNhX2Ftb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5hc2FfYW1vdW50IGV4aXN0cwogICAgaXR4bl9maWVsZCBBc3NldEFtb3VudAogICAgaXR4bl9maWVsZCBBc3NldFJlY2VpdmVyCiAgICBpdHhuX2ZpZWxkIEFzc2V0Q2xvc2VUbwogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIFhmZXJBc3NldAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxMDAtMTAxCiAgICAvLyAjIFNlbmQgQVNBIHRvIHByZXZpb3VzIGJpZGRlcgogICAgLy8gaXR4bi5Bc3NldFRyYW5zZmVyKAogICAgaW50Y18yIC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTAwLTEwNgogICAgLy8gIyBTZW5kIEFTQSB0byBwcmV2aW91cyBiaWRkZXIKICAgIC8vIGl0eG4uQXNzZXRUcmFuc2ZlcigKICAgIC8vICAgICB4ZmVyX2Fzc2V0PWFzc2V0LAogICAgLy8gICAgIGFzc2V0X2Nsb3NlX3RvPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPXNlbGYucHJldmlvdXNfYmlkZGVyLAogICAgLy8gICAgIGFzc2V0X2Ftb3VudD1zZWxmLmFzYV9hbW91bnQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYXVjdGlvbi5jb250cmFjdC5BdWN0aW9uLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhdWN0aW9uL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToxOAogICAgLy8gc2VsZi5hdWN0aW9uX2VuZCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMCAvLyAiYXVjdGlvbl9lbmQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTkKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkID0gVUludDY0KDApCiAgICBieXRlY18xIC8vICJwcmV2aW91c19iaWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjAKICAgIC8vIHNlbGYuYXNhX2Ftb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZWMgNCAvLyAiYXNhX2Ftb3VudCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gYXVjdGlvbi9jb250cmFjdC5weToyMQogICAgLy8gc2VsZi5hc2EgPSBBc3NldCgpCiAgICBieXRlY18zIC8vICJhc2EiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MjIKICAgIC8vIHNlbGYucHJldmlvdXNfYmlkZGVyID0gQWNjb3VudCgpCiAgICBieXRlY18yIC8vICJwcmV2aW91c19iaWRkZXIiCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5hdWN0aW9uLmNvbnRyYWN0LkF1Y3Rpb24uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIC8vIGF1Y3Rpb24vY29udHJhY3QucHk6MTE2CiAgICAvLyByZXR1cm4gVHJ1ZQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiADAAEEJgYLYXVjdGlvbl9lbmQMcHJldmlvdXNfYmlkD3ByZXZpb3VzX2JpZGRlcgNhc2EKYXNhX2Ftb3VudAVjbGFpbTEYQAADiAGjiAABQ4oAATEbQQCgggYEKCayAgTwqnAjBDDG1YoE23/oQwTmVGJbBB7BK+82GgCOBgACABQAMgA7AFEAXSKJMRkURDEYRDYaARfAMIgAaiOJMRkURDEYRDYaARc2GgIXMRYjCUk4ECQSRIgAcCOJMRkURDEYRCOJMRkURDEYRDEWIwlJOBAjEkSIAH0jiTEZFEQxGESIAKEjiTEZFEQxGEQ2GgEXwDCIAM4jiTEZQAAGMRgURCOJIomKAQAxADIJEkQiK2VEFEQri/9nsTIKi/+yEbIUJLIQIrIBs4mKAwAxADIJEkQiKGVEFESL/zgUMgoSRIv/OBInBExnMgeL/ggoTGcpi/1niYoBADIHIihlRAxEi/84AEkxABJEi/84CCIpZURLAQxEKUsBZypPAmcxACcFTwJmiYoAADEAIicFY0xJTwJEMQAiKmVEEkEACiIpZUSLAEwJjAGxMQCyB4sBSbIII7IQIrIBszEAiwBPAgknBUxmiYoBADIHIihlRA1EsSIqZUQiKmVEIicEZUSyErIUshWL/7IRJLIQIrIBs4mKAAAoImcpImcnBCJnKyJnKjIDZ4k=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/examples/auction/puya.log b/examples/auction/puya.log index 33295ff182..8bf4664b25 100644 --- a/examples/auction/puya.log +++ b/examples/auction/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['auction'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['auction'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing auction/out/module.awst debug: Sealing block@0: // L12 @@ -1171,6 +1171,7 @@ debug: Found 1 edge set/s for examples.auction.contract.Auction.claim_bids debug: examples.auction.contract.Auction.claim_bids f-stack entry: [] debug: examples.auction.contract.Auction.claim_bids f-stack on first store: ['original_amount#0', 'amount#1'] info: Writing auction/out/Auction.arc32.json +info: Writing auction/out/Auction.arc56.json info: Writing auction/out/Auction.approval.teal info: Writing auction/out/Auction.clear.teal info: Writing auction/out/Auction.approval.bin diff --git a/examples/box_storage/out/BoxContract.arc56.json b/examples/box_storage/out/BoxContract.arc56.json new file mode 100644 index 0000000000..dbeaa226a2 --- /dev/null +++ b/examples/box_storage/out/BoxContract.arc56.json @@ -0,0 +1,475 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "BoxContract", + "structs": {}, + "methods": [ + { + "name": "set_boxes", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "string", + "name": "c" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "check_keys", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete_boxes", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "read_boxes", + "args": [], + "returns": { + "type": "(uint64,byte[],string)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "boxes_exist", + "args": [], + "returns": { + "type": "(bool,bool,bool)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "slice_box", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "arc4_box", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_box_ref", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_test", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_set", + "args": [ + { + "type": "uint64", + "name": "key" + }, + { + "type": "string", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_get", + "args": [ + { + "type": "uint64", + "name": "key" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_del", + "args": [ + { + "type": "uint64", + "name": "key" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "box_map_exists", + "args": [ + { + "type": "uint64", + "name": "key" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": { + "box_a": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Ym94X2E=" + }, + "box_b": { + "keyType": "AVMString", + "valueType": "byte[]", + "key": "Yg==" + }, + "box_c": { + "keyType": "AVMBytes", + "valueType": "string", + "key": "Qk9YX0M=" + }, + "box_d": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Ym94X2Q=" + }, + "box_ref": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Ym94X3JlZg==" + } + } + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "box_map": { + "keyType": "AVMUint64", + "valueType": "AVMString", + "prefix": "" + } + } + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 1246 + ], + "errorMessage": "Blob exists" + }, + { + "pc": [ + 187, + 209, + 218, + 230, + 281, + 331, + 343, + 355, + 367, + 379, + 401, + 430, + 446 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 930, + 1093, + 1104, + 1116, + 1128 + ], + "errorMessage": "check Box exists" + }, + { + "pc": [ + 1376 + ], + "errorMessage": "check BoxMap entry exists" + }, + { + "pc": [ + 1249, + 1285 + ], + "errorMessage": "check BoxRef exists" + }, + { + "pc": [ + 540, + 550 + ], + "errorMessage": "check self.box_a exists" + }, + { + "pc": [ + 523, + 527, + 558, + 913 + ], + "errorMessage": "check self.box_b exists" + }, + { + "pc": [ + 566, + 919 + ], + "errorMessage": "check self.box_c exists" + }, + { + "pc": [ + 577 + ], + "errorMessage": "check self.box_d exists" + }, + { + "pc": [ + 1307, + 1314, + 1398 + ], + "errorMessage": "check self.box_map entry exists" + }, + { + "pc": [ + 534 + ], + "errorMessage": "direct reference should match copy" + }, + { + "pc": [ + 1174, + 1273 + ], + "errorMessage": "has data" + }, + { + "pc": [ + 478 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 190, + 212, + 221, + 233, + 284, + 334, + 346, + 358, + 370, + 382, + 404, + 433, + 449 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 1146, + 1152, + 1158, + 1164 + ], + "errorMessage": "no data" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAyIDUKICAgIGJ5dGVjYmxvY2sgMHg0MjRmNTg1ZjQzIDB4NjI2YzZmNjIgImJveF9kIiAiYm94X2EiICJiIiAweDAwIDB4NjQgMHgxNTFmN2M3NSAiMCIgMHg2ODY1NmM2YzZmIDB4MDAwMjM0MzIgImJveF9yZWYiICJkZWZhdWx0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDE3CiAgICBwdXNoYnl0ZXNzIDB4N2QzNzI5NmUgMHgzMzMyNWQzZCAweGQ1NjZjNjMyIDB4ZmJkYTliYTAgMHhlNWEzZWQ1MiAweDA0ZWY0OTcxIDB4MjNlY2IzMmMgMHhlZWY3NTgxNiAweGI1MzI5MTNhIDB4YzI5ZjE2NjkgMHg5Yzg4OGMwOSAweGU2ZjY4NTA2IDB4OGVlMmMzNjQgLy8gbWV0aG9kICJzZXRfYm94ZXModWludDY0LGJ5dGVbXSxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiY2hlY2tfa2V5cygpdm9pZCIsIG1ldGhvZCAiZGVsZXRlX2JveGVzKCl2b2lkIiwgbWV0aG9kICJyZWFkX2JveGVzKCkodWludDY0LGJ5dGVbXSxzdHJpbmcpIiwgbWV0aG9kICJib3hlc19leGlzdCgpKGJvb2wsYm9vbCxib29sKSIsIG1ldGhvZCAic2xpY2VfYm94KCl2b2lkIiwgbWV0aG9kICJhcmM0X2JveCgpdm9pZCIsIG1ldGhvZCAidGVzdF9ib3hfcmVmKCl2b2lkIiwgbWV0aG9kICJib3hfbWFwX3Rlc3QoKXZvaWQiLCBtZXRob2QgImJveF9tYXBfc2V0KHVpbnQ2NCxzdHJpbmcpdm9pZCIsIG1ldGhvZCAiYm94X21hcF9nZXQodWludDY0KXN0cmluZyIsIG1ldGhvZCAiYm94X21hcF9kZWwodWludDY0KXZvaWQiLCBtZXRob2QgImJveF9tYXBfZXhpc3RzKHVpbnQ2NClib29sIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fc2V0X2JveGVzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY2hlY2tfa2V5c19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9ib3hlc19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3JlYWRfYm94ZXNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hlc19leGlzdF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3NsaWNlX2JveF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ib3hfcmVmX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF90ZXN0X3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZ2V0X3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZGVsX3JvdXRlQDEzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfZXhpc3RzX3JvdXRlQDE0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19zZXRfYm94ZXNfcm91dGVAMjoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgc2V0X2JveGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jaGVja19rZXlzX3JvdXRlQDM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfYm94ZXNfcm91dGVANDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZGVsZXRlX2JveGVzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZWFkX2JveGVzX3JvdXRlQDU6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHJlYWRfYm94ZXMKICAgIHVuY292ZXIgMgogICAgaXRvYgogICAgZGlnIDIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBzd2FwCiAgICBwdXNoYnl0ZXMgMHgwMDBjCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBsZW4KICAgIHB1c2hpbnQgMTIgLy8gMTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hlc19leGlzdF9yb3V0ZUA2OgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib3hlc19leGlzdAogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciA0CiAgICBzZXRiaXQKICAgIGJ5dGVjIDUgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgNAogICAgc2V0Yml0CiAgICBieXRlYyA1IC8vIDB4MDAKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHNldGJpdAogICAgc3dhcAogICAgaW50Y18xIC8vIDAKICAgIGdldGJpdAogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZXRiaXQKICAgIHN3YXAKICAgIGludGNfMSAvLyAwCiAgICBnZXRiaXQKICAgIGludGNfMiAvLyAyCiAgICBzd2FwCiAgICBzZXRiaXQKICAgIGJ5dGVjIDcgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NsaWNlX2JveF9yb3V0ZUA3OgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBzbGljZV9ib3gKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FyYzRfYm94X3JvdXRlQDg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGFyYzRfYm94CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2JveF9yZWZfcm91dGVAOToKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9ib3hfcmVmCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hfbWFwX3Rlc3Rfcm91dGVAMTA6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib3hfbWFwX3Rlc3QKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JveF9tYXBfc2V0X3JvdXRlQDExOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX3NldAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9nZXRfcm91dGVAMTI6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYm94X21hcF9nZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ib3hfbWFwX2RlbF9yb3V0ZUAxMzoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib3hfbWFwX2RlbAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm94X21hcF9leGlzdHNfcm91dGVAMTQ6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OAogICAgLy8gY2xhc3MgQm94Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYm94X21hcF9leGlzdHMKICAgIGJ5dGVjIDUgLy8gMHgwMAogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlYyA3IC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTc6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4CiAgICAvLyBjbGFzcyBCb3hDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMToKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjgKICAgIC8vIGNsYXNzIEJveENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5zZXRfYm94ZXMoYTogdWludDY0LCBiOiBieXRlcywgYzogYnl0ZXMpIC0+IHZvaWQ6CnNldF9ib3hlczoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3LTE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzZXRfYm94ZXMoc2VsZiwgYTogVUludDY0LCBiOiBhcmM0LkR5bmFtaWNCeXRlcywgYzogYXJjNC5TdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE5CiAgICAvLyBzZWxmLmJveF9hLnZhbHVlID0gYQogICAgZnJhbWVfZGlnIC0zCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBzZWxmLmJveF9iLnZhbHVlID0gYi5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBmcmFtZV9kaWcgLTIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBzZWxmLmJveF9jLnZhbHVlID0gYwogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjIKICAgIC8vIHNlbGYuYm94X2QudmFsdWUgPSBiLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgZGlnIDEKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI0CiAgICAvLyBiX3ZhbHVlID0gc2VsZi5ib3hfYi52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYiBleGlzdHMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYi52YWx1ZS5sZW5ndGggPT0gYl92YWx1ZS5sZW5ndGgsICJkaXJlY3QgcmVmZXJlbmNlIHNob3VsZCBtYXRjaCBjb3B5IgogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgID09CiAgICBhc3NlcnQgLy8gZGlyZWN0IHJlZmVyZW5jZSBzaG91bGQgbWF0Y2ggY29weQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MjcKICAgIC8vIHNlbGYuYm94X2EudmFsdWUgKz0gMwogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYSBleGlzdHMKICAgIHB1c2hpbnQgMyAvLyAzCiAgICArCiAgICBpdG9iCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIHN3YXAKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjI5LTMwCiAgICAvLyAjIHRlc3QgLmxlbmd0aAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2EubGVuZ3RoID09IDgKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2EgZXhpc3RzCiAgICBwdXNoaW50IDggLy8gOAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzEKICAgIC8vIGFzc2VydCBzZWxmLmJveF9iLmxlbmd0aCA9PSBiLmJ5dGVzLmxlbmd0aAogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBsZW4KICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy5sZW5ndGggPT0gYy5ieXRlcy5sZW5ndGgKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLmxlbmd0aCA9PSBiLm5hdGl2ZS5sZW5ndGgKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94X2QgZXhpc3RzCiAgICBkaWcgMgogICAgbGVuCiAgICBzd2FwCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MzUtMzYKICAgIC8vICMgdGVzdCAudmFsdWUuYnl0ZXMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9jLnZhbHVlLmJ5dGVzWzBdID09IGMuYnl0ZXNbMF0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBpbnRjXzEgLy8gMAogICAgaW50Y18wIC8vIDEKICAgIGJveF9leHRyYWN0CiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMCAxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTozNwogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbLTFdID09IGMuYnl0ZXNbLTFdCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHN3YXAKICAgIGludGNfMCAvLyAxCiAgICBib3hfZXh0cmFjdAogICAgZGlnIDIKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6LTFdID09IGMuYnl0ZXNbOi0xXQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9sZW4KICAgIHBvcAogICAgaW50Y18wIC8vIDEKICAgIGRpZyAxCiAgICA8CiAgICBkaWcgMQogICAgaW50Y18wIC8vIDEKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBzd2FwCiAgICAtCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfYy52YWx1ZS5ieXRlc1s6Ml0gPT0gYy5ieXRlc1s6Ml0KICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGludGNfMSAvLyAwCiAgICB1bmNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBpbnRjXzIgLy8gMgogICAgZGlnIDMKICAgID49CiAgICBpbnRjXzIgLy8gMgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0MS00MgogICAgLy8gIyB0ZXN0IC52YWx1ZSB3aXRoIEJ5dGVzIHR5cGUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzBdID09IGIubmF0aXZlWzBdCiAgICBieXRlY18yIC8vICJib3hfZCIKICAgIGludGNfMSAvLyAwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAyCiAgICBleHRyYWN0IDAgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWy0xXSA9PSBiLm5hdGl2ZVstMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBzd2FwCiAgICBpbnRjXzAgLy8gMQogICAgYm94X2V4dHJhY3QKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgZGlnIDQKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfZC52YWx1ZVs6LTFdID09IGIubmF0aXZlWzotMV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzAgLy8gMQogICAgZGlnIDEKICAgIDwKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIC0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMCAvLyAxCiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMCAvLyAxCiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAyCiAgICBzd2FwCiAgICAtCiAgICBkaWcgMwogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NDUKICAgIC8vIGFzc2VydCBzZWxmLmJveF9kLnZhbHVlWzo1XSA9PSBiLm5hdGl2ZVs6NV0KICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgYm94X2xlbgogICAgcG9wCiAgICBpbnRjXzMgLy8gNQogICAgZGlnIDEKICAgIDwKICAgIGludGNfMyAvLyA1CiAgICBzd2FwCiAgICBzZWxlY3QKICAgIGJ5dGVjXzIgLy8gImJveF9kIgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIGludGNfMyAvLyA1CiAgICBkaWcgMgogICAgPj0KICAgIGludGNfMyAvLyA1CiAgICBkaWcgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAzCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo0NgogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2QudmFsdWVbOiBVSW50NjQoMildID09IGIubmF0aXZlWzogVUludDY0KDIpXQogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgaW50Y18yIC8vIDIKICAgIHN3YXAKICAgIHNlbGVjdAogICAgYnl0ZWNfMiAvLyAiYm94X2QiCiAgICBpbnRjXzEgLy8gMAogICAgdW5jb3ZlciAyCiAgICBib3hfZXh0cmFjdAogICAgaW50Y18yIC8vIDIKICAgIGRpZyAyCiAgICA+PQogICAgaW50Y18yIC8vIDIKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDAKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuZGVsZXRlX2JveGVzKCkgLT4gdm9pZDoKZGVsZXRlX2JveGVzOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTQtNTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGRlbGV0ZV9ib3hlcyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NgogICAgLy8gZGVsIHNlbGYuYm94X2EudmFsdWUKICAgIGJ5dGVjXzMgLy8gImJveF9hIgogICAgYm94X2RlbAogICAgcG9wCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo1NwogICAgLy8gZGVsIHNlbGYuYm94X2IudmFsdWUKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBkZWwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NTkKICAgIC8vIGFzc2VydCBzZWxmLmJveF9hLmdldChkZWZhdWx0PVVJbnQ2NCg0MikpID09IDQyCiAgICBieXRlY18zIC8vICJib3hfYSIKICAgIGJveF9nZXQKICAgIHN3YXAKICAgIGJ0b2kKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2IuZ2V0KGRlZmF1bHQ9YXJjNC5EeW5hbWljQnl0ZXMoYiI0MiIpKS5uYXRpdmUgPT0gYiI0MiIKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgMHgzNDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MuZ2V0KGRlZmF1bHQ9YXJjNC5TdHJpbmcoIjQyIikpID09ICI0MiIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBieXRlYyAxMCAvLyAweDAwMDIzNDMyCiAgICBjb3ZlciAyCiAgICBzZWxlY3QKICAgIGJ5dGVjIDEwIC8vIDB4MDAwMjM0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBhLCBhX2V4aXN0cyA9IHNlbGYuYm94X2EubWF5YmUoKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2MwogICAgLy8gYXNzZXJ0IG5vdCBhX2V4aXN0cwogICAgc3dhcAogICAgIQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2NAogICAgLy8gYXNzZXJ0IGEgPT0gMAogICAgIQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5yZWFkX2JveGVzKCkgLT4gdWludDY0LCBieXRlcywgYnl0ZXM6CnJlYWRfYm94ZXM6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo2Ni02NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcmVhZF9ib3hlcyhzZWxmKSAtPiB0dXBsZVtVSW50NjQsIEJ5dGVzLCBhcmM0LlN0cmluZ106CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjY4CiAgICAvLyByZXR1cm4gZ2V0X2JveF92YWx1ZV9wbHVzXzEoc2VsZi5ib3hfYSkgLSAxLCBzZWxmLmJveF9iLnZhbHVlLm5hdGl2ZSwgc2VsZi5ib3hfYy52YWx1ZQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBjYWxsc3ViIGdldF9ib3hfdmFsdWVfcGx1c18xCiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgYnl0ZWMgNCAvLyAiYiIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9iIGV4aXN0cwogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ib3hfYyBleGlzdHMKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LmdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogYnl0ZXMpIC0+IHVpbnQ2NDoKZ2V0X2JveF92YWx1ZV9wbHVzXzE6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzktMTgwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfdmFsdWVfcGx1c18xKGJveDogQm94W1VJbnQ2NF0pIC0+IFVJbnQ2NDoKICAgIHByb3RvIDEgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTgxCiAgICAvLyByZXR1cm4gYm94LnZhbHVlICsgMQogICAgZnJhbWVfZGlnIC0xCiAgICBib3hfZ2V0CiAgICBzd2FwCiAgICBidG9pCiAgICBzd2FwCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmJveGVzX2V4aXN0KCkgLT4gdWludDY0LCB1aW50NjQsIHVpbnQ2NDoKYm94ZXNfZXhpc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3MC03MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYm94ZXNfZXhpc3Qoc2VsZikgLT4gdHVwbGVbYm9vbCwgYm9vbCwgYm9vbF06CiAgICBwcm90byAwIDMKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjcyCiAgICAvLyByZXR1cm4gYm9vbChzZWxmLmJveF9hKSwgYm9vbChzZWxmLmJveF9iKSwgYm9vbChzZWxmLmJveF9jKQogICAgYnl0ZWNfMyAvLyAiYm94X2EiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjIDQgLy8gImIiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LnNsaWNlX2JveCgpIC0+IHZvaWQ6CnNsaWNlX2JveDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojc0LTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBzbGljZV9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIGJveF9kZWwKICAgIHBvcAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzcKICAgIC8vIGJveF8wLnZhbHVlID0gQnl0ZXMoYiJUZXN0aW5nIHRlc3RpbmcgMTIzIikKICAgIHB1c2hieXRlcyAweDU0NjU3Mzc0Njk2ZTY3MjA3NDY1NzM3NDY5NmU2NzIwMzEzMjMzCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3NgogICAgLy8gYm94XzAgPSBCb3goQnl0ZXMsIGtleT1TdHJpbmcoIjAiKSkKICAgIGJ5dGVjIDggLy8gIjAiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo3OAogICAgLy8gYXNzZXJ0IGJveF8wLnZhbHVlWzA6N10gPT0gYiJUZXN0aW5nIgogICAgYm94X2xlbgogICAgcG9wCiAgICBkdXAKICAgIGludGNfMSAvLyAwCiAgICBkaWcgMgogICAgc2VsZWN0CiAgICBwdXNoaW50IDcgLy8gNwogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCA3IC8vIDcKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBkaWcgMQogICAgLQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzYKICAgIC8vIGJveF8wID0gQm94KEJ5dGVzLCBrZXk9U3RyaW5nKCIwIikpCiAgICBieXRlYyA4IC8vICIwIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6NzgKICAgIC8vIGFzc2VydCBib3hfMC52YWx1ZVswOjddID09IGIiVGVzdGluZyIKICAgIGNvdmVyIDIKICAgIGJveF9leHRyYWN0CiAgICBwdXNoYnl0ZXMgMHg1NDY1NzM3NDY5NmU2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODAKICAgIC8vIHNlbGYuYm94X2MudmFsdWUgPSBhcmM0LlN0cmluZygiSGVsbG8iKQogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIGJveF9kZWwKICAgIHBvcAogICAgYnl0ZWNfMCAvLyAweDQyNGY1ODVmNDMKICAgIHB1c2hieXRlcyAweDAwMDU0ODY1NmM2YzZmCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IHNlbGYuYm94X2MudmFsdWUuYnl0ZXNbMjoxMF0gPT0gYiJIZWxsbyIKICAgIGJ5dGVjXzAgLy8gMHg0MjRmNTg1ZjQzCiAgICBib3hfbGVuCiAgICBwb3AKICAgIGludGNfMiAvLyAyCiAgICBkaWcgMQogICAgPAogICAgZGlnIDEKICAgIGludGNfMiAvLyAyCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZGlnIDIKICAgIDwKICAgIHVuY292ZXIgMgogICAgcHVzaGludCAxMCAvLyAxMAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGRpZyAxCiAgICAtCiAgICBieXRlY18wIC8vIDB4NDI0ZjU4NWY0MwogICAgY292ZXIgMgogICAgYm94X2V4dHJhY3QKICAgIHB1c2hieXRlcyAweDQ4NjU2YzZjNmYKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLmJveF9zdG9yYWdlLmNvbnRyYWN0LkJveENvbnRyYWN0LmFyYzRfYm94KCkgLT4gdm9pZDoKYXJjNF9ib3g6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4My04NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXJjNF9ib3goc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODYKICAgIC8vIGJveF9kLnZhbHVlID0gU3RhdGljSW50cyhhcmM0LlVJbnQ4KDApLCBhcmM0LlVJbnQ4KDEpLCBhcmM0LlVJbnQ4KDIpLCBhcmM0LlVJbnQ4KDMpKQogICAgcHVzaGJ5dGVzIDB4MDAwMTAyMDMKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMF0gPT0gMAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnl0ZWMgNSAvLyAweDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODUKICAgIC8vIGJveF9kID0gQm94KFN0YXRpY0ludHMsIGtleT1CeXRlcyhiImQiKSkKICAgIGJ5dGVjIDYgLy8gMHg2NAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6ODkKICAgIC8vIGFzc2VydCBib3hfZC52YWx1ZVsxXSA9PSAxCiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgQm94IGV4aXN0cwogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwMQogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBib3hfZCA9IEJveChTdGF0aWNJbnRzLCBrZXk9Qnl0ZXMoYiJkIikpCiAgICBieXRlYyA2IC8vIDB4NjQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjkwCiAgICAvLyBhc3NlcnQgYm94X2QudmFsdWVbMl0gPT0gMgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIEJveCBleGlzdHMKICAgIGV4dHJhY3QgMiAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDIKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo4NQogICAgLy8gYm94X2QgPSBCb3goU3RhdGljSW50cywga2V5PUJ5dGVzKGIiZCIpKQogICAgYnl0ZWMgNiAvLyAweDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IGJveF9kLnZhbHVlWzNdID09IDMKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3ggZXhpc3RzCiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QudGVzdF9ib3hfcmVmKCkgLT4gdm9pZDoKdGVzdF9ib3hfcmVmOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6OTMtOTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfYm94X3JlZihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NS05NgogICAgLy8gIyBpbml0IHJlZiwgd2l0aCB2YWxpZCBrZXkgdHlwZXMKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PSJibG9iIikKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1iImJsb2IiKQogICAgYnl0ZWNfMSAvLyAweDYyNmM2ZjYyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weTo5OQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9Qnl0ZXMoYiJibG9iIikpCiAgICBieXRlY18xIC8vIDB4NjI2YzZmNjIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMQogICAgLy8gYXNzZXJ0IG5vdCBib3hfcmVmLCAibm8gZGF0YSIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIG5vIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAzCiAgICAvLyBhc3NlcnQgbm90IGJveF9yZWYsICJubyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gbm8gZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDUtMTA2CiAgICAvLyAjIGNyZWF0ZQogICAgLy8gYXNzZXJ0IGJveF9yZWYuY3JlYXRlKHNpemU9MzIpCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTA3CiAgICAvLyBhc3NlcnQgYm94X3JlZiwgImhhcyBkYXRhIgogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQgLy8gaGFzIGRhdGEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vICMgbWFuaXB1bGF0ZSBkYXRhCiAgICAvLyBzZW5kZXJfYnl0ZXMgPSBUeG4uc2VuZGVyLmJ5dGVzCiAgICB0eG4gU2VuZGVyCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTEKICAgIC8vIGFwcF9hZGRyZXNzID0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcwogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEzCiAgICAvLyBib3hfcmVmLnJlcGxhY2UoMCwgc2VuZGVyX2J5dGVzKQogICAgaW50Y18xIC8vIDAKICAgIGRpZyAzCiAgICBib3hfcmVwbGFjZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTQKICAgIC8vIGJveF9yZWYucmVzaXplKDgwMDApCiAgICBwdXNoaW50IDgwMDAgLy8gODAwMAogICAgYm94X3Jlc2l6ZQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTUKICAgIC8vIGJveF9yZWYuc3BsaWNlKDAsIDAsIGFwcF9hZGRyZXNzKQogICAgaW50Y18xIC8vIDAKICAgIGR1cAogICAgZGlnIDMKICAgIGJveF9zcGxpY2UKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE2CiAgICAvLyBib3hfcmVmLnJlcGxhY2UoNjQsIHZhbHVlXzMpCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTIKICAgIC8vIHZhbHVlXzMgPSBCeXRlcyhiImhlbGxvIikKICAgIGJ5dGVjIDkgLy8gMHg2ODY1NmM2YzZmCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTYKICAgIC8vIGJveF9yZWYucmVwbGFjZSg2NCwgdmFsdWVfMykKICAgIGJveF9yZXBsYWNlCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjExNwogICAgLy8gcHJlZml4ID0gYm94X3JlZi5leHRyYWN0KDAsIDMyICogMiArIHZhbHVlXzMubGVuZ3RoKQogICAgaW50Y18xIC8vIDAKICAgIHB1c2hpbnQgNjkgLy8gNjkKICAgIGJveF9leHRyYWN0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMTgKICAgIC8vIGFzc2VydCBwcmVmaXggPT0gYXBwX2FkZHJlc3MgKyBzZW5kZXJfYnl0ZXMgKyB2YWx1ZV8zCiAgICBkaWcgMQogICAgZGlnIDMKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTEyCiAgICAvLyB2YWx1ZV8zID0gQnl0ZXMoYiJoZWxsbyIpCiAgICBieXRlYyA5IC8vIDB4Njg2NTZjNmM2ZgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTE4CiAgICAvLyBhc3NlcnQgcHJlZml4ID09IGFwcF9hZGRyZXNzICsgc2VuZGVyX2J5dGVzICsgdmFsdWVfMwogICAgY29uY2F0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyMC0xMjEKICAgIC8vICMgZGVsZXRlCiAgICAvLyBhc3NlcnQgYm94X3JlZi5kZWxldGUoKQogICAgYm94X2RlbAogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNC0xMjUKICAgIC8vICMgcXVlcnkKICAgIC8vIHZhbHVlLCBleGlzdHMgPSBib3hfcmVmLm1heWJlKCkKICAgIGJveF9nZXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEyNgogICAgLy8gYXNzZXJ0IG5vdCBleGlzdHMKICAgICEKICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI3CiAgICAvLyBhc3NlcnQgdmFsdWUgPT0gYiIiCiAgICBwdXNoYnl0ZXMgMHgKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYm94X3JlZiA9IEJveFJlZihrZXk9U3RyaW5nKCJibG9iIikpCiAgICBieXRlY18xIC8vICJibG9iIgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTI4CiAgICAvLyBhc3NlcnQgYm94X3JlZi5nZXQoZGVmYXVsdD1zZW5kZXJfYnl0ZXMpID09IHNlbmRlcl9ieXRlcwogICAgYm94X2dldAogICAgZGlnIDMKICAgIGNvdmVyIDIKICAgIHNlbGVjdAogICAgZGlnIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMC0xMzEKICAgIC8vICMgdXBkYXRlCiAgICAvLyBib3hfcmVmLnB1dChzZW5kZXJfYnl0ZXMgKyBhcHBfYWRkcmVzcykKICAgIGNvbmNhdAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzAtMTMxCiAgICAvLyAjIHVwZGF0ZQogICAgLy8gYm94X3JlZi5wdXQoc2VuZGVyX2J5dGVzICsgYXBwX2FkZHJlc3MpCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMgogICAgLy8gYXNzZXJ0IGJveF9yZWYsICJCbG9iIGV4aXN0cyIKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEJsb2IgZXhpc3RzCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMDIKICAgIC8vIGJveF9yZWYgPSBCb3hSZWYoa2V5PVN0cmluZygiYmxvYiIpKQogICAgYnl0ZWNfMSAvLyAiYmxvYiIKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzMwogICAgLy8gYXNzZXJ0IGJveF9yZWYubGVuZ3RoID09IDY0CiAgICBib3hfbGVuCiAgICBhc3NlcnQgLy8gY2hlY2sgQm94UmVmIGV4aXN0cwogICAgcHVzaGludCA2NCAvLyA2NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTAyCiAgICAvLyBib3hfcmVmID0gQm94UmVmKGtleT1TdHJpbmcoImJsb2IiKSkKICAgIGJ5dGVjXzEgLy8gImJsb2IiCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzQKICAgIC8vIGFzc2VydCBnZXRfYm94X3JlZl9sZW5ndGgoYm94X3JlZikgPT0gNjQKICAgIGNhbGxzdWIgZ2V0X2JveF9yZWZfbGVuZ3RoCiAgICBwdXNoaW50IDY0IC8vIDY0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxMzYtMTM3CiAgICAvLyAjIGluc3RhbmNlIGJveCByZWYKICAgIC8vIHNlbGYuYm94X3JlZi5jcmVhdGUoc2l6ZT1VSW50NjQoMzIpKQogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBwdXNoaW50IDMyIC8vIDMyCiAgICBib3hfY3JlYXRlCiAgICBwb3AKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X3JlZiwgImhhcyBkYXRhIgogICAgYnl0ZWMgMTEgLy8gImJveF9yZWYiCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIGFzc2VydCAvLyBoYXMgZGF0YQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTM5CiAgICAvLyBzZWxmLmJveF9yZWYuZGVsZXRlKCkKICAgIGJ5dGVjIDExIC8vICJib3hfcmVmIgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X3JlZl9sZW5ndGgocmVmOiBieXRlcykgLT4gdWludDY0OgpnZXRfYm94X3JlZl9sZW5ndGg6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODQtMTg1CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ib3hfcmVmX2xlbmd0aChyZWY6IEJveFJlZikgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxODYKICAgIC8vIHJldHVybiByZWYubGVuZ3RoCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBCb3hSZWYgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3Rlc3QoKSAtPiB2b2lkOgpib3hfbWFwX3Rlc3Q6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDEtMTQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX3Rlc3Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQzCiAgICAvLyBrZXlfMCA9IFVJbnQ2NCgwKQogICAgaW50Y18xIC8vIDAKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gc2VsZi5ib3hfbWFwW2tleV8wXSA9IHZhbHVlCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDUKICAgIC8vIHZhbHVlID0gU3RyaW5nKCJIbW1tbW0iKQogICAgcHVzaGJ5dGVzICJIbW1tbW0iCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNDYKICAgIC8vIHNlbGYuYm94X21hcFtrZXlfMF0gPSB2YWx1ZQogICAgYm94X3B1dAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ3CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwW2tleV8wXS5ieXRlcy5sZW5ndGggPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ4CiAgICAvLyBhc3NlcnQgc2VsZi5ib3hfbWFwLmxlbmd0aChrZXlfMCkgPT0gdmFsdWUuYnl0ZXMubGVuZ3RoCiAgICBkdXAKICAgIGJveF9sZW4KICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICBwdXNoaW50IDYgLy8gNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTQ0CiAgICAvLyBrZXlfMSA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MAogICAgLy8gYXNzZXJ0IHNlbGYuYm94X21hcC5nZXQoa2V5XzEsIGRlZmF1bHQ9U3RyaW5nKCJkZWZhdWx0IikpID09IFN0cmluZygiZGVmYXVsdCIpCiAgICBpdG9iCiAgICBkdXAKICAgIGJveF9nZXQKICAgIGJ5dGVjIDEyIC8vICJkZWZhdWx0IgogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICBieXRlYyAxMiAvLyAiZGVmYXVsdCIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MQogICAgLy8gdmFsdWUsIGV4aXN0cyA9IHNlbGYuYm94X21hcC5tYXliZShrZXlfMSkKICAgIGR1cAogICAgYm94X2dldAogICAgYnVyeSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTIKICAgIC8vIGFzc2VydCBub3QgZXhpc3RzCiAgICAhCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1MwogICAgLy8gYXNzZXJ0IGtleV8wIGluIHNlbGYuYm94X21hcAogICAgc3dhcAogICAgYm94X2xlbgogICAgYnVyeSAxCiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gdG1wX2JveF9tYXBba2V5XzFdID0gU3RyaW5nKCJoZWxsbyIpCiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgZHVwCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgIGJveF9wdXQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE1Ni0xNTcKICAgIC8vICMgdGVzdCBib3ggbWFwIG5vdCBhc3NpZ25lZCB0byB0aGUgY2xhc3MgYW5kIHBhc3NlZCB0byBzdWJyb3V0aW5lCiAgICAvLyB0bXBfYm94X21hcCA9IEJveE1hcChVSW50NjQsIFN0cmluZywga2V5X3ByZWZpeD1CeXRlcygpKQogICAgcHVzaGJ5dGVzIDB4CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNTkKICAgIC8vIGFzc2VydCBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEodG1wX2JveF9tYXAsIFVJbnQ2NCgwKSkgPT0gImhlbGxvIgogICAgaW50Y18xIC8vIDAKICAgIGNhbGxzdWIgZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xCiAgICBieXRlYyA5IC8vICJoZWxsbyIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gZGVsIHRtcF9ib3hfbWFwW2tleV8xXQogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5nZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogYnl0ZXMsIGtleTogdWludDY0KSAtPiBieXRlczoKZ2V0X2JveF9tYXBfdmFsdWVfZnJvbV9rZXlfcGx1c18xOgogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTg5LTE5MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYm94X21hcF92YWx1ZV9mcm9tX2tleV9wbHVzXzEoYm94X21hcDogQm94TWFwW1VJbnQ2NCwgU3RyaW5nXSwga2V5OiBVSW50NjQpIC0+IFN0cmluZzoKICAgIHByb3RvIDIgMQogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTkxCiAgICAvLyByZXR1cm4gYm94X21hcFtrZXkgKyAxXQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgaXRvYgogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBCb3hNYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX3NldChrZXk6IHVpbnQ2NCwgdmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpib3hfbWFwX3NldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Mi0xNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfc2V0KHNlbGYsIGtleTogVUludDY0LCB2YWx1ZTogU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNjQKICAgIC8vIHNlbGYuYm94X21hcFtrZXldID0gdmFsdWUKICAgIGZyYW1lX2RpZyAtMgogICAgaXRvYgogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuYm94X3N0b3JhZ2UuY29udHJhY3QuQm94Q29udHJhY3QuYm94X21hcF9nZXQoa2V5OiB1aW50NjQpIC0+IGJ5dGVzOgpib3hfbWFwX2dldDoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2Ni0xNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZ2V0KHNlbGYsIGtleTogVUludDY0KSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE2OAogICAgLy8gcmV0dXJuIHNlbGYuYm94X21hcFtrZXldCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveF9tYXAgZW50cnkgZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2RlbChrZXk6IHVpbnQ2NCkgLT4gdm9pZDoKYm94X21hcF9kZWw6CiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzAtMTcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBib3hfbWFwX2RlbChzZWxmLCBrZXk6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gYm94X3N0b3JhZ2UvY29udHJhY3QucHk6MTcyCiAgICAvLyBkZWwgc2VsZi5ib3hfbWFwW2tleV0KICAgIGZyYW1lX2RpZyAtMQogICAgaXRvYgogICAgYm94X2RlbAogICAgcG9wCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5ib3hfbWFwX2V4aXN0cyhrZXk6IHVpbnQ2NCkgLT4gdWludDY0Ogpib3hfbWFwX2V4aXN0czoKICAgIC8vIGJveF9zdG9yYWdlL2NvbnRyYWN0LnB5OjE3NC0xNzUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGJveF9tYXBfZXhpc3RzKHNlbGYsIGtleTogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMSAxCiAgICAvLyBib3hfc3RvcmFnZS9jb250cmFjdC5weToxNzYKICAgIC8vIHJldHVybiBrZXkgaW4gc2VsZi5ib3hfbWFwCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIGJveF9sZW4KICAgIGJ1cnkgMQogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5ib3hfc3RvcmFnZS5jb250cmFjdC5Cb3hDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiAEAQACBSYNBUJPWF9DBGJsb2IFYm94X2QFYm94X2EBYgEAAWQEFR98dQEwBWhlbGxvBAACNDIHYm94X3JlZgdkZWZhdWx0iAABQ4oAATEbQQGCgg0EfTcpbgQzMl09BNVmxjIE+9qboATlo+1SBATvSXEEI+yzLATu91gWBLUykToEwp8WaQSciIwJBOb2hQYEjuLDZDYaAI4NAAIAGAAhAC0AYACSAJ4AqgC2AMIA2AD1AQUjiTEZFEQxGEQ2GgEXNhoCNhoDiAEXIokxGRREMRhEIokxGRREMRhEiAJjIokxGRREMRhEiAKYTwIWSwIVFlcGAk8DUEyAAgAMUEsBFYEMCBZXBgJQTFBMUCcHTFCwIokxGRREMRhEiAKGJwUjTwRUJwUjTwRUJwUjTwRUTCNTTwIiTwJUTCNTJExUJwdMULAiiTEZFEQxGESIAmUiiTEZFEQxGESIAtgiiTEZFEQxGESIAwgiiTEZFEQxGESIA5EiiTEZFEQxGEQ2GgEXNhoCVwIAiAPWIokxGRREMRhENhoBF4gD00kVFlcGAkxQJwdMULAiiTEZFEQxGEQ2GgEXiAO/IokxGRREMRhENhoBF4gDuCcFI08CVCcHTFCwIokxGUAABjEYFEQiiSOJigMAi/0WK0y/JwS8SCcEi/6/KLxIKIv/v4v+VwIAKrxIKksBvycEvkQnBL5EI1lMI1kSRCu+TBdMRIEDCBYrTL8rvUSBCBJEJwS9RIv+FRJEKL1Ei/8VTEsBEkQqvURLAhVMSwESRCgjIrqL/1cAARJEKL1IIgkoTCK6SwIiCUkiCIv/TgJSEkQovUgiSwEMSwEiTwJNCSgjTwK6IksDDyJLBE8CTUsDTAmL/yNPAlISRCi9SCRLAQwkTE0oI08CuiRLAw8kTwRPAk2L/yNPAlISRCojIrpLAlcAARJEKr1IIgkqTCK6SwEiCUkiCEsETgJSEkQqvUgiSwEMSwEiTwJNCSojTwK6IksCDyJLA08CTUsCTAlLAyNPAlISRCq9SCVLAQwlTE0qI08CuiVLAg8lSwNPAk1LAyNPAlISRCq9SCRLAQwkTE0qI08CuiRLAg8kTwNPAk1PAiNPAlISRImKAAArvEgnBLxIKLxIK75MF4EqTE8CTYEqEkQnBL4nCk4CTVcCAIACNDISRCi+JwpOAk0nChJEK75MF0wURBREiYoAAyuIAA0iCScEvkRXAgAovkSJigEBi/++TBdMRCIIiYoAAyu9RQEnBL1FASi9RQGJigAAJwi8SCcIgBNUZXN0aW5nIHRlc3RpbmcgMTIzvycIvUhJI0sCTYEHSwIMTwKBB08CTUsBCScITgK6gAdUZXN0aW5nEkQovEgogAcABUhlbGxvvyi9SCRLAQxLASRPAk2BCksCDE8CgQpPAk1LAQkoTgK6gAVIZWxsbxJEiYoAACcGgAQAAQIDvycGvkRXAAEnBahEJwa+RFcBAYABAahEJwa+RFcCAYABAqhEJwa+RFcDAYABA6hEiYoAACm9RQEURCm9RQEURCm9RQEURCm9RQEURCmBILlEKb1FAUQxADIKKSNLA7spgcA+0ykjSUsD0imBQCcJuykjgUW6SwFLA1AnCVASRCm8RCm+FESAABJEKb5LA04CTUsCEkRQKUy/Kb1FAUQpvUSBQBJEKYgAFYFAEkQnC4EguUgnC71FAUQnC7xIiYoBAYv/vUSJigAAIxZJvEhJgAZIbW1tbW2/Sb1EgQYSREm9RIEGEkQiFkm+JwxOAk0nDBJESb5FARRETL1FAURJvEhJJwm/gAAjiAAHJwkSRLxIiYoCAYv/IggWi/5MUL5EiYoCAIv+Fkm8SIv/v4mKAQGL/xa+RImKAQCL/xa8SImKAQGL/xa9RQGJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/examples/box_storage/puya.log b/examples/box_storage/puya.log index cc6cf4f4ed..ef35f4870b 100644 --- a/examples/box_storage/puya.log +++ b/examples/box_storage/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['box_storage'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['box_storage'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv box_storage/contract.py:137:9 warning: expression result is ignored box_storage/contract.py:139:9 warning: expression result is ignored @@ -3016,6 +3016,7 @@ debug: Inserted box_map_exists_block@0.ops[6]: 'l-store-copy maybe_exists%0#0 1' debug: Replaced box_map_exists_block@0.ops[9]: 'v-load maybe_exists%0#0' with 'l-load maybe_exists%0#0' debug: Found 3 edge set/s for examples.box_storage.contract.BoxContract.__puya_arc4_router__ info: Writing box_storage/out/BoxContract.arc32.json +info: Writing box_storage/out/BoxContract.arc56.json info: Writing box_storage/out/BoxContract.approval.teal info: Writing box_storage/out/BoxContract.clear.teal info: Writing box_storage/out/BoxContract.approval.bin diff --git a/examples/calculator/puya.log b/examples/calculator/puya.log index 5ffc94d805..5d73287b54 100644 --- a/examples/calculator/puya.log +++ b/examples/calculator/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['calculator'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['calculator'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing calculator/out/module.awst debug: Sealing block@0: // L12 diff --git a/examples/global_state/puya.log b/examples/global_state/puya.log index 9b0d72ed78..403d6a73d5 100644 --- a/examples/global_state/puya.log +++ b/examples/global_state/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['global_state'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['global_state'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing global_state/out/module.awst debug: Sealing block@0: // L12 diff --git a/examples/hello_world/puya.log b/examples/hello_world/puya.log index 7c180b7731..95e846f3b2 100644 --- a/examples/hello_world/puya.log +++ b/examples/hello_world/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['hello_world'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['hello_world'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing hello_world/out/module.awst debug: Sealing block@0: // L12 diff --git a/examples/hello_world_arc4/out/HelloWorldContract.arc56.json b/examples/hello_world_arc4/out/HelloWorldContract.arc56.json new file mode 100644 index 0000000000..ed6418367a --- /dev/null +++ b/examples/hello_world_arc4/out/HelloWorldContract.arc56.json @@ -0,0 +1,107 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "HelloWorldContract", + "structs": {}, + "methods": [ + { + "name": "hello", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 35 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 75 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 38 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuaGVsbG9fd29ybGRfYXJjNC5jb250cmFjdC5IZWxsb1dvcmxkQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHgwMmJlY2UxMSAvLyBtZXRob2QgImhlbGxvKHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb19yb3V0ZUAyOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBoZWxsb193b3JsZF9hcmM0L2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIEhlbGxvV29ybGRDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBoZWxsbwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBoZWxsb193b3JsZF9hcmM0L2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIEhlbGxvV29ybGRDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBIZWxsb1dvcmxkQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5oZWxsbyhuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmhlbGxvOgogICAgLy8gaGVsbG9fd29ybGRfYXJjNC9jb250cmFjdC5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgaGVsbG8oc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGhlbGxvX3dvcmxkX2FyYzQvY29udHJhY3QucHk6MTIKICAgIC8vIHJldHVybiAiSGVsbG8sICIgKyBuYW1lCiAgICBwdXNoYnl0ZXMgIkhlbGxvLCAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5oZWxsb193b3JsZF9hcmM0LmNvbnRyYWN0LkhlbGxvV29ybGRDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiACAAGIAAFDigABMRtBADKABAK+zhE2GgCOAQACIokxGRREMRhENhoBVwIAiAAgSRUWVwYCTFCABBUffHVMULAjiTEZQAAGMRgURCOJIomKAQGAB0hlbGxvLCCL/1CJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/examples/hello_world_arc4/puya.log b/examples/hello_world_arc4/puya.log index c6d311d835..bb268ff961 100644 --- a/examples/hello_world_arc4/puya.log +++ b/examples/hello_world_arc4/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['hello_world_arc4'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['hello_world_arc4'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing hello_world_arc4/out/module.awst debug: Sealing block@0: // L12 @@ -586,6 +586,7 @@ debug: Inserted hello_block@0.ops[3]: 'l-store-copy tmp%0#0 0' debug: Replaced hello_block@0.ops[5]: 'v-load tmp%0#0' with 'l-load tmp%0#0' debug: Found 3 edge set/s for examples.hello_world_arc4.contract.HelloWorldContract.__puya_arc4_router__ info: Writing hello_world_arc4/out/HelloWorldContract.arc32.json +info: Writing hello_world_arc4/out/HelloWorldContract.arc56.json info: Writing hello_world_arc4/out/HelloWorldContract.approval.teal info: Writing hello_world_arc4/out/HelloWorldContract.clear.teal info: Writing hello_world_arc4/out/HelloWorldContract.approval.bin diff --git a/examples/local_state/puya.log b/examples/local_state/puya.log index 0d4be6fa25..d7deaea12a 100644 --- a/examples/local_state/puya.log +++ b/examples/local_state/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['local_state'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['local_state'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing local_state/out/module.awst debug: Sealing block@0: // L12 diff --git a/examples/merkle/out/MerkleTree.arc56.json b/examples/merkle/out/MerkleTree.arc56.json new file mode 100644 index 0000000000..361b500872 --- /dev/null +++ b/examples/merkle/out/MerkleTree.arc56.json @@ -0,0 +1,143 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "MerkleTree", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [ + { + "type": "byte[32]", + "name": "root" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "verify", + "args": [ + { + "type": "byte[32][]", + "name": "proof" + }, + { + "type": "byte[32]", + "name": "leaf" + } + ], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "root": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "cm9vdA==" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 51, + 67 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 114 + ], + "errorMessage": "check self.root exists" + }, + { + "pc": [ + 55 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 70 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSAzMgogICAgYnl0ZWNibG9jayAicm9vdCIKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5NZXJrbGVUcmVlLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDg0MjQyMDNiIDB4YzAyOTBhZDUgLy8gbWV0aG9kICJjcmVhdGUoYnl0ZVszMl0pdm9pZCIsIG1ldGhvZCAidmVyaWZ5KGJ5dGVbMzJdW10sYnl0ZVszMl0pYm9vbCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdmVyaWZ5X3JvdXRlQDM6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjkKICAgIC8vIGNsYXNzIE1lcmtsZVRyZWUoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdmVyaWZ5CiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weTo5CiAgICAvLyBjbGFzcyBNZXJrbGVUcmVlKGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5jcmVhdGUocm9vdDogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYsIHJvb3Q6IEJ5dGVzMzIpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxMgogICAgLy8gc2VsZi5yb290ID0gcm9vdC5ieXRlcwogICAgYnl0ZWNfMCAvLyAicm9vdCIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLm1lcmtsZS5jb250cmFjdC5NZXJrbGVUcmVlLnZlcmlmeShwcm9vZjogYnl0ZXMsIGxlYWY6IGJ5dGVzKSAtPiB1aW50NjQ6CnZlcmlmeToKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToxNC0xNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdmVyaWZ5KHNlbGYsIHByb29mOiBQcm9vZiwgbGVhZjogQnl0ZXMzMikgLT4gYm9vbDoKICAgIHByb3RvIDIgMQogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjE2CiAgICAvLyByZXR1cm4gc2VsZi5yb290ID09IGNvbXB1dGVfcm9vdF9oYXNoKHByb29mLCBsZWFmLmJ5dGVzKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInJvb3QiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYucm9vdCBleGlzdHMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGNvbXB1dGVfcm9vdF9oYXNoCiAgICBmcmFtZV9idXJ5IC0yCiAgICA9PQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMubWVya2xlLmNvbnRyYWN0LmNvbXB1dGVfcm9vdF9oYXNoKHByb29mOiBieXRlcywgbGVhZjogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKY29tcHV0ZV9yb290X2hhc2g6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MTktMjAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgY29tcHV0ZV9yb290X2hhc2gocHJvb2Y6IFByb29mLCBsZWFmOiBCeXRlcykgLT4gQnl0ZXM6CiAgICBwcm90byAyIDIKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UocHJvb2YubGVuZ3RoKToKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfZGlnIC0xCgpjb21wdXRlX3Jvb3RfaGFzaF9mb3JfaGVhZGVyQDE6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjIKICAgIC8vIGZvciBpZHggaW4gdXJhbmdlKHByb29mLmxlbmd0aCk6CiAgICBmcmFtZV9kaWcgMQogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IGNvbXB1dGVfcm9vdF9oYXNoX2FmdGVyX2ZvckA0CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjMKICAgIC8vIGNvbXB1dGVkID0gaGFzaF9wYWlyKGNvbXB1dGVkLCBwcm9vZltpZHhdLmJ5dGVzKQogICAgZnJhbWVfZGlnIC0yCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDEKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18yIC8vIDMyCiAgICAqCiAgICBpbnRjXzIgLy8gMzIKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGNhbGxzdWIgaGFzaF9wYWlyCiAgICBmcmFtZV9idXJ5IDIKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyMgogICAgLy8gZm9yIGlkeCBpbiB1cmFuZ2UocHJvb2YubGVuZ3RoKToKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGIgY29tcHV0ZV9yb290X2hhc2hfZm9yX2hlYWRlckAxCgpjb21wdXRlX3Jvb3RfaGFzaF9hZnRlcl9mb3JANDoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyNAogICAgLy8gcmV0dXJuIGNvbXB1dGVkCiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMubWVya2xlLmNvbnRyYWN0Lmhhc2hfcGFpcihhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgpoYXNoX3BhaXI6CiAgICAvLyBtZXJrbGUvY29udHJhY3QucHk6MjctMjgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaGFzaF9wYWlyKGE6IEJ5dGVzLCBiOiBCeXRlcykgLT4gQnl0ZXM6CiAgICBwcm90byAyIDEKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihhICsgYiBpZiBCaWdVSW50LmZyb21fYnl0ZXMoYSkgPCBCaWdVSW50LmZyb21fYnl0ZXMoYikgZWxzZSBiICsgYSkKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBiPAogICAgYnogaGFzaF9wYWlyX3Rlcm5hcnlfZmFsc2VAMgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgYiBoYXNoX3BhaXJfdGVybmFyeV9tZXJnZUAzCgpoYXNoX3BhaXJfdGVybmFyeV9mYWxzZUAyOgogICAgLy8gbWVya2xlL2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXR1cm4gb3Auc2hhMjU2KGEgKyBiIGlmIEJpZ1VJbnQuZnJvbV9ieXRlcyhhKSA8IEJpZ1VJbnQuZnJvbV9ieXRlcyhiKSBlbHNlIGIgKyBhKQogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAoKaGFzaF9wYWlyX3Rlcm5hcnlfbWVyZ2VAMzoKICAgIC8vIG1lcmtsZS9jb250cmFjdC5weToyOQogICAgLy8gcmV0dXJuIG9wLnNoYTI1NihhICsgYiBpZiBCaWdVSW50LmZyb21fYnl0ZXMoYSkgPCBCaWdVSW50LmZyb21fYnl0ZXMoYikgZWxzZSBiICsgYSkKICAgIHNoYTI1NgogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5tZXJrbGUuY29udHJhY3QuTWVya2xlVHJlZS5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiADAAEgJgEEcm9vdIgAAUOKAAExG0EASYICBIQkIDsEwCkK1TYaAI4CAAIAEiKJMRkURDEYFEQ2GgGIACYjiTEZFEQxGEQ2GgE2GgKIAByAAQAiTwJUgAQVH3x1TFCwI4kiiYoBACiL/2eJigIBIihlRIv+i/+IAASM/hKJigICi/4iWSKL/4sBiwAMQQAdi/5XAgCLAUlOAiQLJFiLAkyIABKMAiMIjAFC/9uLAov+jAGMAImKAgGL/ov/pEEACIv+i/9QQgAFi/+L/lABiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/examples/merkle/puya.log b/examples/merkle/puya.log index 9bfcfc3b75..859b54eeb0 100644 --- a/examples/merkle/puya.log +++ b/examples/merkle/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['merkle'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['merkle'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing merkle/out/module.awst debug: Sealing block@0: // L12 @@ -749,6 +749,7 @@ debug: shared x-stack for hash_pair_ternary_false@2 -> hash_pair_ternary_merge@3 debug: examples.merkle.contract.compute_root_hash f-stack entry: [] debug: examples.merkle.contract.compute_root_hash f-stack on first store: ['tmp%0#0', 'idx#0', 'computed#1'] info: Writing merkle/out/MerkleTree.arc32.json +info: Writing merkle/out/MerkleTree.arc56.json info: Writing merkle/out/MerkleTree.approval.teal info: Writing merkle/out/MerkleTree.clear.teal info: Writing merkle/out/MerkleTree.approval.bin diff --git a/examples/sizes.txt b/examples/sizes.txt index 02b1d89fac..74f9d9cce1 100644 --- a/examples/sizes.txt +++ b/examples/sizes.txt @@ -21,7 +21,7 @@ arc4_types/Arc4StructsType 302 239 - | 204 121 - arc4_types/Arc4TuplesType 795 136 - | 537 58 - arc_28/EventEmitter 186 133 - | 100 64 - - arc_56 675 458 - | 364 190 - + arc_56 678 465 - | 355 190 - asset/Reference 268 261 - | 144 141 - auction/Auction 592 522 - | 328 281 - augmented_assignment/Augmented 151 156 - | 77 78 - @@ -130,4 +130,4 @@ unssa/UnSSA 432 368 - | 241 204 - voting/VotingRoundApp 1593 1483 - | 734 649 - with_reentrancy/WithReentrancy 255 242 - | 132 122 - - Total 68488 52927 52868 | 32364 21360 21316 + Total 68491 52934 52875 | 32355 21360 21316 \ No newline at end of file diff --git a/examples/struct_in_box/out/ExampleContract.arc56.json b/examples/struct_in_box/out/ExampleContract.arc56.json new file mode 100644 index 0000000000..d3b122752b --- /dev/null +++ b/examples/struct_in_box/out/ExampleContract.arc56.json @@ -0,0 +1,186 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "ExampleContract", + "structs": { + "UserStruct": [ + { + "name": "name", + "type": "string" + }, + { + "name": "id", + "type": "uint64" + }, + { + "name": "asset", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "add_user", + "args": [ + { + "type": "(string,uint64,uint64)", + "struct": "UserStruct", + "name": "user" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "attach_asset_to_user", + "args": [ + { + "type": "uint64", + "name": "user_id" + }, + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_user", + "args": [ + { + "type": "uint64", + "name": "user_id" + } + ], + "returns": { + "type": "(string,uint64,uint64)", + "struct": "UserStruct" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 50, + 65, + 86 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 132 + ], + "errorMessage": "User with id must not exist" + }, + { + "pc": [ + 191 + ], + "errorMessage": "User with that id does not exist" + }, + { + "pc": [ + 115 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 53, + 68, + 89 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGRhODUzNGJkIDB4NGViNGU5ZjEgMHgxNjU0NTg4MCAvLyBtZXRob2QgImFkZF91c2VyKChzdHJpbmcsdWludDY0LHVpbnQ2NCkpdm9pZCIsIG1ldGhvZCAiYXR0YWNoX2Fzc2V0X3RvX3VzZXIodWludDY0LGFzc2V0KXZvaWQiLCBtZXRob2QgImdldF91c2VyKHVpbnQ2NCkoc3RyaW5nLHVpbnQ2NCx1aW50NjQpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX3VzZXJfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hdHRhY2hfYXNzZXRfdG9fdXNlcl9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF91c2VyX3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FkZF91c2VyX3JvdXRlQDI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBhZGRfdXNlcgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYXR0YWNoX2Fzc2V0X3RvX3VzZXJfcm91dGVAMzoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEwCiAgICAvLyBjbGFzcyBFeGFtcGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgYXR0YWNoX2Fzc2V0X3RvX3VzZXIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF91c2VyX3JvdXRlQDQ6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxMAogICAgLy8gY2xhc3MgRXhhbXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBnZXRfdXNlcgogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANzoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTAKICAgIC8vIGNsYXNzIEV4YW1wbGVDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTEKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTE6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEwCiAgICAvLyBjbGFzcyBFeGFtcGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hZGRfdXNlcih1c2VyOiBieXRlcykgLT4gdm9pZDoKYWRkX3VzZXI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjMxLTMyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGFkZF91c2VyKHNlbGYsIHVzZXI6IFVzZXJTdHJ1Y3QpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5ib3hfZXhpc3RzKHVzZXIuaWQpLCAiVXNlciB3aXRoIGlkIG11c3Qgbm90IGV4aXN0IgogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGNhbGxzdWIgYm94X2V4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIFVzZXIgd2l0aCBpZCBtdXN0IG5vdCBleGlzdAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weTozNAogICAgLy8gc2VsZi53cml0ZV90b19ib3godXNlcikKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiB3cml0ZV90b19ib3gKICAgIGZyYW1lX2J1cnkgLTEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnN0cnVjdF9pbl9ib3guY29udHJhY3QuRXhhbXBsZUNvbnRyYWN0LmJveF9leGlzdHModXNlcl9pZDogYnl0ZXMpIC0+IHVpbnQ2NDoKYm94X2V4aXN0czoKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjYtMjcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYm94X2V4aXN0cyhzZWxmLCB1c2VyX2lkOiBhcmM0LlVJbnQ2NCkgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToyOAogICAgLy8gX2RhdGEsIGV4aXN0cyA9IG9wLkJveC5nZXQodXNlcl9pZC5ieXRlcykKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X2dldAogICAgYnVyeSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjI5CiAgICAvLyByZXR1cm4gZXhpc3RzCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC53cml0ZV90b19ib3godXNlcjogYnl0ZXMpIC0+IGJ5dGVzOgp3cml0ZV90b19ib3g6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjE4LTE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHdyaXRlX3RvX2JveChzZWxmLCB1c2VyOiBVc2VyU3RydWN0KSAtPiBOb25lOgogICAgcHJvdG8gMSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjIwCiAgICAvLyBib3hfa2V5ID0gdXNlci5pZC5ieXRlcwogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjEtMjIKICAgIC8vICMgRGVsZXRlIGV4aXN0aW5nIGRhdGEsIHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgcmVzaXppbmcgdGhlIGJveAogICAgLy8gb3AuQm94LmRlbGV0ZShib3hfa2V5KQogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MjQKICAgIC8vIG9wLkJveC5wdXQoYm94X2tleSwgdXNlci5ieXRlcykKICAgIGZyYW1lX2RpZyAtMQogICAgYm94X3B1dAogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5hdHRhY2hfYXNzZXRfdG9fdXNlcih1c2VyX2lkOiBieXRlcywgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKYXR0YWNoX2Fzc2V0X3RvX3VzZXI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjM2LTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGF0dGFjaF9hc3NldF90b191c2VyKHNlbGYsIHVzZXJfaWQ6IGFyYzQuVUludDY0LCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MzgKICAgIC8vIHVzZXIgPSBzZWxmLnJlYWRfZnJvbV9ib3godXNlcl9pZCkKICAgIGZyYW1lX2RpZyAtMgogICAgY2FsbHN1YiByZWFkX2Zyb21fYm94CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjM5CiAgICAvLyB1c2VyLmFzc2V0ID0gYXJjNC5VSW50NjQoYXNzZXQuaWQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0b2IKICAgIHJlcGxhY2UyIDEwCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQwCiAgICAvLyBzZWxmLndyaXRlX3RvX2JveCh1c2VyKQogICAgY2FsbHN1YiB3cml0ZV90b19ib3gKICAgIHBvcAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMuc3RydWN0X2luX2JveC5jb250cmFjdC5FeGFtcGxlQ29udHJhY3QucmVhZF9mcm9tX2JveCh1c2VyX2lkOiBieXRlcykgLT4gYnl0ZXM6CnJlYWRfZnJvbV9ib3g6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjEyLTEzCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHJlYWRfZnJvbV9ib3goc2VsZiwgdXNlcl9pZDogYXJjNC5VSW50NjQpIC0+IFVzZXJTdHJ1Y3Q6CiAgICBwcm90byAxIDEKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTQKICAgIC8vIGJveF9kYXRhLCBleGlzdHMgPSBvcC5Cb3guZ2V0KHVzZXJfaWQuYnl0ZXMpCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9nZXQKICAgIC8vIHN0cnVjdF9pbl9ib3gvY29udHJhY3QucHk6MTUKICAgIC8vIGFzc2VydCBleGlzdHMsICJVc2VyIHdpdGggdGhhdCBpZCBkb2VzIG5vdCBleGlzdCIKICAgIGFzc2VydCAvLyBVc2VyIHdpdGggdGhhdCBpZCBkb2VzIG5vdCBleGlzdAogICAgLy8gc3RydWN0X2luX2JveC9jb250cmFjdC5weToxNgogICAgLy8gcmV0dXJuIFVzZXJTdHJ1Y3QuZnJvbV9ieXRlcyhib3hfZGF0YSkKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnN0cnVjdF9pbl9ib3guY29udHJhY3QuRXhhbXBsZUNvbnRyYWN0LmdldF91c2VyKHVzZXJfaWQ6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3VzZXI6CiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQyLTQzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdldF91c2VyKHNlbGYsIHVzZXJfaWQ6IGFyYzQuVUludDY0KSAtPiBVc2VyU3RydWN0OgogICAgcHJvdG8gMSAxCiAgICAvLyBzdHJ1Y3RfaW5fYm94L2NvbnRyYWN0LnB5OjQ0CiAgICAvLyByZXR1cm4gc2VsZi5yZWFkX2Zyb21fYm94KHVzZXJfaWQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgcmVhZF9mcm9tX2JveAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy5zdHJ1Y3RfaW5fYm94LmNvbnRyYWN0LkV4YW1wbGVDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiACAQCIAAFDigABMRtBAFqCAwTahTS9BE606fEEFlRYgDYaAI4DAAIAEQAmI4kxGRREMRhENhoBiAA8IokxGRREMRhENhoBNhoCF8AwiABWIokxGRREMRhENhoBiABhgAQVH3x1TFCwIokxGUAABjEYFEQiiSOJigEAi/9XAgiIAAoURIv/iAAMjP+JigEBi/++RQGJigEBi/9XAghJvEiL/7+L/4mKAgCL/ogACov/FlwKiP/fSImKAQGL/75EiYoBAYv/iP/wiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/examples/struct_in_box/out/client_ExampleContract.py b/examples/struct_in_box/out/client_ExampleContract.py index fb5e2d2137..3033b5dd8e 100644 --- a/examples/struct_in_box/out/client_ExampleContract.py +++ b/examples/struct_in_box/out/client_ExampleContract.py @@ -28,4 +28,4 @@ def attach_asset_to_user( def get_user( self, user_id: algopy.arc4.UIntN[typing.Literal[64]], - ) -> UserStruct: ... + ) -> algopy.arc4.Tuple[algopy.arc4.String, algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]]]: ... diff --git a/examples/struct_in_box/puya.log b/examples/struct_in_box/puya.log index 0685adb2f5..aac6e5d8b6 100644 --- a/examples/struct_in_box/puya.log +++ b/examples/struct_in_box/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['struct_in_box'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['struct_in_box'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv struct_in_box/contract.py:22:9 warning: expression result is ignored info: writing struct_in_box/out/module.awst @@ -817,6 +817,7 @@ debug: Inserted get_user_block@0.ops[2]: 'l-store-copy tmp%0#0 0' debug: Replaced get_user_block@0.ops[4]: 'v-load tmp%0#0' with 'l-load tmp%0#0' debug: Found 3 edge set/s for examples.struct_in_box.contract.ExampleContract.__puya_arc4_router__ info: Writing struct_in_box/out/ExampleContract.arc32.json +info: Writing struct_in_box/out/ExampleContract.arc56.json info: Writing struct_in_box/out/ExampleContract.approval.teal info: Writing struct_in_box/out/ExampleContract.clear.teal info: Writing struct_in_box/out/ExampleContract.approval.bin diff --git a/examples/tictactoe/out/TicTacToeContract.arc56.json b/examples/tictactoe/out/TicTacToeContract.arc56.json new file mode 100644 index 0000000000..d2a3ad7b94 --- /dev/null +++ b/examples/tictactoe/out/TicTacToeContract.arc56.json @@ -0,0 +1,268 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "TicTacToeContract", + "structs": {}, + "methods": [ + { + "name": "new_game", + "args": [ + { + "type": "(uint64,uint64)", + "name": "move" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "join_game", + "args": [ + { + "type": "(uint64,uint64)", + "name": "move" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "whose_turn", + "args": [], + "returns": { + "type": "uint8" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "play", + "args": [ + { + "type": "(uint64,uint64)", + "name": "move" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 4 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "host": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "aG9zdA==" + }, + "game": { + "keyType": "AVMString", + "valueType": "uint8[3][3]", + "key": "Z2FtZQ==" + }, + "turns": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dHVybnM=" + }, + "challenger": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Y2hhbGxlbmdlcg==" + }, + "winner": { + "keyType": "AVMString", + "valueType": "uint8", + "key": "d2lubmVy" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 636 + ], + "errorMessage": "Game is already finished" + }, + { + "pc": [ + 214 + ], + "errorMessage": "Game isn't over" + }, + { + "pc": [ + 301 + ], + "errorMessage": "Host already has a challenger" + }, + { + "pc": [ + 267, + 281, + 372, + 386 + ], + "errorMessage": "Index access is out of bounds" + }, + { + "pc": [ + 670 + ], + "errorMessage": "It is the challenger's turn" + }, + { + "pc": [ + 655 + ], + "errorMessage": "It is the host's turn" + }, + { + "pc": [ + 251, + 339 + ], + "errorMessage": "Move must be in range" + }, + { + "pc": [ + 99, + 121, + 146, + 167 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 361 + ], + "errorMessage": "Square is already taken" + }, + { + "pc": [ + 255, + 276, + 343, + 365, + 381, + 448 + ], + "errorMessage": "check self.game exists" + }, + { + "pc": [ + 653 + ], + "errorMessage": "check self.host exists" + }, + { + "pc": [ + 396, + 424, + 615, + 640 + ], + "errorMessage": "check self.turns exists" + }, + { + "pc": [ + 124, + 149, + 170 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMgOQogICAgYnl0ZWNibG9jayAiZ2FtZSIgInR1cm5zIiAiY2hhbGxlbmdlciIgIndpbm5lciIgMHgwMSAweDAyICJob3N0IgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHB1c2hieXRlc3MgMHg5NmE5NzE4MSAweDE3YTA3OWIzIDB4YmI5ZjExNDcgMHg5ZWViZjU4ZSAvLyBtZXRob2QgIm5ld19nYW1lKCh1aW50NjQsdWludDY0KSl2b2lkIiwgbWV0aG9kICJqb2luX2dhbWUoKHVpbnQ2NCx1aW50NjQpKXZvaWQiLCBtZXRob2QgIndob3NlX3R1cm4oKXVpbnQ4IiwgbWV0aG9kICJwbGF5KCh1aW50NjQsdWludDY0KSl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbmV3X2dhbWVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19qb2luX2dhbWVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX193aG9zZV90dXJuX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fcGxheV9yb3V0ZUA1CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXdfZ2FtZV9yb3V0ZUAyOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0iYWxsb3ciKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjIwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJhbGxvdyIpCiAgICBjYWxsc3ViIG5ld19nYW1lCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19qb2luX2dhbWVfcm91dGVAMzoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHN3YXAKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGpvaW5fZ2FtZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fd2hvc2VfdHVybl9yb3V0ZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHdob3NlX3R1cm4KICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fcGxheV9yb3V0ZUA1OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjE1CiAgICAvLyBjbGFzcyBUaWNUYWNUb2VDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgc3dhcAogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGxheQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToxNQogICAgLy8gY2xhc3MgVGljVGFjVG9lQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnRpY3RhY3RvZS50aWN0YWN0b2UuVGljVGFjVG9lQ29udHJhY3QubmV3X2dhbWUobW92ZS4wOiB1aW50NjQsIG1vdmUuMTogdWludDY0KSAtPiB2b2lkOgpuZXdfZ2FtZToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjAtMjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9ImFsbG93IikKICAgIC8vIGRlZiBuZXdfZ2FtZShzZWxmLCBtb3ZlOiBNb3ZlKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjIKICAgIC8vIGlmIFR4bi5hcHBsaWNhdGlvbl9pZDoKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBieiBuZXdfZ2FtZV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MjMtMjUKICAgIC8vICMgaWYgYSBjaGFsbGVuZ2VyIGhhcyBqb2luZWQsIGRvbid0IGFsbG93IHN0YXJ0aW5nIGEgbmV3IGdhbWUKICAgIC8vICMgdW50aWwgdGhpcyBvbmUgaXMgY29tcGxldGUKICAgIC8vIGlmIHNlbGYuY2hhbGxlbmdlcjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYnogbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUAzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjI2CiAgICAvLyBhc3NlcnQgc2VsZi53aW5uZXIsICJHYW1lIGlzbid0IG92ZXIiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgYXNzZXJ0IC8vIEdhbWUgaXNuJ3Qgb3ZlcgoKbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUAzOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyNy0yOAogICAgLy8gIyByZXNldCBjaGFsbGVuZ2VyIGFuZCB3aW5uZXIKICAgIC8vIGRlbCBzZWxmLmNoYWxsZW5nZXIudmFsdWUKICAgIGJ5dGVjXzIgLy8gImNoYWxsZW5nZXIiCiAgICBhcHBfZ2xvYmFsX2RlbAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weToyOQogICAgLy8gZGVsIHNlbGYud2lubmVyLnZhbHVlCiAgICBieXRlY18zIC8vICJ3aW5uZXIiCiAgICBhcHBfZ2xvYmFsX2RlbAoKbmV3X2dhbWVfYWZ0ZXJfaWZfZWxzZUA0OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMAogICAgLy8gc2VsZi5ob3N0ID0gVHhuLnNlbmRlcgogICAgYnl0ZWMgNiAvLyAiaG9zdCIKICAgIHR4biBTZW5kZXIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjMxCiAgICAvLyBzZWxmLmdhbWUgPSBHYW1lLmZyb21fYnl0ZXMob3AuYnplcm8oOSkpCiAgICBpbnRjXzMgLy8gOQogICAgYnplcm8KICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozMwogICAgLy8gYXNzZXJ0IGNvbHVtbiA8IDMgYW5kIHJvdyA8IDMsICJNb3ZlIG11c3QgYmUgaW4gcmFuZ2UiCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYnogbmV3X2dhbWVfYm9vbF9mYWxzZUA3CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBieiBuZXdfZ2FtZV9ib29sX2ZhbHNlQDcKICAgIGludGNfMSAvLyAxCiAgICBiIG5ld19nYW1lX2Jvb2xfbWVyZ2VAOAoKbmV3X2dhbWVfYm9vbF9mYWxzZUA3OgogICAgaW50Y18wIC8vIDAKCm5ld19nYW1lX2Jvb2xfbWVyZ2VAODoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6MzMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgYXNzZXJ0IC8vIE1vdmUgbXVzdCBiZSBpbiByYW5nZQogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozNAogICAgLy8gc2VsZi5nYW1lW3Jvd11bY29sdW1uXSA9IGFyYzQuVUludDgoSE9TVCkKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJnYW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdhbWUgZXhpc3RzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICAqCiAgICBzd2FwCiAgICBkaWcgMQogICAgaW50Y18yIC8vIDMKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIDAKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0yCiAgICBieXRlYyA0IC8vIDB4MDEKICAgIHJlcGxhY2UzCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgYXNzZXJ0IC8vIEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBjb3ZlciAyCiAgICByZXBsYWNlMwogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM1CiAgICAvLyBzZWxmLnR1cm5zID0gVUludDY0KDApCiAgICBieXRlY18xIC8vICJ0dXJucyIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5qb2luX2dhbWUobW92ZS4wOiB1aW50NjQsIG1vdmUuMTogdWludDY0KSAtPiB2b2lkOgpqb2luX2dhbWU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjM3LTM4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBqb2luX2dhbWUoc2VsZiwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTozOQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmNoYWxsZW5nZXIsICJIb3N0IGFscmVhZHkgaGFzIGEgY2hhbGxlbmdlciIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEhvc3QgYWxyZWFkeSBoYXMgYSBjaGFsbGVuZ2VyCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQwCiAgICAvLyBzZWxmLmNoYWxsZW5nZXIudmFsdWUgPSBUeG4uc2VuZGVyCiAgICBieXRlY18yIC8vICJjaGFsbGVuZ2VyIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDEKICAgIC8vIHNlbGYubWFrZV9tb3ZlKGFyYzQuVUludDgoQ0hBTExFTkdFUiksIG1vdmUpCiAgICBieXRlYyA1IC8vIDB4MDIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIG1ha2VfbW92ZQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5tYWtlX21vdmUocGxheWVyOiBieXRlcywgbW92ZS4wOiB1aW50NjQsIG1vdmUuMTogdWludDY0KSAtPiB2b2lkOgptYWtlX21vdmU6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjYwLTYxCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIG1ha2VfbW92ZShzZWxmLCBwbGF5ZXI6IGFyYzQuVUludDgsIG1vdmU6IE1vdmUpIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjMKICAgIC8vIGFzc2VydCBjb2x1bW4gPCAzIGFuZCByb3cgPCAzLCAiTW92ZSBtdXN0IGJlIGluIHJhbmdlIgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMwogICAgPAogICAgZHVwCiAgICBieiBtYWtlX21vdmVfYm9vbF9mYWxzZUAzCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAzCiAgICA8CiAgICBieiBtYWtlX21vdmVfYm9vbF9mYWxzZUAzCiAgICBpbnRjXzEgLy8gMQogICAgYiBtYWtlX21vdmVfYm9vbF9tZXJnZUA0CgptYWtlX21vdmVfYm9vbF9mYWxzZUAzOgogICAgaW50Y18wIC8vIDAKCm1ha2VfbW92ZV9ib29sX21lcmdlQDQ6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjYzCiAgICAvLyBhc3NlcnQgY29sdW1uIDwgMyBhbmQgcm93IDwgMywgIk1vdmUgbXVzdCBiZSBpbiByYW5nZSIKICAgIGFzc2VydCAvLyBNb3ZlIG11c3QgYmUgaW4gcmFuZ2UKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NjQKICAgIC8vIGFzc2VydCBzZWxmLmdhbWVbcm93XVtjb2x1bW5dID09IEVNUFRZLCAiU3F1YXJlIGlzIGFscmVhZHkgdGFrZW4iCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgKgogICAgc3dhcAogICAgZGlnIDEKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGI9PQogICAgYXNzZXJ0IC8vIFNxdWFyZSBpcyBhbHJlYWR5IHRha2VuCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjY1CiAgICAvLyBzZWxmLmdhbWVbcm93XVtjb2x1bW5dID0gcGxheWVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nYW1lIGV4aXN0cwogICAgZGlnIDEKICAgIGludGNfMiAvLyAzCiAgICBleHRyYWN0MyAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAwCiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0zCiAgICByZXBsYWNlMwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDMKICAgIDwKICAgIGFzc2VydCAvLyBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgY292ZXIgMgogICAgcmVwbGFjZTMKICAgIGJ5dGVjXzAgLy8gImdhbWUiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2NgogICAgLy8gc2VsZi50dXJucyArPSAxCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHVybnMgZXhpc3RzCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2NwogICAgLy8gaWYgc2VsZi5kaWRfd2luKHBsYXllciwgY29sdW1uPWNvbHVtbiwgcm93PXJvdyk6CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIGRpZF93aW4KICAgIGJ6IG1ha2VfbW92ZV9lbHNlX2JvZHlANgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2OAogICAgLy8gc2VsZi53aW5uZXIudmFsdWUgPSBwbGF5ZXIKICAgIGJ5dGVjXzMgLy8gIndpbm5lciIKICAgIGZyYW1lX2RpZyAtMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIGIgbWFrZV9tb3ZlX2FmdGVyX2lmX2Vsc2VAOQoKbWFrZV9tb3ZlX2Vsc2VfYm9keUA2OgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo2OQogICAgLy8gZWxpZiBzZWxmLnR1cm5zID09IDk6CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAidHVybnMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudHVybnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gOQogICAgPT0KICAgIGJ6IG1ha2VfbW92ZV9hZnRlcl9pZl9lbHNlQDkKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzAKICAgIC8vIHNlbGYud2lubmVyLnZhbHVlID0gYXJjNC5VSW50OChEUkFXKQogICAgYnl0ZWNfMyAvLyAid2lubmVyIgogICAgcHVzaGJ5dGVzIDB4MDMKICAgIGFwcF9nbG9iYWxfcHV0CgptYWtlX21vdmVfYWZ0ZXJfaWZfZWxzZUA5OgogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5kaWRfd2luKHBsYXllcjogYnl0ZXMsIGNvbHVtbjogdWludDY0LCByb3c6IHVpbnQ2NCkgLT4gdWludDY0OgpkaWRfd2luOgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3Mi03MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBkaWRfd2luKHNlbGYsIHBsYXllcjogYXJjNC5VSW50OCwgY29sdW1uOiBVSW50NjQsIHJvdzogVUludDY0KSAtPiBib29sOgogICAgcHJvdG8gMyAxCiAgICBpbnRjXzAgLy8gMAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3NAogICAgLy8gZyA9IHNlbGYuZ2FtZS5jb3B5KCkKICAgIGR1cG4gMwogICAgYnl0ZWNfMCAvLyAiZ2FtZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBzd2FwCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuZ2FtZSBleGlzdHMKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NzYKICAgIC8vIGlmIGdbcm93XVswXSA9PSBnW3Jvd11bMV0gPT0gZ1tyb3ddWzJdOgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMwogICAgKgogICAgaW50Y18yIC8vIDMKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwbiAyCiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHN3YXAKICAgIGV4dHJhY3QgMSAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBjb3ZlciAyCiAgICBiPT0KICAgIGJ6IGRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAzCiAgICBmcmFtZV9kaWcgNAogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgNQogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMwogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo3NwogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5Ojc5CiAgICAvLyBpZiBnWzBdW2NvbHVtbl0gPT0gZ1sxXVtjb2x1bW5dID09IGdbMl1bY29sdW1uXToKICAgIGZyYW1lX2RpZyAzCiAgICBkdXAKICAgIGV4dHJhY3QgMCAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZXh0cmFjdCAzIDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VANgogICAgZnJhbWVfZGlnIDMKICAgIGV4dHJhY3QgNiAzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgMAogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VANgogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo4MAogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMSAvLyAxCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjgyLTgzCiAgICAvLyAjIGlmIHBsYXllciBvd25zIGNlbnRlciwgY2hlY2sgZGlhZ29uYWxzCiAgICAvLyBpZiBwbGF5ZXIgPT0gZ1sxXVsxXToKICAgIGZyYW1lX2RpZyAyCiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMwogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODQKICAgIC8vIGlmIGdbMF1bMF0gPT0gcGxheWVyID09IGdbMl1bMl06CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAwIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDEwCiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA2IDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDIgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMwogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTAKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODUKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODYKICAgIC8vIGlmIGdbMF1bMl0gPT0gcGxheWVyID09IGdbMl1bMF06CiAgICBmcmFtZV9kaWcgMQogICAgZXh0cmFjdCAyIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9kaWcgLTMKICAgIGI9PQogICAgYnogZGlkX3dpbl9hZnRlcl9pZl9lbHNlQDE0CiAgICBmcmFtZV9kaWcgMwogICAgZXh0cmFjdCA2IDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGZyYW1lX2RpZyAtMwogICAgYj09CiAgICBieiBkaWRfd2luX2FmdGVyX2lmX2Vsc2VAMTQKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODcKICAgIC8vIHJldHVybiBUcnVlCiAgICBpbnRjXzEgLy8gMQogICAgZnJhbWVfYnVyeSAwCiAgICByZXRzdWIKCmRpZF93aW5fYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6ODgKICAgIC8vIHJldHVybiBGYWxzZQogICAgaW50Y18wIC8vIDAKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC53aG9zZV90dXJuKCkgLT4gYnl0ZXM6Cndob3NlX3R1cm46CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjQzLTQ0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB3aG9zZV90dXJuKHNlbGYpIC0+IGFyYzQuVUludDg6CiAgICBwcm90byAwIDEKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ4KEhPU1QpIGlmIHNlbGYudHVybnMgJSAyIGVsc2UgYXJjNC5VSW50OChDSEFMTEVOR0VSKQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gInR1cm5zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnR1cm5zIGV4aXN0cwogICAgcHVzaGludCAyIC8vIDIKICAgICUKICAgIGJ5dGVjIDUgLy8gMHgwMgogICAgYnl0ZWMgNCAvLyAweDAxCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudGljdGFjdG9lLnRpY3RhY3RvZS5UaWNUYWNUb2VDb250cmFjdC5wbGF5KG1vdmUuMDogdWludDY0LCBtb3ZlLjE6IHVpbnQ2NCkgLT4gdm9pZDoKcGxheToKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NDctNDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHBsYXkoc2VsZiwgbW92ZTogTW92ZSkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdGljdGFjdG9lL3RpY3RhY3RvZS5weTo0OQogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLndpbm5lciwgIkdhbWUgaXMgYWxyZWFkeSBmaW5pc2hlZCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJ3aW5uZXIiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYnVyeSAxCiAgICAhCiAgICBhc3NlcnQgLy8gR2FtZSBpcyBhbHJlYWR5IGZpbmlzaGVkCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjUwCiAgICAvLyBpZiBzZWxmLnR1cm5zICUgMjoKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJ0dXJucyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi50dXJucyBleGlzdHMKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAlCiAgICBieiBwbGF5X2Vsc2VfYm9keUAyCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjUxCiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmhvc3QsICJJdCBpcyB0aGUgaG9zdCdzIHR1cm4iCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAiaG9zdCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ob3N0IGV4aXN0cwogICAgPT0KICAgIGFzc2VydCAvLyBJdCBpcyB0aGUgaG9zdCdzIHR1cm4KICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTIKICAgIC8vIHBsYXllciA9IGFyYzQuVUludDgoSE9TVCkKICAgIGJ5dGVjIDQgLy8gMHgwMQogICAgYiBwbGF5X2FmdGVyX2lmX2Vsc2VAMwoKcGxheV9lbHNlX2JvZHlAMjoKICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTQKICAgIC8vIGFzc2VydCBUeG4uc2VuZGVyID09IHNlbGYuY2hhbGxlbmdlci5nZXQoCiAgICB0eG4gU2VuZGVyCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU1CiAgICAvLyBkZWZhdWx0PUFjY291bnQoKQogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImNoYWxsZW5nZXIiCiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU0LTU2CiAgICAvLyBhc3NlcnQgVHhuLnNlbmRlciA9PSBzZWxmLmNoYWxsZW5nZXIuZ2V0KAogICAgLy8gICAgIGRlZmF1bHQ9QWNjb3VudCgpCiAgICAvLyApLCAiSXQgaXMgdGhlIGNoYWxsZW5nZXIncyB0dXJuIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHNlbGVjdAogICAgPT0KICAgIGFzc2VydCAvLyBJdCBpcyB0aGUgY2hhbGxlbmdlcidzIHR1cm4KICAgIC8vIHRpY3RhY3RvZS90aWN0YWN0b2UucHk6NTcKICAgIC8vIHBsYXllciA9IGFyYzQuVUludDgoQ0hBTExFTkdFUikKICAgIGJ5dGVjIDUgLy8gMHgwMgoKcGxheV9hZnRlcl9pZl9lbHNlQDM6CiAgICAvLyB0aWN0YWN0b2UvdGljdGFjdG9lLnB5OjU4CiAgICAvLyBzZWxmLm1ha2VfbW92ZShwbGF5ZXIsIG1vdmUpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBtYWtlX21vdmUKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy50aWN0YWN0b2UudGljdGFjdG9lLlRpY1RhY1RvZUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAEAAEDCSYHBGdhbWUFdHVybnMKY2hhbGxlbmdlcgZ3aW5uZXIBAQECBGhvc3SIAAFDigABMRtBAIKCBASWqXGBBBegebMEu58RRwSe6/WONhoAjgQAAgAYADEARiKJMRkURDYaAUlXAAgXTFcICBeIAEsjiTEZFEQxGEQ2GgFJVwAIF0xXCAgXiACXI4kxGRREMRhEiAHIgAQVH3x1TFCwI4kxGRREMRhENhoBSVcACBdMVwgIF4gBuCOJIomKAgCAADEYQQASIiplRQFBAAYiK2VFAUQqaStpJwYxAGclryhMZ4v+JAxJjABBAAuL/yQMQQAEI0IAASJEIihlRIv/JAtMSwEkWIsARIv+JwRdIihlRIv/JAxETgJdKExnKSJniYoCACIqZUUBFEQqMQBnJwWL/ov/iAABiYoDAIv+JAxJQQALi/8kDEEABCNCAAEiRCIoZUSL/yQLTEsBJFiL/iNYgAEAqEQiKGVESwEkWIsARIv+i/1dIihlRIv/JAxETgJdKExnIillRCMIKUxni/2L/ov/iAAZQQAHK4v9Z0IADiIpZUQlEkEABSuAAQNniYoDASJHAyhlTElPAkSL/yQLJFhHAlcAAUxXAQFJTgKoQQAPiwRXAgGLBahBAAQjjACJiwNJVwADSYwBi/4jWExXAwNJjAKL/iNYSYwAqEEAE4sDVwYDi/4jWIsAqEEABCOMAImLAlcBAYv9qEEAOosBVwABi/2oQQASiwNXBgNXAgGL/ahBAAQjjACJiwFXAgGL/ahBABKLA1cGA1cAAYv9qEEABCOMAIkijACJigABIillRIECGCcFJwRPAk2JigIAIitlRQEURCIpZUSBAhhBAA4xACInBmVEEkQnBEIADDEAMgMiKmVNEkQnBYv+i/+I/pSJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/examples/tictactoe/puya.log b/examples/tictactoe/puya.log index 7c52543c53..196156f18d 100644 --- a/examples/tictactoe/puya.log +++ b/examples/tictactoe/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['tictactoe'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['tictactoe'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing tictactoe/out/module.awst debug: Sealing block@0: // L12 @@ -1609,6 +1609,7 @@ debug: examples.tictactoe.tictactoe.TicTacToeContract.make_move f-stack on first debug: examples.tictactoe.tictactoe.TicTacToeContract.did_win f-stack entry: ['awst_tmp%1#0', 'tmp%5#0', 'tmp%6#0'] debug: examples.tictactoe.tictactoe.TicTacToeContract.did_win f-stack on first store: ['g#0', 'tmp%0#0', 'awst_tmp%0#0'] info: Writing tictactoe/out/TicTacToeContract.arc32.json +info: Writing tictactoe/out/TicTacToeContract.arc56.json info: Writing tictactoe/out/TicTacToeContract.approval.teal info: Writing tictactoe/out/TicTacToeContract.clear.teal info: Writing tictactoe/out/TicTacToeContract.approval.bin diff --git a/examples/voting/out/VotingRoundApp.arc56.json b/examples/voting/out/VotingRoundApp.arc56.json new file mode 100644 index 0000000000..3e6062a3fb --- /dev/null +++ b/examples/voting/out/VotingRoundApp.arc56.json @@ -0,0 +1,495 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "VotingRoundApp", + "structs": { + "VotingPreconditions": [ + { + "name": "is_voting_open", + "type": "uint64" + }, + { + "name": "is_allowed_to_vote", + "type": "uint64" + }, + { + "name": "has_already_voted", + "type": "uint64" + }, + { + "name": "current_time", + "type": "uint64" + } + ] + }, + "methods": [ + { + "name": "create", + "args": [ + { + "type": "string", + "name": "vote_id" + }, + { + "type": "byte[]", + "name": "snapshot_public_key" + }, + { + "type": "string", + "name": "metadata_ipfs_cid" + }, + { + "type": "uint64", + "name": "start_time" + }, + { + "type": "uint64", + "name": "end_time" + }, + { + "type": "uint8[]", + "name": "option_counts" + }, + { + "type": "uint64", + "name": "quorum" + }, + { + "type": "string", + "name": "nft_image_url" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "bootstrap", + "args": [ + { + "type": "pay", + "name": "fund_min_bal_req" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "close", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_preconditions", + "args": [ + { + "type": "byte[]", + "name": "signature" + } + ], + "returns": { + "type": "(uint64,uint64,uint64,uint64)", + "struct": "VotingPreconditions" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "vote", + "args": [ + { + "type": "pay", + "name": "fund_min_bal_req" + }, + { + "type": "byte[]", + "name": "signature" + }, + { + "type": "uint8[]", + "name": "answer_ids" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 8, + "bytes": 5 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "is_bootstrapped": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aXNfYm9vdHN0cmFwcGVk" + }, + "voter_count": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dm90ZXJfY291bnQ=" + }, + "vote_id": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "dm90ZV9pZA==" + }, + "snapshot_public_key": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "c25hcHNob3RfcHVibGljX2tleQ==" + }, + "metadata_ipfs_cid": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "bWV0YWRhdGFfaXBmc19jaWQ=" + }, + "start_time": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "c3RhcnRfdGltZQ==" + }, + "end_time": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZW5kX3RpbWU=" + }, + "quorum": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "cXVvcnVt" + }, + "nft_image_url": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "bmZ0X2ltYWdlX3VybA==" + }, + "nft_asset_id": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bmZ0X2Fzc2V0X2lk" + }, + "option_counts": { + "keyType": "AVMString", + "valueType": "uint8[]", + "key": "b3B0aW9uX2NvdW50cw==" + }, + "total_options": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "dG90YWxfb3B0aW9ucw==" + }, + "close_time": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y2xvc2VfdGltZQ==" + } + }, + "local": {}, + "box": { + "tally_box": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Vg==" + } + } + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "votes_by_account": { + "keyType": "AVMBytes", + "valueType": "uint8[]", + "prefix": "" + } + } + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 592 + ], + "errorMessage": "Already closed" + }, + { + "pc": [ + 1272 + ], + "errorMessage": "Already voted" + }, + { + "pc": [ + 1354 + ], + "errorMessage": "Answer option index invalid" + }, + { + "pc": [ + 459 + ], + "errorMessage": "Can't have more than 112 questions" + }, + { + "pc": [ + 502 + ], + "errorMessage": "Can't have more than 128 vote options" + }, + { + "pc": [ + 398 + ], + "errorMessage": "End time should be after start time" + }, + { + "pc": [ + 404 + ], + "errorMessage": "End time should be in the future" + }, + { + "pc": [ + 524 + ], + "errorMessage": "Must not be already bootstrapped" + }, + { + "pc": [ + 1263 + ], + "errorMessage": "Not allowed to vote" + }, + { + "pc": [ + 1288 + ], + "errorMessage": "Number of answers incorrect" + }, + { + "pc": [ + 247, + 299, + 321, + 333, + 360 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 561 + ], + "errorMessage": "Payment must be for the exact min balance requirement" + }, + { + "pc": [ + 1316 + ], + "errorMessage": "Payment must be the exact min balance" + }, + { + "pc": [ + 535, + 1307 + ], + "errorMessage": "Payment must be to app address" + }, + { + "pc": [ + 1267 + ], + "errorMessage": "Voting not open" + }, + { + "pc": [ + 1203 + ], + "errorMessage": "check self.end_time exists" + }, + { + "pc": [ + 522, + 1172 + ], + "errorMessage": "check self.is_bootstrapped exists" + }, + { + "pc": [ + 737 + ], + "errorMessage": "check self.metadata_ipfs_cid exists" + }, + { + "pc": [ + 1024 + ], + "errorMessage": "check self.nft_image_url exists" + }, + { + "pc": [ + 826, + 1276, + 1343 + ], + "errorMessage": "check self.option_counts exists" + }, + { + "pc": [ + 773 + ], + "errorMessage": "check self.quorum exists" + }, + { + "pc": [ + 1233 + ], + "errorMessage": "check self.snapshot_public_key exists" + }, + { + "pc": [ + 1189 + ], + "errorMessage": "check self.start_time exists" + }, + { + "pc": [ + 540 + ], + "errorMessage": "check self.total_options exists" + }, + { + "pc": [ + 601, + 753, + 1001 + ], + "errorMessage": "check self.vote_id exists" + }, + { + "pc": [ + 798, + 1378 + ], + "errorMessage": "check self.voter_count exists" + }, + { + "pc": [ + 251 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 302, + 324, + 336, + 363 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 455 + ], + "errorMessage": "option_counts should be non-empty" + }, + { + "pc": [ + 312, + 373 + ], + "errorMessage": "transaction type is pay" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwIDgKICAgIGJ5dGVjYmxvY2sgInZvdGVfaWQiICJvcHRpb25fY291bnRzIiAiaXNfYm9vdHN0cmFwcGVkIiAidm90ZXJfY291bnQiICJWIiAiY2xvc2VfdGltZSIgInNuYXBzaG90X3B1YmxpY19rZXkiICJtZXRhZGF0YV9pcGZzX2NpZCIgInN0YXJ0X3RpbWUiICJlbmRfdGltZSIgInF1b3J1bSIgIm5mdF9pbWFnZV91cmwiICJ0b3RhbF9vcHRpb25zIiAweDMwMzEzMjMzMzQzNTM2MzczODM5IDB4MDY4MTAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHhhZTg5N2Y2YiAweGE0ZThkMTY0IDB4OTY1NjA0N2EgMHhiY2IxNTg5NiAweDg0YTUzYzZlIC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyxieXRlW10sc3RyaW5nLHVpbnQ2NCx1aW50NjQsdWludDhbXSx1aW50NjQsc3RyaW5nKXZvaWQiLCBtZXRob2QgImJvb3RzdHJhcChwYXkpdm9pZCIsIG1ldGhvZCAiY2xvc2UoKXZvaWQiLCBtZXRob2QgImdldF9wcmVjb25kaXRpb25zKGJ5dGVbXSkodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0KSIsIG1ldGhvZCAidm90ZShwYXksYnl0ZVtdLHVpbnQ4W10pdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Nsb3NlX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3ByZWNvbmRpdGlvbnNfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX192b3RlX3JvdXRlQDYKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NDkKICAgIC8vIGNsYXNzIFZvdGluZ1JvdW5kQXBwKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICBleHRyYWN0IDIgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo1OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm9vdHN0cmFwX3JvdXRlQDM6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjgyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NDkKICAgIC8vIGNsYXNzIFZvdGluZ1JvdW5kQXBwKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBib290c3RyYXAKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Nsb3NlX3JvdXRlQDQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNsb3NlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19nZXRfcHJlY29uZGl0aW9uc19yb3V0ZUA1OgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdm90aW5nL3ZvdGluZy5weTo0OQogICAgLy8gY2xhc3MgVm90aW5nUm91bmRBcHAoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUpCiAgICBjYWxsc3ViIGdldF9wcmVjb25kaXRpb25zCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZvdGVfcm91dGVANjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NDkKICAgIC8vIGNsYXNzIFZvdGluZ1JvdW5kQXBwKEFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHZvdGUKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjQ5CiAgICAvLyBjbGFzcyBWb3RpbmdSb3VuZEFwcChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuY3JlYXRlKHZvdGVfaWQ6IGJ5dGVzLCBzbmFwc2hvdF9wdWJsaWNfa2V5OiBieXRlcywgbWV0YWRhdGFfaXBmc19jaWQ6IGJ5dGVzLCBzdGFydF90aW1lOiB1aW50NjQsIGVuZF90aW1lOiB1aW50NjQsIG9wdGlvbl9jb3VudHM6IGJ5dGVzLCBxdW9ydW06IHVpbnQ2NCwgbmZ0X2ltYWdlX3VybDogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTgtNjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZSgKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIHZvdGVfaWQ6IFN0cmluZywKICAgIC8vICAgICBzbmFwc2hvdF9wdWJsaWNfa2V5OiBCeXRlcywKICAgIC8vICAgICBtZXRhZGF0YV9pcGZzX2NpZDogU3RyaW5nLAogICAgLy8gICAgIHN0YXJ0X3RpbWU6IFVJbnQ2NCwKICAgIC8vICAgICBlbmRfdGltZTogVUludDY0LAogICAgLy8gICAgIG9wdGlvbl9jb3VudHM6IFZvdGVJbmRleEFycmF5LAogICAgLy8gICAgIHF1b3J1bTogVUludDY0LAogICAgLy8gICAgIG5mdF9pbWFnZV91cmw6IFN0cmluZywKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDggMAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3MAogICAgLy8gYXNzZXJ0IHN0YXJ0X3RpbWUgPCBlbmRfdGltZSwgIkVuZCB0aW1lIHNob3VsZCBiZSBhZnRlciBzdGFydCB0aW1lIgogICAgZnJhbWVfZGlnIC01CiAgICBmcmFtZV9kaWcgLTQKICAgIDwKICAgIGFzc2VydCAvLyBFbmQgdGltZSBzaG91bGQgYmUgYWZ0ZXIgc3RhcnQgdGltZQogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3MQogICAgLy8gYXNzZXJ0IGVuZF90aW1lID49IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wLCAiRW5kIHRpbWUgc2hvdWxkIGJlIGluIHRoZSBmdXR1cmUiCiAgICBmcmFtZV9kaWcgLTQKICAgIGdsb2JhbCBMYXRlc3RUaW1lc3RhbXAKICAgID49CiAgICBhc3NlcnQgLy8gRW5kIHRpbWUgc2hvdWxkIGJlIGluIHRoZSBmdXR1cmUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzMKICAgIC8vIHNlbGYudm90ZV9pZCA9IHZvdGVfaWQKICAgIGJ5dGVjXzAgLy8gInZvdGVfaWQiCiAgICBmcmFtZV9kaWcgLTgKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc0CiAgICAvLyBzZWxmLnNuYXBzaG90X3B1YmxpY19rZXkgPSBzbmFwc2hvdF9wdWJsaWNfa2V5CiAgICBieXRlYyA2IC8vICJzbmFwc2hvdF9wdWJsaWNfa2V5IgogICAgZnJhbWVfZGlnIC03CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3NQogICAgLy8gc2VsZi5tZXRhZGF0YV9pcGZzX2NpZCA9IG1ldGFkYXRhX2lwZnNfY2lkCiAgICBieXRlYyA3IC8vICJtZXRhZGF0YV9pcGZzX2NpZCIKICAgIGZyYW1lX2RpZyAtNgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NzYKICAgIC8vIHNlbGYuc3RhcnRfdGltZSA9IHN0YXJ0X3RpbWUKICAgIGJ5dGVjIDggLy8gInN0YXJ0X3RpbWUiCiAgICBmcmFtZV9kaWcgLTUKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc3CiAgICAvLyBzZWxmLmVuZF90aW1lID0gZW5kX3RpbWUKICAgIGJ5dGVjIDkgLy8gImVuZF90aW1lIgogICAgZnJhbWVfZGlnIC00CiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo3OAogICAgLy8gc2VsZi5xdW9ydW0gPSBxdW9ydW0KICAgIGJ5dGVjIDEwIC8vICJxdW9ydW0iCiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojc5CiAgICAvLyBzZWxmLm5mdF9pbWFnZV91cmwgPSBuZnRfaW1hZ2VfdXJsCiAgICBieXRlYyAxMSAvLyAibmZ0X2ltYWdlX3VybCIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODAKICAgIC8vIHNlbGYuc3RvcmVfb3B0aW9uX2NvdW50cyhvcHRpb25fY291bnRzLmNvcHkoKSkKICAgIGZyYW1lX2RpZyAtMwogICAgY2FsbHN1YiBzdG9yZV9vcHRpb25fY291bnRzCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuc3RvcmVfb3B0aW9uX2NvdW50cyhvcHRpb25fY291bnRzOiBieXRlcykgLT4gYnl0ZXM6CnN0b3JlX29wdGlvbl9jb3VudHM6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxNy0yMTgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgc3RvcmVfb3B0aW9uX2NvdW50cyhzZWxmLCBvcHRpb25fY291bnRzOiBWb3RlSW5kZXhBcnJheSkgLT4gTm9uZToKICAgIHByb3RvIDEgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMTkKICAgIC8vIGFzc2VydCBvcHRpb25fY291bnRzLmxlbmd0aCwgIm9wdGlvbl9jb3VudHMgc2hvdWxkIGJlIG5vbi1lbXB0eSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXBuIDIKICAgIGFzc2VydCAvLyBvcHRpb25fY291bnRzIHNob3VsZCBiZSBub24tZW1wdHkKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjIwCiAgICAvLyBhc3NlcnQgb3B0aW9uX2NvdW50cy5sZW5ndGggPD0gMTEyLCAiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTEyIHF1ZXN0aW9ucyIKICAgIHB1c2hpbnQgMTEyIC8vIDExMgogICAgPD0KICAgIGFzc2VydCAvLyBDYW4ndCBoYXZlIG1vcmUgdGhhbiAxMTIgcXVlc3Rpb25zCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMgogICAgLy8gdG90YWxfb3B0aW9ucyA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIGR1cAoKc3RvcmVfb3B0aW9uX2NvdW50c19mb3JfaGVhZGVyQDE6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyMwogICAgLy8gZm9yIGl0ZW0gaW4gb3B0aW9uX2NvdW50czoKICAgIGZyYW1lX2RpZyAyCiAgICBmcmFtZV9kaWcgMAogICAgPAogICAgYnogc3RvcmVfb3B0aW9uX2NvdW50c19hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMjQKICAgIC8vIHRvdGFsX29wdGlvbnMgKz0gaXRlbS5uYXRpdmUKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDIKICAgIGIgc3RvcmVfb3B0aW9uX2NvdW50c19mb3JfaGVhZGVyQDEKCnN0b3JlX29wdGlvbl9jb3VudHNfYWZ0ZXJfZm9yQDQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyNQogICAgLy8gYXNzZXJ0IHRvdGFsX29wdGlvbnMgPD0gMTI4LCAiQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gMTI4IHZvdGUgb3B0aW9ucyIKICAgIGZyYW1lX2RpZyAxCiAgICBkdXAKICAgIHB1c2hpbnQgMTI4IC8vIDEyOAogICAgPD0KICAgIGFzc2VydCAvLyBDYW4ndCBoYXZlIG1vcmUgdGhhbiAxMjggdm90ZSBvcHRpb25zCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyNwogICAgLy8gc2VsZi5vcHRpb25fY291bnRzID0gb3B0aW9uX2NvdW50cy5jb3B5KCkKICAgIGJ5dGVjXzEgLy8gIm9wdGlvbl9jb3VudHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIyOAogICAgLy8gc2VsZi50b3RhbF9vcHRpb25zID0gdG90YWxfb3B0aW9ucwogICAgYnl0ZWMgMTIgLy8gInRvdGFsX29wdGlvbnMiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuYm9vdHN0cmFwKGZ1bmRfbWluX2JhbF9yZXE6IHVpbnQ2NCkgLT4gdm9pZDoKYm9vdHN0cmFwOgogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4Mi04MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYm9vdHN0cmFwKHNlbGYsIGZ1bmRfbWluX2JhbF9yZXE6IGd0eG4uUGF5bWVudFRyYW5zYWN0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojg0CiAgICAvLyBhc3NlcnQgbm90IHNlbGYuaXNfYm9vdHN0cmFwcGVkLCAiTXVzdCBub3QgYmUgYWxyZWFkeSBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiaXNfYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzX2Jvb3RzdHJhcHBlZCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBNdXN0IG5vdCBiZSBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weTo4NQogICAgLy8gc2VsZi5pc19ib290c3RyYXBwZWQgPSBUcnVlCiAgICBieXRlY18yIC8vICJpc19ib290c3RyYXBwZWQiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6ODgKICAgIC8vIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBSZWNlaXZlcgogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgID09CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5Ojg3LTg5CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIGZ1bmRfbWluX2JhbF9yZXEucmVjZWl2ZXIgPT0gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcwogICAgLy8gKSwgIlBheW1lbnQgbXVzdCBiZSB0byBhcHAgYWRkcmVzcyIKICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgdG8gYXBwIGFkZHJlc3MKICAgIC8vIHZvdGluZy92b3RpbmcucHk6OTEKICAgIC8vIHRhbGx5X2JveF9zaXplID0gc2VsZi50b3RhbF9vcHRpb25zICogVk9URV9DT1VOVF9CWVRFUwogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDEyIC8vICJ0b3RhbF9vcHRpb25zIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnRvdGFsX29wdGlvbnMgZXhpc3RzCiAgICBpbnRjXzMgLy8gOAogICAgKgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDEtMTAyCiAgICAvLyAjIHRhbGx5IGJveCB2YWx1ZQogICAgLy8gKyAodGFsbHlfYm94X3NpemUgKiBCT1hfQllURV9NSU5fQkFMQU5DRSkKICAgIGR1cAogICAgcHVzaGludCA0MDAgLy8gNDAwCiAgICAqCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjkzLTEwMAogICAgLy8gIyBtaW5pbXVtIGJhbGFuY2UgcmVxIGZvcjogQUxHT3MgKyBWb3RlIHJlc3VsdCBORlQgYXNzZXQKICAgIC8vIEFTU0VUX01JTl9CQUxBTkNFICogMgogICAgLy8gIyBjcmVhdGUgTkZUIGZlZQogICAgLy8gKyAxMDAwCiAgICAvLyAjIHRhbGx5IGJveAogICAgLy8gKyBCT1hfRkxBVF9NSU5fQkFMQU5DRQogICAgLy8gIyB0YWxseSBib3gga2V5ICJWIgogICAgLy8gKyBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgcHVzaGludCAyMDM5MDAgLy8gMjAzOTAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjkzLTEwMgogICAgLy8gIyBtaW5pbXVtIGJhbGFuY2UgcmVxIGZvcjogQUxHT3MgKyBWb3RlIHJlc3VsdCBORlQgYXNzZXQKICAgIC8vIEFTU0VUX01JTl9CQUxBTkNFICogMgogICAgLy8gIyBjcmVhdGUgTkZUIGZlZQogICAgLy8gKyAxMDAwCiAgICAvLyAjIHRhbGx5IGJveAogICAgLy8gKyBCT1hfRkxBVF9NSU5fQkFMQU5DRQogICAgLy8gIyB0YWxseSBib3gga2V5ICJWIgogICAgLy8gKyBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgLy8gIyB0YWxseSBib3ggdmFsdWUKICAgIC8vICsgKHRhbGx5X2JveF9zaXplICogQk9YX0JZVEVfTUlOX0JBTEFOQ0UpCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwNAogICAgLy8gbG9nKG1pbl9iYWxhbmNlX3JlcSkKICAgIGR1cAogICAgaXRvYgogICAgbG9nCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEwNgogICAgLy8gZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbGFuY2VfcmVxCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEFtb3VudAogICAgPT0KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTA1LTEwNwogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kX21pbl9iYWxfcmVxLmFtb3VudCA9PSBtaW5fYmFsYW5jZV9yZXEKICAgIC8vICksICJQYXltZW50IG11c3QgYmUgZm9yIHRoZSBleGFjdCBtaW4gYmFsYW5jZSByZXF1aXJlbWVudCIKICAgIGFzc2VydCAvLyBQYXltZW50IG11c3QgYmUgZm9yIHRoZSBleGFjdCBtaW4gYmFsYW5jZSByZXF1aXJlbWVudAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMDgKICAgIC8vIGFzc2VydCBzZWxmLnRhbGx5X2JveC5jcmVhdGUoc2l6ZT10YWxseV9ib3hfc2l6ZSkKICAgIGJ5dGVjIDQgLy8gIlYiCiAgICBzd2FwCiAgICBib3hfY3JlYXRlCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuY2xvc2UoKSAtPiB2b2lkOgpjbG9zZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTEwLTExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2xvc2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgaW50Y18wIC8vIDAKICAgIGR1cAogICAgcHVzaGJ5dGVzICIiCiAgICBkdXBuIDIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTEyCiAgICAvLyBlbnN1cmVfYnVkZ2V0KDIwMDAwLCBmZWVfc291cmNlPU9wVXBGZWVTb3VyY2UuR3JvdXBDcmVkaXQpCiAgICBwdXNoaW50IDIwMDAwIC8vIDIwMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExMwogICAgLy8gYXNzZXJ0IG5vdCBzZWxmLmNsb3NlX3RpbWUsICJBbHJlYWR5IGNsb3NlZCIKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA1IC8vICJjbG9zZV90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGJ1cnkgMQogICAgIQogICAgYXNzZXJ0IC8vIEFscmVhZHkgY2xvc2VkCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNAogICAgLy8gc2VsZi5jbG9zZV90aW1lLnZhbHVlID0gR2xvYmFsLmxhdGVzdF90aW1lc3RhbXAKICAgIGJ5dGVjIDUgLy8gImNsb3NlX3RpbWUiCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTkKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidm90ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi52b3RlX2lkIGV4aXN0cwogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTE4CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICBwdXNoYnl0ZXMgIntcInN0YW5kYXJkXCI6XCJhcmM2OVwiLFwiZGVzY3JpcHRpb25cIjpcIlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTE5CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgcHVzaGJ5dGVzICIuXCIsXCJwcm9wZXJ0aWVzXCI6e1wibWV0YWRhdGFcIjpcImlwZnM6Ly8iCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjExNy0xMjAKICAgIC8vICd7InN0YW5kYXJkIjoiYXJjNjkiLCcKICAgIC8vICciZGVzY3JpcHRpb24iOiJUaGlzIGlzIGEgdm90aW5nIHJlc3VsdCBORlQgZm9yIHZvdGluZyByb3VuZCB3aXRoIElEICcKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICcuIiwicHJvcGVydGllcyI6eyJtZXRhZGF0YSI6ImlwZnM6Ly8nCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTIxCiAgICAvLyArIHNlbGYubWV0YWRhdGFfaXBmc19jaWQKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA3IC8vICJtZXRhZGF0YV9pcGZzX2NpZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyMQogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyMgogICAgLy8gKyAnIiwiaWQiOiInCiAgICBwdXNoYnl0ZXMgIlwiLFwiaWRcIjpcIiIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyMgogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICBjb25jYXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTIzCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gInZvdGVfaWQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZV9pZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyMwogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyNAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICBwdXNoYnl0ZXMgIlwiLFwicXVvcnVtXCI6IgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTI0CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArICciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICciLCJxdW9ydW0iOicKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjUKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyAxMCAvLyAicXVvcnVtIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnF1b3J1bSBleGlzdHMKICAgIGNhbGxzdWIgaXRvYQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTI1CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArICciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICciLCJxdW9ydW0iOicKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMjYKICAgIC8vICsgJywidm90ZXJDb3VudCI6JwogICAgcHVzaGJ5dGVzICIsXCJ2b3RlckNvdW50XCI6IgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMTctMTI2CiAgICAvLyAneyJzdGFuZGFyZCI6ImFyYzY5IiwnCiAgICAvLyAnImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCAnCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vJwogICAgLy8gKyBzZWxmLm1ldGFkYXRhX2lwZnNfY2lkCiAgICAvLyArICciLCJpZCI6IicKICAgIC8vICsgc2VsZi52b3RlX2lkCiAgICAvLyArICciLCJxdW9ydW0iOicKICAgIC8vICsgaXRvYShzZWxmLnF1b3J1bSkKICAgIC8vICsgJywidm90ZXJDb3VudCI6JwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyNwogICAgLy8gKyBpdG9hKHNlbGYudm90ZXJfY291bnQpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMyAvLyAidm90ZXJfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYudm90ZXJfY291bnQgZXhpc3RzCiAgICBjYWxsc3ViIGl0b2EKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyNwogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEyOAogICAgLy8gKyAnLCJ0YWxsaWVzIjpbJwogICAgcHVzaGJ5dGVzICIsXCJ0YWxsaWVzXCI6WyIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTE3LTEyOAogICAgLy8gJ3sic3RhbmRhcmQiOiJhcmM2OSIsJwogICAgLy8gJyJkZXNjcmlwdGlvbiI6IlRoaXMgaXMgYSB2b3RpbmcgcmVzdWx0IE5GVCBmb3Igdm90aW5nIHJvdW5kIHdpdGggSUQgJwogICAgLy8gKyBzZWxmLnZvdGVfaWQKICAgIC8vICsgJy4iLCJwcm9wZXJ0aWVzIjp7Im1ldGFkYXRhIjoiaXBmczovLycKICAgIC8vICsgc2VsZi5tZXRhZGF0YV9pcGZzX2NpZAogICAgLy8gKyAnIiwiaWQiOiInCiAgICAvLyArIHNlbGYudm90ZV9pZAogICAgLy8gKyAnIiwicXVvcnVtIjonCiAgICAvLyArIGl0b2Eoc2VsZi5xdW9ydW0pCiAgICAvLyArICcsInZvdGVyQ291bnQiOicKICAgIC8vICsgaXRvYShzZWxmLnZvdGVyX2NvdW50KQogICAgLy8gKyAnLCJ0YWxsaWVzIjpbJwogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzMQogICAgLy8gY3VycmVudF9pbmRleCA9IFVJbnQ2NCgwKQogICAgaW50Y18wIC8vIDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMyCiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXgsIHF1ZXN0aW9uX29wdGlvbnMgaW4gdWVudW1lcmF0ZShzZWxmLm9wdGlvbl9jb3VudHMpOgogICAgZHVwCiAgICBieXRlY18xIC8vICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIHN3YXAKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5vcHRpb25fY291bnRzIGV4aXN0cwogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAoKY2xvc2VfZm9yX2hlYWRlckAxOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzIKICAgIC8vIGZvciBxdWVzdGlvbl9pbmRleCwgcXVlc3Rpb25fb3B0aW9ucyBpbiB1ZW51bWVyYXRlKHNlbGYub3B0aW9uX2NvdW50cyk6CiAgICBmcmFtZV9kaWcgOQogICAgZnJhbWVfZGlnIDgKICAgIDwKICAgIGJ6IGNsb3NlX2FmdGVyX2ZvckAxNAogICAgZnJhbWVfZGlnIDcKICAgIGV4dHJhY3QgMiAwCiAgICBmcmFtZV9kaWcgOQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBpbnRjXzEgLy8gMQogICAgZXh0cmFjdDMgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBmcmFtZV9idXJ5IDEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTMzCiAgICAvLyBpZiBxdWVzdGlvbl9pbmRleCA+IDA6CiAgICBieiBjbG9zZV9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM0CiAgICAvLyBub3RlICs9ICIsIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiLCIKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDQ6CiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM1CiAgICAvLyBpZiBxdWVzdGlvbl9vcHRpb25zID4gMDoKICAgIGZyYW1lX2RpZyAxCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgYj4KICAgIGZyYW1lX2RpZyA2CiAgICBmcmFtZV9idXJ5IDIKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMAogICAgYnogY2xvc2VfYWZ0ZXJfaWZfZWxzZUAxMgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzYKICAgIC8vIG5vdGUgKz0gIlsiCiAgICBmcmFtZV9kaWcgNQogICAgcHVzaGJ5dGVzICJbIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM3CiAgICAvLyBmb3Igb3B0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbl9vcHRpb25zLm5hdGl2ZSk6CiAgICBmcmFtZV9kaWcgMQogICAgYnRvaQogICAgZnJhbWVfYnVyeSA0CiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSAzCgpjbG9zZV9mb3JfaGVhZGVyQDY6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjEzNwogICAgLy8gZm9yIG9wdGlvbl9pbmRleCBpbiB1cmFuZ2UocXVlc3Rpb25fb3B0aW9ucy5uYXRpdmUpOgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2RpZyA0CiAgICA8CiAgICBieiBjbG9zZV9hZnRlcl9mb3JAMTEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM4CiAgICAvLyBpZiBvcHRpb25faW5kZXggPiAwOgogICAgZnJhbWVfZGlnIDMKICAgIGJ6IGNsb3NlX2FmdGVyX2lmX2Vsc2VAOQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxMzkKICAgIC8vIG5vdGUgKz0gIiwiCiAgICBmcmFtZV9kaWcgNQogICAgcHVzaGJ5dGVzICIsIgogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKCmNsb3NlX2FmdGVyX2lmX2Vsc2VAOToKICAgIGZyYW1lX2RpZyAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0MAogICAgLy8gdm90ZXNfZm9yX29wdGlvbiA9IHNlbGYuZ2V0X3ZvdGVfZnJvbV9ib3goY3VycmVudF9pbmRleCkKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGNhbGxzdWIgZ2V0X3ZvdGVfZnJvbV9ib3gKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQxCiAgICAvLyBub3RlICs9IGl0b2Eodm90ZXNfZm9yX29wdGlvbikKICAgIGNhbGxzdWIgaXRvYQogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQyCiAgICAvLyBjdXJyZW50X2luZGV4ICs9IDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTM3CiAgICAvLyBmb3Igb3B0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbl9vcHRpb25zLm5hdGl2ZSk6CiAgICBmcmFtZV9kaWcgMwogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMwogICAgYiBjbG9zZV9mb3JfaGVhZGVyQDYKCmNsb3NlX2FmdGVyX2ZvckAxMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQzCiAgICAvLyBub3RlICs9ICJdIgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiXSIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDYKICAgIGZyYW1lX2J1cnkgMgogICAgZnJhbWVfYnVyeSAwCgpjbG9zZV9hZnRlcl9pZl9lbHNlQDEyOgogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2J1cnkgNgogICAgZnJhbWVfZGlnIDAKICAgIGZyYW1lX2J1cnkgNQogICAgZnJhbWVfZGlnIDkKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBmcmFtZV9idXJ5IDkKICAgIGIgY2xvc2VfZm9yX2hlYWRlckAxCgpjbG9zZV9hZnRlcl9mb3JAMTQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NAogICAgLy8gbm90ZSArPSAiXX19IgogICAgZnJhbWVfZGlnIDUKICAgIHB1c2hieXRlcyAiXX19IgogICAgY29uY2F0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0Ni0xNTYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MSwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgIGFzc2V0X25hbWU9IltWT1RFIFJFU1VMVF0gIiArIHNlbGYudm90ZV9pZCwKICAgIC8vICAgICB1bml0X25hbWU9IlZPVEVSU0xUIiwKICAgIC8vICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgIG5vdGU9bm90ZSwKICAgIC8vICAgICBmZWU9R2xvYmFsLm1pbl90eG5fZmVlLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1NAogICAgLy8gZmVlPUdsb2JhbC5taW5fdHhuX2ZlZSwKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTUwCiAgICAvLyBhc3NldF9uYW1lPSJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAidm90ZV9pZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi52b3RlX2lkIGV4aXN0cwogICAgcHVzaGJ5dGVzICJbVk9URSBSRVNVTFRdICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNTIKICAgIC8vIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgMTEgLy8gIm5mdF9pbWFnZV91cmwiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubmZ0X2ltYWdlX3VybCBleGlzdHMKICAgIHVuY292ZXIgMwogICAgaXR4bl9maWVsZCBOb3RlCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VVJMCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE1MQogICAgLy8gdW5pdF9uYW1lPSJWT1RFUlNMVCIsCiAgICBwdXNoYnl0ZXMgIlZPVEVSU0xUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDkKICAgIC8vIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWZhdWx0RnJvemVuCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0OAogICAgLy8gZGVjaW1hbHM9MCwKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ3CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNDYKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ2LTE1NgogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49RmFsc2UsCiAgICAvLyAgICAgYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgLy8gICAgIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICAvLyAgICAgbm90ZT1ub3RlLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NQogICAgLy8gc2VsZi5uZnRfYXNzZXRfaWQgPSAoCiAgICBwdXNoYnl0ZXMgIm5mdF9hc3NldF9pZCIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTQ2LTE1NwogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgZGVmYXVsdF9mcm96ZW49RmFsc2UsCiAgICAvLyAgICAgYXNzZXRfbmFtZT0iW1ZPVEUgUkVTVUxUXSAiICsgc2VsZi52b3RlX2lkLAogICAgLy8gICAgIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgLy8gICAgIHVybD1zZWxmLm5mdF9pbWFnZV91cmwsCiAgICAvLyAgICAgbm90ZT1ub3RlLAogICAgLy8gICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2Fzc2V0LmlkCiAgICBpdHhuIENyZWF0ZWRBc3NldElECiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE0NS0xNTgKICAgIC8vIHNlbGYubmZ0X2Fzc2V0X2lkID0gKAogICAgLy8gICAgIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgICAgIHRvdGFsPTEsCiAgICAvLyAgICAgICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgICAgIGRlZmF1bHRfZnJvemVuPUZhbHNlLAogICAgLy8gICAgICAgICBhc3NldF9uYW1lPSJbVk9URSBSRVNVTFRdICIgKyBzZWxmLnZvdGVfaWQsCiAgICAvLyAgICAgICAgIHVuaXRfbmFtZT0iVk9URVJTTFQiLAogICAgLy8gICAgICAgICB1cmw9c2VsZi5uZnRfaW1hZ2VfdXJsLAogICAgLy8gICAgICAgICBub3RlPW5vdGUsCiAgICAvLyAgICAgICAgIGZlZT1HbG9iYWwubWluX3R4bl9mZWUsCiAgICAvLyAgICAgKQogICAgLy8gICAgIC5zdWJtaXQoKQogICAgLy8gICAgIC5jcmVhdGVkX2Fzc2V0LmlkCiAgICAvLyApCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5pdG9hKGk6IHVpbnQ2NCkgLT4gYnl0ZXM6Cml0b2E6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI0OS0yNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgaXRvYShpOiBVSW50NjQpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTMKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTIKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1MwogICAgLy8gaWYgaSA8IHJhZGl4OgogICAgPAogICAgYnogaXRvYV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjU0CiAgICAvLyByZXR1cm4gU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2ldKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTEKICAgIC8vIGRpZ2l0cyA9IEJ5dGVzKGIiMDEyMzQ1Njc4OSIpCiAgICBieXRlYyAxMyAvLyAweDMwMzEzMjMzMzQzNTM2MzczODM5CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NAogICAgLy8gcmV0dXJuIFN0cmluZy5mcm9tX2J5dGVzKGRpZ2l0c1tpXSkKICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCml0b2FfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUyCiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICAvCiAgICBjYWxsc3ViIGl0b2EKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTIKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjI1NQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBTdHJpbmcuZnJvbV9ieXRlcyhkaWdpdHNbaSAlIHJhZGl4XSkKICAgICUKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgICsKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjUxCiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWMgMTMgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNTUKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgU3RyaW5nLmZyb21fYnl0ZXMoZGlnaXRzW2kgJSByYWRpeF0pCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuZ2V0X3ZvdGVfZnJvbV9ib3goaW5kZXg6IHVpbnQ2NCkgLT4gdWludDY0OgpnZXRfdm90ZV9mcm9tX2JveDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjM5LTI0MAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdm90ZV9mcm9tX2JveChzZWxmLCBpbmRleDogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQxCiAgICAvLyByZXR1cm4gb3AuYnRvaShzZWxmLnRhbGx5X2JveC5leHRyYWN0KGluZGV4LCBWT1RFX0NPVU5UX0JZVEVTKSkKICAgIGJ5dGVjIDQgLy8gIlYiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMyAvLyA4CiAgICBib3hfZXh0cmFjdAogICAgYnRvaQogICAgcmV0c3ViCgoKLy8gZXhhbXBsZXMudm90aW5nLnZvdGluZy5Wb3RpbmdSb3VuZEFwcC5nZXRfcHJlY29uZGl0aW9ucyhzaWduYXR1cmU6IGJ5dGVzKSAtPiBieXRlczoKZ2V0X3ByZWNvbmRpdGlvbnM6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE2MC0xNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9wcmVjb25kaXRpb25zKHNlbGYsIHNpZ25hdHVyZTogQnl0ZXMpIC0+IFZvdGluZ1ByZWNvbmRpdGlvbnM6CiAgICBwcm90byAxIDEKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTYzCiAgICAvLyBpc192b3Rpbmdfb3Blbj1hcmM0LlVJbnQ2NChzZWxmLnZvdGluZ19vcGVuKCkpLAogICAgY2FsbHN1YiB2b3Rpbmdfb3BlbgogICAgaXRvYgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjQKICAgIC8vIGlzX2FsbG93ZWRfdG9fdm90ZT1hcmM0LlVJbnQ2NChzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUpKSwKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBhbGxvd2VkX3RvX3ZvdGUKICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY1CiAgICAvLyBoYXNfYWxyZWFkeV92b3RlZD1hcmM0LlVJbnQ2NChzZWxmLmFscmVhZHlfdm90ZWQoKSksCiAgICBjYWxsc3ViIGFscmVhZHlfdm90ZWQKICAgIGl0b2IKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTY2CiAgICAvLyBjdXJyZW50X3RpbWU9YXJjNC5VSW50NjQoR2xvYmFsLmxhdGVzdF90aW1lc3RhbXApLAogICAgZ2xvYmFsIExhdGVzdFRpbWVzdGFtcAogICAgaXRvYgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjItMTY3CiAgICAvLyByZXR1cm4gVm90aW5nUHJlY29uZGl0aW9ucygKICAgIC8vICAgICBpc192b3Rpbmdfb3Blbj1hcmM0LlVJbnQ2NChzZWxmLnZvdGluZ19vcGVuKCkpLAogICAgLy8gICAgIGlzX2FsbG93ZWRfdG9fdm90ZT1hcmM0LlVJbnQ2NChzZWxmLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmUpKSwKICAgIC8vICAgICBoYXNfYWxyZWFkeV92b3RlZD1hcmM0LlVJbnQ2NChzZWxmLmFscmVhZHlfdm90ZWQoKSksCiAgICAvLyAgICAgY3VycmVudF90aW1lPWFyYzQuVUludDY0KEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wKSwKICAgIC8vICkKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAudm90aW5nX29wZW4oKSAtPiB1aW50NjQ6CnZvdGluZ19vcGVuOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDUtMjA2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHZvdGluZ19vcGVuKHNlbGYpIC0+IGJvb2w6CiAgICBwcm90byAwIDEKICAgIHB1c2hieXRlcyAiIgogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDgKICAgIC8vIHNlbGYuaXNfYm9vdHN0cmFwcGVkCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAiaXNfYm9vdHN0cmFwcGVkIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmlzX2Jvb3RzdHJhcHBlZCBleGlzdHMKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA4LTIxMAogICAgLy8gc2VsZi5pc19ib290c3RyYXBwZWQKICAgIC8vIGFuZCBub3Qgc2VsZi5jbG9zZV90aW1lCiAgICAvLyBhbmQgc2VsZi5zdGFydF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuZW5kX3RpbWUKICAgIGJ6IHZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMDkKICAgIC8vIGFuZCBub3Qgc2VsZi5jbG9zZV90aW1lCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNSAvLyAiY2xvc2VfdGltZSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBidXJ5IDEKICAgIGJueiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjEwCiAgICAvLyBhbmQgc2VsZi5zdGFydF90aW1lIDw9IEdsb2JhbC5sYXRlc3RfdGltZXN0YW1wIDw9IHNlbGYuZW5kX3RpbWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlYyA4IC8vICJzdGFydF90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLnN0YXJ0X3RpbWUgZXhpc3RzCiAgICBnbG9iYWwgTGF0ZXN0VGltZXN0YW1wCiAgICBkdXAKICAgIGZyYW1lX2J1cnkgMAogICAgPD0KICAgIGJ6IHZvdGluZ19vcGVuX2Jvb2xfZmFsc2VANQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDkgLy8gImVuZF90aW1lIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmVuZF90aW1lIGV4aXN0cwogICAgZnJhbWVfZGlnIDAKICAgID49CiAgICBieiB2b3Rpbmdfb3Blbl9ib29sX2ZhbHNlQDUKICAgIGludGNfMSAvLyAxCiAgICBiIHZvdGluZ19vcGVuX2Jvb2xfbWVyZ2VANgoKdm90aW5nX29wZW5fYm9vbF9mYWxzZUA1OgogICAgaW50Y18wIC8vIDAKCnZvdGluZ19vcGVuX2Jvb2xfbWVyZ2VANjoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjA3LTIxMQogICAgLy8gcmV0dXJuICgKICAgIC8vICAgICBzZWxmLmlzX2Jvb3RzdHJhcHBlZAogICAgLy8gICAgIGFuZCBub3Qgc2VsZi5jbG9zZV90aW1lCiAgICAvLyAgICAgYW5kIHNlbGYuc3RhcnRfdGltZSA8PSBHbG9iYWwubGF0ZXN0X3RpbWVzdGFtcCA8PSBzZWxmLmVuZF90aW1lCiAgICAvLyApCiAgICBzd2FwCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFsbG93ZWRfdG9fdm90ZShzaWduYXR1cmU6IGJ5dGVzKSAtPiB1aW50NjQ6CmFsbG93ZWRfdG9fdm90ZToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjMwLTIzMQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBhbGxvd2VkX3RvX3ZvdGUoc2VsZiwgc2lnbmF0dXJlOiBCeXRlcykgLT4gYm9vbDoKICAgIHByb3RvIDEgMQogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzIKICAgIC8vIGVuc3VyZV9idWRnZXQoMjAwMCkKICAgIHB1c2hpbnQgMjAwMCAvLyAyMDAwCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBlbnN1cmVfYnVkZ2V0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIzNAogICAgLy8gVHhuLnNlbmRlci5ieXRlcywKICAgIHR4biBTZW5kZXIKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjM2CiAgICAvLyBzZWxmLnNuYXBzaG90X3B1YmxpY19rZXksCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWMgNiAvLyAic25hcHNob3RfcHVibGljX2tleSIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5zbmFwc2hvdF9wdWJsaWNfa2V5IGV4aXN0cwogICAgLy8gdm90aW5nL3ZvdGluZy5weToyMzMtMjM3CiAgICAvLyByZXR1cm4gb3AuZWQyNTUxOXZlcmlmeV9iYXJlKAogICAgLy8gICAgIFR4bi5zZW5kZXIuYnl0ZXMsCiAgICAvLyAgICAgc2lnbmF0dXJlLAogICAgLy8gICAgIHNlbGYuc25hcHNob3RfcHVibGljX2tleSwKICAgIC8vICkKICAgIGZyYW1lX2RpZyAtMQogICAgc3dhcAogICAgZWQyNTUxOXZlcmlmeV9iYXJlCiAgICByZXRzdWIKCgovLyBleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmFscmVhZHlfdm90ZWQoKSAtPiB1aW50NjQ6CmFscmVhZHlfdm90ZWQ6CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxMy0yMTQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgYWxyZWFkeV92b3RlZChzZWxmKSAtPiBib29sOgogICAgcHJvdG8gMCAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIxNQogICAgLy8gcmV0dXJuIFR4bi5zZW5kZXIgaW4gc2VsZi52b3Rlc19ieV9hY2NvdW50CiAgICB0eG4gU2VuZGVyCiAgICBib3hfbGVuCiAgICBidXJ5IDEKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAudm90ZShmdW5kX21pbl9iYWxfcmVxOiB1aW50NjQsIHNpZ25hdHVyZTogYnl0ZXMsIGFuc3dlcl9pZHM6IGJ5dGVzKSAtPiB2b2lkOgp2b3RlOgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNjktMTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB2b3RlKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgZnVuZF9taW5fYmFsX3JlcTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sCiAgICAvLyAgICAgc2lnbmF0dXJlOiBCeXRlcywKICAgIC8vICAgICBhbnN3ZXJfaWRzOiBWb3RlSW5kZXhBcnJheSwKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxNzYKICAgIC8vIGVuc3VyZV9idWRnZXQoNzcwMCwgZmVlX3NvdXJjZT1PcFVwRmVlU291cmNlLkdyb3VwQ3JlZGl0KQogICAgcHVzaGludCA3NzAwIC8vIDc3MDAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGVuc3VyZV9idWRnZXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc3LTE3OAogICAgLy8gIyBDaGVjayB2b3RpbmcgcHJlY29uZGl0aW9ucwogICAgLy8gYXNzZXJ0IHNlbGYuYWxsb3dlZF90b192b3RlKHNpZ25hdHVyZSksICJOb3QgYWxsb3dlZCB0byB2b3RlIgogICAgZnJhbWVfZGlnIC0yCiAgICBjYWxsc3ViIGFsbG93ZWRfdG9fdm90ZQogICAgYXNzZXJ0IC8vIE5vdCBhbGxvd2VkIHRvIHZvdGUKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTc5CiAgICAvLyBhc3NlcnQgc2VsZi52b3Rpbmdfb3BlbigpLCAiVm90aW5nIG5vdCBvcGVuIgogICAgY2FsbHN1YiB2b3Rpbmdfb3BlbgogICAgYXNzZXJ0IC8vIFZvdGluZyBub3Qgb3BlbgogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODAKICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hbHJlYWR5X3ZvdGVkKCksICJBbHJlYWR5IHZvdGVkIgogICAgY2FsbHN1YiBhbHJlYWR5X3ZvdGVkCiAgICAhCiAgICBhc3NlcnQgLy8gQWxyZWFkeSB2b3RlZAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODEKICAgIC8vIHF1ZXN0aW9uc19jb3VudCA9IHNlbGYub3B0aW9uX2NvdW50cy5sZW5ndGgKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJvcHRpb25fY291bnRzIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm9wdGlvbl9jb3VudHMgZXhpc3RzCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgLy8gdm90aW5nL3ZvdGluZy5weToxODIKICAgIC8vIGFzc2VydCBhbnN3ZXJfaWRzLmxlbmd0aCA9PSBxdWVzdGlvbnNfY291bnQsICJOdW1iZXIgb2YgYW5zd2VycyBpbmNvcnJlY3QiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQgLy8gTnVtYmVyIG9mIGFuc3dlcnMgaW5jb3JyZWN0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4NQogICAgLy8gKDMyICsgMiArIFZPVEVfSU5ERVhfQllURVMgKiBhbnN3ZXJfaWRzLmxlbmd0aCkgKiBCT1hfQllURV9NSU5fQkFMQU5DRQogICAgcHVzaGludCAzNCAvLyAzNAogICAgKwogICAgcHVzaGludCA0MDAgLy8gNDAwCiAgICAqCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4My0xODQKICAgIC8vICMgQ2hlY2sgdm90ZXIgYm94IGlzIGZ1bmRlZAogICAgLy8gbWluX2JhbF9yZXEgPSBCT1hfRkxBVF9NSU5fQkFMQU5DRSArICgKICAgIHB1c2hpbnQgMjUwMCAvLyAyNTAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4My0xODYKICAgIC8vICMgQ2hlY2sgdm90ZXIgYm94IGlzIGZ1bmRlZAogICAgLy8gbWluX2JhbF9yZXEgPSBCT1hfRkxBVF9NSU5fQkFMQU5DRSArICgKICAgIC8vICAgICAoMzIgKyAyICsgVk9URV9JTkRFWF9CWVRFUyAqIGFuc3dlcl9pZHMubGVuZ3RoKSAqIEJPWF9CWVRFX01JTl9CQUxBTkNFCiAgICAvLyApCiAgICArCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE4OAogICAgLy8gZnVuZF9taW5fYmFsX3JlcS5yZWNlaXZlciA9PSBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTMKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTg3LTE4OQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBmdW5kX21pbl9iYWxfcmVxLnJlY2VpdmVyID09IEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MKICAgIC8vICksICJQYXltZW50IG11c3QgYmUgdG8gYXBwIGFkZHJlc3MiCiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHRvIGFwcCBhZGRyZXNzCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5MQogICAgLy8gbG9nKG1pbl9iYWxfcmVxKQogICAgZHVwCiAgICBpdG9iCiAgICBsb2cKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTkyCiAgICAvLyBhc3NlcnQgZnVuZF9taW5fYmFsX3JlcS5hbW91bnQgPT0gbWluX2JhbF9yZXEsICJQYXltZW50IG11c3QgYmUgdGhlIGV4YWN0IG1pbiBiYWxhbmNlIgogICAgZnJhbWVfZGlnIC0zCiAgICBndHhucyBBbW91bnQKICAgID09CiAgICBhc3NlcnQgLy8gUGF5bWVudCBtdXN0IGJlIHRoZSBleGFjdCBtaW4gYmFsYW5jZQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTMtMTk0CiAgICAvLyAjIFJlY29yZCB0aGUgdm90ZSBmb3IgZWFjaCBxdWVzdGlvbgogICAgLy8gY3VtdWxhdGl2ZV9vZmZzZXQgPSBVSW50NjQoMCkKICAgIGludGNfMCAvLyAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbnNfY291bnQpOgogICAgZHVwCgp2b3RlX2Zvcl9oZWFkZXJAMToKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk1CiAgICAvLyBmb3IgcXVlc3Rpb25faW5kZXggaW4gdXJhbmdlKHF1ZXN0aW9uc19jb3VudCk6CiAgICBmcmFtZV9kaWcgMgogICAgZnJhbWVfZGlnIDAKICAgIDwKICAgIGJ6IHZvdGVfYWZ0ZXJfZm9yQDQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MTk2LTE5NwogICAgLy8gIyBMb2FkIHRoZSB1c2VyJ3Mgdm90ZSBmb3IgdGhpcyBxdWVzdGlvbgogICAgLy8gYW5zd2VyX29wdGlvbl9pbmRleCA9IGFuc3dlcl9pZHNbcXVlc3Rpb25faW5kZXhdLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgY292ZXIgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTgKICAgIC8vIG9wdGlvbnNfY291bnQgPSBzZWxmLm9wdGlvbl9jb3VudHNbcXVlc3Rpb25faW5kZXhdLm5hdGl2ZQogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzEgLy8gIm9wdGlvbl9jb3VudHMiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYub3B0aW9uX2NvdW50cyBleGlzdHMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgaW50Y18xIC8vIDEKICAgIGV4dHJhY3QzIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdm90aW5nL3ZvdGluZy5weToxOTkKICAgIC8vIGFzc2VydCBhbnN3ZXJfb3B0aW9uX2luZGV4IDwgb3B0aW9uc19jb3VudCwgIkFuc3dlciBvcHRpb24gaW5kZXggaW52YWxpZCIKICAgIGR1cDIKICAgIDwKICAgIGFzc2VydCAvLyBBbnN3ZXIgb3B0aW9uIGluZGV4IGludmFsaWQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjAwCiAgICAvLyBzZWxmLmluY3JlbWVudF92b3RlX2luX2JveChjdW11bGF0aXZlX29mZnNldCArIGFuc3dlcl9vcHRpb25faW5kZXgpCiAgICBmcmFtZV9kaWcgMQogICAgZHVwCiAgICB1bmNvdmVyIDMKICAgICsKICAgIGNhbGxzdWIgaW5jcmVtZW50X3ZvdGVfaW5fYm94CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMQogICAgLy8gY3VtdWxhdGl2ZV9vZmZzZXQgKz0gb3B0aW9uc19jb3VudAogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjIwMgogICAgLy8gc2VsZi52b3Rlc19ieV9hY2NvdW50W1R4bi5zZW5kZXJdID0gYW5zd2VyX2lkcy5jb3B5KCkKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBmcmFtZV9kaWcgLTEKICAgIGJveF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjAzCiAgICAvLyBzZWxmLnZvdGVyX2NvdW50ICs9IDEKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vICJ2b3Rlcl9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi52b3Rlcl9jb3VudCBleGlzdHMKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBieXRlY18zIC8vICJ2b3Rlcl9jb3VudCIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjE5NQogICAgLy8gZm9yIHF1ZXN0aW9uX2luZGV4IGluIHVyYW5nZShxdWVzdGlvbnNfY291bnQpOgogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMgogICAgYiB2b3RlX2Zvcl9oZWFkZXJAMQoKdm90ZV9hZnRlcl9mb3JANDoKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuaW5jcmVtZW50X3ZvdGVfaW5fYm94KGluZGV4OiB1aW50NjQpIC0+IHZvaWQ6CmluY3JlbWVudF92b3RlX2luX2JveDoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQzLTI0NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBpbmNyZW1lbnRfdm90ZV9pbl9ib3goc2VsZiwgaW5kZXg6IFVJbnQ2NCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdm90aW5nL3ZvdGluZy5weToyNDUKICAgIC8vIGN1cnJlbnRfdm90ZSA9IHNlbGYuZ2V0X3ZvdGVfZnJvbV9ib3goaW5kZXgpCiAgICBmcmFtZV9kaWcgLTEKICAgIGNhbGxzdWIgZ2V0X3ZvdGVfZnJvbV9ib3gKICAgIC8vIHZvdGluZy92b3RpbmcucHk6MjQ2CiAgICAvLyBzZWxmLnRhbGx5X2JveC5yZXBsYWNlKGluZGV4LCBvcC5pdG9iKGN1cnJlbnRfdm90ZSArIDEpKQogICAgaW50Y18xIC8vIDEKICAgICsKICAgIGl0b2IKICAgIGJ5dGVjIDQgLy8gIlYiCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMgogICAgYm94X3JlcGxhY2UKICAgIHJldHN1YgoKCi8vIGV4YW1wbGVzLnZvdGluZy52b3RpbmcuVm90aW5nUm91bmRBcHAuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTAKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB2b3Rpbmcvdm90aW5nLnB5OjUxCiAgICAvLyBzZWxmLmlzX2Jvb3RzdHJhcHBlZCA9IEZhbHNlCiAgICBieXRlY18yIC8vICJpc19ib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHZvdGluZy92b3RpbmcucHk6NTItNTMKICAgIC8vICMgVGhlIG1pbmltdW0gbnVtYmVyIG9mIHZvdGVycyB3aG8gaGF2ZSB2b3RlZAogICAgLy8gc2VsZi52b3Rlcl9jb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMyAvLyAidm90ZXJfY291bnQiCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi51dGlsLmVuc3VyZV9idWRnZXQocmVxdWlyZWRfYnVkZ2V0OiB1aW50NjQsIGZlZV9zb3VyY2U6IHVpbnQ2NCkgLT4gdm9pZDoKZW5zdXJlX2J1ZGdldDoKICAgIHByb3RvIDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMTAKICAgICsKCmVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZ2xvYmFsIE9wY29kZUJ1ZGdldAogICAgPgogICAgYnogZW5zdXJlX2J1ZGdldF9hZnRlcl93aGlsZUA3CiAgICBpdHhuX2JlZ2luCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgcHVzaGludCA1IC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgYnl0ZWMgMTQgLy8gMHgwNjgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtCiAgICBieXRlYyAxNCAvLyAweDA2ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbQogICAgZnJhbWVfZGlnIC0xCiAgICBzd2l0Y2ggZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8wQDMgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV8xQDQKICAgIGIgZW5zdXJlX2J1ZGdldF9zd2l0Y2hfY2FzZV9uZXh0QDYKCmVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfMEAzOgogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBiIGVuc3VyZV9idWRnZXRfc3dpdGNoX2Nhc2VfbmV4dEA2CgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlXzFANDoKICAgIGdsb2JhbCBNaW5UeG5GZWUKICAgIGl0eG5fZmllbGQgRmVlCgplbnN1cmVfYnVkZ2V0X3N3aXRjaF9jYXNlX25leHRANjoKICAgIGl0eG5fc3VibWl0CiAgICBiIGVuc3VyZV9idWRnZXRfd2hpbGVfdG9wQDEKCmVuc3VyZV9idWRnZXRfYWZ0ZXJfd2hpbGVANzoKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgpleGFtcGxlcy52b3Rpbmcudm90aW5nLlZvdGluZ1JvdW5kQXBwLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAEAAEKCCYPB3ZvdGVfaWQNb3B0aW9uX2NvdW50cw9pc19ib290c3RyYXBwZWQLdm90ZXJfY291bnQBVgpjbG9zZV90aW1lE3NuYXBzaG90X3B1YmxpY19rZXkRbWV0YWRhdGFfaXBmc19jaWQKc3RhcnRfdGltZQhlbmRfdGltZQZxdW9ydW0NbmZ0X2ltYWdlX3VybA10b3RhbF9vcHRpb25zCjAxMjM0NTY3ODkDBoEBMRhAAAOIBMeIAAFDigABMRtBALyCBQSuiX9rBKTo0WQEllYEegS8sViWBISlPG42GgCOBQACADYATABYAHMiiTEZFEQxGBRENhoBVwIANhoCVwIANhoDVwIANhoEFzYaBRc2GgY2GgcXNhoIVwIAiABgI4kxGRREMRhEMRYjCUk4ECMSRIgAyCOJMRkURDEYRIgA8COJMRkURDEYRDYaAVcCAIgDE4AEFR98dUxQsCOJMRkURDEYRDEWIwlJOBAjEkQ2GgFXAgA2GgKIA14jiSKJiggAi/uL/AxEi/wyBw9EKIv4ZycGi/lnJweL+mcnCIv7ZycJi/xnJwqL/mcnC4v/Z4v9iAACSImKAQGL/yJZRwJEgXAORCJJiwKLAAxBABmL/1cCAIsCSU4CI1gXiwEIjAEjCIwCQv/fiwFJgYABDkQpi/9nJwxMZ4v/jACJigEAIiplRBREKiNni/84BzIKEkQiJwxlRCULSYGQAwuB/LgMCEkWsIv/OAgSRCcETLlEiYoAACJJgABHAoGgnAEiiANEIicFZUUBFEQnBTIHZyIoZUSAWHsic3RhbmRhcmQiOiJhcmM2OSIsImRlc2NyaXB0aW9uIjoiVGhpcyBpcyBhIHZvdGluZyByZXN1bHQgTkZUIGZvciB2b3Rpbmcgcm91bmQgd2l0aCBJRCBMUIAkLiIsInByb3BlcnRpZXMiOnsibWV0YWRhdGEiOiJpcGZzOi8vUCInB2VEUIAIIiwiaWQiOiJQIihlRFCACyIsInF1b3J1bSI6UCInCmVEiAEuUIAOLCJ2b3RlckNvdW50IjpQIitlRIgBFVCADCwidGFsbGllcyI6W1AiSSllTElPAkQiWSKLCYsIDEEAlYsHVwIAiwlJTgIjWIwBiwWMAEEACIsFgAEsUIwAiwBJjAWLAYABAKWLBowCTIwAQQBSiwWAAVtQjAWLAReMBCKMA4sDiwQMQQAuiwWMAIsDQQAIiwWAASxQjACLAIsGSU4CiAC3iACJUIwFIwiMBosDIwiMA0L/yosFgAFdUIsGjAKMAIsCjAaLAIwFiwkjCIwJQv9jiwWAA119fVCxMgAiKGVEgA5bVk9URSBSRVNVTFRdIExQIicLZURPA7IFsieACFZPVEVSU0xUsiWyJiKyJCKyIyOyIoEDshCyAbOADG5mdF9hc3NldF9pZLQ8Z4mKAQGL/yQMQQAMi/8jCCcNi/9PAlKJi/8kCoj/44v/JBhJIwgnDU4CUlCJigEBJwSL/yW6F4mKAQGIABkWi/+IAEgWiABaFjIHFk8DTwNQTwJQTFCJigABgAAiKmVEQQAmIicFZUUBQAAdIicIZUQyB0mMAA5BAA8iJwllRIsAD0EABCNCAAEiTImKAQGB0A8iiADCMQAiJwZlRIv/TISJigABMQC9RQGJigMAgZQ8IogAo4v+iP/SRIj/mUSI/+AURCIpZUQiWUmL/yJZSU8CEkSBIgiBkAMLgcQTCIv9OAcyChJESRawi/04CBJEIkmLAosADEEAQIv/VwIAiwJJTgIjWBciKWVEVwIASwIjWBdKDESLAUlPAwiIABwIjAExAEm8SIv/vyIrZUQjCCtMZyMIjAJC/7iJigEAi/+I/uojCBYnBIv/TwK7iYoAACoiZysiZ4mKAgCL/iQIiwAyDA1BACqxgQayEIEFshknDrIeJw6yH4v/jQIAAwAJQgAKIrIBQgAEMgCyAbNC/86J", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/examples/voting/out/client_VotingRoundApp.py b/examples/voting/out/client_VotingRoundApp.py index 394fb0fe69..d41a3400bc 100644 --- a/examples/voting/out/client_VotingRoundApp.py +++ b/examples/voting/out/client_VotingRoundApp.py @@ -40,7 +40,7 @@ def close( def get_preconditions( self, signature: algopy.arc4.DynamicBytes, - ) -> VotingPreconditions: ... + ) -> algopy.arc4.Tuple[algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]], algopy.arc4.UIntN[typing.Literal[64]]]: ... @algopy.arc4.abimethod def vote( diff --git a/examples/voting/puya.log b/examples/voting/puya.log index ece5ec9957..594d16c319 100644 --- a/examples/voting/puya.log +++ b/examples/voting/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['voting'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['voting'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing voting/out/module.awst debug: Sealing block@0: // L12 @@ -2042,6 +2042,7 @@ debug: examples.voting.voting.VotingRoundApp.vote f-stack on first store: ['ques debug: _puya_lib.util.ensure_budget f-stack entry: [] debug: _puya_lib.util.ensure_budget f-stack on first store: ['required_budget_with_buffer#0'] info: Writing voting/out/VotingRoundApp.arc32.json +info: Writing voting/out/VotingRoundApp.arc56.json info: Writing voting/out/VotingRoundApp.approval.teal info: Writing voting/out/VotingRoundApp.clear.teal info: Writing voting/out/VotingRoundApp.approval.bin diff --git a/test_cases/abi_routing/out/CustomApproval.arc56.json b/test_cases/abi_routing/out/CustomApproval.arc56.json new file mode 100644 index 0000000000..d988c89b28 --- /dev/null +++ b/test_cases/abi_routing/out/CustomApproval.arc56.json @@ -0,0 +1,113 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "CustomApproval", + "structs": {}, + "methods": [ + { + "name": "add_one", + "args": [ + { + "type": "uint64", + "name": "x" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 193 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 224 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 196 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 250 + ], + "errorMessage": "nonsense assert just to generate an init method" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgcHVzaGJ5dGVzICIiCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxMwogICAgLy8gaWYgVHhuLm51bV9hcHBfYXJncyA9PSAyIGFuZCBUeG4uYXBwbGljYXRpb25fYXJncygxKSA9PSBvcC5pdG9iKDQyKToKICAgIHR4biBOdW1BcHBBcmdzCiAgICBwdXNoaW50IDIgLy8gMgogICAgPT0KICAgIGJ6IG1haW5fYWZ0ZXJfaWZfZWxzZUA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBpdG9iCiAgICA9PQogICAgYnogbWFpbl9hZnRlcl9pZl9lbHNlQDUKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weToxNAogICAgLy8gbG9nKCLwn46J8J+OifCfjokiKQogICAgcHVzaGJ5dGVzICJceGYwXHg5Zlx4OGVceDg5XHhmMFx4OWZceDhlXHg4OVx4ZjBceDlmXHg4ZVx4ODkiCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE1CiAgICAvLyByZXN1bHQgPSBzdXBlcigpLmFwcHJvdmFsX3Byb2dyYW0oKQogICAgY2FsbHN1YiBhcHByb3ZhbF9wcm9ncmFtCiAgICBkdXAKICAgIGJ1cnkgMgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjE2CiAgICAvLyBpZiBub3QgcmVzdWx0OgogICAgYm56IG1haW5fYWZ0ZXJfaWZfZWxzZUA3CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTgtMTkKICAgIC8vICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSIKICAgIC8vICIgc28gSSBjYW4gc2F5IHdoYXRldmVyIEkgd2FudCBoZXJlIgogICAgcHVzaGJ5dGVzICJ0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MTctMjAKICAgIC8vIGxvZygKICAgIC8vICAgICAidGhpcyB3aWxsIG5ldmVyIGJlIHNlZW4gdW5sZXNzIHlvdSdyZSBydW5uaW5nIGluIHNpbXVsYXRpb24gbW9kZSBhbnl3YXkiCiAgICAvLyAgICAgIiBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmUiCiAgICAvLyApCiAgICBsb2cKCm1haW5fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIxCiAgICAvLyByZXR1cm4gcmVzdWx0CiAgICBkdXAKICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY3VzdG9tX2FwcHJvdmFsLkN1c3RvbUFwcHJvdmFsLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo2CiAgICAvLyBjbGFzcyBDdXN0b21BcHByb3ZhbChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDUKICAgIHB1c2hieXRlcyAweDAzYjVjMGFmIC8vIG1ldGhvZCAiYWRkX29uZSh1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYWRkX29uZV9yb3V0ZUAyCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZGRfb25lX3JvdXRlQDI6CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhZGRfb25lCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjYKICAgIC8vIGNsYXNzIEN1c3RvbUFwcHJvdmFsKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NgogICAgLy8gY2xhc3MgQ3VzdG9tQXBwcm92YWwoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5hZGRfb25lKHg6IHVpbnQ2NCkgLT4gdWludDY0OgphZGRfb25lOgogICAgLy8gYWJpX3JvdXRpbmcvY3VzdG9tX2FwcHJvdmFsLnB5OjIzLTI0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhZGRfb25lKHNlbGYsIHg6IFVJbnQ2NCkgLT4gVUludDY0OgogICAgcHJvdG8gMSAxCiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6MjUKICAgIC8vIHJldHVybiB4ICsgMQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgcmV0c3ViCgoKLy8gYWxnb3B5LmFyYzQuQVJDNENvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW0oKSAtPiB1aW50NjQ6CmFwcHJvdmFsX3Byb2dyYW06CiAgICBwcm90byAwIDEKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY3VzdG9tX2FwcHJvdmFsLkN1c3RvbUFwcHJvdmFsLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBhYmlfcm91dGluZy9jdXN0b21fYXBwcm92YWwucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFiaV9yb3V0aW5nL2N1c3RvbV9hcHByb3ZhbC5weTo5CiAgICAvLyBhc3NlcnQgVHhuLmFwcGxpY2F0aW9uX2lkID09IDAsICJub25zZW5zZSBhc3NlcnQganVzdCB0byBnZW5lcmF0ZSBhbiBpbml0IG1ldGhvZCIKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gbm9uc2Vuc2UgYXNzZXJ0IGp1c3QgdG8gZ2VuZXJhdGUgYW4gaW5pdCBtZXRob2QKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmN1c3RvbV9hcHByb3ZhbC5DdXN0b21BcHByb3ZhbC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiACAQCAADEYQAADiADlMRuBAhJBABk2GgGBKhYSQQAPgAzwn46J8J+OifCfjomwiAC6SUUCQABsgGl0aGlzIHdpbGwgbmV2ZXIgYmUgc2VlbiB1bmxlc3MgeW91J3JlIHJ1bm5pbmcgaW4gc2ltdWxhdGlvbiBtb2RlIGFueXdheSBzbyBJIGNhbiBzYXkgd2hhdGV2ZXIgSSB3YW50IGhlcmWwSUOKAAExG0EAKYAEA7XArzYaAI4BAAIjiTEZFEQxGEQ2GgEXiAAZFoAEFR98dUxQsCKJMRlAAAYxGBREIokjiYoBAYv/IgiJigABiP+0iYoAADEYFESJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/abi_routing/out/MinimumARC4.arc56.json b/test_cases/abi_routing/out/MinimumARC4.arc56.json new file mode 100644 index 0000000000..5d874f0471 --- /dev/null +++ b/test_cases/abi_routing/out/MinimumARC4.arc56.json @@ -0,0 +1,79 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "MinimumARC4", + "structs": {}, + "methods": [], + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "gvalue": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Z3ZhbHVl" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 29 + ], + "errorMessage": "is creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuYXBwcm92YWxfcHJvZ3JhbToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9lbnRyeXBvaW50QDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fZW50cnlwb2ludEAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5taW5pbWFsLk1pbmltdW1BUkM0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NAogICAgLy8gY2xhc3MgTWluaW11bUFSQzQoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NAogICAgLy8gY2xhc3MgTWluaW11bUFSQzQoQVJDNENvbnRyYWN0KToKICAgIHB1c2hpbnQgMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NQogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFiaV9yb3V0aW5nL21pbmltYWwucHk6NgogICAgLy8gc2VsZi5ndmFsdWUgPSBVSW50NjQoNCkKICAgIHB1c2hieXRlcyAiZ3ZhbHVlIgogICAgcHVzaGludCA0IC8vIDQKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLm1pbmltYWwuTWluaW11bUFSQzQuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CjEYQAADiAAbiAABQ4oAATEbQAAMMRlAAAcxGBREgQGJgQCJigAAgAZndmFsdWWBBGeJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/abi_routing/out/Reference.arc56.json b/test_cases/abi_routing/out/Reference.arc56.json new file mode 100644 index 0000000000..2e9d89be00 --- /dev/null +++ b/test_cases/abi_routing/out/Reference.arc56.json @@ -0,0 +1,798 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Reference", + "structs": {}, + "methods": [ + { + "name": "noop_with_uint64", + "args": [ + { + "type": "uint64", + "name": "a" + } + ], + "returns": { + "type": "uint8" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "full_abi_config", + "args": [ + { + "type": "uint64", + "name": "a" + } + ], + "returns": { + "type": "uint8" + }, + "actions": { + "create": [ + "NoOp", + "OptIn", + "DeleteApplication" + ], + "call": [ + "NoOp", + "OptIn", + "CloseOut", + "UpdateApplication", + "DeleteApplication" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "mixed_oca", + "args": [ + { + "type": "uint64", + "name": "a" + } + ], + "returns": { + "type": "uint8" + }, + "actions": { + "create": [], + "call": [ + "NoOp", + "CloseOut", + "DeleteApplication" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "opt_into_asset", + "args": [ + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "with_transactions", + "args": [ + { + "type": "asset", + "name": "asset" + }, + { + "type": "uint64", + "name": "an_int" + }, + { + "type": "pay", + "name": "pay" + }, + { + "type": "uint64", + "name": "another_int" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "compare_assets", + "args": [ + { + "type": "asset", + "name": "asset_a" + }, + { + "type": "asset", + "name": "asset_b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_address", + "args": [], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_asset", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_app", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "get_a_int", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": true, + "events": [], + "recommendations": {} + }, + { + "name": "method_with_default_args", + "args": [ + { + "type": "asset", + "name": "asset_from_storage", + "defaultValue": { + "source": "global", + "data": "YXNh", + "type": "AVMString" + } + }, + { + "type": "asset", + "name": "asset_from_function", + "defaultValue": { + "source": "method", + "data": "get_asset()uint64" + } + }, + { + "type": "account", + "name": "account_from_storage", + "defaultValue": { + "source": "global", + "data": "Y3JlYXRvcg==", + "type": "AVMString" + } + }, + { + "type": "account", + "name": "account_from_function", + "defaultValue": { + "source": "method", + "data": "get_address()address" + } + }, + { + "type": "application", + "name": "application_from_storage", + "defaultValue": { + "source": "global", + "data": "YXBw", + "type": "AVMString" + } + }, + { + "type": "application", + "name": "application_from_function", + "defaultValue": { + "source": "method", + "data": "get_app()uint64" + } + }, + { + "type": "byte[3]", + "name": "bytes_from_storage", + "defaultValue": { + "source": "global", + "data": "c29tZV9ieXRlcw==", + "type": "AVMString" + } + }, + { + "type": "uint64", + "name": "int_from_storage", + "defaultValue": { + "source": "global", + "data": "YW5faW50", + "type": "AVMString" + } + }, + { + "type": "uint64", + "name": "int_from_function", + "defaultValue": { + "source": "method", + "data": "get_a_int()uint64" + } + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "method_with_15_args", + "args": [ + { + "type": "uint64", + "name": "one" + }, + { + "type": "uint64", + "name": "two" + }, + { + "type": "uint64", + "name": "three" + }, + { + "type": "uint64", + "name": "four" + }, + { + "type": "uint64", + "name": "five" + }, + { + "type": "uint64", + "name": "six" + }, + { + "type": "uint64", + "name": "seven" + }, + { + "type": "uint64", + "name": "eight" + }, + { + "type": "uint64", + "name": "nine" + }, + { + "type": "uint64", + "name": "ten" + }, + { + "type": "uint64", + "name": "eleven" + }, + { + "type": "uint64", + "name": "twelve" + }, + { + "type": "uint64", + "name": "thirteen" + }, + { + "type": "uint64", + "name": "fourteen" + }, + { + "type": "byte[]", + "name": "fifteen" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {}, + "desc": "Fifteen args should not encode the last argument as a tuple" + }, + { + "name": "method_with_more_than_15_args", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + }, + { + "type": "uint64", + "name": "c" + }, + { + "type": "uint64", + "name": "d" + }, + { + "type": "asset", + "name": "asset" + }, + { + "type": "uint64", + "name": "e" + }, + { + "type": "uint64", + "name": "f" + }, + { + "type": "pay", + "name": "pay" + }, + { + "type": "uint64", + "name": "g" + }, + { + "type": "uint64", + "name": "h" + }, + { + "type": "uint64", + "name": "i" + }, + { + "type": "uint64", + "name": "j" + }, + { + "type": "uint64", + "name": "k" + }, + { + "type": "uint64", + "name": "l" + }, + { + "type": "uint64", + "name": "m" + }, + { + "type": "uint64", + "name": "n" + }, + { + "type": "uint64", + "name": "o" + }, + { + "type": "uint64", + "name": "p" + }, + { + "type": "uint64", + "name": "q" + }, + { + "type": "uint64", + "name": "r" + }, + { + "type": "byte[]", + "name": "s" + }, + { + "type": "byte[]", + "name": "t" + }, + { + "type": "asset", + "name": "asset2" + }, + { + "type": "pay", + "name": "pay2" + }, + { + "type": "uint64", + "name": "u" + }, + { + "type": "uint64", + "name": "v" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {}, + "desc": "Application calls only support 16 args, and arc4 calls utilise the first arg for the method\nselector. Args beyond this number are packed into a tuple and placed in the 16th slot." + }, + { + "name": "hello_with_algopy_string", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 3, + "bytes": 2 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "asa": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXNh" + }, + "an_int": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YW5faW50" + }, + "some_bytes": { + "keyType": "AVMString", + "valueType": "byte[3]", + "key": "c29tZV9ieXRlcw==" + }, + "creator": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Y3JlYXRvcg==" + }, + "app": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YXBw" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "DeleteApplication", + "NoOp", + "OptIn" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 767 + ], + "errorMessage": "ASA already opted in" + }, + { + "pc": [ + 157, + 211, + 229, + 263, + 287, + 303, + 319, + 335, + 351, + 408, + 494, + 658 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 192 + ], + "errorMessage": "OnCompletion is one of NoOp, CloseOut, DeleteApplication" + }, + { + "pc": [ + 761 + ], + "errorMessage": "Only creator can opt in to ASA" + }, + { + "pc": [ + 830 + ], + "errorMessage": "asset a == b" + }, + { + "pc": [ + 765, + 796 + ], + "errorMessage": "check self.asa exists" + }, + { + "pc": [ + 1210 + ], + "errorMessage": "has method selector" + }, + { + "pc": [ + 800 + ], + "errorMessage": "is correct asset" + }, + { + "pc": [ + 806, + 820 + ], + "errorMessage": "is correct int" + }, + { + "pc": [ + 706 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 160, + 195, + 214, + 232, + 266, + 290, + 306, + 322, + 338, + 354, + 411, + 497, + 661 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 814 + ], + "errorMessage": "is payment to app" + }, + { + "pc": [ + 251, + 532, + 633 + ], + "errorMessage": "transaction type is pay" + }, + { + "pc": [ + 910 + ], + "errorMessage": "wrong 0th byte from storage" + }, + { + "pc": [ + 920 + ], + "errorMessage": "wrong 1st byte from storage" + }, + { + "pc": [ + 930 + ], + "errorMessage": "wrong 2nd byte from storage" + }, + { + "pc": [ + 888 + ], + "errorMessage": "wrong account from function" + }, + { + "pc": [ + 882 + ], + "errorMessage": "wrong account from storage" + }, + { + "pc": [ + 900 + ], + "errorMessage": "wrong application from function" + }, + { + "pc": [ + 893 + ], + "errorMessage": "wrong application from storage" + }, + { + "pc": [ + 876 + ], + "errorMessage": "wrong asset from function" + }, + { + "pc": [ + 869 + ], + "errorMessage": "wrong asset from storage" + }, + { + "pc": [ + 943 + ], + "errorMessage": "wrong int from function" + }, + { + "pc": [ + 936 + ], + "errorMessage": "wrong int from storage" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMCAyIDEyMwogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1ICJhc2EiIDB4MDAwMDAwMDAwMDAwMDFjOAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTgKICAgIHB1c2hieXRlc3MgMHhkNzhkYjM1YiAweDNhNTM1M2ZjIDB4ZDJmMmY1M2MgMHgyODI2YjIwMiAweDZmOGU5NGNkIDB4MTdkYzY4ZjAgMHg3ZmFkOTc4MCAweDJmZGY5NWE0IDB4MTM5OTgyNmMgMHhhMTMwMDgyMSAweDY1ZjRjYjliIDB4NTczMjE5NWEgMHhkMTc1NTJmYiAweDkwMjNiYjE5IC8vIG1ldGhvZCAibm9vcF93aXRoX3VpbnQ2NCh1aW50NjQpdWludDgiLCBtZXRob2QgImFsbF90aGVfdGhpbmdzKHVpbnQ2NCl1aW50OCIsIG1ldGhvZCAibWl4ZWRfb2NhKHVpbnQ2NCl1aW50OCIsIG1ldGhvZCAib3B0X2ludG9fYXNzZXQoYXNzZXQpdm9pZCIsIG1ldGhvZCAid2l0aF90cmFuc2FjdGlvbnMoYXNzZXQsdWludDY0LHBheSx1aW50NjQpdm9pZCIsIG1ldGhvZCAiY29tcGFyZV9hc3NldHMoYXNzZXQsYXNzZXQpdm9pZCIsIG1ldGhvZCAiZ2V0X2FkZHJlc3MoKWFkZHJlc3MiLCBtZXRob2QgImdldF9hc3NldCgpdWludDY0IiwgbWV0aG9kICJnZXRfYXBwbGljYXRpb24oKXVpbnQ2NCIsIG1ldGhvZCAiZ2V0X2FuX2ludCgpdWludDY0IiwgbWV0aG9kICJtZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3MoYXNzZXQsYXNzZXQsYWNjb3VudCxhY2NvdW50LGFwcGxpY2F0aW9uLGFwcGxpY2F0aW9uLGJ5dGVbM10sdWludDY0LHVpbnQ2NCl2b2lkIiwgbWV0aG9kICJtZXRob2Rfd2l0aF8xNV9hcmdzKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsYnl0ZVtdKWJ5dGVbXSIsIG1ldGhvZCAibWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3ModWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGFzc2V0LHVpbnQ2NCx1aW50NjQscGF5LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LGJ5dGVbXSxieXRlW10sYXNzZXQscGF5LHVpbnQ2NCx1aW50NjQpdWludDY0IiwgbWV0aG9kICJoZWxsb193aXRoX2FsZ29weV9zdHJpbmcoc3RyaW5nKXN0cmluZyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX25vb3Bfd2l0aF91aW50NjRfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hbGxfdGhlX3RoaW5nc19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21peGVkX29jYV9yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fd2l0aF90cmFuc2FjdGlvbnNfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jb21wYXJlX2Fzc2V0c19yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hZGRyZXNzX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2Fzc2V0X3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2FwcGxpY2F0aW9uX3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hbl9pbnRfcm91dGVAMTEgX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzX3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF93aXRoXzE1X2FyZ3Nfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3Nfcm91dGVAMTQgX19wdXlhX2FyYzRfcm91dGVyX19faGVsbG9fd2l0aF9hbGdvcHlfc3RyaW5nX3JvdXRlQDE1CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ub29wX3dpdGhfdWludDY0X3JvdXRlQDI6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTozMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTozMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG5vb3Bfd2l0aF91aW50NjQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FsbF90aGVfdGhpbmdzX3JvdXRlQDM6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTozNy00OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgIE9uQ29tcGxldGVBY3Rpb24uT3B0SW4sCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgIE9uQ29tcGxldGVBY3Rpb24uVXBkYXRlQXBwbGljYXRpb24sCiAgICAvLyAgICAgICAgIE9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBuYW1lPSJhbGxfdGhlX3RoaW5ncyIsCiAgICAvLyAgICAgY3JlYXRlPSJhbGxvdyIsCiAgICAvLyAgICAgcmVhZG9ubHk9VHJ1ZSwKICAgIC8vICkKICAgIGNhbGxzdWIgZnVsbF9hYmlfY29uZmlnCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19taXhlZF9vY2Ffcm91dGVANDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUzLTYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT0iZGlzYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICBpbnRjXzAgLy8gMQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc2hsCiAgICBwdXNoaW50IDM3IC8vIDM3CiAgICAmCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIG9uZSBvZiBOb09wLCBDbG9zZU91dCwgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1My02MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9ImRpc2FsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgY2FsbHN1YiBtaXhlZF9vY2EKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbnRvX2Fzc2V0X3JvdXRlQDU6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojc5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgb3B0X2ludG9fYXNzZXQKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3dpdGhfdHJhbnNhY3Rpb25zX3JvdXRlQDY6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18wIC8vIHBheQogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIHBheQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB3aXRoX3RyYW5zYWN0aW9ucwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY29tcGFyZV9hc3NldHNfcm91dGVANzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgUmVmZXJlbmNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBc3NldHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgY29tcGFyZV9hc3NldHMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hZGRyZXNzX3JvdXRlQDg6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYWRkcmVzcwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2Fzc2V0X3JvdXRlQDk6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYXNzZXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hcHBsaWNhdGlvbl9yb3V0ZUAxMDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hcHBsaWNhdGlvbiIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9hcHAKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9hbl9pbnRfcm91dGVAMTE6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYW5faW50IikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2FfaW50CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF9kZWZhdWx0X2FyZ3Nfcm91dGVAMTI6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjktMTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fc3RvcmFnZSI6ICJhc2EiLAogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9mdW5jdGlvbiI6IGdldF9hc3NldCwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9zdG9yYWdlIjogImNyZWF0b3IiLAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX2Z1bmN0aW9uIjogImdldF9hZGRyZXNzIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fc3RvcmFnZSI6ICJhcHAiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9mdW5jdGlvbiI6IGdldF9hcHAsCiAgICAvLyAgICAgICAgICJieXRlc19mcm9tX3N0b3JhZ2UiOiAic29tZV9ieXRlcyIsCiAgICAvLyAgICAgICAgICJpbnRfZnJvbV9zdG9yYWdlIjogImFuX2ludCIsCiAgICAvLyAgICAgICAgICJpbnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYV9pbnQiLAogICAgLy8gICAgIH0KICAgIC8vICkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBY2NvdW50cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMjktMTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgZGVmYXVsdF9hcmdzPXsKICAgIC8vICAgICAgICAgImFzc2V0X2Zyb21fc3RvcmFnZSI6ICJhc2EiLAogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9mdW5jdGlvbiI6IGdldF9hc3NldCwKICAgIC8vICAgICAgICAgImFjY291bnRfZnJvbV9zdG9yYWdlIjogImNyZWF0b3IiLAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX2Z1bmN0aW9uIjogImdldF9hZGRyZXNzIiwKICAgIC8vICAgICAgICAgImFwcGxpY2F0aW9uX2Zyb21fc3RvcmFnZSI6ICJhcHAiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9mdW5jdGlvbiI6IGdldF9hcHAsCiAgICAvLyAgICAgICAgICJieXRlc19mcm9tX3N0b3JhZ2UiOiAic29tZV9ieXRlcyIsCiAgICAvLyAgICAgICAgICJpbnRfZnJvbV9zdG9yYWdlIjogImFuX2ludCIsCiAgICAvLyAgICAgICAgICJpbnRfZnJvbV9mdW5jdGlvbiI6ICJnZXRfYV9pbnQiLAogICAgLy8gICAgIH0KICAgIC8vICkKICAgIGNhbGxzdWIgbWV0aG9kX3dpdGhfZGVmYXVsdF9hcmdzCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfd2l0aF8xNV9hcmdzX3JvdXRlQDEzOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDQKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDUKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDYKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDcKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICBidG9pCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBtZXRob2Rfd2l0aF8xNV9hcmdzCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3Nfcm91dGVAMTQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNQogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDgKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDkKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgOCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgMTYgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDI0IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCAzMiA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGR1cAogICAgcHVzaGludCA0MCAvLyA0MAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkdXAKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgbGVuCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgNDQgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gcGF5CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgcGF5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxNQogICAgZXh0cmFjdCA0NSA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTUKICAgIGV4dHJhY3QgNTMgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIwNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIG1ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19oZWxsb193aXRoX2FsZ29weV9zdHJpbmdfcm91dGVAMTU6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIFJlZmVyZW5jZShBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGhlbGxvX3dpdGhfYWxnb3B5X3N0cmluZwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxODoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHN3aXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkgX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9hYmlfY29uZmlnQDE5IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfYWJpX2NvbmZpZ0AxOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDIyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfYWJpX2NvbmZpZ0AxOSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX2FiaV9jb25maWdAMTkKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfYWJpX2NvbmZpZ0AxOToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjY2LTc1CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKAogICAgLy8gICAgIGFsbG93X2FjdGlvbnM9WwogICAgLy8gICAgICAgICAiTm9PcCIsCiAgICAvLyAgICAgICAgICJPcHRJbiIsCiAgICAvLyAgICAgICAgICJDbG9zZU91dCIsCiAgICAvLyAgICAgICAgICJVcGRhdGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgICAgICJEZWxldGVBcHBsaWNhdGlvbiIsCiAgICAvLyAgICAgXSwKICAgIC8vICAgICBjcmVhdGU9InJlcXVpcmUiLAogICAgLy8gKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NjYtNzYKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIk9wdEluIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIlVwZGF0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT0icmVxdWlyZSIsCiAgICAvLyApCiAgICAvLyBkZWYgYmFyZV9hYmlfY29uZmlnKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIGJhcmVfYWJpX2NvbmZpZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyMjoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBjbGFzcyBSZWZlcmVuY2UoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5ub29wX3dpdGhfdWludDY0KGE6IGJ5dGVzKSAtPiBieXRlczoKbm9vcF93aXRoX3VpbnQ2NDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMyLTMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBub29wX3dpdGhfdWludDY0KHNlbGYsIGE6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMSAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTozNAogICAgLy8gcmVzdWx0ID0gMSArIGEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTozNQogICAgLy8gcmV0dXJuIGFyYzQuVUludDgocmVzdWx0KQogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmZ1bGxfYWJpX2NvbmZpZyhhOiBieXRlcykgLT4gYnl0ZXM6CmZ1bGxfYWJpX2NvbmZpZzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjM3LTQ5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgT25Db21wbGV0ZUFjdGlvbi5PcHRJbiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgT25Db21wbGV0ZUFjdGlvbi5VcGRhdGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICAgICAgT25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIG5hbWU9ImFsbF90aGVfdGhpbmdzIiwKICAgIC8vICAgICBjcmVhdGU9ImFsbG93IiwKICAgIC8vICAgICByZWFkb25seT1UcnVlLAogICAgLy8gKQogICAgLy8gZGVmIGZ1bGxfYWJpX2NvbmZpZyhzZWxmLCBhOiBhcmM0LlVJbnQ2NCkgLT4gYXJjNC5VSW50ODoKICAgIHByb3RvIDEgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NTAKICAgIC8vIHJlc3VsdCA9IFVJbnQ2NCgxKSArIGEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo1MQogICAgLy8gcmV0dXJuIGFyYzQuVUludDgocmVzdWx0KQogICAgaXRvYgogICAgZXh0cmFjdCA3IDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm1peGVkX29jYShhOiBieXRlcykgLT4gYnl0ZXM6Cm1peGVkX29jYToKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjUzLTYyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoCiAgICAvLyAgICAgYWxsb3dfYWN0aW9ucz1bCiAgICAvLyAgICAgICAgICJOb09wIiwKICAgIC8vICAgICAgICAgIkNsb3NlT3V0IiwKICAgIC8vICAgICAgICAgIkRlbGV0ZUFwcGxpY2F0aW9uIiwKICAgIC8vICAgICBdLAogICAgLy8gICAgIGNyZWF0ZT0iZGlzYWxsb3ciLAogICAgLy8gICAgIHJlYWRvbmx5PVRydWUsCiAgICAvLyApCiAgICAvLyBkZWYgbWl4ZWRfb2NhKHNlbGYsIGE6IGFyYzQuVUludDY0KSAtPiBhcmM0LlVJbnQ4OgogICAgcHJvdG8gMSAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2MwogICAgLy8gcmVzdWx0ID0gVUludDY0KDEpICsgYS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyByZXR1cm4gYXJjNC5VSW50OChyZXN1bHQpCiAgICBpdG9iCiAgICBleHRyYWN0IDcgMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2Uub3B0X2ludG9fYXNzZXQoYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKb3B0X2ludG9fYXNzZXQ6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo3OS04MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgb3B0X2ludG9fYXNzZXQoc2VsZiwgYXNzZXQ6IEFzc2V0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo4MS04MgogICAgLy8gIyBPbmx5IGFsbG93IGFwcCBjcmVhdG9yIHRvIG9wdCB0aGUgYXBwIGFjY291bnQgaW50byBhIEFTQQogICAgLy8gYXNzZXJ0IG9wLlR4bi5zZW5kZXIgPT0gb3AuR2xvYmFsLmNyZWF0b3JfYWRkcmVzcywgIk9ubHkgY3JlYXRvciBjYW4gb3B0IGluIHRvIEFTQSIKICAgIHR4biBTZW5kZXIKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBPbmx5IGNyZWF0b3IgY2FuIG9wdCBpbiB0byBBU0EKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjgzLTg0CiAgICAvLyAjIFZlcmlmeSBhIEFTQSBoYXNuJ3QgYWxyZWFkeSBiZWVuIG9wdGVkIGludG8KICAgIC8vIGFzc2VydCBub3Qgc2VsZi5hc2EsICJBU0EgYWxyZWFkeSBvcHRlZCBpbiIKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJhc2EiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYXNhIGV4aXN0cwogICAgIQogICAgYXNzZXJ0IC8vIEFTQSBhbHJlYWR5IG9wdGVkIGluCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo4NS04NgogICAgLy8gIyBTYXZlIEFTQSBJRCBpbiBnbG9iYWwgc3RhdGUKICAgIC8vIHNlbGYuYXNhID0gYXNzZXQKICAgIGJ5dGVjXzEgLy8gImFzYSIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5Ojg4LTg5CiAgICAvLyAjIFN1Ym1pdCBvcHQtaW4gdHJhbnNhY3Rpb246IDAgYXNzZXQgdHJhbnNmZXIgdG8gc2VsZgogICAgLy8gb3AuSVR4bkNyZWF0ZS5iZWdpbigpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5MAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRfdHlwZV9lbnVtKFRyYW5zYWN0aW9uVHlwZS5Bc3NldFRyYW5zZmVyKQogICAgcHVzaGludCA0IC8vIGF4ZmVyCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5MQogICAgLy8gb3AuSVR4bkNyZWF0ZS5zZXRfZmVlKFVJbnQ2NCgwKSkgICMgY292ZXIgZmVlIHdpdGggb3V0ZXIgdHhuCiAgICBpbnRjXzEgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjkyCiAgICAvLyBvcC5JVHhuQ3JlYXRlLnNldF9hc3NldF9yZWNlaXZlcihvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzKQogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTMKICAgIC8vIG9wLklUeG5DcmVhdGUuc2V0X3hmZXJfYXNzZXQoYXNzZXQpCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo5NAogICAgLy8gb3AuSVR4bkNyZWF0ZS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLndpdGhfdHJhbnNhY3Rpb25zKGFzc2V0OiB1aW50NjQsIGFuX2ludDogYnl0ZXMsIHBheTogdWludDY0LCBhbm90aGVyX2ludDogYnl0ZXMpIC0+IHZvaWQ6CndpdGhfdHJhbnNhY3Rpb25zOgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6OTYtMTAzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB3aXRoX3RyYW5zYWN0aW9ucygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGFzc2V0OiBBc3NldCwKICAgIC8vICAgICBhbl9pbnQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIHBheTogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24sCiAgICAvLyAgICAgYW5vdGhlcl9pbnQ6IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gNCAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBzZWxmLmFzYSA9PSBhc3NldCwgImlzIGNvcnJlY3QgYXNzZXQiCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMSAvLyAiYXNhIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmFzYSBleGlzdHMKICAgIGZyYW1lX2RpZyAtNAogICAgPT0KICAgIGFzc2VydCAvLyBpcyBjb3JyZWN0IGFzc2V0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxMDUKICAgIC8vIGFzc2VydCBhbl9pbnQubmF0aXZlID09IDEsICJpcyBjb3JyZWN0IGludCIKICAgIGZyYW1lX2RpZyAtMwogICAgYnRvaQogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQgLy8gaXMgY29ycmVjdCBpbnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gYXNzZXJ0IHBheS5yZWNlaXZlciA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLCAiaXMgcGF5bWVudCB0byBhcHAiCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBpcyBwYXltZW50IHRvIGFwcAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTA3CiAgICAvLyBhc3NlcnQgYW5vdGhlcl9pbnQubmF0aXZlID09IDIsICJpcyBjb3JyZWN0IGludCIKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgaW50Y18yIC8vIDIKICAgID09CiAgICBhc3NlcnQgLy8gaXMgY29ycmVjdCBpbnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmNvbXBhcmVfYXNzZXRzKGFzc2V0X2E6IHVpbnQ2NCwgYXNzZXRfYjogdWludDY0KSAtPiB2b2lkOgpjb21wYXJlX2Fzc2V0czoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEwOS0xMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGNvbXBhcmVfYXNzZXRzKHNlbGYsIGFzc2V0X2E6IEFzc2V0LCBhc3NldF9iOiBBc3NldCkgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTExCiAgICAvLyBhc3NlcnQgYXNzZXRfYSA9PSBhc3NldF9iLCAiYXNzZXQgYSA9PSBiIgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgID09CiAgICBhc3NlcnQgLy8gYXNzZXQgYSA9PSBiCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5nZXRfYWRkcmVzcygpIC0+IGJ5dGVzOgpnZXRfYWRkcmVzczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExMy0xMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hZGRyZXNzKHNlbGYpIC0+IGFyYzQuQWRkcmVzczoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE1CiAgICAvLyByZXR1cm4gYXJjNC5BZGRyZXNzKCkKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuZ2V0X2Fzc2V0KCkgLT4gYnl0ZXM6CmdldF9hc3NldDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjExNy0xMTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlKQogICAgLy8gZGVmIGdldF9hc3NldChzZWxmKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTE5CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoNDU2KQogICAgYnl0ZWNfMiAvLyAweDAwMDAwMDAwMDAwMDAxYzgKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLmdldF9hcHAoKSAtPiBieXRlczoKZ2V0X2FwcDoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyMS0xMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChyZWFkb25seT1UcnVlLCBuYW1lPSJnZXRfYXBwbGljYXRpb24iKQogICAgLy8gZGVmIGdldF9hcHAoc2VsZikgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyMwogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KDQ1NikKICAgIGJ5dGVjXzIgLy8gMHgwMDAwMDAwMDAwMDAwMWM4CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5nZXRfYV9pbnQoKSAtPiBieXRlczoKZ2V0X2FfaW50OgogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI1LTEyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKHJlYWRvbmx5PVRydWUsIG5hbWU9ImdldF9hbl9pbnQiKQogICAgLy8gZGVmIGdldF9hX2ludChzZWxmKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTI3CiAgICAvLyByZXR1cm4gYXJjNC5VSW50NjQoMykKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDMKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm1ldGhvZF93aXRoX2RlZmF1bHRfYXJncyhhc3NldF9mcm9tX3N0b3JhZ2U6IHVpbnQ2NCwgYXNzZXRfZnJvbV9mdW5jdGlvbjogdWludDY0LCBhY2NvdW50X2Zyb21fc3RvcmFnZTogYnl0ZXMsIGFjY291bnRfZnJvbV9mdW5jdGlvbjogYnl0ZXMsIGFwcGxpY2F0aW9uX2Zyb21fc3RvcmFnZTogdWludDY0LCBhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uOiB1aW50NjQsIGJ5dGVzX2Zyb21fc3RvcmFnZTogYnl0ZXMsIGludF9mcm9tX3N0b3JhZ2U6IGJ5dGVzLCBpbnRfZnJvbV9mdW5jdGlvbjogYnl0ZXMpIC0+IHZvaWQ6Cm1ldGhvZF93aXRoX2RlZmF1bHRfYXJnczoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjEyOS0xNTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgKICAgIC8vICAgICBkZWZhdWx0X2FyZ3M9ewogICAgLy8gICAgICAgICAiYXNzZXRfZnJvbV9zdG9yYWdlIjogImFzYSIsCiAgICAvLyAgICAgICAgICJhc3NldF9mcm9tX2Z1bmN0aW9uIjogZ2V0X2Fzc2V0LAogICAgLy8gICAgICAgICAiYWNjb3VudF9mcm9tX3N0b3JhZ2UiOiAiY3JlYXRvciIsCiAgICAvLyAgICAgICAgICJhY2NvdW50X2Zyb21fZnVuY3Rpb24iOiAiZ2V0X2FkZHJlc3MiLAogICAgLy8gICAgICAgICAiYXBwbGljYXRpb25fZnJvbV9zdG9yYWdlIjogImFwcCIsCiAgICAvLyAgICAgICAgICJhcHBsaWNhdGlvbl9mcm9tX2Z1bmN0aW9uIjogZ2V0X2FwcCwKICAgIC8vICAgICAgICAgImJ5dGVzX2Zyb21fc3RvcmFnZSI6ICJzb21lX2J5dGVzIiwKICAgIC8vICAgICAgICAgImludF9mcm9tX3N0b3JhZ2UiOiAiYW5faW50IiwKICAgIC8vICAgICAgICAgImludF9mcm9tX2Z1bmN0aW9uIjogImdldF9hX2ludCIsCiAgICAvLyAgICAgfQogICAgLy8gKQogICAgLy8gZGVmIG1ldGhvZF93aXRoX2RlZmF1bHRfYXJncygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGFzc2V0X2Zyb21fc3RvcmFnZTogQXNzZXQsCiAgICAvLyAgICAgYXNzZXRfZnJvbV9mdW5jdGlvbjogQXNzZXQsCiAgICAvLyAgICAgYWNjb3VudF9mcm9tX3N0b3JhZ2U6IEFjY291bnQsCiAgICAvLyAgICAgYWNjb3VudF9mcm9tX2Z1bmN0aW9uOiBBY2NvdW50LAogICAgLy8gICAgIGFwcGxpY2F0aW9uX2Zyb21fc3RvcmFnZTogQXBwbGljYXRpb24sCiAgICAvLyAgICAgYXBwbGljYXRpb25fZnJvbV9mdW5jdGlvbjogQXBwbGljYXRpb24sCiAgICAvLyAgICAgYnl0ZXNfZnJvbV9zdG9yYWdlOiBCeXRlczMsCiAgICAvLyAgICAgaW50X2Zyb21fc3RvcmFnZTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgaW50X2Zyb21fZnVuY3Rpb246IGFyYzQuVUludDY0LAogICAgLy8gKSAtPiBOb25lOgogICAgcHJvdG8gOSAwCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTQKICAgIC8vIGFzc2VydCBhc3NldF9mcm9tX3N0b3JhZ2UgPT0gQXNzZXQoMTIzKSwgIndyb25nIGFzc2V0IGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtOQogICAgaW50Y18zIC8vIDEyMwogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBhc3NldCBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1NQogICAgLy8gYXNzZXJ0IGFzc2V0X2Zyb21fZnVuY3Rpb24gPT0gQXNzZXQoNDU2KSwgIndyb25nIGFzc2V0IGZyb20gZnVuY3Rpb24iCiAgICBmcmFtZV9kaWcgLTgKICAgIHB1c2hpbnQgNDU2IC8vIDQ1NgogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBhc3NldCBmcm9tIGZ1bmN0aW9uCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNTYKICAgIC8vIGFzc2VydCBhY2NvdW50X2Zyb21fc3RvcmFnZSA9PSBvcC5HbG9iYWwuY3JlYXRvcl9hZGRyZXNzLCAid3JvbmcgYWNjb3VudCBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTcKICAgIGdsb2JhbCBDcmVhdG9yQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBhY2NvdW50IGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU3CiAgICAvLyBhc3NlcnQgYWNjb3VudF9mcm9tX2Z1bmN0aW9uID09IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MsICJ3cm9uZyBhY2NvdW50IGZyb20gZnVuY3Rpb24iCiAgICBmcmFtZV9kaWcgLTYKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBhY2NvdW50IGZyb20gZnVuY3Rpb24KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE1OAogICAgLy8gYXNzZXJ0IGFwcGxpY2F0aW9uX2Zyb21fc3RvcmFnZSA9PSBBcHBsaWNhdGlvbigxMjMpLCAid3JvbmcgYXBwbGljYXRpb24gZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC01CiAgICBpbnRjXzMgLy8gMTIzCiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFwcGxpY2F0aW9uIGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTU5CiAgICAvLyBhc3NlcnQgYXBwbGljYXRpb25fZnJvbV9mdW5jdGlvbiA9PSBBcHBsaWNhdGlvbig0NTYpLCAid3JvbmcgYXBwbGljYXRpb24gZnJvbSBmdW5jdGlvbiIKICAgIGZyYW1lX2RpZyAtNAogICAgcHVzaGludCA0NTYgLy8gNDU2CiAgICA9PQogICAgYXNzZXJ0IC8vIHdyb25nIGFwcGxpY2F0aW9uIGZyb20gZnVuY3Rpb24KICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2MAogICAgLy8gYXNzZXJ0IGJ5dGVzX2Zyb21fc3RvcmFnZVswXSA9PSBhcmM0LkJ5dGUoNyksICJ3cm9uZyAwdGggYnl0ZSBmcm9tIHN0b3JhZ2UiCiAgICBmcmFtZV9kaWcgLTMKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgcHVzaGJ5dGVzIDB4MDcKICAgIGI9PQogICAgYXNzZXJ0IC8vIHdyb25nIDB0aCBieXRlIGZyb20gc3RvcmFnZQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTYxCiAgICAvLyBhc3NlcnQgYnl0ZXNfZnJvbV9zdG9yYWdlWzFdID09IGFyYzQuQnl0ZSg4KSwgIndyb25nIDFzdCBieXRlIGZyb20gc3RvcmFnZSIKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAxIDEgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBwdXNoYnl0ZXMgMHgwOAogICAgYj09CiAgICBhc3NlcnQgLy8gd3JvbmcgMXN0IGJ5dGUgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjIKICAgIC8vIGFzc2VydCBieXRlc19mcm9tX3N0b3JhZ2VbMl0gPT0gYXJjNC5CeXRlKDkpLCAid3JvbmcgMm5kIGJ5dGUgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDIgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHB1c2hieXRlcyAweDA5CiAgICBiPT0KICAgIGFzc2VydCAvLyB3cm9uZyAybmQgYnl0ZSBmcm9tIHN0b3JhZ2UKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE2MwogICAgLy8gYXNzZXJ0IGludF9mcm9tX3N0b3JhZ2UubmF0aXZlID09IDIsICJ3cm9uZyBpbnQgZnJvbSBzdG9yYWdlIgogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBpbnRjXzIgLy8gMgogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBpbnQgZnJvbSBzdG9yYWdlCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjQKICAgIC8vIGFzc2VydCBpbnRfZnJvbV9mdW5jdGlvbi5uYXRpdmUgPT0gMywgIndyb25nIGludCBmcm9tIGZ1bmN0aW9uIgogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICBwdXNoaW50IDMgLy8gMwogICAgPT0KICAgIGFzc2VydCAvLyB3cm9uZyBpbnQgZnJvbSBmdW5jdGlvbgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UubWV0aG9kX3dpdGhfMTVfYXJncyhvbmU6IHVpbnQ2NCwgdHdvOiB1aW50NjQsIHRocmVlOiB1aW50NjQsIGZvdXI6IHVpbnQ2NCwgZml2ZTogdWludDY0LCBzaXg6IHVpbnQ2NCwgc2V2ZW46IHVpbnQ2NCwgZWlnaHQ6IHVpbnQ2NCwgbmluZTogdWludDY0LCB0ZW46IHVpbnQ2NCwgZWxldmVuOiB1aW50NjQsIHR3ZWx2ZTogdWludDY0LCB0aGlydGVlbjogdWludDY0LCBmb3VydGVlbjogdWludDY0LCBmaWZ0ZWVuOiBieXRlcykgLT4gYnl0ZXM6Cm1ldGhvZF93aXRoXzE1X2FyZ3M6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxNjYtMTg0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Rfd2l0aF8xNV9hcmdzKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgb25lOiBVSW50NjQsCiAgICAvLyAgICAgdHdvOiBVSW50NjQsCiAgICAvLyAgICAgdGhyZWU6IFVJbnQ2NCwKICAgIC8vICAgICBmb3VyOiBVSW50NjQsCiAgICAvLyAgICAgZml2ZTogVUludDY0LAogICAgLy8gICAgIHNpeDogVUludDY0LAogICAgLy8gICAgIHNldmVuOiBVSW50NjQsCiAgICAvLyAgICAgZWlnaHQ6IFVJbnQ2NCwKICAgIC8vICAgICBuaW5lOiBVSW50NjQsCiAgICAvLyAgICAgdGVuOiBVSW50NjQsCiAgICAvLyAgICAgZWxldmVuOiBVSW50NjQsCiAgICAvLyAgICAgdHdlbHZlOiBVSW50NjQsCiAgICAvLyAgICAgdGhpcnRlZW46IFVJbnQ2NCwKICAgIC8vICAgICBmb3VydGVlbjogVUludDY0LAogICAgLy8gICAgIGZpZnRlZW46IEJ5dGVzLAogICAgLy8gKSAtPiBCeXRlczoKICAgIHByb3RvIDE1IDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xODgKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIGZyYW1lX2RpZyAtMTUKICAgIGZyYW1lX2RpZyAtMTQKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xODkKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIGZyYW1lX2RpZyAtMTMKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTAKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgZnJhbWVfZGlnIC0xMgogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MQogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIGZyYW1lX2RpZyAtMTEKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTIKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgZnJhbWVfZGlnIC0xMAogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5MwogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICAvLyArIHNldmVuCiAgICBmcmFtZV9kaWcgLTkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjE4Ny0xOTQKICAgIC8vIG9uZQogICAgLy8gKyB0d28KICAgIC8vICsgdGhyZWUKICAgIC8vICsgZm91cgogICAgLy8gKyBmaXZlCiAgICAvLyArIHNpeAogICAgLy8gKyBzZXZlbgogICAgLy8gKyBlaWdodAogICAgZnJhbWVfZGlnIC04CiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTk1CiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIC8vICsgZWlnaHQKICAgIC8vICsgbmluZQogICAgZnJhbWVfZGlnIC03CiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTk2CiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIC8vICsgZWlnaHQKICAgIC8vICsgbmluZQogICAgLy8gKyB0ZW4KICAgIGZyYW1lX2RpZyAtNgogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MTg3LTE5NwogICAgLy8gb25lCiAgICAvLyArIHR3bwogICAgLy8gKyB0aHJlZQogICAgLy8gKyBmb3VyCiAgICAvLyArIGZpdmUKICAgIC8vICsgc2l4CiAgICAvLyArIHNldmVuCiAgICAvLyArIGVpZ2h0CiAgICAvLyArIG5pbmUKICAgIC8vICsgdGVuCiAgICAvLyArIGVsZXZlbgogICAgZnJhbWVfZGlnIC01CiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTk4CiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIC8vICsgZWlnaHQKICAgIC8vICsgbmluZQogICAgLy8gKyB0ZW4KICAgIC8vICsgZWxldmVuCiAgICAvLyArIHR3ZWx2ZQogICAgZnJhbWVfZGlnIC00CiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMTk5CiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIC8vICsgZWlnaHQKICAgIC8vICsgbmluZQogICAgLy8gKyB0ZW4KICAgIC8vICsgZWxldmVuCiAgICAvLyArIHR3ZWx2ZQogICAgLy8gKyB0aGlydGVlbgogICAgZnJhbWVfZGlnIC0zCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODctMjAwCiAgICAvLyBvbmUKICAgIC8vICsgdHdvCiAgICAvLyArIHRocmVlCiAgICAvLyArIGZvdXIKICAgIC8vICsgZml2ZQogICAgLy8gKyBzaXgKICAgIC8vICsgc2V2ZW4KICAgIC8vICsgZWlnaHQKICAgIC8vICsgbmluZQogICAgLy8gKyB0ZW4KICAgIC8vICsgZWxldmVuCiAgICAvLyArIHR3ZWx2ZQogICAgLy8gKyB0aGlydGVlbgogICAgLy8gKyBmb3VydGVlbgogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToxODYtMjAxCiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG9uZQogICAgLy8gICAgICsgdHdvCiAgICAvLyAgICAgKyB0aHJlZQogICAgLy8gICAgICsgZm91cgogICAgLy8gICAgICsgZml2ZQogICAgLy8gICAgICsgc2l4CiAgICAvLyAgICAgKyBzZXZlbgogICAgLy8gICAgICsgZWlnaHQKICAgIC8vICAgICArIG5pbmUKICAgIC8vICAgICArIHRlbgogICAgLy8gICAgICsgZWxldmVuCiAgICAvLyAgICAgKyB0d2VsdmUKICAgIC8vICAgICArIHRoaXJ0ZWVuCiAgICAvLyAgICAgKyBmb3VydGVlbgogICAgLy8gKQogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDIKICAgIC8vIHJldHVybiBmaWZ0ZWVuCiAgICBmcmFtZV9kaWcgLTEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYWJpX3JvdXRpbmcuY29udHJhY3QuUmVmZXJlbmNlLm1ldGhvZF93aXRoX21vcmVfdGhhbl8xNV9hcmdzKGE6IGJ5dGVzLCBiOiBieXRlcywgYzogYnl0ZXMsIGQ6IHVpbnQ2NCwgYXNzZXQ6IHVpbnQ2NCwgZTogYnl0ZXMsIGY6IGJ5dGVzLCBwYXk6IHVpbnQ2NCwgZzogYnl0ZXMsIGg6IGJ5dGVzLCBpOiBieXRlcywgajogYnl0ZXMsIGs6IGJ5dGVzLCBsOiBieXRlcywgbTogYnl0ZXMsIG46IGJ5dGVzLCBvOiBieXRlcywgcDogdWludDY0LCBxOiBieXRlcywgcjogYnl0ZXMsIHM6IGJ5dGVzLCB0OiBieXRlcywgYXNzZXQyOiB1aW50NjQsIHBheTI6IHVpbnQ2NCwgdTogYnl0ZXMsIHY6IGJ5dGVzKSAtPiBieXRlczoKbWV0aG9kX3dpdGhfbW9yZV90aGFuXzE1X2FyZ3M6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMDQtMjM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Rfd2l0aF9tb3JlX3RoYW5fMTVfYXJncygKICAgIC8vICAgICBzZWxmLAogICAgLy8gICAgIGE6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGI6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGM6IGFyYzQuVUludDY0LAogICAgLy8gICAgIGQ6IFVJbnQ2NCwKICAgIC8vICAgICBhc3NldDogQXNzZXQsCiAgICAvLyAgICAgZTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgZjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcGF5OiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbiwKICAgIC8vICAgICBnOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBoOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBpOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBqOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBrOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICAjIHJ1ZmY6IG5vcWE6IEU3NDEKICAgIC8vICAgICBsOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBtOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBuOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBvOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBwOiBVSW50NjQsCiAgICAvLyAgICAgcTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgcjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgczogQnl0ZXMsCiAgICAvLyAgICAgdDogQnl0ZXMsCiAgICAvLyAgICAgYXNzZXQyOiBBc3NldCwKICAgIC8vICAgICBwYXkyOiBndHhuLlBheW1lbnRUcmFuc2FjdGlvbiwKICAgIC8vICAgICB1OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICB2OiBhcmM0LlVJbnQ2NCwKICAgIC8vICkgLT4gYXJjNC5VSW50NjQ6CiAgICBwcm90byAyNiAxCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyMzkKICAgIC8vIGFzc2VydCBvcC5UeG4ubnVtX2FwcF9hcmdzID09IDE2CiAgICB0eG4gTnVtQXBwQXJncwogICAgcHVzaGludCAxNiAvLyAxNgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQwCiAgICAvLyBhc3NlcnQgcGF5LmFtb3VudCA9PSAxMDAwMDAKICAgIGZyYW1lX2RpZyAtMTkKICAgIGd0eG5zIEFtb3VudAogICAgcHVzaGludCAxMDAwMDAgLy8gMTAwMDAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDEKICAgIC8vIGFzc2VydCBwYXkyLmFtb3VudCA9PSAyMDAwMDAKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDIwMDAwMCAvLyAyMDAwMDAKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0MgogICAgLy8gYXNzZXJ0IGFzc2V0LmlkCiAgICBmcmFtZV9kaWcgLTIyCiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0MwogICAgLy8gYXNzZXJ0IGFzc2V0Mi5pZAogICAgZnJhbWVfZGlnIC00CiAgICBhc3NlcnQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0NQogICAgLy8gbG9nKHMgKyB0KQogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTUKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgKICAgIC8vIGEubmF0aXZlCiAgICBmcmFtZV9kaWcgLTI2CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDkKICAgIC8vICsgYi5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMjUKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNDkKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTAKICAgIC8vICsgYy5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMjQKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTAKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjUxCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICBmcmFtZV9kaWcgLTIzCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTIKICAgIC8vICsgZS5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMjEKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTIKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1MwogICAgLy8gKyBmLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yMAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1MwogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU0CiAgICAvLyArIGcubmF0aXZlCiAgICBmcmFtZV9kaWcgLTE4CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU0CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTUKICAgIC8vICsgaC5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTcKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTUKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1NgogICAgLy8gKyBpLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xNgogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1NgogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjU3CiAgICAvLyArIGoubmF0aXZlCiAgICBmcmFtZV9kaWcgLTE1CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjU3CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNTgKICAgIC8vICsgay5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTQKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNTgKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1OQogICAgLy8gKyBsLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xMwogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI1OQogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgLy8gKyBsLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjYwCiAgICAvLyArIG0ubmF0aXZlCiAgICBmcmFtZV9kaWcgLTEyCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjYwCiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICArCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNjEKICAgIC8vICsgbi5uYXRpdmUKICAgIGZyYW1lX2RpZyAtMTEKICAgIGJ0b2kKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0OC0yNjEKICAgIC8vIGEubmF0aXZlCiAgICAvLyArIGIubmF0aXZlCiAgICAvLyArIGMubmF0aXZlCiAgICAvLyArIGQKICAgIC8vICsgZS5uYXRpdmUKICAgIC8vICsgZi5uYXRpdmUKICAgIC8vICsgZy5uYXRpdmUKICAgIC8vICsgaC5uYXRpdmUKICAgIC8vICsgaS5uYXRpdmUKICAgIC8vICsgai5uYXRpdmUKICAgIC8vICsgay5uYXRpdmUKICAgIC8vICsgbC5uYXRpdmUKICAgIC8vICsgbS5uYXRpdmUKICAgIC8vICsgbi5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2MgogICAgLy8gKyBvLm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xMAogICAgYnRvaQogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI2MgogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgLy8gKyBsLm5hdGl2ZQogICAgLy8gKyBtLm5hdGl2ZQogICAgLy8gKyBuLm5hdGl2ZQogICAgLy8gKyBvLm5hdGl2ZQogICAgKwogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQ4LTI2MwogICAgLy8gYS5uYXRpdmUKICAgIC8vICsgYi5uYXRpdmUKICAgIC8vICsgYy5uYXRpdmUKICAgIC8vICsgZAogICAgLy8gKyBlLm5hdGl2ZQogICAgLy8gKyBmLm5hdGl2ZQogICAgLy8gKyBnLm5hdGl2ZQogICAgLy8gKyBoLm5hdGl2ZQogICAgLy8gKyBpLm5hdGl2ZQogICAgLy8gKyBqLm5hdGl2ZQogICAgLy8gKyBrLm5hdGl2ZQogICAgLy8gKyBsLm5hdGl2ZQogICAgLy8gKyBtLm5hdGl2ZQogICAgLy8gKyBuLm5hdGl2ZQogICAgLy8gKyBvLm5hdGl2ZQogICAgLy8gKyBwCiAgICBmcmFtZV9kaWcgLTkKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2NAogICAgLy8gKyBxLm5hdGl2ZQogICAgZnJhbWVfZGlnIC04CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjY0CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICAvLyArIHAKICAgIC8vICsgcS5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2NQogICAgLy8gKyByLm5hdGl2ZQogICAgZnJhbWVfZGlnIC03CiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjY1CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICAvLyArIHAKICAgIC8vICsgcS5uYXRpdmUKICAgIC8vICsgci5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2NgogICAgLy8gKyB1Lm5hdGl2ZQogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjY2CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICAvLyArIHAKICAgIC8vICsgcS5uYXRpdmUKICAgIC8vICsgci5uYXRpdmUKICAgIC8vICsgdS5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2NwogICAgLy8gKyB2Lm5hdGl2ZQogICAgZnJhbWVfZGlnIC0xCiAgICBidG9pCiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNDgtMjY3CiAgICAvLyBhLm5hdGl2ZQogICAgLy8gKyBiLm5hdGl2ZQogICAgLy8gKyBjLm5hdGl2ZQogICAgLy8gKyBkCiAgICAvLyArIGUubmF0aXZlCiAgICAvLyArIGYubmF0aXZlCiAgICAvLyArIGcubmF0aXZlCiAgICAvLyArIGgubmF0aXZlCiAgICAvLyArIGkubmF0aXZlCiAgICAvLyArIGoubmF0aXZlCiAgICAvLyArIGsubmF0aXZlCiAgICAvLyArIGwubmF0aXZlCiAgICAvLyArIG0ubmF0aXZlCiAgICAvLyArIG4ubmF0aXZlCiAgICAvLyArIG8ubmF0aXZlCiAgICAvLyArIHAKICAgIC8vICsgcS5uYXRpdmUKICAgIC8vICsgci5uYXRpdmUKICAgIC8vICsgdS5uYXRpdmUKICAgIC8vICsgdi5uYXRpdmUKICAgICsKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI0Ny0yNjgKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgKICAgIC8vICAgICBhLm5hdGl2ZQogICAgLy8gICAgICsgYi5uYXRpdmUKICAgIC8vICAgICArIGMubmF0aXZlCiAgICAvLyAgICAgKyBkCiAgICAvLyAgICAgKyBlLm5hdGl2ZQogICAgLy8gICAgICsgZi5uYXRpdmUKICAgIC8vICAgICArIGcubmF0aXZlCiAgICAvLyAgICAgKyBoLm5hdGl2ZQogICAgLy8gICAgICsgaS5uYXRpdmUKICAgIC8vICAgICArIGoubmF0aXZlCiAgICAvLyAgICAgKyBrLm5hdGl2ZQogICAgLy8gICAgICsgbC5uYXRpdmUKICAgIC8vICAgICArIG0ubmF0aXZlCiAgICAvLyAgICAgKyBuLm5hdGl2ZQogICAgLy8gICAgICsgby5uYXRpdmUKICAgIC8vICAgICArIHAKICAgIC8vICAgICArIHEubmF0aXZlCiAgICAvLyAgICAgKyByLm5hdGl2ZQogICAgLy8gICAgICsgdS5uYXRpdmUKICAgIC8vICAgICArIHYubmF0aXZlCiAgICAvLyApCiAgICBpdG9iCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5oZWxsb193aXRoX2FsZ29weV9zdHJpbmcobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpoZWxsb193aXRoX2FsZ29weV9zdHJpbmc6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNzAtMjcxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBoZWxsb193aXRoX2FsZ29weV9zdHJpbmcoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBTdHJpbmc6CiAgICBwcm90byAxIDEKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI3MgogICAgLy8gcmV0dXJuICJIZWxsbyAiICsgbmFtZSArICIhIgogICAgcHVzaGJ5dGVzICJIZWxsbyAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzICIhIgogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5iYXJlX2FiaV9jb25maWcoKSAtPiB2b2lkOgpiYXJlX2FiaV9jb25maWc6CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weTo2Ni03NgogICAgLy8gQGFyYzQuYmFyZW1ldGhvZCgKICAgIC8vICAgICBhbGxvd19hY3Rpb25zPVsKICAgIC8vICAgICAgICAgIk5vT3AiLAogICAgLy8gICAgICAgICAiT3B0SW4iLAogICAgLy8gICAgICAgICAiQ2xvc2VPdXQiLAogICAgLy8gICAgICAgICAiVXBkYXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgICAgICAiRGVsZXRlQXBwbGljYXRpb24iLAogICAgLy8gICAgIF0sCiAgICAvLyAgICAgY3JlYXRlPSJyZXF1aXJlIiwKICAgIC8vICkKICAgIC8vIGRlZiBiYXJlX2FiaV9jb25maWcoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6NzcKICAgIC8vIGxvZygiSGVsbG8gV29ybGQiKQogICAgcHVzaGJ5dGVzICJIZWxsbyBXb3JsZCIKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hYmlfcm91dGluZy5jb250cmFjdC5SZWZlcmVuY2UuX19pbml0X18oKSAtPiB2b2lkOgpfX2luaXRfXzoKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYWJpX3JvdXRpbmcvY29udHJhY3QucHk6MjQKICAgIC8vIHNlbGYuYXNhID0gQXNzZXQoMTIzKQogICAgYnl0ZWNfMSAvLyAiYXNhIgogICAgaW50Y18zIC8vIDEyMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBzZWxmLmFuX2ludCA9IFVJbnQ2NCgyKQogICAgcHVzaGJ5dGVzICJhbl9pbnQiCiAgICBpbnRjXzIgLy8gMgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzZWxmLnNvbWVfYnl0ZXMgPSBCeXRlczMoYXJjNC5CeXRlKDcpLCBhcmM0LkJ5dGUoOCksIGFyYzQuQnl0ZSg5KSkKICAgIHB1c2hieXRlc3MgInNvbWVfYnl0ZXMiIDB4MDcwODA5IC8vICJzb21lX2J5dGVzIiwgMHgwNzA4MDkKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBhYmlfcm91dGluZy9jb250cmFjdC5weToyNwogICAgLy8gc2VsZi5jcmVhdG9yID0gb3AuVHhuLnNlbmRlcgogICAgcHVzaGJ5dGVzICJjcmVhdG9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjI4CiAgICAvLyBzZWxmLmFwcCA9IEFwcGxpY2F0aW9uKDEyMykKICAgIHB1c2hieXRlcyAiYXBwIgogICAgaW50Y18zIC8vIDEyMwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGFiaV9yb3V0aW5nL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhc3NlcnQgYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ2V0KHVpbnQ2NCxieXRlW10pYnl0ZVtdIiksICJoYXMgbWV0aG9kIHNlbGVjdG9yIgogICAgcHVzaGJ5dGVzIDB4MTg5MzkyYzUgLy8gbWV0aG9kICJnZXQodWludDY0LGJ5dGVbXSlieXRlW10iCiAgICBsZW4KICAgIGFzc2VydCAvLyBoYXMgbWV0aG9kIHNlbGVjdG9yCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFiaV9yb3V0aW5nLmNvbnRyYWN0LlJlZmVyZW5jZS5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiAEAQACeyYDBBUffHUDYXNhCAAAAAAAAAHIMRhAAAOIBFuIAAFDigABMRtBAn6CDgTXjbNbBDpTU/wE0vL1PAQoJrICBG+OlM0EF9xo8AR/rZeABC/flaQEE5mCbAShMAghBGX0y5sEVzIZWgTRdVL7BJAjuxk2GgCODgACABUAIQA4AEoAbACEAJQApAC0AMQA/QFTAfcjiTEZFEQxGEQ2GgGIAiMoTFCwIok2GgGIAiQoTFCwIokiMRmQgSUaRDEYRDYaAYgCGihMULAiiTEZFEQxGEQ2GgEXwDCIAhEiiTEZFEQxGEQ2GgEXwDA2GgIxFiIJSTgQIhJENhoDiAIUIokxGRREMRhENhoBF8AwNhoCF8AwiAIcIokxGRREMRhEiAIaKExQsCKJMRkURDEYRIgCEChMULAiiTEZFEQxGESIAgUoTFCwIokxGRREMRhEiAH6KExQsCKJMRkURDEYRDYaARfAMDYaAhfAMDYaAxfAHDYaBBfAHDYaBRfAMjYaBhfAMjYaBzYaCDYaCYgByyKJMRkURDEYRDYaARc2GgIXNhoDFzYaBBc2GgUXNhoGFzYaBxc2GggXNhoJFzYaChc2GgsXNhoMFzYaDRc2Gg4XNhoPVwIAiAHUSRUWVwYCTFAoTFCwIokxGRREMRhENhoBNhoCNhoDNhoEFzYaBRfAMDYaBjYaBzEWJAlJOBAiEkQ2Ggg2Ggk2Ggo2Ggs2Ggw2Gg02Gg42Gg9XAAg2Gg9XCAg2Gg9XEAgXNhoPVxgINhoPVyAINhoPSYEoWUsBgSpZUlcCADYaD0mBKllLARVSVwIANhoPVywBF8AwMRYiCUk4ECISRDYaD1ctCDYaD1c1CIgBWChMULAiiTEZFEQxGEQ2GgFXAgCIAbpJFRZXBgJMUChMULAiiTEZjQYAAgACAAIACwACAAIjiTEYFESIAaYiiSOJigEBi/8XIggWVwcBiYoBAYv/FyIIFlcHAYmKAQGL/xciCBZXBwGJigEAMQAyCRJEIyllRBREKYv/Z7GBBLIQI7IBMgqyFIv/shGziYoEACMpZUSL/BJEi/0XIhJEi/44BzIKEkSL/xckEkSJigIAi/6L/xJEiYoAATIDiYoAASqJigABKomKAAGACAAAAAAAAAADiYoJAIv3JRJEi/iByAMSRIv5MgkSRIv6MgMSRIv7JRJEi/yByAMSRIv9VwABgAEHqESL/VcBAYABCKhEi/1XAgGAAQmoRIv+FyQSRIv/F4EDEkSJig8Bi/GL8giL8wiL9AiL9QiL9giL9wiL+AiL+QiL+giL+wiL/AiL/QiL/ghEi/+JihoBMRuBEBJEi+04CIGgjQYSRIv9OAiBwJoMEkSL6kSL/ESL+ov7ULCL5heL5xcIi+gXCIvpCIvrFwiL7BcIi+4XCIvvFwiL8BcIi/EXCIvyFwiL8xcIi/QXCIv1FwiL9hcIi/cIi/gXCIv5FwiL/hcIi/8XCBaJigEBgAZIZWxsbyCL/1CAASFQiYoAAIALSGVsbG8gV29ybGSwiYoAACklZ4AGYW5faW50JGeCAgpzb21lX2J5dGVzAwcICWeAB2NyZWF0b3IxAGeAA2FwcCVngAQYk5LFFUSJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/abi_routing/puya.log b/test_cases/abi_routing/puya.log index 65ab0ac701..3015ec1b2d 100644 --- a/test_cases/abi_routing/puya.log +++ b/test_cases/abi_routing/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['abi_routing'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['abi_routing'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing abi_routing/out/module.awst debug: Sealing block@0: // L12 @@ -3048,6 +3048,7 @@ debug: Replaced __init___block@0.ops[13]: 'v-load new_state_value%0#0' with 'l-l debug: Found 1 edge set/s for test_cases.abi_routing.contract.Reference.approval_program debug: Found 3 edge set/s for test_cases.abi_routing.contract.Reference.__puya_arc4_router__ info: Writing abi_routing/out/MinimumARC4.arc32.json +info: Writing abi_routing/out/MinimumARC4.arc56.json info: Writing abi_routing/out/MinimumARC4.approval.teal info: Writing abi_routing/out/MinimumARC4.clear.teal info: Writing abi_routing/out/MinimumARC4.approval.bin @@ -3055,6 +3056,7 @@ info: Writing abi_routing/out/MinimumARC4.clear.bin info: Writing abi_routing/out/MinimumARC4.approval.puya.map info: Writing abi_routing/out/MinimumARC4.clear.puya.map info: Writing abi_routing/out/CustomApproval.arc32.json +info: Writing abi_routing/out/CustomApproval.arc56.json info: Writing abi_routing/out/CustomApproval.approval.teal info: Writing abi_routing/out/CustomApproval.clear.teal info: Writing abi_routing/out/CustomApproval.approval.bin @@ -3062,6 +3064,7 @@ info: Writing abi_routing/out/CustomApproval.clear.bin info: Writing abi_routing/out/CustomApproval.approval.puya.map info: Writing abi_routing/out/CustomApproval.clear.puya.map info: Writing abi_routing/out/Reference.arc32.json +info: Writing abi_routing/out/Reference.arc56.json info: Writing abi_routing/out/Reference.approval.teal info: Writing abi_routing/out/Reference.clear.teal info: Writing abi_routing/out/Reference.approval.bin diff --git a/test_cases/application/puya.log b/test_cases/application/puya.log index d3db55845d..9d4be78da2 100644 --- a/test_cases/application/puya.log +++ b/test_cases/application/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['application'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['application'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing application/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc56.json b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc56.json new file mode 100644 index 0000000000..67b42fac52 --- /dev/null +++ b/test_cases/arc4_dynamic_arrays/out/DynamicArrayContract.arc56.json @@ -0,0 +1,210 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "DynamicArrayContract", + "structs": {}, + "methods": [ + { + "name": "test_static_elements", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_dynamic_elements", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_mixed_single_dynamic_elements", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_mixed_multiple_dynamic_elements", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_nested_struct_replacement", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_nested_tuple_modification", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 215 + ], + "errorMessage": "Index access is out of bounds" + }, + { + "pc": [ + 91, + 103, + 115, + 127, + 139, + 151 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 168 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 94, + 106, + 118, + 130, + 142, + 154 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 1189 + ], + "errorMessage": "struct1 does not match struct2" + }, + { + "pc": [ + 1521 + ], + "errorMessage": "tup1 does not match tup2" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEgMiA0CiAgICBieXRlY2Jsb2NrIDB4MDAwNCAweDAwMDIgMHgwMDFjIDB4IDB4MDAxMiAweDAwMWEKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBjbGFzcyBEeW5hbWljQXJyYXlDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDEwCiAgICBwdXNoYnl0ZXNzIDB4NTU3MTU4MjcgMHg3MTNkZDZkYiAweDM3MTU4YWFjIDB4ODU3MGJlM2IgMHg1MWFhOGM0OSAweDI4M2ExODZmIC8vIG1ldGhvZCAidGVzdF9zdGF0aWNfZWxlbWVudHMoKXZvaWQiLCBtZXRob2QgInRlc3RfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQoKXZvaWQiLCBtZXRob2QgInRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbigpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfc3RhdGljX2VsZW1lbnRzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA0IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50c19yb3V0ZUA1IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3N0cnVjdF9yZXBsYWNlbWVudF9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbl9yb3V0ZUA3CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3N0YXRpY19lbGVtZW50c19yb3V0ZUAyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9zdGF0aWNfZWxlbWVudHMKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfZHluYW1pY19lbGVtZW50c19yb3V0ZUAzOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzX3JvdXRlQDQ6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X21peGVkX3NpbmdsZV9keW5hbWljX2VsZW1lbnRzCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21peGVkX211bHRpcGxlX2R5bmFtaWNfZWxlbWVudHNfcm91dGVANToKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50cwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50X3JvdXRlQDY6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50CiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb25fcm91dGVANzoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxMDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNDoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MzgKICAgIC8vIGNsYXNzIER5bmFtaWNBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3Rfc3RhdGljX2VsZW1lbnRzKCkgLT4gdm9pZDoKdGVzdF9zdGF0aWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQwLTQxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3Rfc3RhdGljX2VsZW1lbnRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDIKICAgIC8vIGJ5dGVfYXJyYXkxID0gYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTEoKSwgZ2V0X2J5dGUyKCkpCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0MwogICAgLy8gYnl0ZV9hcnJheTIgPSBhcmM0LlN0YXRpY0FycmF5KGdldF9ieXRlMygpLCBnZXRfYnl0ZTQoKSkKICAgIGNhbGxzdWIgZ2V0X2J5dGUzCiAgICBjYWxsc3ViIGdldF9ieXRlNAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBzdHJ1Y3QxID0gU3RhdGljU3RydWN0KGdldF91aW50MSgpLCBieXRlX2FycmF5MS5jb3B5KCkpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NDYKICAgIC8vIHN0cnVjdDIgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQyKCksIGJ5dGVfYXJyYXkyLmNvcHkoKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0NwogICAgLy8gYXJyYXkgPSBhcmM0LkR5bmFtaWNBcnJheShzdHJ1Y3QxLmNvcHkoKSwgc3RydWN0MS5jb3B5KCkpCiAgICBkaWcgMQogICAgZGlnIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0OAogICAgLy8gYXJyYXlbMV0gPSBzdHJ1Y3QyLmNvcHkoKQogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICA+CiAgICBhc3NlcnQgLy8gSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAxCiAgICByZXBsYWNlMiAxMgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo0OQogICAgLy8gbG9nKGFycmF5KQogICAgZHVwCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NTAKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgZXh0cmFjdCAwIDEwIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBsb2coYXJyYXlbMV0pCiAgICBleHRyYWN0IDEwIDEwIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjUzCiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MgogICAgcHVzaGludCAxMCAvLyAxMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NTQKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QxCiAgICBwdXNoaW50IDEwIC8vIDEwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2ZpeGVkX3NpemUKICAgIHBvcAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9ieXRlMSgpIC0+IGJ5dGVzOgpnZXRfYnl0ZTE6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE5OC0xOTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2J5dGUxKCkgLT4gYXJjNC5CeXRlOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIwMAogICAgLy8gcmV0dXJuIGFyYzQuQnl0ZSg0KQogICAgcHVzaGJ5dGVzIDB4MDQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfYnl0ZTIoKSAtPiBieXRlczoKZ2V0X2J5dGUyOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMDMtMjA0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ieXRlMigpIC0+IGFyYzQuQnl0ZToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMDUKICAgIC8vIHJldHVybiBhcmM0LkJ5dGUoNSkKICAgIHB1c2hieXRlcyAweDA1CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X2J5dGUzKCkgLT4gYnl0ZXM6CmdldF9ieXRlMzoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjA4LTIwOQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfYnl0ZTMoKSAtPiBhcmM0LkJ5dGU6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MjEwCiAgICAvLyByZXR1cm4gYXJjNC5CeXRlKDQyKQogICAgcHVzaGJ5dGVzIDB4MmEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfYnl0ZTQoKSAtPiBieXRlczoKZ2V0X2J5dGU0OgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMTMtMjE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9ieXRlNCgpIC0+IGFyYzQuQnl0ZToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMTUKICAgIC8vIHJldHVybiBhcmM0LkJ5dGUoMjU1KQogICAgcHVzaGJ5dGVzIDB4ZmYKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfdWludDEoKSAtPiBieXRlczoKZ2V0X3VpbnQxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxODgtMTg5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF91aW50MSgpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE5MAogICAgLy8gcmV0dXJuIGFyYzQuVUludDY0KDMpCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDAzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3VpbnQyKCkgLT4gYnl0ZXM6CmdldF91aW50MjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTkzLTE5NAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfdWludDIoKSAtPiBhcmM0LlVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxOTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NCgyKio0MikKICAgIHB1c2hieXRlcyAweDAwMDAwNDAwMDAwMDAwMDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X2R5bmFtaWNfZWxlbWVudHMoKSAtPiB2b2lkOgp0ZXN0X2R5bmFtaWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU2LTU3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfZHluYW1pY19lbGVtZW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBzdHJ1Y3QxID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBzdHJ1Y3QyID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMygpLCBnZXRfc3RyaW5nMSgpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMwogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjYwCiAgICAvLyBhcnJheSA9IGFyYzQuRHluYW1pY0FycmF5KHN0cnVjdDEuY29weSgpLCBzdHJ1Y3QxLmNvcHkoKSkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2MQogICAgLy8gYXJyYXkuYXBwZW5kKHN0cnVjdDEuY29weSgpKQogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIGRpZyAzCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBhcnJheVsxXSA9IHN0cnVjdDIuY29weSgpICAjIHJlcGxhY2UKICAgIGRpZyAxCiAgICBpbnRjXzEgLy8gMQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjYzCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo2NAogICAgLy8gbG9nKGFycmF5WzBdKQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICB1bmNvdmVyIDQKICAgIHNlbGVjdAogICAgZGlnIDUKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NjUKICAgIC8vIGxvZyhhcnJheVsxXSkKICAgIGRpZyAyCiAgICBpbnRjXzIgLy8gMgogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyA0CiAgICBpbnRjXzMgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY2CiAgICAvLyBsb2coYXJyYXlbMl0pCiAgICB1bmNvdmVyIDIKICAgIHB1c2hpbnQgMyAvLyAzCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIHB1c2hpbnQgNiAvLyA2CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAzCiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY4CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIGRpZyAzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3MAogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDIKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6NzEKICAgIC8vIGxvZyhhcnJheSkKICAgIGR1cAogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjcyCiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3MwogICAgLy8gbG9nKGFycmF5KQogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuZ2V0X3N0cmluZzEoKSAtPiBieXRlczoKZ2V0X3N0cmluZzE6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE3My0xNzQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3N0cmluZzEoKSAtPiBhcmM0LlN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxNzUKICAgIC8vIHJldHVybiBhcmM0LlN0cmluZygiYSIpCiAgICBwdXNoYnl0ZXMgMHgwMDAxNjEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfc3RyaW5nMigpIC0+IGJ5dGVzOgpnZXRfc3RyaW5nMjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTc4LTE3OQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBnZXRfc3RyaW5nMigpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE4MAogICAgLy8gcmV0dXJuIGFyYzQuU3RyaW5nKCJiZWUiKQogICAgcHVzaGJ5dGVzIDB4MDAwMzYyNjU2NQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF9zdHJpbmczKCkgLT4gYnl0ZXM6CmdldF9zdHJpbmczOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxODMtMTg0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9zdHJpbmczKCkgLT4gYXJjNC5TdHJpbmc6CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTg1CiAgICAvLyByZXR1cm4gYXJjNC5TdHJpbmcoIkhlbGxvIFdvcmxkIikKICAgIHB1c2hieXRlcyAweDAwMGI0ODY1NmM2YzZmMjA1NzZmNzI2YzY0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QudGVzdF9taXhlZF9zaW5nbGVfZHluYW1pY19lbGVtZW50cygpIC0+IHZvaWQ6CnRlc3RfbWl4ZWRfc2luZ2xlX2R5bmFtaWNfZWxlbWVudHM6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojc1LTc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbWl4ZWRfc2luZ2xlX2R5bmFtaWNfZWxlbWVudHMoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3NwogICAgLy8gc3RydWN0MSA9IE1peGVkU2luZ2xlU3RydWN0KGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgdW5jb3ZlciAyCiAgICBieXRlYyA0IC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo3OAogICAgLy8gc3RydWN0MiA9IE1peGVkU2luZ2xlU3RydWN0KGdldF91aW50MigpLCBnZXRfc3RyaW5nMigpLCBnZXRfdWludDEoKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9zdHJpbmcyCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgdW5jb3ZlciAyCiAgICBieXRlYyA0IC8vIDB4MDAxMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4MAogICAgLy8gYXJyYXkuYXBwZW5kKHN0cnVjdDIuY29weSgpKQogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIGRpZyAxCiAgICBjb25jYXQKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18zIC8vIDB4CiAgICBpbnRjXzEgLy8gMQogICAgZGlnIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjgxCiAgICAvLyBhcnJheS5hcHBlbmQoc3RydWN0Mi5jb3B5KCkpCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjgyCiAgICAvLyBhcnJheVswXSA9IHN0cnVjdDEuY29weSgpICAjIHJlcGxhY2UKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo4NAogICAgLy8gbG9nKGFycmF5WzBdKQogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgbGVuCiAgICBkaWcgNAogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAyCiAgICB1bmNvdmVyIDQKICAgIHNlbGVjdAogICAgZGlnIDUKICAgIHVuY292ZXIgNQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODUKICAgIC8vIGxvZyhhcnJheVsxXSkKICAgIHVuY292ZXIgMgogICAgaW50Y18yIC8vIDIKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMwogICAgaW50Y18zIC8vIDQKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDMKICAgIHN3YXAKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBsb2cKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6ODcKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojg4CiAgICAvLyBhc3NlcnQgYXJyYXkucG9wKCkgPT0gc3RydWN0MQogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnQKICAgIHBvcAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50cygpIC0+IHZvaWQ6CnRlc3RfbWl4ZWRfbXVsdGlwbGVfZHluYW1pY19lbGVtZW50czoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTAtOTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9taXhlZF9tdWx0aXBsZV9keW5hbWljX2VsZW1lbnRzKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6OTMKICAgIC8vIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIxCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5Mi05NAogICAgLy8gc3RydWN0MSA9IE1peGVkTXVsdGlwbGVTdHJ1Y3QoCiAgICAvLyAgICAgZ2V0X3VpbnQxKCksIGdldF9zdHJpbmcxKCksIGdldF91aW50MigpLCBnZXRfdTE2X2FycjEoKSwgZ2V0X3VpbnQxKCkKICAgIC8vICkKICAgIHVuY292ZXIgNAogICAgYnl0ZWNfMiAvLyAweDAwMWMKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGxlbgogICAgcHVzaGludCAyOCAvLyAyOAogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciA0CiAgICBjb25jYXQKICAgIHN3YXAKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5NgogICAgLy8gZ2V0X3VpbnQyKCksIGdldF9zdHJpbmcyKCksIGdldF91aW50MSgpLCBnZXRfdTE2X2FycjIoKSwgZ2V0X3VpbnQyKCkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9zdHJpbmcyCiAgICBjYWxsc3ViIGdldF91aW50MQogICAgY2FsbHN1YiBnZXRfdTE2X2FycjIKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojk1LTk3CiAgICAvLyBzdHJ1Y3QyID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDIoKSwgZ2V0X3N0cmluZzIoKSwgZ2V0X3VpbnQxKCksIGdldF91MTZfYXJyMigpLCBnZXRfdWludDIoKQogICAgLy8gKQogICAgdW5jb3ZlciA0CiAgICBieXRlY18yIC8vIDB4MDAxYwogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBwdXNoaW50IDI4IC8vIDI4CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5Ojk4CiAgICAvLyBhcnJheSA9IGFyYzQuRHluYW1pY0FycmF5KHN0cnVjdDEuY29weSgpLCBzdHJ1Y3QxLmNvcHkoKSkKICAgIGRpZyAxCiAgICBsZW4KICAgIGludGNfMyAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMCAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weTo5OQogICAgLy8gYXJyYXlbMV0gPSBzdHJ1Y3QyLmNvcHkoKQogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTAwCiAgICAvLyBsb2coYXJyYXkpCiAgICBkdXAKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDEKICAgIC8vIGxvZyhhcnJheVswXSkKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkdXAKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGxlbgogICAgZGlnIDQKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZHVwMgogICAgdW5jb3ZlciA0CiAgICBzZWxlY3QKICAgIGRpZyA1CiAgICB1bmNvdmVyIDUKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgbG9nCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gbG9nKGFycmF5WzFdKQogICAgdW5jb3ZlciAyCiAgICBpbnRjXzIgLy8gMgogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAzCiAgICBpbnRjXzMgLy8gNAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMwogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGxvZwogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCBhcnJheS5wb3AoKSA9PSBzdHJ1Y3QyCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudAogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwNQogICAgLy8gYXNzZXJ0IGFycmF5LnBvcCgpID09IHN0cnVjdDEKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50CiAgICBwb3AKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5nZXRfdTE2X2FycjEoKSAtPiBieXRlczoKZ2V0X3UxNl9hcnIxOgogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMTgtMjE5CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF91MTZfYXJyMSgpIC0+IGFyYzQuRHluYW1pY0FycmF5W2FyYzQuVUludDE2XToKICAgIHByb3RvIDAgMQogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToyMjAKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheShhcmM0LlVJbnQxNigyKioxNiAtIDEpLCBhcmM0LlVJbnQxNigwKSwgYXJjNC5VSW50MTYoNDIpKQogICAgcHVzaGJ5dGVzIDB4MDAwM2ZmZmYwMDAwMDAyYQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LmdldF91MTZfYXJyMigpIC0+IGJ5dGVzOgpnZXRfdTE2X2FycjI6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIyMy0yMjQKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3UxNl9hcnIyKCkgLT4gYXJjNC5EeW5hbWljQXJyYXlbYXJjNC5VSW50MTZdOgogICAgcHJvdG8gMCAxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjIyNQogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuVUludDE2KDEpLCBhcmM0LlVJbnQxNigyKSwgYXJjNC5VSW50MTYoMyksIGFyYzQuVUludDE2KDQpKQogICAgcHVzaGJ5dGVzIDB4MDAwNDAwMDEwMDAyMDAwMzAwMDQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF9keW5hbWljX2FycmF5cy5jb250cmFjdC5EeW5hbWljQXJyYXlDb250cmFjdC50ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQoKSAtPiB2b2lkOgp0ZXN0X25lc3RlZF9zdHJ1Y3RfcmVwbGFjZW1lbnQ6CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEwNy0xMDgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uZXN0ZWRfc3RydWN0X3JlcGxhY2VtZW50KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTA5CiAgICAvLyBvbmUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQxKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUxKCksIGdldF9ieXRlMigpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY2FsbHN1YiBnZXRfYnl0ZTIKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMAogICAgLy8gdHdvID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMQogICAgLy8gdGhyZWUgPSBTdGF0aWNTdHJ1Y3QoZ2V0X3VpbnQyKCksIGFyYzQuU3RhdGljQXJyYXkoZ2V0X2J5dGUyKCksIGdldF9ieXRlMSgpKSkKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF9ieXRlMgogICAgY2FsbHN1YiBnZXRfYnl0ZTEKICAgIGNvbmNhdAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMwogICAgLy8gZ2V0X3VpbnQxKCksIGdldF9zdHJpbmcxKCksIGdldF91aW50MigpLCBnZXRfdTE2X2FycjEoKSwgZ2V0X3VpbnQxKCkKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF91aW50MgogICAgY2FsbHN1YiBnZXRfdTE2X2FycjEKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExMi0xMTQKICAgIC8vIGZvdXIgPSBNaXhlZE11bHRpcGxlU3RydWN0KAogICAgLy8gICAgIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTE1CiAgICAvLyBmaXZlID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjExNi0xMjIKICAgIC8vIHN0cnVjdDEgPSBOZXN0ZWREeW5hbWljU3RydWN0KAogICAgLy8gICAgIG9uZT1vbmUuY29weSgpLAogICAgLy8gICAgIHR3bz10d28uY29weSgpLAogICAgLy8gICAgIHRocmVlPXRocmVlLmNvcHkoKSwKICAgIC8vICAgICBmb3VyPWZvdXIuY29weSgpLAogICAgLy8gICAgIGZpdmU9Zml2ZS5jb3B5KCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjIDUgLy8gMHgwMDFhCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjYgLy8gMjYKICAgIGRpZyAxCiAgICArCiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA1CiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgZGlnIDEKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDYKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGNvbmNhdAogICAgZGlnIDQKICAgIGNvbmNhdAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMjUKICAgIC8vIHR3bz1EeW5hbWljU3RydWN0KGdldF9zdHJpbmcyKCksIGdldF9zdHJpbmcxKCkpLCAgIyB0aGlzIGlzIHRoZSBkaWZmZXJlbmNlIHdpdGggc3RydWN0MQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjEyMy0xMjkKICAgIC8vIHN0cnVjdDIgPSBOZXN0ZWREeW5hbWljU3RydWN0KAogICAgLy8gICAgIG9uZT1vbmUuY29weSgpLAogICAgLy8gICAgIHR3bz1EeW5hbWljU3RydWN0KGdldF9zdHJpbmcyKCksIGdldF9zdHJpbmcxKCkpLCAgIyB0aGlzIGlzIHRoZSBkaWZmZXJlbmNlIHdpdGggc3RydWN0MQogICAgLy8gICAgIHRocmVlPXRocmVlLmNvcHkoKSwKICAgIC8vICAgICBmb3VyPWZvdXIuY29weSgpLAogICAgLy8gICAgIGZpdmU9Zml2ZS5jb3B5KCksCiAgICAvLyApCiAgICBkdXAKICAgIGxlbgogICAgcHVzaGludCAyNiAvLyAyNgogICAgKwogICAgZHVwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciA1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTMxCiAgICAvLyBzdHJ1Y3QyLnR3byA9IHR3by5jb3B5KCkgICMgbm93IHN0cnVjdDIgc2hvdWxkIG1hdGNoIHN0cnVjdDEKICAgIGR1cAogICAgcHVzaGludCAxMCAvLyAxMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZGlnIDIKICAgIGV4dHJhY3QzCiAgICBkaWcgMgogICAgcHVzaGludCAyMiAvLyAyMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDYKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBzd2FwCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGRpZyAxCiAgICBwdXNoaW50IDIyIC8vIDIyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDQKICAgICsKICAgIGRpZyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAyCiAgICBzd2FwCiAgICByZXBsYWNlMiAyMgogICAgZHVwCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciA0CiAgICArCiAgICB1bmNvdmVyIDIKICAgIC0KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICByZXBsYWNlMiAyNAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMzIKICAgIC8vIGFzc2VydCBzdHJ1Y3QxLmJ5dGVzID09IHN0cnVjdDIuYnl0ZXMsICJzdHJ1Y3QxIGRvZXMgbm90IG1hdGNoIHN0cnVjdDIiCiAgICA9PQogICAgYXNzZXJ0IC8vIHN0cnVjdDEgZG9lcyBub3QgbWF0Y2ggc3RydWN0MgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X2R5bmFtaWNfYXJyYXlzLmNvbnRyYWN0LkR5bmFtaWNBcnJheUNvbnRyYWN0LnRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbigpIC0+IHZvaWQ6CnRlc3RfbmVzdGVkX3R1cGxlX21vZGlmaWNhdGlvbjoKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM0LTEzNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25lc3RlZF90dXBsZV9tb2RpZmljYXRpb24oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gYXJjNF9keW5hbWljX2FycmF5cy9jb250cmFjdC5weToxMzYKICAgIC8vIG9uZSA9IFN0YXRpY1N0cnVjdChnZXRfdWludDEoKSwgYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTEoKSwgZ2V0X2J5dGUyKCkpKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X2J5dGUxCiAgICBjYWxsc3ViIGdldF9ieXRlMgogICAgY29uY2F0CiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM3CiAgICAvLyB0d28gPSBEeW5hbWljU3RydWN0KGdldF9zdHJpbmcxKCksIGdldF9zdHJpbmcyKCkpCiAgICBjYWxsc3ViIGdldF9zdHJpbmcxCiAgICBjYWxsc3ViIGdldF9zdHJpbmcyCiAgICBkaWcgMQogICAgbGVuCiAgICBpbnRjXzMgLy8gNAogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGJ5dGVjXzAgLy8gMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM4CiAgICAvLyB0aHJlZSA9IFN0YXRpY1N0cnVjdChnZXRfdWludDIoKSwgYXJjNC5TdGF0aWNBcnJheShnZXRfYnl0ZTIoKSwgZ2V0X2J5dGUxKCkpKQogICAgY2FsbHN1YiBnZXRfdWludDIKICAgIGNhbGxzdWIgZ2V0X2J5dGUyCiAgICBjYWxsc3ViIGdldF9ieXRlMQogICAgY29uY2F0CiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQwCiAgICAvLyBnZXRfdWludDEoKSwgZ2V0X3N0cmluZzEoKSwgZ2V0X3VpbnQyKCksIGdldF91MTZfYXJyMSgpLCBnZXRfdWludDEoKQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICBjYWxsc3ViIGdldF91MTZfYXJyMQogICAgY2FsbHN1YiBnZXRfdWludDEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTM5LTE0MQogICAgLy8gZm91cjEgPSBNaXhlZE11bHRpcGxlU3RydWN0KAogICAgLy8gICAgIGdldF91aW50MSgpLCBnZXRfc3RyaW5nMSgpLCBnZXRfdWludDIoKSwgZ2V0X3UxNl9hcnIxKCksIGdldF91aW50MSgpCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQzCiAgICAvLyBnZXRfdWludDEoKSwKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NAogICAgLy8gZ2V0X3N0cmluZzEoKSwKICAgIGNhbGxzdWIgZ2V0X3N0cmluZzEKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQ1CiAgICAvLyBnZXRfdWludDIoKSwKICAgIGNhbGxzdWIgZ2V0X3VpbnQyCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0NgogICAgLy8gZ2V0X3UxNl9hcnIxKCkgKyAoYXJjNC5VSW50MTYoMTIzKSwpLCAgIyBub3FhOiBSVUYwMDUKICAgIGNhbGxzdWIgZ2V0X3UxNl9hcnIxCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4MDA3YgogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDIKICAgIC8KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQ3CiAgICAvLyBnZXRfdWludDEoKSwKICAgIGNhbGxzdWIgZ2V0X3VpbnQxCiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE0Mi0xNDgKICAgIC8vIGZvdXIyID0gTWl4ZWRNdWx0aXBsZVN0cnVjdCgKICAgIC8vICAgICBnZXRfdWludDEoKSwKICAgIC8vICAgICBnZXRfc3RyaW5nMSgpLAogICAgLy8gICAgIGdldF91aW50MigpLAogICAgLy8gICAgIGdldF91MTZfYXJyMSgpICsgKGFyYzQuVUludDE2KDEyMyksKSwgICMgbm9xYTogUlVGMDA1CiAgICAvLyAgICAgZ2V0X3VpbnQxKCksCiAgICAvLyApCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzIgLy8gMHgwMDFjCiAgICBjb25jYXQKICAgIGRpZyA0CiAgICBsZW4KICAgIHB1c2hpbnQgMjggLy8gMjgKICAgICsKICAgIHN3YXAKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICBzd2FwCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIGFyYzRfZHluYW1pY19hcnJheXMvY29udHJhY3QucHk6MTQ5CiAgICAvLyBmaXZlID0gRHluYW1pY1N0cnVjdChnZXRfc3RyaW5nMSgpLCBnZXRfc3RyaW5nMigpKQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMQogICAgY2FsbHN1YiBnZXRfc3RyaW5nMgogICAgZGlnIDEKICAgIGxlbgogICAgaW50Y18zIC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18wIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE1MC0xNTgKICAgIC8vIHR1cDEgPSBhcmM0LlR1cGxlKAogICAgLy8gICAgICgKICAgIC8vICAgICAgICAgb25lLmNvcHkoKSwKICAgIC8vICAgICAgICAgdHdvLmNvcHkoKSwKICAgIC8vICAgICAgICAgdGhyZWUuY29weSgpLAogICAgLy8gICAgICAgICBmb3VyMS5jb3B5KCksCiAgICAvLyAgICAgICAgIGZpdmUuY29weSgpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIHVuY292ZXIgNQogICAgYnl0ZWMgNSAvLyAweDAwMWEKICAgIGNvbmNhdAogICAgZGlnIDUKICAgIGxlbgogICAgcHVzaGludCAyNiAvLyAyNgogICAgKwogICAgc3dhcAogICAgdW5jb3ZlciA1CiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBkaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGRpZyA2CiAgICBjb25jYXQKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgMwogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE1OS0xNjcKICAgIC8vIHR1cDIgPSBhcmM0LlR1cGxlKAogICAgLy8gICAgICgKICAgIC8vICAgICAgICAgb25lLmNvcHkoKSwKICAgIC8vICAgICAgICAgdHdvLmNvcHkoKSwKICAgIC8vICAgICAgICAgdGhyZWUuY29weSgpLAogICAgLy8gICAgICAgICBmb3VyMi5jb3B5KCksCiAgICAvLyAgICAgICAgIGZpdmUuY29weSgpLAogICAgLy8gICAgICkKICAgIC8vICkKICAgIGRpZyA0CiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgMgogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE2OQogICAgLy8gdHVwMlszXS5kLnBvcCgpCiAgICBkdXAKICAgIHB1c2hpbnQgMjIgLy8gMjIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgcHVzaGludCAyNCAvLyAyNAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICBkaWcgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgcHVzaGludCAxOCAvLyAxOAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBsZW4KICAgIGRpZyAyCiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBpbnRjXzIgLy8gMgogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplCiAgICBidXJ5IDEKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdDMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGludGNfMCAvLyAwCiAgICBkaWcgNAogICAgZXh0cmFjdDMKICAgIGRpZyA0CiAgICBsZW4KICAgIHVuY292ZXIgNQogICAgZGlnIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgc3dhcAogICAgZGlnIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIHVuY292ZXIgMwogICAgLQogICAgdW5jb3ZlciAyCiAgICBsZW4KICAgIGRpZyAyCiAgICBwdXNoaW50IDI0IC8vIDI0CiAgICBleHRyYWN0X3VpbnQxNgogICAgKwogICAgc3dhcAogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHJlcGxhY2UyIDI0CiAgICAvLyBhcmM0X2R5bmFtaWNfYXJyYXlzL2NvbnRyYWN0LnB5OjE3MAogICAgLy8gYXNzZXJ0IHR1cDEuYnl0ZXMgPT0gdHVwMi5ieXRlcywgInR1cDEgZG9lcyBub3QgbWF0Y2ggdHVwMiIKICAgID09CiAgICBhc3NlcnQgLy8gdHVwMSBkb2VzIG5vdCBtYXRjaCB0dXAyCiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X3BvcF9maXhlZF9zaXplKGFycmF5OiBieXRlcywgZml4ZWRfYnl0ZV9zaXplOiB1aW50NjQpIC0+IGJ5dGVzLCBieXRlczoKZHluYW1pY19hcnJheV9wb3BfZml4ZWRfc2l6ZToKICAgIHByb3RvIDIgMgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMAogICAgZnJhbWVfZGlnIC0yCiAgICBzd2FwCiAgICByZXBsYWNlMiAwCiAgICBkdXAKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICAtCiAgICBkdXAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QzCiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudChhcnJheTogYnl0ZXMpIC0+IGJ5dGVzLCBieXRlczoKZHluYW1pY19hcnJheV9wb3BfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMSAyCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGR1cAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICBkdXAKICAgIGxlbgogICAgc3dhcAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgYnl0ZWNfMyAvLyAweAogICAgaW50Y18wIC8vIDAKCmR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgNgogICAgZnJhbWVfZGlnIDEKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfcG9wX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDIKICAgIGZyYW1lX2RpZyA2CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzIgLy8gMgogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyA1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgNQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNgogICAgYiBkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X3BvcF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgMAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyA1CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfZGlnIDIKICAgIHN3YXAKICAgIGZyYW1lX2RpZyAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9idXJ5IDAKICAgIGZyYW1lX2J1cnkgMQogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50KGFycmF5X2l0ZW1zX2NvdW50OiB1aW50NjQsIGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbXNfY291bnQ6IHVpbnQ2NCwgbmV3X2hlYWRfYW5kX3RhaWw6IGJ5dGVzKSAtPiBieXRlczoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBieXRlY18zIC8vICIiCiAgICBkdXAKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGludGNfMCAvLyAwCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAzCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBmcmFtZV9idXJ5IDAKICAgIGludGNfMCAvLyAwCiAgICBmcmFtZV9idXJ5IDQKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDU6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDIKICAgIDwKICAgIGJ6IGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAOAogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBjb3ZlciAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDAKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgc3dhcAogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDEKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJANQoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA4OgogICAgZnJhbWVfZGlnIC00CiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgMQogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9kaWcgMAogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgMgogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChzb3VyY2U6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gMyAxCiAgICBmcmFtZV9kaWcgLTMKICAgIHN1YnN0cmluZyAwIDIKICAgIGR1cAogICAgYnRvaQogICAgZnJhbWVfZGlnIC0zCiAgICBleHRyYWN0IDIgMAogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIHVuY292ZXIgMwogICAgY2FsbHN1YiBzdGF0aWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gX3B1eWFfbGliLmFyYzQuc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50KGFycmF5X2hlYWRfYW5kX3RhaWw6IGJ5dGVzLCBuZXdfaXRlbTogYnl0ZXMsIGluZGV4OiB1aW50NjQsIGFycmF5X2xlbmd0aDogdWludDY0KSAtPiBieXRlczoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50OgogICAgcHJvdG8gNCAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTQKICAgIHN3YXAKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgLTQKICAgIGxlbgogICAgZnJhbWVfZGlnIC0xCiAgICBmcmFtZV9kaWcgLTIKICAgIC0KICAgIGludGNfMSAvLyAxCiAgICAtCiAgICBkaWcgMQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgZHVwCiAgICBkaWcgMwogICAgLQogICAgY292ZXIgMwogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGNvdmVyIDMKICAgIGZyYW1lX2RpZyAtNAogICAgaW50Y18wIC8vIDAKICAgIHVuY292ZXIgNAogICAgc3Vic3RyaW5nMwogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDMKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzIgLy8gMgogICAgKgoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyAwCiAgICBmcmFtZV9kaWcgNAogICAgPAogICAgYnogc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgMwogICAgZHVwCiAgICBmcmFtZV9kaWcgMAogICAgZHVwCiAgICBjb3ZlciAzCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIDIKICAgICsKICAgIGZyYW1lX2RpZyAxCiAgICAtCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZGlnIDIKICAgIHN3YXAKICAgIHJlcGxhY2UzCiAgICBmcmFtZV9idXJ5IDMKICAgIGludGNfMiAvLyAyCiAgICArCiAgICBmcmFtZV9idXJ5IDAKICAgIGIgc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMQoKc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0OgogICAgZnJhbWVfZGlnIDMKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfZHluYW1pY19hcnJheXMuY29udHJhY3QuRHluYW1pY0FycmF5Q29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAAECBCYGAgAEAgACAgAcAAIAEgIAGogAAUOKAAExG0EAe4IGBFVxWCcEcT3W2wQ3FYqsBIVwvjsEUaqMSQQoOhhvNhoAjgYAAgAOABoAJgAyAD4iiTEZFEQxGESIAEsjiTEZFEQxGESIAMgjiTEZFEQxGESIAawjiTEZFEQxGESIAigjiTEZFEQxGESIAu4jiTEZFEQxGESIBAkjiTEZQAAGMRgURCOJIomKAACIAEuIAE9QiABSiABWUIgAWU8CUIgAYU8CUEsBSwJQKUxQSSJZIw1ESwFcDEmwSVcCAElXAAqwVwoKsIEKiAUDTE8CEkSBCogE+UgSRImKAAGAAQSJigABgAEFiYoAAYABKomKAAGAAf+JigABgAgAAAAAAAAAA4mKAAGACAAABAAAAAAAiYoAAIgAw4gAyUsBFSUIFlcGAihMUE8CUExQiADAiACpSwEVJQgWVwYCKExQTwJQTFBLARUlCBZXBgIoTFBLAlBLAlApTFApSwNQSwEiWU8CVwIAI08DiAToSwEjiAViSbBJVwIASSJZSwIiWUkjCUsDFUsEJFlKTwRNSwVPBU8CUrBLAiQJSwQlWUsDSwFPA01LBU8DTwJSsE8CgQMJSwOBBllPA0xPAk1SsIgEMUxLAxJESbCIBCdMTwISREmwiAQdTE8CEkSwiYoAAYADAAFhiYoAAYAFAANiZWWJigABgA0AC0hlbGxvIFdvcmxkiYoAAIj+7oj/0Ij+9k8CJwRQTFBMUIj+6oj/x4j+1k8CJwRQTFBMUClLAVAiKyNLA4gEHkkiWUxXAgAjTwOIBBFLAiKIBItJsElXAgBJIllLAiJZSSMJSwMVSwQkWUpPBE1LBU8FTwJSsE8CJAlLAyVZTwNMTwJNUrCIA3NMTwISRIgDa0gSRImKAACI/maI/0iI/m6IAKWI/lpPBCpQSwQVgRwITE8EUEwWVwYCUExQTwJQTFCI/kqI/yeI/jaIAImI/j5PBCpQSwQVgRwITE8EUEwWVwYCUExQTwJQTFBLARUlCBZXBgIoTFBLAlBLAlApTFBLASOIA9dJsElXAgBJIllLAiJZSSMJSwMVSwQkWUpPBE1LBU8FTwJSsE8CJAlLAyVZTwNMTwJNUrCIAr9MTwISRIgCt0gSRImKAAGACAAD//8AAAAqiYoAAYAKAAQAAQACAAMABImKAACI/ZSI/XWI/XlQUIj+boj+dEsBFSUIFlcGAihMUE8CUExQiP2AiP1aiP1QUFCI/WeI/kmI/W+I/6aI/VtPBCpQSwQVgRwITE8EUEwWVwYCUExQTwJQTFCI/iKI/ihLARUlCBZXBgIoTFBPAlBMUE8EJwVQSwQVgRpLAQhPAk8FUEsBFlcGAksBTFBLBRVPA0sBCBZXBgJPAkxQSwZQSwVQSwRQiP3fiP3TSwEVJQgWVwYCKExQTwJQTFBJFYEaCEkWVwYCTwVMUExPBAgWVwYCUExQTwRQTwNQSYEKWUsBIksCWEsCgRZZSwMVTwRLAk8CUk8CTwZQTFBMTwIJSwGBFllLBAhLAQkWVwYCTwJMXBZJgRhZTwQITwIJFlcGAlwYEkSJigAAiPxtiPxOiPxSUFCI/UeI/U1LARUlCBZXBgIoTFBPAlBMUIj8WYj8M4j8KVBQiPxAiP0iiPxIiP5/iPw0TwQqUEsEFYEcCExPBFBMFlcGAlBMUE8CUExQiPwWiPz4iPweiP5VVwIAgAIAe1BJFSQKFlcGAkxQiPv4TwQqUEsEFYEcCExPBFBMFlcGAlBMUE8CUExQiPy/iPzFSwEVJQgWVwYCKExQTwJQTFBPBScFUEsFFYEaCExPBVBLARZXBgJQSwQVSwIIFlcGAksBTFBLBlBPBVBLA1BLBBVPAwgWVwYCTwJMUE8EUE8DUE8CUEmBFllLAYEYWUsCSwJLAlJJgRJZSwEVSwJLAk8CUiSIADlFAU8CIk8DWExQSwMiSwRYSwQVTwVLBE8CUkxLAlBMUE8CTwMJTwIVSwKBGFkITAkWVwYCXBgSRImKAgKL/iJZIwkWVwYAi/5MXABJFYv/CUqL/1hPAiJPA1KJigECi/8iWSMJSSQLSYv/VwIASU4CSU8CWUlPAkkVTE4CUisiiwaLAQxBABuLAosGSU4CWSQJFlcGAosFTFCMBSQIjAZC/92LABZXBgKLBVCLASQIiwJMiwNSUIsEjACMAYmKBAErSYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv+i/9PA4gAAlCJigQBi/4kC4v8TFmL/iMIJAtJTgKL/ExZi/wVi/+L/gkjCUsBTwNPAk1JSwMJTgOL/RVOA4v8Ik8EUov9UIv8TwJPA1JQi/8kC4sAiwQMQQAgiwNJiwBJTgNZiwIIiwEJFlcGAksCTF2MAyQIjABC/9iLA4wAiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/arc4_dynamic_arrays/puya.log b/test_cases/arc4_dynamic_arrays/puya.log index 68b508114e..fa7f5a35e9 100644 --- a/test_cases/arc4_dynamic_arrays/puya.log +++ b/test_cases/arc4_dynamic_arrays/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_dynamic_arrays'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_dynamic_arrays'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv arc4_dynamic_arrays/contract.py:169:9 warning: expression result is ignored info: writing arc4_dynamic_arrays/out/module.awst @@ -4818,6 +4818,7 @@ debug: _puya_lib.arc4.dynamic_array_concat_dynamic_element f-stack on first stor debug: _puya_lib.arc4.static_array_replace_dynamic_element f-stack entry: [] debug: _puya_lib.arc4.static_array_replace_dynamic_element f-stack on first store: ['head_offset#0', 'original_item_length#0', 'new_item_length#0', 'new_head_and_tail#0', 'tmp%7#0'] info: Writing arc4_dynamic_arrays/out/DynamicArrayContract.arc32.json +info: Writing arc4_dynamic_arrays/out/DynamicArrayContract.arc56.json info: Writing arc4_dynamic_arrays/out/DynamicArrayContract.approval.teal info: Writing arc4_dynamic_arrays/out/DynamicArrayContract.clear.teal info: Writing arc4_dynamic_arrays/out/DynamicArrayContract.approval.bin diff --git a/test_cases/arc4_numeric_comparisons/puya.log b/test_cases/arc4_numeric_comparisons/puya.log index 77073d908b..b6b991dcbd 100644 --- a/test_cases/arc4_numeric_comparisons/puya.log +++ b/test_cases/arc4_numeric_comparisons/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_numeric_comparisons'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_numeric_comparisons'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing arc4_numeric_comparisons/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc56.json b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc56.json new file mode 100644 index 0000000000..9a5170a712 --- /dev/null +++ b/test_cases/arc4_types/out/Arc4DynamicStringArrayContract.arc56.json @@ -0,0 +1,120 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Arc4DynamicStringArrayContract", + "structs": {}, + "methods": [ + { + "name": "xyz", + "args": [], + "returns": { + "type": "string[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "xyz_raw", + "args": [], + "returns": { + "type": "string[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 68, + 84 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 105 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 71, + 87 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgMHgwMDAzMDAwNjAwMDkwMDBjMDAwMTU4MDAwMTU5MDAwMTVhCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDZiMTBlNTI3IDB4OTRkZGIxYzIgLy8gbWV0aG9kICJ4eXooKXN0cmluZ1tdIiwgbWV0aG9kICJ4eXpfcmF3KClzdHJpbmdbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yYXdfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19feHl6X3JvdXRlQDI6CiAgICAvLyBhcmM0X3R5cGVzL2R5bmFtaWNfc3RyaW5nX2FycmF5LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB4eXoKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3h5el9yYXdfcm91dGVAMzoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6MTMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB4eXpfcmF3CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6NAogICAgLy8gY2xhc3MgQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5hcmM0X3R5cGVzLmR5bmFtaWNfc3RyaW5nX2FycmF5LkFyYzREeW5hbWljU3RyaW5nQXJyYXlDb250cmFjdC54eXooKSAtPiBieXRlczoKeHl6OgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weTo1LTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHh5eihzZWxmKSAtPiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ106CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6Ny0xMQogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0FycmF5KAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJYIiksCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoIlkiKSwKICAgIC8vICAgICBhcmM0LlN0cmluZygiWiIpLAogICAgLy8gKQogICAgYnl0ZWNfMSAvLyAweDAwMDMwMDA2MDAwOTAwMGMwMDAxNTgwMDAxNTkwMDAxNWEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXJjNF90eXBlcy5keW5hbWljX3N0cmluZ19hcnJheS5BcmM0RHluYW1pY1N0cmluZ0FycmF5Q29udHJhY3QueHl6X3JhdygpIC0+IGJ5dGVzOgp4eXpfcmF3OgogICAgLy8gYXJjNF90eXBlcy9keW5hbWljX3N0cmluZ19hcnJheS5weToxMy0xNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgeHl6X3JhdyhzZWxmKSAtPiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ106CiAgICBwcm90byAwIDEKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6MTUtMTkKICAgIC8vIHJhdyA9IGFyYzQuRHluYW1pY0FycmF5KAogICAgLy8gICAgIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuQnl0ZSg4OCkpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuQnl0ZSg4OSkpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0FycmF5KGFyYzQuQnl0ZSg5MCkpLAogICAgLy8gKQogICAgYnl0ZWNfMSAvLyAweDAwMDMwMDA2MDAwOTAwMGMwMDAxNTgwMDAxNTkwMDAxNWEKICAgIC8vIGFyYzRfdHlwZXMvZHluYW1pY19zdHJpbmdfYXJyYXkucHk6MjAKICAgIC8vIHJldHVybiBhcmM0LkR5bmFtaWNBcnJheVthcmM0LlN0cmluZ10uZnJvbV9ieXRlcyhyYXcuYnl0ZXMpCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmFyYzRfdHlwZXMuZHluYW1pY19zdHJpbmdfYXJyYXkuQXJjNER5bmFtaWNTdHJpbmdBcnJheUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAQAmAgQVH3x1EQADAAYACQAMAAFYAAFZAAFaiAABQ4oAATEbQQA3ggIEaxDlJwSU3bHCNhoAjgIAAgASI4kxGRREMRhEiAAjKExQsCKJMRkURDEYRIgAGChMULAiiTEZQAAGMRgURCKJI4mKAAEpiYoAASmJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/arc4_types/puya.log b/test_cases/arc4_types/puya.log index 9e6fe670ec..c26e0ec44f 100644 --- a/test_cases/arc4_types/puya.log +++ b/test_cases/arc4_types/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_types'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['arc4_types'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv arc4_types/mutable_params.py:63:9 warning: expression result is ignored arc4_types/mutable_params.py:79:9 warning: expression result is ignored @@ -19094,6 +19094,7 @@ info: Writing arc4_types/out/Arc4MutableParamsContract.clear.bin info: Writing arc4_types/out/Arc4MutableParamsContract.approval.puya.map info: Writing arc4_types/out/Arc4MutableParamsContract.clear.puya.map info: Writing arc4_types/out/Arc4DynamicStringArrayContract.arc32.json +info: Writing arc4_types/out/Arc4DynamicStringArrayContract.arc56.json info: Writing arc4_types/out/Arc4DynamicStringArrayContract.approval.teal info: Writing arc4_types/out/Arc4DynamicStringArrayContract.clear.teal info: Writing arc4_types/out/Arc4DynamicStringArrayContract.approval.bin diff --git a/test_cases/asset/puya.log b/test_cases/asset/puya.log index d783608dac..9e69b3527f 100644 --- a/test_cases/asset/puya.log +++ b/test_cases/asset/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['asset'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['asset'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing asset/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/augmented_assignment/puya.log b/test_cases/augmented_assignment/puya.log index 83e4d96f52..9e878c6b7a 100644 --- a/test_cases/augmented_assignment/puya.log +++ b/test_cases/augmented_assignment/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['augmented_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['augmented_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing augmented_assignment/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/avm_types_in_abi/out/TestContract.arc56.json b/test_cases/avm_types_in_abi/out/TestContract.arc56.json new file mode 100644 index 0000000000..a7df0b736f --- /dev/null +++ b/test_cases/avm_types_in_abi/out/TestContract.arc56.json @@ -0,0 +1,153 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "TestContract", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [ + { + "type": "bool", + "name": "bool_param" + }, + { + "type": "uint64", + "name": "uint64_param" + }, + { + "type": "byte[]", + "name": "bytes_param" + }, + { + "type": "uint512", + "name": "biguint_param" + }, + { + "type": "string", + "name": "string_param" + }, + { + "type": "(bool,uint64,byte[],uint512,string)", + "name": "tuple_param" + } + ], + "returns": { + "type": "(bool,uint64,byte[],uint512,string)" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "tuple_of_arc4", + "args": [ + { + "type": "(uint8,address)", + "name": "args" + } + ], + "returns": { + "type": "(uint8,address)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 53, + 221 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 57 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 224 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 165 + ], + "errorMessage": "overflow" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDY0CiAgICBieXRlY2Jsb2NrIDB4MDAgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5hdm1fdHlwZXNfaW5fYWJpLmNvbnRyYWN0LlRlc3RDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDcKICAgIHB1c2hieXRlc3MgMHhmYjcxNjY1MiAweDdlYTY0MDc4IC8vIG1ldGhvZCAiY3JlYXRlKGJvb2wsdWludDY0LGJ5dGVbXSx1aW50NTEyLHN0cmluZywoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSkoYm9vbCx1aW50NjQsYnl0ZVtdLHVpbnQ1MTIsc3RyaW5nKSIsIG1ldGhvZCAidHVwbGVfb2ZfYXJjNCgodWludDgsYWRkcmVzcykpKHVpbnQ4LGFkZHJlc3MpIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdHVwbGVfb2ZfYXJjNF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgVGVzdENvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGludGNfMCAvLyAwCiAgICBnZXRiaXQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ0b2kKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNgogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZ2V0Yml0CiAgICBieXRlY18wIC8vIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgaW50Y18wIC8vIDAKICAgIGdldGJpdAogICAgZGlnIDEKICAgIGV4dHJhY3QgMSA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgZGlnIDIKICAgIHB1c2hpbnQgOSAvLyA5CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIHB1c2hpbnQgNzUgLy8gNzUKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgNAogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyA0CiAgICBleHRyYWN0IDExIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDUKICAgIGxlbgogICAgdW5jb3ZlciA2CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJOb09wIl0sIGNyZWF0ZT0icmVxdWlyZSIpCiAgICBjYWxsc3ViIGNyZWF0ZQogICAgYnl0ZWNfMCAvLyAweDAwCiAgICBpbnRjXzAgLy8gMAogICAgdW5jb3ZlciA2CiAgICBzZXRiaXQKICAgIHVuY292ZXIgNAogICAgaXRvYgogICAgZGlnIDQKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNQogICAgY29uY2F0CiAgICBkaWcgNAogICAgbGVuCiAgICBpbnRjXzIgLy8gNjQKICAgIDw9CiAgICBhc3NlcnQgLy8gb3ZlcmZsb3cKICAgIGludGNfMiAvLyA2NAogICAgYnplcm8KICAgIHVuY292ZXIgNQogICAgYnwKICAgIGRpZyA0CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MDA0ZAogICAgY29uY2F0CiAgICBkaWcgMwogICAgbGVuCiAgICBwdXNoaW50IDc3IC8vIDc3CiAgICArCiAgICBzd2FwCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgc3dhcAogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdHVwbGVfb2ZfYXJjNF9yb3V0ZUAzOgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBhdm1fdHlwZXNfaW5fYWJpL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFRlc3RDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGV4dHJhY3QgMCAxIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgc3dhcAogICAgZXh0cmFjdCAxIDMyIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHR1cGxlX29mX2FyYzQKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBUZXN0Q29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuYXZtX3R5cGVzX2luX2FiaS5jb250cmFjdC5UZXN0Q29udHJhY3QuY3JlYXRlKGJvb2xfcGFyYW06IHVpbnQ2NCwgdWludDY0X3BhcmFtOiB1aW50NjQsIGJ5dGVzX3BhcmFtOiBieXRlcywgYmlndWludF9wYXJhbTogYnl0ZXMsIHN0cmluZ19wYXJhbTogYnl0ZXMsIHR1cGxlX3BhcmFtLjA6IHVpbnQ2NCwgdHVwbGVfcGFyYW0uMTogdWludDY0LCB0dXBsZV9wYXJhbS4yOiBieXRlcywgdHVwbGVfcGFyYW0uMzogYnl0ZXMsIHR1cGxlX3BhcmFtLjQ6IGJ5dGVzKSAtPiB1aW50NjQsIHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzLCBieXRlczoKY3JlYXRlOgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weTo1LTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiXSwgY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBib29sX3BhcmFtOiBib29sLAogICAgLy8gICAgIHVpbnQ2NF9wYXJhbTogVUludDY0LAogICAgLy8gICAgIGJ5dGVzX3BhcmFtOiBCeXRlcywKICAgIC8vICAgICBiaWd1aW50X3BhcmFtOiBCaWdVSW50LAogICAgLy8gICAgIHN0cmluZ19wYXJhbTogU3RyaW5nLAogICAgLy8gICAgIHR1cGxlX3BhcmFtOiB0dXBsZVtib29sLCBVSW50NjQsIEJ5dGVzLCBCaWdVSW50LCBTdHJpbmddLAogICAgLy8gKSAtPiB0dXBsZVtib29sLCBVSW50NjQsIEJ5dGVzLCBCaWdVSW50LCBTdHJpbmddOgogICAgcHJvdG8gMTAgNQogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxNgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSB0dXBsZV9wYXJhbQogICAgZnJhbWVfZGlnIC0xMAogICAgZnJhbWVfZGlnIC01CiAgICA9PQogICAgZnJhbWVfZGlnIC05CiAgICBmcmFtZV9kaWcgLTQKICAgID09CiAgICAmJgogICAgZnJhbWVfZGlnIC04CiAgICBmcmFtZV9kaWcgLTMKICAgID09CiAgICAmJgogICAgZnJhbWVfZGlnIC03CiAgICBmcmFtZV9kaWcgLTIKICAgIGI9PQogICAgJiYKICAgIGZyYW1lX2RpZyAtNgogICAgZnJhbWVfZGlnIC0xCiAgICA9PQogICAgJiYKICAgIGFzc2VydAogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxNwogICAgLy8gcmV0dXJuIHJlc3VsdAogICAgZnJhbWVfZGlnIC0xMAogICAgZnJhbWVfZGlnIC05CiAgICBmcmFtZV9kaWcgLTgKICAgIGZyYW1lX2RpZyAtNwogICAgZnJhbWVfZGlnIC02CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LnR1cGxlX29mX2FyYzQoYXJncy4wOiBieXRlcywgYXJncy4xOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgp0dXBsZV9vZl9hcmM0OgogICAgLy8gYXZtX3R5cGVzX2luX2FiaS9jb250cmFjdC5weToxOS0yMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdHVwbGVfb2ZfYXJjNCgKICAgIC8vICAgICBzZWxmLCBhcmdzOiB0dXBsZVthcmM0LlVJbnQ4LCBhcmM0LkFkZHJlc3NdCiAgICAvLyApIC0+IHR1cGxlW2FyYzQuVUludDgsIGFyYzQuQWRkcmVzc106CiAgICBwcm90byAyIDIKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MjMKICAgIC8vIGFzc2VydCBhcmdzWzBdLmJ5dGVzLmxlbmd0aCA9PSAxCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBhcmdzWzFdLmJ5dGVzLmxlbmd0aCA9PSAzMgogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIHB1c2hpbnQgMzIgLy8gMzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGF2bV90eXBlc19pbl9hYmkvY29udHJhY3QucHk6MjUKICAgIC8vIHJldHVybiBhcmdzCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmF2bV90eXBlc19pbl9hYmkuY29udHJhY3QuVGVzdENvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiADAAFAJgIBAAQVH3x1iAABQ4oAATEbQQDbggIE+3FmUgR+pkB4NhoAjgIAAgCqIokxGRREMRgURDYaASJTNhoCFzYaA1cCADYaBDYaBVcCADYaBkkiUygiTwJUIlNLAVcBCBdLAoEJWUsDgUtZSwRPAksCUlcCAEsEVwtASwUVTwZPBE8CUlcCAIgAaigiTwZUTwQWSwQVFlcGAk8FUEsEFSQORCSvTwWrSwQVFlcGAk8FUE8ETwRQgAIATVBLAxWBTQhMTwNQTBZXBgJQTwJQTFApTFCwI4kxGRREMRhENhoBSVcAAUxXASCIADVQKUxQsCOJIomKCgWL9ov7Eov3i/wSEIv4i/0SEIv5i/6oEIv6i/8SEESL9ov3i/iL+Yv6iYoCAov+FSMSRIv/FYEgEkSL/ov/iQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/avm_types_in_abi/puya.log b/test_cases/avm_types_in_abi/puya.log index d90e36326b..d8b71dbb5c 100644 --- a/test_cases/avm_types_in_abi/puya.log +++ b/test_cases/avm_types_in_abi/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['avm_types_in_abi'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['avm_types_in_abi'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing avm_types_in_abi/out/module.awst debug: Sealing block@0: // L12 @@ -849,6 +849,7 @@ debug: Inserted tuple_of_arc4_block@0.ops[18]: 'l-store-copy tmp%3#0 0' debug: Replaced tuple_of_arc4_block@0.ops[20]: 'v-load tmp%3#0' with 'l-load tmp%3#0' debug: Found 2 edge set/s for test_cases.avm_types_in_abi.contract.TestContract.__puya_arc4_router__ info: Writing avm_types_in_abi/out/TestContract.arc32.json +info: Writing avm_types_in_abi/out/TestContract.arc56.json info: Writing avm_types_in_abi/out/TestContract.approval.teal info: Writing avm_types_in_abi/out/TestContract.clear.teal info: Writing avm_types_in_abi/out/TestContract.approval.bin diff --git a/test_cases/biguint_binary_ops/puya.log b/test_cases/biguint_binary_ops/puya.log index f9568df33d..78b89be454 100644 --- a/test_cases/biguint_binary_ops/puya.log +++ b/test_cases/biguint_binary_ops/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['biguint_binary_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['biguint_binary_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing biguint_binary_ops/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/boolean_binary_ops/puya.log b/test_cases/boolean_binary_ops/puya.log index 22093463ee..85dd023a55 100644 --- a/test_cases/boolean_binary_ops/puya.log +++ b/test_cases/boolean_binary_ops/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['boolean_binary_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['boolean_binary_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv boolean_binary_ops/contract.py:97:12 warning: expression is always True boolean_binary_ops/contract.py:98:12 warning: expression is always True diff --git a/test_cases/bug_load_store_load_store/puya.log b/test_cases/bug_load_store_load_store/puya.log index ccebe83f9b..f6d25dba6c 100644 --- a/test_cases/bug_load_store_load_store/puya.log +++ b/test_cases/bug_load_store_load_store/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['bug_load_store_load_store'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['bug_load_store_load_store'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing bug_load_store_load_store/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/bytes_ops/puya.log b/test_cases/bytes_ops/puya.log index 6806fc1482..78133fb974 100644 --- a/test_cases/bytes_ops/puya.log +++ b/test_cases/bytes_ops/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['bytes_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['bytes_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing bytes_ops/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/callsub/puya.log b/test_cases/callsub/puya.log index b1de9342bb..b1e0fc66e4 100644 --- a/test_cases/callsub/puya.log +++ b/test_cases/callsub/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['callsub'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['callsub'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing callsub/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/chained_assignment/puya.log b/test_cases/chained_assignment/puya.log index e1a055dfee..6385ce2c07 100644 --- a/test_cases/chained_assignment/puya.log +++ b/test_cases/chained_assignment/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['chained_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['chained_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing chained_assignment/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/compile/out/Hello.arc56.json b/test_cases/compile/out/Hello.arc56.json new file mode 100644 index 0000000000..5b41e29e55 --- /dev/null +++ b/test_cases/compile/out/Hello.arc56.json @@ -0,0 +1,165 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Hello", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [ + { + "type": "string", + "name": "greeting" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "greet", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "greeting": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "Z3JlZXRpbmc=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 90 + ], + "errorMessage": "OnCompletion is DeleteApplication" + }, + { + "pc": [ + 69, + 99 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 160 + ], + "errorMessage": "check self.greeting exists" + }, + { + "pc": [ + 73 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 93, + 102, + 143 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiZ3JlZXRpbmciCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1NAogICAgLy8gY2xhc3MgSGVsbG8oSGVsbG9CYXNlKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3CiAgICBwdXNoYnl0ZXNzIDB4MjBkZjNhNTQgMHgyNDM3OGQzYyAweGQwYTI4MjAwIC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyl2b2lkIiwgbWV0aG9kICJkZWxldGUoKXZvaWQiLCBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1NAogICAgLy8gY2xhc3MgSGVsbG8oSGVsbG9CYXNlKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2FwcHMucHk6NTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgY2FsbHN1YiBjcmVhdGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1NAogICAgLy8gY2xhc3MgSGVsbG8oSGVsbG9CYXNlKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdyZWV0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1NAogICAgLy8gY2xhc3MgSGVsbG8oSGVsbG9CYXNlKToKICAgIHB1c2hpbnQgNCAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX191cGRhdGVAOAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdXBkYXRlQDg6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjkKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIHVwZGF0ZShzZWxmKSAtPiBOb25lOgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvLmNyZWF0ZShncmVldGluZzogYnl0ZXMpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1Ni01NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYsIGdyZWV0aW5nOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo1OAogICAgLy8gc2VsZi5ncmVldGluZyA9IGdyZWV0aW5nCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5ncmVldChuYW1lOiBieXRlcykgLT4gYnl0ZXM6CmdyZWV0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzLTM0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGdyZWV0KHNlbGYsIG5hbWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzUKICAgIC8vIHJldHVybiBzZWxmLmdyZWV0aW5nICsgIiAiICsgbmFtZQogICAgaW50Y18xIC8vIDAKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzICIgIgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuSGVsbG9CYXNlLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjIKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2FwcHMucHk6MjMKICAgIC8vIHNlbGYuZ3JlZXRpbmcgPSBTdHJpbmcoKQogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBwdXNoYnl0ZXMgIiIKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsby5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiACAQAmAQhncmVldGluZzEYQAADiACRiAABQ4oAATEbQQBfggMEIN86VAQkN408BNCiggA2GgCOAwACABUAICOJMRkURDEYFEQ2GgFXAgCIAD8iiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAKkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQAoi/9niYoBASMoZUSAASBQi/9QiYoAACiAAGeJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/compile/out/HelloBase.arc56.json b/test_cases/compile/out/HelloBase.arc56.json new file mode 100644 index 0000000000..2a07b116b9 --- /dev/null +++ b/test_cases/compile/out/HelloBase.arc56.json @@ -0,0 +1,145 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "HelloBase", + "structs": {}, + "methods": [ + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "greet", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "greeting": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "Z3JlZXRpbmc=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [ + "UpdateApplication" + ] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 64 + ], + "errorMessage": "OnCompletion is DeleteApplication" + }, + { + "pc": [ + 73 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 135 + ], + "errorMessage": "check self.greeting exists" + }, + { + "pc": [ + 121 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 67, + 76, + 126 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIwCiAgICAvLyBjbGFzcyBIZWxsb0Jhc2UoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2CiAgICBwdXNoYnl0ZXNzIDB4MjQzNzhkM2MgMHhkMGEyODIwMCAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIsIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyMAogICAgLy8gY2xhc3MgSGVsbG9CYXNlKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBncmVldAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjAKICAgIC8vIGNsYXNzIEhlbGxvQmFzZShBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHB1c2hpbnQgNCAvLyA0CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19fX2FsZ29weV9kZWZhdWx0X2NyZWF0ZUA3OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIwCiAgICAvLyBjbGFzcyBIZWxsb0Jhc2UoQVJDNENvbnRyYWN0KToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiB1cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5OjM1CiAgICAvLyByZXR1cm4gc2VsZi5ncmVldGluZyArICIgIiArIG5hbWUKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ncmVldGluZyBleGlzdHMKICAgIHB1c2hieXRlcyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvQmFzZS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIyCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjIzCiAgICAvLyBzZWxmLmdyZWV0aW5nID0gU3RyaW5nKCkKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgcHVzaGJ5dGVzICIiCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiACAAEmAQhncmVldGluZzEYQAADiAB4iAABQ4oAATEbQQBFggIEJDeNPATQooIANhoAjgIAAgANIokxGYEFEkQxGEQjiTEZFEQxGEQ2GgFXAgCIACtJFRZXBgJMUIAEFR98dUxQsCOJIoEEMRmOAgACAAgiiTEYFEQjiTEYRCOJigEBIihlRIABIFCL/1CJigAAKIAAZ4k=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/compile/out/HelloFactory.arc56.json b/test_cases/compile/out/HelloFactory.arc56.json new file mode 100644 index 0000000000..f9dd434125 --- /dev/null +++ b/test_cases/compile/out/HelloFactory.arc56.json @@ -0,0 +1,317 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "HelloFactory", + "structs": {}, + "methods": [ + { + "name": "test_logicsig", + "args": [], + "returns": { + "type": "address" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_compile_contract", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_compile_contract_tmpl", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_compile_contract_prfx", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_compile_contract_large", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arc4_create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arc4_create_tmpl", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arc4_create_prfx", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arc4_create_large", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arc4_update", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_other_constants", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_abi_call_create_params", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 4987, + 5080, + 5334, + 5422, + 5514, + 5608, + 5868, + 5960, + 6057, + 6117, + 6495, + 6638 + ], + "errorMessage": "ARC4 prefix is valid" + }, + { + "pc": [ + 4730, + 4746, + 4758, + 4770, + 4782, + 4794, + 4806, + 4818, + 4830, + 4842, + 4854, + 4866 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 4883 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 4733, + 4749, + 4761, + 4773, + 4785, + 4797, + 4809, + 4821, + 4833, + 4845, + 4857, + 4869 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDYgMSA1CiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgYmFzZTY0KENvRUJRdz09KSAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgMHgwMDA1Nzc2ZjcyNmM2NCAweDRjNWM2MWJhIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFDUmlBQUJRNG9BQVRFYlFRQmZnZ01FSU44NlZBUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FCVUFJQ09KTVJrVVJERVlGRVEyR2dGWEFnQ0lBRDhpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBS2trVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFBb2kvOW5pWW9CQVNNb1pVU0FBU0JRaS85UWlZb0FBQ2lBQUdlSikgMHgyMGRmM2E1NCBiYXNlNjQoQ2lBQ0FRQW1BZ2huY21WbGRHbHVad1IwYlhCc01SaEFBQU9JQUlDSUFBRkRpZ0FCTVJ0QkFGYUNBd1JNWEdHNkJDUTNqVHdFMEtLQ0FEWWFBSTREQUFJQURBQVhJNGt4R1JSRU1SZ1VSQ0tKTVJtQkJSSkVNUmhFSW9reEdSUkVNUmhFTmhvQlZ3SUFpQUFpU1JVV1Z3WUNURkNBQkJVZmZIVk1VTEFpaVlFRU1SbU9BUUFDSTRreEdFUWlpWW9CQVNNb1pVU0FBU0JRaS85UWlZb0FBQ2dwWjRrPSkgMHgwMDA1NzQ2ODY1NzI2NSAweDAwMDU2ODY1NmM2YzZmIGJhc2U2NChDaUFDQVFDSUFBRkRpZ0FCTVJ0QkFEaUNBZ1QxNVAxTkJDUTNqVHcyR2dDT0FnQUNBQmdqaVRFWkZFUXhHRVNJQUNRV2dBUVZIM3gxVEZDd0lva3hHWUVGRWtReEdFUWlpVEVaUUFBR01SZ1VSQ0tKSTRtS0FBR0lBQUlWaVlvQUFZQ0FJQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQT09KSBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkgMHhmNWU0ZmQ0ZCAiaGkgdGhlcmUiCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0CiAgICAvLyBjbGFzcyBIZWxsb0ZhY3RvcnkoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxNgogICAgcHVzaGJ5dGVzcyAweDYwZmZhMjk1IDB4MmExNzk5NWMgMHhlYmE3NDJlYSAweDMzNWE2NDM4IDB4MDI5NDdjYTIgMHhhZTFlZTg0MCAweDdiOTA3M2Y1IDB4ODU0YTY4Y2EgMHgxZGEwMDRhMSAweDdmNGU3NWY1IDB4MDE5NjU5MzcgMHg3ZmJmOGNjYSAvLyBtZXRob2QgInRlc3RfbG9naWNzaWcoKWFkZHJlc3MiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdCgpdm9pZCIsIG1ldGhvZCAidGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoKXZvaWQiLCBtZXRob2QgInRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGUoKXZvaWQiLCBtZXRob2QgInRlc3RfYXJjNF9jcmVhdGVfdG1wbCgpdm9pZCIsIG1ldGhvZCAidGVzdF9hcmM0X2NyZWF0ZV9wcmZ4KCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2FyYzRfdXBkYXRlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X290aGVyX2NvbnN0YW50cygpdm9pZCIsIG1ldGhvZCAidGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9sb2dpY3NpZ19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF90bXBsX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZnhfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Vfcm91dGVANiBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV90bXBsX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4X3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZV9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfdXBkYXRlX3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfb3RoZXJfY29uc3RhbnRzX3JvdXRlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYWJpX2NhbGxfY3JlYXRlX3BhcmFtc19yb3V0ZUAxMwogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9sb2dpY3NpZ19yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2xvZ2ljc2lnCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3Rfcm91dGVAMzoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0CiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjYxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfdG1wbAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZnhfcm91dGVANToKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0X3ByZngKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY29tcGlsZV9jb250cmFjdF9sYXJnZV9yb3V0ZUA2OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9jb21waWxlX2NvbnRyYWN0X2xhcmdlCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3JvdXRlQDc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfY3JlYXRlX3RtcGxfcm91dGVAODoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXJjNF9jcmVhdGVfdG1wbAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmM0X2NyZWF0ZV9wcmZ4X3JvdXRlQDk6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTk4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX3ByZngKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXJjNF9jcmVhdGVfbGFyZ2Vfcm91dGVAMTA6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyYzRfdXBkYXRlX3JvdXRlQDExOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hcmM0X3VwZGF0ZQogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9vdGhlcl9jb25zdGFudHNfcm91dGVAMTI6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X290aGVyX2NvbnN0YW50cwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zX3JvdXRlQDEzOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdAMTY6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjA6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQKICAgIC8vIGNsYXNzIEhlbGxvRmFjdG9yeShBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2xvZ2ljc2lnKCkgLT4gYnl0ZXM6CnRlc3RfbG9naWNzaWc6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjYtMjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9sb2dpY3NpZyhzZWxmKSAtPiBhcmM0LkFkZHJlc3M6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOAogICAgLy8gcmV0dXJuIGFyYzQuQWRkcmVzcyhjb21waWxlX2xvZ2ljc2lnKGFsd2F5c19hcHByb3ZlX3NpZykuYWNjb3VudCkKICAgIHB1c2hieXRlcyBiYXNlMzIoVTNaWEVVTkZSU1VEUFBORkM2VTdPQllPNFM0QVVPRVA0UkRCSTIzTDJRNVRYM0s1TFRTUSkgLy8gYWRkciBVM1pYRVVORlJTVURQUE5GQzZVN09CWU80UzRBVU9FUDRSREJJMjNMMlE1VFgzSzVMVFNWV1FPS0ZNCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9jb21waWxlX2NvbnRyYWN0KCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMwLTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzUtNDEKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoc3RyaW5nKXZvaWQiKSwgYXJjNC5TdHJpbmcoImhlbGxvIikpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz0xLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzkKICAgIC8vIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMyLTMzCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsbykKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA2IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFDUmlBQUJRNG9BQVRFYlFRQmZnZ01FSU44NlZBUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FCVUFJQ09KTVJrVVJERVlGRVEyR2dGWEFnQ0lBRDhpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBS2trVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFBb2kvOW5pWW9CQVNNb1pVU0FBU0JRaS85UWlZb0FBQ2lBQUdlSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNgogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICBieXRlYyA3IC8vIG1ldGhvZCAiY3JlYXRlKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDEwIC8vIDB4MDAwNTY4NjU2YzZjNmYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzUKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjM1LTQxCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKHN0cmluZyl2b2lkIiksIGFyYzQuU3RyaW5nKCJoZWxsbyIpKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9MSwKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozNS00MgogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZShzdHJpbmcpdm9pZCIpLCBhcmM0LlN0cmluZygiaGVsbG8iKSksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPTEsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ1LTQ5CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo0NwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdyZWV0KHN0cmluZylzdHJpbmciKSwgYXJjNC5TdHJpbmcoIndvcmxkIikpLAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ1LTQ2CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjQ1LTQ5CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjUwCiAgICAvLyByZXN1bHQgPSBhcmM0LlN0cmluZy5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTItNTcKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjU2CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTUKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo1Mi01MwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NTItNTcKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo1OQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGVsbG8gd29ybGQiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjg2NTZjNmM2ZjIwNzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfY29tcGlsZV9jb250cmFjdF90bXBsKCkgLT4gdm9pZDoKdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjEtNjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9jb21waWxlX2NvbnRyYWN0X3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY3LTc2CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjUKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IGdyZWV0aW5nfSkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDggLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFJQ0lBQUZEaWdBQk1SdEJBRmFDQXdSTVhHRzZCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFEQUFYSTRreEdSUkVNUmdVUkNLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBaVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFTTW9aVVNBQVNCUWkvOVFpWW9BQUNncFo0az0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjgKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgYnl0ZWMgNSAvLyBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6NjcKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY3LTc2CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjY3LTc3CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hcHAKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MC04NAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODIKICAgIC8vIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MC04MQogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4MC04NAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo4NQogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg3LTkyCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTo5MQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjkwCiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6ODctODgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojg3LTkyCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJkZWxldGUoKXZvaWQiKSwpLAogICAgLy8gICAgIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTQKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhleSB3b3JsZCIKICAgIHB1c2hieXRlcyAweDAwMDk2ODY1NzkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4OgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5Ojk2LTk3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfY29tcGlsZV9jb250cmFjdF9wcmZ4KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDMtMTA5CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiY3JlYXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6OTgtMTAxCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb1ByZngsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygiaGkiKX0sIHRlbXBsYXRlX3ZhcnNfcHJlZml4PSJQUkZYXyIKICAgIC8vICkKICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIHB1c2hieXRlcyBiYXNlNjQoQ2lBQ0FRQW1BZ2huY21WbGRHbHVad0pvYVRFWVFBQURpQUNBaUFBQlE0b0FBVEViUVFCV2dnTUVURnhodWdRa040MDhCTkNpZ2dBMkdnQ09Bd0FDQUF3QUZ5T0pNUmtVUkRFWUZFUWlpVEVaZ1FVU1JERVlSQ0tKTVJrVVJERVlSRFlhQVZjQ0FJZ0FJa2tWRmxjR0FreFFnQVFWSDN4MVRGQ3dJb21CQkRFWmpnRUFBaU9KTVJoRUlvbUtBUUVqS0dWRWdBRWdVSXYvVUltS0FBQW9LV2VKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwNAogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICBieXRlYyA1IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMDMKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEwMy0xMDkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJjcmVhdGUoKXZvaWQiKSwpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTAzLTExMAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImNyZWF0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgLy8gLmNyZWF0ZWRfYXBwCiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTEzLTExNwogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICkuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTE1CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZ3JlZXQoc3RyaW5nKXN0cmluZyIpLCBhcmM0LlN0cmluZygid29ybGQiKSksCiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA0IC8vIDB4MDAwNTc3NmY3MjZjNjQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTEzLTExNAogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyB0eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMTMtMTE3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJncmVldChzdHJpbmcpc3RyaW5nIiksIGFyYzQuU3RyaW5nKCJ3b3JsZCIpKSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjExOAogICAgLy8gcmVzdWx0ID0gYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuLmxhc3RfbG9nKQogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMC0xMjUKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyNAogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMwogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMC0xMjEKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEyMC0xMjUKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImRlbGV0ZSgpdm9pZCIpLCksCiAgICAvLyAgICAgb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxMjcKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHdvcmxkIgogICAgcHVzaGJ5dGVzIDB4MDAwODY4NjkyMDc3NmY3MjZjNjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2U6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTI5LTEzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2NvbXBpbGVfY29udHJhY3RfbGFyZ2Uoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNC0xNDAKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gICAgIGdsb2JhbF9udW1fYnl0ZXM9Y29tcGlsZWQuZ2xvYmFsX2J5dGVzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTMxLTEzMgogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBjb21waWxlZCA9IGNvbXBpbGVfY29udHJhY3QoTGFyZ2VQcm9ncmFtKQogICAgcHVzaGludCAyIC8vIDIKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMSAvLyBiYXNlNjQoQ2lBQ0FRQ0lBQUZEaWdBQk1SdEJBRGlDQWdUMTVQMU5CQ1EzalR3MkdnQ09BZ0FDQUJnamlURVpGRVF4R0VTSUFDUVdnQVFWSDN4MVRGQ3dJb2t4R1lFRkVrUXhHRVFpaVRFWlFBQUdNUmdVUkNLSkk0bUtBQUdJQUFJVmlZb0FBWUNBSUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUE9PSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDEyIC8vIGJhc2U2NChBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBSWs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjEzNAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM0LTE0MAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTM0LTE0MQogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1jb21waWxlZC5hcHByb3ZhbF9wcm9ncmFtLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09Y29tcGlsZWQuY2xlYXJfc3RhdGVfcHJvZ3JhbSwKICAgIC8vICAgICBleHRyYV9wcm9ncmFtX3BhZ2VzPWNvbXBpbGVkLmV4dHJhX3Byb2dyYW1fcGFnZXMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIC8vIC5jcmVhdGVkX2FwcAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NC0xNDgKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NgogICAgLy8gYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgYnl0ZWMgMTMgLy8gbWV0aG9kICJnZXRfYmlnX2J5dGVzX2xlbmd0aCgpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNDQtMTQ1CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHR4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE0NC0xNDgKICAgIC8vICMgY2FsbCB0aGUgbmV3IGFwcAogICAgLy8gdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiKSwpLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTQ5CiAgICAvLyByZXN1bHQgPSBhcmM0LlVJbnQ2NC5mcm9tX2xvZyh0eG4ubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUxLTE1NgogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU1CiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTU0CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUxLTE1MgogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTUxLTE1NgogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPWhlbGxvX2FwcCwKICAgIC8vICAgICBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiZGVsZXRlKCl2b2lkIiksKSwKICAgIC8vICAgICBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE1OAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAxMDAwCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGUoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE2MC0xNjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTYyLTE2MwogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBoZWxsb19hcHAgPSBhcmM0LmFyYzRfY3JlYXRlKEhlbGxvLmNyZWF0ZSwgImhlbGxvIikuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMiAvLyAxCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDYgLy8gYmFzZTY0KENpQUNBUUFtQVFobmNtVmxkR2x1WnpFWVFBQURpQUNSaUFBQlE0b0FBVEViUVFCZmdnTUVJTjg2VkFRa040MDhCTkNpZ2dBMkdnQ09Bd0FDQUJVQUlDT0pNUmtVUkRFWUZFUTJHZ0ZYQWdDSUFEOGlpVEVaZ1FVU1JERVlSQ0tKTVJrVVJERVlSRFlhQVZjQ0FJZ0FLa2tWRmxjR0FreFFnQVFWSDN4MVRGQ3dJb21CQkRFWmpnRUFBaU9KTVJoRUlvbUtBUUFvaS85bmlZb0JBU01vWlVTQUFTQlFpLzlRaVlvQUFDaUFBR2VKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgYnl0ZWMgNyAvLyBtZXRob2QgImNyZWF0ZShzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMCAvLyAweDAwMDU2ODY1NmM2YzZmCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjUtMTY2CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ3b3JsZCIsIGFwcF9pZD1oZWxsb19hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgNCAvLyAweDAwMDU3NzZmNzI2YzY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNjgtMTczCiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9aGVsbG9fYXBwLAogICAgLy8gICAgICMgb25fY29tcGxldGUgaXMgaW5mZXJyZWQgZnJvbSBIZWxsby5kZWxldGUgQVJDNCBkZWZpbml0aW9uCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBpbnRjXzMgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJkZWxldGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzUKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhlbGxvIHdvcmxkIgogICAgcHVzaGJ5dGVzICJoZWxsbyB3b3JsZCIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5mYWN0b3J5LkhlbGxvRmFjdG9yeS50ZXN0X2FyYzRfY3JlYXRlX3RtcGwoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX3RtcGw6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTc3LTE3OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfY3JlYXRlX3RtcGwoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4MS0xODQKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxNzktMTgwCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGNvbXBpbGVkID0gY29tcGlsZV9jb250cmFjdChIZWxsb1RtcGwsIHRlbXBsYXRlX3ZhcnM9eyJHUkVFVElORyI6IFN0cmluZygidG1wbDIiKX0pCiAgICBpbnRjXzIgLy8gMQogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1CeXRlU2xpY2UKICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA4IC8vIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3UjBiWEJzTVJoQUFBT0lBSUNJQUFGRGlnQUJNUnRCQUZhQ0F3Uk1YR0c2QkNRM2pUd0UwS0tDQURZYUFJNERBQUlBREFBWEk0a3hHUlJFTVJnVVJDS0pNUm1CQlJKRU1SaEVJb2t4R1JSRU1SaEVOaG9CVndJQWlBQWlTUlVXVndZQ1RGQ0FCQlVmZkhWTVVMQWlpWUVFTVJtT0FRQUNJNGt4R0VRaWlZb0JBU01vWlVTQUFTQlFpLzlRaVlvQUFDZ3BaNGs9KQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE4MS0xODQKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDUgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxODYtMTg3CiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9UbXBsLmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MTg5LTE5NAogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1RtcGwuZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjE5NgogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAidG1wbDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInRtcGwyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfcHJmeCgpIC0+IHZvaWQ6CnRlc3RfYXJjNF9jcmVhdGVfcHJmeDoKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToxOTgtMTk5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYXJjNF9jcmVhdGVfcHJmeChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjA0LTIwNwogICAgLy8gaGVsbG9fYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb1ByZnguY3JlYXRlLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVkLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwMC0yMDMKICAgIC8vICMgY3JlYXRlIGFwcAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvUHJmeCwgdGVtcGxhdGVfdmFyc19wcmVmaXg9IlBSRlhfIiwgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJwcmZ4MiIpfQogICAgLy8gKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQVFBbUFnaG5jbVZsZEdsdVp3VndjbVo0TWpFWVFBQURpQUNBaUFBQlE0b0FBVEViUVFCV2dnTUVURnhodWdRa040MDhCTkNpZ2dBMkdnQ09Bd0FDQUF3QUZ5T0pNUmtVUkRFWUZFUWlpVEVaZ1FVU1JERVlSQ0tKTVJrVVJERVlSRFlhQVZjQ0FJZ0FJa2tWRmxjR0FreFFnQVFWSDN4MVRGQ3dJb21CQkRFWmpnRUFBaU9KTVJoRUlvbUtBUUVqS0dWRWdBRWdVSXYvVUltS0FBQW9LV2VKKQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIwNC0yMDcKICAgIC8vIGhlbGxvX2FwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9QcmZ4LmNyZWF0ZSwKICAgIC8vICAgICBjb21waWxlZD1jb21waWxlZCwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDUgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMDktMjEwCiAgICAvLyAjIGNhbGwgdGhlIG5ldyBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG9QcmZ4LmdyZWV0LCAid29ybGQiLCBhcHBfaWQ9aGVsbG9fYXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDQgLy8gMHgwMDA1Nzc2ZjcyNmM2NAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjEyLTIxNwogICAgLy8gIyBkZWxldGUgdGhlIGFwcAogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsb1ByZnguZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1oZWxsb19hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIxOQogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAicHJmeDIgd29ybGQiCiAgICBwdXNoYnl0ZXMgInByZngyIHdvcmxkIgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3RfYXJjNF9jcmVhdGVfbGFyZ2UoKSAtPiB2b2lkOgp0ZXN0X2FyYzRfY3JlYXRlX2xhcmdlOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyMS0yMjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hcmM0X2NyZWF0ZV9sYXJnZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjIzLTIyNAogICAgLy8gIyBjcmVhdGUgYXBwCiAgICAvLyBhcHAgPSBhcmM0LmFyYzRfY3JlYXRlKExhcmdlUHJvZ3JhbSkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEV4dHJhUHJvZ3JhbVBhZ2VzCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgMTEgLy8gYmFzZTY0KENpQUNBUUNJQUFGRGlnQUJNUnRCQURpQ0FnVDE1UDFOQkNRM2pUdzJHZ0NPQWdBQ0FCZ2ppVEVaRkVReEdFU0lBQ1FXZ0FRVkgzeDFURkN3SW9reEdZRUZFa1F4R0VRaWlURVpRQUFHTVJnVVJDS0pJNG1LQUFHSUFBSVZpWW9BQVlDQUlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyAxMiAvLyBiYXNlNjQoQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUlrPSkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjI2LTIyNwogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKExhcmdlUHJvZ3JhbS5nZXRfYmlnX2J5dGVzX2xlbmd0aCwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMyAvLyBtZXRob2QgImdldF9iaWdfYnl0ZXNfbGVuZ3RoKCl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIyOAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSA0MDk2CiAgICBwdXNoaW50IDQwOTYgLy8gNDA5NgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjIzMC0yMzQKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTGFyZ2VQcm9ncmFtLmRlbGV0ZSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hcmM0X3VwZGF0ZSgpIC0+IHZvaWQ6CnRlc3RfYXJjNF91cGRhdGU6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjM2LTIzNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyYzRfdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMzgtMjUwCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGl0eG5fYmVnaW4KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDgKICAgIC8vIGxvY2FsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bVVpbnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDcKICAgIC8vIGxvY2FsX2J5dGVzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBMb2NhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0NQogICAgLy8gZ2xvYmFsX3VpbnRzPTIsCiAgICBwdXNoaW50IDIgLy8gMgogICAgaXR4bl9maWVsZCBHbG9iYWxOdW1VaW50CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQ2CiAgICAvLyBnbG9iYWxfYnl0ZXM9MiwKICAgIHB1c2hpbnQgMiAvLyAyCiAgICBpdHhuX2ZpZWxkIEdsb2JhbE51bUJ5dGVTbGljZQogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI0NAogICAgLy8gZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgRXh0cmFQcm9ncmFtUGFnZXMKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNDEtMjQ5CiAgICAvLyBjb21waWxlZD1jb21waWxlX2NvbnRyYWN0KAogICAgLy8gICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICB0ZW1wbGF0ZV92YXJzPXsiR1JFRVRJTkciOiBTdHJpbmcoImhpIil9LAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9MSwKICAgIC8vICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICBnbG9iYWxfYnl0ZXM9MiwKICAgIC8vICAgICBsb2NhbF9ieXRlcz0yLAogICAgLy8gICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyApLAogICAgYnl0ZWNfMSAvLyBiYXNlNjQoQ29FQlF3PT0pCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGJ5dGVjIDggLy8gYmFzZTY0KENpQUNBUUFtQWdobmNtVmxkR2x1WndSMGJYQnNNUmhBQUFPSUFJQ0lBQUZEaWdBQk1SdEJBRmFDQXdSTVhHRzZCQ1EzalR3RTBLS0NBRFlhQUk0REFBSUFEQUFYSTRreEdSUkVNUmdVUkNLSk1SbUJCUkpFTVJoRUlva3hHUlJFTVJoRU5ob0JWd0lBaUFBaVNSVVdWd1lDVEZDQUJCVWZmSFZNVUxBaWlZRUVNUm1PQVFBQ0k0a3hHRVFpaVlvQkFTTW9aVVNBQVNCUWkvOVFpWW9BQUNncFo0az0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjQwCiAgICAvLyBIZWxsb1RtcGwsCiAgICBieXRlYyA1IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyMzgtMjUwCiAgICAvLyAjIGNyZWF0ZSBhcHAKICAgIC8vIGFwcCA9IGFyYzQuYXJjNF9jcmVhdGUoCiAgICAvLyAgICAgSGVsbG9UbXBsLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvVG1wbCwKICAgIC8vICAgICAgICAgdGVtcGxhdGVfdmFycz17IkdSRUVUSU5HIjogU3RyaW5nKCJoaSIpfSwKICAgIC8vICAgICAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz0xLAogICAgLy8gICAgICAgICBnbG9iYWxfdWludHM9MiwKICAgIC8vICAgICAgICAgZ2xvYmFsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX2J5dGVzPTIsCiAgICAvLyAgICAgICAgIGxvY2FsX3VpbnRzPTIsCiAgICAvLyAgICAgKSwKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjUyLTI1MwogICAgLy8gIyBjYWxsIHRoZSBuZXcgYXBwCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvVG1wbC5ncmVldCwgInRoZXJlIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18zIC8vIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyA5IC8vIDB4MDAwNTc0Njg2NTcyNjUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBleHRyYWN0IDIgMAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI1NAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiaGkgdGhlcmUiCiAgICBieXRlYyAxNCAvLyAiaGkgdGhlcmUiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjU2LTI1NwogICAgLy8gIyB1cGRhdGUgdGhlIGFwcAogICAgLy8gYXJjNC5hcmM0X3VwZGF0ZShIZWxsbywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGJ5dGVjXzEgLy8gYmFzZTY0KENvRUJRdz09KQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICBieXRlYyA2IC8vIGJhc2U2NChDaUFDQVFBbUFRaG5jbVZsZEdsdVp6RVlRQUFEaUFDUmlBQUJRNG9BQVRFYlFRQmZnZ01FSU44NlZBUWtONDA4Qk5DaWdnQTJHZ0NPQXdBQ0FCVUFJQ09KTVJrVVJERVlGRVEyR2dGWEFnQ0lBRDhpaVRFWmdRVVNSREVZUkNLSk1Sa1VSREVZUkRZYUFWY0NBSWdBS2trVkZsY0dBa3hRZ0FRVkgzeDFURkN3SW9tQkJERVpqZ0VBQWlPSk1SaEVJb21LQVFBb2kvOW5pWW9CQVNNb1pVU0FBU0JRaS85UWlZb0FBQ2lBQUdlSikKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIHB1c2hpbnQgNCAvLyBVcGRhdGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI1OS0yNjAKICAgIC8vICMgY2FsbCB0aGUgdXBkYXRlZCBhcHAKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoSGVsbG8uZ3JlZXQsICJ0aGVyZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBkdXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMyAvLyBtZXRob2QgImdyZWV0KHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOSAvLyAweDAwMDU3NDY4NjU3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyNjEKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImhpIHRoZXJlIgogICAgYnl0ZWMgMTQgLy8gImhpIHRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI2My0yNjgKICAgIC8vICMgZGVsZXRlIHRoZSBhcHAKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgSGVsbG8uZGVsZXRlLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyAgICAgIyBvbl9jb21wbGV0ZSBpcyBpbmZlcnJlZCBmcm9tIEhlbGxvLmRlbGV0ZSBBUkM0IGRlZmluaXRpb24KICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmZhY3RvcnkuSGVsbG9GYWN0b3J5LnRlc3Rfb3RoZXJfY29uc3RhbnRzKCkgLT4gdm9pZDoKdGVzdF9vdGhlcl9jb25zdGFudHM6CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcwLTI3MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X290aGVyX2NvbnN0YW50cyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcyLTI4NQogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpdHhuX2JlZ2luCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjc0LTI4NAogICAgLy8gY29tcGlsZWQ9Y29tcGlsZV9jb250cmFjdCgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAiTlVNIjogQmlnVUludCg1KSwKICAgIC8vICAgICAgICAgIkdSRUVUSU5HIjogU3RyaW5nKCJoZWxsbyIpLAogICAgLy8gICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAiQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVk1SEZLUSIKICAgIC8vICAgICAgICAgKSwKICAgIC8vICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgIH0sCiAgICAvLyApLAogICAgcHVzaGludCA0IC8vIDQKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgcHVzaGJ5dGVzIGJhc2U2NChDaUFDQUFFbUNnTnVkVzBFRlI5OGRRRXdDR2R5WldWMGFXNW5CMkZrWkhKbGMzTUdiV1YwYUc5a0JIUnRjR3dCUWlBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQVFBQUFBQU1SaEFBQU9JQUtDSUFBRkRpZ0FCTVJ0QkFGbUNBd1RaS0ZwMEJDUTNqVHdFV3d3amRUWWFBSTREQUFJQUZBQWZJb2t4R1JSRU1SZ1VSSWdBTWhZcFRGQ3dJNGt4R1lFRkVrUXhHRVFqaVRFWkZFUXhHRVEyR2dGWEFnQ0lBQlZKRlJaWEJnSk1VQ2xNVUxBamlTS0ppZ0FCSTRtS0FRRWlLR1ZFS3FBVkl3a2lLR1ZFS3FCTEFTTUlURTRDVWlJclpVU0FBU0JRaS85UVRGQWlKd1JsUkZBaUp3VmxSRkNKaWdBQUt5Y0daeWduQjJjbkJDY0laeWNGSndsbmlRPT0pCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjczCiAgICAvLyBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgcHVzaGJ5dGVzIDB4ZDkyODVhNzQgLy8gbWV0aG9kICJjcmVhdGUoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjcyLTI4NQogICAgLy8gYXBwID0gYXJjNC5hcmM0X2NyZWF0ZSgKICAgIC8vICAgICBIZWxsb090aGVyQ29uc3RhbnRzLAogICAgLy8gICAgIGNvbXBpbGVkPWNvbXBpbGVfY29udHJhY3QoCiAgICAvLyAgICAgICAgIEhlbGxvT3RoZXJDb25zdGFudHMsCiAgICAvLyAgICAgICAgIHRlbXBsYXRlX3ZhcnM9ewogICAgLy8gICAgICAgICAgICAgIk5VTSI6IEJpZ1VJbnQoNSksCiAgICAvLyAgICAgICAgICAgICAiR1JFRVRJTkciOiBTdHJpbmcoImhlbGxvIiksCiAgICAvLyAgICAgICAgICAgICAiQUNDT1VOVCI6IEFjY291bnQoCiAgICAvLyAgICAgICAgICAgICAgICAgIkFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFZNUhGS1EiCiAgICAvLyAgICAgICAgICAgICApLAogICAgLy8gICAgICAgICAgICAgIk1FVEhPRCI6IGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpLAogICAgLy8gICAgICAgICB9LAogICAgLy8gICAgICksCiAgICAvLyApLmNyZWF0ZWRfYXBwCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBDcmVhdGVkQXBwbGljYXRpb25JRAogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI4NwogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChIZWxsb090aGVyQ29uc3RhbnRzLmdyZWV0LCAiSm9obm55IiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGR1cAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBwdXNoYnl0ZXMgMHg1YjBjMjM3NSAvLyBtZXRob2QgImdyZWV0KHN0cmluZylieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjRhNmY2ODZlNmU3OQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MjkwCiAgICAvLyBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICBwdXNoYnl0ZXNzIGJhc2UzMihOQlNXWTNEUEVCRkc2MkRPTlo0VEtBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUEpIDB4NDBlMzM1MzIgLy8gYmFzZTMyKE5CU1dZM0RQRUJGRzYyRE9OWjRUS0FBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQSksIG1ldGhvZCAic29tZXRoaW5nKCl2b2lkIgogICAgY29uY2F0CiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjg5LTI5MAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAoCiAgICAvLyAgICAgYiJoZWxsbyBKb2hubnk1IiArIEdsb2JhbC56ZXJvX2FkZHJlc3MuYnl0ZXMgKyBhcmM0LmFyYzRfc2lnbmF0dXJlKCJzb21ldGhpbmcoKXZvaWQiKQogICAgPT0KICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyODktMjkxCiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICgKICAgIC8vICAgICBiImhlbGxvIEpvaG5ueTUiICsgR2xvYmFsLnplcm9fYWRkcmVzcy5ieXRlcyArIGFyYzQuYXJjNF9zaWduYXR1cmUoInNvbWV0aGluZygpdm9pZCIpCiAgICAvLyApCiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOTMtMjk0CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKEhlbGxvT3RoZXJDb25zdGFudHMuZGVsZXRlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18zIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkudGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKCkgLT4gdm9pZDoKdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zOgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5Ni0yOTcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9hYmlfY2FsbF9jcmVhdGVfcGFyYW1zKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weToyOTktMzA5CiAgICAvLyBhcHAgPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIEhlbGxvLmNyZWF0ZSwKICAgIC8vICAgICBTdHJpbmcoImhleSIpLAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Y29tcGlsZWQuYXBwcm92YWxfcHJvZ3JhbSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPWNvbXBpbGVkLmNsZWFyX3N0YXRlX3Byb2dyYW0sCiAgICAvLyAgICAgZ2xvYmFsX251bV91aW50PWNvbXBpbGVkLmdsb2JhbF91aW50cywKICAgIC8vICAgICBnbG9iYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmdsb2JhbF9ieXRlcywKICAgIC8vICAgICBsb2NhbF9udW1fdWludD1jb21waWxlZC5sb2NhbF91aW50cywKICAgIC8vICAgICBsb2NhbF9udW1fYnl0ZXM9Y29tcGlsZWQubG9jYWxfYnl0ZXMsCiAgICAvLyAgICAgZXh0cmFfcHJvZ3JhbV9wYWdlcz1jb21waWxlZC5leHRyYV9wcm9ncmFtX3BhZ2VzLAogICAgLy8gKS5jcmVhdGVkX2FwcAogICAgaXR4bl9iZWdpbgogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjI5OAogICAgLy8gY29tcGlsZWQgPSBjb21waWxlX2NvbnRyYWN0KEhlbGxvKQogICAgaW50Y18yIC8vIDEKICAgIGl0eG5fZmllbGQgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBieXRlY18xIC8vIGJhc2U2NChDb0VCUXc9PSkKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYnl0ZWMgNiAvLyBiYXNlNjQoQ2lBQ0FRQW1BUWhuY21WbGRHbHVaekVZUUFBRGlBQ1JpQUFCUTRvQUFURWJRUUJmZ2dNRUlOODZWQVFrTjQwOEJOQ2lnZ0EyR2dDT0F3QUNBQlVBSUNPSk1Sa1VSREVZRkVRMkdnRlhBZ0NJQUQ4aWlURVpnUVVTUkRFWVJDS0pNUmtVUkRFWVJEWWFBVmNDQUlnQUtra1ZGbGNHQWt4UWdBUVZIM3gxVEZDd0lvbUJCREVaamdFQUFpT0pNUmhFSW9tS0FRQW9pLzluaVlvQkFTTW9aVVNBQVNCUWkvOVFpWW9BQUNpQUFHZUopCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjk5LTMwOQogICAgLy8gYXBwID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsby5jcmVhdGUsCiAgICAvLyAgICAgU3RyaW5nKCJoZXkiKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJjcmVhdGUoc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gY29tcGlsZS9mYWN0b3J5LnB5OjMwMQogICAgLy8gU3RyaW5nKCJoZXkiKSwKICAgIHB1c2hieXRlcyAweDAwMDM2ODY1NzkKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6Mjk5LTMwOQogICAgLy8gYXBwID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBIZWxsby5jcmVhdGUsCiAgICAvLyAgICAgU3RyaW5nKCJoZXkiKSwKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPWNvbXBpbGVkLmFwcHJvdmFsX3Byb2dyYW0sCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1jb21waWxlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtLAogICAgLy8gICAgIGdsb2JhbF9udW1fdWludD1jb21waWxlZC5nbG9iYWxfdWludHMsCiAgICAvLyAgICAgZ2xvYmFsX251bV9ieXRlcz1jb21waWxlZC5nbG9iYWxfYnl0ZXMsCiAgICAvLyAgICAgbG9jYWxfbnVtX3VpbnQ9Y29tcGlsZWQubG9jYWxfdWludHMsCiAgICAvLyAgICAgbG9jYWxfbnVtX2J5dGVzPWNvbXBpbGVkLmxvY2FsX2J5dGVzLAogICAgLy8gICAgIGV4dHJhX3Byb2dyYW1fcGFnZXM9Y29tcGlsZWQuZXh0cmFfcHJvZ3JhbV9wYWdlcywKICAgIC8vICkuY3JlYXRlZF9hcHAKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzExCiAgICAvLyByZXN1bHQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKEhlbGxvLmdyZWV0LCAidGhlcmUiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZHVwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzMgLy8gbWV0aG9kICJncmVldChzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDkgLy8gMHgwMDA1NzQ2ODY1NzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2ZhY3RvcnkucHk6MzEzCiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJoZXkgdGhlcmUiCiAgICBwdXNoYnl0ZXMgImhleSB0aGVyZSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGNvbXBpbGUvZmFjdG9yeS5weTozMTUtMzE2CiAgICAvLyAjIGRlbGV0ZSB0aGUgYXBwCiAgICAvLyBhcmM0LmFiaV9jYWxsKEhlbGxvLmRlbGV0ZSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGludGNfMyAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImRlbGV0ZSgpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuZmFjdG9yeS5IZWxsb0ZhY3RvcnkuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAAYBBSYPBBUffHUECoEBQwQkN408BNCiggAHAAV3b3JsZARMXGG6sQEKIAIBACYBCGdyZWV0aW5nMRhAAAOIAJGIAAFDigABMRtBAF+CAwQg3zpUBCQ3jTwE0KKCADYaAI4DAAIAFQAgI4kxGRREMRgURDYaAVcCAIgAPyKJMRmBBRJEMRhEIokxGRREMRhENhoBVwIAiAAqSRUWVwYCTFCABBUffHVMULAiiYEEMRmOAQACI4kxGEQiiYoBACiL/2eJigEBIyhlRIABIFCL/1CJigAAKIAAZ4kEIN86VKQBCiACAQAmAghncmVldGluZwR0bXBsMRhAAAOIAICIAAFDigABMRtBAFaCAwRMXGG6BCQ3jTwE0KKCADYaAI4DAAIADAAXI4kxGRREMRgURCKJMRmBBRJEMRhEIokxGRREMRhENhoBVwIAiAAiSRUWVwYCTFCABBUffHVMULAiiYEEMRmOAQACI4kxGEQiiYoBASMoZUSAASBQi/9QiYoAACgpZ4kHAAV0aGVyZQcABWhlbGxvgCAKIAIBAIgAAUOKAAExG0EAOIICBPXk/U0EJDeNPDYaAI4CAAIAGCOJMRkURDEYRIgAJBaABBUffHVMULAiiTEZgQUSRDEYRCKJMRlAAAYxGBREIokjiYoAAYgAAhWJigABgIAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJBPXk/U0IaGkgdGhlcmWIAAFDigABMRtBAPGCDARg/6KVBCoXmVwE66dC6gQzWmQ4BAKUfKIErh7oQAR7kHP1BIVKaMoEHaAEoQR/TnX1BAGWWTcEf7+MyjYaAI4MAAIAEgAeACoANgBCAE4AWgBmAHIAfgCKIokxGRREMRhEiACXKExQsCSJMRkURDEYRIgArSSJMRkURDEYRIgBAiSJMRkURDEYRIgBUSSJMRkURDEYRIgCQiSJMRkURDEYRIgCjCSJMRkURDEYRIgC4iSJMRkURDEYRIgDNCSJMRkURDEYRIgELCSJMRkURDEYRIgEbySJMRkURDEYRIgFASSJMRkURDEYRIgGoySJMRlAAAYxGBREJIkiiYoAAYAgpvNyUaWMqDe9pRep9wcO5LgKOI/kRhRra9Q7O+1dXOWJigAAsSSyNSmyQicGskAnB7IaJwqyGiOyECKyAbO0PbFJshgrshonBLIaI7IQIrIBs7Q+SVcEAExXAAQoEkSxJbIZKrIaTLIYI7IQIrIBs4ANAAtoZWxsbyB3b3JsZBJEiYoAALEksjUpskInCLJAJwWyGiOyECKyAbO0PbFJshgrshonBLIaI7IQIrIBs7Q+SVcEAExXAAQoEkSxJbIZKrIaTLIYI7IQIrIBs4ALAAloZXkgd29ybGQSRImKAACxJLI1KbJCgKIBCiACAQAmAghncmVldGluZwJoaTEYQAADiACAiAABQ4oAATEbQQBWggMETFxhugQkN408BNCiggA2GgCOAwACAAwAFyOJMRkURDEYFEQiiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAIkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQEjKGVEgAEgUIv/UImKAAAoKWeJskAnBbIaI7IQIrIBs7Q9sUmyGCuyGicEshojshAisgGztD5JVwQATFcABCgSRLElshkqshpMshgjshAisgGzgAoACGhpIHdvcmxkEkSJigAAsYECsjgpskInC7JAJwyyQCOyECKyAbO0PbFJshgnDbIaI7IQIrIBs7Q+SVcEAExXAAQoEkSxJbIZKrIaTLIYI7IQIrIBs4AIAAAAAAAAEACoRImKAACxJLI1KbJCJwayQCcHshonCrIaI7IQIrIBs7Q9sUmyGCuyGicEshojshAisgGztD5JVwQATFcABCgSRFcCALElshlMshgqshojshAisgGzgAtoZWxsbyB3b3JsZBJEiYoAALEksjUpskInCLJAJwWyGiOyECKyAbO0PbFJshgrshonBLIaI7IQIrIBs7Q+SVcEAExXAAQoEkRXAgCxJbIZTLIYKrIaI7IQIrIBs4ALdG1wbDIgd29ybGQSRImKAACxJLI1KbJCgKUBCiACAQAmAghncmVldGluZwVwcmZ4MjEYQAADiACAiAABQ4oAATEbQQBWggMETFxhugQkN408BNCiggA2GgCOAwACAAwAFyOJMRkURDEYFEQiiTEZgQUSRDEYRCKJMRkURDEYRDYaAVcCAIgAIkkVFlcGAkxQgAQVH3x1TFCwIomBBDEZjgEAAiOJMRhEIomKAQEjKGVEgAEgUIv/UImKAAAoKWeJskAnBbIaI7IQIrIBs7Q9sUmyGCuyGicEshojshAisgGztD5JVwQATFcABCgSRFcCALElshlMshgqshojshAisgGzgAtwcmZ4MiB3b3JsZBJEiYoAALGBArI4KbJCJwuyQCcMskAjshAisgGztD2xSbIYJw2yGiOyECKyAbO0PklXBABMVwAEKBJEF4GAIBJEsSWyGbIYKrIaI7IQIrIBs4mKAACxgQKyNoECsjeBArI0gQKyNSSyOCmyQicIskAnBbIaI7IQIrIBs7Q9sUmyGCuyGicJshojshAisgGztD5JVwQATFcABCgSRFcCACcOEkSxKbJCJwayQIEEshlJshgjshAisgGzsUmyGCuyGicJshojshAisgGztD5JVwQATFcABCgSRFcCACcOEkSxJbIZshgqshojshAisgGziYoAALGBBLI1KbJCgJUCCiACAAEmCgNudW0EFR98dQEwCGdyZWV0aW5nB2FkZHJlc3MGbWV0aG9kBHRtcGwBQiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAMRhAAAOIAKCIAAFDigABMRtBAFmCAwTZKFp0BCQ3jTwEWwwjdTYaAI4DAAIAFAAfIokxGRREMRgURIgAMhYpTFCwI4kxGYEFEkQxGEQjiTEZFEQxGEQ2GgFXAgCIABVJFRZXBgJMUClMULAjiSKJigABI4mKAQEiKGVEKqAVIwkiKGVEKqBLASMITE4CUiIrZUSAASBQi/9QTFAiJwRlRFAiJwVlRFCJigAAKycGZygnB2cnBCcIZycFJwlnibJAgATZKFp0shojshAisgGztD2xSbIYgARbDCN1shqACAAGSm9obm55shojshAisgGztD5JVwQATFcABCgSRFcCAIICLWhlbGxvIEpvaG5ueTUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARA4zUyUBJEsSWyGbIYKrIaI7IQIrIBs4mKAACxJLI1KbJCJwayQCcHshqABQADaGV5shojshAisgGztD2xSbIYK7IaJwmyGiOyECKyAbO0PklXBABMVwAEKBJEVwIAgAloZXkgdGhlcmUSRLElshmyGCqyGiOyECKyAbOJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/compile/out/HelloOtherConstants.arc56.json b/test_cases/compile/out/HelloOtherConstants.arc56.json new file mode 100644 index 0000000000..79a8b500b8 --- /dev/null +++ b/test_cases/compile/out/HelloOtherConstants.arc56.json @@ -0,0 +1,208 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "HelloOtherConstants", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "greet", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 4 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "greeting": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "Z3JlZXRpbmc=" + }, + "num": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "bnVt" + }, + "address": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "YWRkcmVzcw==" + }, + "method": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "bWV0aG9k" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": { + "TMPL_GREETING": { + "type": "AVMString", + "value": "dG1wbA==" + }, + "TMPL_NUM": { + "type": "AVMBytes", + "value": "Qg==" + }, + "TMPL_ACCOUNT": { + "type": "AVMBytes", + "value": "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" + }, + "TMPL_METHOD": { + "type": "AVMBytes", + "value": "AAAAAA==" + } + }, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 160 + ], + "errorMessage": "OnCompletion is DeleteApplication" + }, + { + "pc": [ + 140, + 169 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 246 + ], + "errorMessage": "check self.address exists" + }, + { + "pc": [ + 232 + ], + "errorMessage": "check self.greeting exists" + }, + { + "pc": [ + 252 + ], + "errorMessage": "check self.method exists" + }, + { + "pc": [ + 209, + 218 + ], + "errorMessage": "check self.num exists" + }, + { + "pc": [ + 144 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 163, + 172 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrICJudW0iIDB4MTUxZjdjNzUgMHgzMCAiZ3JlZXRpbmciICJhZGRyZXNzIiAibWV0aG9kIiBUTVBMX0dSRUVUSU5HIFRNUExfTlVNIFRNUExfQUNDT1VOVCBUTVBMX01FVEhPRAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo4MQogICAgLy8gY2xhc3MgSGVsbG9PdGhlckNvbnN0YW50cyhBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA4CiAgICBwdXNoYnl0ZXNzIDB4ZDkyODVhNzQgMHgyNDM3OGQzYyAweDViMGMyMzc1IC8vIG1ldGhvZCAiY3JlYXRlKCl1aW50NjQiLCBtZXRob2QgImRlbGV0ZSgpdm9pZCIsIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGUKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjkzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBwdXNoaW50IDUgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgID09CiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIERlbGV0ZUFwcGxpY2F0aW9uCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ3JlZXRfcm91dGVANDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo4MQogICAgLy8gY2xhc3MgSGVsbG9PdGhlckNvbnN0YW50cyhBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo5NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgZ3JlZXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18xIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDg6CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODEKICAgIC8vIGNsYXNzIEhlbGxvT3RoZXJDb25zdGFudHMoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmNyZWF0ZSgpIC0+IHVpbnQ2NDoKY3JlYXRlOgogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojg5LTkwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6OTEKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmdyZWV0KG5hbWU6IGJ5dGVzKSAtPiBieXRlczoKZ3JlZXQ6CiAgICAvLyBjb21waWxlL2FwcHMucHk6OTctOTgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ3JlZXQoc2VsZiwgbmFtZTogU3RyaW5nKSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojk5CiAgICAvLyBudW1fYWxwaGEgPSAoc2VsZi5udW0gKyA0OCkuYnl0ZXNbLTFdCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAibnVtIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm51bSBleGlzdHMKICAgIGJ5dGVjXzIgLy8gMHgzMAogICAgYisKICAgIGxlbgogICAgaW50Y18xIC8vIDEKICAgIC0KICAgIGludGNfMCAvLyAwCiAgICBieXRlY18wIC8vICJudW0iCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubnVtIGV4aXN0cwogICAgYnl0ZWNfMiAvLyAweDMwCiAgICBiKwogICAgZGlnIDEKICAgIGludGNfMSAvLyAxCiAgICArCiAgICBzd2FwCiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICAvLyBjb21waWxlL2FwcHMucHk6MTAxCiAgICAvLyBzZWxmLmdyZWV0aW5nLmJ5dGVzICsgYiIgIiArIG5hbWUuYnl0ZXMgKyBudW1fYWxwaGEgKyBzZWxmLmFkZHJlc3MuYnl0ZXMgKyBzZWxmLm1ldGhvZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzMgLy8gImdyZWV0aW5nIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdyZWV0aW5nIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MjAKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDQgLy8gImFkZHJlc3MiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYWRkcmVzcyBleGlzdHMKICAgIGNvbmNhdAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjIDUgLy8gIm1ldGhvZCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tZXRob2QgZXhpc3RzCiAgICBjb25jYXQKICAgIC8vIGNvbXBpbGUvYXBwcy5weToxMDAtMTAyCiAgICAvLyByZXR1cm4gKAogICAgLy8gICAgIHNlbGYuZ3JlZXRpbmcuYnl0ZXMgKyBiIiAiICsgbmFtZS5ieXRlcyArIG51bV9hbHBoYSArIHNlbGYuYWRkcmVzcy5ieXRlcyArIHNlbGYubWV0aG9kCiAgICAvLyApCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODMKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBjb21waWxlL2FwcHMucHk6ODQKICAgIC8vIHNlbGYuZ3JlZXRpbmcgPSBUZW1wbGF0ZVZhcltTdHJpbmddKCJHUkVFVElORyIpCiAgICBieXRlY18zIC8vICJncmVldGluZyIKICAgIGJ5dGVjIDYgLy8gVE1QTF9HUkVFVElORwogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo4NQogICAgLy8gc2VsZi5udW0gPSBUZW1wbGF0ZVZhcltCaWdVSW50XSgiTlVNIikKICAgIGJ5dGVjXzAgLy8gIm51bSIKICAgIGJ5dGVjIDcgLy8gVE1QTF9OVU0KICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBjb21waWxlL2FwcHMucHk6ODYKICAgIC8vIHNlbGYuYWRkcmVzcyA9IFRlbXBsYXRlVmFyW0FjY291bnRdKCJBQ0NPVU5UIikKICAgIGJ5dGVjIDQgLy8gImFkZHJlc3MiCiAgICBieXRlYyA4IC8vIFRNUExfQUNDT1VOVAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo4NwogICAgLy8gc2VsZi5tZXRob2QgPSBUZW1wbGF0ZVZhcltCeXRlc10oIk1FVEhPRCIpCiAgICBieXRlYyA1IC8vICJtZXRob2QiCiAgICBieXRlYyA5IC8vIFRNUExfTUVUSE9ECiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb090aGVyQ29uc3RhbnRzLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAEmCgNudW0EFR98dQEwCGdyZWV0aW5nB2FkZHJlc3MGbWV0aG9kBHRtcGwBQiAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAMRhAAAOIAKCIAAFDigABMRtBAFmCAwTZKFp0BCQ3jTwEWwwjdTYaAI4DAAIAFAAfIokxGRREMRgURIgAMhYpTFCwI4kxGYEFEkQxGEQjiTEZFEQxGEQ2GgFXAgCIABVJFRZXBgJMUClMULAjiSKJigABI4mKAQEiKGVEKqAVIwkiKGVEKqBLASMITE4CUiIrZUSAASBQi/9QTFAiJwRlRFAiJwVlRFCJigAAKycGZygnB2cnBCcIZycFJwlniQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/compile/out/HelloPrfx.arc56.json b/test_cases/compile/out/HelloPrfx.arc56.json new file mode 100644 index 0000000000..cae8478c5f --- /dev/null +++ b/test_cases/compile/out/HelloPrfx.arc56.json @@ -0,0 +1,165 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "HelloPrfx", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "greet", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "greeting": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "Z3JlZXRpbmc=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "events": [], + "templateVariables": { + "PRFX_GREETING": { + "type": "AVMString", + "value": "cHJmeA==" + } + }, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 86 + ], + "errorMessage": "OnCompletion is DeleteApplication" + }, + { + "pc": [ + 74, + 95 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 148 + ], + "errorMessage": "check self.greeting exists" + }, + { + "pc": [ + 78 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 89, + 98, + 139 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBQUkZYX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvUHJmeC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6NzEKICAgIC8vIGNsYXNzIEhlbGxvUHJmeChIZWxsb0Jhc2UpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiLCBtZXRob2QgImRlbGV0ZSgpdm9pZCIsIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojc2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjcxCiAgICAvLyBjbGFzcyBIZWxsb1ByZngoSGVsbG9CYXNlKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdyZWV0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo3MQogICAgLy8gY2xhc3MgSGVsbG9QcmZ4KEhlbGxvQmFzZSk6CiAgICBwdXNoaW50IDQgLy8gNAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdXBkYXRlQDgKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiB1cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5OjM1CiAgICAvLyByZXR1cm4gc2VsZi5ncmVldGluZyArICIgIiArIG5hbWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ncmVldGluZyBleGlzdHMKICAgIHB1c2hieXRlcyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvUHJmeC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjczCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5Ojc0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciLCBwcmVmaXg9IlBSRlhfIikKICAgIGJ5dGVjXzAgLy8gImdyZWV0aW5nIgogICAgYnl0ZWNfMSAvLyBQUkZYX0dSRUVUSU5HCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1ByZnguY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiACAQAmAghncmVldGluZwRwcmZ4MRhAAAOIAICIAAFDigABMRtBAFaCAwRMXGG6BCQ3jTwE0KKCADYaAI4DAAIADAAXI4kxGRREMRgURCKJMRmBBRJEMRhEIokxGRREMRhENhoBVwIAiAAiSRUWVwYCTFCABBUffHVMULAiiYEEMRmOAQACI4kxGEQiiYoBASMoZUSAASBQi/9QiYoAACgpZ4k=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/compile/out/HelloTmpl.arc56.json b/test_cases/compile/out/HelloTmpl.arc56.json new file mode 100644 index 0000000000..cc1525bc93 --- /dev/null +++ b/test_cases/compile/out/HelloTmpl.arc56.json @@ -0,0 +1,165 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "HelloTmpl", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "greet", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "greeting": { + "keyType": "AVMString", + "valueType": "AVMString", + "key": "Z3JlZXRpbmc=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [ + "UpdateApplication" + ] + }, + "events": [], + "templateVariables": { + "TMPL_GREETING": { + "type": "AVMString", + "value": "dG1wbA==" + } + }, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 86 + ], + "errorMessage": "OnCompletion is DeleteApplication" + }, + { + "pc": [ + 74, + 95 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 148 + ], + "errorMessage": "check self.greeting exists" + }, + { + "pc": [ + 78 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 89, + 98, + 139 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGJ5dGVjYmxvY2sgImdyZWV0aW5nIiBUTVBMX0dSRUVUSU5HCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvVG1wbC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6NjEKICAgIC8vIGNsYXNzIEhlbGxvVG1wbChIZWxsb0Jhc2UpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweDI0Mzc4ZDNjIDB4ZDBhMjgyMDAgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiLCBtZXRob2QgImRlbGV0ZSgpdm9pZCIsIG1ldGhvZCAiZ3JlZXQoc3RyaW5nKXN0cmluZyIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2RlbGV0ZV9yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyZWV0X3JvdXRlQDQKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6MjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncmVldF9yb3V0ZUA0OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYxCiAgICAvLyBjbGFzcyBIZWxsb1RtcGwoSGVsbG9CYXNlKToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyBjb21waWxlL2FwcHMucHk6MzMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGdyZWV0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANzoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo2MQogICAgLy8gY2xhc3MgSGVsbG9UbXBsKEhlbGxvQmFzZSk6CiAgICBwdXNoaW50IDQgLy8gNAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdXBkYXRlQDgKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3VwZGF0ZUA4OgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjI5CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJVcGRhdGVBcHBsaWNhdGlvbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGNvbXBpbGUvYXBwcy5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIC8vIGRlZiB1cGRhdGUoc2VsZikgLT4gTm9uZToKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb0Jhc2UuZ3JlZXQobmFtZTogYnl0ZXMpIC0+IGJ5dGVzOgpncmVldDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozMy0zNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBncmVldChzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IFN0cmluZzoKICAgIHByb3RvIDEgMQogICAgLy8gY29tcGlsZS9hcHBzLnB5OjM1CiAgICAvLyByZXR1cm4gc2VsZi5ncmVldGluZyArICIgIiArIG5hbWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18wIC8vICJncmVldGluZyIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5ncmVldGluZyBleGlzdHMKICAgIHB1c2hieXRlcyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkhlbGxvVG1wbC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gY29tcGlsZS9hcHBzLnB5OjYzCiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gY29tcGlsZS9hcHBzLnB5OjY0CiAgICAvLyBzZWxmLmdyZWV0aW5nID0gVGVtcGxhdGVWYXJbU3RyaW5nXSgiR1JFRVRJTkciKQogICAgYnl0ZWNfMCAvLyAiZ3JlZXRpbmciCiAgICBieXRlY18xIC8vIFRNUExfR1JFRVRJTkcKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5IZWxsb1RtcGwuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiACAQAmAghncmVldGluZwR0bXBsMRhAAAOIAICIAAFDigABMRtBAFaCAwRMXGG6BCQ3jTwE0KKCADYaAI4DAAIADAAXI4kxGRREMRgURCKJMRmBBRJEMRhEIokxGRREMRhENhoBVwIAiAAiSRUWVwYCTFCABBUffHVMULAiiYEEMRmOAQACI4kxGEQiiYoBASMoZUSAASBQi/9QiYoAACgpZ4k=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/compile/out/LargeProgram.arc56.json b/test_cases/compile/out/LargeProgram.arc56.json new file mode 100644 index 0000000000..e1e9a32a0b --- /dev/null +++ b/test_cases/compile/out/LargeProgram.arc56.json @@ -0,0 +1,125 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "LargeProgram", + "structs": {}, + "methods": [ + { + "name": "get_big_bytes_length", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "delete", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "DeleteApplication" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 67 + ], + "errorMessage": "OnCompletion is DeleteApplication" + }, + { + "pc": [ + 43 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 81 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 46, + 70 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuY29tcGlsZS5hcHBzLkxhcmdlUHJvZ3JhbS5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBjb21waWxlL2FwcHMucHk6MzgKICAgIC8vIGNsYXNzIExhcmdlUHJvZ3JhbShBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHhmNWU0ZmQ0ZCAweDI0Mzc4ZDNjIC8vIG1ldGhvZCAiZ2V0X2JpZ19ieXRlc19sZW5ndGgoKXVpbnQ2NCIsIG1ldGhvZCAiZGVsZXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kZWxldGVfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ19ieXRlc19sZW5ndGhfcm91dGVAMjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgZ2V0X2JpZ19ieXRlc19sZW5ndGgKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGVsZXRlX3JvdXRlQDM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NDQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiRGVsZXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHB1c2hpbnQgNSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgPT0KICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgRGVsZXRlQXBwbGljYXRpb24KICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANjoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozOAogICAgLy8gY2xhc3MgTGFyZ2VQcm9ncmFtKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTozOAogICAgLy8gY2xhc3MgTGFyZ2VQcm9ncmFtKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5jb21waWxlLmFwcHMuTGFyZ2VQcm9ncmFtLmdldF9iaWdfYnl0ZXNfbGVuZ3RoKCkgLT4gdWludDY0OgpnZXRfYmlnX2J5dGVzX2xlbmd0aDoKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MC00MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBnZXRfYmlnX2J5dGVzX2xlbmd0aChzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGNvbXBpbGUvYXBwcy5weTo0MgogICAgLy8gcmV0dXJuIGdldF9iaWdfYnl0ZXMoKS5sZW5ndGgKICAgIGNhbGxzdWIgZ2V0X2JpZ19ieXRlcwogICAgbGVuCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5nZXRfYmlnX2J5dGVzKCkgLT4gYnl0ZXM6CmdldF9iaWdfYnl0ZXM6CiAgICAvLyBjb21waWxlL2FwcHMucHk6NDktNTAKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2JpZ19ieXRlcygpIC0+IEJ5dGVzOgogICAgcHJvdG8gMCAxCiAgICAvLyBjb21waWxlL2FwcHMucHk6NTEKICAgIC8vIHJldHVybiBCeXRlcy5mcm9tX2hleCgiMDAiICogNDA5NikKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmNvbXBpbGUuYXBwcy5MYXJnZVByb2dyYW0uY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiACAQCIAAFDigABMRtBADiCAgT15P1NBCQ3jTw2GgCOAgACABgjiTEZFEQxGESIACQWgAQVH3x1TFCwIokxGYEFEkQxGEQiiTEZQAAGMRgURCKJI4mKAAGIAAIViYoAAYCAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/compile/puya.log b/test_cases/compile/puya.log index c5323f97cd..f1a19bd55c 100644 --- a/test_cases/compile/puya.log +++ b/test_cases/compile/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'TMPL_GREETING': b'tmpl', 'PRFX_GREETING': b'prfx', 'TMPL_NUM': b'B', 'TMPL_ACCOUNT': b'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00', 'TMPL_METHOD': b'/x00/x00/x00/x00'}, template_vars_prefix='', locals_coalescing_strategy=, paths=['compile'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'TMPL_GREETING': b'tmpl', 'PRFX_GREETING': b'prfx', 'TMPL_NUM': b'B', 'TMPL_ACCOUNT': b'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00', 'TMPL_METHOD': b'/x00/x00/x00/x00'}, template_vars_prefix='', locals_coalescing_strategy=, paths=['compile'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing compile/out/module.awst debug: Sealing block@0: // L12 @@ -7087,6 +7087,7 @@ info: Writing compile/out/always_approve_sig.teal info: Writing compile/out/always_approve_sig.bin info: Writing compile/out/always_approve_sig.puya.map info: Writing compile/out/HelloBase.arc32.json +info: Writing compile/out/HelloBase.arc56.json info: Writing compile/out/HelloBase.approval.teal info: Writing compile/out/HelloBase.clear.teal info: Writing compile/out/HelloBase.approval.bin @@ -7094,6 +7095,7 @@ info: Writing compile/out/HelloBase.clear.bin info: Writing compile/out/HelloBase.approval.puya.map info: Writing compile/out/HelloBase.clear.puya.map info: Writing compile/out/LargeProgram.arc32.json +info: Writing compile/out/LargeProgram.arc56.json info: Writing compile/out/LargeProgram.approval.teal info: Writing compile/out/LargeProgram.clear.teal info: Writing compile/out/LargeProgram.approval.bin @@ -7101,6 +7103,7 @@ info: Writing compile/out/LargeProgram.clear.bin info: Writing compile/out/LargeProgram.approval.puya.map info: Writing compile/out/LargeProgram.clear.puya.map info: Writing compile/out/Hello.arc32.json +info: Writing compile/out/Hello.arc56.json info: Writing compile/out/Hello.approval.teal info: Writing compile/out/Hello.clear.teal info: Writing compile/out/Hello.approval.bin @@ -7108,6 +7111,7 @@ info: Writing compile/out/Hello.clear.bin info: Writing compile/out/Hello.approval.puya.map info: Writing compile/out/Hello.clear.puya.map info: Writing compile/out/HelloTmpl.arc32.json +info: Writing compile/out/HelloTmpl.arc56.json info: Writing compile/out/HelloTmpl.approval.teal info: Writing compile/out/HelloTmpl.clear.teal info: Writing compile/out/HelloTmpl.approval.bin @@ -7115,6 +7119,7 @@ info: Writing compile/out/HelloTmpl.clear.bin info: Writing compile/out/HelloTmpl.approval.puya.map info: Writing compile/out/HelloTmpl.clear.puya.map info: Writing compile/out/HelloPrfx.arc32.json +info: Writing compile/out/HelloPrfx.arc56.json info: Writing compile/out/HelloPrfx.approval.teal info: Writing compile/out/HelloPrfx.clear.teal info: Writing compile/out/HelloPrfx.approval.bin @@ -7122,6 +7127,7 @@ info: Writing compile/out/HelloPrfx.clear.bin info: Writing compile/out/HelloPrfx.approval.puya.map info: Writing compile/out/HelloPrfx.clear.puya.map info: Writing compile/out/HelloOtherConstants.arc32.json +info: Writing compile/out/HelloOtherConstants.arc56.json info: Writing compile/out/HelloOtherConstants.approval.teal info: Writing compile/out/HelloOtherConstants.clear.teal info: Writing compile/out/HelloOtherConstants.approval.bin @@ -7129,6 +7135,7 @@ info: Writing compile/out/HelloOtherConstants.clear.bin info: Writing compile/out/HelloOtherConstants.approval.puya.map info: Writing compile/out/HelloOtherConstants.clear.puya.map info: Writing compile/out/HelloFactory.arc32.json +info: Writing compile/out/HelloFactory.arc56.json info: Writing compile/out/HelloFactory.approval.teal info: Writing compile/out/HelloFactory.clear.teal info: Writing compile/out/HelloFactory.approval.bin diff --git a/test_cases/conditional_execution/puya.log b/test_cases/conditional_execution/puya.log index df22a3ff44..5eaa939b5b 100644 --- a/test_cases/conditional_execution/puya.log +++ b/test_cases/conditional_execution/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['conditional_execution'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['conditional_execution'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv conditional_execution/contract.py:11:9 warning: expression result is ignored conditional_execution/contract.py:17:9 warning: expression result is ignored diff --git a/test_cases/conditional_expressions/puya.log b/test_cases/conditional_expressions/puya.log index b6b37bbf45..e2034a50e9 100644 --- a/test_cases/conditional_expressions/puya.log +++ b/test_cases/conditional_expressions/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['conditional_expressions'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['conditional_expressions'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing conditional_expressions/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/constants/puya.log b/test_cases/constants/puya.log index a40af6c311..994cddcb2c 100644 --- a/test_cases/constants/puya.log +++ b/test_cases/constants/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['constants'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['constants'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv constants/non_utf8.py:1 warning: UH OH SPAGHETTI-O's, darn tootin' non-utf8(?!) encoded file encountered: constants/non_utf8.py encoded as iso-8859-7 info: writing constants/out/module.awst diff --git a/test_cases/contains/puya.log b/test_cases/contains/puya.log index b876b4ad9c..b3dc49a4b2 100644 --- a/test_cases/contains/puya.log +++ b/test_cases/contains/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['contains'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['contains'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing contains/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/control_op_simplification/puya.log b/test_cases/control_op_simplification/puya.log index a5163b8d28..6bad601747 100644 --- a/test_cases/control_op_simplification/puya.log +++ b/test_cases/control_op_simplification/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['control_op_simplification'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['control_op_simplification'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing control_op_simplification/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/debug/out/DebugContract.arc56.json b/test_cases/debug/out/DebugContract.arc56.json new file mode 100644 index 0000000000..376ae26e73 --- /dev/null +++ b/test_cases/debug/out/DebugContract.arc56.json @@ -0,0 +1,120 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "DebugContract", + "structs": {}, + "methods": [ + { + "name": "test", + "args": [ + { + "type": "uint64", + "name": "x" + }, + { + "type": "uint64", + "name": "y" + }, + { + "type": "uint64", + "name": "z" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": { + "A_MULT": { + "type": "AVMUint64", + "value": "AAAAAAAAAAE=" + } + }, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 52 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 91 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 55 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0LkRlYnVnQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgMTAgVE1QTF9BX01VTFQKICAgIGJ5dGVjYmxvY2sgIiAiIDB4MzAzMTMyMzMzNDM1MzYzNzM4MzkKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBEZWJ1Z0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHg1MzU3NGJmZiAvLyBtZXRob2QgInRlc3QodWludDY0LHVpbnQ2NCx1aW50NjQpdWludDY0IgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9yb3V0ZUAyCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X3JvdXRlQDI6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHRlc3QKICAgIGl0b2IKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBEZWJ1Z0NvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIERlYnVnQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGVidWcuY29udHJhY3QuRGVidWdDb250cmFjdC50ZXN0KHg6IHVpbnQ2NCwgeTogdWludDY0LCB6OiB1aW50NjQpIC0+IHVpbnQ2NDoKdGVzdDoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdChzZWxmLCB4OiBVSW50NjQsIHk6IFVJbnQ2NCwgejogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAzIDEKICAgIGludGNfMSAvLyAwCiAgICBkdXAKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo4CiAgICAvLyBhID0geCAqIFRlbXBsYXRlVmFyW1VJbnQ2NF0oIkFfTVVMVCIpCiAgICBmcmFtZV9kaWcgLTMKICAgIGludGNfMyAvLyBUTVBMX0FfTVVMVAogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6OQogICAgLy8gYiA9IHggKyB5CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZHVwbiAyCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxMAogICAgLy8gYyA9IGIgKiB6CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTEKICAgIC8vIGlmIGIgPCBjOgogICAgPAogICAgYnogdGVzdF9lbHNlX2JvZHlAMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTIKICAgIC8vIGEgPSBhICsgeQogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAtMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMQoKdGVzdF9lbHNlX2JvZHlAMjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjEzCiAgICAvLyBlbGlmIGEgPCBjOgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToxNAogICAgLy8gYSA9IGEgKyB6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDEwCgp0ZXN0X2Vsc2VfYm9keUA0OgogICAgLy8gZGVidWcvY29udHJhY3QucHk6MTUKICAgIC8vIGVsaWYgYiA8IGE6CiAgICBmcmFtZV9kaWcgNQogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHRlc3RfZWxzZV9ib2R5QDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE2CiAgICAvLyBhID0gYSAqIDMKICAgIGZyYW1lX2RpZyA0CiAgICBwdXNoaW50IDMgLy8gMwogICAgKgogICAgZnJhbWVfYnVyeSA0CiAgICBiIHRlc3RfYWZ0ZXJfaWZfZWxzZUAxMAoKdGVzdF9lbHNlX2JvZHlANjoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBlbGlmIGIgPiBhOgogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIDQKICAgID4KICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMwogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDgKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjE4CiAgICAvLyBiID0gYiArIGEKICAgIGZyYW1lX2RpZyA1CiAgICBmcmFtZV9kaWcgNAogICAgKwogICAgZnJhbWVfYnVyeSAzCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAODoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDUKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMDoKCnRlc3RfYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIwCiAgICAvLyBpZiBhICsgYiA8IGM6CiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2RpZyA2CiAgICA8CiAgICBieiB0ZXN0X2Vsc2VfYm9keUAxMwogICAgLy8gZGVidWcvY29udHJhY3QucHk6MjEKICAgIC8vIGEgKj0gc29tZV9mdW5jKGEsIHkpCiAgICBmcmFtZV9kaWcgNAogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGNhbGxzdWIgc29tZV9mdW5jCiAgICAqCiAgICBmcmFtZV9idXJ5IDQKICAgIGIgdGVzdF9hZnRlcl9pZl9lbHNlQDE0Cgp0ZXN0X2Vsc2VfYm9keUAxMzoKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjIzCiAgICAvLyBiICo9IHNvbWVfZnVuYyhiLCB6KQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIHNvbWVfZnVuYwogICAgKgogICAgZnJhbWVfYnVyeSA1Cgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTQ6CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyNQogICAgLy8gYmVlID0gaXRvYShiKQogICAgZnJhbWVfZGlnIDUKICAgIGR1cAogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI2CiAgICAvLyBjID0gYSArIGIKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIHVuY292ZXIgMgogICAgKwogICAgZHVwCiAgICBmcmFtZV9idXJ5IDYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBjZWEgPSBpdG9hKGMpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weToyOQogICAgLy8gaWYgYSA8IGM6CiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMTYKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMwCiAgICAvLyBhICs9IGMKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgNgogICAgKwogICAgZnJhbWVfYnVyeSAyCgp0ZXN0X2FmdGVyX2lmX2Vsc2VAMTY6CiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBmcmFtZV9idXJ5IDQKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBpZiBhIDwgYjoKICAgIGR1cAogICAgZnJhbWVfZGlnIDUKICAgIDwKICAgIHN3YXAKICAgIGZyYW1lX2J1cnkgMgogICAgYnogdGVzdF9hZnRlcl9pZl9lbHNlQDE4CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMgogICAgLy8gYSArPSBiCiAgICBmcmFtZV9kaWcgNAogICAgZnJhbWVfZGlnIDUKICAgICsKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDE4OgogICAgZnJhbWVfZGlnIDIKICAgIGR1cAogICAgZnJhbWVfYnVyeSA0CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozMwogICAgLy8gaWYgYSA8IGIgKyBjOgogICAgZnJhbWVfZGlnIDUKICAgIGZyYW1lX2RpZyA2CiAgICArCiAgICBkaWcgMQogICAgPgogICAgc3dhcAogICAgZnJhbWVfYnVyeSAyCiAgICBieiB0ZXN0X2FmdGVyX2lmX2Vsc2VAMjAKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhID0gYSAqIHoKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgLTEKICAgICoKICAgIGZyYW1lX2J1cnkgMgoKdGVzdF9hZnRlcl9pZl9lbHNlQDIwOgogICAgZnJhbWVfZGlnIDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBheWUgPSBpdG9hKGEpCiAgICBkdXAKICAgIGNhbGxzdWIgaXRvYQogICAgLy8gZGVidWcvY29udHJhY3QucHk6MzcKICAgIC8vIGxvZyhheWUsIGJlZSwgY2VhLCBzZXA9IiAiKQogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAiICIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgbG9nCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTozOQogICAgLy8gcmV0dXJuIGEKICAgIGZyYW1lX2J1cnkgMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kZWJ1Zy5jb250cmFjdC5zb21lX2Z1bmMoYTogdWludDY0LCBiOiB1aW50NjQpIC0+IHVpbnQ2NDoKc29tZV9mdW5jOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDItNDMKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgc29tZV9mdW5jKGE6IFVJbnQ2NCwgYjogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAyIDEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjQ0CiAgICAvLyBhICs9IGIKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICBmcmFtZV9idXJ5IC0yCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0NQogICAgLy8gYiAqPSBhCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMgogICAgKgogICAgZnJhbWVfYnVyeSAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDYKICAgIC8vIGEgKz0gYgogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgICsKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDcKICAgIC8vIGEgKj0gMgogICAgcHVzaGludCAyIC8vIDIKICAgICoKICAgIGR1cAogICAgZnJhbWVfYnVyeSAtMgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NDgKICAgIC8vIHggPSBhICsgYgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo0OQogICAgLy8geSA9IGEgKiBiCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgKgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTAKICAgIC8vIHJldHVybiB4IGlmIHggPCB5IGVsc2UgeQogICAgZHVwMgogICAgPAogICAgc3dhcAogICAgY292ZXIgMgogICAgc2VsZWN0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0Lml0b2EoaTogdWludDY0KSAtPiBieXRlczoKaXRvYToKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjUzLTU0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGl0b2EoaTogVUludDY0KSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTcKICAgIC8vIGlmIGkgPCByYWRpeDoKICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NwogICAgLy8gaWYgaSA8IHJhZGl4OgogICAgPAogICAgYnogaXRvYV9hZnRlcl9pZl9lbHNlQDIKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU4CiAgICAvLyByZXR1cm4gZGlnaXRzW2ldCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1NQogICAgLy8gZGlnaXRzID0gQnl0ZXMoYiIwMTIzNDU2Nzg5IikKICAgIGJ5dGVjXzEgLy8gMHgzMDMxMzIzMzM0MzUzNjM3MzgzOQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTgKICAgIC8vIHJldHVybiBkaWdpdHNbaV0KICAgIGZyYW1lX2RpZyAtMQogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICByZXRzdWIKCml0b2FfYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgIGZyYW1lX2RpZyAtMQogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTYKICAgIC8vIHJhZGl4ID0gZGlnaXRzLmxlbmd0aAogICAgaW50Y18yIC8vIDEwCiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgLwogICAgY2FsbHN1YiBpdG9hCiAgICBmcmFtZV9kaWcgLTEKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU2CiAgICAvLyByYWRpeCA9IGRpZ2l0cy5sZW5ndGgKICAgIGludGNfMiAvLyAxMAogICAgLy8gZGVidWcvY29udHJhY3QucHk6NTkKICAgIC8vIHJldHVybiBpdG9hKGkgLy8gcmFkaXgpICsgZGlnaXRzW2kgJSByYWRpeF0KICAgICUKICAgIGR1cAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIGRlYnVnL2NvbnRyYWN0LnB5OjU1CiAgICAvLyBkaWdpdHMgPSBCeXRlcyhiIjAxMjM0NTY3ODkiKQogICAgYnl0ZWNfMSAvLyAweDMwMzEzMjMzMzQzNTM2MzczODM5CiAgICAvLyBkZWJ1Zy9jb250cmFjdC5weTo1OQogICAgLy8gcmV0dXJuIGl0b2EoaSAvLyByYWRpeCkgKyBkaWdpdHNbaSAlIHJhZGl4XQogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRlYnVnLmNvbnRyYWN0LkRlYnVnQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAQAKASYCASAKMDEyMzQ1Njc4OYgAAUOKAAExG0EAMYAEU1dL/zYaAI4BAAIjiTEZFEQxGEQ2GgEXNhoCFzYaAxeIABkWgAQVH3x1TFCwIokxGUAABjEYFEQiiSOJigMBI0mAAEmL/SULi/2L/ghHAov/C0lOAgxBAAqLBIv+CIwEQgA7iwSLBgxBAAqLBIv/CIwEQgApiwWLBAxBAAqLBIEDC4wEQgAXiwVJiwQNTIwDQQAHiwWLBAiMA4sDjAWLBIsFCIsGDEEADosESYv+iAB8C4wEQgALiwVJi/+IAG4LjAWLBUmIAJOMAIsESU8CCEmMBkmIAISMAUsBDUyMAkEAB4sEiwYIjAKLAkmMBEmLBQxMjAJBAAeLBIsFCIwCiwJJjASLBYsGCEsBDUyMAkEAB4sEi/8LjAKLAkmIADwoUIsAUChQiwFQsIwAiYoCAYv+i/8IjP6L/4v+C4z/i/6L/whJjP6BAgtJjP6L/wiL/ov/C0oMTE4CTYmKAQGL/yQMQQALi/8iCCmL/08CUomL/yQKiP/ki/8kGEkiCClOAlJQiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/debug/puya.log b/test_cases/debug/puya.log index 567c9b84f4..7228313f8e 100644 --- a/test_cases/debug/puya.log +++ b/test_cases/debug/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'A_MULT': 1}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['debug'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'A_MULT': 1}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['debug'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing debug/out/module.awst debug: Sealing block@0: // L12 @@ -1160,6 +1160,7 @@ debug: Found 1 edge set/s for test_cases.debug.contract.itoa debug: test_cases.debug.contract.DebugContract.test f-stack entry: ['bee#0', 'cea#0', 'a#30', 'b#10'] debug: test_cases.debug.contract.DebugContract.test f-stack on first store: ['a#0', 'b#0', 'c#0'] info: Writing debug/out/DebugContract.arc32.json +info: Writing debug/out/DebugContract.arc56.json info: Writing debug/out/DebugContract.approval.teal info: Writing debug/out/DebugContract.clear.teal info: Writing debug/out/DebugContract.approval.bin diff --git a/test_cases/diamond_mro/out/Base1.arc56.json b/test_cases/diamond_mro/out/Base1.arc56.json new file mode 100644 index 0000000000..0ec552fc53 --- /dev/null +++ b/test_cases/diamond_mro/out/Base1.arc56.json @@ -0,0 +1,117 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Base1", + "structs": {}, + "methods": [ + { + "name": "method", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 51, + 63 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 67 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 54 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NgogICAgLy8gY2xhc3MgQmFzZTEoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo2CiAgICAvLyBjbGFzcyBCYXNlMShHUCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxMS0xMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjEzCiAgICAvLyBsb2coImJhc2UxLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImJhc2UxLm1ldGhvZCIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTQKICAgIC8vIHN1cGVyKCkubWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE3CiAgICAvLyBsb2coImdwLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImdwLm1ldGhvZCIKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjgKICAgIC8vIGxvZygiYmFzZTEuX19pbml0X18iKQogICAgcHVzaGJ5dGVzICJiYXNlMS5fX2luaXRfXyIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6OQogICAgLy8gc3VwZXIoKS5fX2luaXRfXygpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X18KICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X18oKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjgKICAgIC8vIGxvZygiZ3AuX19pbml0X18iKQogICAgcHVzaGJ5dGVzICJncC5fX2luaXRfXyIKICAgIGxvZwogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAExGEAAA4gAYYgAAUOKAAExG0EALYICBE8EXYQETFxhujYaAI4CAAIADiKJMRkURDEYRIgADiOJMRkURDEYFEQjiSKJigAAgAxiYXNlMS5tZXRob2SwiAABiYoAAIAJZ3AubWV0aG9ksImKAACADmJhc2UxLl9faW5pdF9fsIgAAYmKAACAC2dwLl9faW5pdF9fsIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/diamond_mro/out/Base2.arc56.json b/test_cases/diamond_mro/out/Base2.arc56.json new file mode 100644 index 0000000000..aa335c026c --- /dev/null +++ b/test_cases/diamond_mro/out/Base2.arc56.json @@ -0,0 +1,117 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Base2", + "structs": {}, + "methods": [ + { + "name": "method", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 51, + 63 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 67 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 54 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NgogICAgLy8gY2xhc3MgQmFzZTIoR1ApOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3CiAgICBwdXNoYnl0ZXNzIDB4NGYwNDVkODQgMHg0YzVjNjFiYSAvLyBtZXRob2QgIm1ldGhvZCgpdm9pZCIsIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo2CiAgICAvLyBjbGFzcyBCYXNlMihHUCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxMS0xMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjEzCiAgICAvLyBsb2coImJhc2UyLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImJhc2UyLm1ldGhvZCIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTQKICAgIC8vIHN1cGVyKCkubWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2QKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5tZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNS0xNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbWV0aG9kKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE3CiAgICAvLyBsb2coImdwLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImdwLm1ldGhvZCIKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjgKICAgIC8vIGxvZygiYmFzZTIuX19pbml0X18iKQogICAgcHVzaGJ5dGVzICJiYXNlMi5fX2luaXRfXyIKICAgIGxvZwogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6OQogICAgLy8gc3VwZXIoKS5fX2luaXRfXygpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X18KICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19pbml0X18oKSAtPiB2b2lkOgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjgKICAgIC8vIGxvZygiZ3AuX19pbml0X18iKQogICAgcHVzaGJ5dGVzICJncC5fX2luaXRfXyIKICAgIGxvZwogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAExGEAAA4gAYYgAAUOKAAExG0EALYICBE8EXYQETFxhujYaAI4CAAIADiKJMRkURDEYRIgADiOJMRkURDEYFEQjiSKJigAAgAxiYXNlMi5tZXRob2SwiAABiYoAAIAJZ3AubWV0aG9ksImKAACADmJhc2UyLl9faW5pdF9fsIgAAYmKAACAC2dwLl9faW5pdF9fsIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/diamond_mro/out/Derived.arc56.json b/test_cases/diamond_mro/out/Derived.arc56.json new file mode 100644 index 0000000000..3e1ff20747 --- /dev/null +++ b/test_cases/diamond_mro/out/Derived.arc56.json @@ -0,0 +1,117 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Derived", + "structs": {}, + "methods": [ + { + "name": "method", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 51, + 63 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 67 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 54 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjcKICAgIC8vIGNsYXNzIERlcml2ZWQoQmFzZTEsIEJhc2UyKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRmMDQ1ZDg0IDB4NGM1YzYxYmEgLy8gbWV0aG9kICJtZXRob2QoKXZvaWQiLCBtZXRob2QgImNyZWF0ZSgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tZXRob2Rfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBtZXRob2QKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAzOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDc6CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjcKICAgIC8vIGNsYXNzIERlcml2ZWQoQmFzZTEsIEJhc2UyKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5tZXRob2QoKSAtPiB2b2lkOgptZXRob2Q6CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjEyLTEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZGVyaXZlZC5weToxNAogICAgLy8gbG9nKCJkZXJpdmVkLm1ldGhvZCIpCiAgICBwdXNoYnl0ZXMgImRlcml2ZWQubWV0aG9kIgogICAgbG9nCiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjE1CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTEuQmFzZTEubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTEucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weToxMwogICAgLy8gbG9nKCJiYXNlMS5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMS5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uYmFzZTIuQmFzZTIubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vYmFzZTIucHk6MTEtMTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weToxMwogICAgLy8gbG9nKCJiYXNlMi5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJiYXNlMi5tZXRob2QiCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjE0CiAgICAvLyBzdXBlcigpLm1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6CnRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AubWV0aG9kOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTUtMTYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIG1ldGhvZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNwogICAgLy8gbG9nKCJncC5tZXRob2QiKQogICAgcHVzaGJ5dGVzICJncC5tZXRob2QiCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZGVyaXZlZC5EZXJpdmVkLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjgKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9kZXJpdmVkLnB5OjkKICAgIC8vIGxvZygiZGVyaXZlZC5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImRlcml2ZWQuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Rlcml2ZWQucHk6MTAKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UxLkJhc2UxLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMS5CYXNlMS5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMS5weTo4CiAgICAvLyBsb2coImJhc2UxLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTEuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UxLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmJhc2UyLkJhc2UyLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5iYXNlMi5CYXNlMi5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9iYXNlMi5weTo4CiAgICAvLyBsb2coImJhc2UyLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiYmFzZTIuX19pbml0X18iCiAgICBsb2cKICAgIC8vIGRpYW1vbmRfbXJvL2Jhc2UyLnB5OjkKICAgIC8vIHN1cGVyKCkuX19pbml0X18oKQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKdGVzdF9jYXNlcy5kaWFtb25kX21yby5ncC5HUC5fX2luaXRfXzoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjcKICAgIC8vIGRlZiBfX2luaXRfXyhzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBkaWFtb25kX21yby9ncC5weTo4CiAgICAvLyBsb2coImdwLl9faW5pdF9fIikKICAgIHB1c2hieXRlcyAiZ3AuX19pbml0X18iCiAgICBsb2cKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmRlcml2ZWQuRGVyaXZlZC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiACAAExGEAAA4gAj4gAAUOKAAExG0EALYICBE8EXYQETFxhujYaAI4CAAIADiKJMRkURDEYRIgADiOJMRkURDEYFEQjiSKJigAAgA5kZXJpdmVkLm1ldGhvZLCIAAGJigAAgAxiYXNlMS5tZXRob2SwiAABiYoAAIAMYmFzZTIubWV0aG9ksIgAAYmKAACACWdwLm1ldGhvZLCJigAAgBBkZXJpdmVkLl9faW5pdF9fsIgAAYmKAACADmJhc2UxLl9faW5pdF9fsIgAAYmKAACADmJhc2UyLl9faW5pdF9fsIgAAYmKAACAC2dwLl9faW5pdF9fsIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/diamond_mro/out/GP.arc56.json b/test_cases/diamond_mro/out/GP.arc56.json new file mode 100644 index 0000000000..37c2aee8da --- /dev/null +++ b/test_cases/diamond_mro/out/GP.arc56.json @@ -0,0 +1,117 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "GP", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "method", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 51, + 61 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 55 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 64 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZGlhbW9uZF9tcm8uZ3AuR1AuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NgogICAgLy8gY2xhc3MgR1AoQVJDNENvbnRyYWN0LCBhYmMuQUJDKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANwogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4NGYwNDVkODQgLy8gbWV0aG9kICJjcmVhdGUoKXZvaWQiLCBtZXRob2QgIm1ldGhvZCgpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX21ldGhvZF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbWV0aG9kX3JvdXRlQDM6CiAgICAvLyBkaWFtb25kX21yby9ncC5weToxNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1ldGhvZAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA3OgogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6NgogICAgLy8gY2xhc3MgR1AoQVJDNENvbnRyYWN0LCBhYmMuQUJDKToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLm1ldGhvZCgpIC0+IHZvaWQ6Cm1ldGhvZDoKICAgIC8vIGRpYW1vbmRfbXJvL2dwLnB5OjE1LTE2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtZXRob2Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6MTcKICAgIC8vIGxvZygiZ3AubWV0aG9kIikKICAgIHB1c2hieXRlcyAiZ3AubWV0aG9kIgogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyBkaWFtb25kX21yby9ncC5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZGlhbW9uZF9tcm8vZ3AucHk6OAogICAgLy8gbG9nKCJncC5fX2luaXRfXyIpCiAgICBwdXNoYnl0ZXMgImdwLl9faW5pdF9fIgogICAgbG9nCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmRpYW1vbmRfbXJvLmdwLkdQLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAExGEAAA4gAS4gAAUOKAAExG0EALYICBExcYboETwRdhDYaAI4CAAIADCKJMRkURDEYFEQjiTEZFEQxGESIAAQjiSKJigAAgAlncC5tZXRob2SwiYoAAIALZ3AuX19pbml0X1+wiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/diamond_mro/puya.log b/test_cases/diamond_mro/puya.log index 85f26ef613..2d7b86bcf5 100644 --- a/test_cases/diamond_mro/puya.log +++ b/test_cases/diamond_mro/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['diamond_mro'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['diamond_mro'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing diamond_mro/out/module.awst debug: Sealing block@0: // L12 @@ -1673,6 +1673,7 @@ debug: Replaced __puya_arc4_router___create_route@3.ops[16]: 'v-load tmp%10#0' w debug: Found 1 edge set/s for test_cases.diamond_mro.derived.Derived.approval_program debug: Found 2 edge set/s for test_cases.diamond_mro.derived.Derived.__puya_arc4_router__ info: Writing diamond_mro/out/GP.arc32.json +info: Writing diamond_mro/out/GP.arc56.json info: Writing diamond_mro/out/GP.approval.teal info: Writing diamond_mro/out/GP.clear.teal info: Writing diamond_mro/out/GP.approval.bin @@ -1680,6 +1681,7 @@ info: Writing diamond_mro/out/GP.clear.bin info: Writing diamond_mro/out/GP.approval.puya.map info: Writing diamond_mro/out/GP.clear.puya.map info: Writing diamond_mro/out/Base2.arc32.json +info: Writing diamond_mro/out/Base2.arc56.json info: Writing diamond_mro/out/Base2.approval.teal info: Writing diamond_mro/out/Base2.clear.teal info: Writing diamond_mro/out/Base2.approval.bin @@ -1687,6 +1689,7 @@ info: Writing diamond_mro/out/Base2.clear.bin info: Writing diamond_mro/out/Base2.approval.puya.map info: Writing diamond_mro/out/Base2.clear.puya.map info: Writing diamond_mro/out/Base1.arc32.json +info: Writing diamond_mro/out/Base1.arc56.json info: Writing diamond_mro/out/Base1.approval.teal info: Writing diamond_mro/out/Base1.clear.teal info: Writing diamond_mro/out/Base1.approval.bin @@ -1694,6 +1697,7 @@ info: Writing diamond_mro/out/Base1.clear.bin info: Writing diamond_mro/out/Base1.approval.puya.map info: Writing diamond_mro/out/Base1.clear.puya.map info: Writing diamond_mro/out/Derived.arc32.json +info: Writing diamond_mro/out/Derived.arc56.json info: Writing diamond_mro/out/Derived.approval.teal info: Writing diamond_mro/out/Derived.clear.teal info: Writing diamond_mro/out/Derived.approval.bin diff --git a/test_cases/dup2_optimization_bug/puya.log b/test_cases/dup2_optimization_bug/puya.log index cd5f0d6773..7c4186da3d 100644 --- a/test_cases/dup2_optimization_bug/puya.log +++ b/test_cases/dup2_optimization_bug/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['dup2_optimization_bug'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['dup2_optimization_bug'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing dup2_optimization_bug/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/edverify/puya.log b/test_cases/edverify/puya.log index 0c6a5b3f88..10b47fc3ab 100644 --- a/test_cases/edverify/puya.log +++ b/test_cases/edverify/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['edverify'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['edverify'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing edverify/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/enumeration/puya.log b/test_cases/enumeration/puya.log index 6002a786ea..1a6a8ac6e6 100644 --- a/test_cases/enumeration/puya.log +++ b/test_cases/enumeration/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['enumeration'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['enumeration'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing enumeration/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/everything/out/MyContract.arc56.json b/test_cases/everything/out/MyContract.arc56.json new file mode 100644 index 0000000000..c68cf49094 --- /dev/null +++ b/test_cases/everything/out/MyContract.arc56.json @@ -0,0 +1,233 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "MyContract", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "register", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp", + "OptIn" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "say_hello", + "args": [], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "calculate", + "args": [ + { + "type": "uint64", + "name": "a" + }, + { + "type": "uint64", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "close_out", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "CloseOut" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 1 + } + }, + "keys": { + "global": { + "counter": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "Y291bnRlcg==" + }, + "creator": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Y3JlYXRvcg==" + } + }, + "local": { + "name": { + "keyType": "AVMString", + "valueType": "string", + "key": "bmFtZQ==" + } + }, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 156 + ], + "errorMessage": "OnCompletion is CloseOut" + }, + { + "pc": [ + 84, + 116, + 132 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 101 + ], + "errorMessage": "OnCompletion is one of NoOp, OptIn" + }, + { + "pc": [ + 189 + ], + "errorMessage": "You are banned, goodbye" + }, + { + "pc": [ + 270, + 406 + ], + "errorMessage": "check self.counter exists" + }, + { + "pc": [ + 88 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 104, + 119, + 135, + 159 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [ + { + "pc": [ + 24 + ], + "errorMessage": "check self.counter exists" + } + ], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDEgMAogICAgYnl0ZWNibG9jayAiY291bnRlciIgIm5hbWUiIDB4MTUxZjdjNzUKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6MzcKICAgIC8vIGNsYXNzIEV2ZXJ5dGhpbmcoQVJDNENvbnRyYWN0LCBNeU1pZGRsZUJhc2UsIG5hbWU9Ik15Q29udHJhY3QiKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHB1c2hieXRlc3MgMHg0YzVjNjFiYSAweGJkNjA5OWU1IDB4NWQ1Yzg0YzcgMHhmZDA3MjY0ZSAweDE2NThhYTJmIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJyZWdpc3RlcihzdHJpbmcpdm9pZCIsIG1ldGhvZCAic2F5X2hlbGxvKClzdHJpbmciLCBtZXRob2QgImNhbGN1bGF0ZSh1aW50NjQsdWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiY2xvc2Vfb3V0KCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fcmVnaXN0ZXJfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zYXlfaGVsbG9fcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxjdWxhdGVfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jbG9zZV9vdXRfcm91dGVANgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDI6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBAYWJpbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGNhbGxzdWIgY3JlYXRlCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZWdpc3Rlcl9yb3V0ZUAzOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0NwogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiTm9PcCIsICJPcHRJbiJdKQogICAgaW50Y18wIC8vIDEKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIHNobAogICAgcHVzaGludCAzIC8vIDMKICAgICYKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgb25lIG9mIE5vT3AsIE9wdEluCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTozNwogICAgLy8gY2xhc3MgRXZlcnl0aGluZyhBUkM0Q29udHJhY3QsIE15TWlkZGxlQmFzZSwgbmFtZT0iTXlDb250cmFjdCIpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0NwogICAgLy8gQGFiaW1ldGhvZChhbGxvd19hY3Rpb25zPVsiTm9PcCIsICJPcHRJbiJdKQogICAgY2FsbHN1YiByZWdpc3RlcgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fc2F5X2hlbGxvX3JvdXRlQDQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU2CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHNheV9oZWxsbwogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsY3VsYXRlX3JvdXRlQDU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjM3CiAgICAvLyBjbGFzcyBFdmVyeXRoaW5nKEFSQzRDb250cmFjdCwgTXlNaWRkbGVCYXNlLCBuYW1lPSJNeUNvbnRyYWN0Iik6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBAYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNhbGN1bGF0ZQogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2xvc2Vfb3V0X3JvdXRlQDY6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY5CiAgICAvLyBAYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJDbG9zZU91dCJdKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgcHVzaGludCAyIC8vIENsb3NlT3V0CiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBDbG9zZU91dAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgY2xvc2Vfb3V0CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEwOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTozNwogICAgLy8gY2xhc3MgRXZlcnl0aGluZyhBUkM0Q29udHJhY3QsIE15TWlkZGxlQmFzZSwgbmFtZT0iTXlDb250cmFjdCIpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNyZWF0ZSgpIC0+IHZvaWQ6CmNyZWF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDEtNDIKICAgIC8vIEBhYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIC8vIGRlZiBjcmVhdGUoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo0MwogICAgLy8gc2VsZi5fY2hlY2tfYmFuX2xpc3QoKQogICAgY2FsbHN1YiBfY2hlY2tfYmFuX2xpc3QKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDQKICAgIC8vIHNlbGYucmVtZW1iZXJfY3JlYXRvcigpCiAgICBjYWxsc3ViIHJlbWVtYmVyX2NyZWF0b3IKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDUKICAgIC8vIHNlbGYuY291bnRlciA9IFVJbnQ2NChaRVJPKQogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIGludGNfMSAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuX2NoZWNrX2Jhbl9saXN0KCkgLT4gdm9pZDoKX2NoZWNrX2Jhbl9saXN0OgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3Ny03OAogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY2hlY2tfYmFuX2xpc3Qoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3OQogICAgLy8gYXNzZXJ0IG9wLlR4bi5zZW5kZXIgIT0gZ2V0X2Jhbm5lZCgpLCAiWW91IGFyZSBiYW5uZWQsIGdvb2RieWUiCiAgICB0eG4gU2VuZGVyCiAgICBjYWxsc3ViIGdldF9iYW5uZWQKICAgICE9CiAgICBhc3NlcnQgLy8gWW91IGFyZSBiYW5uZWQsIGdvb2RieWUKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5nZXRfYmFubmVkKCkgLT4gYnl0ZXM6CmdldF9iYW5uZWQ6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjIzLTI0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGdldF9iYW5uZWQoKSAtPiBBY2NvdW50OgogICAgcHJvdG8gMCAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhZGRyID0gQWNjb3VudChCQU5ORUQpCiAgICBwdXNoYnl0ZXMgYmFzZTMyKFZDTUpLV09ZNVA1UDdTS01aRkZPQ0VST1BKQ1pPVElKTU5JWU5VQ0tIN0xSTzQ1Sk1KUFEpIC8vIGFkZHIgVkNNSktXT1k1UDVQN1NLTVpGRk9DRVJPUEpDWk9USUpNTklZTlVDS0g3TFJPNDVKTUpQNlVZQklKQQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weToyNgogICAgLy8gcmV0dXJuIGFkZHIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5teV9iYXNlLk15QmFzZS5yZW1lbWJlcl9jcmVhdG9yKCkgLT4gdm9pZDoKcmVtZW1iZXJfY3JlYXRvcjoKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weTo3LTgKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgcmVtZW1iZXJfY3JlYXRvcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6OQogICAgLy8gc2VsZi5jcmVhdG9yID0gb3AuVHhuLnNlbmRlcgogICAgcHVzaGJ5dGVzICJjcmVhdG9yIgogICAgdHhuIFNlbmRlcgogICAgYXBwX2dsb2JhbF9wdXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLnJlZ2lzdGVyKG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgpyZWdpc3RlcjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDctNDgKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIk5vT3AiLCAiT3B0SW4iXSkKICAgIC8vIGRlZiByZWdpc3RlcihzZWxmLCBuYW1lOiBTdHJpbmcpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NDkKICAgIC8vIHNlbGYuX2NoZWNrX2Jhbl9saXN0KCkKICAgIGNhbGxzdWIgX2NoZWNrX2Jhbl9saXN0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUwCiAgICAvLyBpZiBvcC5UeG4ub25fY29tcGxldGlvbiA9PSBPbkNvbXBsZXRlQWN0aW9uLk9wdEluOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18wIC8vIE9wdEluCiAgICA9PQogICAgYnogcmVnaXN0ZXJfYWZ0ZXJfaWZfZWxzZUA0CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBzZW5kZXJfbmFtZSwgc2VuZGVyX25hbWVfZXhpc3RlZCA9IHNlbGYubmFtZS5tYXliZShhY2NvdW50PTApCiAgICBpbnRjXzEgLy8gMAogICAgZHVwCiAgICBieXRlY18xIC8vICJuYW1lIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYnVyeSAxCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjUyCiAgICAvLyBpZiBub3Qgc2VuZGVyX25hbWVfZXhpc3RlZDoKICAgIGJueiByZWdpc3Rlcl9hZnRlcl9pZl9lbHNlQDQKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTMKICAgIC8vIHNlbGYuY291bnRlciArPSBtdWx0aXBsaWNhdGl2ZV9pZGVudGl0eSgpICAjIGhhcyBmdWxsIEZ1bmNEZWYKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIG11bHRpcGxpY2F0aXZlX2lkZW50aXR5CiAgICArCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgc3dhcAogICAgYXBwX2dsb2JhbF9wdXQKCnJlZ2lzdGVyX2FmdGVyX2lmX2Vsc2VANDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTQKICAgIC8vIHNlbGYubmFtZVswXSA9IG5hbWUKICAgIGludGNfMSAvLyAwCiAgICBieXRlY18xIC8vICJuYW1lIgogICAgZnJhbWVfZGlnIC0xCiAgICBhcHBfbG9jYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5tdWx0aXBsaWNhdGl2ZV9pZGVudGl0eSgpIC0+IHVpbnQ2NDoKbXVsdGlwbGljYXRpdmVfaWRlbnRpdHk6CiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTgtMTkKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgbXVsdGlwbGljYXRpdmVfaWRlbnRpdHkoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvbXlfYmFzZS5weToyMAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLnNheV9oZWxsbygpIC0+IGJ5dGVzOgpzYXlfaGVsbG86CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjU2LTU3CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgc2F5X2hlbGxvKHNlbGYpIC0+IFN0cmluZzoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo1OAogICAgLy8gc2VsZi5fY2hlY2tfYmFuX2xpc3QoKQogICAgY2FsbHN1YiBfY2hlY2tfYmFuX2xpc3QKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NTkKICAgIC8vIG5hbWUsIGV4aXN0cyA9IHNlbGYubmFtZS5tYXliZShhY2NvdW50PTApCiAgICBpbnRjXzEgLy8gMAogICAgZHVwCiAgICBieXRlY18xIC8vICJuYW1lIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MAogICAgLy8gaWYgbm90IGV4aXN0czoKICAgIGJueiBzYXlfaGVsbG9fYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjYxCiAgICAvLyByZXR1cm4gU3RyaW5nKCJIb3dkeSBzdHJhbmdlciEiKQogICAgcHVzaGJ5dGVzIDB4MDAwZjQ4NmY3NzY0NzkyMDczNzQ3MjYxNmU2NzY1NzIyMQogICAgc3dhcAogICAgcmV0c3ViCgpzYXlfaGVsbG9fYWZ0ZXJfaWZfZWxzZUAyOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2MgogICAgLy8gcmV0dXJuICJIZWxsbywgIiArIG5hbWUgKyAiISIKICAgIGZyYW1lX2RpZyAwCiAgICBleHRyYWN0IDIgMAogICAgcHVzaGJ5dGVzIDB4NDg2NTZjNmM2ZjJjMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgMHgyMQogICAgY29uY2F0CiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuY2FsY3VsYXRlKGE6IGJ5dGVzLCBiOiBieXRlcykgLT4gYnl0ZXM6CmNhbGN1bGF0ZToKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjQtNjUKICAgIC8vIEBhYmltZXRob2QKICAgIC8vIGRlZiBjYWxjdWxhdGUoc2VsZiwgYTogYXJjNF9VSW50NjQsIGI6IGFyYzRfVUludDY0KSAtPiBhcmM0X1VJbnQ2NDoKICAgIHByb3RvIDIgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo2NgogICAgLy8gYyA9IHN1cGVyKCkuY2FsY3VsYXRlKGEsIGIpCiAgICBmcmFtZV9kaWcgLTIKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeU1pZGRsZUJhc2UuY2FsY3VsYXRlCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjY3CiAgICAvLyByZXR1cm4gYXJjNF9VSW50NjQoYy5uYXRpdmUgKiBiLm5hdGl2ZSkKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMQogICAgYnRvaQogICAgKgogICAgaXRvYgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLm15X2Jhc2UuTXlNaWRkbGVCYXNlLmNhbGN1bGF0ZShhOiBieXRlcywgYjogYnl0ZXMpIC0+IGJ5dGVzOgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcubXlfYmFzZS5NeU1pZGRsZUJhc2UuY2FsY3VsYXRlOgogICAgLy8gZXZlcnl0aGluZy9teV9iYXNlLnB5OjEzLTE0CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGNhbGN1bGF0ZShzZWxmLCBhOiBhcmM0LlVJbnQ2NCwgYjogYXJjNC5VSW50NjQpIC0+IGFyYzQuVUludDY0OgogICAgcHJvdG8gMiAxCiAgICAvLyBldmVyeXRoaW5nL215X2Jhc2UucHk6MTUKICAgIC8vIHJldHVybiBhcmM0LlVJbnQ2NChhLm5hdGl2ZSArIGIubmF0aXZlKQogICAgZnJhbWVfZGlnIC0yCiAgICBidG9pCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ0b2kKICAgICsKICAgIGl0b2IKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZXZlcnl0aGluZy5jb250cmFjdC5FdmVyeXRoaW5nLmNsb3NlX291dCgpIC0+IHZvaWQ6CmNsb3NlX291dDoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NjktNzAKICAgIC8vIEBhYmltZXRob2QoYWxsb3dfYWN0aW9ucz1bIkNsb3NlT3V0Il0pCiAgICAvLyBkZWYgY2xvc2Vfb3V0KHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzEKICAgIC8vIHNlbGYuX3JlbW92ZV9zZW5kZXIoKQogICAgY2FsbHN1YiBfcmVtb3ZlX3NlbmRlcgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LkV2ZXJ5dGhpbmcuX3JlbW92ZV9zZW5kZXIoKSAtPiB2b2lkOgpfcmVtb3ZlX3NlbmRlcjoKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODEtODIKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgX3JlbW92ZV9zZW5kZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4MwogICAgLy8gc2VsZi5jb3VudGVyIC09IHBvc2l0aXZlX29uZSgpCiAgICBpbnRjXzEgLy8gMAogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5jb3VudGVyIGV4aXN0cwogICAgY2FsbHN1YiBwb3NpdGl2ZV9vbmUKICAgIC0KICAgIGJ5dGVjXzAgLy8gImNvdW50ZXIiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ldmVyeXRoaW5nLmNvbnRyYWN0LnBvc2l0aXZlX29uZSgpIC0+IHVpbnQ2NDoKcG9zaXRpdmVfb25lOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4Ni04NwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBwb3NpdGl2ZV9vbmUoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6ODgKICAgIC8vIHJldHVybiBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgYnl0ZWNibG9jayAiY291bnRlciIKICAgIC8vIGV2ZXJ5dGhpbmcvY29udHJhY3QucHk6NzQKICAgIC8vIHNlbGYuX3JlbW92ZV9zZW5kZXIoKQogICAgY2FsbHN1YiBfcmVtb3ZlX3NlbmRlcgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo3NQogICAgLy8gcmV0dXJuIFRydWUKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QuRXZlcnl0aGluZy5fcmVtb3ZlX3NlbmRlcigpIC0+IHZvaWQ6Cl9yZW1vdmVfc2VuZGVyOgogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4MS04MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfcmVtb3ZlX3NlbmRlcihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5OjgzCiAgICAvLyBzZWxmLmNvdW50ZXIgLT0gcG9zaXRpdmVfb25lKCkKICAgIHB1c2hpbnQgMCAvLyAwCiAgICBieXRlY18wIC8vICJjb3VudGVyIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmNvdW50ZXIgZXhpc3RzCiAgICBjYWxsc3ViIHBvc2l0aXZlX29uZQogICAgLQogICAgYnl0ZWNfMCAvLyAiY291bnRlciIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmV2ZXJ5dGhpbmcuY29udHJhY3QucG9zaXRpdmVfb25lKCkgLT4gdWludDY0Ogpwb3NpdGl2ZV9vbmU6CiAgICAvLyBldmVyeXRoaW5nL2NvbnRyYWN0LnB5Ojg2LTg3CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHBvc2l0aXZlX29uZSgpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gZXZlcnl0aGluZy9jb250cmFjdC5weTo4OAogICAgLy8gcmV0dXJuIFVJbnQ2NCgxKQogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHN1Ygo=" + }, + "byteCode": { + "approval": "CiACAQAmAwdjb3VudGVyBG5hbWUEFR98dYgAAUOKAAExG0EAgIIFBExcYboEvWCZ5QRdXITHBP0HJk4EFliqLzYaAI4FAAIADwAiADIASCOJMRkURDEYFESIAEsiiSIxGZCBAxpEMRhENhoBiACGIokxGRREMRhEiACmKkxQsCKJMRkURDEYRDYaATYaAogA2ypMULAiiTEZgQISRDEYRIgA5iKJI4mKAACIAAeIADUoI2eJigAAMQCIAAMTRImKAAGAIKiYlVnY6/r/yUzJSuESLnpFl00JY1GG0Eo/1xdzqWJfiYoAAIAHY3JlYXRvcjEAZ4mKAQCI/7kxGSISQQAUI0kpY0UBQAALIyhlRIgACggoTGcjKYv/ZomKAAEiiYoAAYj/jSNJKWNAABWAEQAPSG93ZHkgc3RyYW5nZXIhTImLAFcCAIAHSGVsbG8sIExQSRUWVwYCTFBXAgCAASFQSRUWVwYCTFBMiYoCAYv+i/+IAAcXi/8XCxaJigIBi/4Xi/8XCBaJigAAiAABiYoAACMoZUSIAAUJKExniYoAASKJ", + "clear": "CiYBB2NvdW50ZXKIAAOBAUOKAACBAChlRIgABQkoTGeJigABgQGJ" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/everything/puya.log b/test_cases/everything/puya.log index 019341b688..f60b153b3e 100644 --- a/test_cases/everything/puya.log +++ b/test_cases/everything/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['everything'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['everything'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing everything/out/module.awst debug: Sealing block@0: // L12 @@ -1911,6 +1911,7 @@ debug: Replaced _remove_sender_block@0.ops[17]: 'v-load new_state_value%0#0' wit debug: Inserted _remove_sender_block@0.ops[5]: 'l-store-copy maybe_value%0#0 1' debug: Replaced _remove_sender_block@0.ops[12]: 'v-load maybe_value%0#0' with 'l-load maybe_value%0#0' info: Writing everything/out/MyContract.arc32.json +info: Writing everything/out/MyContract.arc56.json info: Writing everything/out/MyContract.approval.teal info: Writing everything/out/MyContract.clear.teal info: Writing everything/out/MyContract.approval.bin diff --git a/test_cases/group_side_effects/out/AppCall.arc56.json b/test_cases/group_side_effects/out/AppCall.arc56.json new file mode 100644 index 0000000000..cc3be88cde --- /dev/null +++ b/test_cases/group_side_effects/out/AppCall.arc56.json @@ -0,0 +1,102 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "AppCall", + "structs": {}, + "methods": [ + { + "name": "some_value", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 35 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 62 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 38 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5vdGhlci5BcHBDYWxsLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5vdGhlci5BcHBDYWxsLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo0CiAgICAvLyBjbGFzcyBBcHBDYWxsKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4ZDM0NzllNjUgLy8gbWV0aG9kICJzb21lX3ZhbHVlKCl1aW50NjQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19zb21lX3ZhbHVlX3JvdXRlQDIKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3NvbWVfdmFsdWVfcm91dGVAMjoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBzb21lX3ZhbHVlCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL290aGVyLnB5OjQKICAgIC8vIGNsYXNzIEFwcENhbGwoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9vdGhlci5weTo0CiAgICAvLyBjbGFzcyBBcHBDYWxsKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMub3RoZXIuQXBwQ2FsbC5zb21lX3ZhbHVlKCkgLT4gdWludDY0Ogpzb21lX3ZhbHVlOgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL290aGVyLnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBzb21lX3ZhbHVlKHNlbGYpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDAgMQogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL290aGVyLnB5OjcKICAgIC8vIHJldHVybiBHbG9iYWwuZ3JvdXBfc2l6ZSAqIChUeG4uZ3JvdXBfaW5kZXggKyAxKQogICAgZ2xvYmFsIEdyb3VwU2l6ZQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICArCiAgICAqCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5vdGhlci5BcHBDYWxsLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAQCIAAFDigABMRtBACWABNNHnmU2GgCOAQACI4kxGRREMRhEiAAZFoAEFR98dUxQsCKJMRlAAAYxGBREIokjiYoAATIEMRYiCAuJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/group_side_effects/out/AppExpectingEffects.arc56.json b/test_cases/group_side_effects/out/AppExpectingEffects.arc56.json new file mode 100644 index 0000000000..cb39843569 --- /dev/null +++ b/test_cases/group_side_effects/out/AppExpectingEffects.arc56.json @@ -0,0 +1,189 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "AppExpectingEffects", + "structs": {}, + "methods": [ + { + "name": "create_group", + "args": [ + { + "type": "acfg", + "name": "asset_create" + }, + { + "type": "appl", + "name": "app_create" + } + ], + "returns": { + "type": "(uint64,uint64)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log_group", + "args": [ + { + "type": "appl", + "name": "app_call" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 197 + ], + "errorMessage": "ARC4 prefix is valid" + }, + { + "pc": [ + 51, + 94 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 149 + ], + "errorMessage": "expected app created" + }, + { + "pc": [ + 134 + ], + "errorMessage": "expected asset created" + }, + { + "pc": [ + 158 + ], + "errorMessage": "expected correct app id" + }, + { + "pc": [ + 143 + ], + "errorMessage": "expected correct asset id" + }, + { + "pc": [ + 175 + ], + "errorMessage": "expected correct method called" + }, + { + "pc": [ + 182 + ], + "errorMessage": "expected logs" + }, + { + "pc": [ + 121 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 54, + 97 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 66 + ], + "errorMessage": "transaction type is acfg" + }, + { + "pc": [ + 76, + 107 + ], + "errorMessage": "transaction type is appl" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDYKICAgIGJ5dGVjYmxvY2sgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHg2ZDNhMDQzOSAweDYyYTBlZjYyIC8vIG1ldGhvZCAiY3JlYXRlX2dyb3VwKGFjZmcsYXBwbCkodWludDY0LHVpbnQ2NCkiLCBtZXRob2QgImxvZ19ncm91cChhcHBsKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfZ3JvdXBfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfZ3JvdXBfcm91dGVAMwogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX2dyb3VwX3JvdXRlQDI6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIHB1c2hpbnQgMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFjZmcKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNyZWF0ZV9ncm91cAogICAgc3dhcAogICAgaXRvYgogICAgc3dhcAogICAgaXRvYgogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfZ3JvdXBfcm91dGVAMzoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzIgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGxvZ19ncm91cAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQXBwRXhwZWN0aW5nRWZmZWN0cyhBUkM0Q29udHJhY3QpOgogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuZ3JvdXBfc2lkZV9lZmZlY3RzLmNvbnRyYWN0LkFwcEV4cGVjdGluZ0VmZmVjdHMuY3JlYXRlX2dyb3VwKGFzc2V0X2NyZWF0ZTogdWludDY0LCBhcHBfY3JlYXRlOiB1aW50NjQpIC0+IHVpbnQ2NCwgdWludDY0OgpjcmVhdGVfZ3JvdXA6CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6NS0xMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY3JlYXRlX2dyb3VwKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgYXNzZXRfY3JlYXRlOiBndHhuLkFzc2V0Q29uZmlnVHJhbnNhY3Rpb24sCiAgICAvLyAgICAgYXBwX2NyZWF0ZTogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbiwKICAgIC8vICkgLT4gdHVwbGVbVUludDY0LCBVSW50NjRdOgogICAgcHJvdG8gMiAyCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTEKICAgIC8vIGFzc2VydCBhc3NldF9jcmVhdGUuY3JlYXRlZF9hc3NldC5pZCwgImV4cGVjdGVkIGFzc2V0IGNyZWF0ZWQiCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBjcmVhdGVkCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTMKICAgIC8vIG9wLmdhaWQoYXNzZXRfY3JlYXRlLmdyb3VwX2luZGV4KSA9PSBhc3NldF9jcmVhdGUuY3JlYXRlZF9hc3NldC5pZAogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBHcm91cEluZGV4CiAgICBnYWlkcwogICAgZGlnIDEKICAgID09CiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTItMTQKICAgIC8vIGFzc2VydCAoCiAgICAvLyAgICAgb3AuZ2FpZChhc3NldF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFzc2V0X2NyZWF0ZS5jcmVhdGVkX2Fzc2V0LmlkCiAgICAvLyApLCAiZXhwZWN0ZWQgY29ycmVjdCBhc3NldCBpZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IGFzc2V0IGlkCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MTUKICAgIC8vIGFzc2VydCBhcHBfY3JlYXRlLmNyZWF0ZWRfYXBwLmlkLCAiZXhwZWN0ZWQgYXBwIGNyZWF0ZWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENyZWF0ZWRBcHBsaWNhdGlvbklECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhcHAgY3JlYXRlZAogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjE3CiAgICAvLyBvcC5nYWlkKGFwcF9jcmVhdGUuZ3JvdXBfaW5kZXgpID09IGFwcF9jcmVhdGUuY3JlYXRlZF9hcHAuaWQKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZ2FpZHMKICAgIGRpZyAxCiAgICA9PQogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjE2LTE4CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIG9wLmdhaWQoYXBwX2NyZWF0ZS5ncm91cF9pbmRleCkgPT0gYXBwX2NyZWF0ZS5jcmVhdGVkX2FwcC5pZAogICAgLy8gKSwgImV4cGVjdGVkIGNvcnJlY3QgYXBwIGlkIgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGNvcnJlY3QgYXBwIGlkCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MjAKICAgIC8vIHJldHVybiBhc3NldF9jcmVhdGUuY3JlYXRlZF9hc3NldC5pZCwgYXBwX2NyZWF0ZS5jcmVhdGVkX2FwcC5pZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5ncm91cF9zaWRlX2VmZmVjdHMuY29udHJhY3QuQXBwRXhwZWN0aW5nRWZmZWN0cy5sb2dfZ3JvdXAoYXBwX2NhbGw6IHVpbnQ2NCkgLT4gdm9pZDoKbG9nX2dyb3VwOgogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjIyLTIzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBsb2dfZ3JvdXAoc2VsZiwgYXBwX2NhbGw6IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyNAogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLmFwcF9hcmdzKDApID09IGFyYzQuYXJjNF9zaWduYXR1cmUoCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIEFwcGxpY2F0aW9uQXJncwogICAgLy8gZ3JvdXBfc2lkZV9lZmZlY3RzL2NvbnRyYWN0LnB5OjI0LTI2CiAgICAvLyBhc3NlcnQgYXBwX2NhbGwuYXBwX2FyZ3MoMCkgPT0gYXJjNC5hcmM0X3NpZ25hdHVyZSgKICAgIC8vICAgICAic29tZV92YWx1ZSgpdWludDY0IgogICAgLy8gKSwgImV4cGVjdGVkIGNvcnJlY3QgbWV0aG9kIGNhbGxlZCIKICAgIHB1c2hieXRlcyAweGQzNDc5ZTY1IC8vIG1ldGhvZCAic29tZV92YWx1ZSgpdWludDY0IgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBjb3JyZWN0IG1ldGhvZCBjYWxsZWQKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyNwogICAgLy8gYXNzZXJ0IGFwcF9jYWxsLm51bV9sb2dzID09IDEsICJleHBlY3RlZCBsb2dzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1Mb2dzCiAgICBpbnRjXzAgLy8gMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBsb2dzCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MjkKICAgIC8vIGFyYzQuVUludDY0LmZyb21fbG9nKGFwcF9jYWxsLmxhc3RfbG9nKQogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBncm91cF9zaWRlX2VmZmVjdHMvY29udHJhY3QucHk6MzAKICAgIC8vID09IChhcHBfY2FsbC5ncm91cF9pbmRleCArIDEpICogR2xvYmFsLmdyb3VwX3NpemUKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgICsKICAgIGdsb2JhbCBHcm91cFNpemUKICAgICoKICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyOS0zMAogICAgLy8gYXJjNC5VSW50NjQuZnJvbV9sb2coYXBwX2NhbGwubGFzdF9sb2cpCiAgICAvLyA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICBpdG9iCiAgICBiPT0KICAgIC8vIGdyb3VwX3NpZGVfZWZmZWN0cy9jb250cmFjdC5weToyOC0zMQogICAgLy8gYXNzZXJ0ICgKICAgIC8vICAgICBhcmM0LlVJbnQ2NC5mcm9tX2xvZyhhcHBfY2FsbC5sYXN0X2xvZykKICAgIC8vICAgICA9PSAoYXBwX2NhbGwuZ3JvdXBfaW5kZXggKyAxKSAqIEdsb2JhbC5ncm91cF9zaXplCiAgICAvLyApCiAgICBhc3NlcnQKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmdyb3VwX3NpZGVfZWZmZWN0cy5jb250cmFjdC5BcHBFeHBlY3RpbmdFZmZlY3RzLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiADAQAGJgEEFR98dYgAAUOKAAExG0EAWIICBG06BDkEYqDvYjYaAI4CAAIALSOJMRkURDEYRDEWgQIJSTgQgQMSRDEWIglJOBAkEkSIAC5MFkwWUChMULAiiTEZFEQxGEQxFiIJSTgQJBJEiAAxIokxGUAABjEYFEQiiSOJigICi/44PElEi/44Fj1LARJEi/84PUlEi/84Fj1LARJEiYoBAIv/I8IagATTR55lEkSL/zg7IhJEi/84PklXBABMVwAEKBJEi/84FiIIMgQLFqhEiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/group_side_effects/puya.log b/test_cases/group_side_effects/puya.log index 5ec8600439..c85baab6e8 100644 --- a/test_cases/group_side_effects/puya.log +++ b/test_cases/group_side_effects/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['group_side_effects'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['group_side_effects'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing group_side_effects/out/module.awst debug: Sealing block@0: // L12 @@ -1018,6 +1018,7 @@ debug: Inserted log_group_block@0.ops[30]: 'l-store-copy tmp%4#0 1' debug: Replaced log_group_block@0.ops[64]: 'v-load tmp%4#0' with 'l-load tmp%4#0' debug: Found 3 edge set/s for test_cases.group_side_effects.contract.AppExpectingEffects.__puya_arc4_router__ info: Writing group_side_effects/out/AppCall.arc32.json +info: Writing group_side_effects/out/AppCall.arc56.json info: Writing group_side_effects/out/AppCall.approval.teal info: Writing group_side_effects/out/AppCall.clear.teal info: Writing group_side_effects/out/AppCall.approval.bin @@ -1025,6 +1026,7 @@ info: Writing group_side_effects/out/AppCall.clear.bin info: Writing group_side_effects/out/AppCall.approval.puya.map info: Writing group_side_effects/out/AppCall.clear.puya.map info: Writing group_side_effects/out/AppExpectingEffects.arc32.json +info: Writing group_side_effects/out/AppExpectingEffects.arc56.json info: Writing group_side_effects/out/AppExpectingEffects.approval.teal info: Writing group_side_effects/out/AppExpectingEffects.clear.teal info: Writing group_side_effects/out/AppExpectingEffects.approval.bin diff --git a/test_cases/inheritance/puya.log b/test_cases/inheritance/puya.log index 256ce34449..386d4086b0 100644 --- a/test_cases/inheritance/puya.log +++ b/test_cases/inheritance/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inheritance'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inheritance'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing inheritance/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/inner_transactions/out/ArrayAccessContract.arc56.json b/test_cases/inner_transactions/out/ArrayAccessContract.arc56.json new file mode 100644 index 0000000000..cf261cd3a9 --- /dev/null +++ b/test_cases/inner_transactions/out/ArrayAccessContract.arc56.json @@ -0,0 +1,127 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "ArrayAccessContract", + "structs": {}, + "methods": [ + { + "name": "test_branching_array_call", + "args": [ + { + "type": "bool", + "name": "maybe" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 48 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 169, + 184 + ], + "errorMessage": "correct args used 1" + }, + { + "pc": [ + 175, + 192 + ], + "errorMessage": "correct args used 2" + }, + { + "pc": [ + 200 + ], + "errorMessage": "correct args used 3" + }, + { + "pc": [ + 68 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 51 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hcnJheV9hY2Nlc3MuQXJyYXlBY2Nlc3NDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSA2CiAgICBieXRlY2Jsb2NrIDB4MDk4MTAxIDB4MzEgMHgzMiAweDMzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hcnJheV9hY2Nlc3MuQXJyYXlBY2Nlc3NDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4ODlhODIyMGEgLy8gbWV0aG9kICJ0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsKGJvb2wpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfcm91dGVAMgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9yb3V0ZUAyOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDU6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIwCiAgICAvLyBjbGFzcyBBcnJheUFjY2Vzc0NvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYXJyYXlfYWNjZXNzLkFycmF5QWNjZXNzQ29udHJhY3QudGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbChtYXliZTogYnl0ZXMpIC0+IHZvaWQ6CnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGw6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjIxLTIyCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsKHNlbGYsIG1heWJlOiBhcmM0LkJvb2wpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjMKICAgIC8vIGlmIG1heWJlOgogICAgZnJhbWVfZGlnIC0xCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgIT0KICAgIGR1cAogICAgYnogdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlAMwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyNC0yOAogICAgLy8gY3JlYXRlX2FwcF90eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgYXBwX2FyZ3M9KEJ5dGVzKGIiMSIpLCBCeXRlcyhiIjIiKSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjI3CiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIxIiksIEJ5dGVzKGIiMiIpKSwKICAgIGJ5dGVjXzEgLy8gMHgzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjXzIgLy8gMHgzMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjYKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MjUKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjI0CiAgICAvLyBjcmVhdGVfYXBwX3R4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weToyNC0yOAogICAgLy8gY3JlYXRlX2FwcF90eG4gPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgYXBwX2FyZ3M9KEJ5dGVzKGIiMSIpLCBCeXRlcyhiIjIiKSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgYiB0ZXN0X2JyYW5jaGluZ19hcnJheV9jYWxsX2FmdGVyX2lmX2Vsc2VANQoKdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlAMzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MzAtMzUKICAgIC8vIGNyZWF0ZV9hcHBfdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgLy8gICAgIGFwcF9hcmdzPShCeXRlcyhiIjMiKSwgQnl0ZXMoYiI0IiksIEJ5dGVzKGIiNSIpKSwKICAgIC8vICAgICBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjM0CiAgICAvLyBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICBwdXNoYnl0ZXMgMHg2NDY5NjY2NjY1NzI2NTZlNzQyMDcwNjE3MjYxNmQyMDczNjU3NAogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjMzCiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIzIiksIEJ5dGVzKGIiNCIpLCBCeXRlcyhiIjUiKSksCiAgICBieXRlY18zIC8vIDB4MzMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgzNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDM1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozMgogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozMQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6MzAKICAgIC8vIGNyZWF0ZV9hcHBfdHhuID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjMwLTM1CiAgICAvLyBjcmVhdGVfYXBwX3R4biA9IGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICAvLyAgICAgY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIC8vICAgICBhcHBfYXJncz0oQnl0ZXMoYiIzIiksIEJ5dGVzKGIiNCIpLCBCeXRlcyhiIjUiKSksCiAgICAvLyAgICAgbm90ZT1iImRpZmZlcmVudCBwYXJhbSBzZXQiLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKCnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfYWZ0ZXJfaWZfZWxzZUA1OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozNgogICAgLy8gaWYgbWF5YmU6CiAgICBmcmFtZV9kaWcgMAogICAgYnogdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9lbHNlX2JvZHlANwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2FycmF5X2FjY2Vzcy5weTozNwogICAgLy8gYXNzZXJ0IGNyZWF0ZV9hcHBfdHhuLmFwcF9hcmdzKDApID09IGIiMSIsICJjb3JyZWN0IGFyZ3MgdXNlZCAxIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzEgLy8gMHgzMQogICAgPT0KICAgIGFzc2VydCAvLyBjb3JyZWN0IGFyZ3MgdXNlZCAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjM4CiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMSkgPT0gYiIyIiwgImNvcnJlY3QgYXJncyB1c2VkIDIiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWNfMiAvLyAweDMyCiAgICA9PQogICAgYXNzZXJ0IC8vIGNvcnJlY3QgYXJncyB1c2VkIDIKICAgIGIgdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9hZnRlcl9pZl9lbHNlQDgKCnRlc3RfYnJhbmNoaW5nX2FycmF5X2NhbGxfZWxzZV9ib2R5QDc6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjQwCiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMCkgPT0gYiIzIiwgImNvcnJlY3QgYXJncyB1c2VkIDEiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWNfMyAvLyAweDMzCiAgICA9PQogICAgYXNzZXJ0IC8vIGNvcnJlY3QgYXJncyB1c2VkIDEKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hcnJheV9hY2Nlc3MucHk6NDEKICAgIC8vIGFzc2VydCBjcmVhdGVfYXBwX3R4bi5hcHBfYXJncygxKSA9PSBiIjQiLCAiY29ycmVjdCBhcmdzIHVzZWQgMiIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBwdXNoYnl0ZXMgMHgzNAogICAgPT0KICAgIGFzc2VydCAvLyBjb3JyZWN0IGFyZ3MgdXNlZCAyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXJyYXlfYWNjZXNzLnB5OjQyCiAgICAvLyBhc3NlcnQgY3JlYXRlX2FwcF90eG4uYXBwX2FyZ3MoMikgPT0gYiI1IiwgImNvcnJlY3QgYXJncyB1c2VkIDMiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgcHVzaGJ5dGVzIDB4MzUKICAgID09CiAgICBhc3NlcnQgLy8gY29ycmVjdCBhcmdzIHVzZWQgMwoKdGVzdF9icmFuY2hpbmdfYXJyYXlfY2FsbF9hZnRlcl9pZl9lbHNlQDg6CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hcnJheV9hY2Nlc3MuQXJyYXlBY2Nlc3NDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiADAAEGJgQDCYEBATEBMgEziAABQ4oAATEbQQAegASJqCIKNhoAjgEAAiKJMRkURDEYRDYaAYgADyOJMRlAAAYxGBREI4kiiYoBAIv/gAEAE0lBABexKbIaKrIaKLJCKLJAJLIQIrIBs0IAMrGAE2RpZmZlcmVudCBwYXJhbSBzZXSyBSuyGoABNLIagAE1shooskIoskAkshAisgGziwBBAA+1GgApEkS1GgEqEkRCABa1GgArEkS1GgGAATQSRLUaAoABNRJEiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/inner_transactions/out/CreateAndTransferContract.arc56.json b/test_cases/inner_transactions/out/CreateAndTransferContract.arc56.json new file mode 100644 index 0000000000..75894b5707 --- /dev/null +++ b/test_cases/inner_transactions/out/CreateAndTransferContract.arc56.json @@ -0,0 +1,108 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "CreateAndTransferContract", + "structs": {}, + "methods": [ + { + "name": "create_and_transfer", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 37 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 105 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 54 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 40 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hc3NldF90cmFuc2Zlci5DcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDEwMDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmFzc2V0X3RyYW5zZmVyLkNyZWF0ZUFuZFRyYW5zZmVyQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjEwCiAgICAvLyBjbGFzcyBDcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANQogICAgcHVzaGJ5dGVzIDB4NDhlOWVkN2MgLy8gbWV0aG9kICJjcmVhdGVfYW5kX3RyYW5zZmVyKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX2FuZF90cmFuc2Zlcl9yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfYW5kX3RyYW5zZmVyX3JvdXRlQDI6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGNyZWF0ZV9hbmRfdHJhbnNmZXIKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjEwCiAgICAvLyBjbGFzcyBDcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUA5CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDk6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTAKICAgIC8vIGNsYXNzIENyZWF0ZUFuZFRyYW5zZmVyQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hc3NldF90cmFuc2Zlci5DcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0LmNyZWF0ZV9hbmRfdHJhbnNmZXIoKSAtPiB2b2lkOgpjcmVhdGVfYW5kX3RyYW5zZmVyOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjExLTEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGNyZWF0ZV9hbmRfdHJhbnNmZXIoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE1LTIzCiAgICAvLyBpdHhuLkFzc2V0Q29uZmlnKAogICAgLy8gICAgIHRvdGFsPTEwMDAsCiAgICAvLyAgICAgYXNzZXRfbmFtZT0idGVzdCIsCiAgICAvLyAgICAgdW5pdF9uYW1lPSJUU1QiLAogICAgLy8gICAgIGRlY2ltYWxzPTAsCiAgICAvLyAgICAgbWFuYWdlcj1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gICAgIGNsYXdiYWNrPW9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToyMAogICAgLy8gbWFuYWdlcj1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgZ2xvYmFsIEN1cnJlbnRBcHBsaWNhdGlvbkFkZHJlc3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToyMQogICAgLy8gY2xhd2JhY2s9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGR1cAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldENsYXdiYWNrCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE5CiAgICAvLyBkZWNpbWFscz0wLAogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXREZWNpbWFscwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE4CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBwdXNoYnl0ZXMgIlRTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjE3CiAgICAvLyBhc3NldF9uYW1lPSJ0ZXN0IiwKICAgIHB1c2hieXRlcyAidGVzdCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTYKICAgIC8vIHRvdGFsPTEwMDAsCiAgICBpbnRjXzIgLy8gMTAwMAogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTUKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICBwdXNoaW50IDMgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MTUtMjMKICAgIC8vIGl0eG4uQXNzZXRDb25maWcoCiAgICAvLyAgICAgdG90YWw9MTAwMCwKICAgIC8vICAgICBhc3NldF9uYW1lPSJ0ZXN0IiwKICAgIC8vICAgICB1bml0X25hbWU9IlRTVCIsCiAgICAvLyAgICAgZGVjaW1hbHM9MCwKICAgIC8vICAgICBtYW5hZ2VyPW9wLkdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgY2xhd2JhY2s9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICkKICAgIC8vIC5zdWJtaXQoKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weToxNS0yNAogICAgLy8gaXR4bi5Bc3NldENvbmZpZygKICAgIC8vICAgICB0b3RhbD0xMDAwLAogICAgLy8gICAgIGFzc2V0X25hbWU9InRlc3QiLAogICAgLy8gICAgIHVuaXRfbmFtZT0iVFNUIiwKICAgIC8vICAgICBkZWNpbWFscz0wLAogICAgLy8gICAgIG1hbmFnZXI9b3AuR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBjbGF3YmFjaz1vcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hc3NldAogICAgaXR4biBDcmVhdGVkQXNzZXRJRAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTMzCiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPW5ld19hc3NldC5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTEwMDAsCiAgICAvLyAgICAgeGZlcl9hc3NldD1uZXdfYXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MjkKICAgIC8vIGFzc2V0X3NlbmRlcj1uZXdfYXNzZXQuY3JlYXRvciwKICAgIGR1cAogICAgYXNzZXRfcGFyYW1zX2dldCBBc3NldENyZWF0b3IKICAgIGFzc2VydCAvLyBhc3NldCBleGlzdHMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9hc3NldF90cmFuc2Zlci5weTozMAogICAgLy8gYXNzZXRfcmVjZWl2ZXI9R2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIGdsb2JhbCBDdXJyZW50QXBwbGljYXRpb25BZGRyZXNzCiAgICB1bmNvdmVyIDIKICAgIGl0eG5fZmllbGQgWGZlckFzc2V0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYXNzZXRfdHJhbnNmZXIucHk6MzEKICAgIC8vIGFzc2V0X2Ftb3VudD0xMDAwLAogICAgaW50Y18yIC8vIDEwMDAKICAgIGl0eG5fZmllbGQgQXNzZXRBbW91bnQKICAgIGl0eG5fZmllbGQgQXNzZXRSZWNlaXZlcgogICAgaXR4bl9maWVsZCBBc3NldFNlbmRlcgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTI4CiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2Fzc2V0X3RyYW5zZmVyLnB5OjI3LTMzCiAgICAvLyAjIHRyYW5zZmVyCiAgICAvLyBpdHhuLkFzc2V0VHJhbnNmZXIoCiAgICAvLyAgICAgYXNzZXRfc2VuZGVyPW5ld19hc3NldC5jcmVhdG9yLAogICAgLy8gICAgIGFzc2V0X3JlY2VpdmVyPUdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXNzZXRfYW1vdW50PTEwMDAsCiAgICAvLyAgICAgeGZlcl9hc3NldD1uZXdfYXNzZXQsCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5hc3NldF90cmFuc2Zlci5DcmVhdGVBbmRUcmFuc2ZlckNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiADAAHoB4gAAUOKAAExG0EAG4AESOntfDYaAI4BAAIiiTEZFEQxGESIAA8jiTEZQAAGMRgURCOJIomKAACxMgpJsiyyKSKyI4ADVFNUsiWABHRlc3SyJiSyIoEDshAisgGztDyxSXELRDIKTwKyESSyErIUshOBBLIQIrIBs4k=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/inner_transactions/out/FieldTupleContract.arc56.json b/test_cases/inner_transactions/out/FieldTupleContract.arc56.json new file mode 100644 index 0000000000..4022c69f89 --- /dev/null +++ b/test_cases/inner_transactions/out/FieldTupleContract.arc56.json @@ -0,0 +1,120 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "FieldTupleContract", + "structs": {}, + "methods": [ + { + "name": "test_assign_tuple", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_assign_tuple_mixed", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 128, + 140 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 157 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 131, + 143 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgNSA2IDEKICAgIGJ5dGVjYmxvY2sgMHgwOTgxMDEgMHgzMTYxIDB4MzI2MSAweDY0Njk2NjY2NjU3MjY1NmU3NDIwNzA2MTcyNjE2ZDIwNzM2NTc0IDB4Njg2NTZjNmM2ZiAweDc3NmY3MjZjNjQgMHgzMzYxIDB4MzQ2MSAweDM1NjEgMHgzMzYyIDB4MzQ2MiAweDM1NjIgMHgzMTYyIDB4MzI2MiAweDMxNjMgMHgzMjYzIDB4MzM2MyAweDM0NjMgMHgzNTYzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNAogICAgLy8gY2xhc3MgRmllbGRUdXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDFjYTJjMDdlIDB4ZWM2Y2QwYTggLy8gbWV0aG9kICJ0ZXN0X2Fzc2lnbl90dXBsZSgpdm9pZCIsIG1ldGhvZCAidGVzdF9hc3NpZ25fdHVwbGVfbWl4ZWQoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2Fzc2lnbl90dXBsZV9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXNzaWduX3R1cGxlX21peGVkX3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfYXNzaWduX3R1cGxlX3JvdXRlQDI6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYXNzaWduX3R1cGxlCiAgICBpbnRjXzMgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2Fzc2lnbl90dXBsZV9taXhlZF9yb3V0ZUAzOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6ODUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiB0ZXN0X2Fzc2lnbl90dXBsZV9taXhlZAogICAgaW50Y18zIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyNAogICAgLy8gY2xhc3MgRmllbGRUdXBsZUNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18zIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjI0CiAgICAvLyBjbGFzcyBGaWVsZFR1cGxlQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC50ZXN0X2Fzc2lnbl90dXBsZSgpIC0+IHZvaWQ6CnRlc3RfYXNzaWduX3R1cGxlOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjUtMjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfYXNzaWduX3R1cGxlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjM4CiAgICAvLyBVSW50NjQoNDIpLAogICAgcHVzaGludCA0MiAvLyA0MgogICAgaXRvYgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzkKICAgIC8vIFRydWUsCiAgICBpbnRjXzMgLy8gMQogICAgaXRvYgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTAKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMF0sIGNyZWF0ZV90eG5zWzFdKQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzMKICAgIC8vIEJ5dGVzKGIiMWEiKSwKICAgIGJ5dGVjXzEgLy8gMHgzMTYxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzQKICAgIC8vIEJ5dGVzKGIiMmEiKSwKICAgIGJ5dGVjXzIgLy8gMHgzMjYxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzUKICAgIC8vIGIiaGVsbG8iLAogICAgYnl0ZWMgNCAvLyAweDY4NjU2YzZjNmYKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozNgogICAgLy8gIndvcmxkIiwKICAgIGJ5dGVjIDUgLy8gIndvcmxkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjM3CiAgICAvLyBTdHJpbmcoIiEiKSwKICAgIHB1c2hieXRlcyAiISIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBkaWcgMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozMQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18xIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzAKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjI5CiAgICAvLyBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjgKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTAKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMF0sIGNyZWF0ZV90eG5zWzFdKQogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NwogICAgLy8gbm90ZT1iImRpZmZlcmVudCBwYXJhbSBzZXQiLAogICAgYnl0ZWNfMyAvLyAweDY0Njk2NjY2NjU3MjY1NmU3NDIwNzA2MTcyNjE2ZDIwNzM2NTc0CiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ2CiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIzYSIpLCBCeXRlcyhiIjRhIiksIEJ5dGVzKGIiNWEiKSksCiAgICBieXRlYyA2IC8vIDB4MzM2MQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDcgLy8gMHgzNDYxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgOCAvLyAweDM1NjEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18xIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDQKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQzCiAgICAvLyBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTAKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMF0sIGNyZWF0ZV90eG5zWzFdKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjUyCiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMCkgPT0gYiIxYSIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlY18xIC8vIDB4MzE2MQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTMKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncygxKSA9PSBiIjJhIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ5dGVjXzIgLy8gMHgzMjYxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1NAogICAgLy8gYXNzZXJ0IHR4bl8xLmFwcF9hcmdzKDIpID09IGIiaGVsbG8iCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnl0ZWMgNCAvLyAweDY4NjU2YzZjNmYKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjU1CiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMykgPT0gYiJ3b3JsZCIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAzCiAgICBieXRlYyA1IC8vIDB4Nzc2ZjcyNmM2NAogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTYKICAgIC8vIGFzc2VydCB0eG5fMS5hcHBfYXJncyg0KSA9PSBiIiEiCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgNAogICAgcHVzaGJ5dGVzIDB4MjEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjU3CiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoNSkgPT0gb3AuaXRvYig0MikKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo1OAogICAgLy8gYXNzZXJ0IHR4bl8xLmFwcF9hcmdzKDYpID09IG9wLml0b2IoMSkKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyA2CiAgICBpbnRjXzMgLy8gMQogICAgaXRvYgogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NTkKICAgIC8vIGFzc2VydCB0eG5fMi5hcHBfYXJncygwKSA9PSBiIjNhIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjIDYgLy8gMHgzMzYxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2MAogICAgLy8gYXNzZXJ0IHR4bl8yLmFwcF9hcmdzKDEpID09IGIiNGEiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWMgNyAvLyAweDM0NjEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjYxCiAgICAvLyBhc3NlcnQgdHhuXzIuYXBwX2FyZ3MoMikgPT0gYiI1YSIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBieXRlYyA4IC8vIDB4MzU2MQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NjYKICAgIC8vIHR4bl8xLCB0eG5fMiA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMV0sIGNyZWF0ZV90eG5zWzBdKQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDcKICAgIC8vIG5vdGU9YiJkaWZmZXJlbnQgcGFyYW0gc2V0IiwKICAgIGJ5dGVjXzMgLy8gMHg2NDY5NjY2NjY1NzI2NTZlNzQyMDcwNjE3MjYxNmQyMDczNjU3NAogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2NAogICAgLy8gY3JlYXRlX3R4bnNbMV0uc2V0KGFwcF9hcmdzPShCeXRlcyhiIjNiIiksIEJ5dGVzKGIiNGIiKSwgQnl0ZXMoYiI1YiIpKSkKICAgIGJ5dGVjIDkgLy8gMHgzMzYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTAgLy8gMHgzNDYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTEgLy8gMHgzNTYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDUKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIGludGNfMSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ0CiAgICAvLyBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0MwogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQyCiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjY2CiAgICAvLyB0eG5fMSwgdHhuXzIgPSBpdHhuLnN1Ym1pdF90eG5zKGNyZWF0ZV90eG5zWzFdLCBjcmVhdGVfdHhuc1swXSkKICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NjMKICAgIC8vIGNyZWF0ZV90eG5zWzBdLnNldChhcHBfYXJncz0oQnl0ZXMoYiIxYiIpLCBCeXRlcyhiIjJiIikpKQogICAgYnl0ZWMgMTIgLy8gMHgzMTYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMTMgLy8gMHgzMjYyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MzEKICAgIC8vIG9uX2NvbXBsZXRpb249T25Db21wbGV0ZUFjdGlvbi5EZWxldGVBcHBsaWNhdGlvbiwKICAgIGludGNfMSAvLyBEZWxldGVBcHBsaWNhdGlvbgogICAgaXR4bl9maWVsZCBPbkNvbXBsZXRpb24KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjMwCiAgICAvLyBjbGVhcl9zdGF0ZV9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBDbGVhclN0YXRlUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyOQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjI4CiAgICAvLyBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjY2CiAgICAvLyB0eG5fMSwgdHhuXzIgPSBpdHhuLnN1Ym1pdF90eG5zKGNyZWF0ZV90eG5zWzFdLCBjcmVhdGVfdHhuc1swXSkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2OAogICAgLy8gYXNzZXJ0IHR4bl8yLmFwcF9hcmdzKDApID09IGIiMWIiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWMgMTIgLy8gMHgzMTYyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo2OQogICAgLy8gYXNzZXJ0IHR4bl8yLmFwcF9hcmdzKDEpID09IGIiMmIiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWMgMTMgLy8gMHgzMjYyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo3MAogICAgLy8gYXNzZXJ0IHR4bl8xLmFwcF9hcmdzKDApID09IGIiM2IiCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWMgOSAvLyAweDMzNjIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjcxCiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMSkgPT0gYiI0YiIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAxCiAgICBieXRlYyAxMCAvLyAweDM0NjIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjcyCiAgICAvLyBhc3NlcnQgdHhuXzEuYXBwX2FyZ3MoMikgPT0gYiI1YiIKICAgIGdpdHhuYSAwIEFwcGxpY2F0aW9uQXJncyAyCiAgICBieXRlYyAxMSAvLyAweDM1NjIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojc3CiAgICAvLyB0eG5fdHVwbGUgPSBpdHhuLnN1Ym1pdF90eG5zKGNyZWF0ZV90eG5zWzBdLCBjcmVhdGVfdHhuc1sxXSkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojc0CiAgICAvLyBjcmVhdGVfdHhuc1swXS5zZXQoYXBwX2FyZ3M9KEJ5dGVzKGIiMWMiKSwgQnl0ZXMoYiIyYyIpKSkKICAgIGJ5dGVjIDE0IC8vIDB4MzE2MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDE1IC8vIDB4MzI2MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjMxCiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzEgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTozMAogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6MjkKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weToyOAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo3NwogICAgLy8gdHhuX3R1cGxlID0gaXR4bi5zdWJtaXRfdHhucyhjcmVhdGVfdHhuc1swXSwgY3JlYXRlX3R4bnNbMV0pCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQ3CiAgICAvLyBub3RlPWIiZGlmZmVyZW50IHBhcmFtIHNldCIsCiAgICBieXRlY18zIC8vIDB4NjQ2OTY2NjY2NTcyNjU2ZTc0MjA3MDYxNzI2MTZkMjA3MzY1NzQKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzUKICAgIC8vIGNyZWF0ZV90eG5zWzFdLnNldChhcHBfYXJncz0oQnl0ZXMoYiIzYyIpLCBCeXRlcyhiIjRjIiksIEJ5dGVzKGIiNWMiKSkpCiAgICBieXRlYyAxNiAvLyAweDMzNjMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxNyAvLyAweDM0NjMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxOCAvLyAweDM1NjMKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo0NQogICAgLy8gb25fY29tcGxldGlvbj1PbkNvbXBsZXRlQWN0aW9uLkRlbGV0ZUFwcGxpY2F0aW9uLAogICAgaW50Y18xIC8vIERlbGV0ZUFwcGxpY2F0aW9uCiAgICBpdHhuX2ZpZWxkIE9uQ29tcGxldGlvbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDQKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjQzCiAgICAvLyBhcHByb3ZhbF9wcm9ncmFtPUFMV0FZU19BUFBST1ZFLAogICAgYnl0ZWNfMCAvLyAweDA5ODEwMQogICAgaXR4bl9maWVsZCBBcHByb3ZhbFByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NDIKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6NzcKICAgIC8vIHR4bl90dXBsZSA9IGl0eG4uc3VibWl0X3R4bnMoY3JlYXRlX3R4bnNbMF0sIGNyZWF0ZV90eG5zWzFdKQogICAgaXR4bl9zdWJtaXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojc5CiAgICAvLyBhc3NlcnQgdHhuX3R1cGxlWzBdLmFwcF9hcmdzKDApID09IGIiMWMiCiAgICBnaXR4bmEgMCBBcHBsaWNhdGlvbkFyZ3MgMAogICAgYnl0ZWMgMTQgLy8gMHgzMTYzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4MAogICAgLy8gYXNzZXJ0IHR4bl90dXBsZVswXS5hcHBfYXJncygxKSA9PSBiIjJjIgogICAgZ2l0eG5hIDAgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ5dGVjIDE1IC8vIDB4MzI2MwogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6ODEKICAgIC8vIGFzc2VydCB0eG5fdHVwbGVbMV0uYXBwX2FyZ3MoMCkgPT0gYiIzYyIKICAgIGl0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBieXRlYyAxNiAvLyAweDMzNjMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjgyCiAgICAvLyBhc3NlcnQgdHhuX3R1cGxlWzFdLmFwcF9hcmdzKDEpID09IGIiNGMiCiAgICBpdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnl0ZWMgMTcgLy8gMHgzNDYzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4MwogICAgLy8gYXNzZXJ0IHR4bl90dXBsZVsxXS5hcHBfYXJncygyKSA9PSBiIjVjIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGJ5dGVjIDE4IC8vIDB4MzU2MwogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuZmllbGRfdHVwbGVfYXNzaWdubWVudC5GaWVsZFR1cGxlQ29udHJhY3QudGVzdF9hc3NpZ25fdHVwbGVfbWl4ZWQoKSAtPiB2b2lkOgp0ZXN0X2Fzc2lnbl90dXBsZV9taXhlZDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5Ojg1LTg2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2Fzc2lnbl90dXBsZV9taXhlZChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo5NgogICAgLy8gcmVzdWx0X3dpdGhfdHhuID0gdHVwbGVfd2l0aF90eG5fZmllbGRzWzBdLnN1Ym1pdCgpLCB0dXBsZV93aXRoX3R4bl9maWVsZHNbMV0KICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjkyCiAgICAvLyBhcHBfYXJncz0oQnl0ZXMoYiIxYSIpLCBCeXRlcyhiIjJhIikpLAogICAgYnl0ZWNfMSAvLyAweDMxNjEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18yIC8vIDB4MzI2MQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9maWVsZF90dXBsZV9hc3NpZ25tZW50LnB5OjkxCiAgICAvLyBvbl9jb21wbGV0aW9uPU9uQ29tcGxldGVBY3Rpb24uRGVsZXRlQXBwbGljYXRpb24sCiAgICBpbnRjXzEgLy8gRGVsZXRlQXBwbGljYXRpb24KICAgIGl0eG5fZmllbGQgT25Db21wbGV0aW9uCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo5MAogICAgLy8gY2xlYXJfc3RhdGVfcHJvZ3JhbT1BTFdBWVNfQVBQUk9WRSwKICAgIGJ5dGVjXzAgLy8gMHgwOTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2ZpZWxkX3R1cGxlX2Fzc2lnbm1lbnQucHk6ODkKICAgIC8vIGFwcHJvdmFsX3Byb2dyYW09QUxXQVlTX0FQUFJPVkUsCiAgICBieXRlY18wIC8vIDB4MDk4MTAxCiAgICBpdHhuX2ZpZWxkIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo4OAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICBpbnRjXzIgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo5NgogICAgLy8gcmVzdWx0X3dpdGhfdHhuID0gdHVwbGVfd2l0aF90eG5fZmllbGRzWzBdLnN1Ym1pdCgpLCB0dXBsZV93aXRoX3R4bl9maWVsZHNbMV0KICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo5OAogICAgLy8gYXNzZXJ0IHJlc3VsdF93aXRoX3R4blswXS5hcHBfYXJncygwKSA9PSBiIjFhIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIGJ5dGVjXzEgLy8gMHgzMTYxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvZmllbGRfdHVwbGVfYXNzaWdubWVudC5weTo5OQogICAgLy8gYXNzZXJ0IHJlc3VsdF93aXRoX3R4blswXS5hcHBfYXJncygxKSA9PSBiIjJhIgogICAgaXR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ5dGVjXzIgLy8gMHgzMjYxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5maWVsZF90dXBsZV9hc3NpZ25tZW50LkZpZWxkVHVwbGVDb250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiAEAAUGASYTAwmBAQIxYQIyYRNkaWZmZXJlbnQgcGFyYW0gc2V0BWhlbGxvBXdvcmxkAjNhAjRhAjVhAjNiAjRiAjViAjFiAjJiAjFjAjJjAjNjAjRjAjVjiAABQ4oAATEbQQAvggIEHKLAfgTsbNCoNhoAjgIAAgAOIokxGRREMRhEiAAbJYkxGRREMRhEiAFmJYkxGUAABjEYFEQliSKJigAAgSoWJRaxKbIaKrIaJwSyGicFshqAASGyGksBshqyGiOyGSiyQiiyQCSyECKyAbYrsgUnBrIaJweyGicIshojshkoskIoskAkshAisgGzuAAaACkSRLgAGgEqEkS4ABoCJwQSRLgAGgMnBRJEuAAaBIABIRJEuAAaBRJEuAAaBiUWEkS1GgAnBhJEtRoBJwcSRLUaAicIEkSxK7IFJwmyGicKshonC7IaI7IZKLJCKLJAJLIQIrIBticMshonDbIaI7IZKLJCKLJAJLIQIrIBs7UaACcMEkS1GgEnDRJEuAAaACcJEkS4ABoBJwoSRLgAGgInCxJEsScOshonD7IaI7IZKLJCKLJAJLIQIrIBtiuyBScQshonEbIaJxKyGiOyGSiyQiiyQCSyECKyAbO4ABoAJw4SRLgAGgEnDxJEtRoAJxASRLUaAScREkS1GgInEhJEiYoAALEpshoqshojshkoskIoskAkshAisgGztRoAKRJEtRoBKhJEiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/inner_transactions/out/Greeter.arc56.json b/test_cases/inner_transactions/out/Greeter.arc56.json new file mode 100644 index 0000000000..ad02bc208a --- /dev/null +++ b/test_cases/inner_transactions/out/Greeter.arc56.json @@ -0,0 +1,151 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Greeter", + "structs": {}, + "methods": [ + { + "name": "bootstrap", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log_greetings", + "args": [ + { + "type": "string", + "name": "name" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "hello_app": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "aGVsbG9fYXBw" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 274 + ], + "errorMessage": "ARC4 prefix is valid" + }, + { + "pc": [ + 69, + 86 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 119 + ], + "errorMessage": "already bootstrapped" + }, + { + "pc": [ + 117, + 231, + 240 + ], + "errorMessage": "check self.hello_app exists" + }, + { + "pc": [ + 106 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 72, + 89 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSA2CiAgICBieXRlY2Jsb2NrICJoZWxsb19hcHAiIDB4MTUxZjdjNzUKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBibnogbWFpbl9lbnRyeXBvaW50QDIKICAgIGNhbGxzdWIgX19pbml0X18KCm1haW5fZW50cnlwb2ludEAyOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnMuYzJjLkdyZWV0ZXIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weTo2CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDc4NmI2MjkxIDB4MzNmYjVkNDggLy8gbWV0aG9kICJib290c3RyYXAoKXVpbnQ2NCIsIG1ldGhvZCAibG9nX2dyZWV0aW5ncyhzdHJpbmcpdm9pZCIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Jvb3RzdHJhcF9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19ncmVldGluZ3Nfcm91dGVAMwogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYm9vdHN0cmFwX3JvdXRlQDI6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBib290c3RyYXAKICAgIGl0b2IKICAgIGJ5dGVjXzEgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19ncmVldGluZ3Nfcm91dGVAMzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjYKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIGxvZ19ncmVldGluZ3MKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weTo2CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6NgogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zLmMyYy5HcmVldGVyLmJvb3RzdHJhcCgpIC0+IHVpbnQ2NDoKYm9vdHN0cmFwOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxMC0xMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBib290c3RyYXAoc2VsZikgLT4gVUludDY0OgogICAgcHJvdG8gMCAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEyCiAgICAvLyBhc3NlcnQgbm90IHNlbGYuaGVsbG9fYXBwLCAiYWxyZWFkeSBib290c3RyYXBwZWQiCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMCAvLyAiaGVsbG9fYXBwIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmhlbGxvX2FwcCBleGlzdHMKICAgICEKICAgIGFzc2VydCAvLyBhbHJlYWR5IGJvb3RzdHJhcHBlZAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNC0xOAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTYKICAgIC8vIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICBwdXNoYnl0ZXMgMHgwYTgxMDEKICAgIGl0eG5fZmllbGQgQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNQogICAgLy8gYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgcHVzaGJ5dGVzIDB4MGEyMDAxMDEzMTFiNDEwMDI2ODAwNDAyYmVjZTExMzYxYTAwOGUwMTAwMDEwMDMxMTkxNDQ0MzExODQ0MzYxYTAxODgwMDE1ODAwNDE1MWY3Yzc1NGM1MGIwMjI0MzMxMTkxNDQ0MzExODE0NDQyMjQzOGEwMTAxOGJmZjU3MDIwMDgwMDc0ODY1NmM2YzZmMmMyMDRjNTA0OTE1MTY1NzA2MDA0YzUwODkKICAgIGl0eG5fZmllbGQgQXBwcm92YWxQcm9ncmFtUGFnZXMKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTQKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgaW50Y18yIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToxNC0xOAogICAgLy8gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwcm92YWxfcHJvZ3JhbT1CeXRlcy5mcm9tX2hleChIRUxMT19XT1JMRF9BUFBST1ZBTF9IRVgpLAogICAgLy8gICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICAvLyApCiAgICAvLyAuc3VibWl0KCkKICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjEzCiAgICAvLyBzZWxmLmhlbGxvX2FwcCA9ICgKICAgIGJ5dGVjXzAgLy8gImhlbGxvX2FwcCIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTQtMTkKICAgIC8vIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgIGFwcHJvdmFsX3Byb2dyYW09Qnl0ZXMuZnJvbV9oZXgoSEVMTE9fV09STERfQVBQUk9WQUxfSEVYKSwKICAgIC8vICAgICBjbGVhcl9zdGF0ZV9wcm9ncmFtPUhFTExPX1dPUkxEX0NMRUFSLAogICAgLy8gKQogICAgLy8gLnN1Ym1pdCgpCiAgICAvLyAuY3JlYXRlZF9hcHAKICAgIGl0eG4gQ3JlYXRlZEFwcGxpY2F0aW9uSUQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MTMtMjAKICAgIC8vIHNlbGYuaGVsbG9fYXBwID0gKAogICAgLy8gICAgIGl0eG4uQXBwbGljYXRpb25DYWxsKAogICAgLy8gICAgICAgICBhcHByb3ZhbF9wcm9ncmFtPUJ5dGVzLmZyb21faGV4KEhFTExPX1dPUkxEX0FQUFJPVkFMX0hFWCksCiAgICAvLyAgICAgICAgIGNsZWFyX3N0YXRlX3Byb2dyYW09SEVMTE9fV09STERfQ0xFQVIsCiAgICAvLyAgICAgKQogICAgLy8gICAgIC5zdWJtaXQoKQogICAgLy8gICAgIC5jcmVhdGVkX2FwcAogICAgLy8gKQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjEKICAgIC8vIHJldHVybiBzZWxmLmhlbGxvX2FwcC5pZAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImhlbGxvX2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oZWxsb19hcHAgZXhpc3RzCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5sb2dfZ3JlZXRpbmdzKG5hbWU6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfZ3JlZXRpbmdzOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyMy0yNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBsb2dfZ3JlZXRpbmdzKHNlbGYsIG5hbWU6IGFyYzQuU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI1LTI4CiAgICAvLyBoZWxsb19jYWxsID0gaXR4bi5BcHBsaWNhdGlvbkNhbGwoCiAgICAvLyAgICAgYXBwX2lkPXNlbGYuaGVsbG9fYXBwLAogICAgLy8gICAgIGFwcF9hcmdzPShhcmM0LmFyYzRfc2lnbmF0dXJlKCJoZWxsbyhzdHJpbmcpc3RyaW5nIiksIG5hbWUpLAogICAgLy8gKS5zdWJtaXQoKQogICAgaXR4bl9iZWdpbgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weToyNgogICAgLy8gYXBwX2lkPXNlbGYuaGVsbG9fYXBwLAogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzAgLy8gImhlbGxvX2FwcCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5oZWxsb19hcHAgZXhpc3RzCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI3CiAgICAvLyBhcHBfYXJncz0oYXJjNC5hcmM0X3NpZ25hdHVyZSgiaGVsbG8oc3RyaW5nKXN0cmluZyIpLCBuYW1lKSwKICAgIHB1c2hieXRlcyAweDAyYmVjZTExIC8vIG1ldGhvZCAiaGVsbG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjUKICAgIC8vIGhlbGxvX2NhbGwgPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIGludGNfMiAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9ucy9jMmMucHk6MjUtMjgKICAgIC8vIGhlbGxvX2NhbGwgPSBpdHhuLkFwcGxpY2F0aW9uQ2FsbCgKICAgIC8vICAgICBhcHBfaWQ9c2VsZi5oZWxsb19hcHAsCiAgICAvLyAgICAgYXBwX2FyZ3M9KGFyYzQuYXJjNF9zaWduYXR1cmUoImhlbGxvKHN0cmluZylzdHJpbmciKSwgbmFtZSksCiAgICAvLyApLnN1Ym1pdCgpCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjI5CiAgICAvLyBncmVldGluZyA9IGFyYzQuU3RyaW5nLmZyb21fbG9nKGhlbGxvX2NhbGwubGFzdF9sb2cpCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMSAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnMvYzJjLnB5OjMwCiAgICAvLyBsb2coIkhlbGxvV29ybGQgcmV0dXJuZWQ6ICIsIGdyZWV0aW5nLm5hdGl2ZSkKICAgIGV4dHJhY3QgMiAwCiAgICBwdXNoYnl0ZXMgIkhlbGxvV29ybGQgcmV0dXJuZWQ6ICIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weTo3CiAgICAvLyBkZWYgX19pbml0X18oc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zL2MyYy5weTo4CiAgICAvLyBzZWxmLmhlbGxvX2FwcCA9IEFwcGxpY2F0aW9uKCkKICAgIGJ5dGVjXzAgLy8gImhlbGxvX2FwcCIKICAgIGludGNfMCAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9ucy5jMmMuR3JlZXRlci5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiADAAEGJgIJaGVsbG9fYXBwBBUffHUxGEAAA4gBEogAAUOKAAExG0EAN4ICBHhrYpEEM/tdSDYaAI4CAAIAEyKJMRkURDEYRIgAIxYpTFCwI4kxGRREMRhENhoBiACJI4kxGUAABjEYFEQjiSKJigABIihlRBREsYADCoEBskKAVQogAQExG0EAJoAEAr7OETYaAI4BAAEAMRkURDEYRDYaAYgAFYAEFR98dUxQsCJDMRkURDEYFEQiQ4oBAYv/VwIAgAdIZWxsbywgTFBJFRZXBgBMUImyQCSyECKyAbMotD1nIihlRImKAQCxIihlRIAEAr7OEbIai/+yGrIYJLIQIrIBs7Q+SVcEAExXAAQpEkRXAgCAFUhlbGxvV29ybGQgcmV0dXJuZWQ6IExQsImKAAAoImeJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/inner_transactions/puya.log b/test_cases/inner_transactions/puya.log index 51486dacae..e06fe3b5de 100644 --- a/test_cases/inner_transactions/puya.log +++ b/test_cases/inner_transactions/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inner_transactions'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inner_transactions'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing inner_transactions/out/module.awst debug: Sealing block@0: // L12 @@ -7682,6 +7682,7 @@ info: Writing inner_transactions/out/itxn_loop.clear.bin info: Writing inner_transactions/out/itxn_loop.approval.puya.map info: Writing inner_transactions/out/itxn_loop.clear.puya.map info: Writing inner_transactions/out/FieldTupleContract.arc32.json +info: Writing inner_transactions/out/FieldTupleContract.arc56.json info: Writing inner_transactions/out/FieldTupleContract.approval.teal info: Writing inner_transactions/out/FieldTupleContract.clear.teal info: Writing inner_transactions/out/FieldTupleContract.approval.bin @@ -7695,6 +7696,7 @@ info: Writing inner_transactions/out/MyContract.clear.bin info: Writing inner_transactions/out/MyContract.approval.puya.map info: Writing inner_transactions/out/MyContract.clear.puya.map info: Writing inner_transactions/out/Greeter.arc32.json +info: Writing inner_transactions/out/Greeter.arc56.json info: Writing inner_transactions/out/Greeter.approval.teal info: Writing inner_transactions/out/Greeter.clear.teal info: Writing inner_transactions/out/Greeter.approval.bin @@ -7702,6 +7704,7 @@ info: Writing inner_transactions/out/Greeter.clear.bin info: Writing inner_transactions/out/Greeter.approval.puya.map info: Writing inner_transactions/out/Greeter.clear.puya.map info: Writing inner_transactions/out/CreateAndTransferContract.arc32.json +info: Writing inner_transactions/out/CreateAndTransferContract.arc56.json info: Writing inner_transactions/out/CreateAndTransferContract.approval.teal info: Writing inner_transactions/out/CreateAndTransferContract.clear.teal info: Writing inner_transactions/out/CreateAndTransferContract.approval.bin @@ -7709,6 +7712,7 @@ info: Writing inner_transactions/out/CreateAndTransferContract.clear.bin info: Writing inner_transactions/out/CreateAndTransferContract.approval.puya.map info: Writing inner_transactions/out/CreateAndTransferContract.clear.puya.map info: Writing inner_transactions/out/ArrayAccessContract.arc32.json +info: Writing inner_transactions/out/ArrayAccessContract.arc56.json info: Writing inner_transactions/out/ArrayAccessContract.approval.teal info: Writing inner_transactions/out/ArrayAccessContract.clear.teal info: Writing inner_transactions/out/ArrayAccessContract.approval.bin diff --git a/test_cases/inner_transactions_assignment/out/Contract.arc56.json b/test_cases/inner_transactions_assignment/out/Contract.arc56.json new file mode 100644 index 0000000000..a8407483c2 --- /dev/null +++ b/test_cases/inner_transactions_assignment/out/Contract.arc56.json @@ -0,0 +1,120 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Contract", + "structs": {}, + "methods": [ + { + "name": "test_itxn_slice", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_itxn_nested", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 112, + 124 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 141 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 115, + 127 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMKICAgIGJ5dGVjYmxvY2sgMHg2MTYzNjY2NyAweDcwNjE3OTMyICJwYXkxIiAiVEVTVCIgIlRTVCIgInBheTMiIDB4Njg2OSAweDc0Njg2NTcyNjUgMHg2ZDYxNzk2MjY1IDB4Njg2OTMyIDB4NjE2MzY2NjczMiAweDcwNjE3OTM1IDB4NzQ2ODY1NzI2NTMyCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHhlNDZkOTAxOSAweGY4ODM4NTNlIC8vIG1ldGhvZCAidGVzdF9pdHhuX3NsaWNlKCl2b2lkIiwgbWV0aG9kICJ0ZXN0X2l0eG5fbmVzdGVkKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9pdHhuX3NsaWNlX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9pdHhuX25lc3RlZF9yb3V0ZUAzCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2l0eG5fc2xpY2Vfcm91dGVAMjoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjEzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgdGVzdF9pdHhuX3NsaWNlCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2l0eG5fbmVzdGVkX3JvdXRlQDM6CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfaXR4bl9uZXN0ZWQKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBDb250cmFjdChBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQuY29udHJhY3QuQ29udHJhY3QudGVzdF9pdHhuX3NsaWNlKCkgLT4gdm9pZDoKdGVzdF9pdHhuX3NsaWNlOgogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTMtMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfaXR4bl9zbGljZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMQogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICB0eG4gU2VuZGVyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyNgogICAgLy8gc2xpY2VkX3R4bnMgPSBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMQogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBieXRlY18yIC8vICJwYXkxIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGR1cAogICAgaXR4bl9maWVsZCBSZWNlaXZlcgogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyNgogICAgLy8gc2xpY2VkX3R4bnMgPSBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjE5CiAgICAvLyB0b3RhbD0xLAogICAgaW50Y18xIC8vIDEKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRUb3RhbAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTgKICAgIC8vIG5vdGU9ImFjZmciLAogICAgYnl0ZWNfMCAvLyAiYWNmZyIKICAgIGl0eG5fZmllbGQgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MTcKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMyAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToxNgogICAgLy8gdW5pdF9uYW1lPSJUU1QiLAogICAgYnl0ZWMgNCAvLyAiVFNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToxNQogICAgLy8gYWNmZyA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyNgogICAgLy8gc2xpY2VkX3R4bnMgPSBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjIxCiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMwogICAgLy8gcGF5Mi5zZXQobm90ZT0icGF5MiIpCiAgICBieXRlY18xIC8vICJwYXkyIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMQogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzbGljZWRfdHhucyA9IGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0KICAgIGl0eG5fbmV4dAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjEKICAgIC8vIHBheTEgPSBpdHhuLlBheW1lbnQocmVjZWl2ZXI9VHhuLnNlbmRlciwgYW1vdW50PTAsIG5vdGU9InBheTEiKQogICAgaW50Y18xIC8vIHBheQogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgQW1vdW50CiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyNQogICAgLy8gcGF5My5zZXQobm90ZT0icGF5MyIpCiAgICBieXRlYyA1IC8vICJwYXkzIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weToyMQogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjI2CiAgICAvLyBzbGljZWRfdHhucyA9IGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0KICAgIGl0eG5fc3VibWl0CiAgICBnaXR4biAyIE5vdGUKICAgIGdpdHhuIDEgTm90ZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjcKICAgIC8vIGFzc2VydCBzbGljZWRfdHhuc1swXS5ub3RlID09IGIiYWNmZyIKICAgIGJ5dGVjXzAgLy8gMHg2MTYzNjY2NwogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MjgKICAgIC8vIGFzc2VydCBzbGljZWRfdHhuc1sxXS5ub3RlID09IGIicGF5MiIKICAgIGJ5dGVjXzEgLy8gMHg3MDYxNzkzMgogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5pbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC5jb250cmFjdC5Db250cmFjdC50ZXN0X2l0eG5fbmVzdGVkKCkgLT4gdm9pZDoKdGVzdF9pdHhuX25lc3RlZDoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjMwLTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2l0eG5fbmVzdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIHR4biBTZW5kZXIKICAgIGR1cAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDQKICAgIC8vIGVjaG8oQnl0ZXMoYiJoaSIpKSwKICAgIGJ5dGVjIDYgLy8gMHg2ODY5CiAgICBjYWxsc3ViIGVjaG8KICAgIGR1cAogICAgdW5jb3ZlciAyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0NQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkyLCBwYXkzKVsxOi0xXSwKICAgIGl0eG5fYmVnaW4KICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGJ5dGVjXzIgLy8gInBheTEiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdLAogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozNgogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM1CiAgICAvLyBub3RlPSJhY2ZnIiwKICAgIGJ5dGVjXzAgLy8gImFjZmciCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhc3NldF9uYW1lPSJURVNUIiwKICAgIGJ5dGVjXzMgLy8gIlRFU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzMKICAgIC8vIHVuaXRfbmFtZT0iVFNUIiwKICAgIGJ5dGVjIDQgLy8gIlRTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzIKICAgIC8vIGFjZmcgPSBpdHhuLkFzc2V0Q29uZmlnKAogICAgaW50Y18yIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDUKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0sCiAgICBpdHhuX25leHQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEFtb3VudAogICAgZHVwCiAgICBpdHhuX2ZpZWxkIFJlY2VpdmVyCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0MAogICAgLy8gcGF5Mi5zZXQobm90ZT0icGF5MiIpCiAgICBieXRlY18xIC8vICJwYXkyIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozOAogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQ1CiAgICAvLyBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTIsIHBheTMpWzE6LTFdLAogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozOAogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjQyCiAgICAvLyBwYXkzLnNldChub3RlPSJwYXkzIikKICAgIGJ5dGVjIDUgLy8gInBheTMiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM4CiAgICAvLyBwYXkxID0gaXR4bi5QYXltZW50KHJlY2VpdmVyPVR4bi5zZW5kZXIsIGFtb3VudD0wLCBub3RlPSJwYXkxIikKICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDUKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MiwgcGF5MylbMTotMV0sCiAgICBpdHhuX3N1Ym1pdAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDYKICAgIC8vIGVjaG8oQnl0ZXMoYiJ0aGVyZSIpKSwKICAgIGJ5dGVjIDcgLy8gMHg3NDY4NjU3MjY1CiAgICBjYWxsc3ViIGVjaG8KICAgIGR1cAogICAgY292ZXIgMgogICAgZ2l0eG4gMSBOb3RlCiAgICBkdXAKICAgIGNvdmVyIDMKICAgIGdpdHhuIDIgTm90ZQogICAgZHVwCiAgICBjb3ZlciAyCiAgICBjb3ZlciA0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo0OAogICAgLy8gYXNzZXJ0IG5lc3RlZF90dXBsZVswXSA9PSBiImhpIgogICAgdW5jb3ZlciAzCiAgICBieXRlYyA2IC8vIDB4Njg2OQogICAgPT0KICAgIGFzc2VydAogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NDkKICAgIC8vIGFzc2VydCBuZXN0ZWRfdHVwbGVbMV1bMF0ubm90ZSA9PSBiImFjZmciCiAgICBieXRlY18wIC8vIDB4NjE2MzY2NjcKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjUwCiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzFdWzFdLm5vdGUgPT0gYiJwYXkyIgogICAgYnl0ZWNfMSAvLyAweDcwNjE3OTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo1MQogICAgLy8gYXNzZXJ0IG5lc3RlZF90dXBsZVsyXSA9PSBiInRoZXJlIgogICAgYnl0ZWMgNyAvLyAweDc0Njg2NTcyNjUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjU4CiAgICAvLyBpZiBlY2hvKEJ5dGVzKGIibWF5YmUiKSkgPT0gYiJtYXliZSI6CiAgICBieXRlYyA4IC8vIDB4NmQ2MTc5NjI2NQogICAgY2FsbHN1YiBlY2hvCiAgICBieXRlYyA4IC8vIDB4NmQ2MTc5NjI2NQogICAgPT0KICAgIGJ6IHRlc3RfaXR4bl9uZXN0ZWRfYWZ0ZXJfaWZfZWxzZUA5CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo2MAogICAgLy8gZWNobyhCeXRlcyhiImhpMiIpKSwKICAgIGJ5dGVjIDkgLy8gMHg2ODY5MzIKICAgIGNhbGxzdWIgZWNobwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo2MQogICAgLy8gaXR4bi5zdWJtaXRfdHhucyhwYXkxLCBhY2ZnLCBwYXkzKVsxOl0sCiAgICBpdHhuX2JlZ2luCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozOAogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBieXRlY18yIC8vICJwYXkxIgogICAgaXR4bl9maWVsZCBOb3RlCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGZyYW1lX2RpZyAwCiAgICBkdXAKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIGludGNfMSAvLyBwYXkKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjEKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MylbMTpdLAogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozNgogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjU0CiAgICAvLyBhY2ZnLnNldChub3RlPSJhY2ZnMiIpCiAgICBieXRlYyAxMCAvLyAiYWNmZzIiCiAgICBpdHhuX2ZpZWxkIE5vdGUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjM0CiAgICAvLyBhc3NldF9uYW1lPSJURVNUIiwKICAgIGJ5dGVjXzMgLy8gIlRFU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzMKICAgIC8vIHVuaXRfbmFtZT0iVFNUIiwKICAgIGJ5dGVjIDQgLy8gIlRTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6MzIKICAgIC8vIGFjZmcgPSBpdHhuLkFzc2V0Q29uZmlnKAogICAgaW50Y18yIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NjEKICAgIC8vIGl0eG4uc3VibWl0X3R4bnMocGF5MSwgYWNmZywgcGF5MylbMTpdLAogICAgaXR4bl9uZXh0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozOAogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzEgLy8gcGF5CiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBBbW91bnQKICAgIGl0eG5fZmllbGQgUmVjZWl2ZXIKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjU2CiAgICAvLyBwYXkzLnNldChub3RlPSJwYXk1IikKICAgIGJ5dGVjIDExIC8vICJwYXk1IgogICAgaXR4bl9maWVsZCBOb3RlCiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTozOAogICAgLy8gcGF5MSA9IGl0eG4uUGF5bWVudChyZWNlaXZlcj1UeG4uc2VuZGVyLCBhbW91bnQ9MCwgbm90ZT0icGF5MSIpCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjYxCiAgICAvLyBpdHhuLnN1Ym1pdF90eG5zKHBheTEsIGFjZmcsIHBheTMpWzE6XSwKICAgIGl0eG5fc3VibWl0CiAgICAvLyBpbm5lcl90cmFuc2FjdGlvbnNfYXNzaWdubWVudC9jb250cmFjdC5weTo2MgogICAgLy8gZWNobyhCeXRlcyhiInRoZXJlMiIpKSwKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2ODY1NzI2NTMyCiAgICBjYWxsc3ViIGVjaG8KICAgIGZyYW1lX2J1cnkgMgogICAgZ2l0eG4gMSBOb3RlCiAgICBmcmFtZV9idXJ5IDMKICAgIGl0eG4gTm90ZQogICAgZnJhbWVfYnVyeSA0Cgp0ZXN0X2l0eG5fbmVzdGVkX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjY0CiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzBdID09IGIiaGkyIgogICAgZnJhbWVfZGlnIDEKICAgIGJ5dGVjIDkgLy8gMHg2ODY5MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjY1CiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzFdWzBdLm5vdGUgPT0gYiJhY2ZnMiIKICAgIGZyYW1lX2RpZyAzCiAgICBieXRlYyAxMCAvLyAweDYxNjM2NjY3MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjY2CiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzFdWzFdLm5vdGUgPT0gYiJwYXk1IgogICAgZnJhbWVfZGlnIDQKICAgIGJ5dGVjIDExIC8vIDB4NzA2MTc5MzUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5OjY3CiAgICAvLyBhc3NlcnQgbmVzdGVkX3R1cGxlWzJdID09IGIidGhlcmUyIgogICAgZnJhbWVfZGlnIDIKICAgIGJ5dGVjIDEyIC8vIDB4NzQ2ODY1NzI2NTMyCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LmVjaG8odmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKZWNobzoKICAgIC8vIGlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50L2NvbnRyYWN0LnB5Ojc3LTc4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGVjaG8odmFsdWU6IEJ5dGVzKSAtPiBCeXRlczoKICAgIHByb3RvIDEgMQogICAgLy8gaW5uZXJfdHJhbnNhY3Rpb25zX2Fzc2lnbm1lbnQvY29udHJhY3QucHk6NzkKICAgIC8vIHJldHVybiB2YWx1ZQogICAgZnJhbWVfZGlnIC0xCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLmlubmVyX3RyYW5zYWN0aW9uc19hc3NpZ25tZW50LmNvbnRyYWN0LkNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiADAAEDJg0EYWNmZwRwYXkyBHBheTEEVEVTVANUU1QEcGF5MwJoaQV0aGVyZQVtYXliZQNoaTIFYWNmZzIEcGF5NQZ0aGVyZTKIAAFDigABMRtBAC+CAgTkbZAZBPiDhT42GgCOAgACAA4iiTEZFEQxGESIABsjiTEZFEQxGESIAGYjiTEZQAAGMRgURCOJIomKAAAxALEqsgUisghJsgcjshAisgG2I7IiKLIFK7ImJwSyJSSyECKyAbYjshAisghJsgcpsgUisgG2I7IQIrIIsgcnBbIFIrIBs7cCBbcBBSgSRCkSRImKAAAxAEknBogA4UlPArEqsgUisghJsgcjshAisgG2I7IiKLIFK7ImJwSyJSSyECKyAbYjshAisghJsgcpsgUisgG2I7IQIrIIsgcnBbIFIrIBsycHiACUSU4CtwEFSU4DtwIFSU4CTgRPAycGEkQoEkQpEkQnBxJEJwiIAG4nCBJBAE8nCYgAY4wBsSqyBSKyCIsASbIHI7IQIrIBtiOyIicKsgUrsiYnBLIlJLIQIrIBtiOyECKyCLIHJwuyBSKyAbMnDIgAJIwCtwEFjAO0BYwEiwEnCRJEiwMnChJEiwQnCxJEiwInDBJEiYoBAYv/iQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/inner_transactions_assignment/puya.log b/test_cases/inner_transactions_assignment/puya.log index a9fc6cf34d..3b9580e46b 100644 --- a/test_cases/inner_transactions_assignment/puya.log +++ b/test_cases/inner_transactions_assignment/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inner_transactions_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['inner_transactions_assignment'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing inner_transactions_assignment/out/module.awst debug: Sealing block@0: // L12 @@ -3230,6 +3230,7 @@ debug: Found 1 edge set/s for test_cases.inner_transactions_assignment.contract. debug: test_cases.inner_transactions_assignment.contract.Contract.test_itxn_nested f-stack entry: [] debug: test_cases.inner_transactions_assignment.contract.Contract.test_itxn_nested f-stack on first store: ['pay1%%param_Receiver_idx_0#0', 'nested_tuple.0#0', 'nested_tuple.2#0', 'nested_tuple.1.0.Note#0', 'nested_tuple.1.1.Note#0'] info: Writing inner_transactions_assignment/out/Contract.arc32.json +info: Writing inner_transactions_assignment/out/Contract.arc56.json info: Writing inner_transactions_assignment/out/Contract.approval.teal info: Writing inner_transactions_assignment/out/Contract.clear.teal info: Writing inner_transactions_assignment/out/Contract.approval.bin diff --git a/test_cases/intrinsics/puya.log b/test_cases/intrinsics/puya.log index 2cdd7012f0..1908e838d6 100644 --- a/test_cases/intrinsics/puya.log +++ b/test_cases/intrinsics/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['intrinsics'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['intrinsics'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing intrinsics/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/iteration/puya.log b/test_cases/iteration/puya.log index 24880d549f..093bc1fd77 100644 --- a/test_cases/iteration/puya.log +++ b/test_cases/iteration/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['iteration'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['iteration'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv iteration/base.py:38 debug: skipping trivial method test_forwards iteration/base.py:42 debug: skipping trivial method test_reversed diff --git a/test_cases/koopman/puya.log b/test_cases/koopman/puya.log index db4bb5f1c7..78783cfe59 100644 --- a/test_cases/koopman/puya.log +++ b/test_cases/koopman/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['koopman'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['koopman'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing koopman/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/less_simple/puya.log b/test_cases/less_simple/puya.log index 35f71890db..a1f9f054dd 100644 --- a/test_cases/less_simple/puya.log +++ b/test_cases/less_simple/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['less_simple'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['less_simple'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing less_simple/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/literals/puya.log b/test_cases/literals/puya.log index 911c5c50ac..a5103ed954 100644 --- a/test_cases/literals/puya.log +++ b/test_cases/literals/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['literals'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['literals'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv literals/folding.py:7:12 warning: expression is always True literals/folding.py:8:17 warning: expression is always False diff --git a/test_cases/log/puya.log b/test_cases/log/puya.log index 560272982f..723863218a 100644 --- a/test_cases/log/puya.log +++ b/test_cases/log/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['log'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['log'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing log/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/logic_signature/puya.log b/test_cases/logic_signature/puya.log index f5dbd81d9b..511520faa1 100644 --- a/test_cases/logic_signature/puya.log +++ b/test_cases/logic_signature/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'SELLER': b'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00', 'PRICE': 1, 'ASSET_ID': 1}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['logic_signature'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'SELLER': b'/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00/x00', 'PRICE': 1, 'ASSET_ID': 1}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['logic_signature'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing logic_signature/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/loop_else/puya.log b/test_cases/loop_else/puya.log index 12f0e526e4..a614bd5e77 100644 --- a/test_cases/loop_else/puya.log +++ b/test_cases/loop_else/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['loop_else'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['loop_else'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing loop_else/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/match/puya.log b/test_cases/match/puya.log index 8ae34d5ec5..25a8a3a9c5 100644 --- a/test_cases/match/puya.log +++ b/test_cases/match/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['match'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['match'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing match/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/module_consts/puya.log b/test_cases/module_consts/puya.log index 9af10efda9..eb0592a113 100644 --- a/test_cases/module_consts/puya.log +++ b/test_cases/module_consts/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['module_consts'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['module_consts'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing module_consts/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/mylib/puya.log b/test_cases/mylib/puya.log index cbd61061ba..f7b44a6434 100644 --- a/test_cases/mylib/puya.log +++ b/test_cases/mylib/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['mylib'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['mylib'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing mylib/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/nested_loops/puya.log b/test_cases/nested_loops/puya.log index dad0bd3cdd..e994633abf 100644 --- a/test_cases/nested_loops/puya.log +++ b/test_cases/nested_loops/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['nested_loops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['nested_loops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing nested_loops/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/regression_tests/out/Issue118.arc56.json b/test_cases/regression_tests/out/Issue118.arc56.json new file mode 100644 index 0000000000..fa0ae0e6ed --- /dev/null +++ b/test_cases/regression_tests/out/Issue118.arc56.json @@ -0,0 +1,107 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Issue118", + "structs": {}, + "methods": [ + { + "name": "verify", + "args": [ + { + "type": "uint256[]", + "name": "values" + } + ], + "returns": { + "type": "(bool,string)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 43 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 72 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 46 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlZ3Jlc3Npb25fdGVzdHMuaXNzdWVfMTE4Lklzc3VlMTE4LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICBieXRlY2Jsb2NrIDB4MDAwMyAweDAwMDAKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMucmVncmVzc2lvbl90ZXN0cy5pc3N1ZV8xMTguSXNzdWUxMTguX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gcmVncmVzc2lvbl90ZXN0cy9pc3N1ZV8xMTgucHk6NQogICAgLy8gY2xhc3MgSXNzdWUxMTgoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1CiAgICBwdXNoYnl0ZXMgMHhiYzY2ZWI2MiAvLyBtZXRob2QgInZlcmlmeSh1aW50MjU2W10pKGJvb2wsc3RyaW5nKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3ZlcmlmeV9yb3V0ZUAyCiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX192ZXJpZnlfcm91dGVAMjoKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjYtNwogICAgLy8gIyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vcHV5YS9pc3N1ZXMvMTE4CiAgICAvLyBAYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weTo1CiAgICAvLyBjbGFzcyBJc3N1ZTExOChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gcmVncmVzc2lvbl90ZXN0cy9pc3N1ZV8xMTgucHk6Ni03CiAgICAvLyAjIHJlZjogaHR0cHM6Ly9naXRodWIuY29tL2FsZ29yYW5kZm91bmRhdGlvbi9wdXlhL2lzc3Vlcy8xMTgKICAgIC8vIEBhYmltZXRob2QKICAgIGNhbGxzdWIgdmVyaWZ5CiAgICBwdXNoYnl0ZXMgMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A1OgogICAgLy8gcmVncmVzc2lvbl90ZXN0cy9pc3N1ZV8xMTgucHk6NQogICAgLy8gY2xhc3MgSXNzdWUxMTgoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAOToKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjUKICAgIC8vIGNsYXNzIElzc3VlMTE4KEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5yZWdyZXNzaW9uX3Rlc3RzLmlzc3VlXzExOC5Jc3N1ZTExOC52ZXJpZnkodmFsdWVzOiBieXRlcykgLT4gYnl0ZXM6CnZlcmlmeToKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjYtOAogICAgLy8gIyByZWY6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbGdvcmFuZGZvdW5kYXRpb24vcHV5YS9pc3N1ZXMvMTE4CiAgICAvLyBAYWJpbWV0aG9kCiAgICAvLyBkZWYgdmVyaWZ5KHNlbGYsIHZhbHVlczogRHluYW1pY0FycmF5W1VJbnQyNTZdKSAtPiBUdXBsZVtCb29sLCBTdHJpbmddOgogICAgcHJvdG8gMSAxCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weTo5LTExCiAgICAvLyB2YWwxID0gQm9vbCgKICAgIC8vICAgICBib29sKFR4bi5udW1fYXBwX2FyZ3MpCiAgICAvLyApICAjIHVzZSBhIG5vbiBjb25zdGFudCB2YWx1ZSBzbyB0aGUgcmVwZWF0ZWQgZXhwcmVzc2lvbiBpcyBub3Qgc2ltcGxpZmllZAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weToxMAogICAgLy8gYm9vbChUeG4ubnVtX2FwcF9hcmdzKQogICAgdHhuIE51bUFwcEFyZ3MKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjktMTEKICAgIC8vIHZhbDEgPSBCb29sKAogICAgLy8gICAgIGJvb2woVHhuLm51bV9hcHBfYXJncykKICAgIC8vICkgICMgdXNlIGEgbm9uIGNvbnN0YW50IHZhbHVlIHNvIHRoZSByZXBlYXRlZCBleHByZXNzaW9uIGlzIG5vdCBzaW1wbGlmaWVkCiAgICBzZXRiaXQKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjEyCiAgICAvLyBpZiB2YWx1ZXMubGVuZ3RoICE9IDI6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgcHVzaGludCAyIC8vIDIKICAgICE9CiAgICBieiB2ZXJpZnlfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyByZWdyZXNzaW9uX3Rlc3RzL2lzc3VlXzExOC5weToxMwogICAgLy8gcmV0dXJuIFR1cGxlKCh2YWwxLCBTdHJpbmcoIiIpKSkKICAgIGJ5dGVjXzAgLy8gMHgwMDAzCiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHgwMDAwCiAgICBjb25jYXQKICAgIHJldHN1YgoKdmVyaWZ5X2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHJlZ3Jlc3Npb25fdGVzdHMvaXNzdWVfMTE4LnB5OjE0CiAgICAvLyByZXR1cm4gVHVwbGUoKHZhbDEsIFN0cmluZygiIikpKQogICAgYnl0ZWNfMCAvLyAweDAwMDMKICAgIGNvbmNhdAogICAgYnl0ZWNfMSAvLyAweDAwMDAKICAgIGNvbmNhdAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlZ3Jlc3Npb25fdGVzdHMuaXNzdWVfMTE4Lklzc3VlMTE4LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAEmAgIAAwIAAIgAAUOKAAExG0EAJ4AEvGbrYjYaAI4BAAIiiTEZFEQxGEQ2GgGIABiABBUffHVMULAjiTEZQAAGMRgURCOJIomKAQGAAQAiMRtUi/8iWYECE0EABShQKVCJKFApUIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/regression_tests/puya.log b/test_cases/regression_tests/puya.log index 2415b5d3f7..14b5ba92d7 100644 --- a/test_cases/regression_tests/puya.log +++ b/test_cases/regression_tests/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['regression_tests'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['regression_tests'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing regression_tests/out/module.awst debug: Sealing block@0: // L12 @@ -902,6 +902,7 @@ info: Writing regression_tests/out/Issue194.clear.bin info: Writing regression_tests/out/Issue194.approval.puya.map info: Writing regression_tests/out/Issue194.clear.puya.map info: Writing regression_tests/out/Issue118.arc32.json +info: Writing regression_tests/out/Issue118.arc56.json info: Writing regression_tests/out/Issue118.approval.teal info: Writing regression_tests/out/Issue118.clear.teal info: Writing regression_tests/out/Issue118.approval.bin diff --git a/test_cases/reinterpret_cast/out/Contract.arc56.json b/test_cases/reinterpret_cast/out/Contract.arc56.json new file mode 100644 index 0000000000..aaa9f26dbd --- /dev/null +++ b/test_cases/reinterpret_cast/out/Contract.arc56.json @@ -0,0 +1,120 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Contract", + "structs": {}, + "methods": [ + { + "name": "bytes_to_bool", + "args": [], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_bytes_to_biguint", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 43, + 71 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 88 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 46, + 74 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlaW50ZXJwcmV0X2Nhc3QuY29udHJhY3QuQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAwIDEKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMucmVpbnRlcnByZXRfY2FzdC5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDQwMzRiNzMxIDB4N2U5ZmQ0Y2YgLy8gbWV0aG9kICJieXRlc190b19ib29sKClib29sIiwgbWV0aG9kICJ0ZXN0X2J5dGVzX3RvX2JpZ3VpbnQoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ieXRlc190b19ib29sX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ieXRlc190b19iaWd1aW50X3JvdXRlQDMKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2J5dGVzX3RvX2Jvb2xfcm91dGVAMjoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYnl0ZXNfdG9fYm9vbAogICAgcHVzaGJ5dGVzIDB4MDAKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDIKICAgIHNldGJpdAogICAgcHVzaGJ5dGVzIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2J5dGVzX3RvX2JpZ3VpbnRfcm91dGVAMzoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6MTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIHRlc3RfYnl0ZXNfdG9fYmlndWludAogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDY6CiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMDoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6NAogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnJlaW50ZXJwcmV0X2Nhc3QuY29udHJhY3QuQ29udHJhY3QuYnl0ZXNfdG9fYm9vbCgpIC0+IHVpbnQ2NDoKYnl0ZXNfdG9fYm9vbDoKICAgIC8vIHJlaW50ZXJwcmV0X2Nhc3QvY29udHJhY3QucHk6Ni03CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIGJ5dGVzX3RvX2Jvb2woc2VsZikgLT4gYm9vbDoKICAgIHByb3RvIDAgMQogICAgLy8gcmVpbnRlcnByZXRfY2FzdC9jb250cmFjdC5weTo4CiAgICAvLyByZXR1cm4gYm9vbChCeXRlcygpKQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMucmVpbnRlcnByZXRfY2FzdC5jb250cmFjdC5Db250cmFjdC50ZXN0X2J5dGVzX3RvX2JpZ3VpbnQoKSAtPiB2b2lkOgp0ZXN0X2J5dGVzX3RvX2JpZ3VpbnQ6CiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjEwLTExCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfYnl0ZXNfdG9fYmlndWludChzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjEyCiAgICAvLyBhc3NlcnQgYnl0ZXNfdG9fYmlndWludCgpCiAgICBjYWxsc3ViIGJ5dGVzX3RvX2JpZ3VpbnQKICAgIHB1c2hieXRlcyAweAogICAgYiE9CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMucmVpbnRlcnByZXRfY2FzdC5jb250cmFjdC5ieXRlc190b19iaWd1aW50KCkgLT4gYnl0ZXM6CmJ5dGVzX3RvX2JpZ3VpbnQ6CiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjE1LTE2CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIGJ5dGVzX3RvX2JpZ3VpbnQoKSAtPiBCaWdVSW50OgogICAgcHJvdG8gMCAxCiAgICAvLyByZWludGVycHJldF9jYXN0L2NvbnRyYWN0LnB5OjE3CiAgICAvLyByZXR1cm4gQmlnVUludC5mcm9tX2J5dGVzKEJ5dGVzKCkpCiAgICBwdXNoYnl0ZXMgMHgKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnJlaW50ZXJwcmV0X2Nhc3QuY29udHJhY3QuQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiACAAGIAAFDigABMRtBAD+CAgRANLcxBH6f1M82GgCOAgACAB4iiTEZFEQxGESIACuAAQAiTwJUgAQVH3x1TFCwI4kxGRREMRhEiAAUI4kxGUAABjEYFEQjiSKJigABIomKAACIAAWAAKlEiYoAAYAAiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/reinterpret_cast/puya.log b/test_cases/reinterpret_cast/puya.log index 9085e1e385..722c93571c 100644 --- a/test_cases/reinterpret_cast/puya.log +++ b/test_cases/reinterpret_cast/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['reinterpret_cast'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['reinterpret_cast'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing reinterpret_cast/out/module.awst debug: Sealing block@0: // L12 @@ -817,6 +817,7 @@ debug: Inserted test_bytes_to_biguint_block@0.ops[6]: 'l-store-copy tmp%1#0 0' debug: Replaced test_bytes_to_biguint_block@0.ops[8]: 'v-load tmp%1#0' with 'l-load tmp%1#0' debug: Found 3 edge set/s for test_cases.reinterpret_cast.contract.Contract.__puya_arc4_router__ info: Writing reinterpret_cast/out/Contract.arc32.json +info: Writing reinterpret_cast/out/Contract.arc56.json info: Writing reinterpret_cast/out/Contract.approval.teal info: Writing reinterpret_cast/out/Contract.clear.teal info: Writing reinterpret_cast/out/Contract.approval.bin diff --git a/test_cases/scratch_slots/puya.log b/test_cases/scratch_slots/puya.log index 73829db12e..4711cae66b 100644 --- a/test_cases/scratch_slots/puya.log +++ b/test_cases/scratch_slots/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['scratch_slots'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['scratch_slots'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing scratch_slots/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/simple/puya.log b/test_cases/simple/puya.log index 26a8dda23a..c361c5453f 100644 --- a/test_cases/simple/puya.log +++ b/test_cases/simple/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['simple'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['simple'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing simple/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/simplish/puya.log b/test_cases/simplish/puya.log index 37818ecef2..028c89113b 100644 --- a/test_cases/simplish/puya.log +++ b/test_cases/simplish/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['simplish'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['simplish'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing simplish/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/ssa/puya.log b/test_cases/ssa/puya.log index 90aafdcda5..04cd3994c6 100644 --- a/test_cases/ssa/puya.log +++ b/test_cases/ssa/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['ssa'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['ssa'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing ssa/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/ssa2/puya.log b/test_cases/ssa2/puya.log index b49eb2a817..3f26bec6a5 100644 --- a/test_cases/ssa2/puya.log +++ b/test_cases/ssa2/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['ssa2'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['ssa2'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing ssa2/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/state_mutations/out/Contract.arc56.json b/test_cases/state_mutations/out/Contract.arc56.json new file mode 100644 index 0000000000..6957da3b15 --- /dev/null +++ b/test_cases/state_mutations/out/Contract.arc56.json @@ -0,0 +1,219 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Contract", + "structs": {}, + "methods": [ + { + "name": "append", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "modify", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get", + "args": [], + "returns": { + "type": "(uint64,string)[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 1 + }, + "local": { + "ints": 0, + "bytes": 1 + } + }, + "keys": { + "global": { + "glob": { + "keyType": "AVMString", + "valueType": "(uint64,string)[]", + "key": "Z2xvYg==" + } + }, + "local": { + "loc": { + "keyType": "AVMString", + "valueType": "(uint64,string)[]", + "key": "bG9j" + } + }, + "box": { + "box": { + "keyType": "AVMString", + "valueType": "(uint64,string)[]", + "key": "Ym94" + } + } + }, + "maps": { + "global": {}, + "local": {}, + "box": { + "map": { + "keyType": "AVMBytes", + "valueType": "(uint64,string)[]", + "prefix": "bWFw" + } + } + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [ + "OptIn" + ] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 85, + 97, + 109 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 213, + 393, + 429, + 516 + ], + "errorMessage": "check self.box exists" + }, + { + "pc": [ + 160, + 289, + 326, + 507 + ], + "errorMessage": "check self.glob exists" + }, + { + "pc": [ + 191, + 340, + 379, + 513 + ], + "errorMessage": "check self.loc exists for account" + }, + { + "pc": [ + 238, + 446, + 485, + 522 + ], + "errorMessage": "check self.map entry exists" + }, + { + "pc": [ + 534 + ], + "errorMessage": "expected box == global" + }, + { + "pc": [ + 528 + ], + "errorMessage": "expected local == global" + }, + { + "pc": [ + 538 + ], + "errorMessage": "expected map == global" + }, + { + "pc": [ + 140 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 88, + 100, + 112, + 145 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgaW50Y2Jsb2NrIDAgMSAyIDgKICAgIGJ5dGVjYmxvY2sgImJveCIgImdsb2IiICJsb2MiICJtYXAiIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQgMHgwMDAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweDUyNmU4YmJmIDB4OTVmZWYxM2QgMHgwYzI5NDQ0YiAvLyBtZXRob2QgImFwcGVuZCgpdm9pZCIsIG1ldGhvZCAibW9kaWZ5KCl2b2lkIiwgbWV0aG9kICJnZXQoKSh1aW50NjQsc3RyaW5nKVtdIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fYXBwZW5kX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fbW9kaWZ5X3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3JvdXRlQDQKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGVuZF9yb3V0ZUAyOgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgYXBwZW5kCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19tb2RpZnlfcm91dGVAMzoKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo0NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIG1vZGlmeQogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X3JvdXRlQDQ6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXQKICAgIHB1c2hieXRlcyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDc6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MjIKICAgIC8vIGNsYXNzIENvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBzd2l0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19vcHRfaW5AOQogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fX19hbGdvcHlfZGVmYXVsdF9jcmVhdGVAODoKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weToyMgogICAgLy8gY2xhc3MgQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX29wdF9pbkA5OgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjI5CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weToyOS0zMAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiT3B0SW4iXSkKICAgIC8vIGRlZiBvcHRfaW4oc2VsZikgLT4gTm9uZToKICAgIGNhbGxzdWIgb3B0X2luCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV9tdXRhdGlvbnMuY29udHJhY3QuQ29udHJhY3QuYXBwZW5kKCkgLT4gdm9pZDoKYXBwZW5kOgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM2LTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhcHBlbmQoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM4CiAgICAvLyBzdHJ1Y3QgPSBnZXRfc3RydWN0KCkKICAgIGNhbGxzdWIgZ2V0X3N0cnVjdAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjM5CiAgICAvLyBzZWxmLmdsb2IudmFsdWUuYXBwZW5kKHN0cnVjdC5jb3B5KCkpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgcHVzaGJ5dGVzIDB4MDAwMgogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIGRpZyAxCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICBkaWcgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIGJ5dGVjXzEgLy8gImdsb2IiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIHR4biBTZW5kZXIKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18yIC8vICJsb2MiCiAgICBhcHBfbG9jYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5sb2MgZXhpc3RzIGZvciBhY2NvdW50CiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICBkaWcgMwogICAgY2FsbHN1YiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzIgLy8gImxvYyIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQxCiAgICAvLyBzZWxmLmJveC52YWx1ZS5hcHBlbmQoc3RydWN0LmNvcHkoKSkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBzd2FwCiAgICBleHRyYWN0IDIgMAogICAgaW50Y18xIC8vIDEKICAgIGRpZyAzCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDIKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdLmFwcGVuZChzdHJ1Y3QuY29weSgpKQogICAgYnl0ZWNfMyAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBib3hfZ2V0CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5tYXAgZW50cnkgZXhpc3RzCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgc3dhcAogICAgZXh0cmFjdCAyIDAKICAgIGludGNfMSAvLyAxCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50CiAgICBieXRlY18zIC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGR1cAogICAgYm94X2RlbAogICAgcG9wCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5nZXRfc3RydWN0KCkgLT4gYnl0ZXM6CmdldF9zdHJ1Y3Q6CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NjQtNjUKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X3N0cnVjdCgpIC0+IE15U3RydWN0OgogICAgcHJvdG8gMCAxCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NjYtNjkKICAgIC8vIHJldHVybiBNeVN0cnVjdCgKICAgIC8vICAgICBiYXI9YXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYmF6PWFyYzQuU3RyaW5nKCJiYXoiKSwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDEwMDBhMDAwMzYyNjE3YQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV9tdXRhdGlvbnMuY29udHJhY3QuQ29udHJhY3QubW9kaWZ5KCkgLT4gdm9pZDoKbW9kaWZ5OgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQ0LTQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtb2RpZnkoc2VsZikgLT4gTm9uZToKICAgIHByb3RvIDAgMAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQ2CiAgICAvLyBzZWxmLmdsb2IudmFsdWVbMF0uYmF6ID0gYXJjNC5TdHJpbmcoIm1vZGlmaWVkIikKICAgIGludGNfMCAvLyAwCiAgICBieXRlY18xIC8vICJnbG9iIgogICAgYXBwX2dsb2JhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmdsb2IgZXhpc3RzCiAgICBkdXAKICAgIGV4dHJhY3QgMiAwCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMSAvLyAxCiAgICAtIC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIGludGNfMiAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18zIC8vIDgKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzAgLy8gMAogICAgc3dhcAogICAgZXh0cmFjdDMKICAgIGJ5dGVjIDQgLy8gMHgwMDA4NmQ2ZjY0Njk2NjY5NjU2NAogICAgY29uY2F0CiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIHN3YXAKICAgIGFwcF9nbG9iYWxfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDcKICAgIC8vIHNlbGYubG9jW1R4bi5zZW5kZXJdWzBdLmJheiA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICB0eG4gU2VuZGVyCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgYXBwX2xvY2FsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubG9jIGV4aXN0cyBmb3IgYWNjb3VudAogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBieXRlYyA0IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIGNvbmNhdAogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIHN3YXAKICAgIGludGNfMCAvLyAwCiAgICBjYWxsc3ViIGR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQKICAgIHR4biBTZW5kZXIKICAgIGJ5dGVjXzIgLy8gImxvYyIKICAgIHVuY292ZXIgMgogICAgYXBwX2xvY2FsX3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBzZWxmLmJveC52YWx1ZVswXS5iYXogPSBhcmM0LlN0cmluZygibW9kaWZpZWQiKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgZHVwCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBpbnRjXzEgLy8gMQogICAgLSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICBpbnRjXzIgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIHVuY292ZXIgMgogICAgc2VsZWN0CiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMyAvLyA4CiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18wIC8vIDAKICAgIHN3YXAKICAgIGV4dHJhY3QzCiAgICBieXRlYyA0IC8vIDB4MDAwODZkNmY2NDY5NjY2OTY1NjQKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYm94IGV4aXN0cwogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBzd2FwCiAgICBib3hfcHV0CiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NDkKICAgIC8vIHNlbGYubWFwW1R4bi5zZW5kZXJdWzBdLmJheiA9IGFyYzQuU3RyaW5nKCJtb2RpZmllZCIpCiAgICBieXRlY18zIC8vICJtYXAiCiAgICB0eG4gU2VuZGVyCiAgICBjb25jYXQKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLm1hcCBlbnRyeSBleGlzdHMKICAgIGR1cAogICAgZXh0cmFjdCAyIDAKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgaW50Y18xIC8vIDEKICAgIC0gLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgaW50Y18yIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICB1bmNvdmVyIDIKICAgIHNlbGVjdAogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzMgLy8gOAogICAgZXh0cmFjdF91aW50MTYKICAgIGludGNfMCAvLyAwCiAgICBzd2FwCiAgICBleHRyYWN0MwogICAgYnl0ZWMgNCAvLyAweDAwMDg2ZDZmNjQ2OTY2Njk2NTY0CiAgICBjb25jYXQKICAgIGJ5dGVjXzMgLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgc3dhcAogICAgaW50Y18wIC8vIDAKICAgIGNhbGxzdWIgZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudAogICAgYnl0ZWNfMyAvLyAibWFwIgogICAgdHhuIFNlbmRlcgogICAgY29uY2F0CiAgICBkdXAKICAgIGJveF9kZWwKICAgIHBvcAogICAgc3dhcAogICAgYm94X3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV9tdXRhdGlvbnMuY29udHJhY3QuQ29udHJhY3QuZ2V0KCkgLT4gYnl0ZXM6CmdldDoKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo1MS01MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZ2V0KHNlbGYpIC0+IE15QXJyYXk6CiAgICBwcm90byAwIDEKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo1MwogICAgLy8gYTEgPSBzZWxmLmdsb2IudmFsdWUuY29weSgpCiAgICBpbnRjXzAgLy8gMAogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5nbG9iIGV4aXN0cwogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjU0CiAgICAvLyBhMiA9IHNlbGYubG9jW1R4bi5zZW5kZXJdLmNvcHkoKQogICAgdHhuIFNlbmRlcgogICAgaW50Y18wIC8vIDAKICAgIGJ5dGVjXzIgLy8gImxvYyIKICAgIGFwcF9sb2NhbF9nZXRfZXgKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmxvYyBleGlzdHMgZm9yIGFjY291bnQKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo1NQogICAgLy8gYTMgPSBzZWxmLmJveC52YWx1ZS5jb3B5KCkKICAgIGJ5dGVjXzAgLy8gImJveCIKICAgIGJveF9nZXQKICAgIGFzc2VydCAvLyBjaGVjayBzZWxmLmJveCBleGlzdHMKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTo1NgogICAgLy8gYTQgPSBzZWxmLm1hcFtUeG4uc2VuZGVyXS5jb3B5KCkKICAgIGJ5dGVjXzMgLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgYm94X2dldAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYubWFwIGVudHJ5IGV4aXN0cwogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjU4CiAgICAvLyBhc3NlcnQgYTEgPT0gYTIsICJleHBlY3RlZCBsb2NhbCA9PSBnbG9iYWwiCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICA9PQogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGxvY2FsID09IGdsb2JhbAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgYTEgPT0gYTMsICJleHBlY3RlZCBib3ggPT0gZ2xvYmFsIgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBib3ggPT0gZ2xvYmFsCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NjAKICAgIC8vIGFzc2VydCBhMSA9PSBhNCwgImV4cGVjdGVkIG1hcCA9PSBnbG9iYWwiCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydCAvLyBleHBlY3RlZCBtYXAgPT0gZ2xvYmFsCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6NjEKICAgIC8vIHJldHVybiBhMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV9tdXRhdGlvbnMuY29udHJhY3QuQ29udHJhY3Qub3B0X2luKCkgLT4gdm9pZDoKb3B0X2luOgogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjI5LTMwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdKQogICAgLy8gZGVmIG9wdF9pbihzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9tdXRhdGlvbnMvY29udHJhY3QucHk6MzEKICAgIC8vIHNlbGYuZ2xvYi52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMSAvLyAiZ2xvYiIKICAgIGJ5dGVjIDUgLy8gMHgwMDAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjMyCiAgICAvLyBzZWxmLmJveC52YWx1ZSA9IE15QXJyYXkoKQogICAgYnl0ZWNfMCAvLyAiYm94IgogICAgYm94X2RlbAogICAgcG9wCiAgICBieXRlY18wIC8vICJib3giCiAgICBieXRlYyA1IC8vIDB4MDAwMAogICAgYm94X3B1dAogICAgLy8gc3RhdGVfbXV0YXRpb25zL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBzZWxmLmxvY1tUeG4uc2VuZGVyXSA9IE15QXJyYXkoKQogICAgdHhuIFNlbmRlcgogICAgYnl0ZWNfMiAvLyAibG9jIgogICAgYnl0ZWMgNSAvLyAweDAwMDAKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHN0YXRlX211dGF0aW9ucy9jb250cmFjdC5weTozNAogICAgLy8gc2VsZi5tYXBbVHhuLnNlbmRlcl0gPSBNeUFycmF5KCkKICAgIGJ5dGVjXzMgLy8gIm1hcCIKICAgIHR4biBTZW5kZXIKICAgIGNvbmNhdAogICAgZHVwCiAgICBib3hfZGVsCiAgICBwb3AKICAgIGJ5dGVjIDUgLy8gMHgwMDAwCiAgICBib3hfcHV0CiAgICByZXRzdWIKCgovLyBfcHV5YV9saWIuYXJjNC5keW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQoYXJyYXlfaXRlbXNfY291bnQ6IHVpbnQ2NCwgYXJyYXlfaGVhZF9hbmRfdGFpbDogYnl0ZXMsIG5ld19pdGVtc19jb3VudDogdWludDY0LCBuZXdfaGVhZF9hbmRfdGFpbDogYnl0ZXMpIC0+IGJ5dGVzOgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnQ6CiAgICBwcm90byA0IDEKICAgIHB1c2hieXRlcyAiIgogICAgZHVwCiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMiAvLyAyCiAgICAqCiAgICBpbnRjXzAgLy8gMAoKZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2Zvcl9oZWFkZXJAMToKICAgIGZyYW1lX2RpZyA0CiAgICBmcmFtZV9kaWcgMwogICAgPAogICAgYnogZHluYW1pY19hcnJheV9jb25jYXRfZHluYW1pY19lbGVtZW50X2FmdGVyX2ZvckA0CiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyA0CiAgICBkdXAKICAgIGNvdmVyIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBmcmFtZV9kaWcgMgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAxCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGZyYW1lX2J1cnkgMQogICAgaW50Y18yIC8vIDIKICAgICsKICAgIGZyYW1lX2J1cnkgNAogICAgYiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckAxCgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDQ6CiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgZnJhbWVfYnVyeSAwCiAgICBpbnRjXzAgLy8gMAogICAgZnJhbWVfYnVyeSA0CgpkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfZm9yX2hlYWRlckA1OgogICAgZnJhbWVfZGlnIDQKICAgIGZyYW1lX2RpZyAyCiAgICA8CiAgICBieiBkeW5hbWljX2FycmF5X2NvbmNhdF9keW5hbWljX2VsZW1lbnRfYWZ0ZXJfZm9yQDgKICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDQKICAgIGR1cAogICAgY292ZXIgMgogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAwCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZnJhbWVfYnVyeSAxCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSA0CiAgICBiIGR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDUKCmR5bmFtaWNfYXJyYXlfY29uY2F0X2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JAODoKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIDEKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0zCiAgICBmcmFtZV9kaWcgMwogICAgZnJhbWVfZGlnIDAKICAgIHN1YnN0cmluZzMKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgY29uY2F0CiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LmR5bmFtaWNfYXJyYXlfcmVwbGFjZV9keW5hbWljX2VsZW1lbnQoc291cmNlOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0KSAtPiBieXRlczoKZHluYW1pY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDMgMQogICAgZnJhbWVfZGlnIC0zCiAgICBzdWJzdHJpbmcgMCAyCiAgICBkdXAKICAgIGJ0b2kKICAgIGZyYW1lX2RpZyAtMwogICAgZXh0cmFjdCAyIDAKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICB1bmNvdmVyIDMKICAgIGNhbGxzdWIgc3RhdGljX2FycmF5X3JlcGxhY2VfZHluYW1pY19lbGVtZW50CiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIF9wdXlhX2xpYi5hcmM0LnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudChhcnJheV9oZWFkX2FuZF90YWlsOiBieXRlcywgbmV3X2l0ZW06IGJ5dGVzLCBpbmRleDogdWludDY0LCBhcnJheV9sZW5ndGg6IHVpbnQ2NCkgLT4gYnl0ZXM6CnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudDoKICAgIHByb3RvIDQgMQogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzIgLy8gMgogICAgKgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzEgLy8gMQogICAgKwogICAgaW50Y18yIC8vIDIKICAgICoKICAgIGR1cAogICAgY292ZXIgMgogICAgZnJhbWVfZGlnIC00CiAgICBzd2FwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZnJhbWVfZGlnIC00CiAgICBsZW4KICAgIGZyYW1lX2RpZyAtMQogICAgZnJhbWVfZGlnIC0yCiAgICAtCiAgICBpbnRjXzEgLy8gMQogICAgLQogICAgZGlnIDEKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGR1cAogICAgZGlnIDMKICAgIC0KICAgIGNvdmVyIDMKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBjb3ZlciAzCiAgICBmcmFtZV9kaWcgLTQKICAgIGludGNfMCAvLyAwCiAgICB1bmNvdmVyIDQKICAgIHN1YnN0cmluZzMKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTQKICAgIHVuY292ZXIgMgogICAgdW5jb3ZlciAzCiAgICBzdWJzdHJpbmczCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgICoKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDE6CiAgICBmcmFtZV9kaWcgMAogICAgZnJhbWVfZGlnIDQKICAgIDwKICAgIGJ6IHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANAogICAgZnJhbWVfZGlnIDMKICAgIGR1cAogICAgZnJhbWVfZGlnIDAKICAgIGR1cAogICAgY292ZXIgMwogICAgZXh0cmFjdF91aW50MTYKICAgIGZyYW1lX2RpZyAyCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgLQogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGRpZyAyCiAgICBzd2FwCiAgICByZXBsYWNlMwogICAgZnJhbWVfYnVyeSAzCiAgICBpbnRjXzIgLy8gMgogICAgKwogICAgZnJhbWVfYnVyeSAwCiAgICBiIHN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9mb3JfaGVhZGVyQDEKCnN0YXRpY19hcnJheV9yZXBsYWNlX2R5bmFtaWNfZWxlbWVudF9hZnRlcl9mb3JANDoKICAgIGZyYW1lX2RpZyAzCiAgICBmcmFtZV9idXJ5IDAKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX211dGF0aW9ucy5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CiAEAAECCCYGA2JveARnbG9iA2xvYwNtYXAKAAhtb2RpZmllZAIAAIgAAUOKAAExG0EAS4IDBFJui78Elf7xPQQMKURLNhoAjgMAAgAOABoiiTEZFEQxGESIADsjiTEZFEQxGESIALMjiTEZFEQxGESIAYGABBUffHVMULAjiTEZjQIAAgAIIokxGBREI4kxGESIAYcjiYoAAIgAaSIpZUSAAgACTwJQSwEiWU8CVwIAI0sDiAGEKUxnMQAiKmNESSJZTFcCACNLA4gBbjEAKk8CZii+REkiWUxXAgAjSwOIAVgovEgoTL8rMQBQvkRJIllMVwIAI08DiAE/KzEAUEm8SEy/iYoAAYAPAAAAAAAAAAEACgADYmF6iYoAACIpZURJVwIASSJZTwIiWSMJSwIVSwMkWU8CTVJJJVkiTFgnBFAiKWVETCKIAXApTGcxACIqY0RJVwIASSJZTwIiWSMJSwIVSwMkWU8CTVJJJVkiTFgnBFAxACIqY0RMIogBOzEAKk8CZii+RElXAgBJIllPAiJZIwlLAhVLAyRZTwJNUkklWSJMWCcEUCi+REwiiAEJKLxIKEy/KzEAUL5ESVcCAEkiWU8CIlkjCUsCFUsDJFlPAk1SSSVZIkxYJwRQKzEAUL5ETCKIANErMQBQSbxITL+JigABIillRDEAIipjRCi+RCsxAFC+REsDTwMSREsCTwISREsBEkSJigAAKScFZyi8SCgnBb8xAConBWYrMQBQSbxIJwW/iYoEAYAASYv+JAuL/CQLIosEiwMMQQAci/2LBElOAlmLAggWVwYCiwFMUIwBJAiMBEL/3Iv9FYwAIowEiwSLAgxBAByL/4sESU4CWYsACBZXBgKLAUxQjAEkCIwEQv/ci/yL/ggWVwYCiwFQi/2LA4sAUlCL/xWL/4sCTwJSUIwAiYoDAYv9UQACSReL/VcCAIv+i/9PA4gAAlCJigQBi/4kC4v8TFmL/iMIJAtJTgKL/ExZi/wVi/+L/gkjCUsBTwNPAk1JSwMJTgOL/RVOA4v8Ik8EUov9UIv8TwJPA1JQi/8kC4sAiwQMQQAgiwNJiwBJTgNZiwIIiwEJFlcGAksCTF2MAyQIjABC/9iLA4wAiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/state_mutations/puya.log b/test_cases/state_mutations/puya.log index 699eeb65a1..6a43c59fe7 100644 --- a/test_cases/state_mutations/puya.log +++ b/test_cases/state_mutations/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_mutations'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_mutations'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing state_mutations/out/module.awst debug: Sealing block@0: // L12 @@ -2081,6 +2081,7 @@ debug: _puya_lib.arc4.dynamic_array_concat_dynamic_element f-stack on first stor debug: _puya_lib.arc4.static_array_replace_dynamic_element f-stack entry: [] debug: _puya_lib.arc4.static_array_replace_dynamic_element f-stack on first store: ['head_offset#0', 'original_item_length#0', 'new_item_length#0', 'new_head_and_tail#0', 'tmp%7#0'] info: Writing state_mutations/out/Contract.arc32.json +info: Writing state_mutations/out/Contract.arc56.json info: Writing state_mutations/out/Contract.approval.teal info: Writing state_mutations/out/Contract.clear.teal info: Writing state_mutations/out/Contract.approval.bin diff --git a/test_cases/state_proxies/out/StateProxyContract.arc56.json b/test_cases/state_proxies/out/StateProxyContract.arc56.json new file mode 100644 index 0000000000..5d62db24cc --- /dev/null +++ b/test_cases/state_proxies/out/StateProxyContract.arc56.json @@ -0,0 +1,120 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "StateProxyContract", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "OptIn" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 3, + "bytes": 0 + }, + "local": { + "ints": 2, + "bytes": 0 + } + }, + "keys": { + "global": { + "global1": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "ZzE=", + "desc": "g1 description" + }, + "global2": { + "keyType": "AVMBytes", + "valueType": "AVMUint64", + "key": "ZzI=", + "desc": "g2 description" + } + }, + "local": { + "local1": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bDE=", + "desc": "l1 description" + }, + "local2": { + "keyType": "AVMBytes", + "valueType": "AVMUint64", + "key": "bDI=", + "desc": "l2 description" + } + }, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 44 + ], + "errorMessage": "OnCompletion is OptIn" + }, + { + "pc": [ + 48 + ], + "errorMessage": "is creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3Byb3hpZXMuY29udHJhY3QuU3RhdGVQcm94eUNvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYm56IG1haW5fZW50cnlwb2ludEAyCiAgICBjYWxsc3ViIF9faW5pdF9fCgptYWluX2VudHJ5cG9pbnRAMjoKICAgIGNhbGxzdWIgX19wdXlhX2FyYzRfcm91dGVyX18KICAgIHJldHVybgoKCi8vIHRlc3RfY2FzZXMuc3RhdGVfcHJveGllcy5jb250cmFjdC5TdGF0ZVByb3h5Q29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToxMgogICAgLy8gY2xhc3MgU3RhdGVQcm94eUNvbnRyYWN0KEFSQzRDb250cmFjdCwgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGdsb2JhbF91aW50cz0zKSk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHB1c2hieXRlcyAweDRjNWM2MWJhIC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fY3JlYXRlX3JvdXRlQDIKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2NyZWF0ZV9yb3V0ZUAyOgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToyNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdLCBjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgaW50Y18xIC8vIE9wdEluCiAgICA9PQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBPcHRJbgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgY2FsbHN1YiBjcmVhdGUKICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VANjoKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MTIKICAgIC8vIGNsYXNzIFN0YXRlUHJveHlDb250cmFjdChBUkM0Q29udHJhY3QsIHN0YXRlX3RvdGFscz1TdGF0ZVRvdGFscyhnbG9iYWxfdWludHM9MykpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMuc3RhdGVfcHJveGllcy5jb250cmFjdC5TdGF0ZVByb3h5Q29udHJhY3QuY3JlYXRlKCkgLT4gdm9pZDoKY3JlYXRlOgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToyNS0yNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJPcHRJbiJdLCBjcmVhdGU9InJlcXVpcmUiKQogICAgLy8gZGVmIGNyZWF0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjI3CiAgICAvLyBzZWxmLmdsb2JhbDEudmFsdWUgPSBVSW50NjQoMSkKICAgIHB1c2hieXRlcyAiZzEiCiAgICBpbnRjXzEgLy8gMQogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MjgKICAgIC8vIHNlbGYubG9jYWwxW1R4bi5zZW5kZXJdID0gVUludDY0KDIpCiAgICB0eG4gU2VuZGVyCiAgICBwdXNoYnl0ZXMgImwxIgogICAgcHVzaGludCAyIC8vIDIKICAgIGFwcF9sb2NhbF9wdXQKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MjkKICAgIC8vIHNlbGYubG9jYWwyW1R4bi5zZW5kZXJdID0gVUludDY0KDMpCiAgICB0eG4gU2VuZGVyCiAgICBwdXNoYnl0ZXMgMHg2YzMyCiAgICBwdXNoaW50IDMgLy8gMwogICAgYXBwX2xvY2FsX3B1dAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV9wcm94aWVzLmNvbnRyYWN0LlN0YXRlUHJveHlDb250cmFjdC5fX2luaXRfXygpIC0+IHZvaWQ6Cl9faW5pdF9fOgogICAgLy8gc3RhdGVfcHJveGllcy9jb250cmFjdC5weToxMwogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MTcKICAgIC8vIHNlbGYuZ2xvYmFsMiA9IEdsb2JhbFN0YXRlW1VJbnQ2NF0oVUludDY0KDApLCBrZXk9YiJnMiIsIGRlc2NyaXB0aW9uPSJnMiBkZXNjcmlwdGlvbiIpCiAgICBwdXNoYnl0ZXMgMHg2NzMyCiAgICBpbnRjXzAgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MjEKICAgIC8vIGVsc2UgR2xvYmFsU3RhdGUoVUludDY0LCBrZXk9InRvd24iKQogICAgcHVzaGJ5dGVzcyAidG93biIgImZ1bmt5IiAvLyAidG93biIsICJmdW5reSIKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MjAKICAgIC8vIGlmIFR4bi5udW1fYXBwX2FyZ3MKICAgIHR4biBOdW1BcHBBcmdzCiAgICAvLyBzdGF0ZV9wcm94aWVzL2NvbnRyYWN0LnB5OjE5LTIxCiAgICAvLyBHbG9iYWxTdGF0ZShVSW50NjQsIGtleT0iZnVua3kiKQogICAgLy8gaWYgVHhuLm51bV9hcHBfYXJncwogICAgLy8gZWxzZSBHbG9iYWxTdGF0ZShVSW50NjQsIGtleT0idG93biIpCiAgICBzZWxlY3QKICAgIC8vIHN0YXRlX3Byb3hpZXMvY29udHJhY3QucHk6MjMKICAgIC8vIGZ1bmt5X3Rvd24udmFsdWUgPSBVSW50NjQoMTIzKQogICAgcHVzaGludCAxMjMgLy8gMTIzCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3Byb3hpZXMuY29udHJhY3QuU3RhdGVQcm94eUNvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAAExGEAAA4gAR4gAAUOKAAExG0EAHYAETFxhujYaAI4BAAIiiTEZIxJEMRgURIgABCOJIomKAACAAmcxI2cxAIACbDGBAmYxAIACbDKBA2aJigAAgAJnMiJnggIEdG93bgVmdW5reTEbTYF7Z4k=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/state_proxies/puya.log b/test_cases/state_proxies/puya.log index b5a9c9ed29..40bbd2f288 100644 --- a/test_cases/state_proxies/puya.log +++ b/test_cases/state_proxies/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_proxies'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_proxies'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing state_proxies/out/module.awst debug: Sealing block@0: // L12 @@ -582,6 +582,7 @@ debug: Replaced __init___block@0.ops[8]: 'v-load tmp%0#0' with 'l-load tmp%0#0' debug: Found 1 edge set/s for test_cases.state_proxies.contract.StateProxyContract.approval_program debug: Found 2 edge set/s for test_cases.state_proxies.contract.StateProxyContract.__puya_arc4_router__ info: Writing state_proxies/out/StateProxyContract.arc32.json +info: Writing state_proxies/out/StateProxyContract.arc56.json info: Writing state_proxies/out/StateProxyContract.approval.teal info: Writing state_proxies/out/StateProxyContract.clear.teal info: Writing state_proxies/out/StateProxyContract.approval.bin diff --git a/test_cases/state_totals/out/Contract.arc56.json b/test_cases/state_totals/out/Contract.arc56.json new file mode 100644 index 0000000000..9ed7befa91 --- /dev/null +++ b/test_cases/state_totals/out/Contract.arc56.json @@ -0,0 +1,85 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Contract", + "structs": {}, + "methods": [], + "state": { + "schema": { + "global": { + "ints": 3, + "bytes": 1 + }, + "local": { + "ints": 1, + "bytes": 1 + } + }, + "keys": { + "global": { + "global_one": { + "keyType": "AVMString", + "valueType": "AVMBytes", + "key": "Z2xvYmFsX29uZQ==" + } + }, + "local": { + "local_one": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "bG9jYWxfb25l" + } + }, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 21 + ], + "errorMessage": "is creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3RvdGFscy5jb250cmFjdC5Db250cmFjdC5hcHByb3ZhbF9wcm9ncmFtOgogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy5zdGF0ZV90b3RhbHMuY29udHJhY3QuQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gc3RhdGVfdG90YWxzL2NvbnRyYWN0LnB5OjYtOQogICAgLy8gY2xhc3MgQ29udHJhY3QoCiAgICAvLyAgICAgYXJjNC5BUkM0Q29udHJhY3QsCiAgICAvLyAgICAgc3RhdGVfdG90YWxzPVN0YXRlVG90YWxzKGxvY2FsX2J5dGVzPTEsIGdsb2JhbF91aW50cz1HTE9CQUxfVUlOVFMpLAogICAgLy8gKToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDYKICAgIC8vIHN0YXRlX3RvdGFscy9jb250cmFjdC5weToxNAogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChjcmVhdGU9InJlcXVpcmUiKQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgLy8gc3RhdGVfdG90YWxzL2NvbnRyYWN0LnB5OjE0LTE1CiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGNyZWF0ZT0icmVxdWlyZSIpCiAgICAvLyBkZWYgY3JlYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDY6CiAgICAvLyBzdGF0ZV90b3RhbHMvY29udHJhY3QucHk6Ni05CiAgICAvLyBjbGFzcyBDb250cmFjdCgKICAgIC8vICAgICBhcmM0LkFSQzRDb250cmFjdCwKICAgIC8vICAgICBzdGF0ZV90b3RhbHM9U3RhdGVUb3RhbHMobG9jYWxfYnl0ZXM9MSwgZ2xvYmFsX3VpbnRzPUdMT0JBTF9VSU5UUyksCiAgICAvLyApOgogICAgcHVzaGludCAwIC8vIDAKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnN0YXRlX3RvdGFscy5jb250cmFjdC5Db250cmFjdC5jbGVhcl9zdGF0ZV9wcm9ncmFtOgogICAgcHVzaGludCAxIC8vIDEKICAgIHJldHVybgo=" + }, + "byteCode": { + "approval": "CogAAUOKAAExG0AADDEZQAAHMRgURIEBiYEAiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/state_totals/puya.log b/test_cases/state_totals/puya.log index fdb99bd746..f5ba019f31 100644 --- a/test_cases/state_totals/puya.log +++ b/test_cases/state_totals/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_totals'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['state_totals'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing state_totals/out/module.awst debug: Sealing block@0: // L12 @@ -613,6 +613,7 @@ debug: Inserted __puya_arc4_router___create@3.ops[5]: 'l-store-copy tmp%4#0 0' debug: Replaced __puya_arc4_router___create@3.ops[7]: 'v-load tmp%4#0' with 'l-load tmp%4#0' debug: Found 1 edge set/s for test_cases.state_totals.contract.Contract.__puya_arc4_router__ info: Writing state_totals/out/Contract.arc32.json +info: Writing state_totals/out/Contract.arc56.json info: Writing state_totals/out/Contract.approval.teal info: Writing state_totals/out/Contract.clear.teal info: Writing state_totals/out/Contract.approval.bin diff --git a/test_cases/stress_tests/puya.log b/test_cases/stress_tests/puya.log index 5a3894b264..019260f70a 100644 --- a/test_cases/stress_tests/puya.log +++ b/test_cases/stress_tests/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['stress_tests'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['stress_tests'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing stress_tests/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/string_ops/puya.log b/test_cases/string_ops/puya.log index ff48d6b41d..735766ef63 100644 --- a/test_cases/string_ops/puya.log +++ b/test_cases/string_ops/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['string_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['string_ops'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing string_ops/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/stubs/puya.log b/test_cases/stubs/puya.log index 9aa4921bc1..d13237c7c6 100644 --- a/test_cases/stubs/puya.log +++ b/test_cases/stubs/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['stubs'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['stubs'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing stubs/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/template_variables/out/TemplateVariablesContract.arc56.json b/test_cases/template_variables/out/TemplateVariablesContract.arc56.json new file mode 100644 index 0000000000..0060b631ce --- /dev/null +++ b/test_cases/template_variables/out/TemplateVariablesContract.arc56.json @@ -0,0 +1,148 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "TemplateVariablesContract", + "structs": {}, + "methods": [ + { + "name": "get_bytes", + "args": [], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "get_big_uint", + "args": [], + "returns": { + "type": "uint512" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [ + "DeleteApplication", + "UpdateApplication" + ] + }, + "events": [], + "templateVariables": { + "SOME_BYTES": { + "type": "AVMBytes", + "value": "" + }, + "SOME_BIG_UINT": { + "type": "AVMBytes", + "value": "" + }, + "UPDATABLE": { + "type": "AVMUint64", + "value": "AAAAAAAAAAA=" + }, + "DELETABLE": { + "type": "AVMUint64", + "value": "AAAAAAAAAAA=" + } + }, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 55, + 79 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 113 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 58, + 82, + 118, + 126 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 147 + ], + "errorMessage": "overflow" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRlbXBsYXRlX3ZhcmlhYmxlcy5jb250cmFjdC5UZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0LmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwIDY0IFRNUExfVVBEQVRBQkxFIFRNUExfREVMRVRBQkxFCiAgICBieXRlY2Jsb2NrIDB4MTUxZjdjNzUgVE1QTF9TT01FX0JZVEVTIFRNUExfU09NRV9CSUdfVUlOVAogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50ZW1wbGF0ZV92YXJpYWJsZXMuY29udHJhY3QuVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdC5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6NQogICAgLy8gY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANgogICAgcHVzaGJ5dGVzcyAweDJmY2FkZGY2IDB4MzdmNjRjZjMgLy8gbWV0aG9kICJnZXRfYnl0ZXMoKWJ5dGVbXSIsIG1ldGhvZCAiZ2V0X2JpZ191aW50KCl1aW50NTEyIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2J5dGVzX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZ2V0X2JpZ191aW50X3JvdXRlQDMKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9ieXRlc19yb3V0ZUAyOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjYKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGdldF9ieXRlcwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dldF9iaWdfdWludF9yb3V0ZUAzOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjEwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgY2FsbHN1YiBnZXRfYmlnX3VpbnQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjUKICAgIC8vIGNsYXNzIFRlbXBsYXRlVmFyaWFibGVzQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgc3dpdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDEyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fb25fdXBkYXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fb25fZGVsZXRlQDkKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX19fYWxnb3B5X2RlZmF1bHRfY3JlYXRlQDc6CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6NQogICAgLy8gY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19vbl91cGRhdGVAODoKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weToxNQogICAgLy8gQGFyYzQuYmFyZW1ldGhvZChhbGxvd19hY3Rpb25zPVsiVXBkYXRlQXBwbGljYXRpb24iXSkKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTUtMTYKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgb25fdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBjYWxsc3ViIG9uX3VwZGF0ZQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fb25fZGVsZXRlQDk6CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTkKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIkRlbGV0ZUFwcGxpY2F0aW9uIl0pCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjE5LTIwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIG9uX2RlbGV0ZShzZWxmKSAtPiBOb25lOgogICAgY2FsbHN1YiBvbl9kZWxldGUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTI6CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6NQogICAgLy8gY2xhc3MgVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50ZW1wbGF0ZV92YXJpYWJsZXMuY29udHJhY3QuVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdC5nZXRfYnl0ZXMoKSAtPiBieXRlczoKZ2V0X2J5dGVzOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjYtNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBnZXRfYnl0ZXMoc2VsZikgLT4gQnl0ZXM6CiAgICBwcm90byAwIDEKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weTo4CiAgICAvLyByZXR1cm4gVGVtcGxhdGVWYXJbQnl0ZXNdKCJTT01FX0JZVEVTIikKICAgIGJ5dGVjXzEgLy8gVE1QTF9TT01FX0JZVEVTCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRlbXBsYXRlX3ZhcmlhYmxlcy5jb250cmFjdC5UZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0LmdldF9iaWdfdWludCgpIC0+IGJ5dGVzOgpnZXRfYmlnX3VpbnQ6CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTAtMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZ2V0X2JpZ191aW50KHNlbGYpIC0+IFVJbnQ1MTI6CiAgICBwcm90byAwIDEKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weToxMgogICAgLy8geCA9IFRlbXBsYXRlVmFyW0JpZ1VJbnRdKCJTT01FX0JJR19VSU5UIikKICAgIGJ5dGVjXzIgLy8gVE1QTF9TT01FX0JJR19VSU5UCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTMKICAgIC8vIHJldHVybiBVSW50NTEyKHgpCiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICBifAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50ZW1wbGF0ZV92YXJpYWJsZXMuY29udHJhY3QuVGVtcGxhdGVWYXJpYWJsZXNDb250cmFjdC5vbl91cGRhdGUoKSAtPiB2b2lkOgpvbl91cGRhdGU6CiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MTUtMTYKICAgIC8vIEBhcmM0LmJhcmVtZXRob2QoYWxsb3dfYWN0aW9ucz1bIlVwZGF0ZUFwcGxpY2F0aW9uIl0pCiAgICAvLyBkZWYgb25fdXBkYXRlKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHRlbXBsYXRlX3ZhcmlhYmxlcy9jb250cmFjdC5weToxNwogICAgLy8gYXNzZXJ0IFRlbXBsYXRlVmFyW2Jvb2xdKCJVUERBVEFCTEUiKQogICAgaW50Y18zIC8vIFRNUExfVVBEQVRBQkxFCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudGVtcGxhdGVfdmFyaWFibGVzLmNvbnRyYWN0LlRlbXBsYXRlVmFyaWFibGVzQ29udHJhY3Qub25fZGVsZXRlKCkgLT4gdm9pZDoKb25fZGVsZXRlOgogICAgLy8gdGVtcGxhdGVfdmFyaWFibGVzL2NvbnRyYWN0LnB5OjE5LTIwCiAgICAvLyBAYXJjNC5iYXJlbWV0aG9kKGFsbG93X2FjdGlvbnM9WyJEZWxldGVBcHBsaWNhdGlvbiJdKQogICAgLy8gZGVmIG9uX2RlbGV0ZShzZWxmKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICAvLyB0ZW1wbGF0ZV92YXJpYWJsZXMvY29udHJhY3QucHk6MjEKICAgIC8vIGFzc2VydCBUZW1wbGF0ZVZhcltVSW50NjRdKCJERUxFVEFCTEUiKQogICAgaW50YyA0IC8vIFRNUExfREVMRVRBQkxFCiAgICBhc3NlcnQKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRlbXBsYXRlX3ZhcmlhYmxlcy5jb250cmFjdC5UZW1wbGF0ZVZhcmlhYmxlc0NvbnRyYWN0LmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAFAQBAAAAmAwQVH3x1AACIAAFDigABMRtBAD+CAgQvyt32BDf2TPM2GgCOAgACABojiTEZFEQxGESIAEhJFRZXBgJMUChMULAiiTEZFEQxGESIADUoTFCwIokxGY0GAAIAGAAYABgACAAQI4kxGBREIokxGESIAB4iiTEYRIgAHCKJI4mKAAEpiYoAASpJFSQORCSvq4mKAAAlRImKAAAhBESJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/template_variables/puya.log b/test_cases/template_variables/puya.log index 75ce877b7c..fb6f2f7eec 100644 --- a/test_cases/template_variables/puya.log +++ b/test_cases/template_variables/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'SOME_BYTES': b'', 'SOME_BIG_UINT': b'', 'UPDATABLE': 0, 'DELETABLE': 0}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['template_variables'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={'SOME_BYTES': b'', 'SOME_BIG_UINT': b'', 'UPDATABLE': 0, 'DELETABLE': 0}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['template_variables'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing template_variables/out/module.awst debug: Sealing block@0: // L12 @@ -722,6 +722,7 @@ debug: Inserted get_big_uint_block@0.ops[4]: 'l-store-copy x#0 0' debug: Replaced get_big_uint_block@0.ops[19]: 'v-load x#0' with 'l-load x#0' debug: Found 3 edge set/s for test_cases.template_variables.contract.TemplateVariablesContract.__puya_arc4_router__ info: Writing template_variables/out/TemplateVariablesContract.arc32.json +info: Writing template_variables/out/TemplateVariablesContract.arc56.json info: Writing template_variables/out/TemplateVariablesContract.approval.teal info: Writing template_variables/out/TemplateVariablesContract.clear.teal info: Writing template_variables/out/TemplateVariablesContract.approval.bin diff --git a/test_cases/too_many_permutations/puya.log b/test_cases/too_many_permutations/puya.log index 3071ef21b3..5a0333e4d6 100644 --- a/test_cases/too_many_permutations/puya.log +++ b/test_cases/too_many_permutations/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['too_many_permutations'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['too_many_permutations'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing too_many_permutations/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/transaction/out/TransactionContract.arc56.json b/test_cases/transaction/out/TransactionContract.arc56.json new file mode 100644 index 0000000000..61ead66035 --- /dev/null +++ b/test_cases/transaction/out/TransactionContract.arc56.json @@ -0,0 +1,747 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "TransactionContract", + "structs": {}, + "methods": [ + { + "name": "create", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "pay", + "args": [ + { + "type": "pay", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "key", + "args": [ + { + "type": "keyreg", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "asset_config", + "args": [ + { + "type": "acfg", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "asset_transfer", + "args": [ + { + "type": "axfer", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "asset_freeze", + "args": [ + { + "type": "afrz", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "application_call", + "args": [ + { + "type": "appl", + "name": "txn" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "multiple_txns", + "args": [ + { + "type": "appl", + "name": "txn1" + }, + { + "type": "appl", + "name": "txn2" + }, + { + "type": "appl", + "name": "txn3" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "any_txn", + "args": [ + { + "type": "txn", + "name": "txn1" + }, + { + "type": "txn", + "name": "txn2" + }, + { + "type": "txn", + "name": "txn3" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "group_init", + "args": [ + { + "type": "txn", + "name": "txn1" + }, + { + "type": "txn", + "name": "txn2" + }, + { + "type": "txn", + "name": "txn3" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 101, + 111, + 133, + 155, + 177, + 200, + 223, + 246, + 291, + 315 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 362 + ], + "errorMessage": "Payment should be for >1000 micro algos" + }, + { + "pc": [ + 353 + ], + "errorMessage": "Payment should be for this app" + }, + { + "pc": [ + 752 + ], + "errorMessage": "accounts(0)" + }, + { + "pc": [ + 743 + ], + "errorMessage": "app_args(0)" + }, + { + "pc": [ + 658 + ], + "errorMessage": "app_id" + }, + { + "pc": [ + 679 + ], + "errorMessage": "approval_program" + }, + { + "pc": [ + 771 + ], + "errorMessage": "approval_program_pages(0)" + }, + { + "pc": [ + 764 + ], + "errorMessage": "apps(0)" + }, + { + "pc": [ + 593 + ], + "errorMessage": "asset_amount" + }, + { + "pc": [ + 617 + ], + "errorMessage": "asset_close_to" + }, + { + "pc": [ + 530 + ], + "errorMessage": "asset_name" + }, + { + "pc": [ + 609 + ], + "errorMessage": "asset_receiver" + }, + { + "pc": [ + 601 + ], + "errorMessage": "asset_sender" + }, + { + "pc": [ + 758 + ], + "errorMessage": "assets(0)" + }, + { + "pc": [ + 574 + ], + "errorMessage": "clawback" + }, + { + "pc": [ + 685 + ], + "errorMessage": "clear_state_program" + }, + { + "pc": [ + 778 + ], + "errorMessage": "clear_state_program_pages(0)" + }, + { + "pc": [ + 370 + ], + "errorMessage": "close_remainder_to" + }, + { + "pc": [ + 503 + ], + "errorMessage": "config_asset" + }, + { + "pc": [ + 513 + ], + "errorMessage": "decimals" + }, + { + "pc": [ + 518 + ], + "errorMessage": "default_frozen" + }, + { + "pc": [ + 720 + ], + "errorMessage": "extra_program_pages" + }, + { + "pc": [ + 393 + ], + "errorMessage": "fee" + }, + { + "pc": [ + 423 + ], + "errorMessage": "first_valid" + }, + { + "pc": [ + 566 + ], + "errorMessage": "freeze" + }, + { + "pc": [ + 639 + ], + "errorMessage": "freeze_account" + }, + { + "pc": [ + 631 + ], + "errorMessage": "freeze_asset" + }, + { + "pc": [ + 644 + ], + "errorMessage": "frozen" + }, + { + "pc": [ + 705 + ], + "errorMessage": "global_num_bytes" + }, + { + "pc": [ + 700 + ], + "errorMessage": "global_num_uint" + }, + { + "pc": [ + 418 + ], + "errorMessage": "group_index" + }, + { + "pc": [ + 105 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 114, + 136, + 158, + 180, + 203, + 226, + 249, + 294, + 318 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 726 + ], + "errorMessage": "last_log" + }, + { + "pc": [ + 428 + ], + "errorMessage": "last_valid" + }, + { + "pc": [ + 434 + ], + "errorMessage": "lease" + }, + { + "pc": [ + 715 + ], + "errorMessage": "local_num_bytes" + }, + { + "pc": [ + 710 + ], + "errorMessage": "local_num_uint" + }, + { + "pc": [ + 550 + ], + "errorMessage": "manager" + }, + { + "pc": [ + 542 + ], + "errorMessage": "metadata_hash" + }, + { + "pc": [ + 483 + ], + "errorMessage": "non_participation" + }, + { + "pc": [ + 412 + ], + "errorMessage": "note" + }, + { + "pc": [ + 673 + ], + "errorMessage": "num_accounts" + }, + { + "pc": [ + 668 + ], + "errorMessage": "num_app_args" + }, + { + "pc": [ + 731 + ], + "errorMessage": "num_approval_program_pages" + }, + { + "pc": [ + 695 + ], + "errorMessage": "num_apps" + }, + { + "pc": [ + 690 + ], + "errorMessage": "num_assets" + }, + { + "pc": [ + 736 + ], + "errorMessage": "num_clear_state_program_pages" + }, + { + "pc": [ + 663 + ], + "errorMessage": "on_completion" + }, + { + "pc": [ + 442 + ], + "errorMessage": "rekey_to" + }, + { + "pc": [ + 558 + ], + "errorMessage": "reserve" + }, + { + "pc": [ + 463 + ], + "errorMessage": "selection_key" + }, + { + "pc": [ + 388 + ], + "errorMessage": "sender" + }, + { + "pc": [ + 489 + ], + "errorMessage": "state_proof_key" + }, + { + "pc": [ + 508 + ], + "errorMessage": "total" + }, + { + "pc": [ + 168 + ], + "errorMessage": "transaction type is acfg" + }, + { + "pc": [ + 214 + ], + "errorMessage": "transaction type is afrz" + }, + { + "pc": [ + 237, + 260, + 271, + 282 + ], + "errorMessage": "transaction type is appl" + }, + { + "pc": [ + 191 + ], + "errorMessage": "transaction type is axfer" + }, + { + "pc": [ + 146 + ], + "errorMessage": "transaction type is keyreg" + }, + { + "pc": [ + 124 + ], + "errorMessage": "transaction type is pay" + }, + { + "pc": [ + 380 + ], + "errorMessage": "txn_id" + }, + { + "pc": [ + 398 + ], + "errorMessage": "type" + }, + { + "pc": [ + 404 + ], + "errorMessage": "type_bytes" + }, + { + "pc": [ + 524 + ], + "errorMessage": "unit_name" + }, + { + "pc": [ + 536 + ], + "errorMessage": "url" + }, + { + "pc": [ + 473 + ], + "errorMessage": "vote_first" + }, + { + "pc": [ + 457 + ], + "errorMessage": "vote_key" + }, + { + "pc": [ + 468 + ], + "errorMessage": "vote_key_dilution" + }, + { + "pc": [ + 478 + ], + "errorMessage": "vote_last" + }, + { + "pc": [ + 588 + ], + "errorMessage": "xfer_asset" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgMiAzCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNQogICAgcHVzaGJ5dGVzcyAweDRjNWM2MWJhIDB4NmI2ODAzMTggMHgxNmM0YTMyZCAweDYzOTg3MmQ2IDB4NTBmOGYxYzMgMHg1YjNhMDBjZiAweGNkNjIyOTNkIDB4MDJlYTcyZTUgMHgzMDU2ODQwYiAweDk2ZWY5YTk1IC8vIG1ldGhvZCAiY3JlYXRlKCl2b2lkIiwgbWV0aG9kICJwYXkocGF5KXZvaWQiLCBtZXRob2QgImtleShrZXlyZWcpdm9pZCIsIG1ldGhvZCAiYXNzZXRfY29uZmlnKGFjZmcpdm9pZCIsIG1ldGhvZCAiYXNzZXRfdHJhbnNmZXIoYXhmZXIpdm9pZCIsIG1ldGhvZCAiYXNzZXRfZnJlZXplKGFmcnopdm9pZCIsIG1ldGhvZCAiYXBwbGljYXRpb25fY2FsbChhcHBsKXZvaWQiLCBtZXRob2QgIm11bHRpcGxlX3R4bnMoYXBwbCxhcHBsLGFwcGwpdm9pZCIsIG1ldGhvZCAiYW55X3R4bih0eG4sdHhuLHR4bil2b2lkIiwgbWV0aG9kICJncm91cF9pbml0KHR4bix0eG4sdHhuKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19wYXlfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19rZXlfcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hc3NldF9jb25maWdfcm91dGVANSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hc3NldF90cmFuc2Zlcl9yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X2ZyZWV6ZV9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGxpY2F0aW9uX2NhbGxfcm91dGVAOCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19tdWx0aXBsZV90eG5zX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fYW55X3R4bl9yb3V0ZUAxMCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ncm91cF9pbml0X3JvdXRlQDExCiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jcmVhdGVfcm91dGVAMjoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoY3JlYXRlPSJyZXF1aXJlIikKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fcGF5X3JvdXRlQDM6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMCAvLyBwYXkKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBwYXkKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgcGF5CiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19rZXlfcm91dGVANDoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18yIC8vIGtleXJlZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGtleXJlZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBrZXkKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Fzc2V0X2NvbmZpZ19yb3V0ZUA1OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBpbnRjXzMgLy8gYWNmZwogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFjZmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjUxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgYXNzZXRfY29uZmlnCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hc3NldF90cmFuc2Zlcl9yb3V0ZUA2OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMCAvLyAxCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDQgLy8gYXhmZXIKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBheGZlcgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF90cmFuc2ZlcgogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYXNzZXRfZnJlZXplX3JvdXRlQDc6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3NwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNSAvLyBhZnJ6CiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWZyegogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBhc3NldF9mcmVlemUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FwcGxpY2F0aW9uX2NhbGxfcm91dGVAODoKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFwcGxpY2F0aW9uX2NhbGwKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX211bHRpcGxlX3R4bnNfcm91dGVAOToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHJhbnNhY3Rpb25Db250cmFjdChhcmM0LkFSQzRDb250cmFjdCk6CiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18zIC8vIDMKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIHB1c2hpbnQgNiAvLyBhcHBsCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYXBwbAogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAyCiAgICAtCiAgICBkdXAKICAgIGd0eG5zIFR5cGVFbnVtCiAgICBwdXNoaW50IDYgLy8gYXBwbAogICAgPT0KICAgIGFzc2VydCAvLyB0cmFuc2FjdGlvbiB0eXBlIGlzIGFwcGwKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgcHVzaGludCA2IC8vIGFwcGwKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhcHBsCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMTEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBtdWx0aXBsZV90eG5zCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hbnlfdHhuX3JvdXRlQDEwOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTIxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzMgLy8gMwogICAgLQogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMiAvLyAyCiAgICAtCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGFueV90eG4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2dyb3VwX2luaXRfcm91dGVAMTE6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMzEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFRyYW5zYWN0aW9uQ29udHJhY3QoYXJjNC5BUkM0Q29udHJhY3QpOgogICAgdHhuIEdyb3VwSW5kZXgKICAgIGludGNfMyAvLyAzCiAgICAtCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18yIC8vIDIKICAgIC0KICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTMxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZ3JvdXBfaW5pdAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxNToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUcmFuc2FjdGlvbkNvbnRyYWN0KGFyYzQuQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QucGF5KHR4bjogdWludDY0KSAtPiB2b2lkOgpwYXk6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTozMS0zMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgcGF5KHNlbGYsIHR4bjogZ3R4bi5QYXltZW50VHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjMzCiAgICAvLyBzZWxmLl9jb21tb25fY2hlY2tzKHR4bikKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfY29tbW9uX2NoZWNrcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MzUKICAgIC8vIHR4bi5yZWNlaXZlciA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFJlY2VpdmVyCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgPT0KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjM0LTM2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHR4bi5yZWNlaXZlciA9PSBvcC5HbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzCiAgICAvLyApLCAiUGF5bWVudCBzaG91bGQgYmUgZm9yIHRoaXMgYXBwIgogICAgYXNzZXJ0IC8vIFBheW1lbnQgc2hvdWxkIGJlIGZvciB0aGlzIGFwcAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MzcKICAgIC8vIGFzc2VydCB0eG4uYW1vdW50ID4gMTAwMCwgIlBheW1lbnQgc2hvdWxkIGJlIGZvciA+MTAwMCBtaWNybyBhbGdvcyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQW1vdW50CiAgICBwdXNoaW50IDEwMDAgLy8gMTAwMAogICAgPgogICAgYXNzZXJ0IC8vIFBheW1lbnQgc2hvdWxkIGJlIGZvciA+MTAwMCBtaWNybyBhbGdvcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MzgKICAgIC8vIGFzc2VydCB0eG4uY2xvc2VfcmVtYWluZGVyX3RvID09IG9wLkdsb2JhbC56ZXJvX2FkZHJlc3MsICJjbG9zZV9yZW1haW5kZXJfdG8iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENsb3NlUmVtYWluZGVyVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyBjbG9zZV9yZW1haW5kZXJfdG8KICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5fY29tbW9uX2NoZWNrcyh0eG46IHVpbnQ2NCkgLT4gdm9pZDoKX2NvbW1vbl9jaGVja3M6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxNi0xNwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBfY29tbW9uX2NoZWNrcyhzZWxmLCB0eG46IGd0eG4uVHJhbnNhY3Rpb25CYXNlKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxOAogICAgLy8gYXNzZXJ0IHR4bi50eG5faWQsICJ0eG5faWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFR4SUQKICAgIGxlbgogICAgYXNzZXJ0IC8vIHR4bl9pZAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTkKICAgIC8vIGFzc2VydCB0eG4uc2VuZGVyID09IG9wLkdsb2JhbC5jcmVhdG9yX2FkZHJlc3MsICJzZW5kZXIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFNlbmRlcgogICAgZ2xvYmFsIENyZWF0b3JBZGRyZXNzCiAgICA9PQogICAgYXNzZXJ0IC8vIHNlbmRlcgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjAKICAgIC8vIGFzc2VydCB0eG4uZmVlLCAiZmVlIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBGZWUKICAgIGFzc2VydCAvLyBmZWUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjIxCiAgICAvLyBhc3NlcnQgdHhuLnR5cGUsICJ0eXBlIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBUeXBlRW51bQogICAgYXNzZXJ0IC8vIHR5cGUKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjIyCiAgICAvLyBhc3NlcnQgdHhuLnR5cGVfYnl0ZXMsICJ0eXBlX2J5dGVzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBUeXBlCiAgICBsZW4KICAgIGFzc2VydCAvLyB0eXBlX2J5dGVzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyMwogICAgLy8gYXNzZXJ0IHR4bi5ub3RlID09IEJ5dGVzKGIiIiksICJub3RlIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOb3RlCiAgICBwdXNoYnl0ZXMgMHgKICAgID09CiAgICBhc3NlcnQgLy8gbm90ZQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCB0eG4uZ3JvdXBfaW5kZXggPT0gMCwgImdyb3VwX2luZGV4IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBHcm91cEluZGV4CiAgICAhCiAgICBhc3NlcnQgLy8gZ3JvdXBfaW5kZXgKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjI1CiAgICAvLyBhc3NlcnQgdHhuLmZpcnN0X3ZhbGlkLCAiZmlyc3RfdmFsaWQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEZpcnN0VmFsaWQKICAgIGFzc2VydCAvLyBmaXJzdF92YWxpZAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjYtMjcKICAgIC8vICMgYXNzZXJ0IHR4bi5maXJzdF92YWxpZF90aW1lLCAiZmlyc3RfdmFsaWRfdGltZSIgIyB0aGlzIHZhbHVlIGNhbiBiZSBmbGFreSBpbiB0ZXN0cwogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X3ZhbGlkLCAibGFzdF92YWxpZCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTGFzdFZhbGlkCiAgICBhc3NlcnQgLy8gbGFzdF92YWxpZAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MjgKICAgIC8vIGFzc2VydCB0eG4ubGVhc2UsICJsZWFzZSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTGVhc2UKICAgIGxlbgogICAgYXNzZXJ0IC8vIGxlYXNlCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToyOQogICAgLy8gYXNzZXJ0IHR4bi5yZWtleV90byA9PSBvcC5HbG9iYWwuemVyb19hZGRyZXNzLCAicmVrZXlfdG8iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFJla2V5VG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgPT0KICAgIGFzc2VydCAvLyByZWtleV90bwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmtleSh0eG46IHVpbnQ2NCkgLT4gdm9pZDoKa2V5OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDAtNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGtleShzZWxmLCB0eG46IGd0eG4uS2V5UmVnaXN0cmF0aW9uVHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjQyCiAgICAvLyBzZWxmLl9jb21tb25fY2hlY2tzKHR4bikKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfY29tbW9uX2NoZWNrcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDMKICAgIC8vIGFzc2VydCB0eG4udm90ZV9rZXksICJ2b3RlX2tleSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgVm90ZVBLCiAgICBsZW4KICAgIGFzc2VydCAvLyB2b3RlX2tleQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDQKICAgIC8vIGFzc2VydCB0eG4uc2VsZWN0aW9uX2tleSwgInNlbGVjdGlvbl9rZXkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFNlbGVjdGlvblBLCiAgICBsZW4KICAgIGFzc2VydCAvLyBzZWxlY3Rpb25fa2V5CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo0NQogICAgLy8gYXNzZXJ0IHR4bi52b3RlX2tleV9kaWx1dGlvbiwgInZvdGVfa2V5X2RpbHV0aW9uIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBWb3RlS2V5RGlsdXRpb24KICAgIGFzc2VydCAvLyB2b3RlX2tleV9kaWx1dGlvbgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDYKICAgIC8vIGFzc2VydCB0eG4udm90ZV9maXJzdCwgInZvdGVfZmlyc3QiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIFZvdGVGaXJzdAogICAgYXNzZXJ0IC8vIHZvdGVfZmlyc3QKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjQ3CiAgICAvLyBhc3NlcnQgdHhuLnZvdGVfbGFzdCwgInZvdGVfbGFzdCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgVm90ZUxhc3QKICAgIGFzc2VydCAvLyB2b3RlX2xhc3QKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjQ4CiAgICAvLyBhc3NlcnQgdHhuLm5vbl9wYXJ0aWNpcGF0aW9uLCAibm9uX3BhcnRpY2lwYXRpb24iCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE5vbnBhcnRpY2lwYXRpb24KICAgIGFzc2VydCAvLyBub25fcGFydGljaXBhdGlvbgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NDkKICAgIC8vIGFzc2VydCB0eG4uc3RhdGVfcHJvb2Zfa2V5LCAic3RhdGVfcHJvb2Zfa2V5IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBTdGF0ZVByb29mUEsKICAgIGxlbgogICAgYXNzZXJ0IC8vIHN0YXRlX3Byb29mX2tleQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmFzc2V0X2NvbmZpZyh0eG46IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXRfY29uZmlnOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTEtNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2NvbmZpZyhzZWxmLCB0eG46IGd0eG4uQXNzZXRDb25maWdUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTMKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo1NQogICAgLy8gYXNzZXJ0IHR4bi5jb25maWdfYXNzZXQsICJjb25maWdfYXNzZXQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0CiAgICBhc3NlcnQgLy8gY29uZmlnX2Fzc2V0CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo1NgogICAgLy8gYXNzZXJ0IHR4bi50b3RhbCwgInRvdGFsIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldFRvdGFsCiAgICBhc3NlcnQgLy8gdG90YWwKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjU3CiAgICAvLyBhc3NlcnQgdHhuLmRlY2ltYWxzLCAiZGVjaW1hbHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0RGVjaW1hbHMKICAgIGFzc2VydCAvLyBkZWNpbWFscwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NTgKICAgIC8vIGFzc2VydCB0eG4uZGVmYXVsdF9mcm96ZW4sICJkZWZhdWx0X2Zyb3plbiIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXREZWZhdWx0RnJvemVuCiAgICBhc3NlcnQgLy8gZGVmYXVsdF9mcm96ZW4KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjU5CiAgICAvLyBhc3NlcnQgdHhuLnVuaXRfbmFtZSwgInVuaXRfbmFtZSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXRVbml0TmFtZQogICAgbGVuCiAgICBhc3NlcnQgLy8gdW5pdF9uYW1lCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2MAogICAgLy8gYXNzZXJ0IHR4bi5hc3NldF9uYW1lLCAiYXNzZXRfbmFtZSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ29uZmlnQXNzZXROYW1lCiAgICBsZW4KICAgIGFzc2VydCAvLyBhc3NldF9uYW1lCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2MQogICAgLy8gYXNzZXJ0IHR4bi51cmwsICJ1cmwiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0VVJMCiAgICBsZW4KICAgIGFzc2VydCAvLyB1cmwKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjYyCiAgICAvLyBhc3NlcnQgdHhuLm1ldGFkYXRhX2hhc2gsICJtZXRhZGF0YV9oYXNoIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldE1ldGFkYXRhSGFzaAogICAgbGVuCiAgICBhc3NlcnQgLy8gbWV0YWRhdGFfaGFzaAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NjMKICAgIC8vIGFzc2VydCB0eG4ubWFuYWdlciwgIm1hbmFnZXIiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0TWFuYWdlcgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIG1hbmFnZXIKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjY0CiAgICAvLyBhc3NlcnQgdHhuLnJlc2VydmUsICJyZXNlcnZlIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldFJlc2VydmUKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyByZXNlcnZlCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2NQogICAgLy8gYXNzZXJ0IHR4bi5mcmVlemUsICJmcmVlemUiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIENvbmZpZ0Fzc2V0RnJlZXplCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gZnJlZXplCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2NgogICAgLy8gYXNzZXJ0IHR4bi5jbGF3YmFjaywgImNsYXdiYWNrIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBDb25maWdBc3NldENsYXdiYWNrCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gY2xhd2JhY2sKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5hc3NldF90cmFuc2Zlcih0eG46IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXRfdHJhbnNmZXI6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo2OC02OQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXNzZXRfdHJhbnNmZXIoc2VsZiwgdHhuOiBndHhuLkFzc2V0VHJhbnNmZXJUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzAKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3MQogICAgLy8gYXNzZXJ0IHR4bi54ZmVyX2Fzc2V0LCAieGZlcl9hc3NldCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgWGZlckFzc2V0CiAgICBhc3NlcnQgLy8geGZlcl9hc3NldAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzIKICAgIC8vIGFzc2VydCB0eG4uYXNzZXRfYW1vdW50LCAiYXNzZXRfYW1vdW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldEFtb3VudAogICAgYXNzZXJ0IC8vIGFzc2V0X2Ftb3VudAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzMKICAgIC8vIGFzc2VydCB0eG4uYXNzZXRfc2VuZGVyLCAiYXNzZXRfc2VuZGVyIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldFNlbmRlcgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGFzc2V0X3NlbmRlcgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzQKICAgIC8vIGFzc2VydCB0eG4uYXNzZXRfcmVjZWl2ZXIsICJhc3NldF9yZWNlaXZlciIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXNzZXRSZWNlaXZlcgogICAgZ2xvYmFsIFplcm9BZGRyZXNzCiAgICAhPQogICAgYXNzZXJ0IC8vIGFzc2V0X3JlY2VpdmVyCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo3NQogICAgLy8gYXNzZXJ0IHR4bi5hc3NldF9jbG9zZV90bywgImFzc2V0X2Nsb3NlX3RvIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBc3NldENsb3NlVG8KICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBhc3NldF9jbG9zZV90bwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmFzc2V0X2ZyZWV6ZSh0eG46IHVpbnQ2NCkgLT4gdm9pZDoKYXNzZXRfZnJlZXplOgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzctNzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGFzc2V0X2ZyZWV6ZShzZWxmLCB0eG46IGd0eG4uQXNzZXRGcmVlemVUcmFuc2FjdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6NzkKICAgIC8vIHNlbGYuX2NvbW1vbl9jaGVja3ModHhuKQogICAgZnJhbWVfZGlnIC0xCiAgICBjYWxsc3ViIF9jb21tb25fY2hlY2tzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4MQogICAgLy8gYXNzZXJ0IHR4bi5mcmVlemVfYXNzZXQsICJmcmVlemVfYXNzZXQiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIEZyZWV6ZUFzc2V0CiAgICBhc3NlcnQgLy8gZnJlZXplX2Fzc2V0CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4MgogICAgLy8gYXNzZXJ0IHR4bi5mcmVlemVfYWNjb3VudCwgImZyZWV6ZV9hY2NvdW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBGcmVlemVBc3NldEFjY291bnQKICAgIGdsb2JhbCBaZXJvQWRkcmVzcwogICAgIT0KICAgIGFzc2VydCAvLyBmcmVlemVfYWNjb3VudAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6ODMKICAgIC8vIGFzc2VydCB0eG4uZnJvemVuLCAiZnJvemVuIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBGcmVlemVBc3NldEZyb3plbgogICAgYXNzZXJ0IC8vIGZyb3plbgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50cmFuc2FjdGlvbi5jb250cmFjdC5UcmFuc2FjdGlvbkNvbnRyYWN0LmFwcGxpY2F0aW9uX2NhbGwodHhuOiB1aW50NjQpIC0+IHZvaWQ6CmFwcGxpY2F0aW9uX2NhbGw6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4NS04NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgYXBwbGljYXRpb25fY2FsbChzZWxmLCB0eG46IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojg3CiAgICAvLyBzZWxmLl9jb21tb25fY2hlY2tzKHR4bikKICAgIGZyYW1lX2RpZyAtMQogICAgY2FsbHN1YiBfY29tbW9uX2NoZWNrcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6ODgKICAgIC8vIGFzc2VydCB0eG4uYXBwX2lkLCAiYXBwX2lkIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gYXBwX2lkCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo4OQogICAgLy8gYXNzZXJ0IHR4bi5vbl9jb21wbGV0aW9uLCAib25fY29tcGxldGlvbiIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgT25Db21wbGV0aW9uCiAgICBhc3NlcnQgLy8gb25fY29tcGxldGlvbgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6OTAKICAgIC8vIGFzc2VydCB0eG4ubnVtX2FwcF9hcmdzLCAibnVtX2FwcF9hcmdzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1BcHBBcmdzCiAgICBhc3NlcnQgLy8gbnVtX2FwcF9hcmdzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5MQogICAgLy8gYXNzZXJ0IHR4bi5udW1fYWNjb3VudHMsICJudW1fYWNjb3VudHMiCiAgICBmcmFtZV9kaWcgLTEKICAgIGd0eG5zIE51bUFjY291bnRzCiAgICBhc3NlcnQgLy8gbnVtX2FjY291bnRzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5MgogICAgLy8gYXNzZXJ0IHR4bi5hcHByb3ZhbF9wcm9ncmFtLCAiYXBwcm92YWxfcHJvZ3JhbSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQXBwcm92YWxQcm9ncmFtCiAgICBsZW4KICAgIGFzc2VydCAvLyBhcHByb3ZhbF9wcm9ncmFtCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5MwogICAgLy8gYXNzZXJ0IHR4bi5jbGVhcl9zdGF0ZV9wcm9ncmFtLCAiY2xlYXJfc3RhdGVfcHJvZ3JhbSIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgQ2xlYXJTdGF0ZVByb2dyYW0KICAgIGxlbgogICAgYXNzZXJ0IC8vIGNsZWFyX3N0YXRlX3Byb2dyYW0KICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojk0CiAgICAvLyBhc3NlcnQgdHhuLm51bV9hc3NldHMsICJudW1fYXNzZXRzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1Bc3NldHMKICAgIGFzc2VydCAvLyBudW1fYXNzZXRzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5NQogICAgLy8gYXNzZXJ0IHR4bi5udW1fYXBwcywgIm51bV9hcHBzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1BcHBsaWNhdGlvbnMKICAgIGFzc2VydCAvLyBudW1fYXBwcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6OTYKICAgIC8vIGFzc2VydCB0eG4uZ2xvYmFsX251bV91aW50LCAiZ2xvYmFsX251bV91aW50IgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBHbG9iYWxOdW1VaW50CiAgICBhc3NlcnQgLy8gZ2xvYmFsX251bV91aW50CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weTo5NwogICAgLy8gYXNzZXJ0IHR4bi5nbG9iYWxfbnVtX2J5dGVzLCAiZ2xvYmFsX251bV9ieXRlcyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgR2xvYmFsTnVtQnl0ZVNsaWNlCiAgICBhc3NlcnQgLy8gZ2xvYmFsX251bV9ieXRlcwogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6OTgKICAgIC8vIGFzc2VydCB0eG4ubG9jYWxfbnVtX3VpbnQsICJsb2NhbF9udW1fdWludCIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTG9jYWxOdW1VaW50CiAgICBhc3NlcnQgLy8gbG9jYWxfbnVtX3VpbnQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5Ojk5CiAgICAvLyBhc3NlcnQgdHhuLmxvY2FsX251bV9ieXRlcywgImxvY2FsX251bV9ieXRlcyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTG9jYWxOdW1CeXRlU2xpY2UKICAgIGFzc2VydCAvLyBsb2NhbF9udW1fYnl0ZXMKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwMAogICAgLy8gYXNzZXJ0IHR4bi5leHRyYV9wcm9ncmFtX3BhZ2VzLCAiZXh0cmFfcHJvZ3JhbV9wYWdlcyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgRXh0cmFQcm9ncmFtUGFnZXMKICAgIGFzc2VydCAvLyBleHRyYV9wcm9ncmFtX3BhZ2VzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDEKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2csICJsYXN0X2xvZyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTGFzdExvZwogICAgbGVuCiAgICBhc3NlcnQgLy8gbGFzdF9sb2cKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwMgogICAgLy8gYXNzZXJ0IHR4bi5udW1fYXBwcm92YWxfcHJvZ3JhbV9wYWdlcywgIm51bV9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzIgogICAgZnJhbWVfZGlnIC0xCiAgICBndHhucyBOdW1BcHByb3ZhbFByb2dyYW1QYWdlcwogICAgYXNzZXJ0IC8vIG51bV9hcHByb3ZhbF9wcm9ncmFtX3BhZ2VzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDMKICAgIC8vIGFzc2VydCB0eG4ubnVtX2NsZWFyX3N0YXRlX3Byb2dyYW1fcGFnZXMsICJudW1fY2xlYXJfc3RhdGVfcHJvZ3JhbV9wYWdlcyIKICAgIGZyYW1lX2RpZyAtMQogICAgZ3R4bnMgTnVtQ2xlYXJTdGF0ZVByb2dyYW1QYWdlcwogICAgYXNzZXJ0IC8vIG51bV9jbGVhcl9zdGF0ZV9wcm9ncmFtX3BhZ2VzCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDQKICAgIC8vIGFzc2VydCB0eG4uYXBwX2FyZ3MoMCksICJhcHBfYXJncygwKSIKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zYXMgQXBwbGljYXRpb25BcmdzCiAgICBsZW4KICAgIGFzc2VydCAvLyBhcHBfYXJncygwKQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTA1CiAgICAvLyBhc3NlcnQgdHhuLmFjY291bnRzKDApLCAiYWNjb3VudHMoMCkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIEFjY291bnRzCiAgICBnbG9iYWwgWmVyb0FkZHJlc3MKICAgICE9CiAgICBhc3NlcnQgLy8gYWNjb3VudHMoMCkKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEwNgogICAgLy8gYXNzZXJ0IHR4bi5hc3NldHMoMCksICJhc3NldHMoMCkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIEFzc2V0cwogICAgYXNzZXJ0IC8vIGFzc2V0cygwKQogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTA3CiAgICAvLyBhc3NlcnQgdHhuLmFwcHMoMCksICJhcHBzKDApIgogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZ3R4bnNhcyBBcHBsaWNhdGlvbnMKICAgIGFzc2VydCAvLyBhcHBzKDApCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDgKICAgIC8vIGFzc2VydCB0eG4uYXBwcm92YWxfcHJvZ3JhbV9wYWdlcygwKSwgImFwcHJvdmFsX3Byb2dyYW1fcGFnZXMoMCkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIEFwcHJvdmFsUHJvZ3JhbVBhZ2VzCiAgICBsZW4KICAgIGFzc2VydCAvLyBhcHByb3ZhbF9wcm9ncmFtX3BhZ2VzKDApCiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMDkKICAgIC8vIGFzc2VydCB0eG4uY2xlYXJfc3RhdGVfcHJvZ3JhbV9wYWdlcygwKSwgImNsZWFyX3N0YXRlX3Byb2dyYW1fcGFnZXMoMCkiCiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMSAvLyAwCiAgICBndHhuc2FzIENsZWFyU3RhdGVQcm9ncmFtUGFnZXMKICAgIGxlbgogICAgYXNzZXJ0IC8vIGNsZWFyX3N0YXRlX3Byb2dyYW1fcGFnZXMoMCkKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5tdWx0aXBsZV90eG5zKHR4bjE6IHVpbnQ2NCwgdHhuMjogdWludDY0LCB0eG4zOiB1aW50NjQpIC0+IHZvaWQ6Cm11bHRpcGxlX3R4bnM6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMTEtMTE3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBtdWx0aXBsZV90eG5zKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgdHhuMTogZ3R4bi5BcHBsaWNhdGlvbkNhbGxUcmFuc2FjdGlvbiwKICAgIC8vICAgICB0eG4yOiBndHhuLkFwcGxpY2F0aW9uQ2FsbFRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjM6IGd0eG4uQXBwbGljYXRpb25DYWxsVHJhbnNhY3Rpb24sCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKCm11bHRpcGxlX3R4bnNfZm9yX2JvZHlAMToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExOQogICAgLy8gYXNzZXJ0IGFwcC5ncm91cF9pbmRleCA9PSBpbmRleAogICAgc3dhcAogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjExOAogICAgLy8gZm9yIGluZGV4LCBhcHAgaW4gdWVudW1lcmF0ZSgodHhuMSwgdHhuMiwgdHhuMykpOgogICAgc3dpdGNoIG11bHRpcGxlX3R4bnNfZm9yX2hlYWRlcl8xQDMgbXVsdGlwbGVfdHhuc19mb3JfaGVhZGVyXzJANAogICAgcmV0c3ViCgptdWx0aXBsZV90eG5zX2Zvcl9oZWFkZXJfMUAzOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMQogICAgYiBtdWx0aXBsZV90eG5zX2Zvcl9ib2R5QDEKCm11bHRpcGxlX3R4bnNfZm9yX2hlYWRlcl8yQDQ6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICBiIG11bHRpcGxlX3R4bnNfZm9yX2JvZHlAMQoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5hbnlfdHhuKHR4bjE6IHVpbnQ2NCwgdHhuMjogdWludDY0LCB0eG4zOiB1aW50NjQpIC0+IHZvaWQ6CmFueV90eG46CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMjEtMTI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBhbnlfdHhuKAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgdHhuMTogZ3R4bi5UcmFuc2FjdGlvbiwKICAgIC8vICAgICB0eG4yOiBndHhuLlRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjM6IGd0eG4uVHJhbnNhY3Rpb24sCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKCmFueV90eG5fZm9yX2JvZHlAMToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyOQogICAgLy8gYXNzZXJ0IHR4bi5ncm91cF9pbmRleCA9PSBpbmRleAogICAgc3dhcAogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgZGlnIDEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEyOAogICAgLy8gZm9yIGluZGV4LCB0eG4gaW4gdWVudW1lcmF0ZSgodHhuMSwgdHhuMiwgdHhuMykpOgogICAgc3dpdGNoIGFueV90eG5fZm9yX2hlYWRlcl8xQDMgYW55X3R4bl9mb3JfaGVhZGVyXzJANAogICAgcmV0c3ViCgphbnlfdHhuX2Zvcl9oZWFkZXJfMUAzOgogICAgZnJhbWVfZGlnIC0yCiAgICBpbnRjXzAgLy8gMQogICAgYiBhbnlfdHhuX2Zvcl9ib2R5QDEKCmFueV90eG5fZm9yX2hlYWRlcl8yQDQ6CiAgICBmcmFtZV9kaWcgLTEKICAgIGludGNfMiAvLyAyCiAgICBiIGFueV90eG5fZm9yX2JvZHlAMQoKCi8vIHRlc3RfY2FzZXMudHJhbnNhY3Rpb24uY29udHJhY3QuVHJhbnNhY3Rpb25Db250cmFjdC5ncm91cF9pbml0KHR4bjE6IHVpbnQ2NCwgdHhuMjogdWludDY0LCB0eG4zOiB1aW50NjQpIC0+IHZvaWQ6Cmdyb3VwX2luaXQ6CiAgICAvLyB0cmFuc2FjdGlvbi9jb250cmFjdC5weToxMzEtMTM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBncm91cF9pbml0KAogICAgLy8gICAgIHNlbGYsCiAgICAvLyAgICAgdHhuMTogZ3R4bi5UcmFuc2FjdGlvbiwKICAgIC8vICAgICB0eG4yOiBndHhuLlRyYW5zYWN0aW9uLAogICAgLy8gICAgIHR4bjM6IGd0eG4uVHJhbnNhY3Rpb24sCiAgICAvLyApIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18xIC8vIDAKCmdyb3VwX2luaXRfZm9yX2JvZHlAMToKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEzOQogICAgLy8gdHhuX2Zyb21faW5kZXggPSBndHhuLlRyYW5zYWN0aW9uKHR4bi5ncm91cF9pbmRleCkKICAgIHN3YXAKICAgIGR1cAogICAgZ3R4bnMgR3JvdXBJbmRleAogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTQwCiAgICAvLyBhc3NlcnQgdHhuLnR4bl9pZCA9PSB0eG5fZnJvbV9pbmRleC50eG5faWQKICAgIHN3YXAKICAgIGd0eG5zIFR4SUQKICAgIHN3YXAKICAgIGd0eG5zIFR4SUQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHRyYW5zYWN0aW9uL2NvbnRyYWN0LnB5OjEzOAogICAgLy8gZm9yIHR4biBpbiAodHhuMSwgdHhuMiwgdHhuMyk6CiAgICBzd2l0Y2ggZ3JvdXBfaW5pdF9mb3JfaGVhZGVyXzFAMyBncm91cF9pbml0X2Zvcl9oZWFkZXJfMkA0CiAgICBiIGdyb3VwX2luaXRfYWZ0ZXJfZm9yQDUKCmdyb3VwX2luaXRfZm9yX2hlYWRlcl8xQDM6CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICBiIGdyb3VwX2luaXRfZm9yX2JvZHlAMQoKZ3JvdXBfaW5pdF9mb3JfaGVhZGVyXzJANDoKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18yIC8vIDIKICAgIGIgZ3JvdXBfaW5pdF9mb3JfYm9keUAxCgpncm91cF9pbml0X2FmdGVyX2ZvckA1OgogICAgLy8gdHJhbnNhY3Rpb24vY29udHJhY3QucHk6MTQxCiAgICAvLyBhc3NlcnQgdHhuMS50eG5faWQgPT0gZ3R4bi5UcmFuc2FjdGlvbigwKS50eG5faWQKICAgIGZyYW1lX2RpZyAtMwogICAgZ3R4bnMgVHhJRAogICAgaW50Y18xIC8vIDAKICAgIGd0eG5zIFR4SUQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnRyYW5zYWN0aW9uLmNvbnRyYWN0LlRyYW5zYWN0aW9uQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAQACA4gAAUOKAAExG0EBPYIKBExcYboEa2gDGAQWxKMtBGOYctYEUPjxwwRbOgDPBM1iKT0EAupy5QQwVoQLBJbvmpU2GgCOCgACAAwAIgA4AE4AZQB8AJMAwADYI4kxGRREMRgURCKJMRkURDEYRDEWIglJOBAiEkSIANIiiTEZFEQxGEQxFiIJSTgQJBJEiAEmIokxGRREMRhEMRYiCUk4ECUSRIgBPyKJMRkURDEYRDEWIglJOBCBBBJEiAF9IokxGRREMRhEMRYiCUk4EIEFEkSIAZEiiTEZFEQxGEQxFiIJSTgQgQYSRIgBlSKJMRkURDEYRDEWJQlJOBCBBhJEMRYkCUk4EIEGEkQxFiIJSTgQgQYSRIgB7iKJMRkURDEYRDEWJQkxFiQJMRYiCYgB9iKJMRkURDEYRDEWJQkxFiQJMRYiCYgB/iKJI4mKAQCL/4gAGov/OAcyChJEi/84CIHoBw1Ei/84CTIDEkSJigEAi/84FxVEi/84ADIJEkSL/zgBRIv/OBBEi/84DxVEi/84BYAAEkSL/zgWFESL/zgCRIv/OAREi/84BhVEi/84IDIDEkSJigEAi/+I/7CL/zgKFUSL/zgLFUSL/zgORIv/OAxEi/84DUSL/zg5RIv/OD8VRImKAQCL/4j/gYv/OCFEi/84IkSL/zgjRIv/OCREi/84JRVEi/84JhVEi/84JxVEi/84KBVEi/84KTIDE0SL/zgqMgMTRIv/OCsyAxNEi/84LDIDE0SJigEAi/+I/yyL/zgRRIv/OBJEi/84EzIDE0SL/zgUMgMTRIv/OBUyAxNEiYoBAIv/iP8Bi/84LUSL/zguMgMTRIv/OC9EiYoBAIv/iP7mi/84GESL/zgZRIv/OBtEi/84HUSL/zgeFUSL/zgfFUSL/zgxRIv/ODNEi/84NESL/zg1RIv/ODZEi/84N0SL/zg4RIv/OD4VRIv/OEFEi/84Q0SL/yPCGhVEi/8jwhwyAxNEi/8jwjBEi/8jwjJEi/8jwkAVRIv/I8JCFUSJigMAi/0jTDgWSwESRI0CAAEAB4mL/iJC/+yL/yRC/+aKAwCL/SNMOBZLARJEjQIAAQAHiYv+IkL/7Iv/JEL/5ooDAIv9I0xJOBZMOBdMOBcSRI0CAAMACUIADIv+IkL/5Yv/JEL/34v9OBcjOBcSRIk=", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/transaction/puya.log b/test_cases/transaction/puya.log index cf1ce113aa..dd395c4a8f 100644 --- a/test_cases/transaction/puya.log +++ b/test_cases/transaction/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['transaction'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['transaction'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing transaction/out/module.awst debug: Sealing block@0: // L12 @@ -1553,6 +1553,7 @@ debug: shared x-stack for group_init_block@0 -> group_init_for_body@1: txn#1, lo debug: shared x-stack for group_init_for_header_1@3 -> group_init_for_body@1: txn#1, loop_counter%0#0 debug: shared x-stack for group_init_for_header_2@4 -> group_init_for_body@1: txn#1, loop_counter%0#0 info: Writing transaction/out/TransactionContract.arc32.json +info: Writing transaction/out/TransactionContract.arc56.json info: Writing transaction/out/TransactionContract.approval.teal info: Writing transaction/out/TransactionContract.clear.teal info: Writing transaction/out/TransactionContract.approval.bin diff --git a/test_cases/tuple_support/out/NestedTuples.arc56.json b/test_cases/tuple_support/out/NestedTuples.arc56.json new file mode 100644 index 0000000000..159a3c2607 --- /dev/null +++ b/test_cases/tuple_support/out/NestedTuples.arc56.json @@ -0,0 +1,138 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "NestedTuples", + "structs": {}, + "methods": [ + { + "name": "run_tests", + "args": [], + "returns": { + "type": "bool" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "nested_tuple_params", + "args": [ + { + "type": "(string,(byte[],(uint64)))", + "name": "args" + } + ], + "returns": { + "type": "(byte[],(string,uint64))" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 1, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": { + "build_nested_call_count": { + "keyType": "AVMString", + "valueType": "AVMUint64", + "key": "YnVpbGRfbmVzdGVkX2NhbGxfY291bnQ=" + } + }, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 96, + 119 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 572, + 583 + ], + "errorMessage": "check self.build_nested_call_count exists" + }, + { + "pc": [ + 244 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 99, + 122 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDIgMCAzCiAgICBieXRlY2Jsb2NrICJIaSIgImJ1aWxkX25lc3RlZF9jYWxsX2NvdW50IiAiVGhlcmUiIDB4MTUxZjdjNzUgImhpIgogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGJueiBtYWluX2VudHJ5cG9pbnRAMgogICAgY2FsbHN1YiBfX2luaXRfXwoKbWFpbl9lbnRyeXBvaW50QDI6CiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQKICAgIC8vIGNsYXNzIE5lc3RlZFR1cGxlcyhBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDYKICAgIHB1c2hieXRlc3MgMHg5ZTVhM2JhNyAweGNlYTA1MjFiIC8vIG1ldGhvZCAicnVuX3Rlc3RzKClib29sIiwgbWV0aG9kICJuZXN0ZWRfdHVwbGVfcGFyYW1zKChzdHJpbmcsKGJ5dGVbXSwodWludDY0KSkpKShieXRlW10sKHN0cmluZyx1aW50NjQpKSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3J1bl90ZXN0c19yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX25lc3RlZF90dXBsZV9wYXJhbXNfcm91dGVAMwogICAgaW50Y18yIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fcnVuX3Rlc3RzX3JvdXRlQDI6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6OAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgcnVuX3Rlc3RzCiAgICBwdXNoYnl0ZXMgMHgwMAogICAgaW50Y18yIC8vIDAKICAgIHVuY292ZXIgMgogICAgc2V0Yml0CiAgICBieXRlY18zIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19uZXN0ZWRfdHVwbGVfcGFyYW1zX3JvdXRlQDM6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MzcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NAogICAgLy8gY2xhc3MgTmVzdGVkVHVwbGVzKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMSAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBkdXAKICAgIGludGNfMiAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGxlbgogICAgZGlnIDIKICAgIGNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBzd2FwCiAgICBleHRyYWN0IDIgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGV4dHJhY3QgMCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjM3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiBuZXN0ZWRfdHVwbGVfcGFyYW1zCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIGRpZyAyCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDMKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBpdG9iCiAgICBwdXNoYnl0ZXMgMHgwMDBhCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBwdXNoYnl0ZXMgMHgwMDA0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIHVuY292ZXIgMgogICAgY29uY2F0CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzMgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A2OgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQKICAgIC8vIGNsYXNzIE5lc3RlZFR1cGxlcyhBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTAKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMTA6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NAogICAgLy8gY2xhc3MgTmVzdGVkVHVwbGVzKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzIgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMuTmVzdGVkVHVwbGVzLnJ1bl90ZXN0cygpIC0+IHVpbnQ2NDoKcnVuX3Rlc3RzOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjgtOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBydW5fdGVzdHMoc2VsZikgLT4gYm9vbDoKICAgIHByb3RvIDAgMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjEwCiAgICAvLyB4ID0gKFN0cmluZygiSGkiKSwgU3RyaW5nKCJUaGVyZSIpKQogICAgYnl0ZWNfMCAvLyAiSGkiCiAgICBieXRlY18yIC8vICJUaGVyZSIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMQogICAgLy8gYXNzZXJ0IHRlc3Rfc3dhcCh4KSA9PSAoU3RyaW5nKCJUaGVyZSIpLCBTdHJpbmcoIkhpIikpCiAgICBjYWxsc3ViIHRlc3Rfc3dhcAogICAgc3dhcAogICAgYnl0ZWNfMiAvLyAiVGhlcmUiCiAgICA9PQogICAgc3dhcAogICAgYnl0ZWNfMCAvLyAiSGkiCiAgICA9PQogICAgJiYKICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjEwCiAgICAvLyB4ID0gKFN0cmluZygiSGkiKSwgU3RyaW5nKCJUaGVyZSIpKQogICAgYnl0ZWNfMCAvLyAiSGkiCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTMKICAgIC8vIHogPSAoVUludDY0KDApLCBVSW50NjQoMiksIHkpCiAgICBpbnRjXzIgLy8gMAogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMgogICAgLy8geSA9IChVSW50NjQoMSksIHgpCiAgICBpbnRjXzAgLy8gMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjEwCiAgICAvLyB4ID0gKFN0cmluZygiSGkiKSwgU3RyaW5nKCJUaGVyZSIpKQogICAgYnl0ZWNfMCAvLyAiSGkiCiAgICBieXRlY18yIC8vICJUaGVyZSIKICAgIGR1cAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE5CiAgICAvLyAoYSwgYiwgKGMsIGQsIChlLCkpKSA9IHRlc3RfcmVhcnJhbmdlKHhbMF0sIF9iPXhbMV0sIGFyZ3M9eikKICAgIGNhbGxzdWIgdGVzdF9yZWFycmFuZ2UKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToyMAogICAgLy8gYXNzZXJ0IChhLCBiKSA9PSAoU3RyaW5nKCJIaSIpLCBVSW50NjQoMCkpCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjXzAgLy8gIkhpIgogICAgPT0KICAgIHVuY292ZXIgNAogICAgIQogICAgJiYKICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjIxCiAgICAvLyBhc3NlcnQgKGMsIGQpID09IChVSW50NjQoMiksIFVJbnQ2NCgxKSkKICAgIHVuY292ZXIgMgogICAgaW50Y18xIC8vIDIKICAgID09CiAgICB1bmNvdmVyIDIKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgJiYKICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjIyCiAgICAvLyBhc3NlcnQgZSA9PSBTdHJpbmcoIlRoZXJlIikKICAgIGJ5dGVjXzIgLy8gIlRoZXJlIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjI0CiAgICAvLyB0ZXN0X2ludHJpbnNpY3MoVUludDY0KDEpLCBVSW50NjQoMikpCiAgICBpbnRjXzAgLy8gMQogICAgaW50Y18xIC8vIDIKICAgIGNhbGxzdWIgdGVzdF9pbnRyaW5zaWNzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjYKICAgIC8vIHRlc3RfbmVzdGVkX3NpbmdsZXMoVUludDY0KDEpLCByZWFzc2lnbj1UcnVlKQogICAgaW50Y18wIC8vIDEKICAgIGR1cAogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF9zaW5nbGVzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MjcKICAgIC8vIHRlc3RfbmVzdGVkX3NpbmdsZXMoVUludDY0KDEpLCByZWFzc2lnbj1GYWxzZSkKICAgIGludGNfMCAvLyAxCiAgICBpbnRjXzIgLy8gMAogICAgY2FsbHN1YiB0ZXN0X25lc3RlZF9zaW5nbGVzCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MzIKICAgIC8vIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbigpCiAgICBjYWxsc3ViIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjM0CiAgICAvLyBzZWxmLnRlc3Rfc2luZ2xlX2V2YWx1YXRpb25fbmVzdGVkKCkKICAgIGNhbGxzdWIgdGVzdF9zaW5nbGVfZXZhbHVhdGlvbl9uZXN0ZWQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTozNQogICAgLy8gcmV0dXJuIFRydWUKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy50ZXN0X3N3YXAoYXJncy4wOiBieXRlcywgYXJncy4xOiBieXRlcykgLT4gYnl0ZXMsIGJ5dGVzOgp0ZXN0X3N3YXA6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjYtNjcKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgdGVzdF9zd2FwKGFyZ3M6IHR1cGxlW1N0cmluZywgU3RyaW5nXSkgLT4gdHVwbGVbU3RyaW5nLCBTdHJpbmddOgogICAgcHJvdG8gMiAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjkKICAgIC8vIHJldHVybiBiLCBhCiAgICBmcmFtZV9kaWcgLTEKICAgIGZyYW1lX2RpZyAtMgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMudGVzdF9yZWFycmFuZ2UoX2E6IGJ5dGVzLCBhcmdzLjA6IHVpbnQ2NCwgYXJncy4xOiB1aW50NjQsIGFyZ3MuMi4wOiB1aW50NjQsIGFyZ3MuMi4xLjA6IGJ5dGVzLCBhcmdzLjIuMS4xOiBieXRlcywgX2I6IGJ5dGVzKSAtPiBieXRlcywgdWludDY0LCB1aW50NjQsIHVpbnQ2NCwgYnl0ZXM6CnRlc3RfcmVhcnJhbmdlOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjU3LTYwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRlc3RfcmVhcnJhbmdlKAogICAgLy8gICAgIF9hOiBTdHJpbmcsIGFyZ3M6IHR1cGxlW1VJbnQ2NCwgVUludDY0LCB0dXBsZVtVSW50NjQsIHR1cGxlW1N0cmluZywgU3RyaW5nXV1dLCBfYjogU3RyaW5nCiAgICAvLyApIC0+IHR1cGxlW1N0cmluZywgVUludDY0LCB0dXBsZVtVSW50NjQsIFVJbnQ2NCwgdHVwbGVbU3RyaW5nXV1dOgogICAgcHJvdG8gNyA1CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NjMKICAgIC8vIHJldHVybiBkLCBhLCAoYiwgYywgKGUsKSkKICAgIGZyYW1lX2RpZyAtMwogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTUKICAgIGZyYW1lX2RpZyAtNAogICAgZnJhbWVfZGlnIC0yCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy50ZXN0X2ludHJpbnNpY3MobnVtMTogdWludDY0LCBudW0yOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfaW50cmluc2ljczoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo3Mi03MwogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0ZXN0X2ludHJpbnNpY3MobnVtMTogVUludDY0LCBudW0yOiBVSW50NjQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo3NAogICAgLy8gbnQgPSAoVUludDY0KDEpLCBvcC5hZGR3KG51bTEsIG51bTIpLCBVSW50NjQoNDIpKQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTEKICAgIGFkZHcKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo3NwogICAgLy8gYXNzZXJ0IG50WzFdID09ICgwLCBudW0xICsgbnVtMikgICMgdHlwZTogaWdub3JlW2NvbXBhcmlzb24tb3ZlcmxhcF0KICAgIHN3YXAKICAgICEKICAgIGZyYW1lX2RpZyAtMgogICAgZnJhbWVfZGlnIC0xCiAgICArCiAgICB1bmNvdmVyIDIKICAgID09CiAgICBkdXAyCiAgICAmJgogICAgYXNzZXJ0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NzgKICAgIC8vIGFzc2VydCBudFsxXVs6MV0gPT0gKDAsKSAgIyB0eXBlOiBpZ25vcmVbY29tcGFyaXNvbi1vdmVybGFwXQogICAgc3dhcAogICAgYXNzZXJ0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NzkKICAgIC8vIGFzc2VydCBudFsxXVsxOl0gPT0gKG51bTEgKyBudW0yLCkKICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMudGVzdF9uZXN0ZWRfc2luZ2xlcyhvbmU6IHVpbnQ2NCwgcmVhc3NpZ246IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uZXN0ZWRfc2luZ2xlczoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMDctMTA4CiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRlc3RfbmVzdGVkX3NpbmdsZXMob25lOiBVSW50NjQsICosIHJlYXNzaWduOiBib29sKSAtPiBOb25lOgogICAgcHJvdG8gMiAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTEwCiAgICAvLyAoVUludDY0KDApLCksCiAgICBpbnRjXzIgLy8gMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjExMgogICAgLy8gKFVJbnQ2NCgyKSwpLAogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMTYKICAgIC8vIGFzc2VydCBzWzFdWzBdID09IDEKICAgIGZyYW1lX2RpZyAtMgogICAgaW50Y18wIC8vIDEKICAgID09CiAgICBhc3NlcnQKICAgIGZyYW1lX2RpZyAtMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjEyMQogICAgLy8gaWYgcmVhc3NpZ246CiAgICBmcmFtZV9kaWcgLTEKICAgIGJ6IHRlc3RfbmVzdGVkX3NpbmdsZXNfYWZ0ZXJfaWZfZWxzZUAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTIzCiAgICAvLyAoVUludDY0KDMpLCksCiAgICBpbnRjXzMgLy8gMwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjEyMi0xMjYKICAgIC8vIHMgPSAoCiAgICAvLyAgICAgKFVJbnQ2NCgzKSwpLAogICAgLy8gICAgIChVSW50NjQoNCksKSwKICAgIC8vICAgICAoVUludDY0KDUpLCksCiAgICAvLyApCiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMjQKICAgIC8vIChVSW50NjQoNCksKSwKICAgIHB1c2hpbnQgNCAvLyA0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTIyLTEyNgogICAgLy8gcyA9ICgKICAgIC8vICAgICAoVUludDY0KDMpLCksCiAgICAvLyAgICAgKFVJbnQ2NCg0KSwpLAogICAgLy8gICAgIChVSW50NjQoNSksKSwKICAgIC8vICkKICAgIGZyYW1lX2J1cnkgMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjEyNQogICAgLy8gKFVJbnQ2NCg1KSwpLAogICAgcHVzaGludCA1IC8vIDUKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMjItMTI2CiAgICAvLyBzID0gKAogICAgLy8gICAgIChVSW50NjQoMyksKSwKICAgIC8vICAgICAoVUludDY0KDQpLCksCiAgICAvLyAgICAgKFVJbnQ2NCg1KSwpLAogICAgLy8gKQogICAgZnJhbWVfYnVyeSAxCgp0ZXN0X25lc3RlZF9zaW5nbGVzX2FmdGVyX2lmX2Vsc2VAMjoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMjcKICAgIC8vIGFzc2VydCBzWzBdWzBdID09ICgzIGlmIHJlYXNzaWduIGVsc2UgMCkKICAgIGZyYW1lX2RpZyAtMQogICAgaW50Y18zIC8vIDMKICAgICoKICAgIGZyYW1lX2RpZyAwCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTI5CiAgICAvLyBhc3NlcnQgdG1wID09ICg1IGlmIHJlYXNzaWduIGVsc2UgMikKICAgIGludGNfMSAvLyAyCiAgICBwdXNoaW50IDUgLy8gNQogICAgZnJhbWVfZGlnIC0xCiAgICBzZWxlY3QKICAgIGZyYW1lX2RpZyAxCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjEzMwogICAgLy8gczEgKz0gb25lCiAgICBmcmFtZV9kaWcgMgogICAgZHVwCiAgICBjb3ZlciAyCiAgICBmcmFtZV9kaWcgLTIKICAgICsKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxMzQKICAgIC8vIGFzc2VydCBzMSA9PSAoNSBpZiByZWFzc2lnbiBlbHNlIDIpCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTM1CiAgICAvLyBhc3NlcnQgc1sxXVswXSA9PSAoNCBpZiByZWFzc2lnbiBlbHNlIDEpCiAgICBpbnRjXzAgLy8gMQogICAgcHVzaGludCA0IC8vIDQKICAgIGZyYW1lX2RpZyAtMQogICAgc2VsZWN0CiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy50ZXN0X25lc3RlZF9pdGVyYXRpb24oKSAtPiB2b2lkOgp0ZXN0X25lc3RlZF9pdGVyYXRpb246CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTUxLTE1MgogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiB0ZXN0X25lc3RlZF9pdGVyYXRpb24oKSAtPiBOb25lOgogICAgcHJvdG8gMCAwCiAgICBwdXNoYnl0ZXMgIiIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNTUKICAgIC8vIHRvdGFsID0gVUludDY0KDApCiAgICBpbnRjXzIgLy8gMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1MwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNTQKICAgIC8vIHkgPSBVSW50NjQoMikKICAgIGludGNfMSAvLyAyCiAgICBpbnRjXzIgLy8gMAoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9ib2R5QDE6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTU5CiAgICAvLyB0b3RhbCArPSBhICsgYgogICAgZnJhbWVfZGlnIDIKICAgIHVuY292ZXIgMgogICAgKwogICAgZnJhbWVfZGlnIDEKICAgICsKICAgIGZyYW1lX2J1cnkgMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1NwogICAgLy8gZm9yIHQgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2l0Y2ggdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfMUAzIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfaGVhZGVyXzJANCB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8zQDUKICAgIGIgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2FmdGVyX2ZvckA2Cgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8xQDM6CiAgICBpbnRjXzAgLy8gMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1NAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNTcKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgZnJhbWVfYnVyeSAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTUzCiAgICAvLyB4ID0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1NwogICAgLy8gZm9yIHQgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2FwCiAgICBiIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfYm9keUAxCgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8yQDQ6CiAgICBpbnRjXzEgLy8gMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1MwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNTcKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgZnJhbWVfYnVyeSAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTUzCiAgICAvLyB4ID0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1NwogICAgLy8gZm9yIHQgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2FwCiAgICBiIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfYm9keUAxCgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8zQDU6CiAgICBpbnRjXzMgLy8gMwogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1NAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNTcKICAgIC8vIGZvciB0IGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgZnJhbWVfYnVyeSAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTU0CiAgICAvLyB5ID0gVUludDY0KDIpCiAgICBpbnRjXzEgLy8gMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1NwogICAgLy8gZm9yIHQgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2FwCiAgICBiIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfYm9keUAxCgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fYWZ0ZXJfZm9yQDY6CiAgICBpbnRjXzIgLy8gMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1MwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNjEKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTU0CiAgICAvLyB5ID0gVUludDY0KDIpCiAgICBpbnRjXzEgLy8gMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE2MQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2FwCgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlANzoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNjIKICAgIC8vIHRvdGFsICs9IGEgKyBiCiAgICBmcmFtZV9kaWcgMAogICAgdW5jb3ZlciAyCiAgICArCiAgICBmcmFtZV9kaWcgMQogICAgKwogICAgZnJhbWVfYnVyeSAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTYxCiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIHN3aXRjaCB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8xQDkgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9oZWFkZXJfMkAxMCB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8zQDExCiAgICBiIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9hZnRlcl9mb3JAMTIKCnRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfaGVhZGVyXzFAOToKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTU0CiAgICAvLyB5ID0gVUludDY0KDIpCiAgICBpbnRjXzEgLy8gMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE2MQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBmcmFtZV9idXJ5IDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNTMKICAgIC8vIHggPSBVSW50NjQoMSkKICAgIGludGNfMCAvLyAxCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTYxCiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIHN3YXAKICAgIGIgdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2Zvcl9ib2R5QDcKCnRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfaGVhZGVyXzJAMTA6CiAgICBpbnRjXzEgLy8gMgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1MwogICAgLy8geCA9IFVJbnQ2NCgxKQogICAgaW50Y18wIC8vIDEKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNjEKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgZnJhbWVfYnVyeSAwCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTUzCiAgICAvLyB4ID0gVUludDY0KDEpCiAgICBpbnRjXzAgLy8gMQogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE2MQogICAgLy8gZm9yIGEsIGIgaW4gKCh4LCB5KSwgKHksIHgpLCAoeCwgeCksICh5LCB5KSk6CiAgICBzd2FwCiAgICBiIHRlc3RfbmVzdGVkX2l0ZXJhdGlvbl9mb3JfYm9keUA3Cgp0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2hlYWRlcl8zQDExOgogICAgaW50Y18zIC8vIDMKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNTQKICAgIC8vIHkgPSBVSW50NjQoMikKICAgIGludGNfMSAvLyAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MTYxCiAgICAvLyBmb3IgYSwgYiBpbiAoKHgsIHkpLCAoeSwgeCksICh4LCB4KSwgKHksIHkpKToKICAgIGZyYW1lX2J1cnkgMAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjE1NAogICAgLy8geSA9IFVJbnQ2NCgyKQogICAgaW50Y18xIC8vIDIKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNjEKICAgIC8vIGZvciBhLCBiIGluICgoeCwgeSksICh5LCB4KSwgKHgsIHgpLCAoeSwgeSkpOgogICAgc3dhcAogICAgYiB0ZXN0X25lc3RlZF9pdGVyYXRpb25fZm9yX2JvZHlANwoKdGVzdF9uZXN0ZWRfaXRlcmF0aW9uX2FmdGVyX2ZvckAxMjoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weToxNjQKICAgIC8vIGFzc2VydCB0b3RhbCAvLyA4ID09IDMKICAgIGZyYW1lX2RpZyAxCiAgICBwdXNoaW50IDggLy8gOAogICAgLwogICAgaW50Y18zIC8vIDMKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHVwbGVfc3VwcG9ydC5uZXN0ZWRfdHVwbGVzLk5lc3RlZFR1cGxlcy50ZXN0X3NpbmdsZV9ldmFsdWF0aW9uX25lc3RlZCgpIC0+IHZvaWQ6CnRlc3Rfc2luZ2xlX2V2YWx1YXRpb25fbmVzdGVkOgogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQ5LTUwCiAgICAvLyBAc3Vicm91dGluZQogICAgLy8gZGVmIHRlc3Rfc2luZ2xlX2V2YWx1YXRpb25fbmVzdGVkKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo1MQogICAgLy8gc2VsZi5idWlsZF9uZXN0ZWRfY2FsbF9jb3VudCA9IFVJbnQ2NCgwKQogICAgYnl0ZWNfMSAvLyAiYnVpbGRfbmVzdGVkX2NhbGxfY291bnQiCiAgICBpbnRjXzIgLy8gMAogICAgYXBwX2dsb2JhbF9wdXQKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo1MgogICAgLy8gcmVzdWx0ID0gc2VsZi5idWlsZF9uZXN0ZWQoKSBvciBzZWxmLmJ1aWxkX25lc3RlZCgpCiAgICBjYWxsc3ViIGJ1aWxkX25lc3RlZAogICAgcG9wbiAyCiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NTMKICAgIC8vIGFzc2VydCByZXN1bHRbMF1bMF0gPT0gImhpIgogICAgYnl0ZWMgNCAvLyAiaGkiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NTQKICAgIC8vIGFzc2VydCBzZWxmLmJ1aWxkX25lc3RlZF9jYWxsX2NvdW50ID09IDEKICAgIGludGNfMiAvLyAwCiAgICBieXRlY18xIC8vICJidWlsZF9uZXN0ZWRfY2FsbF9jb3VudCIKICAgIGFwcF9nbG9iYWxfZ2V0X2V4CiAgICBhc3NlcnQgLy8gY2hlY2sgc2VsZi5idWlsZF9uZXN0ZWRfY2FsbF9jb3VudCBleGlzdHMKICAgIGludGNfMCAvLyAxCiAgICA9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuYnVpbGRfbmVzdGVkKCkgLT4gYnl0ZXMsIHVpbnQ2NCwgYnl0ZXM6CmJ1aWxkX25lc3RlZDoKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo0NC00NQogICAgLy8gQHN1YnJvdXRpbmUKICAgIC8vIGRlZiBidWlsZF9uZXN0ZWQoc2VsZikgLT4gdHVwbGVbdHVwbGVbU3RyaW5nLCBVSW50NjRdLCBCeXRlc106CiAgICBwcm90byAwIDMKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo0NgogICAgLy8gc2VsZi5idWlsZF9uZXN0ZWRfY2FsbF9jb3VudCArPSAxCiAgICBpbnRjXzIgLy8gMAogICAgYnl0ZWNfMSAvLyAiYnVpbGRfbmVzdGVkX2NhbGxfY291bnQiCiAgICBhcHBfZ2xvYmFsX2dldF9leAogICAgYXNzZXJ0IC8vIGNoZWNrIHNlbGYuYnVpbGRfbmVzdGVkX2NhbGxfY291bnQgZXhpc3RzCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgYnl0ZWNfMSAvLyAiYnVpbGRfbmVzdGVkX2NhbGxfY291bnQiCiAgICBzd2FwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgLy8gdHVwbGVfc3VwcG9ydC9uZXN0ZWRfdHVwbGVzLnB5OjQ3CiAgICAvLyByZXR1cm4gKFN0cmluZygiaGkiKSwgVUludDY0KDEpKSwgQnl0ZXMoYiJobW1tIikKICAgIGJ5dGVjIDQgLy8gImhpIgogICAgaW50Y18wIC8vIDEKICAgIHB1c2hieXRlcyAweDY4NmQ2ZDZkCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMubmVzdGVkX3R1cGxlX3BhcmFtcyhhcmdzLjA6IGJ5dGVzLCBhcmdzLjEuMDogYnl0ZXMsIGFyZ3MuMS4xLjA6IHVpbnQ2NCkgLT4gYnl0ZXMsIGJ5dGVzLCB1aW50NjQ6Cm5lc3RlZF90dXBsZV9wYXJhbXM6CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6MzctNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgbmVzdGVkX3R1cGxlX3BhcmFtcygKICAgIC8vICAgICBzZWxmLCBhcmdzOiB0dXBsZVtTdHJpbmcsIHR1cGxlW0J5dGVzLCB0dXBsZVtVSW50NjRdXV0KICAgIC8vICkgLT4gdHVwbGVbQnl0ZXMsIHR1cGxlW1N0cmluZywgVUludDY0XV06CiAgICBwcm90byAzIDMKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo0MgogICAgLy8gcmV0dXJuIGIsIChzLCB1KQogICAgZnJhbWVfZGlnIC0yCiAgICBmcmFtZV9kaWcgLTMKICAgIGZyYW1lX2RpZyAtMQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50dXBsZV9zdXBwb3J0Lm5lc3RlZF90dXBsZXMuTmVzdGVkVHVwbGVzLl9faW5pdF9fKCkgLT4gdm9pZDoKX19pbml0X186CiAgICAvLyB0dXBsZV9zdXBwb3J0L25lc3RlZF90dXBsZXMucHk6NQogICAgLy8gZGVmIF9faW5pdF9fKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHR1cGxlX3N1cHBvcnQvbmVzdGVkX3R1cGxlcy5weTo2CiAgICAvLyBzZWxmLmJ1aWxkX25lc3RlZF9jYWxsX2NvdW50ID0gVUludDY0KDApCiAgICBieXRlY18xIC8vICJidWlsZF9uZXN0ZWRfY2FsbF9jb3VudCIKICAgIGludGNfMiAvLyAwCiAgICBhcHBfZ2xvYmFsX3B1dAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR1cGxlX3N1cHBvcnQubmVzdGVkX3R1cGxlcy5OZXN0ZWRUdXBsZXMuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAQIAAyYFAkhpF2J1aWxkX25lc3RlZF9jYWxsX2NvdW50BVRoZXJlBBUffHUCaGkxGEAAA4gCJ4gAAUOKAAExG0EApoICBJ5aO6cEzqBSGzYaAI4CAAIAGSSJMRkURDEYRIgAkoABACRPAlQrTFCwIokxGRREMRhENhoBSSRZSwEjWUsCTwJLAlJXAgBLAhVPA08DTwJSSSRZSwEVSwJOAlJXAgBMVwIIVwAIF4gBpUsCFRZXBgJPA1BLAhUWVwYCTwNQTwIWgAIACkxQTFBLARWBBAgWVwYCgAIABExQTwJQTFArTFCwIokxGUAABjEYFEQiiSSJigABKCqIAD9MKhJMKBIQRCgkIyIoKkmIADVPBCgSTwQUEERPAiMSTwIiEhBEKhJEIiOIACgiSYgAPCIkiAA3iAB3iADsIomKAgKL/4v+iYoHBYv9i/qL+4v8i/6JigIAi/6L/x5MFIv+i/8ITwISShBETEREiYoCACQji/4iEkSL/ov/QQALJYwAgQSMAoEFjAGL/yULiwASRCOBBYv/TYsBSwESRIsCSU4Ci/4IEkQigQSL/00SRImKAACAACQiIySLAk8CCIsBCIwBjQMAAwAMABVCABsiI4wCIkxC/+IjIowCIkxC/9klI4wCI0xC/9AkIowAI0yLAE8CCIsBCIwBjQMAAwAMABVCABsiI4wAIkxC/+IjIowAIkxC/9klI4wAI0xC/9CLAYEICiUSRImKAAApJGeIAA5GAicEEkQkKWVEIhJEiYoAAyQpZUQiCClMZycEIoAEaG1tbYmKAwOL/ov9i/+JigAAKSRniQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/tuple_support/puya.log b/test_cases/tuple_support/puya.log index f63c5f2997..9b8561667c 100644 --- a/test_cases/tuple_support/puya.log +++ b/test_cases/tuple_support/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['tuple_support'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['tuple_support'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing tuple_support/out/module.awst debug: Sealing block@0: // L12 @@ -5667,6 +5667,7 @@ info: Writing tuple_support/out/TupleComparisons.clear.bin info: Writing tuple_support/out/TupleComparisons.approval.puya.map info: Writing tuple_support/out/TupleComparisons.clear.puya.map info: Writing tuple_support/out/NestedTuples.arc32.json +info: Writing tuple_support/out/NestedTuples.arc56.json info: Writing tuple_support/out/NestedTuples.approval.teal info: Writing tuple_support/out/NestedTuples.clear.teal info: Writing tuple_support/out/NestedTuples.approval.bin diff --git a/test_cases/typed_abi_call/out/Greeter.arc56.json b/test_cases/typed_abi_call/out/Greeter.arc56.json new file mode 100644 index 0000000000..2f3014deb1 --- /dev/null +++ b/test_cases/typed_abi_call/out/Greeter.arc56.json @@ -0,0 +1,509 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Greeter", + "structs": {}, + "methods": [ + { + "name": "test_is_a_b", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_method_selector_kinds", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_method_overload", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_arg_conversion", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_15plus_args", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_void", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_ref_types", + "args": [ + { + "type": "application", + "name": "app" + }, + { + "type": "asset", + "name": "asset" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_string", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_bytes", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_uint64", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_biguint", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_tuple", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_native_tuple_method_ref", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_nested_tuples", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_no_args", + "args": [ + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 861, + 917, + 973, + 1029, + 1085, + 1149, + 1162, + 1238, + 1305, + 1323, + 1368, + 1752, + 2029, + 2077, + 2117, + 2159, + 2207, + 2247, + 2288, + 2326, + 2363, + 2402, + 2439, + 2475, + 2524, + 2635, + 2682, + 2729, + 2835, + 2942, + 3049, + 3156, + 3257, + 3393, + 3569, + 3742, + 3776, + 3804, + 3817 + ], + "errorMessage": "ARC4 prefix is valid" + }, + { + "pc": [ + 473, + 503, + 521, + 539, + 557, + 575, + 593, + 617, + 635, + 653, + 671, + 689, + 707, + 725, + 743 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 1989 + ], + "errorMessage": "application exists" + }, + { + "pc": [ + 1981 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 3113 + ], + "errorMessage": "expected arc4 arguments to give the same result" + }, + { + "pc": [ + 3006 + ], + "errorMessage": "expected native arguments to give the same result" + }, + { + "pc": [ + 766 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 476, + 506, + 524, + 542, + 560, + 578, + 596, + 620, + 638, + 656, + 674, + 692, + 710, + 728, + 746 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCA2IDEgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIgMHg5YmY4MTkxMyAweDAwMDAwMDAwMDAwMDAwMDEgMHgxNmUwMzkxOSAweDAwMDI3MzMxIDB4MDAwMjYyMzEgMHhiNGI0MzM0ZSAiZWNobzogczEiIDB4MDAwMDAwMDAwMDAwMDAwMyAweDRhNDQ0Yzc3IDB4MDAwMTczIDB4MjY1OWU4MTggMHgwMDAxNjIgMHhhOWZiNmNmMSAweGQ4Y2MzNjNiIDB4MDMgMHhhYjI3MWNlNCAweGI4NjJlZTE5IDB4MDAwYjY1NjM2ODZmM2EyMDc0NzU3MDZjNjUgMHgwMDAwMDAwMDAwMDAwMDAyIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDMgMHgwZjEwMTExMmRlYWRiZWVmMTQgMHg2NTYzNjg2ZjNhMjA2MjMxIDB4MDAwNDAwMTAwMDA0MDAwODAwMDI3MzMxMDAwMjczMzIwMDAwMDAwMDAwMDAwMDAxMDAwMDAwMDAwMDAwMDAwMjAwMTIwMDAxMzMgMHgwMDA4NjU2MzY4NmYzYTIwNzMzMiAweDY1NjM2ODZmM2EyMDMzIDB4MDAwMDAwMDAwMDAwMDAyYQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci5fX3B1eWFfYXJjNF9yb3V0ZXJfXygpIC0+IHVpbnQ2NDoKX19wdXlhX2FyYzRfcm91dGVyX186CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxOQogICAgcHVzaGJ5dGVzcyAweDA3OTE2YmVhIDB4MTg1OWIwYmEgMHg0ZWIxMWIwZCAweDBkMTc2YTRhIDB4YjU0NzMwYzggMHg3ODU5ZWFmNyAweDI0NDc4YTNjIDB4N2E2MGMwMzUgMHg2YTU1OWNiMyAweDFiZTYwNzEyIDB4MTljYjc4YTQgMHhmMGVmNjg3MyAweDNkMmJmZTM3IDB4NTRlOThmNTYgMHhmNTViNzU2NyAvLyBtZXRob2QgInRlc3RfaXNfYV9iKGJ5dGVbXSxieXRlW10sYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHMoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9tZXRob2Rfb3ZlcmxvYWQoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9hcmdfY29udmVyc2lvbihhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0XzE1cGx1c19hcmdzKGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3Rfdm9pZChhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X3JlZl90eXBlcyhhcHBsaWNhdGlvbixhc3NldCl2b2lkIiwgbWV0aG9kICJ0ZXN0X25hdGl2ZV9zdHJpbmcoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9uYXRpdmVfYnl0ZXMoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9uYXRpdmVfdWludDY0KGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgInRlc3RfbmF0aXZlX2JpZ3VpbnQoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9uYXRpdmVfdHVwbGUoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9uYXRpdmVfdHVwbGVfbWV0aG9kX3JlZihhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X25lc3RlZF90dXBsZXMoYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9ub19hcmdzKGFwcGxpY2F0aW9uKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2lzX2FfYl9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWV0aG9kX3NlbGVjdG9yX2tpbmRzX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9tZXRob2Rfb3ZlcmxvYWRfcm91dGVANCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2FyZ19jb252ZXJzaW9uX3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF8xNXBsdXNfYXJnc19yb3V0ZUA2IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3Rfdm9pZF9yb3V0ZUA3IF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfcmVmX3R5cGVzX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfc3RyaW5nX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfYnl0ZXNfcm91dGVAMTAgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfdWludDY0X3JvdXRlQDExIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbmF0aXZlX2JpZ3VpbnRfcm91dGVAMTIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfdHVwbGVfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfdHVwbGVfbWV0aG9kX3JlZl9yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25lc3RlZF90dXBsZXNfcm91dGVAMTUgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ub19hcmdzX3JvdXRlQDE2CiAgICBpbnRjXzAgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2lzX2FfYl9yb3V0ZUAyOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHRlc3RfaXNfYV9iCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X21ldGhvZF9zZWxlY3Rvcl9raW5kc19yb3V0ZUAzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9tZXRob2Rfc2VsZWN0b3Jfa2luZHMKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfbWV0aG9kX292ZXJsb2FkX3JvdXRlQDQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X21ldGhvZF9vdmVybG9hZAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9hcmdfY29udmVyc2lvbl9yb3V0ZUA1OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjU1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9hcmdfY29udmVyc2lvbgogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF8xNXBsdXNfYXJnc19yb3V0ZUA2OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjcyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3MgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF8xNXBsdXNfYXJncwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF92b2lkX3JvdXRlQDc6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTAwCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3Rfdm9pZAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9yZWZfdHlwZXNfcm91dGVAODoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQXNzZXRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X3JlZl90eXBlcwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfc3RyaW5nX3JvdXRlQDk6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTI4CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbmF0aXZlX3N0cmluZwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfYnl0ZXNfcm91dGVAMTA6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTM5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbmF0aXZlX2J5dGVzCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV91aW50NjRfcm91dGVAMTE6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTUyCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbmF0aXZlX3VpbnQ2NAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfYmlndWludF9yb3V0ZUAxMjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNjMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIGNhbGxzdWIgdGVzdF9uYXRpdmVfYmlndWludAogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9uYXRpdmVfdHVwbGVfcm91dGVAMTM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbmF0aXZlX3R1cGxlCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25hdGl2ZV90dXBsZV9tZXRob2RfcmVmX3JvdXRlQDE0OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjMzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X25hdGl2ZV90dXBsZV9tZXRob2RfcmVmCiAgICBpbnRjXzIgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X25lc3RlZF90dXBsZXNfcm91dGVAMTU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjgzCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3CiAgICAvLyBjbGFzcyBHcmVldGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyODMKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICBjYWxsc3ViIHRlc3RfbmVzdGVkX3R1cGxlcwogICAgaW50Y18yIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9ub19hcmdzX3JvdXRlQDE2OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgY2FsbHN1YiB0ZXN0X25vX2FyZ3MKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AxOToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNwogICAgLy8gY2xhc3MgR3JlZXRlcihBUkM0Q29udHJhY3QpOgogICAgdHhuIE9uQ29tcGxldGlvbgogICAgYm56IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjMKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICAhCiAgICBhc3NlcnQgLy8gaXMgY3JlYXRpbmcKICAgIGludGNfMiAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2FmdGVyX2lmX2Vsc2VAMjM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTcKICAgIC8vIGNsYXNzIEdyZWV0ZXIoQVJDNENvbnRyYWN0KToKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfaXNfYV9iKGE6IGJ5dGVzLCBiOiBieXRlcywgYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfaXNfYV9iOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4LTE5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiB0ZXN0X2lzX2FfYihzZWxmLCBhOiBCeXRlcywgYjogQnl0ZXMsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMC0yNQogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICAiaXNfYV9iKGJ5dGVbXSxieXRlW10pdm9pZCIsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjIKICAgIC8vIGEsCiAgICBmcmFtZV9kaWcgLTMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjMKICAgIC8vIGIsCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIwLTI1CiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgICJpc19hX2IoYnl0ZVtdLGJ5dGVbXSl2b2lkIiwKICAgIC8vICAgICBhLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGM3NzIxMmJjIC8vIG1ldGhvZCAiaXNfYV9iKGJ5dGVbXSxieXRlW10pdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBzd2FwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbWV0aG9kX3NlbGVjdG9yX2tpbmRzKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X21ldGhvZF9zZWxlY3Rvcl9raW5kczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNy0yOAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X21ldGhvZF9zZWxlY3Rvcl9raW5kcyhzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjkKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG8sIGFyYzQuU3RyaW5nKCJ0ZXN0MSIpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNTc0NjU3Mzc0MzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzAKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImVjaG86IHRlc3QxIgogICAgcHVzaGJ5dGVzIDB4MDAwYjY1NjM2ODZmM2EyMDc0NjU3Mzc0MzEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMQogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChMb2dnZXJDbGllbnQuZWNobywgInRlc3QyIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDU3NDY1NzM3NDMyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyCiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJlY2hvOiB0ZXN0MiIKICAgIHB1c2hieXRlcyAweDAwMGI2NTYzNjg2ZjNhMjA3NDY1NzM3NDMyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzMKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGxbYXJjNC5TdHJpbmddKCJlY2hvIiwgInRlc3QzIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDU3NDY1NzM3NDMzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjM0CiAgICAvLyBhc3NlcnQgcmVzdWx0ID09ICJlY2hvOiB0ZXN0MyIKICAgIHB1c2hieXRlcyAweDAwMGI2NTYzNjg2ZjNhMjA3NDY1NzM3NDMzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzUKICAgIC8vIHJlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGxbYXJjNC5TdHJpbmddKCJlY2hvKHN0cmluZykiLCAidGVzdDQiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNTc0NjU3Mzc0MzQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzYKICAgIC8vIGFzc2VydCByZXN1bHQgPT0gImVjaG86IHRlc3Q0IgogICAgcHVzaGJ5dGVzIDB4MDAwYjY1NjM2ODZmM2EyMDc0NjU3Mzc0MzQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozNwogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbFthcmM0LlN0cmluZ10oImVjaG8oc3RyaW5nKXN0cmluZyIsICJ0ZXN0NSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA1NzQ2NTczNzQzNQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozOAogICAgLy8gYXNzZXJ0IHJlc3VsdCA9PSAiZWNobzogdGVzdDUiCiAgICBwdXNoYnl0ZXMgMHgwMDBiNjU2MzY4NmYzYTIwNzQ2NTczNzQzNQogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X21ldGhvZF9vdmVybG9hZChhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9tZXRob2Rfb3ZlcmxvYWQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDAtNDEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9tZXRob2Rfb3ZlcmxvYWQoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQyCiAgICAvLyBhcmM0LmFiaV9jYWxsW2FyYzQuU3RyaW5nXSgiZWNobyhzdHJpbmcpc3RyaW5nIiwgInR5cGVkICsgaWdub3JlIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMGU3NDc5NzA2NTY0MjAyYjIwNjk2NzZlNmY3MjY1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQzCiAgICAvLyBhc3NlcnQgYXJjNC5TdHJpbmcuZnJvbV9sb2cob3AuSVR4bi5sYXN0X2xvZygpKSA9PSAiZWNobzogdHlwZWQgKyBpZ25vcmUiCiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIHB1c2hieXRlcyAweDAwMTQ2NTYzNjg2ZjNhMjA3NDc5NzA2NTY0MjAyYjIwNjk2NzZlNmY3MjY1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDUKICAgIC8vIGFyYzQuYWJpX2NhbGwoImVjaG8oc3RyaW5nKXN0cmluZyIsICJ1bnR5cGVkICsgaWdub3JlIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlY18yIC8vIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMTA3NTZlNzQ3OTcwNjU2NDIwMmIyMDY5Njc2ZTZmNzI2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NDYKICAgIC8vIGFzc2VydCBhcmM0LlN0cmluZy5mcm9tX2xvZyhvcC5JVHhuLmxhc3RfbG9nKCkpID09ICJlY2hvOiB1bnR5cGVkICsgaWdub3JlIgogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBwdXNoYnl0ZXMgMHgwMDE2NjU2MzY4NmYzYTIwNzU2ZTc0Nzk3MDY1NjQyMDJiMjA2OTY3NmU2ZjcyNjUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo0OAogICAgLy8gcmVzdWx0ID0gYXJjNC5hYmlfY2FsbFthcmM0LlN0cmluZ10oImVjaG8oc3RyaW5nKXN0cmluZyIsICJ0dXBsZSIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWNfMiAvLyBtZXRob2QgImVjaG8oc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA1NzQ3NTcwNmM2NQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjQ5CiAgICAvLyBhc3NlcnQgcmVzdWx0WzBdID09ICJlY2hvOiB0dXBsZSIKICAgIHN3YXAKICAgIGJ5dGVjIDE5IC8vIDB4MDAwYjY1NjM2ODZmM2EyMDc0NzU3MDZjNjUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1MAogICAgLy8gYXNzZXJ0IGFyYzQuU3RyaW5nLmZyb21fbG9nKHJlc3VsdFsxXS5sYXN0X2xvZykgPT0gImVjaG86IHR1cGxlIgogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnl0ZWMgMTkgLy8gMHgwMDBiNjU2MzY4NmYzYTIwNzQ3NTcwNmM2NQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjUyCiAgICAvLyB0eG5fcmVzdWx0ID0gYXJjNC5hYmlfY2FsbCgiZWNobyhzdHJpbmcpc3RyaW5nIiwgInVudHlwZWQiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjXzIgLy8gbWV0aG9kICJlY2hvKHN0cmluZylzdHJpbmciCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNzc1NmU3NDc5NzA2NTY0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjUzCiAgICAvLyBhc3NlcnQgYXJjNC5TdHJpbmcuZnJvbV9sb2codHhuX3Jlc3VsdC5sYXN0X2xvZykgPT0gImVjaG86IHVudHlwZWQiCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBwdXNoYnl0ZXMgMHgwMDBkNjU2MzY4NmYzYTIwNzU2ZTc0Nzk3MDY1NjQKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9hcmdfY29udmVyc2lvbihhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9hcmdfY29udmVyc2lvbjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1NS01NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X2FyZ19jb252ZXJzaW9uKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo1NwogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbChMb2dnZXIubG9nX3N0cmluZywgImNvbnZlcnRlZDEiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJsb2coc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwYTYzNmY2ZTc2NjU3Mjc0NjU2NDMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjU4CiAgICAvLyBhc3NlcnQgdHhuLmxhc3RfbG9nID09IGIiY29udmVydGVkMSIKICAgIHB1c2hieXRlcyAweDYzNmY2ZTc2NjU3Mjc0NjU2NDMxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NjAKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmxvZ191aW50NjQsIDIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGJ5dGVzIDB4M2MxMDU4ZDkgLy8gbWV0aG9kICJsb2codWludDY0KXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgYnl0ZWMgMjAgLy8gMHgwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjYxCiAgICAvLyBhc3NlcnQgdHhuLmxhc3RfbG9nID09IG9wLml0b2IoMikKICAgIGludGNfMyAvLyAyCiAgICBpdG9iCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NjMKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmxvZ191aW50NTEyLCAzLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweDZhZjQ1OTMwIC8vIG1ldGhvZCAibG9nKHVpbnQ1MTIpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAyMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjY0CiAgICAvLyBhc3NlcnQgdHhuLmxhc3RfbG9nID09IChvcC5iemVybyg1NikgKyBvcC5pdG9iKDMpKQogICAgYnl0ZWMgMjEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjY2CiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExvZ2dlci5sb2dfYnl0ZXMsIGIiNCIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGJ5dGVzIDB4YjUwMGUxMTEgLy8gbWV0aG9kICJsb2coYnl0ZVtdKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwMTM0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjY3CiAgICAvLyBhc3NlcnQgdHhuLmxhc3RfbG9nID09IGIiNCIKICAgIHB1c2hieXRlcyAweDM0CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NjkKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmxvZ19ib29sLCBUcnVlLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIHB1c2hieXRlcyAweDZlZWQ3ZWMzIC8vIG1ldGhvZCAibG9nKGJvb2wpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHg4MAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3MAogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiIlRydWUiCiAgICBwdXNoYnl0ZXMgMHg1NDcyNzU2NQogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0XzE1cGx1c19hcmdzKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0XzE1cGx1c19hcmdzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjcyLTczCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfMTVwbHVzX2FyZ3Moc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojc0LTk3CiAgICAvLyByZXN1bHQsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLnJldHVybl9hcmdzX2FmdGVyXzE0dGgsCiAgICAvLyAgICAgMSwKICAgIC8vICAgICAyLAogICAgLy8gICAgIDMsCiAgICAvLyAgICAgNCwKICAgIC8vICAgICA1LAogICAgLy8gICAgIDYsCiAgICAvLyAgICAgNywKICAgIC8vICAgICA4LAogICAgLy8gICAgIDksCiAgICAvLyAgICAgMTAsCiAgICAvLyAgICAgMTEsCiAgICAvLyAgICAgMTIsCiAgICAvLyAgICAgMTMsCiAgICAvLyAgICAgMTQsCiAgICAvLyAgICAgMTUsCiAgICAvLyAgICAgMTYsCiAgICAvLyAgICAgMTcsCiAgICAvLyAgICAgMTgsCiAgICAvLyAgICAgYXJjNC5UdXBsZSgoYXJjNC5VSW50OCgweERFKSwgYXJjNC5VSW50OCgweEFEKSwgYXJjNC5VSW50OCgweEJFKSwgYXJjNC5VSW50OCgweEVGKSkpLAogICAgLy8gICAgIDIwLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgcHVzaGJ5dGVzIDB4YmEwYjQzODEgLy8gbWV0aG9kICJyZXR1cm5fYXJnc19hZnRlcl8xNHRoKHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDgsdWludDgsdWludDgsdWludDgsKHVpbnQ4LHVpbnQ4LHVpbnQ4LHVpbnQ4KSx1aW50OClieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojc2CiAgICAvLyAxLAogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzcKICAgIC8vIDIsCiAgICBieXRlYyAyMCAvLyAweDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6NzgKICAgIC8vIDMsCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3OQogICAgLy8gNCwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDQKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODAKICAgIC8vIDUsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDA1CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjgxCiAgICAvLyA2LAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwNgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4MgogICAgLy8gNywKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMDcKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODMKICAgIC8vIDgsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDA4CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojg0CiAgICAvLyA5LAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwOQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4NQogICAgLy8gMTAsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDBhCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojg2CiAgICAvLyAxMSwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMGIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6ODcKICAgIC8vIDEyLAogICAgcHVzaGJ5dGVzIDB4MDAwMDAwMDAwMDAwMDAwYwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo4OAogICAgLy8gMTMsCiAgICBwdXNoYnl0ZXMgMHgwMDAwMDAwMDAwMDAwMDBkCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojg5CiAgICAvLyAxNCwKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMGUKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6OTAtOTUKICAgIC8vIDE1LAogICAgLy8gMTYsCiAgICAvLyAxNywKICAgIC8vIDE4LAogICAgLy8gYXJjNC5UdXBsZSgoYXJjNC5VSW50OCgweERFKSwgYXJjNC5VSW50OCgweEFEKSwgYXJjNC5VSW50OCgweEJFKSwgYXJjNC5VSW50OCgweEVGKSkpLAogICAgLy8gMjAsCiAgICBieXRlYyAyMiAvLyAweDBmMTAxMTEyZGVhZGJlZWYxNAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTo3NC05NwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5yZXR1cm5fYXJnc19hZnRlcl8xNHRoLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICAzLAogICAgLy8gICAgIDQsCiAgICAvLyAgICAgNSwKICAgIC8vICAgICA2LAogICAgLy8gICAgIDcsCiAgICAvLyAgICAgOCwKICAgIC8vICAgICA5LAogICAgLy8gICAgIDEwLAogICAgLy8gICAgIDExLAogICAgLy8gICAgIDEyLAogICAgLy8gICAgIDEzLAogICAgLy8gICAgIDE0LAogICAgLy8gICAgIDE1LAogICAgLy8gICAgIDE2LAogICAgLy8gICAgIDE3LAogICAgLy8gICAgIDE4LAogICAgLy8gICAgIGFyYzQuVHVwbGUoKGFyYzQuVUludDgoMHhERSksIGFyYzQuVUludDgoMHhBRCksIGFyYzQuVUludDgoMHhCRSksIGFyYzQuVUludDgoMHhFRikpKSwKICAgIC8vICAgICAyMCwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5Ojk4CiAgICAvLyBhc3NlcnQgcmVzdWx0Lm5hdGl2ZSA9PSBCeXRlcy5mcm9tX2hleCgiMEYxMDExMTJERUFEQkVFRjE0IikKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlYyAyMiAvLyAweDBmMTAxMTEyZGVhZGJlZWYxNAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X3ZvaWQoYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3Rfdm9pZDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMDAtMTAxCiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3Rfdm9pZChzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTAyCiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExPR19NRVRIT0RfTkFNRSArICIoc3RyaW5nKXZvaWQiLCAiV29ybGQxIiwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA3IC8vIG1ldGhvZCAibG9nKHN0cmluZyl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHB1c2hieXRlcyAweDAwMDY1NzZmNzI2YzY0MzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTAzCiAgICAvLyBhc3NlcnQgdHhuLmxhc3RfbG9nID09IGIiV29ybGQxIgogICAgcHVzaGJ5dGVzIDB4NTc2ZjcyNmM2NDMxCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTA1CiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKExPR19NRVRIT0RfTkFNRSArICIoc3RyaW5nKSIsICJXb3JsZDIiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDcgLy8gbWV0aG9kICJsb2coc3RyaW5nKXZvaWQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgcHVzaGJ5dGVzIDB4MDAwNjU3NmY3MjZjNjQzMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMDYKICAgIC8vIGFzc2VydCB0eG4ubGFzdF9sb2cgPT0gYiJXb3JsZDIiCiAgICBwdXNoYnl0ZXMgMHg1NzZmNzI2YzY0MzIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMDgKICAgIC8vIHR4biA9IGFyYzQuYWJpX2NhbGwoTE9HX01FVEhPRF9OQU1FLCBhcmM0LlN0cmluZygiV29ybGQzIiksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNyAvLyBtZXRob2QgImxvZyhzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA2NTc2ZjcyNmM2NDMzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEwOQogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiIldvcmxkMyIKICAgIHB1c2hieXRlcyAweDU3NmY3MjZjNjQzMwogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExMQogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbChMb2dnZXIubG9nX3N0cmluZywgIldvcmxkNCIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNyAvLyBtZXRob2QgImxvZyhzdHJpbmcpdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBwdXNoYnl0ZXMgMHgwMDA2NTc2ZjcyNmM2NDM0CiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExMgogICAgLy8gYXNzZXJ0IHR4bi5sYXN0X2xvZyA9PSBiIldvcmxkNCIKICAgIHB1c2hieXRlcyAweDU3NmY3MjZjNjQzNAogICAgPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X3JlZl90eXBlcyhhcHA6IHVpbnQ2NCwgYXNzZXQ6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9yZWZfdHlwZXM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE0LTExNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X3JlZl90eXBlcyhzZWxmLCBhcHA6IEFwcGxpY2F0aW9uLCBhc3NldDogQXNzZXQpIC0+IE5vbmU6CiAgICBwcm90byAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTYtMTIyCiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5sb2dfYXNzZXRfYWNjb3VudF9hcHAsCiAgICAvLyAgICAgYXNzZXQsCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhcHAsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTkKICAgIC8vIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgZnJhbWVfZGlnIC0yCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBc3NldHMKICAgIGZyYW1lX2RpZyAtMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbnMKICAgIGl0eG5fZmllbGQgQWNjb3VudHMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMTYtMTIyCiAgICAvLyB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5sb2dfYXNzZXRfYWNjb3VudF9hcHAsCiAgICAvLyAgICAgYXNzZXQsCiAgICAvLyAgICAgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIC8vICAgICBhcHAsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGNkNzI3YjcxIC8vIG1ldGhvZCAibG9nKGFzc2V0LGFjY291bnQsYXBwbGljYXRpb24pdm9pZCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE4CiAgICAvLyBhc3NldCwKICAgIHB1c2hieXRlcyAweDAwCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjExOQogICAgLy8gR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcywKICAgIHB1c2hieXRlcyAweDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEyMAogICAgLy8gYXBwLAogICAgcHVzaGJ5dGVzIDB4MDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTE2LTEyMgogICAgLy8gdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIubG9nX2Fzc2V0X2FjY291bnRfYXBwLAogICAgLy8gICAgIGFzc2V0LAogICAgLy8gICAgIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MsCiAgICAvLyAgICAgYXBwLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTI1CiAgICAvLyA9PSBhc3NldC5uYW1lICsgR2xvYmFsLmN1cnJlbnRfYXBwbGljYXRpb25fYWRkcmVzcy5ieXRlcyArIGFwcC5hZGRyZXNzLmJ5dGVzCiAgICBmcmFtZV9kaWcgLTEKICAgIGFzc2V0X3BhcmFtc19nZXQgQXNzZXROYW1lCiAgICBhc3NlcnQgLy8gYXNzZXQgZXhpc3RzCiAgICBnbG9iYWwgQ3VycmVudEFwcGxpY2F0aW9uQWRkcmVzcwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGFwcF9wYXJhbXNfZ2V0IEFwcEFkZHJlc3MKICAgIGFzc2VydCAvLyBhcHBsaWNhdGlvbiBleGlzdHMKICAgIGNvbmNhdAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEyNC0xMjUKICAgIC8vIHR4bi5sYXN0X2xvZwogICAgLy8gPT0gYXNzZXQubmFtZSArIEdsb2JhbC5jdXJyZW50X2FwcGxpY2F0aW9uX2FkZHJlc3MuYnl0ZXMgKyBhcHAuYWRkcmVzcy5ieXRlcwogICAgPT0KICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjMtMTI2CiAgICAvLyBhc3NlcnQgKAogICAgLy8gICAgIHR4bi5sYXN0X2xvZwogICAgLy8gICAgID09IGFzc2V0Lm5hbWUgKyBHbG9iYWwuY3VycmVudF9hcHBsaWNhdGlvbl9hZGRyZXNzLmJ5dGVzICsgYXBwLmFkZHJlc3MuYnl0ZXMKICAgIC8vICkKICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X25hdGl2ZV9zdHJpbmcoYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfbmF0aXZlX3N0cmluZzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMjgtMTI5CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmF0aXZlX3N0cmluZyhzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTMwCiAgICAvLyByZXN1bHQxLCBfdHhuID0gYXJjNC5hYmlfY2FsbChMb2dnZXIuZWNob19uYXRpdmVfc3RyaW5nLCAicyIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTAgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9zdHJpbmcoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMSAvLyAweDAwMDE3MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTMxCiAgICAvLyBhc3NlcnQgcmVzdWx0MSA9PSAiZWNobzogcyIKICAgIGR1cAogICAgcHVzaGJ5dGVzICJlY2hvOiBzIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzMwogICAgLy8gcmVzdWx0MiwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX3N0cmluZywgU3RyaW5nKCJzIiksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTAgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9zdHJpbmcoc3RyaW5nKXN0cmluZyIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMSAvLyAweDAwMDE3MwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTM0CiAgICAvLyBhc3NlcnQgcmVzdWx0MiA9PSByZXN1bHQxCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzNgogICAgLy8gcmVzdWx0MywgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX3N0cmluZywgYXJjNC5TdHJpbmcoInMiKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3N0cmluZyhzdHJpbmcpc3RyaW5nIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjIDExIC8vIDB4MDAwMTczCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxMzcKICAgIC8vIGFzc2VydCByZXN1bHQzID09IHJlc3VsdDEKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9uYXRpdmVfYnl0ZXMoYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfbmF0aXZlX2J5dGVzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjEzOS0xNDAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uYXRpdmVfYnl0ZXMoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0MQogICAgLy8gcmVzdWx0MSwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX2J5dGVzLCBiImIiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDEyIC8vIG1ldGhvZCAiZWNob19uYXRpdmVfYnl0ZXMoYnl0ZVtdKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMyAvLyAweDAwMDE2MgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTQyCiAgICAvLyBhc3NlcnQgcmVzdWx0MSA9PSBiImVjaG86IGIiCiAgICBkdXAKICAgIHB1c2hieXRlcyAweDY1NjM2ODZmM2EyMDYyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTQ0CiAgICAvLyByZXN1bHQyLCBfdHhuID0gYXJjNC5hYmlfY2FsbChMb2dnZXIuZWNob19uYXRpdmVfYnl0ZXMsIEJ5dGVzKGIiYiIpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDEyIC8vIG1ldGhvZCAiZWNob19uYXRpdmVfYnl0ZXMoYnl0ZVtdKWJ5dGVbXSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlYyAxMyAvLyAweDAwMDE2MgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTQ1CiAgICAvLyBhc3NlcnQgcmVzdWx0MiA9PSByZXN1bHQxCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0Ny0xNDkKICAgIC8vIHJlc3VsdDMsIF90eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV9ieXRlcywgYXJjNC5EeW5hbWljQnl0ZXMoYiJiIiksIGFwcF9pZD1hcHAKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxMiAvLyBtZXRob2QgImVjaG9fbmF0aXZlX2J5dGVzKGJ5dGVbXSlieXRlW10iCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE0OAogICAgLy8gTG9nZ2VyLmVjaG9fbmF0aXZlX2J5dGVzLCBhcmM0LkR5bmFtaWNCeXRlcyhiImIiKSwgYXBwX2lkPWFwcAogICAgYnl0ZWMgMTMgLy8gMHgwMDAxNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTQ3LTE0OQogICAgLy8gcmVzdWx0MywgX3R4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX2J5dGVzLCBhcmM0LkR5bmFtaWNCeXRlcyhiImIiKSwgYXBwX2lkPWFwcAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNTAKICAgIC8vIGFzc2VydCByZXN1bHQzID09IHJlc3VsdDEKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9uYXRpdmVfdWludDY0KGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X25hdGl2ZV91aW50NjQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTUyLTE1MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25hdGl2ZV91aW50NjQoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE1NAogICAgLy8gcmVzdWx0MSwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX3VpbnQ2NCwgMSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3VpbnQ2NCh1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE1NQogICAgLy8gYXNzZXJ0IHJlc3VsdDEgPT0gMgogICAgZHVwCiAgICBpbnRjXzMgLy8gMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE1NwogICAgLy8gcmVzdWx0MiwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX3VpbnQ2NCwgVUludDY0KDEpLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgaW50Y18yIC8vIDEKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3VpbnQ2NCh1aW50NjQpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBidG9pCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTU4CiAgICAvLyBhc3NlcnQgcmVzdWx0MiA9PSByZXN1bHQxCiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2MAogICAgLy8gcmVzdWx0MywgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX3VpbnQ2NCwgYXJjNC5VSW50NjQoMSksIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV91aW50NjQodWludDY0KXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGJ0b2kKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNjEKICAgIC8vIGFzc2VydCByZXN1bHQzID09IHJlc3VsdDEKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9uYXRpdmVfYmlndWludChhcHA6IHVpbnQ2NCkgLT4gdm9pZDoKdGVzdF9uYXRpdmVfYmlndWludDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNjMtMTY0CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmF0aXZlX2JpZ3VpbnQoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE2NQogICAgLy8gcmVzdWx0MSwgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX2JpZ3VpbnQsIDIsIGFwcF9pZD1hcHApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgMTUgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV9iaWd1aW50KHVpbnQ1MTIpdWludDUxMiIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTY2CiAgICAvLyBhc3NlcnQgcmVzdWx0MSA9PSAzCiAgICBkdXAKICAgIGJ5dGVjIDE2IC8vIDB4MDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTY4CiAgICAvLyByZXN1bHQyLCBfdHhuID0gYXJjNC5hYmlfY2FsbChMb2dnZXIuZWNob19uYXRpdmVfYmlndWludCwgQmlnVUludCgyKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxNSAvLyBtZXRob2QgImVjaG9fbmF0aXZlX2JpZ3VpbnQodWludDUxMil1aW50NTEyIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNjkKICAgIC8vIGFzc2VydCByZXN1bHQyID09IHJlc3VsdDEKICAgIGRpZyAxCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3MQogICAgLy8gcmVzdWx0MywgX3R4biA9IGFyYzQuYWJpX2NhbGwoTG9nZ2VyLmVjaG9fbmF0aXZlX2JpZ3VpbnQsIGFyYzQuVUludDUxMigyKSwgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxNSAvLyBtZXRob2QgImVjaG9fbmF0aXZlX2JpZ3VpbnQodWludDUxMil1aW50NTEyIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGJ5dGVjXzEgLy8gMHgwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNzIKICAgIC8vIGFzc2VydCByZXN1bHQzID09IHJlc3VsdDEKICAgIGI9PQogICAgYXNzZXJ0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLnRlc3RfbmF0aXZlX3R1cGxlKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X25hdGl2ZV90dXBsZToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNzQtMTc1CiAgICAvLyBAYXJjNC5hYmltZXRob2QoKQogICAgLy8gZGVmIHRlc3RfbmF0aXZlX3R1cGxlKHNlbGYsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxNzYtMTg2CiAgICAvLyAjIHB5dGhvbiBsaXRlcmFscwogICAgLy8gcmVzdWx0MSwgdHhuID0gYXJjNC5hYmlfY2FsbFsKICAgIC8vICAgICBhcmM0LlR1cGxlW2FyYzQuU3RyaW5nLCBhcmM0LkR5bmFtaWNCeXRlcywgYXJjNC5VSW50NjQsIGFyYzQuVUludDUxMl0KICAgIC8vIF0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICAiczEiLAogICAgLy8gICAgIGIiYjEiLAogICAgLy8gICAgIDEsCiAgICAvLyAgICAgMiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTgxCiAgICAvLyAiczEiLAogICAgYnl0ZWMgNSAvLyAweDAwMDI3MzMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE4MgogICAgLy8gYiJiMSIsCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTgzCiAgICAvLyAxLAogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTg0CiAgICAvLyAyLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE3Ni0xODYKICAgIC8vICMgcHl0aG9uIGxpdGVyYWxzCiAgICAvLyByZXN1bHQxLCB0eG4gPSBhcmM0LmFiaV9jYWxsWwogICAgLy8gICAgIGFyYzQuVHVwbGVbYXJjNC5TdHJpbmcsIGFyYzQuRHluYW1pY0J5dGVzLCBhcmM0LlVJbnQ2NCwgYXJjNC5VSW50NTEyXQogICAgLy8gXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgICJzMSIsCiAgICAvLyAgICAgYiJiMSIsCiAgICAvLyAgICAgMSwKICAgIC8vICAgICAyLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTg3CiAgICAvLyBzLCBiLCB1LCBidSA9IHJlc3VsdDEubmF0aXZlCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDIKICAgIGV4dHJhY3QgNCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgZGlnIDMKICAgIGV4dHJhY3QgMTIgNjQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTg4CiAgICAvLyBhc3NlcnQgcy5uYXRpdmUgPT0gImVjaG86IHMxIgogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBieXRlYyA4IC8vICJlY2hvOiBzMSIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxODkKICAgIC8vIGFzc2VydCBiLm5hdGl2ZSA9PSBiImVjaG86IGIxIgogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDIgMAogICAgZHVwCiAgICBieXRlYyAyMyAvLyAweDY1NjM2ODZmM2EyMDYyMzEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxOTAKICAgIC8vIGFzc2VydCB1Lm5hdGl2ZSA9PSAyCiAgICB1bmNvdmVyIDMKICAgIGJ0b2kKICAgIGR1cAogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxOTEKICAgIC8vIGFzc2VydCBidS5uYXRpdmUgPT0gMwogICAgZGlnIDMKICAgIGJ5dGVjIDE2IC8vIDB4MDMKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTkzLTIwMwogICAgLy8gIyB0ZXN0IGFnYWluIHVzaW5nIG5hdGl2ZSB0eXBlcyBpbiBhcmd1bWVudHMKICAgIC8vIHJlc3VsdDIsIHR4biA9IGFyYzQuYWJpX2NhbGxbCiAgICAvLyAgICAgYXJjNC5UdXBsZVthcmM0LlN0cmluZywgYXJjNC5EeW5hbWljQnl0ZXMsIGFyYzQuVUludDY0LCBhcmM0LlVJbnQ1MTJdCiAgICAvLyBdKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIEJ5dGVzKGIiYjEiKSwKICAgIC8vICAgICBVSW50NjQoMSksCiAgICAvLyAgICAgQmlnVUludCgyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIwMAogICAgLy8gVUludDY0KDEpLAogICAgaW50Y18yIC8vIDEKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MTkzLTIwMwogICAgLy8gIyB0ZXN0IGFnYWluIHVzaW5nIG5hdGl2ZSB0eXBlcyBpbiBhcmd1bWVudHMKICAgIC8vIHJlc3VsdDIsIHR4biA9IGFyYzQuYWJpX2NhbGxbCiAgICAvLyAgICAgYXJjNC5UdXBsZVthcmM0LlN0cmluZywgYXJjNC5EeW5hbWljQnl0ZXMsIGFyYzQuVUludDY0LCBhcmM0LlVJbnQ1MTJdCiAgICAvLyBdKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIEJ5dGVzKGIiYjEiKSwKICAgIC8vICAgICBVSW50NjQoMSksCiAgICAvLyAgICAgQmlnVUludCgyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgYnl0ZWMgNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxOTgKICAgIC8vIFN0cmluZygiczEiKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAyNzMzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToxOTkKICAgIC8vIEJ5dGVzKGIiYjEiKSwKICAgIGJ5dGVjIDYgLy8gMHgwMDAyNjIzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjAxCiAgICAvLyBCaWdVSW50KDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjE5My0yMDMKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgdHlwZXMgaW4gYXJndW1lbnRzCiAgICAvLyByZXN1bHQyLCB0eG4gPSBhcmM0LmFiaV9jYWxsWwogICAgLy8gICAgIGFyYzQuVHVwbGVbYXJjNC5TdHJpbmcsIGFyYzQuRHluYW1pY0J5dGVzLCBhcmM0LlVJbnQ2NCwgYXJjNC5VSW50NTEyXQogICAgLy8gXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIFN0cmluZygiczEiKSwKICAgIC8vICAgICBCeXRlcyhiImIxIiksCiAgICAvLyAgICAgVUludDY0KDEpLAogICAgLy8gICAgIEJpZ1VJbnQoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMDQKICAgIC8vIGFzc2VydCByZXN1bHQxID09IHJlc3VsdDIKICAgIGRpZyA1CiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjA2LTIxNgogICAgLy8gIyB0ZXN0IGFnYWluIHVzaW5nIGFyYzQgdHlwZXMgaW4gYXJndW1lbnRzCiAgICAvLyByZXN1bHQzLCB0eG4gPSBhcmM0LmFiaV9jYWxsWwogICAgLy8gICAgIGFyYzQuVHVwbGVbYXJjNC5TdHJpbmcsIGFyYzQuRHluYW1pY0J5dGVzLCBhcmM0LlVJbnQ2NCwgYXJjNC5VSW50NTEyXQogICAgLy8gXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxMQogICAgLy8gYXJjNC5TdHJpbmcoInMxIiksCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjEyCiAgICAvLyBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjEzCiAgICAvLyBhcmM0LlVJbnQ2NCgxKSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIxNAogICAgLy8gYXJjNC5VSW50NTEyKDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIwNi0yMTYKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBhcmM0IHR5cGVzIGluIGFyZ3VtZW50cwogICAgLy8gcmVzdWx0MywgdHhuID0gYXJjNC5hYmlfY2FsbFsKICAgIC8vICAgICBhcmM0LlR1cGxlW2FyYzQuU3RyaW5nLCBhcmM0LkR5bmFtaWNCeXRlcywgYXJjNC5VSW50NjQsIGFyYzQuVUludDUxMl0KICAgIC8vIF0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBhcmM0LlN0cmluZygiczEiKSwKICAgIC8vICAgICBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYXJjNC5VSW50NTEyKDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjE3CiAgICAvLyBhc3NlcnQgcmVzdWx0MSA9PSByZXN1bHQzCiAgICB1bmNvdmVyIDUKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMTktMjI3CiAgICAvLyAjIHRlc3QgYWdhaW4gdXNpbmcgbmF0aXZlIHJlc3VsdCB0eXBlCiAgICAvLyByZXN1bHRfbmF0aXZlLCB0eG4gPSBhcmM0LmFiaV9jYWxsW3R1cGxlW1N0cmluZywgQnl0ZXMsIFVJbnQ2NCwgQmlnVUludF1dKAogICAgLy8gICAgICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIsCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoInMxIiksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDEpLAogICAgLy8gICAgIGFyYzQuVUludDUxMigyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjIyCiAgICAvLyBhcmM0LlN0cmluZygiczEiKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAyNzMzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMjMKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIGJ5dGVjIDYgLy8gMHgwMDAyNjIzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMjQKICAgIC8vIGFyYzQuVUludDY0KDEpLAogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjI1CiAgICAvLyBhcmM0LlVJbnQ1MTIoMiksCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjE5LTIyNwogICAgLy8gIyB0ZXN0IGFnYWluIHVzaW5nIG5hdGl2ZSByZXN1bHQgdHlwZQogICAgLy8gcmVzdWx0X25hdGl2ZSwgdHhuID0gYXJjNC5hYmlfY2FsbFt0dXBsZVtTdHJpbmcsIEJ5dGVzLCBVSW50NjQsIEJpZ1VJbnRdXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIGRpZyAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBleHRyYWN0IDQgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIHVuY292ZXIgMwogICAgZXh0cmFjdCAxMiA2NCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMjgKICAgIC8vIGFzc2VydCByZXN1bHQxLm5hdGl2ZVswXS5uYXRpdmUgPT0gcmVzdWx0X25hdGl2ZVswXQogICAgdW5jb3ZlciA2CiAgICB1bmNvdmVyIDQKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMjkKICAgIC8vIGFzc2VydCByZXN1bHQxLm5hdGl2ZVsxXS5uYXRpdmUgPT0gcmVzdWx0X25hdGl2ZVsxXQogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDMKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMzAKICAgIC8vIGFzc2VydCByZXN1bHQxLm5hdGl2ZVsyXS5uYXRpdmUgPT0gcmVzdWx0X25hdGl2ZVsyXQogICAgY292ZXIgMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzMQogICAgLy8gYXNzZXJ0IHJlc3VsdDEubmF0aXZlWzNdLm5hdGl2ZSA9PSByZXN1bHRfbmF0aXZlWzNdCiAgICBiPT0KICAgIGFzc2VydAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC50eXBlZF9jMmMuR3JlZXRlci50ZXN0X25hdGl2ZV90dXBsZV9tZXRob2RfcmVmKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X25hdGl2ZV90dXBsZV9tZXRob2RfcmVmOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjIzMy0yMzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgdGVzdF9uYXRpdmVfdHVwbGVfbWV0aG9kX3JlZihzZWxmLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjM1LTI0MwogICAgLy8gIyB0ZXN0IHdpdGggbGl0ZXJhbCBhcmdzCiAgICAvLyByZXN1bHQsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX3R1cGxlLAogICAgLy8gICAgICJzMSIsCiAgICAvLyAgICAgYiJiMSIsCiAgICAvLyAgICAgMSwKICAgIC8vICAgICAyLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpdHhuX2JlZ2luCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgYnl0ZWMgNCAvLyBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyMzgKICAgIC8vICJzMSIsCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjM5CiAgICAvLyBiImIxIiwKICAgIGJ5dGVjIDYgLy8gMHgwMDAyNjIzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNDAKICAgIC8vIDEsCiAgICBieXRlY18zIC8vIDB4MDAwMDAwMDAwMDAwMDAwMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNDEKICAgIC8vIDIsCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjM1LTI0MwogICAgLy8gIyB0ZXN0IHdpdGggbGl0ZXJhbCBhcmdzCiAgICAvLyByZXN1bHQsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmF0aXZlX3R1cGxlLAogICAgLy8gICAgICJzMSIsCiAgICAvLyAgICAgYiJiMSIsCiAgICAvLyAgICAgMSwKICAgIC8vICAgICAyLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCA0IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QgMTIgNjQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjQ1CiAgICAvLyBhc3NlcnQgcyA9PSAiZWNobzogczEiCiAgICBkaWcgMwogICAgYnl0ZWMgOCAvLyAiZWNobzogczEiCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjQ2CiAgICAvLyBhc3NlcnQgYiA9PSBiImVjaG86IGIxIgogICAgZGlnIDIKICAgIGJ5dGVjIDIzIC8vIDB4NjU2MzY4NmYzYTIwNjIzMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI0NwogICAgLy8gYXNzZXJ0IHUgPT0gMgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjQ4CiAgICAvLyBhc3NlcnQgYnUgPT0gMwogICAgZHVwCiAgICBieXRlYyAxNiAvLyAweDAzCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1MC0yNTgKICAgIC8vICMgdGVzdCB3aXRoIG5hdGl2ZSBhcmdzCiAgICAvLyByZXN1bHRfMiwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfdHVwbGUsCiAgICAvLyAgICAgU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIEJ5dGVzKGIiYjEiKSwKICAgIC8vICAgICBVSW50NjQoMSksCiAgICAvLyAgICAgQmlnVUludCgyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1NQogICAgLy8gVUludDY0KDEpLAogICAgaW50Y18yIC8vIDEKICAgIGl0b2IKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjUwLTI1OAogICAgLy8gIyB0ZXN0IHdpdGggbmF0aXZlIGFyZ3MKICAgIC8vIHJlc3VsdF8yLCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV90dXBsZSwKICAgIC8vICAgICBTdHJpbmcoInMxIiksCiAgICAvLyAgICAgQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIFVJbnQ2NCgxKSwKICAgIC8vICAgICBCaWdVSW50KDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1MwogICAgLy8gU3RyaW5nKCJzMSIpLAogICAgYnl0ZWMgNSAvLyAweDAwMDI3MzMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI1NAogICAgLy8gQnl0ZXMoYiJiMSIpLAogICAgYnl0ZWMgNiAvLyAweDAwMDI2MjMxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNTYKICAgIC8vIEJpZ1VJbnQoMiksCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjUwLTI1OAogICAgLy8gIyB0ZXN0IHdpdGggbmF0aXZlIGFyZ3MKICAgIC8vIHJlc3VsdF8yLCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25hdGl2ZV90dXBsZSwKICAgIC8vICAgICBTdHJpbmcoInMxIiksCiAgICAvLyAgICAgQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIFVJbnQ2NCgxKSwKICAgIC8vICAgICBCaWdVSW50KDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCA0IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QgMTIgNjQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjU5CiAgICAvLyBhc3NlcnQgcmVzdWx0XzIgPT0gcmVzdWx0LCAiZXhwZWN0ZWQgbmF0aXZlIGFyZ3VtZW50cyB0byBnaXZlIHRoZSBzYW1lIHJlc3VsdCIKICAgIHVuY292ZXIgMwogICAgZGlnIDcKICAgID09CiAgICB1bmNvdmVyIDMKICAgIGRpZyA2CiAgICA9PQogICAgJiYKICAgIHVuY292ZXIgMgogICAgZGlnIDQKICAgID09CiAgICAmJgogICAgc3dhcAogICAgZGlnIDIKICAgIGI9PQogICAgJiYKICAgIGFzc2VydCAvLyBleHBlY3RlZCBuYXRpdmUgYXJndW1lbnRzIHRvIGdpdmUgdGhlIHNhbWUgcmVzdWx0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjYxLTI2OQogICAgLy8gIyB0ZXN0IHdpdGggYXJjNCBhcmdzCiAgICAvLyByZXN1bHRfMywgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfdHVwbGUsCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoInMxIiksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDEpLAogICAgLy8gICAgIGFyYzQuVUludDUxMigyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDQgLy8gbWV0aG9kICJlY2hvX25hdGl2ZV90dXBsZShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKShzdHJpbmcsYnl0ZVtdLHVpbnQ2NCx1aW50NTEyKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjY0CiAgICAvLyBhcmM0LlN0cmluZygiczEiKSwKICAgIGJ5dGVjIDUgLy8gMHgwMDAyNzMzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNjUKICAgIC8vIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIGJ5dGVjIDYgLy8gMHgwMDAyNjIzMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyNjYKICAgIC8vIGFyYzQuVUludDY0KDEpLAogICAgYnl0ZWNfMyAvLyAweDAwMDAwMDAwMDAwMDAwMDEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjY3CiAgICAvLyBhcmM0LlVJbnQ1MTIoMiksCiAgICBieXRlY18xIC8vIDB4MDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjYxLTI2OQogICAgLy8gIyB0ZXN0IHdpdGggYXJjNCBhcmdzCiAgICAvLyByZXN1bHRfMywgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uYXRpdmVfdHVwbGUsCiAgICAvLyAgICAgYXJjNC5TdHJpbmcoInMxIiksCiAgICAvLyAgICAgYXJjNC5EeW5hbWljQnl0ZXMoYiJiMSIpLAogICAgLy8gICAgIGFyYzQuVUludDY0KDEpLAogICAgLy8gICAgIGFyYzQuVUludDUxMigyKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaW50Y18xIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgZGlnIDMKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGV4dHJhY3QgNCA4IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgYnRvaQogICAgdW5jb3ZlciAzCiAgICBleHRyYWN0IDEyIDY0IC8vIG9uIGVycm9yOiBJbmRleCBhY2Nlc3MgaXMgb3V0IG9mIGJvdW5kcwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3MAogICAgLy8gYXNzZXJ0IHJlc3VsdF8zID09IHJlc3VsdCwgImV4cGVjdGVkIGFyYzQgYXJndW1lbnRzIHRvIGdpdmUgdGhlIHNhbWUgcmVzdWx0IgogICAgdW5jb3ZlciAzCiAgICBkaWcgNwogICAgPT0KICAgIHVuY292ZXIgMwogICAgZGlnIDYKICAgID09CiAgICAmJgogICAgdW5jb3ZlciAyCiAgICBkaWcgNAogICAgPT0KICAgICYmCiAgICBzd2FwCiAgICBkaWcgMgogICAgYj09CiAgICAmJgogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFyYzQgYXJndW1lbnRzIHRvIGdpdmUgdGhlIHNhbWUgcmVzdWx0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjcyLTI4MAogICAgLy8gIyB0ZXN0IGFnYWluIHVzaW5nIG5hdGl2ZSByZXN1bHQgdHlwZQogICAgLy8gcmVzdWx0X25hdGl2ZSwgdHhuID0gYXJjNC5hYmlfY2FsbFt0dXBsZVtTdHJpbmcsIEJ5dGVzLCBVSW50NjQsIEJpZ1VJbnRdXSgKICAgIC8vICAgICAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiLAogICAgLy8gICAgIGFyYzQuU3RyaW5nKCJzMSIpLAogICAgLy8gICAgIGFyYzQuRHluYW1pY0J5dGVzKGIiYjEiKSwKICAgIC8vICAgICBhcmM0LlVJbnQ2NCgxKSwKICAgIC8vICAgICBhcmM0LlVJbnQ1MTIoMiksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyA0IC8vIG1ldGhvZCAiZWNob19uYXRpdmVfdHVwbGUoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikoc3RyaW5nLGJ5dGVbXSx1aW50NjQsdWludDUxMikiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3NQogICAgLy8gYXJjNC5TdHJpbmcoInMxIiksCiAgICBieXRlYyA1IC8vIDB4MDAwMjczMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjc2CiAgICAvLyBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICBieXRlYyA2IC8vIDB4MDAwMjYyMzEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjc3CiAgICAvLyBhcmM0LlVJbnQ2NCgxKSwKICAgIGJ5dGVjXzMgLy8gMHgwMDAwMDAwMDAwMDAwMDAxCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3OAogICAgLy8gYXJjNC5VSW50NTEyKDIpLAogICAgYnl0ZWNfMSAvLyAweDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAyCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI3Mi0yODAKICAgIC8vICMgdGVzdCBhZ2FpbiB1c2luZyBuYXRpdmUgcmVzdWx0IHR5cGUKICAgIC8vIHJlc3VsdF9uYXRpdmUsIHR4biA9IGFyYzQuYWJpX2NhbGxbdHVwbGVbU3RyaW5nLCBCeXRlcywgVUludDY0LCBCaWdVSW50XV0oCiAgICAvLyAgICAgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwKICAgIC8vICAgICBhcmM0LlN0cmluZygiczEiKSwKICAgIC8vICAgICBhcmM0LkR5bmFtaWNCeXRlcyhiImIxIiksCiAgICAvLyAgICAgYXJjNC5VSW50NjQoMSksCiAgICAvLyAgICAgYXJjNC5VSW50NTEyKDIpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgbGVuCiAgICBkaWcgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGV4dHJhY3QgMiAwCiAgICBkaWcgMgogICAgZXh0cmFjdCA0IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICB1bmNvdmVyIDMKICAgIGV4dHJhY3QgMTIgNjQgLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjgxCiAgICAvLyBhc3NlcnQgcmVzdWx0X25hdGl2ZSA9PSByZXN1bHQKICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciA3CiAgICA9PQogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDYKICAgID09CiAgICAmJgogICAgdW5jb3ZlciAyCiAgICB1bmNvdmVyIDQKICAgID09CiAgICAmJgogICAgc3dhcAogICAgdW5jb3ZlciAyCiAgICBiPT0KICAgICYmCiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9uZXN0ZWRfdHVwbGVzKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X25lc3RlZF90dXBsZXM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MjgzLTI4NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25lc3RlZF90dXBsZXMoc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI4NS0yOTAKICAgIC8vICMgbGl0ZXJhbCBhcmdzCiAgICAvLyByZXN1bHQsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmVzdGVkX3R1cGxlLAogICAgLy8gICAgICgoInMxIiwgInMyIiksICgxLCAyLCBiIjMiKSksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxNyAvLyBtZXRob2QgImVjaG9fbmVzdGVkX3R1cGxlKCgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkpKChzdHJpbmcsc3RyaW5nKSwodWludDY0LHVpbnQ2NCxieXRlW10pKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjg4CiAgICAvLyAoKCJzMSIsICJzMiIpLCAoMSwgMiwgYiIzIikpLAogICAgYnl0ZWMgMjQgLy8gMHgwMDA0MDAxMDAwMDQwMDA4MDAwMjczMzEwMDAyNzMzMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAxMjAwMDEzMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyODUtMjkwCiAgICAvLyAjIGxpdGVyYWwgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25lc3RlZF90dXBsZSwKICAgIC8vICAgICAoKCJzMSIsICJzMiIpLCAoMSwgMiwgYiIzIikpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyOTIKICAgIC8vIGFzc2VydCBzMSA9PSAiZWNobzogczEiCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjIDggLy8gImVjaG86IHMxIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI5MwogICAgLy8gYXNzZXJ0IHMyID09ICJlY2hvOiBzMiIKICAgIHVuY292ZXIgMwogICAgYnl0ZWMgMjUgLy8gMHgwMDA4NjU2MzY4NmYzYTIwNzMzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjI5NAogICAgLy8gYXNzZXJ0IHU2NF8xID09IDIKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyOTUKICAgIC8vIGFzc2VydCB1NjRfMiA9PSAzCiAgICBzd2FwCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyOTYKICAgIC8vIGFzc2VydCBieXRleiA9PSBiImVjaG86IDMiCiAgICBieXRlYyAyNiAvLyAweDY1NjM2ODZmM2EyMDMzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6Mjk4LTMwMwogICAgLy8gIyBuYXRpdmUgYXJncwogICAgLy8gcmVzdWx0LCB0eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIExvZ2dlci5lY2hvX25lc3RlZF90dXBsZSwKICAgIC8vICAgICAoKFN0cmluZygiczEiKSwgYXJjNC5TdHJpbmcoInMyIikpLCAoVUludDY0KDEpLCBhcmM0LlVJbnQ2NCgyKSwgQnl0ZXMoYiIzIikpKSwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDE3IC8vIG1ldGhvZCAiZWNob19uZXN0ZWRfdHVwbGUoKChzdHJpbmcsc3RyaW5nKSwodWludDY0LHVpbnQ2NCxieXRlW10pKSkoKHN0cmluZyxzdHJpbmcpLCh1aW50NjQsdWludDY0LGJ5dGVbXSkpIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMDEKICAgIC8vICgoU3RyaW5nKCJzMSIpLCBhcmM0LlN0cmluZygiczIiKSksIChVSW50NjQoMSksIGFyYzQuVUludDY0KDIpLCBCeXRlcyhiIjMiKSkpLAogICAgYnl0ZWMgMjQgLy8gMHgwMDA0MDAxMDAwMDQwMDA4MDAwMjczMzEwMDAyNzMzMjAwMDAwMDAwMDAwMDAwMDEwMDAwMDAwMDAwMDAwMDAyMDAxMjAwMDEzMwogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weToyOTgtMzAzCiAgICAvLyAjIG5hdGl2ZSBhcmdzCiAgICAvLyByZXN1bHQsIHR4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgTG9nZ2VyLmVjaG9fbmVzdGVkX3R1cGxlLAogICAgLy8gICAgICgoU3RyaW5nKCJzMSIpLCBhcmM0LlN0cmluZygiczIiKSksIChVSW50NjQoMSksIGFyYzQuVUludDY0KDIpLCBCeXRlcyhiIjMiKSkpLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBkdXAKICAgIGludGNfMCAvLyAwCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDEKICAgIGludGNfMyAvLyAyCiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDIKICAgIHVuY292ZXIgMgogICAgZGlnIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIGRpZyAyCiAgICBsZW4KICAgIHVuY292ZXIgMwogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDIKICAgIHN1YnN0cmluZzMKICAgIGR1cAogICAgZXh0cmFjdCAwIDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBidG9pCiAgICBkaWcgMQogICAgZXh0cmFjdCA4IDggLy8gb24gZXJyb3I6IEluZGV4IGFjY2VzcyBpcyBvdXQgb2YgYm91bmRzCiAgICBkaWcgMgogICAgcHVzaGludCAxNiAvLyAxNgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAzCiAgICBsZW4KICAgIHVuY292ZXIgNAogICAgY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMDUKICAgIC8vIGFzc2VydCBzMSA9PSAiZWNobzogczEiCiAgICB1bmNvdmVyIDQKICAgIGJ5dGVjIDggLy8gImVjaG86IHMxIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMwNgogICAgLy8gYXNzZXJ0IHMyID09ICJlY2hvOiBzMiIKICAgIHVuY292ZXIgMwogICAgYnl0ZWMgMjUgLy8gMHgwMDA4NjU2MzY4NmYzYTIwNzMzMgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMwNwogICAgLy8gYXNzZXJ0IHU2NF8xID09IDIKICAgIHVuY292ZXIgMgogICAgaW50Y18zIC8vIDIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMDgKICAgIC8vIGFzc2VydCB1NjRfMiA9PSAzCiAgICBzd2FwCiAgICBieXRlYyA5IC8vIDB4MDAwMDAwMDAwMDAwMDAwMwogICAgYj09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMDkKICAgIC8vIGFzc2VydCBieXRleiA9PSBiImVjaG86IDMiCiAgICBieXRlYyAyNiAvLyAweDY1NjM2ODZmM2EyMDMzCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzExLTMyMQogICAgLy8gIyBhcmM0IGFyZ3MKICAgIC8vIHJlc3VsdCwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uZXN0ZWRfdHVwbGUsCiAgICAvLyAgICAgYXJjNC5UdXBsZSgKICAgIC8vICAgICAgICAgKAogICAgLy8gICAgICAgICAgICAgYXJjNC5UdXBsZSgoYXJjNC5TdHJpbmcoInMxYiIpLCBhcmM0LlN0cmluZygiczJiIikpKSwKICAgIC8vICAgICAgICAgICAgIGFyYzQuVHVwbGUoKGFyYzQuVUludDY0KDExKSwgYXJjNC5VSW50NjQoMjEpLCBhcmM0LkR5bmFtaWNCeXRlcyhiIjNiIikpKSwKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgICksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxNyAvLyBtZXRob2QgImVjaG9fbmVzdGVkX3R1cGxlKCgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkpKChzdHJpbmcsc3RyaW5nKSwodWludDY0LHVpbnQ2NCxieXRlW10pKSIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzE0LTMxOQogICAgLy8gYXJjNC5UdXBsZSgKICAgIC8vICAgICAoCiAgICAvLyAgICAgICAgIGFyYzQuVHVwbGUoKGFyYzQuU3RyaW5nKCJzMWIiKSwgYXJjNC5TdHJpbmcoInMyYiIpKSksCiAgICAvLyAgICAgICAgIGFyYzQuVHVwbGUoKGFyYzQuVUludDY0KDExKSwgYXJjNC5VSW50NjQoMjEpLCBhcmM0LkR5bmFtaWNCeXRlcyhiIjNiIikpKSwKICAgIC8vICAgICApCiAgICAvLyApLAogICAgcHVzaGJ5dGVzIDB4MDAwNDAwMTIwMDA0MDAwOTAwMDM3MzMxNjIwMDAzNzMzMjYyMDAwMDAwMDAwMDAwMDAwYjAwMDAwMDAwMDAwMDAwMTUwMDEyMDAwMjMzNjIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzExLTMyMQogICAgLy8gIyBhcmM0IGFyZ3MKICAgIC8vIHJlc3VsdCwgdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBMb2dnZXIuZWNob19uZXN0ZWRfdHVwbGUsCiAgICAvLyAgICAgYXJjNC5UdXBsZSgKICAgIC8vICAgICAgICAgKAogICAgLy8gICAgICAgICAgICAgYXJjNC5UdXBsZSgoYXJjNC5TdHJpbmcoInMxYiIpLCBhcmM0LlN0cmluZygiczJiIikpKSwKICAgIC8vICAgICAgICAgICAgIGFyYzQuVHVwbGUoKGFyYzQuVUludDY0KDExKSwgYXJjNC5VSW50NjQoMjEpLCBhcmM0LkR5bmFtaWNCeXRlcyhiIjNiIikpKSwKICAgIC8vICAgICAgICAgKQogICAgLy8gICAgICksCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIGR1cAogICAgaW50Y18wIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzAgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciA0CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyMwogICAgLy8gYXNzZXJ0IHMxID09ICJlY2hvOiBzMWIiCiAgICB1bmNvdmVyIDQKICAgIHB1c2hieXRlcyAiZWNobzogczFiIgogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMyNAogICAgLy8gYXNzZXJ0IHMyID09ICJlY2hvOiBzMmIiCiAgICB1bmNvdmVyIDMKICAgIHB1c2hieXRlcyAweDAwMDk2NTYzNjg2ZjNhMjA3MzMyNjIKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMjUKICAgIC8vIGFzc2VydCB1NjRfMSA9PSAxMgogICAgdW5jb3ZlciAyCiAgICBwdXNoaW50IDEyIC8vIDEyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzI2CiAgICAvLyBhc3NlcnQgdTY0XzIgPT0gMjIKICAgIHN3YXAKICAgIHB1c2hieXRlcyAweDAwMDAwMDAwMDAwMDAwMTYKICAgIGI9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzI3CiAgICAvLyBhc3NlcnQgYnl0ZXogPT0gYiJlY2hvOiAzYiIKICAgIHB1c2hieXRlcyAweDY1NjM2ODZmM2EyMDMzNjIKICAgID09CiAgICBhc3NlcnQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwudHlwZWRfYzJjLkdyZWV0ZXIudGVzdF9ub19hcmdzKGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X25vX2FyZ3M6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzI5LTMzMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiB0ZXN0X25vX2FyZ3Moc2VsZiwgYXBwOiBBcHBsaWNhdGlvbikgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzMQogICAgLy8gcmVzdWx0LCBfdHhuID0gYXJjNC5hYmlfY2FsbChMb2dnZXIubm9fYXJncywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxOCAvLyBtZXRob2QgIm5vX2FyZ3MoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBidG9pCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzMyCiAgICAvLyBhc3NlcnQgcmVzdWx0ID09IDQyCiAgICBwdXNoaW50IDQyIC8vIDQyCiAgICA9PQogICAgYXNzZXJ0CiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzMzCiAgICAvLyBhcmM0X3Jlc3VsdCwgX3R4biA9IGFyYzQuYWJpX2NhbGxbYXJjNC5VSW50NjRdKCJub19hcmdzKCl1aW50NjQiLCBhcHBfaWQ9YXBwKQogICAgaXR4bl9iZWdpbgogICAgZnJhbWVfZGlnIC0xCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uSUQKICAgIGJ5dGVjIDE4IC8vIG1ldGhvZCAibm9fYXJncygpdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGludGNfMSAvLyBhcHBsCiAgICBpdHhuX2ZpZWxkIFR5cGVFbnVtCiAgICBpbnRjXzAgLy8gMAogICAgaXR4bl9maWVsZCBGZWUKICAgIGl0eG5fc3VibWl0CiAgICBpdHhuIExhc3RMb2cKICAgIGR1cAogICAgZXh0cmFjdCA0IDAKICAgIHN3YXAKICAgIGV4dHJhY3QgMCA0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgID09CiAgICBhc3NlcnQgLy8gQVJDNCBwcmVmaXggaXMgdmFsaWQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL3R5cGVkX2MyYy5weTozMzQKICAgIC8vIGFzc2VydCBhcmM0X3Jlc3VsdCA9PSA0MgogICAgYnl0ZWMgMjcgLy8gMHgwMDAwMDAwMDAwMDAwMDJhCiAgICBiPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvdHlwZWRfYzJjLnB5OjMzNgogICAgLy8gYXJjNC5hYmlfY2FsbChMb2dnZXIubm9fYXJncywgYXBwX2lkPWFwcCkKICAgIGl0eG5fYmVnaW4KICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICBieXRlYyAxOCAvLyBtZXRob2QgIm5vX2FyZ3MoKXVpbnQ2NCIKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzEgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgaXR4biBMYXN0TG9nCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbC90eXBlZF9jMmMucHk6MzM3CiAgICAvLyBhc3NlcnQgYXJjNC5VSW50NjQuZnJvbV9sb2cob3AuSVR4bi5sYXN0X2xvZygpKSA9PSA0MgogICAgaXR4biBMYXN0TG9nCiAgICBkdXAKICAgIGV4dHJhY3QgNCAwCiAgICBzd2FwCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICBieXRlYyAyNyAvLyAweDAwMDAwMDAwMDAwMDAwMmEKICAgIGI9PQogICAgYXNzZXJ0CiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLnR5cGVkX2MyYy5HcmVldGVyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAEAAYBAiYcBBUffHVAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgSb+BkTCAAAAAAAAAABBBbgORkEAAJzMQQAAmIxBLS0M04IZWNobzogczEIAAAAAAAAAAMESkRMdwMAAXMEJlnoGAMAAWIEqfts8QTYzDY7AQMEqycc5AS4Yu4ZDQALZWNobzogdHVwbGUIAAAAAAAAAAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwkPEBES3q2+7xQIZWNobzogYjElAAQAEAAEAAgAAnMxAAJzMgAAAAAAAAABAAAAAAAAAAIAEgABMwoACGVjaG86IHMyB2VjaG86IDMIAAAAAAAAACqIAAFDigABMRtBAZKCDwQHkWvqBBhZsLoETrEbDQQNF2pKBLVHMMgEeFnq9wQkR4o8BHpgwDUEalWcswQb5gcSBBnLeKQE8O9ocwQ9K/43BFTpj1YE9Vt1ZzYaAI4PAAIAIAAyAEQAVgBoAHoAkgCkALYAyADaAOwA/gEQIokxGRREMRhENhoBVwIANhoCVwIANhoDF8AyiAERJIkxGRREMRhENhoBF8AyiAEwJIkxGRREMRhENhoBF8AyiAI6JIkxGRREMRhENhoBF8AyiANFJIkxGRREMRhENhoBF8AyiAPoJIkxGRREMRhENhoBF8AyiASVJIkxGRREMRhENhoBF8AyNhoCF8AwiAUhJIkxGRREMRhENhoBF8AyiAVUJIkxGRREMRhENhoBF8AyiAXEJIkxGRREMRhENhoBF8AyiAY0JIkxGRREMRhENhoBF8AyiAaUJIkxGRREMRhENhoBF8AyiAbxJIkxGRREMRhENhoBF8AyiAgWJIkxGRREMRhENhoBF8AyiAm0JIkxGRREMRhENhoBF8AyiAuLJIkxGUAABjEYFEQkiSKJigMAsYv9FRZXBgKL/VCL/hUWVwYCi/5Qi/+yGIAEx3ISvLIaTLIashojshAisgGziYoBALGL/7IYKrIagAcABXRlc3QxshojshAisgGztD5JVwQATFcABCgSRIANAAtlY2hvOiB0ZXN0MRJEsYv/shgqshqABwAFdGVzdDKyGiOyECKyAbO0PklXBABMVwAEKBJEgA0AC2VjaG86IHRlc3QyEkSxi/+yGCqyGoAHAAV0ZXN0M7IaI7IQIrIBs7Q+SVcEAExXAAQoEkSADQALZWNobzogdGVzdDMSRLGL/7IYKrIagAcABXRlc3Q0shojshAisgGztD5JVwQATFcABCgSRIANAAtlY2hvOiB0ZXN0NBJEsYv/shgqshqABwAFdGVzdDWyGiOyECKyAbO0PklXBABMVwAEKBJEgA0AC2VjaG86IHRlc3Q1EkSJigEAsYv/shgqshqAEAAOdHlwZWQgKyBpZ25vcmWyGiOyECKyAbO0PlcABCgSRLQ+SVcEAExXAAQoEkSAFgAUZWNobzogdHlwZWQgKyBpZ25vcmUSRLGL/7IYKrIagBIAEHVudHlwZWQgKyBpZ25vcmWyGiOyECKyAbO0PklXBABMVwAEKBJEgBgAFmVjaG86IHVudHlwZWQgKyBpZ25vcmUSRLGL/7IYKrIagAcABXR1cGxlshojshAisgGztD5JVwQATFcABCgSRLQ+TCcTEkRJVwQATFcABCgSRCcTEkSxi/+yGCqyGoAJAAd1bnR5cGVkshojshAisgGztD5JVwQATFcABCgSRIAPAA1lY2hvOiB1bnR5cGVkEkSJigEAsYv/shgnB7IagAwACmNvbnZlcnRlZDGyGiOyECKyAbO0PoAKY29udmVydGVkMRJEsYv/shiABDwQWNmyGicUshojshAisgGztD4lFhJEsYv/shiABGr0WTCyGicVshojshAisgGztD4nFRJEsYv/shiABLUA4RGyGoADAAE0shojshAisgGztD6AATQSRLGL/7IYgARu7X7DshqAAYCyGiOyECKyAbO0PoAEVHJ1ZRJEiYoBALGL/7IYgAS6C0OBshorshonFLIaJwmyGoAIAAAAAAAAAASyGoAIAAAAAAAAAAWyGoAIAAAAAAAAAAayGoAIAAAAAAAAAAeyGoAIAAAAAAAAAAiyGoAIAAAAAAAAAAmyGoAIAAAAAAAAAAqyGoAIAAAAAAAAAAuyGoAIAAAAAAAAAAyyGoAIAAAAAAAAAA2yGoAIAAAAAAAAAA6yGicWshojshAisgGztD5JVwQATFcABCgSRFcCACcWEkSJigEAsYv/shgnB7IagAgABldvcmxkMbIaI7IQIrIBs7Q+gAZXb3JsZDESRLGL/7IYJweyGoAIAAZXb3JsZDKyGiOyECKyAbO0PoAGV29ybGQyEkSxi/+yGCcHshqACAAGV29ybGQzshojshAisgGztD6ABldvcmxkMxJEsYv/shgnB7IagAgABldvcmxkNLIaI7IQIrIBs7Q+gAZXb3JsZDQSRImKAgCxMgqL/rIYi/+yMIv+sjKyHIAEzXJ7cbIagAEAshqAAQGyGoABAbIaI7IQIrIBs7Q+i/9xBEQyClCL/nIIRFASRImKAQCxi/+yGCcKshonC7IaI7IQIrIBs7Q+SVcEAExXAAQoEkRXAgBJgAdlY2hvOiBzEkSxi/+yGCcKshonC7IaI7IQIrIBs7Q+SVcEAExXAAQoEkRXAgBLARJEsYv/shgnCrIaJwuyGiOyECKyAbO0PklXBABMVwAEKBJEVwIAEkSJigEAsYv/shgnDLIaJw2yGiOyECKyAbO0PklXBABMVwAEKBJEVwIASYAHZWNobzogYhJEsYv/shgnDLIaJw2yGiOyECKyAbO0PklXBABMVwAEKBJEVwIASwESRLGL/7IYJwyyGicNshojshAisgGztD5JVwQATFcABCgSRFcCABJEiYoBALGL/7IYJw6yGiuyGiOyECKyAbO0PklXBABMVwAEKBJEF0klEkSxJBaL/7IYJw6yGrIaI7IQIrIBs7Q+SVcEAExXAAQoEkQXSwESRLGL/7IYJw6yGiuyGiOyECKyAbO0PklXBABMVwAEKBJEFxJEiYoBALGL/7IYJw+yGimyGiOyECKyAbO0PklXBABMVwAEKBJESScQqESxi/+yGCcPshopshojshAisgGztD5JVwQATFcABCgSREsBqESxi/+yGCcPshopshojshAisgGztD5JVwQATFcABCgSRKhEiYoBALGL/7IYJwSyGicFshonBrIaK7IaKbIaI7IQIrIBs7Q+SVcEAExXAAQoEkRJIllLASVZSwJPAksCUksCFUsDTwNPAlJLAlcECEsDVwxATwNXAgBJJwgSRE8DVwIASScXEkRPAxdJJRJESwMnEKhEsSQWi/+yGCcEshonBbIaJwayGrIaKbIaI7IQIrIBs7Q+SVcEAExXAAQoEkRLBRJEsYv/shgnBLIaJwWyGicGshorshopshojshAisgGztD5JVwQATFcABCgSRE8FEkSxi/+yGCcEshonBbIaJwayGiuyGimyGiOyECKyAbO0PklXBABMVwAEKBJESSJZSwElWUsCTwJLAlJXAgBLAhVLA08DTwJSVwIASwJXBAgXTwNXDEBPBk8EEkRPBE8DEkROAhJEqESJigEAsYv/shgnBLIaJwWyGicGshorshopshojshAisgGztD5JVwQATFcABCgSREkiWUsBJVlLAk8CSwJSVwIASwIVSwNPA08CUlcCAEsCVwQIF08DVwxASwMnCBJESwInFxJESwElEkRJJxCoRLEkFov/shgnBLIaJwWyGicGshqyGimyGiOyECKyAbO0PklXBABMVwAEKBJESSJZSwElWUsCTwJLAlJXAgBLAhVLA08DTwJSVwIASwJXBAgXTwNXDEBPA0sHEk8DSwYSEE8CSwQSEExLAqgQRLGL/7IYJwSyGicFshonBrIaK7IaKbIaI7IQIrIBs7Q+SVcEAExXAAQoEkRJIllLASVZSwJPAksCUlcCAEsCFUsDTwNPAlJXAgBLAlcECBdPA1cMQE8DSwcSTwNLBhIQTwJLBBIQTEsCqBBEsYv/shgnBLIaJwWyGicGshorshopshojshAisgGztD5JVwQATFcABCgSREkiWUsBJVlLAk8CSwJSVwIASwIVSwNPA08CUlcCAEsCVwQIF08DVwxATwNPBxJPA08GEhBPAk8EEhBMTwKoEESJigEAsYv/shgnEbIaJxiyGiOyECKyAbO0PklXBABMVwAEKBJESSJZSwElWUsCTwJLAlJJIllLASVZSwJPAksCUlcCAEsCFU8DTwNPAlJLAxVPBE8ETwJSSVcACBdLAVcICEsCgRBZSwMVTwROAlJXAgBPBCcIEkRPAycZEkRPAiUSREwnCahEJxoSRLGL/7IYJxGyGicYshojshAisgGztD5JVwQATFcABCgSREkiWUsBJVlLAk8CSwJSSSJZSwElWUsCTwJLAlJXAgBLAhVPA08DTwJSSwMVTwRPBE8CUklXAAgXSwFXCAhLAoEQWUsDFU8ETgJSVwIATwQnCBJETwMnGRJETwIlEkRMJwmoRCcaEkSxi/+yGCcRshqAKAAEABIABAAJAANzMWIAA3MyYgAAAAAAAAALAAAAAAAAABUAEgACM2KyGiOyECKyAbO0PklXBABMVwAEKBJESSJZSwElWUsCTwJLAlJJIllLASVZSwJPAksCUlcCAEsCFU8DTwNPAlJLAxVPBE8ETwJSSVcACBdLAVcICEsCgRBZSwMVTwROAlJXAgBPBIAJZWNobzogczFiEkRPA4ALAAllY2hvOiBzMmISRE8CgQwSREyACAAAAAAAAAAWqESACGVjaG86IDNiEkSJigEAsYv/shgnErIaI7IQIrIBs7Q+SVcEAExXAAQoEkQXgSoSRLGL/7IYJxKyGiOyECKyAbO0PklXBABMVwAEKBJEJxuoRLGL/7IYJxKyGiOyECKyAbO0PlcABCgSRLQ+SVcEAExXAAQoEkQnG6hEiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/typed_abi_call/out/Logger.arc56.json b/test_cases/typed_abi_call/out/Logger.arc56.json new file mode 100644 index 0000000000..fdb4edbf4a --- /dev/null +++ b/test_cases/typed_abi_call/out/Logger.arc56.json @@ -0,0 +1,578 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Logger", + "structs": {}, + "methods": [ + { + "name": "is_a_b", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo", + "args": [ + { + "type": "string", + "name": "value" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "no_args", + "args": [], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log_uint64", + "args": [ + { + "type": "uint64", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log_uint512", + "args": [ + { + "type": "uint512", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log_string", + "args": [ + { + "type": "string", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log_bool", + "args": [ + { + "type": "bool", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log_bytes", + "args": [ + { + "type": "byte[]", + "name": "value" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "log_asset_account_app", + "args": [ + { + "type": "asset", + "name": "asset" + }, + { + "type": "account", + "name": "account" + }, + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_native_string", + "args": [ + { + "type": "string", + "name": "value" + } + ], + "returns": { + "type": "string" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_native_bytes", + "args": [ + { + "type": "byte[]", + "name": "value" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_native_uint64", + "args": [ + { + "type": "uint64", + "name": "value" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_native_biguint", + "args": [ + { + "type": "uint512", + "name": "value" + } + ], + "returns": { + "type": "uint512" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_native_tuple", + "args": [ + { + "type": "string", + "name": "s" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "uint64", + "name": "u" + }, + { + "type": "uint512", + "name": "bu" + } + ], + "returns": { + "type": "(string,byte[],uint64,uint512)" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "echo_nested_tuple", + "args": [ + { + "type": "((string,string),(uint64,uint64,byte[]))", + "name": "tuple_of_tuples" + } + ], + "returns": { + "type": "((string,string),(uint64,uint64,byte[]))" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "return_args_after_14th", + "args": [ + { + "type": "uint64", + "name": "_a1" + }, + { + "type": "uint64", + "name": "_a2" + }, + { + "type": "uint64", + "name": "_a3" + }, + { + "type": "uint64", + "name": "_a4" + }, + { + "type": "uint64", + "name": "_a5" + }, + { + "type": "uint64", + "name": "_a6" + }, + { + "type": "uint64", + "name": "_a7" + }, + { + "type": "uint64", + "name": "_a8" + }, + { + "type": "uint64", + "name": "_a9" + }, + { + "type": "uint64", + "name": "_a10" + }, + { + "type": "uint64", + "name": "_a11" + }, + { + "type": "uint64", + "name": "_a12" + }, + { + "type": "uint64", + "name": "_a13" + }, + { + "type": "uint64", + "name": "_a14" + }, + { + "type": "uint8", + "name": "a15" + }, + { + "type": "uint8", + "name": "a16" + }, + { + "type": "uint8", + "name": "a17" + }, + { + "type": "uint8", + "name": "a18" + }, + { + "type": "(uint8,uint8,uint8,uint8)", + "name": "a19" + }, + { + "type": "uint8", + "name": "a20" + } + ], + "returns": { + "type": "byte[]" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 162, + 186, + 205, + 222, + 237, + 252, + 267, + 282, + 297, + 327, + 357, + 387, + 408, + 435, + 530, + 695 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 808 + ], + "errorMessage": "a is not a" + }, + { + "pc": [ + 917 + ], + "errorMessage": "application exists" + }, + { + "pc": [ + 909 + ], + "errorMessage": "asset exists" + }, + { + "pc": [ + 815 + ], + "errorMessage": "b is not b" + }, + { + "pc": [ + 794 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 165, + 189, + 208, + 225, + 240, + 255, + 270, + 285, + 300, + 330, + 360, + 390, + 411, + 438, + 533, + 698 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 422, + 489 + ], + "errorMessage": "overflow" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDAgNjQgMgogICAgYnl0ZWNibG9jayAweDE1MWY3Yzc1IDB4NjU2MzY4NmYzYTIwIDB4MDAwNCAweDAxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuX19wdXlhX2FyYzRfcm91dGVyX18oKSAtPiB1aW50NjQ6Cl9fcHV5YV9hcmM0X3JvdXRlcl9fOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjIwCiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHByb3RvIDAgMQogICAgdHhuIE51bUFwcEFyZ3MKICAgIGJ6IF9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AyMAogICAgcHVzaGJ5dGVzcyAweGM3NzIxMmJjIDB4OWJmODE5MTMgMHhiODYyZWUxOSAweDNjMTA1OGQ5IDB4NmFmNDU5MzAgMHhiNGI0MzM0ZSAweDZlZWQ3ZWMzIDB4YjUwMGUxMTEgMHhjZDcyN2I3MSAweDRhNDQ0Yzc3IDB4MjY1OWU4MTggMHhhOWZiNmNmMSAweGQ4Y2MzNjNiIDB4MTZlMDM5MTkgMHhhYjI3MWNlNCAweGJhMGI0MzgxIC8vIG1ldGhvZCAiaXNfYV9iKGJ5dGVbXSxieXRlW10pdm9pZCIsIG1ldGhvZCAiZWNobyhzdHJpbmcpc3RyaW5nIiwgbWV0aG9kICJub19hcmdzKCl1aW50NjQiLCBtZXRob2QgImxvZyh1aW50NjQpdm9pZCIsIG1ldGhvZCAibG9nKHVpbnQ1MTIpdm9pZCIsIG1ldGhvZCAibG9nKHN0cmluZyl2b2lkIiwgbWV0aG9kICJsb2coYm9vbCl2b2lkIiwgbWV0aG9kICJsb2coYnl0ZVtdKXZvaWQiLCBtZXRob2QgImxvZyhhc3NldCxhY2NvdW50LGFwcGxpY2F0aW9uKXZvaWQiLCBtZXRob2QgImVjaG9fbmF0aXZlX3N0cmluZyhzdHJpbmcpc3RyaW5nIiwgbWV0aG9kICJlY2hvX25hdGl2ZV9ieXRlcyhieXRlW10pYnl0ZVtdIiwgbWV0aG9kICJlY2hvX25hdGl2ZV91aW50NjQodWludDY0KXVpbnQ2NCIsIG1ldGhvZCAiZWNob19uYXRpdmVfYmlndWludCh1aW50NTEyKXVpbnQ1MTIiLCBtZXRob2QgImVjaG9fbmF0aXZlX3R1cGxlKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpKHN0cmluZyxieXRlW10sdWludDY0LHVpbnQ1MTIpIiwgbWV0aG9kICJlY2hvX25lc3RlZF90dXBsZSgoKHN0cmluZyxzdHJpbmcpLCh1aW50NjQsdWludDY0LGJ5dGVbXSkpKSgoc3RyaW5nLHN0cmluZyksKHVpbnQ2NCx1aW50NjQsYnl0ZVtdKSkiLCBtZXRob2QgInJldHVybl9hcmdzX2FmdGVyXzE0dGgodWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50NjQsdWludDY0LHVpbnQ2NCx1aW50OCx1aW50OCx1aW50OCx1aW50OCwodWludDgsdWludDgsdWludDgsdWludDgpLHVpbnQ4KWJ5dGVbXSIKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDAKICAgIG1hdGNoIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2lzX2FfYl9yb3V0ZUAyIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19ub19hcmdzX3JvdXRlQDQgX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDUgX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDYgX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDcgX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDggX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDkgX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDEwIF9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fbmF0aXZlX3N0cmluZ19yb3V0ZUAxMSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX25hdGl2ZV9ieXRlc19yb3V0ZUAxMiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX25hdGl2ZV91aW50NjRfcm91dGVAMTMgX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfYmlndWludF9yb3V0ZUAxNCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX25hdGl2ZV90dXBsZV9yb3V0ZUAxNSBfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX25lc3RlZF90dXBsZV9yb3V0ZUAxNiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZXR1cm5fYXJnc19hZnRlcl8xNHRoX3JvdXRlQDE3CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19pc19hX2Jfcm91dGVAMjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjAKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjEKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBpc19hX2IKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fcm91dGVAMzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjAKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZWNobwogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbm9fYXJnc19yb3V0ZUA0OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGNhbGxzdWIgbm9fYXJncwogICAgaXRvYgogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyMAogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIGNhbGxzdWIgbG9nX3VpbnQ2NAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fbG9nX3JvdXRlQDY6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyMAogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzgKICAgIC8vIEBhcmM0LmFiaW1ldGhvZChuYW1lPUxPR19NRVRIT0RfTkFNRSkKICAgIGNhbGxzdWIgbG9nX3VpbnQ1MTIKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA3OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjAKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjQyCiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICBjYWxsc3ViIGxvZ19zdHJpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUA4OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjAKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjQ2CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICBjYWxsc3ViIGxvZ19ib29sCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19sb2dfcm91dGVAOToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjIwCiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1MAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgY2FsbHN1YiBsb2dfYnl0ZXMKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2xvZ19yb3V0ZUAxMDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1NAogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjIwCiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGJ0b2kKICAgIHR4bmFzIEFzc2V0cwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgYnRvaQogICAgdHhuYXMgQWNjb3VudHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDMKICAgIGJ0b2kKICAgIHR4bmFzIEFwcGxpY2F0aW9ucwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjU0CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICBjYWxsc3ViIGxvZ19hc3NldF9hY2NvdW50X2FwcAogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfc3RyaW5nX3JvdXRlQDExOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyMAogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjU4CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZWNob19uYXRpdmVfc3RyaW5nCiAgICBkdXAKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfYnl0ZXNfcm91dGVAMTI6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjIwCiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBlY2hvX25hdGl2ZV9ieXRlcwogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2VjaG9fbmF0aXZlX3VpbnQ2NF9yb3V0ZUAxMzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjAKICAgIC8vIGNsYXNzIExvZ2dlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgYnRvaQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjY2CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZWNob19uYXRpdmVfdWludDY0CiAgICBpdG9iCiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19lY2hvX25hdGl2ZV9iaWd1aW50X3JvdXRlQDE0OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjcwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyMAogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBlY2hvX25hdGl2ZV9iaWd1aW50CiAgICBkdXAKICAgIGxlbgogICAgaW50Y18yIC8vIDY0CiAgICA8PQogICAgYXNzZXJ0IC8vIG92ZXJmbG93CiAgICBpbnRjXzIgLy8gNjQKICAgIGJ6ZXJvCiAgICBifAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uYXRpdmVfdHVwbGVfcm91dGVAMTU6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NzQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjIwCiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgNAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5Ojc0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZWNob19uYXRpdmVfdHVwbGUKICAgIGRpZyAzCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgZGlnIDMKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHVuY292ZXIgNAogICAgY29uY2F0CiAgICB1bmNvdmVyIDMKICAgIGl0b2IKICAgIGRpZyAzCiAgICBsZW4KICAgIGludGNfMiAvLyA2NAogICAgPD0KICAgIGFzc2VydCAvLyBvdmVyZmxvdwogICAgaW50Y18yIC8vIDY0CiAgICBiemVybwogICAgdW5jb3ZlciA0CiAgICBifAogICAgZGlnIDMKICAgIGxlbgogICAgcHVzaGludCA3NiAvLyA3NgogICAgKwogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIHB1c2hieXRlcyAweDAwNGMKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgdW5jb3ZlciAyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgYnl0ZWNfMCAvLyAweDE1MWY3Yzc1CiAgICBzd2FwCiAgICBjb25jYXQKICAgIGxvZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZWNob19uZXN0ZWRfdHVwbGVfcm91dGVAMTY6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6ODAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjIwCiAgICAvLyBjbGFzcyBMb2dnZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGR1cAogICAgaW50Y18xIC8vIDAKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMQogICAgaW50Y18zIC8vIDIKICAgIGV4dHJhY3RfdWludDE2CiAgICBkaWcgMgogICAgdW5jb3ZlciAyCiAgICBkaWcgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBpbnRjXzEgLy8gMAogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAxCiAgICBpbnRjXzMgLy8gMgogICAgZXh0cmFjdF91aW50MTYKICAgIGRpZyAyCiAgICB1bmNvdmVyIDIKICAgIGRpZyAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgZGlnIDIKICAgIGxlbgogICAgdW5jb3ZlciAzCiAgICB1bmNvdmVyIDMKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciA0CiAgICB1bmNvdmVyIDQKICAgIHVuY292ZXIgMgogICAgc3Vic3RyaW5nMwogICAgZHVwCiAgICBleHRyYWN0IDAgOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGJ0b2kKICAgIGRpZyAxCiAgICBleHRyYWN0IDggOCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIGRpZyAyCiAgICBwdXNoaW50IDE2IC8vIDE2CiAgICBleHRyYWN0X3VpbnQxNgogICAgZGlnIDMKICAgIGxlbgogICAgdW5jb3ZlciA0CiAgICBjb3ZlciAyCiAgICBzdWJzdHJpbmczCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjgwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgZWNob19uZXN0ZWRfdHVwbGUKICAgIGRpZyA0CiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICB1bmNvdmVyIDUKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIHB1c2hpbnQgNCAvLyA0CiAgICArCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgYnl0ZWNfMiAvLyAweDAwMDQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDQKICAgIGNvbmNhdAogICAgdW5jb3ZlciAzCiAgICBpdG9iCiAgICBkaWcgMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgdW5jb3ZlciAzCiAgICBjb25jYXQKICAgIHN3YXAKICAgIHVuY292ZXIgMwogICAgY29uY2F0CiAgICBwdXNoYnl0ZXMgMHgwMDEyCiAgICBjb25jYXQKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZGlnIDEKICAgIGxlbgogICAgcHVzaGludCA0IC8vIDQKICAgICsKICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBieXRlY18yIC8vIDB4MDAwNAogICAgc3dhcAogICAgY29uY2F0CiAgICB1bmNvdmVyIDIKICAgIGNvbmNhdAogICAgc3dhcAogICAgY29uY2F0CiAgICBieXRlY18wIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19yZXR1cm5fYXJnc19hZnRlcl8xNHRoX3JvdXRlQDE3OgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjkxCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyMAogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA0CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA1CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA2CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA3CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA4CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyA5CiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTEKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEyCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAxMwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMTQKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDAgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDEgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDIgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDMgMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDQgNCAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBleHRyYWN0IDggMSAvLyBvbiBlcnJvcjogSW5kZXggYWNjZXNzIGlzIG91dCBvZiBib3VuZHMKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIHJldHVybl9hcmdzX2FmdGVyXzE0dGgKICAgIGJ5dGVjXzAgLy8gMHgxNTFmN2M3NQogICAgc3dhcAogICAgY29uY2F0CiAgICBsb2cKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0AyMDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyMAogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyNAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAyNDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyMAogICAgLy8gY2xhc3MgTG9nZ2VyKEFSQzRDb250cmFjdCk6CiAgICBpbnRjXzEgLy8gMAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmlzX2FfYihhOiBieXRlcywgYjogYnl0ZXMpIC0+IHZvaWQ6CmlzX2FfYjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyMS0yMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgaXNfYV9iKHNlbGYsIGE6IEJ5dGVzLCBiOiBCeXRlcykgLT4gTm9uZToKICAgIHByb3RvIDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjIzCiAgICAvLyBhc3NlcnQgYSA9PSBiImEiLCAiYSBpcyBub3QgYSIKICAgIGZyYW1lX2RpZyAtMgogICAgcHVzaGJ5dGVzIDB4NjEKICAgID09CiAgICBhc3NlcnQgLy8gYSBpcyBub3QgYQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjI0CiAgICAvLyBhc3NlcnQgYiA9PSBiImIiLCAiYiBpcyBub3QgYiIKICAgIGZyYW1lX2RpZyAtMQogICAgcHVzaGJ5dGVzIDB4NjIKICAgID09CiAgICBhc3NlcnQgLy8gYiBpcyBub3QgYgogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmVjaG8odmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKZWNobzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToyNi0yNwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNobyhzZWxmLCB2YWx1ZTogYXJjNC5TdHJpbmcpIC0+IGFyYzQuU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MjgKICAgIC8vIHJldHVybiAiZWNobzogIiArIHZhbHVlCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBieXRlY18xIC8vIDB4NjU2MzY4NmYzYTIwCiAgICBzd2FwCiAgICBjb25jYXQKICAgIGR1cAogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgc3dhcAogICAgY29uY2F0CiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIubm9fYXJncygpIC0+IHVpbnQ2NDoKbm9fYXJnczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozMC0zMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgbm9fYXJncyhzZWxmKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozMgogICAgLy8gcmV0dXJuIFVJbnQ2NCg0MikKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dfdWludDY0KHZhbHVlOiBieXRlcykgLT4gdm9pZDoKbG9nX3VpbnQ2NDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozNC0zNQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ191aW50NjQoc2VsZiwgdmFsdWU6IGFyYzQuVUludDY0KSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MzYKICAgIC8vIGxvZyh2YWx1ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgbG9nCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIubG9nX3VpbnQ1MTIodmFsdWU6IGJ5dGVzKSAtPiB2b2lkOgpsb2dfdWludDUxMjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTozOC0zOQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ191aW50NTEyKHNlbGYsIHZhbHVlOiBhcmM0LlVJbnQ1MTIpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0MAogICAgLy8gbG9nKHZhbHVlKQogICAgZnJhbWVfZGlnIC0xCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dfc3RyaW5nKHZhbHVlOiBieXRlcykgLT4gdm9pZDoKbG9nX3N0cmluZzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo0Mi00MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ19zdHJpbmcoc2VsZiwgdmFsdWU6IGFyYzQuU3RyaW5nKSAtPiBOb25lOgogICAgcHJvdG8gMSAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NDQKICAgIC8vIGxvZyh2YWx1ZS5uYXRpdmUpICAjIGRlY29kZSB0byByZW1vdmUgaGVhZGVyCiAgICBmcmFtZV9kaWcgLTEKICAgIGV4dHJhY3QgMiAwCiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5sb2dfYm9vbCh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19ib29sOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjQ2LTQ3CiAgICAvLyBAYXJjNC5hYmltZXRob2QobmFtZT1MT0dfTUVUSE9EX05BTUUpCiAgICAvLyBkZWYgbG9nX2Jvb2woc2VsZiwgdmFsdWU6IGFyYzQuQm9vbCkgLT4gTm9uZToKICAgIHByb3RvIDEgMAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjQ4CiAgICAvLyBsb2coQnl0ZXMoYiJUcnVlIikgaWYgdmFsdWUubmF0aXZlIGVsc2UgQnl0ZXMoYiJGYWxzZSIpKQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzEgLy8gMAogICAgZ2V0Yml0CiAgICBwdXNoYnl0ZXNzIDB4NDY2MTZjNzM2NSAweDU0NzI3NTY1IC8vIDB4NDY2MTZjNzM2NSwgMHg1NDcyNzU2NQogICAgdW5jb3ZlciAyCiAgICBzZWxlY3QKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmxvZ19ieXRlcyh2YWx1ZTogYnl0ZXMpIC0+IHZvaWQ6CmxvZ19ieXRlczoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1MC01MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ19ieXRlcyhzZWxmLCB2YWx1ZTogYXJjNC5EeW5hbWljQnl0ZXMpIC0+IE5vbmU6CiAgICBwcm90byAxIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1MgogICAgLy8gbG9nKHZhbHVlLm5hdGl2ZSkKICAgIGZyYW1lX2RpZyAtMQogICAgZXh0cmFjdCAyIDAKICAgIGxvZwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmxvZ19hc3NldF9hY2NvdW50X2FwcChhc3NldDogdWludDY0LCBhY2NvdW50OiBieXRlcywgYXBwOiB1aW50NjQpIC0+IHZvaWQ6CmxvZ19hc3NldF9hY2NvdW50X2FwcDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1NC01NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kKG5hbWU9TE9HX01FVEhPRF9OQU1FKQogICAgLy8gZGVmIGxvZ19hc3NldF9hY2NvdW50X2FwcChzZWxmLCBhc3NldDogQXNzZXQsIGFjY291bnQ6IEFjY291bnQsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo1NgogICAgLy8gbG9nKGFzc2V0Lm5hbWUsIGFjY291bnQuYnl0ZXMsIGFwcC5hZGRyZXNzKQogICAgZnJhbWVfZGlnIC0zCiAgICBhc3NldF9wYXJhbXNfZ2V0IEFzc2V0TmFtZQogICAgYXNzZXJ0IC8vIGFzc2V0IGV4aXN0cwogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgYXBwX3BhcmFtc19nZXQgQXBwQWRkcmVzcwogICAgYXNzZXJ0IC8vIGFwcGxpY2F0aW9uIGV4aXN0cwogICAgY29uY2F0CiAgICBsb2cKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25hdGl2ZV9zdHJpbmcodmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKZWNob19uYXRpdmVfc3RyaW5nOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjU4LTU5CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBlY2hvX25hdGl2ZV9zdHJpbmcoc2VsZiwgdmFsdWU6IFN0cmluZykgLT4gU3RyaW5nOgogICAgcHJvdG8gMSAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjAKICAgIC8vIHJldHVybiAiZWNobzogIiArIHZhbHVlCiAgICBieXRlY18xIC8vICJlY2hvOiAiCiAgICBmcmFtZV9kaWcgLTEKICAgIGNvbmNhdAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmVjaG9fbmF0aXZlX2J5dGVzKHZhbHVlOiBieXRlcykgLT4gYnl0ZXM6CmVjaG9fbmF0aXZlX2J5dGVzOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjYyLTYzCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBlY2hvX25hdGl2ZV9ieXRlcyhzZWxmLCB2YWx1ZTogQnl0ZXMpIC0+IEJ5dGVzOgogICAgcHJvdG8gMSAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjQKICAgIC8vIHJldHVybiBiImVjaG86ICIgKyB2YWx1ZQogICAgYnl0ZWNfMSAvLyAweDY1NjM2ODZmM2EyMAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25hdGl2ZV91aW50NjQodmFsdWU6IHVpbnQ2NCkgLT4gdWludDY0OgplY2hvX25hdGl2ZV91aW50NjQ6CiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6NjYtNjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIGVjaG9fbmF0aXZlX3VpbnQ2NChzZWxmLCB2YWx1ZTogVUludDY0KSAtPiBVSW50NjQ6CiAgICBwcm90byAxIDEKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo2OAogICAgLy8gcmV0dXJuIHZhbHVlICsgMQogICAgZnJhbWVfZGlnIC0xCiAgICBpbnRjXzAgLy8gMQogICAgKwogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLmVjaG9fbmF0aXZlX2JpZ3VpbnQodmFsdWU6IGJ5dGVzKSAtPiBieXRlczoKZWNob19uYXRpdmVfYmlndWludDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3MC03MQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNob19uYXRpdmVfYmlndWludChzZWxmLCB2YWx1ZTogQmlnVUludCkgLT4gQmlnVUludDoKICAgIHByb3RvIDEgMQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjcyCiAgICAvLyByZXR1cm4gdmFsdWUgKyAxCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzMgLy8gMHgwMQogICAgYisKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25hdGl2ZV90dXBsZShzOiBieXRlcywgYjogYnl0ZXMsIHU6IHVpbnQ2NCwgYnU6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXMsIHVpbnQ2NCwgYnl0ZXM6CmVjaG9fbmF0aXZlX3R1cGxlOgogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5Ojc0LTc3CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBlY2hvX25hdGl2ZV90dXBsZSgKICAgIC8vICAgICBzZWxmLCBzOiBTdHJpbmcsIGI6IEJ5dGVzLCB1OiBVSW50NjQsIGJ1OiBCaWdVSW50CiAgICAvLyApIC0+IHR1cGxlW1N0cmluZywgQnl0ZXMsIFVJbnQ2NCwgQmlnVUludF06CiAgICBwcm90byA0IDQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo3OAogICAgLy8gcmV0dXJuICJlY2hvOiAiICsgcywgYiJlY2hvOiAiICsgYiwgdSArIDEsIGJ1ICsgMQogICAgYnl0ZWNfMSAvLyAiZWNobzogIgogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIGJ5dGVjXzEgLy8gMHg2NTYzNjg2ZjNhMjAKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBmcmFtZV9kaWcgLTEKICAgIGJ5dGVjXzMgLy8gMHgwMQogICAgYisKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGwubG9nZ2VyLkxvZ2dlci5lY2hvX25lc3RlZF90dXBsZSh0dXBsZV9vZl90dXBsZXMuMC4wOiBieXRlcywgdHVwbGVfb2ZfdHVwbGVzLjAuMTogYnl0ZXMsIHR1cGxlX29mX3R1cGxlcy4xLjA6IHVpbnQ2NCwgdHVwbGVfb2ZfdHVwbGVzLjEuMTogYnl0ZXMsIHR1cGxlX29mX3R1cGxlcy4xLjI6IGJ5dGVzKSAtPiBieXRlcywgYnl0ZXMsIHVpbnQ2NCwgYnl0ZXMsIGJ5dGVzOgplY2hvX25lc3RlZF90dXBsZToKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4MC04MwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgZWNob19uZXN0ZWRfdHVwbGUoCiAgICAvLyAgICAgc2VsZiwgdHVwbGVfb2ZfdHVwbGVzOiB0dXBsZVt0dXBsZVtTdHJpbmcsIGFyYzQuU3RyaW5nXSwgdHVwbGVbVUludDY0LCBhcmM0LlVJbnQ2NCwgQnl0ZXNdXQogICAgLy8gKSAtPiB0dXBsZVt0dXBsZVtTdHJpbmcsIGFyYzQuU3RyaW5nXSwgdHVwbGVbVUludDY0LCBhcmM0LlVJbnQ2NCwgQnl0ZXNdXToKICAgIHByb3RvIDUgNQogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5Ojg1CiAgICAvLyByZXR1cm4gKCJlY2hvOiAiICsgc3RyaW5nLCAiZWNobzogIiArIGFyYzRfc3RyaW5nKSwgKAogICAgYnl0ZWNfMSAvLyAiZWNobzogIgogICAgZnJhbWVfZGlnIC01CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtNAogICAgZXh0cmFjdCAyIDAKICAgIGJ5dGVjXzEgLy8gMHg2NTYzNjg2ZjNhMjAKICAgIHN3YXAKICAgIGNvbmNhdAogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4NgogICAgLy8gdTY0ICsgMSwKICAgIGZyYW1lX2RpZyAtMwogICAgaW50Y18wIC8vIDEKICAgICsKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4NwogICAgLy8gYXJjNC5VSW50NjQoYXJjNF91NjQubmF0aXZlICsgMSksCiAgICBmcmFtZV9kaWcgLTIKICAgIGJ0b2kKICAgIGludGNfMCAvLyAxCiAgICArCiAgICBpdG9iCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6ODgKICAgIC8vIGIiZWNobzogIiArIGJ5dGV6LAogICAgYnl0ZWNfMSAvLyAweDY1NjM2ODZmM2EyMAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo4NS04OQogICAgLy8gcmV0dXJuICgiZWNobzogIiArIHN0cmluZywgImVjaG86ICIgKyBhcmM0X3N0cmluZyksICgKICAgIC8vICAgICB1NjQgKyAxLAogICAgLy8gICAgIGFyYzQuVUludDY0KGFyYzRfdTY0Lm5hdGl2ZSArIDEpLAogICAgLy8gICAgIGIiZWNobzogIiArIGJ5dGV6LAogICAgLy8gKQogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbC5sb2dnZXIuTG9nZ2VyLnJldHVybl9hcmdzX2FmdGVyXzE0dGgoX2ExOiBieXRlcywgX2EyOiBieXRlcywgX2EzOiBieXRlcywgX2E0OiBieXRlcywgX2E1OiBieXRlcywgX2E2OiBieXRlcywgX2E3OiBieXRlcywgX2E4OiBieXRlcywgX2E5OiBieXRlcywgX2ExMDogYnl0ZXMsIF9hMTE6IGJ5dGVzLCBfYTEyOiBieXRlcywgX2ExMzogYnl0ZXMsIF9hMTQ6IGJ5dGVzLCBhMTU6IGJ5dGVzLCBhMTY6IGJ5dGVzLCBhMTc6IGJ5dGVzLCBhMTg6IGJ5dGVzLCBhMTk6IGJ5dGVzLCBhMjA6IGJ5dGVzKSAtPiBieXRlczoKcmV0dXJuX2FyZ3NfYWZ0ZXJfMTR0aDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weTo5MS0xMTQKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHJldHVybl9hcmdzX2FmdGVyXzE0dGgoCiAgICAvLyAgICAgc2VsZiwKICAgIC8vICAgICBfYTE6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hMjogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2EzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTQ6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hNTogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2E2OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTc6IGFyYzQuVUludDY0LAogICAgLy8gICAgIF9hODogYXJjNC5VSW50NjQsCiAgICAvLyAgICAgX2E5OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTEwOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTExOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTEyOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTEzOiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBfYTE0OiBhcmM0LlVJbnQ2NCwKICAgIC8vICAgICBhMTU6IGFyYzQuVUludDgsCiAgICAvLyAgICAgYTE2OiBhcmM0LlVJbnQ4LAogICAgLy8gICAgIGExNzogYXJjNC5VSW50OCwKICAgIC8vICAgICBhMTg6IGFyYzQuVUludDgsCiAgICAvLyAgICAgYTE5OiBhcmM0LlR1cGxlW2FyYzQuVUludDgsIGFyYzQuVUludDgsIGFyYzQuVUludDgsIGFyYzQuVUludDhdLAogICAgLy8gICAgIGEyMDogYXJjNC5VSW50OCwKICAgIC8vICkgLT4gYXJjNC5EeW5hbWljQnl0ZXM6CiAgICBwcm90byAyMCAxCiAgICAvLyB0eXBlZF9hYmlfY2FsbC9sb2dnZXIucHk6MTE1CiAgICAvLyBsYXN0X2FyZyA9IGFyYzQuVHVwbGUoKGExNSwgYTE2LCBhMTcsIGExOCwgYTE5LCBhMjApKQogICAgZnJhbWVfZGlnIC02CiAgICBmcmFtZV9kaWcgLTUKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC00CiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMwogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTIKICAgIGNvbmNhdAogICAgZnJhbWVfZGlnIC0xCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsL2xvZ2dlci5weToxMTYKICAgIC8vIGFzc2VydCBUeG4uYXBwbGljYXRpb25fYXJncygxNSkgPT0gbGFzdF9hcmcuYnl0ZXMKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDE1CiAgICBkaWcgMQogICAgPT0KICAgIGFzc2VydAogICAgLy8gdHlwZWRfYWJpX2NhbGwvbG9nZ2VyLnB5OjExNwogICAgLy8gcmV0dXJuIGFyYzQuRHluYW1pY0J5dGVzKGxhc3RfYXJnLmJ5dGVzKQogICAgZHVwCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBzd2FwCiAgICBjb25jYXQKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsLmxvZ2dlci5Mb2dnZXIuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiAEAQBAAiYEBBUffHUGZWNobzogAgAEAQGIAAFDigABMRtBAuyCEATHchK8BJv4GRMEuGLuGQQ8EFjZBGr0WTAEtLQzTgRu7X7DBLUA4REEzXJ7cQRKREx3BCZZ6BgEqfts8QTYzDY7BBbgORkEqycc5AS6C0OBNhoAjhAAAgAaAC0APgBNAFwAawB6AIkApwDFAOMA+AETAXICFyOJMRkURDEYRDYaAVcCADYaAlcCAIgCaiKJMRkURDEYRDYaAYgCbShMULAiiTEZFEQxGESIAnEWKExQsCKJMRkURDEYRDYaAYgCYyKJMRkURDEYRDYaAYgCWyKJMRkURDEYRDYaAYgCUyKJMRkURDEYRDYaAYgCTiKJMRkURDEYRDYaAYgCWCKJMRkURDEYRDYaARfAMDYaAhfAHDYaAxfAMogCRCKJMRkURDEYRDYaAVcCAIgCRUkVFlcGAkxQKExQsCKJMRkURDEYRDYaAVcCAIgCL0kVFlcGAkxQKExQsCKJMRkURDEYRDYaAReIAhsWKExQsCKJMRkURDEYRDYaAYgCD0kVJA5EJK+rKExQsCKJMRkURDEYRDYaAVcCADYaAlcCADYaAxc2GgSIAexLAxUWVwYCTwRQSwMVFlcGAk8EUE8DFksDFSQORCSvTwSrSwMVgUwIFlcGAoACAExMUE8CUExQTwJQTFAoTFCwIokxGRREMRhENhoBSSNZSwElWUsCTwJLAlJJI1lLASVZSwJPAksCUlcCAEsCFU8DTwNPAlJLAxVPBE8ETwJSSVcACBdLAVcICEsCgRBZSwMVTwROAlJXAgCIAWRLBBUWVwYCTwVQSRWBBAgWVwYCKkxQTFBPBFBPAxZLAhUWVwYCTwNQTE8DUIACABJQTFBLARWBBAgWVwYCKkxQTwJQTFAoTFCwIokxGRREMRhENhoBNhoCNhoDNhoENhoFNhoGNhoHNhoINhoJNhoKNhoLNhoMNhoNNhoONhoPVwABNhoPVwEBNhoPVwIBNhoPVwMBNhoPVwQENhoPVwgBiADnKExQsCKJMRlAAAYxGBREIokjiYoCAIv+gAFhEkSL/4ABYhJEiYoBAYv/VwIAKUxQSRUWVwYCTFCJigABgSqJigEAi/+wiYoBAIv/sImKAQCL/1cCALCJigEAi/8jU4ICBUZhbHNlBFRydWVPAk2wiYoBAIv/VwIAsImKAwCL/XEERIv+UIv/cghEULCJigEBKYv/UImKAQEpi/9QiYoBAYv/IgiJigEBi/8roImKBAQpi/xQKYv9UIv+IgiL/yugiYoFBSmL+1CL/FcCAClMUEkVFlcGAkxQi/0iCIv+FyIIFimL/1CJihQBi/qL+1CL/FCL/VCL/lCL/1A2Gg9LARJESRUWVwYCTFCJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/typed_abi_call/puya.log b/test_cases/typed_abi_call/puya.log index b77becc033..1e8471936e 100644 --- a/test_cases/typed_abi_call/puya.log +++ b/test_cases/typed_abi_call/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['typed_abi_call'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['typed_abi_call'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing typed_abi_call/out/module.awst debug: Sealing block@0: // L12 @@ -14865,6 +14865,7 @@ debug: Inserted test_no_args_block@0.ops[106]: 'l-store-copy tmp%13#0 1' debug: Replaced test_no_args_block@0.ops[119]: 'v-load tmp%13#0' with 'l-load tmp%13#0' debug: Found 3 edge set/s for test_cases.typed_abi_call.typed_c2c.Greeter.__puya_arc4_router__ info: Writing typed_abi_call/out/Logger.arc32.json +info: Writing typed_abi_call/out/Logger.arc56.json info: Writing typed_abi_call/out/Logger.approval.teal info: Writing typed_abi_call/out/Logger.clear.teal info: Writing typed_abi_call/out/Logger.approval.bin @@ -14872,6 +14873,7 @@ info: Writing typed_abi_call/out/Logger.clear.bin info: Writing typed_abi_call/out/Logger.approval.puya.map info: Writing typed_abi_call/out/Logger.clear.puya.map info: Writing typed_abi_call/out/Greeter.arc32.json +info: Writing typed_abi_call/out/Greeter.arc56.json info: Writing typed_abi_call/out/Greeter.approval.teal info: Writing typed_abi_call/out/Greeter.clear.teal info: Writing typed_abi_call/out/Greeter.approval.bin diff --git a/test_cases/typed_abi_call_txn/out/Caller.arc56.json b/test_cases/typed_abi_call_txn/out/Caller.arc56.json new file mode 100644 index 0000000000..9acba50b51 --- /dev/null +++ b/test_cases/typed_abi_call_txn/out/Caller.arc56.json @@ -0,0 +1,196 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Caller", + "structs": {}, + "methods": [ + { + "name": "test_call_with_txn", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_call_with_acfg", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "test_call_with_acfg_no_return", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "byte[]", + "name": "b" + }, + { + "type": "application", + "name": "app" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 247, + 323 + ], + "errorMessage": "ARC4 prefix is valid" + }, + { + "pc": [ + 70, + 100, + 130 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 249 + ], + "errorMessage": "expected asset id" + }, + { + "pc": [ + 400 + ], + "errorMessage": "expected asset to be created" + }, + { + "pc": [ + 165 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 73, + 103, + 133 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMCAxIDMgNgogICAgYnl0ZWNibG9jayAiVEVTVCIgIlRTVCIgMHgxNTFmN2M3NSAweDMxCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTMKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgcHJvdG8gMCAxCiAgICB0eG4gTnVtQXBwQXJncwogICAgYnogX19wdXlhX2FyYzRfcm91dGVyX19fYmFyZV9yb3V0aW5nQDcKICAgIHB1c2hieXRlc3MgMHgyODRjMWU2MSAweGFhMzNjMWJhIDB4YmIwMDk4YTIgLy8gbWV0aG9kICJ0ZXN0X2NhbGxfd2l0aF90eG4oYnl0ZVtdLGJ5dGVbXSxhcHBsaWNhdGlvbil2b2lkIiwgbWV0aG9kICJ0ZXN0X2NhbGxfd2l0aF9hY2ZnKGJ5dGVbXSxieXRlW10sYXBwbGljYXRpb24pdm9pZCIsIG1ldGhvZCAidGVzdF9jYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4oYnl0ZVtdLGJ5dGVbXSxhcHBsaWNhdGlvbil2b2lkIgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMAogICAgbWF0Y2ggX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jYWxsX3dpdGhfdHhuX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fdGVzdF9jYWxsX3dpdGhfYWNmZ19yb3V0ZUAzIF9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuX3JvdXRlQDQKICAgIGludGNfMCAvLyAwCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX3Rlc3RfY2FsbF93aXRoX3R4bl9yb3V0ZUAyOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjEzCiAgICAvLyBjbGFzcyBDYWxsZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE0CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdF9jYWxsX3dpdGhfdHhuCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NhbGxfd2l0aF9hY2ZnX3JvdXRlQDM6CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTMKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDIKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAzCiAgICBidG9pCiAgICB0eG5hcyBBcHBsaWNhdGlvbnMKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiB0ZXN0X2NhbGxfd2l0aF9hY2ZnCiAgICBpbnRjXzEgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX190ZXN0X2NhbGxfd2l0aF9hY2ZnX25vX3JldHVybl9yb3V0ZUA0OgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo0NQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjEzCiAgICAvLyBjbGFzcyBDYWxsZXIoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMwogICAgYnRvaQogICAgdHhuYXMgQXBwbGljYXRpb25zCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjQ1CiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIGNhbGxzdWIgdGVzdF9jYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4KICAgIGludGNfMSAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxMwogICAgLy8gY2xhc3MgQ2FsbGVyKEFSQzRDb250cmFjdCk6CiAgICB0eG4gT25Db21wbGV0aW9uCiAgICBibnogX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMQogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgICEKICAgIGFzc2VydCAvLyBpcyBjcmVhdGluZwogICAgaW50Y18xIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fYWZ0ZXJfaWZfZWxzZUAxMToKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTMKICAgIC8vIGNsYXNzIENhbGxlcihBUkM0Q29udHJhY3QpOgogICAgaW50Y18wIC8vIDAKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGxfdHhuLmNhbGxlci5DYWxsZXIudGVzdF9jYWxsX3dpdGhfdHhuKGE6IGJ5dGVzLCBiOiBieXRlcywgYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfY2FsbF93aXRoX3R4bjoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTQtMTUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgLy8gZGVmIHRlc3RfY2FsbF93aXRoX3R4bihzZWxmLCBhOiBCeXRlcywgYjogQnl0ZXMsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MjEtMjcKICAgIC8vIGFzc2V0X2lkLCBfdHhuID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBUeG5Db250cmFjdC5jYWxsX3dpdGhfdHhuLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgdHhuLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fYmVnaW4KICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MTkKICAgIC8vIHRvdGFsPTEsCiAgICBpbnRjXzEgLy8gMQogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFRvdGFsCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE4CiAgICAvLyBhc3NldF9uYW1lPSJURVNUIiwKICAgIGJ5dGVjXzAgLy8gIlRFU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0TmFtZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToxNwogICAgLy8gdW5pdF9uYW1lPSJUU1QiLAogICAgYnl0ZWNfMSAvLyAiVFNUIgogICAgaXR4bl9maWVsZCBDb25maWdBc3NldFVuaXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjE2CiAgICAvLyB0eG4gPSBpdHhuLkFzc2V0Q29uZmlnKAogICAgaW50Y18yIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToyMS0yNwogICAgLy8gYXNzZXRfaWQsIF90eG4gPSBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF90eG4sCiAgICAvLyAgICAgYSwKICAgIC8vICAgICB0eG4sCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9uZXh0CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjIzCiAgICAvLyBhLAogICAgZnJhbWVfZGlnIC0zCiAgICBsZW4KICAgIGl0b2IKICAgIGV4dHJhY3QgNiAyCiAgICBmcmFtZV9kaWcgLTMKICAgIGNvbmNhdAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToyNQogICAgLy8gYiwKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMQogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbklECiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjIxLTI3CiAgICAvLyBhc3NldF9pZCwgX3R4biA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX3R4biwKICAgIC8vICAgICBhLAogICAgLy8gICAgIHR4biwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHhhMWY1MDQwZCAvLyBtZXRob2QgImNhbGxfd2l0aF90eG4oYnl0ZVtdLHR4bixieXRlW10pdWludDY0IgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGdpdHhuIDEgTGFzdExvZwogICAgZHVwCiAgICBleHRyYWN0IDQgMAogICAgc3dhcAogICAgZXh0cmFjdCAwIDQKICAgIGJ5dGVjXzIgLy8gMHgxNTFmN2M3NQogICAgPT0KICAgIGFzc2VydCAvLyBBUkM0IHByZWZpeCBpcyB2YWxpZAogICAgYnRvaQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weToyOAogICAgLy8gYXNzZXJ0IGFzc2V0X2lkLCAiZXhwZWN0ZWQgYXNzZXQgaWQiCiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgaWQKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudHlwZWRfYWJpX2NhbGxfdHhuLmNhbGxlci5DYWxsZXIudGVzdF9jYWxsX3dpdGhfYWNmZyhhOiBieXRlcywgYjogYnl0ZXMsIGFwcDogdWludDY0KSAtPiB2b2lkOgp0ZXN0X2NhbGxfd2l0aF9hY2ZnOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozMC0zMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9jYWxsX3dpdGhfYWNmZyhzZWxmLCBhOiBCeXRlcywgYjogQnl0ZXMsIGFwcDogQXBwbGljYXRpb24pIC0+IE5vbmU6CiAgICBwcm90byAzIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzctNDMKICAgIC8vIGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmcsCiAgICAvLyAgICAgYSwKICAgIC8vICAgICB0eG4sCiAgICAvLyAgICAgYiwKICAgIC8vICAgICBhcHBfaWQ9YXBwLAogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozNQogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzQKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMCAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjMzCiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBieXRlY18xIC8vICJUU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6MzIKICAgIC8vIHR4biA9IGl0eG4uQXNzZXRDb25maWcoCiAgICBpbnRjXzIgLy8gYWNmZwogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjM3LTQzCiAgICAvLyBhcmM0LmFiaV9jYWxsKAogICAgLy8gICAgIFR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnLAogICAgLy8gICAgIGEsCiAgICAvLyAgICAgdHhuLAogICAgLy8gICAgIGIsCiAgICAvLyAgICAgYXBwX2lkPWFwcCwKICAgIC8vICkKICAgIGl0eG5fbmV4dAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozOQogICAgLy8gYSwKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NDEKICAgIC8vIGIsCiAgICBmcmFtZV9kaWcgLTIKICAgIGxlbgogICAgaXRvYgogICAgZXh0cmFjdCA2IDIKICAgIGZyYW1lX2RpZyAtMgogICAgY29uY2F0CiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTozNy00MwogICAgLy8gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBUeG5Db250cmFjdC5jYWxsX3dpdGhfYWNmZywKICAgIC8vICAgICBhLAogICAgLy8gICAgIHR4biwKICAgIC8vICAgICBiLAogICAgLy8gICAgIGFwcF9pZD1hcHAsCiAgICAvLyApCiAgICBwdXNoYnl0ZXMgMHg2ZDQ3MDBhZCAvLyBtZXRob2QgImNhbGxfd2l0aF9hY2ZnKGJ5dGVbXSxhY2ZnLGJ5dGVbXSl1aW50NjQiCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgc3dhcAogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpbnRjXzMgLy8gYXBwbAogICAgaXR4bl9maWVsZCBUeXBlRW51bQogICAgaW50Y18wIC8vIDAKICAgIGl0eG5fZmllbGQgRmVlCiAgICBpdHhuX3N1Ym1pdAogICAgZ2l0eG4gMSBMYXN0TG9nCiAgICBleHRyYWN0IDAgNAogICAgYnl0ZWNfMiAvLyAweDE1MWY3Yzc1CiAgICA9PQogICAgYXNzZXJ0IC8vIEFSQzQgcHJlZml4IGlzIHZhbGlkCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLnRlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKGE6IGJ5dGVzLCBiOiBieXRlcywgYXBwOiB1aW50NjQpIC0+IHZvaWQ6CnRlc3RfY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo0NS00NgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgdGVzdF9jYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4oc2VsZiwgYTogQnl0ZXMsIGI6IEJ5dGVzLCBhcHA6IEFwcGxpY2F0aW9uKSAtPiBOb25lOgogICAgcHJvdG8gMyAwCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjUyLTU0CiAgICAvLyB0eG4xID0gYXJjNC5hYmlfY2FsbCgKICAgIC8vICAgICBUeG5Db250cmFjdC5jYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4sIGEsIGFjZmcsIGIsIGFwcF9pZD1hcHAsIG5vdGU9YiIxIgogICAgLy8gKQogICAgaXR4bl9iZWdpbgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1MAogICAgLy8gdG90YWw9MSwKICAgIGludGNfMSAvLyAxCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VG90YWwKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NDkKICAgIC8vIGFzc2V0X25hbWU9IlRFU1QiLAogICAgYnl0ZWNfMCAvLyAiVEVTVCIKICAgIGl0eG5fZmllbGQgQ29uZmlnQXNzZXROYW1lCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vY2FsbGVyLnB5OjQ4CiAgICAvLyB1bml0X25hbWU9IlRTVCIsCiAgICBieXRlY18xIC8vICJUU1QiCiAgICBpdHhuX2ZpZWxkIENvbmZpZ0Fzc2V0VW5pdE5hbWUKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NDcKICAgIC8vIGFjZmcgPSBpdHhuLkFzc2V0Q29uZmlnKAogICAgaW50Y18yIC8vIGFjZmcKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1Mi01NAogICAgLy8gdHhuMSA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuLCBhLCBhY2ZnLCBiLCBhcHBfaWQ9YXBwLCBub3RlPWIiMSIKICAgIC8vICkKICAgIGl0eG5fbmV4dAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1MwogICAgLy8gVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuLCBhLCBhY2ZnLCBiLCBhcHBfaWQ9YXBwLCBub3RlPWIiMSIKICAgIGZyYW1lX2RpZyAtMwogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0zCiAgICBjb25jYXQKICAgIGZyYW1lX2RpZyAtMgogICAgbGVuCiAgICBpdG9iCiAgICBleHRyYWN0IDYgMgogICAgZnJhbWVfZGlnIC0yCiAgICBjb25jYXQKICAgIGJ5dGVjXzMgLy8gMHgzMQogICAgaXR4bl9maWVsZCBOb3RlCiAgICBmcmFtZV9kaWcgLTEKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25JRAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1Mi01NAogICAgLy8gdHhuMSA9IGFyYzQuYWJpX2NhbGwoCiAgICAvLyAgICAgVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuLCBhLCBhY2ZnLCBiLCBhcHBfaWQ9YXBwLCBub3RlPWIiMSIKICAgIC8vICkKICAgIHB1c2hieXRlcyAweGM4NDAwNzdkIC8vIG1ldGhvZCAiY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKGJ5dGVbXSxhY2ZnLGJ5dGVbXSl2b2lkIgogICAgaXR4bl9maWVsZCBBcHBsaWNhdGlvbkFyZ3MKICAgIHN3YXAKICAgIGl0eG5fZmllbGQgQXBwbGljYXRpb25BcmdzCiAgICBpdHhuX2ZpZWxkIEFwcGxpY2F0aW9uQXJncwogICAgaW50Y18zIC8vIGFwcGwKICAgIGl0eG5fZmllbGQgVHlwZUVudW0KICAgIGludGNfMCAvLyAwCiAgICBpdHhuX2ZpZWxkIEZlZQogICAgaXR4bl9zdWJtaXQKICAgIGl0eG4gTm90ZQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1NQogICAgLy8gYXNzZXJ0IHR4bjEubm90ZSA9PSBiIjEiCiAgICBieXRlY18zIC8vIDB4MzEKICAgID09CiAgICBhc3NlcnQKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi9jYWxsZXIucHk6NTgKICAgIC8vIGFzc2V0X2lkID0gb3AuR0lUeG4uY3JlYXRlZF9hc3NldF9pZCgwKQogICAgZ2l0eG4gMCBDcmVhdGVkQXNzZXRJRAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL2NhbGxlci5weTo1OQogICAgLy8gYXNzZXJ0IGFzc2V0X2lkLCAiZXhwZWN0ZWQgYXNzZXQgdG8gYmUgY3JlYXRlZCIKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCB0byBiZSBjcmVhdGVkCiAgICByZXRzdWIK", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi5jYWxsZXIuQ2FsbGVyLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiAEAAEDBiYEBFRFU1QDVFNUBBUffHUBMYgAAUOKAAExG0EAeIIDBChMHmEEqjPBugS7AJiiNhoAjgMAAgAgAD4iiTEZFEQxGEQ2GgFXAgA2GgJXAgA2GgMXwDKIAEsjiTEZFEQxGEQ2GgFXAgA2GgJXAgA2GgMXwDKIAH4jiTEZFEQxGEQ2GgFXAgA2GgJXAgA2GgMXwDKIAKojiTEZQAAGMRgURCOJIomKAwCxI7IiKLImKbIlJLIQIrIBtov9FRZXBgKL/VCL/hUWVwYCi/5Qi/+yGIAEofUEDbIaTLIasholshAisgGztwE+SVcEAExXAAQqEkQXRImKAwCxI7IiKLImKbIlJLIQIrIBtov9FRZXBgKL/VCL/hUWVwYCi/5Qi/+yGIAEbUcArbIaTLIasholshAisgGztwE+VwAEKhJEiYoDALEjsiIosiYpsiUkshAisgG2i/0VFlcGAov9UIv+FRZXBgKL/lArsgWL/7IYgATIQAd9shpMshqyGiWyECKyAbO0BSsSRLcAPESJ", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/typed_abi_call_txn/out/TxnContract.arc56.json b/test_cases/typed_abi_call_txn/out/TxnContract.arc56.json new file mode 100644 index 0000000000..35e6bbf602 --- /dev/null +++ b/test_cases/typed_abi_call_txn/out/TxnContract.arc56.json @@ -0,0 +1,214 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "TxnContract", + "structs": {}, + "methods": [ + { + "name": "call_with_txn", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "txn", + "name": "acfg" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "call_with_acfg", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "acfg", + "name": "acfg" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "uint64" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "call_with_acfg_no_return", + "args": [ + { + "type": "byte[]", + "name": "a" + }, + { + "type": "acfg", + "name": "acfg" + }, + { + "type": "byte[]", + "name": "b" + } + ], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 62, + 95, + 134 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 185, + 212, + 232 + ], + "errorMessage": "a is not a" + }, + { + "pc": [ + 190, + 217, + 237 + ], + "errorMessage": "b is not b" + }, + { + "pc": [ + 197 + ], + "errorMessage": "expected asset config" + }, + { + "pc": [ + 203, + 223, + 242 + ], + "errorMessage": "expected asset id" + }, + { + "pc": [ + 173 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 65, + 98, + 137 + ], + "errorMessage": "is not creating" + }, + { + "pc": [ + 114, + 153 + ], + "errorMessage": "transaction type is acfg" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi50eG5fY29udHJhY3QuVHhuQ29udHJhY3QuYXBwcm92YWxfcHJvZ3JhbToKICAgIGludGNibG9jayAxIDMgMAogICAgYnl0ZWNibG9jayAweDYxIDB4NjIgMHgxNTFmN2M3NQogICAgY2FsbHN1YiBfX3B1eWFfYXJjNF9yb3V0ZXJfXwogICAgcmV0dXJuCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4udHhuX2NvbnRyYWN0LlR4bkNvbnRyYWN0Ll9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTEKICAgIC8vIGNsYXNzIFR4bkNvbnRyYWN0KEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGExZjUwNDBkIDB4NmQ0NzAwYWQgMHhjODQwMDc3ZCAvLyBtZXRob2QgImNhbGxfd2l0aF90eG4oYnl0ZVtdLHR4bixieXRlW10pdWludDY0IiwgbWV0aG9kICJjYWxsX3dpdGhfYWNmZyhieXRlW10sYWNmZyxieXRlW10pdWludDY0IiwgbWV0aG9kICJjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4oYnl0ZVtdLGFjZmcsYnl0ZVtdKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfdHhuX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fY2FsbF93aXRoX2FjZmdfcm91dGVAMyBfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfYWNmZ19ub19yZXR1cm5fcm91dGVANAogICAgaW50Y18yIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fY2FsbF93aXRoX3R4bl9yb3V0ZUAyOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMgogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUeG5Db250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTIKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjYWxsX3dpdGhfdHhuCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfYWNmZ19yb3V0ZUAzOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjExCiAgICAvLyBjbGFzcyBUeG5Db250cmFjdChBUkM0Q29udHJhY3QpOgogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMQogICAgZXh0cmFjdCAyIDAKICAgIHR4biBHcm91cEluZGV4CiAgICBpbnRjXzAgLy8gMQogICAgLQogICAgZHVwCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFjZmcKICAgID09CiAgICBhc3NlcnQgLy8gdHJhbnNhY3Rpb24gdHlwZSBpcyBhY2ZnCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAyCiAgICBleHRyYWN0IDIgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyMAogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICBjYWxsc3ViIGNhbGxfd2l0aF9hY2ZnCiAgICBpdG9iCiAgICBieXRlY18yIC8vIDB4MTUxZjdjNzUKICAgIHN3YXAKICAgIGNvbmNhdAogICAgbG9nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19jYWxsX3dpdGhfYWNmZ19ub19yZXR1cm5fcm91dGVANDoKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgdHhuIE9uQ29tcGxldGlvbgogICAgIQogICAgYXNzZXJ0IC8vIE9uQ29tcGxldGlvbiBpcyBOb09wCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgYXNzZXJ0IC8vIGlzIG5vdCBjcmVhdGluZwogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4bmEgQXBwbGljYXRpb25BcmdzIDEKICAgIGV4dHJhY3QgMiAwCiAgICB0eG4gR3JvdXBJbmRleAogICAgaW50Y18wIC8vIDEKICAgIC0KICAgIGR1cAogICAgZ3R4bnMgVHlwZUVudW0KICAgIGludGNfMSAvLyBhY2ZnCiAgICA9PQogICAgYXNzZXJ0IC8vIHRyYW5zYWN0aW9uIHR5cGUgaXMgYWNmZwogICAgdHhuYSBBcHBsaWNhdGlvbkFyZ3MgMgogICAgZXh0cmFjdCAyIDAKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjcKICAgIC8vIEBhcmM0LmFiaW1ldGhvZAogICAgY2FsbHN1YiBjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4KICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMQogICAgLy8gY2xhc3MgVHhuQ29udHJhY3QoQVJDNENvbnRyYWN0KToKICAgIGludGNfMiAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi50eG5fY29udHJhY3QuVHhuQ29udHJhY3QuY2FsbF93aXRoX3R4bihhOiBieXRlcywgYWNmZzogdWludDY0LCBiOiBieXRlcykgLT4gdWludDY0OgpjYWxsX3dpdGhfdHhuOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxMi0xMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsbF93aXRoX3R4bihzZWxmLCBhOiBCeXRlcywgYWNmZzogZ3R4bi5UcmFuc2FjdGlvbiwgYjogQnl0ZXMpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxNAogICAgLy8gYXNzZXJ0IGEgPT0gYiJhIiwgImEgaXMgbm90IGEiCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ5dGVjXzAgLy8gMHg2MQogICAgPT0KICAgIGFzc2VydCAvLyBhIGlzIG5vdCBhCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjE1CiAgICAvLyBhc3NlcnQgYiA9PSBiImIiLCAiYiBpcyBub3QgYiIKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWNfMSAvLyAweDYyCiAgICA9PQogICAgYXNzZXJ0IC8vIGIgaXMgbm90IGIKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MTYKICAgIC8vIGFzc2VydCBhY2ZnLnR5cGUgPT0gVHJhbnNhY3Rpb25UeXBlLkFzc2V0Q29uZmlnLCAiZXhwZWN0ZWQgYXNzZXQgY29uZmlnIgogICAgZnJhbWVfZGlnIC0yCiAgICBndHhucyBUeXBlRW51bQogICAgaW50Y18xIC8vIGFjZmcKICAgID09CiAgICBhc3NlcnQgLy8gZXhwZWN0ZWQgYXNzZXQgY29uZmlnCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjE3CiAgICAvLyBhc3NlcnQgYWNmZy5jcmVhdGVkX2Fzc2V0LmlkLCAiZXhwZWN0ZWQgYXNzZXQgaWQiCiAgICBmcmFtZV9kaWcgLTIKICAgIGd0eG5zIENyZWF0ZWRBc3NldElECiAgICBkdXAKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBpZAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToxOAogICAgLy8gcmV0dXJuIGFjZmcuY3JlYXRlZF9hc3NldC5pZAogICAgcmV0c3ViCgoKLy8gdGVzdF9jYXNlcy50eXBlZF9hYmlfY2FsbF90eG4udHhuX2NvbnRyYWN0LlR4bkNvbnRyYWN0LmNhbGxfd2l0aF9hY2ZnKGE6IGJ5dGVzLCBhY2ZnOiB1aW50NjQsIGI6IGJ5dGVzKSAtPiB1aW50NjQ6CmNhbGxfd2l0aF9hY2ZnOgogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyMC0yMQogICAgLy8gQGFyYzQuYWJpbWV0aG9kCiAgICAvLyBkZWYgY2FsbF93aXRoX2FjZmcoc2VsZiwgYTogQnl0ZXMsIGFjZmc6IGd0eG4uQXNzZXRDb25maWdUcmFuc2FjdGlvbiwgYjogQnl0ZXMpIC0+IFVJbnQ2NDoKICAgIHByb3RvIDMgMQogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weToyMgogICAgLy8gYXNzZXJ0IGEgPT0gYiJhIiwgImEgaXMgbm90IGEiCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ5dGVjXzAgLy8gMHg2MQogICAgPT0KICAgIGFzc2VydCAvLyBhIGlzIG5vdCBhCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjIzCiAgICAvLyBhc3NlcnQgYiA9PSBiImIiLCAiYiBpcyBub3QgYiIKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWNfMSAvLyAweDYyCiAgICA9PQogICAgYXNzZXJ0IC8vIGIgaXMgbm90IGIKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MjQKICAgIC8vIGFzc2VydCBhY2ZnLmNyZWF0ZWRfYXNzZXQuaWQsICJleHBlY3RlZCBhc3NldCBpZCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgQ3JlYXRlZEFzc2V0SUQKICAgIGR1cAogICAgYXNzZXJ0IC8vIGV4cGVjdGVkIGFzc2V0IGlkCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjI1CiAgICAvLyByZXR1cm4gYWNmZy5jcmVhdGVkX2Fzc2V0LmlkCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi50eG5fY29udHJhY3QuVHhuQ29udHJhY3QuY2FsbF93aXRoX2FjZmdfbm9fcmV0dXJuKGE6IGJ5dGVzLCBhY2ZnOiB1aW50NjQsIGI6IGJ5dGVzKSAtPiB2b2lkOgpjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm46CiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjI3LTMwCiAgICAvLyBAYXJjNC5hYmltZXRob2QKICAgIC8vIGRlZiBjYWxsX3dpdGhfYWNmZ19ub19yZXR1cm4oCiAgICAvLyAgICAgc2VsZiwgYTogQnl0ZXMsIGFjZmc6IGd0eG4uQXNzZXRDb25maWdUcmFuc2FjdGlvbiwgYjogQnl0ZXMKICAgIC8vICkgLT4gTm9uZToKICAgIHByb3RvIDMgMAogICAgLy8gdHlwZWRfYWJpX2NhbGxfdHhuL3R4bl9jb250cmFjdC5weTozMQogICAgLy8gYXNzZXJ0IGEgPT0gYiJhIiwgImEgaXMgbm90IGEiCiAgICBmcmFtZV9kaWcgLTMKICAgIGJ5dGVjXzAgLy8gMHg2MQogICAgPT0KICAgIGFzc2VydCAvLyBhIGlzIG5vdCBhCiAgICAvLyB0eXBlZF9hYmlfY2FsbF90eG4vdHhuX2NvbnRyYWN0LnB5OjMyCiAgICAvLyBhc3NlcnQgYiA9PSBiImIiLCAiYiBpcyBub3QgYiIKICAgIGZyYW1lX2RpZyAtMQogICAgYnl0ZWNfMSAvLyAweDYyCiAgICA9PQogICAgYXNzZXJ0IC8vIGIgaXMgbm90IGIKICAgIC8vIHR5cGVkX2FiaV9jYWxsX3R4bi90eG5fY29udHJhY3QucHk6MzMKICAgIC8vIGFzc2VydCBhY2ZnLmNyZWF0ZWRfYXNzZXQuaWQsICJleHBlY3RlZCBhc3NldCBpZCIKICAgIGZyYW1lX2RpZyAtMgogICAgZ3R4bnMgQ3JlYXRlZEFzc2V0SUQKICAgIGFzc2VydCAvLyBleHBlY3RlZCBhc3NldCBpZAogICAgcmV0c3ViCg==", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnR5cGVkX2FiaV9jYWxsX3R4bi50eG5fY29udHJhY3QuVHhuQ29udHJhY3QuY2xlYXJfc3RhdGVfcHJvZ3JhbToKICAgIHB1c2hpbnQgMSAvLyAxCiAgICByZXR1cm4K" + }, + "byteCode": { + "approval": "CiADAQMAJgMBYQFiBBUffHWIAAFDigABMRtBAIiCAwSh9QQNBG1HAK0EyEAHfTYaAI4DAAIAIwBKJIkxGRREMRhENhoBVwIAMRYiCTYaAlcCAIgAXRYqTFCwIokxGRREMRhENhoBVwIAMRYiCUk4ECMSRDYaAlcCAIgAURYqTFCwIokxGRREMRhENhoBVwIAMRYiCUk4ECMSRDYaAlcCAIgAPiKJMRlAAAYxGBREIokkiYoDAYv9KBJEi/8pEkSL/jgQIxJEi/44PElEiYoDAYv9KBJEi/8pEkSL/jg8SUSJigMAi/0oEkSL/ykSRIv+ODxEiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/typed_abi_call_txn/puya.log b/test_cases/typed_abi_call_txn/puya.log index ba1d1fb7f9..a1185cb196 100644 --- a/test_cases/typed_abi_call_txn/puya.log +++ b/test_cases/typed_abi_call_txn/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['typed_abi_call_txn'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['typed_abi_call_txn'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing typed_abi_call_txn/out/module.awst debug: Sealing block@0: // L12 @@ -1815,6 +1815,7 @@ debug: Inserted test_call_with_acfg_no_return_block@0.ops[27]: 'l-store-copy enc debug: Replaced test_call_with_acfg_no_return_block@0.ops[52]: 'v-load encoded_value%0#0' with 'l-load encoded_value%0#0' debug: Found 3 edge set/s for test_cases.typed_abi_call_txn.caller.Caller.__puya_arc4_router__ info: Writing typed_abi_call_txn/out/TxnContract.arc32.json +info: Writing typed_abi_call_txn/out/TxnContract.arc56.json info: Writing typed_abi_call_txn/out/TxnContract.approval.teal info: Writing typed_abi_call_txn/out/TxnContract.clear.teal info: Writing typed_abi_call_txn/out/TxnContract.approval.bin @@ -1822,6 +1823,7 @@ info: Writing typed_abi_call_txn/out/TxnContract.clear.bin info: Writing typed_abi_call_txn/out/TxnContract.approval.puya.map info: Writing typed_abi_call_txn/out/TxnContract.clear.puya.map info: Writing typed_abi_call_txn/out/Caller.arc32.json +info: Writing typed_abi_call_txn/out/Caller.arc56.json info: Writing typed_abi_call_txn/out/Caller.approval.teal info: Writing typed_abi_call_txn/out/Caller.clear.teal info: Writing typed_abi_call_txn/out/Caller.approval.bin diff --git a/test_cases/unary/puya.log b/test_cases/unary/puya.log index e5af9178b5..f7f6e1cec4 100644 --- a/test_cases/unary/puya.log +++ b/test_cases/unary/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unary'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unary'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing unary/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/unassigned_expression/out/Unassigned.arc56.json b/test_cases/unassigned_expression/out/Unassigned.arc56.json new file mode 100644 index 0000000000..c557c85203 --- /dev/null +++ b/test_cases/unassigned_expression/out/Unassigned.arc56.json @@ -0,0 +1,138 @@ +{ + "arcs": [ + 22, + 28 + ], + "name": "Unassigned", + "structs": {}, + "methods": [ + { + "name": "discard_op", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "discard_subroutine", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + }, + { + "name": "discard_constants", + "args": [], + "returns": { + "type": "void" + }, + "actions": { + "create": [], + "call": [ + "NoOp" + ] + }, + "readonly": false, + "events": [], + "recommendations": {} + } + ], + "state": { + "schema": { + "global": { + "ints": 0, + "bytes": 0 + }, + "local": { + "ints": 0, + "bytes": 0 + } + }, + "keys": { + "global": {}, + "local": {}, + "box": {} + }, + "maps": { + "global": {}, + "local": {}, + "box": {} + } + }, + "bareActions": { + "create": [ + "NoOp" + ], + "call": [] + }, + "events": [], + "templateVariables": {}, + "networks": {}, + "sourceInfo": { + "approval": { + "sourceInfo": [ + { + "pc": [ + 50, + 62, + 74 + ], + "errorMessage": "OnCompletion is NoOp" + }, + { + "pc": [ + 88 + ], + "errorMessage": "is creating" + }, + { + "pc": [ + 53, + 65, + 77 + ], + "errorMessage": "is not creating" + } + ], + "pcOffsetMethod": "none" + }, + "clear": { + "sourceInfo": [], + "pcOffsetMethod": "none" + } + }, + "source": { + "approval": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLmFwcHJvdmFsX3Byb2dyYW06CiAgICBpbnRjYmxvY2sgMSAwCiAgICBjYWxsc3ViIF9fcHV5YV9hcmM0X3JvdXRlcl9fCiAgICByZXR1cm4KCgovLyB0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLl9fcHV5YV9hcmM0X3JvdXRlcl9fKCkgLT4gdWludDY0OgpfX3B1eWFfYXJjNF9yb3V0ZXJfXzoKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo0CiAgICAvLyBjbGFzcyBVbmFzc2lnbmVkKEFSQzRDb250cmFjdCk6CiAgICBwcm90byAwIDEKICAgIHR4biBOdW1BcHBBcmdzCiAgICBieiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19iYXJlX3JvdXRpbmdANwogICAgcHVzaGJ5dGVzcyAweGJiZDYxNjljIDB4YjY2N2JjMTQgMHgwNzU2ZGJmMSAvLyBtZXRob2QgImRpc2NhcmRfb3AoKXZvaWQiLCBtZXRob2QgImRpc2NhcmRfc3Vicm91dGluZSgpdm9pZCIsIG1ldGhvZCAiZGlzY2FyZF9jb25zdGFudHMoKXZvaWQiCiAgICB0eG5hIEFwcGxpY2F0aW9uQXJncyAwCiAgICBtYXRjaCBfX3B1eWFfYXJjNF9yb3V0ZXJfX19kaXNjYXJkX29wX3JvdXRlQDIgX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9zdWJyb3V0aW5lX3JvdXRlQDMgX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9jb25zdGFudHNfcm91dGVANAogICAgaW50Y18xIC8vIDAKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9vcF9yb3V0ZUAyOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjUKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGRpc2NhcmRfb3AKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2Rpc2NhcmRfc3Vicm91dGluZV9yb3V0ZUAzOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjkKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICB0eG4gT25Db21wbGV0aW9uCiAgICAhCiAgICBhc3NlcnQgLy8gT25Db21wbGV0aW9uIGlzIE5vT3AKICAgIHR4biBBcHBsaWNhdGlvbklECiAgICBhc3NlcnQgLy8gaXMgbm90IGNyZWF0aW5nCiAgICBjYWxsc3ViIGRpc2NhcmRfc3Vicm91dGluZQogICAgaW50Y18wIC8vIDEKICAgIHJldHN1YgoKX19wdXlhX2FyYzRfcm91dGVyX19fZGlzY2FyZF9jb25zdGFudHNfcm91dGVANDoKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weToxMwogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIHR4biBPbkNvbXBsZXRpb24KICAgICEKICAgIGFzc2VydCAvLyBPbkNvbXBsZXRpb24gaXMgTm9PcAogICAgdHhuIEFwcGxpY2F0aW9uSUQKICAgIGFzc2VydCAvLyBpcyBub3QgY3JlYXRpbmcKICAgIGludGNfMCAvLyAxCiAgICByZXRzdWIKCl9fcHV5YV9hcmM0X3JvdXRlcl9fX2JhcmVfcm91dGluZ0A3OgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFVuYXNzaWduZWQoQVJDNENvbnRyYWN0KToKICAgIHR4biBPbkNvbXBsZXRpb24KICAgIGJueiBfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExCiAgICB0eG4gQXBwbGljYXRpb25JRAogICAgIQogICAgYXNzZXJ0IC8vIGlzIGNyZWF0aW5nCiAgICBpbnRjXzAgLy8gMQogICAgcmV0c3ViCgpfX3B1eWFfYXJjNF9yb3V0ZXJfX19hZnRlcl9pZl9lbHNlQDExOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjQKICAgIC8vIGNsYXNzIFVuYXNzaWduZWQoQVJDNENvbnRyYWN0KToKICAgIGludGNfMSAvLyAwCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLmRpc2NhcmRfb3AoKSAtPiB2b2lkOgpkaXNjYXJkX29wOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjUtNgogICAgLy8gQGFyYzQuYWJpbWV0aG9kKCkKICAgIC8vIGRlZiBkaXNjYXJkX29wKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weTo3CiAgICAvLyBvcC5iemVybygxMCkKICAgIHB1c2hpbnQgMTAgLy8gMTAKICAgIGJ6ZXJvCiAgICBwb3AKICAgIHJldHN1YgoKCi8vIHRlc3RfY2FzZXMudW5hc3NpZ25lZF9leHByZXNzaW9uLmNvbnRyYWN0LlVuYXNzaWduZWQuZGlzY2FyZF9zdWJyb3V0aW5lKCkgLT4gdm9pZDoKZGlzY2FyZF9zdWJyb3V0aW5lOgogICAgLy8gdW5hc3NpZ25lZF9leHByZXNzaW9uL2NvbnRyYWN0LnB5OjktMTAKICAgIC8vIEBhcmM0LmFiaW1ldGhvZCgpCiAgICAvLyBkZWYgZGlzY2FyZF9zdWJyb3V0aW5lKHNlbGYpIC0+IE5vbmU6CiAgICBwcm90byAwIDAKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weToxMQogICAgLy8gZ2V0X2FfdmFsdWUoKQogICAgY2FsbHN1YiBnZXRfYV92YWx1ZQogICAgcG9wCiAgICByZXRzdWIKCgovLyB0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5nZXRfYV92YWx1ZSgpIC0+IHVpbnQ2NDoKZ2V0X2FfdmFsdWU6CiAgICAvLyB1bmFzc2lnbmVkX2V4cHJlc3Npb24vY29udHJhY3QucHk6MjAtMjEKICAgIC8vIEBzdWJyb3V0aW5lCiAgICAvLyBkZWYgZ2V0X2FfdmFsdWUoKSAtPiBVSW50NjQ6CiAgICBwcm90byAwIDEKICAgIC8vIHVuYXNzaWduZWRfZXhwcmVzc2lvbi9jb250cmFjdC5weToyMgogICAgLy8gcmV0dXJuIFVJbnQ2NCg0MikKICAgIHB1c2hpbnQgNDIgLy8gNDIKICAgIHJldHN1Ygo=", + "clear": "I3ByYWdtYSB2ZXJzaW9uIDEwCgp0ZXN0X2Nhc2VzLnVuYXNzaWduZWRfZXhwcmVzc2lvbi5jb250cmFjdC5VbmFzc2lnbmVkLmNsZWFyX3N0YXRlX3Byb2dyYW06CiAgICBwdXNoaW50IDEgLy8gMQogICAgcmV0dXJuCg==" + }, + "byteCode": { + "approval": "CiACAQCIAAFDigABMRtBAD+CAwS71hacBLZnvBQEB1bb8TYaAI4DAAIADgAaI4kxGRREMRhEiAAkIokxGRREMRhEiAAgIokxGRREMRhEIokxGUAABjEYFEQiiSOJigAAgQqvSImKAACIAAJIiYoAAYEqiQ==", + "clear": "CoEBQw==" + }, + "compilerInfo": { + "compiler": "puya", + "compilerVersion": { + "major": 3, + "minor": 2, + "patch": 2 + } + } +} \ No newline at end of file diff --git a/test_cases/unassigned_expression/puya.log b/test_cases/unassigned_expression/puya.log index 17aef82cef..5a0245216c 100644 --- a/test_cases/unassigned_expression/puya.log +++ b/test_cases/unassigned_expression/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unassigned_expression'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unassigned_expression'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv unassigned_expression/contract.py:7:9 warning: expression result is ignored unassigned_expression/contract.py:11:9 warning: expression result is ignored @@ -673,6 +673,7 @@ debug: Inserted __puya_arc4_router_____algopy_default_create@8.ops[5]: 'l-store- debug: Replaced __puya_arc4_router_____algopy_default_create@8.ops[7]: 'v-load tmp%17#0' with 'l-load tmp%17#0' debug: Found 3 edge set/s for test_cases.unassigned_expression.contract.Unassigned.__puya_arc4_router__ info: Writing unassigned_expression/out/Unassigned.arc32.json +info: Writing unassigned_expression/out/Unassigned.arc56.json info: Writing unassigned_expression/out/Unassigned.approval.teal info: Writing unassigned_expression/out/Unassigned.clear.teal info: Writing unassigned_expression/out/Unassigned.approval.bin diff --git a/test_cases/undefined_phi_args/puya.log b/test_cases/undefined_phi_args/puya.log index 33b74c7f66..52c7093a00 100644 --- a/test_cases/undefined_phi_args/puya.log +++ b/test_cases/undefined_phi_args/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['undefined_phi_args'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['undefined_phi_args'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv info: writing undefined_phi_args/out/module.awst debug: Sealing block@0: // L12 diff --git a/test_cases/unssa/puya.log b/test_cases/unssa/puya.log index bb4c4bb2e0..c5131152fd 100644 --- a/test_cases/unssa/puya.log +++ b/test_cases/unssa/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unssa'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['unssa'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv unssa/contract.py:6:9 warning: expression result is ignored unssa/contract.py:13:9 warning: expression result is ignored diff --git a/test_cases/with_reentrancy/puya.log b/test_cases/with_reentrancy/puya.log index bc676ebf62..25430d3d29 100644 --- a/test_cases/with_reentrancy/puya.log +++ b/test_cases/with_reentrancy/puya.log @@ -1,4 +1,4 @@ -debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['with_reentrancy'], output_awst=True, output_awst_json=False, output_client=True, log_level=) +debug: PuyaPyOptions(output_teal=True, output_source_map=True, output_arc32=True, output_arc56=True, output_ssa_ir=True, output_optimization_ir=True, output_destructured_ir=True, output_memory_ir=True, output_bytecode=True, debug_level=1, optimization_level=1, target_avm_version=10, cli_template_definitions={}, template_vars_prefix='TMPL_', locals_coalescing_strategy=, paths=['with_reentrancy'], output_awst=True, output_awst_json=False, output_client=True, log_level=) info: Found python prefix: /.venv with_reentrancy/contract.py:9:9 warning: expression result is ignored info: writing with_reentrancy/out/module.awst